git-workspace-service 0.4.2 → 0.4.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +7 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/branch-naming.ts","../src/utils/git-credential-helper.ts","../src/workspace-service.ts","../src/oauth/device-flow.ts","../src/oauth/token-store.ts","../src/credential-service.ts","../src/providers/github-provider.ts","../src/providers/github-pat-client.ts","../src/types.ts"],"names":["path","fs","promisify","exec","fs2","randomUUID","path2","path3","os","crypto","fs3","loadOctokit"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Branch Naming Service\n *\n * Generates and parses managed branch names.\n * Format: {prefix}/{execution-id}/{role}-{slug}\n */\n\nimport type { BranchConfig, BranchInfo } from '../types';\n\nexport const DEFAULT_BRANCH_PREFIX = 'parallax';\n\nexport interface BranchNamingOptions {\n /**\n * Maximum length for the slug portion\n */\n maxSlugLength?: number;\n\n /**\n * Custom prefix (defaults to 'parallax')\n */\n prefix?: string;\n}\n\nconst DEFAULT_OPTIONS: Required<BranchNamingOptions> = {\n maxSlugLength: 30,\n prefix: DEFAULT_BRANCH_PREFIX,\n};\n\n/**\n * Generate a branch name from configuration\n */\nexport function generateBranchName(\n config: BranchConfig,\n options?: BranchNamingOptions\n): string {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n // Sanitize role\n const role = sanitizeForBranch(config.role);\n\n // Generate slug from description or use provided\n const slug = config.slug\n ? sanitizeForBranch(config.slug, opts.maxSlugLength)\n : '';\n\n // Build branch name\n const parts = [opts.prefix, config.executionId, role];\n if (slug) {\n parts[2] = `${role}-${slug}`;\n }\n\n return parts.join('/');\n}\n\n/**\n * Parse a branch name into its components\n */\nexport function parseBranchName(\n branchName: string,\n options?: BranchNamingOptions\n): { executionId: string; role: string; slug?: string } | null {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n // Check if it's a managed branch\n if (!branchName.startsWith(`${opts.prefix}/`)) {\n return null;\n }\n\n const parts = branchName.split('/');\n if (parts.length < 3) {\n return null;\n }\n\n const [, executionId, roleAndSlug] = parts;\n\n // Parse role and optional slug\n const dashIndex = roleAndSlug.indexOf('-');\n if (dashIndex === -1) {\n return { executionId, role: roleAndSlug };\n }\n\n return {\n executionId,\n role: roleAndSlug.substring(0, dashIndex),\n slug: roleAndSlug.substring(dashIndex + 1),\n };\n}\n\n/**\n * Check if a branch name is a managed branch\n */\nexport function isManagedBranch(\n branchName: string,\n options?: BranchNamingOptions\n): boolean {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n return branchName.startsWith(`${opts.prefix}/`);\n}\n\n/**\n * Get all branches for a specific execution\n */\nexport function filterBranchesByExecution(\n branches: string[],\n executionId: string,\n options?: BranchNamingOptions\n): string[] {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const prefix = `${opts.prefix}/${executionId}/`;\n return branches.filter((b) => b.startsWith(prefix));\n}\n\n/**\n * Generate branch info object\n */\nexport function createBranchInfo(\n config: BranchConfig,\n options?: BranchNamingOptions\n): BranchInfo {\n return {\n name: generateBranchName(config, options),\n executionId: config.executionId,\n baseBranch: config.baseBranch,\n createdAt: new Date(),\n };\n}\n\n/**\n * Sanitize a string for use in a branch name\n */\nfunction sanitizeForBranch(input: string, maxLength?: number): string {\n let result = input\n .toLowerCase()\n // Replace spaces and underscores with dashes\n .replace(/[\\s_]+/g, '-')\n // Remove invalid characters\n .replace(/[^a-z0-9-]/g, '')\n // Remove consecutive dashes\n .replace(/-+/g, '-')\n // Remove leading/trailing dashes\n .replace(/^-|-$/g, '');\n\n if (maxLength && result.length > maxLength) {\n result = result.substring(0, maxLength).replace(/-$/, '');\n }\n\n return result;\n}\n\n/**\n * Generate a slug from a task description\n */\nexport function generateSlug(description: string, maxLength = 30): string {\n // Extract key words\n const words = description\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, '')\n .split(/\\s+/)\n .filter((w) => w.length > 2)\n .filter((w) => !STOP_WORDS.has(w))\n .slice(0, 4);\n\n return sanitizeForBranch(words.join('-'), maxLength);\n}\n\nconst STOP_WORDS = new Set([\n 'the',\n 'and',\n 'for',\n 'with',\n 'this',\n 'that',\n 'from',\n 'have',\n 'has',\n 'will',\n 'would',\n 'could',\n 'should',\n 'been',\n 'being',\n 'into',\n 'than',\n 'then',\n 'when',\n 'where',\n 'which',\n 'while',\n 'about',\n 'after',\n 'before',\n]);\n","/**\n * Git Credential Helper\n *\n * This module provides a Git credential helper that integrates with the\n * workspace service. It can be used in two modes:\n *\n * 1. Script mode: Run as a standalone script that Git calls\n * 2. Embedded mode: Used within the workspace service to configure git\n *\n * Git credential helpers receive input on stdin in the format:\n * protocol=https\n * host=github.com\n * path=owner/repo\n *\n * And respond with:\n * username=x-access-token\n * password=<token>\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\n/**\n * Credential context stored per-workspace\n * This is written to a file that the helper reads\n */\nexport interface CredentialHelperContext {\n workspaceId: string;\n executionId: string;\n repo: string;\n token: string;\n expiresAt: string;\n}\n\n/**\n * Create the credential helper script content (Node.js version)\n */\nexport function createNodeCredentialHelperScript(contextFilePath: string): string {\n return `#!/usr/bin/env node\nconst fs = require('fs');\nconst readline = require('readline');\n\nconst contextFile = '${contextFilePath}';\n\nasync function main() {\n // Parse input from git\n const rl = readline.createInterface({ input: process.stdin });\n const request = {};\n\n for await (const line of rl) {\n if (!line.trim()) break;\n const [key, value] = line.split('=');\n if (key && value !== undefined) {\n request[key.trim()] = value.trim();\n }\n }\n\n // Read context file\n try {\n const context = JSON.parse(fs.readFileSync(contextFile, 'utf8'));\n\n // Check expiration\n if (new Date(context.expiresAt) < new Date()) {\n console.error('Credential expired');\n process.exit(1);\n }\n\n // Output credentials\n console.log('username=x-access-token');\n console.log('password=' + context.token);\n console.log('');\n } catch (error) {\n console.error('Failed to read credentials:', error.message);\n process.exit(1);\n }\n}\n\nmain();\n`;\n}\n\n/**\n * Create a shell-based credential helper script (more portable)\n */\nexport function createShellCredentialHelperScript(contextFilePath: string): string {\n return `#!/bin/sh\n# Git Credential Helper\n# Reads credentials from: ${contextFilePath}\n\n# Read the context file\nif [ ! -f \"${contextFilePath}\" ]; then\n echo \"Credential context file not found\" >&2\n exit 1\nfi\n\n# Parse JSON and extract token (using basic shell tools)\nTOKEN=$(cat \"${contextFilePath}\" | grep -o '\"token\":\"[^\"]*\"' | cut -d'\"' -f4)\nEXPIRES=$(cat \"${contextFilePath}\" | grep -o '\"expiresAt\":\"[^\"]*\"' | cut -d'\"' -f4)\n\n# Check if we got a token\nif [ -z \"$TOKEN\" ]; then\n echo \"No token found in credential context\" >&2\n exit 1\nfi\n\n# Output credentials in git credential format\necho \"username=x-access-token\"\necho \"password=$TOKEN\"\necho \"\"\n`;\n}\n\n/**\n * Configure git to use the credential helper in a workspace\n */\nexport async function configureCredentialHelper(\n workspacePath: string,\n context: CredentialHelperContext\n): Promise<string> {\n // Create the .git-workspace directory in the workspace\n const helperDir = path.join(workspacePath, '.git-workspace');\n await fs.promises.mkdir(helperDir, { recursive: true });\n\n // Write the context file\n const contextFilePath = path.join(helperDir, 'credential-context.json');\n await fs.promises.writeFile(\n contextFilePath,\n JSON.stringify(context, null, 2),\n { mode: 0o600 } // Read/write only for owner\n );\n\n // Create the helper script\n const helperScriptPath = path.join(helperDir, 'git-credential-helper');\n const helperScript = createShellCredentialHelperScript(contextFilePath);\n await fs.promises.writeFile(helperScriptPath, helperScript, { mode: 0o700 });\n\n // Ensure .git-workspace/ is in .gitignore to prevent committing secrets\n const gitignorePath = path.join(workspacePath, '.gitignore');\n const entry = '.git-workspace/';\n try {\n let content = '';\n try {\n content = await fs.promises.readFile(gitignorePath, 'utf-8');\n } catch {\n // File doesn't exist yet — will be created below\n }\n if (!content.includes(entry)) {\n const suffix = content.length > 0 && !content.endsWith('\\n') ? `\\n${entry}\\n` : `${entry}\\n`;\n await fs.promises.writeFile(gitignorePath, content + suffix);\n }\n } catch {\n // Non-fatal — credential helper still works, just won't be gitignored\n }\n\n // Return the path to the helper script\n return helperScriptPath;\n}\n\n/**\n * Update credentials for an existing workspace\n * Called when credentials are refreshed\n */\nexport async function updateCredentials(\n workspacePath: string,\n newToken: string,\n newExpiresAt: string\n): Promise<void> {\n const contextFilePath = path.join(workspacePath, '.git-workspace', 'credential-context.json');\n\n // Read existing context\n const existingContent = await fs.promises.readFile(contextFilePath, 'utf8');\n const context: CredentialHelperContext = JSON.parse(existingContent);\n\n // Update token and expiry\n context.token = newToken;\n context.expiresAt = newExpiresAt;\n\n // Write back\n await fs.promises.writeFile(\n contextFilePath,\n JSON.stringify(context, null, 2),\n { mode: 0o600 }\n );\n}\n\n/**\n * Clean up credential files from a workspace\n */\nexport async function cleanupCredentialFiles(workspacePath: string): Promise<void> {\n const helperDir = path.join(workspacePath, '.git-workspace');\n try {\n await fs.promises.rm(helperDir, { recursive: true, force: true });\n } catch {\n // Ignore errors during cleanup\n }\n}\n\n/**\n * Get the git config commands to configure the credential helper\n */\nexport function getGitCredentialConfig(helperScriptPath: string): string[] {\n return [\n // Clear any existing helpers\n `git config credential.helper ''`,\n // Use our custom helper script\n `git config --add credential.helper '!${helperScriptPath}'`,\n // Disable interactive prompts\n `git config credential.interactive false`,\n ];\n}\n\n/**\n * Output credentials to stdout in Git format\n */\nexport function outputCredentials(username: string, password: string): void {\n console.log(`username=${username}`);\n console.log(`password=${password}`);\n console.log('');\n}\n","/**\n * Workspace Service\n *\n * Provisions and manages git workspaces for agent tasks.\n * Handles cloning, branching, and PR creation.\n */\n\nimport { randomUUID } from 'crypto';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport type {\n BranchInfo,\n Workspace,\n WorkspaceConfig,\n WorkspaceFinalization,\n PullRequestInfo,\n WorkspaceServiceConfig,\n WorkspaceEvent,\n WorkspaceEventHandler,\n WorkspaceStrategy,\n WorkspacePhase,\n} from './types';\nimport { CredentialService } from './credential-service';\nimport { createBranchInfo } from './utils/branch-naming';\nimport {\n configureCredentialHelper,\n cleanupCredentialFiles,\n getGitCredentialConfig,\n type CredentialHelperContext,\n} from './utils/git-credential-helper';\n\nconst execAsync = promisify(exec);\n\nexport interface WorkspaceServiceLogger {\n info(data: Record<string, unknown>, message: string): void;\n warn(data: Record<string, unknown>, message: string): void;\n error(data: Record<string, unknown>, message: string): void;\n debug(data: Record<string, unknown>, message: string): void;\n}\n\nexport interface WorkspaceServiceOptions {\n /**\n * Configuration\n */\n config: WorkspaceServiceConfig;\n\n /**\n * Credential service for managing git credentials\n */\n credentialService: CredentialService;\n\n /**\n * Optional logger\n */\n logger?: WorkspaceServiceLogger;\n}\n\nexport class WorkspaceService {\n private workspaces: Map<string, Workspace> = new Map();\n private readonly baseDir: string;\n private readonly branchPrefix: string;\n private readonly credentialService: CredentialService;\n private readonly logger?: WorkspaceServiceLogger;\n private readonly eventHandlers: Set<WorkspaceEventHandler> = new Set();\n\n constructor(options: WorkspaceServiceOptions) {\n this.baseDir = options.config.baseDir;\n this.branchPrefix = options.config.branchPrefix || 'parallax';\n this.credentialService = options.credentialService;\n this.logger = options.logger;\n }\n\n /**\n * Initialize the workspace service\n */\n async initialize(): Promise<void> {\n await fs.mkdir(this.baseDir, { recursive: true });\n this.log('info', { baseDir: this.baseDir }, 'Workspace service initialized');\n }\n\n /**\n * Register an event handler\n */\n onEvent(handler: WorkspaceEventHandler): () => void {\n this.eventHandlers.add(handler);\n return () => this.eventHandlers.delete(handler);\n }\n\n /**\n * Provision a new workspace for a task\n */\n async provision(config: WorkspaceConfig): Promise<Workspace> {\n const strategy: WorkspaceStrategy = config.strategy || 'clone';\n\n // Validate worktree config\n if (strategy === 'worktree') {\n if (!config.parentWorkspace) {\n throw new Error('parentWorkspace is required when strategy is \"worktree\"');\n }\n const parent = this.workspaces.get(config.parentWorkspace);\n if (!parent) {\n throw new Error(`Parent workspace not found: ${config.parentWorkspace}`);\n }\n if (parent.strategy !== 'clone') {\n throw new Error('Parent workspace must be a clone, not a worktree');\n }\n if (parent.repo !== config.repo) {\n throw new Error('Worktree must be for the same repository as parent');\n }\n }\n\n const workspaceId = randomUUID();\n\n this.log(\n 'info',\n {\n workspaceId,\n repo: config.repo,\n executionId: config.execution.id,\n role: config.task.role,\n strategy,\n },\n 'Provisioning workspace'\n );\n\n await this.emitEvent({\n type: 'workspace:provisioning',\n workspaceId,\n executionId: config.execution.id,\n timestamp: new Date(),\n });\n\n // Create workspace directory (for clone) or use worktree path\n const workspacePath = path.join(this.baseDir, workspaceId);\n\n // Get credentials (or reuse parent's for worktree)\n // For public repos, credentials are optional - we'll try unauthenticated clone\n let credential;\n\n if (strategy === 'worktree' && config.parentWorkspace) {\n const parent = this.workspaces.get(config.parentWorkspace)!;\n credential = parent.credential;\n } else {\n await fs.mkdir(workspacePath, { recursive: true });\n\n // Try to get credentials (optional for public repos)\n credential = await this.credentialService.getCredentials({\n repo: config.repo,\n access: 'write',\n context: {\n executionId: config.execution.id,\n taskId: config.task.id,\n userId: config.user?.id,\n reason: `Workspace for ${config.task.role} in ${config.execution.patternName}`,\n },\n userProvided: config.userCredentials,\n // If no userCredentials provided, allow returning null for public repos\n optional: !config.userCredentials,\n });\n\n if (credential) {\n await this.emitEvent({\n type: 'credential:granted',\n workspaceId,\n credentialId: credential.id,\n executionId: config.execution.id,\n timestamp: new Date(),\n });\n }\n }\n\n // Generate branch name (or use caller-provided override)\n const branchInfo: BranchInfo = config.branchName\n ? {\n name: config.branchName,\n executionId: config.execution.id,\n baseBranch: config.baseBranch,\n createdAt: new Date(),\n }\n : createBranchInfo(\n {\n executionId: config.execution.id,\n role: config.task.role,\n slug: config.task.slug,\n baseBranch: config.baseBranch,\n },\n { prefix: this.branchPrefix }\n );\n\n // Create workspace object (credential is optional for public repos)\n const workspace: Workspace = {\n id: workspaceId,\n path: workspacePath,\n repo: config.repo,\n branch: branchInfo,\n credential: credential ?? undefined, // Optional for public repos\n provisionedAt: new Date(),\n status: 'provisioning',\n strategy,\n parentWorkspaceId: config.parentWorkspace,\n onComplete: config.onComplete,\n progress: {\n phase: 'initializing',\n message: 'Initializing workspace',\n updatedAt: new Date(),\n },\n };\n\n this.workspaces.set(workspaceId, workspace);\n\n try {\n if (strategy === 'clone') {\n // Clone repository\n this.updateProgress(workspace, 'cloning', 'Cloning repository');\n\n // If no credentials, try unauthenticated clone (for public repos)\n if (!credential) {\n const cloneResult = await this.tryUnauthenticatedClone(workspace);\n if (!cloneResult.success) {\n // Unauthenticated clone failed - this is a private repo or auth is required\n // Throw a clear error since we already tried to get credentials above\n throw new Error(\n `Repository ${config.repo} requires authentication but no credentials are available. ` +\n 'Please provide credentials or configure OAuth.'\n );\n }\n // Unauthenticated clone succeeded - this is a public repo\n this.log('info', { workspaceId }, 'Cloned public repository without authentication');\n } else {\n // We have credentials - clone with them\n await this.cloneRepo(workspace, credential.token);\n }\n\n // Create and checkout branch\n this.updateProgress(workspace, 'creating_branch', 'Creating branch');\n await this.createBranch(workspace);\n } else {\n // Add worktree from parent\n const parent = this.workspaces.get(config.parentWorkspace!)!;\n await this.addWorktreeFromParent(parent, workspace);\n\n // Track worktree in parent\n if (!parent.worktreeIds) {\n parent.worktreeIds = [];\n }\n parent.worktreeIds.push(workspaceId);\n this.workspaces.set(parent.id, parent);\n\n await this.emitEvent({\n type: 'worktree:added',\n workspaceId,\n executionId: config.execution.id,\n timestamp: new Date(),\n data: { parentWorkspaceId: parent.id },\n });\n }\n\n // Configure git for this workspace\n this.updateProgress(workspace, 'configuring', 'Configuring git');\n await this.configureGit(workspace);\n\n // Mark as ready\n workspace.status = 'ready';\n this.updateProgress(workspace, 'ready', 'Workspace ready');\n this.workspaces.set(workspaceId, workspace);\n\n // Execute completion hook if configured\n await this.executeCompletionHook(workspace, 'success');\n\n this.log(\n 'info',\n {\n workspaceId,\n path: workspacePath,\n branch: branchInfo.name,\n strategy,\n },\n 'Workspace provisioned'\n );\n\n await this.emitEvent({\n type: 'workspace:ready',\n workspaceId,\n executionId: config.execution.id,\n timestamp: new Date(),\n });\n\n return workspace;\n } catch (error) {\n workspace.status = 'error';\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.updateProgress(workspace, 'error', errorMessage);\n this.workspaces.set(workspaceId, workspace);\n\n this.log('error', { workspaceId, error: errorMessage }, 'Failed to provision workspace');\n\n await this.emitEvent({\n type: 'workspace:error',\n workspaceId,\n executionId: config.execution.id,\n timestamp: new Date(),\n error: errorMessage,\n });\n\n // Execute completion hook on error if configured\n await this.executeCompletionHook(workspace, 'error');\n\n throw error;\n }\n }\n\n /**\n * Add a worktree to an existing clone workspace (convenience method)\n */\n async addWorktree(\n parentWorkspaceId: string,\n options: {\n branch: string;\n execution: { id: string; patternName: string };\n task: { id: string; role: string; slug?: string };\n }\n ): Promise<Workspace> {\n const parent = this.workspaces.get(parentWorkspaceId);\n if (!parent) {\n throw new Error(`Parent workspace not found: ${parentWorkspaceId}`);\n }\n\n return this.provision({\n repo: parent.repo,\n strategy: 'worktree',\n parentWorkspace: parentWorkspaceId,\n branchStrategy: 'feature_branch',\n baseBranch: options.branch,\n execution: options.execution,\n task: options.task,\n });\n }\n\n /**\n * List all worktrees for a parent workspace\n */\n listWorktrees(parentWorkspaceId: string): Workspace[] {\n const parent = this.workspaces.get(parentWorkspaceId);\n if (!parent) {\n return [];\n }\n\n if (!parent.worktreeIds || parent.worktreeIds.length === 0) {\n return [];\n }\n\n return parent.worktreeIds\n .map((id) => this.workspaces.get(id))\n .filter((w): w is Workspace => w !== undefined);\n }\n\n /**\n * Remove a worktree (alias for cleanup with worktree-specific handling)\n */\n async removeWorktree(workspaceId: string): Promise<void> {\n const workspace = this.workspaces.get(workspaceId);\n if (!workspace) {\n return;\n }\n\n if (workspace.strategy !== 'worktree') {\n throw new Error('Workspace is not a worktree. Use cleanup() instead.');\n }\n\n await this.cleanup(workspaceId);\n }\n\n /**\n * Finalize a workspace (push, create PR, cleanup)\n */\n async finalize(\n workspaceId: string,\n options: WorkspaceFinalization\n ): Promise<PullRequestInfo | void> {\n const workspace = this.workspaces.get(workspaceId);\n if (!workspace) {\n throw new Error(`Workspace not found: ${workspaceId}`);\n }\n\n workspace.status = 'finalizing';\n this.workspaces.set(workspaceId, workspace);\n\n this.log(\n 'info',\n {\n workspaceId,\n push: options.push,\n createPr: options.createPr,\n },\n 'Finalizing workspace'\n );\n\n await this.emitEvent({\n type: 'workspace:finalizing',\n workspaceId,\n executionId: workspace.branch.executionId,\n timestamp: new Date(),\n });\n\n let pr: PullRequestInfo | undefined;\n\n try {\n if (options.push) {\n await this.pushBranch(workspace);\n }\n\n if (options.createPr && options.pr) {\n pr = await this.createPullRequest(workspace, options.pr);\n workspace.branch.pullRequest = pr;\n\n await this.emitEvent({\n type: 'pr:created',\n workspaceId,\n executionId: workspace.branch.executionId,\n timestamp: new Date(),\n data: {\n prNumber: pr.number,\n prUrl: pr.url,\n },\n });\n }\n\n if (options.cleanup) {\n await this.cleanup(workspaceId);\n } else {\n workspace.status = 'ready';\n this.workspaces.set(workspaceId, workspace);\n }\n\n return pr;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.log('error', { workspaceId, error: errorMessage }, 'Failed to finalize workspace');\n throw error;\n }\n }\n\n /**\n * Get a workspace by ID\n */\n get(workspaceId: string): Workspace | null {\n return this.workspaces.get(workspaceId) || null;\n }\n\n /**\n * Get all workspaces for an execution\n */\n getForExecution(executionId: string): Workspace[] {\n return Array.from(this.workspaces.values()).filter(\n (w) => w.branch.executionId === executionId\n );\n }\n\n /**\n * Clean up a workspace\n */\n async cleanup(workspaceId: string): Promise<void> {\n const workspace = this.workspaces.get(workspaceId);\n if (!workspace) {\n return;\n }\n\n this.log('info', { workspaceId, strategy: workspace.strategy }, 'Cleaning up workspace');\n\n // If this is a clone with worktrees, clean up worktrees first\n if (workspace.strategy === 'clone' && workspace.worktreeIds?.length) {\n this.log(\n 'info',\n { workspaceId, worktreeCount: workspace.worktreeIds.length },\n 'Cleaning up child worktrees first'\n );\n for (const worktreeId of workspace.worktreeIds) {\n await this.cleanup(worktreeId);\n }\n }\n\n // Clean up credential files first (securely remove tokens)\n try {\n await cleanupCredentialFiles(workspace.path);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.log('warn', { workspaceId, error: errorMessage }, 'Failed to clean up credential files');\n }\n\n // Handle worktree removal via git\n if (workspace.strategy === 'worktree' && workspace.parentWorkspaceId) {\n const parent = this.workspaces.get(workspace.parentWorkspaceId);\n if (parent) {\n try {\n // Remove worktree using git command from parent\n await this.execInDir(parent.path, `git worktree remove \"${workspace.path}\" --force`);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.log('warn', { workspaceId, error: errorMessage }, 'Failed to remove worktree via git');\n }\n\n // Remove from parent's worktreeIds\n if (parent.worktreeIds) {\n parent.worktreeIds = parent.worktreeIds.filter((id) => id !== workspaceId);\n this.workspaces.set(parent.id, parent);\n }\n\n await this.emitEvent({\n type: 'worktree:removed',\n workspaceId,\n executionId: workspace.branch.executionId,\n timestamp: new Date(),\n data: { parentWorkspaceId: parent.id },\n });\n }\n }\n\n // Revoke credentials (only for clone workspaces with credentials - worktrees share parent's credential)\n if (workspace.strategy === 'clone' && workspace.credential) {\n await this.credentialService.revokeCredential(workspace.credential.id);\n\n await this.emitEvent({\n type: 'credential:revoked',\n workspaceId,\n credentialId: workspace.credential.id,\n executionId: workspace.branch.executionId,\n timestamp: new Date(),\n });\n }\n\n // Remove workspace directory (for clones or if worktree removal failed)\n try {\n await fs.rm(workspace.path, { recursive: true, force: true });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.log('warn', { workspaceId, error: errorMessage }, 'Failed to remove workspace directory');\n }\n\n workspace.status = 'cleaned_up';\n this.workspaces.set(workspaceId, workspace);\n\n await this.emitEvent({\n type: 'workspace:cleaned_up',\n workspaceId,\n executionId: workspace.branch.executionId,\n timestamp: new Date(),\n });\n }\n\n /**\n * Clean up all workspaces for an execution\n */\n async cleanupForExecution(executionId: string): Promise<void> {\n const workspaces = this.getForExecution(executionId);\n await Promise.all(workspaces.map((w) => this.cleanup(w.id)));\n\n // Also revoke all credentials for this execution\n await this.credentialService.revokeForExecution(executionId);\n }\n\n // ─────────────────────────────────────────────────────────────\n // Private Methods\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Try to clone a public repository without authentication\n */\n private async tryUnauthenticatedClone(\n workspace: Workspace\n ): Promise<{ success: boolean; error?: string }> {\n // Build HTTPS URL without auth\n let cloneUrl = workspace.repo;\n\n // Convert SSH to HTTPS\n if (cloneUrl.startsWith('git@github.com:')) {\n cloneUrl = cloneUrl.replace('git@github.com:', 'https://github.com/');\n }\n\n // Strip trailing slashes before checking for .git\n cloneUrl = cloneUrl.replace(/\\/+$/, '');\n\n // Add .git if missing\n if (!cloneUrl.endsWith('.git')) {\n cloneUrl = `${cloneUrl}.git`;\n }\n\n // Ensure HTTPS\n if (!cloneUrl.startsWith('https://')) {\n cloneUrl = `https://${cloneUrl}`;\n }\n\n try {\n await this.execInDir(\n workspace.path,\n `git clone --depth 1 --branch ${workspace.branch.baseBranch} ${cloneUrl} .`\n );\n this.log('info', { workspaceId: workspace.id }, 'Public repository cloned without authentication');\n return { success: true };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n // Check if it's an auth error (401/403) or repo not found\n const isAuthError =\n errorMessage.includes('401') ||\n errorMessage.includes('403') ||\n errorMessage.includes('Authentication failed') ||\n errorMessage.includes('could not read Username') ||\n errorMessage.includes('terminal prompts disabled');\n\n if (isAuthError) {\n return { success: false, error: 'Authentication required' };\n }\n\n // For other errors (repo not found, network issues), throw\n throw error;\n }\n }\n\n private async cloneRepo(workspace: Workspace, token: string): Promise<void> {\n // For SSH credentials (empty token), use the URL as-is\n // For token-based auth, build authenticated HTTPS URL\n const cloneUrl = token\n ? this.buildAuthenticatedUrl(workspace.repo, token)\n : workspace.repo;\n\n // Clone with depth 1 for speed\n await this.execInDir(\n workspace.path,\n `git clone --depth 1 --branch ${workspace.branch.baseBranch} ${cloneUrl} .`\n );\n }\n\n private async createBranch(workspace: Workspace): Promise<void> {\n // Create and checkout the new branch\n await this.execInDir(workspace.path, `git checkout -b ${workspace.branch.name}`);\n }\n\n private async addWorktreeFromParent(parent: Workspace, workspace: Workspace): Promise<void> {\n // Fetch the base branch first to ensure it's up to date\n try {\n await this.execInDir(parent.path, `git fetch origin ${workspace.branch.baseBranch}`);\n } catch {\n // May fail if already fetched or in shallow clone, continue anyway\n }\n\n // Create the worktree with a new branch based on the base branch\n // Use -b to create the new branch at the same time\n await this.execInDir(\n parent.path,\n `git worktree add -b ${workspace.branch.name} \"${workspace.path}\" origin/${workspace.branch.baseBranch}`\n );\n }\n\n private async configureGit(workspace: Workspace): Promise<void> {\n // Configure git identity\n await this.execInDir(workspace.path, 'git config user.name \"Workspace Agent\"');\n await this.execInDir(workspace.path, 'git config user.email \"agent@workspace.local\"');\n\n // Skip credential helper if no credentials (public repo) or SSH-based auth (no token)\n if (!workspace.credential || !workspace.credential.token) {\n this.log(\n 'debug',\n { workspaceId: workspace.id },\n workspace.credential\n ? 'Using SSH authentication, skipping credential helper'\n : 'No credentials (public repo), skipping credential helper'\n );\n return;\n }\n\n // Configure credential helper for token-based auth\n const credentialContext: CredentialHelperContext = {\n workspaceId: workspace.id,\n executionId: workspace.branch.executionId,\n repo: workspace.repo,\n token: workspace.credential.token,\n expiresAt: workspace.credential.expiresAt.toISOString(),\n };\n\n const helperScriptPath = await configureCredentialHelper(\n workspace.path,\n credentialContext\n );\n\n // Configure git to use our credential helper\n const configCommands = getGitCredentialConfig(helperScriptPath);\n for (const cmd of configCommands) {\n await this.execInDir(workspace.path, cmd);\n }\n\n this.log(\n 'debug',\n { workspaceId: workspace.id, helperPath: helperScriptPath },\n 'Git credential helper configured'\n );\n }\n\n private async pushBranch(workspace: Workspace): Promise<void> {\n // Push requires credentials\n if (!workspace.credential) {\n throw new Error(\n 'Push requires authentication. This workspace was cloned from a public repository without credentials.'\n );\n }\n\n // Push using origin remote - credentials provided by helper\n await this.execInDir(workspace.path, `git push -u origin ${workspace.branch.name}`);\n }\n\n private async createPullRequest(\n workspace: Workspace,\n config: NonNullable<WorkspaceFinalization['pr']>\n ): Promise<PullRequestInfo> {\n // PR creation requires credentials\n if (!workspace.credential) {\n throw new Error(\n 'Pull request creation requires authentication. This workspace was cloned from a public repository without credentials.'\n );\n }\n\n // Parse repo to get owner/repo\n const repoInfo = this.parseRepo(workspace.repo);\n if (!repoInfo) {\n throw new Error(`Invalid repository format: ${workspace.repo}`);\n }\n\n // Get provider from credential service\n const provider = this.credentialService.getProvider(workspace.credential.provider);\n if (!provider) {\n throw new Error(`Provider not configured: ${workspace.credential.provider}`);\n }\n\n // Create the PR\n const pr = await provider.createPullRequest({\n repo: workspace.repo,\n sourceBranch: workspace.branch.name,\n targetBranch: config.targetBranch,\n title: config.title,\n body: config.body,\n draft: config.draft,\n labels: config.labels,\n reviewers: config.reviewers,\n credential: workspace.credential,\n });\n\n // Set execution ID\n pr.executionId = workspace.branch.executionId;\n\n this.log(\n 'info',\n {\n workspaceId: workspace.id,\n prNumber: pr.number,\n prUrl: pr.url,\n },\n 'Pull request created'\n );\n\n return pr;\n }\n\n private parseRepo(repo: string): { owner: string; repo: string } | null {\n const patterns = [/github\\.com[/:]([^/]+)\\/([^/.]+)/, /^([^/]+)\\/([^/]+)$/];\n\n for (const pattern of patterns) {\n const match = repo.match(pattern);\n if (match) {\n return { owner: match[1], repo: match[2].replace(/\\.git$/, '') };\n }\n }\n\n return null;\n }\n\n private buildAuthenticatedUrl(repo: string, token: string): string {\n // Handle various repo formats\n let url = repo;\n\n // Convert SSH to HTTPS\n if (url.startsWith('git@github.com:')) {\n url = url.replace('git@github.com:', 'https://github.com/');\n }\n\n // Strip trailing slashes before checking for .git\n url = url.replace(/\\/+$/, '');\n\n // Add .git if missing\n if (!url.endsWith('.git')) {\n url = `${url}.git`;\n }\n\n // Ensure HTTPS\n if (!url.startsWith('https://')) {\n url = `https://${url}`;\n }\n\n // Insert token\n url = url.replace('https://', `https://x-access-token:${token}@`);\n\n return url;\n }\n\n private async execInDir(dir: string, command: string): Promise<string> {\n // Mask tokens in logs\n const safeCommand = command.replace(/x-access-token:[^@]+@/g, 'x-access-token:***@');\n this.log('debug', { dir, command: safeCommand }, 'Executing git command');\n\n const { stdout, stderr } = await execAsync(command, { cwd: dir });\n\n if (stderr && !stderr.includes('Cloning into')) {\n this.log('debug', { stderr: stderr.substring(0, 200) }, 'Git stderr');\n }\n\n return stdout;\n }\n\n private log(\n level: 'info' | 'warn' | 'error' | 'debug',\n data: Record<string, unknown>,\n message: string\n ): void {\n if (this.logger) {\n this.logger[level](data, message);\n }\n }\n\n private async emitEvent(event: WorkspaceEvent): Promise<void> {\n for (const handler of this.eventHandlers) {\n try {\n await handler(event);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.log('warn', { event: event.type, error: errorMessage }, 'Event handler error');\n }\n }\n }\n\n /**\n * Update workspace progress\n */\n private updateProgress(workspace: Workspace, phase: WorkspacePhase, message?: string): void {\n workspace.progress = {\n phase,\n message,\n updatedAt: new Date(),\n };\n this.workspaces.set(workspace.id, workspace);\n\n this.log(\n 'debug',\n { workspaceId: workspace.id, phase, message },\n 'Progress updated'\n );\n }\n\n /**\n * Execute completion hook if configured\n */\n private async executeCompletionHook(\n workspace: Workspace,\n status: 'success' | 'error'\n ): Promise<void> {\n const hook = workspace.onComplete;\n if (!hook) return;\n\n // Check if we should run on error\n if (status === 'error' && hook.runOnError === false) {\n return;\n }\n\n // Set up environment variables for command\n const env = {\n ...process.env,\n WORKSPACE_ID: workspace.id,\n REPO: workspace.repo,\n BRANCH: workspace.branch.name,\n STATUS: status,\n WORKSPACE_PATH: workspace.path,\n };\n\n // Execute command if configured\n if (hook.command) {\n try {\n this.log('info', { workspaceId: workspace.id, command: hook.command }, 'Executing completion hook command');\n await execAsync(hook.command, { env });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.log('warn', { workspaceId: workspace.id, error: errorMessage }, 'Completion hook command failed');\n }\n }\n\n // Call webhook if configured\n if (hook.webhook) {\n try {\n this.log('info', { workspaceId: workspace.id, webhook: hook.webhook }, 'Calling completion webhook');\n const payload = {\n workspaceId: workspace.id,\n repo: workspace.repo,\n branch: workspace.branch.name,\n status,\n timestamp: new Date().toISOString(),\n };\n\n await fetch(hook.webhook, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...hook.webhookHeaders,\n },\n body: JSON.stringify(payload),\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.log('warn', { workspaceId: workspace.id, error: errorMessage }, 'Completion webhook failed');\n }\n }\n }\n}\n","/**\n * OAuth Device Code Flow\n *\n * Implements the OAuth 2.0 Device Authorization Grant (RFC 8628)\n * for authenticating CLI/agent applications without browser control.\n *\n * Flow:\n * 1. Request device code from provider\n * 2. Display verification URL and user code to user\n * 3. Poll for authorization while user completes in browser\n * 4. Receive access token on success\n */\n\nimport type {\n GitProvider,\n AgentPermissions,\n OAuthToken,\n DeviceCodeResponse,\n AuthPrompt,\n AuthResult,\n AuthPromptEmitter,\n} from '../types';\n\n// Response types for GitHub OAuth API\ninterface DeviceCodeApiResponse {\n device_code: string;\n user_code: string;\n verification_uri: string;\n verification_uri_complete?: string;\n expires_in: number;\n interval?: number;\n}\n\ninterface TokenApiResponse {\n access_token?: string;\n token_type?: string;\n scope?: string;\n expires_in?: number;\n refresh_token?: string;\n error?: string;\n error_description?: string;\n}\n\nexport interface OAuthDeviceFlowConfig {\n /**\n * OAuth Client ID\n */\n clientId: string;\n\n /**\n * OAuth Client Secret (optional for public clients)\n */\n clientSecret?: string;\n\n /**\n * Provider (defaults to 'github')\n */\n provider?: GitProvider;\n\n /**\n * Permissions to request\n */\n permissions?: AgentPermissions;\n\n /**\n * Auth prompt emitter for user interaction\n */\n promptEmitter?: AuthPromptEmitter;\n\n /**\n * Timeout in seconds for the auth flow (default: 900 = 15 min)\n */\n timeout?: number;\n}\n\nexport interface OAuthDeviceFlowLogger {\n info(data: Record<string, unknown>, message: string): void;\n warn(data: Record<string, unknown>, message: string): void;\n error(data: Record<string, unknown>, message: string): void;\n debug(data: Record<string, unknown>, message: string): void;\n}\n\n// GitHub OAuth endpoints\nconst GITHUB_DEVICE_CODE_URL = 'https://github.com/login/device/code';\nconst GITHUB_TOKEN_URL = 'https://github.com/login/oauth/access_token';\n\n// Error codes from device flow\nconst ERROR_AUTHORIZATION_PENDING = 'authorization_pending';\nconst ERROR_SLOW_DOWN = 'slow_down';\nconst ERROR_EXPIRED_TOKEN = 'expired_token';\nconst ERROR_ACCESS_DENIED = 'access_denied';\n\n/**\n * OAuth Device Code Flow implementation for GitHub\n */\nexport class OAuthDeviceFlow {\n private readonly clientId: string;\n private readonly clientSecret?: string;\n private readonly provider: GitProvider;\n private readonly permissions: AgentPermissions;\n private readonly promptEmitter?: AuthPromptEmitter;\n private readonly timeout: number;\n private readonly logger?: OAuthDeviceFlowLogger;\n\n constructor(config: OAuthDeviceFlowConfig, logger?: OAuthDeviceFlowLogger) {\n this.clientId = config.clientId;\n this.clientSecret = config.clientSecret;\n this.provider = config.provider || 'github';\n this.permissions = config.permissions || {\n repositories: { type: 'all' },\n contents: 'write',\n pullRequests: 'write',\n issues: 'write',\n metadata: 'read',\n canDeleteBranch: true,\n canForcePush: false,\n canDeleteRepository: false,\n canAdminister: false,\n };\n this.promptEmitter = config.promptEmitter;\n this.timeout = config.timeout || 900;\n this.logger = logger;\n }\n\n /**\n * Start the device code flow and wait for authorization\n */\n async authorize(): Promise<OAuthToken> {\n this.log('info', {}, 'Starting OAuth device code flow');\n\n // Step 1: Request device code\n const deviceCode = await this.requestDeviceCode();\n\n // Step 2: Emit auth prompt\n const prompt: AuthPrompt = {\n provider: this.provider,\n verificationUri: deviceCode.verificationUri,\n userCode: deviceCode.userCode,\n expiresIn: deviceCode.expiresIn,\n requestedPermissions: this.permissions,\n };\n\n if (this.promptEmitter) {\n this.promptEmitter.onAuthRequired(prompt);\n } else {\n // Default: log to console\n this.printAuthPrompt(prompt);\n }\n\n // Step 3: Poll for authorization\n try {\n const token = await this.pollForToken(deviceCode);\n\n const result: AuthResult = {\n success: true,\n provider: this.provider,\n };\n\n if (this.promptEmitter) {\n this.promptEmitter.onAuthComplete(result);\n }\n\n this.log('info', {}, 'OAuth authorization successful');\n return token;\n } catch (error) {\n const result: AuthResult = {\n success: false,\n provider: this.provider,\n error: error instanceof Error ? error.message : String(error),\n };\n\n if (this.promptEmitter) {\n this.promptEmitter.onAuthComplete(result);\n }\n\n throw error;\n }\n }\n\n /**\n * Request a device code from GitHub\n */\n async requestDeviceCode(): Promise<DeviceCodeResponse> {\n const scope = this.permissionsToScopes(this.permissions);\n\n this.log('debug', { scope }, 'Requesting device code');\n\n const response = await fetch(GITHUB_DEVICE_CODE_URL, {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n client_id: this.clientId,\n scope,\n }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Failed to request device code: ${response.status} ${text}`);\n }\n\n const data = (await response.json()) as DeviceCodeApiResponse;\n\n return {\n deviceCode: data.device_code,\n userCode: data.user_code,\n verificationUri: data.verification_uri,\n verificationUriComplete: data.verification_uri_complete,\n expiresIn: data.expires_in,\n interval: data.interval || 5,\n };\n }\n\n /**\n * Poll for the access token until authorized or timeout\n */\n async pollForToken(deviceCode: DeviceCodeResponse): Promise<OAuthToken> {\n const startTime = Date.now();\n let interval = deviceCode.interval * 1000;\n const expiresAt = startTime + deviceCode.expiresIn * 1000;\n\n while (Date.now() < expiresAt) {\n // Check overall timeout\n if (Date.now() - startTime > this.timeout * 1000) {\n throw new Error('OAuth flow timed out');\n }\n\n // Wait before polling\n await this.sleep(interval);\n\n // Notify about pending status\n const secondsRemaining = Math.ceil((expiresAt - Date.now()) / 1000);\n if (this.promptEmitter?.onAuthPending) {\n this.promptEmitter.onAuthPending(secondsRemaining);\n }\n\n try {\n const token = await this.exchangeDeviceCode(deviceCode.deviceCode);\n return token;\n } catch (error) {\n if (error instanceof DeviceFlowError) {\n switch (error.code) {\n case ERROR_AUTHORIZATION_PENDING:\n // Still waiting for user, continue polling\n this.log('debug', {}, 'Authorization pending, continuing to poll');\n continue;\n\n case ERROR_SLOW_DOWN:\n // Increase polling interval\n interval += 5000;\n this.log('debug', { interval }, 'Slowing down polling');\n continue;\n\n case ERROR_EXPIRED_TOKEN:\n throw new Error('Device code expired. Please try again.');\n\n case ERROR_ACCESS_DENIED:\n throw new Error('User denied authorization');\n\n default:\n throw error;\n }\n }\n throw error;\n }\n }\n\n throw new Error('Device code expired');\n }\n\n /**\n * Exchange device code for access token\n */\n private async exchangeDeviceCode(deviceCode: string): Promise<OAuthToken> {\n const body: Record<string, string> = {\n client_id: this.clientId,\n device_code: deviceCode,\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n };\n\n if (this.clientSecret) {\n body.client_secret = this.clientSecret;\n }\n\n const response = await fetch(GITHUB_TOKEN_URL, {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n\n const data = (await response.json()) as TokenApiResponse;\n\n // Check for errors\n if (data.error) {\n throw new DeviceFlowError(data.error, data.error_description);\n }\n\n // Parse scopes\n const scopes = (data.scope || '').split(/[,\\s]+/).filter(Boolean);\n\n return {\n accessToken: data.access_token!,\n tokenType: data.token_type || 'bearer',\n scopes,\n expiresAt: data.expires_in\n ? new Date(Date.now() + data.expires_in * 1000)\n : undefined,\n refreshToken: data.refresh_token,\n provider: this.provider,\n permissions: this.permissions,\n createdAt: new Date(),\n };\n }\n\n /**\n * Refresh an expired token\n */\n async refreshToken(refreshTokenValue: string): Promise<OAuthToken> {\n this.log('info', {}, 'Refreshing OAuth token');\n\n const body: Record<string, string> = {\n client_id: this.clientId,\n grant_type: 'refresh_token',\n refresh_token: refreshTokenValue,\n };\n\n if (this.clientSecret) {\n body.client_secret = this.clientSecret;\n }\n\n const response = await fetch(GITHUB_TOKEN_URL, {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Failed to refresh token: ${response.status} ${text}`);\n }\n\n const data = (await response.json()) as TokenApiResponse;\n\n if (data.error) {\n throw new Error(`Token refresh failed: ${data.error_description || data.error}`);\n }\n\n const scopes = (data.scope || '').split(/[,\\s]+/).filter(Boolean);\n\n return {\n accessToken: data.access_token!,\n tokenType: data.token_type || 'bearer',\n scopes,\n expiresAt: data.expires_in\n ? new Date(Date.now() + data.expires_in * 1000)\n : undefined,\n refreshToken: data.refresh_token || refreshTokenValue,\n provider: this.provider,\n permissions: this.permissions,\n createdAt: new Date(),\n };\n }\n\n /**\n * Convert AgentPermissions to GitHub OAuth scopes\n */\n private permissionsToScopes(permissions: AgentPermissions): string {\n const scopes: string[] = [];\n\n // Contents (code)\n if (permissions.contents === 'write') {\n scopes.push('repo'); // Full repo access for private repos\n } else if (permissions.contents === 'read') {\n scopes.push('public_repo'); // Only public repos read\n }\n\n // Pull requests and issues are covered by 'repo'\n // But we can be more specific with these for public repos\n if (permissions.pullRequests !== 'none' && !scopes.includes('repo')) {\n scopes.push('public_repo');\n }\n\n // User info (to get username)\n scopes.push('read:user');\n\n // Note: GitHub's classic OAuth scopes are coarse-grained\n // Fine-grained permissions require GitHub Apps or fine-grained PATs\n // For now, we request 'repo' which gives full access but we\n // enforce limits at the service layer\n\n return scopes.join(' ');\n }\n\n /**\n * Print auth prompt to console (default behavior)\n */\n private printAuthPrompt(prompt: AuthPrompt): void {\n console.log('\\n┌────────────────────────────────────────────────┐');\n console.log('│ GitHub Authorization Required │');\n console.log('├────────────────────────────────────────────────┤');\n console.log(`│ 1. Go to: ${prompt.verificationUri.padEnd(35)}│`);\n console.log(`│ 2. Enter code: ${prompt.userCode.padEnd(29)}│`);\n console.log('├────────────────────────────────────────────────┤');\n console.log(`│ ⏳ Waiting for authorization... │`);\n console.log(`│ Code expires in ${prompt.expiresIn} seconds${' '.repeat(18)}│`);\n console.log('└────────────────────────────────────────────────┘\\n');\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private log(\n level: 'info' | 'warn' | 'error' | 'debug',\n data: Record<string, unknown>,\n message: string\n ): void {\n if (this.logger) {\n this.logger[level](data, message);\n }\n }\n}\n\n/**\n * Error class for device flow specific errors\n */\nclass DeviceFlowError extends Error {\n constructor(\n public readonly code: string,\n public readonly description?: string\n ) {\n super(description || code);\n this.name = 'DeviceFlowError';\n }\n}\n","/**\n * Token Store\n *\n * Securely stores and manages OAuth tokens with support for:\n * - Expiry checking\n * - Automatic refresh triggers\n * - Multiple storage backends (file, memory, keychain)\n */\n\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport * as os from 'os';\nimport * as crypto from 'crypto';\nimport type { GitProvider, OAuthToken } from '../types';\n\nexport interface TokenStoreOptions {\n /**\n * Encryption key for file-based storage\n * If not provided, tokens are stored in plaintext (not recommended for production)\n */\n encryptionKey?: string;\n\n /**\n * Directory to store tokens (for FileTokenStore)\n * Default: ~/.parallax/tokens\n */\n directory?: string;\n}\n\n/**\n * Token store interface\n */\nexport abstract class TokenStore {\n /**\n * Save a token for a provider\n */\n abstract save(provider: GitProvider, token: OAuthToken): Promise<void>;\n\n /**\n * Get a token for a provider\n */\n abstract get(provider: GitProvider): Promise<OAuthToken | null>;\n\n /**\n * Clear a token for a provider (or all tokens)\n */\n abstract clear(provider?: GitProvider): Promise<void>;\n\n /**\n * List all stored providers\n */\n abstract list(): Promise<GitProvider[]>;\n\n /**\n * Check if a token is expired\n */\n isExpired(token: OAuthToken): boolean {\n if (!token.expiresAt) {\n return false; // No expiry = never expires\n }\n // Consider expired if within 5 minutes of expiry\n const buffer = 5 * 60 * 1000;\n return Date.now() > token.expiresAt.getTime() - buffer;\n }\n\n /**\n * Check if a token needs refresh (expired or close to expiry)\n */\n needsRefresh(token: OAuthToken): boolean {\n if (!token.expiresAt) {\n return false;\n }\n // Refresh if within 10 minutes of expiry\n const buffer = 10 * 60 * 1000;\n return Date.now() > token.expiresAt.getTime() - buffer;\n }\n}\n\n/**\n * In-memory token store (for testing and short-lived processes)\n */\nexport class MemoryTokenStore extends TokenStore {\n private tokens: Map<GitProvider, OAuthToken> = new Map();\n\n async save(provider: GitProvider, token: OAuthToken): Promise<void> {\n this.tokens.set(provider, token);\n }\n\n async get(provider: GitProvider): Promise<OAuthToken | null> {\n return this.tokens.get(provider) || null;\n }\n\n async clear(provider?: GitProvider): Promise<void> {\n if (provider) {\n this.tokens.delete(provider);\n } else {\n this.tokens.clear();\n }\n }\n\n async list(): Promise<GitProvider[]> {\n return Array.from(this.tokens.keys());\n }\n}\n\n/**\n * File-based token store with optional encryption\n */\nexport class FileTokenStore extends TokenStore {\n private readonly directory: string;\n private readonly encryptionKey?: Buffer;\n\n constructor(options: TokenStoreOptions = {}) {\n super();\n this.directory = options.directory || path.join(os.homedir(), '.parallax', 'tokens');\n\n if (options.encryptionKey) {\n // Derive a 32-byte key from the provided key\n this.encryptionKey = crypto\n .createHash('sha256')\n .update(options.encryptionKey)\n .digest();\n }\n }\n\n async save(provider: GitProvider, token: OAuthToken): Promise<void> {\n await this.ensureDirectory();\n\n const filePath = this.getTokenPath(provider);\n\n // Serialize token (convert Date to ISO string)\n const serialized = JSON.stringify({\n ...token,\n expiresAt: token.expiresAt?.toISOString(),\n createdAt: token.createdAt.toISOString(),\n });\n\n // Encrypt if key provided\n const data = this.encryptionKey\n ? this.encrypt(serialized)\n : serialized;\n\n await fs.writeFile(filePath, data, 'utf-8');\n }\n\n async get(provider: GitProvider): Promise<OAuthToken | null> {\n const filePath = this.getTokenPath(provider);\n\n try {\n const data = await fs.readFile(filePath, 'utf-8');\n\n // Decrypt if encrypted\n const serialized = this.encryptionKey\n ? this.decrypt(data)\n : data;\n\n const parsed = JSON.parse(serialized);\n\n // Convert date strings back to Date objects\n return {\n ...parsed,\n expiresAt: parsed.expiresAt ? new Date(parsed.expiresAt) : undefined,\n createdAt: new Date(parsed.createdAt),\n };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return null;\n }\n throw error;\n }\n }\n\n async clear(provider?: GitProvider): Promise<void> {\n if (provider) {\n const filePath = this.getTokenPath(provider);\n try {\n await fs.unlink(filePath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n } else {\n // Clear all tokens\n try {\n const files = await fs.readdir(this.directory);\n await Promise.all(\n files\n .filter((f) => f.endsWith('.token'))\n .map((f) => fs.unlink(path.join(this.directory, f)))\n );\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n }\n }\n\n async list(): Promise<GitProvider[]> {\n try {\n const files = await fs.readdir(this.directory);\n return files\n .filter((f) => f.endsWith('.token'))\n .map((f) => f.replace('.token', '') as GitProvider);\n } catch {\n return [];\n }\n }\n\n private getTokenPath(provider: GitProvider): string {\n return path.join(this.directory, `${provider}.token`);\n }\n\n private async ensureDirectory(): Promise<void> {\n await fs.mkdir(this.directory, { recursive: true, mode: 0o700 });\n }\n\n private encrypt(data: string): string {\n if (!this.encryptionKey) {\n return data;\n }\n\n const iv = crypto.randomBytes(16);\n const cipher = crypto.createCipheriv('aes-256-cbc', this.encryptionKey, iv);\n let encrypted = cipher.update(data, 'utf8', 'hex');\n encrypted += cipher.final('hex');\n\n // Prepend IV to encrypted data\n return iv.toString('hex') + ':' + encrypted;\n }\n\n private decrypt(data: string): string {\n if (!this.encryptionKey) {\n return data;\n }\n\n const [ivHex, encrypted] = data.split(':');\n const iv = Buffer.from(ivHex, 'hex');\n const decipher = crypto.createDecipheriv('aes-256-cbc', this.encryptionKey, iv);\n let decrypted = decipher.update(encrypted, 'hex', 'utf8');\n decrypted += decipher.final('utf8');\n\n return decrypted;\n }\n}\n","/**\n * Git Credential Service\n *\n * Manages credentials for private repository access.\n * Supports GitHub App, OAuth device flow, deploy keys, and PATs.\n *\n * Credential priority:\n * 1. User-provided (PAT, OAuth token, SSH)\n * 2. Cached OAuth token (from TokenStore)\n * 3. Provider adapter (GitHub App, etc.)\n * 4. OAuth device flow (interactive)\n */\n\nimport { randomUUID } from 'crypto';\nimport type {\n GitCredential,\n GitCredentialRequest,\n CredentialGrant,\n GitProvider,\n CredentialType,\n GitProviderAdapter,\n OAuthToken,\n AuthPromptEmitter,\n AgentPermissions,\n} from './types';\nimport { OAuthDeviceFlow, TokenStore, MemoryTokenStore } from './oauth';\n\nexport interface CredentialServiceLogger {\n info(data: Record<string, unknown>, message: string): void;\n warn(data: Record<string, unknown>, message: string): void;\n error(data: Record<string, unknown>, message: string): void;\n}\n\nexport interface CredentialGrantStore {\n create(grant: CredentialGrant & { reason?: string }): Promise<void>;\n findById(id: string): Promise<CredentialGrant | null>;\n findByExecutionId(executionId: string): Promise<CredentialGrant[]>;\n revoke(id: string): Promise<void>;\n revokeForExecution(executionId: string): Promise<number>;\n}\n\nexport interface OAuthConfig {\n /**\n * OAuth Client ID (required for device flow)\n */\n clientId: string;\n\n /**\n * OAuth Client Secret (optional for public clients)\n */\n clientSecret?: string;\n\n /**\n * Default permissions to request\n */\n permissions?: AgentPermissions;\n\n /**\n * Callback for auth prompts (for PTY integration)\n */\n promptEmitter?: AuthPromptEmitter;\n}\n\nexport interface CredentialServiceOptions {\n /**\n * Default TTL for credentials in seconds\n */\n defaultTtlSeconds?: number;\n\n /**\n * Maximum TTL allowed\n */\n maxTtlSeconds?: number;\n\n /**\n * Provider adapters keyed by provider name\n */\n providers?: Map<GitProvider, GitProviderAdapter>;\n\n /**\n * Optional persistent store for grants\n */\n grantStore?: CredentialGrantStore;\n\n /**\n * Token store for cached OAuth tokens\n * Default: MemoryTokenStore\n */\n tokenStore?: TokenStore;\n\n /**\n * OAuth configuration for device flow authentication\n * If provided, enables interactive OAuth as a fallback\n */\n oauth?: OAuthConfig;\n\n /**\n * Optional logger\n */\n logger?: CredentialServiceLogger;\n}\n\nexport class CredentialService {\n private grants: Map<string, CredentialGrant> = new Map();\n private readonly defaultTtl: number;\n private readonly maxTtl: number;\n private readonly providers: Map<GitProvider, GitProviderAdapter>;\n private readonly grantStore?: CredentialGrantStore;\n private readonly tokenStore: TokenStore;\n private readonly oauthConfig?: OAuthConfig;\n private readonly logger?: CredentialServiceLogger;\n\n constructor(options: CredentialServiceOptions = {}) {\n this.defaultTtl = options.defaultTtlSeconds || 3600; // 1 hour\n this.maxTtl = options.maxTtlSeconds || 3600; // 1 hour max\n this.providers = options.providers || new Map();\n this.grantStore = options.grantStore;\n this.tokenStore = options.tokenStore || new MemoryTokenStore();\n this.oauthConfig = options.oauth;\n this.logger = options.logger;\n }\n\n /**\n * Get the token store (for external access to cached tokens)\n */\n getTokenStore(): TokenStore {\n return this.tokenStore;\n }\n\n /**\n * Register a provider adapter\n */\n registerProvider(provider: GitProviderAdapter): void {\n this.providers.set(provider.name, provider);\n this.log('info', { provider: provider.name }, 'Provider registered');\n }\n\n /**\n * Get a provider adapter\n */\n getProvider(name: GitProvider): GitProviderAdapter | undefined {\n return this.providers.get(name);\n }\n\n /**\n * Request credentials for a repository.\n * If request.optional is true, returns null when no credentials available.\n * Otherwise throws an error.\n */\n async getCredentials(request: GitCredentialRequest): Promise<GitCredential | null> {\n const provider = this.detectProvider(request.repo);\n\n this.log(\n 'info',\n {\n repo: request.repo,\n provider,\n access: request.access,\n executionId: request.context.executionId,\n },\n 'Credential request'\n );\n\n // Determine TTL\n const ttlSeconds = Math.min(\n request.ttlSeconds || this.defaultTtl,\n this.maxTtl\n );\n\n // Try credential sources in order of preference\n let credential: GitCredential | null = null;\n\n // Priority 1: User-provided credentials (PAT, OAuth token, or SSH)\n if (request.userProvided) {\n credential = this.createUserProvidedCredential(request, ttlSeconds, provider);\n this.log(\n 'info',\n { repo: request.repo, type: request.userProvided.type },\n 'Using user-provided credentials'\n );\n }\n\n // Priority 2: Cached OAuth token\n if (!credential) {\n credential = await this.getCachedOAuthCredential(provider, request, ttlSeconds);\n }\n\n // Priority 3: Provider-specific credentials (GitHub App, etc.)\n if (!credential) {\n const providerAdapter = this.providers.get(provider);\n if (providerAdapter) {\n try {\n credential = await providerAdapter.getCredentials(request);\n } catch (error) {\n this.log(\n 'warn',\n { repo: request.repo, provider, error },\n 'Failed to get provider credentials'\n );\n }\n }\n }\n\n // Priority 4: Interactive OAuth device flow\n if (!credential && this.oauthConfig) {\n credential = await this.getOAuthCredentialViaDeviceFlow(provider, request, ttlSeconds);\n }\n\n if (!credential) {\n // If optional flag is set, return null instead of throwing\n if (request.optional) {\n this.log(\n 'info',\n { repo: request.repo },\n 'No credentials available (optional request, returning null)'\n );\n return null;\n }\n\n throw new Error(\n `No credentials available for repository: ${request.repo}. ` +\n (this.oauthConfig\n ? 'OAuth device flow failed or was cancelled.'\n : 'Configure OAuth to enable interactive authentication.')\n );\n }\n\n // Record the grant\n const grant: CredentialGrant = {\n id: credential.id,\n type: credential.type,\n repo: request.repo,\n provider,\n grantedTo: {\n executionId: request.context.executionId,\n taskId: request.context.taskId,\n agentId: request.context.agentId,\n },\n permissions: credential.permissions,\n createdAt: new Date(),\n expiresAt: credential.expiresAt,\n };\n\n // Store grant in memory\n this.grants.set(grant.id, grant);\n\n // Persist to store if available\n if (this.grantStore) {\n try {\n await this.grantStore.create({\n ...grant,\n reason: request.context.reason,\n });\n } catch (error) {\n this.log(\n 'warn',\n { grantId: grant.id, error },\n 'Failed to persist credential grant'\n );\n }\n }\n\n this.log(\n 'info',\n {\n grantId: grant.id,\n repo: request.repo,\n expiresAt: credential.expiresAt,\n persisted: !!this.grantStore,\n },\n 'Credential granted'\n );\n\n return credential;\n }\n\n /**\n * Revoke a credential grant\n */\n async revokeCredential(grantId: string): Promise<void> {\n const grant = this.grants.get(grantId);\n if (!grant) {\n // Try to revoke in store even if not in memory\n if (this.grantStore) {\n try {\n await this.grantStore.revoke(grantId);\n } catch (error) {\n this.log('warn', { grantId, error }, 'Failed to revoke credential in store');\n }\n }\n return;\n }\n\n grant.revokedAt = new Date();\n this.grants.set(grantId, grant);\n\n // Revoke via provider if applicable\n const provider = this.providers.get(grant.provider);\n if (provider) {\n try {\n await provider.revokeCredential(grantId);\n } catch (error) {\n this.log('warn', { grantId, error }, 'Failed to revoke credential via provider');\n }\n }\n\n // Update store\n if (this.grantStore) {\n try {\n await this.grantStore.revoke(grantId);\n } catch (error) {\n this.log('warn', { grantId, error }, 'Failed to revoke credential in store');\n }\n }\n\n this.log('info', { grantId }, 'Credential revoked');\n }\n\n /**\n * Revoke all credentials for an execution\n */\n async revokeForExecution(executionId: string): Promise<number> {\n let count = 0;\n\n // Revoke in memory\n for (const [id, grant] of this.grants) {\n if (grant.grantedTo.executionId === executionId && !grant.revokedAt) {\n grant.revokedAt = new Date();\n this.grants.set(id, grant);\n count++;\n }\n }\n\n // Revoke in store\n if (this.grantStore) {\n try {\n const storeCount = await this.grantStore.revokeForExecution(executionId);\n // Use the larger count (store may have grants not in memory)\n count = Math.max(count, storeCount);\n } catch (error) {\n this.log('warn', { executionId, error }, 'Failed to revoke credentials in store');\n }\n }\n\n this.log('info', { executionId, revokedCount: count }, 'Credentials revoked for execution');\n return count;\n }\n\n /**\n * Check if a credential is valid\n */\n isValid(grantId: string): boolean {\n const grant = this.grants.get(grantId);\n if (!grant) return false;\n if (grant.revokedAt) return false;\n if (new Date() > grant.expiresAt) return false;\n return true;\n }\n\n /**\n * Get grant info for audit\n */\n async getGrant(grantId: string): Promise<CredentialGrant | null> {\n // Check memory first\n const memoryGrant = this.grants.get(grantId);\n if (memoryGrant) {\n return memoryGrant;\n }\n\n // Check store\n if (this.grantStore) {\n try {\n return await this.grantStore.findById(grantId);\n } catch (error) {\n this.log('warn', { grantId, error }, 'Failed to get grant from store');\n }\n }\n\n return null;\n }\n\n /**\n * List all grants for an execution\n */\n async getGrantsForExecution(executionId: string): Promise<CredentialGrant[]> {\n // Try store first for complete history\n if (this.grantStore) {\n try {\n return await this.grantStore.findByExecutionId(executionId);\n } catch (error) {\n this.log('warn', { executionId, error }, 'Failed to get grants from store');\n }\n }\n\n // Fallback to memory\n return Array.from(this.grants.values()).filter(\n (g) => g.grantedTo.executionId === executionId\n );\n }\n\n // ─────────────────────────────────────────────────────────────\n // Private Methods\n // ─────────────────────────────────────────────────────────────\n\n private detectProvider(repo: string): GitProvider {\n const lowerRepo = repo.toLowerCase();\n\n if (lowerRepo.includes('github.com') || lowerRepo.startsWith('github:')) {\n return 'github';\n }\n if (lowerRepo.includes('gitlab.com') || lowerRepo.startsWith('gitlab:')) {\n return 'gitlab';\n }\n if (lowerRepo.includes('bitbucket.org') || lowerRepo.startsWith('bitbucket:')) {\n return 'bitbucket';\n }\n if (lowerRepo.includes('dev.azure.com') || lowerRepo.includes('visualstudio.com')) {\n return 'azure_devops';\n }\n\n return 'self_hosted';\n }\n\n /**\n * Create a GitCredential from user-provided credentials (PAT or OAuth token)\n */\n private createUserProvidedCredential(\n request: GitCredentialRequest,\n ttlSeconds: number,\n provider: GitProvider\n ): GitCredential {\n const userCreds = request.userProvided!;\n const expiresAt = new Date(Date.now() + ttlSeconds * 1000);\n\n // Map user credential type to our CredentialType\n let credentialType: CredentialType;\n let token: string;\n\n if (userCreds.type === 'ssh') {\n // SSH credentials don't need a token - system SSH agent handles auth\n credentialType = 'ssh_key';\n token = ''; // No token needed for SSH\n } else {\n credentialType = userCreds.type === 'pat' ? 'pat' : 'oauth';\n token = userCreds.token;\n }\n\n // For user-provided credentials, we assume full repo access based on what they provided\n // The actual permissions are determined by the token's scope at the provider level\n const permissions =\n request.access === 'write'\n ? ['contents:read', 'contents:write', 'pull_requests:write']\n : ['contents:read'];\n\n return {\n id: randomUUID(),\n type: credentialType,\n token,\n repo: request.repo,\n permissions,\n expiresAt,\n provider: userCreds.provider || provider,\n };\n }\n\n /**\n * Check for a cached OAuth token and create credential from it\n */\n private async getCachedOAuthCredential(\n provider: GitProvider,\n request: GitCredentialRequest,\n ttlSeconds: number\n ): Promise<GitCredential | null> {\n try {\n const cachedToken = await this.tokenStore.get(provider);\n\n if (!cachedToken) {\n return null;\n }\n\n // Check if token is expired\n if (this.tokenStore.isExpired(cachedToken)) {\n // Try to refresh if we have a refresh token\n if (cachedToken.refreshToken && this.oauthConfig) {\n const refreshedToken = await this.refreshOAuthToken(provider, cachedToken.refreshToken);\n if (refreshedToken) {\n return this.createOAuthCredential(refreshedToken, request, ttlSeconds);\n }\n }\n // Token expired and can't refresh\n this.log('info', { provider }, 'Cached OAuth token expired');\n return null;\n }\n\n // Check if token needs refresh (close to expiry)\n if (this.tokenStore.needsRefresh(cachedToken) && cachedToken.refreshToken && this.oauthConfig) {\n const refreshedToken = await this.refreshOAuthToken(provider, cachedToken.refreshToken);\n if (refreshedToken) {\n return this.createOAuthCredential(refreshedToken, request, ttlSeconds);\n }\n // If refresh fails, continue with existing token if still valid\n }\n\n this.log('info', { provider }, 'Using cached OAuth token');\n return this.createOAuthCredential(cachedToken, request, ttlSeconds);\n } catch (error) {\n this.log('warn', { provider, error }, 'Failed to get cached OAuth token');\n return null;\n }\n }\n\n /**\n * Initiate interactive OAuth device flow\n */\n private async getOAuthCredentialViaDeviceFlow(\n provider: GitProvider,\n request: GitCredentialRequest,\n ttlSeconds: number\n ): Promise<GitCredential | null> {\n if (!this.oauthConfig) {\n return null;\n }\n\n // Only GitHub is supported for now\n if (provider !== 'github') {\n this.log('warn', { provider }, 'OAuth device flow only supported for GitHub');\n return null;\n }\n\n this.log('info', { repo: request.repo }, 'Starting OAuth device flow for authentication');\n\n try {\n const deviceFlow = new OAuthDeviceFlow({\n clientId: this.oauthConfig.clientId,\n clientSecret: this.oauthConfig.clientSecret,\n provider,\n permissions: this.oauthConfig.permissions,\n promptEmitter: this.oauthConfig.promptEmitter,\n });\n\n const token = await deviceFlow.authorize();\n\n // Cache the token for future use\n await this.tokenStore.save(provider, token);\n\n this.log('info', { provider }, 'OAuth device flow completed successfully');\n return this.createOAuthCredential(token, request, ttlSeconds);\n } catch (error) {\n this.log('error', { provider, error }, 'OAuth device flow failed');\n return null;\n }\n }\n\n /**\n * Refresh an OAuth token\n */\n private async refreshOAuthToken(\n provider: GitProvider,\n refreshToken: string\n ): Promise<OAuthToken | null> {\n if (!this.oauthConfig) {\n return null;\n }\n\n try {\n const deviceFlow = new OAuthDeviceFlow({\n clientId: this.oauthConfig.clientId,\n clientSecret: this.oauthConfig.clientSecret,\n provider,\n permissions: this.oauthConfig.permissions,\n });\n\n const newToken = await deviceFlow.refreshToken(refreshToken);\n\n // Update the cache\n await this.tokenStore.save(provider, newToken);\n\n this.log('info', { provider }, 'OAuth token refreshed successfully');\n return newToken;\n } catch (error) {\n this.log('warn', { provider, error }, 'Failed to refresh OAuth token');\n return null;\n }\n }\n\n /**\n * Create a GitCredential from an OAuthToken\n */\n private createOAuthCredential(\n token: OAuthToken,\n request: GitCredentialRequest,\n ttlSeconds: number\n ): GitCredential {\n const expiresAt = new Date(Date.now() + ttlSeconds * 1000);\n\n // Map permissions to string array\n const permissions: string[] = [];\n if (token.permissions.contents === 'read' || token.permissions.contents === 'write') {\n permissions.push('contents:read');\n }\n if (token.permissions.contents === 'write') {\n permissions.push('contents:write');\n }\n if (token.permissions.pullRequests === 'read' || token.permissions.pullRequests === 'write') {\n permissions.push('pull_requests:read');\n }\n if (token.permissions.pullRequests === 'write') {\n permissions.push('pull_requests:write');\n }\n if (token.permissions.issues === 'read' || token.permissions.issues === 'write') {\n permissions.push('issues:read');\n }\n if (token.permissions.issues === 'write') {\n permissions.push('issues:write');\n }\n\n return {\n id: randomUUID(),\n type: 'oauth',\n token: token.accessToken,\n repo: request.repo,\n permissions,\n expiresAt,\n provider: token.provider,\n };\n }\n\n private log(\n level: 'info' | 'warn' | 'error',\n data: Record<string, unknown>,\n message: string\n ): void {\n if (this.logger) {\n this.logger[level](data, message);\n }\n }\n}\n","/**\n * GitHub Provider\n *\n * Handles GitHub App authentication and API operations.\n * Requires @octokit/rest and @octokit/auth-app as peer dependencies.\n */\n\nimport { randomUUID } from 'crypto';\nimport type {\n GitProviderAdapter,\n GitCredential,\n GitCredentialRequest,\n PullRequestInfo,\n GitHubAppInstallation,\n IssueInfo,\n CreateIssueOptions,\n IssueComment,\n IssueCommentOptions,\n IssueState,\n} from '../types';\n\n// Lazy-loaded Octokit - using any for the cache since types are dynamically loaded\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet octokitCache: { Octokit: any; createAppAuth: any } | null = null;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction loadOctokit(): { Octokit: any; createAppAuth: any } {\n if (!octokitCache) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { Octokit } = require('@octokit/rest');\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { createAppAuth } = require('@octokit/auth-app');\n octokitCache = { Octokit, createAppAuth };\n } catch {\n throw new Error(\n '@octokit/rest and @octokit/auth-app are required for GitHub provider. ' +\n 'Install them with: npm install @octokit/rest @octokit/auth-app'\n );\n }\n }\n return octokitCache;\n}\n\nexport interface GitHubProviderConfig {\n /**\n * GitHub App ID\n */\n appId: string;\n\n /**\n * GitHub App private key (PEM format)\n */\n privateKey: string;\n\n /**\n * Webhook secret for verifying webhooks\n */\n webhookSecret?: string;\n\n /**\n * GitHub API base URL (for GitHub Enterprise)\n */\n baseUrl?: string;\n}\n\nexport interface GitHubProviderLogger {\n info(data: Record<string, unknown>, message: string): void;\n warn(data: Record<string, unknown>, message: string): void;\n error(data: Record<string, unknown>, message: string): void;\n debug(data: Record<string, unknown>, message: string): void;\n}\n\nexport class GitHubProvider implements GitProviderAdapter {\n readonly name = 'github' as const;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private appOctokit!: any;\n private installations: Map<string, GitHubAppInstallation> = new Map();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private installationOctokits: Map<number, any> = new Map();\n private initialized = false;\n\n constructor(\n private readonly config: GitHubProviderConfig,\n private readonly logger?: GitHubProviderLogger\n ) {}\n\n /**\n * Initialize provider - fetch all installations\n */\n async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n const { Octokit, createAppAuth } = loadOctokit();\n\n this.log('info', {}, 'Initializing GitHub provider');\n\n // Create app-level Octokit for installation management\n this.appOctokit = new Octokit({\n authStrategy: createAppAuth,\n auth: {\n appId: this.config.appId,\n privateKey: this.config.privateKey,\n },\n baseUrl: this.config.baseUrl,\n });\n\n try {\n const { data: installations } = await this.appOctokit.apps.listInstallations();\n\n for (const installation of installations) {\n await this.registerInstallation(installation.id);\n }\n\n this.initialized = true;\n this.log(\n 'info',\n { installationCount: installations.length },\n 'GitHub provider initialized'\n );\n } catch (error) {\n this.log('error', { error }, 'Failed to initialize GitHub provider');\n throw error;\n }\n }\n\n /**\n * Register an installation (called on webhook or init)\n */\n async registerInstallation(installationId: number): Promise<GitHubAppInstallation> {\n if (!this.appOctokit) {\n await this.initialize();\n }\n\n try {\n // Get installation details\n const { data: installation } = await this.appOctokit.apps.getInstallation({\n installation_id: installationId,\n });\n\n // Get accessible repositories\n const octokit = await this.getInstallationOctokit(installationId);\n const { data: repos } = await octokit.apps.listReposAccessibleToInstallation({\n per_page: 100,\n });\n\n // Handle different account types\n const account = installation.account as {\n login?: string;\n type?: string;\n slug?: string;\n } | null;\n const accountLogin = account?.login || account?.slug || 'unknown';\n const accountType = account?.type === 'Organization' ? 'Organization' : 'User';\n\n const appInstallation: GitHubAppInstallation = {\n installationId,\n accountLogin,\n accountType,\n repositories: repos.repositories?.map((r: { full_name: string }) => r.full_name) || [],\n permissions: installation.permissions as Record<string, string>,\n };\n\n this.installations.set(appInstallation.accountLogin, appInstallation);\n\n this.log(\n 'info',\n {\n installationId,\n account: appInstallation.accountLogin,\n repoCount: appInstallation.repositories.length,\n },\n 'Installation registered'\n );\n\n return appInstallation;\n } catch (error) {\n this.log('error', { installationId, error }, 'Failed to register installation');\n throw error;\n }\n }\n\n /**\n * Get installation for a repository\n */\n getInstallationForRepo(owner: string, repo: string): GitHubAppInstallation | null {\n // Check by owner\n const installation = this.installations.get(owner);\n if (!installation) {\n return null;\n }\n\n // Check if repo is accessible\n const fullName = `${owner}/${repo}`;\n if (!installation.repositories.includes(fullName)) {\n return null;\n }\n\n return installation;\n }\n\n /**\n * Get credentials for a repository (implements GitProviderAdapter)\n */\n async getCredentials(request: GitCredentialRequest): Promise<GitCredential> {\n // Parse repo to get owner/repo\n const repoInfo = this.parseRepo(request.repo);\n if (!repoInfo) {\n throw new Error(`Invalid repository format: ${request.repo}`);\n }\n\n return this.getCredentialsForRepo(\n repoInfo.owner,\n repoInfo.repo,\n request.access,\n request.ttlSeconds\n );\n }\n\n /**\n * Get credentials for a repository by owner/repo\n */\n async getCredentialsForRepo(\n owner: string,\n repo: string,\n access: 'read' | 'write',\n ttlSeconds: number = 3600\n ): Promise<GitCredential> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const installation = this.getInstallationForRepo(owner, repo);\n if (!installation) {\n throw new Error(`No GitHub App installation found for ${owner}/${repo}`);\n }\n\n const { createAppAuth } = loadOctokit();\n\n // Get installation access token with specific permissions\n const auth = createAppAuth({\n appId: this.config.appId,\n privateKey: this.config.privateKey,\n });\n\n const { token, expiresAt } = await auth({\n type: 'installation',\n installationId: installation.installationId,\n repositoryNames: [repo],\n permissions:\n access === 'write'\n ? { contents: 'write', pull_requests: 'write', metadata: 'read' }\n : { contents: 'read', metadata: 'read' },\n });\n\n return {\n id: randomUUID(),\n type: 'github_app',\n token,\n repo: `${owner}/${repo}`,\n permissions:\n access === 'write'\n ? ['contents:write', 'pull_requests:write', 'metadata:read']\n : ['contents:read', 'metadata:read'],\n expiresAt: expiresAt ? new Date(expiresAt) : new Date(Date.now() + ttlSeconds * 1000),\n provider: 'github',\n };\n }\n\n /**\n * Revoke a credential (no-op for GitHub App tokens - they expire automatically)\n */\n async revokeCredential(_credentialId: string): Promise<void> {\n // GitHub App tokens expire automatically, no explicit revocation needed\n }\n\n /**\n * Create a pull request (implements GitProviderAdapter)\n */\n async createPullRequest(options: {\n repo: string;\n sourceBranch: string;\n targetBranch: string;\n title: string;\n body: string;\n draft?: boolean;\n labels?: string[];\n reviewers?: string[];\n credential: GitCredential;\n }): Promise<PullRequestInfo> {\n const repoInfo = this.parseRepo(options.repo);\n if (!repoInfo) {\n throw new Error(`Invalid repository format: ${options.repo}`);\n }\n\n return this.createPullRequestForRepo(repoInfo.owner, repoInfo.repo, {\n title: options.title,\n body: options.body,\n head: options.sourceBranch,\n base: options.targetBranch,\n draft: options.draft,\n labels: options.labels,\n reviewers: options.reviewers,\n });\n }\n\n /**\n * Create a pull request by owner/repo\n */\n async createPullRequestForRepo(\n owner: string,\n repo: string,\n options: {\n title: string;\n body: string;\n head: string;\n base: string;\n draft?: boolean;\n labels?: string[];\n reviewers?: string[];\n }\n ): Promise<PullRequestInfo> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const installation = this.getInstallationForRepo(owner, repo);\n if (!installation) {\n throw new Error(`No GitHub App installation found for ${owner}/${repo}`);\n }\n\n const octokit = await this.getInstallationOctokit(installation.installationId);\n\n const { data: pr } = await octokit.pulls.create({\n owner,\n repo,\n title: options.title,\n body: options.body,\n head: options.head,\n base: options.base,\n draft: options.draft,\n });\n\n // Add labels if specified\n if (options.labels && options.labels.length > 0) {\n await octokit.issues.addLabels({\n owner,\n repo,\n issue_number: pr.number,\n labels: options.labels,\n });\n }\n\n // Request reviewers if specified\n if (options.reviewers && options.reviewers.length > 0) {\n await octokit.pulls.requestReviewers({\n owner,\n repo,\n pull_number: pr.number,\n reviewers: options.reviewers,\n });\n }\n\n this.log(\n 'info',\n { owner, repo, prNumber: pr.number, title: options.title },\n 'Pull request created'\n );\n\n return {\n number: pr.number,\n url: pr.html_url,\n state: pr.state as 'open' | 'closed' | 'merged',\n sourceBranch: options.head,\n targetBranch: options.base,\n title: options.title,\n executionId: '', // Set by caller\n createdAt: new Date(pr.created_at),\n };\n }\n\n /**\n * Check if a branch exists (implements GitProviderAdapter)\n */\n async branchExists(\n repo: string,\n branch: string,\n _credential: GitCredential\n ): Promise<boolean> {\n const repoInfo = this.parseRepo(repo);\n if (!repoInfo) {\n return false;\n }\n\n if (!this.initialized) {\n await this.initialize();\n }\n\n const installation = this.getInstallationForRepo(repoInfo.owner, repoInfo.repo);\n if (!installation) {\n return false;\n }\n\n const octokit = await this.getInstallationOctokit(installation.installationId);\n\n try {\n await octokit.repos.getBranch({\n owner: repoInfo.owner,\n repo: repoInfo.repo,\n branch,\n });\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Get the default branch for a repository (implements GitProviderAdapter)\n */\n async getDefaultBranch(repo: string, _credential: GitCredential): Promise<string> {\n const repoInfo = this.parseRepo(repo);\n if (!repoInfo) {\n throw new Error(`Invalid repository format: ${repo}`);\n }\n\n if (!this.initialized) {\n await this.initialize();\n }\n\n const installation = this.getInstallationForRepo(repoInfo.owner, repoInfo.repo);\n if (!installation) {\n throw new Error(`No GitHub App installation found for ${repo}`);\n }\n\n const octokit = await this.getInstallationOctokit(installation.installationId);\n\n const { data: repoData } = await octokit.repos.get({\n owner: repoInfo.owner,\n repo: repoInfo.repo,\n });\n\n return repoData.default_branch;\n }\n\n /**\n * Get pull request status\n */\n async getPullRequest(\n owner: string,\n repo: string,\n prNumber: number\n ): Promise<PullRequestInfo> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const installation = this.getInstallationForRepo(owner, repo);\n if (!installation) {\n throw new Error(`No GitHub App installation found for ${owner}/${repo}`);\n }\n\n const octokit = await this.getInstallationOctokit(installation.installationId);\n\n const { data: pr } = await octokit.pulls.get({\n owner,\n repo,\n pull_number: prNumber,\n });\n\n return {\n number: pr.number,\n url: pr.html_url,\n state: pr.merged ? 'merged' : (pr.state as 'open' | 'closed'),\n sourceBranch: pr.head.ref,\n targetBranch: pr.base.ref,\n title: pr.title,\n executionId: '', // Would need to parse from branch name\n createdAt: new Date(pr.created_at),\n mergedAt: pr.merged_at ? new Date(pr.merged_at) : undefined,\n };\n }\n\n /**\n * Delete a branch\n */\n async deleteBranch(owner: string, repo: string, branch: string): Promise<void> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const installation = this.getInstallationForRepo(owner, repo);\n if (!installation) {\n throw new Error(`No GitHub App installation found for ${owner}/${repo}`);\n }\n\n const octokit = await this.getInstallationOctokit(installation.installationId);\n\n await octokit.git.deleteRef({\n owner,\n repo,\n ref: `heads/${branch}`,\n });\n\n this.log('info', { owner, repo, branch }, 'Branch deleted');\n }\n\n /**\n * List all managed branches for a repo\n */\n async listManagedBranches(\n owner: string,\n repo: string,\n prefix = 'parallax/'\n ): Promise<string[]> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const installation = this.getInstallationForRepo(owner, repo);\n if (!installation) {\n throw new Error(`No GitHub App installation found for ${owner}/${repo}`);\n }\n\n const octokit = await this.getInstallationOctokit(installation.installationId);\n\n const branches: string[] = [];\n let page = 1;\n\n while (true) {\n const { data } = await octokit.repos.listBranches({\n owner,\n repo,\n per_page: 100,\n page,\n });\n\n if (data.length === 0) break;\n\n for (const branch of data) {\n if (branch.name.startsWith(prefix)) {\n branches.push(branch.name);\n }\n }\n\n page++;\n }\n\n return branches;\n }\n\n // ─────────────────────────────────────────────────────────────\n // Issue Management\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Create an issue\n */\n async createIssue(\n owner: string,\n repo: string,\n options: CreateIssueOptions\n ): Promise<IssueInfo> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const installation = this.getInstallationForRepo(owner, repo);\n if (!installation) {\n throw new Error(`No GitHub App installation found for ${owner}/${repo}`);\n }\n\n const octokit = await this.getInstallationOctokit(installation.installationId);\n\n const { data: issue } = await octokit.issues.create({\n owner,\n repo,\n title: options.title,\n body: options.body,\n labels: options.labels,\n assignees: options.assignees,\n milestone: options.milestone,\n });\n\n this.log(\n 'info',\n { owner, repo, issueNumber: issue.number, title: options.title },\n 'Issue created'\n );\n\n return {\n number: issue.number,\n url: issue.html_url,\n state: issue.state as IssueState,\n title: issue.title,\n body: issue.body || '',\n labels: issue.labels.map((l: { name?: string } | string) =>\n typeof l === 'string' ? l : l.name || ''\n ),\n assignees: issue.assignees?.map((a: { login: string }) => a.login) || [],\n createdAt: new Date(issue.created_at),\n closedAt: issue.closed_at ? new Date(issue.closed_at) : undefined,\n };\n }\n\n /**\n * Get an issue by number\n */\n async getIssue(owner: string, repo: string, issueNumber: number): Promise<IssueInfo> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const installation = this.getInstallationForRepo(owner, repo);\n if (!installation) {\n throw new Error(`No GitHub App installation found for ${owner}/${repo}`);\n }\n\n const octokit = await this.getInstallationOctokit(installation.installationId);\n\n const { data: issue } = await octokit.issues.get({\n owner,\n repo,\n issue_number: issueNumber,\n });\n\n return {\n number: issue.number,\n url: issue.html_url,\n state: issue.state as IssueState,\n title: issue.title,\n body: issue.body || '',\n labels: issue.labels.map((l: { name?: string } | string) =>\n typeof l === 'string' ? l : l.name || ''\n ),\n assignees: issue.assignees?.map((a: { login: string }) => a.login) || [],\n createdAt: new Date(issue.created_at),\n closedAt: issue.closed_at ? new Date(issue.closed_at) : undefined,\n };\n }\n\n /**\n * List issues with optional filters\n */\n async listIssues(\n owner: string,\n repo: string,\n options?: {\n state?: IssueState | 'all';\n labels?: string[];\n assignee?: string;\n since?: Date;\n }\n ): Promise<IssueInfo[]> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const installation = this.getInstallationForRepo(owner, repo);\n if (!installation) {\n throw new Error(`No GitHub App installation found for ${owner}/${repo}`);\n }\n\n const octokit = await this.getInstallationOctokit(installation.installationId);\n\n const { data: issues } = await octokit.issues.listForRepo({\n owner,\n repo,\n state: options?.state || 'open',\n labels: options?.labels?.join(','),\n assignee: options?.assignee,\n since: options?.since?.toISOString(),\n per_page: 100,\n });\n\n // Filter out pull requests (GitHub API returns PRs as issues)\n return issues\n .filter((issue: { pull_request?: unknown }) => !issue.pull_request)\n .map((issue: {\n number: number;\n html_url: string;\n state: string;\n title: string;\n body: string | null;\n labels: Array<{ name?: string } | string>;\n assignees?: Array<{ login: string }>;\n created_at: string;\n closed_at: string | null;\n }) => ({\n number: issue.number,\n url: issue.html_url,\n state: issue.state as IssueState,\n title: issue.title,\n body: issue.body || '',\n labels: issue.labels.map((l: { name?: string } | string) =>\n typeof l === 'string' ? l : l.name || ''\n ),\n assignees: issue.assignees?.map((a: { login: string }) => a.login) || [],\n createdAt: new Date(issue.created_at),\n closedAt: issue.closed_at ? new Date(issue.closed_at) : undefined,\n }));\n }\n\n /**\n * Update an issue (labels, state, assignees, etc.)\n */\n async updateIssue(\n owner: string,\n repo: string,\n issueNumber: number,\n options: {\n title?: string;\n body?: string;\n state?: IssueState;\n labels?: string[];\n assignees?: string[];\n }\n ): Promise<IssueInfo> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const installation = this.getInstallationForRepo(owner, repo);\n if (!installation) {\n throw new Error(`No GitHub App installation found for ${owner}/${repo}`);\n }\n\n const octokit = await this.getInstallationOctokit(installation.installationId);\n\n const { data: issue } = await octokit.issues.update({\n owner,\n repo,\n issue_number: issueNumber,\n title: options.title,\n body: options.body,\n state: options.state,\n labels: options.labels,\n assignees: options.assignees,\n });\n\n this.log(\n 'info',\n { owner, repo, issueNumber, updates: Object.keys(options) },\n 'Issue updated'\n );\n\n return {\n number: issue.number,\n url: issue.html_url,\n state: issue.state as IssueState,\n title: issue.title,\n body: issue.body || '',\n labels: issue.labels.map((l: { name?: string } | string) =>\n typeof l === 'string' ? l : l.name || ''\n ),\n assignees: issue.assignees?.map((a: { login: string }) => a.login) || [],\n createdAt: new Date(issue.created_at),\n closedAt: issue.closed_at ? new Date(issue.closed_at) : undefined,\n };\n }\n\n /**\n * Add labels to an issue\n */\n async addLabels(\n owner: string,\n repo: string,\n issueNumber: number,\n labels: string[]\n ): Promise<void> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const installation = this.getInstallationForRepo(owner, repo);\n if (!installation) {\n throw new Error(`No GitHub App installation found for ${owner}/${repo}`);\n }\n\n const octokit = await this.getInstallationOctokit(installation.installationId);\n\n await octokit.issues.addLabels({\n owner,\n repo,\n issue_number: issueNumber,\n labels,\n });\n\n this.log('info', { owner, repo, issueNumber, labels }, 'Labels added to issue');\n }\n\n /**\n * Remove a label from an issue\n */\n async removeLabel(\n owner: string,\n repo: string,\n issueNumber: number,\n label: string\n ): Promise<void> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const installation = this.getInstallationForRepo(owner, repo);\n if (!installation) {\n throw new Error(`No GitHub App installation found for ${owner}/${repo}`);\n }\n\n const octokit = await this.getInstallationOctokit(installation.installationId);\n\n await octokit.issues.removeLabel({\n owner,\n repo,\n issue_number: issueNumber,\n name: label,\n });\n\n this.log('info', { owner, repo, issueNumber, label }, 'Label removed from issue');\n }\n\n /**\n * Add a comment to an issue\n */\n async addComment(\n owner: string,\n repo: string,\n issueNumber: number,\n options: IssueCommentOptions\n ): Promise<IssueComment> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const installation = this.getInstallationForRepo(owner, repo);\n if (!installation) {\n throw new Error(`No GitHub App installation found for ${owner}/${repo}`);\n }\n\n const octokit = await this.getInstallationOctokit(installation.installationId);\n\n const { data: comment } = await octokit.issues.createComment({\n owner,\n repo,\n issue_number: issueNumber,\n body: options.body,\n });\n\n this.log('info', { owner, repo, issueNumber, commentId: comment.id }, 'Comment added to issue');\n\n return {\n id: comment.id,\n url: comment.html_url,\n body: comment.body || '',\n author: comment.user?.login || 'unknown',\n createdAt: new Date(comment.created_at),\n };\n }\n\n /**\n * List comments on an issue\n */\n async listComments(\n owner: string,\n repo: string,\n issueNumber: number\n ): Promise<IssueComment[]> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const installation = this.getInstallationForRepo(owner, repo);\n if (!installation) {\n throw new Error(`No GitHub App installation found for ${owner}/${repo}`);\n }\n\n const octokit = await this.getInstallationOctokit(installation.installationId);\n\n const { data: comments } = await octokit.issues.listComments({\n owner,\n repo,\n issue_number: issueNumber,\n per_page: 100,\n });\n\n return comments.map((comment: {\n id: number;\n html_url: string;\n body: string | undefined;\n user: { login: string } | null;\n created_at: string;\n }) => ({\n id: comment.id,\n url: comment.html_url,\n body: comment.body || '',\n author: comment.user?.login || 'unknown',\n createdAt: new Date(comment.created_at),\n }));\n }\n\n /**\n * Close an issue\n */\n async closeIssue(owner: string, repo: string, issueNumber: number): Promise<IssueInfo> {\n return this.updateIssue(owner, repo, issueNumber, { state: 'closed' });\n }\n\n /**\n * Reopen an issue\n */\n async reopenIssue(owner: string, repo: string, issueNumber: number): Promise<IssueInfo> {\n return this.updateIssue(owner, repo, issueNumber, { state: 'open' });\n }\n\n // ─────────────────────────────────────────────────────────────\n // Private Methods\n // ─────────────────────────────────────────────────────────────\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private async getInstallationOctokit(installationId: number): Promise<any> {\n if (!this.installationOctokits.has(installationId)) {\n const { Octokit, createAppAuth } = loadOctokit();\n\n const octokit = new Octokit({\n authStrategy: createAppAuth,\n auth: {\n appId: this.config.appId,\n privateKey: this.config.privateKey,\n installationId,\n },\n baseUrl: this.config.baseUrl,\n });\n\n this.installationOctokits.set(installationId, octokit);\n }\n\n return this.installationOctokits.get(installationId)!;\n }\n\n private parseRepo(repo: string): { owner: string; repo: string } | null {\n const patterns = [\n /github\\.com[/:]([^/]+)\\/([^/.]+)/,\n /^([^/]+)\\/([^/]+)$/,\n ];\n\n for (const pattern of patterns) {\n const match = repo.match(pattern);\n if (match) {\n return { owner: match[1], repo: match[2].replace(/\\.git$/, '') };\n }\n }\n\n return null;\n }\n\n private log(\n level: 'info' | 'warn' | 'error' | 'debug',\n data: Record<string, unknown>,\n message: string\n ): void {\n if (this.logger) {\n this.logger[level](data, message);\n }\n }\n}\n","/**\n * GitHub PAT Client\n *\n * Simple GitHub API client using a Personal Access Token.\n * Useful for testing and simple integrations without GitHub App setup.\n */\n\nimport type {\n PullRequestInfo,\n IssueInfo,\n CreateIssueOptions,\n IssueComment,\n IssueCommentOptions,\n IssueState,\n} from '../types';\n\n// Lazy-loaded Octokit\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet OctokitClass: any = null;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction loadOctokit(): any {\n if (!OctokitClass) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { Octokit } = require('@octokit/rest');\n OctokitClass = Octokit;\n } catch {\n throw new Error(\n '@octokit/rest is required for GitHubPatClient. ' +\n 'Install it with: npm install @octokit/rest'\n );\n }\n }\n return OctokitClass;\n}\n\nexport interface GitHubPatClientOptions {\n /**\n * Personal Access Token\n */\n token: string;\n\n /**\n * GitHub API base URL (for GitHub Enterprise)\n */\n baseUrl?: string;\n}\n\nexport interface GitHubPatClientLogger {\n info(data: Record<string, unknown>, message: string): void;\n warn(data: Record<string, unknown>, message: string): void;\n error(data: Record<string, unknown>, message: string): void;\n}\n\n/**\n * Simple GitHub client using a Personal Access Token.\n * Provides PR and Issue management without GitHub App complexity.\n */\nexport class GitHubPatClient {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private octokit: any;\n private readonly logger?: GitHubPatClientLogger;\n\n constructor(options: GitHubPatClientOptions, logger?: GitHubPatClientLogger) {\n this.logger = logger;\n const Octokit = loadOctokit();\n this.octokit = new Octokit({\n auth: options.token,\n baseUrl: options.baseUrl,\n });\n }\n\n // ─────────────────────────────────────────────────────────────\n // Pull Requests\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Create a pull request\n */\n async createPullRequest(\n owner: string,\n repo: string,\n options: {\n title: string;\n body: string;\n head: string;\n base: string;\n draft?: boolean;\n labels?: string[];\n reviewers?: string[];\n }\n ): Promise<PullRequestInfo> {\n const { data: pr } = await this.octokit.pulls.create({\n owner,\n repo,\n title: options.title,\n body: options.body,\n head: options.head,\n base: options.base,\n draft: options.draft,\n });\n\n // Add labels if specified\n if (options.labels && options.labels.length > 0) {\n await this.octokit.issues.addLabels({\n owner,\n repo,\n issue_number: pr.number,\n labels: options.labels,\n });\n }\n\n // Request reviewers if specified\n if (options.reviewers && options.reviewers.length > 0) {\n await this.octokit.pulls.requestReviewers({\n owner,\n repo,\n pull_number: pr.number,\n reviewers: options.reviewers,\n });\n }\n\n this.log('info', { owner, repo, prNumber: pr.number }, 'Pull request created');\n\n return {\n number: pr.number,\n url: pr.html_url,\n state: pr.state as 'open' | 'closed' | 'merged',\n sourceBranch: options.head,\n targetBranch: options.base,\n title: options.title,\n executionId: '',\n createdAt: new Date(pr.created_at),\n };\n }\n\n /**\n * Get a pull request\n */\n async getPullRequest(owner: string, repo: string, prNumber: number): Promise<PullRequestInfo> {\n const { data: pr } = await this.octokit.pulls.get({\n owner,\n repo,\n pull_number: prNumber,\n });\n\n return {\n number: pr.number,\n url: pr.html_url,\n state: pr.merged ? 'merged' : (pr.state as 'open' | 'closed'),\n sourceBranch: pr.head.ref,\n targetBranch: pr.base.ref,\n title: pr.title,\n executionId: '',\n createdAt: new Date(pr.created_at),\n mergedAt: pr.merged_at ? new Date(pr.merged_at) : undefined,\n };\n }\n\n // ─────────────────────────────────────────────────────────────\n // Issues\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Create an issue\n */\n async createIssue(\n owner: string,\n repo: string,\n options: CreateIssueOptions\n ): Promise<IssueInfo> {\n const { data: issue } = await this.octokit.issues.create({\n owner,\n repo,\n title: options.title,\n body: options.body,\n labels: options.labels,\n assignees: options.assignees,\n milestone: options.milestone,\n });\n\n this.log('info', { owner, repo, issueNumber: issue.number }, 'Issue created');\n\n return this.mapIssue(issue);\n }\n\n /**\n * Get an issue\n */\n async getIssue(owner: string, repo: string, issueNumber: number): Promise<IssueInfo> {\n const { data: issue } = await this.octokit.issues.get({\n owner,\n repo,\n issue_number: issueNumber,\n });\n\n return this.mapIssue(issue);\n }\n\n /**\n * List issues\n */\n async listIssues(\n owner: string,\n repo: string,\n options?: {\n state?: IssueState | 'all';\n labels?: string[];\n assignee?: string;\n }\n ): Promise<IssueInfo[]> {\n const { data: issues } = await this.octokit.issues.listForRepo({\n owner,\n repo,\n state: options?.state || 'open',\n labels: options?.labels?.join(','),\n assignee: options?.assignee,\n per_page: 100,\n });\n\n // Filter out pull requests\n return issues\n .filter((issue: { pull_request?: unknown }) => !issue.pull_request)\n .map((issue: Record<string, unknown>) => this.mapIssue(issue));\n }\n\n /**\n * Update an issue\n */\n async updateIssue(\n owner: string,\n repo: string,\n issueNumber: number,\n options: {\n title?: string;\n body?: string;\n state?: IssueState;\n labels?: string[];\n assignees?: string[];\n }\n ): Promise<IssueInfo> {\n const { data: issue } = await this.octokit.issues.update({\n owner,\n repo,\n issue_number: issueNumber,\n ...options,\n });\n\n this.log('info', { owner, repo, issueNumber }, 'Issue updated');\n\n return this.mapIssue(issue);\n }\n\n /**\n * Add labels to an issue\n */\n async addLabels(\n owner: string,\n repo: string,\n issueNumber: number,\n labels: string[]\n ): Promise<void> {\n await this.octokit.issues.addLabels({\n owner,\n repo,\n issue_number: issueNumber,\n labels,\n });\n\n this.log('info', { owner, repo, issueNumber, labels }, 'Labels added');\n }\n\n /**\n * Remove a label from an issue\n */\n async removeLabel(\n owner: string,\n repo: string,\n issueNumber: number,\n label: string\n ): Promise<void> {\n await this.octokit.issues.removeLabel({\n owner,\n repo,\n issue_number: issueNumber,\n name: label,\n });\n\n this.log('info', { owner, repo, issueNumber, label }, 'Label removed');\n }\n\n /**\n * Add a comment to an issue or PR\n */\n async addComment(\n owner: string,\n repo: string,\n issueNumber: number,\n options: IssueCommentOptions\n ): Promise<IssueComment> {\n const { data: comment } = await this.octokit.issues.createComment({\n owner,\n repo,\n issue_number: issueNumber,\n body: options.body,\n });\n\n this.log('info', { owner, repo, issueNumber, commentId: comment.id }, 'Comment added');\n\n return {\n id: comment.id,\n url: comment.html_url,\n body: comment.body || '',\n author: comment.user?.login || 'unknown',\n createdAt: new Date(comment.created_at),\n };\n }\n\n /**\n * List comments on an issue or PR\n */\n async listComments(\n owner: string,\n repo: string,\n issueNumber: number\n ): Promise<IssueComment[]> {\n const { data: comments } = await this.octokit.issues.listComments({\n owner,\n repo,\n issue_number: issueNumber,\n per_page: 100,\n });\n\n return comments.map((comment: {\n id: number;\n html_url: string;\n body?: string;\n user?: { login: string };\n created_at: string;\n }) => ({\n id: comment.id,\n url: comment.html_url,\n body: comment.body || '',\n author: comment.user?.login || 'unknown',\n createdAt: new Date(comment.created_at),\n }));\n }\n\n /**\n * Close an issue\n */\n async closeIssue(owner: string, repo: string, issueNumber: number): Promise<IssueInfo> {\n return this.updateIssue(owner, repo, issueNumber, { state: 'closed' });\n }\n\n /**\n * Reopen an issue\n */\n async reopenIssue(owner: string, repo: string, issueNumber: number): Promise<IssueInfo> {\n return this.updateIssue(owner, repo, issueNumber, { state: 'open' });\n }\n\n // ─────────────────────────────────────────────────────────────\n // Branches\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Delete a branch\n */\n async deleteBranch(owner: string, repo: string, branch: string): Promise<void> {\n await this.octokit.git.deleteRef({\n owner,\n repo,\n ref: `heads/${branch}`,\n });\n\n this.log('info', { owner, repo, branch }, 'Branch deleted');\n }\n\n /**\n * Check if a branch exists\n */\n async branchExists(owner: string, repo: string, branch: string): Promise<boolean> {\n try {\n await this.octokit.repos.getBranch({ owner, repo, branch });\n return true;\n } catch {\n return false;\n }\n }\n\n // ─────────────────────────────────────────────────────────────\n // Private Methods\n // ─────────────────────────────────────────────────────────────\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private mapIssue(issue: any): IssueInfo {\n return {\n number: issue.number,\n url: issue.html_url,\n state: issue.state as IssueState,\n title: issue.title,\n body: issue.body || '',\n labels: issue.labels.map((l: { name?: string } | string) =>\n typeof l === 'string' ? l : l.name || ''\n ),\n assignees: issue.assignees?.map((a: { login: string }) => a.login) || [],\n createdAt: new Date(issue.created_at),\n closedAt: issue.closed_at ? new Date(issue.closed_at) : undefined,\n };\n }\n\n private log(\n level: 'info' | 'warn' | 'error',\n data: Record<string, unknown>,\n message: string\n ): void {\n if (this.logger) {\n this.logger[level](data, message);\n }\n }\n}\n","/**\n * Git Workspace Service Types\n *\n * Types for git workspace provisioning and credential management.\n */\n\n// ─────────────────────────────────────────────────────────────\n// Git Providers\n// ─────────────────────────────────────────────────────────────\n\nexport type GitProvider = 'github' | 'gitlab' | 'bitbucket' | 'azure_devops' | 'self_hosted';\n\nexport type CredentialType = 'github_app' | 'oauth' | 'deploy_key' | 'pat' | 'ssh_key';\n\n// ─────────────────────────────────────────────────────────────\n// Branch Configuration\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Configuration for creating a new branch\n */\nexport interface BranchConfig {\n /**\n * Execution or context ID this branch belongs to\n */\n executionId: string;\n\n /**\n * Role or task identifier\n */\n role: string;\n\n /**\n * Optional slug for human readability\n */\n slug?: string;\n\n /**\n * Base branch to create from\n */\n baseBranch: string;\n}\n\n/**\n * Information about a created branch\n */\nexport interface BranchInfo {\n /**\n * Full branch name (e.g., \"parallax/exec-abc123/engineer-auth\")\n */\n name: string;\n\n /**\n * Execution this branch belongs to\n */\n executionId: string;\n\n /**\n * Base branch it was created from\n */\n baseBranch: string;\n\n /**\n * When the branch was created\n */\n createdAt: Date;\n\n /**\n * Associated PR if one exists\n */\n pullRequest?: PullRequestInfo;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Git Credentials\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Token-based credentials (PAT or OAuth)\n */\nexport interface TokenCredentials {\n /**\n * Type of credential\n */\n type: 'pat' | 'oauth';\n\n /**\n * The credential token\n */\n token: string;\n\n /**\n * Git provider this credential is for (defaults to 'github')\n */\n provider?: GitProvider;\n}\n\n/**\n * SSH-based credentials using system SSH agent\n */\nexport interface SshCredentials {\n /**\n * Type of credential\n */\n type: 'ssh';\n\n /**\n * Git provider this credential is for (defaults to 'github')\n */\n provider?: GitProvider;\n}\n\n/**\n * User-provided credentials passed at execution time.\n * Allows users to supply their own PAT, OAuth token, or use system SSH.\n */\nexport type UserProvidedCredentials = TokenCredentials | SshCredentials;\n\n/**\n * Context for credential requests (for audit trails)\n */\nexport interface CredentialContext {\n executionId: string;\n taskId?: string;\n agentId?: string;\n userId?: string;\n reason?: string;\n}\n\n/**\n * Request for git credentials\n */\nexport interface GitCredentialRequest {\n /**\n * Repository URL or identifier\n */\n repo: string;\n\n /**\n * Required access level\n */\n access: 'read' | 'write';\n\n /**\n * Context for audit trail\n */\n context: CredentialContext;\n\n /**\n * Requested TTL in seconds (max enforced by policy)\n */\n ttlSeconds?: number;\n\n /**\n * User-provided credentials (PAT or OAuth token)\n * If provided, these are used instead of managed credentials\n */\n userProvided?: UserProvidedCredentials;\n\n /**\n * If true, return null instead of throwing when no credentials available.\n * Used for public repositories where authentication is optional.\n */\n optional?: boolean;\n}\n\n/**\n * A git credential grant\n */\nexport interface GitCredential {\n /**\n * Unique ID for this credential grant\n */\n id: string;\n\n /**\n * How to authenticate\n */\n type: CredentialType;\n\n /**\n * The credential value (token, key, etc.)\n */\n token: string;\n\n /**\n * Repository this credential is scoped to\n */\n repo: string;\n\n /**\n * Permissions granted\n */\n permissions: string[];\n\n /**\n * When this credential expires\n */\n expiresAt: Date;\n\n /**\n * Git provider\n */\n provider: GitProvider;\n}\n\n/**\n * Record of a credential grant for auditing\n */\nexport interface CredentialGrant {\n id: string;\n type: CredentialType;\n repo: string;\n provider: GitProvider;\n grantedTo: {\n executionId: string;\n taskId?: string;\n agentId?: string;\n };\n permissions: string[];\n createdAt: Date;\n expiresAt: Date;\n revokedAt?: Date;\n lastUsedAt?: Date;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Workspace\n// ─────────────────────────────────────────────────────────────\n\nexport type BranchStrategy = 'feature_branch' | 'fork' | 'direct';\n\n/**\n * Workspace provisioning strategy\n * - 'clone': Full clone of the repository (default)\n * - 'worktree': Git worktree from an existing clone (faster, shared .git)\n */\nexport type WorkspaceStrategy = 'clone' | 'worktree';\n\nexport type WorkspaceStatus =\n | 'provisioning'\n | 'ready'\n | 'in_use'\n | 'finalizing'\n | 'cleaned_up'\n | 'error';\n\n/**\n * Granular progress phases for workspace operations\n */\nexport type WorkspacePhase =\n | 'initializing'\n | 'cloning'\n | 'creating_branch'\n | 'configuring'\n | 'ready'\n | 'committing'\n | 'pushing'\n | 'creating_pr'\n | 'cleaning_up'\n | 'done'\n | 'error';\n\n/**\n * Progress tracking for workspace operations\n */\nexport interface WorkspaceProgress {\n /**\n * Current phase of the operation\n */\n phase: WorkspacePhase;\n\n /**\n * Human-readable message describing current activity\n */\n message?: string;\n\n /**\n * Progress percentage (0-100) if determinable\n */\n percent?: number;\n\n /**\n * When progress was last updated\n */\n updatedAt: Date;\n}\n\n/**\n * Completion hook configuration\n */\nexport interface CompletionHook {\n /**\n * Shell command to execute on completion\n * Variables available: $WORKSPACE_ID, $REPO, $BRANCH, $STATUS\n */\n command?: string;\n\n /**\n * Webhook URL to POST to on completion\n */\n webhook?: string;\n\n /**\n * Custom headers for webhook request\n */\n webhookHeaders?: Record<string, string>;\n\n /**\n * Whether to run hook on error (default: true)\n */\n runOnError?: boolean;\n}\n\n/**\n * Configuration for provisioning a workspace\n */\nexport interface WorkspaceConfig {\n /**\n * Repository to clone\n */\n repo: string;\n\n /**\n * Git provider\n */\n provider?: GitProvider;\n\n /**\n * Workspace strategy: 'clone' (default) or 'worktree'\n * Worktrees are faster and use less disk space for parallel work on same repo\n */\n strategy?: WorkspaceStrategy;\n\n /**\n * Parent workspace ID (required when strategy is 'worktree')\n * The parent must be a 'clone' workspace for the same repo\n */\n parentWorkspace?: string;\n\n /**\n * Branch strategy\n */\n branchStrategy: BranchStrategy;\n\n /**\n * Base branch to create feature branches from\n */\n baseBranch: string;\n\n /**\n * Execution context\n */\n execution: {\n id: string;\n patternName: string;\n };\n\n /**\n * Task/role requesting the workspace\n */\n task: {\n id: string;\n role: string;\n slug?: string;\n };\n\n /**\n * User context for credential resolution\n */\n user?: {\n id: string;\n oauthToken?: string;\n };\n\n /**\n * User-provided credentials (PAT or OAuth token)\n * If provided, these are used instead of managed credentials\n */\n userCredentials?: UserProvidedCredentials;\n\n /**\n * Hook to run when workspace operations complete\n */\n onComplete?: CompletionHook;\n\n /**\n * Exact branch name to use. If provided, overrides the auto-generated\n * name from prefix/execution/task. The branch is still created from baseBranch.\n */\n branchName?: string;\n}\n\n/**\n * A provisioned git workspace\n */\nexport interface Workspace {\n /**\n * Unique workspace ID\n */\n id: string;\n\n /**\n * Local filesystem path\n */\n path: string;\n\n /**\n * Repository URL\n */\n repo: string;\n\n /**\n * Branch created for this workspace\n */\n branch: BranchInfo;\n\n /**\n * Credential for this workspace.\n * Optional for public repositories (read-only operations).\n * Required for write operations (push, PR creation).\n */\n credential?: GitCredential;\n\n /**\n * When the workspace was provisioned\n */\n provisionedAt: Date;\n\n /**\n * Current status\n */\n status: WorkspaceStatus;\n\n /**\n * Workspace strategy used ('clone' or 'worktree')\n */\n strategy: WorkspaceStrategy;\n\n /**\n * Parent workspace ID (for worktrees)\n */\n parentWorkspaceId?: string;\n\n /**\n * Child worktree IDs (for clone workspaces that have worktrees)\n */\n worktreeIds?: string[];\n\n /**\n * Current progress of workspace operations\n */\n progress?: WorkspaceProgress;\n\n /**\n * Completion hook configuration\n */\n onComplete?: CompletionHook;\n}\n\n/**\n * Options for finalizing a workspace (push, PR creation, cleanup)\n */\nexport interface WorkspaceFinalization {\n /**\n * Whether to push the branch\n */\n push: boolean;\n\n /**\n * Whether to create a PR\n */\n createPr: boolean;\n\n /**\n * PR configuration\n */\n pr?: {\n title: string;\n body: string;\n targetBranch: string;\n draft?: boolean;\n labels?: string[];\n reviewers?: string[];\n };\n\n /**\n * Whether to clean up the workspace after finalization\n */\n cleanup: boolean;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Pull Requests\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Information about a pull request\n */\nexport interface PullRequestInfo {\n /**\n * PR number\n */\n number: number;\n\n /**\n * PR URL\n */\n url: string;\n\n /**\n * PR state\n */\n state: 'open' | 'closed' | 'merged';\n\n /**\n * Source branch\n */\n sourceBranch: string;\n\n /**\n * Target branch\n */\n targetBranch: string;\n\n /**\n * Title\n */\n title: string;\n\n /**\n * Associated execution ID\n */\n executionId: string;\n\n /**\n * Created timestamp\n */\n createdAt: Date;\n\n /**\n * Merged timestamp if merged\n */\n mergedAt?: Date;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Issues\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Issue state\n */\nexport type IssueState = 'open' | 'closed';\n\n/**\n * Information about an issue\n */\nexport interface IssueInfo {\n /**\n * Issue number\n */\n number: number;\n\n /**\n * Issue URL\n */\n url: string;\n\n /**\n * Issue state\n */\n state: IssueState;\n\n /**\n * Issue title\n */\n title: string;\n\n /**\n * Issue body/description\n */\n body: string;\n\n /**\n * Labels on the issue\n */\n labels: string[];\n\n /**\n * Assignees\n */\n assignees: string[];\n\n /**\n * Created timestamp\n */\n createdAt: Date;\n\n /**\n * Closed timestamp if closed\n */\n closedAt?: Date;\n\n /**\n * Associated execution ID (if managed)\n */\n executionId?: string;\n}\n\n/**\n * Options for creating an issue\n */\nexport interface CreateIssueOptions {\n /**\n * Issue title\n */\n title: string;\n\n /**\n * Issue body/description\n */\n body: string;\n\n /**\n * Labels to add\n */\n labels?: string[];\n\n /**\n * Assignees (usernames)\n */\n assignees?: string[];\n\n /**\n * Milestone number\n */\n milestone?: number;\n}\n\n/**\n * Options for commenting on an issue\n */\nexport interface IssueCommentOptions {\n /**\n * Comment body\n */\n body: string;\n}\n\n/**\n * Information about an issue comment\n */\nexport interface IssueComment {\n /**\n * Comment ID\n */\n id: number;\n\n /**\n * Comment URL\n */\n url: string;\n\n /**\n * Comment body\n */\n body: string;\n\n /**\n * Author username\n */\n author: string;\n\n /**\n * Created timestamp\n */\n createdAt: Date;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Agent Permissions & OAuth\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Permission level for a resource\n */\nexport type PermissionLevel = 'none' | 'read' | 'write';\n\n/**\n * Repository access scope\n */\nexport type RepositoryScope =\n | { type: 'all' } // All repositories user has access to\n | { type: 'public' } // Only public repositories\n | { type: 'selected'; repos: string[] }; // Specific repos (owner/repo format)\n\n/**\n * Permissions that an agent can request/receive.\n * Designed to be restrictive by default - dangerous operations require explicit opt-in.\n */\nexport interface AgentPermissions {\n /**\n * Which repositories the agent can access\n */\n repositories: RepositoryScope;\n\n /**\n * Permission for repository contents (code, files)\n */\n contents: PermissionLevel;\n\n /**\n * Permission for pull requests\n */\n pullRequests: PermissionLevel;\n\n /**\n * Permission for issues\n */\n issues: PermissionLevel;\n\n /**\n * Permission for metadata (repo info, branches, tags)\n */\n metadata: PermissionLevel;\n\n // ─────────────────────────────────────────────────────────────\n // Dangerous Operations - Explicit opt-in, default false\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Can delete branches (for cleanup after merge)\n * @default false\n */\n canDeleteBranch?: boolean;\n\n /**\n * Can force push to branches\n * @default false - Almost never needed, can destroy history\n */\n canForcePush?: boolean;\n\n /**\n * Can delete repositories\n * @default false - Should NEVER be true for agents\n */\n canDeleteRepository?: boolean;\n\n /**\n * Can modify repository settings/webhooks\n * @default false\n */\n canAdminister?: boolean;\n}\n\n/**\n * Default safe permissions for agents\n */\nexport const DEFAULT_AGENT_PERMISSIONS: AgentPermissions = {\n repositories: { type: 'selected', repos: [] },\n contents: 'write',\n pullRequests: 'write',\n issues: 'write',\n metadata: 'read',\n canDeleteBranch: true, // Needed for cleanup\n canForcePush: false,\n canDeleteRepository: false,\n canAdminister: false,\n};\n\n/**\n * Read-only permissions for agents that only need to inspect\n */\nexport const READONLY_AGENT_PERMISSIONS: AgentPermissions = {\n repositories: { type: 'selected', repos: [] },\n contents: 'read',\n pullRequests: 'read',\n issues: 'read',\n metadata: 'read',\n canDeleteBranch: false,\n canForcePush: false,\n canDeleteRepository: false,\n canAdminister: false,\n};\n\n/**\n * OAuth token with metadata\n */\nexport interface OAuthToken {\n /**\n * Access token for API calls\n */\n accessToken: string;\n\n /**\n * Token type (usually \"bearer\")\n */\n tokenType: string;\n\n /**\n * Scopes granted by the token\n */\n scopes: string[];\n\n /**\n * When the token expires\n */\n expiresAt?: Date;\n\n /**\n * Refresh token for obtaining new access tokens\n */\n refreshToken?: string;\n\n /**\n * Provider this token is for\n */\n provider: GitProvider;\n\n /**\n * Permissions associated with this token\n */\n permissions: AgentPermissions;\n\n /**\n * When the token was created\n */\n createdAt: Date;\n}\n\n/**\n * Device code response from OAuth provider\n */\nexport interface DeviceCodeResponse {\n /**\n * Code to poll for authorization\n */\n deviceCode: string;\n\n /**\n * Code for user to enter\n */\n userCode: string;\n\n /**\n * URL for user to visit\n */\n verificationUri: string;\n\n /**\n * Full URL with code pre-filled (if supported)\n */\n verificationUriComplete?: string;\n\n /**\n * Seconds until codes expire\n */\n expiresIn: number;\n\n /**\n * Seconds between poll requests\n */\n interval: number;\n}\n\n/**\n * Auth prompt for user interaction\n */\nexport interface AuthPrompt {\n /**\n * Provider requiring auth\n */\n provider: GitProvider;\n\n /**\n * URL to visit\n */\n verificationUri: string;\n\n /**\n * Code to enter\n */\n userCode: string;\n\n /**\n * Seconds until code expires\n */\n expiresIn: number;\n\n /**\n * Permissions being requested\n */\n requestedPermissions: AgentPermissions;\n}\n\n/**\n * Result of auth flow\n */\nexport interface AuthResult {\n /**\n * Whether auth succeeded\n */\n success: boolean;\n\n /**\n * Provider that was authenticated\n */\n provider: GitProvider;\n\n /**\n * Username/identity if successful\n */\n username?: string;\n\n /**\n * Error message if failed\n */\n error?: string;\n}\n\n/**\n * Callback interface for auth prompts\n */\nexport interface AuthPromptEmitter {\n /**\n * Called when user action is required for authentication\n */\n onAuthRequired(prompt: AuthPrompt): void;\n\n /**\n * Called when authentication completes (success or failure)\n */\n onAuthComplete(result: AuthResult): void;\n\n /**\n * Called periodically while waiting for auth (optional)\n */\n onAuthPending?(secondsRemaining: number): void;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Provider Configuration\n// ─────────────────────────────────────────────────────────────\n\n/**\n * GitHub App configuration\n */\nexport interface GitHubAppConfig {\n appId: string;\n privateKey: string;\n webhookSecret?: string;\n}\n\n/**\n * GitHub App installation info\n */\nexport interface GitHubAppInstallation {\n installationId: number;\n accountLogin: string;\n accountType: 'User' | 'Organization';\n repositories: string[];\n permissions: Record<string, string>;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Service Configuration\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Configuration for the workspace service\n */\nexport interface WorkspaceServiceConfig {\n /**\n * Base directory for workspace storage\n */\n baseDir: string;\n\n /**\n * Default TTL for credentials in seconds\n */\n defaultCredentialTtl?: number;\n\n /**\n * Maximum TTL for credentials in seconds\n */\n maxCredentialTtl?: number;\n\n /**\n * Default branch naming prefix\n */\n branchPrefix?: string;\n\n /**\n * GitHub App configuration (optional)\n */\n githubApp?: GitHubAppConfig;\n}\n\n/**\n * Configuration for the credential service\n */\nexport interface CredentialServiceConfig {\n /**\n * Default TTL for credentials in seconds\n */\n defaultTtl?: number;\n\n /**\n * Maximum TTL for credentials in seconds\n */\n maxTtl?: number;\n\n /**\n * GitHub App configuration\n */\n githubApp?: GitHubAppConfig;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Provider Interface\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Interface for git provider implementations\n */\nexport interface GitProviderAdapter {\n /**\n * Provider name\n */\n readonly name: GitProvider;\n\n /**\n * Get credentials for a repository\n */\n getCredentials(request: GitCredentialRequest): Promise<GitCredential>;\n\n /**\n * Revoke a credential\n */\n revokeCredential(credentialId: string): Promise<void>;\n\n /**\n * Create a pull request\n */\n createPullRequest(options: {\n repo: string;\n sourceBranch: string;\n targetBranch: string;\n title: string;\n body: string;\n draft?: boolean;\n labels?: string[];\n reviewers?: string[];\n credential: GitCredential;\n }): Promise<PullRequestInfo>;\n\n /**\n * Check if a branch exists\n */\n branchExists(repo: string, branch: string, credential: GitCredential): Promise<boolean>;\n\n /**\n * Get the default branch for a repository\n */\n getDefaultBranch(repo: string, credential: GitCredential): Promise<string>;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Events\n// ─────────────────────────────────────────────────────────────\n\nexport type WorkspaceEventType =\n | 'workspace:provisioning'\n | 'workspace:ready'\n | 'workspace:error'\n | 'workspace:finalizing'\n | 'workspace:cleaned_up'\n | 'worktree:added'\n | 'worktree:removed'\n | 'credential:granted'\n | 'credential:revoked'\n | 'pr:created'\n | 'pr:merged';\n\nexport interface WorkspaceEvent {\n type: WorkspaceEventType;\n workspaceId?: string;\n credentialId?: string;\n executionId: string;\n timestamp: Date;\n data?: Record<string, unknown>;\n error?: string;\n}\n\nexport type WorkspaceEventHandler = (event: WorkspaceEvent) => void | Promise<void>;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/branch-naming.ts","../src/utils/git-credential-helper.ts","../src/workspace-service.ts","../src/oauth/device-flow.ts","../src/oauth/token-store.ts","../src/credential-service.ts","../src/providers/github-provider.ts","../src/providers/github-pat-client.ts","../src/types.ts"],"names":["path","fs","promisify","exec","fs2","randomUUID","path2","path3","os","crypto","fs3","loadOctokit"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASO,IAAM,qBAAA,GAAwB;AAcrC,IAAM,eAAA,GAAiD;AAAA,EACrD,aAAA,EAAe,EAAA;AAAA,EACf,MAAA,EAAQ;AACV,CAAA;AAKO,SAAS,kBAAA,CACd,QACA,OAAA,EACQ;AACR,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,eAAA,EAAiB,GAAG,OAAA,EAAQ;AAG9C,EAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,MAAA,CAAO,IAAI,CAAA;AAG1C,EAAA,MAAM,IAAA,GAAO,OAAO,IAAA,GAChB,iBAAA,CAAkB,OAAO,IAAA,EAAM,IAAA,CAAK,aAAa,CAAA,GACjD,EAAA;AAGJ,EAAA,MAAM,QAAQ,CAAC,IAAA,CAAK,MAAA,EAAQ,MAAA,CAAO,aAAa,IAAI,CAAA;AACpD,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA,EAAG,IAAI,IAAI,IAAI,CAAA,CAAA;AAAA;AAG5B,EAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AACvB;AAKO,SAAS,eAAA,CACd,YACA,OAAA,EAC6D;AAC7D,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,eAAA,EAAiB,GAAG,OAAA,EAAQ;AAG9C,EAAA,IAAI,CAAC,UAAA,CAAW,UAAA,CAAW,GAAG,IAAA,CAAK,MAAM,GAAG,CAAA,EAAG;AAC7C,IAAA,OAAO,IAAA;AAAA;AAGT,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA;AAClC,EAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,IAAA,OAAO,IAAA;AAAA;AAGT,EAAA,MAAM,GAAG,WAAA,EAAa,WAAW,CAAA,GAAI,KAAA;AAGrC,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,OAAA,CAAQ,GAAG,CAAA;AACzC,EAAA,IAAI,cAAc,EAAA,EAAI;AACpB,IAAA,OAAO,EAAE,WAAA,EAAa,IAAA,EAAM,WAAA,EAAY;AAAA;AAG1C,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,IAAA,EAAM,WAAA,CAAY,SAAA,CAAU,CAAA,EAAG,SAAS,CAAA;AAAA,IACxC,IAAA,EAAM,WAAA,CAAY,SAAA,CAAU,SAAA,GAAY,CAAC;AAAA,GAC3C;AACF;AAKO,SAAS,eAAA,CACd,YACA,OAAA,EACS;AACT,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,eAAA,EAAiB,GAAG,OAAA,EAAQ;AAC9C,EAAA,OAAO,UAAA,CAAW,UAAA,CAAW,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,CAAA,CAAG,CAAA;AAChD;AAKO,SAAS,yBAAA,CACd,QAAA,EACA,WAAA,EACA,OAAA,EACU;AACV,EAAA,MAAM,IAAA,GAAO,EAAE,GAAG,eAAA,EAAiB,GAAG,OAAA,EAAQ;AAC9C,EAAA,MAAM,MAAA,GAAS,CAAA,EAAG,IAAA,CAAK,MAAM,IAAI,WAAW,CAAA,CAAA,CAAA;AAC5C,EAAA,OAAO,SAAS,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,UAAA,CAAW,MAAM,CAAC,CAAA;AACpD;AAKO,SAAS,gBAAA,CACd,QACA,OAAA,EACY;AACZ,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,kBAAA,CAAmB,MAAA,EAAQ,OAAO,CAAA;AAAA,IACxC,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,SAAA,sBAAe,IAAA;AAAK,GACtB;AACF;AAKA,SAAS,iBAAA,CAAkB,OAAe,SAAA,EAA4B;AACpE,EAAA,IAAI,SAAS,KAAA,CACV,WAAA,GAEA,OAAA,CAAQ,SAAA,EAAW,GAAG,CAAA,CAEtB,OAAA,CAAQ,aAAA,EAAe,EAAE,EAEzB,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAElB,OAAA,CAAQ,UAAU,EAAE,CAAA;AAEvB,EAAA,IAAI,SAAA,IAAa,MAAA,CAAO,MAAA,GAAS,SAAA,EAAW;AAC1C,IAAA,MAAA,GAAS,OAAO,SAAA,CAAU,CAAA,EAAG,SAAS,CAAA,CAAE,OAAA,CAAQ,MAAM,EAAE,CAAA;AAAA;AAG1D,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,YAAA,CAAa,WAAA,EAAqB,SAAA,GAAY,EAAA,EAAY;AAExE,EAAA,MAAM,KAAA,GAAQ,WAAA,CACX,WAAA,EAAY,CACZ,OAAA,CAAQ,cAAA,EAAgB,EAAE,CAAA,CAC1B,KAAA,CAAM,KAAK,CAAA,CACX,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,CAC1B,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,UAAA,CAAW,GAAA,CAAI,CAAC,CAAC,CAAA,CAChC,KAAA,CAAM,GAAG,CAAC,CAAA;AAEb,EAAA,OAAO,iBAAA,CAAkB,KAAA,CAAM,IAAA,CAAK,GAAG,GAAG,SAAS,CAAA;AACrD;AAEA,IAAM,UAAA,uBAAiB,GAAA,CAAI;AAAA,EACzB,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC,CAAA;AC1JM,SAAS,iCAAiC,eAAA,EAAiC;AAChF,EAAA,OAAO,CAAA;AAAA;AAAA;;AAAA,qBAAA,EAIc,eAAe,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,CAAA;AAqCtC;AAKO,SAAS,kCAAkC,eAAA,EAAiC;AACjF,EAAA,OAAO,CAAA;AAAA;AAAA,0BAAA,EAEmB,eAAe;;AAAA;AAAA,WAAA,EAG9B,eAAe,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA,aAAA,EAMb,eAAe,CAAA;AAAA,eAAA,EACb,eAAe,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAahC;AAKA,eAAsB,yBAAA,CACpB,eACA,OAAA,EACiB;AAEjB,EAAA,MAAM,SAAA,GAAiBA,eAAA,CAAA,IAAA,CAAK,aAAA,EAAe,gBAAgB,CAAA;AAC3D,EAAA,MAASC,uBAAS,KAAA,CAAM,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAGtD,EAAA,MAAM,eAAA,GAAuBD,eAAA,CAAA,IAAA,CAAK,SAAA,EAAW,yBAAyB,CAAA;AACtE,EAAA,MAASC,aAAA,CAAA,QAAA,CAAS,SAAA;AAAA,IAChB,eAAA;AAAA,IACA,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,IAC/B,EAAE,MAAM,GAAA;AAAM;AAAA,GAChB;AAGA,EAAA,MAAM,gBAAA,GAAwBD,eAAA,CAAA,IAAA,CAAK,SAAA,EAAW,uBAAuB,CAAA;AACrE,EAAA,MAAM,YAAA,GAAe,kCAAkC,eAAe,CAAA;AACtE,EAAA,MAASC,uBAAS,SAAA,CAAU,gBAAA,EAAkB,cAAc,EAAE,IAAA,EAAM,KAAO,CAAA;AAG3E,EAAA,MAAM,aAAA,GAAqBD,eAAA,CAAA,IAAA,CAAK,aAAA,EAAe,YAAY,CAAA;AAC3D,EAAA,MAAM,KAAA,GAAQ,iBAAA;AACd,EAAA,IAAI;AACF,IAAA,IAAI,OAAA,GAAU,EAAA;AACd,IAAA,IAAI;AACF,MAAA,OAAA,GAAU,MAASC,aAAA,CAAA,QAAA,CAAS,QAAA,CAAS,aAAA,EAAe,OAAO,CAAA;AAAA,KAC7D,CAAA,MAAQ;AAAA;AAGR,IAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG;AAC5B,MAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,GAAS,CAAA,IAAK,CAAC,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA,GAAI;AAAA,EAAK,KAAK;AAAA,CAAA,GAAO,GAAG,KAAK;AAAA,CAAA;AACxF,MAAA,MAASA,aAAA,CAAA,QAAA,CAAS,SAAA,CAAU,aAAA,EAAe,OAAA,GAAU,MAAM,CAAA;AAAA;AAC7D,GACF,CAAA,MAAQ;AAAA;AAKR,EAAA,OAAO,gBAAA;AACT;AAMA,eAAsB,iBAAA,CACpB,aAAA,EACA,QAAA,EACA,YAAA,EACe;AACf,EAAA,MAAM,eAAA,GAAuBD,eAAA,CAAA,IAAA,CAAK,aAAA,EAAe,gBAAA,EAAkB,yBAAyB,CAAA;AAG5F,EAAA,MAAM,eAAA,GAAkB,MAASC,aAAA,CAAA,QAAA,CAAS,QAAA,CAAS,iBAAiB,MAAM,CAAA;AAC1E,EAAA,MAAM,OAAA,GAAmC,IAAA,CAAK,KAAA,CAAM,eAAe,CAAA;AAGnE,EAAA,OAAA,CAAQ,KAAA,GAAQ,QAAA;AAChB,EAAA,OAAA,CAAQ,SAAA,GAAY,YAAA;AAGpB,EAAA,MAASA,aAAA,CAAA,QAAA,CAAS,SAAA;AAAA,IAChB,eAAA;AAAA,IACA,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAA;AAAA,IAC/B,EAAE,MAAM,GAAA;AAAM,GAChB;AACF;AAKA,eAAsB,uBAAuB,aAAA,EAAsC;AACjF,EAAA,MAAM,SAAA,GAAiBD,eAAA,CAAA,IAAA,CAAK,aAAA,EAAe,gBAAgB,CAAA;AAC3D,EAAA,IAAI;AACF,IAAA,MAASC,aAAA,CAAA,QAAA,CAAS,GAAG,SAAA,EAAW,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA,GAClE,CAAA,MAAQ;AAAA;AAGV;AAKO,SAAS,uBAAuB,gBAAA,EAAoC;AACzE,EAAA,OAAO;AAAA;AAAA,IAEL,CAAA,+BAAA,CAAA;AAAA;AAAA,IAEA,wCAAwC,gBAAgB,CAAA,CAAA,CAAA;AAAA;AAAA,IAExD,CAAA,uCAAA;AAAA,GACF;AACF;AAKO,SAAS,iBAAA,CAAkB,UAAkB,QAAA,EAAwB;AAC1E,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,SAAA,EAAY,QAAQ,CAAA,CAAE,CAAA;AAClC,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,SAAA,EAAY,QAAQ,CAAA,CAAE,CAAA;AAClC,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAChB;;;ACzLA,IAAM,SAAA,GAAYC,eAAUC,kBAAI,CAAA;AA0BzB,IAAM,mBAAN,MAAuB;AAAA,EACpB,UAAA,uBAAyC,GAAA,EAAI;AAAA,EACpC,OAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,MAAA;AAAA,EACA,aAAA,uBAAgD,GAAA,EAAI;AAAA,EAErE,YAAY,OAAA,EAAkC;AAC5C,IAAA,IAAA,CAAK,OAAA,GAAU,QAAQ,MAAA,CAAO,OAAA;AAC9B,IAAA,IAAA,CAAK,YAAA,GAAe,OAAA,CAAQ,MAAA,CAAO,YAAA,IAAgB,UAAA;AACnD,IAAA,IAAA,CAAK,oBAAoB,OAAA,CAAQ,iBAAA;AACjC,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AAAA;AACxB;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA4B;AAChC,IAAA,MAASC,qBAAM,IAAA,CAAK,OAAA,EAAS,EAAE,SAAA,EAAW,MAAM,CAAA;AAChD,IAAA,IAAA,CAAK,IAAI,MAAA,EAAQ,EAAE,SAAS,IAAA,CAAK,OAAA,IAAW,+BAA+B,CAAA;AAAA;AAC7E;AAAA;AAAA;AAAA,EAKA,QAAQ,OAAA,EAA4C;AAClD,IAAA,IAAA,CAAK,aAAA,CAAc,IAAI,OAAO,CAAA;AAC9B,IAAA,OAAO,MAAM,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,OAAO,CAAA;AAAA;AAChD;AAAA;AAAA;AAAA,EAKA,MAAM,UAAU,MAAA,EAA6C;AAC3D,IAAA,MAAM,QAAA,GAA8B,OAAO,QAAA,IAAY,OAAA;AAGvD,IAAA,IAAI,aAAa,UAAA,EAAY;AAC3B,MAAA,IAAI,CAAC,OAAO,eAAA,EAAiB;AAC3B,QAAA,MAAM,IAAI,MAAM,yDAAyD,CAAA;AAAA;AAE3E,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,OAAO,eAAe,CAAA;AACzD,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,MAAA,CAAO,eAAe,CAAA,CAAE,CAAA;AAAA;AAEzE,MAAA,IAAI,MAAA,CAAO,aAAa,OAAA,EAAS;AAC/B,QAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA;AAEpE,MAAA,IAAI,MAAA,CAAO,IAAA,KAAS,MAAA,CAAO,IAAA,EAAM;AAC/B,QAAA,MAAM,IAAI,MAAM,oDAAoD,CAAA;AAAA;AACtE;AAGF,IAAA,MAAM,cAAcC,iBAAA,EAAW;AAE/B,IAAA,IAAA,CAAK,GAAA;AAAA,MACH,MAAA;AAAA,MACA;AAAA,QACE,WAAA;AAAA,QACA,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,WAAA,EAAa,OAAO,SAAA,CAAU,EAAA;AAAA,QAC9B,IAAA,EAAM,OAAO,IAAA,CAAK,IAAA;AAAA,QAClB;AAAA,OACF;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,KAAK,SAAA,CAAU;AAAA,MACnB,IAAA,EAAM,wBAAA;AAAA,MACN,WAAA;AAAA,MACA,WAAA,EAAa,OAAO,SAAA,CAAU,EAAA;AAAA,MAC9B,SAAA,sBAAe,IAAA;AAAK,KACrB,CAAA;AAGD,IAAA,MAAM,aAAA,GAAqBC,eAAA,CAAA,IAAA,CAAK,IAAA,CAAK,OAAA,EAAS,WAAW,CAAA;AAIzD,IAAA,IAAI,UAAA;AAEJ,IAAA,IAAI,QAAA,KAAa,UAAA,IAAc,MAAA,CAAO,eAAA,EAAiB;AACrD,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,OAAO,eAAe,CAAA;AACzD,MAAA,UAAA,GAAa,MAAA,CAAO,UAAA;AAAA,KACtB,MAAO;AACL,MAAA,MAASF,cAAA,CAAA,KAAA,CAAM,aAAA,EAAe,EAAE,SAAA,EAAW,MAAM,CAAA;AAGjD,MAAA,UAAA,GAAa,MAAM,IAAA,CAAK,iBAAA,CAAkB,cAAA,CAAe;AAAA,QACvD,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,MAAA,EAAQ,OAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,WAAA,EAAa,OAAO,SAAA,CAAU,EAAA;AAAA,UAC9B,MAAA,EAAQ,OAAO,IAAA,CAAK,EAAA;AAAA,UACpB,MAAA,EAAQ,OAAO,IAAA,EAAM,EAAA;AAAA,UACrB,MAAA,EAAQ,iBAAiB,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,IAAA,EAAO,MAAA,CAAO,UAAU,WAAW,CAAA;AAAA,SAC9E;AAAA,QACA,cAAc,MAAA,CAAO,eAAA;AAAA;AAAA,QAErB,QAAA,EAAU,CAAC,MAAA,CAAO;AAAA,OACnB,CAAA;AAED,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,KAAK,SAAA,CAAU;AAAA,UACnB,IAAA,EAAM,oBAAA;AAAA,UACN,WAAA;AAAA,UACA,cAAc,UAAA,CAAW,EAAA;AAAA,UACzB,WAAA,EAAa,OAAO,SAAA,CAAU,EAAA;AAAA,UAC9B,SAAA,sBAAe,IAAA;AAAK,SACrB,CAAA;AAAA;AACH;AAIF,IAAA,MAAM,UAAA,GAAyB,OAAO,UAAA,GAClC;AAAA,MACE,MAAM,MAAA,CAAO,UAAA;AAAA,MACb,WAAA,EAAa,OAAO,SAAA,CAAU,EAAA;AAAA,MAC9B,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,SAAA,sBAAe,IAAA;AAAK,KACtB,GACA,gBAAA;AAAA,MACE;AAAA,QACE,WAAA,EAAa,OAAO,SAAA,CAAU,EAAA;AAAA,QAC9B,IAAA,EAAM,OAAO,IAAA,CAAK,IAAA;AAAA,QAClB,IAAA,EAAM,OAAO,IAAA,CAAK,IAAA;AAAA,QAClB,YAAY,MAAA,CAAO;AAAA,OACrB;AAAA,MACA,EAAE,MAAA,EAAQ,IAAA,CAAK,YAAA;AAAa,KAC9B;AAGJ,IAAA,MAAM,SAAA,GAAuB;AAAA,MAC3B,EAAA,EAAI,WAAA;AAAA,MACJ,IAAA,EAAM,aAAA;AAAA,MACN,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,MAAA,EAAQ,UAAA;AAAA,MACR,YAAY,UAAA,IAAc,MAAA;AAAA;AAAA,MAC1B,aAAA,sBAAmB,IAAA,EAAK;AAAA,MACxB,MAAA,EAAQ,cAAA;AAAA,MACR,QAAA;AAAA,MACA,mBAAmB,MAAA,CAAO,eAAA;AAAA,MAC1B,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,QAAA,EAAU;AAAA,QACR,KAAA,EAAO,cAAA;AAAA,QACP,OAAA,EAAS,wBAAA;AAAA,QACT,SAAA,sBAAe,IAAA;AAAK;AACtB,KACF;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,WAAA,EAAa,SAAS,CAAA;AAE1C,IAAA,IAAI;AACF,MAAA,IAAI,aAAa,OAAA,EAAS;AAExB,QAAA,IAAA,CAAK,cAAA,CAAe,SAAA,EAAW,SAAA,EAAW,oBAAoB,CAAA;AAG9D,QAAA,IAAI,CAAC,UAAA,EAAY;AACf,UAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,uBAAA,CAAwB,SAAS,CAAA;AAChE,UAAA,IAAI,CAAC,YAAY,OAAA,EAAS;AAGxB,YAAA,MAAM,IAAI,KAAA;AAAA,cACR,CAAA,WAAA,EAAc,OAAO,IAAI,CAAA,yGAAA;AAAA,aAE3B;AAAA;AAGF,UAAA,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,EAAE,WAAA,IAAe,iDAAiD,CAAA;AAAA,SACrF,MAAO;AAEL,UAAA,MAAM,IAAA,CAAK,SAAA,CAAU,SAAA,EAAW,UAAA,CAAW,KAAK,CAAA;AAAA;AAIlD,QAAA,IAAA,CAAK,cAAA,CAAe,SAAA,EAAW,iBAAA,EAAmB,iBAAiB,CAAA;AACnE,QAAA,MAAM,IAAA,CAAK,aAAa,SAAS,CAAA;AAAA,OACnC,MAAO;AAEL,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,OAAO,eAAgB,CAAA;AAC1D,QAAA,MAAM,IAAA,CAAK,qBAAA,CAAsB,MAAA,EAAQ,SAAS,CAAA;AAGlD,QAAA,IAAI,CAAC,OAAO,WAAA,EAAa;AACvB,UAAA,MAAA,CAAO,cAAc,EAAC;AAAA;AAExB,QAAA,MAAA,CAAO,WAAA,CAAY,KAAK,WAAW,CAAA;AACnC,QAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,MAAM,CAAA;AAErC,QAAA,MAAM,KAAK,SAAA,CAAU;AAAA,UACnB,IAAA,EAAM,gBAAA;AAAA,UACN,WAAA;AAAA,UACA,WAAA,EAAa,OAAO,SAAA,CAAU,EAAA;AAAA,UAC9B,SAAA,sBAAe,IAAA,EAAK;AAAA,UACpB,IAAA,EAAM,EAAE,iBAAA,EAAmB,MAAA,CAAO,EAAA;AAAG,SACtC,CAAA;AAAA;AAIH,MAAA,IAAA,CAAK,cAAA,CAAe,SAAA,EAAW,aAAA,EAAe,iBAAiB,CAAA;AAC/D,MAAA,MAAM,IAAA,CAAK,aAAa,SAAS,CAAA;AAGjC,MAAA,SAAA,CAAU,MAAA,GAAS,OAAA;AACnB,MAAA,IAAA,CAAK,cAAA,CAAe,SAAA,EAAW,OAAA,EAAS,iBAAiB,CAAA;AACzD,MAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,WAAA,EAAa,SAAS,CAAA;AAG1C,MAAA,MAAM,IAAA,CAAK,qBAAA,CAAsB,SAAA,EAAW,SAAS,CAAA;AAErD,MAAA,IAAA,CAAK,GAAA;AAAA,QACH,MAAA;AAAA,QACA;AAAA,UACE,WAAA;AAAA,UACA,IAAA,EAAM,aAAA;AAAA,UACN,QAAQ,UAAA,CAAW,IAAA;AAAA,UACnB;AAAA,SACF;AAAA,QACA;AAAA,OACF;AAEA,MAAA,MAAM,KAAK,SAAA,CAAU;AAAA,QACnB,IAAA,EAAM,iBAAA;AAAA,QACN,WAAA;AAAA,QACA,WAAA,EAAa,OAAO,SAAA,CAAU,EAAA;AAAA,QAC9B,SAAA,sBAAe,IAAA;AAAK,OACrB,CAAA;AAED,MAAA,OAAO,SAAA;AAAA,aACA,KAAA,EAAO;AACd,MAAA,SAAA,CAAU,MAAA,GAAS,OAAA;AACnB,MAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,MAAA,IAAA,CAAK,cAAA,CAAe,SAAA,EAAW,OAAA,EAAS,YAAY,CAAA;AACpD,MAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,WAAA,EAAa,SAAS,CAAA;AAE1C,MAAA,IAAA,CAAK,IAAI,OAAA,EAAS,EAAE,aAAa,KAAA,EAAO,YAAA,IAAgB,+BAA+B,CAAA;AAEvF,MAAA,MAAM,KAAK,SAAA,CAAU;AAAA,QACnB,IAAA,EAAM,iBAAA;AAAA,QACN,WAAA;AAAA,QACA,WAAA,EAAa,OAAO,SAAA,CAAU,EAAA;AAAA,QAC9B,SAAA,sBAAe,IAAA,EAAK;AAAA,QACpB,KAAA,EAAO;AAAA,OACR,CAAA;AAGD,MAAA,MAAM,IAAA,CAAK,qBAAA,CAAsB,SAAA,EAAW,OAAO,CAAA;AAEnD,MAAA,MAAM,KAAA;AAAA;AACR;AACF;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CACJ,iBAAA,EACA,OAAA,EAKoB;AACpB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,iBAAiB,CAAA;AACpD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,iBAAiB,CAAA,CAAE,CAAA;AAAA;AAGpE,IAAA,OAAO,KAAK,SAAA,CAAU;AAAA,MACpB,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,QAAA,EAAU,UAAA;AAAA,MACV,eAAA,EAAiB,iBAAA;AAAA,MACjB,cAAA,EAAgB,gBAAA;AAAA,MAChB,YAAY,OAAA,CAAQ,MAAA;AAAA,MACpB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,MAAM,OAAA,CAAQ;AAAA,KACf,CAAA;AAAA;AACH;AAAA;AAAA;AAAA,EAKA,cAAc,iBAAA,EAAwC;AACpD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,iBAAiB,CAAA;AACpD,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,OAAO,EAAC;AAAA;AAGV,IAAA,IAAI,CAAC,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,WAAA,CAAY,WAAW,CAAA,EAAG;AAC1D,MAAA,OAAO,EAAC;AAAA;AAGV,IAAA,OAAO,MAAA,CAAO,WAAA,CACX,GAAA,CAAI,CAAC,OAAO,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,EAAE,CAAC,CAAA,CACnC,MAAA,CAAO,CAAC,CAAA,KAAsB,MAAM,MAAS,CAAA;AAAA;AAClD;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,WAAA,EAAoC;AACvD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,WAAW,CAAA;AACjD,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA;AAAA;AAGF,IAAA,IAAI,SAAA,CAAU,aAAa,UAAA,EAAY;AACrC,MAAA,MAAM,IAAI,MAAM,qDAAqD,CAAA;AAAA;AAGvE,IAAA,MAAM,IAAA,CAAK,QAAQ,WAAW,CAAA;AAAA;AAChC;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CACJ,WAAA,EACA,OAAA,EACiC;AACjC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,WAAW,CAAA;AACjD,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,WAAW,CAAA,CAAE,CAAA;AAAA;AAGvD,IAAA,SAAA,CAAU,MAAA,GAAS,YAAA;AACnB,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,WAAA,EAAa,SAAS,CAAA;AAE1C,IAAA,IAAA,CAAK,GAAA;AAAA,MACH,MAAA;AAAA,MACA;AAAA,QACE,WAAA;AAAA,QACA,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,UAAU,OAAA,CAAQ;AAAA,OACpB;AAAA,MACA;AAAA,KACF;AAEA,IAAA,MAAM,KAAK,SAAA,CAAU;AAAA,MACnB,IAAA,EAAM,sBAAA;AAAA,MACN,WAAA;AAAA,MACA,WAAA,EAAa,UAAU,MAAA,CAAO,WAAA;AAAA,MAC9B,SAAA,sBAAe,IAAA;AAAK,KACrB,CAAA;AAED,IAAA,IAAI,EAAA;AAEJ,IAAA,IAAI;AACF,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,MAAM,IAAA,CAAK,WAAW,SAAS,CAAA;AAAA;AAGjC,MAAA,IAAI,OAAA,CAAQ,QAAA,IAAY,OAAA,CAAQ,EAAA,EAAI;AAClC,QAAA,EAAA,GAAK,MAAM,IAAA,CAAK,iBAAA,CAAkB,SAAA,EAAW,QAAQ,EAAE,CAAA;AACvD,QAAA,SAAA,CAAU,OAAO,WAAA,GAAc,EAAA;AAE/B,QAAA,MAAM,KAAK,SAAA,CAAU;AAAA,UACnB,IAAA,EAAM,YAAA;AAAA,UACN,WAAA;AAAA,UACA,WAAA,EAAa,UAAU,MAAA,CAAO,WAAA;AAAA,UAC9B,SAAA,sBAAe,IAAA,EAAK;AAAA,UACpB,IAAA,EAAM;AAAA,YACJ,UAAU,EAAA,CAAG,MAAA;AAAA,YACb,OAAO,EAAA,CAAG;AAAA;AACZ,SACD,CAAA;AAAA;AAGH,MAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,QAAA,MAAM,IAAA,CAAK,QAAQ,WAAW,CAAA;AAAA,OAChC,MAAO;AACL,QAAA,SAAA,CAAU,MAAA,GAAS,OAAA;AACnB,QAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,WAAA,EAAa,SAAS,CAAA;AAAA;AAG5C,MAAA,OAAO,EAAA;AAAA,aACA,KAAA,EAAO;AACd,MAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,MAAA,IAAA,CAAK,IAAI,OAAA,EAAS,EAAE,aAAa,KAAA,EAAO,YAAA,IAAgB,8BAA8B,CAAA;AACtF,MAAA,MAAM,KAAA;AAAA;AACR;AACF;AAAA;AAAA;AAAA,EAKA,IAAI,WAAA,EAAuC;AACzC,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,WAAW,CAAA,IAAK,IAAA;AAAA;AAC7C;AAAA;AAAA;AAAA,EAKA,gBAAgB,WAAA,EAAkC;AAChD,IAAA,OAAO,MAAM,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,CAAA,CAAE,MAAA;AAAA,MAC1C,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,CAAO,WAAA,KAAgB;AAAA,KAClC;AAAA;AACF;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,WAAA,EAAoC;AAChD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,WAAW,CAAA;AACjD,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA;AAAA;AAGF,IAAA,IAAA,CAAK,GAAA,CAAI,QAAQ,EAAE,WAAA,EAAa,UAAU,SAAA,CAAU,QAAA,IAAY,uBAAuB,CAAA;AAGvF,IAAA,IAAI,SAAA,CAAU,QAAA,KAAa,OAAA,IAAW,SAAA,CAAU,aAAa,MAAA,EAAQ;AACnE,MAAA,IAAA,CAAK,GAAA;AAAA,QACH,MAAA;AAAA,QACA,EAAE,WAAA,EAAa,aAAA,EAAe,SAAA,CAAU,YAAY,MAAA,EAAO;AAAA,QAC3D;AAAA,OACF;AACA,MAAA,KAAA,MAAW,UAAA,IAAc,UAAU,WAAA,EAAa;AAC9C,QAAA,MAAM,IAAA,CAAK,QAAQ,UAAU,CAAA;AAAA;AAC/B;AAIF,IAAA,IAAI;AACF,MAAA,MAAM,sBAAA,CAAuB,UAAU,IAAI,CAAA;AAAA,aACpC,KAAA,EAAO;AACd,MAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,MAAA,IAAA,CAAK,IAAI,MAAA,EAAQ,EAAE,aAAa,KAAA,EAAO,YAAA,IAAgB,qCAAqC,CAAA;AAAA;AAI9F,IAAA,IAAI,SAAA,CAAU,QAAA,KAAa,UAAA,IAAc,SAAA,CAAU,iBAAA,EAAmB;AACpE,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,UAAU,iBAAiB,CAAA;AAC9D,MAAA,IAAI,MAAA,EAAQ;AACV,QAAA,IAAI;AAEF,UAAA,MAAM,KAAK,SAAA,CAAU,MAAA,CAAO,MAAM,CAAA,qBAAA,EAAwB,SAAA,CAAU,IAAI,CAAA,SAAA,CAAW,CAAA;AAAA,iBAC5E,KAAA,EAAO;AACd,UAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,UAAA,IAAA,CAAK,IAAI,MAAA,EAAQ,EAAE,aAAa,KAAA,EAAO,YAAA,IAAgB,mCAAmC,CAAA;AAAA;AAI5F,QAAA,IAAI,OAAO,WAAA,EAAa;AACtB,UAAA,MAAA,CAAO,cAAc,MAAA,CAAO,WAAA,CAAY,OAAO,CAAC,EAAA,KAAO,OAAO,WAAW,CAAA;AACzE,UAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,MAAA,CAAO,EAAA,EAAI,MAAM,CAAA;AAAA;AAGvC,QAAA,MAAM,KAAK,SAAA,CAAU;AAAA,UACnB,IAAA,EAAM,kBAAA;AAAA,UACN,WAAA;AAAA,UACA,WAAA,EAAa,UAAU,MAAA,CAAO,WAAA;AAAA,UAC9B,SAAA,sBAAe,IAAA,EAAK;AAAA,UACpB,IAAA,EAAM,EAAE,iBAAA,EAAmB,MAAA,CAAO,EAAA;AAAG,SACtC,CAAA;AAAA;AACH;AAIF,IAAA,IAAI,SAAA,CAAU,QAAA,KAAa,OAAA,IAAW,SAAA,CAAU,UAAA,EAAY;AAC1D,MAAA,MAAM,IAAA,CAAK,iBAAA,CAAkB,gBAAA,CAAiB,SAAA,CAAU,WAAW,EAAE,CAAA;AAErE,MAAA,MAAM,KAAK,SAAA,CAAU;AAAA,QACnB,IAAA,EAAM,oBAAA;AAAA,QACN,WAAA;AAAA,QACA,YAAA,EAAc,UAAU,UAAA,CAAW,EAAA;AAAA,QACnC,WAAA,EAAa,UAAU,MAAA,CAAO,WAAA;AAAA,QAC9B,SAAA,sBAAe,IAAA;AAAK,OACrB,CAAA;AAAA;AAKH,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAASA,cAAA,CAAA,QAAA,CAAS,SAAA,CAAU,IAAI,CAAA;AACjD,MAAA,MAAM,QAAA,GAAW,MAASA,cAAA,CAAA,QAAA,CAAS,IAAA,CAAK,OAAO,CAAA;AAC/C,MAAA,IAAI,CAAC,QAAA,CAAS,UAAA,CAAW,WAAgBE,eAAA,CAAA,GAAG,CAAA,IAAK,aAAa,QAAA,EAAU;AACtE,QAAA,IAAA,CAAK,IAAI,OAAA,EAAS,EAAE,aAAa,QAAA,EAAU,QAAA,IAAY,mEAA8D,CAAA;AAAA,OACvH,MAAO;AACL,QAAA,MAASF,cAAA,CAAA,EAAA,CAAG,UAAU,IAAA,EAAM,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AAAA;AAC9D,aACO,KAAA,EAAO;AACd,MAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,MAAA,IAAA,CAAK,IAAI,MAAA,EAAQ,EAAE,aAAa,KAAA,EAAO,YAAA,IAAgB,sCAAsC,CAAA;AAAA;AAG/F,IAAA,SAAA,CAAU,MAAA,GAAS,YAAA;AACnB,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,WAAA,EAAa,SAAS,CAAA;AAE1C,IAAA,MAAM,KAAK,SAAA,CAAU;AAAA,MACnB,IAAA,EAAM,sBAAA;AAAA,MACN,WAAA;AAAA,MACA,WAAA,EAAa,UAAU,MAAA,CAAO,WAAA;AAAA,MAC9B,SAAA,sBAAe,IAAA;AAAK,KACrB,CAAA;AAAA;AACH;AAAA;AAAA;AAAA,EAKA,MAAM,oBAAoB,WAAA,EAAoC;AAC5D,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,eAAA,CAAgB,WAAW,CAAA;AACnD,IAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,IAAA,CAAK,OAAA,CAAQ,CAAA,CAAE,EAAE,CAAC,CAAC,CAAA;AAG3D,IAAA,MAAM,IAAA,CAAK,iBAAA,CAAkB,kBAAA,CAAmB,WAAW,CAAA;AAAA;AAC7D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAc,wBACZ,SAAA,EAC+C;AAE/C,IAAA,IAAI,WAAW,SAAA,CAAU,IAAA;AAGzB,IAAA,IAAI,QAAA,CAAS,UAAA,CAAW,iBAAiB,CAAA,EAAG;AAC1C,MAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,iBAAA,EAAmB,qBAAqB,CAAA;AAAA;AAItE,IAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AAGtC,IAAA,IAAI,CAAC,QAAA,CAAS,QAAA,CAAS,MAAM,CAAA,EAAG;AAC9B,MAAA,QAAA,GAAW,GAAG,QAAQ,CAAA,IAAA,CAAA;AAAA;AAIxB,IAAA,IAAI,CAAC,QAAA,CAAS,UAAA,CAAW,UAAU,CAAA,EAAG;AACpC,MAAA,QAAA,GAAW,WAAW,QAAQ,CAAA,CAAA;AAAA;AAGhC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,SAAA;AAAA,QACT,SAAA,CAAU,IAAA;AAAA,QACV,CAAA,6BAAA,EAAgC,SAAA,CAAU,MAAA,CAAO,UAAU,IAAI,QAAQ,CAAA,EAAA;AAAA,OACzE;AACA,MAAA,IAAA,CAAK,IAAI,MAAA,EAAQ,EAAE,aAAa,SAAA,CAAU,EAAA,IAAM,iDAAiD,CAAA;AACjG,MAAA,OAAO,EAAE,SAAS,IAAA,EAAK;AAAA,aAChB,KAAA,EAAO;AACd,MAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAG1E,MAAA,MAAM,cACJ,YAAA,CAAa,QAAA,CAAS,KAAK,CAAA,IAC3B,YAAA,CAAa,SAAS,KAAK,CAAA,IAC3B,aAAa,QAAA,CAAS,uBAAuB,KAC7C,YAAA,CAAa,QAAA,CAAS,yBAAyB,CAAA,IAC/C,YAAA,CAAa,SAAS,2BAA2B,CAAA;AAEnD,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAO,yBAAA,EAA0B;AAAA;AAI5D,MAAA,MAAM,KAAA;AAAA;AACR;AACF,EAEA,MAAc,SAAA,CAAU,SAAA,EAAsB,KAAA,EAA8B;AAG1E,IAAA,MAAM,QAAA,GAAW,QACb,IAAA,CAAK,qBAAA,CAAsB,UAAU,IAAA,EAAM,KAAK,IAChD,SAAA,CAAU,IAAA;AAGd,IAAA,MAAM,IAAA,CAAK,SAAA;AAAA,MACT,SAAA,CAAU,IAAA;AAAA,MACV,CAAA,6BAAA,EAAgC,SAAA,CAAU,MAAA,CAAO,UAAU,IAAI,QAAQ,CAAA,EAAA;AAAA,KACzE;AAAA;AACF,EAEA,MAAc,aAAa,SAAA,EAAqC;AAE9D,IAAA,MAAM,IAAA,CAAK,UAAU,SAAA,CAAU,IAAA,EAAM,mBAAmB,SAAA,CAAU,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAAA;AACjF,EAEA,MAAc,qBAAA,CAAsB,MAAA,EAAmB,SAAA,EAAqC;AAE1F,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,UAAU,MAAA,CAAO,IAAA,EAAM,oBAAoB,SAAA,CAAU,MAAA,CAAO,UAAU,CAAA,CAAE,CAAA;AAAA,KACrF,CAAA,MAAQ;AAAA;AAMR,IAAA,MAAM,IAAA,CAAK,SAAA;AAAA,MACT,MAAA,CAAO,IAAA;AAAA,MACP,CAAA,oBAAA,EAAuB,SAAA,CAAU,MAAA,CAAO,IAAI,CAAA,EAAA,EAAK,UAAU,IAAI,CAAA,SAAA,EAAY,SAAA,CAAU,MAAA,CAAO,UAAU,CAAA;AAAA,KACxG;AAAA;AACF,EAEA,MAAc,aAAa,SAAA,EAAqC;AAE9D,IAAA,MAAM,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,IAAA,EAAM,wCAAwC,CAAA;AAC7E,IAAA,MAAM,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,IAAA,EAAM,+CAA+C,CAAA;AAGpF,IAAA,IAAI,CAAC,SAAA,CAAU,UAAA,IAAc,CAAC,SAAA,CAAU,WAAW,KAAA,EAAO;AACxD,MAAA,IAAA,CAAK,GAAA;AAAA,QACH,OAAA;AAAA,QACA,EAAE,WAAA,EAAa,SAAA,CAAU,EAAA,EAAG;AAAA,QAC5B,SAAA,CAAU,aACN,sDAAA,GACA;AAAA,OACN;AACA,MAAA;AAAA;AAIF,IAAA,MAAM,iBAAA,GAA6C;AAAA,MACjD,aAAa,SAAA,CAAU,EAAA;AAAA,MACvB,WAAA,EAAa,UAAU,MAAA,CAAO,WAAA;AAAA,MAC9B,MAAM,SAAA,CAAU,IAAA;AAAA,MAChB,KAAA,EAAO,UAAU,UAAA,CAAW,KAAA;AAAA,MAC5B,SAAA,EAAW,SAAA,CAAU,UAAA,CAAW,SAAA,CAAU,WAAA;AAAY,KACxD;AAEA,IAAA,MAAM,mBAAmB,MAAM,yBAAA;AAAA,MAC7B,SAAA,CAAU,IAAA;AAAA,MACV;AAAA,KACF;AAGA,IAAA,MAAM,cAAA,GAAiB,uBAAuB,gBAAgB,CAAA;AAC9D,IAAA,KAAA,MAAW,OAAO,cAAA,EAAgB;AAChC,MAAA,MAAM,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,IAAA,EAAM,GAAG,CAAA;AAAA;AAG1C,IAAA,IAAA,CAAK,GAAA;AAAA,MACH,OAAA;AAAA,MACA,EAAE,WAAA,EAAa,SAAA,CAAU,EAAA,EAAI,YAAY,gBAAA,EAAiB;AAAA,MAC1D;AAAA,KACF;AAAA;AACF,EAEA,MAAc,WAAW,SAAA,EAAqC;AAE5D,IAAA,IAAI,CAAC,UAAU,UAAA,EAAY;AACzB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA;AAIF,IAAA,MAAM,IAAA,CAAK,UAAU,SAAA,CAAU,IAAA,EAAM,sBAAsB,SAAA,CAAU,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA;AAAA;AACpF,EAEA,MAAc,iBAAA,CACZ,SAAA,EACA,MAAA,EAC0B;AAE1B,IAAA,IAAI,CAAC,UAAU,UAAA,EAAY;AACzB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA;AAIF,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,IAAI,CAAA;AAC9C,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,SAAA,CAAU,IAAI,CAAA,CAAE,CAAA;AAAA;AAIhE,IAAA,MAAM,WAAW,IAAA,CAAK,iBAAA,CAAkB,WAAA,CAAY,SAAA,CAAU,WAAW,QAAQ,CAAA;AACjF,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,SAAA,CAAU,UAAA,CAAW,QAAQ,CAAA,CAAE,CAAA;AAAA;AAI7E,IAAA,MAAM,EAAA,GAAK,MAAM,QAAA,CAAS,iBAAA,CAAkB;AAAA,MAC1C,MAAM,SAAA,CAAU,IAAA;AAAA,MAChB,YAAA,EAAc,UAAU,MAAA,CAAO,IAAA;AAAA,MAC/B,cAAc,MAAA,CAAO,YAAA;AAAA,MACrB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,QAAQ,MAAA,CAAO,MAAA;AAAA,MACf,WAAW,MAAA,CAAO,SAAA;AAAA,MAClB,YAAY,SAAA,CAAU;AAAA,KACvB,CAAA;AAGD,IAAA,EAAA,CAAG,WAAA,GAAc,UAAU,MAAA,CAAO,WAAA;AAElC,IAAA,IAAA,CAAK,GAAA;AAAA,MACH,MAAA;AAAA,MACA;AAAA,QACE,aAAa,SAAA,CAAU,EAAA;AAAA,QACvB,UAAU,EAAA,CAAG,MAAA;AAAA,QACb,OAAO,EAAA,CAAG;AAAA,OACZ;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO,EAAA;AAAA;AACT,EAEQ,UAAU,IAAA,EAAsD;AACtE,IAAA,MAAM,QAAA,GAAW,CAAC,kCAAA,EAAoC,oBAAoB,CAAA;AAE1E,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAChC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAO,EAAE,KAAA,EAAO,KAAA,CAAM,CAAC,CAAA,EAAG,IAAA,EAAM,KAAA,CAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA,EAAE;AAAA;AACjE;AAGF,IAAA,OAAO,IAAA;AAAA;AACT,EAEQ,qBAAA,CAAsB,MAAc,KAAA,EAAuB;AAEjE,IAAA,IAAI,GAAA,GAAM,IAAA;AAGV,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,iBAAiB,CAAA,EAAG;AACrC,MAAA,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,iBAAA,EAAmB,qBAAqB,CAAA;AAAA;AAI5D,IAAA,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AAG5B,IAAA,IAAI,CAAC,GAAA,CAAI,QAAA,CAAS,MAAM,CAAA,EAAG;AACzB,MAAA,GAAA,GAAM,GAAG,GAAG,CAAA,IAAA,CAAA;AAAA;AAId,IAAA,IAAI,CAAC,GAAA,CAAI,UAAA,CAAW,UAAU,CAAA,EAAG;AAC/B,MAAA,GAAA,GAAM,WAAW,GAAG,CAAA,CAAA;AAAA;AAItB,IAAA,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,UAAA,EAAY,CAAA,uBAAA,EAA0B,KAAK,CAAA,CAAA,CAAG,CAAA;AAEhE,IAAA,OAAO,GAAA;AAAA;AACT,EAEA,MAAc,SAAA,CAAU,GAAA,EAAa,OAAA,EAAkC;AAErE,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,OAAA,CAAQ,wBAAA,EAA0B,qBAAqB,CAAA;AACnF,IAAA,IAAA,CAAK,IAAI,OAAA,EAAS,EAAE,KAAK,OAAA,EAAS,WAAA,IAAe,uBAAuB,CAAA;AAExE,IAAA,MAAM,EAAE,MAAA,EAAQ,MAAA,EAAO,GAAI,MAAM,UAAU,OAAA,EAAS,EAAE,GAAA,EAAK,GAAA,EAAK,CAAA;AAEhE,IAAA,IAAI,MAAA,IAAU,CAAC,MAAA,CAAO,QAAA,CAAS,cAAc,CAAA,EAAG;AAC9C,MAAA,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,EAAE,MAAA,EAAQ,MAAA,CAAO,UAAU,CAAA,EAAG,GAAG,CAAA,EAAE,EAAG,YAAY,CAAA;AAAA;AAGtE,IAAA,OAAO,MAAA;AAAA;AACT,EAEQ,GAAA,CACN,KAAA,EACA,IAAA,EACA,OAAA,EACM;AACN,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,CAAE,IAAA,EAAM,OAAO,CAAA;AAAA;AAClC;AACF,EAEA,MAAc,UAAU,KAAA,EAAsC;AAC5D,IAAA,KAAA,MAAW,OAAA,IAAW,KAAK,aAAA,EAAe;AACxC,MAAA,IAAI;AACF,QAAA,MAAM,QAAQ,KAAK,CAAA;AAAA,eACZ,KAAA,EAAO;AACd,QAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,QAAA,IAAA,CAAK,GAAA,CAAI,QAAQ,EAAE,KAAA,EAAO,MAAM,IAAA,EAAM,KAAA,EAAO,YAAA,EAAa,EAAG,qBAAqB,CAAA;AAAA;AACpF;AACF;AACF;AAAA;AAAA;AAAA,EAKQ,cAAA,CAAe,SAAA,EAAsB,KAAA,EAAuB,OAAA,EAAwB;AAC1F,IAAA,SAAA,CAAU,QAAA,GAAW;AAAA,MACnB,KAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA,sBAAe,IAAA;AAAK,KACtB;AACA,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,SAAA,CAAU,EAAA,EAAI,SAAS,CAAA;AAE3C,IAAA,IAAA,CAAK,GAAA;AAAA,MACH,OAAA;AAAA,MACA,EAAE,WAAA,EAAa,SAAA,CAAU,EAAA,EAAI,OAAO,OAAA,EAAQ;AAAA,MAC5C;AAAA,KACF;AAAA;AACF;AAAA;AAAA;AAAA,EAKA,MAAc,qBAAA,CACZ,SAAA,EACA,MAAA,EACe;AACf,IAAA,MAAM,OAAO,SAAA,CAAU,UAAA;AACvB,IAAA,IAAI,CAAC,IAAA,EAAM;AAGX,IAAA,IAAI,MAAA,KAAW,OAAA,IAAW,IAAA,CAAK,UAAA,KAAe,KAAA,EAAO;AACnD,MAAA;AAAA;AAIF,IAAA,MAAM,GAAA,GAAM;AAAA,MACV,GAAG,OAAA,CAAQ,GAAA;AAAA,MACX,cAAc,SAAA,CAAU,EAAA;AAAA,MACxB,MAAM,SAAA,CAAU,IAAA;AAAA,MAChB,MAAA,EAAQ,UAAU,MAAA,CAAO,IAAA;AAAA,MACzB,MAAA,EAAQ,MAAA;AAAA,MACR,gBAAgB,SAAA,CAAU;AAAA,KAC5B;AAGA,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,EAAE,WAAA,EAAa,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,CAAK,OAAA,EAAQ,EAAG,mCAAmC,CAAA;AAC1G,QAAA,MAAM,SAAA,CAAU,IAAA,CAAK,OAAA,EAAS,EAAE,KAAK,CAAA;AAAA,eAC9B,KAAA,EAAO;AACd,QAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,QAAA,IAAA,CAAK,GAAA,CAAI,QAAQ,EAAE,WAAA,EAAa,UAAU,EAAA,EAAI,KAAA,EAAO,YAAA,EAAa,EAAG,gCAAgC,CAAA;AAAA;AACvG;AAIF,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,EAAE,WAAA,EAAa,SAAA,CAAU,IAAI,OAAA,EAAS,IAAA,CAAK,OAAA,EAAQ,EAAG,4BAA4B,CAAA;AACnG,QAAA,MAAM,OAAA,GAAU;AAAA,UACd,aAAa,SAAA,CAAU,EAAA;AAAA,UACvB,MAAM,SAAA,CAAU,IAAA;AAAA,UAChB,MAAA,EAAQ,UAAU,MAAA,CAAO,IAAA;AAAA,UACzB,MAAA;AAAA,UACA,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY,SACpC;AAEA,QAAA,MAAM,KAAA,CAAM,KAAK,OAAA,EAAS;AAAA,UACxB,MAAA,EAAQ,MAAA;AAAA,UACR,OAAA,EAAS;AAAA,YACP,cAAA,EAAgB,kBAAA;AAAA,YAChB,GAAG,IAAA,CAAK;AAAA,WACV;AAAA,UACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,SAC7B,CAAA;AAAA,eACM,KAAA,EAAO;AACd,QAAA,MAAM,eAAe,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAC1E,QAAA,IAAA,CAAK,GAAA,CAAI,QAAQ,EAAE,WAAA,EAAa,UAAU,EAAA,EAAI,KAAA,EAAO,YAAA,EAAa,EAAG,2BAA2B,CAAA;AAAA;AAClG;AACF;AAEJ;;;AC30BA,IAAM,sBAAA,GAAyB,sCAAA;AAC/B,IAAM,gBAAA,GAAmB,6CAAA;AAGzB,IAAM,2BAAA,GAA8B,uBAAA;AACpC,IAAM,eAAA,GAAkB,WAAA;AACxB,IAAM,mBAAA,GAAsB,eAAA;AAC5B,IAAM,mBAAA,GAAsB,eAAA;AAKrB,IAAM,kBAAN,MAAsB;AAAA,EACV,QAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EAEjB,WAAA,CAAY,QAA+B,MAAA,EAAgC;AACzE,IAAA,IAAA,CAAK,WAAW,MAAA,CAAO,QAAA;AACvB,IAAA,IAAA,CAAK,eAAe,MAAA,CAAO,YAAA;AAC3B,IAAA,IAAA,CAAK,QAAA,GAAW,OAAO,QAAA,IAAY,QAAA;AACnC,IAAA,IAAA,CAAK,WAAA,GAAc,OAAO,WAAA,IAAe;AAAA,MACvC,YAAA,EAAc,EAAE,IAAA,EAAM,KAAA,EAAM;AAAA,MAC5B,QAAA,EAAU,OAAA;AAAA,MACV,YAAA,EAAc,OAAA;AAAA,MACd,MAAA,EAAQ,OAAA;AAAA,MACR,QAAA,EAAU,MAAA;AAAA,MACV,eAAA,EAAiB,IAAA;AAAA,MACjB,YAAA,EAAc,KAAA;AAAA,MACd,mBAAA,EAAqB,KAAA;AAAA,MACrB,aAAA,EAAe;AAAA,KACjB;AACA,IAAA,IAAA,CAAK,gBAAgB,MAAA,CAAO,aAAA;AAC5B,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,GAAA;AACjC,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA;AAChB;AAAA;AAAA;AAAA,EAKA,MAAM,SAAA,GAAiC;AACrC,IAAA,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,EAAC,EAAG,iCAAiC,CAAA;AAGtD,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,iBAAA,EAAkB;AAGhD,IAAA,MAAM,MAAA,GAAqB;AAAA,MACzB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,iBAAiB,UAAA,CAAW,eAAA;AAAA,MAC5B,UAAU,UAAA,CAAW,QAAA;AAAA,MACrB,WAAW,UAAA,CAAW,SAAA;AAAA,MACtB,sBAAsB,IAAA,CAAK;AAAA,KAC7B;AAEA,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,IAAA,CAAK,aAAA,CAAc,eAAe,MAAM,CAAA;AAAA,KAC1C,MAAO;AAEL,MAAA,IAAA,CAAK,gBAAgB,MAAM,CAAA;AAAA;AAI7B,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,YAAA,CAAa,UAAU,CAAA;AAEhD,MAAA,MAAM,MAAA,GAAqB;AAAA,QACzB,OAAA,EAAS,IAAA;AAAA,QACT,UAAU,IAAA,CAAK;AAAA,OACjB;AAEA,MAAA,IAAI,KAAK,aAAA,EAAe;AACtB,QAAA,IAAA,CAAK,aAAA,CAAc,eAAe,MAAM,CAAA;AAAA;AAG1C,MAAA,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,EAAC,EAAG,gCAAgC,CAAA;AACrD,MAAA,OAAO,KAAA;AAAA,aACA,KAAA,EAAO;AACd,MAAA,MAAM,MAAA,GAAqB;AAAA,QACzB,OAAA,EAAS,KAAA;AAAA,QACT,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,OAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,OAC9D;AAEA,MAAA,IAAI,KAAK,aAAA,EAAe;AACtB,QAAA,IAAA,CAAK,aAAA,CAAc,eAAe,MAAM,CAAA;AAAA;AAG1C,MAAA,MAAM,KAAA;AAAA;AACR;AACF;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAA,GAAiD;AACrD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,mBAAA,CAAoB,IAAA,CAAK,WAAW,CAAA;AAEvD,IAAA,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,EAAE,KAAA,IAAS,wBAAwB,CAAA;AAErD,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,sBAAA,EAAwB;AAAA,MACnD,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,MAAA,EAAQ,kBAAA;AAAA,QACR,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,WAAW,IAAA,CAAK,QAAA;AAAA,QAChB;AAAA,OACD;AAAA,KACF,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,SAAS,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA;AAG7E,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAElC,IAAA,OAAO;AAAA,MACL,YAAY,IAAA,CAAK,WAAA;AAAA,MACjB,UAAU,IAAA,CAAK,SAAA;AAAA,MACf,iBAAiB,IAAA,CAAK,gBAAA;AAAA,MACtB,yBAAyB,IAAA,CAAK,yBAAA;AAAA,MAC9B,WAAW,IAAA,CAAK,UAAA;AAAA,MAChB,QAAA,EAAU,KAAK,QAAA,IAAY;AAAA,KAC7B;AAAA;AACF;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,UAAA,EAAqD;AACtE,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,IAAI,QAAA,GAAW,WAAW,QAAA,GAAW,GAAA;AACrC,IAAA,MAAM,SAAA,GAAY,SAAA,GAAY,UAAA,CAAW,SAAA,GAAY,GAAA;AAErD,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,EAAW;AAE7B,MAAA,IAAI,KAAK,GAAA,EAAI,GAAI,SAAA,GAAY,IAAA,CAAK,UAAU,GAAA,EAAM;AAChD,QAAA,MAAM,IAAI,MAAM,sBAAsB,CAAA;AAAA;AAIxC,MAAA,MAAM,IAAA,CAAK,MAAM,QAAQ,CAAA;AAGzB,MAAA,MAAM,mBAAmB,IAAA,CAAK,IAAA,CAAA,CAAM,YAAY,IAAA,CAAK,GAAA,MAAS,GAAI,CAAA;AAClE,MAAA,IAAI,IAAA,CAAK,eAAe,aAAA,EAAe;AACrC,QAAA,IAAA,CAAK,aAAA,CAAc,cAAc,gBAAgB,CAAA;AAAA;AAGnD,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,kBAAA,CAAmB,WAAW,UAAU,CAAA;AACjE,QAAA,OAAO,KAAA;AAAA,eACA,KAAA,EAAO;AACd,QAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,UAAA,QAAQ,MAAM,IAAA;AAAM,YAClB,KAAK,2BAAA;AAEH,cAAA,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,EAAC,EAAG,2CAA2C,CAAA;AACjE,cAAA;AAAA,YAEF,KAAK,eAAA;AAEH,cAAA,QAAA,IAAY,GAAA;AACZ,cAAA,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,EAAE,QAAA,IAAY,sBAAsB,CAAA;AACtD,cAAA;AAAA,YAEF,KAAK,mBAAA;AACH,cAAA,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAAA,YAE1D,KAAK,mBAAA;AACH,cAAA,MAAM,IAAI,MAAM,2BAA2B,CAAA;AAAA,YAE7C;AACE,cAAA,MAAM,KAAA;AAAA;AACV;AAEF,QAAA,MAAM,KAAA;AAAA;AACR;AAGF,IAAA,MAAM,IAAI,MAAM,qBAAqB,CAAA;AAAA;AACvC;AAAA;AAAA;AAAA,EAKA,MAAc,mBAAmB,UAAA,EAAyC;AACxE,IAAA,MAAM,IAAA,GAA+B;AAAA,MACnC,WAAW,IAAA,CAAK,QAAA;AAAA,MAChB,WAAA,EAAa,UAAA;AAAA,MACb,UAAA,EAAY;AAAA,KACd;AAEA,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,IAAA,CAAK,gBAAgB,IAAA,CAAK,YAAA;AAAA;AAG5B,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,gBAAA,EAAkB;AAAA,MAC7C,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,MAAA,EAAQ,kBAAA;AAAA,QACR,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC1B,CAAA;AAED,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAGlC,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,eAAA,CAAgB,IAAA,CAAK,KAAA,EAAO,KAAK,iBAAiB,CAAA;AAAA;AAI9D,IAAA,MAAM,MAAA,GAAA,CAAU,KAAK,KAAA,IAAS,EAAA,EAAI,MAAM,QAAQ,CAAA,CAAE,OAAO,OAAO,CAAA;AAEhE,IAAA,OAAO;AAAA,MACL,aAAa,IAAA,CAAK,YAAA;AAAA,MAClB,SAAA,EAAW,KAAK,UAAA,IAAc,QAAA;AAAA,MAC9B,MAAA;AAAA,MACA,SAAA,EAAW,IAAA,CAAK,UAAA,GACZ,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,UAAA,GAAa,GAAI,CAAA,GAC5C,MAAA;AAAA,MACJ,cAAc,IAAA,CAAK,aAAA;AAAA,MACnB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,SAAA,sBAAe,IAAA;AAAK,KACtB;AAAA;AACF;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,iBAAA,EAAgD;AACjE,IAAA,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,EAAC,EAAG,wBAAwB,CAAA;AAE7C,IAAA,MAAM,IAAA,GAA+B;AAAA,MACnC,WAAW,IAAA,CAAK,QAAA;AAAA,MAChB,UAAA,EAAY,eAAA;AAAA,MACZ,aAAA,EAAe;AAAA,KACjB;AAEA,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,IAAA,CAAK,gBAAgB,IAAA,CAAK,YAAA;AAAA;AAG5B,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,gBAAA,EAAkB;AAAA,MAC7C,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS;AAAA,QACP,MAAA,EAAQ,kBAAA;AAAA,QACR,cAAA,EAAgB;AAAA,OAClB;AAAA,MACA,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC1B,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,SAAS,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA;AAGvE,IAAA,MAAM,IAAA,GAAQ,MAAM,QAAA,CAAS,IAAA,EAAK;AAElC,IAAA,IAAI,KAAK,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,KAAK,iBAAA,IAAqB,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA;AAAA;AAGjF,IAAA,MAAM,MAAA,GAAA,CAAU,KAAK,KAAA,IAAS,EAAA,EAAI,MAAM,QAAQ,CAAA,CAAE,OAAO,OAAO,CAAA;AAEhE,IAAA,OAAO;AAAA,MACL,aAAa,IAAA,CAAK,YAAA;AAAA,MAClB,SAAA,EAAW,KAAK,UAAA,IAAc,QAAA;AAAA,MAC9B,MAAA;AAAA,MACA,SAAA,EAAW,IAAA,CAAK,UAAA,GACZ,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,UAAA,GAAa,GAAI,CAAA,GAC5C,MAAA;AAAA,MACJ,YAAA,EAAc,KAAK,aAAA,IAAiB,iBAAA;AAAA,MACpC,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,SAAA,sBAAe,IAAA;AAAK,KACtB;AAAA;AACF;AAAA;AAAA;AAAA,EAKQ,oBAAoB,WAAA,EAAuC;AACjE,IAAA,MAAM,SAAmB,EAAC;AAG1B,IAAA,IAAI,WAAA,CAAY,aAAa,OAAA,EAAS;AACpC,MAAA,MAAA,CAAO,KAAK,MAAM,CAAA;AAAA,KACpB,MAAA,IAAW,WAAA,CAAY,QAAA,KAAa,MAAA,EAAQ;AAC1C,MAAA,MAAA,CAAO,KAAK,aAAa,CAAA;AAAA;AAK3B,IAAA,IAAI,YAAY,YAAA,KAAiB,MAAA,IAAU,CAAC,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,EAAG;AACnE,MAAA,MAAA,CAAO,KAAK,aAAa,CAAA;AAAA;AAI3B,IAAA,MAAA,CAAO,KAAK,WAAW,CAAA;AAOvB,IAAA,OAAO,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA;AACxB;AAAA;AAAA;AAAA,EAKQ,gBAAgB,MAAA,EAA0B;AAChD,IAAA,OAAA,CAAQ,IAAI,gTAAsD,CAAA;AAClE,IAAA,OAAA,CAAQ,IAAI,8DAAoD,CAAA;AAChE,IAAA,OAAA,CAAQ,IAAI,8SAAoD,CAAA;AAChE,IAAA,OAAA,CAAQ,IAAI,CAAA,kBAAA,EAAgB,MAAA,CAAO,gBAAgB,MAAA,CAAO,EAAE,CAAC,CAAA,MAAA,CAAG,CAAA;AAChE,IAAA,OAAA,CAAQ,IAAI,CAAA,uBAAA,EAAqB,MAAA,CAAO,SAAS,MAAA,CAAO,EAAE,CAAC,CAAA,MAAA,CAAG,CAAA;AAC9D,IAAA,OAAA,CAAQ,IAAI,8SAAoD,CAAA;AAChE,IAAA,OAAA,CAAQ,IAAI,CAAA,gEAAA,CAAmD,CAAA;AAC/D,IAAA,OAAA,CAAQ,GAAA,CAAI,2BAAsB,MAAA,CAAO,SAAS,WAAW,GAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA,MAAA,CAAG,CAAA;AAC9E,IAAA,OAAA,CAAQ,IAAI,gTAAsD,CAAA;AAAA;AACpE,EAEQ,MAAM,EAAA,EAA2B;AACvC,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA;AACzD,EAEQ,GAAA,CACN,KAAA,EACA,IAAA,EACA,OAAA,EACM;AACN,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,CAAE,IAAA,EAAM,OAAO,CAAA;AAAA;AAClC;AAEJ;AAKA,IAAM,eAAA,GAAN,cAA8B,KAAA,CAAM;AAAA,EAClC,WAAA,CACkB,MACA,WAAA,EAChB;AACA,IAAA,KAAA,CAAM,eAAe,IAAI,CAAA;AAHT,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAGhB,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AAAA;AAEhB,CAAA;AC3ZO,IAAe,aAAf,MAA0B;AAAA;AAAA;AAAA;AAAA,EAwB/B,UAAU,KAAA,EAA4B;AACpC,IAAA,IAAI,CAAC,MAAM,SAAA,EAAW;AACpB,MAAA,OAAO,KAAA;AAAA;AAGT,IAAA,MAAM,MAAA,GAAS,IAAI,EAAA,GAAK,GAAA;AACxB,IAAA,OAAO,KAAK,GAAA,EAAI,GAAI,KAAA,CAAM,SAAA,CAAU,SAAQ,GAAI,MAAA;AAAA;AAClD;AAAA;AAAA;AAAA,EAKA,aAAa,KAAA,EAA4B;AACvC,IAAA,IAAI,CAAC,MAAM,SAAA,EAAW;AACpB,MAAA,OAAO,KAAA;AAAA;AAGT,IAAA,MAAM,MAAA,GAAS,KAAK,EAAA,GAAK,GAAA;AACzB,IAAA,OAAO,KAAK,GAAA,EAAI,GAAI,KAAA,CAAM,SAAA,CAAU,SAAQ,GAAI,MAAA;AAAA;AAEpD;AAKO,IAAM,gBAAA,GAAN,cAA+B,UAAA,CAAW;AAAA,EACvC,MAAA,uBAA2C,GAAA,EAAI;AAAA,EAEvD,MAAM,IAAA,CAAK,QAAA,EAAuB,KAAA,EAAkC;AAClE,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,QAAA,EAAU,KAAK,CAAA;AAAA;AACjC,EAEA,MAAM,IAAI,QAAA,EAAmD;AAC3D,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA,IAAK,IAAA;AAAA;AACtC,EAEA,MAAM,MAAM,QAAA,EAAuC;AACjD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,MAAA,CAAO,OAAO,QAAQ,CAAA;AAAA,KAC7B,MAAO;AACL,MAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAAA;AACpB;AACF,EAEA,MAAM,IAAA,GAA+B;AACnC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AAAA;AAExC;AAKO,IAAM,cAAA,GAAN,cAA6B,UAAA,CAAW;AAAA,EAC5B,SAAA;AAAA,EACA,aAAA;AAAA,EAEjB,WAAA,CAAY,OAAA,GAA6B,EAAC,EAAG;AAC3C,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,YAAY,OAAA,CAAQ,SAAA,IAAkBG,qBAAQC,aAAA,CAAA,OAAA,EAAQ,EAAG,aAAa,QAAQ,CAAA;AAEnF,IAAA,IAAI,QAAQ,aAAA,EAAe;AAEzB,MAAA,IAAA,CAAK,aAAA,GACFC,6BAAW,QAAQ,CAAA,CACnB,OAAO,OAAA,CAAQ,aAAa,EAC5B,MAAA,EAAO;AAAA;AACZ;AACF,EAEA,MAAM,IAAA,CAAK,QAAA,EAAuB,KAAA,EAAkC;AAClE,IAAA,MAAM,KAAK,eAAA,EAAgB;AAE3B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,YAAA,CAAa,QAAQ,CAAA;AAG3C,IAAA,MAAM,UAAA,GAAa,KAAK,SAAA,CAAU;AAAA,MAChC,GAAG,KAAA;AAAA,MACH,SAAA,EAAW,KAAA,CAAM,SAAA,EAAW,WAAA,EAAY;AAAA,MACxC,SAAA,EAAW,KAAA,CAAM,SAAA,CAAU,WAAA;AAAY,KACxC,CAAA;AAGD,IAAA,MAAM,OAAO,IAAA,CAAK,aAAA,GACd,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA,GACvB,UAAA;AAEJ,IAAA,MAASC,cAAA,CAAA,SAAA,CAAU,QAAA,EAAU,IAAA,EAAM,OAAO,CAAA;AAAA;AAC5C,EAEA,MAAM,IAAI,QAAA,EAAmD;AAC3D,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,YAAA,CAAa,QAAQ,CAAA;AAE3C,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAASA,cAAA,CAAA,QAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AAGhD,MAAA,MAAM,aAAa,IAAA,CAAK,aAAA,GACpB,IAAA,CAAK,OAAA,CAAQ,IAAI,CAAA,GACjB,IAAA;AAEJ,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAGpC,MAAA,OAAO;AAAA,QACL,GAAG,MAAA;AAAA,QACH,WAAW,MAAA,CAAO,SAAA,GAAY,IAAI,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,GAAI,KAAA,CAAA;AAAA,QAC3D,SAAA,EAAW,IAAI,IAAA,CAAK,MAAA,CAAO,SAAS;AAAA,OACtC;AAAA,aACO,KAAA,EAAO;AACd,MAAA,IAAK,KAAA,CAAgC,SAAS,QAAA,EAAU;AACtD,QAAA,OAAO,IAAA;AAAA;AAET,MAAA,MAAM,KAAA;AAAA;AACR;AACF,EAEA,MAAM,MAAM,QAAA,EAAuC;AACjD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,YAAA,CAAa,QAAQ,CAAA;AAC3C,MAAA,IAAI;AACF,QAAA,MAASA,sBAAO,QAAQ,CAAA;AAAA,eACjB,KAAA,EAAO;AACd,QAAA,IAAK,KAAA,CAAgC,SAAS,QAAA,EAAU;AACtD,UAAA,MAAM,KAAA;AAAA;AACR;AACF,KACF,MAAO;AAEL,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,MAASA,cAAA,CAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA;AAC7C,QAAA,MAAM,OAAA,CAAQ,GAAA;AAAA,UACZ,MACG,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,CAAS,QAAQ,CAAC,CAAA,CAClC,GAAA,CAAI,CAAC,MAASA,cAAA,CAAA,MAAA,CAAYH,eAAA,CAAA,IAAA,CAAK,KAAK,SAAA,EAAW,CAAC,CAAC,CAAC;AAAA,SACvD;AAAA,eACO,KAAA,EAAO;AACd,QAAA,IAAK,KAAA,CAAgC,SAAS,QAAA,EAAU;AACtD,UAAA,MAAM,KAAA;AAAA;AACR;AACF;AACF;AACF,EAEA,MAAM,IAAA,GAA+B;AACnC,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,MAASG,cAAA,CAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA;AAC7C,MAAA,OAAO,MACJ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,QAAQ,CAAC,CAAA,CAClC,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAgB,CAAA;AAAA,KACtD,CAAA,MAAQ;AACN,MAAA,OAAO,EAAC;AAAA;AACV;AACF,EAEQ,aAAa,QAAA,EAA+B;AAClD,IAAA,OAAYH,eAAA,CAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,CAAA,EAAG,QAAQ,CAAA,MAAA,CAAQ,CAAA;AAAA;AACtD,EAEA,MAAc,eAAA,GAAiC;AAC7C,IAAA,MAASG,cAAA,CAAA,KAAA,CAAM,KAAK,SAAA,EAAW,EAAE,WAAW,IAAA,EAAM,IAAA,EAAM,KAAO,CAAA;AAAA;AACjE,EAEQ,QAAQ,IAAA,EAAsB;AACpC,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,MAAM,EAAA,GAAYD,8BAAY,EAAE,CAAA;AAChC,IAAA,MAAM,MAAA,GAAgBA,iBAAA,CAAA,cAAA,CAAe,aAAA,EAAe,IAAA,CAAK,eAAe,EAAE,CAAA;AAC1E,IAAA,IAAI,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,IAAA,EAAM,QAAQ,KAAK,CAAA;AACjD,IAAA,SAAA,IAAa,MAAA,CAAO,MAAM,KAAK,CAAA;AAG/B,IAAA,OAAO,EAAA,CAAG,QAAA,CAAS,KAAK,CAAA,GAAI,GAAA,GAAM,SAAA;AAAA;AACpC,EAEQ,QAAQ,IAAA,EAAsB;AACpC,IAAA,IAAI,CAAC,KAAK,aAAA,EAAe;AACvB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,MAAM,CAAC,KAAA,EAAO,SAAS,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AACzC,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA;AACnC,IAAA,MAAM,QAAA,GAAkBA,iBAAA,CAAA,gBAAA,CAAiB,aAAA,EAAe,IAAA,CAAK,eAAe,EAAE,CAAA;AAC9E,IAAA,IAAI,SAAA,GAAY,QAAA,CAAS,MAAA,CAAO,SAAA,EAAW,OAAO,MAAM,CAAA;AACxD,IAAA,SAAA,IAAa,QAAA,CAAS,MAAM,MAAM,CAAA;AAElC,IAAA,OAAO,SAAA;AAAA;AAEX;;;AC/IO,IAAM,oBAAN,MAAwB;AAAA,EACrB,MAAA,uBAA2C,GAAA,EAAI;AAAA,EACtC,UAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,MAAA;AAAA,EAEjB,WAAA,CAAY,OAAA,GAAoC,EAAC,EAAG;AAClD,IAAA,IAAA,CAAK,UAAA,GAAa,QAAQ,iBAAA,IAAqB,IAAA;AAC/C,IAAA,IAAA,CAAK,MAAA,GAAS,QAAQ,aAAA,IAAiB,IAAA;AACvC,IAAA,IAAA,CAAK,SAAA,GAAY,OAAA,CAAQ,SAAA,oBAAa,IAAI,GAAA,EAAI;AAC9C,IAAA,IAAA,CAAK,aAAa,OAAA,CAAQ,UAAA;AAC1B,IAAA,IAAA,CAAK,UAAA,GAAa,OAAA,CAAQ,UAAA,IAAc,IAAI,gBAAA,EAAiB;AAC7D,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,KAAA;AAC3B,IAAA,IAAA,CAAK,SAAS,OAAA,CAAQ,MAAA;AAAA;AACxB;AAAA;AAAA;AAAA,EAKA,aAAA,GAA4B;AAC1B,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA;AACd;AAAA;AAAA;AAAA,EAKA,iBAAiB,QAAA,EAAoC;AACnD,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAA,CAAS,IAAA,EAAM,QAAQ,CAAA;AAC1C,IAAA,IAAA,CAAK,IAAI,MAAA,EAAQ,EAAE,UAAU,QAAA,CAAS,IAAA,IAAQ,qBAAqB,CAAA;AAAA;AACrE;AAAA;AAAA;AAAA,EAKA,YAAY,IAAA,EAAmD;AAC7D,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA;AAAA;AAChC;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,eAAe,OAAA,EAA8D;AACjF,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,IAAI,CAAA;AAEjD,IAAA,IAAA,CAAK,GAAA;AAAA,MACH,MAAA;AAAA,MACA;AAAA,QACE,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,QAAA;AAAA,QACA,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,WAAA,EAAa,QAAQ,OAAA,CAAQ;AAAA,OAC/B;AAAA,MACA;AAAA,KACF;AAGA,IAAA,MAAM,aAAa,IAAA,CAAK,GAAA;AAAA,MACtB,OAAA,CAAQ,cAAc,IAAA,CAAK,UAAA;AAAA,MAC3B,IAAA,CAAK;AAAA,KACP;AAGA,IAAA,IAAI,UAAA,GAAmC,IAAA;AAGvC,IAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,MAAA,UAAA,GAAa,IAAA,CAAK,4BAAA,CAA6B,OAAA,EAAS,UAAA,EAAY,QAAQ,CAAA;AAC5E,MAAA,IAAA,CAAK,GAAA;AAAA,QACH,MAAA;AAAA,QACA,EAAE,IAAA,EAAM,OAAA,CAAQ,MAAM,IAAA,EAAM,OAAA,CAAQ,aAAa,IAAA,EAAK;AAAA,QACtD;AAAA,OACF;AAAA;AAIF,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,UAAA,GAAa,MAAM,IAAA,CAAK,wBAAA,CAAyB,QAAA,EAAU,SAAS,UAAU,CAAA;AAAA;AAIhF,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,QAAQ,CAAA;AACnD,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,IAAI;AACF,UAAA,UAAA,GAAa,MAAM,eAAA,CAAgB,cAAA,CAAe,OAAO,CAAA;AAAA,iBAClD,KAAA,EAAO;AACd,UAAA,IAAA,CAAK,GAAA;AAAA,YACH,MAAA;AAAA,YACA,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,UAAU,KAAA,EAAM;AAAA,YACtC;AAAA,WACF;AAAA;AACF;AACF;AAIF,IAAA,IAAI,CAAC,UAAA,IAAc,IAAA,CAAK,WAAA,EAAa;AACnC,MAAA,UAAA,GAAa,MAAM,IAAA,CAAK,+BAAA,CAAgC,QAAA,EAAU,SAAS,UAAU,CAAA;AAAA;AAGvF,IAAA,IAAI,CAAC,UAAA,EAAY;AAEf,MAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,QAAA,IAAA,CAAK,GAAA;AAAA,UACH,MAAA;AAAA,UACA,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAK;AAAA,UACrB;AAAA,SACF;AACA,QAAA,OAAO,IAAA;AAAA;AAGT,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,4CAA4C,OAAA,CAAQ,IAAI,CAAA,EAAA,CAAA,IACrD,IAAA,CAAK,cACF,4CAAA,GACA,uDAAA;AAAA,OACR;AAAA;AAIF,IAAA,MAAM,KAAA,GAAyB;AAAA,MAC7B,IAAI,UAAA,CAAW,EAAA;AAAA,MACf,MAAM,UAAA,CAAW,IAAA;AAAA,MACjB,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,QAAA;AAAA,MACA,SAAA,EAAW;AAAA,QACT,WAAA,EAAa,QAAQ,OAAA,CAAQ,WAAA;AAAA,QAC7B,MAAA,EAAQ,QAAQ,OAAA,CAAQ,MAAA;AAAA,QACxB,OAAA,EAAS,QAAQ,OAAA,CAAQ;AAAA,OAC3B;AAAA,MACA,aAAa,UAAA,CAAW,WAAA;AAAA,MACxB,SAAA,sBAAe,IAAA,EAAK;AAAA,MACpB,WAAW,UAAA,CAAW;AAAA,KACxB;AAGA,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,KAAK,CAAA;AAG/B,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,WAAW,MAAA,CAAO;AAAA,UAC3B,GAAG,KAAA;AAAA,UACH,MAAA,EAAQ,QAAQ,OAAA,CAAQ;AAAA,SACzB,CAAA;AAAA,eACM,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,GAAA;AAAA,UACH,MAAA;AAAA,UACA,EAAE,OAAA,EAAS,KAAA,CAAM,EAAA,EAAI,KAAA,EAAM;AAAA,UAC3B;AAAA,SACF;AAAA;AACF;AAGF,IAAA,IAAA,CAAK,GAAA;AAAA,MACH,MAAA;AAAA,MACA;AAAA,QACE,SAAS,KAAA,CAAM,EAAA;AAAA,QACf,MAAM,OAAA,CAAQ,IAAA;AAAA,QACd,WAAW,UAAA,CAAW,SAAA;AAAA,QACtB,SAAA,EAAW,CAAC,CAAC,IAAA,CAAK;AAAA,OACpB;AAAA,MACA;AAAA,KACF;AAEA,IAAA,OAAO,UAAA;AAAA;AACT;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,OAAA,EAAgC;AACrD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACrC,IAAA,IAAI,CAAC,KAAA,EAAO;AAEV,MAAA,IAAI,KAAK,UAAA,EAAY;AACnB,QAAA,IAAI;AACF,UAAA,MAAM,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,OAAO,CAAA;AAAA,iBAC7B,KAAA,EAAO;AACd,UAAA,IAAA,CAAK,IAAI,MAAA,EAAQ,EAAE,OAAA,EAAS,KAAA,IAAS,sCAAsC,CAAA;AAAA;AAC7E;AAEF,MAAA;AAAA;AAGF,IAAA,KAAA,CAAM,SAAA,uBAAgB,IAAA,EAAK;AAC3B,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,KAAK,CAAA;AAG9B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,MAAM,QAAQ,CAAA;AAClD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAI;AACF,QAAA,MAAM,QAAA,CAAS,iBAAiB,OAAO,CAAA;AAAA,eAChC,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,IAAI,MAAA,EAAQ,EAAE,OAAA,EAAS,KAAA,IAAS,0CAA0C,CAAA;AAAA;AACjF;AAIF,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,OAAO,CAAA;AAAA,eAC7B,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,IAAI,MAAA,EAAQ,EAAE,OAAA,EAAS,KAAA,IAAS,sCAAsC,CAAA;AAAA;AAC7E;AAGF,IAAA,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,EAAE,OAAA,IAAW,oBAAoB,CAAA;AAAA;AACpD;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAmB,WAAA,EAAsC;AAC7D,IAAA,IAAI,KAAA,GAAQ,CAAA;AAGZ,IAAA,KAAA,MAAW,CAAC,EAAA,EAAI,KAAK,CAAA,IAAK,KAAK,MAAA,EAAQ;AACrC,MAAA,IAAI,MAAM,SAAA,CAAU,WAAA,KAAgB,WAAA,IAAe,CAAC,MAAM,SAAA,EAAW;AACnE,QAAA,KAAA,CAAM,SAAA,uBAAgB,IAAA,EAAK;AAC3B,QAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,EAAA,EAAI,KAAK,CAAA;AACzB,QAAA,KAAA,EAAA;AAAA;AACF;AAIF,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,UAAA,CAAW,mBAAmB,WAAW,CAAA;AAEvE,QAAA,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,UAAU,CAAA;AAAA,eAC3B,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,IAAI,MAAA,EAAQ,EAAE,WAAA,EAAa,KAAA,IAAS,uCAAuC,CAAA;AAAA;AAClF;AAGF,IAAA,IAAA,CAAK,IAAI,MAAA,EAAQ,EAAE,aAAa,YAAA,EAAc,KAAA,IAAS,mCAAmC,CAAA;AAC1F,IAAA,OAAO,KAAA;AAAA;AACT;AAAA;AAAA;AAAA,EAKA,QAAQ,OAAA,EAA0B;AAChC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AACrC,IAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,IAAA,IAAI,KAAA,CAAM,WAAW,OAAO,KAAA;AAC5B,IAAA,oBAAI,IAAI,IAAA,EAAK,GAAI,KAAA,CAAM,WAAW,OAAO,KAAA;AACzC,IAAA,OAAO,IAAA;AAAA;AACT;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS,OAAA,EAAkD;AAE/D,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AAC3C,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAO,WAAA;AAAA;AAIT,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,IAAA,CAAK,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA;AAAA,eACtC,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,IAAI,MAAA,EAAQ,EAAE,OAAA,EAAS,KAAA,IAAS,gCAAgC,CAAA;AAAA;AACvE;AAGF,IAAA,OAAO,IAAA;AAAA;AACT;AAAA;AAAA;AAAA,EAKA,MAAM,sBAAsB,WAAA,EAAiD;AAE3E,IAAA,IAAI,KAAK,UAAA,EAAY;AACnB,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,IAAA,CAAK,UAAA,CAAW,iBAAA,CAAkB,WAAW,CAAA;AAAA,eACnD,KAAA,EAAO;AACd,QAAA,IAAA,CAAK,IAAI,MAAA,EAAQ,EAAE,WAAA,EAAa,KAAA,IAAS,iCAAiC,CAAA;AAAA;AAC5E;AAIF,IAAA,OAAO,MAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ,CAAA,CAAE,MAAA;AAAA,MACtC,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,CAAU,WAAA,KAAgB;AAAA,KACrC;AAAA;AACF;AAAA;AAAA;AAAA,EAMQ,eAAe,IAAA,EAA2B;AAChD,IAAA,MAAM,SAAA,GAAY,KAAK,WAAA,EAAY;AAEnC,IAAA,IAAI,UAAU,QAAA,CAAS,YAAY,KAAK,SAAA,CAAU,UAAA,CAAW,SAAS,CAAA,EAAG;AACvE,MAAA,OAAO,QAAA;AAAA;AAET,IAAA,IAAI,UAAU,QAAA,CAAS,YAAY,KAAK,SAAA,CAAU,UAAA,CAAW,SAAS,CAAA,EAAG;AACvE,MAAA,OAAO,QAAA;AAAA;AAET,IAAA,IAAI,UAAU,QAAA,CAAS,eAAe,KAAK,SAAA,CAAU,UAAA,CAAW,YAAY,CAAA,EAAG;AAC7E,MAAA,OAAO,WAAA;AAAA;AAET,IAAA,IAAI,UAAU,QAAA,CAAS,eAAe,KAAK,SAAA,CAAU,QAAA,CAAS,kBAAkB,CAAA,EAAG;AACjF,MAAA,OAAO,cAAA;AAAA;AAGT,IAAA,OAAO,aAAA;AAAA;AACT;AAAA;AAAA;AAAA,EAKQ,4BAAA,CACN,OAAA,EACA,UAAA,EACA,QAAA,EACe;AACf,IAAA,MAAM,YAAY,OAAA,CAAQ,YAAA;AAC1B,IAAA,MAAM,YAAY,IAAI,IAAA,CAAK,KAAK,GAAA,EAAI,GAAI,aAAa,GAAI,CAAA;AAGzD,IAAA,IAAI,cAAA;AACJ,IAAA,IAAI,KAAA;AAEJ,IAAA,IAAI,SAAA,CAAU,SAAS,KAAA,EAAO;AAE5B,MAAA,cAAA,GAAiB,SAAA;AACjB,MAAA,KAAA,GAAQ,EAAA;AAAA,KACV,MAAO;AACL,MAAA,cAAA,GAAiB,SAAA,CAAU,IAAA,KAAS,KAAA,GAAQ,KAAA,GAAQ,OAAA;AACpD,MAAA,KAAA,GAAQ,SAAA,CAAU,KAAA;AAAA;AAKpB,IAAA,MAAM,WAAA,GACJ,OAAA,CAAQ,MAAA,KAAW,OAAA,GACf,CAAC,iBAAiB,gBAAA,EAAkB,qBAAqB,CAAA,GACzD,CAAC,eAAe,CAAA;AAEtB,IAAA,OAAO;AAAA,MACL,IAAIJ,iBAAAA,EAAW;AAAA,MACf,IAAA,EAAM,cAAA;AAAA,MACN,KAAA;AAAA,MACA,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,WAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA,EAAU,UAAU,QAAA,IAAY;AAAA,KAClC;AAAA;AACF;AAAA;AAAA;AAAA,EAKA,MAAc,wBAAA,CACZ,QAAA,EACA,OAAA,EACA,UAAA,EAC+B;AAC/B,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,MAAM,IAAA,CAAK,UAAA,CAAW,IAAI,QAAQ,CAAA;AAEtD,MAAA,IAAI,CAAC,WAAA,EAAa;AAChB,QAAA,OAAO,IAAA;AAAA;AAIT,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,WAAW,CAAA,EAAG;AAE1C,QAAA,IAAI,WAAA,CAAY,YAAA,IAAgB,IAAA,CAAK,WAAA,EAAa;AAChD,UAAA,MAAM,iBAAiB,MAAM,IAAA,CAAK,iBAAA,CAAkB,QAAA,EAAU,YAAY,YAAY,CAAA;AACtF,UAAA,IAAI,cAAA,EAAgB;AAClB,YAAA,OAAO,IAAA,CAAK,qBAAA,CAAsB,cAAA,EAAgB,OAAA,EAAS,UAAU,CAAA;AAAA;AACvE;AAGF,QAAA,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,EAAE,QAAA,IAAY,4BAA4B,CAAA;AAC3D,QAAA,OAAO,IAAA;AAAA;AAIT,MAAA,IAAI,IAAA,CAAK,WAAW,YAAA,CAAa,WAAW,KAAK,WAAA,CAAY,YAAA,IAAgB,KAAK,WAAA,EAAa;AAC7F,QAAA,MAAM,iBAAiB,MAAM,IAAA,CAAK,iBAAA,CAAkB,QAAA,EAAU,YAAY,YAAY,CAAA;AACtF,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,OAAO,IAAA,CAAK,qBAAA,CAAsB,cAAA,EAAgB,OAAA,EAAS,UAAU,CAAA;AAAA;AACvE;AAIF,MAAA,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,EAAE,QAAA,IAAY,0BAA0B,CAAA;AACzD,MAAA,OAAO,IAAA,CAAK,qBAAA,CAAsB,WAAA,EAAa,OAAA,EAAS,UAAU,CAAA;AAAA,aAC3D,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,IAAI,MAAA,EAAQ,EAAE,QAAA,EAAU,KAAA,IAAS,kCAAkC,CAAA;AACxE,MAAA,OAAO,IAAA;AAAA;AACT;AACF;AAAA;AAAA;AAAA,EAKA,MAAc,+BAAA,CACZ,QAAA,EACA,OAAA,EACA,UAAA,EAC+B;AAC/B,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,OAAO,IAAA;AAAA;AAIT,IAAA,IAAI,aAAa,QAAA,EAAU;AACzB,MAAA,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,EAAE,QAAA,IAAY,6CAA6C,CAAA;AAC5E,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,IAAA,CAAK,IAAI,MAAA,EAAQ,EAAE,MAAM,OAAA,CAAQ,IAAA,IAAQ,+CAA+C,CAAA;AAExF,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,IAAI,eAAA,CAAgB;AAAA,QACrC,QAAA,EAAU,KAAK,WAAA,CAAY,QAAA;AAAA,QAC3B,YAAA,EAAc,KAAK,WAAA,CAAY,YAAA;AAAA,QAC/B,QAAA;AAAA,QACA,WAAA,EAAa,KAAK,WAAA,CAAY,WAAA;AAAA,QAC9B,aAAA,EAAe,KAAK,WAAA,CAAY;AAAA,OACjC,CAAA;AAED,MAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,CAAW,SAAA,EAAU;AAGzC,MAAA,MAAM,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,QAAA,EAAU,KAAK,CAAA;AAE1C,MAAA,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,EAAE,QAAA,IAAY,0CAA0C,CAAA;AACzE,MAAA,OAAO,IAAA,CAAK,qBAAA,CAAsB,KAAA,EAAO,OAAA,EAAS,UAAU,CAAA;AAAA,aACrD,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,IAAI,OAAA,EAAS,EAAE,QAAA,EAAU,KAAA,IAAS,0BAA0B,CAAA;AACjE,MAAA,OAAO,IAAA;AAAA;AACT;AACF;AAAA;AAAA;AAAA,EAKA,MAAc,iBAAA,CACZ,QAAA,EACA,YAAA,EAC4B;AAC5B,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,IAAI,eAAA,CAAgB;AAAA,QACrC,QAAA,EAAU,KAAK,WAAA,CAAY,QAAA;AAAA,QAC3B,YAAA,EAAc,KAAK,WAAA,CAAY,YAAA;AAAA,QAC/B,QAAA;AAAA,QACA,WAAA,EAAa,KAAK,WAAA,CAAY;AAAA,OAC/B,CAAA;AAED,MAAA,MAAM,QAAA,GAAW,MAAM,UAAA,CAAW,YAAA,CAAa,YAAY,CAAA;AAG3D,MAAA,MAAM,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,QAAA,EAAU,QAAQ,CAAA;AAE7C,MAAA,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,EAAE,QAAA,IAAY,oCAAoC,CAAA;AACnE,MAAA,OAAO,QAAA;AAAA,aACA,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,IAAI,MAAA,EAAQ,EAAE,QAAA,EAAU,KAAA,IAAS,+BAA+B,CAAA;AACrE,MAAA,OAAO,IAAA;AAAA;AACT;AACF;AAAA;AAAA;AAAA,EAKQ,qBAAA,CACN,KAAA,EACA,OAAA,EACA,UAAA,EACe;AACf,IAAA,MAAM,YAAY,IAAI,IAAA,CAAK,KAAK,GAAA,EAAI,GAAI,aAAa,GAAI,CAAA;AAGzD,IAAA,MAAM,cAAwB,EAAC;AAC/B,IAAA,IAAI,MAAM,WAAA,CAAY,QAAA,KAAa,UAAU,KAAA,CAAM,WAAA,CAAY,aAAa,OAAA,EAAS;AACnF,MAAA,WAAA,CAAY,KAAK,eAAe,CAAA;AAAA;AAElC,IAAA,IAAI,KAAA,CAAM,WAAA,CAAY,QAAA,KAAa,OAAA,EAAS;AAC1C,MAAA,WAAA,CAAY,KAAK,gBAAgB,CAAA;AAAA;AAEnC,IAAA,IAAI,MAAM,WAAA,CAAY,YAAA,KAAiB,UAAU,KAAA,CAAM,WAAA,CAAY,iBAAiB,OAAA,EAAS;AAC3F,MAAA,WAAA,CAAY,KAAK,oBAAoB,CAAA;AAAA;AAEvC,IAAA,IAAI,KAAA,CAAM,WAAA,CAAY,YAAA,KAAiB,OAAA,EAAS;AAC9C,MAAA,WAAA,CAAY,KAAK,qBAAqB,CAAA;AAAA;AAExC,IAAA,IAAI,MAAM,WAAA,CAAY,MAAA,KAAW,UAAU,KAAA,CAAM,WAAA,CAAY,WAAW,OAAA,EAAS;AAC/E,MAAA,WAAA,CAAY,KAAK,aAAa,CAAA;AAAA;AAEhC,IAAA,IAAI,KAAA,CAAM,WAAA,CAAY,MAAA,KAAW,OAAA,EAAS;AACxC,MAAA,WAAA,CAAY,KAAK,cAAc,CAAA;AAAA;AAGjC,IAAA,OAAO;AAAA,MACL,IAAIA,iBAAAA,EAAW;AAAA,MACf,IAAA,EAAM,OAAA;AAAA,MACN,OAAO,KAAA,CAAM,WAAA;AAAA,MACb,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,WAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAU,KAAA,CAAM;AAAA,KAClB;AAAA;AACF,EAEQ,GAAA,CACN,KAAA,EACA,IAAA,EACA,OAAA,EACM;AACN,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,CAAE,IAAA,EAAM,OAAO,CAAA;AAAA;AAClC;AAEJ;ACrmBA,IAAI,YAAA,GAA4D,IAAA;AAGhE,SAAS,WAAA,GAAoD;AAC3D,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,IAAI;AAEF,MAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,SAAA,CAAQ,eAAe,CAAA;AAE3C,MAAA,MAAM,EAAE,aAAA,EAAc,GAAI,SAAA,CAAQ,mBAAmB,CAAA;AACrD,MAAA,YAAA,GAAe,EAAE,SAAS,aAAA,EAAc;AAAA,KAC1C,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OAEF;AAAA;AACF;AAEF,EAAA,OAAO,YAAA;AACT;AA+BO,IAAM,iBAAN,MAAmD;AAAA,EAUxD,WAAA,CACmB,QACA,MAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA;AAChB,EAZM,IAAA,GAAO,QAAA;AAAA;AAAA,EAGR,UAAA;AAAA,EACA,aAAA,uBAAwD,GAAA,EAAI;AAAA;AAAA,EAE5D,oBAAA,uBAA6C,GAAA,EAAI;AAAA,EACjD,WAAA,GAAc,KAAA;AAAA;AAAA;AAAA;AAAA,EAUtB,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA;AAAA;AAGF,IAAA,MAAM,EAAE,OAAA,EAAS,aAAA,EAAc,GAAI,WAAA,EAAY;AAE/C,IAAA,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,EAAC,EAAG,8BAA8B,CAAA;AAGnD,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,OAAA,CAAQ;AAAA,MAC5B,YAAA,EAAc,aAAA;AAAA,MACd,IAAA,EAAM;AAAA,QACJ,KAAA,EAAO,KAAK,MAAA,CAAO,KAAA;AAAA,QACnB,UAAA,EAAY,KAAK,MAAA,CAAO;AAAA,OAC1B;AAAA,MACA,OAAA,EAAS,KAAK,MAAA,CAAO;AAAA,KACtB,CAAA;AAED,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,MAAM,aAAA,EAAc,GAAI,MAAM,IAAA,CAAK,UAAA,CAAW,KAAK,iBAAA,EAAkB;AAE7E,MAAA,KAAA,MAAW,gBAAgB,aAAA,EAAe;AACxC,QAAA,MAAM,IAAA,CAAK,oBAAA,CAAqB,YAAA,CAAa,EAAE,CAAA;AAAA;AAGjD,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,MAAA,IAAA,CAAK,GAAA;AAAA,QACH,MAAA;AAAA,QACA,EAAE,iBAAA,EAAmB,aAAA,CAAc,MAAA,EAAO;AAAA,QAC1C;AAAA,OACF;AAAA,aACO,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,EAAE,KAAA,IAAS,sCAAsC,CAAA;AACnE,MAAA,MAAM,KAAA;AAAA;AACR;AACF;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAqB,cAAA,EAAwD;AACjF,IAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,MAAA,MAAM,KAAK,UAAA,EAAW;AAAA;AAGxB,IAAA,IAAI;AAEF,MAAA,MAAM,EAAE,MAAM,YAAA,EAAa,GAAI,MAAM,IAAA,CAAK,UAAA,CAAW,KAAK,eAAA,CAAgB;AAAA,QACxE,eAAA,EAAiB;AAAA,OAClB,CAAA;AAGD,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,sBAAA,CAAuB,cAAc,CAAA;AAChE,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,KAAU,MAAM,OAAA,CAAQ,KAAK,iCAAA,CAAkC;AAAA,QAC3E,QAAA,EAAU;AAAA,OACX,CAAA;AAGD,MAAA,MAAM,UAAU,YAAA,CAAa,OAAA;AAK7B,MAAA,MAAM,YAAA,GAAe,OAAA,EAAS,KAAA,IAAS,OAAA,EAAS,IAAA,IAAQ,SAAA;AACxD,MAAA,MAAM,WAAA,GAAc,OAAA,EAAS,IAAA,KAAS,cAAA,GAAiB,cAAA,GAAiB,MAAA;AAExE,MAAA,MAAM,eAAA,GAAyC;AAAA,QAC7C,cAAA;AAAA,QACA,YAAA;AAAA,QACA,WAAA;AAAA,QACA,YAAA,EAAc,MAAM,YAAA,EAAc,GAAA,CAAI,CAAC,CAAA,KAA6B,CAAA,CAAE,SAAS,CAAA,IAAK,EAAC;AAAA,QACrF,aAAa,YAAA,CAAa;AAAA,OAC5B;AAEA,MAAA,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,eAAA,CAAgB,YAAA,EAAc,eAAe,CAAA;AAEpE,MAAA,IAAA,CAAK,GAAA;AAAA,QACH,MAAA;AAAA,QACA;AAAA,UACE,cAAA;AAAA,UACA,SAAS,eAAA,CAAgB,YAAA;AAAA,UACzB,SAAA,EAAW,gBAAgB,YAAA,CAAa;AAAA,SAC1C;AAAA,QACA;AAAA,OACF;AAEA,MAAA,OAAO,eAAA;AAAA,aACA,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,IAAI,OAAA,EAAS,EAAE,cAAA,EAAgB,KAAA,IAAS,iCAAiC,CAAA;AAC9E,MAAA,MAAM,KAAA;AAAA;AACR;AACF;AAAA;AAAA;AAAA,EAKA,sBAAA,CAAuB,OAAe,IAAA,EAA4C;AAEhF,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,aAAA,CAAc,GAAA,CAAI,KAAK,CAAA;AACjD,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAO,IAAA;AAAA;AAIT,IAAA,MAAM,QAAA,GAAW,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AACjC,IAAA,IAAI,CAAC,YAAA,CAAa,YAAA,CAAa,QAAA,CAAS,QAAQ,CAAA,EAAG;AACjD,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,OAAO,YAAA;AAAA;AACT;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,OAAA,EAAuD;AAE1E,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA;AAC5C,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAAA;AAG9D,IAAA,OAAO,IAAA,CAAK,qBAAA;AAAA,MACV,QAAA,CAAS,KAAA;AAAA,MACT,QAAA,CAAS,IAAA;AAAA,MACT,OAAA,CAAQ,MAAA;AAAA,MACR,OAAA,CAAQ;AAAA,KACV;AAAA;AACF;AAAA;AAAA;AAAA,EAKA,MAAM,qBAAA,CACJ,KAAA,EACA,IAAA,EACA,MAAA,EACA,aAAqB,IAAA,EACG;AACxB,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,KAAK,UAAA,EAAW;AAAA;AAGxB,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,sBAAA,CAAuB,KAAA,EAAO,IAAI,CAAA;AAC5D,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwC,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA;AAGzE,IAAA,MAAM,EAAE,aAAA,EAAc,GAAI,WAAA,EAAY;AAGtC,IAAA,MAAM,OAAO,aAAA,CAAc;AAAA,MACzB,KAAA,EAAO,KAAK,MAAA,CAAO,KAAA;AAAA,MACnB,UAAA,EAAY,KAAK,MAAA,CAAO;AAAA,KACzB,CAAA;AAED,IAAA,MAAM,EAAE,KAAA,EAAO,SAAA,EAAU,GAAI,MAAM,IAAA,CAAK;AAAA,MACtC,IAAA,EAAM,cAAA;AAAA,MACN,gBAAgB,YAAA,CAAa,cAAA;AAAA,MAC7B,eAAA,EAAiB,CAAC,IAAI,CAAA;AAAA,MACtB,WAAA,EACE,MAAA,KAAW,OAAA,GACP,EAAE,UAAU,OAAA,EAAS,aAAA,EAAe,OAAA,EAAS,QAAA,EAAU,QAAO,GAC9D,EAAE,QAAA,EAAU,MAAA,EAAQ,UAAU,MAAA;AAAO,KAC5C,CAAA;AAED,IAAA,OAAO;AAAA,MACL,IAAIA,iBAAAA,EAAW;AAAA,MACf,IAAA,EAAM,YAAA;AAAA,MACN,KAAA;AAAA,MACA,IAAA,EAAM,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,MACtB,WAAA,EACE,MAAA,KAAW,OAAA,GACP,CAAC,gBAAA,EAAkB,uBAAuB,eAAe,CAAA,GACzD,CAAC,eAAA,EAAiB,eAAe,CAAA;AAAA,MACvC,SAAA,EAAW,SAAA,GAAY,IAAI,IAAA,CAAK,SAAS,CAAA,GAAI,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,EAAI,GAAI,UAAA,GAAa,GAAI,CAAA;AAAA,MACpF,QAAA,EAAU;AAAA,KACZ;AAAA;AACF;AAAA;AAAA;AAAA,EAKA,MAAM,iBAAiB,aAAA,EAAsC;AAAA;AAE7D;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAkB,OAAA,EAUK;AAC3B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,IAAI,CAAA;AAC5C,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAAA;AAG9D,IAAA,OAAO,IAAA,CAAK,wBAAA,CAAyB,QAAA,CAAS,KAAA,EAAO,SAAS,IAAA,EAAM;AAAA,MAClE,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,MAAM,OAAA,CAAQ,YAAA;AAAA,MACd,MAAM,OAAA,CAAQ,YAAA;AAAA,MACd,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,WAAW,OAAA,CAAQ;AAAA,KACpB,CAAA;AAAA;AACH;AAAA;AAAA;AAAA,EAKA,MAAM,wBAAA,CACJ,KAAA,EACA,IAAA,EACA,OAAA,EAS0B;AAC1B,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,KAAK,UAAA,EAAW;AAAA;AAGxB,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,sBAAA,CAAuB,KAAA,EAAO,IAAI,CAAA;AAC5D,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwC,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA;AAGzE,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,sBAAA,CAAuB,aAAa,cAAc,CAAA;AAE7E,IAAA,MAAM,EAAE,IAAA,EAAM,EAAA,KAAO,MAAM,OAAA,CAAQ,MAAM,MAAA,CAAO;AAAA,MAC9C,KAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,OAAO,OAAA,CAAQ;AAAA,KAChB,CAAA;AAGD,IAAA,IAAI,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,EAAG;AAC/C,MAAA,MAAM,OAAA,CAAQ,OAAO,SAAA,CAAU;AAAA,QAC7B,KAAA;AAAA,QACA,IAAA;AAAA,QACA,cAAc,EAAA,CAAG,MAAA;AAAA,QACjB,QAAQ,OAAA,CAAQ;AAAA,OACjB,CAAA;AAAA;AAIH,IAAA,IAAI,OAAA,CAAQ,SAAA,IAAa,OAAA,CAAQ,SAAA,CAAU,SAAS,CAAA,EAAG;AACrD,MAAA,MAAM,OAAA,CAAQ,MAAM,gBAAA,CAAiB;AAAA,QACnC,KAAA;AAAA,QACA,IAAA;AAAA,QACA,aAAa,EAAA,CAAG,MAAA;AAAA,QAChB,WAAW,OAAA,CAAQ;AAAA,OACpB,CAAA;AAAA;AAGH,IAAA,IAAA,CAAK,GAAA;AAAA,MACH,MAAA;AAAA,MACA,EAAE,OAAO,IAAA,EAAM,QAAA,EAAU,GAAG,MAAA,EAAQ,KAAA,EAAO,QAAQ,KAAA,EAAM;AAAA,MACzD;AAAA,KACF;AAEA,IAAA,OAAO;AAAA,MACL,QAAQ,EAAA,CAAG,MAAA;AAAA,MACX,KAAK,EAAA,CAAG,QAAA;AAAA,MACR,OAAO,EAAA,CAAG,KAAA;AAAA,MACV,cAAc,OAAA,CAAQ,IAAA;AAAA,MACtB,cAAc,OAAA,CAAQ,IAAA;AAAA,MACtB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,WAAA,EAAa,EAAA;AAAA;AAAA,MACb,SAAA,EAAW,IAAI,IAAA,CAAK,EAAA,CAAG,UAAU;AAAA,KACnC;AAAA;AACF;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CACJ,IAAA,EACA,MAAA,EACA,WAAA,EACkB;AAClB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AACpC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAO,KAAA;AAAA;AAGT,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,KAAK,UAAA,EAAW;AAAA;AAGxB,IAAA,MAAM,eAAe,IAAA,CAAK,sBAAA,CAAuB,QAAA,CAAS,KAAA,EAAO,SAAS,IAAI,CAAA;AAC9E,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAO,KAAA;AAAA;AAGT,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,sBAAA,CAAuB,aAAa,cAAc,CAAA;AAE7E,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,CAAQ,MAAM,SAAA,CAAU;AAAA,QAC5B,OAAO,QAAA,CAAS,KAAA;AAAA,QAChB,MAAM,QAAA,CAAS,IAAA;AAAA,QACf;AAAA,OACD,CAAA;AACD,MAAA,OAAO,IAAA;AAAA,KACT,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA;AACT;AACF;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAA,CAAiB,IAAA,EAAc,WAAA,EAA6C;AAChF,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AACpC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,IAAI,CAAA,CAAE,CAAA;AAAA;AAGtD,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,KAAK,UAAA,EAAW;AAAA;AAGxB,IAAA,MAAM,eAAe,IAAA,CAAK,sBAAA,CAAuB,QAAA,CAAS,KAAA,EAAO,SAAS,IAAI,CAAA;AAC9E,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwC,IAAI,CAAA,CAAE,CAAA;AAAA;AAGhE,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,sBAAA,CAAuB,aAAa,cAAc,CAAA;AAE7E,IAAA,MAAM,EAAE,IAAA,EAAM,QAAA,KAAa,MAAM,OAAA,CAAQ,MAAM,GAAA,CAAI;AAAA,MACjD,OAAO,QAAA,CAAS,KAAA;AAAA,MAChB,MAAM,QAAA,CAAS;AAAA,KAChB,CAAA;AAED,IAAA,OAAO,QAAA,CAAS,cAAA;AAAA;AAClB;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,CACJ,KAAA,EACA,IAAA,EACA,QAAA,EAC0B;AAC1B,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,KAAK,UAAA,EAAW;AAAA;AAGxB,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,sBAAA,CAAuB,KAAA,EAAO,IAAI,CAAA;AAC5D,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwC,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA;AAGzE,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,sBAAA,CAAuB,aAAa,cAAc,CAAA;AAE7E,IAAA,MAAM,EAAE,IAAA,EAAM,EAAA,KAAO,MAAM,OAAA,CAAQ,MAAM,GAAA,CAAI;AAAA,MAC3C,KAAA;AAAA,MACA,IAAA;AAAA,MACA,WAAA,EAAa;AAAA,KACd,CAAA;AAED,IAAA,OAAO;AAAA,MACL,QAAQ,EAAA,CAAG,MAAA;AAAA,MACX,KAAK,EAAA,CAAG,QAAA;AAAA,MACR,KAAA,EAAO,EAAA,CAAG,MAAA,GAAS,QAAA,GAAY,EAAA,CAAG,KAAA;AAAA,MAClC,YAAA,EAAc,GAAG,IAAA,CAAK,GAAA;AAAA,MACtB,YAAA,EAAc,GAAG,IAAA,CAAK,GAAA;AAAA,MACtB,OAAO,EAAA,CAAG,KAAA;AAAA,MACV,WAAA,EAAa,EAAA;AAAA;AAAA,MACb,SAAA,EAAW,IAAI,IAAA,CAAK,EAAA,CAAG,UAAU,CAAA;AAAA,MACjC,UAAU,EAAA,CAAG,SAAA,GAAY,IAAI,IAAA,CAAK,EAAA,CAAG,SAAS,CAAA,GAAI;AAAA,KACpD;AAAA;AACF;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CAAa,KAAA,EAAe,IAAA,EAAc,MAAA,EAA+B;AAC7E,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,KAAK,UAAA,EAAW;AAAA;AAGxB,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,sBAAA,CAAuB,KAAA,EAAO,IAAI,CAAA;AAC5D,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwC,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA;AAGzE,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,sBAAA,CAAuB,aAAa,cAAc,CAAA;AAE7E,IAAA,MAAM,OAAA,CAAQ,IAAI,SAAA,CAAU;AAAA,MAC1B,KAAA;AAAA,MACA,IAAA;AAAA,MACA,GAAA,EAAK,SAAS,MAAM,CAAA;AAAA,KACrB,CAAA;AAED,IAAA,IAAA,CAAK,IAAI,MAAA,EAAQ,EAAE,OAAO,IAAA,EAAM,MAAA,IAAU,gBAAgB,CAAA;AAAA;AAC5D;AAAA;AAAA;AAAA,EAKA,MAAM,mBAAA,CACJ,KAAA,EACA,IAAA,EACA,SAAS,WAAA,EACU;AACnB,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,KAAK,UAAA,EAAW;AAAA;AAGxB,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,sBAAA,CAAuB,KAAA,EAAO,IAAI,CAAA;AAC5D,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwC,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA;AAGzE,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,sBAAA,CAAuB,aAAa,cAAc,CAAA;AAE7E,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,IAAI,IAAA,GAAO,CAAA;AAEX,IAAA,OAAO,IAAA,EAAM;AACX,MAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,OAAA,CAAQ,MAAM,YAAA,CAAa;AAAA,QAChD,KAAA;AAAA,QACA,IAAA;AAAA,QACA,QAAA,EAAU,GAAA;AAAA,QACV;AAAA,OACD,CAAA;AAED,MAAA,IAAI,IAAA,CAAK,WAAW,CAAA,EAAG;AAEvB,MAAA,KAAA,MAAW,UAAU,IAAA,EAAM;AACzB,QAAA,IAAI,MAAA,CAAO,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,EAAG;AAClC,UAAA,QAAA,CAAS,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA;AAC3B;AAGF,MAAA,IAAA,EAAA;AAAA;AAGF,IAAA,OAAO,QAAA;AAAA;AACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,WAAA,CACJ,KAAA,EACA,IAAA,EACA,OAAA,EACoB;AACpB,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,KAAK,UAAA,EAAW;AAAA;AAGxB,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,sBAAA,CAAuB,KAAA,EAAO,IAAI,CAAA;AAC5D,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwC,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA;AAGzE,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,sBAAA,CAAuB,aAAa,cAAc,CAAA;AAE7E,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,KAAU,MAAM,OAAA,CAAQ,OAAO,MAAA,CAAO;AAAA,MAClD,KAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,WAAW,OAAA,CAAQ;AAAA,KACpB,CAAA;AAED,IAAA,IAAA,CAAK,GAAA;AAAA,MACH,MAAA;AAAA,MACA,EAAE,OAAO,IAAA,EAAM,WAAA,EAAa,MAAM,MAAA,EAAQ,KAAA,EAAO,QAAQ,KAAA,EAAM;AAAA,MAC/D;AAAA,KACF;AAEA,IAAA,OAAO;AAAA,MACL,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,KAAK,KAAA,CAAM,QAAA;AAAA,MACX,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,IAAA,EAAM,MAAM,IAAA,IAAQ,EAAA;AAAA,MACpB,MAAA,EAAQ,MAAM,MAAA,CAAO,GAAA;AAAA,QAAI,CAAC,CAAA,KACxB,OAAO,MAAM,QAAA,GAAW,CAAA,GAAI,EAAE,IAAA,IAAQ;AAAA,OACxC;AAAA,MACA,SAAA,EAAW,MAAM,SAAA,EAAW,GAAA,CAAI,CAAC,CAAA,KAAyB,CAAA,CAAE,KAAK,CAAA,IAAK,EAAC;AAAA,MACvE,SAAA,EAAW,IAAI,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAAA,MACpC,UAAU,KAAA,CAAM,SAAA,GAAY,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,GAAI;AAAA,KAC1D;AAAA;AACF;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CAAS,KAAA,EAAe,IAAA,EAAc,WAAA,EAAyC;AACnF,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,KAAK,UAAA,EAAW;AAAA;AAGxB,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,sBAAA,CAAuB,KAAA,EAAO,IAAI,CAAA;AAC5D,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwC,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA;AAGzE,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,sBAAA,CAAuB,aAAa,cAAc,CAAA;AAE7E,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,KAAU,MAAM,OAAA,CAAQ,OAAO,GAAA,CAAI;AAAA,MAC/C,KAAA;AAAA,MACA,IAAA;AAAA,MACA,YAAA,EAAc;AAAA,KACf,CAAA;AAED,IAAA,OAAO;AAAA,MACL,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,KAAK,KAAA,CAAM,QAAA;AAAA,MACX,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,IAAA,EAAM,MAAM,IAAA,IAAQ,EAAA;AAAA,MACpB,MAAA,EAAQ,MAAM,MAAA,CAAO,GAAA;AAAA,QAAI,CAAC,CAAA,KACxB,OAAO,MAAM,QAAA,GAAW,CAAA,GAAI,EAAE,IAAA,IAAQ;AAAA,OACxC;AAAA,MACA,SAAA,EAAW,MAAM,SAAA,EAAW,GAAA,CAAI,CAAC,CAAA,KAAyB,CAAA,CAAE,KAAK,CAAA,IAAK,EAAC;AAAA,MACvE,SAAA,EAAW,IAAI,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAAA,MACpC,UAAU,KAAA,CAAM,SAAA,GAAY,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,GAAI;AAAA,KAC1D;AAAA;AACF;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CACJ,KAAA,EACA,IAAA,EACA,OAAA,EAMsB;AACtB,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,KAAK,UAAA,EAAW;AAAA;AAGxB,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,sBAAA,CAAuB,KAAA,EAAO,IAAI,CAAA;AAC5D,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwC,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA;AAGzE,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,sBAAA,CAAuB,aAAa,cAAc,CAAA;AAE7E,IAAA,MAAM,EAAE,IAAA,EAAM,MAAA,KAAW,MAAM,OAAA,CAAQ,OAAO,WAAA,CAAY;AAAA,MACxD,KAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA,EAAO,SAAS,KAAA,IAAS,MAAA;AAAA,MACzB,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,IAAA,CAAK,GAAG,CAAA;AAAA,MACjC,UAAU,OAAA,EAAS,QAAA;AAAA,MACnB,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,WAAA,EAAY;AAAA,MACnC,QAAA,EAAU;AAAA,KACX,CAAA;AAGD,IAAA,OAAO,MAAA,CACJ,MAAA,CAAO,CAAC,KAAA,KAAsC,CAAC,MAAM,YAAY,CAAA,CACjE,GAAA,CAAI,CAAC,KAAA,MAUC;AAAA,MACL,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,KAAK,KAAA,CAAM,QAAA;AAAA,MACX,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,IAAA,EAAM,MAAM,IAAA,IAAQ,EAAA;AAAA,MACpB,MAAA,EAAQ,MAAM,MAAA,CAAO,GAAA;AAAA,QAAI,CAAC,CAAA,KACxB,OAAO,MAAM,QAAA,GAAW,CAAA,GAAI,EAAE,IAAA,IAAQ;AAAA,OACxC;AAAA,MACA,SAAA,EAAW,MAAM,SAAA,EAAW,GAAA,CAAI,CAAC,CAAA,KAAyB,CAAA,CAAE,KAAK,CAAA,IAAK,EAAC;AAAA,MACvE,SAAA,EAAW,IAAI,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAAA,MACpC,UAAU,KAAA,CAAM,SAAA,GAAY,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,GAAI;AAAA,KAC1D,CAAE,CAAA;AAAA;AACN;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CACJ,KAAA,EACA,IAAA,EACA,aACA,OAAA,EAOoB;AACpB,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,KAAK,UAAA,EAAW;AAAA;AAGxB,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,sBAAA,CAAuB,KAAA,EAAO,IAAI,CAAA;AAC5D,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwC,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA;AAGzE,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,sBAAA,CAAuB,aAAa,cAAc,CAAA;AAE7E,IAAA,MAAM,EAAE,IAAA,EAAM,KAAA,KAAU,MAAM,OAAA,CAAQ,OAAO,MAAA,CAAO;AAAA,MAClD,KAAA;AAAA,MACA,IAAA;AAAA,MACA,YAAA,EAAc,WAAA;AAAA,MACd,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,WAAW,OAAA,CAAQ;AAAA,KACpB,CAAA;AAED,IAAA,IAAA,CAAK,GAAA;AAAA,MACH,MAAA;AAAA,MACA,EAAE,OAAO,IAAA,EAAM,WAAA,EAAa,SAAS,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,EAAE;AAAA,MAC1D;AAAA,KACF;AAEA,IAAA,OAAO;AAAA,MACL,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,KAAK,KAAA,CAAM,QAAA;AAAA,MACX,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,IAAA,EAAM,MAAM,IAAA,IAAQ,EAAA;AAAA,MACpB,MAAA,EAAQ,MAAM,MAAA,CAAO,GAAA;AAAA,QAAI,CAAC,CAAA,KACxB,OAAO,MAAM,QAAA,GAAW,CAAA,GAAI,EAAE,IAAA,IAAQ;AAAA,OACxC;AAAA,MACA,SAAA,EAAW,MAAM,SAAA,EAAW,GAAA,CAAI,CAAC,CAAA,KAAyB,CAAA,CAAE,KAAK,CAAA,IAAK,EAAC;AAAA,MACvE,SAAA,EAAW,IAAI,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAAA,MACpC,UAAU,KAAA,CAAM,SAAA,GAAY,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,GAAI;AAAA,KAC1D;AAAA;AACF;AAAA;AAAA;AAAA,EAKA,MAAM,SAAA,CACJ,KAAA,EACA,IAAA,EACA,aACA,MAAA,EACe;AACf,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,KAAK,UAAA,EAAW;AAAA;AAGxB,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,sBAAA,CAAuB,KAAA,EAAO,IAAI,CAAA;AAC5D,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwC,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA;AAGzE,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,sBAAA,CAAuB,aAAa,cAAc,CAAA;AAE7E,IAAA,MAAM,OAAA,CAAQ,OAAO,SAAA,CAAU;AAAA,MAC7B,KAAA;AAAA,MACA,IAAA;AAAA,MACA,YAAA,EAAc,WAAA;AAAA,MACd;AAAA,KACD,CAAA;AAED,IAAA,IAAA,CAAK,GAAA,CAAI,QAAQ,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,MAAA,IAAU,uBAAuB,CAAA;AAAA;AAChF;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CACJ,KAAA,EACA,IAAA,EACA,aACA,KAAA,EACe;AACf,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,KAAK,UAAA,EAAW;AAAA;AAGxB,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,sBAAA,CAAuB,KAAA,EAAO,IAAI,CAAA;AAC5D,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwC,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA;AAGzE,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,sBAAA,CAAuB,aAAa,cAAc,CAAA;AAE7E,IAAA,MAAM,OAAA,CAAQ,OAAO,WAAA,CAAY;AAAA,MAC/B,KAAA;AAAA,MACA,IAAA;AAAA,MACA,YAAA,EAAc,WAAA;AAAA,MACd,IAAA,EAAM;AAAA,KACP,CAAA;AAED,IAAA,IAAA,CAAK,GAAA,CAAI,QAAQ,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,KAAA,IAAS,0BAA0B,CAAA;AAAA;AAClF;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CACJ,KAAA,EACA,IAAA,EACA,aACA,OAAA,EACuB;AACvB,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,KAAK,UAAA,EAAW;AAAA;AAGxB,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,sBAAA,CAAuB,KAAA,EAAO,IAAI,CAAA;AAC5D,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwC,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA;AAGzE,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,sBAAA,CAAuB,aAAa,cAAc,CAAA;AAE7E,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,KAAY,MAAM,OAAA,CAAQ,OAAO,aAAA,CAAc;AAAA,MAC3D,KAAA;AAAA,MACA,IAAA;AAAA,MACA,YAAA,EAAc,WAAA;AAAA,MACd,MAAM,OAAA,CAAQ;AAAA,KACf,CAAA;AAED,IAAA,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,EAAE,KAAA,EAAO,IAAA,EAAM,aAAa,SAAA,EAAW,OAAA,CAAQ,EAAA,EAAG,EAAG,wBAAwB,CAAA;AAE9F,IAAA,OAAO;AAAA,MACL,IAAI,OAAA,CAAQ,EAAA;AAAA,MACZ,KAAK,OAAA,CAAQ,QAAA;AAAA,MACb,IAAA,EAAM,QAAQ,IAAA,IAAQ,EAAA;AAAA,MACtB,MAAA,EAAQ,OAAA,CAAQ,IAAA,EAAM,KAAA,IAAS,SAAA;AAAA,MAC/B,SAAA,EAAW,IAAI,IAAA,CAAK,OAAA,CAAQ,UAAU;AAAA,KACxC;AAAA;AACF;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CACJ,KAAA,EACA,IAAA,EACA,WAAA,EACyB;AACzB,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,KAAK,UAAA,EAAW;AAAA;AAGxB,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,sBAAA,CAAuB,KAAA,EAAO,IAAI,CAAA;AAC5D,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qCAAA,EAAwC,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA;AAGzE,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,sBAAA,CAAuB,aAAa,cAAc,CAAA;AAE7E,IAAA,MAAM,EAAE,IAAA,EAAM,QAAA,KAAa,MAAM,OAAA,CAAQ,OAAO,YAAA,CAAa;AAAA,MAC3D,KAAA;AAAA,MACA,IAAA;AAAA,MACA,YAAA,EAAc,WAAA;AAAA,MACd,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,MAMd;AAAA,MACL,IAAI,OAAA,CAAQ,EAAA;AAAA,MACZ,KAAK,OAAA,CAAQ,QAAA;AAAA,MACb,IAAA,EAAM,QAAQ,IAAA,IAAQ,EAAA;AAAA,MACtB,MAAA,EAAQ,OAAA,CAAQ,IAAA,EAAM,KAAA,IAAS,SAAA;AAAA,MAC/B,SAAA,EAAW,IAAI,IAAA,CAAK,OAAA,CAAQ,UAAU;AAAA,KACxC,CAAE,CAAA;AAAA;AACJ;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CAAW,KAAA,EAAe,IAAA,EAAc,WAAA,EAAyC;AACrF,IAAA,OAAO,IAAA,CAAK,YAAY,KAAA,EAAO,IAAA,EAAM,aAAa,EAAE,KAAA,EAAO,UAAU,CAAA;AAAA;AACvE;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CAAY,KAAA,EAAe,IAAA,EAAc,WAAA,EAAyC;AACtF,IAAA,OAAO,IAAA,CAAK,YAAY,KAAA,EAAO,IAAA,EAAM,aAAa,EAAE,KAAA,EAAO,QAAQ,CAAA;AAAA;AACrE;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,uBAAuB,cAAA,EAAsC;AACzE,IAAA,IAAI,CAAC,IAAA,CAAK,oBAAA,CAAqB,GAAA,CAAI,cAAc,CAAA,EAAG;AAClD,MAAA,MAAM,EAAE,OAAA,EAAS,aAAA,EAAc,GAAI,WAAA,EAAY;AAE/C,MAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ;AAAA,QAC1B,YAAA,EAAc,aAAA;AAAA,QACd,IAAA,EAAM;AAAA,UACJ,KAAA,EAAO,KAAK,MAAA,CAAO,KAAA;AAAA,UACnB,UAAA,EAAY,KAAK,MAAA,CAAO,UAAA;AAAA,UACxB;AAAA,SACF;AAAA,QACA,OAAA,EAAS,KAAK,MAAA,CAAO;AAAA,OACtB,CAAA;AAED,MAAA,IAAA,CAAK,oBAAA,CAAqB,GAAA,CAAI,cAAA,EAAgB,OAAO,CAAA;AAAA;AAGvD,IAAA,OAAO,IAAA,CAAK,oBAAA,CAAqB,GAAA,CAAI,cAAc,CAAA;AAAA;AACrD,EAEQ,UAAU,IAAA,EAAsD;AACtE,IAAA,MAAM,QAAA,GAAW;AAAA,MACf,kCAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAChC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,OAAO,EAAE,KAAA,EAAO,KAAA,CAAM,CAAC,CAAA,EAAG,IAAA,EAAM,KAAA,CAAM,CAAC,CAAA,CAAE,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA,EAAE;AAAA;AACjE;AAGF,IAAA,OAAO,IAAA;AAAA;AACT,EAEQ,GAAA,CACN,KAAA,EACA,IAAA,EACA,OAAA,EACM;AACN,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,CAAE,IAAA,EAAM,OAAO,CAAA;AAAA;AAClC;AAEJ;;;ACr7BA,IAAI,YAAA,GAAoB,IAAA;AAGxB,SAASM,YAAAA,GAAmB;AAC1B,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,IAAI;AAEF,MAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,SAAA,CAAQ,eAAe,CAAA;AAC3C,MAAA,YAAA,GAAe,OAAA;AAAA,KACjB,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OAEF;AAAA;AACF;AAEF,EAAA,OAAO,YAAA;AACT;AAwBO,IAAM,kBAAN,MAAsB;AAAA;AAAA,EAEnB,OAAA;AAAA,EACS,MAAA;AAAA,EAEjB,WAAA,CAAY,SAAiC,MAAA,EAAgC;AAC3E,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,MAAM,UAAUA,YAAAA,EAAY;AAC5B,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,OAAA,CAAQ;AAAA,MACzB,MAAM,OAAA,CAAQ,KAAA;AAAA,MACd,SAAS,OAAA,CAAQ;AAAA,KAClB,CAAA;AAAA;AACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,iBAAA,CACJ,KAAA,EACA,IAAA,EACA,OAAA,EAS0B;AAC1B,IAAA,MAAM,EAAE,MAAM,EAAA,EAAG,GAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,MAAA,CAAO;AAAA,MACnD,KAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,OAAO,OAAA,CAAQ;AAAA,KAChB,CAAA;AAGD,IAAA,IAAI,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,EAAG;AAC/C,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAU;AAAA,QAClC,KAAA;AAAA,QACA,IAAA;AAAA,QACA,cAAc,EAAA,CAAG,MAAA;AAAA,QACjB,QAAQ,OAAA,CAAQ;AAAA,OACjB,CAAA;AAAA;AAIH,IAAA,IAAI,OAAA,CAAQ,SAAA,IAAa,OAAA,CAAQ,SAAA,CAAU,SAAS,CAAA,EAAG;AACrD,MAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,gBAAA,CAAiB;AAAA,QACxC,KAAA;AAAA,QACA,IAAA;AAAA,QACA,aAAa,EAAA,CAAG,MAAA;AAAA,QAChB,WAAW,OAAA,CAAQ;AAAA,OACpB,CAAA;AAAA;AAGH,IAAA,IAAA,CAAK,GAAA,CAAI,QAAQ,EAAE,KAAA,EAAO,MAAM,QAAA,EAAU,EAAA,CAAG,MAAA,EAAO,EAAG,sBAAsB,CAAA;AAE7E,IAAA,OAAO;AAAA,MACL,QAAQ,EAAA,CAAG,MAAA;AAAA,MACX,KAAK,EAAA,CAAG,QAAA;AAAA,MACR,OAAO,EAAA,CAAG,KAAA;AAAA,MACV,cAAc,OAAA,CAAQ,IAAA;AAAA,MACtB,cAAc,OAAA,CAAQ,IAAA;AAAA,MACtB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,WAAA,EAAa,EAAA;AAAA,MACb,SAAA,EAAW,IAAI,IAAA,CAAK,EAAA,CAAG,UAAU;AAAA,KACnC;AAAA;AACF;AAAA;AAAA;AAAA,EAKA,MAAM,cAAA,CAAe,KAAA,EAAe,IAAA,EAAc,QAAA,EAA4C;AAC5F,IAAA,MAAM,EAAE,MAAM,EAAA,EAAG,GAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAM,GAAA,CAAI;AAAA,MAChD,KAAA;AAAA,MACA,IAAA;AAAA,MACA,WAAA,EAAa;AAAA,KACd,CAAA;AAED,IAAA,OAAO;AAAA,MACL,QAAQ,EAAA,CAAG,MAAA;AAAA,MACX,KAAK,EAAA,CAAG,QAAA;AAAA,MACR,KAAA,EAAO,EAAA,CAAG,MAAA,GAAS,QAAA,GAAY,EAAA,CAAG,KAAA;AAAA,MAClC,YAAA,EAAc,GAAG,IAAA,CAAK,GAAA;AAAA,MACtB,YAAA,EAAc,GAAG,IAAA,CAAK,GAAA;AAAA,MACtB,OAAO,EAAA,CAAG,KAAA;AAAA,MACV,WAAA,EAAa,EAAA;AAAA,MACb,SAAA,EAAW,IAAI,IAAA,CAAK,EAAA,CAAG,UAAU,CAAA;AAAA,MACjC,UAAU,EAAA,CAAG,SAAA,GAAY,IAAI,IAAA,CAAK,EAAA,CAAG,SAAS,CAAA,GAAI;AAAA,KACpD;AAAA;AACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,WAAA,CACJ,KAAA,EACA,IAAA,EACA,OAAA,EACoB;AACpB,IAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,MAAA,CAAO;AAAA,MACvD,KAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,WAAW,OAAA,CAAQ;AAAA,KACpB,CAAA;AAED,IAAA,IAAA,CAAK,GAAA,CAAI,QAAQ,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,KAAA,CAAM,MAAA,EAAO,EAAG,eAAe,CAAA;AAE5E,IAAA,OAAO,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA;AAC5B;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CAAS,KAAA,EAAe,IAAA,EAAc,WAAA,EAAyC;AACnF,IAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAA,CAAI;AAAA,MACpD,KAAA;AAAA,MACA,IAAA;AAAA,MACA,YAAA,EAAc;AAAA,KACf,CAAA;AAED,IAAA,OAAO,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA;AAC5B;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CACJ,KAAA,EACA,IAAA,EACA,OAAA,EAKsB;AACtB,IAAA,MAAM,EAAE,MAAM,MAAA,EAAO,GAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,WAAA,CAAY;AAAA,MAC7D,KAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAA,EAAO,SAAS,KAAA,IAAS,MAAA;AAAA,MACzB,MAAA,EAAQ,OAAA,EAAS,MAAA,EAAQ,IAAA,CAAK,GAAG,CAAA;AAAA,MACjC,UAAU,OAAA,EAAS,QAAA;AAAA,MACnB,QAAA,EAAU;AAAA,KACX,CAAA;AAGD,IAAA,OAAO,MAAA,CACJ,MAAA,CAAO,CAAC,KAAA,KAAsC,CAAC,KAAA,CAAM,YAAY,CAAA,CACjE,GAAA,CAAI,CAAC,KAAA,KAAmC,IAAA,CAAK,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA;AACjE;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CACJ,KAAA,EACA,IAAA,EACA,aACA,OAAA,EAOoB;AACpB,IAAA,MAAM,EAAE,MAAM,KAAA,EAAM,GAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,MAAA,CAAO;AAAA,MACvD,KAAA;AAAA,MACA,IAAA;AAAA,MACA,YAAA,EAAc,WAAA;AAAA,MACd,GAAG;AAAA,KACJ,CAAA;AAED,IAAA,IAAA,CAAK,IAAI,MAAA,EAAQ,EAAE,OAAO,IAAA,EAAM,WAAA,IAAe,eAAe,CAAA;AAE9D,IAAA,OAAO,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA;AAC5B;AAAA;AAAA;AAAA,EAKA,MAAM,SAAA,CACJ,KAAA,EACA,IAAA,EACA,aACA,MAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,SAAA,CAAU;AAAA,MAClC,KAAA;AAAA,MACA,IAAA;AAAA,MACA,YAAA,EAAc,WAAA;AAAA,MACd;AAAA,KACD,CAAA;AAED,IAAA,IAAA,CAAK,GAAA,CAAI,QAAQ,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,MAAA,IAAU,cAAc,CAAA;AAAA;AACvE;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CACJ,KAAA,EACA,IAAA,EACA,aACA,KAAA,EACe;AACf,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,WAAA,CAAY;AAAA,MACpC,KAAA;AAAA,MACA,IAAA;AAAA,MACA,YAAA,EAAc,WAAA;AAAA,MACd,IAAA,EAAM;AAAA,KACP,CAAA;AAED,IAAA,IAAA,CAAK,GAAA,CAAI,QAAQ,EAAE,KAAA,EAAO,MAAM,WAAA,EAAa,KAAA,IAAS,eAAe,CAAA;AAAA;AACvE;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CACJ,KAAA,EACA,IAAA,EACA,aACA,OAAA,EACuB;AACvB,IAAA,MAAM,EAAE,MAAM,OAAA,EAAQ,GAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,aAAA,CAAc;AAAA,MAChE,KAAA;AAAA,MACA,IAAA;AAAA,MACA,YAAA,EAAc,WAAA;AAAA,MACd,MAAM,OAAA,CAAQ;AAAA,KACf,CAAA;AAED,IAAA,IAAA,CAAK,GAAA,CAAI,MAAA,EAAQ,EAAE,KAAA,EAAO,IAAA,EAAM,aAAa,SAAA,EAAW,OAAA,CAAQ,EAAA,EAAG,EAAG,eAAe,CAAA;AAErF,IAAA,OAAO;AAAA,MACL,IAAI,OAAA,CAAQ,EAAA;AAAA,MACZ,KAAK,OAAA,CAAQ,QAAA;AAAA,MACb,IAAA,EAAM,QAAQ,IAAA,IAAQ,EAAA;AAAA,MACtB,MAAA,EAAQ,OAAA,CAAQ,IAAA,EAAM,KAAA,IAAS,SAAA;AAAA,MAC/B,SAAA,EAAW,IAAI,IAAA,CAAK,OAAA,CAAQ,UAAU;AAAA,KACxC;AAAA;AACF;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CACJ,KAAA,EACA,IAAA,EACA,WAAA,EACyB;AACzB,IAAA,MAAM,EAAE,MAAM,QAAA,EAAS,GAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,OAAO,YAAA,CAAa;AAAA,MAChE,KAAA;AAAA,MACA,IAAA;AAAA,MACA,YAAA,EAAc,WAAA;AAAA,MACd,QAAA,EAAU;AAAA,KACX,CAAA;AAED,IAAA,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,MAMd;AAAA,MACL,IAAI,OAAA,CAAQ,EAAA;AAAA,MACZ,KAAK,OAAA,CAAQ,QAAA;AAAA,MACb,IAAA,EAAM,QAAQ,IAAA,IAAQ,EAAA;AAAA,MACtB,MAAA,EAAQ,OAAA,CAAQ,IAAA,EAAM,KAAA,IAAS,SAAA;AAAA,MAC/B,SAAA,EAAW,IAAI,IAAA,CAAK,OAAA,CAAQ,UAAU;AAAA,KACxC,CAAE,CAAA;AAAA;AACJ;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,CAAW,KAAA,EAAe,IAAA,EAAc,WAAA,EAAyC;AACrF,IAAA,OAAO,IAAA,CAAK,YAAY,KAAA,EAAO,IAAA,EAAM,aAAa,EAAE,KAAA,EAAO,UAAU,CAAA;AAAA;AACvE;AAAA;AAAA;AAAA,EAKA,MAAM,WAAA,CAAY,KAAA,EAAe,IAAA,EAAc,WAAA,EAAyC;AACtF,IAAA,OAAO,IAAA,CAAK,YAAY,KAAA,EAAO,IAAA,EAAM,aAAa,EAAE,KAAA,EAAO,QAAQ,CAAA;AAAA;AACrE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,YAAA,CAAa,KAAA,EAAe,IAAA,EAAc,MAAA,EAA+B;AAC7E,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,SAAA,CAAU;AAAA,MAC/B,KAAA;AAAA,MACA,IAAA;AAAA,MACA,GAAA,EAAK,SAAS,MAAM,CAAA;AAAA,KACrB,CAAA;AAED,IAAA,IAAA,CAAK,IAAI,MAAA,EAAQ,EAAE,OAAO,IAAA,EAAM,MAAA,IAAU,gBAAgB,CAAA;AAAA;AAC5D;AAAA;AAAA;AAAA,EAKA,MAAM,YAAA,CAAa,KAAA,EAAe,IAAA,EAAc,MAAA,EAAkC;AAChF,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,QAAQ,KAAA,CAAM,SAAA,CAAU,EAAE,KAAA,EAAO,IAAA,EAAM,QAAQ,CAAA;AAC1D,MAAA,OAAO,IAAA;AAAA,KACT,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA;AACT;AACF;AAAA;AAAA;AAAA;AAAA,EAOQ,SAAS,KAAA,EAAuB;AACtC,IAAA,OAAO;AAAA,MACL,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,KAAK,KAAA,CAAM,QAAA;AAAA,MACX,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,IAAA,EAAM,MAAM,IAAA,IAAQ,EAAA;AAAA,MACpB,MAAA,EAAQ,MAAM,MAAA,CAAO,GAAA;AAAA,QAAI,CAAC,CAAA,KACxB,OAAO,MAAM,QAAA,GAAW,CAAA,GAAI,EAAE,IAAA,IAAQ;AAAA,OACxC;AAAA,MACA,SAAA,EAAW,MAAM,SAAA,EAAW,GAAA,CAAI,CAAC,CAAA,KAAyB,CAAA,CAAE,KAAK,CAAA,IAAK,EAAC;AAAA,MACvE,SAAA,EAAW,IAAI,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAAA,MACpC,UAAU,KAAA,CAAM,SAAA,GAAY,IAAI,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA,GAAI;AAAA,KAC1D;AAAA;AACF,EAEQ,GAAA,CACN,KAAA,EACA,IAAA,EACA,OAAA,EACM;AACN,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,CAAE,IAAA,EAAM,OAAO,CAAA;AAAA;AAClC;AAEJ;;;ACiVO,IAAM,yBAAA,GAA8C;AAAA,EACzD,cAAc,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,EAAC,EAAE;AAAA,EAC5C,QAAA,EAAU,OAAA;AAAA,EACV,YAAA,EAAc,OAAA;AAAA,EACd,MAAA,EAAQ,OAAA;AAAA,EACR,QAAA,EAAU,MAAA;AAAA,EACV,eAAA,EAAiB,IAAA;AAAA;AAAA,EACjB,YAAA,EAAc,KAAA;AAAA,EACd,mBAAA,EAAqB,KAAA;AAAA,EACrB,aAAA,EAAe;AACjB;AAKO,IAAM,0BAAA,GAA+C;AAAA,EAC1D,cAAc,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,EAAC,EAAE;AAAA,EAC5C,QAAA,EAAU,MAAA;AAAA,EACV,YAAA,EAAc,MAAA;AAAA,EACd,MAAA,EAAQ,MAAA;AAAA,EACR,QAAA,EAAU,MAAA;AAAA,EACV,eAAA,EAAiB,KAAA;AAAA,EACjB,YAAA,EAAc,KAAA;AAAA,EACd,mBAAA,EAAqB,KAAA;AAAA,EACrB,aAAA,EAAe;AACjB","file":"index.cjs","sourcesContent":["/**\n * Branch Naming Service\n *\n * Generates and parses managed branch names.\n * Format: {prefix}/{execution-id}/{role}-{slug}\n */\n\nimport type { BranchConfig, BranchInfo } from '../types';\n\nexport const DEFAULT_BRANCH_PREFIX = 'parallax';\n\nexport interface BranchNamingOptions {\n /**\n * Maximum length for the slug portion\n */\n maxSlugLength?: number;\n\n /**\n * Custom prefix (defaults to 'parallax')\n */\n prefix?: string;\n}\n\nconst DEFAULT_OPTIONS: Required<BranchNamingOptions> = {\n maxSlugLength: 30,\n prefix: DEFAULT_BRANCH_PREFIX,\n};\n\n/**\n * Generate a branch name from configuration\n */\nexport function generateBranchName(\n config: BranchConfig,\n options?: BranchNamingOptions\n): string {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n // Sanitize role\n const role = sanitizeForBranch(config.role);\n\n // Generate slug from description or use provided\n const slug = config.slug\n ? sanitizeForBranch(config.slug, opts.maxSlugLength)\n : '';\n\n // Build branch name\n const parts = [opts.prefix, config.executionId, role];\n if (slug) {\n parts[2] = `${role}-${slug}`;\n }\n\n return parts.join('/');\n}\n\n/**\n * Parse a branch name into its components\n */\nexport function parseBranchName(\n branchName: string,\n options?: BranchNamingOptions\n): { executionId: string; role: string; slug?: string } | null {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n // Check if it's a managed branch\n if (!branchName.startsWith(`${opts.prefix}/`)) {\n return null;\n }\n\n const parts = branchName.split('/');\n if (parts.length < 3) {\n return null;\n }\n\n const [, executionId, roleAndSlug] = parts;\n\n // Parse role and optional slug\n const dashIndex = roleAndSlug.indexOf('-');\n if (dashIndex === -1) {\n return { executionId, role: roleAndSlug };\n }\n\n return {\n executionId,\n role: roleAndSlug.substring(0, dashIndex),\n slug: roleAndSlug.substring(dashIndex + 1),\n };\n}\n\n/**\n * Check if a branch name is a managed branch\n */\nexport function isManagedBranch(\n branchName: string,\n options?: BranchNamingOptions\n): boolean {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n return branchName.startsWith(`${opts.prefix}/`);\n}\n\n/**\n * Get all branches for a specific execution\n */\nexport function filterBranchesByExecution(\n branches: string[],\n executionId: string,\n options?: BranchNamingOptions\n): string[] {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const prefix = `${opts.prefix}/${executionId}/`;\n return branches.filter((b) => b.startsWith(prefix));\n}\n\n/**\n * Generate branch info object\n */\nexport function createBranchInfo(\n config: BranchConfig,\n options?: BranchNamingOptions\n): BranchInfo {\n return {\n name: generateBranchName(config, options),\n executionId: config.executionId,\n baseBranch: config.baseBranch,\n createdAt: new Date(),\n };\n}\n\n/**\n * Sanitize a string for use in a branch name\n */\nfunction sanitizeForBranch(input: string, maxLength?: number): string {\n let result = input\n .toLowerCase()\n // Replace spaces and underscores with dashes\n .replace(/[\\s_]+/g, '-')\n // Remove invalid characters\n .replace(/[^a-z0-9-]/g, '')\n // Remove consecutive dashes\n .replace(/-+/g, '-')\n // Remove leading/trailing dashes\n .replace(/^-|-$/g, '');\n\n if (maxLength && result.length > maxLength) {\n result = result.substring(0, maxLength).replace(/-$/, '');\n }\n\n return result;\n}\n\n/**\n * Generate a slug from a task description\n */\nexport function generateSlug(description: string, maxLength = 30): string {\n // Extract key words\n const words = description\n .toLowerCase()\n .replace(/[^a-z0-9\\s]/g, '')\n .split(/\\s+/)\n .filter((w) => w.length > 2)\n .filter((w) => !STOP_WORDS.has(w))\n .slice(0, 4);\n\n return sanitizeForBranch(words.join('-'), maxLength);\n}\n\nconst STOP_WORDS = new Set([\n 'the',\n 'and',\n 'for',\n 'with',\n 'this',\n 'that',\n 'from',\n 'have',\n 'has',\n 'will',\n 'would',\n 'could',\n 'should',\n 'been',\n 'being',\n 'into',\n 'than',\n 'then',\n 'when',\n 'where',\n 'which',\n 'while',\n 'about',\n 'after',\n 'before',\n]);\n","/**\n * Git Credential Helper\n *\n * This module provides a Git credential helper that integrates with the\n * workspace service. It can be used in two modes:\n *\n * 1. Script mode: Run as a standalone script that Git calls\n * 2. Embedded mode: Used within the workspace service to configure git\n *\n * Git credential helpers receive input on stdin in the format:\n * protocol=https\n * host=github.com\n * path=owner/repo\n *\n * And respond with:\n * username=x-access-token\n * password=<token>\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\n\n/**\n * Credential context stored per-workspace\n * This is written to a file that the helper reads\n */\nexport interface CredentialHelperContext {\n workspaceId: string;\n executionId: string;\n repo: string;\n token: string;\n expiresAt: string;\n}\n\n/**\n * Create the credential helper script content (Node.js version)\n */\nexport function createNodeCredentialHelperScript(contextFilePath: string): string {\n return `#!/usr/bin/env node\nconst fs = require('fs');\nconst readline = require('readline');\n\nconst contextFile = '${contextFilePath}';\n\nasync function main() {\n // Parse input from git\n const rl = readline.createInterface({ input: process.stdin });\n const request = {};\n\n for await (const line of rl) {\n if (!line.trim()) break;\n const [key, value] = line.split('=');\n if (key && value !== undefined) {\n request[key.trim()] = value.trim();\n }\n }\n\n // Read context file\n try {\n const context = JSON.parse(fs.readFileSync(contextFile, 'utf8'));\n\n // Check expiration\n if (new Date(context.expiresAt) < new Date()) {\n console.error('Credential expired');\n process.exit(1);\n }\n\n // Output credentials\n console.log('username=x-access-token');\n console.log('password=' + context.token);\n console.log('');\n } catch (error) {\n console.error('Failed to read credentials:', error.message);\n process.exit(1);\n }\n}\n\nmain();\n`;\n}\n\n/**\n * Create a shell-based credential helper script (more portable)\n */\nexport function createShellCredentialHelperScript(contextFilePath: string): string {\n return `#!/bin/sh\n# Git Credential Helper\n# Reads credentials from: ${contextFilePath}\n\n# Read the context file\nif [ ! -f \"${contextFilePath}\" ]; then\n echo \"Credential context file not found\" >&2\n exit 1\nfi\n\n# Parse JSON and extract token (using basic shell tools)\nTOKEN=$(cat \"${contextFilePath}\" | grep -o '\"token\":\"[^\"]*\"' | cut -d'\"' -f4)\nEXPIRES=$(cat \"${contextFilePath}\" | grep -o '\"expiresAt\":\"[^\"]*\"' | cut -d'\"' -f4)\n\n# Check if we got a token\nif [ -z \"$TOKEN\" ]; then\n echo \"No token found in credential context\" >&2\n exit 1\nfi\n\n# Output credentials in git credential format\necho \"username=x-access-token\"\necho \"password=$TOKEN\"\necho \"\"\n`;\n}\n\n/**\n * Configure git to use the credential helper in a workspace\n */\nexport async function configureCredentialHelper(\n workspacePath: string,\n context: CredentialHelperContext\n): Promise<string> {\n // Create the .git-workspace directory in the workspace\n const helperDir = path.join(workspacePath, '.git-workspace');\n await fs.promises.mkdir(helperDir, { recursive: true });\n\n // Write the context file\n const contextFilePath = path.join(helperDir, 'credential-context.json');\n await fs.promises.writeFile(\n contextFilePath,\n JSON.stringify(context, null, 2),\n { mode: 0o600 } // Read/write only for owner\n );\n\n // Create the helper script\n const helperScriptPath = path.join(helperDir, 'git-credential-helper');\n const helperScript = createShellCredentialHelperScript(contextFilePath);\n await fs.promises.writeFile(helperScriptPath, helperScript, { mode: 0o700 });\n\n // Ensure .git-workspace/ is in .gitignore to prevent committing secrets\n const gitignorePath = path.join(workspacePath, '.gitignore');\n const entry = '.git-workspace/';\n try {\n let content = '';\n try {\n content = await fs.promises.readFile(gitignorePath, 'utf-8');\n } catch {\n // File doesn't exist yet — will be created below\n }\n if (!content.includes(entry)) {\n const suffix = content.length > 0 && !content.endsWith('\\n') ? `\\n${entry}\\n` : `${entry}\\n`;\n await fs.promises.writeFile(gitignorePath, content + suffix);\n }\n } catch {\n // Non-fatal — credential helper still works, just won't be gitignored\n }\n\n // Return the path to the helper script\n return helperScriptPath;\n}\n\n/**\n * Update credentials for an existing workspace\n * Called when credentials are refreshed\n */\nexport async function updateCredentials(\n workspacePath: string,\n newToken: string,\n newExpiresAt: string\n): Promise<void> {\n const contextFilePath = path.join(workspacePath, '.git-workspace', 'credential-context.json');\n\n // Read existing context\n const existingContent = await fs.promises.readFile(contextFilePath, 'utf8');\n const context: CredentialHelperContext = JSON.parse(existingContent);\n\n // Update token and expiry\n context.token = newToken;\n context.expiresAt = newExpiresAt;\n\n // Write back\n await fs.promises.writeFile(\n contextFilePath,\n JSON.stringify(context, null, 2),\n { mode: 0o600 }\n );\n}\n\n/**\n * Clean up credential files from a workspace\n */\nexport async function cleanupCredentialFiles(workspacePath: string): Promise<void> {\n const helperDir = path.join(workspacePath, '.git-workspace');\n try {\n await fs.promises.rm(helperDir, { recursive: true, force: true });\n } catch {\n // Ignore errors during cleanup\n }\n}\n\n/**\n * Get the git config commands to configure the credential helper\n */\nexport function getGitCredentialConfig(helperScriptPath: string): string[] {\n return [\n // Clear any existing helpers\n `git config credential.helper ''`,\n // Use our custom helper script\n `git config --add credential.helper '!${helperScriptPath}'`,\n // Disable interactive prompts\n `git config credential.interactive false`,\n ];\n}\n\n/**\n * Output credentials to stdout in Git format\n */\nexport function outputCredentials(username: string, password: string): void {\n console.log(`username=${username}`);\n console.log(`password=${password}`);\n console.log('');\n}\n","/**\n * Workspace Service\n *\n * Provisions and manages git workspaces for agent tasks.\n * Handles cloning, branching, and PR creation.\n */\n\nimport { randomUUID } from 'crypto';\nimport { exec } from 'child_process';\nimport { promisify } from 'util';\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport type {\n BranchInfo,\n Workspace,\n WorkspaceConfig,\n WorkspaceFinalization,\n PullRequestInfo,\n WorkspaceServiceConfig,\n WorkspaceEvent,\n WorkspaceEventHandler,\n WorkspaceStrategy,\n WorkspacePhase,\n} from './types';\nimport { CredentialService } from './credential-service';\nimport { createBranchInfo } from './utils/branch-naming';\nimport {\n configureCredentialHelper,\n cleanupCredentialFiles,\n getGitCredentialConfig,\n type CredentialHelperContext,\n} from './utils/git-credential-helper';\n\nconst execAsync = promisify(exec);\n\nexport interface WorkspaceServiceLogger {\n info(data: Record<string, unknown>, message: string): void;\n warn(data: Record<string, unknown>, message: string): void;\n error(data: Record<string, unknown>, message: string): void;\n debug(data: Record<string, unknown>, message: string): void;\n}\n\nexport interface WorkspaceServiceOptions {\n /**\n * Configuration\n */\n config: WorkspaceServiceConfig;\n\n /**\n * Credential service for managing git credentials\n */\n credentialService: CredentialService;\n\n /**\n * Optional logger\n */\n logger?: WorkspaceServiceLogger;\n}\n\nexport class WorkspaceService {\n private workspaces: Map<string, Workspace> = new Map();\n private readonly baseDir: string;\n private readonly branchPrefix: string;\n private readonly credentialService: CredentialService;\n private readonly logger?: WorkspaceServiceLogger;\n private readonly eventHandlers: Set<WorkspaceEventHandler> = new Set();\n\n constructor(options: WorkspaceServiceOptions) {\n this.baseDir = options.config.baseDir;\n this.branchPrefix = options.config.branchPrefix || 'parallax';\n this.credentialService = options.credentialService;\n this.logger = options.logger;\n }\n\n /**\n * Initialize the workspace service\n */\n async initialize(): Promise<void> {\n await fs.mkdir(this.baseDir, { recursive: true });\n this.log('info', { baseDir: this.baseDir }, 'Workspace service initialized');\n }\n\n /**\n * Register an event handler\n */\n onEvent(handler: WorkspaceEventHandler): () => void {\n this.eventHandlers.add(handler);\n return () => this.eventHandlers.delete(handler);\n }\n\n /**\n * Provision a new workspace for a task\n */\n async provision(config: WorkspaceConfig): Promise<Workspace> {\n const strategy: WorkspaceStrategy = config.strategy || 'clone';\n\n // Validate worktree config\n if (strategy === 'worktree') {\n if (!config.parentWorkspace) {\n throw new Error('parentWorkspace is required when strategy is \"worktree\"');\n }\n const parent = this.workspaces.get(config.parentWorkspace);\n if (!parent) {\n throw new Error(`Parent workspace not found: ${config.parentWorkspace}`);\n }\n if (parent.strategy !== 'clone') {\n throw new Error('Parent workspace must be a clone, not a worktree');\n }\n if (parent.repo !== config.repo) {\n throw new Error('Worktree must be for the same repository as parent');\n }\n }\n\n const workspaceId = randomUUID();\n\n this.log(\n 'info',\n {\n workspaceId,\n repo: config.repo,\n executionId: config.execution.id,\n role: config.task.role,\n strategy,\n },\n 'Provisioning workspace'\n );\n\n await this.emitEvent({\n type: 'workspace:provisioning',\n workspaceId,\n executionId: config.execution.id,\n timestamp: new Date(),\n });\n\n // Create workspace directory (for clone) or use worktree path\n const workspacePath = path.join(this.baseDir, workspaceId);\n\n // Get credentials (or reuse parent's for worktree)\n // For public repos, credentials are optional - we'll try unauthenticated clone\n let credential;\n\n if (strategy === 'worktree' && config.parentWorkspace) {\n const parent = this.workspaces.get(config.parentWorkspace)!;\n credential = parent.credential;\n } else {\n await fs.mkdir(workspacePath, { recursive: true });\n\n // Try to get credentials (optional for public repos)\n credential = await this.credentialService.getCredentials({\n repo: config.repo,\n access: 'write',\n context: {\n executionId: config.execution.id,\n taskId: config.task.id,\n userId: config.user?.id,\n reason: `Workspace for ${config.task.role} in ${config.execution.patternName}`,\n },\n userProvided: config.userCredentials,\n // If no userCredentials provided, allow returning null for public repos\n optional: !config.userCredentials,\n });\n\n if (credential) {\n await this.emitEvent({\n type: 'credential:granted',\n workspaceId,\n credentialId: credential.id,\n executionId: config.execution.id,\n timestamp: new Date(),\n });\n }\n }\n\n // Generate branch name (or use caller-provided override)\n const branchInfo: BranchInfo = config.branchName\n ? {\n name: config.branchName,\n executionId: config.execution.id,\n baseBranch: config.baseBranch,\n createdAt: new Date(),\n }\n : createBranchInfo(\n {\n executionId: config.execution.id,\n role: config.task.role,\n slug: config.task.slug,\n baseBranch: config.baseBranch,\n },\n { prefix: this.branchPrefix }\n );\n\n // Create workspace object (credential is optional for public repos)\n const workspace: Workspace = {\n id: workspaceId,\n path: workspacePath,\n repo: config.repo,\n branch: branchInfo,\n credential: credential ?? undefined, // Optional for public repos\n provisionedAt: new Date(),\n status: 'provisioning',\n strategy,\n parentWorkspaceId: config.parentWorkspace,\n onComplete: config.onComplete,\n progress: {\n phase: 'initializing',\n message: 'Initializing workspace',\n updatedAt: new Date(),\n },\n };\n\n this.workspaces.set(workspaceId, workspace);\n\n try {\n if (strategy === 'clone') {\n // Clone repository\n this.updateProgress(workspace, 'cloning', 'Cloning repository');\n\n // If no credentials, try unauthenticated clone (for public repos)\n if (!credential) {\n const cloneResult = await this.tryUnauthenticatedClone(workspace);\n if (!cloneResult.success) {\n // Unauthenticated clone failed - this is a private repo or auth is required\n // Throw a clear error since we already tried to get credentials above\n throw new Error(\n `Repository ${config.repo} requires authentication but no credentials are available. ` +\n 'Please provide credentials or configure OAuth.'\n );\n }\n // Unauthenticated clone succeeded - this is a public repo\n this.log('info', { workspaceId }, 'Cloned public repository without authentication');\n } else {\n // We have credentials - clone with them\n await this.cloneRepo(workspace, credential.token);\n }\n\n // Create and checkout branch\n this.updateProgress(workspace, 'creating_branch', 'Creating branch');\n await this.createBranch(workspace);\n } else {\n // Add worktree from parent\n const parent = this.workspaces.get(config.parentWorkspace!)!;\n await this.addWorktreeFromParent(parent, workspace);\n\n // Track worktree in parent\n if (!parent.worktreeIds) {\n parent.worktreeIds = [];\n }\n parent.worktreeIds.push(workspaceId);\n this.workspaces.set(parent.id, parent);\n\n await this.emitEvent({\n type: 'worktree:added',\n workspaceId,\n executionId: config.execution.id,\n timestamp: new Date(),\n data: { parentWorkspaceId: parent.id },\n });\n }\n\n // Configure git for this workspace\n this.updateProgress(workspace, 'configuring', 'Configuring git');\n await this.configureGit(workspace);\n\n // Mark as ready\n workspace.status = 'ready';\n this.updateProgress(workspace, 'ready', 'Workspace ready');\n this.workspaces.set(workspaceId, workspace);\n\n // Execute completion hook if configured\n await this.executeCompletionHook(workspace, 'success');\n\n this.log(\n 'info',\n {\n workspaceId,\n path: workspacePath,\n branch: branchInfo.name,\n strategy,\n },\n 'Workspace provisioned'\n );\n\n await this.emitEvent({\n type: 'workspace:ready',\n workspaceId,\n executionId: config.execution.id,\n timestamp: new Date(),\n });\n\n return workspace;\n } catch (error) {\n workspace.status = 'error';\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.updateProgress(workspace, 'error', errorMessage);\n this.workspaces.set(workspaceId, workspace);\n\n this.log('error', { workspaceId, error: errorMessage }, 'Failed to provision workspace');\n\n await this.emitEvent({\n type: 'workspace:error',\n workspaceId,\n executionId: config.execution.id,\n timestamp: new Date(),\n error: errorMessage,\n });\n\n // Execute completion hook on error if configured\n await this.executeCompletionHook(workspace, 'error');\n\n throw error;\n }\n }\n\n /**\n * Add a worktree to an existing clone workspace (convenience method)\n */\n async addWorktree(\n parentWorkspaceId: string,\n options: {\n branch: string;\n execution: { id: string; patternName: string };\n task: { id: string; role: string; slug?: string };\n }\n ): Promise<Workspace> {\n const parent = this.workspaces.get(parentWorkspaceId);\n if (!parent) {\n throw new Error(`Parent workspace not found: ${parentWorkspaceId}`);\n }\n\n return this.provision({\n repo: parent.repo,\n strategy: 'worktree',\n parentWorkspace: parentWorkspaceId,\n branchStrategy: 'feature_branch',\n baseBranch: options.branch,\n execution: options.execution,\n task: options.task,\n });\n }\n\n /**\n * List all worktrees for a parent workspace\n */\n listWorktrees(parentWorkspaceId: string): Workspace[] {\n const parent = this.workspaces.get(parentWorkspaceId);\n if (!parent) {\n return [];\n }\n\n if (!parent.worktreeIds || parent.worktreeIds.length === 0) {\n return [];\n }\n\n return parent.worktreeIds\n .map((id) => this.workspaces.get(id))\n .filter((w): w is Workspace => w !== undefined);\n }\n\n /**\n * Remove a worktree (alias for cleanup with worktree-specific handling)\n */\n async removeWorktree(workspaceId: string): Promise<void> {\n const workspace = this.workspaces.get(workspaceId);\n if (!workspace) {\n return;\n }\n\n if (workspace.strategy !== 'worktree') {\n throw new Error('Workspace is not a worktree. Use cleanup() instead.');\n }\n\n await this.cleanup(workspaceId);\n }\n\n /**\n * Finalize a workspace (push, create PR, cleanup)\n */\n async finalize(\n workspaceId: string,\n options: WorkspaceFinalization\n ): Promise<PullRequestInfo | void> {\n const workspace = this.workspaces.get(workspaceId);\n if (!workspace) {\n throw new Error(`Workspace not found: ${workspaceId}`);\n }\n\n workspace.status = 'finalizing';\n this.workspaces.set(workspaceId, workspace);\n\n this.log(\n 'info',\n {\n workspaceId,\n push: options.push,\n createPr: options.createPr,\n },\n 'Finalizing workspace'\n );\n\n await this.emitEvent({\n type: 'workspace:finalizing',\n workspaceId,\n executionId: workspace.branch.executionId,\n timestamp: new Date(),\n });\n\n let pr: PullRequestInfo | undefined;\n\n try {\n if (options.push) {\n await this.pushBranch(workspace);\n }\n\n if (options.createPr && options.pr) {\n pr = await this.createPullRequest(workspace, options.pr);\n workspace.branch.pullRequest = pr;\n\n await this.emitEvent({\n type: 'pr:created',\n workspaceId,\n executionId: workspace.branch.executionId,\n timestamp: new Date(),\n data: {\n prNumber: pr.number,\n prUrl: pr.url,\n },\n });\n }\n\n if (options.cleanup) {\n await this.cleanup(workspaceId);\n } else {\n workspace.status = 'ready';\n this.workspaces.set(workspaceId, workspace);\n }\n\n return pr;\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.log('error', { workspaceId, error: errorMessage }, 'Failed to finalize workspace');\n throw error;\n }\n }\n\n /**\n * Get a workspace by ID\n */\n get(workspaceId: string): Workspace | null {\n return this.workspaces.get(workspaceId) || null;\n }\n\n /**\n * Get all workspaces for an execution\n */\n getForExecution(executionId: string): Workspace[] {\n return Array.from(this.workspaces.values()).filter(\n (w) => w.branch.executionId === executionId\n );\n }\n\n /**\n * Clean up a workspace\n */\n async cleanup(workspaceId: string): Promise<void> {\n const workspace = this.workspaces.get(workspaceId);\n if (!workspace) {\n return;\n }\n\n this.log('info', { workspaceId, strategy: workspace.strategy }, 'Cleaning up workspace');\n\n // If this is a clone with worktrees, clean up worktrees first\n if (workspace.strategy === 'clone' && workspace.worktreeIds?.length) {\n this.log(\n 'info',\n { workspaceId, worktreeCount: workspace.worktreeIds.length },\n 'Cleaning up child worktrees first'\n );\n for (const worktreeId of workspace.worktreeIds) {\n await this.cleanup(worktreeId);\n }\n }\n\n // Clean up credential files first (securely remove tokens)\n try {\n await cleanupCredentialFiles(workspace.path);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.log('warn', { workspaceId, error: errorMessage }, 'Failed to clean up credential files');\n }\n\n // Handle worktree removal via git\n if (workspace.strategy === 'worktree' && workspace.parentWorkspaceId) {\n const parent = this.workspaces.get(workspace.parentWorkspaceId);\n if (parent) {\n try {\n // Remove worktree using git command from parent\n await this.execInDir(parent.path, `git worktree remove \"${workspace.path}\" --force`);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.log('warn', { workspaceId, error: errorMessage }, 'Failed to remove worktree via git');\n }\n\n // Remove from parent's worktreeIds\n if (parent.worktreeIds) {\n parent.worktreeIds = parent.worktreeIds.filter((id) => id !== workspaceId);\n this.workspaces.set(parent.id, parent);\n }\n\n await this.emitEvent({\n type: 'worktree:removed',\n workspaceId,\n executionId: workspace.branch.executionId,\n timestamp: new Date(),\n data: { parentWorkspaceId: parent.id },\n });\n }\n }\n\n // Revoke credentials (only for clone workspaces with credentials - worktrees share parent's credential)\n if (workspace.strategy === 'clone' && workspace.credential) {\n await this.credentialService.revokeCredential(workspace.credential.id);\n\n await this.emitEvent({\n type: 'credential:revoked',\n workspaceId,\n credentialId: workspace.credential.id,\n executionId: workspace.branch.executionId,\n timestamp: new Date(),\n });\n }\n\n // Remove workspace directory (for clones or if worktree removal failed)\n // Validate the resolved path is inside baseDir to prevent symlink traversal\n try {\n const realPath = await fs.realpath(workspace.path);\n const realBase = await fs.realpath(this.baseDir);\n if (!realPath.startsWith(realBase + path.sep) && realPath !== realBase) {\n this.log('error', { workspaceId, realPath, realBase }, 'Workspace path resolves outside baseDir — refusing to delete');\n } else {\n await fs.rm(workspace.path, { recursive: true, force: true });\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.log('warn', { workspaceId, error: errorMessage }, 'Failed to remove workspace directory');\n }\n\n workspace.status = 'cleaned_up';\n this.workspaces.set(workspaceId, workspace);\n\n await this.emitEvent({\n type: 'workspace:cleaned_up',\n workspaceId,\n executionId: workspace.branch.executionId,\n timestamp: new Date(),\n });\n }\n\n /**\n * Clean up all workspaces for an execution\n */\n async cleanupForExecution(executionId: string): Promise<void> {\n const workspaces = this.getForExecution(executionId);\n await Promise.all(workspaces.map((w) => this.cleanup(w.id)));\n\n // Also revoke all credentials for this execution\n await this.credentialService.revokeForExecution(executionId);\n }\n\n // ─────────────────────────────────────────────────────────────\n // Private Methods\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Try to clone a public repository without authentication\n */\n private async tryUnauthenticatedClone(\n workspace: Workspace\n ): Promise<{ success: boolean; error?: string }> {\n // Build HTTPS URL without auth\n let cloneUrl = workspace.repo;\n\n // Convert SSH to HTTPS\n if (cloneUrl.startsWith('git@github.com:')) {\n cloneUrl = cloneUrl.replace('git@github.com:', 'https://github.com/');\n }\n\n // Strip trailing slashes before checking for .git\n cloneUrl = cloneUrl.replace(/\\/+$/, '');\n\n // Add .git if missing\n if (!cloneUrl.endsWith('.git')) {\n cloneUrl = `${cloneUrl}.git`;\n }\n\n // Ensure HTTPS\n if (!cloneUrl.startsWith('https://')) {\n cloneUrl = `https://${cloneUrl}`;\n }\n\n try {\n await this.execInDir(\n workspace.path,\n `git clone --depth 1 --branch ${workspace.branch.baseBranch} ${cloneUrl} .`\n );\n this.log('info', { workspaceId: workspace.id }, 'Public repository cloned without authentication');\n return { success: true };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n // Check if it's an auth error (401/403) or repo not found\n const isAuthError =\n errorMessage.includes('401') ||\n errorMessage.includes('403') ||\n errorMessage.includes('Authentication failed') ||\n errorMessage.includes('could not read Username') ||\n errorMessage.includes('terminal prompts disabled');\n\n if (isAuthError) {\n return { success: false, error: 'Authentication required' };\n }\n\n // For other errors (repo not found, network issues), throw\n throw error;\n }\n }\n\n private async cloneRepo(workspace: Workspace, token: string): Promise<void> {\n // For SSH credentials (empty token), use the URL as-is\n // For token-based auth, build authenticated HTTPS URL\n const cloneUrl = token\n ? this.buildAuthenticatedUrl(workspace.repo, token)\n : workspace.repo;\n\n // Clone with depth 1 for speed\n await this.execInDir(\n workspace.path,\n `git clone --depth 1 --branch ${workspace.branch.baseBranch} ${cloneUrl} .`\n );\n }\n\n private async createBranch(workspace: Workspace): Promise<void> {\n // Create and checkout the new branch\n await this.execInDir(workspace.path, `git checkout -b ${workspace.branch.name}`);\n }\n\n private async addWorktreeFromParent(parent: Workspace, workspace: Workspace): Promise<void> {\n // Fetch the base branch first to ensure it's up to date\n try {\n await this.execInDir(parent.path, `git fetch origin ${workspace.branch.baseBranch}`);\n } catch {\n // May fail if already fetched or in shallow clone, continue anyway\n }\n\n // Create the worktree with a new branch based on the base branch\n // Use -b to create the new branch at the same time\n await this.execInDir(\n parent.path,\n `git worktree add -b ${workspace.branch.name} \"${workspace.path}\" origin/${workspace.branch.baseBranch}`\n );\n }\n\n private async configureGit(workspace: Workspace): Promise<void> {\n // Configure git identity\n await this.execInDir(workspace.path, 'git config user.name \"Workspace Agent\"');\n await this.execInDir(workspace.path, 'git config user.email \"agent@workspace.local\"');\n\n // Skip credential helper if no credentials (public repo) or SSH-based auth (no token)\n if (!workspace.credential || !workspace.credential.token) {\n this.log(\n 'debug',\n { workspaceId: workspace.id },\n workspace.credential\n ? 'Using SSH authentication, skipping credential helper'\n : 'No credentials (public repo), skipping credential helper'\n );\n return;\n }\n\n // Configure credential helper for token-based auth\n const credentialContext: CredentialHelperContext = {\n workspaceId: workspace.id,\n executionId: workspace.branch.executionId,\n repo: workspace.repo,\n token: workspace.credential.token,\n expiresAt: workspace.credential.expiresAt.toISOString(),\n };\n\n const helperScriptPath = await configureCredentialHelper(\n workspace.path,\n credentialContext\n );\n\n // Configure git to use our credential helper\n const configCommands = getGitCredentialConfig(helperScriptPath);\n for (const cmd of configCommands) {\n await this.execInDir(workspace.path, cmd);\n }\n\n this.log(\n 'debug',\n { workspaceId: workspace.id, helperPath: helperScriptPath },\n 'Git credential helper configured'\n );\n }\n\n private async pushBranch(workspace: Workspace): Promise<void> {\n // Push requires credentials\n if (!workspace.credential) {\n throw new Error(\n 'Push requires authentication. This workspace was cloned from a public repository without credentials.'\n );\n }\n\n // Push using origin remote - credentials provided by helper\n await this.execInDir(workspace.path, `git push -u origin ${workspace.branch.name}`);\n }\n\n private async createPullRequest(\n workspace: Workspace,\n config: NonNullable<WorkspaceFinalization['pr']>\n ): Promise<PullRequestInfo> {\n // PR creation requires credentials\n if (!workspace.credential) {\n throw new Error(\n 'Pull request creation requires authentication. This workspace was cloned from a public repository without credentials.'\n );\n }\n\n // Parse repo to get owner/repo\n const repoInfo = this.parseRepo(workspace.repo);\n if (!repoInfo) {\n throw new Error(`Invalid repository format: ${workspace.repo}`);\n }\n\n // Get provider from credential service\n const provider = this.credentialService.getProvider(workspace.credential.provider);\n if (!provider) {\n throw new Error(`Provider not configured: ${workspace.credential.provider}`);\n }\n\n // Create the PR\n const pr = await provider.createPullRequest({\n repo: workspace.repo,\n sourceBranch: workspace.branch.name,\n targetBranch: config.targetBranch,\n title: config.title,\n body: config.body,\n draft: config.draft,\n labels: config.labels,\n reviewers: config.reviewers,\n credential: workspace.credential,\n });\n\n // Set execution ID\n pr.executionId = workspace.branch.executionId;\n\n this.log(\n 'info',\n {\n workspaceId: workspace.id,\n prNumber: pr.number,\n prUrl: pr.url,\n },\n 'Pull request created'\n );\n\n return pr;\n }\n\n private parseRepo(repo: string): { owner: string; repo: string } | null {\n const patterns = [/github\\.com[/:]([^/]+)\\/([^/.]+)/, /^([^/]+)\\/([^/]+)$/];\n\n for (const pattern of patterns) {\n const match = repo.match(pattern);\n if (match) {\n return { owner: match[1], repo: match[2].replace(/\\.git$/, '') };\n }\n }\n\n return null;\n }\n\n private buildAuthenticatedUrl(repo: string, token: string): string {\n // Handle various repo formats\n let url = repo;\n\n // Convert SSH to HTTPS\n if (url.startsWith('git@github.com:')) {\n url = url.replace('git@github.com:', 'https://github.com/');\n }\n\n // Strip trailing slashes before checking for .git\n url = url.replace(/\\/+$/, '');\n\n // Add .git if missing\n if (!url.endsWith('.git')) {\n url = `${url}.git`;\n }\n\n // Ensure HTTPS\n if (!url.startsWith('https://')) {\n url = `https://${url}`;\n }\n\n // Insert token\n url = url.replace('https://', `https://x-access-token:${token}@`);\n\n return url;\n }\n\n private async execInDir(dir: string, command: string): Promise<string> {\n // Mask tokens in logs\n const safeCommand = command.replace(/x-access-token:[^@]+@/g, 'x-access-token:***@');\n this.log('debug', { dir, command: safeCommand }, 'Executing git command');\n\n const { stdout, stderr } = await execAsync(command, { cwd: dir });\n\n if (stderr && !stderr.includes('Cloning into')) {\n this.log('debug', { stderr: stderr.substring(0, 200) }, 'Git stderr');\n }\n\n return stdout;\n }\n\n private log(\n level: 'info' | 'warn' | 'error' | 'debug',\n data: Record<string, unknown>,\n message: string\n ): void {\n if (this.logger) {\n this.logger[level](data, message);\n }\n }\n\n private async emitEvent(event: WorkspaceEvent): Promise<void> {\n for (const handler of this.eventHandlers) {\n try {\n await handler(event);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.log('warn', { event: event.type, error: errorMessage }, 'Event handler error');\n }\n }\n }\n\n /**\n * Update workspace progress\n */\n private updateProgress(workspace: Workspace, phase: WorkspacePhase, message?: string): void {\n workspace.progress = {\n phase,\n message,\n updatedAt: new Date(),\n };\n this.workspaces.set(workspace.id, workspace);\n\n this.log(\n 'debug',\n { workspaceId: workspace.id, phase, message },\n 'Progress updated'\n );\n }\n\n /**\n * Execute completion hook if configured\n */\n private async executeCompletionHook(\n workspace: Workspace,\n status: 'success' | 'error'\n ): Promise<void> {\n const hook = workspace.onComplete;\n if (!hook) return;\n\n // Check if we should run on error\n if (status === 'error' && hook.runOnError === false) {\n return;\n }\n\n // Set up environment variables for command\n const env = {\n ...process.env,\n WORKSPACE_ID: workspace.id,\n REPO: workspace.repo,\n BRANCH: workspace.branch.name,\n STATUS: status,\n WORKSPACE_PATH: workspace.path,\n };\n\n // Execute command if configured\n if (hook.command) {\n try {\n this.log('info', { workspaceId: workspace.id, command: hook.command }, 'Executing completion hook command');\n await execAsync(hook.command, { env });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.log('warn', { workspaceId: workspace.id, error: errorMessage }, 'Completion hook command failed');\n }\n }\n\n // Call webhook if configured\n if (hook.webhook) {\n try {\n this.log('info', { workspaceId: workspace.id, webhook: hook.webhook }, 'Calling completion webhook');\n const payload = {\n workspaceId: workspace.id,\n repo: workspace.repo,\n branch: workspace.branch.name,\n status,\n timestamp: new Date().toISOString(),\n };\n\n await fetch(hook.webhook, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...hook.webhookHeaders,\n },\n body: JSON.stringify(payload),\n });\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.log('warn', { workspaceId: workspace.id, error: errorMessage }, 'Completion webhook failed');\n }\n }\n }\n}\n","/**\n * OAuth Device Code Flow\n *\n * Implements the OAuth 2.0 Device Authorization Grant (RFC 8628)\n * for authenticating CLI/agent applications without browser control.\n *\n * Flow:\n * 1. Request device code from provider\n * 2. Display verification URL and user code to user\n * 3. Poll for authorization while user completes in browser\n * 4. Receive access token on success\n */\n\nimport type {\n GitProvider,\n AgentPermissions,\n OAuthToken,\n DeviceCodeResponse,\n AuthPrompt,\n AuthResult,\n AuthPromptEmitter,\n} from '../types';\n\n// Response types for GitHub OAuth API\ninterface DeviceCodeApiResponse {\n device_code: string;\n user_code: string;\n verification_uri: string;\n verification_uri_complete?: string;\n expires_in: number;\n interval?: number;\n}\n\ninterface TokenApiResponse {\n access_token?: string;\n token_type?: string;\n scope?: string;\n expires_in?: number;\n refresh_token?: string;\n error?: string;\n error_description?: string;\n}\n\nexport interface OAuthDeviceFlowConfig {\n /**\n * OAuth Client ID\n */\n clientId: string;\n\n /**\n * OAuth Client Secret (optional for public clients)\n */\n clientSecret?: string;\n\n /**\n * Provider (defaults to 'github')\n */\n provider?: GitProvider;\n\n /**\n * Permissions to request\n */\n permissions?: AgentPermissions;\n\n /**\n * Auth prompt emitter for user interaction\n */\n promptEmitter?: AuthPromptEmitter;\n\n /**\n * Timeout in seconds for the auth flow (default: 900 = 15 min)\n */\n timeout?: number;\n}\n\nexport interface OAuthDeviceFlowLogger {\n info(data: Record<string, unknown>, message: string): void;\n warn(data: Record<string, unknown>, message: string): void;\n error(data: Record<string, unknown>, message: string): void;\n debug(data: Record<string, unknown>, message: string): void;\n}\n\n// GitHub OAuth endpoints\nconst GITHUB_DEVICE_CODE_URL = 'https://github.com/login/device/code';\nconst GITHUB_TOKEN_URL = 'https://github.com/login/oauth/access_token';\n\n// Error codes from device flow\nconst ERROR_AUTHORIZATION_PENDING = 'authorization_pending';\nconst ERROR_SLOW_DOWN = 'slow_down';\nconst ERROR_EXPIRED_TOKEN = 'expired_token';\nconst ERROR_ACCESS_DENIED = 'access_denied';\n\n/**\n * OAuth Device Code Flow implementation for GitHub\n */\nexport class OAuthDeviceFlow {\n private readonly clientId: string;\n private readonly clientSecret?: string;\n private readonly provider: GitProvider;\n private readonly permissions: AgentPermissions;\n private readonly promptEmitter?: AuthPromptEmitter;\n private readonly timeout: number;\n private readonly logger?: OAuthDeviceFlowLogger;\n\n constructor(config: OAuthDeviceFlowConfig, logger?: OAuthDeviceFlowLogger) {\n this.clientId = config.clientId;\n this.clientSecret = config.clientSecret;\n this.provider = config.provider || 'github';\n this.permissions = config.permissions || {\n repositories: { type: 'all' },\n contents: 'write',\n pullRequests: 'write',\n issues: 'write',\n metadata: 'read',\n canDeleteBranch: true,\n canForcePush: false,\n canDeleteRepository: false,\n canAdminister: false,\n };\n this.promptEmitter = config.promptEmitter;\n this.timeout = config.timeout || 900;\n this.logger = logger;\n }\n\n /**\n * Start the device code flow and wait for authorization\n */\n async authorize(): Promise<OAuthToken> {\n this.log('info', {}, 'Starting OAuth device code flow');\n\n // Step 1: Request device code\n const deviceCode = await this.requestDeviceCode();\n\n // Step 2: Emit auth prompt\n const prompt: AuthPrompt = {\n provider: this.provider,\n verificationUri: deviceCode.verificationUri,\n userCode: deviceCode.userCode,\n expiresIn: deviceCode.expiresIn,\n requestedPermissions: this.permissions,\n };\n\n if (this.promptEmitter) {\n this.promptEmitter.onAuthRequired(prompt);\n } else {\n // Default: log to console\n this.printAuthPrompt(prompt);\n }\n\n // Step 3: Poll for authorization\n try {\n const token = await this.pollForToken(deviceCode);\n\n const result: AuthResult = {\n success: true,\n provider: this.provider,\n };\n\n if (this.promptEmitter) {\n this.promptEmitter.onAuthComplete(result);\n }\n\n this.log('info', {}, 'OAuth authorization successful');\n return token;\n } catch (error) {\n const result: AuthResult = {\n success: false,\n provider: this.provider,\n error: error instanceof Error ? error.message : String(error),\n };\n\n if (this.promptEmitter) {\n this.promptEmitter.onAuthComplete(result);\n }\n\n throw error;\n }\n }\n\n /**\n * Request a device code from GitHub\n */\n async requestDeviceCode(): Promise<DeviceCodeResponse> {\n const scope = this.permissionsToScopes(this.permissions);\n\n this.log('debug', { scope }, 'Requesting device code');\n\n const response = await fetch(GITHUB_DEVICE_CODE_URL, {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n client_id: this.clientId,\n scope,\n }),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Failed to request device code: ${response.status} ${text}`);\n }\n\n const data = (await response.json()) as DeviceCodeApiResponse;\n\n return {\n deviceCode: data.device_code,\n userCode: data.user_code,\n verificationUri: data.verification_uri,\n verificationUriComplete: data.verification_uri_complete,\n expiresIn: data.expires_in,\n interval: data.interval || 5,\n };\n }\n\n /**\n * Poll for the access token until authorized or timeout\n */\n async pollForToken(deviceCode: DeviceCodeResponse): Promise<OAuthToken> {\n const startTime = Date.now();\n let interval = deviceCode.interval * 1000;\n const expiresAt = startTime + deviceCode.expiresIn * 1000;\n\n while (Date.now() < expiresAt) {\n // Check overall timeout\n if (Date.now() - startTime > this.timeout * 1000) {\n throw new Error('OAuth flow timed out');\n }\n\n // Wait before polling\n await this.sleep(interval);\n\n // Notify about pending status\n const secondsRemaining = Math.ceil((expiresAt - Date.now()) / 1000);\n if (this.promptEmitter?.onAuthPending) {\n this.promptEmitter.onAuthPending(secondsRemaining);\n }\n\n try {\n const token = await this.exchangeDeviceCode(deviceCode.deviceCode);\n return token;\n } catch (error) {\n if (error instanceof DeviceFlowError) {\n switch (error.code) {\n case ERROR_AUTHORIZATION_PENDING:\n // Still waiting for user, continue polling\n this.log('debug', {}, 'Authorization pending, continuing to poll');\n continue;\n\n case ERROR_SLOW_DOWN:\n // Increase polling interval\n interval += 5000;\n this.log('debug', { interval }, 'Slowing down polling');\n continue;\n\n case ERROR_EXPIRED_TOKEN:\n throw new Error('Device code expired. Please try again.');\n\n case ERROR_ACCESS_DENIED:\n throw new Error('User denied authorization');\n\n default:\n throw error;\n }\n }\n throw error;\n }\n }\n\n throw new Error('Device code expired');\n }\n\n /**\n * Exchange device code for access token\n */\n private async exchangeDeviceCode(deviceCode: string): Promise<OAuthToken> {\n const body: Record<string, string> = {\n client_id: this.clientId,\n device_code: deviceCode,\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n };\n\n if (this.clientSecret) {\n body.client_secret = this.clientSecret;\n }\n\n const response = await fetch(GITHUB_TOKEN_URL, {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n\n const data = (await response.json()) as TokenApiResponse;\n\n // Check for errors\n if (data.error) {\n throw new DeviceFlowError(data.error, data.error_description);\n }\n\n // Parse scopes\n const scopes = (data.scope || '').split(/[,\\s]+/).filter(Boolean);\n\n return {\n accessToken: data.access_token!,\n tokenType: data.token_type || 'bearer',\n scopes,\n expiresAt: data.expires_in\n ? new Date(Date.now() + data.expires_in * 1000)\n : undefined,\n refreshToken: data.refresh_token,\n provider: this.provider,\n permissions: this.permissions,\n createdAt: new Date(),\n };\n }\n\n /**\n * Refresh an expired token\n */\n async refreshToken(refreshTokenValue: string): Promise<OAuthToken> {\n this.log('info', {}, 'Refreshing OAuth token');\n\n const body: Record<string, string> = {\n client_id: this.clientId,\n grant_type: 'refresh_token',\n refresh_token: refreshTokenValue,\n };\n\n if (this.clientSecret) {\n body.client_secret = this.clientSecret;\n }\n\n const response = await fetch(GITHUB_TOKEN_URL, {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const text = await response.text();\n throw new Error(`Failed to refresh token: ${response.status} ${text}`);\n }\n\n const data = (await response.json()) as TokenApiResponse;\n\n if (data.error) {\n throw new Error(`Token refresh failed: ${data.error_description || data.error}`);\n }\n\n const scopes = (data.scope || '').split(/[,\\s]+/).filter(Boolean);\n\n return {\n accessToken: data.access_token!,\n tokenType: data.token_type || 'bearer',\n scopes,\n expiresAt: data.expires_in\n ? new Date(Date.now() + data.expires_in * 1000)\n : undefined,\n refreshToken: data.refresh_token || refreshTokenValue,\n provider: this.provider,\n permissions: this.permissions,\n createdAt: new Date(),\n };\n }\n\n /**\n * Convert AgentPermissions to GitHub OAuth scopes\n */\n private permissionsToScopes(permissions: AgentPermissions): string {\n const scopes: string[] = [];\n\n // Contents (code)\n if (permissions.contents === 'write') {\n scopes.push('repo'); // Full repo access for private repos\n } else if (permissions.contents === 'read') {\n scopes.push('public_repo'); // Only public repos read\n }\n\n // Pull requests and issues are covered by 'repo'\n // But we can be more specific with these for public repos\n if (permissions.pullRequests !== 'none' && !scopes.includes('repo')) {\n scopes.push('public_repo');\n }\n\n // User info (to get username)\n scopes.push('read:user');\n\n // Note: GitHub's classic OAuth scopes are coarse-grained\n // Fine-grained permissions require GitHub Apps or fine-grained PATs\n // For now, we request 'repo' which gives full access but we\n // enforce limits at the service layer\n\n return scopes.join(' ');\n }\n\n /**\n * Print auth prompt to console (default behavior)\n */\n private printAuthPrompt(prompt: AuthPrompt): void {\n console.log('\\n┌────────────────────────────────────────────────┐');\n console.log('│ GitHub Authorization Required │');\n console.log('├────────────────────────────────────────────────┤');\n console.log(`│ 1. Go to: ${prompt.verificationUri.padEnd(35)}│`);\n console.log(`│ 2. Enter code: ${prompt.userCode.padEnd(29)}│`);\n console.log('├────────────────────────────────────────────────┤');\n console.log(`│ ⏳ Waiting for authorization... │`);\n console.log(`│ Code expires in ${prompt.expiresIn} seconds${' '.repeat(18)}│`);\n console.log('└────────────────────────────────────────────────┘\\n');\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n\n private log(\n level: 'info' | 'warn' | 'error' | 'debug',\n data: Record<string, unknown>,\n message: string\n ): void {\n if (this.logger) {\n this.logger[level](data, message);\n }\n }\n}\n\n/**\n * Error class for device flow specific errors\n */\nclass DeviceFlowError extends Error {\n constructor(\n public readonly code: string,\n public readonly description?: string\n ) {\n super(description || code);\n this.name = 'DeviceFlowError';\n }\n}\n","/**\n * Token Store\n *\n * Securely stores and manages OAuth tokens with support for:\n * - Expiry checking\n * - Automatic refresh triggers\n * - Multiple storage backends (file, memory, keychain)\n */\n\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport * as os from 'os';\nimport * as crypto from 'crypto';\nimport type { GitProvider, OAuthToken } from '../types';\n\nexport interface TokenStoreOptions {\n /**\n * Encryption key for file-based storage\n * If not provided, tokens are stored in plaintext (not recommended for production)\n */\n encryptionKey?: string;\n\n /**\n * Directory to store tokens (for FileTokenStore)\n * Default: ~/.parallax/tokens\n */\n directory?: string;\n}\n\n/**\n * Token store interface\n */\nexport abstract class TokenStore {\n /**\n * Save a token for a provider\n */\n abstract save(provider: GitProvider, token: OAuthToken): Promise<void>;\n\n /**\n * Get a token for a provider\n */\n abstract get(provider: GitProvider): Promise<OAuthToken | null>;\n\n /**\n * Clear a token for a provider (or all tokens)\n */\n abstract clear(provider?: GitProvider): Promise<void>;\n\n /**\n * List all stored providers\n */\n abstract list(): Promise<GitProvider[]>;\n\n /**\n * Check if a token is expired\n */\n isExpired(token: OAuthToken): boolean {\n if (!token.expiresAt) {\n return false; // No expiry = never expires\n }\n // Consider expired if within 5 minutes of expiry\n const buffer = 5 * 60 * 1000;\n return Date.now() > token.expiresAt.getTime() - buffer;\n }\n\n /**\n * Check if a token needs refresh (expired or close to expiry)\n */\n needsRefresh(token: OAuthToken): boolean {\n if (!token.expiresAt) {\n return false;\n }\n // Refresh if within 10 minutes of expiry\n const buffer = 10 * 60 * 1000;\n return Date.now() > token.expiresAt.getTime() - buffer;\n }\n}\n\n/**\n * In-memory token store (for testing and short-lived processes)\n */\nexport class MemoryTokenStore extends TokenStore {\n private tokens: Map<GitProvider, OAuthToken> = new Map();\n\n async save(provider: GitProvider, token: OAuthToken): Promise<void> {\n this.tokens.set(provider, token);\n }\n\n async get(provider: GitProvider): Promise<OAuthToken | null> {\n return this.tokens.get(provider) || null;\n }\n\n async clear(provider?: GitProvider): Promise<void> {\n if (provider) {\n this.tokens.delete(provider);\n } else {\n this.tokens.clear();\n }\n }\n\n async list(): Promise<GitProvider[]> {\n return Array.from(this.tokens.keys());\n }\n}\n\n/**\n * File-based token store with optional encryption\n */\nexport class FileTokenStore extends TokenStore {\n private readonly directory: string;\n private readonly encryptionKey?: Buffer;\n\n constructor(options: TokenStoreOptions = {}) {\n super();\n this.directory = options.directory || path.join(os.homedir(), '.parallax', 'tokens');\n\n if (options.encryptionKey) {\n // Derive a 32-byte key from the provided key\n this.encryptionKey = crypto\n .createHash('sha256')\n .update(options.encryptionKey)\n .digest();\n }\n }\n\n async save(provider: GitProvider, token: OAuthToken): Promise<void> {\n await this.ensureDirectory();\n\n const filePath = this.getTokenPath(provider);\n\n // Serialize token (convert Date to ISO string)\n const serialized = JSON.stringify({\n ...token,\n expiresAt: token.expiresAt?.toISOString(),\n createdAt: token.createdAt.toISOString(),\n });\n\n // Encrypt if key provided\n const data = this.encryptionKey\n ? this.encrypt(serialized)\n : serialized;\n\n await fs.writeFile(filePath, data, 'utf-8');\n }\n\n async get(provider: GitProvider): Promise<OAuthToken | null> {\n const filePath = this.getTokenPath(provider);\n\n try {\n const data = await fs.readFile(filePath, 'utf-8');\n\n // Decrypt if encrypted\n const serialized = this.encryptionKey\n ? this.decrypt(data)\n : data;\n\n const parsed = JSON.parse(serialized);\n\n // Convert date strings back to Date objects\n return {\n ...parsed,\n expiresAt: parsed.expiresAt ? new Date(parsed.expiresAt) : undefined,\n createdAt: new Date(parsed.createdAt),\n };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') {\n return null;\n }\n throw error;\n }\n }\n\n async clear(provider?: GitProvider): Promise<void> {\n if (provider) {\n const filePath = this.getTokenPath(provider);\n try {\n await fs.unlink(filePath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n } else {\n // Clear all tokens\n try {\n const files = await fs.readdir(this.directory);\n await Promise.all(\n files\n .filter((f) => f.endsWith('.token'))\n .map((f) => fs.unlink(path.join(this.directory, f)))\n );\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n }\n }\n\n async list(): Promise<GitProvider[]> {\n try {\n const files = await fs.readdir(this.directory);\n return files\n .filter((f) => f.endsWith('.token'))\n .map((f) => f.replace('.token', '') as GitProvider);\n } catch {\n return [];\n }\n }\n\n private getTokenPath(provider: GitProvider): string {\n return path.join(this.directory, `${provider}.token`);\n }\n\n private async ensureDirectory(): Promise<void> {\n await fs.mkdir(this.directory, { recursive: true, mode: 0o700 });\n }\n\n private encrypt(data: string): string {\n if (!this.encryptionKey) {\n return data;\n }\n\n const iv = crypto.randomBytes(16);\n const cipher = crypto.createCipheriv('aes-256-cbc', this.encryptionKey, iv);\n let encrypted = cipher.update(data, 'utf8', 'hex');\n encrypted += cipher.final('hex');\n\n // Prepend IV to encrypted data\n return iv.toString('hex') + ':' + encrypted;\n }\n\n private decrypt(data: string): string {\n if (!this.encryptionKey) {\n return data;\n }\n\n const [ivHex, encrypted] = data.split(':');\n const iv = Buffer.from(ivHex, 'hex');\n const decipher = crypto.createDecipheriv('aes-256-cbc', this.encryptionKey, iv);\n let decrypted = decipher.update(encrypted, 'hex', 'utf8');\n decrypted += decipher.final('utf8');\n\n return decrypted;\n }\n}\n","/**\n * Git Credential Service\n *\n * Manages credentials for private repository access.\n * Supports GitHub App, OAuth device flow, deploy keys, and PATs.\n *\n * Credential priority:\n * 1. User-provided (PAT, OAuth token, SSH)\n * 2. Cached OAuth token (from TokenStore)\n * 3. Provider adapter (GitHub App, etc.)\n * 4. OAuth device flow (interactive)\n */\n\nimport { randomUUID } from 'crypto';\nimport type {\n GitCredential,\n GitCredentialRequest,\n CredentialGrant,\n GitProvider,\n CredentialType,\n GitProviderAdapter,\n OAuthToken,\n AuthPromptEmitter,\n AgentPermissions,\n} from './types';\nimport { OAuthDeviceFlow, TokenStore, MemoryTokenStore } from './oauth';\n\nexport interface CredentialServiceLogger {\n info(data: Record<string, unknown>, message: string): void;\n warn(data: Record<string, unknown>, message: string): void;\n error(data: Record<string, unknown>, message: string): void;\n}\n\nexport interface CredentialGrantStore {\n create(grant: CredentialGrant & { reason?: string }): Promise<void>;\n findById(id: string): Promise<CredentialGrant | null>;\n findByExecutionId(executionId: string): Promise<CredentialGrant[]>;\n revoke(id: string): Promise<void>;\n revokeForExecution(executionId: string): Promise<number>;\n}\n\nexport interface OAuthConfig {\n /**\n * OAuth Client ID (required for device flow)\n */\n clientId: string;\n\n /**\n * OAuth Client Secret (optional for public clients)\n */\n clientSecret?: string;\n\n /**\n * Default permissions to request\n */\n permissions?: AgentPermissions;\n\n /**\n * Callback for auth prompts (for PTY integration)\n */\n promptEmitter?: AuthPromptEmitter;\n}\n\nexport interface CredentialServiceOptions {\n /**\n * Default TTL for credentials in seconds\n */\n defaultTtlSeconds?: number;\n\n /**\n * Maximum TTL allowed\n */\n maxTtlSeconds?: number;\n\n /**\n * Provider adapters keyed by provider name\n */\n providers?: Map<GitProvider, GitProviderAdapter>;\n\n /**\n * Optional persistent store for grants\n */\n grantStore?: CredentialGrantStore;\n\n /**\n * Token store for cached OAuth tokens\n * Default: MemoryTokenStore\n */\n tokenStore?: TokenStore;\n\n /**\n * OAuth configuration for device flow authentication\n * If provided, enables interactive OAuth as a fallback\n */\n oauth?: OAuthConfig;\n\n /**\n * Optional logger\n */\n logger?: CredentialServiceLogger;\n}\n\nexport class CredentialService {\n private grants: Map<string, CredentialGrant> = new Map();\n private readonly defaultTtl: number;\n private readonly maxTtl: number;\n private readonly providers: Map<GitProvider, GitProviderAdapter>;\n private readonly grantStore?: CredentialGrantStore;\n private readonly tokenStore: TokenStore;\n private readonly oauthConfig?: OAuthConfig;\n private readonly logger?: CredentialServiceLogger;\n\n constructor(options: CredentialServiceOptions = {}) {\n this.defaultTtl = options.defaultTtlSeconds || 3600; // 1 hour\n this.maxTtl = options.maxTtlSeconds || 3600; // 1 hour max\n this.providers = options.providers || new Map();\n this.grantStore = options.grantStore;\n this.tokenStore = options.tokenStore || new MemoryTokenStore();\n this.oauthConfig = options.oauth;\n this.logger = options.logger;\n }\n\n /**\n * Get the token store (for external access to cached tokens)\n */\n getTokenStore(): TokenStore {\n return this.tokenStore;\n }\n\n /**\n * Register a provider adapter\n */\n registerProvider(provider: GitProviderAdapter): void {\n this.providers.set(provider.name, provider);\n this.log('info', { provider: provider.name }, 'Provider registered');\n }\n\n /**\n * Get a provider adapter\n */\n getProvider(name: GitProvider): GitProviderAdapter | undefined {\n return this.providers.get(name);\n }\n\n /**\n * Request credentials for a repository.\n * If request.optional is true, returns null when no credentials available.\n * Otherwise throws an error.\n */\n async getCredentials(request: GitCredentialRequest): Promise<GitCredential | null> {\n const provider = this.detectProvider(request.repo);\n\n this.log(\n 'info',\n {\n repo: request.repo,\n provider,\n access: request.access,\n executionId: request.context.executionId,\n },\n 'Credential request'\n );\n\n // Determine TTL\n const ttlSeconds = Math.min(\n request.ttlSeconds || this.defaultTtl,\n this.maxTtl\n );\n\n // Try credential sources in order of preference\n let credential: GitCredential | null = null;\n\n // Priority 1: User-provided credentials (PAT, OAuth token, or SSH)\n if (request.userProvided) {\n credential = this.createUserProvidedCredential(request, ttlSeconds, provider);\n this.log(\n 'info',\n { repo: request.repo, type: request.userProvided.type },\n 'Using user-provided credentials'\n );\n }\n\n // Priority 2: Cached OAuth token\n if (!credential) {\n credential = await this.getCachedOAuthCredential(provider, request, ttlSeconds);\n }\n\n // Priority 3: Provider-specific credentials (GitHub App, etc.)\n if (!credential) {\n const providerAdapter = this.providers.get(provider);\n if (providerAdapter) {\n try {\n credential = await providerAdapter.getCredentials(request);\n } catch (error) {\n this.log(\n 'warn',\n { repo: request.repo, provider, error },\n 'Failed to get provider credentials'\n );\n }\n }\n }\n\n // Priority 4: Interactive OAuth device flow\n if (!credential && this.oauthConfig) {\n credential = await this.getOAuthCredentialViaDeviceFlow(provider, request, ttlSeconds);\n }\n\n if (!credential) {\n // If optional flag is set, return null instead of throwing\n if (request.optional) {\n this.log(\n 'info',\n { repo: request.repo },\n 'No credentials available (optional request, returning null)'\n );\n return null;\n }\n\n throw new Error(\n `No credentials available for repository: ${request.repo}. ` +\n (this.oauthConfig\n ? 'OAuth device flow failed or was cancelled.'\n : 'Configure OAuth to enable interactive authentication.')\n );\n }\n\n // Record the grant\n const grant: CredentialGrant = {\n id: credential.id,\n type: credential.type,\n repo: request.repo,\n provider,\n grantedTo: {\n executionId: request.context.executionId,\n taskId: request.context.taskId,\n agentId: request.context.agentId,\n },\n permissions: credential.permissions,\n createdAt: new Date(),\n expiresAt: credential.expiresAt,\n };\n\n // Store grant in memory\n this.grants.set(grant.id, grant);\n\n // Persist to store if available\n if (this.grantStore) {\n try {\n await this.grantStore.create({\n ...grant,\n reason: request.context.reason,\n });\n } catch (error) {\n this.log(\n 'warn',\n { grantId: grant.id, error },\n 'Failed to persist credential grant'\n );\n }\n }\n\n this.log(\n 'info',\n {\n grantId: grant.id,\n repo: request.repo,\n expiresAt: credential.expiresAt,\n persisted: !!this.grantStore,\n },\n 'Credential granted'\n );\n\n return credential;\n }\n\n /**\n * Revoke a credential grant\n */\n async revokeCredential(grantId: string): Promise<void> {\n const grant = this.grants.get(grantId);\n if (!grant) {\n // Try to revoke in store even if not in memory\n if (this.grantStore) {\n try {\n await this.grantStore.revoke(grantId);\n } catch (error) {\n this.log('warn', { grantId, error }, 'Failed to revoke credential in store');\n }\n }\n return;\n }\n\n grant.revokedAt = new Date();\n this.grants.set(grantId, grant);\n\n // Revoke via provider if applicable\n const provider = this.providers.get(grant.provider);\n if (provider) {\n try {\n await provider.revokeCredential(grantId);\n } catch (error) {\n this.log('warn', { grantId, error }, 'Failed to revoke credential via provider');\n }\n }\n\n // Update store\n if (this.grantStore) {\n try {\n await this.grantStore.revoke(grantId);\n } catch (error) {\n this.log('warn', { grantId, error }, 'Failed to revoke credential in store');\n }\n }\n\n this.log('info', { grantId }, 'Credential revoked');\n }\n\n /**\n * Revoke all credentials for an execution\n */\n async revokeForExecution(executionId: string): Promise<number> {\n let count = 0;\n\n // Revoke in memory\n for (const [id, grant] of this.grants) {\n if (grant.grantedTo.executionId === executionId && !grant.revokedAt) {\n grant.revokedAt = new Date();\n this.grants.set(id, grant);\n count++;\n }\n }\n\n // Revoke in store\n if (this.grantStore) {\n try {\n const storeCount = await this.grantStore.revokeForExecution(executionId);\n // Use the larger count (store may have grants not in memory)\n count = Math.max(count, storeCount);\n } catch (error) {\n this.log('warn', { executionId, error }, 'Failed to revoke credentials in store');\n }\n }\n\n this.log('info', { executionId, revokedCount: count }, 'Credentials revoked for execution');\n return count;\n }\n\n /**\n * Check if a credential is valid\n */\n isValid(grantId: string): boolean {\n const grant = this.grants.get(grantId);\n if (!grant) return false;\n if (grant.revokedAt) return false;\n if (new Date() > grant.expiresAt) return false;\n return true;\n }\n\n /**\n * Get grant info for audit\n */\n async getGrant(grantId: string): Promise<CredentialGrant | null> {\n // Check memory first\n const memoryGrant = this.grants.get(grantId);\n if (memoryGrant) {\n return memoryGrant;\n }\n\n // Check store\n if (this.grantStore) {\n try {\n return await this.grantStore.findById(grantId);\n } catch (error) {\n this.log('warn', { grantId, error }, 'Failed to get grant from store');\n }\n }\n\n return null;\n }\n\n /**\n * List all grants for an execution\n */\n async getGrantsForExecution(executionId: string): Promise<CredentialGrant[]> {\n // Try store first for complete history\n if (this.grantStore) {\n try {\n return await this.grantStore.findByExecutionId(executionId);\n } catch (error) {\n this.log('warn', { executionId, error }, 'Failed to get grants from store');\n }\n }\n\n // Fallback to memory\n return Array.from(this.grants.values()).filter(\n (g) => g.grantedTo.executionId === executionId\n );\n }\n\n // ─────────────────────────────────────────────────────────────\n // Private Methods\n // ─────────────────────────────────────────────────────────────\n\n private detectProvider(repo: string): GitProvider {\n const lowerRepo = repo.toLowerCase();\n\n if (lowerRepo.includes('github.com') || lowerRepo.startsWith('github:')) {\n return 'github';\n }\n if (lowerRepo.includes('gitlab.com') || lowerRepo.startsWith('gitlab:')) {\n return 'gitlab';\n }\n if (lowerRepo.includes('bitbucket.org') || lowerRepo.startsWith('bitbucket:')) {\n return 'bitbucket';\n }\n if (lowerRepo.includes('dev.azure.com') || lowerRepo.includes('visualstudio.com')) {\n return 'azure_devops';\n }\n\n return 'self_hosted';\n }\n\n /**\n * Create a GitCredential from user-provided credentials (PAT or OAuth token)\n */\n private createUserProvidedCredential(\n request: GitCredentialRequest,\n ttlSeconds: number,\n provider: GitProvider\n ): GitCredential {\n const userCreds = request.userProvided!;\n const expiresAt = new Date(Date.now() + ttlSeconds * 1000);\n\n // Map user credential type to our CredentialType\n let credentialType: CredentialType;\n let token: string;\n\n if (userCreds.type === 'ssh') {\n // SSH credentials don't need a token - system SSH agent handles auth\n credentialType = 'ssh_key';\n token = ''; // No token needed for SSH\n } else {\n credentialType = userCreds.type === 'pat' ? 'pat' : 'oauth';\n token = userCreds.token;\n }\n\n // For user-provided credentials, we assume full repo access based on what they provided\n // The actual permissions are determined by the token's scope at the provider level\n const permissions =\n request.access === 'write'\n ? ['contents:read', 'contents:write', 'pull_requests:write']\n : ['contents:read'];\n\n return {\n id: randomUUID(),\n type: credentialType,\n token,\n repo: request.repo,\n permissions,\n expiresAt,\n provider: userCreds.provider || provider,\n };\n }\n\n /**\n * Check for a cached OAuth token and create credential from it\n */\n private async getCachedOAuthCredential(\n provider: GitProvider,\n request: GitCredentialRequest,\n ttlSeconds: number\n ): Promise<GitCredential | null> {\n try {\n const cachedToken = await this.tokenStore.get(provider);\n\n if (!cachedToken) {\n return null;\n }\n\n // Check if token is expired\n if (this.tokenStore.isExpired(cachedToken)) {\n // Try to refresh if we have a refresh token\n if (cachedToken.refreshToken && this.oauthConfig) {\n const refreshedToken = await this.refreshOAuthToken(provider, cachedToken.refreshToken);\n if (refreshedToken) {\n return this.createOAuthCredential(refreshedToken, request, ttlSeconds);\n }\n }\n // Token expired and can't refresh\n this.log('info', { provider }, 'Cached OAuth token expired');\n return null;\n }\n\n // Check if token needs refresh (close to expiry)\n if (this.tokenStore.needsRefresh(cachedToken) && cachedToken.refreshToken && this.oauthConfig) {\n const refreshedToken = await this.refreshOAuthToken(provider, cachedToken.refreshToken);\n if (refreshedToken) {\n return this.createOAuthCredential(refreshedToken, request, ttlSeconds);\n }\n // If refresh fails, continue with existing token if still valid\n }\n\n this.log('info', { provider }, 'Using cached OAuth token');\n return this.createOAuthCredential(cachedToken, request, ttlSeconds);\n } catch (error) {\n this.log('warn', { provider, error }, 'Failed to get cached OAuth token');\n return null;\n }\n }\n\n /**\n * Initiate interactive OAuth device flow\n */\n private async getOAuthCredentialViaDeviceFlow(\n provider: GitProvider,\n request: GitCredentialRequest,\n ttlSeconds: number\n ): Promise<GitCredential | null> {\n if (!this.oauthConfig) {\n return null;\n }\n\n // Only GitHub is supported for now\n if (provider !== 'github') {\n this.log('warn', { provider }, 'OAuth device flow only supported for GitHub');\n return null;\n }\n\n this.log('info', { repo: request.repo }, 'Starting OAuth device flow for authentication');\n\n try {\n const deviceFlow = new OAuthDeviceFlow({\n clientId: this.oauthConfig.clientId,\n clientSecret: this.oauthConfig.clientSecret,\n provider,\n permissions: this.oauthConfig.permissions,\n promptEmitter: this.oauthConfig.promptEmitter,\n });\n\n const token = await deviceFlow.authorize();\n\n // Cache the token for future use\n await this.tokenStore.save(provider, token);\n\n this.log('info', { provider }, 'OAuth device flow completed successfully');\n return this.createOAuthCredential(token, request, ttlSeconds);\n } catch (error) {\n this.log('error', { provider, error }, 'OAuth device flow failed');\n return null;\n }\n }\n\n /**\n * Refresh an OAuth token\n */\n private async refreshOAuthToken(\n provider: GitProvider,\n refreshToken: string\n ): Promise<OAuthToken | null> {\n if (!this.oauthConfig) {\n return null;\n }\n\n try {\n const deviceFlow = new OAuthDeviceFlow({\n clientId: this.oauthConfig.clientId,\n clientSecret: this.oauthConfig.clientSecret,\n provider,\n permissions: this.oauthConfig.permissions,\n });\n\n const newToken = await deviceFlow.refreshToken(refreshToken);\n\n // Update the cache\n await this.tokenStore.save(provider, newToken);\n\n this.log('info', { provider }, 'OAuth token refreshed successfully');\n return newToken;\n } catch (error) {\n this.log('warn', { provider, error }, 'Failed to refresh OAuth token');\n return null;\n }\n }\n\n /**\n * Create a GitCredential from an OAuthToken\n */\n private createOAuthCredential(\n token: OAuthToken,\n request: GitCredentialRequest,\n ttlSeconds: number\n ): GitCredential {\n const expiresAt = new Date(Date.now() + ttlSeconds * 1000);\n\n // Map permissions to string array\n const permissions: string[] = [];\n if (token.permissions.contents === 'read' || token.permissions.contents === 'write') {\n permissions.push('contents:read');\n }\n if (token.permissions.contents === 'write') {\n permissions.push('contents:write');\n }\n if (token.permissions.pullRequests === 'read' || token.permissions.pullRequests === 'write') {\n permissions.push('pull_requests:read');\n }\n if (token.permissions.pullRequests === 'write') {\n permissions.push('pull_requests:write');\n }\n if (token.permissions.issues === 'read' || token.permissions.issues === 'write') {\n permissions.push('issues:read');\n }\n if (token.permissions.issues === 'write') {\n permissions.push('issues:write');\n }\n\n return {\n id: randomUUID(),\n type: 'oauth',\n token: token.accessToken,\n repo: request.repo,\n permissions,\n expiresAt,\n provider: token.provider,\n };\n }\n\n private log(\n level: 'info' | 'warn' | 'error',\n data: Record<string, unknown>,\n message: string\n ): void {\n if (this.logger) {\n this.logger[level](data, message);\n }\n }\n}\n","/**\n * GitHub Provider\n *\n * Handles GitHub App authentication and API operations.\n * Requires @octokit/rest and @octokit/auth-app as peer dependencies.\n */\n\nimport { randomUUID } from 'crypto';\nimport type {\n GitProviderAdapter,\n GitCredential,\n GitCredentialRequest,\n PullRequestInfo,\n GitHubAppInstallation,\n IssueInfo,\n CreateIssueOptions,\n IssueComment,\n IssueCommentOptions,\n IssueState,\n} from '../types';\n\n// Lazy-loaded Octokit - using any for the cache since types are dynamically loaded\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet octokitCache: { Octokit: any; createAppAuth: any } | null = null;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction loadOctokit(): { Octokit: any; createAppAuth: any } {\n if (!octokitCache) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { Octokit } = require('@octokit/rest');\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { createAppAuth } = require('@octokit/auth-app');\n octokitCache = { Octokit, createAppAuth };\n } catch {\n throw new Error(\n '@octokit/rest and @octokit/auth-app are required for GitHub provider. ' +\n 'Install them with: npm install @octokit/rest @octokit/auth-app'\n );\n }\n }\n return octokitCache;\n}\n\nexport interface GitHubProviderConfig {\n /**\n * GitHub App ID\n */\n appId: string;\n\n /**\n * GitHub App private key (PEM format)\n */\n privateKey: string;\n\n /**\n * Webhook secret for verifying webhooks\n */\n webhookSecret?: string;\n\n /**\n * GitHub API base URL (for GitHub Enterprise)\n */\n baseUrl?: string;\n}\n\nexport interface GitHubProviderLogger {\n info(data: Record<string, unknown>, message: string): void;\n warn(data: Record<string, unknown>, message: string): void;\n error(data: Record<string, unknown>, message: string): void;\n debug(data: Record<string, unknown>, message: string): void;\n}\n\nexport class GitHubProvider implements GitProviderAdapter {\n readonly name = 'github' as const;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private appOctokit!: any;\n private installations: Map<string, GitHubAppInstallation> = new Map();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private installationOctokits: Map<number, any> = new Map();\n private initialized = false;\n\n constructor(\n private readonly config: GitHubProviderConfig,\n private readonly logger?: GitHubProviderLogger\n ) {}\n\n /**\n * Initialize provider - fetch all installations\n */\n async initialize(): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n const { Octokit, createAppAuth } = loadOctokit();\n\n this.log('info', {}, 'Initializing GitHub provider');\n\n // Create app-level Octokit for installation management\n this.appOctokit = new Octokit({\n authStrategy: createAppAuth,\n auth: {\n appId: this.config.appId,\n privateKey: this.config.privateKey,\n },\n baseUrl: this.config.baseUrl,\n });\n\n try {\n const { data: installations } = await this.appOctokit.apps.listInstallations();\n\n for (const installation of installations) {\n await this.registerInstallation(installation.id);\n }\n\n this.initialized = true;\n this.log(\n 'info',\n { installationCount: installations.length },\n 'GitHub provider initialized'\n );\n } catch (error) {\n this.log('error', { error }, 'Failed to initialize GitHub provider');\n throw error;\n }\n }\n\n /**\n * Register an installation (called on webhook or init)\n */\n async registerInstallation(installationId: number): Promise<GitHubAppInstallation> {\n if (!this.appOctokit) {\n await this.initialize();\n }\n\n try {\n // Get installation details\n const { data: installation } = await this.appOctokit.apps.getInstallation({\n installation_id: installationId,\n });\n\n // Get accessible repositories\n const octokit = await this.getInstallationOctokit(installationId);\n const { data: repos } = await octokit.apps.listReposAccessibleToInstallation({\n per_page: 100,\n });\n\n // Handle different account types\n const account = installation.account as {\n login?: string;\n type?: string;\n slug?: string;\n } | null;\n const accountLogin = account?.login || account?.slug || 'unknown';\n const accountType = account?.type === 'Organization' ? 'Organization' : 'User';\n\n const appInstallation: GitHubAppInstallation = {\n installationId,\n accountLogin,\n accountType,\n repositories: repos.repositories?.map((r: { full_name: string }) => r.full_name) || [],\n permissions: installation.permissions as Record<string, string>,\n };\n\n this.installations.set(appInstallation.accountLogin, appInstallation);\n\n this.log(\n 'info',\n {\n installationId,\n account: appInstallation.accountLogin,\n repoCount: appInstallation.repositories.length,\n },\n 'Installation registered'\n );\n\n return appInstallation;\n } catch (error) {\n this.log('error', { installationId, error }, 'Failed to register installation');\n throw error;\n }\n }\n\n /**\n * Get installation for a repository\n */\n getInstallationForRepo(owner: string, repo: string): GitHubAppInstallation | null {\n // Check by owner\n const installation = this.installations.get(owner);\n if (!installation) {\n return null;\n }\n\n // Check if repo is accessible\n const fullName = `${owner}/${repo}`;\n if (!installation.repositories.includes(fullName)) {\n return null;\n }\n\n return installation;\n }\n\n /**\n * Get credentials for a repository (implements GitProviderAdapter)\n */\n async getCredentials(request: GitCredentialRequest): Promise<GitCredential> {\n // Parse repo to get owner/repo\n const repoInfo = this.parseRepo(request.repo);\n if (!repoInfo) {\n throw new Error(`Invalid repository format: ${request.repo}`);\n }\n\n return this.getCredentialsForRepo(\n repoInfo.owner,\n repoInfo.repo,\n request.access,\n request.ttlSeconds\n );\n }\n\n /**\n * Get credentials for a repository by owner/repo\n */\n async getCredentialsForRepo(\n owner: string,\n repo: string,\n access: 'read' | 'write',\n ttlSeconds: number = 3600\n ): Promise<GitCredential> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const installation = this.getInstallationForRepo(owner, repo);\n if (!installation) {\n throw new Error(`No GitHub App installation found for ${owner}/${repo}`);\n }\n\n const { createAppAuth } = loadOctokit();\n\n // Get installation access token with specific permissions\n const auth = createAppAuth({\n appId: this.config.appId,\n privateKey: this.config.privateKey,\n });\n\n const { token, expiresAt } = await auth({\n type: 'installation',\n installationId: installation.installationId,\n repositoryNames: [repo],\n permissions:\n access === 'write'\n ? { contents: 'write', pull_requests: 'write', metadata: 'read' }\n : { contents: 'read', metadata: 'read' },\n });\n\n return {\n id: randomUUID(),\n type: 'github_app',\n token,\n repo: `${owner}/${repo}`,\n permissions:\n access === 'write'\n ? ['contents:write', 'pull_requests:write', 'metadata:read']\n : ['contents:read', 'metadata:read'],\n expiresAt: expiresAt ? new Date(expiresAt) : new Date(Date.now() + ttlSeconds * 1000),\n provider: 'github',\n };\n }\n\n /**\n * Revoke a credential (no-op for GitHub App tokens - they expire automatically)\n */\n async revokeCredential(_credentialId: string): Promise<void> {\n // GitHub App tokens expire automatically, no explicit revocation needed\n }\n\n /**\n * Create a pull request (implements GitProviderAdapter)\n */\n async createPullRequest(options: {\n repo: string;\n sourceBranch: string;\n targetBranch: string;\n title: string;\n body: string;\n draft?: boolean;\n labels?: string[];\n reviewers?: string[];\n credential: GitCredential;\n }): Promise<PullRequestInfo> {\n const repoInfo = this.parseRepo(options.repo);\n if (!repoInfo) {\n throw new Error(`Invalid repository format: ${options.repo}`);\n }\n\n return this.createPullRequestForRepo(repoInfo.owner, repoInfo.repo, {\n title: options.title,\n body: options.body,\n head: options.sourceBranch,\n base: options.targetBranch,\n draft: options.draft,\n labels: options.labels,\n reviewers: options.reviewers,\n });\n }\n\n /**\n * Create a pull request by owner/repo\n */\n async createPullRequestForRepo(\n owner: string,\n repo: string,\n options: {\n title: string;\n body: string;\n head: string;\n base: string;\n draft?: boolean;\n labels?: string[];\n reviewers?: string[];\n }\n ): Promise<PullRequestInfo> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const installation = this.getInstallationForRepo(owner, repo);\n if (!installation) {\n throw new Error(`No GitHub App installation found for ${owner}/${repo}`);\n }\n\n const octokit = await this.getInstallationOctokit(installation.installationId);\n\n const { data: pr } = await octokit.pulls.create({\n owner,\n repo,\n title: options.title,\n body: options.body,\n head: options.head,\n base: options.base,\n draft: options.draft,\n });\n\n // Add labels if specified\n if (options.labels && options.labels.length > 0) {\n await octokit.issues.addLabels({\n owner,\n repo,\n issue_number: pr.number,\n labels: options.labels,\n });\n }\n\n // Request reviewers if specified\n if (options.reviewers && options.reviewers.length > 0) {\n await octokit.pulls.requestReviewers({\n owner,\n repo,\n pull_number: pr.number,\n reviewers: options.reviewers,\n });\n }\n\n this.log(\n 'info',\n { owner, repo, prNumber: pr.number, title: options.title },\n 'Pull request created'\n );\n\n return {\n number: pr.number,\n url: pr.html_url,\n state: pr.state as 'open' | 'closed' | 'merged',\n sourceBranch: options.head,\n targetBranch: options.base,\n title: options.title,\n executionId: '', // Set by caller\n createdAt: new Date(pr.created_at),\n };\n }\n\n /**\n * Check if a branch exists (implements GitProviderAdapter)\n */\n async branchExists(\n repo: string,\n branch: string,\n _credential: GitCredential\n ): Promise<boolean> {\n const repoInfo = this.parseRepo(repo);\n if (!repoInfo) {\n return false;\n }\n\n if (!this.initialized) {\n await this.initialize();\n }\n\n const installation = this.getInstallationForRepo(repoInfo.owner, repoInfo.repo);\n if (!installation) {\n return false;\n }\n\n const octokit = await this.getInstallationOctokit(installation.installationId);\n\n try {\n await octokit.repos.getBranch({\n owner: repoInfo.owner,\n repo: repoInfo.repo,\n branch,\n });\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Get the default branch for a repository (implements GitProviderAdapter)\n */\n async getDefaultBranch(repo: string, _credential: GitCredential): Promise<string> {\n const repoInfo = this.parseRepo(repo);\n if (!repoInfo) {\n throw new Error(`Invalid repository format: ${repo}`);\n }\n\n if (!this.initialized) {\n await this.initialize();\n }\n\n const installation = this.getInstallationForRepo(repoInfo.owner, repoInfo.repo);\n if (!installation) {\n throw new Error(`No GitHub App installation found for ${repo}`);\n }\n\n const octokit = await this.getInstallationOctokit(installation.installationId);\n\n const { data: repoData } = await octokit.repos.get({\n owner: repoInfo.owner,\n repo: repoInfo.repo,\n });\n\n return repoData.default_branch;\n }\n\n /**\n * Get pull request status\n */\n async getPullRequest(\n owner: string,\n repo: string,\n prNumber: number\n ): Promise<PullRequestInfo> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const installation = this.getInstallationForRepo(owner, repo);\n if (!installation) {\n throw new Error(`No GitHub App installation found for ${owner}/${repo}`);\n }\n\n const octokit = await this.getInstallationOctokit(installation.installationId);\n\n const { data: pr } = await octokit.pulls.get({\n owner,\n repo,\n pull_number: prNumber,\n });\n\n return {\n number: pr.number,\n url: pr.html_url,\n state: pr.merged ? 'merged' : (pr.state as 'open' | 'closed'),\n sourceBranch: pr.head.ref,\n targetBranch: pr.base.ref,\n title: pr.title,\n executionId: '', // Would need to parse from branch name\n createdAt: new Date(pr.created_at),\n mergedAt: pr.merged_at ? new Date(pr.merged_at) : undefined,\n };\n }\n\n /**\n * Delete a branch\n */\n async deleteBranch(owner: string, repo: string, branch: string): Promise<void> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const installation = this.getInstallationForRepo(owner, repo);\n if (!installation) {\n throw new Error(`No GitHub App installation found for ${owner}/${repo}`);\n }\n\n const octokit = await this.getInstallationOctokit(installation.installationId);\n\n await octokit.git.deleteRef({\n owner,\n repo,\n ref: `heads/${branch}`,\n });\n\n this.log('info', { owner, repo, branch }, 'Branch deleted');\n }\n\n /**\n * List all managed branches for a repo\n */\n async listManagedBranches(\n owner: string,\n repo: string,\n prefix = 'parallax/'\n ): Promise<string[]> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const installation = this.getInstallationForRepo(owner, repo);\n if (!installation) {\n throw new Error(`No GitHub App installation found for ${owner}/${repo}`);\n }\n\n const octokit = await this.getInstallationOctokit(installation.installationId);\n\n const branches: string[] = [];\n let page = 1;\n\n while (true) {\n const { data } = await octokit.repos.listBranches({\n owner,\n repo,\n per_page: 100,\n page,\n });\n\n if (data.length === 0) break;\n\n for (const branch of data) {\n if (branch.name.startsWith(prefix)) {\n branches.push(branch.name);\n }\n }\n\n page++;\n }\n\n return branches;\n }\n\n // ─────────────────────────────────────────────────────────────\n // Issue Management\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Create an issue\n */\n async createIssue(\n owner: string,\n repo: string,\n options: CreateIssueOptions\n ): Promise<IssueInfo> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const installation = this.getInstallationForRepo(owner, repo);\n if (!installation) {\n throw new Error(`No GitHub App installation found for ${owner}/${repo}`);\n }\n\n const octokit = await this.getInstallationOctokit(installation.installationId);\n\n const { data: issue } = await octokit.issues.create({\n owner,\n repo,\n title: options.title,\n body: options.body,\n labels: options.labels,\n assignees: options.assignees,\n milestone: options.milestone,\n });\n\n this.log(\n 'info',\n { owner, repo, issueNumber: issue.number, title: options.title },\n 'Issue created'\n );\n\n return {\n number: issue.number,\n url: issue.html_url,\n state: issue.state as IssueState,\n title: issue.title,\n body: issue.body || '',\n labels: issue.labels.map((l: { name?: string } | string) =>\n typeof l === 'string' ? l : l.name || ''\n ),\n assignees: issue.assignees?.map((a: { login: string }) => a.login) || [],\n createdAt: new Date(issue.created_at),\n closedAt: issue.closed_at ? new Date(issue.closed_at) : undefined,\n };\n }\n\n /**\n * Get an issue by number\n */\n async getIssue(owner: string, repo: string, issueNumber: number): Promise<IssueInfo> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const installation = this.getInstallationForRepo(owner, repo);\n if (!installation) {\n throw new Error(`No GitHub App installation found for ${owner}/${repo}`);\n }\n\n const octokit = await this.getInstallationOctokit(installation.installationId);\n\n const { data: issue } = await octokit.issues.get({\n owner,\n repo,\n issue_number: issueNumber,\n });\n\n return {\n number: issue.number,\n url: issue.html_url,\n state: issue.state as IssueState,\n title: issue.title,\n body: issue.body || '',\n labels: issue.labels.map((l: { name?: string } | string) =>\n typeof l === 'string' ? l : l.name || ''\n ),\n assignees: issue.assignees?.map((a: { login: string }) => a.login) || [],\n createdAt: new Date(issue.created_at),\n closedAt: issue.closed_at ? new Date(issue.closed_at) : undefined,\n };\n }\n\n /**\n * List issues with optional filters\n */\n async listIssues(\n owner: string,\n repo: string,\n options?: {\n state?: IssueState | 'all';\n labels?: string[];\n assignee?: string;\n since?: Date;\n }\n ): Promise<IssueInfo[]> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const installation = this.getInstallationForRepo(owner, repo);\n if (!installation) {\n throw new Error(`No GitHub App installation found for ${owner}/${repo}`);\n }\n\n const octokit = await this.getInstallationOctokit(installation.installationId);\n\n const { data: issues } = await octokit.issues.listForRepo({\n owner,\n repo,\n state: options?.state || 'open',\n labels: options?.labels?.join(','),\n assignee: options?.assignee,\n since: options?.since?.toISOString(),\n per_page: 100,\n });\n\n // Filter out pull requests (GitHub API returns PRs as issues)\n return issues\n .filter((issue: { pull_request?: unknown }) => !issue.pull_request)\n .map((issue: {\n number: number;\n html_url: string;\n state: string;\n title: string;\n body: string | null;\n labels: Array<{ name?: string } | string>;\n assignees?: Array<{ login: string }>;\n created_at: string;\n closed_at: string | null;\n }) => ({\n number: issue.number,\n url: issue.html_url,\n state: issue.state as IssueState,\n title: issue.title,\n body: issue.body || '',\n labels: issue.labels.map((l: { name?: string } | string) =>\n typeof l === 'string' ? l : l.name || ''\n ),\n assignees: issue.assignees?.map((a: { login: string }) => a.login) || [],\n createdAt: new Date(issue.created_at),\n closedAt: issue.closed_at ? new Date(issue.closed_at) : undefined,\n }));\n }\n\n /**\n * Update an issue (labels, state, assignees, etc.)\n */\n async updateIssue(\n owner: string,\n repo: string,\n issueNumber: number,\n options: {\n title?: string;\n body?: string;\n state?: IssueState;\n labels?: string[];\n assignees?: string[];\n }\n ): Promise<IssueInfo> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const installation = this.getInstallationForRepo(owner, repo);\n if (!installation) {\n throw new Error(`No GitHub App installation found for ${owner}/${repo}`);\n }\n\n const octokit = await this.getInstallationOctokit(installation.installationId);\n\n const { data: issue } = await octokit.issues.update({\n owner,\n repo,\n issue_number: issueNumber,\n title: options.title,\n body: options.body,\n state: options.state,\n labels: options.labels,\n assignees: options.assignees,\n });\n\n this.log(\n 'info',\n { owner, repo, issueNumber, updates: Object.keys(options) },\n 'Issue updated'\n );\n\n return {\n number: issue.number,\n url: issue.html_url,\n state: issue.state as IssueState,\n title: issue.title,\n body: issue.body || '',\n labels: issue.labels.map((l: { name?: string } | string) =>\n typeof l === 'string' ? l : l.name || ''\n ),\n assignees: issue.assignees?.map((a: { login: string }) => a.login) || [],\n createdAt: new Date(issue.created_at),\n closedAt: issue.closed_at ? new Date(issue.closed_at) : undefined,\n };\n }\n\n /**\n * Add labels to an issue\n */\n async addLabels(\n owner: string,\n repo: string,\n issueNumber: number,\n labels: string[]\n ): Promise<void> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const installation = this.getInstallationForRepo(owner, repo);\n if (!installation) {\n throw new Error(`No GitHub App installation found for ${owner}/${repo}`);\n }\n\n const octokit = await this.getInstallationOctokit(installation.installationId);\n\n await octokit.issues.addLabels({\n owner,\n repo,\n issue_number: issueNumber,\n labels,\n });\n\n this.log('info', { owner, repo, issueNumber, labels }, 'Labels added to issue');\n }\n\n /**\n * Remove a label from an issue\n */\n async removeLabel(\n owner: string,\n repo: string,\n issueNumber: number,\n label: string\n ): Promise<void> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const installation = this.getInstallationForRepo(owner, repo);\n if (!installation) {\n throw new Error(`No GitHub App installation found for ${owner}/${repo}`);\n }\n\n const octokit = await this.getInstallationOctokit(installation.installationId);\n\n await octokit.issues.removeLabel({\n owner,\n repo,\n issue_number: issueNumber,\n name: label,\n });\n\n this.log('info', { owner, repo, issueNumber, label }, 'Label removed from issue');\n }\n\n /**\n * Add a comment to an issue\n */\n async addComment(\n owner: string,\n repo: string,\n issueNumber: number,\n options: IssueCommentOptions\n ): Promise<IssueComment> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const installation = this.getInstallationForRepo(owner, repo);\n if (!installation) {\n throw new Error(`No GitHub App installation found for ${owner}/${repo}`);\n }\n\n const octokit = await this.getInstallationOctokit(installation.installationId);\n\n const { data: comment } = await octokit.issues.createComment({\n owner,\n repo,\n issue_number: issueNumber,\n body: options.body,\n });\n\n this.log('info', { owner, repo, issueNumber, commentId: comment.id }, 'Comment added to issue');\n\n return {\n id: comment.id,\n url: comment.html_url,\n body: comment.body || '',\n author: comment.user?.login || 'unknown',\n createdAt: new Date(comment.created_at),\n };\n }\n\n /**\n * List comments on an issue\n */\n async listComments(\n owner: string,\n repo: string,\n issueNumber: number\n ): Promise<IssueComment[]> {\n if (!this.initialized) {\n await this.initialize();\n }\n\n const installation = this.getInstallationForRepo(owner, repo);\n if (!installation) {\n throw new Error(`No GitHub App installation found for ${owner}/${repo}`);\n }\n\n const octokit = await this.getInstallationOctokit(installation.installationId);\n\n const { data: comments } = await octokit.issues.listComments({\n owner,\n repo,\n issue_number: issueNumber,\n per_page: 100,\n });\n\n return comments.map((comment: {\n id: number;\n html_url: string;\n body: string | undefined;\n user: { login: string } | null;\n created_at: string;\n }) => ({\n id: comment.id,\n url: comment.html_url,\n body: comment.body || '',\n author: comment.user?.login || 'unknown',\n createdAt: new Date(comment.created_at),\n }));\n }\n\n /**\n * Close an issue\n */\n async closeIssue(owner: string, repo: string, issueNumber: number): Promise<IssueInfo> {\n return this.updateIssue(owner, repo, issueNumber, { state: 'closed' });\n }\n\n /**\n * Reopen an issue\n */\n async reopenIssue(owner: string, repo: string, issueNumber: number): Promise<IssueInfo> {\n return this.updateIssue(owner, repo, issueNumber, { state: 'open' });\n }\n\n // ─────────────────────────────────────────────────────────────\n // Private Methods\n // ─────────────────────────────────────────────────────────────\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private async getInstallationOctokit(installationId: number): Promise<any> {\n if (!this.installationOctokits.has(installationId)) {\n const { Octokit, createAppAuth } = loadOctokit();\n\n const octokit = new Octokit({\n authStrategy: createAppAuth,\n auth: {\n appId: this.config.appId,\n privateKey: this.config.privateKey,\n installationId,\n },\n baseUrl: this.config.baseUrl,\n });\n\n this.installationOctokits.set(installationId, octokit);\n }\n\n return this.installationOctokits.get(installationId)!;\n }\n\n private parseRepo(repo: string): { owner: string; repo: string } | null {\n const patterns = [\n /github\\.com[/:]([^/]+)\\/([^/.]+)/,\n /^([^/]+)\\/([^/]+)$/,\n ];\n\n for (const pattern of patterns) {\n const match = repo.match(pattern);\n if (match) {\n return { owner: match[1], repo: match[2].replace(/\\.git$/, '') };\n }\n }\n\n return null;\n }\n\n private log(\n level: 'info' | 'warn' | 'error' | 'debug',\n data: Record<string, unknown>,\n message: string\n ): void {\n if (this.logger) {\n this.logger[level](data, message);\n }\n }\n}\n","/**\n * GitHub PAT Client\n *\n * Simple GitHub API client using a Personal Access Token.\n * Useful for testing and simple integrations without GitHub App setup.\n */\n\nimport type {\n PullRequestInfo,\n IssueInfo,\n CreateIssueOptions,\n IssueComment,\n IssueCommentOptions,\n IssueState,\n} from '../types';\n\n// Lazy-loaded Octokit\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet OctokitClass: any = null;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction loadOctokit(): any {\n if (!OctokitClass) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const { Octokit } = require('@octokit/rest');\n OctokitClass = Octokit;\n } catch {\n throw new Error(\n '@octokit/rest is required for GitHubPatClient. ' +\n 'Install it with: npm install @octokit/rest'\n );\n }\n }\n return OctokitClass;\n}\n\nexport interface GitHubPatClientOptions {\n /**\n * Personal Access Token\n */\n token: string;\n\n /**\n * GitHub API base URL (for GitHub Enterprise)\n */\n baseUrl?: string;\n}\n\nexport interface GitHubPatClientLogger {\n info(data: Record<string, unknown>, message: string): void;\n warn(data: Record<string, unknown>, message: string): void;\n error(data: Record<string, unknown>, message: string): void;\n}\n\n/**\n * Simple GitHub client using a Personal Access Token.\n * Provides PR and Issue management without GitHub App complexity.\n */\nexport class GitHubPatClient {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private octokit: any;\n private readonly logger?: GitHubPatClientLogger;\n\n constructor(options: GitHubPatClientOptions, logger?: GitHubPatClientLogger) {\n this.logger = logger;\n const Octokit = loadOctokit();\n this.octokit = new Octokit({\n auth: options.token,\n baseUrl: options.baseUrl,\n });\n }\n\n // ─────────────────────────────────────────────────────────────\n // Pull Requests\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Create a pull request\n */\n async createPullRequest(\n owner: string,\n repo: string,\n options: {\n title: string;\n body: string;\n head: string;\n base: string;\n draft?: boolean;\n labels?: string[];\n reviewers?: string[];\n }\n ): Promise<PullRequestInfo> {\n const { data: pr } = await this.octokit.pulls.create({\n owner,\n repo,\n title: options.title,\n body: options.body,\n head: options.head,\n base: options.base,\n draft: options.draft,\n });\n\n // Add labels if specified\n if (options.labels && options.labels.length > 0) {\n await this.octokit.issues.addLabels({\n owner,\n repo,\n issue_number: pr.number,\n labels: options.labels,\n });\n }\n\n // Request reviewers if specified\n if (options.reviewers && options.reviewers.length > 0) {\n await this.octokit.pulls.requestReviewers({\n owner,\n repo,\n pull_number: pr.number,\n reviewers: options.reviewers,\n });\n }\n\n this.log('info', { owner, repo, prNumber: pr.number }, 'Pull request created');\n\n return {\n number: pr.number,\n url: pr.html_url,\n state: pr.state as 'open' | 'closed' | 'merged',\n sourceBranch: options.head,\n targetBranch: options.base,\n title: options.title,\n executionId: '',\n createdAt: new Date(pr.created_at),\n };\n }\n\n /**\n * Get a pull request\n */\n async getPullRequest(owner: string, repo: string, prNumber: number): Promise<PullRequestInfo> {\n const { data: pr } = await this.octokit.pulls.get({\n owner,\n repo,\n pull_number: prNumber,\n });\n\n return {\n number: pr.number,\n url: pr.html_url,\n state: pr.merged ? 'merged' : (pr.state as 'open' | 'closed'),\n sourceBranch: pr.head.ref,\n targetBranch: pr.base.ref,\n title: pr.title,\n executionId: '',\n createdAt: new Date(pr.created_at),\n mergedAt: pr.merged_at ? new Date(pr.merged_at) : undefined,\n };\n }\n\n // ─────────────────────────────────────────────────────────────\n // Issues\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Create an issue\n */\n async createIssue(\n owner: string,\n repo: string,\n options: CreateIssueOptions\n ): Promise<IssueInfo> {\n const { data: issue } = await this.octokit.issues.create({\n owner,\n repo,\n title: options.title,\n body: options.body,\n labels: options.labels,\n assignees: options.assignees,\n milestone: options.milestone,\n });\n\n this.log('info', { owner, repo, issueNumber: issue.number }, 'Issue created');\n\n return this.mapIssue(issue);\n }\n\n /**\n * Get an issue\n */\n async getIssue(owner: string, repo: string, issueNumber: number): Promise<IssueInfo> {\n const { data: issue } = await this.octokit.issues.get({\n owner,\n repo,\n issue_number: issueNumber,\n });\n\n return this.mapIssue(issue);\n }\n\n /**\n * List issues\n */\n async listIssues(\n owner: string,\n repo: string,\n options?: {\n state?: IssueState | 'all';\n labels?: string[];\n assignee?: string;\n }\n ): Promise<IssueInfo[]> {\n const { data: issues } = await this.octokit.issues.listForRepo({\n owner,\n repo,\n state: options?.state || 'open',\n labels: options?.labels?.join(','),\n assignee: options?.assignee,\n per_page: 100,\n });\n\n // Filter out pull requests\n return issues\n .filter((issue: { pull_request?: unknown }) => !issue.pull_request)\n .map((issue: Record<string, unknown>) => this.mapIssue(issue));\n }\n\n /**\n * Update an issue\n */\n async updateIssue(\n owner: string,\n repo: string,\n issueNumber: number,\n options: {\n title?: string;\n body?: string;\n state?: IssueState;\n labels?: string[];\n assignees?: string[];\n }\n ): Promise<IssueInfo> {\n const { data: issue } = await this.octokit.issues.update({\n owner,\n repo,\n issue_number: issueNumber,\n ...options,\n });\n\n this.log('info', { owner, repo, issueNumber }, 'Issue updated');\n\n return this.mapIssue(issue);\n }\n\n /**\n * Add labels to an issue\n */\n async addLabels(\n owner: string,\n repo: string,\n issueNumber: number,\n labels: string[]\n ): Promise<void> {\n await this.octokit.issues.addLabels({\n owner,\n repo,\n issue_number: issueNumber,\n labels,\n });\n\n this.log('info', { owner, repo, issueNumber, labels }, 'Labels added');\n }\n\n /**\n * Remove a label from an issue\n */\n async removeLabel(\n owner: string,\n repo: string,\n issueNumber: number,\n label: string\n ): Promise<void> {\n await this.octokit.issues.removeLabel({\n owner,\n repo,\n issue_number: issueNumber,\n name: label,\n });\n\n this.log('info', { owner, repo, issueNumber, label }, 'Label removed');\n }\n\n /**\n * Add a comment to an issue or PR\n */\n async addComment(\n owner: string,\n repo: string,\n issueNumber: number,\n options: IssueCommentOptions\n ): Promise<IssueComment> {\n const { data: comment } = await this.octokit.issues.createComment({\n owner,\n repo,\n issue_number: issueNumber,\n body: options.body,\n });\n\n this.log('info', { owner, repo, issueNumber, commentId: comment.id }, 'Comment added');\n\n return {\n id: comment.id,\n url: comment.html_url,\n body: comment.body || '',\n author: comment.user?.login || 'unknown',\n createdAt: new Date(comment.created_at),\n };\n }\n\n /**\n * List comments on an issue or PR\n */\n async listComments(\n owner: string,\n repo: string,\n issueNumber: number\n ): Promise<IssueComment[]> {\n const { data: comments } = await this.octokit.issues.listComments({\n owner,\n repo,\n issue_number: issueNumber,\n per_page: 100,\n });\n\n return comments.map((comment: {\n id: number;\n html_url: string;\n body?: string;\n user?: { login: string };\n created_at: string;\n }) => ({\n id: comment.id,\n url: comment.html_url,\n body: comment.body || '',\n author: comment.user?.login || 'unknown',\n createdAt: new Date(comment.created_at),\n }));\n }\n\n /**\n * Close an issue\n */\n async closeIssue(owner: string, repo: string, issueNumber: number): Promise<IssueInfo> {\n return this.updateIssue(owner, repo, issueNumber, { state: 'closed' });\n }\n\n /**\n * Reopen an issue\n */\n async reopenIssue(owner: string, repo: string, issueNumber: number): Promise<IssueInfo> {\n return this.updateIssue(owner, repo, issueNumber, { state: 'open' });\n }\n\n // ─────────────────────────────────────────────────────────────\n // Branches\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Delete a branch\n */\n async deleteBranch(owner: string, repo: string, branch: string): Promise<void> {\n await this.octokit.git.deleteRef({\n owner,\n repo,\n ref: `heads/${branch}`,\n });\n\n this.log('info', { owner, repo, branch }, 'Branch deleted');\n }\n\n /**\n * Check if a branch exists\n */\n async branchExists(owner: string, repo: string, branch: string): Promise<boolean> {\n try {\n await this.octokit.repos.getBranch({ owner, repo, branch });\n return true;\n } catch {\n return false;\n }\n }\n\n // ─────────────────────────────────────────────────────────────\n // Private Methods\n // ─────────────────────────────────────────────────────────────\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private mapIssue(issue: any): IssueInfo {\n return {\n number: issue.number,\n url: issue.html_url,\n state: issue.state as IssueState,\n title: issue.title,\n body: issue.body || '',\n labels: issue.labels.map((l: { name?: string } | string) =>\n typeof l === 'string' ? l : l.name || ''\n ),\n assignees: issue.assignees?.map((a: { login: string }) => a.login) || [],\n createdAt: new Date(issue.created_at),\n closedAt: issue.closed_at ? new Date(issue.closed_at) : undefined,\n };\n }\n\n private log(\n level: 'info' | 'warn' | 'error',\n data: Record<string, unknown>,\n message: string\n ): void {\n if (this.logger) {\n this.logger[level](data, message);\n }\n }\n}\n","/**\n * Git Workspace Service Types\n *\n * Types for git workspace provisioning and credential management.\n */\n\n// ─────────────────────────────────────────────────────────────\n// Git Providers\n// ─────────────────────────────────────────────────────────────\n\nexport type GitProvider = 'github' | 'gitlab' | 'bitbucket' | 'azure_devops' | 'self_hosted';\n\nexport type CredentialType = 'github_app' | 'oauth' | 'deploy_key' | 'pat' | 'ssh_key';\n\n// ─────────────────────────────────────────────────────────────\n// Branch Configuration\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Configuration for creating a new branch\n */\nexport interface BranchConfig {\n /**\n * Execution or context ID this branch belongs to\n */\n executionId: string;\n\n /**\n * Role or task identifier\n */\n role: string;\n\n /**\n * Optional slug for human readability\n */\n slug?: string;\n\n /**\n * Base branch to create from\n */\n baseBranch: string;\n}\n\n/**\n * Information about a created branch\n */\nexport interface BranchInfo {\n /**\n * Full branch name (e.g., \"parallax/exec-abc123/engineer-auth\")\n */\n name: string;\n\n /**\n * Execution this branch belongs to\n */\n executionId: string;\n\n /**\n * Base branch it was created from\n */\n baseBranch: string;\n\n /**\n * When the branch was created\n */\n createdAt: Date;\n\n /**\n * Associated PR if one exists\n */\n pullRequest?: PullRequestInfo;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Git Credentials\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Token-based credentials (PAT or OAuth)\n */\nexport interface TokenCredentials {\n /**\n * Type of credential\n */\n type: 'pat' | 'oauth';\n\n /**\n * The credential token\n */\n token: string;\n\n /**\n * Git provider this credential is for (defaults to 'github')\n */\n provider?: GitProvider;\n}\n\n/**\n * SSH-based credentials using system SSH agent\n */\nexport interface SshCredentials {\n /**\n * Type of credential\n */\n type: 'ssh';\n\n /**\n * Git provider this credential is for (defaults to 'github')\n */\n provider?: GitProvider;\n}\n\n/**\n * User-provided credentials passed at execution time.\n * Allows users to supply their own PAT, OAuth token, or use system SSH.\n */\nexport type UserProvidedCredentials = TokenCredentials | SshCredentials;\n\n/**\n * Context for credential requests (for audit trails)\n */\nexport interface CredentialContext {\n executionId: string;\n taskId?: string;\n agentId?: string;\n userId?: string;\n reason?: string;\n}\n\n/**\n * Request for git credentials\n */\nexport interface GitCredentialRequest {\n /**\n * Repository URL or identifier\n */\n repo: string;\n\n /**\n * Required access level\n */\n access: 'read' | 'write';\n\n /**\n * Context for audit trail\n */\n context: CredentialContext;\n\n /**\n * Requested TTL in seconds (max enforced by policy)\n */\n ttlSeconds?: number;\n\n /**\n * User-provided credentials (PAT or OAuth token)\n * If provided, these are used instead of managed credentials\n */\n userProvided?: UserProvidedCredentials;\n\n /**\n * If true, return null instead of throwing when no credentials available.\n * Used for public repositories where authentication is optional.\n */\n optional?: boolean;\n}\n\n/**\n * A git credential grant\n */\nexport interface GitCredential {\n /**\n * Unique ID for this credential grant\n */\n id: string;\n\n /**\n * How to authenticate\n */\n type: CredentialType;\n\n /**\n * The credential value (token, key, etc.)\n */\n token: string;\n\n /**\n * Repository this credential is scoped to\n */\n repo: string;\n\n /**\n * Permissions granted\n */\n permissions: string[];\n\n /**\n * When this credential expires\n */\n expiresAt: Date;\n\n /**\n * Git provider\n */\n provider: GitProvider;\n}\n\n/**\n * Record of a credential grant for auditing\n */\nexport interface CredentialGrant {\n id: string;\n type: CredentialType;\n repo: string;\n provider: GitProvider;\n grantedTo: {\n executionId: string;\n taskId?: string;\n agentId?: string;\n };\n permissions: string[];\n createdAt: Date;\n expiresAt: Date;\n revokedAt?: Date;\n lastUsedAt?: Date;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Workspace\n// ─────────────────────────────────────────────────────────────\n\nexport type BranchStrategy = 'feature_branch' | 'fork' | 'direct';\n\n/**\n * Workspace provisioning strategy\n * - 'clone': Full clone of the repository (default)\n * - 'worktree': Git worktree from an existing clone (faster, shared .git)\n */\nexport type WorkspaceStrategy = 'clone' | 'worktree';\n\nexport type WorkspaceStatus =\n | 'provisioning'\n | 'ready'\n | 'in_use'\n | 'finalizing'\n | 'cleaned_up'\n | 'error';\n\n/**\n * Granular progress phases for workspace operations\n */\nexport type WorkspacePhase =\n | 'initializing'\n | 'cloning'\n | 'creating_branch'\n | 'configuring'\n | 'ready'\n | 'committing'\n | 'pushing'\n | 'creating_pr'\n | 'cleaning_up'\n | 'done'\n | 'error';\n\n/**\n * Progress tracking for workspace operations\n */\nexport interface WorkspaceProgress {\n /**\n * Current phase of the operation\n */\n phase: WorkspacePhase;\n\n /**\n * Human-readable message describing current activity\n */\n message?: string;\n\n /**\n * Progress percentage (0-100) if determinable\n */\n percent?: number;\n\n /**\n * When progress was last updated\n */\n updatedAt: Date;\n}\n\n/**\n * Completion hook configuration\n */\nexport interface CompletionHook {\n /**\n * Shell command to execute on completion\n * Variables available: $WORKSPACE_ID, $REPO, $BRANCH, $STATUS\n */\n command?: string;\n\n /**\n * Webhook URL to POST to on completion\n */\n webhook?: string;\n\n /**\n * Custom headers for webhook request\n */\n webhookHeaders?: Record<string, string>;\n\n /**\n * Whether to run hook on error (default: true)\n */\n runOnError?: boolean;\n}\n\n/**\n * Configuration for provisioning a workspace\n */\nexport interface WorkspaceConfig {\n /**\n * Repository to clone\n */\n repo: string;\n\n /**\n * Git provider\n */\n provider?: GitProvider;\n\n /**\n * Workspace strategy: 'clone' (default) or 'worktree'\n * Worktrees are faster and use less disk space for parallel work on same repo\n */\n strategy?: WorkspaceStrategy;\n\n /**\n * Parent workspace ID (required when strategy is 'worktree')\n * The parent must be a 'clone' workspace for the same repo\n */\n parentWorkspace?: string;\n\n /**\n * Branch strategy\n */\n branchStrategy: BranchStrategy;\n\n /**\n * Base branch to create feature branches from\n */\n baseBranch: string;\n\n /**\n * Execution context\n */\n execution: {\n id: string;\n patternName: string;\n };\n\n /**\n * Task/role requesting the workspace\n */\n task: {\n id: string;\n role: string;\n slug?: string;\n };\n\n /**\n * User context for credential resolution\n */\n user?: {\n id: string;\n oauthToken?: string;\n };\n\n /**\n * User-provided credentials (PAT or OAuth token)\n * If provided, these are used instead of managed credentials\n */\n userCredentials?: UserProvidedCredentials;\n\n /**\n * Hook to run when workspace operations complete\n */\n onComplete?: CompletionHook;\n\n /**\n * Exact branch name to use. If provided, overrides the auto-generated\n * name from prefix/execution/task. The branch is still created from baseBranch.\n */\n branchName?: string;\n}\n\n/**\n * A provisioned git workspace\n */\nexport interface Workspace {\n /**\n * Unique workspace ID\n */\n id: string;\n\n /**\n * Local filesystem path\n */\n path: string;\n\n /**\n * Repository URL\n */\n repo: string;\n\n /**\n * Branch created for this workspace\n */\n branch: BranchInfo;\n\n /**\n * Credential for this workspace.\n * Optional for public repositories (read-only operations).\n * Required for write operations (push, PR creation).\n */\n credential?: GitCredential;\n\n /**\n * When the workspace was provisioned\n */\n provisionedAt: Date;\n\n /**\n * Current status\n */\n status: WorkspaceStatus;\n\n /**\n * Workspace strategy used ('clone' or 'worktree')\n */\n strategy: WorkspaceStrategy;\n\n /**\n * Parent workspace ID (for worktrees)\n */\n parentWorkspaceId?: string;\n\n /**\n * Child worktree IDs (for clone workspaces that have worktrees)\n */\n worktreeIds?: string[];\n\n /**\n * Current progress of workspace operations\n */\n progress?: WorkspaceProgress;\n\n /**\n * Completion hook configuration\n */\n onComplete?: CompletionHook;\n}\n\n/**\n * Options for finalizing a workspace (push, PR creation, cleanup)\n */\nexport interface WorkspaceFinalization {\n /**\n * Whether to push the branch\n */\n push: boolean;\n\n /**\n * Whether to create a PR\n */\n createPr: boolean;\n\n /**\n * PR configuration\n */\n pr?: {\n title: string;\n body: string;\n targetBranch: string;\n draft?: boolean;\n labels?: string[];\n reviewers?: string[];\n };\n\n /**\n * Whether to clean up the workspace after finalization\n */\n cleanup: boolean;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Pull Requests\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Information about a pull request\n */\nexport interface PullRequestInfo {\n /**\n * PR number\n */\n number: number;\n\n /**\n * PR URL\n */\n url: string;\n\n /**\n * PR state\n */\n state: 'open' | 'closed' | 'merged';\n\n /**\n * Source branch\n */\n sourceBranch: string;\n\n /**\n * Target branch\n */\n targetBranch: string;\n\n /**\n * Title\n */\n title: string;\n\n /**\n * Associated execution ID\n */\n executionId: string;\n\n /**\n * Created timestamp\n */\n createdAt: Date;\n\n /**\n * Merged timestamp if merged\n */\n mergedAt?: Date;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Issues\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Issue state\n */\nexport type IssueState = 'open' | 'closed';\n\n/**\n * Information about an issue\n */\nexport interface IssueInfo {\n /**\n * Issue number\n */\n number: number;\n\n /**\n * Issue URL\n */\n url: string;\n\n /**\n * Issue state\n */\n state: IssueState;\n\n /**\n * Issue title\n */\n title: string;\n\n /**\n * Issue body/description\n */\n body: string;\n\n /**\n * Labels on the issue\n */\n labels: string[];\n\n /**\n * Assignees\n */\n assignees: string[];\n\n /**\n * Created timestamp\n */\n createdAt: Date;\n\n /**\n * Closed timestamp if closed\n */\n closedAt?: Date;\n\n /**\n * Associated execution ID (if managed)\n */\n executionId?: string;\n}\n\n/**\n * Options for creating an issue\n */\nexport interface CreateIssueOptions {\n /**\n * Issue title\n */\n title: string;\n\n /**\n * Issue body/description\n */\n body: string;\n\n /**\n * Labels to add\n */\n labels?: string[];\n\n /**\n * Assignees (usernames)\n */\n assignees?: string[];\n\n /**\n * Milestone number\n */\n milestone?: number;\n}\n\n/**\n * Options for commenting on an issue\n */\nexport interface IssueCommentOptions {\n /**\n * Comment body\n */\n body: string;\n}\n\n/**\n * Information about an issue comment\n */\nexport interface IssueComment {\n /**\n * Comment ID\n */\n id: number;\n\n /**\n * Comment URL\n */\n url: string;\n\n /**\n * Comment body\n */\n body: string;\n\n /**\n * Author username\n */\n author: string;\n\n /**\n * Created timestamp\n */\n createdAt: Date;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Agent Permissions & OAuth\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Permission level for a resource\n */\nexport type PermissionLevel = 'none' | 'read' | 'write';\n\n/**\n * Repository access scope\n */\nexport type RepositoryScope =\n | { type: 'all' } // All repositories user has access to\n | { type: 'public' } // Only public repositories\n | { type: 'selected'; repos: string[] }; // Specific repos (owner/repo format)\n\n/**\n * Permissions that an agent can request/receive.\n * Designed to be restrictive by default - dangerous operations require explicit opt-in.\n */\nexport interface AgentPermissions {\n /**\n * Which repositories the agent can access\n */\n repositories: RepositoryScope;\n\n /**\n * Permission for repository contents (code, files)\n */\n contents: PermissionLevel;\n\n /**\n * Permission for pull requests\n */\n pullRequests: PermissionLevel;\n\n /**\n * Permission for issues\n */\n issues: PermissionLevel;\n\n /**\n * Permission for metadata (repo info, branches, tags)\n */\n metadata: PermissionLevel;\n\n // ─────────────────────────────────────────────────────────────\n // Dangerous Operations - Explicit opt-in, default false\n // ─────────────────────────────────────────────────────────────\n\n /**\n * Can delete branches (for cleanup after merge)\n * @default false\n */\n canDeleteBranch?: boolean;\n\n /**\n * Can force push to branches\n * @default false - Almost never needed, can destroy history\n */\n canForcePush?: boolean;\n\n /**\n * Can delete repositories\n * @default false - Should NEVER be true for agents\n */\n canDeleteRepository?: boolean;\n\n /**\n * Can modify repository settings/webhooks\n * @default false\n */\n canAdminister?: boolean;\n}\n\n/**\n * Default safe permissions for agents\n */\nexport const DEFAULT_AGENT_PERMISSIONS: AgentPermissions = {\n repositories: { type: 'selected', repos: [] },\n contents: 'write',\n pullRequests: 'write',\n issues: 'write',\n metadata: 'read',\n canDeleteBranch: true, // Needed for cleanup\n canForcePush: false,\n canDeleteRepository: false,\n canAdminister: false,\n};\n\n/**\n * Read-only permissions for agents that only need to inspect\n */\nexport const READONLY_AGENT_PERMISSIONS: AgentPermissions = {\n repositories: { type: 'selected', repos: [] },\n contents: 'read',\n pullRequests: 'read',\n issues: 'read',\n metadata: 'read',\n canDeleteBranch: false,\n canForcePush: false,\n canDeleteRepository: false,\n canAdminister: false,\n};\n\n/**\n * OAuth token with metadata\n */\nexport interface OAuthToken {\n /**\n * Access token for API calls\n */\n accessToken: string;\n\n /**\n * Token type (usually \"bearer\")\n */\n tokenType: string;\n\n /**\n * Scopes granted by the token\n */\n scopes: string[];\n\n /**\n * When the token expires\n */\n expiresAt?: Date;\n\n /**\n * Refresh token for obtaining new access tokens\n */\n refreshToken?: string;\n\n /**\n * Provider this token is for\n */\n provider: GitProvider;\n\n /**\n * Permissions associated with this token\n */\n permissions: AgentPermissions;\n\n /**\n * When the token was created\n */\n createdAt: Date;\n}\n\n/**\n * Device code response from OAuth provider\n */\nexport interface DeviceCodeResponse {\n /**\n * Code to poll for authorization\n */\n deviceCode: string;\n\n /**\n * Code for user to enter\n */\n userCode: string;\n\n /**\n * URL for user to visit\n */\n verificationUri: string;\n\n /**\n * Full URL with code pre-filled (if supported)\n */\n verificationUriComplete?: string;\n\n /**\n * Seconds until codes expire\n */\n expiresIn: number;\n\n /**\n * Seconds between poll requests\n */\n interval: number;\n}\n\n/**\n * Auth prompt for user interaction\n */\nexport interface AuthPrompt {\n /**\n * Provider requiring auth\n */\n provider: GitProvider;\n\n /**\n * URL to visit\n */\n verificationUri: string;\n\n /**\n * Code to enter\n */\n userCode: string;\n\n /**\n * Seconds until code expires\n */\n expiresIn: number;\n\n /**\n * Permissions being requested\n */\n requestedPermissions: AgentPermissions;\n}\n\n/**\n * Result of auth flow\n */\nexport interface AuthResult {\n /**\n * Whether auth succeeded\n */\n success: boolean;\n\n /**\n * Provider that was authenticated\n */\n provider: GitProvider;\n\n /**\n * Username/identity if successful\n */\n username?: string;\n\n /**\n * Error message if failed\n */\n error?: string;\n}\n\n/**\n * Callback interface for auth prompts\n */\nexport interface AuthPromptEmitter {\n /**\n * Called when user action is required for authentication\n */\n onAuthRequired(prompt: AuthPrompt): void;\n\n /**\n * Called when authentication completes (success or failure)\n */\n onAuthComplete(result: AuthResult): void;\n\n /**\n * Called periodically while waiting for auth (optional)\n */\n onAuthPending?(secondsRemaining: number): void;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Provider Configuration\n// ─────────────────────────────────────────────────────────────\n\n/**\n * GitHub App configuration\n */\nexport interface GitHubAppConfig {\n appId: string;\n privateKey: string;\n webhookSecret?: string;\n}\n\n/**\n * GitHub App installation info\n */\nexport interface GitHubAppInstallation {\n installationId: number;\n accountLogin: string;\n accountType: 'User' | 'Organization';\n repositories: string[];\n permissions: Record<string, string>;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Service Configuration\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Configuration for the workspace service\n */\nexport interface WorkspaceServiceConfig {\n /**\n * Base directory for workspace storage\n */\n baseDir: string;\n\n /**\n * Default TTL for credentials in seconds\n */\n defaultCredentialTtl?: number;\n\n /**\n * Maximum TTL for credentials in seconds\n */\n maxCredentialTtl?: number;\n\n /**\n * Default branch naming prefix\n */\n branchPrefix?: string;\n\n /**\n * GitHub App configuration (optional)\n */\n githubApp?: GitHubAppConfig;\n}\n\n/**\n * Configuration for the credential service\n */\nexport interface CredentialServiceConfig {\n /**\n * Default TTL for credentials in seconds\n */\n defaultTtl?: number;\n\n /**\n * Maximum TTL for credentials in seconds\n */\n maxTtl?: number;\n\n /**\n * GitHub App configuration\n */\n githubApp?: GitHubAppConfig;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Provider Interface\n// ─────────────────────────────────────────────────────────────\n\n/**\n * Interface for git provider implementations\n */\nexport interface GitProviderAdapter {\n /**\n * Provider name\n */\n readonly name: GitProvider;\n\n /**\n * Get credentials for a repository\n */\n getCredentials(request: GitCredentialRequest): Promise<GitCredential>;\n\n /**\n * Revoke a credential\n */\n revokeCredential(credentialId: string): Promise<void>;\n\n /**\n * Create a pull request\n */\n createPullRequest(options: {\n repo: string;\n sourceBranch: string;\n targetBranch: string;\n title: string;\n body: string;\n draft?: boolean;\n labels?: string[];\n reviewers?: string[];\n credential: GitCredential;\n }): Promise<PullRequestInfo>;\n\n /**\n * Check if a branch exists\n */\n branchExists(repo: string, branch: string, credential: GitCredential): Promise<boolean>;\n\n /**\n * Get the default branch for a repository\n */\n getDefaultBranch(repo: string, credential: GitCredential): Promise<string>;\n}\n\n// ─────────────────────────────────────────────────────────────\n// Events\n// ─────────────────────────────────────────────────────────────\n\nexport type WorkspaceEventType =\n | 'workspace:provisioning'\n | 'workspace:ready'\n | 'workspace:error'\n | 'workspace:finalizing'\n | 'workspace:cleaned_up'\n | 'worktree:added'\n | 'worktree:removed'\n | 'credential:granted'\n | 'credential:revoked'\n | 'pr:created'\n | 'pr:merged';\n\nexport interface WorkspaceEvent {\n type: WorkspaceEventType;\n workspaceId?: string;\n credentialId?: string;\n executionId: string;\n timestamp: Date;\n data?: Record<string, unknown>;\n error?: string;\n}\n\nexport type WorkspaceEventHandler = (event: WorkspaceEvent) => void | Promise<void>;\n"]}
|