git-workspace-service 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +416 -0
- package/dist/index.cjs +2425 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1518 -0
- package/dist/index.d.ts +1518 -0
- package/dist/index.js +2377 -0
- package/dist/index.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +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 // 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 Workspace,\n WorkspaceConfig,\n WorkspaceFinalization,\n PullRequestInfo,\n WorkspaceServiceConfig,\n WorkspaceEvent,\n WorkspaceEventHandler,\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 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 },\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\n const workspacePath = path.join(this.baseDir, workspaceId);\n await fs.mkdir(workspacePath, { recursive: true });\n\n // Get credentials\n const 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 // Pass user-provided credentials if available\n userProvided: config.userCredentials,\n });\n\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 // Generate branch name\n const branchInfo = 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\n const workspace: Workspace = {\n id: workspaceId,\n path: workspacePath,\n repo: config.repo,\n branch: branchInfo,\n credential,\n provisionedAt: new Date(),\n status: 'provisioning',\n };\n\n this.workspaces.set(workspaceId, workspace);\n\n try {\n // Clone repository\n await this.cloneRepo(workspace, credential.token);\n\n // Create and checkout branch\n await this.createBranch(workspace);\n\n // Configure git for this workspace\n await this.configureGit(workspace);\n\n workspace.status = 'ready';\n this.workspaces.set(workspaceId, workspace);\n\n this.log(\n 'info',\n {\n workspaceId,\n path: workspacePath,\n branch: branchInfo.name,\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 this.workspaces.set(workspaceId, workspace);\n\n const errorMessage = error instanceof Error ? error.message : String(error);\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 throw error;\n }\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 }, 'Cleaning up workspace');\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 // Revoke credentials\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 // Remove workspace directory\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 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 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 for SSH-based auth (no token = SSH)\n if (!workspace.credential.token) {\n this.log(\n 'debug',\n { workspaceId: workspace.id },\n 'Using SSH authentication, 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 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 // 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 // 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 * 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 */\n async getCredentials(request: GitCredentialRequest): Promise<GitCredential> {\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 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/**\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\nexport type WorkspaceStatus =\n | 'provisioning'\n | 'ready'\n | 'in_use'\n | 'finalizing'\n | 'cleaned_up'\n | 'error';\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 * 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/**\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 */\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/**\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 | '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"]}
|