@eldrforge/kodrdriv 0.0.32 → 0.0.37
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 +46 -69
- package/dist/application.js +146 -0
- package/dist/application.js.map +1 -0
- package/dist/arguments.js +22 -21
- package/dist/arguments.js.map +1 -1
- package/dist/commands/audio-commit.js +43 -21
- package/dist/commands/audio-commit.js.map +1 -1
- package/dist/commands/audio-review.js +46 -38
- package/dist/commands/audio-review.js.map +1 -1
- package/dist/commands/clean.js +28 -12
- package/dist/commands/clean.js.map +1 -1
- package/dist/commands/commit.js +132 -39
- package/dist/commands/commit.js.map +1 -1
- package/dist/commands/link.js +177 -159
- package/dist/commands/link.js.map +1 -1
- package/dist/commands/publish-tree.js +19 -6
- package/dist/commands/publish-tree.js.map +1 -1
- package/dist/commands/publish.js +152 -82
- package/dist/commands/publish.js.map +1 -1
- package/dist/commands/release.js +21 -16
- package/dist/commands/release.js.map +1 -1
- package/dist/commands/review.js +286 -60
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/select-audio.js +25 -8
- package/dist/commands/select-audio.js.map +1 -1
- package/dist/commands/unlink.js +349 -159
- package/dist/commands/unlink.js.map +1 -1
- package/dist/constants.js +14 -5
- package/dist/constants.js.map +1 -1
- package/dist/content/diff.js +7 -5
- package/dist/content/diff.js.map +1 -1
- package/dist/content/log.js +4 -1
- package/dist/content/log.js.map +1 -1
- package/dist/error/CancellationError.js +9 -0
- package/dist/error/CancellationError.js.map +1 -0
- package/dist/error/CommandErrors.js +120 -0
- package/dist/error/CommandErrors.js.map +1 -0
- package/dist/logging.js +55 -12
- package/dist/logging.js.map +1 -1
- package/dist/main.js +6 -131
- package/dist/main.js.map +1 -1
- package/dist/prompt/commit.js +4 -0
- package/dist/prompt/commit.js.map +1 -1
- package/dist/prompt/instructions/commit.md +33 -24
- package/dist/prompt/instructions/release.md +39 -5
- package/dist/prompt/release.js +41 -1
- package/dist/prompt/release.js.map +1 -1
- package/dist/types.js +9 -2
- package/dist/types.js.map +1 -1
- package/dist/util/github.js +97 -12
- package/dist/util/github.js.map +1 -1
- package/dist/util/npmOptimizations.js +174 -0
- package/dist/util/npmOptimizations.js.map +1 -0
- package/dist/util/openai.js +4 -2
- package/dist/util/openai.js.map +1 -1
- package/dist/util/performance.js +202 -0
- package/dist/util/performance.js.map +1 -0
- package/dist/util/safety.js +166 -0
- package/dist/util/safety.js.map +1 -0
- package/dist/util/storage.js +10 -0
- package/dist/util/storage.js.map +1 -1
- package/dist/util/validation.js +81 -0
- package/dist/util/validation.js.map +1 -0
- package/package.json +19 -18
- package/packages/components/package.json +4 -0
- package/packages/tools/package.json +4 -0
- package/packages/utils/package.json +4 -0
- package/scripts/pre-commit-hook.sh +52 -0
- package/test-project/package.json +1 -0
package/dist/util/github.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github.js","sources":["../../src/util/github.ts"],"sourcesContent":["import { Octokit } from '@octokit/rest';\nimport { getLogger } from '../logging';\nimport { PullRequest, MergeMethod } from '../types';\nimport { run } from './child';\nimport { promptConfirmation } from './stdin';\n\nexport const getOctokit = (): Octokit => {\n const logger = getLogger();\n const token = process.env.GITHUB_TOKEN;\n\n if (!token) {\n logger.error('GITHUB_TOKEN environment variable is not set.');\n throw new Error('GITHUB_TOKEN is not set.');\n }\n\n return new Octokit({\n auth: token,\n });\n};\n\nexport const getCurrentBranchName = async (): Promise<string> => {\n const { stdout } = await run('git rev-parse --abbrev-ref HEAD');\n return stdout.trim();\n};\n\nexport const getRepoDetails = async (): Promise<{ owner: string; repo: string }> => {\n const { stdout } = await run('git remote get-url origin');\n const url = stdout.trim();\n // git@github.com:owner/repo.git or https://github.com/owner/repo.git\n const match = url.match(/github\\.com[/:]([\\w-]+)\\/([\\w.-]+)\\.git/);\n if (!match) {\n throw new Error(`Could not parse repository owner and name from origin URL: \"${url}\". Expected format: git@github.com:owner/repo.git or https://github.com/owner/repo.git`);\n }\n return { owner: match[1], repo: match[2] };\n};\n\nexport const createPullRequest = async (\n title: string,\n body: string,\n head: string,\n base: string = 'main'\n): Promise<PullRequest> => {\n const octokit = getOctokit();\n const { owner, repo } = await getRepoDetails();\n\n const response = await octokit.pulls.create({\n owner,\n repo,\n title,\n body,\n head,\n base,\n });\n\n return response.data;\n};\n\nexport const findOpenPullRequestByHeadRef = async (head: string): Promise<PullRequest | null> => {\n const octokit = getOctokit();\n const { owner, repo } = await getRepoDetails();\n const logger = getLogger();\n\n try {\n logger.debug(`Searching for open pull requests with head: ${owner}:${head} in ${owner}/${repo}`);\n\n const response = await octokit.pulls.list({\n owner,\n repo,\n state: 'open',\n head: `${owner}:${head}`,\n });\n\n logger.debug(`Found ${response.data.length} open pull requests`);\n return response.data[0] ?? null;\n } catch (error: any) {\n logger.error(`Failed to find open pull requests: ${error.message}`);\n if (error.status === 404) {\n logger.error(`Repository ${owner}/${repo} not found or access denied. Please check your GITHUB_TOKEN permissions.`);\n }\n throw error;\n }\n};\n\nconst delay = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));\n\n// Check if repository has GitHub Actions workflows configured\nconst hasWorkflowsConfigured = async (): Promise<boolean> => {\n const octokit = getOctokit();\n const { owner, repo } = await getRepoDetails();\n\n try {\n const response = await octokit.actions.listRepoWorkflows({\n owner,\n repo,\n });\n\n return response.data.workflows.length > 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (error: any) {\n // If we can't check workflows (e.g., no Actions permission), assume they might exist\n return true;\n }\n};\n\nexport const waitForPullRequestChecks = async (prNumber: number, options: { timeout?: number; skipUserConfirmation?: boolean } = {}): Promise<void> => {\n const octokit = getOctokit();\n const { owner, repo } = await getRepoDetails();\n const logger = getLogger();\n const timeout = options.timeout || 300000; // 5 minutes default timeout\n const skipUserConfirmation = options.skipUserConfirmation || false;\n\n const startTime = Date.now();\n let consecutiveNoChecksCount = 0;\n const maxConsecutiveNoChecks = 6; // 6 consecutive checks (1 minute) with no checks before asking user\n\n while (true) {\n const elapsedTime = Date.now() - startTime;\n\n // Check for timeout\n if (elapsedTime > timeout) {\n logger.warn(`Timeout reached (${timeout / 1000}s) while waiting for PR #${prNumber} checks.`);\n\n if (!skipUserConfirmation) {\n const proceedWithoutChecks = await promptConfirmation(\n `⚠️ Timeout reached while waiting for PR #${prNumber} checks.\\n` +\n `This might indicate that no checks are configured for this repository.\\n` +\n `Do you want to proceed with merging the PR without waiting for checks?`\n );\n\n if (proceedWithoutChecks) {\n logger.info('User chose to proceed without waiting for checks.');\n return;\n } else {\n throw new Error(`Timeout waiting for PR #${prNumber} checks. User chose not to proceed.`);\n }\n } else {\n throw new Error(`Timeout waiting for PR #${prNumber} checks (${timeout / 1000}s)`);\n }\n }\n\n const pr = await octokit.pulls.get({\n owner,\n repo,\n pull_number: prNumber,\n });\n\n const checkRunsResponse = await octokit.checks.listForRef({\n owner,\n repo,\n ref: pr.data.head.sha,\n });\n\n const checkRuns = checkRunsResponse.data.check_runs;\n\n if (checkRuns.length === 0) {\n consecutiveNoChecksCount++;\n logger.info(`PR #${prNumber}: No checks found (${consecutiveNoChecksCount}/${maxConsecutiveNoChecks}). Waiting...`);\n\n // After several consecutive \"no checks\" responses, check if workflows are configured\n if (consecutiveNoChecksCount >= maxConsecutiveNoChecks) {\n logger.info(`No checks detected for ${maxConsecutiveNoChecks} consecutive attempts. Checking repository configuration...`);\n\n const hasWorkflows = await hasWorkflowsConfigured();\n\n if (!hasWorkflows) {\n logger.warn(`No GitHub Actions workflows found in repository ${owner}/${repo}.`);\n\n if (!skipUserConfirmation) {\n const proceedWithoutChecks = await promptConfirmation(\n `⚠️ No GitHub Actions workflows or checks are configured for this repository.\\n` +\n `PR #${prNumber} will never have status checks to wait for.\\n` +\n `Do you want to proceed with merging the PR without checks?`\n );\n\n if (proceedWithoutChecks) {\n logger.info('User chose to proceed without checks (no workflows configured).');\n return;\n } else {\n throw new Error(`No checks configured for PR #${prNumber}. User chose not to proceed.`);\n }\n } else {\n // In non-interactive mode, proceed if no workflows are configured\n logger.info('No workflows configured, proceeding without checks.');\n return;\n }\n } else {\n logger.info('GitHub Actions workflows are configured. Continuing to wait for checks...');\n consecutiveNoChecksCount = 0; // Reset counter since workflows exist\n }\n }\n\n await delay(10000);\n continue;\n }\n\n // Reset the no-checks counter since we found some checks\n consecutiveNoChecksCount = 0;\n\n const failingChecks = checkRuns.filter(\n (cr) => cr.conclusion && ['failure', 'timed_out', 'cancelled'].includes(cr.conclusion)\n );\n\n if (failingChecks.length > 0) {\n logger.error(`PR #${prNumber} has failing checks:`);\n for (const check of failingChecks) {\n logger.error(`- ${check.name}: ${check.conclusion}`);\n }\n throw new Error(`PR #${prNumber} checks failed.`);\n }\n\n const allChecksCompleted = checkRuns.every((cr) => cr.status === 'completed');\n\n if (allChecksCompleted) {\n logger.info(`All checks for PR #${prNumber} have completed successfully.`);\n return;\n }\n\n const completedCount = checkRuns.filter(cr => cr.status === 'completed').length;\n logger.info(`PR #${prNumber} checks: ${completedCount}/${checkRuns.length} completed. Waiting...`);\n\n await delay(10000); // wait 10 seconds\n }\n};\n\nexport const mergePullRequest = async (prNumber: number, mergeMethod: MergeMethod = 'squash'): Promise<void> => {\n const octokit = getOctokit();\n const { owner, repo } = await getRepoDetails();\n const logger = getLogger();\n\n logger.info(`Merging PR #${prNumber} using ${mergeMethod} method...`);\n const pr = await octokit.pulls.get({\n owner,\n repo,\n pull_number: prNumber,\n });\n const headBranch = pr.data.head.ref;\n\n await octokit.pulls.merge({\n owner,\n repo,\n pull_number: prNumber,\n merge_method: mergeMethod,\n });\n logger.info(`PR #${prNumber} merged using ${mergeMethod} method.`);\n\n logger.info(`Deleting branch ${headBranch}...`);\n await octokit.git.deleteRef({\n owner,\n repo,\n ref: `heads/${headBranch}`,\n });\n logger.info(`Branch ${headBranch} deleted.`);\n};\n\nexport const createRelease = async (tagName: string, title: string, notes: string): Promise<void> => {\n const octokit = getOctokit();\n const { owner, repo } = await getRepoDetails();\n const logger = getLogger();\n\n logger.info(`Creating release for tag ${tagName}...`);\n await octokit.repos.createRelease({\n owner,\n repo,\n tag_name: tagName,\n name: title,\n body: notes,\n });\n logger.info(`Release ${tagName} created.`);\n};\n\nexport const getReleaseByTagName = async (tagName: string): Promise<any> => {\n const octokit = getOctokit();\n const { owner, repo } = await getRepoDetails();\n const logger = getLogger();\n\n try {\n const response = await octokit.repos.getReleaseByTag({\n owner,\n repo,\n tag: tagName,\n });\n\n logger.debug(`Found release for tag ${tagName}: created at ${response.data.created_at}`);\n return response.data;\n } catch (error: any) {\n logger.debug(`Failed to get release for tag ${tagName}: ${error.message}`);\n throw error;\n }\n};\n\nexport const getOpenIssues = async (limit: number = 20): Promise<string> => {\n const octokit = getOctokit();\n const { owner, repo } = await getRepoDetails();\n const logger = getLogger();\n\n try {\n logger.debug(`Fetching up to ${limit} open GitHub issues...`);\n\n const response = await octokit.issues.listForRepo({\n owner,\n repo,\n state: 'open',\n per_page: Math.min(limit, 100), // GitHub API limit\n sort: 'updated',\n direction: 'desc',\n });\n\n const issues = response.data.filter(issue => !issue.pull_request); // Filter out PRs\n\n if (issues.length === 0) {\n logger.debug('No open issues found');\n return '';\n }\n\n const issueStrings = issues.slice(0, limit).map(issue => {\n const labels = issue.labels.map(label =>\n typeof label === 'string' ? label : label.name\n ).join(', ');\n\n return [\n `Issue #${issue.number}: ${issue.title}`,\n `Labels: ${labels || 'none'}`,\n `Created: ${issue.created_at}`,\n `Updated: ${issue.updated_at}`,\n `Body: ${issue.body?.substring(0, 500) || 'No description'}${issue.body && issue.body.length > 500 ? '...' : ''}`,\n '---'\n ].join('\\n');\n });\n\n logger.debug(`Fetched ${issues.length} open issues`);\n return issueStrings.join('\\n\\n');\n } catch (error: any) {\n logger.warn('Failed to fetch GitHub issues: %s', error.message);\n return '';\n }\n};\n\nexport const createIssue = async (\n title: string,\n body: string,\n labels?: string[]\n): Promise<{ number: number; html_url: string }> => {\n const octokit = getOctokit();\n const { owner, repo } = await getRepoDetails();\n\n const response = await octokit.issues.create({\n owner,\n repo,\n title,\n body,\n labels: labels || [],\n });\n\n return {\n number: response.data.number,\n html_url: response.data.html_url,\n };\n};\n\nexport const getWorkflowRunsTriggeredByRelease = async (tagName: string, workflowNames?: string[]): Promise<any[]> => {\n const octokit = getOctokit();\n const { owner, repo } = await getRepoDetails();\n const logger = getLogger();\n\n try {\n logger.debug(`Fetching workflow runs triggered by release ${tagName}...`);\n\n // Get release information to filter by creation time and commit SHA\n let releaseInfo: any;\n try {\n releaseInfo = await getReleaseByTagName(tagName);\n } catch (error: any) {\n logger.warn(`Could not get release info for ${tagName}: ${error.message}. Will use fallback filtering.`);\n }\n\n const releaseCreatedAt = releaseInfo?.created_at;\n const releaseCommitSha = releaseInfo?.target_commitish;\n\n if (releaseCreatedAt) {\n logger.debug(`Release ${tagName} was created at ${releaseCreatedAt}, filtering workflows created after this time`);\n }\n\n // Get all workflows\n const workflowsResponse = await octokit.actions.listRepoWorkflows({\n owner,\n repo,\n });\n\n const relevantWorkflows = workflowsResponse.data.workflows.filter(workflow => {\n // If specific workflow names are provided, only include those\n if (workflowNames && workflowNames.length > 0) {\n return workflowNames.includes(workflow.name);\n }\n // Otherwise, find workflows that trigger on releases\n return true; // We'll filter by event later when we get the runs\n });\n\n logger.debug(`Found ${relevantWorkflows.length} workflows to check`);\n\n const allRuns: any[] = [];\n\n // Get recent workflow runs for each workflow\n for (const workflow of relevantWorkflows) {\n try {\n const runsResponse = await octokit.actions.listWorkflowRuns({\n owner,\n repo,\n workflow_id: workflow.id,\n per_page: 20, // Check more runs to account for filtering\n });\n\n // Filter runs that were triggered by our specific release\n const releaseRuns = runsResponse.data.workflow_runs.filter(run => {\n // Must be a release event\n if (run.event !== 'release') {\n return false;\n }\n\n // Must have required data\n if (!run.head_sha || !run.created_at) {\n return false;\n }\n\n // If we have release info, filter by creation time (only runs created after the release)\n if (releaseCreatedAt) {\n const runCreatedAt = new Date(run.created_at).getTime();\n const releaseCreatedAtTime = new Date(releaseCreatedAt).getTime();\n\n // Only include runs created after or very close to the release (within 1 minute before for clock skew)\n if (runCreatedAt < (releaseCreatedAtTime - 60000)) {\n logger.debug(`Excluding workflow run ${run.id} created before release (run: ${run.created_at}, release: ${releaseCreatedAt})`);\n return false;\n }\n }\n\n // If we have the release commit SHA, prefer runs that match it\n if (releaseCommitSha && run.head_sha !== releaseCommitSha) {\n logger.debug(`Workflow run ${run.id} has different commit SHA (run: ${run.head_sha}, release: ${releaseCommitSha})`);\n // Don't exclude entirely, as the release might trigger workflows on different commits\n // but this helps us prioritize the right runs\n }\n\n return true;\n });\n\n allRuns.push(...releaseRuns);\n\n if (releaseRuns.length > 0) {\n logger.debug(`Found ${releaseRuns.length} relevant workflow runs for ${workflow.name}`);\n }\n } catch (error: any) {\n logger.warn(`Failed to get runs for workflow ${workflow.name}: ${error.message}`);\n }\n }\n\n // Sort by creation time (newest first) and prioritize runs with matching commit SHA\n allRuns.sort((a, b) => {\n // First, prioritize runs with matching commit SHA if we have release info\n if (releaseCommitSha) {\n const aMatches = a.head_sha === releaseCommitSha;\n const bMatches = b.head_sha === releaseCommitSha;\n if (aMatches && !bMatches) return -1;\n if (!aMatches && bMatches) return 1;\n }\n\n // Then sort by creation time (newest first)\n return new Date(b.created_at).getTime() - new Date(a.created_at).getTime();\n });\n\n logger.debug(`Found ${allRuns.length} workflow runs triggered by release ${tagName}`);\n\n if (allRuns.length > 0 && releaseCreatedAt) {\n logger.debug(`Workflow runs created after release ${tagName}:`);\n allRuns.forEach(run => {\n logger.debug(`- ${run.name}: created ${run.created_at}, commit ${run.head_sha?.substring(0, 7)}`);\n });\n }\n\n return allRuns;\n } catch (error: any) {\n logger.warn(`Failed to fetch workflow runs: ${error.message}`);\n return [];\n }\n};\n\nexport const waitForReleaseWorkflows = async (\n tagName: string,\n options: {\n timeout?: number;\n workflowNames?: string[];\n skipUserConfirmation?: boolean;\n } = {}\n): Promise<void> => {\n const logger = getLogger();\n const timeout = options.timeout || 600000; // 10 minutes default\n const skipUserConfirmation = options.skipUserConfirmation || false;\n\n logger.info(`Waiting for workflows triggered by release ${tagName}...`);\n\n // Wait a bit for workflows to start (GitHub can take a moment to trigger them)\n logger.debug('Waiting 30 seconds for workflows to start...');\n await delay(30000);\n\n const startTime = Date.now();\n let workflowRuns: any[] = [];\n let consecutiveNoWorkflowsCount = 0;\n const maxConsecutiveNoWorkflows = 6; // 1 minute of checking before asking user\n\n while (true) {\n const elapsedTime = Date.now() - startTime;\n\n // Check for timeout\n if (elapsedTime > timeout) {\n logger.warn(`Timeout reached (${timeout / 1000}s) while waiting for release workflows.`);\n\n if (!skipUserConfirmation) {\n const proceedWithoutWorkflows = await promptConfirmation(\n `⚠️ Timeout reached while waiting for release workflows for ${tagName}.\\n` +\n `This might indicate that no workflows are configured to trigger on releases.\\n` +\n `Do you want to proceed anyway?`\n );\n\n if (proceedWithoutWorkflows) {\n logger.info('User chose to proceed without waiting for release workflows.');\n return;\n } else {\n throw new Error(`Timeout waiting for release workflows for ${tagName}. User chose not to proceed.`);\n }\n } else {\n throw new Error(`Timeout waiting for release workflows for ${tagName} (${timeout / 1000}s)`);\n }\n }\n\n // Get current workflow runs\n workflowRuns = await getWorkflowRunsTriggeredByRelease(tagName, options.workflowNames);\n\n if (workflowRuns.length === 0) {\n consecutiveNoWorkflowsCount++;\n logger.info(`No release workflows found (${consecutiveNoWorkflowsCount}/${maxConsecutiveNoWorkflows}). Waiting...`);\n\n // After several attempts with no workflows, ask user if they want to continue\n if (consecutiveNoWorkflowsCount >= maxConsecutiveNoWorkflows) {\n logger.warn(`No workflows triggered by release ${tagName} after ${maxConsecutiveNoWorkflows} attempts.`);\n\n if (!skipUserConfirmation) {\n const proceedWithoutWorkflows = await promptConfirmation(\n `⚠️ No GitHub Actions workflows appear to be triggered by the release ${tagName}.\\n` +\n `This might be expected if no workflows are configured for release events.\\n` +\n `Do you want to proceed without waiting for workflows?`\n );\n\n if (proceedWithoutWorkflows) {\n logger.info('User chose to proceed without release workflows.');\n return;\n } else {\n throw new Error(`No release workflows found for ${tagName}. User chose not to proceed.`);\n }\n } else {\n // In non-interactive mode, proceed if no workflows are found\n logger.info('No release workflows found, proceeding.');\n return;\n }\n }\n\n await delay(10000);\n continue;\n }\n\n // Reset counter since we found workflows\n consecutiveNoWorkflowsCount = 0;\n\n // Check status of all workflow runs\n const failingRuns = workflowRuns.filter(run =>\n run.conclusion && ['failure', 'timed_out', 'cancelled'].includes(run.conclusion)\n );\n\n if (failingRuns.length > 0) {\n logger.error(`Release workflows for ${tagName} have failures:`);\n for (const run of failingRuns) {\n logger.error(`- ${run.name}: ${run.conclusion} (${run.html_url})`);\n }\n throw new Error(`Release workflows for ${tagName} failed.`);\n }\n\n const allWorkflowsCompleted = workflowRuns.every(run => run.status === 'completed');\n\n if (allWorkflowsCompleted) {\n const successfulRuns = workflowRuns.filter(run => run.conclusion === 'success');\n logger.info(`All ${workflowRuns.length} release workflows for ${tagName} completed successfully.`);\n for (const run of successfulRuns) {\n logger.info(`✓ ${run.name}: ${run.conclusion}`);\n }\n return;\n }\n\n const completedCount = workflowRuns.filter(run => run.status === 'completed').length;\n const runningCount = workflowRuns.filter(run => run.status === 'in_progress').length;\n const queuedCount = workflowRuns.filter(run => run.status === 'queued').length;\n\n logger.info(\n `Release workflows for ${tagName}: ${completedCount} completed, ${runningCount} running, ${queuedCount} queued (${workflowRuns.length} total)`\n );\n\n await delay(15000); // wait 15 seconds\n }\n};\n\nexport const getWorkflowsTriggeredByRelease = async (): Promise<string[]> => {\n const octokit = getOctokit();\n const { owner, repo } = await getRepoDetails();\n const logger = getLogger();\n\n try {\n logger.debug('Analyzing workflows to find those triggered by release events...');\n\n // Get all workflows\n const workflowsResponse = await octokit.actions.listRepoWorkflows({\n owner,\n repo,\n });\n\n const releaseWorkflows: string[] = [];\n\n // Check each workflow's configuration\n for (const workflow of workflowsResponse.data.workflows) {\n try {\n // Get the workflow file content\n const workflowPath = workflow.path;\n logger.debug(`Analyzing workflow: ${workflow.name} (${workflowPath})`);\n\n const contentResponse = await octokit.repos.getContent({\n owner,\n repo,\n path: workflowPath,\n });\n\n // Handle the response - it could be a file or directory\n if ('content' in contentResponse.data && contentResponse.data.type === 'file') {\n // Decode the base64 content\n const content = Buffer.from(contentResponse.data.content, 'base64').toString('utf-8');\n\n // Parse the YAML to check trigger conditions\n if (isTriggeredByRelease(content, workflow.name)) {\n logger.debug(`✓ Workflow \"${workflow.name}\" will be triggered by release events`);\n releaseWorkflows.push(workflow.name);\n } else {\n logger.debug(`✗ Workflow \"${workflow.name}\" will not be triggered by release events`);\n }\n } else {\n logger.warn(`Could not read content for workflow ${workflow.name}`);\n }\n } catch (error: any) {\n logger.warn(`Failed to analyze workflow ${workflow.name}: ${error.message}`);\n }\n }\n\n logger.info(`Found ${releaseWorkflows.length} workflows that will be triggered by release events: ${releaseWorkflows.join(', ')}`);\n return releaseWorkflows;\n } catch (error: any) {\n logger.error(`Failed to analyze workflows: ${error.message}`);\n return [];\n }\n};\n\nconst isTriggeredByRelease = (workflowContent: string, workflowName: string): boolean => {\n const logger = getLogger();\n\n try {\n // Simple regex-based parsing since we don't want to add a YAML dependency\n // Look for common release trigger patterns\n\n // Pattern 1: on.release (with or without types)\n // on:\n // release:\n // types: [published, created, ...]\n const releaseEventPattern = /(?:^|\\n)\\s*on\\s*:\\s*(?:\\n|\\r\\n)(?:\\s+[^\\S\\r\\n]+)*(?:\\s+release\\s*:)/m;\n\n // Pattern 2: on: [push, release] or on: release\n const onReleasePattern = /(?:^|\\n)\\s*on\\s*:\\s*(?:\\[.*release.*\\]|release)\\s*(?:\\n|$)/m;\n\n // Pattern 3: push with tag patterns that look like releases\n // on:\n // push:\n // tags:\n // - 'v*'\n // - 'release/*'\n const tagPushPattern = /(?:^|\\r?\\n)[^\\S\\r\\n]*on\\s*:\\s*\\r?\\n(?:[^\\S\\r\\n]*[^\\r\\n]+(?:\\r?\\n))*?[^\\S\\r\\n]*push\\s*:\\s*\\r?\\n(?:[^\\S\\r\\n]*tags\\s*:\\s*(?:\\r?\\n|\\[)[^\\]\\r\\n]*(?:v\\*|release|tag)[^\\]\\r\\n]*)/mi;\n\n const isTriggered = releaseEventPattern.test(workflowContent) ||\n onReleasePattern.test(workflowContent) ||\n tagPushPattern.test(workflowContent);\n\n if (isTriggered) {\n logger.debug(`Workflow \"${workflowName}\" trigger patterns detected in content`);\n }\n\n return isTriggered;\n } catch (error: any) {\n logger.warn(`Failed to parse workflow content for ${workflowName}: ${error.message}`);\n return false;\n }\n};\n"],"names":["getOctokit","logger","getLogger","token","process","env","GITHUB_TOKEN","error","Error","Octokit","auth","getCurrentBranchName","stdout","run","trim","getRepoDetails","url","match","owner","repo","createPullRequest","title","body","head","base","octokit","response","pulls","create","data","findOpenPullRequestByHeadRef","debug","list","state","length","message","status","delay","ms","Promise","resolve","setTimeout","hasWorkflowsConfigured","actions","listRepoWorkflows","workflows","waitForPullRequestChecks","prNumber","options","timeout","skipUserConfirmation","startTime","Date","now","consecutiveNoChecksCount","maxConsecutiveNoChecks","elapsedTime","warn","proceedWithoutChecks","promptConfirmation","info","pr","get","pull_number","checkRunsResponse","checks","listForRef","ref","sha","checkRuns","check_runs","hasWorkflows","failingChecks","filter","cr","conclusion","includes","check","name","allChecksCompleted","every","completedCount","mergePullRequest","mergeMethod","headBranch","merge","merge_method","git","deleteRef","createRelease","tagName","notes","repos","tag_name","getReleaseByTagName","getReleaseByTag","tag","created_at","getOpenIssues","limit","issues","listForRepo","per_page","Math","min","sort","direction","issue","pull_request","issueStrings","slice","map","labels","label","join","number","updated_at","substring","createIssue","html_url","getWorkflowRunsTriggeredByRelease","workflowNames","releaseInfo","releaseCreatedAt","releaseCommitSha","target_commitish","workflowsResponse","relevantWorkflows","workflow","allRuns","runsResponse","listWorkflowRuns","workflow_id","id","releaseRuns","workflow_runs","event","head_sha","runCreatedAt","getTime","releaseCreatedAtTime","push","a","b","aMatches","bMatches","forEach","waitForReleaseWorkflows","workflowRuns","consecutiveNoWorkflowsCount","maxConsecutiveNoWorkflows","proceedWithoutWorkflows","failingRuns","allWorkflowsCompleted","successfulRuns","runningCount","queuedCount","getWorkflowsTriggeredByRelease","releaseWorkflows","workflowPath","path","contentResponse","getContent","type","content","Buffer","from","toString","isTriggeredByRelease","workflowContent","workflowName","releaseEventPattern","onReleasePattern","tagPushPattern","isTriggered","test"],"mappings":";;;;;MAMaA,UAAAA,GAAa,IAAA;AACtB,IAAA,MAAMC,MAAAA,GAASC,SAAAA,EAAAA;AACf,IAAA,MAAMC,KAAAA,GAAQC,OAAAA,CAAQC,GAAG,CAACC,YAAY;AAEtC,IAAA,IAAI,CAACH,KAAAA,EAAO;AACRF,QAAAA,MAAAA,CAAOM,KAAK,CAAC,+CAAA,CAAA;AACb,QAAA,MAAM,IAAIC,KAAAA,CAAM,0BAAA,CAAA;AACpB,IAAA;AAEA,IAAA,OAAO,IAAIC,OAAAA,CAAQ;QACfC,IAAAA,EAAMP;AACV,KAAA,CAAA;AACJ;MAEaQ,oBAAAA,GAAuB,UAAA;AAChC,IAAA,MAAM,EAAEC,MAAM,EAAE,GAAG,MAAMC,GAAAA,CAAI,iCAAA,CAAA;AAC7B,IAAA,OAAOD,OAAOE,IAAI,EAAA;AACtB;MAEaC,cAAAA,GAAiB,UAAA;AAC1B,IAAA,MAAM,EAAEH,MAAM,EAAE,GAAG,MAAMC,GAAAA,CAAI,2BAAA,CAAA;IAC7B,MAAMG,GAAAA,GAAMJ,OAAOE,IAAI,EAAA;;IAEvB,MAAMG,KAAAA,GAAQD,GAAAA,CAAIC,KAAK,CAAC,yCAAA,CAAA;AACxB,IAAA,IAAI,CAACA,KAAAA,EAAO;AACR,QAAA,MAAM,IAAIT,KAAAA,CAAM,CAAC,4DAA4D,EAAEQ,GAAAA,CAAI,sFAAsF,CAAC,CAAA;AAC9K,IAAA;IACA,OAAO;QAAEE,KAAAA,EAAOD,KAAK,CAAC,CAAA,CAAE;QAAEE,IAAAA,EAAMF,KAAK,CAAC,CAAA;AAAG,KAAA;AAC7C;MAEaG,iBAAAA,GAAoB,OAC7BC,OACAC,IAAAA,EACAC,IAAAA,EACAC,OAAe,MAAM,GAAA;AAErB,IAAA,MAAMC,OAAAA,GAAUzB,UAAAA,EAAAA;AAChB,IAAA,MAAM,EAAEkB,KAAK,EAAEC,IAAI,EAAE,GAAG,MAAMJ,cAAAA,EAAAA;AAE9B,IAAA,MAAMW,WAAW,MAAMD,OAAAA,CAAQE,KAAK,CAACC,MAAM,CAAC;AACxCV,QAAAA,KAAAA;AACAC,QAAAA,IAAAA;AACAE,QAAAA,KAAAA;AACAC,QAAAA,IAAAA;AACAC,QAAAA,IAAAA;AACAC,QAAAA;AACJ,KAAA,CAAA;AAEA,IAAA,OAAOE,SAASG,IAAI;AACxB;AAEO,MAAMC,+BAA+B,OAAOP,IAAAA,GAAAA;AAC/C,IAAA,MAAME,OAAAA,GAAUzB,UAAAA,EAAAA;AAChB,IAAA,MAAM,EAAEkB,KAAK,EAAEC,IAAI,EAAE,GAAG,MAAMJ,cAAAA,EAAAA;AAC9B,IAAA,MAAMd,MAAAA,GAASC,SAAAA,EAAAA;IAEf,IAAI;AACAD,QAAAA,MAAAA,CAAO8B,KAAK,CAAC,CAAC,4CAA4C,EAAEb,KAAAA,CAAM,CAAC,EAAEK,IAAAA,CAAK,IAAI,EAAEL,KAAAA,CAAM,CAAC,EAAEC,IAAAA,CAAAA,CAAM,CAAA;AAE/F,QAAA,MAAMO,WAAW,MAAMD,OAAAA,CAAQE,KAAK,CAACK,IAAI,CAAC;AACtCd,YAAAA,KAAAA;AACAC,YAAAA,IAAAA;YACAc,KAAAA,EAAO,MAAA;AACPV,YAAAA,IAAAA,EAAM,CAAA,EAAGL,KAAAA,CAAM,CAAC,EAAEK,IAAAA,CAAAA;AACtB,SAAA,CAAA;QAEAtB,MAAAA,CAAO8B,KAAK,CAAC,CAAC,MAAM,EAAEL,QAAAA,CAASG,IAAI,CAACK,MAAM,CAAC,mBAAmB,CAAC,CAAA;AACxDR,QAAAA,IAAAA,eAAAA;QAAP,OAAOA,CAAAA,kBAAAA,QAAAA,CAASG,IAAI,CAAC,CAAA,CAAE,MAAA,IAAA,IAAhBH,6BAAAA,eAAAA,GAAoB,IAAA;AAC/B,IAAA,CAAA,CAAE,OAAOnB,KAAAA,EAAY;AACjBN,QAAAA,MAAAA,CAAOM,KAAK,CAAC,CAAC,mCAAmC,EAAEA,KAAAA,CAAM4B,OAAO,CAAA,CAAE,CAAA;QAClE,IAAI5B,KAAAA,CAAM6B,MAAM,KAAK,GAAA,EAAK;YACtBnC,MAAAA,CAAOM,KAAK,CAAC,CAAC,WAAW,EAAEW,MAAM,CAAC,EAAEC,IAAAA,CAAK,wEAAwE,CAAC,CAAA;AACtH,QAAA;QACA,MAAMZ,KAAAA;AACV,IAAA;AACJ;AAEA,MAAM8B,KAAAA,GAAQ,CAACC,EAAAA,GAAe,IAAIC,QAAQC,CAAAA,OAAAA,GAAWC,WAAWD,OAAAA,EAASF,EAAAA,CAAAA,CAAAA;AAEzE;AACA,MAAMI,sBAAAA,GAAyB,UAAA;AAC3B,IAAA,MAAMjB,OAAAA,GAAUzB,UAAAA,EAAAA;AAChB,IAAA,MAAM,EAAEkB,KAAK,EAAEC,IAAI,EAAE,GAAG,MAAMJ,cAAAA,EAAAA;IAE9B,IAAI;AACA,QAAA,MAAMW,WAAW,MAAMD,OAAAA,CAAQkB,OAAO,CAACC,iBAAiB,CAAC;AACrD1B,YAAAA,KAAAA;AACAC,YAAAA;AACJ,SAAA,CAAA;AAEA,QAAA,OAAOO,SAASG,IAAI,CAACgB,SAAS,CAACX,MAAM,GAAG,CAAA;;AAE5C,IAAA,CAAA,CAAE,OAAO3B,KAAAA,EAAY;;QAEjB,OAAO,IAAA;AACX,IAAA;AACJ,CAAA;MAEauC,wBAAAA,GAA2B,OAAOC,QAAAA,EAAkBC,OAAAA,GAAgE,EAAE,GAAA;AAC/H,IAAA,MAAMvB,OAAAA,GAAUzB,UAAAA,EAAAA;AAChB,IAAA,MAAM,EAAEkB,KAAK,EAAEC,IAAI,EAAE,GAAG,MAAMJ,cAAAA,EAAAA;AAC9B,IAAA,MAAMd,MAAAA,GAASC,SAAAA,EAAAA;AACf,IAAA,MAAM+C,OAAAA,GAAUD,OAAAA,CAAQC,OAAO,IAAI;IACnC,MAAMC,oBAAAA,GAAuBF,OAAAA,CAAQE,oBAAoB,IAAI,KAAA;IAE7D,MAAMC,SAAAA,GAAYC,KAAKC,GAAG,EAAA;AAC1B,IAAA,IAAIC,wBAAAA,GAA2B,CAAA;IAC/B,MAAMC,sBAAAA,GAAyB;AAE/B,IAAA,MAAO,IAAA,CAAM;QACT,MAAMC,WAAAA,GAAcJ,IAAAA,CAAKC,GAAG,EAAA,GAAKF,SAAAA;;AAGjC,QAAA,IAAIK,cAAcP,OAAAA,EAAS;YACvBhD,MAAAA,CAAOwD,IAAI,CAAC,CAAC,iBAAiB,EAAER,OAAAA,GAAU,IAAA,CAAK,yBAAyB,EAAEF,QAAAA,CAAS,QAAQ,CAAC,CAAA;AAE5F,YAAA,IAAI,CAACG,oBAAAA,EAAsB;AACvB,gBAAA,MAAMQ,uBAAuB,MAAMC,kBAAAA,CAC/B,CAAC,0CAA0C,EAAEZ,QAAAA,CAAS,UAAU,CAAC,GACjE,CAAC,wEAAwE,CAAC,GAC1E,CAAC,sEAAsE,CAAC,CAAA;AAG5E,gBAAA,IAAIW,oBAAAA,EAAsB;AACtBzD,oBAAAA,MAAAA,CAAO2D,IAAI,CAAC,mDAAA,CAAA;AACZ,oBAAA;gBACJ,CAAA,MAAO;AACH,oBAAA,MAAM,IAAIpD,KAAAA,CAAM,CAAC,wBAAwB,EAAEuC,QAAAA,CAAS,mCAAmC,CAAC,CAAA;AAC5F,gBAAA;YACJ,CAAA,MAAO;gBACH,MAAM,IAAIvC,KAAAA,CAAM,CAAC,wBAAwB,EAAEuC,QAAAA,CAAS,SAAS,EAAEE,OAAAA,GAAU,IAAA,CAAK,EAAE,CAAC,CAAA;AACrF,YAAA;AACJ,QAAA;AAEA,QAAA,MAAMY,KAAK,MAAMpC,OAAAA,CAAQE,KAAK,CAACmC,GAAG,CAAC;AAC/B5C,YAAAA,KAAAA;AACAC,YAAAA,IAAAA;YACA4C,WAAAA,EAAahB;AACjB,SAAA,CAAA;AAEA,QAAA,MAAMiB,oBAAoB,MAAMvC,OAAAA,CAAQwC,MAAM,CAACC,UAAU,CAAC;AACtDhD,YAAAA,KAAAA;AACAC,YAAAA,IAAAA;AACAgD,YAAAA,GAAAA,EAAKN,EAAAA,CAAGhC,IAAI,CAACN,IAAI,CAAC6C;AACtB,SAAA,CAAA;AAEA,QAAA,MAAMC,SAAAA,GAAYL,iBAAAA,CAAkBnC,IAAI,CAACyC,UAAU;QAEnD,IAAID,SAAAA,CAAUnC,MAAM,KAAK,CAAA,EAAG;AACxBoB,YAAAA,wBAAAA,EAAAA;AACArD,YAAAA,MAAAA,CAAO2D,IAAI,CAAC,CAAC,IAAI,EAAEb,QAAAA,CAAS,mBAAmB,EAAEO,wBAAAA,CAAyB,CAAC,EAAEC,sBAAAA,CAAuB,aAAa,CAAC,CAAA;;AAGlH,YAAA,IAAID,4BAA4BC,sBAAAA,EAAwB;AACpDtD,gBAAAA,MAAAA,CAAO2D,IAAI,CAAC,CAAC,uBAAuB,EAAEL,sBAAAA,CAAuB,2DAA2D,CAAC,CAAA;AAEzH,gBAAA,MAAMgB,eAAe,MAAM7B,sBAAAA,EAAAA;AAE3B,gBAAA,IAAI,CAAC6B,YAAAA,EAAc;oBACftE,MAAAA,CAAOwD,IAAI,CAAC,CAAC,gDAAgD,EAAEvC,MAAM,CAAC,EAAEC,IAAAA,CAAK,CAAC,CAAC,CAAA;AAE/E,oBAAA,IAAI,CAAC+B,oBAAAA,EAAsB;AACvB,wBAAA,MAAMQ,uBAAuB,MAAMC,kBAAAA,CAC/B,CAAC,+EAA+E,CAAC,GACjF,CAAC,IAAI,EAAEZ,SAAS,6CAA6C,CAAC,GAC9D,CAAC,0DAA0D,CAAC,CAAA;AAGhE,wBAAA,IAAIW,oBAAAA,EAAsB;AACtBzD,4BAAAA,MAAAA,CAAO2D,IAAI,CAAC,iEAAA,CAAA;AACZ,4BAAA;wBACJ,CAAA,MAAO;AACH,4BAAA,MAAM,IAAIpD,KAAAA,CAAM,CAAC,6BAA6B,EAAEuC,QAAAA,CAAS,4BAA4B,CAAC,CAAA;AAC1F,wBAAA;oBACJ,CAAA,MAAO;;AAEH9C,wBAAAA,MAAAA,CAAO2D,IAAI,CAAC,qDAAA,CAAA;AACZ,wBAAA;AACJ,oBAAA;gBACJ,CAAA,MAAO;AACH3D,oBAAAA,MAAAA,CAAO2D,IAAI,CAAC,2EAAA,CAAA;AACZN,oBAAAA,wBAAAA,GAA2B;AAC/B,gBAAA;AACJ,YAAA;AAEA,YAAA,MAAMjB,KAAAA,CAAM,KAAA,CAAA;AACZ,YAAA;AACJ,QAAA;;QAGAiB,wBAAAA,GAA2B,CAAA;QAE3B,MAAMkB,aAAAA,GAAgBH,UAAUI,MAAM,CAClC,CAACC,EAAAA,GAAOA,EAAAA,CAAGC,UAAU,IAAI;AAAC,gBAAA,SAAA;AAAW,gBAAA,WAAA;AAAa,gBAAA;aAAY,CAACC,QAAQ,CAACF,EAAAA,CAAGC,UAAU,CAAA,CAAA;QAGzF,IAAIH,aAAAA,CAActC,MAAM,GAAG,CAAA,EAAG;AAC1BjC,YAAAA,MAAAA,CAAOM,KAAK,CAAC,CAAC,IAAI,EAAEwC,QAAAA,CAAS,oBAAoB,CAAC,CAAA;YAClD,KAAK,MAAM8B,SAASL,aAAAA,CAAe;AAC/BvE,gBAAAA,MAAAA,CAAOM,KAAK,CAAC,CAAC,EAAE,EAAEsE,KAAAA,CAAMC,IAAI,CAAC,EAAE,EAAED,KAAAA,CAAMF,UAAU,CAAA,CAAE,CAAA;AACvD,YAAA;AACA,YAAA,MAAM,IAAInE,KAAAA,CAAM,CAAC,IAAI,EAAEuC,QAAAA,CAAS,eAAe,CAAC,CAAA;AACpD,QAAA;QAEA,MAAMgC,kBAAAA,GAAqBV,UAAUW,KAAK,CAAC,CAACN,EAAAA,GAAOA,EAAAA,CAAGtC,MAAM,KAAK,WAAA,CAAA;AAEjE,QAAA,IAAI2C,kBAAAA,EAAoB;AACpB9E,YAAAA,MAAAA,CAAO2D,IAAI,CAAC,CAAC,mBAAmB,EAAEb,QAAAA,CAAS,6BAA6B,CAAC,CAAA;AACzE,YAAA;AACJ,QAAA;QAEA,MAAMkC,cAAAA,GAAiBZ,SAAAA,CAAUI,MAAM,CAACC,CAAAA,KAAMA,EAAAA,CAAGtC,MAAM,KAAK,WAAA,CAAA,CAAaF,MAAM;AAC/EjC,QAAAA,MAAAA,CAAO2D,IAAI,CAAC,CAAC,IAAI,EAAEb,QAAAA,CAAS,SAAS,EAAEkC,cAAAA,CAAe,CAAC,EAAEZ,SAAAA,CAAUnC,MAAM,CAAC,sBAAsB,CAAC,CAAA;QAEjG,MAAMG,KAAAA,CAAM;AAChB,IAAA;AACJ;AAEO,MAAM6C,gBAAAA,GAAmB,OAAOnC,QAAAA,EAAkBoC,cAA2B,QAAQ,GAAA;AACxF,IAAA,MAAM1D,OAAAA,GAAUzB,UAAAA,EAAAA;AAChB,IAAA,MAAM,EAAEkB,KAAK,EAAEC,IAAI,EAAE,GAAG,MAAMJ,cAAAA,EAAAA;AAC9B,IAAA,MAAMd,MAAAA,GAASC,SAAAA,EAAAA;IAEfD,MAAAA,CAAO2D,IAAI,CAAC,CAAC,YAAY,EAAEb,SAAS,OAAO,EAAEoC,WAAAA,CAAY,UAAU,CAAC,CAAA;AACpE,IAAA,MAAMtB,KAAK,MAAMpC,OAAAA,CAAQE,KAAK,CAACmC,GAAG,CAAC;AAC/B5C,QAAAA,KAAAA;AACAC,QAAAA,IAAAA;QACA4C,WAAAA,EAAahB;AACjB,KAAA,CAAA;AACA,IAAA,MAAMqC,aAAavB,EAAAA,CAAGhC,IAAI,CAACN,IAAI,CAAC4C,GAAG;AAEnC,IAAA,MAAM1C,OAAAA,CAAQE,KAAK,CAAC0D,KAAK,CAAC;AACtBnE,QAAAA,KAAAA;AACAC,QAAAA,IAAAA;QACA4C,WAAAA,EAAahB,QAAAA;QACbuC,YAAAA,EAAcH;AAClB,KAAA,CAAA;IACAlF,MAAAA,CAAO2D,IAAI,CAAC,CAAC,IAAI,EAAEb,SAAS,cAAc,EAAEoC,WAAAA,CAAY,QAAQ,CAAC,CAAA;AAEjElF,IAAAA,MAAAA,CAAO2D,IAAI,CAAC,CAAC,gBAAgB,EAAEwB,UAAAA,CAAW,GAAG,CAAC,CAAA;AAC9C,IAAA,MAAM3D,OAAAA,CAAQ8D,GAAG,CAACC,SAAS,CAAC;AACxBtE,QAAAA,KAAAA;AACAC,QAAAA,IAAAA;QACAgD,GAAAA,EAAK,CAAC,MAAM,EAAEiB,UAAAA,CAAAA;AAClB,KAAA,CAAA;AACAnF,IAAAA,MAAAA,CAAO2D,IAAI,CAAC,CAAC,OAAO,EAAEwB,UAAAA,CAAW,SAAS,CAAC,CAAA;AAC/C;AAEO,MAAMK,aAAAA,GAAgB,OAAOC,OAAAA,EAAiBrE,KAAAA,EAAesE,KAAAA,GAAAA;AAChE,IAAA,MAAMlE,OAAAA,GAAUzB,UAAAA,EAAAA;AAChB,IAAA,MAAM,EAAEkB,KAAK,EAAEC,IAAI,EAAE,GAAG,MAAMJ,cAAAA,EAAAA;AAC9B,IAAA,MAAMd,MAAAA,GAASC,SAAAA,EAAAA;AAEfD,IAAAA,MAAAA,CAAO2D,IAAI,CAAC,CAAC,yBAAyB,EAAE8B,OAAAA,CAAQ,GAAG,CAAC,CAAA;AACpD,IAAA,MAAMjE,OAAAA,CAAQmE,KAAK,CAACH,aAAa,CAAC;AAC9BvE,QAAAA,KAAAA;AACAC,QAAAA,IAAAA;QACA0E,QAAAA,EAAUH,OAAAA;QACVZ,IAAAA,EAAMzD,KAAAA;QACNC,IAAAA,EAAMqE;AACV,KAAA,CAAA;AACA1F,IAAAA,MAAAA,CAAO2D,IAAI,CAAC,CAAC,QAAQ,EAAE8B,OAAAA,CAAQ,SAAS,CAAC,CAAA;AAC7C;AAEO,MAAMI,sBAAsB,OAAOJ,OAAAA,GAAAA;AACtC,IAAA,MAAMjE,OAAAA,GAAUzB,UAAAA,EAAAA;AAChB,IAAA,MAAM,EAAEkB,KAAK,EAAEC,IAAI,EAAE,GAAG,MAAMJ,cAAAA,EAAAA;AAC9B,IAAA,MAAMd,MAAAA,GAASC,SAAAA,EAAAA;IAEf,IAAI;AACA,QAAA,MAAMwB,WAAW,MAAMD,OAAAA,CAAQmE,KAAK,CAACG,eAAe,CAAC;AACjD7E,YAAAA,KAAAA;AACAC,YAAAA,IAAAA;YACA6E,GAAAA,EAAKN;AACT,SAAA,CAAA;AAEAzF,QAAAA,MAAAA,CAAO8B,KAAK,CAAC,CAAC,sBAAsB,EAAE2D,OAAAA,CAAQ,aAAa,EAAEhE,QAAAA,CAASG,IAAI,CAACoE,UAAU,CAAA,CAAE,CAAA;AACvF,QAAA,OAAOvE,SAASG,IAAI;AACxB,IAAA,CAAA,CAAE,OAAOtB,KAAAA,EAAY;QACjBN,MAAAA,CAAO8B,KAAK,CAAC,CAAC,8BAA8B,EAAE2D,QAAQ,EAAE,EAAEnF,KAAAA,CAAM4B,OAAO,CAAA,CAAE,CAAA;QACzE,MAAM5B,KAAAA;AACV,IAAA;AACJ;AAEO,MAAM2F,aAAAA,GAAgB,OAAOC,KAAAA,GAAgB,EAAE,GAAA;AAClD,IAAA,MAAM1E,OAAAA,GAAUzB,UAAAA,EAAAA;AAChB,IAAA,MAAM,EAAEkB,KAAK,EAAEC,IAAI,EAAE,GAAG,MAAMJ,cAAAA,EAAAA;AAC9B,IAAA,MAAMd,MAAAA,GAASC,SAAAA,EAAAA;IAEf,IAAI;AACAD,QAAAA,MAAAA,CAAO8B,KAAK,CAAC,CAAC,eAAe,EAAEoE,KAAAA,CAAM,sBAAsB,CAAC,CAAA;AAE5D,QAAA,MAAMzE,WAAW,MAAMD,OAAAA,CAAQ2E,MAAM,CAACC,WAAW,CAAC;AAC9CnF,YAAAA,KAAAA;AACAC,YAAAA,IAAAA;YACAc,KAAAA,EAAO,MAAA;YACPqE,QAAAA,EAAUC,IAAAA,CAAKC,GAAG,CAACL,KAAAA,EAAO,GAAA,CAAA;YAC1BM,IAAAA,EAAM,SAAA;YACNC,SAAAA,EAAW;AACf,SAAA,CAAA;AAEA,QAAA,MAAMN,MAAAA,GAAS1E,QAAAA,CAASG,IAAI,CAAC4C,MAAM,CAACkC,CAAAA,KAAAA,GAAS,CAACA,KAAAA,CAAMC,YAAY,CAAA,CAAA;QAEhE,IAAIR,MAAAA,CAAOlE,MAAM,KAAK,CAAA,EAAG;AACrBjC,YAAAA,MAAAA,CAAO8B,KAAK,CAAC,sBAAA,CAAA;YACb,OAAO,EAAA;AACX,QAAA;QAEA,MAAM8E,YAAAA,GAAeT,OAAOU,KAAK,CAAC,GAAGX,KAAAA,CAAAA,CAAOY,GAAG,CAACJ,CAAAA,KAAAA,GAAAA;AAU/BA,YAAAA,IAAAA,WAAAA;AATb,YAAA,MAAMK,SAASL,KAAAA,CAAMK,MAAM,CAACD,GAAG,CAACE,CAAAA,KAAAA,GAC5B,OAAOA,KAAAA,KAAU,WAAWA,KAAAA,GAAQA,KAAAA,CAAMnC,IAAI,CAAA,CAChDoC,IAAI,CAAC,IAAA,CAAA;YAEP,OAAO;gBACH,CAAC,OAAO,EAAEP,KAAAA,CAAMQ,MAAM,CAAC,EAAE,EAAER,KAAAA,CAAMtF,KAAK,CAAA,CAAE;gBACxC,CAAC,QAAQ,EAAE2F,MAAAA,IAAU,MAAA,CAAA,CAAQ;AAC7B,gBAAA,CAAC,SAAS,EAAEL,KAAAA,CAAMV,UAAU,CAAA,CAAE;AAC9B,gBAAA,CAAC,SAAS,EAAEU,KAAAA,CAAMS,UAAU,CAAA,CAAE;gBAC9B,CAAC,MAAM,EAAET,CAAAA,CAAAA,WAAAA,GAAAA,KAAAA,CAAMrF,IAAI,MAAA,IAAA,IAAVqF,WAAAA,KAAAA,KAAAA,CAAAA,GAAAA,KAAAA,CAAAA,GAAAA,WAAAA,CAAYU,SAAS,CAAC,CAAA,EAAG,SAAQ,gBAAA,CAAA,EAAmBV,KAAAA,CAAMrF,IAAI,IAAIqF,KAAAA,CAAMrF,IAAI,CAACY,MAAM,GAAG,GAAA,GAAM,KAAA,GAAQ,EAAA,CAAA,CAAI;AACjH,gBAAA;AACH,aAAA,CAACgF,IAAI,CAAC,IAAA,CAAA;AACX,QAAA,CAAA,CAAA;QAEAjH,MAAAA,CAAO8B,KAAK,CAAC,CAAC,QAAQ,EAAEqE,MAAAA,CAAOlE,MAAM,CAAC,YAAY,CAAC,CAAA;QACnD,OAAO2E,YAAAA,CAAaK,IAAI,CAAC,MAAA,CAAA;AAC7B,IAAA,CAAA,CAAE,OAAO3G,KAAAA,EAAY;AACjBN,QAAAA,MAAAA,CAAOwD,IAAI,CAAC,mCAAA,EAAqClD,KAAAA,CAAM4B,OAAO,CAAA;QAC9D,OAAO,EAAA;AACX,IAAA;AACJ;AAEO,MAAMmF,WAAAA,GAAc,OACvBjG,KAAAA,EACAC,IAAAA,EACA0F,MAAAA,GAAAA;AAEA,IAAA,MAAMvF,OAAAA,GAAUzB,UAAAA,EAAAA;AAChB,IAAA,MAAM,EAAEkB,KAAK,EAAEC,IAAI,EAAE,GAAG,MAAMJ,cAAAA,EAAAA;AAE9B,IAAA,MAAMW,WAAW,MAAMD,OAAAA,CAAQ2E,MAAM,CAACxE,MAAM,CAAC;AACzCV,QAAAA,KAAAA;AACAC,QAAAA,IAAAA;AACAE,QAAAA,KAAAA;AACAC,QAAAA,IAAAA;AACA0F,QAAAA,MAAAA,EAAQA,UAAU;AACtB,KAAA,CAAA;IAEA,OAAO;QACHG,MAAAA,EAAQzF,QAAAA,CAASG,IAAI,CAACsF,MAAM;QAC5BI,QAAAA,EAAU7F,QAAAA,CAASG,IAAI,CAAC0F;AAC5B,KAAA;AACJ;AAEO,MAAMC,iCAAAA,GAAoC,OAAO9B,OAAAA,EAAiB+B,aAAAA,GAAAA;AACrE,IAAA,MAAMhG,OAAAA,GAAUzB,UAAAA,EAAAA;AAChB,IAAA,MAAM,EAAEkB,KAAK,EAAEC,IAAI,EAAE,GAAG,MAAMJ,cAAAA,EAAAA;AAC9B,IAAA,MAAMd,MAAAA,GAASC,SAAAA,EAAAA;IAEf,IAAI;AACAD,QAAAA,MAAAA,CAAO8B,KAAK,CAAC,CAAC,4CAA4C,EAAE2D,OAAAA,CAAQ,GAAG,CAAC,CAAA;;QAGxE,IAAIgC,WAAAA;QACJ,IAAI;AACAA,YAAAA,WAAAA,GAAc,MAAM5B,mBAAAA,CAAoBJ,OAAAA,CAAAA;AAC5C,QAAA,CAAA,CAAE,OAAOnF,KAAAA,EAAY;AACjBN,YAAAA,MAAAA,CAAOwD,IAAI,CAAC,CAAC,+BAA+B,EAAEiC,OAAAA,CAAQ,EAAE,EAAEnF,KAAAA,CAAM4B,OAAO,CAAC,8BAA8B,CAAC,CAAA;AAC3G,QAAA;AAEA,QAAA,MAAMwF,gBAAAA,GAAmBD,WAAAA,KAAAA,IAAAA,IAAAA,WAAAA,KAAAA,KAAAA,CAAAA,GAAAA,KAAAA,CAAAA,GAAAA,WAAAA,CAAazB,UAAU;AAChD,QAAA,MAAM2B,gBAAAA,GAAmBF,WAAAA,KAAAA,IAAAA,IAAAA,WAAAA,KAAAA,KAAAA,CAAAA,GAAAA,KAAAA,CAAAA,GAAAA,WAAAA,CAAaG,gBAAgB;AAEtD,QAAA,IAAIF,gBAAAA,EAAkB;YAClB1H,MAAAA,CAAO8B,KAAK,CAAC,CAAC,QAAQ,EAAE2D,QAAQ,gBAAgB,EAAEiC,gBAAAA,CAAiB,6CAA6C,CAAC,CAAA;AACrH,QAAA;;AAGA,QAAA,MAAMG,oBAAoB,MAAMrG,OAAAA,CAAQkB,OAAO,CAACC,iBAAiB,CAAC;AAC9D1B,YAAAA,KAAAA;AACAC,YAAAA;AACJ,SAAA,CAAA;QAEA,MAAM4G,iBAAAA,GAAoBD,kBAAkBjG,IAAI,CAACgB,SAAS,CAAC4B,MAAM,CAACuD,CAAAA,QAAAA,GAAAA;;AAE9D,YAAA,IAAIP,aAAAA,IAAiBA,aAAAA,CAAcvF,MAAM,GAAG,CAAA,EAAG;AAC3C,gBAAA,OAAOuF,aAAAA,CAAc7C,QAAQ,CAACoD,QAAAA,CAASlD,IAAI,CAAA;AAC/C,YAAA;;AAEA,YAAA,OAAO;AACX,QAAA,CAAA,CAAA;QAEA7E,MAAAA,CAAO8B,KAAK,CAAC,CAAC,MAAM,EAAEgG,iBAAAA,CAAkB7F,MAAM,CAAC,mBAAmB,CAAC,CAAA;AAEnE,QAAA,MAAM+F,UAAiB,EAAE;;QAGzB,KAAK,MAAMD,YAAYD,iBAAAA,CAAmB;YACtC,IAAI;AACA,gBAAA,MAAMG,eAAe,MAAMzG,OAAAA,CAAQkB,OAAO,CAACwF,gBAAgB,CAAC;AACxDjH,oBAAAA,KAAAA;AACAC,oBAAAA,IAAAA;AACAiH,oBAAAA,WAAAA,EAAaJ,SAASK,EAAE;oBACxB/B,QAAAA,EAAU;AACd,iBAAA,CAAA;;gBAGA,MAAMgC,WAAAA,GAAcJ,aAAarG,IAAI,CAAC0G,aAAa,CAAC9D,MAAM,CAAC5D,CAAAA,GAAAA,GAAAA;;oBAEvD,IAAIA,GAAAA,CAAI2H,KAAK,KAAK,SAAA,EAAW;wBACzB,OAAO,KAAA;AACX,oBAAA;;AAGA,oBAAA,IAAI,CAAC3H,GAAAA,CAAI4H,QAAQ,IAAI,CAAC5H,GAAAA,CAAIoF,UAAU,EAAE;wBAClC,OAAO,KAAA;AACX,oBAAA;;AAGA,oBAAA,IAAI0B,gBAAAA,EAAkB;AAClB,wBAAA,MAAMe,eAAe,IAAItF,IAAAA,CAAKvC,GAAAA,CAAIoF,UAAU,EAAE0C,OAAO,EAAA;AACrD,wBAAA,MAAMC,oBAAAA,GAAuB,IAAIxF,IAAAA,CAAKuE,gBAAAA,CAAAA,CAAkBgB,OAAO,EAAA;;wBAG/D,IAAID,YAAAA,GAAgBE,uBAAuB,KAAA,EAAQ;AAC/C3I,4BAAAA,MAAAA,CAAO8B,KAAK,CAAC,CAAC,uBAAuB,EAAElB,IAAIwH,EAAE,CAAC,8BAA8B,EAAExH,IAAIoF,UAAU,CAAC,WAAW,EAAE0B,gBAAAA,CAAiB,CAAC,CAAC,CAAA;4BAC7H,OAAO,KAAA;AACX,wBAAA;AACJ,oBAAA;;AAGA,oBAAA,IAAIC,gBAAAA,IAAoB/G,GAAAA,CAAI4H,QAAQ,KAAKb,gBAAAA,EAAkB;AACvD3H,wBAAAA,MAAAA,CAAO8B,KAAK,CAAC,CAAC,aAAa,EAAElB,IAAIwH,EAAE,CAAC,gCAAgC,EAAExH,IAAI4H,QAAQ,CAAC,WAAW,EAAEb,gBAAAA,CAAiB,CAAC,CAAC,CAAA;;;AAGvH,oBAAA;oBAEA,OAAO,IAAA;AACX,gBAAA,CAAA,CAAA;AAEAK,gBAAAA,OAAAA,CAAQY,IAAI,CAAA,GAAIP,WAAAA,CAAAA;gBAEhB,IAAIA,WAAAA,CAAYpG,MAAM,GAAG,CAAA,EAAG;AACxBjC,oBAAAA,MAAAA,CAAO8B,KAAK,CAAC,CAAC,MAAM,EAAEuG,WAAAA,CAAYpG,MAAM,CAAC,4BAA4B,EAAE8F,QAAAA,CAASlD,IAAI,CAAA,CAAE,CAAA;AAC1F,gBAAA;AACJ,YAAA,CAAA,CAAE,OAAOvE,KAAAA,EAAY;AACjBN,gBAAAA,MAAAA,CAAOwD,IAAI,CAAC,CAAC,gCAAgC,EAAEuE,QAAAA,CAASlD,IAAI,CAAC,EAAE,EAAEvE,KAAAA,CAAM4B,OAAO,CAAA,CAAE,CAAA;AACpF,YAAA;AACJ,QAAA;;QAGA8F,OAAAA,CAAQxB,IAAI,CAAC,CAACqC,CAAAA,EAAGC,CAAAA,GAAAA;;AAEb,YAAA,IAAInB,gBAAAA,EAAkB;gBAClB,MAAMoB,QAAAA,GAAWF,CAAAA,CAAEL,QAAQ,KAAKb,gBAAAA;gBAChC,MAAMqB,QAAAA,GAAWF,CAAAA,CAAEN,QAAQ,KAAKb,gBAAAA;AAChC,gBAAA,IAAIoB,QAAAA,IAAY,CAACC,QAAAA,EAAU,OAAO,CAAC,CAAA;gBACnC,IAAI,CAACD,QAAAA,IAAYC,QAAAA,EAAU,OAAO,CAAA;AACtC,YAAA;;AAGA,YAAA,OAAO,IAAI7F,IAAAA,CAAK2F,CAAAA,CAAE9C,UAAU,CAAA,CAAE0C,OAAO,EAAA,GAAK,IAAIvF,IAAAA,CAAK0F,CAAAA,CAAE7C,UAAU,CAAA,CAAE0C,OAAO,EAAA;AAC5E,QAAA,CAAA,CAAA;QAEA1I,MAAAA,CAAO8B,KAAK,CAAC,CAAC,MAAM,EAAEkG,QAAQ/F,MAAM,CAAC,oCAAoC,EAAEwD,OAAAA,CAAAA,CAAS,CAAA;AAEpF,QAAA,IAAIuC,OAAAA,CAAQ/F,MAAM,GAAG,CAAA,IAAKyF,gBAAAA,EAAkB;AACxC1H,YAAAA,MAAAA,CAAO8B,KAAK,CAAC,CAAC,oCAAoC,EAAE2D,OAAAA,CAAQ,CAAC,CAAC,CAAA;YAC9DuC,OAAAA,CAAQiB,OAAO,CAACrI,CAAAA,GAAAA,GAAAA;AACqDA,gBAAAA,IAAAA,aAAAA;gBAAjEZ,MAAAA,CAAO8B,KAAK,CAAC,CAAC,EAAE,EAAElB,IAAIiE,IAAI,CAAC,UAAU,EAAEjE,GAAAA,CAAIoF,UAAU,CAAC,SAAS,EAAA,CAAEpF,aAAAA,GAAAA,GAAAA,CAAI4H,QAAQ,MAAA,IAAA,IAAZ5H,oCAAAA,aAAAA,CAAcwG,SAAS,CAAC,CAAA,EAAG,CAAA,CAAA,CAAA,CAAI,CAAA;AACpG,YAAA,CAAA,CAAA;AACJ,QAAA;QAEA,OAAOY,OAAAA;AACX,IAAA,CAAA,CAAE,OAAO1H,KAAAA,EAAY;AACjBN,QAAAA,MAAAA,CAAOwD,IAAI,CAAC,CAAC,+BAA+B,EAAElD,KAAAA,CAAM4B,OAAO,CAAA,CAAE,CAAA;AAC7D,QAAA,OAAO,EAAE;AACb,IAAA;AACJ;MAEagH,uBAAAA,GAA0B,OACnCzD,OAAAA,EACA1C,OAAAA,GAII,EAAE,GAAA;AAEN,IAAA,MAAM/C,MAAAA,GAASC,SAAAA,EAAAA;AACf,IAAA,MAAM+C,OAAAA,GAAUD,OAAAA,CAAQC,OAAO,IAAI;IACnC,MAAMC,oBAAAA,GAAuBF,OAAAA,CAAQE,oBAAoB,IAAI,KAAA;AAE7DjD,IAAAA,MAAAA,CAAO2D,IAAI,CAAC,CAAC,2CAA2C,EAAE8B,OAAAA,CAAQ,GAAG,CAAC,CAAA;;AAGtEzF,IAAAA,MAAAA,CAAO8B,KAAK,CAAC,8CAAA,CAAA;AACb,IAAA,MAAMM,KAAAA,CAAM,KAAA,CAAA;IAEZ,MAAMc,SAAAA,GAAYC,KAAKC,GAAG,EAAA;AAC1B,IAAA,IAAI+F,eAAsB,EAAE;AAC5B,IAAA,IAAIC,2BAAAA,GAA8B,CAAA;IAClC,MAAMC,yBAAAA,GAA4B;AAElC,IAAA,MAAO,IAAA,CAAM;QACT,MAAM9F,WAAAA,GAAcJ,IAAAA,CAAKC,GAAG,EAAA,GAAKF,SAAAA;;AAGjC,QAAA,IAAIK,cAAcP,OAAAA,EAAS;YACvBhD,MAAAA,CAAOwD,IAAI,CAAC,CAAC,iBAAiB,EAAER,OAAAA,GAAU,IAAA,CAAK,uCAAuC,CAAC,CAAA;AAEvF,YAAA,IAAI,CAACC,oBAAAA,EAAsB;AACvB,gBAAA,MAAMqG,0BAA0B,MAAM5F,kBAAAA,CAClC,CAAC,4DAA4D,EAAE+B,OAAAA,CAAQ,GAAG,CAAC,GAC3E,CAAC,8EAA8E,CAAC,GAChF,CAAC,8BAA8B,CAAC,CAAA;AAGpC,gBAAA,IAAI6D,uBAAAA,EAAyB;AACzBtJ,oBAAAA,MAAAA,CAAO2D,IAAI,CAAC,8DAAA,CAAA;AACZ,oBAAA;gBACJ,CAAA,MAAO;AACH,oBAAA,MAAM,IAAIpD,KAAAA,CAAM,CAAC,0CAA0C,EAAEkF,OAAAA,CAAQ,4BAA4B,CAAC,CAAA;AACtG,gBAAA;YACJ,CAAA,MAAO;gBACH,MAAM,IAAIlF,KAAAA,CAAM,CAAC,0CAA0C,EAAEkF,OAAAA,CAAQ,EAAE,EAAEzC,OAAAA,GAAU,IAAA,CAAK,EAAE,CAAC,CAAA;AAC/F,YAAA;AACJ,QAAA;;AAGAmG,QAAAA,YAAAA,GAAe,MAAM5B,iCAAAA,CAAkC9B,OAAAA,EAAS1C,OAAAA,CAAQyE,aAAa,CAAA;QAErF,IAAI2B,YAAAA,CAAalH,MAAM,KAAK,CAAA,EAAG;AAC3BmH,YAAAA,2BAAAA,EAAAA;YACApJ,MAAAA,CAAO2D,IAAI,CAAC,CAAC,4BAA4B,EAAEyF,4BAA4B,CAAC,EAAEC,yBAAAA,CAA0B,aAAa,CAAC,CAAA;;AAGlH,YAAA,IAAID,+BAA+BC,yBAAAA,EAA2B;gBAC1DrJ,MAAAA,CAAOwD,IAAI,CAAC,CAAC,kCAAkC,EAAEiC,QAAQ,OAAO,EAAE4D,yBAAAA,CAA0B,UAAU,CAAC,CAAA;AAEvG,gBAAA,IAAI,CAACpG,oBAAAA,EAAsB;AACvB,oBAAA,MAAMqG,0BAA0B,MAAM5F,kBAAAA,CAClC,CAAC,sEAAsE,EAAE+B,OAAAA,CAAQ,GAAG,CAAC,GACrF,CAAC,2EAA2E,CAAC,GAC7E,CAAC,qDAAqD,CAAC,CAAA;AAG3D,oBAAA,IAAI6D,uBAAAA,EAAyB;AACzBtJ,wBAAAA,MAAAA,CAAO2D,IAAI,CAAC,kDAAA,CAAA;AACZ,wBAAA;oBACJ,CAAA,MAAO;AACH,wBAAA,MAAM,IAAIpD,KAAAA,CAAM,CAAC,+BAA+B,EAAEkF,OAAAA,CAAQ,4BAA4B,CAAC,CAAA;AAC3F,oBAAA;gBACJ,CAAA,MAAO;;AAEHzF,oBAAAA,MAAAA,CAAO2D,IAAI,CAAC,yCAAA,CAAA;AACZ,oBAAA;AACJ,gBAAA;AACJ,YAAA;AAEA,YAAA,MAAMvB,KAAAA,CAAM,KAAA,CAAA;AACZ,YAAA;AACJ,QAAA;;QAGAgH,2BAAAA,GAA8B,CAAA;;QAG9B,MAAMG,WAAAA,GAAcJ,aAAa3E,MAAM,CAAC5D,CAAAA,GAAAA,GACpCA,GAAAA,CAAI8D,UAAU,IAAI;AAAC,gBAAA,SAAA;AAAW,gBAAA,WAAA;AAAa,gBAAA;aAAY,CAACC,QAAQ,CAAC/D,GAAAA,CAAI8D,UAAU,CAAA,CAAA;QAGnF,IAAI6E,WAAAA,CAAYtH,MAAM,GAAG,CAAA,EAAG;AACxBjC,YAAAA,MAAAA,CAAOM,KAAK,CAAC,CAAC,sBAAsB,EAAEmF,OAAAA,CAAQ,eAAe,CAAC,CAAA;YAC9D,KAAK,MAAM7E,OAAO2I,WAAAA,CAAa;AAC3BvJ,gBAAAA,MAAAA,CAAOM,KAAK,CAAC,CAAC,EAAE,EAAEM,GAAAA,CAAIiE,IAAI,CAAC,EAAE,EAAEjE,GAAAA,CAAI8D,UAAU,CAAC,EAAE,EAAE9D,IAAI0G,QAAQ,CAAC,CAAC,CAAC,CAAA;AACrE,YAAA;AACA,YAAA,MAAM,IAAI/G,KAAAA,CAAM,CAAC,sBAAsB,EAAEkF,OAAAA,CAAQ,QAAQ,CAAC,CAAA;AAC9D,QAAA;QAEA,MAAM+D,qBAAAA,GAAwBL,aAAapE,KAAK,CAACnE,CAAAA,GAAAA,GAAOA,GAAAA,CAAIuB,MAAM,KAAK,WAAA,CAAA;AAEvE,QAAA,IAAIqH,qBAAAA,EAAuB;YACvB,MAAMC,cAAAA,GAAiBN,aAAa3E,MAAM,CAAC5D,CAAAA,GAAAA,GAAOA,GAAAA,CAAI8D,UAAU,KAAK,SAAA,CAAA;AACrE1E,YAAAA,MAAAA,CAAO2D,IAAI,CAAC,CAAC,IAAI,EAAEwF,YAAAA,CAAalH,MAAM,CAAC,uBAAuB,EAAEwD,OAAAA,CAAQ,wBAAwB,CAAC,CAAA;YACjG,KAAK,MAAM7E,OAAO6I,cAAAA,CAAgB;AAC9BzJ,gBAAAA,MAAAA,CAAO2D,IAAI,CAAC,CAAC,EAAE,EAAE/C,GAAAA,CAAIiE,IAAI,CAAC,EAAE,EAAEjE,GAAAA,CAAI8D,UAAU,CAAA,CAAE,CAAA;AAClD,YAAA;AACA,YAAA;AACJ,QAAA;QAEA,MAAMM,cAAAA,GAAiBmE,YAAAA,CAAa3E,MAAM,CAAC5D,CAAAA,MAAOA,GAAAA,CAAIuB,MAAM,KAAK,WAAA,CAAA,CAAaF,MAAM;QACpF,MAAMyH,YAAAA,GAAeP,YAAAA,CAAa3E,MAAM,CAAC5D,CAAAA,MAAOA,GAAAA,CAAIuB,MAAM,KAAK,aAAA,CAAA,CAAeF,MAAM;QACpF,MAAM0H,WAAAA,GAAcR,YAAAA,CAAa3E,MAAM,CAAC5D,CAAAA,MAAOA,GAAAA,CAAIuB,MAAM,KAAK,QAAA,CAAA,CAAUF,MAAM;QAE9EjC,MAAAA,CAAO2D,IAAI,CACP,CAAC,sBAAsB,EAAE8B,OAAAA,CAAQ,EAAE,EAAET,cAAAA,CAAe,YAAY,EAAE0E,YAAAA,CAAa,UAAU,EAAEC,WAAAA,CAAY,SAAS,EAAER,YAAAA,CAAalH,MAAM,CAAC,OAAO,CAAC,CAAA;QAGlJ,MAAMG,KAAAA,CAAM;AAChB,IAAA;AACJ;MAEawH,8BAAAA,GAAiC,UAAA;AAC1C,IAAA,MAAMpI,OAAAA,GAAUzB,UAAAA,EAAAA;AAChB,IAAA,MAAM,EAAEkB,KAAK,EAAEC,IAAI,EAAE,GAAG,MAAMJ,cAAAA,EAAAA;AAC9B,IAAA,MAAMd,MAAAA,GAASC,SAAAA,EAAAA;IAEf,IAAI;AACAD,QAAAA,MAAAA,CAAO8B,KAAK,CAAC,kEAAA,CAAA;;AAGb,QAAA,MAAM+F,oBAAoB,MAAMrG,OAAAA,CAAQkB,OAAO,CAACC,iBAAiB,CAAC;AAC9D1B,YAAAA,KAAAA;AACAC,YAAAA;AACJ,SAAA,CAAA;AAEA,QAAA,MAAM2I,mBAA6B,EAAE;;AAGrC,QAAA,KAAK,MAAM9B,QAAAA,IAAYF,iBAAAA,CAAkBjG,IAAI,CAACgB,SAAS,CAAE;YACrD,IAAI;;gBAEA,MAAMkH,YAAAA,GAAe/B,SAASgC,IAAI;AAClC/J,gBAAAA,MAAAA,CAAO8B,KAAK,CAAC,CAAC,oBAAoB,EAAEiG,QAAAA,CAASlD,IAAI,CAAC,EAAE,EAAEiF,YAAAA,CAAa,CAAC,CAAC,CAAA;AAErE,gBAAA,MAAME,kBAAkB,MAAMxI,OAAAA,CAAQmE,KAAK,CAACsE,UAAU,CAAC;AACnDhJ,oBAAAA,KAAAA;AACAC,oBAAAA,IAAAA;oBACA6I,IAAAA,EAAMD;AACV,iBAAA,CAAA;;gBAGA,IAAI,SAAA,IAAaE,gBAAgBpI,IAAI,IAAIoI,gBAAgBpI,IAAI,CAACsI,IAAI,KAAK,MAAA,EAAQ;;oBAE3E,MAAMC,OAAAA,GAAUC,MAAAA,CAAOC,IAAI,CAACL,eAAAA,CAAgBpI,IAAI,CAACuI,OAAO,EAAE,QAAA,CAAA,CAAUG,QAAQ,CAAC,OAAA,CAAA;;AAG7E,oBAAA,IAAIC,oBAAAA,CAAqBJ,OAAAA,EAASpC,QAAAA,CAASlD,IAAI,CAAA,EAAG;wBAC9C7E,MAAAA,CAAO8B,KAAK,CAAC,CAAC,YAAY,EAAEiG,QAAAA,CAASlD,IAAI,CAAC,qCAAqC,CAAC,CAAA;wBAChFgF,gBAAAA,CAAiBjB,IAAI,CAACb,QAAAA,CAASlD,IAAI,CAAA;oBACvC,CAAA,MAAO;wBACH7E,MAAAA,CAAO8B,KAAK,CAAC,CAAC,YAAY,EAAEiG,QAAAA,CAASlD,IAAI,CAAC,yCAAyC,CAAC,CAAA;AACxF,oBAAA;gBACJ,CAAA,MAAO;AACH7E,oBAAAA,MAAAA,CAAOwD,IAAI,CAAC,CAAC,oCAAoC,EAAEuE,QAAAA,CAASlD,IAAI,CAAA,CAAE,CAAA;AACtE,gBAAA;AACJ,YAAA,CAAA,CAAE,OAAOvE,KAAAA,EAAY;AACjBN,gBAAAA,MAAAA,CAAOwD,IAAI,CAAC,CAAC,2BAA2B,EAAEuE,QAAAA,CAASlD,IAAI,CAAC,EAAE,EAAEvE,KAAAA,CAAM4B,OAAO,CAAA,CAAE,CAAA;AAC/E,YAAA;AACJ,QAAA;AAEAlC,QAAAA,MAAAA,CAAO2D,IAAI,CAAC,CAAC,MAAM,EAAEkG,gBAAAA,CAAiB5H,MAAM,CAAC,qDAAqD,EAAE4H,gBAAAA,CAAiB5C,IAAI,CAAC,IAAA,CAAA,CAAA,CAAO,CAAA;QACjI,OAAO4C,gBAAAA;AACX,IAAA,CAAA,CAAE,OAAOvJ,KAAAA,EAAY;AACjBN,QAAAA,MAAAA,CAAOM,KAAK,CAAC,CAAC,6BAA6B,EAAEA,KAAAA,CAAM4B,OAAO,CAAA,CAAE,CAAA;AAC5D,QAAA,OAAO,EAAE;AACb,IAAA;AACJ;AAEA,MAAMqI,oBAAAA,GAAuB,CAACC,eAAAA,EAAyBC,YAAAA,GAAAA;AACnD,IAAA,MAAMzK,MAAAA,GAASC,SAAAA,EAAAA;IAEf,IAAI;;;;;;;AAQA,QAAA,MAAMyK,mBAAAA,GAAsB,sEAAA;;AAG5B,QAAA,MAAMC,gBAAAA,GAAmB,6DAAA;;;;;;;AAQzB,QAAA,MAAMC,cAAAA,GAAiB,8KAAA;QAEvB,MAAMC,WAAAA,GAAcH,mBAAAA,CAAoBI,IAAI,CAACN,eAAAA,CAAAA,IAC1BG,gBAAAA,CAAiBG,IAAI,CAACN,eAAAA,CAAAA,IACtBI,cAAAA,CAAeE,IAAI,CAACN,eAAAA,CAAAA;AAEvC,QAAA,IAAIK,WAAAA,EAAa;AACb7K,YAAAA,MAAAA,CAAO8B,KAAK,CAAC,CAAC,UAAU,EAAE2I,YAAAA,CAAa,sCAAsC,CAAC,CAAA;AAClF,QAAA;QAEA,OAAOI,WAAAA;AACX,IAAA,CAAA,CAAE,OAAOvK,KAAAA,EAAY;QACjBN,MAAAA,CAAOwD,IAAI,CAAC,CAAC,qCAAqC,EAAEiH,aAAa,EAAE,EAAEnK,KAAAA,CAAM4B,OAAO,CAAA,CAAE,CAAA;QACpF,OAAO,KAAA;AACX,IAAA;AACJ,CAAA;;;;"}
|
|
1
|
+
{"version":3,"file":"github.js","sources":["../../src/util/github.ts"],"sourcesContent":["import { Octokit } from '@octokit/rest';\nimport { getLogger } from '../logging';\nimport { PullRequest, MergeMethod } from '../types';\nimport { run } from './child';\nimport { promptConfirmation } from './stdin';\n\nexport const getOctokit = (): Octokit => {\n const logger = getLogger();\n const token = process.env.GITHUB_TOKEN;\n\n if (!token) {\n logger.error('GITHUB_TOKEN environment variable is not set.');\n throw new Error('GITHUB_TOKEN is not set.');\n }\n\n return new Octokit({\n auth: token,\n });\n};\n\nexport const getCurrentBranchName = async (): Promise<string> => {\n const { stdout } = await run('git rev-parse --abbrev-ref HEAD');\n return stdout.trim();\n};\n\nexport const getRepoDetails = async (): Promise<{ owner: string; repo: string }> => {\n const { stdout } = await run('git remote get-url origin');\n const url = stdout.trim();\n // git@github.com:owner/repo.git or https://github.com/owner/repo.git\n const match = url.match(/github\\.com[/:]([\\w-]+)\\/([\\w.-]+)\\.git/);\n if (!match) {\n throw new Error(`Could not parse repository owner and name from origin URL: \"${url}\". Expected format: git@github.com:owner/repo.git or https://github.com/owner/repo.git`);\n }\n return { owner: match[1], repo: match[2] };\n};\n\nexport const createPullRequest = async (\n title: string,\n body: string,\n head: string,\n base: string = 'main'\n): Promise<PullRequest> => {\n const octokit = getOctokit();\n const { owner, repo } = await getRepoDetails();\n\n const response = await octokit.pulls.create({\n owner,\n repo,\n title,\n body,\n head,\n base,\n });\n\n return response.data;\n};\n\nexport const findOpenPullRequestByHeadRef = async (head: string): Promise<PullRequest | null> => {\n const octokit = getOctokit();\n const { owner, repo } = await getRepoDetails();\n const logger = getLogger();\n\n try {\n logger.debug(`Searching for open pull requests with head: ${owner}:${head} in ${owner}/${repo}`);\n\n const response = await octokit.pulls.list({\n owner,\n repo,\n state: 'open',\n head: `${owner}:${head}`,\n });\n\n logger.debug(`Found ${response.data.length} open pull requests`);\n return response.data[0] ?? null;\n } catch (error: any) {\n logger.error(`Failed to find open pull requests: ${error.message}`);\n if (error.status === 404) {\n logger.error(`Repository ${owner}/${repo} not found or access denied. Please check your GITHUB_TOKEN permissions.`);\n }\n throw error;\n }\n};\n\nconst delay = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));\n\n// Check if repository has GitHub Actions workflows configured\nconst hasWorkflowsConfigured = async (): Promise<boolean> => {\n const octokit = getOctokit();\n const { owner, repo } = await getRepoDetails();\n\n try {\n const response = await octokit.actions.listRepoWorkflows({\n owner,\n repo,\n });\n\n return response.data.workflows.length > 0;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n } catch (error: any) {\n // If we can't check workflows (e.g., no Actions permission), assume they might exist\n return true;\n }\n};\n\nexport const waitForPullRequestChecks = async (prNumber: number, options: { timeout?: number; skipUserConfirmation?: boolean } = {}): Promise<void> => {\n const octokit = getOctokit();\n const { owner, repo } = await getRepoDetails();\n const logger = getLogger();\n const timeout = options.timeout || 300000; // 5 minutes default timeout\n const skipUserConfirmation = options.skipUserConfirmation || false;\n\n const startTime = Date.now();\n let consecutiveNoChecksCount = 0;\n const maxConsecutiveNoChecks = 6; // 6 consecutive checks (1 minute) with no checks before asking user\n\n while (true) {\n const elapsedTime = Date.now() - startTime;\n\n // Check for timeout\n if (elapsedTime > timeout) {\n logger.warn(`Timeout reached (${timeout / 1000}s) while waiting for PR #${prNumber} checks.`);\n\n if (!skipUserConfirmation) {\n const proceedWithoutChecks = await promptConfirmation(\n `⚠️ Timeout reached while waiting for PR #${prNumber} checks.\\n` +\n `This might indicate that no checks are configured for this repository.\\n` +\n `Do you want to proceed with merging the PR without waiting for checks?`\n );\n\n if (proceedWithoutChecks) {\n logger.info('User chose to proceed without waiting for checks.');\n return;\n } else {\n throw new Error(`Timeout waiting for PR #${prNumber} checks. User chose not to proceed.`);\n }\n } else {\n throw new Error(`Timeout waiting for PR #${prNumber} checks (${timeout / 1000}s)`);\n }\n }\n\n const pr = await octokit.pulls.get({\n owner,\n repo,\n pull_number: prNumber,\n });\n\n const checkRunsResponse = await octokit.checks.listForRef({\n owner,\n repo,\n ref: pr.data.head.sha,\n });\n\n const checkRuns = checkRunsResponse.data.check_runs;\n\n if (checkRuns.length === 0) {\n consecutiveNoChecksCount++;\n logger.info(`PR #${prNumber}: No checks found (${consecutiveNoChecksCount}/${maxConsecutiveNoChecks}). Waiting...`);\n\n // After several consecutive \"no checks\" responses, check if workflows are configured\n if (consecutiveNoChecksCount >= maxConsecutiveNoChecks) {\n logger.info(`No checks detected for ${maxConsecutiveNoChecks} consecutive attempts. Checking repository configuration...`);\n\n const hasWorkflows = await hasWorkflowsConfigured();\n\n if (!hasWorkflows) {\n logger.warn(`No GitHub Actions workflows found in repository ${owner}/${repo}.`);\n\n if (!skipUserConfirmation) {\n const proceedWithoutChecks = await promptConfirmation(\n `⚠️ No GitHub Actions workflows or checks are configured for this repository.\\n` +\n `PR #${prNumber} will never have status checks to wait for.\\n` +\n `Do you want to proceed with merging the PR without checks?`\n );\n\n if (proceedWithoutChecks) {\n logger.info('User chose to proceed without checks (no workflows configured).');\n return;\n } else {\n throw new Error(`No checks configured for PR #${prNumber}. User chose not to proceed.`);\n }\n } else {\n // In non-interactive mode, proceed if no workflows are configured\n logger.info('No workflows configured, proceeding without checks.');\n return;\n }\n } else {\n logger.info('GitHub Actions workflows are configured. Continuing to wait for checks...');\n consecutiveNoChecksCount = 0; // Reset counter since workflows exist\n }\n }\n\n await delay(10000);\n continue;\n }\n\n // Reset the no-checks counter since we found some checks\n consecutiveNoChecksCount = 0;\n\n const failingChecks = checkRuns.filter(\n (cr) => cr.conclusion && ['failure', 'timed_out', 'cancelled'].includes(cr.conclusion)\n );\n\n if (failingChecks.length > 0) {\n const { owner, repo } = await getRepoDetails();\n const prUrl = `https://github.com/${owner}/${repo}/pull/${prNumber}`;\n\n // Get current branch name for better guidance\n let currentBranch: string | undefined;\n try {\n currentBranch = await getCurrentBranchName();\n } catch {\n // Fallback to generic branch reference if we can't get the current branch\n currentBranch = undefined;\n }\n\n // Collect detailed information about each failed check\n const detailedFailedChecks = await Promise.all(\n failingChecks.map(async (check) => {\n try {\n // Get additional details from the check run\n const checkDetails = await octokit.checks.get({\n owner,\n repo,\n check_run_id: check.id,\n });\n\n return {\n name: check.name,\n conclusion: check.conclusion || 'unknown',\n detailsUrl: check.details_url || undefined,\n summary: checkDetails.data.output?.summary || undefined,\n output: {\n title: checkDetails.data.output?.title || undefined,\n summary: checkDetails.data.output?.summary || undefined,\n text: checkDetails.data.output?.text || undefined,\n },\n };\n } catch {\n // Fallback to basic information if we can't get details\n return {\n name: check.name,\n conclusion: check.conclusion || 'unknown',\n detailsUrl: check.details_url || undefined,\n };\n }\n })\n );\n\n logger.error(`❌ PR #${prNumber} has ${failingChecks.length} failing check${failingChecks.length > 1 ? 's' : ''}:`);\n logger.error('');\n\n for (const check of detailedFailedChecks) {\n const statusIcon = check.conclusion === 'failure' ? '❌' :\n check.conclusion === 'timed_out' ? '⏰' : '🚫';\n logger.error(`${statusIcon} ${check.name}: ${check.conclusion}`);\n\n // Show more detailed error information if available\n if (check.output?.title && check.output.title !== check.name) {\n logger.error(` Issue: ${check.output.title}`);\n }\n\n if (check.output?.summary) {\n // Truncate very long summaries\n const summary = check.output.summary.length > 200\n ? check.output.summary.substring(0, 200) + '...'\n : check.output.summary;\n logger.error(` Summary: ${summary}`);\n }\n\n // Include direct link to check details\n if (check.detailsUrl) {\n logger.error(` Details: ${check.detailsUrl}`);\n }\n logger.error('');\n }\n\n // Import the new error class\n const { PullRequestCheckError } = await import('../error/CommandErrors');\n\n // Create and throw the enhanced error with detailed recovery instructions\n const prError = new PullRequestCheckError(\n `PR #${prNumber} checks failed. ${failingChecks.length} check${failingChecks.length > 1 ? 's' : ''} failed.`,\n prNumber,\n detailedFailedChecks,\n prUrl,\n currentBranch\n );\n\n // Display recovery instructions\n const instructions = prError.getRecoveryInstructions();\n for (const instruction of instructions) {\n logger.error(instruction);\n }\n logger.error('');\n\n throw prError;\n }\n\n const allChecksCompleted = checkRuns.every((cr) => cr.status === 'completed');\n\n if (allChecksCompleted) {\n logger.info(`All checks for PR #${prNumber} have completed successfully.`);\n return;\n }\n\n const completedCount = checkRuns.filter(cr => cr.status === 'completed').length;\n logger.info(`PR #${prNumber} checks: ${completedCount}/${checkRuns.length} completed. Waiting...`);\n\n await delay(10000); // wait 10 seconds\n }\n};\n\nexport const mergePullRequest = async (prNumber: number, mergeMethod: MergeMethod = 'squash'): Promise<void> => {\n const octokit = getOctokit();\n const { owner, repo } = await getRepoDetails();\n const logger = getLogger();\n\n logger.info(`Merging PR #${prNumber} using ${mergeMethod} method...`);\n const pr = await octokit.pulls.get({\n owner,\n repo,\n pull_number: prNumber,\n });\n const headBranch = pr.data.head.ref;\n\n await octokit.pulls.merge({\n owner,\n repo,\n pull_number: prNumber,\n merge_method: mergeMethod,\n });\n logger.info(`PR #${prNumber} merged using ${mergeMethod} method.`);\n\n logger.info(`Deleting branch ${headBranch}...`);\n await octokit.git.deleteRef({\n owner,\n repo,\n ref: `heads/${headBranch}`,\n });\n logger.info(`Branch ${headBranch} deleted.`);\n};\n\nexport const createRelease = async (tagName: string, title: string, notes: string): Promise<void> => {\n const octokit = getOctokit();\n const { owner, repo } = await getRepoDetails();\n const logger = getLogger();\n\n logger.info(`Creating release for tag ${tagName}...`);\n await octokit.repos.createRelease({\n owner,\n repo,\n tag_name: tagName,\n name: title,\n body: notes,\n });\n logger.info(`Release ${tagName} created.`);\n};\n\nexport const getReleaseByTagName = async (tagName: string): Promise<any> => {\n const octokit = getOctokit();\n const { owner, repo } = await getRepoDetails();\n const logger = getLogger();\n\n try {\n const response = await octokit.repos.getReleaseByTag({\n owner,\n repo,\n tag: tagName,\n });\n\n logger.debug(`Found release for tag ${tagName}: created at ${response.data.created_at}`);\n return response.data;\n } catch (error: any) {\n logger.debug(`Failed to get release for tag ${tagName}: ${error.message}`);\n throw error;\n }\n};\n\nexport const getOpenIssues = async (limit: number = 20): Promise<string> => {\n const octokit = getOctokit();\n const { owner, repo } = await getRepoDetails();\n const logger = getLogger();\n\n try {\n logger.debug(`Fetching up to ${limit} open GitHub issues...`);\n\n const response = await octokit.issues.listForRepo({\n owner,\n repo,\n state: 'open',\n per_page: Math.min(limit, 100), // GitHub API limit\n sort: 'updated',\n direction: 'desc',\n });\n\n const issues = response.data.filter(issue => !issue.pull_request); // Filter out PRs\n\n if (issues.length === 0) {\n logger.debug('No open issues found');\n return '';\n }\n\n const issueStrings = issues.slice(0, limit).map(issue => {\n const labels = issue.labels.map(label =>\n typeof label === 'string' ? label : label.name\n ).join(', ');\n\n return [\n `Issue #${issue.number}: ${issue.title}`,\n `Labels: ${labels || 'none'}`,\n `Created: ${issue.created_at}`,\n `Updated: ${issue.updated_at}`,\n `Body: ${issue.body?.substring(0, 500) || 'No description'}${issue.body && issue.body.length > 500 ? '...' : ''}`,\n '---'\n ].join('\\n');\n });\n\n logger.debug(`Fetched ${issues.length} open issues`);\n return issueStrings.join('\\n\\n');\n } catch (error: any) {\n logger.warn('Failed to fetch GitHub issues: %s', error.message);\n return '';\n }\n};\n\nexport const createIssue = async (\n title: string,\n body: string,\n labels?: string[]\n): Promise<{ number: number; html_url: string }> => {\n const octokit = getOctokit();\n const { owner, repo } = await getRepoDetails();\n\n const response = await octokit.issues.create({\n owner,\n repo,\n title,\n body,\n labels: labels || [],\n });\n\n return {\n number: response.data.number,\n html_url: response.data.html_url,\n };\n};\n\nexport const getWorkflowRunsTriggeredByRelease = async (tagName: string, workflowNames?: string[]): Promise<any[]> => {\n const octokit = getOctokit();\n const { owner, repo } = await getRepoDetails();\n const logger = getLogger();\n\n try {\n logger.debug(`Fetching workflow runs triggered by release ${tagName}...`);\n\n // Get release information to filter by creation time and commit SHA\n let releaseInfo: any;\n try {\n releaseInfo = await getReleaseByTagName(tagName);\n } catch (error: any) {\n logger.warn(`Could not get release info for ${tagName}: ${error.message}. Will use fallback filtering.`);\n }\n\n const releaseCreatedAt = releaseInfo?.created_at;\n const releaseCommitSha = releaseInfo?.target_commitish;\n\n if (releaseCreatedAt) {\n logger.debug(`Release ${tagName} was created at ${releaseCreatedAt}, filtering workflows created after this time`);\n }\n\n // Get all workflows\n const workflowsResponse = await octokit.actions.listRepoWorkflows({\n owner,\n repo,\n });\n\n const relevantWorkflows = workflowsResponse.data.workflows.filter(workflow => {\n // If specific workflow names are provided, only include those\n if (workflowNames && workflowNames.length > 0) {\n return workflowNames.includes(workflow.name);\n }\n // Otherwise, find workflows that trigger on releases\n return true; // We'll filter by event later when we get the runs\n });\n\n logger.debug(`Found ${relevantWorkflows.length} workflows to check`);\n\n const allRuns: any[] = [];\n\n // Get recent workflow runs for each workflow\n for (const workflow of relevantWorkflows) {\n try {\n const runsResponse = await octokit.actions.listWorkflowRuns({\n owner,\n repo,\n workflow_id: workflow.id,\n per_page: 20, // Check more runs to account for filtering\n });\n\n // Filter runs that were triggered by our specific release\n const releaseRuns = runsResponse.data.workflow_runs.filter(run => {\n // Must be a release event\n if (run.event !== 'release') {\n logger.debug(`Excluding workflow run ${run.id}: not a release event (${run.event})`);\n return false;\n }\n\n // Must have required data\n if (!run.head_sha || !run.created_at) {\n logger.debug(`Excluding workflow run ${run.id}: missing required data (head_sha: ${run.head_sha}, created_at: ${run.created_at})`);\n return false;\n }\n\n // If we have release info, filter by creation time more strictly\n if (releaseCreatedAt) {\n const runCreatedAt = new Date(run.created_at).getTime();\n const releaseCreatedAtTime = new Date(releaseCreatedAt).getTime();\n\n // Be more strict: only include runs created within 10 minutes after the release\n // This helps exclude old workflow runs that might match other criteria\n const timeDiff = runCreatedAt - releaseCreatedAtTime;\n if (timeDiff < -30000 || timeDiff > 600000) { // 30 seconds before to 10 minutes after\n logger.debug(`Excluding workflow run ${run.id}: outside time window (run: ${run.created_at}, release: ${releaseCreatedAt}, diff: ${timeDiff}ms)`);\n return false;\n }\n }\n\n // Additional check: if we have the release commit SHA, be stricter about matching it\n if (releaseCommitSha && run.head_sha !== releaseCommitSha) {\n logger.debug(`Excluding workflow run ${run.id}: commit SHA mismatch (run: ${run.head_sha}, release: ${releaseCommitSha})`);\n return false; // Be strict about commit SHA matching\n }\n\n // If we don't have release info but it's a release event, check if it matches our tag name\n // Look for the tag name in run references (this is a fallback when we can't get release info)\n if (!releaseCreatedAt && run.head_branch && !run.head_branch.includes(tagName.replace('v', ''))) {\n logger.debug(`Excluding workflow run ${run.id}: branch doesn't match tag pattern (branch: ${run.head_branch}, tag: ${tagName})`);\n return false;\n }\n\n logger.debug(`Including workflow run ${run.id}: ${run.name} (${run.status}/${run.conclusion}) created ${run.created_at}`);\n return true;\n });\n\n allRuns.push(...releaseRuns);\n\n if (releaseRuns.length > 0) {\n logger.debug(`Found ${releaseRuns.length} relevant workflow runs for ${workflow.name}`);\n }\n } catch (error: any) {\n logger.warn(`Failed to get runs for workflow ${workflow.name}: ${error.message}`);\n }\n }\n\n // Sort by creation time (newest first) and prioritize runs with matching commit SHA\n allRuns.sort((a, b) => {\n // First, prioritize runs with matching commit SHA if we have release info\n if (releaseCommitSha) {\n const aMatches = a.head_sha === releaseCommitSha;\n const bMatches = b.head_sha === releaseCommitSha;\n if (aMatches && !bMatches) return -1;\n if (!aMatches && bMatches) return 1;\n }\n\n // Then sort by creation time (newest first)\n return new Date(b.created_at).getTime() - new Date(a.created_at).getTime();\n });\n\n logger.debug(`Found ${allRuns.length} workflow runs triggered by release ${tagName}`);\n\n if (allRuns.length > 0 && releaseCreatedAt) {\n logger.debug(`Workflow runs created after release ${tagName}:`);\n allRuns.forEach(run => {\n logger.debug(`- ${run.name}: created ${run.created_at}, commit ${run.head_sha?.substring(0, 7)}`);\n });\n }\n\n return allRuns;\n } catch (error: any) {\n logger.warn(`Failed to fetch workflow runs: ${error.message}`);\n return [];\n }\n};\n\nexport const waitForReleaseWorkflows = async (\n tagName: string,\n options: {\n timeout?: number;\n workflowNames?: string[];\n skipUserConfirmation?: boolean;\n } = {}\n): Promise<void> => {\n const logger = getLogger();\n const timeout = options.timeout || 600000; // 10 minutes default\n const skipUserConfirmation = options.skipUserConfirmation || false;\n\n logger.info(`Waiting for workflows triggered by release ${tagName}...`);\n\n // Wait a bit for workflows to start (GitHub can take a moment to trigger them)\n logger.debug('Waiting 30 seconds for workflows to start...');\n await delay(30000);\n\n const startTime = Date.now();\n let workflowRuns: any[] = [];\n let consecutiveNoWorkflowsCount = 0;\n const maxConsecutiveNoWorkflows = 6; // 1 minute of checking before asking user\n\n while (true) {\n const elapsedTime = Date.now() - startTime;\n\n // Check for timeout\n if (elapsedTime > timeout) {\n logger.warn(`Timeout reached (${timeout / 1000}s) while waiting for release workflows.`);\n\n if (!skipUserConfirmation) {\n const proceedWithoutWorkflows = await promptConfirmation(\n `⚠️ Timeout reached while waiting for release workflows for ${tagName}.\\n` +\n `This might indicate that no workflows are configured to trigger on releases.\\n` +\n `Do you want to proceed anyway?`\n );\n\n if (proceedWithoutWorkflows) {\n logger.info('User chose to proceed without waiting for release workflows.');\n return;\n } else {\n throw new Error(`Timeout waiting for release workflows for ${tagName}. User chose not to proceed.`);\n }\n } else {\n throw new Error(`Timeout waiting for release workflows for ${tagName} (${timeout / 1000}s)`);\n }\n }\n\n // Get current workflow runs\n workflowRuns = await getWorkflowRunsTriggeredByRelease(tagName, options.workflowNames);\n\n if (workflowRuns.length === 0) {\n consecutiveNoWorkflowsCount++;\n logger.info(`No release workflows found (${consecutiveNoWorkflowsCount}/${maxConsecutiveNoWorkflows}). Waiting...`);\n\n // After several attempts with no workflows, ask user if they want to continue\n if (consecutiveNoWorkflowsCount >= maxConsecutiveNoWorkflows) {\n logger.warn(`No workflows triggered by release ${tagName} after ${maxConsecutiveNoWorkflows} attempts.`);\n\n if (!skipUserConfirmation) {\n const proceedWithoutWorkflows = await promptConfirmation(\n `⚠️ No GitHub Actions workflows appear to be triggered by the release ${tagName}.\\n` +\n `This might be expected if no workflows are configured for release events.\\n` +\n `Do you want to proceed without waiting for workflows?`\n );\n\n if (proceedWithoutWorkflows) {\n logger.info('User chose to proceed without release workflows.');\n return;\n } else {\n throw new Error(`No release workflows found for ${tagName}. User chose not to proceed.`);\n }\n } else {\n // In non-interactive mode, proceed if no workflows are found\n logger.info('No release workflows found, proceeding.');\n return;\n }\n }\n\n await delay(10000);\n continue;\n }\n\n // Reset counter since we found workflows\n consecutiveNoWorkflowsCount = 0;\n\n // Check status of all workflow runs\n const failingRuns = workflowRuns.filter(run =>\n run.conclusion && ['failure', 'timed_out', 'cancelled'].includes(run.conclusion)\n );\n\n if (failingRuns.length > 0) {\n logger.error(`Release workflows for ${tagName} have failures:`);\n for (const run of failingRuns) {\n logger.error(`- ${run.name}: ${run.conclusion} (${run.html_url})`);\n }\n throw new Error(`Release workflows for ${tagName} failed.`);\n }\n\n const allWorkflowsCompleted = workflowRuns.every(run => run.status === 'completed');\n\n if (allWorkflowsCompleted) {\n const successfulRuns = workflowRuns.filter(run => run.conclusion === 'success');\n logger.info(`All ${workflowRuns.length} release workflows for ${tagName} completed successfully.`);\n for (const run of successfulRuns) {\n logger.info(`✓ ${run.name}: ${run.conclusion}`);\n }\n return;\n }\n\n const completedCount = workflowRuns.filter(run => run.status === 'completed').length;\n const runningCount = workflowRuns.filter(run => run.status === 'in_progress').length;\n const queuedCount = workflowRuns.filter(run => run.status === 'queued').length;\n\n // Log detailed information about each workflow run being tracked\n if (workflowRuns.length > 0) {\n logger.debug(`Tracking ${workflowRuns.length} workflow runs for release ${tagName}:`);\n workflowRuns.forEach(run => {\n const statusIcon = run.status === 'completed' ?\n (run.conclusion === 'success' ? '✅' : run.conclusion === 'failure' ? '❌' : '⚠️') :\n run.status === 'in_progress' ? '🔄' : '⏳';\n logger.debug(` ${statusIcon} ${run.name} (${run.status}${run.conclusion ? `/${run.conclusion}` : ''}) - created ${run.created_at}`);\n });\n }\n\n logger.info(\n `Release workflows for ${tagName}: ${completedCount} completed, ${runningCount} running, ${queuedCount} queued (${workflowRuns.length} total)`\n );\n\n await delay(15000); // wait 15 seconds\n }\n};\n\nexport const getWorkflowsTriggeredByRelease = async (): Promise<string[]> => {\n const octokit = getOctokit();\n const { owner, repo } = await getRepoDetails();\n const logger = getLogger();\n\n try {\n logger.debug('Analyzing workflows to find those triggered by release events...');\n\n // Get all workflows\n const workflowsResponse = await octokit.actions.listRepoWorkflows({\n owner,\n repo,\n });\n\n const releaseWorkflows: string[] = [];\n\n // Check each workflow's configuration\n for (const workflow of workflowsResponse.data.workflows) {\n try {\n // Get the workflow file content\n const workflowPath = workflow.path;\n logger.debug(`Analyzing workflow: ${workflow.name} (${workflowPath})`);\n\n const contentResponse = await octokit.repos.getContent({\n owner,\n repo,\n path: workflowPath,\n });\n\n // Handle the response - it could be a file or directory\n if ('content' in contentResponse.data && contentResponse.data.type === 'file') {\n // Decode the base64 content\n const content = Buffer.from(contentResponse.data.content, 'base64').toString('utf-8');\n\n // Parse the YAML to check trigger conditions\n if (isTriggeredByRelease(content, workflow.name)) {\n logger.debug(`✓ Workflow \"${workflow.name}\" will be triggered by release events`);\n releaseWorkflows.push(workflow.name);\n } else {\n logger.debug(`✗ Workflow \"${workflow.name}\" will not be triggered by release events`);\n }\n } else {\n logger.warn(`Could not read content for workflow ${workflow.name}`);\n }\n } catch (error: any) {\n logger.warn(`Failed to analyze workflow ${workflow.name}: ${error.message}`);\n }\n }\n\n logger.info(`Found ${releaseWorkflows.length} workflows that will be triggered by release events: ${releaseWorkflows.join(', ')}`);\n return releaseWorkflows;\n } catch (error: any) {\n logger.error(`Failed to analyze workflows: ${error.message}`);\n return [];\n }\n};\n\nconst isTriggeredByRelease = (workflowContent: string, workflowName: string): boolean => {\n const logger = getLogger();\n\n try {\n // Simple regex-based parsing since we don't want to add a YAML dependency\n // Look for common release trigger patterns\n\n // Pattern 1: on.release (with or without types)\n // on:\n // release:\n // types: [published, created, ...]\n const releaseEventPattern = /(?:^|\\n)\\s*on\\s*:\\s*(?:\\n|\\r\\n)(?:\\s+[^\\S\\r\\n]+)*(?:\\s+release\\s*:)/m;\n\n // Pattern 2: on: [push, release] or on: release\n const onReleasePattern = /(?:^|\\n)\\s*on\\s*:\\s*(?:\\[.*release.*\\]|release)\\s*(?:\\n|$)/m;\n\n // Pattern 3: push with tag patterns that look like releases\n // on:\n // push:\n // tags:\n // - 'v*'\n // - 'release/*'\n const tagPushPattern = /(?:^|\\r?\\n)[^\\S\\r\\n]*on\\s*:\\s*\\r?\\n(?:[^\\S\\r\\n]*[^\\r\\n]+(?:\\r?\\n))*?[^\\S\\r\\n]*push\\s*:\\s*\\r?\\n(?:[^\\S\\r\\n]*tags\\s*:\\s*(?:\\r?\\n|\\[)[^\\]\\r\\n]*(?:v\\*|release|tag)[^\\]\\r\\n]*)/mi;\n\n const isTriggered = releaseEventPattern.test(workflowContent) ||\n onReleasePattern.test(workflowContent) ||\n tagPushPattern.test(workflowContent);\n\n if (isTriggered) {\n logger.debug(`Workflow \"${workflowName}\" trigger patterns detected in content`);\n }\n\n return isTriggered;\n } catch (error: any) {\n logger.warn(`Failed to parse workflow content for ${workflowName}: ${error.message}`);\n return false;\n }\n};\n"],"names":["getOctokit","logger","getLogger","token","process","env","GITHUB_TOKEN","error","Error","Octokit","auth","getCurrentBranchName","stdout","run","trim","getRepoDetails","url","match","owner","repo","createPullRequest","title","body","head","base","octokit","response","pulls","create","data","findOpenPullRequestByHeadRef","debug","list","state","length","message","status","delay","ms","Promise","resolve","setTimeout","hasWorkflowsConfigured","actions","listRepoWorkflows","workflows","waitForPullRequestChecks","prNumber","options","timeout","skipUserConfirmation","startTime","Date","now","consecutiveNoChecksCount","maxConsecutiveNoChecks","elapsedTime","warn","proceedWithoutChecks","promptConfirmation","info","pr","get","pull_number","checkRunsResponse","checks","listForRef","ref","sha","checkRuns","check_runs","hasWorkflows","failingChecks","filter","cr","conclusion","includes","prUrl","currentBranch","undefined","detailedFailedChecks","all","map","check","checkDetails","check_run_id","id","name","detailsUrl","details_url","summary","output","text","statusIcon","substring","PullRequestCheckError","prError","instructions","getRecoveryInstructions","instruction","allChecksCompleted","every","completedCount","mergePullRequest","mergeMethod","headBranch","merge","merge_method","git","deleteRef","createRelease","tagName","notes","repos","tag_name","getReleaseByTagName","getReleaseByTag","tag","created_at","getOpenIssues","limit","issues","listForRepo","per_page","Math","min","sort","direction","issue","pull_request","issueStrings","slice","labels","label","join","number","updated_at","createIssue","html_url","getWorkflowRunsTriggeredByRelease","workflowNames","releaseInfo","releaseCreatedAt","releaseCommitSha","target_commitish","workflowsResponse","relevantWorkflows","workflow","allRuns","runsResponse","listWorkflowRuns","workflow_id","releaseRuns","workflow_runs","event","head_sha","runCreatedAt","getTime","releaseCreatedAtTime","timeDiff","head_branch","replace","push","a","b","aMatches","bMatches","forEach","waitForReleaseWorkflows","workflowRuns","consecutiveNoWorkflowsCount","maxConsecutiveNoWorkflows","proceedWithoutWorkflows","failingRuns","allWorkflowsCompleted","successfulRuns","runningCount","queuedCount","getWorkflowsTriggeredByRelease","releaseWorkflows","workflowPath","path","contentResponse","getContent","type","content","Buffer","from","toString","isTriggeredByRelease","workflowContent","workflowName","releaseEventPattern","onReleasePattern","tagPushPattern","isTriggered","test"],"mappings":"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"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { getLogger } from '../logging.js';
|
|
2
|
+
import { run } from './child.js';
|
|
3
|
+
import { PerformanceTimer } from './performance.js';
|
|
4
|
+
|
|
5
|
+
// Check if npm install is needed by examining lock file and node_modules
|
|
6
|
+
const isNpmInstallNeeded = async (storage)=>{
|
|
7
|
+
const logger = getLogger();
|
|
8
|
+
const timer = PerformanceTimer.start(logger, 'Checking if npm install is needed');
|
|
9
|
+
try {
|
|
10
|
+
// Check if package-lock.json exists
|
|
11
|
+
const hasLockFile = await storage.exists('package-lock.json');
|
|
12
|
+
if (!hasLockFile) {
|
|
13
|
+
timer.end('npm install needed - no lock file');
|
|
14
|
+
return {
|
|
15
|
+
needed: true,
|
|
16
|
+
reason: 'No package-lock.json found'
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
// Check if node_modules exists
|
|
20
|
+
const hasNodeModules = await storage.exists('node_modules');
|
|
21
|
+
if (!hasNodeModules) {
|
|
22
|
+
timer.end('npm install needed - no node_modules');
|
|
23
|
+
return {
|
|
24
|
+
needed: true,
|
|
25
|
+
reason: 'No node_modules directory found'
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
// Check if node_modules is populated (has at least a few entries)
|
|
29
|
+
const nodeModulesContents = await storage.listFiles('node_modules');
|
|
30
|
+
if (nodeModulesContents.length < 3) {
|
|
31
|
+
timer.end('npm install needed - empty node_modules');
|
|
32
|
+
return {
|
|
33
|
+
needed: true,
|
|
34
|
+
reason: 'node_modules appears empty or incomplete'
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
// Get timestamps to check if package.json is newer than node_modules
|
|
38
|
+
const packageJsonStats = await storage.exists('package.json');
|
|
39
|
+
if (!packageJsonStats) {
|
|
40
|
+
timer.end('npm install not needed - no package.json');
|
|
41
|
+
return {
|
|
42
|
+
needed: false,
|
|
43
|
+
reason: 'No package.json found'
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
timer.end('npm install not needed - appears up to date');
|
|
47
|
+
return {
|
|
48
|
+
needed: false,
|
|
49
|
+
reason: 'Dependencies appear to be up to date'
|
|
50
|
+
};
|
|
51
|
+
} catch (error) {
|
|
52
|
+
timer.end(`npm install check failed: ${error.message}`);
|
|
53
|
+
logger.debug(`Failed to check npm install status: ${error.message}`);
|
|
54
|
+
return {
|
|
55
|
+
needed: true,
|
|
56
|
+
reason: 'Could not verify dependency status, installing to be safe'
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
// Run npm install with optimizations
|
|
61
|
+
const optimizedNpmInstall = async (options = {})=>{
|
|
62
|
+
const logger = getLogger();
|
|
63
|
+
const storage = (await import('./storage.js')).create({
|
|
64
|
+
log: logger.info
|
|
65
|
+
});
|
|
66
|
+
const { skipIfNotNeeded = true, useCache = true, verbose = false } = options;
|
|
67
|
+
// Check if install is needed
|
|
68
|
+
if (skipIfNotNeeded) {
|
|
69
|
+
const installCheck = await isNpmInstallNeeded(storage);
|
|
70
|
+
if (!installCheck.needed) {
|
|
71
|
+
logger.info(`⚡ Skipping npm install: ${installCheck.reason}`);
|
|
72
|
+
return {
|
|
73
|
+
duration: 0,
|
|
74
|
+
skipped: true,
|
|
75
|
+
reason: installCheck.reason
|
|
76
|
+
};
|
|
77
|
+
} else {
|
|
78
|
+
logger.verbose(`📦 npm install required: ${installCheck.reason}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Build optimized npm install command
|
|
82
|
+
const npmArgs = [
|
|
83
|
+
'install'
|
|
84
|
+
];
|
|
85
|
+
if (!verbose) {
|
|
86
|
+
npmArgs.push('--silent');
|
|
87
|
+
}
|
|
88
|
+
if (useCache) {
|
|
89
|
+
// npm uses cache by default, but we can ensure it's not bypassed
|
|
90
|
+
npmArgs.push('--prefer-offline');
|
|
91
|
+
}
|
|
92
|
+
// Use --no-audit and --no-fund for faster installs in link/unlink scenarios
|
|
93
|
+
npmArgs.push('--no-audit', '--no-fund');
|
|
94
|
+
const command = `npm ${npmArgs.join(' ')}`;
|
|
95
|
+
logger.info(`⏳ Running optimized npm install...`);
|
|
96
|
+
logger.verbose(`Command: ${command}`);
|
|
97
|
+
const timer = PerformanceTimer.start(logger, 'Optimized npm install execution');
|
|
98
|
+
try {
|
|
99
|
+
await run(command);
|
|
100
|
+
const duration = timer.end('Optimized npm install completed successfully');
|
|
101
|
+
logger.info(`✅ Dependencies installed successfully (${duration}ms)`);
|
|
102
|
+
return {
|
|
103
|
+
duration,
|
|
104
|
+
skipped: false,
|
|
105
|
+
reason: 'Installation completed successfully'
|
|
106
|
+
};
|
|
107
|
+
} catch (error) {
|
|
108
|
+
timer.end('Optimized npm install failed');
|
|
109
|
+
throw new Error(`Failed to run optimized npm install: ${error.message}`);
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
// Helper to run npm ci if package-lock.json is available (faster than npm install)
|
|
113
|
+
const tryNpmCi = async ()=>{
|
|
114
|
+
const logger = getLogger();
|
|
115
|
+
const storage = (await import('./storage.js')).create({
|
|
116
|
+
log: logger.info
|
|
117
|
+
});
|
|
118
|
+
try {
|
|
119
|
+
// Check if package-lock.json exists
|
|
120
|
+
const hasLockFile = await storage.exists('package-lock.json');
|
|
121
|
+
if (!hasLockFile) {
|
|
122
|
+
return {
|
|
123
|
+
success: false
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
logger.info('⚡ Using npm ci for faster installation...');
|
|
127
|
+
const timer = PerformanceTimer.start(logger, 'npm ci execution');
|
|
128
|
+
await run('npm ci --silent --no-audit --no-fund');
|
|
129
|
+
const duration = timer.end('npm ci completed successfully');
|
|
130
|
+
logger.info(`✅ Dependencies installed with npm ci (${duration}ms)`);
|
|
131
|
+
return {
|
|
132
|
+
success: true,
|
|
133
|
+
duration
|
|
134
|
+
};
|
|
135
|
+
} catch (error) {
|
|
136
|
+
logger.verbose(`npm ci failed, will fall back to npm install: ${error.message}`);
|
|
137
|
+
return {
|
|
138
|
+
success: false
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
// Main function that tries the fastest approach first
|
|
143
|
+
const smartNpmInstall = async (options = {})=>{
|
|
144
|
+
const logger = getLogger();
|
|
145
|
+
const { skipIfNotNeeded = true, preferCi = true, verbose = false } = options;
|
|
146
|
+
const overallTimer = PerformanceTimer.start(logger, 'Smart npm install');
|
|
147
|
+
// Try npm ci first if preferred and available
|
|
148
|
+
if (preferCi) {
|
|
149
|
+
const ciResult = await tryNpmCi();
|
|
150
|
+
if (ciResult.success) {
|
|
151
|
+
overallTimer.end('Smart npm install completed with npm ci');
|
|
152
|
+
return {
|
|
153
|
+
duration: ciResult.duration || 0,
|
|
154
|
+
method: 'npm ci',
|
|
155
|
+
skipped: false
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Fall back to optimized npm install
|
|
160
|
+
const installResult = await optimizedNpmInstall({
|
|
161
|
+
skipIfNotNeeded,
|
|
162
|
+
useCache: true,
|
|
163
|
+
verbose
|
|
164
|
+
});
|
|
165
|
+
overallTimer.end(`Smart npm install completed with ${installResult.skipped ? 'skip' : 'npm install'}`);
|
|
166
|
+
return {
|
|
167
|
+
duration: installResult.duration,
|
|
168
|
+
method: installResult.skipped ? 'skipped' : 'npm install',
|
|
169
|
+
skipped: installResult.skipped
|
|
170
|
+
};
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
export { isNpmInstallNeeded, optimizedNpmInstall, smartNpmInstall, tryNpmCi };
|
|
174
|
+
//# sourceMappingURL=npmOptimizations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npmOptimizations.js","sources":["../../src/util/npmOptimizations.ts"],"sourcesContent":["import { getLogger } from '../logging';\nimport { run } from './child';\nimport { PerformanceTimer } from './performance';\n\n// Check if npm install is needed by examining lock file and node_modules\nexport const isNpmInstallNeeded = async (storage: any): Promise<{ needed: boolean; reason: string }> => {\n const logger = getLogger();\n const timer = PerformanceTimer.start(logger, 'Checking if npm install is needed');\n\n try {\n // Check if package-lock.json exists\n const hasLockFile = await storage.exists('package-lock.json');\n if (!hasLockFile) {\n timer.end('npm install needed - no lock file');\n return { needed: true, reason: 'No package-lock.json found' };\n }\n\n // Check if node_modules exists\n const hasNodeModules = await storage.exists('node_modules');\n if (!hasNodeModules) {\n timer.end('npm install needed - no node_modules');\n return { needed: true, reason: 'No node_modules directory found' };\n }\n\n // Check if node_modules is populated (has at least a few entries)\n const nodeModulesContents = await storage.listFiles('node_modules');\n if (nodeModulesContents.length < 3) { // Usually has .bin, .package-lock.json, and packages\n timer.end('npm install needed - empty node_modules');\n return { needed: true, reason: 'node_modules appears empty or incomplete' };\n }\n\n // Get timestamps to check if package.json is newer than node_modules\n const packageJsonStats = await storage.exists('package.json');\n if (!packageJsonStats) {\n timer.end('npm install not needed - no package.json');\n return { needed: false, reason: 'No package.json found' };\n }\n\n timer.end('npm install not needed - appears up to date');\n return { needed: false, reason: 'Dependencies appear to be up to date' };\n } catch (error: any) {\n timer.end(`npm install check failed: ${error.message}`);\n logger.debug(`Failed to check npm install status: ${error.message}`);\n return { needed: true, reason: 'Could not verify dependency status, installing to be safe' };\n }\n};\n\n// Run npm install with optimizations\nexport const optimizedNpmInstall = async (options: {\n skipIfNotNeeded?: boolean;\n useCache?: boolean;\n verbose?: boolean;\n} = {}): Promise<{ duration: number; skipped: boolean; reason: string }> => {\n const logger = getLogger();\n const storage = (await import('./storage')).create({ log: logger.info });\n\n const {\n skipIfNotNeeded = true,\n useCache = true,\n verbose = false\n } = options;\n\n // Check if install is needed\n if (skipIfNotNeeded) {\n const installCheck = await isNpmInstallNeeded(storage);\n if (!installCheck.needed) {\n logger.info(`⚡ Skipping npm install: ${installCheck.reason}`);\n return { duration: 0, skipped: true, reason: installCheck.reason };\n } else {\n logger.verbose(`📦 npm install required: ${installCheck.reason}`);\n }\n }\n\n // Build optimized npm install command\n const npmArgs = ['install'];\n\n if (!verbose) {\n npmArgs.push('--silent');\n }\n\n if (useCache) {\n // npm uses cache by default, but we can ensure it's not bypassed\n npmArgs.push('--prefer-offline');\n }\n\n // Use --no-audit and --no-fund for faster installs in link/unlink scenarios\n npmArgs.push('--no-audit', '--no-fund');\n\n const command = `npm ${npmArgs.join(' ')}`;\n\n logger.info(`⏳ Running optimized npm install...`);\n logger.verbose(`Command: ${command}`);\n\n const timer = PerformanceTimer.start(logger, 'Optimized npm install execution');\n\n try {\n await run(command);\n const duration = timer.end('Optimized npm install completed successfully');\n logger.info(`✅ Dependencies installed successfully (${duration}ms)`);\n return { duration, skipped: false, reason: 'Installation completed successfully' };\n } catch (error: any) {\n timer.end('Optimized npm install failed');\n throw new Error(`Failed to run optimized npm install: ${error.message}`);\n }\n};\n\n// Helper to run npm ci if package-lock.json is available (faster than npm install)\nexport const tryNpmCi = async (): Promise<{ success: boolean; duration?: number }> => {\n const logger = getLogger();\n const storage = (await import('./storage')).create({ log: logger.info });\n\n try {\n // Check if package-lock.json exists\n const hasLockFile = await storage.exists('package-lock.json');\n if (!hasLockFile) {\n return { success: false };\n }\n\n logger.info('⚡ Using npm ci for faster installation...');\n const timer = PerformanceTimer.start(logger, 'npm ci execution');\n\n await run('npm ci --silent --no-audit --no-fund');\n const duration = timer.end('npm ci completed successfully');\n\n logger.info(`✅ Dependencies installed with npm ci (${duration}ms)`);\n return { success: true, duration };\n } catch (error: any) {\n logger.verbose(`npm ci failed, will fall back to npm install: ${error.message}`);\n return { success: false };\n }\n};\n\n// Main function that tries the fastest approach first\nexport const smartNpmInstall = async (options: {\n skipIfNotNeeded?: boolean;\n preferCi?: boolean;\n verbose?: boolean;\n} = {}): Promise<{ duration: number; method: string; skipped: boolean }> => {\n const logger = getLogger();\n const {\n skipIfNotNeeded = true,\n preferCi = true,\n verbose = false\n } = options;\n\n const overallTimer = PerformanceTimer.start(logger, 'Smart npm install');\n\n // Try npm ci first if preferred and available\n if (preferCi) {\n const ciResult = await tryNpmCi();\n if (ciResult.success) {\n overallTimer.end('Smart npm install completed with npm ci');\n return {\n duration: ciResult.duration || 0,\n method: 'npm ci',\n skipped: false\n };\n }\n }\n\n // Fall back to optimized npm install\n const installResult = await optimizedNpmInstall({\n skipIfNotNeeded,\n useCache: true,\n verbose\n });\n\n overallTimer.end(`Smart npm install completed with ${installResult.skipped ? 'skip' : 'npm install'}`);\n\n return {\n duration: installResult.duration,\n method: installResult.skipped ? 'skipped' : 'npm install',\n skipped: installResult.skipped\n };\n};\n"],"names":["isNpmInstallNeeded","storage","logger","getLogger","timer","PerformanceTimer","start","hasLockFile","exists","end","needed","reason","hasNodeModules","nodeModulesContents","listFiles","length","packageJsonStats","error","message","debug","optimizedNpmInstall","options","create","log","info","skipIfNotNeeded","useCache","verbose","installCheck","duration","skipped","npmArgs","push","command","join","run","Error","tryNpmCi","success","smartNpmInstall","preferCi","overallTimer","ciResult","method","installResult"],"mappings":";;;;AAIA;AACO,MAAMA,qBAAqB,OAAOC,OAAAA,GAAAA;AACrC,IAAA,MAAMC,MAAAA,GAASC,SAAAA,EAAAA;AACf,IAAA,MAAMC,KAAAA,GAAQC,gBAAAA,CAAiBC,KAAK,CAACJ,MAAAA,EAAQ,mCAAA,CAAA;IAE7C,IAAI;;AAEA,QAAA,MAAMK,WAAAA,GAAc,MAAMN,OAAAA,CAAQO,MAAM,CAAC,mBAAA,CAAA;AACzC,QAAA,IAAI,CAACD,WAAAA,EAAa;AACdH,YAAAA,KAAAA,CAAMK,GAAG,CAAC,mCAAA,CAAA;YACV,OAAO;gBAAEC,MAAAA,EAAQ,IAAA;gBAAMC,MAAAA,EAAQ;AAA6B,aAAA;AAChE,QAAA;;AAGA,QAAA,MAAMC,cAAAA,GAAiB,MAAMX,OAAAA,CAAQO,MAAM,CAAC,cAAA,CAAA;AAC5C,QAAA,IAAI,CAACI,cAAAA,EAAgB;AACjBR,YAAAA,KAAAA,CAAMK,GAAG,CAAC,sCAAA,CAAA;YACV,OAAO;gBAAEC,MAAAA,EAAQ,IAAA;gBAAMC,MAAAA,EAAQ;AAAkC,aAAA;AACrE,QAAA;;AAGA,QAAA,MAAME,mBAAAA,GAAsB,MAAMZ,OAAAA,CAAQa,SAAS,CAAC,cAAA,CAAA;QACpD,IAAID,mBAAAA,CAAoBE,MAAM,GAAG,CAAA,EAAG;AAChCX,YAAAA,KAAAA,CAAMK,GAAG,CAAC,yCAAA,CAAA;YACV,OAAO;gBAAEC,MAAAA,EAAQ,IAAA;gBAAMC,MAAAA,EAAQ;AAA2C,aAAA;AAC9E,QAAA;;AAGA,QAAA,MAAMK,gBAAAA,GAAmB,MAAMf,OAAAA,CAAQO,MAAM,CAAC,cAAA,CAAA;AAC9C,QAAA,IAAI,CAACQ,gBAAAA,EAAkB;AACnBZ,YAAAA,KAAAA,CAAMK,GAAG,CAAC,0CAAA,CAAA;YACV,OAAO;gBAAEC,MAAAA,EAAQ,KAAA;gBAAOC,MAAAA,EAAQ;AAAwB,aAAA;AAC5D,QAAA;AAEAP,QAAAA,KAAAA,CAAMK,GAAG,CAAC,6CAAA,CAAA;QACV,OAAO;YAAEC,MAAAA,EAAQ,KAAA;YAAOC,MAAAA,EAAQ;AAAuC,SAAA;AAC3E,IAAA,CAAA,CAAE,OAAOM,KAAAA,EAAY;AACjBb,QAAAA,KAAAA,CAAMK,GAAG,CAAC,CAAC,0BAA0B,EAAEQ,KAAAA,CAAMC,OAAO,CAAA,CAAE,CAAA;AACtDhB,QAAAA,MAAAA,CAAOiB,KAAK,CAAC,CAAC,oCAAoC,EAAEF,KAAAA,CAAMC,OAAO,CAAA,CAAE,CAAA;QACnE,OAAO;YAAER,MAAAA,EAAQ,IAAA;YAAMC,MAAAA,EAAQ;AAA4D,SAAA;AAC/F,IAAA;AACJ;AAEA;AACO,MAAMS,mBAAAA,GAAsB,OAAOC,OAAAA,GAItC,EAAE,GAAA;AACF,IAAA,MAAMnB,MAAAA,GAASC,SAAAA,EAAAA;IACf,MAAMF,OAAAA,GAAU,CAAC,MAAM,OAAO,cAAA,CAAW,EAAGqB,MAAM,CAAC;AAAEC,QAAAA,GAAAA,EAAKrB,OAAOsB;AAAK,KAAA,CAAA;IAEtE,MAAM,EACFC,eAAAA,GAAkB,IAAI,EACtBC,QAAAA,GAAW,IAAI,EACfC,OAAAA,GAAU,KAAK,EAClB,GAAGN,OAAAA;;AAGJ,IAAA,IAAII,eAAAA,EAAiB;QACjB,MAAMG,YAAAA,GAAe,MAAM5B,kBAAAA,CAAmBC,OAAAA,CAAAA;QAC9C,IAAI,CAAC2B,YAAAA,CAAalB,MAAM,EAAE;AACtBR,YAAAA,MAAAA,CAAOsB,IAAI,CAAC,CAAC,wBAAwB,EAAEI,YAAAA,CAAajB,MAAM,CAAA,CAAE,CAAA;YAC5D,OAAO;gBAAEkB,QAAAA,EAAU,CAAA;gBAAGC,OAAAA,EAAS,IAAA;AAAMnB,gBAAAA,MAAAA,EAAQiB,aAAajB;AAAO,aAAA;QACrE,CAAA,MAAO;AACHT,YAAAA,MAAAA,CAAOyB,OAAO,CAAC,CAAC,yBAAyB,EAAEC,YAAAA,CAAajB,MAAM,CAAA,CAAE,CAAA;AACpE,QAAA;AACJ,IAAA;;AAGA,IAAA,MAAMoB,OAAAA,GAAU;AAAC,QAAA;AAAU,KAAA;AAE3B,IAAA,IAAI,CAACJ,OAAAA,EAAS;AACVI,QAAAA,OAAAA,CAAQC,IAAI,CAAC,UAAA,CAAA;AACjB,IAAA;AAEA,IAAA,IAAIN,QAAAA,EAAU;;AAEVK,QAAAA,OAAAA,CAAQC,IAAI,CAAC,kBAAA,CAAA;AACjB,IAAA;;IAGAD,OAAAA,CAAQC,IAAI,CAAC,YAAA,EAAc,WAAA,CAAA;AAE3B,IAAA,MAAMC,UAAU,CAAC,IAAI,EAAEF,OAAAA,CAAQG,IAAI,CAAC,GAAA,CAAA,CAAA,CAAM;AAE1ChC,IAAAA,MAAAA,CAAOsB,IAAI,CAAC,CAAC,kCAAkC,CAAC,CAAA;AAChDtB,IAAAA,MAAAA,CAAOyB,OAAO,CAAC,CAAC,SAAS,EAAEM,OAAAA,CAAAA,CAAS,CAAA;AAEpC,IAAA,MAAM7B,KAAAA,GAAQC,gBAAAA,CAAiBC,KAAK,CAACJ,MAAAA,EAAQ,iCAAA,CAAA;IAE7C,IAAI;AACA,QAAA,MAAMiC,GAAAA,CAAIF,OAAAA,CAAAA;QACV,MAAMJ,QAAAA,GAAWzB,KAAAA,CAAMK,GAAG,CAAC,8CAAA,CAAA;AAC3BP,QAAAA,MAAAA,CAAOsB,IAAI,CAAC,CAAC,uCAAuC,EAAEK,QAAAA,CAAS,GAAG,CAAC,CAAA;QACnE,OAAO;AAAEA,YAAAA,QAAAA;YAAUC,OAAAA,EAAS,KAAA;YAAOnB,MAAAA,EAAQ;AAAsC,SAAA;AACrF,IAAA,CAAA,CAAE,OAAOM,KAAAA,EAAY;AACjBb,QAAAA,KAAAA,CAAMK,GAAG,CAAC,8BAAA,CAAA;AACV,QAAA,MAAM,IAAI2B,KAAAA,CAAM,CAAC,qCAAqC,EAAEnB,KAAAA,CAAMC,OAAO,CAAA,CAAE,CAAA;AAC3E,IAAA;AACJ;AAEA;MACamB,QAAAA,GAAW,UAAA;AACpB,IAAA,MAAMnC,MAAAA,GAASC,SAAAA,EAAAA;IACf,MAAMF,OAAAA,GAAU,CAAC,MAAM,OAAO,cAAA,CAAW,EAAGqB,MAAM,CAAC;AAAEC,QAAAA,GAAAA,EAAKrB,OAAOsB;AAAK,KAAA,CAAA;IAEtE,IAAI;;AAEA,QAAA,MAAMjB,WAAAA,GAAc,MAAMN,OAAAA,CAAQO,MAAM,CAAC,mBAAA,CAAA;AACzC,QAAA,IAAI,CAACD,WAAAA,EAAa;YACd,OAAO;gBAAE+B,OAAAA,EAAS;AAAM,aAAA;AAC5B,QAAA;AAEApC,QAAAA,MAAAA,CAAOsB,IAAI,CAAC,2CAAA,CAAA;AACZ,QAAA,MAAMpB,KAAAA,GAAQC,gBAAAA,CAAiBC,KAAK,CAACJ,MAAAA,EAAQ,kBAAA,CAAA;AAE7C,QAAA,MAAMiC,GAAAA,CAAI,sCAAA,CAAA;QACV,MAAMN,QAAAA,GAAWzB,KAAAA,CAAMK,GAAG,CAAC,+BAAA,CAAA;AAE3BP,QAAAA,MAAAA,CAAOsB,IAAI,CAAC,CAAC,sCAAsC,EAAEK,QAAAA,CAAS,GAAG,CAAC,CAAA;QAClE,OAAO;YAAES,OAAAA,EAAS,IAAA;AAAMT,YAAAA;AAAS,SAAA;AACrC,IAAA,CAAA,CAAE,OAAOZ,KAAAA,EAAY;AACjBf,QAAAA,MAAAA,CAAOyB,OAAO,CAAC,CAAC,8CAA8C,EAAEV,KAAAA,CAAMC,OAAO,CAAA,CAAE,CAAA;QAC/E,OAAO;YAAEoB,OAAAA,EAAS;AAAM,SAAA;AAC5B,IAAA;AACJ;AAEA;AACO,MAAMC,eAAAA,GAAkB,OAAOlB,OAAAA,GAIlC,EAAE,GAAA;AACF,IAAA,MAAMnB,MAAAA,GAASC,SAAAA,EAAAA;IACf,MAAM,EACFsB,eAAAA,GAAkB,IAAI,EACtBe,QAAAA,GAAW,IAAI,EACfb,OAAAA,GAAU,KAAK,EAClB,GAAGN,OAAAA;AAEJ,IAAA,MAAMoB,YAAAA,GAAepC,gBAAAA,CAAiBC,KAAK,CAACJ,MAAAA,EAAQ,mBAAA,CAAA;;AAGpD,IAAA,IAAIsC,QAAAA,EAAU;AACV,QAAA,MAAME,WAAW,MAAML,QAAAA,EAAAA;QACvB,IAAIK,QAAAA,CAASJ,OAAO,EAAE;AAClBG,YAAAA,YAAAA,CAAahC,GAAG,CAAC,yCAAA,CAAA;YACjB,OAAO;gBACHoB,QAAAA,EAAUa,QAAAA,CAASb,QAAQ,IAAI,CAAA;gBAC/Bc,MAAAA,EAAQ,QAAA;gBACRb,OAAAA,EAAS;AACb,aAAA;AACJ,QAAA;AACJ,IAAA;;IAGA,MAAMc,aAAAA,GAAgB,MAAMxB,mBAAAA,CAAoB;AAC5CK,QAAAA,eAAAA;QACAC,QAAAA,EAAU,IAAA;AACVC,QAAAA;AACJ,KAAA,CAAA;IAEAc,YAAAA,CAAahC,GAAG,CAAC,CAAC,iCAAiC,EAAEmC,aAAAA,CAAcd,OAAO,GAAG,MAAA,GAAS,aAAA,CAAA,CAAe,CAAA;IAErG,OAAO;AACHD,QAAAA,QAAAA,EAAUe,cAAcf,QAAQ;QAChCc,MAAAA,EAAQC,aAAAA,CAAcd,OAAO,GAAG,SAAA,GAAY,aAAA;AAC5CA,QAAAA,OAAAA,EAASc,cAAcd;AAC3B,KAAA;AACJ;;;;"}
|
package/dist/util/openai.js
CHANGED
|
@@ -29,12 +29,14 @@ async function createCompletion(messages, options = {
|
|
|
29
29
|
timeout: 180000
|
|
30
30
|
});
|
|
31
31
|
logger.debug('Sending prompt to OpenAI: %j', messages);
|
|
32
|
+
// Use provided maxTokens or default to 10000
|
|
33
|
+
const maxCompletionTokens = options.maxTokens || 10000;
|
|
32
34
|
// Save request debug file if enabled
|
|
33
35
|
if (options.debug && (options.debugRequestFile || options.debugFile)) {
|
|
34
36
|
const requestData = {
|
|
35
37
|
model: options.model || "gpt-4o-mini",
|
|
36
38
|
messages,
|
|
37
|
-
max_completion_tokens:
|
|
39
|
+
max_completion_tokens: maxCompletionTokens,
|
|
38
40
|
response_format: options.responseFormat
|
|
39
41
|
};
|
|
40
42
|
const debugFile = options.debugRequestFile || options.debugFile;
|
|
@@ -45,7 +47,7 @@ async function createCompletion(messages, options = {
|
|
|
45
47
|
const completionPromise = openai.chat.completions.create({
|
|
46
48
|
model: options.model || "gpt-4o-mini",
|
|
47
49
|
messages,
|
|
48
|
-
max_completion_tokens:
|
|
50
|
+
max_completion_tokens: maxCompletionTokens,
|
|
49
51
|
response_format: options.responseFormat
|
|
50
52
|
});
|
|
51
53
|
const timeoutPromise = new Promise((_, reject)=>{
|
package/dist/util/openai.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.js","sources":["../../src/util/openai.ts"],"sourcesContent":["import { OpenAI } from 'openai';\nimport { ChatCompletionMessageParam } from 'openai/resources';\nimport * as Storage from './storage';\nimport { getLogger } from '../logging';\nimport { archiveAudio } from './general';\n// eslint-disable-next-line no-restricted-imports\nimport fs from 'fs';\n\nexport interface Transcription {\n text: string;\n}\n\nexport class OpenAIError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'OpenAIError';\n }\n}\n\nexport async function createCompletion(messages: ChatCompletionMessageParam[], options: { responseFormat?: any, model?: string, debug?: boolean, debugFile?: string, debugRequestFile?: string, debugResponseFile?: string } = { model: \"gpt-4o-mini\" }): Promise<string | any> {\n const logger = getLogger();\n const storage = Storage.create({ log: logger.debug });\n let openai: OpenAI | null = null;\n try {\n const apiKey = process.env.OPENAI_API_KEY;\n if (!apiKey) {\n throw new OpenAIError('OPENAI_API_KEY environment variable is not set');\n }\n\n // Create the client which we'll close in the finally block.\n openai = new OpenAI({\n apiKey: apiKey,\n timeout: 180000, // 180 seconds timeout\n });\n\n logger.debug('Sending prompt to OpenAI: %j', messages);\n\n // Save request debug file if enabled\n if (options.debug && (options.debugRequestFile || options.debugFile)) {\n const requestData = {\n model: options.model || \"gpt-4o-mini\",\n messages,\n max_completion_tokens: 10000,\n response_format: options.responseFormat,\n };\n const debugFile = options.debugRequestFile || options.debugFile;\n await storage.writeFile(debugFile!, JSON.stringify(requestData, null, 2), 'utf8');\n logger.debug('Wrote request debug file to %s', debugFile);\n }\n\n // Add timeout wrapper to the OpenAI API call\n const completionPromise = openai.chat.completions.create({\n model: options.model || \"gpt-4o-mini\",\n messages,\n max_completion_tokens: 10000,\n response_format: options.responseFormat,\n });\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new OpenAIError('OpenAI API call timed out after 180 seconds')), 180000);\n });\n\n const completion = await Promise.race([completionPromise, timeoutPromise]);\n\n // Save response debug file if enabled\n if (options.debug && (options.debugResponseFile || options.debugFile)) {\n const debugFile = options.debugResponseFile || options.debugFile;\n await storage.writeFile(debugFile!, JSON.stringify(completion, null, 2), 'utf8');\n logger.debug('Wrote response debug file to %s', debugFile);\n }\n\n const response = completion.choices[0]?.message?.content?.trim();\n if (!response) {\n throw new OpenAIError('No response received from OpenAI');\n }\n\n logger.debug('Received response from OpenAI: %s...', response.substring(0, 30));\n if (options.responseFormat) {\n return JSON.parse(response);\n } else {\n return response;\n }\n\n } catch (error: any) {\n logger.error('Error calling OpenAI API: %s %s', error.message, error.stack);\n throw new OpenAIError(`Failed to create completion: ${error.message}`);\n } finally {\n // OpenAI client cleanup is handled automatically by the library\n // No manual cleanup needed for newer versions\n }\n}\n\nexport async function transcribeAudio(filePath: string, options: { model?: string, debug?: boolean, debugFile?: string, debugRequestFile?: string, debugResponseFile?: string, outputDirectory?: string } = { model: \"whisper-1\" }): Promise<Transcription> {\n const logger = getLogger();\n const storage = Storage.create({ log: logger.debug });\n let openai: OpenAI | null = null;\n let audioStream: fs.ReadStream | null = null;\n try {\n const apiKey = process.env.OPENAI_API_KEY;\n if (!apiKey) {\n throw new OpenAIError('OPENAI_API_KEY environment variable is not set');\n }\n\n openai = new OpenAI({\n apiKey: apiKey,\n });\n\n logger.debug('Transcribing audio file: %s', filePath);\n\n // Save request debug file if enabled\n if (options.debug && (options.debugRequestFile || options.debugFile)) {\n const requestData = {\n model: options.model || \"whisper-1\",\n file: filePath, // Can't serialize the stream, so just save the file path\n response_format: \"json\",\n };\n const debugFile = options.debugRequestFile || options.debugFile;\n await storage.writeFile(debugFile!, JSON.stringify(requestData, null, 2), 'utf8');\n logger.debug('Wrote request debug file to %s', debugFile);\n }\n\n audioStream = await storage.readStream(filePath);\n const transcription = await openai.audio.transcriptions.create({\n model: options.model || \"whisper-1\",\n file: audioStream,\n response_format: \"json\",\n });\n\n // Save response debug file if enabled\n if (options.debug && (options.debugResponseFile || options.debugFile)) {\n const debugFile = options.debugResponseFile || options.debugFile;\n await storage.writeFile(debugFile!, JSON.stringify(transcription, null, 2), 'utf8');\n logger.debug('Wrote response debug file to %s', debugFile);\n }\n\n const response = transcription;\n if (!response) {\n throw new OpenAIError('No transcription received from OpenAI');\n }\n\n logger.debug('Received transcription from OpenAI: %s', response);\n\n // Archive the audio file and transcription\n try {\n const outputDir = options.outputDirectory || 'output';\n await archiveAudio(filePath, response.text, outputDir);\n } catch (archiveError: any) {\n // Don't fail the transcription if archiving fails, just log the error\n logger.warn('Failed to archive audio file: %s', archiveError.message);\n }\n\n return response;\n\n } catch (error: any) {\n logger.error('Error transcribing audio file: %s %s', error.message, error.stack);\n throw new OpenAIError(`Failed to transcribe audio: ${error.message}`);\n } finally {\n // Ensure the audio stream is properly closed to release file handles\n try {\n if (audioStream) {\n audioStream.close();\n }\n } catch (streamErr) {\n logger.debug('Failed to close audio read stream: %s', (streamErr as Error).message);\n }\n // OpenAI client cleanup is handled automatically by the library\n // No manual cleanup needed for newer versions\n }\n}\n"],"names":["OpenAIError","Error","message","name","createCompletion","messages","options","model","logger","getLogger","storage","Storage","log","debug","openai","completion","apiKey","process","env","OPENAI_API_KEY","OpenAI","timeout","debugRequestFile","debugFile","requestData","max_completion_tokens","response_format","responseFormat","writeFile","JSON","stringify","completionPromise","chat","completions","create","timeoutPromise","Promise","_","reject","setTimeout","race","debugResponseFile","response","choices","content","trim","substring","parse","error","stack","transcribeAudio","filePath","audioStream","file","readStream","transcription","audio","transcriptions","outputDir","outputDirectory","archiveAudio","text","archiveError","warn","close","streamErr"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"openai.js","sources":["../../src/util/openai.ts"],"sourcesContent":["import { OpenAI } from 'openai';\nimport { ChatCompletionMessageParam } from 'openai/resources';\nimport * as Storage from './storage';\nimport { getLogger } from '../logging';\nimport { archiveAudio } from './general';\n// eslint-disable-next-line no-restricted-imports\nimport fs from 'fs';\n\nexport interface Transcription {\n text: string;\n}\n\nexport class OpenAIError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'OpenAIError';\n }\n}\n\nexport async function createCompletion(messages: ChatCompletionMessageParam[], options: { responseFormat?: any, model?: string, debug?: boolean, debugFile?: string, debugRequestFile?: string, debugResponseFile?: string, maxTokens?: number } = { model: \"gpt-4o-mini\" }): Promise<string | any> {\n const logger = getLogger();\n const storage = Storage.create({ log: logger.debug });\n let openai: OpenAI | null = null;\n try {\n const apiKey = process.env.OPENAI_API_KEY;\n if (!apiKey) {\n throw new OpenAIError('OPENAI_API_KEY environment variable is not set');\n }\n\n // Create the client which we'll close in the finally block.\n openai = new OpenAI({\n apiKey: apiKey,\n timeout: 180000, // 180 seconds timeout\n });\n\n logger.debug('Sending prompt to OpenAI: %j', messages);\n\n // Use provided maxTokens or default to 10000\n const maxCompletionTokens = options.maxTokens || 10000;\n\n // Save request debug file if enabled\n if (options.debug && (options.debugRequestFile || options.debugFile)) {\n const requestData = {\n model: options.model || \"gpt-4o-mini\",\n messages,\n max_completion_tokens: maxCompletionTokens,\n response_format: options.responseFormat,\n };\n const debugFile = options.debugRequestFile || options.debugFile;\n await storage.writeFile(debugFile!, JSON.stringify(requestData, null, 2), 'utf8');\n logger.debug('Wrote request debug file to %s', debugFile);\n }\n\n // Add timeout wrapper to the OpenAI API call\n const completionPromise = openai.chat.completions.create({\n model: options.model || \"gpt-4o-mini\",\n messages,\n max_completion_tokens: maxCompletionTokens,\n response_format: options.responseFormat,\n });\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new OpenAIError('OpenAI API call timed out after 180 seconds')), 180000);\n });\n\n const completion = await Promise.race([completionPromise, timeoutPromise]);\n\n // Save response debug file if enabled\n if (options.debug && (options.debugResponseFile || options.debugFile)) {\n const debugFile = options.debugResponseFile || options.debugFile;\n await storage.writeFile(debugFile!, JSON.stringify(completion, null, 2), 'utf8');\n logger.debug('Wrote response debug file to %s', debugFile);\n }\n\n const response = completion.choices[0]?.message?.content?.trim();\n if (!response) {\n throw new OpenAIError('No response received from OpenAI');\n }\n\n logger.debug('Received response from OpenAI: %s...', response.substring(0, 30));\n if (options.responseFormat) {\n return JSON.parse(response);\n } else {\n return response;\n }\n\n } catch (error: any) {\n logger.error('Error calling OpenAI API: %s %s', error.message, error.stack);\n throw new OpenAIError(`Failed to create completion: ${error.message}`);\n } finally {\n // OpenAI client cleanup is handled automatically by the library\n // No manual cleanup needed for newer versions\n }\n}\n\nexport async function transcribeAudio(filePath: string, options: { model?: string, debug?: boolean, debugFile?: string, debugRequestFile?: string, debugResponseFile?: string, outputDirectory?: string } = { model: \"whisper-1\" }): Promise<Transcription> {\n const logger = getLogger();\n const storage = Storage.create({ log: logger.debug });\n let openai: OpenAI | null = null;\n let audioStream: fs.ReadStream | null = null;\n try {\n const apiKey = process.env.OPENAI_API_KEY;\n if (!apiKey) {\n throw new OpenAIError('OPENAI_API_KEY environment variable is not set');\n }\n\n openai = new OpenAI({\n apiKey: apiKey,\n });\n\n logger.debug('Transcribing audio file: %s', filePath);\n\n // Save request debug file if enabled\n if (options.debug && (options.debugRequestFile || options.debugFile)) {\n const requestData = {\n model: options.model || \"whisper-1\",\n file: filePath, // Can't serialize the stream, so just save the file path\n response_format: \"json\",\n };\n const debugFile = options.debugRequestFile || options.debugFile;\n await storage.writeFile(debugFile!, JSON.stringify(requestData, null, 2), 'utf8');\n logger.debug('Wrote request debug file to %s', debugFile);\n }\n\n audioStream = await storage.readStream(filePath);\n const transcription = await openai.audio.transcriptions.create({\n model: options.model || \"whisper-1\",\n file: audioStream,\n response_format: \"json\",\n });\n\n // Save response debug file if enabled\n if (options.debug && (options.debugResponseFile || options.debugFile)) {\n const debugFile = options.debugResponseFile || options.debugFile;\n await storage.writeFile(debugFile!, JSON.stringify(transcription, null, 2), 'utf8');\n logger.debug('Wrote response debug file to %s', debugFile);\n }\n\n const response = transcription;\n if (!response) {\n throw new OpenAIError('No transcription received from OpenAI');\n }\n\n logger.debug('Received transcription from OpenAI: %s', response);\n\n // Archive the audio file and transcription\n try {\n const outputDir = options.outputDirectory || 'output';\n await archiveAudio(filePath, response.text, outputDir);\n } catch (archiveError: any) {\n // Don't fail the transcription if archiving fails, just log the error\n logger.warn('Failed to archive audio file: %s', archiveError.message);\n }\n\n return response;\n\n } catch (error: any) {\n logger.error('Error transcribing audio file: %s %s', error.message, error.stack);\n throw new OpenAIError(`Failed to transcribe audio: ${error.message}`);\n } finally {\n // Ensure the audio stream is properly closed to release file handles\n try {\n if (audioStream) {\n audioStream.close();\n }\n } catch (streamErr) {\n logger.debug('Failed to close audio read stream: %s', (streamErr as Error).message);\n }\n // OpenAI client cleanup is handled automatically by the library\n // No manual cleanup needed for newer versions\n }\n}\n"],"names":["OpenAIError","Error","message","name","createCompletion","messages","options","model","logger","getLogger","storage","Storage","log","debug","openai","completion","apiKey","process","env","OPENAI_API_KEY","OpenAI","timeout","maxCompletionTokens","maxTokens","debugRequestFile","debugFile","requestData","max_completion_tokens","response_format","responseFormat","writeFile","JSON","stringify","completionPromise","chat","completions","create","timeoutPromise","Promise","_","reject","setTimeout","race","debugResponseFile","response","choices","content","trim","substring","parse","error","stack","transcribeAudio","filePath","audioStream","file","readStream","transcription","audio","transcriptions","outputDir","outputDirectory","archiveAudio","text","archiveError","warn","close","streamErr"],"mappings":"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"}
|