opencode-sdlc-plugin 0.3.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +90 -17
- package/config/presets/event-modeling.json +19 -8
- package/config/presets/minimal.json +29 -16
- package/config/presets/standard.json +19 -8
- package/config/schemas/athena.schema.json +4 -4
- package/config/schemas/sdlc.schema.json +101 -5
- package/dist/cli/index.js +1431 -1336
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +428 -66
- package/dist/index.js +6262 -2440
- package/dist/index.js.map +1 -1
- package/dist/plugin/index.js +5793 -2010
- package/dist/plugin/index.js.map +1 -1
- package/package.json +2 -1
- package/prompts/agents/adr.md +234 -0
- package/prompts/agents/architect.md +204 -0
- package/prompts/agents/design-facilitator.md +237 -0
- package/prompts/agents/discovery.md +260 -0
- package/prompts/agents/domain.md +148 -34
- package/prompts/agents/file-updater.md +132 -0
- package/prompts/agents/green.md +119 -40
- package/prompts/agents/gwt.md +352 -0
- package/prompts/agents/model-checker.md +332 -0
- package/prompts/agents/red.md +112 -21
- package/prompts/agents/story.md +196 -0
- package/prompts/agents/ux.md +239 -0
- package/prompts/agents/workflow-designer.md +386 -0
- package/prompts/modes/architect.md +219 -0
- package/prompts/modes/build.md +150 -0
- package/prompts/modes/model.md +211 -0
- package/prompts/modes/plan.md +186 -0
- package/prompts/modes/pm.md +269 -0
- package/prompts/modes/prd.md +238 -0
- package/commands/sdlc-adr.md +0 -265
- package/commands/sdlc-debug.md +0 -376
- package/commands/sdlc-design.md +0 -246
- package/commands/sdlc-dev.md +0 -544
- package/commands/sdlc-info.md +0 -325
- package/commands/sdlc-parallel.md +0 -283
- package/commands/sdlc-recall.md +0 -213
- package/commands/sdlc-remember.md +0 -136
- package/commands/sdlc-research.md +0 -343
- package/commands/sdlc-review.md +0 -265
- package/commands/sdlc-status.md +0 -297
- package/config/presets/copilot-only.json +0 -69
- package/config/presets/enterprise.json +0 -79
- package/config/presets/solo-quick.json +0 -70
- package/config/presets/strict-tdd.json +0 -79
package/dist/plugin/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/plugin/utils/plugin-logger.ts","../../src/plugin/utils/notifications.ts","../../src/plugin/hooks/session-hooks.ts","../../src/plugin/utils/github-issues.ts","../../src/plugin/utils/tdd-file-ownership.ts","../../src/plugin/hooks/orchestrator-guard.ts","../../src/plugin/utils/issue-parser.ts","../../src/plugin/utils/issue-todo-sync.ts","../../src/plugin/hooks/todo-hooks.ts","../../src/plugin/hooks/tool-hooks.ts","../../src/plugin/hooks/compaction-hook.ts","../../src/plugin/tracker/tdd-cycle-tracker.ts","../../src/plugin/tools/adr.ts","../../src/shared/constants.ts","../../src/plugin/tools/config.ts","../../src/plugin/tools/event-design-workflow.ts","../../src/plugin/tools/event-discover-domain.ts","../../src/plugin/tools/event-generate-gwt.ts","../../src/plugin/tools/event-validate-model.ts","../../src/plugin/tools/get-context.ts","../../src/plugin/tools/get-issue.ts","../../src/plugin/tools/list-issues.ts","../../src/plugin/tools/memory-remember.ts","../../src/plugin/tools/memory-recall.ts","../../src/plugin/tools/mutation.ts","../../src/plugin/utils/issue-review-updater.ts","../../src/plugin/utils/oracle-parser.ts","../../src/shared/types.ts","../../src/plugin/utils/persona-loader.ts","../../src/plugin/tools/party-discussion.ts","../../src/plugin/tools/party-review.ts","../../src/plugin/tools/review-pr.ts","../../src/plugin/utils/agent-selector.ts","../../src/plugin/utils/issue-review-utils.ts","../../src/plugin/tools/story-review-analyze.ts","../../src/plugin/utils/response-synthesizer.ts","../../src/plugin/tools/story-review-consult.ts","../../src/plugin/tools/tdd-domain.ts","../../src/plugin/tools/tdd-green.ts","../../src/plugin/tools/tdd-red.ts","../../src/plugin/tools/update-issue-status.ts","../../src/plugin/tools/index.ts","../../src/plugin/tracker/issue-tracker.ts","../../src/shared/schemas.ts","../../src/plugin/utils/config-loader.ts","../../src/plugin/index.ts"],"names":["log","patterns","suggestedPhase","minimatch","join","existsSync","dirname","readFileSync","tool","readFile","mkdir","writeFile","parseModelConfig","readdir","homedir","loadMemoryStore","isMementoEnabled","randomUUID","parseAgentResponse"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Plugin Logger - File-based logging for OpenCode SDLC plugin runtime\n *\n * Follows oh-my-opencode logging pattern:\n * - Logs to temp file: ${TMPDIR}/opencode-sdlc.log\n * - Optional console output: ATHENA_DEBUG=1\n * - Silent failures to prevent breaking plugin execution\n */\n\nimport { appendFileSync, existsSync, statSync, truncateSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\n\nconst LOG_FILE = join(tmpdir(), \"opencode-sdlc.log\");\nconst MAX_LOG_SIZE = 5 * 1024 * 1024;\n\ntype LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nconst LEVEL_PREFIXES: Record<LogLevel, string> = {\n debug: \"[DEBUG]\",\n info: \"[INFO]\",\n warn: \"[WARN]\",\n error: \"[ERROR]\",\n};\n\nfunction shouldLog(level: LogLevel): boolean {\n if (level === \"warn\" || level === \"error\") return true;\n return process.env.ATHENA_DEBUG === \"1\" || process.env.ATHENA_DEBUG === \"true\";\n}\n\nfunction shouldConsoleLog(): boolean {\n return process.env.ATHENA_DEBUG === \"1\" || process.env.ATHENA_DEBUG === \"true\";\n}\n\nfunction formatLogEntry(\n level: LogLevel,\n component: string,\n message: string,\n data?: Record<string, unknown>\n): string {\n const timestamp = new Date().toISOString();\n const prefix = LEVEL_PREFIXES[level];\n const dataStr = data ? ` ${JSON.stringify(data)}` : \"\";\n return `[${timestamp}] ${prefix} [${component}] ${message}${dataStr}\\n`;\n}\n\nfunction rotateLogIfNeeded(): void {\n try {\n if (existsSync(LOG_FILE)) {\n const stats = statSync(LOG_FILE);\n if (stats.size > MAX_LOG_SIZE) {\n truncateSync(LOG_FILE, 0);\n }\n }\n } catch {\n // Silent - logging infrastructure should never break plugin\n }\n}\n\nfunction writeLog(entry: string): void {\n try {\n rotateLogIfNeeded();\n appendFileSync(LOG_FILE, entry);\n } catch {\n // Silent - logging infrastructure should never break plugin\n }\n}\n\n/**\n * Create a scoped logger for a specific component.\n * Public API - docstring required for discoverability.\n *\n * @example\n * const log = createPluginLogger(\"party-discussion\");\n * log.debug(\"Starting session\", { sessionId: \"abc123\" });\n */\nexport function createPluginLogger(component: string) {\n return {\n debug: (message: string, data?: Record<string, unknown>): void => {\n if (!shouldLog(\"debug\")) return;\n const entry = formatLogEntry(\"debug\", component, message, data);\n writeLog(entry);\n if (shouldConsoleLog()) {\n console.debug(`[Sdlc:${component}] ${message}`, data ?? \"\");\n }\n },\n\n info: (message: string, data?: Record<string, unknown>): void => {\n if (!shouldLog(\"info\")) return;\n const entry = formatLogEntry(\"info\", component, message, data);\n writeLog(entry);\n if (shouldConsoleLog()) {\n console.info(`[Sdlc:${component}] ${message}`, data ?? \"\");\n }\n },\n\n warn: (message: string, data?: Record<string, unknown>): void => {\n const entry = formatLogEntry(\"warn\", component, message, data);\n writeLog(entry);\n if (shouldConsoleLog()) {\n console.warn(`[Sdlc:${component}] ${message}`, data ?? \"\");\n }\n },\n\n error: (message: string, data?: Record<string, unknown>): void => {\n const entry = formatLogEntry(\"error\", component, message, data);\n writeLog(entry);\n if (shouldConsoleLog()) {\n console.error(`[Sdlc:${component}] ${message}`, data ?? \"\");\n }\n },\n };\n}\n\n/** Returns log file path: ${TMPDIR}/opencode-sdlc.log */\nexport function getLogFilePath(): string {\n return LOG_FILE;\n}\n\n/** Truncates the log file to zero bytes */\nexport function clearLog(): void {\n try {\n if (existsSync(LOG_FILE)) {\n truncateSync(LOG_FILE, 0);\n }\n } catch {\n // Silent - logging infrastructure should never break plugin\n }\n}\n","/**\n * Cross-platform notification utility\n *\n * Sends desktop notifications on macOS/Linux, falls back to console on Windows.\n */\n\nimport { platform } from \"node:os\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport { createPluginLogger } from \"./plugin-logger.js\";\n\ntype ShellExecutor = PluginInput[\"$\"];\n\nconst log = createPluginLogger(\"notifications\");\n\n/**\n * Send a desktop notification\n *\n * Platform support:\n * - macOS: Uses osascript (built-in)\n * - Linux: Uses notify-send (requires libnotify)\n * - Windows: Falls back to console.log\n *\n * @param message - The notification message\n * @param title - The notification title\n * @param $ - Shell executor from plugin context\n */\nexport async function sendNotification(\n message: string,\n title: string,\n $: ShellExecutor\n): Promise<void> {\n const os = platform();\n\n try {\n if (os === \"darwin\") {\n // macOS - use osascript (built-in)\n await $`osascript -e ${`display notification \"${escapeAppleScript(message)}\" with title \"${escapeAppleScript(title)}\"`}`;\n } else if (os === \"linux\") {\n // Linux - use notify-send (requires libnotify)\n await $`notify-send ${title} ${message}`;\n } else {\n // Windows and others - fall back to console\n logNotification(title, message);\n }\n } catch {\n // Silently fall back to console if notification fails\n logNotification(title, message);\n }\n}\n\n/**\n * Escape special characters for AppleScript strings\n */\nfunction escapeAppleScript(str: string): string {\n return str.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n}\n\n/**\n * Log notification to log file as fallback\n */\nfunction logNotification(title: string, message: string): void {\n log.info(\"Desktop notification fallback\", { title, message });\n}\n","/**\n * Session event hooks\n *\n * Handles session lifecycle events like idle, created, and error.\n */\n\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig, SdlcFeatures } from \"../../shared/types.js\";\nimport type { IssueTracker } from \"../tracker/issue-tracker.js\";\nimport { sendNotification } from \"../utils/notifications.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\n\nconst log = createPluginLogger(\"session-hooks\");\n\n/**\n * Generic event type for session events\n */\ninterface SessionEvent {\n type?: string;\n error?: unknown;\n}\n\n/**\n * Check if config has orchestratorOnly feature enabled\n */\nfunction isOrchestratorOnlyEnabled(config: SdlcConfig): boolean {\n const features = config.features;\n if (!features) return false;\n if (\"orchestratorOnly\" in features) {\n return (features as SdlcFeatures).orchestratorOnly;\n }\n return false;\n}\n\n/**\n * Create session event handler\n *\n * Handles:\n * - session.idle: Reminds about active issue when session goes idle\n * - session.created: Logs resume of tracked issue + orchestration reminder\n * - session.error: Logs errors during issue work\n */\nexport function createSessionHooks(ctx: PluginInput, tracker: IssueTracker, config: SdlcConfig) {\n return async ({ event }: { event: SessionEvent }) => {\n // Event type is in event.type for most events\n const eventType = (event as { type?: string }).type;\n\n switch (eventType) {\n case \"session.idle\":\n await handleSessionIdle(ctx, tracker, config);\n break;\n\n case \"session.created\":\n handleSessionCreated(tracker, config);\n break;\n\n case \"session.error\":\n handleSessionError(event, tracker);\n break;\n }\n };\n}\n\n/**\n * Handle session going idle\n *\n * If an issue is active, send a reminder notification\n */\nasync function handleSessionIdle(\n ctx: PluginInput,\n tracker: IssueTracker,\n config: SdlcConfig\n): Promise<void> {\n const currentIssue = tracker.getCurrentIssue();\n\n if (currentIssue) {\n const normalized = currentIssue.status.toLowerCase();\n if (!normalized.includes(\"in progress\") && !normalized.includes(\"in-progress\")) {\n return;\n }\n if (config.features?.notifications) {\n await sendNotification(\n `Issue #${currentIssue.issueNumber} in progress. Remember to update status when complete!`,\n \"OpenCode SDLC\",\n ctx.$\n );\n }\n }\n}\n\n/**\n * Handle session creation\n *\n * Log if resuming with an active issue and show orchestration reminder\n */\nfunction handleSessionCreated(tracker: IssueTracker, config: SdlcConfig): void {\n const currentIssue = tracker.getCurrentIssue();\n\n if (currentIssue) {\n log.info(\"Session created - resuming with issue\", {\n issueNumber: currentIssue.issueNumber,\n status: currentIssue.status,\n });\n }\n\n // Log orchestration reminder if feature is enabled\n if (isOrchestratorOnlyEnabled(config)) {\n log.info(\"Orchestrator-only mode active\", {\n hint: \"Use sdlc_red/sdlc_green/sdlc_domain for file edits\",\n });\n }\n}\n\n/**\n * Handle session errors\n *\n * Log errors that occur during issue work\n */\nfunction handleSessionError(event: SessionEvent, tracker: IssueTracker): void {\n const currentIssue = tracker.getCurrentIssue();\n\n if (currentIssue && event.error) {\n log.error(\"Session error during issue work\", {\n issueNumber: currentIssue.issueNumber,\n error: event.error,\n });\n }\n}\n","import type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport { createPluginLogger } from \"./plugin-logger.js\";\n\nconst log = createPluginLogger(\"github-issues\");\n\nexport interface GitHubIssue {\n number: number;\n title: string;\n body: string | null;\n url: string;\n state: string;\n}\n\nexport interface IssueListItem {\n number: number;\n title: string;\n url: string;\n state: string;\n status?: string;\n}\n\nfunction getRepo(config: SdlcConfig): { owner: string; repo: string } | null {\n if (!config.github?.owner || !config.github?.repo) return null;\n return { owner: config.github.owner, repo: config.github.repo };\n}\n\nexport async function fetchIssue(\n ctx: PluginInput,\n config: SdlcConfig,\n issueNumber: number\n): Promise<GitHubIssue | null> {\n const repo = getRepo(config);\n if (!repo) return null;\n\n try {\n const { stdout } =\n await ctx.$`gh issue view ${issueNumber} --repo ${repo.owner}/${repo.repo} --json number,title,body,url,state`;\n const output = String(stdout).trim();\n const issue = JSON.parse(output) as GitHubIssue;\n return issue;\n } catch (error) {\n log.warn(\"Failed to fetch issue\", { issueNumber, error: String(error) });\n return null;\n }\n}\n\nexport async function listIssues(\n ctx: PluginInput,\n config: SdlcConfig,\n status?: string,\n limit = 20\n): Promise<IssueListItem[]> {\n const repo = getRepo(config);\n if (!repo) return [];\n\n try {\n const statusFilter = status ? `--search \"project:${status}\"` : \"\";\n const { stdout } =\n await ctx.$`gh issue list --repo ${repo.owner}/${repo.repo} ${statusFilter} --limit ${limit} --json number,title,url,state`;\n const output = String(stdout).trim();\n const issues = JSON.parse(output) as IssueListItem[];\n return issues;\n } catch (error) {\n log.warn(\"Failed to list issues\", { status, error: String(error) });\n return [];\n }\n}\n\nexport async function moveIssueToStatus(\n ctx: PluginInput,\n config: SdlcConfig,\n issueNumber: number,\n status: string\n): Promise<boolean> {\n const repo = getRepo(config);\n if (!repo || !config.github?.project) return false;\n\n try {\n await ctx.$`gh project-ext move ${issueNumber} \"${status}\" --owner ${config.github.owner} --project ${config.github.project}`;\n return true;\n } catch (error) {\n log.warn(\"Failed to move issue\", { issueNumber, status, error: String(error) });\n return false;\n }\n}\n\nexport async function updateIssueBody(\n ctx: PluginInput,\n config: SdlcConfig,\n issueNumber: number,\n body: string\n): Promise<boolean> {\n const repo = getRepo(config);\n if (!repo) return false;\n\n try {\n await ctx.$`gh issue edit ${issueNumber} --repo ${repo.owner}/${repo.repo} --body ${body}`;\n return true;\n } catch (error) {\n log.warn(\"Failed to update issue body\", { issueNumber, error: String(error) });\n return false;\n }\n}\n","/**\n * TDD File Ownership Enforcement\n *\n * Determines which files each TDD phase agent can edit based on configurable patterns.\n */\n\nimport { minimatch } from \"minimatch\";\n\n/**\n * TDD phase types\n */\nexport type TddPhase = \"red\" | \"green\" | \"domain\";\n\n/**\n * Default file patterns for each TDD phase\n */\nexport const DEFAULT_FILE_PATTERNS: Record<TddPhase, { canEdit: string[]; cannotEdit: string[] }> =\n {\n red: {\n canEdit: [\n \"**/*.test.ts\",\n \"**/*.test.tsx\",\n \"**/*.spec.ts\",\n \"**/*.spec.tsx\",\n \"**/__tests__/**/*.ts\",\n \"**/__tests__/**/*.tsx\",\n \"**/tests/**/*.ts\",\n \"**/tests/**/*.tsx\",\n ],\n cannotEdit: [\"**/node_modules/**\"],\n },\n green: {\n canEdit: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\"],\n cannotEdit: [\n \"**/*.test.ts\",\n \"**/*.test.tsx\",\n \"**/*.spec.ts\",\n \"**/*.spec.tsx\",\n \"**/__tests__/**\",\n \"**/tests/**\",\n \"**/node_modules/**\",\n \"**/*.d.ts\",\n ],\n },\n domain: {\n canEdit: [\n \"**/types.ts\",\n \"**/types/**/*.ts\",\n \"**/*.types.ts\",\n \"**/domain/**/*.ts\",\n \"**/models/**/*.ts\",\n \"**/*.d.ts\",\n ],\n cannotEdit: [\"**/node_modules/**\"],\n },\n };\n\n/**\n * File ownership configuration\n */\nexport interface FileOwnershipConfig {\n /** Patterns for files the RED phase can edit (tests) */\n redPatterns?: string[];\n /** Patterns for files the GREEN phase can edit (implementation) */\n greenPatterns?: string[];\n /** Patterns for files the DOMAIN phase can edit (types) */\n domainPatterns?: string[];\n /** Patterns to always exclude */\n excludePatterns?: string[];\n}\n\n/**\n * Result of a file ownership check\n */\nexport interface FileOwnershipResult {\n /** Whether the file can be edited in this phase */\n allowed: boolean;\n /** Reason for the decision */\n reason: string;\n /** The phase that was checked */\n phase: TddPhase;\n /** The file path that was checked */\n filePath: string;\n /** Suggested phase if edit is not allowed */\n suggestedPhase?: TddPhase;\n}\n\n/**\n * Create a file ownership checker for a specific configuration\n */\nexport function createFileOwnershipChecker(config?: FileOwnershipConfig) {\n const patterns = {\n red: {\n canEdit: config?.redPatterns ?? DEFAULT_FILE_PATTERNS.red.canEdit,\n cannotEdit: [...DEFAULT_FILE_PATTERNS.red.cannotEdit, ...(config?.excludePatterns ?? [])],\n },\n green: {\n canEdit: config?.greenPatterns ?? DEFAULT_FILE_PATTERNS.green.canEdit,\n cannotEdit: [...DEFAULT_FILE_PATTERNS.green.cannotEdit, ...(config?.excludePatterns ?? [])],\n },\n domain: {\n canEdit: config?.domainPatterns ?? DEFAULT_FILE_PATTERNS.domain.canEdit,\n cannotEdit: [...DEFAULT_FILE_PATTERNS.domain.cannotEdit, ...(config?.excludePatterns ?? [])],\n },\n };\n\n /**\n * Check if a file matches any of the given patterns\n */\n function matchesAny(filePath: string, patterns: string[]): boolean {\n return patterns.some((pattern) => minimatch(filePath, pattern, { dot: true }));\n }\n\n /**\n * Find which phase should own a file\n */\n function findSuggestedPhase(filePath: string): TddPhase | undefined {\n // Check if it's a test file -> RED\n if (matchesAny(filePath, DEFAULT_FILE_PATTERNS.red.canEdit)) {\n return \"red\";\n }\n\n // Check if it's a type definition file -> DOMAIN\n if (matchesAny(filePath, DEFAULT_FILE_PATTERNS.domain.canEdit)) {\n return \"domain\";\n }\n\n // Default to GREEN for implementation files\n if (matchesAny(filePath, DEFAULT_FILE_PATTERNS.green.canEdit)) {\n return \"green\";\n }\n\n return undefined;\n }\n\n /**\n * Check if a file can be edited in a specific TDD phase\n */\n function canEdit(filePath: string, phase: TddPhase): FileOwnershipResult {\n const phasePatterns = patterns[phase];\n\n // First check exclusions\n if (matchesAny(filePath, phasePatterns.cannotEdit)) {\n const suggestedPhase = findSuggestedPhase(filePath);\n return {\n allowed: false,\n reason: `File matches exclusion pattern for ${phase.toUpperCase()} phase`,\n phase,\n filePath,\n suggestedPhase,\n };\n }\n\n // Then check if it matches allowed patterns\n if (matchesAny(filePath, phasePatterns.canEdit)) {\n return {\n allowed: true,\n reason: `File matches allowed pattern for ${phase.toUpperCase()} phase`,\n phase,\n filePath,\n };\n }\n\n // Not allowed by default\n const suggestedPhase = findSuggestedPhase(filePath);\n return {\n allowed: false,\n reason: `File does not match any allowed pattern for ${phase.toUpperCase()} phase`,\n phase,\n filePath,\n suggestedPhase,\n };\n }\n\n /**\n * Validate multiple file edits for a phase\n */\n function validateEdits(\n filePaths: string[],\n phase: TddPhase\n ): { valid: boolean; results: FileOwnershipResult[] } {\n const results = filePaths.map((fp) => canEdit(fp, phase));\n const valid = results.every((r) => r.allowed);\n return { valid, results };\n }\n\n /**\n * Get a human-readable description of what files a phase can edit\n */\n function describePhaseAccess(phase: TddPhase): string {\n const phasePatterns = patterns[phase];\n const canEditStr = phasePatterns.canEdit.join(\", \");\n const cannotEditStr = phasePatterns.cannotEdit.join(\", \");\n\n return `${phase.toUpperCase()} phase:\n Can edit: ${canEditStr}\n Cannot edit: ${cannotEditStr}`;\n }\n\n return {\n canEdit,\n validateEdits,\n describePhaseAccess,\n patterns,\n };\n}\n\n/**\n * Default file ownership checker with standard patterns\n */\nexport const defaultFileOwnershipChecker = createFileOwnershipChecker();\n\n/**\n * Check if a file is a test file\n */\nexport function isTestFile(filePath: string): boolean {\n return defaultFileOwnershipChecker.canEdit(filePath, \"red\").allowed;\n}\n\n/**\n * Check if a file is a type definition file\n */\nexport function isTypeFile(filePath: string): boolean {\n return defaultFileOwnershipChecker.canEdit(filePath, \"domain\").allowed;\n}\n\n/**\n * Check if a file is an implementation file (not test, not types)\n */\nexport function isImplementationFile(filePath: string): boolean {\n return (\n defaultFileOwnershipChecker.canEdit(filePath, \"green\").allowed &&\n !isTestFile(filePath) &&\n !isTypeFile(filePath)\n );\n}\n\n/**\n * Get enforcement message for a file ownership violation\n */\nexport function getViolationMessage(result: FileOwnershipResult): string {\n if (result.allowed) {\n return `File ${result.filePath} can be edited in ${result.phase.toUpperCase()} phase`;\n }\n\n let message = `VIOLATION: Cannot edit ${result.filePath} in ${result.phase.toUpperCase()} phase.\\n`;\n message += `Reason: ${result.reason}\\n`;\n\n if (result.suggestedPhase) {\n message += `Suggestion: This file should be edited in the ${result.suggestedPhase.toUpperCase()} phase.`;\n }\n\n return message;\n}\n","import { minimatch } from \"minimatch\";\nimport type { SdlcConfig, SdlcFeatures } from \"../../shared/types.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\nimport {\n type TddPhase,\n createFileOwnershipChecker,\n getViolationMessage,\n} from \"../utils/tdd-file-ownership.js\";\n\nconst log = createPluginLogger(\"orchestrator-guard\");\n\n/**\n * Subagent types that can write files\n */\nexport type SubagentType = TddPhase | \"file_updater\";\n\n/**\n * Tracks registered subagent sessions\n */\nconst subagentSessions = new Map<string, SubagentType>();\n\n/**\n * Register a session as a subagent session\n *\n * Called by TDD tools when they spawn subagent sessions.\n */\nexport function registerSubagentSession(sessionId: string, type: SubagentType): void {\n log.debug(\"Registering subagent session\", { sessionId, type });\n subagentSessions.set(sessionId, type);\n}\n\n/**\n * Unregister a subagent session\n *\n * Called when a subagent session completes.\n */\nexport function unregisterSubagentSession(sessionId: string): void {\n log.debug(\"Unregistering subagent session\", { sessionId });\n subagentSessions.delete(sessionId);\n}\n\n/**\n * Check if a session is a registered subagent\n */\nexport function isSubagentSession(sessionId: string): boolean {\n return subagentSessions.has(sessionId);\n}\n\n/**\n * Get the subagent type for a session\n */\nexport function getSubagentType(sessionId: string): SubagentType | undefined {\n return subagentSessions.get(sessionId);\n}\n\n/**\n * Clear all registered subagent sessions\n * Useful for testing\n */\nexport function clearSubagentSessions(): void {\n subagentSessions.clear();\n}\n\n/**\n * Get count of registered subagent sessions\n * Useful for debugging\n */\nexport function getSubagentSessionCount(): number {\n return subagentSessions.size;\n}\n\n/**\n * File write tools that should be blocked in orchestrator context\n */\nconst FILE_WRITE_TOOLS = [\"Edit\", \"Write\", \"edit\", \"write\"];\n\n/**\n * Patterns for files that the file_updater subagent can edit\n */\nconst FILE_UPDATER_PATTERNS = [\n // Config files\n \"**/*.json\",\n \"**/*.yaml\",\n \"**/*.yml\",\n \"**/*.toml\",\n \"**/.*rc\",\n \"**/.*rc.js\",\n \"**/.*rc.json\",\n // Documentation\n \"**/*.md\",\n \"**/README*\",\n \"**/CHANGELOG*\",\n \"**/LICENSE*\",\n // Scripts\n \"**/scripts/**\",\n \"**/bin/**\",\n \"**/*.sh\",\n // Build/CI\n \"**/Makefile\",\n \"**/Dockerfile*\",\n \"**/.github/**\",\n \"**/.gitlab-ci*\",\n];\n\ninterface BeforeHookInput {\n tool: string;\n sessionID: string;\n callID: string;\n}\n\ninterface BeforeHookOutput {\n args: unknown;\n}\n\n/**\n * Result of orchestrator guard check\n */\nexport interface GuardResult {\n allowed: boolean;\n reason: string;\n suggestion?: string;\n}\n\n/**\n * Extract file path from tool arguments\n */\nfunction extractFilePath(args: unknown): string | undefined {\n if (!args || typeof args !== \"object\") {\n return undefined;\n }\n\n const argsObj = args as Record<string, unknown>;\n\n // Edit tool uses filePath\n if (typeof argsObj.filePath === \"string\") {\n return argsObj.filePath;\n }\n\n // Write tool might use path or filePath\n if (typeof argsObj.path === \"string\") {\n return argsObj.path;\n }\n\n // Some tools use file\n if (typeof argsObj.file === \"string\") {\n return argsObj.file;\n }\n\n return undefined;\n}\n\n/**\n * Check if a file matches file_updater patterns\n */\nfunction isFileUpdaterFile(filePath: string): boolean {\n return FILE_UPDATER_PATTERNS.some((pattern) => minimatch(filePath, pattern, { dot: true }));\n}\n\n/**\n * Check if an edit is allowed for a subagent\n */\nfunction checkSubagentAccess(\n filePath: string,\n subagentType: SubagentType,\n _config: SdlcConfig\n): GuardResult {\n // file_updater can edit config/docs/scripts\n if (subagentType === \"file_updater\") {\n if (isFileUpdaterFile(filePath)) {\n return {\n allowed: true,\n reason: `file_updater can edit config/docs/scripts: ${filePath}`,\n };\n }\n return {\n allowed: false,\n reason: `file_updater cannot edit source files: ${filePath}`,\n suggestion: \"Use sdlc_red, sdlc_green, or sdlc_domain for source file edits\",\n };\n }\n\n // TDD phases use file ownership checker with default patterns\n const checker = createFileOwnershipChecker();\n const result = checker.canEdit(filePath, subagentType as TddPhase);\n\n if (result.allowed) {\n return {\n allowed: true,\n reason: result.reason,\n };\n }\n\n return {\n allowed: false,\n reason: getViolationMessage(result),\n suggestion: result.suggestedPhase\n ? `Use sdlc_${result.suggestedPhase} to edit this file`\n : undefined,\n };\n}\n\n/**\n * Get orchestratorOnly feature setting from config\n * Handles both new-style SdlcFeatures and LegacyFeatures\n */\nfunction getOrchestratorOnlyEnabled(config: SdlcConfig): boolean {\n const features = config.features;\n if (!features) return false;\n\n // Check if it's new-style SdlcFeatures (has orchestratorOnly property)\n if (\"orchestratorOnly\" in features) {\n return (features as SdlcFeatures).orchestratorOnly;\n }\n\n // Legacy features don't have orchestratorOnly\n return false;\n}\n\n/**\n * Create the orchestrator guard hook\n *\n * Returns a before hook that enforces the orchestrator-only pattern.\n */\nexport function createOrchestratorGuard(config: SdlcConfig) {\n const enabled = getOrchestratorOnlyEnabled(config);\n\n return {\n /**\n * Before hook - checks if file writes are allowed\n *\n * Blocks Edit/Write in main orchestrator context.\n * For subagent sessions, enforces file ownership rules.\n */\n check: (input: BeforeHookInput, output: BeforeHookOutput): GuardResult => {\n // Feature not enabled - allow everything\n if (!enabled) {\n return { allowed: true, reason: \"orchestratorOnly feature not enabled\" };\n }\n\n // Not a file write tool - allow\n if (!FILE_WRITE_TOOLS.includes(input.tool)) {\n return { allowed: true, reason: `${input.tool} is not a file write tool` };\n }\n\n const filePath = extractFilePath(output.args);\n if (!filePath) {\n log.warn(\"Could not extract file path from tool args\", {\n tool: input.tool,\n args: output.args,\n });\n // Allow but log - we can't enforce what we can't detect\n return { allowed: true, reason: \"Could not determine target file path\" };\n }\n\n // Check if this is a subagent session\n const subagentType = getSubagentType(input.sessionID);\n\n if (subagentType) {\n // This is a subagent - check file ownership\n log.debug(\"Checking subagent file access\", {\n sessionID: input.sessionID,\n subagentType,\n filePath,\n });\n return checkSubagentAccess(filePath, subagentType, config);\n }\n\n // This is the main orchestrator - block the write\n log.info(\"Blocking file write from main orchestrator\", {\n tool: input.tool,\n filePath,\n sessionID: input.sessionID,\n });\n\n return {\n allowed: false,\n reason:\n \"Main orchestrator cannot write files directly. \" +\n \"All file operations must be delegated to specialized agents.\",\n suggestion:\n \"Use sdlc_red for test files, sdlc_green for implementation, \" +\n \"sdlc_domain for types, or sdlc_file_updater for config/docs.\",\n };\n },\n };\n}\n\n/**\n * Format a guard result as an error message for the agent\n */\nexport function formatGuardError(result: GuardResult): string {\n let message = `⛔ ORCHESTRATOR GUARD: ${result.reason}`;\n if (result.suggestion) {\n message += `\\n\\n💡 Suggestion: ${result.suggestion}`;\n }\n return message;\n}\n","import { createPluginLogger } from \"./plugin-logger.js\";\n\nconst log = createPluginLogger(\"issue-parser\");\n\nexport interface ParsedAcceptanceCriterion {\n id: string;\n text: string;\n checked: boolean;\n}\n\nconst CHECKBOX_PATTERN = /^\\s*- \\[([ xX])\\] (.+)$/;\nconst AC_HEADER_PATTERN = /^#+\\s+Acceptance Criteria/i;\n\n/**\n * Parse acceptance criteria from a GitHub issue body.\n */\nexport function parseAcceptanceCriteria(body: string | null): ParsedAcceptanceCriterion[] {\n if (!body) return [];\n\n const lines = body.split(\"\\n\");\n const criteria: ParsedAcceptanceCriterion[] = [];\n let inAcSection = false;\n let index = 0;\n\n for (const line of lines) {\n if (AC_HEADER_PATTERN.test(line)) {\n inAcSection = true;\n continue;\n }\n\n if (inAcSection && line.startsWith(\"#\")) {\n // Reached next header\n break;\n }\n\n if (!inAcSection) continue;\n\n const match = line.match(CHECKBOX_PATTERN);\n if (!match) continue;\n\n index++;\n const checked = match[1].toLowerCase() === \"x\";\n const text = match[2].trim();\n\n criteria.push({\n id: `AC${index}`,\n text,\n checked,\n });\n }\n\n if (criteria.length === 0) {\n log.debug(\"No acceptance criteria found in issue body\");\n }\n\n return criteria;\n}\n","import type { OpenCodeTodo } from \"../../shared/types.js\";\nimport { parseAcceptanceCriteria } from \"./issue-parser.js\";\nimport { createPluginLogger } from \"./plugin-logger.js\";\n\nconst log = createPluginLogger(\"issue-todo-sync\");\n\nexport const ISSUE_TODO_SEPARATOR = \"Δ\";\n\nexport interface IssueTodo {\n id: string;\n issueNumber: number;\n section: string;\n index: number;\n text: string;\n checked: boolean;\n}\n\n/**\n * Convert issue acceptance criteria into OpenCode todos.\n */\nexport function issueCriteriaToTodos(issueNumber: number, body: string | null): OpenCodeTodo[] {\n const criteria = parseAcceptanceCriteria(body);\n return criteria.map((item, index) => ({\n id: `${issueNumber}:ac:${index + 1}`,\n content: `[#${issueNumber}${ISSUE_TODO_SEPARATOR}AC${index + 1}] ${item.text}`,\n status: item.checked ? \"completed\" : \"pending\",\n priority: \"high\",\n }));\n}\n\n/**\n * Parse issue todo ID into parts.\n */\nconst ISSUE_TODO_PATTERN = /^\\s*\\[#\\d+Δ/;\n\nexport function parseIssueTodoId(todoId: string): IssueTodo | null {\n const parts = todoId.split(\":\");\n if (parts.length !== 3) return null;\n\n const [issueStr, section, indexStr] = parts;\n const issueNumber = Number.parseInt(issueStr, 10);\n const index = Number.parseInt(indexStr, 10);\n if (!issueNumber || !index) return null;\n\n return {\n id: todoId,\n issueNumber,\n section,\n index,\n text: \"\",\n checked: false,\n };\n}\n\nexport function isIssueTodo(todo: OpenCodeTodo): boolean {\n return ISSUE_TODO_PATTERN.test(todo.content);\n}\n\n/**\n * Update a GitHub issue body to toggle a checkbox.\n */\nexport async function updateIssueCheckbox(\n issueBody: string,\n criterionIndex: number,\n checked: boolean\n): Promise<string> {\n const lines = issueBody.split(\"\\n\");\n let currentIndex = 0;\n let inAcSection = false;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (/^#+\\s+Acceptance Criteria/i.test(line)) {\n inAcSection = true;\n continue;\n }\n if (inAcSection && line.startsWith(\"#\")) {\n break;\n }\n if (!inAcSection) continue;\n\n const match = line.match(/^\\s*- \\[([ xX])\\] (.+)$/);\n if (!match) continue;\n\n currentIndex++;\n if (currentIndex === criterionIndex) {\n lines[i] = line.replace(/- \\[[ xX]\\]/, checked ? \"- [x]\" : \"- [ ]\");\n break;\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Merge new issue todos with existing ones.\n */\nexport function mergeIssueTodos(\n existing: OpenCodeTodo[],\n newTodos: OpenCodeTodo[]\n): OpenCodeTodo[] {\n const userTodos = existing.filter((t) => !t.content.includes(ISSUE_TODO_SEPARATOR));\n return [...userTodos, ...newTodos];\n}\n\n/**\n * Sync todo completion back to issue body.\n */\nexport async function syncTodoCompletion(\n issueNumber: number,\n todo: OpenCodeTodo,\n previousTodos: OpenCodeTodo[],\n issueBody: string\n): Promise<string | null> {\n const prev = previousTodos.find((t) => t.id === todo.id);\n if (!prev || prev.status === todo.status) return null;\n\n const parsed = parseIssueTodoId(todo.id);\n if (!parsed) return null;\n\n const checked = todo.status === \"completed\";\n const updatedBody = await updateIssueCheckbox(issueBody, parsed.index, checked);\n\n log.info(\"Updated issue checkbox\", { issueNumber, criterionIndex: parsed.index, checked });\n return updatedBody;\n}\n","import type { OpenCodeTodo, SdlcConfig } from \"../../shared/types.js\";\nimport type { IssueTracker } from \"../tracker/issue-tracker.js\";\nimport {\n issueCriteriaToTodos,\n mergeIssueTodos,\n syncTodoCompletion,\n} from \"../utils/issue-todo-sync.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\n\nconst log = createPluginLogger(\"todo-hooks\");\n\nexport interface TodoSyncPaths {\n issueNumber: number;\n}\n\nexport interface IssueLoadedResult {\n mergedTodos: OpenCodeTodo[];\n newIssueTodos: OpenCodeTodo[];\n}\n\nexport async function onIssueLoaded(\n tracker: IssueTracker,\n config: SdlcConfig,\n issueNumber: number,\n issueBody: string | null\n): Promise<IssueLoadedResult> {\n if (!config.features.todoSync) {\n return { mergedTodos: [], newIssueTodos: [] };\n }\n\n const newIssueTodos = issueCriteriaToTodos(issueNumber, issueBody);\n const existingTodos = tracker.getCurrentTodos() || [];\n const mergedTodos = mergeIssueTodos(existingTodos, newIssueTodos);\n\n await tracker.setCurrentTodos(mergedTodos);\n\n log.info(\"Synced issue acceptance criteria to todos\", {\n issueNumber,\n newTodos: newIssueTodos.length,\n totalTodos: mergedTodos.length,\n });\n\n return { mergedTodos, newIssueTodos };\n}\n\nexport async function onTodoWritten(\n tracker: IssueTracker,\n config: SdlcConfig,\n _paths: TodoSyncPaths,\n todos: OpenCodeTodo[]\n): Promise<string | null> {\n if (!config.features.todoSync) {\n return null;\n }\n\n const previousTodos = tracker.getCurrentTodos() || [];\n const currentIssue = tracker.getCurrentIssue();\n\n if (!currentIssue) {\n return null;\n }\n\n let updatedBody: string | null = null;\n\n for (const todo of todos) {\n const updated = await syncTodoCompletion(\n currentIssue.issueNumber,\n todo,\n previousTodos,\n currentIssue.body ?? \"\"\n );\n if (updated) {\n updatedBody = updated;\n }\n }\n\n if (updatedBody) {\n await tracker.updateIssueBody(updatedBody);\n log.info(\"Issue todos updated\", { issueNumber: currentIssue.issueNumber });\n }\n\n await tracker.setCurrentTodos(todos);\n return updatedBody;\n}\n","/**\n * Tool execution hooks\n *\n * Implements safety net warnings for git operations and issue todo synchronization.\n */\n\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { OpenCodeTodo, SdlcConfig } from \"../../shared/types.js\";\nimport type { IssueTracker } from \"../tracker/issue-tracker.js\";\nimport { updateIssueBody } from \"../utils/github-issues.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\nimport { createOrchestratorGuard, formatGuardError } from \"./orchestrator-guard.js\";\nimport { onIssueLoaded, onTodoWritten } from \"./todo-hooks.js\";\n\nconst log = createPluginLogger(\"tool-hooks\");\n\ninterface BeforeHookInput {\n tool: string;\n sessionID: string;\n callID: string;\n}\n\ninterface BeforeHookOutput {\n args: unknown;\n}\n\ninterface AfterHookInput {\n tool: string;\n sessionID: string;\n callID: string;\n}\n\ninterface AfterHookOutput {\n title: string;\n output: string;\n metadata: unknown;\n}\n\n/**\n * Git write operations that modify repository state.\n * These require explicit user permission when autoGitOperations is disabled.\n */\nconst GIT_WRITE_COMMANDS = [\n // Standard git commands\n \"git commit\",\n \"git push\",\n \"git checkout -b\",\n \"git branch\",\n \"git switch -c\",\n \"git switch --create\",\n \"git merge\",\n \"git rebase\",\n \"git cherry-pick\",\n \"git stash\",\n \"git tag\",\n \"git reset\",\n // Git-spice commands (stacked PRs workflow)\n \"gs branch create\",\n \"gs commit create\",\n \"gs stack submit\",\n \"gs restack\",\n \"gs branch delete\",\n \"gs up\",\n \"gs down\",\n // GitHub CLI commands\n \"gh pr create\",\n \"gh pr edit\",\n \"gh pr merge\",\n \"gh pr close\",\n \"gh pr review\",\n \"gh issue create\",\n \"gh issue edit\",\n \"gh issue close\",\n \"gh release create\",\n \"gh release edit\",\n \"gh release delete\",\n];\n\nfunction getBashCommand(metadata: unknown): string {\n if (!metadata || typeof metadata !== \"object\") {\n return \"\";\n }\n\n const cmd = (metadata as Record<string, unknown>).command;\n return typeof cmd === \"string\" ? cmd : \"\";\n}\n\nfunction containsGitWriteCommand(command: string): boolean {\n const normalized = command.trim().toLowerCase();\n\n // Split by common shell separators to check each command segment\n // This prevents false positives from strings like: echo \"git commit\"\n const segments = normalized.split(/[;&|]+/).map((s) => s.trim());\n\n return segments.some((segment) =>\n GIT_WRITE_COMMANDS.some((gitCmd) => segment.startsWith(gitCmd.toLowerCase()))\n );\n}\n\nexport function createToolHooks(ctx: PluginInput, tracker: IssueTracker, config: SdlcConfig) {\n // Create orchestrator guard for blocking file writes from main context\n const orchestratorGuard = createOrchestratorGuard(config);\n\n return {\n before: async (input: BeforeHookInput, output: BeforeHookOutput): Promise<void> => {\n // Check orchestrator guard for file write operations\n const guardResult = orchestratorGuard.check(input, output);\n\n if (!guardResult.allowed) {\n // Throw an error to block the operation\n // The error message will be shown to the agent\n throw new Error(formatGuardError(guardResult));\n }\n },\n\n after: async (input: AfterHookInput, output: AfterHookOutput): Promise<void> => {\n // Check for autoGitOperations in legacy features, default to false for new features\n const autoGitOperations =\n \"autoGitOperations\" in config.features\n ? (config.features as import(\"../../shared/types.js\").LegacyFeatures).autoGitOperations\n : false;\n\n if (!autoGitOperations && input.tool === \"bash\") {\n const command = getBashCommand(output.metadata);\n\n if (containsGitWriteCommand(command)) {\n log.warn(\"Git write operation detected\", { command: command.slice(0, 100) });\n output.output +=\n \"\\n\\n⚠️ SDLC GIT OPERATIONS POLICY REMINDER:\\n\" +\n \"Git operations should only be performed when explicitly requested by the user.\\n\" +\n \"If this command was run automatically (not requested by the user), please:\\n\" +\n \"1. Ask the user before proceeding with further git operations\\n\" +\n \"2. Use sdlc_update_issue_status() to track issue progress instead of git commits\\n\" +\n \"\\n\" +\n \"To enable automatic git operations, set features.autoGitOperations=true in sdlc.json (legacy)\\n\" +\n \"or configure git.workflow in sdlc.json (v0.3.0+)\";\n }\n }\n\n // Check for todoSync in both old and new features\n const todoSyncEnabled = config.features.todoSync;\n\n if (input.tool === \"sdlc_get_issue\" && todoSyncEnabled) {\n await handleIssueLoaded(tracker, config, output);\n }\n\n if (input.tool === \"todowrite\" && todoSyncEnabled) {\n await handleTodoWritten(ctx, tracker, config, output);\n }\n },\n };\n}\n\nasync function handleIssueLoaded(\n tracker: IssueTracker,\n config: SdlcConfig,\n output: AfterHookOutput\n): Promise<void> {\n try {\n const result = JSON.parse(output.output);\n if (!result.issueNumber || !result.body) {\n log.debug(\"Issue load response missing issueNumber or body\");\n return;\n }\n\n log.debug(\"Processing issue load for todo sync\", { issueNumber: result.issueNumber });\n\n const { newIssueTodos, mergedTodos } = await onIssueLoaded(\n tracker,\n config,\n result.issueNumber,\n result.body\n );\n\n if (newIssueTodos.length > 0) {\n result.todos = {\n hint: \"Call todowrite with these todos to populate your task list. Marking todos complete updates GitHub issue checkboxes automatically.\",\n items: newIssueTodos,\n };\n output.output = JSON.stringify(result, null, 2);\n\n log.debug(\"Injected issue todos into response\", {\n issueNumber: result.issueNumber,\n newTodos: newIssueTodos.length,\n totalTracked: mergedTodos.length,\n });\n } else {\n log.debug(\"No acceptance criteria todos found\", { issueNumber: result.issueNumber });\n }\n } catch (error) {\n log.warn(\"Failed to process issue for todo sync\", { error: String(error) });\n }\n}\n\nasync function handleTodoWritten(\n ctx: PluginInput,\n tracker: IssueTracker,\n config: SdlcConfig,\n output: AfterHookOutput\n): Promise<void> {\n const todos = extractTodosFromOutput(output);\n\n if (!todos || todos.length === 0) {\n log.debug(\"No todos found in todowrite output\");\n return;\n }\n\n try {\n const currentIssue = tracker.getCurrentIssue();\n if (!currentIssue) {\n return;\n }\n const updatedBody = await onTodoWritten(\n tracker,\n config,\n { issueNumber: currentIssue.issueNumber },\n todos\n );\n if (updatedBody) {\n await updateIssueBody(ctx, config, currentIssue.issueNumber, updatedBody);\n }\n } catch (error) {\n log.warn(\"Error processing todowrite for issue sync\", { error: String(error) });\n }\n}\n\nfunction extractTodosFromOutput(output: AfterHookOutput): OpenCodeTodo[] | null {\n const metadata = output.metadata as Record<string, unknown> | undefined;\n if (metadata?.todos && Array.isArray(metadata.todos)) {\n log.debug(\"Extracted todos from metadata\", { count: metadata.todos.length });\n return metadata.todos as OpenCodeTodo[];\n }\n\n try {\n const result = JSON.parse(output.output);\n if (Array.isArray(result)) {\n log.debug(\"Extracted todos from output (array)\", { count: result.length });\n return result as OpenCodeTodo[];\n }\n if (result?.todos && Array.isArray(result.todos)) {\n log.debug(\"Extracted todos from output.todos\", { count: result.todos.length });\n return result.todos as OpenCodeTodo[];\n }\n } catch {\n log.debug(\"Could not parse output as JSON\");\n }\n\n return null;\n}\n","import type { OpenCodeTodo, SdlcConfig } from \"../../shared/types.js\";\nimport type { IssueTracker } from \"../tracker/issue-tracker.js\";\nimport { isIssueTodo } from \"../utils/issue-todo-sync.js\";\n\ninterface CompactionInput {\n sessionID: string;\n}\n\ninterface CompactionOutput {\n context: string[];\n}\n\nconst PRIORITY_ORDER: Record<string, number> = { high: 0, medium: 1, low: 2 };\n\nexport function createCompactionHook(tracker: IssueTracker, config: SdlcConfig) {\n void config;\n return async (_input: CompactionInput, output: CompactionOutput): Promise<void> => {\n const issueContext = await tracker.getCurrentIssueContext();\n const todos = tracker.getCurrentTodos();\n const currentIssue = tracker.getCurrentIssue();\n\n const parts: string[] = [];\n\n if (todos && todos.length > 0) {\n const issueTodos = todos.filter((todo: OpenCodeTodo) => isIssueTodo(todo));\n const pending = issueTodos.filter((todo: OpenCodeTodo) => todo.status === \"pending\");\n const inProgress = issueTodos.filter((todo: OpenCodeTodo) => todo.status === \"in_progress\");\n\n if (issueTodos.length > 0 && (pending.length > 0 || inProgress.length > 0)) {\n parts.push(\"## ⚠️ MANDATORY POST-COMPACTION PROTOCOL\");\n parts.push(\"\");\n parts.push(\"**STOP. Before doing ANYTHING else:**\");\n parts.push(\"1. Call `todoread` to get your current task list\");\n parts.push(\"2. Review the todos below and compare to any 'next steps' you see\");\n parts.push(\"3. If any todo is marked `in_progress`, complete it FIRST\");\n parts.push(\"4. The TODO LIST is your source of truth, not the compaction summary\");\n parts.push(\"\");\n\n if (inProgress.length > 0) {\n parts.push(\"### 🔄 IN PROGRESS (Complete these FIRST):\");\n for (const todo of inProgress) {\n parts.push(`- ${todo.content}`);\n }\n parts.push(\"\");\n }\n\n if (pending.length > 0) {\n parts.push(\"### ⏳ PENDING (Work queue):\");\n const sortedPending = pending.sort(\n (a: OpenCodeTodo, b: OpenCodeTodo) =>\n (PRIORITY_ORDER[a.priority] ?? 99) - (PRIORITY_ORDER[b.priority] ?? 99)\n );\n\n const todosToShow = sortedPending.slice(0, 10);\n for (const todo of todosToShow) {\n parts.push(`- ${todo.content}`);\n }\n\n if (pending.length > 10) {\n parts.push(` ... and ${pending.length - 10} more (call todoread for full list)`);\n }\n parts.push(\"\");\n }\n\n parts.push(\"### ✅ VERIFICATION REQUIRED\");\n parts.push(\"Call `todoread` NOW to confirm this matches your working state.\");\n parts.push(\n \"If it doesn't match, the todo list takes priority over any 'next steps' in this summary.\"\n );\n parts.push(\"\");\n parts.push(\"---\");\n parts.push(\"\");\n }\n }\n\n if (issueContext) {\n parts.push(\"## OpenCode SDLC - Current Issue Context\");\n parts.push(\"\");\n parts.push(issueContext);\n if (currentIssue) {\n parts.push(`**Issue:** #${currentIssue.issueNumber}`);\n }\n parts.push(\"\");\n }\n\n if (todos && todos.length > 0) {\n const issueTodos = todos.filter((todo: OpenCodeTodo) => isIssueTodo(todo));\n const pendingCount = issueTodos.filter(\n (todo: OpenCodeTodo) => todo.status === \"pending\"\n ).length;\n const inProgressCount = issueTodos.filter(\n (todo: OpenCodeTodo) => todo.status === \"in_progress\"\n ).length;\n const completedCount = issueTodos.filter(\n (todo: OpenCodeTodo) => todo.status === \"completed\"\n ).length;\n\n if (issueTodos.length > 0) {\n parts.push(\"## Todo Sync (Issues ↔ Todos)\");\n parts.push(\"\");\n parts.push(`**Progress:** ${completedCount}/${issueTodos.length} issue tasks complete`);\n parts.push(`**Remaining:** ${pendingCount} pending, ${inProgressCount} in progress`);\n parts.push(\"\");\n parts.push(\"**How todos work:**\");\n parts.push(\"- Format: `[#<issueNumber>ΔAC1] {task}`\");\n parts.push(\"- Marking a todo complete updates the issue checkbox automatically\");\n parts.push(\"- For task details, open the GitHub issue\");\n parts.push(\"\");\n if (currentIssue) {\n parts.push(\"**To look up task context:**\");\n parts.push(\"```\");\n parts.push(`sdlc_get_issue(${currentIssue.issueNumber})`);\n parts.push(\"```\");\n parts.push(\"\");\n }\n }\n }\n\n if (issueContext || (todos && todos.length > 0)) {\n parts.push(\n \"IMPORTANT: You are implementing a GitHub issue. Use sdlc_get_issue to reload full context if needed. Use sdlc_update_issue_status to update the issue status when complete.\"\n );\n parts.push(\"\");\n\n output.context.push(parts.join(\"\\n\"));\n }\n };\n}\n","/**\n * TDD Cycle State Tracker\n *\n * Tracks the state of the TDD cycle: RED → DOMAIN → GREEN → DOMAIN\n * Ensures the cycle is followed correctly and provides state persistence.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type { TddPhase } from \"../utils/tdd-file-ownership.js\";\n\n/**\n * Valid transitions in the TDD cycle\n */\nexport const VALID_TRANSITIONS: Record<TddPhase | \"initial\", TddPhase[]> = {\n initial: [\"red\"], // Can only start with RED\n red: [\"domain\"], // RED must be followed by DOMAIN\n domain: [\"green\", \"red\"], // DOMAIN can go to GREEN or back to RED (if veto)\n green: [\"domain\"], // GREEN must be followed by DOMAIN\n};\n\n/**\n * TDD cycle states\n */\nexport type CycleState =\n | \"idle\" // No active TDD cycle\n | \"red_in_progress\" // Writing a failing test\n | \"red_complete\" // Test written and fails\n | \"domain_review_red\" // Domain review after RED\n | \"domain_approved_red\" // Domain approved after RED\n | \"domain_vetoed\" // Domain vetoed, must fix\n | \"green_in_progress\" // Writing implementation\n | \"green_complete\" // Implementation written, test passes\n | \"domain_review_green\" // Domain review after GREEN\n | \"domain_approved_green\" // Domain approved after GREEN, cycle complete\n | \"cycle_complete\"; // Full cycle complete, ready for next\n\n/**\n * A single cycle entry with timestamps and proof\n */\nexport interface CycleEntry {\n phase: TddPhase;\n state: CycleState;\n timestamp: string;\n testName?: string;\n testFile?: string;\n failureMessage?: string;\n implementationFiles?: string[];\n typesCreated?: string[];\n domainApproved?: boolean;\n vetoReason?: string;\n proof?: string;\n}\n\n/**\n * Persisted TDD cycle state\n */\nexport interface TddCycleState {\n /** Current issue being worked on */\n currentIssue: number | null;\n /** Current acceptance criterion */\n currentAC?: string;\n /** Session ID */\n sessionId: string;\n /** Project directory */\n projectDir: string;\n /** Current state in the cycle */\n currentState: CycleState;\n /** Current phase */\n currentPhase: TddPhase | null;\n /** Cycle history for current issue */\n cycleHistory: CycleEntry[];\n /** Number of completed RED-GREEN cycles */\n cyclesCompleted: number;\n /** Last RED phase output (for GREEN phase reference) */\n lastRedOutput?: {\n testName: string;\n testFile: string;\n failureMessage: string;\n };\n /** Last DOMAIN phase output */\n lastDomainOutput?: {\n approved: boolean;\n typesCreated: string[];\n vetoReason?: string;\n };\n}\n\n/**\n * Default state path\n */\nconst DEFAULT_STATE_PATH = join(\n process.env.HOME || \"~\",\n \".config\",\n \"opencode\",\n \"sdlc-tdd-state.json\"\n);\n\n/**\n * TDD Cycle Tracker class\n */\nexport class TddCycleTracker {\n private state: TddCycleState;\n private statePath: string;\n\n constructor(projectDir: string, sessionId: string, statePath?: string) {\n this.statePath = statePath ?? DEFAULT_STATE_PATH;\n this.state = this.loadState(projectDir, sessionId);\n }\n\n /**\n * Load state from disk or create new state\n */\n private loadState(projectDir: string, sessionId: string): TddCycleState {\n try {\n if (existsSync(this.statePath)) {\n const data = JSON.parse(readFileSync(this.statePath, \"utf-8\")) as TddCycleState;\n\n // If same session and project, return existing state\n if (data.sessionId === sessionId && data.projectDir === projectDir) {\n return data;\n }\n\n // Different session/project, reset state but preserve some history\n return {\n currentIssue: null,\n sessionId,\n projectDir,\n currentState: \"idle\",\n currentPhase: null,\n cycleHistory: [],\n cyclesCompleted: 0,\n };\n }\n } catch {\n // Ignore load errors, create new state\n }\n\n return {\n currentIssue: null,\n sessionId,\n projectDir,\n currentState: \"idle\",\n currentPhase: null,\n cycleHistory: [],\n cyclesCompleted: 0,\n };\n }\n\n /**\n * Save state to disk\n */\n private saveState(): void {\n try {\n const dir = dirname(this.statePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(this.statePath, JSON.stringify(this.state, null, 2));\n } catch (error) {\n console.error(\"Failed to save TDD cycle state:\", error);\n }\n }\n\n /**\n * Get current state\n */\n getState(): TddCycleState {\n return { ...this.state };\n }\n\n /**\n * Start working on an issue\n */\n startIssue(issueNumber: number, acceptanceCriterion?: string): void {\n this.state.currentIssue = issueNumber;\n this.state.currentAC = acceptanceCriterion;\n this.state.currentState = \"idle\";\n this.state.currentPhase = null;\n this.state.cycleHistory = [];\n this.state.cyclesCompleted = 0;\n this.state.lastRedOutput = undefined;\n this.state.lastDomainOutput = undefined;\n this.saveState();\n }\n\n /**\n * Check if a transition to a phase is valid\n */\n canTransitionTo(phase: TddPhase): { valid: boolean; reason: string } {\n const currentPhaseOrInitial = this.state.currentPhase ?? \"initial\";\n const validNextPhases = VALID_TRANSITIONS[currentPhaseOrInitial];\n\n if (validNextPhases.includes(phase)) {\n return {\n valid: true,\n reason: `Transition from ${currentPhaseOrInitial} to ${phase} is valid`,\n };\n }\n\n return {\n valid: false,\n reason: `Invalid transition: Cannot go from ${currentPhaseOrInitial} to ${phase}. Valid next phases: ${validNextPhases.join(\", \")}`,\n };\n }\n\n /**\n * Start RED phase\n */\n startRed(): { success: boolean; error?: string } {\n const canTransition = this.canTransitionTo(\"red\");\n if (!canTransition.valid) {\n return { success: false, error: canTransition.reason };\n }\n\n this.state.currentPhase = \"red\";\n this.state.currentState = \"red_in_progress\";\n this.addCycleEntry({\n phase: \"red\",\n state: \"red_in_progress\",\n timestamp: new Date().toISOString(),\n });\n this.saveState();\n return { success: true };\n }\n\n /**\n * Complete RED phase\n */\n completeRed(\n testName: string,\n testFile: string,\n failureMessage: string\n ): { success: boolean; error?: string } {\n if (this.state.currentState !== \"red_in_progress\") {\n return { success: false, error: \"RED phase not in progress\" };\n }\n\n this.state.currentState = \"red_complete\";\n this.state.lastRedOutput = { testName, testFile, failureMessage };\n this.addCycleEntry({\n phase: \"red\",\n state: \"red_complete\",\n timestamp: new Date().toISOString(),\n testName,\n testFile,\n failureMessage,\n });\n this.saveState();\n return { success: true };\n }\n\n /**\n * Start DOMAIN review phase\n */\n startDomain(context: \"red\" | \"green\"): { success: boolean; error?: string } {\n const canTransition = this.canTransitionTo(\"domain\");\n if (!canTransition.valid) {\n return { success: false, error: canTransition.reason };\n }\n\n const expectedPreviousState = context === \"red\" ? \"red_complete\" : \"green_complete\";\n if (\n this.state.currentState !== expectedPreviousState &&\n this.state.currentState !== \"domain_vetoed\"\n ) {\n return {\n success: false,\n error: `Cannot start DOMAIN review: expected state ${expectedPreviousState}, got ${this.state.currentState}`,\n };\n }\n\n this.state.currentPhase = \"domain\";\n this.state.currentState = context === \"red\" ? \"domain_review_red\" : \"domain_review_green\";\n this.addCycleEntry({\n phase: \"domain\",\n state: this.state.currentState,\n timestamp: new Date().toISOString(),\n });\n this.saveState();\n return { success: true };\n }\n\n /**\n * Complete DOMAIN review with approval\n */\n approveDomain(typesCreated: string[] = []): { success: boolean; error?: string } {\n if (\n this.state.currentState !== \"domain_review_red\" &&\n this.state.currentState !== \"domain_review_green\"\n ) {\n return { success: false, error: \"DOMAIN review not in progress\" };\n }\n\n const wasReviewingRed = this.state.currentState === \"domain_review_red\";\n this.state.currentState = wasReviewingRed ? \"domain_approved_red\" : \"domain_approved_green\";\n this.state.lastDomainOutput = { approved: true, typesCreated };\n\n this.addCycleEntry({\n phase: \"domain\",\n state: this.state.currentState,\n timestamp: new Date().toISOString(),\n domainApproved: true,\n typesCreated,\n });\n\n if (!wasReviewingRed) {\n // Cycle complete after GREEN + DOMAIN approval\n this.state.currentState = \"cycle_complete\";\n this.state.cyclesCompleted++;\n this.state.currentPhase = null;\n }\n\n this.saveState();\n return { success: true };\n }\n\n /**\n * Complete DOMAIN review with veto\n */\n vetoDomain(reason: string): { success: boolean; error?: string } {\n if (\n this.state.currentState !== \"domain_review_red\" &&\n this.state.currentState !== \"domain_review_green\"\n ) {\n return { success: false, error: \"DOMAIN review not in progress\" };\n }\n\n this.state.currentState = \"domain_vetoed\";\n this.state.lastDomainOutput = { approved: false, typesCreated: [], vetoReason: reason };\n this.addCycleEntry({\n phase: \"domain\",\n state: \"domain_vetoed\",\n timestamp: new Date().toISOString(),\n domainApproved: false,\n vetoReason: reason,\n });\n this.saveState();\n return { success: true };\n }\n\n /**\n * Start GREEN phase\n */\n startGreen(): { success: boolean; error?: string } {\n const canTransition = this.canTransitionTo(\"green\");\n if (!canTransition.valid) {\n return { success: false, error: canTransition.reason };\n }\n\n if (this.state.currentState !== \"domain_approved_red\") {\n return {\n success: false,\n error: `Cannot start GREEN phase: DOMAIN approval required. Current state: ${this.state.currentState}`,\n };\n }\n\n if (!this.state.lastRedOutput) {\n return { success: false, error: \"Cannot start GREEN phase: No RED phase output available\" };\n }\n\n this.state.currentPhase = \"green\";\n this.state.currentState = \"green_in_progress\";\n this.addCycleEntry({\n phase: \"green\",\n state: \"green_in_progress\",\n timestamp: new Date().toISOString(),\n });\n this.saveState();\n return { success: true };\n }\n\n /**\n * Complete GREEN phase\n */\n completeGreen(implementationFiles: string[]): { success: boolean; error?: string } {\n if (this.state.currentState !== \"green_in_progress\") {\n return { success: false, error: \"GREEN phase not in progress\" };\n }\n\n this.state.currentState = \"green_complete\";\n this.addCycleEntry({\n phase: \"green\",\n state: \"green_complete\",\n timestamp: new Date().toISOString(),\n implementationFiles,\n });\n this.saveState();\n return { success: true };\n }\n\n /**\n * Add an entry to cycle history\n */\n private addCycleEntry(entry: CycleEntry): void {\n this.state.cycleHistory.push(entry);\n }\n\n /**\n * Get summary of current cycle progress\n */\n getCycleSummary(): string {\n const { currentState, currentPhase, cyclesCompleted, lastRedOutput, lastDomainOutput } =\n this.state;\n\n let summary = \"TDD Cycle Status:\\n\";\n summary += ` Cycles completed: ${cyclesCompleted}\\n`;\n summary += ` Current state: ${currentState}\\n`;\n summary += ` Current phase: ${currentPhase ?? \"none\"}\\n`;\n\n if (lastRedOutput) {\n summary += \"\\n Last RED output:\\n\";\n summary += ` Test: ${lastRedOutput.testName}\\n`;\n summary += ` File: ${lastRedOutput.testFile}\\n`;\n }\n\n if (lastDomainOutput) {\n summary += \"\\n Last DOMAIN output:\\n\";\n summary += ` Approved: ${lastDomainOutput.approved}\\n`;\n if (lastDomainOutput.typesCreated.length > 0) {\n summary += ` Types created: ${lastDomainOutput.typesCreated.join(\", \")}\\n`;\n }\n if (lastDomainOutput.vetoReason) {\n summary += ` Veto reason: ${lastDomainOutput.vetoReason}\\n`;\n }\n }\n\n return summary;\n }\n\n /**\n * Reset the tracker\n */\n reset(): void {\n this.state = {\n currentIssue: null,\n sessionId: this.state.sessionId,\n projectDir: this.state.projectDir,\n currentState: \"idle\",\n currentPhase: null,\n cycleHistory: [],\n cyclesCompleted: 0,\n };\n this.saveState();\n }\n\n /**\n * Get the last RED output (for GREEN phase)\n */\n getLastRedOutput(): TddCycleState[\"lastRedOutput\"] {\n return this.state.lastRedOutput;\n }\n\n /**\n * Get the last DOMAIN output\n */\n getLastDomainOutput(): TddCycleState[\"lastDomainOutput\"] {\n return this.state.lastDomainOutput;\n }\n}\n","/**\n * sdlc_adr Tool\n *\n * Architecture Decision Record (ADR) management:\n * - Create new ADRs in docs/adr/\n * - List existing ADRs\n * - Synthesize accepted ADRs into ARCHITECTURE.md\n */\n\nimport { mkdir, readFile, readdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport { registerSubagentSession, unregisterSubagentSession } from \"../hooks/orchestrator-guard.js\";\n\n/**\n * ADR status\n */\nexport type AdrStatus = \"proposed\" | \"accepted\" | \"deprecated\" | \"superseded\";\n\n/**\n * ADR metadata\n */\nexport interface AdrMetadata {\n number: number;\n title: string;\n status: AdrStatus;\n date: string;\n deciders?: string[];\n supersedes?: number;\n supersededBy?: number;\n}\n\n/**\n * ADR list item\n */\nexport interface AdrListItem extends AdrMetadata {\n path: string;\n}\n\n/**\n * ADR creation result\n */\nexport interface AdrCreateResult {\n success: boolean;\n path?: string;\n number?: number;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * ADR list result\n */\nexport interface AdrListResult {\n success: boolean;\n adrs?: AdrListItem[];\n count?: number;\n error?: string;\n}\n\n/**\n * ADR synthesize result\n */\nexport interface AdrSynthesizeResult {\n success: boolean;\n architecturePath?: string;\n includedAdrs?: number[];\n error?: string;\n suggestion?: string;\n}\n\n/**\n * ADR tool result (union of all results)\n */\nexport type AdrResult = AdrCreateResult | AdrListResult | AdrSynthesizeResult;\n\n/**\n * Arguments for sdlc_adr tool\n */\nexport interface AdrArgs {\n action: \"create\" | \"list\" | \"synthesize\";\n title?: string;\n context?: string;\n decision?: string;\n consequences?: string;\n}\n\n/**\n * Create the sdlc_adr tool\n */\nexport function createAdrTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Manage Architecture Decision Records (ADRs).\n\nActions:\n- create: Create a new ADR with title, context, decision, and consequences\n- list: List all existing ADRs with their status\n- synthesize: Generate/update ARCHITECTURE.md from accepted ADRs\n\nADRs are stored in docs/adr/ following the standard ADR format.\nNumbers are auto-assigned sequentially.\n\nCreate returns the path to the new ADR.\nList returns metadata for all ADRs.\nSynthesize updates ARCHITECTURE.md with current decisions.`,\n\n args: {\n action: tool.schema\n .enum([\"create\", \"list\", \"synthesize\"])\n .describe(\"Action to perform: create, list, or synthesize\"),\n title: tool.schema\n .string()\n .optional()\n .describe(\"Title for new ADR (required for create action)\"),\n context: tool.schema\n .string()\n .optional()\n .describe(\"Context/background for the decision (for create action)\"),\n decision: tool.schema\n .string()\n .optional()\n .describe(\"The decision being made (for create action)\"),\n consequences: tool.schema\n .string()\n .optional()\n .describe(\"Consequences of the decision (for create action)\"),\n },\n\n async execute(args): Promise<string> {\n const adrArgs = args as AdrArgs;\n\n switch (adrArgs.action) {\n case \"create\":\n return JSON.stringify(await createAdr(ctx, config, adrArgs), null, 2);\n case \"list\":\n return JSON.stringify(await listAdrs(ctx), null, 2);\n case \"synthesize\":\n return JSON.stringify(await synthesizeAdrs(ctx, config), null, 2);\n default:\n return JSON.stringify({\n success: false,\n error: `Unknown action: ${adrArgs.action}`,\n });\n }\n },\n });\n}\n\nconst ADR_DIR = \"docs/adr\";\n\nasync function createAdr(\n ctx: PluginInput,\n _config: SdlcConfig,\n args: AdrArgs\n): Promise<AdrCreateResult> {\n if (!args.title) {\n return {\n success: false,\n error: \"Title is required for creating an ADR\",\n suggestion: \"Provide a title describing the architectural decision\",\n };\n }\n\n const adrDir = join(ctx.directory, ADR_DIR);\n\n // Ensure directory exists\n try {\n await mkdir(adrDir, { recursive: true });\n } catch {\n // Directory might already exist\n }\n\n // Get next ADR number\n const existingAdrs = await getExistingAdrNumbers(adrDir);\n const nextNumber = existingAdrs.length > 0 ? Math.max(...existingAdrs) + 1 : 1;\n\n // Format number with leading zeros (e.g., 0001)\n const paddedNumber = String(nextNumber).padStart(4, \"0\");\n const slug = slugify(args.title);\n const filename = `${paddedNumber}-${slug}.md`;\n const filePath = join(adrDir, filename);\n\n // Generate ADR content\n const date = new Date().toISOString().split(\"T\")[0];\n const content = generateAdrContent({\n number: nextNumber,\n title: args.title,\n status: \"proposed\",\n date,\n context: args.context,\n decision: args.decision,\n consequences: args.consequences,\n });\n\n try {\n await writeFile(filePath, content, \"utf-8\");\n\n return {\n success: true,\n path: filePath,\n number: nextNumber,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n success: false,\n error: `Failed to create ADR: ${message}`,\n suggestion: \"Check file system permissions\",\n };\n }\n}\n\nasync function listAdrs(ctx: PluginInput): Promise<AdrListResult> {\n const adrDir = join(ctx.directory, ADR_DIR);\n\n try {\n const files = await readdir(adrDir);\n const adrFiles = files.filter((f) => f.match(/^\\d{4}-.*\\.md$/));\n\n const adrs: AdrListItem[] = [];\n\n for (const file of adrFiles) {\n const filePath = join(adrDir, file);\n try {\n const content = await readFile(filePath, \"utf-8\");\n const metadata = parseAdrMetadata(content, file);\n adrs.push({\n ...metadata,\n path: filePath,\n });\n } catch {\n // Skip files that can't be read\n }\n }\n\n // Sort by number\n adrs.sort((a, b) => a.number - b.number);\n\n return {\n success: true,\n adrs,\n count: adrs.length,\n };\n } catch {\n return {\n success: true,\n adrs: [],\n count: 0,\n };\n }\n}\n\nasync function synthesizeAdrs(ctx: PluginInput, config: SdlcConfig): Promise<AdrSynthesizeResult> {\n // Get all accepted ADRs\n const listResult = await listAdrs(ctx);\n\n if (!listResult.success || !listResult.adrs) {\n return {\n success: false,\n error: \"Failed to list ADRs\",\n };\n }\n\n const acceptedAdrs = listResult.adrs.filter((adr) => adr.status === \"accepted\");\n\n if (acceptedAdrs.length === 0) {\n return {\n success: false,\n error: \"No accepted ADRs found\",\n suggestion: \"Mark ADRs as accepted by changing their status in the file\",\n };\n }\n\n // Spawn agent to synthesize\n const synthesizeResult = await spawnSynthesizeAgent(ctx, config, acceptedAdrs);\n\n if (!synthesizeResult.success) {\n return {\n success: false,\n error: synthesizeResult.error || \"Synthesis failed\",\n suggestion: \"Check agent configuration\",\n };\n }\n\n // Write ARCHITECTURE.md\n const architecturePath = join(ctx.directory, \"ARCHITECTURE.md\");\n\n try {\n await writeFile(architecturePath, synthesizeResult.content || \"\", \"utf-8\");\n\n return {\n success: true,\n architecturePath,\n includedAdrs: acceptedAdrs.map((a) => a.number),\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n success: false,\n error: `Failed to write ARCHITECTURE.md: ${message}`,\n };\n }\n}\n\nasync function getExistingAdrNumbers(adrDir: string): Promise<number[]> {\n try {\n const files = await readdir(adrDir);\n const numbers: number[] = [];\n\n for (const file of files) {\n const match = file.match(/^(\\d{4})-/);\n if (match) {\n numbers.push(Number.parseInt(match[1], 10));\n }\n }\n\n return numbers;\n } catch {\n return [];\n }\n}\n\nfunction slugify(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\")\n .slice(0, 50);\n}\n\ninterface AdrContentArgs {\n number: number;\n title: string;\n status: AdrStatus;\n date: string;\n context?: string;\n decision?: string;\n consequences?: string;\n}\n\nfunction generateAdrContent(args: AdrContentArgs): string {\n return `# ADR ${args.number}: ${args.title}\n\n## Status\n\n${args.status.charAt(0).toUpperCase() + args.status.slice(1)}\n\n## Date\n\n${args.date}\n\n## Context\n\n${args.context || \"<!-- Describe the context and problem statement -->\"}\n\n## Decision\n\n${args.decision || \"<!-- Describe the decision that was made -->\"}\n\n## Consequences\n\n${args.consequences || \"<!-- Describe the consequences of this decision -->\"}\n\n### Positive\n\n- <!-- List positive consequences -->\n\n### Negative\n\n- <!-- List negative consequences or trade-offs -->\n\n### Neutral\n\n- <!-- List neutral observations -->\n\n## References\n\n- <!-- Add links to related documents, issues, or discussions -->\n`;\n}\n\nfunction parseAdrMetadata(content: string, filename: string): AdrMetadata {\n // Extract number from filename\n const numberMatch = filename.match(/^(\\d{4})-/);\n const number = numberMatch ? Number.parseInt(numberMatch[1], 10) : 0;\n\n // Extract title from first heading\n const titleMatch = content.match(/^#\\s+ADR\\s+\\d+:\\s*(.+)$/m);\n const title = titleMatch ? titleMatch[1].trim() : filename.replace(/^\\d{4}-|\\.md$/g, \"\");\n\n // Extract status\n const statusMatch = content.match(/##\\s*Status\\s*\\n+(\\w+)/i);\n const statusStr = statusMatch ? statusMatch[1].toLowerCase() : \"proposed\";\n const status: AdrStatus =\n statusStr === \"accepted\" ||\n statusStr === \"deprecated\" ||\n statusStr === \"superseded\" ||\n statusStr === \"proposed\"\n ? statusStr\n : \"proposed\";\n\n // Extract date\n const dateMatch = content.match(/##\\s*Date\\s*\\n+(\\d{4}-\\d{2}-\\d{2})/i);\n const date = dateMatch ? dateMatch[1] : new Date().toISOString().split(\"T\")[0];\n\n // Extract supersedes/supersededBy\n const supersedesMatch = content.match(/Supersedes\\s*(?:ADR\\s*)?\\[?#?(\\d+)/i);\n const supersededByMatch = content.match(/Superseded\\s*by\\s*(?:ADR\\s*)?\\[?#?(\\d+)/i);\n\n return {\n number,\n title,\n status,\n date,\n supersedes: supersedesMatch ? Number.parseInt(supersedesMatch[1], 10) : undefined,\n supersededBy: supersededByMatch ? Number.parseInt(supersededByMatch[1], 10) : undefined,\n };\n}\n\ninterface SynthesizeAgentResult {\n success: boolean;\n content?: string;\n error?: string;\n}\n\nasync function spawnSynthesizeAgent(\n ctx: PluginInput,\n config: SdlcConfig,\n adrs: AdrListItem[]\n): Promise<SynthesizeAgentResult> {\n try {\n // Build prompt with ADR contents\n let adrContents = \"\";\n for (const adr of adrs) {\n try {\n const content = await readFile(adr.path, \"utf-8\");\n adrContents += `\\n\\n---\\n\\n## ADR ${adr.number}: ${adr.title}\\n\\n${content}`;\n } catch {\n // Skip unreadable ADRs\n }\n }\n\n const prompt = `# Synthesize Architecture Documentation\n\nYou are tasked with creating an ARCHITECTURE.md file that synthesizes the accepted Architecture Decision Records (ADRs) into a cohesive architectural overview.\n\n## Instructions\n\n1. Read through all the ADRs provided below\n2. Extract the key architectural decisions and their rationale\n3. Organize them into a coherent ARCHITECTURE.md document with sections:\n - Overview (high-level system architecture)\n - Key Decisions (summarized from ADRs)\n - Components (if applicable)\n - Data Flow (if applicable)\n - Technology Choices (summarized from ADRs)\n - Trade-offs and Constraints\n\n4. Reference the original ADR numbers so readers can find detailed context\n5. Keep the document concise but comprehensive\n\n## Accepted ADRs\n\n${adrContents}\n\n## Output\n\nGenerate the complete ARCHITECTURE.md content. Start directly with the markdown content.`;\n\n const createResult = await ctx.client.session.create({\n body: {\n title: \"ADR Synthesis\",\n },\n });\n\n if (!createResult.data?.id) {\n return { success: false, error: \"Failed to create synthesis session\" };\n }\n\n const sessionId = createResult.data.id;\n registerSubagentSession(sessionId, \"file_updater\");\n\n try {\n const modelConfig = parseModelConfig(\n config.models.oracle || \"anthropic/claude-sonnet-4-20250514\"\n );\n\n const promptResult = await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: modelConfig,\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n if (!promptResult.data) {\n return { success: false, error: \"No response from synthesis agent\" };\n }\n\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n return { success: false, error: \"No messages in synthesis session\" };\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const content = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n return { success: true, content };\n } finally {\n unregisterSubagentSession(sessionId);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return { success: false, error: `Synthesis failed: ${message}` };\n }\n}\n\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"anthropic\", modelID: modelID || modelString };\n}\n\n// Export for testing\nexport const _testExports = {\n createAdr,\n listAdrs,\n synthesizeAdrs,\n parseAdrMetadata,\n generateAdrContent,\n slugify,\n};\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/**\n * Get version from package.json at runtime.\n * Handles both bundled (dist/) and development (src/) scenarios.\n */\nfunction getPackageVersion(): string {\n try {\n const currentDir = dirname(fileURLToPath(import.meta.url));\n\n const possiblePaths = [\n join(currentDir, \"..\", \"..\", \"package.json\"),\n join(currentDir, \"..\", \"..\", \"..\", \"package.json\"),\n ];\n\n for (const pkgPath of possiblePaths) {\n if (!existsSync(pkgPath)) continue;\n\n const content = readFileSync(pkgPath, \"utf-8\");\n const pkg = JSON.parse(content);\n if (pkg.version) return pkg.version;\n }\n\n return \"0.0.0\";\n } catch (error) {\n if (error instanceof SyntaxError) {\n console.error(\"[opencode-sdlc] Warning: package.json contains invalid JSON\");\n }\n return \"0.0.0\";\n }\n}\n\n/**\n * Current version of OpenCode SDLC Plugin\n * Dynamically read from package.json\n */\nexport const VERSION = getPackageVersion();\n\n/**\n * Package name for CLI display\n */\nexport const PACKAGE_NAME = \"opencode-sdlc-plugin\";\n\n/**\n * CLI display name\n */\nexport const DISPLAY_NAME = \"OpenCode SDLC\";\n\n/**\n * Tagline for CLI header\n */\nexport const TAGLINE = \"Strict TDD with domain modeling and event sourcing\";\n\n/**\n * Configuration paths\n */\nexport const CONFIG_PATHS = {\n /** Global OpenCode config directory */\n globalConfigDir: join(homedir(), \".config\", \"opencode\"),\n\n /** Global SDLC config file */\n globalSdlcConfig: join(homedir(), \".config\", \"opencode\", \"sdlc.json\"),\n\n /** Global OpenCode config file */\n globalOpencodeConfig: join(homedir(), \".config\", \"opencode\", \"opencode.json\"),\n\n /** Global oh-my-opencode config file */\n globalOmoConfig: join(homedir(), \".config\", \"opencode\", \"oh-my-opencode.json\"),\n\n /** Commands directory */\n commandsDir: join(homedir(), \".config\", \"opencode\", \"command\"),\n\n /** Plugin directory */\n pluginDir: join(homedir(), \".config\", \"opencode\", \"plugin\"),\n\n /** SDLC internal files directory (state, backups) */\n sdlcDir: join(homedir(), \".config\", \"opencode\", \"sdlc\"),\n\n /** SDLC backups directory */\n backupsDir: join(homedir(), \".config\", \"opencode\", \"sdlc\", \"backups\"),\n\n /** SDLC state file (for issue tracking) */\n stateFile: join(homedir(), \".config\", \"opencode\", \"sdlc\", \"sdlc-state.json\"),\n\n /** Legacy state file path (for migration) */\n legacyStateFile: join(homedir(), \".config\", \"opencode\", \"sdlc-state.json\"),\n} as const;\n\n/**\n * Project-specific paths (relative to project root)\n */\nexport const PROJECT_PATHS = {\n /** Local SDLC config */\n localConfig: \".opencode/sdlc.json\",\n} as const;\n\n/**\n * Default configuration values (v0.3.0+)\n */\nexport const DEFAULTS = {\n // ============================================================================\n // New v0.3.0+ defaults\n // ============================================================================\n\n /** Default TDD configuration */\n tdd: {\n enabled: true,\n verbosity: \"brief\" as const,\n bypassPatterns: [\"*.config.*\", \"*.json\", \"*.md\", \"*.yaml\", \"*.yml\"],\n mutationTesting: {\n enabled: false,\n requiredScore: 80,\n },\n },\n\n /** Default Event Modeling configuration */\n eventModeling: {\n enabled: false,\n outputPath: \"docs/event-model\",\n },\n\n /** Default Git configuration */\n git: {\n workflow: \"standard\" as const,\n requireClean: true,\n worktrees: false,\n },\n\n /** Default features enabled (v0.3.0+) */\n features: {\n orchestratorOnly: false,\n todoSync: true,\n partyReview: true,\n debuggingProtocol: true,\n memento: false,\n notifications: true,\n lspTools: true,\n },\n\n /** Default MCPs enabled (v0.3.0+) */\n mcps: {\n context7: true,\n exa: true,\n grepApp: true,\n memento: false,\n },\n} as const;\n\n/**\n * Minimum compatible versions\n */\nexport const MIN_VERSIONS = {\n node: \"20.0.0\",\n opencode: \"1.0.132\",\n} as const;\n","/**\n * sdlc_config tool\n *\n * View current Sdlc configuration.\n */\n\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport { VERSION } from \"../../shared/constants.js\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\n\n/**\n * Create the sdlc_config tool\n */\nexport function createConfigTool(config: SdlcConfig): ToolDefinition {\n return tool({\n description: `View the current OpenCode SDLC configuration.\n\nShows:\n- Version information\n- Subscription settings (Claude, OpenAI, Google)\n- Model assignments for each agent role\n- BMAD integration settings\n- Enabled features and MCP servers`,\n\n args: {\n section: tool.schema\n .enum([\"all\", \"subscriptions\", \"models\", \"bmad\", \"features\", \"mcps\"])\n .optional()\n .describe(\"Specific section to view (default: all)\"),\n },\n\n async execute(args): Promise<string> {\n const section = args.section || \"all\";\n\n if (section === \"all\") {\n return JSON.stringify(\n {\n sdlcVersion: VERSION,\n configVersion: config.version,\n subscriptions: config.subscriptions,\n models: config.models,\n bmad: config.bmad,\n features: config.features,\n mcps: config.mcps,\n },\n null,\n 2\n );\n }\n\n // Return specific section\n const sectionData: Record<string, unknown> = {\n subscriptions: config.subscriptions,\n models: config.models,\n bmad: config.bmad,\n features: config.features,\n mcps: config.mcps,\n };\n\n return JSON.stringify(\n {\n section,\n data: sectionData[section] || null,\n },\n null,\n 2\n );\n },\n });\n}\n","/**\n * sdlc_design_workflow Tool\n *\n * Workflow design for Event Modeling using the 9-step methodology\n *\n * Guides the design of event-sourced workflows, creating commands,\n * events, read models, and vertical slices.\n */\n\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport { registerSubagentSession, unregisterSubagentSession } from \"../hooks/orchestrator-guard.js\";\n\n/**\n * Arguments for sdlc_design_workflow tool\n */\nexport interface DesignWorkflowArgs {\n workflowName: string;\n domainOverviewPath?: string;\n context?: string;\n step?: number;\n}\n\n/**\n * Event defined in the workflow\n */\nexport interface WorkflowEvent {\n name: string;\n description?: string;\n aggregateId?: string;\n payload?: Record<string, string>;\n}\n\n/**\n * Command defined in the workflow\n */\nexport interface WorkflowCommand {\n name: string;\n triggeredBy?: string;\n successEvents?: string[];\n failureEvents?: string[];\n}\n\n/**\n * Read model defined in the workflow\n */\nexport interface WorkflowReadModel {\n name: string;\n purpose?: string;\n eventsConsumed?: string[];\n}\n\n/**\n * Vertical slice for implementation\n */\nexport interface VerticalSlice {\n name: string;\n commands?: string[];\n events?: string[];\n readModels?: string[];\n userStory?: string;\n}\n\n/**\n * Result from sdlc_design_workflow tool\n */\nexport interface DesignWorkflowResult {\n success: boolean;\n outputPath?: string;\n events?: WorkflowEvent[];\n commands?: WorkflowCommand[];\n readModels?: WorkflowReadModel[];\n slices?: VerticalSlice[];\n currentStep?: number;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Create the sdlc_design_workflow tool\n */\nexport function createDesignWorkflowTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Workflow design for Event Modeling using the 9-step methodology.\n\nThis tool spawns an agent that guides workflow design through:\n1. Brain Storming - List all events (orange)\n2. The Plot - Arrange events on timeline\n3. The Story - Identify UIs and views (white)\n4. Blueprint - Identify commands (blue)\n5. Specification - Document business rules\n6. Elaboration - Flesh out event details\n7. Read Models - Design projections (green)\n8. Automation - Design policies (lilac)\n9. Vertical Slices - Break into implementable pieces\n\nCreates: docs/event_model/workflows/{name}/overview.md\n\nUse AFTER domain discovery. Workflows become GitHub epics, slices become issues.\n\nReturns:\n- outputPath: Path to the generated workflow document\n- events: List of identified events\n- commands: List of commands\n- readModels: List of read models\n- slices: Vertical slices for implementation`,\n\n args: {\n workflowName: tool.schema\n .string()\n .describe(\"Name of the workflow (e.g., 'Order Submission', 'User Registration')\"),\n domainOverviewPath: tool.schema\n .string()\n .optional()\n .describe(\n \"Path to domain overview for context (default: docs/event_model/domain/overview.md)\"\n ),\n context: tool.schema\n .string()\n .optional()\n .describe(\"Additional context (PRD requirements, existing events, etc.)\"),\n step: tool.schema\n .number()\n .optional()\n .describe(\"Start from a specific step (1-9). Omit to run all steps.\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executeWorkflowDesign(ctx, config, args as DesignWorkflowArgs);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function executeWorkflowDesign(\n ctx: PluginInput,\n config: SdlcConfig,\n args: DesignWorkflowArgs\n): Promise<DesignWorkflowResult> {\n // Validate inputs\n if (!args.workflowName) {\n return {\n success: false,\n error: \"workflowName is required\",\n suggestion: \"Provide a name for the workflow being designed\",\n };\n }\n\n // Normalize workflow name for file paths\n const normalizedName = args.workflowName\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n\n // Load domain context if available\n let domainContext = \"\";\n const domainPath =\n args.domainOverviewPath || join(ctx.directory, \"docs\", \"event_model\", \"domain\", \"overview.md\");\n\n try {\n domainContext = await readFile(domainPath, \"utf-8\");\n } catch {\n // Domain overview not found - continue without it\n }\n\n // Load workflow design prompt\n const workflowPrompt = await loadWorkflowPrompt(ctx.directory, args, domainContext);\n\n // Spawn workflow design agent\n const agentResult = await spawnWorkflowAgent(ctx, config, workflowPrompt, args.workflowName);\n\n if (!agentResult.success) {\n return {\n success: false,\n error: agentResult.error || \"Workflow design agent failed\",\n suggestion: \"Check agent configuration and try again\",\n };\n }\n\n // Write the workflow document\n const outputPath = join(\n ctx.directory,\n \"docs\",\n \"event_model\",\n \"workflows\",\n normalizedName,\n \"overview.md\"\n );\n\n try {\n await mkdir(dirname(outputPath), { recursive: true });\n await writeFile(outputPath, agentResult.document || \"\", \"utf-8\");\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n success: false,\n error: `Failed to write workflow document: ${message}`,\n suggestion: \"Check file permissions and try again\",\n };\n }\n\n return {\n success: true,\n outputPath,\n events: agentResult.events,\n commands: agentResult.commands,\n readModels: agentResult.readModels,\n slices: agentResult.slices,\n currentStep: args.step || 9,\n };\n}\n\nasync function loadWorkflowPrompt(\n projectDir: string,\n args: DesignWorkflowArgs,\n domainContext: string\n): Promise<string> {\n // Try to load custom prompt from project\n const customPromptPath = join(projectDir, \"prompts\", \"event-modeling\", \"workflow-design.md\");\n let basePrompt: string;\n\n try {\n basePrompt = await readFile(customPromptPath, \"utf-8\");\n } catch {\n // Use built-in prompt\n basePrompt = getBuiltInWorkflowPrompt();\n }\n\n // Add context-specific instructions\n const stepInstructions = args.step\n ? `\\n**Start from Step ${args.step}** - Previous steps are complete.\\n`\n : \"\\n**Complete all 9 steps** in sequence.\\n\";\n\n const contextInstructions = `\n## Workflow Design Task\n\n**Workflow Name:** ${args.workflowName}\n\n${domainContext ? `**Domain Context:**\\n\\`\\`\\`markdown\\n${domainContext}\\n\\`\\`\\`\\n` : \"**Note:** No domain overview found. Proceed with discovery embedded in workflow design.\"}\n\n${args.context ? `**Additional Context:**\\n${args.context}` : \"\"}\n${stepInstructions}\n**Instructions:**\n1. Design the \"${args.workflowName}\" workflow using the 9-step methodology\n2. Identify all events, commands, read models, and automations\n3. Break down into vertical slices for implementation\n4. Output the complete workflow design document\n\n**Output:**\nCreate a comprehensive workflow design following the template structure.\nThe document will be saved to: docs/event_model/workflows/${args.workflowName.toLowerCase().replace(/[^a-z0-9]+/g, \"-\")}/overview.md\n`;\n\n return `${basePrompt}\\n\\n${contextInstructions}`;\n}\n\nfunction getBuiltInWorkflowPrompt(): string {\n return `# Workflow Design Agent\n\nYou are a workflow design expert for Event Modeling.\n\n## The 9 Steps\n\n1. **Events (Orange)** - Brainstorm all events in past tense\n2. **Timeline** - Arrange events chronologically\n3. **UIs (White)** - Identify user interfaces\n4. **Commands (Blue)** - Identify commands (imperative)\n5. **Business Rules** - Document validation rules\n6. **Event Details** - Define event payloads\n7. **Read Models (Green)** - Design projections\n8. **Automations (Lilac)** - Design policies\n9. **Vertical Slices** - Break into implementable pieces\n\n## Event Modeling Patterns\n\n- **Command**: Trigger → Command → Event(s)\n- **View**: Events → Read Model projection\n- **Automation**: Event → Policy → Command\n- **Translation**: External Data → Internal Event\n\n## Naming Conventions\n\n**Events** (past tense): OrderSubmitted, PaymentReceived\n**Commands** (imperative): SubmitOrder, ProcessPayment\n**Read Models** (noun): OrderSummary, CustomerDashboard\n\n## Output\n\nCreate a markdown document covering all 9 steps with:\n- Events list with payloads\n- Commands with triggers and outputs\n- Read models with schemas\n- Vertical slices with acceptance criteria`;\n}\n\ninterface AgentResult {\n success: boolean;\n document?: string;\n events?: WorkflowEvent[];\n commands?: WorkflowCommand[];\n readModels?: WorkflowReadModel[];\n slices?: VerticalSlice[];\n error?: string;\n}\n\nasync function spawnWorkflowAgent(\n ctx: PluginInput,\n config: SdlcConfig,\n prompt: string,\n workflowName: string\n): Promise<AgentResult> {\n try {\n // Create session for workflow design agent\n const createResult = await ctx.client.session.create({\n body: {\n title: `Event Modeling - Workflow Design: ${workflowName}`,\n },\n });\n\n if (!createResult.data?.id) {\n return { success: false, error: \"Failed to create workflow design agent session\" };\n }\n\n const sessionId = createResult.data.id;\n\n // Register session as file_updater since it creates documentation files\n registerSubagentSession(sessionId, \"file_updater\");\n\n try {\n // Send prompt to agent - use Oracle model for design expertise\n const modelConfig = parseModelConfig(\n config.models.oracle || \"anthropic/claude-sonnet-4-20250514\"\n );\n\n const promptResult = await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: modelConfig,\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n if (!promptResult.data) {\n return { success: false, error: \"No response from workflow design agent\" };\n }\n\n // Get the response\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n return { success: false, error: \"No messages in workflow design agent session\" };\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const content = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n // Parse the response to extract structured data\n const parsed = parseWorkflowAgentResponse(content);\n\n return {\n success: true,\n document: content,\n ...parsed,\n };\n } finally {\n // Always unregister the session when done\n unregisterSubagentSession(sessionId);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return { success: false, error: `Workflow design agent spawn failed: ${message}` };\n }\n}\n\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"anthropic\", modelID: modelID || modelString };\n}\n\nfunction parseWorkflowAgentResponse(content: string): Partial<AgentResult> {\n const events: WorkflowEvent[] = [];\n const commands: WorkflowCommand[] = [];\n const readModels: WorkflowReadModel[] = [];\n const slices: VerticalSlice[] = [];\n\n // Extract events - look for PascalCase words followed by \"event\" context or in Events section\n const eventSection = content.match(\n /##?\\s*Events?\\s*\\(?\\s*Orange\\s*\\)?[^\\n]*\\n([\\s\\S]*?)(?=\\n##[^#]|$)/i\n );\n if (eventSection) {\n const eventMatches = eventSection[1].matchAll(\n /[-*]\\s*\\*?\\*?([A-Z][a-zA-Z]+(?:ed|en|ted|red|sed))\\*?\\*?/g\n );\n for (const match of eventMatches) {\n events.push({ name: match[1] });\n }\n }\n\n // Extract commands - look for imperative PascalCase in Commands section\n const commandSection = content.match(\n /##?\\s*Commands?\\s*\\(?\\s*Blue\\s*\\)?[^\\n]*\\n([\\s\\S]*?)(?=\\n##[^#]|$)/i\n );\n if (commandSection) {\n const commandMatches = commandSection[1].matchAll(/###?\\s*([A-Z][a-zA-Z]+)/g);\n for (const match of commandMatches) {\n const name = match[1];\n // Skip if it looks like an event (past tense)\n if (!name.match(/ed$|en$/)) {\n commands.push({ name });\n }\n }\n }\n\n // Extract read models - look for View/Projection names\n const readModelSection = content.match(\n /##?\\s*Read Models?\\s*\\(?\\s*Green\\s*\\)?[^\\n]*\\n([\\s\\S]*?)(?=\\n##[^#]|$)/i\n );\n if (readModelSection) {\n const modelMatches = readModelSection[1].matchAll(\n /###?\\s*([A-Z][a-zA-Z]+(?:View|Summary|Dashboard|Status|List)?)/g\n );\n for (const match of modelMatches) {\n readModels.push({ name: match[1] });\n }\n }\n\n // Extract vertical slices\n const sliceSection = content.match(/##?\\s*Vertical Slices?\\s*[^\\n]*\\n([\\s\\S]*?)(?=\\n##[^#]|$)/i);\n if (sliceSection) {\n const sliceMatches = sliceSection[1].matchAll(\n /###?\\s*(?:Slice\\s*\\d+:?\\s*)?([A-Z][a-zA-Z\\s]+?)(?:\\n|$)/g\n );\n for (const match of sliceMatches) {\n const name = match[1].trim();\n if (name && !name.includes(\"Commands\") && !name.includes(\"Events\")) {\n slices.push({ name });\n }\n }\n }\n\n return {\n events: events.length > 0 ? events : undefined,\n commands: commands.length > 0 ? commands : undefined,\n readModels: readModels.length > 0 ? readModels : undefined,\n slices: slices.length > 0 ? slices : undefined,\n };\n}\n\n// Export for testing\nexport const _testExports = {\n executeWorkflowDesign,\n loadWorkflowPrompt,\n parseWorkflowAgentResponse,\n};\n","/**\n * sdlc_discover_domain Tool\n *\n * Domain discovery for Event Modeling\n *\n * Identifies actors, goals, major processes and creates\n * the domain overview document.\n */\n\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport { registerSubagentSession, unregisterSubagentSession } from \"../hooks/orchestrator-guard.js\";\n\n/**\n * Arguments for sdlc_discover_domain tool\n */\nexport interface DiscoverDomainArgs {\n domainName: string;\n context?: string;\n}\n\n/**\n * Result from sdlc_discover_domain tool\n */\nexport interface DiscoverDomainResult {\n success: boolean;\n outputPath?: string;\n actors?: string[];\n processes?: string[];\n boundaries?: {\n core: string[];\n supporting: string[];\n external: string[];\n };\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Create the sdlc_discover_domain tool\n */\nexport function createDiscoverDomainTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Domain discovery for Event Modeling.\n\nThis tool spawns an agent that guides domain discovery by:\n- Identifying actors (human, system, time-based)\n- Understanding goals for each actor\n- Mapping major business processes\n- Finding domain boundaries (core, supporting, external)\n\nCreates: docs/event_model/domain/overview.md\n\nUse this BEFORE designing workflows. Discovery captures the \"what\" and \"who\"\nwithout implementation details.\n\nReturns:\n- outputPath: Path to the generated overview document\n- actors: List of identified actors\n- processes: List of major processes\n- boundaries: Core, supporting, and external domain boundaries`,\n\n args: {\n domainName: tool.schema\n .string()\n .describe(\n \"Name of the domain being modeled (e.g., 'Order Management', 'User Authentication')\"\n ),\n context: tool.schema\n .string()\n .optional()\n .describe(\"Additional context about the domain (PRD excerpt, user research, etc.)\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executeDiscovery(ctx, config, args as DiscoverDomainArgs);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function executeDiscovery(\n ctx: PluginInput,\n config: SdlcConfig,\n args: DiscoverDomainArgs\n): Promise<DiscoverDomainResult> {\n // Validate inputs\n if (!args.domainName) {\n return {\n success: false,\n error: \"domainName is required\",\n suggestion: \"Provide a name for the domain being modeled\",\n };\n }\n\n // Load discovery prompt\n const discoveryPrompt = await loadDiscoveryPrompt(ctx.directory, args);\n\n // Spawn discovery agent\n const agentResult = await spawnDiscoveryAgent(ctx, config, discoveryPrompt, args.domainName);\n\n if (!agentResult.success) {\n return {\n success: false,\n error: agentResult.error || \"Discovery agent failed\",\n suggestion: \"Check agent configuration and try again\",\n };\n }\n\n // Write the discovery document\n const outputPath = join(ctx.directory, \"docs\", \"event_model\", \"domain\", \"overview.md\");\n\n try {\n await mkdir(dirname(outputPath), { recursive: true });\n await writeFile(outputPath, agentResult.document || \"\", \"utf-8\");\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n success: false,\n error: `Failed to write discovery document: ${message}`,\n suggestion: \"Check file permissions and try again\",\n };\n }\n\n return {\n success: true,\n outputPath,\n actors: agentResult.actors,\n processes: agentResult.processes,\n boundaries: agentResult.boundaries,\n };\n}\n\nasync function loadDiscoveryPrompt(projectDir: string, args: DiscoverDomainArgs): Promise<string> {\n // Try to load custom prompt from project\n const customPromptPath = join(projectDir, \"prompts\", \"event-modeling\", \"discovery.md\");\n let basePrompt: string;\n\n try {\n basePrompt = await readFile(customPromptPath, \"utf-8\");\n } catch {\n // Use built-in prompt\n basePrompt = getBuiltInDiscoveryPrompt();\n }\n\n // Add context-specific instructions\n const contextInstructions = `\n## Discovery Task\n\n**Domain Name:** ${args.domainName}\n\n${args.context ? `**Additional Context:**\\n${args.context}` : \"\"}\n\n**Instructions:**\n1. Guide the discovery process for the \"${args.domainName}\" domain\n2. Identify all actors, their goals, and interactions\n3. Map out the major business processes\n4. Define clear domain boundaries\n5. Create a glossary of key terms\n6. Output the complete domain overview document\n\n**Output:**\nCreate a comprehensive domain overview following the template structure.\nThe document will be saved to: docs/event_model/domain/overview.md\n`;\n\n return `${basePrompt}\\n\\n${contextInstructions}`;\n}\n\nfunction getBuiltInDiscoveryPrompt(): string {\n return `# Domain Discovery Agent\n\nYou are a domain discovery expert for Event Modeling.\n\n## Your Goal\n\nGuide domain discovery by identifying:\n- **Actors**: Who interacts with the system?\n- **Goals**: What do they want to achieve?\n- **Processes**: What major workflows exist?\n- **Boundaries**: What's in scope vs. out of scope?\n\n## Output Format\n\nCreate a markdown document with:\n\n1. **Summary** - Brief domain description\n2. **Actors** - List with type, goals, interactions\n3. **Major Processes** - List with triggers, actors, outputs\n4. **Domain Boundaries** - Core, supporting, external\n5. **Glossary** - Key business terms\n6. **Open Questions** - Items needing clarification\n\n## Guidelines\n\n- Use business language, not technical jargon\n- Ask clarifying questions for ambiguous terms\n- Capture the \"why\" behind each element\n- Note assumptions for validation\n- Keep scope focused`;\n}\n\ninterface AgentResult {\n success: boolean;\n document?: string;\n actors?: string[];\n processes?: string[];\n boundaries?: {\n core: string[];\n supporting: string[];\n external: string[];\n };\n error?: string;\n}\n\nasync function spawnDiscoveryAgent(\n ctx: PluginInput,\n config: SdlcConfig,\n prompt: string,\n domainName: string\n): Promise<AgentResult> {\n try {\n // Create session for discovery agent\n const createResult = await ctx.client.session.create({\n body: {\n title: `Event Modeling - Domain Discovery: ${domainName}`,\n },\n });\n\n if (!createResult.data?.id) {\n return { success: false, error: \"Failed to create discovery agent session\" };\n }\n\n const sessionId = createResult.data.id;\n\n // Register session as file_updater since it creates documentation files\n registerSubagentSession(sessionId, \"file_updater\");\n\n try {\n // Send prompt to agent - use Oracle model for domain expertise\n const modelConfig = parseModelConfig(\n config.models.oracle || \"anthropic/claude-sonnet-4-20250514\"\n );\n\n const promptResult = await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: modelConfig,\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n if (!promptResult.data) {\n return { success: false, error: \"No response from discovery agent\" };\n }\n\n // Get the response\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n return { success: false, error: \"No messages in discovery agent session\" };\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const content = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n // Parse the response to extract structured data\n const parsed = parseDiscoveryAgentResponse(content);\n\n return {\n success: true,\n document: content,\n ...parsed,\n };\n } finally {\n // Always unregister the session when done\n unregisterSubagentSession(sessionId);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return { success: false, error: `Discovery agent spawn failed: ${message}` };\n }\n}\n\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"anthropic\", modelID: modelID || modelString };\n}\n\nfunction parseDiscoveryAgentResponse(content: string): Partial<AgentResult> {\n const actors: string[] = [];\n const processes: string[] = [];\n const boundaries = {\n core: [] as string[],\n supporting: [] as string[],\n external: [] as string[],\n };\n\n // Extract actors (look for ### Actor: or ## Actors section)\n const actorMatches = content.matchAll(/###?\\s*(?:Actor:?\\s*)?([A-Z][a-zA-Z\\s]+?)(?:\\n|$)/g);\n for (const match of actorMatches) {\n const actorName = match[1].trim();\n if (actorName && !actorName.includes(\"Type\") && !actorName.includes(\"Goals\")) {\n actors.push(actorName);\n }\n }\n\n // Extract processes (look for ### Process: or ## Major Processes section)\n const processMatches = content.matchAll(/###?\\s*(?:Process:?\\s*)?([A-Z][a-zA-Z\\s]+?)(?:\\n|$)/g);\n for (const match of processMatches) {\n const processName = match[1].trim();\n if (\n processName &&\n !processName.includes(\"Trigger\") &&\n !processName.includes(\"Actor\") &&\n !processName.includes(\"Output\")\n ) {\n processes.push(processName);\n }\n }\n\n // Extract boundaries\n const coreSection = content.match(\n /###?\\s*(?:Core Domain|In Scope)[^\\n]*\\n([\\s\\S]*?)(?=###?|\\n\\n##|$)/i\n );\n if (coreSection) {\n const items = coreSection[1].match(/[-*]\\s*([^\\n]+)/g);\n if (items) {\n boundaries.core = items.map((item) => item.replace(/^[-*]\\s*/, \"\").trim());\n }\n }\n\n const supportingSection = content.match(\n /###?\\s*Supporting Domain[^\\n]*\\n([\\s\\S]*?)(?=###?|\\n\\n##|$)/i\n );\n if (supportingSection) {\n const items = supportingSection[1].match(/[-*]\\s*([^\\n]+)/g);\n if (items) {\n boundaries.supporting = items.map((item) => item.replace(/^[-*]\\s*/, \"\").trim());\n }\n }\n\n const externalSection = content.match(\n /###?\\s*(?:External|Out of Scope|Generic)[^\\n]*\\n([\\s\\S]*?)(?=###?|\\n\\n##|$)/i\n );\n if (externalSection) {\n const items = externalSection[1].match(/[-*]\\s*([^\\n]+)/g);\n if (items) {\n boundaries.external = items.map((item) => item.replace(/^[-*]\\s*/, \"\").trim());\n }\n }\n\n return {\n actors: actors.length > 0 ? actors : undefined,\n processes: processes.length > 0 ? processes : undefined,\n boundaries:\n boundaries.core.length > 0 ||\n boundaries.supporting.length > 0 ||\n boundaries.external.length > 0\n ? boundaries\n : undefined,\n };\n}\n\n// Export for testing\nexport const _testExports = {\n executeDiscovery,\n loadDiscoveryPrompt,\n parseDiscoveryAgentResponse,\n};\n","/**\n * sdlc_generate_gwt Tool\n *\n * Generate Given/When/Then scenarios for Event Modeling\n *\n * Creates executable specifications for commands, projections,\n * and automations based on the workflow design.\n */\n\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport { registerSubagentSession, unregisterSubagentSession } from \"../hooks/orchestrator-guard.js\";\n\n/**\n * Arguments for sdlc_generate_gwt tool\n */\nexport interface GenerateGwtArgs {\n workflowName: string;\n sliceName?: string;\n workflowPath?: string;\n scenarioTypes?: (\"command\" | \"projection\" | \"automation\")[];\n}\n\n/**\n * A GWT scenario\n */\nexport interface GwtScenario {\n name: string;\n type: \"command\" | \"projection\" | \"automation\";\n tags?: string[];\n given: string[];\n when: string;\n then: string[];\n}\n\n/**\n * Result from sdlc_generate_gwt tool\n */\nexport interface GenerateGwtResult {\n success: boolean;\n outputPath?: string;\n scenarios?: GwtScenario[];\n commandScenarios?: number;\n projectionScenarios?: number;\n automationScenarios?: number;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Create the sdlc_generate_gwt tool\n */\nexport function createGenerateGwtTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Generate Given/When/Then scenarios for Event Modeling.\n\nThis tool spawns an agent that creates GWT scenarios based on:\n- **Command scenarios**: Given=prior events, When=command, Then=resulting events OR error\n- **Projection scenarios**: Given=read model state, When=event, Then=updated state\n- **Automation scenarios**: Given=policy active, When=trigger event, Then=command issued\n\nCreates: docs/event_model/workflows/{workflow}/scenarios/{slice}.feature\n\nUse AFTER workflow design. GWT scenarios become acceptance criteria for GitHub issues.\n\nReturns:\n- outputPath: Path to the generated feature file\n- scenarios: List of generated scenarios\n- commandScenarios: Count of command scenarios\n- projectionScenarios: Count of projection scenarios\n- automationScenarios: Count of automation scenarios`,\n\n args: {\n workflowName: tool.schema.string().describe(\"Name of the workflow to generate scenarios for\"),\n sliceName: tool.schema\n .string()\n .optional()\n .describe(\"Specific slice to generate scenarios for. Omit to generate for all slices.\"),\n workflowPath: tool.schema\n .string()\n .optional()\n .describe(\n \"Path to workflow document (default: docs/event_model/workflows/{name}/overview.md)\"\n ),\n scenarioTypes: tool.schema\n .array(tool.schema.enum([\"command\", \"projection\", \"automation\"]))\n .optional()\n .describe(\"Types of scenarios to generate. Omit to generate all types.\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executeGwtGeneration(ctx, config, args as GenerateGwtArgs);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function executeGwtGeneration(\n ctx: PluginInput,\n config: SdlcConfig,\n args: GenerateGwtArgs\n): Promise<GenerateGwtResult> {\n // Validate inputs\n if (!args.workflowName) {\n return {\n success: false,\n error: \"workflowName is required\",\n suggestion: \"Provide the name of the workflow to generate scenarios for\",\n };\n }\n\n // Normalize names for file paths\n const normalizedWorkflow = args.workflowName\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n\n const normalizedSlice = args.sliceName\n ? args.sliceName\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\")\n : \"all-slices\";\n\n // Load workflow context\n const workflowPath =\n args.workflowPath ||\n join(ctx.directory, \"docs\", \"event_model\", \"workflows\", normalizedWorkflow, \"overview.md\");\n\n let workflowContext = \"\";\n try {\n workflowContext = await readFile(workflowPath, \"utf-8\");\n } catch {\n return {\n success: false,\n error: `Workflow document not found: ${workflowPath}`,\n suggestion: \"Run sdlc_design_workflow first to create the workflow document\",\n };\n }\n\n // Load GWT generation prompt\n const gwtPrompt = await loadGwtPrompt(ctx.directory, args, workflowContext);\n\n // Spawn GWT generation agent\n const agentResult = await spawnGwtAgent(ctx, config, gwtPrompt, args.workflowName);\n\n if (!agentResult.success) {\n return {\n success: false,\n error: agentResult.error || \"GWT generation agent failed\",\n suggestion: \"Check agent configuration and try again\",\n };\n }\n\n // Write the feature file\n const outputPath = join(\n ctx.directory,\n \"docs\",\n \"event_model\",\n \"workflows\",\n normalizedWorkflow,\n \"scenarios\",\n `${normalizedSlice}.feature`\n );\n\n try {\n await mkdir(dirname(outputPath), { recursive: true });\n await writeFile(outputPath, agentResult.document || \"\", \"utf-8\");\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n success: false,\n error: `Failed to write feature file: ${message}`,\n suggestion: \"Check file permissions and try again\",\n };\n }\n\n // Count scenarios by type\n const commandScenarios = agentResult.scenarios?.filter((s) => s.type === \"command\").length || 0;\n const projectionScenarios =\n agentResult.scenarios?.filter((s) => s.type === \"projection\").length || 0;\n const automationScenarios =\n agentResult.scenarios?.filter((s) => s.type === \"automation\").length || 0;\n\n return {\n success: true,\n outputPath,\n scenarios: agentResult.scenarios,\n commandScenarios,\n projectionScenarios,\n automationScenarios,\n };\n}\n\nasync function loadGwtPrompt(\n projectDir: string,\n args: GenerateGwtArgs,\n workflowContext: string\n): Promise<string> {\n // Try to load custom prompt from project\n const customPromptPath = join(projectDir, \"prompts\", \"event-modeling\", \"gwt-generation.md\");\n let basePrompt: string;\n\n try {\n basePrompt = await readFile(customPromptPath, \"utf-8\");\n } catch {\n // Use built-in prompt\n basePrompt = getBuiltInGwtPrompt();\n }\n\n // Determine which scenario types to generate\n const scenarioTypes = args.scenarioTypes || [\"command\", \"projection\", \"automation\"];\n const typeInstructions = scenarioTypes.map((t) => `- ${t} scenarios`).join(\"\\n\");\n\n const contextInstructions = `\n## GWT Generation Task\n\n**Workflow:** ${args.workflowName}\n${args.sliceName ? `**Slice:** ${args.sliceName}` : \"**Scope:** All slices\"}\n\n**Generate these scenario types:**\n${typeInstructions}\n\n**Workflow Context:**\n\\`\\`\\`markdown\n${workflowContext}\n\\`\\`\\`\n\n**Instructions:**\n1. Analyze the workflow document for commands, events, read models, and automations\n2. Generate GWT scenarios following the patterns:\n - Command: Given=prior events, When=command, Then=resulting events OR error\n - Projection: Given=read model state, When=event, Then=updated state\n - Automation: Given=policy active, When=trigger event, Then=command issued\n3. Include happy path AND validation/error scenarios for commands\n4. Use business language, not technical jargon\n5. Include concrete example values, not placeholders\n\n**Output:**\nCreate a Gherkin feature file with all scenarios.\nUse tags like @command, @projection, @automation, @happy-path, @validation\n`;\n\n return `${basePrompt}\\n\\n${contextInstructions}`;\n}\n\nfunction getBuiltInGwtPrompt(): string {\n return `# GWT Generation Agent\n\nYou are a GWT scenario expert for Event Modeling.\n\n## Scenario Patterns\n\n### Command Scenarios\n\\`\\`\\`gherkin\n@command @happy-path\nScenario: Successfully {action}\n Given {prior events that set up state}\n When {Command} is issued with:\n | field | value |\n Then {SuccessEvent} should be emitted with:\n | field | expected |\n\n@command @validation\nScenario: Reject {command} when {rule violated}\n Given {state that violates rule}\n When {Command} is issued\n Then {ValidationFailed} should be emitted with:\n | reason | {specific violation} |\n\\`\\`\\`\n\n### Projection/View Scenarios\n\\`\\`\\`gherkin\n@projection\nScenario: Update {ReadModel} when {Event}\n Given {ReadModel} contains:\n | field | old_value |\n When {Event} is applied\n Then {ReadModel} should contain:\n | field | new_value |\n\\`\\`\\`\n\n### Automation Scenarios\n\nAutomations are like views but triggered externally rather than by user interaction.\n\n**Trigger Types:**\n- **Timer/Scheduled**: Periodic processing (e.g., daily batch, every 5 minutes)\n- **Event-Triggered**: Reactive to message bus events\n- **Inbox-Based**: Polls a projection for pending work items\n\n\\`\\`\\`gherkin\n@automation @timer-triggered\nScenario: Process pending {items} on scheduled tick\n Given {Automation} is active\n And {InboxProjection} contains pending items:\n | id | status | createdAt |\n | item-1 | pending | 2024-01-01 |\n When the scheduler triggers at {time}\n Then {ProcessItem} command should be issued for \"item-1\"\n\n@automation @event-triggered\nScenario: React to {Event} from message bus\n Given {Automation} is active\n And {precondition state}\n When {ExternalEvent} is received from {source}\n Then {Command} should be issued with:\n | field | derived_value |\n\n@automation @inbox-based\nScenario: Process items from {Inbox} projection\n Given {Automation} is active\n And {InboxProjection} contains:\n | id | priority | payload |\n | work-1 | high | {data} |\n When the automation polls the inbox\n Then {ProcessWork} command should be issued for \"work-1\"\n And the inbox item should be marked as processing\n\n@automation @skip-condition\nScenario: Skip processing when {condition}\n Given {Automation} is active\n And {state that prevents processing}\n When {trigger occurs}\n Then no command should be issued\n\\`\\`\\`\n\n## Guidelines\n\n- One behavior per scenario\n- Use concrete values, not placeholders\n- Cover happy path + all validation rules\n- Include error scenarios\n- Tag scenarios for organization\n- For automations: cover trigger, skip conditions, and error handling`;\n}\n\ninterface AgentResult {\n success: boolean;\n document?: string;\n scenarios?: GwtScenario[];\n error?: string;\n}\n\nasync function spawnGwtAgent(\n ctx: PluginInput,\n config: SdlcConfig,\n prompt: string,\n workflowName: string\n): Promise<AgentResult> {\n try {\n // Create session for GWT generation agent\n const createResult = await ctx.client.session.create({\n body: {\n title: `Event Modeling - GWT Generation: ${workflowName}`,\n },\n });\n\n if (!createResult.data?.id) {\n return { success: false, error: \"Failed to create GWT generation agent session\" };\n }\n\n const sessionId = createResult.data.id;\n\n // Register session as file_updater since it creates documentation files\n registerSubagentSession(sessionId, \"file_updater\");\n\n try {\n // Send prompt to agent\n const modelConfig = parseModelConfig(\n config.models.oracle || \"anthropic/claude-sonnet-4-20250514\"\n );\n\n const promptResult = await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: modelConfig,\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n if (!promptResult.data) {\n return { success: false, error: \"No response from GWT generation agent\" };\n }\n\n // Get the response\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n return { success: false, error: \"No messages in GWT generation agent session\" };\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const content = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n // Parse the response to extract scenarios\n const scenarios = parseGwtScenarios(content);\n\n return {\n success: true,\n document: content,\n scenarios,\n };\n } finally {\n // Always unregister the session when done\n unregisterSubagentSession(sessionId);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return { success: false, error: `GWT generation agent spawn failed: ${message}` };\n }\n}\n\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"anthropic\", modelID: modelID || modelString };\n}\n\nfunction parseGwtScenarios(content: string): GwtScenario[] {\n const scenarios: GwtScenario[] = [];\n\n // Match Gherkin scenarios\n const scenarioMatches = content.matchAll(\n /(@[a-z-]+(?:\\s+@[a-z-]+)*\\s*)?\\s*Scenario:\\s*(.+?)\\n([\\s\\S]*?)(?=(?:@[a-z-]+\\s*)?\\s*Scenario:|$)/gi\n );\n\n for (const match of scenarioMatches) {\n const tagsStr = match[1]?.trim() || \"\";\n const name = match[2].trim();\n const body = match[3];\n\n // Extract tags\n const tagMatches = tagsStr.match(/@[a-z-]+/g);\n const tags: string[] = tagMatches ? [...tagMatches] : [];\n\n // Determine type from tags\n let type: \"command\" | \"projection\" | \"automation\" = \"command\";\n if (tags.includes(\"@projection\")) type = \"projection\";\n else if (tags.includes(\"@automation\")) type = \"automation\";\n\n // Extract Given clauses\n const givenMatches = body.matchAll(/Given\\s+(.+?)(?=\\n\\s*(?:And|When|Then)|$)/gi);\n const given = [...givenMatches].map((m) => m[1].trim());\n\n // Also get And clauses after Given\n const andAfterGivenMatches = body.matchAll(\n /Given[\\s\\S]*?(And\\s+(.+?)(?=\\n\\s*(?:And|When|Then)|$))/gi\n );\n for (const andMatch of andAfterGivenMatches) {\n given.push(andMatch[2].trim());\n }\n\n // Extract When clause\n const whenMatch = body.match(/When\\s+(.+?)(?=\\n\\s*(?:And|Then)|$)/i);\n const when = whenMatch ? whenMatch[1].trim() : \"\";\n\n // Extract Then clauses\n const thenMatches = body.matchAll(/Then\\s+(.+?)(?=\\n\\s*(?:And|$)|$)/gi);\n const then = [...thenMatches].map((m) => m[1].trim());\n\n // Also get And clauses after Then\n const andAfterThenMatches = body.matchAll(/Then[\\s\\S]*?(And\\s+(.+?)(?=\\n\\s*(?:And|$)|$))/gi);\n for (const andMatch of andAfterThenMatches) {\n then.push(andMatch[2].trim());\n }\n\n if (name && when) {\n scenarios.push({\n name,\n type,\n tags,\n given,\n when,\n then,\n });\n }\n }\n\n return scenarios;\n}\n\n// Export for testing\nexport const _testExports = {\n executeGwtGeneration,\n loadGwtPrompt,\n parseGwtScenarios,\n};\n","/**\n * sdlc_validate_model Tool\n *\n * Validate Event Model for completeness and consistency\n *\n * Checks event naming conventions, information completeness,\n * and ensures no implementation details during modeling.\n */\n\nimport { readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\n\n/**\n * Arguments for sdlc_validate_model tool\n */\nexport interface ValidateModelArgs {\n scope?: \"all\" | \"domain\" | \"workflow\" | \"scenarios\";\n workflowName?: string;\n fix?: boolean;\n}\n\n/**\n * A validation issue found in the model\n */\nexport interface ValidationIssue {\n severity: \"error\" | \"warning\" | \"info\";\n category: \"naming\" | \"completeness\" | \"consistency\" | \"implementation\";\n location: string;\n message: string;\n suggestion?: string;\n}\n\n/**\n * Result from sdlc_validate_model tool\n */\nexport interface ValidateModelResult {\n success: boolean;\n valid: boolean;\n issues: ValidationIssue[];\n summary: {\n errors: number;\n warnings: number;\n infos: number;\n };\n filesChecked: string[];\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Create the sdlc_validate_model tool\n */\nexport function createValidateModelTool(ctx: PluginInput, _config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Validate Event Model for completeness and consistency.\n\nThis tool checks the event model documents for:\n- **Naming conventions**: Events in past tense, commands imperative\n- **Information completeness**: All required sections present\n- **Consistency**: Events referenced in workflows exist in domain\n- **No implementation details**: No database schemas, API endpoints, etc.\n\nChecks:\n- docs/event_model/domain/overview.md\n- docs/event_model/workflows/*/overview.md\n- docs/event_model/workflows/*/scenarios/*.feature\n\nReturns:\n- valid: Boolean indicating if model passes validation\n- issues: List of validation issues with severity and suggestions\n- summary: Count of errors, warnings, and infos\n- filesChecked: List of files that were validated`,\n\n args: {\n scope: tool.schema\n .enum([\"all\", \"domain\", \"workflow\", \"scenarios\"])\n .optional()\n .describe(\n \"What to validate: all (default), domain only, workflows only, or scenarios only\"\n ),\n workflowName: tool.schema\n .string()\n .optional()\n .describe(\"Specific workflow to validate. Omit to validate all.\"),\n fix: tool.schema\n .boolean()\n .optional()\n .describe(\"Attempt to auto-fix simple issues (like naming). Default: false\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executeValidation(ctx, args as ValidateModelArgs);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function executeValidation(\n ctx: PluginInput,\n args: ValidateModelArgs\n): Promise<ValidateModelResult> {\n const issues: ValidationIssue[] = [];\n const filesChecked: string[] = [];\n const scope = args.scope || \"all\";\n\n const eventModelDir = join(ctx.directory, \"docs\", \"event_model\");\n\n // Validate domain overview\n if (scope === \"all\" || scope === \"domain\") {\n const domainPath = join(eventModelDir, \"domain\", \"overview.md\");\n try {\n const content = await readFile(domainPath, \"utf-8\");\n filesChecked.push(domainPath);\n issues.push(...validateDomainOverview(content, domainPath));\n } catch {\n issues.push({\n severity: \"error\",\n category: \"completeness\",\n location: domainPath,\n message: \"Domain overview not found\",\n suggestion: \"Run sdlc_discover_domain to create the domain overview\",\n });\n }\n }\n\n // Validate workflows\n if (scope === \"all\" || scope === \"workflow\" || scope === \"scenarios\") {\n const workflowsDir = join(eventModelDir, \"workflows\");\n let workflowDirs: string[] = [];\n\n try {\n const entries = await readdir(workflowsDir, { withFileTypes: true });\n workflowDirs = entries.filter((e) => e.isDirectory()).map((e) => e.name);\n } catch {\n // Only warn about missing workflows if we're actually trying to check them\n issues.push({\n severity: \"warning\",\n category: \"completeness\",\n location: workflowsDir,\n message: \"No workflows directory found\",\n suggestion: \"Run sdlc_design_workflow to create workflow designs\",\n });\n }\n\n // Filter to specific workflow if requested\n if (args.workflowName) {\n const normalized = args.workflowName\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n workflowDirs = workflowDirs.filter((d) => d === normalized);\n }\n\n for (const workflowDir of workflowDirs) {\n const workflowPath = join(workflowsDir, workflowDir, \"overview.md\");\n\n // Validate workflow overview\n if (scope === \"all\" || scope === \"workflow\") {\n try {\n const content = await readFile(workflowPath, \"utf-8\");\n filesChecked.push(workflowPath);\n issues.push(...validateWorkflowOverview(content, workflowPath));\n } catch {\n issues.push({\n severity: \"error\",\n category: \"completeness\",\n location: workflowPath,\n message: `Workflow overview not found for ${workflowDir}`,\n suggestion: \"Run sdlc_design_workflow to create the workflow design\",\n });\n }\n }\n\n // Validate scenarios\n if (scope === \"all\" || scope === \"scenarios\") {\n const scenariosDir = join(workflowsDir, workflowDir, \"scenarios\");\n try {\n const scenarioFiles = await readdir(scenariosDir);\n for (const scenarioFile of scenarioFiles) {\n if (scenarioFile.endsWith(\".feature\")) {\n const scenarioPath = join(scenariosDir, scenarioFile);\n const content = await readFile(scenarioPath, \"utf-8\");\n filesChecked.push(scenarioPath);\n issues.push(...validateScenarios(content, scenarioPath));\n }\n }\n } catch {\n // No scenarios directory - not an error, might not be generated yet\n issues.push({\n severity: \"info\",\n category: \"completeness\",\n location: scenariosDir,\n message: `No scenarios found for ${workflowDir}`,\n suggestion: \"Run sdlc_generate_gwt to create GWT scenarios\",\n });\n }\n }\n }\n }\n\n // Calculate summary\n const summary = {\n errors: issues.filter((i) => i.severity === \"error\").length,\n warnings: issues.filter((i) => i.severity === \"warning\").length,\n infos: issues.filter((i) => i.severity === \"info\").length,\n };\n\n return {\n success: true,\n valid: summary.errors === 0,\n issues,\n summary,\n filesChecked,\n };\n}\n\nfunction validateDomainOverview(content: string, path: string): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n\n // Check for required sections\n const requiredSections = [\"Summary\", \"Actors\", \"Processes\", \"Boundaries\", \"Glossary\"];\n\n for (const section of requiredSections) {\n if (!content.match(new RegExp(`##?\\\\s*${section}`, \"i\"))) {\n issues.push({\n severity: \"warning\",\n category: \"completeness\",\n location: path,\n message: `Missing section: ${section}`,\n suggestion: `Add a ## ${section} section to the domain overview`,\n });\n }\n }\n\n // Check for implementation details\n const implementationPatterns = [\n { pattern: /\\b(database|sql|table|column|schema)\\b/i, term: \"database terminology\" },\n { pattern: /\\b(api|endpoint|rest|graphql|http)\\b/i, term: \"API terminology\" },\n { pattern: /\\b(class|interface|function|method)\\b/i, term: \"code terminology\" },\n { pattern: /\\b(json|xml|yaml)\\b/i, term: \"data format terminology\" },\n ];\n\n for (const { pattern, term } of implementationPatterns) {\n if (pattern.test(content)) {\n issues.push({\n severity: \"warning\",\n category: \"implementation\",\n location: path,\n message: `Domain overview contains ${term}`,\n suggestion: \"Use business language instead of technical terminology\",\n });\n }\n }\n\n return issues;\n}\n\nfunction validateWorkflowOverview(content: string, path: string): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n\n // Check for required sections\n const requiredSections = [\"Events\", \"Commands\", \"Read Models\", \"Vertical Slices\"];\n\n for (const section of requiredSections) {\n if (!content.match(new RegExp(`##?\\\\s*${section}`, \"i\"))) {\n issues.push({\n severity: \"warning\",\n category: \"completeness\",\n location: path,\n message: `Missing section: ${section}`,\n suggestion: `Add a ## ${section} section to the workflow`,\n });\n }\n }\n\n // Check event naming (should be past tense)\n const eventSection = content.match(/##?\\s*Events?[^\\n]*\\n([\\s\\S]*?)(?=\\n##[^#]|$)/i);\n if (eventSection) {\n const events = eventSection[1].match(/\\b([A-Z][a-zA-Z]+)\\b/g) || [];\n for (const event of events) {\n // Check if it looks like a command (imperative) instead of an event (past tense)\n if (event.match(/^(Create|Update|Delete|Add|Remove|Set|Get|Send|Process|Handle|Submit)/)) {\n issues.push({\n severity: \"error\",\n category: \"naming\",\n location: path,\n message: `Event \"${event}\" uses imperative naming (command-style)`,\n suggestion: `Use past tense: ${suggestPastTense(event)}`,\n });\n }\n }\n }\n\n // Check command naming (should be imperative)\n const commandSection = content.match(/##?\\s*Commands?[^\\n]*\\n([\\s\\S]*?)(?=\\n##|$)/i);\n if (commandSection) {\n const commands = commandSection[1].match(/###?\\s*([A-Z][a-zA-Z]+)/g) || [];\n for (const cmdMatch of commands) {\n const command = cmdMatch.replace(/^###?\\s*/, \"\");\n // Check if it looks like an event (past tense) instead of a command\n if (command.match(/ed$|en$/)) {\n issues.push({\n severity: \"error\",\n category: \"naming\",\n location: path,\n message: `Command \"${command}\" uses past tense (event-style)`,\n suggestion: `Use imperative: ${suggestImperative(command)}`,\n });\n }\n }\n }\n\n // Check for implementation details\n const implementationPatterns = [\n { pattern: /\\b(database|sql|table|column|schema)\\b/i, term: \"database terminology\" },\n { pattern: /\\b(endpoint|rest|graphql|http|url)\\b/i, term: \"API terminology\" },\n { pattern: /\\btypescript|javascript|python|java\\b/i, term: \"language references\" },\n ];\n\n for (const { pattern, term } of implementationPatterns) {\n if (pattern.test(content)) {\n issues.push({\n severity: \"warning\",\n category: \"implementation\",\n location: path,\n message: `Workflow contains ${term}`,\n suggestion: \"Keep workflow design implementation-agnostic\",\n });\n }\n }\n\n return issues;\n}\n\nfunction validateScenarios(content: string, path: string): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n\n // Check for Feature header\n if (!content.match(/^Feature:/m)) {\n issues.push({\n severity: \"error\",\n category: \"completeness\",\n location: path,\n message: \"Missing Feature header\",\n suggestion: \"Add a Feature: header at the start of the file\",\n });\n }\n\n // Check for at least one scenario\n if (!content.match(/Scenario:/i)) {\n issues.push({\n severity: \"error\",\n category: \"completeness\",\n location: path,\n message: \"No scenarios defined\",\n suggestion: \"Add at least one Scenario: block\",\n });\n }\n\n // Check that scenarios have Given/When/Then\n const scenarioMatches = content.matchAll(/Scenario:\\s*(.+?)\\n([\\s\\S]*?)(?=Scenario:|$)/gi);\n for (const match of scenarioMatches) {\n const scenarioName = match[1].trim();\n const scenarioBody = match[2];\n\n if (!scenarioBody.match(/\\bGiven\\b/i)) {\n issues.push({\n severity: \"warning\",\n category: \"completeness\",\n location: path,\n message: `Scenario \"${scenarioName}\" missing Given clause`,\n suggestion: \"Add a Given clause to set up the initial state\",\n });\n }\n\n if (!scenarioBody.match(/\\bWhen\\b/i)) {\n issues.push({\n severity: \"error\",\n category: \"completeness\",\n location: path,\n message: `Scenario \"${scenarioName}\" missing When clause`,\n suggestion: \"Add a When clause to specify the action\",\n });\n }\n\n if (!scenarioBody.match(/\\bThen\\b/i)) {\n issues.push({\n severity: \"error\",\n category: \"completeness\",\n location: path,\n message: `Scenario \"${scenarioName}\" missing Then clause`,\n suggestion: \"Add a Then clause to specify expected outcomes\",\n });\n }\n }\n\n // Check for placeholder values\n const placeholderPatterns = [\n { pattern: /\\{[a-z_]+\\}/i, term: \"placeholder in braces\" },\n { pattern: /<[a-z_]+>/i, term: \"placeholder in angle brackets\" },\n { pattern: /\\bTODO\\b/i, term: \"TODO marker\" },\n { pattern: /\\bXXX\\b/i, term: \"XXX marker\" },\n ];\n\n for (const { pattern, term } of placeholderPatterns) {\n if (pattern.test(content)) {\n issues.push({\n severity: \"warning\",\n category: \"completeness\",\n location: path,\n message: `Scenarios contain ${term}`,\n suggestion: \"Replace placeholders with concrete example values\",\n });\n }\n }\n\n return issues;\n}\n\nfunction suggestPastTense(command: string): string {\n // Simple suggestions for common patterns\n if (command.startsWith(\"Create\")) return command.replace(\"Create\", \"Created\");\n if (command.startsWith(\"Update\")) return command.replace(\"Update\", \"Updated\");\n if (command.startsWith(\"Delete\")) return command.replace(\"Delete\", \"Deleted\");\n if (command.startsWith(\"Add\")) return command.replace(\"Add\", \"Added\");\n if (command.startsWith(\"Remove\")) return command.replace(\"Remove\", \"Removed\");\n if (command.startsWith(\"Set\")) return command.replace(\"Set\", \"Set\"); // Already past\n if (command.startsWith(\"Send\")) return command.replace(\"Send\", \"Sent\");\n if (command.startsWith(\"Submit\")) return command.replace(\"Submit\", \"Submitted\");\n if (command.startsWith(\"Process\")) return command.replace(\"Process\", \"Processed\");\n return `${command}ed`;\n}\n\nfunction suggestImperative(event: string): string {\n // Simple suggestions for common patterns\n if (event.endsWith(\"Created\")) return event.replace(\"Created\", \"Create\");\n if (event.endsWith(\"Updated\")) return event.replace(\"Updated\", \"Update\");\n if (event.endsWith(\"Deleted\")) return event.replace(\"Deleted\", \"Delete\");\n if (event.endsWith(\"Added\")) return event.replace(\"Added\", \"Add\");\n if (event.endsWith(\"Removed\")) return event.replace(\"Removed\", \"Remove\");\n if (event.endsWith(\"Sent\")) return event.replace(\"Sent\", \"Send\");\n if (event.endsWith(\"Submitted\")) return event.replace(\"Submitted\", \"Submit\");\n if (event.endsWith(\"Processed\")) return event.replace(\"Processed\", \"Process\");\n if (event.endsWith(\"ed\")) return event.slice(0, -2);\n return event;\n}\n\n// Export for testing\nexport const _testExports = {\n executeValidation,\n validateDomainOverview,\n validateWorkflowOverview,\n validateScenarios,\n suggestPastTense,\n suggestImperative,\n};\n","/**\n * sdlc_get_context tool\n *\n * Quick access to current issue context from tracker.\n */\n\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport type { IssueTracker } from \"../tracker/issue-tracker.js\";\n\n/**\n * Create the sdlc_get_context tool\n */\nexport function createGetContextTool(tracker: IssueTracker, _config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Get the current issue context without reloading from GitHub.\n\nReturns the cached context from the issue tracker including:\n- Current issue number and status\n- When the issue was started\n- Recent activity history\n\nUse this for quick status checks. Use sdlc_get_issue to reload full context from GitHub.`,\n\n args: {},\n\n async execute(): Promise<string> {\n const currentIssue = tracker.getCurrentIssue();\n\n if (!currentIssue) {\n return JSON.stringify({\n status: \"no_active_issue\",\n message: \"No issue is currently being tracked. Use sdlc_get_issue to load an issue.\",\n });\n }\n\n const context = await tracker.getCurrentIssueContext();\n const history = tracker.getHistory().slice(-10);\n\n return JSON.stringify(\n {\n currentIssue: {\n number: currentIssue.issueNumber,\n status: currentIssue.status,\n startedAt: currentIssue.startedAt,\n completedAt: currentIssue.completedAt,\n },\n contextSummary: context,\n recentHistory: history,\n sessionId: tracker.getSessionId(),\n },\n null,\n 2\n );\n },\n });\n}\n","import { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { GetIssueResult, SdlcConfig } from \"../../shared/types.js\";\nimport type { IssueTracker } from \"../tracker/issue-tracker.js\";\nimport { fetchIssue, listIssues, moveIssueToStatus } from \"../utils/github-issues.js\";\nimport { parseAcceptanceCriteria } from \"../utils/issue-parser.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\n\nconst log = createPluginLogger(\"get-issue\");\n\nexport function createGetIssueTool(\n ctx: PluginInput,\n tracker: IssueTracker,\n config: SdlcConfig\n): ToolDefinition {\n return tool({\n description: `Load a GitHub issue for implementation.\n\nReturns:\n- Issue title and body\n- Acceptance criteria parsed from issue checkboxes\n- Instructions for next steps\n\nIf issue is in Ready status, it will be moved to In progress automatically.`,\n\n args: {\n issueNumber: tool.schema\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"GitHub issue number. If omitted, loads next Ready issue.\"),\n },\n\n async execute(args): Promise<string> {\n const result = await getIssueContext(ctx, tracker, config, args.issueNumber);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function getIssueContext(\n ctx: PluginInput,\n tracker: IssueTracker,\n config: SdlcConfig,\n issueNumber?: number\n): Promise<GetIssueResult> {\n if (!config.github?.owner || !config.github?.repo) {\n return {\n error: \"GitHub configuration missing\",\n suggestion: \"Set github.owner and github.repo in sdlc.json\",\n };\n }\n\n let targetIssueNumber = issueNumber;\n\n if (!targetIssueNumber) {\n const readyIssues = await listIssues(ctx, config, \"Ready\", 1);\n if (readyIssues.length === 0) {\n return {\n error: \"No Ready issues found\",\n suggestion: \"Move an issue to Ready status in the project board\",\n };\n }\n targetIssueNumber = readyIssues[0].number;\n }\n\n const issue = await fetchIssue(ctx, config, targetIssueNumber);\n if (!issue) {\n return {\n error: `Issue #${targetIssueNumber} not found`,\n suggestion: \"Check the issue number and repository settings\",\n };\n }\n\n const acceptanceCriteria = parseAcceptanceCriteria(issue.body);\n\n // Auto-move Ready -> In progress\n if (issue.state === \"OPEN\" || issue.state === \"open\") {\n const moved = await moveIssueToStatus(ctx, config, issue.number, \"In progress\");\n if (moved) {\n log.info(\"Auto-moved issue to In progress\", { issueNumber: issue.number });\n }\n }\n\n await tracker.setCurrentIssue(issue.number, {\n title: issue.title,\n status: \"In progress\",\n startedAt: new Date().toISOString(),\n url: issue.url,\n body: issue.body,\n });\n\n return {\n issueNumber: issue.number,\n title: issue.title,\n body: issue.body || \"\",\n url: issue.url,\n status: \"In progress\",\n acceptanceCriteria,\n instructions: \"Use todowrite with the provided todos to track acceptance criteria.\",\n };\n}\n","import { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { ListIssuesResult, SdlcConfig } from \"../../shared/types.js\";\nimport { listIssues } from \"../utils/github-issues.js\";\n\nexport function createListIssuesTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `List GitHub issues from the configured repository.\n\nOptionally filter by status column name (e.g., Ready, In progress, Done).`,\n\n args: {\n status: tool.schema.string().optional().describe(\"Filter by status column name\"),\n limit: tool.schema.number().int().positive().optional().describe(\"Max issues to return\"),\n },\n\n async execute(args): Promise<string> {\n const issues = await listIssues(ctx, config, args.status, args.limit ?? 20);\n const result: ListIssuesResult = {\n success: true,\n issues: issues.map((i) => ({\n number: i.number,\n title: i.title,\n status: i.status || i.state,\n url: i.url,\n })),\n };\n return JSON.stringify(result, null, 2);\n },\n });\n}\n","/**\n * sdlc_remember Tool\n *\n * Store context/discoveries to persistent memory for future sessions.\n * Wraps Memento MCP when available, falls back to local file storage.\n */\n\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig, SdlcFeatures } from \"../../shared/types.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\n\nconst log = createPluginLogger(\"remember\");\n\n/**\n * Memory entry stored in the memory store\n */\nexport interface MemoryEntry {\n key: string;\n content: string;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n projectDir?: string;\n}\n\n/**\n * Memory store structure\n */\nexport interface MemoryStore {\n version: string;\n entries: Record<string, MemoryEntry>;\n}\n\n/**\n * Result from sdlc_remember tool\n */\nexport interface RememberResult {\n success: boolean;\n key?: string;\n stored?: boolean;\n updated?: boolean;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Arguments for sdlc_remember tool\n */\nexport interface RememberArgs {\n key: string;\n content: string;\n tags?: string[];\n}\n\nconst MEMORY_DIR = \".opencode\";\nconst MEMORY_FILE = \"sdlc-memory.json\";\n\n/**\n * Get the path to the memory store file\n */\nfunction getMemoryStorePath(): string {\n return join(homedir(), MEMORY_DIR, MEMORY_FILE);\n}\n\n/**\n * Load the memory store from disk\n */\nasync function loadMemoryStore(): Promise<MemoryStore> {\n const storePath = getMemoryStorePath();\n\n try {\n const content = await readFile(storePath, \"utf-8\");\n return JSON.parse(content) as MemoryStore;\n } catch {\n // Return empty store if file doesn't exist\n return {\n version: \"1.0.0\",\n entries: {},\n };\n }\n}\n\n/**\n * Save the memory store to disk\n */\nasync function saveMemoryStore(store: MemoryStore): Promise<void> {\n const storePath = getMemoryStorePath();\n const storeDir = join(homedir(), MEMORY_DIR);\n\n // Ensure directory exists\n await mkdir(storeDir, { recursive: true });\n\n await writeFile(storePath, JSON.stringify(store, null, 2), \"utf-8\");\n}\n\n/**\n * Check if Memento MCP integration is enabled\n */\nfunction isMementoEnabled(config: SdlcConfig): boolean {\n const features = config.features as SdlcFeatures;\n return features?.memento === true;\n}\n\n/**\n * Store a memory using Memento MCP\n *\n * Note: This spawns a mini-agent that uses the Memento MCP tools.\n * The Memento MCP must be configured in OpenCode's MCP settings.\n */\nasync function storeWithMemento(\n ctx: PluginInput,\n config: SdlcConfig,\n args: RememberArgs\n): Promise<RememberResult> {\n try {\n // Create a session to interact with Memento MCP\n const createResult = await ctx.client.session.create({\n body: {\n title: `Memory: ${args.key}`,\n },\n });\n\n if (!createResult.data?.id) {\n throw new Error(\"Failed to create Memento session\");\n }\n\n const sessionId = createResult.data.id;\n\n try {\n // Build prompt to use Memento's store_memory tool\n const tagsStr = args.tags?.length ? `\\nTags: ${args.tags.join(\", \")}` : \"\";\n const prompt = `Use the memento store_memory tool to store this memory:\n\nKey: ${args.key}\nContent: ${args.content}${tagsStr}\n\nStore this information and confirm it was saved successfully.`;\n\n const modelConfig = parseModelConfig(\n config.models.librarian || \"anthropic/claude-sonnet-4-20250514\"\n );\n\n await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: modelConfig,\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n log.info(\"Stored memory via Memento MCP\", { key: args.key });\n\n return {\n success: true,\n key: args.key,\n stored: true,\n };\n } finally {\n // Session cleanup happens automatically\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n log.warn(\"Memento MCP store failed, falling back to local\", { error: message });\n\n // Fall back to local storage\n return storeLocally(ctx, args);\n }\n}\n\n/**\n * Store a memory locally\n */\nasync function storeLocally(ctx: PluginInput, args: RememberArgs): Promise<RememberResult> {\n try {\n const store = await loadMemoryStore();\n const now = new Date().toISOString();\n\n const existingEntry = store.entries[args.key];\n const isUpdate = !!existingEntry;\n\n store.entries[args.key] = {\n key: args.key,\n content: args.content,\n tags: args.tags || [],\n createdAt: existingEntry?.createdAt || now,\n updatedAt: now,\n projectDir: ctx.directory,\n };\n\n await saveMemoryStore(store);\n\n log.info(isUpdate ? \"Updated memory locally\" : \"Stored memory locally\", { key: args.key });\n\n return {\n success: true,\n key: args.key,\n stored: !isUpdate,\n updated: isUpdate,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n success: false,\n error: `Failed to store memory: ${message}`,\n suggestion: \"Check file system permissions for ~/.opencode/\",\n };\n }\n}\n\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"anthropic\", modelID: modelID || modelString };\n}\n\n/**\n * Create the sdlc_remember tool\n */\nexport function createRememberTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Store context, discoveries, or insights to persistent memory for future sessions.\n\nThis tool saves information that should persist across sessions, such as:\n- Project conventions and patterns learned during development\n- Debugging insights that might be useful later\n- Domain knowledge discovered during implementation\n- Technical decisions and their rationale\n\nMemories are stored with a unique key and optional tags for organization.\nUse descriptive keys like \"auth/jwt-token-format\" or \"api/error-handling-pattern\".\n\nWhen Memento MCP is enabled, memories sync across all OpenCode projects.\nOtherwise, memories are stored locally in ~/.opencode/sdlc-memory.json.`,\n\n args: {\n key: tool.schema\n .string()\n .describe(\n \"Unique identifier for this memory. Use slash-separated paths for organization (e.g., 'project/component/topic')\"\n ),\n content: tool.schema\n .string()\n .describe(\"The content to remember. Be descriptive - this will be recalled later.\"),\n tags: tool.schema\n .array(tool.schema.string())\n .optional()\n .describe(\"Tags for categorization and filtering (e.g., ['debugging', 'auth', 'api'])\"),\n },\n\n async execute(args): Promise<string> {\n const rememberArgs = args as RememberArgs;\n\n // Validate required fields\n if (!rememberArgs.key?.trim()) {\n return JSON.stringify({\n success: false,\n error: \"Key is required\",\n suggestion: \"Provide a unique key for this memory\",\n });\n }\n\n if (!rememberArgs.content?.trim()) {\n return JSON.stringify({\n success: false,\n error: \"Content is required\",\n suggestion: \"Provide the content to remember\",\n });\n }\n\n // Use Memento if enabled, otherwise local storage\n const result = isMementoEnabled(config)\n ? await storeWithMemento(ctx, config, rememberArgs)\n : await storeLocally(ctx, rememberArgs);\n\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\n// Export for testing\nexport const _testExports = {\n loadMemoryStore,\n saveMemoryStore,\n storeLocally,\n isMementoEnabled,\n getMemoryStorePath,\n};\n","/**\n * sdlc_recall Tool\n *\n * Query persistent memory to retrieve relevant context from past sessions.\n * Wraps Memento MCP when available, falls back to local file storage.\n */\n\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\nimport {\n type MemoryEntry,\n type MemoryStore,\n _testExports as rememberExports,\n} from \"./memory-remember.js\";\n\nconst log = createPluginLogger(\"recall\");\n\nconst { loadMemoryStore, isMementoEnabled } = rememberExports;\n\n/**\n * Result from sdlc_recall tool\n */\nexport interface RecallResult {\n success: boolean;\n memories?: MemoryEntry[];\n count?: number;\n query?: string;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Arguments for sdlc_recall tool\n */\nexport interface RecallArgs {\n query: string;\n tags?: string[];\n limit?: number;\n projectOnly?: boolean;\n}\n\n/**\n * Calculate similarity between two strings (simple token-based)\n */\nfunction calculateSimilarity(a: string, b: string): number {\n const tokensA = new Set(a.toLowerCase().split(/\\W+/).filter(Boolean));\n const tokensB = new Set(b.toLowerCase().split(/\\W+/).filter(Boolean));\n\n if (tokensA.size === 0 || tokensB.size === 0) return 0;\n\n let intersection = 0;\n for (const token of tokensA) {\n if (tokensB.has(token)) intersection++;\n }\n\n const union = new Set([...tokensA, ...tokensB]).size;\n return intersection / union;\n}\n\n/**\n * Score a memory entry against a query\n */\nfunction scoreMemory(entry: MemoryEntry, query: string, tags?: string[]): number {\n let score = 0;\n\n // Key match (highest priority)\n if (entry.key.toLowerCase().includes(query.toLowerCase())) {\n score += 0.5;\n }\n\n // Content similarity\n score += calculateSimilarity(query, entry.content) * 0.3;\n\n // Tag matches\n if (tags && tags.length > 0) {\n const matchingTags = entry.tags.filter((t) =>\n tags.some((qt) => t.toLowerCase().includes(qt.toLowerCase()))\n );\n score += (matchingTags.length / tags.length) * 0.2;\n }\n\n // Boost for exact key match\n if (entry.key.toLowerCase() === query.toLowerCase()) {\n score += 0.5;\n }\n\n return score;\n}\n\n/**\n * Query memories using Memento MCP\n */\nasync function recallWithMemento(\n ctx: PluginInput,\n config: SdlcConfig,\n args: RecallArgs\n): Promise<RecallResult> {\n try {\n // Create a session to interact with Memento MCP\n const createResult = await ctx.client.session.create({\n body: {\n title: `Recall: ${args.query}`,\n },\n });\n\n if (!createResult.data?.id) {\n throw new Error(\"Failed to create Memento session\");\n }\n\n const sessionId = createResult.data.id;\n\n try {\n // Build prompt to use Memento's search_memory tool\n const tagsStr = args.tags?.length ? `\\nFilter by tags: ${args.tags.join(\", \")}` : \"\";\n const limitStr = args.limit ? `\\nLimit results to: ${args.limit}` : \"\";\n const prompt = `Use the memento search_memory tool to find memories matching:\n\nQuery: ${args.query}${tagsStr}${limitStr}\n\nSearch for relevant memories and return the results as JSON with this structure:\n{\n \"memories\": [\n {\n \"key\": \"memory-key\",\n \"content\": \"memory content\",\n \"tags\": [\"tag1\", \"tag2\"],\n \"createdAt\": \"ISO date\",\n \"updatedAt\": \"ISO date\"\n }\n ]\n}`;\n\n const modelConfig = parseModelConfig(\n config.models.librarian || \"anthropic/claude-sonnet-4-20250514\"\n );\n\n await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: modelConfig,\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n // Get the response\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n throw new Error(\"No response from Memento session\");\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const responseText = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n // Try to parse JSON from response\n const jsonMatch = responseText.match(/\\{[\\s\\S]*\"memories\"[\\s\\S]*\\}/);\n if (jsonMatch) {\n const parsed = JSON.parse(jsonMatch[0]) as { memories: MemoryEntry[] };\n log.info(\"Recalled memories via Memento MCP\", {\n query: args.query,\n count: parsed.memories?.length || 0,\n });\n return {\n success: true,\n memories: parsed.memories || [],\n count: parsed.memories?.length || 0,\n query: args.query,\n };\n }\n\n throw new Error(\"Could not parse Memento response\");\n } finally {\n // Session cleanup happens automatically\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n log.warn(\"Memento MCP recall failed, falling back to local\", { error: message });\n\n // Fall back to local storage\n return recallLocally(ctx, args);\n }\n}\n\n/**\n * Query memories from local storage\n */\nasync function recallLocally(ctx: PluginInput, args: RecallArgs): Promise<RecallResult> {\n try {\n const store: MemoryStore = await loadMemoryStore();\n const entries = Object.values(store.entries);\n\n if (entries.length === 0) {\n return {\n success: true,\n memories: [],\n count: 0,\n query: args.query,\n };\n }\n\n // Filter by project if requested\n let filtered = entries;\n if (args.projectOnly) {\n filtered = entries.filter((e) => e.projectDir === ctx.directory);\n }\n\n // Score and sort entries by relevance\n const scored = filtered\n .map((entry) => ({\n entry,\n score: scoreMemory(entry, args.query, args.tags),\n }))\n .filter((item) => item.score > 0)\n .sort((a, b) => b.score - a.score);\n\n // Apply limit\n const limit = args.limit || 10;\n const results = scored.slice(0, limit).map((item) => item.entry);\n\n log.info(\"Recalled memories locally\", {\n query: args.query,\n count: results.length,\n total: entries.length,\n });\n\n return {\n success: true,\n memories: results,\n count: results.length,\n query: args.query,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n success: false,\n error: `Failed to recall memories: ${message}`,\n suggestion: \"Check if ~/.opencode/sdlc-memory.json exists and is valid JSON\",\n };\n }\n}\n\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"anthropic\", modelID: modelID || modelString };\n}\n\n/**\n * Create the sdlc_recall tool\n */\nexport function createRecallTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Query persistent memory to retrieve relevant context from past sessions.\n\nUse this tool before starting work to:\n- Check for existing knowledge about a component or feature\n- Recall debugging insights that might be relevant\n- Find documented patterns or conventions\n- Review previous decisions and their rationale\n\nThe query is matched against memory keys, content, and tags.\nResults are ranked by relevance and returned in order.\n\nExamples:\n- query: \"authentication\" - finds all memories related to auth\n- query: \"api/error-handling\" - finds specific key or related content\n- query: \"jwt\" with tags: [\"auth\", \"security\"] - filtered search\n\nWhen Memento MCP is enabled, searches across all OpenCode projects.\nOtherwise, searches local memory in ~/.opencode/sdlc-memory.json.`,\n\n args: {\n query: tool.schema\n .string()\n .describe(\n \"Search query to find relevant memories. Can be a key path or keywords from content.\"\n ),\n tags: tool.schema\n .array(tool.schema.string())\n .optional()\n .describe(\"Filter results by tags (e.g., ['debugging', 'auth'])\"),\n limit: tool.schema\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Maximum number of results to return (default: 10)\"),\n projectOnly: tool.schema\n .boolean()\n .optional()\n .describe(\"Only return memories from the current project directory\"),\n },\n\n async execute(args): Promise<string> {\n const recallArgs = args as RecallArgs;\n\n // Validate required fields\n if (!recallArgs.query?.trim()) {\n return JSON.stringify({\n success: false,\n error: \"Query is required\",\n suggestion: \"Provide a search query to find relevant memories\",\n });\n }\n\n // Use Memento if enabled, otherwise local storage\n const result = isMementoEnabled(config)\n ? await recallWithMemento(ctx, config, recallArgs)\n : await recallLocally(ctx, recallArgs);\n\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\n// Export for testing\nexport const _testExports = {\n recallLocally,\n calculateSimilarity,\n scoreMemory,\n};\n","/**\n * sdlc_mutation Tool\n *\n * Runs mutation testing to verify test suite quality.\n * Supports: cargo-mutants (Rust), Stryker (JS/TS), mutmut (Python), Muzak (Elixir)\n */\n\nimport { existsSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\n\n/**\n * Supported mutation testing frameworks\n */\nexport type MutationFramework = \"stryker\" | \"cargo-mutants\" | \"mutmut\" | \"muzak\" | \"auto\";\n\n/**\n * A surviving mutant from mutation testing\n */\nexport interface SurvivingMutant {\n id: string;\n file: string;\n line?: number;\n original: string;\n mutation: string;\n mutationType: string;\n}\n\n/**\n * Mutation testing result\n */\nexport interface MutationResult {\n success: boolean;\n framework?: MutationFramework;\n totalMutants?: number;\n killed?: number;\n survived?: number;\n timedOut?: number;\n score?: number;\n threshold?: number;\n passed?: boolean;\n survivors?: SurvivingMutant[];\n reportPath?: string;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Arguments for sdlc_mutation tool\n */\nexport interface MutationArgs {\n targetPath?: string;\n framework?: MutationFramework;\n timeout?: number;\n}\n\n/**\n * Create the sdlc_mutation tool\n */\nexport function createMutationTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Run mutation testing to verify test suite quality.\n\nMutation testing creates small changes (mutants) in the code and checks\nif tests detect them. Surviving mutants indicate test gaps.\n\nSupported frameworks:\n- stryker: JavaScript/TypeScript\n- cargo-mutants: Rust\n- mutmut: Python\n- muzak: Elixir\n- auto: Detect from project files\n\nReturns:\n- score: Percentage of mutants killed (higher is better)\n- passed: Whether score meets configured threshold\n- survivors: List of surviving mutants with analysis\n- reportPath: Path to detailed HTML report (if available)`,\n\n args: {\n targetPath: tool.schema\n .string()\n .optional()\n .describe(\"Path to file or directory to mutate (default: src/)\"),\n framework: tool.schema\n .enum([\"stryker\", \"cargo-mutants\", \"mutmut\", \"muzak\", \"auto\"])\n .optional()\n .describe(\"Mutation testing framework (default: auto-detect)\"),\n timeout: tool.schema\n .number()\n .optional()\n .describe(\"Timeout per mutant in seconds (default: 60)\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executeMutation(ctx, config, args as MutationArgs);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function executeMutation(\n ctx: PluginInput,\n config: SdlcConfig,\n args: MutationArgs\n): Promise<MutationResult> {\n // Determine framework\n const framework =\n args.framework === \"auto\" || !args.framework ? detectFramework(ctx.directory) : args.framework;\n\n if (!framework) {\n return {\n success: false,\n error: \"Could not detect mutation testing framework\",\n suggestion: \"Install a mutation testing framework or specify --framework\",\n };\n }\n\n // Check if framework is available\n const available = await checkFrameworkAvailable(ctx, framework);\n if (!available) {\n return {\n success: false,\n error: `Framework ${framework} is not installed`,\n suggestion: getInstallSuggestion(framework),\n };\n }\n\n // Get threshold from config\n const threshold = config.tdd?.mutationTesting?.requiredScore ?? 80;\n\n // Run mutation testing\n const targetPath = args.targetPath || \"src/\";\n const timeout = args.timeout || 60;\n\n const runResult = await runMutationTesting(ctx, framework, targetPath, timeout);\n\n if (!runResult.success) {\n return {\n success: false,\n framework,\n error: runResult.error,\n suggestion: runResult.suggestion,\n };\n }\n\n // Parse results\n const parsed = parseMutationOutput(runResult.output || \"\", framework);\n\n // Calculate score\n const score = parsed.totalMutants > 0 ? (parsed.killed / parsed.totalMutants) * 100 : 0;\n\n const passed = score >= threshold;\n\n // Save report if available\n let reportPath: string | undefined;\n if (parsed.survivors.length > 0) {\n reportPath = join(ctx.directory, \".opencode\", \"mutation-report.md\");\n try {\n await mkdir(dirname(reportPath), { recursive: true });\n await writeFile(reportPath, generateReport(parsed, score, threshold), \"utf-8\");\n } catch {\n // Non-fatal\n }\n }\n\n return {\n success: true,\n framework,\n totalMutants: parsed.totalMutants,\n killed: parsed.killed,\n survived: parsed.survived,\n timedOut: parsed.timedOut,\n score: Math.round(score * 10) / 10,\n threshold,\n passed,\n survivors: parsed.survivors.slice(0, 10), // Limit to 10 for response size\n reportPath,\n };\n}\n\nfunction detectFramework(directory: string): MutationFramework | null {\n // Check for project files to determine language/framework\n if (existsSync(join(directory, \"Cargo.toml\"))) {\n return \"cargo-mutants\";\n }\n if (\n existsSync(join(directory, \"stryker.conf.json\")) ||\n existsSync(join(directory, \"stryker.conf.js\")) ||\n existsSync(join(directory, \"stryker.conf.mjs\"))\n ) {\n return \"stryker\";\n }\n if (existsSync(join(directory, \"package.json\"))) {\n return \"stryker\"; // Default for JS/TS projects\n }\n if (existsSync(join(directory, \"setup.py\")) || existsSync(join(directory, \"pyproject.toml\"))) {\n return \"mutmut\";\n }\n if (existsSync(join(directory, \"mix.exs\"))) {\n return \"muzak\";\n }\n return null;\n}\n\nasync function checkFrameworkAvailable(\n ctx: PluginInput,\n framework: MutationFramework\n): Promise<boolean> {\n try {\n switch (framework) {\n case \"stryker\":\n await ctx.$`npx stryker --version`;\n return true;\n case \"cargo-mutants\":\n await ctx.$`cargo mutants --version`;\n return true;\n case \"mutmut\":\n await ctx.$`mutmut --version`;\n return true;\n case \"muzak\":\n await ctx.$`mix help muzak`;\n return true;\n default:\n return false;\n }\n } catch {\n return false;\n }\n}\n\nfunction getInstallSuggestion(framework: MutationFramework): string {\n switch (framework) {\n case \"stryker\":\n return \"Install with: npm install --save-dev @stryker-mutator/core\";\n case \"cargo-mutants\":\n return \"Install with: cargo install cargo-mutants\";\n case \"mutmut\":\n return \"Install with: pip install mutmut\";\n case \"muzak\":\n return 'Add {:muzak, \"~> 1.0\", only: :test} to mix.exs';\n default:\n return \"Install the appropriate mutation testing framework for your project\";\n }\n}\n\ninterface RunResult {\n success: boolean;\n output?: string;\n error?: string;\n suggestion?: string;\n}\n\nasync function runMutationTesting(\n ctx: PluginInput,\n framework: MutationFramework,\n targetPath: string,\n timeout: number\n): Promise<RunResult> {\n try {\n let result: { stdout: Buffer | string };\n\n switch (framework) {\n case \"stryker\":\n result = await ctx.$`npx stryker run --mutate ${targetPath}/**/*.ts`;\n break;\n case \"cargo-mutants\":\n result = await ctx.$`cargo mutants --timeout ${timeout}`;\n break;\n case \"mutmut\":\n result = await ctx.$`mutmut run --paths-to-mutate ${targetPath}`;\n break;\n case \"muzak\":\n result = await ctx.$`mix muzak`;\n break;\n default:\n return {\n success: false,\n error: `Unknown framework: ${framework}`,\n };\n }\n\n return {\n success: true,\n output: String(result.stdout),\n };\n } catch (error) {\n // Mutation testing often returns non-zero exit codes for surviving mutants\n // Check if we got output anyway\n const errorObj = error as { stdout?: Buffer | string; message?: string };\n if (errorObj.stdout) {\n return {\n success: true,\n output: String(errorObj.stdout),\n };\n }\n return {\n success: false,\n error: errorObj.message || \"Mutation testing failed\",\n suggestion: \"Check test command and framework configuration\",\n };\n }\n}\n\ninterface ParsedMutation {\n totalMutants: number;\n killed: number;\n survived: number;\n timedOut: number;\n survivors: SurvivingMutant[];\n}\n\nfunction parseMutationOutput(output: string, framework: MutationFramework): ParsedMutation {\n const result: ParsedMutation = {\n totalMutants: 0,\n killed: 0,\n survived: 0,\n timedOut: 0,\n survivors: [],\n };\n\n // Stryker output parsing\n if (framework === \"stryker\") {\n const totalMatch = output.match(/Ran (\\d+) mutants/i);\n const killedMatch = output.match(/Killed:\\s*(\\d+)/i);\n const survivedMatch = output.match(/Survived:\\s*(\\d+)/i);\n const timedOutMatch = output.match(/Timed out:\\s*(\\d+)/i);\n\n if (totalMatch) result.totalMutants = Number.parseInt(totalMatch[1], 10);\n if (killedMatch) result.killed = Number.parseInt(killedMatch[1], 10);\n if (survivedMatch) result.survived = Number.parseInt(survivedMatch[1], 10);\n if (timedOutMatch) result.timedOut = Number.parseInt(timedOutMatch[1], 10);\n\n // Parse surviving mutants\n const survivorMatches = output.matchAll(/Survived:\\s*([^\\n]+?)\\s*\\(([^)]+):(\\d+)\\)/gi);\n for (const match of survivorMatches) {\n result.survivors.push({\n id: `stryker-${result.survivors.length}`,\n file: match[2],\n line: Number.parseInt(match[3], 10),\n original: \"\",\n mutation: match[1],\n mutationType: \"unknown\",\n });\n }\n }\n\n // cargo-mutants output parsing\n if (framework === \"cargo-mutants\") {\n const totalMatch = output.match(/(\\d+) mutants tested/i);\n const killedMatch = output.match(/(\\d+) caught/i);\n const survivedMatch = output.match(/(\\d+) missed/i);\n const timedOutMatch = output.match(/(\\d+) timed out/i);\n\n if (totalMatch) result.totalMutants = Number.parseInt(totalMatch[1], 10);\n if (killedMatch) result.killed = Number.parseInt(killedMatch[1], 10);\n if (survivedMatch) result.survived = Number.parseInt(survivedMatch[1], 10);\n if (timedOutMatch) result.timedOut = Number.parseInt(timedOutMatch[1], 10);\n\n // Parse MISSED mutants\n const missedMatches = output.matchAll(/MISSED\\s+([^\\n]+?)\\s+in\\s+([^:]+):(\\d+)/gi);\n for (const match of missedMatches) {\n result.survivors.push({\n id: `cargo-${result.survivors.length}`,\n file: match[2],\n line: Number.parseInt(match[3], 10),\n original: \"\",\n mutation: match[1],\n mutationType: \"unknown\",\n });\n }\n }\n\n // mutmut output parsing\n if (framework === \"mutmut\") {\n const statusMatch = output.match(/(\\d+)\\/(\\d+)/);\n if (statusMatch) {\n result.killed = Number.parseInt(statusMatch[1], 10);\n result.totalMutants = Number.parseInt(statusMatch[2], 10);\n result.survived = result.totalMutants - result.killed;\n }\n }\n\n // muzak output parsing\n if (framework === \"muzak\") {\n const summaryMatch = output.match(/(\\d+) killed, (\\d+) survived/i);\n if (summaryMatch) {\n result.killed = Number.parseInt(summaryMatch[1], 10);\n result.survived = Number.parseInt(summaryMatch[2], 10);\n result.totalMutants = result.killed + result.survived;\n }\n }\n\n return result;\n}\n\nfunction generateReport(parsed: ParsedMutation, score: number, threshold: number): string {\n const passedStr = score >= threshold ? \"PASSED\" : \"FAILED\";\n\n let report = `# Mutation Testing Report\n\n## Summary\n- **Score:** ${score.toFixed(1)}%\n- **Threshold:** ${threshold}%\n- **Status:** ${passedStr}\n\n## Statistics\n| Metric | Count |\n|--------|-------|\n| Total Mutants | ${parsed.totalMutants} |\n| Killed | ${parsed.killed} |\n| Survived | ${parsed.survived} |\n| Timed Out | ${parsed.timedOut} |\n\n## Surviving Mutants\n\n`;\n\n if (parsed.survivors.length === 0) {\n report += \"No surviving mutants - excellent test coverage!\\n\";\n } else {\n for (const survivor of parsed.survivors) {\n report += `### ${survivor.id}\n**File:** \\`${survivor.file}${survivor.line ? `:${survivor.line}` : \"\"}\\`\n**Mutation:** ${survivor.mutation}\n\n---\n\n`;\n }\n }\n\n return report;\n}\n\n// Export for testing\nexport const _testExports = {\n executeMutation,\n detectFramework,\n parseMutationOutput,\n generateReport,\n};\n","import type { PluginInput } from \"@opencode-ai/plugin\";\nimport type {\n ApplyDecisionsResult,\n DiscussionRound,\n PartyDiscussionState,\n ReviewDecision,\n SdlcConfig,\n} from \"../../shared/types.js\";\nimport { fetchIssue, updateIssueBody } from \"./github-issues.js\";\n\nconst DECISIONS_HEADER = \"## Party Review Decisions\";\nconst FINDING_ID_PREFIX = \"Finding ID:\";\nconst DECISION_PREFIX = \"Decision:\";\n\nfunction getDecisionIcon(decision: ReviewDecision): string {\n switch (decision) {\n case \"accept\":\n return \"✅\";\n case \"defer\":\n return \"⏸️\";\n case \"reject\":\n return \"❌\";\n default:\n return \"⚪\";\n }\n}\n\nfunction formatDecisionRound(round: DiscussionRound): string {\n const lines = [\n `### ${getDecisionIcon(round.decision ?? \"pending\")} ${round.findingTitle}`,\n `- ${FINDING_ID_PREFIX} ${round.findingId}`,\n `- ${DECISION_PREFIX} ${round.decision ?? \"pending\"}`,\n `- Severity: ${round.findingSeverity}`,\n `- Category: ${round.findingCategory}`,\n ];\n\n if (round.decisionReason) {\n lines.push(`- Reason: ${round.decisionReason}`);\n }\n\n if (round.deferredTo) {\n lines.push(`- Deferred to: ${round.deferredTo}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction buildDecisionSection(state: PartyDiscussionState): string {\n const date = new Date().toISOString().split(\"T\")[0];\n const decisions = state.completedRounds.map(formatDecisionRound).join(\"\\n\\n\");\n\n return `${DECISIONS_HEADER}\\n\\n**Date**: ${date}\\n**Session ID**: ${state.sessionId}\\n\\n${decisions}`;\n}\n\nfunction mergeDecisionSection(body: string, section: string): string {\n const existingIndex = body.indexOf(DECISIONS_HEADER);\n if (existingIndex === -1) {\n return `${body.trim()}\\n\\n---\\n\\n${section}`.trim();\n }\n\n return `${body.slice(0, existingIndex).trim()}\\n\\n${section}`.trim();\n}\n\nfunction resolveIssueNumbers(state: PartyDiscussionState): number[] {\n const raw = state.identifier\n .split(\",\")\n .map((token) => token.trim())\n .filter(Boolean);\n\n const numbers = raw\n .map((token) => token.replace(/^#/, \"\"))\n .map((token) => Number.parseInt(token, 10))\n .filter((value) => Number.isFinite(value) && value > 0);\n\n return Array.from(new Set(numbers));\n}\n\nexport async function applyIssueDecisions(\n ctx: PluginInput,\n config: SdlcConfig,\n state: PartyDiscussionState\n): Promise<ApplyDecisionsResult> {\n const issueNumbers = resolveIssueNumbers(state);\n const updated: Array<{ issueNumber: number; appliedDecisions: number }> = [];\n\n if (issueNumbers.length === 0) {\n return {\n success: false,\n reviewDocumentUpdated: false,\n summary: {\n accepted: 0,\n deferred: 0,\n rejected: 0,\n issuesModified: 0,\n },\n error: \"No issue numbers available to update\",\n };\n }\n\n const decisionSection = buildDecisionSection(state);\n\n for (const issueNumber of issueNumbers) {\n const issue = await fetchIssue(ctx, config, issueNumber);\n if (!issue) continue;\n\n const updatedBody = mergeDecisionSection(issue.body || \"\", decisionSection);\n const success = await updateIssueBody(ctx, config, issueNumber, updatedBody);\n\n if (success) {\n updated.push({ issueNumber, appliedDecisions: state.completedRounds.length });\n }\n }\n\n const accepted = state.completedRounds.filter((round) => round.decision === \"accept\").length;\n const deferred = state.completedRounds.filter((round) => round.decision === \"defer\").length;\n const rejected = state.completedRounds.filter((round) => round.decision === \"reject\").length;\n\n return {\n success: updated.length > 0,\n reviewDocumentUpdated: false,\n issuesUpdated: updated,\n summary: {\n accepted,\n deferred,\n rejected,\n issuesModified: updated.length,\n },\n warnings: updated.length === 0 ? [\"No issues updated\"] : undefined,\n };\n}\n","import type { FindingCategory, FindingSeverity } from \"../../shared/types.js\";\nimport type { FindingCounts } from \"./agent-selector.js\";\n\nexport interface FindingDetail {\n id: string;\n category: FindingCategory;\n severity: FindingSeverity;\n title: string;\n description: string;\n impact: string;\n suggestion: string;\n}\n\nexport interface OracleResponseSummary {\n totalIssues: number;\n highSeverity: number;\n mediumSeverity: number;\n lowSeverity: number;\n recommendation: string;\n}\n\nexport interface OracleResponseFindings {\n security: FindingDetail[];\n logic: FindingDetail[];\n bestPractices: FindingDetail[];\n performance: FindingDetail[];\n}\n\nexport interface IssueFinding {\n issueId: string;\n title: string;\n findings: Partial<OracleResponseFindings>;\n}\n\nexport interface CrossIssueIssue {\n id: string;\n category: FindingCategory;\n severity: FindingSeverity;\n title: string;\n description: string;\n affectedIssues: string[];\n suggestion: string;\n}\n\nexport interface ParsedOracleResponse {\n summary: OracleResponseSummary;\n findings?: OracleResponseFindings;\n issueFindings?: IssueFinding[];\n crossIssueIssues?: CrossIssueIssue[];\n}\n\nexport function parseOracleResponse(response: string | null | undefined): ParsedOracleResponse {\n if (!response || typeof response !== \"string\") {\n return createEmptyResponse(\"No response provided\");\n }\n\n try {\n const jsonMatch = response.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n return createEmptyResponse(\"No JSON found in Oracle response\");\n }\n\n const parsed = JSON.parse(jsonMatch[0]) as ParsedOracleResponse;\n\n if (!parsed.summary) {\n return createEmptyResponse(\"No summary in Oracle response\");\n }\n\n return parsed;\n } catch {\n return createEmptyResponse(\"Failed to parse Oracle response as JSON\");\n }\n}\n\nfunction createEmptyResponse(reason: string): ParsedOracleResponse {\n return {\n summary: {\n totalIssues: 0,\n highSeverity: 0,\n mediumSeverity: 0,\n lowSeverity: 0,\n recommendation: reason,\n },\n findings: {\n security: [],\n logic: [],\n bestPractices: [],\n performance: [],\n },\n };\n}\n\nexport function countFindings(parsed: ParsedOracleResponse): FindingCounts {\n const counts: FindingCounts = {\n total: parsed.summary.totalIssues,\n high: parsed.summary.highSeverity,\n medium: parsed.summary.mediumSeverity,\n low: parsed.summary.lowSeverity,\n byCategory: {\n security: 0,\n logic: 0,\n bestPractices: 0,\n performance: 0,\n },\n };\n\n if (parsed.findings) {\n counts.byCategory.security = parsed.findings.security?.length || 0;\n counts.byCategory.logic = parsed.findings.logic?.length || 0;\n counts.byCategory.bestPractices = parsed.findings.bestPractices?.length || 0;\n counts.byCategory.performance = parsed.findings.performance?.length || 0;\n }\n\n if (parsed.issueFindings) {\n for (const issue of parsed.issueFindings) {\n counts.byCategory.security += issue.findings.security?.length || 0;\n counts.byCategory.logic += issue.findings.logic?.length || 0;\n counts.byCategory.bestPractices += issue.findings.bestPractices?.length || 0;\n counts.byCategory.performance += issue.findings.performance?.length || 0;\n }\n }\n\n return counts;\n}\n\nexport function extractAllFindings(parsed: ParsedOracleResponse): FindingDetail[] {\n const allFindings: FindingDetail[] = [];\n\n if (parsed.findings) {\n for (const category of [\"security\", \"logic\", \"bestPractices\", \"performance\"] as const) {\n const findings = parsed.findings[category] || [];\n for (const finding of findings) {\n allFindings.push({ ...finding, category });\n }\n }\n }\n\n if (parsed.issueFindings) {\n for (const issue of parsed.issueFindings) {\n for (const category of [\"security\", \"logic\", \"bestPractices\", \"performance\"] as const) {\n const findings = issue.findings[category] || [];\n for (const finding of findings) {\n allFindings.push({ ...finding, category });\n }\n }\n }\n }\n\n return allFindings;\n}\n\nexport function sortFindingsBySeverity(findings: FindingDetail[]): FindingDetail[] {\n const severityOrder: Record<FindingSeverity, number> = { high: 0, medium: 1, low: 2 };\n return [...findings].sort((a, b) => severityOrder[a.severity] - severityOrder[b.severity]);\n}\n","/**\n * Shared TypeScript type definitions for OpenCode SDLC Plugin\n */\n\n// ============================================================================\n// CLI Types\n// ============================================================================\n\n/**\n * Options passed to the install command\n */\nexport interface InstallOptions {\n preset: string;\n yes: boolean;\n advanced: boolean;\n global: boolean;\n local: boolean;\n reconfigure?: boolean;\n}\n\n/**\n * Options passed to the upgrade command\n */\nexport interface UpgradeOptions {\n check: boolean;\n yes: boolean;\n}\n\n/**\n * Options passed to the doctor command\n */\nexport interface DoctorOptions {\n fix: boolean;\n}\n\n/**\n * Options passed to the uninstall command\n */\nexport interface UninstallOptions {\n keepConfig: boolean;\n keepDeps: boolean;\n}\n\n/**\n * Subscription information gathered during install\n */\nexport interface SubscriptionAnswers {\n hasClaude: boolean;\n claudeTier: \"max5x\" | \"max20x\" | \"pro\" | \"none\";\n hasOpenAI: boolean;\n hasGoogle: boolean;\n googleAuth: \"antigravity\" | \"personal\" | \"api\" | \"none\";\n hasGitHubCopilot: boolean;\n copilotPlan: \"free\" | \"pro\" | \"pro-plus\" | \"business\" | \"enterprise\" | \"none\";\n copilotEnabledModels?: string[];\n}\n\n/**\n * Methodology preferences gathered during install\n */\nexport interface MethodologyAnswers {\n defaultTrack: \"quick-flow\" | \"enterprise\";\n autoStatusUpdate: boolean;\n}\n\n/**\n * Feature selections gathered during install\n */\nexport interface FeatureAnswers {\n enabledFeatures: string[];\n mcps: string[];\n}\n\n/**\n * Advanced options gathered during install\n */\nexport interface AdvancedAnswers {\n parallelIssueLimit?: number;\n experimental?: string[];\n autoFallback?: boolean;\n}\n\n/**\n * Available model choices by provider\n */\nexport type LLMProvider = \"anthropic\" | \"openai\" | \"google\" | \"github-copilot\";\n\n/**\n * Model definition\n */\nexport interface ModelChoice {\n id: string;\n name: string;\n provider: LLMProvider;\n description?: string;\n}\n\n/**\n * Custom model definition for user-added models\n */\nexport interface CustomModelDefinition {\n id: string;\n name: string;\n provider: LLMProvider;\n description?: string;\n capabilities?: {\n thinking?: boolean;\n contextWindow?: number;\n supportsTemperature?: boolean;\n };\n}\n\n/**\n * Agent roles that require model assignment\n */\nexport type AgentRole =\n | \"sisyphus\"\n | \"oracle\"\n | \"librarian\"\n | \"frontend\"\n | \"documentWriter\"\n | \"multimodalLooker\"\n | \"explore\";\n\n/**\n * Thinking level for reasoning-capable models\n */\nexport type ThinkingLevel = \"off\" | \"low\" | \"medium\" | \"high\";\n\n/**\n * Agent-specific settings for temperature and thinking level\n */\nexport interface AgentSettings {\n temperature?: number; // 0.0 - 1.0\n thinkingLevel?: ThinkingLevel;\n}\n\n/**\n * Model assignments for each agent role\n */\nexport interface ModelAnswers {\n sisyphus: string;\n oracle: string;\n librarian: string;\n frontend?: string;\n documentWriter?: string;\n multimodalLooker?: string;\n explore?: string;\n settings?: {\n sisyphus?: AgentSettings;\n oracle?: AgentSettings;\n librarian?: AgentSettings;\n frontend?: AgentSettings;\n documentWriter?: AgentSettings;\n multimodalLooker?: AgentSettings;\n explore?: AgentSettings;\n overrides?: Record<string, AgentSettings>;\n };\n custom?: CustomModelDefinition[];\n}\n\n/**\n * GitHub integration answers from the installer\n */\nexport interface GitHubAnswers {\n enabled: boolean;\n owner: string;\n repo: string;\n project?: number;\n statuses: GitHubStatus[];\n}\n\n/**\n * TDD configuration answers from the installer\n */\nexport interface TddAnswers {\n enabled: boolean;\n verbosity: TddVerbosity;\n bypassPatterns: string[];\n mutationTesting: {\n enabled: boolean;\n requiredScore: number;\n };\n}\n\n/**\n * Event Modeling answers from the installer\n */\nexport interface EventModelingAnswers {\n enabled: boolean;\n outputPath: string;\n}\n\n/**\n * Git Workflow answers from the installer\n */\nexport interface GitWorkflowAnswers {\n workflow: GitWorkflow;\n requireClean: boolean;\n worktrees: boolean;\n}\n\n/**\n * All answers from the install wizard\n */\nexport interface InstallAnswers {\n subscriptions: SubscriptionAnswers;\n models: ModelAnswers;\n methodology: MethodologyAnswers;\n features: FeatureAnswers;\n advanced: AdvancedAnswers;\n installLocation: \"global\" | \"local\";\n // New v0.3.0+ answers\n github?: GitHubAnswers;\n tdd?: TddAnswers;\n eventModeling?: EventModelingAnswers;\n gitWorkflow?: GitWorkflowAnswers;\n}\n\n/**\n * A file to be generated/written by the installer\n */\nexport interface GeneratedFile {\n path: string;\n content: string;\n exists: boolean;\n}\n\n// ============================================================================\n// Configuration Types\n// ============================================================================\n\nexport interface AgentRouting {\n requiresThinking?: boolean;\n preferProvider?: LLMProvider;\n}\n\nexport interface RoutingConfig {\n providerPriority: LLMProvider[];\n modelFamilyPriority: {\n claude?: LLMProvider[];\n gpt?: LLMProvider[];\n gemini?: LLMProvider[];\n };\n agentOverrides: {\n sisyphus?: AgentRouting;\n oracle?: AgentRouting;\n librarian?: AgentRouting;\n frontend?: AgentRouting;\n documentWriter?: AgentRouting;\n multimodalLooker?: AgentRouting;\n };\n fallbackBehavior: {\n autoFallback: boolean;\n retryPeriodMs: number;\n notifyOnRateLimit: boolean;\n };\n}\n\n// ============================================================================\n// GitHub Issues Configuration\n// ============================================================================\n\n/**\n * GitHub project board column statuses\n */\nexport type GitHubStatus = \"Backlog\" | \"Ready\" | \"In progress\" | \"In review\" | \"Done\";\n\n/**\n * GitHub Issues integration configuration\n */\nexport interface GitHubConfig {\n /** GitHub repository owner (user or org) */\n owner: string;\n /** GitHub repository name */\n repo: string;\n /** GitHub Project number for board tracking (optional) */\n project?: number;\n /** Project board column names mapping to workflow states */\n statuses: GitHubStatus[];\n}\n\n// ============================================================================\n// TDD Configuration\n// ============================================================================\n\n/**\n * TDD verbosity levels\n */\nexport type TddVerbosity = \"silent\" | \"brief\" | \"explain\";\n\n/**\n * Mutation testing configuration\n */\nexport interface MutationTestingConfig {\n /** Enable mutation testing for coverage verification */\n enabled: boolean;\n /** Minimum mutation score required (0-100) */\n requiredScore: number;\n}\n\n/**\n * TDD cycle enforcement configuration\n */\nexport interface TddConfig {\n /** Enable TDD cycle enforcement */\n enabled: boolean;\n /** How verbose TDD feedback should be */\n verbosity: TddVerbosity;\n /** File patterns that bypass TDD checks (e.g., config files) */\n bypassPatterns: string[];\n /** Mutation testing settings */\n mutationTesting: MutationTestingConfig;\n}\n\n// ============================================================================\n// Event Modeling Configuration\n// ============================================================================\n\n/**\n * Event Modeling integration configuration\n */\nexport interface EventModelingConfig {\n /** Enable Event Modeling workflow */\n enabled: boolean;\n /** Path to event model output files */\n outputPath: string;\n}\n\n// ============================================================================\n// Git Workflow Configuration\n// ============================================================================\n\n/**\n * Git workflow types\n */\nexport type GitWorkflow = \"standard\" | \"git-spice\";\n\n/**\n * Git integration configuration\n */\nexport interface GitConfig {\n /** Git workflow style */\n workflow: GitWorkflow;\n /** Require clean working directory before operations */\n requireClean: boolean;\n /** Enable git worktrees for parallel work */\n worktrees: boolean;\n}\n\n// ============================================================================\n// Feature Flags\n// ============================================================================\n\n/**\n * SDLC feature flags\n */\nexport interface SdlcFeatures {\n /** Main conversation delegates all file writes to agents */\n orchestratorOnly: boolean;\n /** Auto-sync todos with GitHub issue checkboxes */\n todoSync: boolean;\n /** Enable party review for architecture decisions */\n partyReview: boolean;\n /** Enable debugging protocol with Oracle */\n debuggingProtocol: boolean;\n /** Enable Memento MCP for persistent memory */\n memento: boolean;\n /** Show in-TUI notifications */\n notifications: boolean;\n /** Enable LSP tools for code intelligence */\n lspTools: boolean;\n}\n\n// ============================================================================\n// MCP Configuration\n// ============================================================================\n\n/**\n * MCP (Model Context Protocol) server configuration\n */\nexport interface McpConfig {\n /** Context7 for library documentation */\n context7: boolean;\n /** Exa for web search */\n exa: boolean;\n /** grep.app for code search */\n grepApp: boolean;\n /** Memento for persistent memory */\n memento: boolean;\n}\n\n// ============================================================================\n// Main SDLC Configuration\n// ============================================================================\n\n/**\n * SDLC configuration file structure (v0.3.0+)\n *\n * This config supports a transitional state where:\n * - Old BMAD fields are optional (deprecated, for backward compatibility)\n * - New GitHub/TDD/EventModeling fields are optional (will become required in v0.4.0)\n *\n * New installations should use the new fields; existing installations\n * can continue using BMAD until migrated.\n */\nexport interface SdlcConfig {\n $schema?: string;\n version: string;\n subscriptions: {\n claude: {\n enabled: boolean;\n tier: \"max5x\" | \"max20x\" | \"pro\" | \"none\";\n };\n openai: {\n enabled: boolean;\n };\n google: {\n enabled: boolean;\n authMethod: \"antigravity\" | \"personal\" | \"api\" | \"none\";\n };\n githubCopilot: {\n enabled: boolean;\n plan: \"free\" | \"pro\" | \"pro-plus\" | \"business\" | \"enterprise\" | \"none\";\n enabledModels?: string[];\n };\n };\n models: {\n sisyphus: string;\n oracle: string;\n librarian: string;\n frontend?: string;\n documentWriter?: string;\n multimodalLooker?: string;\n settings?: {\n sisyphus?: AgentSettings;\n oracle?: AgentSettings;\n librarian?: AgentSettings;\n frontend?: AgentSettings;\n documentWriter?: AgentSettings;\n multimodalLooker?: AgentSettings;\n explore?: AgentSettings;\n overrides?: Record<string, AgentSettings>;\n };\n custom?: CustomModelDefinition[];\n };\n\n // ============================================================================\n // New v0.3.0+ Configuration (optional during migration, required in v0.4.0)\n // ============================================================================\n\n /** GitHub Issues integration (new in v0.3.0) */\n github?: GitHubConfig;\n /** TDD cycle enforcement (new in v0.3.0) */\n tdd?: TddConfig;\n /** Event Modeling integration (new in v0.3.0) */\n eventModeling?: EventModelingConfig;\n /** Git workflow configuration (new in v0.3.0) */\n git?: GitConfig;\n\n // ============================================================================\n // Legacy BMAD Configuration (deprecated, for backward compatibility)\n // ============================================================================\n\n /**\n * @deprecated Use `github` instead. Will be removed in v0.4.0.\n */\n bmad?: LegacyBmadConfig;\n\n // ============================================================================\n // Features and MCPs (unified structure supporting both old and new)\n // ============================================================================\n\n /** Feature flags */\n features: SdlcFeatures | LegacyFeatures;\n /** MCP server configuration */\n mcps: McpConfig | LegacyMcpConfig;\n /** Provider routing configuration */\n routing: RoutingConfig;\n}\n\n// ============================================================================\n// Legacy BMAD Configuration (Deprecated - for migration only)\n// ============================================================================\n\n/**\n * @deprecated Use GitHubConfig instead. BMAD configuration is no longer supported in v0.3.0+.\n */\nexport interface LegacyBmadConfig {\n defaultTrack: \"quick-flow\" | \"enterprise\";\n autoStatusUpdate: boolean;\n parallelIssueLimit: number;\n paths?: {\n prd?: string | null;\n architecture?: string | null;\n };\n}\n\n/**\n * @deprecated Use SdlcFeatures instead. Legacy feature flags from pre-0.3.0.\n */\nexport interface LegacyFeatures {\n bmadBridge: boolean;\n autoStatus: boolean;\n parallelExecution: boolean;\n notifications: boolean;\n contextMonitor: boolean;\n commentChecker: boolean;\n lspTools: boolean;\n autoGitOperations: boolean;\n todoSync: boolean;\n}\n\n/**\n * @deprecated Use McpConfig instead. Legacy MCP config from pre-0.3.0.\n */\nexport interface LegacyMcpConfig {\n context7: boolean;\n exa: boolean;\n grepApp: boolean;\n}\n\n/**\n * Prerequisites check result\n */\nexport interface Prerequisites {\n opencode: {\n installed: boolean;\n version?: string;\n compatible: boolean;\n };\n sdlc: {\n installed: boolean;\n version?: string;\n };\n node: {\n installed: boolean;\n version?: string;\n compatible: boolean;\n };\n}\n\n// ============================================================================\n// Plugin Types\n// ============================================================================\n\n// ============================================================================\n// Legacy BMAD Types (deprecated)\n// ============================================================================\n\n/**\n * @deprecated Use issue-based tracking instead of BMAD story statuses.\n */\nexport type BmadStoryStatus =\n | \"backlog\"\n | \"ready-for-dev\"\n | \"in-progress\"\n | \"review\"\n | \"done\"\n | \"blocked\";\n\n/**\n * @deprecated Use issue-based tracking instead of BMAD epic statuses.\n */\nexport type BmadEpicStatus = \"backlog\" | \"in-progress\" | \"done\";\n\n/**\n * @deprecated Use issue-based tracking instead of BMAD retrospective statuses.\n */\nexport type BmadRetroStatus = \"optional\" | \"done\";\n\n/**\n * @deprecated Use issue-based tracking instead of BMAD development status map.\n */\nexport type BmadDevelopmentStatus = BmadStoryStatus | BmadEpicStatus | BmadRetroStatus;\n\n/**\n * @deprecated Use issue-based tracking instead of BMAD sprint status files.\n */\nexport interface BmadSprintStatus {\n generated?: string;\n project?: string;\n project_key?: string;\n tracking_system?: string;\n story_location?: string;\n current_story?: string | null;\n last_modified?: string;\n development_status: Record<string, BmadDevelopmentStatus>;\n}\n\n/**\n * @deprecated Use issue-based tracking instead of BMAD story keys.\n */\nexport interface ParsedStoryKey {\n epicNum: string;\n storyNum: string;\n titleSlug?: string;\n fullKey: string;\n normalizedId: string;\n}\n\n/**\n * @deprecated Use issue-based tracking instead of BMAD epic keys.\n */\nexport interface ParsedEpicKey {\n epicNum: string;\n fullKey: string;\n}\n\n/**\n * @deprecated Use issue-based tracking instead of BMAD retrospective keys.\n */\nexport interface ParsedRetroKey {\n epicNum: string;\n fullKey: string;\n}\n\n/**\n * @deprecated Use issue-based tracking instead of BMAD key parsing.\n */\nexport type DevelopmentKeyType = \"story\" | \"epic\" | \"retrospective\" | \"unknown\";\n\n/**\n * @deprecated Use issue-based tracking instead of BMAD key parsing.\n */\nexport type ParsedDevelopmentKey =\n | { type: \"story\"; parsed: ParsedStoryKey }\n | { type: \"epic\"; parsed: ParsedEpicKey }\n | { type: \"retrospective\"; parsed: ParsedRetroKey }\n | { type: \"unknown\"; key: string };\n\n/**\n * Tracked GitHub issue state\n */\nexport interface TrackedIssue {\n issueNumber: number;\n title: string;\n status: string;\n startedAt: string;\n completedAt?: string;\n url?: string;\n body?: string | null;\n}\n\n/**\n * Issue tracker persistent state\n */\nexport interface IssueTrackerState {\n currentIssue: TrackedIssue | null;\n sessionId: string;\n projectDir: string;\n history: Array<{\n issueNumber: number;\n status: string;\n timestamp: string;\n }>;\n currentTodos?: OpenCodeTodo[];\n}\n\n// ============================================================================\n// Tool Result Types\n// ============================================================================\n\n/**\n * Result from sdlc_get_issue tool\n */\nexport interface GetIssueResult {\n issueNumber?: number;\n title?: string;\n body?: string;\n url?: string;\n status?: string;\n acceptanceCriteria?: Array<{ id: string; text: string; checked: boolean }>;\n instructions?: string;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Result from sdlc_update_issue_status tool\n */\nexport interface UpdateIssueStatusResult {\n success?: boolean;\n issueNumber?: number;\n newStatus?: string;\n updatedAt?: string;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Result from sdlc_list_issues tool\n */\nexport interface ListIssuesResult {\n success?: boolean;\n issues?: Array<{ number: number; title: string; status: string; url?: string }>;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Issue tracker persistent state\n */\nexport interface IssueTrackerState {\n currentIssue: TrackedIssue | null;\n sessionId: string;\n projectDir: string;\n history: Array<{\n issueNumber: number;\n status: string;\n timestamp: string;\n }>;\n currentTodos?: OpenCodeTodo[];\n}\n\n// ============================================================================\n// Tool Result Types\n// ============================================================================\n\n/**\n * Result from sdlc_get_issue tool\n */\nexport interface GetIssueResult {\n issueNumber?: number;\n title?: string;\n body?: string;\n url?: string;\n status?: string;\n acceptanceCriteria?: Array<{ id: string; text: string; checked: boolean }>;\n instructions?: string;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Result from sdlc_update_issue_status tool\n */\nexport interface UpdateIssueStatusResult {\n success?: boolean;\n issueNumber?: number;\n newStatus?: string;\n updatedAt?: string;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Result from sdlc_list_issues tool\n */\nexport interface ListIssuesResult {\n success?: boolean;\n issues?: Array<{ number: number; title: string; status: string; url?: string }>;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * @deprecated Result from sdlc_update_status tool (BMAD)\n */\n\n// ============================================================================\n// Party Review Types\n// ============================================================================\n\n/**\n * Scope of a party review\n */\nexport type ReviewScope = \"issue\" | \"multi-issue\";\n\n/**\n * Severity level of a review finding\n */\nexport type FindingSeverity = \"high\" | \"medium\" | \"low\";\n\n/**\n * Category of a review finding\n */\nexport type FindingCategory = \"security\" | \"logic\" | \"bestPractices\" | \"performance\";\n\n/**\n * User decision on a finding\n */\nexport type ReviewDecision = \"accept\" | \"defer\" | \"reject\" | \"pending\";\n\n/**\n * A single party review finding\n */\nexport interface PartyReviewFinding {\n id: string;\n category: FindingCategory;\n severity: FindingSeverity;\n title: string;\n description: string;\n impact: string;\n suggestion: string;\n issueId?: string;\n fileReference?: string;\n lineNumber?: number;\n decision?: ReviewDecision;\n decisionReason?: string;\n deferredTo?: string;\n}\n\n/**\n * Findings grouped by story\n */\nexport interface IssueFindings {\n issueId: string;\n title: string;\n findings: {\n security: PartyReviewFinding[];\n logic: PartyReviewFinding[];\n bestPractices: PartyReviewFinding[];\n performance: PartyReviewFinding[];\n };\n summary: {\n total: number;\n high: number;\n medium: number;\n low: number;\n };\n}\n\n/**\n * Cross-issue issues found in multi-issue reviews\n */\nexport interface CrossIssueIssue {\n id: string;\n category: FindingCategory;\n severity: FindingSeverity;\n title: string;\n description: string;\n affectedIssues: string[];\n suggestion: string;\n decision?: ReviewDecision;\n decisionReason?: string;\n}\n\n/**\n * Model complexity assessment result\n */\nexport interface IssueComplexity {\n isSimple: boolean;\n reason: string;\n recommendedModel: string;\n factors: {\n acceptanceCriteriaCount: number;\n hasSecurityConcerns: boolean;\n hasDataModelChanges: boolean;\n hasApiChanges: boolean;\n isCrudOnly: boolean;\n };\n}\n\n/**\n * Reference to another review document\n */\nexport interface ReviewDocumentReference {\n type: \"epic\" | \"focused\";\n filePath: string;\n date: string;\n findingsCount: number;\n acceptedCount: number;\n deferredCount: number;\n rejectedCount: number;\n}\n\n/**\n * Complete party review document structure\n */\nexport interface PartyReviewDocument {\n scope: ReviewScope;\n identifier: string;\n date: string;\n reviewer: string;\n relatedReviews?: ReviewDocumentReference[];\n summary: {\n totalIssues: number;\n highSeverity: number;\n mediumSeverity: number;\n lowSeverity: number;\n recommendation: string;\n };\n issueFindings?: IssueFindings[];\n crossIssueIssues?: CrossIssueIssue[];\n previousFindings?: {\n accepted: PartyReviewFinding[];\n deferred: PartyReviewFinding[];\n rejected: PartyReviewFinding[];\n };\n newFindings?: {\n security: PartyReviewFinding[];\n logic: PartyReviewFinding[];\n bestPractices: PartyReviewFinding[];\n performance: PartyReviewFinding[];\n };\n oracleAnalysis?: string;\n}\n\n/**\n * Complete result from applying all decisions\n */\nexport interface ApplyDecisionsResult {\n /** Overall success (true even if some individual updates failed) */\n success: boolean;\n /** Whether the review document was updated */\n reviewDocumentUpdated: boolean;\n /** Issue bodies that were updated */\n issuesUpdated?: Array<{ issueNumber: number; appliedDecisions: number }>;\n /** Summary counts */\n summary: {\n accepted: number;\n deferred: number;\n rejected: number;\n issuesModified?: number;\n };\n /** Warnings (e.g., vague defer targets) */\n warnings?: string[];\n /** Error if complete failure */\n error?: string;\n}\n\n// ============================================================================\n// Enhanced Party Review Types (3-Phase Architecture)\n// ============================================================================\n\n/**\n * BMAD agent types that can participate in party review\n */\nexport type BmadAgentType =\n | \"architect\"\n | \"dev\"\n | \"tea\"\n | \"pm\"\n | \"analyst\"\n | \"ux-designer\"\n | \"tech-writer\"\n | \"sm\";\n\n/**\n * BMAD agent persona details\n */\nexport interface BmadAgentPersona {\n type: BmadAgentType;\n name: string;\n title: string;\n expertise: string[];\n perspective: string;\n}\n\n/**\n * Mapping of BMAD agents with their personas\n */\nexport const BMAD_AGENTS: Record<BmadAgentType, BmadAgentPersona> = {\n architect: {\n type: \"architect\",\n name: \"Winston\",\n title: \"Software Architect\",\n expertise: [\"system design\", \"security architecture\", \"scalability\", \"technical debt\"],\n perspective: \"architecture and system design\",\n },\n dev: {\n type: \"dev\",\n name: \"Amelia\",\n title: \"Senior Developer\",\n expertise: [\"implementation\", \"code quality\", \"debugging\", \"performance optimization\"],\n perspective: \"implementation feasibility and code quality\",\n },\n tea: {\n type: \"tea\",\n name: \"Murat\",\n title: \"Test Engineer\",\n expertise: [\"testing strategy\", \"edge cases\", \"test automation\", \"quality assurance\"],\n perspective: \"testability and quality assurance\",\n },\n pm: {\n type: \"pm\",\n name: \"John\",\n title: \"Product Manager\",\n expertise: [\"requirements\", \"stakeholder needs\", \"prioritization\", \"business value\"],\n perspective: \"business impact and stakeholder value\",\n },\n analyst: {\n type: \"analyst\",\n name: \"Mary\",\n title: \"Business Analyst\",\n expertise: [\"requirements analysis\", \"user stories\", \"acceptance criteria\", \"edge cases\"],\n perspective: \"requirements completeness and clarity\",\n },\n \"ux-designer\": {\n type: \"ux-designer\",\n name: \"Sally\",\n title: \"UX Designer\",\n expertise: [\"user experience\", \"accessibility\", \"usability\", \"user flows\"],\n perspective: \"user experience and accessibility\",\n },\n \"tech-writer\": {\n type: \"tech-writer\",\n name: \"Paige\",\n title: \"Technical Writer\",\n expertise: [\"documentation\", \"API docs\", \"user guides\", \"clarity\"],\n perspective: \"documentation and clarity\",\n },\n sm: {\n type: \"sm\",\n name: \"Bob\",\n title: \"Scrum Master\",\n expertise: [\"process\", \"team dynamics\", \"sprint planning\", \"blockers\"],\n perspective: \"process and team coordination\",\n },\n};\n\n/**\n * Agent recommendation with reasoning\n */\nexport interface AgentRecommendation {\n agent: BmadAgentType;\n reason: string;\n relevantFindings: string[];\n priority: \"required\" | \"recommended\" | \"optional\";\n}\n\n/**\n * Cross-story pattern identified by an agent\n */\nexport interface CrossStoryPattern {\n id?: string;\n pattern: string;\n affectedStories: string[];\n severity?: FindingSeverity;\n recommendation: string;\n}\n\n/**\n * Single agent's analysis output (Phase 2)\n */\nexport interface AgentAnalysis {\n agent: BmadAgentType;\n agentName?: string;\n analyzedAt?: string;\n storiesAnalyzed?: string[];\n perspective: string;\n findings: {\n agreements: string[];\n concerns: string[];\n suggestions: string[];\n };\n crossStoryPatterns: CrossStoryPattern[];\n prioritizedIssues: Array<{\n findingId: string;\n agentPriority: \"critical\" | \"important\" | \"minor\";\n rationale: string;\n }>;\n summary: string;\n}\n\n/**\n * Phase 1 context: Prepared by tool for Oracle invocation (before Oracle runs)\n */\nexport type Phase1Context = Phase1ContextSuccess | Phase1ContextError;\n\nexport interface Phase1ContextSuccess {\n success: true;\n scope: ReviewScope;\n identifier: string;\n reviewsDir: string;\n storiesContent: Array<{ id: string; content: string | null }>;\n architectureContent: string;\n oraclePrompt: string;\n selectedModel: string;\n complexity?: IssueComplexity;\n existingReviews?: ReviewDocumentReference[];\n}\n\nexport interface Phase1ContextError {\n success: false;\n scope: ReviewScope;\n identifier: string;\n error: string;\n suggestion?: string;\n}\n\n/**\n * Phase 1 summary: Minimal result returned to agent after Oracle analysis.\n * Large data (oracleAnalysis, storiesContent) is saved to file, not passed between tools.\n */\nexport interface Phase1Summary {\n success: boolean;\n scope: ReviewScope;\n identifier: string;\n error?: string;\n suggestion?: string;\n reviewFolderPath?: string;\n findings?: {\n total: number;\n high: number;\n medium: number;\n low: number;\n byCategory: Record<FindingCategory, number>;\n };\n recommendedAgents?: AgentRecommendation[];\n summary?: string;\n}\n\n/**\n * Phase 1 full data: Complete data saved to analysis.json file.\n * Includes large fields that should not be passed between tool calls.\n */\nexport interface Phase1FullData extends Phase1Summary {\n storiesContent?: Array<{ id: string; title?: string; content: string | null }>;\n architectureContent?: string;\n oracleAnalysis?: string;\n}\n\n/**\n * @deprecated Use Phase1Summary for tool returns, Phase1FullData for file storage\n */\nexport type Phase1Result = Phase1FullData;\n\n/**\n * Phase 2 result: Aggregated agent analyses\n */\nexport interface ConsensusPoint {\n topic: string;\n agents: BmadAgentType[];\n position: string;\n}\n\nexport interface DebatePoint {\n topic: string;\n positions: Array<{\n agent: BmadAgentType;\n position: string;\n }>;\n}\n\nexport interface AggregatedPriority {\n findingId: string;\n votes: Partial<Record<BmadAgentType, \"critical\" | \"important\" | \"minor\">>;\n consensusLevel: \"strong\" | \"moderate\" | \"disputed\";\n averagePriority: \"critical\" | \"important\" | \"minor\";\n}\n\nexport interface Phase2Result {\n success: boolean;\n identifier: string;\n agentAnalyses: AgentAnalysis[];\n consensusPoints: ConsensusPoint[];\n debatePoints: DebatePoint[];\n aggregatedPriorities: AggregatedPriority[];\n error?: string;\n}\n\n/**\n * Discussion context for Phase 3 party mode\n */\nexport interface DiscussionContext {\n scope: ReviewScope;\n identifier: string;\n issueIds: string[];\n phase1Summary: {\n totalFindings: number;\n highSeverity: number;\n reviewDocumentPath: string;\n };\n agentAnalyses: AgentAnalysis[];\n agendaItems: Array<{\n id: string;\n topic: string;\n type: \"consensus\" | \"debate\" | \"decision-needed\";\n relatedFindings: string[];\n agentPositions?: Record<BmadAgentType, string>;\n }>;\n preloadedContext: string;\n}\n\n/**\n * Final review session result\n */\nexport interface ReviewSessionResult {\n success: boolean;\n identifier: string;\n decisions: Record<string, ReviewDecision>;\n decisionSummary: {\n accepted: number;\n deferred: number;\n rejected: number;\n discussed: number;\n };\n issueUpdates: Array<{\n issueId: string;\n addedCriteria: string[];\n modifiedCriteria: string[];\n }>;\n actionItems: Array<{\n description: string;\n assignedTo?: BmadAgentType;\n deferredToIssue?: string;\n }>;\n sessionNotes: string;\n}\n\n// ============================================================================\n// Phase 3: Party Discussion Types\n// ============================================================================\n\n/**\n * Extended BMAD agent persona with full details from manifest\n */\nexport interface BmadAgentFullPersona extends BmadAgentPersona {\n icon: string;\n identity: string;\n communicationStyle: string;\n principles: string[];\n module?: string;\n}\n\n/**\n * Default full personas (fallback when BMAD manifest not available)\n */\nexport const BMAD_AGENT_FULL_PERSONAS: Record<BmadAgentType, BmadAgentFullPersona> = {\n architect: {\n type: \"architect\",\n name: \"Winston\",\n title: \"Software Architect\",\n icon: \"🏗️\",\n expertise: [\"system design\", \"security architecture\", \"scalability\", \"technical debt\"],\n perspective: \"architecture and system design\",\n identity:\n \"Senior architect with expertise in distributed systems, cloud infrastructure, and API design. Specializes in scalable patterns and technology selection.\",\n communicationStyle:\n \"Speaks in calm, pragmatic tones, balancing 'what could be' with 'what should be.' Champions boring technology that actually works.\",\n principles: [\n \"User journeys drive technical decisions\",\n \"Embrace boring technology for stability\",\n \"Design simple solutions that scale when needed\",\n \"Developer productivity is architecture\",\n ],\n },\n dev: {\n type: \"dev\",\n name: \"Amelia\",\n title: \"Senior Developer\",\n icon: \"💻\",\n expertise: [\"implementation\", \"code quality\", \"debugging\", \"performance optimization\"],\n perspective: \"implementation feasibility and code quality\",\n identity:\n \"Elite developer who thrives on clean implementations. Lives for readable code, sensible abstractions, and solutions that actually work in production.\",\n communicationStyle:\n \"Ultra-succinct. Speaks in file paths and AC IDs - every statement citable. No fluff, all precision.\",\n principles: [\n \"Code should be readable by humans first\",\n \"Ship incrementally, validate continuously\",\n \"Tests are documentation\",\n \"Complexity is the enemy\",\n ],\n },\n tea: {\n type: \"tea\",\n name: \"Murat\",\n title: \"Test Engineer Advocate\",\n icon: \"🧪\",\n expertise: [\"testing strategy\", \"edge cases\", \"test automation\", \"quality assurance\"],\n perspective: \"testability and quality assurance\",\n identity:\n \"Master test architect who sees quality as everyone's responsibility. Blends data with gut instinct to find bugs before they find users.\",\n communicationStyle:\n \"Blends data with gut instinct. 'Strong opinions, weakly held' is their mantra. Speaks in risk calculations and impact assessments.\",\n principles: [\n \"Test the behavior, not the implementation\",\n \"Edge cases reveal system character\",\n \"Automation enables confidence\",\n \"Quality is prevention, not detection\",\n ],\n },\n pm: {\n type: \"pm\",\n name: \"John\",\n title: \"Product Manager\",\n icon: \"📋\",\n expertise: [\"requirements\", \"stakeholder needs\", \"prioritization\", \"business value\"],\n perspective: \"business impact and stakeholder value\",\n identity:\n \"Investigative product strategist who asks 'WHY?' relentlessly. Connects every feature to user value and business outcomes.\",\n communicationStyle:\n \"Asks 'WHY?' relentlessly like a detective on a case. Direct and data-sharp, cuts through fluff to what actually matters.\",\n principles: [\n \"User problems drive solutions\",\n \"Data informs, intuition guides\",\n \"MVP means minimum VIABLE\",\n \"Say no to protect yes\",\n ],\n },\n analyst: {\n type: \"analyst\",\n name: \"Mary\",\n title: \"Business Analyst\",\n icon: \"📊\",\n expertise: [\"requirements analysis\", \"user stories\", \"acceptance criteria\", \"edge cases\"],\n perspective: \"requirements completeness and clarity\",\n identity:\n \"Strategic analyst who treats requirements like treasure hunts. Excited by patterns, thrilled when ambiguity becomes clarity.\",\n communicationStyle:\n \"Treats analysis like a treasure hunt - excited by every clue, thrilled when patterns emerge. Asks questions that spark 'aha!' moments.\",\n principles: [\n \"Ambiguity is the enemy of delivery\",\n \"Edge cases reveal true requirements\",\n \"Stakeholders often know what they need, not what they want\",\n \"Document decisions, not just outcomes\",\n ],\n },\n \"ux-designer\": {\n type: \"ux-designer\",\n name: \"Sally\",\n title: \"UX Designer\",\n icon: \"🎨\",\n expertise: [\"user experience\", \"accessibility\", \"usability\", \"user flows\"],\n perspective: \"user experience and accessibility\",\n identity:\n \"User advocate who designs experiences, not just interfaces. Champions accessibility and believes good UX is invisible.\",\n communicationStyle:\n \"Empathetic and user-focused. Uses stories and scenarios to illustrate points. Gentle but firm on accessibility.\",\n principles: [\n \"Design for the edges, the middle takes care of itself\",\n \"Accessibility is not optional\",\n \"Users don't read, they scan\",\n \"Friction is the enemy of conversion\",\n ],\n },\n \"tech-writer\": {\n type: \"tech-writer\",\n name: \"Paige\",\n title: \"Technical Writer\",\n icon: \"📚\",\n expertise: [\"documentation\", \"API docs\", \"user guides\", \"clarity\"],\n perspective: \"documentation and clarity\",\n identity:\n \"Knowledge curator who makes complex simple. Believes documentation is a product feature, not an afterthought.\",\n communicationStyle:\n \"Patient educator who explains like teaching a friend. Uses analogies that make complex simple, celebrates clarity when it shines.\",\n principles: [\n \"If it's not documented, it doesn't exist\",\n \"Good docs prevent support tickets\",\n \"Examples are worth a thousand words\",\n \"Write for the reader, not the writer\",\n ],\n },\n sm: {\n type: \"sm\",\n name: \"Bob\",\n title: \"Scrum Master\",\n icon: \"🎯\",\n expertise: [\"process\", \"team dynamics\", \"sprint planning\", \"blockers\"],\n perspective: \"process and team coordination\",\n identity:\n \"Servant leader who removes blockers and protects team focus. Facilitates rather than dictates.\",\n communicationStyle:\n \"Facilitative and inclusive. Asks powerful questions rather than giving answers. Celebrates team wins.\",\n principles: [\n \"The team knows best\",\n \"Process serves people, not vice versa\",\n \"Blockers are opportunities for improvement\",\n \"Sustainable pace enables sustainable delivery\",\n ],\n },\n};\n\n/**\n * Input for the party discussion tool\n */\nexport interface PartyDiscussionInput {\n /** Phase 1 results with Oracle findings */\n phase1Result: Phase1Result;\n /** Phase 2 agent analyses */\n phase2Result: Phase2Result;\n /** Stories content for context */\n storiesContent: Array<{ id: string; content: string }>;\n /** Optional: specific findings to discuss (defaults to all high severity + disputed) */\n findingsToDiscuss?: string[];\n}\n\n/**\n * A single agent's response in a discussion round\n */\nexport interface AgentDiscussionResponse {\n agent: BmadAgentType;\n agentName: string;\n icon: string;\n response: string;\n /** References to other agents in cross-talk */\n references?: Array<{\n agent: BmadAgentType;\n type: \"agrees\" | \"disagrees\" | \"builds-on\" | \"questions\";\n }>;\n /** Key points extracted from response */\n keyPoints: string[];\n}\n\n/**\n * A complete discussion round for a single finding\n */\nexport interface DiscussionRound {\n findingId: string;\n findingTitle: string;\n findingSeverity: FindingSeverity;\n findingCategory: FindingCategory;\n /** Agents who participated in this round */\n participants: BmadAgentType[];\n /** Agent responses in order */\n responses: AgentDiscussionResponse[];\n /** User's decision for this finding */\n decision?: ReviewDecision;\n /** User's reasoning for the decision */\n decisionReason?: string;\n /** If deferred, where to */\n deferredTo?: string;\n}\n\n/**\n * Discussion agenda item\n */\nexport interface DiscussionAgendaItem {\n id: string;\n findingId: string;\n topic: string;\n type: \"high-severity\" | \"disputed\" | \"cross-story\" | \"consensus\";\n severity: FindingSeverity;\n category: FindingCategory;\n /** Agents relevant to this topic */\n relevantAgents: BmadAgentType[];\n /** Pre-existing agent positions from Phase 2 */\n agentPositions: Partial<Record<BmadAgentType, string>>;\n /** Whether this item has been discussed */\n discussed: boolean;\n /** The discussion round if discussed */\n round?: DiscussionRound;\n}\n\n/**\n * Current state of the party discussion\n */\nexport interface PartyDiscussionState {\n /** Unique session ID */\n sessionId: string;\n /** Review scope */\n scope: ReviewScope;\n /** Epic or story identifier */\n identifier: string;\n /** Current agenda items */\n agenda: DiscussionAgendaItem[];\n /** Index of current agenda item */\n currentItemIndex: number;\n /** Completed discussion rounds */\n completedRounds: DiscussionRound[];\n /** Participating agents for this session */\n activeAgents: BmadAgentType[];\n /** When the discussion started */\n startedAt: string;\n /** Phase data for context */\n phase1Summary: Phase1Result[\"findings\"];\n phase2Summary?: {\n consensusCount: number;\n disputeCount: number;\n };\n}\n\n/**\n * Result from the party discussion tool\n */\nexport interface PartyDiscussionResult {\n success: boolean;\n /** Session ID for continuation */\n sessionId: string;\n /** Current state of the discussion */\n state: PartyDiscussionState;\n /** Current agenda item to display */\n currentItem?: DiscussionAgendaItem;\n /** Agent responses for current item (if generating discussion) */\n currentResponses?: AgentDiscussionResponse[];\n /** Summary when discussion is complete */\n summary?: {\n totalDiscussed: number;\n decisions: {\n accepted: number;\n deferred: number;\n rejected: number;\n pending: number;\n };\n /** Issue updates implied by decisions */\n issueUpdatesNeeded: Array<{\n issueId: string;\n additions: string[];\n }>;\n };\n /** Result of automatically applying decisions to issues (on \"end\" action) */\n appliedUpdates?: ApplyDecisionsResult;\n /** Whether more items remain */\n hasMoreItems: boolean;\n /** Error if failed */\n error?: string;\n /** Suggestion for resolving error */\n suggestion?: string;\n}\n\n/**\n * Action to take in party discussion\n */\nexport type PartyDiscussionAction =\n | { type: \"start\"; input: PartyDiscussionInput }\n | { type: \"continue\"; sessionId: string }\n | {\n type: \"decide\";\n sessionId: string;\n findingId: string;\n decision: ReviewDecision;\n reason?: string;\n deferredTo?: string;\n }\n | { type: \"skip\"; sessionId: string; findingId: string }\n | { type: \"end\"; sessionId: string };\n\n// ============================================================================\n// Todo Sync Types\n// ============================================================================\n\n/**\n * OpenCode todo item format (matches oh-my-opencode/OpenCode schema)\n */\nexport interface OpenCodeTodo {\n /** Unique identifier for the todo item */\n id: string;\n /** Brief description of the task */\n content: string;\n /** Current status of the task */\n status: TodoStatus;\n /** Priority level of the task */\n priority: TodoPriority;\n}\n\n/**\n * Valid todo status values\n */\nexport type TodoStatus = \"pending\" | \"in_progress\" | \"completed\" | \"cancelled\";\n\n/**\n * Valid todo priority values\n */\nexport type TodoPriority = \"high\" | \"medium\" | \"low\";\n\n/**\n * Parsed todo ID components\n */\nexport interface ParsedTodoId {\n /** Issue number (e.g., 42) */\n issueNumber: number;\n /** Section token from todo ID */\n section: string;\n /** Line number hint (may have shifted) */\n lineHint: number;\n}\n\n/**\n * Match type for todo matching\n */\nexport type TodoMatchType = \"id\" | \"exact-content\" | \"similar-content\" | \"none\";\n\n/**\n * Confidence thresholds for todo matching\n */\nexport const TODO_MATCH_THRESHOLDS = {\n AUTO_UPDATE: 0.7,\n WARN_USER: 0.5,\n} as const;\n\n/**\n * Result of attempting to match a todo with a previous todo\n */\nexport interface TodoMatchResult {\n /** The matched todo, if any */\n matched: OpenCodeTodo | null;\n /** How the match was found */\n matchType: TodoMatchType;\n /** Confidence score (0-1) */\n confidence: number;\n}\n\n// ============================================================================\n// Story Complexity & Decomposition Types\n// ============================================================================\n\n/**\n * Effort level for a task (maps to Fibonacci-ish points)\n */\nexport type TaskEffortLevel = \"trivial\" | \"small\" | \"medium\" | \"large\" | \"xlarge\";\n\n/**\n * Points mapping for effort levels\n */\nexport const EFFORT_POINTS: Record<TaskEffortLevel, number> = {\n trivial: 1,\n small: 2,\n medium: 3,\n large: 5,\n xlarge: 8,\n};\n\n/**\n * A parsed subtask from a story file\n */\nexport interface ParsedSubtask {\n /** Subtask ID within task (e.g., \"1.1\", \"1.2\") */\n id: string;\n /** Subtask description */\n description: string;\n /** Whether the checkbox is checked */\n completed: boolean;\n /** Line number in file (1-based) */\n lineNumber: number;\n}\n\n/**\n * A parsed task from a story file\n */\nexport interface ParsedTask {\n /** Task ID (e.g., \"1\", \"2\", \"3\") */\n id: string;\n /** Task description */\n description: string;\n /** Subtasks belonging to this task */\n subtasks: ParsedSubtask[];\n /** Whether the main task checkbox is checked */\n completed: boolean;\n /** Line number in file (1-based) */\n lineNumber: number;\n}\n\n/**\n * Effort estimate for a single task\n */\nexport interface TaskEffortEstimate {\n /** Task ID */\n taskId: string;\n /** Task description */\n description: string;\n /** Estimated effort level */\n effort: TaskEffortLevel;\n /** Story points (1, 2, 3, 5, 8) */\n points: number;\n /** Signals that contributed to this estimate */\n signals: string[];\n}\n","import { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport type { BmadAgentFullPersona, BmadAgentType } from \"../../shared/types.js\";\nimport { BMAD_AGENT_FULL_PERSONAS } from \"../../shared/types.js\";\nimport { createPluginLogger } from \"./plugin-logger.js\";\n\nconst log = createPluginLogger(\"persona-loader\");\n\ninterface BmadAgentYaml {\n agent: {\n metadata: {\n id: string;\n name: string;\n title: string;\n icon: string;\n module?: string;\n };\n persona: {\n role: string;\n identity: string;\n communication_style: string;\n principles: string;\n };\n };\n}\n\nfunction filenameToAgentType(filename: string): BmadAgentType | null {\n const base = basename(filename, \".agent.yaml\");\n\n const typeMap: Record<string, BmadAgentType> = {\n analyst: \"analyst\",\n architect: \"architect\",\n dev: \"dev\",\n pm: \"pm\",\n sm: \"sm\",\n tea: \"tea\",\n \"tech-writer\": \"tech-writer\",\n \"ux-designer\": \"ux-designer\",\n };\n\n return typeMap[base] || null;\n}\n\nfunction parsePrinciples(principlesText: string): string[] {\n const lines = principlesText\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean);\n\n return lines\n .filter((line) => line.startsWith(\"-\"))\n .map((line) => line.substring(1).trim())\n .filter(Boolean);\n}\n\n/**\n * Parse a BMAD agent YAML file into a persona object.\n *\n * YAML-to-TypeScript field mappings:\n * - agent.persona.role → persona.perspective\n * - agent.persona.communication_style → persona.communicationStyle\n *\n * Falls back to built-in personas for missing or invalid fields.\n */\nasync function parseAgentYaml(\n filePath: string\n): Promise<{ type: BmadAgentType; persona: BmadAgentFullPersona } | null> {\n const agentType = filenameToAgentType(filePath);\n if (!agentType) {\n return null;\n }\n\n try {\n const content = await readFile(filePath, \"utf-8\");\n const data = parseYaml(content) as BmadAgentYaml;\n\n if (!data?.agent?.metadata || !data?.agent?.persona) {\n return null;\n }\n\n const { metadata, persona: personaData } = data.agent;\n const fallback = BMAD_AGENT_FULL_PERSONAS[agentType];\n\n const principles = personaData.principles\n ? parsePrinciples(personaData.principles)\n : fallback.principles;\n\n const persona: BmadAgentFullPersona = {\n type: agentType,\n name: metadata.name || fallback.name,\n title: metadata.title || fallback.title,\n icon: metadata.icon || fallback.icon,\n expertise: fallback.expertise,\n perspective: personaData.role || fallback.perspective,\n identity: personaData.identity || fallback.identity,\n communicationStyle: personaData.communication_style || fallback.communicationStyle,\n principles,\n };\n\n return { type: agentType, persona };\n } catch (error) {\n log.warn(\"Failed to parse agent YAML file\", {\n filePath,\n error: error instanceof Error ? error.message : \"Unknown error\",\n });\n return null;\n }\n}\n\nasync function loadFromYamlFiles(\n agentFiles: string[]\n): Promise<Map<BmadAgentType, BmadAgentFullPersona>> {\n const personas = new Map<BmadAgentType, BmadAgentFullPersona>();\n\n for (const filePath of agentFiles) {\n const result = await parseAgentYaml(filePath);\n if (result) {\n personas.set(result.type, result.persona);\n }\n }\n\n return personas;\n}\n\nexport async function loadPersonas(): Promise<Map<BmadAgentType, BmadAgentFullPersona>> {\n return new Map(\n Object.entries(BMAD_AGENT_FULL_PERSONAS) as [BmadAgentType, BmadAgentFullPersona][]\n );\n}\n\nexport function getPersona(\n personas: Map<BmadAgentType, BmadAgentFullPersona>,\n agentType: BmadAgentType\n): BmadAgentFullPersona {\n return personas.get(agentType) || BMAD_AGENT_FULL_PERSONAS[agentType];\n}\n\nexport function selectAgentsForFinding(category: string, severity: string): BmadAgentType[] {\n const agents: BmadAgentType[] = [];\n\n switch (category) {\n case \"security\":\n agents.push(\"architect\", \"dev\", \"tea\");\n break;\n case \"logic\":\n agents.push(\"dev\", \"tea\", \"analyst\");\n break;\n case \"performance\":\n agents.push(\"architect\", \"dev\");\n break;\n case \"bestPractices\":\n agents.push(\"dev\", \"tech-writer\");\n break;\n default:\n agents.push(\"dev\", \"architect\");\n }\n\n if (severity === \"high\" && !agents.includes(\"pm\")) {\n agents.push(\"pm\");\n }\n\n return agents.slice(0, 3);\n}\n\nexport function buildAgentSystemPrompt(\n persona: BmadAgentFullPersona,\n phase2Analysis?: string\n): string {\n const principlesList = persona.principles.map((p) => `- ${p}`).join(\"\\n\");\n\n let prompt = `You are ${persona.name}, the ${persona.title} from the BMAD team.\n\n**Your Icon**: ${persona.icon}\n**Your Expertise**: ${persona.expertise.join(\", \")}\n**Your Perspective**: ${persona.perspective}\n\n**Your Identity**:\n${persona.identity}\n\n**Your Communication Style**:\n${persona.communicationStyle}\n\n**Your Principles**:\n${principlesList}\n\n**Response Guidelines**:\n- Stay in character as ${persona.name}\n- Speak from your ${persona.perspective} perspective\n- Be concise but substantive (2-4 sentences per point)\n- Reference other agents by name when building on or disagreeing with their points\n- Use your icon ${persona.icon} at the start of your responses`;\n\n if (phase2Analysis) {\n prompt += `\n\n**Your Previous Analysis** (from Phase 2):\n${phase2Analysis}\n\nUse your previous analysis to inform this discussion. You already have context on these findings.`;\n }\n\n return prompt;\n}\n\nexport const _testExports = {\n filenameToAgentType,\n parsePrinciples,\n parseAgentYaml,\n loadFromYamlFiles,\n};\n","import { randomUUID } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type {\n AgentDiscussionResponse,\n BmadAgentFullPersona,\n BmadAgentType,\n DiscussionAgendaItem,\n DiscussionRound,\n FindingCategory,\n FindingSeverity,\n PartyDiscussionResult,\n PartyDiscussionState,\n Phase1FullData,\n Phase2Result,\n ReviewDecision,\n SdlcConfig,\n} from \"../../shared/types.js\";\nimport { applyIssueDecisions } from \"../utils/issue-review-updater.js\";\nimport { extractAllFindings, parseOracleResponse } from \"../utils/oracle-parser.js\";\nimport { getPersona, loadPersonas, selectAgentsForFinding } from \"../utils/persona-loader.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\n\nconst log = createPluginLogger(\"party-discussion\");\nconst SESSION_TTL_MS = 30 * 60 * 1000;\nconst MAX_SESSIONS = 10;\n\ninterface SessionWithMeta {\n state: PartyDiscussionState;\n lastAccessedAt: number;\n reviewFolderPath?: string;\n phase2?: Phase2Result;\n}\n\nconst activeSessions = new Map<string, SessionWithMeta>();\n\nfunction cleanupStaleSessions(): void {\n const now = Date.now();\n const sessionsToDelete: string[] = [];\n\n for (const [id, session] of activeSessions) {\n if (now - session.lastAccessedAt > SESSION_TTL_MS) {\n sessionsToDelete.push(id);\n }\n }\n\n for (const id of sessionsToDelete) {\n activeSessions.delete(id);\n }\n\n const capacityThreshold = Math.ceil(MAX_SESSIONS * 0.8);\n if (activeSessions.size >= capacityThreshold && activeSessions.size < MAX_SESSIONS) {\n log.warn(\"Party discussion session capacity warning\", {\n currentSessions: activeSessions.size,\n maxSessions: MAX_SESSIONS,\n utilizationPercent: Math.round((activeSessions.size / MAX_SESSIONS) * 100),\n message: \"Approaching session limit. Oldest sessions will be evicted when limit is reached.\",\n });\n }\n\n if (activeSessions.size > MAX_SESSIONS) {\n const sortedSessions = Array.from(activeSessions.entries()).sort(\n (a, b) => a[1].lastAccessedAt - b[1].lastAccessedAt\n );\n\n const toRemove = sortedSessions.slice(0, activeSessions.size - MAX_SESSIONS);\n for (const [id] of toRemove) {\n activeSessions.delete(id);\n }\n }\n}\n\nfunction getSession(sessionId: string): PartyDiscussionState | null {\n const session = activeSessions.get(sessionId);\n if (!session) return null;\n\n session.lastAccessedAt = Date.now();\n return session.state;\n}\n\nfunction getSessionWithMeta(sessionId: string): SessionWithMeta | null {\n const session = activeSessions.get(sessionId);\n if (!session) return null;\n\n session.lastAccessedAt = Date.now();\n return session;\n}\n\nfunction setSession(\n state: PartyDiscussionState,\n reviewFolderPath?: string,\n phase2?: Phase2Result\n): void {\n activeSessions.set(state.sessionId, {\n state,\n lastAccessedAt: Date.now(),\n reviewFolderPath,\n phase2,\n });\n}\n\nfunction buildAgenda(phase1: Phase1FullData, phase2?: Phase2Result): DiscussionAgendaItem[] {\n const agenda: DiscussionAgendaItem[] = [];\n\n const highSeverityFindings = extractHighSeverityFindings(phase1);\n for (const finding of highSeverityFindings) {\n const agentPositions = phase2 ? getAgentPositionsForFinding(finding.id, phase2) : {};\n agenda.push({\n id: `agenda-${finding.id}`,\n findingId: finding.id,\n topic: finding.title,\n type: \"high-severity\",\n severity: finding.severity,\n category: finding.category,\n relevantAgents: selectAgentsForFinding(finding.category, finding.severity),\n agentPositions,\n discussed: false,\n });\n }\n\n if (phase2) {\n for (const debate of phase2.debatePoints) {\n const existingItem = agenda.find((a) => a.topic === debate.topic);\n if (!existingItem) {\n const positions: Partial<Record<BmadAgentType, string>> = {};\n for (const pos of debate.positions) {\n positions[pos.agent] = pos.position;\n }\n agenda.push({\n id: `agenda-debate-${agenda.length}`,\n findingId: `debate-${agenda.length}`,\n topic: debate.topic,\n type: \"disputed\",\n severity: \"medium\",\n category: \"logic\",\n relevantAgents: debate.positions.map((p) => p.agent),\n agentPositions: positions,\n discussed: false,\n });\n }\n }\n }\n\n return agenda;\n}\n\ninterface FindingInfo {\n id: string;\n title: string;\n severity: FindingSeverity;\n category: FindingCategory;\n}\n\nfunction extractHighSeverityFindings(phase1: Phase1FullData): FindingInfo[] {\n const highCount = phase1.findings?.high ?? 0;\n\n // Handle missing oracleAnalysis gracefully\n if (!phase1.oracleAnalysis) {\n // Fallback to placeholder findings based on count\n if (highCount > 0) {\n return Array.from({ length: highCount }, (_, i) => ({\n id: `high-${i + 1}`,\n title: `High severity finding ${i + 1}`,\n severity: \"high\" as const,\n category: \"logic\" as FindingCategory,\n }));\n }\n return [];\n }\n\n // Use proper JSON parsing from oracle-parser\n const parsed = parseOracleResponse(phase1.oracleAnalysis);\n const allFindings = extractAllFindings(parsed);\n const highFindings = allFindings.filter((f) => f.severity === \"high\");\n\n if (highFindings.length > 0) {\n return highFindings.map((f, i) => ({\n id: f.id || `high-${i + 1}`,\n title: f.title,\n severity: \"high\" as const,\n category: f.category,\n }));\n }\n\n // Fallback if parsing didn't find high findings but count says otherwise\n if (highCount > 0) {\n return Array.from({ length: highCount }, (_, i) => ({\n id: `high-${i + 1}`,\n title: `High severity finding ${i + 1}`,\n severity: \"high\" as const,\n category: \"logic\" as FindingCategory,\n }));\n }\n\n return [];\n}\n\nfunction inferCategory(title: string): FindingCategory {\n const lower = title.toLowerCase();\n if (lower.includes(\"security\") || lower.includes(\"auth\") || lower.includes(\"pii\")) {\n return \"security\";\n }\n if (lower.includes(\"performance\") || lower.includes(\"query\") || lower.includes(\"cache\")) {\n return \"performance\";\n }\n if (lower.includes(\"test\") || lower.includes(\"pattern\") || lower.includes(\"practice\")) {\n return \"bestPractices\";\n }\n return \"logic\";\n}\n\nfunction getAgentPositionsForFinding(\n findingId: string,\n phase2: Phase2Result\n): Partial<Record<BmadAgentType, string>> {\n const positions: Partial<Record<BmadAgentType, string>> = {};\n\n for (const analysis of phase2.agentAnalyses) {\n const prioritized = analysis.prioritizedIssues.find((p) =>\n p.findingId.toLowerCase().includes(findingId.toLowerCase())\n );\n if (prioritized) {\n positions[analysis.agent] = `${prioritized.agentPriority}: ${prioritized.rationale}`;\n } else if (analysis.findings.concerns.length > 0) {\n positions[analysis.agent] = analysis.findings.concerns[0];\n }\n }\n\n return positions;\n}\n\nfunction initializeSession(\n phase1: Phase1FullData,\n phase2?: Phase2Result,\n reviewFolderPath?: string\n): PartyDiscussionState {\n const sessionId = randomUUID();\n const agenda = buildAgenda(phase1, phase2);\n\n const activeAgents = new Set<BmadAgentType>();\n for (const item of agenda) {\n for (const agent of item.relevantAgents) {\n activeAgents.add(agent);\n }\n }\n\n const state: PartyDiscussionState = {\n sessionId,\n scope: phase1.scope,\n identifier: phase1.identifier,\n agenda,\n currentItemIndex: 0,\n completedRounds: [],\n activeAgents: Array.from(activeAgents),\n startedAt: new Date().toISOString(),\n phase1Summary: phase1.findings ?? {\n total: 0,\n high: 0,\n medium: 0,\n low: 0,\n byCategory: {} as Record<FindingCategory, number>,\n },\n phase2Summary: phase2\n ? {\n consensusCount: phase2.consensusPoints.length,\n disputeCount: phase2.debatePoints.length,\n }\n : undefined,\n };\n\n setSession(state, reviewFolderPath, phase2);\n return state;\n}\n\nasync function generateAgentResponses(\n item: DiscussionAgendaItem,\n personas: Map<BmadAgentType, BmadAgentFullPersona>,\n phase2?: Phase2Result\n): Promise<AgentDiscussionResponse[]> {\n const responses: AgentDiscussionResponse[] = [];\n\n for (const agentType of item.relevantAgents) {\n const persona = getPersona(personas, agentType);\n\n const phase2Analysis = phase2?.agentAnalyses.find((a) => a.agent === agentType);\n const previousPosition = item.agentPositions[agentType];\n\n const response = generateInCharacterResponse(\n persona,\n item,\n previousPosition,\n phase2Analysis?.summary,\n responses\n );\n\n responses.push({\n agent: agentType,\n agentName: persona.name,\n icon: persona.icon,\n response,\n references: extractReferences(response, responses),\n keyPoints: extractKeyPoints(response),\n });\n }\n\n return responses;\n}\n\nfunction generateInCharacterResponse(\n persona: BmadAgentFullPersona,\n item: DiscussionAgendaItem,\n previousPosition?: string,\n phase2Summary?: string,\n previousResponses?: AgentDiscussionResponse[]\n): string {\n const intro = getResponseIntro(persona, item);\n const position = previousPosition || phase2Summary || getDefaultPosition(persona, item);\n const crossTalk = generateCrossTalk(persona, previousResponses);\n\n return `${intro} ${position}${crossTalk}`;\n}\n\nfunction getResponseIntro(persona: BmadAgentFullPersona, item: DiscussionAgendaItem): string {\n const intros: Record<BmadAgentType, string> = {\n architect: `From an architecture perspective on \"${item.topic}\":`,\n dev: `Looking at implementation for \"${item.topic}\":`,\n tea: `From a testing standpoint on \"${item.topic}\":`,\n pm: `Considering business impact of \"${item.topic}\":`,\n analyst: `Analyzing requirements around \"${item.topic}\":`,\n \"ux-designer\": `From a user experience view on \"${item.topic}\":`,\n \"tech-writer\": `Regarding documentation for \"${item.topic}\":`,\n sm: `From a process perspective on \"${item.topic}\":`,\n };\n\n return intros[persona.type] || `Regarding \"${item.topic}\":`;\n}\n\nfunction getDefaultPosition(_persona: BmadAgentFullPersona, item: DiscussionAgendaItem): string {\n if (item.severity === \"high\") {\n return `This is a ${item.severity} severity ${item.category} issue that needs attention before we proceed.`;\n }\n return `This ${item.category} concern should be addressed to maintain quality.`;\n}\n\nfunction generateCrossTalk(\n persona: BmadAgentFullPersona,\n previousResponses?: AgentDiscussionResponse[]\n): string {\n if (!previousResponses || previousResponses.length === 0) return \"\";\n\n const collaborativeTypes: BmadAgentType[] = [\"architect\", \"pm\", \"analyst\"];\n const shouldCrossTalk =\n previousResponses.length >= 1 && collaborativeTypes.includes(persona.type);\n\n if (shouldCrossTalk) {\n const lastResponse = previousResponses[previousResponses.length - 1];\n return ` Building on ${lastResponse.agentName}'s point, I'd add that we should prioritize this appropriately.`;\n }\n return \"\";\n}\n\nfunction extractReferences(\n response: string,\n previousResponses: AgentDiscussionResponse[]\n): AgentDiscussionResponse[\"references\"] {\n const references: AgentDiscussionResponse[\"references\"] = [];\n\n for (const prev of previousResponses) {\n if (response.includes(prev.agentName)) {\n const type = response.toLowerCase().includes(\"disagree\")\n ? \"disagrees\"\n : response.toLowerCase().includes(\"building on\")\n ? \"builds-on\"\n : \"agrees\";\n references.push({ agent: prev.agent, type });\n }\n }\n\n return references;\n}\n\nfunction extractKeyPoints(response: string): string[] {\n const sentences = response.split(/[.!?]+/).filter((s) => s.trim().length > 10);\n return sentences.slice(0, 2).map((s) => s.trim());\n}\n\nfunction recordDecision(\n state: PartyDiscussionState,\n findingId: string,\n decision: ReviewDecision,\n reason?: string,\n deferredTo?: string\n): PartyDiscussionState {\n const itemIndex = state.agenda.findIndex((a) => a.findingId === findingId);\n if (itemIndex === -1) return state;\n\n const item = state.agenda[itemIndex];\n item.discussed = true;\n\n const round: DiscussionRound = {\n findingId,\n findingTitle: item.topic,\n findingSeverity: item.severity,\n findingCategory: item.category,\n participants: item.relevantAgents,\n responses: [],\n decision,\n decisionReason: reason,\n deferredTo,\n };\n\n item.round = round;\n state.completedRounds.push(round);\n\n if (state.currentItemIndex === itemIndex) {\n state.currentItemIndex = findNextUndiscussedIndex(state);\n }\n\n return state;\n}\n\nfunction findNextUndiscussedIndex(state: PartyDiscussionState): number {\n for (let i = 0; i < state.agenda.length; i++) {\n if (!state.agenda[i].discussed) {\n return i;\n }\n }\n return state.agenda.length;\n}\n\nfunction calculateSummary(state: PartyDiscussionState): PartyDiscussionResult[\"summary\"] {\n const decisions = { accepted: 0, deferred: 0, rejected: 0, pending: 0 };\n const issueUpdates = new Map<string, string[]>();\n\n for (const round of state.completedRounds) {\n switch (round.decision) {\n case \"accept\":\n decisions.accepted++;\n break;\n case \"defer\":\n decisions.deferred++;\n if (round.deferredTo) {\n const existing = issueUpdates.get(round.deferredTo) || [];\n existing.push(`Deferred: ${round.findingTitle}`);\n issueUpdates.set(round.deferredTo, existing);\n }\n break;\n case \"reject\":\n decisions.rejected++;\n break;\n default:\n decisions.pending++;\n }\n }\n\n for (const item of state.agenda) {\n if (!item.discussed) {\n decisions.pending++;\n }\n }\n\n return {\n totalDiscussed: state.completedRounds.length,\n decisions,\n issueUpdatesNeeded: Array.from(issueUpdates.entries()).map(([issueId, additions]) => ({\n issueId,\n additions,\n })),\n };\n}\n\nexport function createPartyDiscussionTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Orchestrate Phase 3 party discussion for issue reviews.\n\nThis tool manages an informed discussion where expert agents debate findings from Phase 1 (Oracle analysis) and optionally Phase 2 (parallel agent analysis).\n\nModes:\n- Quick mode: Only analysis.json exists in review folder (Oracle findings only)\n- Full mode: Both analysis.json and phase2.json exist (includes agent perspectives)\n\nActions:\n- start: Initialize discussion from review folder (loads analysis.json and optionally phase2.json)\n- continue: Get next agenda item and agent responses\n- decide: Record user decision for a finding (accept/defer/reject)\n- skip: Skip current finding without decision\n- end: End discussion and get summary\n\nThe tool maintains session state across calls, enabling multi-turn discussion.`,\n\n args: {\n action: tool.schema\n .enum([\"start\", \"continue\", \"decide\", \"skip\", \"end\"])\n .describe(\"Action to perform\"),\n sessionId: tool.schema\n .string()\n .optional()\n .describe(\"Session ID (required for continue/decide/skip/end)\"),\n reviewFolderPath: tool.schema\n .string()\n .optional()\n .describe(\"Path to review folder from sdlc_story_review_analyze (required for start)\"),\n findingId: tool.schema.string().optional().describe(\"Finding ID (required for decide)\"),\n decision: tool.schema\n .enum([\"accept\", \"defer\", \"reject\"])\n .optional()\n .describe(\"Decision (required for decide)\"),\n reason: tool.schema.string().optional().describe(\"Reason for decision\"),\n deferredTo: tool.schema\n .string()\n .optional()\n .describe(\"Issue note to defer to (for defer decisions)\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executePartyDiscussion(ctx, config, args);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\ninterface ToolArgs {\n action: \"start\" | \"continue\" | \"decide\" | \"skip\" | \"end\";\n sessionId?: string;\n reviewFolderPath?: string;\n findingId?: string;\n decision?: \"accept\" | \"defer\" | \"reject\";\n reason?: string;\n deferredTo?: string;\n}\n\nasync function executePartyDiscussion(\n ctx: PluginInput,\n config: SdlcConfig,\n args: ToolArgs\n): Promise<PartyDiscussionResult> {\n cleanupStaleSessions();\n const personas = await loadPersonas();\n\n switch (args.action) {\n case \"start\": {\n if (!args.reviewFolderPath) {\n log.warn(\"start called without reviewFolderPath\");\n return {\n success: false,\n sessionId: \"\",\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: \"reviewFolderPath is required for start action\",\n suggestion: \"Pass the reviewFolderPath from sdlc_story_review_analyze result\",\n };\n }\n\n const analysisPath = join(args.reviewFolderPath, \"analysis.json\");\n const phase2Path = join(args.reviewFolderPath, \"phase2.json\");\n\n if (!existsSync(analysisPath)) {\n return {\n success: false,\n sessionId: \"\",\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: `Analysis file not found: ${analysisPath}`,\n suggestion: \"Run sdlc_story_review_analyze first to generate the review folder\",\n };\n }\n\n let phase1: Phase1FullData;\n let phase2: Phase2Result | undefined;\n try {\n const analysisContent = await readFile(analysisPath, \"utf-8\");\n phase1 = JSON.parse(analysisContent);\n\n if (existsSync(phase2Path)) {\n const phase2Content = await readFile(phase2Path, \"utf-8\");\n phase2 = JSON.parse(phase2Content);\n }\n } catch (e) {\n log.error(\"Failed to load review files\", {\n error: e instanceof Error ? e.message : String(e),\n reviewFolderPath: args.reviewFolderPath,\n });\n return {\n success: false,\n sessionId: \"\",\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: `Failed to load review files: ${e instanceof Error ? e.message : String(e)}`,\n suggestion: \"Ensure the review folder contains valid analysis.json\",\n };\n }\n\n if (!phase1.findings) {\n return {\n success: false,\n sessionId: \"\",\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: \"analysis.json missing required 'findings' field\",\n suggestion: \"Ensure sdlc_story_review_analyze completed successfully\",\n };\n }\n\n if (!phase1.oracleAnalysis && phase1.findings.high > 0) {\n console.warn(\n \"[Sdlc] analysis.json missing oracleAnalysis field - using placeholder findings for\",\n phase1.identifier\n );\n }\n\n const state = initializeSession(phase1, phase2, args.reviewFolderPath);\n log.info(\"Session started\", {\n sessionId: state.sessionId,\n identifier: state.identifier,\n agendaItems: state.agenda.length,\n hasPhase2: !!phase2,\n });\n\n const currentItem = state.agenda[0];\n const responses = currentItem\n ? await generateAgentResponses(currentItem, personas, phase2)\n : undefined;\n\n return {\n success: true,\n sessionId: state.sessionId,\n state,\n currentItem,\n currentResponses: responses,\n hasMoreItems: state.agenda.length > 1,\n };\n }\n\n case \"continue\": {\n if (!args.sessionId) {\n return {\n success: false,\n sessionId: \"\",\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: \"sessionId is required for continue action\",\n };\n }\n\n const state = getSession(args.sessionId);\n if (!state) {\n return {\n success: false,\n sessionId: args.sessionId,\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: \"Session not found\",\n };\n }\n\n const currentItem = state.agenda[state.currentItemIndex];\n if (!currentItem || currentItem.discussed) {\n const nextIndex = findNextUndiscussedIndex(state);\n if (nextIndex >= state.agenda.length) {\n return {\n success: true,\n sessionId: state.sessionId,\n state,\n hasMoreItems: false,\n summary: calculateSummary(state),\n };\n }\n state.currentItemIndex = nextIndex;\n }\n\n const nextItem = state.agenda[state.currentItemIndex];\n const phase2 = getSessionWithMeta(state.sessionId)?.phase2;\n\n const responses = await generateAgentResponses(nextItem, personas, phase2);\n\n return {\n success: true,\n sessionId: state.sessionId,\n state,\n currentItem: nextItem,\n currentResponses: responses,\n hasMoreItems: state.currentItemIndex < state.agenda.length - 1,\n };\n }\n\n case \"decide\": {\n if (!args.sessionId || !args.findingId || !args.decision) {\n return {\n success: false,\n sessionId: args.sessionId || \"\",\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: \"sessionId, findingId, and decision are required for decide action\",\n };\n }\n\n const state = getSession(args.sessionId);\n if (!state) {\n return {\n success: false,\n sessionId: args.sessionId,\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: \"Session not found\",\n };\n }\n\n const updatedState = recordDecision(\n state,\n args.findingId,\n args.decision,\n args.reason,\n args.deferredTo\n );\n log.debug(\"Decision recorded\", {\n sessionId: args.sessionId,\n findingId: args.findingId,\n decision: args.decision,\n });\n\n const hasMore = updatedState.currentItemIndex < updatedState.agenda.length;\n\n return {\n success: true,\n sessionId: updatedState.sessionId,\n state: updatedState,\n hasMoreItems: hasMore,\n summary: !hasMore ? calculateSummary(updatedState) : undefined,\n };\n }\n\n case \"skip\": {\n if (!args.sessionId || !args.findingId) {\n return {\n success: false,\n sessionId: args.sessionId || \"\",\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: \"sessionId and findingId are required for skip action\",\n };\n }\n\n const state = getSession(args.sessionId);\n if (!state) {\n return {\n success: false,\n sessionId: args.sessionId,\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: \"Session not found\",\n };\n }\n\n const itemIndex = state.agenda.findIndex((a) => a.findingId === args.findingId);\n if (itemIndex !== -1) {\n state.agenda[itemIndex].discussed = true;\n state.currentItemIndex = findNextUndiscussedIndex(state);\n }\n\n return {\n success: true,\n sessionId: state.sessionId,\n state,\n hasMoreItems: state.currentItemIndex < state.agenda.length,\n };\n }\n\n case \"end\": {\n if (!args.sessionId) {\n return {\n success: false,\n sessionId: \"\",\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: \"sessionId is required for end action\",\n };\n }\n\n const sessionMeta = getSessionWithMeta(args.sessionId);\n if (!sessionMeta) {\n return {\n success: false,\n sessionId: args.sessionId,\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: \"Session not found\",\n };\n }\n\n const state = sessionMeta.state;\n activeSessions.delete(args.sessionId);\n const endSummary = calculateSummary(state);\n\n if (!config.github?.owner || !config.github?.repo) {\n return {\n success: false,\n sessionId: args.sessionId,\n state,\n hasMoreItems: false,\n error: \"GitHub configuration missing\",\n suggestion: \"Set github.owner and github.repo in sdlc.json\",\n };\n }\n\n const appliedUpdates = await applyIssueDecisions(ctx, config, state);\n\n log.info(\"Session ended with decisions applied\", {\n sessionId: args.sessionId,\n totalDiscussed: endSummary?.totalDiscussed ?? 0,\n decisions: endSummary?.decisions,\n issuesModified: appliedUpdates.summary.issuesModified ?? 0,\n });\n\n return {\n success: true,\n sessionId: state.sessionId,\n state,\n hasMoreItems: false,\n summary: endSummary,\n appliedUpdates,\n };\n }\n\n default:\n return {\n success: false,\n sessionId: \"\",\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: `Unknown action: ${args.action}`,\n };\n }\n}\n\nexport const _testExports = {\n buildAgenda,\n extractHighSeverityFindings,\n inferCategory,\n getAgentPositionsForFinding,\n initializeSession,\n generateAgentResponses,\n recordDecision,\n calculateSummary,\n activeSessions,\n cleanupStaleSessions,\n getSession,\n getSessionWithMeta,\n setSession,\n SESSION_TTL_MS,\n MAX_SESSIONS,\n};\n","/**\n * sdlc_party_review Tool\n *\n * Architecture party review using BMAD personas.\n * Facilitates multi-stakeholder discussions on architectural decisions.\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { BmadAgentFullPersona, BmadAgentType, SdlcConfig } from \"../../shared/types.js\";\nimport { registerSubagentSession, unregisterSubagentSession } from \"../hooks/orchestrator-guard.js\";\nimport { loadPersonas } from \"../utils/persona-loader.js\";\n\n/**\n * Party review topic\n */\nexport interface ReviewTopic {\n title: string;\n description: string;\n context?: string;\n options?: string[];\n}\n\n/**\n * Agent perspective in review\n */\nexport interface AgentPerspective {\n agent: BmadAgentType;\n agentName: string;\n icon: string;\n perspective: string;\n concerns: string[];\n recommendations: string[];\n}\n\n/**\n * Party review result\n */\nexport interface PartyReviewResult {\n success: boolean;\n topic?: ReviewTopic;\n perspectives?: AgentPerspective[];\n synthesis?: string;\n documentPath?: string;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Arguments for sdlc_party_review tool\n */\nexport interface PartyReviewArgs {\n topic: string;\n description: string;\n context?: string;\n options?: string[];\n agents?: string[];\n}\n\n/**\n * BMAD Persona mapping\n */\nconst PERSONA_ROLES: Record<string, BmadAgentType> = {\n winston: \"architect\",\n architect: \"architect\",\n amelia: \"dev\",\n developer: \"dev\",\n dev: \"dev\",\n murat: \"tea\",\n tester: \"tea\",\n tea: \"tea\",\n john: \"pm\",\n \"product-manager\": \"pm\",\n pm: \"pm\",\n mary: \"analyst\",\n \"business-analyst\": \"analyst\",\n analyst: \"analyst\",\n sally: \"ux-designer\",\n \"ux-designer\": \"ux-designer\",\n ux: \"ux-designer\",\n paige: \"tech-writer\",\n \"tech-writer\": \"tech-writer\",\n writer: \"tech-writer\",\n bob: \"sm\",\n \"scrum-master\": \"sm\",\n sm: \"sm\",\n};\n\n/**\n * Default agents for architecture reviews\n */\nconst DEFAULT_ARCHITECTURE_AGENTS: BmadAgentType[] = [\n \"architect\", // Winston - architecture perspective\n \"dev\", // Amelia - implementation perspective\n \"tea\", // Murat - testing perspective\n \"pm\", // John - business/product perspective\n];\n\n/**\n * Create the sdlc_party_review tool\n */\nexport function createPartyReviewTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Conduct a party review for architectural decisions using BMAD personas.\n\nThis tool facilitates multi-stakeholder discussions where expert personas provide\ntheir perspectives on architectural topics, trade-offs, and decisions.\n\nAvailable personas:\n- Winston (architect) - System design, scalability, patterns\n- Amelia (dev) - Implementation, code quality, maintainability\n- Murat (tea) - Testing, quality assurance, edge cases\n- John (pm) - Business value, timeline, priorities\n- Mary (analyst) - Requirements, domain logic, user needs\n- Sally (ux-designer) - User experience, accessibility\n- Paige (tech-writer) - Documentation, clarity\n- Bob (sm) - Process, team dynamics, delivery\n\nBy default, architecture reviews include: Winston, Amelia, Murat, John.\nYou can specify custom agents for domain-specific discussions.\n\nReturns perspectives from each agent plus a synthesized summary.`,\n\n args: {\n topic: tool.schema.string().describe(\"The architectural topic or decision to discuss\"),\n description: tool.schema.string().describe(\"Detailed description of the topic or decision\"),\n context: tool.schema\n .string()\n .optional()\n .describe(\"Additional context (e.g., current architecture, constraints)\"),\n options: tool.schema\n .array(tool.schema.string())\n .optional()\n .describe(\"Options being considered (if this is a decision point)\"),\n agents: tool.schema\n .array(tool.schema.string())\n .optional()\n .describe(\n \"Specific agents to include (e.g., ['winston', 'amelia']). Default: architecture team\"\n ),\n },\n\n async execute(args): Promise<string> {\n const result = await executePartyReview(ctx, config, args as PartyReviewArgs);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function executePartyReview(\n ctx: PluginInput,\n config: SdlcConfig,\n args: PartyReviewArgs\n): Promise<PartyReviewResult> {\n // Load personas\n const personas = await loadPersonas();\n\n // Determine which agents to include\n let agentTypes: BmadAgentType[] = DEFAULT_ARCHITECTURE_AGENTS;\n\n if (args.agents && args.agents.length > 0) {\n agentTypes = args.agents\n .map((a) => PERSONA_ROLES[a.toLowerCase()])\n .filter((t): t is BmadAgentType => t !== undefined);\n\n if (agentTypes.length === 0) {\n return {\n success: false,\n error: \"No valid agents specified\",\n suggestion: `Valid agents: ${Object.keys(PERSONA_ROLES).join(\", \")}`,\n };\n }\n }\n\n const topic: ReviewTopic = {\n title: args.topic,\n description: args.description,\n context: args.context,\n options: args.options,\n };\n\n // Gather perspectives from each agent\n const perspectives: AgentPerspective[] = [];\n\n for (const agentType of agentTypes) {\n const persona = personas.get(agentType);\n if (!persona) continue;\n\n const perspective = await gatherPerspective(ctx, config, persona, topic, perspectives);\n perspectives.push(perspective);\n }\n\n // Synthesize the discussion\n const synthesis = await synthesizeDiscussion(ctx, config, topic, perspectives);\n\n // Save review document\n const reviewId = randomUUID().slice(0, 8);\n const documentPath = join(ctx.directory, \".opencode\", \"reviews\", `party-review-${reviewId}.md`);\n\n try {\n await mkdir(dirname(documentPath), { recursive: true });\n await writeFile(documentPath, generateReviewDocument(topic, perspectives, synthesis), \"utf-8\");\n } catch {\n // Non-fatal\n }\n\n return {\n success: true,\n topic,\n perspectives,\n synthesis,\n documentPath,\n };\n}\n\nasync function gatherPerspective(\n ctx: PluginInput,\n config: SdlcConfig,\n persona: BmadAgentFullPersona,\n topic: ReviewTopic,\n previousPerspectives: AgentPerspective[]\n): Promise<AgentPerspective> {\n // Build prompt for this persona\n const previousContext =\n previousPerspectives.length > 0\n ? `\\n\\nPrevious perspectives shared:\\n${previousPerspectives\n .map((p) => `- ${p.agentName}: ${p.perspective.slice(0, 200)}...`)\n .join(\"\\n\")}`\n : \"\";\n\n const optionsSection = topic.options\n ? `\\n\\nOptions being considered:\\n${topic.options.map((o, i) => `${i + 1}. ${o}`).join(\"\\n\")}`\n : \"\";\n\n const prompt = `You are ${persona.name}, the ${persona.title}.\n\n${persona.identity}\n\n## Topic for Review\n\n**${topic.title}**\n\n${topic.description}\n\n${topic.context ? `### Context\\n${topic.context}` : \"\"}\n${optionsSection}\n${previousContext}\n\n## Your Task\n\nProvide your perspective on this architectural topic from your role as ${persona.title}.\n\nStructure your response as:\n\n### Perspective\n[Your main perspective on this topic - 2-3 paragraphs]\n\n### Concerns\n- [Concern 1]\n- [Concern 2]\n- [...]\n\n### Recommendations\n- [Recommendation 1]\n- [Recommendation 2]\n- [...]\n\nStay in character and focus on your area of expertise.`;\n\n try {\n const createResult = await ctx.client.session.create({\n body: {\n title: `Party Review: ${persona.name}`,\n },\n });\n\n if (!createResult.data?.id) {\n return createFallbackPerspective(persona, topic);\n }\n\n const sessionId = createResult.data.id;\n registerSubagentSession(sessionId, \"file_updater\");\n\n try {\n const modelConfig = parseModelConfig(\n config.models.oracle || \"anthropic/claude-sonnet-4-20250514\"\n );\n\n await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: modelConfig,\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n return createFallbackPerspective(persona, topic);\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const content = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n return parseAgentResponse(persona, content);\n } finally {\n unregisterSubagentSession(sessionId);\n }\n } catch {\n return createFallbackPerspective(persona, topic);\n }\n}\n\nfunction createFallbackPerspective(\n persona: BmadAgentFullPersona,\n topic: ReviewTopic\n): AgentPerspective {\n return {\n agent: persona.type,\n agentName: persona.name,\n icon: persona.icon,\n perspective: `As ${persona.title}, I would need to analyze \"${topic.title}\" more thoroughly to provide a complete perspective.`,\n concerns: [\"Further analysis needed\"],\n recommendations: [\"Schedule detailed review session\"],\n };\n}\n\nfunction parseAgentResponse(persona: BmadAgentFullPersona, content: string): AgentPerspective {\n // Extract perspective section\n const perspectiveMatch = content.match(\n /###?\\s*Perspective\\s*\\n+([\\s\\S]*?)(?=###?\\s*Concerns|$)/i\n );\n const perspective = perspectiveMatch ? perspectiveMatch[1].trim() : content.slice(0, 500);\n\n // Extract concerns\n const concernsMatch = content.match(\n /###?\\s*Concerns\\s*\\n+([\\s\\S]*?)(?=###?\\s*Recommendations|$)/i\n );\n const concerns: string[] = [];\n if (concernsMatch) {\n const items = concernsMatch[1].match(/^[-*]\\s*(.+)$/gm) || [];\n concerns.push(...items.map((i) => i.replace(/^[-*]\\s*/, \"\").trim()));\n }\n\n // Extract recommendations\n const recsMatch = content.match(/###?\\s*Recommendations\\s*\\n+([\\s\\S]*?)$/i);\n const recommendations: string[] = [];\n if (recsMatch) {\n const items = recsMatch[1].match(/^[-*]\\s*(.+)$/gm) || [];\n recommendations.push(...items.map((i) => i.replace(/^[-*]\\s*/, \"\").trim()));\n }\n\n return {\n agent: persona.type,\n agentName: persona.name,\n icon: persona.icon,\n perspective,\n concerns: concerns.length > 0 ? concerns : [\"No specific concerns raised\"],\n recommendations: recommendations.length > 0 ? recommendations : [\"No specific recommendations\"],\n };\n}\n\nasync function synthesizeDiscussion(\n ctx: PluginInput,\n config: SdlcConfig,\n topic: ReviewTopic,\n perspectives: AgentPerspective[]\n): Promise<string> {\n const perspectivesText = perspectives\n .map(\n (p) =>\n `## ${p.agentName} (${p.agent})\n${p.perspective}\n\n**Concerns:** ${p.concerns.join(\"; \")}\n\n**Recommendations:** ${p.recommendations.join(\"; \")}`\n )\n .join(\"\\n\\n\");\n\n const prompt = `Synthesize the following party review discussion into a cohesive summary.\n\n## Topic: ${topic.title}\n\n${topic.description}\n\n${topic.options ? `**Options considered:** ${topic.options.join(\", \")}` : \"\"}\n\n## Perspectives Gathered\n\n${perspectivesText}\n\n## Your Task\n\nWrite a synthesis that:\n1. Summarizes the key points of agreement\n2. Highlights areas of disagreement or tension\n3. Identifies the main trade-offs\n4. Provides a balanced recommendation (if applicable)\n\nKeep the synthesis concise (3-4 paragraphs).`;\n\n try {\n const createResult = await ctx.client.session.create({\n body: {\n title: \"Party Review Synthesis\",\n },\n });\n\n if (!createResult.data?.id) {\n return generateFallbackSynthesis(perspectives);\n }\n\n const sessionId = createResult.data.id;\n registerSubagentSession(sessionId, \"file_updater\");\n\n try {\n const modelConfig = parseModelConfig(\n config.models.oracle || \"anthropic/claude-sonnet-4-20250514\"\n );\n\n await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: modelConfig,\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n return generateFallbackSynthesis(perspectives);\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n return textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n } finally {\n unregisterSubagentSession(sessionId);\n }\n } catch {\n return generateFallbackSynthesis(perspectives);\n }\n}\n\nfunction generateFallbackSynthesis(perspectives: AgentPerspective[]): string {\n const allConcerns = perspectives.flatMap((p) => p.concerns);\n const allRecs = perspectives.flatMap((p) => p.recommendations);\n\n return `## Synthesis\n\nThe party review gathered perspectives from ${perspectives.length} stakeholders.\n\n**Key Concerns:**\n${allConcerns\n .slice(0, 5)\n .map((c) => `- ${c}`)\n .join(\"\\n\")}\n\n**Recommendations:**\n${allRecs\n .slice(0, 5)\n .map((r) => `- ${r}`)\n .join(\"\\n\")}\n\nFurther discussion may be needed to reach consensus.`;\n}\n\nfunction generateReviewDocument(\n topic: ReviewTopic,\n perspectives: AgentPerspective[],\n synthesis: string\n): string {\n const date = new Date().toISOString().split(\"T\")[0];\n\n let doc = `# Party Review: ${topic.title}\n\n**Date:** ${date}\n\n## Topic\n\n${topic.description}\n\n${topic.context ? `### Context\\n${topic.context}\\n` : \"\"}\n${topic.options ? `### Options Considered\\n${topic.options.map((o, i) => `${i + 1}. ${o}`).join(\"\\n\")}\\n` : \"\"}\n\n## Perspectives\n\n`;\n\n for (const p of perspectives) {\n doc += `### ${p.icon} ${p.agentName}\n\n${p.perspective}\n\n**Concerns:**\n${p.concerns.map((c) => `- ${c}`).join(\"\\n\")}\n\n**Recommendations:**\n${p.recommendations.map((r) => `- ${r}`).join(\"\\n\")}\n\n---\n\n`;\n }\n\n doc += `## Synthesis\n\n${synthesis}\n`;\n\n return doc;\n}\n\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"anthropic\", modelID: modelID || modelString };\n}\n\n// Export for testing\nexport const _testExports = {\n executePartyReview,\n gatherPerspective,\n parseAgentResponse,\n synthesizeDiscussion,\n generateReviewDocument,\n PERSONA_ROLES,\n DEFAULT_ARCHITECTURE_AGENTS,\n};\n","/**\n * sdlc_review_pr Tool\n *\n * 3-stage Pull Request review:\n * - Stage 1: Specification Compliance\n * - Stage 2: Code Quality\n * - Stage 3: Domain Integrity\n */\n\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport { registerSubagentSession, unregisterSubagentSession } from \"../hooks/orchestrator-guard.js\";\n\n/**\n * Specification compliance status for an acceptance criterion\n */\nexport type SpecComplianceStatus =\n | \"COMPLETE\"\n | \"MISSING\"\n | \"INCOMPLETE\"\n | \"OVER-BUILT\"\n | \"DIVERGENT\";\n\n/**\n * Code quality flag severity\n */\nexport type QualityFlag = \"BUG_RISK\" | \"MAINTAINABILITY\" | \"STYLE\" | \"PERFORMANCE\";\n\n/**\n * Specification compliance finding\n */\nexport interface SpecComplianceFinding {\n issueNumber: number;\n acNumber: number;\n acText: string;\n status: SpecComplianceStatus;\n evidence?: string;\n}\n\n/**\n * Code quality finding\n */\nexport interface CodeQualityFinding {\n flag: QualityFlag;\n file: string;\n line?: number;\n description: string;\n suggestion?: string;\n}\n\n/**\n * Domain integrity violation\n */\nexport interface DomainViolation {\n type: \"primitive_obsession\" | \"invalid_state\" | \"parse_validate\" | \"naming\";\n location: string;\n description: string;\n impact: string;\n recommendation: string;\n}\n\n/**\n * PR review result\n */\nexport interface PrReviewResult {\n success: boolean;\n prNumber: number;\n filesChanged?: number;\n linesAdded?: number;\n linesRemoved?: number;\n linkedIssues?: number[];\n stage1?: {\n findings: SpecComplianceFinding[];\n summary: Record<SpecComplianceStatus, number>;\n };\n stage2?: {\n findings: CodeQualityFinding[];\n summary: Record<QualityFlag, number>;\n };\n stage3?: {\n violations: DomainViolation[];\n score: number;\n };\n verdict: \"APPROVE\" | \"REQUEST_CHANGES\" | \"COMMENT\";\n mustFix: string[];\n shouldFix: string[];\n consider: string[];\n reviewPath?: string;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Arguments for sdlc_review_pr tool\n */\nexport interface ReviewPrArgs {\n prNumber: number;\n stages?: string;\n skipDomain?: boolean;\n}\n\n/**\n * Create the sdlc_review_pr tool\n */\nexport function createReviewPrTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Perform a comprehensive 3-stage Pull Request review.\n\nStage 1: Specification Compliance\n- Maps each acceptance criterion to implementation\n- Flags: COMPLETE, MISSING, INCOMPLETE, OVER-BUILT, DIVERGENT\n\nStage 2: Code Quality\n- Evaluates clarity, domain types, error handling, testing, YAGNI\n- Flags: BUG_RISK, MAINTAINABILITY, STYLE, PERFORMANCE\n\nStage 3: Domain Integrity\n- Compile-time enforcement audit\n- Checks for primitive obsession, invalid states, parse-don't-validate\n\nReturns:\n- verdict: APPROVE | REQUEST_CHANGES | COMMENT\n- mustFix: Blocking issues\n- shouldFix: Non-blocking improvements\n- consider: Optional suggestions\n- reviewPath: Path to saved review document`,\n\n args: {\n prNumber: tool.schema.number().describe(\"GitHub Pull Request number to review\"),\n stages: tool.schema\n .string()\n .optional()\n .describe(\"Comma-separated stages to run (1,2,3). Default: all stages.\"),\n skipDomain: tool.schema\n .boolean()\n .optional()\n .describe(\"Skip Stage 3 domain integrity check (faster review)\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executeReview(ctx, config, args as ReviewPrArgs);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function executeReview(\n ctx: PluginInput,\n config: SdlcConfig,\n args: ReviewPrArgs\n): Promise<PrReviewResult> {\n if (!config.github?.owner || !config.github?.repo) {\n return {\n success: false,\n prNumber: args.prNumber,\n verdict: \"REQUEST_CHANGES\",\n mustFix: [],\n shouldFix: [],\n consider: [],\n error: \"GitHub configuration missing\",\n suggestion: \"Set github.owner and github.repo in sdlc.json\",\n };\n }\n\n // Determine which stages to run\n let stages: number[] = [1, 2, 3];\n if (args.stages) {\n stages = args.stages\n .split(\",\")\n .map((s) => Number.parseInt(s.trim(), 10))\n .filter((n) => [1, 2, 3].includes(n));\n } else if (args.skipDomain) {\n stages = [1, 2];\n }\n\n // Fetch PR information\n const prInfo = await fetchPrInfo(ctx, config, args.prNumber);\n if (!prInfo.success) {\n return {\n success: false,\n prNumber: args.prNumber,\n verdict: \"REQUEST_CHANGES\",\n mustFix: [],\n shouldFix: [],\n consider: [],\n error: prInfo.error,\n suggestion: prInfo.suggestion,\n };\n }\n\n // Build review prompt\n const reviewPrompt = await buildReviewPrompt(ctx, config, args.prNumber, prInfo, stages);\n\n // Spawn review agent\n const agentResult = await spawnReviewAgent(ctx, config, reviewPrompt, args.prNumber);\n\n if (!agentResult.success) {\n return {\n success: false,\n prNumber: args.prNumber,\n verdict: \"REQUEST_CHANGES\",\n mustFix: [],\n shouldFix: [],\n consider: [],\n error: agentResult.error || \"Review agent failed\",\n suggestion: \"Check agent configuration and try again\",\n };\n }\n\n // Parse the review output\n const parsed = parseReviewOutput(agentResult.content || \"\");\n\n // Save review document\n const reviewPath = join(ctx.directory, \".opencode\", \"reviews\", `pr-${args.prNumber}-review.md`);\n\n try {\n await mkdir(dirname(reviewPath), { recursive: true });\n await writeFile(reviewPath, agentResult.content || \"\", \"utf-8\");\n } catch {\n // Non-fatal - continue without saving\n }\n\n // Determine verdict based on findings\n const mustFix: string[] = [];\n const shouldFix: string[] = [];\n const consider: string[] = [];\n\n // Stage 1: MISSING is blocking\n if (parsed.stage1) {\n for (const finding of parsed.stage1.findings) {\n if (finding.status === \"MISSING\") {\n mustFix.push(`[MISSING] AC${finding.acNumber}: ${finding.acText}`);\n } else if (finding.status === \"INCOMPLETE\" || finding.status === \"DIVERGENT\") {\n shouldFix.push(`[${finding.status}] AC${finding.acNumber}: ${finding.acText}`);\n } else if (finding.status === \"OVER-BUILT\") {\n consider.push(`[OVER-BUILT] AC${finding.acNumber}: ${finding.acText}`);\n }\n }\n }\n\n // Stage 2: BUG_RISK is blocking\n if (parsed.stage2) {\n for (const finding of parsed.stage2.findings) {\n if (finding.flag === \"BUG_RISK\") {\n mustFix.push(`[BUG_RISK] ${finding.file}: ${finding.description}`);\n } else if (finding.flag === \"MAINTAINABILITY\" || finding.flag === \"PERFORMANCE\") {\n shouldFix.push(`[${finding.flag}] ${finding.file}: ${finding.description}`);\n } else {\n consider.push(`[${finding.flag}] ${finding.file}: ${finding.description}`);\n }\n }\n }\n\n // Stage 3: Domain violations are warnings unless severe\n if (parsed.stage3) {\n for (const violation of parsed.stage3.violations) {\n if (violation.type === \"invalid_state\") {\n shouldFix.push(`[DOMAIN] ${violation.location}: ${violation.description}`);\n } else {\n consider.push(`[DOMAIN] ${violation.location}: ${violation.description}`);\n }\n }\n }\n\n // Determine verdict\n let verdict: \"APPROVE\" | \"REQUEST_CHANGES\" | \"COMMENT\" = \"APPROVE\";\n if (mustFix.length > 0) {\n verdict = \"REQUEST_CHANGES\";\n } else if (shouldFix.length > 0) {\n verdict = \"COMMENT\";\n }\n\n return {\n success: true,\n prNumber: args.prNumber,\n filesChanged: prInfo.filesChanged,\n linesAdded: prInfo.linesAdded,\n linesRemoved: prInfo.linesRemoved,\n linkedIssues: prInfo.linkedIssues,\n stage1: parsed.stage1,\n stage2: parsed.stage2,\n stage3: parsed.stage3,\n verdict,\n mustFix,\n shouldFix,\n consider,\n reviewPath,\n };\n}\n\ninterface PrInfo {\n success: boolean;\n filesChanged?: number;\n linesAdded?: number;\n linesRemoved?: number;\n linkedIssues?: number[];\n diff?: string;\n issueContext?: string;\n error?: string;\n suggestion?: string;\n}\n\nasync function fetchPrInfo(\n ctx: PluginInput,\n config: SdlcConfig,\n prNumber: number\n): Promise<PrInfo> {\n if (!config.github?.owner || !config.github?.repo) {\n return {\n success: false,\n error: \"GitHub configuration missing\",\n suggestion: \"Set github.owner and github.repo in sdlc.json\",\n };\n }\n const { owner, repo } = config.github;\n const repoPath = `${owner}/${repo}`;\n\n try {\n // Fetch PR details using gh CLI\n const { stdout: prStdout } =\n await ctx.$`gh pr view ${prNumber} --repo ${repoPath} --json additions,deletions,changedFiles,body,title`;\n\n const prData = JSON.parse(String(prStdout).trim());\n\n // Fetch PR diff\n let diff = \"\";\n try {\n const { stdout: diffStdout } = await ctx.$`gh pr diff ${prNumber} --repo ${repoPath}`;\n diff = String(diffStdout);\n } catch {\n // Diff fetch failed - continue without it\n }\n\n // Extract linked issues from PR body\n const linkedIssues: number[] = [];\n const issueMatches = prData.body?.matchAll(/(?:closes?|fixes?|resolves?)\\s*#(\\d+)/gi) || [];\n for (const match of issueMatches) {\n linkedIssues.push(Number.parseInt(match[1], 10));\n }\n\n // Also check for plain issue references\n const refMatches = prData.body?.matchAll(/#(\\d+)/g) || [];\n for (const match of refMatches) {\n const num = Number.parseInt(match[1], 10);\n if (!linkedIssues.includes(num)) {\n linkedIssues.push(num);\n }\n }\n\n // Fetch linked issue details for context\n let issueContext = \"\";\n for (const issueNum of linkedIssues.slice(0, 3)) {\n try {\n const { stdout: issueStdout } =\n await ctx.$`gh issue view ${issueNum} --repo ${repoPath} --json title,body`;\n const issueData = JSON.parse(String(issueStdout).trim());\n issueContext += `\\n\\n## Issue #${issueNum}: ${issueData.title}\\n\\n${issueData.body || \"\"}`;\n } catch {\n // Issue fetch failed - continue\n }\n }\n\n return {\n success: true,\n filesChanged: prData.changedFiles,\n linesAdded: prData.additions,\n linesRemoved: prData.deletions,\n linkedIssues,\n diff,\n issueContext,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n success: false,\n error: `Failed to fetch PR info: ${message}`,\n suggestion: \"Ensure gh CLI is authenticated and has repo access\",\n };\n }\n}\n\nasync function buildReviewPrompt(\n ctx: PluginInput,\n _config: SdlcConfig,\n prNumber: number,\n prInfo: PrInfo,\n stages: number[]\n): Promise<string> {\n // Try to load custom prompt\n const customPromptPath = join(ctx.directory, \"prompts\", \"agents\", \"code-reviewer.md\");\n let basePrompt: string;\n\n try {\n basePrompt = await readFile(customPromptPath, \"utf-8\");\n } catch {\n basePrompt = getBuiltInReviewPrompt();\n }\n\n const stageInstructions = stages.map((s) => `Stage ${s}`).join(\", \");\n\n const contextSection = `\n## Review Context\n\n**PR Number:** #${prNumber}\n**Files Changed:** ${prInfo.filesChanged || \"unknown\"}\n**Lines:** +${prInfo.linesAdded || 0}/-${prInfo.linesRemoved || 0}\n**Linked Issues:** ${prInfo.linkedIssues?.map((n) => `#${n}`).join(\", \") || \"none\"}\n\n**Stages to Run:** ${stageInstructions}\n\n### Issue Context\n${prInfo.issueContext || \"No linked issues found.\"}\n\n### PR Diff\n\\`\\`\\`diff\n${prInfo.diff?.slice(0, 50000) || \"Unable to fetch diff\"}\n\\`\\`\\`\n`;\n\n return `${basePrompt}\\n\\n${contextSection}`;\n}\n\nfunction getBuiltInReviewPrompt(): string {\n return `# Code Reviewer Agent\n\nPerform a 3-stage PR review:\n\n## Stage 1: Specification Compliance\nMap acceptance criteria to implementation:\n- COMPLETE: AC fully implemented\n- MISSING: AC not implemented\n- INCOMPLETE: AC partially done\n- OVER-BUILT: Exceeds scope\n- DIVERGENT: Differs from intent\n\n## Stage 2: Code Quality\nFlag issues:\n- BUG_RISK: Could cause errors\n- MAINTAINABILITY: Future maintenance issues\n- STYLE: Convention violations\n- PERFORMANCE: Performance concerns\n\n## Stage 3: Domain Integrity\nCheck for:\n- Primitive obsession\n- Invalid states representable\n- Parse-don't-validate violations\n- Naming consistency\n\nOutput a structured review with findings for each stage.`;\n}\n\ninterface AgentResult {\n success: boolean;\n content?: string;\n error?: string;\n}\n\nasync function spawnReviewAgent(\n ctx: PluginInput,\n config: SdlcConfig,\n prompt: string,\n prNumber: number\n): Promise<AgentResult> {\n try {\n const createResult = await ctx.client.session.create({\n body: {\n title: `PR Review: #${prNumber}`,\n },\n });\n\n if (!createResult.data?.id) {\n return { success: false, error: \"Failed to create review agent session\" };\n }\n\n const sessionId = createResult.data.id;\n registerSubagentSession(sessionId, \"file_updater\");\n\n try {\n const modelConfig = parseModelConfig(\n config.models.oracle || \"anthropic/claude-sonnet-4-20250514\"\n );\n\n const promptResult = await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: modelConfig,\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n if (!promptResult.data) {\n return { success: false, error: \"No response from review agent\" };\n }\n\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n return { success: false, error: \"No messages in review agent session\" };\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const content = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n return { success: true, content };\n } finally {\n unregisterSubagentSession(sessionId);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return { success: false, error: `Review agent spawn failed: ${message}` };\n }\n}\n\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"anthropic\", modelID: modelID || modelString };\n}\n\ninterface ParsedReview {\n stage1?: {\n findings: SpecComplianceFinding[];\n summary: Record<SpecComplianceStatus, number>;\n };\n stage2?: {\n findings: CodeQualityFinding[];\n summary: Record<QualityFlag, number>;\n };\n stage3?: {\n violations: DomainViolation[];\n score: number;\n };\n}\n\nfunction parseReviewOutput(content: string): ParsedReview {\n const result: ParsedReview = {};\n\n // Parse Stage 1 findings\n const stage1Section = content.match(/##?\\s*Stage 1[^\\n]*\\n([\\s\\S]*?)(?=##?\\s*Stage [23]|$)/i);\n if (stage1Section) {\n const findings: SpecComplianceFinding[] = [];\n const statusMatches = stage1Section[1].matchAll(\n /\\|\\s*AC(\\d+)[^|]*\\|\\s*(COMPLETE|MISSING|INCOMPLETE|OVER-BUILT|DIVERGENT)[^|]*\\|([^|]*)\\|/gi\n );\n for (const match of statusMatches) {\n findings.push({\n issueNumber: 0,\n acNumber: Number.parseInt(match[1], 10),\n acText: \"\",\n status: match[2].toUpperCase() as SpecComplianceStatus,\n evidence: match[3]?.trim(),\n });\n }\n result.stage1 = {\n findings,\n summary: countSpecStatuses(findings),\n };\n }\n\n // Parse Stage 2 findings\n const stage2Section = content.match(/##?\\s*Stage 2[^\\n]*\\n([\\s\\S]*?)(?=##?\\s*Stage 3|$)/i);\n if (stage2Section) {\n const findings: CodeQualityFinding[] = [];\n const flagMatches = stage2Section[1].matchAll(\n /\\[(BUG_RISK|MAINTAINABILITY|STYLE|PERFORMANCE)\\][^\\n]*\\n\\*\\*File:\\*\\*\\s*`([^`]+)`(?::(\\d+))?/gi\n );\n for (const match of flagMatches) {\n findings.push({\n flag: match[1].toUpperCase() as QualityFlag,\n file: match[2],\n line: match[3] ? Number.parseInt(match[3], 10) : undefined,\n description: \"\",\n });\n }\n result.stage2 = {\n findings,\n summary: countQualityFlags(findings),\n };\n }\n\n // Parse Stage 3 violations\n const stage3Section = content.match(/##?\\s*Stage 3[^\\n]*\\n([\\s\\S]*?)(?=##?\\s*Summary|$)/i);\n if (stage3Section) {\n const violations: DomainViolation[] = [];\n const violationMatches = stage3Section[1].matchAll(\n /####\\s*(Primitive Obsession|Invalid State|Parse-Don't-Validate|Naming)[^\\n]*\\n\\*\\*Location:\\*\\*\\s*`([^`]+)`/gi\n );\n for (const match of violationMatches) {\n const typeMap: Record<string, DomainViolation[\"type\"]> = {\n \"primitive obsession\": \"primitive_obsession\",\n \"invalid state\": \"invalid_state\",\n \"parse-don't-validate\": \"parse_validate\",\n naming: \"naming\",\n };\n violations.push({\n type: typeMap[match[1].toLowerCase()] || \"naming\",\n location: match[2],\n description: \"\",\n impact: \"\",\n recommendation: \"\",\n });\n }\n\n // Try to extract score\n const scoreMatch = stage3Section[1].match(/Overall[^\\d]*(\\d+(?:\\.\\d+)?)\\s*\\/\\s*10/i);\n const score = scoreMatch ? Number.parseFloat(scoreMatch[1]) : 5;\n\n result.stage3 = { violations, score };\n }\n\n return result;\n}\n\nfunction countSpecStatuses(\n findings: SpecComplianceFinding[]\n): Record<SpecComplianceStatus, number> {\n const counts: Record<SpecComplianceStatus, number> = {\n COMPLETE: 0,\n MISSING: 0,\n INCOMPLETE: 0,\n \"OVER-BUILT\": 0,\n DIVERGENT: 0,\n };\n for (const finding of findings) {\n counts[finding.status]++;\n }\n return counts;\n}\n\nfunction countQualityFlags(findings: CodeQualityFinding[]): Record<QualityFlag, number> {\n const counts: Record<QualityFlag, number> = {\n BUG_RISK: 0,\n MAINTAINABILITY: 0,\n STYLE: 0,\n PERFORMANCE: 0,\n };\n for (const finding of findings) {\n counts[finding.flag]++;\n }\n return counts;\n}\n\n// Export for testing\nexport const _testExports = {\n executeReview,\n fetchPrInfo,\n parseReviewOutput,\n countSpecStatuses,\n countQualityFlags,\n};\n","import type { BmadAgentType, FindingCategory } from \"../../shared/types.js\";\n\nexport interface FindingCounts {\n total: number;\n high: number;\n medium: number;\n low: number;\n byCategory: Record<FindingCategory, number>;\n}\n\nexport interface AgentRecommendation {\n agent: BmadAgentType;\n reason: string;\n relevantFindings: string[];\n priority: \"required\" | \"recommended\" | \"optional\";\n}\n\nconst AGENT_EXPERTISE: Record<BmadAgentType, FindingCategory[]> = {\n architect: [\"security\", \"performance\"],\n dev: [\"logic\", \"performance\", \"bestPractices\"],\n tea: [\"logic\", \"bestPractices\"],\n pm: [\"logic\", \"bestPractices\"],\n analyst: [\"logic\"],\n \"ux-designer\": [\"bestPractices\"],\n \"tech-writer\": [\"bestPractices\"],\n sm: [\"bestPractices\"],\n};\n\nexport function selectAgentsForReview(findings: FindingCounts): AgentRecommendation[] {\n const recommendations: AgentRecommendation[] = [];\n\n if (findings.byCategory.security > 0) {\n addSecurityAgents(recommendations, findings);\n }\n\n if (findings.byCategory.logic > 0) {\n addLogicAgents(recommendations, findings);\n }\n\n if (findings.byCategory.performance > 0) {\n addPerformanceAgents(recommendations);\n }\n\n if (findings.byCategory.bestPractices > 0) {\n addBestPracticesAgents(recommendations, findings);\n }\n\n if (findings.high > 0) {\n recommendations.push({\n agent: \"pm\",\n reason: `${findings.high} high severity issue(s) need product impact assessment`,\n relevantFindings: [\"high-severity\"],\n priority: \"required\",\n });\n }\n\n ensureAtLeastOneRequired(recommendations);\n\n return recommendations;\n}\n\nfunction addSecurityAgents(recommendations: AgentRecommendation[], findings: FindingCounts): void {\n recommendations.push({\n agent: \"architect\",\n reason: `${findings.byCategory.security} security finding(s) require architecture review`,\n relevantFindings: [\"security\"],\n priority: findings.high > 0 ? \"required\" : \"recommended\",\n });\n recommendations.push({\n agent: \"dev\",\n reason: \"Security findings need implementation perspective\",\n relevantFindings: [\"security\"],\n priority: \"recommended\",\n });\n recommendations.push({\n agent: \"tea\",\n reason: \"Security findings need test coverage review\",\n relevantFindings: [\"security\"],\n priority: \"recommended\",\n });\n}\n\nfunction addLogicAgents(recommendations: AgentRecommendation[], findings: FindingCounts): void {\n if (!recommendations.find((r) => r.agent === \"dev\")) {\n recommendations.push({\n agent: \"dev\",\n reason: `${findings.byCategory.logic} logic gap(s) need implementation review`,\n relevantFindings: [\"logic\"],\n priority: findings.high > 0 ? \"required\" : \"recommended\",\n });\n }\n if (!recommendations.find((r) => r.agent === \"tea\")) {\n recommendations.push({\n agent: \"tea\",\n reason: \"Logic gaps need test scenario review\",\n relevantFindings: [\"logic\"],\n priority: \"recommended\",\n });\n }\n recommendations.push({\n agent: \"analyst\",\n reason: \"Logic gaps may indicate incomplete requirements\",\n relevantFindings: [\"logic\"],\n priority: \"optional\",\n });\n}\n\nfunction addPerformanceAgents(recommendations: AgentRecommendation[]): void {\n if (!recommendations.find((r) => r.agent === \"architect\")) {\n recommendations.push({\n agent: \"architect\",\n reason: \"Performance issues need architecture review\",\n relevantFindings: [\"performance\"],\n priority: \"recommended\",\n });\n }\n if (!recommendations.find((r) => r.agent === \"dev\")) {\n recommendations.push({\n agent: \"dev\",\n reason: \"Performance issues need implementation perspective\",\n relevantFindings: [\"performance\"],\n priority: \"recommended\",\n });\n }\n}\n\nfunction addBestPracticesAgents(\n recommendations: AgentRecommendation[],\n findings: FindingCounts\n): void {\n if (!recommendations.find((r) => r.agent === \"dev\")) {\n recommendations.push({\n agent: \"dev\",\n reason: `${findings.byCategory.bestPractices} best practice issue(s) need code review`,\n relevantFindings: [\"bestPractices\"],\n priority: \"optional\",\n });\n }\n recommendations.push({\n agent: \"tech-writer\",\n reason: \"Best practice issues may need documentation updates\",\n relevantFindings: [\"bestPractices\"],\n priority: \"optional\",\n });\n}\n\nfunction ensureAtLeastOneRequired(recommendations: AgentRecommendation[]): void {\n const requiredCount = recommendations.filter((r) => r.priority === \"required\").length;\n if (requiredCount === 0 && recommendations.length > 0) {\n recommendations[0].priority = \"required\";\n }\n}\n\nexport function getRecommendedAgentTypes(recommendations: AgentRecommendation[]): BmadAgentType[] {\n const seen = new Set<BmadAgentType>();\n const agents: BmadAgentType[] = [];\n\n for (const rec of recommendations) {\n if (!seen.has(rec.agent)) {\n seen.add(rec.agent);\n agents.push(rec.agent);\n }\n }\n\n return agents;\n}\n\nexport function filterByPriority(\n recommendations: AgentRecommendation[],\n minPriority: \"required\" | \"recommended\" | \"optional\"\n): AgentRecommendation[] {\n const priorityOrder = { required: 0, recommended: 1, optional: 2 };\n const minLevel = priorityOrder[minPriority];\n\n return recommendations.filter((r) => priorityOrder[r.priority] <= minLevel);\n}\n\nexport { AGENT_EXPERTISE };\n","import { join } from \"node:path\";\n\nconst ISSUE_PREFIX_PATTERN = /^(issue[-\\s]?|#)/i;\nconst ISSUE_TOKEN_SPLIT = /[\\s,]+/;\n\nexport function parseIssueIdentifiers(input: string): number[] {\n if (!input) return [];\n\n const tokens = input.split(ISSUE_TOKEN_SPLIT).map((token) => token.trim());\n const results = new Set<number>();\n\n for (const token of tokens) {\n if (!token) continue;\n\n const cleaned = token.replace(ISSUE_PREFIX_PATTERN, \"\").trim();\n if (!cleaned) continue;\n\n const value = Number.parseInt(cleaned, 10);\n if (Number.isFinite(value) && value > 0) {\n results.add(value);\n }\n }\n\n return Array.from(results);\n}\n\nexport function formatIssueList(issueNumbers: number[]): string {\n return issueNumbers.map((issueNumber) => `#${issueNumber}`).join(\", \");\n}\n\nexport function getReviewsDirectory(projectRoot: string): string {\n return join(projectRoot, \".opencode\", \"sdlc\", \"reviews\");\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type {\n FindingCategory,\n Phase1FullData,\n Phase1Summary,\n ReviewScope,\n SdlcConfig,\n} from \"../../shared/types.js\";\nimport {\n type AgentRecommendation,\n type FindingCounts,\n selectAgentsForReview,\n} from \"../utils/agent-selector.js\";\nimport { fetchIssue } from \"../utils/github-issues.js\";\nimport {\n formatIssueList,\n getReviewsDirectory,\n parseIssueIdentifiers,\n} from \"../utils/issue-review-utils.js\";\nimport {\n type FindingDetail,\n type ParsedOracleResponse,\n countFindings,\n parseOracleResponse,\n} from \"../utils/oracle-parser.js\";\n\nexport function createStoryReviewAnalyzeTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Analyze GitHub issues for security, logic, best practice, and performance gaps.\n\nThis tool performs Phase 1 of the party review workflow:\n1. Loads issue bodies and optional architecture context\n2. Spawns Oracle agent to analyze for issues\n3. Parses findings by severity and category\n4. Recommends expert agents for discussion\n5. Generates and saves a review document\n\nReturns a complete Phase 1 result that can be passed to Phase 2 (sdlc_story_review_consult) or Phase 3 (sdlc_party_discussion).\n\nUse this BEFORE development to catch issues early.`,\n\n args: {\n identifier: tool.schema\n .string()\n .describe(\"Comma-separated issue numbers (e.g., '12, 34') or a single issue number\"),\n thorough: tool.schema\n .boolean()\n .optional()\n .describe(\"Force advanced model for deeper analysis (default: auto-detect)\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executePhase1Analysis(ctx, config, args.identifier, args.thorough);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function executePhase1Analysis(\n ctx: PluginInput,\n config: SdlcConfig,\n identifier: string,\n forceAdvancedModel?: boolean\n): Promise<Phase1Summary> {\n if (!config.github?.owner || !config.github?.repo) {\n return {\n success: false,\n scope: \"issue\",\n identifier,\n error: \"GitHub configuration missing\",\n suggestion: \"Set github.owner and github.repo in sdlc.json\",\n };\n }\n\n const issueNumbers = parseIssueIdentifiers(identifier);\n if (issueNumbers.length === 0) {\n return {\n success: false,\n scope: \"issue\",\n identifier,\n error: \"No issue numbers provided\",\n suggestion: \"Provide at least one GitHub issue number (e.g., '12' or '12, 34')\",\n };\n }\n\n const reviewsDir = getReviewsDirectory(ctx.directory);\n await ensureDirectory(reviewsDir);\n\n const issuesContent = await loadIssues(ctx, config, issueNumbers);\n if (issuesContent.length === 0) {\n return {\n success: false,\n scope: \"issue\",\n identifier,\n error: \"No issues found\",\n suggestion: \"Check the issue numbers and repository settings\",\n };\n }\n\n const scope: ReviewScope = issuesContent.length > 1 ? \"multi-issue\" : \"issue\";\n const issueLabel = formatIssueList(issueNumbers);\n\n const oraclePrompt = buildOraclePrompt(scope, issueLabel, issuesContent, \"\");\n const oracleResponse = await spawnOracleAndWait(ctx, config, oraclePrompt, forceAdvancedModel);\n\n if (!oracleResponse.success) {\n return {\n success: false,\n scope,\n identifier: issueLabel,\n error: oracleResponse.error || \"Oracle analysis failed\",\n suggestion: \"Check that the Oracle agent is configured correctly.\",\n };\n }\n\n const parsed = parseOracleResponse(oracleResponse.content || \"\");\n const findings = countFindings(parsed);\n const recommendedAgents = selectAgentsForReview(findings);\n const summary = buildSummary(findings, recommendedAgents);\n\n const reviewFolderPath = await saveReviewFolder(\n reviewsDir,\n scope,\n issueLabel,\n issuesContent,\n parsed,\n oracleResponse.content || \"\",\n findings,\n recommendedAgents,\n summary\n );\n\n return {\n success: true,\n scope,\n identifier: issueLabel,\n findings,\n recommendedAgents,\n reviewFolderPath,\n summary,\n };\n}\n\nasync function loadIssues(\n ctx: PluginInput,\n config: SdlcConfig,\n issueNumbers: number[]\n): Promise<Array<{ id: string; content: string | null }>> {\n const results: Array<{ id: string; content: string | null }> = [];\n\n for (const issueNumber of issueNumbers) {\n const issue = await fetchIssue(ctx, config, issueNumber);\n if (!issue) continue;\n\n results.push({\n id: `#${issue.number}`,\n content: formatIssueContent(issue.title, issue.body),\n });\n }\n\n return results;\n}\n\nfunction formatIssueContent(title: string, body: string | null): string {\n const content = body?.trim() ? body.trim() : \"(empty)\";\n return `# ${title}\\n\\n${content}`;\n}\n\nasync function ensureDirectory(dir: string): Promise<void> {\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n}\n\nfunction buildOraclePrompt(\n scope: ReviewScope,\n identifier: string,\n stories: Array<{ id: string; content: string | null }>,\n architecture: string | null\n): string {\n const issuesText = stories\n .map((s) => `## Issue ${s.id}\\n\\n${s.content || \"(empty)\"}`)\n .join(\"\\n\\n---\\n\\n\");\n\n const scopeDescription =\n scope === \"multi-issue\"\n ? `Issues ${identifier} - Review ALL issues for issues AND cross-issue patterns`\n : `Issue ${identifier} - Deep dive focused review`;\n\n return `You are a security, logic, and performance expert conducting a \"party review\" of GitHub issues BEFORE development begins.\n\n**Your Role**: Find issues while they're cheap to fix (in markdown, not code).\n\n**Focus Areas**:\n1. 🔒 **Security Gaps**: Missing auth/authorization, input validation, data exposure risks\n2. 🧠 **Logic Gaps**: Edge cases not covered, error scenarios missing, validation rules incomplete\n3. ✨ **Best Practice Flaws**: Anti-patterns, testing strategy gaps, accessibility concerns\n4. ⚡ **Performance Issues**: N+1 queries, missing caching, large data handling\n\n**Scope**: ${scopeDescription}\n\n**Architecture Context**:\n${architecture || \"(No architecture documented)\"}\n\n**Issues to Review**:\n${issuesText}\n\n**Output Format** (JSON):\n{\n \"summary\": {\n \"totalIssues\": number,\n \"highSeverity\": number,\n \"mediumSeverity\": number,\n \"lowSeverity\": number,\n \"recommendation\": \"string\"\n },\n ${\n scope === \"multi-issue\"\n ? `\"issueFindings\": [\n {\n \"issueId\": \"string\",\n \"title\": \"string\",\n \"findings\": {\n \"security\": [\n {\n \"id\": \"unique-id\",\n \"severity\": \"high\" | \"medium\" | \"low\",\n \"title\": \"Brief title\",\n \"description\": \"What's wrong\",\n \"impact\": \"Why it matters\",\n \"suggestion\": \"How to fix\"\n }\n ],\n \"logic\": [...],\n \"bestPractices\": [...],\n \"performance\": [...]\n }\n }\n ],\n \"crossIssueIssues\": [\n {\n \"id\": \"unique-id\",\n \"category\": \"security\" | \"logic\" | \"bestPractices\" | \"performance\",\n \"severity\": \"high\" | \"medium\" | \"low\",\n \"title\": \"Pattern or issue across multiple issues\",\n \"description\": \"Details\",\n \"affectedIssues\": [\"#12\", \"#34\"],\n \"suggestion\": \"How to address\"\n }\n ]`\n : `\"findings\": {\n \"security\": [\n {\n \"id\": \"unique-id\",\n \"severity\": \"high\" | \"medium\" | \"low\",\n \"title\": \"Brief title\",\n \"description\": \"What's wrong\",\n \"impact\": \"Why it matters\",\n \"suggestion\": \"How to fix (be specific)\"\n }\n ],\n \"logic\": [...],\n \"bestPractices\": [...],\n \"performance\": [...]\n }`\n }\n}\n\n**Instructions**:\n- Be thorough but practical\n- Prioritize high-impact issues\n- Provide actionable suggestions\n- Flag missing requirements as logic gaps`;\n}\n\ninterface OracleResult {\n success: boolean;\n content?: string;\n error?: string;\n}\n\nasync function spawnOracleAndWait(\n ctx: PluginInput,\n config: SdlcConfig,\n prompt: string,\n _forceAdvancedModel?: boolean\n): Promise<OracleResult> {\n try {\n const createResult = await ctx.client.session.create({\n body: {\n title: \"Party Review - Oracle Analysis\",\n },\n });\n\n if (!createResult.data?.id) {\n return { success: false, error: \"Failed to create Oracle session\" };\n }\n\n const sessionId = createResult.data.id;\n\n const promptResult = await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: parseModelConfig(config.models.oracle),\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n if (!promptResult.data) {\n return { success: false, error: \"No response from Oracle\" };\n }\n\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n return { success: false, error: \"No messages in Oracle session\" };\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const content = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n return { success: true, content };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return { success: false, error: `Oracle spawn failed: ${message}` };\n }\n}\n\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"openai\", modelID: modelID || modelString };\n}\n\nasync function saveReviewFolder(\n reviewsDir: string,\n scope: ReviewScope,\n identifier: string,\n stories: Array<{ id: string; content: string | null }>,\n parsed: ParsedOracleResponse,\n oracleAnalysis: string,\n findings: FindingCounts,\n recommendedAgents: AgentRecommendation[],\n summaryText: string\n): Promise<string> {\n const date = new Date().toISOString().split(\"T\")[0];\n const folderName = `party-review-${scope}-${identifier.replace(/[^\\d#]+/g, \"-\")}-${date}`;\n const scopeLabel = scope === \"multi-issue\" ? \"Issues\" : \"Issue\";\n const folderPath = join(reviewsDir, folderName);\n\n await ensureDirectory(folderPath);\n\n const storyList = stories.map((s) => s.id).join(\", \");\n const { summary } = parsed;\n\n const markdown = `# Party Review: ${scopeLabel} ${identifier}\n\n**Date**: ${date}\n**Reviewer**: Oracle (Party Mode)\n**Issues Reviewed**: ${storyList}\n\n---\n\n## Executive Summary\n\n- **Total Issues**: ${summary.totalIssues}\n- **High Severity**: ${summary.highSeverity} issues (MUST address)\n- **Medium Severity**: ${summary.mediumSeverity} issues (SHOULD address)\n- **Low Severity**: ${summary.lowSeverity} issues (NICE to address)\n\n**Recommendation**: ${summary.recommendation}\n\n---\n\n## Findings\n\n${formatFindings(parsed)}\n\n---\n\n## Appendix: Oracle's Full Analysis\n\n<details>\n<summary>Click to expand detailed reasoning</summary>\n\n${oracleAnalysis}\n\n</details>\n`;\n\n const fullData: Phase1FullData = {\n success: true,\n scope,\n identifier,\n findings,\n recommendedAgents,\n reviewFolderPath: folderPath,\n summary: summaryText,\n storiesContent: stories,\n oracleAnalysis,\n };\n\n await writeFile(join(folderPath, \"review.md\"), markdown, \"utf-8\");\n await writeFile(join(folderPath, \"analysis.json\"), JSON.stringify(fullData, null, 2), \"utf-8\");\n\n return folderPath;\n}\n\nfunction formatFindings(parsed: ParsedOracleResponse): string {\n let output = \"\";\n\n const categoryIcons: Record<string, string> = {\n security: \"🔒\",\n logic: \"🧠\",\n bestPractices: \"✨\",\n performance: \"⚡\",\n };\n\n if (parsed.findings) {\n for (const [category, findings] of Object.entries(parsed.findings)) {\n if (findings && findings.length > 0) {\n output += `### ${categoryIcons[category] || \"\"} ${formatCategoryName(category)} (${findings.length} issues)\\n\\n`;\n for (const finding of findings) {\n output += `#### [${finding.severity.toUpperCase()}] ${finding.title}\\n`;\n output += `**Finding**: ${finding.description}\\n`;\n output += `**Impact**: ${finding.impact}\\n`;\n output += `**Suggestion**: ${finding.suggestion}\\n`;\n output += \"**Decision**: [ ] Accept [ ] Defer [ ] Reject\\n\\n\";\n }\n }\n }\n }\n\n if (parsed.issueFindings) {\n for (const issue of parsed.issueFindings) {\n output += `### Issue ${issue.issueId}: ${issue.title}\\n\\n`;\n for (const [category, findings] of Object.entries(issue.findings)) {\n const typedFindings = findings as FindingDetail[];\n if (typedFindings.length === 0) continue;\n\n output += `#### ${formatCategoryName(category as FindingCategory)} (${typedFindings.length})\\n\\n`;\n\n for (const finding of typedFindings) {\n output += `- [${finding.severity}] ${finding.title}\\n`;\n output += ` - ${finding.description}\\n`;\n output += ` - Impact: ${finding.impact}\\n`;\n output += ` - Suggestion: ${finding.suggestion}\\n\\n`;\n }\n }\n }\n }\n\n if (parsed.crossIssueIssues && parsed.crossIssueIssues.length > 0) {\n output += \"### Cross-Issue Issues\\n\\n\";\n for (const issue of parsed.crossIssueIssues) {\n output += `- [${issue.severity}] ${issue.title}\\n`;\n output += ` - ${issue.description}\\n`;\n output += ` - Affected Issues: ${issue.affectedIssues.join(\", \")}\\n`;\n output += ` - Suggestion: ${issue.suggestion}\\n\\n`;\n }\n }\n\n return output || \"No findings detected.\";\n}\n\nfunction formatCategoryName(category: string): string {\n const names: Record<string, string> = {\n security: \"Security Issues\",\n logic: \"Logic Issues\",\n bestPractices: \"Best Practices\",\n performance: \"Performance Issues\",\n };\n return names[category] || category;\n}\n\nfunction buildSummary(findings: FindingCounts, agents: AgentRecommendation[]): string {\n const agentList = agents\n .filter((a) => a.priority !== \"optional\")\n .map((a) => a.agent)\n .join(\", \");\n\n return `Found ${findings.total} issues (${findings.high} high, ${findings.medium} medium, ${findings.low} low). Recommended agents: ${agentList || \"none\"}.`;\n}\n","import type { BmadAgentType } from \"../../shared/types.js\";\n\nexport interface AgentAnalysis {\n agent: BmadAgentType;\n perspective: string;\n findings: {\n agreements: string[];\n concerns: string[];\n suggestions: string[];\n };\n crossStoryPatterns: Array<{\n pattern: string;\n affectedStories: string[];\n recommendation: string;\n }>;\n prioritizedIssues: Array<{\n findingId: string;\n agentPriority: \"critical\" | \"important\" | \"minor\";\n rationale: string;\n }>;\n summary: string;\n}\n\nexport interface ConsensusPoint {\n topic: string;\n agents: BmadAgentType[];\n position: string;\n}\n\nexport interface DebatePoint {\n topic: string;\n positions: Array<{\n agent: BmadAgentType;\n position: string;\n }>;\n}\n\nexport interface AggregatedPriority {\n findingId: string;\n votes: Partial<Record<BmadAgentType, \"critical\" | \"important\" | \"minor\">>;\n consensusLevel: \"strong\" | \"moderate\" | \"disputed\";\n averagePriority: \"critical\" | \"important\" | \"minor\";\n}\n\nexport interface SynthesizedResult {\n agentAnalyses: AgentAnalysis[];\n consensusPoints: ConsensusPoint[];\n debatePoints: DebatePoint[];\n aggregatedPriorities: AggregatedPriority[];\n}\n\nexport function synthesizeAgentResponses(analyses: AgentAnalysis[]): SynthesizedResult {\n const consensusPoints = findConsensusPoints(analyses);\n const debatePoints = findDebatePoints(analyses);\n const aggregatedPriorities = aggregatePriorities(analyses);\n\n return {\n agentAnalyses: analyses,\n consensusPoints,\n debatePoints,\n aggregatedPriorities,\n };\n}\n\nfunction calculateConsensusThreshold(totalAgents: number): number {\n const minimumAgents = 2;\n const proportionalThreshold = Math.ceil(totalAgents * 0.5);\n return Math.max(minimumAgents, proportionalThreshold);\n}\n\nfunction findConsensusPoints(analyses: AgentAnalysis[]): ConsensusPoint[] {\n const concernMap = new Map<string, { agents: BmadAgentType[]; positions: string[] }>();\n\n for (const analysis of analyses) {\n for (const concern of analysis.findings.concerns) {\n const key = normalizeForComparison(concern);\n const existing = concernMap.get(key) || { agents: [], positions: [] };\n existing.agents.push(analysis.agent);\n existing.positions.push(concern);\n concernMap.set(key, existing);\n }\n\n for (const agreement of analysis.findings.agreements) {\n const key = normalizeForComparison(agreement);\n const existing = concernMap.get(key) || { agents: [], positions: [] };\n existing.agents.push(analysis.agent);\n existing.positions.push(agreement);\n concernMap.set(key, existing);\n }\n }\n\n const consensusThreshold = calculateConsensusThreshold(analyses.length);\n const consensusPoints: ConsensusPoint[] = [];\n\n for (const [_, data] of concernMap) {\n if (data.agents.length >= consensusThreshold) {\n consensusPoints.push({\n topic: data.positions[0],\n agents: data.agents,\n position: data.positions[0],\n });\n }\n }\n\n return consensusPoints;\n}\n\nfunction findDebatePoints(analyses: AgentAnalysis[]): DebatePoint[] {\n const debatePoints: DebatePoint[] = [];\n const processedPairs = new Set<string>();\n\n for (let i = 0; i < analyses.length; i++) {\n for (let j = i + 1; j < analyses.length; j++) {\n const agent1 = analyses[i];\n const agent2 = analyses[j];\n const pairKey = `${agent1.agent}-${agent2.agent}`;\n\n if (processedPairs.has(pairKey)) continue;\n processedPairs.add(pairKey);\n\n const conflictingPriorities = findConflictingPriorities(agent1, agent2);\n for (const conflict of conflictingPriorities) {\n debatePoints.push({\n topic: `Priority disagreement on ${conflict.findingId}`,\n positions: [\n { agent: agent1.agent, position: `${conflict.priority1}: ${conflict.rationale1}` },\n { agent: agent2.agent, position: `${conflict.priority2}: ${conflict.rationale2}` },\n ],\n });\n }\n }\n }\n\n return debatePoints;\n}\n\ninterface PriorityConflict {\n findingId: string;\n priority1: string;\n rationale1: string;\n priority2: string;\n rationale2: string;\n}\n\nfunction findConflictingPriorities(\n agent1: AgentAnalysis,\n agent2: AgentAnalysis\n): PriorityConflict[] {\n const conflicts: PriorityConflict[] = [];\n const priorityOrder = { critical: 0, important: 1, minor: 2 };\n\n for (const issue1 of agent1.prioritizedIssues) {\n const matchingIssue = agent2.prioritizedIssues.find((i) =>\n i.findingId.toLowerCase().includes(issue1.findingId.toLowerCase())\n );\n\n if (matchingIssue) {\n const diff = Math.abs(\n priorityOrder[issue1.agentPriority] - priorityOrder[matchingIssue.agentPriority]\n );\n if (diff >= 2) {\n conflicts.push({\n findingId: issue1.findingId,\n priority1: issue1.agentPriority,\n rationale1: issue1.rationale,\n priority2: matchingIssue.agentPriority,\n rationale2: matchingIssue.rationale,\n });\n }\n }\n }\n\n return conflicts;\n}\n\nfunction aggregatePriorities(analyses: AgentAnalysis[]): AggregatedPriority[] {\n const priorityMap = new Map<\n string,\n { votes: Partial<Record<BmadAgentType, \"critical\" | \"important\" | \"minor\">>; count: number }\n >();\n\n for (const analysis of analyses) {\n for (const issue of analysis.prioritizedIssues) {\n const existing = priorityMap.get(issue.findingId) || { votes: {}, count: 0 };\n existing.votes[analysis.agent] = issue.agentPriority;\n existing.count++;\n priorityMap.set(issue.findingId, existing);\n }\n }\n\n const aggregated: AggregatedPriority[] = [];\n for (const [findingId, data] of priorityMap) {\n const votes = Object.values(data.votes);\n const consensusLevel = calculateConsensusLevel(votes);\n const averagePriority = calculateAveragePriority(votes);\n\n aggregated.push({\n findingId,\n votes: data.votes,\n consensusLevel,\n averagePriority,\n });\n }\n\n return aggregated;\n}\n\nfunction calculateConsensusLevel(\n votes: Array<\"critical\" | \"important\" | \"minor\">\n): \"strong\" | \"moderate\" | \"disputed\" {\n if (votes.length <= 1) return \"strong\";\n\n const uniqueVotes = new Set(votes);\n if (uniqueVotes.size === 1) return \"strong\";\n if (uniqueVotes.size === 2) return \"moderate\";\n return \"disputed\";\n}\n\nfunction calculateAveragePriority(\n votes: Array<\"critical\" | \"important\" | \"minor\">\n): \"critical\" | \"important\" | \"minor\" {\n if (votes.length === 0) return \"minor\";\n\n const priorityOrder = { critical: 0, important: 1, minor: 2 };\n const sum = votes.reduce((acc, v) => acc + priorityOrder[v], 0);\n const avg = sum / votes.length;\n\n if (avg < 0.5) return \"critical\";\n if (avg < 1.5) return \"important\";\n return \"minor\";\n}\n\nfunction normalizeForComparison(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^\\w\\s]/g, \"\")\n .split(/\\s+/)\n .slice(0, 5)\n .join(\" \");\n}\n\nexport function parseAgentResponse(responseText: string | null | undefined): AgentAnalysis | null {\n if (!responseText || typeof responseText !== \"string\") {\n return null;\n }\n\n try {\n const jsonMatch = responseText.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) return null;\n\n const parsed = JSON.parse(jsonMatch[0]) as AgentAnalysis;\n\n if (!parsed.agent || !parsed.findings) return null;\n\n return {\n agent: parsed.agent,\n perspective: parsed.perspective || \"\",\n findings: {\n agreements: parsed.findings.agreements || [],\n concerns: parsed.findings.concerns || [],\n suggestions: parsed.findings.suggestions || [],\n },\n crossStoryPatterns: parsed.crossStoryPatterns || [],\n prioritizedIssues: parsed.prioritizedIssues || [],\n summary: parsed.summary || \"\",\n };\n } catch {\n return null;\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type {\n AgentAnalysis,\n BmadAgentType,\n Phase1FullData,\n SdlcConfig,\n} from \"../../shared/types.js\";\nimport { getRecommendedAgentTypes } from \"../utils/agent-selector.js\";\nimport { getPersona, loadPersonas } from \"../utils/persona-loader.js\";\nimport {\n type SynthesizedResult,\n parseAgentResponse,\n synthesizeAgentResponses,\n} from \"../utils/response-synthesizer.js\";\n\nexport interface Phase2ConsultResult {\n success: boolean;\n identifier: string;\n reviewFolderPath?: string;\n error?: string;\n suggestion?: string;\n\n agentAnalyses?: AgentAnalysis[];\n consensusPoints?: SynthesizedResult[\"consensusPoints\"];\n debatePoints?: SynthesizedResult[\"debatePoints\"];\n aggregatedPriorities?: SynthesizedResult[\"aggregatedPriorities\"];\n summary?: string;\n}\n\nexport function createStoryReviewConsultTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Consult BMAD expert agents for their perspectives on review findings.\n\nThis tool performs Phase 2 of the party review workflow:\n1. Loads the full analysis from the review folder (analysis.json)\n2. Spawns parallel sessions for each recommended BMAD agent\n3. Each agent reads the analysis file and provides their perspective\n4. Waits for all agents to complete (blocking)\n5. Synthesizes responses to find consensus and debates\n\nUse this after Phase 1 (sdlc_story_review_analyze) and before Phase 3 (sdlc_party_discussion). This phase is still issue-focused; it reads the issue review folder and consults the same BMAD agents.`,\n\n args: {\n reviewFolderPath: tool.schema\n .string()\n .describe(\n \"Path to the review folder from sdlc_story_review_analyze (contains analysis.json)\"\n ),\n agents: tool.schema\n .array(tool.schema.string())\n .optional()\n .describe(\"Override agent list (default: use recommended from phase1)\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executePhase2Consultation(\n ctx,\n config,\n args.reviewFolderPath,\n args.agents\n );\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function executePhase2Consultation(\n ctx: PluginInput,\n config: SdlcConfig,\n reviewFolderPath: string,\n overrideAgents?: string[]\n): Promise<Phase2ConsultResult> {\n const analysisPath = join(reviewFolderPath, \"analysis.json\");\n\n if (!existsSync(analysisPath)) {\n return {\n success: false,\n identifier: \"\",\n error: `Analysis file not found: ${analysisPath}`,\n suggestion: \"Run sdlc_story_review_analyze first to generate the review folder\",\n };\n }\n\n let phase1: Phase1FullData;\n try {\n const analysisContent = await readFile(analysisPath, \"utf-8\");\n phase1 = JSON.parse(analysisContent);\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Unknown error\";\n return {\n success: false,\n identifier: \"\",\n error: `Failed to load analysis.json: ${message}`,\n suggestion: \"Ensure the review folder contains a valid analysis.json file\",\n };\n }\n\n if (!phase1.success || !phase1.oracleAnalysis) {\n return {\n success: false,\n identifier: phase1.identifier,\n error: \"Phase 1 was not successful or missing oracle analysis\",\n suggestion: \"Run sdlc_story_review_analyze first\",\n };\n }\n\n const agents = overrideAgents\n ? (overrideAgents as BmadAgentType[])\n : getRecommendedAgentTypes(phase1.recommendedAgents || []);\n\n if (agents.length === 0) {\n return {\n success: false,\n identifier: phase1.identifier,\n error: \"No agents to consult\",\n suggestion: \"Specify agents or ensure Phase 1 has recommendations\",\n };\n }\n\n const personas = await loadPersonas();\n\n const agentPromises = agents.map((agentType) =>\n spawnAgentAndWait(ctx, config, agentType, phase1, personas)\n );\n\n const agentResults = await Promise.all(agentPromises);\n\n const successfulAnalyses = agentResults.filter((r): r is AgentAnalysis => r !== null);\n\n if (successfulAnalyses.length === 0) {\n return {\n success: false,\n identifier: phase1.identifier,\n error: \"All agent consultations failed\",\n suggestion: \"Check agent configuration and try again\",\n };\n }\n\n const synthesized = synthesizeAgentResponses(successfulAnalyses);\n\n const normalizedAnalyses = synthesized.agentAnalyses.map((analysis) => {\n const persona = getPersona(personas, analysis.agent);\n return enrichAgentAnalysis(analysis, analysis.agent, persona.name, phase1);\n });\n\n const summary = buildConsultationSummary(synthesized, agents.length);\n\n const result: Phase2ConsultResult = {\n success: true,\n identifier: phase1.identifier,\n reviewFolderPath,\n agentAnalyses: normalizedAnalyses,\n consensusPoints: synthesized.consensusPoints,\n debatePoints: synthesized.debatePoints,\n aggregatedPriorities: synthesized.aggregatedPriorities,\n summary,\n };\n\n const phase2Path = join(reviewFolderPath, \"phase2.json\");\n await writeFile(phase2Path, JSON.stringify(result, null, 2), \"utf-8\");\n\n return result;\n}\n\nasync function spawnAgentAndWait(\n ctx: PluginInput,\n config: SdlcConfig,\n agentType: BmadAgentType,\n phase1: Phase1FullData,\n personas: Map<BmadAgentType, import(\"../../shared/types.js\").BmadAgentFullPersona>\n): Promise<AgentAnalysis | null> {\n try {\n const persona = getPersona(personas, agentType);\n const prompt = buildAgentPrompt(persona, phase1);\n\n const createResult = await ctx.client.session.create({\n body: {\n title: `Party Review - ${persona.name} Analysis`,\n },\n });\n\n if (!createResult.data?.id) {\n console.warn(`[Sdlc] Failed to create session for ${agentType}`);\n return null;\n }\n\n const sessionId = createResult.data.id;\n\n await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: parseModelConfig(config.models.sisyphus),\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n console.warn(`[Sdlc] No response from ${agentType}`);\n return null;\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const content = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n const parsed = parseAgentResponse(content);\n if (!parsed) {\n return createFallbackAnalysis(agentType, persona.name, content);\n }\n\n return enrichAgentAnalysis(parsed, agentType, persona.name, phase1);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.warn(`[Sdlc] Agent ${agentType} consultation failed: ${message}`);\n return null;\n }\n}\n\nfunction buildAgentPrompt(\n persona: import(\"../../shared/types.js\").BmadAgentFullPersona,\n phase1: Phase1FullData\n): string {\n const storiesContext = phase1.storiesContent\n ?.map((s: { id: string; content: string | null }) => {\n const preview = s.content?.substring(0, 2000) || \"(empty)\";\n const truncated = s.content && s.content.length > 2000 ? \"...[truncated]\" : \"\";\n return `Issue ${s.id}:\\n${preview}${truncated}`;\n })\n .join(\"\\n\\n\");\n\n return `You are ${persona.name}, the ${persona.title} from the BMAD team.\n\n**Your Icon**: ${persona.icon}\n**Your Expertise**: ${persona.expertise.join(\", \")}\n**Your Perspective**: ${persona.perspective}\n\n**Your Task**: Analyze the following Oracle review findings from your ${persona.type} perspective.\n\n**Issues Being Reviewed**:\n${storiesContext || \"(No issue content available)\"}\n\n**Oracle's Findings**:\n${phase1.oracleAnalysis || \"(No analysis available)\"}\n\n**Your Analysis Instructions**:\n1. Review each finding from your ${persona.perspective} perspective\n2. Note findings you agree with and why\n3. Raise any concerns specific to your expertise\n4. Suggest additional considerations\n5. Prioritize issues based on ${persona.expertise[0] || \"your expertise\"} impact\n\n **Return JSON** (MUST be valid JSON):\n {\n \"agent\": \"${persona.type}\",\n \"perspective\": \"${persona.perspective}\",\n \"findings\": {\n \"agreements\": [\"I agree with X because...\"],\n \"concerns\": [\"From my perspective, Y is concerning because...\"],\n \"suggestions\": [\"Consider also Z...\"]\n },\n \"crossStoryPatterns\": [\n { \"pattern\": \"...\", \"affectedStories\": [\"#12\"], \"recommendation\": \"...\" }\n ],\n \"prioritizedIssues\": [\n { \"findingId\": \"...\", \"agentPriority\": \"critical|important|minor\", \"rationale\": \"...\" }\n ],\n \"summary\": \"Brief 2-3 sentence summary of my analysis\"\n }`;\n}\n\nfunction enrichAgentAnalysis(\n analysis: AgentAnalysis,\n agentType: BmadAgentType,\n agentName: string,\n phase1: Phase1FullData\n): AgentAnalysis {\n const issuesAnalyzed = (phase1.storiesContent || []).map((story) => story.id);\n const analyzedAt = new Date().toISOString();\n\n return {\n ...analysis,\n agent: agentType,\n agentName: analysis.agentName || agentName,\n analyzedAt: analysis.analyzedAt || analyzedAt,\n storiesAnalyzed: analysis.storiesAnalyzed || issuesAnalyzed,\n };\n}\n\nfunction createFallbackAnalysis(\n agentType: BmadAgentType,\n agentName: string,\n rawContent: string\n): AgentAnalysis {\n return {\n agent: agentType,\n agentName,\n analyzedAt: new Date().toISOString(),\n storiesAnalyzed: [],\n perspective: `${agentName}'s perspective`,\n findings: {\n agreements: [],\n concerns: [rawContent.substring(0, 200)],\n suggestions: [],\n },\n crossStoryPatterns: [],\n prioritizedIssues: [],\n summary: `${agentName} provided analysis but response was not in expected JSON format.`,\n };\n}\n\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"anthropic\", modelID: modelID || modelString };\n}\n\nfunction buildConsultationSummary(synthesized: SynthesizedResult, totalAgents: number): string {\n const successCount = synthesized.agentAnalyses.length;\n const consensusCount = synthesized.consensusPoints.length;\n const debateCount = synthesized.debatePoints.length;\n\n return `Consulted ${successCount}/${totalAgents} agents. Found ${consensusCount} consensus points and ${debateCount} debate points.`;\n}\n","/**\n * sdlc_domain Tool\n *\n * DOMAIN phase of TDD: Domain modeling review\n *\n * Reviews code for domain violations and creates domain types.\n * Has VETO power to block the workflow if domain integrity is compromised.\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport { registerSubagentSession, unregisterSubagentSession } from \"../hooks/orchestrator-guard.js\";\nimport type { TddCycleTracker } from \"../tracker/tdd-cycle-tracker.js\";\n\n/**\n * Context for the DOMAIN phase\n */\nexport type DomainContext = \"AFTER_RED\" | \"AFTER_GREEN\" | \"PR_REVIEW\";\n\n/**\n * Arguments for sdlc_domain tool\n */\nexport interface DomainArgs {\n context: DomainContext;\n testOrImplementationPath: string;\n}\n\n/**\n * Domain violation detected by the review\n */\nexport interface DomainViolation {\n type: \"primitive_obsession\" | \"invalid_state\" | \"structural_type\" | \"parse_validate\";\n location: string;\n description: string;\n suggestion: string;\n}\n\n/**\n * Result from sdlc_domain tool\n */\nexport interface DomainResult {\n success: boolean;\n approved: boolean;\n vetoed: boolean;\n violations?: DomainViolation[];\n typesCreated?: string[];\n vetoReason?: string;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Create the sdlc_domain tool\n */\nexport function createDomainTool(\n ctx: PluginInput,\n config: SdlcConfig,\n tracker: TddCycleTracker\n): ToolDefinition {\n return tool({\n description: `DOMAIN phase of TDD: Review for domain integrity and create types.\n\nThis tool spawns a domain expert agent that:\n- Reviews tests/implementations for domain violations\n- Creates domain types BEFORE implementation\n- Has VETO power to block workflow if domain integrity is compromised\n- Can edit type definition files only\n\nDomain violations detected:\n- Primitive obsession (String instead of Email)\n- Structural types (NonEmptyString instead of UserName) \n- Invalid states representable\n- Parse-don't-validate violations\n\nContext types:\n- AFTER_RED: Review test before implementation\n- AFTER_GREEN: Review implementation for domain compliance\n- PR_REVIEW: Full review for pull request`,\n\n args: {\n context: tool.schema\n .enum([\"AFTER_RED\", \"AFTER_GREEN\", \"PR_REVIEW\"])\n .describe(\"When the review is happening in the TDD cycle\"),\n testOrImplementationPath: tool.schema\n .string()\n .describe(\"Path to the test file (AFTER_RED) or implementation file (AFTER_GREEN)\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executeDomainPhase(ctx, config, tracker, args as DomainArgs);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function executeDomainPhase(\n ctx: PluginInput,\n config: SdlcConfig,\n tracker: TddCycleTracker,\n args: DomainArgs\n): Promise<DomainResult> {\n // Validate inputs\n if (!args.testOrImplementationPath) {\n return {\n success: false,\n approved: false,\n vetoed: false,\n error: \"testOrImplementationPath is required\",\n suggestion: \"Provide the path to the file to review\",\n };\n }\n\n // Check cycle state based on context\n const expectedContext = args.context === \"AFTER_RED\" ? \"red\" : \"green\";\n\n if (args.context !== \"PR_REVIEW\") {\n const canStart = tracker.canTransitionTo(\"domain\");\n if (!canStart.valid) {\n return {\n success: false,\n approved: false,\n vetoed: false,\n error: canStart.reason,\n suggestion: `Complete the ${expectedContext.toUpperCase()} phase before DOMAIN review`,\n };\n }\n\n // Start DOMAIN phase in tracker\n const startResult = tracker.startDomain(expectedContext as \"red\" | \"green\");\n if (!startResult.success) {\n return {\n success: false,\n approved: false,\n vetoed: false,\n error: startResult.error,\n };\n }\n }\n\n // Load DOMAIN prompt\n const domainPrompt = await loadDomainPrompt(ctx.directory, args);\n\n // Spawn DOMAIN agent\n const agentResult = await spawnDomainAgent(ctx, config, domainPrompt);\n\n if (!agentResult.success) {\n return {\n success: false,\n approved: false,\n vetoed: false,\n error: agentResult.error || \"DOMAIN agent failed\",\n suggestion: \"Check agent configuration and try again\",\n };\n }\n\n // Update tracker based on result\n if (args.context !== \"PR_REVIEW\") {\n if (agentResult.vetoed && agentResult.vetoReason) {\n tracker.vetoDomain(agentResult.vetoReason);\n } else {\n tracker.approveDomain(agentResult.typesCreated || []);\n }\n }\n\n return {\n success: true,\n approved: agentResult.approved ?? false,\n vetoed: agentResult.vetoed ?? false,\n violations: agentResult.violations,\n typesCreated: agentResult.typesCreated,\n vetoReason: agentResult.vetoReason,\n };\n}\n\nasync function loadDomainPrompt(projectDir: string, args: DomainArgs): Promise<string> {\n // Try to load custom prompt from project\n const customPromptPath = join(projectDir, \"prompts\", \"agents\", \"domain.md\");\n let basePrompt: string;\n\n try {\n basePrompt = await readFile(customPromptPath, \"utf-8\");\n } catch {\n // Use built-in prompt\n basePrompt = getBuiltInDomainPrompt();\n }\n\n // Add context-specific instructions\n let contextInstructions = \"\";\n\n switch (args.context) {\n case \"AFTER_RED\":\n contextInstructions = `\n## Context: AFTER_RED\n\nReview the test file BEFORE implementation begins.\n\n**File to Review:**\n${args.testOrImplementationPath}\n\nCheck:\n1. Are domain concepts properly represented in test assertions?\n2. Does the test use semantic types or raw primitives?\n3. Should new domain types be created before implementation?\n\nIf domain types are needed, create them now.\nIf the test uses primitives where domain types should exist, VETO.\n`;\n break;\n\n case \"AFTER_GREEN\":\n contextInstructions = `\n## Context: AFTER_GREEN\n\nReview the implementation AFTER the test passes.\n\n**File to Review:**\n${args.testOrImplementationPath}\n\nCheck:\n1. Does the implementation use domain types correctly?\n2. Are there primitive obsession patterns?\n3. Can invalid states be represented?\n4. Are parse-don't-validate patterns followed?\n\nIf violations are found, VETO and list required changes.\n`;\n break;\n\n case \"PR_REVIEW\":\n contextInstructions = `\n## Context: PR_REVIEW\n\nFull domain review for pull request.\n\n**Files to Review:**\n${args.testOrImplementationPath}\n\nPerform a comprehensive review:\n1. Check all domain types for proper semantics\n2. Ensure ubiquitous language consistency\n3. Verify no domain drift has occurred\n4. Check for primitive obsession across the codebase\n\nThis is a thorough review - be strict about domain integrity.\n`;\n break;\n }\n\n return `${basePrompt}\\n\\n${contextInstructions}`;\n}\n\nfunction getBuiltInDomainPrompt(): string {\n return `# DOMAIN Phase Agent\n\nYou are the domain modeling expert in TDD. Guard domain integrity.\n\n## Your Powers\n- Can EDIT type definition files (types.ts, *.types.ts, domain/*.ts)\n- Can VETO workflow if domain integrity is compromised\n- Can CREATE new domain types before implementation\n\n## Violations to Detect\n\n1. **Primitive Obsession**\n - Using string for Email, UserId, etc.\n - Solution: Create branded types\n\n2. **Invalid States Representable**\n - User.verified=true with User.verifiedAt=null\n - Solution: Use discriminated unions\n\n3. **Structural Types**\n - NonEmptyString instead of UserName\n - Solution: Use semantic types with meaning\n\n4. **Parse-Don't-Validate**\n - Validating then using raw primitives\n - Solution: Parse into domain types\n\n## Output Format\n\nAPPROVED:\n- List any types created\n- Note any recommendations\n\nVETOED:\n- List each violation with location\n- Explain why it's a domain violation\n- Specify required changes\n- BLOCK workflow until fixed`;\n}\n\ninterface AgentResult {\n success: boolean;\n approved?: boolean;\n vetoed?: boolean;\n violations?: DomainViolation[];\n typesCreated?: string[];\n vetoReason?: string;\n error?: string;\n}\n\nasync function spawnDomainAgent(\n ctx: PluginInput,\n config: SdlcConfig,\n prompt: string\n): Promise<AgentResult> {\n try {\n // Create session for DOMAIN agent\n const createResult = await ctx.client.session.create({\n body: {\n title: \"TDD DOMAIN Phase - Domain Review\",\n },\n });\n\n if (!createResult.data?.id) {\n return { success: false, error: \"Failed to create DOMAIN agent session\" };\n }\n\n const sessionId = createResult.data.id;\n\n // Register session as DOMAIN subagent for file ownership enforcement\n registerSubagentSession(sessionId, \"domain\");\n\n try {\n // Send prompt to agent - use Oracle model for domain expertise\n const promptResult = await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: parseModelConfig(config.models.oracle || \"anthropic/claude-sonnet-4-20250514\"),\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n if (!promptResult.data) {\n return { success: false, error: \"No response from DOMAIN agent\" };\n }\n\n // Get the response\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n return { success: false, error: \"No messages in DOMAIN agent session\" };\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const content = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n // Parse the response to determine approval/veto\n const parsed = parseDomainAgentResponse(content);\n\n return {\n success: true,\n ...parsed,\n };\n } finally {\n // Always unregister the session when done\n unregisterSubagentSession(sessionId);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return { success: false, error: `DOMAIN agent spawn failed: ${message}` };\n }\n}\n\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"anthropic\", modelID: modelID || modelString };\n}\n\nfunction parseDomainAgentResponse(content: string): Partial<AgentResult> {\n const isVetoed = content.match(/\\bVETO(?:ED)?\\b/i) !== null;\n const isApproved = content.match(/\\bAPPROVED?\\b/i) !== null && !isVetoed;\n\n const violations: DomainViolation[] = [];\n\n // Try to extract violations\n const violationMatches = content.matchAll(\n /(?:VIOLATION|Issue):\\s*(.+?)(?:\\n(?:Location|File):\\s*(.+?))?(?:\\n(?:Description|Reason):\\s*(.+?))?(?:\\n(?:Suggestion|Fix):\\s*(.+?))?(?=\\n\\n|\\n[A-Z]|$)/gis\n );\n\n for (const match of violationMatches) {\n const type = inferViolationType(match[1] || \"\");\n violations.push({\n type,\n location: match[2]?.trim() || \"unknown\",\n description: match[3]?.trim() || match[1]?.trim() || \"Domain violation detected\",\n suggestion: match[4]?.trim() || \"Fix the domain violation\",\n });\n }\n\n // Try to extract types created\n const typesMatch = content.match(/(?:Types? created|Created types?)[^\\n]*:\\s*([^\\n]+)/i);\n const typesCreated = typesMatch\n ? typesMatch[1].split(/[,\\s]+/).filter((t) => t.trim())\n : undefined;\n\n // Extract veto reason\n let vetoReason: string | undefined;\n if (isVetoed) {\n const reasonMatch = content.match(/(?:VETO(?:ED)?[^\\n]*\\n)(.+?)(?=\\n\\n|$)/is);\n vetoReason = reasonMatch?.[1]?.trim() || \"Domain integrity violation detected\";\n }\n\n return {\n approved: isApproved,\n vetoed: isVetoed,\n violations: violations.length > 0 ? violations : undefined,\n typesCreated,\n vetoReason,\n };\n}\n\nfunction inferViolationType(\n text: string\n): \"primitive_obsession\" | \"invalid_state\" | \"structural_type\" | \"parse_validate\" {\n const lower = text.toLowerCase();\n\n if (lower.includes(\"primitive\")) return \"primitive_obsession\";\n if (lower.includes(\"invalid state\") || lower.includes(\"representable\")) return \"invalid_state\";\n if (lower.includes(\"structural\")) return \"structural_type\";\n if (lower.includes(\"parse\") || lower.includes(\"validate\")) return \"parse_validate\";\n\n return \"primitive_obsession\"; // Default\n}\n\n// Export for testing\nexport const _testExports = {\n executeDomainPhase,\n loadDomainPrompt,\n parseDomainAgentResponse,\n inferViolationType,\n};\n","/**\n * sdlc_green Tool\n *\n * GREEN phase of TDD: Make the failing test pass\n *\n * Spawns a subagent that can ONLY edit implementation files (not tests).\n * Must run tests and return pass output as proof.\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport { registerSubagentSession, unregisterSubagentSession } from \"../hooks/orchestrator-guard.js\";\nimport type { TddCycleTracker } from \"../tracker/tdd-cycle-tracker.js\";\n\n/**\n * Arguments for sdlc_green tool\n */\nexport interface GreenArgs {\n redPhaseComplete: string;\n domainCheckPassed: string;\n}\n\n/**\n * Result from sdlc_green tool\n */\nexport interface GreenResult {\n success: boolean;\n implementationFiles?: string[];\n testsPassed?: boolean;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Create the sdlc_green tool\n */\nexport function createGreenTool(\n ctx: PluginInput,\n config: SdlcConfig,\n tracker: TddCycleTracker\n): ToolDefinition {\n return tool({\n description: `GREEN phase of TDD: Make the failing test pass.\n\nThis tool spawns a subagent that writes the minimum implementation to pass the test. The agent:\n- Can ONLY edit implementation files (NOT test files)\n- Must use domain types created in the DOMAIN phase\n- Writes the MINIMUM code to pass the test\n- Must run tests and confirm they pass\n\nUse this AFTER the RED phase and DOMAIN review.\n\nRequired inputs:\n- redPhaseComplete: Test name + failure message from RED phase\n- domainCheckPassed: Confirmation that DOMAIN review passed`,\n\n args: {\n redPhaseComplete: tool.schema\n .string()\n .describe(\"Test name and failure message from the RED phase (proof of failing test)\"),\n domainCheckPassed: tool.schema\n .string()\n .describe(\"Confirmation from DOMAIN phase that types were reviewed/created\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executeGreenPhase(ctx, config, tracker, args as GreenArgs);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function executeGreenPhase(\n ctx: PluginInput,\n config: SdlcConfig,\n tracker: TddCycleTracker,\n args: GreenArgs\n): Promise<GreenResult> {\n // Validate inputs\n if (!args.redPhaseComplete) {\n return {\n success: false,\n error: \"redPhaseComplete is required\",\n suggestion: \"Run sdlc_red first to create a failing test\",\n };\n }\n\n if (!args.domainCheckPassed) {\n return {\n success: false,\n error: \"domainCheckPassed is required\",\n suggestion: \"Run sdlc_domain after RED to review/create domain types\",\n };\n }\n\n // Check cycle state\n const canStart = tracker.canTransitionTo(\"green\");\n if (!canStart.valid) {\n return {\n success: false,\n error: canStart.reason,\n suggestion: \"Complete RED and DOMAIN phases before GREEN\",\n };\n }\n\n // Start GREEN phase in tracker\n const startResult = tracker.startGreen();\n if (!startResult.success) {\n return {\n success: false,\n error: startResult.error,\n suggestion: \"Ensure RED and DOMAIN phases completed successfully\",\n };\n }\n\n // Get RED phase output for context\n const redOutput = tracker.getLastRedOutput();\n if (!redOutput) {\n return {\n success: false,\n error: \"No RED phase output found\",\n suggestion: \"Run sdlc_red first to create a failing test\",\n };\n }\n\n // Load GREEN prompt\n const greenPrompt = await loadGreenPrompt(ctx.directory, redOutput, args);\n\n // Spawn GREEN agent\n const agentResult = await spawnGreenAgent(ctx, config, greenPrompt);\n\n if (!agentResult.success) {\n return {\n success: false,\n error: agentResult.error || \"GREEN agent failed\",\n suggestion: \"Check agent configuration and try again\",\n };\n }\n\n // Complete GREEN phase in tracker\n if (agentResult.implementationFiles) {\n tracker.completeGreen(agentResult.implementationFiles);\n }\n\n return {\n success: true,\n implementationFiles: agentResult.implementationFiles,\n testsPassed: agentResult.testsPassed,\n };\n}\n\ninterface RedOutput {\n testName: string;\n testFile: string;\n failureMessage: string;\n}\n\nasync function loadGreenPrompt(\n projectDir: string,\n redOutput: RedOutput,\n args: GreenArgs\n): Promise<string> {\n // Try to load custom prompt from project\n const customPromptPath = join(projectDir, \"prompts\", \"agents\", \"green.md\");\n let basePrompt: string;\n\n try {\n basePrompt = await readFile(customPromptPath, \"utf-8\");\n } catch {\n // Use built-in prompt\n basePrompt = getBuiltInGreenPrompt();\n }\n\n // Add context-specific instructions\n const contextInstructions = `\n## Current Context\n\n**Failing Test to Fix:**\n- File: ${redOutput.testFile}\n- Test: ${redOutput.testName}\n- Failure: ${redOutput.failureMessage}\n\n**Domain Types Available:**\n${args.domainCheckPassed}\n\nWrite the MINIMUM implementation to make this test pass.\nDo NOT add features that aren't tested.\nUse the domain types provided.\n`;\n\n return `${basePrompt}\\n\\n${contextInstructions}`;\n}\n\nfunction getBuiltInGreenPrompt(): string {\n return `# GREEN Phase Agent\n\nYou are the GREEN phase agent in TDD. Write the MINIMUM implementation to pass the test.\n\n## Rules\n1. ONLY edit implementation files (NOT test files)\n2. Write the SIMPLEST code that makes the test pass\n3. Use domain types from the DOMAIN phase\n4. Do NOT add features the test doesn't require\n5. Run tests to confirm they pass\n\n## Output Format\nAfter writing the implementation, run the tests and provide:\n- Implementation file(s) changed\n- Confirmation that the test passes\n- Summary of what was implemented\n\nRemember: Make it work, then make it right (refactoring comes later).`;\n}\n\ninterface AgentResult {\n success: boolean;\n implementationFiles?: string[];\n testsPassed?: boolean;\n error?: string;\n}\n\nasync function spawnGreenAgent(\n ctx: PluginInput,\n config: SdlcConfig,\n prompt: string\n): Promise<AgentResult> {\n try {\n // Create session for GREEN agent\n const createResult = await ctx.client.session.create({\n body: {\n title: \"TDD GREEN Phase - Make Test Pass\",\n },\n });\n\n if (!createResult.data?.id) {\n return { success: false, error: \"Failed to create GREEN agent session\" };\n }\n\n const sessionId = createResult.data.id;\n\n // Register session as GREEN subagent for file ownership enforcement\n registerSubagentSession(sessionId, \"green\");\n\n try {\n // Send prompt to agent\n const promptResult = await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: parseModelConfig(config.models.sisyphus || \"anthropic/claude-sonnet-4-20250514\"),\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n if (!promptResult.data) {\n return { success: false, error: \"No response from GREEN agent\" };\n }\n\n // Get the response\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n return { success: false, error: \"No messages in GREEN agent session\" };\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const content = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n // Parse the response to extract implementation info\n const parsed = parseGreenAgentResponse(content);\n\n return {\n success: true,\n ...parsed,\n };\n } finally {\n // Always unregister the session when done\n unregisterSubagentSession(sessionId);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return { success: false, error: `GREEN agent spawn failed: ${message}` };\n }\n}\n\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"anthropic\", modelID: modelID || modelString };\n}\n\nfunction parseGreenAgentResponse(content: string): Partial<AgentResult> {\n // Try to extract implementation info from agent response\n const filesMatch = content.match(/(?:Files?|Modified|Created)[^\\n]*:\\s*([^\\n]+)/gi);\n const passedMatch = content.match(/(?:PASS|passed|success)/i);\n\n const implementationFiles: string[] = [];\n if (filesMatch) {\n for (const match of filesMatch) {\n const files = match.replace(/.*:\\s*/, \"\").split(/[,\\s]+/);\n for (const file of files) {\n if (file.match(/\\.[jt]sx?$/)) {\n implementationFiles.push(file.trim());\n }\n }\n }\n }\n\n return {\n implementationFiles: implementationFiles.length > 0 ? implementationFiles : undefined,\n testsPassed: !!passedMatch,\n };\n}\n\n// Export for testing\nexport const _testExports = {\n executeGreenPhase,\n loadGreenPrompt,\n parseGreenAgentResponse,\n};\n","/**\n * sdlc_red Tool\n *\n * RED phase of TDD: Write a failing test\n *\n * Spawns a subagent that can ONLY edit test files.\n * Must run tests and return failure output as proof.\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport { registerSubagentSession, unregisterSubagentSession } from \"../hooks/orchestrator-guard.js\";\nimport type { TddCycleTracker } from \"../tracker/tdd-cycle-tracker.js\";\n\n/**\n * Context for the RED phase\n */\nexport type RedContext = \"FIRST_TEST\" | \"CONTINUING\" | \"DRILL_DOWN\";\n\n/**\n * Arguments for sdlc_red tool\n */\nexport interface RedArgs {\n context: RedContext;\n acceptanceCriteria?: string;\n previousCycleProof?: string;\n}\n\n/**\n * Result from sdlc_red tool\n */\nexport interface RedResult {\n success: boolean;\n testName?: string;\n testFile?: string;\n failureMessage?: string;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Create the sdlc_red tool\n */\nexport function createRedTool(\n ctx: PluginInput,\n config: SdlcConfig,\n tracker: TddCycleTracker\n): ToolDefinition {\n return tool({\n description: `RED phase of TDD: Write a failing test.\n\nThis tool spawns a subagent that writes a single failing test. The agent:\n- Can ONLY edit test files (*.test.ts, *.spec.ts, __tests__/**)\n- Must write ONE focused test\n- Must run the test and capture the failure\n- Returns failure proof for the GREEN phase\n\nUse this FIRST when starting TDD implementation.\n\nContext types:\n- FIRST_TEST: Starting a new feature/acceptance criterion\n- CONTINUING: Adding next test after a GREEN cycle\n- DRILL_DOWN: Breaking a complex test into smaller ones`,\n\n args: {\n context: tool.schema\n .enum([\"FIRST_TEST\", \"CONTINUING\", \"DRILL_DOWN\"])\n .describe(\n \"TDD context: FIRST_TEST for new feature, CONTINUING for next test, DRILL_DOWN for splitting\"\n ),\n acceptanceCriteria: tool.schema\n .string()\n .optional()\n .describe(\"The acceptance criteria being tested (required for FIRST_TEST)\"),\n previousCycleProof: tool.schema\n .string()\n .optional()\n .describe(\"Proof from previous GREEN cycle (required for CONTINUING)\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executeRedPhase(ctx, config, tracker, args as RedArgs);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function executeRedPhase(\n ctx: PluginInput,\n config: SdlcConfig,\n tracker: TddCycleTracker,\n args: RedArgs\n): Promise<RedResult> {\n // Validate context requirements\n if (args.context === \"FIRST_TEST\" && !args.acceptanceCriteria) {\n return {\n success: false,\n error: \"acceptanceCriteria required for FIRST_TEST context\",\n suggestion: \"Provide the acceptance criteria you want to test\",\n };\n }\n\n if (args.context === \"CONTINUING\" && !args.previousCycleProof) {\n return {\n success: false,\n error: \"previousCycleProof required for CONTINUING context\",\n suggestion: \"Provide proof from the previous GREEN cycle\",\n };\n }\n\n // Check cycle state\n const canStart = tracker.canTransitionTo(\"red\");\n if (!canStart.valid) {\n return {\n success: false,\n error: canStart.reason,\n suggestion: \"Complete the current phase before starting RED\",\n };\n }\n\n // Start RED phase in tracker\n const startResult = tracker.startRed();\n if (!startResult.success) {\n return {\n success: false,\n error: startResult.error,\n };\n }\n\n // Load RED prompt\n const redPrompt = await loadRedPrompt(ctx.directory, args);\n\n // Spawn RED agent\n const agentResult = await spawnRedAgent(ctx, config, redPrompt);\n\n if (!agentResult.success) {\n return {\n success: false,\n error: agentResult.error || \"RED agent failed\",\n suggestion: \"Check agent configuration and try again\",\n };\n }\n\n // Complete RED phase in tracker\n if (agentResult.testName && agentResult.testFile && agentResult.failureMessage) {\n tracker.completeRed(agentResult.testName, agentResult.testFile, agentResult.failureMessage);\n }\n\n return {\n success: true,\n testName: agentResult.testName,\n testFile: agentResult.testFile,\n failureMessage: agentResult.failureMessage,\n };\n}\n\nasync function loadRedPrompt(projectDir: string, args: RedArgs): Promise<string> {\n // Try to load custom prompt from project\n const customPromptPath = join(projectDir, \"prompts\", \"agents\", \"red.md\");\n let basePrompt: string;\n\n try {\n basePrompt = await readFile(customPromptPath, \"utf-8\");\n } catch {\n // Use built-in prompt\n basePrompt = getBuiltInRedPrompt();\n }\n\n // Add context-specific instructions\n let contextInstructions = \"\";\n\n switch (args.context) {\n case \"FIRST_TEST\":\n contextInstructions = `\n## Context: FIRST_TEST\n\nYou are writing the FIRST test for a new acceptance criterion.\n\n**Acceptance Criteria to Test:**\n${args.acceptanceCriteria}\n\nWrite a single, focused test that:\n1. Tests the smallest behavior from this acceptance criterion\n2. Uses domain language from the acceptance criteria\n3. Will FAIL because no implementation exists\n`;\n break;\n\n case \"CONTINUING\":\n contextInstructions = `\n## Context: CONTINUING\n\nYou are writing the NEXT test after a successful GREEN cycle.\n\n**Previous Cycle Proof:**\n${args.previousCycleProof}\n\nWrite a single, focused test that:\n1. Builds on the previous implementation\n2. Tests the next smallest behavior\n3. Will FAIL because this new behavior doesn't exist yet\n`;\n break;\n\n case \"DRILL_DOWN\":\n contextInstructions = `\n## Context: DRILL_DOWN\n\nYou are breaking down a complex test into smaller, focused tests.\n\nWrite smaller tests that:\n1. Each test ONE specific behavior\n2. Together cover the same scope as the original\n3. Are easier to implement incrementally\n`;\n break;\n }\n\n return `${basePrompt}\\n\\n${contextInstructions}`;\n}\n\nfunction getBuiltInRedPrompt(): string {\n return `# RED Phase Agent\n\nYou are the RED phase agent in TDD. Write a SINGLE failing test.\n\n## Rules\n1. ONLY edit test files (*.test.ts, *.spec.ts, __tests__/**)\n2. Write ONE focused test\n3. Test MUST fail (the feature doesn't exist yet)\n4. Use clear test names that describe behavior\n\n## Output Format\nAfter writing the test, run it and provide:\n- Test file path\n- Test name (describe > it)\n- Failure message\n\nThe test failure is EXPECTED and proves the test is valid.`;\n}\n\ninterface AgentResult {\n success: boolean;\n testName?: string;\n testFile?: string;\n failureMessage?: string;\n error?: string;\n}\n\nasync function spawnRedAgent(\n ctx: PluginInput,\n config: SdlcConfig,\n prompt: string\n): Promise<AgentResult> {\n try {\n // Create session for RED agent\n const createResult = await ctx.client.session.create({\n body: {\n title: \"TDD RED Phase - Write Failing Test\",\n },\n });\n\n if (!createResult.data?.id) {\n return { success: false, error: \"Failed to create RED agent session\" };\n }\n\n const sessionId = createResult.data.id;\n\n // Register session as RED subagent for file ownership enforcement\n registerSubagentSession(sessionId, \"red\");\n\n try {\n // Send prompt to agent\n const promptResult = await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: parseModelConfig(config.models.sisyphus || \"anthropic/claude-sonnet-4-20250514\"),\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n if (!promptResult.data) {\n return { success: false, error: \"No response from RED agent\" };\n }\n\n // Get the response\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n return { success: false, error: \"No messages in RED agent session\" };\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const content = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n // Parse the response to extract test info\n const parsed = parseRedAgentResponse(content);\n\n return {\n success: true,\n ...parsed,\n };\n } finally {\n // Always unregister the session when done\n unregisterSubagentSession(sessionId);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return { success: false, error: `RED agent spawn failed: ${message}` };\n }\n}\n\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"anthropic\", modelID: modelID || modelString };\n}\n\nfunction parseRedAgentResponse(content: string): Partial<AgentResult> {\n // Try to extract test info from agent response\n // Look for common patterns in test output\n\n const testFileMatch = content.match(/(?:File|Path):\\s*([^\\n]+\\.(?:test|spec)\\.[jt]sx?)/i);\n const testNameMatch = content.match(/(?:Test|Name):\\s*(.+?)(?:\\n|$)/i);\n const failureMatch = content.match(/(?:Failure|Error|FAIL)[^\\n]*:\\s*(.+?)(?:\\n\\n|\\n[A-Z]|$)/is);\n\n return {\n testFile: testFileMatch?.[1]?.trim(),\n testName: testNameMatch?.[1]?.trim(),\n failureMessage: failureMatch?.[1]?.trim() || \"Test failed (see agent output)\",\n };\n}\n\n// Export for testing\nexport const _testExports = {\n executeRedPhase,\n loadRedPrompt,\n parseRedAgentResponse,\n};\n","import { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig, UpdateIssueStatusResult } from \"../../shared/types.js\";\nimport type { IssueTracker } from \"../tracker/issue-tracker.js\";\nimport { moveIssueToStatus } from \"../utils/github-issues.js\";\n\nexport function createUpdateIssueStatusTool(\n ctx: PluginInput,\n tracker: IssueTracker,\n config: SdlcConfig\n): ToolDefinition {\n return tool({\n description: `Update a GitHub issue's status on the project board.\n\nMoves the issue to the specified status column.`,\n\n args: {\n issueNumber: tool.schema.number().int().positive().describe(\"GitHub issue number\"),\n status: tool.schema.string().describe(\"Target status column name\"),\n },\n\n async execute(args): Promise<string> {\n const success = await moveIssueToStatus(ctx, config, args.issueNumber, args.status);\n\n if (success) {\n await tracker.updateIssueStatus(args.issueNumber, args.status);\n }\n\n const result: UpdateIssueStatusResult = success\n ? {\n success: true,\n issueNumber: args.issueNumber,\n newStatus: args.status,\n updatedAt: new Date().toISOString(),\n }\n : {\n success: false,\n issueNumber: args.issueNumber,\n error: \"Failed to move issue on project board\",\n suggestion: \"Check GitHub project configuration and status names\",\n };\n\n return JSON.stringify(result, null, 2);\n },\n });\n}\n","import type { PluginInput, ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport type { IssueTracker } from \"../tracker/issue-tracker.js\";\nimport { TddCycleTracker } from \"../tracker/tdd-cycle-tracker.js\";\nimport { createAdrTool } from \"./adr.js\";\nimport { createConfigTool } from \"./config.js\";\nimport { createDesignWorkflowTool } from \"./event-design-workflow.js\";\nimport { createDiscoverDomainTool } from \"./event-discover-domain.js\";\nimport { createGenerateGwtTool } from \"./event-generate-gwt.js\";\nimport { createValidateModelTool } from \"./event-validate-model.js\";\nimport { createGetContextTool } from \"./get-context.js\";\nimport { createGetIssueTool } from \"./get-issue.js\";\nimport { createListIssuesTool } from \"./list-issues.js\";\nimport { createRecallTool } from \"./memory-recall.js\";\nimport { createRememberTool } from \"./memory-remember.js\";\nimport { createMutationTool } from \"./mutation.js\";\nimport { createPartyDiscussionTool } from \"./party-discussion.js\";\nimport { createPartyReviewTool } from \"./party-review.js\";\nimport { createReviewPrTool } from \"./review-pr.js\";\nimport { createStoryReviewAnalyzeTool } from \"./story-review-analyze.js\";\nimport { createStoryReviewConsultTool } from \"./story-review-consult.js\";\nimport { createDomainTool } from \"./tdd-domain.js\";\nimport { createGreenTool } from \"./tdd-green.js\";\nimport { createRedTool } from \"./tdd-red.js\";\nimport { createUpdateIssueStatusTool } from \"./update-issue-status.js\";\n\n/**\n * Create all Sdlc tools\n *\n * @param ctx - Plugin context from OpenCode\n * @param tracker - Issue tracker instance\n * @param config - Sdlc configuration\n * @returns Object containing all tool definitions\n */\nexport function createTools(\n ctx: PluginInput,\n tracker: IssueTracker,\n config: SdlcConfig\n): Record<string, ToolDefinition> {\n // Create TDD cycle tracker if TDD is enabled\n // Use a hash of the directory as a stable session identifier\n const sessionId = `tdd-${Buffer.from(ctx.directory).toString(\"base64\").slice(0, 16)}`;\n const tddTracker = new TddCycleTracker(ctx.directory, sessionId);\n\n const tools: Record<string, ToolDefinition> = {\n sdlc_get_issue: createGetIssueTool(ctx, tracker, config),\n sdlc_list_issues: createListIssuesTool(ctx, config),\n sdlc_update_issue_status: createUpdateIssueStatusTool(ctx, tracker, config),\n sdlc_get_context: createGetContextTool(tracker, config),\n sdlc_config: createConfigTool(config),\n sdlc_story_review_analyze: createStoryReviewAnalyzeTool(ctx, config),\n sdlc_story_review_consult: createStoryReviewConsultTool(ctx, config),\n sdlc_party_discussion: createPartyDiscussionTool(ctx, config),\n // Event Modeling tools - always available for optional planning\n sdlc_discover_domain: createDiscoverDomainTool(ctx, config),\n sdlc_design_workflow: createDesignWorkflowTool(ctx, config),\n sdlc_generate_gwt: createGenerateGwtTool(ctx, config),\n sdlc_validate_model: createValidateModelTool(ctx, config),\n // Review System tools\n sdlc_review_pr: createReviewPrTool(ctx, config),\n sdlc_mutation: createMutationTool(ctx, config),\n sdlc_adr: createAdrTool(ctx, config),\n sdlc_party_review: createPartyReviewTool(ctx, config),\n // Memory tools\n sdlc_remember: createRememberTool(ctx, config),\n sdlc_recall: createRecallTool(ctx, config),\n };\n\n // Add TDD tools if TDD is enabled\n if (config.tdd?.enabled) {\n tools.sdlc_red = createRedTool(ctx, config, tddTracker);\n tools.sdlc_green = createGreenTool(ctx, config, tddTracker);\n tools.sdlc_domain = createDomainTool(ctx, config, tddTracker);\n }\n\n return tools;\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { CONFIG_PATHS } from \"../../shared/constants.js\";\nimport type { IssueTrackerState, OpenCodeTodo, TrackedIssue } from \"../../shared/types.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\n\nconst log = createPluginLogger(\"issue-tracker\");\n\n/**\n * Issue tracker that persists state across sessions.\n *\n * Tracks the current GitHub issue being worked on and history of status changes.\n */\nexport class IssueTracker {\n private state: IssueTrackerState;\n private stateFilePath: string;\n private projectDir: string;\n\n constructor(projectDir: string) {\n this.projectDir = projectDir;\n this.stateFilePath = CONFIG_PATHS.stateFile;\n this.state = {\n currentIssue: null,\n sessionId: crypto.randomUUID(),\n projectDir,\n history: [],\n };\n }\n\n async initialize(): Promise<void> {\n if (existsSync(this.stateFilePath)) {\n try {\n const content = await readFile(this.stateFilePath, \"utf-8\");\n const savedState = JSON.parse(content) as IssueTrackerState;\n\n if (savedState.projectDir === this.projectDir) {\n this.state = {\n ...savedState,\n sessionId: crypto.randomUUID(),\n };\n }\n } catch {\n // Ignore errors and start fresh\n }\n }\n }\n\n async setCurrentIssue(\n issueNumber: number,\n data: Omit<TrackedIssue, \"issueNumber\">\n ): Promise<void> {\n this.state.currentIssue = { issueNumber, ...data };\n this.addHistoryEntry(issueNumber, data.status);\n await this.saveState();\n }\n\n async updateIssueStatus(issueNumber: number, status: string): Promise<void> {\n if (this.state.currentIssue?.issueNumber === issueNumber) {\n this.state.currentIssue.status = status;\n if (status.toLowerCase() === \"done\") {\n this.state.currentIssue.completedAt = new Date().toISOString();\n }\n }\n this.addHistoryEntry(issueNumber, status);\n await this.saveState();\n }\n\n async updateIssueBody(body: string | null): Promise<void> {\n if (this.state.currentIssue) {\n this.state.currentIssue.body = body;\n await this.saveState();\n }\n }\n\n getCurrentIssue(): TrackedIssue | null {\n return this.state.currentIssue;\n }\n\n async getCurrentIssueContext(): Promise<string | null> {\n if (!this.state.currentIssue) return null;\n\n const issue = this.state.currentIssue;\n const recentHistory = this.state.history\n .slice(-5)\n .map((h) => `- #${h.issueNumber}: ${h.status} at ${h.timestamp}`)\n .join(\"\\n\");\n\n return `Current Issue: #${issue.issueNumber}\\nTitle: ${issue.title}\\nStatus: ${issue.status}\\nStarted: ${issue.startedAt}\\n${issue.completedAt ? `Completed: ${issue.completedAt}` : \"\"}\\n\\nRecent Activity:\\n${recentHistory}`;\n }\n\n getSessionId(): string {\n return this.state.sessionId;\n }\n\n getHistory(): IssueTrackerState[\"history\"] {\n return this.state.history;\n }\n\n getCurrentTodos(): OpenCodeTodo[] | null {\n return this.state.currentTodos || null;\n }\n\n async setCurrentTodos(todos: OpenCodeTodo[]): Promise<void> {\n this.state.currentTodos = todos;\n await this.saveState();\n }\n\n async clearTodos(): Promise<void> {\n this.state.currentTodos = undefined;\n await this.saveState();\n }\n\n private addHistoryEntry(issueNumber: number, status: string): void {\n this.state.history.push({\n issueNumber,\n status,\n timestamp: new Date().toISOString(),\n });\n\n if (this.state.history.length > 100) {\n this.state.history = this.state.history.slice(-100);\n }\n }\n\n private async saveState(): Promise<void> {\n try {\n const dir = dirname(this.stateFilePath);\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n await writeFile(this.stateFilePath, JSON.stringify(this.state, null, 2), \"utf-8\");\n } catch (error) {\n log.warn(\"Failed to save tracker state\", { error });\n }\n }\n}\n","import { z } from \"zod\";\n\n/**\n * Zod validation schemas for OpenCode SDLC\n */\n\n// ============================================================================\n// Configuration Schemas\n// ============================================================================\n\n/**\n * Schema for subscription configuration\n */\nexport const SubscriptionSchema = z.object({\n claude: z.object({\n enabled: z.boolean(),\n tier: z.enum([\"max5x\", \"max20x\", \"pro\", \"none\"]),\n }),\n openai: z.object({\n enabled: z.boolean(),\n }),\n google: z.object({\n enabled: z.boolean(),\n authMethod: z.enum([\"antigravity\", \"personal\", \"api\", \"none\"]),\n }),\n githubCopilot: z.object({\n enabled: z.boolean(),\n plan: z.enum([\"free\", \"pro\", \"pro-plus\", \"business\", \"enterprise\", \"none\"]),\n enabledModels: z.array(z.string()).optional(),\n }),\n});\n\n// ============================================================================\n// GitHub Issues Configuration Schemas\n// ============================================================================\n\n/**\n * Schema for GitHub project board statuses\n */\nexport const GitHubStatusSchema = z.enum([\"Backlog\", \"Ready\", \"In progress\", \"In review\", \"Done\"]);\n\n/**\n * Schema for GitHub Issues integration configuration\n */\nexport const GitHubConfigSchema = z.object({\n owner: z.string().describe(\"GitHub repository owner (user or org)\"),\n repo: z.string().describe(\"GitHub repository name\"),\n project: z.number().optional().describe(\"GitHub Project number for board tracking\"),\n statuses: z\n .array(GitHubStatusSchema)\n .default([\"Backlog\", \"Ready\", \"In progress\", \"In review\", \"Done\"])\n .describe(\"Project board column names\"),\n});\n\n// ============================================================================\n// TDD Configuration Schemas\n// ============================================================================\n\n/**\n * Schema for TDD verbosity levels\n */\nexport const TddVerbositySchema = z.enum([\"silent\", \"brief\", \"explain\"]);\n\n/**\n * Schema for mutation testing configuration\n */\nexport const MutationTestingConfigSchema = z.object({\n enabled: z.boolean().default(false).describe(\"Enable mutation testing\"),\n requiredScore: z\n .number()\n .min(0)\n .max(100)\n .default(80)\n .describe(\"Minimum mutation score required (0-100)\"),\n});\n\n/**\n * Schema for TDD cycle enforcement configuration\n */\nexport const TddConfigSchema = z.object({\n enabled: z.boolean().default(true).describe(\"Enable TDD cycle enforcement\"),\n verbosity: TddVerbositySchema.default(\"brief\").describe(\"TDD feedback verbosity\"),\n bypassPatterns: z\n .array(z.string())\n .default([\"*.config.*\", \"*.json\", \"*.md\", \"*.yaml\", \"*.yml\"])\n .describe(\"File patterns that bypass TDD checks\"),\n mutationTesting: MutationTestingConfigSchema.default({\n enabled: false,\n requiredScore: 80,\n }),\n});\n\n// ============================================================================\n// Event Modeling Configuration Schemas\n// ============================================================================\n\n/**\n * Schema for Event Modeling integration configuration\n */\nexport const EventModelingConfigSchema = z.object({\n enabled: z.boolean().default(false).describe(\"Enable Event Modeling workflow\"),\n outputPath: z.string().default(\"docs/event-model\").describe(\"Path to event model output files\"),\n});\n\n// ============================================================================\n// Git Workflow Configuration Schemas\n// ============================================================================\n\n/**\n * Schema for Git workflow types\n */\nexport const GitWorkflowSchema = z.enum([\"standard\", \"git-spice\"]);\n\n/**\n * Schema for Git integration configuration\n */\nexport const GitConfigSchema = z.object({\n workflow: GitWorkflowSchema.default(\"standard\").describe(\"Git workflow style\"),\n requireClean: z\n .boolean()\n .default(true)\n .describe(\"Require clean working directory before operations\"),\n worktrees: z.boolean().default(false).describe(\"Enable git worktrees for parallel work\"),\n});\n\n// ============================================================================\n// Feature Flags Schemas\n// ============================================================================\n\n/**\n * Schema for SDLC feature flags (v0.3.0+)\n */\nexport const FeaturesSchema = z.object({\n orchestratorOnly: z\n .boolean()\n .default(false)\n .describe(\"Main conversation delegates all file writes to agents\"),\n todoSync: z.boolean().default(true).describe(\"Auto-sync todos with GitHub issue checkboxes\"),\n partyReview: z.boolean().default(true).describe(\"Enable party review for architecture decisions\"),\n debuggingProtocol: z.boolean().default(true).describe(\"Enable debugging protocol with Oracle\"),\n memento: z.boolean().default(false).describe(\"Enable Memento MCP for persistent memory\"),\n notifications: z.boolean().default(true).describe(\"Show in-TUI notifications\"),\n lspTools: z.boolean().default(true).describe(\"Enable LSP tools for code intelligence\"),\n});\n\n/**\n * Schema for MCP configuration (v0.3.0+)\n */\nexport const McpsSchema = z.object({\n context7: z.boolean().default(true).describe(\"Context7 for library documentation\"),\n exa: z.boolean().default(true).describe(\"Exa for web search\"),\n grepApp: z.boolean().default(true).describe(\"grep.app for code search\"),\n memento: z.boolean().default(false).describe(\"Memento for persistent memory\"),\n});\n\n// ============================================================================\n// Legacy BMAD Configuration Schema (Deprecated)\n// ============================================================================\n\n/**\n * @deprecated Use GitHubConfigSchema instead. BMAD configuration is no longer supported in v0.3.0+.\n */\nexport const LegacyBmadConfigSchema = z.object({\n defaultTrack: z.enum([\"quick-flow\", \"enterprise\"]),\n autoStatusUpdate: z.boolean(),\n parallelIssueLimit: z.number().int().min(0).max(10),\n paths: z\n .object({\n prd: z.string().nullable().optional(),\n architecture: z.string().nullable().optional(),\n })\n .optional(),\n});\n\n/**\n * @deprecated Use FeaturesSchema instead. Legacy feature flags from pre-0.3.0.\n */\nexport const LegacyFeaturesSchema = z.object({\n bmadBridge: z.boolean(),\n autoStatus: z.boolean(),\n parallelExecution: z.boolean(),\n notifications: z.boolean(),\n contextMonitor: z.boolean(),\n commentChecker: z.boolean(),\n lspTools: z.boolean(),\n autoGitOperations: z.boolean().default(false),\n todoSync: z.boolean().default(true),\n});\n\n/**\n * @deprecated Use McpsSchema instead. Legacy MCP config from pre-0.3.0.\n */\nexport const LegacyMcpsSchema = z.object({\n context7: z.boolean(),\n exa: z.boolean(),\n grepApp: z.boolean(),\n});\n\n/**\n * Schema for LLM provider\n */\nexport const LLMProviderSchema = z.enum([\"anthropic\", \"openai\", \"google\", \"github-copilot\"]);\n\n/**\n * Schema for agent routing configuration\n */\nexport const AgentRoutingSchema = z.object({\n requiresThinking: z.boolean().optional(),\n preferProvider: LLMProviderSchema.optional(),\n});\n\n/**\n * Schema for routing configuration\n */\nexport const RoutingConfigSchema = z.object({\n providerPriority: z.array(LLMProviderSchema),\n modelFamilyPriority: z.object({\n claude: z.array(LLMProviderSchema).optional(),\n gpt: z.array(LLMProviderSchema).optional(),\n gemini: z.array(LLMProviderSchema).optional(),\n }),\n agentOverrides: z.object({\n sisyphus: AgentRoutingSchema.optional(),\n oracle: AgentRoutingSchema.optional(),\n librarian: AgentRoutingSchema.optional(),\n frontend: AgentRoutingSchema.optional(),\n documentWriter: AgentRoutingSchema.optional(),\n multimodalLooker: AgentRoutingSchema.optional(),\n }),\n fallbackBehavior: z.object({\n autoFallback: z.boolean(),\n retryPeriodMs: z.number().min(0),\n notifyOnRateLimit: z.boolean(),\n }),\n});\n\n/**\n * Schema for thinking level\n */\nexport const ThinkingLevelSchema = z.enum([\"off\", \"low\", \"medium\", \"high\"]);\n\n/**\n * Schema for agent settings (temperature and thinking level)\n */\nexport const AgentSettingsSchema = z.object({\n temperature: z.number().min(0).max(1).optional(),\n thinkingLevel: ThinkingLevelSchema.optional(),\n});\n\n/**\n * Schema for custom model definition\n */\nexport const CustomModelDefinitionSchema = z.object({\n id: z.string(),\n name: z.string(),\n provider: z.enum([\"anthropic\", \"openai\", \"google\", \"github-copilot\"]),\n description: z.string().optional(),\n capabilities: z\n .object({\n thinking: z.boolean().optional(),\n contextWindow: z.number().optional(),\n supportsTemperature: z.boolean().optional(),\n })\n .optional(),\n});\n\n/**\n * Schema for agent model assignments\n */\nexport const ModelsSchema = z.object({\n sisyphus: z.string().describe(\"Model for main orchestrator agent\"),\n oracle: z.string().describe(\"Model for debugging/reasoning agent\"),\n librarian: z.string().describe(\"Model for research/documentation agent\"),\n frontend: z.string().optional().describe(\"Model for UI/UX agent\"),\n documentWriter: z.string().optional().describe(\"Model for documentation generation agent\"),\n multimodalLooker: z.string().optional().describe(\"Model for image analysis agent\"),\n settings: z\n .object({\n sisyphus: AgentSettingsSchema.optional(),\n oracle: AgentSettingsSchema.optional(),\n librarian: AgentSettingsSchema.optional(),\n frontend: AgentSettingsSchema.optional(),\n documentWriter: AgentSettingsSchema.optional(),\n multimodalLooker: AgentSettingsSchema.optional(),\n overrides: z.record(z.string(), AgentSettingsSchema).optional(),\n })\n .optional(),\n custom: z.array(CustomModelDefinitionSchema).optional(),\n});\n\n/**\n * Complete SDLC configuration schema (v0.3.0+)\n *\n * Supports transitional state:\n * - New fields (github, tdd, eventModeling, git) are optional during migration\n * - Old field (bmad) is optional and deprecated\n * - Features/MCPs support both old and new structures via union\n */\nexport const SdlcConfigSchema = z.object({\n $schema: z.string().optional(),\n version: z.string(),\n subscriptions: SubscriptionSchema,\n models: ModelsSchema,\n // New v0.3.0+ configuration (optional during migration)\n github: GitHubConfigSchema.optional(),\n tdd: TddConfigSchema.optional(),\n eventModeling: EventModelingConfigSchema.optional(),\n git: GitConfigSchema.optional(),\n // Legacy BMAD configuration (deprecated, optional for backward compatibility)\n bmad: LegacyBmadConfigSchema.optional(),\n // Features and MCPs support both old and new structures\n features: z.union([FeaturesSchema, LegacyFeaturesSchema]),\n mcps: z.union([McpsSchema, LegacyMcpsSchema]),\n routing: RoutingConfigSchema,\n});\n\n/**\n * @deprecated Alias for backward compatibility. Use LegacyBmadConfigSchema directly.\n */\nexport const BmadConfigSchema = LegacyBmadConfigSchema;\n\n// ============================================================================\n// Tool Argument Schemas\n// ============================================================================\n\n/**\n * Schema for sdlc_get_issue arguments\n */\nexport const GetIssueArgsSchema = z.object({\n issueNumber: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Specific GitHub issue number. If omitted, loads the next issue in Ready status.\"),\n});\n\n/**\n * Schema for sdlc_update_issue_status arguments\n */\nexport const UpdateIssueStatusArgsSchema = z.object({\n issueNumber: z.number().int().positive().describe(\"GitHub issue number\"),\n status: z.string().describe(\"New status (must match a column name in GitHub project statuses)\"),\n});\n\n/**\n * Schema for sdlc_list_issues arguments\n */\nexport const ListIssuesArgsSchema = z.object({\n status: z.string().optional().describe(\"Filter by status column name\"),\n limit: z.number().int().positive().optional().default(20).describe(\"Max issues to return\"),\n});\n\n/**\n * Schema for sdlc_get_context arguments\n */\nexport const GetContextArgsSchema = z.object({});\n\n/**\n * Schema for sdlc_parallel arguments\n */\nexport const ParallelArgsSchema = z.object({\n issueNumbers: z.array(z.number()).describe(\"Array of issue numbers to implement in parallel\"),\n maxConcurrent: z.number().int().min(1).max(5).optional().default(3),\n});\n\n/**\n * Schema for sdlc_config arguments\n */\nexport const ConfigArgsSchema = z.object({\n action: z.enum([\"get\", \"set\", \"reset\"]).describe(\"Configuration action to perform\"),\n key: z\n .string()\n .optional()\n .describe(\"Configuration key (dot notation, e.g., 'bmad.autoStatusUpdate')\"),\n value: z.unknown().optional().describe(\"Value to set (for 'set' action)\"),\n});\n\n// ============================================================================\n// Type Exports (inferred from schemas)\n// ============================================================================\n\n// Core configuration types\nexport type SubscriptionConfig = z.infer<typeof SubscriptionSchema>;\nexport type ModelsConfig = z.infer<typeof ModelsSchema>;\nexport type RoutingConfigValidated = z.infer<typeof RoutingConfigSchema>;\nexport type SdlcConfigValidated = z.infer<typeof SdlcConfigSchema>;\n\n// New v0.3.0 configuration types\nexport type GitHubConfigValidated = z.infer<typeof GitHubConfigSchema>;\nexport type GitHubStatusValidated = z.infer<typeof GitHubStatusSchema>;\nexport type TddConfigValidated = z.infer<typeof TddConfigSchema>;\nexport type TddVerbosityValidated = z.infer<typeof TddVerbositySchema>;\nexport type MutationTestingConfigValidated = z.infer<typeof MutationTestingConfigSchema>;\nexport type EventModelingConfigValidated = z.infer<typeof EventModelingConfigSchema>;\nexport type GitConfigValidated = z.infer<typeof GitConfigSchema>;\nexport type GitWorkflowValidated = z.infer<typeof GitWorkflowSchema>;\nexport type FeaturesConfig = z.infer<typeof FeaturesSchema>;\nexport type McpsConfig = z.infer<typeof McpsSchema>;\n\n// Legacy/deprecated types (for backward compatibility)\n/** @deprecated Use GitHubConfigValidated instead */\nexport type BmadConfig = z.infer<typeof LegacyBmadConfigSchema>;\n","/**\n * Configuration loader for Sdlc plugin\n *\n * Loads SdlcConfig from project-local or global config files.\n * Project config takes priority over global config.\n * Uses Zod validation for type safety and clear error messages.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { CONFIG_PATHS, DEFAULTS } from \"../../shared/constants.js\";\nimport { SdlcConfigSchema } from \"../../shared/schemas.js\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport { createPluginLogger } from \"./plugin-logger.js\";\n\nconst log = createPluginLogger(\"config-loader\");\n\n/**\n * Load Sdlc configuration from available config files.\n *\n * Priority order:\n * 1. Project-local: [projectDir]/.opencode/sdlc.json\n * 2. Global: ~/.config/opencode/sdlc.json\n * 3. Default values if no config found\n *\n * @param projectDir - The project directory to search for local config\n * @returns The merged Sdlc configuration\n */\nexport async function loadSdlcConfig(projectDir: string): Promise<SdlcConfig> {\n // Try project-local config first\n const localConfigPath = join(projectDir, \".opencode\", \"sdlc.json\");\n const localConfig = await loadConfigFile(localConfigPath);\n\n // Try global config\n const globalConfig = await loadConfigFile(CONFIG_PATHS.globalSdlcConfig);\n\n // Merge configs: local overrides global, both override defaults\n const merged = mergeConfigs(getDefaultConfig(), globalConfig, localConfig);\n\n // Validate the final merged config\n return validateConfig(merged);\n}\n\n/**\n * Load and parse a JSON config file\n */\nasync function loadConfigFile(filePath: string): Promise<Partial<SdlcConfig> | null> {\n if (!existsSync(filePath)) {\n return null;\n }\n\n try {\n const content = await readFile(filePath, \"utf-8\");\n const parsed = JSON.parse(content);\n\n // Perform partial validation to catch obvious errors early\n // We don't require all fields since this is a partial config\n return validatePartialConfig(parsed, filePath);\n } catch (error) {\n if (error instanceof SyntaxError) {\n log.warn(\"Invalid JSON in config file\", { filePath, message: error.message });\n } else {\n log.warn(\"Failed to load config file\", { filePath, error });\n }\n return null;\n }\n}\n\n/**\n * Validate a partial config file and return it with warnings for invalid fields\n */\nfunction validatePartialConfig(config: unknown, filePath: string): Partial<SdlcConfig> | null {\n if (typeof config !== \"object\" || config === null) {\n log.warn(\"Config file must be an object\", { filePath });\n return null;\n }\n\n const result: Partial<SdlcConfig> = {};\n const configObj = config as Record<string, unknown>;\n\n // Validate and copy each top-level field\n if (\"version\" in configObj && typeof configObj.version === \"string\") {\n result.version = configObj.version;\n }\n\n if (\"$schema\" in configObj && typeof configObj.$schema === \"string\") {\n result.$schema = configObj.$schema;\n }\n\n // Validate subscriptions\n if (\"subscriptions\" in configObj && typeof configObj.subscriptions === \"object\") {\n const subs = configObj.subscriptions as Record<string, unknown>;\n result.subscriptions = {} as SdlcConfig[\"subscriptions\"];\n\n if (subs.claude && typeof subs.claude === \"object\") {\n const claude = subs.claude as Record<string, unknown>;\n result.subscriptions.claude = {\n enabled: typeof claude.enabled === \"boolean\" ? claude.enabled : false,\n tier: isValidTier(claude.tier) ? claude.tier : \"none\",\n };\n }\n\n if (subs.openai && typeof subs.openai === \"object\") {\n const openai = subs.openai as Record<string, unknown>;\n result.subscriptions.openai = {\n enabled: typeof openai.enabled === \"boolean\" ? openai.enabled : false,\n };\n }\n\n if (subs.google && typeof subs.google === \"object\") {\n const google = subs.google as Record<string, unknown>;\n result.subscriptions.google = {\n enabled: typeof google.enabled === \"boolean\" ? google.enabled : false,\n authMethod: isValidAuthMethod(google.authMethod) ? google.authMethod : \"none\",\n };\n }\n\n if (subs.githubCopilot && typeof subs.githubCopilot === \"object\") {\n const copilot = subs.githubCopilot as Record<string, unknown>;\n result.subscriptions.githubCopilot = {\n enabled: typeof copilot.enabled === \"boolean\" ? copilot.enabled : false,\n plan: isValidCopilotPlan(copilot.plan) ? copilot.plan : \"none\",\n enabledModels: Array.isArray(copilot.enabledModels)\n ? copilot.enabledModels.filter((m): m is string => typeof m === \"string\")\n : undefined,\n };\n }\n }\n\n // Validate models\n if (\"models\" in configObj && typeof configObj.models === \"object\") {\n const models = configObj.models as Record<string, unknown>;\n result.models = {} as SdlcConfig[\"models\"];\n\n const modelKeys = [\n \"sisyphus\",\n \"oracle\",\n \"librarian\",\n \"frontend\",\n \"documentWriter\",\n \"multimodalLooker\",\n ] as const;\n\n for (const key of modelKeys) {\n if (key in models && typeof models[key] === \"string\") {\n (result.models as unknown as Record<string, string>)[key] = models[key] as string;\n }\n }\n\n if (\"settings\" in models && typeof models.settings === \"object\" && models.settings !== null) {\n result.models.settings = validateModelSettings(models.settings as Record<string, unknown>);\n }\n\n if (\"custom\" in models && Array.isArray(models.custom)) {\n result.models.custom = validateCustomModels(models.custom);\n }\n }\n\n // Validate bmad (legacy, optional)\n if (\"bmad\" in configObj && typeof configObj.bmad === \"object\") {\n const bmad = configObj.bmad as Record<string, unknown>;\n const bmadConfig: Partial<NonNullable<SdlcConfig[\"bmad\"]>> = {};\n\n if (isValidTrack(bmad.defaultTrack) && bmad.defaultTrack !== \"bmad-method\") {\n bmadConfig.defaultTrack = bmad.defaultTrack;\n }\n if (typeof bmad.autoStatusUpdate === \"boolean\") {\n bmadConfig.autoStatusUpdate = bmad.autoStatusUpdate;\n }\n if (typeof bmad.parallelIssueLimit === \"number\") {\n bmadConfig.parallelIssueLimit = Math.max(0, Math.min(10, bmad.parallelIssueLimit));\n }\n\n // Only set bmad if we have valid fields\n if (Object.keys(bmadConfig).length > 0) {\n result.bmad = bmadConfig as NonNullable<SdlcConfig[\"bmad\"]>;\n }\n }\n\n // Validate github (new v0.3.0+, optional)\n if (\"github\" in configObj && typeof configObj.github === \"object\") {\n const github = configObj.github as Record<string, unknown>;\n if (typeof github.owner === \"string\" && typeof github.repo === \"string\") {\n result.github = {\n owner: github.owner,\n repo: github.repo,\n project: typeof github.project === \"number\" ? github.project : undefined,\n statuses: Array.isArray(github.statuses)\n ? github.statuses\n : [\"Backlog\", \"Ready\", \"In progress\", \"In review\", \"Done\"],\n };\n }\n }\n\n // Validate tdd (new v0.3.0+, optional)\n if (\"tdd\" in configObj && typeof configObj.tdd === \"object\") {\n const tdd = configObj.tdd as Record<string, unknown>;\n result.tdd = {\n enabled: typeof tdd.enabled === \"boolean\" ? tdd.enabled : true,\n verbosity: isValidTddVerbosity(tdd.verbosity) ? tdd.verbosity : \"brief\",\n bypassPatterns: Array.isArray(tdd.bypassPatterns)\n ? tdd.bypassPatterns\n : [\"*.config.*\", \"*.json\", \"*.md\"],\n mutationTesting: {\n enabled:\n typeof (tdd.mutationTesting as Record<string, unknown>)?.enabled === \"boolean\"\n ? ((tdd.mutationTesting as Record<string, unknown>).enabled as boolean)\n : false,\n requiredScore:\n typeof (tdd.mutationTesting as Record<string, unknown>)?.requiredScore === \"number\"\n ? ((tdd.mutationTesting as Record<string, unknown>).requiredScore as number)\n : 80,\n },\n };\n }\n\n // Validate features (supports both old and new structures)\n if (\"features\" in configObj && typeof configObj.features === \"object\") {\n const features = configObj.features as Record<string, unknown>;\n\n // Check if this is new or legacy features structure\n const isNewFeatures = \"orchestratorOnly\" in features;\n\n if (isNewFeatures) {\n // New features structure\n const newFeatures: Record<string, boolean> = {};\n for (const key of [\n \"orchestratorOnly\",\n \"todoSync\",\n \"partyReview\",\n \"debuggingProtocol\",\n \"memento\",\n \"notifications\",\n \"lspTools\",\n ]) {\n if (key in features && typeof features[key] === \"boolean\") {\n newFeatures[key] = features[key] as boolean;\n }\n }\n result.features = newFeatures as unknown as SdlcConfig[\"features\"];\n } else {\n // Legacy features structure\n const legacyFeatures: Record<string, boolean> = {};\n for (const key of [\n \"bmadBridge\",\n \"autoStatus\",\n \"parallelExecution\",\n \"notifications\",\n \"contextMonitor\",\n \"commentChecker\",\n \"lspTools\",\n \"autoGitOperations\",\n \"todoSync\",\n ]) {\n if (key in features && typeof features[key] === \"boolean\") {\n legacyFeatures[key] = features[key] as boolean;\n }\n }\n result.features = legacyFeatures as unknown as SdlcConfig[\"features\"];\n }\n }\n\n // Validate mcps (supports both old and new structures)\n if (\"mcps\" in configObj && typeof configObj.mcps === \"object\") {\n const mcps = configObj.mcps as Record<string, unknown>;\n const mcpConfig: Record<string, boolean> = {};\n\n // Support both old and new MCP keys\n for (const key of [\"context7\", \"exa\", \"grepApp\", \"memento\"]) {\n if (key in mcps && typeof mcps[key] === \"boolean\") {\n mcpConfig[key] = mcps[key] as boolean;\n }\n }\n result.mcps = mcpConfig as unknown as SdlcConfig[\"mcps\"];\n }\n\n return result;\n}\n\n/**\n * Type guard for valid Claude tier\n */\nfunction isValidTier(value: unknown): value is \"max5x\" | \"max20x\" | \"pro\" | \"none\" {\n return typeof value === \"string\" && [\"max5x\", \"max20x\", \"pro\", \"none\"].includes(value);\n}\n\n/**\n * Type guard for valid Google auth method\n */\nfunction isValidAuthMethod(value: unknown): value is \"antigravity\" | \"personal\" | \"api\" | \"none\" {\n return typeof value === \"string\" && [\"antigravity\", \"personal\", \"api\", \"none\"].includes(value);\n}\n\n/**\n * Type guard for valid GitHub Copilot plan\n */\nfunction isValidCopilotPlan(\n value: unknown\n): value is \"free\" | \"pro\" | \"pro-plus\" | \"business\" | \"enterprise\" | \"none\" {\n return (\n typeof value === \"string\" &&\n [\"free\", \"pro\", \"pro-plus\", \"business\", \"enterprise\", \"none\"].includes(value)\n );\n}\n\n/**\n * Type guard for valid BMAD track\n */\nfunction isValidTrack(value: unknown): value is \"quick-flow\" | \"bmad-method\" | \"enterprise\" {\n return typeof value === \"string\" && [\"quick-flow\", \"bmad-method\", \"enterprise\"].includes(value);\n}\n\nfunction isValidThinkingLevel(value: unknown): value is \"off\" | \"low\" | \"medium\" | \"high\" {\n return typeof value === \"string\" && [\"off\", \"low\", \"medium\", \"high\"].includes(value);\n}\n\n/**\n * Type guard for valid TDD verbosity level\n */\nfunction isValidTddVerbosity(value: unknown): value is \"silent\" | \"brief\" | \"explain\" {\n return typeof value === \"string\" && [\"silent\", \"brief\", \"explain\"].includes(value);\n}\n\nfunction isValidProvider(\n value: unknown\n): value is \"anthropic\" | \"openai\" | \"google\" | \"github-copilot\" {\n return (\n typeof value === \"string\" && [\"anthropic\", \"openai\", \"google\", \"github-copilot\"].includes(value)\n );\n}\n\nfunction validateAgentSettings(settings: unknown): SdlcConfig[\"models\"][\"settings\"] {\n if (typeof settings !== \"object\" || settings === null) {\n return undefined;\n }\n\n const result: SdlcConfig[\"models\"][\"settings\"] = {};\n const settingsObj = settings as Record<string, unknown>;\n const agentKeys = [\n \"sisyphus\",\n \"oracle\",\n \"librarian\",\n \"frontend\",\n \"documentWriter\",\n \"multimodalLooker\",\n ] as const;\n\n for (const key of agentKeys) {\n if (key in settingsObj && typeof settingsObj[key] === \"object\" && settingsObj[key] !== null) {\n const agentSetting = settingsObj[key] as Record<string, unknown>;\n const validated: { temperature?: number; thinkingLevel?: \"off\" | \"low\" | \"medium\" | \"high\" } =\n {};\n\n if (\n typeof agentSetting.temperature === \"number\" &&\n agentSetting.temperature >= 0 &&\n agentSetting.temperature <= 2\n ) {\n validated.temperature = agentSetting.temperature;\n }\n\n if (isValidThinkingLevel(agentSetting.thinkingLevel)) {\n validated.thinkingLevel = agentSetting.thinkingLevel;\n }\n\n if (Object.keys(validated).length > 0) {\n result[key] = validated;\n }\n }\n }\n\n if (\n \"overrides\" in settingsObj &&\n typeof settingsObj.overrides === \"object\" &&\n settingsObj.overrides !== null\n ) {\n const overrides = settingsObj.overrides as Record<string, unknown>;\n result.overrides = {};\n\n for (const [modelId, modelSettings] of Object.entries(overrides)) {\n if (typeof modelSettings === \"object\" && modelSettings !== null) {\n const ms = modelSettings as Record<string, unknown>;\n const validated: {\n temperature?: number;\n thinkingLevel?: \"off\" | \"low\" | \"medium\" | \"high\";\n } = {};\n\n if (typeof ms.temperature === \"number\" && ms.temperature >= 0 && ms.temperature <= 2) {\n validated.temperature = ms.temperature;\n }\n\n if (isValidThinkingLevel(ms.thinkingLevel)) {\n validated.thinkingLevel = ms.thinkingLevel;\n }\n\n if (Object.keys(validated).length > 0) {\n result.overrides[modelId] = validated;\n }\n }\n }\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\nfunction validateModelSettings(\n settings: Record<string, unknown>\n): SdlcConfig[\"models\"][\"settings\"] {\n return validateAgentSettings(settings);\n}\n\nfunction validateCustomModels(models: unknown[]): SdlcConfig[\"models\"][\"custom\"] {\n const validated: SdlcConfig[\"models\"][\"custom\"] = [];\n\n for (const model of models) {\n if (typeof model !== \"object\" || model === null) continue;\n\n const m = model as Record<string, unknown>;\n if (typeof m.id !== \"string\" || typeof m.name !== \"string\" || !isValidProvider(m.provider)) {\n continue;\n }\n\n const customModel: {\n id: string;\n name: string;\n provider: \"anthropic\" | \"openai\" | \"google\" | \"github-copilot\";\n description?: string;\n capabilities?: { thinking?: boolean; contextWindow?: number; supportsTemperature?: boolean };\n } = {\n id: m.id,\n name: m.name,\n provider: m.provider,\n };\n\n if (typeof m.description === \"string\") {\n customModel.description = m.description;\n }\n\n if (typeof m.capabilities === \"object\" && m.capabilities !== null) {\n const caps = m.capabilities as Record<string, unknown>;\n customModel.capabilities = {};\n\n if (typeof caps.thinking === \"boolean\") {\n customModel.capabilities.thinking = caps.thinking;\n }\n if (typeof caps.contextWindow === \"number\") {\n customModel.capabilities.contextWindow = caps.contextWindow;\n }\n if (typeof caps.supportsTemperature === \"boolean\") {\n customModel.capabilities.supportsTemperature = caps.supportsTemperature;\n }\n }\n\n validated.push(customModel);\n }\n\n return validated.length > 0 ? validated : undefined;\n}\n\n/**\n * Validate the final merged config using Zod schema\n */\nfunction validateConfig(config: SdlcConfig): SdlcConfig {\n const result = SdlcConfigSchema.safeParse(config);\n\n if (!result.success) {\n // Log validation errors but don't fail - use defaults for invalid fields\n log.warn(\"Configuration validation warnings\", {\n errors: result.error.errors.map((e) => ({\n path: e.path.join(\".\"),\n message: e.message,\n })),\n });\n\n // Return the original config since we already have defaults\n // The individual fields will be used even if some are invalid\n return config;\n }\n\n return result.data;\n}\n\n/**\n * Get default configuration values\n */\nfunction getDefaultConfig(): SdlcConfig {\n return {\n version: \"0.0.1\",\n subscriptions: {\n claude: { enabled: false, tier: \"none\" },\n openai: { enabled: false },\n google: { enabled: false, authMethod: \"none\" },\n githubCopilot: { enabled: false, plan: \"none\" },\n },\n models: {\n sisyphus: \"anthropic/claude-sonnet-4\",\n oracle: \"anthropic/claude-sonnet-4\",\n librarian: \"anthropic/claude-sonnet-4\",\n },\n bmad: {\n defaultTrack: \"quick-flow\",\n autoStatusUpdate: false,\n parallelIssueLimit: 0,\n },\n features: { ...DEFAULTS.features },\n mcps: { ...DEFAULTS.mcps },\n routing: {\n providerPriority: [\"anthropic\", \"openai\", \"google\", \"github-copilot\"],\n modelFamilyPriority: {\n claude: [\"anthropic\", \"github-copilot\"],\n gpt: [\"openai\", \"github-copilot\"],\n gemini: [\"google\", \"github-copilot\"],\n },\n agentOverrides: {\n oracle: {\n requiresThinking: true,\n },\n },\n fallbackBehavior: {\n autoFallback: false,\n retryPeriodMs: 300000,\n notifyOnRateLimit: true,\n },\n },\n };\n}\n\n/**\n * Deep merge multiple config objects\n * Later configs override earlier ones\n */\nfunction mergeConfigs(...configs: (Partial<SdlcConfig> | null)[]): SdlcConfig {\n const result = getDefaultConfig();\n\n for (const config of configs) {\n if (!config) continue;\n\n // Merge top-level primitives\n if (config.version) result.version = config.version;\n\n // Merge subscriptions\n if (config.subscriptions) {\n if (config.subscriptions.claude) {\n result.subscriptions.claude = {\n ...result.subscriptions.claude,\n ...config.subscriptions.claude,\n };\n }\n if (config.subscriptions.openai) {\n result.subscriptions.openai = {\n ...result.subscriptions.openai,\n ...config.subscriptions.openai,\n };\n }\n if (config.subscriptions.google) {\n result.subscriptions.google = {\n ...result.subscriptions.google,\n ...config.subscriptions.google,\n };\n }\n if (config.subscriptions.githubCopilot) {\n result.subscriptions.githubCopilot = {\n ...result.subscriptions.githubCopilot,\n ...config.subscriptions.githubCopilot,\n };\n }\n }\n\n // Merge models (deep merge)\n if (config.models) {\n if (config.models.sisyphus !== undefined) result.models.sisyphus = config.models.sisyphus;\n if (config.models.oracle !== undefined) result.models.oracle = config.models.oracle;\n if (config.models.librarian !== undefined) result.models.librarian = config.models.librarian;\n if (config.models.frontend !== undefined) result.models.frontend = config.models.frontend;\n if (config.models.documentWriter !== undefined)\n result.models.documentWriter = config.models.documentWriter;\n if (config.models.multimodalLooker !== undefined)\n result.models.multimodalLooker = config.models.multimodalLooker;\n\n if (config.models.settings !== undefined) {\n result.models.settings = result.models.settings || {};\n const resultSettings = result.models.settings;\n const configSettings = config.models.settings;\n\n for (const agentKey of [\n \"sisyphus\",\n \"oracle\",\n \"librarian\",\n \"frontend\",\n \"documentWriter\",\n \"multimodalLooker\",\n ] as const) {\n if (configSettings[agentKey] !== undefined) {\n resultSettings[agentKey] = {\n ...(resultSettings[agentKey] || {}),\n ...configSettings[agentKey],\n };\n }\n }\n\n if (configSettings.overrides !== undefined) {\n resultSettings.overrides = {\n ...(resultSettings.overrides || {}),\n ...configSettings.overrides,\n };\n }\n }\n\n if (config.models.custom !== undefined) {\n result.models.custom = config.models.custom;\n }\n }\n\n // Merge bmad settings\n if (config.bmad) {\n result.bmad = { ...result.bmad, ...config.bmad };\n }\n\n // Merge features\n if (config.features) {\n result.features = { ...result.features, ...config.features };\n }\n\n // Merge mcps\n if (config.mcps) {\n result.mcps = { ...result.mcps, ...config.mcps };\n }\n\n // Merge routing (deep merge)\n if (config.routing) {\n if (config.routing.providerPriority !== undefined) {\n result.routing.providerPriority = config.routing.providerPriority;\n }\n\n if (config.routing.modelFamilyPriority !== undefined) {\n result.routing.modelFamilyPriority = {\n ...result.routing.modelFamilyPriority,\n ...config.routing.modelFamilyPriority,\n };\n }\n\n if (config.routing.agentOverrides !== undefined) {\n result.routing.agentOverrides = {\n ...result.routing.agentOverrides,\n ...config.routing.agentOverrides,\n };\n }\n\n if (config.routing.fallbackBehavior !== undefined) {\n result.routing.fallbackBehavior = {\n ...result.routing.fallbackBehavior,\n ...config.routing.fallbackBehavior,\n };\n }\n }\n }\n\n return result;\n}\n","/**\n * OpenCode SDLC Plugin\n *\n * The main OpenCode plugin that provides SDLC integration tools and hooks.\n */\n\nimport type { Plugin } from \"@opencode-ai/plugin\";\nimport { createCompactionHook, createSessionHooks, createToolHooks } from \"./hooks/index.js\";\nimport { createTools } from \"./tools/index.js\";\nimport { IssueTracker } from \"./tracker/issue-tracker.js\";\nimport { loadSdlcConfig } from \"./utils/config-loader.js\";\nimport { createPluginLogger } from \"./utils/plugin-logger.js\";\n\nconst log = createPluginLogger(\"plugin-init\");\n\n/**\n * OpenCode SDLC plugin factory.\n *\n * Provides:\n * - Custom tools for GitHub issue workflow\n * - Session hooks for context tracking\n * - Tool execution hooks for status updates\n * - Compaction hooks to preserve issue context\n */\nexport const OpenCodeSdlc: Plugin = async (ctx) => {\n const { directory } = ctx;\n\n log.info(\"OpenCode SDLC plugin loading\", {\n directory,\n timestamp: new Date().toISOString(),\n });\n\n // Load Sdlc configuration (project-local takes priority over global)\n const config = await loadSdlcConfig(directory);\n\n // Initialize issue tracker for session state persistence\n const tracker = new IssueTracker(directory);\n await tracker.initialize();\n\n // Create tools\n const tools = createTools(ctx, tracker, config);\n\n // Create hooks\n const sessionHooks = createSessionHooks(ctx, tracker, config);\n const toolHooks = createToolHooks(ctx, tracker, config);\n const compactionHook = createCompactionHook(tracker, config);\n\n return {\n // Custom tools for SDLC integration\n tool: tools,\n\n // Session event handlers\n event: sessionHooks,\n\n // Tool execution hooks\n \"tool.execute.before\": toolHooks.before,\n \"tool.execute.after\": toolHooks.after,\n\n // Compaction hook to preserve issue context\n \"experimental.session.compacting\": compactionHook,\n };\n};\n\n// Default export for OpenCode plugin loader\nexport default OpenCodeSdlc;\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/plugin/utils/plugin-logger.ts","../../src/plugin/utils/notifications.ts","../../src/plugin/hooks/session-hooks.ts","../../src/shared/github-client.ts","../../src/plugin/utils/github-issues.ts","../../src/plugin/utils/expanded-file-ownership.ts","../../src/plugin/hooks/orchestrator-guard.ts","../../src/plugin/utils/issue-parser.ts","../../src/plugin/utils/issue-todo-sync.ts","../../src/plugin/hooks/todo-hooks.ts","../../src/plugin/hooks/tool-hooks.ts","../../src/plugin/hooks/compaction-hook.ts","../../src/plugin/tracker/tdd-cycle-tracker.ts","../../src/plugin/utils/architecture-alignment.ts","../../src/plugin/tools/adr.ts","../../src/plugin/memory/stateless.ts","../../src/plugin/memory/memento.ts","../../src/plugin/memory/index.ts","../../src/plugin/tools/checkpoint-create.ts","../../src/plugin/tools/checkpoint-delete.ts","../../src/plugin/tools/checkpoint-load.ts","../../src/shared/constants.ts","../../src/plugin/tools/classify-request.ts","../../src/plugin/tools/config.ts","../../src/shared/schemas/agent-outputs.ts","../../src/shared/schemas/agent-inputs.ts","../../src/plugin/utils/invocation-gate.ts","../../src/plugin/utils/prompt-loader.ts","../../src/plugin/utils/rate-limit-tracker.ts","../../src/plugin/utils/route-resolver.ts","../../src/plugin/utils/subagent-session.ts","../../src/plugin/tools/event-design-workflow.ts","../../src/plugin/tools/event-discover-domain.ts","../../src/plugin/tools/event-generate-gwt.ts","../../src/plugin/tools/event-validate-model.ts","../../src/plugin/tools/get-context.ts","../../src/plugin/tools/get-issue.ts","../../src/plugin/utils/pm-context.ts","../../src/plugin/tools/list-issues.ts","../../src/plugin/tools/memory-recall.ts","../../src/plugin/tools/memory-remember.ts","../../src/plugin/tools/mutation.ts","../../src/plugin/utils/issue-review-updater.ts","../../src/plugin/utils/oracle-parser.ts","../../src/shared/types.ts","../../src/plugin/utils/persona-loader.ts","../../src/plugin/tools/party-discussion.ts","../../src/plugin/tools/party-review.ts","../../src/plugin/utils/git-workflow.ts","../../src/plugin/tools/pm-create-branch.ts","../../src/plugin/tools/pm-pull-request.ts","../../src/plugin/tools/pm-worktree.ts","../../src/plugin/tools/review-pr.ts","../../src/plugin/utils/agent-selector.ts","../../src/plugin/utils/issue-review-utils.ts","../../src/plugin/tools/story-review-analyze.ts","../../src/plugin/utils/response-synthesizer.ts","../../src/plugin/tools/story-review-consult.ts","../../src/plugin/tools/tdd-domain.ts","../../src/plugin/tools/tdd-green.ts","../../src/plugin/tools/tdd-red.ts","../../src/plugin/tools/update-issue-status.ts","../../src/plugin/tools/index.ts","../../src/plugin/tracker/issue-tracker.ts","../../src/shared/schemas.ts","../../src/plugin/utils/config-loader.ts","../../src/plugin/index.ts"],"names":["log","suggestedAgent","join","existsSync","readFile","parseModelConfig","tool","dirname","readFileSync","z","result","mkdir","writeFile","readdir","randomUUID","getRepo","parseAgentResponse","convertLegacyArgs"],"mappings":";;;;;;;;;;;;;;AAaA,IAAM,QAAA,GAAW,IAAA,CAAK,MAAA,EAAO,EAAG,mBAAmB,CAAA;AACnD,IAAM,YAAA,GAAe,IAAI,IAAA,GAAO,IAAA;AAIhC,IAAM,cAAA,GAA2C;AAAA,EAC/C,KAAA,EAAO,SAAA;AAAA,EACP,IAAA,EAAM,QAAA;AAAA,EACN,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAA;AAEA,SAAS,UAAU,KAAA,EAA0B;AAC3C,EAAA,IAAI,KAAA,KAAU,MAAA,IAAU,KAAA,KAAU,OAAA,EAAS,OAAO,IAAA;AAClD,EAAA,OAAO,QAAQ,GAAA,CAAI,YAAA,KAAiB,GAAA,IAAO,OAAA,CAAQ,IAAI,YAAA,KAAiB,MAAA;AAC1E;AAEA,SAAS,gBAAA,GAA4B;AACnC,EAAA,OAAO,QAAQ,GAAA,CAAI,YAAA,KAAiB,GAAA,IAAO,OAAA,CAAQ,IAAI,YAAA,KAAiB,MAAA;AAC1E;AAEA,SAAS,cAAA,CACP,KAAA,EACA,SAAA,EACA,OAAA,EACA,IAAA,EACQ;AACR,EAAA,MAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACzC,EAAA,MAAM,MAAA,GAAS,eAAe,KAAK,CAAA;AACnC,EAAA,MAAM,UAAU,IAAA,GAAO,CAAA,CAAA,EAAI,KAAK,SAAA,CAAU,IAAI,CAAC,CAAA,CAAA,GAAK,EAAA;AACpD,EAAA,OAAO,CAAA,CAAA,EAAI,SAAS,CAAA,EAAA,EAAK,MAAM,KAAK,SAAS,CAAA,EAAA,EAAK,OAAO,CAAA,EAAG,OAAO;AAAA,CAAA;AACrE;AAEA,SAAS,iBAAA,GAA0B;AACjC,EAAA,IAAI;AACF,IAAA,IAAI,UAAA,CAAW,QAAQ,CAAA,EAAG;AACxB,MAAA,MAAM,KAAA,GAAQ,SAAS,QAAQ,CAAA;AAC/B,MAAA,IAAI,KAAA,CAAM,OAAO,YAAA,EAAc;AAC7B,QAAA,YAAA,CAAa,UAAU,CAAC,CAAA;AAAA,MAC1B;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAEA,SAAS,SAAS,KAAA,EAAqB;AACrC,EAAA,IAAI;AACF,IAAA,iBAAA,EAAkB;AAClB,IAAA,cAAA,CAAe,UAAU,KAAK,CAAA;AAAA,EAChC,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAUO,SAAS,mBAAmB,SAAA,EAAmB;AACpD,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,CAAC,OAAA,EAAiB,IAAA,KAAyC;AAChE,MAAA,IAAI,CAAC,SAAA,CAAU,OAAO,CAAA,EAAG;AACzB,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,OAAA,EAAS,SAAA,EAAW,SAAS,IAAI,CAAA;AAC9D,MAAA,QAAA,CAAS,KAAK,CAAA;AACd,MAAA,IAAI,kBAAiB,EAAG;AACtB,QAAA,OAAA,CAAQ,MAAM,CAAA,MAAA,EAAS,SAAS,KAAK,OAAO,CAAA,CAAA,EAAI,QAAQ,EAAE,CAAA;AAAA,MAC5D;AAAA,IACF,CAAA;AAAA,IAEA,IAAA,EAAM,CAAC,OAAA,EAAiB,IAAA,KAAyC;AAC/D,MAAA,IAAI,CAAC,SAAA,CAAU,MAAM,CAAA,EAAG;AACxB,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,MAAA,EAAQ,SAAA,EAAW,SAAS,IAAI,CAAA;AAC7D,MAAA,QAAA,CAAS,KAAK,CAAA;AACd,MAAA,IAAI,kBAAiB,EAAG;AACtB,QAAA,OAAA,CAAQ,KAAK,CAAA,MAAA,EAAS,SAAS,KAAK,OAAO,CAAA,CAAA,EAAI,QAAQ,EAAE,CAAA;AAAA,MAC3D;AAAA,IACF,CAAA;AAAA,IAEA,IAAA,EAAM,CAAC,OAAA,EAAiB,IAAA,KAAyC;AAC/D,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,MAAA,EAAQ,SAAA,EAAW,SAAS,IAAI,CAAA;AAC7D,MAAA,QAAA,CAAS,KAAK,CAAA;AACd,MAAA,IAAI,kBAAiB,EAAG;AACtB,QAAA,OAAA,CAAQ,KAAK,CAAA,MAAA,EAAS,SAAS,KAAK,OAAO,CAAA,CAAA,EAAI,QAAQ,EAAE,CAAA;AAAA,MAC3D;AAAA,IACF,CAAA;AAAA,IAEA,KAAA,EAAO,CAAC,OAAA,EAAiB,IAAA,KAAyC;AAChE,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,OAAA,EAAS,SAAA,EAAW,SAAS,IAAI,CAAA;AAC9D,MAAA,QAAA,CAAS,KAAK,CAAA;AACd,MAAA,IAAI,kBAAiB,EAAG;AACtB,QAAA,OAAA,CAAQ,MAAM,CAAA,MAAA,EAAS,SAAS,KAAK,OAAO,CAAA,CAAA,EAAI,QAAQ,EAAE,CAAA;AAAA,MAC5D;AAAA,IACF;AAAA,GACF;AACF;;;ACpGA,IAAM,GAAA,GAAM,mBAAmB,eAAe,CAAA;AAc9C,eAAsB,gBAAA,CACpB,OAAA,EACA,KAAA,EACA,CAAA,EACe;AACf,EAAA,MAAM,KAAK,QAAA,EAAS;AAEpB,EAAA,IAAI;AACF,IAAA,IAAI,OAAO,QAAA,EAAU;AAEnB,MAAA,MAAM,CAAA,CAAA,aAAA,EAAiB,yBAAyB,iBAAA,CAAkB,OAAO,CAAC,CAAA,cAAA,EAAiB,iBAAA,CAAkB,KAAK,CAAC,CAAA,CAAA,CAAG,CAAA,CAAA;AAAA,IACxH,CAAA,MAAA,IAAW,OAAO,OAAA,EAAS;AAEzB,MAAA,MAAM,CAAA,CAAA,YAAA,EAAgB,KAAK,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAAA,IACxC,CAAA,MAAO;AAEL,MAAA,eAAA,CAAgB,OAAO,OAAO,CAAA;AAAA,IAChC;AAAA,EACF,CAAA,CAAA,MAAQ;AAEN,IAAA,eAAA,CAAgB,OAAO,OAAO,CAAA;AAAA,EAChC;AACF;AAKA,SAAS,kBAAkB,GAAA,EAAqB;AAC9C,EAAA,OAAO,IAAI,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,KAAK,CAAA;AACvD;AAKA,SAAS,eAAA,CAAgB,OAAe,OAAA,EAAuB;AAC7D,EAAA,GAAA,CAAI,IAAA,CAAK,+BAAA,EAAiC,EAAE,KAAA,EAAO,SAAS,CAAA;AAC9D;;;AClDA,IAAMA,IAAAA,GAAM,mBAAmB,eAAe,CAAA;AAa9C,SAAS,0BAA0B,MAAA,EAA6B;AAC9D,EAAA,MAAM,WAAW,MAAA,CAAO,QAAA;AACxB,EAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AACtB,EAAA,IAAI,sBAAsB,QAAA,EAAU;AAClC,IAAA,OAAQ,QAAA,CAA0B,gBAAA;AAAA,EACpC;AACA,EAAA,OAAO,KAAA;AACT;AAUO,SAAS,kBAAA,CAAmB,GAAA,EAAkB,OAAA,EAAuB,MAAA,EAAoB;AAC9F,EAAA,OAAO,OAAO,EAAE,KAAA,EAAM,KAA+B;AAEnD,IAAA,MAAM,YAAa,KAAA,CAA4B,IAAA;AAE/C,IAAA,QAAQ,SAAA;AAAW,MACjB,KAAK,cAAA;AACH,QAAA,MAAM,iBAAA,CAAkB,GAAA,EAAK,OAAA,EAAS,MAAM,CAAA;AAC5C,QAAA;AAAA,MAEF,KAAK,iBAAA;AACH,QAAA,oBAAA,CAAqB,SAAS,MAAM,CAAA;AACpC,QAAA;AAAA,MAEF,KAAK,eAAA;AACH,QAAA,kBAAA,CAAmB,OAAO,OAAO,CAAA;AACjC,QAAA;AAAA;AACJ,EACF,CAAA;AACF;AAOA,eAAe,iBAAA,CACb,GAAA,EACA,OAAA,EACA,MAAA,EACe;AACf,EAAA,MAAM,YAAA,GAAe,QAAQ,eAAA,EAAgB;AAE7C,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,MAAA,CAAO,WAAA,EAAY;AACnD,IAAA,IAAI,CAAC,WAAW,QAAA,CAAS,aAAa,KAAK,CAAC,UAAA,CAAW,QAAA,CAAS,aAAa,CAAA,EAAG;AAC9E,MAAA;AAAA,IACF;AACA,IAAA,IAAI,MAAA,CAAO,UAAU,aAAA,EAAe;AAClC,MAAA,MAAM,gBAAA;AAAA,QACJ,CAAA,OAAA,EAAU,aAAa,WAAW,CAAA,sDAAA,CAAA;AAAA,QAClC,eAAA;AAAA,QACA,GAAA,CAAI;AAAA,OACN;AAAA,IACF;AAAA,EACF;AACF;AAOA,SAAS,oBAAA,CAAqB,SAAuB,MAAA,EAA0B;AAC7E,EAAA,MAAM,YAAA,GAAe,QAAQ,eAAA,EAAgB;AAE7C,EAAA,IAAI,YAAA,EAAc;AAChB,IAAAA,IAAAA,CAAI,KAAK,uCAAA,EAAyC;AAAA,MAChD,aAAa,YAAA,CAAa,WAAA;AAAA,MAC1B,QAAQ,YAAA,CAAa;AAAA,KACtB,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,yBAAA,CAA0B,MAAM,CAAA,EAAG;AACrC,IAAAA,IAAAA,CAAI,KAAK,+BAAA,EAAiC;AAAA,MACxC,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AACF;AAOA,SAAS,kBAAA,CAAmB,OAAqB,OAAA,EAA6B;AAC5E,EAAA,MAAM,YAAA,GAAe,QAAQ,eAAA,EAAgB;AAE7C,EAAA,IAAI,YAAA,IAAgB,MAAM,KAAA,EAAO;AAC/B,IAAAA,IAAAA,CAAI,MAAM,iCAAA,EAAmC;AAAA,MAC3C,aAAa,YAAA,CAAa,WAAA;AAAA,MAC1B,OAAO,KAAA,CAAM;AAAA,KACd,CAAA;AAAA,EACH;AACF;ACCO,SAAS,mBAAmB,aAAA,EAAuC;AAExE,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,OAAO,aAAA;AAAA,EACT;AAGA,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,YAAA,IAAgB,QAAQ,GAAA,CAAI,QAAA;AACzD,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO,QAAA;AAAA,EACT;AAGA,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,SAAS,eAAA,EAAiB;AAAA,MACxC,QAAA,EAAU,OAAA;AAAA,MACV,OAAA,EAAS,GAAA;AAAA,MACT,KAAA,EAAO,CAAC,MAAA,EAAQ,MAAA,EAAQ,MAAM;AAAA,KAC/B,EAAE,IAAA,EAAK;AACR,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,sBAAsB,KAAA,EAAyB;AAC7D,EAAA,OAAO,kBAAA,CAAmB,KAAK,CAAA,KAAM,IAAA;AACvC;AAMO,IAAM,eAAN,MAAmB;AAAA,EAChB,OAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EAER,WAAA,CAAY,OAAA,GAA+B,EAAC,EAAG;AAC7C,IAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,OAAA,CAAQ,KAAK,CAAA;AAE9C,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,UAAU,IAAI,OAAA,CAAQ,EAAE,IAAA,EAAM,OAAO,CAAA;AAC1C,IAAA,IAAA,CAAK,QAAQ,OAAA,CAAQ,KAAA;AACrB,IAAA,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,CAAQ,OAAe,IAAA,EAAoB;AACzC,IAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AAAA,EAEQ,aAAA,CAAc,OAAgB,IAAA,EAAgD;AACpF,IAAA,MAAM,CAAA,GAAI,SAAS,IAAA,CAAK,KAAA;AACxB,IAAA,MAAM,CAAA,GAAI,QAAQ,IAAA,CAAK,IAAA;AACvB,IAAA,IAAI,CAAC,CAAA,IAAK,CAAC,CAAA,EAAG;AACZ,MAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,IAC1D;AACA,IAAA,OAAO,EAAE,KAAA,EAAO,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,QAAA,CAAS,WAAA,EAAqB,KAAA,EAAgB,IAAA,EAAqC;AACvF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,IAAI,CAAA;AAC7C,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAA,CAAI;AAAA,MAC7C,GAAG,MAAA;AAAA,MACH,YAAA,EAAc;AAAA,KACf,CAAA;AAED,IAAA,OAAO;AAAA,MACL,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,IAAA,EAAM,KAAK,IAAA,IAAQ,IAAA;AAAA,MACnB,KAAK,IAAA,CAAK,QAAA;AAAA,MACV,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAA,EAAA,CAAS,IAAA,CAAK,MAAA,IAAU,EAAC,EAAG,GAAA;AAAA,QAAI,CAAC,KAAA,KAC/B,OAAO,KAAA,KAAU,QAAA,GAAW,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,EAAE,IAAA,EAAM,KAAA,CAAM,QAAQ,EAAA;AAAG;AACzE,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CACJ,OAAA,GAII,EAAC,EACL,OACA,IAAA,EACgC;AAChC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,IAAI,CAAA;AAC7C,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,WAAA,CAAY;AAAA,MACrD,GAAG,MAAA;AAAA,MACH,KAAA,EAAO,QAAQ,KAAA,IAAS,MAAA;AAAA,MACxB,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAQ,IAAA,CAAK,GAAG,CAAA;AAAA,MAChC,QAAA,EAAU,QAAQ,KAAA,IAAS;AAAA,KAC5B,CAAA;AAGD,IAAA,OAAO,IAAA,CACJ,MAAA,CAAO,CAAC,KAAA,KAAU,CAAC,MAAM,YAAY,CAAA,CACrC,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACf,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,KAAK,KAAA,CAAM,QAAA;AAAA,MACX,OAAO,KAAA,CAAM;AAAA,KACf,CAAE,CAAA;AAAA,EACN;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAA,CACJ,WAAA,EACA,IAAA,EACA,OACA,IAAA,EACe;AACf,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,IAAI,CAAA;AAC7C,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,MAAA,CAAO;AAAA,MAC/B,GAAG,MAAA;AAAA,MACH,YAAA,EAAc,WAAA;AAAA,MACd;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAA,CACJ,WAAA,EACA,MAAA,EACA,OACA,IAAA,EACe;AACf,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,IAAI,CAAA;AAC7C,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAU;AAAA,MAClC,GAAG,MAAA;AAAA,MACH,YAAA,EAAc,WAAA;AAAA,MACd;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,iBAAA,CACJ,OAAA,EACA,KAAA,EACA,IAAA,EACyB;AACzB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,IAAI,CAAA;AAC7C,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,MAAA,CAAO;AAAA,MAC/C,GAAG,MAAA;AAAA,MACH,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,IAAA,EAAM,QAAQ,IAAA,IAAQ,MAAA;AAAA,MACtB,OAAO,OAAA,CAAQ;AAAA,KAChB,CAAA;AAED,IAAA,OAAO;AAAA,MACL,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,KAAK,IAAA,CAAK;AAAA,KACZ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,CACJ,QAAA,EACA,KAAA,EACA,IAAA,EAC4B;AAC5B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,IAAI,CAAA;AAC7C,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,GAAA,CAAI;AAAA,MAC5C,GAAG,MAAA;AAAA,MACH,WAAA,EAAa;AAAA,KACd,CAAA;AAED,IAAA,OAAO;AAAA,MACL,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,KAAK,IAAA,CAAK,QAAA;AAAA,MACV,KAAA,EAAO,IAAA,CAAK,MAAA,GAAS,QAAA,GAAY,IAAA,CAAK,KAAA;AAAA,MACtC,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,gBAAgB,IAAA,CAAK,eAAA;AAAA,MACrB,KAAA,EAAO,KAAK,KAAA,IAAS;AAAA,KACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAA,CACJ,QAAA,EACA,KAAA,EACA,IAAA,EACyB;AACzB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,IAAI,CAAA;AAG7C,IAAA,MAAM,KAAK,MAAM,IAAA,CAAK,cAAA,CAAe,QAAA,EAAU,OAAO,IAAI,CAAA;AAG1D,IAAA,MAAM,EAAE,MAAM,MAAA,EAAO,GAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,GAAA,CAAI;AAAA,MACpD,GAAG,MAAA;AAAA,MACH,WAAA,EAAa;AAAA,KACd,CAAA;AAED,IAAA,IAAI,SAA0B,EAAC;AAC/B,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,MAAM,UAAA,EAAW,GAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,UAAA,CAAW;AAAA,QAChE,GAAG,MAAA;AAAA,QACH,GAAA,EAAK,OAAO,IAAA,CAAK;AAAA,OAClB,CAAA;AAED,MAAA,MAAA,GAAS,UAAA,CAAW,UAAA,CAAW,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,QAC7C,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,MAAA,EACE,KAAA,CAAM,MAAA,KAAW,WAAA,GACb,KAAA,CAAM,UAAA,KAAe,SAAA,GACnB,MAAA,GACA,KAAA,CAAM,UAAA,KAAe,SAAA,GACnB,SAAA,GACA,MAAA,GACJ,SAAA;AAAA,QACN,YAAY,KAAA,CAAM;AAAA,OACpB,CAAE,CAAA;AAAA,IACJ,CAAA,CAAA,MAAQ;AAAA,IAER;AAGA,IAAA,MAAM,EAAE,MAAM,WAAA,EAAY,GAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,WAAA,CAAY;AAAA,MACjE,GAAG,MAAA;AAAA,MACH,WAAA,EAAa;AAAA,KACd,CAAA;AAED,IAAA,MAAM,OAAA,GAA4B,WAAA,CAAY,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,MAC7D,QAAA,EAAU,MAAA,CAAO,IAAA,EAAM,KAAA,IAAS,SAAA;AAAA,MAChC,OAAO,MAAA,CAAO;AAAA,KAChB,CAAE,CAAA;AAEF,IAAA,OAAO;AAAA,MACL,QAAQ,EAAA,CAAG,MAAA;AAAA,MACX,KAAK,EAAA,CAAG,GAAA;AAAA,MACR,OAAO,EAAA,CAAG,KAAA;AAAA,MACV,WAAW,EAAA,CAAG,SAAA;AAAA,MACd,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,CAAmB,QAAA,EAAkB,KAAA,EAAgB,IAAA,EAAgC;AACzF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,IAAI,CAAA;AAC7C,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,GAAA,CAAI;AAAA,MAC5C,GAAG,MAAA;AAAA,MACH,WAAA,EAAa,QAAA;AAAA,MACb,SAAA,EAAW,EAAE,MAAA,EAAQ,MAAA;AAAO,KAC7B,CAAA;AAGD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAA,CACJ,OAAA,EACA,KAAA,EACA,IAAA,EACwB;AACxB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,IAAI,CAAA;AAC7C,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,KAAA,CAAM;AAAA,MAC9C,GAAG,MAAA;AAAA,MACH,aAAa,OAAA,CAAQ,QAAA;AAAA,MACrB,YAAA,EAAc,QAAQ,WAAA,IAAe,QAAA;AAAA,MACrC,cAAc,OAAA,CAAQ,WAAA;AAAA,MACtB,gBAAgB,OAAA,CAAQ;AAAA,KACzB,CAAA;AAED,IAAA,OAAO;AAAA,MACL,KAAK,IAAA,CAAK,GAAA;AAAA,MACV,QAAQ,IAAA,CAAK;AAAA,KACf;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,iBAAiB,OAAA,EAAiD;AACtE,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,0BAAA,CAA2B;AAAA,MACnE,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,OAAA,EAAS,QAAQ,OAAA,IAAW,KAAA;AAAA,MAC5B,SAAA,EAAW,QAAQ,QAAA,IAAY;AAAA,KAChC,CAAA;AAED,IAAA,OAAO;AAAA,MACL,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAU,IAAA,CAAK,SAAA;AAAA,MACf,KAAK,IAAA,CAAK,QAAA;AAAA,MACV,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,aAAA,EAAe,KAAK,cAAA,IAAkB;AAAA,KACxC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CAAc,KAAA,EAAgB,IAAA,EAAoC;AACtE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,IAAI,CAAA;AAC7C,IAAA,MAAM,EAAE,MAAK,GAAI,MAAM,KAAK,OAAA,CAAQ,KAAA,CAAM,IAAI,MAAM,CAAA;AAEpD,IAAA,OAAO;AAAA,MACL,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAU,IAAA,CAAK,SAAA;AAAA,MACf,KAAK,IAAA,CAAK,QAAA;AAAA,MACV,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,aAAA,EAAe,KAAK,cAAA,IAAkB;AAAA,KACxC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,CACJ,OAAA,GAAiE,EAAC,EAC3C;AACvB,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,wBAAA,CAAyB;AAAA,MACjE,IAAA,EAAM,QAAQ,IAAA,IAAQ,OAAA;AAAA,MACtB,QAAA,EAAU,QAAQ,KAAA,IAAS,EAAA;AAAA,MAC3B,IAAA,EAAM;AAAA,KACP,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,IAAA,MAAU;AAAA,MACzB,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,UAAU,IAAA,CAAK,SAAA;AAAA,MACf,KAAK,IAAA,CAAK,QAAA;AAAA,MACV,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,aAAA,EAAe,KAAK,cAAA,IAAkB;AAAA,KACxC,CAAE,CAAA;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,gBAAA,CAAiB,KAAA,GAAQ,EAAA,EAA8B;AAC3D,IAAA,MAAM,KAAA,GAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAed,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,QAW/B,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,EAAO,CAAA;AAE1B,IAAA,OAAO,MAAA,CAAO,OAAO,UAAA,CAAW,KAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,CAAe,SAAA,EAAmB,aAAA,EAAsD;AAC5F,IAAA,MAAM,KAAA,GAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAad,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAS/B,KAAA,EAAO,EAAE,KAAA,EAAO,SAAA,EAAW,MAAA,EAAQ,aAAA,EAAe,CAAA;AAErD,MAAA,OAAO,OAAO,IAAA,CAAK,SAAA;AAAA,IACrB,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,iBAAA,CAAkB,SAAA,EAAmB,SAAA,EAAmB,QAAA,EAAiC;AAE7F,IAAA,MAAM,EAAE,MAAM,QAAA,EAAS,GAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,GAAA,CAAI;AAAA,MACtD,KAAA,EAAO,SAAA;AAAA,MACP,IAAA,EAAM;AAAA,KACP,CAAA;AAED,IAAA,MAAM,QAAA,GAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAUjB,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,QAAA,EAAU;AAAA,MACnC,SAAA;AAAA,MACA,cAAc,QAAA,CAAS;AAAA,KACxB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,CAAkB,SAAA,EAAmB,WAAA,EAAsC;AAC/E,IAAA,MAAM,QAAA,GAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAUjB,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,OAAA,CAAQ,QAM/B,QAAA,EAAU;AAAA,MACX,SAAA;AAAA,MACA,SAAA,EAAW;AAAA,KACZ,CAAA;AAED,IAAA,OAAO,MAAA,CAAO,qBAAqB,IAAA,CAAK,EAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,mBAAA,CACJ,OAAA,EAaA,KAAA,EACA,IAAA,EACyB;AACzB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,CAAc,KAAA,EAAO,IAAI,CAAA;AAG7C,IAAA,MAAM,QAeF,EAAC;AAEL,IAAA,IAAI,QAAQ,kBAAA,EAAoB;AAC9B,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,IAAA,EAAM,cAAA;AAAA,QACN,UAAA,EAAY;AAAA,UACV,6BAAA,EAA+B,QAAQ,mBAAA,IAAuB,KAAA;AAAA,UAC9D,yBAAA,EAA2B,QAAQ,sBAAA,IAA0B,KAAA;AAAA,UAC7D,0BAAA,EAA4B,KAAA;AAAA,UAC5B,+BAAA,EAAiC,QAAQ,iBAAA,IAAqB,CAAA;AAAA,UAC9D,iCAAA,EAAmC;AAAA;AACrC,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,QAAQ,oBAAA,EAAsB;AAChC,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,qBAAA,EAAuB,CAAA;AAAA,IAC5C;AAEA,IAAA,IAAI,QAAQ,oBAAA,EAAsB;AAChC,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,yBAAA,EAA2B,CAAA;AAAA,IAChD;AAEA,IAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,UAAA,EAAY,CAAA;AAAA,IACjC;AAEA,IAAA,IAAI,QAAQ,gBAAA,EAAkB;AAC5B,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,kBAAA,EAAoB,CAAA;AAAA,IACzC;AAEA,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,iBAAA,CAAkB;AAAA,MAC1D,GAAG,MAAA;AAAA,MACH,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,UAAA,EAAY;AAAA,QACV,QAAA,EAAU;AAAA,UACR,SAAS,OAAA,CAAQ,cAAA;AAAA,UACjB,SAAS;AAAC;AACZ,OACF;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,OAAO,EAAE,EAAA,EAAI,IAAA,CAAK,EAAA,EAAG;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,oBAAA,GAA+D;AACnE,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,gBAAA,EAAiB;AAC3D,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,EAAA,EAAI,KAAK,EAAA,EAAG;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CAAW,KAAA,EAAe,IAAA,EAAgC;AAC9D,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,OAAA,CAAQ,KAAA,CAAM,IAAI,EAAE,KAAA,EAAO,MAAM,CAAA;AAC5C,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AACF,CAAA;AAgBO,SAAS,iCAAA,CACd,OAAA,GAA+B,EAAC,EACX;AACrB,EAAA,IAAI,CAAC,qBAAA,CAAsB,OAAA,CAAQ,KAAK,CAAA,EAAG;AACzC,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,IAAI;AACF,IAAA,OAAO,IAAI,aAAa,OAAO,CAAA;AAAA,EACjC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;ACvwBA,IAAMA,IAAAA,GAAM,mBAAmB,eAAe,CAAA;AAoB9C,IAAI,YAAA,GAAoC,IAAA;AACxC,IAAI,gBAAA,GAAkC,IAAA;AAEtC,SAAS,UAAU,MAAA,EAAyC;AAC1D,EAAA,IAAI,CAAC,OAAO,MAAA,EAAQ,KAAA,IAAS,CAAC,MAAA,CAAO,MAAA,EAAQ,MAAM,OAAO,IAAA;AAE1D,EAAA,MAAM,OAAA,GAAU,GAAG,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,MAAA,CAAO,OAAO,IAAI,CAAA,CAAA;AAG5D,EAAA,IAAI,YAAA,IAAgB,qBAAqB,OAAA,EAAS;AAChD,IAAA,OAAO,YAAA;AAAA,EACT;AAGA,EAAA,YAAA,GAAe,iCAAA,CAAkC;AAAA,IAC/C,KAAA,EAAO,OAAO,MAAA,CAAO,KAAA;AAAA,IACrB,IAAA,EAAM,OAAO,MAAA,CAAO;AAAA,GACrB,CAAA;AACD,EAAA,gBAAA,GAAmB,eAAe,OAAA,GAAU,IAAA;AAE5C,EAAA,OAAO,YAAA;AACT;AAEA,SAAS,QAAQ,MAAA,EAA4D;AAC3E,EAAA,IAAI,CAAC,OAAO,MAAA,EAAQ,KAAA,IAAS,CAAC,MAAA,CAAO,MAAA,EAAQ,MAAM,OAAO,IAAA;AAC1D,EAAA,OAAO,EAAE,OAAO,MAAA,CAAO,MAAA,CAAO,OAAO,IAAA,EAAM,MAAA,CAAO,OAAO,IAAA,EAAK;AAChE;AAEA,eAAsB,UAAA,CACpB,GAAA,EACA,MAAA,EACA,WAAA,EAC6B;AAC7B,EAAA,MAAM,MAAA,GAAS,UAAU,MAAM,CAAA;AAG/B,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,QAAA,CAAS,WAAW,CAAA;AAC/C,MAAA,OAAO;AAAA,QACL,QAAQ,KAAA,CAAM,MAAA;AAAA,QACd,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,KAAK,KAAA,CAAM,GAAA;AAAA,QACX,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,QAAQ,KAAA,CAAM;AAAA,OAChB;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAAA,IAAAA,CAAI,KAAK,mCAAA,EAAqC,EAAE,aAAa,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAG,CAAA;AAAA,IAErF;AAAA,EACF;AAGA,EAAA,MAAM,IAAA,GAAO,QAAQ,MAAM,CAAA;AAC3B,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAElB,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,MAAA,EAAO,GACb,MAAM,GAAA,CAAI,CAAA,CAAA,cAAA,EAAkB,WAAW,CAAA,QAAA,EAAW,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,0CAAA,CAAA;AAC3E,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAM,CAAA,CAAE,IAAA,EAAK;AACnC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAC/B,IAAA,OAAO,KAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAAA,IAAAA,CAAI,KAAK,uBAAA,EAAyB,EAAE,aAAa,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAG,CAAA;AACvE,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,eAAsB,UAAA,CACpB,GAAA,EACA,MAAA,EACA,MAAA,EACA,QAAQ,EAAA,EACkB;AAC1B,EAAA,MAAM,MAAA,GAAS,UAAU,MAAM,CAAA;AAG/B,EAAA,IAAI,MAAA,IAAU,CAAC,MAAA,EAAQ;AACrB,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,MAAA,CAAO,UAAA,CAAW,EAAE,OAAO,CAAA;AAChD,MAAA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,QAC5B,QAAQ,KAAA,CAAM,MAAA;AAAA,QACd,OAAO,KAAA,CAAM,KAAA;AAAA,QACb,KAAK,KAAA,CAAM,GAAA;AAAA,QACX,OAAO,KAAA,CAAM;AAAA,OACf,CAAE,CAAA;AAAA,IACJ,SAAS,KAAA,EAAO;AACd,MAAAA,IAAAA,CAAI,KAAK,mCAAA,EAAqC,EAAE,OAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,IAExE;AAAA,EACF;AAGA,EAAA,MAAM,IAAA,GAAO,QAAQ,MAAM,CAAA;AAC3B,EAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAC;AAEnB,EAAA,IAAI;AACF,IAAA,MAAM,YAAA,GAAe,MAAA,GAAS,CAAA,kBAAA,EAAqB,MAAM,CAAA,CAAA,CAAA,GAAM,EAAA;AAC/D,IAAA,MAAM,EAAE,MAAA,EAAO,GACb,MAAM,IAAI,CAAA,CAAA,qBAAA,EAAyB,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,YAAY,YAAY,KAAK,CAAA,8BAAA,CAAA;AAC7F,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAM,CAAA,CAAE,IAAA,EAAK;AACnC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAChC,IAAA,OAAO,MAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAAA,IAAAA,CAAI,KAAK,uBAAA,EAAyB,EAAE,QAAQ,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAG,CAAA;AAClE,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEA,eAAsB,iBAAA,CACpB,GAAA,EACA,MAAA,EACA,WAAA,EACA,MAAA,EACkB;AAGlB,EAAA,MAAM,IAAA,GAAO,QAAQ,MAAM,CAAA;AAC3B,EAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,MAAA,CAAO,MAAA,EAAQ,SAAS,OAAO,KAAA;AAE7C,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,CAAI,CAAA,CAAA,oBAAA,EAAwB,WAAW,CAAA,EAAA,EAAK,MAAM,CAAA,UAAA,EAAa,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA,WAAA,EAAc,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA,CAAA;AAC3H,IAAA,OAAO,IAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAAA,IAAAA,CAAI,IAAA,CAAK,sBAAA,EAAwB,EAAE,WAAA,EAAa,QAAQ,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAG,CAAA;AAC9E,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,eAAsB,eAAA,CACpB,GAAA,EACA,MAAA,EACA,WAAA,EACA,IAAA,EACkB;AAClB,EAAA,MAAM,MAAA,GAAS,UAAU,MAAM,CAAA;AAG/B,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,CAAO,eAAA,CAAgB,WAAA,EAAa,IAAI,CAAA;AAC9C,MAAA,OAAO,IAAA;AAAA,IACT,SAAS,KAAA,EAAO;AACd,MAAAA,IAAAA,CAAI,KAAK,yCAAA,EAA2C,EAAE,aAAa,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAG,CAAA;AAAA,IAE3F;AAAA,EACF;AAGA,EAAA,MAAM,IAAA,GAAO,QAAQ,MAAM,CAAA;AAC3B,EAAA,IAAI,CAAC,MAAM,OAAO,KAAA;AAElB,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,CAAI,CAAA,CAAA,cAAA,EAAkB,WAAW,CAAA,QAAA,EAAW,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,QAAA,EAAW,IAAI,CAAA,CAAA;AACxF,IAAA,OAAO,IAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAAA,IAAAA,CAAI,KAAK,6BAAA,EAA+B,EAAE,aAAa,KAAA,EAAO,MAAA,CAAO,KAAK,CAAA,EAAG,CAAA;AAC7E,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AC/IO,IAAM,gBAAA,GAAgC;AAAA,EAC3C,eAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA;AAKO,SAAS,gBAAgB,SAAA,EAA+B;AAC7D,EAAA,OAAO,gBAAA,CAAiB,SAAS,SAAS,CAAA;AAC5C;AAqBO,IAAM,mBAAA,GAAwD;AAAA;AAAA;AAAA;AAAA,EAKnE,GAAA,EAAK;AAAA,IACH,OAAA,EAAS;AAAA,MACP,cAAA;AAAA,MACA,eAAA;AAAA,MACA,cAAA;AAAA,MACA,eAAA;AAAA,MACA,sBAAA;AAAA,MACA,uBAAA;AAAA,MACA,kBAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,UAAA,EAAY,CAAC,oBAAoB;AAAA,GACnC;AAAA,EAEA,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,CAAC,SAAA,EAAW,UAAA,EAAY,WAAW,UAAU,CAAA;AAAA,IACtD,UAAA,EAAY;AAAA,MACV,cAAA;AAAA,MACA,eAAA;AAAA,MACA,cAAA;AAAA,MACA,eAAA;AAAA,MACA,iBAAA;AAAA,MACA,aAAA;AAAA,MACA,oBAAA;AAAA,MACA;AAAA;AACF,GACF;AAAA,EAEA,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS;AAAA,MACP,aAAA;AAAA,MACA,kBAAA;AAAA,MACA,eAAA;AAAA,MACA,mBAAA;AAAA,MACA,mBAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,UAAA,EAAY,CAAC,oBAAoB;AAAA,GACnC;AAAA;AAAA;AAAA;AAAA,EAMA,SAAA,EAAW;AAAA,IACT,OAAA,EAAS;AAAA,MACP,0BAAA;AAAA,MACA,4BAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,UAAA,EAAY;AAAA,MACV,aAAA;AAAA,MACA,oBAAA;AAAA,MACA,+BAAA;AAAA,MACA;AAAA;AACF,GACF;AAAA,EAEA,QAAA,EAAU;AAAA,IACR,OAAA,EAAS,CAAC,oCAAA,EAAsC,sCAAsC,CAAA;AAAA,IACtF,UAAA,EAAY;AAAA,MACV,8BAAA;AAAA,MACA,4BAAA;AAAA,MACA;AAAA;AACF,GACF;AAAA,EAEA,GAAA,EAAK;AAAA,IACH,OAAA,EAAS;AAAA,MACP,oCAAA;AAAA,MACA,yCAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,UAAA,EAAY;AAAA,MACV,+BAAA;AAAA,MACA,8BAAA;AAAA,MACA;AAAA;AACF,GACF;AAAA,EAEA,GAAA,EAAK;AAAA,IACH,OAAA,EAAS,CAAC,kBAAkB,CAAA;AAAA,IAC5B,UAAA,EAAY,CAAC,oBAAA,EAAsB,qBAAqB;AAAA,GAC1D;AAAA,EAEA,SAAA,EAAW;AAAA,IACT,OAAA,EAAS,CAAC,oBAAoB,CAAA;AAAA,IAC9B,UAAA,EAAY,CAAC,aAAA,EAAe,qBAAA,EAAuB,cAAc;AAAA,GACnE;AAAA;AAAA;AAAA;AAAA,EAMA,YAAA,EAAc;AAAA,IACZ,OAAA,EAAS;AAAA;AAAA,MAEP,WAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,cAAA;AAAA;AAAA,MAEA,YAAA;AAAA,MACA,eAAA;AAAA,MACA,aAAA;AAAA,MACA,kBAAA;AAAA;AAAA,MAEA,eAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA;AAAA;AAAA,MAEA,aAAA;AAAA,MACA,gBAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,UAAA,EAAY;AAAA;AAAA,MAEV,aAAA;AAAA,MACA,qBAAA;AAAA,MACA,oBAAA;AAAA;AAAA,MAEA,SAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA;AACF,GACF;AAAA;AAAA;AAAA;AAAA,EAMA,aAAA,EAAe;AAAA,IACb,SAAS,EAAC;AAAA,IACV,UAAA,EAAY,CAAC,MAAM,CAAA;AAAA,IACnB,QAAA,EAAU;AAAA,GACZ;AAAA,EAEA,EAAA,EAAI;AAAA,IACF,SAAS,EAAC;AAAA,IACV,UAAA,EAAY,CAAC,MAAM,CAAA;AAAA,IACnB,QAAA,EAAU;AAAA,GACZ;AAAA,EAEA,QAAA,EAAU;AAAA,IACR,SAAS,EAAC;AAAA,IACV,UAAA,EAAY,CAAC,MAAM,CAAA;AAAA,IACnB,QAAA,EAAU;AAAA,GACZ;AAAA,EAEA,KAAA,EAAO;AAAA,IACL,SAAS,EAAC;AAAA,IACV,UAAA,EAAY,CAAC,MAAM,CAAA;AAAA,IACnB,QAAA,EAAU;AAAA,GACZ;AAAA,EAEA,SAAA,EAAW;AAAA,IACT,SAAS,EAAC;AAAA,IACV,UAAA,EAAY,CAAC,MAAM,CAAA;AAAA,IACnB,QAAA,EAAU;AAAA;AAEd,CAAA;AAyBO,SAAS,8BAAA,GAAiC;AAI/C,EAAA,SAAS,UAAA,CAAW,UAAkB,QAAA,EAA6B;AACjE,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,CAAC,OAAA,KAAY,SAAA,CAAU,QAAA,EAAU,OAAA,EAAS,EAAE,GAAA,EAAK,IAAA,EAAM,CAAC,CAAA;AAAA,EAC/E;AAKA,EAAA,SAAS,mBAAmB,QAAA,EAAyC;AAEnE,IAAA,IAAI,UAAA,CAAW,QAAA,EAAU,CAAC,+BAA+B,CAAC,CAAA,EAAG;AAC3D,MAAA,OAAO,UAAA;AAAA,IACT;AACA,IAAA,IAAI,UAAA,CAAW,QAAA,EAAU,CAAC,+BAA+B,CAAC,CAAA,EAAG;AAC3D,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,UAAA,CAAW,QAAA,EAAU,CAAC,qBAAqB,CAAC,CAAA,EAAG;AACjD,MAAA,OAAO,WAAA;AAAA,IACT;AACA,IAAA,IAAI,UAAA,CAAW,QAAA,EAAU,CAAC,aAAa,CAAC,CAAA,EAAG;AACzC,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,UAAA,CAAW,QAAA,EAAU,CAAC,oBAAoB,CAAC,CAAA,EAAG;AAChD,MAAA,OAAO,WAAA;AAAA,IACT;AAGA,IAAA,IAAI,UAAA,CAAW,QAAA,EAAU,mBAAA,CAAoB,GAAA,CAAI,OAAO,CAAA,EAAG;AACzD,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI,UAAA,CAAW,QAAA,EAAU,mBAAA,CAAoB,MAAA,CAAO,OAAO,CAAA,EAAG;AAC5D,MAAA,OAAO,QAAA;AAAA,IACT;AACA,IAAA,IAAI,UAAA,CAAW,UAAU,CAAC,SAAA,EAAW,YAAY,SAAA,EAAW,UAAU,CAAC,CAAA,EAAG;AACxE,MAAA,OAAO,OAAA;AAAA,IACT;AAGA,IAAA,IAAI,UAAA,CAAW,QAAA,EAAU,mBAAA,CAAoB,YAAA,CAAa,OAAO,CAAA,EAAG;AAClE,MAAA,OAAO,cAAA;AAAA,IACT;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAKA,EAAA,SAAS,OAAA,CAAQ,UAAkB,SAAA,EAA4C;AAC7E,IAAA,MAAM,QAAA,GAAW,oBAAoB,SAAS,CAAA;AAG9C,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,GAAG,SAAS,CAAA,+CAAA,CAAA;AAAA,QACpB,SAAA;AAAA,QACA,QAAA;AAAA,QACA,cAAA,EAAgB,mBAAmB,QAAQ;AAAA,OAC7C;AAAA,IACF;AAGA,IAAA,IAAI,UAAA,CAAW,QAAA,EAAU,QAAA,CAAS,UAAU,CAAA,EAAG;AAC7C,MAAA,MAAMC,eAAAA,GAAiB,mBAAmB,QAAQ,CAAA;AAClD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ,sCAAsC,SAAS,CAAA,MAAA,CAAA;AAAA,QACvD,SAAA;AAAA,QACA,QAAA;AAAA,QACA,cAAA,EAAAA;AAAA,OACF;AAAA,IACF;AAGA,IAAA,IAAI,UAAA,CAAW,QAAA,EAAU,QAAA,CAAS,OAAO,CAAA,EAAG;AAC1C,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,MAAA,EAAQ,oCAAoC,SAAS,CAAA,MAAA,CAAA;AAAA,QACrD,SAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAGA,IAAA,MAAM,cAAA,GAAiB,mBAAmB,QAAQ,CAAA;AAClD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAQ,+CAA+C,SAAS,CAAA,MAAA,CAAA;AAAA,MAChE,SAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAKA,EAAA,SAAS,aAAA,CACP,WACA,SAAA,EACqD;AACrD,IAAA,MAAM,OAAA,GAAU,UAAU,GAAA,CAAI,CAAC,OAAO,OAAA,CAAQ,EAAA,EAAI,SAAS,CAAC,CAAA;AAC5D,IAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA;AAC5C,IAAA,OAAO,EAAE,OAAO,OAAA,EAAQ;AAAA,EAC1B;AAKA,EAAA,SAAS,oBAAoB,SAAA,EAA8B;AACzD,IAAA,MAAM,QAAA,GAAW,oBAAoB,SAAS,CAAA;AAE9C,IAAA,IAAI,SAAS,QAAA,EAAU;AACrB,MAAA,OAAO,CAAA,EAAG,SAAA,CAAU,WAAA,EAAa,CAAA,yCAAA,CAAA;AAAA,IACnC;AAEA,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AAC7C,IAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AAEnD,IAAA,OAAO,CAAA,EAAG,SAAA,CAAU,WAAA,EAAa,CAAA;AAAA,YAAA,EACvB,UAAU;AAAA,eAAA,EACP,aAAa,CAAA,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,aAAA;AAAA,IACA,mBAAA;AAAA,IACA;AAAA,GACF;AACF;AAUO,SAAS,oBAAoB,MAAA,EAAsC;AACxE,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,OAAO,CAAA,KAAA,EAAQ,MAAA,CAAO,QAAQ,CAAA,kBAAA,EAAqB,OAAO,SAAS,CAAA,MAAA,CAAA;AAAA,EACrE;AAEA,EAAA,IAAI,UAAU,CAAA,uBAAA,EAA0B,MAAA,CAAO,QAAQ,CAAA,MAAA,EAAS,OAAO,SAAS,CAAA;AAAA,CAAA;AAChF,EAAA,OAAA,IAAW,CAAA,QAAA,EAAW,OAAO,MAAM;AAAA,CAAA;AAEnC,EAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,IAAA,OAAA,IAAW,CAAA,8CAAA,EAAiD,OAAO,cAAc,CAAA,OAAA,CAAA;AAAA,EACnF;AAEA,EAAA,OAAO,OAAA;AACT;;;ACvaA,IAAMD,IAAAA,GAAM,mBAAmB,oBAAoB,CAAA;AAoBnD,IAAM,gBAAA,uBAAuB,GAAA,EAAiC;AAOvD,SAAS,uBAAA,CACd,SAAA,EACA,IAAA,EACA,OAAA,GAAmC,EAAC,EAC9B;AACN,EAAAA,KAAI,KAAA,CAAM,8BAAA,EAAgC,EAAE,SAAA,EAAW,MAAM,CAAA;AAC7D,EAAA,gBAAA,CAAiB,IAAI,SAAA,EAAW;AAAA,IAC9B,SAAA;AAAA,IACA,SAAA,EAAW,IAAA;AAAA,IACX,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IAClC;AAAA,GACD,CAAA;AACH;AAOO,SAAS,0BAA0B,SAAA,EAAyB;AACjE,EAAAA,IAAAA,CAAI,KAAA,CAAM,gCAAA,EAAkC,EAAE,WAAW,CAAA;AACzD,EAAA,gBAAA,CAAiB,OAAO,SAAS,CAAA;AACnC;AAYO,SAAS,gBAAgB,SAAA,EAA6C;AAC3E,EAAA,OAAO,gBAAA,CAAiB,GAAA,CAAI,SAAS,CAAA,EAAG,SAAA;AAC1C;AAyDA,IAAM,gBAAA,GAAmB,CAAC,MAAA,EAAQ,OAAA,EAAS,QAAQ,OAAO,CAAA;AAwB1D,SAAS,gBAAgB,IAAA,EAAmC;AAC1D,EAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACrC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAU,IAAA;AAGhB,EAAA,IAAI,OAAO,OAAA,CAAQ,QAAA,KAAa,QAAA,EAAU;AACxC,IAAA,OAAO,OAAA,CAAQ,QAAA;AAAA,EACjB;AAGA,EAAA,IAAI,OAAO,OAAA,CAAQ,IAAA,KAAS,QAAA,EAAU;AACpC,IAAA,OAAO,OAAA,CAAQ,IAAA;AAAA,EACjB;AAGA,EAAA,IAAI,OAAO,OAAA,CAAQ,IAAA,KAAS,QAAA,EAAU;AACpC,IAAA,OAAO,OAAA,CAAQ,IAAA;AAAA,EACjB;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,mBAAA,CACP,QAAA,EACA,YAAA,EACA,OAAA,EACa;AAEb,EAAA,MAAM,UAAU,8BAAA,EAA+B;AAC/C,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAA,CAAQ,QAAA,EAAU,YAAY,CAAA;AAErD,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,QAAQ,MAAA,CAAO;AAAA,KACjB;AAAA,EACF;AAGA,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,IAAA,UAAA,GAAa,CAAA,SAAA,EAAY,OAAO,cAAc,CAAA,kBAAA,CAAA;AAAA,EAChD,CAAA,MAAA,IAAW,eAAA,CAAgB,YAAY,CAAA,EAAG;AACxC,IAAA,UAAA,GAAa,oEAAA;AAAA,EACf;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,KAAA;AAAA,IACT,MAAA,EAAQ,oBAAoB,MAAM,CAAA;AAAA,IAClC;AAAA,GACF;AACF;AAMA,SAAS,2BAA2B,MAAA,EAA6B;AAC/D,EAAA,MAAM,WAAW,MAAA,CAAO,QAAA;AACxB,EAAA,IAAI,CAAC,UAAU,OAAO,KAAA;AAGtB,EAAA,IAAI,sBAAsB,QAAA,EAAU;AAClC,IAAA,OAAQ,QAAA,CAA0B,gBAAA;AAAA,EACpC;AAGA,EAAA,OAAO,KAAA;AACT;AAOO,SAAS,wBAAwB,MAAA,EAAoB;AAC1D,EAAA,MAAM,OAAA,GAAU,2BAA2B,MAAM,CAAA;AAEjD,EAAA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOL,KAAA,EAAO,CAAC,KAAA,EAAwB,MAAA,KAA0C;AAExE,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,sCAAA,EAAuC;AAAA,MACzE;AAGA,MAAA,IAAI,CAAC,gBAAA,CAAiB,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,EAAG;AAC1C,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,QAAQ,CAAA,EAAG,KAAA,CAAM,IAAI,CAAA,yBAAA,CAAA,EAA4B;AAAA,MAC3E;AAEA,MAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,MAAA,CAAO,IAAI,CAAA;AAC5C,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAAA,IAAAA,CAAI,KAAK,4CAAA,EAA8C;AAAA,UACrD,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,MAAM,MAAA,CAAO;AAAA,SACd,CAAA;AAED,QAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,sCAAA,EAAuC;AAAA,MACzE;AAGA,MAAA,MAAM,YAAA,GAAe,eAAA,CAAgB,KAAA,CAAM,SAAS,CAAA;AAEpD,MAAA,IAAI,YAAA,EAAc;AAEhB,QAAAA,IAAAA,CAAI,MAAM,+BAAA,EAAiC;AAAA,UACzC,WAAW,KAAA,CAAM,SAAA;AAAA,UACjB,YAAA;AAAA,UACA;AAAA,SACD,CAAA;AACD,QAAA,OAAO,mBAAA,CAAoB,QAAA,EAAU,YAAoB,CAAA;AAAA,MAC3D;AAGA,MAAAA,IAAAA,CAAI,KAAK,4CAAA,EAA8C;AAAA,QACrD,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,QAAA;AAAA,QACA,WAAW,KAAA,CAAM;AAAA,OAClB,CAAA;AAED,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EACE,6GAAA;AAAA,QAEF,UAAA,EACE;AAAA,OAEJ;AAAA,IACF;AAAA,GACF;AACF;AAKO,SAAS,iBAAiB,MAAA,EAA6B;AAC5D,EAAA,IAAI,OAAA,GAAU,CAAA,2BAAA,EAAyB,MAAA,CAAO,MAAM,CAAA,CAAA;AACpD,EAAA,IAAI,OAAO,UAAA,EAAY;AACrB,IAAA,OAAA,IAAW;;AAAA,sBAAA,EAAsB,OAAO,UAAU,CAAA,CAAA;AAAA,EACpD;AACA,EAAA,OAAO,OAAA;AACT;;;ACjTA,IAAMA,IAAAA,GAAM,mBAAmB,cAAc,CAAA;AAQ7C,IAAM,gBAAA,GAAmB,yBAAA;AACzB,IAAM,iBAAA,GAAoB,4BAAA;AAKnB,SAAS,wBAAwB,IAAA,EAAkD;AACxF,EAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAC;AAEnB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC7B,EAAA,MAAM,WAAwC,EAAC;AAC/C,EAAA,IAAI,WAAA,GAAc,KAAA;AAClB,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA,EAAG;AAChC,MAAA,WAAA,GAAc,IAAA;AACd,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,WAAA,IAAe,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AAEvC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,WAAA,EAAa;AAElB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,gBAAgB,CAAA;AACzC,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,KAAA,EAAA;AACA,IAAA,MAAM,OAAA,GAAU,KAAA,CAAM,CAAC,CAAA,CAAE,aAAY,KAAM,GAAA;AAC3C,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK;AAE3B,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,EAAA,EAAI,KAAK,KAAK,CAAA,CAAA;AAAA,MACd,IAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAAA,IAAAA,CAAI,MAAM,4CAA4C,CAAA;AAAA,EACxD;AAEA,EAAA,OAAO,QAAA;AACT;;;ACpDA,IAAMA,IAAAA,GAAM,mBAAmB,iBAAiB,CAAA;AAEzC,IAAM,oBAAA,GAAuB,QAAA;AAc7B,SAAS,oBAAA,CAAqB,aAAqB,IAAA,EAAqC;AAC7F,EAAA,MAAM,QAAA,GAAW,wBAAwB,IAAI,CAAA;AAC7C,EAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,MAAW;AAAA,IACpC,EAAA,EAAI,CAAA,EAAG,WAAW,CAAA,IAAA,EAAO,QAAQ,CAAC,CAAA,CAAA;AAAA,IAClC,OAAA,EAAS,CAAA,EAAA,EAAK,WAAW,CAAA,EAAG,oBAAoB,KAAK,KAAA,GAAQ,CAAC,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,IAC5E,MAAA,EAAQ,IAAA,CAAK,OAAA,GAAU,WAAA,GAAc,SAAA;AAAA,IACrC,QAAA,EAAU;AAAA,GACZ,CAAE,CAAA;AACJ;AAKA,IAAM,kBAAA,GAAqB,aAAA;AAEpB,SAAS,iBAAiB,MAAA,EAAkC;AACjE,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA;AAC9B,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAE/B,EAAA,MAAM,CAAC,QAAA,EAAU,OAAA,EAAS,QAAQ,CAAA,GAAI,KAAA;AACtC,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,QAAA,CAAS,QAAA,EAAU,EAAE,CAAA;AAChD,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,QAAA,EAAU,EAAE,CAAA;AAC1C,EAAA,IAAI,CAAC,WAAA,IAAe,CAAC,KAAA,EAAO,OAAO,IAAA;AAEnC,EAAA,OAAO;AAAA,IACL,EAAA,EAAI,MAAA;AAAA,IACJ,WAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA,EAAM,EAAA;AAAA,IACN,OAAA,EAAS;AAAA,GACX;AACF;AAEO,SAAS,YAAY,IAAA,EAA6B;AACvD,EAAA,OAAO,kBAAA,CAAmB,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA;AAC7C;AAKA,eAAsB,mBAAA,CACpB,SAAA,EACA,cAAA,EACA,OAAA,EACiB;AACjB,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA;AAClC,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,IAAI,WAAA,GAAc,KAAA;AAElB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,IAAI,4BAAA,CAA6B,IAAA,CAAK,IAAI,CAAA,EAAG;AAC3C,MAAA,WAAA,GAAc,IAAA;AACd,MAAA;AAAA,IACF;AACA,IAAA,IAAI,WAAA,IAAe,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACvC,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAC,WAAA,EAAa;AAElB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,yBAAyB,CAAA;AAClD,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,YAAA,EAAA;AACA,IAAA,IAAI,iBAAiB,cAAA,EAAgB;AACnC,MAAA,KAAA,CAAM,CAAC,CAAA,GAAI,IAAA,CAAK,QAAQ,aAAA,EAAe,OAAA,GAAU,UAAU,OAAO,CAAA;AAClE,MAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAKO,SAAS,eAAA,CACd,UACA,QAAA,EACgB;AAChB,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,QAAA,CAAS,oBAAoB,CAAC,CAAA;AAClF,EAAA,OAAO,CAAC,GAAG,SAAA,EAAW,GAAG,QAAQ,CAAA;AACnC;AAKA,eAAsB,kBAAA,CACpB,WAAA,EACA,IAAA,EACA,aAAA,EACA,SAAA,EACwB;AACxB,EAAA,MAAM,IAAA,GAAO,cAAc,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,EAAA,KAAO,KAAK,EAAE,CAAA;AACvD,EAAA,IAAI,CAAC,IAAA,IAAQ,IAAA,CAAK,MAAA,KAAW,IAAA,CAAK,QAAQ,OAAO,IAAA;AAEjD,EAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,IAAA,CAAK,EAAE,CAAA;AACvC,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AAEpB,EAAA,MAAM,OAAA,GAAU,KAAK,MAAA,KAAW,WAAA;AAChC,EAAA,MAAM,cAAc,MAAM,mBAAA,CAAoB,SAAA,EAAW,MAAA,CAAO,OAAO,OAAO,CAAA;AAE9E,EAAAA,IAAAA,CAAI,KAAK,wBAAA,EAA0B,EAAE,aAAa,cAAA,EAAgB,MAAA,CAAO,KAAA,EAAO,OAAA,EAAS,CAAA;AACzF,EAAA,OAAO,WAAA;AACT;;;ACpHA,IAAMA,IAAAA,GAAM,mBAAmB,YAAY,CAAA;AAW3C,eAAsB,aAAA,CACpB,OAAA,EACA,MAAA,EACA,WAAA,EACA,SAAA,EAC4B;AAC5B,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,QAAA,EAAU;AAC7B,IAAA,OAAO,EAAE,WAAA,EAAa,EAAC,EAAG,aAAA,EAAe,EAAC,EAAE;AAAA,EAC9C;AAEA,EAAA,MAAM,aAAA,GAAgB,oBAAA,CAAqB,WAAA,EAAa,SAAS,CAAA;AACjE,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,eAAA,EAAgB,IAAK,EAAC;AACpD,EAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,aAAA,EAAe,aAAa,CAAA;AAEhE,EAAA,MAAM,OAAA,CAAQ,gBAAgB,WAAW,CAAA;AAEzC,EAAAA,IAAAA,CAAI,KAAK,2CAAA,EAA6C;AAAA,IACpD,WAAA;AAAA,IACA,UAAU,aAAA,CAAc,MAAA;AAAA,IACxB,YAAY,WAAA,CAAY;AAAA,GACzB,CAAA;AAED,EAAA,OAAO,EAAE,aAAa,aAAA,EAAc;AACtC;AAEA,eAAsB,aAAA,CACpB,OAAA,EACA,MAAA,EACA,MAAA,EACA,KAAA,EACwB;AACxB,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,QAAA,EAAU;AAC7B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,eAAA,EAAgB,IAAK,EAAC;AACpD,EAAA,MAAM,YAAA,GAAe,QAAQ,eAAA,EAAgB;AAE7C,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,WAAA,GAA6B,IAAA;AAEjC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,UAAU,MAAM,kBAAA;AAAA,MACpB,YAAA,CAAa,WAAA;AAAA,MACb,IAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAa,IAAA,IAAQ;AAAA,KACvB;AACA,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,WAAA,GAAc,OAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,MAAM,OAAA,CAAQ,gBAAgB,WAAW,CAAA;AACzC,IAAAA,KAAI,IAAA,CAAK,qBAAA,EAAuB,EAAE,WAAA,EAAa,YAAA,CAAa,aAAa,CAAA;AAAA,EAC3E;AAEA,EAAA,MAAM,OAAA,CAAQ,gBAAgB,KAAK,CAAA;AACnC,EAAA,OAAO,WAAA;AACT;;;ACrEA,IAAMA,IAAAA,GAAM,mBAAmB,YAAY,CAAA;AA4B3C,IAAM,kBAAA,GAAqB;AAAA;AAAA,EAEzB,YAAA;AAAA,EACA,UAAA;AAAA,EACA,iBAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,qBAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,WAAA;AAAA;AAAA,EAEA,kBAAA;AAAA,EACA,kBAAA;AAAA,EACA,iBAAA;AAAA,EACA,YAAA;AAAA,EACA,kBAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA;AAAA,EAEA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,eAAA;AAAA,EACA,gBAAA;AAAA,EACA,mBAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAA;AAEA,SAAS,eAAe,QAAA,EAA2B;AACjD,EAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAC7C,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAO,QAAA,CAAqC,OAAA;AAClD,EAAA,OAAO,OAAO,GAAA,KAAQ,QAAA,GAAW,GAAA,GAAM,EAAA;AACzC;AAEA,SAAS,wBAAwB,OAAA,EAA0B;AACzD,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,IAAA,EAAK,CAAE,WAAA,EAAY;AAI9C,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,KAAA,CAAM,QAAQ,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AAE/D,EAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IAAK,CAAC,OAAA,KACpB,kBAAA,CAAmB,IAAA,CAAK,CAAC,MAAA,KAAW,OAAA,CAAQ,UAAA,CAAW,MAAA,CAAO,WAAA,EAAa,CAAC;AAAA,GAC9E;AACF;AAEO,SAAS,eAAA,CAAgB,GAAA,EAAkB,OAAA,EAAuB,MAAA,EAAoB;AAE3F,EAAA,MAAM,iBAAA,GAAoB,wBAAwB,MAAM,CAAA;AAExD,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,OAAO,KAAA,EAAwB,MAAA,KAA4C;AAEjF,MAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,KAAA,CAAM,KAAA,EAAO,MAAM,CAAA;AAEzD,MAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AAGxB,QAAA,MAAM,IAAI,KAAA,CAAM,gBAAA,CAAiB,WAAW,CAAC,CAAA;AAAA,MAC/C;AAAA,IACF,CAAA;AAAA,IAEA,KAAA,EAAO,OAAO,KAAA,EAAuB,MAAA,KAA2C;AAE9E,MAAA,MAAM,oBACJ,mBAAA,IAAuB,MAAA,CAAO,QAAA,GACzB,MAAA,CAAO,SAA4D,iBAAA,GACpE,KAAA;AAEN,MAAA,IAAI,CAAC,iBAAA,IAAqB,KAAA,CAAM,IAAA,KAAS,MAAA,EAAQ;AAC/C,QAAA,MAAM,OAAA,GAAU,cAAA,CAAe,MAAA,CAAO,QAAQ,CAAA;AAE9C,QAAA,IAAI,uBAAA,CAAwB,OAAO,CAAA,EAAG;AACpC,UAAAA,IAAAA,CAAI,IAAA,CAAK,8BAAA,EAAgC,EAAE,OAAA,EAAS,QAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA;AAC3E,UAAA,MAAA,CAAO,MAAA,IACL,ufAAA;AAAA,QAQJ;AAAA,MACF;AAGA,MAAA,MAAM,eAAA,GAAkB,OAAO,QAAA,CAAS,QAAA;AAExC,MAAA,IAAI,KAAA,CAAM,IAAA,KAAS,gBAAA,IAAoB,eAAA,EAAiB;AACtD,QAAA,MAAM,iBAAA,CAAkB,OAAA,EAAS,MAAA,EAAQ,MAAM,CAAA;AAAA,MACjD;AAEA,MAAA,IAAI,KAAA,CAAM,IAAA,KAAS,WAAA,IAAe,eAAA,EAAiB;AACjD,QAAA,MAAM,iBAAA,CAAkB,GAAA,EAAK,OAAA,EAAS,MAAA,EAAQ,MAAM,CAAA;AAAA,MACtD;AAAA,IACF;AAAA,GACF;AACF;AAEA,eAAe,iBAAA,CACb,OAAA,EACA,MAAA,EACA,MAAA,EACe;AACf,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AACvC,IAAA,IAAI,CAAC,MAAA,CAAO,WAAA,IAAe,CAAC,OAAO,IAAA,EAAM;AACvC,MAAAA,IAAAA,CAAI,MAAM,iDAAiD,CAAA;AAC3D,MAAA;AAAA,IACF;AAEA,IAAAA,KAAI,KAAA,CAAM,qCAAA,EAAuC,EAAE,WAAA,EAAa,MAAA,CAAO,aAAa,CAAA;AAEpF,IAAA,MAAM,EAAE,aAAA,EAAe,WAAA,EAAY,GAAI,MAAM,aAAA;AAAA,MAC3C,OAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA,CAAO,WAAA;AAAA,MACP,MAAA,CAAO;AAAA,KACT;AAEA,IAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,MAAA,MAAA,CAAO,KAAA,GAAQ;AAAA,QACb,IAAA,EAAM,mIAAA;AAAA,QACN,KAAA,EAAO;AAAA,OACT;AACA,MAAA,MAAA,CAAO,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,MAAM,CAAC,CAAA;AAE9C,MAAAA,IAAAA,CAAI,MAAM,oCAAA,EAAsC;AAAA,QAC9C,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,UAAU,aAAA,CAAc,MAAA;AAAA,QACxB,cAAc,WAAA,CAAY;AAAA,OAC3B,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAAA,KAAI,KAAA,CAAM,oCAAA,EAAsC,EAAE,WAAA,EAAa,MAAA,CAAO,aAAa,CAAA;AAAA,IACrF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAAA,IAAAA,CAAI,KAAK,uCAAA,EAAyC,EAAE,OAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,EAC5E;AACF;AAEA,eAAe,iBAAA,CACb,GAAA,EACA,OAAA,EACA,MAAA,EACA,MAAA,EACe;AACf,EAAA,MAAM,KAAA,GAAQ,uBAAuB,MAAM,CAAA;AAE3C,EAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG;AAChC,IAAAA,IAAAA,CAAI,MAAM,oCAAoC,CAAA;AAC9C,IAAA;AAAA,EACF;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,YAAA,GAAe,QAAQ,eAAA,EAAgB;AAC7C,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,cAAc,MAAM,aAAA;AAAA,MACxB,OAAA;AAAA,MACA,MAAA;AAAA,MACA,EAAE,WAAA,EAAa,YAAA,CAAa,WAAA,EAAY;AAAA,MACxC;AAAA,KACF;AACA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,eAAA,CAAgB,GAAA,EAAK,MAAA,EAAQ,YAAA,CAAa,aAAa,WAAW,CAAA;AAAA,IAC1E;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAAA,IAAAA,CAAI,KAAK,2CAAA,EAA6C,EAAE,OAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,EAChF;AACF;AAEA,SAAS,uBAAuB,MAAA,EAAgD;AAC9E,EAAA,MAAM,WAAW,MAAA,CAAO,QAAA;AACxB,EAAA,IAAI,UAAU,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG;AACpD,IAAAA,IAAAA,CAAI,MAAM,+BAAA,EAAiC,EAAE,OAAO,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA;AAC3E,IAAA,OAAO,QAAA,CAAS,KAAA;AAAA,EAClB;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AACvC,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AACzB,MAAAA,KAAI,KAAA,CAAM,qCAAA,EAAuC,EAAE,KAAA,EAAO,MAAA,CAAO,QAAQ,CAAA;AACzE,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,IAAI,QAAQ,KAAA,IAAS,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,KAAK,CAAA,EAAG;AAChD,MAAAA,IAAAA,CAAI,MAAM,mCAAA,EAAqC,EAAE,OAAO,MAAA,CAAO,KAAA,CAAM,QAAQ,CAAA;AAC7E,MAAA,OAAO,MAAA,CAAO,KAAA;AAAA,IAChB;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAAA,IAAAA,CAAI,MAAM,gCAAgC,CAAA;AAAA,EAC5C;AAEA,EAAA,OAAO,IAAA;AACT;;;AC5OA,IAAM,iBAAyC,EAAE,IAAA,EAAM,GAAG,MAAA,EAAQ,CAAA,EAAG,KAAK,CAAA,EAAE;AAErE,SAAS,oBAAA,CAAqB,SAAuB,MAAA,EAAoB;AAE9E,EAAA,OAAO,OAAO,QAAyB,MAAA,KAA4C;AACjF,IAAA,MAAM,YAAA,GAAe,MAAM,OAAA,CAAQ,sBAAA,EAAuB;AAC1D,IAAA,MAAM,KAAA,GAAQ,QAAQ,eAAA,EAAgB;AACtC,IAAA,MAAM,YAAA,GAAe,QAAQ,eAAA,EAAgB;AAE7C,IAAA,MAAM,QAAkB,EAAC;AAEzB,IAAA,IAAI,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC7B,MAAA,MAAM,aAAa,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAuB,WAAA,CAAY,IAAI,CAAC,CAAA;AACzE,MAAA,MAAM,UAAU,UAAA,CAAW,MAAA,CAAO,CAAC,IAAA,KAAuB,IAAA,CAAK,WAAW,SAAS,CAAA;AACnF,MAAA,MAAM,aAAa,UAAA,CAAW,MAAA,CAAO,CAAC,IAAA,KAAuB,IAAA,CAAK,WAAW,aAAa,CAAA;AAE1F,MAAA,IAAI,UAAA,CAAW,SAAS,CAAA,KAAM,OAAA,CAAQ,SAAS,CAAA,IAAK,UAAA,CAAW,SAAS,CAAA,CAAA,EAAI;AAC1E,QAAA,KAAA,CAAM,KAAK,oDAA0C,CAAA;AACrD,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA,KAAA,CAAM,KAAK,uCAAuC,CAAA;AAClD,QAAA,KAAA,CAAM,KAAK,kDAAkD,CAAA;AAC7D,QAAA,KAAA,CAAM,KAAK,mEAAmE,CAAA;AAC9E,QAAA,KAAA,CAAM,KAAK,2DAA2D,CAAA;AACtE,QAAA,KAAA,CAAM,KAAK,sEAAsE,CAAA;AACjF,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,QAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,UAAA,KAAA,CAAM,KAAK,mDAA4C,CAAA;AACvD,UAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,YAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,IAAA,CAAK,OAAO,CAAA,CAAE,CAAA;AAAA,UAChC;AACA,UAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,QACf;AAEA,QAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,UAAA,KAAA,CAAM,KAAK,kCAA6B,CAAA;AACxC,UAAA,MAAM,gBAAgB,OAAA,CAAQ,IAAA;AAAA,YAC5B,CAAC,CAAA,EAAiB,CAAA,KAAA,CACf,cAAA,CAAe,CAAA,CAAE,QAAQ,CAAA,IAAK,EAAA,KAAO,cAAA,CAAe,CAAA,CAAE,QAAQ,CAAA,IAAK,EAAA;AAAA,WACxE;AAEA,UAAA,MAAM,WAAA,GAAc,aAAA,CAAc,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC7C,UAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,YAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,IAAA,CAAK,OAAO,CAAA,CAAE,CAAA;AAAA,UAChC;AAEA,UAAA,IAAI,OAAA,CAAQ,SAAS,EAAA,EAAI;AACvB,YAAA,KAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAc,OAAA,CAAQ,MAAA,GAAS,EAAE,CAAA,mCAAA,CAAqC,CAAA;AAAA,UACnF;AACA,UAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,QACf;AAEA,QAAA,KAAA,CAAM,KAAK,kCAA6B,CAAA;AACxC,QAAA,KAAA,CAAM,KAAK,iEAAiE,CAAA;AAC5E,QAAA,KAAA,CAAM,IAAA;AAAA,UACJ;AAAA,SACF;AACA,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,MACf;AAAA,IACF;AAEA,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,KAAA,CAAM,KAAK,0CAA0C,CAAA;AACrD,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,MAAA,KAAA,CAAM,KAAK,YAAY,CAAA;AACvB,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,YAAA,CAAa,WAAW,CAAA,CAAE,CAAA;AAAA,MACtD;AACA,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,IACf;AAEA,IAAA,IAAI,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC7B,MAAA,MAAM,aAAa,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAuB,WAAA,CAAY,IAAI,CAAC,CAAA;AACzE,MAAA,MAAM,eAAe,UAAA,CAAW,MAAA;AAAA,QAC9B,CAAC,IAAA,KAAuB,IAAA,CAAK,MAAA,KAAW;AAAA,OAC1C,CAAE,MAAA;AACF,MAAA,MAAM,kBAAkB,UAAA,CAAW,MAAA;AAAA,QACjC,CAAC,IAAA,KAAuB,IAAA,CAAK,MAAA,KAAW;AAAA,OAC1C,CAAE,MAAA;AACF,MAAA,MAAM,iBAAiB,UAAA,CAAW,MAAA;AAAA,QAChC,CAAC,IAAA,KAAuB,IAAA,CAAK,MAAA,KAAW;AAAA,OAC1C,CAAE,MAAA;AAEF,MAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,QAAA,KAAA,CAAM,KAAK,oCAA+B,CAAA;AAC1C,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA,KAAA,CAAM,KAAK,CAAA,cAAA,EAAiB,cAAc,CAAA,CAAA,EAAI,UAAA,CAAW,MAAM,CAAA,qBAAA,CAAuB,CAAA;AACtF,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkB,YAAY,CAAA,UAAA,EAAa,eAAe,CAAA,YAAA,CAAc,CAAA;AACnF,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA,KAAA,CAAM,KAAK,qBAAqB,CAAA;AAChC,QAAA,KAAA,CAAM,KAAK,8CAAyC,CAAA;AACpD,QAAA,KAAA,CAAM,KAAK,oEAAoE,CAAA;AAC/E,QAAA,KAAA,CAAM,KAAK,2CAA2C,CAAA;AACtD,QAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,QAAA,IAAI,YAAA,EAAc;AAChB,UAAA,KAAA,CAAM,KAAK,8BAA8B,CAAA;AACzC,UAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,UAAA,KAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkB,YAAA,CAAa,WAAW,CAAA,CAAA,CAAG,CAAA;AACxD,UAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,UAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,YAAA,IAAiB,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,EAAI;AAC/C,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ;AAAA,OACF;AACA,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,MAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IACtC;AAAA,EACF,CAAA;AACF;AC1GO,IAAM,yBAAA,GAA4B,CAAA;AAKlC,IAAM,iBAAA,GAA8D;AAAA,EACzE,OAAA,EAAS,CAAC,KAAK,CAAA;AAAA;AAAA,EACf,GAAA,EAAK,CAAC,QAAQ,CAAA;AAAA;AAAA,EACd,MAAA,EAAQ,CAAC,OAAA,EAAS,KAAK,CAAA;AAAA;AAAA,EACvB,KAAA,EAAO,CAAC,QAAQ;AAAA;AAClB,CAAA;AAmIA,IAAM,mBAAA,GAAsB,EACzB,MAAA,CAAO;AAAA,EACN,YAAA,EAAc,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC/B,SAAA,EAAW,EAAE,MAAA,EAAO;AAAA,EACpB,UAAA,EAAY,EAAE,MAAA,EAAO;AAAA,EACrB,YAAA,EAAc,EAAE,MAAA,EAAO;AAAA,EACvB,YAAA,EAAc,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAClC,cAAc,CAAA,CAAE,KAAA;AAAA,IACd,EAAE,MAAA,CAAO;AAAA,MACP,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,MAChB,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,MAChB,SAAA,EAAW,EAAE,MAAA,EAAO;AAAA,MACpB,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MAC9B,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MAC9B,cAAA,EAAgB,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MACpC,qBAAqB,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,MAClD,cAAc,CAAA,CAAE,KAAA,CAAM,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,MAC3C,cAAA,EAAgB,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,MACrC,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MAChC,KAAA,EAAO,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MAC3B,WAAA,EAAa,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MACjC,UAAU,CAAA,CAAE,KAAA,CAAM,EAAE,OAAA,EAAS,EAAE,QAAA;AAAS,KACzC;AAAA,GACH;AAAA,EACA,eAAA,EAAiB,EAAE,MAAA,EAAO;AAAA,EAC1B,aAAA,EAAe,EACZ,MAAA,CAAO;AAAA,IACN,QAAA,EAAU,EAAE,MAAA,EAAO;AAAA,IACnB,QAAA,EAAU,EAAE,MAAA,EAAO;AAAA,IACnB,cAAA,EAAgB,EAAE,MAAA;AAAO,GAC1B,EACA,QAAA,EAAS;AAAA,EACZ,gBAAA,EAAkB,EACf,MAAA,CAAO;AAAA,IACN,QAAA,EAAU,EAAE,OAAA,EAAQ;AAAA,IACpB,YAAA,EAAc,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,QAAQ,CAAA;AAAA,IAChC,UAAA,EAAY,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GACjC,EACA,QAAA,EAAS;AAAA,EACZ,kBAAA,EAAoB,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACxC,eAAA,EAAiB,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACrC,eAAe,CAAA,CAAE,KAAA,CAAM,EAAE,OAAA,EAAS,EAAE,QAAA,EAAS;AAAA,EAC7C,gBAAgB,CAAA,CAAE,KAAA,CAAM,EAAE,OAAA,EAAS,EAAE,QAAA,EAAS;AAAA,EAC9C,kBAAA,EAAoB,CAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAClC,CAAC,EACA,WAAA,EAAY;AAKf,IAAM,kBAAA,GAAqBE,IAAAA;AAAA,EACzB,OAAA,CAAQ,IAAI,IAAA,IAAQ,GAAA;AAAA,EACpB,SAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA;AAKA,SAAS,kBAAA,CACP,UAAA,EACA,SAAA,EACA,eAAA,GAA0B,yBAAA,EACX;AACf,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,IAAA;AAAA,IACd,SAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA,EAAc,MAAA;AAAA,IACd,YAAA,EAAc,IAAA;AAAA,IACd,cAAc,EAAC;AAAA,IACf,eAAA,EAAiB,CAAA;AAAA,IACjB,kBAAA,EAAoB,CAAA;AAAA,IACpB,eAAA;AAAA,IACA,eAAe,EAAC;AAAA,IAChB,gBAAgB,EAAC;AAAA,IACjB,kBAAA,EAAoB;AAAA,GACtB;AACF;AAKO,IAAM,kBAAN,MAAsB;AAAA,EACnB,KAAA;AAAA,EACA,SAAA;AAAA,EAER,WAAA,CACE,UAAA,EACA,SAAA,EACA,SAAA,EACA,kBAA0B,yBAAA,EAC1B;AACA,IAAA,IAAA,CAAK,YAAY,SAAA,IAAa,kBAAA;AAC9B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,SAAA,CAAU,UAAA,EAAY,WAAW,eAAe,CAAA;AAAA,EACpE;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAA,CAAU,UAAA,EAAoB,SAAA,EAAmB,eAAA,EAAwC;AAC/F,IAAA,IAAI;AACF,MAAA,IAAIC,UAAAA,CAAW,IAAA,CAAK,SAAS,CAAA,EAAG;AAC9B,QAAA,MAAM,UAAU,IAAA,CAAK,KAAA,CAAM,aAAa,IAAA,CAAK,SAAA,EAAW,OAAO,CAAC,CAAA;AAGhE,QAAA,MAAM,WAAA,GAAc,mBAAA,CAAoB,SAAA,CAAU,OAAO,CAAA;AACzD,QAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACxB,UAAA,OAAA,CAAQ,IAAA;AAAA,YACN,uDAAA;AAAA,YACA,YAAY,KAAA,CAAM;AAAA,WACpB;AACA,UAAA,OAAO,kBAAA,CAAmB,UAAA,EAAY,SAAA,EAAW,eAAe,CAAA;AAAA,QAClE;AAEA,QAAA,MAAM,OAAO,WAAA,CAAY,IAAA;AAGzB,QAAA,IAAI,IAAA,CAAK,SAAA,KAAc,SAAA,IAAa,IAAA,CAAK,eAAe,UAAA,EAAY;AAClE,UAAA,OAAO;AAAA,YACL,GAAG,kBAAA,CAAmB,UAAA,EAAY,SAAA,EAAW,eAAe,CAAA;AAAA,YAC5D,GAAG,IAAA;AAAA;AAAA,YAEH,kBAAA,EAAoB,KAAK,kBAAA,IAAsB,CAAA;AAAA,YAC/C,eAAA,EAAiB,KAAK,eAAA,IAAmB,eAAA;AAAA,YACzC,aAAA,EAAe,IAAA,CAAK,aAAA,IAAiB,EAAC;AAAA,YACtC,cAAA,EAAgB,IAAA,CAAK,cAAA,IAAkB,EAAC;AAAA,YACxC,kBAAA,EAAoB,KAAK,kBAAA,IAAsB;AAAA,WACjD;AAAA,QACF;AAGA,QAAA,OAAO,kBAAA,CAAmB,UAAA,EAAY,SAAA,EAAW,eAAe,CAAA;AAAA,MAClE;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,OAAO,kBAAA,CAAmB,UAAA,EAAY,SAAA,EAAW,eAAe,CAAA;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAA,GAAkB;AACxB,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA;AAClC,MAAA,IAAI,CAACA,UAAAA,CAAW,GAAG,CAAA,EAAG;AACpB,QAAA,SAAA,CAAU,GAAA,EAAK,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAAA,MACpC;AACA,MAAA,aAAA,CAAc,IAAA,CAAK,WAAW,IAAA,CAAK,SAAA,CAAU,KAAK,KAAA,EAAO,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,IACnE,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AAAA,IACxD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAA0B;AACxB,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,KAAA,EAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CAAW,aAAqB,mBAAA,EAAoC;AAClE,IAAA,IAAA,CAAK,MAAM,YAAA,GAAe,WAAA;AAC1B,IAAA,IAAA,CAAK,MAAM,SAAA,GAAY,mBAAA;AACvB,IAAA,IAAA,CAAK,MAAM,YAAA,GAAe,MAAA;AAC1B,IAAA,IAAA,CAAK,MAAM,YAAA,GAAe,IAAA;AAC1B,IAAA,IAAA,CAAK,KAAA,CAAM,eAAe,EAAC;AAC3B,IAAA,IAAA,CAAK,MAAM,eAAA,GAAkB,CAAA;AAC7B,IAAA,IAAA,CAAK,MAAM,aAAA,GAAgB,MAAA;AAC3B,IAAA,IAAA,CAAK,MAAM,gBAAA,GAAmB,MAAA;AAE9B,IAAA,IAAA,CAAK,MAAM,kBAAA,GAAqB,CAAA;AAChC,IAAA,IAAA,CAAK,KAAA,CAAM,gBAAgB,EAAC;AAC5B,IAAA,IAAA,CAAK,KAAA,CAAM,iBAAiB,EAAC;AAC7B,IAAA,IAAA,CAAK,MAAM,kBAAA,GAAqB,KAAA;AAChC,IAAA,IAAA,CAAK,SAAA,EAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,KAAA,EAAqD;AACnE,IAAA,MAAM,qBAAA,GAAwB,IAAA,CAAK,KAAA,CAAM,YAAA,IAAgB,SAAA;AACzD,IAAA,MAAM,eAAA,GAAkB,kBAAkB,qBAAqB,CAAA;AAE/D,IAAA,IAAI,eAAA,CAAgB,QAAA,CAAS,KAAK,CAAA,EAAG;AACnC,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,IAAA;AAAA,QACP,MAAA,EAAQ,CAAA,gBAAA,EAAmB,qBAAqB,CAAA,IAAA,EAAO,KAAK,CAAA,SAAA;AAAA,OAC9D;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ,sCAAsC,qBAAqB,CAAA,IAAA,EAAO,KAAK,CAAA,qBAAA,EAAwB,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KACnI;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAiD;AAC/C,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,eAAA,CAAgB,KAAK,CAAA;AAChD,IAAA,IAAI,CAAC,cAAc,KAAA,EAAO;AACxB,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,cAAc,MAAA,EAAO;AAAA,IACvD;AAEA,IAAA,IAAA,CAAK,MAAM,YAAA,GAAe,KAAA;AAC1B,IAAA,IAAA,CAAK,MAAM,YAAA,GAAe,iBAAA;AAC1B,IAAA,IAAA,CAAK,aAAA,CAAc;AAAA,MACjB,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,iBAAA;AAAA,MACP,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACnC,CAAA;AACD,IAAA,IAAA,CAAK,SAAA,EAAU;AACf,IAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,CACE,QAAA,EACA,QAAA,EACA,cAAA,EACsC;AACtC,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,YAAA,KAAiB,iBAAA,EAAmB;AACjD,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,2BAAA,EAA4B;AAAA,IAC9D;AAEA,IAAA,IAAA,CAAK,MAAM,YAAA,GAAe,cAAA;AAC1B,IAAA,IAAA,CAAK,KAAA,CAAM,aAAA,GAAgB,EAAE,QAAA,EAAU,UAAU,cAAA,EAAe;AAChE,IAAA,IAAA,CAAK,aAAA,CAAc;AAAA,MACjB,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,cAAA;AAAA,MACP,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,QAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,IAAA,CAAK,SAAA,EAAU;AACf,IAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,OAAA,EAAgE;AAC1E,IAAA,MAAM,qBAAA,GAAwB,OAAA,KAAY,KAAA,GAAQ,cAAA,GAAiB,gBAAA;AACnE,IAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,KAAA,CAAM,YAAA,KAAiB,eAAA;AACtD,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,YAAA,KAAiB,eAAA;AACnD,IAAA,MAAM,oBAAA,GAAuB,IAAA,CAAK,KAAA,CAAM,YAAA,KAAiB,qBAAA;AAIzD,IAAA,IAAI,CAAC,iBAAA,IAAqB,CAAC,cAAA,IAAkB,CAAC,oBAAA,EAAsB;AAClE,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,eAAA,CAAgB,QAAQ,CAAA;AACnD,MAAA,IAAI,CAAC,cAAc,KAAA,EAAO;AACxB,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,cAAc,MAAA,EAAO;AAAA,MACvD;AAEA,MAAA,IAAI,IAAA,CAAK,KAAA,CAAM,YAAA,KAAiB,qBAAA,EAAuB;AACrD,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,OAAO,CAAA,2CAAA,EAA8C,qBAAqB,CAAA,MAAA,EAAS,IAAA,CAAK,MAAM,YAAY,CAAA;AAAA,SAC5G;AAAA,MACF;AAGA,MAAA,IAAA,CAAK,MAAM,kBAAA,GAAqB,CAAA;AAChC,MAAA,IAAA,CAAK,KAAA,CAAM,gBAAgB,EAAC;AAC5B,MAAA,IAAA,CAAK,KAAA,CAAM,iBAAiB,EAAC;AAAA,IAC/B;AAGA,IAAA,IAAA,CAAK,KAAA,CAAM,kBAAA,EAAA;AAEX,IAAA,IAAA,CAAK,MAAM,YAAA,GAAe,QAAA;AAC1B,IAAA,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,OAAA,KAAY,KAAA,GAAQ,mBAAA,GAAsB,qBAAA;AACpE,IAAA,IAAA,CAAK,aAAA,CAAc;AAAA,MACjB,KAAA,EAAO,QAAA;AAAA,MACP,KAAA,EAAO,KAAK,KAAA,CAAM,YAAA;AAAA,MAClB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,WAAA,EAAa,KAAK,KAAA,CAAM;AAAA,KACzB,CAAA;AACD,IAAA,IAAA,CAAK,SAAA,EAAU;AACf,IAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,CAAc,YAAA,GAAyB,EAAC,EAAyC;AAC/E,IAAA,IACE,KAAK,KAAA,CAAM,YAAA,KAAiB,uBAC5B,IAAA,CAAK,KAAA,CAAM,iBAAiB,qBAAA,EAC5B;AACA,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,+BAAA,EAAgC;AAAA,IAClE;AAEA,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,YAAA,KAAiB,mBAAA;AACpD,IAAA,MAAM,OAAA,GAAU,kBAAkB,KAAA,GAAQ,OAAA;AAC1C,IAAA,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,eAAA,GAAkB,qBAAA,GAAwB,uBAAA;AACpE,IAAA,IAAA,CAAK,KAAA,CAAM,gBAAA,GAAmB,EAAE,QAAA,EAAU,MAAM,YAAA,EAAa;AAG7D,IAAA,IAAA,CAAK,KAAA,CAAM,cAAc,IAAA,CAAK;AAAA,MAC5B,KAAA,EAAO,KAAK,KAAA,CAAM,kBAAA;AAAA,MAClB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,OAAA;AAAA,MACA,QAAA,EAAU,CAAC,GAAG,IAAA,CAAK,MAAM,cAAc,CAAA;AAAA,MACvC,OAAA,EAAS;AAAA,KACV,CAAA;AAGD,IAAA,IAAA,CAAK,KAAA,CAAM,iBAAiB,EAAC;AAE7B,IAAA,IAAA,CAAK,aAAA,CAAc;AAAA,MACjB,KAAA,EAAO,QAAA;AAAA,MACP,KAAA,EAAO,KAAK,KAAA,CAAM,YAAA;AAAA,MAClB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,cAAA,EAAgB,IAAA;AAAA,MAChB,YAAA;AAAA,MACA,WAAA,EAAa,KAAK,KAAA,CAAM;AAAA,KACzB,CAAA;AAED,IAAA,IAAI,CAAC,eAAA,EAAiB;AAEpB,MAAA,IAAA,CAAK,MAAM,YAAA,GAAe,gBAAA;AAC1B,MAAA,IAAA,CAAK,KAAA,CAAM,eAAA,EAAA;AACX,MAAA,IAAA,CAAK,MAAM,YAAA,GAAe,IAAA;AAE1B,MAAA,IAAA,CAAK,MAAM,kBAAA,GAAqB,CAAA;AAChC,MAAA,IAAA,CAAK,MAAM,kBAAA,GAAqB,KAAA;AAAA,IAClC;AAEA,IAAA,IAAA,CAAK,SAAA,EAAU;AACf,IAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CACE,MAAA,EACA,QAAA,GAA4B,EAAC,EAC6B;AAC1D,IAAA,IACE,KAAK,KAAA,CAAM,YAAA,KAAiB,uBAC5B,IAAA,CAAK,KAAA,CAAM,iBAAiB,qBAAA,EAC5B;AACA,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,+BAAA,EAAgC;AAAA,IAClE;AAEA,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,YAAA,KAAiB,mBAAA;AACpD,IAAA,MAAM,OAAA,GAAU,kBAAkB,KAAA,GAAQ,OAAA;AAG1C,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,MAAA,IAAA,CAAK,KAAA,CAAM,cAAA,CAAe,IAAA,CAAK,GAAG,QAAQ,CAAA;AAAA,IAC5C,CAAA,MAAO;AAEL,MAAA,IAAA,CAAK,KAAA,CAAM,eAAe,IAAA,CAAK;AAAA,QAC7B,EAAA,EAAI,CAAA,QAAA,EAAW,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAA,QACzB,IAAA,EAAM,OAAA;AAAA,QACN,WAAA,EAAa,MAAA;AAAA,QACb,QAAA,EAAU;AAAA,OACX,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,kBAAA,IAAsB,KAAK,KAAA,CAAM,eAAA;AAEnE,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,IAAA,CAAK,MAAM,YAAA,GAAe,qBAAA;AAAA,IAC5B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,MAAM,YAAA,GAAe,eAAA;AAAA,IAC5B;AAEA,IAAA,IAAA,CAAK,KAAA,CAAM,mBAAmB,EAAE,QAAA,EAAU,OAAO,YAAA,EAAc,EAAC,EAAG,UAAA,EAAY,MAAA,EAAO;AAGtF,IAAA,IAAA,CAAK,KAAA,CAAM,cAAc,IAAA,CAAK;AAAA,MAC5B,KAAA,EAAO,KAAK,KAAA,CAAM,kBAAA;AAAA,MAClB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,OAAA;AAAA,MACA,QAAA,EAAU,CAAC,GAAG,IAAA,CAAK,MAAM,cAAc,CAAA;AAAA,MACvC,OAAA,EAAS,iBAAiB,WAAA,GAAc;AAAA,KACzC,CAAA;AAED,IAAA,IAAA,CAAK,aAAA,CAAc;AAAA,MACjB,KAAA,EAAO,QAAA;AAAA,MACP,KAAA,EAAO,KAAK,KAAA,CAAM,YAAA;AAAA,MAClB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,cAAA,EAAgB,KAAA;AAAA,MAChB,UAAA,EAAY,MAAA;AAAA,MACZ,WAAA,EAAa,KAAK,KAAA,CAAM,kBAAA;AAAA,MACxB,QAAA,EAAU,KAAK,KAAA,CAAM;AAAA,KACtB,CAAA;AACD,IAAA,IAAA,CAAK,SAAA,EAAU;AACf,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,QAAA,EAAU,cAAA,EAAe;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,MAAA,EAAsD;AACjE,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,YAAA,KAAiB,qBAAA,EAAuB;AACrD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,CAAA,oEAAA,EAAuE,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA;AAAA,OACvG;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,KAAA,CAAM,cAAA,EAAgB;AAC/C,MAAA,OAAA,CAAQ,QAAA,GAAW,IAAA;AACnB,MAAA,OAAA,CAAQ,UAAA,GAAa,eAAA;AACrB,MAAA,OAAA,CAAQ,eAAA,GAAkB,MAAA;AAAA,IAC5B;AAEA,IAAA,IAAA,CAAK,MAAM,YAAA,GAAe,eAAA;AAC1B,IAAA,IAAA,CAAK,MAAM,kBAAA,GAAqB,IAAA;AAEhC,IAAA,IAAA,CAAK,aAAA,CAAc;AAAA,MACjB,KAAA,EAAO,QAAA;AAAA,MACP,KAAA,EAAO,eAAA;AAAA,MACP,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,cAAA,EAAgB,KAAA;AAAA,MAChB,UAAA,EAAY,kBAAkB,MAAM,CAAA,CAAA;AAAA,MACpC,WAAA,EAAa,KAAK,KAAA,CAAM;AAAA,KACzB,CAAA;AAED,IAAA,IAAA,CAAK,SAAA,EAAU;AACf,IAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAA2B;AACzB,IAAA,OAAO,IAAA,CAAK,MAAM,YAAA,KAAiB,qBAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,GAAyB;AACvB,IAAA,OAAO,KAAK,KAAA,CAAM,kBAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,GAAqC;AACnC,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,cAAc,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAA,CACE,SAAA,EACA,UAAA,EACA,KAAA,EACsC;AACtC,IAAA,MAAM,OAAA,GAAU,KAAK,KAAA,CAAM,cAAA,CAAe,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,SAAS,CAAA;AACxE,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,CAAA,QAAA,EAAW,SAAS,CAAA,UAAA,CAAA,EAAa;AAAA,IACnE;AAEA,IAAA,OAAA,CAAQ,QAAA,GAAW,IAAA;AACnB,IAAA,OAAA,CAAQ,UAAA,GAAa,UAAA;AACrB,IAAA,OAAA,CAAQ,eAAA,GAAkB,KAAA;AAC1B,IAAA,IAAA,CAAK,SAAA,EAAU;AACf,IAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAmD;AACjD,IAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,eAAA,CAAgB,OAAO,CAAA;AAClD,IAAA,IAAI,CAAC,cAAc,KAAA,EAAO;AACxB,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,cAAc,MAAA,EAAO;AAAA,IACvD;AAGA,IAAA,MAAM,aAAA,GAA8B,CAAC,qBAAA,EAAuB,eAAe,CAAA;AAC3E,IAAA,IAAI,CAAC,aAAA,CAAc,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA,EAAG;AACpD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,CAAA,oFAAA,EAAuF,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA;AAAA,OACvH;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,aAAA,EAAe;AAC7B,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yDAAA,EAA0D;AAAA,IAC5F;AAEA,IAAA,IAAA,CAAK,MAAM,YAAA,GAAe,OAAA;AAC1B,IAAA,IAAA,CAAK,MAAM,YAAA,GAAe,mBAAA;AAC1B,IAAA,IAAA,CAAK,aAAA,CAAc;AAAA,MACjB,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO,mBAAA;AAAA,MACP,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACnC,CAAA;AACD,IAAA,IAAA,CAAK,SAAA,EAAU;AACf,IAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc,mBAAA,EAAqE;AACjF,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,YAAA,KAAiB,mBAAA,EAAqB;AACnD,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,6BAAA,EAA8B;AAAA,IAChE;AAEA,IAAA,IAAA,CAAK,MAAM,YAAA,GAAe,gBAAA;AAC1B,IAAA,IAAA,CAAK,aAAA,CAAc;AAAA,MACjB,KAAA,EAAO,OAAA;AAAA,MACP,KAAA,EAAO,gBAAA;AAAA,MACP,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC;AAAA,KACD,CAAA;AACD,IAAA,IAAA,CAAK,SAAA,EAAU;AACf,IAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,KAAA,EAAyB;AAC7C,IAAA,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAA0B;AACxB,IAAA,MAAM;AAAA,MACJ,YAAA;AAAA,MACA,YAAA;AAAA,MACA,eAAA;AAAA,MACA,aAAA;AAAA,MACA,gBAAA;AAAA,MACA,kBAAA;AAAA,MACA,eAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,QACE,IAAA,CAAK,KAAA;AAET,IAAA,IAAI,OAAA,GAAU,qBAAA;AACd,IAAA,OAAA,IAAW,uBAAuB,eAAe;AAAA,CAAA;AACjD,IAAA,OAAA,IAAW,oBAAoB,YAAY;AAAA,CAAA;AAC3C,IAAA,OAAA,IAAW,CAAA,iBAAA,EAAoB,gBAAgB,MAAM;AAAA,CAAA;AAGrD,IAAA,IACE,iBAAiB,QAAA,IACjB,YAAA,CAAa,SAAS,QAAQ,CAAA,IAC9B,iBAAiB,qBAAA,EACjB;AACA,MAAA,OAAA,IAAW,sBAAA;AACX,MAAA,OAAA,IAAW,CAAA,WAAA,EAAc,kBAAkB,CAAA,GAAA,EAAM,eAAe;AAAA,CAAA;AAChE,MAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,QAAA,OAAA,IAAW,CAAA,qBAAA,EAAwB,eAAe,MAAM;AAAA,CAAA;AACxD,QAAA,KAAA,MAAW,WAAW,cAAA,EAAgB;AACpC,UAAA,IAAI,MAAA;AACJ,UAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,YAAA,MAAA,GAAS,CAAA,OAAA,EAAK,QAAQ,UAAU,CAAA,CAAA;AAAA,UAClC,CAAA,MAAO;AACL,YAAA,MAAA,GAAS,mBAAA;AAAA,UACX;AACA,UAAA,OAAA,IAAW,YAAY,OAAA,CAAQ,IAAI,KAAK,OAAA,CAAQ,WAAW,KAAK,MAAM,CAAA;AAAA,CAAA;AAAA,QACxE;AAAA,MACF;AACA,MAAA,IAAI,kBAAA,EAAoB;AACtB,QAAA,OAAA,IAAW,6BAAA;AAAA,MACb;AACA,MAAA,IAAI,iBAAiB,qBAAA,EAAuB;AAC1C,QAAA,OAAA,IAAW,6DAAA;AAAA,MACb;AAAA,IACF;AAEA,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,OAAA,IAAW,wBAAA;AACX,MAAA,OAAA,IAAW,CAAA,UAAA,EAAa,cAAc,QAAQ;AAAA,CAAA;AAC9C,MAAA,OAAA,IAAW,CAAA,UAAA,EAAa,cAAc,QAAQ;AAAA,CAAA;AAAA,IAChD;AAEA,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,OAAA,IAAW,2BAAA;AACX,MAAA,OAAA,IAAW,CAAA,cAAA,EAAiB,iBAAiB,QAAQ;AAAA,CAAA;AACrD,MAAA,IAAI,gBAAA,CAAiB,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AAC5C,QAAA,OAAA,IAAW,CAAA,mBAAA,EAAsB,gBAAA,CAAiB,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC;AAAA,CAAA;AAAA,MAC3E;AACA,MAAA,IAAI,iBAAiB,UAAA,EAAY;AAC/B,QAAA,OAAA,IAAW,CAAA,iBAAA,EAAoB,iBAAiB,UAAU;AAAA,CAAA;AAAA,MAC5D;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,kBAAA;AAAA,MACX,KAAK,KAAA,CAAM,UAAA;AAAA,MACX,KAAK,KAAA,CAAM,SAAA;AAAA,MACX,KAAK,KAAA,CAAM;AAAA,KACb;AACA,IAAA,IAAA,CAAK,SAAA,EAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAA,GAAmD;AACjD,IAAA,OAAO,KAAK,KAAA,CAAM,aAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,mBAAA,GAAyD;AACvD,IAAA,OAAO,KAAK,KAAA,CAAM,gBAAA;AAAA,EACpB;AACF,CAAA;ACrxBA,IAAMH,IAAAA,GAAM,mBAAmB,wBAAwB,CAAA;AA4BvD,IAAM,iBAAA,GAAoB,iBAAA;AAE1B,SAAS,sBAAsB,OAAA,EAAyB;AACtD,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA,CAAE,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAA,EAAM,CAAA;AAC9D,EAAA,MAAM,UAAU,KAAA,CAAM,MAAA;AAAA,IACpB,CAAC,IAAA,KAAS,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,IAAK,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,IAAK,IAAA,CAAK,UAAA,CAAW,GAAG;AAAA,GAC/E;AAEA,EAAA,OAAO,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,IAAK,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAChE;AAEA,SAAS,mBAAmB,OAAA,EAA2B;AACrD,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA;AACnC,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,UAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO,KAAA,CACJ,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,MAAM,CAAA,CACzB,MAAA,CAAO,CAAC,IAAA,KAAS,QAAA,CAAS,KAAK,CAAC,OAAA,KAAY,IAAA,CAAK,WAAA,EAAY,CAAE,QAAA,CAAS,OAAO,CAAC,CAAC,CAAA,CACjF,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAChB;AAEA,eAAsB,wBAAwB,UAAA,EAAkD;AAC9F,EAAA,MAAM,IAAA,GAAOE,IAAAA,CAAK,UAAA,EAAY,iBAAiB,CAAA;AAE/C,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAM,QAAA,CAAS,IAAA,EAAM,OAAO,CAAA;AAC5C,IAAA,MAAM,WAAA,GAAc,mBAAmB,OAAO,CAAA;AAC9C,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,IAAA;AAAA,MACR,OAAA;AAAA,MACA,OAAA,EAAS,sBAAsB,OAAO,CAAA;AAAA,MACtC;AAAA,KACF;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,KAAA;AAAA,MACR,aAAa;AAAC,KAChB;AAAA,EACF;AACF;AAEO,SAAS,0BAAA,CACd,SACA,aAAA,EACkC;AAClC,EAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,IAAU,CAAC,QAAQ,OAAA,EAAS;AACvC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAA,GAAY,cAAc,WAAA,EAAY;AAC5C,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,OAAA,CAAQ,WAAA,EAAY;AAEjD,EAAA,IAAI,aAAa,QAAA,CAAS,WAAW,KAAK,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,EAAG;AACnE,IAAA,OAAO;AAAA,MACL,sBAAA,EAAwB,kDAAA;AAAA,MACxB,aAAA;AAAA,MACA,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAEA,EAAA,IAAI,aAAa,QAAA,CAAS,gBAAgB,KAAK,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,EAAG;AACzE,IAAA,OAAO;AAAA,MACL,sBAAA,EAAwB,0CAAA;AAAA,MACxB,aAAA;AAAA,MACA,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,eAAsB,2BACpB,KAAA,EACkC;AAClC,EAAA,MAAM,OAAA,GAAU,MAAM,uBAAA,CAAwB,KAAA,CAAM,UAAU,CAAA;AAE9D,EAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,OAAA;AAAA,MACA,UAAA,EACE;AAAA,KACJ;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,0BAAA,CAA2B,OAAA,EAAS,KAAA,CAAM,aAAa,CAAA;AACxE,EAAA,IAAI,QAAA,EAAU;AACZ,IAAAF,IAAAA,CAAI,IAAA,CAAK,gCAAA,EAAkC,EAAE,UAAU,CAAA;AACvD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,OAAA;AAAA,MACA,QAAA;AAAA,MACA,KAAA,EAAO,gCAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT;AAAA,GACF;AACF;AAEO,SAAS,2BAA2B,QAAA,EAAwC;AACjF,EAAA,OAAO,CAAA;;AAAA,yBAAA,EAA8D,SAAS,sBAAsB;AAAA,gBAAA,EAAqB,SAAS,aAAa;AAAA,UAAA,EAAe,SAAS,QAAQ;;AAAA;AAAA;AAAA,6CAAA,CAAA;AACjL;;;ACzDO,SAAS,aAAA,CAAc,KAAkB,MAAA,EAAoC;AAClF,EAAA,OAAO,IAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA,0DAAA,CAAA;AAAA,IAcb,IAAA,EAAM;AAAA,MACJ,MAAA,EAAQ,IAAA,CAAK,MAAA,CACV,IAAA,CAAK,CAAC,QAAA,EAAU,MAAA,EAAQ,YAAY,CAAC,CAAA,CACrC,QAAA,CAAS,gDAAgD,CAAA;AAAA,MAC5D,KAAA,EAAO,KAAK,MAAA,CACT,MAAA,GACA,QAAA,EAAS,CACT,SAAS,gDAAgD,CAAA;AAAA,MAC5D,OAAA,EAAS,KAAK,MAAA,CACX,MAAA,GACA,QAAA,EAAS,CACT,SAAS,yDAAyD,CAAA;AAAA,MACrE,QAAA,EAAU,KAAK,MAAA,CACZ,MAAA,GACA,QAAA,EAAS,CACT,SAAS,6CAA6C,CAAA;AAAA,MACzD,YAAA,EAAc,KAAK,MAAA,CAChB,MAAA,GACA,QAAA,EAAS,CACT,SAAS,kDAAkD;AAAA,KAChE;AAAA,IAEA,MAAM,QAAQ,IAAA,EAAuB;AACnC,MAAA,MAAM,OAAA,GAAU,IAAA;AAEhB,MAAA,QAAQ,QAAQ,MAAA;AAAQ,QACtB,KAAK,QAAA;AACH,UAAA,OAAO,IAAA,CAAK,UAAU,MAAM,SAAA,CAAU,KAAK,MAAA,EAAQ,OAAO,CAAA,EAAG,IAAA,EAAM,CAAC,CAAA;AAAA,QACtE,KAAK,MAAA;AACH,UAAA,OAAO,KAAK,SAAA,CAAU,MAAM,SAAS,GAAG,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA,QACpD,KAAK,YAAA;AACH,UAAA,OAAO,IAAA,CAAK,UAAU,MAAM,cAAA,CAAe,KAAK,MAAM,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA,QAClE;AACE,UAAA,OAAO,KAAK,SAAA,CAAU;AAAA,YACpB,OAAA,EAAS,KAAA;AAAA,YACT,KAAA,EAAO,CAAA,gBAAA,EAAmB,OAAA,CAAQ,MAAM,CAAA;AAAA,WACzC,CAAA;AAAA;AACL,IACF;AAAA,GACD,CAAA;AACH;AAEA,IAAM,OAAA,GAAU,UAAA;AAEhB,eAAe,SAAA,CACb,GAAA,EACA,OAAA,EACA,IAAA,EAC0B;AAC1B,EAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACf,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,uCAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAEA,EAAA,MAAM,iBAAA,GAAoB,MAAM,0BAAA,CAA2B;AAAA,IACzD,YAAY,GAAA,CAAI,SAAA;AAAA,IAChB,aAAA,EAAe,CAAA,cAAA,EAAiB,IAAA,CAAK,KAAK,CAAA;AAAA,GAC3C,CAAA;AAED,EAAA,IAAI,CAAC,iBAAA,CAAkB,OAAA,IAAW,iBAAA,CAAkB,QAAA,EAAU;AAC5D,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,0BAAA,CAA2B,iBAAA,CAAkB,QAAQ,CAAA;AAAA,MAC5D,YAAY,iBAAA,CAAkB;AAAA,KAChC;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAASE,IAAAA,CAAK,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA;AAG1C,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,CAAM,MAAA,EAAQ,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EACzC,CAAA,CAAA,MAAQ;AAAA,EAER;AAGA,EAAA,MAAM,YAAA,GAAe,MAAM,qBAAA,CAAsB,MAAM,CAAA;AACvD,EAAA,MAAM,UAAA,GAAa,aAAa,MAAA,GAAS,CAAA,GAAI,KAAK,GAAA,CAAI,GAAG,YAAY,CAAA,GAAI,CAAA,GAAI,CAAA;AAG7E,EAAA,MAAM,eAAe,MAAA,CAAO,UAAU,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AACvD,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA;AAC/B,EAAA,MAAM,QAAA,GAAW,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,IAAI,CAAA,GAAA,CAAA;AACxC,EAAA,MAAM,QAAA,GAAWA,IAAAA,CAAK,MAAA,EAAQ,QAAQ,CAAA;AAGtC,EAAA,MAAM,IAAA,GAAA,qBAAW,IAAA,EAAK,EAAE,aAAY,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA;AAClD,EAAA,MAAM,UAAU,kBAAA,CAAmB;AAAA,IACjC,MAAA,EAAQ,UAAA;AAAA,IACR,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,MAAA,EAAQ,UAAA;AAAA,IACR,IAAA;AAAA,IACA,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,cAAc,IAAA,CAAK;AAAA,GACpB,CAAA;AAED,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,CAAU,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAE1C,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAM,QAAA;AAAA,MACN,MAAA,EAAQ;AAAA,KACV;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,yBAAyB,OAAO,CAAA,CAAA;AAAA,MACvC,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AACF;AAEA,eAAe,SAAS,GAAA,EAA0C;AAChE,EAAA,MAAM,MAAA,GAASA,IAAAA,CAAK,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA;AAE1C,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,MAAM,CAAA;AAClC,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,KAAA,CAAM,gBAAgB,CAAC,CAAA;AAE9D,IAAA,MAAM,OAAsB,EAAC;AAE7B,IAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,MAAA,MAAM,QAAA,GAAWA,IAAAA,CAAK,MAAA,EAAQ,IAAI,CAAA;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAME,QAAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAChD,QAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,OAAA,EAAS,IAAI,CAAA;AAC/C,QAAA,IAAA,CAAK,IAAA,CAAK;AAAA,UACR,GAAG,QAAA;AAAA,UACH,IAAA,EAAM;AAAA,SACP,CAAA;AAAA,MACH,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,MAAA,GAAS,EAAE,MAAM,CAAA;AAEvC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,IAAA;AAAA,MACA,OAAO,IAAA,CAAK;AAAA,KACd;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,MAAM,EAAC;AAAA,MACP,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AACF;AAEA,eAAe,cAAA,CAAe,KAAkB,MAAA,EAAkD;AAEhG,EAAA,MAAM,UAAA,GAAa,MAAM,QAAA,CAAS,GAAG,CAAA;AAErC,EAAA,IAAI,CAAC,UAAA,CAAW,OAAA,IAAW,CAAC,WAAW,IAAA,EAAM;AAC3C,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAEA,EAAA,MAAM,YAAA,GAAe,WAAW,IAAA,CAAK,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,CAAI,WAAW,UAAU,CAAA;AAE9E,EAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,wBAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAGA,EAAA,MAAM,gBAAA,GAAmB,MAAM,oBAAA,CAAqB,GAAA,EAAK,QAAQ,YAAY,CAAA;AAE7E,EAAA,IAAI,CAAC,iBAAiB,OAAA,EAAS;AAC7B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,iBAAiB,KAAA,IAAS,kBAAA;AAAA,MACjC,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAGA,EAAA,MAAM,gBAAA,GAAmBF,IAAAA,CAAK,GAAA,CAAI,SAAA,EAAW,iBAAiB,CAAA;AAE9D,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,CAAU,gBAAA,EAAkB,gBAAA,CAAiB,OAAA,IAAW,IAAI,OAAO,CAAA;AAEzE,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,gBAAA;AAAA,MACA,cAAc,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,MAAM;AAAA,KAChD;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,oCAAoC,OAAO,CAAA;AAAA,KACpD;AAAA,EACF;AACF;AAEA,eAAe,sBAAsB,MAAA,EAAmC;AACtE,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,MAAM,CAAA;AAClC,IAAA,MAAM,UAAoB,EAAC;AAE3B,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA;AACpC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAA,CAAQ,KAAK,MAAA,CAAO,QAAA,CAAS,MAAM,CAAC,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,MAC5C;AAAA,IACF;AAEA,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAEA,SAAS,QAAQ,KAAA,EAAuB;AACtC,EAAA,OAAO,KAAA,CACJ,WAAA,EAAY,CACZ,OAAA,CAAQ,aAAA,EAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA,CACpB,KAAA,CAAM,GAAG,EAAE,CAAA;AAChB;AAYA,SAAS,mBAAmB,IAAA,EAA8B;AACxD,EAAA,OAAO,CAAA,MAAA,EAAS,IAAA,CAAK,MAAM,CAAA,EAAA,EAAK,KAAK,KAAK;;AAAA;;AAAA,EAI1C,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAC,CAAC;;AAAA;;AAAA,EAI1D,KAAK,IAAI;;AAAA;;AAAA,EAIT,IAAA,CAAK,WAAW,qDAAqD;;AAAA;;AAAA,EAIrE,IAAA,CAAK,YAAY,8CAA8C;;AAAA;;AAAA,EAI/D,IAAA,CAAK,gBAAgB,qDAAqD;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA,CAAA;AAkB5E;AAEA,SAAS,gBAAA,CAAiB,SAAiB,QAAA,EAA+B;AAExE,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,KAAA,CAAM,WAAW,CAAA;AAC9C,EAAA,MAAM,MAAA,GAAS,cAAc,MAAA,CAAO,QAAA,CAAS,YAAY,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA;AAGnE,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,KAAA,CAAM,0BAA0B,CAAA;AAC3D,EAAA,MAAM,KAAA,GAAQ,UAAA,GAAa,UAAA,CAAW,CAAC,CAAA,CAAE,MAAK,GAAI,QAAA,CAAS,OAAA,CAAQ,gBAAA,EAAkB,EAAE,CAAA;AAGvF,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,KAAA,CAAM,yBAAyB,CAAA;AAC3D,EAAA,MAAM,YAAY,WAAA,GAAc,WAAA,CAAY,CAAC,CAAA,CAAE,aAAY,GAAI,UAAA;AAC/D,EAAA,MAAM,MAAA,GACJ,cAAc,UAAA,IACd,SAAA,KAAc,gBACd,SAAA,KAAc,YAAA,IACd,SAAA,KAAc,UAAA,GACV,SAAA,GACA,UAAA;AAGN,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,CAAM,qCAAqC,CAAA;AACrE,EAAA,MAAM,IAAA,GAAO,SAAA,GAAY,SAAA,CAAU,CAAC,CAAA,GAAA,iBAAI,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY,CAAE,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAG7E,EAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,KAAA,CAAM,qCAAqC,CAAA;AAC3E,EAAA,MAAM,iBAAA,GAAoB,OAAA,CAAQ,KAAA,CAAM,0CAA0C,CAAA;AAElF,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,KAAA;AAAA,IACA,MAAA;AAAA,IACA,IAAA;AAAA,IACA,UAAA,EAAY,kBAAkB,MAAA,CAAO,QAAA,CAAS,gBAAgB,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,MAAA;AAAA,IACxE,YAAA,EAAc,oBAAoB,MAAA,CAAO,QAAA,CAAS,kBAAkB,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI;AAAA,GAChF;AACF;AAQA,eAAe,oBAAA,CACb,GAAA,EACA,MAAA,EACA,IAAA,EACgC;AAChC,EAAA,IAAI;AAEF,IAAA,IAAI,WAAA,GAAc,EAAA;AAClB,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAME,QAAAA,CAAS,GAAA,CAAI,MAAM,OAAO,CAAA;AAChD,QAAA,WAAA,IAAe;;AAAA;;AAAA,OAAA,EAAqB,GAAA,CAAI,MAAM,CAAA,EAAA,EAAK,GAAA,CAAI,KAAK;;AAAA,EAAO,OAAO,CAAA,CAAA;AAAA,MAC5E,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,CAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;;AAAA,EAqBjB,WAAW;;AAAA;;AAAA,wFAAA,CAAA;AAMT,IAAA,MAAM,YAAA,GAAe,MAAM,GAAA,CAAI,MAAA,CAAO,QAAQ,MAAA,CAAO;AAAA,MACnD,IAAA,EAAM;AAAA,QACJ,KAAA,EAAO;AAAA;AACT,KACD,CAAA;AAED,IAAA,IAAI,CAAC,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI;AAC1B,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,oCAAA,EAAqC;AAAA,IACvE;AAEA,IAAA,MAAM,SAAA,GAAY,aAAa,IAAA,CAAK,EAAA;AACpC,IAAA,uBAAA,CAAwB,WAAW,cAAc,CAAA;AAEjD,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,gBAAA;AAAA,QAClB,MAAA,CAAO,OAAO,MAAA,IAAU;AAAA,OAC1B;AAEA,MAAA,MAAM,YAAA,GAAe,MAAM,GAAA,CAAI,MAAA,CAAO,QAAQ,MAAA,CAAO;AAAA,QACnD,IAAA,EAAM,EAAE,EAAA,EAAI,SAAA,EAAU;AAAA,QACtB,IAAA,EAAM;AAAA,UACJ,KAAA,EAAO,WAAA;AAAA,UACP,OAAO,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,QAAQ;AAAA;AACxC,OACD,CAAA;AAED,MAAA,IAAI,CAAC,aAAa,IAAA,EAAM;AACtB,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,kCAAA,EAAmC;AAAA,MACrE;AAEA,MAAA,MAAM,cAAA,GAAiB,MAAM,GAAA,CAAI,MAAA,CAAO,QAAQ,QAAA,CAAS;AAAA,QACvD,IAAA,EAAM,EAAE,EAAA,EAAI,SAAA;AAAU,OACvB,CAAA;AAED,MAAA,MAAM,WAAA,GAAc,cAAA,CAAe,IAAA,EAAM,EAAA,CAAG,CAAA,CAAE,CAAA;AAC9C,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,kCAAA,EAAmC;AAAA,MACrE;AAEA,MAAA,MAAM,SAAA,GAAY,WAAA,CAAY,KAAA,EAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,MAAM,CAAA,IAAK,EAAC;AAC1E,MAAA,MAAM,OAAA,GAAU,UAAU,GAAA,CAAI,CAAC,MAAO,CAAA,CAAuB,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAE5E,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,OAAA,EAAQ;AAAA,IAClC,CAAA,SAAE;AACA,MAAA,yBAAA,CAA0B,SAAS,CAAA;AAAA,IACrC;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,CAAA,kBAAA,EAAqB,OAAO,CAAA,CAAA,EAAG;AAAA,EACjE;AACF;AAEA,SAAS,iBAAiB,WAAA,EAA8D;AACtF,EAAA,MAAM,CAAC,UAAA,EAAY,OAAO,CAAA,GAAI,WAAA,CAAY,MAAM,GAAG,CAAA;AACnD,EAAA,OAAO,EAAE,UAAA,EAAY,UAAA,IAAc,WAAA,EAAa,OAAA,EAAS,WAAW,WAAA,EAAY;AAClF;;;ACzgBA,IAAMJ,KAAAA,GAAM,mBAAmB,kBAAkB,CAAA;AAKjD,IAAM,kBAAA,uBAAyB,GAAA,EAA6B;AAK5D,SAAS,qBAAqB,KAAA,EAAuB;AACnD,EAAA,MAAM,SAAA,GAAA,qBAAgB,IAAA,EAAK,EAAE,aAAY,CAAE,OAAA,CAAQ,SAAS,GAAG,CAAA;AAC/D,EAAA,OAAO,CAAA,EAAG,KAAK,CAAA,YAAA,EAAe,SAAS,CAAA,CAAA;AACzC;AAKO,SAAS,uBAAuB,IAAA,EAA0C;AAC/E,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,WAAA;AAAA,IAEN,MAAM,QAAA,CAAS,GAAA,EAAa,OAAA,EAAiB,IAAA,EAA0C;AAErF,MAAAA,KAAAA,CAAI,MAAM,4CAAA,EAA8C;AAAA,QACtD,GAAA;AAAA,QACA,eAAe,OAAA,CAAQ,MAAA;AAAA,QACvB;AAAA,OACD,CAAA;AAED,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,GAAA;AAAA,QACA,MAAA,EAAQ;AAAA;AAAA,OACV;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,MAAA,CACJ,KAAA,EACA,OAAA,EAKuB;AAEvB,MAAAA,KAAAA,CAAI,MAAM,0CAAA,EAA4C;AAAA,QACpD,KAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,UAAU,EAAC;AAAA,QACX,KAAA,EAAO,CAAA;AAAA,QACP;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,iBACJ,UAAA,EAC2B;AAC3B,MAAA,MAAM,EAAA,GAAK,oBAAA,CAAqB,UAAA,CAAW,KAAK,CAAA;AAChD,MAAA,MAAM,cAAA,GAAkC;AAAA,QACtC,GAAG,UAAA;AAAA,QACH,EAAA;AAAA,QACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,OACpC;AAEA,MAAA,kBAAA,CAAmB,GAAA,CAAI,IAAI,cAAc,CAAA;AAEzC,MAAAA,KAAAA,CAAI,KAAK,oBAAA,EAAsB;AAAA,QAC7B,EAAA;AAAA,QACA,OAAO,UAAA,CAAW,KAAA;AAAA,QAClB,MAAM,UAAA,CAAW;AAAA,OAClB,CAAA;AAED,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,YAAA,EAAc,EAAA;AAAA,QACd,UAAA,EAAY;AAAA,OACd;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,eAAe,YAAA,EAAiD;AACpE,MAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,GAAA,CAAI,YAAY,CAAA;AAEtD,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAAA,KAAAA,CAAI,IAAA,CAAK,sBAAA,EAAwB,EAAE,cAAc,CAAA;AACjD,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,yBAAyB,YAAY,CAAA,CAAA;AAAA,UAC5C,UAAA,EACE;AAAA,SAEJ;AAAA,MACF;AAEA,MAAAA,KAAAA,CAAI,KAAK,mBAAA,EAAqB;AAAA,QAC5B,EAAA,EAAI,YAAA;AAAA,QACJ,OAAO,UAAA,CAAW;AAAA,OACnB,CAAA;AAED,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,YAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,iBAAiB,YAAA,EAAqE;AAC1F,MAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,MAAA,CAAO,YAAY,CAAA;AAEtD,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAAA,KAAAA,CAAI,KAAA,CAAM,mCAAA,EAAqC,EAAE,cAAc,CAAA;AAAA,MACjE,CAAA,MAAO;AACL,QAAAA,KAAAA,CAAI,IAAA,CAAK,oBAAA,EAAsB,EAAE,cAAc,CAAA;AAAA,MACjD;AAEA,MAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,IACzB;AAAA,GACF;AACF;;;ACxHA,IAAMA,KAAAA,GAAM,mBAAmB,gBAAgB,CAAA;AAK/C,SAASK,kBAAiB,WAAA,EAA8D;AACtF,EAAA,MAAM,CAAC,UAAA,EAAY,OAAO,CAAA,GAAI,WAAA,CAAY,MAAM,GAAG,CAAA;AACnD,EAAA,OAAO,EAAE,UAAA,EAAY,UAAA,IAAc,WAAA,EAAa,OAAA,EAAS,WAAW,WAAA,EAAY;AAClF;AAKO,SAAS,qBAAqB,GAAA,EAAyC;AAC5E,EAAA,MAAM,EAAE,GAAA,EAAK,MAAA,EAAO,GAAI,GAAA;AAGxB,EAAA,MAAM,QAAA,GAAW,uBAA0B,CAAA;AAK3C,EAAA,eAAe,kBAAA,CACb,KAAA,EACA,MAAA,EACA,aAAA,EACmB;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,GAAe,MAAM,GAAA,CAAI,MAAA,CAAO,QAAQ,MAAA,CAAO;AAAA,QACnD,IAAA,EAAM,EAAE,KAAA;AAAM,OACf,CAAA;AAED,MAAA,IAAI,CAAC,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI;AAC1B,QAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,MACpD;AAEA,MAAA,MAAM,SAAA,GAAY,aAAa,IAAA,CAAK,EAAA;AAEpC,MAAA,MAAM,WAAA,GAAcA,iBAAAA;AAAA,QAClB,MAAA,CAAO,OAAO,SAAA,IAAa;AAAA,OAC7B;AAEA,MAAA,MAAM,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO;AAAA,QAC9B,IAAA,EAAM,EAAE,EAAA,EAAI,SAAA,EAAU;AAAA,QACtB,IAAA,EAAM;AAAA,UACJ,KAAA,EAAO,WAAA;AAAA,UACP,OAAO,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,QAAQ;AAAA;AACxC,OACD,CAAA;AAED,MAAA,MAAM,cAAA,GAAiB,MAAM,GAAA,CAAI,MAAA,CAAO,QAAQ,QAAA,CAAS;AAAA,QACvD,IAAA,EAAM,EAAE,EAAA,EAAI,SAAA;AAAU,OACvB,CAAA;AAED,MAAA,MAAM,WAAA,GAAc,cAAA,CAAe,IAAA,EAAM,EAAA,CAAG,CAAA,CAAE,CAAA;AAC9C,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,MACpD;AAEA,MAAA,MAAM,SAAA,GAAY,WAAA,CAAY,KAAA,EAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,MAAM,CAAA,IAAK,EAAC;AAC1E,MAAA,MAAM,YAAA,GAAe,UAAU,GAAA,CAAI,CAAC,MAAO,CAAA,CAAuB,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAEjF,MAAA,OAAO,cAAc,YAAY,CAAA;AAAA,IACnC,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAAL,MAAI,IAAA,CAAK,wBAAA,EAA0B,EAAE,KAAA,EAAO,SAAS,CAAA;AACrD,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,SAAA;AAAA,IAEN,MAAM,QAAA,CAAS,GAAA,EAAa,OAAA,EAAiB,IAAA,EAA0C;AACrF,MAAA,MAAM,OAAA,GAAU,MAAM,MAAA,GAAS;AAAA,MAAA,EAAW,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GAAK,EAAA;AAC9D,MAAA,MAAM,MAAA,GAAS,CAAA;;AAAA,KAAA,EAEd,GAAG;AAAA,SAAA,EACC,OAAO,GAAG,OAAO;;AAAA;AAAA,SAAA,EAGjB,GAAG,CAAA;AAAA;AAAA;;AAAA,2CAAA,CAAA;AAMR,MAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,CAAmB,CAAA,UAAA,EAAa,GAAG,CAAA,CAAA,EAAI,MAAA,EAAQ,CAAC,QAAA,KAAa;AAEhF,QAAA,MAAM,UACJ,QAAA,CAAS,WAAA,EAAY,CAAE,QAAA,CAAS,QAAQ,CAAA,IACxC,QAAA,CAAS,WAAA,EAAY,CAAE,SAAS,SAAS,CAAA,IACzC,SAAS,WAAA,EAAY,CAAE,SAAS,SAAS,CAAA;AAC3C,QAAA,OAAO,EAAE,OAAA,EAAQ;AAAA,MACnB,CAAC,CAAA;AAED,MAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,QAAAA,KAAAA,CAAI,IAAA,CAAK,2BAAA,EAA6B,EAAE,KAAK,CAAA;AAC7C,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,GAAA;AAAA,UACA,MAAA,EAAQ;AAAA,SACV;AAAA,MACF;AAGA,MAAAA,KAAAA,CAAI,IAAA,CAAK,sCAAA,EAAwC,EAAE,KAAK,CAAA;AACxD,MAAA,OAAO,QAAA,CAAS,QAAA,CAAS,GAAA,EAAK,OAAA,EAAS,IAAI,CAAA;AAAA,IAC7C,CAAA;AAAA,IAEA,MAAM,MAAA,CACJ,KAAA,EACA,OAAA,EAKuB;AACvB,MAAA,MAAM,OAAA,GAAU,OAAA,EAAS,IAAA,EAAM,MAAA,GAAS;AAAA,gBAAA,EAAqB,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GAAK,EAAA;AACzF,MAAA,MAAM,QAAA,GAAW,SAAS,KAAA,GAAQ;AAAA,kBAAA,EAAuB,OAAA,CAAQ,KAAK,CAAA,CAAA,GAAK,EAAA;AAE3E,MAAA,MAAM,MAAA,GAAS,CAAA;;AAAA,OAAA,EAEZ,KAAK,CAAA,EAAG,OAAO,CAAA,EAAG,QAAQ;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAAA;AAe7B,MAAA,MAAM,SAAS,MAAM,kBAAA;AAAA,QACnB,WAAW,KAAK,CAAA,CAAA;AAAA,QAChB,MAAA;AAAA,QACA,CAAC,QAAA,KAAa;AACZ,UAAA,MAAM,SAAA,GAAY,QAAA,CAAS,KAAA,CAAM,8BAA8B,CAAA;AAC/D,UAAA,IAAI,SAAA,EAAW;AACb,YAAA,IAAI;AACF,cAAA,OAAO,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,YAChC,CAAA,CAAA,MAAQ;AACN,cAAA,OAAO,IAAA;AAAA,YACT;AAAA,UACF;AACA,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,OACF;AAEA,MAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,QAAAA,KAAAA,CAAI,KAAK,+BAAA,EAAiC;AAAA,UACxC,KAAA;AAAA,UACA,KAAA,EAAO,OAAO,QAAA,CAAS;AAAA,SACxB,CAAA;AACD,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,UAAU,MAAA,CAAO,QAAA;AAAA,UACjB,KAAA,EAAO,OAAO,QAAA,CAAS,MAAA;AAAA,UACvB;AAAA,SACF;AAAA,MACF;AAGA,MAAAA,KAAAA,CAAI,IAAA,CAAK,uCAAA,EAAyC,EAAE,OAAO,CAAA;AAC3D,MAAA,OAAO,QAAA,CAAS,MAAA,CAAO,KAAA,EAAO,OAAO,CAAA;AAAA,IACvC,CAAA;AAAA,IAEA,MAAM,iBACJ,UAAA,EAC2B;AAC3B,MAAA,MAAM,EAAA,GAAK,CAAA,EAAG,UAAA,CAAW,KAAK,CAAA,YAAA,EAAA,iBAAe,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY,CAAE,OAAA,CAAQ,OAAA,EAAS,GAAG,CAAC,CAAA,CAAA;AAC3F,MAAA,MAAM,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAEzC,MAAA,MAAM,YAAA,GAAe;AAAA,QACnB,CAAA,OAAA,EAAU,UAAA,CAAW,KAAK,CAAA,SAAA,EAAY,WAAW,IAAI,CAAA,CAAA;AAAA,QACrD,CAAA,UAAA,EAAa,WAAW,QAAQ,CAAA,CAAA;AAAA,QAChC,kBAAkB,UAAA,CAAW,YAAA,CAAa,IAAA,CAAK,IAAI,KAAK,MAAM,CAAA,CAAA;AAAA,QAC9D,eAAe,UAAA,CAAW,SAAA,CAAU,IAAA,CAAK,IAAI,KAAK,MAAM,CAAA,CAAA;AAAA,QACxD,CAAA,WAAA,EAAc,WAAW,QAAQ,CAAA,CAAA;AAAA,QACjC,CAAA,kBAAA,EAAqB,WAAW,eAAe,CAAA,CAAA;AAAA,QAC/C,CAAA,SAAA,EAAY,IAAA,CAAK,SAAA,CAAU,UAAA,CAAW,OAAO,CAAC,CAAA;AAAA,OAChD;AAEA,MAAA,MAAM,MAAA,GAAS,CAAA;;AAAA;AAAA,SAAA,EAGV,EAAE,CAAA;AAAA;AAAA;AAAA,EAGX,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,KAAA,EAAQ,CAAC,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC;;AAAA,mCAAA,CAAA;AAI5C,MAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,CAAmB,CAAA,YAAA,EAAe,EAAE,CAAA,CAAA,EAAI,MAAA,EAAQ,CAAC,QAAA,KAAa;AACjF,QAAA,MAAM,OAAA,GACJ,QAAA,CAAS,WAAA,EAAY,CAAE,QAAA,CAAS,SAAS,CAAA,IAAK,QAAA,CAAS,WAAA,EAAY,CAAE,QAAA,CAAS,SAAS,CAAA;AACzF,QAAA,OAAO,EAAE,OAAA,EAAQ;AAAA,MACnB,CAAC,CAAA;AAED,MAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,QAAAA,KAAAA,CAAI,KAAK,gCAAA,EAAkC,EAAE,IAAI,KAAA,EAAO,UAAA,CAAW,OAAO,CAAA;AAC1E,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,YAAA,EAAc,EAAA;AAAA,UACd,UAAA,EAAY,EAAE,GAAG,UAAA,EAAY,IAAI,SAAA;AAAU,SAC7C;AAAA,MACF;AAGA,MAAAA,KAAAA,CAAI,IAAA,CAAK,2CAAA,EAA6C,EAAE,IAAI,CAAA;AAC5D,MAAA,OAAO,QAAA,CAAS,iBAAiB,UAAU,CAAA;AAAA,IAC7C,CAAA;AAAA,IAEA,MAAM,eAAe,YAAA,EAAiD;AACpE,MAAA,MAAM,MAAA,GAAS,6DAA6D,YAAY,CAAA;;AAAA;AAAA;AAAA,SAAA,EAInF,YAAY,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAAA;AAYjB,MAAA,MAAM,SAAS,MAAM,kBAAA;AAAA,QACnB,oBAAoB,YAAY,CAAA,CAAA;AAAA,QAChC,MAAA;AAAA,QACA,CAAC,QAAA,KAAa;AACZ,UAAA,MAAM,SAAA,GAAY,QAAA,CAAS,KAAA,CAAM,sCAAsC,CAAA;AACvE,UAAA,IAAI,SAAA,EAAW;AACb,YAAA,IAAI;AACF,cAAA,OAAO,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,YAChC,CAAA,CAAA,MAAQ;AACN,cAAA,OAAO,IAAA;AAAA,YACT;AAAA,UACF;AACA,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,OACF;AAEA,MAAA,IAAI,MAAA,EAAQ;AACV,QAAAA,KAAAA,CAAI,IAAA,CAAK,+BAAA,EAAiC,EAAE,cAAc,CAAA;AAC1D,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,YAAA;AAAA,UACA,UAAA,EAAY;AAAA,SACd;AAAA,MACF;AAGA,MAAAA,KAAAA,CAAI,IAAA,CAAK,iDAAA,EAAmD,EAAE,cAAc,CAAA;AAC5E,MAAA,OAAO,QAAA,CAAS,eAAe,YAAY,CAAA;AAAA,IAC7C,CAAA;AAAA,IAEA,MAAM,iBAAiB,YAAA,EAAqE;AAG1F,MAAAA,KAAAA,CAAI,IAAA,CAAK,oCAAA,EAAsC,EAAE,cAAc,CAAA;AAC/D,MAAA,OAAO,QAAA,CAAS,iBAAiB,YAAY,CAAA;AAAA,IAC/C;AAAA,GACF;AACF;;;AClRA,IAAMA,KAAAA,GAAM,mBAAmB,QAAQ,CAAA;AAwBhC,SAAS,wBAAwB,MAAA,EAA6C;AACnF,EAAA,MAAM,WAAW,MAAA,CAAO,QAAA;AAGxB,EAAA,IAAI,QAAA,EAAU,YAAY,IAAA,EAAM;AAC9B,IAAA,OAAO,SAAA;AAAA,EACT;AAGA,EAAA,OAAO,WAAA;AACT;AASO,SAAS,mBAAA,CACd,GAAA,EACA,MAAA,EACA,YAAA,EACe;AACf,EAAA,MAAM,IAAA,GAAuB,uBAAA,CAAwB,MAAM,CAAA;AAE3D,EAAAA,KAAAA,CAAI,IAAA,CAAK,yBAAA,EAA2B,EAAE,MAAM,CAAA;AAE5C,EAAA,MAAM,aAAA,GAAqC,EAAQ,GAAA,EAAK,MAAA,EAAO;AAE/D,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,SAAA;AACH,MAAA,OAAO,qBAAqB,aAAa,CAAA;AAAA,IAC3C,KAAK,WAAA;AACH,MAAA,OAAO,uBAAoC,CAAA;AAAA,IAC7C,SAAS;AAEP,MAAA,MAAM,WAAA,GAAqB,IAAA;AAC3B,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,WAAW,CAAA,CAAE,CAAA;AAAA,IAC/D;AAAA;AAEJ;AAMA,IAAI,cAAA,GAAuC,IAAA;AAC3C,IAAI,oBAAA,GAAwE,IAAA;AAOrE,SAAS,gBAAA,CAAiB,KAAkB,MAAA,EAAmC;AAEpF,EAAA,IACE,CAAC,cAAA,IACD,oBAAA,EAAsB,QAAQ,GAAA,IAC9B,oBAAA,EAAsB,WAAW,MAAA,EACjC;AACA,IAAA,cAAA,GAAiB,mBAAA,CAAoB,KAAK,MAAM,CAAA;AAChD,IAAA,oBAAA,GAAuB,EAAE,KAAK,MAAA,EAAO;AAAA,EACvC;AAEA,EAAA,OAAO,cAAA;AACT;;;ACpFO,SAAS,0BAAA,CAA2B,KAAkB,MAAA,EAAoC;AAC/F,EAAA,OAAOM,IAAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wCAAA,CAAA;AAAA,IAeb,IAAA,EAAM;AAAA,MACJ,OAAOA,IAAAA,CAAK,MAAA,CAAO,MAAA,EAAO,CAAE,SAAS,+BAA+B,CAAA;AAAA,MACpE,MAAMA,IAAAA,CAAK,MAAA,CAAO,MAAA,EAAO,CAAE,SAAS,kBAAkB,CAAA;AAAA,MACtD,UAAUA,IAAAA,CAAK,MAAA,CAAO,MAAA,EAAO,CAAE,SAAS,kBAAkB,CAAA;AAAA,MAC1D,YAAA,EAAcA,IAAAA,CAAK,MAAA,CAAO,KAAA,CAAMA,IAAAA,CAAK,OAAO,MAAA,EAAQ,CAAA,CAAE,QAAA,CAAS,eAAe,CAAA;AAAA,MAC9E,SAAA,EAAWA,IAAAA,CAAK,MAAA,CAAO,KAAA,CAAMA,IAAAA,CAAK,OAAO,MAAA,EAAQ,CAAA,CAAE,QAAA,CAAS,YAAY,CAAA;AAAA,MACxE,UAAUA,IAAAA,CAAK,MAAA,CAAO,MAAA,EAAO,CAAE,SAAS,yBAAyB,CAAA;AAAA,MACjE,iBAAiBA,IAAAA,CAAK,MAAA,CAAO,MAAA,EAAO,CAAE,SAAS,2BAA2B,CAAA;AAAA,MAC1E,OAAA,EAASA,IAAAA,CAAK,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,sCAAsC;AAAA,KAC5F;AAAA,IAEA,MAAM,QAAQ,IAAA,EAAuB;AACnC,MAAA,MAAM,cAAA,GAAiB,IAAA;AACvB,MAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,GAAA,EAAK,MAAM,CAAA;AAE5C,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,gBAAA,CAAiB;AAAA,QAC5C,OAAO,cAAA,CAAe,KAAA;AAAA,QACtB,MAAM,cAAA,CAAe,IAAA;AAAA,QACrB,UAAU,cAAA,CAAe,QAAA;AAAA,QACzB,cAAc,cAAA,CAAe,YAAA;AAAA,QAC7B,WAAW,cAAA,CAAe,SAAA;AAAA,QAC1B,UAAU,cAAA,CAAe,QAAA;AAAA,QACzB,iBAAiB,cAAA,CAAe,eAAA;AAAA,QAChC,OAAA,EAAS,cAAA,CAAe,OAAA,IAAW;AAAC,OACrC,CAAA;AAED,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,IACvC;AAAA,GACD,CAAA;AACH;ACvDO,SAAS,0BAAA,CAA2B,KAAkB,MAAA,EAAoC;AAC/F,EAAA,OAAOA,IAAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;AAAA;AAAA,oBAAA,CAAA;AAAA,IAKb,IAAA,EAAM;AAAA,MACJ,cAAcA,IAAAA,CAAK,MAAA,CAAO,MAAA,EAAO,CAAE,SAAS,yBAAyB;AAAA,KACvE;AAAA,IAEA,MAAM,QAAQ,IAAA,EAAuB;AACnC,MAAA,MAAM,UAAA,GAAa,IAAA;AACnB,MAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,GAAA,EAAK,MAAM,CAAA;AAE5C,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,gBAAA,CAAiB,WAAW,YAAY,CAAA;AACrE,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,IACvC;AAAA,GACD,CAAA;AACH;AChBO,SAAS,wBAAA,CAAyB,KAAkB,MAAA,EAAoC;AAC7F,EAAA,OAAOA,IAAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;AAAA;AAAA,4DAAA,CAAA;AAAA,IAKb,IAAA,EAAM;AAAA,MACJ,cAAcA,IAAAA,CAAK,MAAA,CAAO,MAAA,EAAO,CAAE,SAAS,uBAAuB;AAAA,KACrE;AAAA,IAEA,MAAM,QAAQ,IAAA,EAAuB;AACnC,MAAA,MAAM,QAAA,GAAW,IAAA;AACjB,MAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,GAAA,EAAK,MAAM,CAAA;AAE5C,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,cAAA,CAAe,SAAS,YAAY,CAAA;AACjE,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,IACvC;AAAA,GACD,CAAA;AACH;ACjCA,SAAS,iBAAA,GAA4B;AACnC,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,GAAaC,OAAAA,CAAQ,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AAEzD,IAAA,MAAM,aAAA,GAAgB;AAAA,MACpBL,IAAAA,CAAK,UAAA,EAAY,IAAA,EAAM,IAAA,EAAM,cAAc,CAAA;AAAA,MAC3CA,IAAAA,CAAK,UAAA,EAAY,IAAA,EAAM,IAAA,EAAM,MAAM,cAAc;AAAA,KACnD;AAEA,IAAA,KAAA,MAAW,WAAW,aAAA,EAAe;AACnC,MAAA,IAAI,CAACC,UAAAA,CAAW,OAAO,CAAA,EAAG;AAE1B,MAAA,MAAM,OAAA,GAAUK,YAAAA,CAAa,OAAA,EAAS,OAAO,CAAA;AAC7C,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAC9B,MAAA,IAAI,GAAA,CAAI,OAAA,EAAS,OAAO,GAAA,CAAI,OAAA;AAAA,IAC9B;AAEA,IAAA,OAAO,OAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAiB,WAAA,EAAa;AAChC,MAAA,OAAA,CAAQ,MAAM,6DAA6D,CAAA;AAAA,IAC7E;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AACF;AAMO,IAAM,UAAU,iBAAA,EAAkB;AAoBlC,IAAM,YAAA,GAAe;AAAA;AAAA,EAE1B,eAAA,EAAiBN,IAAAA,CAAK,OAAA,EAAQ,EAAG,WAAW,UAAU,CAAA;AAAA;AAAA,EAGtD,kBAAkBA,IAAAA,CAAK,OAAA,EAAQ,EAAG,SAAA,EAAW,YAAY,WAAW,CAAA;AAAA;AAAA,EAGpE,sBAAsBA,IAAAA,CAAK,OAAA,EAAQ,EAAG,SAAA,EAAW,YAAY,eAAe,CAAA;AAAA;AAAA,EAG5E,iBAAiBA,IAAAA,CAAK,OAAA,EAAQ,EAAG,SAAA,EAAW,YAAY,qBAAqB,CAAA;AAAA;AAAA,EAG7E,aAAaA,IAAAA,CAAK,OAAA,EAAQ,EAAG,SAAA,EAAW,YAAY,SAAS,CAAA;AAAA;AAAA,EAG7D,WAAWA,IAAAA,CAAK,OAAA,EAAQ,EAAG,SAAA,EAAW,YAAY,QAAQ,CAAA;AAAA;AAAA,EAG1D,SAASA,IAAAA,CAAK,OAAA,EAAQ,EAAG,SAAA,EAAW,YAAY,MAAM,CAAA;AAAA;AAAA,EAGtD,YAAYA,IAAAA,CAAK,OAAA,IAAW,SAAA,EAAW,UAAA,EAAY,QAAQ,SAAS,CAAA;AAAA;AAAA,EAGpE,WAAWA,IAAAA,CAAK,OAAA,IAAW,SAAA,EAAW,UAAA,EAAY,QAAQ,iBAAiB,CAAA;AAAA;AAAA,EAG3E,iBAAiBA,IAAAA,CAAK,OAAA,EAAQ,EAAG,SAAA,EAAW,YAAY,iBAAiB;AAC3E,CAAA;AAaO,IAAM,QAAA,GAAW;AAAA;AAAA;AAAA;AAAA;AAAA,EAMtB,KAAA,EAAO;AAAA,IAGL,SAAS,CAAC,UAAA,EAAY,OAAA,EAAS,WAAA,EAAa,MAAM,OAAO;AAAA,GAC3D;AAAA,EAmEA;AAAA,EAGA,QAAA,EAAU;AAAA,IACR,gBAAA,EAAkB,KAAA;AAAA,IAClB,QAAA,EAAU,IAAA;AAAA,IACV,WAAA,EAAa,IAAA;AAAA,IACb,iBAAA,EAAmB,IAAA;AAAA,IACnB,OAAA,EAAS,KAAA;AAAA,IACT,aAAA,EAAe,IAAA;AAAA,IACf,QAAA,EAAU;AAAA,GACZ;AAAA;AAAA,EAGA,IAAA,EAAM;AAAA,IACJ,QAAA,EAAU,IAAA;AAAA,IACV,GAAA,EAAK,IAAA;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA;AAAA,EAGA,OAAA,EAAS;AAAA,IACP,eAAA,EAAiB;AAAA;AAErB,CAAA;;;ACtMA,IAAMF,KAAAA,GAAM,mBAAmB,kBAAkB,CAAA;AA+BjD,IAAM,qBAAA,GAAwB,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,iHAAA,CAAA;AA8B9B,SAAS,kBAAkB,IAAA,EAA6B;AACtD,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AACnC,EAAA,IAAI,UAAA,KAAe,IAAI,OAAO,IAAA;AAE9B,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,UAAA,GAAa,KAAA;AAEjB,EAAA,KAAA,IAAS,CAAA,GAAI,UAAA,EAAY,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AAC7C,IAAA,MAAM,IAAA,GAAO,KAAK,CAAC,CAAA;AAEnB,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,UAAA,GAAa,KAAA;AACb,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,UAAA,GAAa,IAAA;AACb,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,SAAS,GAAA,EAAK;AAChB,MAAA,QAAA,GAAW,CAAC,QAAA;AACZ,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,IAAI,SAAS,GAAA,EAAK,KAAA,EAAA;AAAA,WAAA,IACT,SAAS,GAAA,EAAK;AACrB,QAAA,KAAA,EAAA;AACA,QAAA,IAAI,UAAU,CAAA,EAAG;AACf,UAAA,OAAO,IAAA,CAAK,KAAA,CAAM,UAAA,EAAY,CAAA,GAAI,CAAC,CAAA;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAKA,SAAS,2BAAA,CACP,UACA,WAAA,EAC6C;AAC7C,EAAA,IAAI;AAEF,IAAA,MAAM,UAAA,GAAa,kBAAkB,QAAQ,CAAA;AAC7C,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAAA,IAC7C;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAGpC,IAAA,IAAI,CAAC,OAAO,aAAA,IAAiB,OAAO,OAAO,UAAA,KAAe,QAAA,IAAY,CAAC,MAAA,CAAO,MAAA,EAAQ;AACpF,MAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,IACvD;AAGA,IAAA,MAAM,UAAA,GAAmC;AAAA,MACvC,UAAA;AAAA,MACA,OAAA;AAAA,MACA,KAAA;AAAA,MACA,WAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,CAAC,UAAA,CAAW,QAAA,CAAS,MAAA,CAAO,aAAa,CAAA,EAAG;AAC9C,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,MAAA,CAAO,aAAa,CAAA,CAAE,CAAA;AAAA,IACzD;AAGA,IAAA,MAAM,UAAA,GAAa,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,UAAU,CAAC,CAAA;AAE7D,IAAA,OAAO;AAAA,MACL,eAAe,MAAA,CAAO,aAAA;AAAA,MACtB,UAAA;AAAA,MACA,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf;AAAA,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAAA,MAAI,IAAA,CAAK,yCAAA,EAA2C,EAAE,QAAA,EAAU,OAAO,CAAA;AAEvE,IAAA,OAAO;AAAA,MACL,aAAA,EAAe,WAAA;AAAA,MACf,UAAA,EAAY,CAAA;AAAA,MACZ,MAAA,EAAQ,iDAAA;AAAA,MACR,WAAA;AAAA,MACA,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,KAClD;AAAA,EACF;AACF;AAKA,SAAS,mBAAmB,MAAA,EAA6D;AACvF,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,OAAA,EAAS,eAAA,IAAmB,SAAS,OAAA,CAAQ,eAAA;AACxE,EAAA,MAAM,CAAC,UAAA,EAAY,OAAO,CAAA,GAAI,WAAA,CAAY,MAAM,GAAG,CAAA;AACnD,EAAA,OAAO,EAAE,UAAA,EAAY,UAAA,IAAc,WAAA,EAAa,OAAA,EAAS,WAAW,WAAA,EAAY;AAClF;AAKO,SAAS,yBAAA,CAA0B,KAAkB,MAAA,EAAoC;AAC9F,EAAA,OAAOM,IAAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,0EAAA,CAAA;AAAA,IAab,IAAA,EAAM;AAAA,MACJ,SAASA,IAAAA,CAAK,MAAA,CAAO,MAAA,EAAO,CAAE,SAAS,qCAAqC,CAAA;AAAA,MAC5E,WAAA,EAAaA,IAAAA,CAAK,MAAA,CACf,IAAA,CAAK,CAAC,UAAA,EAAY,OAAA,EAAS,WAAA,EAAa,IAAA,EAAM,OAAO,CAAC,CAAA,CACtD,SAAS,uBAAuB;AAAA,KACrC;AAAA,IAEA,MAAM,QAAQ,IAAA,EAAuB;AACnC,MAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB,GAAA,EAAK,QAAQ,IAAA,CAAK,OAAA,EAAS,KAAK,WAAuB,CAAA;AAC5F,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,IACvC;AAAA,GACD,CAAA;AACH;AAKA,eAAe,sBAAA,CACb,GAAA,EACA,MAAA,EACA,MAAA,EACiE;AACjE,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,mBAAmB,MAAM,CAAA;AAGvC,IAAA,MAAM,YAAA,GAAe,MAAM,GAAA,CAAI,MAAA,CAAO,QAAQ,MAAA,CAAO;AAAA,MACnD,IAAA,EAAM;AAAA,QACJ,KAAA,EAAO;AAAA;AACT,KACD,CAAA;AAED,IAAA,IAAI,CAAC,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI;AAC1B,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,qCAAA,EAAsC;AAAA,IACxE;AAEA,IAAA,MAAM,SAAA,GAAY,aAAa,IAAA,CAAK,EAAA;AAGpC,IAAA,MAAM,YAAA,GAAe,MAAM,GAAA,CAAI,MAAA,CAAO,QAAQ,MAAA,CAAO;AAAA,MACnD,IAAA,EAAM,EAAE,EAAA,EAAI,SAAA,EAAU;AAAA,MACtB,IAAA,EAAM;AAAA,QACJ,KAAA;AAAA,QACA,OAAO,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,QAAQ;AAAA;AACxC,KACD,CAAA;AAED,IAAA,IAAI,CAAC,aAAa,IAAA,EAAM;AACtB,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,6BAAA,EAA8B;AAAA,IAChE;AAGA,IAAA,MAAM,cAAA,GAAiB,MAAM,GAAA,CAAI,MAAA,CAAO,QAAQ,QAAA,CAAS;AAAA,MACvD,IAAA,EAAM,EAAE,EAAA,EAAI,SAAA;AAAU,KACvB,CAAA;AAED,IAAA,MAAM,WAAA,GAAc,cAAA,CAAe,IAAA,EAAM,EAAA,CAAG,CAAA,CAAE,CAAA;AAC9C,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,mCAAA,EAAoC;AAAA,IACtE;AAGA,IAAA,MAAM,SAAA,GAAY,WAAA,CAAY,KAAA,EAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,MAAM,CAAA,IAAK,EAAC;AAC1E,IAAA,MAAM,OAAA,GAAU,UAAU,GAAA,CAAI,CAAC,MAAO,CAAA,CAAuB,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAE5E,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,OAAA,EAAQ;AAAA,EAClC,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,CAAA,yBAAA,EAA4B,OAAO,CAAA,CAAA,EAAG;AAAA,EACxE;AACF;AAKA,eAAe,eAAA,CACb,GAAA,EACA,MAAA,EACA,OAAA,EACA,WAAA,EACgC;AAEhC,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,KAAA,EAAO,OAAA,IAAW,SAAS,KAAA,CAAM,OAAA;AAC7D,EAAA,IAAI,CAAC,YAAA,CAAa,QAAA,CAAS,WAAW,CAAA,EAAG;AACvC,IAAA,OAAO;AAAA,MACL,aAAA,EAAe,WAAA;AAAA,MACf,UAAA,EAAY,CAAA;AAAA,MACZ,MAAA,EAAQ,iBAAiB,WAAW,CAAA,yBAAA,CAAA;AAAA,MACpC,YAAA,EAAc,KAAA;AAAA,MACd,WAAA;AAAA,MACA,KAAA,EAAO,sBAAA;AAAA,MACP,UAAA,EAAY,CAAA,mBAAA,EAAsB,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KAC3D;AAAA,EACF;AAEA,EAAA,MAAM,eAAA,GAAkB,mBAAmB,MAAM,CAAA;AACjD,EAAAN,KAAAA,CAAI,MAAM,qBAAA,EAAuB,EAAE,aAAa,eAAA,EAAiB,aAAA,EAAe,OAAA,CAAQ,MAAA,EAAQ,CAAA;AAEhG,EAAA,IAAI;AAEF,IAAA,MAAM,MAAA,GAAS,GAAG,qBAAqB;;AAAA,cAAA,EAE3B,WAAW;AAAA,eAAA,EACV,OAAO,CAAA,CAAA,CAAA;AAGpB,IAAA,MAAM,QAAA,GAAW,MAAM,sBAAA,CAAuB,GAAA,EAAK,QAAQ,MAAM,CAAA;AAEjE,IAAA,IAAI,CAAC,QAAA,CAAS,OAAA,IAAW,CAAC,SAAS,OAAA,EAAS;AAC1C,MAAA,OAAO;AAAA,QACL,aAAA,EAAe,WAAA;AAAA,QACf,UAAA,EAAY,CAAA;AAAA,QACZ,MAAA,EAAQ,SAAS,KAAA,IAAS,6BAAA;AAAA,QAC1B,YAAA,EAAc,KAAA;AAAA,QACd,WAAA;AAAA,QACA,OAAO,QAAA,CAAS,KAAA;AAAA,QAChB,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,2BAAA,CAA4B,QAAA,CAAS,OAAA,EAAS,WAAW,CAAA;AAKxE,IAAA,IAAI,yBAAyB,MAAA,CAAO,aAAA;AAIpC,IAAA,IAAI,OAAO,aAAA,KAAkB,KAAA,IAAS,MAAA,CAAO,KAAA,EAAO,kBAAkB,KAAA,EAAO;AAC3E,MAAA,sBAAA,GAAyB,OAAA;AAAA,IAC3B;AAIA,IAAA,IAAI,OAAO,aAAA,KAAkB,KAAA,IAAS,MAAA,CAAO,KAAA,EAAO,kBAAkB,KAAA,EAAO;AAAA,IAG7E;AAEA,IAAA,MAAM,eACJ,MAAA,CAAO,UAAA,GAAa,GAAA,IACpB,sBAAA,KAA2B,eAC3B,sBAAA,KAA2B,KAAA;AAAA,IAC3B,YAAA,CAAa,SAAS,sBAAkC,CAAA;AAE1D,IAAAA,KAAAA,CAAI,KAAK,uBAAA,EAAyB;AAAA,MAChC,eAAe,MAAA,CAAO,aAAA;AAAA,MACtB,sBAAA;AAAA,MACA,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,YAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,OAAO;AAAA,MACL,GAAG,MAAA;AAAA,MACH,aAAA,EAAe,sBAAA;AAAA,MACf;AAAA,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAAA,KAAAA,CAAI,KAAA,CAAM,uBAAA,EAAyB,EAAE,OAAO,CAAA;AAE5C,IAAA,OAAO;AAAA,MACL,aAAA,EAAe,WAAA;AAAA,MACf,UAAA,EAAY,CAAA;AAAA,MACZ,MAAA,EAAQ,+BAAA;AAAA,MACR,YAAA,EAAc,KAAA;AAAA,MACd,WAAA;AAAA,MACA,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAAA,MAChD,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AACF;AC7VO,SAAS,iBAAiB,MAAA,EAAoC;AACnE,EAAA,OAAOM,IAAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAAA,CAAA;AAAA,IASb,IAAA,EAAM;AAAA,MACJ,SAASA,IAAAA,CAAK,MAAA,CACX,IAAA,CAAK,CAAC,OAAO,eAAA,EAAiB,QAAA,EAAU,MAAA,EAAQ,UAAA,EAAY,MAAM,CAAC,CAAA,CACnE,QAAA,EAAS,CACT,SAAS,yCAAyC;AAAA,KACvD;AAAA,IAEA,MAAM,QAAQ,IAAA,EAAuB;AACnC,MAAA,MAAM,OAAA,GAAU,KAAK,OAAA,IAAW,KAAA;AAEhC,MAAA,IAAI,YAAY,KAAA,EAAO;AACrB,QAAA,OAAO,IAAA,CAAK,SAAA;AAAA,UACV;AAAA,YACE,WAAA,EAAa,OAAA;AAAA,YACb,eAAe,MAAA,CAAO,OAAA;AAAA,YACtB,eAAe,MAAA,CAAO,aAAA;AAAA,YACtB,QAAQ,MAAA,CAAO,MAAA;AAAA,YACf,MAAM,MAAA,CAAO,IAAA;AAAA,YACb,UAAU,MAAA,CAAO,QAAA;AAAA,YACjB,MAAM,MAAA,CAAO;AAAA,WACf;AAAA,UACA,IAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAGA,MAAA,MAAM,WAAA,GAAuC;AAAA,QAC3C,eAAe,MAAA,CAAO,aAAA;AAAA,QACtB,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,MAAM,MAAA,CAAO;AAAA,OACf;AAEA,MAAA,OAAO,IAAA,CAAK,SAAA;AAAA,QACV;AAAA,UACE,OAAA;AAAA,UACA,IAAA,EAAM,WAAA,CAAY,OAAO,CAAA,IAAK;AAAA,SAChC;AAAA,QACA,IAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,GACD,CAAA;AACH;AC/CO,IAAM,uBAAA,GAA0BG,EAAE,MAAA,CAAO;AAAA,EAC9C,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,8BAA8B,CAAA;AAAA,EAC5D,OAAA,EAASA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,uCAAuC,CAAA;AAAA,EACxF,SAASA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,qCAAqC;AAC/E,CAAC,CAAA;AAKM,IAAM,iBAAA,GAAoBA,EAAE,MAAA,CAAO;AAAA,EACxC,MAAA,EAAQA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,gCAAgC,CAAA;AAAA,EAC5D,aAAA,EAAeA,EAAE,KAAA,CAAMA,CAAAA,CAAE,QAAQ,CAAA,CAAE,SAAS,qCAAqC,CAAA;AAAA,EACjF,YAAYA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,6BAA6B;AAC1E,CAAC,CAAA;AASM,IAAM,oBAAA,GAAuBA,EAAE,MAAA,CAAO;AAAA;AAAA,EAE3C,UAAUA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,wCAAwC,CAAA;AAAA,EACjF,UAAUA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,gCAAgC,CAAA;AAAA,EACzE,gBAAgBA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,0BAA0B,CAAA;AAAA,EACzE,kBAAA,EAAoBA,CAAAA,CACjB,IAAA,CAAK,CAAC,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAC,CAAA,CACzC,QAAA,CAAS,4BAA4B,CAAA;AAAA,EACxC,oBAAoBA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,yBAAyB,CAAA;AAAA;AAAA,EAG5E,iBAAA,EAAmB,wBAAwB,QAAA,EAAS;AAAA,EACpD,WAAA,EAAa,kBAAkB,QAAA,EAAS;AAAA;AAAA,EAGxC,aAAaA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,kCAAkC,CAAA;AAAA,EAC9E,WAAA,EAAaA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,4BAA4B;AACnF,CAAC,CAAA;AAKM,IAAM,sBAAA,GAAyBA,EAAE,MAAA,CAAO;AAAA;AAAA,EAE7C,mBAAA,EAAqBA,CAAAA,CAClB,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAChB,QAAA,EAAS,CACT,QAAA,CAAS,2CAA2C,CAAA;AAAA,EACvD,UAAA,EAAYA,CAAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAC,CAAA,CAAE,QAAA,CAAS,yBAAyB,CAAA;AAAA,EAC3F,oBAAoBA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,yBAAyB,CAAA;AAAA;AAAA,EAG5E,iBAAA,EAAmB,wBAAwB,QAAA,EAAS;AAAA,EACpD,WAAA,EAAa,kBAAkB,QAAA,EAAS;AAAA,EACxC,oBAAA,EAAsBA,EACnB,MAAA,CAAO;AAAA,IACN,WAAA,EAAaA,EAAE,MAAA,EAAO;AAAA,IACtB,eAAeA,CAAAA,CAAE,KAAA,CAAMA,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,IAC5C,UAAA,EAAYA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,GACjC,EACA,QAAA,EAAS;AAAA;AAAA,EAGZ,aAAaA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,oCAAoC,CAAA;AAAA,EAChF,aAAaA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,8BAA8B;AAC5E,CAAC,CAAA;AAKM,IAAM,qBAAA,GAAwBA,EAAE,MAAA,CAAO;AAAA,EAC5C,IAAA,EAAMA,CAAAA,CACH,IAAA,CAAK,CAAC,qBAAA,EAAuB,eAAA,EAAiB,iBAAA,EAAmB,gBAAA,EAAkB,QAAQ,CAAC,CAAA,CAC5F,QAAA,CAAS,0BAA0B,CAAA;AAAA,EACtC,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,+CAA+C,CAAA;AAAA,EAC7E,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,uBAAuB,CAAA;AAAA,EACxD,UAAA,EAAYA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,0BAA0B;AAC5D,CAAC,CAAA;AAKM,IAAM,uBAAA,GAA0BA,EAAE,MAAA,CAAO;AAAA;AAAA,EAE9C,QAAA,EAAUA,EAAE,IAAA,CAAK,CAAC,YAAY,MAAM,CAAC,CAAA,CAAE,QAAA,CAAS,8BAA8B,CAAA;AAAA;AAAA,EAG9E,YAAA,EAAcA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,0BAA0B,CAAA;AAAA,EAChF,aAAA,EAAeA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,yBAAyB,CAAA;AAAA;AAAA,EAGhF,UAAA,EAAYA,EAAE,KAAA,CAAM,qBAAqB,EAAE,QAAA,EAAS,CAAE,SAAS,yBAAyB,CAAA;AAAA,EACxF,YAAYA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,kCAAkC,CAAA;AAAA;AAAA,EAG7E,kBAAA,EAAoBA,CAAAA,CACjB,IAAA,CAAK,CAAC,UAAA,EAAY,OAAA,EAAS,SAAS,CAAC,CAAA,CACrC,QAAA,EAAS,CACT,QAAA,CAAS,yBAAyB,CAAA;AAAA,EACrC,oBAAoBA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,0BAA0B,CAAA;AAAA;AAAA,EAG7E,iBAAA,EAAmB,wBAAwB,QAAA,EAAS;AAAA,EACpD,WAAA,EAAa,kBAAkB,QAAA,EAAS;AAAA;AAAA,EAGxC,aAAaA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,mCAAmC,CAAA;AAAA,EAC/E,eAAA,EAAiBA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,8BAA8B;AACzF,CAAC,CAAA;AASM,IAAM,WAAA,GAAcA,EAAE,MAAA,CAAO;AAAA,EAClC,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,YAAY,CAAA;AAAA,EACtC,IAAA,EAAMA,CAAAA,CAAE,IAAA,CAAK,CAAC,OAAA,EAAS,UAAU,MAAM,CAAC,CAAA,CAAE,QAAA,CAAS,eAAe,CAAA;AAAA,EAClE,KAAA,EAAOA,EAAE,KAAA,CAAMA,CAAAA,CAAE,QAAQ,CAAA,CAAE,SAAS,kCAAkC,CAAA;AAAA,EACtE,YAAA,EAAcA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,mCAAmC;AAC3F,CAAC,CAAA;AAKM,IAAM,aAAA,GAAgBA,EAAE,MAAA,CAAO;AAAA,EACpC,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,cAAc,CAAA;AAAA,EACxC,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,4BAA4B,CAAA;AAAA,EACzD,MAAA,EAAQA,EAAE,KAAA,CAAMA,CAAAA,CAAE,QAAQ,CAAA,CAAE,SAAS,iBAAiB,CAAA;AAAA,EACtD,OAAA,EAASA,EAAE,KAAA,CAAMA,CAAAA,CAAE,QAAQ,CAAA,CAAE,SAAS,4BAA4B;AACpE,CAAC,CAAA;AAKM,IAAM,0BAAA,GAA6BA,EAAE,MAAA,CAAO;AAAA;AAAA,EAEjD,UAAA,EAAYA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,oBAAoB,CAAA;AAAA,EACpD,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,0BAA0B,CAAA;AAAA;AAAA,EAGvD,QAAQA,CAAAA,CAAE,KAAA,CAAM,WAAW,CAAA,CAAE,SAAS,mBAAmB,CAAA;AAAA,EACzD,WAAWA,CAAAA,CAAE,KAAA,CAAM,aAAa,CAAA,CAAE,SAAS,0BAA0B,CAAA;AAAA,EACrE,UAAA,EAAYA,EACT,MAAA,CAAO;AAAA,IACN,IAAA,EAAMA,EAAE,KAAA,CAAMA,CAAAA,CAAE,QAAQ,CAAA,CAAE,SAAS,sBAAsB,CAAA;AAAA,IACzD,UAAA,EAAYA,EAAE,KAAA,CAAMA,CAAAA,CAAE,QAAQ,CAAA,CAAE,SAAS,+BAA+B,CAAA;AAAA,IACxE,QAAA,EAAUA,EAAE,KAAA,CAAMA,CAAAA,CAAE,QAAQ,CAAA,CAAE,SAAS,2BAA2B;AAAA,GACnE,EACA,QAAA,EAAS;AAAA,EACZ,QAAA,EAAUA,CAAAA,CAAE,MAAA,CAAOA,CAAAA,CAAE,MAAA,EAAO,EAAGA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,SAAS,2BAA2B,CAAA;AAAA,EAC1F,aAAA,EAAeA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,6BAA6B,CAAA;AAAA;AAAA,EAGpF,iBAAA,EAAmB,wBAAwB,QAAA,EAAS;AAAA;AAAA,EAGpD,UAAUA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,mCAAmC;AAC9E,CAAC,CAAA;AAKM,IAAM,mBAAA,GAAsBA,EAAE,MAAA,CAAO;AAAA,EAC1C,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,yBAAyB,CAAA;AAAA,EACnD,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,eAAe,CAAA;AAAA,EAChD,IAAA,EAAMA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,2BAA2B;AAC3E,CAAC,CAAA;AAKM,IAAM,qBAAA,GAAwBA,EAAE,MAAA,CAAO;AAAA,EAC5C,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,2BAA2B,CAAA;AAAA,EACrD,KAAA,EAAOA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,yBAAyB,CAAA;AAAA,EACpD,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,uBAAuB,CAAA;AAAA,EACxD,UAAA,EAAYA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,oBAAoB;AAC1E,CAAC,CAAA;AAKM,IAAM,kBAAA,GAAqBA,EAAE,MAAA,CAAO;AAAA,EACzC,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,WAAW,CAAA;AAAA,EACrC,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,iCAAiC,CAAA;AAAA,EAC9D,MAAA,EAAQA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,yBAAyB;AAC3E,CAAC,CAAA;AAKM,IAAM,yBAAA,GAA4BA,EAAE,MAAA,CAAO;AAAA,EAChD,YAAA,EAAcA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,sBAAsB,CAAA;AAAA,EACxD,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,iCAAiC,CAAA;AAAA;AAAA,EAGlE,UAAUA,CAAAA,CAAE,KAAA,CAAM,qBAAqB,CAAA,CAAE,SAAS,0BAA0B,CAAA;AAAA,EAC5E,QAAQA,CAAAA,CAAE,KAAA,CAAM,mBAAmB,CAAA,CAAE,SAAS,iBAAiB,CAAA;AAAA,EAC/D,OAAOA,CAAAA,CAAE,KAAA,CAAM,kBAAkB,CAAA,CAAE,SAAS,mBAAmB,CAAA;AAAA;AAAA,EAG/D,QAAQA,CAAAA,CACL,KAAA;AAAA,IACCA,EAAE,MAAA,CAAO;AAAA,MACP,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,MACf,OAAA,EAASA,EAAE,MAAA,EAAO;AAAA,MAClB,MAAA,EAAQA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,QAAQ,CAAA;AAAA,MAC1B,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,KAC3B;AAAA,GACH,CACC,QAAA,EAAS,CACT,QAAA,CAAS,oCAAoC,CAAA;AAAA;AAAA,EAGhD,iBAAA,EAAmB,wBAAwB,QAAA,EAAS;AAAA;AAAA,EAGpD,UAAUA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,mCAAmC;AAC9E,CAAC,CAAA;AAKM,IAAM,iBAAA,GAAoBA,EAAE,MAAA,CAAO;AAAA,EACxC,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,eAAe,CAAA;AAAA,EACzC,KAAA,EAAOA,EAAE,KAAA,CAAMA,CAAAA,CAAE,QAAQ,CAAA,CAAE,SAAS,eAAe,CAAA;AAAA,EACnD,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,gBAAgB,CAAA;AAAA,EAC1C,QAAA,EAAUA,EAAE,KAAA,CAAMA,CAAAA,CAAE,QAAQ,CAAA,CAAE,SAAS,0BAA0B,CAAA;AAAA,EACjE,UAAUA,CAAAA,CACP,KAAA,CAAMA,CAAAA,CAAE,MAAA,CAAOA,EAAE,MAAA,EAAO,EAAGA,CAAAA,CAAE,MAAA,EAAQ,CAAC,CAAA,CACtC,QAAA,EAAS,CACT,SAAS,mCAAmC;AACjD,CAAC,CAAA;AAKM,IAAM,oBAAA,GAAuBA,EAAE,MAAA,CAAO;AAAA,EAC3C,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,yBAAyB,CAAA;AAAA,EAC1D,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,qBAAqB,CAAA;AAAA,EACtD,WAAWA,CAAAA,CAAE,KAAA,CAAM,iBAAiB,CAAA,CAAE,SAAS,eAAe,CAAA;AAAA;AAAA,EAG9D,qBAAA,EAAuBA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,iCAAiC,CAAA;AAAA;AAAA,EAGhG,iBAAA,EAAmB,wBAAwB,QAAA,EAAS;AAAA;AAAA,EAGpD,UAAUA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,kCAAkC;AAC7E,CAAC,CAAA;AAKM,IAAM,0BAAA,GAA6BA,EAAE,MAAA,CAAO;AAAA,EACjD,QAAA,EAAUA,CAAAA,CAAE,IAAA,CAAK,CAAC,OAAA,EAAS,WAAW,MAAM,CAAC,CAAA,CAAE,QAAA,CAAS,gBAAgB,CAAA;AAAA,EACxE,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,2BAA2B,CAAA;AAAA,EACzD,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,0BAA0B,CAAA;AAAA,EACvD,YAAYA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,YAAY;AACzD,CAAC,CAAA;AAKyCA,EAAE,MAAA,CAAO;AAAA,EACjD,KAAA,EAAOA,CAAAA,CAAE,OAAA,EAAQ,CAAE,SAAS,oCAAoC,CAAA;AAAA,EAChE,QAAQA,CAAAA,CAAE,KAAA,CAAM,0BAA0B,CAAA,CAAE,SAAS,cAAc,CAAA;AAAA,EACnE,QAAA,EAAUA,EACP,MAAA,CAAO;AAAA,IACN,eAAA,EAAiBA,EAAE,MAAA,EAAO;AAAA,IAC1B,aAAA,EAAeA,EAAE,MAAA,EAAO;AAAA,IACxB,YAAA,EAAcA,EAAE,MAAA;AAAO,GACxB,CAAA,CACA,QAAA,EAAS,CACT,SAAS,kBAAkB,CAAA;AAAA;AAAA,EAG9B,iBAAA,EAAmB,wBAAwB,QAAA,EAAS;AAAA;AAAA,EAGpD,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,4BAA4B;AAC3D,CAAC;AASM,IAAM,mBAAA,GAAsBA,EAAE,MAAA,CAAO;AAAA,EAC1C,QAAA,EAAUA,CAAAA,CAAE,IAAA,CAAK,CAAC,UAAA,EAAY,OAAA,EAAS,OAAA,EAAS,YAAY,CAAC,CAAA,CAAE,QAAA,CAAS,kBAAkB,CAAA;AAAA,EAC1F,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,qBAAqB,CAAA;AAAA,EACnD,UAAUA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,wBAAwB,CAAA;AAAA,EACjE,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,gBAAgB,CAAA;AAAA,EACjD,cAAA,EAAgBA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,qBAAqB;AAC3D,CAAC,CAAA;AAKM,IAAM,sBAAA,GAAyBA,EAAE,MAAA,CAAO;AAAA,EAC7C,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,sCAAsC,CAAA;AAAA,EACnE,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,mCAAmC,CAAA;AAAA,EAC7D,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,uBAAuB,CAAA;AAAA,EACxD,QAAA,EAAUA,EAAE,KAAA,CAAMA,CAAAA,CAAE,QAAQ,CAAA,CAAE,SAAS,0BAA0B,CAAA;AAAA,EACjE,eAAA,EAAiBA,EAAE,KAAA,CAAMA,CAAAA,CAAE,QAAQ,CAAA,CAAE,SAAS,iBAAiB;AACjE,CAAC,CAAA;AAKsCA,EAAE,MAAA,CAAO;AAAA,EAC9C,KAAA,EAAOA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,sBAAsB,CAAA;AAAA,EACjD,cAAcA,CAAAA,CAAE,KAAA,CAAM,sBAAsB,CAAA,CAAE,SAAS,gCAAgC,CAAA;AAAA,EACvF,SAAA,EAAWA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,mCAAmC,CAAA;AAAA,EAClE,SAAA,EAAWA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,qBAAqB,CAAA;AAAA,EACxE,QAAA,EAAUA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,wBAAwB,CAAA;AAAA,EAC1E,gBAAgBA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,oCAAoC,CAAA;AAAA;AAAA,EAGnF,iBAAA,EAAmB,wBAAwB,QAAA;AAC7C,CAAC;AAKsCA,EAAE,MAAA,CAAO;AAAA,EAC9C,UAAA,EAAYA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,4BAA4B,CAAA;AAAA,EAC5D,UAAUA,CAAAA,CAAE,KAAA,CAAM,mBAAmB,CAAA,CAAE,SAAS,iBAAiB,CAAA;AAAA,EACjE,wBAAA,EAA0BA,EACvB,MAAA,CAAO;AAAA,IACN,QAAA,EAAUA,EAAE,OAAA,EAAQ;AAAA,IACpB,SAASA,CAAAA,CAAE,KAAA,CAAMA,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,IACtC,SAASA,CAAAA,CAAE,KAAA,CAAMA,EAAE,MAAA,EAAQ,EAAE,QAAA;AAAS,GACvC,EACA,QAAA,EAAS;AAAA,EACZ,kBAAA,EAAoBA,EACjB,MAAA,CAAO;AAAA,IACN,WAAA,EAAaA,EAAE,OAAA,EAAQ;AAAA,IACvB,MAAA,EAAQA,EAAE,MAAA;AAAO,GAClB,EACA,QAAA,EAAS;AAAA,EACZ,gBAAgBA,CAAAA,CAAE,IAAA,CAAK,CAAC,SAAA,EAAW,iBAAA,EAAmB,kBAAkB,CAAC,CAAA;AAAA;AAAA,EAGzE,iBAAA,EAAmB,wBAAwB,QAAA;AAC7C,CAAC;AAKmCA,EAAE,MAAA,CAAO;AAAA,EAC3C,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,mBAAmB,CAAA;AAAA,EAChD,UAAUA,CAAAA,CAAE,KAAA,CAAM,mBAAmB,CAAA,CAAE,SAAS,sBAAsB,CAAA;AAAA,EACtE,YAAA,EAAcA,EACX,MAAA,CAAO;AAAA,IACN,QAAA,EAAUA,EAAE,OAAA,EAAQ;AAAA,IACpB,aAAaA,CAAAA,CAAE,KAAA,CAAMA,EAAE,MAAA,EAAQ,EAAE,QAAA;AAAS,GAC3C,EACA,QAAA,EAAS;AAAA,EACZ,YAAA,EAAcA,EACX,MAAA,CAAO;AAAA,IACN,QAAA,EAAUA,EAAE,OAAA,EAAQ;AAAA,IACpB,UAAUA,CAAAA,CAAE,KAAA,CAAMA,EAAE,MAAA,EAAQ,EAAE,QAAA;AAAS,GACxC,EACA,QAAA,EAAS;AAAA,EACZ,gBAAgBA,CAAAA,CAAE,IAAA,CAAK,CAAC,SAAA,EAAW,iBAAA,EAAmB,kBAAkB,CAAC,CAAA;AAAA,EACzE,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,wBAAwB,CAAA;AAAA;AAAA,EAGrD,iBAAA,EAAmB,wBAAwB,QAAA;AAC7C,CAAC;AASmCA,EAAE,MAAA,CAAO;AAAA,EAC3C,KAAA,EAAOA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,WAAW,CAAA;AAAA,EACtC,MAAA,EAAQA,EAAE,IAAA,CAAK,CAAC,YAAY,UAAA,EAAY,YAAA,EAAc,YAAY,CAAC,CAAA;AAAA,EACnE,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,6BAA6B,CAAA;AAAA,EAC1D,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,mBAAmB,CAAA;AAAA,EACjD,YAAA,EAAcA,EACX,MAAA,CAAO;AAAA,IACN,QAAA,EAAUA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,QAAQ,CAAA;AAAA,IAC5B,QAAA,EAAUA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,QAAQ,CAAA;AAAA,IAC5B,SAASA,CAAAA,CAAE,KAAA,CAAMA,EAAE,MAAA,EAAQ,EAAE,QAAA;AAAS,GACvC,CAAA,CACA,QAAA,CAAS,8BAA8B,CAAA;AAAA,EAC1C,cAAcA,CAAAA,CACX,KAAA;AAAA,IACCA,EAAE,MAAA,CAAO;AAAA,MACP,MAAA,EAAQA,EAAE,MAAA,EAAO;AAAA,MACjB,MAAA,EAAQA,EAAE,MAAA;AAAO,KAClB;AAAA,GACH,CACC,QAAA,EAAS,CACT,QAAA,CAAS,yBAAyB,CAAA;AAAA;AAAA,EAGrC,iBAAA,EAAmB,wBAAwB,QAAA,EAAS;AAAA;AAAA,EAGpD,UAAUA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,8BAA8B;AACzE,CAAC;AASsCA,EAAE,MAAA,CAAO;AAAA,EAC9C,aAAA,EAAeA,EAAE,KAAA,CAAMA,CAAAA,CAAE,QAAQ,CAAA,CAAE,SAAS,0BAA0B,CAAA;AAAA,EACtE,YAAA,EAAcA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,yBAAyB,CAAA;AAAA,EAC/E,YAAA,EAAcA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,yBAAyB,CAAA;AAAA,EAC/E,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,oBAAoB,CAAA;AAAA;AAAA,EAGjD,iBAAA,EAAmB,wBAAwB,QAAA;AAC7C,CAAC;ACjbkCA,CAAAA,CAAE,kBAAA,CAAmB,MAAA,EAAQ;AAAA;AAAA,EAE9DA,EAAE,MAAA,CAAO;AAAA,IACP,IAAA,EAAMA,CAAAA,CAAE,OAAA,CAAQ,YAAY,CAAA;AAAA,IAC5B,kBAAA,EAAoBA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,CAAS,6BAA6B,CAAA;AAAA,IACrF,aAAaA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,mCAAmC,CAAA;AAAA,IAC/E,aAAA,EAAeA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,iCAAiC;AAAA,GACzF,CAAA;AAAA;AAAA,EAGDA,EAAE,MAAA,CAAO;AAAA,IACP,IAAA,EAAMA,CAAAA,CAAE,OAAA,CAAQ,YAAY,CAAA;AAAA,IAC5B,YAAA,EAAcA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,mCAAmC,CAAA;AAAA,IACrE,kBAAA,EAAoBA,CAAAA,CAAE,OAAA,CAAQ,QAAQ,CAAA;AAAA,IACtC,eAAA,EAAiBA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,uCAAuC,CAAA;AAAA,IAC5E,YAAA,EAAcA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,mCAAmC;AAAA,GACtE,CAAA;AAAA;AAAA,EAGDA,EAAE,MAAA,CAAO;AAAA,IACP,IAAA,EAAMA,CAAAA,CAAE,OAAA,CAAQ,YAAY,CAAA;AAAA,IAC5B,UAAA,EAAYA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,4BAA4B,CAAA;AAAA,IAC5D,eAAA,EAAiBA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,+BAA+B;AAAA,GACrE;AACH,CAAC;AAKoCA,EAAE,MAAA,CAAO;AAAA,EAC5C,gBAAA,EAAkBA,EAAE,MAAA,CAAO;AAAA,IACzB,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,4BAA4B,CAAA;AAAA,IACtD,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,uBAAuB,CAAA;AAAA,IACrD,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,yBAAyB;AAAA,GACvD,CAAA;AAAA,EACD,iBAAA,EAAmBA,EAAE,MAAA,CAAO;AAAA,IAC1B,YAAA,EAAcA,EAAE,KAAA,CAAMA,CAAAA,CAAE,QAAQ,CAAA,CAAE,SAAS,6CAA6C,CAAA;AAAA,IACxF,QAAA,EAAUA,EAAE,MAAA,EAAO,CAAE,SAAS,4CAA4C,CAAA,CAAE,QAAQ,MAAM;AAAA,GAC3F,CAAA;AAAA,EACD,sBAAA,EAAwBA,CAAAA,CACrB,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAChB,QAAA,EAAS,CACT,QAAA,CAAS,iCAAiC;AAC/C,CAAC;AAKqCA,CAAAA,CAAE,kBAAA,CAAmB,MAAA,EAAQ;AAAA;AAAA,EAEjEA,EAAE,MAAA,CAAO;AAAA,IACP,IAAA,EAAMA,CAAAA,CAAE,OAAA,CAAQ,WAAW,CAAA;AAAA,IAC3B,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,mBAAmB,CAAA;AAAA,IAC7C,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,mBAAmB,CAAA;AAAA,IACjD,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,sBAAsB;AAAA,GACpD,CAAA;AAAA;AAAA,EAGDA,EAAE,MAAA,CAAO;AAAA,IACP,IAAA,EAAMA,CAAAA,CAAE,OAAA,CAAQ,aAAa,CAAA;AAAA,IAC7B,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,WAAW,CAAA;AAAA,IACrC,MAAA,EAAQA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,6BAA6B,CAAA;AAAA,IACzD,aAAA,EAAeA,EAAE,KAAA,CAAMA,CAAAA,CAAE,QAAQ,CAAA,CAAE,SAAS,+BAA+B;AAAA,GAC5E,CAAA;AAAA;AAAA,EAGDA,EAAE,MAAA,CAAO;AAAA,IACP,IAAA,EAAMA,CAAAA,CAAE,OAAA,CAAQ,WAAW,CAAA;AAAA,IAC3B,KAAA,EAAOA,EAAE,KAAA,CAAMA,CAAAA,CAAE,QAAQ,CAAA,CAAE,SAAS,iBAAiB,CAAA;AAAA,IACrD,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,gBAAgB;AAAA,GAClD;AACH,CAAC;AASwCA,EAAE,MAAA,CAAO;AAAA,EAChD,UAAA,EAAYA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,gCAAgC,CAAA;AAAA,EAChE,SAASA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,0CAA0C,CAAA;AAAA,EAClF,kBAAkBA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,sCAAsC;AACzF,CAAC;AAKuCA,EAAE,MAAA,CAAO;AAAA,EAC/C,YAAA,EAAcA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,gCAAgC,CAAA;AAAA,EAClE,cAAA,EAAgBA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,uCAAuC,CAAA;AAAA,EAC3E,gBAAA,EAAkBA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,+BAA+B,CAAA;AAAA,EACzF,WAAA,EAAaA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,mCAAmC;AAC1F,CAAC;AAKkCA,EAAE,MAAA,CAAO;AAAA,EAC1C,SAAA,EAAWA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,uCAAuC,CAAA;AAAA,EACtE,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,2CAA2C,CAAA;AAAA,EACzE,QAAA,EAAUA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,mBAAmB,CAAA;AAAA,EACrE,MAAA,EAAQA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,iBAAiB,CAAA;AAAA,EACjE,kBAAA,EAAoBA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,sBAAsB;AACpF,CAAC;AAKwCA,EAAE,MAAA,CAAO;AAAA,EAChD,KAAA,EAAOA,EAAE,IAAA,CAAK,CAAC,YAAY,MAAM,CAAC,CAAA,CAAE,QAAA,CAAS,kBAAkB,CAAA;AAAA,EAC/D,cAAcA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,+BAA+B,CAAA;AAAA,EAC5E,WAAWA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,qBAAqB;AACjE,CAAC;AASqCA,EAAE,MAAA,CAAO;AAAA,EAC7C,KAAA,EAAOA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,8BAA8B,CAAA;AAAA,EACzD,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,sBAAsB,CAAA;AAAA,EACvD,SAASA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,oBAAoB,CAAA;AAAA,EAC5D,OAAA,EAASA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,0BAA0B,CAAA;AAAA,EAC3E,QAAA,EAAUA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,8BAA8B;AAClF,CAAC;AAKqCA,EAAE,MAAA,CAAO;AAAA,EAC7C,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,qBAAqB,CAAA;AAAA,EACtD,UAAA,EAAYA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,aAAa,CAAA;AAAA,EAC7C,SAAA,EAAWA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,wBAAwB,CAAA;AAAA,EACvD,kBAAA,EAAoBA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,cAAc;AAC5E,CAAC;AAKkCA,EAAE,MAAA,CAAO;AAAA,EAC1C,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,WAAW,CAAA;AAAA,EACzC,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,UAAU,CAAA;AAAA,EACvC,MAAA,EAAQA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,gBAAgB,CAAA;AAAA,EAC5C,YAAA,EAAcA,EAAE,KAAA,CAAMA,CAAAA,CAAE,QAAQ,CAAA,CAAE,SAAS,uBAAuB,CAAA;AAAA,EAClE,MAAMA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,4BAA4B,CAAA;AAAA,EACjE,aAAaA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,qBAAqB;AACnE,CAAC;AASkCA,EAAE,MAAA,CAAO;AAAA,EAC1C,KAAA,EAAOA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,gBAAgB,CAAA;AAAA,EAC3C,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,oCAAoC,CAAA;AAAA,EACjE,SAASA,CAAAA,CACN,KAAA;AAAA,IACCA,EAAE,MAAA,CAAO;AAAA,MACP,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,MACf,WAAA,EAAaA,EAAE,MAAA;AAAO,KACvB;AAAA,GACH,CACC,QAAA,EAAS,CACT,QAAA,CAAS,0BAA0B,CAAA;AAAA,EACtC,WAAA,EAAaA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,mBAAmB,CAAA;AAAA,EACxE,YAAA,EAAcA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,0BAA0B;AAClF,CAAC;AASqCA,EAAE,MAAA,CAAO;AAAA,EAC7C,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,+BAA+B,CAAA;AAAA,EACzD,KAAA,EAAOA,EAAE,KAAA,CAAMA,CAAAA,CAAE,QAAQ,CAAA,CAAE,SAAS,iBAAiB,CAAA;AAAA,EACrD,YAAA,EAAcA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,yCAAyC;AAC7E,CAAC;;;AChMD,IAAMT,KAAAA,GAAM,mBAAmB,iBAAiB,CAAA;AA4PzC,SAAS,mBAAmB,OAAA,EAAwC;AACzE,EAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AAC3C,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,yBAAA;AAAA,MACP,aAAA,EAAe,CAAC,MAAM;AAAA,KACxB;AAAA,EACF;AAEA,EAAA,MAAM,GAAA,GAAM,OAAA;AAEZ,EAAA,IAAI,CAAC,GAAA,CAAI,IAAA,IAAQ,CAAC,CAAC,YAAA,EAAc,YAAA,EAAc,YAAY,CAAA,CAAE,QAAA,CAAS,GAAA,CAAI,IAAc,CAAA,EAAG;AACzF,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,gEAAA;AAAA,MACP,aAAA,EAAe,CAAC,MAAM;AAAA,KACxB;AAAA,EACF;AAEA,EAAA,QAAQ,IAAI,IAAA;AAAM,IAChB,KAAK,YAAA;AACH,MAAA,IAAI,CAAC,IAAI,kBAAA,IAAsB,CAAC,MAAM,OAAA,CAAQ,GAAA,CAAI,kBAAkB,CAAA,EAAG;AACrE,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO,8CAAA;AAAA,UACP,aAAA,EAAe,CAAC,oBAAoB;AAAA,SACtC;AAAA,MACF;AACA,MAAA;AAAA,IAEF,KAAK,YAAA;AACH,MAAA,IAAI,CAAC,GAAA,CAAI,YAAA,IAAgB,OAAO,GAAA,CAAI,iBAAiB,QAAA,EAAU;AAC7D,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO,kCAAA;AAAA,UACP,aAAA,EAAe,CAAC,cAAc;AAAA,SAChC;AAAA,MACF;AACA,MAAA,IAAI,GAAA,CAAI,uBAAuB,QAAA,EAAU;AACvC,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO,qDAAA;AAAA,UACP,aAAA,EAAe,CAAC,oBAAoB;AAAA,SACtC;AAAA,MACF;AACA,MAAA,IAAI,CAAC,GAAA,CAAI,YAAA,IAAgB,OAAO,GAAA,CAAI,iBAAiB,QAAA,EAAU;AAC7D,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO,kCAAA;AAAA,UACP,aAAA,EAAe,CAAC,cAAc;AAAA,SAChC;AAAA,MACF;AACA,MAAA;AAAA,IAEF,KAAK,YAAA;AACH,MAAA,IAAI,CAAC,GAAA,CAAI,UAAA,IAAc,OAAO,GAAA,CAAI,eAAe,QAAA,EAAU;AACzD,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO,gCAAA;AAAA,UACP,aAAA,EAAe,CAAC,YAAY;AAAA,SAC9B;AAAA,MACF;AACA,MAAA,IAAI,CAAC,GAAA,CAAI,eAAA,IAAmB,OAAO,GAAA,CAAI,oBAAoB,QAAA,EAAU;AACnE,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO,qCAAA;AAAA,UACP,aAAA,EAAe,CAAC,iBAAiB;AAAA,SACnC;AAAA,MACF;AACA,MAAA;AAAA;AAGJ,EAAAA,MAAI,KAAA,CAAM,uBAAA,EAAyB,EAAE,IAAA,EAAM,GAAA,CAAI,MAAM,CAAA;AACrD,EAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AACvB;AAKO,SAAS,sBAAsB,OAAA,EAAwC;AAC5E,EAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AAC3C,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,4BAAA;AAAA,MACP,aAAA,EAAe,CAAC,MAAM;AAAA,KACxB;AAAA,EACF;AAEA,EAAA,MAAM,GAAA,GAAM,OAAA;AAEZ,EAAA,IAAI,CAAC,GAAA,CAAI,IAAA,IAAQ,CAAC,CAAC,WAAA,EAAa,aAAA,EAAe,WAAW,CAAA,CAAE,QAAA,CAAS,GAAA,CAAI,IAAc,CAAA,EAAG;AACxF,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,kEAAA;AAAA,MACP,aAAA,EAAe,CAAC,MAAM;AAAA,KACxB;AAAA,EACF;AAEA,EAAA,QAAQ,IAAI,IAAA;AAAM,IAChB,KAAK,WAAA;AACH,MAAA,IAAI,CAAC,GAAA,CAAI,IAAA,IAAQ,OAAO,GAAA,CAAI,SAAS,QAAA,EAAU;AAC7C,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO,8BAAA;AAAA,UACP,aAAA,EAAe,CAAC,MAAM;AAAA,SACxB;AAAA,MACF;AACA,MAAA,IAAI,CAAC,GAAA,CAAI,OAAA,IAAW,OAAO,GAAA,CAAI,YAAY,QAAA,EAAU;AACnD,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO,oCAAA;AAAA,UACP,aAAA,EAAe,CAAC,SAAS;AAAA,SAC3B;AAAA,MACF;AACA,MAAA;AAAA,IAEF,KAAK,aAAA;AACH,MAAA,IAAI,CAAC,GAAA,CAAI,IAAA,IAAQ,OAAO,GAAA,CAAI,SAAS,QAAA,EAAU;AAC7C,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO,gCAAA;AAAA,UACP,aAAA,EAAe,CAAC,MAAM;AAAA,SACxB;AAAA,MACF;AACA,MAAA,IAAI,CAAC,GAAA,CAAI,MAAA,IAAU,OAAO,GAAA,CAAI,WAAW,QAAA,EAAU;AACjD,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO,6BAAA;AAAA,UACP,aAAA,EAAe,CAAC,QAAQ;AAAA,SAC1B;AAAA,MACF;AACA,MAAA,IAAI,CAAC,IAAI,aAAA,IAAiB,CAAC,MAAM,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA,EAAG;AAC3D,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO,0CAAA;AAAA,UACP,aAAA,EAAe,CAAC,eAAe;AAAA,SACjC;AAAA,MACF;AACA,MAAA;AAAA,IAEF,KAAK,WAAA;AACH,MAAA,IAAI,CAAC,IAAI,KAAA,IAAS,CAAC,MAAM,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,EAAG;AAC3C,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO,gCAAA;AAAA,UACP,aAAA,EAAe,CAAC,OAAO;AAAA,SACzB;AAAA,MACF;AACA,MAAA,IAAI,CAAC,GAAA,CAAI,WAAA,IAAe,OAAO,GAAA,CAAI,gBAAgB,QAAA,EAAU;AAC3D,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO,gCAAA;AAAA,UACP,aAAA,EAAe,CAAC,aAAa;AAAA,SAC/B;AAAA,MACF;AACA,MAAA;AAAA;AAGJ,EAAAA,MAAI,KAAA,CAAM,0BAAA,EAA4B,EAAE,IAAA,EAAM,GAAA,CAAI,MAAM,CAAA;AACxD,EAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AACvB;AAKO,SAAS,qBAAqB,OAAA,EAAwC;AAC3E,EAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AAC3C,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,2BAAA;AAAA,MACP,aAAA,EAAe,CAAC,kBAAA,EAAoB,mBAAmB;AAAA,KACzD;AAAA,EACF;AAEA,EAAA,MAAM,GAAA,GAAM,OAAA;AAGZ,EAAA,IAAI,CAAC,GAAA,CAAI,gBAAA,IAAoB,OAAO,GAAA,CAAI,qBAAqB,QAAA,EAAU;AACrE,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,8CAAA;AAAA,MACP,aAAA,EAAe,CAAC,kBAAkB;AAAA,KACpC;AAAA,EACF;AAEA,EAAA,MAAM,MAAM,GAAA,CAAI,gBAAA;AAChB,EAAA,IAAI,CAAC,GAAA,CAAI,IAAA,IAAQ,OAAO,GAAA,CAAI,SAAS,QAAA,EAAU;AAC7C,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,qCAAA;AAAA,MACP,aAAA,EAAe,CAAC,uBAAuB;AAAA,KACzC;AAAA,EACF;AACA,EAAA,IAAI,CAAC,GAAA,CAAI,OAAA,IAAW,OAAO,GAAA,CAAI,YAAY,QAAA,EAAU;AACnD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,2CAAA;AAAA,MACP,aAAA,EAAe,CAAC,0BAA0B;AAAA,KAC5C;AAAA,EACF;AAGA,EAAA,IAAI,CAAC,GAAA,CAAI,iBAAA,IAAqB,OAAO,GAAA,CAAI,sBAAsB,QAAA,EAAU;AACvE,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,+CAAA;AAAA,MACP,aAAA,EAAe,CAAC,mBAAmB;AAAA,KACrC;AAAA,EACF;AAEA,EAAA,MAAM,SAAS,GAAA,CAAI,iBAAA;AACnB,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,YAAY,CAAA,EAAG;AACvC,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,+CAAA;AAAA,MACP,aAAA,EAAe,CAAC,gCAAgC;AAAA,KAClD;AAAA,EACF;AACA,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,IAAY,OAAO,MAAA,CAAO,aAAa,QAAA,EAAU;AAC3D,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,4CAAA;AAAA,MACP,aAAA,EAAe,CAAC,4BAA4B;AAAA,KAC9C;AAAA,EACF;AAEA,EAAAA,KAAAA,CAAI,MAAM,yBAAyB,CAAA;AACnC,EAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AACvB;AAKO,SAAS,yBAAyB,OAAA,EAAwC;AAC/E,EAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AAC3C,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,+BAAA;AAAA,MACP,aAAA,EAAe,CAAC,MAAA,EAAQ,YAAY;AAAA,KACtC;AAAA,EACF;AAEA,EAAA,MAAM,GAAA,GAAM,OAAA;AAEZ,EAAA,IAAI,CAAC,GAAA,CAAI,IAAA,IAAQ,CAAC,CAAC,SAAA,EAAW,QAAQ,CAAA,CAAE,QAAA,CAAS,GAAA,CAAI,IAAc,CAAA,EAAG;AACpE,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,kDAAA;AAAA,MACP,aAAA,EAAe,CAAC,MAAM;AAAA,KACxB;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,GAAA,CAAI,UAAA,IAAc,OAAO,GAAA,CAAI,eAAe,QAAA,EAAU;AACzD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,uCAAA;AAAA,MACP,aAAA,EAAe,CAAC,YAAY;AAAA,KAC9B;AAAA,EACF;AAEA,EAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU;AACzB,IAAA,IAAI,CAAC,GAAA,CAAI,oBAAA,IAAwB,OAAO,GAAA,CAAI,yBAAyB,QAAA,EAAU;AAC7E,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,KAAA,EAAO,sCAAA;AAAA,QACP,aAAA,EAAe,CAAC,sBAAsB;AAAA,OACxC;AAAA,IACF;AACA,IAAA,IAAI,CAAC,GAAA,CAAI,eAAA,IAAmB,OAAO,GAAA,CAAI,oBAAoB,QAAA,EAAU;AACnE,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,KAAA,EAAO,iCAAA;AAAA,QACP,aAAA,EAAe,CAAC,iBAAiB;AAAA,OACnC;AAAA,IACF;AAAA,EACF;AAEA,EAAAA,MAAI,KAAA,CAAM,6BAAA,EAA+B,EAAE,IAAA,EAAM,GAAA,CAAI,MAAM,CAAA;AAC3D,EAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AACvB;AAKO,SAAS,wBAAwB,OAAA,EAAwC;AAC9E,EAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AAC3C,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,8BAAA;AAAA,MACP,aAAA,EAAe,CAAC,MAAA,EAAQ,cAAc;AAAA,KACxC;AAAA,EACF;AAEA,EAAA,MAAM,GAAA,GAAM,OAAA;AAEZ,EAAA,IAAI,CAAC,GAAA,CAAI,IAAA,IAAQ,CAAC,CAAC,KAAA,EAAO,QAAA,EAAU,WAAW,CAAA,CAAE,QAAA,CAAS,GAAA,CAAI,IAAc,CAAA,EAAG;AAC7E,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,yDAAA;AAAA,MACP,aAAA,EAAe,CAAC,MAAM;AAAA,KACxB;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,GAAA,CAAI,YAAA,IAAgB,OAAO,GAAA,CAAI,iBAAiB,QAAA,EAAU;AAC7D,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,wCAAA;AAAA,MACP,aAAA,EAAe,CAAC,cAAc;AAAA,KAChC;AAAA,EACF;AAEA,EAAA,QAAQ,IAAI,IAAA;AAAM,IAChB,KAAK,KAAA;AACH,MAAA,IAAI,CAAC,GAAA,CAAI,kBAAA,IAAsB,OAAO,GAAA,CAAI,uBAAuB,QAAA,EAAU;AACzE,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO,iCAAA;AAAA,UACP,aAAA,EAAe,CAAC,oBAAoB;AAAA,SACtC;AAAA,MACF;AACA,MAAA,IAAI,CAAC,GAAA,CAAI,kBAAA,IAAsB,OAAO,GAAA,CAAI,uBAAuB,QAAA,EAAU;AACzE,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO,iCAAA;AAAA,UACP,aAAA,EAAe,CAAC,oBAAoB;AAAA,SACtC;AAAA,MACF;AACA,MAAA;AAAA,IAEF,KAAK,QAAA;AACH,MAAA,IAAI,CAAC,GAAA,CAAI,oBAAA,IAAwB,OAAO,GAAA,CAAI,yBAAyB,QAAA,EAAU;AAC7E,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO,sCAAA;AAAA,UACP,aAAA,EAAe,CAAC,sBAAsB;AAAA,SACxC;AAAA,MACF;AACA,MAAA,IAAI,CAAC,GAAA,CAAI,eAAA,IAAmB,OAAO,GAAA,CAAI,oBAAoB,QAAA,EAAU;AACnE,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO,iCAAA;AAAA,UACP,aAAA,EAAe,CAAC,iBAAiB;AAAA,SACnC;AAAA,MACF;AACA,MAAA;AAAA,IAEF,KAAK,WAAA;AACH,MAAA,IAAI,CAAC,GAAA,CAAI,oBAAA,IAAwB,OAAO,GAAA,CAAI,yBAAyB,QAAA,EAAU;AAC7E,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO,yCAAA;AAAA,UACP,aAAA,EAAe,CAAC,sBAAsB;AAAA,SACxC;AAAA,MACF;AACA,MAAA,IAAI,CAAC,GAAA,CAAI,gBAAA,IAAoB,OAAO,GAAA,CAAI,qBAAqB,QAAA,EAAU;AACrE,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO,qCAAA;AAAA,UACP,aAAA,EAAe,CAAC,kBAAkB;AAAA,SACpC;AAAA,MACF;AACA,MAAA;AAAA;AAGJ,EAAAA,MAAI,KAAA,CAAM,4BAAA,EAA8B,EAAE,IAAA,EAAM,GAAA,CAAI,MAAM,CAAA;AAC1D,EAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AACvB;AAKO,SAAS,mBAAmB,OAAA,EAAwC;AACzE,EAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AAC3C,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,yBAAA;AAAA,MACP,aAAA,EAAe,CAAC,MAAA,EAAQ,cAAA,EAAgB,cAAc;AAAA,KACxD;AAAA,EACF;AAEA,EAAA,MAAM,GAAA,GAAM,OAAA;AAEZ,EAAA,IACE,CAAC,GAAA,CAAI,IAAA,IACL,CAAC,CAAC,YAAA,EAAc,cAAA,EAAgB,iBAAiB,CAAA,CAAE,QAAA,CAAS,GAAA,CAAI,IAAc,CAAA,EAC9E;AACA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,uEAAA;AAAA,MACP,aAAA,EAAe,CAAC,MAAM;AAAA,KACxB;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,GAAA,CAAI,YAAA,IAAgB,OAAO,GAAA,CAAI,iBAAiB,QAAA,EAAU;AAC7D,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,mCAAA;AAAA,MACP,aAAA,EAAe,CAAC,cAAc;AAAA,KAChC;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,GAAA,CAAI,YAAA,IAAgB,OAAO,GAAA,CAAI,iBAAiB,QAAA,EAAU;AAC7D,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,mCAAA;AAAA,MACP,aAAA,EAAe,CAAC,cAAc;AAAA,KAChC;AAAA,EACF;AAEA,EAAA,QAAQ,IAAI,IAAA;AAAM,IAChB,KAAK,YAAA;AACH,MAAA,IAAI,CAAC,GAAA,CAAI,SAAA,IAAa,OAAO,GAAA,CAAI,cAAc,QAAA,EAAU;AACvD,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO,+BAAA;AAAA,UACP,aAAA,EAAe,CAAC,WAAW;AAAA,SAC7B;AAAA,MACF;AACA,MAAA;AAAA,IAEF,KAAK,cAAA;AACH,MAAA,IAAI,CAAC,GAAA,CAAI,WAAA,IAAe,OAAO,GAAA,CAAI,gBAAgB,QAAA,EAAU;AAC3D,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO,mCAAA;AAAA,UACP,aAAA,EAAe,CAAC,aAAa;AAAA,SAC/B;AAAA,MACF;AACA,MAAA;AAAA,IAEF,KAAK,iBAAA;AACH,MAAA,IAAI,CAAC,GAAA,CAAI,YAAA,IAAgB,OAAO,GAAA,CAAI,iBAAiB,QAAA,EAAU;AAC7D,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO,uCAAA;AAAA,UACP,aAAA,EAAe,CAAC,cAAc;AAAA,SAChC;AAAA,MACF;AACA,MAAA;AAAA;AAGJ,EAAAA,MAAI,KAAA,CAAM,uBAAA,EAAyB,EAAE,IAAA,EAAM,GAAA,CAAI,MAAM,CAAA;AACrD,EAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AACvB;AAKO,SAAS,8BAA8B,OAAA,EAAwC;AACpF,EAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AAC3C,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,qCAAA;AAAA,MACP,aAAA,EAAe,CAAC,MAAM;AAAA,KACxB;AAAA,EACF;AAEA,EAAA,MAAM,GAAA,GAAM,OAAA;AAEZ,EAAA,IAAI,CAAC,GAAA,CAAI,IAAA,IAAQ,CAAC,CAAC,MAAA,EAAQ,UAAA,EAAY,WAAW,CAAA,CAAE,QAAA,CAAS,GAAA,CAAI,IAAc,CAAA,EAAG;AAChF,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,mEAAA;AAAA,MACP,aAAA,EAAe,CAAC,MAAM;AAAA,KACxB;AAAA,EACF;AAEA,EAAA,QAAQ,IAAI,IAAA;AAAM,IAChB,KAAK,MAAA;AACH,MAAA,IAAI,CAAC,GAAA,CAAI,cAAA,IAAkB,OAAO,GAAA,CAAI,mBAAmB,QAAA,EAAU;AACjE,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO,8BAAA;AAAA,UACP,aAAA,EAAe,CAAC,gBAAgB;AAAA,SAClC;AAAA,MACF;AACA,MAAA;AAAA,IAEF,KAAK,UAAA;AACH,MAAA,IAAI,CAAC,GAAA,CAAI,YAAA,IAAgB,OAAO,GAAA,CAAI,iBAAiB,QAAA,EAAU;AAC7D,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO,gCAAA;AAAA,UACP,aAAA,EAAe,CAAC,cAAc;AAAA,SAChC;AAAA,MACF;AACA,MAAA;AAAA,IAEF,KAAK,WAAA;AACH,MAAA,IAAI,CAAC,GAAA,CAAI,YAAA,IAAgB,OAAO,GAAA,CAAI,iBAAiB,QAAA,EAAU;AAC7D,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO,iCAAA;AAAA,UACP,aAAA,EAAe,CAAC,cAAc;AAAA,SAChC;AAAA,MACF;AACA,MAAA,IAAI,CAAC,GAAA,CAAI,aAAA,IAAiB,OAAO,GAAA,CAAI,kBAAkB,QAAA,EAAU;AAC/D,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,KAAA,EAAO,kCAAA;AAAA,UACP,aAAA,EAAe,CAAC,eAAe;AAAA,SACjC;AAAA,MACF;AACA,MAAA;AAAA;AAGJ,EAAAA,MAAI,KAAA,CAAM,mCAAA,EAAqC,EAAE,IAAA,EAAM,GAAA,CAAI,MAAM,CAAA;AACjE,EAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AACvB;AAqBO,SAAS,iBAAA,CACd,WACA,UAAA,EACQ;AACR,EAAA,MAAM,eAAA,GAAkD;AAAA,IACtD,GAAA,EAAK,CAAA;AAAA;AAAA;AAAA,0DAAA,CAAA;AAAA,IAKL,MAAA,EAAQ,CAAA;AAAA;AAAA;AAAA,mDAAA,CAAA;AAAA,IAKR,KAAA,EAAO,CAAA;AAAA;AAAA,mFAAA,CAAA;AAAA,IAIP,SAAA,EAAW,CAAA;AAAA;AAAA,kFAAA,CAAA;AAAA,IAIX,QAAA,EAAU,CAAA;AAAA;AAAA;AAAA,uFAAA,CAAA;AAAA,IAKV,GAAA,EAAK,CAAA;AAAA;AAAA;AAAA,4EAAA,CAAA;AAAA,IAKL,eAAA,EAAiB,CAAA;AAAA;AAAA;AAAA,qEAAA;AAAA,GAInB;AAEA,EAAA,OAAO,CAAA;;AAAA,EAEP,WAAW,KAAK;;AAAA,EAEhB,eAAA,CAAgB,SAAS,CAAC;;AAAA,SAAA,EAEjB,UAAA,CAAW,aAAA,EAAe,IAAA,CAAK,IAAI,KAAK,SAAS;;AAAA;AAAA,2CAAA,CAAA;AAI5D;ACh0BA,IAAMA,KAAAA,GAAM,mBAAmB,eAAe,CAAA;AA8B9C,IAAM,mBAAA,GAAsB,gBAAA;AAK5B,IAAM,mBAAA,GAAsB,gBAAA;AAqB5B,eAAsB,eAAA,CACpB,SAAA,EACA,UAAA,EACA,UAAA,EACuB;AACvB,EAAA,MAAM,cAAA,GAAiB,GAAG,SAAS,CAAA,GAAA,CAAA;AAGnC,EAAA,MAAM,iBAAA,GAAoBE,IAAAA,CAAK,UAAA,EAAY,mBAAA,EAAqB,cAAc,CAAA;AAC9E,EAAA,IAAIC,UAAAA,CAAW,iBAAiB,CAAA,EAAG;AACjC,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAMC,QAAAA,CAAS,iBAAA,EAAmB,OAAO,CAAA;AACzD,MAAAJ,KAAAA,CAAI,MAAM,CAAA,0BAAA,EAA6B,SAAS,IAAI,EAAE,IAAA,EAAM,mBAAmB,CAAA;AAC/E,MAAA,OAAO;AAAA,QACL,OAAA;AAAA,QACA,MAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAM;AAAA,OACR;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAAA,MAAI,IAAA,CAAK,CAAA,kCAAA,EAAqC,SAAS,CAAA,CAAA,EAAI,EAAE,OAAO,CAAA;AAAA,IACtE;AAAA,EACF;AAGA,EAAA,MAAM,iBAAA,GAAoB,UAAA,GACtBE,IAAAA,CAAK,UAAA,EAAY,mBAAA,EAAqB,cAAc,CAAA,GACpDA,IAAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,EAAG,mBAAA,EAAqB,cAAc,CAAA;AAE3D,EAAA,IAAIC,UAAAA,CAAW,iBAAiB,CAAA,EAAG;AACjC,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAMC,QAAAA,CAAS,iBAAA,EAAmB,OAAO,CAAA;AACzD,MAAAJ,KAAAA,CAAI,MAAM,CAAA,0BAAA,EAA6B,SAAS,IAAI,EAAE,IAAA,EAAM,mBAAmB,CAAA;AAC/E,MAAA,OAAO;AAAA,QACL,OAAA;AAAA,QACA,MAAA,EAAQ,SAAA;AAAA,QACR,IAAA,EAAM;AAAA,OACR;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAAA,MAAI,IAAA,CAAK,CAAA,kCAAA,EAAqC,SAAS,CAAA,CAAA,EAAI,EAAE,OAAO,CAAA;AAAA,IACtE;AAAA,EACF;AAGA,EAAAA,KAAAA,CAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,SAAS,CAAA,CAAE,CAAA;AACzD,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,wBAAwB,SAAS,CAAA;AAAA,IAC1C,MAAA,EAAQ,SAAA;AAAA,IACR,IAAA,EAAM;AAAA,GACR;AACF;AA6CO,SAAS,mBAAA,CACd,aACA,IAAA,EACQ;AACR,EAAA,IAAI,OAAA,GAAU;AAAA,YAAA,EAAiB,WAAW;;AAAA,CAAA;AAE1C,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA,EAAG;AAC/C,IAAA,IAAI,UAAU,MAAA,EAAW;AAEzB,IAAA,MAAM,UAAA,GAAa,GAAA,CAChB,OAAA,CAAQ,UAAA,EAAY,KAAK,CAAA,CACzB,OAAA,CAAQ,IAAA,EAAM,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAa,EACpC,IAAA,EAAK;AAER,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,MAAA,OAAA,IAAW,KAAK,UAAU,CAAA;AAAA,CAAA;AAC1B,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,OAAA,IAAW,KAAK,IAAI;AAAA,CAAA;AAAA,MACtB;AAAA,IACF,CAAA,MAAO;AACL,MAAA,OAAA,IAAW,CAAA,EAAA,EAAK,UAAU,CAAA,IAAA,EAAO,KAAK;AAAA,CAAA;AAAA,IACxC;AACA,IAAA,OAAA,IAAW,IAAA;AAAA,EACb;AAEA,EAAA,OAAO,OAAA;AACT;AAKA,SAAS,wBAAwB,SAAA,EAA8B;AAC7D,EAAA,QAAQ,SAAA;AAAW,IACjB,KAAK,KAAA;AACH,MAAA,OAAO,CAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,0DAAA,CAAA;AAAA,IAkBT,KAAK,OAAA;AACH,MAAA,OAAO,CAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,qEAAA,CAAA;AAAA,IAmBT,KAAK,QAAA;AACH,MAAA,OAAO,CAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,4BAAA,CAAA;AAAA,IA2BT,KAAK,UAAA;AACH,MAAA,OAAO,CAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,8BAAA,CAAA;AAAA;AAAA,IAoBT,KAAK,WAAA;AAAA,IACL,KAAK,mBAAA;AAAA,IACL,KAAK,KAAA;AAAA,IACL,KAAK,eAAA;AAAA;AAAA,IAEL,KAAK,WAAA;AAAA,IACL,KAAK,KAAA;AAAA,IACL,KAAK,oBAAA;AAAA;AAAA,IAEL,KAAK,OAAA;AAAA,IACL,KAAK,cAAA;AAAA,IACL,KAAK,eAAA;AAAA,IACL,KAAK,IAAA;AAAA,IACL,KAAK,UAAA;AACH,MAAA,OAAO,KAAK,SAAS,CAAA;;AAAA,iEAAA,EAA8E,SAAS,CAAA,GAAA,CAAA;AAAA;AAElH;;;AClSA,IAAMA,KAAAA,GAAM,mBAAmB,YAAY,CAAA;AAuC3C,IAAM,mBAAN,MAAuB;AAAA,EACb,MAAA,uBAAyC,GAAA,EAAI;AAAA,EAC7C,oBAAA,GAA6D,IAAA;AAAA,EAC7D,cAAA,uBAAkC,GAAA,EAAI;AAAA;AAAA;AAAA;AAAA,EAK9C,wBAAwB,QAAA,EAAsD;AAC5E,IAAA,IAAA,CAAK,oBAAA,GAAuB,QAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,YACE,QAAA,EACA,OAAA,EACA,cACA,cAAA,EACA,OAAA,GAAyD,EAAC,EACpD;AACN,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAE3C,IAAA,IAAA,CAAK,MAAA,CAAO,IAAI,GAAA,EAAK;AAAA,MACnB,QAAA;AAAA,MACA,OAAA;AAAA,MACA,YAAA;AAAA,MACA,cAAA;AAAA,MACA,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,OAAA,EAAS,KAAA;AAAA,MACT,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,cAAc,OAAA,CAAQ;AAAA,KACvB,CAAA;AAED,IAAAA,KAAAA,CAAI,KAAK,qBAAA,EAAuB;AAAA,MAC9B,QAAA;AAAA,MACA,OAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACD,CAAA;AAGD,IAAA,IAAI,KAAK,oBAAA,IAAwB,CAAC,KAAK,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA,EAAG;AAC9D,MAAA,MAAM,mBAAmB,YAAA,IAAgB,cAAA;AACzC,MAAA,IAAA,CAAK,oBAAA,CAAqB,QAAA,EAAU,OAAA,EAAS,gBAAgB,CAAA;AAC7D,MAAA,IAAA,CAAK,cAAA,CAAe,IAAI,GAAG,CAAA;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,CAAc,UAAkB,OAAA,EAA0B;AACxD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAC3C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAEjC,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,OAAA,EAAS;AAE3B,MAAA,IAAA,CAAK,cAAA,CAAe,OAAO,GAAG,CAAA;AAC9B,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,YAAA,IAAgB,KAAA,CAAM,cAAA;AACrD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM,SAAA;AAEnC,IAAA,IAAI,WAAW,gBAAA,EAAkB;AAE/B,MAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,MAAA,IAAA,CAAK,cAAA,CAAe,OAAO,GAAG,CAAA;AAC9B,MAAAA,MAAI,KAAA,CAAM,oBAAA,EAAsB,EAAE,QAAA,EAAU,SAAS,CAAA;AACrD,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,CAAkB,UAAkB,OAAA,EAAyB;AAC3D,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAC3C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAEjC,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,OAAA,EAAS,OAAO,CAAA;AAEpC,IAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,YAAA,IAAgB,KAAA,CAAM,cAAA;AACrD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM,SAAA;AACnC,IAAA,MAAM,YAAY,gBAAA,GAAmB,OAAA;AAErC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,CAAW,UAAkB,OAAA,EAAuB;AAClD,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAC3C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAEjC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,MAAA,IAAA,CAAK,cAAA,CAAe,OAAO,GAAG,CAAA;AAC9B,MAAAA,MAAI,KAAA,CAAM,6BAAA,EAA+B,EAAE,QAAA,EAAU,SAAS,CAAA;AAAA,IAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAAmC;AACjC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,SAA0B,EAAC;AAEjC,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,MAAA,CAAO,MAAA,EAAO,EAAG;AACxC,MAAA,IAAI,MAAM,OAAA,EAAS;AAEnB,MAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,YAAA,IAAgB,KAAA,CAAM,cAAA;AACrD,MAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,SAAA;AAE5B,MAAA,IAAI,UAAU,gBAAA,EAAkB;AAC9B,QAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,MACnB,CAAA,MAAO;AAEL,QAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,QAAA,IAAA,CAAK,cAAA,CAAe,OAAO,IAAA,CAAK,QAAA,CAAS,MAAM,QAAA,EAAU,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,MACzE;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAA+B;AAC7B,IAAA,MAAM,MAAA,GAAS,KAAK,eAAA,EAAgB;AACpC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,OAAO;AAAA,MACL,OAAO,MAAA,CAAO,MAAA;AAAA,MACd,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU;AAC7B,QAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,YAAA,IAAgB,KAAA,CAAM,cAAA;AACrD,QAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,SAAA;AAC5B,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,mBAAmB,OAAO,CAAA;AAE1D,QAAA,OAAO;AAAA,UACL,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,SAAS,KAAA,CAAM,OAAA;AAAA,UACf;AAAA,SACF;AAAA,MACF,CAAC;AAAA,KACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAA,GAA6B;AAC3B,IAAA,OAAO,IAAA,CAAK,eAAA,EAAgB,CAAE,MAAA,GAAS,CAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA,EAKA,YAAA,CAAa,UAAkB,OAAA,EAAuC;AACpE,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAC3C,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAEjC,IAAA,IAAI,CAAC,KAAA,IAAS,KAAA,CAAM,OAAA,EAAS,OAAO,IAAA;AAEpC,IAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,YAAA,IAAgB,KAAA,CAAM,cAAA;AACrD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM,SAAA;AAEnC,IAAA,IAAI,WAAW,gBAAA,EAAkB;AAC/B,MAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAiB;AACf,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,MAAA,CAAO,MAAA,EAAO,EAAG;AACxC,MAAA,KAAA,CAAM,OAAA,GAAU,IAAA;AAAA,IAClB;AACA,IAAA,IAAA,CAAK,eAAe,KAAA,EAAM;AAC1B,IAAAA,KAAAA,CAAI,MAAM,yBAAyB,CAAA;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKQ,QAAA,CAAS,UAAkB,OAAA,EAAyB;AAC1D,IAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AAAA,EAC/B;AACF,CAAA;AAKO,IAAM,gBAAA,GAAmB,IAAI,gBAAA,EAAiB;;;AC7OrD,IAAMA,KAAAA,GAAM,mBAAmB,gBAAgB,CAAA;AAU/C,IAAM,cAAA,GAAyC;AAAA;AAAA,EAE7C,mBAAA,EAAqB,mBAAA;AAAA,EACrB,4BAAA,EAA8B,mBAAA;AAAA,EAC9B,iBAAA,EAAmB,iBAAA;AAAA,EACnB,0BAAA,EAA4B,iBAAA;AAAA,EAC5B,cAAA,EAAgB,cAAA;AAAA;AAAA,EAEhB,SAAA,EAAW,SAAA;AAAA,EACX,cAAA,EAAgB,cAAA;AAAA,EAChB,QAAA,EAAU,QAAA;AAAA,EACV,aAAA,EAAe,aAAA;AAAA;AAAA,EAEf,gBAAA,EAAkB,gBAAA;AAAA,EAClB,kBAAA,EAAoB;AACtB,CAAA;AAKA,IAAM,qBAAA,GAAgE;AAAA,EACpE,SAAA,EAAW,EAAE,gBAAA,EAAkB,IAAA,EAAM,qBAAqB,IAAA,EAAK;AAAA,EAC/D,MAAA,EAAQ,EAAE,gBAAA,EAAkB,IAAA,EAAM,qBAAqB,IAAA,EAAK;AAAA,EAC5D,MAAA,EAAQ,EAAE,gBAAA,EAAkB,IAAA,EAAM,qBAAqB,IAAA,EAAK;AAAA,EAC5D,gBAAA,EAAkB,EAAE,gBAAA,EAAkB,KAAA,EAAO,qBAAqB,KAAA;AACpE,CAAA;AAyCO,SAAS,sBAAA,CACd,YAAA,EACA,MAAA,EACA,OAAA,GAA0C,EAAC,EACrB;AACtB,EAAA,MAAM,uBAAiC,EAAC;AAGxC,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,SAAA,GAAY,YAAY,CAAA;AACvD,EAAA,IAAI,QAAA,IAAY,aAAa,SAAA,EAAW;AACtC,IAAA,MAAMU,OAAAA,GAAS,0BAAA,CAA2B,QAAA,EAAU,MAAA,EAAQ,OAAO,CAAA;AACnE,IAAA,IAAIA,OAAAA,EAAQ;AACV,MAAAV,KAAAA,CAAI,MAAM,sCAAA,EAAwC;AAAA,QAChD,YAAA;AAAA,QACA,OAAOU,OAAAA,CAAO;AAAA,OACf,CAAA;AACD,MAAA,OAAO;AAAA,QACL,GAAGA,OAAAA;AAAA,QACH,MAAA,EAAQ,CAAA,mBAAA,EAAsB,YAAY,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAAA,QACtD;AAAA,OACF;AAAA,IACF;AACA,IAAAV,MAAI,IAAA,CAAK,yCAAA,EAA2C,EAAE,YAAA,EAAc,UAAU,CAAA;AAAA,EAChF;AAGA,EAAA,MAAM,WAAA,GAAc,OAAO,MAAA,CAAO,MAAA;AAClC,EAAA,MAAM,MAAA,GAAS,yBAAA,CAA0B,WAAA,EAAa,MAAA,EAAQ,OAAO,CAAA;AAErE,EAAA,IAAI,MAAA,EAAQ;AACV,IAAAA,KAAAA,CAAI,MAAM,iCAAA,EAAmC;AAAA,MAC3C,YAAA;AAAA,MACA,WAAA;AAAA,MACA,eAAe,MAAA,CAAO;AAAA,KACvB,CAAA;AACD,IAAA,OAAO;AAAA,MACL,GAAG,MAAA;AAAA,MACH,MAAA,EAAQ,QAAA,KAAa,SAAA,GAAY,uBAAA,GAA0B,iCAAA;AAAA,MAC3D,sBAAsB,MAAA,CAAO;AAAA,KAC/B;AAAA,EACF;AAGA,EAAAA,KAAAA,CAAI,KAAK,6DAAA,EAA+D;AAAA,IACtE,YAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,WAAA;AAAA,IACP,QAAA,EAAU,gBAAgB,WAAW,CAAA;AAAA,IACrC,OAAA,EAAS,eAAe,WAAW,CAAA;AAAA,IACnC,MAAA,EAAQ,uCAAA;AAAA,IACR;AAAA,GACF;AACF;AAqDA,SAAS,yBAAA,CACP,eAAA,EACA,MAAA,EACA,OAAA,GAA0C,EAAC,EACd;AAC7B,EAAA,MAAM,EAAE,QAAA,EAAU,gBAAA,EAAkB,OAAA,EAAQ,GAAI,qBAAqB,eAAe,CAAA;AACpF,EAAA,MAAM,uBAAiC,EAAC;AAGxC,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,MAAM,SAAA,GAAY,gBAAA,CAAiB,aAAA,CAAc,gBAAA,EAAkB,OAAO,CAAA;AAC1E,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,oBAAA,CAAqB,KAAK,gBAAgB,CAAA;AAC1C,MAAAA,MAAI,IAAA,CAAK,qCAAA,EAAuC,EAAE,QAAA,EAAU,gBAAA,EAAkB,SAAS,CAAA;AAAA,IACzF;AAEA,IAAA,IAAI,CAAC,SAAA,IAAa,iBAAA,CAAkB,gBAAA,EAAkB,MAAM,CAAA,EAAG;AAC7D,MAAA,IAAI,CAAC,OAAA,CAAQ,gBAAA,IAAoB,qBAAA,CAAsB,gBAAgB,EAAE,gBAAA,EAAkB;AACzF,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,eAAA;AAAA,UACP,QAAA,EAAU,gBAAA;AAAA,UACV,OAAA;AAAA,UACA,MAAA,EAAQ,mCAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,OAAA,CAAQ,YAAA,EAAc,EAAE,CAAA;AAC/C,EAAA,MAAM,UAAA,GAAa,mBAAmB,MAAM,CAAA;AAG5C,EAAA,MAAM,eAAA,GAAkB,uBAAA,CAAwB,UAAA,EAAY,MAAA,EAAQ,OAAO,CAAA;AAG3E,EAAA,KAAA,MAAW,YAAY,eAAA,EAAiB;AACtC,IAAA,IAAI,gBAAA,CAAiB,aAAA,CAAc,QAAA,EAAU,MAAM,CAAA,EAAG;AACpD,MAAA,oBAAA,CAAqB,KAAK,QAAQ,CAAA;AAClC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,iBAAA,CAAkB,QAAA,EAAU,MAAM,CAAA,EAAG;AACxC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAQ,gBAAA,IAAoB,CAAC,qBAAA,CAAsB,QAAQ,EAAE,gBAAA,EAAkB;AACjF,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,MAAA,EAAQ,QAAQ,CAAA;AACzC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI,oBAAA,CAAqB,SAAS,CAAA,EAAG;AACnC,QAAA,MAAA,GAAS,CAAA,gDAAA,EAAmD,oBAAA,CAAqB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,MAC7F,CAAA,MAAO;AACL,QAAA,MAAA,GAAS,yCAAA;AAAA,MACX;AAEA,MAAAA,KAAAA,CAAI,MAAM,sBAAA,EAAwB;AAAA,QAChC,KAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA,EAAS,MAAA;AAAA,QACT,MAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,OAAO;AAAA,QACL,KAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA,EAAS,MAAA;AAAA,QACT,MAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAIA,EAAA,KAAA,MAAW,YAAY,eAAA,EAAiB;AACtC,IAAA,IAAI,iBAAA,CAAkB,QAAA,EAAU,MAAM,CAAA,EAAG;AACvC,MAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,MAAA,EAAQ,QAAQ,CAAA;AACzC,MAAA,IAAI,KAAA,EAAO;AACT,QAAAA,KAAAA,CAAI,KAAK,iDAAA,EAAmD;AAAA,UAC1D,KAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA,SACD,CAAA;AACD,QAAA,OAAO;AAAA,UACL,KAAA;AAAA,UACA,QAAA;AAAA,UACA,OAAA,EAAS,MAAA;AAAA,UACT,MAAA,EAAQ,6DAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAKA,SAAS,uBAAA,CACP,UAAA,EACA,MAAA,EACA,OAAA,GAA0C,EAAC,EAC5B;AACf,EAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,EAAA,MAAM,YAA2B,EAAC;AAGlC,EAAA,IAAI,UAAA,KAAe,SAAA,IAAa,OAAA,CAAQ,mBAAA,CAAoB,UAAU,CAAA,EAAG;AACvE,IAAA,SAAA,CAAU,IAAA,CAAK,GAAG,OAAA,CAAQ,mBAAA,CAAoB,UAAU,CAAE,CAAA;AAAA,EAC5D;AAGA,EAAA,KAAA,MAAW,CAAA,IAAK,QAAQ,gBAAA,EAAkB;AACxC,IAAA,IAAI,CAAC,SAAA,CAAU,QAAA,CAAS,CAAC,CAAA,EAAG;AAC1B,MAAA,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,IAClB;AAAA,EACF;AAGA,EAAA,MAAM,gBAAA,GAAgD;AAAA,IACpD,MAAA,EAAQ,WAAA;AAAA,IACR,GAAA,EAAK,QAAA;AAAA,IACL,MAAA,EAAQ;AAAA,GACV;AACA,EAAA,MAAM,OAAA,GAAU,iBAAiB,UAAU,CAAA;AAC3C,EAAA,IAAI,OAAA,IAAW,CAAC,SAAA,CAAU,QAAA,CAAS,OAAO,CAAA,EAAG;AAC3C,IAAA,SAAA,CAAU,KAAK,OAAO,CAAA;AAAA,EACxB;AAGA,EAAA,IAAI,QAAQ,gBAAA,EAAkB;AAC5B,IAAA,OAAO,UAAU,MAAA,CAAO,CAAC,MAAM,qBAAA,CAAsB,CAAC,EAAE,gBAAgB,CAAA;AAAA,EAC1E;AAEA,EAAA,OAAO,SAAA;AACT;AAKA,SAAS,qBAAqB,UAAA,EAG5B;AACA,EAAA,IAAI,UAAA,CAAW,QAAA,CAAS,GAAG,CAAA,EAAG;AAC5B,IAAA,MAAM,CAAC,WAAA,EAAa,GAAG,UAAU,CAAA,GAAI,UAAA,CAAW,MAAM,GAAG,CAAA;AACzD,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,WAAA;AAAA,MACV,OAAA,EAAS,UAAA,CAAW,IAAA,CAAK,GAAG;AAAA,KAC9B;AAAA,EACF;AACA,EAAA,OAAO,EAAE,QAAA,EAAU,IAAA,EAAM,OAAA,EAAS,UAAA,EAAW;AAC/C;AAKA,SAAS,gBAAgB,KAAA,EAA4B;AACnD,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,oBAAA,CAAqB,KAAK,CAAA;AAC/C,EAAA,OAAO,QAAA,IAAY,WAAA;AACrB;AAKA,SAAS,eAAe,KAAA,EAAuB;AAC7C,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,oBAAA,CAAqB,KAAK,CAAA;AAC9C,EAAA,OAAO,OAAA;AACT;AAKA,SAAS,0BAAA,CACP,UAAA,EACA,MAAA,EACA,OAAA,GAA0C,EAAC,EAC2B;AACtE,EAAA,MAAM,EAAE,QAAA,EAAU,OAAA,EAAQ,GAAI,qBAAqB,UAAU,CAAA;AAE7D,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,IAAI,CAAC,iBAAA,CAAkB,QAAA,EAAU,MAAM,CAAA,EAAG;AACxC,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,IAAI,QAAQ,gBAAA,IAAoB,CAAC,qBAAA,CAAsB,QAAQ,EAAE,gBAAA,EAAkB;AACjF,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,EAAE,KAAA,EAAO,UAAA,EAAY,QAAA,EAAU,OAAA,EAAQ;AAAA,EAChD;AAGA,EAAA,MAAM,MAAA,GAAS,yBAAA,CAA0B,UAAA,EAAY,MAAA,EAAQ,OAAO,CAAA;AACpE,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,OAAO,EAAE,OAAO,MAAA,CAAO,KAAA,EAAO,UAAU,MAAA,CAAO,QAAA,EAAU,OAAA,EAAS,MAAA,CAAO,OAAA,EAAQ;AAAA,EACnF;AAEA,EAAA,OAAO,IAAA;AACT;AAKA,SAAS,UAAA,CAAW,aAAqB,QAAA,EAAsC;AAC7E,EAAA,MAAM,SAAA,GAAY,eAAe,WAAW,CAAA;AAC5C,EAAA,IAAI,CAAC,SAAA,EAAW;AAEd,IAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AACjC;AAKA,SAAS,iBAAA,CAAkB,UAAuB,MAAA,EAA6B;AAC7E,EAAA,MAAM,OAAO,MAAA,CAAO,aAAA;AAEpB,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,WAAA;AACH,MAAA,OAAO,IAAA,CAAK,QAAQ,OAAA,KAAY,IAAA;AAAA,IAClC,KAAK,QAAA;AACH,MAAA,OAAO,IAAA,CAAK,QAAQ,OAAA,KAAY,IAAA;AAAA,IAClC,KAAK,QAAA;AACH,MAAA,OAAO,IAAA,CAAK,QAAQ,OAAA,KAAY,IAAA;AAAA,IAClC,KAAK,gBAAA;AACH,MAAA,OAAO,IAAA,CAAK,eAAe,OAAA,KAAY,IAAA;AAAA,IACzC;AACE,MAAA,OAAO,KAAA;AAAA;AAEb;AAKA,SAAS,mBAAmB,WAAA,EAA8D;AACxF,EAAA,IAAI,WAAA,CAAY,SAAS,QAAQ,CAAA,IAAK,YAAY,QAAA,CAAS,OAAO,GAAG,OAAO,QAAA;AAC5E,EAAA,IAAI,WAAA,CAAY,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,KAAA;AACxC,EAAA,IAAI,WAAA,CAAY,QAAA,CAAS,QAAQ,CAAA,EAAG,OAAO,QAAA;AAC3C,EAAA,OAAO,SAAA;AACT;;;ACzaA,IAAMA,KAAAA,GAAM,mBAAmB,kBAAkB,CAAA;AAqD1C,SAASK,kBAAiB,WAAA,EAAkC;AACjE,EAAA,MAAM,CAAC,UAAA,EAAY,OAAO,CAAA,GAAI,WAAA,CAAY,MAAM,GAAG,CAAA;AACnD,EAAA,OAAO;AAAA,IACL,YAAY,UAAA,IAAc,WAAA;AAAA,IAC1B,SAAS,OAAA,IAAW;AAAA,GACtB;AACF;AAKO,IAAM,yBAAN,MAA6B;AAAA,EAC1B,GAAA;AAAA,EACA,MAAA;AAAA,EACA,cAAA,uBAAiD,GAAA,EAAI;AAAA,EAE7D,WAAA,CAAY,KAAkB,MAAA,EAAoB;AAChD,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CAAW,OAAA,EAAyB,aAAA,EAAsD;AAC9F,IAAA,MAAM,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAM,GAAI,OAAA;AACvC,IAAA,MAAM,EAAE,QAAO,GAAI,aAAA;AAGnB,IAAA,MAAM,UAAA,GAAa,KAAA,IAAS,IAAA,CAAK,YAAA,CAAa,YAAY,CAAA;AAC1D,IAAA,MAAM,WAAA,GAAcA,kBAAiB,UAAU,CAAA;AAE/C,IAAAL,KAAAA,CAAI,MAAM,2BAAA,EAA6B;AAAA,MACrC,KAAA;AAAA,MACA,YAAA;AAAA,MACA,KAAA,EAAO;AAAA,KACR,CAAA;AAED,IAAA,IAAI;AAEF,MAAA,MAAM,eAAe,MAAM,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,QAAQ,MAAA,CAAO;AAAA,QACxD,IAAA,EAAM,EAAE,KAAA;AAAM,OACf,CAAA;AAED,MAAA,IAAI,CAAC,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI;AAC1B,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,oBAAoB,YAAY,CAAA,QAAA;AAAA,SACzC;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,GAAY,aAAa,IAAA,CAAK,EAAA;AAIpC,MAAA,uBAAA,CAAwB,WAAW,YAA6B,CAAA;AAChE,MAAA,IAAA,CAAK,eAAe,GAAA,CAAI,SAAA,EAAW,EAAE,SAAA,EAAW,cAAc,CAAA;AAE9D,MAAAA,MAAI,KAAA,CAAM,iBAAA,EAAmB,EAAE,SAAA,EAAW,cAAc,CAAA;AAExD,MAAA,IAAI;AAEF,QAAA,MAAM,eAAe,MAAM,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,QAAQ,MAAA,CAAO;AAAA,UACxD,IAAA,EAAM,EAAE,EAAA,EAAI,SAAA,EAAU;AAAA,UACtB,IAAA,EAAM;AAAA,YACJ,KAAA,EAAO,WAAA;AAAA,YACP,OAAO,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,QAAQ;AAAA;AACxC,SACD,CAAA;AAED,QAAA,IAAI,CAAC,aAAa,IAAA,EAAM;AACtB,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,KAAA;AAAA,YACT,SAAA;AAAA,YACA,KAAA,EAAO,oBAAoB,YAAY,CAAA,MAAA;AAAA,WACzC;AAAA,QACF;AAGA,QAAA,MAAM,iBAAiB,MAAM,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,QAAQ,QAAA,CAAS;AAAA,UAC5D,IAAA,EAAM,EAAE,EAAA,EAAI,SAAA;AAAU,SACvB,CAAA;AAED,QAAA,MAAM,WAAA,GAAc,cAAA,CAAe,IAAA,EAAM,EAAA,CAAG,CAAA,CAAE,CAAA;AAC9C,QAAA,IAAI,CAAC,WAAA,EAAa;AAChB,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,KAAA;AAAA,YACT,SAAA;AAAA,YACA,KAAA,EAAO,kBAAkB,YAAY,CAAA,QAAA;AAAA,WACvC;AAAA,QACF;AAGA,QAAA,MAAM,SAAA,GAAY,WAAA,CAAY,KAAA,EAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,MAAM,CAAA,IAAK,EAAC;AAC1E,QAAA,MAAM,QAAA,GAAW,UAAU,GAAA,CAAI,CAAC,MAAO,CAAA,CAAuB,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAE7E,QAAAA,KAAAA,CAAI,MAAM,mBAAA,EAAqB,EAAE,WAAW,cAAA,EAAgB,QAAA,CAAS,QAAQ,CAAA;AAE7E,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,SAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,CAAA,SAAE;AAEA,QAAA,IAAA,CAAK,eAAe,SAAS,CAAA;AAAA,MAC/B;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAAA,KAAAA,CAAI,MAAM,CAAA,EAAG,YAAY,mBAAmB,EAAE,KAAA,EAAO,SAAS,CAAA;AAC9D,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,CAAA,EAAG,YAAY,CAAA,qBAAA,EAAwB,OAAO,CAAA;AAAA,OACvD;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAe,SAAA,EAAyB;AAC9C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA;AACjD,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,yBAAA,CAA0B,SAAS,CAAA;AACnC,MAAA,IAAA,CAAK,cAAA,CAAe,OAAO,SAAS,CAAA;AACpC,MAAAA,KAAAA,CAAI,KAAA,CAAM,oBAAA,EAAsB,EAAE,WAAW,CAAA;AAAA,IAC/C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,GAA2B;AACzB,IAAA,KAAA,MAAW,CAAC,SAAS,CAAA,IAAK,IAAA,CAAK,cAAA,EAAgB;AAC7C,MAAA,IAAA,CAAK,eAAe,SAAS,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,YAAA,EAAoC;AACvD,IAAA,MAAM,MAAA,GAAS,sBAAA,CAAuB,YAAA,EAAc,IAAA,CAAK,MAAM,CAAA;AAC/D,IAAA,OAAO,MAAA,CAAO,KAAA;AAAA,EAChB;AACF,CAAA;AA2CO,SAAS,YAAY,QAAA,EAA0B;AAEpD,EAAA,IAAI,OAAA,GAAU,SAAS,IAAA,EAAK;AAG5B,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,KAAA,CAAM,8BAA8B,CAAA;AACnE,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,OAAA,GAAU,cAAA,CAAe,CAAC,CAAA,CAAE,IAAA,EAAK;AAAA,EACnC;AAGA,EAAA,IAAI,QAAQ,UAAA,CAAW,GAAG,KAAK,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AACtD,IAAA,OAAO,OAAA;AAAA,EACT;AAGA,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,CAAM,eAAe,CAAA;AAC/C,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,OAAO,UAAU,CAAC,CAAA;AAAA,EACpB;AAGA,EAAA,OAAO,OAAA;AACT;AAKA,SAAS,oBAAA,CAAqB,cAAA,EAAwB,QAAA,EAAkB,KAAA,EAAuB;AAC7F,EAAA,OAAO,CAAA;;AAAA,WAAA,EAEI,KAAK;;AAAA;AAAA;AAAA,EAIhB,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,GAAG,QAAA,CAAS,MAAA,GAAS,GAAA,GAAM,KAAA,GAAQ,EAAE;AAAA;;AAAA;;AAAA;;AAAA,EAO3D,cAAc,CAAA,CAAA;AAChB;AAKA,SAAS,sBAAA,CACP,cAAA,EACA,QAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,SAAA,GAAY,MAAA,CACf,GAAA,CAAI,CAAC,CAAA,KAAM,KAAK,CAAA,CAAE,IAAA,CAAK,MAAA,GAAS,CAAA,GAAI,CAAA,EAAG,CAAA,CAAE,KAAK,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,CAAA,GAAO,EAAE,CAAA,EAAG,EAAE,OAAO,CAAA,CAAE,CAAA,CAC9E,IAAA,CAAK,IAAI,CAAA;AAEZ,EAAA,OAAO,CAAA;;AAAA;AAAA,EAGP,SAAS;;AAAA;AAAA;AAAA,EAIT,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,GAAG,QAAA,CAAS,MAAA,GAAS,GAAA,GAAM,KAAA,GAAQ,EAAE;AAAA;;AAAA;;AAAA;;AAAA,EAO3D,cAAc,CAAA,CAAA;AAChB;AAmBA,eAAsB,yBAAA,CACpB,GAAA,EACA,MAAA,EACA,OAAA,EACA,QACA,MAAA,EAC6B;AAC7B,EAAA,MAAM,UAAA,GAAa,QAAQ,UAAA,IAAc,CAAA;AACzC,EAAA,MAAM,OAAA,GAAU,IAAI,sBAAA,CAAuB,GAAA,EAAK,MAAM,CAAA;AAEtD,EAAA,IAAI,aAAA,GAAgB,MAAA;AACpB,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI,oBAAA;AAEJ,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,UAAA,EAAY,OAAA,EAAA,EAAW;AACtD,IAAA,MAAM,UAAU,OAAA,GAAU,CAAA;AAE1B,IAAA,IAAI,OAAA,EAAS;AACX,MAAAA,KAAAA,CAAI,MAAM,4CAAA,EAA8C;AAAA,QACtD,OAAA;AAAA,QACA,UAAA;AAAA,QACA,cAAc,OAAA,CAAQ;AAAA,OACvB,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,UAAA,CAAW,SAAS,EAAE,MAAA,EAAQ,eAAe,CAAA;AAE1E,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,OAAO,KAAA,IAAS,yBAAA;AAAA,QACvB,WAAA,EAAa;AAAA,OACf;AAAA,IACF;AAEA,IAAA,YAAA,GAAe,OAAO,QAAA,IAAY,EAAA;AAGlC,IAAA,MAAM,UAAA,GAAa,YAAY,YAAY,CAAA;AAC3C,IAAA,IAAI,MAAA;AAEJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,IAAA,CAAK,MAAM,UAAU,CAAA;AAAA,IAChC,SAAS,UAAA,EAAY;AACnB,MAAA,MAAM,YAAA,GAAe,UAAA,YAAsB,KAAA,GAAQ,UAAA,CAAW,OAAA,GAAU,cAAA;AAExE,MAAAA,KAAAA,CAAI,KAAK,mBAAA,EAAqB;AAAA,QAC5B,OAAA;AAAA,QACA,KAAA,EAAO,YAAA;AAAA,QACP,eAAA,EAAiB,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,GAAG;AAAA,OAC3C,CAAA;AAED,MAAA,IAAI,UAAU,UAAA,EAAY;AACxB,QAAA,aAAA,GAAgB,oBAAA,CAAqB,MAAA,EAAQ,YAAA,EAAc,YAAY,CAAA;AACvE,QAAA,oBAAA,GAAuB,CAAC,CAAA,kBAAA,EAAqB,YAAY,CAAA,CAAE,CAAA;AAC3D,QAAA;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,CAAA,sCAAA,EAAyC,UAAA,GAAa,CAAC,cAAc,YAAY,CAAA,CAAA;AAAA,QACxF,WAAA,EAAa,YAAA;AAAA,QACb,gBAAA,EAAkB,CAAC,CAAA,kBAAA,EAAqB,YAAY,CAAA,CAAE;AAAA,OACxD;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,SAAA,CAAU,MAAM,CAAA;AAEzC,IAAA,IAAI,CAAC,UAAU,OAAA,EAAS;AACtB,MAAA,MAAM,MAAA,GAAS,UAAU,KAAA,CAAM,MAAA;AAC/B,MAAA,oBAAA,GAAuB,MAAA,CAAO,GAAA;AAAA,QAC5B,CAAC,CAAA,KAAgB,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,SAAS,CAAA,GAAI,CAAA,EAAG,CAAA,CAAE,IAAA,CAAK,KAAK,GAAG,CAAC,OAAO,EAAE,CAAA,EAAG,EAAE,OAAO,CAAA;AAAA,OAClF;AAEA,MAAAA,KAAAA,CAAI,KAAK,0BAAA,EAA4B;AAAA,QACnC,OAAA;AAAA,QACA,MAAA,EAAQ;AAAA,OACT,CAAA;AAED,MAAA,IAAI,UAAU,UAAA,EAAY;AACxB,QAAA,aAAA,GAAgB,sBAAA,CAAuB,MAAA,EAAQ,UAAA,EAAY,MAAM,CAAA;AACjE,QAAA;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,CAAA,0CAAA,EAA6C,UAAA,GAAa,CAAC,CAAA,SAAA,CAAA;AAAA,QAClE,WAAA,EAAa,YAAA;AAAA,QACb,gBAAA,EAAkB;AAAA,OACpB;AAAA,IACF;AAGA,IAAAA,KAAAA,CAAI,MAAM,+BAAA,EAAiC;AAAA,MACzC,OAAA;AAAA,MACA,cAAc,OAAA,CAAQ;AAAA,KACvB,CAAA;AAED,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,MAAM,SAAA,CAAU,IAAA;AAAA,MAChB,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAGA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,KAAA;AAAA,IACT,KAAA,EAAO,iCAAA;AAAA,IACP,WAAA,EAAa,YAAA;AAAA,IACb,gBAAA,EAAkB;AAAA,GACpB;AACF;;;ACpbA,IAAMA,KAAAA,GAAM,mBAAmB,sBAAsB,CAAA;AA8H9C,SAAS,wBAAA,CAAyB,KAAkB,MAAA,EAAoC;AAC7F,EAAA,OAAOM,IAAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4CAAA,CAAA;AAAA,IA6Bb,IAAA,EAAM;AAAA,MACJ,YAAA,EAAcA,KAAK,MAAA,CAChB,MAAA,GACA,QAAA,EAAS,CACT,SAAS,sEAAsE,CAAA;AAAA,MAClF,kBAAA,EAAoBA,KAAK,MAAA,CACtB,MAAA,GACA,QAAA,EAAS,CACT,SAAS,yEAAyE,CAAA;AAAA,MACrF,OAAA,EAASA,KAAK,MAAA,CACX,MAAA,GACA,QAAA,EAAS,CACT,SAAS,oEAAoE,CAAA;AAAA,MAChF,IAAA,EAAMA,KAAK,MAAA,CACR,MAAA,GACA,QAAA,EAAS,CACT,SAAS,iEAAiE,CAAA;AAAA,MAC7E,eAAA,EAAiBA,IAAAA,CAAK,MAAA,CACnB,MAAA,CAAO;AAAA,QACN,IAAA,EAAMA,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,KAAA,EAAO,QAAA,EAAU,WAAW,CAAC,CAAA;AAAA,QACrD,YAAA,EAAcA,IAAAA,CAAK,MAAA,CAAO,MAAA,EAAO;AAAA,QACjC,kBAAA,EAAoBA,IAAAA,CAAK,MAAA,CAAO,MAAA,GAAS,QAAA,EAAS;AAAA,QAClD,kBAAA,EAAoBA,IAAAA,CAAK,MAAA,CAAO,MAAA,GAAS,QAAA,EAAS;AAAA,QAClD,oBAAA,EAAsBA,IAAAA,CAAK,MAAA,CAAO,MAAA,GAAS,QAAA,EAAS;AAAA,QACpD,eAAA,EAAiBA,IAAAA,CAAK,MAAA,CAAO,MAAA,GAAS,QAAA,EAAS;AAAA,QAC/C,gBAAA,EAAkBA,IAAAA,CAAK,MAAA,CAAO,MAAA,GAAS,QAAA;AAAS,OACjD,CAAA,CACA,QAAA,EAAS,CACT,QAAA;AAAA,QACC;AAAA;AACF,KACJ;AAAA,IAEA,MAAM,QAAQ,IAAA,EAAuB;AACnC,MAAA,MAAM,MAAA,GAAS,MAAM,qBAAA,CAAsB,GAAA,EAAK,QAAQ,IAA0B,CAAA;AAClF,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,IACvC;AAAA,GACD,CAAA;AACH;AASA,SAAS,sBAAA,CACP,MACA,UAAA,EAC4B;AAE5B,EAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AAGA,EAAA,IAAI,KAAK,YAAA,EAAc;AACrB,IAAA,MAAM,kBAAA,GACJ,KAAK,kBAAA,IAAsBJ,IAAAA,CAAK,YAAY,MAAA,EAAQ,aAAA,EAAe,UAAU,aAAa,CAAA;AAC5F,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,KAAA;AAAA,MACN,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,kBAAA;AAAA,MACA,kBAAA,EAAoB,KAAK,OAAA,IAAW;AAAA,KACtC;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,eAAe,qBAAA,CACb,GAAA,EACA,MAAA,EACA,IAAA,EAC+B;AAE/B,EAAA,MAAM,eAAA,GAAkB,sBAAA,CAAuB,IAAA,EAAM,GAAA,CAAI,SAAS,CAAA;AAGlE,EAAA,MAAM,cAAA,GAAuC,wBAAwB,eAAe,CAAA;AACpF,EAAA,IAAI,CAAC,eAAe,KAAA,EAAO;AACzB,IAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,UAAA,EAAY,cAAc,CAAA;AAChE,IAAAF,KAAAA,CAAI,KAAK,iCAAA,EAAmC;AAAA,MAC1C,OAAO,cAAA,CAAe,KAAA;AAAA,MACtB,eAAe,cAAA,CAAe;AAAA,KAC/B,CAAA;AACD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,eAAe,KAAA,IAAS,wBAAA;AAAA,MAC/B,UAAA,EAAY,qDAAA;AAAA,MACZ;AAAA,KACF;AAAA,EACF;AAGA,EAAA,MAAM,YAAA,GAAe,eAAA;AACrB,EAAA,MAAM,eAAe,YAAA,CAAa,YAAA;AAElC,EAAAA,KAAAA,CAAI,MAAM,iCAAA,EAAmC,EAAE,MAAM,YAAA,CAAa,IAAA,EAAM,cAAc,CAAA;AAGtF,EAAA,MAAM,cAAA,GAAiB,YAAA,CACpB,WAAA,EAAY,CACZ,OAAA,CAAQ,eAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAGvB,EAAA,IAAI,aAAA,GAAgB,EAAA;AACpB,EAAA,MAAM,UAAA,GACJ,YAAA,CAAa,IAAA,KAAS,KAAA,GAClB,YAAA,CAAa,kBAAA,GACbE,IAAAA,CAAK,GAAA,CAAI,SAAA,EAAW,MAAA,EAAQ,aAAA,EAAe,QAAA,EAAU,aAAa,CAAA;AAExE,EAAA,IAAI;AACF,IAAA,aAAA,GAAgB,MAAME,QAAAA,CAAS,UAAA,EAAY,OAAO,CAAA;AAAA,EACpD,CAAA,CAAA,MAAQ;AAAA,EAER;AAGA,EAAA,MAAM,MAAA,GAAS,MAAM,mBAAA,CAAoB,GAAA,CAAI,WAAW,YAAA,EAAc,aAAA,EAAe,KAAK,IAAI,CAAA;AAG9F,EAAA,MAAM,SAAS,MAAM,yBAAA;AAAA,IACnB,GAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,qCAAqC,YAAY,CAAA,CAAA;AAAA,MACxD,YAAA,EAAc,UAAA;AAAA,MACd,UAAA,EAAY;AAAA,KACd;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAAJ,KAAAA,CAAI,KAAK,yCAAA,EAA2C;AAAA,MAClD,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,kBAAkB,MAAA,CAAO;AAAA,KAC1B,CAAA;AACD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,UAAA,EAAY,mDAAA;AAAA,MACZ,kBAAkB,MAAA,CAAO;AAAA,KAC3B;AAAA,EACF;AAEA,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AAGpB,EAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,2BAAA;AAAA,MACP,UAAA,EAAY,KAAK,iBAAA,CAAkB;AAAA,KACrC;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAaE,IAAAA;AAAA,IACjB,GAAA,CAAI,SAAA;AAAA,IACJ,MAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,IAAI,KAAK,QAAA,EAAU;AACjB,IAAA,IAAI;AACF,MAAA,MAAMS,MAAMJ,OAAAA,CAAQ,UAAU,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACpD,MAAA,MAAMK,SAAAA,CAAU,UAAA,EAAY,IAAA,CAAK,QAAA,EAAU,OAAO,CAAA;AAAA,IACpD,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,sCAAsC,OAAO,CAAA,CAAA;AAAA,QACpD,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,MAAA,GACJ,IAAA,CAAK,MAAA,EAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACvB,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,aAAa,CAAA,CAAE;AAAA,GACjB,CAAE,KAAK,EAAC;AAEV,EAAA,MAAM,QAAA,GACJ,IAAA,CAAK,QAAA,EAAU,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACzB,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,aAAa,CAAA,CAAE;AAAA,GACjB,CAAE,KAAK,EAAC;AAEV,EAAA,MAAM,UAAA,GACJ,IAAA,CAAK,KAAA,EAAO,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACtB,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,SAAS,CAAA,CAAE;AAAA,GACb,CAAE,KAAK,EAAC;AAEV,EAAA,MAAM,MAAA,GACJ,IAAA,CAAK,MAAA,EAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACvB,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,UAAU,CAAA,CAAE,OAAA,GAAU,CAAC,CAAA,CAAE,OAAO,CAAA,GAAI,MAAA;AAAA,IACpC,QAAQ,CAAA,CAAE,MAAA;AAAA,IACV,YAAY,CAAA,CAAE,IAAA,GAAO,CAAC,CAAA,CAAE,IAAI,CAAA,GAAI;AAAA,GAClC,CAAE,KAAK,EAAC;AAEV,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY,IAAA,CAAK,QAAA,GAAW,UAAA,GAAa,MAAA;AAAA,IACzC,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,MAAA;AAAA,IACrC,QAAA,EAAU,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,QAAA,GAAW,MAAA;AAAA,IAC3C,UAAA,EAAY,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,UAAA,GAAa,MAAA;AAAA,IACjD,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,MAAA,GAAS,MAAA;AAAA,IACrC,WAAA,EAAa,KAAK,IAAA,IAAQ;AAAA,GAC5B;AACF;AASA,eAAe,mBAAA,CACb,UAAA,EACA,OAAA,EACA,aAAA,EACA,IAAA,EACiB;AAEjB,EAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB,mBAAA,EAAqB,UAAU,CAAA;AACpE,EAAA,IAAI,SAAS,MAAA,CAAO,OAAA;AAEpB,EAAA,MAAM,eAAe,OAAA,CAAQ,YAAA;AAC7B,EAAA,MAAM,cAAA,GAAiB,YAAA,CACpB,WAAA,EAAY,CACZ,OAAA,CAAQ,eAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAGvB,EAAA,MAAM,YAAA,GAAyB;AAAA,IAC7B,eAAe,YAAY,CAAA,uCAAA,CAAA;AAAA,IAC3B,6DAAA;AAAA,IACA,oDAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,MAAM,mBAAmB,IAAA,GACrB;AAAA,kBAAA,EAAuB,IAAI,CAAA;AAAA,CAAA,GAC3B,2CAAA;AAGJ,EAAA,IAAI,iBAAA;AACJ,EAAA,IAAI,OAAA,CAAQ,SAAS,KAAA,EAAO;AAC1B,IAAA,YAAA,CAAa,OAAA,CAAQ,CAAA,uBAAA,EAA0B,OAAA,CAAQ,kBAAkB,CAAA,CAAE,CAAA;AAC3E,IAAA,iBAAA,GAAoB,OAAA,CAAQ,kBAAA;AAAA,EAC9B,CAAA,MAAA,IAAW,OAAA,CAAQ,IAAA,KAAS,QAAA,EAAU;AACpC,IAAA,YAAA,CAAa,OAAA,CAAQ,CAAA,+BAAA,EAAkC,OAAA,CAAQ,oBAAoB,CAAA,CAAE,CAAA;AACrF,IAAA,YAAA,CAAa,IAAA,CAAK,CAAA,qBAAA,EAAwB,OAAA,CAAQ,eAAe,CAAA,CAAE,CAAA;AACnE,IAAA,iBAAA,GAAoB,OAAA,CAAQ,eAAA;AAAA,EAC9B,CAAA,MAAA,IAAW,OAAA,CAAQ,IAAA,KAAS,WAAA,EAAa;AACvC,IAAA,YAAA,CAAa,OAAA,CAAQ,CAAA,6BAAA,EAAgC,OAAA,CAAQ,oBAAoB,CAAA,CAAE,CAAA;AACnF,IAAA,YAAA,CAAa,IAAA,CAAK,CAAA,WAAA,EAAc,OAAA,CAAQ,gBAAgB,CAAA,CAAE,CAAA;AAC1D,IAAA,iBAAA,GAAoB,OAAA,CAAQ,gBAAA;AAAA,EAC9B;AAGA,EAAA,MAAA,IAAU,oBAAoB,sBAAA,EAAwB;AAAA,IACpD,aAAa,OAAA,CAAQ,IAAA;AAAA,IACrB,YAAA;AAAA,IACA,eAAe,aAAA,IAAiB,4DAAA;AAAA,IAChC,iBAAA;AAAA,IACA,oBAAA,EACE,QAAQ,IAAA,KAAS,QAAA,IAAY,QAAQ,IAAA,KAAS,WAAA,GAC1C,QAAQ,oBAAA,GACR,MAAA;AAAA,IACN,gBAAA;AAAA,IACA,UAAA,EAAY,8BAA8B,cAAc,CAAA,YAAA,CAAA;AAAA,IACxD;AAAA,GACD,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AC/bA,IAAMZ,KAAAA,GAAM,mBAAmB,sBAAsB,CAAA;AAsE9C,SAAS,wBAAA,CAAyB,KAAkB,MAAA,EAAoC;AAC7F,EAAA,OAAOM,IAAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,8DAAA,CAAA;AAAA,IAuBb,IAAA,EAAM;AAAA,MACJ,YAAYA,IAAAA,CAAK,MAAA,CACd,MAAA,EAAO,CACP,UAAS,CACT,QAAA;AAAA,QACC;AAAA,OACF;AAAA,MACF,OAAA,EAASA,KAAK,MAAA,CACX,MAAA,GACA,QAAA,EAAS,CACT,SAAS,qEAAqE,CAAA;AAAA,MACjF,gBAAA,EAAkBA,IAAAA,CAAK,MAAA,CACpB,MAAA,CAAO;AAAA,QACN,MAAMA,IAAAA,CAAK,MAAA,CAAO,KAAK,CAAC,SAAA,EAAW,QAAQ,CAAC,CAAA;AAAA,QAC5C,UAAA,EAAYA,IAAAA,CAAK,MAAA,CAAO,MAAA,EAAO;AAAA,QAC/B,iBAAA,EAAmBA,IAAAA,CAAK,MAAA,CAAO,MAAA,GAAS,QAAA,EAAS;AAAA,QACjD,oBAAA,EAAsBA,IAAAA,CAAK,MAAA,CAAO,MAAA,GAAS,QAAA,EAAS;AAAA,QACpD,eAAA,EAAiBA,IAAAA,CAAK,MAAA,CAAO,MAAA,GAAS,QAAA;AAAS,OAChD,CAAA,CACA,QAAA,EAAS,CACT,QAAA;AAAA,QACC;AAAA;AACF,KACJ;AAAA,IAEA,MAAM,QAAQ,IAAA,EAAuB;AACnC,MAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,CAAiB,GAAA,EAAK,QAAQ,IAA0B,CAAA;AAC7E,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,IACvC;AAAA,GACD,CAAA;AACH;AASA,SAAS,wBAAwB,IAAA,EAAuD;AAEtF,EAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EACd;AAGA,EAAA,IAAI,KAAK,UAAA,EAAY;AACnB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,SAAA;AAAA,MACN,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,mBAAmB,IAAA,CAAK;AAAA,KAC1B;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,eAAe,gBAAA,CACb,GAAA,EACA,MAAA,EACA,IAAA,EAC+B;AAE/B,EAAA,MAAM,gBAAA,GAAmB,wBAAwB,IAAI,CAAA;AAGrD,EAAA,MAAM,cAAA,GAAuC,yBAAyB,gBAAgB,CAAA;AACtF,EAAA,IAAI,CAAC,eAAe,KAAA,EAAO;AACzB,IAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,WAAA,EAAa,cAAc,CAAA;AACjE,IAAAN,KAAAA,CAAI,KAAK,kCAAA,EAAoC;AAAA,MAC3C,OAAO,cAAA,CAAe,KAAA;AAAA,MACtB,eAAe,cAAA,CAAe;AAAA,KAC/B,CAAA;AACD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,eAAe,KAAA,IAAS,wBAAA;AAAA,MAC/B,UAAA,EAAY,sDAAA;AAAA,MACZ;AAAA,KACF;AAAA,EACF;AAGA,EAAA,MAAM,YAAA,GAAe,gBAAA;AACrB,EAAA,MAAM,aAAa,YAAA,CAAa,UAAA;AAEhC,EAAAA,KAAAA,CAAI,MAAM,kCAAA,EAAoC,EAAE,MAAM,YAAA,CAAa,IAAA,EAAM,YAAY,CAAA;AAGrF,EAAA,MAAM,MAAA,GAAS,MAAM,oBAAA,CAAqB,GAAA,CAAI,WAAW,YAAY,CAAA;AAGrE,EAAA,MAAM,SAAS,MAAM,yBAAA;AAAA,IACnB,GAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,sCAAsC,UAAU,CAAA,CAAA;AAAA,MACvD,YAAA,EAAc,WAAA;AAAA,MACd,UAAA,EAAY;AAAA,KACd;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAAA,KAAAA,CAAI,KAAK,mCAAA,EAAqC;AAAA,MAC5C,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,kBAAkB,MAAA,CAAO;AAAA,KAC1B,CAAA;AACD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,UAAA,EAAY,mDAAA;AAAA,MACZ,kBAAkB,MAAA,CAAO;AAAA,KAC3B;AAAA,EACF;AAEA,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AAGpB,EAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,2BAAA;AAAA,MACP,UAAA,EAAY,KAAK,iBAAA,CAAkB;AAAA,KACrC;AAAA,EACF;AAGA,EAAA,MAAM,aAAaE,IAAAA,CAAK,GAAA,CAAI,WAAW,MAAA,EAAQ,aAAA,EAAe,UAAU,aAAa,CAAA;AAErF,EAAA,IAAI,KAAK,QAAA,EAAU;AACjB,IAAA,IAAI;AACF,MAAA,MAAMS,MAAMJ,OAAAA,CAAQ,UAAU,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACpD,MAAA,MAAMK,SAAAA,CAAU,UAAA,EAAY,IAAA,CAAK,QAAA,EAAU,OAAO,CAAA;AAAA,IACpD,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,uCAAuC,OAAO,CAAA,CAAA;AAAA,QACrD,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY,IAAA,CAAK,QAAA,GAAW,UAAA,GAAa,MAAA;AAAA,IACzC,QAAQ,IAAA,CAAK,MAAA,EAAQ,IAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAAA,IACtC,WAAW,IAAA,CAAK,SAAA,EAAW,IAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAAA,IAC5C,YAAY,IAAA,CAAK;AAAA,GACnB;AACF;AASA,eAAe,oBAAA,CACb,YACA,OAAA,EACiB;AAEjB,EAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB,WAAA,EAAa,UAAU,CAAA;AAC5D,EAAA,IAAI,SAAS,MAAA,CAAO,OAAA;AAGpB,EAAA,MAAM,YAAA,GAAyB;AAAA,IAC7B,CAAA,qCAAA,EAAwC,QAAQ,UAAU,CAAA,QAAA,CAAA;AAAA,IAC1D,oDAAA;AAAA,IACA,sCAAA;AAAA,IACA,gCAAA;AAAA,IACA,gCAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,IAAI,OAAA,CAAQ,SAAS,QAAA,EAAU;AAC7B,IAAA,YAAA,CAAa,OAAA,CAAQ,CAAA,+BAAA,EAAkC,OAAA,CAAQ,oBAAoB,CAAA,CAAE,CAAA;AACrF,IAAA,YAAA,CAAa,IAAA,CAAK,CAAA,qBAAA,EAAwB,OAAA,CAAQ,eAAe,CAAA,CAAE,CAAA;AAAA,EACrE;AAGA,EAAA,MAAA,IAAU,oBAAoB,gBAAA,EAAkB;AAAA,IAC9C,aAAa,OAAA,CAAQ,IAAA;AAAA,IACrB,YAAY,OAAA,CAAQ,UAAA;AAAA,IACpB,iBAAA,EAAmB,OAAA,CAAQ,IAAA,KAAS,SAAA,GAAY,QAAQ,iBAAA,GAAoB,MAAA;AAAA,IAC5E,oBAAA,EAAsB,OAAA,CAAQ,IAAA,KAAS,QAAA,GAAW,QAAQ,oBAAA,GAAuB,MAAA;AAAA,IACjF,eAAA,EAAiB,OAAA,CAAQ,IAAA,KAAS,QAAA,GAAW,QAAQ,eAAA,GAAkB,MAAA;AAAA,IACvE,UAAA,EAAY,qCAAA;AAAA,IACZ;AAAA,GACD,CAAA;AAED,EAAA,OAAO,MAAA;AACT;ACpSA,IAAMZ,KAAAA,GAAM,mBAAmB,mBAAmB,CAAA;AAiG3C,SAAS,qBAAA,CAAsB,KAAkB,MAAA,EAAoC;AAC1F,EAAA,OAAOM,IAAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oDAAA,CAAA;AAAA,IAuBb,IAAA,EAAM;AAAA,MACJ,YAAA,EAAcA,KAAK,MAAA,CAChB,MAAA,GACA,QAAA,EAAS,CACT,SAAS,iEAAiE,CAAA;AAAA,MAC7E,SAAA,EAAWA,KAAK,MAAA,CACb,MAAA,GACA,QAAA,EAAS,CACT,SAAS,2DAA2D,CAAA;AAAA,MACvE,YAAA,EAAcA,KAAK,MAAA,CAChB,MAAA,GACA,QAAA,EAAS,CACT,SAAS,sEAAsE,CAAA;AAAA,MAClF,eAAeA,IAAAA,CAAK,MAAA,CACjB,KAAA,CAAMA,IAAAA,CAAK,OAAO,IAAA,CAAK,CAAC,SAAA,EAAW,YAAA,EAAc,YAAY,CAAC,CAAC,EAC/D,QAAA,EAAS,CACT,SAAS,+DAA+D,CAAA;AAAA,MAC3E,UAAA,EAAYA,IAAAA,CAAK,MAAA,CACd,MAAA,CAAO;AAAA,QACN,IAAA,EAAMA,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,YAAA,EAAc,cAAA,EAAgB,iBAAiB,CAAC,CAAA;AAAA,QACxE,YAAA,EAAcA,IAAAA,CAAK,MAAA,CAAO,MAAA,EAAO;AAAA,QACjC,YAAA,EAAcA,IAAAA,CAAK,MAAA,CAAO,MAAA,EAAO;AAAA,QACjC,SAAA,EAAWA,IAAAA,CAAK,MAAA,CAAO,MAAA,GAAS,QAAA,EAAS;AAAA,QACzC,WAAA,EAAaA,IAAAA,CAAK,MAAA,CAAO,MAAA,GAAS,QAAA,EAAS;AAAA,QAC3C,YAAA,EAAcA,IAAAA,CAAK,MAAA,CAAO,MAAA,GAAS,QAAA;AAAS,OAC7C,CAAA,CACA,QAAA,EAAS,CACT,QAAA;AAAA,QACC;AAAA;AACF,KACJ;AAAA,IAEA,MAAM,QAAQ,IAAA,EAAuB;AACnC,MAAA,MAAM,MAAA,GAAS,MAAM,oBAAA,CAAqB,GAAA,EAAK,QAAQ,IAAuB,CAAA;AAC9E,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,IACvC;AAAA,GACD,CAAA;AACH;AASA,SAAS,iBAAA,CAAkB,MAAuB,UAAA,EAA2C;AAE3F,EAAA,IAAI,KAAK,UAAA,EAAY;AACnB,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAGA,EAAA,IAAI,KAAK,YAAA,EAAc;AACrB,IAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,YAAA,CAC7B,WAAA,EAAY,CACZ,OAAA,CAAQ,aAAA,EAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAEvB,IAAA,MAAM,YAAA,GACJ,KAAK,YAAA,IACLJ,IAAAA,CAAK,YAAY,MAAA,EAAQ,aAAA,EAAe,WAAA,EAAa,kBAAA,EAAoB,aAAa,CAAA;AAExF,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,YAAA;AAAA,MACN,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,YAAA;AAAA,MACA,SAAA,EAAW,KAAK,SAAA,IAAa;AAAA,KAC/B;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,eAAe,oBAAA,CACb,GAAA,EACA,MAAA,EACA,IAAA,EAC4B;AAE5B,EAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,IAAA,EAAM,GAAA,CAAI,SAAS,CAAA;AAGxD,EAAA,MAAM,cAAA,GAAuC,mBAAmB,UAAU,CAAA;AAC1E,EAAA,IAAI,CAAC,eAAe,KAAA,EAAO;AACzB,IAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,KAAA,EAAO,cAAc,CAAA;AAC3D,IAAAF,KAAAA,CAAI,KAAK,4BAAA,EAA8B;AAAA,MACrC,OAAO,cAAA,CAAe,KAAA;AAAA,MACtB,eAAe,cAAA,CAAe;AAAA,KAC/B,CAAA;AACD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,eAAe,KAAA,IAAS,wBAAA;AAAA,MAC/B,UAAA,EAAY,gDAAA;AAAA,MACZ;AAAA,KACF;AAAA,EACF;AAGA,EAAA,MAAM,YAAA,GAAe,UAAA;AACrB,EAAA,MAAM,eAAe,YAAA,CAAa,YAAA;AAClC,EAAA,MAAM,eAAe,YAAA,CAAa,YAAA;AAElC,EAAAA,KAAAA,CAAI,MAAM,4BAAA,EAA8B,EAAE,MAAM,YAAA,CAAa,IAAA,EAAM,cAAc,CAAA;AAGjF,EAAA,MAAM,kBAAA,GAAqB,YAAA,CACxB,WAAA,EAAY,CACZ,OAAA,CAAQ,eAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAGvB,EAAA,IAAI,UAAA,GAAa,YAAA;AACjB,EAAA,IAAI,YAAA,CAAa,SAAS,YAAA,EAAc;AACtC,IAAA,UAAA,GAAa,YAAA,CAAa,SAAA,CACvB,WAAA,EAAY,CACZ,OAAA,CAAQ,eAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAAA,EACzB,CAAA,MAAA,IAAW,YAAA,CAAa,IAAA,KAAS,cAAA,EAAgB;AAC/C,IAAA,UAAA,GAAa,YAAA,CAAa,WAAA,CACvB,WAAA,EAAY,CACZ,OAAA,CAAQ,eAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAAA,EACzB,CAAA,MAAA,IAAW,YAAA,CAAa,IAAA,KAAS,iBAAA,EAAmB;AAClD,IAAA,UAAA,GAAa,YAAA,CAAa,YAAA,CACvB,WAAA,EAAY,CACZ,OAAA,CAAQ,eAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAAA,EACzB;AAGA,EAAA,IAAI,eAAA,GAAkB,EAAA;AACtB,EAAA,IAAI;AACF,IAAA,eAAA,GAAkB,MAAMI,QAAAA,CAAS,YAAA,EAAc,OAAO,CAAA;AAAA,EACxD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,gCAAgC,YAAY,CAAA,CAAA;AAAA,MACnD,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAGA,EAAA,MAAM,SAAS,MAAM,cAAA;AAAA,IACnB,GAAA,CAAI,SAAA;AAAA,IACJ,YAAA;AAAA,IACA,eAAA;AAAA,IACA,IAAA,CAAK;AAAA,GACP;AAGA,EAAA,MAAM,SAAS,MAAM,yBAAA;AAAA,IACnB,GAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,oCAAoC,YAAY,CAAA,CAAA;AAAA,MACvD,YAAA,EAAc,KAAA;AAAA,MACd,UAAA,EAAY;AAAA,KACd;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAAJ,KAAAA,CAAI,KAAK,6BAAA,EAA+B;AAAA,MACtC,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,kBAAkB,MAAA,CAAO;AAAA,KAC1B,CAAA;AACD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,UAAA,EAAY,mDAAA;AAAA,MACZ,kBAAkB,MAAA,CAAO;AAAA,KAC3B;AAAA,EACF;AAEA,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AAGpB,EAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,2BAAA;AAAA,MACP,UAAA,EAAY,KAAK,iBAAA,CAAkB;AAAA,KACrC;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAaE,IAAAA;AAAA,IACjB,GAAA,CAAI,SAAA;AAAA,IACJ,MAAA;AAAA,IACA,aAAA;AAAA,IACA,WAAA;AAAA,IACA,kBAAA;AAAA,IACA,WAAA;AAAA,IACA,GAAG,UAAU,CAAA,QAAA;AAAA,GACf;AAEA,EAAA,IAAI,KAAK,QAAA,EAAU;AACjB,IAAA,IAAI;AACF,MAAA,MAAMS,MAAMJ,OAAAA,CAAQ,UAAU,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACpD,MAAA,MAAMK,SAAAA,CAAU,UAAA,EAAY,IAAA,CAAK,QAAA,EAAU,OAAO,CAAA;AAAA,IACpD,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,iCAAiC,OAAO,CAAA,CAAA;AAAA,QAC/C,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAAA,EACF;AAIA,EAAA,MAAM,SAAA,GACJ,IAAA,CAAK,SAAA,EAAW,GAAA,CAAI,CAAC,CAAA,KAAM;AAEzB,IAAA,IAAI,IAAA,GAAgD,SAAA;AACpD,IAAA,MAAM,SAAA,GAAY,CAAA,CAAE,IAAA,CAAK,WAAA,EAAY;AACrC,IAAA,IACE,SAAA,CAAU,QAAA,CAAS,YAAY,CAAA,IAC/B,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,IACzB,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA,EAC3B;AACA,MAAA,IAAA,GAAO,YAAA;AAAA,IACT,CAAA,MAAA,IAAW,UAAU,QAAA,CAAS,YAAY,KAAK,SAAA,CAAU,QAAA,CAAS,SAAS,CAAA,EAAG;AAC5E,MAAA,IAAA,GAAO,YAAA;AAAA,IACT;AAEA,IAAA,MAAM,QAAA,GAAwB;AAAA,MAC5B,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,IAAA;AAAA,MACA,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,MAAM,CAAA,CAAE,IAAA;AAAA;AAAA,MAER,MAAM,CAAA,CAAE;AAAA,KACV;AACA,IAAA,OAAO,QAAA;AAAA,EACT,CAAC,KAAK,EAAC;AAGT,EAAA,MAAM,gBAAA,GAAmB,UAAU,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,SAAS,CAAA,CAAE,MAAA;AACvE,EAAA,MAAM,mBAAA,GAAsB,UAAU,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,YAAY,CAAA,CAAE,MAAA;AAC7E,EAAA,MAAM,mBAAA,GAAsB,UAAU,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,YAAY,CAAA,CAAE,MAAA;AAE7E,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY,IAAA,CAAK,QAAA,GAAW,UAAA,GAAa,MAAA;AAAA,IACzC,SAAA,EAAW,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY,MAAA;AAAA,IAC9C,gBAAA;AAAA,IACA,mBAAA;AAAA,IACA;AAAA,GACF;AACF;AASA,eAAe,cAAA,CACb,UAAA,EACA,OAAA,EACA,eAAA,EACA,aAAA,EACiB;AAEjB,EAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB,KAAA,EAAO,UAAU,CAAA;AACtD,EAAA,IAAI,SAAS,MAAA,CAAO,OAAA;AAEpB,EAAA,MAAM,eAAe,OAAA,CAAQ,YAAA;AAC7B,EAAA,MAAM,kBAAA,GAAqB,YAAA,CACxB,WAAA,EAAY,CACZ,OAAA,CAAQ,eAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAGvB,EAAA,MAAM,KAAA,GAAQ,aAAA,IAAiB,CAAC,SAAA,EAAW,cAAc,YAAY,CAAA;AACrE,EAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,KAAK,CAAC,CAAA,UAAA,CAAY,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAGvE,EAAA,MAAM,YAAA,GAAyB;AAAA,IAC7B,kFAAA;AAAA,IACA,6DAAA;AAAA,IACA,gEAAA;AAAA,IACA,6CAAA;AAAA,IACA,mDAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,IAAI,iBAAA;AACJ,EAAA,IAAI,OAAA,CAAQ,SAAS,YAAA,EAAc;AACjC,IAAA,iBAAA,GAAoB,CAAA,OAAA,EAAU,QAAQ,SAAS,CAAA,CAAA;AAC/C,IAAA,YAAA,CAAa,OAAA,CAAQ,CAAA,gCAAA,EAAmC,OAAA,CAAQ,SAAS,CAAA,CAAE,CAAA;AAAA,EAC7E,CAAA,MAAA,IAAW,OAAA,CAAQ,IAAA,KAAS,cAAA,EAAgB;AAC1C,IAAA,iBAAA,GAAoB,CAAA,SAAA,EAAY,QAAQ,WAAW,CAAA,CAAA;AACnD,IAAA,YAAA,CAAa,OAAA,CAAQ,CAAA,kCAAA,EAAqC,OAAA,CAAQ,WAAW,CAAA,CAAE,CAAA;AAAA,EACjF,CAAA,MAAO;AACL,IAAA,iBAAA,GAAoB,CAAA,oBAAA,EAAuB,QAAQ,YAAY,CAAA,CAAA;AAC/D,IAAA,YAAA,CAAa,OAAA;AAAA,MACX,CAAA,kDAAA,EAAqD,QAAQ,YAAY,CAAA;AAAA,KAC3E;AAAA,EACF;AAGA,EAAA,MAAA,IAAU,oBAAoB,qBAAA,EAAuB;AAAA,IACnD,aAAa,OAAA,CAAQ,IAAA;AAAA,IACrB,YAAA;AAAA,IACA,MAAA,EAAQ,iBAAA;AAAA,IACR,aAAA,EAAe,gBAAA;AAAA,IACf,eAAA,EAAiB,eAAA;AAAA,IACjB,UAAA,EAAY,8BAA8B,kBAAkB,CAAA,oBAAA,CAAA;AAAA,IAC5D;AAAA,GACD,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AC7bA,IAAMZ,KAAAA,GAAM,mBAAmB,qBAAqB,CAAA;AA0F7C,SAAS,uBAAA,CAAwB,KAAkB,OAAA,EAAqC;AAC7F,EAAA,OAAOM,IAAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,iDAAA,CAAA;AAAA,IAwBb,IAAA,EAAM;AAAA,MACJ,KAAA,EAAOA,IAAAA,CAAK,MAAA,CACT,IAAA,CAAK,CAAC,KAAA,EAAO,QAAA,EAAU,UAAA,EAAY,WAAW,CAAC,CAAA,CAC/C,QAAA,EAAS,CACT,SAAS,mEAAmE,CAAA;AAAA,MAC/E,YAAA,EAAcA,KAAK,MAAA,CAChB,MAAA,GACA,QAAA,EAAS,CACT,SAAS,oEAAoE,CAAA;AAAA,MAChF,GAAA,EAAKA,KAAK,MAAA,CACP,OAAA,GACA,QAAA,EAAS,CACT,SAAS,iEAAiE,CAAA;AAAA,MAC7E,gBAAA,EAAkBA,IAAAA,CAAK,MAAA,CACpB,MAAA,CAAO;AAAA,QACN,IAAA,EAAMA,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,MAAA,EAAQ,UAAA,EAAY,WAAW,CAAC,CAAA;AAAA,QACxD,cAAA,EAAgBA,IAAAA,CAAK,MAAA,CAAO,MAAA,GAAS,QAAA,EAAS;AAAA,QAC9C,YAAA,EAAcA,IAAAA,CAAK,MAAA,CAAO,MAAA,GAAS,QAAA,EAAS;AAAA,QAC5C,aAAA,EAAeA,IAAAA,CAAK,MAAA,CAAO,MAAA,GAAS,QAAA;AAAS,OAC9C,CAAA,CACA,QAAA,EAAS,CACT,QAAA;AAAA,QACC;AAAA;AACF,KACJ;AAAA,IAEA,MAAM,QAAQ,IAAA,EAAuB;AACnC,MAAA,MAAM,MAAA,GAAS,MAAM,iBAAA,CAAkB,GAAA,EAAK,IAAyB,CAAA;AACrE,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,IACvC;AAAA,GACD,CAAA;AACH;AASA,SAAS,uBAAA,CACP,MACA,UAAA,EACkC;AAElC,EAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,IAAA,OAAO,IAAA,CAAK,gBAAA;AAAA,EACd;AAGA,EAAA,MAAM,cAAA,GAAiBJ,IAAAA,CAAK,UAAA,EAAY,MAAA,EAAQ,aAAa,CAAA;AAC7D,EAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,IAAS,KAAA;AAE5B,EAAA,IAAI,KAAA,KAAU,KAAA,IAAS,KAAA,KAAU,QAAA,EAAU;AACzC,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,MAAA;AAAA,MACN;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,UAAU,UAAA,EAAY;AACxB,IAAA,MAAM,YAAA,GAAe,KAAK,YAAA,IAAgB,GAAA;AAC1C,IAAA,MAAM,cAAA,GAAiB,YAAA,CACpB,WAAA,EAAY,CACZ,OAAA,CAAQ,gBAAgB,GAAG,CAAA,CAC3B,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AACvB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,UAAA;AAAA,MACN,YAAA,EAAcA,IAAAA,CAAK,cAAA,EAAgB,WAAA,EAAa,cAAc;AAAA,KAChE;AAAA,EACF;AAEA,EAAA,IAAI,UAAU,WAAA,EAAa;AACzB,IAAA,MAAM,YAAA,GAAe,KAAK,YAAA,IAAgB,GAAA;AAC1C,IAAA,MAAM,cAAA,GAAiB,YAAA,CACpB,WAAA,EAAY,CACZ,OAAA,CAAQ,gBAAgB,GAAG,CAAA,CAC3B,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AACvB,IAAA,MAAM,YAAA,GAAeA,IAAAA,CAAK,cAAA,EAAgB,WAAA,EAAa,cAAc,CAAA;AACrE,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,WAAA;AAAA,MACN,YAAA;AAAA,MACA,aAAA,EAAeA,IAAAA,CAAK,YAAA,EAAc,WAAW;AAAA,KAC/C;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,MAAA;AAAA,IACN;AAAA,GACF;AACF;AAEA,eAAe,iBAAA,CACb,KACA,IAAA,EAC8B;AAE9B,EAAA,MAAM,gBAAA,GAAmB,uBAAA,CAAwB,IAAA,EAAM,GAAA,CAAI,SAAS,CAAA;AAGpE,EAAA,MAAM,cAAA,GAAuC,8BAA8B,gBAAgB,CAAA;AAC3F,EAAA,IAAI,CAAC,eAAe,KAAA,EAAO;AACzB,IAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,iBAAA,EAAmB,cAAc,CAAA;AACvE,IAAAF,KAAAA,CAAI,KAAK,wCAAA,EAA0C;AAAA,MACjD,OAAO,cAAA,CAAe,KAAA;AAAA,MACtB,eAAe,cAAA,CAAe;AAAA,KAC/B,CAAA;AACD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,KAAA;AAAA,MACP,QAAQ,EAAC;AAAA,MACT,SAAS,EAAE,MAAA,EAAQ,GAAG,QAAA,EAAU,CAAA,EAAG,OAAO,CAAA,EAAE;AAAA,MAC5C,cAAc,EAAC;AAAA,MACf,KAAA,EAAO,eAAe,KAAA,IAAS,wBAAA;AAAA,MAC/B,UAAA,EAAY,sDAAA;AAAA,MACZ;AAAA,KACF;AAAA,EACF;AAGA,EAAA,MAAM,YAAA,GAAe,gBAAA;AACrB,EAAAA,MAAI,KAAA,CAAM,wCAAA,EAA0C,EAAE,IAAA,EAAM,YAAA,CAAa,MAAM,CAAA;AAE/E,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,MAAM,eAAyB,EAAC;AAChC,EAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,IAAS,KAAA;AAE5B,EAAA,MAAM,aAAA,GAAgBE,IAAAA,CAAK,GAAA,CAAI,SAAA,EAAW,QAAQ,aAAa,CAAA;AAG/D,EAAA,IAAI,KAAA,KAAU,KAAA,IAAS,KAAA,KAAU,QAAA,EAAU;AACzC,IAAA,MAAM,UAAA,GAAaA,IAAAA,CAAK,aAAA,EAAe,QAAA,EAAU,aAAa,CAAA;AAC9D,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAAME,QAAAA,CAAS,UAAA,EAAY,OAAO,CAAA;AAClD,MAAA,YAAA,CAAa,KAAK,UAAU,CAAA;AAC5B,MAAA,MAAA,CAAO,IAAA,CAAK,GAAG,sBAAA,CAAuB,OAAA,EAAS,UAAU,CAAC,CAAA;AAAA,IAC5D,CAAA,CAAA,MAAQ;AACN,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,QAAA,EAAU,OAAA;AAAA,QACV,QAAA,EAAU,cAAA;AAAA,QACV,QAAA,EAAU,UAAA;AAAA,QACV,OAAA,EAAS,2BAAA;AAAA,QACT,UAAA,EAAY;AAAA,OACb,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,IAAI,KAAA,KAAU,KAAA,IAAS,KAAA,KAAU,UAAA,IAAc,UAAU,WAAA,EAAa;AACpE,IAAA,MAAM,YAAA,GAAeF,IAAAA,CAAK,aAAA,EAAe,WAAW,CAAA;AACpD,IAAA,IAAI,eAAyB,EAAC;AAE9B,IAAA,IAAI;AACF,MAAA,MAAM,UAAU,MAAMW,OAAAA,CAAQ,cAAc,EAAE,aAAA,EAAe,MAAM,CAAA;AACnE,MAAA,YAAA,GAAe,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,EAAa,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA;AAAA,IACzE,CAAA,CAAA,MAAQ;AAEN,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,QAAA,EAAU,SAAA;AAAA,QACV,QAAA,EAAU,cAAA;AAAA,QACV,QAAA,EAAU,YAAA;AAAA,QACV,OAAA,EAAS,8BAAA;AAAA,QACT,UAAA,EAAY;AAAA,OACb,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,YAAA,CACrB,WAAA,EAAY,CACZ,OAAA,CAAQ,aAAA,EAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AACvB,MAAA,YAAA,GAAe,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA,KAAM,MAAM,UAAU,CAAA;AAAA,IAC5D;AAEA,IAAA,KAAA,MAAW,eAAe,YAAA,EAAc;AACtC,MAAA,MAAM,YAAA,GAAeX,IAAAA,CAAK,YAAA,EAAc,WAAA,EAAa,aAAa,CAAA;AAGlE,MAAA,IAAI,KAAA,KAAU,KAAA,IAAS,KAAA,KAAU,UAAA,EAAY;AAC3C,QAAA,IAAI;AACF,UAAA,MAAM,OAAA,GAAU,MAAME,QAAAA,CAAS,YAAA,EAAc,OAAO,CAAA;AACpD,UAAA,YAAA,CAAa,KAAK,YAAY,CAAA;AAC9B,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,wBAAA,CAAyB,OAAA,EAAS,YAAY,CAAC,CAAA;AAAA,QAChE,CAAA,CAAA,MAAQ;AACN,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,QAAA,EAAU,OAAA;AAAA,YACV,QAAA,EAAU,cAAA;AAAA,YACV,QAAA,EAAU,YAAA;AAAA,YACV,OAAA,EAAS,mCAAmC,WAAW,CAAA,CAAA;AAAA,YACvD,UAAA,EAAY;AAAA,WACb,CAAA;AAAA,QACH;AAAA,MACF;AAGA,MAAA,IAAI,KAAA,KAAU,KAAA,IAAS,KAAA,KAAU,WAAA,EAAa;AAC5C,QAAA,MAAM,YAAA,GAAeF,IAAAA,CAAK,YAAA,EAAc,WAAA,EAAa,WAAW,CAAA;AAChE,QAAA,IAAI;AACF,UAAA,MAAM,aAAA,GAAgB,MAAMW,OAAAA,CAAQ,YAAY,CAAA;AAChD,UAAA,KAAA,MAAW,gBAAgB,aAAA,EAAe;AACxC,YAAA,IAAI,YAAA,CAAa,QAAA,CAAS,UAAU,CAAA,EAAG;AACrC,cAAA,MAAM,YAAA,GAAeX,IAAAA,CAAK,YAAA,EAAc,YAAY,CAAA;AACpD,cAAA,MAAM,OAAA,GAAU,MAAME,QAAAA,CAAS,YAAA,EAAc,OAAO,CAAA;AACpD,cAAA,YAAA,CAAa,KAAK,YAAY,CAAA;AAC9B,cAAA,MAAA,CAAO,IAAA,CAAK,GAAG,iBAAA,CAAkB,OAAA,EAAS,YAAY,CAAC,CAAA;AAAA,YACzD;AAAA,UACF;AAAA,QACF,CAAA,CAAA,MAAQ;AAEN,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,QAAA,EAAU,MAAA;AAAA,YACV,QAAA,EAAU,cAAA;AAAA,YACV,QAAA,EAAU,YAAA;AAAA,YACV,OAAA,EAAS,0BAA0B,WAAW,CAAA,CAAA;AAAA,YAC9C,UAAA,EAAY;AAAA,WACb,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,MAAA,EAAQ,OAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,OAAO,CAAA,CAAE,MAAA;AAAA,IACrD,QAAA,EAAU,OAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,SAAS,CAAA,CAAE,MAAA;AAAA,IACzD,KAAA,EAAO,OAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,MAAM,CAAA,CAAE;AAAA,GACrD;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,KAAA,EAAO,QAAQ,MAAA,KAAW,CAAA;AAAA,IAC1B,MAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,sBAAA,CAAuB,SAAiB,IAAA,EAAiC;AAChF,EAAA,MAAM,SAA4B,EAAC;AAGnC,EAAA,MAAM,mBAAmB,CAAC,SAAA,EAAW,QAAA,EAAU,WAAA,EAAa,cAAc,UAAU,CAAA;AAEpF,EAAA,KAAA,MAAW,WAAW,gBAAA,EAAkB;AACtC,IAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,CAAM,IAAI,MAAA,CAAO,UAAU,OAAO,CAAA,CAAA,EAAI,GAAG,CAAC,CAAA,EAAG;AACxD,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,QAAA,EAAU,SAAA;AAAA,QACV,QAAA,EAAU,cAAA;AAAA,QACV,QAAA,EAAU,IAAA;AAAA,QACV,OAAA,EAAS,oBAAoB,OAAO,CAAA,CAAA;AAAA,QACpC,UAAA,EAAY,YAAY,OAAO,CAAA,+BAAA;AAAA,OAChC,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,MAAM,sBAAA,GAAyB;AAAA,IAC7B,EAAE,OAAA,EAAS,yCAAA,EAA2C,IAAA,EAAM,sBAAA,EAAuB;AAAA,IACnF,EAAE,OAAA,EAAS,uCAAA,EAAyC,IAAA,EAAM,iBAAA,EAAkB;AAAA,IAC5E,EAAE,OAAA,EAAS,wCAAA,EAA0C,IAAA,EAAM,kBAAA,EAAmB;AAAA,IAC9E,EAAE,OAAA,EAAS,sBAAA,EAAwB,IAAA,EAAM,yBAAA;AAA0B,GACrE;AAEA,EAAA,KAAA,MAAW,EAAE,OAAA,EAAS,IAAA,EAAK,IAAK,sBAAA,EAAwB;AACtD,IAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,EAAG;AACzB,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,QAAA,EAAU,SAAA;AAAA,QACV,QAAA,EAAU,gBAAA;AAAA,QACV,QAAA,EAAU,IAAA;AAAA,QACV,OAAA,EAAS,4BAA4B,IAAI,CAAA,CAAA;AAAA,QACzC,UAAA,EAAY;AAAA,OACb,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,wBAAA,CAAyB,SAAiB,IAAA,EAAiC;AAClF,EAAA,MAAM,SAA4B,EAAC;AAGnC,EAAA,MAAM,gBAAA,GAAmB,CAAC,QAAA,EAAU,UAAA,EAAY,eAAe,iBAAiB,CAAA;AAEhF,EAAA,KAAA,MAAW,WAAW,gBAAA,EAAkB;AACtC,IAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,CAAM,IAAI,MAAA,CAAO,UAAU,OAAO,CAAA,CAAA,EAAI,GAAG,CAAC,CAAA,EAAG;AACxD,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,QAAA,EAAU,SAAA;AAAA,QACV,QAAA,EAAU,cAAA;AAAA,QACV,QAAA,EAAU,IAAA;AAAA,QACV,OAAA,EAAS,oBAAoB,OAAO,CAAA,CAAA;AAAA,QACpC,UAAA,EAAY,YAAY,OAAO,CAAA,wBAAA;AAAA,OAChC,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,KAAA,CAAM,gDAAgD,CAAA;AACnF,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,SAAS,YAAA,CAAa,CAAC,EAAE,KAAA,CAAM,uBAAuB,KAAK,EAAC;AAClE,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAE1B,MAAA,IAAI,KAAA,CAAM,KAAA,CAAM,uEAAuE,CAAA,EAAG;AACxF,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,QAAA,EAAU,OAAA;AAAA,UACV,QAAA,EAAU,QAAA;AAAA,UACV,QAAA,EAAU,IAAA;AAAA,UACV,OAAA,EAAS,UAAU,KAAK,CAAA,wCAAA,CAAA;AAAA,UACxB,UAAA,EAAY,CAAA,gBAAA,EAAmB,gBAAA,CAAiB,KAAK,CAAC,CAAA;AAAA,SACvD,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,KAAA,CAAM,8CAA8C,CAAA;AACnF,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,MAAM,WAAW,cAAA,CAAe,CAAC,EAAE,KAAA,CAAM,0BAA0B,KAAK,EAAC;AACzE,IAAA,KAAA,MAAW,YAAY,QAAA,EAAU;AAC/B,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AAE/C,MAAA,IAAI,OAAA,CAAQ,KAAA,CAAM,SAAS,CAAA,EAAG;AAC5B,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,QAAA,EAAU,OAAA;AAAA,UACV,QAAA,EAAU,QAAA;AAAA,UACV,QAAA,EAAU,IAAA;AAAA,UACV,OAAA,EAAS,YAAY,OAAO,CAAA,+BAAA,CAAA;AAAA,UAC5B,UAAA,EAAY,CAAA,gBAAA,EAAmB,iBAAA,CAAkB,OAAO,CAAC,CAAA;AAAA,SAC1D,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,sBAAA,GAAyB;AAAA,IAC7B,EAAE,OAAA,EAAS,yCAAA,EAA2C,IAAA,EAAM,sBAAA,EAAuB;AAAA,IACnF,EAAE,OAAA,EAAS,uCAAA,EAAyC,IAAA,EAAM,iBAAA,EAAkB;AAAA,IAC5E,EAAE,OAAA,EAAS,wCAAA,EAA0C,IAAA,EAAM,qBAAA;AAAsB,GACnF;AAEA,EAAA,KAAA,MAAW,EAAE,OAAA,EAAS,IAAA,EAAK,IAAK,sBAAA,EAAwB;AACtD,IAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,EAAG;AACzB,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,QAAA,EAAU,SAAA;AAAA,QACV,QAAA,EAAU,gBAAA;AAAA,QACV,QAAA,EAAU,IAAA;AAAA,QACV,OAAA,EAAS,qBAAqB,IAAI,CAAA,CAAA;AAAA,QAClC,UAAA,EAAY;AAAA,OACb,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,iBAAA,CAAkB,SAAiB,IAAA,EAAiC;AAC3E,EAAA,MAAM,SAA4B,EAAC;AAGnC,EAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,CAAM,YAAY,CAAA,EAAG;AAChC,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,QAAA,EAAU,OAAA;AAAA,MACV,QAAA,EAAU,cAAA;AAAA,MACV,QAAA,EAAU,IAAA;AAAA,MACV,OAAA,EAAS,wBAAA;AAAA,MACT,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,CAAM,YAAY,CAAA,EAAG;AAChC,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,QAAA,EAAU,OAAA;AAAA,MACV,QAAA,EAAU,cAAA;AAAA,MACV,QAAA,EAAU,IAAA;AAAA,MACV,OAAA,EAAS,sBAAA;AAAA,MACT,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,eAAA,GAAkB,OAAA,CAAQ,QAAA,CAAS,gDAAgD,CAAA;AACzF,EAAA,KAAA,MAAW,SAAS,eAAA,EAAiB;AACnC,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK;AACnC,IAAA,MAAM,YAAA,GAAe,MAAM,CAAC,CAAA;AAE5B,IAAA,IAAI,CAAC,YAAA,CAAa,KAAA,CAAM,YAAY,CAAA,EAAG;AACrC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,QAAA,EAAU,SAAA;AAAA,QACV,QAAA,EAAU,cAAA;AAAA,QACV,QAAA,EAAU,IAAA;AAAA,QACV,OAAA,EAAS,aAAa,YAAY,CAAA,sBAAA,CAAA;AAAA,QAClC,UAAA,EAAY;AAAA,OACb,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,CAAC,YAAA,CAAa,KAAA,CAAM,WAAW,CAAA,EAAG;AACpC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,QAAA,EAAU,OAAA;AAAA,QACV,QAAA,EAAU,cAAA;AAAA,QACV,QAAA,EAAU,IAAA;AAAA,QACV,OAAA,EAAS,aAAa,YAAY,CAAA,qBAAA,CAAA;AAAA,QAClC,UAAA,EAAY;AAAA,OACb,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,CAAC,YAAA,CAAa,KAAA,CAAM,WAAW,CAAA,EAAG;AACpC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,QAAA,EAAU,OAAA;AAAA,QACV,QAAA,EAAU,cAAA;AAAA,QACV,QAAA,EAAU,IAAA;AAAA,QACV,OAAA,EAAS,aAAa,YAAY,CAAA,qBAAA,CAAA;AAAA,QAClC,UAAA,EAAY;AAAA,OACb,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,MAAM,mBAAA,GAAsB;AAAA,IAC1B,EAAE,OAAA,EAAS,cAAA,EAAgB,IAAA,EAAM,uBAAA,EAAwB;AAAA,IACzD,EAAE,OAAA,EAAS,YAAA,EAAc,IAAA,EAAM,+BAAA,EAAgC;AAAA,IAC/D,EAAE,OAAA,EAAS,WAAA,EAAa,IAAA,EAAM,aAAA,EAAc;AAAA,IAC5C,EAAE,OAAA,EAAS,UAAA,EAAY,IAAA,EAAM,YAAA;AAAa,GAC5C;AAEA,EAAA,KAAA,MAAW,EAAE,OAAA,EAAS,IAAA,EAAK,IAAK,mBAAA,EAAqB;AACnD,IAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA,EAAG;AACzB,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,QAAA,EAAU,SAAA;AAAA,QACV,QAAA,EAAU,cAAA;AAAA,QACV,QAAA,EAAU,IAAA;AAAA,QACV,OAAA,EAAS,qBAAqB,IAAI,CAAA,CAAA;AAAA,QAClC,UAAA,EAAY;AAAA,OACb,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,iBAAiB,OAAA,EAAyB;AAEjD,EAAA,IAAI,OAAA,CAAQ,WAAW,QAAQ,CAAA,SAAU,OAAA,CAAQ,OAAA,CAAQ,UAAU,SAAS,CAAA;AAC5E,EAAA,IAAI,OAAA,CAAQ,WAAW,QAAQ,CAAA,SAAU,OAAA,CAAQ,OAAA,CAAQ,UAAU,SAAS,CAAA;AAC5E,EAAA,IAAI,OAAA,CAAQ,WAAW,QAAQ,CAAA,SAAU,OAAA,CAAQ,OAAA,CAAQ,UAAU,SAAS,CAAA;AAC5E,EAAA,IAAI,OAAA,CAAQ,WAAW,KAAK,CAAA,SAAU,OAAA,CAAQ,OAAA,CAAQ,OAAO,OAAO,CAAA;AACpE,EAAA,IAAI,OAAA,CAAQ,WAAW,QAAQ,CAAA,SAAU,OAAA,CAAQ,OAAA,CAAQ,UAAU,SAAS,CAAA;AAC5E,EAAA,IAAI,OAAA,CAAQ,WAAW,KAAK,CAAA,SAAU,OAAA,CAAQ,OAAA,CAAQ,OAAO,KAAK,CAAA;AAClE,EAAA,IAAI,OAAA,CAAQ,WAAW,MAAM,CAAA,SAAU,OAAA,CAAQ,OAAA,CAAQ,QAAQ,MAAM,CAAA;AACrE,EAAA,IAAI,OAAA,CAAQ,WAAW,QAAQ,CAAA,SAAU,OAAA,CAAQ,OAAA,CAAQ,UAAU,WAAW,CAAA;AAC9E,EAAA,IAAI,OAAA,CAAQ,WAAW,SAAS,CAAA,SAAU,OAAA,CAAQ,OAAA,CAAQ,WAAW,WAAW,CAAA;AAChF,EAAA,OAAO,GAAG,OAAO,CAAA,EAAA,CAAA;AACnB;AAEA,SAAS,kBAAkB,KAAA,EAAuB;AAEhD,EAAA,IAAI,KAAA,CAAM,SAAS,SAAS,CAAA,SAAU,KAAA,CAAM,OAAA,CAAQ,WAAW,QAAQ,CAAA;AACvE,EAAA,IAAI,KAAA,CAAM,SAAS,SAAS,CAAA,SAAU,KAAA,CAAM,OAAA,CAAQ,WAAW,QAAQ,CAAA;AACvE,EAAA,IAAI,KAAA,CAAM,SAAS,SAAS,CAAA,SAAU,KAAA,CAAM,OAAA,CAAQ,WAAW,QAAQ,CAAA;AACvE,EAAA,IAAI,KAAA,CAAM,SAAS,OAAO,CAAA,SAAU,KAAA,CAAM,OAAA,CAAQ,SAAS,KAAK,CAAA;AAChE,EAAA,IAAI,KAAA,CAAM,SAAS,SAAS,CAAA,SAAU,KAAA,CAAM,OAAA,CAAQ,WAAW,QAAQ,CAAA;AACvE,EAAA,IAAI,KAAA,CAAM,SAAS,MAAM,CAAA,SAAU,KAAA,CAAM,OAAA,CAAQ,QAAQ,MAAM,CAAA;AAC/D,EAAA,IAAI,KAAA,CAAM,SAAS,WAAW,CAAA,SAAU,KAAA,CAAM,OAAA,CAAQ,aAAa,QAAQ,CAAA;AAC3E,EAAA,IAAI,KAAA,CAAM,SAAS,WAAW,CAAA,SAAU,KAAA,CAAM,OAAA,CAAQ,aAAa,SAAS,CAAA;AAC5E,EAAA,IAAI,KAAA,CAAM,SAAS,IAAI,CAAA,SAAU,KAAA,CAAM,KAAA,CAAM,GAAG,EAAE,CAAA;AAClD,EAAA,OAAO,KAAA;AACT;ACrlBO,SAAS,oBAAA,CAAqB,SAAuB,OAAA,EAAqC;AAC/F,EAAA,OAAOE,IAAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA,wFAAA,CAAA;AAAA,IASb,MAAM,EAAC;AAAA,IAEP,MAAM,OAAA,GAA2B;AAC/B,MAAA,MAAM,YAAA,GAAe,QAAQ,eAAA,EAAgB;AAE7C,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,OAAO,KAAK,SAAA,CAAU;AAAA,UACpB,MAAA,EAAQ,iBAAA;AAAA,UACR,OAAA,EAAS;AAAA,SACV,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,sBAAA,EAAuB;AACrD,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,UAAA,EAAW,CAAE,MAAM,GAAG,CAAA;AAE9C,MAAA,OAAO,IAAA,CAAK,SAAA;AAAA,QACV;AAAA,UACE,YAAA,EAAc;AAAA,YACZ,QAAQ,YAAA,CAAa,WAAA;AAAA,YACrB,QAAQ,YAAA,CAAa,MAAA;AAAA,YACrB,WAAW,YAAA,CAAa,SAAA;AAAA,YACxB,aAAa,YAAA,CAAa;AAAA,WAC5B;AAAA,UACA,cAAA,EAAgB,OAAA;AAAA,UAChB,aAAA,EAAe,OAAA;AAAA,UACf,SAAA,EAAW,QAAQ,YAAA;AAAa,SAClC;AAAA,QACA,IAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,GACD,CAAA;AACH;AChDA,IAAMN,KAAAA,GAAM,mBAAmB,WAAW,CAAA;AAEnC,SAAS,kBAAA,CACd,GAAA,EACA,OAAA,EACA,MAAA,EACgB;AAChB,EAAA,OAAOM,IAAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA,2EAAA,CAAA;AAAA,IASb,IAAA,EAAM;AAAA,MACJ,WAAA,EAAaA,IAAAA,CAAK,MAAA,CACf,MAAA,EAAO,CACP,GAAA,EAAI,CACJ,QAAA,EAAS,CACT,QAAA,EAAS,CACT,QAAA,CAAS,0DAA0D;AAAA,KACxE;AAAA,IAEA,MAAM,QAAQ,IAAA,EAAuB;AACnC,MAAA,MAAM,SAAS,MAAM,eAAA,CAAgB,KAAK,OAAA,EAAS,MAAA,EAAQ,KAAK,WAAW,CAAA;AAC3E,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,IACvC;AAAA,GACD,CAAA;AACH;AAEA,eAAe,eAAA,CACb,GAAA,EACA,OAAA,EACA,MAAA,EACA,WAAA,EACyB;AACzB,EAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,SAAS,CAAC,MAAA,CAAO,QAAQ,IAAA,EAAM;AACjD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,8BAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAEA,EAAA,IAAI,iBAAA,GAAoB,WAAA;AAExB,EAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,IAAA,MAAM,cAAc,MAAM,UAAA,CAAW,GAAA,EAAK,MAAA,EAAQ,SAAS,CAAC,CAAA;AAC5D,IAAA,IAAI,WAAA,CAAY,WAAW,CAAA,EAAG;AAC5B,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,uBAAA;AAAA,QACP,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AACA,IAAA,iBAAA,GAAoB,WAAA,CAAY,CAAC,CAAA,CAAE,MAAA;AAAA,EACrC;AAEA,EAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,CAAW,GAAA,EAAK,QAAQ,iBAAiB,CAAA;AAC7D,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,UAAU,iBAAiB,CAAA,UAAA,CAAA;AAAA,MAClC,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAEA,EAAA,MAAM,kBAAA,GAAqB,uBAAA,CAAwB,KAAA,CAAM,IAAI,CAAA;AAG7D,EAAA,IAAI,KAAA,CAAM,KAAA,KAAU,MAAA,IAAU,KAAA,CAAM,UAAU,MAAA,EAAQ;AACpD,IAAA,MAAM,QAAQ,MAAM,iBAAA,CAAkB,KAAK,MAAA,EAAQ,KAAA,CAAM,QAAQ,aAAa,CAAA;AAC9E,IAAA,IAAI,KAAA,EAAO;AACT,MAAAN,MAAI,IAAA,CAAK,iCAAA,EAAmC,EAAE,WAAA,EAAa,KAAA,CAAM,QAAQ,CAAA;AAAA,IAC3E;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,CAAQ,eAAA,CAAgB,KAAA,CAAM,MAAA,EAAQ;AAAA,IAC1C,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,MAAA,EAAQ,aAAA;AAAA,IACR,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IAClC,KAAK,KAAA,CAAM,GAAA;AAAA,IACX,MAAM,KAAA,CAAM;AAAA,GACb,CAAA;AAED,EAAA,OAAO;AAAA,IACL,aAAa,KAAA,CAAM,MAAA;AAAA,IACnB,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,IAAA,EAAM,MAAM,IAAA,IAAQ,EAAA;AAAA,IACpB,KAAK,KAAA,CAAM,GAAA;AAAA,IACX,MAAA,EAAQ,aAAA;AAAA,IACR,kBAAA;AAAA,IACA,YAAA,EAAc;AAAA,GAChB;AACF;;;AC7EO,SAAS,kBAAkB,MAAA,EAAyC;AACzE,EAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,SAAS,CAAC,MAAA,CAAO,QAAQ,IAAA,EAAM;AACjD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,8BAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA;AAAA,IACP,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO,OAAO,MAAA,CAAO,KAAA;AAAA,MACrB,IAAA,EAAM,OAAO,MAAA,CAAO,IAAA;AAAA,MACpB,OAAA,EAAS,OAAO,MAAA,CAAO;AAAA;AACzB,GACF;AACF;AAmBO,SAAS,qBAAqB,MAAA,EAAyC;AAC5E,EAAA,MAAM,cAAA,GAAiB,kBAAkB,MAAM,CAAA;AAC/C,EAAA,IAAI,CAAC,eAAe,KAAA,EAAO;AACzB,IAAA,OAAO,cAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,OAAA,EAAS;AAC3B,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,qCAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAEA,EAAA,OAAO,cAAA;AACT;;;ACtEO,SAAS,oBAAA,CAAqB,KAAkB,MAAA,EAAoC;AACzF,EAAA,OAAOM,IAAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;AAAA;;AAAA,uEAAA,CAAA;AAAA,IAMb,IAAA,EAAM;AAAA,MACJ,MAAA,EAAQA,KAAK,MAAA,CAAO,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,8BAA8B,CAAA;AAAA,MAC/E,KAAA,EAAOA,IAAAA,CAAK,MAAA,CAAO,MAAA,EAAO,CAAE,GAAA,EAAI,CAAE,QAAA,EAAS,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,sBAAsB;AAAA,KACzF;AAAA,IAEA,MAAM,QAAQ,IAAA,EAAuB;AAEnC,MAAA,MAAM,UAAA,GAAa,kBAAkB,MAAM,CAAA;AAC3C,MAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,QAAA,MAAMI,OAAAA,GAA2B;AAAA,UAC/B,OAAA,EAAS,KAAA;AAAA,UACT,QAAQ,EAAC;AAAA,UACT,OAAO,UAAA,CAAW,KAAA;AAAA,UAClB,YAAY,UAAA,CAAW;AAAA,SACzB;AACA,QAAA,OAAO,IAAA,CAAK,SAAA,CAAUA,OAAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,MACvC;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,GAAA,EAAK,QAAQ,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,KAAA,IAAS,EAAE,CAAA;AAC1E,MAAA,MAAM,MAAA,GAA2B;AAAA,QAC/B,OAAA,EAAS,IAAA;AAAA,QACT,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,UACzB,QAAQ,CAAA,CAAE,MAAA;AAAA,UACV,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,MAAA,EAAQ,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,KAAA;AAAA,UACtB,KAAK,CAAA,CAAE;AAAA,SACT,CAAE;AAAA,OACJ;AACA,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,IACvC;AAAA,GACD,CAAA;AACH;ACTO,SAAS,gBAAA,CAAiB,KAAkB,MAAA,EAAoC;AACrF,EAAA,OAAOJ,IAAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,sDAAA,CAAA;AAAA,IAWb,IAAA,EAAM;AAAA,MACJ,KAAA,EAAOA,IAAAA,CAAK,MAAA,CACT,MAAA,EAAO,CACP,QAAA;AAAA,QACC;AAAA,OACF;AAAA,MACF,IAAA,EAAMA,IAAAA,CAAK,MAAA,CACR,KAAA,CAAMA,IAAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,CAAA,CAC1B,QAAA,EAAS,CACT,QAAA,CAAS,sDAAsD,CAAA;AAAA,MAClE,KAAA,EAAOA,IAAAA,CAAK,MAAA,CACT,MAAA,EAAO,CACP,GAAA,EAAI,CACJ,QAAA,EAAS,CACT,QAAA,EAAS,CACT,QAAA,CAAS,mDAAmD,CAAA;AAAA,MAC/D,WAAA,EAAaA,KAAK,MAAA,CACf,OAAA,GACA,QAAA,EAAS,CACT,SAAS,yDAAyD;AAAA,KACvE;AAAA,IAEA,MAAM,QAAQ,IAAA,EAAuB;AACnC,MAAA,MAAM,UAAA,GAAa,IAAA;AAEnB,MAAA,IAAI,CAAC,UAAA,CAAW,KAAA,EAAO,IAAA,EAAK,EAAG;AAC7B,QAAA,OAAO,KAAK,SAAA,CAAU;AAAA,UACpB,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,mBAAA;AAAA,UACP,UAAA,EAAY;AAAA,SACb,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,GAAA,EAAK,MAAM,CAAA;AAC5C,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,MAAA,CAAO,WAAW,KAAA,EAAO;AAAA,QACpD,MAAM,UAAA,CAAW,IAAA;AAAA,QACjB,OAAO,UAAA,CAAW,KAAA;AAAA,QAClB,aAAa,UAAA,CAAW;AAAA,OACzB,CAAA;AAED,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,IACvC;AAAA,GACD,CAAA;AACH;ACzDO,SAAS,kBAAA,CAAmB,KAAkB,MAAA,EAAoC;AACvF,EAAA,OAAOA,IAAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,kFAAA,CAAA;AAAA,IAWb,IAAA,EAAM;AAAA,MACJ,GAAA,EAAKA,IAAAA,CAAK,MAAA,CACP,MAAA,EAAO,CACP,QAAA;AAAA,QACC;AAAA,OACF;AAAA,MACF,SAASA,IAAAA,CAAK,MAAA,CACX,MAAA,EAAO,CACP,SAAS,wEAAwE,CAAA;AAAA,MACpF,IAAA,EAAMA,IAAAA,CAAK,MAAA,CACR,KAAA,CAAMA,IAAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,CAAA,CAC1B,QAAA,EAAS,CACT,QAAA,CAAS,4EAA4E;AAAA,KAC1F;AAAA,IAEA,MAAM,QAAQ,IAAA,EAAuB;AACnC,MAAA,MAAM,YAAA,GAAe,IAAA;AAErB,MAAA,IAAI,CAAC,YAAA,CAAa,GAAA,EAAK,IAAA,EAAK,EAAG;AAC7B,QAAA,OAAO,KAAK,SAAA,CAAU;AAAA,UACpB,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,iBAAA;AAAA,UACP,UAAA,EAAY;AAAA,SACb,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,CAAC,YAAA,CAAa,OAAA,EAAS,IAAA,EAAK,EAAG;AACjC,QAAA,OAAO,KAAK,SAAA,CAAU;AAAA,UACpB,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,qBAAA;AAAA,UACP,UAAA,EAAY;AAAA,SACb,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,OAAA,GAAU,gBAAA,CAAiB,GAAA,EAAK,MAAM,CAAA;AAC5C,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,QAAA;AAAA,QAC3B,YAAA,CAAa,GAAA;AAAA,QACb,YAAA,CAAa,OAAA;AAAA,QACb,YAAA,CAAa;AAAA,OACf;AAEA,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,IACvC;AAAA,GACD,CAAA;AACH;AC9BO,SAAS,kBAAA,CAAmB,KAAkB,MAAA,EAAoC;AACvF,EAAA,OAAOA,IAAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,yDAAA,CAAA;AAAA,IAkBb,IAAA,EAAM;AAAA,MACJ,UAAA,EAAYA,KAAK,MAAA,CACd,MAAA,GACA,QAAA,EAAS,CACT,SAAS,qDAAqD,CAAA;AAAA,MACjE,SAAA,EAAWA,IAAAA,CAAK,MAAA,CACb,IAAA,CAAK,CAAC,SAAA,EAAW,eAAA,EAAiB,QAAA,EAAU,OAAA,EAAS,MAAM,CAAC,CAAA,CAC5D,QAAA,EAAS,CACT,SAAS,mDAAmD,CAAA;AAAA,MAC/D,OAAA,EAASA,KAAK,MAAA,CACX,MAAA,GACA,QAAA,EAAS,CACT,SAAS,6CAA6C;AAAA,KAC3D;AAAA,IAEA,MAAM,QAAQ,IAAA,EAAuB;AACnC,MAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB,GAAA,EAAK,QAAQ,IAAoB,CAAA;AACtE,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,IACvC;AAAA,GACD,CAAA;AACH;AAEA,eAAe,eAAA,CACb,GAAA,EACA,MAAA,EACA,IAAA,EACyB;AAEzB,EAAA,MAAM,SAAA,GACJ,IAAA,CAAK,SAAA,KAAc,MAAA,IAAU,CAAC,IAAA,CAAK,SAAA,GAAY,eAAA,CAAgB,GAAA,CAAI,SAAS,CAAA,GAAI,IAAA,CAAK,SAAA;AAEvF,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,6CAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GAAY,MAAM,uBAAA,CAAwB,GAAA,EAAK,SAAS,CAAA;AAC9D,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,aAAa,SAAS,CAAA,iBAAA,CAAA;AAAA,MAC7B,UAAA,EAAY,qBAAqB,SAAS;AAAA,KAC5C;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,GAAA,EAAK,eAAA,EAAiB,aAAA,IAAiB,EAAA;AAGhE,EAAA,MAAM,UAAA,GAAa,KAAK,UAAA,IAAc,MAAA;AACtC,EAAA,MAAM,OAAA,GAAU,KAAK,OAAA,IAAW,EAAA;AAEhC,EAAA,MAAM,YAAY,MAAM,kBAAA,CAAmB,GAAA,EAAK,SAAA,EAAW,YAAY,OAAO,CAAA;AAE9E,EAAA,IAAI,CAAC,UAAU,OAAA,EAAS;AACtB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,SAAA;AAAA,MACA,OAAO,SAAA,CAAU,KAAA;AAAA,MACjB,YAAY,SAAA,CAAU;AAAA,KACxB;AAAA,EACF;AAGA,EAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,SAAA,CAAU,MAAA,IAAU,IAAI,SAAS,CAAA;AAGpE,EAAA,MAAM,KAAA,GAAQ,OAAO,YAAA,GAAe,CAAA,GAAK,OAAO,MAAA,GAAS,MAAA,CAAO,eAAgB,GAAA,GAAM,CAAA;AAEtF,EAAA,MAAM,SAAS,KAAA,IAAS,SAAA;AAGxB,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,MAAA,CAAO,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AAC/B,IAAA,UAAA,GAAaJ,IAAAA,CAAK,GAAA,CAAI,SAAA,EAAW,WAAA,EAAa,oBAAoB,CAAA;AAClE,IAAA,IAAI;AACF,MAAA,MAAMS,MAAMJ,OAAAA,CAAQ,UAAU,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACpD,MAAA,MAAMK,UAAU,UAAA,EAAY,cAAA,CAAe,QAAQ,KAAA,EAAO,SAAS,GAAG,OAAO,CAAA;AAAA,IAC/E,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,SAAA;AAAA,IACA,cAAc,MAAA,CAAO,YAAA;AAAA,IACrB,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,EAAE,CAAA,GAAI,EAAA;AAAA,IAChC,SAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA,EAAW,MAAA,CAAO,SAAA,CAAU,KAAA,CAAM,GAAG,EAAE,CAAA;AAAA;AAAA,IACvC;AAAA,GACF;AACF;AAEA,SAAS,gBAAgB,SAAA,EAA6C;AAEpE,EAAA,IAAIT,UAAAA,CAAWD,IAAAA,CAAK,SAAA,EAAW,YAAY,CAAC,CAAA,EAAG;AAC7C,IAAA,OAAO,eAAA;AAAA,EACT;AACA,EAAA,IACEC,WAAWD,IAAAA,CAAK,SAAA,EAAW,mBAAmB,CAAC,KAC/CC,UAAAA,CAAWD,IAAAA,CAAK,SAAA,EAAW,iBAAiB,CAAC,CAAA,IAC7CC,UAAAA,CAAWD,KAAK,SAAA,EAAW,kBAAkB,CAAC,CAAA,EAC9C;AACA,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,IAAIC,UAAAA,CAAWD,IAAAA,CAAK,SAAA,EAAW,cAAc,CAAC,CAAA,EAAG;AAC/C,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,IAAIC,UAAAA,CAAWD,IAAAA,CAAK,SAAA,EAAW,UAAU,CAAC,CAAA,IAAKC,UAAAA,CAAWD,IAAAA,CAAK,SAAA,EAAW,gBAAgB,CAAC,CAAA,EAAG;AAC5F,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,IAAIC,UAAAA,CAAWD,IAAAA,CAAK,SAAA,EAAW,SAAS,CAAC,CAAA,EAAG;AAC1C,IAAA,OAAO,OAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAEA,eAAe,uBAAA,CACb,KACA,SAAA,EACkB;AAClB,EAAA,IAAI;AACF,IAAA,QAAQ,SAAA;AAAW,MACjB,KAAK,SAAA;AACH,QAAA,MAAM,GAAA,CAAI,CAAA,CAAA,qBAAA,CAAA;AACV,QAAA,OAAO,IAAA;AAAA,MACT,KAAK,eAAA;AACH,QAAA,MAAM,GAAA,CAAI,CAAA,CAAA,uBAAA,CAAA;AACV,QAAA,OAAO,IAAA;AAAA,MACT,KAAK,QAAA;AACH,QAAA,MAAM,GAAA,CAAI,CAAA,CAAA,gBAAA,CAAA;AACV,QAAA,OAAO,IAAA;AAAA,MACT,KAAK,OAAA;AACH,QAAA,MAAM,GAAA,CAAI,CAAA,CAAA,cAAA,CAAA;AACV,QAAA,OAAO,IAAA;AAAA,MACT;AACE,QAAA,OAAO,KAAA;AAAA;AACX,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,SAAS,qBAAqB,SAAA,EAAsC;AAClE,EAAA,QAAQ,SAAA;AAAW,IACjB,KAAK,SAAA;AACH,MAAA,OAAO,4DAAA;AAAA,IACT,KAAK,eAAA;AACH,MAAA,OAAO,2CAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,kCAAA;AAAA,IACT,KAAK,OAAA;AACH,MAAA,OAAO,gDAAA;AAAA,IACT;AACE,MAAA,OAAO,qEAAA;AAAA;AAEb;AASA,eAAe,kBAAA,CACb,GAAA,EACA,SAAA,EACA,UAAA,EACA,OAAA,EACoB;AACpB,EAAA,IAAI;AACF,IAAA,IAAI,MAAA;AAEJ,IAAA,QAAQ,SAAA;AAAW,MACjB,KAAK,SAAA;AACH,QAAA,MAAA,GAAS,MAAM,GAAA,CAAI,CAAA,CAAA,yBAAA,EAA6B,UAAU,CAAA,QAAA,CAAA;AAC1D,QAAA;AAAA,MACF,KAAK,eAAA;AACH,QAAA,MAAA,GAAS,MAAM,GAAA,CAAI,CAAA,CAAA,wBAAA,EAA4B,OAAO,CAAA,CAAA;AACtD,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,MAAA,GAAS,MAAM,GAAA,CAAI,CAAA,CAAA,6BAAA,EAAiC,UAAU,CAAA,CAAA;AAC9D,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,MAAA,GAAS,MAAM,GAAA,CAAI,CAAA,CAAA,SAAA,CAAA;AACnB,QAAA;AAAA,MACF;AACE,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,sBAAsB,SAAS,CAAA;AAAA,SACxC;AAAA;AAGJ,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,MAAM;AAAA,KAC9B;AAAA,EACF,SAAS,KAAA,EAAO;AAGd,IAAA,MAAM,QAAA,GAAW,KAAA;AACjB,IAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,MAAA,EAAQ,MAAA,CAAO,QAAA,CAAS,MAAM;AAAA,OAChC;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,SAAS,OAAA,IAAW,yBAAA;AAAA,MAC3B,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AACF;AAUA,SAAS,mBAAA,CAAoB,QAAgB,SAAA,EAA8C;AACzF,EAAA,MAAM,MAAA,GAAyB;AAAA,IAC7B,YAAA,EAAc,CAAA;AAAA,IACd,MAAA,EAAQ,CAAA;AAAA,IACR,QAAA,EAAU,CAAA;AAAA,IACV,QAAA,EAAU,CAAA;AAAA,IACV,WAAW;AAAC,GACd;AAGA,EAAA,IAAI,cAAc,SAAA,EAAW;AAC3B,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,KAAA,CAAM,oBAAoB,CAAA;AACpD,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,KAAA,CAAM,kBAAkB,CAAA;AACnD,IAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,KAAA,CAAM,oBAAoB,CAAA;AACvD,IAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,KAAA,CAAM,qBAAqB,CAAA;AAExD,IAAA,IAAI,UAAA,SAAmB,YAAA,GAAe,MAAA,CAAO,SAAS,UAAA,CAAW,CAAC,GAAG,EAAE,CAAA;AACvE,IAAA,IAAI,WAAA,SAAoB,MAAA,GAAS,MAAA,CAAO,SAAS,WAAA,CAAY,CAAC,GAAG,EAAE,CAAA;AACnE,IAAA,IAAI,aAAA,SAAsB,QAAA,GAAW,MAAA,CAAO,SAAS,aAAA,CAAc,CAAC,GAAG,EAAE,CAAA;AACzE,IAAA,IAAI,aAAA,SAAsB,QAAA,GAAW,MAAA,CAAO,SAAS,aAAA,CAAc,CAAC,GAAG,EAAE,CAAA;AAGzE,IAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,QAAA,CAAS,6CAA6C,CAAA;AACrF,IAAA,KAAA,MAAW,SAAS,eAAA,EAAiB;AACnC,MAAA,MAAA,CAAO,UAAU,IAAA,CAAK;AAAA,QACpB,EAAA,EAAI,CAAA,QAAA,EAAW,MAAA,CAAO,SAAA,CAAU,MAAM,CAAA,CAAA;AAAA,QACtC,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,QACb,MAAM,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AAAA,QAClC,QAAA,EAAU,EAAA;AAAA,QACV,QAAA,EAAU,MAAM,CAAC,CAAA;AAAA,QACjB,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,IAAI,cAAc,eAAA,EAAiB;AACjC,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,KAAA,CAAM,uBAAuB,CAAA;AACvD,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,KAAA,CAAM,eAAe,CAAA;AAChD,IAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,KAAA,CAAM,eAAe,CAAA;AAClD,IAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,KAAA,CAAM,kBAAkB,CAAA;AAErD,IAAA,IAAI,UAAA,SAAmB,YAAA,GAAe,MAAA,CAAO,SAAS,UAAA,CAAW,CAAC,GAAG,EAAE,CAAA;AACvE,IAAA,IAAI,WAAA,SAAoB,MAAA,GAAS,MAAA,CAAO,SAAS,WAAA,CAAY,CAAC,GAAG,EAAE,CAAA;AACnE,IAAA,IAAI,aAAA,SAAsB,QAAA,GAAW,MAAA,CAAO,SAAS,aAAA,CAAc,CAAC,GAAG,EAAE,CAAA;AACzE,IAAA,IAAI,aAAA,SAAsB,QAAA,GAAW,MAAA,CAAO,SAAS,aAAA,CAAc,CAAC,GAAG,EAAE,CAAA;AAGzE,IAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,QAAA,CAAS,2CAA2C,CAAA;AACjF,IAAA,KAAA,MAAW,SAAS,aAAA,EAAe;AACjC,MAAA,MAAA,CAAO,UAAU,IAAA,CAAK;AAAA,QACpB,EAAA,EAAI,CAAA,MAAA,EAAS,MAAA,CAAO,SAAA,CAAU,MAAM,CAAA,CAAA;AAAA,QACpC,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,QACb,MAAM,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AAAA,QAClC,QAAA,EAAU,EAAA;AAAA,QACV,QAAA,EAAU,MAAM,CAAC,CAAA;AAAA,QACjB,YAAA,EAAc;AAAA,OACf,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,IAAI,cAAc,QAAA,EAAU;AAC1B,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,KAAA,CAAM,cAAc,CAAA;AAC/C,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAA,CAAO,SAAS,MAAA,CAAO,QAAA,CAAS,WAAA,CAAY,CAAC,GAAG,EAAE,CAAA;AAClD,MAAA,MAAA,CAAO,eAAe,MAAA,CAAO,QAAA,CAAS,WAAA,CAAY,CAAC,GAAG,EAAE,CAAA;AACxD,MAAA,MAAA,CAAO,QAAA,GAAW,MAAA,CAAO,YAAA,GAAe,MAAA,CAAO,MAAA;AAAA,IACjD;AAAA,EACF;AAGA,EAAA,IAAI,cAAc,OAAA,EAAS;AACzB,IAAA,MAAM,YAAA,GAAe,MAAA,CAAO,KAAA,CAAM,+BAA+B,CAAA;AACjE,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,MAAA,CAAO,SAAS,MAAA,CAAO,QAAA,CAAS,YAAA,CAAa,CAAC,GAAG,EAAE,CAAA;AACnD,MAAA,MAAA,CAAO,WAAW,MAAA,CAAO,QAAA,CAAS,YAAA,CAAa,CAAC,GAAG,EAAE,CAAA;AACrD,MAAA,MAAA,CAAO,YAAA,GAAe,MAAA,CAAO,MAAA,GAAS,MAAA,CAAO,QAAA;AAAA,IAC/C;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,cAAA,CAAe,MAAA,EAAwB,KAAA,EAAe,SAAA,EAA2B;AACxF,EAAA,MAAM,SAAA,GAAY,KAAA,IAAS,SAAA,GAAY,QAAA,GAAW,QAAA;AAElD,EAAA,IAAI,MAAA,GAAS,CAAA;;AAAA;AAAA,aAAA,EAGA,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAC,CAAA;AAAA,iBAAA,EACZ,SAAS,CAAA;AAAA,cAAA,EACZ,SAAS;;AAAA;AAAA;AAAA;AAAA,kBAAA,EAKL,OAAO,YAAY,CAAA;AAAA,WAAA,EAC1B,OAAO,MAAM,CAAA;AAAA,aAAA,EACX,OAAO,QAAQ,CAAA;AAAA,cAAA,EACd,OAAO,QAAQ,CAAA;;AAAA;;AAAA,CAAA;AAM7B,EAAA,IAAI,MAAA,CAAO,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AACjC,IAAA,MAAA,IAAU,mDAAA;AAAA,EACZ,CAAA,MAAO;AACL,IAAA,KAAA,MAAW,QAAA,IAAY,OAAO,SAAA,EAAW;AACvC,MAAA,MAAA,IAAU,CAAA,IAAA,EAAO,SAAS,EAAE;AAAA,YAAA,EACpB,QAAA,CAAS,IAAI,CAAA,EAAG,QAAA,CAAS,OAAO,CAAA,CAAA,EAAI,QAAA,CAAS,IAAI,CAAA,CAAA,GAAK,EAAE,CAAA;AAAA,cAAA,EACtD,SAAS,QAAQ;;AAAA;;AAAA,CAAA;AAAA,IAK7B;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;;;AC1aA,IAAM,gBAAA,GAAmB,2BAAA;AACzB,IAAM,iBAAA,GAAoB,aAAA;AAC1B,IAAM,eAAA,GAAkB,WAAA;AAExB,SAAS,gBAAgB,QAAA,EAAkC;AACzD,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,QAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,OAAA;AACH,MAAA,OAAO,cAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT;AACE,MAAA,OAAO,QAAA;AAAA;AAEb;AAEA,SAAS,oBAAoB,KAAA,EAAgC;AAC3D,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,CAAA,IAAA,EAAO,gBAAgB,KAAA,CAAM,QAAA,IAAY,SAAS,CAAC,CAAA,CAAA,EAAI,MAAM,YAAY,CAAA,CAAA;AAAA,IACzE,CAAA,EAAA,EAAK,iBAAiB,CAAA,CAAA,EAAI,KAAA,CAAM,SAAS,CAAA,CAAA;AAAA,IACzC,CAAA,EAAA,EAAK,eAAe,CAAA,CAAA,EAAI,KAAA,CAAM,YAAY,SAAS,CAAA,CAAA;AAAA,IACnD,CAAA,YAAA,EAAe,MAAM,eAAe,CAAA,CAAA;AAAA,IACpC,CAAA,YAAA,EAAe,MAAM,eAAe,CAAA;AAAA,GACtC;AAEA,EAAA,IAAI,MAAM,cAAA,EAAgB;AACxB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa,KAAA,CAAM,cAAc,CAAA,CAAE,CAAA;AAAA,EAChD;AAEA,EAAA,IAAI,MAAM,UAAA,EAAY;AACpB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkB,KAAA,CAAM,UAAU,CAAA,CAAE,CAAA;AAAA,EACjD;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAEA,SAAS,qBAAqB,KAAA,EAAqC;AACjE,EAAA,MAAM,IAAA,GAAA,qBAAW,IAAA,EAAK,EAAE,aAAY,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA;AAClD,EAAA,MAAM,YAAY,KAAA,CAAM,eAAA,CAAgB,IAAI,mBAAmB,CAAA,CAAE,KAAK,MAAM,CAAA;AAE5E,EAAA,OAAO,GAAG,gBAAgB;;AAAA,UAAA,EAAiB,IAAI;AAAA,gBAAA,EAAqB,MAAM,SAAS;;AAAA,EAAO,SAAS,CAAA,CAAA;AACrG;AAEA,SAAS,oBAAA,CAAqB,MAAc,OAAA,EAAyB;AACnE,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,OAAA,CAAQ,gBAAgB,CAAA;AACnD,EAAA,IAAI,kBAAkB,EAAA,EAAI;AACxB,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,IAAA,EAAM;;AAAA;;AAAA,EAAc,OAAO,GAAG,IAAA,EAAK;AAAA,EACpD;AAEA,EAAA,OAAO,GAAG,IAAA,CAAK,KAAA,CAAM,GAAG,aAAa,CAAA,CAAE,MAAM;;AAAA,EAAO,OAAO,GAAG,IAAA,EAAK;AACrE;AAEA,SAAS,oBAAoB,KAAA,EAAuC;AAClE,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,UAAA,CACf,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,IAAA,EAAM,CAAA,CAC3B,OAAO,OAAO,CAAA;AAEjB,EAAA,MAAM,OAAA,GAAU,GAAA,CACb,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAC,CAAA,CACtC,GAAA,CAAI,CAAC,KAAA,KAAU,MAAA,CAAO,QAAA,CAAS,KAAA,EAAO,EAAE,CAAC,CAAA,CACzC,MAAA,CAAO,CAAC,KAAA,KAAU,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,IAAK,KAAA,GAAQ,CAAC,CAAA;AAExD,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAI,GAAA,CAAI,OAAO,CAAC,CAAA;AACpC;AAEA,eAAsB,mBAAA,CACpB,GAAA,EACA,MAAA,EACA,KAAA,EAC+B;AAC/B,EAAA,MAAM,YAAA,GAAe,oBAAoB,KAAK,CAAA;AAC9C,EAAA,MAAM,UAAoE,EAAC;AAE3E,EAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,qBAAA,EAAuB,KAAA;AAAA,MACvB,OAAA,EAAS;AAAA,QACP,QAAA,EAAU,CAAA;AAAA,QACV,QAAA,EAAU,CAAA;AAAA,QACV,QAAA,EAAU,CAAA;AAAA,QACV,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAEA,EAAA,MAAM,eAAA,GAAkB,qBAAqB,KAAK,CAAA;AAElD,EAAA,KAAA,MAAW,eAAe,YAAA,EAAc;AACtC,IAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,CAAW,GAAA,EAAK,QAAQ,WAAW,CAAA;AACvD,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,MAAM,WAAA,GAAc,oBAAA,CAAqB,KAAA,CAAM,IAAA,IAAQ,IAAI,eAAe,CAAA;AAC1E,IAAA,MAAM,UAAU,MAAM,eAAA,CAAgB,GAAA,EAAK,MAAA,EAAQ,aAAa,WAAW,CAAA;AAE3E,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,KAAK,EAAE,WAAA,EAAa,kBAAkB,KAAA,CAAM,eAAA,CAAgB,QAAQ,CAAA;AAAA,IAC9E;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,MAAM,eAAA,CAAgB,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,QAAA,KAAa,QAAQ,CAAA,CAAE,MAAA;AACtF,EAAA,MAAM,QAAA,GAAW,MAAM,eAAA,CAAgB,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,QAAA,KAAa,OAAO,CAAA,CAAE,MAAA;AACrF,EAAA,MAAM,QAAA,GAAW,MAAM,eAAA,CAAgB,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,QAAA,KAAa,QAAQ,CAAA,CAAE,MAAA;AAEtF,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,QAAQ,MAAA,GAAS,CAAA;AAAA,IAC1B,qBAAA,EAAuB,KAAA;AAAA,IACvB,aAAA,EAAe,OAAA;AAAA,IACf,OAAA,EAAS;AAAA,MACP,QAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,gBAAgB,OAAA,CAAQ;AAAA,KAC1B;AAAA,IACA,UAAU,OAAA,CAAQ,MAAA,KAAW,CAAA,GAAI,CAAC,mBAAmB,CAAA,GAAI;AAAA,GAC3D;AACF;;;AC9EO,SAAS,oBAAoB,QAAA,EAA2D;AAC7F,EAAA,IAAI,CAAC,QAAA,IAAY,OAAO,QAAA,KAAa,QAAA,EAAU;AAC7C,IAAA,OAAO,oBAAoB,sBAAsB,CAAA;AAAA,EACnD;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,KAAA,CAAM,aAAa,CAAA;AAC9C,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,OAAO,oBAAoB,kCAAkC,CAAA;AAAA,IAC/D;AAEA,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,CAAC,CAAC,CAAA;AAEtC,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA,OAAO,oBAAoB,+BAA+B,CAAA;AAAA,IAC5D;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,oBAAoB,yCAAyC,CAAA;AAAA,EACtE;AACF;AAEA,SAAS,oBAAoB,MAAA,EAAsC;AACjE,EAAA,OAAO;AAAA,IACL,OAAA,EAAS;AAAA,MACP,WAAA,EAAa,CAAA;AAAA,MACb,YAAA,EAAc,CAAA;AAAA,MACd,cAAA,EAAgB,CAAA;AAAA,MAChB,WAAA,EAAa,CAAA;AAAA,MACb,cAAA,EAAgB;AAAA,KAClB;AAAA,IACA,QAAA,EAAU;AAAA,MACR,UAAU,EAAC;AAAA,MACX,OAAO,EAAC;AAAA,MACR,eAAe,EAAC;AAAA,MAChB,aAAa;AAAC;AAChB,GACF;AACF;AAEO,SAAS,cAAc,MAAA,EAA6C;AACzE,EAAA,MAAM,MAAA,GAAwB;AAAA,IAC5B,KAAA,EAAO,OAAO,OAAA,CAAQ,WAAA;AAAA,IACtB,IAAA,EAAM,OAAO,OAAA,CAAQ,YAAA;AAAA,IACrB,MAAA,EAAQ,OAAO,OAAA,CAAQ,cAAA;AAAA,IACvB,GAAA,EAAK,OAAO,OAAA,CAAQ,WAAA;AAAA,IACpB,UAAA,EAAY;AAAA,MACV,QAAA,EAAU,CAAA;AAAA,MACV,KAAA,EAAO,CAAA;AAAA,MACP,aAAA,EAAe,CAAA;AAAA,MACf,WAAA,EAAa;AAAA;AACf,GACF;AAEA,EAAA,IAAI,OAAO,QAAA,EAAU;AACnB,IAAA,MAAA,CAAO,UAAA,CAAW,QAAA,GAAW,MAAA,CAAO,QAAA,CAAS,UAAU,MAAA,IAAU,CAAA;AACjE,IAAA,MAAA,CAAO,UAAA,CAAW,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,OAAO,MAAA,IAAU,CAAA;AAC3D,IAAA,MAAA,CAAO,UAAA,CAAW,aAAA,GAAgB,MAAA,CAAO,QAAA,CAAS,eAAe,MAAA,IAAU,CAAA;AAC3E,IAAA,MAAA,CAAO,UAAA,CAAW,WAAA,GAAc,MAAA,CAAO,QAAA,CAAS,aAAa,MAAA,IAAU,CAAA;AAAA,EACzE;AAEA,EAAA,IAAI,OAAO,aAAA,EAAe;AACxB,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,aAAA,EAAe;AACxC,MAAA,MAAA,CAAO,UAAA,CAAW,QAAA,IAAY,KAAA,CAAM,QAAA,CAAS,UAAU,MAAA,IAAU,CAAA;AACjE,MAAA,MAAA,CAAO,UAAA,CAAW,KAAA,IAAS,KAAA,CAAM,QAAA,CAAS,OAAO,MAAA,IAAU,CAAA;AAC3D,MAAA,MAAA,CAAO,UAAA,CAAW,aAAA,IAAiB,KAAA,CAAM,QAAA,CAAS,eAAe,MAAA,IAAU,CAAA;AAC3E,MAAA,MAAA,CAAO,UAAA,CAAW,WAAA,IAAe,KAAA,CAAM,QAAA,CAAS,aAAa,MAAA,IAAU,CAAA;AAAA,IACzE;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,mBAAmB,MAAA,EAA+C;AAChF,EAAA,MAAM,cAA+B,EAAC;AAEtC,EAAA,IAAI,OAAO,QAAA,EAAU;AACnB,IAAA,KAAA,MAAW,YAAY,CAAC,UAAA,EAAY,OAAA,EAAS,eAAA,EAAiB,aAAa,CAAA,EAAY;AACrF,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,QAAA,CAAS,QAAQ,KAAK,EAAC;AAC/C,MAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,QAAA,WAAA,CAAY,IAAA,CAAK,EAAE,GAAG,OAAA,EAAS,UAAU,CAAA;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,aAAA,EAAe;AACxB,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,aAAA,EAAe;AACxC,MAAA,KAAA,MAAW,YAAY,CAAC,UAAA,EAAY,OAAA,EAAS,eAAA,EAAiB,aAAa,CAAA,EAAY;AACrF,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,QAAA,CAAS,QAAQ,KAAK,EAAC;AAC9C,QAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,UAAA,WAAA,CAAY,IAAA,CAAK,EAAE,GAAG,OAAA,EAAS,UAAU,CAAA;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,WAAA;AACT;;;ACmuCO,IAAM,wBAAA,GAAwE;AAAA,EACnF,SAAA,EAAW;AAAA,IACT,IAAA,EAAM,WAAA;AAAA,IACN,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO,oBAAA;AAAA,IACP,IAAA,EAAM,iBAAA;AAAA,IACN,SAAA,EAAW,CAAC,eAAA,EAAiB,uBAAA,EAAyB,eAAe,gBAAgB,CAAA;AAAA,IACrF,WAAA,EAAa,gCAAA;AAAA,IACb,QAAA,EACE,0JAAA;AAAA,IACF,kBAAA,EACE,oIAAA;AAAA,IACF,UAAA,EAAY;AAAA,MACV,yCAAA;AAAA,MACA,yCAAA;AAAA,MACA,gDAAA;AAAA,MACA;AAAA;AACF,GACF;AAAA,EACA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,KAAA;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,kBAAA;AAAA,IACP,IAAA,EAAM,WAAA;AAAA,IACN,SAAA,EAAW,CAAC,gBAAA,EAAkB,cAAA,EAAgB,aAAa,0BAA0B,CAAA;AAAA,IACrF,WAAA,EAAa,6CAAA;AAAA,IACb,QAAA,EACE,uJAAA;AAAA,IACF,kBAAA,EACE,qGAAA;AAAA,IACF,UAAA,EAAY;AAAA,MACV,yCAAA;AAAA,MACA,2CAAA;AAAA,MACA,yBAAA;AAAA,MACA;AAAA;AACF,GACF;AAAA,EACA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,KAAA;AAAA,IACN,IAAA,EAAM,OAAA;AAAA,IACN,KAAA,EAAO,wBAAA;AAAA,IACP,IAAA,EAAM,WAAA;AAAA,IACN,SAAA,EAAW,CAAC,kBAAA,EAAoB,YAAA,EAAc,mBAAmB,mBAAmB,CAAA;AAAA,IACpF,WAAA,EAAa,mCAAA;AAAA,IACb,QAAA,EACE,yIAAA;AAAA,IACF,kBAAA,EACE,oIAAA;AAAA,IACF,UAAA,EAAY;AAAA,MACV,2CAAA;AAAA,MACA,oCAAA;AAAA,MACA,+BAAA;AAAA,MACA;AAAA;AACF,GACF;AAAA,EACA,EAAA,EAAI;AAAA,IACF,IAAA,EAAM,IAAA;AAAA,IACN,IAAA,EAAM,MAAA;AAAA,IACN,KAAA,EAAO,iBAAA;AAAA,IACP,IAAA,EAAM,WAAA;AAAA,IACN,SAAA,EAAW,CAAC,cAAA,EAAgB,mBAAA,EAAqB,kBAAkB,gBAAgB,CAAA;AAAA,IACnF,WAAA,EAAa,uCAAA;AAAA,IACb,QAAA,EACE,4HAAA;AAAA,IACF,kBAAA,EACE,0HAAA;AAAA,IACF,UAAA,EAAY;AAAA,MACV,+BAAA;AAAA,MACA,gCAAA;AAAA,MACA,0BAAA;AAAA,MACA;AAAA;AACF,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,SAAA;AAAA,IACN,IAAA,EAAM,MAAA;AAAA,IACN,KAAA,EAAO,kBAAA;AAAA,IACP,IAAA,EAAM,WAAA;AAAA,IACN,SAAA,EAAW,CAAC,uBAAA,EAAyB,cAAA,EAAgB,uBAAuB,YAAY,CAAA;AAAA,IACxF,WAAA,EAAa,uCAAA;AAAA,IACb,QAAA,EACE,8HAAA;AAAA,IACF,kBAAA,EACE,wIAAA;AAAA,IACF,UAAA,EAAY;AAAA,MACV,oCAAA;AAAA,MACA,qCAAA;AAAA,MACA,4DAAA;AAAA,MACA;AAAA;AACF,GACF;AAAA,EACA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,aAAA;AAAA,IACN,IAAA,EAAM,OAAA;AAAA,IACN,KAAA,EAAO,aAAA;AAAA,IACP,IAAA,EAAM,WAAA;AAAA,IACN,SAAA,EAAW,CAAC,iBAAA,EAAmB,eAAA,EAAiB,aAAa,YAAY,CAAA;AAAA,IACzE,WAAA,EAAa,mCAAA;AAAA,IACb,QAAA,EACE,wHAAA;AAAA,IACF,kBAAA,EACE,iHAAA;AAAA,IACF,UAAA,EAAY;AAAA,MACV,uDAAA;AAAA,MACA,+BAAA;AAAA,MACA,6BAAA;AAAA,MACA;AAAA;AACF,GACF;AAAA,EACA,aAAA,EAAe;AAAA,IACb,IAAA,EAAM,aAAA;AAAA,IACN,IAAA,EAAM,OAAA;AAAA,IACN,KAAA,EAAO,kBAAA;AAAA,IACP,IAAA,EAAM,WAAA;AAAA,IACN,SAAA,EAAW,CAAC,eAAA,EAAiB,UAAA,EAAY,eAAe,SAAS,CAAA;AAAA,IACjE,WAAA,EAAa,2BAAA;AAAA,IACb,QAAA,EACE,+GAAA;AAAA,IACF,kBAAA,EACE,mIAAA;AAAA,IACF,UAAA,EAAY;AAAA,MACV,0CAAA;AAAA,MACA,mCAAA;AAAA,MACA,qCAAA;AAAA,MACA;AAAA;AACF,GACF;AAAA,EACA,EAAA,EAAI;AAAA,IACF,IAAA,EAAM,IAAA;AAAA,IACN,IAAA,EAAM,KAAA;AAAA,IACN,KAAA,EAAO,cAAA;AAAA,IACP,IAAA,EAAM,WAAA;AAAA,IACN,SAAA,EAAW,CAAC,SAAA,EAAW,eAAA,EAAiB,mBAAmB,UAAU,CAAA;AAAA,IACrE,WAAA,EAAa,+BAAA;AAAA,IACb,QAAA,EACE,gGAAA;AAAA,IACF,kBAAA,EACE,uGAAA;AAAA,IACF,UAAA,EAAY;AAAA,MACV,qBAAA;AAAA,MACA,uCAAA;AAAA,MACA,4CAAA;AAAA,MACA;AAAA;AACF;AAEJ,CAAA;AC54CA,eAAsB,YAAA,GAAkE;AACtF,EAAA,OAAO,IAAI,GAAA;AAAA,IACT,MAAA,CAAO,QAAQ,wBAAwB;AAAA,GACzC;AACF;AAEO,SAAS,UAAA,CACd,UACA,SAAA,EACsB;AACtB,EAAA,OAAO,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA,IAAK,yBAAyB,SAAS,CAAA;AACtE;AAEO,SAAS,sBAAA,CAAuB,UAAkB,QAAA,EAAmC;AAC1F,EAAA,MAAM,SAA0B,EAAC;AAEjC,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAK,UAAA;AACH,MAAA,MAAA,CAAO,IAAA,CAAK,WAAA,EAAa,KAAA,EAAO,KAAK,CAAA;AACrC,MAAA;AAAA,IACF,KAAK,OAAA;AACH,MAAA,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,SAAS,CAAA;AACnC,MAAA;AAAA,IACF,KAAK,aAAA;AACH,MAAA,MAAA,CAAO,IAAA,CAAK,aAAa,KAAK,CAAA;AAC9B,MAAA;AAAA,IACF,KAAK,eAAA;AACH,MAAA,MAAA,CAAO,IAAA,CAAK,OAAO,aAAa,CAAA;AAChC,MAAA;AAAA,IACF;AACE,MAAA,MAAA,CAAO,IAAA,CAAK,OAAO,WAAW,CAAA;AAAA;AAGlC,EAAA,IAAI,aAAa,MAAA,IAAU,CAAC,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA,EAAG;AACjD,IAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAAA,EAClB;AAEA,EAAA,OAAO,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAC1B;;;ACzIA,IAAMF,KAAAA,GAAM,mBAAmB,kBAAkB,CAAA;AACjD,IAAM,cAAA,GAAiB,KAAK,EAAA,GAAK,GAAA;AACjC,IAAM,YAAA,GAAe,EAAA;AASrB,IAAM,cAAA,uBAAqB,GAAA,EAA6B;AAExD,SAAS,oBAAA,GAA6B;AACpC,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,EAAA,MAAM,mBAA6B,EAAC;AAEpC,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,OAAO,CAAA,IAAK,cAAA,EAAgB;AAC1C,IAAA,IAAI,GAAA,GAAM,OAAA,CAAQ,cAAA,GAAiB,cAAA,EAAgB;AACjD,MAAA,gBAAA,CAAiB,KAAK,EAAE,CAAA;AAAA,IAC1B;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,MAAM,gBAAA,EAAkB;AACjC,IAAA,cAAA,CAAe,OAAO,EAAE,CAAA;AAAA,EAC1B;AAEA,EAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,IAAA,CAAK,YAAA,GAAe,GAAG,CAAA;AACtD,EAAA,IAAI,cAAA,CAAe,IAAA,IAAQ,iBAAA,IAAqB,cAAA,CAAe,OAAO,YAAA,EAAc;AAClF,IAAAA,KAAAA,CAAI,KAAK,2CAAA,EAA6C;AAAA,MACpD,iBAAiB,cAAA,CAAe,IAAA;AAAA,MAChC,WAAA,EAAa,YAAA;AAAA,MACb,oBAAoB,IAAA,CAAK,KAAA,CAAO,cAAA,CAAe,IAAA,GAAO,eAAgB,GAAG,CAAA;AAAA,MACzE,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,cAAA,CAAe,OAAO,YAAA,EAAc;AACtC,IAAA,MAAM,iBAAiB,KAAA,CAAM,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,CAAA,CAAE,IAAA;AAAA,MAC1D,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,CAAE,cAAA,GAAiB,CAAA,CAAE,CAAC,CAAA,CAAE;AAAA,KACvC;AAEA,IAAA,MAAM,WAAW,cAAA,CAAe,KAAA,CAAM,CAAA,EAAG,cAAA,CAAe,OAAO,YAAY,CAAA;AAC3E,IAAA,KAAA,MAAW,CAAC,EAAE,CAAA,IAAK,QAAA,EAAU;AAC3B,MAAA,cAAA,CAAe,OAAO,EAAE,CAAA;AAAA,IAC1B;AAAA,EACF;AACF;AAEA,SAAS,WAAW,SAAA,EAAgD;AAClE,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA;AAC5C,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,OAAA,CAAQ,cAAA,GAAiB,KAAK,GAAA,EAAI;AAClC,EAAA,OAAO,OAAA,CAAQ,KAAA;AACjB;AAEA,SAAS,mBAAmB,SAAA,EAA2C;AACrE,EAAA,MAAM,OAAA,GAAU,cAAA,CAAe,GAAA,CAAI,SAAS,CAAA;AAC5C,EAAA,IAAI,CAAC,SAAS,OAAO,IAAA;AAErB,EAAA,OAAA,CAAQ,cAAA,GAAiB,KAAK,GAAA,EAAI;AAClC,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,UAAA,CACP,KAAA,EACA,gBAAA,EACA,MAAA,EACM;AACN,EAAA,cAAA,CAAe,GAAA,CAAI,MAAM,SAAA,EAAW;AAAA,IAClC,KAAA;AAAA,IACA,cAAA,EAAgB,KAAK,GAAA,EAAI;AAAA,IACzB,gBAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH;AAEA,SAAS,WAAA,CAAY,QAAwB,MAAA,EAA+C;AAC1F,EAAA,MAAM,SAAiC,EAAC;AAExC,EAAA,MAAM,oBAAA,GAAuB,4BAA4B,MAAM,CAAA;AAC/D,EAAA,KAAA,MAAW,WAAW,oBAAA,EAAsB;AAC1C,IAAA,MAAM,iBAAiB,MAAA,GAAS,2BAAA,CAA4B,QAAQ,EAAA,EAAI,MAAM,IAAI,EAAC;AACnF,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,EAAA,EAAI,CAAA,OAAA,EAAU,OAAA,CAAQ,EAAE,CAAA,CAAA;AAAA,MACxB,WAAW,OAAA,CAAQ,EAAA;AAAA,MACnB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,IAAA,EAAM,eAAA;AAAA,MACN,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,cAAA,EAAgB,sBAAA,CAAuB,OAAA,CAAQ,QAAA,EAAU,QAAQ,QAAQ,CAAA;AAAA,MACzE,cAAA;AAAA,MACA,SAAA,EAAW;AAAA,KACZ,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,KAAA,MAAW,MAAA,IAAU,OAAO,YAAA,EAAc;AACxC,MAAA,MAAM,YAAA,GAAe,OAAO,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,OAAO,KAAK,CAAA;AAChE,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,MAAM,YAAoD,EAAC;AAC3D,QAAA,KAAA,MAAW,GAAA,IAAO,OAAO,SAAA,EAAW;AAClC,UAAA,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,GAAI,GAAA,CAAI,QAAA;AAAA,QAC7B;AACA,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,EAAA,EAAI,CAAA,cAAA,EAAiB,MAAA,CAAO,MAAM,CAAA,CAAA;AAAA,UAClC,SAAA,EAAW,CAAA,OAAA,EAAU,MAAA,CAAO,MAAM,CAAA,CAAA;AAAA,UAClC,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,IAAA,EAAM,UAAA;AAAA,UACN,QAAA,EAAU,QAAA;AAAA,UACV,QAAA,EAAU,OAAA;AAAA,UACV,gBAAgB,MAAA,CAAO,SAAA,CAAU,IAAI,CAAC,CAAA,KAAM,EAAE,KAAK,CAAA;AAAA,UACnD,cAAA,EAAgB,SAAA;AAAA,UAChB,SAAA,EAAW;AAAA,SACZ,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AASA,SAAS,4BAA4B,MAAA,EAAuC;AAC1E,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,QAAA,EAAU,IAAA,IAAQ,CAAA;AAG3C,EAAA,IAAI,CAAC,OAAO,cAAA,EAAgB;AAE1B,IAAA,IAAI,YAAY,CAAA,EAAG;AACjB,MAAA,OAAO,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,WAAU,EAAG,CAAC,GAAG,CAAA,MAAO;AAAA,QAClD,EAAA,EAAI,CAAA,KAAA,EAAQ,CAAA,GAAI,CAAC,CAAA,CAAA;AAAA,QACjB,KAAA,EAAO,CAAA,sBAAA,EAAyB,CAAA,GAAI,CAAC,CAAA,CAAA;AAAA,QACrC,QAAA,EAAU,MAAA;AAAA,QACV,QAAA,EAAU;AAAA,OACZ,CAAE,CAAA;AAAA,IACJ;AACA,IAAA,OAAO,EAAC;AAAA,EACV;AAGA,EAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,MAAA,CAAO,cAAc,CAAA;AACxD,EAAA,MAAM,WAAA,GAAc,mBAAmB,MAAM,CAAA;AAC7C,EAAA,MAAM,eAAe,WAAA,CAAY,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,MAAM,CAAA;AAEpE,EAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,IAAA,OAAO,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,MAAO;AAAA,MACjC,EAAA,EAAI,CAAA,CAAE,EAAA,IAAM,CAAA,KAAA,EAAQ,IAAI,CAAC,CAAA,CAAA;AAAA,MACzB,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,QAAA,EAAU,MAAA;AAAA,MACV,UAAU,CAAA,CAAE;AAAA,KACd,CAAE,CAAA;AAAA,EACJ;AAGA,EAAA,IAAI,YAAY,CAAA,EAAG;AACjB,IAAA,OAAO,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,WAAU,EAAG,CAAC,GAAG,CAAA,MAAO;AAAA,MAClD,EAAA,EAAI,CAAA,KAAA,EAAQ,CAAA,GAAI,CAAC,CAAA,CAAA;AAAA,MACjB,KAAA,EAAO,CAAA,sBAAA,EAAyB,CAAA,GAAI,CAAC,CAAA,CAAA;AAAA,MACrC,QAAA,EAAU,MAAA;AAAA,MACV,QAAA,EAAU;AAAA,KACZ,CAAE,CAAA;AAAA,EACJ;AAEA,EAAA,OAAO,EAAC;AACV;AAgBA,SAAS,2BAAA,CACP,WACA,MAAA,EACwC;AACxC,EAAA,MAAM,YAAoD,EAAC;AAE3D,EAAA,KAAA,MAAW,QAAA,IAAY,OAAO,aAAA,EAAe;AAC3C,IAAA,MAAM,WAAA,GAAc,SAAS,iBAAA,CAAkB,IAAA;AAAA,MAAK,CAAC,MACnD,CAAA,CAAE,SAAA,CAAU,aAAY,CAAE,QAAA,CAAS,SAAA,CAAU,WAAA,EAAa;AAAA,KAC5D;AACA,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,GAAI,CAAA,EAAG,YAAY,aAAa,CAAA,EAAA,EAAK,YAAY,SAAS,CAAA,CAAA;AAAA,IACpF,CAAA,MAAA,IAAW,QAAA,CAAS,QAAA,CAAS,QAAA,CAAS,SAAS,CAAA,EAAG;AAChD,MAAA,SAAA,CAAU,SAAS,KAAK,CAAA,GAAI,QAAA,CAAS,QAAA,CAAS,SAAS,CAAC,CAAA;AAAA,IAC1D;AAAA,EACF;AAEA,EAAA,OAAO,SAAA;AACT;AAEA,SAAS,iBAAA,CACP,MAAA,EACA,MAAA,EACA,gBAAA,EACsB;AACtB,EAAA,MAAM,YAAY,UAAA,EAAW;AAC7B,EAAA,MAAM,MAAA,GAAS,WAAA,CAAY,MAAA,EAAQ,MAAM,CAAA;AAEzC,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAmB;AAC5C,EAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,cAAA,EAAgB;AACvC,MAAA,YAAA,CAAa,IAAI,KAAK,CAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAA8B;AAAA,IAClC,SAAA;AAAA,IACA,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,MAAA;AAAA,IACA,gBAAA,EAAkB,CAAA;AAAA,IAClB,iBAAiB,EAAC;AAAA,IAClB,YAAA,EAAc,KAAA,CAAM,IAAA,CAAK,YAAY,CAAA;AAAA,IACrC,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IAClC,aAAA,EAAe,OAAO,QAAA,IAAY;AAAA,MAChC,KAAA,EAAO,CAAA;AAAA,MACP,IAAA,EAAM,CAAA;AAAA,MACN,MAAA,EAAQ,CAAA;AAAA,MACR,GAAA,EAAK,CAAA;AAAA,MACL,YAAY;AAAC,KACf;AAAA,IACA,eAAe,MAAA,GACX;AAAA,MACE,cAAA,EAAgB,OAAO,eAAA,CAAgB,MAAA;AAAA,MACvC,YAAA,EAAc,OAAO,YAAA,CAAa;AAAA,KACpC,GACA;AAAA,GACN;AAEA,EAAA,UAAA,CAAW,KAAA,EAAO,kBAAkB,MAAM,CAAA;AAC1C,EAAA,OAAO,KAAA;AACT;AAEA,eAAe,sBAAA,CACb,IAAA,EACA,QAAA,EACA,MAAA,EACoC;AACpC,EAAA,MAAM,YAAuC,EAAC;AAE9C,EAAA,KAAA,MAAW,SAAA,IAAa,KAAK,cAAA,EAAgB;AAC3C,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,QAAA,EAAU,SAAS,CAAA;AAE9C,IAAA,MAAM,cAAA,GAAiB,QAAQ,aAAA,CAAc,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,SAAS,CAAA;AAC9E,IAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,cAAA,CAAe,SAAS,CAAA;AAEtD,IAAA,MAAM,QAAA,GAAW,2BAAA;AAAA,MACf,OAAA;AAAA,MACA,IAAA;AAAA,MACA,gBAAA;AAAA,MACA,cAAA,EAAgB,OAAA;AAAA,MAChB;AAAA,KACF;AAEA,IAAA,SAAA,CAAU,IAAA,CAAK;AAAA,MACb,KAAA,EAAO,SAAA;AAAA,MACP,WAAW,OAAA,CAAQ,IAAA;AAAA,MACnB,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,QAAA;AAAA,MACA,UAAA,EAAY,iBAAA,CAAkB,QAAA,EAAU,SAAS,CAAA;AAAA,MACjD,SAAA,EAAW,iBAAiB,QAAQ;AAAA,KACrC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,SAAA;AACT;AAEA,SAAS,2BAAA,CACP,OAAA,EACA,IAAA,EACA,gBAAA,EACA,eACA,iBAAA,EACQ;AACR,EAAA,MAAM,KAAA,GAAQ,gBAAA,CAAiB,OAAA,EAAS,IAAI,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAW,gBAAA,IAAoB,aAAA,IAAiB,kBAAA,CAAmB,SAAS,IAAI,CAAA;AACtF,EAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,OAAA,EAAS,iBAAiB,CAAA;AAE9D,EAAA,OAAO,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,QAAQ,GAAG,SAAS,CAAA,CAAA;AACzC;AAEA,SAAS,gBAAA,CAAiB,SAA+B,IAAA,EAAoC;AAC3F,EAAA,MAAM,MAAA,GAAwC;AAAA,IAC5C,SAAA,EAAW,CAAA,qCAAA,EAAwC,IAAA,CAAK,KAAK,CAAA,EAAA,CAAA;AAAA,IAC7D,GAAA,EAAK,CAAA,+BAAA,EAAkC,IAAA,CAAK,KAAK,CAAA,EAAA,CAAA;AAAA,IACjD,GAAA,EAAK,CAAA,8BAAA,EAAiC,IAAA,CAAK,KAAK,CAAA,EAAA,CAAA;AAAA,IAChD,EAAA,EAAI,CAAA,gCAAA,EAAmC,IAAA,CAAK,KAAK,CAAA,EAAA,CAAA;AAAA,IACjD,OAAA,EAAS,CAAA,+BAAA,EAAkC,IAAA,CAAK,KAAK,CAAA,EAAA,CAAA;AAAA,IACrD,aAAA,EAAe,CAAA,gCAAA,EAAmC,IAAA,CAAK,KAAK,CAAA,EAAA,CAAA;AAAA,IAC5D,aAAA,EAAe,CAAA,6BAAA,EAAgC,IAAA,CAAK,KAAK,CAAA,EAAA,CAAA;AAAA,IACzD,EAAA,EAAI,CAAA,+BAAA,EAAkC,IAAA,CAAK,KAAK,CAAA,EAAA;AAAA,GAClD;AAEA,EAAA,OAAO,OAAO,OAAA,CAAQ,IAAI,CAAA,IAAK,CAAA,WAAA,EAAc,KAAK,KAAK,CAAA,EAAA,CAAA;AACzD;AAEA,SAAS,kBAAA,CAAmB,UAAgC,IAAA,EAAoC;AAC9F,EAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAQ;AAC5B,IAAA,OAAO,CAAA,UAAA,EAAa,IAAA,CAAK,QAAQ,CAAA,UAAA,EAAa,KAAK,QAAQ,CAAA,8CAAA,CAAA;AAAA,EAC7D;AACA,EAAA,OAAO,CAAA,KAAA,EAAQ,KAAK,QAAQ,CAAA,iDAAA,CAAA;AAC9B;AAEA,SAAS,iBAAA,CACP,SACA,iBAAA,EACQ;AACR,EAAA,IAAI,CAAC,iBAAA,IAAqB,iBAAA,CAAkB,MAAA,KAAW,GAAG,OAAO,EAAA;AAEjE,EAAA,MAAM,kBAAA,GAAsC,CAAC,WAAA,EAAa,IAAA,EAAM,SAAS,CAAA;AACzE,EAAA,MAAM,kBACJ,iBAAA,CAAkB,MAAA,IAAU,KAAK,kBAAA,CAAmB,QAAA,CAAS,QAAQ,IAAI,CAAA;AAE3E,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,MAAM,YAAA,GAAe,iBAAA,CAAkB,iBAAA,CAAkB,MAAA,GAAS,CAAC,CAAA;AACnE,IAAA,OAAO,CAAA,aAAA,EAAgB,aAAa,SAAS,CAAA,+DAAA,CAAA;AAAA,EAC/C;AACA,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,iBAAA,CACP,UACA,iBAAA,EACuC;AACvC,EAAA,MAAM,aAAoD,EAAC;AAE3D,EAAA,KAAA,MAAW,QAAQ,iBAAA,EAAmB;AACpC,IAAA,IAAI,QAAA,CAAS,QAAA,CAAS,IAAA,CAAK,SAAS,CAAA,EAAG;AACrC,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,WAAA,EAAY,CAAE,SAAS,UAAU,CAAA,GACnD,WAAA,GACA,QAAA,CAAS,WAAA,EAAY,CAAE,QAAA,CAAS,aAAa,IAC3C,WAAA,GACA,QAAA;AACN,MAAA,UAAA,CAAW,KAAK,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,MAAM,CAAA;AAAA,IAC7C;AAAA,EACF;AAEA,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,iBAAiB,QAAA,EAA4B;AACpD,EAAA,MAAM,SAAA,GAAY,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAK,CAAE,MAAA,GAAS,EAAE,CAAA;AAC7E,EAAA,OAAO,SAAA,CAAU,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AAClD;AAEA,SAAS,cAAA,CACP,KAAA,EACA,SAAA,EACA,QAAA,EACA,QACA,UAAA,EACsB;AACtB,EAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,SAAS,CAAA;AACzE,EAAA,IAAI,SAAA,KAAc,IAAI,OAAO,KAAA;AAE7B,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA;AACnC,EAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAEjB,EAAA,MAAM,KAAA,GAAyB;AAAA,IAC7B,SAAA;AAAA,IACA,cAAc,IAAA,CAAK,KAAA;AAAA,IACnB,iBAAiB,IAAA,CAAK,QAAA;AAAA,IACtB,iBAAiB,IAAA,CAAK,QAAA;AAAA,IACtB,cAAc,IAAA,CAAK,cAAA;AAAA,IACnB,WAAW,EAAC;AAAA,IACZ,QAAA;AAAA,IACA,cAAA,EAAgB,MAAA;AAAA,IAChB;AAAA,GACF;AAEA,EAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,EAAA,KAAA,CAAM,eAAA,CAAgB,KAAK,KAAK,CAAA;AAEhC,EAAA,IAAI,KAAA,CAAM,qBAAqB,SAAA,EAAW;AACxC,IAAA,KAAA,CAAM,gBAAA,GAAmB,yBAAyB,KAAK,CAAA;AAAA,EACzD;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,yBAAyB,KAAA,EAAqC;AACrE,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AAC5C,IAAA,IAAI,CAAC,KAAA,CAAM,MAAA,CAAO,CAAC,EAAE,SAAA,EAAW;AAC9B,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,OAAO,MAAM,MAAA,CAAO,MAAA;AACtB;AAEA,SAAS,iBAAiB,KAAA,EAA+D;AACvF,EAAA,MAAM,SAAA,GAAY,EAAE,QAAA,EAAU,CAAA,EAAG,UAAU,CAAA,EAAG,QAAA,EAAU,CAAA,EAAG,OAAA,EAAS,CAAA,EAAE;AACtE,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAsB;AAE/C,EAAA,KAAA,MAAW,KAAA,IAAS,MAAM,eAAA,EAAiB;AACzC,IAAA,QAAQ,MAAM,QAAA;AAAU,MACtB,KAAK,QAAA;AACH,QAAA,SAAA,CAAU,QAAA,EAAA;AACV,QAAA;AAAA,MACF,KAAK,OAAA;AACH,QAAA,SAAA,CAAU,QAAA,EAAA;AACV,QAAA,IAAI,MAAM,UAAA,EAAY;AACpB,UAAA,MAAM,WAAW,YAAA,CAAa,GAAA,CAAI,KAAA,CAAM,UAAU,KAAK,EAAC;AACxD,UAAA,QAAA,CAAS,IAAA,CAAK,CAAA,UAAA,EAAa,KAAA,CAAM,YAAY,CAAA,CAAE,CAAA;AAC/C,UAAA,YAAA,CAAa,GAAA,CAAI,KAAA,CAAM,UAAA,EAAY,QAAQ,CAAA;AAAA,QAC7C;AACA,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,SAAA,CAAU,QAAA,EAAA;AACV,QAAA;AAAA,MACF;AACE,QAAA,SAAA,CAAU,OAAA,EAAA;AAAA;AACd,EACF;AAEA,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,MAAA,EAAQ;AAC/B,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,SAAA,CAAU,OAAA,EAAA;AAAA,IACZ;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,cAAA,EAAgB,MAAM,eAAA,CAAgB,MAAA;AAAA,IACtC,SAAA;AAAA,IACA,kBAAA,EAAoB,KAAA,CAAM,IAAA,CAAK,YAAA,CAAa,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,OAAA,EAAS,SAAS,CAAA,MAAO;AAAA,MACpF,OAAA;AAAA,MACA;AAAA,KACF,CAAE;AAAA,GACJ;AACF;AAEO,SAAS,yBAAA,CAA0B,KAAkB,MAAA,EAAoC;AAC9F,EAAA,OAAOM,IAAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,8EAAA,CAAA;AAAA,IAiBb,IAAA,EAAM;AAAA,MACJ,MAAA,EAAQA,IAAAA,CAAK,MAAA,CACV,IAAA,CAAK,CAAC,OAAA,EAAS,UAAA,EAAY,QAAA,EAAU,MAAA,EAAQ,KAAK,CAAC,CAAA,CACnD,SAAS,mBAAmB,CAAA;AAAA,MAC/B,SAAA,EAAWA,KAAK,MAAA,CACb,MAAA,GACA,QAAA,EAAS,CACT,SAAS,oDAAoD,CAAA;AAAA,MAChE,gBAAA,EAAkBA,KAAK,MAAA,CACpB,MAAA,GACA,QAAA,EAAS,CACT,SAAS,2EAA2E,CAAA;AAAA,MACvF,SAAA,EAAWA,KAAK,MAAA,CAAO,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,kCAAkC,CAAA;AAAA,MACtF,QAAA,EAAUA,IAAAA,CAAK,MAAA,CACZ,IAAA,CAAK,CAAC,QAAA,EAAU,OAAA,EAAS,QAAQ,CAAC,CAAA,CAClC,QAAA,EAAS,CACT,SAAS,gCAAgC,CAAA;AAAA,MAC5C,MAAA,EAAQA,KAAK,MAAA,CAAO,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,qBAAqB,CAAA;AAAA,MACtE,UAAA,EAAYA,KAAK,MAAA,CACd,MAAA,GACA,QAAA,EAAS,CACT,SAAS,8CAA8C;AAAA,KAC5D;AAAA,IAEA,MAAM,QAAQ,IAAA,EAAuB;AACnC,MAAA,MAAM,MAAA,GAAS,MAAM,sBAAA,CAAuB,GAAA,EAAK,QAAQ,IAAI,CAAA;AAC7D,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,IACvC;AAAA,GACD,CAAA;AACH;AAYA,eAAe,sBAAA,CACb,GAAA,EACA,MAAA,EACA,IAAA,EACgC;AAChC,EAAA,oBAAA,EAAqB;AACrB,EAAA,MAAM,QAAA,GAAW,MAAM,YAAA,EAAa;AAEpC,EAAA,QAAQ,KAAK,MAAA;AAAQ,IACnB,KAAK,OAAA,EAAS;AACZ,MAAA,IAAI,CAAC,KAAK,gBAAA,EAAkB;AAC1B,QAAAN,KAAAA,CAAI,KAAK,uCAAuC,CAAA;AAChD,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,SAAA,EAAW,EAAA;AAAA,UACX,OAAO,EAAC;AAAA,UACR,YAAA,EAAc,KAAA;AAAA,UACd,KAAA,EAAO,+CAAA;AAAA,UACP,UAAA,EAAY;AAAA,SACd;AAAA,MACF;AAEA,MAAA,MAAM,YAAA,GAAeE,IAAAA,CAAK,IAAA,CAAK,gBAAA,EAAkB,eAAe,CAAA;AAChE,MAAA,MAAM,UAAA,GAAaA,IAAAA,CAAK,IAAA,CAAK,gBAAA,EAAkB,aAAa,CAAA;AAE5D,MAAA,IAAI,CAACC,UAAAA,CAAW,YAAY,CAAA,EAAG;AAC7B,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,SAAA,EAAW,EAAA;AAAA,UACX,OAAO,EAAC;AAAA,UACR,YAAA,EAAc,KAAA;AAAA,UACd,KAAA,EAAO,4BAA4B,YAAY,CAAA,CAAA;AAAA,UAC/C,UAAA,EAAY;AAAA,SACd;AAAA,MACF;AAEA,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI,MAAA;AACJ,MAAA,IAAI;AACF,QAAA,MAAM,eAAA,GAAkB,MAAMC,QAAAA,CAAS,YAAA,EAAc,OAAO,CAAA;AAC5D,QAAA,MAAA,GAAS,IAAA,CAAK,MAAM,eAAe,CAAA;AAEnC,QAAA,IAAID,UAAAA,CAAW,UAAU,CAAA,EAAG;AAC1B,UAAA,MAAM,aAAA,GAAgB,MAAMC,QAAAA,CAAS,UAAA,EAAY,OAAO,CAAA;AACxD,UAAA,MAAA,GAAS,IAAA,CAAK,MAAM,aAAa,CAAA;AAAA,QACnC;AAAA,MACF,SAAS,CAAA,EAAG;AACV,QAAAJ,KAAAA,CAAI,MAAM,6BAAA,EAA+B;AAAA,UACvC,OAAO,CAAA,YAAa,KAAA,GAAQ,CAAA,CAAE,OAAA,GAAU,OAAO,CAAC,CAAA;AAAA,UAChD,kBAAkB,IAAA,CAAK;AAAA,SACxB,CAAA;AACD,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,SAAA,EAAW,EAAA;AAAA,UACX,OAAO,EAAC;AAAA,UACR,YAAA,EAAc,KAAA;AAAA,UACd,KAAA,EAAO,gCAAgC,CAAA,YAAa,KAAA,GAAQ,EAAE,OAAA,GAAU,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA;AAAA,UACjF,UAAA,EAAY;AAAA,SACd;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,OAAO,QAAA,EAAU;AACpB,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,SAAA,EAAW,EAAA;AAAA,UACX,OAAO,EAAC;AAAA,UACR,YAAA,EAAc,KAAA;AAAA,UACd,KAAA,EAAO,iDAAA;AAAA,UACP,UAAA,EAAY;AAAA,SACd;AAAA,MACF;AAEA,MAAA,IAAI,CAAC,MAAA,CAAO,cAAA,IAAkB,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA,EAAG;AACtD,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,oFAAA;AAAA,UACA,MAAA,CAAO;AAAA,SACT;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,MAAA,EAAQ,MAAA,EAAQ,KAAK,gBAAgB,CAAA;AACrE,MAAAA,KAAAA,CAAI,KAAK,iBAAA,EAAmB;AAAA,QAC1B,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,WAAA,EAAa,MAAM,MAAA,CAAO,MAAA;AAAA,QAC1B,SAAA,EAAW,CAAC,CAAC;AAAA,OACd,CAAA;AAED,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA;AAClC,MAAA,MAAM,YAAY,WAAA,GACd,MAAM,uBAAuB,WAAA,EAAa,QAAA,EAAU,MAAM,CAAA,GAC1D,MAAA;AAEJ,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,KAAA;AAAA,QACA,WAAA;AAAA,QACA,gBAAA,EAAkB,SAAA;AAAA,QAClB,YAAA,EAAc,KAAA,CAAM,MAAA,CAAO,MAAA,GAAS;AAAA,OACtC;AAAA,IACF;AAAA,IAEA,KAAK,UAAA,EAAY;AACf,MAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,SAAA,EAAW,EAAA;AAAA,UACX,OAAO,EAAC;AAAA,UACR,YAAA,EAAc,KAAA;AAAA,UACd,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,CAAK,SAAS,CAAA;AACvC,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,OAAO,EAAC;AAAA,UACR,YAAA,EAAc,KAAA;AAAA,UACd,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAEA,MAAA,MAAM,WAAA,GAAc,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,gBAAgB,CAAA;AACvD,MAAA,IAAI,CAAC,WAAA,IAAe,WAAA,CAAY,SAAA,EAAW;AACzC,QAAA,MAAM,SAAA,GAAY,yBAAyB,KAAK,CAAA;AAChD,QAAA,IAAI,SAAA,IAAa,KAAA,CAAM,MAAA,CAAO,MAAA,EAAQ;AACpC,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,IAAA;AAAA,YACT,WAAW,KAAA,CAAM,SAAA;AAAA,YACjB,KAAA;AAAA,YACA,YAAA,EAAc,KAAA;AAAA,YACd,OAAA,EAAS,iBAAiB,KAAK;AAAA,WACjC;AAAA,QACF;AACA,QAAA,KAAA,CAAM,gBAAA,GAAmB,SAAA;AAAA,MAC3B;AAEA,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,gBAAgB,CAAA;AACpD,MAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,KAAA,CAAM,SAAS,CAAA,EAAG,MAAA;AAEpD,MAAA,MAAM,SAAA,GAAY,MAAM,sBAAA,CAAuB,QAAA,EAAU,UAAU,MAAM,CAAA;AAEzE,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,KAAA;AAAA,QACA,WAAA,EAAa,QAAA;AAAA,QACb,gBAAA,EAAkB,SAAA;AAAA,QAClB,YAAA,EAAc,KAAA,CAAM,gBAAA,GAAmB,KAAA,CAAM,OAAO,MAAA,GAAS;AAAA,OAC/D;AAAA,IACF;AAAA,IAEA,KAAK,QAAA,EAAU;AACb,MAAA,IAAI,CAAC,KAAK,SAAA,IAAa,CAAC,KAAK,SAAA,IAAa,CAAC,KAAK,QAAA,EAAU;AACxD,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,SAAA,EAAW,KAAK,SAAA,IAAa,EAAA;AAAA,UAC7B,OAAO,EAAC;AAAA,UACR,YAAA,EAAc,KAAA;AAAA,UACd,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,CAAK,SAAS,CAAA;AACvC,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,OAAO,EAAC;AAAA,UACR,YAAA,EAAc,KAAA;AAAA,UACd,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAEA,MAAA,MAAM,YAAA,GAAe,cAAA;AAAA,QACnB,KAAA;AAAA,QACA,IAAA,CAAK,SAAA;AAAA,QACL,IAAA,CAAK,QAAA;AAAA,QACL,IAAA,CAAK,MAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AACA,MAAAA,KAAAA,CAAI,MAAM,mBAAA,EAAqB;AAAA,QAC7B,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,UAAU,IAAA,CAAK;AAAA,OAChB,CAAA;AAED,MAAA,MAAM,OAAA,GAAU,YAAA,CAAa,gBAAA,GAAmB,YAAA,CAAa,MAAA,CAAO,MAAA;AAEpE,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,WAAW,YAAA,CAAa,SAAA;AAAA,QACxB,KAAA,EAAO,YAAA;AAAA,QACP,YAAA,EAAc,OAAA;AAAA,QACd,OAAA,EAAS,CAAC,OAAA,GAAU,gBAAA,CAAiB,YAAY,CAAA,GAAI;AAAA,OACvD;AAAA,IACF;AAAA,IAEA,KAAK,MAAA,EAAQ;AACX,MAAA,IAAI,CAAC,IAAA,CAAK,SAAA,IAAa,CAAC,KAAK,SAAA,EAAW;AACtC,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,SAAA,EAAW,KAAK,SAAA,IAAa,EAAA;AAAA,UAC7B,OAAO,EAAC;AAAA,UACR,YAAA,EAAc,KAAA;AAAA,UACd,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,CAAK,SAAS,CAAA;AACvC,MAAA,IAAI,CAAC,KAAA,EAAO;AACV,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,OAAO,EAAC;AAAA,UACR,YAAA,EAAc,KAAA;AAAA,UACd,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAEA,MAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,KAAc,IAAA,CAAK,SAAS,CAAA;AAC9E,MAAA,IAAI,cAAc,EAAA,EAAI;AACpB,QAAA,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA,CAAE,SAAA,GAAY,IAAA;AACpC,QAAA,KAAA,CAAM,gBAAA,GAAmB,yBAAyB,KAAK,CAAA;AAAA,MACzD;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,KAAA;AAAA,QACA,YAAA,EAAc,KAAA,CAAM,gBAAA,GAAmB,KAAA,CAAM,MAAA,CAAO;AAAA,OACtD;AAAA,IACF;AAAA,IAEA,KAAK,KAAA,EAAO;AACV,MAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,SAAA,EAAW,EAAA;AAAA,UACX,OAAO,EAAC;AAAA,UACR,YAAA,EAAc,KAAA;AAAA,UACd,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAEA,MAAA,MAAM,WAAA,GAAc,kBAAA,CAAmB,IAAA,CAAK,SAAS,CAAA;AACrD,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,OAAO,EAAC;AAAA,UACR,YAAA,EAAc,KAAA;AAAA,UACd,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AAEA,MAAA,MAAM,QAAQ,WAAA,CAAY,KAAA;AAC1B,MAAA,cAAA,CAAe,MAAA,CAAO,KAAK,SAAS,CAAA;AACpC,MAAA,MAAM,UAAA,GAAa,iBAAiB,KAAK,CAAA;AAEzC,MAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,SAAS,CAAC,MAAA,CAAO,QAAQ,IAAA,EAAM;AACjD,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,WAAW,IAAA,CAAK,SAAA;AAAA,UAChB,KAAA;AAAA,UACA,YAAA,EAAc,KAAA;AAAA,UACd,KAAA,EAAO,8BAAA;AAAA,UACP,UAAA,EAAY;AAAA,SACd;AAAA,MACF;AAEA,MAAA,MAAM,cAAA,GAAiB,MAAM,mBAAA,CAAoB,GAAA,EAAK,QAAQ,KAAK,CAAA;AAEnE,MAAAA,KAAAA,CAAI,KAAK,sCAAA,EAAwC;AAAA,QAC/C,WAAW,IAAA,CAAK,SAAA;AAAA,QAChB,cAAA,EAAgB,YAAY,cAAA,IAAkB,CAAA;AAAA,QAC9C,WAAW,UAAA,EAAY,SAAA;AAAA,QACvB,cAAA,EAAgB,cAAA,CAAe,OAAA,CAAQ,cAAA,IAAkB;AAAA,OAC1D,CAAA;AAED,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,KAAA;AAAA,QACA,YAAA,EAAc,KAAA;AAAA,QACd,OAAA,EAAS,UAAA;AAAA,QACT;AAAA,OACF;AAAA,IACF;AAAA,IAEA;AACE,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,SAAA,EAAW,EAAA;AAAA,QACX,OAAO,EAAC;AAAA,QACR,YAAA,EAAc,KAAA;AAAA,QACd,KAAA,EAAO,CAAA,gBAAA,EAAmB,IAAA,CAAK,MAAM,CAAA;AAAA,OACvC;AAAA;AAEN;AClwBA,IAAM,aAAA,GAA+C;AAAA,EACnD,OAAA,EAAS,WAAA;AAAA,EACT,SAAA,EAAW,WAAA;AAAA,EACX,MAAA,EAAQ,KAAA;AAAA,EACR,SAAA,EAAW,KAAA;AAAA,EACX,GAAA,EAAK,KAAA;AAAA,EACL,KAAA,EAAO,KAAA;AAAA,EACP,MAAA,EAAQ,KAAA;AAAA,EACR,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,IAAA;AAAA,EACN,iBAAA,EAAmB,IAAA;AAAA,EACnB,EAAA,EAAI,IAAA;AAAA,EACJ,IAAA,EAAM,SAAA;AAAA,EACN,kBAAA,EAAoB,SAAA;AAAA,EACpB,OAAA,EAAS,SAAA;AAAA,EACT,KAAA,EAAO,aAAA;AAAA,EACP,aAAA,EAAe,aAAA;AAAA,EACf,EAAA,EAAI,aAAA;AAAA,EACJ,KAAA,EAAO,aAAA;AAAA,EACP,aAAA,EAAe,aAAA;AAAA,EACf,MAAA,EAAQ,aAAA;AAAA,EACR,GAAA,EAAK,IAAA;AAAA,EACL,cAAA,EAAgB,IAAA;AAAA,EAChB,EAAA,EAAI;AACN,CAAA;AAKA,IAAM,2BAAA,GAA+C;AAAA,EACnD,WAAA;AAAA;AAAA,EACA,KAAA;AAAA;AAAA,EACA,KAAA;AAAA;AAAA,EACA;AAAA;AACF,CAAA;AAKO,SAAS,qBAAA,CAAsB,KAAkB,MAAA,EAAoC;AAC1F,EAAA,OAAOM,IAAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA,gEAAA,CAAA;AAAA,IAoBb,IAAA,EAAM;AAAA,MACJ,OAAOA,IAAAA,CAAK,MAAA,CAAO,MAAA,EAAO,CAAE,SAAS,gDAAgD,CAAA;AAAA,MACrF,aAAaA,IAAAA,CAAK,MAAA,CAAO,MAAA,EAAO,CAAE,SAAS,+CAA+C,CAAA;AAAA,MAC1F,OAAA,EAASA,KAAK,MAAA,CACX,MAAA,GACA,QAAA,EAAS,CACT,SAAS,8DAA8D,CAAA;AAAA,MAC1E,OAAA,EAASA,IAAAA,CAAK,MAAA,CACX,KAAA,CAAMA,IAAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,CAAA,CAC1B,QAAA,EAAS,CACT,QAAA,CAAS,wDAAwD,CAAA;AAAA,MACpE,MAAA,EAAQA,IAAAA,CAAK,MAAA,CACV,KAAA,CAAMA,IAAAA,CAAK,OAAO,MAAA,EAAQ,CAAA,CAC1B,QAAA,EAAS,CACT,QAAA;AAAA,QACC;AAAA;AACF,KACJ;AAAA,IAEA,MAAM,QAAQ,IAAA,EAAuB;AACnC,MAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,CAAmB,GAAA,EAAK,QAAQ,IAAuB,CAAA;AAC5E,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,IACvC;AAAA,GACD,CAAA;AACH;AAEA,eAAe,kBAAA,CACb,GAAA,EACA,MAAA,EACA,IAAA,EAC4B;AAE5B,EAAA,MAAM,QAAA,GAAW,MAAM,YAAA,EAAa;AAGpC,EAAA,IAAI,UAAA,GAA8B,2BAAA;AAElC,EAAA,IAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,EAAG;AACzC,IAAA,UAAA,GAAa,IAAA,CAAK,MAAA,CACf,GAAA,CAAI,CAAC,MAAM,aAAA,CAAc,CAAA,CAAE,WAAA,EAAa,CAAC,CAAA,CACzC,MAAA,CAAO,CAAC,CAAA,KAA0B,MAAM,MAAS,CAAA;AAEpD,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,2BAAA;AAAA,QACP,UAAA,EAAY,iBAAiB,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,OACpE;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAqB;AAAA,IACzB,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,SAAS,IAAA,CAAK;AAAA,GAChB;AAGA,EAAA,MAAM,eAAmC,EAAC;AAE1C,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AACtC,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,MAAM,cAAc,MAAM,iBAAA,CAAkB,KAAK,MAAA,EAAQ,OAAA,EAAS,OAAO,YAAY,CAAA;AACrF,IAAA,YAAA,CAAa,KAAK,WAAW,CAAA;AAAA,EAC/B;AAGA,EAAA,MAAM,YAAY,MAAM,oBAAA,CAAqB,GAAA,EAAK,MAAA,EAAQ,OAAO,YAAY,CAAA;AAG7E,EAAA,MAAM,QAAA,GAAWQ,UAAAA,EAAW,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AACxC,EAAA,MAAM,YAAA,GAAeZ,KAAK,GAAA,CAAI,SAAA,EAAW,aAAa,SAAA,EAAW,CAAA,aAAA,EAAgB,QAAQ,CAAA,GAAA,CAAK,CAAA;AAE9F,EAAA,IAAI;AACF,IAAA,MAAMS,MAAMJ,OAAAA,CAAQ,YAAY,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACtD,IAAA,MAAMK,UAAU,YAAA,EAAc,sBAAA,CAAuB,OAAO,YAAA,EAAc,SAAS,GAAG,OAAO,CAAA;AAAA,EAC/F,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,KAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,eAAe,iBAAA,CACb,GAAA,EACA,MAAA,EACA,OAAA,EACA,OACA,oBAAA,EAC2B;AAE3B,EAAA,MAAM,eAAA,GACJ,oBAAA,CAAqB,MAAA,GAAS,CAAA,GAC1B;;AAAA;AAAA,EAAsC,qBACnC,GAAA,CAAI,CAAC,MAAM,CAAA,EAAA,EAAK,CAAA,CAAE,SAAS,CAAA,EAAA,EAAK,CAAA,CAAE,YAAY,KAAA,CAAM,CAAA,EAAG,GAAG,CAAC,CAAA,GAAA,CAAK,EAChE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GACb,EAAA;AAEN,EAAA,MAAM,cAAA,GAAiB,MAAM,OAAA,GACzB;;AAAA;AAAA,EAAkC,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,MAAM,CAAA,EAAG,CAAA,GAAI,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GAC1F,EAAA;AAEJ,EAAA,MAAM,SAAS,CAAA,QAAA,EAAW,OAAA,CAAQ,IAAI,CAAA,MAAA,EAAS,QAAQ,KAAK,CAAA;;AAAA,EAE5D,QAAQ,QAAQ;;AAAA;;AAAA,EAAA,EAId,MAAM,KAAK,CAAA;;AAAA,EAEb,MAAM,WAAW;;AAAA,EAEjB,MAAM,OAAA,GAAU,CAAA;AAAA,EAAgB,KAAA,CAAM,OAAO,CAAA,CAAA,GAAK,EAAE;AAAA,EACpD,cAAc;AAAA,EACd,eAAe;;AAAA;;AAAA,uEAAA,EAIwD,QAAQ,KAAK,CAAA;;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA,sDAAA,CAAA;AAmBpF,EAAA,IAAI;AACF,IAAA,MAAM,YAAA,GAAe,MAAM,GAAA,CAAI,MAAA,CAAO,QAAQ,MAAA,CAAO;AAAA,MACnD,IAAA,EAAM;AAAA,QACJ,KAAA,EAAO,CAAA,cAAA,EAAiB,OAAA,CAAQ,IAAI,CAAA;AAAA;AACtC,KACD,CAAA;AAED,IAAA,IAAI,CAAC,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI;AAC1B,MAAA,OAAO,yBAAA,CAA0B,SAAS,KAAK,CAAA;AAAA,IACjD;AAEA,IAAA,MAAM,SAAA,GAAY,aAAa,IAAA,CAAK,EAAA;AACpC,IAAA,uBAAA,CAAwB,WAAW,cAAc,CAAA;AAEjD,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAcP,iBAAAA;AAAA,QAClB,MAAA,CAAO,OAAO,MAAA,IAAU;AAAA,OAC1B;AAEA,MAAA,MAAM,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO;AAAA,QAC9B,IAAA,EAAM,EAAE,EAAA,EAAI,SAAA,EAAU;AAAA,QACtB,IAAA,EAAM;AAAA,UACJ,KAAA,EAAO,WAAA;AAAA,UACP,OAAO,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,QAAQ;AAAA;AACxC,OACD,CAAA;AAED,MAAA,MAAM,cAAA,GAAiB,MAAM,GAAA,CAAI,MAAA,CAAO,QAAQ,QAAA,CAAS;AAAA,QACvD,IAAA,EAAM,EAAE,EAAA,EAAI,SAAA;AAAU,OACvB,CAAA;AAED,MAAA,MAAM,WAAA,GAAc,cAAA,CAAe,IAAA,EAAM,EAAA,CAAG,CAAA,CAAE,CAAA;AAC9C,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,OAAO,yBAAA,CAA0B,SAAS,KAAK,CAAA;AAAA,MACjD;AAEA,MAAA,MAAM,SAAA,GAAY,WAAA,CAAY,KAAA,EAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,MAAM,CAAA,IAAK,EAAC;AAC1E,MAAA,MAAM,OAAA,GAAU,UAAU,GAAA,CAAI,CAAC,MAAO,CAAA,CAAuB,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAE5E,MAAA,OAAO,kBAAA,CAAmB,SAAS,OAAO,CAAA;AAAA,IAC5C,CAAA,SAAE;AACA,MAAA,yBAAA,CAA0B,SAAS,CAAA;AAAA,IACrC;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,yBAAA,CAA0B,SAAS,KAAK,CAAA;AAAA,EACjD;AACF;AAEA,SAAS,yBAAA,CACP,SACA,KAAA,EACkB;AAClB,EAAA,OAAO;AAAA,IACL,OAAO,OAAA,CAAQ,IAAA;AAAA,IACf,WAAW,OAAA,CAAQ,IAAA;AAAA,IACnB,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,aAAa,CAAA,GAAA,EAAM,OAAA,CAAQ,KAAK,CAAA,2BAAA,EAA8B,MAAM,KAAK,CAAA,oDAAA,CAAA;AAAA,IACzE,QAAA,EAAU,CAAC,yBAAyB,CAAA;AAAA,IACpC,eAAA,EAAiB,CAAC,kCAAkC;AAAA,GACtD;AACF;AAEA,SAAS,kBAAA,CAAmB,SAA+B,OAAA,EAAmC;AAE5F,EAAA,MAAM,mBAAmB,OAAA,CAAQ,KAAA;AAAA,IAC/B;AAAA,GACF;AACA,EAAA,MAAM,WAAA,GAAc,gBAAA,GAAmB,gBAAA,CAAiB,CAAC,CAAA,CAAE,MAAK,GAAI,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AAGxF,EAAA,MAAM,gBAAgB,OAAA,CAAQ,KAAA;AAAA,IAC5B;AAAA,GACF;AACA,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,MAAM,QAAQ,aAAA,CAAc,CAAC,EAAE,KAAA,CAAM,iBAAiB,KAAK,EAAC;AAC5D,IAAA,QAAA,CAAS,IAAA,CAAK,GAAG,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AAAA,EACrE;AAGA,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,CAAM,0CAA0C,CAAA;AAC1E,EAAA,MAAM,kBAA4B,EAAC;AACnC,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAM,QAAQ,SAAA,CAAU,CAAC,EAAE,KAAA,CAAM,iBAAiB,KAAK,EAAC;AACxD,IAAA,eAAA,CAAgB,IAAA,CAAK,GAAG,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AAAA,EAC5E;AAEA,EAAA,OAAO;AAAA,IACL,OAAO,OAAA,CAAQ,IAAA;AAAA,IACf,WAAW,OAAA,CAAQ,IAAA;AAAA,IACnB,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,WAAA;AAAA,IACA,UAAU,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,QAAA,GAAW,CAAC,6BAA6B,CAAA;AAAA,IACzE,iBAAiB,eAAA,CAAgB,MAAA,GAAS,CAAA,GAAI,eAAA,GAAkB,CAAC,6BAA6B;AAAA,GAChG;AACF;AAEA,eAAe,oBAAA,CACb,GAAA,EACA,MAAA,EACA,KAAA,EACA,YAAA,EACiB;AACjB,EAAA,MAAM,mBAAmB,YAAA,CACtB,GAAA;AAAA,IACC,CAAC,CAAA,KACC,CAAA,GAAA,EAAM,EAAE,SAAS,CAAA,EAAA,EAAK,EAAE,KAAK,CAAA;AAAA,EACnC,EAAE,WAAW;;AAAA,cAAA,EAEC,CAAA,CAAE,QAAA,CAAS,IAAA,CAAK,IAAI,CAAC;;AAAA,qBAAA,EAEd,CAAA,CAAE,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,GAC/C,CACC,KAAK,MAAM,CAAA;AAEd,EAAA,MAAM,MAAA,GAAS,CAAA;;AAAA,UAAA,EAEL,MAAM,KAAK;;AAAA,EAErB,MAAM,WAAW;;AAAA,EAEjB,KAAA,CAAM,UAAU,CAAA,wBAAA,EAA2B,KAAA,CAAM,QAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GAAK,EAAE;;AAAA;;AAAA,EAI1E,gBAAgB;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,4CAAA,CAAA;AAYhB,EAAA,IAAI;AACF,IAAA,MAAM,YAAA,GAAe,MAAM,GAAA,CAAI,MAAA,CAAO,QAAQ,MAAA,CAAO;AAAA,MACnD,IAAA,EAAM;AAAA,QACJ,KAAA,EAAO;AAAA;AACT,KACD,CAAA;AAED,IAAA,IAAI,CAAC,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI;AAC1B,MAAA,OAAO,0BAA0B,YAAY,CAAA;AAAA,IAC/C;AAEA,IAAA,MAAM,SAAA,GAAY,aAAa,IAAA,CAAK,EAAA;AACpC,IAAA,uBAAA,CAAwB,WAAW,cAAc,CAAA;AAEjD,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAcA,iBAAAA;AAAA,QAClB,MAAA,CAAO,OAAO,MAAA,IAAU;AAAA,OAC1B;AAEA,MAAA,MAAM,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO;AAAA,QAC9B,IAAA,EAAM,EAAE,EAAA,EAAI,SAAA,EAAU;AAAA,QACtB,IAAA,EAAM;AAAA,UACJ,KAAA,EAAO,WAAA;AAAA,UACP,OAAO,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,QAAQ;AAAA;AACxC,OACD,CAAA;AAED,MAAA,MAAM,cAAA,GAAiB,MAAM,GAAA,CAAI,MAAA,CAAO,QAAQ,QAAA,CAAS;AAAA,QACvD,IAAA,EAAM,EAAE,EAAA,EAAI,SAAA;AAAU,OACvB,CAAA;AAED,MAAA,MAAM,WAAA,GAAc,cAAA,CAAe,IAAA,EAAM,EAAA,CAAG,CAAA,CAAE,CAAA;AAC9C,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,OAAO,0BAA0B,YAAY,CAAA;AAAA,MAC/C;AAEA,MAAA,MAAM,SAAA,GAAY,WAAA,CAAY,KAAA,EAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,MAAM,CAAA,IAAK,EAAC;AAC1E,MAAA,OAAO,SAAA,CAAU,IAAI,CAAC,CAAA,KAAO,EAAuB,IAAI,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,IACrE,CAAA,SAAE;AACA,MAAA,yBAAA,CAA0B,SAAS,CAAA;AAAA,IACrC;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,0BAA0B,YAAY,CAAA;AAAA,EAC/C;AACF;AAEA,SAAS,0BAA0B,YAAA,EAA0C;AAC3E,EAAA,MAAM,cAAc,YAAA,CAAa,OAAA,CAAQ,CAAC,CAAA,KAAM,EAAE,QAAQ,CAAA;AAC1D,EAAA,MAAM,UAAU,YAAA,CAAa,OAAA,CAAQ,CAAC,CAAA,KAAM,EAAE,eAAe,CAAA;AAE7D,EAAA,OAAO,CAAA;;AAAA,4CAAA,EAEqC,aAAa,MAAM,CAAA;;AAAA;AAAA,EAG/D,WAAA,CACC,KAAA,CAAM,CAAA,EAAG,CAAC,EACV,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAA,CACnB,IAAA,CAAK,IAAI,CAAC;;AAAA;AAAA,EAGX,OAAA,CACC,KAAA,CAAM,CAAA,EAAG,CAAC,EACV,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAA,CACnB,IAAA,CAAK,IAAI,CAAC;;AAAA,oDAAA,CAAA;AAGb;AAEA,SAAS,sBAAA,CACP,KAAA,EACA,YAAA,EACA,SAAA,EACQ;AACR,EAAA,MAAM,IAAA,GAAA,qBAAW,IAAA,EAAK,EAAE,aAAY,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA;AAElD,EAAA,IAAI,GAAA,GAAM,CAAA,gBAAA,EAAmB,KAAA,CAAM,KAAK;;AAAA,UAAA,EAE9B,IAAI;;AAAA;;AAAA,EAId,MAAM,WAAW;;AAAA,EAEjB,MAAM,OAAA,GAAU,CAAA;AAAA,EAAgB,MAAM,OAAO;AAAA,CAAA,GAAO,EAAE;AAAA,EACtD,MAAM,OAAA,GAAU,CAAA;AAAA,EAA2B,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAG,CAAA,KAAM,CAAA,EAAG,CAAA,GAAI,CAAC,KAAK,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC;AAAA,CAAA,GAAO,EAAE;;AAAA;;AAAA,CAAA;AAM5G,EAAA,KAAA,MAAW,KAAK,YAAA,EAAc;AAC5B,IAAA,GAAA,IAAO,CAAA,IAAA,EAAO,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,EAAE,SAAS;;AAAA,EAErC,EAAE,WAAW;;AAAA;AAAA,EAGb,CAAA,CAAE,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC;;AAAA;AAAA,EAG1C,CAAA,CAAE,eAAA,CAAgB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAA,EAAK,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC;;AAAA;;AAAA,CAAA;AAAA,EAKjD;AAEA,EAAA,GAAA,IAAO,CAAA;;AAAA,EAEP,SAAS;AAAA,CAAA;AAGT,EAAA,OAAO,GAAA;AACT;AAEA,SAASA,kBAAiB,WAAA,EAA8D;AACtF,EAAA,MAAM,CAAC,UAAA,EAAY,OAAO,CAAA,GAAI,WAAA,CAAY,MAAM,GAAG,CAAA;AACnD,EAAA,OAAO,EAAE,UAAA,EAAY,UAAA,IAAc,WAAA,EAAa,OAAA,EAAS,WAAW,WAAA,EAAY;AAClF;AClgBA,IAAML,KAAAA,GAAM,mBAAmB,cAAc,CAAA;AAkCtC,SAAS,aAAa,MAAA,EAA+B;AAC1D,EAAA,OACE,OAAO,GAAA,IAAO;AAAA,IACZ,QAAA,EAAU,UAAA;AAAA,IACV,YAAA,EAAc,IAAA;AAAA,IACd,SAAA,EAAW;AAAA,GACb;AAEJ;AAKO,SAAS,kBAAkB,MAAA,EAA6B;AAC7D,EAAA,OAAO,YAAA,CAAa,MAAM,CAAA,CAAE,QAAA,KAAa,WAAA;AAC3C;AAKA,eAAsB,uBAAuB,GAAA,EAAoC;AAC/E,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,CAAA,CAAA,YAAA,CAAA;AACzB,IAAA,OAAO,OAAO,QAAA,KAAa,CAAA;AAAA,EAC7B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAKA,eAAsB,kBAAkB,GAAA,EAAoC;AAC1E,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,CAAA,CAAA,sBAAA,CAAA;AACzB,IAAA,OAAO,MAAA,CAAO,aAAa,CAAA,IAAK,MAAA,CAAO,OAAO,MAAM,CAAA,CAAE,MAAK,KAAM,EAAA;AAAA,EACnE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAKA,eAAsB,iBAAiB,GAAA,EAA0C;AAC/E,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,CAAA,CAAA,yBAAA,CAAA;AACzB,IAAA,OAAO,MAAA,CAAO,aAAa,CAAA,GAAI,MAAA,CAAO,OAAO,MAAM,CAAA,CAAE,MAAK,GAAI,IAAA;AAAA,EAChE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKA,eAAsB,cAAc,GAAA,EAAmC;AACrE,EAAA,IAAI;AAEF,IAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,CAAA,CAAA,qDAAA,CAAA;AACzB,IAAA,IAAI,MAAA,CAAO,aAAa,CAAA,EAAG;AACzB,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,MAAA,CAAO,MAAM,EAAE,IAAA,EAAK;AACvC,MAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,sBAAA,EAAwB,EAAE,CAAA;AAAA,IAC/C;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAGA,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,MAAM,GAAA,CAAI,CAAA,CAAA,uCAAA,CAAA;AAC5B,IAAA,IAAI,SAAA,CAAU,QAAA,KAAa,CAAA,EAAG,OAAO,MAAA;AAAA,EACvC,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,OAAO,QAAA;AACT;AASA,eAAsB,oBAAA,CACpB,GAAA,EACA,UAAA,EACA,UAAA,EACoB;AACpB,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,UAAA,IAAe,MAAM,aAAA,CAAc,GAAG,CAAA;AACnD,IAAA,MAAM,GAAA,GAAM,CAAA,gBAAA,EAAmB,UAAU,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AACjD,IAAA,MAAM,SAAS,MAAM,GAAA,CAAI,CAAA,CAAA,gBAAA,EAAoB,UAAU,IAAI,IAAI,CAAA,CAAA;AAE/D,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,OAAO,QAAA,KAAa,CAAA;AAAA,MAC7B,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAAA,MAC5B,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAAA,MAC3B,OAAA,EAAS;AAAA,KACX;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,KAClD;AAAA,EACF;AACF;AA2BA,eAAsB,YAAA,CACpB,GAAA,EACA,MAAA,EACA,WAAA,EACoB;AACpB,EAAA,IAAI;AACF,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,GAAA;AAEJ,IAAA,IAAI,eAAe,MAAA,EAAQ;AACzB,MAAA,GAAA,GAAM,sBAAsB,MAAM,CAAA,CAAA;AAClC,MAAA,MAAA,GAAS,MAAM,GAAA,CAAI,CAAA,CAAA,mBAAA,EAAuB,MAAM,CAAA,CAAA;AAAA,IAClD,WAAW,MAAA,EAAQ;AACjB,MAAA,GAAA,GAAM,mBAAmB,MAAM,CAAA,CAAA;AAC/B,MAAA,MAAA,GAAS,MAAM,GAAA,CAAI,CAAA,CAAA,gBAAA,EAAoB,MAAM,CAAA,CAAA;AAAA,IAC/C,CAAA,MAAO;AACL,MAAA,GAAA,GAAM,UAAA;AACN,MAAA,MAAA,GAAS,MAAM,GAAA,CAAI,CAAA,CAAA,QAAA,CAAA;AAAA,IACrB;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,OAAO,QAAA,KAAa,CAAA;AAAA,MAC7B,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAAA,MAC5B,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAAA,MAC3B,OAAA,EAAS;AAAA,KACX;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,KAClD;AAAA,EACF;AACF;AASA,eAAsB,oBAAA,CACpB,KACA,UAAA,EACoB;AACpB,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,oBAAoB,UAAU,CAAA,CAAA;AAC1C,IAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,CAAA,CAAA,iBAAA,EAAqB,UAAU,CAAA,CAAA;AAExD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,OAAO,QAAA,KAAa,CAAA;AAAA,MAC7B,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAAA,MAC5B,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAAA,MAC3B,OAAA,EAAS;AAAA,KACX;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,KAClD;AAAA,EACF;AACF;AA4GA,eAAsB,cAAc,GAAA,EAA2C;AAC7E,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,GAAA,CAAI,CAAA,CAAA,6BAAA,CAAA;AACzB,IAAA,IAAI,MAAA,CAAO,QAAA,KAAa,CAAA,EAAG,OAAO,EAAC;AAEnC,IAAA,MAAM,YAA4B,EAAC;AACnC,IAAA,IAAI,UAAiC,EAAC;AAEtC,IAAA,KAAA,MAAW,QAAQ,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,CAAE,KAAA,CAAM,IAAI,CAAA,EAAG;AACpD,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,WAAW,CAAA,EAAG;AAChC,QAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,UAAA,SAAA,CAAU,KAAK,OAAuB,CAAA;AAAA,QACxC;AACA,QAAA,OAAA,GAAU,EAAE,IAAA,EAAM,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAa,EAAE,CAAA,EAAE;AAAA,MAClD,CAAA,MAAA,IAAW,IAAA,CAAK,UAAA,CAAW,SAAS,CAAA,EAAG;AACrC,QAAA,OAAA,CAAQ,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,oBAAA,EAAsB,EAAE,CAAA;AAAA,MACxD,CAAA,MAAA,IAAW,SAAS,MAAA,EAAQ;AAC1B,QAAA,OAAA,CAAQ,MAAA,GAAS,IAAA;AAAA,MACnB;AAAA,IACF;AAEA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,SAAA,CAAU,KAAK,OAAuB,CAAA;AAAA,IACxC;AAGA,IAAA,MAAM,eAAe,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAC,EAAE,MAAM,CAAA;AACpD,IAAA,IAAI,YAAA,eAA2B,MAAA,GAAS,IAAA;AAExC,IAAA,OAAO,SAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;AAKA,eAAsB,cAAA,CACpB,KACA,UAAA,EACgD;AAChD,EAAA,IAAI;AAEF,IAAA,MAAM,eAAeE,IAAAA,CAAK,GAAA,CAAI,WAAW,IAAA,EAAM,CAAA,EAAG,UAAU,CAAA,SAAA,CAAW,CAAA;AAGvE,IAAA,IAAIC,UAAAA,CAAW,YAAY,CAAA,EAAG;AAC5B,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,8BAA8B,YAAY,CAAA;AAAA,OACnD;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,CAAA,kBAAA,EAAqB,YAAY,CAAA,KAAA,EAAQ,UAAU,CAAA,CAAA;AAC/D,IAAA,MAAM,SAAS,MAAM,GAAA,CAAI,CAAA,CAAA,iBAAA,EAAqB,YAAY,OAAO,UAAU,CAAA,CAAA;AAE3E,IAAA,IAAI,MAAA,CAAO,aAAa,CAAA,EAAG;AACzB,MAAAH,KAAAA,CAAI,KAAK,kBAAA,EAAoB,EAAE,MAAM,YAAA,EAAc,MAAA,EAAQ,YAAY,CAAA;AAAA,IACzE;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,OAAO,QAAA,KAAa,CAAA;AAAA,MAC7B,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAAA,MAC5B,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAAA,MAC3B,OAAA,EAAS,GAAA;AAAA,MACT,YAAA,EAAc,MAAA,CAAO,QAAA,KAAa,CAAA,GAAI,YAAA,GAAe,KAAA;AAAA,KACvD;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,KAClD;AAAA,EACF;AACF;AAKA,eAAsB,cAAA,CACpB,GAAA,EACA,YAAA,EACA,KAAA,EACoB;AACpB,EAAA,IAAI;AACF,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,GAAA;AAEJ,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,GAAA,GAAM,gCAAgC,YAAY,CAAA,CAAA,CAAA;AAClD,MAAA,MAAA,GAAS,MAAM,GAAA,CAAI,CAAA,CAAA,4BAAA,EAAgC,YAAY,CAAA,CAAA;AAAA,IACjE,CAAA,MAAO;AACL,MAAA,GAAA,GAAM,wBAAwB,YAAY,CAAA,CAAA,CAAA;AAC1C,MAAA,MAAA,GAAS,MAAM,GAAA,CAAI,CAAA,CAAA,oBAAA,EAAwB,YAAY,CAAA,CAAA;AAAA,IACzD;AAEA,IAAA,IAAI,MAAA,CAAO,aAAa,CAAA,EAAG;AACzB,MAAAA,MAAI,IAAA,CAAK,kBAAA,EAAoB,EAAE,IAAA,EAAM,cAAc,CAAA;AAAA,IACrD;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,OAAO,QAAA,KAAa,CAAA;AAAA,MAC7B,MAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAAA,MAC5B,KAAA,EAAO,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAAA,MAC3B,OAAA,EAAS;AAAA,KACX;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,KAClD;AAAA,EACF;AACF;AASA,eAAsB,YAAA,CACpB,GAAA,EACA,MAAA,EACA,UAAA,EACA,UAAA,EACoB;AACpB,EAAA,IAAI,iBAAA,CAAkB,MAAM,CAAA,EAAG;AAC7B,IAAA,MAAM,SAAA,GAAY,MAAM,sBAAA,CAAuB,GAAG,CAAA;AAClD,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAAA,KAAAA,CAAI,KAAK,uDAAuD,CAAA;AAChE,MAAA,OAAO,oBAAA,CAAqB,GAAA,EAAK,UAAA,EAAY,UAAU,CAAA;AAAA,IACzD;AACA,IAAA,OAAO,oBAAA,CAAqB,KAAK,UAAU,CAAA;AAAA,EAC7C;AACA,EAAA,OAAO,oBAAA,CAAqB,GAAA,EAAK,UAAA,EAAY,UAAU,CAAA;AACzD;;;ACtcA,SAAS,kBAAA,CAAmB,WAAA,EAAqB,KAAA,EAAe,IAAA,GAAO,MAAA,EAAgB;AACrF,EAAA,MAAM,IAAA,GAAO,KAAA,CACV,WAAA,EAAY,CACZ,QAAQ,aAAA,EAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA,CACpB,SAAA,CAAU,GAAG,EAAE,CAAA;AAClB,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,WAAW,IAAI,IAAI,CAAA,CAAA;AACvC;AAKA,SAAS,mBAAA,CAAoB,KAAA,EAAe,MAAA,GAAkC,EAAC,EAAW;AACxF,EAAA,MAAM,UAAA,GAAa,MAAM,WAAA,EAAY;AACrC,EAAA,MAAM,WAAA,GAAc,OAAO,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAA,CAAK,aAAa,CAAA;AAE1D,EAAA,IAAI,YAAY,QAAA,CAAS,KAAK,KAAK,UAAA,CAAW,UAAA,CAAW,KAAK,CAAA,EAAG;AAC/D,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,IAAI,YAAY,QAAA,CAAS,MAAM,KAAK,UAAA,CAAW,UAAA,CAAW,MAAM,CAAA,EAAG;AACjE,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI,YAAY,QAAA,CAAS,UAAU,KAAK,UAAA,CAAW,UAAA,CAAW,UAAU,CAAA,EAAG;AACzE,IAAA,OAAO,UAAA;AAAA,EACT;AACA,EAAA,IAAI,YAAY,QAAA,CAAS,MAAM,KAAK,UAAA,CAAW,UAAA,CAAW,MAAM,CAAA,EAAG;AACjE,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,sBAAA,CACd,GAAA,EACA,OAAA,EACA,MAAA,EACgB;AAChB,EAAA,OAAOM,IAAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA,yDAAA,CAAA;AAAA,IAYb,IAAA,EAAM;AAAA,MACJ,WAAA,EAAaA,IAAAA,CAAK,MAAA,CACf,MAAA,EAAO,CACP,KAAI,CACJ,QAAA,EAAS,CACT,QAAA,CAAS,0CAA0C,CAAA;AAAA,MACtD,UAAA,EAAYA,IAAAA,CAAK,MAAA,CACd,IAAA,CAAK,CAAC,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,UAAA,EAAY,MAAM,CAAC,CAAA,CAChD,QAAA,EAAS,CACT,SAAS,oCAAoC,CAAA;AAAA,MAChD,UAAA,EAAYA,KAAK,MAAA,CACd,MAAA,GACA,QAAA,EAAS,CACT,SAAS,iDAAiD;AAAA,KAC/D;AAAA,IAEA,MAAM,QAAQ,IAAA,EAAuB;AACnC,MAAA,MAAM,SAAS,MAAM,oBAAA,CAAqB,GAAA,EAAK,OAAA,EAAS,QAAQ,IAAI,CAAA;AACpE,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,IACvC;AAAA,GACD,CAAA;AACH;AAEA,eAAe,oBAAA,CACb,GAAA,EACA,OAAA,EACA,MAAA,EACA,IAAA,EAK6B;AAC7B,EAAA,MAAM,SAAA,GAAY,aAAa,MAAM,CAAA;AAGrC,EAAA,IAAI,UAAU,YAAA,EAAc;AAC1B,IAAA,MAAM,OAAA,GAAU,MAAM,iBAAA,CAAkB,GAAG,CAAA;AAC3C,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,2CAAA;AAAA,QACP,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,cAAA,GAAiB,MAAM,gBAAA,CAAiB,GAAG,CAAA;AAGjD,EAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,SAAS,CAAC,MAAA,CAAO,QAAQ,IAAA,EAAM;AACjD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,8BAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAEA,EAAA,MAAM,QAAQ,MAAM,UAAA,CAAW,GAAA,EAAK,MAAA,EAAQ,KAAK,WAAW,CAAA;AAC5D,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,CAAA,OAAA,EAAU,IAAA,CAAK,WAAW,CAAA,UAAA,CAAA;AAAA,MACjC,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAGA,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,KAAK,UAAA,EAAY;AACnB,IAAA,UAAA,GAAa,IAAA,CAAK,UAAA;AAAA,EACpB,CAAA,MAAO;AACL,IAAA,MAAM,aAAa,IAAA,CAAK,UAAA,IAAc,oBAAoB,KAAA,CAAM,KAAA,EAAO,MAAM,MAAM,CAAA;AACnF,IAAA,UAAA,GAAa,kBAAA,CAAmB,IAAA,CAAK,WAAA,EAAa,KAAA,CAAM,OAAO,UAAU,CAAA;AAAA,EAC3E;AAGA,EAAA,MAAM,YAAA,GAAe,MAAM,YAAA,CAAa,GAAA,EAAK,QAAQ,UAAU,CAAA;AAE/D,EAAA,IAAI,CAAC,aAAa,OAAA,EAAS;AACzB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,aAAa,KAAA,IAAS,yBAAA;AAAA,MAC7B,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAGA,EAAA,MAAM,OAAA,CAAQ,eAAA,CAAgB,IAAA,CAAK,WAAA,EAAa;AAAA,IAC9C,OAAO,KAAA,CAAM,KAAA;AAAA,IACb,MAAA,EAAQ,aAAA;AAAA,IACR,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IAClC,KAAK,KAAA,CAAM,GAAA;AAAA,IACX,MAAM,KAAA,CAAM,IAAA;AAAA,IACZ,MAAA,EAAQ;AAAA,GACT,CAAA;AAED,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,UAAA;AAAA,IACA,aAAa,IAAA,CAAK,WAAA;AAAA,IAClB,gBAAgB,cAAA,IAAkB;AAAA,GACpC;AACF;AC7KA,IAAMN,KAAAA,GAAM,mBAAmB,iBAAiB,CAAA;AAyDhD,SAASe,SAAQ,MAAA,EAA4D;AAC3E,EAAA,IAAI,CAAC,OAAO,MAAA,EAAQ,KAAA,IAAS,CAAC,MAAA,CAAO,MAAA,EAAQ,MAAM,OAAO,IAAA;AAC1D,EAAA,OAAO,EAAE,OAAO,MAAA,CAAO,MAAA,CAAO,OAAO,IAAA,EAAM,MAAA,CAAO,OAAO,IAAA,EAAK;AAChE;AAEO,SAAS,kBAAA,CACd,GAAA,EACA,OAAA,EACA,MAAA,EACgB;AAChB,EAAA,OAAOT,IAAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA,6EAAA,CAAA;AAAA,IASb,IAAA,EAAM;AAAA,MACJ,WAAA,EAAaA,IAAAA,CAAK,MAAA,CACf,MAAA,EAAO,CACP,GAAA,EAAI,CACJ,QAAA,EAAS,CACT,QAAA,EAAS,CACT,QAAA,CAAS,sDAAsD,CAAA;AAAA,MAClE,KAAA,EAAOA,KAAK,MAAA,CAAO,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,iBAAiB,CAAA;AAAA,MACjE,IAAA,EAAMA,KAAK,MAAA,CAAO,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,gBAAgB,CAAA;AAAA,MAC/D,KAAA,EAAOA,KAAK,MAAA,CAAO,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,oBAAoB;AAAA,KACvE;AAAA,IAEA,MAAM,QAAQ,IAAA,EAAuB;AACnC,MAAA,MAAM,SAAS,MAAM,iBAAA,CAAkB,GAAA,EAAK,OAAA,EAAS,QAAQ,IAAI,CAAA;AACjE,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,IACvC;AAAA,GACD,CAAA;AACH;AAEA,eAAe,iBAAA,CACb,GAAA,EACA,OAAA,EACA,MAAA,EACA,IAAA,EAMyB;AACzB,EAAA,MAAM,IAAA,GAAOS,SAAQ,MAAM,CAAA;AAC3B,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,8BAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAGA,EAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,CAAiB,GAAG,CAAA;AACzC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,oCAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAGA,EAAA,IAAI,QAAQ,IAAA,CAAK,KAAA;AACjB,EAAA,IAAI,OAAO,IAAA,CAAK,IAAA;AAEhB,EAAA,IAAI,IAAA,CAAK,WAAA,IAAe,CAAC,KAAA,EAAO;AAE9B,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,KAAA,CAAM,kCAAkC,CAAA;AACjE,IAAA,MAAM,IAAA,GAAO,SAAA,GAAY,SAAA,CAAU,CAAC,CAAA,GAAI,MAAA;AACxC,IAAA,MAAM,YAAA,GAAe,QAAQ,eAAA,EAAgB;AAE7C,IAAA,IAAI,YAAA,IAAgB,YAAA,CAAa,WAAA,KAAgB,IAAA,CAAK,WAAA,EAAa;AACjE,MAAA,KAAA,GAAQ,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,YAAA,CAAa,KAAK,CAAA,CAAA;AAAA,IACxC,CAAA,MAAO;AACL,MAAA,KAAA,GAAQ,CAAA,EAAG,IAAI,CAAA,aAAA,EAAgB,IAAA,CAAK,WAAW,CAAA,CAAA;AAAA,IACjD;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,CAAK,WAAA,IAAe,CAAC,IAAA,EAAM;AAC7B,IAAA,IAAA,GAAO,CAAA;;AAAA,0BAAA,EAA2C,KAAK,WAAW;;AAAA;;AAAA,UAAA,EAAsC,KAAK,WAAW,CAAA,CAAA;AAAA,EAC1H;AAEA,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,mBAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,MAAM,YAAA,CAAa,GAAA,EAAK,QAAQ,IAAI,CAAA;AACvD,EAAA,IAAI,CAAC,WAAW,OAAA,EAAS;AACvB,IAAAf,MAAI,IAAA,CAAK,qDAAA,EAAuD,EAAE,KAAA,EAAO,UAAA,CAAW,OAAO,CAAA;AAAA,EAC7F;AAGA,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAmB;AAAA,MACvB,IAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,KAAK,IAAI,CAAA,CAAA;AAAA,MAC1B,SAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAA,CAAO,IAAA,CAAK,UAAU,IAAI,CAAA;AAAA,IAC5B;AAEA,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,MAAA,CAAO,KAAK,SAAS,CAAA;AAAA,IACvB;AAEA,IAAA,MAAA,CAAO,IAAA,CAAK,UAAU,YAAY,CAAA;AAElC,IAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,KAAa,MAAM,GAAA,CAAI,OAAO,MAAM,CAAA,CAAA;AAEpD,IAAA,IAAI,aAAa,CAAA,EAAG;AAClB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,qBAAA;AAAA,QACP,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAEA,IAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,OAAO,MAAM,CAAA,CAAE,MAAM,CAAA;AAE/C,IAAAA,KAAAA,CAAI,IAAA,CAAK,YAAA,EAAc,EAAE,QAAA,EAAU,OAAO,MAAA,EAAQ,GAAA,EAAK,MAAA,CAAO,GAAA,EAAK,CAAA;AAEnE,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,UAAU,MAAA,CAAO,MAAA;AAAA,MACjB,OAAO,MAAA,CAAO,GAAA;AAAA,MACd;AAAA,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,2BAAA;AAAA,MAChD,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AACF;AAEO,SAAS,kBAAA,CAAmB,KAAkB,MAAA,EAAoC;AACvF,EAAA,OAAOM,IAAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,cAAA,CAAA;AAAA,IAQb,IAAA,EAAM;AAAA,MACJ,QAAA,EAAUA,IAAAA,CAAK,MAAA,CACZ,MAAA,EAAO,CACP,GAAA,EAAI,CACJ,QAAA,EAAS,CACT,QAAA,EAAS,CACT,QAAA,CAAS,+CAA+C;AAAA,KAC7D;AAAA,IAEA,MAAM,QAAQ,IAAA,EAAuB;AACnC,MAAA,MAAM,SAAS,MAAM,WAAA,CAAY,GAAA,EAAK,MAAA,EAAQ,KAAK,QAAQ,CAAA;AAC3D,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,IACvC;AAAA,GACD,CAAA;AACH;AAEA,eAAe,WAAA,CACb,GAAA,EACA,MAAA,EACA,QAAA,EACyB;AACzB,EAAA,MAAM,IAAA,GAAOS,SAAQ,MAAM,CAAA;AAC3B,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,8BAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAEA,EAAA,IAAI;AAEF,IAAA,MAAM,KAAA,GAAQ,QAAA,GAAW,MAAA,CAAO,QAAQ,CAAA,GAAI,EAAA;AAE5C,IAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAS,GACvB,MAAM,GAAA,CAAI,CAAA,CAAA,WAAA,EAAe,KAAK,CAAA,QAAA,EAAW,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,KAAK,IAAI,CAAA,4DAAA,CAAA;AAElE,IAAA,IAAI,aAAa,CAAA,EAAG;AAClB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,QAAA,GAAW,CAAA,IAAA,EAAO,QAAQ,CAAA,UAAA,CAAA,GAAe,gCAAA;AAAA,QAChD,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAEA,IAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,OAAO,MAAM,CAAA,CAAE,MAAM,CAAA;AAgB/C,IAAA,MAAM,UAAqB,MAAA,CAAO,iBAAA,IAAqB,EAAC,EAAG,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACzE,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,MAAA,EACE,KAAA,CAAM,MAAA,KAAW,WAAA,GACb,KAAA,CAAM,UAAA,KAAe,SAAA,GACnB,MAAA,GACA,KAAA,CAAM,UAAA,KAAe,SAAA,GACnB,SAAA,GACA,MAAA,GACJ,SAAA;AAAA,MACN,YAAY,KAAA,CAAM;AAAA,KACpB,CAAE,CAAA;AAEF,IAAA,MAAM,WAAuB,MAAA,CAAO,OAAA,IAAW,EAAC,EAAG,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,MAClE,QAAA,EAAU,OAAO,MAAA,CAAO,KAAA;AAAA,MACxB,OAAO,MAAA,CAAO;AAAA,KAChB,CAAE,CAAA;AAEF,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,UAAU,MAAA,CAAO,MAAA;AAAA,MACjB,OAAO,MAAA,CAAO,GAAA;AAAA,MACd,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,SAAA,EAAW,OAAO,SAAA,KAAc,WAAA;AAAA,MAChC,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAAA,MAChD,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AACF;AAEO,SAAS,iBAAA,CAAkB,KAAkB,MAAA,EAAoC;AACtF,EAAA,OAAOT,IAAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;AAAA;AAAA;AAAA,yDAAA,CAAA;AAAA,IAMb,IAAA,EAAM;AAAA,MACJ,QAAA,EAAUA,IAAAA,CAAK,MAAA,CACZ,MAAA,EAAO,CACP,GAAA,EAAI,CACJ,QAAA,EAAS,CACT,QAAA,EAAS,CACT,QAAA,CAAS,+CAA+C,CAAA;AAAA,MAC3D,MAAA,EAAQA,KAAK,MAAA,CAAO,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,gCAAgC,CAAA;AAAA,MAClF,YAAA,EAAcA,KAAK,MAAA,CAChB,OAAA,GACA,QAAA,EAAS,CACT,SAAS,2CAA2C;AAAA,KACzD;AAAA,IAEA,MAAM,QAAQ,IAAA,EAAuB;AACnC,MAAA,MAAM,MAAA,GAAS,MAAM,gBAAA,CAAiB,GAAA,EAAK,QAAQ,IAAI,CAAA;AACvD,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,IACvC;AAAA,GACD,CAAA;AACH;AAEA,eAAe,gBAAA,CACb,GAAA,EACA,MAAA,EACA,IAAA,EAKwB;AACxB,EAAA,MAAM,IAAA,GAAOS,SAAQ,MAAM,CAAA;AAC3B,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,8BAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAGA,EAAA,MAAM,SAAS,MAAM,WAAA,CAAY,GAAA,EAAK,MAAA,EAAQ,KAAK,QAAQ,CAAA;AAC3D,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,YAAY,MAAA,CAAO;AAAA,KACrB;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,UAAU,MAAA,EAAQ;AAC3B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,CAAA,MAAA,EAAS,MAAA,CAAO,KAAA,EAAO,aAAa,CAAA,cAAA,CAAA;AAAA,MAC3C,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,OAAO,SAAA,EAAW;AACrB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,qBAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,QAAQ,IAAA,CAAK,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,GAAI,EAAA;AACtD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,KAAW,KAAA,GAAQ,UAAA,GAAa,EAAA;AACxD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,YAAA,KAAiB,KAAA,GAAQ,iBAAA,GAAoB,EAAA;AAErE,IAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAS,GACvB,MAAM,IAAI,CAAA,CAAA,YAAA,EAAgB,KAAK,CAAA,QAAA,EAAW,IAAA,CAAK,KAAK,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,UAAU,IAAI,UAAU,CAAA,mBAAA,CAAA;AAE/F,IAAA,IAAI,aAAa,CAAA,EAAG;AAClB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,oBAAA;AAAA,QACP,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAEA,IAAA,MAAM,YAAY,IAAA,CAAK,KAAA,CAAM,OAAO,MAAM,CAAA,CAAE,MAAM,CAAA;AAElD,IAAAf,KAAAA,CAAI,IAAA,CAAK,WAAA,EAAa,EAAE,QAAA,EAAU,MAAA,CAAO,QAAA,EAAU,MAAA,EAAQ,SAAA,CAAU,WAAA,EAAa,GAAA,EAAK,CAAA;AAEvF,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,WAAA,EAAa,UAAU,WAAA,EAAa;AAAA,KACtC;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAAA,MAChD,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AACF;ACpYO,SAAS,wBAAA,CAAyB,KAAkB,MAAA,EAAoC;AAC7F,EAAA,OAAOM,IAAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;AAAA;AAAA;;AAAA,8CAAA,CAAA;AAAA,IAOb,IAAA,EAAM;AAAA,MACJ,YAAYA,IAAAA,CAAK,MAAA,CAAO,MAAA,EAAO,CAAE,SAAS,yCAAyC;AAAA,KACrF;AAAA,IAEA,MAAM,QAAQ,IAAA,EAAuB;AACnC,MAAA,MAAM,SAAA,GAAY,aAAa,MAAM,CAAA;AAErC,MAAA,IAAI,CAAC,UAAU,SAAA,EAAW;AACxB,QAAA,MAAMI,OAAAA,GAA+B;AAAA,UACnC,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,wCAAA;AAAA,UACP,UAAA,EAAY;AAAA,SACd;AACA,QAAA,OAAO,IAAA,CAAK,SAAA,CAAUA,OAAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,MACvC;AAEA,MAAA,MAAM,YAAA,GAAe,MAAM,cAAA,CAAe,GAAA,EAAK,KAAK,UAAU,CAAA;AAE9D,MAAA,MAAM,MAAA,GAA+B,aAAa,OAAA,GAC9C;AAAA,QACE,OAAA,EAAS,IAAA;AAAA,QACT,cAAc,YAAA,CAAa,YAAA;AAAA,QAC3B,QAAQ,IAAA,CAAK;AAAA,OACf,GACA;AAAA,QACE,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,aAAa,KAAA,IAAS,2BAAA;AAAA,QAC7B,UAAA,EAAY;AAAA,OACd;AAEJ,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,IACvC;AAAA,GACD,CAAA;AACH;AAEO,SAAS,uBAAA,CAAwB,KAAkB,MAAA,EAAoC;AAC5F,EAAA,OAAOJ,IAAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;AAAA,gFAAA,CAAA;AAAA,IAIb,MAAM,EAAC;AAAA,IAEP,MAAM,OAAA,GAA2B;AAC/B,MAAA,MAAM,SAAA,GAAY,aAAa,MAAM,CAAA;AAErC,MAAA,IAAI,CAAC,UAAU,SAAA,EAAW;AACxB,QAAA,MAAMI,OAAAA,GAA8B;AAAA,UAClC,OAAA,EAAS,KAAA;AAAA,UACT,WAAW,EAAC;AAAA,UACZ,KAAA,EAAO,CAAA;AAAA,UACP,KAAA,EAAO;AAAA,SACT;AACA,QAAA,OAAO,IAAA,CAAK,SAAA,CAAUA,OAAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,MACvC;AAEA,MAAA,MAAM,SAAA,GAAY,MAAM,aAAA,CAAc,GAAG,CAAA;AAEzC,MAAA,MAAM,MAAA,GAA8B;AAAA,QAClC,OAAA,EAAS,IAAA;AAAA,QACT,SAAA;AAAA,QACA,OAAO,SAAA,CAAU;AAAA,OACnB;AAEA,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,IACvC;AAAA,GACD,CAAA;AACH;AAEO,SAAS,wBAAA,CAAyB,KAAkB,MAAA,EAAoC;AAC7F,EAAA,OAAOJ,IAAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;AAAA;AAAA,gEAAA,CAAA;AAAA,IAKb,IAAA,EAAM;AAAA,MACJ,cAAcA,IAAAA,CAAK,MAAA,CAAO,MAAA,EAAO,CAAE,SAAS,gCAAgC,CAAA;AAAA,MAC5E,KAAA,EAAOA,KAAK,MAAA,CACT,OAAA,GACA,QAAA,EAAS,CACT,SAAS,6CAA6C;AAAA,KAC3D;AAAA,IAEA,MAAM,QAAQ,IAAA,EAAuB;AACnC,MAAA,MAAM,SAAA,GAAY,aAAa,MAAM,CAAA;AAErC,MAAA,IAAI,CAAC,UAAU,SAAA,EAAW;AACxB,QAAA,MAAMI,OAAAA,GAA+B;AAAA,UACnC,OAAA,EAAS,KAAA;AAAA,UACT,KAAA,EAAO,wCAAA;AAAA,UACP,UAAA,EAAY;AAAA,SACd;AACA,QAAA,OAAO,IAAA,CAAK,SAAA,CAAUA,OAAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,MACvC;AAEA,MAAA,MAAM,eAAe,MAAM,cAAA,CAAe,KAAK,IAAA,CAAK,YAAA,EAAc,KAAK,KAAK,CAAA;AAE5E,MAAA,MAAM,MAAA,GAA+B,aAAa,OAAA,GAC9C;AAAA,QACE,OAAA,EAAS,IAAA;AAAA,QACT,aAAa,IAAA,CAAK;AAAA,OACpB,GACA;AAAA,QACE,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,aAAa,KAAA,IAAS,2BAAA;AAAA,QAC7B,UAAA,EAAY,IAAA,CAAK,KAAA,GACb,kDAAA,GACA;AAAA,OACN;AAEJ,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,IACvC;AAAA,GACD,CAAA;AACH;AChEO,SAAS,kBAAA,CAAmB,KAAkB,MAAA,EAAoC;AACvF,EAAA,OAAOJ,IAAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2CAAA,CAAA;AAAA,IAqBb,IAAA,EAAM;AAAA,MACJ,UAAUA,IAAAA,CAAK,MAAA,CAAO,MAAA,EAAO,CAAE,SAAS,sCAAsC,CAAA;AAAA,MAC9E,MAAA,EAAQA,KAAK,MAAA,CACV,MAAA,GACA,QAAA,EAAS,CACT,SAAS,6DAA6D,CAAA;AAAA,MACzE,UAAA,EAAYA,KAAK,MAAA,CACd,OAAA,GACA,QAAA,EAAS,CACT,SAAS,qDAAqD;AAAA,KACnE;AAAA,IAEA,MAAM,QAAQ,IAAA,EAAuB;AACnC,MAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc,GAAA,EAAK,QAAQ,IAAoB,CAAA;AACpE,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,IACvC;AAAA,GACD,CAAA;AACH;AAEA,eAAe,aAAA,CACb,GAAA,EACA,MAAA,EACA,IAAA,EACyB;AACzB,EAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,SAAS,CAAC,MAAA,CAAO,QAAQ,IAAA,EAAM;AACjD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,OAAA,EAAS,iBAAA;AAAA,MACT,SAAS,EAAC;AAAA,MACV,WAAW,EAAC;AAAA,MACZ,UAAU,EAAC;AAAA,MACX,KAAA,EAAO,8BAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,GAAmB,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAC/B,EAAA,IAAI,KAAK,MAAA,EAAQ;AACf,IAAA,MAAA,GAAS,IAAA,CAAK,MAAA,CACX,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAAC,CAAA,KAAM,MAAA,CAAO,QAAA,CAAS,CAAA,CAAE,IAAA,EAAK,EAAG,EAAE,CAAC,CAAA,CACxC,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,EACxC,CAAA,MAAA,IAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,MAAA,GAAS,CAAC,GAAG,CAAC,CAAA;AAAA,EAChB;AAGA,EAAA,MAAM,SAAS,MAAM,WAAA,CAAY,GAAA,EAAK,MAAA,EAAQ,KAAK,QAAQ,CAAA;AAC3D,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,OAAA,EAAS,iBAAA;AAAA,MACT,SAAS,EAAC;AAAA,MACV,WAAW,EAAC;AAAA,MACZ,UAAU,EAAC;AAAA,MACX,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,YAAY,MAAA,CAAO;AAAA,KACrB;AAAA,EACF;AAGA,EAAA,MAAM,YAAA,GAAe,MAAM,iBAAA,CAAkB,GAAA,EAAK,QAAQ,IAAA,CAAK,QAAA,EAAU,QAAQ,MAAM,CAAA;AAGvF,EAAA,MAAM,cAAc,MAAM,gBAAA,CAAiB,KAAK,MAAA,EAAQ,YAAA,EAAc,KAAK,QAAQ,CAAA;AAEnF,EAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACxB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,OAAA,EAAS,iBAAA;AAAA,MACT,SAAS,EAAC;AAAA,MACV,WAAW,EAAC;AAAA,MACZ,UAAU,EAAC;AAAA,MACX,KAAA,EAAO,YAAY,KAAA,IAAS,qBAAA;AAAA,MAC5B,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAGA,EAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,WAAA,CAAY,OAAA,IAAW,EAAE,CAAA;AAG1D,EAAA,MAAM,UAAA,GAAaJ,KAAK,GAAA,CAAI,SAAA,EAAW,aAAa,SAAA,EAAW,CAAA,GAAA,EAAM,IAAA,CAAK,QAAQ,CAAA,UAAA,CAAY,CAAA;AAE9F,EAAA,IAAI;AACF,IAAA,MAAMS,MAAMJ,OAAAA,CAAQ,UAAU,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACpD,IAAA,MAAMK,SAAAA,CAAU,UAAA,EAAY,WAAA,CAAY,OAAA,IAAW,IAAI,OAAO,CAAA;AAAA,EAChE,CAAA,CAAA,MAAQ;AAAA,EAER;AAGA,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,MAAM,YAAsB,EAAC;AAC7B,EAAA,MAAM,WAAqB,EAAC;AAG5B,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,KAAA,MAAW,OAAA,IAAW,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU;AAC5C,MAAA,IAAI,OAAA,CAAQ,WAAW,SAAA,EAAW;AAChC,QAAA,OAAA,CAAQ,KAAK,CAAA,YAAA,EAAe,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK,OAAA,CAAQ,MAAM,CAAA,CAAE,CAAA;AAAA,MACnE,WAAW,OAAA,CAAQ,MAAA,KAAW,YAAA,IAAgB,OAAA,CAAQ,WAAW,WAAA,EAAa;AAC5E,QAAA,SAAA,CAAU,IAAA,CAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,MAAM,CAAA,IAAA,EAAO,QAAQ,QAAQ,CAAA,EAAA,EAAK,OAAA,CAAQ,MAAM,CAAA,CAAE,CAAA;AAAA,MAC/E,CAAA,MAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,YAAA,EAAc;AAC1C,QAAA,QAAA,CAAS,KAAK,CAAA,eAAA,EAAkB,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK,OAAA,CAAQ,MAAM,CAAA,CAAE,CAAA;AAAA,MACvE;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,KAAA,MAAW,OAAA,IAAW,MAAA,CAAO,MAAA,CAAO,QAAA,EAAU;AAC5C,MAAA,IAAI,OAAA,CAAQ,SAAS,UAAA,EAAY;AAC/B,QAAA,OAAA,CAAQ,KAAK,CAAA,WAAA,EAAc,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,OAAA,CAAQ,WAAW,CAAA,CAAE,CAAA;AAAA,MACnE,WAAW,OAAA,CAAQ,IAAA,KAAS,iBAAA,IAAqB,OAAA,CAAQ,SAAS,aAAA,EAAe;AAC/E,QAAA,SAAA,CAAU,IAAA,CAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,QAAQ,IAAI,CAAA,EAAA,EAAK,OAAA,CAAQ,WAAW,CAAA,CAAE,CAAA;AAAA,MAC5E,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,IAAA,CAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,QAAQ,IAAI,CAAA,EAAA,EAAK,OAAA,CAAQ,WAAW,CAAA,CAAE,CAAA;AAAA,MAC3E;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,IAAA,KAAA,MAAW,SAAA,IAAa,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY;AAChD,MAAA,IAAI,SAAA,CAAU,SAAS,eAAA,EAAiB;AACtC,QAAA,SAAA,CAAU,KAAK,CAAA,SAAA,EAAY,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK,SAAA,CAAU,WAAW,CAAA,CAAE,CAAA;AAAA,MAC3E,CAAA,MAAO;AACL,QAAA,QAAA,CAAS,KAAK,CAAA,SAAA,EAAY,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK,SAAA,CAAU,WAAW,CAAA,CAAE,CAAA;AAAA,MAC1E;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,GAAqD,SAAA;AACzD,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,IAAA,OAAA,GAAU,iBAAA;AAAA,EACZ,CAAA,MAAA,IAAW,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AAC/B,IAAA,OAAA,GAAU,SAAA;AAAA,EACZ;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,cAAc,MAAA,CAAO,YAAA;AAAA,IACrB,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,cAAc,MAAA,CAAO,YAAA;AAAA,IACrB,cAAc,MAAA,CAAO,YAAA;AAAA,IACrB,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,OAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AACF;AAcA,eAAe,WAAA,CACb,GAAA,EACA,MAAA,EACA,QAAA,EACiB;AACjB,EAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,SAAS,CAAC,MAAA,CAAO,QAAQ,IAAA,EAAM;AACjD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,8BAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AACA,EAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAK,GAAI,MAAA,CAAO,MAAA;AAC/B,EAAA,MAAM,QAAA,GAAW,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAEjC,EAAA,IAAI;AAEF,IAAA,MAAM,EAAE,QAAQ,QAAA,EAAS,GACvB,MAAM,GAAA,CAAI,CAAA,CAAA,WAAA,EAAe,QAAQ,CAAA,QAAA,EAAW,QAAQ,CAAA,mDAAA,CAAA;AAEtD,IAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,OAAO,QAAQ,CAAA,CAAE,MAAM,CAAA;AAGjD,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,QAAQ,UAAA,EAAW,GAAI,MAAM,GAAA,CAAI,CAAA,CAAA,WAAA,EAAe,QAAQ,CAAA,QAAA,EAAW,QAAQ,CAAA,CAAA;AACnF,MAAA,IAAA,GAAO,OAAO,UAAU,CAAA;AAAA,IAC1B,CAAA,CAAA,MAAQ;AAAA,IAER;AAGA,IAAA,MAAM,eAAyB,EAAC;AAChC,IAAA,MAAM,eAAe,MAAA,CAAO,IAAA,EAAM,QAAA,CAAS,yCAAyC,KAAK,EAAC;AAC1F,IAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAChC,MAAA,YAAA,CAAa,KAAK,MAAA,CAAO,QAAA,CAAS,MAAM,CAAC,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,IACjD;AAGA,IAAA,MAAM,aAAa,MAAA,CAAO,IAAA,EAAM,QAAA,CAAS,SAAS,KAAK,EAAC;AACxD,IAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,MAAA,MAAM,MAAM,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AACxC,MAAA,IAAI,CAAC,YAAA,CAAa,QAAA,CAAS,GAAG,CAAA,EAAG;AAC/B,QAAA,YAAA,CAAa,KAAK,GAAG,CAAA;AAAA,MACvB;AAAA,IACF;AAGA,IAAA,IAAI,YAAA,GAAe,EAAA;AACnB,IAAA,KAAA,MAAW,QAAA,IAAY,YAAA,CAAa,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EAAG;AAC/C,MAAA,IAAI;AACF,QAAA,MAAM,EAAE,QAAQ,WAAA,EAAY,GAC1B,MAAM,GAAA,CAAI,CAAA,CAAA,cAAA,EAAkB,QAAQ,CAAA,QAAA,EAAW,QAAQ,CAAA,kBAAA,CAAA;AACzD,QAAA,MAAM,YAAY,IAAA,CAAK,KAAA,CAAM,OAAO,WAAW,CAAA,CAAE,MAAM,CAAA;AACvD,QAAA,YAAA,IAAgB;;AAAA,UAAA,EAAiB,QAAQ,CAAA,EAAA,EAAK,SAAA,CAAU,KAAK;;AAAA,EAAO,SAAA,CAAU,QAAQ,EAAE,CAAA,CAAA;AAAA,MAC1F,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,YAAY,MAAA,CAAO,SAAA;AAAA,MACnB,cAAc,MAAA,CAAO,SAAA;AAAA,MACrB,YAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,4BAA4B,OAAO,CAAA,CAAA;AAAA,MAC1C,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AACF;AAEA,eAAe,iBAAA,CACb,GAAA,EACA,OAAA,EACA,QAAA,EACA,QACA,MAAA,EACiB;AAEjB,EAAA,MAAM,mBAAmBV,IAAAA,CAAK,GAAA,CAAI,SAAA,EAAW,SAAA,EAAW,UAAU,kBAAkB,CAAA;AACpF,EAAA,IAAI,UAAA;AAEJ,EAAA,IAAI;AACF,IAAA,UAAA,GAAa,MAAME,QAAAA,CAAS,gBAAA,EAAkB,OAAO,CAAA;AAAA,EACvD,CAAA,CAAA,MAAQ;AACN,IAAA,UAAA,GAAa,sBAAA,EAAuB;AAAA,EACtC;AAEA,EAAA,MAAM,iBAAA,GAAoB,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,SAAS,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAEnE,EAAA,MAAM,cAAA,GAAiB;AAAA;;AAAA,gBAAA,EAGP,QAAQ;AAAA,mBAAA,EACL,MAAA,CAAO,gBAAgB,SAAS;AAAA,YAAA,EACvC,OAAO,UAAA,IAAc,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,gBAAgB,CAAC;AAAA,mBAAA,EAC5C,MAAA,CAAO,YAAA,EAAc,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,IAAK,MAAM;;AAAA,mBAAA,EAE7D,iBAAiB;;AAAA;AAAA,EAGpC,MAAA,CAAO,gBAAgB,yBAAyB;;AAAA;AAAA;AAAA,EAIhD,OAAO,IAAA,EAAM,KAAA,CAAM,CAAA,EAAG,GAAK,KAAK,sBAAsB;AAAA;AAAA,CAAA;AAItD,EAAA,OAAO,GAAG,UAAU;;AAAA,EAAO,cAAc,CAAA,CAAA;AAC3C;AAEA,SAAS,sBAAA,GAAiC;AACxC,EAAA,OAAO,CAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,wDAAA,CAAA;AA2BT;AAQA,eAAe,gBAAA,CACb,GAAA,EACA,MAAA,EACA,MAAA,EACA,QAAA,EACsB;AACtB,EAAA,IAAI;AACF,IAAA,MAAM,YAAA,GAAe,MAAM,GAAA,CAAI,MAAA,CAAO,QAAQ,MAAA,CAAO;AAAA,MACnD,IAAA,EAAM;AAAA,QACJ,KAAA,EAAO,eAAe,QAAQ,CAAA;AAAA;AAChC,KACD,CAAA;AAED,IAAA,IAAI,CAAC,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI;AAC1B,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,uCAAA,EAAwC;AAAA,IAC1E;AAEA,IAAA,MAAM,SAAA,GAAY,aAAa,IAAA,CAAK,EAAA;AACpC,IAAA,uBAAA,CAAwB,WAAW,cAAc,CAAA;AAEjD,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAcC,iBAAAA;AAAA,QAClB,MAAA,CAAO,OAAO,MAAA,IAAU;AAAA,OAC1B;AAEA,MAAA,MAAM,YAAA,GAAe,MAAM,GAAA,CAAI,MAAA,CAAO,QAAQ,MAAA,CAAO;AAAA,QACnD,IAAA,EAAM,EAAE,EAAA,EAAI,SAAA,EAAU;AAAA,QACtB,IAAA,EAAM;AAAA,UACJ,KAAA,EAAO,WAAA;AAAA,UACP,OAAO,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,QAAQ;AAAA;AACxC,OACD,CAAA;AAED,MAAA,IAAI,CAAC,aAAa,IAAA,EAAM;AACtB,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,+BAAA,EAAgC;AAAA,MAClE;AAEA,MAAA,MAAM,cAAA,GAAiB,MAAM,GAAA,CAAI,MAAA,CAAO,QAAQ,QAAA,CAAS;AAAA,QACvD,IAAA,EAAM,EAAE,EAAA,EAAI,SAAA;AAAU,OACvB,CAAA;AAED,MAAA,MAAM,WAAA,GAAc,cAAA,CAAe,IAAA,EAAM,EAAA,CAAG,CAAA,CAAE,CAAA;AAC9C,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,qCAAA,EAAsC;AAAA,MACxE;AAEA,MAAA,MAAM,SAAA,GAAY,WAAA,CAAY,KAAA,EAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,MAAM,CAAA,IAAK,EAAC;AAC1E,MAAA,MAAM,OAAA,GAAU,UAAU,GAAA,CAAI,CAAC,MAAO,CAAA,CAAuB,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAE5E,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,OAAA,EAAQ;AAAA,IAClC,CAAA,SAAE;AACA,MAAA,yBAAA,CAA0B,SAAS,CAAA;AAAA,IACrC;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,CAAA,2BAAA,EAA8B,OAAO,CAAA,CAAA,EAAG;AAAA,EAC1E;AACF;AAEA,SAASA,kBAAiB,WAAA,EAA8D;AACtF,EAAA,MAAM,CAAC,UAAA,EAAY,OAAO,CAAA,GAAI,WAAA,CAAY,MAAM,GAAG,CAAA;AACnD,EAAA,OAAO,EAAE,UAAA,EAAY,UAAA,IAAc,WAAA,EAAa,OAAA,EAAS,WAAW,WAAA,EAAY;AAClF;AAiBA,SAAS,kBAAkB,OAAA,EAA+B;AACxD,EAAA,MAAM,SAAuB,EAAC;AAG9B,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,KAAA,CAAM,wDAAwD,CAAA;AAC5F,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,MAAM,WAAoC,EAAC;AAC3C,IAAA,MAAM,aAAA,GAAgB,aAAA,CAAc,CAAC,CAAA,CAAE,QAAA;AAAA,MACrC;AAAA,KACF;AACA,IAAA,KAAA,MAAW,SAAS,aAAA,EAAe;AACjC,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,WAAA,EAAa,CAAA;AAAA,QACb,UAAU,MAAA,CAAO,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AAAA,QACtC,MAAA,EAAQ,EAAA;AAAA,QACR,MAAA,EAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,EAAY;AAAA,QAC7B,QAAA,EAAU,KAAA,CAAM,CAAC,CAAA,EAAG,IAAA;AAAK,OAC1B,CAAA;AAAA,IACH;AACA,IAAA,MAAA,CAAO,MAAA,GAAS;AAAA,MACd,QAAA;AAAA,MACA,OAAA,EAAS,kBAAkB,QAAQ;AAAA,KACrC;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,KAAA,CAAM,qDAAqD,CAAA;AACzF,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,MAAM,WAAiC,EAAC;AACxC,IAAA,MAAM,WAAA,GAAc,aAAA,CAAc,CAAC,CAAA,CAAE,QAAA;AAAA,MACnC;AAAA,KACF;AACA,IAAA,KAAA,MAAW,SAAS,WAAA,EAAa;AAC/B,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,IAAA,EAAM,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,EAAY;AAAA,QAC3B,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,QACb,IAAA,EAAM,KAAA,CAAM,CAAC,CAAA,GAAI,MAAA,CAAO,SAAS,KAAA,CAAM,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,MAAA;AAAA,QACjD,WAAA,EAAa;AAAA,OACd,CAAA;AAAA,IACH;AACA,IAAA,MAAA,CAAO,MAAA,GAAS;AAAA,MACd,QAAA;AAAA,MACA,OAAA,EAAS,kBAAkB,QAAQ;AAAA,KACrC;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,KAAA,CAAM,qDAAqD,CAAA;AACzF,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,MAAM,aAAgC,EAAC;AACvC,IAAA,MAAM,gBAAA,GAAmB,aAAA,CAAc,CAAC,CAAA,CAAE,QAAA;AAAA,MACxC;AAAA,KACF;AACA,IAAA,KAAA,MAAW,SAAS,gBAAA,EAAkB;AACpC,MAAA,MAAM,OAAA,GAAmD;AAAA,QACvD,qBAAA,EAAuB,qBAAA;AAAA,QACvB,eAAA,EAAiB,eAAA;AAAA,QACjB,sBAAA,EAAwB,gBAAA;AAAA,QACxB,MAAA,EAAQ;AAAA,OACV;AACA,MAAA,UAAA,CAAW,IAAA,CAAK;AAAA,QACd,MAAM,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,EAAa,CAAA,IAAK,QAAA;AAAA,QACzC,QAAA,EAAU,MAAM,CAAC,CAAA;AAAA,QACjB,WAAA,EAAa,EAAA;AAAA,QACb,MAAA,EAAQ,EAAA;AAAA,QACR,cAAA,EAAgB;AAAA,OACjB,CAAA;AAAA,IACH;AAGA,IAAA,MAAM,UAAA,GAAa,aAAA,CAAc,CAAC,CAAA,CAAE,MAAM,yCAAyC,CAAA;AACnF,IAAA,MAAM,QAAQ,UAAA,GAAa,MAAA,CAAO,WAAW,UAAA,CAAW,CAAC,CAAC,CAAA,GAAI,CAAA;AAE9D,IAAA,MAAA,CAAO,MAAA,GAAS,EAAE,UAAA,EAAY,KAAA,EAAM;AAAA,EACtC;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,kBACP,QAAA,EACsC;AACtC,EAAA,MAAM,MAAA,GAA+C;AAAA,IACnD,QAAA,EAAU,CAAA;AAAA,IACV,OAAA,EAAS,CAAA;AAAA,IACT,UAAA,EAAY,CAAA;AAAA,IACZ,YAAA,EAAc,CAAA;AAAA,IACd,SAAA,EAAW;AAAA,GACb;AACA,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAA,CAAO,QAAQ,MAAM,CAAA,EAAA;AAAA,EACvB;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,kBAAkB,QAAA,EAA6D;AACtF,EAAA,MAAM,MAAA,GAAsC;AAAA,IAC1C,QAAA,EAAU,CAAA;AAAA,IACV,eAAA,EAAiB,CAAA;AAAA,IACjB,KAAA,EAAO,CAAA;AAAA,IACP,WAAA,EAAa;AAAA,GACf;AACA,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAA,CAAO,QAAQ,IAAI,CAAA,EAAA;AAAA,EACrB;AACA,EAAA,OAAO,MAAA;AACT;;;AC1mBO,SAAS,sBAAsB,QAAA,EAAgD;AACpF,EAAA,MAAM,kBAAyC,EAAC;AAEhD,EAAA,IAAI,QAAA,CAAS,UAAA,CAAW,QAAA,GAAW,CAAA,EAAG;AACpC,IAAA,iBAAA,CAAkB,iBAAiB,QAAQ,CAAA;AAAA,EAC7C;AAEA,EAAA,IAAI,QAAA,CAAS,UAAA,CAAW,KAAA,GAAQ,CAAA,EAAG;AACjC,IAAA,cAAA,CAAe,iBAAiB,QAAQ,CAAA;AAAA,EAC1C;AAEA,EAAA,IAAI,QAAA,CAAS,UAAA,CAAW,WAAA,GAAc,CAAA,EAAG;AACvC,IAAA,oBAAA,CAAqB,eAAe,CAAA;AAAA,EACtC;AAEA,EAAA,IAAI,QAAA,CAAS,UAAA,CAAW,aAAA,GAAgB,CAAA,EAAG;AACzC,IAAA,sBAAA,CAAuB,iBAAiB,QAAQ,CAAA;AAAA,EAClD;AAEA,EAAA,IAAI,QAAA,CAAS,OAAO,CAAA,EAAG;AACrB,IAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,MACnB,KAAA,EAAO,IAAA;AAAA,MACP,MAAA,EAAQ,CAAA,EAAG,QAAA,CAAS,IAAI,CAAA,sDAAA,CAAA;AAAA,MACxB,gBAAA,EAAkB,CAAC,eAAe,CAAA;AAAA,MAClC,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AAEA,EAAA,wBAAA,CAAyB,eAAe,CAAA;AAExC,EAAA,OAAO,eAAA;AACT;AAEA,SAAS,iBAAA,CAAkB,iBAAwC,QAAA,EAA+B;AAChG,EAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,IACnB,KAAA,EAAO,WAAA;AAAA,IACP,MAAA,EAAQ,CAAA,EAAG,QAAA,CAAS,UAAA,CAAW,QAAQ,CAAA,gDAAA,CAAA;AAAA,IACvC,gBAAA,EAAkB,CAAC,UAAU,CAAA;AAAA,IAC7B,QAAA,EAAU,QAAA,CAAS,IAAA,GAAO,CAAA,GAAI,UAAA,GAAa;AAAA,GAC5C,CAAA;AACD,EAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,IACnB,KAAA,EAAO,KAAA;AAAA,IACP,MAAA,EAAQ,mDAAA;AAAA,IACR,gBAAA,EAAkB,CAAC,UAAU,CAAA;AAAA,IAC7B,QAAA,EAAU;AAAA,GACX,CAAA;AACD,EAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,IACnB,KAAA,EAAO,KAAA;AAAA,IACP,MAAA,EAAQ,6CAAA;AAAA,IACR,gBAAA,EAAkB,CAAC,UAAU,CAAA;AAAA,IAC7B,QAAA,EAAU;AAAA,GACX,CAAA;AACH;AAEA,SAAS,cAAA,CAAe,iBAAwC,QAAA,EAA+B;AAC7F,EAAA,IAAI,CAAC,gBAAgB,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,KAAK,CAAA,EAAG;AACnD,IAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,MACnB,KAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ,CAAA,EAAG,QAAA,CAAS,UAAA,CAAW,KAAK,CAAA,wCAAA,CAAA;AAAA,MACpC,gBAAA,EAAkB,CAAC,OAAO,CAAA;AAAA,MAC1B,QAAA,EAAU,QAAA,CAAS,IAAA,GAAO,CAAA,GAAI,UAAA,GAAa;AAAA,KAC5C,CAAA;AAAA,EACH;AACA,EAAA,IAAI,CAAC,gBAAgB,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,KAAK,CAAA,EAAG;AACnD,IAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,MACnB,KAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ,sCAAA;AAAA,MACR,gBAAA,EAAkB,CAAC,OAAO,CAAA;AAAA,MAC1B,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AACA,EAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,IACnB,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ,iDAAA;AAAA,IACR,gBAAA,EAAkB,CAAC,OAAO,CAAA;AAAA,IAC1B,QAAA,EAAU;AAAA,GACX,CAAA;AACH;AAEA,SAAS,qBAAqB,eAAA,EAA8C;AAC1E,EAAA,IAAI,CAAC,gBAAgB,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,WAAW,CAAA,EAAG;AACzD,IAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,MACnB,KAAA,EAAO,WAAA;AAAA,MACP,MAAA,EAAQ,6CAAA;AAAA,MACR,gBAAA,EAAkB,CAAC,aAAa,CAAA;AAAA,MAChC,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AACA,EAAA,IAAI,CAAC,gBAAgB,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,KAAK,CAAA,EAAG;AACnD,IAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,MACnB,KAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ,oDAAA;AAAA,MACR,gBAAA,EAAkB,CAAC,aAAa,CAAA;AAAA,MAChC,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AACF;AAEA,SAAS,sBAAA,CACP,iBACA,QAAA,EACM;AACN,EAAA,IAAI,CAAC,gBAAgB,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,KAAA,KAAU,KAAK,CAAA,EAAG;AACnD,IAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,MACnB,KAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAQ,CAAA,EAAG,QAAA,CAAS,UAAA,CAAW,aAAa,CAAA,wCAAA,CAAA;AAAA,MAC5C,gBAAA,EAAkB,CAAC,eAAe,CAAA;AAAA,MAClC,QAAA,EAAU;AAAA,KACX,CAAA;AAAA,EACH;AACA,EAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,IACnB,KAAA,EAAO,aAAA;AAAA,IACP,MAAA,EAAQ,qDAAA;AAAA,IACR,gBAAA,EAAkB,CAAC,eAAe,CAAA;AAAA,IAClC,QAAA,EAAU;AAAA,GACX,CAAA;AACH;AAEA,SAAS,yBAAyB,eAAA,EAA8C;AAC9E,EAAA,MAAM,aAAA,GAAgB,gBAAgB,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,UAAU,CAAA,CAAE,MAAA;AAC/E,EAAA,IAAI,aAAA,KAAkB,CAAA,IAAK,eAAA,CAAgB,MAAA,GAAS,CAAA,EAAG;AACrD,IAAA,eAAA,CAAgB,CAAC,EAAE,QAAA,GAAW,UAAA;AAAA,EAChC;AACF;AAEO,SAAS,yBAAyB,eAAA,EAAyD;AAChG,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAmB;AACpC,EAAA,MAAM,SAA0B,EAAC;AAEjC,EAAA,KAAA,MAAW,OAAO,eAAA,EAAiB;AACjC,IAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA,EAAG;AACxB,MAAA,IAAA,CAAK,GAAA,CAAI,IAAI,KAAK,CAAA;AAClB,MAAA,MAAA,CAAO,IAAA,CAAK,IAAI,KAAK,CAAA;AAAA,IACvB;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;ACnKA,IAAM,oBAAA,GAAuB,mBAAA;AAC7B,IAAM,iBAAA,GAAoB,QAAA;AAEnB,SAAS,sBAAsB,KAAA,EAAyB;AAC7D,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AAEpB,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,iBAAiB,CAAA,CAAE,IAAI,CAAC,KAAA,KAAU,KAAA,CAAM,IAAA,EAAM,CAAA;AACzE,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAEhC,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,oBAAA,EAAsB,EAAE,EAAE,IAAA,EAAK;AAC7D,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,QAAA,CAAS,OAAA,EAAS,EAAE,CAAA;AACzC,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,IAAK,QAAQ,CAAA,EAAG;AACvC,MAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AAAA,IACnB;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,OAAO,CAAA;AAC3B;AAEO,SAAS,gBAAgB,YAAA,EAAgC;AAC9D,EAAA,OAAO,YAAA,CAAa,IAAI,CAAC,WAAA,KAAgB,IAAI,WAAW,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACvE;AAEO,SAAS,oBAAoB,WAAA,EAA6B;AAC/D,EAAA,OAAOH,IAAAA,CAAK,WAAA,EAAa,WAAA,EAAa,MAAA,EAAQ,SAAS,CAAA;AACzD;;;ACFO,SAAS,4BAAA,CAA6B,KAAkB,MAAA,EAAoC;AACjG,EAAA,OAAOI,IAAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA,kDAAA,CAAA;AAAA,IAab,IAAA,EAAM;AAAA,MACJ,YAAYA,IAAAA,CAAK,MAAA,CACd,MAAA,EAAO,CACP,SAAS,yEAAyE,CAAA;AAAA,MACrF,QAAA,EAAUA,KAAK,MAAA,CACZ,OAAA,GACA,QAAA,EAAS,CACT,SAAS,iEAAiE;AAAA,KAC/E;AAAA,IAEA,MAAM,QAAQ,IAAA,EAAuB;AACnC,MAAA,MAAM,MAAA,GAAS,MAAM,qBAAA,CAAsB,GAAA,EAAK,QAAQ,IAAA,CAAK,UAAA,EAAY,KAAK,QAAQ,CAAA;AACtF,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,IACvC;AAAA,GACD,CAAA;AACH;AAEA,eAAe,qBAAA,CACb,GAAA,EACA,MAAA,EACA,UAAA,EACA,kBAAA,EACwB;AACxB,EAAA,IAAI,CAAC,MAAA,CAAO,MAAA,EAAQ,SAAS,CAAC,MAAA,CAAO,QAAQ,IAAA,EAAM;AACjD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,OAAA;AAAA,MACP,UAAA;AAAA,MACA,KAAA,EAAO,8BAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAEA,EAAA,MAAM,YAAA,GAAe,sBAAsB,UAAU,CAAA;AACrD,EAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,OAAA;AAAA,MACP,UAAA;AAAA,MACA,KAAA,EAAO,2BAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,mBAAA,CAAoB,GAAA,CAAI,SAAS,CAAA;AACpD,EAAA,MAAM,gBAAgB,UAAU,CAAA;AAEhC,EAAA,MAAM,aAAA,GAAgB,MAAM,UAAA,CAAW,GAAA,EAAK,QAAQ,YAAY,CAAA;AAChE,EAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,OAAA;AAAA,MACP,UAAA;AAAA,MACA,KAAA,EAAO,iBAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAqB,aAAA,CAAc,MAAA,GAAS,CAAA,GAAI,aAAA,GAAgB,OAAA;AACtE,EAAA,MAAM,UAAA,GAAa,gBAAgB,YAAY,CAAA;AAE/C,EAAA,MAAM,YAAA,GAAe,iBAAA,CAAkB,KAAA,EAAO,UAAA,EAAY,aAAiB,CAAA;AAC3E,EAAA,MAAM,iBAAiB,MAAM,kBAAA,CAAmB,GAAA,EAAK,MAAA,EAAQ,YAAgC,CAAA;AAE7F,EAAA,IAAI,CAAC,eAAe,OAAA,EAAS;AAC3B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA;AAAA,MACA,UAAA,EAAY,UAAA;AAAA,MACZ,KAAA,EAAO,eAAe,KAAA,IAAS,wBAAA;AAAA,MAC/B,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,cAAA,CAAe,OAAA,IAAW,EAAE,CAAA;AAC/D,EAAA,MAAM,QAAA,GAAW,cAAc,MAAM,CAAA;AACrC,EAAA,MAAM,iBAAA,GAAoB,sBAAsB,QAAQ,CAAA;AACxD,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,QAAA,EAAU,iBAAiB,CAAA;AAExD,EAAA,MAAM,mBAAmB,MAAM,gBAAA;AAAA,IAC7B,UAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAA;AAAA,IACA,MAAA;AAAA,IACA,eAAe,OAAA,IAAW,EAAA;AAAA,IAC1B,QAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,KAAA;AAAA,IACA,UAAA,EAAY,UAAA;AAAA,IACZ,QAAA;AAAA,IACA,iBAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,eAAe,UAAA,CACb,GAAA,EACA,MAAA,EACA,YAAA,EACwD;AACxD,EAAA,MAAM,UAAyD,EAAC;AAEhE,EAAA,KAAA,MAAW,eAAe,YAAA,EAAc;AACtC,IAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,CAAW,GAAA,EAAK,QAAQ,WAAW,CAAA;AACvD,IAAA,IAAI,CAAC,KAAA,EAAO;AAEZ,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,EAAA,EAAI,CAAA,CAAA,EAAI,KAAA,CAAM,MAAM,CAAA,CAAA;AAAA,MACpB,OAAA,EAAS,kBAAA,CAAmB,KAAA,CAAM,KAAA,EAAO,MAAM,IAAI;AAAA,KACpD,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,kBAAA,CAAmB,OAAe,IAAA,EAA6B;AACtE,EAAA,MAAM,UAAU,IAAA,EAAM,IAAA,EAAK,GAAI,IAAA,CAAK,MAAK,GAAI,SAAA;AAC7C,EAAA,OAAO,KAAK,KAAK;;AAAA,EAAO,OAAO,CAAA,CAAA;AACjC;AAEA,eAAe,gBAAgB,GAAA,EAA4B;AACzD,EAAA,IAAI,CAACH,UAAAA,CAAW,GAAG,CAAA,EAAG;AACpB,IAAA,MAAMQ,KAAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EACtC;AACF;AAEA,SAAS,iBAAA,CACP,KAAA,EACA,UAAA,EACA,OAAA,EACA,YAAA,EACQ;AACR,EAAA,MAAM,aAAa,OAAA,CAChB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,SAAA,EAAY,EAAE,EAAE;;AAAA,EAAO,EAAE,OAAA,IAAW,SAAS,CAAA,CAAE,CAAA,CAC1D,KAAK,aAAa,CAAA;AAErB,EAAA,MAAM,mBACJ,KAAA,KAAU,aAAA,GACN,UAAU,UAAU,CAAA,wDAAA,CAAA,GACpB,SAAS,UAAU,CAAA,2BAAA,CAAA;AAEzB,EAAA,OAAO,CAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,WAAA,EAUI,gBAAgB;;AAAA;AAAA,EAGX,8BAA8B;;AAAA;AAAA,EAG9C,UAAU;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,EAYR,UAAU,aAAA,GACN,CAAA;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,GAAA,CAAA,GAgCA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAAA,CAeN;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,yCAAA,CAAA;AAQF;AAQA,eAAe,kBAAA,CACb,GAAA,EACA,MAAA,EACA,MAAA,EACA,mBAAA,EACuB;AACvB,EAAA,IAAI;AACF,IAAA,MAAM,YAAA,GAAe,MAAM,GAAA,CAAI,MAAA,CAAO,QAAQ,MAAA,CAAO;AAAA,MACnD,IAAA,EAAM;AAAA,QACJ,KAAA,EAAO;AAAA;AACT,KACD,CAAA;AAED,IAAA,IAAI,CAAC,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI;AAC1B,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,iCAAA,EAAkC;AAAA,IACpE;AAEA,IAAA,MAAM,SAAA,GAAY,aAAa,IAAA,CAAK,EAAA;AAEpC,IAAA,MAAM,YAAA,GAAe,MAAM,GAAA,CAAI,MAAA,CAAO,QAAQ,MAAA,CAAO;AAAA,MACnD,IAAA,EAAM,EAAE,EAAA,EAAI,SAAA,EAAU;AAAA,MACtB,IAAA,EAAM;AAAA,QACJ,KAAA,EAAON,iBAAAA,CAAiB,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAAA,QAC5C,OAAO,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,QAAQ;AAAA;AACxC,KACD,CAAA;AAED,IAAA,IAAI,CAAC,aAAa,IAAA,EAAM;AACtB,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA,IAC5D;AAEA,IAAA,MAAM,cAAA,GAAiB,MAAM,GAAA,CAAI,MAAA,CAAO,QAAQ,QAAA,CAAS;AAAA,MACvD,IAAA,EAAM,EAAE,EAAA,EAAI,SAAA;AAAU,KACvB,CAAA;AAED,IAAA,MAAM,WAAA,GAAc,cAAA,CAAe,IAAA,EAAM,EAAA,CAAG,CAAA,CAAE,CAAA;AAC9C,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,+BAAA,EAAgC;AAAA,IAClE;AAEA,IAAA,MAAM,SAAA,GAAY,WAAA,CAAY,KAAA,EAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,MAAM,CAAA,IAAK,EAAC;AAC1E,IAAA,MAAM,OAAA,GAAU,UAAU,GAAA,CAAI,CAAC,MAAO,CAAA,CAAuB,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAE5E,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,OAAA,EAAQ;AAAA,EAClC,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,CAAA,qBAAA,EAAwB,OAAO,CAAA,CAAA,EAAG;AAAA,EACpE;AACF;AAEA,SAASA,kBAAiB,WAAA,EAA8D;AACtF,EAAA,MAAM,CAAC,UAAA,EAAY,OAAO,CAAA,GAAI,WAAA,CAAY,MAAM,GAAG,CAAA;AACnD,EAAA,OAAO,EAAE,UAAA,EAAY,UAAA,IAAc,QAAA,EAAU,OAAA,EAAS,WAAW,WAAA,EAAY;AAC/E;AAEA,eAAe,gBAAA,CACb,YACA,KAAA,EACA,UAAA,EACA,SACA,MAAA,EACA,cAAA,EACA,QAAA,EACA,iBAAA,EACA,WAAA,EACiB;AACjB,EAAA,MAAM,IAAA,GAAA,qBAAW,IAAA,EAAK,EAAE,aAAY,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA;AAClD,EAAA,MAAM,UAAA,GAAa,CAAA,aAAA,EAAgB,KAAK,CAAA,CAAA,EAAI,UAAA,CAAW,QAAQ,UAAA,EAAY,GAAG,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AACvF,EAAA,MAAM,UAAA,GAAa,KAAA,KAAU,aAAA,GAAgB,QAAA,GAAW,OAAA;AACxD,EAAA,MAAM,UAAA,GAAaH,IAAAA,CAAK,UAAA,EAAY,UAAU,CAAA;AAE9C,EAAA,MAAM,gBAAgB,UAAU,CAAA;AAEhC,EAAA,MAAM,SAAA,GAAY,QAAQ,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACpD,EAAA,MAAM,EAAE,SAAQ,GAAI,MAAA;AAEpB,EAAA,MAAM,QAAA,GAAW,CAAA,gBAAA,EAAmB,UAAU,CAAA,CAAA,EAAI,UAAU;;AAAA,UAAA,EAElD,IAAI;AAAA;AAAA,qBAAA,EAEO,SAAS;;AAAA;;AAAA;;AAAA,oBAAA,EAMV,QAAQ,WAAW;AAAA,qBAAA,EAClB,QAAQ,YAAY,CAAA;AAAA,uBAAA,EAClB,QAAQ,cAAc,CAAA;AAAA,oBAAA,EACzB,QAAQ,WAAW,CAAA;;AAAA,oBAAA,EAEnB,QAAQ,cAAc;;AAAA;;AAAA;;AAAA,EAM1C,cAAA,CAAe,MAAM,CAAC;;AAAA;;AAAA;;AAAA;AAAA;;AAAA,EAStB,cAAc;;AAAA;AAAA,CAAA;AAKd,EAAA,MAAM,QAAA,GAA2B;AAAA,IAC/B,OAAA,EAAS,IAAA;AAAA,IACT,KAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,iBAAA;AAAA,IACA,gBAAA,EAAkB,UAAA;AAAA,IAClB,OAAA,EAAS,WAAA;AAAA,IACT,cAAA,EAAgB,OAAA;AAAA,IAChB;AAAA,GACF;AAEA,EAAA,MAAMU,UAAUV,IAAAA,CAAK,UAAA,EAAY,WAAW,CAAA,EAAG,UAAU,OAAO,CAAA;AAChE,EAAA,MAAMU,SAAAA,CAAUV,IAAAA,CAAK,UAAA,EAAY,eAAe,CAAA,EAAG,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAA,EAAG,OAAO,CAAA;AAE7F,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,eAAe,MAAA,EAAsC;AAC5D,EAAA,IAAI,MAAA,GAAS,EAAA;AAEb,EAAA,MAAM,aAAA,GAAwC;AAAA,IAC5C,QAAA,EAAU,WAAA;AAAA,IACV,KAAA,EAAO,WAAA;AAAA,IACP,aAAA,EAAe,QAAA;AAAA,IACf,WAAA,EAAa;AAAA,GACf;AAEA,EAAA,IAAI,OAAO,QAAA,EAAU;AACnB,IAAA,KAAA,MAAW,CAAC,UAAU,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA,EAAG;AAClE,MAAA,IAAI,QAAA,IAAY,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AACnC,QAAA,MAAA,IAAU,CAAA,IAAA,EAAO,aAAA,CAAc,QAAQ,CAAA,IAAK,EAAE,CAAA,CAAA,EAAI,kBAAA,CAAmB,QAAQ,CAAC,CAAA,EAAA,EAAK,QAAA,CAAS,MAAM,CAAA;;AAAA,CAAA;AAClG,QAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,UAAA,MAAA,IAAU,SAAS,OAAA,CAAQ,QAAA,CAAS,aAAa,CAAA,EAAA,EAAK,QAAQ,KAAK;AAAA,CAAA;AACnE,UAAA,MAAA,IAAU,CAAA,aAAA,EAAgB,QAAQ,WAAW;AAAA,CAAA;AAC7C,UAAA,MAAA,IAAU,CAAA,YAAA,EAAe,QAAQ,MAAM;AAAA,CAAA;AACvC,UAAA,MAAA,IAAU,CAAA,gBAAA,EAAmB,QAAQ,UAAU;AAAA,CAAA;AAC/C,UAAA,MAAA,IAAU,qDAAA;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAO,aAAA,EAAe;AACxB,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,aAAA,EAAe;AACxC,MAAA,MAAA,IAAU,CAAA,UAAA,EAAa,KAAA,CAAM,OAAO,CAAA,EAAA,EAAK,MAAM,KAAK;;AAAA,CAAA;AACpD,MAAA,KAAA,MAAW,CAAC,UAAU,QAAQ,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,QAAQ,CAAA,EAAG;AACjE,QAAA,MAAM,aAAA,GAAgB,QAAA;AACtB,QAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAEhC,QAAA,MAAA,IAAU,QAAQ,kBAAA,CAAmB,QAA2B,CAAC,CAAA,EAAA,EAAK,cAAc,MAAM,CAAA;;AAAA,CAAA;AAE1F,QAAA,KAAA,MAAW,WAAW,aAAA,EAAe;AACnC,UAAA,MAAA,IAAU,CAAA,GAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK,QAAQ,KAAK;AAAA,CAAA;AAClD,UAAA,MAAA,IAAU,CAAA,IAAA,EAAO,QAAQ,WAAW;AAAA,CAAA;AACpC,UAAA,MAAA,IAAU,CAAA,YAAA,EAAe,QAAQ,MAAM;AAAA,CAAA;AACvC,UAAA,MAAA,IAAU,CAAA,gBAAA,EAAmB,QAAQ,UAAU;;AAAA,CAAA;AAAA,QACjD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,CAAO,gBAAA,IAAoB,MAAA,CAAO,gBAAA,CAAiB,SAAS,CAAA,EAAG;AACjE,IAAA,MAAA,IAAU,4BAAA;AACV,IAAA,KAAA,MAAW,KAAA,IAAS,OAAO,gBAAA,EAAkB;AAC3C,MAAA,MAAA,IAAU,CAAA,GAAA,EAAM,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK,MAAM,KAAK;AAAA,CAAA;AAC9C,MAAA,MAAA,IAAU,CAAA,IAAA,EAAO,MAAM,WAAW;AAAA,CAAA;AAClC,MAAA,MAAA,IAAU,CAAA,qBAAA,EAAwB,KAAA,CAAM,cAAA,CAAe,IAAA,CAAK,IAAI,CAAC;AAAA,CAAA;AACjE,MAAA,MAAA,IAAU,CAAA,gBAAA,EAAmB,MAAM,UAAU;;AAAA,CAAA;AAAA,IAC/C;AAAA,EACF;AAEA,EAAA,OAAO,MAAA,IAAU,uBAAA;AACnB;AAEA,SAAS,mBAAmB,QAAA,EAA0B;AACpD,EAAA,MAAM,KAAA,GAAgC;AAAA,IACpC,QAAA,EAAU,iBAAA;AAAA,IACV,KAAA,EAAO,cAAA;AAAA,IACP,aAAA,EAAe,gBAAA;AAAA,IACf,WAAA,EAAa;AAAA,GACf;AACA,EAAA,OAAO,KAAA,CAAM,QAAQ,CAAA,IAAK,QAAA;AAC5B;AAEA,SAAS,YAAA,CAAa,UAAyB,MAAA,EAAuC;AACpF,EAAA,MAAM,YAAY,MAAA,CACf,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,QAAA,KAAa,UAAU,CAAA,CACvC,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA,CAClB,KAAK,IAAI,CAAA;AAEZ,EAAA,OAAO,CAAA,MAAA,EAAS,QAAA,CAAS,KAAK,CAAA,SAAA,EAAY,SAAS,IAAI,CAAA,OAAA,EAAU,QAAA,CAAS,MAAM,CAAA,SAAA,EAAY,QAAA,CAAS,GAAG,CAAA,2BAAA,EAA8B,aAAa,MAAM,CAAA,CAAA,CAAA;AAC3J;;;ACrbO,SAAS,yBAAyB,QAAA,EAA8C;AACrF,EAAA,MAAM,eAAA,GAAkB,oBAAoB,QAAQ,CAAA;AACpD,EAAA,MAAM,YAAA,GAAe,iBAAiB,QAAQ,CAAA;AAC9C,EAAA,MAAM,oBAAA,GAAuB,oBAAoB,QAAQ,CAAA;AAEzD,EAAA,OAAO;AAAA,IACL,aAAA,EAAe,QAAA;AAAA,IACf,eAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,SAAS,4BAA4B,WAAA,EAA6B;AAChE,EAAA,MAAM,aAAA,GAAgB,CAAA;AACtB,EAAA,MAAM,qBAAA,GAAwB,IAAA,CAAK,IAAA,CAAK,WAAA,GAAc,GAAG,CAAA;AACzD,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,aAAA,EAAe,qBAAqB,CAAA;AACtD;AAEA,SAAS,oBAAoB,QAAA,EAA6C;AACxE,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAA8D;AAErF,EAAA,KAAA,MAAW,YAAY,QAAA,EAAU;AAC/B,IAAA,KAAA,MAAW,OAAA,IAAW,QAAA,CAAS,QAAA,CAAS,QAAA,EAAU;AAChD,MAAA,MAAM,GAAA,GAAM,uBAAuB,OAAO,CAAA;AAC1C,MAAA,MAAM,QAAA,GAAW,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,IAAK,EAAE,MAAA,EAAQ,EAAC,EAAG,SAAA,EAAW,EAAC,EAAE;AACpE,MAAA,QAAA,CAAS,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA;AACnC,MAAA,QAAA,CAAS,SAAA,CAAU,KAAK,OAAO,CAAA;AAC/B,MAAA,UAAA,CAAW,GAAA,CAAI,KAAK,QAAQ,CAAA;AAAA,IAC9B;AAEA,IAAA,KAAA,MAAW,SAAA,IAAa,QAAA,CAAS,QAAA,CAAS,UAAA,EAAY;AACpD,MAAA,MAAM,GAAA,GAAM,uBAAuB,SAAS,CAAA;AAC5C,MAAA,MAAM,QAAA,GAAW,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,IAAK,EAAE,MAAA,EAAQ,EAAC,EAAG,SAAA,EAAW,EAAC,EAAE;AACpE,MAAA,QAAA,CAAS,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA;AACnC,MAAA,QAAA,CAAS,SAAA,CAAU,KAAK,SAAS,CAAA;AACjC,MAAA,UAAA,CAAW,GAAA,CAAI,KAAK,QAAQ,CAAA;AAAA,IAC9B;AAAA,EACF;AAEA,EAAA,MAAM,kBAAA,GAAqB,2BAAA,CAA4B,QAAA,CAAS,MAAM,CAAA;AACtE,EAAA,MAAM,kBAAoC,EAAC;AAE3C,EAAA,KAAA,MAAW,CAAC,CAAA,EAAG,IAAI,CAAA,IAAK,UAAA,EAAY;AAClC,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,MAAA,IAAU,kBAAA,EAAoB;AAC5C,MAAA,eAAA,CAAgB,IAAA,CAAK;AAAA,QACnB,KAAA,EAAO,IAAA,CAAK,SAAA,CAAU,CAAC,CAAA;AAAA,QACvB,QAAQ,IAAA,CAAK,MAAA;AAAA,QACb,QAAA,EAAU,IAAA,CAAK,SAAA,CAAU,CAAC;AAAA,OAC3B,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,eAAA;AACT;AAEA,SAAS,iBAAiB,QAAA,EAA0C;AAClE,EAAA,MAAM,eAA8B,EAAC;AACrC,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAY;AAEvC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,IAAA,KAAA,IAAS,IAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AAC5C,MAAA,MAAM,MAAA,GAAS,SAAS,CAAC,CAAA;AACzB,MAAA,MAAM,MAAA,GAAS,SAAS,CAAC,CAAA;AACzB,MAAA,MAAM,UAAU,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,OAAO,KAAK,CAAA,CAAA;AAE/C,MAAA,IAAI,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA,EAAG;AACjC,MAAA,cAAA,CAAe,IAAI,OAAO,CAAA;AAE1B,MAAA,MAAM,qBAAA,GAAwB,yBAAA,CAA0B,MAAA,EAAQ,MAAM,CAAA;AACtE,MAAA,KAAA,MAAW,YAAY,qBAAA,EAAuB;AAC5C,QAAA,YAAA,CAAa,IAAA,CAAK;AAAA,UAChB,KAAA,EAAO,CAAA,yBAAA,EAA4B,QAAA,CAAS,SAAS,CAAA,CAAA;AAAA,UACrD,SAAA,EAAW;AAAA,YACT,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,QAAA,EAAU,CAAA,EAAG,QAAA,CAAS,SAAS,CAAA,EAAA,EAAK,QAAA,CAAS,UAAU,CAAA,CAAA,EAAG;AAAA,YACjF,EAAE,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,QAAA,EAAU,CAAA,EAAG,QAAA,CAAS,SAAS,CAAA,EAAA,EAAK,QAAA,CAAS,UAAU,CAAA,CAAA;AAAG;AACnF,SACD,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,YAAA;AACT;AAUA,SAAS,yBAAA,CACP,QACA,MAAA,EACoB;AACpB,EAAA,MAAM,YAAgC,EAAC;AACvC,EAAA,MAAM,gBAAgB,EAAE,QAAA,EAAU,GAAG,SAAA,EAAW,CAAA,EAAG,OAAO,CAAA,EAAE;AAE5D,EAAA,KAAA,MAAW,MAAA,IAAU,OAAO,iBAAA,EAAmB;AAC7C,IAAA,MAAM,aAAA,GAAgB,OAAO,iBAAA,CAAkB,IAAA;AAAA,MAAK,CAAC,CAAA,KACnD,CAAA,CAAE,SAAA,CAAU,WAAA,GAAc,QAAA,CAAS,MAAA,CAAO,SAAA,CAAU,WAAA,EAAa;AAAA,KACnE;AAEA,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,MAAM,OAAO,IAAA,CAAK,GAAA;AAAA,QAChB,cAAc,MAAA,CAAO,aAAa,CAAA,GAAI,aAAA,CAAc,cAAc,aAAa;AAAA,OACjF;AACA,MAAA,IAAI,QAAQ,CAAA,EAAG;AACb,QAAA,SAAA,CAAU,IAAA,CAAK;AAAA,UACb,WAAW,MAAA,CAAO,SAAA;AAAA,UAClB,WAAW,MAAA,CAAO,aAAA;AAAA,UAClB,YAAY,MAAA,CAAO,SAAA;AAAA,UACnB,WAAW,aAAA,CAAc,aAAA;AAAA,UACzB,YAAY,aAAA,CAAc;AAAA,SAC3B,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,SAAA;AACT;AAEA,SAAS,oBAAoB,QAAA,EAAiD;AAC5E,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAGtB;AAEF,EAAA,KAAA,MAAW,YAAY,QAAA,EAAU;AAC/B,IAAA,KAAA,MAAW,KAAA,IAAS,SAAS,iBAAA,EAAmB;AAC9C,MAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,CAAI,KAAA,CAAM,SAAS,CAAA,IAAK,EAAE,KAAA,EAAO,EAAC,EAAG,KAAA,EAAO,CAAA,EAAE;AAC3E,MAAA,QAAA,CAAS,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,GAAI,KAAA,CAAM,aAAA;AACvC,MAAA,QAAA,CAAS,KAAA,EAAA;AACT,MAAA,WAAA,CAAY,GAAA,CAAI,KAAA,CAAM,SAAA,EAAW,QAAQ,CAAA;AAAA,IAC3C;AAAA,EACF;AAEA,EAAA,MAAM,aAAmC,EAAC;AAC1C,EAAA,KAAA,MAAW,CAAC,SAAA,EAAW,IAAI,CAAA,IAAK,WAAA,EAAa;AAC3C,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AACtC,IAAA,MAAM,cAAA,GAAiB,wBAAwB,KAAK,CAAA;AACpD,IAAA,MAAM,eAAA,GAAkB,yBAAyB,KAAK,CAAA;AAEtD,IAAA,UAAA,CAAW,IAAA,CAAK;AAAA,MACd,SAAA;AAAA,MACA,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,cAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,wBACP,KAAA,EACoC;AACpC,EAAA,IAAI,KAAA,CAAM,MAAA,IAAU,CAAA,EAAG,OAAO,QAAA;AAE9B,EAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,KAAK,CAAA;AACjC,EAAA,IAAI,WAAA,CAAY,IAAA,KAAS,CAAA,EAAG,OAAO,QAAA;AACnC,EAAA,IAAI,WAAA,CAAY,IAAA,KAAS,CAAA,EAAG,OAAO,UAAA;AACnC,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,yBACP,KAAA,EACoC;AACpC,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,OAAA;AAE/B,EAAA,MAAM,gBAAgB,EAAE,QAAA,EAAU,GAAG,SAAA,EAAW,CAAA,EAAG,OAAO,CAAA,EAAE;AAC5D,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,MAAA,CAAO,CAAC,GAAA,EAAK,MAAM,GAAA,GAAM,aAAA,CAAc,CAAC,CAAA,EAAG,CAAC,CAAA;AAC9D,EAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,MAAA;AAExB,EAAA,IAAI,GAAA,GAAM,KAAK,OAAO,UAAA;AACtB,EAAA,IAAI,GAAA,GAAM,KAAK,OAAO,WAAA;AACtB,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,uBAAuB,IAAA,EAAsB;AACpD,EAAA,OAAO,IAAA,CACJ,WAAA,EAAY,CACZ,OAAA,CAAQ,YAAY,EAAE,CAAA,CACtB,KAAA,CAAM,KAAK,EACX,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CACV,KAAK,GAAG,CAAA;AACb;AAEO,SAASc,oBAAmB,YAAA,EAA+D;AAChG,EAAA,IAAI,CAAC,YAAA,IAAgB,OAAO,YAAA,KAAiB,QAAA,EAAU;AACrD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,SAAA,GAAY,YAAA,CAAa,KAAA,CAAM,aAAa,CAAA;AAClD,IAAA,IAAI,CAAC,WAAW,OAAO,IAAA;AAEvB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,CAAC,CAAC,CAAA;AAEtC,IAAA,IAAI,CAAC,MAAA,CAAO,KAAA,IAAS,CAAC,MAAA,CAAO,UAAU,OAAO,IAAA;AAE9C,IAAA,OAAO;AAAA,MACL,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,WAAA,EAAa,OAAO,WAAA,IAAe,EAAA;AAAA,MACnC,QAAA,EAAU;AAAA,QACR,UAAA,EAAY,MAAA,CAAO,QAAA,CAAS,UAAA,IAAc,EAAC;AAAA,QAC3C,QAAA,EAAU,MAAA,CAAO,QAAA,CAAS,QAAA,IAAY,EAAC;AAAA,QACvC,WAAA,EAAa,MAAA,CAAO,QAAA,CAAS,WAAA,IAAe;AAAC,OAC/C;AAAA,MACA,kBAAA,EAAoB,MAAA,CAAO,kBAAA,IAAsB,EAAC;AAAA,MAClD,iBAAA,EAAmB,MAAA,CAAO,iBAAA,IAAqB,EAAC;AAAA,MAChD,OAAA,EAAS,OAAO,OAAA,IAAW;AAAA,KAC7B;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;AC5OO,SAAS,4BAAA,CAA6B,KAAkB,MAAA,EAAoC;AACjG,EAAA,OAAOV,IAAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,qMAAA,CAAA;AAAA,IAWb,IAAA,EAAM;AAAA,MACJ,gBAAA,EAAkBA,IAAAA,CAAK,MAAA,CACpB,MAAA,EAAO,CACP,QAAA;AAAA,QACC;AAAA,OACF;AAAA,MACF,MAAA,EAAQA,IAAAA,CAAK,MAAA,CACV,KAAA,CAAMA,IAAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,CAAA,CAC1B,QAAA,EAAS,CACT,QAAA,CAAS,4DAA4D;AAAA,KAC1E;AAAA,IAEA,MAAM,QAAQ,IAAA,EAAuB;AACnC,MAAA,MAAM,SAAS,MAAM,yBAAA;AAAA,QACnB,GAAA;AAAA,QACA,MAAA;AAAA,QACA,IAAA,CAAK,gBAAA;AAAA,QACL,IAAA,CAAK;AAAA,OACP;AACA,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,IACvC;AAAA,GACD,CAAA;AACH;AAEA,eAAe,yBAAA,CACb,GAAA,EACA,MAAA,EACA,gBAAA,EACA,cAAA,EAC8B;AAC9B,EAAA,MAAM,YAAA,GAAeJ,IAAAA,CAAK,gBAAA,EAAkB,eAAe,CAAA;AAE3D,EAAA,IAAI,CAACC,UAAAA,CAAW,YAAY,CAAA,EAAG;AAC7B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,UAAA,EAAY,EAAA;AAAA,MACZ,KAAA,EAAO,4BAA4B,YAAY,CAAA,CAAA;AAAA,MAC/C,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAEA,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,eAAA,GAAkB,MAAMC,QAAAA,CAAS,YAAA,EAAc,OAAO,CAAA;AAC5D,IAAA,MAAA,GAAS,IAAA,CAAK,MAAM,eAAe,CAAA;AAAA,EACrC,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,OAAA,GAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,eAAA;AACrD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,UAAA,EAAY,EAAA;AAAA,MACZ,KAAA,EAAO,iCAAiC,OAAO,CAAA,CAAA;AAAA,MAC/C,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,MAAA,CAAO,OAAA,IAAW,CAAC,OAAO,cAAA,EAAgB;AAC7C,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,KAAA,EAAO,uDAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAEA,EAAA,MAAM,SAAS,cAAA,GACV,cAAA,GACD,yBAAyB,MAAA,CAAO,iBAAA,IAAqB,EAAE,CAAA;AAE3D,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,KAAA,EAAO,sBAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,MAAM,YAAA,EAAa;AAEpC,EAAA,MAAM,gBAAgB,MAAA,CAAO,GAAA;AAAA,IAAI,CAAC,SAAA,KAChC,iBAAA,CAAkB,KAAK,MAAA,EAAQ,SAAA,EAAW,QAAQ,QAAQ;AAAA,GAC5D;AAEA,EAAA,MAAM,YAAA,GAAe,MAAM,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AAEpD,EAAA,MAAM,qBAAqB,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA,KAA0B,MAAM,IAAI,CAAA;AAEpF,EAAA,IAAI,kBAAA,CAAmB,WAAW,CAAA,EAAG;AACnC,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,KAAA,EAAO,gCAAA;AAAA,MACP,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAEA,EAAA,MAAM,WAAA,GAAc,yBAAyB,kBAAkB,CAAA;AAE/D,EAAA,MAAM,kBAAA,GAAqB,WAAA,CAAY,aAAA,CAAc,GAAA,CAAI,CAAC,QAAA,KAAa;AACrE,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,QAAA,EAAU,QAAA,CAAS,KAAK,CAAA;AACnD,IAAA,OAAO,oBAAoB,QAAA,EAAU,QAAA,CAAS,KAAA,EAAO,OAAA,CAAQ,MAAM,MAAM,CAAA;AAAA,EAC3E,CAAC,CAAA;AAED,EAAA,MAAM,OAAA,GAAU,wBAAA,CAAyB,WAAA,EAAa,MAAA,CAAO,MAAM,CAAA;AAEnE,EAAA,MAAM,MAAA,GAA8B;AAAA,IAClC,OAAA,EAAS,IAAA;AAAA,IACT,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,gBAAA;AAAA,IACA,aAAA,EAAe,kBAAA;AAAA,IACf,iBAAiB,WAAA,CAAY,eAAA;AAAA,IAC7B,cAAc,WAAA,CAAY,YAAA;AAAA,IAC1B,sBAAsB,WAAA,CAAY,oBAAA;AAAA,IAClC;AAAA,GACF;AAEA,EAAA,MAAM,UAAA,GAAaF,IAAAA,CAAK,gBAAA,EAAkB,aAAa,CAAA;AACvD,EAAA,MAAMU,SAAAA,CAAU,YAAY,IAAA,CAAK,SAAA,CAAU,QAAQ,IAAA,EAAM,CAAC,GAAG,OAAO,CAAA;AAEpE,EAAA,OAAO,MAAA;AACT;AAEA,eAAe,iBAAA,CACb,GAAA,EACA,MAAA,EACA,SAAA,EACA,QACA,QAAA,EAC+B;AAC/B,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,UAAA,CAAW,QAAA,EAAU,SAAS,CAAA;AAC9C,IAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,OAAA,EAAS,MAAM,CAAA;AAE/C,IAAA,MAAM,YAAA,GAAe,MAAM,GAAA,CAAI,MAAA,CAAO,QAAQ,MAAA,CAAO;AAAA,MACnD,IAAA,EAAM;AAAA,QACJ,KAAA,EAAO,CAAA,eAAA,EAAkB,OAAA,CAAQ,IAAI,CAAA,SAAA;AAAA;AACvC,KACD,CAAA;AAED,IAAA,IAAI,CAAC,YAAA,CAAa,IAAA,EAAM,EAAA,EAAI;AAC1B,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,oCAAA,EAAuC,SAAS,CAAA,CAAE,CAAA;AAC/D,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,SAAA,GAAY,aAAa,IAAA,CAAK,EAAA;AAEpC,IAAA,MAAM,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO;AAAA,MAC9B,IAAA,EAAM,EAAE,EAAA,EAAI,SAAA,EAAU;AAAA,MACtB,IAAA,EAAM;AAAA,QACJ,KAAA,EAAOP,iBAAAA,CAAiB,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA;AAAA,QAC5C,OAAO,CAAC,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,QAAQ;AAAA;AACxC,KACD,CAAA;AAED,IAAA,MAAM,cAAA,GAAiB,MAAM,GAAA,CAAI,MAAA,CAAO,QAAQ,QAAA,CAAS;AAAA,MACvD,IAAA,EAAM,EAAE,EAAA,EAAI,SAAA;AAAU,KACvB,CAAA;AAED,IAAA,MAAM,WAAA,GAAc,cAAA,CAAe,IAAA,EAAM,EAAA,CAAG,CAAA,CAAE,CAAA;AAC9C,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,wBAAA,EAA2B,SAAS,CAAA,CAAE,CAAA;AACnD,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,SAAA,GAAY,WAAA,CAAY,KAAA,EAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,MAAM,CAAA,IAAK,EAAC;AAC1E,IAAA,MAAM,OAAA,GAAU,UAAU,GAAA,CAAI,CAAC,MAAO,CAAA,CAAuB,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAE5E,IAAA,MAAM,MAAA,GAASW,oBAAmB,OAAO,CAAA;AACzC,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,sBAAA,CAAuB,SAAA,EAAW,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA;AAAA,IAChE;AAEA,IAAA,OAAO,mBAAA,CAAoB,MAAA,EAAQ,SAAA,EAAW,OAAA,CAAQ,MAAM,MAAM,CAAA;AAAA,EACpE,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,OAAA,GAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AACzD,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,aAAA,EAAgB,SAAS,CAAA,sBAAA,EAAyB,OAAO,CAAA,CAAE,CAAA;AACxE,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEA,SAAS,gBAAA,CACP,SACA,MAAA,EACQ;AACR,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,cAAA,EAC1B,GAAA,CAAI,CAAC,CAAA,KAA8C;AACnD,IAAA,MAAM,UAAU,CAAA,CAAE,OAAA,EAAS,SAAA,CAAU,CAAA,EAAG,GAAI,CAAA,IAAK,SAAA;AACjD,IAAA,MAAM,YAAY,CAAA,CAAE,OAAA,IAAW,EAAE,OAAA,CAAQ,MAAA,GAAS,MAAO,gBAAA,GAAmB,EAAA;AAC5E,IAAA,OAAO,CAAA,MAAA,EAAS,EAAE,EAAE,CAAA;AAAA,EAAM,OAAO,GAAG,SAAS,CAAA,CAAA;AAAA,EAC/C,CAAC,CAAA,CACA,IAAA,CAAK,MAAM,CAAA;AAEd,EAAA,OAAO,CAAA,QAAA,EAAW,OAAA,CAAQ,IAAI,CAAA,MAAA,EAAS,QAAQ,KAAK,CAAA;;AAAA,eAAA,EAErC,QAAQ,IAAI;AAAA,oBAAA,EACP,OAAA,CAAQ,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC;AAAA,sBAAA,EAC1B,QAAQ,WAAW;;AAAA,sEAAA,EAE6B,QAAQ,IAAI,CAAA;;AAAA;AAAA,EAGlF,kBAAkB,8BAA8B;;AAAA;AAAA,EAGhD,MAAA,CAAO,kBAAkB,yBAAyB;;AAAA;AAAA,iCAAA,EAGjB,QAAQ,WAAW,CAAA;AAAA;AAAA;AAAA;AAAA,8BAAA,EAItB,OAAA,CAAQ,SAAA,CAAU,CAAC,CAAA,IAAK,gBAAgB,CAAA;;AAAA;AAAA;AAAA,aAAA,EAIzD,QAAQ,IAAI,CAAA;AAAA,mBAAA,EACN,QAAQ,WAAW,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AAcxC;AAEA,SAAS,mBAAA,CACP,QAAA,EACA,SAAA,EACA,SAAA,EACA,MAAA,EACe;AACf,EAAA,MAAM,cAAA,GAAA,CAAkB,OAAO,cAAA,IAAkB,IAAI,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,EAAE,CAAA;AAC5E,EAAA,MAAM,UAAA,GAAA,iBAAa,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAE1C,EAAA,OAAO;AAAA,IACL,GAAG,QAAA;AAAA,IACH,KAAA,EAAO,SAAA;AAAA,IACP,SAAA,EAAW,SAAS,SAAA,IAAa,SAAA;AAAA,IACjC,UAAA,EAAY,SAAS,UAAA,IAAc,UAAA;AAAA,IACnC,eAAA,EAAiB,SAAS,eAAA,IAAmB;AAAA,GAC/C;AACF;AAEA,SAAS,sBAAA,CACP,SAAA,EACA,SAAA,EACA,UAAA,EACe;AACf,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,SAAA;AAAA,IACP,SAAA;AAAA,IACA,UAAA,EAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,IACnC,iBAAiB,EAAC;AAAA,IAClB,WAAA,EAAa,GAAG,SAAS,CAAA,cAAA,CAAA;AAAA,IACzB,QAAA,EAAU;AAAA,MACR,YAAY,EAAC;AAAA,MACb,UAAU,CAAC,UAAA,CAAW,SAAA,CAAU,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,MACvC,aAAa;AAAC,KAChB;AAAA,IACA,oBAAoB,EAAC;AAAA,IACrB,mBAAmB,EAAC;AAAA,IACpB,OAAA,EAAS,GAAG,SAAS,CAAA,gEAAA;AAAA,GACvB;AACF;AAEA,SAASX,kBAAiB,WAAA,EAA8D;AACtF,EAAA,MAAM,CAAC,UAAA,EAAY,OAAO,CAAA,GAAI,WAAA,CAAY,MAAM,GAAG,CAAA;AACnD,EAAA,OAAO,EAAE,UAAA,EAAY,UAAA,IAAc,WAAA,EAAa,OAAA,EAAS,WAAW,WAAA,EAAY;AAClF;AAEA,SAAS,wBAAA,CAAyB,aAAgC,WAAA,EAA6B;AAC7F,EAAA,MAAM,YAAA,GAAe,YAAY,aAAA,CAAc,MAAA;AAC/C,EAAA,MAAM,cAAA,GAAiB,YAAY,eAAA,CAAgB,MAAA;AACnD,EAAA,MAAM,WAAA,GAAc,YAAY,YAAA,CAAa,MAAA;AAE7C,EAAA,OAAO,aAAa,YAAY,CAAA,CAAA,EAAI,WAAW,CAAA,eAAA,EAAkB,cAAc,yBAAyB,WAAW,CAAA,eAAA,CAAA;AACrH;ACtSA,IAAML,KAAAA,GAAM,mBAAmB,aAAa,CAAA;AAuGrC,SAAS,gBAAA,CACd,GAAA,EACA,MAAA,EACA,OAAA,EACgB;AAChB,EAAA,OAAOM,IAAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;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,sBAAA,EA2CO,MAAA,CAAO,GAAA,EAAK,YAAA,IAAgB,CAAC,CAAA;AAAA;AAAA;AAAA,sCAAA,CAAA;AAAA,IAKjD,IAAA,EAAM;AAAA,MACJ,aAAA,EAAeA,IAAAA,CAAK,MAAA,CACjB,MAAA,CAAO;AAAA,QACN,IAAA,EAAMA,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,WAAA,EAAa,aAAA,EAAe,WAAW,CAAC,CAAA;AAAA;AAAA,QAEhE,IAAA,EAAMA,IAAAA,CAAK,MAAA,CAAO,MAAA,GAAS,QAAA,EAAS;AAAA,QACpC,QAAA,EAAUA,IAAAA,CAAK,MAAA,CAAO,MAAA,GAAS,QAAA,EAAS;AAAA,QACxC,OAAA,EAASA,IAAAA,CAAK,MAAA,CAAO,MAAA,GAAS,QAAA,EAAS;AAAA;AAAA,QAEvC,MAAA,EAAQA,IAAAA,CAAK,MAAA,CAAO,MAAA,GAAS,QAAA,EAAS;AAAA,QACtC,aAAA,EAAeA,KAAK,MAAA,CAAO,KAAA,CAAMA,KAAK,MAAA,CAAO,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS;AAAA;AAAA,QAEhE,KAAA,EAAOA,KAAK,MAAA,CAAO,KAAA,CAAMA,KAAK,MAAA,CAAO,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS;AAAA,QACxD,WAAA,EAAaA,IAAAA,CAAK,MAAA,CAAO,MAAA,GAAS,QAAA;AAAS,OAC5C,CAAA,CACA,QAAA,EAAS,CACT,SAAS,qDAAqD,CAAA;AAAA;AAAA,MAGjE,OAAA,EAASA,IAAAA,CAAK,MAAA,CACX,IAAA,CAAK,CAAC,WAAA,EAAa,aAAA,EAAe,WAAW,CAAC,CAAA,CAC9C,QAAA,EAAS,CACT,SAAS,uCAAuC,CAAA;AAAA,MACnD,wBAAA,EAA0BA,KAAK,MAAA,CAC5B,MAAA,GACA,QAAA,EAAS,CACT,SAAS,qCAAqC;AAAA,KACnD;AAAA,IAEA,MAAM,QAAQ,IAAA,EAAuB;AACnC,MAAA,MAAM,SAAS,MAAM,kBAAA,CAAmB,GAAA,EAAK,MAAA,EAAQ,SAAS,IAAkB,CAAA;AAChF,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,IACvC;AAAA,GACD,CAAA;AACH;AAMA,eAAe,kBAAA,CACb,GAAA,EACA,MAAA,EACA,OAAA,EACA,IAAA,EACuB;AAEvB,EAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,aAAA,IAAiB,iBAAA,CAAkB,MAAM,OAAO,CAAA;AAG/E,EAAA,MAAM,UAAA,GAAa,mBAAmB,iBAAiB,CAAA;AACvD,EAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,IAAAN,MAAI,IAAA,CAAK,+BAAA,EAAiC,EAAE,KAAA,EAAO,UAAA,CAAW,OAAO,CAAA;AACrE,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,QAAA,EAAU,KAAA;AAAA,MACV,MAAA,EAAQ,KAAA;AAAA,MACR,OAAO,UAAA,CAAW,KAAA;AAAA,MAClB,WAAA,EAAa,iBAAA,CAAkB,QAAA,EAAU,UAAU,CAAA;AAAA,MACnD,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAGA,EAAA,IAAI,iBAAA,CAAmB,SAAS,WAAA,EAAa;AAC3C,IAAA,MAAM,iBAAA,GAAoB,MAAM,0BAAA,CAA2B;AAAA,MACzD,YAAY,GAAA,CAAI,SAAA;AAAA,MAChB,aAAA,EAAe,CAAA,qBAAA,EAAwB,iBAAA,CAAmB,IAAI,CAAA,CAAA;AAAA,KAC/D,CAAA;AAED,IAAA,IAAI,CAAC,iBAAA,CAAkB,OAAA,IAAW,iBAAA,CAAkB,QAAA,EAAU;AAC5D,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,QAAA,EAAU,KAAA;AAAA,QACV,MAAA,EAAQ,IAAA;AAAA,QACR,KAAA,EAAO,0BAAA,CAA2B,iBAAA,CAAkB,QAAQ,CAAA;AAAA,QAC5D,YAAY,iBAAA,CAAkB;AAAA,OAChC;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAA8B,iBAAA,CAAmB,IAAA,KAAS,WAAA,GAAc,KAAA,GAAQ,OAAA;AAGtF,EAAA,IAAI,iBAAA,CAAmB,SAAS,WAAA,EAAa;AAC3C,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,eAAA,CAAgB,QAAQ,CAAA;AACjD,IAAA,IAAI,CAAC,SAAS,KAAA,EAAO;AACnB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,QAAA,EAAU,KAAA;AAAA,QACV,MAAA,EAAQ,KAAA;AAAA,QACR,OAAO,QAAA,CAAS,MAAA;AAAA,QAChB,UAAA,EAAY,CAAA,aAAA,EAAgB,UAAA,CAAW,WAAA,EAAa,CAAA,2BAAA;AAAA,OACtD;AAAA,IACF;AAGA,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,WAAA,CAAY,UAAU,CAAA;AAClD,IAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACxB,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,QAAA,EAAU,KAAA;AAAA,QACV,MAAA,EAAQ,KAAA;AAAA,QACR,OAAO,WAAA,CAAY;AAAA,OACrB;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,WAAA,GAAc,QAAQ,cAAA,EAAe;AAC3C,EAAA,MAAM,cAAA,GAAiB,QAAQ,iBAAA,EAAkB;AACjD,EAAA,MAAM,SAAS,MAAM,iBAAA;AAAA,IACnB,GAAA,CAAI,SAAA;AAAA,IACJ,iBAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,MAAM,SAAS,MAAM,yBAAA;AAAA,IACnB,GAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,CAAA,mBAAA,EAAsB,iBAAA,CAAmB,IAAI,CAAA,OAAA,CAAA;AAAA,MACpD,YAAA,EAAc,QAAA;AAAA,MACd,UAAA,EAAY;AAAA,KACd;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAAA,KAAAA,CAAI,KAAK,gCAAA,EAAkC;AAAA,MACzC,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,kBAAkB,MAAA,CAAO;AAAA,KAC1B,CAAA;AACD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,QAAA,EAAU,KAAA;AAAA,MACV,MAAA,EAAQ,KAAA;AAAA,MACR,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,UAAA,EAAY,mDAAA;AAAA,MACZ,kBAAkB,MAAA,CAAO;AAAA,KAC3B;AAAA,EACF;AAEA,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AAGpB,EAAA,IAAI,KAAK,WAAA,EAAa;AACpB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,QAAA,EAAU,KAAA;AAAA,MACV,MAAA,EAAQ,KAAA;AAAA,MACR,KAAA,EAAO,6BAAA;AAAA,MACP,WAAA,EAAa,KAAK,WAAA,CAAY,MAAA;AAAA,MAC9B,UAAA,EAAY,KAAK,WAAA,CAAY;AAAA,KAC/B;AAAA,EACF;AAGA,EAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,QAAA,EAAU,KAAA;AAAA,MACV,MAAA,EAAQ,KAAA;AAAA,MACR,KAAA,EAAO,2BAAA;AAAA,MACP,UAAA,EAAY,KAAK,iBAAA,CAAkB;AAAA,KACrC;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAQ;AAC5B,IAAA,MAAM,QAAA,GAAW,uBAAA,CAAwB,IAAA,CAAK,UAAA,IAAc,EAAE,CAAA;AAC9D,IAAA,MAAM,UAAA,GAAa,KAAK,UAAA,IAAc,uBAAA;AAGtC,IAAA,IAAI,iBAAA,CAAmB,SAAS,WAAA,EAAa;AAC3C,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,UAAA,CAAW,UAAA,EAAY,QAAQ,CAAA;AAE1D,MAAA,IAAI,WAAW,QAAA,EAAU;AACvB,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,QAAA,EAAU,KAAA;AAAA,UACV,MAAA,EAAQ,IAAA;AAAA,UACR,QAAA,EAAU,MAAA;AAAA,UACV,UAAA;AAAA,UACA,UAAA,EAAY,mBAAA,CAAoB,IAAA,CAAK,UAAA,IAAc,EAAE,CAAA;AAAA,UACrD,WAAA,EAAa,QAAQ,cAAA,EAAe;AAAA,UACpC,eAAA,EAAiB,IAAA;AAAA,UACjB,cAAA,EAAgB,QAAQ,iBAAA,EAAkB;AAAA,UAC1C,UAAA,EACE;AAAA,SACJ;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,IAAA;AAAA,MACT,QAAA,EAAU,KAAA;AAAA,MACV,MAAA,EAAQ,IAAA;AAAA,MACR,QAAA,EAAU,MAAA;AAAA,MACV,UAAA;AAAA,MACA,UAAA,EAAY,mBAAA,CAAoB,IAAA,CAAK,UAAA,IAAc,EAAE,CAAA;AAAA,MACrD,WAAA,EAAa,QAAQ,cAAA,EAAe;AAAA,MACpC,cAAA,EAAgB,QAAQ,iBAAA,EAAkB;AAAA,MAC1C,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAGA,EAAA,IAAI,iBAAA,CAAmB,SAAS,WAAA,EAAa;AAC3C,IAAA,OAAA,CAAQ,aAAA,CAAc,IAAA,CAAK,YAAA,IAAgB,EAAE,CAAA;AAAA,EAC/C;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,QAAA,EAAU,IAAA;AAAA,IACV,MAAA,EAAQ,KAAA;AAAA,IACR,QAAA,EAAU,UAAA;AAAA,IACV,cAAc,IAAA,CAAK,YAAA;AAAA,IACnB,WAAA,EAAa,QAAQ,cAAA;AAAe,GACtC;AACF;AAKA,SAAS,iBAAA,CACP,MACA,OAAA,EACqC;AACrC,EAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,OAAO,MAAA;AAE1B,EAAA,MAAM,QAAA,GAAW,KAAK,wBAAA,IAA4B,SAAA;AAElD,EAAA,QAAQ,KAAK,OAAA;AAAS,IACpB,KAAK,WAAA,EAAa;AAChB,MAAA,MAAM,SAAA,GAAY,QAAQ,gBAAA,EAAiB;AAC3C,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,WAAA;AAAA,QACN,IAAA,EAAM,WAAW,QAAA,IAAY,SAAA;AAAA,QAC7B,QAAA,EAAU,WAAW,QAAA,IAAY,QAAA;AAAA,QACjC,OAAA,EAAS,WAAW,cAAA,IAAkB;AAAA,OACxC;AAAA,IACF;AAAA,IAEA,KAAK,aAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,aAAA;AAAA,QACN,IAAA,EAAM,SAAA;AAAA,QACN,MAAA,EAAQ,QAAA;AAAA,QACR,aAAA,EAAe,CAAC,QAAQ;AAAA,OAC1B;AAAA,IAEF,KAAK,WAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,WAAA;AAAA,QACN,KAAA,EAAO,CAAC,QAAQ,CAAA;AAAA,QAChB,WAAA,EAAa;AAAA,OACf;AAAA;AAEN;AAKA,eAAe,iBAAA,CACb,UAAA,EACA,OAAA,EACA,WAAA,EACA,cAAA,EACiB;AAEjB,EAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB,QAAA,EAAU,UAAU,CAAA;AACzD,EAAA,IAAI,SAAS,MAAA,CAAO,OAAA;AAGpB,EAAA,IAAI,WAAA,GAAc,CAAA,IAAK,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG;AAChD,IAAA,MAAA,IAAU;;AAAA;;AAAA,WAAA,EAAsC,WAAW;AAAA,CAAA;AAC3D,IAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,MAAA,MAAA,IAAU,wBAAA;AACV,MAAA,KAAA,MAAW,WAAW,cAAA,EAAgB;AACpC,QAAA,MAAM,SAAS,OAAA,CAAQ,QAAA,GAAW,CAAA,UAAA,EAAa,OAAA,CAAQ,UAAU,CAAA,CAAA,CAAA,GAAM,YAAA;AACvE,QAAA,MAAA,IAAU,MAAM,OAAA,CAAQ,IAAI,KAAK,OAAA,CAAQ,WAAW,MAAM,MAAM;AAAA,CAAA;AAAA,MAClE;AAAA,IACF;AACA,IAAA,MAAA,IAAU,IAAA;AAAA,EACZ;AAGA,EAAA,QAAQ,QAAQ,IAAA;AAAM,IACpB,KAAK,WAAA;AACH,MAAA,MAAA,IAAU,oBAAoB,WAAA,EAAa;AAAA,QACzC,YAAA,EAAc,qEAAA;AAAA,QACd,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,KAAA,EAAO;AAAA,UACL,sEAAA;AAAA,UACA,4DAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,cAAA,EAAgB;AAAA,OACjB,CAAA;AACD,MAAA;AAAA,IAEF,KAAK,aAAA;AACH,MAAA,MAAA,IAAU,oBAAoB,aAAA,EAAe;AAAA,QAC3C,YAAA,EAAc,kDAAA;AAAA,QACd,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,eAAe,OAAA,CAAQ,aAAA;AAAA,QACvB,KAAA,EAAO;AAAA,UACL,yDAAA;AAAA,UACA,uCAAA;AAAA,UACA,4CAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,cAAA,EAAgB;AAAA,OACjB,CAAA;AACD,MAAA;AAAA,IAEF,KAAK,WAAA;AACH,MAAA,MAAA,IAAU,oBAAoB,WAAA,EAAa;AAAA,QACzC,YAAA,EAAc,yDAAA;AAAA,QACd,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,KAAA,EAAO;AAAA,UACL,6CAAA;AAAA,UACA,wCAAA;AAAA,UACA,qCAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,cAAA,EAAgB;AAAA,OACjB,CAAA;AACD,MAAA;AAAA;AAGJ,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,wBAAwB,UAAA,EAAsD;AACrF,EAAA,OAAO,UAAA,CAAW,GAAA,CAAI,CAAC,SAAA,EAAW,GAAA,MAAS;AAAA,IACzC,IAAI,CAAA,QAAA,EAAW,IAAA,CAAK,GAAA,EAAK,IAAI,GAAG,CAAA,CAAA;AAAA,IAChC,IAAA,EAAM,6BAAA,CAA8B,SAAA,CAAU,IAAI,CAAA;AAAA,IAClD,aAAa,SAAA,CAAU,WAAA;AAAA,IACvB,YAAY,SAAA,CAAU,UAAA;AAAA,IACtB,eAAe,SAAA,CAAU,QAAA,GAAW,CAAC,SAAA,CAAU,QAAQ,CAAA,GAAI,MAAA;AAAA,IAC3D,QAAA,EAAU;AAAA,GACZ,CAAE,CAAA;AACJ;AAKA,SAAS,8BACP,IAAA,EACkE;AAClE,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,qBAAA;AAAA,IACL,KAAK,iBAAA;AAAA,IACL,KAAK,gBAAA;AACH,MAAA,OAAO,aAAA;AAAA,IACT,KAAK,eAAA;AACH,MAAA,OAAO,UAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT;AACE,MAAA,OAAO,OAAA;AAAA;AAEb;AAKA,SAAS,oBAAoB,UAAA,EAAwD;AACnF,EAAA,OAAO,UAAA,CAAW,GAAA,CAAI,CAAC,SAAA,MAAe;AAAA,IACpC,MAAM,SAAA,CAAU,IAAA;AAAA,IAChB,UAAU,SAAA,CAAU,QAAA;AAAA,IACpB,aAAa,SAAA,CAAU,WAAA;AAAA,IACvB,YAAY,SAAA,CAAU;AAAA,GACxB,CAAE,CAAA;AACJ;AASO,SAAS,mBAAmB,OAAA,EAAwC;AAEzE,EAAA,IAAI,OAAA,KAAY,MAAA,IAAa,OAAA,KAAY,IAAA,EAAM;AAC7C,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,+EAAA;AAAA,MACP,aAAA,EAAe,CAAC,eAAe;AAAA,KACjC;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,sBAAsB,OAAO,CAAA;AAChD,EAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AACvB;AC/jBA,IAAMA,KAAAA,GAAM,mBAAmB,YAAY,CAAA;AAoEpC,SAAS,eAAA,CACd,GAAA,EACA,MAAA,EACA,OAAA,EACgB;AAChB,EAAA,OAAOM,IAAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;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,MAAA,CAAA;AAAA,IAoCb,IAAA,EAAM;AAAA,MACJ,YAAA,EAAcA,IAAAA,CAAK,MAAA,CAChB,MAAA,CAAO;AAAA,QACN,gBAAA,EAAkBA,IAAAA,CAAK,MAAA,CAAO,MAAA,CAAO;AAAA,UACnC,IAAA,EAAMA,IAAAA,CAAK,MAAA,CAAO,MAAA,EAAO;AAAA,UACzB,QAAA,EAAUA,IAAAA,CAAK,MAAA,CAAO,MAAA,EAAO;AAAA,UAC7B,OAAA,EAASA,IAAAA,CAAK,MAAA,CAAO,MAAA;AAAO,SAC7B,CAAA;AAAA,QACD,iBAAA,EAAmBA,IAAAA,CAAK,MAAA,CAAO,MAAA,CAAO;AAAA,UACpC,cAAcA,IAAAA,CAAK,MAAA,CAAO,MAAMA,IAAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAAA,UACpD,QAAA,EAAUA,IAAAA,CAAK,MAAA,CAAO,MAAA;AAAO,SAC9B;AAAA,OACF,CAAA,CACA,QAAA,EAAS,CACT,SAAS,oDAAoD,CAAA;AAAA;AAAA,MAGhE,gBAAA,EAAkBA,KAAK,MAAA,CACpB,MAAA,GACA,QAAA,EAAS,CACT,SAAS,uDAAuD,CAAA;AAAA,MACnE,iBAAA,EAAmBA,KAAK,MAAA,CACrB,MAAA,GACA,QAAA,EAAS,CACT,SAAS,yCAAyC;AAAA,KACvD;AAAA,IAEA,MAAM,QAAQ,IAAA,EAAuB;AACnC,MAAA,MAAM,SAAS,MAAM,iBAAA,CAAkB,GAAA,EAAK,MAAA,EAAQ,SAAS,IAAiB,CAAA;AAC9E,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,IACvC;AAAA,GACD,CAAA;AACH;AAMA,eAAe,iBAAA,CACb,GAAA,EACA,MAAA,EACA,OAAA,EACA,IAAA,EACsB;AAEtB,EAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,YAAA,IAAgBW,kBAAAA,CAAkB,MAAM,OAAO,CAAA;AAG9E,EAAA,MAAM,UAAA,GAAa,kBAAkB,iBAAiB,CAAA;AACtD,EAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,IAAAjB,MAAI,IAAA,CAAK,8BAAA,EAAgC,EAAE,KAAA,EAAO,UAAA,CAAW,OAAO,CAAA;AACpE,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,OAAO,UAAA,CAAW,KAAA;AAAA,MAClB,WAAA,EAAa,iBAAA,CAAkB,OAAA,EAAS,UAAU,CAAA;AAAA,MAClD,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAGA,EAAA,MAAM,iBAAA,GAAoB,MAAM,0BAAA,CAA2B;AAAA,IACzD,YAAY,GAAA,CAAI,SAAA;AAAA,IAChB,aAAA,EAAe,CAAA,+BAAA,EAAkC,iBAAA,CAAmB,gBAAA,CAAiB,IAAI,CAAA;AAAA,GAC1F,CAAA;AAED,EAAA,IAAI,CAAC,iBAAA,CAAkB,OAAA,IAAW,iBAAA,CAAkB,QAAA,EAAU;AAC5D,IAAAA,MAAI,IAAA,CAAK,gCAAA,EAAkC,EAAE,QAAA,EAAU,iBAAA,CAAkB,UAAU,CAAA;AACnF,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,0BAAA,CAA2B,iBAAA,CAAkB,QAAQ,CAAA;AAAA,MAC5D,oBAAA,EAAsB,0BAAA,CAA2B,iBAAA,CAAkB,QAAQ,CAAA;AAAA,MAC3E,YAAY,iBAAA,CAAkB;AAAA,KAChC;AAAA,EACF;AAGA,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,eAAA,CAAgB,OAAO,CAAA;AAChD,EAAA,IAAI,CAAC,SAAS,KAAA,EAAO;AACnB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,OAAO,QAAA,CAAS,MAAA;AAAA,MAChB,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAGA,EAAA,MAAM,WAAA,GAAc,QAAQ,UAAA,EAAW;AACvC,EAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACxB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,OAAO,WAAA,CAAY,KAAA;AAAA,MACnB,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,gBAAA,EAAiB,IAAK;AAAA,IAC9C,QAAA,EAAU,kBAAmB,gBAAA,CAAiB,IAAA;AAAA,IAC9C,QAAA,EAAU,kBAAmB,gBAAA,CAAiB,QAAA;AAAA,IAC9C,cAAA,EAAgB,kBAAmB,gBAAA,CAAiB;AAAA,GACtD;AAGA,EAAA,MAAM,SAAS,MAAM,gBAAA,CAAiB,GAAA,CAAI,SAAA,EAAW,mBAAoB,SAAS,CAAA;AAGlF,EAAA,MAAM,SAAS,MAAM,yBAAA;AAAA,IACnB,GAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,kCAAA;AAAA,MACP,YAAA,EAAc,OAAA;AAAA,MACd,UAAA,EAAY;AAAA,KACd;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAAA,KAAAA,CAAI,KAAK,+BAAA,EAAiC;AAAA,MACxC,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,kBAAkB,MAAA,CAAO;AAAA,KAC1B,CAAA;AACD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,UAAA,EAAY,mDAAA;AAAA,MACZ,kBAAkB,MAAA,CAAO;AAAA,KAC3B;AAAA,EACF;AAEA,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AAGpB,EAAA,IAAI,KAAK,WAAA,EAAa;AACpB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,6BAAA;AAAA,MACP,WAAA,EAAa,KAAK,WAAA,CAAY,MAAA;AAAA,MAC9B,UAAA,EAAY,KAAK,WAAA,CAAY;AAAA,KAC/B;AAAA,EACF;AAGA,EAAA,IAAI,KAAK,oBAAA,EAAsB;AAC7B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,sCAAA;AAAA,MACP,oBAAA,EAAsB,KAAK,oBAAA,CAAqB,WAAA;AAAA,MAChD,UAAA,EAAY,KAAK,oBAAA,CAAqB;AAAA,KACxC;AAAA,EACF;AAGA,EAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,2BAAA;AAAA,MACP,UAAA,EAAY,KAAK,iBAAA,CAAkB;AAAA,KACrC;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,CAAK,eAAe,MAAA,EAAQ;AAC9B,IAAAA,MAAI,IAAA,CAAK,6BAAA,EAA+B,EAAE,MAAA,EAAQ,IAAA,CAAK,YAAY,CAAA;AACnE,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,CAAA,gBAAA,EAAmB,IAAA,CAAK,UAAU,CAAA,eAAA,CAAA;AAAA,MACzC,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAGA,EAAA,IAAI,KAAK,mBAAA,EAAqB;AAC5B,IAAA,OAAA,CAAQ,aAAA,CAAc,KAAK,mBAAmB,CAAA;AAAA,EAChD;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,qBAAqB,IAAA,CAAK,mBAAA;AAAA,IAC1B,WAAA,EAAa,IAAA;AAAA,IACb,YAAY,IAAA,CAAK;AAAA,GACnB;AACF;AAKA,SAASiB,kBAAAA,CACP,MACA,OAAA,EACoC;AAEpC,EAAA,MAAM,SAAA,GAAY,QAAQ,gBAAA,EAAiB;AAC3C,EAAA,MAAM,YAAA,GAAe,QAAQ,mBAAA,EAAoB;AAEjD,EAAA,IAAI,aAAa,YAAA,EAAc;AAC7B,IAAA,OAAO;AAAA,MACL,gBAAA,EAAkB;AAAA,QAChB,MAAM,SAAA,CAAU,QAAA;AAAA,QAChB,UAAU,SAAA,CAAU,QAAA;AAAA,QACpB,SAAS,SAAA,CAAU;AAAA,OACrB;AAAA,MACA,iBAAA,EAAmB;AAAA,QACjB,cAAc,YAAA,CAAa,YAAA;AAAA,QAC3B,QAAA,EAAU,YAAA,CAAa,QAAA,GAAW,MAAA,GAAS,aAAa,UAAA,IAAc;AAAA;AACxE,KACF;AAAA,EACF;AAGA,EAAA,IAAI,CAAC,IAAA,CAAK,gBAAA,IAAoB,CAAC,KAAK,iBAAA,EAAmB;AACrD,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,OAAO;AAAA,IACL,gBAAA,EAAkB;AAAA,MAChB,MAAM,IAAA,CAAK,gBAAA;AAAA,MACX,QAAA,EAAU,SAAA;AAAA,MACV,SAAS,IAAA,CAAK;AAAA,KAChB;AAAA,IACA,iBAAA,EAAmB;AAAA,MACjB,cAAc,EAAC;AAAA,MACf,UAAU,IAAA,CAAK;AAAA;AACjB,GACF;AACF;AAWA,eAAe,gBAAA,CACb,UAAA,EACA,OAAA,EACA,SAAA,EACiB;AAEjB,EAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB,OAAA,EAAS,UAAU,CAAA;AACxD,EAAA,IAAI,SAAS,MAAA,CAAO,OAAA;AAGpB,EAAA,MAAA,IAAU,oBAAoB,aAAA,EAAe;AAAA,IAC3C,MAAM,SAAA,CAAU,QAAA;AAAA,IAChB,UAAU,SAAA,CAAU,QAAA;AAAA,IACpB,SAAS,SAAA,CAAU,cAAA;AAAA,IACnB,cAAA,EACE,OAAA,CAAQ,iBAAA,CAAkB,YAAA,CAAa,MAAA,GAAS,IAC5C,OAAA,CAAQ,iBAAA,CAAkB,YAAA,GAC1B,CAAC,kDAAkD,CAAA;AAAA,IACzD,YAAA,EAAc,QAAQ,iBAAA,CAAkB,QAAA;AAAA,IACxC,IAAA,EAAM;AAAA,GACP,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AASO,SAAS,kBAAkB,OAAA,EAAwC;AAExE,EAAA,IAAI,OAAA,KAAY,MAAA,IAAa,OAAA,KAAY,IAAA,EAAM;AAC7C,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EACE,gHAAA;AAAA,MACF,aAAA,EAAe,CAAC,cAAc;AAAA,KAChC;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,qBAAqB,OAAO,CAAA;AAC/C,EAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,IAAA,OAAO,UAAA;AAAA,EACT;AAEA,EAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AACvB;ACpZA,IAAMjB,KAAAA,GAAM,mBAAmB,UAAU,CAAA;AAmFlC,SAAS,aAAA,CACd,GAAA,EACA,MAAA,EACA,OAAA,EACgB;AAChB,EAAA,OAAOM,IAAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;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,MAAA,CAAA;AAAA,IAwCb,IAAA,EAAM;AAAA,MACJ,UAAA,EAAYA,IAAAA,CAAK,MAAA,CACd,MAAA,CAAO;AAAA,QACN,IAAA,EAAMA,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,YAAA,EAAc,YAAA,EAAc,YAAY,CAAC,CAAA;AAAA;AAAA,QAEjE,kBAAA,EAAoBA,KAAK,MAAA,CAAO,KAAA,CAAMA,KAAK,MAAA,CAAO,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS;AAAA,QACrE,WAAA,EAAaA,IAAAA,CAAK,MAAA,CAAO,MAAA,GAAS,QAAA,EAAS;AAAA;AAAA,QAE3C,YAAA,EAAcA,IAAAA,CAAK,MAAA,CAAO,MAAA,GAAS,QAAA,EAAS;AAAA,QAC5C,kBAAA,EAAoBA,KAAK,MAAA,CAAO,IAAA,CAAK,CAAC,QAAQ,CAAC,EAAE,QAAA,EAAS;AAAA,QAC1D,eAAA,EAAiBA,IAAAA,CAAK,MAAA,CAAO,MAAA,GAAS,QAAA,EAAS;AAAA,QAC/C,YAAA,EAAcA,IAAAA,CAAK,MAAA,CAAO,MAAA,GAAS,QAAA,EAAS;AAAA;AAAA,QAE5C,UAAA,EAAYA,IAAAA,CAAK,MAAA,CAAO,MAAA,GAAS,QAAA,EAAS;AAAA,QAC1C,eAAA,EAAiBA,IAAAA,CAAK,MAAA,CAAO,MAAA,GAAS,QAAA;AAAS,OAChD,CAAA,CACA,QAAA,EAAS,CACT,SAAS,kDAAkD,CAAA;AAAA;AAAA,MAG9D,OAAA,EAASA,IAAAA,CAAK,MAAA,CACX,IAAA,CAAK,CAAC,YAAA,EAAc,YAAA,EAAc,YAAY,CAAC,CAAA,CAC/C,QAAA,EAAS,CACT,SAAS,2BAA2B,CAAA;AAAA,MACvC,kBAAA,EAAoBA,KAAK,MAAA,CACtB,MAAA,GACA,QAAA,EAAS,CACT,SAAS,6CAA6C,CAAA;AAAA,MACzD,kBAAA,EAAoBA,KAAK,MAAA,CACtB,MAAA,GACA,QAAA,EAAS,CACT,SAAS,0CAA0C;AAAA,KACxD;AAAA,IAEA,MAAM,QAAQ,IAAA,EAAuB;AACnC,MAAA,MAAM,SAAS,MAAM,eAAA,CAAgB,GAAA,EAAK,MAAA,EAAQ,SAAS,IAAe,CAAA;AAC1E,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,IACvC;AAAA,GACD,CAAA;AACH;AAMA,eAAe,eAAA,CACb,GAAA,EACA,MAAA,EACA,OAAA,EACA,IAAA,EACoB;AAEpB,EAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,UAAA,IAAcW,kBAAAA,CAAkB,IAAI,CAAA;AAGnE,EAAA,MAAM,UAAA,GAAa,gBAAgB,iBAAiB,CAAA;AACpD,EAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,IAAAjB,MAAI,IAAA,CAAK,4BAAA,EAA8B,EAAE,KAAA,EAAO,UAAA,CAAW,OAAO,CAAA;AAClE,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,OAAO,UAAA,CAAW,KAAA;AAAA,MAClB,WAAA,EAAa,iBAAA,CAAkB,KAAA,EAAO,UAAU,CAAA;AAAA,MAChD,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAGA,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,eAAA,CAAgB,KAAK,CAAA;AAC9C,EAAA,IAAI,CAAC,SAAS,KAAA,EAAO;AACnB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,OAAO,QAAA,CAAS,MAAA;AAAA,MAChB,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAGA,EAAA,MAAM,WAAA,GAAc,QAAQ,QAAA,EAAS;AACrC,EAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AACxB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,OAAO,WAAA,CAAY;AAAA,KACrB;AAAA,EACF;AAGA,EAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,GAAA,CAAI,WAAW,iBAAkB,CAAA;AAGrE,EAAA,MAAM,SAAS,MAAM,yBAAA;AAAA,IACnB,GAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,oCAAA;AAAA,MACP,YAAA,EAAc,KAAA;AAAA,MACd,UAAA,EAAY;AAAA,KACd;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAAA,KAAAA,CAAI,KAAK,6BAAA,EAA+B;AAAA,MACtC,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,kBAAkB,MAAA,CAAO;AAAA,KAC1B,CAAA;AACD,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,UAAA,EAAY,mDAAA;AAAA,MACZ,kBAAkB,MAAA,CAAO;AAAA,KAC3B;AAAA,EACF;AAEA,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA;AAGpB,EAAA,IAAI,KAAK,WAAA,EAAa;AACpB,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,6BAAA;AAAA,MACP,WAAA,EAAa,KAAK,WAAA,CAAY,MAAA;AAAA,MAC9B,UAAA,EAAY,KAAK,WAAA,CAAY;AAAA,KAC/B;AAAA,EACF;AAGA,EAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,2BAAA;AAAA,MACP,UAAA,EAAY,KAAK,iBAAA,CAAkB;AAAA,KACrC;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,CAAK,uBAAuB,MAAA,EAAQ;AACtC,IAAAA,MAAI,IAAA,CAAK,2BAAA,EAA6B,EAAE,MAAA,EAAQ,IAAA,CAAK,oBAAoB,CAAA;AACzE,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,CAAA,6BAAA,EAAgC,IAAA,CAAK,kBAAkB,CAAA,eAAA,CAAA;AAAA,MAC9D,oBAAoB,IAAA,CAAK,kBAAA;AAAA,MACzB,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA,IAAY,KAAK,cAAA,EAAgB;AACzD,IAAA,OAAA,CAAQ,YAAY,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,KAAK,cAAc,CAAA;AAAA,EACvE;AAEA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,gBAAgB,IAAA,CAAK,cAAA;AAAA,IACrB,oBAAoB,IAAA,CAAK;AAAA,GAC3B;AACF;AAKA,SAASiB,mBAAkB,IAAA,EAAiD;AAC1E,EAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,OAAO,MAAA;AAE1B,EAAA,QAAQ,KAAK,OAAA;AAAS,IACpB,KAAK,YAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,YAAA;AAAA,QACN,oBAAoB,IAAA,CAAK,kBAAA,GAAqB,CAAC,IAAA,CAAK,kBAAkB,IAAI;AAAC,OAC7E;AAAA,IAEF,KAAK,YAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,YAAA;AAAA,QACN,YAAA,EAAc,KAAK,kBAAA,IAAsB,EAAA;AAAA,QACzC,kBAAA,EAAoB,QAAA;AAAA,QACpB,eAAA,EAAiB,MAAA;AAAA,QACjB,YAAA,EAAc,KAAK,kBAAA,IAAsB;AAAA,OAC3C;AAAA,IAEF,KAAK,YAAA;AACH,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,YAAA;AAAA,QACN,UAAA,EAAY,KAAK,kBAAA,IAAsB,EAAA;AAAA,QACvC,eAAA,EAAiB,KAAK,kBAAA,IAAsB;AAAA,OAC9C;AAAA;AAEN;AAKA,eAAe,cAAA,CAAe,YAAoB,OAAA,EAAgD;AAEhG,EAAA,MAAM,MAAA,GAAS,MAAM,eAAA,CAAgB,KAAA,EAAO,UAAU,CAAA;AACtD,EAAA,IAAI,SAAS,MAAA,CAAO,OAAA;AAGpB,EAAA,QAAQ,QAAQ,IAAA;AAAM,IACpB,KAAK,YAAA;AACH,MAAA,MAAA,IAAU,oBAAoB,YAAA,EAAc;AAAA,QAC1C,YAAA,EAAc,gEAAA;AAAA,QACd,oBAAoB,OAAA,CAAQ,kBAAA;AAAA,QAC5B,WAAA,EAAa,OAAA,CAAQ,WAAA,EAAa,QAAA,EAAS;AAAA,QAC3C,IAAA,EAAM;AAAA,OACP,CAAA;AACD,MAAA;AAAA,IAEF,KAAK,YAAA;AACH,MAAA,MAAA,IAAU,oBAAoB,YAAA,EAAc;AAAA,QAC1C,YAAA,EAAc,+DAAA;AAAA,QACd,cAAc,OAAA,CAAQ,YAAA;AAAA,QACtB,oBAAoB,OAAA,CAAQ,kBAAA;AAAA,QAC5B,iBAAiB,OAAA,CAAQ,eAAA;AAAA,QACzB,cAAc,OAAA,CAAQ,YAAA;AAAA,QACtB,IAAA,EAAM;AAAA,OACP,CAAA;AACD,MAAA;AAAA,IAEF,KAAK,YAAA;AACH,MAAA,MAAA,IAAU,oBAAoB,YAAA,EAAc;AAAA,QAC1C,YAAA,EAAc,mEAAA;AAAA,QACd,YAAY,OAAA,CAAQ,UAAA;AAAA,QACpB,iBAAiB,OAAA,CAAQ,eAAA;AAAA,QACzB,IAAA,EAAM;AAAA,OACP,CAAA;AACD,MAAA;AAAA;AAGJ,EAAA,OAAO,MAAA;AACT;AAUO,SAAS,gBAAgB,OAAA,EAAwC;AAEtE,EAAA,IAAI,OAAA,KAAY,MAAA,IAAa,OAAA,KAAY,IAAA,EAAM;AAC7C,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,4EAAA;AAAA,MACP,aAAA,EAAe,CAAC,YAAY;AAAA,KAC9B;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,mBAAmB,OAAO,CAAA;AAC7C,EAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,IAAA,OAAO,UAAA;AAAA,EACT;AAGA,EAAA,MAAM,GAAA,GAAM,OAAA;AAGZ,EAAA,IAAI,IAAI,IAAA,KAAS,YAAA,IAAgB,GAAA,CAAI,kBAAA,CAAmB,WAAW,CAAA,EAAG;AACpE,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAO,sDAAA;AAAA,MACP,aAAA,EAAe,CAAC,oBAAoB;AAAA,KACtC;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,OAAO,IAAA,EAAK;AACvB;ACraO,SAAS,2BAAA,CACd,GAAA,EACA,OAAA,EACA,MAAA,EACgB;AAChB,EAAA,OAAOX,IAAAA,CAAK;AAAA,IACV,WAAA,EAAa,CAAA;;AAAA;;AAAA,0EAAA,CAAA;AAAA,IAMb,IAAA,EAAM;AAAA,MACJ,WAAA,EAAaA,IAAAA,CAAK,MAAA,CAAO,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,qBAAqB,CAAA;AAAA,MACjF,QAAQA,IAAAA,CAAK,MAAA,CAAO,MAAA,EAAO,CAAE,SAAS,2BAA2B;AAAA,KACnE;AAAA,IAEA,MAAM,QAAQ,IAAA,EAAuB;AAEnC,MAAA,MAAM,UAAA,GAAa,qBAAqB,MAAM,CAAA;AAC9C,MAAA,IAAI,CAAC,WAAW,KAAA,EAAO;AACrB,QAAA,MAAMI,OAAAA,GAAkC;AAAA,UACtC,OAAA,EAAS,KAAA;AAAA,UACT,aAAa,IAAA,CAAK,WAAA;AAAA,UAClB,KAAA,EAAO,WAAW,KAAA,IAAS,qBAAA;AAAA,UAC3B,YAAY,UAAA,CAAW;AAAA,SACzB;AACA,QAAA,OAAO,IAAA,CAAK,SAAA,CAAUA,OAAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,MACvC;AAEA,MAAA,MAAM,OAAA,GAAU,MAAM,iBAAA,CAAkB,GAAA,EAAK,QAAQ,IAAA,CAAK,WAAA,EAAa,KAAK,MAAM,CAAA;AAElF,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAM,OAAA,CAAQ,iBAAA,CAAkB,IAAA,CAAK,WAAA,EAAa,KAAK,MAAM,CAAA;AAAA,MAC/D;AAEA,MAAA,MAAM,SAAkC,OAAA,GACpC;AAAA,QACE,OAAA,EAAS,IAAA;AAAA,QACT,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,WAAW,IAAA,CAAK,MAAA;AAAA,QAChB,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,OACpC,GACA;AAAA,QACE,OAAA,EAAS,KAAA;AAAA,QACT,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,KAAA,EAAO,uCAAA;AAAA,QACP,UAAA,EAAY;AAAA,OACd;AAEJ,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA;AAAA,IACvC;AAAA,GACD,CAAA;AACH;;;ACfO,SAAS,WAAA,CACd,GAAA,EACA,OAAA,EACA,MAAA,EACgC;AAGhC,EAAA,MAAM,SAAA,GAAY,CAAA,IAAA,EAAO,MAAA,CAAO,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,CAAE,QAAA,CAAS,QAAQ,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AACnF,EAAA,MAAM,UAAA,GAAa,IAAI,eAAA,CAAgB,GAAA,CAAI,WAAW,SAAS,CAAA;AAE/D,EAAA,MAAM,KAAA,GAAwC;AAAA,IAC5C,cAAA,EAAgB,kBAAA,CAAmB,GAAA,EAAK,OAAA,EAAS,MAAM,CAAA;AAAA,IACvD,gBAAA,EAAkB,oBAAA,CAAqB,GAAA,EAAK,MAAM,CAAA;AAAA,IAClD,wBAAA,EAA0B,2BAAA,CAA4B,GAAA,EAAK,OAAA,EAAS,MAAM,CAAA;AAAA,IAC1E,gBAAA,EAAkB,oBAAA,CAAqB,OAAe,CAAA;AAAA,IACtD,WAAA,EAAa,iBAAiB,MAAM,CAAA;AAAA;AAAA,IAEpC,qBAAA,EAAuB,yBAAA,CAA0B,GAAA,EAAK,MAAM,CAAA;AAAA,IAC5D,yBAAA,EAA2B,4BAAA,CAA6B,GAAA,EAAK,MAAM,CAAA;AAAA,IACnE,yBAAA,EAA2B,4BAAA,CAA6B,GAAA,EAAK,MAAM,CAAA;AAAA,IACnE,qBAAA,EAAuB,yBAAA,CAA0B,GAAA,EAAK,MAAM,CAAA;AAAA;AAAA,IAE5D,oBAAA,EAAsB,wBAAA,CAAyB,GAAA,EAAK,MAAM,CAAA;AAAA,IAC1D,oBAAA,EAAsB,wBAAA,CAAyB,GAAA,EAAK,MAAM,CAAA;AAAA,IAC1D,iBAAA,EAAmB,qBAAA,CAAsB,GAAA,EAAK,MAAM,CAAA;AAAA,IACpD,mBAAA,EAAqB,uBAAA,CAAwB,GAAW,CAAA;AAAA;AAAA,IAExD,cAAA,EAAgB,kBAAA,CAAmB,GAAA,EAAK,MAAM,CAAA;AAAA,IAC9C,aAAA,EAAe,kBAAA,CAAmB,GAAA,EAAK,MAAM,CAAA;AAAA,IAC7C,QAAA,EAAU,aAAA,CAAc,GAAA,EAAK,MAAM,CAAA;AAAA,IACnC,iBAAA,EAAmB,qBAAA,CAAsB,GAAA,EAAK,MAAM,CAAA;AAAA;AAAA,IAEpD,aAAA,EAAe,kBAAA,CAAmB,GAAA,EAAK,MAAM,CAAA;AAAA,IAC7C,WAAA,EAAa,gBAAA,CAAiB,GAAA,EAAK,MAAM,CAAA;AAAA,IACzC,sBAAA,EAAwB,0BAAA,CAA2B,GAAA,EAAK,MAAM,CAAA;AAAA,IAC9D,oBAAA,EAAsB,wBAAA,CAAyB,GAAA,EAAK,MAAM,CAAA;AAAA,IAC1D,sBAAA,EAAwB,0BAAA,CAA2B,GAAA,EAAK,MAAM,CAAA;AAAA;AAAA,IAE9D,kBAAA,EAAoB,sBAAA,CAAuB,GAAA,EAAK,OAAA,EAAS,MAAM,CAAA;AAAA,IAC/D,oBAAA,EAAsB,wBAAA,CAAyB,GAAA,EAAK,MAAM,CAAA;AAAA,IAC1D,mBAAA,EAAqB,uBAAA,CAAwB,GAAA,EAAK,MAAM,CAAA;AAAA,IACxD,oBAAA,EAAsB,wBAAA,CAAyB,GAAA,EAAK,MAAM,CAAA;AAAA;AAAA,IAE1D,cAAA,EAAgB,kBAAA,CAAmB,GAAA,EAAK,OAAA,EAAS,MAAM,CAAA;AAAA,IACvD,cAAA,EAAgB,kBAAA,CAAmB,GAAA,EAAK,MAAM,CAAA;AAAA,IAC9C,aAAA,EAAe,iBAAA,CAAkB,GAAA,EAAK,MAAM;AAAA,GAC9C;AAGA,EAAA,IAAI,MAAA,CAAO,KAAK,OAAA,EAAS;AACvB,IAAA,KAAA,CAAM,QAAA,GAAW,aAAA,CAAc,GAAA,EAAK,MAAA,EAAQ,UAAU,CAAA;AACtD,IAAA,KAAA,CAAM,UAAA,GAAa,eAAA,CAAgB,GAAA,EAAK,MAAA,EAAQ,UAAU,CAAA;AAC1D,IAAA,KAAA,CAAM,WAAA,GAAc,gBAAA,CAAiB,GAAA,EAAK,MAAA,EAAQ,UAAU,CAAA;AAAA,EAC9D;AAEA,EAAA,OAAO,KAAA;AACT;AC9FA,IAAMV,KAAAA,GAAM,mBAAmB,eAAe,CAAA;AAOvC,IAAM,eAAN,MAAmB;AAAA,EAChB,KAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EAER,YAAY,UAAA,EAAoB;AAC9B,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,gBAAgB,YAAA,CAAa,SAAA;AAClC,IAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,MACX,YAAA,EAAc,IAAA;AAAA,MACd,SAAA,EAAW,OAAO,UAAA,EAAW;AAAA,MAC7B,UAAA;AAAA,MACA,SAAS;AAAC,KACZ;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAIG,UAAAA,CAAW,IAAA,CAAK,aAAa,CAAA,EAAG;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,OAAA,GAAU,MAAMC,QAAAA,CAAS,IAAA,CAAK,eAAe,OAAO,CAAA;AAC1D,QAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAErC,QAAA,IAAI,UAAA,CAAW,UAAA,KAAe,IAAA,CAAK,UAAA,EAAY;AAC7C,UAAA,IAAA,CAAK,KAAA,GAAQ;AAAA,YACX,GAAG,UAAA;AAAA,YACH,SAAA,EAAW,OAAO,UAAA;AAAW,WAC/B;AAAA,QACF;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,eAAA,CACJ,WAAA,EACA,IAAA,EACe;AACf,IAAA,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,EAAE,WAAA,EAAa,GAAG,IAAA,EAAK;AACjD,IAAA,IAAA,CAAK,eAAA,CAAgB,WAAA,EAAa,IAAA,CAAK,MAAM,CAAA;AAC7C,IAAA,MAAM,KAAK,SAAA,EAAU;AAAA,EACvB;AAAA,EAEA,MAAM,iBAAA,CAAkB,WAAA,EAAqB,MAAA,EAA+B;AAC1E,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,YAAA,EAAc,WAAA,KAAgB,WAAA,EAAa;AACxD,MAAA,IAAA,CAAK,KAAA,CAAM,aAAa,MAAA,GAAS,MAAA;AACjC,MAAA,IAAI,MAAA,CAAO,WAAA,EAAY,KAAM,MAAA,EAAQ;AACnC,QAAA,IAAA,CAAK,MAAM,YAAA,CAAa,WAAA,GAAA,iBAAc,IAAI,IAAA,IAAO,WAAA,EAAY;AAAA,MAC/D;AAAA,IACF;AACA,IAAA,IAAA,CAAK,eAAA,CAAgB,aAAa,MAAM,CAAA;AACxC,IAAA,MAAM,KAAK,SAAA,EAAU;AAAA,EACvB;AAAA,EAEA,MAAM,gBAAgB,IAAA,EAAoC;AACxD,IAAA,IAAI,IAAA,CAAK,MAAM,YAAA,EAAc;AAC3B,MAAA,IAAA,CAAK,KAAA,CAAM,aAAa,IAAA,GAAO,IAAA;AAC/B,MAAA,MAAM,KAAK,SAAA,EAAU;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,eAAA,GAAuC;AACrC,IAAA,OAAO,KAAK,KAAA,CAAM,YAAA;AAAA,EACpB;AAAA,EAEA,MAAM,sBAAA,GAAiD;AACrD,IAAA,IAAI,CAAC,IAAA,CAAK,KAAA,CAAM,YAAA,EAAc,OAAO,IAAA;AAErC,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,CAAM,YAAA;AACzB,IAAA,MAAM,aAAA,GAAgB,KAAK,KAAA,CAAM,OAAA,CAC9B,MAAM,EAAE,CAAA,CACR,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,GAAA,EAAM,EAAE,WAAW,CAAA,EAAA,EAAK,EAAE,MAAM,CAAA,IAAA,EAAO,EAAE,SAAS,CAAA,CAAE,CAAA,CAC/D,IAAA,CAAK,IAAI,CAAA;AAEZ,IAAA,OAAO,CAAA,gBAAA,EAAmB,MAAM,WAAW;AAAA,OAAA,EAAY,MAAM,KAAK;AAAA,QAAA,EAAa,MAAM,MAAM;AAAA,SAAA,EAAc,MAAM,SAAS;AAAA,EAAK,MAAM,WAAA,GAAc,CAAA,WAAA,EAAc,KAAA,CAAM,WAAW,KAAK,EAAE;;AAAA;AAAA,EAAyB,aAAa,CAAA,CAAA;AAAA,EAC/N;AAAA,EAEA,YAAA,GAAuB;AACrB,IAAA,OAAO,KAAK,KAAA,CAAM,SAAA;AAAA,EACpB;AAAA,EAEA,UAAA,GAA2C;AACzC,IAAA,OAAO,KAAK,KAAA,CAAM,OAAA;AAAA,EACpB;AAAA,EAEA,eAAA,GAAyC;AACvC,IAAA,OAAO,IAAA,CAAK,MAAM,YAAA,IAAgB,IAAA;AAAA,EACpC;AAAA,EAEA,MAAM,gBAAgB,KAAA,EAAsC;AAC1D,IAAA,IAAA,CAAK,MAAM,YAAA,GAAe,KAAA;AAC1B,IAAA,MAAM,KAAK,SAAA,EAAU;AAAA,EACvB;AAAA,EAEA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAA,CAAK,MAAM,YAAA,GAAe,MAAA;AAC1B,IAAA,MAAM,KAAK,SAAA,EAAU;AAAA,EACvB;AAAA,EAEQ,eAAA,CAAgB,aAAqB,MAAA,EAAsB;AACjE,IAAA,IAAA,CAAK,KAAA,CAAM,QAAQ,IAAA,CAAK;AAAA,MACtB,WAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,KACnC,CAAA;AAED,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAA,GAAS,GAAA,EAAK;AACnC,MAAA,IAAA,CAAK,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAM,IAAI,CAAA;AAAA,IACpD;AAAA,EACF;AAAA,EAEA,MAAc,SAAA,GAA2B;AACvC,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAMG,OAAAA,CAAQ,IAAA,CAAK,aAAa,CAAA;AACtC,MAAA,IAAI,CAACJ,UAAAA,CAAW,GAAG,CAAA,EAAG;AACpB,QAAA,MAAMQ,KAAAA,CAAM,GAAA,EAAK,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,MACtC;AACA,MAAA,MAAMC,SAAAA,CAAU,IAAA,CAAK,aAAA,EAAe,IAAA,CAAK,SAAA,CAAU,KAAK,KAAA,EAAO,IAAA,EAAM,CAAC,CAAA,EAAG,OAAO,CAAA;AAAA,IAClF,SAAS,KAAA,EAAO;AACd,MAAAZ,KAAAA,CAAI,IAAA,CAAK,8BAAA,EAAgC,EAAE,OAAO,CAAA;AAAA,IACpD;AAAA,EACF;AACF,CAAA;AC3HO,IAAM,2BAA2BS,CAAAA,CAAE,IAAA,CAAK,CAAC,cAAA,EAAgB,KAAA,EAAO,MAAM,CAAC,CAAA;AAKvE,IAAM,kBAAA,GAAqBA,EAAE,MAAA,CAAO;AAAA,EACzC,MAAA,EAAQA,EAAE,MAAA,CAAO;AAAA,IACf,OAAA,EAASA,EAAE,OAAA,EAAQ;AAAA,IACnB,UAAA,EAAY,wBAAA,CAAyB,OAAA,CAAQ,cAAc,CAAA;AAAA,IAC3D,IAAA,EAAMA,EAAE,IAAA,CAAK,CAAC,SAAS,QAAA,EAAU,KAAA,EAAO,MAAM,CAAC;AAAA,GAChD,CAAA;AAAA,EACD,MAAA,EAAQA,EAAE,MAAA,CAAO;AAAA,IACf,OAAA,EAASA,EAAE,OAAA,EAAQ;AAAA,IACnB,UAAA,EAAY,wBAAA,CAAyB,OAAA,CAAQ,cAAc;AAAA,GAC5D,CAAA;AAAA,EACD,MAAA,EAAQA,EAAE,MAAA,CAAO;AAAA,IACf,OAAA,EAASA,EAAE,OAAA,EAAQ;AAAA,IACnB,UAAA,EAAYA,EAAE,IAAA,CAAK,CAAC,eAAe,UAAA,EAAY,KAAA,EAAO,MAAM,CAAC;AAAA,GAC9D,CAAA;AAAA,EACD,aAAA,EAAeA,EAAE,MAAA,CAAO;AAAA,IACtB,OAAA,EAASA,EAAE,OAAA,EAAQ;AAAA,IACnB,IAAA,EAAMA,CAAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,OAAO,UAAA,EAAY,UAAA,EAAY,YAAA,EAAc,MAAM,CAAC,CAAA;AAAA,IAC1E,eAAeA,CAAAA,CAAE,KAAA,CAAMA,EAAE,MAAA,EAAQ,EAAE,QAAA;AAAS,GAC7C;AACH,CAAC,CAAA;AASM,IAAM,cAAA,GAAiBA,EAAE,IAAA,CAAK,CAAC,YAAY,OAAA,EAAS,WAAA,EAAa,IAAA,EAAM,OAAO,CAAC,CAAA;AAK/E,IAAM,iBAAA,GAAoBA,EAAE,MAAA,CAAO;AAAA,EACxC,SAAS,cAAA,CAAe,OAAA,CAAQ,OAAO,CAAA,CAAE,SAAS,yBAAyB,CAAA;AAAA,EAC3E,aAAA,EAAeA,EAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA,CAAE,SAAS,iCAAiC,CAAA;AAAA,EACnF,OAAA,EAASA,CAAAA,CACN,KAAA,CAAM,cAAc,EACpB,OAAA,CAAQ,CAAC,UAAA,EAAY,OAAA,EAAS,aAAa,IAAA,EAAM,OAAO,CAAC,CAAA,CACzD,SAAS,wBAAwB;AACtC,CAAC,CAAA;AASM,IAAM,sBAAsBA,CAAAA,CAAE,IAAA,CAAK,CAAC,SAAA,EAAW,WAAW,CAAC,CAAA;AAK3D,IAAM,kBAAA,GAAqBA,EAAE,MAAA,CAAO;AAAA,EACzC,SAAS,mBAAA,CAAoB,OAAA,CAAQ,WAAW,CAAA,CAAE,SAAS,qBAAqB,CAAA;AAAA,EAChF,aAAA,EAAeA,CAAAA,CACZ,MAAA,EAAO,CACP,GAAA,EAAI,CACJ,QAAA,EAAS,CACT,OAAA,CAAQ,KAAK,CAAA,CACb,QAAA,CAAS,yCAAyC;AACvD,CAAC,CAAA;AASM,IAAM,kBAAA,GAAqBA,EAAE,IAAA,CAAK,CAAC,WAAW,OAAA,EAAS,aAAA,EAAe,WAAA,EAAa,MAAM,CAAC,CAAA;AAK1F,IAAM,kBAAA,GAAqBA,EAAE,MAAA,CAAO;AAAA,EACzC,KAAA,EAAOA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,uCAAuC,CAAA;AAAA,EAClE,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,wBAAwB,CAAA;AAAA,EAClD,SAASA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,0CAA0C,CAAA;AAAA,EAClF,QAAA,EAAUA,CAAAA,CACP,KAAA,CAAM,kBAAkB,EACxB,OAAA,CAAQ,CAAC,SAAA,EAAW,OAAA,EAAS,eAAe,WAAA,EAAa,MAAM,CAAC,CAAA,CAChE,SAAS,4BAA4B;AAC1C,CAAC,CAAA;AASM,IAAM,qBAAqBA,CAAAA,CAAE,IAAA,CAAK,CAAC,QAAA,EAAU,OAAA,EAAS,SAAS,CAAC,CAAA;AAKhE,IAAM,2BAAA,GAA8BA,EAAE,MAAA,CAAO;AAAA,EAClD,OAAA,EAASA,EAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA,CAAE,SAAS,yBAAyB,CAAA;AAAA,EACtE,aAAA,EAAeA,CAAAA,CACZ,MAAA,EAAO,CACP,IAAI,CAAC,CAAA,CACL,GAAA,CAAI,GAAG,CAAA,CACP,OAAA,CAAQ,EAAE,CAAA,CACV,SAAS,yCAAyC;AACvD,CAAC,CAAA;AAKM,IAAM,eAAA,GAAkBA,EAAE,MAAA,CAAO;AAAA,EACtC,OAAA,EAASA,EAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA,CAAE,SAAS,8BAA8B,CAAA;AAAA,EAC1E,WAAW,kBAAA,CAAmB,OAAA,CAAQ,OAAO,CAAA,CAAE,SAAS,wBAAwB,CAAA;AAAA,EAChF,gBAAgBA,CAAAA,CACb,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAChB,OAAA,CAAQ,CAAC,YAAA,EAAc,UAAU,MAAA,EAAQ,QAAA,EAAU,OAAO,CAAC,CAAA,CAC3D,SAAS,sCAAsC,CAAA;AAAA,EAClD,eAAA,EAAiB,4BAA4B,OAAA,CAAQ;AAAA,IACnD,OAAA,EAAS,KAAA;AAAA,IACT,aAAA,EAAe;AAAA,GAChB,CAAA;AAAA;AAAA,EAED,iBAAA,EAAmBA,EAChB,OAAA,EAAQ,CACR,QAAQ,IAAI,CAAA,CACZ,SAAS,kDAAkD,CAAA;AAAA,EAC9D,cAAcA,CAAAA,CACX,MAAA,EAAO,CACP,GAAA,GACA,GAAA,CAAI,CAAC,CAAA,CACL,GAAA,CAAI,CAAC,CAAA,CACL,OAAA,CAAQ,CAAC,CAAA,CACT,SAAS,6CAA6C,CAAA;AAAA,EACzD,mBAAA,EAAqBA,EAClB,OAAA,EAAQ,CACR,QAAQ,IAAI,CAAA,CACZ,SAAS,uDAAuD;AACrE,CAAC,CAAA;AASM,IAAM,yBAAA,GAA4BA,EAAE,MAAA,CAAO;AAAA,EAChD,OAAA,EAASA,EAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA,CAAE,SAAS,gCAAgC,CAAA;AAAA,EAC7E,UAAA,EAAYA,EAAE,MAAA,EAAO,CAAE,QAAQ,kBAAkB,CAAA,CAAE,SAAS,kCAAkC;AAChG,CAAC,CAAA;AASM,IAAM,oBAAoBA,CAAAA,CAAE,IAAA,CAAK,CAAC,UAAA,EAAY,WAAW,CAAC,CAAA;AAK1D,IAAM,eAAA,GAAkBA,EAAE,MAAA,CAAO;AAAA,EACtC,UAAU,iBAAA,CAAkB,OAAA,CAAQ,UAAU,CAAA,CAAE,SAAS,oBAAoB,CAAA;AAAA,EAC7E,YAAA,EAAcA,EACX,OAAA,EAAQ,CACR,QAAQ,IAAI,CAAA,CACZ,SAAS,mDAAmD,CAAA;AAAA,EAC/D,SAAA,EAAWA,EAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA,CAAE,SAAS,wCAAwC;AACzF,CAAC,CAAA;AASM,IAAM,cAAA,GAAiBA,EAAE,MAAA,CAAO;AAAA,EACrC,gBAAA,EAAkBA,EACf,OAAA,EAAQ,CACR,QAAQ,KAAK,CAAA,CACb,SAAS,uDAAuD,CAAA;AAAA,EACnE,QAAA,EAAUA,EAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA,CAAE,SAAS,8CAA8C,CAAA;AAAA,EAC3F,WAAA,EAAaA,EAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA,CAAE,SAAS,gDAAgD,CAAA;AAAA,EAChG,iBAAA,EAAmBA,EAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA,CAAE,SAAS,uCAAuC,CAAA;AAAA,EAC7F,OAAA,EAASA,EAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA,CAAE,SAAS,0CAA0C,CAAA;AAAA,EACvF,aAAA,EAAeA,EAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA,CAAE,SAAS,2BAA2B,CAAA;AAAA,EAC7E,QAAA,EAAUA,EAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA,CAAE,SAAS,wCAAwC;AACvF,CAAC,CAAA;AAKM,IAAM,UAAA,GAAaA,EAAE,MAAA,CAAO;AAAA,EACjC,QAAA,EAAUA,EAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA,CAAE,SAAS,oCAAoC,CAAA;AAAA,EACjF,GAAA,EAAKA,EAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA,CAAE,SAAS,oBAAoB,CAAA;AAAA,EAC5D,OAAA,EAASA,EAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI,CAAA,CAAE,SAAS,0BAA0B,CAAA;AAAA,EACtE,OAAA,EAASA,EAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA,CAAE,SAAS,+BAA+B;AAC9E,CAAC,CAAA;AASM,IAAM,sBAAA,GAAyBA,EAAE,MAAA,CAAO;AAAA,EAC7C,cAAcA,CAAAA,CAAE,IAAA,CAAK,CAAC,YAAA,EAAc,YAAY,CAAC,CAAA;AAAA,EACjD,gBAAA,EAAkBA,EAAE,OAAA,EAAQ;AAAA,EAC5B,kBAAA,EAAoBA,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,GAAM,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,EAAE,CAAA;AAAA,EAClD,KAAA,EAAOA,EACJ,MAAA,CAAO;AAAA,IACN,KAAKA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA,EAAS;AAAA,IACpC,cAAcA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,GAAW,QAAA;AAAS,GAC9C,EACA,QAAA;AACL,CAAC,CAAA;AAKM,IAAM,oBAAA,GAAuBA,EAAE,MAAA,CAAO;AAAA,EAC3C,UAAA,EAAYA,EAAE,OAAA,EAAQ;AAAA,EACtB,UAAA,EAAYA,EAAE,OAAA,EAAQ;AAAA,EACtB,iBAAA,EAAmBA,EAAE,OAAA,EAAQ;AAAA,EAC7B,aAAA,EAAeA,EAAE,OAAA,EAAQ;AAAA,EACzB,cAAA,EAAgBA,EAAE,OAAA,EAAQ;AAAA,EAC1B,cAAA,EAAgBA,EAAE,OAAA,EAAQ;AAAA,EAC1B,QAAA,EAAUA,EAAE,OAAA,EAAQ;AAAA,EACpB,iBAAA,EAAmBA,CAAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,KAAK,CAAA;AAAA,EAC5C,QAAA,EAAUA,CAAAA,CAAE,OAAA,EAAQ,CAAE,QAAQ,IAAI;AACpC,CAAC,CAAA;AAKM,IAAM,gBAAA,GAAmBA,EAAE,MAAA,CAAO;AAAA,EACvC,QAAA,EAAUA,EAAE,OAAA,EAAQ;AAAA,EACpB,GAAA,EAAKA,EAAE,OAAA,EAAQ;AAAA,EACf,OAAA,EAASA,EAAE,OAAA;AACb,CAAC,CAAA;AAKM,IAAM,iBAAA,GAAoBA,EAAE,IAAA,CAAK,CAAC,aAAa,QAAA,EAAU,QAAA,EAAU,gBAAgB,CAAC,CAAA;AAKpF,IAAM,kBAAA,GAAqBA,EAAE,MAAA,CAAO;AAAA,EACzC,gBAAA,EAAkBA,CAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,EACvC,cAAA,EAAgB,kBAAkB,QAAA;AACpC,CAAC,CAAA;AAKM,IAAM,mBAAA,GAAsBA,EAAE,MAAA,CAAO;AAAA,EAC1C,gBAAA,EAAkBA,CAAAA,CAAE,KAAA,CAAM,iBAAiB,CAAA;AAAA,EAC3C,mBAAA,EAAqBA,EAAE,MAAA,CAAO;AAAA,IAC5B,MAAA,EAAQA,CAAAA,CAAE,KAAA,CAAM,iBAAiB,EAAE,QAAA,EAAS;AAAA,IAC5C,GAAA,EAAKA,CAAAA,CAAE,KAAA,CAAM,iBAAiB,EAAE,QAAA,EAAS;AAAA,IACzC,MAAA,EAAQA,CAAAA,CAAE,KAAA,CAAM,iBAAiB,EAAE,QAAA;AAAS,GAC7C,CAAA;AAAA,EACD,cAAA,EAAgBA,EAAE,MAAA,CAAO;AAAA,IACvB,MAAA,EAAQ,mBAAmB,QAAA,EAAS;AAAA,IACpC,MAAA,EAAQ,mBAAmB,QAAA,EAAS;AAAA,IACpC,SAAA,EAAW,mBAAmB,QAAA,EAAS;AAAA,IACvC,QAAA,EAAU,mBAAmB,QAAA,EAAS;AAAA,IACtC,cAAA,EAAgB,mBAAmB,QAAA,EAAS;AAAA,IAC5C,gBAAA,EAAkB,mBAAmB,QAAA;AAAS,GAC/C,CAAA;AAAA,EACD,gBAAA,EAAkBA,EAAE,MAAA,CAAO;AAAA,IACzB,YAAA,EAAcA,EAAE,OAAA,EAAQ;AAAA,IACxB,aAAA,EAAeA,CAAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,IAC/B,iBAAA,EAAmBA,EAAE,OAAA;AAAQ,GAC9B,CAAA;AAAA;AAAA,EAED,eAAA,EAAiBA,EACd,MAAA,EAAO,CACP,QAAQ,wBAAwB,CAAA,CAChC,SAAS,+DAA+D;AAC7E,CAAC,CAAA;AAKM,IAAM,mBAAA,GAAsBA,EAAE,IAAA,CAAK,CAAC,OAAO,KAAA,EAAO,QAAA,EAAU,MAAM,CAAC,CAAA;AAKnE,IAAM,mBAAA,GAAsBA,EAAE,MAAA,CAAO;AAAA,EAC1C,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,EAC/C,aAAA,EAAe,oBAAoB,QAAA;AACrC,CAAC,CAAA;AAKM,IAAM,2BAAA,GAA8BA,EAAE,MAAA,CAAO;AAAA,EAClD,EAAA,EAAIA,EAAE,MAAA,EAAO;AAAA,EACb,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,EACf,QAAA,EAAUA,EAAE,IAAA,CAAK,CAAC,aAAa,QAAA,EAAU,QAAA,EAAU,gBAAgB,CAAC,CAAA;AAAA,EACpE,WAAA,EAAaA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EACjC,YAAA,EAAcA,EACX,MAAA,CAAO;AAAA,IACN,QAAA,EAAUA,CAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA,EAAS;AAAA,IAC/B,aAAA,EAAeA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,IACnC,mBAAA,EAAqBA,CAAAA,CAAE,OAAA,EAAQ,CAAE,QAAA;AAAS,GAC3C,EACA,QAAA;AACL,CAAC,CAAA;AAKM,IAAM,mBAAA,GAAsBA,EAAE,KAAA,CAAM;AAAA,EACzCA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,CAAS,oEAAoE,CAAA;AAAA,EACxFA,CAAAA,CAAE,OAAA,CAAQ,SAAS,CAAA,CAAE,SAAS,2BAA2B;AAC3D,CAAC,CAAA;AAKiCA,EAAE,IAAA,CAAK;AAAA;AAAA,EAEvC,KAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA;AAAA,EAEA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA;AAAA,EACA,eAAA;AAAA;AAAA,EAEA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,oBAAA;AAAA;AAAA,EAEA,OAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA;AAAA,EAEA,UAAA;AAAA,EACA,IAAA;AAAA,EACA;AACF,CAAC;AAMM,IAAM,oBAAA,GAAuBA,EAAE,MAAA,CAAO;AAAA;AAAA,EAE3C,GAAA,EAAK,mBAAA,CAAoB,QAAA,EAAS,CAAE,SAAS,+BAA+B,CAAA;AAAA,EAC5E,KAAA,EAAO,mBAAA,CAAoB,QAAA,EAAS,CAAE,SAAS,iCAAiC,CAAA;AAAA,EAChF,MAAA,EAAQ,mBAAA,CAAoB,QAAA,EAAS,CAAE,SAAS,iCAAiC,CAAA;AAAA,EACjF,QAAA,EAAU,mBAAA,CAAoB,QAAA,EAAS,CAAE,SAAS,6BAA6B,CAAA;AAAA;AAAA,EAG/E,SAAA,EAAW,mBAAA,CAAoB,QAAA,EAAS,CAAE,QAAA;AAAA,IACxC;AAAA,GACF;AAAA,EACA,QAAA,EAAU,mBAAA,CAAoB,QAAA,EAAS,CAAE,SAAS,iCAAiC,CAAA;AAAA,EACnF,GAAA,EAAK,mBAAA,CAAoB,QAAA,EAAS,CAAE,SAAS,mCAAmC,CAAA;AAAA,EAChF,eAAA,EAAiB,mBAAA,CAAoB,QAAA,EAAS,CAAE,QAAA;AAAA,IAC9C;AAAA,GACF;AAAA;AAAA,EAGA,SAAA,EAAW,mBAAA,CAAoB,QAAA,EAAS,CAAE,SAAS,2BAA2B,CAAA;AAAA,EAC9E,GAAA,EAAK,mBAAA,CAAoB,QAAA,EAAS,CAAE,SAAS,8BAA8B,CAAA;AAAA,EAC3E,oBAAA,EAAsB,mBAAA,CAAoB,QAAA,EAAS,CAAE,QAAA;AAAA,IACnD;AAAA,GACF;AAAA;AAAA,EAGA,KAAA,EAAO,mBAAA,CAAoB,QAAA,EAAS,CAAE,SAAS,sCAAsC,CAAA;AAAA,EACrF,EAAA,EAAI,mBAAA,CAAoB,QAAA,EAAS,CAAE,SAAS,oBAAoB,CAAA;AAAA,EAChE,OAAA,EAAS,mBAAA,CAAoB,QAAA,EAAS,CAAE,SAAS,kCAAkC,CAAA;AAAA;AAAA,EAGnF,QAAA,EAAU,mBAAA,CAAoB,QAAA,EAAS,CAAE,SAAS,+BAA+B,CAAA;AAAA,EACjF,EAAA,EAAI,mBAAA,CAAoB,QAAA,EAAS,CAAE,SAAS,2BAA2B,CAAA;AAAA,EACvE,QAAA,EAAU,mBAAA,CAAoB,QAAA,EAAS,CAAE,SAAS,kCAAkC;AACtF,CAAC,CAAA;AAKM,IAAM,YAAA,GAAeA,EAAE,MAAA,CAAO;AAAA,EACnC,MAAA,EAAQA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,mCAAmC,CAAA;AAAA,EAC/D,MAAA,EAAQA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,qCAAqC,CAAA;AAAA,EACjE,SAAA,EAAWA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,wCAAwC,CAAA;AAAA,EACvE,UAAUA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,uBAAuB,CAAA;AAAA,EAChE,gBAAgBA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,0CAA0C,CAAA;AAAA,EACzF,kBAAkBA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,gCAAgC,CAAA;AAAA;AAAA,EAEjF,SAAA,EAAW,oBAAA,CAAqB,QAAA,EAAS,CAAE,SAAS,8BAA8B,CAAA;AAAA,EAClF,QAAA,EAAUA,EACP,MAAA,CAAO;AAAA,IACN,MAAA,EAAQ,oBAAoB,QAAA,EAAS;AAAA,IACrC,MAAA,EAAQ,oBAAoB,QAAA,EAAS;AAAA,IACrC,SAAA,EAAW,oBAAoB,QAAA,EAAS;AAAA,IACxC,QAAA,EAAU,oBAAoB,QAAA,EAAS;AAAA,IACvC,cAAA,EAAgB,oBAAoB,QAAA,EAAS;AAAA,IAC7C,gBAAA,EAAkB,oBAAoB,QAAA,EAAS;AAAA,IAC/C,SAAA,EAAWA,EAAE,MAAA,CAAOA,CAAAA,CAAE,QAAO,EAAG,mBAAmB,EAAE,QAAA;AAAS,GAC/D,EACA,QAAA,EAAS;AAAA,EACZ,MAAA,EAAQA,CAAAA,CAAE,KAAA,CAAM,2BAA2B,EAAE,QAAA;AAC/C,CAAC,CAAA;AAUM,IAAM,gBAAA,GAAmBA,EAAE,MAAA,CAAO;AAAA,EACvC,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,OAAA,EAASA,EAAE,MAAA,EAAO;AAAA,EAClB,aAAA,EAAe,kBAAA;AAAA,EACf,MAAA,EAAQ,YAAA;AAAA;AAAA,EAER,KAAA,EAAO,kBAAkB,QAAA,EAAS;AAAA,EAClC,MAAA,EAAQ,mBAAmB,QAAA,EAAS;AAAA;AAAA,EAEpC,MAAA,EAAQ,mBAAmB,QAAA,EAAS;AAAA,EACpC,GAAA,EAAK,gBAAgB,QAAA,EAAS;AAAA,EAC9B,aAAA,EAAe,0BAA0B,QAAA,EAAS;AAAA,EAClD,GAAA,EAAK,gBAAgB,QAAA,EAAS;AAAA;AAAA,EAE9B,IAAA,EAAM,uBAAuB,QAAA,EAAS;AAAA;AAAA,EAEtC,UAAUA,CAAAA,CAAE,KAAA,CAAM,CAAC,cAAA,EAAgB,oBAAoB,CAAC,CAAA;AAAA,EACxD,MAAMA,CAAAA,CAAE,KAAA,CAAM,CAAC,UAAA,EAAY,gBAAgB,CAAC,CAAA;AAAA,EAC5C,OAAA,EAAS;AACX,CAAC,CAAA;AAciCA,EAAE,MAAA,CAAO;AAAA,EACzC,WAAA,EAAaA,CAAAA,CACV,MAAA,EAAO,CACP,GAAA,EAAI,CACJ,QAAA,EAAS,CACT,QAAA,EAAS,CACT,QAAA,CAAS,iFAAiF;AAC/F,CAAC;AAK0CA,EAAE,MAAA,CAAO;AAAA,EAClD,WAAA,EAAaA,EAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,qBAAqB,CAAA;AAAA,EACvE,MAAA,EAAQA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,kEAAkE;AAChG,CAAC;AAKmCA,EAAE,MAAA,CAAO;AAAA,EAC3C,QAAQA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,8BAA8B,CAAA;AAAA,EACrE,KAAA,EAAOA,CAAAA,CAAE,MAAA,EAAO,CAAE,KAAI,CAAE,QAAA,EAAS,CAAE,QAAA,EAAS,CAAE,OAAA,CAAQ,EAAE,CAAA,CAAE,SAAS,sBAAsB;AAC3F,CAAC;AAKmCA,CAAAA,CAAE,MAAA,CAAO,EAAE;AAKbA,EAAE,MAAA,CAAO;AAAA,EACzC,YAAA,EAAcA,EAAE,KAAA,CAAMA,CAAAA,CAAE,QAAQ,CAAA,CAAE,SAAS,iDAAiD,CAAA;AAAA,EAC5F,aAAA,EAAeA,CAAAA,CAAE,MAAA,EAAO,CAAE,KAAI,CAAE,GAAA,CAAI,CAAC,CAAA,CAAE,IAAI,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,QAAQ,CAAC;AACpE,CAAC;AAK+BA,EAAE,MAAA,CAAO;AAAA,EACvC,MAAA,EAAQA,CAAAA,CAAE,IAAA,CAAK,CAAC,KAAA,EAAO,OAAO,OAAO,CAAC,CAAA,CAAE,QAAA,CAAS,iCAAiC,CAAA;AAAA,EAClF,KAAKA,CAAAA,CACF,MAAA,GACA,QAAA,EAAS,CACT,SAAS,iEAAiE,CAAA;AAAA,EAC7E,OAAOA,CAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,iCAAiC;AAC1E,CAAC;;;AC/fD,IAAMT,KAAAA,GAAM,mBAAmB,eAAe,CAAA;AAa9C,eAAsB,eAAe,UAAA,EAAyC;AAE5E,EAAA,MAAM,eAAA,GAAkBE,IAAAA,CAAK,UAAA,EAAY,WAAA,EAAa,WAAW,CAAA;AACjE,EAAA,MAAM,WAAA,GAAc,MAAM,cAAA,CAAe,eAAe,CAAA;AAGxD,EAAA,MAAM,YAAA,GAAe,MAAM,cAAA,CAAe,YAAA,CAAa,gBAAgB,CAAA;AAGvE,EAAA,MAAM,MAAA,GAAS,YAAA,CAAa,gBAAA,EAAiB,EAAG,cAAc,WAAW,CAAA;AAGzE,EAAA,OAAO,eAAe,MAAM,CAAA;AAC9B;AAKA,eAAe,eAAe,QAAA,EAAuD;AACnF,EAAA,IAAI,CAACC,UAAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAMC,QAAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAChD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAIjC,IAAA,OAAO,qBAAA,CAAsB,QAAQ,QAAQ,CAAA;AAAA,EAC/C,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAiB,WAAA,EAAa;AAChC,MAAAJ,KAAAA,CAAI,KAAK,6BAAA,EAA+B,EAAE,UAAU,OAAA,EAAS,KAAA,CAAM,SAAS,CAAA;AAAA,IAC9E,CAAA,MAAO;AACL,MAAAA,MAAI,IAAA,CAAK,4BAAA,EAA8B,EAAE,QAAA,EAAU,OAAO,CAAA;AAAA,IAC5D;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKA,SAAS,qBAAA,CAAsB,QAAiB,QAAA,EAA8C;AAC5F,EAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,IAAA,EAAM;AACjD,IAAAA,KAAAA,CAAI,IAAA,CAAK,+BAAA,EAAiC,EAAE,UAAU,CAAA;AACtD,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAA8B,EAAC;AACrC,EAAA,MAAM,SAAA,GAAY,MAAA;AAGlB,EAAA,IAAI,SAAA,IAAa,SAAA,IAAa,OAAO,SAAA,CAAU,YAAY,QAAA,EAAU;AACnE,IAAA,MAAA,CAAO,UAAU,SAAA,CAAU,OAAA;AAAA,EAC7B;AAEA,EAAA,IAAI,SAAA,IAAa,SAAA,IAAa,OAAO,SAAA,CAAU,YAAY,QAAA,EAAU;AACnE,IAAA,MAAA,CAAO,UAAU,SAAA,CAAU,OAAA;AAAA,EAC7B;AAGA,EAAA,IAAI,eAAA,IAAmB,SAAA,IAAa,OAAO,SAAA,CAAU,kBAAkB,QAAA,EAAU;AAC/E,IAAA,MAAM,OAAO,SAAA,CAAU,aAAA;AACvB,IAAA,MAAA,CAAO,gBAAgB,EAAC;AAExB,IAAA,IAAI,IAAA,CAAK,MAAA,IAAU,OAAO,IAAA,CAAK,WAAW,QAAA,EAAU;AAClD,MAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,MAAA,MAAM,aAAa,WAAA,CAAY,MAAA,CAAO,IAAI,CAAA,GAAI,OAAO,IAAA,GAAO,MAAA;AAC5D,MAAA,MAAA,CAAO,cAAc,MAAA,GAAS;AAAA,QAC5B,SAAS,OAAO,MAAA,CAAO,OAAA,KAAY,SAAA,GAAY,OAAO,OAAA,GAAU,KAAA;AAAA,QAChE,UAAA,EAAY,oBAAoB,MAAA,CAAO,UAAU,IAC7C,MAAA,CAAO,UAAA,GACP,UAAA,KAAe,MAAA,GACb,cAAA,GACA,MAAA;AAAA,QACN,IAAA,EAAM;AAAA,OACR;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,IAAU,OAAO,IAAA,CAAK,WAAW,QAAA,EAAU;AAClD,MAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,MAAA,MAAA,CAAO,cAAc,MAAA,GAAS;AAAA,QAC5B,SAAS,OAAO,MAAA,CAAO,OAAA,KAAY,SAAA,GAAY,OAAO,OAAA,GAAU,KAAA;AAAA,QAChE,UAAA,EAAY,oBAAoB,MAAA,CAAO,UAAU,IAC7C,MAAA,CAAO,UAAA,GACP,MAAA,CAAO,OAAA,GACL,cAAA,GACA;AAAA,OACR;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,IAAU,OAAO,IAAA,CAAK,WAAW,QAAA,EAAU;AAClD,MAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,MAAA,MAAA,CAAO,cAAc,MAAA,GAAS;AAAA,QAC5B,SAAS,OAAO,MAAA,CAAO,OAAA,KAAY,SAAA,GAAY,OAAO,OAAA,GAAU,KAAA;AAAA,QAChE,YAAY,iBAAA,CAAkB,MAAA,CAAO,UAAU,CAAA,GAAI,OAAO,UAAA,GAAa;AAAA,OACzE;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,aAAA,IAAiB,OAAO,IAAA,CAAK,kBAAkB,QAAA,EAAU;AAChE,MAAA,MAAM,UAAU,IAAA,CAAK,aAAA;AACrB,MAAA,MAAA,CAAO,cAAc,aAAA,GAAgB;AAAA,QACnC,SAAS,OAAO,OAAA,CAAQ,OAAA,KAAY,SAAA,GAAY,QAAQ,OAAA,GAAU,KAAA;AAAA,QAClE,MAAM,kBAAA,CAAmB,OAAA,CAAQ,IAAI,CAAA,GAAI,QAAQ,IAAA,GAAO,MAAA;AAAA,QACxD,aAAA,EAAe,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,aAAa,CAAA,GAC9C,OAAA,CAAQ,aAAA,CAAc,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,CAAA,KAAM,QAAQ,CAAA,GACtE;AAAA,OACN;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,QAAA,IAAY,SAAA,IAAa,OAAO,SAAA,CAAU,WAAW,QAAA,EAAU;AACjE,IAAA,MAAM,SAAS,SAAA,CAAU,MAAA;AACzB,IAAA,MAAA,CAAO,SAAS,EAAC;AAEjB,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAC,MAAA,CAAO,MAAA,CAA6C,MAAA,GAAS,MAAA,CAAO,MAAA;AAAA,IACvE;AAEA,IAAA,MAAM,cAAA,GAAiB;AAAA,MACrB,QAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA,gBAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,KAAA,MAAW,OAAO,cAAA,EAAgB;AAChC,MAAA,IAAI,OAAO,MAAA,IAAU,OAAO,MAAA,CAAO,GAAG,MAAM,QAAA,EAAU;AACpD,QAAC,MAAA,CAAO,MAAA,CAA6C,GAAG,CAAA,GAAI,OAAO,GAAG,CAAA;AAAA,MACxE;AAAA,IACF;AAEA,IAAA,IAAI,UAAA,IAAc,UAAU,OAAO,MAAA,CAAO,aAAa,QAAA,IAAY,MAAA,CAAO,aAAa,IAAA,EAAM;AAC3F,MAAA,MAAA,CAAO,MAAA,CAAO,QAAA,GAAW,qBAAA,CAAsB,MAAA,CAAO,QAAmC,CAAA;AAAA,IAC3F;AAEA,IAAA,IAAI,YAAY,MAAA,IAAU,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAA,EAAG;AACtD,MAAA,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,oBAAA,CAAqB,MAAA,CAAO,MAAM,CAAA;AAAA,IAC3D;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,IAAU,SAAA,IAAa,OAAO,SAAA,CAAU,SAAS,QAAA,EAAU;AAC7D,IAAA,MAAM,OAAO,SAAA,CAAU,IAAA;AACvB,IAAA,MAAM,aAAuD,EAAC;AAE9D,IAAA,IAAI,aAAa,IAAA,CAAK,YAAY,CAAA,IAAK,IAAA,CAAK,iBAAiB,aAAA,EAAe;AAC1E,MAAA,UAAA,CAAW,eAAe,IAAA,CAAK,YAAA;AAAA,IACjC;AACA,IAAA,IAAI,OAAO,IAAA,CAAK,gBAAA,KAAqB,SAAA,EAAW;AAC9C,MAAA,UAAA,CAAW,mBAAmB,IAAA,CAAK,gBAAA;AAAA,IACrC;AACA,IAAA,IAAI,OAAO,IAAA,CAAK,kBAAA,KAAuB,QAAA,EAAU;AAC/C,MAAA,UAAA,CAAW,kBAAA,GAAqB,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,kBAAkB,CAAC,CAAA;AAAA,IACnF;AAGA,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,SAAS,CAAA,EAAG;AACtC,MAAA,MAAA,CAAO,IAAA,GAAO,UAAA;AAAA,IAChB;AAAA,EACF;AAGA,EAAA,IAAI,QAAA,IAAY,SAAA,IAAa,OAAO,SAAA,CAAU,WAAW,QAAA,EAAU;AACjE,IAAA,MAAM,SAAS,SAAA,CAAU,MAAA;AACzB,IAAA,IAAI,OAAO,MAAA,CAAO,KAAA,KAAU,YAAY,OAAO,MAAA,CAAO,SAAS,QAAA,EAAU;AACvE,MAAA,MAAA,CAAO,MAAA,GAAS;AAAA,QACd,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,SAAS,OAAO,MAAA,CAAO,OAAA,KAAY,QAAA,GAAW,OAAO,OAAA,GAAU,MAAA;AAAA,QAC/D,QAAA,EAAU,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAA,GACnC,MAAA,CAAO,QAAA,GACP,CAAC,SAAA,EAAW,OAAA,EAAS,aAAA,EAAe,aAAa,MAAM;AAAA,OAC7D;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,KAAA,IAAS,SAAA,IAAa,OAAO,SAAA,CAAU,QAAQ,QAAA,EAAU;AAC3D,IAAA,MAAM,MAAM,SAAA,CAAU,GAAA;AACtB,IAAA,MAAA,CAAO,GAAA,GAAM;AAAA,MACX,SAAS,OAAO,GAAA,CAAI,OAAA,KAAY,SAAA,GAAY,IAAI,OAAA,GAAU,IAAA;AAAA,MAC1D,WAAW,mBAAA,CAAoB,GAAA,CAAI,SAAS,CAAA,GAAI,IAAI,SAAA,GAAY,OAAA;AAAA,MAChE,cAAA,EAAgB,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,GAC5C,GAAA,CAAI,cAAA,GACJ,CAAC,YAAA,EAAc,QAAA,EAAU,MAAM,CAAA;AAAA,MACnC,eAAA,EAAiB;AAAA,QACf,OAAA,EACE,OAAQ,GAAA,CAAI,eAAA,EAA6C,YAAY,SAAA,GAC/D,GAAA,CAAI,gBAA4C,OAAA,GAClD,KAAA;AAAA,QACN,aAAA,EACE,OAAQ,GAAA,CAAI,eAAA,EAA6C,kBAAkB,QAAA,GACrE,GAAA,CAAI,gBAA4C,aAAA,GAClD;AAAA;AACR,KACF;AAAA,EACF;AAGA,EAAA,IAAI,UAAA,IAAc,SAAA,IAAa,OAAO,SAAA,CAAU,aAAa,QAAA,EAAU;AACrE,IAAA,MAAM,WAAW,SAAA,CAAU,QAAA;AAG3B,IAAA,MAAM,gBAAgB,kBAAA,IAAsB,QAAA;AAE5C,IAAA,IAAI,aAAA,EAAe;AAEjB,MAAA,MAAM,cAAuC,EAAC;AAC9C,MAAA,KAAA,MAAW,GAAA,IAAO;AAAA,QAChB,kBAAA;AAAA,QACA,UAAA;AAAA,QACA,aAAA;AAAA,QACA,mBAAA;AAAA,QACA,SAAA;AAAA,QACA,eAAA;AAAA,QACA;AAAA,OACF,EAAG;AACD,QAAA,IAAI,OAAO,QAAA,IAAY,OAAO,QAAA,CAAS,GAAG,MAAM,SAAA,EAAW;AACzD,UAAA,WAAA,CAAY,GAAG,CAAA,GAAI,QAAA,CAAS,GAAG,CAAA;AAAA,QACjC;AAAA,MACF;AACA,MAAA,MAAA,CAAO,QAAA,GAAW,WAAA;AAAA,IACpB,CAAA,MAAO;AAEL,MAAA,MAAM,iBAA0C,EAAC;AACjD,MAAA,KAAA,MAAW,GAAA,IAAO;AAAA,QAChB,YAAA;AAAA,QACA,YAAA;AAAA,QACA,mBAAA;AAAA,QACA,eAAA;AAAA,QACA,gBAAA;AAAA,QACA,gBAAA;AAAA,QACA,UAAA;AAAA,QACA,mBAAA;AAAA,QACA;AAAA,OACF,EAAG;AACD,QAAA,IAAI,OAAO,QAAA,IAAY,OAAO,QAAA,CAAS,GAAG,MAAM,SAAA,EAAW;AACzD,UAAA,cAAA,CAAe,GAAG,CAAA,GAAI,QAAA,CAAS,GAAG,CAAA;AAAA,QACpC;AAAA,MACF;AACA,MAAA,MAAA,CAAO,QAAA,GAAW,cAAA;AAAA,IACpB;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,IAAU,SAAA,IAAa,OAAO,SAAA,CAAU,SAAS,QAAA,EAAU;AAC7D,IAAA,MAAM,OAAO,SAAA,CAAU,IAAA;AACvB,IAAA,MAAM,YAAqC,EAAC;AAG5C,IAAA,KAAA,MAAW,OAAO,CAAC,UAAA,EAAY,KAAA,EAAO,SAAA,EAAW,SAAS,CAAA,EAAG;AAC3D,MAAA,IAAI,OAAO,IAAA,IAAQ,OAAO,IAAA,CAAK,GAAG,MAAM,SAAA,EAAW;AACjD,QAAA,SAAA,CAAU,GAAG,CAAA,GAAI,IAAA,CAAK,GAAG,CAAA;AAAA,MAC3B;AAAA,IACF;AACA,IAAA,MAAA,CAAO,IAAA,GAAO,SAAA;AAAA,EAChB;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,YAAY,KAAA,EAA8D;AACjF,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,OAAA,EAAS,UAAU,KAAA,EAAO,MAAM,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA;AACvF;AAKA,SAAS,oBAAoB,KAAA,EAA0D;AACrF,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,CAAC,gBAAgB,KAAA,EAAO,MAAM,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA;AACpF;AAKA,SAAS,kBAAkB,KAAA,EAAsE;AAC/F,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,aAAA,EAAe,YAAY,KAAA,EAAO,MAAM,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA;AAC/F;AAKA,SAAS,mBACP,KAAA,EAC2E;AAC3E,EAAA,OACE,OAAO,KAAA,KAAU,QAAA,IACjB,CAAC,MAAA,EAAQ,KAAA,EAAO,UAAA,EAAY,UAAA,EAAY,YAAA,EAAc,MAAM,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA;AAEhF;AAKA,SAAS,aAAa,KAAA,EAAsE;AAC1F,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,CAAC,cAAc,aAAA,EAAe,YAAY,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA;AAChG;AAEA,SAAS,qBAAqB,KAAA,EAA4D;AACxF,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,KAAA,EAAO,OAAO,QAAA,EAAU,MAAM,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA;AACrF;AAKA,SAAS,oBAAoB,KAAA,EAAyD;AACpF,EAAA,OAAO,OAAO,UAAU,QAAA,IAAY,CAAC,UAAU,OAAA,EAAS,SAAS,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA;AACnF;AAEA,SAAS,gBACP,KAAA,EAC+D;AAC/D,EAAA,OACE,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,WAAA,EAAa,UAAU,QAAA,EAAU,gBAAgB,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA;AAEnG;AAEA,SAAS,sBAAsB,QAAA,EAAqD;AAClF,EAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,KAAa,IAAA,EAAM;AACrD,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAA2C,EAAC;AAClD,EAAA,MAAM,WAAA,GAAc,QAAA;AACpB,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,QAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC3B,IAAA,IAAI,GAAA,IAAO,WAAA,IAAe,OAAO,WAAA,CAAY,GAAG,MAAM,QAAA,IAAY,WAAA,CAAY,GAAG,CAAA,KAAM,IAAA,EAAM;AAC3F,MAAA,MAAM,YAAA,GAAe,YAAY,GAAG,CAAA;AACpC,MAAA,MAAM,YACJ,EAAC;AAEH,MAAA,IACE,OAAO,aAAa,WAAA,KAAgB,QAAA,IACpC,aAAa,WAAA,IAAe,CAAA,IAC5B,YAAA,CAAa,WAAA,IAAe,CAAA,EAC5B;AACA,QAAA,SAAA,CAAU,cAAc,YAAA,CAAa,WAAA;AAAA,MACvC;AAEA,MAAA,IAAI,oBAAA,CAAqB,YAAA,CAAa,aAAa,CAAA,EAAG;AACpD,QAAA,SAAA,CAAU,gBAAgB,YAAA,CAAa,aAAA;AAAA,MACzC;AAEA,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,CAAE,SAAS,CAAA,EAAG;AACrC,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,SAAA;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IACE,WAAA,IAAe,eACf,OAAO,WAAA,CAAY,cAAc,QAAA,IACjC,WAAA,CAAY,cAAc,IAAA,EAC1B;AACA,IAAA,MAAM,YAAY,WAAA,CAAY,SAAA;AAC9B,IAAA,MAAA,CAAO,YAAY,EAAC;AAEpB,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,aAAa,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AAChE,MAAA,IAAI,OAAO,aAAA,KAAkB,QAAA,IAAY,aAAA,KAAkB,IAAA,EAAM;AAC/D,QAAA,MAAM,EAAA,GAAK,aAAA;AACX,QAAA,MAAM,YAGF,EAAC;AAEL,QAAA,IAAI,OAAO,GAAG,WAAA,KAAgB,QAAA,IAAY,GAAG,WAAA,IAAe,CAAA,IAAK,EAAA,CAAG,WAAA,IAAe,CAAA,EAAG;AACpF,UAAA,SAAA,CAAU,cAAc,EAAA,CAAG,WAAA;AAAA,QAC7B;AAEA,QAAA,IAAI,oBAAA,CAAqB,EAAA,CAAG,aAAa,CAAA,EAAG;AAC1C,UAAA,SAAA,CAAU,gBAAgB,EAAA,CAAG,aAAA;AAAA,QAC/B;AAEA,QAAA,IAAI,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,CAAE,SAAS,CAAA,EAAG;AACrC,UAAA,MAAA,CAAO,SAAA,CAAU,OAAO,CAAA,GAAI,SAAA;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAO,IAAA,CAAK,MAAM,CAAA,CAAE,MAAA,GAAS,IAAI,MAAA,GAAS,MAAA;AACnD;AAEA,SAAS,sBACP,QAAA,EACkC;AAClC,EAAA,OAAO,sBAAsB,QAAQ,CAAA;AACvC;AAEA,SAAS,qBAAqB,MAAA,EAAmD;AAC/E,EAAA,MAAM,YAA4C,EAAC;AAEnD,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAEjD,IAAA,MAAM,CAAA,GAAI,KAAA;AACV,IAAA,IAAI,OAAO,CAAA,CAAE,EAAA,KAAO,QAAA,IAAY,OAAO,CAAA,CAAE,IAAA,KAAS,QAAA,IAAY,CAAC,eAAA,CAAgB,CAAA,CAAE,QAAQ,CAAA,EAAG;AAC1F,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAMF;AAAA,MACF,IAAI,CAAA,CAAE,EAAA;AAAA,MACN,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,UAAU,CAAA,CAAE;AAAA,KACd;AAEA,IAAA,IAAI,OAAO,CAAA,CAAE,WAAA,KAAgB,QAAA,EAAU;AACrC,MAAA,WAAA,CAAY,cAAc,CAAA,CAAE,WAAA;AAAA,IAC9B;AAEA,IAAA,IAAI,OAAO,CAAA,CAAE,YAAA,KAAiB,QAAA,IAAY,CAAA,CAAE,iBAAiB,IAAA,EAAM;AACjE,MAAA,MAAM,OAAO,CAAA,CAAE,YAAA;AACf,MAAA,WAAA,CAAY,eAAe,EAAC;AAE5B,MAAA,IAAI,OAAO,IAAA,CAAK,QAAA,KAAa,SAAA,EAAW;AACtC,QAAA,WAAA,CAAY,YAAA,CAAa,WAAW,IAAA,CAAK,QAAA;AAAA,MAC3C;AACA,MAAA,IAAI,OAAO,IAAA,CAAK,aAAA,KAAkB,QAAA,EAAU;AAC1C,QAAA,WAAA,CAAY,YAAA,CAAa,gBAAgB,IAAA,CAAK,aAAA;AAAA,MAChD;AACA,MAAA,IAAI,OAAO,IAAA,CAAK,mBAAA,KAAwB,SAAA,EAAW;AACjD,QAAA,WAAA,CAAY,YAAA,CAAa,sBAAsB,IAAA,CAAK,mBAAA;AAAA,MACtD;AAAA,IACF;AAEA,IAAA,SAAA,CAAU,KAAK,WAAW,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,SAAA,CAAU,MAAA,GAAS,CAAA,GAAI,SAAA,GAAY,MAAA;AAC5C;AAKA,SAAS,eAAe,MAAA,EAAgC;AACtD,EAAA,MAAM,MAAA,GAAS,gBAAA,CAAiB,SAAA,CAAU,MAAM,CAAA;AAEhD,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AAEnB,IAAAA,KAAAA,CAAI,KAAK,mCAAA,EAAqC;AAAA,MAC5C,QAAQ,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QACtC,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,QACrB,SAAS,CAAA,CAAE;AAAA,OACb,CAAE;AAAA,KACH,CAAA;AAID,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA,CAAO,IAAA;AAChB;AAKA,SAAS,gBAAA,GAA+B;AACtC,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,OAAA;AAAA,IACT,aAAA,EAAe;AAAA,MACb,QAAQ,EAAE,OAAA,EAAS,OAAO,UAAA,EAAY,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,MAC3D,MAAA,EAAQ,EAAE,OAAA,EAAS,KAAA,EAAO,YAAY,MAAA,EAAO;AAAA,MAC7C,MAAA,EAAQ,EAAE,OAAA,EAAS,KAAA,EAAO,YAAY,MAAA,EAAO;AAAA,MAC7C,aAAA,EAAe,EAAE,OAAA,EAAS,KAAA,EAAO,MAAM,MAAA;AAAO,KAChD;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ,2BAAA;AAAA,MACR,MAAA,EAAQ,2BAAA;AAAA,MACR,SAAA,EAAW;AAAA,KACb;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,YAAA,EAAc,YAAA;AAAA,MACd,gBAAA,EAAkB,KAAA;AAAA,MAClB,kBAAA,EAAoB;AAAA,KACtB;AAAA,IACA,QAAA,EAAU,EAAE,GAAG,QAAA,CAAS,QAAA,EAAS;AAAA,IACjC,IAAA,EAAM,EAAE,GAAG,QAAA,CAAS,IAAA,EAAK;AAAA,IACzB,OAAA,EAAS;AAAA,MACP,gBAAA,EAAkB,CAAC,WAAA,EAAa,QAAA,EAAU,UAAU,gBAAgB,CAAA;AAAA,MACpE,mBAAA,EAAqB;AAAA,QACnB,MAAA,EAAQ,CAAC,WAAA,EAAa,gBAAgB,CAAA;AAAA,QACtC,GAAA,EAAK,CAAC,QAAA,EAAU,gBAAgB,CAAA;AAAA,QAChC,MAAA,EAAQ,CAAC,QAAA,EAAU,gBAAgB;AAAA,OACrC;AAAA,MACA,cAAA,EAAgB;AAAA,QACd,MAAA,EAAQ;AAAA,UACN,gBAAA,EAAkB;AAAA;AACpB,OACF;AAAA,MACA,gBAAA,EAAkB;AAAA,QAChB,YAAA,EAAc,KAAA;AAAA,QACd,aAAA,EAAe,GAAA;AAAA,QACf,iBAAA,EAAmB;AAAA;AACrB;AACF,GACF;AACF;AAMA,SAAS,gBAAgB,OAAA,EAAqD;AAC5E,EAAA,MAAM,SAAS,gBAAA,EAAiB;AAEhC,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,IAAI,CAAC,MAAA,EAAQ;AAGb,IAAA,IAAI,MAAA,CAAO,OAAA,EAAS,MAAA,CAAO,OAAA,GAAU,MAAA,CAAO,OAAA;AAG5C,IAAA,IAAI,OAAO,aAAA,EAAe;AACxB,MAAA,IAAI,MAAA,CAAO,cAAc,MAAA,EAAQ;AAC/B,QAAA,MAAA,CAAO,cAAc,MAAA,GAAS;AAAA,UAC5B,GAAG,OAAO,aAAA,CAAc,MAAA;AAAA,UACxB,GAAG,OAAO,aAAA,CAAc;AAAA,SAC1B;AAAA,MACF;AACA,MAAA,IAAI,MAAA,CAAO,cAAc,MAAA,EAAQ;AAC/B,QAAA,MAAA,CAAO,cAAc,MAAA,GAAS;AAAA,UAC5B,GAAG,OAAO,aAAA,CAAc,MAAA;AAAA,UACxB,GAAG,OAAO,aAAA,CAAc;AAAA,SAC1B;AAAA,MACF;AACA,MAAA,IAAI,MAAA,CAAO,cAAc,MAAA,EAAQ;AAC/B,QAAA,MAAA,CAAO,cAAc,MAAA,GAAS;AAAA,UAC5B,GAAG,OAAO,aAAA,CAAc,MAAA;AAAA,UACxB,GAAG,OAAO,aAAA,CAAc;AAAA,SAC1B;AAAA,MACF;AACA,MAAA,IAAI,MAAA,CAAO,cAAc,aAAA,EAAe;AACtC,QAAA,MAAA,CAAO,cAAc,aAAA,GAAgB;AAAA,UACnC,GAAG,OAAO,aAAA,CAAc,aAAA;AAAA,UACxB,GAAG,OAAO,aAAA,CAAc;AAAA,SAC1B;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,MAAA,EAAQ;AACjB,MAAA,IAAI,MAAA,CAAO,OAAO,MAAA,KAAW,MAAA,SAAkB,MAAA,CAAO,MAAA,GAAS,OAAO,MAAA,CAAO,MAAA;AAC7E,MAAA,IAAI,MAAA,CAAO,OAAO,MAAA,KAAW,MAAA,SAAkB,MAAA,CAAO,MAAA,GAAS,OAAO,MAAA,CAAO,MAAA;AAC7E,MAAA,IAAI,MAAA,CAAO,OAAO,SAAA,KAAc,MAAA,SAAkB,MAAA,CAAO,SAAA,GAAY,OAAO,MAAA,CAAO,SAAA;AACnF,MAAA,IAAI,MAAA,CAAO,OAAO,QAAA,KAAa,MAAA,SAAkB,MAAA,CAAO,QAAA,GAAW,OAAO,MAAA,CAAO,QAAA;AACjF,MAAA,IAAI,MAAA,CAAO,OAAO,cAAA,KAAmB,MAAA;AACnC,QAAA,MAAA,CAAO,MAAA,CAAO,cAAA,GAAiB,MAAA,CAAO,MAAA,CAAO,cAAA;AAC/C,MAAA,IAAI,MAAA,CAAO,OAAO,gBAAA,KAAqB,MAAA;AACrC,QAAA,MAAA,CAAO,MAAA,CAAO,gBAAA,GAAmB,MAAA,CAAO,MAAA,CAAO,gBAAA;AAEjD,MAAA,IAAI,MAAA,CAAO,MAAA,CAAO,QAAA,KAAa,MAAA,EAAW;AACxC,QAAA,MAAA,CAAO,MAAA,CAAO,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,YAAY,EAAC;AACpD,QAAA,MAAM,cAAA,GAAiB,OAAO,MAAA,CAAO,QAAA;AACrC,QAAA,MAAM,cAAA,GAAiB,OAAO,MAAA,CAAO,QAAA;AAErC,QAAA,KAAA,MAAW,QAAA,IAAY;AAAA,UACrB,QAAA;AAAA,UACA,QAAA;AAAA,UACA,WAAA;AAAA,UACA,UAAA;AAAA,UACA,gBAAA;AAAA,UACA;AAAA,SACF,EAAY;AACV,UAAA,IAAI,cAAA,CAAe,QAAQ,CAAA,KAAM,MAAA,EAAW;AAC1C,YAAC,cAAA,CAA2C,QAAQ,CAAA,GAAI;AAAA,cACtD,GAAM,cAAA,CAA2C,QAAQ,CAAA,IAAgB,EAAC;AAAA,cAC1E,GAAI,eAAe,QAAQ;AAAA,aAC7B;AAAA,UACF;AAAA,QACF;AAEA,QAAA,IAAI,cAAA,CAAe,cAAc,MAAA,EAAW;AAC1C,UAAA,cAAA,CAAe,SAAA,GAAY;AAAA,YACzB,GAAI,cAAA,CAAe,SAAA,IAAa,EAAC;AAAA,YACjC,GAAG,cAAA,CAAe;AAAA,WACpB;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,MAAA,CAAO,MAAA,CAAO,MAAA,KAAW,MAAA,EAAW;AACtC,QAAA,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,MAAA;AAAA,MACvC;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA,MAAA,CAAO,OAAO,EAAE,GAAG,OAAO,IAAA,EAAM,GAAG,OAAO,IAAA,EAAK;AAAA,IACjD;AAGA,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,MAAA,CAAO,WAAW,EAAE,GAAG,OAAO,QAAA,EAAU,GAAG,OAAO,QAAA,EAAS;AAAA,IAC7D;AAGA,IAAA,IAAI,OAAO,IAAA,EAAM;AACf,MAAA,MAAA,CAAO,OAAO,EAAE,GAAG,OAAO,IAAA,EAAM,GAAG,OAAO,IAAA,EAAK;AAAA,IACjD;AAGA,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,gBAAA,KAAqB,MAAA,EAAW;AACjD,QAAA,MAAA,CAAO,OAAA,CAAQ,gBAAA,GAAmB,MAAA,CAAO,OAAA,CAAQ,gBAAA;AAAA,MACnD;AAEA,MAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,mBAAA,KAAwB,MAAA,EAAW;AACpD,QAAA,MAAA,CAAO,QAAQ,mBAAA,GAAsB;AAAA,UACnC,GAAG,OAAO,OAAA,CAAQ,mBAAA;AAAA,UAClB,GAAG,OAAO,OAAA,CAAQ;AAAA,SACpB;AAAA,MACF;AAEA,MAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,cAAA,KAAmB,MAAA,EAAW;AAC/C,QAAA,MAAA,CAAO,QAAQ,cAAA,GAAiB;AAAA,UAC9B,GAAG,OAAO,OAAA,CAAQ,cAAA;AAAA,UAClB,GAAG,OAAO,OAAA,CAAQ;AAAA,SACpB;AAAA,MACF;AAEA,MAAA,IAAI,MAAA,CAAO,OAAA,CAAQ,gBAAA,KAAqB,MAAA,EAAW;AACjD,QAAA,MAAA,CAAO,QAAQ,gBAAA,GAAmB;AAAA,UAChC,GAAG,OAAO,OAAA,CAAQ,gBAAA;AAAA,UAClB,GAAG,OAAO,OAAA,CAAQ;AAAA,SACpB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;;;AC1pBA,IAAMA,KAAAA,GAAM,mBAAmB,aAAa,CAAA;AAWrC,IAAM,YAAA,GAAuB,OAAO,GAAA,KAAQ;AACjD,EAAA,MAAM,EAAE,WAAU,GAAI,GAAA;AAEtB,EAAAA,KAAAA,CAAI,KAAK,8BAAA,EAAgC;AAAA,IACvC,SAAA;AAAA,IACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,GACnC,CAAA;AAGD,EAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,SAAS,CAAA;AAG7C,EAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa,SAAS,CAAA;AAC1C,EAAA,MAAM,QAAQ,UAAA,EAAW;AAGzB,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,GAAA,EAAK,OAAA,EAAS,MAAM,CAAA;AAG9C,EAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,GAAA,EAAK,OAAA,EAAS,MAAM,CAAA;AAC5D,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,GAAA,EAAK,OAAA,EAAS,MAAM,CAAA;AACtD,EAAA,MAAM,cAAA,GAAiB,oBAAA,CAAqB,OAAe,CAAA;AAE3D,EAAA,OAAO;AAAA;AAAA,IAEL,IAAA,EAAM,KAAA;AAAA;AAAA,IAGN,KAAA,EAAO,YAAA;AAAA;AAAA,IAGP,uBAAuB,SAAA,CAAU,MAAA;AAAA,IACjC,sBAAsB,SAAA,CAAU,KAAA;AAAA;AAAA,IAGhC,iCAAA,EAAmC;AAAA,GACrC;AACF;AAGA,IAAO,cAAA,GAAQ","file":"index.js","sourcesContent":["/**\n * Plugin Logger - File-based logging for OpenCode SDLC plugin runtime\n *\n * Follows oh-my-opencode logging pattern:\n * - Logs to temp file: ${TMPDIR}/opencode-sdlc.log\n * - Optional console output: ATHENA_DEBUG=1\n * - Silent failures to prevent breaking plugin execution\n */\n\nimport { appendFileSync, existsSync, statSync, truncateSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\n\nconst LOG_FILE = join(tmpdir(), \"opencode-sdlc.log\");\nconst MAX_LOG_SIZE = 5 * 1024 * 1024;\n\ntype LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nconst LEVEL_PREFIXES: Record<LogLevel, string> = {\n debug: \"[DEBUG]\",\n info: \"[INFO]\",\n warn: \"[WARN]\",\n error: \"[ERROR]\",\n};\n\nfunction shouldLog(level: LogLevel): boolean {\n if (level === \"warn\" || level === \"error\") return true;\n return process.env.ATHENA_DEBUG === \"1\" || process.env.ATHENA_DEBUG === \"true\";\n}\n\nfunction shouldConsoleLog(): boolean {\n return process.env.ATHENA_DEBUG === \"1\" || process.env.ATHENA_DEBUG === \"true\";\n}\n\nfunction formatLogEntry(\n level: LogLevel,\n component: string,\n message: string,\n data?: Record<string, unknown>\n): string {\n const timestamp = new Date().toISOString();\n const prefix = LEVEL_PREFIXES[level];\n const dataStr = data ? ` ${JSON.stringify(data)}` : \"\";\n return `[${timestamp}] ${prefix} [${component}] ${message}${dataStr}\\n`;\n}\n\nfunction rotateLogIfNeeded(): void {\n try {\n if (existsSync(LOG_FILE)) {\n const stats = statSync(LOG_FILE);\n if (stats.size > MAX_LOG_SIZE) {\n truncateSync(LOG_FILE, 0);\n }\n }\n } catch {\n // Silent - logging infrastructure should never break plugin\n }\n}\n\nfunction writeLog(entry: string): void {\n try {\n rotateLogIfNeeded();\n appendFileSync(LOG_FILE, entry);\n } catch {\n // Silent - logging infrastructure should never break plugin\n }\n}\n\n/**\n * Create a scoped logger for a specific component.\n * Public API - docstring required for discoverability.\n *\n * @example\n * const log = createPluginLogger(\"party-discussion\");\n * log.debug(\"Starting session\", { sessionId: \"abc123\" });\n */\nexport function createPluginLogger(component: string) {\n return {\n debug: (message: string, data?: Record<string, unknown>): void => {\n if (!shouldLog(\"debug\")) return;\n const entry = formatLogEntry(\"debug\", component, message, data);\n writeLog(entry);\n if (shouldConsoleLog()) {\n console.debug(`[Sdlc:${component}] ${message}`, data ?? \"\");\n }\n },\n\n info: (message: string, data?: Record<string, unknown>): void => {\n if (!shouldLog(\"info\")) return;\n const entry = formatLogEntry(\"info\", component, message, data);\n writeLog(entry);\n if (shouldConsoleLog()) {\n console.info(`[Sdlc:${component}] ${message}`, data ?? \"\");\n }\n },\n\n warn: (message: string, data?: Record<string, unknown>): void => {\n const entry = formatLogEntry(\"warn\", component, message, data);\n writeLog(entry);\n if (shouldConsoleLog()) {\n console.warn(`[Sdlc:${component}] ${message}`, data ?? \"\");\n }\n },\n\n error: (message: string, data?: Record<string, unknown>): void => {\n const entry = formatLogEntry(\"error\", component, message, data);\n writeLog(entry);\n if (shouldConsoleLog()) {\n console.error(`[Sdlc:${component}] ${message}`, data ?? \"\");\n }\n },\n };\n}\n\n/** Returns log file path: ${TMPDIR}/opencode-sdlc.log */\nexport function getLogFilePath(): string {\n return LOG_FILE;\n}\n\n/** Truncates the log file to zero bytes */\nexport function clearLog(): void {\n try {\n if (existsSync(LOG_FILE)) {\n truncateSync(LOG_FILE, 0);\n }\n } catch {\n // Silent - logging infrastructure should never break plugin\n }\n}\n","/**\n * Cross-platform notification utility\n *\n * Sends desktop notifications on macOS/Linux, falls back to console on Windows.\n */\n\nimport { platform } from \"node:os\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport { createPluginLogger } from \"./plugin-logger.js\";\n\ntype ShellExecutor = PluginInput[\"$\"];\n\nconst log = createPluginLogger(\"notifications\");\n\n/**\n * Send a desktop notification\n *\n * Platform support:\n * - macOS: Uses osascript (built-in)\n * - Linux: Uses notify-send (requires libnotify)\n * - Windows: Falls back to console.log\n *\n * @param message - The notification message\n * @param title - The notification title\n * @param $ - Shell executor from plugin context\n */\nexport async function sendNotification(\n message: string,\n title: string,\n $: ShellExecutor\n): Promise<void> {\n const os = platform();\n\n try {\n if (os === \"darwin\") {\n // macOS - use osascript (built-in)\n await $`osascript -e ${`display notification \"${escapeAppleScript(message)}\" with title \"${escapeAppleScript(title)}\"`}`;\n } else if (os === \"linux\") {\n // Linux - use notify-send (requires libnotify)\n await $`notify-send ${title} ${message}`;\n } else {\n // Windows and others - fall back to console\n logNotification(title, message);\n }\n } catch {\n // Silently fall back to console if notification fails\n logNotification(title, message);\n }\n}\n\n/**\n * Escape special characters for AppleScript strings\n */\nfunction escapeAppleScript(str: string): string {\n return str.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n}\n\n/**\n * Log notification to log file as fallback\n */\nfunction logNotification(title: string, message: string): void {\n log.info(\"Desktop notification fallback\", { title, message });\n}\n","/**\n * Session event hooks\n *\n * Handles session lifecycle events like idle, created, and error.\n */\n\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig, SdlcFeatures } from \"../../shared/types.js\";\nimport type { IssueTracker } from \"../tracker/issue-tracker.js\";\nimport { sendNotification } from \"../utils/notifications.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\n\nconst log = createPluginLogger(\"session-hooks\");\n\n/**\n * Generic event type for session events\n */\ninterface SessionEvent {\n type?: string;\n error?: unknown;\n}\n\n/**\n * Check if config has orchestratorOnly feature enabled\n */\nfunction isOrchestratorOnlyEnabled(config: SdlcConfig): boolean {\n const features = config.features;\n if (!features) return false;\n if (\"orchestratorOnly\" in features) {\n return (features as SdlcFeatures).orchestratorOnly;\n }\n return false;\n}\n\n/**\n * Create session event handler\n *\n * Handles:\n * - session.idle: Reminds about active issue when session goes idle\n * - session.created: Logs resume of tracked issue + orchestration reminder\n * - session.error: Logs errors during issue work\n */\nexport function createSessionHooks(ctx: PluginInput, tracker: IssueTracker, config: SdlcConfig) {\n return async ({ event }: { event: SessionEvent }) => {\n // Event type is in event.type for most events\n const eventType = (event as { type?: string }).type;\n\n switch (eventType) {\n case \"session.idle\":\n await handleSessionIdle(ctx, tracker, config);\n break;\n\n case \"session.created\":\n handleSessionCreated(tracker, config);\n break;\n\n case \"session.error\":\n handleSessionError(event, tracker);\n break;\n }\n };\n}\n\n/**\n * Handle session going idle\n *\n * If an issue is active, send a reminder notification\n */\nasync function handleSessionIdle(\n ctx: PluginInput,\n tracker: IssueTracker,\n config: SdlcConfig\n): Promise<void> {\n const currentIssue = tracker.getCurrentIssue();\n\n if (currentIssue) {\n const normalized = currentIssue.status.toLowerCase();\n if (!normalized.includes(\"in progress\") && !normalized.includes(\"in-progress\")) {\n return;\n }\n if (config.features?.notifications) {\n await sendNotification(\n `Issue #${currentIssue.issueNumber} in progress. Remember to update status when complete!`,\n \"OpenCode SDLC\",\n ctx.$\n );\n }\n }\n}\n\n/**\n * Handle session creation\n *\n * Log if resuming with an active issue and show orchestration reminder\n */\nfunction handleSessionCreated(tracker: IssueTracker, config: SdlcConfig): void {\n const currentIssue = tracker.getCurrentIssue();\n\n if (currentIssue) {\n log.info(\"Session created - resuming with issue\", {\n issueNumber: currentIssue.issueNumber,\n status: currentIssue.status,\n });\n }\n\n // Log orchestration reminder if feature is enabled\n if (isOrchestratorOnlyEnabled(config)) {\n log.info(\"Orchestrator-only mode active\", {\n hint: \"Use sdlc_red/sdlc_green/sdlc_domain for file edits\",\n });\n }\n}\n\n/**\n * Handle session errors\n *\n * Log errors that occur during issue work\n */\nfunction handleSessionError(event: SessionEvent, tracker: IssueTracker): void {\n const currentIssue = tracker.getCurrentIssue();\n\n if (currentIssue && event.error) {\n log.error(\"Session error during issue work\", {\n issueNumber: currentIssue.issueNumber,\n error: event.error,\n });\n }\n}\n","/**\n * Shared GitHub API Client using Octokit\n *\n * Provides typed methods for GitHub operations used by both CLI and plugin.\n * Authentication is resolved in order:\n * 1. Explicitly provided token\n * 2. GITHUB_TOKEN environment variable\n * 3. `gh auth token` command output (if gh CLI is available)\n */\n\nimport { execSync } from \"node:child_process\";\nimport { Octokit } from \"@octokit/rest\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface GitHubClientOptions {\n /** GitHub token (optional - will try env/gh CLI if not provided) */\n token?: string;\n /** Repository owner */\n owner?: string;\n /** Repository name */\n repo?: string;\n}\n\nexport interface GitHubIssue {\n number: number;\n title: string;\n body: string | null;\n url: string;\n state: string;\n labels: Array<{ name: string }>;\n}\n\nexport interface GitHubIssueListItem {\n number: number;\n title: string;\n url: string;\n state: string;\n}\n\nexport interface GitHubPullRequest {\n number: number;\n title: string;\n body: string | null;\n url: string;\n state: \"open\" | \"closed\" | \"merged\";\n mergeable: boolean | null;\n mergeableState: string;\n draft: boolean;\n}\n\nexport interface GitHubPrCheck {\n name: string;\n status: \"pass\" | \"fail\" | \"pending\" | \"skipped\";\n conclusion: string | null;\n}\n\nexport interface GitHubPrReview {\n reviewer: string;\n state: \"APPROVED\" | \"CHANGES_REQUESTED\" | \"COMMENTED\" | \"PENDING\" | \"DISMISSED\";\n}\n\nexport interface GitHubPrStatus {\n number: number;\n url: string;\n state: \"open\" | \"closed\" | \"merged\";\n mergeable: boolean | null;\n checks: GitHubPrCheck[];\n reviews: GitHubPrReview[];\n}\n\nexport interface CreatePrOptions {\n title: string;\n body?: string;\n head: string;\n base?: string;\n draft?: boolean;\n}\n\nexport interface CreatePrResult {\n number: number;\n url: string;\n}\n\nexport interface MergePrOptions {\n prNumber: number;\n mergeMethod?: \"merge\" | \"squash\" | \"rebase\";\n commitTitle?: string;\n commitMessage?: string;\n}\n\nexport interface MergePrResult {\n sha: string;\n merged: boolean;\n}\n\nexport interface GitHubProject {\n id: string;\n number: number;\n title: string;\n url: string;\n}\n\nexport interface CreateRepoOptions {\n name: string;\n description?: string;\n private?: boolean;\n autoInit?: boolean;\n}\n\nexport interface GitHubRepo {\n id: number;\n name: string;\n fullName: string;\n url: string;\n private: boolean;\n defaultBranch: string;\n}\n\n// ============================================================================\n// Authentication\n// ============================================================================\n\n/**\n * Resolve GitHub token from various sources\n */\nexport function resolveGitHubToken(explicitToken?: string): string | null {\n // 1. Explicit token\n if (explicitToken) {\n return explicitToken;\n }\n\n // 2. Environment variable\n const envToken = process.env.GITHUB_TOKEN || process.env.GH_TOKEN;\n if (envToken) {\n return envToken;\n }\n\n // 3. gh CLI token\n try {\n const ghToken = execSync(\"gh auth token\", {\n encoding: \"utf-8\",\n timeout: 5000,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim();\n if (ghToken) {\n return ghToken;\n }\n } catch {\n // gh CLI not available or not authenticated\n }\n\n return null;\n}\n\n/**\n * Check if GitHub authentication is available\n */\nexport function isGitHubAuthenticated(token?: string): boolean {\n return resolveGitHubToken(token) !== null;\n}\n\n// ============================================================================\n// Client Class\n// ============================================================================\n\nexport class GitHubClient {\n private octokit: Octokit;\n private owner?: string;\n private repo?: string;\n\n constructor(options: GitHubClientOptions = {}) {\n const token = resolveGitHubToken(options.token);\n\n if (!token) {\n throw new Error(\n \"GitHub authentication not found. Set GITHUB_TOKEN environment variable or run 'gh auth login'.\"\n );\n }\n\n this.octokit = new Octokit({ auth: token });\n this.owner = options.owner;\n this.repo = options.repo;\n }\n\n /**\n * Set the default owner/repo for operations\n */\n setRepo(owner: string, repo: string): void {\n this.owner = owner;\n this.repo = repo;\n }\n\n private getRepoParams(owner?: string, repo?: string): { owner: string; repo: string } {\n const o = owner || this.owner;\n const r = repo || this.repo;\n if (!o || !r) {\n throw new Error(\"Repository owner and name are required\");\n }\n return { owner: o, repo: r };\n }\n\n // ==========================================================================\n // Issues\n // ==========================================================================\n\n /**\n * Get a single issue by number\n */\n async getIssue(issueNumber: number, owner?: string, repo?: string): Promise<GitHubIssue> {\n const params = this.getRepoParams(owner, repo);\n const { data } = await this.octokit.issues.get({\n ...params,\n issue_number: issueNumber,\n });\n\n return {\n number: data.number,\n title: data.title,\n body: data.body ?? null,\n url: data.html_url,\n state: data.state,\n labels: (data.labels || []).map((label) =>\n typeof label === \"string\" ? { name: label } : { name: label.name || \"\" }\n ),\n };\n }\n\n /**\n * List issues in a repository\n */\n async listIssues(\n options: {\n state?: \"open\" | \"closed\" | \"all\";\n labels?: string[];\n limit?: number;\n } = {},\n owner?: string,\n repo?: string\n ): Promise<GitHubIssueListItem[]> {\n const params = this.getRepoParams(owner, repo);\n const { data } = await this.octokit.issues.listForRepo({\n ...params,\n state: options.state || \"open\",\n labels: options.labels?.join(\",\"),\n per_page: options.limit || 30,\n });\n\n // Filter out pull requests (GitHub API returns PRs as issues)\n return data\n .filter((issue) => !issue.pull_request)\n .map((issue) => ({\n number: issue.number,\n title: issue.title,\n url: issue.html_url,\n state: issue.state,\n }));\n }\n\n /**\n * Update an issue's body\n */\n async updateIssueBody(\n issueNumber: number,\n body: string,\n owner?: string,\n repo?: string\n ): Promise<void> {\n const params = this.getRepoParams(owner, repo);\n await this.octokit.issues.update({\n ...params,\n issue_number: issueNumber,\n body,\n });\n }\n\n /**\n * Add labels to an issue\n */\n async addLabels(\n issueNumber: number,\n labels: string[],\n owner?: string,\n repo?: string\n ): Promise<void> {\n const params = this.getRepoParams(owner, repo);\n await this.octokit.issues.addLabels({\n ...params,\n issue_number: issueNumber,\n labels,\n });\n }\n\n // ==========================================================================\n // Pull Requests\n // ==========================================================================\n\n /**\n * Create a pull request\n */\n async createPullRequest(\n options: CreatePrOptions,\n owner?: string,\n repo?: string\n ): Promise<CreatePrResult> {\n const params = this.getRepoParams(owner, repo);\n const { data } = await this.octokit.pulls.create({\n ...params,\n title: options.title,\n body: options.body,\n head: options.head,\n base: options.base || \"main\",\n draft: options.draft,\n });\n\n return {\n number: data.number,\n url: data.html_url,\n };\n }\n\n /**\n * Get pull request details\n */\n async getPullRequest(\n prNumber: number,\n owner?: string,\n repo?: string\n ): Promise<GitHubPullRequest> {\n const params = this.getRepoParams(owner, repo);\n const { data } = await this.octokit.pulls.get({\n ...params,\n pull_number: prNumber,\n });\n\n return {\n number: data.number,\n title: data.title,\n body: data.body,\n url: data.html_url,\n state: data.merged ? \"merged\" : (data.state as \"open\" | \"closed\"),\n mergeable: data.mergeable,\n mergeableState: data.mergeable_state,\n draft: data.draft || false,\n };\n }\n\n /**\n * Get pull request status including checks and reviews\n */\n async getPullRequestStatus(\n prNumber: number,\n owner?: string,\n repo?: string\n ): Promise<GitHubPrStatus> {\n const params = this.getRepoParams(owner, repo);\n\n // Get PR details\n const pr = await this.getPullRequest(prNumber, owner, repo);\n\n // Get check runs for the PR's head commit\n const { data: prData } = await this.octokit.pulls.get({\n ...params,\n pull_number: prNumber,\n });\n\n let checks: GitHubPrCheck[] = [];\n try {\n const { data: checksData } = await this.octokit.checks.listForRef({\n ...params,\n ref: prData.head.sha,\n });\n\n checks = checksData.check_runs.map((check) => ({\n name: check.name,\n status:\n check.status === \"completed\"\n ? check.conclusion === \"success\"\n ? \"pass\"\n : check.conclusion === \"skipped\"\n ? \"skipped\"\n : \"fail\"\n : \"pending\",\n conclusion: check.conclusion,\n }));\n } catch {\n // Checks API might not be available\n }\n\n // Get reviews\n const { data: reviewsData } = await this.octokit.pulls.listReviews({\n ...params,\n pull_number: prNumber,\n });\n\n const reviews: GitHubPrReview[] = reviewsData.map((review) => ({\n reviewer: review.user?.login || \"unknown\",\n state: review.state as GitHubPrReview[\"state\"],\n }));\n\n return {\n number: pr.number,\n url: pr.url,\n state: pr.state,\n mergeable: pr.mergeable,\n checks,\n reviews,\n };\n }\n\n /**\n * Get pull request diff\n */\n async getPullRequestDiff(prNumber: number, owner?: string, repo?: string): Promise<string> {\n const params = this.getRepoParams(owner, repo);\n const { data } = await this.octokit.pulls.get({\n ...params,\n pull_number: prNumber,\n mediaType: { format: \"diff\" },\n });\n\n // The response is a string when using diff format\n return data as unknown as string;\n }\n\n /**\n * Merge a pull request\n */\n async mergePullRequest(\n options: MergePrOptions,\n owner?: string,\n repo?: string\n ): Promise<MergePrResult> {\n const params = this.getRepoParams(owner, repo);\n const { data } = await this.octokit.pulls.merge({\n ...params,\n pull_number: options.prNumber,\n merge_method: options.mergeMethod || \"squash\",\n commit_title: options.commitTitle,\n commit_message: options.commitMessage,\n });\n\n return {\n sha: data.sha,\n merged: data.merged,\n };\n }\n\n // ==========================================================================\n // Repositories\n // ==========================================================================\n\n /**\n * Create a new repository\n */\n async createRepository(options: CreateRepoOptions): Promise<GitHubRepo> {\n const { data } = await this.octokit.repos.createForAuthenticatedUser({\n name: options.name,\n description: options.description,\n private: options.private ?? false,\n auto_init: options.autoInit ?? false,\n });\n\n return {\n id: data.id,\n name: data.name,\n fullName: data.full_name,\n url: data.html_url,\n private: data.private,\n defaultBranch: data.default_branch || \"main\",\n };\n }\n\n /**\n * Get repository details\n */\n async getRepository(owner?: string, repo?: string): Promise<GitHubRepo> {\n const params = this.getRepoParams(owner, repo);\n const { data } = await this.octokit.repos.get(params);\n\n return {\n id: data.id,\n name: data.name,\n fullName: data.full_name,\n url: data.html_url,\n private: data.private,\n defaultBranch: data.default_branch || \"main\",\n };\n }\n\n /**\n * List repositories for the authenticated user\n */\n async listUserRepos(\n options: { type?: \"all\" | \"owner\" | \"member\"; limit?: number } = {}\n ): Promise<GitHubRepo[]> {\n const { data } = await this.octokit.repos.listForAuthenticatedUser({\n type: options.type || \"owner\",\n per_page: options.limit || 30,\n sort: \"updated\",\n });\n\n return data.map((repo) => ({\n id: repo.id,\n name: repo.name,\n fullName: repo.full_name,\n url: repo.html_url,\n private: repo.private,\n defaultBranch: repo.default_branch || \"main\",\n }));\n }\n\n // ==========================================================================\n // Projects (GraphQL required for Projects V2)\n // ==========================================================================\n\n /**\n * List projects for the authenticated user\n * Note: Projects V2 requires GraphQL API\n */\n async listUserProjects(limit = 20): Promise<GitHubProject[]> {\n const query = `\n query($first: Int!) {\n viewer {\n projectsV2(first: $first) {\n nodes {\n id\n number\n title\n url\n }\n }\n }\n }\n `;\n\n const result = await this.octokit.graphql<{\n viewer: {\n projectsV2: {\n nodes: Array<{\n id: string;\n number: number;\n title: string;\n url: string;\n }>;\n };\n };\n }>(query, { first: limit });\n\n return result.viewer.projectsV2.nodes;\n }\n\n /**\n * Get project by number for a user\n */\n async getUserProject(userLogin: string, projectNumber: number): Promise<GitHubProject | null> {\n const query = `\n query($login: String!, $number: Int!) {\n user(login: $login) {\n projectV2(number: $number) {\n id\n number\n title\n url\n }\n }\n }\n `;\n\n try {\n const result = await this.octokit.graphql<{\n user: {\n projectV2: {\n id: string;\n number: number;\n title: string;\n url: string;\n } | null;\n };\n }>(query, { login: userLogin, number: projectNumber });\n\n return result.user.projectV2;\n } catch {\n return null;\n }\n }\n\n /**\n * Link a repository to a project\n * Note: This creates a linked repository in the project\n */\n async linkRepoToProject(projectId: string, repoOwner: string, repoName: string): Promise<void> {\n // First get the repository's node ID\n const { data: repoData } = await this.octokit.repos.get({\n owner: repoOwner,\n repo: repoName,\n });\n\n const mutation = `\n mutation($projectId: ID!, $repositoryId: ID!) {\n linkProjectV2ToRepository(input: { projectId: $projectId, repositoryId: $repositoryId }) {\n repository {\n id\n }\n }\n }\n `;\n\n await this.octokit.graphql(mutation, {\n projectId,\n repositoryId: repoData.node_id,\n });\n }\n\n /**\n * Add an issue to a project\n */\n async addIssueToProject(projectId: string, issueNodeId: string): Promise<string> {\n const mutation = `\n mutation($projectId: ID!, $contentId: ID!) {\n addProjectV2ItemById(input: { projectId: $projectId, contentId: $contentId }) {\n item {\n id\n }\n }\n }\n `;\n\n const result = await this.octokit.graphql<{\n addProjectV2ItemById: {\n item: {\n id: string;\n };\n };\n }>(mutation, {\n projectId,\n contentId: issueNodeId,\n });\n\n return result.addProjectV2ItemById.item.id;\n }\n\n // ==========================================================================\n // Branch Protection / Rulesets\n // ==========================================================================\n\n /**\n * Create a branch ruleset with common protection rules\n */\n async createBranchRuleset(\n options: {\n name: string;\n enforcement: \"active\" | \"disabled\" | \"evaluate\";\n targetBranches: string[];\n requirePullRequest?: boolean;\n requiredApprovals?: number;\n requireCodeOwnerReview?: boolean;\n dismissStaleReviews?: boolean;\n requireSignedCommits?: boolean;\n requireLinearHistory?: boolean;\n preventDeletion?: boolean;\n preventForcePush?: boolean;\n },\n owner?: string,\n repo?: string\n ): Promise<{ id: number }> {\n const params = this.getRepoParams(owner, repo);\n\n // Build rules array based on options\n const rules: Array<\n | { type: \"deletion\" }\n | { type: \"non_fast_forward\" }\n | { type: \"required_linear_history\" }\n | { type: \"required_signatures\" }\n | {\n type: \"pull_request\";\n parameters: {\n dismiss_stale_reviews_on_push: boolean;\n require_code_owner_review: boolean;\n require_last_push_approval: boolean;\n required_approving_review_count: number;\n required_review_thread_resolution: boolean;\n };\n }\n > = [];\n\n if (options.requirePullRequest) {\n rules.push({\n type: \"pull_request\",\n parameters: {\n dismiss_stale_reviews_on_push: options.dismissStaleReviews ?? false,\n require_code_owner_review: options.requireCodeOwnerReview ?? false,\n require_last_push_approval: false,\n required_approving_review_count: options.requiredApprovals ?? 1,\n required_review_thread_resolution: false,\n },\n });\n }\n\n if (options.requireSignedCommits) {\n rules.push({ type: \"required_signatures\" });\n }\n\n if (options.requireLinearHistory) {\n rules.push({ type: \"required_linear_history\" });\n }\n\n if (options.preventDeletion) {\n rules.push({ type: \"deletion\" });\n }\n\n if (options.preventForcePush) {\n rules.push({ type: \"non_fast_forward\" });\n }\n\n const { data } = await this.octokit.repos.createRepoRuleset({\n ...params,\n name: options.name,\n enforcement: options.enforcement,\n conditions: {\n ref_name: {\n include: options.targetBranches,\n exclude: [],\n },\n },\n rules,\n });\n\n return { id: data.id };\n }\n\n // ==========================================================================\n // Utility Methods\n // ==========================================================================\n\n /**\n * Get the authenticated user's login\n */\n async getAuthenticatedUser(): Promise<{ login: string; id: number }> {\n const { data } = await this.octokit.users.getAuthenticated();\n return { login: data.login, id: data.id };\n }\n\n /**\n * Check if a repository exists\n */\n async repoExists(owner: string, repo: string): Promise<boolean> {\n try {\n await this.octokit.repos.get({ owner, repo });\n return true;\n } catch {\n return false;\n }\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * Create a GitHub client with optional configuration\n */\nexport function createGitHubClient(options: GitHubClientOptions = {}): GitHubClient {\n return new GitHubClient(options);\n}\n\n/**\n * Create a GitHub client if authentication is available, otherwise return null\n */\nexport function createGitHubClientIfAuthenticated(\n options: GitHubClientOptions = {}\n): GitHubClient | null {\n if (!isGitHubAuthenticated(options.token)) {\n return null;\n }\n try {\n return new GitHubClient(options);\n } catch {\n return null;\n }\n}\n","import type { PluginInput } from \"@opencode-ai/plugin\";\nimport {\n type GitHubClient,\n createGitHubClientIfAuthenticated,\n} from \"../../shared/github-client.js\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport { createPluginLogger } from \"./plugin-logger.js\";\n\nconst log = createPluginLogger(\"github-issues\");\n\nexport interface GitHubIssue {\n number: number;\n title: string;\n body: string | null;\n url: string;\n state: string;\n labels?: Array<{ name: string }>;\n}\n\nexport interface IssueListItem {\n number: number;\n title: string;\n url: string;\n state: string;\n status?: string;\n}\n\n// Cache for GitHub client per session\nlet cachedClient: GitHubClient | null = null;\nlet cachedClientRepo: string | null = null;\n\nfunction getClient(config: SdlcConfig): GitHubClient | null {\n if (!config.github?.owner || !config.github?.repo) return null;\n\n const repoKey = `${config.github.owner}/${config.github.repo}`;\n\n // Return cached client if same repo\n if (cachedClient && cachedClientRepo === repoKey) {\n return cachedClient;\n }\n\n // Create new client\n cachedClient = createGitHubClientIfAuthenticated({\n owner: config.github.owner,\n repo: config.github.repo,\n });\n cachedClientRepo = cachedClient ? repoKey : null;\n\n return cachedClient;\n}\n\nfunction getRepo(config: SdlcConfig): { owner: string; repo: string } | null {\n if (!config.github?.owner || !config.github?.repo) return null;\n return { owner: config.github.owner, repo: config.github.repo };\n}\n\nexport async function fetchIssue(\n ctx: PluginInput,\n config: SdlcConfig,\n issueNumber: number\n): Promise<GitHubIssue | null> {\n const client = getClient(config);\n\n // Use Octokit if available\n if (client) {\n try {\n const issue = await client.getIssue(issueNumber);\n return {\n number: issue.number,\n title: issue.title,\n body: issue.body,\n url: issue.url,\n state: issue.state,\n labels: issue.labels,\n };\n } catch (error) {\n log.warn(\"Failed to fetch issue via Octokit\", { issueNumber, error: String(error) });\n // Fall back to gh CLI\n }\n }\n\n // Fallback to gh CLI\n const repo = getRepo(config);\n if (!repo) return null;\n\n try {\n const { stdout } =\n await ctx.$`gh issue view ${issueNumber} --repo ${repo.owner}/${repo.repo} --json number,title,body,url,state,labels`;\n const output = String(stdout).trim();\n const issue = JSON.parse(output) as GitHubIssue;\n return issue;\n } catch (error) {\n log.warn(\"Failed to fetch issue\", { issueNumber, error: String(error) });\n return null;\n }\n}\n\nexport async function listIssues(\n ctx: PluginInput,\n config: SdlcConfig,\n status?: string,\n limit = 20\n): Promise<IssueListItem[]> {\n const client = getClient(config);\n\n // Use Octokit if available (note: status filtering via project requires GraphQL)\n if (client && !status) {\n try {\n const issues = await client.listIssues({ limit });\n return issues.map((issue) => ({\n number: issue.number,\n title: issue.title,\n url: issue.url,\n state: issue.state,\n }));\n } catch (error) {\n log.warn(\"Failed to list issues via Octokit\", { error: String(error) });\n // Fall back to gh CLI\n }\n }\n\n // Fallback to gh CLI (required for project status filtering)\n const repo = getRepo(config);\n if (!repo) return [];\n\n try {\n const statusFilter = status ? `--search \"project:${status}\"` : \"\";\n const { stdout } =\n await ctx.$`gh issue list --repo ${repo.owner}/${repo.repo} ${statusFilter} --limit ${limit} --json number,title,url,state`;\n const output = String(stdout).trim();\n const issues = JSON.parse(output) as IssueListItem[];\n return issues;\n } catch (error) {\n log.warn(\"Failed to list issues\", { status, error: String(error) });\n return [];\n }\n}\n\nexport async function moveIssueToStatus(\n ctx: PluginInput,\n config: SdlcConfig,\n issueNumber: number,\n status: string\n): Promise<boolean> {\n // Note: Moving issues on project boards requires gh project-ext or GraphQL\n // Keeping gh CLI for now as project operations are complex\n const repo = getRepo(config);\n if (!repo || !config.github?.project) return false;\n\n try {\n await ctx.$`gh project-ext move ${issueNumber} \"${status}\" --owner ${config.github.owner} --project ${config.github.project}`;\n return true;\n } catch (error) {\n log.warn(\"Failed to move issue\", { issueNumber, status, error: String(error) });\n return false;\n }\n}\n\nexport async function updateIssueBody(\n ctx: PluginInput,\n config: SdlcConfig,\n issueNumber: number,\n body: string\n): Promise<boolean> {\n const client = getClient(config);\n\n // Use Octokit if available\n if (client) {\n try {\n await client.updateIssueBody(issueNumber, body);\n return true;\n } catch (error) {\n log.warn(\"Failed to update issue body via Octokit\", { issueNumber, error: String(error) });\n // Fall back to gh CLI\n }\n }\n\n // Fallback to gh CLI\n const repo = getRepo(config);\n if (!repo) return false;\n\n try {\n await ctx.$`gh issue edit ${issueNumber} --repo ${repo.owner}/${repo.repo} --body ${body}`;\n return true;\n } catch (error) {\n log.warn(\"Failed to update issue body\", { issueNumber, error: String(error) });\n return false;\n }\n}\n","/**\n * Expanded File Ownership Matrix\n *\n * Extends the TDD file ownership system to cover all subagent types\n * with strict file type restrictions.\n *\n * Agent categories:\n * - TDD agents (red, green, domain): source/test file access\n * - Documentation agents (discovery, workflow, gwt, adr, architect): doc file access\n * - General agents (file_updater): config/scripts access\n * - Read-only agents (code_reviewer, ux, mutation, story, librarian): no writes\n */\n\nimport { minimatch } from \"minimatch\";\n\n// ============================================================================\n// Agent Types\n// ============================================================================\n\n/**\n * All agent types supported by the file ownership system\n */\nexport type AgentType =\n // Core TDD agents\n | \"red\"\n | \"green\"\n | \"domain\"\n // Documentation agents\n | \"discovery\"\n | \"workflow\"\n | \"gwt\"\n | \"adr\"\n | \"architect\"\n // General agents\n | \"file_updater\"\n // Read-only agents (cannot write any files)\n | \"code_reviewer\"\n | \"ux\"\n | \"mutation\"\n | \"story\"\n | \"librarian\";\n\n/**\n * Agents that are read-only and cannot write any files\n */\nexport const READ_ONLY_AGENTS: AgentType[] = [\n \"code_reviewer\",\n \"ux\",\n \"mutation\",\n \"story\",\n \"librarian\",\n];\n\n/**\n * Check if an agent type is read-only\n */\nexport function isReadOnlyAgent(agentType: AgentType): boolean {\n return READ_ONLY_AGENTS.includes(agentType);\n}\n\n// ============================================================================\n// File Patterns\n// ============================================================================\n\n/**\n * File ownership patterns for each agent type\n */\nexport interface AgentPatterns {\n /** Glob patterns for files this agent can edit */\n canEdit: string[];\n /** Glob patterns for files this agent cannot edit (takes precedence) */\n cannotEdit: string[];\n /** If true, agent cannot write any files */\n readOnly?: boolean;\n}\n\n/**\n * Complete file ownership matrix for all agent types\n */\nexport const AGENT_FILE_PATTERNS: Record<AgentType, AgentPatterns> = {\n // =========================================================================\n // Core TDD Agents\n // =========================================================================\n\n red: {\n canEdit: [\n \"**/*.test.ts\",\n \"**/*.test.tsx\",\n \"**/*.spec.ts\",\n \"**/*.spec.tsx\",\n \"**/__tests__/**/*.ts\",\n \"**/__tests__/**/*.tsx\",\n \"**/tests/**/*.ts\",\n \"**/tests/**/*.tsx\",\n ],\n cannotEdit: [\"**/node_modules/**\"],\n },\n\n green: {\n canEdit: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\"],\n cannotEdit: [\n \"**/*.test.ts\",\n \"**/*.test.tsx\",\n \"**/*.spec.ts\",\n \"**/*.spec.tsx\",\n \"**/__tests__/**\",\n \"**/tests/**\",\n \"**/node_modules/**\",\n \"**/*.d.ts\",\n ],\n },\n\n domain: {\n canEdit: [\n \"**/types.ts\",\n \"**/types/**/*.ts\",\n \"**/*.types.ts\",\n \"**/domain/**/*.ts\",\n \"**/models/**/*.ts\",\n \"**/*.d.ts\",\n ],\n cannotEdit: [\"**/node_modules/**\"],\n },\n\n // =========================================================================\n // Documentation Agents\n // =========================================================================\n\n discovery: {\n canEdit: [\n \"docs/event_model/**/*.md\",\n \"docs/event_model/**/*.yaml\",\n \"docs/event_model/**/*.yml\",\n ],\n cannotEdit: [\n \"docs/adr/**\",\n \"**/ARCHITECTURE.md\",\n \"docs/event_model/workflows/**\",\n \"docs/event_model/scenarios/**\",\n ],\n },\n\n workflow: {\n canEdit: [\"docs/event_model/workflows/**/*.md\", \"docs/event_model/workflows/**/*.yaml\"],\n cannotEdit: [\n \"docs/event_model/commands/**\",\n \"docs/event_model/events/**\",\n \"docs/event_model/scenarios/**\",\n ],\n },\n\n gwt: {\n canEdit: [\n \"docs/event_model/scenarios/**/*.md\",\n \"docs/event_model/scenarios/**/*.feature\",\n \"docs/event_model/scenarios/**/*.yaml\",\n ],\n cannotEdit: [\n \"docs/event_model/workflows/**\",\n \"docs/event_model/commands/**\",\n \"docs/event_model/events/**\",\n ],\n },\n\n adr: {\n canEdit: [\"docs/adr/**/*.md\"],\n cannotEdit: [\"**/ARCHITECTURE.md\", \"docs/event_model/**\"],\n },\n\n architect: {\n canEdit: [\"**/ARCHITECTURE.md\"],\n cannotEdit: [\"docs/adr/**\", \"docs/event_model/**\", \"**/README.md\"],\n },\n\n // =========================================================================\n // General Agents\n // =========================================================================\n\n file_updater: {\n canEdit: [\n // Config files\n \"**/*.json\",\n \"**/*.yaml\",\n \"**/*.yml\",\n \"**/*.toml\",\n \"**/.*rc\",\n \"**/.*rc.js\",\n \"**/.*rc.json\",\n // General documentation (not specialized)\n \"**/README*\",\n \"**/CHANGELOG*\",\n \"**/LICENSE*\",\n \"**/CONTRIBUTING*\",\n // Scripts\n \"**/scripts/**\",\n \"**/bin/**\",\n \"**/*.sh\",\n // Build/CI\n \"**/Makefile\",\n \"**/Dockerfile*\",\n \"**/.github/**\",\n \"**/.gitlab-ci*\",\n ],\n cannotEdit: [\n // Specialized docs (handled by dedicated agents)\n \"docs/adr/**\",\n \"docs/event_model/**\",\n \"**/ARCHITECTURE.md\",\n // Source/test code\n \"**/*.ts\",\n \"**/*.tsx\",\n \"**/*.js\",\n \"**/*.jsx\",\n \"**/node_modules/**\",\n ],\n },\n\n // =========================================================================\n // Read-Only Agents\n // =========================================================================\n\n code_reviewer: {\n canEdit: [],\n cannotEdit: [\"**/*\"],\n readOnly: true,\n },\n\n ux: {\n canEdit: [],\n cannotEdit: [\"**/*\"],\n readOnly: true,\n },\n\n mutation: {\n canEdit: [],\n cannotEdit: [\"**/*\"],\n readOnly: true,\n },\n\n story: {\n canEdit: [],\n cannotEdit: [\"**/*\"],\n readOnly: true,\n },\n\n librarian: {\n canEdit: [],\n cannotEdit: [\"**/*\"],\n readOnly: true,\n },\n};\n\n// ============================================================================\n// Ownership Checker\n// ============================================================================\n\n/**\n * Result of a file ownership check\n */\nexport interface OwnershipCheckResult {\n /** Whether the file can be edited by this agent */\n allowed: boolean;\n /** Reason for the decision */\n reason: string;\n /** The agent type that was checked */\n agentType: AgentType;\n /** The file path that was checked */\n filePath: string;\n /** Suggested agent if edit is not allowed */\n suggestedAgent?: AgentType;\n}\n\n/**\n * Create an expanded ownership checker\n */\nexport function createExpandedOwnershipChecker() {\n /**\n * Check if a file matches any of the given patterns\n */\n function matchesAny(filePath: string, patterns: string[]): boolean {\n return patterns.some((pattern) => minimatch(filePath, pattern, { dot: true }));\n }\n\n /**\n * Find suggested agent for a file\n */\n function findSuggestedAgent(filePath: string): AgentType | undefined {\n // Check specialized documentation agents first\n if (matchesAny(filePath, [\"docs/event_model/workflows/**\"])) {\n return \"workflow\";\n }\n if (matchesAny(filePath, [\"docs/event_model/scenarios/**\"])) {\n return \"gwt\";\n }\n if (matchesAny(filePath, [\"docs/event_model/**\"])) {\n return \"discovery\";\n }\n if (matchesAny(filePath, [\"docs/adr/**\"])) {\n return \"adr\";\n }\n if (matchesAny(filePath, [\"**/ARCHITECTURE.md\"])) {\n return \"architect\";\n }\n\n // Check TDD agents\n if (matchesAny(filePath, AGENT_FILE_PATTERNS.red.canEdit)) {\n return \"red\";\n }\n if (matchesAny(filePath, AGENT_FILE_PATTERNS.domain.canEdit)) {\n return \"domain\";\n }\n if (matchesAny(filePath, [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\"])) {\n return \"green\";\n }\n\n // Check file_updater patterns\n if (matchesAny(filePath, AGENT_FILE_PATTERNS.file_updater.canEdit)) {\n return \"file_updater\";\n }\n\n return undefined;\n }\n\n /**\n * Check if a file can be edited by a specific agent type\n */\n function canEdit(filePath: string, agentType: AgentType): OwnershipCheckResult {\n const patterns = AGENT_FILE_PATTERNS[agentType];\n\n // Read-only agents cannot edit anything\n if (patterns.readOnly) {\n return {\n allowed: false,\n reason: `${agentType} is a read-only agent and cannot edit any files`,\n agentType,\n filePath,\n suggestedAgent: findSuggestedAgent(filePath),\n };\n }\n\n // First check exclusions (cannotEdit takes precedence)\n if (matchesAny(filePath, patterns.cannotEdit)) {\n const suggestedAgent = findSuggestedAgent(filePath);\n return {\n allowed: false,\n reason: `File matches exclusion pattern for ${agentType} agent`,\n agentType,\n filePath,\n suggestedAgent,\n };\n }\n\n // Then check if it matches allowed patterns\n if (matchesAny(filePath, patterns.canEdit)) {\n return {\n allowed: true,\n reason: `File matches allowed pattern for ${agentType} agent`,\n agentType,\n filePath,\n };\n }\n\n // Not allowed by default\n const suggestedAgent = findSuggestedAgent(filePath);\n return {\n allowed: false,\n reason: `File does not match any allowed pattern for ${agentType} agent`,\n agentType,\n filePath,\n suggestedAgent,\n };\n }\n\n /**\n * Validate multiple file edits for an agent\n */\n function validateEdits(\n filePaths: string[],\n agentType: AgentType\n ): { valid: boolean; results: OwnershipCheckResult[] } {\n const results = filePaths.map((fp) => canEdit(fp, agentType));\n const valid = results.every((r) => r.allowed);\n return { valid, results };\n }\n\n /**\n * Get a human-readable description of what files an agent can edit\n */\n function describeAgentAccess(agentType: AgentType): string {\n const patterns = AGENT_FILE_PATTERNS[agentType];\n\n if (patterns.readOnly) {\n return `${agentType.toUpperCase()} agent: READ-ONLY (cannot edit any files)`;\n }\n\n const canEditStr = patterns.canEdit.join(\", \");\n const cannotEditStr = patterns.cannotEdit.join(\", \");\n\n return `${agentType.toUpperCase()} agent:\n Can edit: ${canEditStr}\n Cannot edit: ${cannotEditStr}`;\n }\n\n return {\n canEdit,\n validateEdits,\n describeAgentAccess,\n findSuggestedAgent,\n };\n}\n\n/**\n * Default expanded ownership checker\n */\nexport const defaultExpandedOwnershipChecker = createExpandedOwnershipChecker();\n\n/**\n * Get enforcement message for a file ownership violation\n */\nexport function getViolationMessage(result: OwnershipCheckResult): string {\n if (result.allowed) {\n return `File ${result.filePath} can be edited by ${result.agentType} agent`;\n }\n\n let message = `VIOLATION: Cannot edit ${result.filePath} with ${result.agentType} agent.\\n`;\n message += `Reason: ${result.reason}\\n`;\n\n if (result.suggestedAgent) {\n message += `Suggestion: This file should be edited by the ${result.suggestedAgent} agent.`;\n }\n\n return message;\n}\n","import type { SdlcConfig, SdlcFeatures } from \"../../shared/types.js\";\nimport {\n type AgentType,\n createExpandedOwnershipChecker,\n getViolationMessage,\n isReadOnlyAgent,\n} from \"../utils/expanded-file-ownership.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\n\nconst log = createPluginLogger(\"orchestrator-guard\");\n\n/**\n * Subagent types - now using the expanded file ownership system\n */\nexport type SubagentType = AgentType;\n\n/**\n * Session metadata for subagent tracking\n */\nexport interface SubagentSessionInfo {\n sessionId: string;\n agentType: SubagentType;\n startedAt: string;\n context: Record<string, unknown>;\n}\n\n/**\n * Tracks registered subagent sessions\n */\nconst subagentSessions = new Map<string, SubagentSessionInfo>();\n\n/**\n * Register a session as a subagent session\n *\n * Called by tools when they spawn subagent sessions.\n */\nexport function registerSubagentSession(\n sessionId: string,\n type: SubagentType,\n context: Record<string, unknown> = {}\n): void {\n log.debug(\"Registering subagent session\", { sessionId, type });\n subagentSessions.set(sessionId, {\n sessionId,\n agentType: type,\n startedAt: new Date().toISOString(),\n context,\n });\n}\n\n/**\n * Unregister a subagent session\n *\n * Called when a subagent session completes.\n */\nexport function unregisterSubagentSession(sessionId: string): void {\n log.debug(\"Unregistering subagent session\", { sessionId });\n subagentSessions.delete(sessionId);\n}\n\n/**\n * Check if a session is a registered subagent\n */\nexport function isSubagentSession(sessionId: string): boolean {\n return subagentSessions.has(sessionId);\n}\n\n/**\n * Get the subagent type for a session\n */\nexport function getSubagentType(sessionId: string): SubagentType | undefined {\n return subagentSessions.get(sessionId)?.agentType;\n}\n\n/**\n * Get full session info for a subagent session\n */\nexport function getSubagentSessionInfo(sessionId: string): SubagentSessionInfo | undefined {\n return subagentSessions.get(sessionId);\n}\n\n/**\n * Get sessions by agent type\n */\nexport function getSubagentSessionsByType(agentType: SubagentType): SubagentSessionInfo[] {\n return Array.from(subagentSessions.values()).filter((info) => info.agentType === agentType);\n}\n\n/**\n * Clear all registered subagent sessions\n * Useful for testing\n */\nexport function clearSubagentSessions(): void {\n subagentSessions.clear();\n}\n\n/**\n * Get count of registered subagent sessions\n * Useful for debugging\n */\nexport function getSubagentSessionCount(): number {\n return subagentSessions.size;\n}\n\n/**\n * Remove sessions older than the given age (ms)\n */\nexport function cleanupStaleSubagentSessions(maxAgeMs: number): number {\n const now = Date.now();\n let removed = 0;\n\n for (const [sessionId, info] of subagentSessions.entries()) {\n const startedAt = Date.parse(info.startedAt);\n if (!Number.isNaN(startedAt) && now - startedAt > maxAgeMs) {\n subagentSessions.delete(sessionId);\n removed++;\n }\n }\n\n if (removed > 0) {\n log.info(\"Cleaned up stale subagent sessions\", { removed });\n }\n\n return removed;\n}\n\n/**\n * File write tools that should be blocked in orchestrator context\n */\nconst FILE_WRITE_TOOLS = [\"Edit\", \"Write\", \"edit\", \"write\"];\n\ninterface BeforeHookInput {\n tool: string;\n sessionID: string;\n callID: string;\n}\n\ninterface BeforeHookOutput {\n args: unknown;\n}\n\n/**\n * Result of orchestrator guard check\n */\nexport interface GuardResult {\n allowed: boolean;\n reason: string;\n suggestion?: string;\n}\n\n/**\n * Extract file path from tool arguments\n */\nfunction extractFilePath(args: unknown): string | undefined {\n if (!args || typeof args !== \"object\") {\n return undefined;\n }\n\n const argsObj = args as Record<string, unknown>;\n\n // Edit tool uses filePath\n if (typeof argsObj.filePath === \"string\") {\n return argsObj.filePath;\n }\n\n // Write tool might use path or filePath\n if (typeof argsObj.path === \"string\") {\n return argsObj.path;\n }\n\n // Some tools use file\n if (typeof argsObj.file === \"string\") {\n return argsObj.file;\n }\n\n return undefined;\n}\n\n/**\n * Check if an edit is allowed for a subagent using the expanded ownership matrix\n */\nfunction checkSubagentAccess(\n filePath: string,\n subagentType: SubagentType,\n _config: SdlcConfig\n): GuardResult {\n // Use the expanded ownership checker for all agent types\n const checker = createExpandedOwnershipChecker();\n const result = checker.canEdit(filePath, subagentType);\n\n if (result.allowed) {\n return {\n allowed: true,\n reason: result.reason,\n };\n }\n\n // Format helpful suggestion based on agent type\n let suggestion: string | undefined;\n if (result.suggestedAgent) {\n suggestion = `Use sdlc_${result.suggestedAgent} to edit this file`;\n } else if (isReadOnlyAgent(subagentType)) {\n suggestion = \"This agent is read-only. Use a write-capable agent for file edits.\";\n }\n\n return {\n allowed: false,\n reason: getViolationMessage(result),\n suggestion,\n };\n}\n\n/**\n * Get orchestratorOnly feature setting from config\n * Handles both new-style SdlcFeatures and LegacyFeatures\n */\nfunction getOrchestratorOnlyEnabled(config: SdlcConfig): boolean {\n const features = config.features;\n if (!features) return false;\n\n // Check if it's new-style SdlcFeatures (has orchestratorOnly property)\n if (\"orchestratorOnly\" in features) {\n return (features as SdlcFeatures).orchestratorOnly;\n }\n\n // Legacy features don't have orchestratorOnly\n return false;\n}\n\n/**\n * Create the orchestrator guard hook\n *\n * Returns a before hook that enforces the orchestrator-only pattern.\n */\nexport function createOrchestratorGuard(config: SdlcConfig) {\n const enabled = getOrchestratorOnlyEnabled(config);\n\n return {\n /**\n * Before hook - checks if file writes are allowed\n *\n * Blocks Edit/Write in main orchestrator context.\n * For subagent sessions, enforces file ownership rules.\n */\n check: (input: BeforeHookInput, output: BeforeHookOutput): GuardResult => {\n // Feature not enabled - allow everything\n if (!enabled) {\n return { allowed: true, reason: \"orchestratorOnly feature not enabled\" };\n }\n\n // Not a file write tool - allow\n if (!FILE_WRITE_TOOLS.includes(input.tool)) {\n return { allowed: true, reason: `${input.tool} is not a file write tool` };\n }\n\n const filePath = extractFilePath(output.args);\n if (!filePath) {\n log.warn(\"Could not extract file path from tool args\", {\n tool: input.tool,\n args: output.args,\n });\n // Allow but log - we can't enforce what we can't detect\n return { allowed: true, reason: \"Could not determine target file path\" };\n }\n\n // Check if this is a subagent session\n const subagentType = getSubagentType(input.sessionID);\n\n if (subagentType) {\n // This is a subagent - check file ownership\n log.debug(\"Checking subagent file access\", {\n sessionID: input.sessionID,\n subagentType,\n filePath,\n });\n return checkSubagentAccess(filePath, subagentType, config);\n }\n\n // This is the main orchestrator - block the write\n log.info(\"Blocking file write from main orchestrator\", {\n tool: input.tool,\n filePath,\n sessionID: input.sessionID,\n });\n\n return {\n allowed: false,\n reason:\n \"Main orchestrator cannot write files directly. \" +\n \"All file operations must be delegated to specialized agents.\",\n suggestion:\n \"Use sdlc_red for test files, sdlc_green for implementation, \" +\n \"sdlc_domain for types, or sdlc_file_updater for config/docs.\",\n };\n },\n };\n}\n\n/**\n * Format a guard result as an error message for the agent\n */\nexport function formatGuardError(result: GuardResult): string {\n let message = `⛔ ORCHESTRATOR GUARD: ${result.reason}`;\n if (result.suggestion) {\n message += `\\n\\n💡 Suggestion: ${result.suggestion}`;\n }\n return message;\n}\n","import { createPluginLogger } from \"./plugin-logger.js\";\n\nconst log = createPluginLogger(\"issue-parser\");\n\nexport interface ParsedAcceptanceCriterion {\n id: string;\n text: string;\n checked: boolean;\n}\n\nconst CHECKBOX_PATTERN = /^\\s*- \\[([ xX])\\] (.+)$/;\nconst AC_HEADER_PATTERN = /^#+\\s+Acceptance Criteria/i;\n\n/**\n * Parse acceptance criteria from a GitHub issue body.\n */\nexport function parseAcceptanceCriteria(body: string | null): ParsedAcceptanceCriterion[] {\n if (!body) return [];\n\n const lines = body.split(\"\\n\");\n const criteria: ParsedAcceptanceCriterion[] = [];\n let inAcSection = false;\n let index = 0;\n\n for (const line of lines) {\n if (AC_HEADER_PATTERN.test(line)) {\n inAcSection = true;\n continue;\n }\n\n if (inAcSection && line.startsWith(\"#\")) {\n // Reached next header\n break;\n }\n\n if (!inAcSection) continue;\n\n const match = line.match(CHECKBOX_PATTERN);\n if (!match) continue;\n\n index++;\n const checked = match[1].toLowerCase() === \"x\";\n const text = match[2].trim();\n\n criteria.push({\n id: `AC${index}`,\n text,\n checked,\n });\n }\n\n if (criteria.length === 0) {\n log.debug(\"No acceptance criteria found in issue body\");\n }\n\n return criteria;\n}\n","import type { OpenCodeTodo } from \"../../shared/types.js\";\nimport { parseAcceptanceCriteria } from \"./issue-parser.js\";\nimport { createPluginLogger } from \"./plugin-logger.js\";\n\nconst log = createPluginLogger(\"issue-todo-sync\");\n\nexport const ISSUE_TODO_SEPARATOR = \"Δ\";\n\nexport interface IssueTodo {\n id: string;\n issueNumber: number;\n section: string;\n index: number;\n text: string;\n checked: boolean;\n}\n\n/**\n * Convert issue acceptance criteria into OpenCode todos.\n */\nexport function issueCriteriaToTodos(issueNumber: number, body: string | null): OpenCodeTodo[] {\n const criteria = parseAcceptanceCriteria(body);\n return criteria.map((item, index) => ({\n id: `${issueNumber}:ac:${index + 1}`,\n content: `[#${issueNumber}${ISSUE_TODO_SEPARATOR}AC${index + 1}] ${item.text}`,\n status: item.checked ? \"completed\" : \"pending\",\n priority: \"high\",\n }));\n}\n\n/**\n * Parse issue todo ID into parts.\n */\nconst ISSUE_TODO_PATTERN = /^\\s*\\[#\\d+Δ/;\n\nexport function parseIssueTodoId(todoId: string): IssueTodo | null {\n const parts = todoId.split(\":\");\n if (parts.length !== 3) return null;\n\n const [issueStr, section, indexStr] = parts;\n const issueNumber = Number.parseInt(issueStr, 10);\n const index = Number.parseInt(indexStr, 10);\n if (!issueNumber || !index) return null;\n\n return {\n id: todoId,\n issueNumber,\n section,\n index,\n text: \"\",\n checked: false,\n };\n}\n\nexport function isIssueTodo(todo: OpenCodeTodo): boolean {\n return ISSUE_TODO_PATTERN.test(todo.content);\n}\n\n/**\n * Update a GitHub issue body to toggle a checkbox.\n */\nexport async function updateIssueCheckbox(\n issueBody: string,\n criterionIndex: number,\n checked: boolean\n): Promise<string> {\n const lines = issueBody.split(\"\\n\");\n let currentIndex = 0;\n let inAcSection = false;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (/^#+\\s+Acceptance Criteria/i.test(line)) {\n inAcSection = true;\n continue;\n }\n if (inAcSection && line.startsWith(\"#\")) {\n break;\n }\n if (!inAcSection) continue;\n\n const match = line.match(/^\\s*- \\[([ xX])\\] (.+)$/);\n if (!match) continue;\n\n currentIndex++;\n if (currentIndex === criterionIndex) {\n lines[i] = line.replace(/- \\[[ xX]\\]/, checked ? \"- [x]\" : \"- [ ]\");\n break;\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Merge new issue todos with existing ones.\n */\nexport function mergeIssueTodos(\n existing: OpenCodeTodo[],\n newTodos: OpenCodeTodo[]\n): OpenCodeTodo[] {\n const userTodos = existing.filter((t) => !t.content.includes(ISSUE_TODO_SEPARATOR));\n return [...userTodos, ...newTodos];\n}\n\n/**\n * Sync todo completion back to issue body.\n */\nexport async function syncTodoCompletion(\n issueNumber: number,\n todo: OpenCodeTodo,\n previousTodos: OpenCodeTodo[],\n issueBody: string\n): Promise<string | null> {\n const prev = previousTodos.find((t) => t.id === todo.id);\n if (!prev || prev.status === todo.status) return null;\n\n const parsed = parseIssueTodoId(todo.id);\n if (!parsed) return null;\n\n const checked = todo.status === \"completed\";\n const updatedBody = await updateIssueCheckbox(issueBody, parsed.index, checked);\n\n log.info(\"Updated issue checkbox\", { issueNumber, criterionIndex: parsed.index, checked });\n return updatedBody;\n}\n","import type { OpenCodeTodo, SdlcConfig } from \"../../shared/types.js\";\nimport type { IssueTracker } from \"../tracker/issue-tracker.js\";\nimport {\n issueCriteriaToTodos,\n mergeIssueTodos,\n syncTodoCompletion,\n} from \"../utils/issue-todo-sync.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\n\nconst log = createPluginLogger(\"todo-hooks\");\n\nexport interface TodoSyncPaths {\n issueNumber: number;\n}\n\nexport interface IssueLoadedResult {\n mergedTodos: OpenCodeTodo[];\n newIssueTodos: OpenCodeTodo[];\n}\n\nexport async function onIssueLoaded(\n tracker: IssueTracker,\n config: SdlcConfig,\n issueNumber: number,\n issueBody: string | null\n): Promise<IssueLoadedResult> {\n if (!config.features.todoSync) {\n return { mergedTodos: [], newIssueTodos: [] };\n }\n\n const newIssueTodos = issueCriteriaToTodos(issueNumber, issueBody);\n const existingTodos = tracker.getCurrentTodos() || [];\n const mergedTodos = mergeIssueTodos(existingTodos, newIssueTodos);\n\n await tracker.setCurrentTodos(mergedTodos);\n\n log.info(\"Synced issue acceptance criteria to todos\", {\n issueNumber,\n newTodos: newIssueTodos.length,\n totalTodos: mergedTodos.length,\n });\n\n return { mergedTodos, newIssueTodos };\n}\n\nexport async function onTodoWritten(\n tracker: IssueTracker,\n config: SdlcConfig,\n _paths: TodoSyncPaths,\n todos: OpenCodeTodo[]\n): Promise<string | null> {\n if (!config.features.todoSync) {\n return null;\n }\n\n const previousTodos = tracker.getCurrentTodos() || [];\n const currentIssue = tracker.getCurrentIssue();\n\n if (!currentIssue) {\n return null;\n }\n\n let updatedBody: string | null = null;\n\n for (const todo of todos) {\n const updated = await syncTodoCompletion(\n currentIssue.issueNumber,\n todo,\n previousTodos,\n currentIssue.body ?? \"\"\n );\n if (updated) {\n updatedBody = updated;\n }\n }\n\n if (updatedBody) {\n await tracker.updateIssueBody(updatedBody);\n log.info(\"Issue todos updated\", { issueNumber: currentIssue.issueNumber });\n }\n\n await tracker.setCurrentTodos(todos);\n return updatedBody;\n}\n","/**\n * Tool execution hooks\n *\n * Implements safety net warnings for git operations and issue todo synchronization.\n */\n\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { OpenCodeTodo, SdlcConfig } from \"../../shared/types.js\";\nimport type { IssueTracker } from \"../tracker/issue-tracker.js\";\nimport { updateIssueBody } from \"../utils/github-issues.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\nimport { createOrchestratorGuard, formatGuardError } from \"./orchestrator-guard.js\";\nimport { onIssueLoaded, onTodoWritten } from \"./todo-hooks.js\";\n\nconst log = createPluginLogger(\"tool-hooks\");\n\ninterface BeforeHookInput {\n tool: string;\n sessionID: string;\n callID: string;\n}\n\ninterface BeforeHookOutput {\n args: unknown;\n}\n\ninterface AfterHookInput {\n tool: string;\n sessionID: string;\n callID: string;\n}\n\ninterface AfterHookOutput {\n title: string;\n output: string;\n metadata: unknown;\n}\n\n/**\n * Git write operations that modify repository state.\n * These require explicit user permission when autoGitOperations is disabled.\n */\nconst GIT_WRITE_COMMANDS = [\n // Standard git commands\n \"git commit\",\n \"git push\",\n \"git checkout -b\",\n \"git branch\",\n \"git switch -c\",\n \"git switch --create\",\n \"git merge\",\n \"git rebase\",\n \"git cherry-pick\",\n \"git stash\",\n \"git tag\",\n \"git reset\",\n // Git-spice commands (stacked PRs workflow)\n \"gs branch create\",\n \"gs commit create\",\n \"gs stack submit\",\n \"gs restack\",\n \"gs branch delete\",\n \"gs up\",\n \"gs down\",\n // GitHub CLI commands\n \"gh pr create\",\n \"gh pr edit\",\n \"gh pr merge\",\n \"gh pr close\",\n \"gh pr review\",\n \"gh issue create\",\n \"gh issue edit\",\n \"gh issue close\",\n \"gh release create\",\n \"gh release edit\",\n \"gh release delete\",\n];\n\nfunction getBashCommand(metadata: unknown): string {\n if (!metadata || typeof metadata !== \"object\") {\n return \"\";\n }\n\n const cmd = (metadata as Record<string, unknown>).command;\n return typeof cmd === \"string\" ? cmd : \"\";\n}\n\nfunction containsGitWriteCommand(command: string): boolean {\n const normalized = command.trim().toLowerCase();\n\n // Split by common shell separators to check each command segment\n // This prevents false positives from strings like: echo \"git commit\"\n const segments = normalized.split(/[;&|]+/).map((s) => s.trim());\n\n return segments.some((segment) =>\n GIT_WRITE_COMMANDS.some((gitCmd) => segment.startsWith(gitCmd.toLowerCase()))\n );\n}\n\nexport function createToolHooks(ctx: PluginInput, tracker: IssueTracker, config: SdlcConfig) {\n // Create orchestrator guard for blocking file writes from main context\n const orchestratorGuard = createOrchestratorGuard(config);\n\n return {\n before: async (input: BeforeHookInput, output: BeforeHookOutput): Promise<void> => {\n // Check orchestrator guard for file write operations\n const guardResult = orchestratorGuard.check(input, output);\n\n if (!guardResult.allowed) {\n // Throw an error to block the operation\n // The error message will be shown to the agent\n throw new Error(formatGuardError(guardResult));\n }\n },\n\n after: async (input: AfterHookInput, output: AfterHookOutput): Promise<void> => {\n // Check for autoGitOperations in legacy features, default to false for new features\n const autoGitOperations =\n \"autoGitOperations\" in config.features\n ? (config.features as import(\"../../shared/types.js\").LegacyFeatures).autoGitOperations\n : false;\n\n if (!autoGitOperations && input.tool === \"bash\") {\n const command = getBashCommand(output.metadata);\n\n if (containsGitWriteCommand(command)) {\n log.warn(\"Git write operation detected\", { command: command.slice(0, 100) });\n output.output +=\n \"\\n\\n⚠️ SDLC GIT OPERATIONS POLICY REMINDER:\\n\" +\n \"Git operations should only be performed when explicitly requested by the user.\\n\" +\n \"If this command was run automatically (not requested by the user), please:\\n\" +\n \"1. Ask the user before proceeding with further git operations\\n\" +\n \"2. Use sdlc_update_issue_status() to track issue progress instead of git commits\\n\" +\n \"\\n\" +\n \"To enable automatic git operations, set features.autoGitOperations=true in sdlc.json (legacy)\\n\" +\n \"or configure git.workflow in sdlc.json (v0.3.0+)\";\n }\n }\n\n // Check for todoSync in both old and new features\n const todoSyncEnabled = config.features.todoSync;\n\n if (input.tool === \"sdlc_get_issue\" && todoSyncEnabled) {\n await handleIssueLoaded(tracker, config, output);\n }\n\n if (input.tool === \"todowrite\" && todoSyncEnabled) {\n await handleTodoWritten(ctx, tracker, config, output);\n }\n },\n };\n}\n\nasync function handleIssueLoaded(\n tracker: IssueTracker,\n config: SdlcConfig,\n output: AfterHookOutput\n): Promise<void> {\n try {\n const result = JSON.parse(output.output);\n if (!result.issueNumber || !result.body) {\n log.debug(\"Issue load response missing issueNumber or body\");\n return;\n }\n\n log.debug(\"Processing issue load for todo sync\", { issueNumber: result.issueNumber });\n\n const { newIssueTodos, mergedTodos } = await onIssueLoaded(\n tracker,\n config,\n result.issueNumber,\n result.body\n );\n\n if (newIssueTodos.length > 0) {\n result.todos = {\n hint: \"Call todowrite with these todos to populate your task list. Marking todos complete updates GitHub issue checkboxes automatically.\",\n items: newIssueTodos,\n };\n output.output = JSON.stringify(result, null, 2);\n\n log.debug(\"Injected issue todos into response\", {\n issueNumber: result.issueNumber,\n newTodos: newIssueTodos.length,\n totalTracked: mergedTodos.length,\n });\n } else {\n log.debug(\"No acceptance criteria todos found\", { issueNumber: result.issueNumber });\n }\n } catch (error) {\n log.warn(\"Failed to process issue for todo sync\", { error: String(error) });\n }\n}\n\nasync function handleTodoWritten(\n ctx: PluginInput,\n tracker: IssueTracker,\n config: SdlcConfig,\n output: AfterHookOutput\n): Promise<void> {\n const todos = extractTodosFromOutput(output);\n\n if (!todos || todos.length === 0) {\n log.debug(\"No todos found in todowrite output\");\n return;\n }\n\n try {\n const currentIssue = tracker.getCurrentIssue();\n if (!currentIssue) {\n return;\n }\n const updatedBody = await onTodoWritten(\n tracker,\n config,\n { issueNumber: currentIssue.issueNumber },\n todos\n );\n if (updatedBody) {\n await updateIssueBody(ctx, config, currentIssue.issueNumber, updatedBody);\n }\n } catch (error) {\n log.warn(\"Error processing todowrite for issue sync\", { error: String(error) });\n }\n}\n\nfunction extractTodosFromOutput(output: AfterHookOutput): OpenCodeTodo[] | null {\n const metadata = output.metadata as Record<string, unknown> | undefined;\n if (metadata?.todos && Array.isArray(metadata.todos)) {\n log.debug(\"Extracted todos from metadata\", { count: metadata.todos.length });\n return metadata.todos as OpenCodeTodo[];\n }\n\n try {\n const result = JSON.parse(output.output);\n if (Array.isArray(result)) {\n log.debug(\"Extracted todos from output (array)\", { count: result.length });\n return result as OpenCodeTodo[];\n }\n if (result?.todos && Array.isArray(result.todos)) {\n log.debug(\"Extracted todos from output.todos\", { count: result.todos.length });\n return result.todos as OpenCodeTodo[];\n }\n } catch {\n log.debug(\"Could not parse output as JSON\");\n }\n\n return null;\n}\n","import type { OpenCodeTodo, SdlcConfig } from \"../../shared/types.js\";\nimport type { IssueTracker } from \"../tracker/issue-tracker.js\";\nimport { isIssueTodo } from \"../utils/issue-todo-sync.js\";\n\ninterface CompactionInput {\n sessionID: string;\n}\n\ninterface CompactionOutput {\n context: string[];\n}\n\nconst PRIORITY_ORDER: Record<string, number> = { high: 0, medium: 1, low: 2 };\n\nexport function createCompactionHook(tracker: IssueTracker, config: SdlcConfig) {\n void config;\n return async (_input: CompactionInput, output: CompactionOutput): Promise<void> => {\n const issueContext = await tracker.getCurrentIssueContext();\n const todos = tracker.getCurrentTodos();\n const currentIssue = tracker.getCurrentIssue();\n\n const parts: string[] = [];\n\n if (todos && todos.length > 0) {\n const issueTodos = todos.filter((todo: OpenCodeTodo) => isIssueTodo(todo));\n const pending = issueTodos.filter((todo: OpenCodeTodo) => todo.status === \"pending\");\n const inProgress = issueTodos.filter((todo: OpenCodeTodo) => todo.status === \"in_progress\");\n\n if (issueTodos.length > 0 && (pending.length > 0 || inProgress.length > 0)) {\n parts.push(\"## ⚠️ MANDATORY POST-COMPACTION PROTOCOL\");\n parts.push(\"\");\n parts.push(\"**STOP. Before doing ANYTHING else:**\");\n parts.push(\"1. Call `todoread` to get your current task list\");\n parts.push(\"2. Review the todos below and compare to any 'next steps' you see\");\n parts.push(\"3. If any todo is marked `in_progress`, complete it FIRST\");\n parts.push(\"4. The TODO LIST is your source of truth, not the compaction summary\");\n parts.push(\"\");\n\n if (inProgress.length > 0) {\n parts.push(\"### 🔄 IN PROGRESS (Complete these FIRST):\");\n for (const todo of inProgress) {\n parts.push(`- ${todo.content}`);\n }\n parts.push(\"\");\n }\n\n if (pending.length > 0) {\n parts.push(\"### ⏳ PENDING (Work queue):\");\n const sortedPending = pending.sort(\n (a: OpenCodeTodo, b: OpenCodeTodo) =>\n (PRIORITY_ORDER[a.priority] ?? 99) - (PRIORITY_ORDER[b.priority] ?? 99)\n );\n\n const todosToShow = sortedPending.slice(0, 10);\n for (const todo of todosToShow) {\n parts.push(`- ${todo.content}`);\n }\n\n if (pending.length > 10) {\n parts.push(` ... and ${pending.length - 10} more (call todoread for full list)`);\n }\n parts.push(\"\");\n }\n\n parts.push(\"### ✅ VERIFICATION REQUIRED\");\n parts.push(\"Call `todoread` NOW to confirm this matches your working state.\");\n parts.push(\n \"If it doesn't match, the todo list takes priority over any 'next steps' in this summary.\"\n );\n parts.push(\"\");\n parts.push(\"---\");\n parts.push(\"\");\n }\n }\n\n if (issueContext) {\n parts.push(\"## OpenCode SDLC - Current Issue Context\");\n parts.push(\"\");\n parts.push(issueContext);\n if (currentIssue) {\n parts.push(`**Issue:** #${currentIssue.issueNumber}`);\n }\n parts.push(\"\");\n }\n\n if (todos && todos.length > 0) {\n const issueTodos = todos.filter((todo: OpenCodeTodo) => isIssueTodo(todo));\n const pendingCount = issueTodos.filter(\n (todo: OpenCodeTodo) => todo.status === \"pending\"\n ).length;\n const inProgressCount = issueTodos.filter(\n (todo: OpenCodeTodo) => todo.status === \"in_progress\"\n ).length;\n const completedCount = issueTodos.filter(\n (todo: OpenCodeTodo) => todo.status === \"completed\"\n ).length;\n\n if (issueTodos.length > 0) {\n parts.push(\"## Todo Sync (Issues ↔ Todos)\");\n parts.push(\"\");\n parts.push(`**Progress:** ${completedCount}/${issueTodos.length} issue tasks complete`);\n parts.push(`**Remaining:** ${pendingCount} pending, ${inProgressCount} in progress`);\n parts.push(\"\");\n parts.push(\"**How todos work:**\");\n parts.push(\"- Format: `[#<issueNumber>ΔAC1] {task}`\");\n parts.push(\"- Marking a todo complete updates the issue checkbox automatically\");\n parts.push(\"- For task details, open the GitHub issue\");\n parts.push(\"\");\n if (currentIssue) {\n parts.push(\"**To look up task context:**\");\n parts.push(\"```\");\n parts.push(`sdlc_get_issue(${currentIssue.issueNumber})`);\n parts.push(\"```\");\n parts.push(\"\");\n }\n }\n }\n\n if (issueContext || (todos && todos.length > 0)) {\n parts.push(\n \"IMPORTANT: You are implementing a GitHub issue. Use sdlc_get_issue to reload full context if needed. Use sdlc_update_issue_status to update the issue status when complete.\"\n );\n parts.push(\"\");\n\n output.context.push(parts.join(\"\\n\"));\n }\n };\n}\n","/**\n * TDD Cycle State Tracker (v1.0.0+)\n *\n * Tracks the state of the TDD cycle: RED → DOMAIN → GREEN → DOMAIN\n * Ensures the cycle is followed correctly and provides state persistence.\n *\n * Key features:\n * - Enforces RED → DOMAIN → GREEN → DOMAIN flow\n * - Tracks domain debate rounds with configurable max\n * - Supports user override after escalation\n * - Persists state across sessions\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { z } from \"zod\";\nimport type { TddPhase } from \"../utils/tdd-file-ownership.js\";\n\n/**\n * Default max debate rounds before escalation to user\n */\nexport const DEFAULT_MAX_DEBATE_ROUNDS = 2;\n\n/**\n * Valid transitions in the TDD cycle\n */\nexport const VALID_TRANSITIONS: Record<TddPhase | \"initial\", TddPhase[]> = {\n initial: [\"red\"], // Can only start with RED\n red: [\"domain\"], // RED must be followed by DOMAIN\n domain: [\"green\", \"red\"], // DOMAIN can go to GREEN or back to RED (if veto)\n green: [\"domain\"], // GREEN must be followed by DOMAIN\n};\n\n/**\n * TDD cycle states\n */\nexport type CycleState =\n | \"idle\" // No active TDD cycle\n | \"red_in_progress\" // Writing a failing test\n | \"red_complete\" // Test written and fails\n | \"domain_review_red\" // Domain review after RED\n | \"domain_approved_red\" // Domain approved after RED\n | \"domain_vetoed\" // Domain vetoed, must fix\n | \"awaiting_escalation\" // Max debate rounds reached, awaiting user decision\n | \"user_override\" // User overrode domain veto\n | \"green_in_progress\" // Writing implementation\n | \"green_complete\" // Implementation written, test passes\n | \"domain_review_green\" // Domain review after GREEN\n | \"domain_approved_green\" // Domain approved after GREEN, cycle complete\n | \"cycle_complete\"; // Full cycle complete, ready for next\n\n/**\n * Domain concern raised during review\n */\nexport interface DomainConcern {\n /** Unique ID for this concern */\n id: string;\n /** Type of concern */\n type: \"type_safety\" | \"naming\" | \"architecture\" | \"behavior\" | \"other\";\n /** Description of the concern */\n description: string;\n /** Suggested resolution */\n suggestion?: string;\n /** Files affected */\n affectedFiles?: string[];\n /** Whether this concern has been addressed */\n resolved: boolean;\n /** How it was resolved */\n resolution?: \"fixed\" | \"user_override\" | \"dismissed\";\n /** Resolution notes */\n resolutionNotes?: string;\n}\n\n/**\n * A single debate round between agent and domain\n */\nexport interface DebateRound {\n /** Round number (1-based) */\n round: number;\n /** Timestamp of this round */\n timestamp: string;\n /** Context: after RED or after GREEN */\n context: \"red\" | \"green\";\n /** Concerns raised by domain */\n concerns: DomainConcern[];\n /** Agent's response/changes made */\n agentResponse?: string;\n /** Files modified in response */\n filesModified?: string[];\n /** Outcome of this round */\n outcome: \"approved\" | \"vetoed\" | \"escalated\";\n}\n\n/**\n * A single cycle entry with timestamps and proof\n */\nexport interface CycleEntry {\n phase: TddPhase;\n state: CycleState;\n timestamp: string;\n testName?: string;\n testFile?: string;\n failureMessage?: string;\n implementationFiles?: string[];\n typesCreated?: string[];\n domainApproved?: boolean;\n vetoReason?: string;\n proof?: string;\n /** Debate round number if this is a domain review */\n debateRound?: number;\n /** Concerns raised in this entry */\n concerns?: DomainConcern[];\n}\n\n/**\n * Persisted TDD cycle state\n */\nexport interface TddCycleState {\n /** Current issue being worked on */\n currentIssue: number | null;\n /** Current acceptance criterion */\n currentAC?: string;\n /** Session ID */\n sessionId: string;\n /** Project directory */\n projectDir: string;\n /** Current state in the cycle */\n currentState: CycleState;\n /** Current phase */\n currentPhase: TddPhase | null;\n /** Cycle history for current issue */\n cycleHistory: CycleEntry[];\n /** Number of completed RED-GREEN cycles */\n cyclesCompleted: number;\n /** Last RED phase output (for GREEN phase reference) */\n lastRedOutput?: {\n testName: string;\n testFile: string;\n failureMessage: string;\n };\n /** Last DOMAIN phase output */\n lastDomainOutput?: {\n approved: boolean;\n typesCreated: string[];\n vetoReason?: string;\n };\n /** Current debate round number (resets each domain review) */\n currentDebateRound: number;\n /** Max debate rounds before escalation */\n maxDebateRounds: number;\n /** Debate history for current domain review */\n debateHistory: DebateRound[];\n /** Active concerns that need resolution */\n activeConcerns: DomainConcern[];\n /** Whether user has overridden domain in current cycle */\n userOverrideActive: boolean;\n}\n\n/**\n * Zod schema for validating loaded TDD cycle state\n * This protects against malicious or corrupted state files\n */\nconst TddCycleStateSchema = z\n .object({\n currentIssue: z.number().nullable(),\n currentAC: z.string().optional(),\n sessionId: z.string(),\n projectDir: z.string(),\n currentState: z.string(),\n currentPhase: z.string().nullable(),\n cycleHistory: z.array(\n z.object({\n phase: z.string(),\n state: z.string(),\n timestamp: z.string(),\n testName: z.string().optional(),\n testFile: z.string().optional(),\n failureMessage: z.string().optional(),\n implementationFiles: z.array(z.string()).optional(),\n typesCreated: z.array(z.string()).optional(),\n domainApproved: z.boolean().optional(),\n vetoReason: z.string().optional(),\n proof: z.string().optional(),\n debateRound: z.number().optional(),\n concerns: z.array(z.unknown()).optional(),\n })\n ),\n cyclesCompleted: z.number(),\n lastRedOutput: z\n .object({\n testName: z.string(),\n testFile: z.string(),\n failureMessage: z.string(),\n })\n .optional(),\n lastDomainOutput: z\n .object({\n approved: z.boolean(),\n typesCreated: z.array(z.string()),\n vetoReason: z.string().optional(),\n })\n .optional(),\n currentDebateRound: z.number().optional(),\n maxDebateRounds: z.number().optional(),\n debateHistory: z.array(z.unknown()).optional(),\n activeConcerns: z.array(z.unknown()).optional(),\n userOverrideActive: z.boolean().optional(),\n })\n .passthrough();\n\n/**\n * Default state path\n */\nconst DEFAULT_STATE_PATH = join(\n process.env.HOME || \"~\",\n \".config\",\n \"opencode\",\n \"sdlc-tdd-state.json\"\n);\n\n/**\n * Create a default TDD cycle state\n */\nfunction createDefaultState(\n projectDir: string,\n sessionId: string,\n maxDebateRounds: number = DEFAULT_MAX_DEBATE_ROUNDS\n): TddCycleState {\n return {\n currentIssue: null,\n sessionId,\n projectDir,\n currentState: \"idle\",\n currentPhase: null,\n cycleHistory: [],\n cyclesCompleted: 0,\n currentDebateRound: 0,\n maxDebateRounds,\n debateHistory: [],\n activeConcerns: [],\n userOverrideActive: false,\n };\n}\n\n/**\n * TDD Cycle Tracker class\n */\nexport class TddCycleTracker {\n private state: TddCycleState;\n private statePath: string;\n\n constructor(\n projectDir: string,\n sessionId: string,\n statePath?: string,\n maxDebateRounds: number = DEFAULT_MAX_DEBATE_ROUNDS\n ) {\n this.statePath = statePath ?? DEFAULT_STATE_PATH;\n this.state = this.loadState(projectDir, sessionId, maxDebateRounds);\n }\n\n /**\n * Load state from disk or create new state\n */\n private loadState(projectDir: string, sessionId: string, maxDebateRounds: number): TddCycleState {\n try {\n if (existsSync(this.statePath)) {\n const rawData = JSON.parse(readFileSync(this.statePath, \"utf-8\"));\n\n // Validate the loaded data against schema to protect against malicious/corrupted files\n const parseResult = TddCycleStateSchema.safeParse(rawData);\n if (!parseResult.success) {\n console.warn(\n \"TDD state file failed validation, creating new state:\",\n parseResult.error.message\n );\n return createDefaultState(projectDir, sessionId, maxDebateRounds);\n }\n\n const data = parseResult.data as Partial<TddCycleState>;\n\n // If same session and project, return existing state (with defaults for new fields)\n if (data.sessionId === sessionId && data.projectDir === projectDir) {\n return {\n ...createDefaultState(projectDir, sessionId, maxDebateRounds),\n ...data,\n // Ensure new fields have defaults if loading old state\n currentDebateRound: data.currentDebateRound ?? 0,\n maxDebateRounds: data.maxDebateRounds ?? maxDebateRounds,\n debateHistory: data.debateHistory ?? [],\n activeConcerns: data.activeConcerns ?? [],\n userOverrideActive: data.userOverrideActive ?? false,\n };\n }\n\n // Different session/project, reset state\n return createDefaultState(projectDir, sessionId, maxDebateRounds);\n }\n } catch {\n // Ignore load errors, create new state\n }\n\n return createDefaultState(projectDir, sessionId, maxDebateRounds);\n }\n\n /**\n * Save state to disk\n */\n private saveState(): void {\n try {\n const dir = dirname(this.statePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(this.statePath, JSON.stringify(this.state, null, 2));\n } catch (error) {\n console.error(\"Failed to save TDD cycle state:\", error);\n }\n }\n\n /**\n * Get current state\n */\n getState(): TddCycleState {\n return { ...this.state };\n }\n\n /**\n * Start working on an issue\n */\n startIssue(issueNumber: number, acceptanceCriterion?: string): void {\n this.state.currentIssue = issueNumber;\n this.state.currentAC = acceptanceCriterion;\n this.state.currentState = \"idle\";\n this.state.currentPhase = null;\n this.state.cycleHistory = [];\n this.state.cyclesCompleted = 0;\n this.state.lastRedOutput = undefined;\n this.state.lastDomainOutput = undefined;\n // Reset debate state\n this.state.currentDebateRound = 0;\n this.state.debateHistory = [];\n this.state.activeConcerns = [];\n this.state.userOverrideActive = false;\n this.saveState();\n }\n\n /**\n * Check if a transition to a phase is valid\n */\n canTransitionTo(phase: TddPhase): { valid: boolean; reason: string } {\n const currentPhaseOrInitial = this.state.currentPhase ?? \"initial\";\n const validNextPhases = VALID_TRANSITIONS[currentPhaseOrInitial];\n\n if (validNextPhases.includes(phase)) {\n return {\n valid: true,\n reason: `Transition from ${currentPhaseOrInitial} to ${phase} is valid`,\n };\n }\n\n return {\n valid: false,\n reason: `Invalid transition: Cannot go from ${currentPhaseOrInitial} to ${phase}. Valid next phases: ${validNextPhases.join(\", \")}`,\n };\n }\n\n /**\n * Start RED phase\n */\n startRed(): { success: boolean; error?: string } {\n const canTransition = this.canTransitionTo(\"red\");\n if (!canTransition.valid) {\n return { success: false, error: canTransition.reason };\n }\n\n this.state.currentPhase = \"red\";\n this.state.currentState = \"red_in_progress\";\n this.addCycleEntry({\n phase: \"red\",\n state: \"red_in_progress\",\n timestamp: new Date().toISOString(),\n });\n this.saveState();\n return { success: true };\n }\n\n /**\n * Complete RED phase\n */\n completeRed(\n testName: string,\n testFile: string,\n failureMessage: string\n ): { success: boolean; error?: string } {\n if (this.state.currentState !== \"red_in_progress\") {\n return { success: false, error: \"RED phase not in progress\" };\n }\n\n this.state.currentState = \"red_complete\";\n this.state.lastRedOutput = { testName, testFile, failureMessage };\n this.addCycleEntry({\n phase: \"red\",\n state: \"red_complete\",\n timestamp: new Date().toISOString(),\n testName,\n testFile,\n failureMessage,\n });\n this.saveState();\n return { success: true };\n }\n\n /**\n * Start DOMAIN review phase\n */\n startDomain(context: \"red\" | \"green\"): { success: boolean; error?: string } {\n const expectedPreviousState = context === \"red\" ? \"red_complete\" : \"green_complete\";\n const isReviewAfterVeto = this.state.currentState === \"domain_vetoed\";\n const isUserOverride = this.state.currentState === \"user_override\";\n const isAwaitingEscalation = this.state.currentState === \"awaiting_escalation\";\n\n // Allow continuing domain review after veto/escalation (same context)\n // Otherwise check normal transition rules\n if (!isReviewAfterVeto && !isUserOverride && !isAwaitingEscalation) {\n const canTransition = this.canTransitionTo(\"domain\");\n if (!canTransition.valid) {\n return { success: false, error: canTransition.reason };\n }\n\n if (this.state.currentState !== expectedPreviousState) {\n return {\n success: false,\n error: `Cannot start DOMAIN review: expected state ${expectedPreviousState}, got ${this.state.currentState}`,\n };\n }\n\n // Reset debate state for new domain review\n this.state.currentDebateRound = 0;\n this.state.debateHistory = [];\n this.state.activeConcerns = [];\n }\n\n // Increment debate round\n this.state.currentDebateRound++;\n\n this.state.currentPhase = \"domain\";\n this.state.currentState = context === \"red\" ? \"domain_review_red\" : \"domain_review_green\";\n this.addCycleEntry({\n phase: \"domain\",\n state: this.state.currentState,\n timestamp: new Date().toISOString(),\n debateRound: this.state.currentDebateRound,\n });\n this.saveState();\n return { success: true };\n }\n\n /**\n * Complete DOMAIN review with approval\n */\n approveDomain(typesCreated: string[] = []): { success: boolean; error?: string } {\n if (\n this.state.currentState !== \"domain_review_red\" &&\n this.state.currentState !== \"domain_review_green\"\n ) {\n return { success: false, error: \"DOMAIN review not in progress\" };\n }\n\n const wasReviewingRed = this.state.currentState === \"domain_review_red\";\n const context = wasReviewingRed ? \"red\" : \"green\";\n this.state.currentState = wasReviewingRed ? \"domain_approved_red\" : \"domain_approved_green\";\n this.state.lastDomainOutput = { approved: true, typesCreated };\n\n // Record debate round outcome\n this.state.debateHistory.push({\n round: this.state.currentDebateRound,\n timestamp: new Date().toISOString(),\n context,\n concerns: [...this.state.activeConcerns],\n outcome: \"approved\",\n });\n\n // Clear active concerns\n this.state.activeConcerns = [];\n\n this.addCycleEntry({\n phase: \"domain\",\n state: this.state.currentState,\n timestamp: new Date().toISOString(),\n domainApproved: true,\n typesCreated,\n debateRound: this.state.currentDebateRound,\n });\n\n if (!wasReviewingRed) {\n // Cycle complete after GREEN + DOMAIN approval\n this.state.currentState = \"cycle_complete\";\n this.state.cyclesCompleted++;\n this.state.currentPhase = null;\n // Reset debate state for next cycle\n this.state.currentDebateRound = 0;\n this.state.userOverrideActive = false;\n }\n\n this.saveState();\n return { success: true };\n }\n\n /**\n * Complete DOMAIN review with veto (raises concerns)\n */\n vetoDomain(\n reason: string,\n concerns: DomainConcern[] = []\n ): { success: boolean; error?: string; escalate?: boolean } {\n if (\n this.state.currentState !== \"domain_review_red\" &&\n this.state.currentState !== \"domain_review_green\"\n ) {\n return { success: false, error: \"DOMAIN review not in progress\" };\n }\n\n const wasReviewingRed = this.state.currentState === \"domain_review_red\";\n const context = wasReviewingRed ? \"red\" : \"green\";\n\n // Add concerns to active list\n if (concerns.length > 0) {\n this.state.activeConcerns.push(...concerns);\n } else {\n // Create a generic concern from the reason\n this.state.activeConcerns.push({\n id: `concern-${Date.now()}`,\n type: \"other\",\n description: reason,\n resolved: false,\n });\n }\n\n // Check if we need to escalate\n const shouldEscalate = this.state.currentDebateRound >= this.state.maxDebateRounds;\n\n if (shouldEscalate) {\n this.state.currentState = \"awaiting_escalation\";\n } else {\n this.state.currentState = \"domain_vetoed\";\n }\n\n this.state.lastDomainOutput = { approved: false, typesCreated: [], vetoReason: reason };\n\n // Record debate round outcome\n this.state.debateHistory.push({\n round: this.state.currentDebateRound,\n timestamp: new Date().toISOString(),\n context,\n concerns: [...this.state.activeConcerns],\n outcome: shouldEscalate ? \"escalated\" : \"vetoed\",\n });\n\n this.addCycleEntry({\n phase: \"domain\",\n state: this.state.currentState,\n timestamp: new Date().toISOString(),\n domainApproved: false,\n vetoReason: reason,\n debateRound: this.state.currentDebateRound,\n concerns: this.state.activeConcerns,\n });\n this.saveState();\n return { success: true, escalate: shouldEscalate };\n }\n\n /**\n * User overrides domain veto after escalation\n */\n userOverride(reason: string): { success: boolean; error?: string } {\n if (this.state.currentState !== \"awaiting_escalation\") {\n return {\n success: false,\n error: `User override only allowed when awaiting escalation. Current state: ${this.state.currentState}`,\n };\n }\n\n // Mark all active concerns as resolved via user override\n for (const concern of this.state.activeConcerns) {\n concern.resolved = true;\n concern.resolution = \"user_override\";\n concern.resolutionNotes = reason;\n }\n\n this.state.currentState = \"user_override\";\n this.state.userOverrideActive = true;\n\n this.addCycleEntry({\n phase: \"domain\",\n state: \"user_override\",\n timestamp: new Date().toISOString(),\n domainApproved: false,\n vetoReason: `User override: ${reason}`,\n debateRound: this.state.currentDebateRound,\n });\n\n this.saveState();\n return { success: true };\n }\n\n /**\n * Check if escalation is needed\n */\n needsEscalation(): boolean {\n return this.state.currentState === \"awaiting_escalation\";\n }\n\n /**\n * Get current debate round\n */\n getDebateRound(): number {\n return this.state.currentDebateRound;\n }\n\n /**\n * Get active concerns\n */\n getActiveConcerns(): DomainConcern[] {\n return [...this.state.activeConcerns];\n }\n\n /**\n * Mark a concern as resolved\n */\n resolveConcern(\n concernId: string,\n resolution: \"fixed\" | \"dismissed\",\n notes?: string\n ): { success: boolean; error?: string } {\n const concern = this.state.activeConcerns.find((c) => c.id === concernId);\n if (!concern) {\n return { success: false, error: `Concern ${concernId} not found` };\n }\n\n concern.resolved = true;\n concern.resolution = resolution;\n concern.resolutionNotes = notes;\n this.saveState();\n return { success: true };\n }\n\n /**\n * Start GREEN phase\n */\n startGreen(): { success: boolean; error?: string } {\n const canTransition = this.canTransitionTo(\"green\");\n if (!canTransition.valid) {\n return { success: false, error: canTransition.reason };\n }\n\n // Allow proceeding after domain approval OR user override\n const allowedStates: CycleState[] = [\"domain_approved_red\", \"user_override\"];\n if (!allowedStates.includes(this.state.currentState)) {\n return {\n success: false,\n error: `Cannot start GREEN phase: DOMAIN approval or user override required. Current state: ${this.state.currentState}`,\n };\n }\n\n if (!this.state.lastRedOutput) {\n return { success: false, error: \"Cannot start GREEN phase: No RED phase output available\" };\n }\n\n this.state.currentPhase = \"green\";\n this.state.currentState = \"green_in_progress\";\n this.addCycleEntry({\n phase: \"green\",\n state: \"green_in_progress\",\n timestamp: new Date().toISOString(),\n });\n this.saveState();\n return { success: true };\n }\n\n /**\n * Complete GREEN phase\n */\n completeGreen(implementationFiles: string[]): { success: boolean; error?: string } {\n if (this.state.currentState !== \"green_in_progress\") {\n return { success: false, error: \"GREEN phase not in progress\" };\n }\n\n this.state.currentState = \"green_complete\";\n this.addCycleEntry({\n phase: \"green\",\n state: \"green_complete\",\n timestamp: new Date().toISOString(),\n implementationFiles,\n });\n this.saveState();\n return { success: true };\n }\n\n /**\n * Add an entry to cycle history\n */\n private addCycleEntry(entry: CycleEntry): void {\n this.state.cycleHistory.push(entry);\n }\n\n /**\n * Get summary of current cycle progress\n */\n getCycleSummary(): string {\n const {\n currentState,\n currentPhase,\n cyclesCompleted,\n lastRedOutput,\n lastDomainOutput,\n currentDebateRound,\n maxDebateRounds,\n activeConcerns,\n userOverrideActive,\n } = this.state;\n\n let summary = \"TDD Cycle Status:\\n\";\n summary += ` Cycles completed: ${cyclesCompleted}\\n`;\n summary += ` Current state: ${currentState}\\n`;\n summary += ` Current phase: ${currentPhase ?? \"none\"}\\n`;\n\n // Show debate status if in domain review\n if (\n currentPhase === \"domain\" ||\n currentState.includes(\"domain\") ||\n currentState === \"awaiting_escalation\"\n ) {\n summary += \"\\n Debate Status:\\n\";\n summary += ` Round: ${currentDebateRound} / ${maxDebateRounds}\\n`;\n if (activeConcerns.length > 0) {\n summary += ` Active concerns: ${activeConcerns.length}\\n`;\n for (const concern of activeConcerns) {\n let status: string;\n if (concern.resolved) {\n status = `✓ ${concern.resolution}`;\n } else {\n status = \"⚠ unresolved\";\n }\n summary += ` - [${concern.type}] ${concern.description} (${status})\\n`;\n }\n }\n if (userOverrideActive) {\n summary += \" User override: ACTIVE\\n\";\n }\n if (currentState === \"awaiting_escalation\") {\n summary += \" ⚠ ESCALATION REQUIRED: Max debate rounds reached\\n\";\n }\n }\n\n if (lastRedOutput) {\n summary += \"\\n Last RED output:\\n\";\n summary += ` Test: ${lastRedOutput.testName}\\n`;\n summary += ` File: ${lastRedOutput.testFile}\\n`;\n }\n\n if (lastDomainOutput) {\n summary += \"\\n Last DOMAIN output:\\n\";\n summary += ` Approved: ${lastDomainOutput.approved}\\n`;\n if (lastDomainOutput.typesCreated.length > 0) {\n summary += ` Types created: ${lastDomainOutput.typesCreated.join(\", \")}\\n`;\n }\n if (lastDomainOutput.vetoReason) {\n summary += ` Veto reason: ${lastDomainOutput.vetoReason}\\n`;\n }\n }\n\n return summary;\n }\n\n /**\n * Reset the tracker\n */\n reset(): void {\n this.state = createDefaultState(\n this.state.projectDir,\n this.state.sessionId,\n this.state.maxDebateRounds\n );\n this.saveState();\n }\n\n /**\n * Get the last RED output (for GREEN phase)\n */\n getLastRedOutput(): TddCycleState[\"lastRedOutput\"] {\n return this.state.lastRedOutput;\n }\n\n /**\n * Get the last DOMAIN output\n */\n getLastDomainOutput(): TddCycleState[\"lastDomainOutput\"] {\n return this.state.lastDomainOutput;\n }\n}\n","/**\n * Architecture Alignment Protocol\n *\n * Ensures implementation agents read and align with ARCHITECTURE.md\n * before making changes. Detects conflicts and provides guidance.\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { createPluginLogger } from \"./plugin-logger.js\";\n\nconst log = createPluginLogger(\"architecture-alignment\");\n\nexport interface ArchitectureContext {\n exists: boolean;\n content?: string;\n summary?: string;\n constraints: string[];\n}\n\nexport interface ArchitectureCheckResult {\n success: boolean;\n context: ArchitectureContext;\n conflict?: ArchitectureConflict;\n error?: string;\n suggestion?: string;\n}\n\nexport interface ArchitectureConflict {\n documentedArchitecture: string;\n requestedWork: string;\n conflict: string;\n}\n\nexport interface ArchitectureCheckInput {\n projectDir: string;\n requestedWork: string;\n}\n\nconst ARCHITECTURE_PATH = \"ARCHITECTURE.md\";\n\nfunction summarizeArchitecture(content: string): string {\n const lines = content.split(/\\r?\\n/).map((line) => line.trim());\n const bullets = lines.filter(\n (line) => line.startsWith(\"-\") || line.startsWith(\"*\") || line.startsWith(\"#\")\n );\n\n return bullets.slice(0, 12).join(\"\\n\") || content.slice(0, 500);\n}\n\nfunction extractConstraints(content: string): string[] {\n const lines = content.split(/\\r?\\n/);\n const keywords = [\n \"boundary\",\n \"layer\",\n \"module\",\n \"pattern\",\n \"architecture\",\n \"convention\",\n \"must\",\n \"should\",\n ];\n\n return lines\n .map((line) => line.trim())\n .filter((line) => keywords.some((keyword) => line.toLowerCase().includes(keyword)))\n .slice(0, 20);\n}\n\nexport async function loadArchitectureContext(projectDir: string): Promise<ArchitectureContext> {\n const path = join(projectDir, ARCHITECTURE_PATH);\n\n try {\n const content = await readFile(path, \"utf-8\");\n const constraints = extractConstraints(content);\n return {\n exists: true,\n content,\n summary: summarizeArchitecture(content),\n constraints,\n };\n } catch {\n return {\n exists: false,\n constraints: [],\n };\n }\n}\n\nexport function detectArchitectureConflict(\n context: ArchitectureContext,\n requestedWork: string\n): ArchitectureConflict | undefined {\n if (!context.exists || !context.content) {\n return undefined;\n }\n\n const lowerWork = requestedWork.toLowerCase();\n const lowerContent = context.content.toLowerCase();\n\n if (lowerContent.includes(\"hexagonal\") && lowerWork.includes(\"mvc\")) {\n return {\n documentedArchitecture: \"ARCHITECTURE.md specifies hexagonal architecture\",\n requestedWork,\n conflict: \"Requested work mentions MVC, which conflicts with hexagonal layering\",\n };\n }\n\n if (lowerContent.includes(\"event sourcing\") && lowerWork.includes(\"crud\")) {\n return {\n documentedArchitecture: \"ARCHITECTURE.md specifies event sourcing\",\n requestedWork,\n conflict: \"Requested work mentions CRUD, which conflicts with event sourcing approach\",\n };\n }\n\n return undefined;\n}\n\nexport async function checkArchitectureAlignment(\n input: ArchitectureCheckInput\n): Promise<ArchitectureCheckResult> {\n const context = await loadArchitectureContext(input.projectDir);\n\n if (!context.exists) {\n return {\n success: true,\n context,\n suggestion:\n \"ARCHITECTURE.md not found. Proceed using DDD best practices and consider creating an architecture document.\",\n };\n }\n\n const conflict = detectArchitectureConflict(context, input.requestedWork);\n if (conflict) {\n log.warn(\"Architecture conflict detected\", { conflict });\n return {\n success: false,\n context,\n conflict,\n error: \"ARCHITECTURE_CONFLICT_DETECTED\",\n suggestion: \"Modify approach or discuss architecture changes with the team.\",\n };\n }\n\n return {\n success: true,\n context,\n };\n}\n\nexport function formatArchitectureConflict(conflict: ArchitectureConflict): string {\n return `ARCHITECTURE CONFLICT DETECTED\\n\\nDocumented architecture: ${conflict.documentedArchitecture}\\nRequested work: ${conflict.requestedWork}\\nConflict: ${conflict.conflict}\\n\\nOptions:\\n1. Modify implementation approach to align\\n2. Discuss whether architecture should evolve`;\n}\n","/**\n * sdlc_adr Tool\n *\n * Architecture Decision Record (ADR) management:\n * - Create new ADRs in docs/adr/\n * - List existing ADRs\n * - Synthesize accepted ADRs into ARCHITECTURE.md\n */\n\nimport { mkdir, readFile, readdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport { registerSubagentSession, unregisterSubagentSession } from \"../hooks/orchestrator-guard.js\";\nimport {\n checkArchitectureAlignment,\n formatArchitectureConflict,\n} from \"../utils/architecture-alignment.js\";\n\n/**\n * ADR status\n */\nexport type AdrStatus = \"proposed\" | \"accepted\" | \"deprecated\" | \"superseded\";\n\n/**\n * ADR metadata\n */\nexport interface AdrMetadata {\n number: number;\n title: string;\n status: AdrStatus;\n date: string;\n deciders?: string[];\n supersedes?: number;\n supersededBy?: number;\n}\n\n/**\n * ADR list item\n */\nexport interface AdrListItem extends AdrMetadata {\n path: string;\n}\n\n/**\n * ADR creation result\n */\nexport interface AdrCreateResult {\n success: boolean;\n path?: string;\n number?: number;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * ADR list result\n */\nexport interface AdrListResult {\n success: boolean;\n adrs?: AdrListItem[];\n count?: number;\n error?: string;\n}\n\n/**\n * ADR synthesize result\n */\nexport interface AdrSynthesizeResult {\n success: boolean;\n architecturePath?: string;\n includedAdrs?: number[];\n error?: string;\n suggestion?: string;\n}\n\n/**\n * ADR tool result (union of all results)\n */\nexport type AdrResult = AdrCreateResult | AdrListResult | AdrSynthesizeResult;\n\n/**\n * Arguments for sdlc_adr tool\n */\nexport interface AdrArgs {\n action: \"create\" | \"list\" | \"synthesize\";\n title?: string;\n context?: string;\n decision?: string;\n consequences?: string;\n}\n\n/**\n * Create the sdlc_adr tool\n */\nexport function createAdrTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Manage Architecture Decision Records (ADRs).\n\nActions:\n- create: Create a new ADR with title, context, decision, and consequences\n- list: List all existing ADRs with their status\n- synthesize: Generate/update ARCHITECTURE.md from accepted ADRs\n\nADRs are stored in docs/adr/ following the standard ADR format.\nNumbers are auto-assigned sequentially.\n\nCreate returns the path to the new ADR.\nList returns metadata for all ADRs.\nSynthesize updates ARCHITECTURE.md with current decisions.`,\n\n args: {\n action: tool.schema\n .enum([\"create\", \"list\", \"synthesize\"])\n .describe(\"Action to perform: create, list, or synthesize\"),\n title: tool.schema\n .string()\n .optional()\n .describe(\"Title for new ADR (required for create action)\"),\n context: tool.schema\n .string()\n .optional()\n .describe(\"Context/background for the decision (for create action)\"),\n decision: tool.schema\n .string()\n .optional()\n .describe(\"The decision being made (for create action)\"),\n consequences: tool.schema\n .string()\n .optional()\n .describe(\"Consequences of the decision (for create action)\"),\n },\n\n async execute(args): Promise<string> {\n const adrArgs = args as AdrArgs;\n\n switch (adrArgs.action) {\n case \"create\":\n return JSON.stringify(await createAdr(ctx, config, adrArgs), null, 2);\n case \"list\":\n return JSON.stringify(await listAdrs(ctx), null, 2);\n case \"synthesize\":\n return JSON.stringify(await synthesizeAdrs(ctx, config), null, 2);\n default:\n return JSON.stringify({\n success: false,\n error: `Unknown action: ${adrArgs.action}`,\n });\n }\n },\n });\n}\n\nconst ADR_DIR = \"docs/adr\";\n\nasync function createAdr(\n ctx: PluginInput,\n _config: SdlcConfig,\n args: AdrArgs\n): Promise<AdrCreateResult> {\n if (!args.title) {\n return {\n success: false,\n error: \"Title is required for creating an ADR\",\n suggestion: \"Provide a title describing the architectural decision\",\n };\n }\n\n const architectureCheck = await checkArchitectureAlignment({\n projectDir: ctx.directory,\n requestedWork: `ADR creation: ${args.title}`,\n });\n\n if (!architectureCheck.success && architectureCheck.conflict) {\n return {\n success: false,\n error: formatArchitectureConflict(architectureCheck.conflict),\n suggestion: architectureCheck.suggestion,\n };\n }\n\n const adrDir = join(ctx.directory, ADR_DIR);\n\n // Ensure directory exists\n try {\n await mkdir(adrDir, { recursive: true });\n } catch {\n // Directory might already exist\n }\n\n // Get next ADR number\n const existingAdrs = await getExistingAdrNumbers(adrDir);\n const nextNumber = existingAdrs.length > 0 ? Math.max(...existingAdrs) + 1 : 1;\n\n // Format number with leading zeros (e.g., 0001)\n const paddedNumber = String(nextNumber).padStart(4, \"0\");\n const slug = slugify(args.title);\n const filename = `${paddedNumber}-${slug}.md`;\n const filePath = join(adrDir, filename);\n\n // Generate ADR content\n const date = new Date().toISOString().split(\"T\")[0];\n const content = generateAdrContent({\n number: nextNumber,\n title: args.title,\n status: \"proposed\",\n date,\n context: args.context,\n decision: args.decision,\n consequences: args.consequences,\n });\n\n try {\n await writeFile(filePath, content, \"utf-8\");\n\n return {\n success: true,\n path: filePath,\n number: nextNumber,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n success: false,\n error: `Failed to create ADR: ${message}`,\n suggestion: \"Check file system permissions\",\n };\n }\n}\n\nasync function listAdrs(ctx: PluginInput): Promise<AdrListResult> {\n const adrDir = join(ctx.directory, ADR_DIR);\n\n try {\n const files = await readdir(adrDir);\n const adrFiles = files.filter((f) => f.match(/^\\d{4}-.*\\.md$/));\n\n const adrs: AdrListItem[] = [];\n\n for (const file of adrFiles) {\n const filePath = join(adrDir, file);\n try {\n const content = await readFile(filePath, \"utf-8\");\n const metadata = parseAdrMetadata(content, file);\n adrs.push({\n ...metadata,\n path: filePath,\n });\n } catch {\n // Skip files that can't be read\n }\n }\n\n // Sort by number\n adrs.sort((a, b) => a.number - b.number);\n\n return {\n success: true,\n adrs,\n count: adrs.length,\n };\n } catch {\n return {\n success: true,\n adrs: [],\n count: 0,\n };\n }\n}\n\nasync function synthesizeAdrs(ctx: PluginInput, config: SdlcConfig): Promise<AdrSynthesizeResult> {\n // Get all accepted ADRs\n const listResult = await listAdrs(ctx);\n\n if (!listResult.success || !listResult.adrs) {\n return {\n success: false,\n error: \"Failed to list ADRs\",\n };\n }\n\n const acceptedAdrs = listResult.adrs.filter((adr) => adr.status === \"accepted\");\n\n if (acceptedAdrs.length === 0) {\n return {\n success: false,\n error: \"No accepted ADRs found\",\n suggestion: \"Mark ADRs as accepted by changing their status in the file\",\n };\n }\n\n // Spawn agent to synthesize\n const synthesizeResult = await spawnSynthesizeAgent(ctx, config, acceptedAdrs);\n\n if (!synthesizeResult.success) {\n return {\n success: false,\n error: synthesizeResult.error || \"Synthesis failed\",\n suggestion: \"Check agent configuration\",\n };\n }\n\n // Write ARCHITECTURE.md\n const architecturePath = join(ctx.directory, \"ARCHITECTURE.md\");\n\n try {\n await writeFile(architecturePath, synthesizeResult.content || \"\", \"utf-8\");\n\n return {\n success: true,\n architecturePath,\n includedAdrs: acceptedAdrs.map((a) => a.number),\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n success: false,\n error: `Failed to write ARCHITECTURE.md: ${message}`,\n };\n }\n}\n\nasync function getExistingAdrNumbers(adrDir: string): Promise<number[]> {\n try {\n const files = await readdir(adrDir);\n const numbers: number[] = [];\n\n for (const file of files) {\n const match = file.match(/^(\\d{4})-/);\n if (match) {\n numbers.push(Number.parseInt(match[1], 10));\n }\n }\n\n return numbers;\n } catch {\n return [];\n }\n}\n\nfunction slugify(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\")\n .slice(0, 50);\n}\n\ninterface AdrContentArgs {\n number: number;\n title: string;\n status: AdrStatus;\n date: string;\n context?: string;\n decision?: string;\n consequences?: string;\n}\n\nfunction generateAdrContent(args: AdrContentArgs): string {\n return `# ADR ${args.number}: ${args.title}\n\n## Status\n\n${args.status.charAt(0).toUpperCase() + args.status.slice(1)}\n\n## Date\n\n${args.date}\n\n## Context\n\n${args.context || \"<!-- Describe the context and problem statement -->\"}\n\n## Decision\n\n${args.decision || \"<!-- Describe the decision that was made -->\"}\n\n## Consequences\n\n${args.consequences || \"<!-- Describe the consequences of this decision -->\"}\n\n### Positive\n\n- <!-- List positive consequences -->\n\n### Negative\n\n- <!-- List negative consequences or trade-offs -->\n\n### Neutral\n\n- <!-- List neutral observations -->\n\n## References\n\n- <!-- Add links to related documents, issues, or discussions -->\n`;\n}\n\nfunction parseAdrMetadata(content: string, filename: string): AdrMetadata {\n // Extract number from filename\n const numberMatch = filename.match(/^(\\d{4})-/);\n const number = numberMatch ? Number.parseInt(numberMatch[1], 10) : 0;\n\n // Extract title from first heading\n const titleMatch = content.match(/^#\\s+ADR\\s+\\d+:\\s*(.+)$/m);\n const title = titleMatch ? titleMatch[1].trim() : filename.replace(/^\\d{4}-|\\.md$/g, \"\");\n\n // Extract status\n const statusMatch = content.match(/##\\s*Status\\s*\\n+(\\w+)/i);\n const statusStr = statusMatch ? statusMatch[1].toLowerCase() : \"proposed\";\n const status: AdrStatus =\n statusStr === \"accepted\" ||\n statusStr === \"deprecated\" ||\n statusStr === \"superseded\" ||\n statusStr === \"proposed\"\n ? statusStr\n : \"proposed\";\n\n // Extract date\n const dateMatch = content.match(/##\\s*Date\\s*\\n+(\\d{4}-\\d{2}-\\d{2})/i);\n const date = dateMatch ? dateMatch[1] : new Date().toISOString().split(\"T\")[0];\n\n // Extract supersedes/supersededBy\n const supersedesMatch = content.match(/Supersedes\\s*(?:ADR\\s*)?\\[?#?(\\d+)/i);\n const supersededByMatch = content.match(/Superseded\\s*by\\s*(?:ADR\\s*)?\\[?#?(\\d+)/i);\n\n return {\n number,\n title,\n status,\n date,\n supersedes: supersedesMatch ? Number.parseInt(supersedesMatch[1], 10) : undefined,\n supersededBy: supersededByMatch ? Number.parseInt(supersededByMatch[1], 10) : undefined,\n };\n}\n\ninterface SynthesizeAgentResult {\n success: boolean;\n content?: string;\n error?: string;\n}\n\nasync function spawnSynthesizeAgent(\n ctx: PluginInput,\n config: SdlcConfig,\n adrs: AdrListItem[]\n): Promise<SynthesizeAgentResult> {\n try {\n // Build prompt with ADR contents\n let adrContents = \"\";\n for (const adr of adrs) {\n try {\n const content = await readFile(adr.path, \"utf-8\");\n adrContents += `\\n\\n---\\n\\n## ADR ${adr.number}: ${adr.title}\\n\\n${content}`;\n } catch {\n // Skip unreadable ADRs\n }\n }\n\n const prompt = `# Synthesize Architecture Documentation\n\nYou are tasked with creating an ARCHITECTURE.md file that synthesizes the accepted Architecture Decision Records (ADRs) into a cohesive architectural overview.\n\n## Instructions\n\n1. Read through all the ADRs provided below\n2. Extract the key architectural decisions and their rationale\n3. Organize them into a coherent ARCHITECTURE.md document with sections:\n - Overview (high-level system architecture)\n - Key Decisions (summarized from ADRs)\n - Components (if applicable)\n - Data Flow (if applicable)\n - Technology Choices (summarized from ADRs)\n - Trade-offs and Constraints\n\n4. Reference the original ADR numbers so readers can find detailed context\n5. Keep the document concise but comprehensive\n\n## Accepted ADRs\n\n${adrContents}\n\n## Output\n\nGenerate the complete ARCHITECTURE.md content. Start directly with the markdown content.`;\n\n const createResult = await ctx.client.session.create({\n body: {\n title: \"ADR Synthesis\",\n },\n });\n\n if (!createResult.data?.id) {\n return { success: false, error: \"Failed to create synthesis session\" };\n }\n\n const sessionId = createResult.data.id;\n registerSubagentSession(sessionId, \"file_updater\");\n\n try {\n const modelConfig = parseModelConfig(\n config.models.oracle || \"anthropic/claude-sonnet-4-20250514\"\n );\n\n const promptResult = await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: modelConfig,\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n if (!promptResult.data) {\n return { success: false, error: \"No response from synthesis agent\" };\n }\n\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n return { success: false, error: \"No messages in synthesis session\" };\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const content = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n return { success: true, content };\n } finally {\n unregisterSubagentSession(sessionId);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return { success: false, error: `Synthesis failed: ${message}` };\n }\n}\n\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"anthropic\", modelID: modelID || modelString };\n}\n\n// Export for testing\nexport const _testExports = {\n createAdr,\n listAdrs,\n synthesizeAdrs,\n parseAdrMetadata,\n generateAdrContent,\n slugify,\n};\n","/**\n * Stateless Memory Backend\n *\n * A no-persistence backend that only holds checkpoints in-memory for the current session.\n * Memories are not persisted between sessions.\n *\n * Use this when:\n * - Memento MCP is not available\n * - User doesn't want persistent memory\n * - Testing without external dependencies\n */\n\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\nimport type {\n AgentCheckpoint,\n CheckpointResult,\n MemoryBackend,\n MemoryBackendConfig,\n RecallResult,\n RememberResult,\n} from \"./types.js\";\n\nconst log = createPluginLogger(\"memory:stateless\");\n\n/**\n * In-memory checkpoint storage (session-only)\n */\nconst sessionCheckpoints = new Map<string, AgentCheckpoint>();\n\n/**\n * Generate a unique checkpoint ID\n */\nfunction generateCheckpointId(agent: string): string {\n const timestamp = new Date().toISOString().replace(/[:.]/g, \"-\");\n return `${agent}-checkpoint-${timestamp}`;\n}\n\n/**\n * Create a stateless memory backend\n */\nexport function createStatelessBackend(_cfg: MemoryBackendConfig): MemoryBackend {\n return {\n type: \"stateless\" as const,\n\n async remember(key: string, content: string, tags?: string[]): Promise<RememberResult> {\n // Stateless backend doesn't persist memories\n log.debug(\"Stateless backend: remember called (no-op)\", {\n key,\n contentLength: content.length,\n tags,\n });\n\n return {\n success: true,\n key,\n stored: false, // Not actually stored\n };\n },\n\n async recall(\n query: string,\n options?: {\n tags?: string[];\n limit?: number;\n projectOnly?: boolean;\n }\n ): Promise<RecallResult> {\n // Stateless backend has no persistent memories to recall\n log.debug(\"Stateless backend: recall called (empty)\", {\n query,\n options,\n });\n\n return {\n success: true,\n memories: [],\n count: 0,\n query,\n };\n },\n\n async createCheckpoint(\n checkpoint: Omit<AgentCheckpoint, \"id\" | \"createdAt\">\n ): Promise<CheckpointResult> {\n const id = generateCheckpointId(checkpoint.agent);\n const fullCheckpoint: AgentCheckpoint = {\n ...checkpoint,\n id,\n createdAt: new Date().toISOString(),\n };\n\n sessionCheckpoints.set(id, fullCheckpoint);\n\n log.info(\"Created checkpoint\", {\n id,\n agent: checkpoint.agent,\n task: checkpoint.task,\n });\n\n return {\n success: true,\n checkpointId: id,\n checkpoint: fullCheckpoint,\n };\n },\n\n async loadCheckpoint(checkpointId: string): Promise<CheckpointResult> {\n const checkpoint = sessionCheckpoints.get(checkpointId);\n\n if (!checkpoint) {\n log.warn(\"Checkpoint not found\", { checkpointId });\n return {\n success: false,\n error: `Checkpoint not found: ${checkpointId}`,\n suggestion:\n \"The checkpoint may have been created in a previous session. \" +\n \"Stateless backend only persists checkpoints within the current session.\",\n };\n }\n\n log.info(\"Loaded checkpoint\", {\n id: checkpointId,\n agent: checkpoint.agent,\n });\n\n return {\n success: true,\n checkpointId,\n checkpoint,\n };\n },\n\n async deleteCheckpoint(checkpointId: string): Promise<{ success: boolean; error?: string }> {\n const existed = sessionCheckpoints.delete(checkpointId);\n\n if (!existed) {\n log.debug(\"Checkpoint not found for deletion\", { checkpointId });\n } else {\n log.info(\"Deleted checkpoint\", { checkpointId });\n }\n\n return { success: true };\n },\n };\n}\n\n/**\n * Clear all session checkpoints (for testing)\n */\nexport function clearSessionCheckpoints(): void {\n sessionCheckpoints.clear();\n}\n\n/**\n * Get count of session checkpoints (for testing)\n */\nexport function getSessionCheckpointCount(): number {\n return sessionCheckpoints.size;\n}\n","/**\n * Memento MCP Memory Backend\n *\n * Uses the Memento MCP server for semantic search and persistent memory.\n * Falls back to stateless behavior if Memento is unavailable.\n *\n * Memento provides:\n * - Semantic search across memories\n * - Cross-project memory sharing\n * - Entity/relation graph storage\n */\n\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\nimport { createStatelessBackend } from \"./stateless.js\";\nimport type {\n AgentCheckpoint,\n CheckpointResult,\n MemoryBackend,\n MemoryBackendConfig,\n MemoryEntry,\n RecallResult,\n RememberResult,\n} from \"./types.js\";\n\nconst log = createPluginLogger(\"memory:memento\");\n\n/**\n * Parse a model config string into provider/model parts\n */\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"anthropic\", modelID: modelID || modelString };\n}\n\n/**\n * Create a Memento MCP memory backend\n */\nexport function createMementoBackend(cfg: MemoryBackendConfig): MemoryBackend {\n const { ctx, config } = cfg;\n\n // Fallback backend for when Memento fails\n const fallback = createStatelessBackend(cfg);\n\n /**\n * Spawn a session to interact with Memento MCP tools\n */\n async function withMementoSession<T>(\n title: string,\n prompt: string,\n parseResponse: (response: string) => T\n ): Promise<T | null> {\n try {\n const createResult = await ctx.client.session.create({\n body: { title },\n });\n\n if (!createResult.data?.id) {\n throw new Error(\"Failed to create Memento session\");\n }\n\n const sessionId = createResult.data.id;\n\n const modelConfig = parseModelConfig(\n config.models.librarian || \"anthropic/claude-sonnet-4-20250514\"\n );\n\n await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: modelConfig,\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n throw new Error(\"No response from Memento session\");\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const responseText = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n return parseResponse(responseText);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n log.warn(\"Memento session failed\", { error: message });\n return null;\n }\n }\n\n return {\n type: \"memento\" as const,\n\n async remember(key: string, content: string, tags?: string[]): Promise<RememberResult> {\n const tagsStr = tags?.length ? `\\nTags: ${tags.join(\", \")}` : \"\";\n const prompt = `Use the mcp__memento__create_entities tool to store this memory:\n\nKey: ${key}\nContent: ${content}${tagsStr}\n\nCreate an entity with:\n- name: \"${key}\"\n- entityType: \"memory\"\n- observations containing the content and tags\n\nConfirm the memory was stored successfully.`;\n\n const result = await withMementoSession(`Remember: ${key}`, prompt, (response) => {\n // Check if response indicates success\n const success =\n response.toLowerCase().includes(\"stored\") ||\n response.toLowerCase().includes(\"created\") ||\n response.toLowerCase().includes(\"success\");\n return { success };\n });\n\n if (result?.success) {\n log.info(\"Stored memory via Memento\", { key });\n return {\n success: true,\n key,\n stored: true,\n };\n }\n\n // Memento failed, use fallback (which is no-op for stateless)\n log.warn(\"Memento store failed, using fallback\", { key });\n return fallback.remember(key, content, tags);\n },\n\n async recall(\n query: string,\n options?: {\n tags?: string[];\n limit?: number;\n projectOnly?: boolean;\n }\n ): Promise<RecallResult> {\n const tagsStr = options?.tags?.length ? `\\nFilter by tags: ${options.tags.join(\", \")}` : \"\";\n const limitStr = options?.limit ? `\\nLimit results to: ${options.limit}` : \"\";\n\n const prompt = `Use the mcp__memento__semantic_search tool to find memories matching:\n\nQuery: ${query}${tagsStr}${limitStr}\n\nSearch for relevant memories and return the results as JSON with this structure:\n{\n \"memories\": [\n {\n \"key\": \"memory-key\",\n \"content\": \"memory content\",\n \"tags\": [\"tag1\", \"tag2\"],\n \"createdAt\": \"ISO date\",\n \"updatedAt\": \"ISO date\"\n }\n ]\n}`;\n\n const result = await withMementoSession<{ memories: MemoryEntry[] } | null>(\n `Recall: ${query}`,\n prompt,\n (response) => {\n const jsonMatch = response.match(/\\{[\\s\\S]*\"memories\"[\\s\\S]*\\}/);\n if (jsonMatch) {\n try {\n return JSON.parse(jsonMatch[0]) as { memories: MemoryEntry[] };\n } catch {\n return null;\n }\n }\n return null;\n }\n );\n\n if (result?.memories) {\n log.info(\"Recalled memories via Memento\", {\n query,\n count: result.memories.length,\n });\n return {\n success: true,\n memories: result.memories,\n count: result.memories.length,\n query,\n };\n }\n\n // Memento failed, use fallback (which returns empty for stateless)\n log.warn(\"Memento recall failed, using fallback\", { query });\n return fallback.recall(query, options);\n },\n\n async createCheckpoint(\n checkpoint: Omit<AgentCheckpoint, \"id\" | \"createdAt\">\n ): Promise<CheckpointResult> {\n const id = `${checkpoint.agent}-checkpoint-${new Date().toISOString().replace(/[:.]/g, \"-\")}`;\n const createdAt = new Date().toISOString();\n\n const observations = [\n `Agent: ${checkpoint.agent} | Task: ${checkpoint.task}`,\n `Progress: ${checkpoint.progress}`,\n `Files created: ${checkpoint.filesCreated.join(\", \") || \"none\"}`,\n `Files read: ${checkpoint.filesRead.join(\", \") || \"none\"}`,\n `Next step: ${checkpoint.nextStep}`,\n `Pending decision: ${checkpoint.pendingDecision}`,\n `Context: ${JSON.stringify(checkpoint.context)}`,\n ];\n\n const prompt = `Use the mcp__memento__create_entities tool to create a checkpoint:\n\nEntity:\n- name: \"${id}\"\n- entityType: \"agent_checkpoint\"\n- observations:\n${observations.map((o) => ` - \"${o}\"`).join(\"\\n\")}\n\nConfirm the checkpoint was created.`;\n\n const result = await withMementoSession(`Checkpoint: ${id}`, prompt, (response) => {\n const success =\n response.toLowerCase().includes(\"created\") || response.toLowerCase().includes(\"success\");\n return { success };\n });\n\n if (result?.success) {\n log.info(\"Created checkpoint via Memento\", { id, agent: checkpoint.agent });\n return {\n success: true,\n checkpointId: id,\n checkpoint: { ...checkpoint, id, createdAt },\n };\n }\n\n // Fall back to in-memory checkpoint storage\n log.warn(\"Memento checkpoint failed, using fallback\", { id });\n return fallback.createCheckpoint(checkpoint);\n },\n\n async loadCheckpoint(checkpointId: string): Promise<CheckpointResult> {\n const prompt = `Use the mcp__memento__open_nodes tool to load checkpoint \"${checkpointId}\".\n\nReturn the checkpoint data as JSON:\n{\n \"id\": \"${checkpointId}\",\n \"agent\": \"agent-name\",\n \"createdAt\": \"ISO date\",\n \"task\": \"task description\",\n \"progress\": \"progress summary\",\n \"filesCreated\": [\"file1\", \"file2\"],\n \"filesRead\": [\"file1\"],\n \"nextStep\": \"next step\",\n \"pendingDecision\": \"decision needed\",\n \"context\": {}\n}`;\n\n const result = await withMementoSession<AgentCheckpoint | null>(\n `Load Checkpoint: ${checkpointId}`,\n prompt,\n (response) => {\n const jsonMatch = response.match(/\\{[\\s\\S]*\"id\"[\\s\\S]*\"agent\"[\\s\\S]*\\}/);\n if (jsonMatch) {\n try {\n return JSON.parse(jsonMatch[0]) as AgentCheckpoint;\n } catch {\n return null;\n }\n }\n return null;\n }\n );\n\n if (result) {\n log.info(\"Loaded checkpoint via Memento\", { checkpointId });\n return {\n success: true,\n checkpointId,\n checkpoint: result,\n };\n }\n\n // Try fallback\n log.warn(\"Memento load checkpoint failed, trying fallback\", { checkpointId });\n return fallback.loadCheckpoint(checkpointId);\n },\n\n async deleteCheckpoint(checkpointId: string): Promise<{ success: boolean; error?: string }> {\n // Memento doesn't have a direct delete - we'd need to mark it as deleted\n // For now, just delete from fallback if it exists there\n log.info(\"Delete checkpoint (stateless only)\", { checkpointId });\n return fallback.deleteCheckpoint(checkpointId);\n },\n };\n}\n","/**\n * Memory Abstraction Layer\n *\n * Provides a pluggable memory system for the SDLC plugin.\n *\n * Supported backends:\n * - memento: Full Memento MCP integration with semantic search\n * - stateless: No persistence, session-only checkpoints\n *\n * Usage:\n * const memory = createMemoryBackend({ type: \"memento\", ctx, config });\n * await memory.remember(\"key\", \"content\", [\"tag1\"]);\n * const result = await memory.recall(\"search query\");\n */\n\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig, SdlcFeatures } from \"../../shared/types.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\nimport { createMementoBackend } from \"./memento.js\";\nimport { createStatelessBackend } from \"./stateless.js\";\nimport type { MemoryBackend, MemoryBackendConfig } from \"./types.js\";\n\nconst log = createPluginLogger(\"memory\");\n\n// Re-export types\nexport type {\n AgentCheckpoint,\n CheckpointResult,\n MemoryBackend,\n MemoryBackendConfig,\n MemoryEntry,\n RecallResult,\n RememberResult,\n} from \"./types.js\";\n\n// Re-export backends for direct use\nexport { createMementoBackend } from \"./memento.js\";\nexport {\n createStatelessBackend,\n clearSessionCheckpoints,\n getSessionCheckpointCount,\n} from \"./stateless.js\";\n\n/**\n * Detect which memory backend to use based on configuration\n */\nexport function detectMemoryBackendType(config: SdlcConfig): \"memento\" | \"stateless\" {\n const features = config.features as SdlcFeatures;\n\n // Check if memento is explicitly enabled in features\n if (features?.memento === true) {\n return \"memento\";\n }\n\n // Default to stateless\n return \"stateless\";\n}\n\n/**\n * Create a memory backend based on configuration\n *\n * @param ctx - Plugin context for API calls\n * @param config - SDLC configuration\n * @param typeOverride - Optional override for backend type (useful for testing)\n */\nexport function createMemoryBackend(\n ctx: PluginInput,\n config: SdlcConfig,\n typeOverride?: \"memento\" | \"stateless\"\n): MemoryBackend {\n const type = typeOverride ?? detectMemoryBackendType(config);\n\n log.info(\"Creating memory backend\", { type });\n\n const backendConfig: MemoryBackendConfig = { type, ctx, config };\n\n switch (type) {\n case \"memento\":\n return createMementoBackend(backendConfig);\n case \"stateless\":\n return createStatelessBackend(backendConfig);\n default: {\n // TypeScript exhaustiveness check\n const _exhaustive: never = type;\n throw new Error(`Unknown memory backend type: ${_exhaustive}`);\n }\n }\n}\n\n/**\n * Singleton memory backend instance\n * Lazily initialized on first use\n */\nlet memoryInstance: MemoryBackend | null = null;\nlet memoryInstanceConfig: { ctx: PluginInput; config: SdlcConfig } | null = null;\n\n/**\n * Get or create the shared memory backend instance\n *\n * This provides a singleton pattern for tools that need memory access.\n */\nexport function getMemoryBackend(ctx: PluginInput, config: SdlcConfig): MemoryBackend {\n // Check if we need to create a new instance\n if (\n !memoryInstance ||\n memoryInstanceConfig?.ctx !== ctx ||\n memoryInstanceConfig?.config !== config\n ) {\n memoryInstance = createMemoryBackend(ctx, config);\n memoryInstanceConfig = { ctx, config };\n }\n\n return memoryInstance;\n}\n\n/**\n * Reset the memory backend singleton (for testing)\n */\nexport function resetMemoryBackend(): void {\n memoryInstance = null;\n memoryInstanceConfig = null;\n}\n","/**\n * sdlc_checkpoint_create Tool\n *\n * Create a memory checkpoint for resuming work after user input.\n */\n\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport { getMemoryBackend } from \"../memory/index.js\";\n\nexport interface CheckpointCreateArgs {\n agent: string;\n task: string;\n progress: string;\n filesCreated: string[];\n filesRead: string[];\n nextStep: string;\n pendingDecision: string;\n context?: Record<string, unknown>;\n}\n\nexport interface CheckpointCreateResult {\n success: boolean;\n checkpointId?: string;\n error?: string;\n suggestion?: string;\n}\n\nexport function createCheckpointCreateTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Create a memory checkpoint to resume work later.\n\nUse this when you need to pause and request user input. The checkpoint stores\nprogress details, files touched, and next steps for resuming the task.\n\nRequired fields:\n- agent: Name of the agent creating the checkpoint\n- task: Description of the task being worked on\n- progress: Summary of current progress\n- filesCreated: List of new files created\n- filesRead: List of files read\n- nextStep: Next action to take\n- pendingDecision: Decision needed from user\n- context: Additional context (optional)`,\n\n args: {\n agent: tool.schema.string().describe(\"Agent creating the checkpoint\"),\n task: tool.schema.string().describe(\"Task description\"),\n progress: tool.schema.string().describe(\"Progress summary\"),\n filesCreated: tool.schema.array(tool.schema.string()).describe(\"Files created\"),\n filesRead: tool.schema.array(tool.schema.string()).describe(\"Files read\"),\n nextStep: tool.schema.string().describe(\"Next step when resuming\"),\n pendingDecision: tool.schema.string().describe(\"Decision needed from user\"),\n context: tool.schema.object({}).optional().describe(\"Additional context for resuming work\"),\n },\n\n async execute(args): Promise<string> {\n const checkpointArgs = args as CheckpointCreateArgs;\n const backend = getMemoryBackend(ctx, config);\n\n const result = await backend.createCheckpoint({\n agent: checkpointArgs.agent,\n task: checkpointArgs.task,\n progress: checkpointArgs.progress,\n filesCreated: checkpointArgs.filesCreated,\n filesRead: checkpointArgs.filesRead,\n nextStep: checkpointArgs.nextStep,\n pendingDecision: checkpointArgs.pendingDecision,\n context: checkpointArgs.context ?? {},\n });\n\n return JSON.stringify(result, null, 2);\n },\n });\n}\n","/**\n * sdlc_checkpoint_delete Tool\n *\n * Delete a memory checkpoint by ID after resuming work.\n */\n\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport { getMemoryBackend } from \"../memory/index.js\";\n\nexport interface CheckpointDeleteArgs {\n checkpointId: string;\n}\n\nexport interface CheckpointDeleteResult {\n success: boolean;\n error?: string;\n}\n\nexport function createCheckpointDeleteTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Delete a memory checkpoint after resuming work.\n\nUse this to clean up checkpoints once the task has been resumed and\nis no longer needed.`,\n\n args: {\n checkpointId: tool.schema.string().describe(\"Checkpoint ID to delete\"),\n },\n\n async execute(args): Promise<string> {\n const deleteArgs = args as CheckpointDeleteArgs;\n const backend = getMemoryBackend(ctx, config);\n\n const result = await backend.deleteCheckpoint(deleteArgs.checkpointId);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n","/**\n * sdlc_checkpoint_load Tool\n *\n * Load a memory checkpoint by ID.\n */\n\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport { getMemoryBackend } from \"../memory/index.js\";\n\nexport interface CheckpointLoadArgs {\n checkpointId: string;\n}\n\nexport interface CheckpointLoadResult {\n success: boolean;\n checkpointId?: string;\n checkpoint?: unknown;\n error?: string;\n suggestion?: string;\n}\n\nexport function createCheckpointLoadTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Load a memory checkpoint by ID.\n\nUse this when resuming work after a user input interruption.\nProvide the checkpointId returned by sdlc_checkpoint_create.`,\n\n args: {\n checkpointId: tool.schema.string().describe(\"Checkpoint ID to load\"),\n },\n\n async execute(args): Promise<string> {\n const loadArgs = args as CheckpointLoadArgs;\n const backend = getMemoryBackend(ctx, config);\n\n const result = await backend.loadCheckpoint(loadArgs.checkpointId);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/**\n * Get version from package.json at runtime.\n * Handles both bundled (dist/) and development (src/) scenarios.\n */\nfunction getPackageVersion(): string {\n try {\n const currentDir = dirname(fileURLToPath(import.meta.url));\n\n const possiblePaths = [\n join(currentDir, \"..\", \"..\", \"package.json\"),\n join(currentDir, \"..\", \"..\", \"..\", \"package.json\"),\n ];\n\n for (const pkgPath of possiblePaths) {\n if (!existsSync(pkgPath)) continue;\n\n const content = readFileSync(pkgPath, \"utf-8\");\n const pkg = JSON.parse(content);\n if (pkg.version) return pkg.version;\n }\n\n return \"0.0.0\";\n } catch (error) {\n if (error instanceof SyntaxError) {\n console.error(\"[opencode-sdlc] Warning: package.json contains invalid JSON\");\n }\n return \"0.0.0\";\n }\n}\n\n/**\n * Current version of OpenCode SDLC Plugin\n * Dynamically read from package.json\n */\nexport const VERSION = getPackageVersion();\n\n/**\n * Package name for CLI display\n */\nexport const PACKAGE_NAME = \"opencode-sdlc-plugin\";\n\n/**\n * CLI display name\n */\nexport const DISPLAY_NAME = \"OpenCode SDLC\";\n\n/**\n * Tagline for CLI header\n */\nexport const TAGLINE = \"Strict TDD with domain modeling and event sourcing\";\n\n/**\n * Configuration paths\n */\nexport const CONFIG_PATHS = {\n /** Global OpenCode config directory */\n globalConfigDir: join(homedir(), \".config\", \"opencode\"),\n\n /** Global SDLC config file */\n globalSdlcConfig: join(homedir(), \".config\", \"opencode\", \"sdlc.json\"),\n\n /** Global OpenCode config file */\n globalOpencodeConfig: join(homedir(), \".config\", \"opencode\", \"opencode.json\"),\n\n /** Global oh-my-opencode config file */\n globalOmoConfig: join(homedir(), \".config\", \"opencode\", \"oh-my-opencode.json\"),\n\n /** Commands directory */\n commandsDir: join(homedir(), \".config\", \"opencode\", \"command\"),\n\n /** Plugin directory */\n pluginDir: join(homedir(), \".config\", \"opencode\", \"plugin\"),\n\n /** SDLC internal files directory (state, backups) */\n sdlcDir: join(homedir(), \".config\", \"opencode\", \"sdlc\"),\n\n /** SDLC backups directory */\n backupsDir: join(homedir(), \".config\", \"opencode\", \"sdlc\", \"backups\"),\n\n /** SDLC state file (for issue tracking) */\n stateFile: join(homedir(), \".config\", \"opencode\", \"sdlc\", \"sdlc-state.json\"),\n\n /** Legacy state file path (for migration) */\n legacyStateFile: join(homedir(), \".config\", \"opencode\", \"sdlc-state.json\"),\n} as const;\n\n/**\n * Project-specific paths (relative to project root)\n */\nexport const PROJECT_PATHS = {\n /** Local SDLC config */\n localConfig: \".opencode/sdlc.json\",\n} as const;\n\n/**\n * Default configuration values (v1.0.0+)\n */\nexport const DEFAULTS = {\n // ============================================================================\n // New v1.0.0 defaults\n // ============================================================================\n\n /** Default modes configuration (v1.0.0+) */\n modes: {\n default: \"build\" as const,\n eventModeling: true,\n enabled: [\"discover\", \"model\", \"architect\", \"pm\", \"build\"] as const,\n },\n\n /** Default memory configuration (v1.0.0+) */\n memory: {\n backend: \"stateless\" as const,\n checkpointTtl: 86400,\n },\n\n /** Default subagent model configuration (v1.0.0+)\n * All subagents default to \"inherit\" which uses the marvin model.\n * Only specify overrides for subagents that need different models.\n */\n subagents: {\n // TDD agents - use same model as marvin by default\n red: \"inherit\" as const,\n green: \"inherit\" as const,\n domain: \"inherit\" as const,\n refactor: \"inherit\" as const,\n // Event modeling agents\n discovery: \"inherit\" as const,\n workflow: \"inherit\" as const,\n gwt: \"inherit\" as const,\n \"model-checker\": \"inherit\" as const,\n // Architecture agents\n architect: \"inherit\" as const,\n adr: \"inherit\" as const,\n \"design-facilitator\": \"inherit\" as const,\n // Planning agents\n story: \"inherit\" as const,\n pm: \"inherit\" as const,\n analyst: \"inherit\" as const,\n // Review agents (read-only, can use faster models)\n reviewer: \"inherit\" as const,\n ux: \"inherit\" as const,\n mutation: \"inherit\" as const,\n },\n\n // ============================================================================\n // Existing v0.3.0+ defaults (with v1.0 extensions)\n // ============================================================================\n\n /** Default TDD configuration */\n tdd: {\n enabled: true,\n verbosity: \"brief\" as const,\n bypassPatterns: [\"*.config.*\", \"*.json\", \"*.md\", \"*.yaml\", \"*.yml\"],\n mutationTesting: {\n enabled: false,\n requiredScore: 80,\n },\n // v1.0.0 additions\n domainVetoEnabled: true,\n debateRounds: 2,\n requireVerification: true,\n },\n\n /** Default Event Modeling configuration */\n eventModeling: {\n enabled: false,\n outputPath: \"docs/event-model\",\n },\n\n /** Default Git configuration */\n git: {\n workflow: \"standard\" as const,\n requireClean: true,\n worktrees: false,\n },\n\n /** Default features enabled (v0.3.0+) */\n features: {\n orchestratorOnly: false,\n todoSync: true,\n partyReview: true,\n debuggingProtocol: true,\n memento: false,\n notifications: true,\n lspTools: true,\n },\n\n /** Default MCPs enabled (v0.3.0+) */\n mcps: {\n context7: true,\n exa: true,\n grepApp: true,\n memento: false,\n },\n\n /** Default routing configuration (v1.0.0+) */\n routing: {\n classifierModel: \"anthropic/claude-haiku\",\n },\n} as const;\n\n/**\n * Minimum compatible versions\n */\nexport const MIN_VERSIONS = {\n node: \"20.0.0\",\n opencode: \"1.0.132\",\n} as const;\n","import { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport { DEFAULTS } from \"../../shared/constants.js\";\nimport type { SdlcConfig, SdlcMode } from \"../../shared/types.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\n\nconst log = createPluginLogger(\"classify-request\");\n\n/**\n * All available SDLC modes for classification\n * Note: \"prd\" is used when eventModeling=false as alternative to \"model\"\n */\ntype ClassificationMode = SdlcMode | \"prd\";\n\n/**\n * Classification result from the LLM\n */\nexport interface ClassifyRequestResult {\n /** The suggested mode based on request analysis */\n suggestedMode: ClassificationMode;\n /** Confidence score from 0 to 1 */\n confidence: number;\n /** Brief explanation of why this mode was suggested */\n reason: string;\n /** Whether the user should consider switching modes */\n shouldSwitch: boolean;\n /** Current mode that was provided */\n currentMode: SdlcMode;\n /** Error message if classification failed */\n error?: string;\n /** Suggestion for resolving the error */\n suggestion?: string;\n}\n\n/**\n * Classification prompt for the LLM\n */\nconst CLASSIFICATION_PROMPT = `You are a request classifier for an SDLC workflow system. Classify the user's request into one of these categories:\n\nMODES:\n- discover: Problem exploration, stakeholder analysis, user journeys, domain discovery, \"why\" questions\n- model: Event modeling, commands, events, aggregates, views, GWT specifications, event-sourced design\n- prd: Feature specifications, requirements documents, acceptance criteria (for non-event-sourced systems)\n- architect: System design, ADRs, technology decisions, infrastructure, security architecture, technical risks\n- pm: Project management, work tracking, GitHub issues, git workflow, branches, PRs, milestones\n- build: Implementation, writing code, TDD, tests, debugging, refactoring\n\nCLASSIFICATION RULES:\n1. Look for keywords and intent, not just surface-level matching\n2. Consider the overall goal of the request\n3. When uncertain between two modes, choose the one that better fits the primary intent\n4. \"discover\" is for early-stage exploration before requirements are defined\n5. \"model\" vs \"prd\" depends on whether the project uses event sourcing\n6. \"build\" is for any hands-on coding work\n\nRespond with ONLY valid JSON in this exact format:\n{\"suggestedMode\": \"<mode>\", \"confidence\": <0.0-1.0>, \"reason\": \"<brief explanation>\"}\n\nExample responses:\n{\"suggestedMode\": \"build\", \"confidence\": 0.95, \"reason\": \"User is asking to implement a specific feature with tests\"}\n{\"suggestedMode\": \"architect\", \"confidence\": 0.82, \"reason\": \"User wants to discuss database technology options\"}\n{\"suggestedMode\": \"discover\", \"confidence\": 0.78, \"reason\": \"User is exploring the problem space and user needs\"}`;\n\n/**\n * Extract JSON object from a string that may contain additional text.\n * Handles nested braces correctly by counting brace depth.\n */\nfunction extractJsonObject(text: string): string | null {\n const startIndex = text.indexOf(\"{\");\n if (startIndex === -1) return null;\n\n let depth = 0;\n let inString = false;\n let escapeNext = false;\n\n for (let i = startIndex; i < text.length; i++) {\n const char = text[i];\n\n if (escapeNext) {\n escapeNext = false;\n continue;\n }\n\n if (char === \"\\\\\") {\n escapeNext = true;\n continue;\n }\n\n if (char === '\"') {\n inString = !inString;\n continue;\n }\n\n if (!inString) {\n if (char === \"{\") depth++;\n else if (char === \"}\") {\n depth--;\n if (depth === 0) {\n return text.slice(startIndex, i + 1);\n }\n }\n }\n }\n\n return null;\n}\n\n/**\n * Parse the LLM's JSON response\n */\nfunction parseClassificationResponse(\n response: string,\n currentMode: SdlcMode\n): Omit<ClassifyRequestResult, \"shouldSwitch\"> {\n try {\n // Extract JSON from response using balanced brace matching\n const jsonString = extractJsonObject(response);\n if (!jsonString) {\n throw new Error(\"No JSON found in response\");\n }\n\n const parsed = JSON.parse(jsonString);\n\n // Validate required fields\n if (!parsed.suggestedMode || typeof parsed.confidence !== \"number\" || !parsed.reason) {\n throw new Error(\"Missing required fields in response\");\n }\n\n // Validate mode is valid\n const validModes: ClassificationMode[] = [\n \"discover\",\n \"model\",\n \"prd\",\n \"architect\",\n \"pm\",\n \"build\",\n ];\n if (!validModes.includes(parsed.suggestedMode)) {\n throw new Error(`Invalid mode: ${parsed.suggestedMode}`);\n }\n\n // Clamp confidence to valid range\n const confidence = Math.max(0, Math.min(1, parsed.confidence));\n\n return {\n suggestedMode: parsed.suggestedMode as ClassificationMode,\n confidence,\n reason: parsed.reason,\n currentMode,\n };\n } catch (error) {\n log.warn(\"Failed to parse classification response\", { response, error });\n // Return a safe fallback - stay in current mode\n return {\n suggestedMode: currentMode,\n confidence: 0,\n reason: \"Classification failed - staying in current mode\",\n currentMode,\n error: error instanceof Error ? error.message : \"Unknown parse error\",\n };\n }\n}\n\n/**\n * Get the configured classifier model\n */\nfunction getClassifierModel(config: SdlcConfig): { providerID: string; modelID: string } {\n const modelString = config.routing?.classifierModel || DEFAULTS.routing.classifierModel;\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"anthropic\", modelID: modelID || modelString };\n}\n\n/**\n * Create the sdlc_classify_request tool\n */\nexport function createClassifyRequestTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Classify a user request to detect if it might be better suited for a different SDLC mode.\n\nUse this tool when the user's request seems to shift focus from the current mode's domain.\n\nReturns:\n- suggestedMode: The mode that best matches the request\n- confidence: Score from 0-1 indicating classification certainty\n- reason: Brief explanation of the classification\n- shouldSwitch: true if confidence > 0.7 AND mode differs from current\n\nIf shouldSwitch is true, use the question tool to ask the user if they want to switch modes.\nNote: Mode switching requires the user to press Tab and select a new mode.`,\n\n args: {\n request: tool.schema.string().describe(\"The user's request text to classify\"),\n currentMode: tool.schema\n .enum([\"discover\", \"model\", \"architect\", \"pm\", \"build\"])\n .describe(\"The current SDLC mode\"),\n },\n\n async execute(args): Promise<string> {\n const result = await classifyRequest(ctx, config, args.request, args.currentMode as SdlcMode);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\n/**\n * Spawn a classifier session and get the response\n */\nasync function spawnClassifierAndWait(\n ctx: PluginInput,\n config: SdlcConfig,\n prompt: string\n): Promise<{ success: boolean; content?: string; error?: string }> {\n try {\n const model = getClassifierModel(config);\n\n // Create a session for classification\n const createResult = await ctx.client.session.create({\n body: {\n title: \"SDLC Mode Classification\",\n },\n });\n\n if (!createResult.data?.id) {\n return { success: false, error: \"Failed to create classifier session\" };\n }\n\n const sessionId = createResult.data.id;\n\n // Send the classification prompt\n const promptResult = await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model,\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n if (!promptResult.data) {\n return { success: false, error: \"No response from classifier\" };\n }\n\n // Get the response messages\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n return { success: false, error: \"No messages in classifier session\" };\n }\n\n // Extract text from message parts\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const content = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n return { success: true, content };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return { success: false, error: `Classifier spawn failed: ${message}` };\n }\n}\n\n/**\n * Classify a user request to determine the best SDLC mode\n */\nasync function classifyRequest(\n ctx: PluginInput,\n config: SdlcConfig,\n request: string,\n currentMode: SdlcMode\n): Promise<ClassifyRequestResult> {\n // Check if current mode is enabled\n const enabledModes = config.modes?.enabled || DEFAULTS.modes.enabled;\n if (!enabledModes.includes(currentMode)) {\n return {\n suggestedMode: currentMode,\n confidence: 0,\n reason: `Current mode '${currentMode}' is not in enabled modes`,\n shouldSwitch: false,\n currentMode,\n error: \"Invalid current mode\",\n suggestion: `Enabled modes are: ${enabledModes.join(\", \")}`,\n };\n }\n\n const classifierModel = getClassifierModel(config);\n log.debug(\"Classifying request\", { currentMode, classifierModel, requestLength: request.length });\n\n try {\n // Build the classification prompt\n const prompt = `${CLASSIFICATION_PROMPT}\n\nCurrent mode: ${currentMode}\nUser request: \"${request}\"`;\n\n // Use session-based API to get classification\n const response = await spawnClassifierAndWait(ctx, config, prompt);\n\n if (!response.success || !response.content) {\n return {\n suggestedMode: currentMode,\n confidence: 0,\n reason: response.error || \"No response from classifier\",\n shouldSwitch: false,\n currentMode,\n error: response.error,\n suggestion: \"Check classifier model configuration and API access\",\n };\n }\n\n const parsed = parseClassificationResponse(response.content, currentMode);\n\n // Determine if we should suggest switching\n // Only suggest if confidence > 0.7 AND mode differs from current\n // Also consider prd vs model based on eventModeling config\n let effectiveSuggestedMode = parsed.suggestedMode;\n\n // If suggested \"prd\" but eventModeling is enabled, use \"model\" instead\n // If suggested \"model\" but eventModeling is disabled, use \"prd\" (but we don't have a prd mode, so stay in current)\n if (parsed.suggestedMode === \"prd\" && config.modes?.eventModeling !== false) {\n effectiveSuggestedMode = \"model\";\n }\n\n // prd is not a real mode, it's just for classification\n // If we get prd and eventModeling is false, treat it as staying in current mode\n if (parsed.suggestedMode === \"prd\" && config.modes?.eventModeling === false) {\n // prd is the right choice but not a real mode - user needs to create PRD in current mode\n // We'll still report it but shouldn't trigger a switch\n }\n\n const shouldSwitch =\n parsed.confidence > 0.7 &&\n effectiveSuggestedMode !== currentMode &&\n effectiveSuggestedMode !== \"prd\" && // prd is not a real mode\n enabledModes.includes(effectiveSuggestedMode as SdlcMode);\n\n log.info(\"Classification result\", {\n suggestedMode: parsed.suggestedMode,\n effectiveSuggestedMode,\n confidence: parsed.confidence,\n shouldSwitch,\n currentMode,\n });\n\n return {\n ...parsed,\n suggestedMode: effectiveSuggestedMode as ClassificationMode,\n shouldSwitch,\n };\n } catch (error) {\n log.error(\"Classification failed\", { error });\n\n return {\n suggestedMode: currentMode,\n confidence: 0,\n reason: \"Classification request failed\",\n shouldSwitch: false,\n currentMode,\n error: error instanceof Error ? error.message : \"Unknown error\",\n suggestion: \"Check classifier model configuration and API access\",\n };\n }\n}\n","/**\n * sdlc_config tool\n *\n * View current Sdlc configuration.\n */\n\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport { VERSION } from \"../../shared/constants.js\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\n\n/**\n * Create the sdlc_config tool\n */\nexport function createConfigTool(config: SdlcConfig): ToolDefinition {\n return tool({\n description: `View the current OpenCode SDLC configuration.\n\nShows:\n- Version information\n- Subscription settings (Claude, OpenAI, Google)\n- Model assignments for each agent role\n- BMAD integration settings\n- Enabled features and MCP servers`,\n\n args: {\n section: tool.schema\n .enum([\"all\", \"subscriptions\", \"models\", \"bmad\", \"features\", \"mcps\"])\n .optional()\n .describe(\"Specific section to view (default: all)\"),\n },\n\n async execute(args): Promise<string> {\n const section = args.section || \"all\";\n\n if (section === \"all\") {\n return JSON.stringify(\n {\n sdlcVersion: VERSION,\n configVersion: config.version,\n subscriptions: config.subscriptions,\n models: config.models,\n bmad: config.bmad,\n features: config.features,\n mcps: config.mcps,\n },\n null,\n 2\n );\n }\n\n // Return specific section\n const sectionData: Record<string, unknown> = {\n subscriptions: config.subscriptions,\n models: config.models,\n bmad: config.bmad,\n features: config.features,\n mcps: config.mcps,\n };\n\n return JSON.stringify(\n {\n section,\n data: sectionData[section] || null,\n },\n null,\n 2\n );\n },\n });\n}\n","/**\n * Agent Output Schemas\n *\n * Zod schemas defining the expected JSON output format from subagents.\n * Agents MUST respond with valid JSON matching these schemas.\n *\n * Usage:\n * - Agents are instructed to output ONLY valid JSON\n * - Responses are validated against these schemas\n * - Invalid responses trigger retry with schema error feedback\n */\n\nimport { z } from \"zod\";\n\n// ============================================================================\n// Shared Components\n// ============================================================================\n\n/**\n * User input request embedded in agent response\n * When an agent needs clarification, it includes this instead of completing\n */\nexport const AwaitingUserInputSchema = z.object({\n question: z.string().describe(\"The question to ask the user\"),\n options: z.array(z.string()).optional().describe(\"Multiple choice options if applicable\"),\n context: z.string().optional().describe(\"Additional context for the question\"),\n});\n\n/**\n * Gate failure response when agent cannot proceed due to missing context\n */\nexport const GateFailureSchema = z.object({\n reason: z.string().describe(\"Why the invocation gate failed\"),\n missingFields: z.array(z.string()).describe(\"Fields that were missing or invalid\"),\n suggestion: z.string().optional().describe(\"How to fix the gate failure\"),\n});\n\n// ============================================================================\n// TDD Agent Output Schemas\n// ============================================================================\n\n/**\n * RED agent output - Writing a failing test\n */\nexport const RedAgentOutputSchema = z.object({\n // Success case\n testFile: z.string().optional().describe(\"Path to the test file created/modified\"),\n testName: z.string().optional().describe(\"Full test name (describe > it)\"),\n failureMessage: z.string().optional().describe(\"The test failure message\"),\n verificationResult: z\n .enum([\"FAIL\", \"PASS\", \"ERROR\", \"NOT_RUN\"])\n .describe(\"Result of running the test\"),\n verificationOutput: z.string().optional().describe(\"Full test runner output\"),\n\n // Workflow markers\n awaitingUserInput: AwaitingUserInputSchema.optional(),\n gateFailure: GateFailureSchema.optional(),\n\n // Optional explanation\n explanation: z.string().optional().describe(\"Reasoning about the test written\"),\n suggestions: z.array(z.string()).optional().describe(\"Suggestions for next steps\"),\n});\n\n/**\n * GREEN agent output - Making the test pass\n */\nexport const GreenAgentOutputSchema = z.object({\n // Success case\n implementationFiles: z\n .array(z.string())\n .optional()\n .describe(\"Files created/modified for implementation\"),\n testResult: z.enum([\"PASS\", \"FAIL\", \"ERROR\", \"NOT_RUN\"]).describe(\"Result of running tests\"),\n verificationOutput: z.string().optional().describe(\"Full test runner output\"),\n\n // Workflow markers\n awaitingUserInput: AwaitingUserInputSchema.optional(),\n gateFailure: GateFailureSchema.optional(),\n architectureConflict: z\n .object({\n description: z.string(),\n affectedFiles: z.array(z.string()).optional(),\n suggestion: z.string().optional(),\n })\n .optional(),\n\n // Optional explanation\n explanation: z.string().optional().describe(\"Reasoning about the implementation\"),\n codeChanges: z.string().optional().describe(\"Summary of code changes made\"),\n});\n\n/**\n * Domain violation detail for DOMAIN agent\n */\nexport const DomainViolationSchema = z.object({\n type: z\n .enum([\"primitive_obsession\", \"invalid_state\", \"structural_type\", \"parse_validate\", \"naming\"])\n .describe(\"Type of domain violation\"),\n location: z.string().describe(\"File:line or file path where violation occurs\"),\n description: z.string().describe(\"What the violation is\"),\n suggestion: z.string().describe(\"How to fix the violation\"),\n});\n\n/**\n * DOMAIN agent output - Domain integrity review\n */\nexport const DomainAgentOutputSchema = z.object({\n // Decision\n decision: z.enum([\"APPROVED\", \"VETO\"]).describe(\"Whether domain review passed\"),\n\n // Success case (APPROVED)\n typesCreated: z.array(z.string()).optional().describe(\"New domain types created\"),\n typesModified: z.array(z.string()).optional().describe(\"Existing types modified\"),\n\n // Veto case\n violations: z.array(DomainViolationSchema).optional().describe(\"Domain violations found\"),\n vetoReason: z.string().optional().describe(\"Summary of why review was vetoed\"),\n\n // Verification\n verificationResult: z\n .enum([\"COMPILES\", \"ERROR\", \"NOT_RUN\"])\n .optional()\n .describe(\"Result of type checking\"),\n verificationOutput: z.string().optional().describe(\"Full type checker output\"),\n\n // Workflow markers\n awaitingUserInput: AwaitingUserInputSchema.optional(),\n gateFailure: GateFailureSchema.optional(),\n\n // Optional explanation\n explanation: z.string().optional().describe(\"Reasoning about the domain review\"),\n recommendations: z.array(z.string()).optional().describe(\"Non-blocking recommendations\"),\n});\n\n// ============================================================================\n// Event Modeling Agent Output Schemas\n// ============================================================================\n\n/**\n * Actor identified during domain discovery\n */\nexport const ActorSchema = z.object({\n name: z.string().describe(\"Actor name\"),\n type: z.enum([\"human\", \"system\", \"time\"]).describe(\"Type of actor\"),\n goals: z.array(z.string()).describe(\"What this actor wants to achieve\"),\n interactions: z.array(z.string()).optional().describe(\"How they interact with the system\"),\n});\n\n/**\n * Process identified during domain discovery\n */\nexport const ProcessSchema = z.object({\n name: z.string().describe(\"Process name\"),\n trigger: z.string().describe(\"What triggers this process\"),\n actors: z.array(z.string()).describe(\"Actors involved\"),\n outputs: z.array(z.string()).describe(\"What this process produces\"),\n});\n\n/**\n * Discovery agent output - Domain discovery for event modeling\n */\nexport const DiscoveryAgentOutputSchema = z.object({\n // Domain overview\n domainName: z.string().describe(\"Name of the domain\"),\n summary: z.string().describe(\"Brief domain description\"),\n\n // Discovered elements\n actors: z.array(ActorSchema).describe(\"Identified actors\"),\n processes: z.array(ProcessSchema).describe(\"Major business processes\"),\n boundaries: z\n .object({\n core: z.array(z.string()).describe(\"Core domain elements\"),\n supporting: z.array(z.string()).describe(\"Supporting subdomain elements\"),\n external: z.array(z.string()).describe(\"External/generic elements\"),\n })\n .optional(),\n glossary: z.record(z.string(), z.string()).optional().describe(\"Key terms and definitions\"),\n openQuestions: z.array(z.string()).optional().describe(\"Items needing clarification\"),\n\n // Workflow markers\n awaitingUserInput: AwaitingUserInputSchema.optional(),\n\n // Document output\n document: z.string().optional().describe(\"Full markdown document for saving\"),\n});\n\n/**\n * Event in a workflow\n */\nexport const WorkflowEventSchema = z.object({\n name: z.string().describe(\"Event name (past tense)\"),\n description: z.string().describe(\"What happened\"),\n data: z.array(z.string()).optional().describe(\"Data carried by the event\"),\n});\n\n/**\n * Command in a workflow\n */\nexport const WorkflowCommandSchema = z.object({\n name: z.string().describe(\"Command name (imperative)\"),\n actor: z.string().describe(\"Who issues this command\"),\n description: z.string().describe(\"What the command does\"),\n parameters: z.array(z.string()).optional().describe(\"Command parameters\"),\n});\n\n/**\n * View/read model in a workflow\n */\nexport const WorkflowViewSchema = z.object({\n name: z.string().describe(\"View name\"),\n purpose: z.string().describe(\"What question this view answers\"),\n fields: z.array(z.string()).optional().describe(\"Data fields in the view\"),\n});\n\n/**\n * Workflow designer agent output\n */\nexport const WorkflowAgentOutputSchema = z.object({\n workflowName: z.string().describe(\"Name of the workflow\"),\n description: z.string().describe(\"What this workflow accomplishes\"),\n\n // Workflow elements\n commands: z.array(WorkflowCommandSchema).describe(\"Commands in the workflow\"),\n events: z.array(WorkflowEventSchema).describe(\"Events produced\"),\n views: z.array(WorkflowViewSchema).describe(\"Read models/views\"),\n\n // Slice information\n slices: z\n .array(\n z.object({\n name: z.string(),\n command: z.string(),\n events: z.array(z.string()),\n view: z.string().optional(),\n })\n )\n .optional()\n .describe(\"Vertical slices for implementation\"),\n\n // Workflow markers\n awaitingUserInput: AwaitingUserInputSchema.optional(),\n\n // Document output\n document: z.string().optional().describe(\"Full markdown document for saving\"),\n});\n\n/**\n * GWT (Given-When-Then) scenario\n */\nexport const GwtScenarioSchema = z.object({\n name: z.string().describe(\"Scenario name\"),\n given: z.array(z.string()).describe(\"Preconditions\"),\n when: z.string().describe(\"Action/trigger\"),\n expected: z.array(z.string()).describe(\"Expected outcomes (then)\"),\n examples: z\n .array(z.record(z.string(), z.string()))\n .optional()\n .describe(\"Example data for scenario outline\"),\n});\n\n/**\n * GWT generator agent output\n */\nexport const GwtAgentOutputSchema = z.object({\n featureName: z.string().describe(\"Feature being specified\"),\n description: z.string().describe(\"Feature description\"),\n scenarios: z.array(GwtScenarioSchema).describe(\"GWT scenarios\"),\n\n // Automation readiness\n automationSuggestions: z.array(z.string()).optional().describe(\"Suggestions for test automation\"),\n\n // Workflow markers\n awaitingUserInput: AwaitingUserInputSchema.optional(),\n\n // Document output\n document: z.string().optional().describe(\"Full Gherkin document for saving\"),\n});\n\n/**\n * Model validation issue\n */\nexport const ModelValidationIssueSchema = z.object({\n severity: z.enum([\"error\", \"warning\", \"info\"]).describe(\"Issue severity\"),\n location: z.string().describe(\"Where the issue was found\"),\n message: z.string().describe(\"Description of the issue\"),\n suggestion: z.string().optional().describe(\"How to fix\"),\n});\n\n/**\n * Model validator agent output\n */\nexport const ModelValidatorOutputSchema = z.object({\n valid: z.boolean().describe(\"Whether the model is valid overall\"),\n issues: z.array(ModelValidationIssueSchema).describe(\"Issues found\"),\n coverage: z\n .object({\n commandsCovered: z.number(),\n eventsCovered: z.number(),\n viewsCovered: z.number(),\n })\n .optional()\n .describe(\"Coverage metrics\"),\n\n // Workflow markers\n awaitingUserInput: AwaitingUserInputSchema.optional(),\n\n // Summary\n summary: z.string().describe(\"Overall validation summary\"),\n});\n\n// ============================================================================\n// Review Agent Output Schemas\n// ============================================================================\n\n/**\n * Review finding from any review agent\n */\nexport const ReviewFindingSchema = z.object({\n severity: z.enum([\"critical\", \"major\", \"minor\", \"suggestion\"]).describe(\"Finding severity\"),\n category: z.string().describe(\"Category of finding\"),\n location: z.string().optional().describe(\"File:line or component\"),\n description: z.string().describe(\"What was found\"),\n recommendation: z.string().describe(\"What to do about it\"),\n});\n\n/**\n * Party review perspective from a single persona\n */\nexport const PartyPerspectiveSchema = z.object({\n persona: z.string().describe(\"Persona name (e.g., Winston, Amelia)\"),\n role: z.string().describe(\"Role (e.g., architect, developer)\"),\n perspective: z.string().describe(\"Main perspective text\"),\n concerns: z.array(z.string()).describe(\"Specific concerns raised\"),\n recommendations: z.array(z.string()).describe(\"Recommendations\"),\n});\n\n/**\n * Party review agent output\n */\nexport const PartyReviewOutputSchema = z.object({\n topic: z.string().describe(\"Topic being reviewed\"),\n perspectives: z.array(PartyPerspectiveSchema).describe(\"Perspectives from each persona\"),\n synthesis: z.string().describe(\"Synthesized summary of discussion\"),\n consensus: z.array(z.string()).optional().describe(\"Points of agreement\"),\n tensions: z.array(z.string()).optional().describe(\"Points of disagreement\"),\n recommendation: z.string().optional().describe(\"Final recommendation if applicable\"),\n\n // Workflow markers\n awaitingUserInput: AwaitingUserInputSchema.optional(),\n});\n\n/**\n * Story review agent output\n */\nexport const StoryReviewOutputSchema = z.object({\n storyTitle: z.string().describe(\"Story/issue being reviewed\"),\n findings: z.array(ReviewFindingSchema).describe(\"Review findings\"),\n acceptanceCriteriaReview: z\n .object({\n complete: z.boolean(),\n missing: z.array(z.string()).optional(),\n unclear: z.array(z.string()).optional(),\n })\n .optional(),\n estimateAssessment: z\n .object({\n appropriate: z.boolean(),\n reason: z.string(),\n })\n .optional(),\n recommendation: z.enum([\"approve\", \"request_changes\", \"needs_discussion\"]),\n\n // Workflow markers\n awaitingUserInput: AwaitingUserInputSchema.optional(),\n});\n\n/**\n * PR review agent output\n */\nexport const PrReviewOutputSchema = z.object({\n prTitle: z.string().describe(\"PR being reviewed\"),\n findings: z.array(ReviewFindingSchema).describe(\"Code review findings\"),\n testCoverage: z\n .object({\n adequate: z.boolean(),\n suggestions: z.array(z.string()).optional(),\n })\n .optional(),\n domainReview: z\n .object({\n approved: z.boolean(),\n concerns: z.array(z.string()).optional(),\n })\n .optional(),\n recommendation: z.enum([\"approve\", \"request_changes\", \"needs_discussion\"]),\n summary: z.string().describe(\"Overall review summary\"),\n\n // Workflow markers\n awaitingUserInput: AwaitingUserInputSchema.optional(),\n});\n\n// ============================================================================\n// Architecture Agent Output Schemas\n// ============================================================================\n\n/**\n * ADR (Architecture Decision Record) agent output\n */\nexport const AdrAgentOutputSchema = z.object({\n title: z.string().describe(\"ADR title\"),\n status: z.enum([\"proposed\", \"accepted\", \"deprecated\", \"superseded\"]),\n context: z.string().describe(\"Context/problem description\"),\n decision: z.string().describe(\"The decision made\"),\n consequences: z\n .object({\n positive: z.array(z.string()),\n negative: z.array(z.string()),\n neutral: z.array(z.string()).optional(),\n })\n .describe(\"Consequences of the decision\"),\n alternatives: z\n .array(\n z.object({\n option: z.string(),\n reason: z.string(),\n })\n )\n .optional()\n .describe(\"Alternatives considered\"),\n\n // Workflow markers\n awaitingUserInput: AwaitingUserInputSchema.optional(),\n\n // Document output\n document: z.string().optional().describe(\"Full ADR markdown for saving\"),\n});\n\n// ============================================================================\n// Generic/Utility Agent Output Schemas\n// ============================================================================\n\n/**\n * File updater agent output\n */\nexport const FileUpdaterOutputSchema = z.object({\n filesModified: z.array(z.string()).describe(\"Files that were modified\"),\n filesCreated: z.array(z.string()).optional().describe(\"Files that were created\"),\n filesDeleted: z.array(z.string()).optional().describe(\"Files that were deleted\"),\n summary: z.string().describe(\"Summary of changes\"),\n\n // Workflow markers\n awaitingUserInput: AwaitingUserInputSchema.optional(),\n});\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\n// Shared types\nexport type AwaitingUserInput = z.infer<typeof AwaitingUserInputSchema>;\nexport type GateFailure = z.infer<typeof GateFailureSchema>;\n\n// TDD agent types\nexport type RedAgentOutput = z.infer<typeof RedAgentOutputSchema>;\nexport type GreenAgentOutput = z.infer<typeof GreenAgentOutputSchema>;\nexport type DomainAgentOutput = z.infer<typeof DomainAgentOutputSchema>;\nexport type DomainViolation = z.infer<typeof DomainViolationSchema>;\n\n// Event modeling agent types\nexport type DiscoveryAgentOutput = z.infer<typeof DiscoveryAgentOutputSchema>;\nexport type WorkflowAgentOutput = z.infer<typeof WorkflowAgentOutputSchema>;\nexport type GwtAgentOutput = z.infer<typeof GwtAgentOutputSchema>;\nexport type ModelValidatorOutput = z.infer<typeof ModelValidatorOutputSchema>;\nexport type Actor = z.infer<typeof ActorSchema>;\nexport type Process = z.infer<typeof ProcessSchema>;\nexport type WorkflowEvent = z.infer<typeof WorkflowEventSchema>;\nexport type WorkflowCommand = z.infer<typeof WorkflowCommandSchema>;\nexport type WorkflowView = z.infer<typeof WorkflowViewSchema>;\nexport type GwtScenario = z.infer<typeof GwtScenarioSchema>;\n\n// Review agent types\nexport type PartyReviewOutput = z.infer<typeof PartyReviewOutputSchema>;\nexport type StoryReviewOutput = z.infer<typeof StoryReviewOutputSchema>;\nexport type PrReviewOutput = z.infer<typeof PrReviewOutputSchema>;\nexport type ReviewFinding = z.infer<typeof ReviewFindingSchema>;\nexport type PartyPerspective = z.infer<typeof PartyPerspectiveSchema>;\n\n// Architecture agent types\nexport type AdrAgentOutput = z.infer<typeof AdrAgentOutputSchema>;\n\n// Utility agent types\nexport type FileUpdaterOutput = z.infer<typeof FileUpdaterOutputSchema>;\n","/**\n * Agent Input Schemas\n *\n * Zod schemas defining the context passed to subagents.\n * These consolidate and formalize the invocation gate requirements.\n *\n * Input schemas define what the orchestrator MUST provide to each agent\n * before the agent can proceed with its work.\n */\n\nimport { z } from \"zod\";\n\n// ============================================================================\n// TDD Agent Input Schemas\n// ============================================================================\n\n/**\n * RED agent input - Context for writing a failing test\n */\nexport const RedAgentInputSchema = z.discriminatedUnion(\"type\", [\n // Starting a new feature\n z.object({\n type: z.literal(\"FIRST_TEST\"),\n acceptanceCriteria: z.array(z.string()).min(1).describe(\"Acceptance criteria to test\"),\n issueNumber: z.number().optional().describe(\"GitHub issue number if applicable\"),\n existingTests: z.array(z.string()).optional().describe(\"Existing test files for context\"),\n }),\n\n // Continuing after a successful GREEN cycle\n z.object({\n type: z.literal(\"CONTINUING\"),\n previousTest: z.string().describe(\"Name of the test that just passed\"),\n previousTestStatus: z.literal(\"PASSES\"),\n refactoringDone: z.string().describe(\"What refactoring was done (or 'None')\"),\n nextCriteria: z.string().describe(\"Next acceptance criterion to test\"),\n }),\n\n // Breaking down a complex test\n z.object({\n type: z.literal(\"DRILL_DOWN\"),\n parentTest: z.string().describe(\"The test being broken down\"),\n focusedBehavior: z.string().describe(\"Specific behavior to focus on\"),\n }),\n]);\n\n/**\n * GREEN agent input - Context for implementing to pass the test\n */\nexport const GreenAgentInputSchema = z.object({\n redPhaseComplete: z.object({\n test: z.string().describe(\"Test name that should pass\"),\n testFile: z.string().describe(\"Path to the test file\"),\n failure: z.string().describe(\"Current failure message\"),\n }),\n domainCheckPassed: z.object({\n typesCreated: z.array(z.string()).describe(\"Domain types created (empty if none needed)\"),\n concerns: z.string().describe(\"'none' or description of resolved concerns\").default(\"none\"),\n }),\n existingImplementation: z\n .array(z.string())\n .optional()\n .describe(\"Existing impl files for context\"),\n});\n\n/**\n * DOMAIN agent input - Context for domain integrity review\n */\nexport const DomainAgentInputSchema = z.discriminatedUnion(\"type\", [\n // Review after RED phase (before GREEN)\n z.object({\n type: z.literal(\"AFTER_RED\"),\n test: z.string().describe(\"Test name written\"),\n testFile: z.string().describe(\"Path to test file\"),\n failure: z.string().describe(\"Test failure message\"),\n }),\n\n // Review after GREEN phase\n z.object({\n type: z.literal(\"AFTER_GREEN\"),\n test: z.string().describe(\"Test name\"),\n result: z.string().describe(\"'PASSES' or failure message\"),\n filesModified: z.array(z.string()).describe(\"Implementation files modified\"),\n }),\n\n // Full PR review\n z.object({\n type: z.literal(\"PR_REVIEW\"),\n files: z.array(z.string()).describe(\"Files in the PR\"),\n description: z.string().describe(\"PR description\"),\n }),\n]);\n\n// ============================================================================\n// Event Modeling Agent Input Schemas\n// ============================================================================\n\n/**\n * Discovery agent input - Context for domain discovery\n */\nexport const DiscoveryAgentInputSchema = z.object({\n domainName: z.string().describe(\"Name of the domain to discover\"),\n context: z.string().optional().describe(\"Additional context (PRD, research, etc.)\"),\n existingOverview: z.string().optional().describe(\"Existing domain overview to build on\"),\n});\n\n/**\n * Workflow designer agent input\n */\nexport const WorkflowAgentInputSchema = z.object({\n workflowName: z.string().describe(\"Name of the workflow to design\"),\n domainOverview: z.string().describe(\"Reference to domain overview document\"),\n relatedWorkflows: z.array(z.string()).optional().describe(\"Related workflows for context\"),\n constraints: z.array(z.string()).optional().describe(\"Known constraints or requirements\"),\n});\n\n/**\n * GWT generator agent input\n */\nexport const GwtAgentInputSchema = z.object({\n sliceName: z.string().describe(\"Name of the slice/scenario to specify\"),\n workflow: z.string().describe(\"Reference to the workflow this belongs to\"),\n commands: z.array(z.string()).optional().describe(\"Commands involved\"),\n events: z.array(z.string()).optional().describe(\"Events involved\"),\n acceptanceCriteria: z.array(z.string()).optional().describe(\"Specific AC to cover\"),\n});\n\n/**\n * Model validator agent input\n */\nexport const ModelValidatorInputSchema = z.object({\n scope: z.enum([\"workflow\", \"full\"]).describe(\"Validation scope\"),\n workflowName: z.string().optional().describe(\"Specific workflow to validate\"),\n modelPath: z.string().optional().describe(\"Path to model files\"),\n});\n\n// ============================================================================\n// Review Agent Input Schemas\n// ============================================================================\n\n/**\n * Party review agent input\n */\nexport const PartyReviewInputSchema = z.object({\n topic: z.string().describe(\"Topic or decision to discuss\"),\n description: z.string().describe(\"Detailed description\"),\n context: z.string().optional().describe(\"Additional context\"),\n options: z.array(z.string()).optional().describe(\"Options being considered\"),\n personas: z.array(z.string()).optional().describe(\"Specific personas to include\"),\n});\n\n/**\n * Story review agent input\n */\nexport const StoryReviewInputSchema = z.object({\n issueNumber: z.number().describe(\"GitHub issue number\"),\n issueTitle: z.string().describe(\"Issue title\"),\n issueBody: z.string().describe(\"Issue body/description\"),\n acceptanceCriteria: z.array(z.string()).optional().describe(\"Extracted AC\"),\n});\n\n/**\n * PR review agent input\n */\nexport const PrReviewInputSchema = z.object({\n prNumber: z.number().describe(\"PR number\"),\n prTitle: z.string().describe(\"PR title\"),\n prBody: z.string().describe(\"PR description\"),\n filesChanged: z.array(z.string()).describe(\"List of changed files\"),\n diff: z.string().optional().describe(\"PR diff (may be truncated)\"),\n linkedIssue: z.number().optional().describe(\"Linked issue number\"),\n});\n\n// ============================================================================\n// Architecture Agent Input Schemas\n// ============================================================================\n\n/**\n * ADR agent input\n */\nexport const AdrAgentInputSchema = z.object({\n title: z.string().describe(\"Decision title\"),\n context: z.string().describe(\"Context/problem requiring decision\"),\n options: z\n .array(\n z.object({\n name: z.string(),\n description: z.string(),\n })\n )\n .optional()\n .describe(\"Options being considered\"),\n constraints: z.array(z.string()).optional().describe(\"Known constraints\"),\n existingAdrs: z.array(z.string()).optional().describe(\"Related ADRs for context\"),\n});\n\n// ============================================================================\n// Utility Agent Input Schemas\n// ============================================================================\n\n/**\n * File updater agent input\n */\nexport const FileUpdaterInputSchema = z.object({\n task: z.string().describe(\"What files need to be updated\"),\n files: z.array(z.string()).describe(\"Files to modify\"),\n instructions: z.string().describe(\"Specific instructions for modifications\"),\n});\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\n// TDD input types\nexport type RedAgentInput = z.infer<typeof RedAgentInputSchema>;\nexport type GreenAgentInput = z.infer<typeof GreenAgentInputSchema>;\nexport type DomainAgentInput = z.infer<typeof DomainAgentInputSchema>;\n\n// Event modeling input types\nexport type DiscoveryAgentInput = z.infer<typeof DiscoveryAgentInputSchema>;\nexport type WorkflowAgentInput = z.infer<typeof WorkflowAgentInputSchema>;\nexport type GwtAgentInput = z.infer<typeof GwtAgentInputSchema>;\nexport type ModelValidatorInput = z.infer<typeof ModelValidatorInputSchema>;\n\n// Review input types\nexport type PartyReviewInput = z.infer<typeof PartyReviewInputSchema>;\nexport type StoryReviewInput = z.infer<typeof StoryReviewInputSchema>;\nexport type PrReviewInput = z.infer<typeof PrReviewInputSchema>;\n\n// Architecture input types\nexport type AdrAgentInput = z.infer<typeof AdrAgentInputSchema>;\n\n// Utility input types\nexport type FileUpdaterInput = z.infer<typeof FileUpdaterInputSchema>;\n","/**\n * Invocation Gate Protocol\n *\n * Agents require explicit context from the orchestrator before proceeding.\n * This prevents workflow violations where agents are invoked without proper state.\n *\n * Each agent type has specific required context fields:\n * - RED: Must know if FIRST_TEST, CONTINUING, or DRILL_DOWN\n * - DOMAIN: Must know if AFTER_RED or AFTER_GREEN\n * - GREEN: Must have RED_PHASE_COMPLETE and DOMAIN_CHECK_PASSED confirmations\n */\n\nimport { createPluginLogger } from \"./plugin-logger.js\";\n\nconst log = createPluginLogger(\"invocation-gate\");\n\n// ============================================================================\n// RED Agent Context Types\n// ============================================================================\n\n/**\n * Context for first test in a new feature\n */\nexport interface RedContextFirstTest {\n type: \"FIRST_TEST\";\n acceptanceCriteria: string[];\n}\n\n/**\n * Context for continuing after a completed cycle\n */\nexport interface RedContextContinuing {\n type: \"CONTINUING\";\n previousTest: string;\n previousTestStatus: \"PASSES\";\n refactoringDone: string; // \"None\" or description\n nextCriteria: string;\n}\n\n/**\n * Context for drilling down into a complex test\n */\nexport interface RedContextDrillDown {\n type: \"DRILL_DOWN\";\n parentTest: string;\n focusedBehavior: string;\n}\n\n/**\n * Union of all valid RED contexts\n */\nexport type RedContext = RedContextFirstTest | RedContextContinuing | RedContextDrillDown;\n\n// ============================================================================\n// DOMAIN Agent Context Types\n// ============================================================================\n\n/**\n * Context for domain review after RED phase\n */\nexport interface DomainContextAfterRed {\n type: \"AFTER_RED\";\n test: string;\n failure: string;\n}\n\n/**\n * Context for domain review after GREEN phase\n */\nexport interface DomainContextAfterGreen {\n type: \"AFTER_GREEN\";\n test: string;\n result: string; // \"PASSES\" or \"fails with: <error>\"\n filesModified: string[];\n}\n\n/**\n * Context for PR-level domain review\n */\nexport interface DomainContextPrReview {\n type: \"PR_REVIEW\";\n files: string[];\n description: string;\n}\n\n/**\n * Union of all valid DOMAIN contexts\n */\nexport type DomainContext = DomainContextAfterRed | DomainContextAfterGreen | DomainContextPrReview;\n\n// ============================================================================\n// GREEN Agent Context Types\n// ============================================================================\n\n/**\n * Confirmation that RED phase is complete\n */\nexport interface RedPhaseComplete {\n test: string;\n failure: string;\n}\n\n/**\n * Confirmation that DOMAIN check passed\n */\nexport interface DomainCheckPassed {\n typesCreated: string[]; // Empty array if none needed\n concerns: \"none\" | string; // \"none\" or \"Resolved: <description>\"\n}\n\n/**\n * Required context for GREEN agent\n */\nexport interface GreenContext {\n redPhaseComplete: RedPhaseComplete;\n domainCheckPassed: DomainCheckPassed;\n}\n\n// ============================================================================\n// Event Modeling Agent Context Types\n// ============================================================================\n\n/**\n * Context for initial domain discovery\n */\nexport interface DiscoveryContextInitial {\n type: \"INITIAL\";\n domainName: string;\n /** Optional PRD, user research, or other background context */\n backgroundContext?: string;\n}\n\n/**\n * Context for refining existing domain overview\n */\nexport interface DiscoveryContextRefine {\n type: \"REFINE\";\n domainName: string;\n existingOverviewPath: string;\n refinementFocus: string;\n}\n\n/**\n * Union of all valid DISCOVERY contexts\n */\nexport type DiscoveryContext = DiscoveryContextInitial | DiscoveryContextRefine;\n\n/**\n * Context for creating a new workflow design\n */\nexport interface WorkflowContextNew {\n type: \"NEW\";\n workflowName: string;\n domainOverviewPath: string;\n triggerDescription: string;\n}\n\n/**\n * Context for refining an existing workflow\n */\nexport interface WorkflowContextRefine {\n type: \"REFINE\";\n workflowName: string;\n existingWorkflowPath: string;\n refinementFocus: string;\n}\n\n/**\n * Context for adding a slice to an existing workflow\n */\nexport interface WorkflowContextAddSlice {\n type: \"ADD_SLICE\";\n workflowName: string;\n existingWorkflowPath: string;\n sliceDescription: string;\n}\n\n/**\n * Union of all valid WORKFLOW contexts\n */\nexport type WorkflowContext = WorkflowContextNew | WorkflowContextRefine | WorkflowContextAddSlice;\n\n/**\n * Context for generating GWT scenarios from a workflow slice\n */\nexport interface GwtContextFromSlice {\n type: \"FROM_SLICE\";\n workflowName: string;\n workflowPath: string;\n sliceName: string;\n}\n\n/**\n * Context for generating GWT scenarios from a command\n */\nexport interface GwtContextFromCommand {\n type: \"FROM_COMMAND\";\n workflowName: string;\n workflowPath: string;\n commandName: string;\n}\n\n/**\n * Context for generating GWT scenarios from automation trigger\n */\nexport interface GwtContextFromAutomation {\n type: \"FROM_AUTOMATION\";\n workflowName: string;\n workflowPath: string;\n triggerEvent: string;\n}\n\n/**\n * Union of all valid GWT contexts\n */\nexport type GwtContext = GwtContextFromSlice | GwtContextFromCommand | GwtContextFromAutomation;\n\n/**\n * Context for validating the full event model\n */\nexport interface ModelValidatorContextFull {\n type: \"FULL\";\n eventModelPath: string;\n}\n\n/**\n * Context for validating a specific workflow\n */\nexport interface ModelValidatorContextWorkflow {\n type: \"WORKFLOW\";\n workflowPath: string;\n}\n\n/**\n * Context for validating scenarios only\n */\nexport interface ModelValidatorContextScenarios {\n type: \"SCENARIOS\";\n workflowPath: string;\n scenariosPath: string;\n}\n\n/**\n * Union of all valid MODEL_VALIDATOR contexts\n */\nexport type ModelValidatorContext =\n | ModelValidatorContextFull\n | ModelValidatorContextWorkflow\n | ModelValidatorContextScenarios;\n\n// ============================================================================\n// Gate Validation\n// ============================================================================\n\n/**\n * Result of gate validation\n */\nexport interface GateValidationResult {\n valid: boolean;\n error?: string;\n missingFields?: string[];\n}\n\n/**\n * Validate RED context\n */\nexport function validateRedContext(context: unknown): GateValidationResult {\n if (!context || typeof context !== \"object\") {\n return {\n valid: false,\n error: \"RED context is required\",\n missingFields: [\"type\"],\n };\n }\n\n const ctx = context as Record<string, unknown>;\n\n if (!ctx.type || ![\"FIRST_TEST\", \"CONTINUING\", \"DRILL_DOWN\"].includes(ctx.type as string)) {\n return {\n valid: false,\n error: \"RED context type must be FIRST_TEST, CONTINUING, or DRILL_DOWN\",\n missingFields: [\"type\"],\n };\n }\n\n switch (ctx.type) {\n case \"FIRST_TEST\":\n if (!ctx.acceptanceCriteria || !Array.isArray(ctx.acceptanceCriteria)) {\n return {\n valid: false,\n error: \"FIRST_TEST requires acceptanceCriteria array\",\n missingFields: [\"acceptanceCriteria\"],\n };\n }\n break;\n\n case \"CONTINUING\":\n if (!ctx.previousTest || typeof ctx.previousTest !== \"string\") {\n return {\n valid: false,\n error: \"CONTINUING requires previousTest\",\n missingFields: [\"previousTest\"],\n };\n }\n if (ctx.previousTestStatus !== \"PASSES\") {\n return {\n valid: false,\n error: \"CONTINUING requires previousTestStatus to be PASSES\",\n missingFields: [\"previousTestStatus\"],\n };\n }\n if (!ctx.nextCriteria || typeof ctx.nextCriteria !== \"string\") {\n return {\n valid: false,\n error: \"CONTINUING requires nextCriteria\",\n missingFields: [\"nextCriteria\"],\n };\n }\n break;\n\n case \"DRILL_DOWN\":\n if (!ctx.parentTest || typeof ctx.parentTest !== \"string\") {\n return {\n valid: false,\n error: \"DRILL_DOWN requires parentTest\",\n missingFields: [\"parentTest\"],\n };\n }\n if (!ctx.focusedBehavior || typeof ctx.focusedBehavior !== \"string\") {\n return {\n valid: false,\n error: \"DRILL_DOWN requires focusedBehavior\",\n missingFields: [\"focusedBehavior\"],\n };\n }\n break;\n }\n\n log.debug(\"RED context validated\", { type: ctx.type });\n return { valid: true };\n}\n\n/**\n * Validate DOMAIN context\n */\nexport function validateDomainContext(context: unknown): GateValidationResult {\n if (!context || typeof context !== \"object\") {\n return {\n valid: false,\n error: \"DOMAIN context is required\",\n missingFields: [\"type\"],\n };\n }\n\n const ctx = context as Record<string, unknown>;\n\n if (!ctx.type || ![\"AFTER_RED\", \"AFTER_GREEN\", \"PR_REVIEW\"].includes(ctx.type as string)) {\n return {\n valid: false,\n error: \"DOMAIN context type must be AFTER_RED, AFTER_GREEN, or PR_REVIEW\",\n missingFields: [\"type\"],\n };\n }\n\n switch (ctx.type) {\n case \"AFTER_RED\":\n if (!ctx.test || typeof ctx.test !== \"string\") {\n return {\n valid: false,\n error: \"AFTER_RED requires test name\",\n missingFields: [\"test\"],\n };\n }\n if (!ctx.failure || typeof ctx.failure !== \"string\") {\n return {\n valid: false,\n error: \"AFTER_RED requires failure message\",\n missingFields: [\"failure\"],\n };\n }\n break;\n\n case \"AFTER_GREEN\":\n if (!ctx.test || typeof ctx.test !== \"string\") {\n return {\n valid: false,\n error: \"AFTER_GREEN requires test name\",\n missingFields: [\"test\"],\n };\n }\n if (!ctx.result || typeof ctx.result !== \"string\") {\n return {\n valid: false,\n error: \"AFTER_GREEN requires result\",\n missingFields: [\"result\"],\n };\n }\n if (!ctx.filesModified || !Array.isArray(ctx.filesModified)) {\n return {\n valid: false,\n error: \"AFTER_GREEN requires filesModified array\",\n missingFields: [\"filesModified\"],\n };\n }\n break;\n\n case \"PR_REVIEW\":\n if (!ctx.files || !Array.isArray(ctx.files)) {\n return {\n valid: false,\n error: \"PR_REVIEW requires files array\",\n missingFields: [\"files\"],\n };\n }\n if (!ctx.description || typeof ctx.description !== \"string\") {\n return {\n valid: false,\n error: \"PR_REVIEW requires description\",\n missingFields: [\"description\"],\n };\n }\n break;\n }\n\n log.debug(\"DOMAIN context validated\", { type: ctx.type });\n return { valid: true };\n}\n\n/**\n * Validate GREEN context\n */\nexport function validateGreenContext(context: unknown): GateValidationResult {\n if (!context || typeof context !== \"object\") {\n return {\n valid: false,\n error: \"GREEN context is required\",\n missingFields: [\"redPhaseComplete\", \"domainCheckPassed\"],\n };\n }\n\n const ctx = context as Record<string, unknown>;\n\n // Validate redPhaseComplete\n if (!ctx.redPhaseComplete || typeof ctx.redPhaseComplete !== \"object\") {\n return {\n valid: false,\n error: \"GREEN requires redPhaseComplete confirmation\",\n missingFields: [\"redPhaseComplete\"],\n };\n }\n\n const red = ctx.redPhaseComplete as Record<string, unknown>;\n if (!red.test || typeof red.test !== \"string\") {\n return {\n valid: false,\n error: \"redPhaseComplete requires test name\",\n missingFields: [\"redPhaseComplete.test\"],\n };\n }\n if (!red.failure || typeof red.failure !== \"string\") {\n return {\n valid: false,\n error: \"redPhaseComplete requires failure message\",\n missingFields: [\"redPhaseComplete.failure\"],\n };\n }\n\n // Validate domainCheckPassed\n if (!ctx.domainCheckPassed || typeof ctx.domainCheckPassed !== \"object\") {\n return {\n valid: false,\n error: \"GREEN requires domainCheckPassed confirmation\",\n missingFields: [\"domainCheckPassed\"],\n };\n }\n\n const domain = ctx.domainCheckPassed as Record<string, unknown>;\n if (!Array.isArray(domain.typesCreated)) {\n return {\n valid: false,\n error: \"domainCheckPassed requires typesCreated array\",\n missingFields: [\"domainCheckPassed.typesCreated\"],\n };\n }\n if (!domain.concerns || typeof domain.concerns !== \"string\") {\n return {\n valid: false,\n error: \"domainCheckPassed requires concerns status\",\n missingFields: [\"domainCheckPassed.concerns\"],\n };\n }\n\n log.debug(\"GREEN context validated\");\n return { valid: true };\n}\n\n/**\n * Validate DISCOVERY context\n */\nexport function validateDiscoveryContext(context: unknown): GateValidationResult {\n if (!context || typeof context !== \"object\") {\n return {\n valid: false,\n error: \"DISCOVERY context is required\",\n missingFields: [\"type\", \"domainName\"],\n };\n }\n\n const ctx = context as Record<string, unknown>;\n\n if (!ctx.type || ![\"INITIAL\", \"REFINE\"].includes(ctx.type as string)) {\n return {\n valid: false,\n error: \"DISCOVERY context type must be INITIAL or REFINE\",\n missingFields: [\"type\"],\n };\n }\n\n if (!ctx.domainName || typeof ctx.domainName !== \"string\") {\n return {\n valid: false,\n error: \"DISCOVERY context requires domainName\",\n missingFields: [\"domainName\"],\n };\n }\n\n if (ctx.type === \"REFINE\") {\n if (!ctx.existingOverviewPath || typeof ctx.existingOverviewPath !== \"string\") {\n return {\n valid: false,\n error: \"REFINE requires existingOverviewPath\",\n missingFields: [\"existingOverviewPath\"],\n };\n }\n if (!ctx.refinementFocus || typeof ctx.refinementFocus !== \"string\") {\n return {\n valid: false,\n error: \"REFINE requires refinementFocus\",\n missingFields: [\"refinementFocus\"],\n };\n }\n }\n\n log.debug(\"DISCOVERY context validated\", { type: ctx.type });\n return { valid: true };\n}\n\n/**\n * Validate WORKFLOW context\n */\nexport function validateWorkflowContext(context: unknown): GateValidationResult {\n if (!context || typeof context !== \"object\") {\n return {\n valid: false,\n error: \"WORKFLOW context is required\",\n missingFields: [\"type\", \"workflowName\"],\n };\n }\n\n const ctx = context as Record<string, unknown>;\n\n if (!ctx.type || ![\"NEW\", \"REFINE\", \"ADD_SLICE\"].includes(ctx.type as string)) {\n return {\n valid: false,\n error: \"WORKFLOW context type must be NEW, REFINE, or ADD_SLICE\",\n missingFields: [\"type\"],\n };\n }\n\n if (!ctx.workflowName || typeof ctx.workflowName !== \"string\") {\n return {\n valid: false,\n error: \"WORKFLOW context requires workflowName\",\n missingFields: [\"workflowName\"],\n };\n }\n\n switch (ctx.type) {\n case \"NEW\":\n if (!ctx.domainOverviewPath || typeof ctx.domainOverviewPath !== \"string\") {\n return {\n valid: false,\n error: \"NEW requires domainOverviewPath\",\n missingFields: [\"domainOverviewPath\"],\n };\n }\n if (!ctx.triggerDescription || typeof ctx.triggerDescription !== \"string\") {\n return {\n valid: false,\n error: \"NEW requires triggerDescription\",\n missingFields: [\"triggerDescription\"],\n };\n }\n break;\n\n case \"REFINE\":\n if (!ctx.existingWorkflowPath || typeof ctx.existingWorkflowPath !== \"string\") {\n return {\n valid: false,\n error: \"REFINE requires existingWorkflowPath\",\n missingFields: [\"existingWorkflowPath\"],\n };\n }\n if (!ctx.refinementFocus || typeof ctx.refinementFocus !== \"string\") {\n return {\n valid: false,\n error: \"REFINE requires refinementFocus\",\n missingFields: [\"refinementFocus\"],\n };\n }\n break;\n\n case \"ADD_SLICE\":\n if (!ctx.existingWorkflowPath || typeof ctx.existingWorkflowPath !== \"string\") {\n return {\n valid: false,\n error: \"ADD_SLICE requires existingWorkflowPath\",\n missingFields: [\"existingWorkflowPath\"],\n };\n }\n if (!ctx.sliceDescription || typeof ctx.sliceDescription !== \"string\") {\n return {\n valid: false,\n error: \"ADD_SLICE requires sliceDescription\",\n missingFields: [\"sliceDescription\"],\n };\n }\n break;\n }\n\n log.debug(\"WORKFLOW context validated\", { type: ctx.type });\n return { valid: true };\n}\n\n/**\n * Validate GWT context\n */\nexport function validateGwtContext(context: unknown): GateValidationResult {\n if (!context || typeof context !== \"object\") {\n return {\n valid: false,\n error: \"GWT context is required\",\n missingFields: [\"type\", \"workflowName\", \"workflowPath\"],\n };\n }\n\n const ctx = context as Record<string, unknown>;\n\n if (\n !ctx.type ||\n ![\"FROM_SLICE\", \"FROM_COMMAND\", \"FROM_AUTOMATION\"].includes(ctx.type as string)\n ) {\n return {\n valid: false,\n error: \"GWT context type must be FROM_SLICE, FROM_COMMAND, or FROM_AUTOMATION\",\n missingFields: [\"type\"],\n };\n }\n\n if (!ctx.workflowName || typeof ctx.workflowName !== \"string\") {\n return {\n valid: false,\n error: \"GWT context requires workflowName\",\n missingFields: [\"workflowName\"],\n };\n }\n\n if (!ctx.workflowPath || typeof ctx.workflowPath !== \"string\") {\n return {\n valid: false,\n error: \"GWT context requires workflowPath\",\n missingFields: [\"workflowPath\"],\n };\n }\n\n switch (ctx.type) {\n case \"FROM_SLICE\":\n if (!ctx.sliceName || typeof ctx.sliceName !== \"string\") {\n return {\n valid: false,\n error: \"FROM_SLICE requires sliceName\",\n missingFields: [\"sliceName\"],\n };\n }\n break;\n\n case \"FROM_COMMAND\":\n if (!ctx.commandName || typeof ctx.commandName !== \"string\") {\n return {\n valid: false,\n error: \"FROM_COMMAND requires commandName\",\n missingFields: [\"commandName\"],\n };\n }\n break;\n\n case \"FROM_AUTOMATION\":\n if (!ctx.triggerEvent || typeof ctx.triggerEvent !== \"string\") {\n return {\n valid: false,\n error: \"FROM_AUTOMATION requires triggerEvent\",\n missingFields: [\"triggerEvent\"],\n };\n }\n break;\n }\n\n log.debug(\"GWT context validated\", { type: ctx.type });\n return { valid: true };\n}\n\n/**\n * Validate MODEL_VALIDATOR context\n */\nexport function validateModelValidatorContext(context: unknown): GateValidationResult {\n if (!context || typeof context !== \"object\") {\n return {\n valid: false,\n error: \"MODEL_VALIDATOR context is required\",\n missingFields: [\"type\"],\n };\n }\n\n const ctx = context as Record<string, unknown>;\n\n if (!ctx.type || ![\"FULL\", \"WORKFLOW\", \"SCENARIOS\"].includes(ctx.type as string)) {\n return {\n valid: false,\n error: \"MODEL_VALIDATOR context type must be FULL, WORKFLOW, or SCENARIOS\",\n missingFields: [\"type\"],\n };\n }\n\n switch (ctx.type) {\n case \"FULL\":\n if (!ctx.eventModelPath || typeof ctx.eventModelPath !== \"string\") {\n return {\n valid: false,\n error: \"FULL requires eventModelPath\",\n missingFields: [\"eventModelPath\"],\n };\n }\n break;\n\n case \"WORKFLOW\":\n if (!ctx.workflowPath || typeof ctx.workflowPath !== \"string\") {\n return {\n valid: false,\n error: \"WORKFLOW requires workflowPath\",\n missingFields: [\"workflowPath\"],\n };\n }\n break;\n\n case \"SCENARIOS\":\n if (!ctx.workflowPath || typeof ctx.workflowPath !== \"string\") {\n return {\n valid: false,\n error: \"SCENARIOS requires workflowPath\",\n missingFields: [\"workflowPath\"],\n };\n }\n if (!ctx.scenariosPath || typeof ctx.scenariosPath !== \"string\") {\n return {\n valid: false,\n error: \"SCENARIOS requires scenariosPath\",\n missingFields: [\"scenariosPath\"],\n };\n }\n break;\n }\n\n log.debug(\"MODEL_VALIDATOR context validated\", { type: ctx.type });\n return { valid: true };\n}\n\n// ============================================================================\n// Gate Error Formatting\n// ============================================================================\n\n/**\n * All agent types that have invocation gates\n */\nexport type GatedAgentType =\n | \"RED\"\n | \"DOMAIN\"\n | \"GREEN\"\n | \"DISCOVERY\"\n | \"WORKFLOW\"\n | \"GWT\"\n | \"MODEL_VALIDATOR\";\n\n/**\n * Format a gate failure message for the agent to return\n */\nexport function formatGateFailure(\n agentType: GatedAgentType,\n validation: GateValidationResult\n): string {\n const contextExamples: Record<GatedAgentType, string> = {\n RED: `Required context (one of):\n- RED_CONTEXT: FIRST_TEST with acceptanceCriteria array\n- RED_CONTEXT: CONTINUING with previousTest, previousTestStatus, nextCriteria\n- RED_CONTEXT: DRILL_DOWN with parentTest, focusedBehavior`,\n\n DOMAIN: `Required context (one of):\n- DOMAIN_CONTEXT: AFTER_RED with test, failure\n- DOMAIN_CONTEXT: AFTER_GREEN with test, result, filesModified\n- DOMAIN_CONTEXT: PR_REVIEW with files, description`,\n\n GREEN: `Required confirmations:\n- redPhaseComplete: { test: string, failure: string }\n- domainCheckPassed: { typesCreated: string[], concerns: \"none\" | \"Resolved: ...\" }`,\n\n DISCOVERY: `Required context (one of):\n- DISCOVERY_CONTEXT: INITIAL with domainName, optional backgroundContext\n- DISCOVERY_CONTEXT: REFINE with domainName, existingOverviewPath, refinementFocus`,\n\n WORKFLOW: `Required context (one of):\n- WORKFLOW_CONTEXT: NEW with workflowName, domainOverviewPath, triggerDescription\n- WORKFLOW_CONTEXT: REFINE with workflowName, existingWorkflowPath, refinementFocus\n- WORKFLOW_CONTEXT: ADD_SLICE with workflowName, existingWorkflowPath, sliceDescription`,\n\n GWT: `Required context (one of):\n- GWT_CONTEXT: FROM_SLICE with workflowName, workflowPath, sliceName\n- GWT_CONTEXT: FROM_COMMAND with workflowName, workflowPath, commandName\n- GWT_CONTEXT: FROM_AUTOMATION with workflowName, workflowPath, triggerEvent`,\n\n MODEL_VALIDATOR: `Required context (one of):\n- MODEL_VALIDATOR_CONTEXT: FULL with eventModelPath\n- MODEL_VALIDATOR_CONTEXT: WORKFLOW with workflowPath\n- MODEL_VALIDATOR_CONTEXT: SCENARIOS with workflowPath, scenariosPath`,\n };\n\n return `INVOCATION GATE FAILED\n\n${validation.error}\n\n${contextExamples[agentType]}\n\nMissing: ${validation.missingFields?.join(\", \") || \"unknown\"}\n\nI cannot proceed without explicit confirmation of the workflow state.\nPlease re-invoke with the required context.`;\n}\n","/**\n * Prompt Loader for TDD Agent Prompts\n *\n * Loads agent prompts from project-specific files or falls back to built-in prompts.\n * Supports variable interpolation for context-specific instructions.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { createPluginLogger } from \"./plugin-logger.js\";\n\nconst log = createPluginLogger(\"prompt-loader\");\n\n/**\n * Agent types that have prompts\n */\nexport type AgentType =\n // TDD agents\n | \"red\"\n | \"green\"\n | \"domain\"\n | \"refactor\"\n // Event modeling agents\n | \"discovery\"\n | \"workflow-designer\"\n | \"gwt\"\n | \"model-checker\"\n // Architecture agents\n | \"architect\"\n | \"adr\"\n | \"design-facilitator\"\n // Other agents\n | \"story\"\n | \"file-updater\"\n | \"code-reviewer\"\n | \"ux\"\n | \"mutation\";\n\n/**\n * Built-in prompt paths (relative to package)\n */\nconst BUILTIN_PROMPTS_DIR = \"prompts/agents\";\n\n/**\n * Project-specific prompt paths\n */\nconst PROJECT_PROMPTS_DIR = \"prompts/agents\";\n\n/**\n * Prompt variables for interpolation\n */\nexport interface PromptVariables {\n [key: string]: string | string[] | undefined;\n}\n\n/**\n * Loaded prompt with metadata\n */\nexport interface LoadedPrompt {\n content: string;\n source: \"project\" | \"builtin\";\n path: string;\n}\n\n/**\n * Load an agent prompt from project or builtin location\n */\nexport async function loadAgentPrompt(\n agentType: AgentType,\n projectDir: string,\n packageDir?: string\n): Promise<LoadedPrompt> {\n const promptFileName = `${agentType}.md`;\n\n // Try project-specific prompt first\n const projectPromptPath = join(projectDir, PROJECT_PROMPTS_DIR, promptFileName);\n if (existsSync(projectPromptPath)) {\n try {\n const content = await readFile(projectPromptPath, \"utf-8\");\n log.debug(`Loaded project prompt for ${agentType}`, { path: projectPromptPath });\n return {\n content,\n source: \"project\",\n path: projectPromptPath,\n };\n } catch (error) {\n log.warn(`Failed to read project prompt for ${agentType}`, { error });\n }\n }\n\n // Fall back to built-in prompt\n const builtinPromptPath = packageDir\n ? join(packageDir, BUILTIN_PROMPTS_DIR, promptFileName)\n : join(process.cwd(), BUILTIN_PROMPTS_DIR, promptFileName);\n\n if (existsSync(builtinPromptPath)) {\n try {\n const content = await readFile(builtinPromptPath, \"utf-8\");\n log.debug(`Loaded builtin prompt for ${agentType}`, { path: builtinPromptPath });\n return {\n content,\n source: \"builtin\",\n path: builtinPromptPath,\n };\n } catch (error) {\n log.warn(`Failed to read builtin prompt for ${agentType}`, { error });\n }\n }\n\n // Return inline fallback prompt\n log.debug(`Using inline fallback prompt for ${agentType}`);\n return {\n content: getInlineFallbackPrompt(agentType),\n source: \"builtin\",\n path: \"inline\",\n };\n}\n\n/**\n * Interpolate variables into a prompt template\n *\n * Supports:\n * - {{variable}} - Simple replacement\n * - {{#variable}}...{{/variable}} - Conditional block (if variable is truthy)\n * - {{^variable}}...{{/variable}} - Inverse conditional (if variable is falsy)\n */\nexport function interpolatePrompt(template: string, variables: PromptVariables): string {\n let result = template;\n\n // Handle conditional blocks {{#var}}...{{/var}}\n result = result.replace(/\\{\\{#(\\w+)\\}\\}([\\s\\S]*?)\\{\\{\\/\\1\\}\\}/g, (_, varName, content) => {\n const value = variables[varName];\n if (value && (Array.isArray(value) ? value.length > 0 : true)) {\n return content;\n }\n return \"\";\n });\n\n // Handle inverse conditional blocks {{^var}}...{{/var}}\n result = result.replace(/\\{\\{\\^(\\w+)\\}\\}([\\s\\S]*?)\\{\\{\\/\\1\\}\\}/g, (_, varName, content) => {\n const value = variables[varName];\n if (!value || (Array.isArray(value) && value.length === 0)) {\n return content;\n }\n return \"\";\n });\n\n // Handle simple variable replacement {{var}}\n result = result.replace(/\\{\\{(\\w+)\\}\\}/g, (_, varName) => {\n const value = variables[varName];\n if (value === undefined) return \"\";\n if (Array.isArray(value)) return value.join(\"\\n\");\n return value;\n });\n\n return result;\n}\n\n/**\n * Build context section for a prompt\n */\nexport function buildContextSection(\n contextType: string,\n data: Record<string, string | string[] | undefined>\n): string {\n let section = `\\n## Context: ${contextType}\\n\\n`;\n\n for (const [key, value] of Object.entries(data)) {\n if (value === undefined) continue;\n\n const displayKey = key\n .replace(/([A-Z])/g, \" $1\")\n .replace(/^./, (s) => s.toUpperCase())\n .trim();\n\n if (Array.isArray(value)) {\n section += `**${displayKey}:**\\n`;\n for (const item of value) {\n section += `- ${item}\\n`;\n }\n } else {\n section += `**${displayKey}:** ${value}\\n`;\n }\n section += \"\\n\";\n }\n\n return section;\n}\n\n/**\n * Get inline fallback prompt for an agent type\n */\nfunction getInlineFallbackPrompt(agentType: AgentType): string {\n switch (agentType) {\n case \"red\":\n return `# RED Phase Agent\n\nYou are the RED phase agent in TDD. Write a SINGLE failing test.\n\n## Rules\n1. ONLY edit test files (*.test.ts, *.spec.ts, __tests__/**)\n2. Write ONE focused test\n3. Test MUST fail (the feature doesn't exist yet)\n4. Use clear test names that describe behavior\n\n## Output Format\nAfter writing the test, run it and provide:\n- Test file path\n- Test name (describe > it)\n- Failure message\n\nThe test failure is EXPECTED and proves the test is valid.`;\n\n case \"green\":\n return `# GREEN Phase Agent\n\nYou are the GREEN phase agent in TDD. Write the MINIMUM implementation to pass the test.\n\n## Rules\n1. ONLY edit implementation files (NOT test files)\n2. Write the SIMPLEST code that makes the test pass\n3. Use domain types from the DOMAIN phase\n4. Do NOT add features the test doesn't require\n5. Run tests to confirm they pass\n\n## Output Format\nAfter writing the implementation, run the tests and provide:\n- Implementation file(s) changed\n- Confirmation that the test passes\n- Summary of what was implemented\n\nRemember: Make it work, then make it right (refactoring comes later).`;\n\n case \"domain\":\n return `# DOMAIN Phase Agent\n\nYou are the domain modeling expert in TDD. Guard domain integrity.\n\n## Your Powers\n- Can EDIT type definition files (types.ts, *.types.ts, domain/*.ts)\n- Can VETO workflow if domain integrity is compromised\n- Can CREATE new domain types before implementation\n\n## Violations to Detect\n1. Primitive obsession (string for Email, etc.)\n2. Invalid states representable\n3. Structural vs semantic types\n4. Parse-don't-validate violations\n\n## Output Format\n\nAPPROVED:\n- List any types created\n- Note any recommendations\n\nVETOED:\n- List each violation with location\n- Explain why it's a domain violation\n- Specify required changes\n- BLOCK workflow until fixed`;\n\n case \"refactor\":\n return `# REFACTOR Phase Agent\n\nYou are the refactor agent in TDD. Improve code quality without changing behavior.\n\n## Rules\n1. All tests must continue to pass\n2. No new functionality\n3. Focus on code quality improvements\n\n## Techniques\n- Extract method/function\n- Rename for clarity\n- Remove duplication\n- Simplify conditionals\n\n## Output Format\n- List refactoring changes made\n- Confirm all tests still pass`;\n\n // Event modeling agents - prompts should be in prompts/agents/*.md\n case \"discovery\":\n case \"workflow-designer\":\n case \"gwt\":\n case \"model-checker\":\n // Architecture agents\n case \"architect\":\n case \"adr\":\n case \"design-facilitator\":\n // Other agents\n case \"story\":\n case \"file-updater\":\n case \"code-reviewer\":\n case \"ux\":\n case \"mutation\":\n return `# ${agentType} Agent\\n\\nNo inline fallback available. Prompt should be in prompts/agents/${agentType}.md`;\n }\n}\n","/**\n * Rate Limit Tracker (v1.0.0+)\n *\n * Tracks rate-limited providers and their retry times.\n * Integrates with the route resolver to skip limited providers.\n */\n\nimport { createPluginLogger } from \"./plugin-logger.js\";\n\nconst log = createPluginLogger(\"rate-limit\");\n\n/**\n * Information about a rate limit event\n */\ninterface RateLimitInfo {\n provider: string;\n modelId: string;\n retryAfterMs: number | null;\n defaultRetryMs: number;\n timestamp: number;\n cleared: boolean;\n errorCode?: string;\n errorMessage?: string;\n}\n\n/**\n * Summary of active rate limits\n */\nexport interface RateLimitSummary {\n /** Total number of active rate limits */\n count: number;\n /** Provider/model pairs that are rate limited */\n limited: Array<{\n provider: string;\n modelId: string;\n remainingMs: number;\n }>;\n}\n\n/**\n * Rate limit notification callback type\n */\nexport type RateLimitNotificationCallback = (\n provider: string,\n modelId: string,\n remainingMs: number\n) => void;\n\nclass RateLimitTracker {\n private limits: Map<string, RateLimitInfo> = new Map();\n private notificationCallback: RateLimitNotificationCallback | null = null;\n private notifiedLimits: Set<string> = new Set();\n\n /**\n * Set a callback to be notified when rate limits are hit\n */\n setNotificationCallback(callback: RateLimitNotificationCallback | null): void {\n this.notificationCallback = callback;\n }\n\n /**\n * Record a rate limit event for a provider/model\n */\n recordLimit(\n provider: string,\n modelId: string,\n retryAfterMs: number | null,\n defaultRetryMs: number,\n options: { errorCode?: string; errorMessage?: string } = {}\n ): void {\n const key = this.buildKey(provider, modelId);\n\n this.limits.set(key, {\n provider,\n modelId,\n retryAfterMs,\n defaultRetryMs,\n timestamp: Date.now(),\n cleared: false,\n errorCode: options.errorCode,\n errorMessage: options.errorMessage,\n });\n\n log.info(\"Rate limit recorded\", {\n provider,\n modelId,\n retryAfterMs,\n defaultRetryMs,\n });\n\n // Notify if callback is set and we haven't notified for this limit yet\n if (this.notificationCallback && !this.notifiedLimits.has(key)) {\n const effectiveRetryMs = retryAfterMs ?? defaultRetryMs;\n this.notificationCallback(provider, modelId, effectiveRetryMs);\n this.notifiedLimits.add(key);\n }\n }\n\n /**\n * Check if a provider/model combination is currently rate limited\n */\n isRateLimited(provider: string, modelId: string): boolean {\n const key = this.buildKey(provider, modelId);\n const limit = this.limits.get(key);\n\n if (!limit || limit.cleared) {\n // Clear the notification flag if limit is cleared\n this.notifiedLimits.delete(key);\n return false;\n }\n\n const effectiveRetryMs = limit.retryAfterMs ?? limit.defaultRetryMs;\n const elapsed = Date.now() - limit.timestamp;\n\n if (elapsed >= effectiveRetryMs) {\n // Rate limit has expired, clear it\n limit.cleared = true;\n this.notifiedLimits.delete(key);\n log.debug(\"Rate limit expired\", { provider, modelId });\n return false;\n }\n\n return true;\n }\n\n /**\n * Get time remaining until rate limit clears (in ms)\n */\n getTimeUntilClear(provider: string, modelId: string): number {\n const key = this.buildKey(provider, modelId);\n const limit = this.limits.get(key);\n\n if (!limit || limit.cleared) return 0;\n\n const effectiveRetryMs = limit.retryAfterMs ?? limit.defaultRetryMs;\n const elapsed = Date.now() - limit.timestamp;\n const remaining = effectiveRetryMs - elapsed;\n\n return Math.max(0, remaining);\n }\n\n /**\n * Manually clear a rate limit (e.g., after successful request)\n */\n clearLimit(provider: string, modelId: string): void {\n const key = this.buildKey(provider, modelId);\n const limit = this.limits.get(key);\n\n if (limit) {\n limit.cleared = true;\n this.notifiedLimits.delete(key);\n log.debug(\"Rate limit manually cleared\", { provider, modelId });\n }\n }\n\n /**\n * Get all active (non-cleared) rate limits\n */\n getActiveLimits(): RateLimitInfo[] {\n const now = Date.now();\n const active: RateLimitInfo[] = [];\n\n for (const limit of this.limits.values()) {\n if (limit.cleared) continue;\n\n const effectiveRetryMs = limit.retryAfterMs ?? limit.defaultRetryMs;\n const elapsed = now - limit.timestamp;\n\n if (elapsed < effectiveRetryMs) {\n active.push(limit);\n } else {\n // Mark as cleared\n limit.cleared = true;\n this.notifiedLimits.delete(this.buildKey(limit.provider, limit.modelId));\n }\n }\n\n return active;\n }\n\n /**\n * Get a summary of active rate limits\n */\n getSummary(): RateLimitSummary {\n const active = this.getActiveLimits();\n const now = Date.now();\n\n return {\n count: active.length,\n limited: active.map((limit) => {\n const effectiveRetryMs = limit.retryAfterMs ?? limit.defaultRetryMs;\n const elapsed = now - limit.timestamp;\n const remainingMs = Math.max(0, effectiveRetryMs - elapsed);\n\n return {\n provider: limit.provider,\n modelId: limit.modelId,\n remainingMs,\n };\n }),\n };\n }\n\n /**\n * Check if ANY provider is rate limited\n */\n hasAnyActiveLimit(): boolean {\n return this.getActiveLimits().length > 0;\n }\n\n /**\n * Get the rate limit info for a specific provider/model\n */\n getLimitInfo(provider: string, modelId: string): RateLimitInfo | null {\n const key = this.buildKey(provider, modelId);\n const limit = this.limits.get(key);\n\n if (!limit || limit.cleared) return null;\n\n const effectiveRetryMs = limit.retryAfterMs ?? limit.defaultRetryMs;\n const elapsed = Date.now() - limit.timestamp;\n\n if (elapsed >= effectiveRetryMs) {\n limit.cleared = true;\n return null;\n }\n\n return limit;\n }\n\n /**\n * Clear all rate limits (useful for testing)\n */\n clearAll(): void {\n for (const limit of this.limits.values()) {\n limit.cleared = true;\n }\n this.notifiedLimits.clear();\n log.debug(\"All rate limits cleared\");\n }\n\n /**\n * Build a cache key for a provider/model pair\n */\n private buildKey(provider: string, modelId: string): string {\n return `${provider}:${modelId}`;\n }\n}\n\n/**\n * Singleton rate limit tracker instance\n */\nexport const rateLimitTracker = new RateLimitTracker();\n\n/**\n * Default retry period in ms (5 minutes)\n */\nexport const DEFAULT_RETRY_PERIOD_MS = 5 * 60 * 1000;\n\n// ============================================================================\n// Test exports\n// ============================================================================\n\nexport const _testExports = {\n RateLimitTracker,\n};\n","/**\n * Model Route Resolver (v1.0.0+)\n *\n * Resolves model identifiers to specific provider routes based on:\n * 1. Explicit subagent model overrides\n * 2. Force-ranked model lists\n * 3. Rate limit status\n * 4. Provider availability\n * 5. Capability requirements (thinking, temperature)\n */\n\nimport type { AgentRole, LLMProvider, SdlcConfig, SubagentType } from \"../../shared/types.js\";\nimport { createPluginLogger } from \"./plugin-logger.js\";\nimport { rateLimitTracker } from \"./rate-limit-tracker.js\";\n\nconst log = createPluginLogger(\"route-resolver\");\n\ninterface ModelCapabilities {\n supportsThinking: boolean;\n supportsTemperature: boolean;\n}\n\n/**\n * Known model families and their base identifiers\n */\nconst MODEL_FAMILIES: Record<string, string> = {\n // Claude models\n \"claude-sonnet-4-5\": \"claude-sonnet-4-5\",\n \"claude-sonnet-4-5-thinking\": \"claude-sonnet-4-5\",\n \"claude-opus-4-5\": \"claude-opus-4-5\",\n \"claude-opus-4-5-thinking\": \"claude-opus-4-5\",\n \"claude-haiku\": \"claude-haiku\",\n // OpenAI models\n \"gpt-5.1\": \"gpt-5.1\",\n \"gpt-5.1-high\": \"gpt-5.1-high\",\n \"gpt-4o\": \"gpt-4o\",\n \"gpt-4o-mini\": \"gpt-4o-mini\",\n // Google models\n \"gemini-2.5-pro\": \"gemini-2.5-pro\",\n \"gemini-2.5-flash\": \"gemini-2.5-flash\",\n};\n\n/**\n * Provider capabilities for filtering\n */\nconst PROVIDER_CAPABILITIES: Record<LLMProvider, ModelCapabilities> = {\n anthropic: { supportsThinking: true, supportsTemperature: true },\n openai: { supportsThinking: true, supportsTemperature: true },\n google: { supportsThinking: true, supportsTemperature: true },\n \"github-copilot\": { supportsThinking: false, supportsTemperature: false },\n};\n\n/**\n * Natural provider for each model family\n */\nconst MODEL_FAMILY_TO_PROVIDER: Record<string, LLMProvider> = {\n \"claude-sonnet-4-5\": \"anthropic\",\n \"claude-opus-4-5\": \"anthropic\",\n \"claude-haiku\": \"anthropic\",\n \"gpt-5.1\": \"openai\",\n \"gpt-5.1-high\": \"openai\",\n \"gpt-4o\": \"openai\",\n \"gpt-4o-mini\": \"openai\",\n \"gemini-2.5-pro\": \"google\",\n \"gemini-2.5-flash\": \"google\",\n};\n\n/**\n * Model selection result with metadata\n */\nexport interface ModelSelectionResult {\n /** Full model route (provider/model) */\n route: string;\n /** Provider used */\n provider: LLMProvider;\n /** Base model ID */\n modelId: string;\n /** Why this model was selected */\n reason: string;\n /** Whether rate limiting affected selection */\n rateLimitedProviders: string[];\n}\n\n/**\n * Select the best model for a subagent\n *\n * Selection priority:\n * 1. Explicit override in config.models.subagents[type]\n * 2. Force-ranked list based on provider priority\n * 3. Fall back to marvin model if all else fails\n */\nexport function selectModelForSubagent(\n subagentType: SubagentType,\n config: SdlcConfig,\n options: { requiresThinking?: boolean } = {}\n): ModelSelectionResult {\n const rateLimitedProviders: string[] = [];\n\n // 1. Check for explicit override\n const override = config.models.subagents?.[subagentType];\n if (override && override !== \"inherit\") {\n const result = parseAndValidateModelRoute(override, config, options);\n if (result) {\n log.debug(\"Using explicit override for subagent\", {\n subagentType,\n model: result.route,\n });\n return {\n ...result,\n reason: `Explicit override: ${subagentType}=${override}`,\n rateLimitedProviders,\n };\n }\n log.warn(\"Explicit override invalid, falling back\", { subagentType, override });\n }\n\n // 2. Use marvin model (either inherited or specified)\n const marvinModel = config.models.marvin;\n const result = selectFromRankedProviders(marvinModel, config, options);\n\n if (result) {\n log.debug(\"Subagent inheriting from marvin\", {\n subagentType,\n marvinModel,\n selectedRoute: result.route,\n });\n return {\n ...result,\n reason: override === \"inherit\" ? \"Inherited from marvin\" : \"Default (inherited from marvin)\",\n rateLimitedProviders: result.rateLimitedProviders,\n };\n }\n\n // 3. Absolute fallback - return marvin model directly\n log.warn(\"Could not resolve model for subagent, using marvin directly\", {\n subagentType,\n marvinModel,\n });\n return {\n route: marvinModel,\n provider: extractProvider(marvinModel),\n modelId: extractModelId(marvinModel),\n reason: \"Fallback: using marvin model directly\",\n rateLimitedProviders,\n };\n}\n\n/**\n * Select model for a main agent role (marvin, oracle, librarian, etc.)\n */\nexport function selectModelForAgent(\n agentRole: AgentRole,\n config: SdlcConfig,\n options: { requiresThinking?: boolean } = {}\n): ModelSelectionResult {\n const modelKey = agentRole as keyof typeof config.models;\n const configuredModel = config.models[modelKey];\n\n if (!configuredModel || typeof configuredModel !== \"string\") {\n throw new Error(`No model configured for agent role: ${agentRole}`);\n }\n\n // Check agent overrides for special requirements\n const agentOverride = (\n config.routing.agentOverrides as Record<string, { requiresThinking?: boolean }>\n )[agentRole];\n\n const effectiveOptions = {\n ...options,\n requiresThinking: options.requiresThinking || agentOverride?.requiresThinking,\n };\n\n const result = selectFromRankedProviders(configuredModel, config, effectiveOptions);\n\n if (result) {\n return result;\n }\n\n // Fallback - return configured model directly\n return {\n route: configuredModel,\n provider: extractProvider(configuredModel),\n modelId: extractModelId(configuredModel),\n reason: \"Direct configuration (no provider routing)\",\n rateLimitedProviders: [],\n };\n}\n\n/**\n * Select from force-ranked provider list\n *\n * Tries providers in order:\n * 1. User's provider priority\n * 2. Model family priority\n * 3. Natural provider for model\n *\n * Skips rate-limited providers if alternatives exist.\n */\nfunction selectFromRankedProviders(\n modelIdentifier: string,\n config: SdlcConfig,\n options: { requiresThinking?: boolean } = {}\n): ModelSelectionResult | null {\n const { provider: explicitProvider, modelId } = parseModelIdentifier(modelIdentifier);\n const rateLimitedProviders: string[] = [];\n\n // If already a full route, validate and return\n if (explicitProvider) {\n const isLimited = rateLimitTracker.isRateLimited(explicitProvider, modelId);\n if (isLimited) {\n rateLimitedProviders.push(explicitProvider);\n log.info(\"Configured provider is rate-limited\", { provider: explicitProvider, modelId });\n }\n\n if (!isLimited && isProviderEnabled(explicitProvider, config)) {\n if (!options.requiresThinking || PROVIDER_CAPABILITIES[explicitProvider].supportsThinking) {\n return {\n route: modelIdentifier,\n provider: explicitProvider,\n modelId,\n reason: \"Direct route (provider specified)\",\n rateLimitedProviders,\n };\n }\n }\n }\n\n // Get model family for ranking\n const family = modelId.replace(/-thinking$/, \"\");\n const familyType = getModelFamilyType(family);\n\n // Build ranked provider list\n const rankedProviders = buildRankedProviderList(familyType, config, options);\n\n // Try each provider in order\n for (const provider of rankedProviders) {\n if (rateLimitTracker.isRateLimited(provider, family)) {\n rateLimitedProviders.push(provider);\n continue;\n }\n\n if (!isProviderEnabled(provider, config)) {\n continue;\n }\n\n if (options.requiresThinking && !PROVIDER_CAPABILITIES[provider].supportsThinking) {\n continue;\n }\n\n const route = buildRoute(family, provider);\n if (route) {\n let reason: string;\n if (rateLimitedProviders.length > 0) {\n reason = `Selected after skipping rate-limited providers: ${rateLimitedProviders.join(\", \")}`;\n } else {\n reason = \"First available provider in ranked list\";\n }\n\n log.debug(\"Selected model route\", {\n route,\n provider,\n modelId: family,\n reason,\n rateLimitedProviders,\n });\n\n return {\n route,\n provider,\n modelId: family,\n reason,\n rateLimitedProviders,\n };\n }\n }\n\n // All providers unavailable or rate-limited, return first that's enabled\n // (even if rate-limited - better to queue than fail)\n for (const provider of rankedProviders) {\n if (isProviderEnabled(provider, config)) {\n const route = buildRoute(family, provider);\n if (route) {\n log.warn(\"All providers rate-limited, using first enabled\", {\n route,\n provider,\n rateLimitedProviders,\n });\n return {\n route,\n provider,\n modelId: family,\n reason: \"All providers rate-limited, using first enabled (may queue)\",\n rateLimitedProviders,\n };\n }\n }\n }\n\n return null;\n}\n\n/**\n * Build ranked provider list for a model family type\n */\nfunction buildRankedProviderList(\n familyType: \"claude\" | \"gpt\" | \"gemini\" | \"unknown\",\n config: SdlcConfig,\n options: { requiresThinking?: boolean } = {}\n): LLMProvider[] {\n const routing = config.routing;\n const providers: LLMProvider[] = [];\n\n // 1. Model family specific priority\n if (familyType !== \"unknown\" && routing.modelFamilyPriority[familyType]) {\n providers.push(...routing.modelFamilyPriority[familyType]!);\n }\n\n // 2. Global provider priority\n for (const p of routing.providerPriority) {\n if (!providers.includes(p)) {\n providers.push(p);\n }\n }\n\n // 3. Add natural provider for completeness\n const naturalProviders: Record<string, LLMProvider> = {\n claude: \"anthropic\",\n gpt: \"openai\",\n gemini: \"google\",\n };\n const natural = naturalProviders[familyType];\n if (natural && !providers.includes(natural)) {\n providers.push(natural);\n }\n\n // Filter for thinking capability if required\n if (options.requiresThinking) {\n return providers.filter((p) => PROVIDER_CAPABILITIES[p].supportsThinking);\n }\n\n return providers;\n}\n\n/**\n * Parse a model identifier into provider and model ID\n */\nfunction parseModelIdentifier(identifier: string): {\n provider: LLMProvider | null;\n modelId: string;\n} {\n if (identifier.includes(\"/\")) {\n const [providerStr, ...modelParts] = identifier.split(\"/\");\n return {\n provider: providerStr as LLMProvider,\n modelId: modelParts.join(\"/\"),\n };\n }\n return { provider: null, modelId: identifier };\n}\n\n/**\n * Extract provider from a full route\n */\nfunction extractProvider(route: string): LLMProvider {\n const { provider } = parseModelIdentifier(route);\n return provider || \"anthropic\"; // Default fallback\n}\n\n/**\n * Extract model ID from a full route\n */\nfunction extractModelId(route: string): string {\n const { modelId } = parseModelIdentifier(route);\n return modelId;\n}\n\n/**\n * Parse and validate a model route against config\n */\nfunction parseAndValidateModelRoute(\n modelRoute: string,\n config: SdlcConfig,\n options: { requiresThinking?: boolean } = {}\n): Omit<ModelSelectionResult, \"reason\" | \"rateLimitedProviders\"> | null {\n const { provider, modelId } = parseModelIdentifier(modelRoute);\n\n if (provider) {\n if (!isProviderEnabled(provider, config)) {\n return null;\n }\n if (options.requiresThinking && !PROVIDER_CAPABILITIES[provider].supportsThinking) {\n return null;\n }\n return { route: modelRoute, provider, modelId };\n }\n\n // No provider specified, try to route\n const result = selectFromRankedProviders(modelRoute, config, options);\n if (result) {\n return { route: result.route, provider: result.provider, modelId: result.modelId };\n }\n\n return null;\n}\n\n/**\n * Build a route for a model and provider\n */\nfunction buildRoute(modelFamily: string, provider: LLMProvider): string | null {\n const baseModel = MODEL_FAMILIES[modelFamily];\n if (!baseModel) {\n // Unknown model family, assume it's a direct model ID\n return `${provider}/${modelFamily}`;\n }\n return `${provider}/${baseModel}`;\n}\n\n/**\n * Check if a provider is enabled in config\n */\nfunction isProviderEnabled(provider: LLMProvider, config: SdlcConfig): boolean {\n const subs = config.subscriptions;\n\n switch (provider) {\n case \"anthropic\":\n return subs.claude?.enabled === true;\n case \"openai\":\n return subs.openai?.enabled === true;\n case \"google\":\n return subs.google?.enabled === true;\n case \"github-copilot\":\n return subs.githubCopilot?.enabled === true;\n default:\n return false;\n }\n}\n\n/**\n * Get the family type for a model\n */\nfunction getModelFamilyType(modelFamily: string): \"claude\" | \"gpt\" | \"gemini\" | \"unknown\" {\n if (modelFamily.includes(\"claude\") || modelFamily.includes(\"haiku\")) return \"claude\";\n if (modelFamily.includes(\"gpt\")) return \"gpt\";\n if (modelFamily.includes(\"gemini\")) return \"gemini\";\n return \"unknown\";\n}\n\n/**\n * Get provider capabilities\n */\nexport function getProviderCapabilities(provider: LLMProvider): ModelCapabilities {\n return PROVIDER_CAPABILITIES[provider];\n}\n\n/**\n * Check if a provider supports thinking mode\n */\nexport function providerSupportsThinking(provider: LLMProvider): boolean {\n return PROVIDER_CAPABILITIES[provider].supportsThinking;\n}\n\n// ============================================================================\n// Legacy API (for backward compatibility)\n// ============================================================================\n\n/**\n * @deprecated Use selectModelForAgent or selectModelForSubagent instead\n *\n * Resolves a model family to a provider route.\n * This is the original API that takes a model family name and routes it\n * based on provider priority.\n */\nexport function resolveModelRoute(\n modelFamily: string,\n agentRole: AgentRole,\n config: SdlcConfig\n): string {\n const routing = config.routing;\n const agentOverride = (\n routing.agentOverrides as Record<\n string,\n { requiresThinking?: boolean; preferProvider?: LLMProvider }\n >\n )[agentRole];\n\n // Check for agent preferProvider override first\n if (agentOverride?.preferProvider) {\n const route = buildRoute(modelFamily, agentOverride.preferProvider);\n if (route && isProviderEnabled(agentOverride.preferProvider, config)) {\n return route;\n }\n }\n\n // Check for requiresThinking and filter providers\n if (agentOverride?.requiresThinking) {\n const family = modelFamily.replace(/-thinking$/, \"\");\n const familyType = getModelFamilyType(family);\n let familyPriority: LLMProvider[] = routing.providerPriority;\n\n if (familyType !== \"unknown\" && routing.modelFamilyPriority[familyType]) {\n familyPriority = routing.modelFamilyPriority[familyType]!;\n }\n\n // First try to find a thinking-capable provider\n for (const provider of familyPriority) {\n if (!isProviderEnabled(provider, config)) continue;\n if (!PROVIDER_CAPABILITIES[provider].supportsThinking) continue;\n\n const route = buildRoute(family, provider);\n if (route) return route;\n }\n\n // No thinking-capable providers found, fall back to any available provider\n for (const provider of familyPriority) {\n if (!isProviderEnabled(provider, config)) continue;\n\n const route = buildRoute(family, provider);\n if (route) return route;\n }\n }\n\n // Use the standard ranked selection (without requiresThinking filter to allow fallback)\n const result = selectFromRankedProviders(modelFamily, config, {});\n\n if (result) {\n return result.route;\n }\n\n throw new Error(`No available route for model family: ${modelFamily}`);\n}\n\n/**\n * @deprecated Use selectModelForAgent with requiresThinking option instead\n */\nexport function maybeSelectThinkingVariant(\n modelFamily: string,\n agentRole: AgentRole,\n config: SdlcConfig\n): string {\n const agentOverride = (\n config.routing.agentOverrides as Record<string, { requiresThinking?: boolean }>\n )[agentRole];\n\n if (agentOverride?.requiresThinking && supportsThinkingVariant(modelFamily)) {\n return `${modelFamily}-thinking`;\n }\n\n return modelFamily;\n}\n\nfunction supportsThinkingVariant(modelFamily: string): boolean {\n return modelFamily.includes(\"claude-sonnet\") || modelFamily.includes(\"claude-opus\");\n}\n\n// ============================================================================\n// Test exports\n// ============================================================================\n\nexport const _testExports = {\n parseModelIdentifier,\n buildRankedProviderList,\n isProviderEnabled,\n getModelFamilyType,\n MODEL_FAMILIES,\n PROVIDER_CAPABILITIES,\n};\n","/**\n * Subagent Session Management\n *\n * Manages the lifecycle of TDD subagent sessions including:\n * - Session creation with proper titles\n * - File ownership registration\n * - Model selection via route resolver\n * - Message sending and response retrieval\n * - JSON schema validation with retry\n * - Cleanup on completion\n */\n\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { ZodIssue, ZodType } from \"zod\";\nimport type { SdlcConfig, SubagentType } from \"../../shared/types.js\";\nimport { registerSubagentSession, unregisterSubagentSession } from \"../hooks/orchestrator-guard.js\";\nimport type { AgentType as FileAgentType } from \"./expanded-file-ownership.js\";\nimport { createPluginLogger } from \"./plugin-logger.js\";\nimport { selectModelForSubagent } from \"./route-resolver.js\";\n\nconst log = createPluginLogger(\"subagent-session\");\n\n/**\n * Model configuration for session prompt\n */\ninterface ModelConfig {\n providerID: string;\n modelID: string;\n}\n\n/**\n * Session creation options\n */\nexport interface SessionOptions {\n /** Title for the session */\n title: string;\n /** Subagent type for file ownership and model selection */\n subagentType: SubagentType;\n /** Custom model override (optional, uses route resolver if not specified) */\n model?: string;\n}\n\n/**\n * Session prompt options\n */\nexport interface PromptOptions {\n /** The prompt text to send */\n prompt: string;\n /** Optional system prompt */\n systemPrompt?: string;\n}\n\n/**\n * Session result\n */\nexport interface SessionResult {\n success: boolean;\n sessionId?: string;\n response?: string;\n error?: string;\n}\n\n/**\n * Active session for cleanup tracking\n */\ninterface ActiveSession {\n sessionId: string;\n subagentType: SubagentType;\n}\n\n/**\n * Parse model string into provider/model parts\n */\nexport function parseModelConfig(modelString: string): ModelConfig {\n const [providerID, modelID] = modelString.split(\"/\");\n return {\n providerID: providerID || \"anthropic\",\n modelID: modelID || modelString,\n };\n}\n\n/**\n * Subagent session manager\n */\nexport class SubagentSessionManager {\n private ctx: PluginInput;\n private config: SdlcConfig;\n private activeSessions: Map<string, ActiveSession> = new Map();\n\n constructor(ctx: PluginInput, config: SdlcConfig) {\n this.ctx = ctx;\n this.config = config;\n }\n\n /**\n * Create and run a subagent session\n */\n async runSession(options: SessionOptions, promptOptions: PromptOptions): Promise<SessionResult> {\n const { title, subagentType, model } = options;\n const { prompt } = promptOptions;\n\n // Resolve model\n const modelToUse = model || this.resolveModel(subagentType);\n const modelConfig = parseModelConfig(modelToUse);\n\n log.debug(\"Creating subagent session\", {\n title,\n subagentType,\n model: modelToUse,\n });\n\n try {\n // Create session\n const createResult = await this.ctx.client.session.create({\n body: { title },\n });\n\n if (!createResult.data?.id) {\n return {\n success: false,\n error: `Failed to create ${subagentType} session`,\n };\n }\n\n const sessionId = createResult.data.id;\n\n // Register for file ownership\n // Cast to FileAgentType - the orchestrator guard handles unknown types gracefully\n registerSubagentSession(sessionId, subagentType as FileAgentType);\n this.activeSessions.set(sessionId, { sessionId, subagentType });\n\n log.debug(\"Session created\", { sessionId, subagentType });\n\n try {\n // Send prompt\n const promptResult = await this.ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: modelConfig,\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n if (!promptResult.data) {\n return {\n success: false,\n sessionId,\n error: `No response from ${subagentType} agent`,\n };\n }\n\n // Get response\n const messagesResult = await this.ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n return {\n success: false,\n sessionId,\n error: `No messages in ${subagentType} session`,\n };\n }\n\n // Extract text content\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const response = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n log.debug(\"Session completed\", { sessionId, responseLength: response.length });\n\n return {\n success: true,\n sessionId,\n response,\n };\n } finally {\n // Always unregister session\n this.cleanupSession(sessionId);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n log.error(`${subagentType} session failed`, { error: message });\n return {\n success: false,\n error: `${subagentType} agent spawn failed: ${message}`,\n };\n }\n }\n\n /**\n * Clean up a specific session\n */\n private cleanupSession(sessionId: string): void {\n const session = this.activeSessions.get(sessionId);\n if (session) {\n unregisterSubagentSession(sessionId);\n this.activeSessions.delete(sessionId);\n log.debug(\"Session cleaned up\", { sessionId });\n }\n }\n\n /**\n * Clean up all active sessions (for error recovery)\n */\n cleanupAllSessions(): void {\n for (const [sessionId] of this.activeSessions) {\n this.cleanupSession(sessionId);\n }\n }\n\n /**\n * Resolve model for subagent type using route resolver\n */\n private resolveModel(subagentType: SubagentType): string {\n const result = selectModelForSubagent(subagentType, this.config);\n return result.route;\n }\n}\n\n/**\n * Create a simple one-shot subagent session\n *\n * Convenience function for tools that just need to spawn a subagent\n * and get a response.\n */\nexport async function runSubagent(\n ctx: PluginInput,\n config: SdlcConfig,\n options: SessionOptions,\n prompt: string\n): Promise<SessionResult> {\n const manager = new SubagentSessionManager(ctx, config);\n return manager.runSession(options, { prompt });\n}\n\n// ============================================================================\n// Validated Subagent Runner\n// ============================================================================\n\n/**\n * Result from validated subagent run\n */\nexport type ValidatedResult<T> =\n | { success: true; data: T; rawResponse: string }\n | { success: false; error: string; rawResponse?: string; validationErrors?: string[] };\n\n/**\n * Options for validated subagent runner\n */\nexport interface ValidatedSessionOptions extends SessionOptions {\n /** Maximum retry attempts for invalid responses (default: 2) */\n maxRetries?: number;\n}\n\n/**\n * Extract JSON from agent response\n *\n * Handles responses that might have the JSON wrapped in markdown code blocks\n * or have extra whitespace.\n */\nexport function extractJson(response: string): string {\n // Trim whitespace\n let cleaned = response.trim();\n\n // Try to extract from markdown code block\n const jsonBlockMatch = cleaned.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n if (jsonBlockMatch) {\n cleaned = jsonBlockMatch[1].trim();\n }\n\n // If response starts with { or [, assume it's JSON\n if (cleaned.startsWith(\"{\") || cleaned.startsWith(\"[\")) {\n return cleaned;\n }\n\n // Try to find JSON object in the response\n const jsonMatch = cleaned.match(/(\\{[\\s\\S]*\\})/);\n if (jsonMatch) {\n return jsonMatch[1];\n }\n\n // Return as-is, let JSON.parse fail with meaningful error\n return cleaned;\n}\n\n/**\n * Build retry prompt when JSON parsing fails\n */\nfunction buildJsonRetryPrompt(originalPrompt: string, response: string, error: string): string {\n return `Your previous response was not valid JSON.\n\n**Error:** ${error}\n\n**Your response was:**\n\\`\\`\\`\n${response.slice(0, 500)}${response.length > 500 ? \"...\" : \"\"}\n\\`\\`\\`\n\nPlease respond with ONLY a valid JSON object. No markdown, no explanation outside the JSON.\n\n---\n\n${originalPrompt}`;\n}\n\n/**\n * Build retry prompt when schema validation fails\n */\nfunction buildSchemaRetryPrompt(\n originalPrompt: string,\n response: string,\n errors: ZodIssue[]\n): string {\n const errorList = errors\n .map((e) => `- ${e.path.length > 0 ? `${e.path.join(\".\")}: ` : \"\"}${e.message}`)\n .join(\"\\n\");\n\n return `Your JSON response did not match the required schema.\n\n**Validation errors:**\n${errorList}\n\n**Your response was:**\n\\`\\`\\`json\n${response.slice(0, 500)}${response.length > 500 ? \"...\" : \"\"}\n\\`\\`\\`\n\nPlease fix these issues and respond with ONLY a valid JSON object matching the schema.\n\n---\n\n${originalPrompt}`;\n}\n\n/**\n * Run a subagent with JSON schema validation and retry logic\n *\n * This function:\n * 1. Sends the prompt to the subagent\n * 2. Attempts to parse the response as JSON\n * 3. Validates the JSON against the provided Zod schema\n * 4. If invalid, retries with feedback about what was wrong\n * 5. Returns typed, validated data or an error\n *\n * @param ctx - Plugin context\n * @param config - SDLC configuration\n * @param options - Session options including retry count\n * @param prompt - The prompt to send (should instruct agent to respond with JSON)\n * @param schema - Zod schema to validate the response against\n * @returns Validated data or error information\n */\nexport async function runSubagentWithValidation<T>(\n ctx: PluginInput,\n config: SdlcConfig,\n options: ValidatedSessionOptions,\n prompt: string,\n schema: ZodType<T>\n): Promise<ValidatedResult<T>> {\n const maxRetries = options.maxRetries ?? 2;\n const manager = new SubagentSessionManager(ctx, config);\n\n let currentPrompt = prompt;\n let lastResponse: string | undefined;\n let lastValidationErrors: string[] | undefined;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const isRetry = attempt > 0;\n\n if (isRetry) {\n log.debug(\"Retrying subagent with validation feedback\", {\n attempt,\n maxRetries,\n subagentType: options.subagentType,\n });\n }\n\n // Run the subagent\n const result = await manager.runSession(options, { prompt: currentPrompt });\n\n if (!result.success) {\n return {\n success: false,\n error: result.error || \"Subagent session failed\",\n rawResponse: lastResponse,\n };\n }\n\n lastResponse = result.response || \"\";\n\n // Try to extract and parse JSON\n const jsonString = extractJson(lastResponse);\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(jsonString);\n } catch (parseError) {\n const errorMessage = parseError instanceof Error ? parseError.message : \"Invalid JSON\";\n\n log.warn(\"JSON parse failed\", {\n attempt,\n error: errorMessage,\n responsePreview: lastResponse.slice(0, 200),\n });\n\n if (attempt < maxRetries) {\n currentPrompt = buildJsonRetryPrompt(prompt, lastResponse, errorMessage);\n lastValidationErrors = [`JSON parse error: ${errorMessage}`];\n continue;\n }\n\n return {\n success: false,\n error: `Agent did not return valid JSON after ${maxRetries + 1} attempts: ${errorMessage}`,\n rawResponse: lastResponse,\n validationErrors: [`JSON parse error: ${errorMessage}`],\n };\n }\n\n // Validate against schema\n const validated = schema.safeParse(parsed);\n\n if (!validated.success) {\n const errors = validated.error.issues;\n lastValidationErrors = errors.map(\n (e: ZodIssue) => `${e.path.length > 0 ? `${e.path.join(\".\")}: ` : \"\"}${e.message}`\n );\n\n log.warn(\"Schema validation failed\", {\n attempt,\n errors: lastValidationErrors,\n });\n\n if (attempt < maxRetries) {\n currentPrompt = buildSchemaRetryPrompt(prompt, jsonString, errors);\n continue;\n }\n\n return {\n success: false,\n error: `Agent response did not match schema after ${maxRetries + 1} attempts`,\n rawResponse: lastResponse,\n validationErrors: lastValidationErrors,\n };\n }\n\n // Success!\n log.debug(\"Subagent validation succeeded\", {\n attempt,\n subagentType: options.subagentType,\n });\n\n return {\n success: true,\n data: validated.data,\n rawResponse: lastResponse,\n };\n }\n\n // Should not reach here, but TypeScript needs this\n return {\n success: false,\n error: \"Unexpected validation loop exit\",\n rawResponse: lastResponse,\n validationErrors: lastValidationErrors,\n };\n}\n","/**\n * sdlc_design_workflow Tool\n *\n * Workflow design for Event Modeling using the 9-step methodology\n *\n * Guides the design of event-sourced workflows, creating commands,\n * events, read models, and vertical slices.\n *\n * Key features:\n * - Structured workflowContext with invocation gate validation\n * - Uses JSON schema validation for agent responses\n * - Integrates with file ownership system\n */\n\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport { WorkflowAgentOutputSchema } from \"../../shared/schemas/index.js\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport {\n type GateValidationResult,\n type WorkflowContext as GateWorkflowContext,\n formatGateFailure,\n validateWorkflowContext,\n} from \"../utils/invocation-gate.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\nimport { buildContextSection, loadAgentPrompt } from \"../utils/prompt-loader.js\";\nimport { runSubagentWithValidation } from \"../utils/subagent-session.js\";\n\nconst log = createPluginLogger(\"sdlc_design_workflow\");\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Structured context for NEW workflow\n */\nexport interface WorkflowContextNew {\n type: \"NEW\";\n workflowName: string;\n domainOverviewPath: string;\n triggerDescription: string;\n}\n\n/**\n * Structured context for REFINE workflow\n */\nexport interface WorkflowContextRefine {\n type: \"REFINE\";\n workflowName: string;\n existingWorkflowPath: string;\n refinementFocus: string;\n}\n\n/**\n * Structured context for ADD_SLICE\n */\nexport interface WorkflowContextAddSlice {\n type: \"ADD_SLICE\";\n workflowName: string;\n existingWorkflowPath: string;\n sliceDescription: string;\n}\n\n/**\n * Union of all structured workflow contexts\n */\nexport type StructuredWorkflowContext =\n | WorkflowContextNew\n | WorkflowContextRefine\n | WorkflowContextAddSlice;\n\n/**\n * Arguments for sdlc_design_workflow tool\n */\nexport interface DesignWorkflowArgs {\n /** Legacy: workflow name (for backwards compatibility) */\n workflowName?: string;\n /** Legacy: domain overview path (for backwards compatibility) */\n domainOverviewPath?: string;\n /** Legacy: additional context (for backwards compatibility) */\n context?: string;\n /** Legacy: step number (for backwards compatibility) */\n step?: number;\n /** Structured context (preferred) */\n workflowContext?: StructuredWorkflowContext;\n}\n\n/**\n * Event defined in the workflow\n */\nexport interface WorkflowEvent {\n name: string;\n description?: string;\n aggregateId?: string;\n payload?: Record<string, string>;\n}\n\n/**\n * Command defined in the workflow\n */\nexport interface WorkflowCommand {\n name: string;\n triggeredBy?: string;\n successEvents?: string[];\n failureEvents?: string[];\n}\n\n/**\n * Read model defined in the workflow\n */\nexport interface WorkflowReadModel {\n name: string;\n purpose?: string;\n eventsConsumed?: string[];\n}\n\n/**\n * Vertical slice for implementation\n */\nexport interface VerticalSlice {\n name: string;\n commands?: string[];\n events?: string[];\n readModels?: string[];\n userStory?: string;\n}\n\n/**\n * Result from sdlc_design_workflow tool\n */\nexport interface DesignWorkflowResult {\n success: boolean;\n outputPath?: string;\n events?: WorkflowEvent[];\n commands?: WorkflowCommand[];\n readModels?: WorkflowReadModel[];\n slices?: VerticalSlice[];\n currentStep?: number;\n error?: string;\n suggestion?: string;\n /** Gate failure message if invocation gate failed */\n gateFailure?: string;\n /** Validation errors if agent response was invalid */\n validationErrors?: string[];\n}\n\n// ============================================================================\n// Tool Definition\n// ============================================================================\n\n/**\n * Create the sdlc_design_workflow tool\n */\nexport function createDesignWorkflowTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Workflow design for Event Modeling using the 9-step methodology.\n\nThis tool spawns an agent that guides workflow design through:\n1. Brain Storming - List all events (orange)\n2. The Plot - Arrange events on timeline\n3. The Story - Identify UIs and views (white)\n4. Blueprint - Identify commands (blue)\n5. Specification - Document business rules\n6. Elaboration - Flesh out event details\n7. Read Models - Design projections (green)\n8. Automation - Design policies (lilac)\n9. Vertical Slices - Break into implementable pieces\n\nCreates: docs/event_model/workflows/{name}/overview.md\n\nINVOCATION GATE: Requires workflowContext with proper workflow state:\n- NEW: Creating new workflow (requires domainOverviewPath, triggerDescription)\n- REFINE: Refining existing workflow (requires existingWorkflowPath, refinementFocus)\n- ADD_SLICE: Adding a slice to workflow (requires existingWorkflowPath, sliceDescription)\n\nUse AFTER domain discovery. Workflows become GitHub epics, slices become issues.\n\nReturns:\n- outputPath: Path to the generated workflow document\n- events: List of identified events\n- commands: List of commands\n- readModels: List of read models\n- slices: Vertical slices for implementation`,\n\n args: {\n workflowName: tool.schema\n .string()\n .optional()\n .describe(\"[LEGACY] Name of the workflow. Prefer using workflowContext instead.\"),\n domainOverviewPath: tool.schema\n .string()\n .optional()\n .describe(\"[LEGACY] Path to domain overview. Prefer using workflowContext instead.\"),\n context: tool.schema\n .string()\n .optional()\n .describe(\"[LEGACY] Additional context. Prefer using workflowContext instead.\"),\n step: tool.schema\n .number()\n .optional()\n .describe(\"[LEGACY] Start from step. Prefer using workflowContext instead.\"),\n workflowContext: tool.schema\n .object({\n type: tool.schema.enum([\"NEW\", \"REFINE\", \"ADD_SLICE\"]),\n workflowName: tool.schema.string(),\n domainOverviewPath: tool.schema.string().optional(),\n triggerDescription: tool.schema.string().optional(),\n existingWorkflowPath: tool.schema.string().optional(),\n refinementFocus: tool.schema.string().optional(),\n sliceDescription: tool.schema.string().optional(),\n })\n .optional()\n .describe(\n \"Structured context for workflow design. NEW for new workflows, REFINE for updates, ADD_SLICE for adding slices.\"\n ),\n },\n\n async execute(args): Promise<string> {\n const result = await executeWorkflowDesign(ctx, config, args as DesignWorkflowArgs);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\n// ============================================================================\n// Execution\n// ============================================================================\n\n/**\n * Build or convert to structured context\n */\nfunction resolveWorkflowContext(\n args: DesignWorkflowArgs,\n projectDir: string\n): GateWorkflowContext | null {\n // Prefer structured context if provided\n if (args.workflowContext) {\n return args.workflowContext as GateWorkflowContext;\n }\n\n // Fall back to legacy arguments\n if (args.workflowName) {\n const domainOverviewPath =\n args.domainOverviewPath || join(projectDir, \"docs\", \"event_model\", \"domain\", \"overview.md\");\n return {\n type: \"NEW\",\n workflowName: args.workflowName,\n domainOverviewPath,\n triggerDescription: args.context || \"Design a new workflow\",\n };\n }\n\n return null;\n}\n\nasync function executeWorkflowDesign(\n ctx: PluginInput,\n config: SdlcConfig,\n args: DesignWorkflowArgs\n): Promise<DesignWorkflowResult> {\n // Resolve context (structured or legacy)\n const workflowContext = resolveWorkflowContext(args, ctx.directory);\n\n // Validate invocation gate\n const gateValidation: GateValidationResult = validateWorkflowContext(workflowContext);\n if (!gateValidation.valid) {\n const gateFailure = formatGateFailure(\"WORKFLOW\", gateValidation);\n log.warn(\"Workflow invocation gate failed\", {\n error: gateValidation.error,\n missingFields: gateValidation.missingFields,\n });\n return {\n success: false,\n error: gateValidation.error || \"Invocation gate failed\",\n suggestion: \"Provide proper workflowContext with required fields\",\n gateFailure,\n };\n }\n\n // Context is now validated\n const validContext = workflowContext as GateWorkflowContext;\n const workflowName = validContext.workflowName;\n\n log.debug(\"Workflow invocation gate passed\", { type: validContext.type, workflowName });\n\n // Normalize workflow name for file paths\n const normalizedName = workflowName\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n\n // Load domain context if available\n let domainContext = \"\";\n const domainPath =\n validContext.type === \"NEW\"\n ? validContext.domainOverviewPath\n : join(ctx.directory, \"docs\", \"event_model\", \"domain\", \"overview.md\");\n\n try {\n domainContext = await readFile(domainPath, \"utf-8\");\n } catch {\n // Domain overview not found - continue without it\n }\n\n // Build prompt with validated context\n const prompt = await buildWorkflowPrompt(ctx.directory, validContext, domainContext, args.step);\n\n // Run agent with JSON validation\n const result = await runSubagentWithValidation(\n ctx,\n config,\n {\n title: `Event Modeling - Workflow Design: ${workflowName}`,\n subagentType: \"workflow\",\n maxRetries: 2,\n },\n prompt,\n WorkflowAgentOutputSchema\n );\n\n // Handle validation failure\n if (!result.success) {\n log.warn(\"Workflow design agent validation failed\", {\n error: result.error,\n validationErrors: result.validationErrors,\n });\n return {\n success: false,\n error: result.error,\n suggestion: \"Agent response did not match expected JSON schema\",\n validationErrors: result.validationErrors,\n };\n }\n\n const data = result.data;\n\n // Handle user input request\n if (data.awaitingUserInput) {\n return {\n success: false,\n error: \"Agent awaiting user input\",\n suggestion: data.awaitingUserInput.question,\n };\n }\n\n // Write the workflow document if provided\n const outputPath = join(\n ctx.directory,\n \"docs\",\n \"event_model\",\n \"workflows\",\n normalizedName,\n \"overview.md\"\n );\n\n if (data.document) {\n try {\n await mkdir(dirname(outputPath), { recursive: true });\n await writeFile(outputPath, data.document, \"utf-8\");\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n success: false,\n error: `Failed to write workflow document: ${message}`,\n suggestion: \"Check file permissions and try again\",\n };\n }\n }\n\n // Convert schema types to tool result types\n const events: WorkflowEvent[] =\n data.events?.map((e) => ({\n name: e.name,\n description: e.description,\n })) || [];\n\n const commands: WorkflowCommand[] =\n data.commands?.map((c) => ({\n name: c.name,\n triggeredBy: c.actor,\n })) || [];\n\n const readModels: WorkflowReadModel[] =\n data.views?.map((v) => ({\n name: v.name,\n purpose: v.purpose,\n })) || [];\n\n const slices: VerticalSlice[] =\n data.slices?.map((s) => ({\n name: s.name,\n commands: s.command ? [s.command] : undefined,\n events: s.events,\n readModels: s.view ? [s.view] : undefined,\n })) || [];\n\n return {\n success: true,\n outputPath: data.document ? outputPath : undefined,\n events: events.length > 0 ? events : undefined,\n commands: commands.length > 0 ? commands : undefined,\n readModels: readModels.length > 0 ? readModels : undefined,\n slices: slices.length > 0 ? slices : undefined,\n currentStep: args.step || 9,\n };\n}\n\n// ============================================================================\n// Prompt Building\n// ============================================================================\n\n/**\n * Build the complete prompt for the workflow design agent\n */\nasync function buildWorkflowPrompt(\n projectDir: string,\n context: GateWorkflowContext,\n domainContext: string,\n step?: number\n): Promise<string> {\n // Load base prompt from prompts/agents/workflow-designer.md\n const loaded = await loadAgentPrompt(\"workflow-designer\", projectDir);\n let prompt = loaded.content;\n\n const workflowName = context.workflowName;\n const normalizedName = workflowName\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n\n // Build instructions based on context type\n const instructions: string[] = [\n `Design the \"${workflowName}\" workflow using the 9-step methodology`,\n \"Identify all events, commands, read models, and automations\",\n \"Break down into vertical slices for implementation\",\n \"Include the complete markdown document in the 'document' field\",\n ];\n\n // Add step-specific instructions if starting from a specific step\n const stepInstructions = step\n ? `\\n**Start from Step ${step}** - Previous steps are complete.\\n`\n : \"\\n**Complete all 9 steps** in sequence.\\n\";\n\n // Add type-specific instructions\n let additionalContext: string | undefined;\n if (context.type === \"NEW\") {\n instructions.unshift(`Creating NEW workflow: ${context.triggerDescription}`);\n additionalContext = context.triggerDescription;\n } else if (context.type === \"REFINE\") {\n instructions.unshift(`REFINING existing workflow at: ${context.existingWorkflowPath}`);\n instructions.push(`Focus refinement on: ${context.refinementFocus}`);\n additionalContext = context.refinementFocus;\n } else if (context.type === \"ADD_SLICE\") {\n instructions.unshift(`Adding slice to workflow at: ${context.existingWorkflowPath}`);\n instructions.push(`New slice: ${context.sliceDescription}`);\n additionalContext = context.sliceDescription;\n }\n\n // Add task-specific context\n prompt += buildContextSection(\"WORKFLOW_DESIGN_TASK\", {\n contextType: context.type,\n workflowName,\n domainContext: domainContext || \"No domain overview found. Proceed with discovery embedded.\",\n additionalContext,\n existingWorkflowPath:\n context.type === \"REFINE\" || context.type === \"ADD_SLICE\"\n ? context.existingWorkflowPath\n : undefined,\n stepInstructions,\n outputPath: `docs/event_model/workflows/${normalizedName}/overview.md`,\n instructions,\n });\n\n return prompt;\n}\n\n// Export for testing\nexport const _testExports = {\n executeWorkflowDesign,\n buildWorkflowPrompt,\n};\n","/**\n * sdlc_discover_domain Tool\n *\n * Domain discovery for Event Modeling\n *\n * Identifies actors, goals, major processes and creates\n * the domain overview document.\n *\n * Key features:\n * - Structured discoveryContext with invocation gate validation\n * - Uses JSON schema validation for agent responses\n * - Integrates with file ownership system\n */\n\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport { DiscoveryAgentOutputSchema } from \"../../shared/schemas/index.js\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport {\n type DiscoveryContext as GateDiscoveryContext,\n type GateValidationResult,\n formatGateFailure,\n validateDiscoveryContext,\n} from \"../utils/invocation-gate.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\nimport { buildContextSection, loadAgentPrompt } from \"../utils/prompt-loader.js\";\nimport { runSubagentWithValidation } from \"../utils/subagent-session.js\";\n\nconst log = createPluginLogger(\"sdlc_discover_domain\");\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Structured context for INITIAL discovery\n */\nexport interface DiscoveryContextInitial {\n type: \"INITIAL\";\n domainName: string;\n backgroundContext?: string;\n}\n\n/**\n * Structured context for REFINE discovery\n */\nexport interface DiscoveryContextRefine {\n type: \"REFINE\";\n domainName: string;\n existingOverviewPath: string;\n refinementFocus: string;\n}\n\n/**\n * Union of all structured discovery contexts\n */\nexport type StructuredDiscoveryContext = DiscoveryContextInitial | DiscoveryContextRefine;\n\n/**\n * Arguments for sdlc_discover_domain tool\n */\nexport interface DiscoverDomainArgs {\n /** Legacy: domain name (for backwards compatibility) */\n domainName?: string;\n /** Legacy: additional context (for backwards compatibility) */\n context?: string;\n /** Structured context (preferred) */\n discoveryContext?: StructuredDiscoveryContext;\n}\n\n/**\n * Result from sdlc_discover_domain tool\n */\nexport interface DiscoverDomainResult {\n success: boolean;\n outputPath?: string;\n actors?: string[];\n processes?: string[];\n boundaries?: {\n core: string[];\n supporting: string[];\n external: string[];\n };\n error?: string;\n suggestion?: string;\n /** Gate failure message if invocation gate failed */\n gateFailure?: string;\n /** Validation errors if agent response was invalid */\n validationErrors?: string[];\n}\n\n// ============================================================================\n// Tool Definition\n// ============================================================================\n\n/**\n * Create the sdlc_discover_domain tool\n */\nexport function createDiscoverDomainTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Domain discovery for Event Modeling.\n\nThis tool spawns an agent that guides domain discovery by:\n- Identifying actors (human, system, time-based)\n- Understanding goals for each actor\n- Mapping major business processes\n- Finding domain boundaries (core, supporting, external)\n\nCreates: docs/event_model/domain/overview.md\n\nINVOCATION GATE: Requires discoveryContext with proper workflow state:\n- INITIAL: First-time discovery for a domain (requires domainName)\n- REFINE: Refining existing overview (requires existingOverviewPath, refinementFocus)\n\nUse this BEFORE designing workflows. Discovery captures the \"what\" and \"who\"\nwithout implementation details.\n\nReturns:\n- outputPath: Path to the generated overview document\n- actors: List of identified actors\n- processes: List of major processes\n- boundaries: Core, supporting, and external domain boundaries`,\n\n args: {\n domainName: tool.schema\n .string()\n .optional()\n .describe(\n \"[LEGACY] Name of the domain being modeled. Prefer using discoveryContext instead.\"\n ),\n context: tool.schema\n .string()\n .optional()\n .describe(\"[LEGACY] Additional context. Prefer using discoveryContext instead.\"),\n discoveryContext: tool.schema\n .object({\n type: tool.schema.enum([\"INITIAL\", \"REFINE\"]),\n domainName: tool.schema.string(),\n backgroundContext: tool.schema.string().optional(),\n existingOverviewPath: tool.schema.string().optional(),\n refinementFocus: tool.schema.string().optional(),\n })\n .optional()\n .describe(\n \"Structured context for discovery. INITIAL for new domains, REFINE for updating existing.\"\n ),\n },\n\n async execute(args): Promise<string> {\n const result = await executeDiscovery(ctx, config, args as DiscoverDomainArgs);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\n// ============================================================================\n// Execution\n// ============================================================================\n\n/**\n * Build or convert to structured context\n */\nfunction resolveDiscoveryContext(args: DiscoverDomainArgs): GateDiscoveryContext | null {\n // Prefer structured context if provided\n if (args.discoveryContext) {\n return args.discoveryContext as GateDiscoveryContext;\n }\n\n // Fall back to legacy arguments\n if (args.domainName) {\n return {\n type: \"INITIAL\",\n domainName: args.domainName,\n backgroundContext: args.context,\n };\n }\n\n return null;\n}\n\nasync function executeDiscovery(\n ctx: PluginInput,\n config: SdlcConfig,\n args: DiscoverDomainArgs\n): Promise<DiscoverDomainResult> {\n // Resolve context (structured or legacy)\n const discoveryContext = resolveDiscoveryContext(args);\n\n // Validate invocation gate\n const gateValidation: GateValidationResult = validateDiscoveryContext(discoveryContext);\n if (!gateValidation.valid) {\n const gateFailure = formatGateFailure(\"DISCOVERY\", gateValidation);\n log.warn(\"Discovery invocation gate failed\", {\n error: gateValidation.error,\n missingFields: gateValidation.missingFields,\n });\n return {\n success: false,\n error: gateValidation.error || \"Invocation gate failed\",\n suggestion: \"Provide proper discoveryContext with required fields\",\n gateFailure,\n };\n }\n\n // Context is now validated\n const validContext = discoveryContext as GateDiscoveryContext;\n const domainName = validContext.domainName;\n\n log.debug(\"Discovery invocation gate passed\", { type: validContext.type, domainName });\n\n // Build prompt with validated context\n const prompt = await buildDiscoveryPrompt(ctx.directory, validContext);\n\n // Run agent with JSON validation\n const result = await runSubagentWithValidation(\n ctx,\n config,\n {\n title: `Event Modeling - Domain Discovery: ${domainName}`,\n subagentType: \"discovery\",\n maxRetries: 2,\n },\n prompt,\n DiscoveryAgentOutputSchema\n );\n\n // Handle validation failure\n if (!result.success) {\n log.warn(\"Discovery agent validation failed\", {\n error: result.error,\n validationErrors: result.validationErrors,\n });\n return {\n success: false,\n error: result.error,\n suggestion: \"Agent response did not match expected JSON schema\",\n validationErrors: result.validationErrors,\n };\n }\n\n const data = result.data;\n\n // Handle user input request\n if (data.awaitingUserInput) {\n return {\n success: false,\n error: \"Agent awaiting user input\",\n suggestion: data.awaitingUserInput.question,\n };\n }\n\n // Write the discovery document if provided\n const outputPath = join(ctx.directory, \"docs\", \"event_model\", \"domain\", \"overview.md\");\n\n if (data.document) {\n try {\n await mkdir(dirname(outputPath), { recursive: true });\n await writeFile(outputPath, data.document, \"utf-8\");\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n success: false,\n error: `Failed to write discovery document: ${message}`,\n suggestion: \"Check file permissions and try again\",\n };\n }\n }\n\n return {\n success: true,\n outputPath: data.document ? outputPath : undefined,\n actors: data.actors?.map((a) => a.name),\n processes: data.processes?.map((p) => p.name),\n boundaries: data.boundaries,\n };\n}\n\n// ============================================================================\n// Prompt Building\n// ============================================================================\n\n/**\n * Build the complete prompt for the discovery agent\n */\nasync function buildDiscoveryPrompt(\n projectDir: string,\n context: GateDiscoveryContext\n): Promise<string> {\n // Load base prompt from prompts/agents/discovery.md\n const loaded = await loadAgentPrompt(\"discovery\", projectDir);\n let prompt = loaded.content;\n\n // Build context-specific instructions\n const instructions: string[] = [\n `Guide the discovery process for the \"${context.domainName}\" domain`,\n \"Identify all actors, their goals, and interactions\",\n \"Map out the major business processes\",\n \"Define clear domain boundaries\",\n \"Create a glossary of key terms\",\n \"Include the complete markdown document in the 'document' field\",\n ];\n\n // Add type-specific instructions\n if (context.type === \"REFINE\") {\n instructions.unshift(`REFINING existing overview at: ${context.existingOverviewPath}`);\n instructions.push(`Focus refinement on: ${context.refinementFocus}`);\n }\n\n // Add task-specific context\n prompt += buildContextSection(\"DISCOVERY_TASK\", {\n contextType: context.type,\n domainName: context.domainName,\n additionalContext: context.type === \"INITIAL\" ? context.backgroundContext : undefined,\n existingOverviewPath: context.type === \"REFINE\" ? context.existingOverviewPath : undefined,\n refinementFocus: context.type === \"REFINE\" ? context.refinementFocus : undefined,\n outputPath: \"docs/event_model/domain/overview.md\",\n instructions,\n });\n\n return prompt;\n}\n\n// Export for testing\nexport const _testExports = {\n executeDiscovery,\n buildDiscoveryPrompt,\n};\n","/**\n * sdlc_generate_gwt Tool\n *\n * Generate Given/When/Then scenarios for Event Modeling\n *\n * Creates executable specifications for commands, projections,\n * and automations based on the workflow design.\n *\n * Key features:\n * - Structured gwtContext with invocation gate validation\n * - Uses JSON schema validation for agent responses\n * - Integrates with file ownership system\n */\n\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport { GwtAgentOutputSchema } from \"../../shared/schemas/index.js\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport {\n type GwtContext as GateGwtContext,\n type GateValidationResult,\n formatGateFailure,\n validateGwtContext,\n} from \"../utils/invocation-gate.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\nimport { buildContextSection, loadAgentPrompt } from \"../utils/prompt-loader.js\";\nimport { runSubagentWithValidation } from \"../utils/subagent-session.js\";\n\nconst log = createPluginLogger(\"sdlc_generate_gwt\");\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Structured context for FROM_SLICE\n */\nexport interface GwtContextFromSlice {\n type: \"FROM_SLICE\";\n workflowName: string;\n workflowPath: string;\n sliceName: string;\n}\n\n/**\n * Structured context for FROM_COMMAND\n */\nexport interface GwtContextFromCommand {\n type: \"FROM_COMMAND\";\n workflowName: string;\n workflowPath: string;\n commandName: string;\n}\n\n/**\n * Structured context for FROM_AUTOMATION\n */\nexport interface GwtContextFromAutomation {\n type: \"FROM_AUTOMATION\";\n workflowName: string;\n workflowPath: string;\n triggerEvent: string;\n}\n\n/**\n * Union of all structured GWT contexts\n */\nexport type StructuredGwtContext =\n | GwtContextFromSlice\n | GwtContextFromCommand\n | GwtContextFromAutomation;\n\n/**\n * Arguments for sdlc_generate_gwt tool\n */\nexport interface GenerateGwtArgs {\n /** Legacy: workflow name (for backwards compatibility) */\n workflowName?: string;\n /** Legacy: slice name (for backwards compatibility) */\n sliceName?: string;\n /** Legacy: workflow path (for backwards compatibility) */\n workflowPath?: string;\n /** Legacy: scenario types (for backwards compatibility) */\n scenarioTypes?: (\"command\" | \"projection\" | \"automation\")[];\n /** Structured context (preferred) */\n gwtContext?: StructuredGwtContext;\n}\n\n/**\n * A GWT scenario\n */\nexport interface GwtScenario {\n name: string;\n type: \"command\" | \"projection\" | \"automation\";\n tags?: string[];\n given: string[];\n when: string;\n then: string[];\n}\n\n/**\n * Result from sdlc_generate_gwt tool\n */\nexport interface GenerateGwtResult {\n success: boolean;\n outputPath?: string;\n scenarios?: GwtScenario[];\n commandScenarios?: number;\n projectionScenarios?: number;\n automationScenarios?: number;\n error?: string;\n suggestion?: string;\n /** Gate failure message if invocation gate failed */\n gateFailure?: string;\n /** Validation errors if agent response was invalid */\n validationErrors?: string[];\n}\n\n// ============================================================================\n// Tool Definition\n// ============================================================================\n\n/**\n * Create the sdlc_generate_gwt tool\n */\nexport function createGenerateGwtTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Generate Given/When/Then scenarios for Event Modeling.\n\nThis tool spawns an agent that creates GWT scenarios based on:\n- **Command scenarios**: Given=prior events, When=command, Then=resulting events OR error\n- **Projection scenarios**: Given=read model state, When=event, Then=updated state\n- **Automation scenarios**: Given=policy active, When=trigger event, Then=command issued\n\nCreates: docs/event_model/workflows/{workflow}/scenarios/{slice}.feature\n\nINVOCATION GATE: Requires gwtContext with proper workflow state:\n- FROM_SLICE: Generate scenarios for a vertical slice (requires sliceName)\n- FROM_COMMAND: Generate scenarios for a specific command (requires commandName)\n- FROM_AUTOMATION: Generate scenarios for an automation (requires triggerEvent)\n\nUse AFTER workflow design. GWT scenarios become acceptance criteria for GitHub issues.\n\nReturns:\n- outputPath: Path to the generated feature file\n- scenarios: List of generated scenarios\n- commandScenarios: Count of command scenarios\n- projectionScenarios: Count of projection scenarios\n- automationScenarios: Count of automation scenarios`,\n\n args: {\n workflowName: tool.schema\n .string()\n .optional()\n .describe(\"[LEGACY] Name of the workflow. Prefer using gwtContext instead.\"),\n sliceName: tool.schema\n .string()\n .optional()\n .describe(\"[LEGACY] Specific slice. Prefer using gwtContext instead.\"),\n workflowPath: tool.schema\n .string()\n .optional()\n .describe(\"[LEGACY] Path to workflow document. Prefer using gwtContext instead.\"),\n scenarioTypes: tool.schema\n .array(tool.schema.enum([\"command\", \"projection\", \"automation\"]))\n .optional()\n .describe(\"[LEGACY] Types of scenarios. Prefer using gwtContext instead.\"),\n gwtContext: tool.schema\n .object({\n type: tool.schema.enum([\"FROM_SLICE\", \"FROM_COMMAND\", \"FROM_AUTOMATION\"]),\n workflowName: tool.schema.string(),\n workflowPath: tool.schema.string(),\n sliceName: tool.schema.string().optional(),\n commandName: tool.schema.string().optional(),\n triggerEvent: tool.schema.string().optional(),\n })\n .optional()\n .describe(\n \"Structured context for GWT generation. FROM_SLICE for slices, FROM_COMMAND for commands, FROM_AUTOMATION for automations.\"\n ),\n },\n\n async execute(args): Promise<string> {\n const result = await executeGwtGeneration(ctx, config, args as GenerateGwtArgs);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\n// ============================================================================\n// Execution\n// ============================================================================\n\n/**\n * Build or convert to structured context\n */\nfunction resolveGwtContext(args: GenerateGwtArgs, projectDir: string): GateGwtContext | null {\n // Prefer structured context if provided\n if (args.gwtContext) {\n return args.gwtContext as GateGwtContext;\n }\n\n // Fall back to legacy arguments\n if (args.workflowName) {\n const normalizedWorkflow = args.workflowName\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n\n const workflowPath =\n args.workflowPath ||\n join(projectDir, \"docs\", \"event_model\", \"workflows\", normalizedWorkflow, \"overview.md\");\n\n return {\n type: \"FROM_SLICE\",\n workflowName: args.workflowName,\n workflowPath,\n sliceName: args.sliceName || \"all-slices\",\n };\n }\n\n return null;\n}\n\nasync function executeGwtGeneration(\n ctx: PluginInput,\n config: SdlcConfig,\n args: GenerateGwtArgs\n): Promise<GenerateGwtResult> {\n // Resolve context (structured or legacy)\n const gwtContext = resolveGwtContext(args, ctx.directory);\n\n // Validate invocation gate\n const gateValidation: GateValidationResult = validateGwtContext(gwtContext);\n if (!gateValidation.valid) {\n const gateFailure = formatGateFailure(\"GWT\", gateValidation);\n log.warn(\"GWT invocation gate failed\", {\n error: gateValidation.error,\n missingFields: gateValidation.missingFields,\n });\n return {\n success: false,\n error: gateValidation.error || \"Invocation gate failed\",\n suggestion: \"Provide proper gwtContext with required fields\",\n gateFailure,\n };\n }\n\n // Context is now validated\n const validContext = gwtContext as GateGwtContext;\n const workflowName = validContext.workflowName;\n const workflowPath = validContext.workflowPath;\n\n log.debug(\"GWT invocation gate passed\", { type: validContext.type, workflowName });\n\n // Normalize names for file paths\n const normalizedWorkflow = workflowName\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n\n // Determine slice/target name for output file\n let targetName = \"all-slices\";\n if (validContext.type === \"FROM_SLICE\") {\n targetName = validContext.sliceName\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n } else if (validContext.type === \"FROM_COMMAND\") {\n targetName = validContext.commandName\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n } else if (validContext.type === \"FROM_AUTOMATION\") {\n targetName = validContext.triggerEvent\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n }\n\n // Load workflow context\n let workflowContent = \"\";\n try {\n workflowContent = await readFile(workflowPath, \"utf-8\");\n } catch {\n return {\n success: false,\n error: `Workflow document not found: ${workflowPath}`,\n suggestion: \"Run sdlc_design_workflow first to create the workflow document\",\n };\n }\n\n // Build prompt with validated context\n const prompt = await buildGwtPrompt(\n ctx.directory,\n validContext,\n workflowContent,\n args.scenarioTypes\n );\n\n // Run agent with JSON validation\n const result = await runSubagentWithValidation(\n ctx,\n config,\n {\n title: `Event Modeling - GWT Generation: ${workflowName}`,\n subagentType: \"gwt\",\n maxRetries: 2,\n },\n prompt,\n GwtAgentOutputSchema\n );\n\n // Handle validation failure\n if (!result.success) {\n log.warn(\"GWT agent validation failed\", {\n error: result.error,\n validationErrors: result.validationErrors,\n });\n return {\n success: false,\n error: result.error,\n suggestion: \"Agent response did not match expected JSON schema\",\n validationErrors: result.validationErrors,\n };\n }\n\n const data = result.data;\n\n // Handle user input request\n if (data.awaitingUserInput) {\n return {\n success: false,\n error: \"Agent awaiting user input\",\n suggestion: data.awaitingUserInput.question,\n };\n }\n\n // Write the feature file if document provided\n const outputPath = join(\n ctx.directory,\n \"docs\",\n \"event_model\",\n \"workflows\",\n normalizedWorkflow,\n \"scenarios\",\n `${targetName}.feature`\n );\n\n if (data.document) {\n try {\n await mkdir(dirname(outputPath), { recursive: true });\n await writeFile(outputPath, data.document, \"utf-8\");\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n success: false,\n error: `Failed to write feature file: ${message}`,\n suggestion: \"Check file permissions and try again\",\n };\n }\n }\n\n // Convert schema scenarios to tool result format\n // Infer type from scenario content since schema doesn't include type\n const scenarios: GwtScenario[] =\n data.scenarios?.map((s) => {\n // Infer type from name or content\n let type: \"command\" | \"projection\" | \"automation\" = \"command\";\n const nameLower = s.name.toLowerCase();\n if (\n nameLower.includes(\"projection\") ||\n nameLower.includes(\"view\") ||\n nameLower.includes(\"update\")\n ) {\n type = \"projection\";\n } else if (nameLower.includes(\"automation\") || nameLower.includes(\"trigger\")) {\n type = \"automation\";\n }\n\n const scenario: GwtScenario = {\n name: s.name,\n type,\n given: s.given,\n when: s.when,\n // biome-ignore lint/suspicious/noThenProperty: GwtScenario has legitimate 'then' field for GWT pattern\n then: s.expected,\n };\n return scenario;\n }) || [];\n\n // Count scenarios by type\n const commandScenarios = scenarios.filter((s) => s.type === \"command\").length;\n const projectionScenarios = scenarios.filter((s) => s.type === \"projection\").length;\n const automationScenarios = scenarios.filter((s) => s.type === \"automation\").length;\n\n return {\n success: true,\n outputPath: data.document ? outputPath : undefined,\n scenarios: scenarios.length > 0 ? scenarios : undefined,\n commandScenarios,\n projectionScenarios,\n automationScenarios,\n };\n}\n\n// ============================================================================\n// Prompt Building\n// ============================================================================\n\n/**\n * Build the complete prompt for the GWT generation agent\n */\nasync function buildGwtPrompt(\n projectDir: string,\n context: GateGwtContext,\n workflowContent: string,\n scenarioTypes?: (\"command\" | \"projection\" | \"automation\")[]\n): Promise<string> {\n // Load base prompt from prompts/agents/gwt.md\n const loaded = await loadAgentPrompt(\"gwt\", projectDir);\n let prompt = loaded.content;\n\n const workflowName = context.workflowName;\n const normalizedWorkflow = workflowName\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n\n // Determine which scenario types to generate\n const types = scenarioTypes || [\"command\", \"projection\", \"automation\"];\n const typeInstructions = types.map((t) => `- ${t} scenarios`).join(\"\\n\");\n\n // Build instructions based on context type\n const instructions: string[] = [\n \"Analyze the workflow document for commands, events, read models, and automations\",\n \"Generate GWT scenarios following the patterns in the prompt\",\n \"Include happy path AND validation/error scenarios for commands\",\n \"Use business language, not technical jargon\",\n \"Include concrete example values, not placeholders\",\n \"Include the complete Gherkin feature file in the 'document' field\",\n ];\n\n // Add type-specific details\n let targetDescription: string;\n if (context.type === \"FROM_SLICE\") {\n targetDescription = `Slice: ${context.sliceName}`;\n instructions.unshift(`Generating scenarios for slice: ${context.sliceName}`);\n } else if (context.type === \"FROM_COMMAND\") {\n targetDescription = `Command: ${context.commandName}`;\n instructions.unshift(`Generating scenarios for command: ${context.commandName}`);\n } else {\n targetDescription = `Automation trigger: ${context.triggerEvent}`;\n instructions.unshift(\n `Generating scenarios for automation triggered by: ${context.triggerEvent}`\n );\n }\n\n // Add task-specific context\n prompt += buildContextSection(\"GWT_GENERATION_TASK\", {\n contextType: context.type,\n workflowName,\n target: targetDescription,\n scenarioTypes: typeInstructions,\n workflowContext: workflowContent,\n outputPath: `docs/event_model/workflows/${normalizedWorkflow}/scenarios/*.feature`,\n instructions,\n });\n\n return prompt;\n}\n\n// Export for testing\nexport const _testExports = {\n executeGwtGeneration,\n buildGwtPrompt,\n};\n","/**\n * sdlc_validate_model Tool\n *\n * Validate Event Model for completeness and consistency\n *\n * Checks event naming conventions, information completeness,\n * and ensures no implementation details during modeling.\n *\n * Key features:\n * - Structured validatorContext with invocation gate validation\n * - Local validation (no subagent required)\n * - Integrates with file ownership system\n */\n\nimport { readFile, readdir } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport {\n type ModelValidatorContext as GateModelValidatorContext,\n type GateValidationResult,\n formatGateFailure,\n validateModelValidatorContext,\n} from \"../utils/invocation-gate.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\n\nconst log = createPluginLogger(\"sdlc_validate_model\");\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Structured context for FULL validation\n */\nexport interface ModelValidatorContextFull {\n type: \"FULL\";\n eventModelPath: string;\n}\n\n/**\n * Structured context for WORKFLOW validation\n */\nexport interface ModelValidatorContextWorkflow {\n type: \"WORKFLOW\";\n workflowPath: string;\n}\n\n/**\n * Structured context for SCENARIOS validation\n */\nexport interface ModelValidatorContextScenarios {\n type: \"SCENARIOS\";\n workflowPath: string;\n scenariosPath: string;\n}\n\n/**\n * Union of all structured validator contexts\n */\nexport type StructuredModelValidatorContext =\n | ModelValidatorContextFull\n | ModelValidatorContextWorkflow\n | ModelValidatorContextScenarios;\n\n/**\n * Arguments for sdlc_validate_model tool\n */\nexport interface ValidateModelArgs {\n /** Legacy: scope (for backwards compatibility) */\n scope?: \"all\" | \"domain\" | \"workflow\" | \"scenarios\";\n /** Legacy: workflow name (for backwards compatibility) */\n workflowName?: string;\n /** Legacy: fix flag (for backwards compatibility) */\n fix?: boolean;\n /** Structured context (preferred) */\n validatorContext?: StructuredModelValidatorContext;\n}\n\n/**\n * A validation issue found in the model\n */\nexport interface ValidationIssue {\n severity: \"error\" | \"warning\" | \"info\";\n category: \"naming\" | \"completeness\" | \"consistency\" | \"implementation\";\n location: string;\n message: string;\n suggestion?: string;\n}\n\n/**\n * Result from sdlc_validate_model tool\n */\nexport interface ValidateModelResult {\n success: boolean;\n valid: boolean;\n issues: ValidationIssue[];\n summary: {\n errors: number;\n warnings: number;\n infos: number;\n };\n filesChecked: string[];\n error?: string;\n suggestion?: string;\n /** Gate failure message if invocation gate failed */\n gateFailure?: string;\n}\n\n// ============================================================================\n// Tool Definition\n// ============================================================================\n\n/**\n * Create the sdlc_validate_model tool\n */\nexport function createValidateModelTool(ctx: PluginInput, _config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Validate Event Model for completeness and consistency.\n\nThis tool checks the event model documents for:\n- **Naming conventions**: Events in past tense, commands imperative\n- **Information completeness**: All required sections present\n- **Consistency**: Events referenced in workflows exist in domain\n- **No implementation details**: No database schemas, API endpoints, etc.\n\nChecks:\n- docs/event_model/domain/overview.md\n- docs/event_model/workflows/*/overview.md\n- docs/event_model/workflows/*/scenarios/*.feature\n\nINVOCATION GATE: Requires validatorContext with proper validation scope:\n- FULL: Validate entire event model (requires eventModelPath)\n- WORKFLOW: Validate specific workflow (requires workflowPath)\n- SCENARIOS: Validate scenarios only (requires workflowPath, scenariosPath)\n\nReturns:\n- valid: Boolean indicating if model passes validation\n- issues: List of validation issues with severity and suggestions\n- summary: Count of errors, warnings, and infos\n- filesChecked: List of files that were validated`,\n\n args: {\n scope: tool.schema\n .enum([\"all\", \"domain\", \"workflow\", \"scenarios\"])\n .optional()\n .describe(\"[LEGACY] What to validate. Prefer using validatorContext instead.\"),\n workflowName: tool.schema\n .string()\n .optional()\n .describe(\"[LEGACY] Specific workflow. Prefer using validatorContext instead.\"),\n fix: tool.schema\n .boolean()\n .optional()\n .describe(\"Attempt to auto-fix simple issues (like naming). Default: false\"),\n validatorContext: tool.schema\n .object({\n type: tool.schema.enum([\"FULL\", \"WORKFLOW\", \"SCENARIOS\"]),\n eventModelPath: tool.schema.string().optional(),\n workflowPath: tool.schema.string().optional(),\n scenariosPath: tool.schema.string().optional(),\n })\n .optional()\n .describe(\n \"Structured context for validation. FULL for entire model, WORKFLOW for specific workflow, SCENARIOS for scenarios only.\"\n ),\n },\n\n async execute(args): Promise<string> {\n const result = await executeValidation(ctx, args as ValidateModelArgs);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\n// ============================================================================\n// Execution\n// ============================================================================\n\n/**\n * Build or convert to structured context\n */\nfunction resolveValidatorContext(\n args: ValidateModelArgs,\n projectDir: string\n): GateModelValidatorContext | null {\n // Prefer structured context if provided\n if (args.validatorContext) {\n return args.validatorContext as GateModelValidatorContext;\n }\n\n // Fall back to legacy arguments - create context based on scope\n const eventModelPath = join(projectDir, \"docs\", \"event_model\");\n const scope = args.scope || \"all\";\n\n if (scope === \"all\" || scope === \"domain\") {\n return {\n type: \"FULL\",\n eventModelPath,\n };\n }\n\n if (scope === \"workflow\") {\n const workflowName = args.workflowName || \"*\";\n const normalizedName = workflowName\n .toLowerCase()\n .replace(/[^a-z0-9*]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n return {\n type: \"WORKFLOW\",\n workflowPath: join(eventModelPath, \"workflows\", normalizedName),\n };\n }\n\n if (scope === \"scenarios\") {\n const workflowName = args.workflowName || \"*\";\n const normalizedName = workflowName\n .toLowerCase()\n .replace(/[^a-z0-9*]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n const workflowPath = join(eventModelPath, \"workflows\", normalizedName);\n return {\n type: \"SCENARIOS\",\n workflowPath,\n scenariosPath: join(workflowPath, \"scenarios\"),\n };\n }\n\n return {\n type: \"FULL\",\n eventModelPath,\n };\n}\n\nasync function executeValidation(\n ctx: PluginInput,\n args: ValidateModelArgs\n): Promise<ValidateModelResult> {\n // Resolve context (structured or legacy)\n const validatorContext = resolveValidatorContext(args, ctx.directory);\n\n // Validate invocation gate\n const gateValidation: GateValidationResult = validateModelValidatorContext(validatorContext);\n if (!gateValidation.valid) {\n const gateFailure = formatGateFailure(\"MODEL_VALIDATOR\", gateValidation);\n log.warn(\"Model validator invocation gate failed\", {\n error: gateValidation.error,\n missingFields: gateValidation.missingFields,\n });\n return {\n success: false,\n valid: false,\n issues: [],\n summary: { errors: 0, warnings: 0, infos: 0 },\n filesChecked: [],\n error: gateValidation.error || \"Invocation gate failed\",\n suggestion: \"Provide proper validatorContext with required fields\",\n gateFailure,\n };\n }\n\n // Context is now validated\n const validContext = validatorContext as GateModelValidatorContext;\n log.debug(\"Model validator invocation gate passed\", { type: validContext.type });\n\n const issues: ValidationIssue[] = [];\n const filesChecked: string[] = [];\n const scope = args.scope || \"all\";\n\n const eventModelDir = join(ctx.directory, \"docs\", \"event_model\");\n\n // Validate domain overview\n if (scope === \"all\" || scope === \"domain\") {\n const domainPath = join(eventModelDir, \"domain\", \"overview.md\");\n try {\n const content = await readFile(domainPath, \"utf-8\");\n filesChecked.push(domainPath);\n issues.push(...validateDomainOverview(content, domainPath));\n } catch {\n issues.push({\n severity: \"error\",\n category: \"completeness\",\n location: domainPath,\n message: \"Domain overview not found\",\n suggestion: \"Run sdlc_discover_domain to create the domain overview\",\n });\n }\n }\n\n // Validate workflows\n if (scope === \"all\" || scope === \"workflow\" || scope === \"scenarios\") {\n const workflowsDir = join(eventModelDir, \"workflows\");\n let workflowDirs: string[] = [];\n\n try {\n const entries = await readdir(workflowsDir, { withFileTypes: true });\n workflowDirs = entries.filter((e) => e.isDirectory()).map((e) => e.name);\n } catch {\n // Only warn about missing workflows if we're actually trying to check them\n issues.push({\n severity: \"warning\",\n category: \"completeness\",\n location: workflowsDir,\n message: \"No workflows directory found\",\n suggestion: \"Run sdlc_design_workflow to create workflow designs\",\n });\n }\n\n // Filter to specific workflow if requested\n if (args.workflowName) {\n const normalized = args.workflowName\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n workflowDirs = workflowDirs.filter((d) => d === normalized);\n }\n\n for (const workflowDir of workflowDirs) {\n const workflowPath = join(workflowsDir, workflowDir, \"overview.md\");\n\n // Validate workflow overview\n if (scope === \"all\" || scope === \"workflow\") {\n try {\n const content = await readFile(workflowPath, \"utf-8\");\n filesChecked.push(workflowPath);\n issues.push(...validateWorkflowOverview(content, workflowPath));\n } catch {\n issues.push({\n severity: \"error\",\n category: \"completeness\",\n location: workflowPath,\n message: `Workflow overview not found for ${workflowDir}`,\n suggestion: \"Run sdlc_design_workflow to create the workflow design\",\n });\n }\n }\n\n // Validate scenarios\n if (scope === \"all\" || scope === \"scenarios\") {\n const scenariosDir = join(workflowsDir, workflowDir, \"scenarios\");\n try {\n const scenarioFiles = await readdir(scenariosDir);\n for (const scenarioFile of scenarioFiles) {\n if (scenarioFile.endsWith(\".feature\")) {\n const scenarioPath = join(scenariosDir, scenarioFile);\n const content = await readFile(scenarioPath, \"utf-8\");\n filesChecked.push(scenarioPath);\n issues.push(...validateScenarios(content, scenarioPath));\n }\n }\n } catch {\n // No scenarios directory - not an error, might not be generated yet\n issues.push({\n severity: \"info\",\n category: \"completeness\",\n location: scenariosDir,\n message: `No scenarios found for ${workflowDir}`,\n suggestion: \"Run sdlc_generate_gwt to create GWT scenarios\",\n });\n }\n }\n }\n }\n\n // Calculate summary\n const summary = {\n errors: issues.filter((i) => i.severity === \"error\").length,\n warnings: issues.filter((i) => i.severity === \"warning\").length,\n infos: issues.filter((i) => i.severity === \"info\").length,\n };\n\n return {\n success: true,\n valid: summary.errors === 0,\n issues,\n summary,\n filesChecked,\n };\n}\n\nfunction validateDomainOverview(content: string, path: string): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n\n // Check for required sections\n const requiredSections = [\"Summary\", \"Actors\", \"Processes\", \"Boundaries\", \"Glossary\"];\n\n for (const section of requiredSections) {\n if (!content.match(new RegExp(`##?\\\\s*${section}`, \"i\"))) {\n issues.push({\n severity: \"warning\",\n category: \"completeness\",\n location: path,\n message: `Missing section: ${section}`,\n suggestion: `Add a ## ${section} section to the domain overview`,\n });\n }\n }\n\n // Check for implementation details\n const implementationPatterns = [\n { pattern: /\\b(database|sql|table|column|schema)\\b/i, term: \"database terminology\" },\n { pattern: /\\b(api|endpoint|rest|graphql|http)\\b/i, term: \"API terminology\" },\n { pattern: /\\b(class|interface|function|method)\\b/i, term: \"code terminology\" },\n { pattern: /\\b(json|xml|yaml)\\b/i, term: \"data format terminology\" },\n ];\n\n for (const { pattern, term } of implementationPatterns) {\n if (pattern.test(content)) {\n issues.push({\n severity: \"warning\",\n category: \"implementation\",\n location: path,\n message: `Domain overview contains ${term}`,\n suggestion: \"Use business language instead of technical terminology\",\n });\n }\n }\n\n return issues;\n}\n\nfunction validateWorkflowOverview(content: string, path: string): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n\n // Check for required sections\n const requiredSections = [\"Events\", \"Commands\", \"Read Models\", \"Vertical Slices\"];\n\n for (const section of requiredSections) {\n if (!content.match(new RegExp(`##?\\\\s*${section}`, \"i\"))) {\n issues.push({\n severity: \"warning\",\n category: \"completeness\",\n location: path,\n message: `Missing section: ${section}`,\n suggestion: `Add a ## ${section} section to the workflow`,\n });\n }\n }\n\n // Check event naming (should be past tense)\n const eventSection = content.match(/##?\\s*Events?[^\\n]*\\n([\\s\\S]*?)(?=\\n##[^#]|$)/i);\n if (eventSection) {\n const events = eventSection[1].match(/\\b([A-Z][a-zA-Z]+)\\b/g) || [];\n for (const event of events) {\n // Check if it looks like a command (imperative) instead of an event (past tense)\n if (event.match(/^(Create|Update|Delete|Add|Remove|Set|Get|Send|Process|Handle|Submit)/)) {\n issues.push({\n severity: \"error\",\n category: \"naming\",\n location: path,\n message: `Event \"${event}\" uses imperative naming (command-style)`,\n suggestion: `Use past tense: ${suggestPastTense(event)}`,\n });\n }\n }\n }\n\n // Check command naming (should be imperative)\n const commandSection = content.match(/##?\\s*Commands?[^\\n]*\\n([\\s\\S]*?)(?=\\n##|$)/i);\n if (commandSection) {\n const commands = commandSection[1].match(/###?\\s*([A-Z][a-zA-Z]+)/g) || [];\n for (const cmdMatch of commands) {\n const command = cmdMatch.replace(/^###?\\s*/, \"\");\n // Check if it looks like an event (past tense) instead of a command\n if (command.match(/ed$|en$/)) {\n issues.push({\n severity: \"error\",\n category: \"naming\",\n location: path,\n message: `Command \"${command}\" uses past tense (event-style)`,\n suggestion: `Use imperative: ${suggestImperative(command)}`,\n });\n }\n }\n }\n\n // Check for implementation details\n const implementationPatterns = [\n { pattern: /\\b(database|sql|table|column|schema)\\b/i, term: \"database terminology\" },\n { pattern: /\\b(endpoint|rest|graphql|http|url)\\b/i, term: \"API terminology\" },\n { pattern: /\\btypescript|javascript|python|java\\b/i, term: \"language references\" },\n ];\n\n for (const { pattern, term } of implementationPatterns) {\n if (pattern.test(content)) {\n issues.push({\n severity: \"warning\",\n category: \"implementation\",\n location: path,\n message: `Workflow contains ${term}`,\n suggestion: \"Keep workflow design implementation-agnostic\",\n });\n }\n }\n\n return issues;\n}\n\nfunction validateScenarios(content: string, path: string): ValidationIssue[] {\n const issues: ValidationIssue[] = [];\n\n // Check for Feature header\n if (!content.match(/^Feature:/m)) {\n issues.push({\n severity: \"error\",\n category: \"completeness\",\n location: path,\n message: \"Missing Feature header\",\n suggestion: \"Add a Feature: header at the start of the file\",\n });\n }\n\n // Check for at least one scenario\n if (!content.match(/Scenario:/i)) {\n issues.push({\n severity: \"error\",\n category: \"completeness\",\n location: path,\n message: \"No scenarios defined\",\n suggestion: \"Add at least one Scenario: block\",\n });\n }\n\n // Check that scenarios have Given/When/Then\n const scenarioMatches = content.matchAll(/Scenario:\\s*(.+?)\\n([\\s\\S]*?)(?=Scenario:|$)/gi);\n for (const match of scenarioMatches) {\n const scenarioName = match[1].trim();\n const scenarioBody = match[2];\n\n if (!scenarioBody.match(/\\bGiven\\b/i)) {\n issues.push({\n severity: \"warning\",\n category: \"completeness\",\n location: path,\n message: `Scenario \"${scenarioName}\" missing Given clause`,\n suggestion: \"Add a Given clause to set up the initial state\",\n });\n }\n\n if (!scenarioBody.match(/\\bWhen\\b/i)) {\n issues.push({\n severity: \"error\",\n category: \"completeness\",\n location: path,\n message: `Scenario \"${scenarioName}\" missing When clause`,\n suggestion: \"Add a When clause to specify the action\",\n });\n }\n\n if (!scenarioBody.match(/\\bThen\\b/i)) {\n issues.push({\n severity: \"error\",\n category: \"completeness\",\n location: path,\n message: `Scenario \"${scenarioName}\" missing Then clause`,\n suggestion: \"Add a Then clause to specify expected outcomes\",\n });\n }\n }\n\n // Check for placeholder values\n const placeholderPatterns = [\n { pattern: /\\{[a-z_]+\\}/i, term: \"placeholder in braces\" },\n { pattern: /<[a-z_]+>/i, term: \"placeholder in angle brackets\" },\n { pattern: /\\bTODO\\b/i, term: \"TODO marker\" },\n { pattern: /\\bXXX\\b/i, term: \"XXX marker\" },\n ];\n\n for (const { pattern, term } of placeholderPatterns) {\n if (pattern.test(content)) {\n issues.push({\n severity: \"warning\",\n category: \"completeness\",\n location: path,\n message: `Scenarios contain ${term}`,\n suggestion: \"Replace placeholders with concrete example values\",\n });\n }\n }\n\n return issues;\n}\n\nfunction suggestPastTense(command: string): string {\n // Simple suggestions for common patterns\n if (command.startsWith(\"Create\")) return command.replace(\"Create\", \"Created\");\n if (command.startsWith(\"Update\")) return command.replace(\"Update\", \"Updated\");\n if (command.startsWith(\"Delete\")) return command.replace(\"Delete\", \"Deleted\");\n if (command.startsWith(\"Add\")) return command.replace(\"Add\", \"Added\");\n if (command.startsWith(\"Remove\")) return command.replace(\"Remove\", \"Removed\");\n if (command.startsWith(\"Set\")) return command.replace(\"Set\", \"Set\"); // Already past\n if (command.startsWith(\"Send\")) return command.replace(\"Send\", \"Sent\");\n if (command.startsWith(\"Submit\")) return command.replace(\"Submit\", \"Submitted\");\n if (command.startsWith(\"Process\")) return command.replace(\"Process\", \"Processed\");\n return `${command}ed`;\n}\n\nfunction suggestImperative(event: string): string {\n // Simple suggestions for common patterns\n if (event.endsWith(\"Created\")) return event.replace(\"Created\", \"Create\");\n if (event.endsWith(\"Updated\")) return event.replace(\"Updated\", \"Update\");\n if (event.endsWith(\"Deleted\")) return event.replace(\"Deleted\", \"Delete\");\n if (event.endsWith(\"Added\")) return event.replace(\"Added\", \"Add\");\n if (event.endsWith(\"Removed\")) return event.replace(\"Removed\", \"Remove\");\n if (event.endsWith(\"Sent\")) return event.replace(\"Sent\", \"Send\");\n if (event.endsWith(\"Submitted\")) return event.replace(\"Submitted\", \"Submit\");\n if (event.endsWith(\"Processed\")) return event.replace(\"Processed\", \"Process\");\n if (event.endsWith(\"ed\")) return event.slice(0, -2);\n return event;\n}\n\n// Export for testing\nexport const _testExports = {\n executeValidation,\n validateDomainOverview,\n validateWorkflowOverview,\n validateScenarios,\n suggestPastTense,\n suggestImperative,\n};\n","/**\n * sdlc_get_context tool\n *\n * Quick access to current issue context from tracker.\n */\n\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport type { IssueTracker } from \"../tracker/issue-tracker.js\";\n\n/**\n * Create the sdlc_get_context tool\n */\nexport function createGetContextTool(tracker: IssueTracker, _config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Get the current issue context without reloading from GitHub.\n\nReturns the cached context from the issue tracker including:\n- Current issue number and status\n- When the issue was started\n- Recent activity history\n\nUse this for quick status checks. Use sdlc_get_issue to reload full context from GitHub.`,\n\n args: {},\n\n async execute(): Promise<string> {\n const currentIssue = tracker.getCurrentIssue();\n\n if (!currentIssue) {\n return JSON.stringify({\n status: \"no_active_issue\",\n message: \"No issue is currently being tracked. Use sdlc_get_issue to load an issue.\",\n });\n }\n\n const context = await tracker.getCurrentIssueContext();\n const history = tracker.getHistory().slice(-10);\n\n return JSON.stringify(\n {\n currentIssue: {\n number: currentIssue.issueNumber,\n status: currentIssue.status,\n startedAt: currentIssue.startedAt,\n completedAt: currentIssue.completedAt,\n },\n contextSummary: context,\n recentHistory: history,\n sessionId: tracker.getSessionId(),\n },\n null,\n 2\n );\n },\n });\n}\n","import { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { GetIssueResult, SdlcConfig } from \"../../shared/types.js\";\nimport type { IssueTracker } from \"../tracker/issue-tracker.js\";\nimport { fetchIssue, listIssues, moveIssueToStatus } from \"../utils/github-issues.js\";\nimport { parseAcceptanceCriteria } from \"../utils/issue-parser.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\n\nconst log = createPluginLogger(\"get-issue\");\n\nexport function createGetIssueTool(\n ctx: PluginInput,\n tracker: IssueTracker,\n config: SdlcConfig\n): ToolDefinition {\n return tool({\n description: `Load a GitHub issue for implementation.\n\nReturns:\n- Issue title and body\n- Acceptance criteria parsed from issue checkboxes\n- Instructions for next steps\n\nIf issue is in Ready status, it will be moved to In progress automatically.`,\n\n args: {\n issueNumber: tool.schema\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"GitHub issue number. If omitted, loads next Ready issue.\"),\n },\n\n async execute(args): Promise<string> {\n const result = await getIssueContext(ctx, tracker, config, args.issueNumber);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function getIssueContext(\n ctx: PluginInput,\n tracker: IssueTracker,\n config: SdlcConfig,\n issueNumber?: number\n): Promise<GetIssueResult> {\n if (!config.github?.owner || !config.github?.repo) {\n return {\n error: \"GitHub configuration missing\",\n suggestion: \"Set github.owner and github.repo in sdlc.json\",\n };\n }\n\n let targetIssueNumber = issueNumber;\n\n if (!targetIssueNumber) {\n const readyIssues = await listIssues(ctx, config, \"Ready\", 1);\n if (readyIssues.length === 0) {\n return {\n error: \"No Ready issues found\",\n suggestion: \"Move an issue to Ready status in the project board\",\n };\n }\n targetIssueNumber = readyIssues[0].number;\n }\n\n const issue = await fetchIssue(ctx, config, targetIssueNumber);\n if (!issue) {\n return {\n error: `Issue #${targetIssueNumber} not found`,\n suggestion: \"Check the issue number and repository settings\",\n };\n }\n\n const acceptanceCriteria = parseAcceptanceCriteria(issue.body);\n\n // Auto-move Ready -> In progress\n if (issue.state === \"OPEN\" || issue.state === \"open\") {\n const moved = await moveIssueToStatus(ctx, config, issue.number, \"In progress\");\n if (moved) {\n log.info(\"Auto-moved issue to In progress\", { issueNumber: issue.number });\n }\n }\n\n await tracker.setCurrentIssue(issue.number, {\n title: issue.title,\n status: \"In progress\",\n startedAt: new Date().toISOString(),\n url: issue.url,\n body: issue.body,\n });\n\n return {\n issueNumber: issue.number,\n title: issue.title,\n body: issue.body || \"\",\n url: issue.url,\n status: \"In progress\",\n acceptanceCriteria,\n instructions: \"Use todowrite with the provided todos to track acceptance criteria.\",\n };\n}\n","/**\n * PM Mode Context Utilities\n *\n * Provides consistent validation and error handling for PM mode tools.\n */\n\nimport type { SdlcConfig } from \"../../shared/types.js\";\n\n/**\n * Result of PM context validation\n */\nexport interface PmContextValidation {\n valid: boolean;\n error?: string;\n suggestion?: string;\n github?: {\n owner: string;\n repo: string;\n project?: number;\n };\n}\n\n/**\n * Validate that GitHub configuration is present for PM operations\n */\nexport function validatePmContext(config: SdlcConfig): PmContextValidation {\n if (!config.github?.owner || !config.github?.repo) {\n return {\n valid: false,\n error: \"GitHub configuration missing\",\n suggestion: \"Set github.owner and github.repo in sdlc.json\",\n };\n }\n\n return {\n valid: true,\n github: {\n owner: config.github.owner,\n repo: config.github.repo,\n project: config.github.project,\n },\n };\n}\n\n/**\n * Create a standard error result for PM tools\n */\nexport function createPmErrorResult(\n error: string,\n suggestion?: string\n): { success: false; error: string; suggestion?: string } {\n return {\n success: false,\n error,\n suggestion,\n };\n}\n\n/**\n * Validate that project board is configured for status operations\n */\nexport function validateProjectBoard(config: SdlcConfig): PmContextValidation {\n const baseValidation = validatePmContext(config);\n if (!baseValidation.valid) {\n return baseValidation;\n }\n\n if (!config.github?.project) {\n return {\n valid: false,\n error: \"GitHub project board not configured\",\n suggestion: \"Set github.project (project number) in sdlc.json\",\n };\n }\n\n return baseValidation;\n}\n","import { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { ListIssuesResult, SdlcConfig } from \"../../shared/types.js\";\nimport { listIssues } from \"../utils/github-issues.js\";\nimport { validatePmContext } from \"../utils/pm-context.js\";\n\nexport function createListIssuesTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `List GitHub issues from the configured repository.\n\nOptionally filter by status column name (e.g., Ready, In progress, Done).\n\nRequires GitHub configuration in sdlc.json (github.owner, github.repo).`,\n\n args: {\n status: tool.schema.string().optional().describe(\"Filter by status column name\"),\n limit: tool.schema.number().int().positive().optional().describe(\"Max issues to return\"),\n },\n\n async execute(args): Promise<string> {\n // Validate PM context\n const validation = validatePmContext(config);\n if (!validation.valid) {\n const result: ListIssuesResult = {\n success: false,\n issues: [],\n error: validation.error,\n suggestion: validation.suggestion,\n };\n return JSON.stringify(result, null, 2);\n }\n\n const issues = await listIssues(ctx, config, args.status, args.limit ?? 20);\n const result: ListIssuesResult = {\n success: true,\n issues: issues.map((i) => ({\n number: i.number,\n title: i.title,\n status: i.status || i.state,\n url: i.url,\n })),\n };\n return JSON.stringify(result, null, 2);\n },\n });\n}\n","/**\n * sdlc_recall Tool\n *\n * Query persistent memory to retrieve relevant context from past sessions.\n */\n\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport { type MemoryBackend, getMemoryBackend } from \"../memory/index.js\";\n\n/**\n * Result from sdlc_recall tool\n */\nexport interface RecallResult {\n success: boolean;\n memories?: unknown[];\n count?: number;\n query?: string;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Arguments for sdlc_recall tool\n */\nexport interface RecallArgs {\n query: string;\n tags?: string[];\n limit?: number;\n projectOnly?: boolean;\n}\n\n/**\n * Create the sdlc_recall tool\n */\nexport function createRecallTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Query persistent memory to retrieve relevant context from past sessions.\n\nUse this tool before starting work to:\n- Check for existing knowledge about a component or feature\n- Recall debugging insights that might be relevant\n- Find documented patterns or conventions\n- Review previous decisions and their rationale\n\nThe query is matched against memory keys, content, and tags.\nResults are ranked by relevance and returned in order.`,\n\n args: {\n query: tool.schema\n .string()\n .describe(\n \"Search query to find relevant memories. Can be a key path or keywords from content.\"\n ),\n tags: tool.schema\n .array(tool.schema.string())\n .optional()\n .describe(\"Filter results by tags (e.g., ['debugging', 'auth'])\"),\n limit: tool.schema\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Maximum number of results to return (default: 10)\"),\n projectOnly: tool.schema\n .boolean()\n .optional()\n .describe(\"Only return memories from the current project directory\"),\n },\n\n async execute(args): Promise<string> {\n const recallArgs = args as RecallArgs;\n\n if (!recallArgs.query?.trim()) {\n return JSON.stringify({\n success: false,\n error: \"Query is required\",\n suggestion: \"Provide a search query to find relevant memories\",\n });\n }\n\n const backend = getMemoryBackend(ctx, config);\n const result = await backend.recall(recallArgs.query, {\n tags: recallArgs.tags,\n limit: recallArgs.limit,\n projectOnly: recallArgs.projectOnly,\n });\n\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\n// Export for testing\nexport const _testExports = {\n createRecallToolForTest: (backend: { recall: MemoryBackend[\"recall\"] }) => ({\n execute: async (args: RecallArgs) =>\n JSON.stringify(\n await backend.recall(args.query, {\n tags: args.tags,\n limit: args.limit,\n projectOnly: args.projectOnly,\n }),\n null,\n 2\n ),\n }),\n};\n","/**\n * sdlc_remember Tool\n *\n * Store context/discoveries to persistent memory for future sessions.\n */\n\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport { type MemoryBackend, getMemoryBackend } from \"../memory/index.js\";\n\n/**\n * Result from sdlc_remember tool\n */\nexport interface RememberResult {\n success: boolean;\n key?: string;\n stored?: boolean;\n updated?: boolean;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Arguments for sdlc_remember tool\n */\nexport interface RememberArgs {\n key: string;\n content: string;\n tags?: string[];\n}\n\n/**\n * Create the sdlc_remember tool\n */\nexport function createRememberTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Store context, discoveries, or insights to persistent memory for future sessions.\n\nThis tool saves information that should persist across sessions, such as:\n- Project conventions and patterns learned during development\n- Debugging insights that might be useful later\n- Domain knowledge discovered during implementation\n- Technical decisions and their rationale\n\nMemories are stored with a unique key and optional tags for organization.\nUse descriptive keys like \"auth/jwt-token-format\" or \"api/error-handling-pattern\".`,\n\n args: {\n key: tool.schema\n .string()\n .describe(\n \"Unique identifier for this memory. Use slash-separated paths for organization (e.g., 'project/component/topic')\"\n ),\n content: tool.schema\n .string()\n .describe(\"The content to remember. Be descriptive - this will be recalled later.\"),\n tags: tool.schema\n .array(tool.schema.string())\n .optional()\n .describe(\"Tags for categorization and filtering (e.g., ['debugging', 'auth', 'api'])\"),\n },\n\n async execute(args): Promise<string> {\n const rememberArgs = args as RememberArgs;\n\n if (!rememberArgs.key?.trim()) {\n return JSON.stringify({\n success: false,\n error: \"Key is required\",\n suggestion: \"Provide a unique key for this memory\",\n });\n }\n\n if (!rememberArgs.content?.trim()) {\n return JSON.stringify({\n success: false,\n error: \"Content is required\",\n suggestion: \"Provide the content to remember\",\n });\n }\n\n const backend = getMemoryBackend(ctx, config);\n const result = await backend.remember(\n rememberArgs.key,\n rememberArgs.content,\n rememberArgs.tags\n );\n\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\n// Export for testing\nexport const _testExports = {\n createRememberToolForTest: (backend: { remember: MemoryBackend[\"remember\"] }) => ({\n execute: async (args: RememberArgs) =>\n JSON.stringify(await backend.remember(args.key, args.content, args.tags), null, 2),\n }),\n};\n","/**\n * sdlc_mutation Tool\n *\n * Runs mutation testing to verify test suite quality.\n * Supports: cargo-mutants (Rust), Stryker (JS/TS), mutmut (Python), Muzak (Elixir)\n */\n\nimport { existsSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\n\n/**\n * Supported mutation testing frameworks\n */\nexport type MutationFramework = \"stryker\" | \"cargo-mutants\" | \"mutmut\" | \"muzak\" | \"auto\";\n\n/**\n * A surviving mutant from mutation testing\n */\nexport interface SurvivingMutant {\n id: string;\n file: string;\n line?: number;\n original: string;\n mutation: string;\n mutationType: string;\n}\n\n/**\n * Mutation testing result\n */\nexport interface MutationResult {\n success: boolean;\n framework?: MutationFramework;\n totalMutants?: number;\n killed?: number;\n survived?: number;\n timedOut?: number;\n score?: number;\n threshold?: number;\n passed?: boolean;\n survivors?: SurvivingMutant[];\n reportPath?: string;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Arguments for sdlc_mutation tool\n */\nexport interface MutationArgs {\n targetPath?: string;\n framework?: MutationFramework;\n timeout?: number;\n}\n\n/**\n * Create the sdlc_mutation tool\n */\nexport function createMutationTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Run mutation testing to verify test suite quality.\n\nMutation testing creates small changes (mutants) in the code and checks\nif tests detect them. Surviving mutants indicate test gaps.\n\nSupported frameworks:\n- stryker: JavaScript/TypeScript\n- cargo-mutants: Rust\n- mutmut: Python\n- muzak: Elixir\n- auto: Detect from project files\n\nReturns:\n- score: Percentage of mutants killed (higher is better)\n- passed: Whether score meets configured threshold\n- survivors: List of surviving mutants with analysis\n- reportPath: Path to detailed HTML report (if available)`,\n\n args: {\n targetPath: tool.schema\n .string()\n .optional()\n .describe(\"Path to file or directory to mutate (default: src/)\"),\n framework: tool.schema\n .enum([\"stryker\", \"cargo-mutants\", \"mutmut\", \"muzak\", \"auto\"])\n .optional()\n .describe(\"Mutation testing framework (default: auto-detect)\"),\n timeout: tool.schema\n .number()\n .optional()\n .describe(\"Timeout per mutant in seconds (default: 60)\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executeMutation(ctx, config, args as MutationArgs);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function executeMutation(\n ctx: PluginInput,\n config: SdlcConfig,\n args: MutationArgs\n): Promise<MutationResult> {\n // Determine framework\n const framework =\n args.framework === \"auto\" || !args.framework ? detectFramework(ctx.directory) : args.framework;\n\n if (!framework) {\n return {\n success: false,\n error: \"Could not detect mutation testing framework\",\n suggestion: \"Install a mutation testing framework or specify --framework\",\n };\n }\n\n // Check if framework is available\n const available = await checkFrameworkAvailable(ctx, framework);\n if (!available) {\n return {\n success: false,\n error: `Framework ${framework} is not installed`,\n suggestion: getInstallSuggestion(framework),\n };\n }\n\n // Get threshold from config\n const threshold = config.tdd?.mutationTesting?.requiredScore ?? 80;\n\n // Run mutation testing\n const targetPath = args.targetPath || \"src/\";\n const timeout = args.timeout || 60;\n\n const runResult = await runMutationTesting(ctx, framework, targetPath, timeout);\n\n if (!runResult.success) {\n return {\n success: false,\n framework,\n error: runResult.error,\n suggestion: runResult.suggestion,\n };\n }\n\n // Parse results\n const parsed = parseMutationOutput(runResult.output || \"\", framework);\n\n // Calculate score\n const score = parsed.totalMutants > 0 ? (parsed.killed / parsed.totalMutants) * 100 : 0;\n\n const passed = score >= threshold;\n\n // Save report if available\n let reportPath: string | undefined;\n if (parsed.survivors.length > 0) {\n reportPath = join(ctx.directory, \".opencode\", \"mutation-report.md\");\n try {\n await mkdir(dirname(reportPath), { recursive: true });\n await writeFile(reportPath, generateReport(parsed, score, threshold), \"utf-8\");\n } catch {\n // Non-fatal\n }\n }\n\n return {\n success: true,\n framework,\n totalMutants: parsed.totalMutants,\n killed: parsed.killed,\n survived: parsed.survived,\n timedOut: parsed.timedOut,\n score: Math.round(score * 10) / 10,\n threshold,\n passed,\n survivors: parsed.survivors.slice(0, 10), // Limit to 10 for response size\n reportPath,\n };\n}\n\nfunction detectFramework(directory: string): MutationFramework | null {\n // Check for project files to determine language/framework\n if (existsSync(join(directory, \"Cargo.toml\"))) {\n return \"cargo-mutants\";\n }\n if (\n existsSync(join(directory, \"stryker.conf.json\")) ||\n existsSync(join(directory, \"stryker.conf.js\")) ||\n existsSync(join(directory, \"stryker.conf.mjs\"))\n ) {\n return \"stryker\";\n }\n if (existsSync(join(directory, \"package.json\"))) {\n return \"stryker\"; // Default for JS/TS projects\n }\n if (existsSync(join(directory, \"setup.py\")) || existsSync(join(directory, \"pyproject.toml\"))) {\n return \"mutmut\";\n }\n if (existsSync(join(directory, \"mix.exs\"))) {\n return \"muzak\";\n }\n return null;\n}\n\nasync function checkFrameworkAvailable(\n ctx: PluginInput,\n framework: MutationFramework\n): Promise<boolean> {\n try {\n switch (framework) {\n case \"stryker\":\n await ctx.$`npx stryker --version`;\n return true;\n case \"cargo-mutants\":\n await ctx.$`cargo mutants --version`;\n return true;\n case \"mutmut\":\n await ctx.$`mutmut --version`;\n return true;\n case \"muzak\":\n await ctx.$`mix help muzak`;\n return true;\n default:\n return false;\n }\n } catch {\n return false;\n }\n}\n\nfunction getInstallSuggestion(framework: MutationFramework): string {\n switch (framework) {\n case \"stryker\":\n return \"Install with: npm install --save-dev @stryker-mutator/core\";\n case \"cargo-mutants\":\n return \"Install with: cargo install cargo-mutants\";\n case \"mutmut\":\n return \"Install with: pip install mutmut\";\n case \"muzak\":\n return 'Add {:muzak, \"~> 1.0\", only: :test} to mix.exs';\n default:\n return \"Install the appropriate mutation testing framework for your project\";\n }\n}\n\ninterface RunResult {\n success: boolean;\n output?: string;\n error?: string;\n suggestion?: string;\n}\n\nasync function runMutationTesting(\n ctx: PluginInput,\n framework: MutationFramework,\n targetPath: string,\n timeout: number\n): Promise<RunResult> {\n try {\n let result: { stdout: Buffer | string };\n\n switch (framework) {\n case \"stryker\":\n result = await ctx.$`npx stryker run --mutate ${targetPath}/**/*.ts`;\n break;\n case \"cargo-mutants\":\n result = await ctx.$`cargo mutants --timeout ${timeout}`;\n break;\n case \"mutmut\":\n result = await ctx.$`mutmut run --paths-to-mutate ${targetPath}`;\n break;\n case \"muzak\":\n result = await ctx.$`mix muzak`;\n break;\n default:\n return {\n success: false,\n error: `Unknown framework: ${framework}`,\n };\n }\n\n return {\n success: true,\n output: String(result.stdout),\n };\n } catch (error) {\n // Mutation testing often returns non-zero exit codes for surviving mutants\n // Check if we got output anyway\n const errorObj = error as { stdout?: Buffer | string; message?: string };\n if (errorObj.stdout) {\n return {\n success: true,\n output: String(errorObj.stdout),\n };\n }\n return {\n success: false,\n error: errorObj.message || \"Mutation testing failed\",\n suggestion: \"Check test command and framework configuration\",\n };\n }\n}\n\ninterface ParsedMutation {\n totalMutants: number;\n killed: number;\n survived: number;\n timedOut: number;\n survivors: SurvivingMutant[];\n}\n\nfunction parseMutationOutput(output: string, framework: MutationFramework): ParsedMutation {\n const result: ParsedMutation = {\n totalMutants: 0,\n killed: 0,\n survived: 0,\n timedOut: 0,\n survivors: [],\n };\n\n // Stryker output parsing\n if (framework === \"stryker\") {\n const totalMatch = output.match(/Ran (\\d+) mutants/i);\n const killedMatch = output.match(/Killed:\\s*(\\d+)/i);\n const survivedMatch = output.match(/Survived:\\s*(\\d+)/i);\n const timedOutMatch = output.match(/Timed out:\\s*(\\d+)/i);\n\n if (totalMatch) result.totalMutants = Number.parseInt(totalMatch[1], 10);\n if (killedMatch) result.killed = Number.parseInt(killedMatch[1], 10);\n if (survivedMatch) result.survived = Number.parseInt(survivedMatch[1], 10);\n if (timedOutMatch) result.timedOut = Number.parseInt(timedOutMatch[1], 10);\n\n // Parse surviving mutants\n const survivorMatches = output.matchAll(/Survived:\\s*([^\\n]+?)\\s*\\(([^)]+):(\\d+)\\)/gi);\n for (const match of survivorMatches) {\n result.survivors.push({\n id: `stryker-${result.survivors.length}`,\n file: match[2],\n line: Number.parseInt(match[3], 10),\n original: \"\",\n mutation: match[1],\n mutationType: \"unknown\",\n });\n }\n }\n\n // cargo-mutants output parsing\n if (framework === \"cargo-mutants\") {\n const totalMatch = output.match(/(\\d+) mutants tested/i);\n const killedMatch = output.match(/(\\d+) caught/i);\n const survivedMatch = output.match(/(\\d+) missed/i);\n const timedOutMatch = output.match(/(\\d+) timed out/i);\n\n if (totalMatch) result.totalMutants = Number.parseInt(totalMatch[1], 10);\n if (killedMatch) result.killed = Number.parseInt(killedMatch[1], 10);\n if (survivedMatch) result.survived = Number.parseInt(survivedMatch[1], 10);\n if (timedOutMatch) result.timedOut = Number.parseInt(timedOutMatch[1], 10);\n\n // Parse MISSED mutants\n const missedMatches = output.matchAll(/MISSED\\s+([^\\n]+?)\\s+in\\s+([^:]+):(\\d+)/gi);\n for (const match of missedMatches) {\n result.survivors.push({\n id: `cargo-${result.survivors.length}`,\n file: match[2],\n line: Number.parseInt(match[3], 10),\n original: \"\",\n mutation: match[1],\n mutationType: \"unknown\",\n });\n }\n }\n\n // mutmut output parsing\n if (framework === \"mutmut\") {\n const statusMatch = output.match(/(\\d+)\\/(\\d+)/);\n if (statusMatch) {\n result.killed = Number.parseInt(statusMatch[1], 10);\n result.totalMutants = Number.parseInt(statusMatch[2], 10);\n result.survived = result.totalMutants - result.killed;\n }\n }\n\n // muzak output parsing\n if (framework === \"muzak\") {\n const summaryMatch = output.match(/(\\d+) killed, (\\d+) survived/i);\n if (summaryMatch) {\n result.killed = Number.parseInt(summaryMatch[1], 10);\n result.survived = Number.parseInt(summaryMatch[2], 10);\n result.totalMutants = result.killed + result.survived;\n }\n }\n\n return result;\n}\n\nfunction generateReport(parsed: ParsedMutation, score: number, threshold: number): string {\n const passedStr = score >= threshold ? \"PASSED\" : \"FAILED\";\n\n let report = `# Mutation Testing Report\n\n## Summary\n- **Score:** ${score.toFixed(1)}%\n- **Threshold:** ${threshold}%\n- **Status:** ${passedStr}\n\n## Statistics\n| Metric | Count |\n|--------|-------|\n| Total Mutants | ${parsed.totalMutants} |\n| Killed | ${parsed.killed} |\n| Survived | ${parsed.survived} |\n| Timed Out | ${parsed.timedOut} |\n\n## Surviving Mutants\n\n`;\n\n if (parsed.survivors.length === 0) {\n report += \"No surviving mutants - excellent test coverage!\\n\";\n } else {\n for (const survivor of parsed.survivors) {\n report += `### ${survivor.id}\n**File:** \\`${survivor.file}${survivor.line ? `:${survivor.line}` : \"\"}\\`\n**Mutation:** ${survivor.mutation}\n\n---\n\n`;\n }\n }\n\n return report;\n}\n\n// Export for testing\nexport const _testExports = {\n executeMutation,\n detectFramework,\n parseMutationOutput,\n generateReport,\n};\n","import type { PluginInput } from \"@opencode-ai/plugin\";\nimport type {\n ApplyDecisionsResult,\n DiscussionRound,\n PartyDiscussionState,\n ReviewDecision,\n SdlcConfig,\n} from \"../../shared/types.js\";\nimport { fetchIssue, updateIssueBody } from \"./github-issues.js\";\n\nconst DECISIONS_HEADER = \"## Party Review Decisions\";\nconst FINDING_ID_PREFIX = \"Finding ID:\";\nconst DECISION_PREFIX = \"Decision:\";\n\nfunction getDecisionIcon(decision: ReviewDecision): string {\n switch (decision) {\n case \"accept\":\n return \"✅\";\n case \"defer\":\n return \"⏸️\";\n case \"reject\":\n return \"❌\";\n default:\n return \"⚪\";\n }\n}\n\nfunction formatDecisionRound(round: DiscussionRound): string {\n const lines = [\n `### ${getDecisionIcon(round.decision ?? \"pending\")} ${round.findingTitle}`,\n `- ${FINDING_ID_PREFIX} ${round.findingId}`,\n `- ${DECISION_PREFIX} ${round.decision ?? \"pending\"}`,\n `- Severity: ${round.findingSeverity}`,\n `- Category: ${round.findingCategory}`,\n ];\n\n if (round.decisionReason) {\n lines.push(`- Reason: ${round.decisionReason}`);\n }\n\n if (round.deferredTo) {\n lines.push(`- Deferred to: ${round.deferredTo}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction buildDecisionSection(state: PartyDiscussionState): string {\n const date = new Date().toISOString().split(\"T\")[0];\n const decisions = state.completedRounds.map(formatDecisionRound).join(\"\\n\\n\");\n\n return `${DECISIONS_HEADER}\\n\\n**Date**: ${date}\\n**Session ID**: ${state.sessionId}\\n\\n${decisions}`;\n}\n\nfunction mergeDecisionSection(body: string, section: string): string {\n const existingIndex = body.indexOf(DECISIONS_HEADER);\n if (existingIndex === -1) {\n return `${body.trim()}\\n\\n---\\n\\n${section}`.trim();\n }\n\n return `${body.slice(0, existingIndex).trim()}\\n\\n${section}`.trim();\n}\n\nfunction resolveIssueNumbers(state: PartyDiscussionState): number[] {\n const raw = state.identifier\n .split(\",\")\n .map((token) => token.trim())\n .filter(Boolean);\n\n const numbers = raw\n .map((token) => token.replace(/^#/, \"\"))\n .map((token) => Number.parseInt(token, 10))\n .filter((value) => Number.isFinite(value) && value > 0);\n\n return Array.from(new Set(numbers));\n}\n\nexport async function applyIssueDecisions(\n ctx: PluginInput,\n config: SdlcConfig,\n state: PartyDiscussionState\n): Promise<ApplyDecisionsResult> {\n const issueNumbers = resolveIssueNumbers(state);\n const updated: Array<{ issueNumber: number; appliedDecisions: number }> = [];\n\n if (issueNumbers.length === 0) {\n return {\n success: false,\n reviewDocumentUpdated: false,\n summary: {\n accepted: 0,\n deferred: 0,\n rejected: 0,\n issuesModified: 0,\n },\n error: \"No issue numbers available to update\",\n };\n }\n\n const decisionSection = buildDecisionSection(state);\n\n for (const issueNumber of issueNumbers) {\n const issue = await fetchIssue(ctx, config, issueNumber);\n if (!issue) continue;\n\n const updatedBody = mergeDecisionSection(issue.body || \"\", decisionSection);\n const success = await updateIssueBody(ctx, config, issueNumber, updatedBody);\n\n if (success) {\n updated.push({ issueNumber, appliedDecisions: state.completedRounds.length });\n }\n }\n\n const accepted = state.completedRounds.filter((round) => round.decision === \"accept\").length;\n const deferred = state.completedRounds.filter((round) => round.decision === \"defer\").length;\n const rejected = state.completedRounds.filter((round) => round.decision === \"reject\").length;\n\n return {\n success: updated.length > 0,\n reviewDocumentUpdated: false,\n issuesUpdated: updated,\n summary: {\n accepted,\n deferred,\n rejected,\n issuesModified: updated.length,\n },\n warnings: updated.length === 0 ? [\"No issues updated\"] : undefined,\n };\n}\n","import type { FindingCategory, FindingSeverity } from \"../../shared/types.js\";\nimport type { FindingCounts } from \"./agent-selector.js\";\n\nexport interface FindingDetail {\n id: string;\n category: FindingCategory;\n severity: FindingSeverity;\n title: string;\n description: string;\n impact: string;\n suggestion: string;\n}\n\nexport interface OracleResponseSummary {\n totalIssues: number;\n highSeverity: number;\n mediumSeverity: number;\n lowSeverity: number;\n recommendation: string;\n}\n\nexport interface OracleResponseFindings {\n security: FindingDetail[];\n logic: FindingDetail[];\n bestPractices: FindingDetail[];\n performance: FindingDetail[];\n}\n\nexport interface IssueFinding {\n issueId: string;\n title: string;\n findings: Partial<OracleResponseFindings>;\n}\n\nexport interface CrossIssueIssue {\n id: string;\n category: FindingCategory;\n severity: FindingSeverity;\n title: string;\n description: string;\n affectedIssues: string[];\n suggestion: string;\n}\n\nexport interface ParsedOracleResponse {\n summary: OracleResponseSummary;\n findings?: OracleResponseFindings;\n issueFindings?: IssueFinding[];\n crossIssueIssues?: CrossIssueIssue[];\n}\n\nexport function parseOracleResponse(response: string | null | undefined): ParsedOracleResponse {\n if (!response || typeof response !== \"string\") {\n return createEmptyResponse(\"No response provided\");\n }\n\n try {\n const jsonMatch = response.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) {\n return createEmptyResponse(\"No JSON found in Oracle response\");\n }\n\n const parsed = JSON.parse(jsonMatch[0]) as ParsedOracleResponse;\n\n if (!parsed.summary) {\n return createEmptyResponse(\"No summary in Oracle response\");\n }\n\n return parsed;\n } catch {\n return createEmptyResponse(\"Failed to parse Oracle response as JSON\");\n }\n}\n\nfunction createEmptyResponse(reason: string): ParsedOracleResponse {\n return {\n summary: {\n totalIssues: 0,\n highSeverity: 0,\n mediumSeverity: 0,\n lowSeverity: 0,\n recommendation: reason,\n },\n findings: {\n security: [],\n logic: [],\n bestPractices: [],\n performance: [],\n },\n };\n}\n\nexport function countFindings(parsed: ParsedOracleResponse): FindingCounts {\n const counts: FindingCounts = {\n total: parsed.summary.totalIssues,\n high: parsed.summary.highSeverity,\n medium: parsed.summary.mediumSeverity,\n low: parsed.summary.lowSeverity,\n byCategory: {\n security: 0,\n logic: 0,\n bestPractices: 0,\n performance: 0,\n },\n };\n\n if (parsed.findings) {\n counts.byCategory.security = parsed.findings.security?.length || 0;\n counts.byCategory.logic = parsed.findings.logic?.length || 0;\n counts.byCategory.bestPractices = parsed.findings.bestPractices?.length || 0;\n counts.byCategory.performance = parsed.findings.performance?.length || 0;\n }\n\n if (parsed.issueFindings) {\n for (const issue of parsed.issueFindings) {\n counts.byCategory.security += issue.findings.security?.length || 0;\n counts.byCategory.logic += issue.findings.logic?.length || 0;\n counts.byCategory.bestPractices += issue.findings.bestPractices?.length || 0;\n counts.byCategory.performance += issue.findings.performance?.length || 0;\n }\n }\n\n return counts;\n}\n\nexport function extractAllFindings(parsed: ParsedOracleResponse): FindingDetail[] {\n const allFindings: FindingDetail[] = [];\n\n if (parsed.findings) {\n for (const category of [\"security\", \"logic\", \"bestPractices\", \"performance\"] as const) {\n const findings = parsed.findings[category] || [];\n for (const finding of findings) {\n allFindings.push({ ...finding, category });\n }\n }\n }\n\n if (parsed.issueFindings) {\n for (const issue of parsed.issueFindings) {\n for (const category of [\"security\", \"logic\", \"bestPractices\", \"performance\"] as const) {\n const findings = issue.findings[category] || [];\n for (const finding of findings) {\n allFindings.push({ ...finding, category });\n }\n }\n }\n }\n\n return allFindings;\n}\n\nexport function sortFindingsBySeverity(findings: FindingDetail[]): FindingDetail[] {\n const severityOrder: Record<FindingSeverity, number> = { high: 0, medium: 1, low: 2 };\n return [...findings].sort((a, b) => severityOrder[a.severity] - severityOrder[b.severity]);\n}\n","/**\n * Shared TypeScript type definitions for OpenCode SDLC Plugin\n */\n\n// ============================================================================\n// Mode Configuration Types (v1.0.0+)\n// ============================================================================\n\n/**\n * SDLC operation modes\n */\nexport type SdlcMode = \"discover\" | \"model\" | \"architect\" | \"pm\" | \"build\";\n\n/**\n * Mode configuration (v1.0.0+)\n */\nexport interface ModesConfig {\n /** Default mode on startup */\n default: SdlcMode;\n /** true=Model mode (Event Modeling), false=PRD mode */\n eventModeling: boolean;\n /** Array of enabled modes */\n enabled: SdlcMode[];\n}\n\n// ============================================================================\n// Memory Configuration Types (v1.0.0+)\n// ============================================================================\n\n/**\n * Memory backend types\n */\nexport type MemoryBackend = \"memento\" | \"stateless\";\n\n/**\n * Memory configuration (v1.0.0+)\n */\nexport interface MemoryConfig {\n /** Memory backend type */\n backend: MemoryBackend;\n /** How long to keep checkpoints in seconds */\n checkpointTtl: number;\n}\n\n// ============================================================================\n// Subagent Model Configuration Types (v1.0.0+)\n// ============================================================================\n\n/**\n * Subagent model value - either a model string or \"inherit\" to use marvin model\n */\nexport type SubagentModel = string | \"inherit\";\n\n/**\n * All subagent types that can have model overrides\n */\nexport type SubagentType =\n // TDD agents\n | \"red\"\n | \"green\"\n | \"domain\"\n | \"refactor\"\n // Event modeling agents\n | \"discovery\"\n | \"workflow\"\n | \"gwt\"\n | \"model-checker\"\n // Architecture agents\n | \"architect\"\n | \"adr\"\n | \"design-facilitator\"\n // Planning agents\n | \"story\"\n | \"pm\"\n | \"analyst\"\n // Review agents (read-only)\n | \"reviewer\"\n | \"ux\"\n | \"mutation\";\n\n/**\n * Subagent model assignments (v1.0.0+)\n * All fields are optional - unspecified subagents inherit from marvin\n */\nexport interface SubagentModelsConfig {\n // TDD agents\n /** Model for TDD red phase agent */\n red?: SubagentModel;\n /** Model for TDD green phase agent */\n green?: SubagentModel;\n /** Model for domain modeling agent */\n domain?: SubagentModel;\n /** Model for refactoring agent */\n refactor?: SubagentModel;\n\n // Event modeling agents\n /** Model for discovery/domain exploration agent */\n discovery?: SubagentModel;\n /** Model for workflow design agent */\n workflow?: SubagentModel;\n /** Model for GWT specification agent */\n gwt?: SubagentModel;\n /** Model for event model validation agent */\n \"model-checker\"?: SubagentModel;\n\n // Architecture agents\n /** Model for architect agent */\n architect?: SubagentModel;\n /** Model for ADR creation agent */\n adr?: SubagentModel;\n /** Model for design facilitation agent */\n \"design-facilitator\"?: SubagentModel;\n\n // Planning agents\n /** Model for story/issue planning agent */\n story?: SubagentModel;\n /** Model for PM agent */\n pm?: SubagentModel;\n /** Model for business analyst agent */\n analyst?: SubagentModel;\n\n // Review agents (read-only operations)\n /** Model for code reviewer agent */\n reviewer?: SubagentModel;\n /** Model for UX review agent */\n ux?: SubagentModel;\n /** Model for mutation testing agent */\n mutation?: SubagentModel;\n}\n\n// ============================================================================\n// CLI Types\n// ============================================================================\n\n/**\n * Options passed to the install command\n */\nexport interface InstallOptions {\n yes: boolean;\n advanced: boolean;\n global: boolean;\n local: boolean;\n reconfigure?: boolean;\n listProfiles?: boolean;\n}\n\n/**\n * Options passed to the upgrade command\n */\nexport interface UpgradeOptions {\n check: boolean;\n yes: boolean;\n}\n\n/**\n * Options passed to the doctor command\n */\nexport interface DoctorOptions {\n fix: boolean;\n}\n\n/**\n * Options passed to the uninstall command\n */\nexport interface UninstallOptions {\n keepConfig: boolean;\n keepDeps: boolean;\n}\n\n/**\n * Authentication method for a provider\n */\nexport type ProviderAuthMethod = \"subscription\" | \"api\" | \"none\";\n\n/**\n * Subscription information gathered during install\n */\nexport interface SubscriptionAnswers {\n hasClaude: boolean;\n claudeAuth: ProviderAuthMethod;\n claudeTier: \"max5x\" | \"max20x\" | \"pro\" | \"none\";\n hasOpenAI: boolean;\n openaiAuth: ProviderAuthMethod;\n hasGoogle: boolean;\n googleAuth: \"antigravity\" | \"personal\" | \"api\" | \"none\";\n hasGitHubCopilot: boolean;\n copilotPlan: \"free\" | \"pro\" | \"pro-plus\" | \"business\" | \"enterprise\" | \"none\";\n copilotEnabledModels?: string[];\n}\n\n/**\n * Methodology preferences gathered during install\n */\nexport interface MethodologyAnswers {\n defaultTrack: \"quick-flow\" | \"enterprise\";\n autoStatusUpdate: boolean;\n}\n\n/**\n * Feature selections gathered during install\n */\nexport interface FeatureAnswers {\n enabledFeatures: string[];\n mcps: string[];\n}\n\n/**\n * Advanced options gathered during install\n */\nexport interface AdvancedAnswers {\n parallelIssueLimit?: number;\n experimental?: string[];\n autoFallback?: boolean;\n}\n\n/**\n * Available model choices by provider\n */\nexport type LLMProvider = \"anthropic\" | \"openai\" | \"google\" | \"github-copilot\";\n\n/**\n * Model definition\n */\nexport interface ModelChoice {\n id: string;\n name: string;\n provider: LLMProvider;\n description?: string;\n}\n\n/**\n * Custom model definition for user-added models\n */\nexport interface CustomModelDefinition {\n id: string;\n name: string;\n provider: LLMProvider;\n description?: string;\n capabilities?: {\n thinking?: boolean;\n contextWindow?: number;\n supportsTemperature?: boolean;\n };\n}\n\n/**\n * Agent roles that require model assignment\n */\nexport type AgentRole =\n | \"marvin\"\n | \"oracle\"\n | \"librarian\"\n | \"frontend\"\n | \"documentWriter\"\n | \"multimodalLooker\"\n | \"explore\";\n\n/**\n * Thinking level for reasoning-capable models\n */\nexport type ThinkingLevel = \"off\" | \"low\" | \"medium\" | \"high\";\n\n/**\n * Agent-specific settings for temperature and thinking level\n */\nexport interface AgentSettings {\n temperature?: number; // 0.0 - 1.0\n thinkingLevel?: ThinkingLevel;\n}\n\n/**\n * Model assignments for each agent role\n */\nexport interface ModelAnswers {\n marvin: string;\n oracle: string;\n librarian: string;\n frontend?: string;\n documentWriter?: string;\n multimodalLooker?: string;\n explore?: string;\n settings?: {\n marvin?: AgentSettings;\n oracle?: AgentSettings;\n librarian?: AgentSettings;\n frontend?: AgentSettings;\n documentWriter?: AgentSettings;\n multimodalLooker?: AgentSettings;\n explore?: AgentSettings;\n overrides?: Record<string, AgentSettings>;\n };\n custom?: CustomModelDefinition[];\n}\n\n/**\n * GitHub integration answers from the installer\n */\nexport interface GitHubAnswers {\n enabled: boolean;\n owner: string;\n repo: string;\n project?: number;\n statuses: GitHubStatus[];\n}\n\n/**\n * TDD configuration answers from the installer\n */\nexport interface TddAnswers {\n enabled: boolean;\n verbosity: TddVerbosity;\n bypassPatterns: string[];\n mutationTesting: {\n enabled: boolean;\n requiredScore: number;\n };\n // v1.0.0 fields\n domainVetoEnabled?: boolean;\n debateRounds?: number;\n requireVerification?: boolean;\n}\n\n/**\n * Event Modeling answers from the installer\n */\nexport interface EventModelingAnswers {\n enabled: boolean;\n outputPath: string;\n}\n\n/**\n * Git Workflow answers from the installer\n */\nexport interface GitWorkflowAnswers {\n workflow: GitWorkflow;\n requireClean: boolean;\n worktrees: boolean;\n}\n\n/**\n * Modes configuration answers from the installer (v1.0.0+)\n */\nexport interface ModesAnswers {\n default: SdlcMode;\n eventModeling: boolean;\n enabled: SdlcMode[];\n}\n\n/**\n * Memory configuration answers from the installer (v1.0.0+)\n */\nexport interface MemoryAnswers {\n backend: MemoryBackend;\n checkpointTtl: number;\n}\n\n/**\n * All answers from the install wizard\n */\nexport interface InstallAnswers {\n subscriptions: SubscriptionAnswers;\n models: ModelAnswers;\n methodology: MethodologyAnswers;\n features: FeatureAnswers;\n advanced: AdvancedAnswers;\n installLocation: \"global\" | \"local\";\n // New v0.3.0+ answers\n github?: GitHubAnswers;\n tdd?: TddAnswers;\n eventModeling?: EventModelingAnswers;\n gitWorkflow?: GitWorkflowAnswers;\n // New v1.0.0+ answers\n modes?: ModesAnswers;\n memory?: MemoryAnswers;\n}\n\n/**\n * A file to be generated/written by the installer\n */\nexport interface GeneratedFile {\n path: string;\n content: string;\n exists: boolean;\n}\n\n// ============================================================================\n// Configuration Types\n// ============================================================================\n\nexport interface AgentRouting {\n requiresThinking?: boolean;\n preferProvider?: LLMProvider;\n}\n\nexport interface RoutingConfig {\n providerPriority: LLMProvider[];\n modelFamilyPriority: {\n claude?: LLMProvider[];\n gpt?: LLMProvider[];\n gemini?: LLMProvider[];\n };\n agentOverrides: {\n marvin?: AgentRouting;\n oracle?: AgentRouting;\n librarian?: AgentRouting;\n frontend?: AgentRouting;\n documentWriter?: AgentRouting;\n multimodalLooker?: AgentRouting;\n };\n fallbackBehavior: {\n autoFallback: boolean;\n retryPeriodMs: number;\n notifyOnRateLimit: boolean;\n };\n /** Model for sdlc_classify_request tool (v1.0.0+) */\n classifierModel?: string;\n}\n\n// ============================================================================\n// GitHub Issues Configuration\n// ============================================================================\n\n/**\n * GitHub project board column statuses\n */\nexport type GitHubStatus = \"Backlog\" | \"Ready\" | \"In progress\" | \"In review\" | \"Done\";\n\n/**\n * GitHub Issues integration configuration\n */\nexport interface GitHubConfig {\n /** GitHub repository owner (user or org) */\n owner: string;\n /** GitHub repository name */\n repo: string;\n /** GitHub Project number for board tracking (optional) */\n project?: number;\n /** Project board column names mapping to workflow states */\n statuses: GitHubStatus[];\n}\n\n// ============================================================================\n// TDD Configuration\n// ============================================================================\n\n/**\n * TDD verbosity levels\n */\nexport type TddVerbosity = \"silent\" | \"brief\" | \"explain\";\n\n/**\n * Mutation testing configuration\n */\nexport interface MutationTestingConfig {\n /** Enable mutation testing for coverage verification */\n enabled: boolean;\n /** Minimum mutation score required (0-100) */\n requiredScore: number;\n}\n\n/**\n * TDD cycle enforcement configuration\n */\nexport interface TddConfig {\n /** Enable TDD cycle enforcement */\n enabled: boolean;\n /** How verbose TDD feedback should be */\n verbosity: TddVerbosity;\n /** File patterns that bypass TDD checks (e.g., config files) */\n bypassPatterns: string[];\n /** Mutation testing settings */\n mutationTesting: MutationTestingConfig;\n // New v1.0.0 fields\n /** Enable domain agent veto power over type changes */\n domainVetoEnabled?: boolean;\n /** Max debate rounds before escalation to user */\n debateRounds?: number;\n /** Require test output evidence before phase transitions */\n requireVerification?: boolean;\n}\n\n// ============================================================================\n// Event Modeling Configuration\n// ============================================================================\n\n/**\n * Event Modeling integration configuration\n */\nexport interface EventModelingConfig {\n /** Enable Event Modeling workflow */\n enabled: boolean;\n /** Path to event model output files */\n outputPath: string;\n}\n\n// ============================================================================\n// Git Workflow Configuration\n// ============================================================================\n\n/**\n * Git workflow types\n */\nexport type GitWorkflow = \"standard\" | \"git-spice\";\n\n/**\n * Git integration configuration\n */\nexport interface GitConfig {\n /** Git workflow style */\n workflow: GitWorkflow;\n /** Require clean working directory before operations */\n requireClean: boolean;\n /** Enable git worktrees for parallel work */\n worktrees: boolean;\n}\n\n// ============================================================================\n// Feature Flags\n// ============================================================================\n\n/**\n * SDLC feature flags\n */\nexport interface SdlcFeatures {\n /** Main conversation delegates all file writes to agents */\n orchestratorOnly: boolean;\n /** Auto-sync todos with GitHub issue checkboxes */\n todoSync: boolean;\n /** Enable party review for architecture decisions */\n partyReview: boolean;\n /** Enable debugging protocol with Oracle */\n debuggingProtocol: boolean;\n /** Enable Memento MCP for persistent memory */\n memento: boolean;\n /** Show in-TUI notifications */\n notifications: boolean;\n /** Enable LSP tools for code intelligence */\n lspTools: boolean;\n}\n\n// ============================================================================\n// MCP Configuration\n// ============================================================================\n\n/**\n * MCP (Model Context Protocol) server configuration\n */\nexport interface McpConfig {\n /** Context7 for library documentation */\n context7: boolean;\n /** Exa for web search */\n exa: boolean;\n /** grep.app for code search */\n grepApp: boolean;\n /** Memento for persistent memory */\n memento: boolean;\n}\n\n// ============================================================================\n// Main SDLC Configuration\n// ============================================================================\n\n/**\n * SDLC configuration file structure (v1.0.0+)\n *\n * This config supports a transitional state where:\n * - Old BMAD fields are optional (deprecated, for backward compatibility)\n * - New GitHub/TDD/EventModeling/modes/memory fields are optional during migration\n *\n * New installations should use the new fields; existing installations\n * can continue using BMAD until migrated.\n */\nexport interface SdlcConfig {\n $schema?: string;\n version: string;\n subscriptions: {\n claude: {\n enabled: boolean;\n authMethod: ProviderAuthMethod;\n tier: \"max5x\" | \"max20x\" | \"pro\" | \"none\";\n };\n openai: {\n enabled: boolean;\n authMethod: ProviderAuthMethod;\n };\n google: {\n enabled: boolean;\n authMethod: \"antigravity\" | \"personal\" | \"api\" | \"none\";\n };\n githubCopilot: {\n enabled: boolean;\n plan: \"free\" | \"pro\" | \"pro-plus\" | \"business\" | \"enterprise\" | \"none\";\n enabledModels?: string[];\n };\n };\n models: {\n marvin: string;\n oracle: string;\n librarian: string;\n frontend?: string;\n documentWriter?: string;\n multimodalLooker?: string;\n /** Per-subagent model overrides (v1.0.0+) */\n subagents?: SubagentModelsConfig;\n settings?: {\n marvin?: AgentSettings;\n oracle?: AgentSettings;\n librarian?: AgentSettings;\n frontend?: AgentSettings;\n documentWriter?: AgentSettings;\n multimodalLooker?: AgentSettings;\n explore?: AgentSettings;\n overrides?: Record<string, AgentSettings>;\n };\n custom?: CustomModelDefinition[];\n };\n\n // ============================================================================\n // New v1.0.0+ Configuration\n // ============================================================================\n\n /** Mode configuration (new in v1.0.0) */\n modes?: ModesConfig;\n /** Memory configuration (new in v1.0.0) */\n memory?: MemoryConfig;\n\n // ============================================================================\n // New v0.3.0+ Configuration (optional during migration)\n // ============================================================================\n\n /** GitHub Issues integration (new in v0.3.0) */\n github?: GitHubConfig;\n /** TDD cycle enforcement (new in v0.3.0) */\n tdd?: TddConfig;\n /** Event Modeling integration (new in v0.3.0) */\n eventModeling?: EventModelingConfig;\n /** Git workflow configuration (new in v0.3.0) */\n git?: GitConfig;\n\n // ============================================================================\n // Legacy BMAD Configuration (deprecated, for backward compatibility)\n // ============================================================================\n\n /**\n * @deprecated Use `github` instead. Will be removed in v0.4.0.\n */\n bmad?: LegacyBmadConfig;\n\n // ============================================================================\n // Features and MCPs (unified structure supporting both old and new)\n // ============================================================================\n\n /** Feature flags */\n features: SdlcFeatures | LegacyFeatures;\n /** MCP server configuration */\n mcps: McpConfig | LegacyMcpConfig;\n /** Provider routing configuration */\n routing: RoutingConfig;\n}\n\n// ============================================================================\n// Legacy BMAD Configuration (Deprecated - for migration only)\n// ============================================================================\n\n/**\n * @deprecated Use GitHubConfig instead. BMAD configuration is no longer supported in v0.3.0+.\n */\nexport interface LegacyBmadConfig {\n defaultTrack: \"quick-flow\" | \"enterprise\";\n autoStatusUpdate: boolean;\n parallelIssueLimit: number;\n paths?: {\n prd?: string | null;\n architecture?: string | null;\n };\n}\n\n/**\n * @deprecated Use SdlcFeatures instead. Legacy feature flags from pre-0.3.0.\n */\nexport interface LegacyFeatures {\n bmadBridge: boolean;\n autoStatus: boolean;\n parallelExecution: boolean;\n notifications: boolean;\n contextMonitor: boolean;\n commentChecker: boolean;\n lspTools: boolean;\n autoGitOperations: boolean;\n todoSync: boolean;\n}\n\n/**\n * @deprecated Use McpConfig instead. Legacy MCP config from pre-0.3.0.\n */\nexport interface LegacyMcpConfig {\n context7: boolean;\n exa: boolean;\n grepApp: boolean;\n}\n\n/**\n * Prerequisites check result\n */\nexport interface Prerequisites {\n opencode: {\n installed: boolean;\n version?: string;\n compatible: boolean;\n };\n sdlc: {\n installed: boolean;\n version?: string;\n };\n node: {\n installed: boolean;\n version?: string;\n compatible: boolean;\n };\n}\n\n// ============================================================================\n// Plugin Types\n// ============================================================================\n\n// ============================================================================\n// Legacy BMAD Types (deprecated)\n// ============================================================================\n\n/**\n * @deprecated Use issue-based tracking instead of BMAD story statuses.\n */\nexport type BmadStoryStatus =\n | \"backlog\"\n | \"ready-for-dev\"\n | \"in-progress\"\n | \"review\"\n | \"done\"\n | \"blocked\";\n\n/**\n * @deprecated Use issue-based tracking instead of BMAD epic statuses.\n */\nexport type BmadEpicStatus = \"backlog\" | \"in-progress\" | \"done\";\n\n/**\n * @deprecated Use issue-based tracking instead of BMAD retrospective statuses.\n */\nexport type BmadRetroStatus = \"optional\" | \"done\";\n\n/**\n * @deprecated Use issue-based tracking instead of BMAD development status map.\n */\nexport type BmadDevelopmentStatus = BmadStoryStatus | BmadEpicStatus | BmadRetroStatus;\n\n/**\n * @deprecated Use issue-based tracking instead of BMAD sprint status files.\n */\nexport interface BmadSprintStatus {\n generated?: string;\n project?: string;\n project_key?: string;\n tracking_system?: string;\n story_location?: string;\n current_story?: string | null;\n last_modified?: string;\n development_status: Record<string, BmadDevelopmentStatus>;\n}\n\n/**\n * @deprecated Use issue-based tracking instead of BMAD story keys.\n */\nexport interface ParsedStoryKey {\n epicNum: string;\n storyNum: string;\n titleSlug?: string;\n fullKey: string;\n normalizedId: string;\n}\n\n/**\n * @deprecated Use issue-based tracking instead of BMAD epic keys.\n */\nexport interface ParsedEpicKey {\n epicNum: string;\n fullKey: string;\n}\n\n/**\n * @deprecated Use issue-based tracking instead of BMAD retrospective keys.\n */\nexport interface ParsedRetroKey {\n epicNum: string;\n fullKey: string;\n}\n\n/**\n * @deprecated Use issue-based tracking instead of BMAD key parsing.\n */\nexport type DevelopmentKeyType = \"story\" | \"epic\" | \"retrospective\" | \"unknown\";\n\n/**\n * @deprecated Use issue-based tracking instead of BMAD key parsing.\n */\nexport type ParsedDevelopmentKey =\n | { type: \"story\"; parsed: ParsedStoryKey }\n | { type: \"epic\"; parsed: ParsedEpicKey }\n | { type: \"retrospective\"; parsed: ParsedRetroKey }\n | { type: \"unknown\"; key: string };\n\n/**\n * Tracked GitHub issue state\n */\nexport interface TrackedIssue {\n issueNumber: number;\n title: string;\n status: string;\n startedAt: string;\n completedAt?: string;\n url?: string;\n body?: string | null;\n branch?: string;\n}\n\n/**\n * Issue tracker persistent state\n */\nexport interface IssueTrackerState {\n currentIssue: TrackedIssue | null;\n sessionId: string;\n projectDir: string;\n history: Array<{\n issueNumber: number;\n status: string;\n timestamp: string;\n }>;\n currentTodos?: OpenCodeTodo[];\n}\n\n// ============================================================================\n// Tool Result Types\n// ============================================================================\n\n/**\n * Result from sdlc_get_issue tool\n */\nexport interface GetIssueResult {\n issueNumber?: number;\n title?: string;\n body?: string;\n url?: string;\n status?: string;\n acceptanceCriteria?: Array<{ id: string; text: string; checked: boolean }>;\n instructions?: string;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Result from sdlc_update_issue_status tool\n */\nexport interface UpdateIssueStatusResult {\n success?: boolean;\n issueNumber?: number;\n newStatus?: string;\n updatedAt?: string;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Result from sdlc_list_issues tool\n */\nexport interface ListIssuesResult {\n success?: boolean;\n issues?: Array<{ number: number; title: string; status: string; url?: string }>;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Issue tracker persistent state\n */\nexport interface IssueTrackerState {\n currentIssue: TrackedIssue | null;\n sessionId: string;\n projectDir: string;\n history: Array<{\n issueNumber: number;\n status: string;\n timestamp: string;\n }>;\n currentTodos?: OpenCodeTodo[];\n}\n\n// ============================================================================\n// Tool Result Types\n// ============================================================================\n\n/**\n * Result from sdlc_get_issue tool\n */\nexport interface GetIssueResult {\n issueNumber?: number;\n title?: string;\n body?: string;\n url?: string;\n status?: string;\n acceptanceCriteria?: Array<{ id: string; text: string; checked: boolean }>;\n instructions?: string;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Result from sdlc_update_issue_status tool\n */\nexport interface UpdateIssueStatusResult {\n success?: boolean;\n issueNumber?: number;\n newStatus?: string;\n updatedAt?: string;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Result from sdlc_list_issues tool\n */\nexport interface ListIssuesResult {\n success?: boolean;\n issues?: Array<{ number: number; title: string; status: string; url?: string }>;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * @deprecated Result from sdlc_update_status tool (BMAD)\n */\n\n// ============================================================================\n// Party Review Types\n// ============================================================================\n\n/**\n * Scope of a party review\n */\nexport type ReviewScope = \"issue\" | \"multi-issue\";\n\n/**\n * Severity level of a review finding\n */\nexport type FindingSeverity = \"high\" | \"medium\" | \"low\";\n\n/**\n * Category of a review finding\n */\nexport type FindingCategory = \"security\" | \"logic\" | \"bestPractices\" | \"performance\";\n\n/**\n * User decision on a finding\n */\nexport type ReviewDecision = \"accept\" | \"defer\" | \"reject\" | \"pending\";\n\n/**\n * A single party review finding\n */\nexport interface PartyReviewFinding {\n id: string;\n category: FindingCategory;\n severity: FindingSeverity;\n title: string;\n description: string;\n impact: string;\n suggestion: string;\n issueId?: string;\n fileReference?: string;\n lineNumber?: number;\n decision?: ReviewDecision;\n decisionReason?: string;\n deferredTo?: string;\n}\n\n/**\n * Findings grouped by story\n */\nexport interface IssueFindings {\n issueId: string;\n title: string;\n findings: {\n security: PartyReviewFinding[];\n logic: PartyReviewFinding[];\n bestPractices: PartyReviewFinding[];\n performance: PartyReviewFinding[];\n };\n summary: {\n total: number;\n high: number;\n medium: number;\n low: number;\n };\n}\n\n/**\n * Cross-issue issues found in multi-issue reviews\n */\nexport interface CrossIssueIssue {\n id: string;\n category: FindingCategory;\n severity: FindingSeverity;\n title: string;\n description: string;\n affectedIssues: string[];\n suggestion: string;\n decision?: ReviewDecision;\n decisionReason?: string;\n}\n\n/**\n * Model complexity assessment result\n */\nexport interface IssueComplexity {\n isSimple: boolean;\n reason: string;\n recommendedModel: string;\n factors: {\n acceptanceCriteriaCount: number;\n hasSecurityConcerns: boolean;\n hasDataModelChanges: boolean;\n hasApiChanges: boolean;\n isCrudOnly: boolean;\n };\n}\n\n/**\n * Reference to another review document\n */\nexport interface ReviewDocumentReference {\n type: \"epic\" | \"focused\";\n filePath: string;\n date: string;\n findingsCount: number;\n acceptedCount: number;\n deferredCount: number;\n rejectedCount: number;\n}\n\n/**\n * Complete party review document structure\n */\nexport interface PartyReviewDocument {\n scope: ReviewScope;\n identifier: string;\n date: string;\n reviewer: string;\n relatedReviews?: ReviewDocumentReference[];\n summary: {\n totalIssues: number;\n highSeverity: number;\n mediumSeverity: number;\n lowSeverity: number;\n recommendation: string;\n };\n issueFindings?: IssueFindings[];\n crossIssueIssues?: CrossIssueIssue[];\n previousFindings?: {\n accepted: PartyReviewFinding[];\n deferred: PartyReviewFinding[];\n rejected: PartyReviewFinding[];\n };\n newFindings?: {\n security: PartyReviewFinding[];\n logic: PartyReviewFinding[];\n bestPractices: PartyReviewFinding[];\n performance: PartyReviewFinding[];\n };\n oracleAnalysis?: string;\n}\n\n/**\n * Complete result from applying all decisions\n */\nexport interface ApplyDecisionsResult {\n /** Overall success (true even if some individual updates failed) */\n success: boolean;\n /** Whether the review document was updated */\n reviewDocumentUpdated: boolean;\n /** Issue bodies that were updated */\n issuesUpdated?: Array<{ issueNumber: number; appliedDecisions: number }>;\n /** Summary counts */\n summary: {\n accepted: number;\n deferred: number;\n rejected: number;\n issuesModified?: number;\n };\n /** Warnings (e.g., vague defer targets) */\n warnings?: string[];\n /** Error if complete failure */\n error?: string;\n}\n\n// ============================================================================\n// Enhanced Party Review Types (3-Phase Architecture)\n// ============================================================================\n\n/**\n * BMAD agent types that can participate in party review\n */\nexport type BmadAgentType =\n | \"architect\"\n | \"dev\"\n | \"tea\"\n | \"pm\"\n | \"analyst\"\n | \"ux-designer\"\n | \"tech-writer\"\n | \"sm\";\n\n/**\n * BMAD agent persona details\n */\nexport interface BmadAgentPersona {\n type: BmadAgentType;\n name: string;\n title: string;\n expertise: string[];\n perspective: string;\n}\n\n/**\n * Mapping of BMAD agents with their personas\n */\nexport const BMAD_AGENTS: Record<BmadAgentType, BmadAgentPersona> = {\n architect: {\n type: \"architect\",\n name: \"Winston\",\n title: \"Software Architect\",\n expertise: [\"system design\", \"security architecture\", \"scalability\", \"technical debt\"],\n perspective: \"architecture and system design\",\n },\n dev: {\n type: \"dev\",\n name: \"Amelia\",\n title: \"Senior Developer\",\n expertise: [\"implementation\", \"code quality\", \"debugging\", \"performance optimization\"],\n perspective: \"implementation feasibility and code quality\",\n },\n tea: {\n type: \"tea\",\n name: \"Murat\",\n title: \"Test Engineer\",\n expertise: [\"testing strategy\", \"edge cases\", \"test automation\", \"quality assurance\"],\n perspective: \"testability and quality assurance\",\n },\n pm: {\n type: \"pm\",\n name: \"John\",\n title: \"Product Manager\",\n expertise: [\"requirements\", \"stakeholder needs\", \"prioritization\", \"business value\"],\n perspective: \"business impact and stakeholder value\",\n },\n analyst: {\n type: \"analyst\",\n name: \"Mary\",\n title: \"Business Analyst\",\n expertise: [\"requirements analysis\", \"user stories\", \"acceptance criteria\", \"edge cases\"],\n perspective: \"requirements completeness and clarity\",\n },\n \"ux-designer\": {\n type: \"ux-designer\",\n name: \"Sally\",\n title: \"UX Designer\",\n expertise: [\"user experience\", \"accessibility\", \"usability\", \"user flows\"],\n perspective: \"user experience and accessibility\",\n },\n \"tech-writer\": {\n type: \"tech-writer\",\n name: \"Paige\",\n title: \"Technical Writer\",\n expertise: [\"documentation\", \"API docs\", \"user guides\", \"clarity\"],\n perspective: \"documentation and clarity\",\n },\n sm: {\n type: \"sm\",\n name: \"Bob\",\n title: \"Scrum Master\",\n expertise: [\"process\", \"team dynamics\", \"sprint planning\", \"blockers\"],\n perspective: \"process and team coordination\",\n },\n};\n\n/**\n * Agent recommendation with reasoning\n */\nexport interface AgentRecommendation {\n agent: BmadAgentType;\n reason: string;\n relevantFindings: string[];\n priority: \"required\" | \"recommended\" | \"optional\";\n}\n\n/**\n * Cross-story pattern identified by an agent\n */\nexport interface CrossStoryPattern {\n id?: string;\n pattern: string;\n affectedStories: string[];\n severity?: FindingSeverity;\n recommendation: string;\n}\n\n/**\n * Single agent's analysis output (Phase 2)\n */\nexport interface AgentAnalysis {\n agent: BmadAgentType;\n agentName?: string;\n analyzedAt?: string;\n storiesAnalyzed?: string[];\n perspective: string;\n findings: {\n agreements: string[];\n concerns: string[];\n suggestions: string[];\n };\n crossStoryPatterns: CrossStoryPattern[];\n prioritizedIssues: Array<{\n findingId: string;\n agentPriority: \"critical\" | \"important\" | \"minor\";\n rationale: string;\n }>;\n summary: string;\n}\n\n/**\n * Phase 1 context: Prepared by tool for Oracle invocation (before Oracle runs)\n */\nexport type Phase1Context = Phase1ContextSuccess | Phase1ContextError;\n\nexport interface Phase1ContextSuccess {\n success: true;\n scope: ReviewScope;\n identifier: string;\n reviewsDir: string;\n storiesContent: Array<{ id: string; content: string | null }>;\n architectureContent: string;\n oraclePrompt: string;\n selectedModel: string;\n complexity?: IssueComplexity;\n existingReviews?: ReviewDocumentReference[];\n}\n\nexport interface Phase1ContextError {\n success: false;\n scope: ReviewScope;\n identifier: string;\n error: string;\n suggestion?: string;\n}\n\n/**\n * Phase 1 summary: Minimal result returned to agent after Oracle analysis.\n * Large data (oracleAnalysis, storiesContent) is saved to file, not passed between tools.\n */\nexport interface Phase1Summary {\n success: boolean;\n scope: ReviewScope;\n identifier: string;\n error?: string;\n suggestion?: string;\n reviewFolderPath?: string;\n findings?: {\n total: number;\n high: number;\n medium: number;\n low: number;\n byCategory: Record<FindingCategory, number>;\n };\n recommendedAgents?: AgentRecommendation[];\n summary?: string;\n}\n\n/**\n * Phase 1 full data: Complete data saved to analysis.json file.\n * Includes large fields that should not be passed between tool calls.\n */\nexport interface Phase1FullData extends Phase1Summary {\n storiesContent?: Array<{ id: string; title?: string; content: string | null }>;\n architectureContent?: string;\n oracleAnalysis?: string;\n}\n\n/**\n * @deprecated Use Phase1Summary for tool returns, Phase1FullData for file storage\n */\nexport type Phase1Result = Phase1FullData;\n\n/**\n * Phase 2 result: Aggregated agent analyses\n */\nexport interface ConsensusPoint {\n topic: string;\n agents: BmadAgentType[];\n position: string;\n}\n\nexport interface DebatePoint {\n topic: string;\n positions: Array<{\n agent: BmadAgentType;\n position: string;\n }>;\n}\n\nexport interface AggregatedPriority {\n findingId: string;\n votes: Partial<Record<BmadAgentType, \"critical\" | \"important\" | \"minor\">>;\n consensusLevel: \"strong\" | \"moderate\" | \"disputed\";\n averagePriority: \"critical\" | \"important\" | \"minor\";\n}\n\nexport interface Phase2Result {\n success: boolean;\n identifier: string;\n agentAnalyses: AgentAnalysis[];\n consensusPoints: ConsensusPoint[];\n debatePoints: DebatePoint[];\n aggregatedPriorities: AggregatedPriority[];\n error?: string;\n}\n\n/**\n * Discussion context for Phase 3 party mode\n */\nexport interface DiscussionContext {\n scope: ReviewScope;\n identifier: string;\n issueIds: string[];\n phase1Summary: {\n totalFindings: number;\n highSeverity: number;\n reviewDocumentPath: string;\n };\n agentAnalyses: AgentAnalysis[];\n agendaItems: Array<{\n id: string;\n topic: string;\n type: \"consensus\" | \"debate\" | \"decision-needed\";\n relatedFindings: string[];\n agentPositions?: Record<BmadAgentType, string>;\n }>;\n preloadedContext: string;\n}\n\n/**\n * Final review session result\n */\nexport interface ReviewSessionResult {\n success: boolean;\n identifier: string;\n decisions: Record<string, ReviewDecision>;\n decisionSummary: {\n accepted: number;\n deferred: number;\n rejected: number;\n discussed: number;\n };\n issueUpdates: Array<{\n issueId: string;\n addedCriteria: string[];\n modifiedCriteria: string[];\n }>;\n actionItems: Array<{\n description: string;\n assignedTo?: BmadAgentType;\n deferredToIssue?: string;\n }>;\n sessionNotes: string;\n}\n\n// ============================================================================\n// Phase 3: Party Discussion Types\n// ============================================================================\n\n/**\n * Extended BMAD agent persona with full details from manifest\n */\nexport interface BmadAgentFullPersona extends BmadAgentPersona {\n icon: string;\n identity: string;\n communicationStyle: string;\n principles: string[];\n module?: string;\n}\n\n/**\n * Default full personas (fallback when BMAD manifest not available)\n */\nexport const BMAD_AGENT_FULL_PERSONAS: Record<BmadAgentType, BmadAgentFullPersona> = {\n architect: {\n type: \"architect\",\n name: \"Winston\",\n title: \"Software Architect\",\n icon: \"🏗️\",\n expertise: [\"system design\", \"security architecture\", \"scalability\", \"technical debt\"],\n perspective: \"architecture and system design\",\n identity:\n \"Senior architect with expertise in distributed systems, cloud infrastructure, and API design. Specializes in scalable patterns and technology selection.\",\n communicationStyle:\n \"Speaks in calm, pragmatic tones, balancing 'what could be' with 'what should be.' Champions boring technology that actually works.\",\n principles: [\n \"User journeys drive technical decisions\",\n \"Embrace boring technology for stability\",\n \"Design simple solutions that scale when needed\",\n \"Developer productivity is architecture\",\n ],\n },\n dev: {\n type: \"dev\",\n name: \"Amelia\",\n title: \"Senior Developer\",\n icon: \"💻\",\n expertise: [\"implementation\", \"code quality\", \"debugging\", \"performance optimization\"],\n perspective: \"implementation feasibility and code quality\",\n identity:\n \"Elite developer who thrives on clean implementations. Lives for readable code, sensible abstractions, and solutions that actually work in production.\",\n communicationStyle:\n \"Ultra-succinct. Speaks in file paths and AC IDs - every statement citable. No fluff, all precision.\",\n principles: [\n \"Code should be readable by humans first\",\n \"Ship incrementally, validate continuously\",\n \"Tests are documentation\",\n \"Complexity is the enemy\",\n ],\n },\n tea: {\n type: \"tea\",\n name: \"Murat\",\n title: \"Test Engineer Advocate\",\n icon: \"🧪\",\n expertise: [\"testing strategy\", \"edge cases\", \"test automation\", \"quality assurance\"],\n perspective: \"testability and quality assurance\",\n identity:\n \"Master test architect who sees quality as everyone's responsibility. Blends data with gut instinct to find bugs before they find users.\",\n communicationStyle:\n \"Blends data with gut instinct. 'Strong opinions, weakly held' is their mantra. Speaks in risk calculations and impact assessments.\",\n principles: [\n \"Test the behavior, not the implementation\",\n \"Edge cases reveal system character\",\n \"Automation enables confidence\",\n \"Quality is prevention, not detection\",\n ],\n },\n pm: {\n type: \"pm\",\n name: \"John\",\n title: \"Product Manager\",\n icon: \"📋\",\n expertise: [\"requirements\", \"stakeholder needs\", \"prioritization\", \"business value\"],\n perspective: \"business impact and stakeholder value\",\n identity:\n \"Investigative product strategist who asks 'WHY?' relentlessly. Connects every feature to user value and business outcomes.\",\n communicationStyle:\n \"Asks 'WHY?' relentlessly like a detective on a case. Direct and data-sharp, cuts through fluff to what actually matters.\",\n principles: [\n \"User problems drive solutions\",\n \"Data informs, intuition guides\",\n \"MVP means minimum VIABLE\",\n \"Say no to protect yes\",\n ],\n },\n analyst: {\n type: \"analyst\",\n name: \"Mary\",\n title: \"Business Analyst\",\n icon: \"📊\",\n expertise: [\"requirements analysis\", \"user stories\", \"acceptance criteria\", \"edge cases\"],\n perspective: \"requirements completeness and clarity\",\n identity:\n \"Strategic analyst who treats requirements like treasure hunts. Excited by patterns, thrilled when ambiguity becomes clarity.\",\n communicationStyle:\n \"Treats analysis like a treasure hunt - excited by every clue, thrilled when patterns emerge. Asks questions that spark 'aha!' moments.\",\n principles: [\n \"Ambiguity is the enemy of delivery\",\n \"Edge cases reveal true requirements\",\n \"Stakeholders often know what they need, not what they want\",\n \"Document decisions, not just outcomes\",\n ],\n },\n \"ux-designer\": {\n type: \"ux-designer\",\n name: \"Sally\",\n title: \"UX Designer\",\n icon: \"🎨\",\n expertise: [\"user experience\", \"accessibility\", \"usability\", \"user flows\"],\n perspective: \"user experience and accessibility\",\n identity:\n \"User advocate who designs experiences, not just interfaces. Champions accessibility and believes good UX is invisible.\",\n communicationStyle:\n \"Empathetic and user-focused. Uses stories and scenarios to illustrate points. Gentle but firm on accessibility.\",\n principles: [\n \"Design for the edges, the middle takes care of itself\",\n \"Accessibility is not optional\",\n \"Users don't read, they scan\",\n \"Friction is the enemy of conversion\",\n ],\n },\n \"tech-writer\": {\n type: \"tech-writer\",\n name: \"Paige\",\n title: \"Technical Writer\",\n icon: \"📚\",\n expertise: [\"documentation\", \"API docs\", \"user guides\", \"clarity\"],\n perspective: \"documentation and clarity\",\n identity:\n \"Knowledge curator who makes complex simple. Believes documentation is a product feature, not an afterthought.\",\n communicationStyle:\n \"Patient educator who explains like teaching a friend. Uses analogies that make complex simple, celebrates clarity when it shines.\",\n principles: [\n \"If it's not documented, it doesn't exist\",\n \"Good docs prevent support tickets\",\n \"Examples are worth a thousand words\",\n \"Write for the reader, not the writer\",\n ],\n },\n sm: {\n type: \"sm\",\n name: \"Bob\",\n title: \"Scrum Master\",\n icon: \"🎯\",\n expertise: [\"process\", \"team dynamics\", \"sprint planning\", \"blockers\"],\n perspective: \"process and team coordination\",\n identity:\n \"Servant leader who removes blockers and protects team focus. Facilitates rather than dictates.\",\n communicationStyle:\n \"Facilitative and inclusive. Asks powerful questions rather than giving answers. Celebrates team wins.\",\n principles: [\n \"The team knows best\",\n \"Process serves people, not vice versa\",\n \"Blockers are opportunities for improvement\",\n \"Sustainable pace enables sustainable delivery\",\n ],\n },\n};\n\n/**\n * Input for the party discussion tool\n */\nexport interface PartyDiscussionInput {\n /** Phase 1 results with Oracle findings */\n phase1Result: Phase1Result;\n /** Phase 2 agent analyses */\n phase2Result: Phase2Result;\n /** Stories content for context */\n storiesContent: Array<{ id: string; content: string }>;\n /** Optional: specific findings to discuss (defaults to all high severity + disputed) */\n findingsToDiscuss?: string[];\n}\n\n/**\n * A single agent's response in a discussion round\n */\nexport interface AgentDiscussionResponse {\n agent: BmadAgentType;\n agentName: string;\n icon: string;\n response: string;\n /** References to other agents in cross-talk */\n references?: Array<{\n agent: BmadAgentType;\n type: \"agrees\" | \"disagrees\" | \"builds-on\" | \"questions\";\n }>;\n /** Key points extracted from response */\n keyPoints: string[];\n}\n\n/**\n * A complete discussion round for a single finding\n */\nexport interface DiscussionRound {\n findingId: string;\n findingTitle: string;\n findingSeverity: FindingSeverity;\n findingCategory: FindingCategory;\n /** Agents who participated in this round */\n participants: BmadAgentType[];\n /** Agent responses in order */\n responses: AgentDiscussionResponse[];\n /** User's decision for this finding */\n decision?: ReviewDecision;\n /** User's reasoning for the decision */\n decisionReason?: string;\n /** If deferred, where to */\n deferredTo?: string;\n}\n\n/**\n * Discussion agenda item\n */\nexport interface DiscussionAgendaItem {\n id: string;\n findingId: string;\n topic: string;\n type: \"high-severity\" | \"disputed\" | \"cross-story\" | \"consensus\";\n severity: FindingSeverity;\n category: FindingCategory;\n /** Agents relevant to this topic */\n relevantAgents: BmadAgentType[];\n /** Pre-existing agent positions from Phase 2 */\n agentPositions: Partial<Record<BmadAgentType, string>>;\n /** Whether this item has been discussed */\n discussed: boolean;\n /** The discussion round if discussed */\n round?: DiscussionRound;\n}\n\n/**\n * Current state of the party discussion\n */\nexport interface PartyDiscussionState {\n /** Unique session ID */\n sessionId: string;\n /** Review scope */\n scope: ReviewScope;\n /** Epic or story identifier */\n identifier: string;\n /** Current agenda items */\n agenda: DiscussionAgendaItem[];\n /** Index of current agenda item */\n currentItemIndex: number;\n /** Completed discussion rounds */\n completedRounds: DiscussionRound[];\n /** Participating agents for this session */\n activeAgents: BmadAgentType[];\n /** When the discussion started */\n startedAt: string;\n /** Phase data for context */\n phase1Summary: Phase1Result[\"findings\"];\n phase2Summary?: {\n consensusCount: number;\n disputeCount: number;\n };\n}\n\n/**\n * Result from the party discussion tool\n */\nexport interface PartyDiscussionResult {\n success: boolean;\n /** Session ID for continuation */\n sessionId: string;\n /** Current state of the discussion */\n state: PartyDiscussionState;\n /** Current agenda item to display */\n currentItem?: DiscussionAgendaItem;\n /** Agent responses for current item (if generating discussion) */\n currentResponses?: AgentDiscussionResponse[];\n /** Summary when discussion is complete */\n summary?: {\n totalDiscussed: number;\n decisions: {\n accepted: number;\n deferred: number;\n rejected: number;\n pending: number;\n };\n /** Issue updates implied by decisions */\n issueUpdatesNeeded: Array<{\n issueId: string;\n additions: string[];\n }>;\n };\n /** Result of automatically applying decisions to issues (on \"end\" action) */\n appliedUpdates?: ApplyDecisionsResult;\n /** Whether more items remain */\n hasMoreItems: boolean;\n /** Error if failed */\n error?: string;\n /** Suggestion for resolving error */\n suggestion?: string;\n}\n\n/**\n * Action to take in party discussion\n */\nexport type PartyDiscussionAction =\n | { type: \"start\"; input: PartyDiscussionInput }\n | { type: \"continue\"; sessionId: string }\n | {\n type: \"decide\";\n sessionId: string;\n findingId: string;\n decision: ReviewDecision;\n reason?: string;\n deferredTo?: string;\n }\n | { type: \"skip\"; sessionId: string; findingId: string }\n | { type: \"end\"; sessionId: string };\n\n// ============================================================================\n// Todo Sync Types\n// ============================================================================\n\n/**\n * OpenCode todo item format (matches oh-my-opencode/OpenCode schema)\n */\nexport interface OpenCodeTodo {\n /** Unique identifier for the todo item */\n id: string;\n /** Brief description of the task */\n content: string;\n /** Current status of the task */\n status: TodoStatus;\n /** Priority level of the task */\n priority: TodoPriority;\n}\n\n/**\n * Valid todo status values\n */\nexport type TodoStatus = \"pending\" | \"in_progress\" | \"completed\" | \"cancelled\";\n\n/**\n * Valid todo priority values\n */\nexport type TodoPriority = \"high\" | \"medium\" | \"low\";\n\n/**\n * Parsed todo ID components\n */\nexport interface ParsedTodoId {\n /** Issue number (e.g., 42) */\n issueNumber: number;\n /** Section token from todo ID */\n section: string;\n /** Line number hint (may have shifted) */\n lineHint: number;\n}\n\n/**\n * Match type for todo matching\n */\nexport type TodoMatchType = \"id\" | \"exact-content\" | \"similar-content\" | \"none\";\n\n/**\n * Confidence thresholds for todo matching\n */\nexport const TODO_MATCH_THRESHOLDS = {\n AUTO_UPDATE: 0.7,\n WARN_USER: 0.5,\n} as const;\n\n/**\n * Result of attempting to match a todo with a previous todo\n */\nexport interface TodoMatchResult {\n /** The matched todo, if any */\n matched: OpenCodeTodo | null;\n /** How the match was found */\n matchType: TodoMatchType;\n /** Confidence score (0-1) */\n confidence: number;\n}\n\n// ============================================================================\n// Story Complexity & Decomposition Types\n// ============================================================================\n\n/**\n * Effort level for a task (maps to Fibonacci-ish points)\n */\nexport type TaskEffortLevel = \"trivial\" | \"small\" | \"medium\" | \"large\" | \"xlarge\";\n\n/**\n * Points mapping for effort levels\n */\nexport const EFFORT_POINTS: Record<TaskEffortLevel, number> = {\n trivial: 1,\n small: 2,\n medium: 3,\n large: 5,\n xlarge: 8,\n};\n\n/**\n * A parsed subtask from a story file\n */\nexport interface ParsedSubtask {\n /** Subtask ID within task (e.g., \"1.1\", \"1.2\") */\n id: string;\n /** Subtask description */\n description: string;\n /** Whether the checkbox is checked */\n completed: boolean;\n /** Line number in file (1-based) */\n lineNumber: number;\n}\n\n/**\n * A parsed task from a story file\n */\nexport interface ParsedTask {\n /** Task ID (e.g., \"1\", \"2\", \"3\") */\n id: string;\n /** Task description */\n description: string;\n /** Subtasks belonging to this task */\n subtasks: ParsedSubtask[];\n /** Whether the main task checkbox is checked */\n completed: boolean;\n /** Line number in file (1-based) */\n lineNumber: number;\n}\n\n/**\n * Effort estimate for a single task\n */\nexport interface TaskEffortEstimate {\n /** Task ID */\n taskId: string;\n /** Task description */\n description: string;\n /** Estimated effort level */\n effort: TaskEffortLevel;\n /** Story points (1, 2, 3, 5, 8) */\n points: number;\n /** Signals that contributed to this estimate */\n signals: string[];\n}\n","import { readFile } from \"node:fs/promises\";\nimport { basename } from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport type { BmadAgentFullPersona, BmadAgentType } from \"../../shared/types.js\";\nimport { BMAD_AGENT_FULL_PERSONAS } from \"../../shared/types.js\";\nimport { createPluginLogger } from \"./plugin-logger.js\";\n\nconst log = createPluginLogger(\"persona-loader\");\n\ninterface BmadAgentYaml {\n agent: {\n metadata: {\n id: string;\n name: string;\n title: string;\n icon: string;\n module?: string;\n };\n persona: {\n role: string;\n identity: string;\n communication_style: string;\n principles: string;\n };\n };\n}\n\nfunction filenameToAgentType(filename: string): BmadAgentType | null {\n const base = basename(filename, \".agent.yaml\");\n\n const typeMap: Record<string, BmadAgentType> = {\n analyst: \"analyst\",\n architect: \"architect\",\n dev: \"dev\",\n pm: \"pm\",\n sm: \"sm\",\n tea: \"tea\",\n \"tech-writer\": \"tech-writer\",\n \"ux-designer\": \"ux-designer\",\n };\n\n return typeMap[base] || null;\n}\n\nfunction parsePrinciples(principlesText: string): string[] {\n const lines = principlesText\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter(Boolean);\n\n return lines\n .filter((line) => line.startsWith(\"-\"))\n .map((line) => line.substring(1).trim())\n .filter(Boolean);\n}\n\n/**\n * Parse a BMAD agent YAML file into a persona object.\n *\n * YAML-to-TypeScript field mappings:\n * - agent.persona.role → persona.perspective\n * - agent.persona.communication_style → persona.communicationStyle\n *\n * Falls back to built-in personas for missing or invalid fields.\n */\nasync function parseAgentYaml(\n filePath: string\n): Promise<{ type: BmadAgentType; persona: BmadAgentFullPersona } | null> {\n const agentType = filenameToAgentType(filePath);\n if (!agentType) {\n return null;\n }\n\n try {\n const content = await readFile(filePath, \"utf-8\");\n const data = parseYaml(content) as BmadAgentYaml;\n\n if (!data?.agent?.metadata || !data?.agent?.persona) {\n return null;\n }\n\n const { metadata, persona: personaData } = data.agent;\n const fallback = BMAD_AGENT_FULL_PERSONAS[agentType];\n\n const principles = personaData.principles\n ? parsePrinciples(personaData.principles)\n : fallback.principles;\n\n const persona: BmadAgentFullPersona = {\n type: agentType,\n name: metadata.name || fallback.name,\n title: metadata.title || fallback.title,\n icon: metadata.icon || fallback.icon,\n expertise: fallback.expertise,\n perspective: personaData.role || fallback.perspective,\n identity: personaData.identity || fallback.identity,\n communicationStyle: personaData.communication_style || fallback.communicationStyle,\n principles,\n };\n\n return { type: agentType, persona };\n } catch (error) {\n log.warn(\"Failed to parse agent YAML file\", {\n filePath,\n error: error instanceof Error ? error.message : \"Unknown error\",\n });\n return null;\n }\n}\n\nasync function loadFromYamlFiles(\n agentFiles: string[]\n): Promise<Map<BmadAgentType, BmadAgentFullPersona>> {\n const personas = new Map<BmadAgentType, BmadAgentFullPersona>();\n\n for (const filePath of agentFiles) {\n const result = await parseAgentYaml(filePath);\n if (result) {\n personas.set(result.type, result.persona);\n }\n }\n\n return personas;\n}\n\nexport async function loadPersonas(): Promise<Map<BmadAgentType, BmadAgentFullPersona>> {\n return new Map(\n Object.entries(BMAD_AGENT_FULL_PERSONAS) as [BmadAgentType, BmadAgentFullPersona][]\n );\n}\n\nexport function getPersona(\n personas: Map<BmadAgentType, BmadAgentFullPersona>,\n agentType: BmadAgentType\n): BmadAgentFullPersona {\n return personas.get(agentType) || BMAD_AGENT_FULL_PERSONAS[agentType];\n}\n\nexport function selectAgentsForFinding(category: string, severity: string): BmadAgentType[] {\n const agents: BmadAgentType[] = [];\n\n switch (category) {\n case \"security\":\n agents.push(\"architect\", \"dev\", \"tea\");\n break;\n case \"logic\":\n agents.push(\"dev\", \"tea\", \"analyst\");\n break;\n case \"performance\":\n agents.push(\"architect\", \"dev\");\n break;\n case \"bestPractices\":\n agents.push(\"dev\", \"tech-writer\");\n break;\n default:\n agents.push(\"dev\", \"architect\");\n }\n\n if (severity === \"high\" && !agents.includes(\"pm\")) {\n agents.push(\"pm\");\n }\n\n return agents.slice(0, 3);\n}\n\nexport function buildAgentSystemPrompt(\n persona: BmadAgentFullPersona,\n phase2Analysis?: string\n): string {\n const principlesList = persona.principles.map((p) => `- ${p}`).join(\"\\n\");\n\n let prompt = `You are ${persona.name}, the ${persona.title} from the BMAD team.\n\n**Your Icon**: ${persona.icon}\n**Your Expertise**: ${persona.expertise.join(\", \")}\n**Your Perspective**: ${persona.perspective}\n\n**Your Identity**:\n${persona.identity}\n\n**Your Communication Style**:\n${persona.communicationStyle}\n\n**Your Principles**:\n${principlesList}\n\n**Response Guidelines**:\n- Stay in character as ${persona.name}\n- Speak from your ${persona.perspective} perspective\n- Be concise but substantive (2-4 sentences per point)\n- Reference other agents by name when building on or disagreeing with their points\n- Use your icon ${persona.icon} at the start of your responses`;\n\n if (phase2Analysis) {\n prompt += `\n\n**Your Previous Analysis** (from Phase 2):\n${phase2Analysis}\n\nUse your previous analysis to inform this discussion. You already have context on these findings.`;\n }\n\n return prompt;\n}\n\nexport const _testExports = {\n filenameToAgentType,\n parsePrinciples,\n parseAgentYaml,\n loadFromYamlFiles,\n};\n","import { randomUUID } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type {\n AgentDiscussionResponse,\n BmadAgentFullPersona,\n BmadAgentType,\n DiscussionAgendaItem,\n DiscussionRound,\n FindingCategory,\n FindingSeverity,\n PartyDiscussionResult,\n PartyDiscussionState,\n Phase1FullData,\n Phase2Result,\n ReviewDecision,\n SdlcConfig,\n} from \"../../shared/types.js\";\nimport { applyIssueDecisions } from \"../utils/issue-review-updater.js\";\nimport { extractAllFindings, parseOracleResponse } from \"../utils/oracle-parser.js\";\nimport { getPersona, loadPersonas, selectAgentsForFinding } from \"../utils/persona-loader.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\n\nconst log = createPluginLogger(\"party-discussion\");\nconst SESSION_TTL_MS = 30 * 60 * 1000;\nconst MAX_SESSIONS = 10;\n\ninterface SessionWithMeta {\n state: PartyDiscussionState;\n lastAccessedAt: number;\n reviewFolderPath?: string;\n phase2?: Phase2Result;\n}\n\nconst activeSessions = new Map<string, SessionWithMeta>();\n\nfunction cleanupStaleSessions(): void {\n const now = Date.now();\n const sessionsToDelete: string[] = [];\n\n for (const [id, session] of activeSessions) {\n if (now - session.lastAccessedAt > SESSION_TTL_MS) {\n sessionsToDelete.push(id);\n }\n }\n\n for (const id of sessionsToDelete) {\n activeSessions.delete(id);\n }\n\n const capacityThreshold = Math.ceil(MAX_SESSIONS * 0.8);\n if (activeSessions.size >= capacityThreshold && activeSessions.size < MAX_SESSIONS) {\n log.warn(\"Party discussion session capacity warning\", {\n currentSessions: activeSessions.size,\n maxSessions: MAX_SESSIONS,\n utilizationPercent: Math.round((activeSessions.size / MAX_SESSIONS) * 100),\n message: \"Approaching session limit. Oldest sessions will be evicted when limit is reached.\",\n });\n }\n\n if (activeSessions.size > MAX_SESSIONS) {\n const sortedSessions = Array.from(activeSessions.entries()).sort(\n (a, b) => a[1].lastAccessedAt - b[1].lastAccessedAt\n );\n\n const toRemove = sortedSessions.slice(0, activeSessions.size - MAX_SESSIONS);\n for (const [id] of toRemove) {\n activeSessions.delete(id);\n }\n }\n}\n\nfunction getSession(sessionId: string): PartyDiscussionState | null {\n const session = activeSessions.get(sessionId);\n if (!session) return null;\n\n session.lastAccessedAt = Date.now();\n return session.state;\n}\n\nfunction getSessionWithMeta(sessionId: string): SessionWithMeta | null {\n const session = activeSessions.get(sessionId);\n if (!session) return null;\n\n session.lastAccessedAt = Date.now();\n return session;\n}\n\nfunction setSession(\n state: PartyDiscussionState,\n reviewFolderPath?: string,\n phase2?: Phase2Result\n): void {\n activeSessions.set(state.sessionId, {\n state,\n lastAccessedAt: Date.now(),\n reviewFolderPath,\n phase2,\n });\n}\n\nfunction buildAgenda(phase1: Phase1FullData, phase2?: Phase2Result): DiscussionAgendaItem[] {\n const agenda: DiscussionAgendaItem[] = [];\n\n const highSeverityFindings = extractHighSeverityFindings(phase1);\n for (const finding of highSeverityFindings) {\n const agentPositions = phase2 ? getAgentPositionsForFinding(finding.id, phase2) : {};\n agenda.push({\n id: `agenda-${finding.id}`,\n findingId: finding.id,\n topic: finding.title,\n type: \"high-severity\",\n severity: finding.severity,\n category: finding.category,\n relevantAgents: selectAgentsForFinding(finding.category, finding.severity),\n agentPositions,\n discussed: false,\n });\n }\n\n if (phase2) {\n for (const debate of phase2.debatePoints) {\n const existingItem = agenda.find((a) => a.topic === debate.topic);\n if (!existingItem) {\n const positions: Partial<Record<BmadAgentType, string>> = {};\n for (const pos of debate.positions) {\n positions[pos.agent] = pos.position;\n }\n agenda.push({\n id: `agenda-debate-${agenda.length}`,\n findingId: `debate-${agenda.length}`,\n topic: debate.topic,\n type: \"disputed\",\n severity: \"medium\",\n category: \"logic\",\n relevantAgents: debate.positions.map((p) => p.agent),\n agentPositions: positions,\n discussed: false,\n });\n }\n }\n }\n\n return agenda;\n}\n\ninterface FindingInfo {\n id: string;\n title: string;\n severity: FindingSeverity;\n category: FindingCategory;\n}\n\nfunction extractHighSeverityFindings(phase1: Phase1FullData): FindingInfo[] {\n const highCount = phase1.findings?.high ?? 0;\n\n // Handle missing oracleAnalysis gracefully\n if (!phase1.oracleAnalysis) {\n // Fallback to placeholder findings based on count\n if (highCount > 0) {\n return Array.from({ length: highCount }, (_, i) => ({\n id: `high-${i + 1}`,\n title: `High severity finding ${i + 1}`,\n severity: \"high\" as const,\n category: \"logic\" as FindingCategory,\n }));\n }\n return [];\n }\n\n // Use proper JSON parsing from oracle-parser\n const parsed = parseOracleResponse(phase1.oracleAnalysis);\n const allFindings = extractAllFindings(parsed);\n const highFindings = allFindings.filter((f) => f.severity === \"high\");\n\n if (highFindings.length > 0) {\n return highFindings.map((f, i) => ({\n id: f.id || `high-${i + 1}`,\n title: f.title,\n severity: \"high\" as const,\n category: f.category,\n }));\n }\n\n // Fallback if parsing didn't find high findings but count says otherwise\n if (highCount > 0) {\n return Array.from({ length: highCount }, (_, i) => ({\n id: `high-${i + 1}`,\n title: `High severity finding ${i + 1}`,\n severity: \"high\" as const,\n category: \"logic\" as FindingCategory,\n }));\n }\n\n return [];\n}\n\nfunction inferCategory(title: string): FindingCategory {\n const lower = title.toLowerCase();\n if (lower.includes(\"security\") || lower.includes(\"auth\") || lower.includes(\"pii\")) {\n return \"security\";\n }\n if (lower.includes(\"performance\") || lower.includes(\"query\") || lower.includes(\"cache\")) {\n return \"performance\";\n }\n if (lower.includes(\"test\") || lower.includes(\"pattern\") || lower.includes(\"practice\")) {\n return \"bestPractices\";\n }\n return \"logic\";\n}\n\nfunction getAgentPositionsForFinding(\n findingId: string,\n phase2: Phase2Result\n): Partial<Record<BmadAgentType, string>> {\n const positions: Partial<Record<BmadAgentType, string>> = {};\n\n for (const analysis of phase2.agentAnalyses) {\n const prioritized = analysis.prioritizedIssues.find((p) =>\n p.findingId.toLowerCase().includes(findingId.toLowerCase())\n );\n if (prioritized) {\n positions[analysis.agent] = `${prioritized.agentPriority}: ${prioritized.rationale}`;\n } else if (analysis.findings.concerns.length > 0) {\n positions[analysis.agent] = analysis.findings.concerns[0];\n }\n }\n\n return positions;\n}\n\nfunction initializeSession(\n phase1: Phase1FullData,\n phase2?: Phase2Result,\n reviewFolderPath?: string\n): PartyDiscussionState {\n const sessionId = randomUUID();\n const agenda = buildAgenda(phase1, phase2);\n\n const activeAgents = new Set<BmadAgentType>();\n for (const item of agenda) {\n for (const agent of item.relevantAgents) {\n activeAgents.add(agent);\n }\n }\n\n const state: PartyDiscussionState = {\n sessionId,\n scope: phase1.scope,\n identifier: phase1.identifier,\n agenda,\n currentItemIndex: 0,\n completedRounds: [],\n activeAgents: Array.from(activeAgents),\n startedAt: new Date().toISOString(),\n phase1Summary: phase1.findings ?? {\n total: 0,\n high: 0,\n medium: 0,\n low: 0,\n byCategory: {} as Record<FindingCategory, number>,\n },\n phase2Summary: phase2\n ? {\n consensusCount: phase2.consensusPoints.length,\n disputeCount: phase2.debatePoints.length,\n }\n : undefined,\n };\n\n setSession(state, reviewFolderPath, phase2);\n return state;\n}\n\nasync function generateAgentResponses(\n item: DiscussionAgendaItem,\n personas: Map<BmadAgentType, BmadAgentFullPersona>,\n phase2?: Phase2Result\n): Promise<AgentDiscussionResponse[]> {\n const responses: AgentDiscussionResponse[] = [];\n\n for (const agentType of item.relevantAgents) {\n const persona = getPersona(personas, agentType);\n\n const phase2Analysis = phase2?.agentAnalyses.find((a) => a.agent === agentType);\n const previousPosition = item.agentPositions[agentType];\n\n const response = generateInCharacterResponse(\n persona,\n item,\n previousPosition,\n phase2Analysis?.summary,\n responses\n );\n\n responses.push({\n agent: agentType,\n agentName: persona.name,\n icon: persona.icon,\n response,\n references: extractReferences(response, responses),\n keyPoints: extractKeyPoints(response),\n });\n }\n\n return responses;\n}\n\nfunction generateInCharacterResponse(\n persona: BmadAgentFullPersona,\n item: DiscussionAgendaItem,\n previousPosition?: string,\n phase2Summary?: string,\n previousResponses?: AgentDiscussionResponse[]\n): string {\n const intro = getResponseIntro(persona, item);\n const position = previousPosition || phase2Summary || getDefaultPosition(persona, item);\n const crossTalk = generateCrossTalk(persona, previousResponses);\n\n return `${intro} ${position}${crossTalk}`;\n}\n\nfunction getResponseIntro(persona: BmadAgentFullPersona, item: DiscussionAgendaItem): string {\n const intros: Record<BmadAgentType, string> = {\n architect: `From an architecture perspective on \"${item.topic}\":`,\n dev: `Looking at implementation for \"${item.topic}\":`,\n tea: `From a testing standpoint on \"${item.topic}\":`,\n pm: `Considering business impact of \"${item.topic}\":`,\n analyst: `Analyzing requirements around \"${item.topic}\":`,\n \"ux-designer\": `From a user experience view on \"${item.topic}\":`,\n \"tech-writer\": `Regarding documentation for \"${item.topic}\":`,\n sm: `From a process perspective on \"${item.topic}\":`,\n };\n\n return intros[persona.type] || `Regarding \"${item.topic}\":`;\n}\n\nfunction getDefaultPosition(_persona: BmadAgentFullPersona, item: DiscussionAgendaItem): string {\n if (item.severity === \"high\") {\n return `This is a ${item.severity} severity ${item.category} issue that needs attention before we proceed.`;\n }\n return `This ${item.category} concern should be addressed to maintain quality.`;\n}\n\nfunction generateCrossTalk(\n persona: BmadAgentFullPersona,\n previousResponses?: AgentDiscussionResponse[]\n): string {\n if (!previousResponses || previousResponses.length === 0) return \"\";\n\n const collaborativeTypes: BmadAgentType[] = [\"architect\", \"pm\", \"analyst\"];\n const shouldCrossTalk =\n previousResponses.length >= 1 && collaborativeTypes.includes(persona.type);\n\n if (shouldCrossTalk) {\n const lastResponse = previousResponses[previousResponses.length - 1];\n return ` Building on ${lastResponse.agentName}'s point, I'd add that we should prioritize this appropriately.`;\n }\n return \"\";\n}\n\nfunction extractReferences(\n response: string,\n previousResponses: AgentDiscussionResponse[]\n): AgentDiscussionResponse[\"references\"] {\n const references: AgentDiscussionResponse[\"references\"] = [];\n\n for (const prev of previousResponses) {\n if (response.includes(prev.agentName)) {\n const type = response.toLowerCase().includes(\"disagree\")\n ? \"disagrees\"\n : response.toLowerCase().includes(\"building on\")\n ? \"builds-on\"\n : \"agrees\";\n references.push({ agent: prev.agent, type });\n }\n }\n\n return references;\n}\n\nfunction extractKeyPoints(response: string): string[] {\n const sentences = response.split(/[.!?]+/).filter((s) => s.trim().length > 10);\n return sentences.slice(0, 2).map((s) => s.trim());\n}\n\nfunction recordDecision(\n state: PartyDiscussionState,\n findingId: string,\n decision: ReviewDecision,\n reason?: string,\n deferredTo?: string\n): PartyDiscussionState {\n const itemIndex = state.agenda.findIndex((a) => a.findingId === findingId);\n if (itemIndex === -1) return state;\n\n const item = state.agenda[itemIndex];\n item.discussed = true;\n\n const round: DiscussionRound = {\n findingId,\n findingTitle: item.topic,\n findingSeverity: item.severity,\n findingCategory: item.category,\n participants: item.relevantAgents,\n responses: [],\n decision,\n decisionReason: reason,\n deferredTo,\n };\n\n item.round = round;\n state.completedRounds.push(round);\n\n if (state.currentItemIndex === itemIndex) {\n state.currentItemIndex = findNextUndiscussedIndex(state);\n }\n\n return state;\n}\n\nfunction findNextUndiscussedIndex(state: PartyDiscussionState): number {\n for (let i = 0; i < state.agenda.length; i++) {\n if (!state.agenda[i].discussed) {\n return i;\n }\n }\n return state.agenda.length;\n}\n\nfunction calculateSummary(state: PartyDiscussionState): PartyDiscussionResult[\"summary\"] {\n const decisions = { accepted: 0, deferred: 0, rejected: 0, pending: 0 };\n const issueUpdates = new Map<string, string[]>();\n\n for (const round of state.completedRounds) {\n switch (round.decision) {\n case \"accept\":\n decisions.accepted++;\n break;\n case \"defer\":\n decisions.deferred++;\n if (round.deferredTo) {\n const existing = issueUpdates.get(round.deferredTo) || [];\n existing.push(`Deferred: ${round.findingTitle}`);\n issueUpdates.set(round.deferredTo, existing);\n }\n break;\n case \"reject\":\n decisions.rejected++;\n break;\n default:\n decisions.pending++;\n }\n }\n\n for (const item of state.agenda) {\n if (!item.discussed) {\n decisions.pending++;\n }\n }\n\n return {\n totalDiscussed: state.completedRounds.length,\n decisions,\n issueUpdatesNeeded: Array.from(issueUpdates.entries()).map(([issueId, additions]) => ({\n issueId,\n additions,\n })),\n };\n}\n\nexport function createPartyDiscussionTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Orchestrate Phase 3 party discussion for issue reviews.\n\nThis tool manages an informed discussion where expert agents debate findings from Phase 1 (Oracle analysis) and optionally Phase 2 (parallel agent analysis).\n\nModes:\n- Quick mode: Only analysis.json exists in review folder (Oracle findings only)\n- Full mode: Both analysis.json and phase2.json exist (includes agent perspectives)\n\nActions:\n- start: Initialize discussion from review folder (loads analysis.json and optionally phase2.json)\n- continue: Get next agenda item and agent responses\n- decide: Record user decision for a finding (accept/defer/reject)\n- skip: Skip current finding without decision\n- end: End discussion and get summary\n\nThe tool maintains session state across calls, enabling multi-turn discussion.`,\n\n args: {\n action: tool.schema\n .enum([\"start\", \"continue\", \"decide\", \"skip\", \"end\"])\n .describe(\"Action to perform\"),\n sessionId: tool.schema\n .string()\n .optional()\n .describe(\"Session ID (required for continue/decide/skip/end)\"),\n reviewFolderPath: tool.schema\n .string()\n .optional()\n .describe(\"Path to review folder from sdlc_story_review_analyze (required for start)\"),\n findingId: tool.schema.string().optional().describe(\"Finding ID (required for decide)\"),\n decision: tool.schema\n .enum([\"accept\", \"defer\", \"reject\"])\n .optional()\n .describe(\"Decision (required for decide)\"),\n reason: tool.schema.string().optional().describe(\"Reason for decision\"),\n deferredTo: tool.schema\n .string()\n .optional()\n .describe(\"Issue note to defer to (for defer decisions)\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executePartyDiscussion(ctx, config, args);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\ninterface ToolArgs {\n action: \"start\" | \"continue\" | \"decide\" | \"skip\" | \"end\";\n sessionId?: string;\n reviewFolderPath?: string;\n findingId?: string;\n decision?: \"accept\" | \"defer\" | \"reject\";\n reason?: string;\n deferredTo?: string;\n}\n\nasync function executePartyDiscussion(\n ctx: PluginInput,\n config: SdlcConfig,\n args: ToolArgs\n): Promise<PartyDiscussionResult> {\n cleanupStaleSessions();\n const personas = await loadPersonas();\n\n switch (args.action) {\n case \"start\": {\n if (!args.reviewFolderPath) {\n log.warn(\"start called without reviewFolderPath\");\n return {\n success: false,\n sessionId: \"\",\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: \"reviewFolderPath is required for start action\",\n suggestion: \"Pass the reviewFolderPath from sdlc_story_review_analyze result\",\n };\n }\n\n const analysisPath = join(args.reviewFolderPath, \"analysis.json\");\n const phase2Path = join(args.reviewFolderPath, \"phase2.json\");\n\n if (!existsSync(analysisPath)) {\n return {\n success: false,\n sessionId: \"\",\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: `Analysis file not found: ${analysisPath}`,\n suggestion: \"Run sdlc_story_review_analyze first to generate the review folder\",\n };\n }\n\n let phase1: Phase1FullData;\n let phase2: Phase2Result | undefined;\n try {\n const analysisContent = await readFile(analysisPath, \"utf-8\");\n phase1 = JSON.parse(analysisContent);\n\n if (existsSync(phase2Path)) {\n const phase2Content = await readFile(phase2Path, \"utf-8\");\n phase2 = JSON.parse(phase2Content);\n }\n } catch (e) {\n log.error(\"Failed to load review files\", {\n error: e instanceof Error ? e.message : String(e),\n reviewFolderPath: args.reviewFolderPath,\n });\n return {\n success: false,\n sessionId: \"\",\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: `Failed to load review files: ${e instanceof Error ? e.message : String(e)}`,\n suggestion: \"Ensure the review folder contains valid analysis.json\",\n };\n }\n\n if (!phase1.findings) {\n return {\n success: false,\n sessionId: \"\",\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: \"analysis.json missing required 'findings' field\",\n suggestion: \"Ensure sdlc_story_review_analyze completed successfully\",\n };\n }\n\n if (!phase1.oracleAnalysis && phase1.findings.high > 0) {\n console.warn(\n \"[Sdlc] analysis.json missing oracleAnalysis field - using placeholder findings for\",\n phase1.identifier\n );\n }\n\n const state = initializeSession(phase1, phase2, args.reviewFolderPath);\n log.info(\"Session started\", {\n sessionId: state.sessionId,\n identifier: state.identifier,\n agendaItems: state.agenda.length,\n hasPhase2: !!phase2,\n });\n\n const currentItem = state.agenda[0];\n const responses = currentItem\n ? await generateAgentResponses(currentItem, personas, phase2)\n : undefined;\n\n return {\n success: true,\n sessionId: state.sessionId,\n state,\n currentItem,\n currentResponses: responses,\n hasMoreItems: state.agenda.length > 1,\n };\n }\n\n case \"continue\": {\n if (!args.sessionId) {\n return {\n success: false,\n sessionId: \"\",\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: \"sessionId is required for continue action\",\n };\n }\n\n const state = getSession(args.sessionId);\n if (!state) {\n return {\n success: false,\n sessionId: args.sessionId,\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: \"Session not found\",\n };\n }\n\n const currentItem = state.agenda[state.currentItemIndex];\n if (!currentItem || currentItem.discussed) {\n const nextIndex = findNextUndiscussedIndex(state);\n if (nextIndex >= state.agenda.length) {\n return {\n success: true,\n sessionId: state.sessionId,\n state,\n hasMoreItems: false,\n summary: calculateSummary(state),\n };\n }\n state.currentItemIndex = nextIndex;\n }\n\n const nextItem = state.agenda[state.currentItemIndex];\n const phase2 = getSessionWithMeta(state.sessionId)?.phase2;\n\n const responses = await generateAgentResponses(nextItem, personas, phase2);\n\n return {\n success: true,\n sessionId: state.sessionId,\n state,\n currentItem: nextItem,\n currentResponses: responses,\n hasMoreItems: state.currentItemIndex < state.agenda.length - 1,\n };\n }\n\n case \"decide\": {\n if (!args.sessionId || !args.findingId || !args.decision) {\n return {\n success: false,\n sessionId: args.sessionId || \"\",\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: \"sessionId, findingId, and decision are required for decide action\",\n };\n }\n\n const state = getSession(args.sessionId);\n if (!state) {\n return {\n success: false,\n sessionId: args.sessionId,\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: \"Session not found\",\n };\n }\n\n const updatedState = recordDecision(\n state,\n args.findingId,\n args.decision,\n args.reason,\n args.deferredTo\n );\n log.debug(\"Decision recorded\", {\n sessionId: args.sessionId,\n findingId: args.findingId,\n decision: args.decision,\n });\n\n const hasMore = updatedState.currentItemIndex < updatedState.agenda.length;\n\n return {\n success: true,\n sessionId: updatedState.sessionId,\n state: updatedState,\n hasMoreItems: hasMore,\n summary: !hasMore ? calculateSummary(updatedState) : undefined,\n };\n }\n\n case \"skip\": {\n if (!args.sessionId || !args.findingId) {\n return {\n success: false,\n sessionId: args.sessionId || \"\",\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: \"sessionId and findingId are required for skip action\",\n };\n }\n\n const state = getSession(args.sessionId);\n if (!state) {\n return {\n success: false,\n sessionId: args.sessionId,\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: \"Session not found\",\n };\n }\n\n const itemIndex = state.agenda.findIndex((a) => a.findingId === args.findingId);\n if (itemIndex !== -1) {\n state.agenda[itemIndex].discussed = true;\n state.currentItemIndex = findNextUndiscussedIndex(state);\n }\n\n return {\n success: true,\n sessionId: state.sessionId,\n state,\n hasMoreItems: state.currentItemIndex < state.agenda.length,\n };\n }\n\n case \"end\": {\n if (!args.sessionId) {\n return {\n success: false,\n sessionId: \"\",\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: \"sessionId is required for end action\",\n };\n }\n\n const sessionMeta = getSessionWithMeta(args.sessionId);\n if (!sessionMeta) {\n return {\n success: false,\n sessionId: args.sessionId,\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: \"Session not found\",\n };\n }\n\n const state = sessionMeta.state;\n activeSessions.delete(args.sessionId);\n const endSummary = calculateSummary(state);\n\n if (!config.github?.owner || !config.github?.repo) {\n return {\n success: false,\n sessionId: args.sessionId,\n state,\n hasMoreItems: false,\n error: \"GitHub configuration missing\",\n suggestion: \"Set github.owner and github.repo in sdlc.json\",\n };\n }\n\n const appliedUpdates = await applyIssueDecisions(ctx, config, state);\n\n log.info(\"Session ended with decisions applied\", {\n sessionId: args.sessionId,\n totalDiscussed: endSummary?.totalDiscussed ?? 0,\n decisions: endSummary?.decisions,\n issuesModified: appliedUpdates.summary.issuesModified ?? 0,\n });\n\n return {\n success: true,\n sessionId: state.sessionId,\n state,\n hasMoreItems: false,\n summary: endSummary,\n appliedUpdates,\n };\n }\n\n default:\n return {\n success: false,\n sessionId: \"\",\n state: {} as PartyDiscussionState,\n hasMoreItems: false,\n error: `Unknown action: ${args.action}`,\n };\n }\n}\n\nexport const _testExports = {\n buildAgenda,\n extractHighSeverityFindings,\n inferCategory,\n getAgentPositionsForFinding,\n initializeSession,\n generateAgentResponses,\n recordDecision,\n calculateSummary,\n activeSessions,\n cleanupStaleSessions,\n getSession,\n getSessionWithMeta,\n setSession,\n SESSION_TTL_MS,\n MAX_SESSIONS,\n};\n","/**\n * sdlc_party_review Tool\n *\n * Architecture party review using BMAD personas.\n * Facilitates multi-stakeholder discussions on architectural decisions.\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { BmadAgentFullPersona, BmadAgentType, SdlcConfig } from \"../../shared/types.js\";\nimport { registerSubagentSession, unregisterSubagentSession } from \"../hooks/orchestrator-guard.js\";\nimport { loadPersonas } from \"../utils/persona-loader.js\";\n\n/**\n * Party review topic\n */\nexport interface ReviewTopic {\n title: string;\n description: string;\n context?: string;\n options?: string[];\n}\n\n/**\n * Agent perspective in review\n */\nexport interface AgentPerspective {\n agent: BmadAgentType;\n agentName: string;\n icon: string;\n perspective: string;\n concerns: string[];\n recommendations: string[];\n}\n\n/**\n * Party review result\n */\nexport interface PartyReviewResult {\n success: boolean;\n topic?: ReviewTopic;\n perspectives?: AgentPerspective[];\n synthesis?: string;\n documentPath?: string;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Arguments for sdlc_party_review tool\n */\nexport interface PartyReviewArgs {\n topic: string;\n description: string;\n context?: string;\n options?: string[];\n agents?: string[];\n}\n\n/**\n * BMAD Persona mapping\n */\nconst PERSONA_ROLES: Record<string, BmadAgentType> = {\n winston: \"architect\",\n architect: \"architect\",\n amelia: \"dev\",\n developer: \"dev\",\n dev: \"dev\",\n murat: \"tea\",\n tester: \"tea\",\n tea: \"tea\",\n john: \"pm\",\n \"product-manager\": \"pm\",\n pm: \"pm\",\n mary: \"analyst\",\n \"business-analyst\": \"analyst\",\n analyst: \"analyst\",\n sally: \"ux-designer\",\n \"ux-designer\": \"ux-designer\",\n ux: \"ux-designer\",\n paige: \"tech-writer\",\n \"tech-writer\": \"tech-writer\",\n writer: \"tech-writer\",\n bob: \"sm\",\n \"scrum-master\": \"sm\",\n sm: \"sm\",\n};\n\n/**\n * Default agents for architecture reviews\n */\nconst DEFAULT_ARCHITECTURE_AGENTS: BmadAgentType[] = [\n \"architect\", // Winston - architecture perspective\n \"dev\", // Amelia - implementation perspective\n \"tea\", // Murat - testing perspective\n \"pm\", // John - business/product perspective\n];\n\n/**\n * Create the sdlc_party_review tool\n */\nexport function createPartyReviewTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Conduct a party review for architectural decisions using BMAD personas.\n\nThis tool facilitates multi-stakeholder discussions where expert personas provide\ntheir perspectives on architectural topics, trade-offs, and decisions.\n\nAvailable personas:\n- Winston (architect) - System design, scalability, patterns\n- Amelia (dev) - Implementation, code quality, maintainability\n- Murat (tea) - Testing, quality assurance, edge cases\n- John (pm) - Business value, timeline, priorities\n- Mary (analyst) - Requirements, domain logic, user needs\n- Sally (ux-designer) - User experience, accessibility\n- Paige (tech-writer) - Documentation, clarity\n- Bob (sm) - Process, team dynamics, delivery\n\nBy default, architecture reviews include: Winston, Amelia, Murat, John.\nYou can specify custom agents for domain-specific discussions.\n\nReturns perspectives from each agent plus a synthesized summary.`,\n\n args: {\n topic: tool.schema.string().describe(\"The architectural topic or decision to discuss\"),\n description: tool.schema.string().describe(\"Detailed description of the topic or decision\"),\n context: tool.schema\n .string()\n .optional()\n .describe(\"Additional context (e.g., current architecture, constraints)\"),\n options: tool.schema\n .array(tool.schema.string())\n .optional()\n .describe(\"Options being considered (if this is a decision point)\"),\n agents: tool.schema\n .array(tool.schema.string())\n .optional()\n .describe(\n \"Specific agents to include (e.g., ['winston', 'amelia']). Default: architecture team\"\n ),\n },\n\n async execute(args): Promise<string> {\n const result = await executePartyReview(ctx, config, args as PartyReviewArgs);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function executePartyReview(\n ctx: PluginInput,\n config: SdlcConfig,\n args: PartyReviewArgs\n): Promise<PartyReviewResult> {\n // Load personas\n const personas = await loadPersonas();\n\n // Determine which agents to include\n let agentTypes: BmadAgentType[] = DEFAULT_ARCHITECTURE_AGENTS;\n\n if (args.agents && args.agents.length > 0) {\n agentTypes = args.agents\n .map((a) => PERSONA_ROLES[a.toLowerCase()])\n .filter((t): t is BmadAgentType => t !== undefined);\n\n if (agentTypes.length === 0) {\n return {\n success: false,\n error: \"No valid agents specified\",\n suggestion: `Valid agents: ${Object.keys(PERSONA_ROLES).join(\", \")}`,\n };\n }\n }\n\n const topic: ReviewTopic = {\n title: args.topic,\n description: args.description,\n context: args.context,\n options: args.options,\n };\n\n // Gather perspectives from each agent\n const perspectives: AgentPerspective[] = [];\n\n for (const agentType of agentTypes) {\n const persona = personas.get(agentType);\n if (!persona) continue;\n\n const perspective = await gatherPerspective(ctx, config, persona, topic, perspectives);\n perspectives.push(perspective);\n }\n\n // Synthesize the discussion\n const synthesis = await synthesizeDiscussion(ctx, config, topic, perspectives);\n\n // Save review document\n const reviewId = randomUUID().slice(0, 8);\n const documentPath = join(ctx.directory, \".opencode\", \"reviews\", `party-review-${reviewId}.md`);\n\n try {\n await mkdir(dirname(documentPath), { recursive: true });\n await writeFile(documentPath, generateReviewDocument(topic, perspectives, synthesis), \"utf-8\");\n } catch {\n // Non-fatal\n }\n\n return {\n success: true,\n topic,\n perspectives,\n synthesis,\n documentPath,\n };\n}\n\nasync function gatherPerspective(\n ctx: PluginInput,\n config: SdlcConfig,\n persona: BmadAgentFullPersona,\n topic: ReviewTopic,\n previousPerspectives: AgentPerspective[]\n): Promise<AgentPerspective> {\n // Build prompt for this persona\n const previousContext =\n previousPerspectives.length > 0\n ? `\\n\\nPrevious perspectives shared:\\n${previousPerspectives\n .map((p) => `- ${p.agentName}: ${p.perspective.slice(0, 200)}...`)\n .join(\"\\n\")}`\n : \"\";\n\n const optionsSection = topic.options\n ? `\\n\\nOptions being considered:\\n${topic.options.map((o, i) => `${i + 1}. ${o}`).join(\"\\n\")}`\n : \"\";\n\n const prompt = `You are ${persona.name}, the ${persona.title}.\n\n${persona.identity}\n\n## Topic for Review\n\n**${topic.title}**\n\n${topic.description}\n\n${topic.context ? `### Context\\n${topic.context}` : \"\"}\n${optionsSection}\n${previousContext}\n\n## Your Task\n\nProvide your perspective on this architectural topic from your role as ${persona.title}.\n\nStructure your response as:\n\n### Perspective\n[Your main perspective on this topic - 2-3 paragraphs]\n\n### Concerns\n- [Concern 1]\n- [Concern 2]\n- [...]\n\n### Recommendations\n- [Recommendation 1]\n- [Recommendation 2]\n- [...]\n\nStay in character and focus on your area of expertise.`;\n\n try {\n const createResult = await ctx.client.session.create({\n body: {\n title: `Party Review: ${persona.name}`,\n },\n });\n\n if (!createResult.data?.id) {\n return createFallbackPerspective(persona, topic);\n }\n\n const sessionId = createResult.data.id;\n registerSubagentSession(sessionId, \"file_updater\");\n\n try {\n const modelConfig = parseModelConfig(\n config.models.oracle || \"anthropic/claude-sonnet-4-20250514\"\n );\n\n await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: modelConfig,\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n return createFallbackPerspective(persona, topic);\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const content = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n return parseAgentResponse(persona, content);\n } finally {\n unregisterSubagentSession(sessionId);\n }\n } catch {\n return createFallbackPerspective(persona, topic);\n }\n}\n\nfunction createFallbackPerspective(\n persona: BmadAgentFullPersona,\n topic: ReviewTopic\n): AgentPerspective {\n return {\n agent: persona.type,\n agentName: persona.name,\n icon: persona.icon,\n perspective: `As ${persona.title}, I would need to analyze \"${topic.title}\" more thoroughly to provide a complete perspective.`,\n concerns: [\"Further analysis needed\"],\n recommendations: [\"Schedule detailed review session\"],\n };\n}\n\nfunction parseAgentResponse(persona: BmadAgentFullPersona, content: string): AgentPerspective {\n // Extract perspective section\n const perspectiveMatch = content.match(\n /###?\\s*Perspective\\s*\\n+([\\s\\S]*?)(?=###?\\s*Concerns|$)/i\n );\n const perspective = perspectiveMatch ? perspectiveMatch[1].trim() : content.slice(0, 500);\n\n // Extract concerns\n const concernsMatch = content.match(\n /###?\\s*Concerns\\s*\\n+([\\s\\S]*?)(?=###?\\s*Recommendations|$)/i\n );\n const concerns: string[] = [];\n if (concernsMatch) {\n const items = concernsMatch[1].match(/^[-*]\\s*(.+)$/gm) || [];\n concerns.push(...items.map((i) => i.replace(/^[-*]\\s*/, \"\").trim()));\n }\n\n // Extract recommendations\n const recsMatch = content.match(/###?\\s*Recommendations\\s*\\n+([\\s\\S]*?)$/i);\n const recommendations: string[] = [];\n if (recsMatch) {\n const items = recsMatch[1].match(/^[-*]\\s*(.+)$/gm) || [];\n recommendations.push(...items.map((i) => i.replace(/^[-*]\\s*/, \"\").trim()));\n }\n\n return {\n agent: persona.type,\n agentName: persona.name,\n icon: persona.icon,\n perspective,\n concerns: concerns.length > 0 ? concerns : [\"No specific concerns raised\"],\n recommendations: recommendations.length > 0 ? recommendations : [\"No specific recommendations\"],\n };\n}\n\nasync function synthesizeDiscussion(\n ctx: PluginInput,\n config: SdlcConfig,\n topic: ReviewTopic,\n perspectives: AgentPerspective[]\n): Promise<string> {\n const perspectivesText = perspectives\n .map(\n (p) =>\n `## ${p.agentName} (${p.agent})\n${p.perspective}\n\n**Concerns:** ${p.concerns.join(\"; \")}\n\n**Recommendations:** ${p.recommendations.join(\"; \")}`\n )\n .join(\"\\n\\n\");\n\n const prompt = `Synthesize the following party review discussion into a cohesive summary.\n\n## Topic: ${topic.title}\n\n${topic.description}\n\n${topic.options ? `**Options considered:** ${topic.options.join(\", \")}` : \"\"}\n\n## Perspectives Gathered\n\n${perspectivesText}\n\n## Your Task\n\nWrite a synthesis that:\n1. Summarizes the key points of agreement\n2. Highlights areas of disagreement or tension\n3. Identifies the main trade-offs\n4. Provides a balanced recommendation (if applicable)\n\nKeep the synthesis concise (3-4 paragraphs).`;\n\n try {\n const createResult = await ctx.client.session.create({\n body: {\n title: \"Party Review Synthesis\",\n },\n });\n\n if (!createResult.data?.id) {\n return generateFallbackSynthesis(perspectives);\n }\n\n const sessionId = createResult.data.id;\n registerSubagentSession(sessionId, \"file_updater\");\n\n try {\n const modelConfig = parseModelConfig(\n config.models.oracle || \"anthropic/claude-sonnet-4-20250514\"\n );\n\n await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: modelConfig,\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n return generateFallbackSynthesis(perspectives);\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n return textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n } finally {\n unregisterSubagentSession(sessionId);\n }\n } catch {\n return generateFallbackSynthesis(perspectives);\n }\n}\n\nfunction generateFallbackSynthesis(perspectives: AgentPerspective[]): string {\n const allConcerns = perspectives.flatMap((p) => p.concerns);\n const allRecs = perspectives.flatMap((p) => p.recommendations);\n\n return `## Synthesis\n\nThe party review gathered perspectives from ${perspectives.length} stakeholders.\n\n**Key Concerns:**\n${allConcerns\n .slice(0, 5)\n .map((c) => `- ${c}`)\n .join(\"\\n\")}\n\n**Recommendations:**\n${allRecs\n .slice(0, 5)\n .map((r) => `- ${r}`)\n .join(\"\\n\")}\n\nFurther discussion may be needed to reach consensus.`;\n}\n\nfunction generateReviewDocument(\n topic: ReviewTopic,\n perspectives: AgentPerspective[],\n synthesis: string\n): string {\n const date = new Date().toISOString().split(\"T\")[0];\n\n let doc = `# Party Review: ${topic.title}\n\n**Date:** ${date}\n\n## Topic\n\n${topic.description}\n\n${topic.context ? `### Context\\n${topic.context}\\n` : \"\"}\n${topic.options ? `### Options Considered\\n${topic.options.map((o, i) => `${i + 1}. ${o}`).join(\"\\n\")}\\n` : \"\"}\n\n## Perspectives\n\n`;\n\n for (const p of perspectives) {\n doc += `### ${p.icon} ${p.agentName}\n\n${p.perspective}\n\n**Concerns:**\n${p.concerns.map((c) => `- ${c}`).join(\"\\n\")}\n\n**Recommendations:**\n${p.recommendations.map((r) => `- ${r}`).join(\"\\n\")}\n\n---\n\n`;\n }\n\n doc += `## Synthesis\n\n${synthesis}\n`;\n\n return doc;\n}\n\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"anthropic\", modelID: modelID || modelString };\n}\n\n// Export for testing\nexport const _testExports = {\n executePartyReview,\n gatherPerspective,\n parseAgentResponse,\n synthesizeDiscussion,\n generateReviewDocument,\n PERSONA_ROLES,\n DEFAULT_ARCHITECTURE_AGENTS,\n};\n","/**\n * Git Workflow Utilities\n *\n * Abstracts git operations based on configured workflow (standard or git-spice).\n * Provides worktree support for parallel development.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { GitConfig, GitWorkflow, SdlcConfig } from \"../../shared/types.js\";\nimport { createPluginLogger } from \"./plugin-logger.js\";\n\nconst log = createPluginLogger(\"git-workflow\");\n\n/**\n * Git operation result\n */\nexport interface GitResult {\n success: boolean;\n output?: string;\n error?: string;\n command?: string;\n}\n\n/**\n * Branch info\n */\nexport interface BranchInfo {\n name: string;\n isStack?: boolean;\n stackName?: string;\n upstream?: string;\n}\n\n/**\n * Worktree info\n */\nexport interface WorktreeInfo {\n path: string;\n branch: string;\n isMain: boolean;\n}\n\n/**\n * Get git configuration from SDLC config\n */\nexport function getGitConfig(config: SdlcConfig): GitConfig {\n return (\n config.git || {\n workflow: \"standard\" as GitWorkflow,\n requireClean: true,\n worktrees: false,\n }\n );\n}\n\n/**\n * Check if git-spice workflow is enabled\n */\nexport function isGitSpiceEnabled(config: SdlcConfig): boolean {\n return getGitConfig(config).workflow === \"git-spice\";\n}\n\n/**\n * Check if git-spice is installed\n */\nexport async function checkGitSpiceInstalled(ctx: PluginInput): Promise<boolean> {\n try {\n const result = await ctx.$`gs --version`;\n return result.exitCode === 0;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if working directory is clean\n */\nexport async function isWorkingDirClean(ctx: PluginInput): Promise<boolean> {\n try {\n const result = await ctx.$`git status --porcelain`;\n return result.exitCode === 0 && String(result.stdout).trim() === \"\";\n } catch {\n return false;\n }\n}\n\n/**\n * Get current branch name\n */\nexport async function getCurrentBranch(ctx: PluginInput): Promise<string | null> {\n try {\n const result = await ctx.$`git branch --show-current`;\n return result.exitCode === 0 ? String(result.stdout).trim() : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Get the main/master branch name\n */\nexport async function getMainBranch(ctx: PluginInput): Promise<string> {\n try {\n // Try to get the default branch from origin\n const result = await ctx.$`git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null`;\n if (result.exitCode === 0) {\n const ref = String(result.stdout).trim();\n return ref.replace(\"refs/remotes/origin/\", \"\");\n }\n } catch {\n // Ignore\n }\n\n // Fall back to checking if main or master exists\n try {\n const mainCheck = await ctx.$`git rev-parse --verify main 2>/dev/null`;\n if (mainCheck.exitCode === 0) return \"main\";\n } catch {\n // Ignore\n }\n\n return \"master\";\n}\n\n// ============================================================================\n// Standard Git Workflow Commands\n// ============================================================================\n\n/**\n * Standard git: Create a new branch\n */\nexport async function standardCreateBranch(\n ctx: PluginInput,\n branchName: string,\n baseBranch?: string\n): Promise<GitResult> {\n try {\n const base = baseBranch || (await getMainBranch(ctx));\n const cmd = `git checkout -b ${branchName} ${base}`;\n const result = await ctx.$`git checkout -b ${branchName} ${base}`;\n\n return {\n success: result.exitCode === 0,\n output: String(result.stdout),\n error: String(result.stderr),\n command: cmd,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n}\n\n/**\n * Standard git: Commit changes\n */\nexport async function standardCommit(ctx: PluginInput, message: string): Promise<GitResult> {\n try {\n const cmd = `git commit -m \"${message}\"`;\n const result = await ctx.$`git commit -m ${message}`;\n\n return {\n success: result.exitCode === 0,\n output: String(result.stdout),\n error: String(result.stderr),\n command: cmd,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n}\n\n/**\n * Standard git: Push to remote\n */\nexport async function standardPush(\n ctx: PluginInput,\n branch?: string,\n setUpstream?: boolean\n): Promise<GitResult> {\n try {\n let result: Awaited<ReturnType<typeof ctx.$>>;\n let cmd: string;\n\n if (setUpstream && branch) {\n cmd = `git push -u origin ${branch}`;\n result = await ctx.$`git push -u origin ${branch}`;\n } else if (branch) {\n cmd = `git push origin ${branch}`;\n result = await ctx.$`git push origin ${branch}`;\n } else {\n cmd = \"git push\";\n result = await ctx.$`git push`;\n }\n\n return {\n success: result.exitCode === 0,\n output: String(result.stdout),\n error: String(result.stderr),\n command: cmd,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n}\n\n// ============================================================================\n// Git-Spice Workflow Commands\n// ============================================================================\n\n/**\n * Git-spice: Create a new stacked branch\n */\nexport async function gitSpiceCreateBranch(\n ctx: PluginInput,\n branchName: string\n): Promise<GitResult> {\n try {\n const cmd = `gs branch create ${branchName}`;\n const result = await ctx.$`gs branch create ${branchName}`;\n\n return {\n success: result.exitCode === 0,\n output: String(result.stdout),\n error: String(result.stderr),\n command: cmd,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n}\n\n/**\n * Git-spice: Commit changes\n */\nexport async function gitSpiceCommit(ctx: PluginInput, message: string): Promise<GitResult> {\n try {\n const cmd = `gs commit create -m \"${message}\"`;\n const result = await ctx.$`gs commit create -m ${message}`;\n\n return {\n success: result.exitCode === 0,\n output: String(result.stdout),\n error: String(result.stderr),\n command: cmd,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n}\n\n/**\n * Git-spice: Submit stack for PR creation\n */\nexport async function gitSpiceSubmitStack(ctx: PluginInput): Promise<GitResult> {\n try {\n const cmd = \"gs stack submit\";\n const result = await ctx.$`gs stack submit`;\n\n return {\n success: result.exitCode === 0,\n output: String(result.stdout),\n error: String(result.stderr),\n command: cmd,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n}\n\n/**\n * Git-spice: Restack (rebase stack)\n */\nexport async function gitSpiceRestack(ctx: PluginInput): Promise<GitResult> {\n try {\n const cmd = \"gs restack\";\n const result = await ctx.$`gs restack`;\n\n return {\n success: result.exitCode === 0,\n output: String(result.stdout),\n error: String(result.stderr),\n command: cmd,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n}\n\n/**\n * Git-spice: List stack\n */\nexport async function gitSpiceListStack(\n ctx: PluginInput\n): Promise<GitResult & { branches?: string[] }> {\n try {\n const cmd = \"gs stack\";\n const result = await ctx.$`gs stack`;\n\n const branches =\n result.exitCode === 0\n ? String(result.stdout)\n .split(\"\\n\")\n .filter((line: string) => line.trim())\n .map((line: string) => line.trim())\n : undefined;\n\n return {\n success: result.exitCode === 0,\n output: String(result.stdout),\n error: String(result.stderr),\n command: cmd,\n branches,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n}\n\n// ============================================================================\n// Worktree Support\n// ============================================================================\n\n/**\n * List existing worktrees\n */\nexport async function listWorktrees(ctx: PluginInput): Promise<WorktreeInfo[]> {\n try {\n const result = await ctx.$`git worktree list --porcelain`;\n if (result.exitCode !== 0) return [];\n\n const worktrees: WorktreeInfo[] = [];\n let current: Partial<WorktreeInfo> = {};\n\n for (const line of String(result.stdout).split(\"\\n\")) {\n if (line.startsWith(\"worktree \")) {\n if (current.path) {\n worktrees.push(current as WorktreeInfo);\n }\n current = { path: line.replace(\"worktree \", \"\") };\n } else if (line.startsWith(\"branch \")) {\n current.branch = line.replace(\"branch refs/heads/\", \"\");\n } else if (line === \"bare\") {\n current.isMain = true;\n }\n }\n\n if (current.path) {\n worktrees.push(current as WorktreeInfo);\n }\n\n // Mark the first non-bare worktree as main\n const mainWorktree = worktrees.find((w) => !w.isMain);\n if (mainWorktree) mainWorktree.isMain = true;\n\n return worktrees;\n } catch {\n return [];\n }\n}\n\n/**\n * Create a new worktree for a branch\n */\nexport async function createWorktree(\n ctx: PluginInput,\n branchName: string\n): Promise<GitResult & { worktreePath?: string }> {\n try {\n // Create worktree path in a sibling directory\n const worktreePath = join(ctx.directory, \"..\", `${branchName}-worktree`);\n\n // Check if worktree already exists\n if (existsSync(worktreePath)) {\n return {\n success: false,\n error: `Worktree already exists at ${worktreePath}`,\n };\n }\n\n const cmd = `git worktree add \"${worktreePath}\" -b ${branchName}`;\n const result = await ctx.$`git worktree add ${worktreePath} -b ${branchName}`;\n\n if (result.exitCode === 0) {\n log.info(\"Created worktree\", { path: worktreePath, branch: branchName });\n }\n\n return {\n success: result.exitCode === 0,\n output: String(result.stdout),\n error: String(result.stderr),\n command: cmd,\n worktreePath: result.exitCode === 0 ? worktreePath : undefined,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n}\n\n/**\n * Remove a worktree\n */\nexport async function removeWorktree(\n ctx: PluginInput,\n worktreePath: string,\n force?: boolean\n): Promise<GitResult> {\n try {\n let result: Awaited<ReturnType<typeof ctx.$>>;\n let cmd: string;\n\n if (force) {\n cmd = `git worktree remove --force \"${worktreePath}\"`;\n result = await ctx.$`git worktree remove --force ${worktreePath}`;\n } else {\n cmd = `git worktree remove \"${worktreePath}\"`;\n result = await ctx.$`git worktree remove ${worktreePath}`;\n }\n\n if (result.exitCode === 0) {\n log.info(\"Removed worktree\", { path: worktreePath });\n }\n\n return {\n success: result.exitCode === 0,\n output: String(result.stdout),\n error: String(result.stderr),\n command: cmd,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n };\n }\n}\n\n// ============================================================================\n// Unified API\n// ============================================================================\n\n/**\n * Create a branch using the configured workflow\n */\nexport async function createBranch(\n ctx: PluginInput,\n config: SdlcConfig,\n branchName: string,\n baseBranch?: string\n): Promise<GitResult> {\n if (isGitSpiceEnabled(config)) {\n const installed = await checkGitSpiceInstalled(ctx);\n if (!installed) {\n log.warn(\"git-spice not installed, falling back to standard git\");\n return standardCreateBranch(ctx, branchName, baseBranch);\n }\n return gitSpiceCreateBranch(ctx, branchName);\n }\n return standardCreateBranch(ctx, branchName, baseBranch);\n}\n\n/**\n * Commit changes using the configured workflow\n */\nexport async function commit(\n ctx: PluginInput,\n config: SdlcConfig,\n message: string\n): Promise<GitResult> {\n if (isGitSpiceEnabled(config)) {\n const installed = await checkGitSpiceInstalled(ctx);\n if (!installed) {\n log.warn(\"git-spice not installed, falling back to standard git\");\n return standardCommit(ctx, message);\n }\n return gitSpiceCommit(ctx, message);\n }\n return standardCommit(ctx, message);\n}\n\n/**\n * Push changes / submit stack using the configured workflow\n */\nexport async function push(\n ctx: PluginInput,\n config: SdlcConfig,\n branch?: string,\n setUpstream?: boolean\n): Promise<GitResult> {\n if (isGitSpiceEnabled(config)) {\n const installed = await checkGitSpiceInstalled(ctx);\n if (!installed) {\n log.warn(\"git-spice not installed, falling back to standard git\");\n return standardPush(ctx, branch, setUpstream);\n }\n // For git-spice, submit the stack\n return gitSpiceSubmitStack(ctx);\n }\n return standardPush(ctx, branch, setUpstream);\n}\n\n/**\n * Get git-spice specific commands for inclusion in prompts\n */\nexport const GIT_SPICE_COMMANDS = [\n \"gs branch create\",\n \"gs commit create\",\n \"gs stack submit\",\n \"gs restack\",\n \"gs branch checkout\",\n \"gs branch delete\",\n \"gs stack\",\n \"gs log\",\n \"gs up\",\n \"gs down\",\n \"gs bottom\",\n \"gs top\",\n];\n\n// Export for testing\nexport const _testExports = {\n standardCreateBranch,\n standardCommit,\n standardPush,\n gitSpiceCreateBranch,\n gitSpiceCommit,\n gitSpiceSubmitStack,\n gitSpiceRestack,\n gitSpiceListStack,\n};\n","/**\n * PM Mode: Create Branch Tool\n *\n * Creates a feature branch for an issue following naming conventions.\n */\n\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport type { IssueTracker } from \"../tracker/issue-tracker.js\";\nimport {\n createBranch,\n getCurrentBranch,\n getGitConfig,\n isWorkingDirClean,\n} from \"../utils/git-workflow.js\";\nimport { fetchIssue } from \"../utils/github-issues.js\";\n\n/**\n * Result type for branch creation\n */\nexport interface CreateBranchResult {\n success: boolean;\n branchName?: string;\n issueNumber?: number;\n previousBranch?: string;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Generate branch name from issue\n */\nfunction generateBranchName(issueNumber: number, title: string, type = \"feat\"): string {\n const slug = title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\")\n .substring(0, 30);\n return `${type}/${issueNumber}-${slug}`;\n}\n\n/**\n * Determine branch type from issue labels or title\n */\nfunction determineBranchType(title: string, labels: Array<{ name: string }> = []): string {\n const lowerTitle = title.toLowerCase();\n const lowerLabels = labels.map((l) => l.name.toLowerCase());\n\n if (lowerLabels.includes(\"bug\") || lowerTitle.startsWith(\"fix\")) {\n return \"fix\";\n }\n if (lowerLabels.includes(\"docs\") || lowerTitle.startsWith(\"docs\")) {\n return \"docs\";\n }\n if (lowerLabels.includes(\"refactor\") || lowerTitle.startsWith(\"refactor\")) {\n return \"refactor\";\n }\n if (lowerLabels.includes(\"test\") || lowerTitle.startsWith(\"test\")) {\n return \"test\";\n }\n return \"feat\";\n}\n\nexport function createCreateBranchTool(\n ctx: PluginInput,\n tracker: IssueTracker,\n config: SdlcConfig\n): ToolDefinition {\n return tool({\n description: `Create a feature branch for a GitHub issue.\n\nBranch naming follows convention: {type}/{issue-number}-{short-description}\nTypes: feat, fix, docs, refactor, test (auto-detected from issue labels/title)\n\nExample: feat/42-user-authentication\n\nOptions:\n- issueNumber: The issue to create a branch for\n- branchType: Override auto-detected type (feat, fix, docs, refactor, test)\n- customName: Use a completely custom branch name instead`,\n\n args: {\n issueNumber: tool.schema\n .number()\n .int()\n .positive()\n .describe(\"GitHub issue number to create branch for\"),\n branchType: tool.schema\n .enum([\"feat\", \"fix\", \"docs\", \"refactor\", \"test\"])\n .optional()\n .describe(\"Override auto-detected branch type\"),\n customName: tool.schema\n .string()\n .optional()\n .describe(\"Use custom branch name instead of generated one\"),\n },\n\n async execute(args): Promise<string> {\n const result = await createBranchForIssue(ctx, tracker, config, args);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function createBranchForIssue(\n ctx: PluginInput,\n tracker: IssueTracker,\n config: SdlcConfig,\n args: {\n issueNumber: number;\n branchType?: \"feat\" | \"fix\" | \"docs\" | \"refactor\" | \"test\";\n customName?: string;\n }\n): Promise<CreateBranchResult> {\n const gitConfig = getGitConfig(config);\n\n // Check for clean working directory if required\n if (gitConfig.requireClean) {\n const isClean = await isWorkingDirClean(ctx);\n if (!isClean) {\n return {\n success: false,\n error: \"Working directory has uncommitted changes\",\n suggestion: \"Commit or stash changes before creating a new branch\",\n };\n }\n }\n\n // Get current branch for reference\n const previousBranch = await getCurrentBranch(ctx);\n\n // Fetch issue details\n if (!config.github?.owner || !config.github?.repo) {\n return {\n success: false,\n error: \"GitHub configuration missing\",\n suggestion: \"Set github.owner and github.repo in sdlc.json\",\n };\n }\n\n const issue = await fetchIssue(ctx, config, args.issueNumber);\n if (!issue) {\n return {\n success: false,\n error: `Issue #${args.issueNumber} not found`,\n suggestion: \"Check the issue number and repository settings\",\n };\n }\n\n // Determine branch name\n let branchName: string;\n if (args.customName) {\n branchName = args.customName;\n } else {\n const branchType = args.branchType || determineBranchType(issue.title, issue.labels);\n branchName = generateBranchName(args.issueNumber, issue.title, branchType);\n }\n\n // Create the branch\n const createResult = await createBranch(ctx, config, branchName);\n\n if (!createResult.success) {\n return {\n success: false,\n error: createResult.error || \"Failed to create branch\",\n suggestion: \"Check if branch already exists or if you have permission\",\n };\n }\n\n // Update tracker with branch info\n await tracker.setCurrentIssue(args.issueNumber, {\n title: issue.title,\n status: \"In progress\",\n startedAt: new Date().toISOString(),\n url: issue.url,\n body: issue.body,\n branch: branchName,\n });\n\n return {\n success: true,\n branchName,\n issueNumber: args.issueNumber,\n previousBranch: previousBranch || undefined,\n };\n}\n","/**\n * PM Mode: Pull Request Tools\n *\n * Create, check status, and merge pull requests.\n */\n\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport type { IssueTracker } from \"../tracker/issue-tracker.js\";\nimport { getCurrentBranch, standardPush } from \"../utils/git-workflow.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\n\nconst log = createPluginLogger(\"pm-pull-request\");\n\n/**\n * PR check status\n */\nexport interface PrCheck {\n name: string;\n status: \"pass\" | \"fail\" | \"pending\" | \"skipped\";\n conclusion?: string;\n}\n\n/**\n * PR review status\n */\nexport interface PrReview {\n reviewer: string;\n state: \"APPROVED\" | \"CHANGES_REQUESTED\" | \"COMMENTED\" | \"PENDING\";\n}\n\n/**\n * Result type for PR creation\n */\nexport interface CreatePrResult {\n success: boolean;\n prNumber?: number;\n prUrl?: string;\n title?: string;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Result type for PR status\n */\nexport interface PrStatusResult {\n success: boolean;\n prNumber?: number;\n prUrl?: string;\n state?: \"OPEN\" | \"CLOSED\" | \"MERGED\";\n mergeable?: boolean;\n checks?: PrCheck[];\n reviews?: PrReview[];\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Result type for PR merge\n */\nexport interface MergePrResult {\n success: boolean;\n prNumber?: number;\n mergeCommit?: string;\n error?: string;\n suggestion?: string;\n}\n\nfunction getRepo(config: SdlcConfig): { owner: string; repo: string } | null {\n if (!config.github?.owner || !config.github?.repo) return null;\n return { owner: config.github.owner, repo: config.github.repo };\n}\n\nexport function createCreatePrTool(\n ctx: PluginInput,\n tracker: IssueTracker,\n config: SdlcConfig\n): ToolDefinition {\n return tool({\n description: `Create a pull request for the current branch.\n\nAutomatically:\n- Uses current branch name\n- Links to related issue with \"Closes #X\"\n- Pushes branch to remote if not already pushed\n\nProvide either issueNumber to auto-generate title/body, or custom title/body.`,\n\n args: {\n issueNumber: tool.schema\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Issue number to link (auto-populates title and body)\"),\n title: tool.schema.string().optional().describe(\"Custom PR title\"),\n body: tool.schema.string().optional().describe(\"Custom PR body\"),\n draft: tool.schema.boolean().optional().describe(\"Create as draft PR\"),\n },\n\n async execute(args): Promise<string> {\n const result = await createPullRequest(ctx, tracker, config, args);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function createPullRequest(\n ctx: PluginInput,\n tracker: IssueTracker,\n config: SdlcConfig,\n args: {\n issueNumber?: number;\n title?: string;\n body?: string;\n draft?: boolean;\n }\n): Promise<CreatePrResult> {\n const repo = getRepo(config);\n if (!repo) {\n return {\n success: false,\n error: \"GitHub configuration missing\",\n suggestion: \"Set github.owner and github.repo in sdlc.json\",\n };\n }\n\n // Get current branch\n const branch = await getCurrentBranch(ctx);\n if (!branch) {\n return {\n success: false,\n error: \"Could not determine current branch\",\n suggestion: \"Ensure you are in a git repository with a checked-out branch\",\n };\n }\n\n // Determine title and body\n let title = args.title;\n let body = args.body;\n\n if (args.issueNumber && !title) {\n // Extract type from branch name (feat/42-name -> feat)\n const typeMatch = branch.match(/^(feat|fix|docs|refactor|test)\\//);\n const type = typeMatch ? typeMatch[1] : \"feat\";\n const currentIssue = tracker.getCurrentIssue();\n\n if (currentIssue && currentIssue.issueNumber === args.issueNumber) {\n title = `${type}: ${currentIssue.title}`;\n } else {\n title = `${type}: implement #${args.issueNumber}`;\n }\n }\n\n if (args.issueNumber && !body) {\n body = `## Summary\\n\\nImplementation for issue #${args.issueNumber}\\n\\n## Related Issues\\n\\n- Closes #${args.issueNumber}`;\n }\n\n if (!title) {\n return {\n success: false,\n error: \"PR title required\",\n suggestion: \"Provide either issueNumber or title\",\n };\n }\n\n // Push branch first\n const pushResult = await standardPush(ctx, branch, true);\n if (!pushResult.success) {\n log.warn(\"Push may have failed, attempting PR creation anyway\", { error: pushResult.error });\n }\n\n // Create PR using array-based argument passing to avoid shell injection\n try {\n const ghArgs: string[] = [\n \"pr\",\n \"create\",\n \"--repo\",\n `${repo.owner}/${repo.repo}`,\n \"--title\",\n title,\n ];\n\n if (body) {\n ghArgs.push(\"--body\", body);\n }\n\n if (args.draft) {\n ghArgs.push(\"--draft\");\n }\n\n ghArgs.push(\"--json\", \"number,url\");\n\n const { stdout, exitCode } = await ctx.$`gh ${ghArgs}`;\n\n if (exitCode !== 0) {\n return {\n success: false,\n error: \"Failed to create PR\",\n suggestion: \"Check if PR already exists for this branch\",\n };\n }\n\n const prData = JSON.parse(String(stdout).trim()) as { number: number; url: string };\n\n log.info(\"Created PR\", { prNumber: prData.number, url: prData.url });\n\n return {\n success: true,\n prNumber: prData.number,\n prUrl: prData.url,\n title,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error creating PR\",\n suggestion: \"Check GitHub CLI authentication and permissions\",\n };\n }\n}\n\nexport function createPrStatusTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Check the status of a pull request.\n\nReturns:\n- PR state (open, closed, merged)\n- CI check results\n- Review statuses\n- Mergeability`,\n\n args: {\n prNumber: tool.schema\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"PR number (uses current branch PR if omitted)\"),\n },\n\n async execute(args): Promise<string> {\n const result = await getPrStatus(ctx, config, args.prNumber);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function getPrStatus(\n ctx: PluginInput,\n config: SdlcConfig,\n prNumber?: number\n): Promise<PrStatusResult> {\n const repo = getRepo(config);\n if (!repo) {\n return {\n success: false,\n error: \"GitHub configuration missing\",\n suggestion: \"Set github.owner and github.repo in sdlc.json\",\n };\n }\n\n try {\n // If no PR number, get PR for current branch\n const prRef = prNumber ? String(prNumber) : \"\";\n\n const { stdout, exitCode } =\n await ctx.$`gh pr view ${prRef} --repo ${repo.owner}/${repo.repo} --json number,url,state,mergeable,statusCheckRollup,reviews`;\n\n if (exitCode !== 0) {\n return {\n success: false,\n error: prNumber ? `PR #${prNumber} not found` : \"No PR found for current branch\",\n suggestion: \"Check the PR number or create a PR first\",\n };\n }\n\n const prData = JSON.parse(String(stdout).trim()) as {\n number: number;\n url: string;\n state: \"OPEN\" | \"CLOSED\" | \"MERGED\";\n mergeable: string;\n statusCheckRollup?: Array<{\n name: string;\n status: string;\n conclusion: string;\n }>;\n reviews?: Array<{\n author: { login: string };\n state: string;\n }>;\n };\n\n const checks: PrCheck[] = (prData.statusCheckRollup || []).map((check) => ({\n name: check.name,\n status:\n check.status === \"COMPLETED\"\n ? check.conclusion === \"SUCCESS\"\n ? \"pass\"\n : check.conclusion === \"SKIPPED\"\n ? \"skipped\"\n : \"fail\"\n : \"pending\",\n conclusion: check.conclusion,\n }));\n\n const reviews: PrReview[] = (prData.reviews || []).map((review) => ({\n reviewer: review.author.login,\n state: review.state as PrReview[\"state\"],\n }));\n\n return {\n success: true,\n prNumber: prData.number,\n prUrl: prData.url,\n state: prData.state,\n mergeable: prData.mergeable === \"MERGEABLE\",\n checks,\n reviews,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n suggestion: \"Check GitHub CLI authentication\",\n };\n }\n}\n\nexport function createMergePrTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Merge an approved pull request.\n\nOptions:\n- squash: Squash commits into single commit (default: true)\n- deleteBranch: Delete branch after merge (default: true)`,\n\n args: {\n prNumber: tool.schema\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"PR number (uses current branch PR if omitted)\"),\n squash: tool.schema.boolean().optional().describe(\"Squash commits (default: true)\"),\n deleteBranch: tool.schema\n .boolean()\n .optional()\n .describe(\"Delete branch after merge (default: true)\"),\n },\n\n async execute(args): Promise<string> {\n const result = await mergePullRequest(ctx, config, args);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function mergePullRequest(\n ctx: PluginInput,\n config: SdlcConfig,\n args: {\n prNumber?: number;\n squash?: boolean;\n deleteBranch?: boolean;\n }\n): Promise<MergePrResult> {\n const repo = getRepo(config);\n if (!repo) {\n return {\n success: false,\n error: \"GitHub configuration missing\",\n suggestion: \"Set github.owner and github.repo in sdlc.json\",\n };\n }\n\n // First check PR status\n const status = await getPrStatus(ctx, config, args.prNumber);\n if (!status.success) {\n return {\n success: false,\n error: status.error,\n suggestion: status.suggestion,\n };\n }\n\n if (status.state !== \"OPEN\") {\n return {\n success: false,\n error: `PR is ${status.state?.toLowerCase()}, cannot merge`,\n suggestion: \"Only open PRs can be merged\",\n };\n }\n\n if (!status.mergeable) {\n return {\n success: false,\n error: \"PR is not mergeable\",\n suggestion: \"Resolve conflicts or wait for required checks to pass\",\n };\n }\n\n try {\n const prRef = args.prNumber ? String(args.prNumber) : \"\";\n const squashFlag = args.squash !== false ? \"--squash\" : \"\";\n const deleteFlag = args.deleteBranch !== false ? \"--delete-branch\" : \"\";\n\n const { stdout, exitCode } =\n await ctx.$`gh pr merge ${prRef} --repo ${repo.owner}/${repo.repo} ${squashFlag} ${deleteFlag} --json mergeCommit`;\n\n if (exitCode !== 0) {\n return {\n success: false,\n error: \"Failed to merge PR\",\n suggestion: \"Check if PR is approved and all checks pass\",\n };\n }\n\n const mergeData = JSON.parse(String(stdout).trim()) as { mergeCommit?: { oid: string } };\n\n log.info(\"Merged PR\", { prNumber: status.prNumber, commit: mergeData.mergeCommit?.oid });\n\n return {\n success: true,\n prNumber: status.prNumber,\n mergeCommit: mergeData.mergeCommit?.oid,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n suggestion: \"Check GitHub CLI authentication and permissions\",\n };\n }\n}\n","/**\n * PM Mode: Worktree Tools\n *\n * Create, list, and remove git worktrees for parallel development.\n */\n\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport {\n type WorktreeInfo,\n createWorktree,\n getGitConfig,\n listWorktrees,\n removeWorktree,\n} from \"../utils/git-workflow.js\";\n\n/**\n * Result type for worktree creation\n */\nexport interface CreateWorktreeResult {\n success: boolean;\n worktreePath?: string;\n branch?: string;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Result type for worktree listing\n */\nexport interface ListWorktreesResult {\n success: boolean;\n worktrees: WorktreeInfo[];\n count: number;\n error?: string;\n}\n\n/**\n * Result type for worktree removal\n */\nexport interface RemoveWorktreeResult {\n success: boolean;\n removedPath?: string;\n error?: string;\n suggestion?: string;\n}\n\nexport function createCreateWorktreeTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Create a git worktree for parallel development on a separate branch.\n\nWorktrees allow working on multiple branches simultaneously without switching.\nEach worktree is a separate directory with its own working tree.\n\nRequires git.worktrees: true in configuration.`,\n\n args: {\n branchName: tool.schema.string().describe(\"Name for the new branch in the worktree\"),\n },\n\n async execute(args): Promise<string> {\n const gitConfig = getGitConfig(config);\n\n if (!gitConfig.worktrees) {\n const result: CreateWorktreeResult = {\n success: false,\n error: \"Worktrees not enabled in configuration\",\n suggestion: \"Set git.worktrees: true in sdlc.json to enable worktree support\",\n };\n return JSON.stringify(result, null, 2);\n }\n\n const createResult = await createWorktree(ctx, args.branchName);\n\n const result: CreateWorktreeResult = createResult.success\n ? {\n success: true,\n worktreePath: createResult.worktreePath,\n branch: args.branchName,\n }\n : {\n success: false,\n error: createResult.error || \"Failed to create worktree\",\n suggestion: \"Check if the branch name is valid and doesn't already exist\",\n };\n\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nexport function createListWorktreesTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `List all active git worktrees in the repository.\n\nShows the path, branch, and whether each worktree is the main working directory.`,\n\n args: {},\n\n async execute(): Promise<string> {\n const gitConfig = getGitConfig(config);\n\n if (!gitConfig.worktrees) {\n const result: ListWorktreesResult = {\n success: false,\n worktrees: [],\n count: 0,\n error: \"Worktrees not enabled in configuration\",\n };\n return JSON.stringify(result, null, 2);\n }\n\n const worktrees = await listWorktrees(ctx);\n\n const result: ListWorktreesResult = {\n success: true,\n worktrees,\n count: worktrees.length,\n };\n\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nexport function createRemoveWorktreeTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Remove a git worktree that is no longer needed.\n\nThis cleans up the worktree directory and removes it from git's tracking.\nUse force: true to remove even if there are uncommitted changes.`,\n\n args: {\n worktreePath: tool.schema.string().describe(\"Path to the worktree to remove\"),\n force: tool.schema\n .boolean()\n .optional()\n .describe(\"Force removal even with uncommitted changes\"),\n },\n\n async execute(args): Promise<string> {\n const gitConfig = getGitConfig(config);\n\n if (!gitConfig.worktrees) {\n const result: RemoveWorktreeResult = {\n success: false,\n error: \"Worktrees not enabled in configuration\",\n suggestion: \"Set git.worktrees: true in sdlc.json\",\n };\n return JSON.stringify(result, null, 2);\n }\n\n const removeResult = await removeWorktree(ctx, args.worktreePath, args.force);\n\n const result: RemoveWorktreeResult = removeResult.success\n ? {\n success: true,\n removedPath: args.worktreePath,\n }\n : {\n success: false,\n error: removeResult.error || \"Failed to remove worktree\",\n suggestion: args.force\n ? \"Check if the path exists and is a valid worktree\"\n : \"Use force: true to remove worktree with uncommitted changes\",\n };\n\n return JSON.stringify(result, null, 2);\n },\n });\n}\n","/**\n * sdlc_review_pr Tool\n *\n * 3-stage Pull Request review:\n * - Stage 1: Specification Compliance\n * - Stage 2: Code Quality\n * - Stage 3: Domain Integrity\n */\n\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport { registerSubagentSession, unregisterSubagentSession } from \"../hooks/orchestrator-guard.js\";\n\n/**\n * Specification compliance status for an acceptance criterion\n */\nexport type SpecComplianceStatus =\n | \"COMPLETE\"\n | \"MISSING\"\n | \"INCOMPLETE\"\n | \"OVER-BUILT\"\n | \"DIVERGENT\";\n\n/**\n * Code quality flag severity\n */\nexport type QualityFlag = \"BUG_RISK\" | \"MAINTAINABILITY\" | \"STYLE\" | \"PERFORMANCE\";\n\n/**\n * Specification compliance finding\n */\nexport interface SpecComplianceFinding {\n issueNumber: number;\n acNumber: number;\n acText: string;\n status: SpecComplianceStatus;\n evidence?: string;\n}\n\n/**\n * Code quality finding\n */\nexport interface CodeQualityFinding {\n flag: QualityFlag;\n file: string;\n line?: number;\n description: string;\n suggestion?: string;\n}\n\n/**\n * Domain integrity violation\n */\nexport interface DomainViolation {\n type: \"primitive_obsession\" | \"invalid_state\" | \"parse_validate\" | \"naming\";\n location: string;\n description: string;\n impact: string;\n recommendation: string;\n}\n\n/**\n * PR review result\n */\nexport interface PrReviewResult {\n success: boolean;\n prNumber: number;\n filesChanged?: number;\n linesAdded?: number;\n linesRemoved?: number;\n linkedIssues?: number[];\n stage1?: {\n findings: SpecComplianceFinding[];\n summary: Record<SpecComplianceStatus, number>;\n };\n stage2?: {\n findings: CodeQualityFinding[];\n summary: Record<QualityFlag, number>;\n };\n stage3?: {\n violations: DomainViolation[];\n score: number;\n };\n verdict: \"APPROVE\" | \"REQUEST_CHANGES\" | \"COMMENT\";\n mustFix: string[];\n shouldFix: string[];\n consider: string[];\n reviewPath?: string;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Arguments for sdlc_review_pr tool\n */\nexport interface ReviewPrArgs {\n prNumber: number;\n stages?: string;\n skipDomain?: boolean;\n}\n\n/**\n * Create the sdlc_review_pr tool\n */\nexport function createReviewPrTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Perform a comprehensive 3-stage Pull Request review.\n\nStage 1: Specification Compliance\n- Maps each acceptance criterion to implementation\n- Flags: COMPLETE, MISSING, INCOMPLETE, OVER-BUILT, DIVERGENT\n\nStage 2: Code Quality\n- Evaluates clarity, domain types, error handling, testing, YAGNI\n- Flags: BUG_RISK, MAINTAINABILITY, STYLE, PERFORMANCE\n\nStage 3: Domain Integrity\n- Compile-time enforcement audit\n- Checks for primitive obsession, invalid states, parse-don't-validate\n\nReturns:\n- verdict: APPROVE | REQUEST_CHANGES | COMMENT\n- mustFix: Blocking issues\n- shouldFix: Non-blocking improvements\n- consider: Optional suggestions\n- reviewPath: Path to saved review document`,\n\n args: {\n prNumber: tool.schema.number().describe(\"GitHub Pull Request number to review\"),\n stages: tool.schema\n .string()\n .optional()\n .describe(\"Comma-separated stages to run (1,2,3). Default: all stages.\"),\n skipDomain: tool.schema\n .boolean()\n .optional()\n .describe(\"Skip Stage 3 domain integrity check (faster review)\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executeReview(ctx, config, args as ReviewPrArgs);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function executeReview(\n ctx: PluginInput,\n config: SdlcConfig,\n args: ReviewPrArgs\n): Promise<PrReviewResult> {\n if (!config.github?.owner || !config.github?.repo) {\n return {\n success: false,\n prNumber: args.prNumber,\n verdict: \"REQUEST_CHANGES\",\n mustFix: [],\n shouldFix: [],\n consider: [],\n error: \"GitHub configuration missing\",\n suggestion: \"Set github.owner and github.repo in sdlc.json\",\n };\n }\n\n // Determine which stages to run\n let stages: number[] = [1, 2, 3];\n if (args.stages) {\n stages = args.stages\n .split(\",\")\n .map((s) => Number.parseInt(s.trim(), 10))\n .filter((n) => [1, 2, 3].includes(n));\n } else if (args.skipDomain) {\n stages = [1, 2];\n }\n\n // Fetch PR information\n const prInfo = await fetchPrInfo(ctx, config, args.prNumber);\n if (!prInfo.success) {\n return {\n success: false,\n prNumber: args.prNumber,\n verdict: \"REQUEST_CHANGES\",\n mustFix: [],\n shouldFix: [],\n consider: [],\n error: prInfo.error,\n suggestion: prInfo.suggestion,\n };\n }\n\n // Build review prompt\n const reviewPrompt = await buildReviewPrompt(ctx, config, args.prNumber, prInfo, stages);\n\n // Spawn review agent\n const agentResult = await spawnReviewAgent(ctx, config, reviewPrompt, args.prNumber);\n\n if (!agentResult.success) {\n return {\n success: false,\n prNumber: args.prNumber,\n verdict: \"REQUEST_CHANGES\",\n mustFix: [],\n shouldFix: [],\n consider: [],\n error: agentResult.error || \"Review agent failed\",\n suggestion: \"Check agent configuration and try again\",\n };\n }\n\n // Parse the review output\n const parsed = parseReviewOutput(agentResult.content || \"\");\n\n // Save review document\n const reviewPath = join(ctx.directory, \".opencode\", \"reviews\", `pr-${args.prNumber}-review.md`);\n\n try {\n await mkdir(dirname(reviewPath), { recursive: true });\n await writeFile(reviewPath, agentResult.content || \"\", \"utf-8\");\n } catch {\n // Non-fatal - continue without saving\n }\n\n // Determine verdict based on findings\n const mustFix: string[] = [];\n const shouldFix: string[] = [];\n const consider: string[] = [];\n\n // Stage 1: MISSING is blocking\n if (parsed.stage1) {\n for (const finding of parsed.stage1.findings) {\n if (finding.status === \"MISSING\") {\n mustFix.push(`[MISSING] AC${finding.acNumber}: ${finding.acText}`);\n } else if (finding.status === \"INCOMPLETE\" || finding.status === \"DIVERGENT\") {\n shouldFix.push(`[${finding.status}] AC${finding.acNumber}: ${finding.acText}`);\n } else if (finding.status === \"OVER-BUILT\") {\n consider.push(`[OVER-BUILT] AC${finding.acNumber}: ${finding.acText}`);\n }\n }\n }\n\n // Stage 2: BUG_RISK is blocking\n if (parsed.stage2) {\n for (const finding of parsed.stage2.findings) {\n if (finding.flag === \"BUG_RISK\") {\n mustFix.push(`[BUG_RISK] ${finding.file}: ${finding.description}`);\n } else if (finding.flag === \"MAINTAINABILITY\" || finding.flag === \"PERFORMANCE\") {\n shouldFix.push(`[${finding.flag}] ${finding.file}: ${finding.description}`);\n } else {\n consider.push(`[${finding.flag}] ${finding.file}: ${finding.description}`);\n }\n }\n }\n\n // Stage 3: Domain violations are warnings unless severe\n if (parsed.stage3) {\n for (const violation of parsed.stage3.violations) {\n if (violation.type === \"invalid_state\") {\n shouldFix.push(`[DOMAIN] ${violation.location}: ${violation.description}`);\n } else {\n consider.push(`[DOMAIN] ${violation.location}: ${violation.description}`);\n }\n }\n }\n\n // Determine verdict\n let verdict: \"APPROVE\" | \"REQUEST_CHANGES\" | \"COMMENT\" = \"APPROVE\";\n if (mustFix.length > 0) {\n verdict = \"REQUEST_CHANGES\";\n } else if (shouldFix.length > 0) {\n verdict = \"COMMENT\";\n }\n\n return {\n success: true,\n prNumber: args.prNumber,\n filesChanged: prInfo.filesChanged,\n linesAdded: prInfo.linesAdded,\n linesRemoved: prInfo.linesRemoved,\n linkedIssues: prInfo.linkedIssues,\n stage1: parsed.stage1,\n stage2: parsed.stage2,\n stage3: parsed.stage3,\n verdict,\n mustFix,\n shouldFix,\n consider,\n reviewPath,\n };\n}\n\ninterface PrInfo {\n success: boolean;\n filesChanged?: number;\n linesAdded?: number;\n linesRemoved?: number;\n linkedIssues?: number[];\n diff?: string;\n issueContext?: string;\n error?: string;\n suggestion?: string;\n}\n\nasync function fetchPrInfo(\n ctx: PluginInput,\n config: SdlcConfig,\n prNumber: number\n): Promise<PrInfo> {\n if (!config.github?.owner || !config.github?.repo) {\n return {\n success: false,\n error: \"GitHub configuration missing\",\n suggestion: \"Set github.owner and github.repo in sdlc.json\",\n };\n }\n const { owner, repo } = config.github;\n const repoPath = `${owner}/${repo}`;\n\n try {\n // Fetch PR details using gh CLI\n const { stdout: prStdout } =\n await ctx.$`gh pr view ${prNumber} --repo ${repoPath} --json additions,deletions,changedFiles,body,title`;\n\n const prData = JSON.parse(String(prStdout).trim());\n\n // Fetch PR diff\n let diff = \"\";\n try {\n const { stdout: diffStdout } = await ctx.$`gh pr diff ${prNumber} --repo ${repoPath}`;\n diff = String(diffStdout);\n } catch {\n // Diff fetch failed - continue without it\n }\n\n // Extract linked issues from PR body\n const linkedIssues: number[] = [];\n const issueMatches = prData.body?.matchAll(/(?:closes?|fixes?|resolves?)\\s*#(\\d+)/gi) || [];\n for (const match of issueMatches) {\n linkedIssues.push(Number.parseInt(match[1], 10));\n }\n\n // Also check for plain issue references\n const refMatches = prData.body?.matchAll(/#(\\d+)/g) || [];\n for (const match of refMatches) {\n const num = Number.parseInt(match[1], 10);\n if (!linkedIssues.includes(num)) {\n linkedIssues.push(num);\n }\n }\n\n // Fetch linked issue details for context\n let issueContext = \"\";\n for (const issueNum of linkedIssues.slice(0, 3)) {\n try {\n const { stdout: issueStdout } =\n await ctx.$`gh issue view ${issueNum} --repo ${repoPath} --json title,body`;\n const issueData = JSON.parse(String(issueStdout).trim());\n issueContext += `\\n\\n## Issue #${issueNum}: ${issueData.title}\\n\\n${issueData.body || \"\"}`;\n } catch {\n // Issue fetch failed - continue\n }\n }\n\n return {\n success: true,\n filesChanged: prData.changedFiles,\n linesAdded: prData.additions,\n linesRemoved: prData.deletions,\n linkedIssues,\n diff,\n issueContext,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return {\n success: false,\n error: `Failed to fetch PR info: ${message}`,\n suggestion: \"Ensure gh CLI is authenticated and has repo access\",\n };\n }\n}\n\nasync function buildReviewPrompt(\n ctx: PluginInput,\n _config: SdlcConfig,\n prNumber: number,\n prInfo: PrInfo,\n stages: number[]\n): Promise<string> {\n // Try to load custom prompt\n const customPromptPath = join(ctx.directory, \"prompts\", \"agents\", \"code-reviewer.md\");\n let basePrompt: string;\n\n try {\n basePrompt = await readFile(customPromptPath, \"utf-8\");\n } catch {\n basePrompt = getBuiltInReviewPrompt();\n }\n\n const stageInstructions = stages.map((s) => `Stage ${s}`).join(\", \");\n\n const contextSection = `\n## Review Context\n\n**PR Number:** #${prNumber}\n**Files Changed:** ${prInfo.filesChanged || \"unknown\"}\n**Lines:** +${prInfo.linesAdded || 0}/-${prInfo.linesRemoved || 0}\n**Linked Issues:** ${prInfo.linkedIssues?.map((n) => `#${n}`).join(\", \") || \"none\"}\n\n**Stages to Run:** ${stageInstructions}\n\n### Issue Context\n${prInfo.issueContext || \"No linked issues found.\"}\n\n### PR Diff\n\\`\\`\\`diff\n${prInfo.diff?.slice(0, 50000) || \"Unable to fetch diff\"}\n\\`\\`\\`\n`;\n\n return `${basePrompt}\\n\\n${contextSection}`;\n}\n\nfunction getBuiltInReviewPrompt(): string {\n return `# Code Reviewer Agent\n\nPerform a 3-stage PR review:\n\n## Stage 1: Specification Compliance\nMap acceptance criteria to implementation:\n- COMPLETE: AC fully implemented\n- MISSING: AC not implemented\n- INCOMPLETE: AC partially done\n- OVER-BUILT: Exceeds scope\n- DIVERGENT: Differs from intent\n\n## Stage 2: Code Quality\nFlag issues:\n- BUG_RISK: Could cause errors\n- MAINTAINABILITY: Future maintenance issues\n- STYLE: Convention violations\n- PERFORMANCE: Performance concerns\n\n## Stage 3: Domain Integrity\nCheck for:\n- Primitive obsession\n- Invalid states representable\n- Parse-don't-validate violations\n- Naming consistency\n\nOutput a structured review with findings for each stage.`;\n}\n\ninterface AgentResult {\n success: boolean;\n content?: string;\n error?: string;\n}\n\nasync function spawnReviewAgent(\n ctx: PluginInput,\n config: SdlcConfig,\n prompt: string,\n prNumber: number\n): Promise<AgentResult> {\n try {\n const createResult = await ctx.client.session.create({\n body: {\n title: `PR Review: #${prNumber}`,\n },\n });\n\n if (!createResult.data?.id) {\n return { success: false, error: \"Failed to create review agent session\" };\n }\n\n const sessionId = createResult.data.id;\n registerSubagentSession(sessionId, \"file_updater\");\n\n try {\n const modelConfig = parseModelConfig(\n config.models.oracle || \"anthropic/claude-sonnet-4-20250514\"\n );\n\n const promptResult = await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: modelConfig,\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n if (!promptResult.data) {\n return { success: false, error: \"No response from review agent\" };\n }\n\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n return { success: false, error: \"No messages in review agent session\" };\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const content = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n return { success: true, content };\n } finally {\n unregisterSubagentSession(sessionId);\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return { success: false, error: `Review agent spawn failed: ${message}` };\n }\n}\n\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"anthropic\", modelID: modelID || modelString };\n}\n\ninterface ParsedReview {\n stage1?: {\n findings: SpecComplianceFinding[];\n summary: Record<SpecComplianceStatus, number>;\n };\n stage2?: {\n findings: CodeQualityFinding[];\n summary: Record<QualityFlag, number>;\n };\n stage3?: {\n violations: DomainViolation[];\n score: number;\n };\n}\n\nfunction parseReviewOutput(content: string): ParsedReview {\n const result: ParsedReview = {};\n\n // Parse Stage 1 findings\n const stage1Section = content.match(/##?\\s*Stage 1[^\\n]*\\n([\\s\\S]*?)(?=##?\\s*Stage [23]|$)/i);\n if (stage1Section) {\n const findings: SpecComplianceFinding[] = [];\n const statusMatches = stage1Section[1].matchAll(\n /\\|\\s*AC(\\d+)[^|]*\\|\\s*(COMPLETE|MISSING|INCOMPLETE|OVER-BUILT|DIVERGENT)[^|]*\\|([^|]*)\\|/gi\n );\n for (const match of statusMatches) {\n findings.push({\n issueNumber: 0,\n acNumber: Number.parseInt(match[1], 10),\n acText: \"\",\n status: match[2].toUpperCase() as SpecComplianceStatus,\n evidence: match[3]?.trim(),\n });\n }\n result.stage1 = {\n findings,\n summary: countSpecStatuses(findings),\n };\n }\n\n // Parse Stage 2 findings\n const stage2Section = content.match(/##?\\s*Stage 2[^\\n]*\\n([\\s\\S]*?)(?=##?\\s*Stage 3|$)/i);\n if (stage2Section) {\n const findings: CodeQualityFinding[] = [];\n const flagMatches = stage2Section[1].matchAll(\n /\\[(BUG_RISK|MAINTAINABILITY|STYLE|PERFORMANCE)\\][^\\n]*\\n\\*\\*File:\\*\\*\\s*`([^`]+)`(?::(\\d+))?/gi\n );\n for (const match of flagMatches) {\n findings.push({\n flag: match[1].toUpperCase() as QualityFlag,\n file: match[2],\n line: match[3] ? Number.parseInt(match[3], 10) : undefined,\n description: \"\",\n });\n }\n result.stage2 = {\n findings,\n summary: countQualityFlags(findings),\n };\n }\n\n // Parse Stage 3 violations\n const stage3Section = content.match(/##?\\s*Stage 3[^\\n]*\\n([\\s\\S]*?)(?=##?\\s*Summary|$)/i);\n if (stage3Section) {\n const violations: DomainViolation[] = [];\n const violationMatches = stage3Section[1].matchAll(\n /####\\s*(Primitive Obsession|Invalid State|Parse-Don't-Validate|Naming)[^\\n]*\\n\\*\\*Location:\\*\\*\\s*`([^`]+)`/gi\n );\n for (const match of violationMatches) {\n const typeMap: Record<string, DomainViolation[\"type\"]> = {\n \"primitive obsession\": \"primitive_obsession\",\n \"invalid state\": \"invalid_state\",\n \"parse-don't-validate\": \"parse_validate\",\n naming: \"naming\",\n };\n violations.push({\n type: typeMap[match[1].toLowerCase()] || \"naming\",\n location: match[2],\n description: \"\",\n impact: \"\",\n recommendation: \"\",\n });\n }\n\n // Try to extract score\n const scoreMatch = stage3Section[1].match(/Overall[^\\d]*(\\d+(?:\\.\\d+)?)\\s*\\/\\s*10/i);\n const score = scoreMatch ? Number.parseFloat(scoreMatch[1]) : 5;\n\n result.stage3 = { violations, score };\n }\n\n return result;\n}\n\nfunction countSpecStatuses(\n findings: SpecComplianceFinding[]\n): Record<SpecComplianceStatus, number> {\n const counts: Record<SpecComplianceStatus, number> = {\n COMPLETE: 0,\n MISSING: 0,\n INCOMPLETE: 0,\n \"OVER-BUILT\": 0,\n DIVERGENT: 0,\n };\n for (const finding of findings) {\n counts[finding.status]++;\n }\n return counts;\n}\n\nfunction countQualityFlags(findings: CodeQualityFinding[]): Record<QualityFlag, number> {\n const counts: Record<QualityFlag, number> = {\n BUG_RISK: 0,\n MAINTAINABILITY: 0,\n STYLE: 0,\n PERFORMANCE: 0,\n };\n for (const finding of findings) {\n counts[finding.flag]++;\n }\n return counts;\n}\n\n// Export for testing\nexport const _testExports = {\n executeReview,\n fetchPrInfo,\n parseReviewOutput,\n countSpecStatuses,\n countQualityFlags,\n};\n","import type { BmadAgentType, FindingCategory } from \"../../shared/types.js\";\n\nexport interface FindingCounts {\n total: number;\n high: number;\n medium: number;\n low: number;\n byCategory: Record<FindingCategory, number>;\n}\n\nexport interface AgentRecommendation {\n agent: BmadAgentType;\n reason: string;\n relevantFindings: string[];\n priority: \"required\" | \"recommended\" | \"optional\";\n}\n\nconst AGENT_EXPERTISE: Record<BmadAgentType, FindingCategory[]> = {\n architect: [\"security\", \"performance\"],\n dev: [\"logic\", \"performance\", \"bestPractices\"],\n tea: [\"logic\", \"bestPractices\"],\n pm: [\"logic\", \"bestPractices\"],\n analyst: [\"logic\"],\n \"ux-designer\": [\"bestPractices\"],\n \"tech-writer\": [\"bestPractices\"],\n sm: [\"bestPractices\"],\n};\n\nexport function selectAgentsForReview(findings: FindingCounts): AgentRecommendation[] {\n const recommendations: AgentRecommendation[] = [];\n\n if (findings.byCategory.security > 0) {\n addSecurityAgents(recommendations, findings);\n }\n\n if (findings.byCategory.logic > 0) {\n addLogicAgents(recommendations, findings);\n }\n\n if (findings.byCategory.performance > 0) {\n addPerformanceAgents(recommendations);\n }\n\n if (findings.byCategory.bestPractices > 0) {\n addBestPracticesAgents(recommendations, findings);\n }\n\n if (findings.high > 0) {\n recommendations.push({\n agent: \"pm\",\n reason: `${findings.high} high severity issue(s) need product impact assessment`,\n relevantFindings: [\"high-severity\"],\n priority: \"required\",\n });\n }\n\n ensureAtLeastOneRequired(recommendations);\n\n return recommendations;\n}\n\nfunction addSecurityAgents(recommendations: AgentRecommendation[], findings: FindingCounts): void {\n recommendations.push({\n agent: \"architect\",\n reason: `${findings.byCategory.security} security finding(s) require architecture review`,\n relevantFindings: [\"security\"],\n priority: findings.high > 0 ? \"required\" : \"recommended\",\n });\n recommendations.push({\n agent: \"dev\",\n reason: \"Security findings need implementation perspective\",\n relevantFindings: [\"security\"],\n priority: \"recommended\",\n });\n recommendations.push({\n agent: \"tea\",\n reason: \"Security findings need test coverage review\",\n relevantFindings: [\"security\"],\n priority: \"recommended\",\n });\n}\n\nfunction addLogicAgents(recommendations: AgentRecommendation[], findings: FindingCounts): void {\n if (!recommendations.find((r) => r.agent === \"dev\")) {\n recommendations.push({\n agent: \"dev\",\n reason: `${findings.byCategory.logic} logic gap(s) need implementation review`,\n relevantFindings: [\"logic\"],\n priority: findings.high > 0 ? \"required\" : \"recommended\",\n });\n }\n if (!recommendations.find((r) => r.agent === \"tea\")) {\n recommendations.push({\n agent: \"tea\",\n reason: \"Logic gaps need test scenario review\",\n relevantFindings: [\"logic\"],\n priority: \"recommended\",\n });\n }\n recommendations.push({\n agent: \"analyst\",\n reason: \"Logic gaps may indicate incomplete requirements\",\n relevantFindings: [\"logic\"],\n priority: \"optional\",\n });\n}\n\nfunction addPerformanceAgents(recommendations: AgentRecommendation[]): void {\n if (!recommendations.find((r) => r.agent === \"architect\")) {\n recommendations.push({\n agent: \"architect\",\n reason: \"Performance issues need architecture review\",\n relevantFindings: [\"performance\"],\n priority: \"recommended\",\n });\n }\n if (!recommendations.find((r) => r.agent === \"dev\")) {\n recommendations.push({\n agent: \"dev\",\n reason: \"Performance issues need implementation perspective\",\n relevantFindings: [\"performance\"],\n priority: \"recommended\",\n });\n }\n}\n\nfunction addBestPracticesAgents(\n recommendations: AgentRecommendation[],\n findings: FindingCounts\n): void {\n if (!recommendations.find((r) => r.agent === \"dev\")) {\n recommendations.push({\n agent: \"dev\",\n reason: `${findings.byCategory.bestPractices} best practice issue(s) need code review`,\n relevantFindings: [\"bestPractices\"],\n priority: \"optional\",\n });\n }\n recommendations.push({\n agent: \"tech-writer\",\n reason: \"Best practice issues may need documentation updates\",\n relevantFindings: [\"bestPractices\"],\n priority: \"optional\",\n });\n}\n\nfunction ensureAtLeastOneRequired(recommendations: AgentRecommendation[]): void {\n const requiredCount = recommendations.filter((r) => r.priority === \"required\").length;\n if (requiredCount === 0 && recommendations.length > 0) {\n recommendations[0].priority = \"required\";\n }\n}\n\nexport function getRecommendedAgentTypes(recommendations: AgentRecommendation[]): BmadAgentType[] {\n const seen = new Set<BmadAgentType>();\n const agents: BmadAgentType[] = [];\n\n for (const rec of recommendations) {\n if (!seen.has(rec.agent)) {\n seen.add(rec.agent);\n agents.push(rec.agent);\n }\n }\n\n return agents;\n}\n\nexport function filterByPriority(\n recommendations: AgentRecommendation[],\n minPriority: \"required\" | \"recommended\" | \"optional\"\n): AgentRecommendation[] {\n const priorityOrder = { required: 0, recommended: 1, optional: 2 };\n const minLevel = priorityOrder[minPriority];\n\n return recommendations.filter((r) => priorityOrder[r.priority] <= minLevel);\n}\n\nexport { AGENT_EXPERTISE };\n","import { join } from \"node:path\";\n\nconst ISSUE_PREFIX_PATTERN = /^(issue[-\\s]?|#)/i;\nconst ISSUE_TOKEN_SPLIT = /[\\s,]+/;\n\nexport function parseIssueIdentifiers(input: string): number[] {\n if (!input) return [];\n\n const tokens = input.split(ISSUE_TOKEN_SPLIT).map((token) => token.trim());\n const results = new Set<number>();\n\n for (const token of tokens) {\n if (!token) continue;\n\n const cleaned = token.replace(ISSUE_PREFIX_PATTERN, \"\").trim();\n if (!cleaned) continue;\n\n const value = Number.parseInt(cleaned, 10);\n if (Number.isFinite(value) && value > 0) {\n results.add(value);\n }\n }\n\n return Array.from(results);\n}\n\nexport function formatIssueList(issueNumbers: number[]): string {\n return issueNumbers.map((issueNumber) => `#${issueNumber}`).join(\", \");\n}\n\nexport function getReviewsDirectory(projectRoot: string): string {\n return join(projectRoot, \".opencode\", \"sdlc\", \"reviews\");\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type {\n FindingCategory,\n Phase1FullData,\n Phase1Summary,\n ReviewScope,\n SdlcConfig,\n} from \"../../shared/types.js\";\nimport {\n type AgentRecommendation,\n type FindingCounts,\n selectAgentsForReview,\n} from \"../utils/agent-selector.js\";\nimport { fetchIssue } from \"../utils/github-issues.js\";\nimport {\n formatIssueList,\n getReviewsDirectory,\n parseIssueIdentifiers,\n} from \"../utils/issue-review-utils.js\";\nimport {\n type FindingDetail,\n type ParsedOracleResponse,\n countFindings,\n parseOracleResponse,\n} from \"../utils/oracle-parser.js\";\n\nexport function createStoryReviewAnalyzeTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Analyze GitHub issues for security, logic, best practice, and performance gaps.\n\nThis tool performs Phase 1 of the party review workflow:\n1. Loads issue bodies and optional architecture context\n2. Spawns Oracle agent to analyze for issues\n3. Parses findings by severity and category\n4. Recommends expert agents for discussion\n5. Generates and saves a review document\n\nReturns a complete Phase 1 result that can be passed to Phase 2 (sdlc_story_review_consult) or Phase 3 (sdlc_party_discussion).\n\nUse this BEFORE development to catch issues early.`,\n\n args: {\n identifier: tool.schema\n .string()\n .describe(\"Comma-separated issue numbers (e.g., '12, 34') or a single issue number\"),\n thorough: tool.schema\n .boolean()\n .optional()\n .describe(\"Force advanced model for deeper analysis (default: auto-detect)\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executePhase1Analysis(ctx, config, args.identifier, args.thorough);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function executePhase1Analysis(\n ctx: PluginInput,\n config: SdlcConfig,\n identifier: string,\n forceAdvancedModel?: boolean\n): Promise<Phase1Summary> {\n if (!config.github?.owner || !config.github?.repo) {\n return {\n success: false,\n scope: \"issue\",\n identifier,\n error: \"GitHub configuration missing\",\n suggestion: \"Set github.owner and github.repo in sdlc.json\",\n };\n }\n\n const issueNumbers = parseIssueIdentifiers(identifier);\n if (issueNumbers.length === 0) {\n return {\n success: false,\n scope: \"issue\",\n identifier,\n error: \"No issue numbers provided\",\n suggestion: \"Provide at least one GitHub issue number (e.g., '12' or '12, 34')\",\n };\n }\n\n const reviewsDir = getReviewsDirectory(ctx.directory);\n await ensureDirectory(reviewsDir);\n\n const issuesContent = await loadIssues(ctx, config, issueNumbers);\n if (issuesContent.length === 0) {\n return {\n success: false,\n scope: \"issue\",\n identifier,\n error: \"No issues found\",\n suggestion: \"Check the issue numbers and repository settings\",\n };\n }\n\n const scope: ReviewScope = issuesContent.length > 1 ? \"multi-issue\" : \"issue\";\n const issueLabel = formatIssueList(issueNumbers);\n\n const oraclePrompt = buildOraclePrompt(scope, issueLabel, issuesContent, \"\");\n const oracleResponse = await spawnOracleAndWait(ctx, config, oraclePrompt, forceAdvancedModel);\n\n if (!oracleResponse.success) {\n return {\n success: false,\n scope,\n identifier: issueLabel,\n error: oracleResponse.error || \"Oracle analysis failed\",\n suggestion: \"Check that the Oracle agent is configured correctly.\",\n };\n }\n\n const parsed = parseOracleResponse(oracleResponse.content || \"\");\n const findings = countFindings(parsed);\n const recommendedAgents = selectAgentsForReview(findings);\n const summary = buildSummary(findings, recommendedAgents);\n\n const reviewFolderPath = await saveReviewFolder(\n reviewsDir,\n scope,\n issueLabel,\n issuesContent,\n parsed,\n oracleResponse.content || \"\",\n findings,\n recommendedAgents,\n summary\n );\n\n return {\n success: true,\n scope,\n identifier: issueLabel,\n findings,\n recommendedAgents,\n reviewFolderPath,\n summary,\n };\n}\n\nasync function loadIssues(\n ctx: PluginInput,\n config: SdlcConfig,\n issueNumbers: number[]\n): Promise<Array<{ id: string; content: string | null }>> {\n const results: Array<{ id: string; content: string | null }> = [];\n\n for (const issueNumber of issueNumbers) {\n const issue = await fetchIssue(ctx, config, issueNumber);\n if (!issue) continue;\n\n results.push({\n id: `#${issue.number}`,\n content: formatIssueContent(issue.title, issue.body),\n });\n }\n\n return results;\n}\n\nfunction formatIssueContent(title: string, body: string | null): string {\n const content = body?.trim() ? body.trim() : \"(empty)\";\n return `# ${title}\\n\\n${content}`;\n}\n\nasync function ensureDirectory(dir: string): Promise<void> {\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n}\n\nfunction buildOraclePrompt(\n scope: ReviewScope,\n identifier: string,\n stories: Array<{ id: string; content: string | null }>,\n architecture: string | null\n): string {\n const issuesText = stories\n .map((s) => `## Issue ${s.id}\\n\\n${s.content || \"(empty)\"}`)\n .join(\"\\n\\n---\\n\\n\");\n\n const scopeDescription =\n scope === \"multi-issue\"\n ? `Issues ${identifier} - Review ALL issues for issues AND cross-issue patterns`\n : `Issue ${identifier} - Deep dive focused review`;\n\n return `You are a security, logic, and performance expert conducting a \"party review\" of GitHub issues BEFORE development begins.\n\n**Your Role**: Find issues while they're cheap to fix (in markdown, not code).\n\n**Focus Areas**:\n1. 🔒 **Security Gaps**: Missing auth/authorization, input validation, data exposure risks\n2. 🧠 **Logic Gaps**: Edge cases not covered, error scenarios missing, validation rules incomplete\n3. ✨ **Best Practice Flaws**: Anti-patterns, testing strategy gaps, accessibility concerns\n4. ⚡ **Performance Issues**: N+1 queries, missing caching, large data handling\n\n**Scope**: ${scopeDescription}\n\n**Architecture Context**:\n${architecture || \"(No architecture documented)\"}\n\n**Issues to Review**:\n${issuesText}\n\n**Output Format** (JSON):\n{\n \"summary\": {\n \"totalIssues\": number,\n \"highSeverity\": number,\n \"mediumSeverity\": number,\n \"lowSeverity\": number,\n \"recommendation\": \"string\"\n },\n ${\n scope === \"multi-issue\"\n ? `\"issueFindings\": [\n {\n \"issueId\": \"string\",\n \"title\": \"string\",\n \"findings\": {\n \"security\": [\n {\n \"id\": \"unique-id\",\n \"severity\": \"high\" | \"medium\" | \"low\",\n \"title\": \"Brief title\",\n \"description\": \"What's wrong\",\n \"impact\": \"Why it matters\",\n \"suggestion\": \"How to fix\"\n }\n ],\n \"logic\": [...],\n \"bestPractices\": [...],\n \"performance\": [...]\n }\n }\n ],\n \"crossIssueIssues\": [\n {\n \"id\": \"unique-id\",\n \"category\": \"security\" | \"logic\" | \"bestPractices\" | \"performance\",\n \"severity\": \"high\" | \"medium\" | \"low\",\n \"title\": \"Pattern or issue across multiple issues\",\n \"description\": \"Details\",\n \"affectedIssues\": [\"#12\", \"#34\"],\n \"suggestion\": \"How to address\"\n }\n ]`\n : `\"findings\": {\n \"security\": [\n {\n \"id\": \"unique-id\",\n \"severity\": \"high\" | \"medium\" | \"low\",\n \"title\": \"Brief title\",\n \"description\": \"What's wrong\",\n \"impact\": \"Why it matters\",\n \"suggestion\": \"How to fix (be specific)\"\n }\n ],\n \"logic\": [...],\n \"bestPractices\": [...],\n \"performance\": [...]\n }`\n }\n}\n\n**Instructions**:\n- Be thorough but practical\n- Prioritize high-impact issues\n- Provide actionable suggestions\n- Flag missing requirements as logic gaps`;\n}\n\ninterface OracleResult {\n success: boolean;\n content?: string;\n error?: string;\n}\n\nasync function spawnOracleAndWait(\n ctx: PluginInput,\n config: SdlcConfig,\n prompt: string,\n _forceAdvancedModel?: boolean\n): Promise<OracleResult> {\n try {\n const createResult = await ctx.client.session.create({\n body: {\n title: \"Party Review - Oracle Analysis\",\n },\n });\n\n if (!createResult.data?.id) {\n return { success: false, error: \"Failed to create Oracle session\" };\n }\n\n const sessionId = createResult.data.id;\n\n const promptResult = await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: parseModelConfig(config.models.oracle),\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n if (!promptResult.data) {\n return { success: false, error: \"No response from Oracle\" };\n }\n\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n return { success: false, error: \"No messages in Oracle session\" };\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const content = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n return { success: true, content };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n return { success: false, error: `Oracle spawn failed: ${message}` };\n }\n}\n\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"openai\", modelID: modelID || modelString };\n}\n\nasync function saveReviewFolder(\n reviewsDir: string,\n scope: ReviewScope,\n identifier: string,\n stories: Array<{ id: string; content: string | null }>,\n parsed: ParsedOracleResponse,\n oracleAnalysis: string,\n findings: FindingCounts,\n recommendedAgents: AgentRecommendation[],\n summaryText: string\n): Promise<string> {\n const date = new Date().toISOString().split(\"T\")[0];\n const folderName = `party-review-${scope}-${identifier.replace(/[^\\d#]+/g, \"-\")}-${date}`;\n const scopeLabel = scope === \"multi-issue\" ? \"Issues\" : \"Issue\";\n const folderPath = join(reviewsDir, folderName);\n\n await ensureDirectory(folderPath);\n\n const storyList = stories.map((s) => s.id).join(\", \");\n const { summary } = parsed;\n\n const markdown = `# Party Review: ${scopeLabel} ${identifier}\n\n**Date**: ${date}\n**Reviewer**: Oracle (Party Mode)\n**Issues Reviewed**: ${storyList}\n\n---\n\n## Executive Summary\n\n- **Total Issues**: ${summary.totalIssues}\n- **High Severity**: ${summary.highSeverity} issues (MUST address)\n- **Medium Severity**: ${summary.mediumSeverity} issues (SHOULD address)\n- **Low Severity**: ${summary.lowSeverity} issues (NICE to address)\n\n**Recommendation**: ${summary.recommendation}\n\n---\n\n## Findings\n\n${formatFindings(parsed)}\n\n---\n\n## Appendix: Oracle's Full Analysis\n\n<details>\n<summary>Click to expand detailed reasoning</summary>\n\n${oracleAnalysis}\n\n</details>\n`;\n\n const fullData: Phase1FullData = {\n success: true,\n scope,\n identifier,\n findings,\n recommendedAgents,\n reviewFolderPath: folderPath,\n summary: summaryText,\n storiesContent: stories,\n oracleAnalysis,\n };\n\n await writeFile(join(folderPath, \"review.md\"), markdown, \"utf-8\");\n await writeFile(join(folderPath, \"analysis.json\"), JSON.stringify(fullData, null, 2), \"utf-8\");\n\n return folderPath;\n}\n\nfunction formatFindings(parsed: ParsedOracleResponse): string {\n let output = \"\";\n\n const categoryIcons: Record<string, string> = {\n security: \"🔒\",\n logic: \"🧠\",\n bestPractices: \"✨\",\n performance: \"⚡\",\n };\n\n if (parsed.findings) {\n for (const [category, findings] of Object.entries(parsed.findings)) {\n if (findings && findings.length > 0) {\n output += `### ${categoryIcons[category] || \"\"} ${formatCategoryName(category)} (${findings.length} issues)\\n\\n`;\n for (const finding of findings) {\n output += `#### [${finding.severity.toUpperCase()}] ${finding.title}\\n`;\n output += `**Finding**: ${finding.description}\\n`;\n output += `**Impact**: ${finding.impact}\\n`;\n output += `**Suggestion**: ${finding.suggestion}\\n`;\n output += \"**Decision**: [ ] Accept [ ] Defer [ ] Reject\\n\\n\";\n }\n }\n }\n }\n\n if (parsed.issueFindings) {\n for (const issue of parsed.issueFindings) {\n output += `### Issue ${issue.issueId}: ${issue.title}\\n\\n`;\n for (const [category, findings] of Object.entries(issue.findings)) {\n const typedFindings = findings as FindingDetail[];\n if (typedFindings.length === 0) continue;\n\n output += `#### ${formatCategoryName(category as FindingCategory)} (${typedFindings.length})\\n\\n`;\n\n for (const finding of typedFindings) {\n output += `- [${finding.severity}] ${finding.title}\\n`;\n output += ` - ${finding.description}\\n`;\n output += ` - Impact: ${finding.impact}\\n`;\n output += ` - Suggestion: ${finding.suggestion}\\n\\n`;\n }\n }\n }\n }\n\n if (parsed.crossIssueIssues && parsed.crossIssueIssues.length > 0) {\n output += \"### Cross-Issue Issues\\n\\n\";\n for (const issue of parsed.crossIssueIssues) {\n output += `- [${issue.severity}] ${issue.title}\\n`;\n output += ` - ${issue.description}\\n`;\n output += ` - Affected Issues: ${issue.affectedIssues.join(\", \")}\\n`;\n output += ` - Suggestion: ${issue.suggestion}\\n\\n`;\n }\n }\n\n return output || \"No findings detected.\";\n}\n\nfunction formatCategoryName(category: string): string {\n const names: Record<string, string> = {\n security: \"Security Issues\",\n logic: \"Logic Issues\",\n bestPractices: \"Best Practices\",\n performance: \"Performance Issues\",\n };\n return names[category] || category;\n}\n\nfunction buildSummary(findings: FindingCounts, agents: AgentRecommendation[]): string {\n const agentList = agents\n .filter((a) => a.priority !== \"optional\")\n .map((a) => a.agent)\n .join(\", \");\n\n return `Found ${findings.total} issues (${findings.high} high, ${findings.medium} medium, ${findings.low} low). Recommended agents: ${agentList || \"none\"}.`;\n}\n","import type { BmadAgentType } from \"../../shared/types.js\";\n\nexport interface AgentAnalysis {\n agent: BmadAgentType;\n perspective: string;\n findings: {\n agreements: string[];\n concerns: string[];\n suggestions: string[];\n };\n crossStoryPatterns: Array<{\n pattern: string;\n affectedStories: string[];\n recommendation: string;\n }>;\n prioritizedIssues: Array<{\n findingId: string;\n agentPriority: \"critical\" | \"important\" | \"minor\";\n rationale: string;\n }>;\n summary: string;\n}\n\nexport interface ConsensusPoint {\n topic: string;\n agents: BmadAgentType[];\n position: string;\n}\n\nexport interface DebatePoint {\n topic: string;\n positions: Array<{\n agent: BmadAgentType;\n position: string;\n }>;\n}\n\nexport interface AggregatedPriority {\n findingId: string;\n votes: Partial<Record<BmadAgentType, \"critical\" | \"important\" | \"minor\">>;\n consensusLevel: \"strong\" | \"moderate\" | \"disputed\";\n averagePriority: \"critical\" | \"important\" | \"minor\";\n}\n\nexport interface SynthesizedResult {\n agentAnalyses: AgentAnalysis[];\n consensusPoints: ConsensusPoint[];\n debatePoints: DebatePoint[];\n aggregatedPriorities: AggregatedPriority[];\n}\n\nexport function synthesizeAgentResponses(analyses: AgentAnalysis[]): SynthesizedResult {\n const consensusPoints = findConsensusPoints(analyses);\n const debatePoints = findDebatePoints(analyses);\n const aggregatedPriorities = aggregatePriorities(analyses);\n\n return {\n agentAnalyses: analyses,\n consensusPoints,\n debatePoints,\n aggregatedPriorities,\n };\n}\n\nfunction calculateConsensusThreshold(totalAgents: number): number {\n const minimumAgents = 2;\n const proportionalThreshold = Math.ceil(totalAgents * 0.5);\n return Math.max(minimumAgents, proportionalThreshold);\n}\n\nfunction findConsensusPoints(analyses: AgentAnalysis[]): ConsensusPoint[] {\n const concernMap = new Map<string, { agents: BmadAgentType[]; positions: string[] }>();\n\n for (const analysis of analyses) {\n for (const concern of analysis.findings.concerns) {\n const key = normalizeForComparison(concern);\n const existing = concernMap.get(key) || { agents: [], positions: [] };\n existing.agents.push(analysis.agent);\n existing.positions.push(concern);\n concernMap.set(key, existing);\n }\n\n for (const agreement of analysis.findings.agreements) {\n const key = normalizeForComparison(agreement);\n const existing = concernMap.get(key) || { agents: [], positions: [] };\n existing.agents.push(analysis.agent);\n existing.positions.push(agreement);\n concernMap.set(key, existing);\n }\n }\n\n const consensusThreshold = calculateConsensusThreshold(analyses.length);\n const consensusPoints: ConsensusPoint[] = [];\n\n for (const [_, data] of concernMap) {\n if (data.agents.length >= consensusThreshold) {\n consensusPoints.push({\n topic: data.positions[0],\n agents: data.agents,\n position: data.positions[0],\n });\n }\n }\n\n return consensusPoints;\n}\n\nfunction findDebatePoints(analyses: AgentAnalysis[]): DebatePoint[] {\n const debatePoints: DebatePoint[] = [];\n const processedPairs = new Set<string>();\n\n for (let i = 0; i < analyses.length; i++) {\n for (let j = i + 1; j < analyses.length; j++) {\n const agent1 = analyses[i];\n const agent2 = analyses[j];\n const pairKey = `${agent1.agent}-${agent2.agent}`;\n\n if (processedPairs.has(pairKey)) continue;\n processedPairs.add(pairKey);\n\n const conflictingPriorities = findConflictingPriorities(agent1, agent2);\n for (const conflict of conflictingPriorities) {\n debatePoints.push({\n topic: `Priority disagreement on ${conflict.findingId}`,\n positions: [\n { agent: agent1.agent, position: `${conflict.priority1}: ${conflict.rationale1}` },\n { agent: agent2.agent, position: `${conflict.priority2}: ${conflict.rationale2}` },\n ],\n });\n }\n }\n }\n\n return debatePoints;\n}\n\ninterface PriorityConflict {\n findingId: string;\n priority1: string;\n rationale1: string;\n priority2: string;\n rationale2: string;\n}\n\nfunction findConflictingPriorities(\n agent1: AgentAnalysis,\n agent2: AgentAnalysis\n): PriorityConflict[] {\n const conflicts: PriorityConflict[] = [];\n const priorityOrder = { critical: 0, important: 1, minor: 2 };\n\n for (const issue1 of agent1.prioritizedIssues) {\n const matchingIssue = agent2.prioritizedIssues.find((i) =>\n i.findingId.toLowerCase().includes(issue1.findingId.toLowerCase())\n );\n\n if (matchingIssue) {\n const diff = Math.abs(\n priorityOrder[issue1.agentPriority] - priorityOrder[matchingIssue.agentPriority]\n );\n if (diff >= 2) {\n conflicts.push({\n findingId: issue1.findingId,\n priority1: issue1.agentPriority,\n rationale1: issue1.rationale,\n priority2: matchingIssue.agentPriority,\n rationale2: matchingIssue.rationale,\n });\n }\n }\n }\n\n return conflicts;\n}\n\nfunction aggregatePriorities(analyses: AgentAnalysis[]): AggregatedPriority[] {\n const priorityMap = new Map<\n string,\n { votes: Partial<Record<BmadAgentType, \"critical\" | \"important\" | \"minor\">>; count: number }\n >();\n\n for (const analysis of analyses) {\n for (const issue of analysis.prioritizedIssues) {\n const existing = priorityMap.get(issue.findingId) || { votes: {}, count: 0 };\n existing.votes[analysis.agent] = issue.agentPriority;\n existing.count++;\n priorityMap.set(issue.findingId, existing);\n }\n }\n\n const aggregated: AggregatedPriority[] = [];\n for (const [findingId, data] of priorityMap) {\n const votes = Object.values(data.votes);\n const consensusLevel = calculateConsensusLevel(votes);\n const averagePriority = calculateAveragePriority(votes);\n\n aggregated.push({\n findingId,\n votes: data.votes,\n consensusLevel,\n averagePriority,\n });\n }\n\n return aggregated;\n}\n\nfunction calculateConsensusLevel(\n votes: Array<\"critical\" | \"important\" | \"minor\">\n): \"strong\" | \"moderate\" | \"disputed\" {\n if (votes.length <= 1) return \"strong\";\n\n const uniqueVotes = new Set(votes);\n if (uniqueVotes.size === 1) return \"strong\";\n if (uniqueVotes.size === 2) return \"moderate\";\n return \"disputed\";\n}\n\nfunction calculateAveragePriority(\n votes: Array<\"critical\" | \"important\" | \"minor\">\n): \"critical\" | \"important\" | \"minor\" {\n if (votes.length === 0) return \"minor\";\n\n const priorityOrder = { critical: 0, important: 1, minor: 2 };\n const sum = votes.reduce((acc, v) => acc + priorityOrder[v], 0);\n const avg = sum / votes.length;\n\n if (avg < 0.5) return \"critical\";\n if (avg < 1.5) return \"important\";\n return \"minor\";\n}\n\nfunction normalizeForComparison(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^\\w\\s]/g, \"\")\n .split(/\\s+/)\n .slice(0, 5)\n .join(\" \");\n}\n\nexport function parseAgentResponse(responseText: string | null | undefined): AgentAnalysis | null {\n if (!responseText || typeof responseText !== \"string\") {\n return null;\n }\n\n try {\n const jsonMatch = responseText.match(/\\{[\\s\\S]*\\}/);\n if (!jsonMatch) return null;\n\n const parsed = JSON.parse(jsonMatch[0]) as AgentAnalysis;\n\n if (!parsed.agent || !parsed.findings) return null;\n\n return {\n agent: parsed.agent,\n perspective: parsed.perspective || \"\",\n findings: {\n agreements: parsed.findings.agreements || [],\n concerns: parsed.findings.concerns || [],\n suggestions: parsed.findings.suggestions || [],\n },\n crossStoryPatterns: parsed.crossStoryPatterns || [],\n prioritizedIssues: parsed.prioritizedIssues || [],\n summary: parsed.summary || \"\",\n };\n } catch {\n return null;\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { readFile, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type {\n AgentAnalysis,\n BmadAgentType,\n Phase1FullData,\n SdlcConfig,\n} from \"../../shared/types.js\";\nimport { getRecommendedAgentTypes } from \"../utils/agent-selector.js\";\nimport { getPersona, loadPersonas } from \"../utils/persona-loader.js\";\nimport {\n type SynthesizedResult,\n parseAgentResponse,\n synthesizeAgentResponses,\n} from \"../utils/response-synthesizer.js\";\n\nexport interface Phase2ConsultResult {\n success: boolean;\n identifier: string;\n reviewFolderPath?: string;\n error?: string;\n suggestion?: string;\n\n agentAnalyses?: AgentAnalysis[];\n consensusPoints?: SynthesizedResult[\"consensusPoints\"];\n debatePoints?: SynthesizedResult[\"debatePoints\"];\n aggregatedPriorities?: SynthesizedResult[\"aggregatedPriorities\"];\n summary?: string;\n}\n\nexport function createStoryReviewConsultTool(ctx: PluginInput, config: SdlcConfig): ToolDefinition {\n return tool({\n description: `Consult BMAD expert agents for their perspectives on review findings.\n\nThis tool performs Phase 2 of the party review workflow:\n1. Loads the full analysis from the review folder (analysis.json)\n2. Spawns parallel sessions for each recommended BMAD agent\n3. Each agent reads the analysis file and provides their perspective\n4. Waits for all agents to complete (blocking)\n5. Synthesizes responses to find consensus and debates\n\nUse this after Phase 1 (sdlc_story_review_analyze) and before Phase 3 (sdlc_party_discussion). This phase is still issue-focused; it reads the issue review folder and consults the same BMAD agents.`,\n\n args: {\n reviewFolderPath: tool.schema\n .string()\n .describe(\n \"Path to the review folder from sdlc_story_review_analyze (contains analysis.json)\"\n ),\n agents: tool.schema\n .array(tool.schema.string())\n .optional()\n .describe(\"Override agent list (default: use recommended from phase1)\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executePhase2Consultation(\n ctx,\n config,\n args.reviewFolderPath,\n args.agents\n );\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\nasync function executePhase2Consultation(\n ctx: PluginInput,\n config: SdlcConfig,\n reviewFolderPath: string,\n overrideAgents?: string[]\n): Promise<Phase2ConsultResult> {\n const analysisPath = join(reviewFolderPath, \"analysis.json\");\n\n if (!existsSync(analysisPath)) {\n return {\n success: false,\n identifier: \"\",\n error: `Analysis file not found: ${analysisPath}`,\n suggestion: \"Run sdlc_story_review_analyze first to generate the review folder\",\n };\n }\n\n let phase1: Phase1FullData;\n try {\n const analysisContent = await readFile(analysisPath, \"utf-8\");\n phase1 = JSON.parse(analysisContent);\n } catch (err) {\n const message = err instanceof Error ? err.message : \"Unknown error\";\n return {\n success: false,\n identifier: \"\",\n error: `Failed to load analysis.json: ${message}`,\n suggestion: \"Ensure the review folder contains a valid analysis.json file\",\n };\n }\n\n if (!phase1.success || !phase1.oracleAnalysis) {\n return {\n success: false,\n identifier: phase1.identifier,\n error: \"Phase 1 was not successful or missing oracle analysis\",\n suggestion: \"Run sdlc_story_review_analyze first\",\n };\n }\n\n const agents = overrideAgents\n ? (overrideAgents as BmadAgentType[])\n : getRecommendedAgentTypes(phase1.recommendedAgents || []);\n\n if (agents.length === 0) {\n return {\n success: false,\n identifier: phase1.identifier,\n error: \"No agents to consult\",\n suggestion: \"Specify agents or ensure Phase 1 has recommendations\",\n };\n }\n\n const personas = await loadPersonas();\n\n const agentPromises = agents.map((agentType) =>\n spawnAgentAndWait(ctx, config, agentType, phase1, personas)\n );\n\n const agentResults = await Promise.all(agentPromises);\n\n const successfulAnalyses = agentResults.filter((r): r is AgentAnalysis => r !== null);\n\n if (successfulAnalyses.length === 0) {\n return {\n success: false,\n identifier: phase1.identifier,\n error: \"All agent consultations failed\",\n suggestion: \"Check agent configuration and try again\",\n };\n }\n\n const synthesized = synthesizeAgentResponses(successfulAnalyses);\n\n const normalizedAnalyses = synthesized.agentAnalyses.map((analysis) => {\n const persona = getPersona(personas, analysis.agent);\n return enrichAgentAnalysis(analysis, analysis.agent, persona.name, phase1);\n });\n\n const summary = buildConsultationSummary(synthesized, agents.length);\n\n const result: Phase2ConsultResult = {\n success: true,\n identifier: phase1.identifier,\n reviewFolderPath,\n agentAnalyses: normalizedAnalyses,\n consensusPoints: synthesized.consensusPoints,\n debatePoints: synthesized.debatePoints,\n aggregatedPriorities: synthesized.aggregatedPriorities,\n summary,\n };\n\n const phase2Path = join(reviewFolderPath, \"phase2.json\");\n await writeFile(phase2Path, JSON.stringify(result, null, 2), \"utf-8\");\n\n return result;\n}\n\nasync function spawnAgentAndWait(\n ctx: PluginInput,\n config: SdlcConfig,\n agentType: BmadAgentType,\n phase1: Phase1FullData,\n personas: Map<BmadAgentType, import(\"../../shared/types.js\").BmadAgentFullPersona>\n): Promise<AgentAnalysis | null> {\n try {\n const persona = getPersona(personas, agentType);\n const prompt = buildAgentPrompt(persona, phase1);\n\n const createResult = await ctx.client.session.create({\n body: {\n title: `Party Review - ${persona.name} Analysis`,\n },\n });\n\n if (!createResult.data?.id) {\n console.warn(`[Sdlc] Failed to create session for ${agentType}`);\n return null;\n }\n\n const sessionId = createResult.data.id;\n\n await ctx.client.session.prompt({\n path: { id: sessionId },\n body: {\n model: parseModelConfig(config.models.marvin),\n parts: [{ type: \"text\", text: prompt }],\n },\n });\n\n const messagesResult = await ctx.client.session.messages({\n path: { id: sessionId },\n });\n\n const lastMessage = messagesResult.data?.at(-1);\n if (!lastMessage) {\n console.warn(`[Sdlc] No response from ${agentType}`);\n return null;\n }\n\n const textParts = lastMessage.parts?.filter((p) => p.type === \"text\") || [];\n const content = textParts.map((p) => (p as { text: string }).text).join(\"\\n\");\n\n const parsed = parseAgentResponse(content);\n if (!parsed) {\n return createFallbackAnalysis(agentType, persona.name, content);\n }\n\n return enrichAgentAnalysis(parsed, agentType, persona.name, phase1);\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Unknown error\";\n console.warn(`[Sdlc] Agent ${agentType} consultation failed: ${message}`);\n return null;\n }\n}\n\nfunction buildAgentPrompt(\n persona: import(\"../../shared/types.js\").BmadAgentFullPersona,\n phase1: Phase1FullData\n): string {\n const storiesContext = phase1.storiesContent\n ?.map((s: { id: string; content: string | null }) => {\n const preview = s.content?.substring(0, 2000) || \"(empty)\";\n const truncated = s.content && s.content.length > 2000 ? \"...[truncated]\" : \"\";\n return `Issue ${s.id}:\\n${preview}${truncated}`;\n })\n .join(\"\\n\\n\");\n\n return `You are ${persona.name}, the ${persona.title} from the BMAD team.\n\n**Your Icon**: ${persona.icon}\n**Your Expertise**: ${persona.expertise.join(\", \")}\n**Your Perspective**: ${persona.perspective}\n\n**Your Task**: Analyze the following Oracle review findings from your ${persona.type} perspective.\n\n**Issues Being Reviewed**:\n${storiesContext || \"(No issue content available)\"}\n\n**Oracle's Findings**:\n${phase1.oracleAnalysis || \"(No analysis available)\"}\n\n**Your Analysis Instructions**:\n1. Review each finding from your ${persona.perspective} perspective\n2. Note findings you agree with and why\n3. Raise any concerns specific to your expertise\n4. Suggest additional considerations\n5. Prioritize issues based on ${persona.expertise[0] || \"your expertise\"} impact\n\n **Return JSON** (MUST be valid JSON):\n {\n \"agent\": \"${persona.type}\",\n \"perspective\": \"${persona.perspective}\",\n \"findings\": {\n \"agreements\": [\"I agree with X because...\"],\n \"concerns\": [\"From my perspective, Y is concerning because...\"],\n \"suggestions\": [\"Consider also Z...\"]\n },\n \"crossStoryPatterns\": [\n { \"pattern\": \"...\", \"affectedStories\": [\"#12\"], \"recommendation\": \"...\" }\n ],\n \"prioritizedIssues\": [\n { \"findingId\": \"...\", \"agentPriority\": \"critical|important|minor\", \"rationale\": \"...\" }\n ],\n \"summary\": \"Brief 2-3 sentence summary of my analysis\"\n }`;\n}\n\nfunction enrichAgentAnalysis(\n analysis: AgentAnalysis,\n agentType: BmadAgentType,\n agentName: string,\n phase1: Phase1FullData\n): AgentAnalysis {\n const issuesAnalyzed = (phase1.storiesContent || []).map((story) => story.id);\n const analyzedAt = new Date().toISOString();\n\n return {\n ...analysis,\n agent: agentType,\n agentName: analysis.agentName || agentName,\n analyzedAt: analysis.analyzedAt || analyzedAt,\n storiesAnalyzed: analysis.storiesAnalyzed || issuesAnalyzed,\n };\n}\n\nfunction createFallbackAnalysis(\n agentType: BmadAgentType,\n agentName: string,\n rawContent: string\n): AgentAnalysis {\n return {\n agent: agentType,\n agentName,\n analyzedAt: new Date().toISOString(),\n storiesAnalyzed: [],\n perspective: `${agentName}'s perspective`,\n findings: {\n agreements: [],\n concerns: [rawContent.substring(0, 200)],\n suggestions: [],\n },\n crossStoryPatterns: [],\n prioritizedIssues: [],\n summary: `${agentName} provided analysis but response was not in expected JSON format.`,\n };\n}\n\nfunction parseModelConfig(modelString: string): { providerID: string; modelID: string } {\n const [providerID, modelID] = modelString.split(\"/\");\n return { providerID: providerID || \"anthropic\", modelID: modelID || modelString };\n}\n\nfunction buildConsultationSummary(synthesized: SynthesizedResult, totalAgents: number): string {\n const successCount = synthesized.agentAnalyses.length;\n const consensusCount = synthesized.consensusPoints.length;\n const debateCount = synthesized.debatePoints.length;\n\n return `Consulted ${successCount}/${totalAgents} agents. Found ${consensusCount} consensus points and ${debateCount} debate points.`;\n}\n","/**\n * sdlc_domain Tool (v1.0.0 Refactored)\n *\n * DOMAIN phase of TDD: Domain modeling review\n *\n * Key features:\n * - Structured domainContext with invocation gate validation\n * - Uses JSON schema validation for agent responses\n * - Integrates with debate protocol (max rounds, escalation, user override)\n * - Has VETO power to block workflow if domain integrity is compromised\n * - Uses subagent session manager with retry logic\n */\n\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport {\n type DomainAgentOutput,\n DomainAgentOutputSchema,\n type DomainViolation as SchemaDomainViolation,\n} from \"../../shared/schemas/index.js\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport type { DomainConcern, TddCycleTracker } from \"../tracker/tdd-cycle-tracker.js\";\nimport {\n checkArchitectureAlignment,\n formatArchitectureConflict,\n} from \"../utils/architecture-alignment.js\";\nimport {\n type GateValidationResult,\n formatGateFailure,\n validateDomainContext,\n} from \"../utils/invocation-gate.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\nimport { buildContextSection, loadAgentPrompt } from \"../utils/prompt-loader.js\";\nimport { runSubagentWithValidation } from \"../utils/subagent-session.js\";\n\nconst log = createPluginLogger(\"sdlc_domain\");\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Legacy context type\n */\nexport type DomainContext = \"AFTER_RED\" | \"AFTER_GREEN\" | \"PR_REVIEW\";\n\n/**\n * Structured context for AFTER_RED\n */\nexport interface DomainContextAfterRed {\n type: \"AFTER_RED\";\n test: string;\n testFile: string;\n failure: string;\n}\n\n/**\n * Structured context for AFTER_GREEN\n */\nexport interface DomainContextAfterGreen {\n type: \"AFTER_GREEN\";\n test: string;\n result: \"PASSES\" | string;\n filesModified: string[];\n}\n\n/**\n * Structured context for PR_REVIEW\n */\nexport interface DomainContextPrReview {\n type: \"PR_REVIEW\";\n files: string[];\n description: string;\n}\n\n/**\n * Union of all structured DOMAIN contexts\n */\nexport type StructuredDomainContext =\n | DomainContextAfterRed\n | DomainContextAfterGreen\n | DomainContextPrReview;\n\n/**\n * Domain violation detected by the review\n */\nexport interface DomainViolation {\n type: \"primitive_obsession\" | \"invalid_state\" | \"structural_type\" | \"parse_validate\" | \"naming\";\n location: string;\n description: string;\n suggestion: string;\n}\n\n/**\n * Arguments for sdlc_domain tool\n */\nexport interface DomainArgs {\n /** Legacy string context */\n context?: DomainContext;\n /** Legacy: path to file being reviewed */\n testOrImplementationPath?: string;\n /** Structured context (preferred) */\n domainContext?: StructuredDomainContext;\n}\n\n/**\n * Result from sdlc_domain tool\n */\nexport interface DomainResult {\n success: boolean;\n approved: boolean;\n vetoed: boolean;\n violations?: DomainViolation[];\n typesCreated?: string[];\n vetoReason?: string;\n error?: string;\n suggestion?: string;\n /** Decision from agent */\n decision?: DomainAgentOutput[\"decision\"];\n /** Gate failure message if invocation gate failed */\n gateFailure?: string;\n /** Debate round number */\n debateRound?: number;\n /** Whether escalation to user is needed */\n needsEscalation?: boolean;\n /** Active concerns from tracker */\n activeConcerns?: DomainConcern[];\n /** Validation errors if agent response was invalid */\n validationErrors?: string[];\n}\n\n// ============================================================================\n// Tool Definition\n// ============================================================================\n\n/**\n * Create the sdlc_domain tool\n */\nexport function createDomainTool(\n ctx: PluginInput,\n config: SdlcConfig,\n tracker: TddCycleTracker\n): ToolDefinition {\n return tool({\n description: `DOMAIN phase of TDD: Review for domain integrity and create types.\n\nThis tool spawns a domain expert agent that:\n- Reviews tests/implementations for domain violations\n- Creates domain types BEFORE implementation\n- Has VETO power to block workflow if domain integrity is compromised\n- Can edit type definition files only\n\n## Invocation Gate\n\nYou MUST provide structured context via the domainContext parameter:\n\n### AFTER_RED\n\\`\\`\\`json\n{\n \"type\": \"AFTER_RED\",\n \"test\": \"LoginService > authenticate > should return user\",\n \"testFile\": \"src/auth/__tests__/login.test.ts\",\n \"failure\": \"Cannot find module '../LoginService'\"\n}\n\\`\\`\\`\n\n### AFTER_GREEN\n\\`\\`\\`json\n{\n \"type\": \"AFTER_GREEN\",\n \"test\": \"LoginService > authenticate > should return user\",\n \"result\": \"PASSES\",\n \"filesModified\": [\"src/auth/LoginService.ts\"]\n}\n\\`\\`\\`\n\n### PR_REVIEW\n\\`\\`\\`json\n{\n \"type\": \"PR_REVIEW\",\n \"files\": [\"src/auth/LoginService.ts\", \"src/auth/types.ts\"],\n \"description\": \"Add authentication feature\"\n}\n\\`\\`\\`\n\n## Debate Protocol\n\nDomain can VETO up to ${config.tdd?.debateRounds ?? 2} times. After max debates:\n- Issue escalates to user for decision\n- User can override with reason\n- Override allows workflow to continue`,\n\n args: {\n domainContext: tool.schema\n .object({\n type: tool.schema.enum([\"AFTER_RED\", \"AFTER_GREEN\", \"PR_REVIEW\"]),\n // AFTER_RED fields\n test: tool.schema.string().optional(),\n testFile: tool.schema.string().optional(),\n failure: tool.schema.string().optional(),\n // AFTER_GREEN fields\n result: tool.schema.string().optional(),\n filesModified: tool.schema.array(tool.schema.string()).optional(),\n // PR_REVIEW fields\n files: tool.schema.array(tool.schema.string()).optional(),\n description: tool.schema.string().optional(),\n })\n .optional()\n .describe(\"Structured context for the DOMAIN phase (preferred)\"),\n\n // Legacy parameters for backwards compatibility\n context: tool.schema\n .enum([\"AFTER_RED\", \"AFTER_GREEN\", \"PR_REVIEW\"])\n .optional()\n .describe(\"(Legacy) When the review is happening\"),\n testOrImplementationPath: tool.schema\n .string()\n .optional()\n .describe(\"(Legacy) Path to the file to review\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executeDomainPhase(ctx, config, tracker, args as DomainArgs);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\n// ============================================================================\n// Execution Logic\n// ============================================================================\n\nasync function executeDomainPhase(\n ctx: PluginInput,\n config: SdlcConfig,\n tracker: TddCycleTracker,\n args: DomainArgs\n): Promise<DomainResult> {\n // Convert legacy args to structured context if needed\n const structuredContext = args.domainContext || convertLegacyArgs(args, tracker);\n\n // Validate invocation gate\n const gateResult = validateDomainGate(structuredContext);\n if (!gateResult.valid) {\n log.warn(\"DOMAIN invocation gate failed\", { error: gateResult.error });\n return {\n success: false,\n approved: false,\n vetoed: false,\n error: gateResult.error,\n gateFailure: formatGateFailure(\"DOMAIN\", gateResult),\n suggestion: \"Provide structured domainContext with required fields\",\n };\n }\n\n // Check architecture alignment (for non-PR_REVIEW contexts)\n if (structuredContext!.type !== \"PR_REVIEW\") {\n const architectureCheck = await checkArchitectureAlignment({\n projectDir: ctx.directory,\n requestedWork: `DOMAIN phase review (${structuredContext!.type})`,\n });\n\n if (!architectureCheck.success && architectureCheck.conflict) {\n return {\n success: false,\n approved: false,\n vetoed: true,\n error: formatArchitectureConflict(architectureCheck.conflict),\n suggestion: architectureCheck.suggestion,\n };\n }\n }\n\n // Determine TDD context\n const tddContext: \"red\" | \"green\" = structuredContext!.type === \"AFTER_RED\" ? \"red\" : \"green\";\n\n // Check and update cycle state for non-PR_REVIEW\n if (structuredContext!.type !== \"PR_REVIEW\") {\n const canStart = tracker.canTransitionTo(\"domain\");\n if (!canStart.valid) {\n return {\n success: false,\n approved: false,\n vetoed: false,\n error: canStart.reason,\n suggestion: `Complete the ${tddContext.toUpperCase()} phase before DOMAIN review`,\n };\n }\n\n // Start DOMAIN phase in tracker\n const startResult = tracker.startDomain(tddContext);\n if (!startResult.success) {\n return {\n success: false,\n approved: false,\n vetoed: false,\n error: startResult.error,\n };\n }\n }\n\n // Build prompt\n const debateRound = tracker.getDebateRound();\n const activeConcerns = tracker.getActiveConcerns();\n const prompt = await buildDomainPrompt(\n ctx.directory,\n structuredContext!,\n debateRound,\n activeConcerns\n );\n\n // Spawn DOMAIN agent with JSON validation\n const result = await runSubagentWithValidation(\n ctx,\n config,\n {\n title: `TDD DOMAIN Phase - ${structuredContext!.type} Review`,\n subagentType: \"domain\",\n maxRetries: 2,\n },\n prompt,\n DomainAgentOutputSchema\n );\n\n // Handle validation failure\n if (!result.success) {\n log.warn(\"DOMAIN agent validation failed\", {\n error: result.error,\n validationErrors: result.validationErrors,\n });\n return {\n success: false,\n approved: false,\n vetoed: false,\n error: result.error,\n suggestion: \"Agent response did not match expected JSON schema\",\n validationErrors: result.validationErrors,\n };\n }\n\n const data = result.data;\n\n // Handle gate failure reported by agent\n if (data.gateFailure) {\n return {\n success: false,\n approved: false,\n vetoed: false,\n error: \"Agent reported gate failure\",\n gateFailure: data.gateFailure.reason,\n suggestion: data.gateFailure.suggestion,\n };\n }\n\n // Handle user input request\n if (data.awaitingUserInput) {\n return {\n success: false,\n approved: false,\n vetoed: false,\n error: \"Agent awaiting user input\",\n suggestion: data.awaitingUserInput.question,\n };\n }\n\n // Handle VETO decision\n if (data.decision === \"VETO\") {\n const concerns = convertToDomainConcerns(data.violations || []);\n const vetoReason = data.vetoReason || \"Domain concern raised\";\n\n // Update tracker - this may trigger escalation\n if (structuredContext!.type !== \"PR_REVIEW\") {\n const vetoResult = tracker.vetoDomain(vetoReason, concerns);\n\n if (vetoResult.escalate) {\n return {\n success: true,\n approved: false,\n vetoed: true,\n decision: \"VETO\",\n vetoReason,\n violations: convertToViolations(data.violations || []),\n debateRound: tracker.getDebateRound(),\n needsEscalation: true,\n activeConcerns: tracker.getActiveConcerns(),\n suggestion:\n \"Max debate rounds reached. User must decide: fix the concerns or override to continue.\",\n };\n }\n }\n\n return {\n success: true,\n approved: false,\n vetoed: true,\n decision: \"VETO\",\n vetoReason,\n violations: convertToViolations(data.violations || []),\n debateRound: tracker.getDebateRound(),\n activeConcerns: tracker.getActiveConcerns(),\n suggestion: \"Address the domain concerns and run DOMAIN review again\",\n };\n }\n\n // Handle APPROVED decision\n if (structuredContext!.type !== \"PR_REVIEW\") {\n tracker.approveDomain(data.typesCreated || []);\n }\n\n return {\n success: true,\n approved: true,\n vetoed: false,\n decision: \"APPROVED\",\n typesCreated: data.typesCreated,\n debateRound: tracker.getDebateRound(),\n };\n}\n\n/**\n * Convert legacy arguments to structured context\n */\nfunction convertLegacyArgs(\n args: DomainArgs,\n tracker: TddCycleTracker\n): StructuredDomainContext | undefined {\n if (!args.context) return undefined;\n\n const filePath = args.testOrImplementationPath || \"unknown\";\n\n switch (args.context) {\n case \"AFTER_RED\": {\n const redOutput = tracker.getLastRedOutput();\n return {\n type: \"AFTER_RED\",\n test: redOutput?.testName || \"unknown\",\n testFile: redOutput?.testFile || filePath,\n failure: redOutput?.failureMessage || \"unknown\",\n };\n }\n\n case \"AFTER_GREEN\":\n return {\n type: \"AFTER_GREEN\",\n test: \"unknown\",\n result: \"PASSES\",\n filesModified: [filePath],\n };\n\n case \"PR_REVIEW\":\n return {\n type: \"PR_REVIEW\",\n files: [filePath],\n description: \"PR review\",\n };\n }\n}\n\n/**\n * Build the complete prompt for the DOMAIN agent\n */\nasync function buildDomainPrompt(\n projectDir: string,\n context: StructuredDomainContext,\n debateRound: number,\n activeConcerns: DomainConcern[]\n): Promise<string> {\n // Load base prompt\n const loaded = await loadAgentPrompt(\"domain\", projectDir);\n let prompt = loaded.content;\n\n // Add debate status if applicable\n if (debateRound > 1 || activeConcerns.length > 0) {\n prompt += `\\n\\n## Debate Status\\n\\n**Round:** ${debateRound}\\n`;\n if (activeConcerns.length > 0) {\n prompt += \"**Active Concerns:**\\n\";\n for (const concern of activeConcerns) {\n const status = concern.resolved ? `Resolved (${concern.resolution})` : \"Unresolved\";\n prompt += `- [${concern.type}] ${concern.description} - ${status}\\n`;\n }\n }\n prompt += \"\\n\";\n }\n\n // Add context-specific section\n switch (context.type) {\n case \"AFTER_RED\":\n prompt += buildContextSection(\"AFTER_RED\", {\n instructions: \"Review the test that was just written BEFORE implementation begins.\",\n test: context.test,\n testFile: context.testFile,\n failure: context.failure,\n tasks: [\n \"Check if domain concepts are properly represented in test assertions\",\n \"Identify if the test uses semantic types or raw primitives\",\n \"Determine if new domain types should be created before implementation\",\n ],\n vetoConditions: \"VETO if the test uses primitives where domain types should exist\",\n });\n break;\n\n case \"AFTER_GREEN\":\n prompt += buildContextSection(\"AFTER_GREEN\", {\n instructions: \"Review the implementation AFTER the test passes.\",\n test: context.test,\n result: context.result,\n filesModified: context.filesModified,\n tasks: [\n \"Check if the implementation uses domain types correctly\",\n \"Look for primitive obsession patterns\",\n \"Check if invalid states can be represented\",\n \"Verify parse-don't-validate patterns are followed\",\n ],\n vetoConditions: \"VETO if domain violations are found. List required changes.\",\n });\n break;\n\n case \"PR_REVIEW\":\n prompt += buildContextSection(\"PR_REVIEW\", {\n instructions: \"Perform a comprehensive domain review for pull request.\",\n files: context.files,\n description: context.description,\n tasks: [\n \"Check all domain types for proper semantics\",\n \"Ensure ubiquitous language consistency\",\n \"Verify no domain drift has occurred\",\n \"Check for primitive obsession across the codebase\",\n ],\n vetoConditions: \"Be strict about domain integrity in PR reviews.\",\n });\n break;\n }\n\n return prompt;\n}\n\n/**\n * Convert schema violations to DomainConcern objects for tracker\n */\nfunction convertToDomainConcerns(violations: SchemaDomainViolation[]): DomainConcern[] {\n return violations.map((violation, idx) => ({\n id: `concern-${Date.now()}-${idx}`,\n type: mapViolationTypeToConcernType(violation.type),\n description: violation.description,\n suggestion: violation.suggestion,\n affectedFiles: violation.location ? [violation.location] : undefined,\n resolved: false,\n }));\n}\n\n/**\n * Map schema violation type to DomainConcern type\n */\nfunction mapViolationTypeToConcernType(\n type: SchemaDomainViolation[\"type\"]\n): \"type_safety\" | \"naming\" | \"architecture\" | \"behavior\" | \"other\" {\n switch (type) {\n case \"primitive_obsession\":\n case \"structural_type\":\n case \"parse_validate\":\n return \"type_safety\";\n case \"invalid_state\":\n return \"behavior\";\n case \"naming\":\n return \"naming\";\n default:\n return \"other\";\n }\n}\n\n/**\n * Convert schema violations to tool's DomainViolation format\n */\nfunction convertToViolations(violations: SchemaDomainViolation[]): DomainViolation[] {\n return violations.map((violation) => ({\n type: violation.type,\n location: violation.location,\n description: violation.description,\n suggestion: violation.suggestion,\n }));\n}\n\n// ============================================================================\n// Invocation Gate Validation\n// ============================================================================\n\n/**\n * Validate DOMAIN context through invocation gate protocol.\n */\nexport function validateDomainGate(context: unknown): GateValidationResult {\n // Check for missing context\n if (context === undefined || context === null) {\n return {\n valid: false,\n error: \"domainContext is required - orchestrator must provide explicit workflow state\",\n missingFields: [\"domainContext\"],\n };\n }\n\n // Run base schema validation\n const baseResult = validateDomainContext(context);\n if (!baseResult.valid) {\n return baseResult;\n }\n\n return { valid: true };\n}\n\n// Export for testing\nexport const _testExports = {\n executeDomainPhase,\n buildDomainPrompt,\n convertLegacyArgs,\n validateDomainGate,\n convertToDomainConcerns,\n convertToViolations,\n mapViolationTypeToConcernType,\n};\n","/**\n * sdlc_green Tool (v1.0.0 Refactored)\n *\n * GREEN phase of TDD: Make the failing test pass\n *\n * Key features:\n * - Structured greenContext with invocation gate validation\n * - Uses JSON schema validation for agent responses\n * - Handles ARCHITECTURE_CONFLICT responses\n * - Integrates with TDD cycle tracker and file ownership\n * - Uses subagent session manager with retry logic\n */\n\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport { type GreenAgentOutput, GreenAgentOutputSchema } from \"../../shared/schemas/index.js\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport type { TddCycleTracker } from \"../tracker/tdd-cycle-tracker.js\";\nimport {\n checkArchitectureAlignment,\n formatArchitectureConflict,\n} from \"../utils/architecture-alignment.js\";\nimport {\n type GateValidationResult,\n formatGateFailure,\n validateGreenContext,\n} from \"../utils/invocation-gate.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\nimport { buildContextSection, loadAgentPrompt } from \"../utils/prompt-loader.js\";\nimport { runSubagentWithValidation } from \"../utils/subagent-session.js\";\n\nconst log = createPluginLogger(\"sdlc_green\");\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Confirmation that RED phase is complete\n */\nexport interface RedPhaseComplete {\n test: string;\n testFile: string;\n failure: string;\n}\n\n/**\n * Confirmation that DOMAIN check passed\n */\nexport interface DomainCheckPassed {\n typesCreated: string[];\n concerns: \"none\" | string;\n}\n\n/**\n * Structured context for GREEN phase\n */\nexport interface StructuredGreenContext {\n redPhaseComplete: RedPhaseComplete;\n domainCheckPassed: DomainCheckPassed;\n}\n\n/**\n * Legacy arguments for backwards compatibility\n */\nexport interface GreenArgs {\n /** Legacy: proof from RED phase */\n redPhaseComplete?: string;\n /** Legacy: confirmation from DOMAIN phase */\n domainCheckPassed?: string;\n /** Structured context (preferred) */\n greenContext?: StructuredGreenContext;\n}\n\n/**\n * Result from sdlc_green tool\n */\nexport interface GreenResult {\n success: boolean;\n implementationFiles?: string[];\n testsPassed?: boolean;\n testResult?: GreenAgentOutput[\"testResult\"];\n error?: string;\n suggestion?: string;\n /** Gate failure message if invocation gate failed */\n gateFailure?: string;\n /** Architecture conflict details */\n architectureConflict?: string;\n /** Validation errors if agent response was invalid */\n validationErrors?: string[];\n}\n\n// ============================================================================\n// Tool Definition\n// ============================================================================\n\n/**\n * Create the sdlc_green tool\n */\nexport function createGreenTool(\n ctx: PluginInput,\n config: SdlcConfig,\n tracker: TddCycleTracker\n): ToolDefinition {\n return tool({\n description: `GREEN phase of TDD: Make the failing test pass.\n\nThis tool spawns a subagent that writes the minimum implementation to pass the test. The agent:\n- Can ONLY edit implementation files (NOT test files)\n- Must use domain types created in the DOMAIN phase\n- Writes the MINIMUM code to pass the test\n- Must run tests and confirm they pass\n\n## Invocation Gate\n\nYou MUST provide structured context via the greenContext parameter:\n\n\\`\\`\\`json\n{\n \"redPhaseComplete\": {\n \"test\": \"LoginService > authenticate > should return user\",\n \"testFile\": \"src/auth/__tests__/login.test.ts\",\n \"failure\": \"Cannot find module '../LoginService'\"\n },\n \"domainCheckPassed\": {\n \"typesCreated\": [\"Email\", \"Password\"],\n \"concerns\": \"none\"\n }\n}\n\\`\\`\\`\n\nIf domain concerns were resolved:\n\\`\\`\\`json\n{\n \"domainCheckPassed\": {\n \"typesCreated\": [\"Email\"],\n \"concerns\": \"Resolved: Changed string to Email type\"\n }\n}\n\\`\\`\\``,\n\n args: {\n greenContext: tool.schema\n .object({\n redPhaseComplete: tool.schema.object({\n test: tool.schema.string(),\n testFile: tool.schema.string(),\n failure: tool.schema.string(),\n }),\n domainCheckPassed: tool.schema.object({\n typesCreated: tool.schema.array(tool.schema.string()),\n concerns: tool.schema.string(),\n }),\n })\n .optional()\n .describe(\"Structured context for the GREEN phase (preferred)\"),\n\n // Legacy parameters for backwards compatibility\n redPhaseComplete: tool.schema\n .string()\n .optional()\n .describe(\"(Legacy) Test name and failure message from RED phase\"),\n domainCheckPassed: tool.schema\n .string()\n .optional()\n .describe(\"(Legacy) Confirmation from DOMAIN phase\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executeGreenPhase(ctx, config, tracker, args as GreenArgs);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\n// ============================================================================\n// Execution Logic\n// ============================================================================\n\nasync function executeGreenPhase(\n ctx: PluginInput,\n config: SdlcConfig,\n tracker: TddCycleTracker,\n args: GreenArgs\n): Promise<GreenResult> {\n // Convert legacy args to structured context if needed\n const structuredContext = args.greenContext || convertLegacyArgs(args, tracker);\n\n // Validate invocation gate\n const gateResult = validateGreenGate(structuredContext);\n if (!gateResult.valid) {\n log.warn(\"GREEN invocation gate failed\", { error: gateResult.error });\n return {\n success: false,\n error: gateResult.error,\n gateFailure: formatGateFailure(\"GREEN\", gateResult),\n suggestion: \"Provide structured greenContext with redPhaseComplete and domainCheckPassed\",\n };\n }\n\n // Check architecture alignment before proceeding\n const architectureCheck = await checkArchitectureAlignment({\n projectDir: ctx.directory,\n requestedWork: `GREEN phase implementation for ${structuredContext!.redPhaseComplete.test}`,\n });\n\n if (!architectureCheck.success && architectureCheck.conflict) {\n log.warn(\"Architecture conflict detected\", { conflict: architectureCheck.conflict });\n return {\n success: false,\n error: formatArchitectureConflict(architectureCheck.conflict),\n architectureConflict: formatArchitectureConflict(architectureCheck.conflict),\n suggestion: architectureCheck.suggestion,\n };\n }\n\n // Check cycle state\n const canStart = tracker.canTransitionTo(\"green\");\n if (!canStart.valid) {\n return {\n success: false,\n error: canStart.reason,\n suggestion: \"Complete RED and DOMAIN phases before GREEN\",\n };\n }\n\n // Start GREEN phase in tracker\n const startResult = tracker.startGreen();\n if (!startResult.success) {\n return {\n success: false,\n error: startResult.error,\n suggestion: \"Ensure RED and DOMAIN phases completed successfully\",\n };\n }\n\n // Get RED phase output for context (prefer tracker over args)\n const redOutput = tracker.getLastRedOutput() || {\n testName: structuredContext!.redPhaseComplete.test,\n testFile: structuredContext!.redPhaseComplete.testFile,\n failureMessage: structuredContext!.redPhaseComplete.failure,\n };\n\n // Build prompt\n const prompt = await buildGreenPrompt(ctx.directory, structuredContext!, redOutput);\n\n // Spawn GREEN agent with JSON validation\n const result = await runSubagentWithValidation(\n ctx,\n config,\n {\n title: \"TDD GREEN Phase - Make Test Pass\",\n subagentType: \"green\",\n maxRetries: 2,\n },\n prompt,\n GreenAgentOutputSchema\n );\n\n // Handle validation failure\n if (!result.success) {\n log.warn(\"GREEN agent validation failed\", {\n error: result.error,\n validationErrors: result.validationErrors,\n });\n return {\n success: false,\n error: result.error,\n suggestion: \"Agent response did not match expected JSON schema\",\n validationErrors: result.validationErrors,\n };\n }\n\n const data = result.data;\n\n // Handle gate failure reported by agent\n if (data.gateFailure) {\n return {\n success: false,\n error: \"Agent reported gate failure\",\n gateFailure: data.gateFailure.reason,\n suggestion: data.gateFailure.suggestion,\n };\n }\n\n // Handle architecture conflict reported by agent\n if (data.architectureConflict) {\n return {\n success: false,\n error: \"Agent detected architecture conflict\",\n architectureConflict: data.architectureConflict.description,\n suggestion: data.architectureConflict.suggestion,\n };\n }\n\n // Handle user input request\n if (data.awaitingUserInput) {\n return {\n success: false,\n error: \"Agent awaiting user input\",\n suggestion: data.awaitingUserInput.question,\n };\n }\n\n // Validate test result\n if (data.testResult !== \"PASS\") {\n log.warn(\"GREEN verification not PASS\", { result: data.testResult });\n return {\n success: false,\n error: `Test result was ${data.testResult}, expected PASS`,\n testResult: data.testResult,\n suggestion: \"GREEN phase tests must PASS after implementation\",\n };\n }\n\n // Complete GREEN phase in tracker\n if (data.implementationFiles) {\n tracker.completeGreen(data.implementationFiles);\n }\n\n return {\n success: true,\n implementationFiles: data.implementationFiles,\n testsPassed: true,\n testResult: data.testResult,\n };\n}\n\n/**\n * Convert legacy arguments to structured context\n */\nfunction convertLegacyArgs(\n args: GreenArgs,\n tracker: TddCycleTracker\n): StructuredGreenContext | undefined {\n // Try to use tracker state if available\n const redOutput = tracker.getLastRedOutput();\n const domainOutput = tracker.getLastDomainOutput();\n\n if (redOutput && domainOutput) {\n return {\n redPhaseComplete: {\n test: redOutput.testName,\n testFile: redOutput.testFile,\n failure: redOutput.failureMessage,\n },\n domainCheckPassed: {\n typesCreated: domainOutput.typesCreated,\n concerns: domainOutput.approved ? \"none\" : domainOutput.vetoReason || \"none\",\n },\n };\n }\n\n // Fall back to legacy string args\n if (!args.redPhaseComplete || !args.domainCheckPassed) {\n return undefined;\n }\n\n // Parse legacy strings (best effort)\n return {\n redPhaseComplete: {\n test: args.redPhaseComplete,\n testFile: \"unknown\",\n failure: args.redPhaseComplete,\n },\n domainCheckPassed: {\n typesCreated: [],\n concerns: args.domainCheckPassed,\n },\n };\n}\n\ninterface RedOutput {\n testName: string;\n testFile: string;\n failureMessage: string;\n}\n\n/**\n * Build the complete prompt for the GREEN agent\n */\nasync function buildGreenPrompt(\n projectDir: string,\n context: StructuredGreenContext,\n redOutput: RedOutput\n): Promise<string> {\n // Load base prompt\n const loaded = await loadAgentPrompt(\"green\", projectDir);\n let prompt = loaded.content;\n\n // Add context section\n prompt += buildContextSection(\"GREEN_PHASE\", {\n test: redOutput.testName,\n testFile: redOutput.testFile,\n failure: redOutput.failureMessage,\n typesAvailable:\n context.domainCheckPassed.typesCreated.length > 0\n ? context.domainCheckPassed.typesCreated\n : [\"No new types created - use existing domain types\"],\n domainStatus: context.domainCheckPassed.concerns,\n goal: \"Write the MINIMUM implementation to make the test pass. Do NOT add features the test doesn't require.\",\n });\n\n return prompt;\n}\n\n// ============================================================================\n// Invocation Gate Validation\n// ============================================================================\n\n/**\n * Validate GREEN context through invocation gate protocol.\n */\nexport function validateGreenGate(context: unknown): GateValidationResult {\n // Check for missing context\n if (context === undefined || context === null) {\n return {\n valid: false,\n error:\n \"greenContext is required - orchestrator must provide both redPhaseComplete and domainCheckPassed confirmations\",\n missingFields: [\"greenContext\"],\n };\n }\n\n // Run base schema validation\n const baseResult = validateGreenContext(context);\n if (!baseResult.valid) {\n return baseResult;\n }\n\n return { valid: true };\n}\n\n// Export for testing\nexport const _testExports = {\n executeGreenPhase,\n buildGreenPrompt,\n convertLegacyArgs,\n validateGreenGate,\n};\n","/**\n * sdlc_red Tool (v1.0.0 Refactored)\n *\n * RED phase of TDD: Write a failing test\n *\n * Key features:\n * - Structured redContext with invocation gate validation\n * - Uses JSON schema validation for agent responses\n * - Integrates with TDD cycle tracker and file ownership\n * - Uses subagent session manager with retry logic\n */\n\nimport { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport { type RedAgentOutput, RedAgentOutputSchema } from \"../../shared/schemas/index.js\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport type { TddCycleTracker } from \"../tracker/tdd-cycle-tracker.js\";\nimport {\n type RedContext as GateRedContext,\n type GateValidationResult,\n formatGateFailure,\n validateRedContext,\n} from \"../utils/invocation-gate.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\nimport { buildContextSection, loadAgentPrompt } from \"../utils/prompt-loader.js\";\nimport { runSubagentWithValidation } from \"../utils/subagent-session.js\";\n\nconst log = createPluginLogger(\"sdlc_red\");\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/**\n * Legacy context type for backwards compatibility\n */\nexport type RedContext = \"FIRST_TEST\" | \"CONTINUING\" | \"DRILL_DOWN\";\n\n/**\n * Structured context for FIRST_TEST\n */\nexport interface RedContextFirstTest {\n type: \"FIRST_TEST\";\n acceptanceCriteria: string[];\n issueNumber?: number;\n}\n\n/**\n * Structured context for CONTINUING\n */\nexport interface RedContextContinuing {\n type: \"CONTINUING\";\n previousTest: string;\n previousTestStatus: \"PASSES\";\n refactoringDone: string;\n nextCriteria: string;\n}\n\n/**\n * Structured context for DRILL_DOWN\n */\nexport interface RedContextDrillDown {\n type: \"DRILL_DOWN\";\n parentTest: string;\n focusedBehavior: string;\n}\n\n/**\n * Union of all structured RED contexts\n */\nexport type StructuredRedContext = RedContextFirstTest | RedContextContinuing | RedContextDrillDown;\n\n/**\n * Arguments for sdlc_red tool\n */\nexport interface RedArgs {\n /** Legacy string context */\n context?: RedContext;\n /** Structured context (preferred) */\n redContext?: StructuredRedContext;\n /** Legacy: acceptance criteria for FIRST_TEST */\n acceptanceCriteria?: string;\n /** Legacy: proof from previous cycle for CONTINUING */\n previousCycleProof?: string;\n}\n\n/**\n * Result from sdlc_red tool\n */\nexport interface RedResult {\n success: boolean;\n testName?: string;\n testFile?: string;\n failureMessage?: string;\n verificationResult?: RedAgentOutput[\"verificationResult\"];\n error?: string;\n suggestion?: string;\n /** Gate failure message if invocation gate failed */\n gateFailure?: string;\n /** Validation errors if agent response was invalid */\n validationErrors?: string[];\n}\n\n// ============================================================================\n// Tool Definition\n// ============================================================================\n\n/**\n * Create the sdlc_red tool\n */\nexport function createRedTool(\n ctx: PluginInput,\n config: SdlcConfig,\n tracker: TddCycleTracker\n): ToolDefinition {\n return tool({\n description: `RED phase of TDD: Write a failing test.\n\nThis tool spawns a subagent that writes a single failing test. The agent:\n- Can ONLY edit test files (*.test.ts, *.spec.ts, __tests__/**)\n- Must write ONE focused test\n- Must run the test and capture the failure\n- Returns failure proof for the GREEN phase\n\n## Invocation Gate\n\nYou MUST provide structured context via the redContext parameter:\n\n### FIRST_TEST\n\\`\\`\\`json\n{\n \"type\": \"FIRST_TEST\",\n \"acceptanceCriteria\": [\"User can login with email and password\"]\n}\n\\`\\`\\`\n\n### CONTINUING\n\\`\\`\\`json\n{\n \"type\": \"CONTINUING\",\n \"previousTest\": \"LoginService > authenticate > should return user\",\n \"previousTestStatus\": \"PASSES\",\n \"refactoringDone\": \"Extracted validation logic\",\n \"nextCriteria\": \"Handle invalid credentials\"\n}\n\\`\\`\\`\n\n### DRILL_DOWN\n\\`\\`\\`json\n{\n \"type\": \"DRILL_DOWN\",\n \"parentTest\": \"LoginService > authenticate\",\n \"focusedBehavior\": \"Email format validation\"\n}\n\\`\\`\\``,\n\n args: {\n redContext: tool.schema\n .object({\n type: tool.schema.enum([\"FIRST_TEST\", \"CONTINUING\", \"DRILL_DOWN\"]),\n // FIRST_TEST fields\n acceptanceCriteria: tool.schema.array(tool.schema.string()).optional(),\n issueNumber: tool.schema.number().optional(),\n // CONTINUING fields\n previousTest: tool.schema.string().optional(),\n previousTestStatus: tool.schema.enum([\"PASSES\"]).optional(),\n refactoringDone: tool.schema.string().optional(),\n nextCriteria: tool.schema.string().optional(),\n // DRILL_DOWN fields\n parentTest: tool.schema.string().optional(),\n focusedBehavior: tool.schema.string().optional(),\n })\n .optional()\n .describe(\"Structured context for the RED phase (preferred)\"),\n\n // Legacy parameters for backwards compatibility\n context: tool.schema\n .enum([\"FIRST_TEST\", \"CONTINUING\", \"DRILL_DOWN\"])\n .optional()\n .describe(\"(Legacy) TDD context type\"),\n acceptanceCriteria: tool.schema\n .string()\n .optional()\n .describe(\"(Legacy) Acceptance criteria for FIRST_TEST\"),\n previousCycleProof: tool.schema\n .string()\n .optional()\n .describe(\"(Legacy) Proof from previous GREEN cycle\"),\n },\n\n async execute(args): Promise<string> {\n const result = await executeRedPhase(ctx, config, tracker, args as RedArgs);\n return JSON.stringify(result, null, 2);\n },\n });\n}\n\n// ============================================================================\n// Execution Logic\n// ============================================================================\n\nasync function executeRedPhase(\n ctx: PluginInput,\n config: SdlcConfig,\n tracker: TddCycleTracker,\n args: RedArgs\n): Promise<RedResult> {\n // Convert legacy args to structured context if needed\n const structuredContext = args.redContext || convertLegacyArgs(args);\n\n // Validate invocation gate\n const gateResult = validateRedGate(structuredContext);\n if (!gateResult.valid) {\n log.warn(\"RED invocation gate failed\", { error: gateResult.error });\n return {\n success: false,\n error: gateResult.error,\n gateFailure: formatGateFailure(\"RED\", gateResult),\n suggestion: \"Provide structured redContext with required fields\",\n };\n }\n\n // Check cycle state\n const canStart = tracker.canTransitionTo(\"red\");\n if (!canStart.valid) {\n return {\n success: false,\n error: canStart.reason,\n suggestion: \"Complete the current phase before starting RED\",\n };\n }\n\n // Start RED phase in tracker\n const startResult = tracker.startRed();\n if (!startResult.success) {\n return {\n success: false,\n error: startResult.error,\n };\n }\n\n // Load and build prompt\n const prompt = await buildRedPrompt(ctx.directory, structuredContext!);\n\n // Spawn RED agent with JSON validation\n const result = await runSubagentWithValidation(\n ctx,\n config,\n {\n title: \"TDD RED Phase - Write Failing Test\",\n subagentType: \"red\",\n maxRetries: 2,\n },\n prompt,\n RedAgentOutputSchema\n );\n\n // Handle validation failure\n if (!result.success) {\n log.warn(\"RED agent validation failed\", {\n error: result.error,\n validationErrors: result.validationErrors,\n });\n return {\n success: false,\n error: result.error,\n suggestion: \"Agent response did not match expected JSON schema\",\n validationErrors: result.validationErrors,\n };\n }\n\n const data = result.data;\n\n // Handle gate failure reported by agent\n if (data.gateFailure) {\n return {\n success: false,\n error: \"Agent reported gate failure\",\n gateFailure: data.gateFailure.reason,\n suggestion: data.gateFailure.suggestion,\n };\n }\n\n // Handle user input request\n if (data.awaitingUserInput) {\n return {\n success: false,\n error: \"Agent awaiting user input\",\n suggestion: data.awaitingUserInput.question,\n };\n }\n\n // Validate verification result\n if (data.verificationResult !== \"FAIL\") {\n log.warn(\"RED verification not FAIL\", { result: data.verificationResult });\n return {\n success: false,\n error: `Test verification result was ${data.verificationResult}, expected FAIL`,\n verificationResult: data.verificationResult,\n suggestion: \"RED phase tests must FAIL initially (implementation doesn't exist yet)\",\n };\n }\n\n // Complete RED phase in tracker\n if (data.testName && data.testFile && data.failureMessage) {\n tracker.completeRed(data.testName, data.testFile, data.failureMessage);\n }\n\n return {\n success: true,\n testName: data.testName,\n testFile: data.testFile,\n failureMessage: data.failureMessage,\n verificationResult: data.verificationResult,\n };\n}\n\n/**\n * Convert legacy arguments to structured context\n */\nfunction convertLegacyArgs(args: RedArgs): StructuredRedContext | undefined {\n if (!args.context) return undefined;\n\n switch (args.context) {\n case \"FIRST_TEST\":\n return {\n type: \"FIRST_TEST\",\n acceptanceCriteria: args.acceptanceCriteria ? [args.acceptanceCriteria] : [],\n };\n\n case \"CONTINUING\":\n return {\n type: \"CONTINUING\",\n previousTest: args.previousCycleProof || \"\",\n previousTestStatus: \"PASSES\",\n refactoringDone: \"None\",\n nextCriteria: args.acceptanceCriteria || \"\",\n };\n\n case \"DRILL_DOWN\":\n return {\n type: \"DRILL_DOWN\",\n parentTest: args.previousCycleProof || \"\",\n focusedBehavior: args.acceptanceCriteria || \"\",\n };\n }\n}\n\n/**\n * Build the complete prompt for the RED agent\n */\nasync function buildRedPrompt(projectDir: string, context: StructuredRedContext): Promise<string> {\n // Load base prompt\n const loaded = await loadAgentPrompt(\"red\", projectDir);\n let prompt = loaded.content;\n\n // Add context-specific section\n switch (context.type) {\n case \"FIRST_TEST\":\n prompt += buildContextSection(\"FIRST_TEST\", {\n instructions: \"You are writing the FIRST test for a new acceptance criterion.\",\n acceptanceCriteria: context.acceptanceCriteria,\n issueNumber: context.issueNumber?.toString(),\n goal: \"Write a single, focused test that tests the smallest behavior from the acceptance criteria. The test MUST fail because no implementation exists.\",\n });\n break;\n\n case \"CONTINUING\":\n prompt += buildContextSection(\"CONTINUING\", {\n instructions: \"You are writing the NEXT test after a successful GREEN cycle.\",\n previousTest: context.previousTest,\n previousTestStatus: context.previousTestStatus,\n refactoringDone: context.refactoringDone,\n nextCriteria: context.nextCriteria,\n goal: \"Write a test that builds on the previous implementation. Test the next smallest behavior that doesn't exist yet.\",\n });\n break;\n\n case \"DRILL_DOWN\":\n prompt += buildContextSection(\"DRILL_DOWN\", {\n instructions: \"You are breaking down a complex test into smaller, focused tests.\",\n parentTest: context.parentTest,\n focusedBehavior: context.focusedBehavior,\n goal: \"Create smaller tests that each verify ONE specific behavior. Together they should cover the same scope as the original.\",\n });\n break;\n }\n\n return prompt;\n}\n\n// ============================================================================\n// Invocation Gate Validation\n// ============================================================================\n\n/**\n * Validate RED context through invocation gate protocol.\n * Adds additional business rules on top of schema validation.\n */\nexport function validateRedGate(context: unknown): GateValidationResult {\n // Check for missing context\n if (context === undefined || context === null) {\n return {\n valid: false,\n error: \"redContext is required - orchestrator must provide explicit workflow state\",\n missingFields: [\"redContext\"],\n };\n }\n\n // Run base schema validation\n const baseResult = validateRedContext(context);\n if (!baseResult.valid) {\n return baseResult;\n }\n\n // Additional business rules\n const ctx = context as GateRedContext;\n\n // FIRST_TEST must have at least one acceptance criteria\n if (ctx.type === \"FIRST_TEST\" && ctx.acceptanceCriteria.length === 0) {\n return {\n valid: false,\n error: \"FIRST_TEST requires at least one acceptance criteria\",\n missingFields: [\"acceptanceCriteria\"],\n };\n }\n\n return { valid: true };\n}\n\n// Export for testing\nexport const _testExports = {\n executeRedPhase,\n buildRedPrompt,\n convertLegacyArgs,\n validateRedGate,\n};\n","import { type ToolDefinition, tool } from \"@opencode-ai/plugin\";\nimport type { PluginInput } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig, UpdateIssueStatusResult } from \"../../shared/types.js\";\nimport type { IssueTracker } from \"../tracker/issue-tracker.js\";\nimport { moveIssueToStatus } from \"../utils/github-issues.js\";\nimport { validateProjectBoard } from \"../utils/pm-context.js\";\n\nexport function createUpdateIssueStatusTool(\n ctx: PluginInput,\n tracker: IssueTracker,\n config: SdlcConfig\n): ToolDefinition {\n return tool({\n description: `Update a GitHub issue's status on the project board.\n\nMoves the issue to the specified status column.\n\nRequires GitHub configuration including project board number in sdlc.json.`,\n\n args: {\n issueNumber: tool.schema.number().int().positive().describe(\"GitHub issue number\"),\n status: tool.schema.string().describe(\"Target status column name\"),\n },\n\n async execute(args): Promise<string> {\n // Validate PM context with project board\n const validation = validateProjectBoard(config);\n if (!validation.valid) {\n const result: UpdateIssueStatusResult = {\n success: false,\n issueNumber: args.issueNumber,\n error: validation.error || \"Configuration error\",\n suggestion: validation.suggestion,\n };\n return JSON.stringify(result, null, 2);\n }\n\n const success = await moveIssueToStatus(ctx, config, args.issueNumber, args.status);\n\n if (success) {\n await tracker.updateIssueStatus(args.issueNumber, args.status);\n }\n\n const result: UpdateIssueStatusResult = success\n ? {\n success: true,\n issueNumber: args.issueNumber,\n newStatus: args.status,\n updatedAt: new Date().toISOString(),\n }\n : {\n success: false,\n issueNumber: args.issueNumber,\n error: \"Failed to move issue on project board\",\n suggestion: \"Check GitHub project configuration and status names\",\n };\n\n return JSON.stringify(result, null, 2);\n },\n });\n}\n","import type { PluginInput, ToolDefinition } from \"@opencode-ai/plugin\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport type { IssueTracker } from \"../tracker/issue-tracker.js\";\nimport { TddCycleTracker } from \"../tracker/tdd-cycle-tracker.js\";\nimport { createAdrTool } from \"./adr.js\";\nimport { createCheckpointCreateTool } from \"./checkpoint-create.js\";\nimport { createCheckpointDeleteTool } from \"./checkpoint-delete.js\";\nimport { createCheckpointLoadTool } from \"./checkpoint-load.js\";\nimport { createClassifyRequestTool } from \"./classify-request.js\";\nimport { createConfigTool } from \"./config.js\";\nimport { createDesignWorkflowTool } from \"./event-design-workflow.js\";\nimport { createDiscoverDomainTool } from \"./event-discover-domain.js\";\nimport { createGenerateGwtTool } from \"./event-generate-gwt.js\";\nimport { createValidateModelTool } from \"./event-validate-model.js\";\nimport { createGetContextTool } from \"./get-context.js\";\nimport { createGetIssueTool } from \"./get-issue.js\";\nimport { createListIssuesTool } from \"./list-issues.js\";\nimport { createRecallTool } from \"./memory-recall.js\";\nimport { createRememberTool } from \"./memory-remember.js\";\nimport { createMutationTool } from \"./mutation.js\";\nimport { createPartyDiscussionTool } from \"./party-discussion.js\";\nimport { createPartyReviewTool } from \"./party-review.js\";\nimport { createCreateBranchTool } from \"./pm-create-branch.js\";\nimport { createCreatePrTool, createMergePrTool, createPrStatusTool } from \"./pm-pull-request.js\";\nimport {\n createCreateWorktreeTool,\n createListWorktreesTool,\n createRemoveWorktreeTool,\n} from \"./pm-worktree.js\";\nimport { createReviewPrTool } from \"./review-pr.js\";\nimport { createStoryReviewAnalyzeTool } from \"./story-review-analyze.js\";\nimport { createStoryReviewConsultTool } from \"./story-review-consult.js\";\nimport { createDomainTool } from \"./tdd-domain.js\";\nimport { createGreenTool } from \"./tdd-green.js\";\nimport { createRedTool } from \"./tdd-red.js\";\nimport { createUpdateIssueStatusTool } from \"./update-issue-status.js\";\n\n/**\n * Create all Sdlc tools\n *\n * @param ctx - Plugin context from OpenCode\n * @param tracker - Issue tracker instance\n * @param config - Sdlc configuration\n * @returns Object containing all tool definitions\n */\nexport function createTools(\n ctx: PluginInput,\n tracker: IssueTracker,\n config: SdlcConfig\n): Record<string, ToolDefinition> {\n // Create TDD cycle tracker if TDD is enabled\n // Use a hash of the directory as a stable session identifier\n const sessionId = `tdd-${Buffer.from(ctx.directory).toString(\"base64\").slice(0, 16)}`;\n const tddTracker = new TddCycleTracker(ctx.directory, sessionId);\n\n const tools: Record<string, ToolDefinition> = {\n sdlc_get_issue: createGetIssueTool(ctx, tracker, config),\n sdlc_list_issues: createListIssuesTool(ctx, config),\n sdlc_update_issue_status: createUpdateIssueStatusTool(ctx, tracker, config),\n sdlc_get_context: createGetContextTool(tracker, config),\n sdlc_config: createConfigTool(config),\n // Mode classification tool (v1.0.0+)\n sdlc_classify_request: createClassifyRequestTool(ctx, config),\n sdlc_story_review_analyze: createStoryReviewAnalyzeTool(ctx, config),\n sdlc_story_review_consult: createStoryReviewConsultTool(ctx, config),\n sdlc_party_discussion: createPartyDiscussionTool(ctx, config),\n // Event Modeling tools - always available for optional planning\n sdlc_discover_domain: createDiscoverDomainTool(ctx, config),\n sdlc_design_workflow: createDesignWorkflowTool(ctx, config),\n sdlc_generate_gwt: createGenerateGwtTool(ctx, config),\n sdlc_validate_model: createValidateModelTool(ctx, config),\n // Review System tools\n sdlc_review_pr: createReviewPrTool(ctx, config),\n sdlc_mutation: createMutationTool(ctx, config),\n sdlc_adr: createAdrTool(ctx, config),\n sdlc_party_review: createPartyReviewTool(ctx, config),\n // Memory tools\n sdlc_remember: createRememberTool(ctx, config),\n sdlc_recall: createRecallTool(ctx, config),\n sdlc_checkpoint_create: createCheckpointCreateTool(ctx, config),\n sdlc_checkpoint_load: createCheckpointLoadTool(ctx, config),\n sdlc_checkpoint_delete: createCheckpointDeleteTool(ctx, config),\n // PM Mode tools - git workflow\n sdlc_create_branch: createCreateBranchTool(ctx, tracker, config),\n sdlc_create_worktree: createCreateWorktreeTool(ctx, config),\n sdlc_list_worktrees: createListWorktreesTool(ctx, config),\n sdlc_remove_worktree: createRemoveWorktreeTool(ctx, config),\n // PM Mode tools - pull requests\n sdlc_create_pr: createCreatePrTool(ctx, tracker, config),\n sdlc_pr_status: createPrStatusTool(ctx, config),\n sdlc_merge_pr: createMergePrTool(ctx, config),\n };\n\n // Add TDD tools if TDD is enabled\n if (config.tdd?.enabled) {\n tools.sdlc_red = createRedTool(ctx, config, tddTracker);\n tools.sdlc_green = createGreenTool(ctx, config, tddTracker);\n tools.sdlc_domain = createDomainTool(ctx, config, tddTracker);\n }\n\n return tools;\n}\n","import { existsSync } from \"node:fs\";\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\nimport { CONFIG_PATHS } from \"../../shared/constants.js\";\nimport type { IssueTrackerState, OpenCodeTodo, TrackedIssue } from \"../../shared/types.js\";\nimport { createPluginLogger } from \"../utils/plugin-logger.js\";\n\nconst log = createPluginLogger(\"issue-tracker\");\n\n/**\n * Issue tracker that persists state across sessions.\n *\n * Tracks the current GitHub issue being worked on and history of status changes.\n */\nexport class IssueTracker {\n private state: IssueTrackerState;\n private stateFilePath: string;\n private projectDir: string;\n\n constructor(projectDir: string) {\n this.projectDir = projectDir;\n this.stateFilePath = CONFIG_PATHS.stateFile;\n this.state = {\n currentIssue: null,\n sessionId: crypto.randomUUID(),\n projectDir,\n history: [],\n };\n }\n\n async initialize(): Promise<void> {\n if (existsSync(this.stateFilePath)) {\n try {\n const content = await readFile(this.stateFilePath, \"utf-8\");\n const savedState = JSON.parse(content) as IssueTrackerState;\n\n if (savedState.projectDir === this.projectDir) {\n this.state = {\n ...savedState,\n sessionId: crypto.randomUUID(),\n };\n }\n } catch {\n // Ignore errors and start fresh\n }\n }\n }\n\n async setCurrentIssue(\n issueNumber: number,\n data: Omit<TrackedIssue, \"issueNumber\">\n ): Promise<void> {\n this.state.currentIssue = { issueNumber, ...data };\n this.addHistoryEntry(issueNumber, data.status);\n await this.saveState();\n }\n\n async updateIssueStatus(issueNumber: number, status: string): Promise<void> {\n if (this.state.currentIssue?.issueNumber === issueNumber) {\n this.state.currentIssue.status = status;\n if (status.toLowerCase() === \"done\") {\n this.state.currentIssue.completedAt = new Date().toISOString();\n }\n }\n this.addHistoryEntry(issueNumber, status);\n await this.saveState();\n }\n\n async updateIssueBody(body: string | null): Promise<void> {\n if (this.state.currentIssue) {\n this.state.currentIssue.body = body;\n await this.saveState();\n }\n }\n\n getCurrentIssue(): TrackedIssue | null {\n return this.state.currentIssue;\n }\n\n async getCurrentIssueContext(): Promise<string | null> {\n if (!this.state.currentIssue) return null;\n\n const issue = this.state.currentIssue;\n const recentHistory = this.state.history\n .slice(-5)\n .map((h) => `- #${h.issueNumber}: ${h.status} at ${h.timestamp}`)\n .join(\"\\n\");\n\n return `Current Issue: #${issue.issueNumber}\\nTitle: ${issue.title}\\nStatus: ${issue.status}\\nStarted: ${issue.startedAt}\\n${issue.completedAt ? `Completed: ${issue.completedAt}` : \"\"}\\n\\nRecent Activity:\\n${recentHistory}`;\n }\n\n getSessionId(): string {\n return this.state.sessionId;\n }\n\n getHistory(): IssueTrackerState[\"history\"] {\n return this.state.history;\n }\n\n getCurrentTodos(): OpenCodeTodo[] | null {\n return this.state.currentTodos || null;\n }\n\n async setCurrentTodos(todos: OpenCodeTodo[]): Promise<void> {\n this.state.currentTodos = todos;\n await this.saveState();\n }\n\n async clearTodos(): Promise<void> {\n this.state.currentTodos = undefined;\n await this.saveState();\n }\n\n private addHistoryEntry(issueNumber: number, status: string): void {\n this.state.history.push({\n issueNumber,\n status,\n timestamp: new Date().toISOString(),\n });\n\n if (this.state.history.length > 100) {\n this.state.history = this.state.history.slice(-100);\n }\n }\n\n private async saveState(): Promise<void> {\n try {\n const dir = dirname(this.stateFilePath);\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n await writeFile(this.stateFilePath, JSON.stringify(this.state, null, 2), \"utf-8\");\n } catch (error) {\n log.warn(\"Failed to save tracker state\", { error });\n }\n }\n}\n","import { z } from \"zod\";\n\n/**\n * Zod validation schemas for OpenCode SDLC\n */\n\n// ============================================================================\n// Configuration Schemas\n// ============================================================================\n\n/**\n * Schema for provider auth method\n */\nexport const ProviderAuthMethodSchema = z.enum([\"subscription\", \"api\", \"none\"]);\n\n/**\n * Schema for subscription configuration\n */\nexport const SubscriptionSchema = z.object({\n claude: z.object({\n enabled: z.boolean(),\n authMethod: ProviderAuthMethodSchema.default(\"subscription\"),\n tier: z.enum([\"max5x\", \"max20x\", \"pro\", \"none\"]),\n }),\n openai: z.object({\n enabled: z.boolean(),\n authMethod: ProviderAuthMethodSchema.default(\"subscription\"),\n }),\n google: z.object({\n enabled: z.boolean(),\n authMethod: z.enum([\"antigravity\", \"personal\", \"api\", \"none\"]),\n }),\n githubCopilot: z.object({\n enabled: z.boolean(),\n plan: z.enum([\"free\", \"pro\", \"pro-plus\", \"business\", \"enterprise\", \"none\"]),\n enabledModels: z.array(z.string()).optional(),\n }),\n});\n\n// ============================================================================\n// Mode Configuration Schemas (v1.0.0+)\n// ============================================================================\n\n/**\n * Schema for SDLC operation modes\n */\nexport const SdlcModeSchema = z.enum([\"discover\", \"model\", \"architect\", \"pm\", \"build\"]);\n\n/**\n * Schema for modes configuration (v1.0.0+)\n */\nexport const ModesConfigSchema = z.object({\n default: SdlcModeSchema.default(\"build\").describe(\"Default mode on startup\"),\n eventModeling: z.boolean().default(true).describe(\"true=Model mode, false=PRD mode\"),\n enabled: z\n .array(SdlcModeSchema)\n .default([\"discover\", \"model\", \"architect\", \"pm\", \"build\"])\n .describe(\"Array of enabled modes\"),\n});\n\n// ============================================================================\n// Memory Configuration Schemas (v1.0.0+)\n// ============================================================================\n\n/**\n * Schema for memory backend types\n */\nexport const MemoryBackendSchema = z.enum([\"memento\", \"stateless\"]);\n\n/**\n * Schema for memory configuration (v1.0.0+)\n */\nexport const MemoryConfigSchema = z.object({\n backend: MemoryBackendSchema.default(\"stateless\").describe(\"Memory backend type\"),\n checkpointTtl: z\n .number()\n .int()\n .positive()\n .default(86400)\n .describe(\"How long to keep checkpoints in seconds\"),\n});\n\n// ============================================================================\n// GitHub Issues Configuration Schemas\n// ============================================================================\n\n/**\n * Schema for GitHub project board statuses\n */\nexport const GitHubStatusSchema = z.enum([\"Backlog\", \"Ready\", \"In progress\", \"In review\", \"Done\"]);\n\n/**\n * Schema for GitHub Issues integration configuration\n */\nexport const GitHubConfigSchema = z.object({\n owner: z.string().describe(\"GitHub repository owner (user or org)\"),\n repo: z.string().describe(\"GitHub repository name\"),\n project: z.number().optional().describe(\"GitHub Project number for board tracking\"),\n statuses: z\n .array(GitHubStatusSchema)\n .default([\"Backlog\", \"Ready\", \"In progress\", \"In review\", \"Done\"])\n .describe(\"Project board column names\"),\n});\n\n// ============================================================================\n// TDD Configuration Schemas\n// ============================================================================\n\n/**\n * Schema for TDD verbosity levels\n */\nexport const TddVerbositySchema = z.enum([\"silent\", \"brief\", \"explain\"]);\n\n/**\n * Schema for mutation testing configuration\n */\nexport const MutationTestingConfigSchema = z.object({\n enabled: z.boolean().default(false).describe(\"Enable mutation testing\"),\n requiredScore: z\n .number()\n .min(0)\n .max(100)\n .default(80)\n .describe(\"Minimum mutation score required (0-100)\"),\n});\n\n/**\n * Schema for TDD cycle enforcement configuration\n */\nexport const TddConfigSchema = z.object({\n enabled: z.boolean().default(true).describe(\"Enable TDD cycle enforcement\"),\n verbosity: TddVerbositySchema.default(\"brief\").describe(\"TDD feedback verbosity\"),\n bypassPatterns: z\n .array(z.string())\n .default([\"*.config.*\", \"*.json\", \"*.md\", \"*.yaml\", \"*.yml\"])\n .describe(\"File patterns that bypass TDD checks\"),\n mutationTesting: MutationTestingConfigSchema.default({\n enabled: false,\n requiredScore: 80,\n }),\n // New v1.0.0 fields\n domainVetoEnabled: z\n .boolean()\n .default(true)\n .describe(\"Enable domain agent veto power over type changes\"),\n debateRounds: z\n .number()\n .int()\n .min(1)\n .max(5)\n .default(2)\n .describe(\"Max debate rounds before escalation to user\"),\n requireVerification: z\n .boolean()\n .default(true)\n .describe(\"Require test output evidence before phase transitions\"),\n});\n\n// ============================================================================\n// Event Modeling Configuration Schemas\n// ============================================================================\n\n/**\n * Schema for Event Modeling integration configuration\n */\nexport const EventModelingConfigSchema = z.object({\n enabled: z.boolean().default(false).describe(\"Enable Event Modeling workflow\"),\n outputPath: z.string().default(\"docs/event-model\").describe(\"Path to event model output files\"),\n});\n\n// ============================================================================\n// Git Workflow Configuration Schemas\n// ============================================================================\n\n/**\n * Schema for Git workflow types\n */\nexport const GitWorkflowSchema = z.enum([\"standard\", \"git-spice\"]);\n\n/**\n * Schema for Git integration configuration\n */\nexport const GitConfigSchema = z.object({\n workflow: GitWorkflowSchema.default(\"standard\").describe(\"Git workflow style\"),\n requireClean: z\n .boolean()\n .default(true)\n .describe(\"Require clean working directory before operations\"),\n worktrees: z.boolean().default(false).describe(\"Enable git worktrees for parallel work\"),\n});\n\n// ============================================================================\n// Feature Flags Schemas\n// ============================================================================\n\n/**\n * Schema for SDLC feature flags (v0.3.0+)\n */\nexport const FeaturesSchema = z.object({\n orchestratorOnly: z\n .boolean()\n .default(false)\n .describe(\"Main conversation delegates all file writes to agents\"),\n todoSync: z.boolean().default(true).describe(\"Auto-sync todos with GitHub issue checkboxes\"),\n partyReview: z.boolean().default(true).describe(\"Enable party review for architecture decisions\"),\n debuggingProtocol: z.boolean().default(true).describe(\"Enable debugging protocol with Oracle\"),\n memento: z.boolean().default(false).describe(\"Enable Memento MCP for persistent memory\"),\n notifications: z.boolean().default(true).describe(\"Show in-TUI notifications\"),\n lspTools: z.boolean().default(true).describe(\"Enable LSP tools for code intelligence\"),\n});\n\n/**\n * Schema for MCP configuration (v0.3.0+)\n */\nexport const McpsSchema = z.object({\n context7: z.boolean().default(true).describe(\"Context7 for library documentation\"),\n exa: z.boolean().default(true).describe(\"Exa for web search\"),\n grepApp: z.boolean().default(true).describe(\"grep.app for code search\"),\n memento: z.boolean().default(false).describe(\"Memento for persistent memory\"),\n});\n\n// ============================================================================\n// Legacy BMAD Configuration Schema (Deprecated)\n// ============================================================================\n\n/**\n * @deprecated Use GitHubConfigSchema instead. BMAD configuration is no longer supported in v0.3.0+.\n */\nexport const LegacyBmadConfigSchema = z.object({\n defaultTrack: z.enum([\"quick-flow\", \"enterprise\"]),\n autoStatusUpdate: z.boolean(),\n parallelIssueLimit: z.number().int().min(0).max(10),\n paths: z\n .object({\n prd: z.string().nullable().optional(),\n architecture: z.string().nullable().optional(),\n })\n .optional(),\n});\n\n/**\n * @deprecated Use FeaturesSchema instead. Legacy feature flags from pre-0.3.0.\n */\nexport const LegacyFeaturesSchema = z.object({\n bmadBridge: z.boolean(),\n autoStatus: z.boolean(),\n parallelExecution: z.boolean(),\n notifications: z.boolean(),\n contextMonitor: z.boolean(),\n commentChecker: z.boolean(),\n lspTools: z.boolean(),\n autoGitOperations: z.boolean().default(false),\n todoSync: z.boolean().default(true),\n});\n\n/**\n * @deprecated Use McpsSchema instead. Legacy MCP config from pre-0.3.0.\n */\nexport const LegacyMcpsSchema = z.object({\n context7: z.boolean(),\n exa: z.boolean(),\n grepApp: z.boolean(),\n});\n\n/**\n * Schema for LLM provider\n */\nexport const LLMProviderSchema = z.enum([\"anthropic\", \"openai\", \"google\", \"github-copilot\"]);\n\n/**\n * Schema for agent routing configuration\n */\nexport const AgentRoutingSchema = z.object({\n requiresThinking: z.boolean().optional(),\n preferProvider: LLMProviderSchema.optional(),\n});\n\n/**\n * Schema for routing configuration\n */\nexport const RoutingConfigSchema = z.object({\n providerPriority: z.array(LLMProviderSchema),\n modelFamilyPriority: z.object({\n claude: z.array(LLMProviderSchema).optional(),\n gpt: z.array(LLMProviderSchema).optional(),\n gemini: z.array(LLMProviderSchema).optional(),\n }),\n agentOverrides: z.object({\n marvin: AgentRoutingSchema.optional(),\n oracle: AgentRoutingSchema.optional(),\n librarian: AgentRoutingSchema.optional(),\n frontend: AgentRoutingSchema.optional(),\n documentWriter: AgentRoutingSchema.optional(),\n multimodalLooker: AgentRoutingSchema.optional(),\n }),\n fallbackBehavior: z.object({\n autoFallback: z.boolean(),\n retryPeriodMs: z.number().min(0),\n notifyOnRateLimit: z.boolean(),\n }),\n // New v1.0.0 field\n classifierModel: z\n .string()\n .default(\"anthropic/claude-haiku\")\n .describe(\"Model for sdlc_classify_request tool (use cheapest available)\"),\n});\n\n/**\n * Schema for thinking level\n */\nexport const ThinkingLevelSchema = z.enum([\"off\", \"low\", \"medium\", \"high\"]);\n\n/**\n * Schema for agent settings (temperature and thinking level)\n */\nexport const AgentSettingsSchema = z.object({\n temperature: z.number().min(0).max(1).optional(),\n thinkingLevel: ThinkingLevelSchema.optional(),\n});\n\n/**\n * Schema for custom model definition\n */\nexport const CustomModelDefinitionSchema = z.object({\n id: z.string(),\n name: z.string(),\n provider: z.enum([\"anthropic\", \"openai\", \"google\", \"github-copilot\"]),\n description: z.string().optional(),\n capabilities: z\n .object({\n thinking: z.boolean().optional(),\n contextWindow: z.number().optional(),\n supportsTemperature: z.boolean().optional(),\n })\n .optional(),\n});\n\n/**\n * Schema for subagent model value (either a model string or \"inherit\" to use marvin model)\n */\nexport const SubagentModelSchema = z.union([\n z.string().describe(\"Full model identifier (e.g., 'anthropic/claude-sonnet-4-20250514')\"),\n z.literal(\"inherit\").describe(\"Inherit model from marvin\"),\n]);\n\n/**\n * Schema for subagent type\n */\nexport const SubagentTypeSchema = z.enum([\n // TDD agents\n \"red\",\n \"green\",\n \"domain\",\n \"refactor\",\n // Event modeling agents\n \"discovery\",\n \"workflow\",\n \"gwt\",\n \"model-checker\",\n // Architecture agents\n \"architect\",\n \"adr\",\n \"design-facilitator\",\n // Planning agents\n \"story\",\n \"pm\",\n \"analyst\",\n // Review agents\n \"reviewer\",\n \"ux\",\n \"mutation\",\n]);\n\n/**\n * Schema for subagent model assignments (v1.0.0+)\n * All fields are optional - unspecified subagents inherit from marvin\n */\nexport const SubagentModelsSchema = z.object({\n // TDD agents\n red: SubagentModelSchema.optional().describe(\"Model for TDD red phase agent\"),\n green: SubagentModelSchema.optional().describe(\"Model for TDD green phase agent\"),\n domain: SubagentModelSchema.optional().describe(\"Model for domain modeling agent\"),\n refactor: SubagentModelSchema.optional().describe(\"Model for refactoring agent\"),\n\n // Event modeling agents\n discovery: SubagentModelSchema.optional().describe(\n \"Model for discovery/domain exploration agent\"\n ),\n workflow: SubagentModelSchema.optional().describe(\"Model for workflow design agent\"),\n gwt: SubagentModelSchema.optional().describe(\"Model for GWT specification agent\"),\n \"model-checker\": SubagentModelSchema.optional().describe(\n \"Model for event model validation agent\"\n ),\n\n // Architecture agents\n architect: SubagentModelSchema.optional().describe(\"Model for architect agent\"),\n adr: SubagentModelSchema.optional().describe(\"Model for ADR creation agent\"),\n \"design-facilitator\": SubagentModelSchema.optional().describe(\n \"Model for design facilitation agent\"\n ),\n\n // Planning agents\n story: SubagentModelSchema.optional().describe(\"Model for story/issue planning agent\"),\n pm: SubagentModelSchema.optional().describe(\"Model for PM agent\"),\n analyst: SubagentModelSchema.optional().describe(\"Model for business analyst agent\"),\n\n // Review agents\n reviewer: SubagentModelSchema.optional().describe(\"Model for code reviewer agent\"),\n ux: SubagentModelSchema.optional().describe(\"Model for UX review agent\"),\n mutation: SubagentModelSchema.optional().describe(\"Model for mutation testing agent\"),\n});\n\n/**\n * Schema for agent model assignments\n */\nexport const ModelsSchema = z.object({\n marvin: z.string().describe(\"Model for main orchestrator agent\"),\n oracle: z.string().describe(\"Model for debugging/reasoning agent\"),\n librarian: z.string().describe(\"Model for research/documentation agent\"),\n frontend: z.string().optional().describe(\"Model for UI/UX agent\"),\n documentWriter: z.string().optional().describe(\"Model for documentation generation agent\"),\n multimodalLooker: z.string().optional().describe(\"Model for image analysis agent\"),\n // New v1.0.0 field for subagent models\n subagents: SubagentModelsSchema.optional().describe(\"Per-subagent model overrides\"),\n settings: z\n .object({\n marvin: AgentSettingsSchema.optional(),\n oracle: AgentSettingsSchema.optional(),\n librarian: AgentSettingsSchema.optional(),\n frontend: AgentSettingsSchema.optional(),\n documentWriter: AgentSettingsSchema.optional(),\n multimodalLooker: AgentSettingsSchema.optional(),\n overrides: z.record(z.string(), AgentSettingsSchema).optional(),\n })\n .optional(),\n custom: z.array(CustomModelDefinitionSchema).optional(),\n});\n\n/**\n * Complete SDLC configuration schema (v1.0.0+)\n *\n * Supports transitional state:\n * - New fields (github, tdd, eventModeling, git, modes, memory) are optional during migration\n * - Old field (bmad) is optional and deprecated\n * - Features/MCPs support both old and new structures via union\n */\nexport const SdlcConfigSchema = z.object({\n $schema: z.string().optional(),\n version: z.string(),\n subscriptions: SubscriptionSchema,\n models: ModelsSchema,\n // New v1.0.0 configuration\n modes: ModesConfigSchema.optional(),\n memory: MemoryConfigSchema.optional(),\n // New v0.3.0+ configuration (optional during migration)\n github: GitHubConfigSchema.optional(),\n tdd: TddConfigSchema.optional(),\n eventModeling: EventModelingConfigSchema.optional(),\n git: GitConfigSchema.optional(),\n // Legacy BMAD configuration (deprecated, optional for backward compatibility)\n bmad: LegacyBmadConfigSchema.optional(),\n // Features and MCPs support both old and new structures\n features: z.union([FeaturesSchema, LegacyFeaturesSchema]),\n mcps: z.union([McpsSchema, LegacyMcpsSchema]),\n routing: RoutingConfigSchema,\n});\n\n/**\n * @deprecated Alias for backward compatibility. Use LegacyBmadConfigSchema directly.\n */\nexport const BmadConfigSchema = LegacyBmadConfigSchema;\n\n// ============================================================================\n// Tool Argument Schemas\n// ============================================================================\n\n/**\n * Schema for sdlc_get_issue arguments\n */\nexport const GetIssueArgsSchema = z.object({\n issueNumber: z\n .number()\n .int()\n .positive()\n .optional()\n .describe(\"Specific GitHub issue number. If omitted, loads the next issue in Ready status.\"),\n});\n\n/**\n * Schema for sdlc_update_issue_status arguments\n */\nexport const UpdateIssueStatusArgsSchema = z.object({\n issueNumber: z.number().int().positive().describe(\"GitHub issue number\"),\n status: z.string().describe(\"New status (must match a column name in GitHub project statuses)\"),\n});\n\n/**\n * Schema for sdlc_list_issues arguments\n */\nexport const ListIssuesArgsSchema = z.object({\n status: z.string().optional().describe(\"Filter by status column name\"),\n limit: z.number().int().positive().optional().default(20).describe(\"Max issues to return\"),\n});\n\n/**\n * Schema for sdlc_get_context arguments\n */\nexport const GetContextArgsSchema = z.object({});\n\n/**\n * Schema for sdlc_parallel arguments\n */\nexport const ParallelArgsSchema = z.object({\n issueNumbers: z.array(z.number()).describe(\"Array of issue numbers to implement in parallel\"),\n maxConcurrent: z.number().int().min(1).max(5).optional().default(3),\n});\n\n/**\n * Schema for sdlc_config arguments\n */\nexport const ConfigArgsSchema = z.object({\n action: z.enum([\"get\", \"set\", \"reset\"]).describe(\"Configuration action to perform\"),\n key: z\n .string()\n .optional()\n .describe(\"Configuration key (dot notation, e.g., 'bmad.autoStatusUpdate')\"),\n value: z.unknown().optional().describe(\"Value to set (for 'set' action)\"),\n});\n\n// ============================================================================\n// Type Exports (inferred from schemas)\n// ============================================================================\n\n// Core configuration types\nexport type SubscriptionConfig = z.infer<typeof SubscriptionSchema>;\nexport type ModelsConfig = z.infer<typeof ModelsSchema>;\nexport type RoutingConfigValidated = z.infer<typeof RoutingConfigSchema>;\nexport type SdlcConfigValidated = z.infer<typeof SdlcConfigSchema>;\n\n// New v0.3.0 configuration types\nexport type GitHubConfigValidated = z.infer<typeof GitHubConfigSchema>;\nexport type GitHubStatusValidated = z.infer<typeof GitHubStatusSchema>;\nexport type TddConfigValidated = z.infer<typeof TddConfigSchema>;\nexport type TddVerbosityValidated = z.infer<typeof TddVerbositySchema>;\nexport type MutationTestingConfigValidated = z.infer<typeof MutationTestingConfigSchema>;\nexport type EventModelingConfigValidated = z.infer<typeof EventModelingConfigSchema>;\nexport type GitConfigValidated = z.infer<typeof GitConfigSchema>;\nexport type GitWorkflowValidated = z.infer<typeof GitWorkflowSchema>;\nexport type FeaturesConfig = z.infer<typeof FeaturesSchema>;\nexport type McpsConfig = z.infer<typeof McpsSchema>;\n\n// New v1.0.0 configuration types\nexport type SdlcMode = z.infer<typeof SdlcModeSchema>;\nexport type ModesConfigValidated = z.infer<typeof ModesConfigSchema>;\nexport type MemoryBackend = z.infer<typeof MemoryBackendSchema>;\nexport type MemoryConfigValidated = z.infer<typeof MemoryConfigSchema>;\nexport type SubagentModel = z.infer<typeof SubagentModelSchema>;\nexport type SubagentModelsConfigValidated = z.infer<typeof SubagentModelsSchema>;\n\n// Legacy/deprecated types (for backward compatibility)\n/** @deprecated Use GitHubConfigValidated instead */\nexport type BmadConfig = z.infer<typeof LegacyBmadConfigSchema>;\n","/**\n * Configuration loader for Sdlc plugin\n *\n * Loads SdlcConfig from project-local or global config files.\n * Project config takes priority over global config.\n * Uses Zod validation for type safety and clear error messages.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { CONFIG_PATHS, DEFAULTS } from \"../../shared/constants.js\";\nimport { SdlcConfigSchema } from \"../../shared/schemas.js\";\nimport type { SdlcConfig } from \"../../shared/types.js\";\nimport { createPluginLogger } from \"./plugin-logger.js\";\n\nconst log = createPluginLogger(\"config-loader\");\n\n/**\n * Load Sdlc configuration from available config files.\n *\n * Priority order:\n * 1. Project-local: [projectDir]/.opencode/sdlc.json\n * 2. Global: ~/.config/opencode/sdlc.json\n * 3. Default values if no config found\n *\n * @param projectDir - The project directory to search for local config\n * @returns The merged Sdlc configuration\n */\nexport async function loadSdlcConfig(projectDir: string): Promise<SdlcConfig> {\n // Try project-local config first\n const localConfigPath = join(projectDir, \".opencode\", \"sdlc.json\");\n const localConfig = await loadConfigFile(localConfigPath);\n\n // Try global config\n const globalConfig = await loadConfigFile(CONFIG_PATHS.globalSdlcConfig);\n\n // Merge configs: local overrides global, both override defaults\n const merged = mergeConfigs(getDefaultConfig(), globalConfig, localConfig);\n\n // Validate the final merged config\n return validateConfig(merged);\n}\n\n/**\n * Load and parse a JSON config file\n */\nasync function loadConfigFile(filePath: string): Promise<Partial<SdlcConfig> | null> {\n if (!existsSync(filePath)) {\n return null;\n }\n\n try {\n const content = await readFile(filePath, \"utf-8\");\n const parsed = JSON.parse(content);\n\n // Perform partial validation to catch obvious errors early\n // We don't require all fields since this is a partial config\n return validatePartialConfig(parsed, filePath);\n } catch (error) {\n if (error instanceof SyntaxError) {\n log.warn(\"Invalid JSON in config file\", { filePath, message: error.message });\n } else {\n log.warn(\"Failed to load config file\", { filePath, error });\n }\n return null;\n }\n}\n\n/**\n * Validate a partial config file and return it with warnings for invalid fields\n */\nfunction validatePartialConfig(config: unknown, filePath: string): Partial<SdlcConfig> | null {\n if (typeof config !== \"object\" || config === null) {\n log.warn(\"Config file must be an object\", { filePath });\n return null;\n }\n\n const result: Partial<SdlcConfig> = {};\n const configObj = config as Record<string, unknown>;\n\n // Validate and copy each top-level field\n if (\"version\" in configObj && typeof configObj.version === \"string\") {\n result.version = configObj.version;\n }\n\n if (\"$schema\" in configObj && typeof configObj.$schema === \"string\") {\n result.$schema = configObj.$schema;\n }\n\n // Validate subscriptions\n if (\"subscriptions\" in configObj && typeof configObj.subscriptions === \"object\") {\n const subs = configObj.subscriptions as Record<string, unknown>;\n result.subscriptions = {} as SdlcConfig[\"subscriptions\"];\n\n if (subs.claude && typeof subs.claude === \"object\") {\n const claude = subs.claude as Record<string, unknown>;\n const claudeTier = isValidTier(claude.tier) ? claude.tier : \"none\";\n result.subscriptions.claude = {\n enabled: typeof claude.enabled === \"boolean\" ? claude.enabled : false,\n authMethod: isValidProviderAuth(claude.authMethod)\n ? claude.authMethod\n : claudeTier !== \"none\"\n ? \"subscription\"\n : \"none\",\n tier: claudeTier,\n };\n }\n\n if (subs.openai && typeof subs.openai === \"object\") {\n const openai = subs.openai as Record<string, unknown>;\n result.subscriptions.openai = {\n enabled: typeof openai.enabled === \"boolean\" ? openai.enabled : false,\n authMethod: isValidProviderAuth(openai.authMethod)\n ? openai.authMethod\n : openai.enabled\n ? \"subscription\"\n : \"none\",\n };\n }\n\n if (subs.google && typeof subs.google === \"object\") {\n const google = subs.google as Record<string, unknown>;\n result.subscriptions.google = {\n enabled: typeof google.enabled === \"boolean\" ? google.enabled : false,\n authMethod: isValidAuthMethod(google.authMethod) ? google.authMethod : \"none\",\n };\n }\n\n if (subs.githubCopilot && typeof subs.githubCopilot === \"object\") {\n const copilot = subs.githubCopilot as Record<string, unknown>;\n result.subscriptions.githubCopilot = {\n enabled: typeof copilot.enabled === \"boolean\" ? copilot.enabled : false,\n plan: isValidCopilotPlan(copilot.plan) ? copilot.plan : \"none\",\n enabledModels: Array.isArray(copilot.enabledModels)\n ? copilot.enabledModels.filter((m): m is string => typeof m === \"string\")\n : undefined,\n };\n }\n }\n\n // Validate models\n if (\"models\" in configObj && typeof configObj.models === \"object\") {\n const models = configObj.models as Record<string, unknown>;\n result.models = {} as SdlcConfig[\"models\"];\n\n if (models.marvin) {\n (result.models as unknown as Record<string, string>).marvin = models.marvin as string;\n }\n\n const otherModelKeys = [\n \"oracle\",\n \"librarian\",\n \"frontend\",\n \"documentWriter\",\n \"multimodalLooker\",\n ] as const;\n for (const key of otherModelKeys) {\n if (key in models && typeof models[key] === \"string\") {\n (result.models as unknown as Record<string, string>)[key] = models[key] as string;\n }\n }\n\n if (\"settings\" in models && typeof models.settings === \"object\" && models.settings !== null) {\n result.models.settings = validateModelSettings(models.settings as Record<string, unknown>);\n }\n\n if (\"custom\" in models && Array.isArray(models.custom)) {\n result.models.custom = validateCustomModels(models.custom);\n }\n }\n\n // Validate bmad (legacy, optional)\n if (\"bmad\" in configObj && typeof configObj.bmad === \"object\") {\n const bmad = configObj.bmad as Record<string, unknown>;\n const bmadConfig: Partial<NonNullable<SdlcConfig[\"bmad\"]>> = {};\n\n if (isValidTrack(bmad.defaultTrack) && bmad.defaultTrack !== \"bmad-method\") {\n bmadConfig.defaultTrack = bmad.defaultTrack;\n }\n if (typeof bmad.autoStatusUpdate === \"boolean\") {\n bmadConfig.autoStatusUpdate = bmad.autoStatusUpdate;\n }\n if (typeof bmad.parallelIssueLimit === \"number\") {\n bmadConfig.parallelIssueLimit = Math.max(0, Math.min(10, bmad.parallelIssueLimit));\n }\n\n // Only set bmad if we have valid fields\n if (Object.keys(bmadConfig).length > 0) {\n result.bmad = bmadConfig as NonNullable<SdlcConfig[\"bmad\"]>;\n }\n }\n\n // Validate github (new v0.3.0+, optional)\n if (\"github\" in configObj && typeof configObj.github === \"object\") {\n const github = configObj.github as Record<string, unknown>;\n if (typeof github.owner === \"string\" && typeof github.repo === \"string\") {\n result.github = {\n owner: github.owner,\n repo: github.repo,\n project: typeof github.project === \"number\" ? github.project : undefined,\n statuses: Array.isArray(github.statuses)\n ? github.statuses\n : [\"Backlog\", \"Ready\", \"In progress\", \"In review\", \"Done\"],\n };\n }\n }\n\n // Validate tdd (new v0.3.0+, optional)\n if (\"tdd\" in configObj && typeof configObj.tdd === \"object\") {\n const tdd = configObj.tdd as Record<string, unknown>;\n result.tdd = {\n enabled: typeof tdd.enabled === \"boolean\" ? tdd.enabled : true,\n verbosity: isValidTddVerbosity(tdd.verbosity) ? tdd.verbosity : \"brief\",\n bypassPatterns: Array.isArray(tdd.bypassPatterns)\n ? tdd.bypassPatterns\n : [\"*.config.*\", \"*.json\", \"*.md\"],\n mutationTesting: {\n enabled:\n typeof (tdd.mutationTesting as Record<string, unknown>)?.enabled === \"boolean\"\n ? ((tdd.mutationTesting as Record<string, unknown>).enabled as boolean)\n : false,\n requiredScore:\n typeof (tdd.mutationTesting as Record<string, unknown>)?.requiredScore === \"number\"\n ? ((tdd.mutationTesting as Record<string, unknown>).requiredScore as number)\n : 80,\n },\n };\n }\n\n // Validate features (supports both old and new structures)\n if (\"features\" in configObj && typeof configObj.features === \"object\") {\n const features = configObj.features as Record<string, unknown>;\n\n // Check if this is new or legacy features structure\n const isNewFeatures = \"orchestratorOnly\" in features;\n\n if (isNewFeatures) {\n // New features structure\n const newFeatures: Record<string, boolean> = {};\n for (const key of [\n \"orchestratorOnly\",\n \"todoSync\",\n \"partyReview\",\n \"debuggingProtocol\",\n \"memento\",\n \"notifications\",\n \"lspTools\",\n ]) {\n if (key in features && typeof features[key] === \"boolean\") {\n newFeatures[key] = features[key] as boolean;\n }\n }\n result.features = newFeatures as unknown as SdlcConfig[\"features\"];\n } else {\n // Legacy features structure\n const legacyFeatures: Record<string, boolean> = {};\n for (const key of [\n \"bmadBridge\",\n \"autoStatus\",\n \"parallelExecution\",\n \"notifications\",\n \"contextMonitor\",\n \"commentChecker\",\n \"lspTools\",\n \"autoGitOperations\",\n \"todoSync\",\n ]) {\n if (key in features && typeof features[key] === \"boolean\") {\n legacyFeatures[key] = features[key] as boolean;\n }\n }\n result.features = legacyFeatures as unknown as SdlcConfig[\"features\"];\n }\n }\n\n // Validate mcps (supports both old and new structures)\n if (\"mcps\" in configObj && typeof configObj.mcps === \"object\") {\n const mcps = configObj.mcps as Record<string, unknown>;\n const mcpConfig: Record<string, boolean> = {};\n\n // Support both old and new MCP keys\n for (const key of [\"context7\", \"exa\", \"grepApp\", \"memento\"]) {\n if (key in mcps && typeof mcps[key] === \"boolean\") {\n mcpConfig[key] = mcps[key] as boolean;\n }\n }\n result.mcps = mcpConfig as unknown as SdlcConfig[\"mcps\"];\n }\n\n return result;\n}\n\n/**\n * Type guard for valid Claude tier\n */\nfunction isValidTier(value: unknown): value is \"max5x\" | \"max20x\" | \"pro\" | \"none\" {\n return typeof value === \"string\" && [\"max5x\", \"max20x\", \"pro\", \"none\"].includes(value);\n}\n\n/**\n * Type guard for valid provider auth method (Claude/OpenAI)\n */\nfunction isValidProviderAuth(value: unknown): value is \"subscription\" | \"api\" | \"none\" {\n return typeof value === \"string\" && [\"subscription\", \"api\", \"none\"].includes(value);\n}\n\n/**\n * Type guard for valid Google auth method\n */\nfunction isValidAuthMethod(value: unknown): value is \"antigravity\" | \"personal\" | \"api\" | \"none\" {\n return typeof value === \"string\" && [\"antigravity\", \"personal\", \"api\", \"none\"].includes(value);\n}\n\n/**\n * Type guard for valid GitHub Copilot plan\n */\nfunction isValidCopilotPlan(\n value: unknown\n): value is \"free\" | \"pro\" | \"pro-plus\" | \"business\" | \"enterprise\" | \"none\" {\n return (\n typeof value === \"string\" &&\n [\"free\", \"pro\", \"pro-plus\", \"business\", \"enterprise\", \"none\"].includes(value)\n );\n}\n\n/**\n * Type guard for valid BMAD track\n */\nfunction isValidTrack(value: unknown): value is \"quick-flow\" | \"bmad-method\" | \"enterprise\" {\n return typeof value === \"string\" && [\"quick-flow\", \"bmad-method\", \"enterprise\"].includes(value);\n}\n\nfunction isValidThinkingLevel(value: unknown): value is \"off\" | \"low\" | \"medium\" | \"high\" {\n return typeof value === \"string\" && [\"off\", \"low\", \"medium\", \"high\"].includes(value);\n}\n\n/**\n * Type guard for valid TDD verbosity level\n */\nfunction isValidTddVerbosity(value: unknown): value is \"silent\" | \"brief\" | \"explain\" {\n return typeof value === \"string\" && [\"silent\", \"brief\", \"explain\"].includes(value);\n}\n\nfunction isValidProvider(\n value: unknown\n): value is \"anthropic\" | \"openai\" | \"google\" | \"github-copilot\" {\n return (\n typeof value === \"string\" && [\"anthropic\", \"openai\", \"google\", \"github-copilot\"].includes(value)\n );\n}\n\nfunction validateAgentSettings(settings: unknown): SdlcConfig[\"models\"][\"settings\"] {\n if (typeof settings !== \"object\" || settings === null) {\n return undefined;\n }\n\n const result: SdlcConfig[\"models\"][\"settings\"] = {};\n const settingsObj = settings as Record<string, unknown>;\n const agentKeys = [\n \"marvin\",\n \"oracle\",\n \"librarian\",\n \"frontend\",\n \"documentWriter\",\n \"multimodalLooker\",\n ] as const;\n\n for (const key of agentKeys) {\n if (key in settingsObj && typeof settingsObj[key] === \"object\" && settingsObj[key] !== null) {\n const agentSetting = settingsObj[key] as Record<string, unknown>;\n const validated: { temperature?: number; thinkingLevel?: \"off\" | \"low\" | \"medium\" | \"high\" } =\n {};\n\n if (\n typeof agentSetting.temperature === \"number\" &&\n agentSetting.temperature >= 0 &&\n agentSetting.temperature <= 2\n ) {\n validated.temperature = agentSetting.temperature;\n }\n\n if (isValidThinkingLevel(agentSetting.thinkingLevel)) {\n validated.thinkingLevel = agentSetting.thinkingLevel;\n }\n\n if (Object.keys(validated).length > 0) {\n result[key] = validated;\n }\n }\n }\n\n if (\n \"overrides\" in settingsObj &&\n typeof settingsObj.overrides === \"object\" &&\n settingsObj.overrides !== null\n ) {\n const overrides = settingsObj.overrides as Record<string, unknown>;\n result.overrides = {};\n\n for (const [modelId, modelSettings] of Object.entries(overrides)) {\n if (typeof modelSettings === \"object\" && modelSettings !== null) {\n const ms = modelSettings as Record<string, unknown>;\n const validated: {\n temperature?: number;\n thinkingLevel?: \"off\" | \"low\" | \"medium\" | \"high\";\n } = {};\n\n if (typeof ms.temperature === \"number\" && ms.temperature >= 0 && ms.temperature <= 2) {\n validated.temperature = ms.temperature;\n }\n\n if (isValidThinkingLevel(ms.thinkingLevel)) {\n validated.thinkingLevel = ms.thinkingLevel;\n }\n\n if (Object.keys(validated).length > 0) {\n result.overrides[modelId] = validated;\n }\n }\n }\n }\n\n return Object.keys(result).length > 0 ? result : undefined;\n}\n\nfunction validateModelSettings(\n settings: Record<string, unknown>\n): SdlcConfig[\"models\"][\"settings\"] {\n return validateAgentSettings(settings);\n}\n\nfunction validateCustomModels(models: unknown[]): SdlcConfig[\"models\"][\"custom\"] {\n const validated: SdlcConfig[\"models\"][\"custom\"] = [];\n\n for (const model of models) {\n if (typeof model !== \"object\" || model === null) continue;\n\n const m = model as Record<string, unknown>;\n if (typeof m.id !== \"string\" || typeof m.name !== \"string\" || !isValidProvider(m.provider)) {\n continue;\n }\n\n const customModel: {\n id: string;\n name: string;\n provider: \"anthropic\" | \"openai\" | \"google\" | \"github-copilot\";\n description?: string;\n capabilities?: { thinking?: boolean; contextWindow?: number; supportsTemperature?: boolean };\n } = {\n id: m.id,\n name: m.name,\n provider: m.provider,\n };\n\n if (typeof m.description === \"string\") {\n customModel.description = m.description;\n }\n\n if (typeof m.capabilities === \"object\" && m.capabilities !== null) {\n const caps = m.capabilities as Record<string, unknown>;\n customModel.capabilities = {};\n\n if (typeof caps.thinking === \"boolean\") {\n customModel.capabilities.thinking = caps.thinking;\n }\n if (typeof caps.contextWindow === \"number\") {\n customModel.capabilities.contextWindow = caps.contextWindow;\n }\n if (typeof caps.supportsTemperature === \"boolean\") {\n customModel.capabilities.supportsTemperature = caps.supportsTemperature;\n }\n }\n\n validated.push(customModel);\n }\n\n return validated.length > 0 ? validated : undefined;\n}\n\n/**\n * Validate the final merged config using Zod schema\n */\nfunction validateConfig(config: SdlcConfig): SdlcConfig {\n const result = SdlcConfigSchema.safeParse(config);\n\n if (!result.success) {\n // Log validation errors but don't fail - use defaults for invalid fields\n log.warn(\"Configuration validation warnings\", {\n errors: result.error.errors.map((e) => ({\n path: e.path.join(\".\"),\n message: e.message,\n })),\n });\n\n // Return the original config since we already have defaults\n // The individual fields will be used even if some are invalid\n return config;\n }\n\n return result.data;\n}\n\n/**\n * Get default configuration values\n */\nfunction getDefaultConfig(): SdlcConfig {\n return {\n version: \"0.0.1\",\n subscriptions: {\n claude: { enabled: false, authMethod: \"none\", tier: \"none\" },\n openai: { enabled: false, authMethod: \"none\" },\n google: { enabled: false, authMethod: \"none\" },\n githubCopilot: { enabled: false, plan: \"none\" },\n },\n models: {\n marvin: \"anthropic/claude-sonnet-4\",\n oracle: \"anthropic/claude-sonnet-4\",\n librarian: \"anthropic/claude-sonnet-4\",\n },\n bmad: {\n defaultTrack: \"quick-flow\",\n autoStatusUpdate: false,\n parallelIssueLimit: 0,\n },\n features: { ...DEFAULTS.features },\n mcps: { ...DEFAULTS.mcps },\n routing: {\n providerPriority: [\"anthropic\", \"openai\", \"google\", \"github-copilot\"],\n modelFamilyPriority: {\n claude: [\"anthropic\", \"github-copilot\"],\n gpt: [\"openai\", \"github-copilot\"],\n gemini: [\"google\", \"github-copilot\"],\n },\n agentOverrides: {\n oracle: {\n requiresThinking: true,\n },\n },\n fallbackBehavior: {\n autoFallback: false,\n retryPeriodMs: 300000,\n notifyOnRateLimit: true,\n },\n },\n };\n}\n\n/**\n * Deep merge multiple config objects\n * Later configs override earlier ones\n */\nfunction mergeConfigs(...configs: (Partial<SdlcConfig> | null)[]): SdlcConfig {\n const result = getDefaultConfig();\n\n for (const config of configs) {\n if (!config) continue;\n\n // Merge top-level primitives\n if (config.version) result.version = config.version;\n\n // Merge subscriptions\n if (config.subscriptions) {\n if (config.subscriptions.claude) {\n result.subscriptions.claude = {\n ...result.subscriptions.claude,\n ...config.subscriptions.claude,\n };\n }\n if (config.subscriptions.openai) {\n result.subscriptions.openai = {\n ...result.subscriptions.openai,\n ...config.subscriptions.openai,\n };\n }\n if (config.subscriptions.google) {\n result.subscriptions.google = {\n ...result.subscriptions.google,\n ...config.subscriptions.google,\n };\n }\n if (config.subscriptions.githubCopilot) {\n result.subscriptions.githubCopilot = {\n ...result.subscriptions.githubCopilot,\n ...config.subscriptions.githubCopilot,\n };\n }\n }\n\n // Merge models (deep merge)\n if (config.models) {\n if (config.models.marvin !== undefined) result.models.marvin = config.models.marvin;\n if (config.models.oracle !== undefined) result.models.oracle = config.models.oracle;\n if (config.models.librarian !== undefined) result.models.librarian = config.models.librarian;\n if (config.models.frontend !== undefined) result.models.frontend = config.models.frontend;\n if (config.models.documentWriter !== undefined)\n result.models.documentWriter = config.models.documentWriter;\n if (config.models.multimodalLooker !== undefined)\n result.models.multimodalLooker = config.models.multimodalLooker;\n\n if (config.models.settings !== undefined) {\n result.models.settings = result.models.settings || {};\n const resultSettings = result.models.settings;\n const configSettings = config.models.settings as Record<string, unknown>;\n\n for (const agentKey of [\n \"marvin\",\n \"oracle\",\n \"librarian\",\n \"frontend\",\n \"documentWriter\",\n \"multimodalLooker\",\n ] as const) {\n if (configSettings[agentKey] !== undefined) {\n (resultSettings as Record<string, unknown>)[agentKey] = {\n ...(((resultSettings as Record<string, unknown>)[agentKey] as object) || {}),\n ...(configSettings[agentKey] as object),\n };\n }\n }\n\n if (configSettings.overrides !== undefined) {\n resultSettings.overrides = {\n ...(resultSettings.overrides || {}),\n ...configSettings.overrides,\n };\n }\n }\n\n if (config.models.custom !== undefined) {\n result.models.custom = config.models.custom;\n }\n }\n\n // Merge bmad settings\n if (config.bmad) {\n result.bmad = { ...result.bmad, ...config.bmad };\n }\n\n // Merge features\n if (config.features) {\n result.features = { ...result.features, ...config.features };\n }\n\n // Merge mcps\n if (config.mcps) {\n result.mcps = { ...result.mcps, ...config.mcps };\n }\n\n // Merge routing (deep merge)\n if (config.routing) {\n if (config.routing.providerPriority !== undefined) {\n result.routing.providerPriority = config.routing.providerPriority;\n }\n\n if (config.routing.modelFamilyPriority !== undefined) {\n result.routing.modelFamilyPriority = {\n ...result.routing.modelFamilyPriority,\n ...config.routing.modelFamilyPriority,\n };\n }\n\n if (config.routing.agentOverrides !== undefined) {\n result.routing.agentOverrides = {\n ...result.routing.agentOverrides,\n ...config.routing.agentOverrides,\n };\n }\n\n if (config.routing.fallbackBehavior !== undefined) {\n result.routing.fallbackBehavior = {\n ...result.routing.fallbackBehavior,\n ...config.routing.fallbackBehavior,\n };\n }\n }\n }\n\n return result;\n}\n","/**\n * OpenCode SDLC Plugin\n *\n * The main OpenCode plugin that provides SDLC integration tools and hooks.\n */\n\nimport type { Plugin } from \"@opencode-ai/plugin\";\nimport { createCompactionHook, createSessionHooks, createToolHooks } from \"./hooks/index.js\";\nimport { createTools } from \"./tools/index.js\";\nimport { IssueTracker } from \"./tracker/issue-tracker.js\";\nimport { loadSdlcConfig } from \"./utils/config-loader.js\";\nimport { createPluginLogger } from \"./utils/plugin-logger.js\";\n\nconst log = createPluginLogger(\"plugin-init\");\n\n/**\n * OpenCode SDLC plugin factory.\n *\n * Provides:\n * - Custom tools for GitHub issue workflow\n * - Session hooks for context tracking\n * - Tool execution hooks for status updates\n * - Compaction hooks to preserve issue context\n */\nexport const OpenCodeSdlc: Plugin = async (ctx) => {\n const { directory } = ctx;\n\n log.info(\"OpenCode SDLC plugin loading\", {\n directory,\n timestamp: new Date().toISOString(),\n });\n\n // Load Sdlc configuration (project-local takes priority over global)\n const config = await loadSdlcConfig(directory);\n\n // Initialize issue tracker for session state persistence\n const tracker = new IssueTracker(directory);\n await tracker.initialize();\n\n // Create tools\n const tools = createTools(ctx, tracker, config);\n\n // Create hooks\n const sessionHooks = createSessionHooks(ctx, tracker, config);\n const toolHooks = createToolHooks(ctx, tracker, config);\n const compactionHook = createCompactionHook(tracker, config);\n\n return {\n // Custom tools for SDLC integration\n tool: tools,\n\n // Session event handlers\n event: sessionHooks,\n\n // Tool execution hooks\n \"tool.execute.before\": toolHooks.before,\n \"tool.execute.after\": toolHooks.after,\n\n // Compaction hook to preserve issue context\n \"experimental.session.compacting\": compactionHook,\n };\n};\n\n// Default export for OpenCode plugin loader\nexport default OpenCodeSdlc;\n"]}
|