@ai-development-environment/server 0.0.130 → 0.0.131
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/package.json +1 -1
- package/standalone/.next/BUILD_ID +1 -1
- package/standalone/.next/build-manifest.json +3 -3
- package/standalone/.next/prerender-manifest.json +3 -3
- package/standalone/.next/server/app/[locale]/(auth)/register/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(auth)/register/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(auth)/sign-in/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(auth)/sign-in/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/ai/costs/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/ai/costs/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/ai/drafts/new/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/ai/drafts/new/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/ai/drafts/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/ai/drafts/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/ai/plans/[runId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/ai/plans/[runId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/ai/plans/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/ai/plans/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/ai/sessions/[runId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/ai/sessions/[runId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/ai/sessions/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/ai/sessions/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/ai/skills/[skillId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/ai/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/ai/skills/groups/[groupId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/ai/skills/groups/[groupId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/ai/skills/groups/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/ai/skills/groups/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/ai/skills/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/ai/skills/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/ai/skills/sync/[runId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/ai/skills/sync/[runId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/ai/usage/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/ai/usage/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/action-center/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/action-center/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/agents/[id]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/agents/[id]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/agents/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/agents/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/apps/[appId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/apps/[appId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/apps/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/apps/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/builds/[buildId]/coverage/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/builds/[buildId]/coverage/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/builds/[buildId]/output/route.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/builds/[buildId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/builds/[buildId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/builds/configurations/[configurationId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/builds/configurations/[configurationId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/builds/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/builds/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/changes/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/changes/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/codebases/[codebaseId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/codebases/[codebaseId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/codebases/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/codebases/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/codebases/repositories/[repositoryId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/codebases/repositories/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/commands/[commandId]/edit/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/commands/[commandId]/edit/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/commands/new/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/commands/new/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/commands/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/commands/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/commands/runs/[runId]/output/route.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/commands/runs/[runId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/commands/runs/[runId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/jobs/[jobId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/jobs/[jobId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/notifications/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/notifications/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/workflows/[workflowId]/edit/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/workflows/[workflowId]/edit/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/workflows/[workflowId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/workflows/[workflowId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/workflows/new/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/workflows/new/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/workflows/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/workflows/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/workflows/runs/[runId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/workflows/runs/[runId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/worktrees/[worktreeId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/worktrees/[worktreeId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/worktrees/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/dashboard/worktrees/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/analytics-events/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/analytics-events/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/console-logs/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/console-logs/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/crashes/[crashId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/crashes/[crashId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/crashes/dsyms/[dsymId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/crashes/dsyms/[dsymId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/crashes/dsyms/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/crashes/dsyms/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/crashes/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/crashes/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/push-notifications/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/push-notifications/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/sse/[endpointId]/mocks/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/sse/[endpointId]/mocks/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/sse/[endpointId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/sse/[endpointId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/sse/breakpoints/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/sse/breakpoints/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/sse/history/[requestId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/sse/history/[requestId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/sse/history/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/sse/history/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/sse/new/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/sse/new/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/sse/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/sse/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/sse/storage/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/sse/storage/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/unified-events/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/debugging/unified-events/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/github/actions/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/github/actions/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/github/actions-cache/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/github/actions-cache/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/github/cache/entries/[id]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/github/cache/entries/[id]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/github/cache/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/github/cache/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/github/comments/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/github/comments/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/github/pull-requests/[owner]/[repository]/[number]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/github/pull-requests/[owner]/[repository]/[number]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/github/pull-requests/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/github/pull-requests/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/github/webhooks/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/github/webhooks/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/gitlab/cache/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/gitlab/cache/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/gitlab/comments/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/gitlab/comments/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/gitlab/merge-requests/[projectId]/[iid]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/gitlab/merge-requests/[projectId]/[iid]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/gitlab/merge-requests/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/gitlab/merge-requests/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/gitlab/pipelines/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/gitlab/pipelines/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/gitlab/webhooks/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/gitlab/webhooks/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/jira/cache/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/jira/cache/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/jira/cache/tickets/[issueKey]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/jira/cache/tickets/[issueKey]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/jira/tickets/[issueKey]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/jira/tickets/[issueKey]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/jira/tickets/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/jira/tickets/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/jira/webhooks/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/jira/webhooks/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/api-keys/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/api-keys/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/build-data/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/build-data/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/connected-applications/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/connected-applications/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/credentials/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/credentials/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/devices/[id]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/devices/[id]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/devices/enroll/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/devices/enroll/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/devices/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/devices/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/polling/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/polling/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/prepare/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/prepare/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/provisioning-profiles/[profileId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/provisioning-profiles/[profileId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/provisioning-profiles/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/provisioning-profiles/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/settings/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/settings/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/status/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/status/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/tailscale/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/tailscale/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/tools/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/tools/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/users/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/system/users/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(mcp)/mcp/consent/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(mcp)/mcp/consent/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/(mcp)/mcp/sign-in/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(mcp)/mcp/sign-in/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/_global-error.html +1 -1
- package/standalone/.next/server/app/_global-error.rsc +1 -1
- package/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/standalone/.next/server/app/_not-found.html +1 -1
- package/standalone/.next/server/app/_not-found.rsc +1 -1
- package/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
- package/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
- package/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/standalone/.next/server/app/api/agent/build-artifact-transfers/[transferId]/complete/route.js +1 -1
- package/standalone/.next/server/app/api/agent/build-artifact-transfers/[transferId]/complete/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/agent/build-artifact-transfers/[transferId]/download/route.js +1 -1
- package/standalone/.next/server/app/api/agent/build-artifact-transfers/[transferId]/download/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/agent/build-artifact-transfers/[transferId]/route.js +1 -1
- package/standalone/.next/server/app/api/agent/build-artifact-transfers/[transferId]/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/agent/build-artifact-transfers/[transferId]/upload/route.js +1 -1
- package/standalone/.next/server/app/api/agent/build-artifact-transfers/[transferId]/upload/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/agent/dsyms/[dsymId]/dwarf/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/agent/run-attachments/[attachmentId]/route.js +1 -1
- package/standalone/.next/server/app/api/agent/run-attachments/[attachmentId]/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/build-artifact-uploads/[uploadId]/route.js +1 -1
- package/standalone/.next/server/app/api/build-artifact-uploads/[uploadId]/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/codebases/by-path/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/codebases/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/crash-files/dsyms/[dsymId]/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/crash-files/reports/[crashId]/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/dsyms/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/dsyms/uploads/[uploadId]/complete/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/dsyms/uploads/[uploadId]/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/dsyms/uploads/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/graphql/route.js +1 -1
- package/standalone/.next/server/app/api/graphql/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/ios/apns-devices/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/ios/devices/export.tsv/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/ios/enrollment/start/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/ios/notification-devices/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/mcp/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/public/builds/[buildId]/artifacts/[artifactId]/manifest.plist/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/public/builds/[buildId]/artifacts/[artifactId]/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/public/crashes/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/public/github/webhook/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/public/gitlab/webhook/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/public/ios/enrollment-profile/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/public/ios/profile-response/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/public/jira/webhook/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/public/sse/[token]/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/run-attachments/[attachmentId]/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/run-attachments/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/sse/history/export/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/telemetry/analytics-events/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/telemetry/console-logs/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/telemetry/export/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/tools/call/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/tools/catalog/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/worktrees/[worktreeId]/diff-image/route.js.nft.json +1 -1
- package/standalone/.next/server/chunks/{[root-of-the-server]__0hjegpvurx-qp._.js → [root-of-the-server]__01yq1kxt3tcs5._.js} +1 -1
- package/standalone/.next/server/chunks/{[root-of-the-server]__0jt869r42yzkz._.js → [root-of-the-server]__03ybdczxg_r56._.js} +1 -1
- package/standalone/.next/server/chunks/{[root-of-the-server]__0-w9hau1wg6x5._.js → [root-of-the-server]__08liq7hjy8jkd._.js} +1 -1
- package/standalone/.next/server/chunks/{[root-of-the-server]__0i9dbzy7vmjvf._.js → [root-of-the-server]__0axkrpt5jvo9a._.js} +1 -1
- package/standalone/.next/server/chunks/{[root-of-the-server]__06m2gjiyrca2o._.js → [root-of-the-server]__0cf7tu_v4i5j5._.js} +1 -1
- package/standalone/.next/server/chunks/{[root-of-the-server]__0_ksvmf449oku._.js → [root-of-the-server]__0d31pdi_y1ygv._.js} +2 -2
- package/standalone/.next/server/chunks/{[root-of-the-server]__06s9z4voulm-7._.js → [root-of-the-server]__0d4btvbueeds8._.js} +1 -1
- package/standalone/.next/server/chunks/{[root-of-the-server]__07uncdie_3fqz._.js → [root-of-the-server]__0h374zchua6u5._.js} +1 -1
- package/standalone/.next/server/chunks/{[root-of-the-server]__0s5kgn705_xrt._.js → [root-of-the-server]__0jbflrhpa5dzs._.js} +1 -1
- package/standalone/.next/server/chunks/{[root-of-the-server]__00aamhqamrwhq._.js → [root-of-the-server]__0ksbjlakayjeg._.js} +1 -1
- package/standalone/.next/server/chunks/{[root-of-the-server]__09-xatwq-ud3p._.js → [root-of-the-server]__0l1cpvoby8l9z._.js} +1 -1
- package/standalone/.next/server/chunks/{[root-of-the-server]__1f-ybvd_fhf-2._.js → [root-of-the-server]__0p10jubmns5pq._.js} +1 -1
- package/standalone/.next/server/chunks/{[root-of-the-server]__0tnhbz9uikd7p._.js → [root-of-the-server]__0vneehawylqdb._.js} +1 -1
- package/standalone/.next/server/chunks/{[root-of-the-server]__0xgsj7g8ww_t6._.js → [root-of-the-server]__0vnunsj1tqxhs._.js} +2 -2
- package/standalone/.next/server/chunks/{[root-of-the-server]__0e39hkkur4tdq._.js → [root-of-the-server]__0z_4chwbw4ivu._.js} +2 -2
- package/standalone/.next/server/chunks/{[root-of-the-server]__0a4uce2kn3f18._.js → [root-of-the-server]__1-hzfko3529pb._.js} +1 -1
- package/standalone/.next/server/chunks/{[root-of-the-server]__0z1y-zgh7bupn._.js → [root-of-the-server]__10qxafo8vhitg._.js} +1 -1
- package/standalone/.next/server/chunks/{[root-of-the-server]__0f8-5blroj8l4._.js → [root-of-the-server]__16fb5l-iz58fr._.js} +2 -2
- package/standalone/.next/server/chunks/{[root-of-the-server]__0vpjsl35ie7o9._.js → [root-of-the-server]__1bgml5ria00_k._.js} +1 -1
- package/standalone/.next/server/chunks/[root-of-the-server]__1c62psuih4_k9._.js +3 -0
- package/standalone/.next/server/chunks/{[root-of-the-server]__0569g2n-iqtqj._.js → [root-of-the-server]__1coqpqjqxmhrb._.js} +1 -1
- package/standalone/.next/server/chunks/[root-of-the-server]__1fsgcggwi0snx._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1fyf_moef6p8l._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1hj1mebpn4mih._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1o9xlhi4bgklz._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1p089st69lou0._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1phofmej0zr1s._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1qtcmyz3cocuh._.js +3 -0
- package/standalone/.next/server/chunks/{[root-of-the-server]__0sr3mpfw4r8gc._.js → [root-of-the-server]__1ri8d3qvfyvec._.js} +2 -2
- package/standalone/.next/server/chunks/{[root-of-the-server]__03f5b6bkl6aix._.js → [root-of-the-server]__1rj3o65kiko3b._.js} +2 -2
- package/standalone/.next/server/chunks/[root-of-the-server]__1sor2nihj-gu9._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1tdosp26vh-cm._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1ts9z7hmp0x0v._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1w0t_x3ytpo4c._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1z7ya5ehncn-c._.js +3 -0
- package/standalone/.next/server/chunks/_02mipoz3yx326._.js +108 -14
- package/standalone/.next/server/chunks/_05-0fg3-6nxfz._.js +2 -2
- package/standalone/.next/server/chunks/_09yoi7vle8-p8._.js +2 -2
- package/standalone/.next/server/chunks/_0e09pfc4ngmjt._.js +2 -2
- package/standalone/.next/server/chunks/_0s9ju0jh3bjvv._.js +2 -2
- package/standalone/.next/server/chunks/_0wf0plgfred1s._.js +108 -14
- package/standalone/.next/server/chunks/_0yt0ag8ogzkpo._.js +2 -2
- package/standalone/.next/server/chunks/_159jskugflhe1._.js +3 -3
- package/standalone/.next/server/chunks/_16mi1fdjv-ttu._.js +2 -2
- package/standalone/.next/server/chunks/_16tl-jjvokalw._.js +2 -2
- package/standalone/.next/server/chunks/_1_2y0u7fotnj9._.js +2 -2
- package/standalone/.next/server/chunks/{_1tjxax0udpzpp._.js → _1_wh1ec-2o48m._.js} +96 -2
- package/standalone/.next/server/chunks/_1dvaeoxy6mi-5._.js +3 -3
- package/standalone/.next/server/chunks/_1k1f9a5th4_mf._.js +2 -2
- package/standalone/.next/server/chunks/_1uk_t2708atwy._.js +2 -2
- package/standalone/.next/server/chunks/_1wycw9ka35xs9._.js +3 -3
- package/standalone/.next/server/chunks/_1xmq6bnjsnu8v._.js +2 -2
- package/standalone/.next/server/chunks/src_06620x_9xof19._.js +1 -1
- package/standalone/.next/server/chunks/src_services_0shipcub2yhy6._.js +1 -1
- package/standalone/.next/server/chunks/ssr/_003c9h921os5x._.js +11 -2
- package/standalone/.next/server/chunks/ssr/_09frr_x9sj064._.js +22 -20
- package/standalone/.next/server/chunks/ssr/_0wpoapzcyfgyq._.js +22 -20
- package/standalone/.next/server/chunks/ssr/_0x-yk4-j0jzr_._.js +22 -20
- package/standalone/.next/server/chunks/ssr/{_0vju6f-hf9vvn._.js → _1ar2yl573rmcg._.js} +1 -1
- package/standalone/.next/server/chunks/ssr/_1c2l10eipkbhb._.js +11 -2
- package/standalone/.next/server/chunks/ssr/_1j4th2umomnn-._.js +11 -2
- package/standalone/.next/server/chunks/ssr/_1jjtult-x-57z._.js +11 -2
- package/standalone/.next/server/chunks/ssr/_1nq6rrkcdihtp._.js +3 -0
- package/standalone/.next/server/chunks/ssr/_1sxiiw_mgqyi0._.js +11 -2
- package/standalone/.next/server/chunks/ssr/_1ujnuzin3idis._.js +3 -0
- package/standalone/.next/server/chunks/ssr/messages_de_json_[json]_cjs_1uig1ud36h5oz._.js +1 -1
- package/standalone/.next/server/chunks/ssr/messages_en_json_[json]_cjs_206072-e4clp3._.js +1 -1
- package/standalone/.next/server/chunks/ssr/messages_es_json_[json]_cjs_082yukd_h99n8._.js +1 -1
- package/standalone/.next/server/chunks/ssr/messages_fr_json_[json]_cjs_0j6-w0ix_w_ac._.js +1 -1
- package/standalone/.next/server/chunks/ssr/{node_modules_124_-_72356a1._.js → node_modules_1gzler2prpvuu._.js} +1 -1
- package/standalone/.next/server/chunks/ssr/src_components_agents_1h2c2ip6jqvl0._.js +5 -0
- package/standalone/.next/server/chunks/ssr/src_components_agents_1tuxa3sue04gs._.js +5 -0
- package/standalone/.next/server/chunks/ssr/src_components_agents_agent-detail_tsx_0lfa4uiys5oxb._.js +22 -22
- package/standalone/.next/server/chunks/ssr/src_components_agents_agents-list_tsx_0hz7m22l4--2j._.js +1 -1
- package/standalone/.next/server/chunks/ssr/src_lib_control-plane-client_ts_1ovfa4nqxphuc._.js +1 -1
- package/standalone/.next/server/middleware-build-manifest.js +3 -3
- package/standalone/.next/server/pages/404.html +1 -1
- package/standalone/.next/server/pages/500.html +1 -1
- package/standalone/.next/server/preview-props.json +3 -3
- package/standalone/.next/server/server-reference-manifest.js +1 -1
- package/standalone/.next/server/server-reference-manifest.json +1 -1
- package/standalone/.next/static/chunks/{0yyibsmc1x0fk.js → 03ul-f7fkx6-m.js} +18 -9
- package/standalone/.next/static/chunks/06i8z2n00eta3.js +173 -0
- package/standalone/.next/static/chunks/{2e-ygqo0s_u13.js → 0nd5w69eookzq.js} +18 -9
- package/standalone/.next/static/chunks/1v3l2hnge_w44.js +1 -0
- package/standalone/.next/static/chunks/1vohvf2mi4wbp.js +46 -0
- package/standalone/.next/static/chunks/{39xqauhnlx-3n.js → 26gh6vsm1kt0w.js} +23 -14
- package/standalone/.next/static/chunks/2h15blliw-aid.js +54 -0
- package/standalone/.next/static/chunks/2kblq31r4mka3.js +7 -0
- package/standalone/.next/static/chunks/2m96kfrw0imb4.js +24 -0
- package/standalone/.next/static/chunks/{1pipry6ng09bb.css → 2n--68blak0tt.css} +1 -1
- package/standalone/.next/static/chunks/{13623d3jab6vm.js → 2y99aa6snk535.js} +17 -8
- package/standalone/.next/server/chunks/[root-of-the-server]__11adibsl0kbap._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1_e1dwxjxs7t-._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1ari69u0znx5n._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1j4iu2f41p-yo._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1krmyi73tn6ow._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1nyz09_tss7yf._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1o4t76d95ijtz._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1okr1gcw9fgal._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1q84qtcvzi1g9._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1r1o47_vtjr_-._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1sok4i2j1u-1v._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__20bjknlxmt1ci._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__211wb05m63g37._.js +0 -3
- package/standalone/.next/server/chunks/ssr/_0ens5u1l-_vah._.js +0 -3
- package/standalone/.next/server/chunks/ssr/_17xtkxgta8j84._.js +0 -3
- package/standalone/.next/server/chunks/ssr/src_components_agents_0gz1a35-7zct2._.js +0 -3
- package/standalone/.next/static/chunks/0iuc4fye_mkuc.js +0 -52
- package/standalone/.next/static/chunks/1isxygn8ix7sp.js +0 -171
- package/standalone/.next/static/chunks/1qqmiyzd071fl.js +0 -1
- package/standalone/.next/static/chunks/1xrrl3ex_ybkf.js +0 -46
- package/standalone/.next/static/chunks/3j25esleqxt4a.js +0 -15
- package/standalone/.next/static/chunks/3ueflsd9w92bi.js +0 -5
- /package/standalone/.next/static/{RUNUd01nvm8SEzNBz3axk → 1I2pKdbSCeykSYjiSoyzQ}/_buildManifest.js +0 -0
- /package/standalone/.next/static/{RUNUd01nvm8SEzNBz3axk → 1I2pKdbSCeykSYjiSoyzQ}/_clientMiddlewareManifest.js +0 -0
- /package/standalone/.next/static/{RUNUd01nvm8SEzNBz3axk → 1I2pKdbSCeykSYjiSoyzQ}/_ssgManifest.js +0 -0
|
@@ -1427,14 +1427,14 @@ ${e}`}splitMarkdownIntoSections(A){let e=A.split(/(?=^#{1,6}\s)|(?:\n\s*\n)/m).f
|
|
|
1427
1427
|
id requiresApprovingReviews requiredApprovingReviewCount requiresCodeOwnerReviews requireLastPushApproval
|
|
1428
1428
|
} }
|
|
1429
1429
|
}
|
|
1430
|
-
}`,{owner:E,name:m,ref:`refs/heads/${S}`},!!r,i).then(A=>A.repository?.ref?.branchProtectionRule??null).catch(A=>(b("GitHub branch protection could not be loaded",A),null))]),_=[],J=[],G=[];if(M){let[A,e,t]=await Promise.all([Q(`${f}/pulls/${M.number}/files`),w(`${f}/pulls/${M.number}/requested_reviewers`),Q(`${f}/pulls/${M.number}/reviews`)]);_=[...new Set(A.flatMap(A=>[A.filename,...A.previous_filename?[A.previous_filename]:[]]))],A.length<M.changed_files&&b("GitHub changed files are incomplete",Error("The pull request exceeds the provider file-list limit")),J=u((e.users??[]).map(c));let r=new Map;for(let A of[...t].sort((A,e)=>A.id-e.id))["APPROVED","CHANGES_REQUESTED","DISMISSED"].includes(A.state)&&r.set(String(A.user.id),A);G=u([...r.values()].filter(A=>"APPROVED"===A.state).map(A=>c(A.user)))}let L=G.map(A=>A.id),P=[],j=U.filter(A=>"pull_request"===A.type),Y=Math.max(O?.requiresApprovingReviews?O.requiredApprovingReviewCount:0,0,...j.map(A=>A.parameters?.required_approving_review_count??0)),F=!!(O?.requiresCodeOwnerReviews||j.some(A=>A.parameters?.require_code_owner_review));M&&(O?.requireLastPushApproval||j.some(A=>A.parameters?.require_last_push_approval))&&b("Latest-push approval cannot be fully verified",Error("GitHub requires approval after the latest push from someone other than its pusher. Check this requirement in GitHub before merging.")),M&&Y>0&&P.push({id:"github:required-approvals",name:"Required approvals",poolKeys:[x],eligibleReviewerIds:H.map(A=>A.id),requiredApprovals:Y,approvedReviewerIds:L});let q=new Map,V=(A,e,t)=>{let r=`${A.toLowerCase()}/${e.toLowerCase()}/${t}`,i=q.get(r);return i||(i=(async()=>{let r=`/orgs/${encodeURIComponent(A)}/teams/${encodeURIComponent(e)}`,i=await w(r);if(t){let t=await w(`${r}/repos/${encodeURIComponent(E)}/${encodeURIComponent(m)}`);if(!t.permissions?.push&&!["push","write","maintain","admin"].includes(t.permission??""))return{principal:`team:${i.id}`,label:`@${A}/${e}`,people:[]}}let n=await Q(`${r}/members`);return{principal:`team:${i.id}`,label:`@${A}/${e}`,people:n.filter(d).map(c).filter(A=>R.has(A.id))}})(),q.set(r,i)),i};for(let A of j)for(let e of A.parameters?.required_reviewers??[])try{if("Team"!==e.reviewer.type)throw Error("Unsupported required-reviewer type");a??=Q(`/orgs/${encodeURIComponent(E)}/teams`);let t=(await a).find(A=>A.id===e.reviewer.id);if(!t)throw Error(`Team ${e.reviewer.id} is not visible to the configured token`);let r=await V(E,t.slug,!1),i=`${B}:ruleset:${A.ruleset_source_type}:${A.ruleset_id}:team:${t.id}`;h(v,{key:i,name:`Rule ${A.ruleset_id} \xb7 ${t.name}`,kind:"APPROVAL_RULE",candidates:r.people}),M&&function(A,e){return e.some(e=>{let t=!1;for(let r of A)s(r.replace(/^!/,""),e,{characterClasses:!0})&&(t=!r.startsWith("!"));return t})}(e.file_patterns,_)&&P.push({id:`${i}:${P.length}`,name:`${t.name}${e.minimum_approvals?" approval rule":" (optional review)"}`,poolKeys:[i],eligibleReviewerIds:r.people.map(A=>A.id),requiredApprovals:e.minimum_approvals,approvedReviewerIds:L})}catch(A){b("GitHub required-reviewer team could not be loaded",A)}for(let A of[".github/CODEOWNERS","CODEOWNERS","docs/CODEOWNERS"])try{let e=await w(`${f}/contents/${A}?ref=${encodeURIComponent(S)}`);if(e.size>=3145728)throw Error("GitHub ignores CODEOWNERS files of 3 MB or larger");if("base64"!==e.encoding||"string"!=typeof e.content)throw Error("GitHub CODEOWNERS contents were not returned");l=Buffer.from(e.content,"base64").toString("utf8");break}catch(A){if(p(A,404))continue;b("GitHub CODEOWNERS could not be loaded",A);break}if(void 0!==l){let A=n(l,"GITHUB"),t=new Set(M?o(A,_):[]),r=new Map,i=A=>{let e=r.get(A.toLowerCase());return e||(e=(async()=>{if(A.startsWith("@")&&A.includes("/")){let[e,t]=A.slice(1).split("/");return V(e,t,!0)}if(A.startsWith("@")){let e=await w(`/users/${encodeURIComponent(A.slice(1))}`),t=R.get(String(e.id));return{principal:`user:${e.id}`,label:`@${e.login}`,people:t?[t]:[]}}let e=N.find(e=>(e.email??e.public_email)?.toLowerCase()===A.toLowerCase());if(!e)throw Error(`Email owner ${A} cannot be resolved with the configured token; use a visible username or team`);return{principal:`user:${e.id}`,label:`@${e.login}`,people:[c(e)]}})(),r.set(A.toLowerCase(),e)),e};await (0,e.f)(A.filter(A=>A.owners.length>0),async A=>{try{let r=await (0,e.f)(A.owners,i),n=g(B,r.map(A=>A.principal)),a=u(r.flatMap(A=>A.people)),s=r.map(A=>A.label).join(" or ");h(v,{key:n,name:s,kind:"CODEOWNERS",candidates:a}),M&&t.has(A)&&P.push({id:`github:codeowners:${A.pattern}`,name:`${F?"Code owners":"Suggested code owners"} \xb7 ${A.pattern}`,poolKeys:[n],eligibleReviewerIds:a.map(A=>A.id),requiredApprovals:1,approvedReviewerIds:L})}catch(e){b(`GitHub owners for ${A.pattern} could not be resolved`,e)}})}return{provider:"GITHUB",repositoryIdentity:B,ref:S,defaultRef:y.default_branch,refs:[...new Set([y.default_branch,S,...T])],pools:[...v.values()],requirements:P,issues:[...new Set(D)],discoveryComplete:k,...M?{request:{id:r.id,number:M.number,url:M.html_url,open:"open"===M.state&&!M.merged,authorId:String(M.user.id),baseRef:M.base.ref,headSha:M.head.sha,currentReviewers:J,approvedReviewers:G}}:{}}}async assign(A,e,t){let{owner:r,name:i}=this.parts(A);await this.service.addPullRequestReviewers({owner:r,name:i,number:e.number,expectedId:e.id,reviewers:t.map(({id:A,username:e})=>({id:A,username:e}))})}}let m=A=>A.split("/").pop();class f{service;constructor(A){this.service=A}async discover(A,t,r,i=!1){let a,s,l=await this.service.projectForCanonicalOrigin(A.canonicalOrigin);if(!l)throw Error("Configure this GitLab project in integration settings before setting up reviewers");if(r?.projectId&&r.projectId!==String(l.id))throw Error("Merge request project does not match reviewer settings");let E=`/projects/${encodeURIComponent(l.id)}`,f=(A,e={})=>this.service.reviewerRest(A,e,i||!!r,!!r),w=(A,e={})=>C(t=>f(A,{...e,per_page:100,page:t})),[Q,y]=await Promise.all([this.service.getSettings(),f(E)]),B=`GITLAB:${Q.baseUrl.replace(/\/+$/,"").toLowerCase()}:${y.id}`,D=[],k=!0,b=(A,e)=>{k=!1,D.push(`${A}: ${I(e)}`)},M=r?await f(`${E}/merge_requests/${r.number}`):void 0;if(M&&r&&String(M.id)!==m(r.id))throw Error("The merge request changed. Refresh before assigning reviewers.");if(M&&M.target_project_id!==y.id)throw Error("Merge request target project does not match reviewer settings");let S=M?.target_branch??t??y.default_branch,[N,H,R,v]=await Promise.all([w(`${E}/members/all`).catch(A=>(b("GitLab project membership could not be loaded",A),[])),w(`${E}/members`).catch(A=>(b("GitLab direct project membership could not be loaded",A),[])),w(`${E}/repository/branches`).then(A=>A.map(A=>A.name)).catch(()=>[y.default_branch]),w(`${E}/approval_rules`).catch(A=>(r||(k=!1),D.push(`GitLab project approval rules are unavailable (Premium/Ultimate and suitable permissions are required): ${I(A)}`),[]))]),x=N.filter(A=>d(A)&&(A.access_level??0)>=30),T=u(x.map(c)),U=new Map(T.map(A=>[A.id,A])),O=new Map,_=`${B}:general`;for(let A of(O.set(_,{key:_,name:"General reviewers",kind:"GENERAL",candidates:T}),v)){let e="any_approver"===A.rule_type?T:(A.eligible_approvers??[]).filter(d).map(c);h(O,{key:`${B}:rule:${A.id}`,name:A.name,kind:"APPROVAL_RULE",candidates:e})}for(let A of["CODEOWNERS","docs/CODEOWNERS",".gitlab/CODEOWNERS"])try{let e=await f(`${E}/repository/files/${encodeURIComponent(A)}`,{ref:S});if("base64"!==e.encoding||"string"!=typeof e.content)throw Error("GitLab CODEOWNERS contents were not returned");a=Buffer.from(e.content,"base64").toString("utf8");break}catch(A){if(p(A,404))continue;b("GitLab CODEOWNERS could not be loaded",A);break}let J=void 0===a?[]:n(a,"GITLAB"),G=new Map,L=new Map,P=A=>{let e=L.get(A.toLowerCase());return e||(e=(async()=>{if(A.startsWith("@@")){let e=A.slice(2).toLowerCase().replace(/s$/,""),t={developer:30,maintainer:40,owner:50}[e];if(!t)throw Error(`Unsupported GitLab CODEOWNERS role: ${A}`);return{principal:`role:${t}`,label:`@@${e}`,people:H.filter(A=>d(A)&&A.access_level===t).map(c)}}let e=A.startsWith("@")?A.slice(1):null,t=x.find(t=>e?t.username?.toLowerCase()===e.toLowerCase():(t.email??t.public_email)?.toLowerCase()===A.toLowerCase());if(t)return{principal:`user:${t.id}`,label:`@${t.username}`,people:[c(t)]};if(!e)throw Error(`Email owner ${A} is not visible to the configured token; use a visible username or group`);let r=(e.includes("/")?[]:await f("/users",{username:e})).find(A=>A.username?.toLowerCase()===e.toLowerCase());if(r)return{principal:`user:${r.id}`,label:`@${r.username}`,people:U.has(String(r.id))?[c(r)]:[]};let i=await f(`/groups/${encodeURIComponent(e)}`,{with_projects:"false"});if(!(await (s??=(async()=>{let A=new Set((y.shared_with_groups??[]).filter(A=>A.group_access_level>=30).map(A=>A.group_id)),e="group"===y.namespace.kind?y.namespace.id:null,t=new Set;for(;null!==e&&!t.has(e);){t.add(e),A.add(e);let r=await f(`/groups/${e}`,{with_projects:"false"});for(let e of r.shared_with_groups??[])e.group_access_level>=30&&A.add(e.group_id);e=r.parent_id}return A})())).has(i.id))return{principal:`group:${i.id}`,label:`@${i.full_path}`,people:[]};let n=await w(`/groups/${i.id}/members`);return{principal:`group:${i.id}`,label:`@${i.full_path}`,people:n.filter(d).map(c).filter(A=>U.has(A.id))}})(),L.set(A.toLowerCase(),e)),e};for(let A of(await (0,e.f)(J.filter(A=>!A.exclusion&&A.owners.length),async A=>{try{let t=await (0,e.f)(A.owners,P);return{entry:A,resolved:t}}catch(e){return{entry:A,error:e}}}))){if(!A.resolved){b(`GitLab owners for ${A.entry.pattern} could not be resolved`,A.error);continue}let e=g(B,A.resolved.map(A=>A.principal));h(O,{key:e,name:A.resolved.map(A=>A.label).join(" or "),kind:"CODEOWNERS",candidates:A.resolved.flatMap(A=>A.people)}),G.set(`${A.entry.section}\0${A.entry.pattern}`,e)}let j=[],Y=[],[F,q]=(Q.version??"19.2").split(".").map(Number),V=F>19||19===F&&q>=4,z=async A=>{let e=await this.service.reviewerGraphql(`query CodeReviewerApprovalRules($path: ID!, $iid: String!) {
|
|
1430
|
+
}`,{owner:E,name:m,ref:`refs/heads/${S}`},!!r,i).then(A=>A.repository?.ref?.branchProtectionRule??null).catch(A=>(b("GitHub branch protection could not be loaded",A),null))]),_=[],J=[],G=[];if(M){let[A,e,t]=await Promise.all([Q(`${f}/pulls/${M.number}/files`).catch(A=>(b("GitHub changed files could not be loaded",A),[])),w(`${f}/pulls/${M.number}/requested_reviewers`).catch(A=>(b("GitHub requested reviewers could not be loaded",A),{users:[]})),Q(`${f}/pulls/${M.number}/reviews`).catch(A=>(b("GitHub current approvals could not be loaded",A),[]))]);_=[...new Set(A.flatMap(A=>[A.filename,...A.previous_filename?[A.previous_filename]:[]]))],A.length<M.changed_files&&b("GitHub changed files are incomplete",Error("The pull request exceeds the provider file-list limit")),J=u((e.users??[]).map(c));let r=new Map;for(let A of[...t].sort((A,e)=>A.id-e.id))["APPROVED","CHANGES_REQUESTED","DISMISSED"].includes(A.state)&&r.set(String(A.user.id),A);G=u([...r.values()].filter(A=>"APPROVED"===A.state).map(A=>c(A.user)))}let L=G.map(A=>A.id),P=[],j=U.filter(A=>"pull_request"===A.type),Y=Math.max(O?.requiresApprovingReviews?O.requiredApprovingReviewCount:0,0,...j.map(A=>A.parameters?.required_approving_review_count??0)),F=!!(O?.requiresCodeOwnerReviews||j.some(A=>A.parameters?.require_code_owner_review));M&&(O?.requireLastPushApproval||j.some(A=>A.parameters?.require_last_push_approval))&&b("Latest-push approval cannot be fully verified",Error("GitHub requires approval after the latest push from someone other than its pusher. Check this requirement in GitHub before merging.")),M&&Y>0&&P.push({id:"github:required-approvals",name:"Required approvals",isRequired:!0,patterns:[],poolKeys:[x],eligibleReviewerIds:H.map(A=>A.id),requiredApprovals:Y,approvedReviewerIds:L});let q=new Map,V=(A,e,t)=>{let r=`${A.toLowerCase()}/${e.toLowerCase()}/${t}`,i=q.get(r);return i||(i=(async()=>{let r=`/orgs/${encodeURIComponent(A)}/teams/${encodeURIComponent(e)}`,i=await w(r);if(t){let t=await w(`${r}/repos/${encodeURIComponent(E)}/${encodeURIComponent(m)}`);if(!t.permissions?.push&&!["push","write","maintain","admin"].includes(t.permission??""))return{principal:`team:${i.id}`,label:`@${A}/${e}`,people:[]}}let n=await Q(`${r}/members`);return{principal:`team:${i.id}`,label:`@${A}/${e}`,people:n.filter(d).map(c).filter(A=>R.has(A.id))}})(),q.set(r,i)),i};for(let A of j)for(let e of A.parameters?.required_reviewers??[])try{if("Team"!==e.reviewer.type)throw Error("Unsupported required-reviewer type");a??=Q(`/orgs/${encodeURIComponent(E)}/teams`);let t=(await a).find(A=>A.id===e.reviewer.id);if(!t)throw Error(`Team ${e.reviewer.id} is not visible to the configured token`);let r=await V(E,t.slug,!1),i=`${B}:ruleset:${A.ruleset_source_type}:${A.ruleset_id}:team:${t.id}`;h(v,{key:i,name:`Rule ${A.ruleset_id} \xb7 ${t.name}`,kind:"APPROVAL_RULE",candidates:r.people}),M&&function(A,e){return e.some(e=>{let t=!1;for(let r of A)s(r.replace(/^!/,""),e,{characterClasses:!0})&&(t=!r.startsWith("!"));return t})}(e.file_patterns,_)&&P.push({id:`${i}:${P.length}`,name:`${t.name}${e.minimum_approvals?" approval rule":" (optional review)"}`,isRequired:e.minimum_approvals>0,patterns:e.file_patterns,poolKeys:[i],eligibleReviewerIds:r.people.map(A=>A.id),requiredApprovals:e.minimum_approvals,approvedReviewerIds:L})}catch(A){b("GitHub required-reviewer team could not be loaded",A)}for(let A of[".github/CODEOWNERS","CODEOWNERS","docs/CODEOWNERS"])try{let e=await w(`${f}/contents/${A}?ref=${encodeURIComponent(S)}`);if(e.size>=3145728)throw Error("GitHub ignores CODEOWNERS files of 3 MB or larger");if("base64"!==e.encoding||"string"!=typeof e.content)throw Error("GitHub CODEOWNERS contents were not returned");l=Buffer.from(e.content,"base64").toString("utf8");break}catch(A){if(p(A,404))continue;b("GitHub CODEOWNERS could not be loaded",A);break}if(void 0!==l){let A=n(l,"GITHUB"),t=new Set(M?o(A,_):[]),r=new Map,i=A=>{let e=r.get(A.toLowerCase());return e||(e=(async()=>{if(A.startsWith("@")&&A.includes("/")){let[e,t]=A.slice(1).split("/");return V(e,t,!0)}if(A.startsWith("@")){let e=await w(`/users/${encodeURIComponent(A.slice(1))}`),t=R.get(String(e.id));return{principal:`user:${e.id}`,label:`@${e.login}`,people:t?[t]:[]}}let e=N.find(e=>(e.email??e.public_email)?.toLowerCase()===A.toLowerCase());if(!e)throw Error(`Email owner ${A} cannot be resolved with the configured token; use a visible username or team`);return{principal:`user:${e.id}`,label:`@${e.login}`,people:[c(e)]}})(),r.set(A.toLowerCase(),e)),e};await (0,e.f)(A.filter(A=>A.owners.length>0),async A=>{try{let r=await (0,e.f)(A.owners,i),n=g(B,r.map(A=>A.principal)),a=u(r.flatMap(A=>A.people)),s=r.map(A=>A.label).join(" or ");h(v,{key:n,name:s,kind:"CODEOWNERS",candidates:a}),M&&t.has(A)&&P.push({id:`github:codeowners:${A.pattern}`,name:`${F?"Code owners":"Suggested code owners"} \xb7 ${A.pattern}`,isRequired:F,patterns:[A.pattern],poolKeys:[n],eligibleReviewerIds:a.map(A=>A.id),requiredApprovals:1,approvedReviewerIds:L})}catch(e){b(`GitHub owners for ${A.pattern} could not be resolved`,e)}})}return{provider:"GITHUB",repositoryIdentity:B,ref:S,defaultRef:y.default_branch,refs:[...new Set([y.default_branch,S,...T])],pools:[...v.values()],requirements:P,issues:[...new Set(D)],discoveryComplete:k,...M?{request:{id:r.id,number:M.number,url:M.html_url,open:"open"===M.state&&!M.merged,authorId:String(M.user.id),baseRef:M.base.ref,headSha:M.head.sha,currentReviewers:J,approvedReviewers:G}}:{}}}async assign(A,e,t){let{owner:r,name:i}=this.parts(A);await this.service.addPullRequestReviewers({owner:r,name:i,number:e.number,expectedId:e.id,reviewers:t.map(({id:A,username:e})=>({id:A,username:e}))})}}let m=A=>A.split("/").pop();class f{service;constructor(A){this.service=A}async discover(A,t,r,i=!1){let a,s,l=await this.service.projectForCanonicalOrigin(A.canonicalOrigin);if(!l)throw Error("Configure this GitLab project in integration settings before setting up reviewers");if(r?.projectId&&r.projectId!==String(l.id))throw Error("Merge request project does not match reviewer settings");let E=`/projects/${encodeURIComponent(l.id)}`,f=(A,e={})=>this.service.reviewerRest(A,e,i||!!r,!!r),w=(A,e={})=>C(t=>f(A,{...e,per_page:100,page:t})),[Q,y]=await Promise.all([this.service.getSettings(),f(E)]),B=`GITLAB:${Q.baseUrl.replace(/\/+$/,"").toLowerCase()}:${y.id}`,D=[],k=!0,b=(A,e)=>{k=!1,D.push(`${A}: ${I(e)}`)},M=r?await f(`${E}/merge_requests/${r.number}`):void 0;if(M&&r&&String(M.id)!==m(r.id))throw Error("The merge request changed. Refresh before assigning reviewers.");if(M&&M.target_project_id!==y.id)throw Error("Merge request target project does not match reviewer settings");let S=M?.target_branch??t??y.default_branch,[N,H,R,v]=await Promise.all([w(`${E}/members/all`).catch(A=>(b("GitLab project membership could not be loaded",A),[])),w(`${E}/members`).catch(A=>(b("GitLab direct project membership could not be loaded",A),[])),w(`${E}/repository/branches`).then(A=>A.map(A=>A.name)).catch(()=>[y.default_branch]),w(`${E}/approval_rules`).catch(A=>(r||(k=!1),D.push(`GitLab project approval rules are unavailable (Premium/Ultimate and suitable permissions are required): ${I(A)}`),[]))]),x=N.filter(A=>d(A)&&(A.access_level??0)>=30),T=u(x.map(c)),U=new Map(T.map(A=>[A.id,A])),O=new Map,_=`${B}:general`;for(let A of(O.set(_,{key:_,name:"General reviewers",kind:"GENERAL",candidates:T}),v)){let e="any_approver"===A.rule_type?T:(A.eligible_approvers??[]).filter(d).map(c);h(O,{key:`${B}:rule:${A.id}`,name:A.name,kind:"APPROVAL_RULE",candidates:e})}for(let A of["CODEOWNERS","docs/CODEOWNERS",".gitlab/CODEOWNERS"])try{let e=await f(`${E}/repository/files/${encodeURIComponent(A)}`,{ref:S});if("base64"!==e.encoding||"string"!=typeof e.content)throw Error("GitLab CODEOWNERS contents were not returned");a=Buffer.from(e.content,"base64").toString("utf8");break}catch(A){if(p(A,404))continue;b("GitLab CODEOWNERS could not be loaded",A);break}let J=void 0===a?[]:n(a,"GITLAB"),G=new Map,L=new Map,P=A=>{let e=L.get(A.toLowerCase());return e||(e=(async()=>{if(A.startsWith("@@")){let e=A.slice(2).toLowerCase().replace(/s$/,""),t={developer:30,maintainer:40,owner:50}[e];if(!t)throw Error(`Unsupported GitLab CODEOWNERS role: ${A}`);return{principal:`role:${t}`,label:`@@${e}`,people:H.filter(A=>d(A)&&A.access_level===t).map(c)}}let e=A.startsWith("@")?A.slice(1):null,t=x.find(t=>e?t.username?.toLowerCase()===e.toLowerCase():(t.email??t.public_email)?.toLowerCase()===A.toLowerCase());if(t)return{principal:`user:${t.id}`,label:`@${t.username}`,people:[c(t)]};if(!e)throw Error(`Email owner ${A} is not visible to the configured token; use a visible username or group`);let r=(e.includes("/")?[]:await f("/users",{username:e})).find(A=>A.username?.toLowerCase()===e.toLowerCase());if(r)return{principal:`user:${r.id}`,label:`@${r.username}`,people:U.has(String(r.id))?[c(r)]:[]};let i=await f(`/groups/${encodeURIComponent(e)}`,{with_projects:"false"});if(!(await (s??=(async()=>{let A=new Set((y.shared_with_groups??[]).filter(A=>A.group_access_level>=30).map(A=>A.group_id)),e="group"===y.namespace.kind?y.namespace.id:null,t=new Set;for(;null!==e&&!t.has(e);){t.add(e),A.add(e);let r=await f(`/groups/${e}`,{with_projects:"false"});for(let e of r.shared_with_groups??[])e.group_access_level>=30&&A.add(e.group_id);e=r.parent_id}return A})())).has(i.id))return{principal:`group:${i.id}`,label:`@${i.full_path}`,people:[]};let n=await w(`/groups/${i.id}/members`);return{principal:`group:${i.id}`,label:`@${i.full_path}`,people:n.filter(d).map(c).filter(A=>U.has(A.id))}})(),L.set(A.toLowerCase(),e)),e};for(let A of(await (0,e.f)(J.filter(A=>!A.exclusion&&A.owners.length),async A=>{try{let t=await (0,e.f)(A.owners,P);return{entry:A,resolved:t}}catch(e){return{entry:A,error:e}}}))){if(!A.resolved){b(`GitLab owners for ${A.entry.pattern} could not be resolved`,A.error);continue}let e=g(B,A.resolved.map(A=>A.principal));h(O,{key:e,name:A.resolved.map(A=>A.label).join(" or "),kind:"CODEOWNERS",candidates:A.resolved.flatMap(A=>A.people)}),G.set(`${A.entry.section}\0${A.entry.pattern}`,e)}let j=[],Y=[],[F,q]=(Q.version??"19.2").split(".").map(Number),V=F>19||19===F&&q>=4,z=async A=>{let e=await this.service.reviewerGraphql(`query CodeReviewerApprovalRules($path: ID!, $iid: String!) {
|
|
1431
1431
|
project(fullPath: $path) { mergeRequest(iid: $iid) { approvalState { rules {
|
|
1432
1432
|
id name type section ${V?"patterns":""} approvalsRequired approved
|
|
1433
1433
|
sourceRule { id }
|
|
1434
1434
|
eligibleApprovers { id username name avatarUrl webUrl bot state }
|
|
1435
1435
|
approvedBy(first: 100) { nodes { id username name avatarUrl webUrl } pageInfo { hasNextPage } }
|
|
1436
1436
|
} } } }
|
|
1437
|
-
}`,{path:y.path_with_namespace,iid:String(A)}),t=e.project?.mergeRequest?.approvalState.rules;if(!t)throw Error("GitLab did not return the merge request approval rules");return t},K=(A,e)=>{let t=A.sourceRule?.id??A.id;return A.sourceRule||t.includes("ApprovalProjectRule/")?`${B}:rule:${m(t)}`:`${B}:mr:${e}:rule:${m(A.id)}`};if(M){let A=new Set;try{for(let e of(await z(M.iid))){let t,r=e.type.toLowerCase(),i="any_approver"===r?T:(e.eligibleApprovers??[]).filter(d).map(c),n=(e.approvedBy?.nodes??[]).map(c);Y.push(...n),e.approvedBy?.pageInfo?.hasNextPage&&b(`Approvals for ${e.name} are incomplete`,Error("GitLab returned more than 100 approving users"));let a=e.approvalsRequired,s=e.name;if("code_owner"===r){let r=e.patterns?.length?e.patterns:[e.name];t=[...new Set(r.flatMap(t=>{let r=`${(e.section??"codeowners").toLowerCase()}\0${t}`;A.add(r);let i=G.get(r);return i?[i]:[]}))],0===t.length&&b(`Code owner rule ${e.name} cannot be mapped`,Error("Refresh the target branch CODEOWNERS configuration")),0===a&&(a=1,s=`Suggested code owners \xb7 ${e.name}`)}else{let A=K(e,M.id);h(O,{key:A,name:e.name,kind:"APPROVAL_RULE",candidates:i}),t=[A]}j.push({id:e.id,name:s,poolKeys:t,eligibleReviewerIds:i.map(A=>A.id),requiredApprovals:a,approvedReviewerIds:n.map(A=>A.id)})}}catch(A){b("GitLab merge request approval rules could not be loaded",A)}try{let A=await f(`${E}/merge_requests/${M.iid}/approvals`);Y.push(...(A.approved_by??[]).map(A=>c(A.user)))}catch(A){b("GitLab current approvals could not be loaded",A)}if(J.length)try{let e=await w(`${E}/merge_requests/${M.iid}/diffs`);M.changes_count&&/^\d+$/.test(M.changes_count)&&Number(M.changes_count)>e.length&&b("GitLab changed files are incomplete",Error("The merge request exceeds the provider diff-list limit"));let t=[...new Set(e.flatMap(A=>[A.new_path,A.old_path]).filter(Boolean))];for(let e of o(J,t)){let t=`${e.section}\0${e.pattern}`;if(A.has(t))continue;let r=G.get(t),i=r?O.get(r):null;r&&i?.candidates.length&&j.push({id:`gitlab:suggested:${t}`,name:`Suggested code owners \xb7 ${e.pattern}`,poolKeys:[r],eligibleReviewerIds:i.candidates.map(A=>A.id),requiredApprovals:1,approvedReviewerIds:Y.map(A=>A.id)})}}catch(A){b("GitLab changed files for ownership suggestions could not be loaded",A)}}else try{let A=await w(`${E}/merge_requests`,{state:"opened",scope:"all"});await (0,e.f)(A,async A=>{try{for(let e of(await z(A.iid))){if("code_owner"===e.type.toLowerCase())continue;let t=K(e,A.id);if(!t.includes(`:mr:${A.id}:`))continue;let r="any_approver"===e.type.toLowerCase()?T:(e.eligibleApprovers??[]).filter(d).map(c);h(O,{key:t,name:`!${A.iid} \xb7 ${e.name}`,kind:"APPROVAL_RULE",candidates:r})}}catch(e){b(`GitLab approval groups for !${A.iid} could not be loaded`,e)}})}catch(A){b("GitLab open merge request approval groups could not be loaded",A)}return{provider:"GITLAB",repositoryIdentity:B,ref:S,defaultRef:y.default_branch,refs:[...new Set([y.default_branch,S,...R])],pools:[...O.values()],requirements:j,issues:[...new Set(D)],discoveryComplete:k,...M?{request:{id:r.id,number:M.iid,url:M.web_url,open:"opened"===M.state,authorId:String(M.author.id),baseRef:M.target_branch,headSha:M.sha,currentReviewers:u((M.reviewers??[]).map(c)),approvedReviewers:u(Y)}}:{}}}async assign(A,e,t){let r=await this.service.projectForCanonicalOrigin(A.canonicalOrigin);if(!r||e.projectId&&e.projectId!==r.id)throw Error("Merge request project does not match reviewer settings");await this.service.addMergeRequestReviewers({projectId:r.id,iid:e.number,expectedId:m(e.id),reviewerIds:t.map(A=>A.id)})}}A.s(["f",0,class{github;gitlab;constructor(A,e){this.github=new E(A),this.gitlab=new f(e)}discover(A,e,t,r=!1){return/^github\.com\//i.test(A.canonicalOrigin)?this.github.discover(A,e,t,r):this.gitlab.discover(A,e,t,r)}assign(A,e,t){return/^github\.com\//i.test(A.canonicalOrigin)?this.github.assign(A,e,t):this.gitlab.assign(A,e,t)}}],412080)},655617,A=>{var e=A.i(666680),t=A.i(135475),r=A.i(75064),i=A.i(492973),n=A.i(909592),a=A.i(79322);A.i(256554);var s=A.i(848201);let o=A=>[...new Set(A)],l=r.z.object({id:i.z.string().min(1).max(500),username:i.z.string().max(500),name:i.z.string().max(500),avatarUrl:i.z.string().max(4e3).nullable(),url:i.z.string().max(4e3).nullable()}).strict(),c=n.z.array(r.z.object({key:i.z.string().min(1).max(2e3),name:i.z.string().max(2e3),kind:a.z.enum(["GENERAL","CODEOWNERS","APPROVAL_RULE"]),provider:a.z.enum(["GITHUB","GITLAB"]),repositoryIdentity:i.z.string().min(1).max(2e3),ref:i.z.string().max(1e3),reviewers:n.z.array(l).max(1e3)}).strict()).max(500),d=A=>({id:A.userId,username:A.username,name:A.name,avatarUrl:A.avatarUrl,url:A.url});A.s(["w",0,class{providers;refreshWorktree;assignments;constructor(A,e){this.providers=A,this.refreshWorktree=e,this.assignments=new Map}async repository(A){let e=await (0,t.U)(),r=await e.codebaseRepository.findUnique({where:{id:A}});if(!r)throw Error("Repository not found");return r}async saved(A){return(await (0,t.U)()).repositoryReviewerPool.findMany({where:{repositoryId:A},include:{members:!0},orderBy:{key:"asc"}})}async repositoryCodeReviewers(A,e,t=!1){let r=await this.repository(A),[i,n]=await Promise.all([this.providers.discover(r,e??void 0,void 0,t),this.saved(A)]),a=new Map(n.map(A=>[A.key,A])),s=i.pools.map(A=>{let e=a.get(A.key);a.delete(A.key);let t=new Set(A.candidates.map(A=>A.id)),r=e?.members.map(A=>A.userId)??[];return{...A,selectedReviewerIds:r,unavailableReviewerIds:r.filter(A=>e?.repositoryIdentity!==i.repositoryIdentity||!t.has(A))}});for(let A of a.values())s.push({key:A.key,name:A.name,kind:A.kind,candidates:[],selectedReviewerIds:A.members.map(A=>A.userId),unavailableReviewerIds:A.members.map(A=>A.userId)});return{repositoryId:A,...i,pools:s}}async saveRepositoryCodeReviewers(A){if(A.pools.length>500)throw Error("At most 500 reviewer pools can be saved at once");let e=await this.repository(A.repositoryId),[r,i]=await Promise.all([this.providers.discover(e,A.ref??void 0,void 0,!0),this.saved(e.id)]),n=this.validatePools(A.pools,r,i),a=await (0,t.U)();return await a.$transaction(async A=>{await this.writePools(A,e.id,r,n),await this.updateConfiguredFlag(A,e.id)}),this.publish(e.id),this.repositoryCodeReviewers(e.id,A.ref)}validatePools(A,e,t=[]){let r=new Map(e.pools.map(A=>[A.key,A])),i=new Map(t.map(A=>[A.key,A])),n=new Set;return A.map(A=>{if(!A.key||A.key.length>2e3||n.has(A.key))throw Error("Reviewer pool keys must be unique");if(n.add(A.key),A.reviewerIds.length>1e3)throw Error("At most 1,000 reviewers can be selected per pool");let t=r.get(A.key),a=i.get(A.key);if(!t&&!a&&A.reviewerIds.length)throw Error("Reviewer group is no longer available; refresh repository settings");let s=new Map(t?.candidates.map(A=>[A.id,A])??[]);if(a?.repositoryIdentity===e.repositoryIdentity)for(let A of a.members)s.has(A.userId)||s.set(A.userId,d(A));let l=o(A.reviewerIds).map(A=>{let e=s.get(A);if(!e)throw Error("A selected reviewer is no longer eligible; refresh repository settings");return e});return{key:A.key,name:t?.name??a?.name??A.key,kind:t?.kind??a?.kind??"GENERAL",discoveryRef:t?e.ref:a?.discoveryRef??e.ref,members:l}})}async writePools(A,t,r,i){for(let n of i){if(!n.members.length){await A.repositoryReviewerPool.deleteMany({where:{repositoryId:t,key:n.key}});continue}let i=await A.repositoryReviewerPool.upsert({where:{repositoryId_key:{repositoryId:t,key:n.key}},create:{id:(0,e.randomUUID)(),repositoryId:t,key:n.key,name:n.name,kind:n.kind,provider:r.provider,repositoryIdentity:r.repositoryIdentity,discoveryRef:n.discoveryRef},update:{name:n.name,kind:n.kind,provider:r.provider,repositoryIdentity:r.repositoryIdentity,discoveryRef:n.discoveryRef}});await A.repositoryReviewerMember.deleteMany({where:{poolId:i.id}}),await A.repositoryReviewerMember.createMany({data:n.members.map(({id:A,...e})=>({poolId:i.id,userId:A,...e}))})}}async updateConfiguredFlag(A,e){let t=await A.repositoryReviewerMember.count({where:{pool:{repositoryId:e}}});await A.codebaseRepository.update({where:{id:e},data:{hasConfiguredCodeReviewers:t>0,updatedAt:new Date}})}async exportPools(A){return(await this.saved(A)).map(A=>({key:A.key,name:A.name,kind:A.kind,provider:A.provider,repositoryIdentity:A.repositoryIdentity,ref:A.discoveryRef,reviewers:A.members.map(d)}))}async validateTransferredPools(A,e){let t=c.parse(e),r=new Map,i=[];for(let e of t){let t=r.get(e.ref);t||(t=await this.providers.discover(A,e.ref||void 0,void 0,!0),r.set(e.ref,t));let n=A=>A.slice(0,A.lastIndexOf(":"));if(e.provider!==t.provider||n(e.repositoryIdentity)!==n(t.repositoryIdentity)||!e.key.startsWith(`${e.repositoryIdentity}:`))throw Error("Reviewer pools belong to a different provider instance. Deselect Code reviewers in this import and configure reviewers in the destination repository.");let a=`${t.repositoryIdentity}${e.key.slice(e.repositoryIdentity.length)}`,s=t.pools.find(A=>A.key===a),o=new Map(s?.candidates.map(A=>[A.id,A])??[]);if(!s||e.reviewers.some(A=>!o.has(A.id)))throw Error(`Reviewer group ${e.name} or one of its people cannot be resolved at the destination. Deselect Code reviewers in this import and configure reviewers in the destination repository.`);i.push({key:a,name:s.name,kind:s.kind,provider:t.provider,repositoryIdentity:t.repositoryIdentity,ref:t.ref,reviewers:e.reviewers.map(A=>o.get(A.id))})}if(new Set(i.map(A=>A.key)).size!==i.length)throw Error("Imported reviewer pools contain duplicate groups");return i}async applyTransferredPools(A,e,t){for(let r of(await A.repositoryReviewerPool.deleteMany({where:{repositoryId:e}}),t))await this.writePools(A,e,{provider:r.provider,repositoryIdentity:r.repositoryIdentity},[{...r,discoveryRef:r.ref,members:r.reviewers}]);await this.updateConfiguredFlag(A,e)}async context(A){let e=await (0,t.U)(),r=await e.worktree.findUnique({where:{id:A},include:{codebase:{include:{repository:!0}},pullRequest:!0,gitLabMergeRequest:!0}});if(!r)throw Error("Worktree not found");let i=r.codebase.repository;if(!i.hasConfiguredCodeReviewers)throw Error("Configure code reviewers in repository settings first");let n=r.gitLabMergeRequest,a=r.pullRequest,s=n?.sourceBranch??a?.headRefName;if(!r.branch||s!==r.branch||r.pullRequestLookupBranch!==r.branch||r.pullRequestLookupOrigin?.toLowerCase()!==i.canonicalOrigin.toLowerCase())throw Error("The worktree branch or repository has changed; refresh the linked pull or merge request before assigning reviewers");let o=n?{id:n.gitlabId,number:n.iid,projectId:n.projectId}:a?{id:a.githubId,number:a.number}:null;if(!o)throw Error("Worktree does not have an open pull or merge request");return{worktree:r,repository:i,locator:o}}async live(A){let e=await this.context(A),t=await this.providers.discover(e.repository,void 0,e.locator,!0),r=await this.context(A);if(r.locator.id!==e.locator.id||r.repository.id!==e.repository.id||r.worktree.branch!==e.worktree.branch)throw Error("The linked pull or merge request has changed; reload reviewer options before assigning");let i=function(A,e,t){let r=e.request;if(!r)throw Error("Pull or merge request was not found");let i=o(r.currentReviewers.map(A=>A.id)),n=o(r.approvedReviewers.map(A=>A.id)),a=new Set(i),s=new Set(n),l=new Map(e.pools.map(A=>[A.key,new Set(A.candidates.map(A=>A.id))])),c=new Map(t.filter(A=>A.repositoryIdentity===e.repositoryIdentity).map(A=>[A.key,new Set(A.members.map(A=>A.userId).filter(e=>l.get(A.key)?.has(e)))])),d=new Map([...e.pools.flatMap(A=>A.candidates),...r.currentReviewers,...r.approvedReviewers].map(A=>[A.id,A])),u=e.requirements;if(!u.length){let A=e.pools.find(A=>"GENERAL"===A.kind);A&&(u=[{id:"general-reviewers",name:"General reviewers",poolKeys:[A.key],eligibleReviewerIds:A.candidates.map(A=>A.id),approvedReviewerIds:n,requiredApprovals:1}])}let g=u.map(A=>{let e=new Set(A.eligibleReviewerIds.filter(A=>A!==r.authorId)),t=new Set(A.poolKeys.flatMap(A=>[...c.get(A)??[]]));return{...A,eligibleReviewerIds:[...e],candidateReviewerIds:[...t].filter(A=>e.has(A)&&d.has(A)&&!a.has(A)&&!s.has(A)),approvedReviewerIds:o(A.approvedReviewerIds.filter(A=>e.has(A))),requestedReviewerIds:i.filter(A=>e.has(A))}}),h=new Set([...i,...n,...g.flatMap(A=>[...A.candidateReviewerIds,...A.approvedReviewerIds,...A.requestedReviewerIds])]);return{worktreeId:A,requestId:r.id,requestUrl:r.url,provider:e.provider,requestOpen:r.open,authorId:r.authorId,reviewers:[...d.values()].filter(A=>h.has(A.id)),requirements:g,currentReviewerIds:i,approvedReviewerIds:n,selectedReviewerIds:[],issues:[...e.issues,...e.discoveryComplete||e.requirements.length?[]:["General reviewer selection is available, but provider approval requirements could not be verified."]],discoveryComplete:e.discoveryComplete}}(A,t,await this.saved(r.repository.id));if(!i.requestOpen)throw Error("Pull or merge request is no longer open; refresh this worktree");return{...r,discovery:t,assignment:i}}async worktreeReviewerAssignment(A){return(await this.live(A)).assignment}async previewRandomWorktreeReviewers(A,e,t){let{assignment:r}=await this.live(A);return this.requireRequest(r,e),function(A,e=[],t=Math.random){let r=o(A.requirements.flatMap(A=>A.candidateReviewerIds)),i=new Set(r),n=new Set(e.filter(A=>i.has(A))),a=A=>new Set([...A.approvedReviewerIds,...A.requestedReviewerIds,...[...n].filter(e=>A.eligibleReviewerIds.includes(e))]).size;for(let A=r.length-1;A>0;A--){let e=Math.floor(t()*(A+1));[r[A],r[e]]=[r[e],r[A]]}for(let e of r)A.requirements.some(A=>a(A)<A.requiredApprovals&&A.candidateReviewerIds.includes(e))&&n.add(e);let s=A.requirements.flatMap(A=>{let e=Math.max(0,A.requiredApprovals-a(A));return e?[`${A.name}: ${e} more eligible reviewer${1===e?"":"s"} needed. Configure additional reviewers in repository settings.`]:[]});return{...A,selectedReviewerIds:[...n],issues:[...A.issues,...s]}}(r,t??[])}requireRequest(A,e){if(A.requestId!==e)throw Error("The pull or merge request has changed; reload reviewer options before assigning")}async assignWorktreeReviewers(A){let e=(this.assignments.get(A.worktreeId)??Promise.resolve()).catch(()=>void 0).then(async()=>{let{repository:e,locator:t,assignment:r}=await this.live(A.worktreeId);this.requireRequest(r,A.requestId);let i=o(A.reviewerIds);if(!i.length||i.length>1e3)throw Error("Select between 1 and 1,000 reviewers");let n=new Set(r.requirements.flatMap(A=>A.candidateReviewerIds)),a=new Set(r.currentReviewerIds);if(i.some(A=>!n.has(A)&&!a.has(A)))throw Error("A selected reviewer is no longer eligible; reload reviewer options before assigning");let s=i.filter(A=>!a.has(A));s.length&&await this.providers.assign(e,t,r.reviewers.filter(A=>s.includes(A.id))),await this.refreshWorktree?.(A.worktreeId).catch(()=>void 0),this.publish(e.id,A.worktreeId);try{return await this.worktreeReviewerAssignment(A.worktreeId)}catch{let A=o([...r.currentReviewerIds,...s]);return{...r,currentReviewerIds:A,requirements:r.requirements.map(e=>({...e,candidateReviewerIds:e.candidateReviewerIds.filter(A=>!s.includes(A)),requestedReviewerIds:A.filter(A=>e.eligibleReviewerIds.includes(A))})),issues:[...r.issues,"Review requests were sent. Reload reviewer options to refresh provider status."]}}});this.assignments.set(A.worktreeId,e);try{return await e}finally{this.assignments.get(A.worktreeId)===e&&this.assignments.delete(A.worktreeId)}}publish(A,e=null){s._H.publish(s.aA,{codebaseOverviewChanged:{repositoryId:A,codebaseId:null}}),s._H.publish(s.MA,{worktreeOverviewChanged:{worktreeId:e,codebaseId:null}})}},"k",0,c])},533756,A=>{A.i(310509),A.i(162375),A.s([])},310509,162375,A=>{var e=A.i(238068),t=A.i(794231),r=A.i(666680),i=A.i(812057),n=A.i(135475);A.i(256554);var a=A.i(848201),s=A.i(118387),o=A.i(430361);class l extends Error{code;fieldKey;constructor(A,e){super(`Invalid form answer (${A}): ${e}`),this.code=A,this.fieldKey=e}}function c(A){if(!A||"object"!=typeof A||Array.isArray(A))throw Error("Invalid form object");return A}function d(A){let e=c(A);if("string"!=typeof e.key||!e.key||!["string","number","integer","boolean","multiselect","external"].includes(String(e.type)))throw Error("Invalid form field");for(let A of["title","description","pattern","placeholder"])if(void 0!==e[A]&&"string"!=typeof e[A])throw Error(`Invalid form field ${A}`);for(let A of["required","hidden","custom"])if(void 0!==e[A]&&"boolean"!=typeof e[A])throw Error(`Invalid form field ${A}`);for(let A of["minLength","maxLength","minItems","maxItems"])if(void 0!==e[A]&&("number"!=typeof e[A]||!Number.isInteger(e[A])||e[A]<0))throw Error(`Invalid form field ${A}`);for(let A of["minimum","maximum"])if(void 0!==e[A]&&("number"!=typeof e[A]||!Number.isFinite(e[A])))throw Error(`Invalid form field ${A}`);if(void 0!==e.format&&!["email","uri","date","date-time"].includes(String(e.format)))throw Error("Invalid form field format");if("external"===e.type&&("string"!=typeof e.url||!URL.canParse(e.url)||!["https:","http:"].includes(new URL(e.url).protocol)))throw Error("Invalid external form URL");if("multiselect"===e.type&&!Array.isArray(e.options))throw Error("Missing form options");if(void 0!==e.options){if(!Array.isArray(e.options))throw Error("Invalid form options");let A=new Set;for(let t of e.options){let e=c(t);if("string"!=typeof e.value||"string"!=typeof e.label||void 0!==e.description&&"string"!=typeof e.description||A.has(e.value))throw Error("Invalid form option");A.add(e.value)}}if(void 0!==e.when){if(!Array.isArray(e.when))throw Error("Invalid form conditions");for(let A of e.when){let e=c(A);if("string"!=typeof e.key||!["eq","neq"].includes(String(e.op))||!["string","number","boolean"].includes(typeof e.value))throw Error("Invalid form condition")}}return void 0!==e.default&&u(e,e.default),e}function u(A,e){let t=e=>{throw new l(e,A.key)};if("external"===A.type){!0!==e&&t("external");return}if(void 0===e){A.required&&t("required");return}if("string"===A.type){if("string"!=typeof e)return t("type");if(A.required&&!e.length&&t("required"),void 0!==A.minLength&&e.length<A.minLength&&t("minLength"),void 0!==A.maxLength&&e.length>A.maxLength&&t("maxLength"),void 0!==A.pattern){let r=!1;try{r=new RegExp(A.pattern).test(e)}catch{}r||t("pattern")}"email"!==A.format||/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e)||t("format"),"uri"!==A.format||URL.canParse(e)||t("format"),"date"===A.format&&(!/^\d{4}-\d{2}-\d{2}$/.test(e)||Number.isNaN(Date.parse(e))||new Date(e).toISOString().slice(0,10)!==e)&&t("format"),"date-time"===A.format&&Number.isNaN(Date.parse(e))&&t("format"),!A.options||A.custom||A.options.some(A=>A.value===e)||t("option")}else if("number"===A.type||"integer"===A.type){if("number"!=typeof e||!Number.isFinite(e)||"integer"===A.type&&!Number.isInteger(e))return t("type");void 0!==A.minimum&&e<A.minimum&&t("minimum"),void 0!==A.maximum&&e>A.maximum&&t("maximum")}else if("boolean"===A.type)"boolean"!=typeof e&&t("type");else if("multiselect"===A.type){if(!Array.isArray(e)||!e.every(A=>"string"==typeof A))return t("type");A.required&&!e.length&&t("required"),void 0!==A.minItems&&e.length<A.minItems&&t("minItems"),void 0!==A.maxItems&&e.length>A.maxItems&&t("maxItems"),!A.custom&&e.some(e=>!A.options.some(A=>A.value===e))&&t("option")}}function g(A,e){let t=c(e),r=new Set(A.map(A=>A.key));if(r.size!==A.length)throw Error("Duplicate form field key");for(let A of Object.keys(t))if(!r.has(A))throw new l("unknown",A);let i=Object.create(null),n=new Set;for(let e of A){if("external"!==e.type){for(let A of e.when??[])if(!n.has(A.key))throw Error("Form conditions must reference an earlier field")}let A=Object.hasOwn(t,e.key),r=A?c(t[e.key]).value:void 0;if(!function(A,e){return"external"===A.type||!A.when||A.when.every(A=>{let t=e[A.key];if(void 0===t)return!1;let r=Array.isArray(t)?t.includes(String(A.value)):t===A.value;return"eq"===A.op?r:!r})}(e,i)){if(A)throw new l("inactive",e.key)}else u(e,r),void 0!==r&&(i[e.key]=r);n.add(e.key)}return i}A.i(902157);var h=A.i(912714),p=A.i(750227);async function I(A){if(!A.length)return[];let e=await (0,n.U)(),t=await e.runAttachment.findMany({where:{id:{in:A}}});if(t.length!==A.length)throw Error("Attachment is unavailable");let i=(0,p.resolve)(function(){if(process.env.RUN_DATA_DIRECTORY)return(0,p.resolve)(process.env.RUN_DATA_DIRECTORY);let A=process.env.DATABASE_URL||"file:./prisma/dev.db";return(0,p.join)((0,p.dirname)((0,p.resolve)((0,n.O)(A))),"run-data")}(),"attachments");await (0,h.mkdir)(i,{recursive:!0,mode:448});let a=[];try{for(let A of t){let t=(0,r.randomUUID)(),n=(0,p.join)(i,t);await (0,h.copyFile)(A.storagePath,n),await e.runAttachment.create({data:{id:t,sha256:A.sha256,filename:A.filename,contentType:A.contentType,size:A.size,storagePath:n}}),a.push({id:t,path:n})}return a.map(({id:A})=>A)}catch(A){throw await e.runAttachment.deleteMany({where:{id:{in:a.map(({id:A})=>A)}}}),await C(a.map(({path:A})=>A)),A}}async function C(A){await Promise.all(A.map(A=>(0,h.rm)(A,{force:!0})))}A.i(81111),A.i(188646),A.s(["r",0,0x6400000,"h",0,I,"l",0,C],162375);let E=["PLAN","SESSION"],m=["CODEX","CLAUDE","OPENCODE"],f=new Set(["COMPLETED","CANCELLED","FAILED"]),w="ANSWER_REVISION",Q=["PAUSED","COMPLETED","CANCELLED","FAILED","SUPERSEDED"];function y(A,e,t){let r=e.trim().toUpperCase();if(!A.includes(r))throw Error(`${t} is not supported`);return r}function B(A,e,t){let r=A.trim();if(!r)throw Error(`${e} is required`);if(r.length>t)throw Error(`${e} is too long`);return r}function D(A,e){let t=A?.trim()||null;if(t&&t.length>e)throw Error("Value is too long");return t}function k(A){return D(A,100)?.toUpperCase()??null}function b(A,e){let t=e??+("SESSION"===A);if(!Number.isInteger(t)||t<0||t>32)throw Error("Worktree concurrency limit must be between 0 and 32");return t}function M(A){if(!A)return;let e=new Date(A);return Number.isNaN(e.getTime())?void 0:e}function S(A){return`/ai/${"PLAN"===A.kind?"plans":"sessions"}/${encodeURIComponent(A.id)}`}function N(A){let e={runChanged:{id:A}};a._H.publish((0,a.k_)(A),e),a._H.publish(a.hu,e),a._H.publish(a.fb,{sidebarStatusChanged:!0}),a._H.publish(a.Wy,{actionCenterChanged:!0})}function H(A,e){a._H.publish((0,a.CO)(e),{agentEvents:{type:"RUN_COMMAND_AVAILABLE",job:null,runCommand:A}})}async function R(A,e){return(await A.runNumberSequence.upsert({where:{kind:e},create:{kind:e,nextValue:1},update:{nextValue:{increment:1}}})).nextValue-1}async function v(A,e){let t=await A.runCommand.findFirst({where:{runId:e},orderBy:{sequence:"desc"},select:{sequence:!0}});return(t?.sequence??-1)+1}let x={run:{include:{worktree:!0,inputs:{include:{attachments:!0}},attempts:!0,sourcePlan:{include:{attempts:!0}},parentRun:{include:{attempts:!0}}}}};async function T(A,e){let t=await v(A,e.runId);return A.runCommand.create({data:{id:(0,r.randomUUID)(),runId:e.runId,agentId:e.agentId,sequence:t,type:e.type,payloadJson:JSON.stringify(e.payload??{}),idempotencyKey:e.idempotencyKey??`${e.runId}:${t}:${e.type}`},include:x})}let U={worktree:{include:{codebase:{include:{repository:!0,agent:!0}}}},attempts:{orderBy:{generation:"asc"}},inputs:{orderBy:{sequence:"asc"},include:{attachments:!0}},modelUsage:{orderBy:{model:"asc"}},toolCalls:{orderBy:{sequence:"asc"}},questionBatches:{orderBy:{createdAt:"asc"},include:{questions:{orderBy:{position:"asc"},include:{options:{orderBy:{position:"asc"}}}},answerRevisions:{orderBy:{revision:"asc"}},checkpoint:!0}},sourcePlan:!0,playedSession:!0,parentRun:!0,followUps:{orderBy:{createdAt:"asc"}},checkpoints:{orderBy:{createdAt:"asc"}}};A.s(["f",0,class{notifications;agentControl;diskSpace;reaperTimer;mcpPresetResolver;worktreeAdmissionPromoter;constructor(A,e,t){this.notifications=A,this.agentControl=e,this.diskSpace=t}setMcpPresetResolver(A){this.mcpPresetResolver=A}setWorktreeAdmissionPromoter(A){this.worktreeAdmissionPromoter=A}async promoteQueuedLane(A,e){let t=await (0,n.U)(),i=await t.$transaction(async t=>{let i=new Date;await t.worktreeAdmissionLane.upsert({where:{worktreeId:A},create:{worktreeId:A},update:{updatedAt:i}}),await t.worktreeRunConcurrencyLane.upsert({where:{worktreeId_kind:{worktreeId:A,kind:e}},create:{worktreeId:A,kind:e},update:{updatedAt:i}}),await t.worktreeRunLease.deleteMany({where:{worktreeId:A,purpose:{not:w},run:{status:{in:[...f]}}}}),await t.worktreeWorkflowLease.deleteMany({where:{worktreeId:A,workflowRun:{status:{in:["SUCCEEDED","FAILED","CANCELLED"]}}}});let n=await t.worktreeWorkflowLease.findUnique({where:{worktreeId:A}}),a=n?null:await t.workflowRun.findFirst({where:{worktreeId:A,status:"QUEUED",parentRunId:null,worktreeConcurrency:"EXCLUSIVE"},orderBy:[{queuedAt:"asc"},{id:"asc"}],select:{id:!0,queuedAt:!0}}),s=await t.worktreeRunLease.count({where:{worktreeId:A,OR:[{run:{kind:e,origin:"MANAGED",status:{in:["IN_PROGRESS","PAUSED"]}}},{purpose:w,run:{kind:e,origin:"MANAGED"}}]}}),o=await t.agentRun.findMany({where:{worktreeId:A,kind:e,origin:"MANAGED",status:"QUEUED"},orderBy:[{createdAt:"asc"},{id:"asc"}],select:{id:!0,agentId:!0,createdAt:!0,worktreeConcurrencyLimit:!0,workflowRun:{select:{worktreeLeaseOwnerRunId:!0}}}}),l=[];for(let e of n?o.filter(A=>A.workflowRun?.worktreeLeaseOwnerRunId===n.workflowRunId):o){if(a&&function(A,e,t,r){let i=A.getTime()-t.getTime();return i<0||0===i&&e<r}(a.queuedAt,a.id,e.createdAt,e.id)||0!==e.worktreeConcurrencyLimit&&s>=e.worktreeConcurrencyLimit)break;if(!(await t.agentRun.updateMany({where:{id:e.id,status:"QUEUED"},data:{status:"IN_PROGRESS",phase:"QUEUED"}})).count)continue;await t.worktreeRunLease.create({data:{id:(0,r.randomUUID)(),worktreeId:A,runId:e.id}}),s+=1;let i=await t.runCommand.findFirst({where:{runId:e.id,status:"QUEUED"},orderBy:{sequence:"asc"},include:x});i&&e.agentId&&l.push({runId:e.id,agentId:e.agentId,command:i})}return l});for(let A of i)N(A.runId),H(A.command,A.agentId);return i.length}async promoteQueuedLaneSafely(A,e){try{await this.promoteQueuedLane(A,e),await this.worktreeAdmissionPromoter?.(A)}catch(t){console.error(`Could not promote ${e.toLowerCase()} queue for ${A}:`,t instanceof Error?t.message:t)}}async reconcileQueuedRuns(A){let e=await (0,n.U)(),t=await e.agentRun.findMany({where:{origin:"MANAGED",status:"QUEUED",worktreeId:{not:null},...A?{agentId:A}:{}},select:{worktreeId:!0,kind:!0},distinct:["worktreeId","kind"]}),r=0;for(let A of t)A.worktreeId&&("PLAN"===A.kind||"SESSION"===A.kind)&&(r+=await this.promoteQueuedLane(A.worktreeId,A.kind));return r}async waitForJob(A){let e=a._H.iterate((0,a.BC)(A)),t=Date.now()+6e4;try{for(;Date.now()<t;){let r=await this.agentControl.getJob(A);if(!r)throw Error("Agent job disappeared");if(["SUCCEEDED","FAILED","CANCELLED","TIMED_OUT"].includes(r.status))return r;await Promise.race([e.next(),new Promise(A=>setTimeout(A,t-Date.now()))])}throw await this.agentControl.cancelJob(A),Error("Agent did not respond in time")}finally{await e.return?.()}}async nativeSessionFile(A){var e;if(!this.agentControl)throw Error("Agent control is unavailable");let t=await (0,n.U)(),r=await t.agentRun.findUnique({where:{id:A},include:{attempts:{orderBy:{generation:"desc"}},worktree:!0,agent:!0}});if(!r)throw Error("Run not found");if("CLAUDE"!==r.provider&&"CODEX"!==r.provider)throw Error("This provider does not store a session file");let i=r.attempts.find(A=>A.nativeId)?.nativeId;if(!i)throw Error("This run has no native session yet");if(!r.worktree)throw Error("This run has no worktree");if(!r.agent||!r.agentId)throw Error("This run is not associated with an agent");if(!(null!==(e=r.agent).lastSeenAt&&Date.now()-e.lastSeenAt.getTime()<=(0,s.z)(e)&&null===e.disconnectedAt))throw Error("Agent is offline");if(!(function(A){try{let e=JSON.parse(A.capabilitiesJson);return Array.isArray(e)?e.filter(A=>"string"==typeof A):[]}catch{return[]}})(r.agent).includes(o.l))throw Error("Agent must be updated to export session files");let a=await this.agentControl.createJob({agentId:r.agentId,kind:o.l,payload:{provider:r.provider,nativeId:i,folder:r.worktree.folder},idempotencyKey:`runs:session:read:${A}:${i}`,timeoutSeconds:60,visibility:"SYSTEM"});try{let A=function(A){if("SUCCEEDED"!==A.status||!A.resultJson)throw Error(A.error||"Agent job failed");let e=JSON.parse(A.resultJson);if(!e||"object"!=typeof e||Array.isArray(e))throw Error("Agent job returned an invalid result");return e}(await this.waitForJob(a.id)),e="string"==typeof A.contentBase64?A.contentBase64:null;if(!e)throw Error("Agent returned an invalid session file");return{filename:"string"==typeof A.filename&&A.filename?A.filename:`${i}.jsonl`,contentBase64:e}}finally{await t.agentJob.deleteMany({where:{id:a.id,visibility:"SYSTEM"}})}}startReaper(A=6e4){this.reaperTimer||(this.reaperTimer=setInterval(()=>{this.reapOrphanedRuns().catch(A=>{console.error("Run reaper failed:",A instanceof Error?A.message:A)})},A),this.reaperTimer.unref())}stopReaper(){this.reaperTimer&&clearInterval(this.reaperTimer),this.reaperTimer=void 0}async reapOrphanedRuns(A=Date.now()){let e=await (0,n.U)(),t=await e.agentRun.findMany({where:{status:"IN_PROGRESS"},select:{id:!0,agentId:!0,worktreeId:!0,kind:!0}});if(!t.length)return 0;let r=[...new Set(t.map(A=>A.agentId).filter(A=>!!A))],i=new Set((r.length?await e.agent.findMany({where:{id:{in:r}},select:{id:!0,lastSeenAt:!0,disconnectedAt:!0,heartbeatIntervalSeconds:!0}}):[]).filter(e=>null===e.disconnectedAt&&null!==e.lastSeenAt&&A-e.lastSeenAt.getTime()<=(0,s.z)(e)+12e4).map(A=>A.id)),a=t.filter(A=>!A.agentId||!i.has(A.agentId)).map(A=>A.id);if(!a.length)return 0;let o=new Date(A);for(let A of(await e.$transaction(async A=>{await A.runAttempt.updateMany({where:{runId:{in:a},status:{notIn:Q}},data:{status:"FAILED",finishedAt:o}}),await A.agentRun.updateMany({where:{id:{in:a},status:{notIn:[...f]}},data:{status:"FAILED",phase:"AGENT_OFFLINE",error:"Agent went offline while this run was active",finishedAt:o}}),await A.runCommand.updateMany({where:{runId:{in:a},status:{in:["QUEUED","RUNNING"]}},data:{status:"FAILED",error:"Agent went offline",finishedAt:o}}),await A.worktreeRunLease.deleteMany({where:{runId:{in:a}}})}),a))N(A);for(let A of new Set(t.filter(A=>a.includes(A.id)&&A.worktreeId).map(A=>`${A.worktreeId}:${A.kind}`))){let e=A.lastIndexOf(":"),t=A.slice(0,e),r=A.slice(e+1);("PLAN"===r||"SESSION"===r)&&await this.promoteQueuedLaneSafely(t,r)}return a.length}async list(A){let e=y(E,A.kind,"Run kind"),t=Math.max(1,Math.min(A.first??100,200)),r=A.search?.trim(),i=A.archive?.toUpperCase()??"ACTIVE",a={kind:e,...A.agentId?{agentId:A.agentId}:{},..."ARCHIVED"===i?{archivedAt:{not:null}}:"ALL"===i?{}:{archivedAt:null},...A.provider?{provider:A.provider.trim().toUpperCase()}:{},...A.origin?{origin:A.origin.trim().toUpperCase()}:{},...A.appId?{repository:{apps:{some:{appId:A.appId}}}}:{},...r?{OR:[{initialPrompt:{contains:r}},{repositoryName:{contains:r}},{branch:{contains:r}},{jiraIssueKey:{contains:r}},{model:{contains:r}}]}:{}},s=await (0,n.U)(),[o,l]=await Promise.all([s.agentRun.findMany({where:a,orderBy:[{createdAt:"desc"},{id:"desc"}],take:t+1,...A.after?{cursor:{id:A.after},skip:1}:{},include:{worktree:!0,sourcePlan:!0,playedSession:!0,modelUsage:{orderBy:{model:"asc"}}}}),s.agentRun.count({where:a})]);return{items:o.slice(0,t),nextCursor:o.length>t?o[t-1].id:null,totalCount:l}}async get(A){return(await (0,n.U)()).agentRun.findUnique({where:{id:A},include:U})}async events(A){let e=await (0,n.U)(),t=Math.max(1,Math.min(A.first??200,500)),r=!!(A.latest||null!=A.beforeSequence),i=await e.runEvent.findMany({where:{runId:A.runId,sequence:{gt:A.afterSequence??-1,...null==A.beforeSequence?{}:{lt:A.beforeSequence}},...A.includeSuperseded?{}:{supersededAt:null},...A.search?.trim()?{searchText:{contains:A.search.trim()}}:{}},orderBy:{sequence:r?"desc":"asc"},take:t});return r?i.reverse():i}async questions(A){let e=await (0,n.U)(),t=Math.max(1,Math.min(A.first??100,200)),r={runId:A.runId},[i,a]=await Promise.all([e.runQuestionBatch.findMany({where:r,orderBy:[{createdAt:"asc"},{id:"asc"}],take:t+1,...A.after?{cursor:{id:A.after},skip:1}:{},include:{questions:{orderBy:{position:"asc"},include:{options:{orderBy:{position:"asc"}}}},answerRevisions:{orderBy:{revision:"asc"}},checkpoint:!0}}),e.runQuestionBatch.count({where:r})]);return{items:i.slice(0,t),nextCursor:i.length>t?i[t-1].id:null,totalCount:a}}async usage(A){return(await (0,n.U)()).agentRun.findUnique({where:{id:A},select:{inputTokens:!0,outputTokens:!0,reasoningTokens:!0,cacheReadTokens:!0,cacheWriteTokens:!0,toolCallCount:!0,estimatedCost:!0,modelUsage:{orderBy:{model:"asc"}},toolCalls:{orderBy:{sequence:"asc"}}}})}async linkedItems(A){let e=await (0,n.U)(),t=await e.agentRun.findUnique({where:{id:A},select:{sourcePlanId:!0,parentRunId:!0}});return t?e.agentRun.findMany({where:{OR:[{id:{in:[t.sourcePlanId,t.parentRunId].filter(A=>!!A)}},{sourcePlanId:A},{parentRunId:A}]},orderBy:{createdAt:"asc"}}):[]}async drafts(A={}){let e=await (0,n.U)(),t=Math.max(1,Math.min(A.first??100,200)),r=A.archive?.toUpperCase()??"ACTIVE",i=A.search?.trim(),a={..."ARCHIVED"===r?{archivedAt:{not:null}}:"ALL"===r?{}:{archivedAt:null},...i?{OR:[{prompt:{contains:i}},{jiraIssueKey:{contains:i}},{provider:{contains:i}},{model:{contains:i}}]}:{}},[s,o]=await Promise.all([e.runDraft.findMany({where:a,orderBy:[{updatedAt:"desc"},{id:"desc"}],take:t+1,...A.after?{cursor:{id:A.after},skip:1}:{},include:{worktree:!0,attachments:!0}}),e.runDraft.count({where:a})]);return{items:s.slice(0,t),nextCursor:s.length>t?s[t-1].id:null,totalCount:o}}async draft(A){return(await (0,n.U)()).runDraft.findUnique({where:{id:A},include:{worktree:!0,attachments:!0}})}async questionBatch(A){return(await (0,n.U)()).runQuestionBatch.findUnique({where:{id:A},include:{questions:{orderBy:{position:"asc"},include:{options:{orderBy:{position:"asc"}}}},answerRevisions:{orderBy:{revision:"asc"}}}})}async saveDraft(A){let e=y(E,A.kind,"Run kind"),t=y(m,A.provider,"Provider"),i=B(A.prompt,"Prompt",2e5),s=await this.requireWorktree(A.worktreeId),o=[...new Set(A.attachmentIds??[])],l=[...new Set(A.mcpPresetIds??[])];await this.requireAttachments(o,A.id??void 0);let c=await (0,n.U)(),d=A.id??(0,r.randomUUID)(),u=await c.$transaction(async r=>{let n=await r.runDraft.upsert({where:{id:d},create:{id:d,kind:e,worktreeId:s.id,agentId:s.codebase.agentId,jiraIssueKey:k(A.jiraIssueKey),provider:t,model:B(A.model,"Model",200),effort:D(A.effort,100),webSearchEnabled:!1!==A.webSearchEnabled,mcpPresetIdsJson:JSON.stringify(l),prompt:i},update:{kind:e,worktreeId:s.id,agentId:s.codebase.agentId,jiraIssueKey:k(A.jiraIssueKey),provider:t,model:B(A.model,"Model",200),effort:D(A.effort,100),webSearchEnabled:!1!==A.webSearchEnabled,mcpPresetIdsJson:JSON.stringify(l),prompt:i}});return o.length&&await r.runAttachment.updateMany({where:{id:{in:o},inputId:null},data:{draftId:d}}),await r.runAttachment.updateMany({where:{draftId:d,...o.length?{id:{notIn:o}}:{}},data:{draftId:null}}),n});return a._H.publish(a.hu,{runChanged:{id:u.id}}),this.draft(u.id)}async create(A){return this.createInternal(A)}async createInternal(A,e={}){let t=y(E,A.kind,"Run kind"),i=b(t,A.worktreeConcurrencyLimit),a=y(m,A.provider,"Provider"),s=B(A.prompt,"Prompt",2e5),o=B(A.model,"Model",200),l=await this.requireWorktree(A.worktreeId,a);await this.diskSpace?.assertWorktreeCanStart(l.id);let c=this.mcpPresetResolver?await this.mcpPresetResolver(t,[...new Set(A.mcpPresetIds??[])]):{presetIds:[],toolNames:[]},d=[...new Set(A.attachmentIds??[])];await this.requireAttachments(d,A.draftId??void 0);let u=await (0,n.U)(),g=await u.$transaction(async n=>{let u=await R(n,t),g=(0,r.randomUUID)(),h=(0,r.randomUUID)(),p=A.sourcePlanId?await n.agentRun.findUnique({where:{id:A.sourcePlanId}}):null;if(A.sourcePlanId){if(!p||"PLAN"!==p.kind)throw Error("Source plan was not found");if("COMPLETED"!==p.status||!p.finalOutput)throw Error("Only a completed plan with output can be run");if(p.playedAt)throw Error("This plan has already been run")}let I=A.parentRunId?await n.agentRun.findUnique({where:{id:A.parentRunId}}):null,C=e.transferLeaseFromRunId?await n.worktreeRunLease.findUnique({where:{runId:e.transferLeaseFromRunId}}):null,E=C?.worktreeId===l.id;e.transferLeaseFromRunId&&await n.agentRun.update({where:{id:e.transferLeaseFromRunId},data:{status:"CANCELLED",phase:"SUPERSEDED_BY_FOLLOW_UP",finishedAt:new Date}});let m=await n.agentRun.create({data:{id:g,kind:t,displayNumber:u,status:E?"IN_PROGRESS":"QUEUED",phase:E?"QUEUED":"WAITING_FOR_WORKTREE",provider:a,worktreeId:l.id,repositoryId:l.codebase.repository.id,agentId:l.codebase.agentId,jiraIssueKey:k(A.jiraIssueKey),repositoryName:l.codebase.repository.name,branch:l.branch,model:o,effort:D(A.effort,100),webSearchEnabled:!1!==A.webSearchEnabled,mcpPresetIdsJson:JSON.stringify(c.presetIds),mcpToolNamesJson:JSON.stringify(c.toolNames),mcpToolSnapshotJson:c.snapshot?JSON.stringify(c.snapshot):null,worktreeConcurrencyLimit:i,workflowRunId:A.workflowRunId??null,initialPrompt:s,sourcePlanId:p?.id,sourcePlanNumber:p?.displayNumber,parentRunId:I?.id,parentRunNumber:I?.displayNumber,followUpMode:D(A.followUpMode,50),inputs:{create:{id:h,sequence:0,kind:"INITIAL",prompt:s}}}});if(p&&await n.agentRun.update({where:{id:p.id},data:{playedAt:new Date,playedSessionNumber:u}}),E&&await n.worktreeRunLease.update({where:{runId:e.transferLeaseFromRunId},data:{runId:g,purpose:"RUN",reservationKey:null,acquiredAt:new Date}}),d.length&&(await n.runAttachment.updateMany({where:{id:{in:d},inputId:null},data:{inputId:h,draftId:null}})).count!==d.length)throw Error("One or more attachments are no longer available");return A.draftId&&await n.runDraft.deleteMany({where:{id:A.draftId}}),{run:m,command:await T(n,{runId:g,agentId:l.codebase.agentId,type:A.sourcePlanId?"PLAY_PLAN":"START",payload:{contextMode:A.contextMode??null,sourcePlanId:A.sourcePlanId??null,parentRunId:A.parentRunId??null,followUpMode:A.followUpMode??null}}),transfersSlot:E}});return N(g.run.id),e.transferLeaseFromRunId&&N(e.transferLeaseFromRunId),g.transfersSlot&&H(g.command,g.run.agentId),await this.promoteQueuedLaneSafely(l.id,t),this.get(g.run.id)}async playPlan(A,e=[],t,r){let i=await this.get(A);if(!i)throw Error("Plan not found");if(i.playedAt)throw Error("This plan has already been run");if(!i.worktreeId)throw Error("Plan worktree is unavailable");return this.createInternal({kind:"SESSION",worktreeId:i.worktreeId,jiraIssueKey:i.jiraIssueKey,provider:i.provider,model:i.model,effort:i.effort,webSearchEnabled:i.webSearchEnabled,prompt:`Implement the following plan:
|
|
1437
|
+
}`,{path:y.path_with_namespace,iid:String(A)}),t=e.project?.mergeRequest?.approvalState.rules;if(!t)throw Error("GitLab did not return the merge request approval rules");return t},K=(A,e)=>{let t=A.sourceRule?.id??A.id;return A.sourceRule||t.includes("ApprovalProjectRule/")?`${B}:rule:${m(t)}`:`${B}:mr:${e}:rule:${m(A.id)}`};if(M){let A=new Set;try{for(let e of(await z(M.iid))){let t,r=e.type.toLowerCase(),i="any_approver"===r?T:(e.eligibleApprovers??[]).filter(d).map(c),n=(e.approvedBy?.nodes??[]).map(c);Y.push(...n),e.approvedBy?.pageInfo?.hasNextPage&&b(`Approvals for ${e.name} are incomplete`,Error("GitLab returned more than 100 approving users"));let a=e.approvalsRequired,s=e.name,o="code_owner"===r?e.patterns?.length?e.patterns:[e.name]:[];if("code_owner"===r)t=[...new Set(o.flatMap(t=>{let r=`${(e.section??"codeowners").toLowerCase()}\0${t}`;A.add(r);let i=G.get(r);return i?[i]:[]}))],0===t.length&&b(`Code owner rule ${e.name} cannot be mapped`,Error("Refresh the target branch CODEOWNERS configuration")),0===a&&(a=1,s=`Suggested code owners \xb7 ${e.name}`);else{let A=K(e,M.id);h(O,{key:A,name:e.name,kind:"APPROVAL_RULE",candidates:i}),t=[A]}j.push({id:e.id,name:s,isRequired:e.approvalsRequired>0,patterns:o,poolKeys:t,eligibleReviewerIds:i.map(A=>A.id),requiredApprovals:a,approvedReviewerIds:n.map(A=>A.id)})}}catch(A){b("GitLab merge request approval rules could not be loaded",A)}try{let A=await f(`${E}/merge_requests/${M.iid}/approvals`);Y.push(...(A.approved_by??[]).map(A=>c(A.user)))}catch(A){b("GitLab current approvals could not be loaded",A)}if(J.length)try{let e=await w(`${E}/merge_requests/${M.iid}/diffs`);M.changes_count&&/^\d+$/.test(M.changes_count)&&Number(M.changes_count)>e.length&&b("GitLab changed files are incomplete",Error("The merge request exceeds the provider diff-list limit"));let t=[...new Set(e.flatMap(A=>[A.new_path,A.old_path]).filter(Boolean))];for(let e of o(J,t)){let t=`${e.section}\0${e.pattern}`;if(A.has(t))continue;let r=G.get(t),i=r?O.get(r):null;r&&i?.candidates.length&&j.push({id:`gitlab:suggested:${t}`,name:`Suggested code owners \xb7 ${e.pattern}`,isRequired:!1,patterns:[e.pattern],poolKeys:[r],eligibleReviewerIds:i.candidates.map(A=>A.id),requiredApprovals:1,approvedReviewerIds:Y.map(A=>A.id)})}}catch(A){b("GitLab changed files for ownership suggestions could not be loaded",A)}}else try{let A=await w(`${E}/merge_requests`,{state:"opened",scope:"all"});await (0,e.f)(A,async A=>{try{for(let e of(await z(A.iid))){if("code_owner"===e.type.toLowerCase())continue;let t=K(e,A.id);if(!t.includes(`:mr:${A.id}:`))continue;let r="any_approver"===e.type.toLowerCase()?T:(e.eligibleApprovers??[]).filter(d).map(c);h(O,{key:t,name:`!${A.iid} \xb7 ${e.name}`,kind:"APPROVAL_RULE",candidates:r})}}catch(e){b(`GitLab approval groups for !${A.iid} could not be loaded`,e)}})}catch(A){b("GitLab open merge request approval groups could not be loaded",A)}return{provider:"GITLAB",repositoryIdentity:B,ref:S,defaultRef:y.default_branch,refs:[...new Set([y.default_branch,S,...R])],pools:[...O.values()],requirements:j,issues:[...new Set(D)],discoveryComplete:k,...M?{request:{id:r.id,number:M.iid,url:M.web_url,open:"opened"===M.state,authorId:String(M.author.id),baseRef:M.target_branch,headSha:M.sha,currentReviewers:u((M.reviewers??[]).map(c)),approvedReviewers:u(Y)}}:{}}}async assign(A,e,t){let r=await this.service.projectForCanonicalOrigin(A.canonicalOrigin);if(!r||e.projectId&&e.projectId!==r.id)throw Error("Merge request project does not match reviewer settings");await this.service.addMergeRequestReviewers({projectId:r.id,iid:e.number,expectedId:m(e.id),reviewerIds:t.map(A=>A.id)})}}A.s(["f",0,class{github;gitlab;constructor(A,e){this.github=new E(A),this.gitlab=new f(e)}discover(A,e,t,r=!1){return/^github\.com\//i.test(A.canonicalOrigin)?this.github.discover(A,e,t,r):this.gitlab.discover(A,e,t,r)}assign(A,e,t){return/^github\.com\//i.test(A.canonicalOrigin)?this.github.assign(A,e,t):this.gitlab.assign(A,e,t)}}],412080)},655617,A=>{var e=A.i(666680),t=A.i(135475),r=A.i(75064),i=A.i(492973),n=A.i(909592),a=A.i(79322);A.i(256554);var s=A.i(848201);let o=A=>[...new Set(A)],l=r.z.object({id:i.z.string().min(1).max(500),username:i.z.string().max(500),name:i.z.string().max(500),avatarUrl:i.z.string().max(4e3).nullable(),url:i.z.string().max(4e3).nullable()}).strict(),c=n.z.array(r.z.object({key:i.z.string().min(1).max(2e3),name:i.z.string().max(2e3),kind:a.z.enum(["GENERAL","CODEOWNERS","APPROVAL_RULE"]),provider:a.z.enum(["GITHUB","GITLAB"]),repositoryIdentity:i.z.string().min(1).max(2e3),ref:i.z.string().max(1e3),reviewers:n.z.array(l).max(1e3)}).strict()).max(500),d=A=>({id:A.userId,username:A.username,name:A.name,avatarUrl:A.avatarUrl,url:A.url});A.s(["w",0,class{providers;refreshWorktree;assignments;constructor(A,e){this.providers=A,this.refreshWorktree=e,this.assignments=new Map}async repository(A){let e=await (0,t.U)(),r=await e.codebaseRepository.findUnique({where:{id:A}});if(!r)throw Error("Repository not found");return r}async saved(A){return(await (0,t.U)()).repositoryReviewerPool.findMany({where:{repositoryId:A},include:{members:!0},orderBy:{key:"asc"}})}async repositoryCodeReviewers(A,e,t=!1){let r=await this.repository(A),[i,n]=await Promise.all([this.providers.discover(r,e??void 0,void 0,t),this.saved(A)]),a=new Map(n.map(A=>[A.key,A])),s=i.pools.map(A=>{let e=a.get(A.key);a.delete(A.key);let t=new Set(A.candidates.map(A=>A.id)),r=e?.members.map(A=>A.userId)??[];return{...A,selectedReviewerIds:r,unavailableReviewerIds:r.filter(A=>e?.repositoryIdentity!==i.repositoryIdentity||!t.has(A))}});for(let A of a.values())s.push({key:A.key,name:A.name,kind:A.kind,candidates:[],selectedReviewerIds:A.members.map(A=>A.userId),unavailableReviewerIds:A.members.map(A=>A.userId)});return{repositoryId:A,...i,pools:s}}async saveRepositoryCodeReviewers(A){if(A.pools.length>500)throw Error("At most 500 reviewer pools can be saved at once");let e=await this.repository(A.repositoryId),[r,i]=await Promise.all([this.providers.discover(e,A.ref??void 0,void 0,!0),this.saved(e.id)]),n=this.validatePools(A.pools,r,i),a=await (0,t.U)();return await a.$transaction(async A=>{await this.writePools(A,e.id,r,n),await this.updateConfiguredFlag(A,e.id)}),this.publish(e.id),this.repositoryCodeReviewers(e.id,A.ref)}validatePools(A,e,t=[]){let r=new Map(e.pools.map(A=>[A.key,A])),i=new Map(t.map(A=>[A.key,A])),n=new Set;return A.map(A=>{if(!A.key||A.key.length>2e3||n.has(A.key))throw Error("Reviewer pool keys must be unique");if(n.add(A.key),A.reviewerIds.length>1e3)throw Error("At most 1,000 reviewers can be selected per pool");let t=r.get(A.key),a=i.get(A.key);if(!t&&!a&&A.reviewerIds.length)throw Error("Reviewer group is no longer available; refresh repository settings");let s=new Map(t?.candidates.map(A=>[A.id,A])??[]);if(a?.repositoryIdentity===e.repositoryIdentity)for(let A of a.members)s.has(A.userId)||s.set(A.userId,d(A));let l=o(A.reviewerIds).map(A=>{let e=s.get(A);if(!e)throw Error("A selected reviewer is no longer eligible; refresh repository settings");return e});return{key:A.key,name:t?.name??a?.name??A.key,kind:t?.kind??a?.kind??"GENERAL",discoveryRef:t?e.ref:a?.discoveryRef??e.ref,members:l}})}async writePools(A,t,r,i){for(let n of i){if(!n.members.length){await A.repositoryReviewerPool.deleteMany({where:{repositoryId:t,key:n.key}});continue}let i=await A.repositoryReviewerPool.upsert({where:{repositoryId_key:{repositoryId:t,key:n.key}},create:{id:(0,e.randomUUID)(),repositoryId:t,key:n.key,name:n.name,kind:n.kind,provider:r.provider,repositoryIdentity:r.repositoryIdentity,discoveryRef:n.discoveryRef},update:{name:n.name,kind:n.kind,provider:r.provider,repositoryIdentity:r.repositoryIdentity,discoveryRef:n.discoveryRef}});await A.repositoryReviewerMember.deleteMany({where:{poolId:i.id}}),await A.repositoryReviewerMember.createMany({data:n.members.map(({id:A,...e})=>({poolId:i.id,userId:A,...e}))})}}async updateConfiguredFlag(A,e){let t=await A.repositoryReviewerMember.count({where:{pool:{repositoryId:e}}});await A.codebaseRepository.update({where:{id:e},data:{hasConfiguredCodeReviewers:t>0,updatedAt:new Date}})}async exportPools(A){return(await this.saved(A)).map(A=>({key:A.key,name:A.name,kind:A.kind,provider:A.provider,repositoryIdentity:A.repositoryIdentity,ref:A.discoveryRef,reviewers:A.members.map(d)}))}async validateTransferredPools(A,e){let t=c.parse(e),r=new Map,i=[];for(let e of t){let t=r.get(e.ref);t||(t=await this.providers.discover(A,e.ref||void 0,void 0,!0),r.set(e.ref,t));let n=A=>A.slice(0,A.lastIndexOf(":"));if(e.provider!==t.provider||n(e.repositoryIdentity)!==n(t.repositoryIdentity)||!e.key.startsWith(`${e.repositoryIdentity}:`))throw Error("Reviewer pools belong to a different provider instance. Deselect Code reviewers in this import and configure reviewers in the destination repository.");let a=`${t.repositoryIdentity}${e.key.slice(e.repositoryIdentity.length)}`,s=t.pools.find(A=>A.key===a),o=new Map(s?.candidates.map(A=>[A.id,A])??[]);if(!s||e.reviewers.some(A=>!o.has(A.id)))throw Error(`Reviewer group ${e.name} or one of its people cannot be resolved at the destination. Deselect Code reviewers in this import and configure reviewers in the destination repository.`);i.push({key:a,name:s.name,kind:s.kind,provider:t.provider,repositoryIdentity:t.repositoryIdentity,ref:t.ref,reviewers:e.reviewers.map(A=>o.get(A.id))})}if(new Set(i.map(A=>A.key)).size!==i.length)throw Error("Imported reviewer pools contain duplicate groups");return i}async applyTransferredPools(A,e,t){for(let r of(await A.repositoryReviewerPool.deleteMany({where:{repositoryId:e}}),t))await this.writePools(A,e,{provider:r.provider,repositoryIdentity:r.repositoryIdentity},[{...r,discoveryRef:r.ref,members:r.reviewers}]);await this.updateConfiguredFlag(A,e)}async context(A,e=!0){let r=await (0,t.U)(),i=await r.worktree.findUnique({where:{id:A},include:{codebase:{include:{repository:!0}},pullRequest:!0,gitLabMergeRequest:!0}});if(!i)throw Error("Worktree not found");let n=i.codebase.repository;if(e&&!n.hasConfiguredCodeReviewers)throw Error("Configure code reviewers in repository settings first");let a=i.gitLabMergeRequest,s=i.pullRequest,o=a?.sourceBranch??s?.headRefName;if(!i.branch||o!==i.branch||i.pullRequestLookupBranch!==i.branch||i.pullRequestLookupOrigin?.toLowerCase()!==n.canonicalOrigin.toLowerCase())throw Error("The worktree branch or repository has changed; refresh the linked pull or merge request");let l=a?{id:a.gitlabId,number:a.iid,projectId:a.projectId}:s?{id:s.githubId,number:s.number}:null;if(!l)throw Error("Worktree does not have a linked pull or merge request");return{worktree:i,repository:n,locator:l}}async discoverRequest(A,e=!0){let t=await this.context(A,e),r=await this.providers.discover(t.repository,void 0,t.locator,!0),i=await this.context(A,e);if(i.locator.id!==t.locator.id||i.locator.number!==t.locator.number||i.locator.projectId!==t.locator.projectId||i.repository.id!==t.repository.id||i.repository.canonicalOrigin.toLowerCase()!==t.repository.canonicalOrigin.toLowerCase()||i.worktree.branch!==t.worktree.branch)throw Error("The linked pull or merge request has changed; reload review details");return{...i,discovery:r}}async worktreeReviewStatus(A){let{discovery:e}=await this.discoverRequest(A,!1);return function(A,e){let t=e.request;if(!t)throw Error("Pull or merge request was not found");let r=o(t.currentReviewers.map(A=>A.id)),i=o(t.approvedReviewers.map(A=>A.id)),n=new Map(e.pools.map(A=>[A.key,A])),a=new Map([...e.pools.flatMap(A=>A.candidates),...t.currentReviewers,...t.approvedReviewers].map(A=>[A.id,A])),s=e.requirements.map(A=>{let i=new Set(A.eligibleReviewerIds.filter(A=>"GITHUB"!==e.provider||A!==t.authorId));return{id:A.id,name:A.name,isRequired:A.isRequired,patterns:A.patterns,requiredApprovals:A.isRequired?A.requiredApprovals:0,groups:o(A.poolKeys).flatMap(A=>{let e=n.get(A);return e?[{key:A,name:e.name,kind:e.kind}]:[]}),eligibleReviewerIds:[...i],approvedReviewerIds:o(A.approvedReviewerIds.filter(A=>i.has(A))),requestedReviewerIds:r.filter(A=>i.has(A))}}),l=new Set([...r,...i,...s.flatMap(A=>A.eligibleReviewerIds)]);return{worktreeId:A,requestId:t.id,requestUrl:t.url,provider:e.provider,requestOpen:t.open,reviewers:[...a.values()].filter(A=>l.has(A.id)),currentReviewerIds:r,approvedReviewerIds:i,requirements:s,issues:e.issues,discoveryComplete:e.discoveryComplete}}(A,e)}async live(A){let e=await this.discoverRequest(A),{discovery:t}=e,r=function(A,e,t){let r=e.request;if(!r)throw Error("Pull or merge request was not found");let i=o(r.currentReviewers.map(A=>A.id)),n=o(r.approvedReviewers.map(A=>A.id)),a=new Set(i),s=new Set(n),l=new Map(e.pools.map(A=>[A.key,new Set(A.candidates.map(A=>A.id))])),c=new Map(t.filter(A=>A.repositoryIdentity===e.repositoryIdentity).map(A=>[A.key,new Set(A.members.map(A=>A.userId).filter(e=>l.get(A.key)?.has(e)))])),d=new Map([...e.pools.flatMap(A=>A.candidates),...r.currentReviewers,...r.approvedReviewers].map(A=>[A.id,A])),u=e.requirements;if(!u.length){let A=e.pools.find(A=>"GENERAL"===A.kind);A&&(u=[{id:"general-reviewers",name:"General reviewers",isRequired:!1,patterns:[],poolKeys:[A.key],eligibleReviewerIds:A.candidates.map(A=>A.id),approvedReviewerIds:n,requiredApprovals:1}])}let g=u.map(A=>{let e=new Set(A.eligibleReviewerIds.filter(A=>A!==r.authorId)),t=new Set(A.poolKeys.flatMap(A=>[...c.get(A)??[]]));return{...A,eligibleReviewerIds:[...e],candidateReviewerIds:[...t].filter(A=>e.has(A)&&d.has(A)&&!a.has(A)&&!s.has(A)),approvedReviewerIds:o(A.approvedReviewerIds.filter(A=>e.has(A))),requestedReviewerIds:i.filter(A=>e.has(A))}}),h=new Set([...i,...n,...g.flatMap(A=>[...A.candidateReviewerIds,...A.approvedReviewerIds,...A.requestedReviewerIds])]);return{worktreeId:A,requestId:r.id,requestUrl:r.url,provider:e.provider,requestOpen:r.open,authorId:r.authorId,reviewers:[...d.values()].filter(A=>h.has(A.id)),requirements:g,currentReviewerIds:i,approvedReviewerIds:n,selectedReviewerIds:[],issues:[...e.issues,...e.discoveryComplete||e.requirements.length?[]:["General reviewer selection is available, but provider approval requirements could not be verified."]],discoveryComplete:e.discoveryComplete}}(A,t,await this.saved(e.repository.id));if(!r.requestOpen)throw Error("Pull or merge request is no longer open; refresh this worktree");return{...e,assignment:r}}async worktreeReviewerAssignment(A){return(await this.live(A)).assignment}async previewRandomWorktreeReviewers(A,e,t){let{assignment:r}=await this.live(A);return this.requireRequest(r,e),function(A,e=[],t=Math.random){let r=o(A.requirements.flatMap(A=>A.candidateReviewerIds)),i=new Set(r),n=new Set(e.filter(A=>i.has(A))),a=A=>new Set([...A.approvedReviewerIds,...A.requestedReviewerIds,...[...n].filter(e=>A.eligibleReviewerIds.includes(e))]).size;for(let A=r.length-1;A>0;A--){let e=Math.floor(t()*(A+1));[r[A],r[e]]=[r[e],r[A]]}for(let e of r)A.requirements.some(A=>a(A)<A.requiredApprovals&&A.candidateReviewerIds.includes(e))&&n.add(e);let s=A.requirements.flatMap(A=>{let e=Math.max(0,A.requiredApprovals-a(A));return e?[`${A.name}: ${e} more eligible reviewer${1===e?"":"s"} needed. Configure additional reviewers in repository settings.`]:[]});return{...A,selectedReviewerIds:[...n],issues:[...A.issues,...s]}}(r,t??[])}requireRequest(A,e){if(A.requestId!==e)throw Error("The pull or merge request has changed; reload reviewer options before assigning")}async assignWorktreeReviewers(A){let e=(this.assignments.get(A.worktreeId)??Promise.resolve()).catch(()=>void 0).then(async()=>{let{repository:e,locator:t,assignment:r}=await this.live(A.worktreeId);this.requireRequest(r,A.requestId);let i=o(A.reviewerIds);if(!i.length||i.length>1e3)throw Error("Select between 1 and 1,000 reviewers");let n=new Set(r.requirements.flatMap(A=>A.candidateReviewerIds)),a=new Set(r.currentReviewerIds);if(i.some(A=>!n.has(A)&&!a.has(A)))throw Error("A selected reviewer is no longer eligible; reload reviewer options before assigning");let s=i.filter(A=>!a.has(A));s.length&&await this.providers.assign(e,t,r.reviewers.filter(A=>s.includes(A.id))),await this.refreshWorktree?.(A.worktreeId).catch(()=>void 0),this.publish(e.id,A.worktreeId);try{return await this.worktreeReviewerAssignment(A.worktreeId)}catch{let A=o([...r.currentReviewerIds,...s]);return{...r,currentReviewerIds:A,requirements:r.requirements.map(e=>({...e,candidateReviewerIds:e.candidateReviewerIds.filter(A=>!s.includes(A)),requestedReviewerIds:A.filter(A=>e.eligibleReviewerIds.includes(A))})),issues:[...r.issues,"Review requests were sent. Reload reviewer options to refresh provider status."]}}});this.assignments.set(A.worktreeId,e);try{return await e}finally{this.assignments.get(A.worktreeId)===e&&this.assignments.delete(A.worktreeId)}}publish(A,e=null){s._H.publish(s.aA,{codebaseOverviewChanged:{repositoryId:A,codebaseId:null}}),s._H.publish(s.MA,{worktreeOverviewChanged:{worktreeId:e,codebaseId:null}})}},"k",0,c])},533756,A=>{A.i(310509),A.i(162375),A.s([])},310509,162375,A=>{var e=A.i(238068),t=A.i(794231),r=A.i(666680),i=A.i(812057),n=A.i(135475);A.i(256554);var a=A.i(848201),s=A.i(118387),o=A.i(430361);class l extends Error{code;fieldKey;constructor(A,e){super(`Invalid form answer (${A}): ${e}`),this.code=A,this.fieldKey=e}}function c(A){if(!A||"object"!=typeof A||Array.isArray(A))throw Error("Invalid form object");return A}function d(A){let e=c(A);if("string"!=typeof e.key||!e.key||!["string","number","integer","boolean","multiselect","external"].includes(String(e.type)))throw Error("Invalid form field");for(let A of["title","description","pattern","placeholder"])if(void 0!==e[A]&&"string"!=typeof e[A])throw Error(`Invalid form field ${A}`);for(let A of["required","hidden","custom"])if(void 0!==e[A]&&"boolean"!=typeof e[A])throw Error(`Invalid form field ${A}`);for(let A of["minLength","maxLength","minItems","maxItems"])if(void 0!==e[A]&&("number"!=typeof e[A]||!Number.isInteger(e[A])||e[A]<0))throw Error(`Invalid form field ${A}`);for(let A of["minimum","maximum"])if(void 0!==e[A]&&("number"!=typeof e[A]||!Number.isFinite(e[A])))throw Error(`Invalid form field ${A}`);if(void 0!==e.format&&!["email","uri","date","date-time"].includes(String(e.format)))throw Error("Invalid form field format");if("external"===e.type&&("string"!=typeof e.url||!URL.canParse(e.url)||!["https:","http:"].includes(new URL(e.url).protocol)))throw Error("Invalid external form URL");if("multiselect"===e.type&&!Array.isArray(e.options))throw Error("Missing form options");if(void 0!==e.options){if(!Array.isArray(e.options))throw Error("Invalid form options");let A=new Set;for(let t of e.options){let e=c(t);if("string"!=typeof e.value||"string"!=typeof e.label||void 0!==e.description&&"string"!=typeof e.description||A.has(e.value))throw Error("Invalid form option");A.add(e.value)}}if(void 0!==e.when){if(!Array.isArray(e.when))throw Error("Invalid form conditions");for(let A of e.when){let e=c(A);if("string"!=typeof e.key||!["eq","neq"].includes(String(e.op))||!["string","number","boolean"].includes(typeof e.value))throw Error("Invalid form condition")}}return void 0!==e.default&&u(e,e.default),e}function u(A,e){let t=e=>{throw new l(e,A.key)};if("external"===A.type){!0!==e&&t("external");return}if(void 0===e){A.required&&t("required");return}if("string"===A.type){if("string"!=typeof e)return t("type");if(A.required&&!e.length&&t("required"),void 0!==A.minLength&&e.length<A.minLength&&t("minLength"),void 0!==A.maxLength&&e.length>A.maxLength&&t("maxLength"),void 0!==A.pattern){let r=!1;try{r=new RegExp(A.pattern).test(e)}catch{}r||t("pattern")}"email"!==A.format||/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e)||t("format"),"uri"!==A.format||URL.canParse(e)||t("format"),"date"===A.format&&(!/^\d{4}-\d{2}-\d{2}$/.test(e)||Number.isNaN(Date.parse(e))||new Date(e).toISOString().slice(0,10)!==e)&&t("format"),"date-time"===A.format&&Number.isNaN(Date.parse(e))&&t("format"),!A.options||A.custom||A.options.some(A=>A.value===e)||t("option")}else if("number"===A.type||"integer"===A.type){if("number"!=typeof e||!Number.isFinite(e)||"integer"===A.type&&!Number.isInteger(e))return t("type");void 0!==A.minimum&&e<A.minimum&&t("minimum"),void 0!==A.maximum&&e>A.maximum&&t("maximum")}else if("boolean"===A.type)"boolean"!=typeof e&&t("type");else if("multiselect"===A.type){if(!Array.isArray(e)||!e.every(A=>"string"==typeof A))return t("type");A.required&&!e.length&&t("required"),void 0!==A.minItems&&e.length<A.minItems&&t("minItems"),void 0!==A.maxItems&&e.length>A.maxItems&&t("maxItems"),!A.custom&&e.some(e=>!A.options.some(A=>A.value===e))&&t("option")}}function g(A,e){let t=c(e),r=new Set(A.map(A=>A.key));if(r.size!==A.length)throw Error("Duplicate form field key");for(let A of Object.keys(t))if(!r.has(A))throw new l("unknown",A);let i=Object.create(null),n=new Set;for(let e of A){if("external"!==e.type){for(let A of e.when??[])if(!n.has(A.key))throw Error("Form conditions must reference an earlier field")}let A=Object.hasOwn(t,e.key),r=A?c(t[e.key]).value:void 0;if(!function(A,e){return"external"===A.type||!A.when||A.when.every(A=>{let t=e[A.key];if(void 0===t)return!1;let r=Array.isArray(t)?t.includes(String(A.value)):t===A.value;return"eq"===A.op?r:!r})}(e,i)){if(A)throw new l("inactive",e.key)}else u(e,r),void 0!==r&&(i[e.key]=r);n.add(e.key)}return i}A.i(902157);var h=A.i(912714),p=A.i(750227);async function I(A){if(!A.length)return[];let e=await (0,n.U)(),t=await e.runAttachment.findMany({where:{id:{in:A}}});if(t.length!==A.length)throw Error("Attachment is unavailable");let i=(0,p.resolve)(function(){if(process.env.RUN_DATA_DIRECTORY)return(0,p.resolve)(process.env.RUN_DATA_DIRECTORY);let A=process.env.DATABASE_URL||"file:./prisma/dev.db";return(0,p.join)((0,p.dirname)((0,p.resolve)((0,n.O)(A))),"run-data")}(),"attachments");await (0,h.mkdir)(i,{recursive:!0,mode:448});let a=[];try{for(let A of t){let t=(0,r.randomUUID)(),n=(0,p.join)(i,t);await (0,h.copyFile)(A.storagePath,n),await e.runAttachment.create({data:{id:t,sha256:A.sha256,filename:A.filename,contentType:A.contentType,size:A.size,storagePath:n}}),a.push({id:t,path:n})}return a.map(({id:A})=>A)}catch(A){throw await e.runAttachment.deleteMany({where:{id:{in:a.map(({id:A})=>A)}}}),await C(a.map(({path:A})=>A)),A}}async function C(A){await Promise.all(A.map(A=>(0,h.rm)(A,{force:!0})))}A.i(81111),A.i(188646),A.s(["r",0,0x6400000,"h",0,I,"l",0,C],162375);let E=["PLAN","SESSION"],m=["CODEX","CLAUDE","OPENCODE"],f=new Set(["COMPLETED","CANCELLED","FAILED"]),w="ANSWER_REVISION",Q=["PAUSED","COMPLETED","CANCELLED","FAILED","SUPERSEDED"];function y(A,e,t){let r=e.trim().toUpperCase();if(!A.includes(r))throw Error(`${t} is not supported`);return r}function B(A,e,t){let r=A.trim();if(!r)throw Error(`${e} is required`);if(r.length>t)throw Error(`${e} is too long`);return r}function D(A,e){let t=A?.trim()||null;if(t&&t.length>e)throw Error("Value is too long");return t}function k(A){return D(A,100)?.toUpperCase()??null}function b(A,e){let t=e??+("SESSION"===A);if(!Number.isInteger(t)||t<0||t>32)throw Error("Worktree concurrency limit must be between 0 and 32");return t}function M(A){if(!A)return;let e=new Date(A);return Number.isNaN(e.getTime())?void 0:e}function S(A){return`/ai/${"PLAN"===A.kind?"plans":"sessions"}/${encodeURIComponent(A.id)}`}function N(A){let e={runChanged:{id:A}};a._H.publish((0,a.k_)(A),e),a._H.publish(a.hu,e),a._H.publish(a.fb,{sidebarStatusChanged:!0}),a._H.publish(a.Wy,{actionCenterChanged:!0})}function H(A,e){a._H.publish((0,a.CO)(e),{agentEvents:{type:"RUN_COMMAND_AVAILABLE",job:null,runCommand:A}})}async function R(A,e){return(await A.runNumberSequence.upsert({where:{kind:e},create:{kind:e,nextValue:1},update:{nextValue:{increment:1}}})).nextValue-1}async function v(A,e){let t=await A.runCommand.findFirst({where:{runId:e},orderBy:{sequence:"desc"},select:{sequence:!0}});return(t?.sequence??-1)+1}let x={run:{include:{worktree:!0,inputs:{include:{attachments:!0}},attempts:!0,sourcePlan:{include:{attempts:!0}},parentRun:{include:{attempts:!0}}}}};async function T(A,e){let t=await v(A,e.runId);return A.runCommand.create({data:{id:(0,r.randomUUID)(),runId:e.runId,agentId:e.agentId,sequence:t,type:e.type,payloadJson:JSON.stringify(e.payload??{}),idempotencyKey:e.idempotencyKey??`${e.runId}:${t}:${e.type}`},include:x})}let U={worktree:{include:{codebase:{include:{repository:!0,agent:!0}}}},attempts:{orderBy:{generation:"asc"}},inputs:{orderBy:{sequence:"asc"},include:{attachments:!0}},modelUsage:{orderBy:{model:"asc"}},toolCalls:{orderBy:{sequence:"asc"}},questionBatches:{orderBy:{createdAt:"asc"},include:{questions:{orderBy:{position:"asc"},include:{options:{orderBy:{position:"asc"}}}},answerRevisions:{orderBy:{revision:"asc"}},checkpoint:!0}},sourcePlan:!0,playedSession:!0,parentRun:!0,followUps:{orderBy:{createdAt:"asc"}},checkpoints:{orderBy:{createdAt:"asc"}}};A.s(["f",0,class{notifications;agentControl;diskSpace;reaperTimer;mcpPresetResolver;worktreeAdmissionPromoter;constructor(A,e,t){this.notifications=A,this.agentControl=e,this.diskSpace=t}setMcpPresetResolver(A){this.mcpPresetResolver=A}setWorktreeAdmissionPromoter(A){this.worktreeAdmissionPromoter=A}async promoteQueuedLane(A,e){let t=await (0,n.U)(),i=await t.$transaction(async t=>{let i=new Date;await t.worktreeAdmissionLane.upsert({where:{worktreeId:A},create:{worktreeId:A},update:{updatedAt:i}}),await t.worktreeRunConcurrencyLane.upsert({where:{worktreeId_kind:{worktreeId:A,kind:e}},create:{worktreeId:A,kind:e},update:{updatedAt:i}}),await t.worktreeRunLease.deleteMany({where:{worktreeId:A,purpose:{not:w},run:{status:{in:[...f]}}}}),await t.worktreeWorkflowLease.deleteMany({where:{worktreeId:A,workflowRun:{status:{in:["SUCCEEDED","FAILED","CANCELLED"]}}}});let n=await t.worktreeWorkflowLease.findUnique({where:{worktreeId:A}}),a=n?null:await t.workflowRun.findFirst({where:{worktreeId:A,status:"QUEUED",parentRunId:null,worktreeConcurrency:"EXCLUSIVE"},orderBy:[{queuedAt:"asc"},{id:"asc"}],select:{id:!0,queuedAt:!0}}),s=await t.worktreeRunLease.count({where:{worktreeId:A,OR:[{run:{kind:e,origin:"MANAGED",status:{in:["IN_PROGRESS","PAUSED"]}}},{purpose:w,run:{kind:e,origin:"MANAGED"}}]}}),o=await t.agentRun.findMany({where:{worktreeId:A,kind:e,origin:"MANAGED",status:"QUEUED"},orderBy:[{createdAt:"asc"},{id:"asc"}],select:{id:!0,agentId:!0,createdAt:!0,worktreeConcurrencyLimit:!0,workflowRun:{select:{worktreeLeaseOwnerRunId:!0}}}}),l=[];for(let e of n?o.filter(A=>A.workflowRun?.worktreeLeaseOwnerRunId===n.workflowRunId):o){if(a&&function(A,e,t,r){let i=A.getTime()-t.getTime();return i<0||0===i&&e<r}(a.queuedAt,a.id,e.createdAt,e.id)||0!==e.worktreeConcurrencyLimit&&s>=e.worktreeConcurrencyLimit)break;if(!(await t.agentRun.updateMany({where:{id:e.id,status:"QUEUED"},data:{status:"IN_PROGRESS",phase:"QUEUED"}})).count)continue;await t.worktreeRunLease.create({data:{id:(0,r.randomUUID)(),worktreeId:A,runId:e.id}}),s+=1;let i=await t.runCommand.findFirst({where:{runId:e.id,status:"QUEUED"},orderBy:{sequence:"asc"},include:x});i&&e.agentId&&l.push({runId:e.id,agentId:e.agentId,command:i})}return l});for(let A of i)N(A.runId),H(A.command,A.agentId);return i.length}async promoteQueuedLaneSafely(A,e){try{await this.promoteQueuedLane(A,e),await this.worktreeAdmissionPromoter?.(A)}catch(t){console.error(`Could not promote ${e.toLowerCase()} queue for ${A}:`,t instanceof Error?t.message:t)}}async reconcileQueuedRuns(A){let e=await (0,n.U)(),t=await e.agentRun.findMany({where:{origin:"MANAGED",status:"QUEUED",worktreeId:{not:null},...A?{agentId:A}:{}},select:{worktreeId:!0,kind:!0},distinct:["worktreeId","kind"]}),r=0;for(let A of t)A.worktreeId&&("PLAN"===A.kind||"SESSION"===A.kind)&&(r+=await this.promoteQueuedLane(A.worktreeId,A.kind));return r}async waitForJob(A){let e=a._H.iterate((0,a.BC)(A)),t=Date.now()+6e4;try{for(;Date.now()<t;){let r=await this.agentControl.getJob(A);if(!r)throw Error("Agent job disappeared");if(["SUCCEEDED","FAILED","CANCELLED","TIMED_OUT"].includes(r.status))return r;await Promise.race([e.next(),new Promise(A=>setTimeout(A,t-Date.now()))])}throw await this.agentControl.cancelJob(A),Error("Agent did not respond in time")}finally{await e.return?.()}}async nativeSessionFile(A){var e;if(!this.agentControl)throw Error("Agent control is unavailable");let t=await (0,n.U)(),r=await t.agentRun.findUnique({where:{id:A},include:{attempts:{orderBy:{generation:"desc"}},worktree:!0,agent:!0}});if(!r)throw Error("Run not found");if("CLAUDE"!==r.provider&&"CODEX"!==r.provider)throw Error("This provider does not store a session file");let i=r.attempts.find(A=>A.nativeId)?.nativeId;if(!i)throw Error("This run has no native session yet");if(!r.worktree)throw Error("This run has no worktree");if(!r.agent||!r.agentId)throw Error("This run is not associated with an agent");if(!(null!==(e=r.agent).lastSeenAt&&Date.now()-e.lastSeenAt.getTime()<=(0,s.z)(e)&&null===e.disconnectedAt))throw Error("Agent is offline");if(!(function(A){try{let e=JSON.parse(A.capabilitiesJson);return Array.isArray(e)?e.filter(A=>"string"==typeof A):[]}catch{return[]}})(r.agent).includes(o.l))throw Error("Agent must be updated to export session files");let a=await this.agentControl.createJob({agentId:r.agentId,kind:o.l,payload:{provider:r.provider,nativeId:i,folder:r.worktree.folder},idempotencyKey:`runs:session:read:${A}:${i}`,timeoutSeconds:60,visibility:"SYSTEM"});try{let A=function(A){if("SUCCEEDED"!==A.status||!A.resultJson)throw Error(A.error||"Agent job failed");let e=JSON.parse(A.resultJson);if(!e||"object"!=typeof e||Array.isArray(e))throw Error("Agent job returned an invalid result");return e}(await this.waitForJob(a.id)),e="string"==typeof A.contentBase64?A.contentBase64:null;if(!e)throw Error("Agent returned an invalid session file");return{filename:"string"==typeof A.filename&&A.filename?A.filename:`${i}.jsonl`,contentBase64:e}}finally{await t.agentJob.deleteMany({where:{id:a.id,visibility:"SYSTEM"}})}}startReaper(A=6e4){this.reaperTimer||(this.reaperTimer=setInterval(()=>{this.reapOrphanedRuns().catch(A=>{console.error("Run reaper failed:",A instanceof Error?A.message:A)})},A),this.reaperTimer.unref())}stopReaper(){this.reaperTimer&&clearInterval(this.reaperTimer),this.reaperTimer=void 0}async reapOrphanedRuns(A=Date.now()){let e=await (0,n.U)(),t=await e.agentRun.findMany({where:{status:"IN_PROGRESS"},select:{id:!0,agentId:!0,worktreeId:!0,kind:!0}});if(!t.length)return 0;let r=[...new Set(t.map(A=>A.agentId).filter(A=>!!A))],i=new Set((r.length?await e.agent.findMany({where:{id:{in:r}},select:{id:!0,lastSeenAt:!0,disconnectedAt:!0,heartbeatIntervalSeconds:!0}}):[]).filter(e=>null===e.disconnectedAt&&null!==e.lastSeenAt&&A-e.lastSeenAt.getTime()<=(0,s.z)(e)+12e4).map(A=>A.id)),a=t.filter(A=>!A.agentId||!i.has(A.agentId)).map(A=>A.id);if(!a.length)return 0;let o=new Date(A);for(let A of(await e.$transaction(async A=>{await A.runAttempt.updateMany({where:{runId:{in:a},status:{notIn:Q}},data:{status:"FAILED",finishedAt:o}}),await A.agentRun.updateMany({where:{id:{in:a},status:{notIn:[...f]}},data:{status:"FAILED",phase:"AGENT_OFFLINE",error:"Agent went offline while this run was active",finishedAt:o}}),await A.runCommand.updateMany({where:{runId:{in:a},status:{in:["QUEUED","RUNNING"]}},data:{status:"FAILED",error:"Agent went offline",finishedAt:o}}),await A.worktreeRunLease.deleteMany({where:{runId:{in:a}}})}),a))N(A);for(let A of new Set(t.filter(A=>a.includes(A.id)&&A.worktreeId).map(A=>`${A.worktreeId}:${A.kind}`))){let e=A.lastIndexOf(":"),t=A.slice(0,e),r=A.slice(e+1);("PLAN"===r||"SESSION"===r)&&await this.promoteQueuedLaneSafely(t,r)}return a.length}async list(A){let e=y(E,A.kind,"Run kind"),t=Math.max(1,Math.min(A.first??100,200)),r=A.search?.trim(),i=A.archive?.toUpperCase()??"ACTIVE",a={kind:e,...A.agentId?{agentId:A.agentId}:{},..."ARCHIVED"===i?{archivedAt:{not:null}}:"ALL"===i?{}:{archivedAt:null},...A.provider?{provider:A.provider.trim().toUpperCase()}:{},...A.origin?{origin:A.origin.trim().toUpperCase()}:{},...A.appId?{repository:{apps:{some:{appId:A.appId}}}}:{},...r?{OR:[{initialPrompt:{contains:r}},{repositoryName:{contains:r}},{branch:{contains:r}},{jiraIssueKey:{contains:r}},{model:{contains:r}}]}:{}},s=await (0,n.U)(),[o,l]=await Promise.all([s.agentRun.findMany({where:a,orderBy:[{createdAt:"desc"},{id:"desc"}],take:t+1,...A.after?{cursor:{id:A.after},skip:1}:{},include:{worktree:!0,sourcePlan:!0,playedSession:!0,modelUsage:{orderBy:{model:"asc"}}}}),s.agentRun.count({where:a})]);return{items:o.slice(0,t),nextCursor:o.length>t?o[t-1].id:null,totalCount:l}}async get(A){return(await (0,n.U)()).agentRun.findUnique({where:{id:A},include:U})}async events(A){let e=await (0,n.U)(),t=Math.max(1,Math.min(A.first??200,500)),r=!!(A.latest||null!=A.beforeSequence),i=await e.runEvent.findMany({where:{runId:A.runId,sequence:{gt:A.afterSequence??-1,...null==A.beforeSequence?{}:{lt:A.beforeSequence}},...A.includeSuperseded?{}:{supersededAt:null},...A.search?.trim()?{searchText:{contains:A.search.trim()}}:{}},orderBy:{sequence:r?"desc":"asc"},take:t});return r?i.reverse():i}async questions(A){let e=await (0,n.U)(),t=Math.max(1,Math.min(A.first??100,200)),r={runId:A.runId},[i,a]=await Promise.all([e.runQuestionBatch.findMany({where:r,orderBy:[{createdAt:"asc"},{id:"asc"}],take:t+1,...A.after?{cursor:{id:A.after},skip:1}:{},include:{questions:{orderBy:{position:"asc"},include:{options:{orderBy:{position:"asc"}}}},answerRevisions:{orderBy:{revision:"asc"}},checkpoint:!0}}),e.runQuestionBatch.count({where:r})]);return{items:i.slice(0,t),nextCursor:i.length>t?i[t-1].id:null,totalCount:a}}async usage(A){return(await (0,n.U)()).agentRun.findUnique({where:{id:A},select:{inputTokens:!0,outputTokens:!0,reasoningTokens:!0,cacheReadTokens:!0,cacheWriteTokens:!0,toolCallCount:!0,estimatedCost:!0,modelUsage:{orderBy:{model:"asc"}},toolCalls:{orderBy:{sequence:"asc"}}}})}async linkedItems(A){let e=await (0,n.U)(),t=await e.agentRun.findUnique({where:{id:A},select:{sourcePlanId:!0,parentRunId:!0}});return t?e.agentRun.findMany({where:{OR:[{id:{in:[t.sourcePlanId,t.parentRunId].filter(A=>!!A)}},{sourcePlanId:A},{parentRunId:A}]},orderBy:{createdAt:"asc"}}):[]}async drafts(A={}){let e=await (0,n.U)(),t=Math.max(1,Math.min(A.first??100,200)),r=A.archive?.toUpperCase()??"ACTIVE",i=A.search?.trim(),a={..."ARCHIVED"===r?{archivedAt:{not:null}}:"ALL"===r?{}:{archivedAt:null},...i?{OR:[{prompt:{contains:i}},{jiraIssueKey:{contains:i}},{provider:{contains:i}},{model:{contains:i}}]}:{}},[s,o]=await Promise.all([e.runDraft.findMany({where:a,orderBy:[{updatedAt:"desc"},{id:"desc"}],take:t+1,...A.after?{cursor:{id:A.after},skip:1}:{},include:{worktree:!0,attachments:!0}}),e.runDraft.count({where:a})]);return{items:s.slice(0,t),nextCursor:s.length>t?s[t-1].id:null,totalCount:o}}async draft(A){return(await (0,n.U)()).runDraft.findUnique({where:{id:A},include:{worktree:!0,attachments:!0}})}async questionBatch(A){return(await (0,n.U)()).runQuestionBatch.findUnique({where:{id:A},include:{questions:{orderBy:{position:"asc"},include:{options:{orderBy:{position:"asc"}}}},answerRevisions:{orderBy:{revision:"asc"}}}})}async saveDraft(A){let e=y(E,A.kind,"Run kind"),t=y(m,A.provider,"Provider"),i=B(A.prompt,"Prompt",2e5),s=await this.requireWorktree(A.worktreeId),o=[...new Set(A.attachmentIds??[])],l=[...new Set(A.mcpPresetIds??[])];await this.requireAttachments(o,A.id??void 0);let c=await (0,n.U)(),d=A.id??(0,r.randomUUID)(),u=await c.$transaction(async r=>{let n=await r.runDraft.upsert({where:{id:d},create:{id:d,kind:e,worktreeId:s.id,agentId:s.codebase.agentId,jiraIssueKey:k(A.jiraIssueKey),provider:t,model:B(A.model,"Model",200),effort:D(A.effort,100),webSearchEnabled:!1!==A.webSearchEnabled,mcpPresetIdsJson:JSON.stringify(l),prompt:i},update:{kind:e,worktreeId:s.id,agentId:s.codebase.agentId,jiraIssueKey:k(A.jiraIssueKey),provider:t,model:B(A.model,"Model",200),effort:D(A.effort,100),webSearchEnabled:!1!==A.webSearchEnabled,mcpPresetIdsJson:JSON.stringify(l),prompt:i}});return o.length&&await r.runAttachment.updateMany({where:{id:{in:o},inputId:null},data:{draftId:d}}),await r.runAttachment.updateMany({where:{draftId:d,...o.length?{id:{notIn:o}}:{}},data:{draftId:null}}),n});return a._H.publish(a.hu,{runChanged:{id:u.id}}),this.draft(u.id)}async create(A){return this.createInternal(A)}async createInternal(A,e={}){let t=y(E,A.kind,"Run kind"),i=b(t,A.worktreeConcurrencyLimit),a=y(m,A.provider,"Provider"),s=B(A.prompt,"Prompt",2e5),o=B(A.model,"Model",200),l=await this.requireWorktree(A.worktreeId,a);await this.diskSpace?.assertWorktreeCanStart(l.id);let c=this.mcpPresetResolver?await this.mcpPresetResolver(t,[...new Set(A.mcpPresetIds??[])]):{presetIds:[],toolNames:[]},d=[...new Set(A.attachmentIds??[])];await this.requireAttachments(d,A.draftId??void 0);let u=await (0,n.U)(),g=await u.$transaction(async n=>{let u=await R(n,t),g=(0,r.randomUUID)(),h=(0,r.randomUUID)(),p=A.sourcePlanId?await n.agentRun.findUnique({where:{id:A.sourcePlanId}}):null;if(A.sourcePlanId){if(!p||"PLAN"!==p.kind)throw Error("Source plan was not found");if("COMPLETED"!==p.status||!p.finalOutput)throw Error("Only a completed plan with output can be run");if(p.playedAt)throw Error("This plan has already been run")}let I=A.parentRunId?await n.agentRun.findUnique({where:{id:A.parentRunId}}):null,C=e.transferLeaseFromRunId?await n.worktreeRunLease.findUnique({where:{runId:e.transferLeaseFromRunId}}):null,E=C?.worktreeId===l.id;e.transferLeaseFromRunId&&await n.agentRun.update({where:{id:e.transferLeaseFromRunId},data:{status:"CANCELLED",phase:"SUPERSEDED_BY_FOLLOW_UP",finishedAt:new Date}});let m=await n.agentRun.create({data:{id:g,kind:t,displayNumber:u,status:E?"IN_PROGRESS":"QUEUED",phase:E?"QUEUED":"WAITING_FOR_WORKTREE",provider:a,worktreeId:l.id,repositoryId:l.codebase.repository.id,agentId:l.codebase.agentId,jiraIssueKey:k(A.jiraIssueKey),repositoryName:l.codebase.repository.name,branch:l.branch,model:o,effort:D(A.effort,100),webSearchEnabled:!1!==A.webSearchEnabled,mcpPresetIdsJson:JSON.stringify(c.presetIds),mcpToolNamesJson:JSON.stringify(c.toolNames),mcpToolSnapshotJson:c.snapshot?JSON.stringify(c.snapshot):null,worktreeConcurrencyLimit:i,workflowRunId:A.workflowRunId??null,initialPrompt:s,sourcePlanId:p?.id,sourcePlanNumber:p?.displayNumber,parentRunId:I?.id,parentRunNumber:I?.displayNumber,followUpMode:D(A.followUpMode,50),inputs:{create:{id:h,sequence:0,kind:"INITIAL",prompt:s}}}});if(p&&await n.agentRun.update({where:{id:p.id},data:{playedAt:new Date,playedSessionNumber:u}}),E&&await n.worktreeRunLease.update({where:{runId:e.transferLeaseFromRunId},data:{runId:g,purpose:"RUN",reservationKey:null,acquiredAt:new Date}}),d.length&&(await n.runAttachment.updateMany({where:{id:{in:d},inputId:null},data:{inputId:h,draftId:null}})).count!==d.length)throw Error("One or more attachments are no longer available");return A.draftId&&await n.runDraft.deleteMany({where:{id:A.draftId}}),{run:m,command:await T(n,{runId:g,agentId:l.codebase.agentId,type:A.sourcePlanId?"PLAY_PLAN":"START",payload:{contextMode:A.contextMode??null,sourcePlanId:A.sourcePlanId??null,parentRunId:A.parentRunId??null,followUpMode:A.followUpMode??null}}),transfersSlot:E}});return N(g.run.id),e.transferLeaseFromRunId&&N(e.transferLeaseFromRunId),g.transfersSlot&&H(g.command,g.run.agentId),await this.promoteQueuedLaneSafely(l.id,t),this.get(g.run.id)}async playPlan(A,e=[],t,r){let i=await this.get(A);if(!i)throw Error("Plan not found");if(i.playedAt)throw Error("This plan has already been run");if(!i.worktreeId)throw Error("Plan worktree is unavailable");return this.createInternal({kind:"SESSION",worktreeId:i.worktreeId,jiraIssueKey:i.jiraIssueKey,provider:i.provider,model:i.model,effort:i.effort,webSearchEnabled:i.webSearchEnabled,prompt:`Implement the following plan:
|
|
1438
1438
|
|
|
1439
1439
|
${i.finalOutput??""}`,sourcePlanId:i.id,parentRunId:i.id,followUpMode:"PLAN_PLAY",contextMode:"NATIVE",attachmentIds:[],mcpPresetIds:e,worktreeConcurrencyLimit:t,workflowRunId:r})}async followUp(A,e){let t=await this.get(A);if(!t||!t.worktreeId)throw Error("Source run not found");let r=B(e.followUpMode??"","Follow-up mode",50).toUpperCase();if(!["RESUME","FRESH","RESEND"].includes(r))throw Error("Follow-up mode is not supported");let i="SESSION"===t.kind&&"PAUSED"===t.status?t.id:void 0,n="RESEND"!==r||e.attachmentIds?.length?e.attachmentIds:await I(t.inputs[0]?.attachments.map(({id:A})=>A)??[]),a="RESEND"!==r||e.prompt.trim()?e.prompt:t.initialPrompt;return"RESUME"===r&&e.provider.toUpperCase()!==t.provider&&(a=["Continue from this normalized visible context. Hidden provider state is not available across providers.","SUMMARY"==(e.contextMode?.toUpperCase()==="SUMMARY"?"SUMMARY":"NORMALIZED")?t.finalOutput||"No final summary is available.":[...t.inputs.map(A=>`[${A.kind}]
|
|
1440
1440
|
${A.prompt}`),...(await this.events({runId:t.id,first:500})).map(A=>`[${A.type}] ${A.summary}${A.detailMarkdown?`
|
|
@@ -1443,7 +1443,7 @@ ${a}`].join("\n\n").slice(0,2e6)),this.createInternal({...e,attachmentIds:n,kind
|
|
|
1443
1443
|
${A.prompt}`).join("\n\n"),a.run.events.filter(A=>null===a.eventSequence?A.createdAt<=a.createdAt:A.sequence<=a.eventSequence).map(A=>`[${A.type}] ${A.summary}${A.detailMarkdown?`
|
|
1444
1444
|
${A.detailMarkdown}`:""}`).join("\n\n"),`Questions:
|
|
1445
1445
|
${a.questions.map(A=>`- ${A.prompt}`).join("\n")}`,`Revised answer:
|
|
1446
|
-
${JSON.stringify(e,null,2)}`].filter(Boolean).join("\n\n").slice(0,2e6),p=await R(n,"SESSION"),I=(0,r.randomUUID)(),C=(0,r.randomUUID)(),E=new Date,m=await n.agentRun.create({data:{id:I,kind:"SESSION",displayNumber:p,status:o?"IN_PROGRESS":"QUEUED",phase:o?"ANSWER_REVISION_QUEUED":"WAITING_FOR_WORKTREE",provider:a.run.provider,worktreeId:a.run.worktreeId,repositoryId:a.run.repositoryId,agentId:a.run.agentId,jiraIssueKey:a.run.jiraIssueKey,repositoryName:a.run.repositoryName,branch:a.run.branch,model:a.run.model,effort:a.run.effort,webSearchEnabled:a.run.webSearchEnabled,worktreeConcurrencyLimit:"SESSION"===a.run.kind?a.run.worktreeConcurrencyLimit:b("SESSION",void 0),initialPrompt:h,parentRunId:a.runId,parentRunNumber:a.run.displayNumber,followUpMode:"ANSWER_REVISION",inputs:{create:{id:C,sequence:0,kind:"ANSWER_REVISION",prompt:h}}}});o&&await n.worktreeRunLease.update({where:{runId:a.runId},data:{runId:I,purpose:"RUN",reservationKey:null,acquiredAt:new Date}}),await n.agentRun.update({where:{id:a.runId},data:{status:"CANCELLED",phase:"SUPERSEDED_BY_ANSWER_REVISION",finishedAt:E}});let f=await T(n,{runId:I,agentId:a.run.agentId,type:"REVISE_ANSWER",payload:{batchId:A,revisionId:l,inputId:C,stash:!!t,rollback:i,checkpoint:a.checkpoint}});return{batch:a,run:m,command:f,sourceRunId:a.runId,sourceAgentId:a.run.agentId,transfersSlot:o}});return N(s.sourceRunId),N(s.run.id),s.transfersSlot&&H(s.command,s.sourceAgentId),await this.promoteQueuedLaneSafely(s.run.worktreeId,"SESSION"),this.get(s.run.id)}async pendingCommands(A){return await this.reconcileQueuedRuns(A),(await (0,n.U)()).runCommand.findMany({where:{agentId:A,OR:[{status:"RUNNING"},{status:"QUEUED",run:{status:{not:"QUEUED"}}}]},orderBy:[{createdAt:"asc"},{sequence:"asc"}],take:200,include:x})}async claimCommand(A,e){let t=await (0,n.U)(),r=await t.runCommand.findUnique({where:{id:e},select:{agentId:!0,status:!0,type:!0,run:{select:{worktreeId:!0,status:!0}}}});if(!r||r.agentId!==A)throw Error("Run command not found");if("QUEUED"===r.status&&"QUEUED"===r.run.status&&new Set(["START","PLAY_PLAN","CONTINUE","REVISE_ANSWER"]).has(r.type))throw Error("Run command is waiting for the worktree");"QUEUED"===r.status&&r.run.worktreeId&&await this.diskSpace?.assertWorktreeCanStart(r.run.worktreeId),await t.runCommand.updateMany({where:{id:e,agentId:A,status:"QUEUED"},data:{status:"RUNNING",claimedAt:new Date}});let i=await t.runCommand.findUnique({where:{id:e},include:x});if(!i||i.agentId!==A)throw Error("Run command not found");if("RUNNING"!==i.status)throw Error("Run command cannot be claimed");return i}async completeCommand(A,e,t,r){let i=await (0,n.U)(),a=await i.runCommand.findUnique({where:{id:e},include:{run:{select:{worktreeId:!0,kind:!0}}}});if(!a||a.agentId!==A)throw Error("Run command not found");let s=await i.runCommand.update({where:{id:e},data:{status:"SUCCEEDED"===t?"SUCCEEDED":"FAILED",error:D(r,2e4),finishedAt:new Date}});if("DELETE_NATIVE"===s.type&&"SUCCEEDED"===s.status){let A=await i.agentRun.findUnique({where:{id:s.runId},include:{inputs:{include:{attachments:!0}}}});if(A){let e=A.inputs.flatMap(A=>A.attachments.map(({storagePath:A})=>A));await i.agentRun.delete({where:{id:A.id}}),await C(e)}}else if("FAILED"===s.status){"PREPARE_ANSWER_REVISION"===s.type&&await i.worktreeRunLease.deleteMany({where:{runId:s.runId,purpose:w}});let A="ANSWER"===s.type&&await i.runQuestionBatch.count({where:{runId:s.runId,status:"PENDING"}});await i.agentRun.updateMany({where:{id:s.runId,status:{notIn:[...f]}},data:{error:s.error,phase:A?"WAITING_FOR_ANSWER":`${s.type}_FAILED`,...["START","PLAY_PLAN","CONTINUE"].includes(s.type)?{status:"FAILED",finishedAt:new Date}:{},...["PREPARE_ANSWER_REVISION","REVISE_ANSWER"].includes(s.type)?{status:"PAUSED",finishedAt:null}:{}}}),["START","PLAY_PLAN","CONTINUE"].includes(s.type)&&await i.worktreeRunLease.deleteMany({where:{runId:s.runId}})}else if(["PAUSE","CANCEL"].includes(s.type)){let A="CANCEL"===s.type;await i.agentRun.updateMany({where:{id:s.runId,status:{notIn:[...f]}},data:{status:A?"CANCELLED":"PAUSED",phase:A?"CANCELLED":"PAUSED",finishedAt:A?new Date:null}}),A&&await i.worktreeRunLease.deleteMany({where:{runId:s.runId}})}return N(s.runId),a.run.worktreeId&&("PLAN"===a.run.kind||"SESSION"===a.run.kind)&&await this.promoteQueuedLaneSafely(a.run.worktreeId,a.run.kind),s}async beginAttempt(A,e,t){let i=await (0,n.U)(),a=await i.agentRun.findUnique({where:{id:e},include:{attempts:!0}});if(!a||a.agentId!==A)throw Error("Run not found for this agent");if("QUEUED"===a.status)throw Error("Run is waiting for the worktree");if(f.has(a.status))throw Error("Run is already finished");let s=a.attempts.length,o=await i.runAttempt.create({data:{id:(0,r.randomUUID)(),runId:e,generation:s,nativeId:t||null,nativeKey:t?`${A}:${a.provider}:${t}`:null,status:"RUNNING"}});return await i.agentRun.update({where:{id:e},data:{phase:"RUNNING",startedAt:a.startedAt??new Date}}),N(e),o}async updateAttemptNativeId(A,e,t,r){let i=await (0,n.U)(),a=await i.$transaction(async i=>{let n=await i.runAttempt.findUnique({where:{id:e},include:{run:!0}});if(!n||n.run.agentId!==A)throw Error("Attempt not found");let a=`${A}:${n.run.provider}:${t}`,s=await i.runAttempt.findUnique({where:{nativeKey:a}});if(s&&s.id!==e){if(s.runId!==n.runId)throw Error("Native provider session belongs to another run");await i.runAttempt.update({where:{id:s.id},data:{nativeKey:null}})}let o=await i.runAttempt.update({where:{id:e},data:{nativeId:t,nativeKey:a}});return r&&await i.agentRun.update({where:{id:n.runId},data:{providerVersion:r}}),o});return N(a.runId),a}async appendEvents(A,e,t,r){let i=await (0,n.U)(),s=await i.agentRun.findUnique({where:{id:e}});if(!s||s.agentId!==A)throw Error("Run not found for this agent");let o=r.slice(0,500).map(A=>{let r=B(A.summary,"Event summary",2e3);return{id:A.id,runId:e,attemptId:t,sequence:A.sequence,type:B(A.type,"Event type",100).toUpperCase(),summary:r,searchText:D(A.searchText,1e5)??r,detailMarkdown:D(A.detailMarkdown,5e5),rawJson:void 0===A.raw?null:JSON.stringify(A.raw),createdAt:M(A.createdAt)}});if(!o.length)return[];let l=await i.$transaction(async A=>{let r=new Set((await A.runEvent.findMany({where:{id:{in:o.map(A=>A.id)}},select:{id:!0}})).map(({id:A})=>A)),i=o.filter(A=>!r.has(A.id));if(i.length){await A.runEvent.createMany({data:i});let r=i.filter(A=>A.type.includes("TOOL")&&!A.type.includes("QUESTION")).map(A=>({id:`event:${A.id}`,runId:e,attemptId:t,sequence:A.sequence,name:A.summary.split(/[\s:(]/,1)[0]||A.type,status:A.type.includes("FAIL")||A.type.includes("ERROR")?"FAILED":A.type.includes("COMPLETE")||A.type.includes("RESULT")?"COMPLETED":"OBSERVED",inputJson:A.rawJson,error:A.type.includes("FAIL")||A.type.includes("ERROR")?A.summary:null,finishedAt:A.createdAt}));r.length&&(await A.runToolCall.createMany({data:r}),await A.agentRun.update({where:{id:e},data:{toolCallCount:await A.runToolCall.count({where:{runId:e}})}}))}return A.runEvent.findMany({where:{id:{in:o.map(A=>A.id)}},orderBy:{sequence:"asc"}})});for(let A of l)a._H.publish((0,a.zP)(e),{runEventAdded:A});return N(e),l}async reportQuestion(A,e,t,i,s,o){if(!o.length||o.some(A=>!A.field)&&o.length>10||o.length>200)throw Error("Question batch is invalid");let l=await (0,n.U)(),c=await l.$transaction(async n=>{let a=await n.agentRun.findUnique({where:{id:e},include:{worktree:!0}});if(!a||a.agentId!==A)throw Error("Run not found for this agent");if(i){let A=await n.runQuestionBatch.findUnique({where:{runId_nativeRequestId:{runId:e,nativeRequestId:i}},include:{questions:{orderBy:{position:"asc"},include:{options:{orderBy:{position:"asc"}}}}}});if(A)return{batch:A,notification:null}}let l=(0,r.randomUUID)(),c=await n.runQuestionBatch.create({data:{id:l,runId:e,attemptId:t,nativeRequestId:i,eventSequence:Number.isInteger(s)&&(s??-1)>=-1?s:null,questions:{create:o.map((A,e)=>({id:`${l}:${e}:${A.id||"question"}`,position:e,header:D(A.header,200),prompt:B(A.prompt,"Question",1e4),multiSelect:!!A.multiSelect,allowCustom:!1!==A.allowCustom,fieldJson:A.field?JSON.stringify(d(A.field)):null,options:{create:(A.options??[]).map((A,e)=>({id:(0,r.randomUUID)(),position:e,label:B(A.label,"Option label",500),description:D(A.description,2e3)}))}}))}},include:{questions:{include:{options:!0}}}});return await n.agentRun.update({where:{id:e},data:{phase:"WAITING_FOR_ANSWER"}}),{batch:c,notification:this.notifications?await this.notifications.recordInTransaction(n,{dedupeKey:`run:${e}:question:${l}`,typeKey:"RUN_NEEDS_ANSWER",title:`${"PLAN"===a.kind?"Plan":"Session"} #${a.displayNumber} needs an answer`,body:o[0].prompt.slice(0,1e3),href:S(a),resourceKind:a.kind,resourceId:a.id,worktreeId:a.worktreeId,highlightColor:a.worktree?.highlightColor}):null}});return this.notifications?.created(c.notification),N(e),a._H.publish((0,a.hn)(e),{runQuestionChanged:{id:c.batch.id,runId:e}}),c.batch}async reportUsage(A,e,t,i){let a=await (0,n.U)(),s=await a.agentRun.findUnique({where:{id:e}});if(!s||s.agentId!==A)throw Error("Run not found for this agent");let o=A=>Number.isFinite(A)&&(A??0)>=0?Math.floor(A):0;return await a.$transaction(async A=>{let n=await A.runModelUsage.findFirst({where:{runId:e,attemptId:t,model:i.model}}),a={inputTokens:o(i.inputTokens),outputTokens:o(i.outputTokens),reasoningTokens:o(i.reasoningTokens),cacheReadTokens:o(i.cacheReadTokens),cacheWriteTokens:o(i.cacheWriteTokens),estimatedCost:i.estimatedCost??null};n?await A.runModelUsage.update({where:{id:n.id},data:a}):await A.runModelUsage.create({data:{id:(0,r.randomUUID)(),runId:e,attemptId:t,model:i.model,...a}});let s=await A.runModelUsage.aggregate({where:{runId:e},_sum:{inputTokens:!0,outputTokens:!0,reasoningTokens:!0,cacheReadTokens:!0,cacheWriteTokens:!0,estimatedCost:!0}}),l=await A.runModelUsage.findMany({where:{runId:e,estimatedCost:{not:null}},select:{model:!0,estimatedCost:!0}}),c=l.find(({model:A})=>"estimated-total"===A)?.estimatedCost,d=await A.runToolCall.count({where:{runId:e}});await A.agentRun.update({where:{id:e},data:{inputTokens:s._sum.inputTokens??0,outputTokens:s._sum.outputTokens??0,reasoningTokens:s._sum.reasoningTokens??0,cacheReadTokens:s._sum.cacheReadTokens??0,cacheWriteTokens:s._sum.cacheWriteTokens??0,toolCallCount:Math.max(d,o(i.toolCallCount)),estimatedCost:c??(l.length?l.reduce((A,e)=>A+(e.estimatedCost??0),0):null),pricingSource:D(i.pricingSource,200),pricingUpdatedAt:new Date}})}),N(e),this.get(e)}async finishAttempt(A,e,t){let r=t.status.toUpperCase();if(!["PAUSED","COMPLETED","CANCELLED","FAILED"].includes(r))throw Error("Run completion status is invalid");let i=await (0,n.U)(),a=await i.$transaction(async i=>{let n=await i.runAttempt.findUnique({where:{id:e},include:{run:{include:{worktree:!0}}}});if(!n||n.run.agentId!==A)throw Error("Attempt not found");let a=f.has(n.run.status)?n.run.status:r;await i.runAttempt.update({where:{id:e},data:{status:a,finishedAt:new Date}}),await i.runQuestionBatch.updateMany({where:{runId:n.runId,status:"PENDING"},data:{status:"SUPERSEDED",supersededAt:new Date}});let s=f.has(n.run.status)?n.run:await i.agentRun.update({where:{id:n.runId},data:{status:r,phase:t.phase?.trim().toUpperCase()||r,finalOutput:D(t.finalOutput,2e6),error:D(t.error,2e4),finishedAt:"PAUSED"===r?null:new Date}});f.has(a)&&await i.worktreeRunLease.deleteMany({where:{runId:s.id,purpose:{not:w}}});let o="COMPLETED"===a?"RUN_COMPLETED":"FAILED"===a?"RUN_FAILED":"CANCELLED"===a?"RUN_CANCELLED":"RECOVERY_PAUSED"===t.phase?"RUN_RECOVERY_PAUSED":null,l=o&&this.notifications?await this.notifications.recordInTransaction(i,{dedupeKey:`run:${s.id}:status:${a}:${n.generation}`,typeKey:o,title:`${"PLAN"===s.kind?"Plan":"Session"} #${s.displayNumber} ${a.toLowerCase()}`,body:t.error||t.finalOutput?.slice(0,1e3)||`The ${s.kind.toLowerCase()} is ${a.toLowerCase()}.`,href:S(s),resourceKind:s.kind,resourceId:s.id,worktreeId:s.worktreeId,highlightColor:n.run.worktree?.highlightColor}):null;return{run:s,notification:l}});return this.notifications?.created(a.notification),N(a.run.id),f.has(a.run.status)&&a.run.worktreeId&&("PLAN"===a.run.kind||"SESSION"===a.run.kind)&&await this.promoteQueuedLaneSafely(a.run.worktreeId,a.run.kind),this.get(a.run.id)}async reportCheckpoint(A,e,t,i){let a=await (0,n.U)(),s=await a.agentRun.findUnique({where:{id:e}});if(!s||s.agentId!==A)throw Error("Run not found for this agent");if(i.questionBatchId){let A=await a.runQuestionBatch.findUnique({where:{id:i.questionBatchId}});if(!A||A.runId!==e)throw Error("Question batch not found")}let o=await a.runCheckpoint.create({data:{id:(0,r.randomUUID)(),runId:e,attemptId:t,questionBatchId:i.questionBatchId??null,kind:B(i.kind,"Checkpoint kind",100).toUpperCase(),headSha:D(i.headSha,100),branch:D(i.branch,500),upstreamSha:D(i.upstreamSha,100),indexTree:D(i.indexTree,100),worktreeTree:D(i.worktreeTree,100),refName:D(i.refName,1e3),manifestJson:D(i.manifestJson,2e6),diffSummary:D(i.diffSummary,5e5),diffPatch:D(i.diffPatch,2e6),stashRef:D(i.stashRef,1e3)}});return N(e),o}async reportAnswerRevisionPreview(A,e,t,r){let i=await (0,n.U)(),s=await i.runQuestionBatch.findUnique({where:{id:e},include:{run:!0}});if(!s?.runId||!s.run||s.run.agentId!==A||"MANAGED"!==s.run.origin)throw Error("Question batch not found for this agent");let o=await i.runQuestionBatch.update({where:{id:e},data:{revisionPreparedAt:new Date,rollbackPatch:t.slice(0,2e6),pushedCommitWarning:D(r,2e4)},include:{questions:{orderBy:{position:"asc"},include:{options:{orderBy:{position:"asc"}}}},answerRevisions:{orderBy:{revision:"asc"}}}});return N(s.runId),a._H.publish((0,a.hn)(s.runId),{runQuestionChanged:{id:e,runId:s.runId}}),o}async applyAnswerRevision(A,e,t,r){let i=await (0,n.U)(),a=await i.$transaction(async i=>{let n=await i.runQuestionBatch.findUnique({where:{id:e},include:{run:!0,attempt:!0}}),a=await i.runAttempt.findUnique({where:{id:r},include:{run:!0}}),s=await i.runAnswerRevision.findUnique({where:{id:t}});if(!n?.runId||!n.run||n.run.agentId!==A||!n.attempt||!a||a.run.parentRunId!==n.runId||"ANSWER_REVISION"!==a.run.followUpMode||!s||s.batchId!==e)throw Error("Answer revision cannot be applied");let o=new Date,l=(await i.runAttempt.findMany({where:{runId:n.runId,generation:{gte:n.attempt.generation}},select:{id:!0}})).map(({id:A})=>A);await i.runAttempt.updateMany({where:{id:{in:l}},data:{status:"SUPERSEDED",supersededAt:o,finishedAt:o}}),await i.runEvent.updateMany({where:{runId:n.runId,sequence:{gt:n.eventSequence??-1},supersededAt:null},data:{supersededAt:o}}),await i.runToolCall.updateMany({where:{attemptId:{in:l},supersededAt:null},data:{supersededAt:o}}),await i.runModelUsage.updateMany({where:{attemptId:{in:l}},data:{superseded:!0}});let c=(await i.runQuestionBatch.findMany({where:{runId:n.runId,createdAt:{gt:n.createdAt}},select:{id:!0}})).map(({id:A})=>A);return await i.runQuestionBatch.updateMany({where:{id:{in:c}},data:{status:"SUPERSEDED",supersededAt:o}}),await i.runAnswerRevision.updateMany({where:{OR:[{batchId:{in:c}},{batchId:e,id:{not:t}}],supersededAt:null},data:{supersededAt:o}}),await i.runAnswerRevision.update({where:{id:t},data:{replacementAttemptId:r}}),await i.agentRun.update({where:{id:n.runId},data:{status:"CANCELLED",phase:"SUPERSEDED_BY_ANSWER_REVISION",finishedAt:o}}),await i.agentRun.update({where:{id:a.runId},data:{status:"IN_PROGRESS",phase:"RUNNING"}}),{sourceRunId:n.runId,replacementRunId:a.runId}});return N(a.sourceRunId),N(a.replacementRunId),this.get(a.replacementRunId)}async importHistory(A,e,t){let i=await (0,n.U)();await i.$transaction(async i=>{if(t.events){let r=t.events.map((r,i)=>({id:`${e}:import:${r.id}`,runId:A,attemptId:e,sequence:i,type:B(r.type,"Event type",100).toUpperCase(),summary:B(r.summary,"Event summary",2e3),searchText:(r.searchText??JSON.stringify(r.raw??r.summary)).slice(0,1e5),detailMarkdown:r.detailMarkdown?.slice(0,5e5)??null,rawJson:void 0===r.raw?null:JSON.stringify(r.raw),createdAt:M(r.createdAt)??M(t.createdAt)??new Date}));await i.runToolCall.deleteMany({where:{runId:A,attemptId:e}}),await i.runEvent.deleteMany({where:{runId:A,attemptId:e}});for(let A=0;A<r.length;A+=500)await i.runEvent.createMany({data:r.slice(A,A+500)});let n=new Map;for(let A of r){let e=A.rawJson?JSON.parse(A.rawJson):{};if("user"===e.type&&Array.isArray(e.message?.content))for(let t of e.message.content)"tool_result"===t.type&&"string"==typeof t.tool_use_id&&n.set(t.tool_use_id,{content:t.content??e.tool_use_result??null,isError:!0===t.is_error,createdAt:A.createdAt})}let a=r.flatMap(t=>{let r=t.rawJson?JSON.parse(t.rawJson):{},i="assistant"===r.type&&Array.isArray(r.message?.content)?r.message.content.find(A=>"tool_use"===A.type):void 0;if(i){let r=n.get(String(i.id));return[{id:`event:${t.id}`,runId:A,attemptId:e,sequence:t.sequence,name:String(i.name??"Tool"),status:r?r.isError?"FAILED":"COMPLETED":"OBSERVED",inputJson:t.rawJson,outputJson:JSON.stringify(r?.content??null),error:r?.isError?"string"==typeof r.content?r.content:JSON.stringify(r.content):null,startedAt:t.createdAt,finishedAt:r?.createdAt??null}]}let a=r.params?.item,s=r.properties?.part,o=a&&["commandExecution","fileChange","mcpToolCall","dynamicToolCall","webSearch"].includes(a.type),l="message.part.updated"===r.type&&s?.type==="tool";if(!o&&!l)return[];let c=l?s.state??{}:a,d=String(c.status??"COMPLETED").toUpperCase(),u=l&&"number"==typeof c.time?.start?new Date(c.time.start):t.createdAt,g=l?"number"==typeof c.time?.end?new Date(c.time.end):null:["INPROGRESS","IN_PROGRESS","RUNNING","PENDING"].includes(d)?null:t.createdAt;return[{id:`event:${t.id}`,runId:A,attemptId:e,sequence:t.sequence,name:l?s.tool??s.name??"tool":a.tool??a.command??a.type,status:"ERROR"===d?"FAILED":"INPROGRESS"===d?"IN_PROGRESS":d,inputJson:t.rawJson,outputJson:JSON.stringify(l?c.result??c.output??null:a.result??a.aggregatedOutput??null),error:c.error?"string"==typeof c.error?c.error:JSON.stringify(c.error):null,startedAt:u,finishedAt:g}]});for(let A=0;A<a.length;A+=500)await i.runToolCall.createMany({data:a.slice(A,A+500)});await i.agentRun.update({where:{id:A},data:{toolCallCount:await i.runToolCall.count({where:{runId:A}})}})}if(t.usage){for(let n of(await i.runModelUsage.deleteMany({where:{runId:A,attemptId:e}}),t.usage)){let t=A=>Number.isFinite(A)&&(A??0)>=0?Math.floor(A):0;await i.runModelUsage.create({data:{id:(0,r.randomUUID)(),runId:A,attemptId:e,model:B(n.model,"Model",500),inputTokens:t(n.inputTokens),outputTokens:t(n.outputTokens),reasoningTokens:t(n.reasoningTokens),cacheReadTokens:t(n.cacheReadTokens),cacheWriteTokens:t(n.cacheWriteTokens),estimatedCost:n.estimatedCost??null}})}let n=await i.runModelUsage.aggregate({where:{runId:A},_sum:{inputTokens:!0,outputTokens:!0,reasoningTokens:!0,cacheReadTokens:!0,cacheWriteTokens:!0,estimatedCost:!0}});await i.agentRun.update({where:{id:A},data:{inputTokens:n._sum.inputTokens??0,outputTokens:n._sum.outputTokens??0,reasoningTokens:n._sum.reasoningTokens??0,cacheReadTokens:n._sum.cacheReadTokens??0,cacheWriteTokens:n._sum.cacheWriteTokens??0,estimatedCost:t.estimatedCost??(t.usage.length&&t.usage.every(A=>null!=A.estimatedCost)?n._sum.estimatedCost??null:null),pricingSource:D(t.pricingSource??[...new Set(t.usage.map(A=>A.pricingSource).filter(Boolean))].join(", "),200),pricingUpdatedAt:new Date}})}else void 0!==t.estimatedCost&&await i.agentRun.update({where:{id:A},data:{estimatedCost:t.estimatedCost,pricingSource:D(t.pricingSource,200),pricingUpdatedAt:new Date}})})}async importRuns(A,e,t){let i=y(m,e,"Provider"),a=await (0,n.U)(),s=0;for(let e of t){let t=e.prompt?.trim()||void 0,n=`${A}:${i}:${B(e.nativeId,"Native ID",500)}`,o=e.events||e.usage||void 0!==e.estimatedCost?(0,r.createHash)("sha256").update(JSON.stringify([e.events,e.usage,e.estimatedCost,e.pricingSource])).digest("hex"):void 0,l=e.rawMetadata&&"object"==typeof e.rawMetadata?e.rawMetadata:{},c=JSON.stringify({...l,...o?{importedHistoryDigest:o}:{}}),d=(()=>{let A=e.status?.toUpperCase()??"COMPLETED";return["ACTIVE","RUNNING","STARTING","IN_PROGRESS","WAITING_FOR_ANSWER"].includes(A)?"IN_PROGRESS":"PAUSED"===A?"PAUSED":"CANCELLED"===A||"CANCELED"===A?"CANCELLED":["FAILED","ERROR","SYSTEMERROR"].includes(A)?"FAILED":"COMPLETED"})(),u=await a.runAttempt.findUnique({where:{nativeKey:n},include:{run:!0}});if(u){if("IMPORTED"===u.run.origin){let A=JSON.parse(u.rawMetadataJson??"{}"),r="SESSION"===u.run.kind&&"IN_PROGRESS"===d?await a.worktreeRunLease.findFirst({where:{worktreeId:u.run.worktreeId??"",run:{kind:"SESSION",origin:"MANAGED",status:{in:["IN_PROGRESS","PAUSED"]}}}}):null;await a.$transaction([a.runAttempt.update({where:{id:u.id},data:{rawMetadataJson:o?JSON.stringify(l):c}}),a.agentRun.update({where:{id:u.runId},data:{status:d,phase:r?"IMPORTED_ACTIVE_COLLISION":"IMPORTED_SYNCED",...t?{initialPrompt:t,inputs:{updateMany:{where:{kind:"INITIAL",sequence:0},data:{prompt:t}}}}:{},model:e.model||u.run.model,effort:void 0===e.effort?u.run.effort:D(e.effort,100),finalOutput:void 0===e.finalOutput?u.run.finalOutput:D(e.finalOutput,2e6),branch:e.branch??u.run.branch,jiraIssueKey:k(e.jiraIssueKey),nativeArchivedAt:e.archived?new Date:null,startedAt:M(e.createdAt)??u.run.startedAt,finishedAt:"IN_PROGRESS"===d?null:M(e.updatedAt)??u.run.finishedAt}})]),o&&A.importedHistoryDigest!==o&&await this.importHistory(u.runId,u.id,e),o&&await a.runAttempt.update({where:{id:u.id},data:{rawMetadataJson:c}}),N(u.runId)}continue}let g=await a.worktree.findUnique({where:{id:e.worktreeId},include:{codebase:{include:{repository:!0}}}});if(!g||g.codebase.agentId!==A)continue;let h=e.kind?.toUpperCase()==="PLAN"?"PLAN":"SESSION",p="SESSION"===h&&"IN_PROGRESS"===d?await a.worktreeRunLease.findFirst({where:{worktreeId:g.id,run:{kind:"SESSION",origin:"MANAGED",status:{in:["IN_PROGRESS","PAUSED"]}}}}):null,I=await a.$transaction(A=>R(A,h)),C=(0,r.randomUUID)(),E=(0,r.randomUUID)();await a.agentRun.create({data:{id:C,kind:h,displayNumber:I,status:d,phase:p?"IMPORTED_ACTIVE_COLLISION":"IMPORTED_SYNCED",origin:"IMPORTED",provider:i,worktreeId:g.id,repositoryId:g.codebase.repository.id,agentId:A,jiraIssueKey:k(e.jiraIssueKey),repositoryName:g.codebase.repository.name,branch:e.branch??g.branch,model:e.model||"unknown",effort:D(e.effort,100),worktreeConcurrencyLimit:b(h,void 0),initialPrompt:t??"Imported provider history",finalOutput:D(e.finalOutput,2e6),archivedAt:e.archived?new Date:null,nativeArchivedAt:e.archived?new Date:null,startedAt:M(e.createdAt),finishedAt:M(e.updatedAt),createdAt:M(e.createdAt),attempts:{create:{id:E,generation:0,nativeId:e.nativeId,nativeKey:n,status:"IMPORTED",rawMetadataJson:JSON.stringify(l)}},inputs:{create:{id:(0,r.randomUUID)(),sequence:0,kind:"INITIAL",prompt:t??"Imported provider history"}}}}),o&&(await this.importHistory(C,E,e),await a.runAttempt.update({where:{id:E},data:{rawMetadataJson:c}})),N(C),s+=1}return await a.runProviderSync.upsert({where:{agentId_provider:{agentId:A,provider:i}},create:{id:(0,r.randomUUID)(),agentId:A,provider:i,status:"IDLE",lastCompletedAt:new Date,importedCount:s},update:{status:"IDLE",lastCompletedAt:new Date,lastError:null,importedCount:{increment:s}}}),s}async providerCatalog(A={}){let e=await (0,n.U)(),t=!!(A.runId||A.worktreeId),r=A.worktreeId??(A.runId?(await e.agentRun.findUnique({where:{id:A.runId},select:{worktreeId:!0}}))?.worktreeId:null),i=A.runId?(await e.agentRun.findUnique({where:{id:A.runId},select:{agentId:!0}}))?.agentId:A.worktreeId?(await e.worktree.findUnique({where:{id:A.worktreeId},select:{codebase:{select:{agentId:!0}}}}))?.codebase.agentId:null,[a,o]=t&&!i?[[],[]]:await Promise.all([e.agent.findMany({where:i?{id:i}:void 0,select:{id:!0,capabilitiesJson:!0,lastSeenAt:!0,disconnectedAt:!0,heartbeatIntervalSeconds:!0}}),e.runProviderSync.findMany({where:i?{agentId:i}:void 0,orderBy:{updatedAt:"desc"}})]);return m.map(A=>{let e=`runs.provider.${A.toLowerCase()}`,t=a.some(t=>{let r=o.find(e=>e.agentId===t.id&&e.provider===A);return!t.disconnectedAt&&!!t.lastSeenAt&&Date.now()-t.lastSeenAt.getTime()<=(0,s.z)(t)&&JSON.parse(t.capabilitiesJson).includes(e)&&r?.status!=="FAILED"}),i=o.find(({provider:e})=>e===A)?.catalogJson,n=i?JSON.parse(i):null,l=r&&n?.worktrees?n.worktrees[r]?.models??[]:n?.models;return{key:A,label:"OPENCODE"===A?"OpenCode":"CLAUDE"===A?"Claude":"Codex",available:t,models:l?.length?l:[{id:"default",label:"Provider default",efforts:["auto","low","medium","high"]}],supportsWebSearch:n?.capabilities?.webSearch??!0,supportsQuestions:n?.capabilities?.questions??!0,supportsImport:n?.capabilities?.import??!0,supportsPause:n?.capabilities?.pause??!0,supportsSteering:n?.capabilities?.steering??!0,supportsResume:n?.capabilities?.resume??!0,supportsNativeDelete:n?.capabilities?.nativeDelete??!0}})}async providerImportStatus(){return(await (0,n.U)()).runProviderSync.findMany({orderBy:[{agentId:"asc"},{provider:"asc"}]})}async reportProviderImportStatus(A,e,t,i,a){let s=y(m,e,"Provider"),o=t.trim().toUpperCase();if(!["SYNCING","IDLE","FAILED"].includes(o))throw Error("Import status is invalid");return(await (0,n.U)()).runProviderSync.upsert({where:{agentId_provider:{agentId:A,provider:s}},create:{id:(0,r.randomUUID)(),agentId:A,provider:s,status:o,lastStartedAt:"SYNCING"===o?new Date:void 0,lastCompletedAt:"IDLE"===o?new Date:void 0,lastError:D(i,2e4),catalogJson:void 0===a?void 0:JSON.stringify(a)},update:{status:o,lastStartedAt:"SYNCING"===o?new Date:void 0,lastCompletedAt:"IDLE"===o?new Date:void 0,lastError:"FAILED"===o?D(i,2e4):null,catalogJson:void 0===a?void 0:JSON.stringify(a)}})}subscribeRunList(A){let r=a._H.iterate(a.hu);return(0,t.G)(r,async t=>{if("drafts"===t.runChanged.id)return!1;if(!A.kind&&!A.appId&&!A.provider&&!A.origin&&!A.worktreeId&&!A.workflowId)return!0;let r=await (0,n.U)(),i=await r.agentRun.findUnique({where:{id:t.runChanged.id},select:{worktreeId:!0,workflowRun:{select:{workflowId:!0}},kind:!0,provider:!0,origin:!0,repositoryId:!0}});return!i||(!A.workflowId||i.workflowRun?.workflowId===A.workflowId||!!await (0,e.f)(A.workflowId,i.worktreeId))&&(!A.worktreeId||i.worktreeId===A.worktreeId)&&(!A.kind||i.kind===A.kind)&&(!A.provider||i.provider===A.provider.trim().toUpperCase())&&(!A.origin||i.origin===A.origin)&&(!A.appId||!!i.repositoryId&&!!await r.appRepository.findFirst({where:{appId:A.appId,repositoryId:i.repositoryId},select:{appId:!0}}))})}subscribeRuns(){return a._H.iterate(a.hu)}subscribeRun(A){return a._H.iterate((0,a.k_)(A))}subscribeEvents(A){return a._H.iterate((0,a.zP)(A))}subscribeQuestions(A){return a._H.iterate((0,a.hn)(A))}async requireWorktree(A,e){let t=await (0,n.U)(),r=await t.worktree.findUnique({where:{id:B(A,"Worktree",500)},include:{codebase:{include:{repository:!0,agent:!0}}}});if(!r||"AVAILABLE"!==r.availability)throw Error("Worktree is unavailable");if(e){let A=r.codebase.agent,i=JSON.parse(A.capabilitiesJson);if(A.disconnectedAt||!A.lastSeenAt||Date.now()-A.lastSeenAt.getTime()>(0,s.z)(A)||!i.includes(`runs.provider.${e.toLowerCase()}`))throw Error(`${e} is unavailable on this worktree's agent`);let n=await t.runProviderSync.findUnique({where:{agentId_provider:{agentId:r.codebase.agentId,provider:e}}});if(n?.status==="FAILED")throw Error(`${e} is unavailable: ${n.lastError??"provider capability check failed"}`)}return r}async requireAttachments(A,e){if(!A.length)return;if(A.length>100)throw Error("Too many attachments");let t=await (0,n.U)(),r=await t.runAttachment.findMany({where:{id:{in:A},inputId:null,...e?{OR:[{draftId:e},{draftId:null}]}:{draftId:null}}});if(r.length!==A.length)throw Error("One or more attachments are unavailable");if(r.reduce((A,e)=>A+e.size,0)>0x6400000)throw Error("Attachments exceed the 100 MB input limit")}}],310509)},292988,A=>{var e=A.i(879838),t=A.i(945565);function r(A){return A&&"object"==typeof A&&"message"in A&&"string"==typeof A.message?A.message:String(A)}function i(A,e,t,i){A.newFunction(t,t=>{let n=t?JSON.parse(A.getString(t)):null,a=A.newPromise();return e.add(a),Promise.resolve().then(()=>i(n)).then(A=>({ok:!0,value:A}),A=>({ok:!1,error:r(A)})).then(t=>{a.alive&&A.alive&&(A.newString(JSON.stringify(t)).consume(A=>a.resolve(A)),e.delete(a),a.dispose(),A.runtime.executePendingJobs().dispose())}).catch(()=>{}),a.handle}).consume(e=>A.setProp(A.global,t,e))}async function n(A){if(!A.body)return"";let e=A.body.getReader(),t=[],r=0;for(;;){let{done:A,value:i}=await e.read();if(A)break;if((r+=i.byteLength)>0xa00000)throw await e.cancel(),Error("Script fetch response exceeded 10 MiB");t.push(i)}let i=new Uint8Array(r),n=0;for(let A of t)i.set(A,n),n+=A.byteLength;return new TextDecoder().decode(i)}let a=String.raw`
|
|
1446
|
+
${JSON.stringify(e,null,2)}`].filter(Boolean).join("\n\n").slice(0,2e6),p=await R(n,"SESSION"),I=(0,r.randomUUID)(),C=(0,r.randomUUID)(),E=new Date,m=await n.agentRun.create({data:{id:I,kind:"SESSION",displayNumber:p,status:o?"IN_PROGRESS":"QUEUED",phase:o?"ANSWER_REVISION_QUEUED":"WAITING_FOR_WORKTREE",provider:a.run.provider,worktreeId:a.run.worktreeId,repositoryId:a.run.repositoryId,agentId:a.run.agentId,jiraIssueKey:a.run.jiraIssueKey,repositoryName:a.run.repositoryName,branch:a.run.branch,model:a.run.model,effort:a.run.effort,webSearchEnabled:a.run.webSearchEnabled,worktreeConcurrencyLimit:"SESSION"===a.run.kind?a.run.worktreeConcurrencyLimit:b("SESSION",void 0),initialPrompt:h,parentRunId:a.runId,parentRunNumber:a.run.displayNumber,followUpMode:"ANSWER_REVISION",inputs:{create:{id:C,sequence:0,kind:"ANSWER_REVISION",prompt:h}}}});o&&await n.worktreeRunLease.update({where:{runId:a.runId},data:{runId:I,purpose:"RUN",reservationKey:null,acquiredAt:new Date}}),await n.agentRun.update({where:{id:a.runId},data:{status:"CANCELLED",phase:"SUPERSEDED_BY_ANSWER_REVISION",finishedAt:E}});let f=await T(n,{runId:I,agentId:a.run.agentId,type:"REVISE_ANSWER",payload:{batchId:A,revisionId:l,inputId:C,stash:!!t,rollback:i,checkpoint:a.checkpoint}});return{batch:a,run:m,command:f,sourceRunId:a.runId,sourceAgentId:a.run.agentId,transfersSlot:o}});return N(s.sourceRunId),N(s.run.id),s.transfersSlot&&H(s.command,s.sourceAgentId),await this.promoteQueuedLaneSafely(s.run.worktreeId,"SESSION"),this.get(s.run.id)}async pendingCommands(A){return await this.reconcileQueuedRuns(A),(await (0,n.U)()).runCommand.findMany({where:{agentId:A,OR:[{status:"RUNNING"},{status:"QUEUED",run:{status:{not:"QUEUED"}}}]},orderBy:[{createdAt:"asc"},{sequence:"asc"}],take:200,include:x})}async claimCommand(A,e){let t=await (0,n.U)(),r=await t.runCommand.findUnique({where:{id:e},select:{agentId:!0,status:!0,type:!0,run:{select:{worktreeId:!0,status:!0}}}});if(!r||r.agentId!==A)throw Error("Run command not found");if("QUEUED"===r.status&&"QUEUED"===r.run.status&&new Set(["START","PLAY_PLAN","CONTINUE","REVISE_ANSWER"]).has(r.type))throw Error("Run command is waiting for the worktree");"QUEUED"===r.status&&r.run.worktreeId&&await this.diskSpace?.assertWorktreeCanStart(r.run.worktreeId),await t.runCommand.updateMany({where:{id:e,agentId:A,status:"QUEUED"},data:{status:"RUNNING",claimedAt:new Date}});let i=await t.runCommand.findUnique({where:{id:e},include:x});if(!i||i.agentId!==A)throw Error("Run command not found");if("RUNNING"!==i.status)throw Error("Run command cannot be claimed");return i}async completeCommand(A,e,t,r){let i=await (0,n.U)(),a=await i.runCommand.findUnique({where:{id:e},include:{run:{select:{worktreeId:!0,kind:!0}}}});if(!a||a.agentId!==A)throw Error("Run command not found");let s=await i.runCommand.update({where:{id:e},data:{status:"SUCCEEDED"===t?"SUCCEEDED":"FAILED",error:D(r,2e4),finishedAt:new Date}});if("DELETE_NATIVE"===s.type&&"SUCCEEDED"===s.status){let A=await i.agentRun.findUnique({where:{id:s.runId},include:{inputs:{include:{attachments:!0}}}});if(A){let e=A.inputs.flatMap(A=>A.attachments.map(({storagePath:A})=>A));await i.agentRun.delete({where:{id:A.id}}),await C(e)}}else if("FAILED"===s.status){"PREPARE_ANSWER_REVISION"===s.type&&await i.worktreeRunLease.deleteMany({where:{runId:s.runId,purpose:w}});let A="ANSWER"===s.type&&await i.runQuestionBatch.count({where:{runId:s.runId,status:"PENDING"}});await i.agentRun.updateMany({where:{id:s.runId,status:{notIn:[...f]}},data:{error:s.error,phase:A?"WAITING_FOR_ANSWER":`${s.type}_FAILED`,...["START","PLAY_PLAN","CONTINUE"].includes(s.type)?{status:"FAILED",finishedAt:new Date}:{},...["PREPARE_ANSWER_REVISION","REVISE_ANSWER"].includes(s.type)?{status:"PAUSED",finishedAt:null}:{}}}),["START","PLAY_PLAN","CONTINUE"].includes(s.type)&&await i.worktreeRunLease.deleteMany({where:{runId:s.runId}})}else if(["PAUSE","CANCEL"].includes(s.type)){let A="CANCEL"===s.type;await i.agentRun.updateMany({where:{id:s.runId,status:{notIn:[...f]}},data:{status:A?"CANCELLED":"PAUSED",phase:A?"CANCELLED":"PAUSED",finishedAt:A?new Date:null}}),A&&await i.worktreeRunLease.deleteMany({where:{runId:s.runId}})}return N(s.runId),a.run.worktreeId&&("PLAN"===a.run.kind||"SESSION"===a.run.kind)&&await this.promoteQueuedLaneSafely(a.run.worktreeId,a.run.kind),s}async beginAttempt(A,e,t){let i=await (0,n.U)(),a=await i.agentRun.findUnique({where:{id:e},include:{attempts:!0}});if(!a||a.agentId!==A)throw Error("Run not found for this agent");if("QUEUED"===a.status)throw Error("Run is waiting for the worktree");if(f.has(a.status))throw Error("Run is already finished");let s=a.attempts.length,o=await i.runAttempt.create({data:{id:(0,r.randomUUID)(),runId:e,generation:s,nativeId:t||null,nativeKey:t?`${A}:${a.provider}:${t}`:null,status:"RUNNING"}});return await i.agentRun.update({where:{id:e},data:{phase:"RUNNING",startedAt:a.startedAt??new Date}}),N(e),o}async updateAttemptNativeId(A,e,t,r){let i=await (0,n.U)(),a=await i.$transaction(async i=>{let n=await i.runAttempt.findUnique({where:{id:e},include:{run:!0}});if(!n||n.run.agentId!==A)throw Error("Attempt not found");let a=`${A}:${n.run.provider}:${t}`,s=await i.runAttempt.findUnique({where:{nativeKey:a}});if(s&&s.id!==e){if(s.runId!==n.runId)throw Error("Native provider session belongs to another run");await i.runAttempt.update({where:{id:s.id},data:{nativeKey:null}})}let o=await i.runAttempt.update({where:{id:e},data:{nativeId:t,nativeKey:a}});return r&&await i.agentRun.update({where:{id:n.runId},data:{providerVersion:r}}),o});return N(a.runId),a}async appendEvents(A,e,t,r){let i=await (0,n.U)(),s=await i.agentRun.findUnique({where:{id:e}});if(!s||s.agentId!==A)throw Error("Run not found for this agent");let o=r.slice(0,500).map(A=>{let r=B(A.summary,"Event summary",2e3);return{id:A.id,runId:e,attemptId:t,sequence:A.sequence,type:B(A.type,"Event type",100).toUpperCase(),summary:r,searchText:D(A.searchText,1e5)??r,detailMarkdown:D(A.detailMarkdown,5e5),rawJson:void 0===A.raw?null:JSON.stringify(A.raw),createdAt:M(A.createdAt)}});if(!o.length)return[];let l=await i.$transaction(async A=>{let r=new Set((await A.runEvent.findMany({where:{id:{in:o.map(A=>A.id)}},select:{id:!0}})).map(({id:A})=>A)),i=o.filter(A=>!r.has(A.id));if(i.length){await A.runEvent.createMany({data:i});let r=i.filter(A=>A.type.includes("TOOL")&&!A.type.includes("QUESTION")).map(A=>({id:`event:${A.id}`,runId:e,attemptId:t,sequence:A.sequence,name:A.summary.split(/[\s:(]/,1)[0]||A.type,status:A.type.includes("FAIL")||A.type.includes("ERROR")?"FAILED":A.type.includes("COMPLETE")||A.type.includes("RESULT")?"COMPLETED":"OBSERVED",inputJson:A.rawJson,error:A.type.includes("FAIL")||A.type.includes("ERROR")?A.summary:null,finishedAt:A.createdAt}));r.length&&(await A.runToolCall.createMany({data:r}),await A.agentRun.update({where:{id:e},data:{toolCallCount:await A.runToolCall.count({where:{runId:e}})}}))}return A.runEvent.findMany({where:{id:{in:o.map(A=>A.id)}},orderBy:{sequence:"asc"}})});for(let A of l)a._H.publish((0,a.zP)(e),{runEventAdded:A});return N(e),l}async reportQuestion(A,e,t,i,s,o){if(!o.length||o.some(A=>!A.field)&&o.length>10||o.length>200)throw Error("Question batch is invalid");let l=await (0,n.U)(),c=await l.$transaction(async n=>{let a=await n.agentRun.findUnique({where:{id:e},include:{worktree:!0}});if(!a||a.agentId!==A)throw Error("Run not found for this agent");if(i){let A=await n.runQuestionBatch.findUnique({where:{runId_nativeRequestId:{runId:e,nativeRequestId:i}},include:{questions:{orderBy:{position:"asc"},include:{options:{orderBy:{position:"asc"}}}}}});if(A)return{batch:A,notification:null}}let l=(0,r.randomUUID)(),c=await n.runQuestionBatch.create({data:{id:l,runId:e,attemptId:t,nativeRequestId:i,eventSequence:Number.isInteger(s)&&(s??-1)>=-1?s:null,questions:{create:o.map((A,e)=>({id:`${l}:${e}:${A.id||"question"}`,position:e,header:D(A.header,200),prompt:B(A.prompt,"Question",1e4),multiSelect:!!A.multiSelect,allowCustom:!1!==A.allowCustom,fieldJson:A.field?JSON.stringify(d(A.field)):null,options:{create:(A.options??[]).map((A,e)=>({id:(0,r.randomUUID)(),position:e,label:B(A.label,"Option label",500),description:D(A.description,2e3)}))}}))}},include:{questions:{include:{options:!0}}}});return await n.agentRun.update({where:{id:e},data:{phase:"WAITING_FOR_ANSWER"}}),{batch:c,notification:this.notifications?await this.notifications.recordInTransaction(n,{dedupeKey:`run:${e}:question:${l}`,typeKey:"RUN_NEEDS_ANSWER",title:`${"PLAN"===a.kind?"Plan":"Session"} #${a.displayNumber} needs an answer`,body:o[0].prompt.slice(0,1e3),href:S(a),resourceKind:a.kind,resourceId:a.id,worktreeId:a.worktreeId,highlightColor:a.worktree?.highlightColor}):null}});return this.notifications?.created(c.notification),N(e),a._H.publish((0,a.hn)(e),{runQuestionChanged:{id:c.batch.id,runId:e}}),c.batch}async reportUsage(A,e,t,i){let a=await (0,n.U)(),s=await a.agentRun.findUnique({where:{id:e}});if(!s||s.agentId!==A)throw Error("Run not found for this agent");let o=A=>Number.isFinite(A)&&(A??0)>=0?Math.floor(A):0;return await a.$transaction(async A=>{let n=await A.runModelUsage.findFirst({where:{runId:e,attemptId:t,model:i.model}}),a={inputTokens:o(i.inputTokens),outputTokens:o(i.outputTokens),reasoningTokens:o(i.reasoningTokens),cacheReadTokens:o(i.cacheReadTokens),cacheWriteTokens:o(i.cacheWriteTokens),estimatedCost:i.estimatedCost??null};n?await A.runModelUsage.update({where:{id:n.id},data:a}):await A.runModelUsage.create({data:{id:(0,r.randomUUID)(),runId:e,attemptId:t,model:i.model,...a}});let s=await A.runModelUsage.aggregate({where:{runId:e},_sum:{inputTokens:!0,outputTokens:!0,reasoningTokens:!0,cacheReadTokens:!0,cacheWriteTokens:!0,estimatedCost:!0}}),l=await A.runModelUsage.findMany({where:{runId:e,estimatedCost:{not:null}},select:{model:!0,estimatedCost:!0}}),c=l.find(({model:A})=>"estimated-total"===A)?.estimatedCost,d=await A.runToolCall.count({where:{runId:e}});await A.agentRun.update({where:{id:e},data:{inputTokens:s._sum.inputTokens??0,outputTokens:s._sum.outputTokens??0,reasoningTokens:s._sum.reasoningTokens??0,cacheReadTokens:s._sum.cacheReadTokens??0,cacheWriteTokens:s._sum.cacheWriteTokens??0,toolCallCount:Math.max(d,o(i.toolCallCount)),estimatedCost:c??(l.length?l.reduce((A,e)=>A+(e.estimatedCost??0),0):null),pricingSource:D(i.pricingSource,200),pricingUpdatedAt:new Date}})}),N(e),this.get(e)}async finishAttempt(A,e,t){let r=t.status.toUpperCase();if(!["PAUSED","COMPLETED","CANCELLED","FAILED"].includes(r))throw Error("Run completion status is invalid");let i=await (0,n.U)(),a=await i.$transaction(async i=>{let n=await i.runAttempt.findUnique({where:{id:e},include:{run:{include:{worktree:!0}}}});if(!n||n.run.agentId!==A)throw Error("Attempt not found");let a=f.has(n.run.status)?n.run.status:r;await i.runAttempt.update({where:{id:e},data:{status:a,finishedAt:new Date}}),await i.runQuestionBatch.updateMany({where:{runId:n.runId,status:"PENDING"},data:{status:"SUPERSEDED",supersededAt:new Date}});let s=f.has(n.run.status)?n.run:await i.agentRun.update({where:{id:n.runId},data:{status:r,phase:t.phase?.trim().toUpperCase()||r,finalOutput:D(t.finalOutput,2e6),error:D(t.error,2e4),finishedAt:"PAUSED"===r?null:new Date}});f.has(a)&&await i.worktreeRunLease.deleteMany({where:{runId:s.id,purpose:{not:w}}});let o="COMPLETED"===a?"RUN_COMPLETED":"FAILED"===a?"RUN_FAILED":"CANCELLED"===a?"RUN_CANCELLED":"RECOVERY_PAUSED"===t.phase?"RUN_RECOVERY_PAUSED":null,l=o&&this.notifications?await this.notifications.recordInTransaction(i,{dedupeKey:`run:${s.id}:status:${a}:${n.generation}`,typeKey:o,title:`${"PLAN"===s.kind?"Plan":"Session"} #${s.displayNumber} ${a.toLowerCase()}`,body:t.error||t.finalOutput?.slice(0,1e3)||`The ${s.kind.toLowerCase()} is ${a.toLowerCase()}.`,href:S(s),resourceKind:s.kind,resourceId:s.id,worktreeId:s.worktreeId,highlightColor:n.run.worktree?.highlightColor}):null;return{run:s,notification:l}});return this.notifications?.created(a.notification),N(a.run.id),f.has(a.run.status)&&a.run.worktreeId&&("PLAN"===a.run.kind||"SESSION"===a.run.kind)&&await this.promoteQueuedLaneSafely(a.run.worktreeId,a.run.kind),this.get(a.run.id)}async reportCheckpoint(A,e,t,i){let a=await (0,n.U)(),s=await a.agentRun.findUnique({where:{id:e}});if(!s||s.agentId!==A)throw Error("Run not found for this agent");if(i.questionBatchId){let A=await a.runQuestionBatch.findUnique({where:{id:i.questionBatchId}});if(!A||A.runId!==e)throw Error("Question batch not found")}let o=await a.runCheckpoint.create({data:{id:(0,r.randomUUID)(),runId:e,attemptId:t,questionBatchId:i.questionBatchId??null,kind:B(i.kind,"Checkpoint kind",100).toUpperCase(),headSha:D(i.headSha,100),branch:D(i.branch,500),upstreamSha:D(i.upstreamSha,100),indexTree:D(i.indexTree,100),worktreeTree:D(i.worktreeTree,100),refName:D(i.refName,1e3),manifestJson:D(i.manifestJson,2e6),diffSummary:D(i.diffSummary,5e5),diffPatch:D(i.diffPatch,2e6),stashRef:D(i.stashRef,1e3)}});return N(e),o}async reportAnswerRevisionPreview(A,e,t,r){let i=await (0,n.U)(),s=await i.runQuestionBatch.findUnique({where:{id:e},include:{run:!0}});if(!s?.runId||!s.run||s.run.agentId!==A||"MANAGED"!==s.run.origin)throw Error("Question batch not found for this agent");let o=await i.runQuestionBatch.update({where:{id:e},data:{revisionPreparedAt:new Date,rollbackPatch:t.slice(0,2e6),pushedCommitWarning:D(r,2e4)},include:{questions:{orderBy:{position:"asc"},include:{options:{orderBy:{position:"asc"}}}},answerRevisions:{orderBy:{revision:"asc"}}}});return N(s.runId),a._H.publish((0,a.hn)(s.runId),{runQuestionChanged:{id:e,runId:s.runId}}),o}async applyAnswerRevision(A,e,t,r){let i=await (0,n.U)(),a=await i.$transaction(async i=>{let n=await i.runQuestionBatch.findUnique({where:{id:e},include:{run:!0,attempt:!0}}),a=await i.runAttempt.findUnique({where:{id:r},include:{run:!0}}),s=await i.runAnswerRevision.findUnique({where:{id:t}});if(!n?.runId||!n.run||n.run.agentId!==A||!n.attempt||!a||a.run.parentRunId!==n.runId||"ANSWER_REVISION"!==a.run.followUpMode||!s||s.batchId!==e)throw Error("Answer revision cannot be applied");let o=new Date,l=(await i.runAttempt.findMany({where:{runId:n.runId,generation:{gte:n.attempt.generation}},select:{id:!0}})).map(({id:A})=>A);await i.runAttempt.updateMany({where:{id:{in:l}},data:{status:"SUPERSEDED",supersededAt:o,finishedAt:o}}),await i.runEvent.updateMany({where:{runId:n.runId,sequence:{gt:n.eventSequence??-1},supersededAt:null},data:{supersededAt:o}}),await i.runToolCall.updateMany({where:{attemptId:{in:l},supersededAt:null},data:{supersededAt:o}}),await i.runModelUsage.updateMany({where:{attemptId:{in:l}},data:{superseded:!0}});let c=(await i.runQuestionBatch.findMany({where:{runId:n.runId,createdAt:{gt:n.createdAt}},select:{id:!0}})).map(({id:A})=>A);return await i.runQuestionBatch.updateMany({where:{id:{in:c}},data:{status:"SUPERSEDED",supersededAt:o}}),await i.runAnswerRevision.updateMany({where:{OR:[{batchId:{in:c}},{batchId:e,id:{not:t}}],supersededAt:null},data:{supersededAt:o}}),await i.runAnswerRevision.update({where:{id:t},data:{replacementAttemptId:r}}),await i.agentRun.update({where:{id:n.runId},data:{status:"CANCELLED",phase:"SUPERSEDED_BY_ANSWER_REVISION",finishedAt:o}}),await i.agentRun.update({where:{id:a.runId},data:{status:"IN_PROGRESS",phase:"RUNNING"}}),{sourceRunId:n.runId,replacementRunId:a.runId}});return N(a.sourceRunId),N(a.replacementRunId),this.get(a.replacementRunId)}async importHistory(A,e,t){let i=await (0,n.U)();await i.$transaction(async i=>{if(t.events){let r=t.events.map((r,i)=>({id:`${e}:import:${r.id}`,runId:A,attemptId:e,sequence:i,type:B(r.type,"Event type",100).toUpperCase(),summary:B(r.summary,"Event summary",2e3),searchText:(r.searchText??JSON.stringify(r.raw??r.summary)).slice(0,1e5),detailMarkdown:r.detailMarkdown?.slice(0,5e5)??null,rawJson:void 0===r.raw?null:JSON.stringify(r.raw),createdAt:M(r.createdAt)??M(t.createdAt)??new Date}));await i.runToolCall.deleteMany({where:{runId:A,attemptId:e}}),await i.runEvent.deleteMany({where:{runId:A,attemptId:e}});for(let A=0;A<r.length;A+=500)await i.runEvent.createMany({data:r.slice(A,A+500)});let n=new Map;for(let A of r){let e=A.rawJson?JSON.parse(A.rawJson):{};if("user"===e.type&&Array.isArray(e.message?.content))for(let t of e.message.content)"tool_result"===t.type&&"string"==typeof t.tool_use_id&&n.set(t.tool_use_id,{content:t.content??e.tool_use_result??null,isError:!0===t.is_error,createdAt:A.createdAt})}let a=r.flatMap(t=>{let r=t.rawJson?JSON.parse(t.rawJson):{},i="assistant"===r.type&&Array.isArray(r.message?.content)?r.message.content.find(A=>"tool_use"===A.type):void 0;if(i){let r=n.get(String(i.id));return[{id:`event:${t.id}`,runId:A,attemptId:e,sequence:t.sequence,name:String(i.name??"Tool"),status:r?r.isError?"FAILED":"COMPLETED":"OBSERVED",inputJson:t.rawJson,outputJson:JSON.stringify(r?.content??null),error:r?.isError?"string"==typeof r.content?r.content:JSON.stringify(r.content):null,startedAt:t.createdAt,finishedAt:r?.createdAt??null}]}let a=r.params?.item,s=r.properties?.part,o=a&&["commandExecution","fileChange","mcpToolCall","dynamicToolCall","webSearch"].includes(a.type),l="message.part.updated"===r.type&&s?.type==="tool";if(!o&&!l)return[];let c=l?s.state??{}:a,d=String(c.status??"COMPLETED").toUpperCase(),u=l&&"number"==typeof c.time?.start?new Date(c.time.start):t.createdAt,g=l?"number"==typeof c.time?.end?new Date(c.time.end):null:["INPROGRESS","IN_PROGRESS","RUNNING","PENDING"].includes(d)?null:t.createdAt;return[{id:`event:${t.id}`,runId:A,attemptId:e,sequence:t.sequence,name:l?s.tool??s.name??"tool":a.tool??a.command??a.type,status:"ERROR"===d?"FAILED":"INPROGRESS"===d?"IN_PROGRESS":d,inputJson:t.rawJson,outputJson:JSON.stringify(l?c.result??c.output??null:a.result??a.aggregatedOutput??null),error:c.error?"string"==typeof c.error?c.error:JSON.stringify(c.error):null,startedAt:u,finishedAt:g}]});for(let A=0;A<a.length;A+=500)await i.runToolCall.createMany({data:a.slice(A,A+500)});await i.agentRun.update({where:{id:A},data:{toolCallCount:await i.runToolCall.count({where:{runId:A}})}})}if(t.usage){for(let n of(await i.runModelUsage.deleteMany({where:{runId:A,attemptId:e}}),t.usage)){let t=A=>Number.isFinite(A)&&(A??0)>=0?Math.floor(A):0;await i.runModelUsage.create({data:{id:(0,r.randomUUID)(),runId:A,attemptId:e,model:B(n.model,"Model",500),inputTokens:t(n.inputTokens),outputTokens:t(n.outputTokens),reasoningTokens:t(n.reasoningTokens),cacheReadTokens:t(n.cacheReadTokens),cacheWriteTokens:t(n.cacheWriteTokens),estimatedCost:n.estimatedCost??null}})}let n=await i.runModelUsage.aggregate({where:{runId:A},_sum:{inputTokens:!0,outputTokens:!0,reasoningTokens:!0,cacheReadTokens:!0,cacheWriteTokens:!0,estimatedCost:!0}});await i.agentRun.update({where:{id:A},data:{inputTokens:n._sum.inputTokens??0,outputTokens:n._sum.outputTokens??0,reasoningTokens:n._sum.reasoningTokens??0,cacheReadTokens:n._sum.cacheReadTokens??0,cacheWriteTokens:n._sum.cacheWriteTokens??0,estimatedCost:t.estimatedCost??(t.usage.length&&t.usage.every(A=>null!=A.estimatedCost)?n._sum.estimatedCost??null:null),pricingSource:D(t.pricingSource??[...new Set(t.usage.map(A=>A.pricingSource).filter(Boolean))].join(", "),200),pricingUpdatedAt:new Date}})}else void 0!==t.estimatedCost&&await i.agentRun.update({where:{id:A},data:{estimatedCost:t.estimatedCost,pricingSource:D(t.pricingSource,200),pricingUpdatedAt:new Date}})})}async importRuns(A,e,t){let i=y(m,e,"Provider"),a=await (0,n.U)(),s=0;for(let e of t){let t=e.prompt?.trim()||void 0,n=`${A}:${i}:${B(e.nativeId,"Native ID",500)}`,o=e.events||e.usage||void 0!==e.estimatedCost?(0,r.createHash)("sha256").update(JSON.stringify([e.events,e.usage,e.estimatedCost,e.pricingSource])).digest("hex"):void 0,l=e.rawMetadata&&"object"==typeof e.rawMetadata?e.rawMetadata:{},c=(0,r.createHash)("sha256").update(JSON.stringify({...e,events:o,usage:void 0})).digest("hex"),d=JSON.stringify({...l,...o?{importedHistoryDigest:o}:{},importedSnapshotDigest:c}),u=(()=>{let A=e.status?.toUpperCase()??"COMPLETED";return["ACTIVE","RUNNING","STARTING","IN_PROGRESS","WAITING_FOR_ANSWER"].includes(A)?"IN_PROGRESS":"PAUSED"===A?"PAUSED":"CANCELLED"===A||"CANCELED"===A?"CANCELLED":["FAILED","ERROR","SYSTEMERROR"].includes(A)?"FAILED":"COMPLETED"})(),g=await a.runAttempt.findUnique({where:{nativeKey:n},include:{run:!0}});if(g){if("IMPORTED"===g.run.origin){let A=JSON.parse(g.rawMetadataJson??"{}"),r=("SESSION"===g.run.kind&&"IN_PROGRESS"===u?await a.worktreeRunLease.findFirst({where:{worktreeId:g.run.worktreeId??"",run:{kind:"SESSION",origin:"MANAGED",status:{in:["IN_PROGRESS","PAUSED"]}}}}):null)?"IMPORTED_ACTIVE_COLLISION":"IMPORTED_SYNCED";if(A.importedSnapshotDigest===c&&g.run.phase===r)continue;let i=o&&A.importedHistoryDigest!==o;await a.$transaction([a.runAttempt.update({where:{id:g.id},data:{rawMetadataJson:i?JSON.stringify(l):d}}),a.agentRun.update({where:{id:g.runId},data:{status:u,phase:r,...t?{initialPrompt:t,inputs:{updateMany:{where:{kind:"INITIAL",sequence:0},data:{prompt:t}}}}:{},model:e.model||g.run.model,effort:void 0===e.effort?g.run.effort:D(e.effort,100),finalOutput:void 0===e.finalOutput?g.run.finalOutput:D(e.finalOutput,2e6),branch:e.branch??g.run.branch,jiraIssueKey:k(e.jiraIssueKey),nativeArchivedAt:e.archived?g.run.nativeArchivedAt??new Date:null,startedAt:M(e.createdAt)??g.run.startedAt,finishedAt:"IN_PROGRESS"===u?null:M(e.updatedAt)??g.run.finishedAt}})]),i&&(await this.importHistory(g.runId,g.id,e),await a.runAttempt.update({where:{id:g.id},data:{rawMetadataJson:d}})),N(g.runId)}continue}let h=await a.worktree.findUnique({where:{id:e.worktreeId},include:{codebase:{include:{repository:!0}}}});if(!h||h.codebase.agentId!==A)continue;let p=e.kind?.toUpperCase()==="PLAN"?"PLAN":"SESSION",I="SESSION"===p&&"IN_PROGRESS"===u?await a.worktreeRunLease.findFirst({where:{worktreeId:h.id,run:{kind:"SESSION",origin:"MANAGED",status:{in:["IN_PROGRESS","PAUSED"]}}}}):null,C=await a.$transaction(A=>R(A,p)),E=(0,r.randomUUID)(),m=(0,r.randomUUID)();await a.agentRun.create({data:{id:E,kind:p,displayNumber:C,status:u,phase:I?"IMPORTED_ACTIVE_COLLISION":"IMPORTED_SYNCED",origin:"IMPORTED",provider:i,worktreeId:h.id,repositoryId:h.codebase.repository.id,agentId:A,jiraIssueKey:k(e.jiraIssueKey),repositoryName:h.codebase.repository.name,branch:e.branch??h.branch,model:e.model||"unknown",effort:D(e.effort,100),worktreeConcurrencyLimit:b(p,void 0),initialPrompt:t??"Imported provider history",finalOutput:D(e.finalOutput,2e6),archivedAt:e.archived?new Date:null,nativeArchivedAt:e.archived?new Date:null,startedAt:M(e.createdAt),finishedAt:M(e.updatedAt),createdAt:M(e.createdAt),attempts:{create:{id:m,generation:0,nativeId:e.nativeId,nativeKey:n,status:"IMPORTED",rawMetadataJson:o?JSON.stringify(l):d}},inputs:{create:{id:(0,r.randomUUID)(),sequence:0,kind:"INITIAL",prompt:t??"Imported provider history"}}}}),o&&(await this.importHistory(E,m,e),await a.runAttempt.update({where:{id:m},data:{rawMetadataJson:d}})),N(E),s+=1}return await a.runProviderSync.upsert({where:{agentId_provider:{agentId:A,provider:i}},create:{id:(0,r.randomUUID)(),agentId:A,provider:i,status:"IDLE",lastCompletedAt:new Date,importedCount:s},update:{status:"IDLE",lastCompletedAt:new Date,lastError:null,importedCount:{increment:s}}}),s}async providerCatalog(A={}){let e=await (0,n.U)(),t=!!(A.runId||A.worktreeId),r=A.worktreeId??(A.runId?(await e.agentRun.findUnique({where:{id:A.runId},select:{worktreeId:!0}}))?.worktreeId:null),i=A.runId?(await e.agentRun.findUnique({where:{id:A.runId},select:{agentId:!0}}))?.agentId:A.worktreeId?(await e.worktree.findUnique({where:{id:A.worktreeId},select:{codebase:{select:{agentId:!0}}}}))?.codebase.agentId:null,[a,o]=t&&!i?[[],[]]:await Promise.all([e.agent.findMany({where:i?{id:i}:void 0,select:{id:!0,capabilitiesJson:!0,lastSeenAt:!0,disconnectedAt:!0,heartbeatIntervalSeconds:!0}}),e.runProviderSync.findMany({where:i?{agentId:i}:void 0,orderBy:{updatedAt:"desc"}})]);return m.map(A=>{let e=`runs.provider.${A.toLowerCase()}`,t=a.some(t=>{let r=o.find(e=>e.agentId===t.id&&e.provider===A);return!t.disconnectedAt&&!!t.lastSeenAt&&Date.now()-t.lastSeenAt.getTime()<=(0,s.z)(t)&&JSON.parse(t.capabilitiesJson).includes(e)&&r?.status!=="FAILED"}),i=o.find(({provider:e})=>e===A)?.catalogJson,n=i?JSON.parse(i):null,l=r&&n?.worktrees?n.worktrees[r]?.models??[]:n?.models;return{key:A,label:"OPENCODE"===A?"OpenCode":"CLAUDE"===A?"Claude":"Codex",available:t,models:l?.length?l:[{id:"default",label:"Provider default",efforts:["auto","low","medium","high"]}],supportsWebSearch:n?.capabilities?.webSearch??!0,supportsQuestions:n?.capabilities?.questions??!0,supportsImport:n?.capabilities?.import??!0,supportsPause:n?.capabilities?.pause??!0,supportsSteering:n?.capabilities?.steering??!0,supportsResume:n?.capabilities?.resume??!0,supportsNativeDelete:n?.capabilities?.nativeDelete??!0}})}async providerImportStatus(){return(await (0,n.U)()).runProviderSync.findMany({orderBy:[{agentId:"asc"},{provider:"asc"}]})}async reportProviderImportStatus(A,e,t,i,a){let s=y(m,e,"Provider"),o=t.trim().toUpperCase();if(!["SYNCING","IDLE","FAILED"].includes(o))throw Error("Import status is invalid");return(await (0,n.U)()).runProviderSync.upsert({where:{agentId_provider:{agentId:A,provider:s}},create:{id:(0,r.randomUUID)(),agentId:A,provider:s,status:o,lastStartedAt:"SYNCING"===o?new Date:void 0,lastCompletedAt:"IDLE"===o?new Date:void 0,lastError:D(i,2e4),catalogJson:void 0===a?void 0:JSON.stringify(a)},update:{status:o,lastStartedAt:"SYNCING"===o?new Date:void 0,lastCompletedAt:"IDLE"===o?new Date:void 0,lastError:"FAILED"===o?D(i,2e4):null,catalogJson:void 0===a?void 0:JSON.stringify(a)}})}subscribeRunList(A){let r=a._H.iterate(a.hu);return(0,t.G)(r,async t=>{if("drafts"===t.runChanged.id)return!1;if(!A.kind&&!A.appId&&!A.provider&&!A.origin&&!A.worktreeId&&!A.workflowId)return!0;let r=await (0,n.U)(),i=await r.agentRun.findUnique({where:{id:t.runChanged.id},select:{worktreeId:!0,workflowRun:{select:{workflowId:!0}},kind:!0,provider:!0,origin:!0,repositoryId:!0}});return!i||(!A.workflowId||i.workflowRun?.workflowId===A.workflowId||!!await (0,e.f)(A.workflowId,i.worktreeId))&&(!A.worktreeId||i.worktreeId===A.worktreeId)&&(!A.kind||i.kind===A.kind)&&(!A.provider||i.provider===A.provider.trim().toUpperCase())&&(!A.origin||i.origin===A.origin)&&(!A.appId||!!i.repositoryId&&!!await r.appRepository.findFirst({where:{appId:A.appId,repositoryId:i.repositoryId},select:{appId:!0}}))})}subscribeRuns(){return a._H.iterate(a.hu)}subscribeRun(A){return a._H.iterate((0,a.k_)(A))}subscribeEvents(A){return a._H.iterate((0,a.zP)(A))}subscribeQuestions(A){return a._H.iterate((0,a.hn)(A))}async requireWorktree(A,e){let t=await (0,n.U)(),r=await t.worktree.findUnique({where:{id:B(A,"Worktree",500)},include:{codebase:{include:{repository:!0,agent:!0}}}});if(!r||"AVAILABLE"!==r.availability)throw Error("Worktree is unavailable");if(e){let A=r.codebase.agent,i=JSON.parse(A.capabilitiesJson);if(A.disconnectedAt||!A.lastSeenAt||Date.now()-A.lastSeenAt.getTime()>(0,s.z)(A)||!i.includes(`runs.provider.${e.toLowerCase()}`))throw Error(`${e} is unavailable on this worktree's agent`);let n=await t.runProviderSync.findUnique({where:{agentId_provider:{agentId:r.codebase.agentId,provider:e}}});if(n?.status==="FAILED")throw Error(`${e} is unavailable: ${n.lastError??"provider capability check failed"}`)}return r}async requireAttachments(A,e){if(!A.length)return;if(A.length>100)throw Error("Too many attachments");let t=await (0,n.U)(),r=await t.runAttachment.findMany({where:{id:{in:A},inputId:null,...e?{OR:[{draftId:e},{draftId:null}]}:{draftId:null}}});if(r.length!==A.length)throw Error("One or more attachments are unavailable");if(r.reduce((A,e)=>A+e.size,0)>0x6400000)throw Error("Attachments exceed the 100 MB input limit")}}],310509)},292988,A=>{var e=A.i(879838),t=A.i(945565);function r(A){return A&&"object"==typeof A&&"message"in A&&"string"==typeof A.message?A.message:String(A)}function i(A,e,t,i){A.newFunction(t,t=>{let n=t?JSON.parse(A.getString(t)):null,a=A.newPromise();return e.add(a),Promise.resolve().then(()=>i(n)).then(A=>({ok:!0,value:A}),A=>({ok:!1,error:r(A)})).then(t=>{a.alive&&A.alive&&(A.newString(JSON.stringify(t)).consume(A=>a.resolve(A)),e.delete(a),a.dispose(),A.runtime.executePendingJobs().dispose())}).catch(()=>{}),a.handle}).consume(e=>A.setProp(A.global,t,e))}async function n(A){if(!A.body)return"";let e=A.body.getReader(),t=[],r=0;for(;;){let{done:A,value:i}=await e.read();if(A)break;if((r+=i.byteLength)>0xa00000)throw await e.cancel(),Error("Script fetch response exceeded 10 MiB");t.push(i)}let i=new Uint8Array(r),n=0;for(let A of t)i.set(A,n),n+=A.byteLength;return new TextDecoder().decode(i)}let a=String.raw`
|
|
1447
1447
|
class HeaderBag {
|
|
1448
1448
|
constructor(values = [], readOnly = false) { this.values = Array.isArray(values) ? values.map(({name, value}) => ({name: String(name), value: String(value)})) : []; this.readOnly = readOnly; }
|
|
1449
1449
|
assertMutable() { if (this.readOnly) throw new TypeError("Original request headers are read-only"); }
|
|
@@ -875,14 +875,14 @@ ${t}`}splitMarkdownIntoSections(e){let t=e.split(/(?=^#{1,6}\s)|(?:\n\s*\n)/m).f
|
|
|
875
875
|
id requiresApprovingReviews requiredApprovingReviewCount requiresCodeOwnerReviews requireLastPushApproval
|
|
876
876
|
} }
|
|
877
877
|
}
|
|
878
|
-
}`,{owner:w,name:b,ref:`refs/heads/${T}`},!!i,a).then(e=>e.repository?.ref?.branchProtectionRule??null).catch(e=>(R("GitHub branch protection could not be loaded",e),null))]),j=[],M=[],B=[];if(C){let[e,t,r]=await Promise.all([E(`${v}/pulls/${C.number}/files`),S(`${v}/pulls/${C.number}/requested_reviewers`),E(`${v}/pulls/${C.number}/reviews`)]);j=[...new Set(e.flatMap(e=>[e.filename,...e.previous_filename?[e.previous_filename]:[]]))],e.length<C.changed_files&&R("GitHub changed files are incomplete",Error("The pull request exceeds the provider file-list limit")),M=p((t.users??[]).map(c));let i=new Map;for(let e of[...r].sort((e,t)=>e.id-t.id))["APPROVED","CHANGES_REQUESTED","DISMISSED"].includes(e.state)&&i.set(String(e.user.id),e);B=p([...i.values()].filter(e=>"APPROVED"===e.state).map(e=>c(e.user)))}let q=B.map(e=>e.id),G=[],H=$.filter(e=>"pull_request"===e.type),z=Math.max(L?.requiresApprovingReviews?L.requiredApprovingReviewCount:0,0,...H.map(e=>e.parameters?.required_approving_review_count??0)),F=!!(L?.requiresCodeOwnerReviews||H.some(e=>e.parameters?.require_code_owner_review));C&&(L?.requireLastPushApproval||H.some(e=>e.parameters?.require_last_push_approval))&&R("Latest-push approval cannot be fully verified",Error("GitHub requires approval after the latest push from someone other than its pusher. Check this requirement in GitHub before merging.")),C&&z>0&&G.push({id:"github:required-approvals",name:"Required approvals",poolKeys:[x],eligibleReviewerIds:O.map(e=>e.id),requiredApprovals:z,approvedReviewerIds:q});let V=new Map,K=(e,t,r)=>{let i=`${e.toLowerCase()}/${t.toLowerCase()}/${r}`,a=V.get(i);return a||(a=(async()=>{let i=`/orgs/${encodeURIComponent(e)}/teams/${encodeURIComponent(t)}`,a=await S(i);if(r){let r=await S(`${i}/repos/${encodeURIComponent(w)}/${encodeURIComponent(b)}`);if(!r.permissions?.push&&!["push","write","maintain","admin"].includes(r.permission??""))return{principal:`team:${a.id}`,label:`@${e}/${t}`,people:[]}}let n=await E(`${i}/members`);return{principal:`team:${a.id}`,label:`@${e}/${t}`,people:n.filter(d).map(c).filter(e=>D.has(e.id))}})(),V.set(i,a)),a};for(let e of H)for(let t of e.parameters?.required_reviewers??[])try{if("Team"!==t.reviewer.type)throw Error("Unsupported required-reviewer type");s??=E(`/orgs/${encodeURIComponent(w)}/teams`);let r=(await s).find(e=>e.id===t.reviewer.id);if(!r)throw Error(`Team ${t.reviewer.id} is not visible to the configured token`);let i=await K(w,r.slug,!1),a=`${k}:ruleset:${e.ruleset_source_type}:${e.ruleset_id}:team:${r.id}`;m(P,{key:a,name:`Rule ${e.ruleset_id} \xb7 ${r.name}`,kind:"APPROVAL_RULE",candidates:i.people}),C&&function(e,t){return t.some(t=>{let r=!1;for(let i of e)o(i.replace(/^!/,""),t,{characterClasses:!0})&&(r=!i.startsWith("!"));return r})}(t.file_patterns,j)&&G.push({id:`${a}:${G.length}`,name:`${r.name}${t.minimum_approvals?" approval rule":" (optional review)"}`,poolKeys:[a],eligibleReviewerIds:i.people.map(e=>e.id),requiredApprovals:t.minimum_approvals,approvedReviewerIds:q})}catch(e){R("GitHub required-reviewer team could not be loaded",e)}for(let e of[".github/CODEOWNERS","CODEOWNERS","docs/CODEOWNERS"])try{let t=await S(`${v}/contents/${e}?ref=${encodeURIComponent(T)}`);if(t.size>=3145728)throw Error("GitHub ignores CODEOWNERS files of 3 MB or larger");if("base64"!==t.encoding||"string"!=typeof t.content)throw Error("GitHub CODEOWNERS contents were not returned");u=Buffer.from(t.content,"base64").toString("utf8");break}catch(e){if(f(e,404))continue;R("GitHub CODEOWNERS could not be loaded",e);break}if(void 0!==u){let e=n(u,"GITHUB"),r=new Set(C?l(e,j):[]),i=new Map,a=e=>{let t=i.get(e.toLowerCase());return t||(t=(async()=>{if(e.startsWith("@")&&e.includes("/")){let[t,r]=e.slice(1).split("/");return K(t,r,!0)}if(e.startsWith("@")){let t=await S(`/users/${encodeURIComponent(e.slice(1))}`),r=D.get(String(t.id));return{principal:`user:${t.id}`,label:`@${t.login}`,people:r?[r]:[]}}let t=N.find(t=>(t.email??t.public_email)?.toLowerCase()===e.toLowerCase());if(!t)throw Error(`Email owner ${e} cannot be resolved with the configured token; use a visible username or team`);return{principal:`user:${t.id}`,label:`@${t.login}`,people:[c(t)]}})(),i.set(e.toLowerCase(),t)),t};await (0,t.f)(e.filter(e=>e.owners.length>0),async e=>{try{let i=await (0,t.f)(e.owners,a),n=h(k,i.map(e=>e.principal)),s=p(i.flatMap(e=>e.people)),o=i.map(e=>e.label).join(" or ");m(P,{key:n,name:o,kind:"CODEOWNERS",candidates:s}),C&&r.has(e)&&G.push({id:`github:codeowners:${e.pattern}`,name:`${F?"Code owners":"Suggested code owners"} \xb7 ${e.pattern}`,poolKeys:[n],eligibleReviewerIds:s.map(e=>e.id),requiredApprovals:1,approvedReviewerIds:q})}catch(t){R(`GitHub owners for ${e.pattern} could not be resolved`,t)}})}return{provider:"GITHUB",repositoryIdentity:k,ref:T,defaultRef:I.default_branch,refs:[...new Set([I.default_branch,T,...U])],pools:[...P.values()],requirements:G,issues:[...new Set(_)],discoveryComplete:A,...C?{request:{id:i.id,number:C.number,url:C.html_url,open:"open"===C.state&&!C.merged,authorId:String(C.user.id),baseRef:C.base.ref,headSha:C.head.sha,currentReviewers:M,approvedReviewers:B}}:{}}}async assign(e,t,r){let{owner:i,name:a}=this.parts(e);await this.service.addPullRequestReviewers({owner:i,name:a,number:t.number,expectedId:t.id,reviewers:r.map(({id:e,username:t})=>({id:e,username:t}))})}}let b=e=>e.split("/").pop();class v{service;constructor(e){this.service=e}async discover(e,r,i,a=!1){let s,o,u=await this.service.projectForCanonicalOrigin(e.canonicalOrigin);if(!u)throw Error("Configure this GitLab project in integration settings before setting up reviewers");if(i?.projectId&&i.projectId!==String(u.id))throw Error("Merge request project does not match reviewer settings");let w=`/projects/${encodeURIComponent(u.id)}`,v=(e,t={})=>this.service.reviewerRest(e,t,a||!!i,!!i),S=(e,t={})=>y(r=>v(e,{...t,per_page:100,page:r})),[E,I]=await Promise.all([this.service.getSettings(),v(w)]),k=`GITLAB:${E.baseUrl.replace(/\/+$/,"").toLowerCase()}:${I.id}`,_=[],A=!0,R=(e,t)=>{A=!1,_.push(`${e}: ${g(t)}`)},C=i?await v(`${w}/merge_requests/${i.number}`):void 0;if(C&&i&&String(C.id)!==b(i.id))throw Error("The merge request changed. Refresh before assigning reviewers.");if(C&&C.target_project_id!==I.id)throw Error("Merge request target project does not match reviewer settings");let T=C?.target_branch??r??I.default_branch,[N,O,D,P]=await Promise.all([S(`${w}/members/all`).catch(e=>(R("GitLab project membership could not be loaded",e),[])),S(`${w}/members`).catch(e=>(R("GitLab direct project membership could not be loaded",e),[])),S(`${w}/repository/branches`).then(e=>e.map(e=>e.name)).catch(()=>[I.default_branch]),S(`${w}/approval_rules`).catch(e=>(i||(A=!1),_.push(`GitLab project approval rules are unavailable (Premium/Ultimate and suitable permissions are required): ${g(e)}`),[]))]),x=N.filter(e=>d(e)&&(e.access_level??0)>=30),U=p(x.map(c)),$=new Map(U.map(e=>[e.id,e])),L=new Map,j=`${k}:general`;for(let e of(L.set(j,{key:j,name:"General reviewers",kind:"GENERAL",candidates:U}),P)){let t="any_approver"===e.rule_type?U:(e.eligible_approvers??[]).filter(d).map(c);m(L,{key:`${k}:rule:${e.id}`,name:e.name,kind:"APPROVAL_RULE",candidates:t})}for(let e of["CODEOWNERS","docs/CODEOWNERS",".gitlab/CODEOWNERS"])try{let t=await v(`${w}/repository/files/${encodeURIComponent(e)}`,{ref:T});if("base64"!==t.encoding||"string"!=typeof t.content)throw Error("GitLab CODEOWNERS contents were not returned");s=Buffer.from(t.content,"base64").toString("utf8");break}catch(e){if(f(e,404))continue;R("GitLab CODEOWNERS could not be loaded",e);break}let M=void 0===s?[]:n(s,"GITLAB"),B=new Map,q=new Map,G=e=>{let t=q.get(e.toLowerCase());return t||(t=(async()=>{if(e.startsWith("@@")){let t=e.slice(2).toLowerCase().replace(/s$/,""),r={developer:30,maintainer:40,owner:50}[t];if(!r)throw Error(`Unsupported GitLab CODEOWNERS role: ${e}`);return{principal:`role:${r}`,label:`@@${t}`,people:O.filter(e=>d(e)&&e.access_level===r).map(c)}}let t=e.startsWith("@")?e.slice(1):null,r=x.find(r=>t?r.username?.toLowerCase()===t.toLowerCase():(r.email??r.public_email)?.toLowerCase()===e.toLowerCase());if(r)return{principal:`user:${r.id}`,label:`@${r.username}`,people:[c(r)]};if(!t)throw Error(`Email owner ${e} is not visible to the configured token; use a visible username or group`);let i=(t.includes("/")?[]:await v("/users",{username:t})).find(e=>e.username?.toLowerCase()===t.toLowerCase());if(i)return{principal:`user:${i.id}`,label:`@${i.username}`,people:$.has(String(i.id))?[c(i)]:[]};let a=await v(`/groups/${encodeURIComponent(t)}`,{with_projects:"false"});if(!(await (o??=(async()=>{let e=new Set((I.shared_with_groups??[]).filter(e=>e.group_access_level>=30).map(e=>e.group_id)),t="group"===I.namespace.kind?I.namespace.id:null,r=new Set;for(;null!==t&&!r.has(t);){r.add(t),e.add(t);let i=await v(`/groups/${t}`,{with_projects:"false"});for(let t of i.shared_with_groups??[])t.group_access_level>=30&&e.add(t.group_id);t=i.parent_id}return e})())).has(a.id))return{principal:`group:${a.id}`,label:`@${a.full_path}`,people:[]};let n=await S(`/groups/${a.id}/members`);return{principal:`group:${a.id}`,label:`@${a.full_path}`,people:n.filter(d).map(c).filter(e=>$.has(e.id))}})(),q.set(e.toLowerCase(),t)),t};for(let e of(await (0,t.f)(M.filter(e=>!e.exclusion&&e.owners.length),async e=>{try{let r=await (0,t.f)(e.owners,G);return{entry:e,resolved:r}}catch(t){return{entry:e,error:t}}}))){if(!e.resolved){R(`GitLab owners for ${e.entry.pattern} could not be resolved`,e.error);continue}let t=h(k,e.resolved.map(e=>e.principal));m(L,{key:t,name:e.resolved.map(e=>e.label).join(" or "),kind:"CODEOWNERS",candidates:e.resolved.flatMap(e=>e.people)}),B.set(`${e.entry.section}\0${e.entry.pattern}`,t)}let H=[],z=[],[F,V]=(E.version??"19.2").split(".").map(Number),K=F>19||19===F&&V>=4,W=async e=>{let t=await this.service.reviewerGraphql(`query CodeReviewerApprovalRules($path: ID!, $iid: String!) {
|
|
878
|
+
}`,{owner:w,name:b,ref:`refs/heads/${T}`},!!i,a).then(e=>e.repository?.ref?.branchProtectionRule??null).catch(e=>(R("GitHub branch protection could not be loaded",e),null))]),j=[],M=[],B=[];if(C){let[e,t,r]=await Promise.all([E(`${v}/pulls/${C.number}/files`).catch(e=>(R("GitHub changed files could not be loaded",e),[])),S(`${v}/pulls/${C.number}/requested_reviewers`).catch(e=>(R("GitHub requested reviewers could not be loaded",e),{users:[]})),E(`${v}/pulls/${C.number}/reviews`).catch(e=>(R("GitHub current approvals could not be loaded",e),[]))]);j=[...new Set(e.flatMap(e=>[e.filename,...e.previous_filename?[e.previous_filename]:[]]))],e.length<C.changed_files&&R("GitHub changed files are incomplete",Error("The pull request exceeds the provider file-list limit")),M=p((t.users??[]).map(c));let i=new Map;for(let e of[...r].sort((e,t)=>e.id-t.id))["APPROVED","CHANGES_REQUESTED","DISMISSED"].includes(e.state)&&i.set(String(e.user.id),e);B=p([...i.values()].filter(e=>"APPROVED"===e.state).map(e=>c(e.user)))}let q=B.map(e=>e.id),G=[],H=$.filter(e=>"pull_request"===e.type),z=Math.max(L?.requiresApprovingReviews?L.requiredApprovingReviewCount:0,0,...H.map(e=>e.parameters?.required_approving_review_count??0)),F=!!(L?.requiresCodeOwnerReviews||H.some(e=>e.parameters?.require_code_owner_review));C&&(L?.requireLastPushApproval||H.some(e=>e.parameters?.require_last_push_approval))&&R("Latest-push approval cannot be fully verified",Error("GitHub requires approval after the latest push from someone other than its pusher. Check this requirement in GitHub before merging.")),C&&z>0&&G.push({id:"github:required-approvals",name:"Required approvals",isRequired:!0,patterns:[],poolKeys:[x],eligibleReviewerIds:O.map(e=>e.id),requiredApprovals:z,approvedReviewerIds:q});let V=new Map,K=(e,t,r)=>{let i=`${e.toLowerCase()}/${t.toLowerCase()}/${r}`,a=V.get(i);return a||(a=(async()=>{let i=`/orgs/${encodeURIComponent(e)}/teams/${encodeURIComponent(t)}`,a=await S(i);if(r){let r=await S(`${i}/repos/${encodeURIComponent(w)}/${encodeURIComponent(b)}`);if(!r.permissions?.push&&!["push","write","maintain","admin"].includes(r.permission??""))return{principal:`team:${a.id}`,label:`@${e}/${t}`,people:[]}}let n=await E(`${i}/members`);return{principal:`team:${a.id}`,label:`@${e}/${t}`,people:n.filter(d).map(c).filter(e=>D.has(e.id))}})(),V.set(i,a)),a};for(let e of H)for(let t of e.parameters?.required_reviewers??[])try{if("Team"!==t.reviewer.type)throw Error("Unsupported required-reviewer type");s??=E(`/orgs/${encodeURIComponent(w)}/teams`);let r=(await s).find(e=>e.id===t.reviewer.id);if(!r)throw Error(`Team ${t.reviewer.id} is not visible to the configured token`);let i=await K(w,r.slug,!1),a=`${k}:ruleset:${e.ruleset_source_type}:${e.ruleset_id}:team:${r.id}`;m(P,{key:a,name:`Rule ${e.ruleset_id} \xb7 ${r.name}`,kind:"APPROVAL_RULE",candidates:i.people}),C&&function(e,t){return t.some(t=>{let r=!1;for(let i of e)o(i.replace(/^!/,""),t,{characterClasses:!0})&&(r=!i.startsWith("!"));return r})}(t.file_patterns,j)&&G.push({id:`${a}:${G.length}`,name:`${r.name}${t.minimum_approvals?" approval rule":" (optional review)"}`,isRequired:t.minimum_approvals>0,patterns:t.file_patterns,poolKeys:[a],eligibleReviewerIds:i.people.map(e=>e.id),requiredApprovals:t.minimum_approvals,approvedReviewerIds:q})}catch(e){R("GitHub required-reviewer team could not be loaded",e)}for(let e of[".github/CODEOWNERS","CODEOWNERS","docs/CODEOWNERS"])try{let t=await S(`${v}/contents/${e}?ref=${encodeURIComponent(T)}`);if(t.size>=3145728)throw Error("GitHub ignores CODEOWNERS files of 3 MB or larger");if("base64"!==t.encoding||"string"!=typeof t.content)throw Error("GitHub CODEOWNERS contents were not returned");u=Buffer.from(t.content,"base64").toString("utf8");break}catch(e){if(f(e,404))continue;R("GitHub CODEOWNERS could not be loaded",e);break}if(void 0!==u){let e=n(u,"GITHUB"),r=new Set(C?l(e,j):[]),i=new Map,a=e=>{let t=i.get(e.toLowerCase());return t||(t=(async()=>{if(e.startsWith("@")&&e.includes("/")){let[t,r]=e.slice(1).split("/");return K(t,r,!0)}if(e.startsWith("@")){let t=await S(`/users/${encodeURIComponent(e.slice(1))}`),r=D.get(String(t.id));return{principal:`user:${t.id}`,label:`@${t.login}`,people:r?[r]:[]}}let t=N.find(t=>(t.email??t.public_email)?.toLowerCase()===e.toLowerCase());if(!t)throw Error(`Email owner ${e} cannot be resolved with the configured token; use a visible username or team`);return{principal:`user:${t.id}`,label:`@${t.login}`,people:[c(t)]}})(),i.set(e.toLowerCase(),t)),t};await (0,t.f)(e.filter(e=>e.owners.length>0),async e=>{try{let i=await (0,t.f)(e.owners,a),n=h(k,i.map(e=>e.principal)),s=p(i.flatMap(e=>e.people)),o=i.map(e=>e.label).join(" or ");m(P,{key:n,name:o,kind:"CODEOWNERS",candidates:s}),C&&r.has(e)&&G.push({id:`github:codeowners:${e.pattern}`,name:`${F?"Code owners":"Suggested code owners"} \xb7 ${e.pattern}`,isRequired:F,patterns:[e.pattern],poolKeys:[n],eligibleReviewerIds:s.map(e=>e.id),requiredApprovals:1,approvedReviewerIds:q})}catch(t){R(`GitHub owners for ${e.pattern} could not be resolved`,t)}})}return{provider:"GITHUB",repositoryIdentity:k,ref:T,defaultRef:I.default_branch,refs:[...new Set([I.default_branch,T,...U])],pools:[...P.values()],requirements:G,issues:[...new Set(_)],discoveryComplete:A,...C?{request:{id:i.id,number:C.number,url:C.html_url,open:"open"===C.state&&!C.merged,authorId:String(C.user.id),baseRef:C.base.ref,headSha:C.head.sha,currentReviewers:M,approvedReviewers:B}}:{}}}async assign(e,t,r){let{owner:i,name:a}=this.parts(e);await this.service.addPullRequestReviewers({owner:i,name:a,number:t.number,expectedId:t.id,reviewers:r.map(({id:e,username:t})=>({id:e,username:t}))})}}let b=e=>e.split("/").pop();class v{service;constructor(e){this.service=e}async discover(e,r,i,a=!1){let s,o,u=await this.service.projectForCanonicalOrigin(e.canonicalOrigin);if(!u)throw Error("Configure this GitLab project in integration settings before setting up reviewers");if(i?.projectId&&i.projectId!==String(u.id))throw Error("Merge request project does not match reviewer settings");let w=`/projects/${encodeURIComponent(u.id)}`,v=(e,t={})=>this.service.reviewerRest(e,t,a||!!i,!!i),S=(e,t={})=>y(r=>v(e,{...t,per_page:100,page:r})),[E,I]=await Promise.all([this.service.getSettings(),v(w)]),k=`GITLAB:${E.baseUrl.replace(/\/+$/,"").toLowerCase()}:${I.id}`,_=[],A=!0,R=(e,t)=>{A=!1,_.push(`${e}: ${g(t)}`)},C=i?await v(`${w}/merge_requests/${i.number}`):void 0;if(C&&i&&String(C.id)!==b(i.id))throw Error("The merge request changed. Refresh before assigning reviewers.");if(C&&C.target_project_id!==I.id)throw Error("Merge request target project does not match reviewer settings");let T=C?.target_branch??r??I.default_branch,[N,O,D,P]=await Promise.all([S(`${w}/members/all`).catch(e=>(R("GitLab project membership could not be loaded",e),[])),S(`${w}/members`).catch(e=>(R("GitLab direct project membership could not be loaded",e),[])),S(`${w}/repository/branches`).then(e=>e.map(e=>e.name)).catch(()=>[I.default_branch]),S(`${w}/approval_rules`).catch(e=>(i||(A=!1),_.push(`GitLab project approval rules are unavailable (Premium/Ultimate and suitable permissions are required): ${g(e)}`),[]))]),x=N.filter(e=>d(e)&&(e.access_level??0)>=30),U=p(x.map(c)),$=new Map(U.map(e=>[e.id,e])),L=new Map,j=`${k}:general`;for(let e of(L.set(j,{key:j,name:"General reviewers",kind:"GENERAL",candidates:U}),P)){let t="any_approver"===e.rule_type?U:(e.eligible_approvers??[]).filter(d).map(c);m(L,{key:`${k}:rule:${e.id}`,name:e.name,kind:"APPROVAL_RULE",candidates:t})}for(let e of["CODEOWNERS","docs/CODEOWNERS",".gitlab/CODEOWNERS"])try{let t=await v(`${w}/repository/files/${encodeURIComponent(e)}`,{ref:T});if("base64"!==t.encoding||"string"!=typeof t.content)throw Error("GitLab CODEOWNERS contents were not returned");s=Buffer.from(t.content,"base64").toString("utf8");break}catch(e){if(f(e,404))continue;R("GitLab CODEOWNERS could not be loaded",e);break}let M=void 0===s?[]:n(s,"GITLAB"),B=new Map,q=new Map,G=e=>{let t=q.get(e.toLowerCase());return t||(t=(async()=>{if(e.startsWith("@@")){let t=e.slice(2).toLowerCase().replace(/s$/,""),r={developer:30,maintainer:40,owner:50}[t];if(!r)throw Error(`Unsupported GitLab CODEOWNERS role: ${e}`);return{principal:`role:${r}`,label:`@@${t}`,people:O.filter(e=>d(e)&&e.access_level===r).map(c)}}let t=e.startsWith("@")?e.slice(1):null,r=x.find(r=>t?r.username?.toLowerCase()===t.toLowerCase():(r.email??r.public_email)?.toLowerCase()===e.toLowerCase());if(r)return{principal:`user:${r.id}`,label:`@${r.username}`,people:[c(r)]};if(!t)throw Error(`Email owner ${e} is not visible to the configured token; use a visible username or group`);let i=(t.includes("/")?[]:await v("/users",{username:t})).find(e=>e.username?.toLowerCase()===t.toLowerCase());if(i)return{principal:`user:${i.id}`,label:`@${i.username}`,people:$.has(String(i.id))?[c(i)]:[]};let a=await v(`/groups/${encodeURIComponent(t)}`,{with_projects:"false"});if(!(await (o??=(async()=>{let e=new Set((I.shared_with_groups??[]).filter(e=>e.group_access_level>=30).map(e=>e.group_id)),t="group"===I.namespace.kind?I.namespace.id:null,r=new Set;for(;null!==t&&!r.has(t);){r.add(t),e.add(t);let i=await v(`/groups/${t}`,{with_projects:"false"});for(let t of i.shared_with_groups??[])t.group_access_level>=30&&e.add(t.group_id);t=i.parent_id}return e})())).has(a.id))return{principal:`group:${a.id}`,label:`@${a.full_path}`,people:[]};let n=await S(`/groups/${a.id}/members`);return{principal:`group:${a.id}`,label:`@${a.full_path}`,people:n.filter(d).map(c).filter(e=>$.has(e.id))}})(),q.set(e.toLowerCase(),t)),t};for(let e of(await (0,t.f)(M.filter(e=>!e.exclusion&&e.owners.length),async e=>{try{let r=await (0,t.f)(e.owners,G);return{entry:e,resolved:r}}catch(t){return{entry:e,error:t}}}))){if(!e.resolved){R(`GitLab owners for ${e.entry.pattern} could not be resolved`,e.error);continue}let t=h(k,e.resolved.map(e=>e.principal));m(L,{key:t,name:e.resolved.map(e=>e.label).join(" or "),kind:"CODEOWNERS",candidates:e.resolved.flatMap(e=>e.people)}),B.set(`${e.entry.section}\0${e.entry.pattern}`,t)}let H=[],z=[],[F,V]=(E.version??"19.2").split(".").map(Number),K=F>19||19===F&&V>=4,W=async e=>{let t=await this.service.reviewerGraphql(`query CodeReviewerApprovalRules($path: ID!, $iid: String!) {
|
|
879
879
|
project(fullPath: $path) { mergeRequest(iid: $iid) { approvalState { rules {
|
|
880
880
|
id name type section ${K?"patterns":""} approvalsRequired approved
|
|
881
881
|
sourceRule { id }
|
|
882
882
|
eligibleApprovers { id username name avatarUrl webUrl bot state }
|
|
883
883
|
approvedBy(first: 100) { nodes { id username name avatarUrl webUrl } pageInfo { hasNextPage } }
|
|
884
884
|
} } } }
|
|
885
|
-
}`,{path:I.path_with_namespace,iid:String(e)}),r=t.project?.mergeRequest?.approvalState.rules;if(!r)throw Error("GitLab did not return the merge request approval rules");return r},J=(e,t)=>{let r=e.sourceRule?.id??e.id;return e.sourceRule||r.includes("ApprovalProjectRule/")?`${k}:rule:${b(r)}`:`${k}:mr:${t}:rule:${b(e.id)}`};if(C){let e=new Set;try{for(let t of(await W(C.iid))){let r,i=t.type.toLowerCase(),a="any_approver"===i?U:(t.eligibleApprovers??[]).filter(d).map(c),n=(t.approvedBy?.nodes??[]).map(c);z.push(...n),t.approvedBy?.pageInfo?.hasNextPage&&R(`Approvals for ${t.name} are incomplete`,Error("GitLab returned more than 100 approving users"));let s=t.approvalsRequired,o=t.name;if("code_owner"===i){let i=t.patterns?.length?t.patterns:[t.name];r=[...new Set(i.flatMap(r=>{let i=`${(t.section??"codeowners").toLowerCase()}\0${r}`;e.add(i);let a=B.get(i);return a?[a]:[]}))],0===r.length&&R(`Code owner rule ${t.name} cannot be mapped`,Error("Refresh the target branch CODEOWNERS configuration")),0===s&&(s=1,o=`Suggested code owners \xb7 ${t.name}`)}else{let e=J(t,C.id);m(L,{key:e,name:t.name,kind:"APPROVAL_RULE",candidates:a}),r=[e]}H.push({id:t.id,name:o,poolKeys:r,eligibleReviewerIds:a.map(e=>e.id),requiredApprovals:s,approvedReviewerIds:n.map(e=>e.id)})}}catch(e){R("GitLab merge request approval rules could not be loaded",e)}try{let e=await v(`${w}/merge_requests/${C.iid}/approvals`);z.push(...(e.approved_by??[]).map(e=>c(e.user)))}catch(e){R("GitLab current approvals could not be loaded",e)}if(M.length)try{let t=await S(`${w}/merge_requests/${C.iid}/diffs`);C.changes_count&&/^\d+$/.test(C.changes_count)&&Number(C.changes_count)>t.length&&R("GitLab changed files are incomplete",Error("The merge request exceeds the provider diff-list limit"));let r=[...new Set(t.flatMap(e=>[e.new_path,e.old_path]).filter(Boolean))];for(let t of l(M,r)){let r=`${t.section}\0${t.pattern}`;if(e.has(r))continue;let i=B.get(r),a=i?L.get(i):null;i&&a?.candidates.length&&H.push({id:`gitlab:suggested:${r}`,name:`Suggested code owners \xb7 ${t.pattern}`,poolKeys:[i],eligibleReviewerIds:a.candidates.map(e=>e.id),requiredApprovals:1,approvedReviewerIds:z.map(e=>e.id)})}}catch(e){R("GitLab changed files for ownership suggestions could not be loaded",e)}}else try{let e=await S(`${w}/merge_requests`,{state:"opened",scope:"all"});await (0,t.f)(e,async e=>{try{for(let t of(await W(e.iid))){if("code_owner"===t.type.toLowerCase())continue;let r=J(t,e.id);if(!r.includes(`:mr:${e.id}:`))continue;let i="any_approver"===t.type.toLowerCase()?U:(t.eligibleApprovers??[]).filter(d).map(c);m(L,{key:r,name:`!${e.iid} \xb7 ${t.name}`,kind:"APPROVAL_RULE",candidates:i})}}catch(t){R(`GitLab approval groups for !${e.iid} could not be loaded`,t)}})}catch(e){R("GitLab open merge request approval groups could not be loaded",e)}return{provider:"GITLAB",repositoryIdentity:k,ref:T,defaultRef:I.default_branch,refs:[...new Set([I.default_branch,T,...D])],pools:[...L.values()],requirements:H,issues:[...new Set(_)],discoveryComplete:A,...C?{request:{id:i.id,number:C.iid,url:C.web_url,open:"opened"===C.state,authorId:String(C.author.id),baseRef:C.target_branch,headSha:C.sha,currentReviewers:p((C.reviewers??[]).map(c)),approvedReviewers:p(z)}}:{}}}async assign(e,t,r){let i=await this.service.projectForCanonicalOrigin(e.canonicalOrigin);if(!i||t.projectId&&t.projectId!==i.id)throw Error("Merge request project does not match reviewer settings");await this.service.addMergeRequestReviewers({projectId:i.id,iid:t.number,expectedId:b(t.id),reviewerIds:r.map(e=>e.id)})}}e.s(["f",0,class{github;gitlab;constructor(e,t){this.github=new w(e),this.gitlab=new v(t)}discover(e,t,r,i=!1){return/^github\.com\//i.test(e.canonicalOrigin)?this.github.discover(e,t,r,i):this.gitlab.discover(e,t,r,i)}assign(e,t,r){return/^github\.com\//i.test(e.canonicalOrigin)?this.github.assign(e,t,r):this.gitlab.assign(e,t,r)}}],65899)},806098,e=>{var t=e.i(666680),r=e.i(243783),i=e.i(971724),a=e.i(105954),n=e.i(455744),s=e.i(604147);e.i(805422);var o=e.i(661983);let l=e=>[...new Set(e)],u=i.z.object({id:a.z.string().min(1).max(500),username:a.z.string().max(500),name:a.z.string().max(500),avatarUrl:a.z.string().max(4e3).nullable(),url:a.z.string().max(4e3).nullable()}).strict(),c=n.z.array(i.z.object({key:a.z.string().min(1).max(2e3),name:a.z.string().max(2e3),kind:s.z.enum(["GENERAL","CODEOWNERS","APPROVAL_RULE"]),provider:s.z.enum(["GITHUB","GITLAB"]),repositoryIdentity:a.z.string().min(1).max(2e3),ref:a.z.string().max(1e3),reviewers:n.z.array(u).max(1e3)}).strict()).max(500),d=e=>({id:e.userId,username:e.username,name:e.name,avatarUrl:e.avatarUrl,url:e.url});e.s(["w",0,class{providers;refreshWorktree;assignments;constructor(e,t){this.providers=e,this.refreshWorktree=t,this.assignments=new Map}async repository(e){let t=await (0,r.U)(),i=await t.codebaseRepository.findUnique({where:{id:e}});if(!i)throw Error("Repository not found");return i}async saved(e){return(await (0,r.U)()).repositoryReviewerPool.findMany({where:{repositoryId:e},include:{members:!0},orderBy:{key:"asc"}})}async repositoryCodeReviewers(e,t,r=!1){let i=await this.repository(e),[a,n]=await Promise.all([this.providers.discover(i,t??void 0,void 0,r),this.saved(e)]),s=new Map(n.map(e=>[e.key,e])),o=a.pools.map(e=>{let t=s.get(e.key);s.delete(e.key);let r=new Set(e.candidates.map(e=>e.id)),i=t?.members.map(e=>e.userId)??[];return{...e,selectedReviewerIds:i,unavailableReviewerIds:i.filter(e=>t?.repositoryIdentity!==a.repositoryIdentity||!r.has(e))}});for(let e of s.values())o.push({key:e.key,name:e.name,kind:e.kind,candidates:[],selectedReviewerIds:e.members.map(e=>e.userId),unavailableReviewerIds:e.members.map(e=>e.userId)});return{repositoryId:e,...a,pools:o}}async saveRepositoryCodeReviewers(e){if(e.pools.length>500)throw Error("At most 500 reviewer pools can be saved at once");let t=await this.repository(e.repositoryId),[i,a]=await Promise.all([this.providers.discover(t,e.ref??void 0,void 0,!0),this.saved(t.id)]),n=this.validatePools(e.pools,i,a),s=await (0,r.U)();return await s.$transaction(async e=>{await this.writePools(e,t.id,i,n),await this.updateConfiguredFlag(e,t.id)}),this.publish(t.id),this.repositoryCodeReviewers(t.id,e.ref)}validatePools(e,t,r=[]){let i=new Map(t.pools.map(e=>[e.key,e])),a=new Map(r.map(e=>[e.key,e])),n=new Set;return e.map(e=>{if(!e.key||e.key.length>2e3||n.has(e.key))throw Error("Reviewer pool keys must be unique");if(n.add(e.key),e.reviewerIds.length>1e3)throw Error("At most 1,000 reviewers can be selected per pool");let r=i.get(e.key),s=a.get(e.key);if(!r&&!s&&e.reviewerIds.length)throw Error("Reviewer group is no longer available; refresh repository settings");let o=new Map(r?.candidates.map(e=>[e.id,e])??[]);if(s?.repositoryIdentity===t.repositoryIdentity)for(let e of s.members)o.has(e.userId)||o.set(e.userId,d(e));let u=l(e.reviewerIds).map(e=>{let t=o.get(e);if(!t)throw Error("A selected reviewer is no longer eligible; refresh repository settings");return t});return{key:e.key,name:r?.name??s?.name??e.key,kind:r?.kind??s?.kind??"GENERAL",discoveryRef:r?t.ref:s?.discoveryRef??t.ref,members:u}})}async writePools(e,r,i,a){for(let n of a){if(!n.members.length){await e.repositoryReviewerPool.deleteMany({where:{repositoryId:r,key:n.key}});continue}let a=await e.repositoryReviewerPool.upsert({where:{repositoryId_key:{repositoryId:r,key:n.key}},create:{id:(0,t.randomUUID)(),repositoryId:r,key:n.key,name:n.name,kind:n.kind,provider:i.provider,repositoryIdentity:i.repositoryIdentity,discoveryRef:n.discoveryRef},update:{name:n.name,kind:n.kind,provider:i.provider,repositoryIdentity:i.repositoryIdentity,discoveryRef:n.discoveryRef}});await e.repositoryReviewerMember.deleteMany({where:{poolId:a.id}}),await e.repositoryReviewerMember.createMany({data:n.members.map(({id:e,...t})=>({poolId:a.id,userId:e,...t}))})}}async updateConfiguredFlag(e,t){let r=await e.repositoryReviewerMember.count({where:{pool:{repositoryId:t}}});await e.codebaseRepository.update({where:{id:t},data:{hasConfiguredCodeReviewers:r>0,updatedAt:new Date}})}async exportPools(e){return(await this.saved(e)).map(e=>({key:e.key,name:e.name,kind:e.kind,provider:e.provider,repositoryIdentity:e.repositoryIdentity,ref:e.discoveryRef,reviewers:e.members.map(d)}))}async validateTransferredPools(e,t){let r=c.parse(t),i=new Map,a=[];for(let t of r){let r=i.get(t.ref);r||(r=await this.providers.discover(e,t.ref||void 0,void 0,!0),i.set(t.ref,r));let n=e=>e.slice(0,e.lastIndexOf(":"));if(t.provider!==r.provider||n(t.repositoryIdentity)!==n(r.repositoryIdentity)||!t.key.startsWith(`${t.repositoryIdentity}:`))throw Error("Reviewer pools belong to a different provider instance. Deselect Code reviewers in this import and configure reviewers in the destination repository.");let s=`${r.repositoryIdentity}${t.key.slice(t.repositoryIdentity.length)}`,o=r.pools.find(e=>e.key===s),l=new Map(o?.candidates.map(e=>[e.id,e])??[]);if(!o||t.reviewers.some(e=>!l.has(e.id)))throw Error(`Reviewer group ${t.name} or one of its people cannot be resolved at the destination. Deselect Code reviewers in this import and configure reviewers in the destination repository.`);a.push({key:s,name:o.name,kind:o.kind,provider:r.provider,repositoryIdentity:r.repositoryIdentity,ref:r.ref,reviewers:t.reviewers.map(e=>l.get(e.id))})}if(new Set(a.map(e=>e.key)).size!==a.length)throw Error("Imported reviewer pools contain duplicate groups");return a}async applyTransferredPools(e,t,r){for(let i of(await e.repositoryReviewerPool.deleteMany({where:{repositoryId:t}}),r))await this.writePools(e,t,{provider:i.provider,repositoryIdentity:i.repositoryIdentity},[{...i,discoveryRef:i.ref,members:i.reviewers}]);await this.updateConfiguredFlag(e,t)}async context(e){let t=await (0,r.U)(),i=await t.worktree.findUnique({where:{id:e},include:{codebase:{include:{repository:!0}},pullRequest:!0,gitLabMergeRequest:!0}});if(!i)throw Error("Worktree not found");let a=i.codebase.repository;if(!a.hasConfiguredCodeReviewers)throw Error("Configure code reviewers in repository settings first");let n=i.gitLabMergeRequest,s=i.pullRequest,o=n?.sourceBranch??s?.headRefName;if(!i.branch||o!==i.branch||i.pullRequestLookupBranch!==i.branch||i.pullRequestLookupOrigin?.toLowerCase()!==a.canonicalOrigin.toLowerCase())throw Error("The worktree branch or repository has changed; refresh the linked pull or merge request before assigning reviewers");let l=n?{id:n.gitlabId,number:n.iid,projectId:n.projectId}:s?{id:s.githubId,number:s.number}:null;if(!l)throw Error("Worktree does not have an open pull or merge request");return{worktree:i,repository:a,locator:l}}async live(e){let t=await this.context(e),r=await this.providers.discover(t.repository,void 0,t.locator,!0),i=await this.context(e);if(i.locator.id!==t.locator.id||i.repository.id!==t.repository.id||i.worktree.branch!==t.worktree.branch)throw Error("The linked pull or merge request has changed; reload reviewer options before assigning");let a=function(e,t,r){let i=t.request;if(!i)throw Error("Pull or merge request was not found");let a=l(i.currentReviewers.map(e=>e.id)),n=l(i.approvedReviewers.map(e=>e.id)),s=new Set(a),o=new Set(n),u=new Map(t.pools.map(e=>[e.key,new Set(e.candidates.map(e=>e.id))])),c=new Map(r.filter(e=>e.repositoryIdentity===t.repositoryIdentity).map(e=>[e.key,new Set(e.members.map(e=>e.userId).filter(t=>u.get(e.key)?.has(t)))])),d=new Map([...t.pools.flatMap(e=>e.candidates),...i.currentReviewers,...i.approvedReviewers].map(e=>[e.id,e])),p=t.requirements;if(!p.length){let e=t.pools.find(e=>"GENERAL"===e.kind);e&&(p=[{id:"general-reviewers",name:"General reviewers",poolKeys:[e.key],eligibleReviewerIds:e.candidates.map(e=>e.id),approvedReviewerIds:n,requiredApprovals:1}])}let h=p.map(e=>{let t=new Set(e.eligibleReviewerIds.filter(e=>e!==i.authorId)),r=new Set(e.poolKeys.flatMap(e=>[...c.get(e)??[]]));return{...e,eligibleReviewerIds:[...t],candidateReviewerIds:[...r].filter(e=>t.has(e)&&d.has(e)&&!s.has(e)&&!o.has(e)),approvedReviewerIds:l(e.approvedReviewerIds.filter(e=>t.has(e))),requestedReviewerIds:a.filter(e=>t.has(e))}}),m=new Set([...a,...n,...h.flatMap(e=>[...e.candidateReviewerIds,...e.approvedReviewerIds,...e.requestedReviewerIds])]);return{worktreeId:e,requestId:i.id,requestUrl:i.url,provider:t.provider,requestOpen:i.open,authorId:i.authorId,reviewers:[...d.values()].filter(e=>m.has(e.id)),requirements:h,currentReviewerIds:a,approvedReviewerIds:n,selectedReviewerIds:[],issues:[...t.issues,...t.discoveryComplete||t.requirements.length?[]:["General reviewer selection is available, but provider approval requirements could not be verified."]],discoveryComplete:t.discoveryComplete}}(e,r,await this.saved(i.repository.id));if(!a.requestOpen)throw Error("Pull or merge request is no longer open; refresh this worktree");return{...i,discovery:r,assignment:a}}async worktreeReviewerAssignment(e){return(await this.live(e)).assignment}async previewRandomWorktreeReviewers(e,t,r){let{assignment:i}=await this.live(e);return this.requireRequest(i,t),function(e,t=[],r=Math.random){let i=l(e.requirements.flatMap(e=>e.candidateReviewerIds)),a=new Set(i),n=new Set(t.filter(e=>a.has(e))),s=e=>new Set([...e.approvedReviewerIds,...e.requestedReviewerIds,...[...n].filter(t=>e.eligibleReviewerIds.includes(t))]).size;for(let e=i.length-1;e>0;e--){let t=Math.floor(r()*(e+1));[i[e],i[t]]=[i[t],i[e]]}for(let t of i)e.requirements.some(e=>s(e)<e.requiredApprovals&&e.candidateReviewerIds.includes(t))&&n.add(t);let o=e.requirements.flatMap(e=>{let t=Math.max(0,e.requiredApprovals-s(e));return t?[`${e.name}: ${t} more eligible reviewer${1===t?"":"s"} needed. Configure additional reviewers in repository settings.`]:[]});return{...e,selectedReviewerIds:[...n],issues:[...e.issues,...o]}}(i,r??[])}requireRequest(e,t){if(e.requestId!==t)throw Error("The pull or merge request has changed; reload reviewer options before assigning")}async assignWorktreeReviewers(e){let t=(this.assignments.get(e.worktreeId)??Promise.resolve()).catch(()=>void 0).then(async()=>{let{repository:t,locator:r,assignment:i}=await this.live(e.worktreeId);this.requireRequest(i,e.requestId);let a=l(e.reviewerIds);if(!a.length||a.length>1e3)throw Error("Select between 1 and 1,000 reviewers");let n=new Set(i.requirements.flatMap(e=>e.candidateReviewerIds)),s=new Set(i.currentReviewerIds);if(a.some(e=>!n.has(e)&&!s.has(e)))throw Error("A selected reviewer is no longer eligible; reload reviewer options before assigning");let o=a.filter(e=>!s.has(e));o.length&&await this.providers.assign(t,r,i.reviewers.filter(e=>o.includes(e.id))),await this.refreshWorktree?.(e.worktreeId).catch(()=>void 0),this.publish(t.id,e.worktreeId);try{return await this.worktreeReviewerAssignment(e.worktreeId)}catch{let e=l([...i.currentReviewerIds,...o]);return{...i,currentReviewerIds:e,requirements:i.requirements.map(t=>({...t,candidateReviewerIds:t.candidateReviewerIds.filter(e=>!o.includes(e)),requestedReviewerIds:e.filter(e=>t.eligibleReviewerIds.includes(e))})),issues:[...i.issues,"Review requests were sent. Reload reviewer options to refresh provider status."]}}});this.assignments.set(e.worktreeId,t);try{return await t}finally{this.assignments.get(e.worktreeId)===t&&this.assignments.delete(e.worktreeId)}}publish(e,t=null){o._H.publish(o.aA,{codebaseOverviewChanged:{repositoryId:e,codebaseId:null}}),o._H.publish(o.MA,{worktreeOverviewChanged:{worktreeId:t,codebaseId:null}})}},"k",0,c])},180201,e=>{var t=e.i(53803),r=e.i(264977);function i(e){return e&&"object"==typeof e&&"message"in e&&"string"==typeof e.message?e.message:String(e)}function a(e,t,r,a){e.newFunction(r,r=>{let n=r?JSON.parse(e.getString(r)):null,s=e.newPromise();return t.add(s),Promise.resolve().then(()=>a(n)).then(e=>({ok:!0,value:e}),e=>({ok:!1,error:i(e)})).then(r=>{s.alive&&e.alive&&(e.newString(JSON.stringify(r)).consume(e=>s.resolve(e)),t.delete(s),s.dispose(),e.runtime.executePendingJobs().dispose())}).catch(()=>{}),s.handle}).consume(t=>e.setProp(e.global,r,t))}async function n(e){if(!e.body)return"";let t=e.body.getReader(),r=[],i=0;for(;;){let{done:e,value:a}=await t.read();if(e)break;if((i+=a.byteLength)>0xa00000)throw await t.cancel(),Error("Script fetch response exceeded 10 MiB");r.push(a)}let a=new Uint8Array(i),n=0;for(let e of r)a.set(e,n),n+=e.byteLength;return new TextDecoder().decode(a)}let s=String.raw`
|
|
885
|
+
}`,{path:I.path_with_namespace,iid:String(e)}),r=t.project?.mergeRequest?.approvalState.rules;if(!r)throw Error("GitLab did not return the merge request approval rules");return r},J=(e,t)=>{let r=e.sourceRule?.id??e.id;return e.sourceRule||r.includes("ApprovalProjectRule/")?`${k}:rule:${b(r)}`:`${k}:mr:${t}:rule:${b(e.id)}`};if(C){let e=new Set;try{for(let t of(await W(C.iid))){let r,i=t.type.toLowerCase(),a="any_approver"===i?U:(t.eligibleApprovers??[]).filter(d).map(c),n=(t.approvedBy?.nodes??[]).map(c);z.push(...n),t.approvedBy?.pageInfo?.hasNextPage&&R(`Approvals for ${t.name} are incomplete`,Error("GitLab returned more than 100 approving users"));let s=t.approvalsRequired,o=t.name,l="code_owner"===i?t.patterns?.length?t.patterns:[t.name]:[];if("code_owner"===i)r=[...new Set(l.flatMap(r=>{let i=`${(t.section??"codeowners").toLowerCase()}\0${r}`;e.add(i);let a=B.get(i);return a?[a]:[]}))],0===r.length&&R(`Code owner rule ${t.name} cannot be mapped`,Error("Refresh the target branch CODEOWNERS configuration")),0===s&&(s=1,o=`Suggested code owners \xb7 ${t.name}`);else{let e=J(t,C.id);m(L,{key:e,name:t.name,kind:"APPROVAL_RULE",candidates:a}),r=[e]}H.push({id:t.id,name:o,isRequired:t.approvalsRequired>0,patterns:l,poolKeys:r,eligibleReviewerIds:a.map(e=>e.id),requiredApprovals:s,approvedReviewerIds:n.map(e=>e.id)})}}catch(e){R("GitLab merge request approval rules could not be loaded",e)}try{let e=await v(`${w}/merge_requests/${C.iid}/approvals`);z.push(...(e.approved_by??[]).map(e=>c(e.user)))}catch(e){R("GitLab current approvals could not be loaded",e)}if(M.length)try{let t=await S(`${w}/merge_requests/${C.iid}/diffs`);C.changes_count&&/^\d+$/.test(C.changes_count)&&Number(C.changes_count)>t.length&&R("GitLab changed files are incomplete",Error("The merge request exceeds the provider diff-list limit"));let r=[...new Set(t.flatMap(e=>[e.new_path,e.old_path]).filter(Boolean))];for(let t of l(M,r)){let r=`${t.section}\0${t.pattern}`;if(e.has(r))continue;let i=B.get(r),a=i?L.get(i):null;i&&a?.candidates.length&&H.push({id:`gitlab:suggested:${r}`,name:`Suggested code owners \xb7 ${t.pattern}`,isRequired:!1,patterns:[t.pattern],poolKeys:[i],eligibleReviewerIds:a.candidates.map(e=>e.id),requiredApprovals:1,approvedReviewerIds:z.map(e=>e.id)})}}catch(e){R("GitLab changed files for ownership suggestions could not be loaded",e)}}else try{let e=await S(`${w}/merge_requests`,{state:"opened",scope:"all"});await (0,t.f)(e,async e=>{try{for(let t of(await W(e.iid))){if("code_owner"===t.type.toLowerCase())continue;let r=J(t,e.id);if(!r.includes(`:mr:${e.id}:`))continue;let i="any_approver"===t.type.toLowerCase()?U:(t.eligibleApprovers??[]).filter(d).map(c);m(L,{key:r,name:`!${e.iid} \xb7 ${t.name}`,kind:"APPROVAL_RULE",candidates:i})}}catch(t){R(`GitLab approval groups for !${e.iid} could not be loaded`,t)}})}catch(e){R("GitLab open merge request approval groups could not be loaded",e)}return{provider:"GITLAB",repositoryIdentity:k,ref:T,defaultRef:I.default_branch,refs:[...new Set([I.default_branch,T,...D])],pools:[...L.values()],requirements:H,issues:[...new Set(_)],discoveryComplete:A,...C?{request:{id:i.id,number:C.iid,url:C.web_url,open:"opened"===C.state,authorId:String(C.author.id),baseRef:C.target_branch,headSha:C.sha,currentReviewers:p((C.reviewers??[]).map(c)),approvedReviewers:p(z)}}:{}}}async assign(e,t,r){let i=await this.service.projectForCanonicalOrigin(e.canonicalOrigin);if(!i||t.projectId&&t.projectId!==i.id)throw Error("Merge request project does not match reviewer settings");await this.service.addMergeRequestReviewers({projectId:i.id,iid:t.number,expectedId:b(t.id),reviewerIds:r.map(e=>e.id)})}}e.s(["f",0,class{github;gitlab;constructor(e,t){this.github=new w(e),this.gitlab=new v(t)}discover(e,t,r,i=!1){return/^github\.com\//i.test(e.canonicalOrigin)?this.github.discover(e,t,r,i):this.gitlab.discover(e,t,r,i)}assign(e,t,r){return/^github\.com\//i.test(e.canonicalOrigin)?this.github.assign(e,t,r):this.gitlab.assign(e,t,r)}}],65899)},806098,e=>{var t=e.i(666680),r=e.i(243783),i=e.i(971724),a=e.i(105954),n=e.i(455744),s=e.i(604147);e.i(805422);var o=e.i(661983);let l=e=>[...new Set(e)],u=i.z.object({id:a.z.string().min(1).max(500),username:a.z.string().max(500),name:a.z.string().max(500),avatarUrl:a.z.string().max(4e3).nullable(),url:a.z.string().max(4e3).nullable()}).strict(),c=n.z.array(i.z.object({key:a.z.string().min(1).max(2e3),name:a.z.string().max(2e3),kind:s.z.enum(["GENERAL","CODEOWNERS","APPROVAL_RULE"]),provider:s.z.enum(["GITHUB","GITLAB"]),repositoryIdentity:a.z.string().min(1).max(2e3),ref:a.z.string().max(1e3),reviewers:n.z.array(u).max(1e3)}).strict()).max(500),d=e=>({id:e.userId,username:e.username,name:e.name,avatarUrl:e.avatarUrl,url:e.url});e.s(["w",0,class{providers;refreshWorktree;assignments;constructor(e,t){this.providers=e,this.refreshWorktree=t,this.assignments=new Map}async repository(e){let t=await (0,r.U)(),i=await t.codebaseRepository.findUnique({where:{id:e}});if(!i)throw Error("Repository not found");return i}async saved(e){return(await (0,r.U)()).repositoryReviewerPool.findMany({where:{repositoryId:e},include:{members:!0},orderBy:{key:"asc"}})}async repositoryCodeReviewers(e,t,r=!1){let i=await this.repository(e),[a,n]=await Promise.all([this.providers.discover(i,t??void 0,void 0,r),this.saved(e)]),s=new Map(n.map(e=>[e.key,e])),o=a.pools.map(e=>{let t=s.get(e.key);s.delete(e.key);let r=new Set(e.candidates.map(e=>e.id)),i=t?.members.map(e=>e.userId)??[];return{...e,selectedReviewerIds:i,unavailableReviewerIds:i.filter(e=>t?.repositoryIdentity!==a.repositoryIdentity||!r.has(e))}});for(let e of s.values())o.push({key:e.key,name:e.name,kind:e.kind,candidates:[],selectedReviewerIds:e.members.map(e=>e.userId),unavailableReviewerIds:e.members.map(e=>e.userId)});return{repositoryId:e,...a,pools:o}}async saveRepositoryCodeReviewers(e){if(e.pools.length>500)throw Error("At most 500 reviewer pools can be saved at once");let t=await this.repository(e.repositoryId),[i,a]=await Promise.all([this.providers.discover(t,e.ref??void 0,void 0,!0),this.saved(t.id)]),n=this.validatePools(e.pools,i,a),s=await (0,r.U)();return await s.$transaction(async e=>{await this.writePools(e,t.id,i,n),await this.updateConfiguredFlag(e,t.id)}),this.publish(t.id),this.repositoryCodeReviewers(t.id,e.ref)}validatePools(e,t,r=[]){let i=new Map(t.pools.map(e=>[e.key,e])),a=new Map(r.map(e=>[e.key,e])),n=new Set;return e.map(e=>{if(!e.key||e.key.length>2e3||n.has(e.key))throw Error("Reviewer pool keys must be unique");if(n.add(e.key),e.reviewerIds.length>1e3)throw Error("At most 1,000 reviewers can be selected per pool");let r=i.get(e.key),s=a.get(e.key);if(!r&&!s&&e.reviewerIds.length)throw Error("Reviewer group is no longer available; refresh repository settings");let o=new Map(r?.candidates.map(e=>[e.id,e])??[]);if(s?.repositoryIdentity===t.repositoryIdentity)for(let e of s.members)o.has(e.userId)||o.set(e.userId,d(e));let u=l(e.reviewerIds).map(e=>{let t=o.get(e);if(!t)throw Error("A selected reviewer is no longer eligible; refresh repository settings");return t});return{key:e.key,name:r?.name??s?.name??e.key,kind:r?.kind??s?.kind??"GENERAL",discoveryRef:r?t.ref:s?.discoveryRef??t.ref,members:u}})}async writePools(e,r,i,a){for(let n of a){if(!n.members.length){await e.repositoryReviewerPool.deleteMany({where:{repositoryId:r,key:n.key}});continue}let a=await e.repositoryReviewerPool.upsert({where:{repositoryId_key:{repositoryId:r,key:n.key}},create:{id:(0,t.randomUUID)(),repositoryId:r,key:n.key,name:n.name,kind:n.kind,provider:i.provider,repositoryIdentity:i.repositoryIdentity,discoveryRef:n.discoveryRef},update:{name:n.name,kind:n.kind,provider:i.provider,repositoryIdentity:i.repositoryIdentity,discoveryRef:n.discoveryRef}});await e.repositoryReviewerMember.deleteMany({where:{poolId:a.id}}),await e.repositoryReviewerMember.createMany({data:n.members.map(({id:e,...t})=>({poolId:a.id,userId:e,...t}))})}}async updateConfiguredFlag(e,t){let r=await e.repositoryReviewerMember.count({where:{pool:{repositoryId:t}}});await e.codebaseRepository.update({where:{id:t},data:{hasConfiguredCodeReviewers:r>0,updatedAt:new Date}})}async exportPools(e){return(await this.saved(e)).map(e=>({key:e.key,name:e.name,kind:e.kind,provider:e.provider,repositoryIdentity:e.repositoryIdentity,ref:e.discoveryRef,reviewers:e.members.map(d)}))}async validateTransferredPools(e,t){let r=c.parse(t),i=new Map,a=[];for(let t of r){let r=i.get(t.ref);r||(r=await this.providers.discover(e,t.ref||void 0,void 0,!0),i.set(t.ref,r));let n=e=>e.slice(0,e.lastIndexOf(":"));if(t.provider!==r.provider||n(t.repositoryIdentity)!==n(r.repositoryIdentity)||!t.key.startsWith(`${t.repositoryIdentity}:`))throw Error("Reviewer pools belong to a different provider instance. Deselect Code reviewers in this import and configure reviewers in the destination repository.");let s=`${r.repositoryIdentity}${t.key.slice(t.repositoryIdentity.length)}`,o=r.pools.find(e=>e.key===s),l=new Map(o?.candidates.map(e=>[e.id,e])??[]);if(!o||t.reviewers.some(e=>!l.has(e.id)))throw Error(`Reviewer group ${t.name} or one of its people cannot be resolved at the destination. Deselect Code reviewers in this import and configure reviewers in the destination repository.`);a.push({key:s,name:o.name,kind:o.kind,provider:r.provider,repositoryIdentity:r.repositoryIdentity,ref:r.ref,reviewers:t.reviewers.map(e=>l.get(e.id))})}if(new Set(a.map(e=>e.key)).size!==a.length)throw Error("Imported reviewer pools contain duplicate groups");return a}async applyTransferredPools(e,t,r){for(let i of(await e.repositoryReviewerPool.deleteMany({where:{repositoryId:t}}),r))await this.writePools(e,t,{provider:i.provider,repositoryIdentity:i.repositoryIdentity},[{...i,discoveryRef:i.ref,members:i.reviewers}]);await this.updateConfiguredFlag(e,t)}async context(e,t=!0){let i=await (0,r.U)(),a=await i.worktree.findUnique({where:{id:e},include:{codebase:{include:{repository:!0}},pullRequest:!0,gitLabMergeRequest:!0}});if(!a)throw Error("Worktree not found");let n=a.codebase.repository;if(t&&!n.hasConfiguredCodeReviewers)throw Error("Configure code reviewers in repository settings first");let s=a.gitLabMergeRequest,o=a.pullRequest,l=s?.sourceBranch??o?.headRefName;if(!a.branch||l!==a.branch||a.pullRequestLookupBranch!==a.branch||a.pullRequestLookupOrigin?.toLowerCase()!==n.canonicalOrigin.toLowerCase())throw Error("The worktree branch or repository has changed; refresh the linked pull or merge request");let u=s?{id:s.gitlabId,number:s.iid,projectId:s.projectId}:o?{id:o.githubId,number:o.number}:null;if(!u)throw Error("Worktree does not have a linked pull or merge request");return{worktree:a,repository:n,locator:u}}async discoverRequest(e,t=!0){let r=await this.context(e,t),i=await this.providers.discover(r.repository,void 0,r.locator,!0),a=await this.context(e,t);if(a.locator.id!==r.locator.id||a.locator.number!==r.locator.number||a.locator.projectId!==r.locator.projectId||a.repository.id!==r.repository.id||a.repository.canonicalOrigin.toLowerCase()!==r.repository.canonicalOrigin.toLowerCase()||a.worktree.branch!==r.worktree.branch)throw Error("The linked pull or merge request has changed; reload review details");return{...a,discovery:i}}async worktreeReviewStatus(e){let{discovery:t}=await this.discoverRequest(e,!1);return function(e,t){let r=t.request;if(!r)throw Error("Pull or merge request was not found");let i=l(r.currentReviewers.map(e=>e.id)),a=l(r.approvedReviewers.map(e=>e.id)),n=new Map(t.pools.map(e=>[e.key,e])),s=new Map([...t.pools.flatMap(e=>e.candidates),...r.currentReviewers,...r.approvedReviewers].map(e=>[e.id,e])),o=t.requirements.map(e=>{let a=new Set(e.eligibleReviewerIds.filter(e=>"GITHUB"!==t.provider||e!==r.authorId));return{id:e.id,name:e.name,isRequired:e.isRequired,patterns:e.patterns,requiredApprovals:e.isRequired?e.requiredApprovals:0,groups:l(e.poolKeys).flatMap(e=>{let t=n.get(e);return t?[{key:e,name:t.name,kind:t.kind}]:[]}),eligibleReviewerIds:[...a],approvedReviewerIds:l(e.approvedReviewerIds.filter(e=>a.has(e))),requestedReviewerIds:i.filter(e=>a.has(e))}}),u=new Set([...i,...a,...o.flatMap(e=>e.eligibleReviewerIds)]);return{worktreeId:e,requestId:r.id,requestUrl:r.url,provider:t.provider,requestOpen:r.open,reviewers:[...s.values()].filter(e=>u.has(e.id)),currentReviewerIds:i,approvedReviewerIds:a,requirements:o,issues:t.issues,discoveryComplete:t.discoveryComplete}}(e,t)}async live(e){let t=await this.discoverRequest(e),{discovery:r}=t,i=function(e,t,r){let i=t.request;if(!i)throw Error("Pull or merge request was not found");let a=l(i.currentReviewers.map(e=>e.id)),n=l(i.approvedReviewers.map(e=>e.id)),s=new Set(a),o=new Set(n),u=new Map(t.pools.map(e=>[e.key,new Set(e.candidates.map(e=>e.id))])),c=new Map(r.filter(e=>e.repositoryIdentity===t.repositoryIdentity).map(e=>[e.key,new Set(e.members.map(e=>e.userId).filter(t=>u.get(e.key)?.has(t)))])),d=new Map([...t.pools.flatMap(e=>e.candidates),...i.currentReviewers,...i.approvedReviewers].map(e=>[e.id,e])),p=t.requirements;if(!p.length){let e=t.pools.find(e=>"GENERAL"===e.kind);e&&(p=[{id:"general-reviewers",name:"General reviewers",isRequired:!1,patterns:[],poolKeys:[e.key],eligibleReviewerIds:e.candidates.map(e=>e.id),approvedReviewerIds:n,requiredApprovals:1}])}let h=p.map(e=>{let t=new Set(e.eligibleReviewerIds.filter(e=>e!==i.authorId)),r=new Set(e.poolKeys.flatMap(e=>[...c.get(e)??[]]));return{...e,eligibleReviewerIds:[...t],candidateReviewerIds:[...r].filter(e=>t.has(e)&&d.has(e)&&!s.has(e)&&!o.has(e)),approvedReviewerIds:l(e.approvedReviewerIds.filter(e=>t.has(e))),requestedReviewerIds:a.filter(e=>t.has(e))}}),m=new Set([...a,...n,...h.flatMap(e=>[...e.candidateReviewerIds,...e.approvedReviewerIds,...e.requestedReviewerIds])]);return{worktreeId:e,requestId:i.id,requestUrl:i.url,provider:t.provider,requestOpen:i.open,authorId:i.authorId,reviewers:[...d.values()].filter(e=>m.has(e.id)),requirements:h,currentReviewerIds:a,approvedReviewerIds:n,selectedReviewerIds:[],issues:[...t.issues,...t.discoveryComplete||t.requirements.length?[]:["General reviewer selection is available, but provider approval requirements could not be verified."]],discoveryComplete:t.discoveryComplete}}(e,r,await this.saved(t.repository.id));if(!i.requestOpen)throw Error("Pull or merge request is no longer open; refresh this worktree");return{...t,assignment:i}}async worktreeReviewerAssignment(e){return(await this.live(e)).assignment}async previewRandomWorktreeReviewers(e,t,r){let{assignment:i}=await this.live(e);return this.requireRequest(i,t),function(e,t=[],r=Math.random){let i=l(e.requirements.flatMap(e=>e.candidateReviewerIds)),a=new Set(i),n=new Set(t.filter(e=>a.has(e))),s=e=>new Set([...e.approvedReviewerIds,...e.requestedReviewerIds,...[...n].filter(t=>e.eligibleReviewerIds.includes(t))]).size;for(let e=i.length-1;e>0;e--){let t=Math.floor(r()*(e+1));[i[e],i[t]]=[i[t],i[e]]}for(let t of i)e.requirements.some(e=>s(e)<e.requiredApprovals&&e.candidateReviewerIds.includes(t))&&n.add(t);let o=e.requirements.flatMap(e=>{let t=Math.max(0,e.requiredApprovals-s(e));return t?[`${e.name}: ${t} more eligible reviewer${1===t?"":"s"} needed. Configure additional reviewers in repository settings.`]:[]});return{...e,selectedReviewerIds:[...n],issues:[...e.issues,...o]}}(i,r??[])}requireRequest(e,t){if(e.requestId!==t)throw Error("The pull or merge request has changed; reload reviewer options before assigning")}async assignWorktreeReviewers(e){let t=(this.assignments.get(e.worktreeId)??Promise.resolve()).catch(()=>void 0).then(async()=>{let{repository:t,locator:r,assignment:i}=await this.live(e.worktreeId);this.requireRequest(i,e.requestId);let a=l(e.reviewerIds);if(!a.length||a.length>1e3)throw Error("Select between 1 and 1,000 reviewers");let n=new Set(i.requirements.flatMap(e=>e.candidateReviewerIds)),s=new Set(i.currentReviewerIds);if(a.some(e=>!n.has(e)&&!s.has(e)))throw Error("A selected reviewer is no longer eligible; reload reviewer options before assigning");let o=a.filter(e=>!s.has(e));o.length&&await this.providers.assign(t,r,i.reviewers.filter(e=>o.includes(e.id))),await this.refreshWorktree?.(e.worktreeId).catch(()=>void 0),this.publish(t.id,e.worktreeId);try{return await this.worktreeReviewerAssignment(e.worktreeId)}catch{let e=l([...i.currentReviewerIds,...o]);return{...i,currentReviewerIds:e,requirements:i.requirements.map(t=>({...t,candidateReviewerIds:t.candidateReviewerIds.filter(e=>!o.includes(e)),requestedReviewerIds:e.filter(e=>t.eligibleReviewerIds.includes(e))})),issues:[...i.issues,"Review requests were sent. Reload reviewer options to refresh provider status."]}}});this.assignments.set(e.worktreeId,t);try{return await t}finally{this.assignments.get(e.worktreeId)===t&&this.assignments.delete(e.worktreeId)}}publish(e,t=null){o._H.publish(o.aA,{codebaseOverviewChanged:{repositoryId:e,codebaseId:null}}),o._H.publish(o.MA,{worktreeOverviewChanged:{worktreeId:t,codebaseId:null}})}},"k",0,c])},180201,e=>{var t=e.i(53803),r=e.i(264977);function i(e){return e&&"object"==typeof e&&"message"in e&&"string"==typeof e.message?e.message:String(e)}function a(e,t,r,a){e.newFunction(r,r=>{let n=r?JSON.parse(e.getString(r)):null,s=e.newPromise();return t.add(s),Promise.resolve().then(()=>a(n)).then(e=>({ok:!0,value:e}),e=>({ok:!1,error:i(e)})).then(r=>{s.alive&&e.alive&&(e.newString(JSON.stringify(r)).consume(e=>s.resolve(e)),t.delete(s),s.dispose(),e.runtime.executePendingJobs().dispose())}).catch(()=>{}),s.handle}).consume(t=>e.setProp(e.global,r,t))}async function n(e){if(!e.body)return"";let t=e.body.getReader(),r=[],i=0;for(;;){let{done:e,value:a}=await t.read();if(e)break;if((i+=a.byteLength)>0xa00000)throw await t.cancel(),Error("Script fetch response exceeded 10 MiB");r.push(a)}let a=new Uint8Array(i),n=0;for(let e of r)a.set(e,n),n+=e.byteLength;return new TextDecoder().decode(a)}let s=String.raw`
|
|
886
886
|
class HeaderBag {
|
|
887
887
|
constructor(values = [], readOnly = false) { this.values = Array.isArray(values) ? values.map(({name, value}) => ({name: String(name), value: String(value)})) : []; this.readOnly = readOnly; }
|
|
888
888
|
assertMutable() { if (this.readOnly) throw new TypeError("Original request headers are read-only"); }
|