@ai-development-environment/server 0.0.84 → 0.0.86
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 +4 -2
- package/standalone/.next/BUILD_ID +1 -1
- package/standalone/.next/build-manifest.json +3 -3
- package/standalone/.next/node_modules/re2-332e07f5b609c24b/index.cjs +1 -0
- package/standalone/.next/node_modules/re2-332e07f5b609c24b/package.json +4 -0
- package/standalone/.next/prerender-manifest.json +3 -3
- package/standalone/.next/required-server-files.json +3 -2
- package/standalone/.next/server/app/[locale]/(auth)/register/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(auth)/sign-in/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/actions/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/actions-cache/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/agents/[id]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/agents/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/analytics-events/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/api-keys/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/apps/[appId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/apps/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/build-data/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/builds/[buildId]/coverage/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/builds/[buildId]/output/route.js +2 -2
- package/standalone/.next/server/app/[locale]/(dashboard)/builds/[buildId]/output/route.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/builds/[buildId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/builds/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/changes/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/codebases/[codebaseId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/codebases/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/codebases/repositories/[repositoryId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/commands/[commandId]/edit/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/commands/new/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/commands/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/commands/runs/[runId]/output/route.js +2 -2
- package/standalone/.next/server/app/[locale]/(dashboard)/commands/runs/[runId]/output/route.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/commands/runs/[runId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/comments/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/console-logs/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/costs/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/credentials/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/devices/[id]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/devices/enroll/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/devices/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/drafts/page.js.nft.json +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/page.js.nft.json +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/page.js.nft.json +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/tickets/[issueKey]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/jira-webhooks/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/jobs/[jobId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/notifications/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/plans/[runId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/plans/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/polling/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/provisioning-profiles/[profileId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/provisioning-profiles/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/pull-requests/[owner]/[repository]/[number]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/pull-requests/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/push-notifications/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/runs/new/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/sessions/[runId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/sessions/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/settings/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/skills/[skillId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/skills/groups/[groupId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/skills/groups/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/skills/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/skills/sync/[runId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/tools/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/unified-events/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/usage/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/users/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/webhooks/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/workflows/[workflowId]/edit/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/workflows/[workflowId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/workflows/new/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/workflows/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/workflows/runs/[runId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/worktrees/[worktreeId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/(dashboard)/worktrees/page.js.nft.json +1 -1
- package/standalone/.next/server/app/_global-error/page.js.nft.json +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/_head.segment.rsc +1 -1
- package/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/standalone/.next/server/app/_not-found/page.js.nft.json +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/_head.segment.rsc +1 -1
- package/standalone/.next/server/app/_not-found.segments/_index.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/_not-found.segment.rsc +1 -1
- package/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
- package/standalone/.next/server/app/api/agent/run-attachments/[attachmentId]/route.js +2 -2
- package/standalone/.next/server/app/api/agent/run-attachments/[attachmentId]/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/auth/[...all]/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/auth/config/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/auth/management/api-keys/[keyId]/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/auth/management/api-keys/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/auth/management/registration/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/auth/management/sessions/[sessionId]/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/auth/management/users/[userId]/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/auth/management/users/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/auth/mobile/oauth/complete/route.js +3 -3
- package/standalone/.next/server/app/api/auth/mobile/oauth/complete/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/auth/mobile/oauth/start/route.js +6 -6
- package/standalone/.next/server/app/api/auth/mobile/oauth/start/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/auth/mobile/redeem/route.js +6 -6
- package/standalone/.next/server/app/api/auth/mobile/redeem/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/build-artifact-uploads/[uploadId]/route.js +2 -2
- 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 +2 -2
- package/standalone/.next/server/app/api/codebases/by-path/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/codebases/route.js +2 -2
- package/standalone/.next/server/app/api/codebases/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/graphql/route.js +2 -2
- package/standalone/.next/server/app/api/graphql/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/ios/apns-devices/route.js +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- package/standalone/.next/server/app/api/ios/notification-devices/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/mcp/route.js +2 -2
- package/standalone/.next/server/app/api/mcp/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/openapi.json/route.js +1 -1
- package/standalone/.next/server/app/api/openapi.json/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/public/builds/[buildId]/artifacts/[artifactId]/manifest.plist/route.js +2 -2
- 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 +2 -2
- package/standalone/.next/server/app/api/public/builds/[buildId]/artifacts/[artifactId]/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/public/github/webhook/route.js +2 -2
- package/standalone/.next/server/app/api/public/github/webhook/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/public/ios/enrollment-complete/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/public/ios/enrollment-profile/route.js +2 -2
- 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 +2 -2
- 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 +2 -2
- package/standalone/.next/server/app/api/public/jira/webhook/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/telemetry/analytics-events/route.js +2 -2
- 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 +2 -2
- 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 +2 -2
- package/standalone/.next/server/app/api/telemetry/export/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/tools/call/route.js +2 -2
- package/standalone/.next/server/app/api/tools/call/route.js.nft.json +1 -1
- package/standalone/.next/server/app/api/tools/catalog/route.js +2 -2
- 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 +2 -2
- package/standalone/.next/server/app/api/worktrees/[worktreeId]/diff-image/route.js.nft.json +1 -1
- package/standalone/.next/server/app/icon.svg/route.js.nft.json +1 -1
- package/standalone/.next/server/chunks/{[root-of-the-server]__04i6ibl._.js → [root-of-the-server]__00awghn._.js} +1 -1
- package/standalone/.next/server/chunks/{[root-of-the-server]__06e1aai._.js → [root-of-the-server]__01fc8er._.js} +1 -1
- package/standalone/.next/server/chunks/{[root-of-the-server]__00xcg2c._.js → [root-of-the-server]__01s43cm._.js} +1 -1
- package/standalone/.next/server/chunks/{[root-of-the-server]__0-j_rt4._.js → [root-of-the-server]__01xz3y_._.js} +1 -1
- package/standalone/.next/server/chunks/{[root-of-the-server]__06gi27i._.js → [root-of-the-server]__021fex_._.js} +1 -1
- package/standalone/.next/server/chunks/{[root-of-the-server]__06jhhu1._.js → [root-of-the-server]__028j56p._.js} +1 -1
- package/standalone/.next/server/chunks/{[root-of-the-server]__0c_sj8k._.js → [root-of-the-server]__04_ohht._.js} +2 -2
- package/standalone/.next/server/chunks/{[root-of-the-server]__0c9kg5q._.js → [root-of-the-server]__04yufht._.js} +1 -1
- package/standalone/.next/server/chunks/{[root-of-the-server]__06uxp7s._.js → [root-of-the-server]__05-fxkh._.js} +1 -1
- package/standalone/.next/server/chunks/{[root-of-the-server]__14m_8nc._.js → [root-of-the-server]__06u7pdm._.js} +2 -2
- package/standalone/.next/server/chunks/{[root-of-the-server]__0072ye-._.js → [root-of-the-server]__06xlh28._.js} +1 -1
- package/standalone/.next/server/chunks/{[root-of-the-server]__0-hp8gw._.js → [root-of-the-server]__08c82jc._.js} +1 -1
- package/standalone/.next/server/chunks/{[root-of-the-server]__0712mqb._.js → [root-of-the-server]__08ebgcu._.js} +1 -1
- package/standalone/.next/server/chunks/{[root-of-the-server]__16ke6wr._.js → [root-of-the-server]__08lx09f._.js} +2 -2
- package/standalone/.next/server/chunks/{[root-of-the-server]__148dtoe._.js → [root-of-the-server]__096mlhl._.js} +2 -2
- package/standalone/.next/server/chunks/{[root-of-the-server]__00kj6r7._.js → [root-of-the-server]__09mo3t8._.js} +1 -1
- package/standalone/.next/server/chunks/{[root-of-the-server]__10bs2_7._.js → [root-of-the-server]__09svdrb._.js} +2 -2
- package/standalone/.next/server/chunks/{[root-of-the-server]__07vyiqy._.js → [root-of-the-server]__0_d2g94._.js} +1 -1
- package/standalone/.next/server/chunks/{[root-of-the-server]__1-l6iy9._.js → [root-of-the-server]__0al7x4f._.js} +2 -2
- package/standalone/.next/server/chunks/[root-of-the-server]__0c2tkz2._.js +3 -0
- package/standalone/.next/server/chunks/{[root-of-the-server]__05l4mi8._.js → [root-of-the-server]__0c4pqb-._.js} +1 -1
- package/standalone/.next/server/chunks/[root-of-the-server]__0cj65ti._.js +3 -0
- package/standalone/.next/server/chunks/{[root-of-the-server]__01885qr._.js → [root-of-the-server]__0d3awck._.js} +1 -1
- package/standalone/.next/server/chunks/{[root-of-the-server]__09yow0s._.js → [root-of-the-server]__0de_qut._.js} +1 -1
- package/standalone/.next/server/chunks/{[root-of-the-server]__1x35-d0._.js → [root-of-the-server]__0e31e7p._.js} +2 -2
- package/standalone/.next/server/chunks/[root-of-the-server]__0e53pce._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__0ecnp29._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__0eldrcp._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__0eopc38._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__0fo_msa._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__0gtwvjk._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__0h50ygv._.js +3 -0
- package/standalone/.next/server/chunks/{[root-of-the-server]__00t260s._.js → [root-of-the-server]__0hbjmzn._.js} +2 -2
- package/standalone/.next/server/chunks/[root-of-the-server]__0hffylr._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__0hvsuut._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__0inac5u._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__0jd56xd._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__0jjv2dl._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__0kbteue._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__0le7cki._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__0lu8r5i._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__0m5alcp._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__0mbymp_._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__0mi-xpq._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__0mx_l8j._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__0qkxjnh._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__0rgdw1t._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__0s_zc22._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__0sk_wpl._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__0sm_9x3._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__0uaej7i._.js +3 -0
- package/standalone/.next/server/chunks/{[root-of-the-server]__09jmuxh._.js → [root-of-the-server]__0v3wyan._.js} +2 -2
- package/standalone/.next/server/chunks/[root-of-the-server]__0wkgq45._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__0xbgjwj._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__0xsa1ko._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__0yg5tbe._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__0zcm8g9._.js +3 -0
- package/standalone/.next/server/chunks/{[root-of-the-server]__1dgyml6._.js → [root-of-the-server]__0zxvn5t._.js} +2 -2
- package/standalone/.next/server/chunks/{[root-of-the-server]__18xb4tw._.js → [root-of-the-server]__1-rtc2c._.js} +2 -2
- package/standalone/.next/server/chunks/[root-of-the-server]__10duq79._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__10n9aa8._.js +3 -0
- package/standalone/.next/server/chunks/{[root-of-the-server]__1mmah0v._.js → [root-of-the-server]__124au6p._.js} +2 -2
- package/standalone/.next/server/chunks/[root-of-the-server]__137wgug._.js +3 -0
- package/standalone/.next/server/chunks/{[root-of-the-server]__0x8mo8l._.js → [root-of-the-server]__13cy_hd._.js} +2 -2
- package/standalone/.next/server/chunks/[root-of-the-server]__13o2i1b._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1563rfp._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__15p0skc._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__15xfa5d._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__16q8nl1._.js +3 -0
- package/standalone/.next/server/chunks/{[root-of-the-server]__045vcsv._.js → [root-of-the-server]__16ur7du._.js} +2 -2
- package/standalone/.next/server/chunks/{[root-of-the-server]__1hlka6s._.js → [root-of-the-server]__17m0i74._.js} +2 -2
- package/standalone/.next/server/chunks/[root-of-the-server]__18crj_k._.js +3 -0
- package/standalone/.next/server/chunks/{[root-of-the-server]__0pjluwr._.js → [root-of-the-server]__19c_hrh._.js} +2 -2
- package/standalone/.next/server/chunks/{[root-of-the-server]__07sc4d6._.js → [root-of-the-server]__19lnrpb._.js} +3 -3
- package/standalone/.next/server/chunks/{[root-of-the-server]__1vx14af._.js → [root-of-the-server]__19miqxq._.js} +2 -2
- package/standalone/.next/server/chunks/[root-of-the-server]__19o8fio._.js +3 -0
- package/standalone/.next/server/chunks/{[root-of-the-server]__1hxh6f7._.js → [root-of-the-server]__19vmv0l._.js} +2 -2
- package/standalone/.next/server/chunks/{[root-of-the-server]__07b7x5c._.js → [root-of-the-server]__1_-bk8a._.js} +2 -2
- package/standalone/.next/server/chunks/[root-of-the-server]__1_87r0p._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1_x_z5z._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1a2a4dw._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1ai5a7b._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1aqix91._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1au8rl_._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1awqqwk._.js +3 -0
- package/standalone/.next/server/chunks/{[root-of-the-server]__0jrv5rz._.js → [root-of-the-server]__1b92e1t._.js} +2 -2
- package/standalone/.next/server/chunks/[root-of-the-server]__1bv5-_8._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1c80jly._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1cgwl7i._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1cnys8r._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1d4q9gf._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1e7vx35._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1he2uqp._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1hs29qq._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1hyz59c._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1id6lt6._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1ieaw8o._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1jehtjb._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1jnqgu8._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1k2tvfv._.js +3 -0
- package/standalone/.next/server/chunks/{[root-of-the-server]__0p1pt6i._.js → [root-of-the-server]__1kjpcz_._.js} +2 -2
- package/standalone/.next/server/chunks/[root-of-the-server]__1lulyuw._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1m1rllj._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1m91618._.js +3 -0
- package/standalone/.next/server/chunks/{[root-of-the-server]__0omg2wb._.js → [root-of-the-server]__1mki32r._.js} +2 -2
- package/standalone/.next/server/chunks/{[root-of-the-server]__0-3ib_g._.js → [root-of-the-server]__1n_ks5s._.js} +2 -2
- package/standalone/.next/server/chunks/{[root-of-the-server]__1n6euz5._.js → [root-of-the-server]__1nj39zt._.js} +2 -2
- package/standalone/.next/server/chunks/[root-of-the-server]__1o2p5d4._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1o59f9e._.js +3 -0
- package/standalone/.next/server/chunks/{[root-of-the-server]__05fsjsb._.js → [root-of-the-server]__1od6044._.js} +2 -2
- package/standalone/.next/server/chunks/[root-of-the-server]__1p32xvh._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1r19vvq._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1rtda2l._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1rup4sv._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1s5inmc._.js +3 -0
- package/standalone/.next/server/chunks/{[root-of-the-server]__15za52u._.js → [root-of-the-server]__1sajsif._.js} +6 -6
- package/standalone/.next/server/chunks/[root-of-the-server]__1seny2-._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1soccc1._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1u_dbg2._.js +3 -0
- package/standalone/.next/server/chunks/{[root-of-the-server]__0hz1a1g._.js → [root-of-the-server]__1uinol4._.js} +6 -6
- package/standalone/.next/server/chunks/[root-of-the-server]__1ulp98y._.js +3 -0
- package/standalone/.next/server/chunks/{[root-of-the-server]__0chticn._.js → [root-of-the-server]__1utpbf1._.js} +2 -2
- package/standalone/.next/server/chunks/[root-of-the-server]__1wf1339._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1x2ubky._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1xehef8._.js +3 -0
- package/standalone/.next/server/chunks/{[root-of-the-server]__1btz1fo._.js → [root-of-the-server]__1y343im._.js} +2 -2
- package/standalone/.next/server/chunks/{[root-of-the-server]__1x5laf2._.js → [root-of-the-server]__1yvqocu._.js} +2 -2
- package/standalone/.next/server/chunks/[root-of-the-server]__1yx0w43._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1yxkfi6._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1yye_uk._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__20du-cr._.js +3 -0
- package/standalone/.next/server/chunks/_01qtprx._.js +2 -2
- package/standalone/.next/server/chunks/_046r0fu._.js +1 -1
- package/standalone/.next/server/chunks/_0ap-sk4._.js +2 -2
- package/standalone/.next/server/chunks/_0km--pu._.js +1 -1
- package/standalone/.next/server/chunks/_19unz3y._.js +2 -2
- package/standalone/.next/server/chunks/_1e2b7v9._.js +1 -1
- package/standalone/.next/server/chunks/src_0o4-snj._.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/server-reference-manifest.js +1 -1
- package/standalone/.next/server/server-reference-manifest.json +1 -1
- package/standalone/package.json +3 -2
- package/standalone/server.js +1 -1
- package/standalone/.next/node_modules/re2-wasm-15fb420cc00a67dd/build/src/re2.js +0 -524
- package/standalone/.next/node_modules/re2-wasm-15fb420cc00a67dd/build/wasm/re2.js +0 -4570
- package/standalone/.next/node_modules/re2-wasm-15fb420cc00a67dd/build/wasm/re2.wasm +0 -0
- package/standalone/.next/node_modules/re2-wasm-15fb420cc00a67dd/package.json +0 -41
- package/standalone/.next/server/chunks/[root-of-the-server]__0_w-xej._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__0_y2v1j._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__0aars58._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__0ah_4rn._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__0axp9e2._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__0cwh1ob._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__0e6bqw-._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__0emkieo._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__0eqx3gx._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__0ez1ocj._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__0fpszsc._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__0fq5bqy._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__0fqft-4._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__0g2wp1c._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__0gvtj-n._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__0i85me2._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__0igsl3a._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__0k60y67._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__0niddrw._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__0nrktjf._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__0pgnk-c._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__0rkz4xn._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__0slps8j._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__0tudmvl._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__0u4_0hk._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__0vaokmk._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__0xomcdl._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__0xrriyl._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__0yhie6j._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__0yifxv-._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1-c37l2._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1-vnrg_._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__11r-5pu._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__12-cmv0._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__122sose._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__12_lxrq._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__12z-5e1._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1355z93._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__144k8e_._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__146ijbu._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__15dlw94._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__15epdi9._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__16a0le5._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__16paa96._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__17ry7s4._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__18m2a8z._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__18rxly1._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1_vhxix._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1_z6940._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1amwlm1._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1cncn_q._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1d8-kbp._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1fg8n77._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1fqhm93._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1h2n8mc._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1hy86s1._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1id0o8p._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1j1yxy_._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1kwbhuu._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1laf08m._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1myrk79._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1n3zakh._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1o7yplz._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1ohwk3-._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1onn1-5._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1pwcu28._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1q229ru._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1qtezlb._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1r6w6uj._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1rib6n3._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1sh_vn6._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1sx7rzl._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1taelgv._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1ts1wiq._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1uy4hea._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1uzbqwa._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1x6_y8g._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1xt0qaw._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1y1cne4._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1y6j2wu._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1y7j7qr._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1yj3ck2._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__1ym73v7._.js +0 -3
- package/standalone/.next/server/chunks/[root-of-the-server]__218z_cj._.js +0 -3
- package/standalone/node_modules/re2-wasm/build/src/re2.js +0 -524
- package/standalone/node_modules/re2-wasm/build/wasm/re2.js +0 -4570
- package/standalone/node_modules/re2-wasm/build/wasm/re2.wasm +0 -0
- package/standalone/node_modules/re2-wasm/package.json +0 -41
- /package/standalone/.next/static/{9QiT0UQel9_P_z1ZucOq8 → VtuJ7hYfYlpY0_SOZN0oX}/_buildManifest.js +0 -0
- /package/standalone/.next/static/{9QiT0UQel9_P_z1ZucOq8 → VtuJ7hYfYlpY0_SOZN0oX}/_clientMiddlewareManifest.js +0 -0
- /package/standalone/.next/static/{9QiT0UQel9_P_z1ZucOq8 → VtuJ7hYfYlpY0_SOZN0oX}/_ssgManifest.js +0 -0
|
@@ -12271,7 +12271,7 @@ ${r}
|
|
|
12271
12271
|
${r}
|
|
12272
12272
|
~~~`}},I_=class{constructor(){(0,pe.__publicField)(this,"nodeType","blockquote")}toMarkdown(e,t){if(!e.content||0===e.content.length)return"> ";let A=e.content.map(A=>{let r=t.options.registry?.getNodeConverter(A.type);return r?r.toMarkdown(A,{...t,depth:t.depth+1,parent:e}):""}).join("\n").split("\n").map(e=>""===e.trim()?">":`> ${e}`);if(e.attrs&&Object.keys(e.attrs).length>0){let t=A.join("\n");return`${t}<!-- adf:blockquote attrs='${JSON.stringify(e.attrs)}' -->`}return A.join("\n")}},IV=class{constructor(){(0,pe.__publicField)(this,"nodeType","rule")}toMarkdown(e,t){return"---"}},IP=class{constructor(){(0,pe.__publicField)(this,"nodeType","hardBreak")}toMarkdown(e,t){return" \n"}},IL=class{constructor(){(0,pe.__publicField)(this,"nodeType","mention")}toMarkdown(e,t){let{id:A,text:r,userType:i}=e.attrs||{},n=`adf://mention/${A||"unknown"}`,a=r||`@${A||"unknown"}`;if(e.attrs&&Object.keys(e.attrs).length>0){let t=`<!-- adf:mention attrs='${JSON.stringify(e.attrs)}' -->`;return`[${a}](${n})${t}`}return`[${a}](${n})`}},IH=class{constructor(){(0,pe.__publicField)(this,"nodeType","date")}toMarkdown(e,t){let{timestamp:A}=e.attrs||{};if(!A)return"[Date]";let r=new Date(parseInt(A));if(isNaN(r.getTime())){if(e.attrs&&Object.keys(e.attrs).length>0){let t=`<!-- adf:date attrs='${JSON.stringify(e.attrs)}' -->`;return`[Invalid Date]${t}`}return"[Invalid Date]"}let i=r.toISOString().split("T")[0];if(e.attrs&&Object.keys(e.attrs).length>0){let t=`<!-- adf:date attrs='${JSON.stringify(e.attrs)}' -->`;return`${i}${t}`}return i}},Ij=class{constructor(){(0,pe.__publicField)(this,"nodeType","emoji")}toMarkdown(e,t){let{shortName:A,text:r}=e.attrs||{};if(r){if(e.attrs&&Object.keys(e.attrs).length>0){let t=`<!-- adf:emoji attrs='${JSON.stringify(e.attrs)}' -->`;return`${r}${t}`}return r}if(A){let t=A.startsWith(":")&&A.endsWith(":")?A:`:${A}:`;if(e.attrs&&Object.keys(e.attrs).length>0){let A=`<!-- adf:emoji attrs='${JSON.stringify(e.attrs)}' -->`;return`${t}${A}`}return t}return":emoji:"}},Iq=class{constructor(){(0,pe.__publicField)(this,"nodeType","status")}toMarkdown(e,t){let{text:A,color:r}=e.attrs||{},i=A||"Status";return r&&"neutral"!==r?`{status:${i}|color:${r}}`:`{status:${i}}`}},IK=class{constructor(){(0,pe.__publicField)(this,"nodeType","inlineCard")}toMarkdown(e,t){let{url:A,data:r}=e.attrs||{};if(!A)return"[Card]";let i=r?.title||r?.name||"Card",n=`adf://card/${encodeURIComponent(A)}`;if(e.attrs&&Object.keys(e.attrs).length>0){let t=`<!-- adf:inlineCard attrs='${JSON.stringify(e.attrs)}' -->`;return`[${i}](${n})${t}`}return`[${i}](${n})`}},IY=class{constructor(){(0,pe.__publicField)(this,"nodeType","mediaGroup")}toMarkdown(e,t){return(e.content||[]).map(e=>{let A=t.options.registry?.getNodeConverter(e.type);return A?A.toMarkdown(e,t):""}).filter(e=>e.length>0).join(" ")+"\n\n"}},IW=class{constructor(){(0,pe.__publicField)(this,"nodeType","doc")}toMarkdown(e,t){let A=e.content||[];return t.convertChildren(A).trim()+"\n"}},I$=class{constructor(){(0,pe.__publicField)(this,"markType","strong")}toMarkdown(e,t,A){return t.attrs&&Object.keys(t.attrs).length>0?`**${e}**<!-- adf:strong attrs='${JSON.stringify(t.attrs)}' -->`:`**${e}**`}},IZ=class{constructor(){(0,pe.__publicField)(this,"markType","em")}toMarkdown(e,t,A){return t.attrs&&Object.keys(t.attrs).length>0?`*${e}*<!-- adf:em attrs='${JSON.stringify(t.attrs)}' -->`:`*${e}*`}},Iz=class{constructor(){(0,pe.__publicField)(this,"markType","code")}toMarkdown(e,t,A){return t.attrs&&Object.keys(t.attrs).length>0?`\`${e}\`<!-- adf:code attrs='${JSON.stringify(t.attrs)}' -->`:`\`${e}\``}},IX=class{constructor(){(0,pe.__publicField)(this,"markType","link")}toMarkdown(e,t,A){let r;if(!t.attrs?.href)return e;let{href:i,title:n,...a}=t.attrs;return r=n?`[${e}](${i} "${n}")`:`[${e}](${i})`,Object.keys(a).length>0&&(r+=`<!-- adf:link attrs='${JSON.stringify(a)}' -->`),r}},I0=class{constructor(){(0,pe.__publicField)(this,"markType","strike")}toMarkdown(e,t,A){return t.attrs&&Object.keys(t.attrs).length>0?`~~${e}~~<!-- adf:strike attrs='${JSON.stringify(t.attrs)}' -->`:`~~${e}~~`}},I1=class{constructor(){(0,pe.__publicField)(this,"markType","underline")}toMarkdown(e,t,A){let r=`<u>${e}</u>`;return t.attrs&&Object.keys(t.attrs).length>0?`${r}<!-- adf:underline attrs='${JSON.stringify(t.attrs)}' -->`:r}},I8=class{constructor(){(0,pe.__publicField)(this,"markType","textColor")}toMarkdown(e,t,A){if(!t.attrs?.color)return e;let{color:r,...i}=t.attrs,n=`<span style="color: ${r}">${e}</span>`;return Object.keys(i).length>0&&(n+=`<!-- adf:textColor attrs='${JSON.stringify(i)}' -->`),n}},I4=class{constructor(){(0,pe.__publicField)(this,"markType","backgroundColor")}toMarkdown(e,t,A){let{color:r}=t.attrs||{},i=`<mark style="background-color: ${r||"yellow"}">${e}</mark>`;if(t.attrs&&Object.keys(t.attrs).length>0){let e=`<!-- adf:backgroundColor attrs='${JSON.stringify(t.attrs)}' -->`;return`${i}${e}`}return i}},I2=class{constructor(){(0,pe.__publicField)(this,"markType","subsup")}toMarkdown(e,t,A){let r,{type:i}=t.attrs||{};if(r="sub"===i?`<sub>${e}</sub>`:`<sup>${e}</sup>`,t.attrs&&Object.keys(t.attrs).length>0){let e=`<!-- adf:subsup attrs='${JSON.stringify(t.attrs)}' -->`;return`${r}${e}`}return r}},I3=class{constructor(e={}){(0,pe.__publicField)(this,"registry"),(0,pe.__publicField)(this,"validator"),(0,pe.__publicField)(this,"options"),this.options={strict:!1,gfm:!0,frontmatter:!0,enableAdfExtensions:!0,maxDepth:5,enableLogging:!1,preserveWhitespace:!1,validateInput:!1,preserveUnknownNodes:!0,maxRetries:3,retryDelay:100,fallbackStrategy:"best-effort",...e},this.registry=new Ii,this.validator=new f7,this.registerConverters()}convert(e){if(!e||"object"!=typeof e){if(this.options.strict)throw Error("Invalid ADF document: must be a non-null object");return""}if("doc"!==e.type&&this.options.strict)throw Error('Invalid ADF document: root node must be of type "doc"');try{let t=this.validator.validate(e);if(!t.valid&&this.options.strict)throw Error(`Invalid ADF structure: ${t.errors.map(e=>e.message).join(", ")}`);return this.convertAdfToMarkdown(e)}catch(e){if(this.options.strict)throw e;return this.options.enableLogging&&console.warn("ADF to Markdown conversion failed, returning empty string:",e),""}}convertWithValidation(e){let t=[],A=this.validator.validate(e);if(!A.valid){if(this.options.strict)throw Error(`Invalid ADF structure: ${A.errors.map(e=>e.message).join(", ")}`);t.push(...A.errors.map(e=>e.message))}try{return{markdown:this.convertAdfToMarkdown(e),warnings:t}}catch(e){if(this.options.strict)throw e;return t.push(`Conversion failed: ${e instanceof Error?e.message:"Unknown error"}`),{markdown:"",warnings:t}}}getStats(e){let t={nodeCount:0,hasAdfExtensions:!1,hasGfmFeatures:!1,supportedTypes:new Set,unsupportedTypes:new Set},A=e=>{t.nodeCount++;try{this.registry.getNodeConverter(e.type),t.supportedTypes.add(e.type)}catch{t.unsupportedTypes.add(e.type)}["panel","expand","mediaSingle","mediaGroup","mention","emoji","date","status"].includes(e.type)&&(t.hasAdfExtensions=!0),["table","tableRow","tableHeader","tableCell"].includes(e.type)&&(t.hasGfmFeatures=!0),e.content&&Array.isArray(e.content)&&e.content.forEach(A)};e.content&&e.content.forEach(A);let r=t.nodeCount<10?"simple":t.nodeCount<50?"moderate":"complex";return{nodeCount:t.nodeCount,hasAdfExtensions:t.hasAdfExtensions,hasGfmFeatures:t.hasGfmFeatures,complexity:r,supportedTypes:Array.from(t.supportedTypes),unsupportedTypes:Array.from(t.unsupportedTypes)}}registerConverters(){this.registry.registerNodes([new IB,new Ib,new ID,new Ik,new IS,new Iv,new IR,new IM,new IT,new IU,new Ix,new IN,new IF,new IG,new IO,new IJ,new I_,new IV,new IP,new IL,new IH,new Ij,new Iq,new IK,new IY,new IW]),this.registry.registerMarks([new I$,new IZ,new Iz,new IX,new I0,new I1,new I8,new I4,new I2])}convertAdfToMarkdown(e){let t={convertChildren:e=>Array.isArray(e)?e.map(e=>{try{return this.registry.getNodeConverter(e.type).toMarkdown(e,t)}catch(t){return this.options.enableLogging&&console.warn(`Failed to convert node type "${e.type}":`,t),this.options.preserveUnknownNodes?`<!-- Unknown node: ${e.type} -->`:""}}).join(""):"",depth:0,options:{...this.options,registry:this.registry}};return e.content&&Array.isArray(e.content)?e.content.map(e=>{try{return this.registry.getNodeConverter(e.type).toMarkdown(e,t)}catch(t){return this.options.enableLogging&&console.warn(`Failed to convert node type "${e.type}":`,t),this.options.preserveUnknownNodes?`<!-- Unknown node: ${e.type} -->`:""}}).filter(e=>e.length>0).join("\n\n"):""}},I6=class{constructor(e={}){(0,pe.__publicField)(this,"options"),this.options={maxRetries:3,retryDelay:100,fallbackStrategy:"best-effort",onError:()=>{},onRecovery:()=>{},enableLogging:!1,...e}}async executeWithRecovery(e,t){let A,r={operation:"unknown",input:"",attempt:0,previousErrors:[],...t},i=[];for(let t=0;t<=this.options.maxRetries;t++){r.attempt=t;try{let A=await e();return t>0&&this.options.onRecovery&&this.options.onRecovery("retry-success",r),{success:!0,data:A,warnings:i}}catch(e){if(A=e,r.previousErrors.push(A),this.options.onError&&this.options.onError(A,r),this.options.enableLogging&&console.warn(`Attempt ${t+1} failed:`,A.message),this.isNonRetryableError(A))break;t<this.options.maxRetries&&await this.delay(this.options.retryDelay)}}return this.applyFallbackStrategy(A,r,i)}async recoverAdfToMarkdown(e,t,A){let r=[];try{if(e.content&&Array.isArray(e.content)){let t=[];for(let A of e.content)try{let e=await this.recoverNodeConversion(A,"adf-to-markdown");e.success&&e.data?t.push(e.data):(r.push(`Failed to convert node type: ${A.type}`),t.push(this.createNodeFallback(A,"markdown")))}catch(e){r.push(`Node conversion error: ${e}`),t.push(this.createNodeFallback(A,"markdown"))}let i=t.join("\n\n");return this.options.onRecovery&&this.options.onRecovery("node-by-node-recovery",A),{success:!0,data:i,strategy:"node-by-node-recovery",fallback:!0,warnings:r}}let t=this.createMinimalMarkdown(e);return r.push("Used minimal fallback conversion"),{success:!0,data:t,strategy:"minimal-fallback",fallback:!0,warnings:r}}catch(e){return{success:!1,error:e,warnings:r}}}async recoverMarkdownToAdf(e,t,A){let r=[];try{let t=this.splitMarkdownIntoSections(e),i=[];for(let e of t)try{let t=await this.parseMarkdownSection(e);t.success&&t.data?i.push(...t.data.content):(r.push(`Failed to parse section: ${e.substring(0,50)}...`),i.push(this.createTextFallback(e)))}catch(t){r.push(`Section parsing error: ${t}`),i.push(this.createTextFallback(e))}return this.options.onRecovery&&this.options.onRecovery("section-by-section-recovery",A),{success:!0,data:{version:1,type:"doc",content:i},strategy:"section-by-section-recovery",fallback:!0,warnings:r}}catch(A){let t={version:1,type:"doc",content:[this.createTextFallback(e)]};return r.push("Used text-only fallback conversion"),{success:!0,data:t,strategy:"text-fallback",fallback:!0,warnings:r}}}async applyFallbackStrategy(e,t,A){switch(this.options.fallbackStrategy){case"skip":return A.push("Operation skipped due to errors"),{success:!1,error:e,warnings:A};case"placeholder":let r=this.createPlaceholder(t);return A.push("Used placeholder due to errors"),{success:!0,data:r,strategy:"placeholder",fallback:!0,warnings:A};case"best-effort":return await this.attemptBestEffortRecovery(e,t,A);default:return{success:!1,error:e,warnings:A}}}async attemptBestEffortRecovery(e,t,A){try{if(t.operation.includes("adfToMarkdown"))return await this.recoverAdfToMarkdown(t.input,e,t);if(t.operation.includes("markdownToAdf"))return await this.recoverMarkdownToAdf(t.input,e,t);return A.push("Applied generic fallback recovery"),{success:!1,error:e,strategy:"generic-fallback",warnings:A}}catch(e){return{success:!1,error:e,warnings:A}}}isNonRetryableError(e){return e instanceof IA||e.message.includes("Invalid JSON")||e.message.includes("Syntax error")}delay(e){return new Promise(t=>setTimeout(t,e))}async recoverNodeConversion(e,t){try{if("adf-to-markdown"===t)return{success:!0,data:this.createNodeFallback(e,"markdown"),warnings:[]};return{success:!0,data:JSON.stringify(e),warnings:[]}}catch(e){return{success:!1,error:e,warnings:[]}}}createNodeFallback(e,t){if("markdown"!==t)return JSON.stringify(e,null,2);switch(e.type){case"paragraph":return e.content?this.extractTextFromNodes(e.content):"[Paragraph]";case"heading":let A=e.attrs?.level||1,r=e.content?this.extractTextFromNodes(e.content):"[Heading]";return"#".repeat(A)+" "+r;case"codeBlock":return"```\n[Code Block]\n```";case"panel":return`> [${e.attrs?.panelType||"info"} panel]`;default:return`[${e.type}]`}}extractTextFromNodes(e){return e.map(e=>"text"===e.type&&e.text?e.text:e.content?this.extractTextFromNodes(e.content):"").join("")}createMinimalMarkdown(e){let t=e.content?e.content.map(e=>this.createNodeFallback(e,"markdown")).join("\n\n"):"[No content]";return`# Document
|
|
12273
12273
|
|
|
12274
|
-
${t}`}splitMarkdownIntoSections(e){let t=e.split(/(?=^#{1,6}\s)|(?:\n\s*\n)/m).filter(e=>e.trim().length>0);return t.length>0?t:[e]}async parseMarkdownSection(e){try{let t=[this.createTextFallback(e)];return{success:!0,data:{version:1,type:"doc",content:t},warnings:[]}}catch(e){return{success:!1,error:e,warnings:[]}}}createTextFallback(e){return{type:"paragraph",content:[{type:"text",text:e.trim()}]}}createPlaceholder(e){return e.operation.includes("adfToMarkdown")?`[Error converting ADF to Markdown: ${e.operation}]`:e.operation.includes("markdownToAdf")?{version:1,type:"doc",content:[{type:"paragraph",content:[{type:"text",text:`[Error converting Markdown to ADF: ${e.operation}]`}]}]}:`[Error in operation: ${e.operation}]`}},I5=class{constructor(e){(0,pe.__publicField)(this,"mdToAdfEngine"),(0,pe.__publicField)(this,"adfToMdEngine"),(0,pe.__publicField)(this,"options"),(0,pe.__publicField)(this,"errorRecovery"),(0,pe.__publicField)(this,"remarkProcessor"),(0,pe.__publicField)(this,"registry");try{this.options=e||{},this.mdToAdfEngine=new IQ(this.options),this.adfToMdEngine=new I3(this.options),this.errorRecovery=new I6({maxRetries:e?.maxRetries||3,retryDelay:e?.retryDelay||100,fallbackStrategy:e?.fallbackStrategy||"best-effort",enableLogging:e?.enableLogging||!1,onError:e?.onError,onRecovery:e?.onRecovery}),this.remarkProcessor=pE().use(gY).use(mH,["yaml"]).use(fz).use(f5,{strict:e?.strict||!1}).use(mM),this.registry=new Ii,this.registerConverters()}catch(e){throw new It("Failed to initialize Parser","INIT_ERROR")}}adfToMarkdown(e,t){return t&&Object.keys(t).length>0?new I3({...this.options,...t}).convert(e):this.adfToMdEngine.convert(e)}async adfToMarkdownWithRecovery(e,t){let A=await this.errorRecovery.executeWithRecovery(()=>this.adfToMarkdown(e,t),{operation:"adfToMarkdown",input:e,nodeType:e.type});if(!A.success)throw A.error||Error("ADF to Markdown conversion failed");return A.data}markdownToAdf(e,t){return t&&Object.keys(t).length>0?new IQ({...this.options,...t}).convert(e):this.mdToAdfEngine.convert(e)}async markdownToAdfWithRecovery(e,t){let A=await this.errorRecovery.executeWithRecovery(()=>this.markdownToAdf(e,t),{operation:"markdownToAdf",input:e});if(!A.success)throw A.error||Error("Markdown to ADF conversion failed");return A.data}async markdownToAdfAsync(e,t){return await this.mdToAdfEngine.convertAsync(e)}async markdownToAdfAsyncWithRecovery(e,t){let A=await this.errorRecovery.executeWithRecovery(async()=>this.markdownToAdfAsync(e,t),{operation:"markdownToAdfAsync",input:e});if(!A.success)throw A.error||Error("Async Markdown to ADF conversion failed");return A.data}async validateMarkdownAsync(e){let t=await this.mdToAdfEngine.validate(e);return{valid:t.valid,errors:t.errors.map(e=>({message:e})),warnings:t.warnings}}async getStats(e){return await this.mdToAdfEngine.getStats(e)}stringify(e,t){return this.adfToMarkdown(e,t)}async stringifyAsync(e,t){return this.adfToMarkdownWithRecovery(e,t)}validateAdf(e){return new f7().validate(e)}validateMarkdown(e){return new Ie().validate(e)}getErrorRecovery(){return this.errorRecovery}registerConverters(){this.registry.registerNodes([new IB,new Ib,new ID,new Ik,new IS,new Iv,new IR,new IM,new IT,new IU,new Ix,new IN,new IF,new IG,new IO,new IJ,new I_,new IV,new IP,new IL,new IH,new Ij,new Iq,new IK,new IY,new IW]),this.registry.registerMarks([new I$,new IZ,new Iz,new IX,new I0,new I1,new I8,new I4,new I2])}convertAdfToMarkdown(e){return this.adfToMdEngine.convert(e)}convertMdastToAdf(e){return this.mdToAdfEngine.convert(e)}fallbackConversion(e){return this.mdToAdfEngine.convert(e)}countNodes(e){let t=0;for(let A of e)t++,A.content&&Array.isArray(A.content)&&(t+=this.countNodes(A.content));return t}postProcessAdfFenceBlocks(e){return e}parseAdfLanguageString(e,t){return{}}},I9=e.i(436057);let I7=[/^h[1-6]\.\s/m,/^bq\.\s/m,/\{code(?::[^}]+)?\}/i,/\{noformat\}/i,/\{\{[^}\n]+\}\}/,/^\|\|.+\|\|\s*$/m,/\[[^\]\n]+\|https?:\/\//i,/\[~[^\]\n]+\]/,/\[\^[^\]\n]+\]/,/![^!\n]+!/];function we(e){return!(!e||"object"!=typeof e||Array.isArray(e))&&"doc"===e.type&&1===e.version&&Array.isArray(e.content)}function wt(e,t){return I9.default.to_markdown(e.replace(/\[~([^\]\n]+)\]/g,"@$1").replace(/\[\^([^\]\n]+)\]/g,"[Attachment: $1]").replace(/\[([A-Z][A-Z0-9_]*-\d+)\]/g,(e,A)=>t?`[${A}](${t}/browse/${A})`:`**${A}**`))}let wA=new I5;function wr(e,t){if(null==e)return null;let A=function(e){if(we(e))return"ADF";let t="string"==typeof e?e:"";return I7.some(e=>e.test(t))?"JIRA_WIKI":"MARKDOWN"}(e),r="string"==typeof e?e:null==e?"":JSON.stringify(e,null,2),i="ADF"===A?function(e){try{return wA.adfToMarkdown(e)}catch{return function e(t){return t&&"object"==typeof t?["string"==typeof t.text?t.text:"",...Array.isArray(t.content)?t.content.map(e).filter(Boolean):[]].filter(Boolean).join("\n"):""}(e)}}(e):"JIRA_WIKI"===A?wt(r,t):r;return{format:A,raw:e,rawText:r,markdown:i,wikiMarkup:"JIRA_WIKI"===A?r:I9.default.to_jira(i)}}function wi(e){let t=e.value.trim(),A="JIRA_WIKI"===e.format?wt(t):t,r=wA.markdownToAdf(A);if(!we(r))throw Error("The Jira text could not be converted to valid ADF");return r}let wn="default",wa=["summary","status","issuetype","priority","assignee","project","updated"],ws=[{window:"5m",milliseconds:3e5},{window:"10m",milliseconds:6e5},{window:"1h",milliseconds:36e5},{window:"24h",milliseconds:864e5}];function wo(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)}function wl(e){return wo(e)?e:{}}function wc(e){return Array.isArray(e)?e:[]}function wu(e){return"string"==typeof e&&e.length>0?e:null}function wd(e){return"number"==typeof e&&Number.isFinite(e)?e:null}function wh(e){let t=e.trim().toUpperCase();if(!/^[A-Z][A-Z0-9_]*-\d+$/.test(t))throw Error("Invalid Jira issue key");return t}function wp(e){if(null===e)return null;try{return JSON.parse(e)}catch{return null}}function wg(e){return wc(wp(e)).flatMap(e=>"string"==typeof e&&e.length>0?[e]:[])}function wm(e){return JSON.stringify(function e(t){return Array.isArray(t)?t.map(e):wo(t)?Object.fromEntries(Object.keys(t).sort().map(A=>[A,e(t[A])])):t}(e))}function wf(e){if(!wo(e))return null;let t=e.status??wl(e.response).status;return"number"==typeof t?t:null}function wI(e,t){let A=e instanceof Error?e.message:String(e);return(t?A.replaceAll(t,"[REDACTED]"):A).slice(0,1e3)}function ww(e){return wu(wl(wl(e.fields).project).key)??(e.key?.split("-")[0]||"UNKNOWN")}function wC(e){let t=wl(e),A=wu(t.displayName);if(!A)return null;let r=wl(t.avatarUrls);return{accountId:wu(t.accountId),displayName:A,avatarUrl:wu(r["48x48"])??wu(r["32x32"])??wu(r["24x24"])}}function wy(e){return wc(e).map(wl).map(e=>({id:wu(e.id),name:wu(e.name)??"Unknown"}))}function wE(e,t){let A=wl(e),r=wu(A.key);if(!r)return null;let i=wl(A.fields);return{relationship:t,key:r,summary:wu(i.summary)??r,status:wu(wl(i.status).name)}}function wQ(e){return{...e,kind:"BOARD"===e.kind?"BOARD":"JQL"}}function wB(e){return{source:e.source,stale:e.stale,fetchedAt:e.fetchedAt.toISOString()}}function wb(e){return 0===e.length?{source:"CACHE",stale:!1,fetchedAt:new Date(0).toISOString()}:{source:e.some(e=>"ERROR"===e.source)?"ERROR":e.some(e=>"LIVE"===e.source)?"LIVE":"CACHE",stale:e.some(e=>e.stale),fetchedAt:new Date(Math.max(...e.map(e=>e.fetchedAt.getTime()))).toISOString()}}function wD(e){let t=wl(e.fields),A=wl(t.status),r=wl(A.statusCategory),i=wl(t.assignee),n=wl(i.avatarUrls),a=wl(t.project),s=e.key??"UNKNOWN";return{id:e.id??s,key:s,summary:wu(t.summary)??s,statusId:wu(A.id)??wu(A.name)??"unknown",status:wu(A.name)??"Unknown",statusCategory:wu(r.key)??wu(r.name)??"unknown",issueType:wu(wl(t.issuetype).name),priority:wu(wl(t.priority).name),assignee:wu(i.displayName),assigneeAccountId:wu(i.accountId),assigneeAvatarUrl:wu(n["48x48"])??wu(n["32x32"]),projectKey:wu(a.key)??ww(e),updatedAt:wu(t.updated)}}function wk(e){let t=e.toLowerCase();return"new"===t||t.includes("to do")?0:"indeterminate"===t||t.includes("progress")?1:"done"===t?2:3}let wS=new Set(["ALL","UNASSIGNED_OR_SELF","SELF_IN_PROGRESS"]);function wv(e){return wS.has(e)?e:"ALL"}class wR{credentials;workflowEvents;recordCallLogs;inFlight;clients;lastPrunedAt;constructor(e=new hP,t,A="true"!==process.env.JIRA_CACHE_LOGGING_DISABLED){this.credentials=e,this.workflowEvents=t,this.recordCallLogs=A,this.inFlight=new Map,this.lastPrunedAt=0}async storedConnection(){return hL(this.credentials,hm.jiraConnectionSettings,hY)}async recordTicketWorkflowEvents(e,t){if(!this.workflowEvents)return;let A=e.comments.at(-1)??null,r={ticket:{key:e.key,title:e.summary,type:e.issueType,status:e.status,statusId:e.statusId,statusCategory:e.statusCategory,assignee:e.assignee,assigneeAccountId:e.assigneeAccountId,labels:e.labels,sprintNames:e.sprintNames,activeSprintNames:e.activeSprintNames,closedSprintNames:e.closedSprintNames,url:e.jiraUrl},comment:A?{id:A.id,body:A.content?.rawText??"",author:A.author}:null,...void 0!==t?{changelog:t}:{}},i=e.cache.fetchedAt,n=e.assigneeAccountId?await this.currentAccountId().catch(()=>null):null,a=[["JIRA_STATUS",e.statusId],["JIRA_LABEL",JSON.stringify([...e.labels].sort())],["JIRA_MENTION",A?.id??"none"],["JIRA_SPRINT_STARTED",[...e.activeSprintNames].sort()],["JIRA_TICKET_UPDATED",e.updatedAt??"unknown"],["JIRA_COMMENT_ADDED",A?.id??"none"],["JIRA_SPRINT_ENDED",[...e.closedSprintNames].sort()]];if(n&&n===e.assigneeAccountId&&a.push(["JIRA_ASSIGNED_SELF",n]),t?.items.length){let e=new Set(t.items.flatMap(e=>[e.fieldId,e.field].filter(e=>!!e).map(e=>e.trim().toLowerCase()))),A=new Set(["JIRA_TICKET_UPDATED"]);e.has("status")&&A.add("JIRA_STATUS"),(e.has("label")||e.has("labels"))&&A.add("JIRA_LABEL"),e.has("assignee")&&A.add("JIRA_ASSIGNED_SELF"),e.has("sprint")&&(A.add("JIRA_SPRINT_STARTED"),A.add("JIRA_SPRINT_ENDED")),a=a.filter(([e])=>A.has(e))}await Promise.allSettled(a.map(([t,A])=>this.workflowEvents.record({kind:t,subjectKey:e.key,dedupeKey:`jira-trigger:${t}:${e.key}:${i}`,payload:{...r,sessionData:r,cursorValue:A}})))}async getSettings(){let e=await aJ(),[t,A,r]=await Promise.all([e.jiraSettings.upsert({where:{id:wn},create:{id:wn,cacheTtlSeconds:300},update:{}}),this.storedConnection(),this.credentials.isConfigured(hm.jiraApiToken)]);return{siteUrl:A?.value.siteUrl??null,email:A?.value.email??null,tokenConfigured:!!(A&&r),cacheTtlSeconds:t.cacheTtlSeconds,updatedAt:new Date(Math.max(t.updatedAt.getTime(),A?.updatedAt.getTime()??0)).toISOString()}}async saveSettings(e){let t=await aJ(),A=function(e){let t=new URL(e.trim());if("https:"!==t.protocol)throw Error("Jira Cloud site URL must use HTTPS");if(!t.hostname.toLowerCase().endsWith(".atlassian.net"))throw Error("Only Jira Cloud *.atlassian.net sites are supported");if(t.username||t.password||t.search||t.hash)throw Error("Jira site URL must not include credentials, query, or fragment");return t.origin}(e.siteUrl),r=e.email.trim();if(!/^\S+@\S+\.\S+$/.test(r))throw Error("A valid Jira email is required");let i=await this.storedConnection(),n=e.apiToken?.trim()||null,a=!!(i?.value.siteUrl&&i.value.siteUrl!==A);if(a&&!e.resetSite)throw Error("Changing the Jira site requires resetSite=true");let s=i?.value.siteUrl!==A||i?.value.email!==r||!!n,o={siteUrl:A,email:r},l=async e=>{a&&(await e.jiraProject.deleteMany(),await e.jiraWebhookDelivery.deleteMany()),s&&(await e.jiraCacheEntry.deleteMany(),await e.jiraCachedTicket.deleteMany()),await e.jiraSettings.upsert({where:{id:wn},create:{id:wn,cacheTtlSeconds:300},update:a?{webhookEnabled:!1,webhookConfiguredAt:null,webhookId:null}:{}})},c=[...i&&JSON.stringify(i.value)===JSON.stringify(o)?[]:[{descriptor:hm.jiraConnectionSettings,value:hw(o)}],...n?[{descriptor:hm.jiraApiToken,value:Buffer.from(n,"utf8")}]:[]];return c.length?a?await this.credentials.setAndDeleteMany(c,[hm.jiraWebhookSecret,hm.jiraWebhookSettings],l):await this.credentials.setMany(c,l):await t.$transaction(l),this.clients=void 0,this.getSettings()}async clearCredentials(){let e=await aJ(),[t,A]=await Promise.all([e.jiraSettings.findUnique({where:{id:wn},select:{webhookId:!0}}),this.storedConnection()]),r=await this.credentials.isConfigured(hm.jiraApiToken);if(A?.value.siteUrl&&A.value.email&&t?.webhookId&&r)try{await this.webhookApiRequest("DELETE",`/rest/webhooks/1.0/webhook/${encodeURIComponent(t.webhookId)}`)}catch(e){if(404!==wf(e))throw e}return await this.credentials.deleteMany([hm.jiraConnectionSettings,hm.jiraApiToken,hm.jiraWebhookSettings,hm.jiraWebhookSecret],async e=>{await e.jiraCacheEntry.deleteMany(),await e.jiraCachedTicket.deleteMany(),await e.jiraWebhookDelivery.deleteMany(),await e.jiraSettings.upsert({where:{id:wn},create:{id:wn,cacheTtlSeconds:300},update:{webhookEnabled:!1,webhookConfiguredAt:null,webhookId:null}})}),this.clients=void 0,this.getSettings()}async updateCacheTtl(e){if(!Number.isInteger(e)||e<1||e>1440)throw Error("Cache TTL must be an integer from 1 to 1440 minutes");let t=await aJ();return await t.jiraSettings.upsert({where:{id:wn},create:{id:wn,cacheTtlSeconds:60*e},update:{cacheTtlSeconds:60*e}}),this.getSettings()}async testConnection(){let e=await this.cachedCall({operation:"MYSELF",params:{},requestSummary:"Current Jira user",force:!0,allowStaleOnError:!1,fetcher:async()=>{let{version3:e}=await this.getClients();return e.myself.getCurrentUser()}});if(e.stale)throw Error("Jira connection test failed because the live request failed");let t=wl(e.value);return{accountId:wu(t.accountId),displayName:wu(t.displayName)??"Jira user",emailAddress:wu(t.emailAddress),cache:wB(e)}}async listProjects(){let e=await aJ();return(await e.jiraProject.findMany({include:{sources:{orderBy:[{position:"asc"},{createdAt:"asc"}]}},orderBy:[{position:"asc"},{createdAt:"asc"}]})).map(e=>({id:e.id,jiraId:e.jiraId,key:e.key,name:e.name,avatarUrl:e.avatarUrl,position:e.position,ticketAssignmentFilter:wv(e.ticketAssignmentFilter),hideCompletedTickets:e.hideCompletedTickets,completedStatusIds:wg(e.completedStatusIdsJson),doneStatusId:e.doneStatusId,branchNamingScript:e.branchNamingScript??h5,sources:e.sources.map(wQ)}))}async projectStatuses(e){let t=await aJ(),A=await t.jiraProject.findUnique({where:{id:e},select:{jiraId:!0,key:!0}});if(!A)throw Error("Jira project not found");let r=await this.cachedCall({operation:"PROJECT_STATUSES",params:{jiraId:A.jiraId},requestSummary:`Statuses for project ${A.key}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.projects.getAllStatuses(A.jiraId)}}),i=new Map;for(let e of wc(r.value).map(wl))for(let t of wc(e.statuses).map(wl)){let e=wu(t.id),A=wu(t.name);if(!e||!A||i.has(e))continue;let r=wl(t.statusCategory);i.set(e,{id:e,name:A,category:wu(r.key)??wu(r.name)??"unknown"})}return[...i.values()].sort((e,t)=>wk(e.category)-wk(t.category)||e.name.localeCompare(t.name))}async updateProjectDisplaySettings(e){if(!wS.has(e.ticketAssignmentFilter))throw Error("Invalid Jira ticket assignment filter");let t=[...new Set(e.completedStatusIds.map(e=>e.trim()).filter(Boolean))].slice(0,200),A=await aJ(),r=void 0===e.doneStatusId?void 0:e.doneStatusId?.trim()||null;if(r&&!(await this.projectStatuses(e.projectId)).some(e=>e.id===r))throw Error("The selected Jira done status is not available");return await A.jiraProject.update({where:{id:e.projectId},data:{ticketAssignmentFilter:e.ticketAssignmentFilter,hideCompletedTickets:e.hideCompletedTickets,completedStatusIdsJson:JSON.stringify(t),...void 0===r?{}:{doneStatusId:r}}}),this.listProjects()}async updateProjectBranchNaming(e,t){let A=await aJ(),r=await A.jiraProject.findUnique({where:{id:e},select:{key:!0}});if(!r)throw Error("Jira project not found");let i=await h7(t,r.key);return await A.jiraProject.update({where:{id:e},data:{branchNamingScript:i}}),this.listProjects()}async availableProjects(){let e=[],t=0;for(;;){let A=await this.cachedCall({operation:"PROJECTS",params:{startAt:t,maxResults:100},requestSummary:`Visible projects from ${t}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.projects.searchProjects({startAt:t,maxResults:100,orderBy:"name"})},itemCount:e=>wc(wl(e).values).length}),r=wl(A.value),i=wc(r.values).map(wl);e.push(...i.flatMap(e=>{let t=wu(e.id),A=wu(e.key),r=wu(e.name);if(!t||!A||!r)return[];let i=wl(e.avatarUrls);return[{jiraId:t,key:A,name:r,avatarUrl:wu(i["48x48"])??wu(i["32x32"])}]}));let n=wd(r.total)??e.length;if(0===i.length||e.length>=n)break;t+=i.length}return e}async addProject(e){let t=e.trim();if(!t)throw Error("Jira project ID is required");let A=wl((await this.cachedCall({operation:"PROJECT",params:{jiraId:t},requestSummary:`Project ${t}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.projects.getProject(t)}})).value),r=wu(A.key),i=wu(A.name),n=wu(A.id);if(!r||!i||!n)throw Error("Jira returned an incomplete project");let a=wl(A.avatarUrls),s=await aJ(),o=await s.jiraProject.aggregate({_max:{position:!0}});return await s.jiraProject.create({data:{id:(0,AP.randomUUID)(),jiraId:n,key:r,name:i,avatarUrl:wu(a["48x48"])??wu(a["32x32"]),position:(o._max.position??-1)+1,branchNamingScript:h5}}),this.listProjects()}async removeProject(e){let t=await aJ(),A=(await t.jiraSource.findMany({where:{projectId:e},select:{id:!0}})).map(e=>e.id);return await t.$transaction(async t=>{A.length>0&&await t.jiraCacheEntry.deleteMany({where:{sourceId:{in:A}}}),await t.jiraProject.delete({where:{id:e}}),await t.jiraCachedTicket.deleteMany({where:{cacheEntries:{none:{}}}})}),this.listProjects()}async createSource(e){let t=await this.validateSource(e.kind,e.value),A=this.validateSourceName(e.name),r=await aJ();if(!await r.jiraProject.findUnique({where:{id:e.projectId}}))throw Error("Jira project not found");let i=await r.jiraSource.aggregate({where:{projectId:e.projectId},_max:{position:!0}});return await r.jiraSource.create({data:{id:(0,AP.randomUUID)(),projectId:e.projectId,name:A,kind:e.kind,value:t.value,boardId:t.boardId,position:(i._max.position??-1)+1}}),this.listProjects()}async updateSource(e){let t=await this.validateSource(e.kind,e.value),A=this.validateSourceName(e.name),r=await aJ();return await r.$transaction([r.jiraCacheEntry.deleteMany({where:{sourceId:e.id}}),r.jiraSource.update({where:{id:e.id},data:{name:A,kind:e.kind,value:t.value,boardId:t.boardId}})]),this.listProjects()}async deleteSource(e){let t=await aJ();return await t.$transaction(async t=>{await t.jiraCacheEntry.deleteMany({where:{sourceId:e}}),await t.jiraSource.delete({where:{id:e}}),await t.jiraCachedTicket.deleteMany({where:{cacheEntries:{none:{}}}})}),this.listProjects()}async ticketBoard(e,t=!1){var A;let r,i,n,a=await aJ(),s=await a.jiraSource.findUnique({where:{id:e},include:{project:!0}});if(!s)throw Error("Jira source not found");let o=await a.jiraCacheEntry.findFirst({where:{sourceId:e,issues:{some:{}}},orderBy:{fetchedAt:"desc"},include:{issues:{select:{issueKey:!0}}}}),l=new Set(o?.issues.map(({issueKey:e})=>e)??[]),c="BOARD"===s.kind?await this.loadBoardSource(wQ(s),t):await this.loadJqlSource(wQ(s),t),u={ticketAssignmentFilter:wv(s.project.ticketAssignmentFilter),hideCompletedTickets:s.project.hideCompletedTickets,completedStatusIds:wg(s.project.completedStatusIdsJson)},d="ALL"===u.ticketAssignmentFilter?null:await this.currentAccountId(),h=(A={source:wQ(s),...c},r=u.hideCompletedTickets?new Set(u.completedStatusIds):new Set,i=new Set(A.tickets.filter(e=>r.has(e.statusId)).map(e=>e.status)),n=A.tickets.filter(e=>{let t;return!r.has(e.statusId)&&("ALL"===u.ticketAssignmentFilter||("UNASSIGNED_OR_SELF"===u.ticketAssignmentFilter?null===e.assigneeAccountId||e.assigneeAccountId===d:null!==d&&e.assigneeAccountId===d&&("indeterminate"===(t=e.statusCategory.toLowerCase())||t.includes("progress"))))}),{...A,tickets:n,statusOrder:A.statusOrder.filter(e=>!i.has(e))});return this.workflowEvents&&o&&await Promise.allSettled(h.tickets.filter(({key:e})=>!l.has(e)).map(t=>{let A={ticket:{key:t.key,title:t.summary,type:t.issueType,status:t.status,statusId:t.statusId,statusCategory:t.statusCategory,assignee:t.assignee}};return this.workflowEvents.record({kind:"JIRA_SOURCE_NEW_TICKET",subjectKey:`${e}:${t.key}`,dedupeKey:`jira-source-new:${e}:${t.key}:${h.cache.fetchedAt}`,payload:{...A,sessionData:A,source:{id:e,name:s.name,kind:s.kind},cursorValue:t.key}})})),h}async ticket(e,t=!1,A){let r=wh(e),i=await this.cachedCall({operation:"ISSUE",params:{issueKey:r,fields:"*all",expand:"names,schema"},requestSummary:`Issue ${r} with all fields`,force:t,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issues.getIssue({issueIdOrKey:r,fields:["*all"],expand:["names","schema"],updateHistory:!1})}});"LIVE"===i.source&&await this.storeDetail(i.entryId,i.value,i.fetchedAt);let n=[],a=[],s=0;for(;;){let e=await this.cachedCall({operation:"COMMENTS",params:{issueKey:r,startAt:s,maxResults:100},requestSummary:`Comments for ${r} from ${s}`,force:t,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issueComments.getComments({issueIdOrKey:r,startAt:s,maxResults:100,orderBy:"created"})},itemCount:e=>wc(wl(e).comments).length});n.push(e);let A=wl(e.value),i=wc(A.comments);a.push(...i);let o=wd(A.total)??a.length;if(0===i.length||a.length>=o)break;s+=i.length}let o=new Date(Math.min(...n.map(e=>e.fetchedAt.getTime())));await this.storeComments(r,a,o,n.map(e=>e.entryId));let l=await this.requireCredentials(),c=this.normalizeTicketDetail(i.value,a,l.siteUrl,wB(i),wb(n));return await this.recordTicketWorkflowEvents(c,A),c}async assignableUsers(e,t=""){let A=wh(e),r=t.trim().slice(0,100),i=await this.cachedCall({operation:"ASSIGNABLE_USERS",params:{issueKey:A,query:r,maxResults:50},requestSummary:`Assignable users for ${A}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.userSearch.findAssignableUsers({issueKey:A,query:r,maxResults:50,recommend:!0})},itemCount:e=>wc(e).length});return await this.linkCacheEntryToIssue(A,i.entryId),wc(i.value).map(wC).filter(e=>null!==e)}async ticketTransitions(e){let t=wh(e),A=await this.cachedCall({operation:"ISSUE_TRANSITIONS",params:{issueKey:t,expand:"transitions.fields"},requestSummary:`Available transitions for ${t}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issues.getTransitions({issueIdOrKey:t,expand:"transitions.fields"})},itemCount:e=>wc(wl(e).transitions).length});return await this.linkCacheEntryToIssue(t,A.entryId),wc(wl(A.value).transitions).map(wl).filter(e=>!1!==e.isAvailable).flatMap(e=>{let t=wu(e.id),A=wu(e.name);if(!t||!A)return[];let r=wl(e.to),i=wl(r.statusCategory),n=Object.entries(wl(e.fields)).filter(([,e])=>!0===wl(e).required).map(([e,t])=>wu(wl(t).name)??e);return[{id:t,name:A,toStatusId:wu(r.id),toStatus:wu(r.name)??A,toStatusCategory:wu(i.key)??wu(i.name),hasScreen:!0===e.hasScreen,requiredFields:n}]})}async ticketEditFields(e){let t=wh(e),A=await this.cachedCall({operation:"ISSUE_EDIT_META",params:{issueKey:t},requestSummary:`Editable fields for ${t}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issues.getEditIssueMeta({issueIdOrKey:t})},itemCount:e=>Object.keys(wl(wl(e).fields)).length});return await this.linkCacheEntryToIssue(t,A.entryId),Object.entries(wl(wl(A.value).fields)).map(([e,t])=>{let A=wl(t);return{id:e,name:wu(A.name)??e,required:!0===A.required,schemaType:wu(wl(A.schema).type),allowedValues:wc(A.allowedValues).flatMap(e=>{if("string"==typeof e)return[{id:e,name:e}];let t=wl(e),A=wu(t.name)??wu(t.value)??wu(t.displayName)??wu(t.key);return A?[{id:wu(t.id)??wu(t.accountId)??wu(t.value)??A,name:A}]:[]})}}).sort((e,t)=>e.name.localeCompare(t.name))}async ticketChanges(e,t=50,A=0){let r=wh(e),i=this.validatePagination(t,A),n=await this.cachedCall({operation:"ISSUE_CHANGELOG",params:{issueKey:r,startAt:0,maxResults:1},requestSummary:`Changelog count for ${r}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issues.getChangeLogs({issueIdOrKey:r,startAt:0,maxResults:1})},itemCount:e=>wc(wl(e).values).length});await this.linkCacheEntryToIssue(r,n.entryId);let a=wd(wl(n.value).total)??0,s=Math.min(i.limit,Math.max(0,a-i.offset)),o=Math.max(0,a-i.offset-s);if(0===s)return{...i,total:a,items:[],cache:wB(n)};let l=await this.cachedCall({operation:"ISSUE_CHANGELOG",params:{issueKey:r,startAt:o,maxResults:s},requestSummary:`Changelog for ${r} from ${o}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issues.getChangeLogs({issueIdOrKey:r,startAt:o,maxResults:s})},itemCount:e=>wc(wl(e).values).length});await this.linkCacheEntryToIssue(r,l.entryId);let c=wc(wl(l.value).values).map(wl).reverse().map(e=>({id:wu(e.id)??(0,AP.randomUUID)(),author:wC(e.author),createdAt:wu(e.created),items:wc(e.items).map(wl).map(e=>({field:wu(e.field)??"Field",fieldId:wu(e.fieldId),from:wu(e.fromString)??wu(e.from),to:wu(e.toString)??wu(e.to)}))}));return{...i,total:a,items:c,cache:wb([n,l])}}async ticketWorklogs(e,t=50,A=0){let r=wh(e),i=this.validatePagination(t,A),n=await this.cachedCall({operation:"ISSUE_WORKLOGS",params:{issueKey:r,startAt:0,maxResults:1},requestSummary:`Worklog count for ${r}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issueWorklogs.getIssueWorklog({issueIdOrKey:r,startAt:0,maxResults:1})},itemCount:e=>wc(wl(e).worklogs).length});await this.linkCacheEntryToIssue(r,n.entryId);let a=wd(wl(n.value).total)??0,s=Math.min(i.limit,Math.max(0,a-i.offset)),o=Math.max(0,a-i.offset-s);if(0===s)return{...i,total:a,items:[],cache:wB(n)};let l=await this.cachedCall({operation:"ISSUE_WORKLOGS",params:{issueKey:r,startAt:o,maxResults:s},requestSummary:`Worklogs for ${r} from ${o}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issueWorklogs.getIssueWorklog({issueIdOrKey:r,startAt:o,maxResults:s})},itemCount:e=>wc(wl(e).worklogs).length});await this.linkCacheEntryToIssue(r,l.entryId);let c=await this.requireCredentials(),u=wc(wl(l.value).worklogs).map(wl).reverse().map(e=>({id:wu(e.id)??(0,AP.randomUUID)(),author:wC(e.author),comment:wr(e.comment??null,c.siteUrl),timeSpent:wu(e.timeSpent),timeSpentSeconds:wd(e.timeSpentSeconds),startedAt:wu(e.started),createdAt:wu(e.created),updatedAt:wu(e.updated)})),d=u[0];if(this.workflowEvents&&d){let e={ticket:{key:r},worklog:{id:d.id,author:d.author,timeSpent:d.timeSpent,timeSpentSeconds:d.timeSpentSeconds,startedAt:d.startedAt,updatedAt:d.updatedAt}};await this.workflowEvents.record({kind:"JIRA_WORKLOG_ADDED",subjectKey:r,dedupeKey:`jira-worklog:${r}:${d.id}:${l.fetchedAt}`,payload:{...e,sessionData:e,cursorValue:d.id}})}return{...i,total:a,items:u,cache:wb([n,l])}}async addComment(e,t){let A=wh(e);if(!t.value.trim())throw Error("Comment text is required");let r=wi(t);return this.mutateTicket(A,"ADD_COMMENT",async()=>{let{version3:e}=await this.getClients();await e.issueComments.addComment({issueIdOrKey:A,comment:r})})}async assignTicket(e,t){let A=wh(e),r=t?.trim()||null;return this.mutateTicket(A,"ASSIGN_ISSUE",async()=>{let{version3:e}=await this.getClients();await e.issues.assignIssue({issueIdOrKey:A,accountId:r})})}async transitionTicket(e,t){let A=wh(e),r=(await this.ticketTransitions(A)).find(e=>e.id===t);if(!r)throw Error("The Jira transition is not available");if(r.requiredFields.length>0)throw Error(`This transition requires fields that must be completed in Jira: ${r.requiredFields.join(", ")}`);return this.mutateTicket(A,"TRANSITION_ISSUE",async()=>{let{version3:e}=await this.getClients();await e.issues.doTransition({issueIdOrKey:A,transition:{id:r.id}})})}async transitionTicketToConfiguredDone(e){let t=wh(e),A=t.split("-")[0]??"",r=await aJ(),i=await r.jiraProject.findUnique({where:{key:A},select:{doneStatusId:!0}});if(!i?.doneStatusId)throw Error(`Configure a done status for Jira project ${A} before using this option`);let n=await this.ticket(t);if(n.statusId===i.doneStatusId)return n;let a=(await this.ticketTransitions(t)).filter(e=>e.toStatusId===i.doneStatusId).sort((e,t)=>e.requiredFields.length-t.requiredFields.length)[0];if(!a)throw Error("Jira does not currently offer a transition to the configured done status");return this.transitionTicket(t,a.id)}async updateTicket(e){let t=wh(e.issueKey),A=new Map((await this.ticketEditFields(t)).map(e=>[e.id,e])),r={},i=e=>{let t=A.get(e);if(!t)throw Error(`${e} is not editable on this ticket`);return t},n=t=>Object.prototype.hasOwnProperty.call(e,t);if(n("summary")){i("summary");let t=e.summary?.trim();if(!t)throw Error("Ticket summary is required");r.summary=t}if(n("description")){let t=i("description");if(null===e.description){if(t.required)throw Error("Description is required");r.description=null}else e.description&&(r.description=wi(e.description))}if(n("priorityId")){let t=i("priority"),A=e.priorityId?.trim()||null;if(!A&&t.required)throw Error("Priority is required");if(A&&t.allowedValues.length>0&&!t.allowedValues.some(e=>e.id===A))throw Error("The selected priority is not available");r.priority=A?{id:A}:null}n("labels")&&(i("labels"),r.labels=[...new Set((e.labels??[]).map(e=>e.trim()).filter(Boolean))]);let a=(t,A)=>{if(!n(t))return;let a=i(A),s=[...new Set(e[t]??[])];if(a.allowedValues.length>0&&s.some(e=>!a.allowedValues.some(t=>t.id===e)))throw Error(`A selected ${a.name} value is not available`);r[A]=s.map(e=>({id:e}))};if(a("componentIds","components"),a("fixVersionIds","fixVersions"),a("affectedVersionIds","versions"),n("dueDate")){let t=i("duedate"),A=e.dueDate?.trim()||null;if(A&&!/^\d{4}-\d{2}-\d{2}$/.test(A))throw Error("Due date must use YYYY-MM-DD");if(!A&&t.required)throw Error("Due date is required");r.duedate=A}if(0===Object.keys(r).length)throw Error("At least one editable Jira field is required");return this.mutateTicket(t,"EDIT_ISSUE",async()=>{let{version3:e}=await this.getClients();await e.issues.editIssue({issueIdOrKey:t,fields:r})})}async createTicket(e){let t=e.projectKey.trim().toUpperCase(),A=e.issueTypeId.trim(),r=e.summary.trim();if(!t||!A||!r)throw Error("Project, issue type, and summary are required");let{version3:i}=await this.getClients(),n=await i.issues.createIssue({fields:{...e.fields??{},project:{key:t},issuetype:{id:A},summary:r,...e.description?{description:wi(e.description)}:{}}});if(!n.key)throw Error("Jira did not return the created issue key");return this.ticket(n.key,!0)}async addWorklog(e){let t=wh(e.issueKey);if(!Number.isInteger(e.timeSpentSeconds)||e.timeSpentSeconds<1)throw Error("Time spent must be a positive number of seconds");let{version3:A}=await this.getClients();return await A.issueWorklogs.addWorklog({issueIdOrKey:t,timeSpentSeconds:e.timeSpentSeconds,started:e.startedAt??new Date().toISOString(),...e.comment?{comment:wi(e.comment)}:{}}),this.ticket(t,!0)}async linkTickets(e){let t=wh(e.inwardIssueKey),A=wh(e.outwardIssueKey),r=e.linkType.trim();if(!r)throw Error("Jira issue link type is required");let{version3:i}=await this.getClients();return await i.issueLinks.linkIssues({type:{name:r},inwardIssue:{key:t},outwardIssue:{key:A}}),this.ticket(t,!0)}async branchTicket(e){let t=wh(e),A=t.replace(/-\d+$/,""),r=await aJ(),i=await r.jiraProject.findUnique({where:{key:A},select:{key:!0,branchNamingScript:!0}});if(!i)throw Error(`Jira project ${A} is not managed; add it in Manage Jira projects and sources`);let n=await this.cachedCall({operation:"ISSUE_BRANCH",params:{issueKey:t,fields:["summary","issuetype","project"]},requestSummary:`Branch details for ${t}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issues.getIssue({issueIdOrKey:t,fields:["summary","issuetype","project"],updateHistory:!1})}});await this.linkCacheEntryToIssue(t,n.entryId);let a=wl(n.value.fields);if((wu(wl(a.project).key)??ww(n.value))!==i.key)throw Error(`Jira ticket ${t} does not belong to project ${i.key}`);return{ticketKey:n.value.key??t,ticketTitle:wu(a.summary)??t,ticketType:wu(wl(a.issuetype).name),projectKey:i.key,branchNamingScript:i.branchNamingScript??h5}}async clearCache(){let e=await aJ();return await e.$transaction([e.jiraCacheEntry.deleteMany(),e.jiraCachedTicket.deleteMany()]),!0}async clearApiCalls(){let e=await aJ();return await e.jiraApiCallLog.deleteMany(),!0}async deleteCachedTicket(e){return await this.invalidateIssueCaches(wh(e)),!0}async invalidateIssueCaches(e){let t=await aJ(),A=await t.jiraCacheEntryIssue.findMany({where:{issueKey:e},select:{cacheEntryId:!0}});await t.$transaction(async t=>{A.length>0&&await t.jiraCacheEntry.deleteMany({where:{id:{in:A.map(e=>e.cacheEntryId)}}}),await t.jiraCachedTicket.deleteMany({where:{issueKey:e}})})}async refreshCachedTicket(e,t){let A=await aJ(),r=await A.jiraCacheEntryIssue.findMany({where:{issueKey:e},select:{cacheEntryId:!0}});return r.length>0&&await A.jiraCacheEntry.deleteMany({where:{id:{in:r.map(e=>e.cacheEntryId)}}}),this.ticket(e,!0,t)}async resolveIssueKeys(e){let t=[...new Set(e.map(e=>e.trim()).filter(Boolean))];if(0===t.length)return[];let{version3:A}=await this.getClients();return[...new Set((await Promise.all(t.map(e=>A.issues.getIssue({issueIdOrKey:e,fields:["key"]})))).map(e=>{let t=wu(e.key);if(!t)throw Error(`Jira issue ${e.id??""} has no key`);return wh(t)}))]}async refreshSprintTickets(e){if(!Number.isSafeInteger(e)||e<=0)throw Error("Invalid Jira sprint ID");let{agile:t}=await this.getClients(),A=[],r=0;for(;A.length<1e3;){let i=Math.min(100,1e3-A.length),n=await t.sprint.getIssuesForSprint({sprintId:e,startAt:r,maxResults:i,fields:["key"]}),a=n.issues??[];A.push(...a.flatMap(e=>{let t=wu(e.key);return t?[wh(t)]:[]}));let s=void 0===n.total?a.length<i:r+a.length>=n.total;if(0===a.length||s)break;r+=a.length}let i=[],n=[...new Set(A)];for(let e=0;e<n.length;e+=5)i.push(...await Promise.all(n.slice(e,e+5).map(e=>this.refreshCachedTicket(e))));return i}async listCachedTickets(e=50,t=0){let A=this.validatePagination(e,t),r=await aJ(),[i,n,a]=await Promise.all([r.jiraCachedTicket.findMany({take:A.limit,skip:A.offset,orderBy:{updatedAt:"desc"}}),r.jiraCachedTicket.count(),this.getSettings()]);return{...A,total:n,items:i.map(e=>this.cachedTicketView(e,a.cacheTtlSeconds))}}async cachedTicket(e){let t=await aJ(),[A,r]=await Promise.all([t.jiraCachedTicket.findUnique({where:{issueKey:e},include:{cacheEntries:{include:{cacheEntry:!0}}}}),this.getSettings()]);return A?{...this.cachedTicketView(A,r.cacheTtlSeconds),summaryData:wp(A.summaryJson),detailData:wp(A.detailJson),commentsData:wp(A.commentsJson),cacheEntries:A.cacheEntries.map(e=>({id:e.cacheEntry.id,operation:e.cacheEntry.operation,fetchedAt:e.cacheEntry.fetchedAt.toISOString()})).sort((e,t)=>t.fetchedAt.localeCompare(e.fetchedAt))}:null}async listApiCalls(e=50,t=0){let A=this.validatePagination(e,t);await this.pruneLogs();let r=await aJ(),[i,n]=await Promise.all([r.jiraApiCallLog.findMany({take:A.limit,skip:A.offset,orderBy:{createdAt:"desc"}}),r.jiraApiCallLog.count()]);return{...A,total:n,items:i.map(e=>({id:e.id,operation:e.operation,requestSummary:e.requestSummary,source:e.source,durationMs:e.durationMs,statusCode:e.statusCode,error:e.error,itemCount:e.itemCount,servedStale:e.servedStale,createdAt:e.createdAt.toISOString()}))}}async cacheMetrics(){await this.pruneLogs();let e=await aJ(),t=Date.now(),A=await e.jiraApiCallLog.findMany({where:{createdAt:{gte:new Date(t-ws.at(-1).milliseconds)}},orderBy:{createdAt:"asc"}});return{windows:ws.map(e=>this.metricWindow(e.window,A.filter(A=>A.createdAt.getTime()>=t-e.milliseconds))),operations:[...new Set(A.map(e=>e.operation))].sort().map(e=>({operation:e,windows:ws.map(r=>this.metricWindow(r.window,A.filter(A=>A.operation===e&&A.createdAt.getTime()>=t-r.milliseconds)))}))}}async requireCredentials(){let e=await aJ(),[t,A]=await Promise.all([e.jiraSettings.findUnique({where:{id:wn}}),this.storedConnection()]);if(!A)throw Error("Configure the Jira site, email, and API token in Settings first");let r=await this.credentials.getText(hm.jiraApiToken);if(!r)throw Error("Configure the Jira site, email, and API token in Settings first");return{siteUrl:A.value.siteUrl,email:A.value.email,apiToken:r,cacheTtlSeconds:t?.cacheTtlSeconds??300}}async getClients(){let e=await this.requireCredentials(),t=(0,AP.createHash)("sha256").update(`${e.siteUrl}\0${e.email}\0${e.apiToken}`).digest("hex");if(this.clients?.key===t)return this.clients;let A={host:e.siteUrl,authentication:{basic:{email:e.email,apiToken:e.apiToken}},baseRequestConfig:{timeout:15e3}};return this.clients={key:t,version3:new d4(A),agile:new ud(A)},this.clients}async webhookApiRequest(e,t,A){let r,i=await this.requireCredentials(),n=Buffer.from(`${i.email}:${i.apiToken}`).toString("base64");try{r=await fetch(`${i.siteUrl}${t}`,{method:e,headers:{Accept:"application/json",Authorization:`Basic ${n}`,"Content-Type":"application/json"},body:void 0===A?void 0:JSON.stringify(A),signal:AbortSignal.timeout(15e3)})}catch(e){throw Error(wI(e,i.apiToken))}let a=await r.text();if(!r.ok){let e=a.trim().slice(0,300)||r.statusText;throw Object.assign(Error(wI(`Jira rejected the webhook request with ${r.status}: ${e}`,i.apiToken)),{status:r.status})}if(!a.trim())return null;try{return JSON.parse(a)}catch{return null}}async currentAccountId(){let e=wu(wl((await this.cachedCall({operation:"MYSELF",params:{},requestSummary:"Current Jira user",fetcher:async()=>{let{version3:e}=await this.getClients();return e.myself.getCurrentUser()}})).value).accountId);if(!e)throw Error("Jira did not return the current user ID");return e}async linkCacheEntryToIssue(e,t){let A=await aJ();await A.$transaction(async A=>{await A.jiraCachedTicket.upsert({where:{issueKey:e},create:{issueKey:e,projectKey:e.replace(/-\d+$/,"")},update:{}}),await A.jiraCacheEntryIssue.upsert({where:{cacheEntryId_issueKey:{cacheEntryId:t,issueKey:e}},create:{cacheEntryId:t,issueKey:e},update:{}})})}async mutateTicket(e,t,A){let r,i=await this.requireCredentials(),n=Date.now();try{await A(),await this.logCall({operation:t,requestSummary:`${t.replaceAll("_"," ")} for ${e}`,source:"LIVE",durationMs:Date.now()-n})}catch(r){let A=wI(r,i.apiToken);throw await this.logCall({operation:t,requestSummary:`${t.replaceAll("_"," ")} for ${e}`,source:"ERROR",durationMs:Date.now()-n,statusCode:wf(r),error:A}),Error(A)}await this.invalidateIssueCaches(e);try{r=await this.ticket(e,!0)}catch(e){throw Error(`Jira accepted the update, but refreshed ticket details could not be loaded: ${wI(e,i.apiToken)}`)}return aq.publish(a4,{jiraTicketChanged:{issueKey:r.key,projectKey:r.projectKey,event:`aide:${t.toLowerCase()}`}}),r}cacheKey(e,t,A){return(0,AP.createHash)("sha256").update(wm({siteUrl:e,operation:t,params:A})).digest("hex")}async cachedCall(e){let t=await this.requireCredentials(),A=await aJ(),r=this.cacheKey(t.siteUrl,e.operation,e.params),i=Date.now(),n=await A.jiraCacheEntry.findUnique({where:{cacheKey:r}}),a=null!==n&&Date.now()-n.fetchedAt.getTime()<1e3*t.cacheTtlSeconds;if(!e.force&&a)return await this.logCall({operation:e.operation,requestSummary:e.requestSummary,source:"CACHE",durationMs:Date.now()-i,itemCount:e.itemCount?.(wp(n.responseJson))??null,sourceId:e.sourceId}),{value:wp(n.responseJson),source:"CACHE",stale:!1,fetchedAt:n.fetchedAt,entryId:n.id};let s=this.inFlight.get(r);if(s){let t=await s;return await this.logCall({operation:e.operation,requestSummary:`${e.requestSummary} (coalesced)`,source:"CACHE",durationMs:Date.now()-i,itemCount:e.itemCount?.(t.value)??null,sourceId:e.sourceId}),{...t,source:"CACHE"}}let o=(async()=>{try{let t=await e.fetcher(),n=new Date,a=await A.jiraCacheEntry.upsert({where:{cacheKey:r},create:{id:(0,AP.randomUUID)(),cacheKey:r,operation:e.operation,paramsJson:wm(e.params),responseJson:JSON.stringify(t),fetchedAt:n,sourceId:e.sourceId??null},update:{operation:e.operation,paramsJson:wm(e.params),responseJson:JSON.stringify(t),fetchedAt:n,sourceId:e.sourceId??null}});return await this.logCall({operation:e.operation,requestSummary:e.requestSummary,source:"LIVE",durationMs:Date.now()-i,itemCount:e.itemCount?.(t)??null,sourceId:e.sourceId}),{value:t,source:"LIVE",stale:!1,fetchedAt:n,entryId:a.id}}catch(r){let A=null!==n&&!1!==e.allowStaleOnError;if(await this.logCall({operation:e.operation,requestSummary:e.requestSummary,source:"ERROR",durationMs:Date.now()-i,statusCode:wf(r),error:wI(r,t.apiToken),servedStale:A,sourceId:e.sourceId}),A)return{value:wp(n.responseJson),source:"ERROR",stale:!0,fetchedAt:n.fetchedAt,entryId:n.id};throw Error(wI(r,t.apiToken))}})();this.inFlight.set(r,o);try{return await o}finally{this.inFlight.delete(r)}}async logCall(e){if(!this.recordCallLogs)return;let t=await aJ();await t.jiraApiCallLog.create({data:{id:(0,AP.randomUUID)(),operation:e.operation,requestSummary:e.requestSummary.slice(0,1e3),source:e.source,durationMs:Math.max(0,Math.round(e.durationMs)),statusCode:e.statusCode??null,error:e.error??null,itemCount:e.itemCount??null,servedStale:e.servedStale??!1,sourceId:e.sourceId??null}})}validateSourceName(e){let t=e.trim();if(!t||t.length>100)throw Error("Source name must be 1 to 100 characters");return t}async validateSource(e,t){let A=t.trim();if(!A)throw Error("BOARD"===e?"Board URL is required":"JQL is required");if("JQL"===e)return await this.cachedCall({operation:"JQL_VALIDATE",params:{jql:A},requestSummary:`Validate JQL: ${A}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issueSearch.searchForIssuesUsingJqlEnhancedSearch({jql:A,maxResults:1,fields:["key"],failFast:!0})}}),{value:A,boardId:null};let r=function(e,t){let A=new URL(e.trim());if(A.origin!==new URL(t).origin)throw Error("Board URL must belong to the configured Jira site");let r=A.pathname.match(/\/boards\/(\d+)(?:\/|$)/i),i=A.searchParams.get("rapidView"),n=Number(r?.[1]??i);if(!Number.isSafeInteger(n)||n<=0)throw Error("Board URL must contain a Jira board ID");return{boardId:n,normalizedUrl:A.toString()}}(A,(await this.requireCredentials()).siteUrl);return await this.cachedCall({operation:"BOARD",params:{boardId:r.boardId},requestSummary:`Board ${r.boardId}`,fetcher:async()=>{let{agile:e}=await this.getClients();return e.board.getBoard({boardId:r.boardId})}}),{value:r.normalizedUrl,boardId:r.boardId}}async loadJqlSource(e,t){let A,r=[],i=[],n=[],a=!1;do{let s=Math.min(100,1e3-r.length),o=await this.cachedCall({operation:"JQL_SEARCH",params:{jql:e.value,nextPageToken:A??null,maxResults:s,fields:wa},requestSummary:`JQL ${e.name}${A?" next page":""}`,sourceId:e.id,force:t,fetcher:async()=>{let{version3:t}=await this.getClients();return t.issueSearch.searchForIssuesUsingJqlEnhancedSearch({jql:e.value,nextPageToken:A,maxResults:s,fields:wa})},itemCount:e=>e.issues?.length??0});i.push(o);let l=o.value.issues??[];r.push(...l),n.push(...o.value.warningMessages??[]),"LIVE"===o.source&&await this.storeSummaries(o.entryId,l,o.fetchedAt),A=o.value.nextPageToken,r.length>=1e3&&A&&(a=!0)}while(A&&r.length<1e3)return this.buildBoardResult(r,i,n,a)}async loadBoardSource(e,t){if(!e.boardId)throw Error("Saved board source has no board ID");let A=await this.cachedCall({operation:"BOARD",params:{boardId:e.boardId},requestSummary:`Board ${e.boardId}`,sourceId:e.id,force:t,fetcher:async()=>{let{agile:t}=await this.getClients();return t.board.getBoard({boardId:e.boardId})}}),r=await this.cachedCall({operation:"BOARD_CONFIGURATION",params:{boardId:e.boardId},requestSummary:`Board ${e.boardId} configuration`,sourceId:e.id,force:t,fetcher:async()=>{let{agile:t}=await this.getClients();return t.board.getConfiguration({boardId:e.boardId})}}),i=[A,r],n=[],a=[],s=!1;if("scrum"===(wu(A.value.type)??"").toLowerCase()){let A=await this.cachedCall({operation:"SPRINTS",params:{boardId:e.boardId,state:"active"},requestSummary:`Active sprints for board ${e.boardId}`,sourceId:e.id,force:t,fetcher:async()=>{let{agile:t}=await this.getClients();return t.board.getAllSprints({boardId:e.boardId,state:"active",startAt:0,maxResults:100})},itemCount:e=>wc(e.values).length});i.push(A);let r=wc(A.value.values).map(wl);for(let A of(0===r.length&&a.push("This Scrum board has no active sprint."),r)){let r=wd(A.id);if(!r||n.length>=1e3)continue;let o=await this.loadAgileIssues("SPRINT_ISSUES",e,t,(e,t)=>({sprintId:r,startAt:e,maxResults:t,fields:wa}),async e=>{let{agile:t}=await this.getClients();return t.sprint.getIssuesForSprint(e)},n.length);n.push(...o.issues),i.push(...o.results),a.push(...o.warnings),s||=o.truncated}}else{let A=await this.loadAgileIssues("BOARD_ISSUES",e,t,(t,A)=>({boardId:e.boardId,startAt:t,maxResults:A,fields:wa}),async e=>{let{agile:t}=await this.getClients();return t.board.getIssuesForBoard(e)},0);n.push(...A.issues),i.push(...A.results),a.push(...A.warnings),s=A.truncated}let o=[...new Map(n.map(e=>[e.key??e.id,e])).values()],l=new Map;return wc(wl(r.value.columnConfig).columns).map(wl).forEach((e,t)=>{wc(e.statuses).map(wl).forEach(e=>{let A=wu(e.id);A&&l.set(A,t)})}),this.buildBoardResult(o,i,a,s,l)}async loadAgileIssues(e,t,A,r,i,n){let a=[],s=[],o=[],l=0,c=1/0,u=!1;for(;l<c&&a.length+n<1e3;){let u=r(l,Math.min(100,1e3-n-a.length)),d=await this.cachedCall({operation:e,params:u,requestSummary:`${e.replaceAll("_"," ")} from ${l}`,sourceId:t.id,force:A,fetcher:()=>i(u),itemCount:e=>e.issues?.length??0});s.push(d);let h=d.value.issues??[];if(a.push(...h),o.push(...d.value.warningMessages??[]),"LIVE"===d.source&&await this.storeSummaries(d.entryId,h,d.fetchedAt),c=d.value.total??a.length,0===h.length)break;l+=h.length}return a.length+n>=1e3&&l<c&&(u=!0),{issues:a,results:s,warnings:o,truncated:u}}buildBoardResult(e,t,A,r,i){let n=e.slice(0,1e3).map(wD),a=[...new Map(n.map(e=>[e.status,e])).values()];return a.sort((e,t)=>{let A=i?.get(e.statusId),r=i?.get(t.statusId);return void 0!==A||void 0!==r?(A??Number.MAX_SAFE_INTEGER)-(r??Number.MAX_SAFE_INTEGER):wk(e.statusCategory)-wk(t.statusCategory)||e.status.localeCompare(t.status)}),{tickets:n,statusOrder:a.map(e=>e.status),cache:wb(t),truncated:r,warnings:[...new Set(A)]}}async storeSummaries(e,t,A){let r=await aJ();await r.$transaction(async r=>{for(let e of t)e.key&&await r.jiraCachedTicket.upsert({where:{issueKey:e.key},create:{issueKey:e.key,projectKey:ww(e),summaryJson:JSON.stringify(e),summaryFetchedAt:A},update:{projectKey:ww(e),summaryJson:JSON.stringify(e),summaryFetchedAt:A}});await r.jiraCacheEntryIssue.deleteMany({where:{cacheEntryId:e}});let i=[...new Set(t.map(e=>e.key).filter(Boolean))];i.length>0&&await r.jiraCacheEntryIssue.createMany({data:i.map(t=>({cacheEntryId:e,issueKey:t}))})})}async storeDetail(e,t,A){if(!t.key)throw Error("Jira detail response did not include an issue key");let r=await aJ();await r.$transaction(async r=>{await r.jiraCachedTicket.upsert({where:{issueKey:t.key},create:{issueKey:t.key,projectKey:ww(t),detailJson:JSON.stringify(t),detailFetchedAt:A},update:{projectKey:ww(t),detailJson:JSON.stringify(t),detailFetchedAt:A}}),await r.jiraCacheEntryIssue.upsert({where:{cacheEntryId_issueKey:{cacheEntryId:e,issueKey:t.key}},create:{cacheEntryId:e,issueKey:t.key},update:{}})})}async storeComments(e,t,A,r){let i=await aJ();await i.$transaction(async i=>{for(let n of(await i.jiraCachedTicket.upsert({where:{issueKey:e},create:{issueKey:e,projectKey:e.split("-")[0]??"UNKNOWN",commentsJson:JSON.stringify(t),commentsFetchedAt:A},update:{commentsJson:JSON.stringify(t),commentsFetchedAt:A}}),r))await i.jiraCacheEntryIssue.upsert({where:{cacheEntryId_issueKey:{cacheEntryId:n,issueKey:e}},create:{cacheEntryId:n,issueKey:e},update:{}})})}normalizeTicketDetail(e,t,A,r,i){let n=wD(e),a=wl(e.fields),s=wl(e.names),o=wl(e.schema),l=[];for(let e of wc(a.issuelinks).map(wl)){let t=wl(e.type),A=wE(e.outwardIssue,wu(t.outward)??"relates to"),r=wE(e.inwardIssue,wu(t.inward)??"relates to");A&&l.push(A),r&&l.push(r)}let c=wE(a.parent,"parent"),u=wc(a.subtasks).map(e=>wE(e,"subtask")).filter(e=>null!==e),d=wc(a.sprint).map(wl),h=wc(a.closedSprints).map(wl),p=d.filter(e=>{let t=wu(e.state)?.toLowerCase();return!t||"active"===t}).map(e=>wu(e.name)).filter(e=>!!e),g=h.concat(d.filter(e=>wu(e.state)?.toLowerCase()==="closed")).map(e=>wu(e.name)).filter(e=>!!e),m=p.concat(g),f=t.map(wl).map(e=>({id:wu(e.id)??(0,AP.randomUUID)(),author:wC(e.author),body:e.body??null,content:wr(e.body??null,A),createdAt:wu(e.created),updatedAt:wu(e.updated)}));return{...n,jiraUrl:`${A}/browse/${n.key}`,description:a.description??null,descriptionContent:wr(a.description??null,A),reporter:wC(a.reporter),creator:wC(a.creator),labels:wc(a.labels).filter(e=>"string"==typeof e),components:wy(a.components),fixVersions:wy(a.fixVersions),affectedVersions:wy(a.versions),sprintNames:[...new Set(m)],activeSprintNames:[...new Set(p)],closedSprintNames:[...new Set(g)],parent:c,subtasks:u,issueLinks:l,attachments:wc(a.attachment).map(wl).map(e=>({id:wu(e.id)??(0,AP.randomUUID)(),filename:wu(e.filename)??"Attachment",contentUrl:wu(e.content),mimeType:wu(e.mimeType),size:wd(e.size),author:wC(e.author),createdAt:wu(e.created)})),comments:f,createdAt:wu(a.created),dueAt:wu(a.duedate),resolvedAt:wu(a.resolutiondate),timeTracking:a.timetracking??null,allFields:Object.entries(a).map(([e,t])=>{let r=wl(o[e]),i="string"==typeof t||wo(t)&&"doc"===t.type?wr(t,A):null;return{id:e,name:wu(s[e])??e,schemaType:wu(r.type),custom:!0===r.custom||e.startsWith("customfield_"),value:t??null,content:i}}).sort((e,t)=>e.name.localeCompare(t.name)),cache:r,commentsCache:i}}cachedTicketView(e,t){let A=wD(wl(wp(e.detailJson)??wp(e.summaryJson))),r=e.detailJson&&e.commentsJson?"FULL":e.detailJson?"DETAIL":"SUMMARY",i=[e.summaryFetchedAt,e.detailFetchedAt,e.commentsFetchedAt].filter(e=>null!==e).some(e=>Date.now()-e.getTime()>=1e3*t);return{issueKey:e.issueKey,projectKey:e.projectKey,summary:A.summary,status:"Unknown"===A.status?null:A.status,coverage:r,stale:i,summaryFetchedAt:e.summaryFetchedAt?.toISOString()??null,detailFetchedAt:e.detailFetchedAt?.toISOString()??null,commentsFetchedAt:e.commentsFetchedAt?.toISOString()??null,updatedAt:e.updatedAt.toISOString()}}validatePagination(e,t){if(!Number.isInteger(e)||e<1||e>100)throw Error("Pagination limit must be from 1 to 100");if(!Number.isInteger(t)||t<0)throw Error("Pagination offset must be non-negative");return{limit:e,offset:t}}metricWindow(e,t){return{window:e,total:t.length,live:t.filter(e=>"LIVE"===e.source).length,cache:t.filter(e=>"CACHE"===e.source).length,errors:t.filter(e=>"ERROR"===e.source).length,averageMs:0===t.length?0:Math.round(t.reduce((e,t)=>e+t.durationMs,0)/t.length)}}async pruneLogs(){let e=Date.now();if(e-this.lastPrunedAt<36e5)return;this.lastPrunedAt=e;let t=await aJ();await t.jiraApiCallLog.deleteMany({where:{createdAt:{lt:new Date(e-2592e6)}}})}}let wM="default",wT=/^[A-Z][A-Z0-9_]*-\d+$/,wU=new Set(["jira:issue_created","jira:issue_updated","comment_created","comment_updated","comment_deleted","worklog_created","worklog_updated","worklog_deleted","jira:worklog_updated","attachment_created","attachment_deleted","issuelink_created","issuelink_deleted","sprint_started","sprint_closed"]),wx={"jira:issue_created":"JIRA_ISSUE_CREATED","jira:issue_deleted":"JIRA_ISSUE_DELETED",comment_created:"JIRA_ISSUE_COMMAND",attachment_created:"JIRA_ATTACHMENT_ADDED",issuelink_created:"JIRA_ISSUE_LINKED"},wN="/api/public/jira/webhook",wF="/rest/webhooks/1.0/webhook",wG=new Set(["localhost","0.0.0.0","::1","[::1]",""]),wO=["jira:issue_created","jira:issue_updated","jira:issue_deleted","comment_created","worklog_created","attachment_created","issuelink_created","sprint_started","sprint_closed"];class wJ extends Error{httpStatus;constructor(e,t){super(e),this.httpStatus=t,this.name="JiraWebhookRequestError"}}function w_(e){return"string"==typeof e&&e.trim()?e.trim():null}function wV(e){return"string"==typeof e?e.length?e:null:"number"==typeof e||"boolean"==typeof e?String(e):null}function wP(e){let t=wL(e);if(!t)return null;let A=Array.isArray(t.items)?t.items:[];return{id:wV(t.id),items:A.map(wL).filter(e=>null!==e).map(e=>({field:w_(e.field)??w_(e.fieldId)??"Field",fieldId:w_(e.fieldId),fieldType:w_(e.fieldtype)??w_(e.fieldType),from:wV(e.from),fromString:wV(e.fromString),to:wV(e.to),toString:wV(e.toString)}))}}function wL(e){return"object"!=typeof e||null===e||Array.isArray(e)?null:e}function wH(e){return"object"==typeof e&&null!==e&&"status"in e&&"number"==typeof e.status?e.status:null}function wj(e){let t=wL(e);return t?{accountId:w_(t.accountId),displayName:w_(t.displayName)}:null}class wq{jira;credentials;workflowEvents;constructor(e,t,A){this.jira=e,this.credentials=t,this.workflowEvents=A}async storedWebhookSettings(){return hL(this.credentials,hm.jiraWebhookSettings,hW)}async webhooksEnabled(){let e=await aJ(),t=await e.jiraSettings.findUnique({where:{id:wM},select:{webhookEnabled:!0}});return!!t?.webhookEnabled&&this.credentials.isConfigured(hm.jiraWebhookSecret)}async getWebhookSettings(){let e=await aJ(),[t,A,r,i]=await Promise.all([e.jiraSettings.upsert({where:{id:wM},create:{id:wM},update:{}}),this.storedWebhookSettings(),this.credentials.isConfigured(hm.jiraWebhookSecret),e.jiraWebhookDelivery.findFirst({orderBy:[{receivedAt:"desc"},{deliveryId:"desc"}]})]);return{enabled:t.webhookEnabled&&r,secretConfigured:r,registered:!!t.webhookId,registrationId:t.webhookId??null,registeredUrl:A?.value.url??null,jql:A?.value.jql??null,configuredAt:t.webhookConfiguredAt?.toISOString()??null,lastReceivedAt:i?.receivedAt.toISOString()??null,lastOutcome:i?.outcome??null,lastError:i?.error??null}}async enableWebhook(){let e=(0,AP.randomBytes)(32).toString("base64url");return await this.credentials.setText(hm.jiraWebhookSecret,e,async e=>{await e.jiraSettings.upsert({where:{id:wM},create:{id:wM,webhookEnabled:!0,webhookConfiguredAt:new Date},update:{webhookEnabled:!0,webhookConfiguredAt:new Date}})}),{settings:await this.getWebhookSettings(),secret:e}}async registerWebhook(e){let t=function(e){let t;try{t=new URL(e.trim())}catch{throw Error("Enter the public URL of this server")}if("https:"!==t.protocol&&"http:"!==t.protocol)throw Error("The webhook URL must use HTTP or HTTPS");if(t.username||t.password||t.search||t.hash)throw Error("The webhook URL must not include credentials, query, or fragment");let A=t.hostname.toLowerCase().replace(/^\[|\]$/g,"");if(wG.has(A)||A.endsWith(".local")||A.endsWith(".localhost")||/^127\./.test(A)||/^10\./.test(A)||/^192\.168\./.test(A)||/^172\.(1[6-9]|2\d|3[01])\./.test(A))throw Error(`Jira cannot reach ${t.host}. Expose this server publicly, or set PUBLIC_BASE_URL to its public address.`);let r=t.pathname.replace(/\/+$/,"");if(!r)return`${t.origin}${wN}`;if(r.endsWith(wN))return`${t.origin}${r}`;throw Error(`The webhook URL must end with ${wN}`)}(e.url),A=e.jql?.trim()||null,r=(0,AP.randomBytes)(32).toString("base64url");await this.credentials.assertWritable();let i=await aJ(),n=await i.jiraSettings.findUnique({where:{id:wM},select:{webhookId:!0}}),a=await this.writeToJira({webhookId:n?.webhookId??null,url:t,jql:A,secret:r});return await this.credentials.setMany([{descriptor:hm.jiraWebhookSettings,value:hw({url:t,jql:A})},{descriptor:hm.jiraWebhookSecret,value:Buffer.from(r,"utf8")}],async e=>{await e.jiraSettings.upsert({where:{id:wM},create:{id:wM,webhookEnabled:!0,webhookConfiguredAt:new Date,webhookId:a},update:{webhookEnabled:!0,webhookConfiguredAt:new Date,webhookId:a}})}),{settings:await this.getWebhookSettings(),secret:r}}async rotateSecret(){if(!await this.credentials.isConfigured(hm.jiraWebhookSecret))throw Error("The Jira webhook is not configured");let[e,t]=await Promise.all([(await aJ()).jiraSettings.findUnique({where:{id:wM},select:{webhookId:!0}}),this.storedWebhookSettings()]);return e?.webhookId&&t?this.registerWebhook({url:t.value.url,jql:t.value.jql}):this.enableWebhook()}async disableWebhook(){await this.credentials.assertWritable();let e=await aJ(),t=await e.jiraSettings.findUnique({where:{id:wM},select:{webhookId:!0}});return t?.webhookId&&await this.deleteFromJira(t.webhookId),await this.credentials.deleteMany([hm.jiraWebhookSettings,hm.jiraWebhookSecret],async e=>{await e.jiraSettings.upsert({where:{id:wM},create:{id:wM},update:{webhookEnabled:!1,webhookConfiguredAt:null,webhookId:null}})}),this.getWebhookSettings()}async writeToJira(e){let t,A,r={name:"AI Development Environment",description:"Registered by AI Development Environment. Drives Jira workflow triggers and live ticket updates.",url:e.url,events:[...wO],excludeBody:!1,secret:e.secret,...e.jql?{filters:{"issue-related-events-section":e.jql}}:{}};if(e.webhookId){let t=`${wF}/${encodeURIComponent(e.webhookId)}`;try{return await this.jira.webhookApiRequest("PUT",t,r),e.webhookId}catch(e){if(404!==wH(e))throw e}}let i=await this.jira.webhookApiRequest("POST",wF,r),n=(t=w_(i?.self),(A=t?.match(/\/webhook\/([^/]+)\/?$/)?.[1])?decodeURIComponent(A):null);if(!n)throw Error("Jira did not return the ID of the new webhook");return n}async deleteFromJira(e){try{await this.jira.webhookApiRequest("DELETE",`${wF}/${encodeURIComponent(e)}`)}catch(e){if(404!==wH(e))throw e}}async deliveries(e=50,t=0){if(!Number.isInteger(e)||e<1||e>100)throw Error("Limit must be an integer from 1 to 100");if(!Number.isInteger(t)||t<0)throw Error("Offset must be a non-negative integer");let A=await this.webhooksEnabled();if(!A)return{enabled:A,items:[],total:0,limit:e,offset:t};let r=await aJ(),[i,n]=await Promise.all([r.jiraWebhookDelivery.findMany({orderBy:[{receivedAt:"desc"},{deliveryId:"desc"}],take:e,skip:t}),r.jiraWebhookDelivery.count()]);return{enabled:A,items:i.map(wK),total:n,limit:e,offset:t}}async clearDeliveries(){let e=await aJ();return await e.jiraWebhookDelivery.deleteMany(),!0}async prune(){let e=await aJ();await e.jiraWebhookDelivery.deleteMany({where:{receivedAt:{lt:new Date(Date.now()-2592e6)}}})}async handleWebhook(e){var t,A,r,i,n,a;let s,o,l=await this.credentials.getText(hm.jiraWebhookSecret);if(!l)throw new wJ("Jira webhook is not configured",503);if(!e.signature?.startsWith("sha256="))throw new wJ("Jira webhook signature is missing",401);if(t=`sha256=${(0,AP.createHmac)("sha256",l).update(e.body).digest("hex")}`,A=e.signature,s=Buffer.from(t),o=Buffer.from(A),!(s.length===o.length&&(0,AP.timingSafeEqual)(s,o)))throw new wJ("Jira webhook signature is invalid",401);if(!e.deliveryId?.trim())throw new wJ("Jira delivery ID is missing",400);let c=await aJ(),u=e.deliveryId.trim(),d=Number.parseInt(e.retryCount??"",10),h=Number.isInteger(d)?d:null;try{await c.jiraWebhookDelivery.create({data:{deliveryId:u,event:"unknown",outcome:"RECEIVED",retryCount:h}})}catch(e){if(!("object"==typeof e&&null!==e&&"code"in e&&"P2002"===e.code))throw e;if(0===(await c.jiraWebhookDelivery.updateMany({where:{deliveryId:u,outcome:{notIn:["PROCESSED","IGNORED"]}},data:{event:"unknown",issueKey:null,projectKey:null,changelogJson:null,retryCount:h,outcome:"RECEIVED",error:null,receivedAt:new Date,processedAt:null}})).count)return await this.prune().catch(()=>void 0),{outcome:"DUPLICATE",event:null,issueKey:null,triggersRecorded:0}}let p=async(e,t=null)=>{let A=await c.jiraWebhookDelivery.update({where:{deliveryId:u},data:{outcome:e,error:t,processedAt:new Date}});aq.publish(a8,{jiraWebhookDeliveryChanged:wK(A)})};try{let t,A,s,o,l,d;try{let A=JSON.parse(Buffer.from(e.body).toString("utf8")),r=wL(A);if(!r)throw Error("Payload is not an object");t=r}catch{throw new wJ("Jira webhook payload is invalid JSON",400)}let g=w_(t.webhookEvent),m=(r=t,A=wL(r.issue),(s=w_(A?.key)?.toUpperCase()??null)&&wT.test(s)?s:null),f=(i=t,o=wL(i.issue),l=wL(o?.fields),d=wL(l?.project)??wL(i.project),w_(d?.key)?.toUpperCase()??null),I=wP(t.changelog);if(await c.jiraWebhookDelivery.update({where:{deliveryId:u},data:{event:g??"unknown",issueKey:m,projectKey:f,changelogJson:I?JSON.stringify(I):null}}),!g)return await p("IGNORED","Payload has no webhookEvent"),{outcome:"IGNORED",event:g,issueKey:m,triggersRecorded:0};if(!(wU.has(g)||"jira:issue_deleted"===g))return await p("IGNORED",`Unhandled Jira event ${g}`),{outcome:"IGNORED",event:g,issueKey:m,triggersRecorded:0};let w=m?[m]:[];if("issuelink_created"===g||"issuelink_deleted"===g){let e,A,r=(n=t,e=wL(n.issueLink),[wV(e?.sourceIssueId),wV(e?.destinationIssueId)].filter((e,t,A)=>!!(e&&A.indexOf(e)===t)));if(0===r.length)return await p("IGNORED","Payload has no issue-link issue IDs"),{outcome:"IGNORED",event:g,issueKey:m,triggersRecorded:0};f=(m=(w=await this.jira.resolveIssueKeys(r))[0]??null)?f??((A=(a=m).lastIndexOf("-"))>0?a.slice(0,A):null):f,await c.jiraWebhookDelivery.update({where:{deliveryId:u},data:{issueKey:m,projectKey:f}})}let C="sprint_started"===g||"sprint_closed"===g;if(!C&&!m)return await p("IGNORED","Payload has no issue key"),{outcome:"IGNORED",event:g,issueKey:m,triggersRecorded:0};let y=[];if("jira:issue_deleted"===g)await this.jira.deleteCachedTicket(m),y.push({key:m,projectKey:f});else if(C){let e=function(e){let t=wV(wL(e.sprint)?.id);if(!t)return null;let A=Number(t);return Number.isSafeInteger(A)&&A>0?A:null}(t);if(!e)return await p("IGNORED","Payload has no valid sprint ID"),{outcome:"IGNORED",event:g,issueKey:m,triggersRecorded:0};let A=await this.jira.refreshSprintTickets(e);y.push(...A.map(e=>({key:e.key,projectKey:e.projectKey})))}else if("jira:issue_updated"===g){let e=await this.jira.refreshCachedTicket(m,I);y.push({key:e.key,projectKey:e.projectKey})}else if(wU.has(g)){let e=await Promise.all(w.map(e=>this.jira.refreshCachedTicket(e)));y.push(...e.map(e=>({key:e.key,projectKey:e.projectKey})))}let E=m?await this.recordWebhookTrigger({event:g,deliveryId:u,issueKey:m,projectKey:f,retries:h,payload:t}):0;for(let e of y)aq.publish(a4,{jiraTicketChanged:{issueKey:e.key,projectKey:e.projectKey,event:g}});return await p("PROCESSED"),{outcome:"PROCESSED",event:g,issueKey:m,triggersRecorded:E}}catch(t){let e=t instanceof Error?t.message:String(t);throw await p("ERROR",e),t}finally{await this.prune().catch(()=>void 0)}}async recordWebhookTrigger(e){if(!this.workflowEvents)return 0;let t=wx[e.event];if(!t)return 0;let{payload:A}=e,r=wL(A.issue),i=wL(r?.fields),n=wL(A.comment),a=wL(A.attachment),s=wL(A.issueLink),o=wL(i?.status),l=wP(A.changelog),c={ticket:{key:e.issueKey,title:w_(i?.summary),type:w_(wL(i?.issuetype)?.name),status:w_(o?.name),statusId:w_(o?.id),statusCategory:w_(wL(o?.statusCategory)?.key),assignee:w_(wL(i?.assignee)?.displayName),assigneeAccountId:w_(wL(i?.assignee)?.accountId),labels:Array.isArray(i?.labels)?i.labels:[],projectKey:e.projectKey,url:null},comment:n?{id:w_(n.id),body:w_(n.body)??"",author:wj(n.author)}:null,attachment:a?{id:w_(a.id),filename:w_(a.filename),mimeType:w_(a.mimeType),author:wj(a.author)}:null,link:s?{id:w_(s.id),type:w_(wL(s.issueLinkType)?.name),sourceIssueId:w_(s.sourceIssueId),destinationIssueId:w_(s.destinationIssueId)}:null,user:wj(A.user),changelog:l};return+!!await this.workflowEvents.record({kind:t,subjectKey:e.issueKey,dedupeKey:`jira-webhook-trigger:${e.deliveryId}:${t}`,payload:{...c,sessionData:c,cursorValue:`${e.deliveryId}:${t}`,webhook:{event:e.event,deliveryId:e.deliveryId,retryCount:e.retries}}})}}function wK(e){return{deliveryId:e.deliveryId,event:e.event,issueKey:e.issueKey,projectKey:e.projectKey,changelog:function(e){if(!e)return null;try{return wP(JSON.parse(e))}catch{return null}}(e.changelogJson),retryCount:e.retryCount,outcome:e.outcome,error:e.error,receivedAt:e.receivedAt.toISOString(),processedAt:e.processedAt?.toISOString()??null}}function wY(e){if(e.agentId)throw Error("Agent credentials cannot perform control-plane operations")}var wW=e.i(135160);function w$(e,{flags:t="",label:A="Regex pattern",maxLength:r=1024}={}){if(e.length>r)throw Error(`${A} must not exceed ${r} characters`);try{return new wW.RE2(e,t.includes("u")?t:`${t}u`)}catch(e){throw Error(`${A} is not valid RE2 syntax: ${e instanceof Error?e.message:String(e)}`)}}var wZ=e.i(898912),wz=e.i(969068);function wX(e){if(null===e||!/^\d+$/.test(e))return null;let t=Number(e);return Number.isSafeInteger(t)?t:null}function w0(e){let t=wX(e.get("x-ratelimit-limit")),A=wX(e.get("x-ratelimit-remaining")),r=wX(e.get("x-ratelimit-used")),i=wX(e.get("x-ratelimit-reset")),n=e.get("x-ratelimit-resource")?.trim()??"";if(null===t||null===A||null===r||null===i||!n)return null;let a=new Date(1e3*i);return Number.isFinite(a.getTime())?{limit:t,remaining:A,used:r,resetAt:a,resource:n}:null}async function w1(e,t){let A=w0(t.headers);if(!A)return null;try{let t=await aJ(),r=`${e}:${A.resource}`,i=new Date;await t.gitHubRateLimitSnapshot.upsert({where:{authentication_resource:{authentication:e,resource:A.resource}},create:{id:r,authentication:e,observedAt:i,...A},update:{observedAt:i,...A}})}catch{}return A}async function w8(){let e=await aJ();return(await e.gitHubRateLimitSnapshot.findMany({orderBy:[{resource:"asc"},{authentication:"asc"}]})).map(e=>({authentication:e.authentication,resource:e.resource,limit:e.limit,remaining:e.remaining,used:e.used,resetAt:e.resetAt.toISOString(),observedAt:e.observedAt.toISOString()}))}let w4="actions.cancelWorkflowRun",w2="actions.dispatchWorkflow",w3="actions.forceCancelWorkflowRun",w6="actions.getJobForWorkflowRun",w5="actions.getWorkflowRun",w9="actions.getWorkflowRunAttempt",w7="actions.listJobsForWorkflowRun",Ce="actions.listJobsForWorkflowRunAttempt",Ct="actions.listRepoWorkflows",CA="actions.listWorkflowRuns",Cr="actions.listWorkflowRunsForRepo",Ci="actions.reRunJobForWorkflowRun",Cn="actions.reRunWorkflow",Ca="actions.reRunWorkflowFailedJobs",Cs="apps.createInstallationAccessToken",Co="apps.getAuthenticated",Cl="apps.getInstallation",Cc="apps.updateWebhookConfigForApp",Cu="repos.listPullRequestsAssociatedWithCommit",Cd="users.listEmailsForAuthenticatedUser";class Ch extends Error{code;githubRequestId;statusCode;rateLimit;constructor(e,t,A=null,r=null,i=null){super(t),this.code=e,this.githubRequestId=A,this.statusCode=r,this.rateLimit=i,this.name="GitHubAppError"}}let Cp=new Map,Cg=new Map;function Cm(e,t,A){let r=e.trim();if(!/^[1-9]\d*$/.test(r))throw new Ch(A,`${t} must be a positive integer`);return r}function Cf(e){let{privateKeyPkcs8:t,keyFingerprint:A}=function(e){try{let t=(0,AP.createPrivateKey)({key:e.trim(),format:"pem"});if("rsa"!==t.asymmetricKeyType)throw Error("The key is not RSA");let A=t.export({format:"pem",type:"pkcs8"}).toString(),r=(0,AP.createPublicKey)(t).export({format:"der",type:"spki"}),i=`SHA256:${(0,AP.createHash)("sha256").update(r).digest("base64url")}`;return{key:t,privateKeyPkcs8:A,keyFingerprint:i}}catch{throw new Ch("INVALID_PRIVATE_KEY","The GitHub App private key is not a valid RSA PEM")}}(e.privateKey);return{...e,appId:Cm(e.appId,"GitHub App ID","INVALID_APP_ID"),installationId:Cm(e.installationId,"GitHub installation ID","INVALID_INSTALLATION_ID"),privateKeyPkcs8:t,keyFingerprint:A}}async function CI(e){try{let t=await (0,wZ.importPKCS8)(e.privateKeyPkcs8,"RS256"),A=Math.floor(Date.now()/1e3);return await new wz.SignJWT({}).setProtectedHeader({alg:"RS256",typ:"JWT"}).setIssuer(e.appId).setIssuedAt(A-60).setExpirationTime(A+540).sign(t)}catch{throw new Ch("INVALID_PRIVATE_KEY","The GitHub App private key could not sign an App JWT")}}function Cw(e){return`${e.appId}:${e.installationId}:${e.keyFingerprint}`}function CC(e){return{accept:"application/vnd.github+json",authorization:e,"user-agent":"ai-development-environment","x-github-api-version":"2022-11-28"}}async function Cy(e,t,A,r,i){let n,a=Date.now(),s=(t.method??"GET").toUpperCase(),o=e===r?.graphqlUrl&&"string"==typeof t.body?t.body:null;try{n=await fetch(e,{...t,cache:"no-store"})}catch{throw r?.requestObserver&&await Promise.resolve(r.requestObserver({url:e,method:s,operation:A,requestSource:i,body:o,durationMs:Date.now()-a,statusCode:null,error:"GitHub could not be reached",rateLimit:null})).catch(()=>void 0),new Ch("GITHUB_APP_REQUEST_FAILED","GitHub could not be reached")}return r?.responseObserver&&await Promise.resolve(r.responseObserver(n)).catch(()=>void 0),r?.requestObserver&&await Promise.resolve(r.requestObserver({url:e,method:s,operation:A,requestSource:i,body:o,durationMs:Date.now()-a,statusCode:n.status,error:n.ok?null:`GitHub returned HTTP ${n.status}`,rateLimit:w0(n.headers)})).catch(()=>void 0),n}async function CE(e){try{return await e.json()}catch{return null}}function CQ(e){return e.headers.get("x-github-request-id")}function CB(e,t,A=[]){let r=`GitHub returned HTTP ${t}`;for(let t of(e&&"object"==typeof e&&"message"in e&&"string"==typeof e.message&&(r=e.message),A))t&&(r=r.split(t).join("[REDACTED]"));return r}async function Cb(e,t){let A=await Cy(`${e.apiBaseUrl}/app/installations/${e.installationId}`,{headers:CC(`Bearer ${t}`)},Cl,e,"GITHUB_SETTINGS"),r=await CE(A),i=CQ(A);if(401===A.status)throw new Ch("GITHUB_APP_UNAUTHORIZED","GitHub rejected the App ID or private key",i);if(404===A.status)throw new Ch("INSTALLATION_NOT_FOUND","The GitHub App installation was not found",i);if(!A.ok||!r||"object"!=typeof r)throw new Ch("GITHUB_APP_REQUEST_FAILED",CB(r,A.status,[t,e.privateKey,e.privateKeyPkcs8]),i);if(String(r.app_id)!==e.appId)throw new Ch("APP_INSTALLATION_MISMATCH","The installation does not belong to the configured GitHub App",i);return r}async function CD(e,t){let A=await Cy(`${e.apiBaseUrl}/app`,{headers:CC(`Bearer ${t}`)},Co,e,"GITHUB_SETTINGS"),r=await CE(A),i=CQ(A);if(401===A.status)throw new Ch("GITHUB_APP_UNAUTHORIZED","GitHub rejected the App ID or private key",i);if(!A.ok||!r||"object"!=typeof r)throw new Ch("GITHUB_APP_REQUEST_FAILED",CB(r,A.status,[t,e.privateKey,e.privateKeyPkcs8]),i);if(String(r.id)!==e.appId||!r.slug||!r.owner?.login||!r.owner.type)throw new Ch("GITHUB_APP_REQUEST_FAILED","GitHub returned incomplete GitHub App registration details",i);return{details:r,githubRequestId:i}}async function Ck(e){let t=Cf(e),A=await CI(t),r=await CD(t,A);return{appSlug:r.details.slug,appOwnerLogin:r.details.owner.login,appOwnerType:r.details.owner.type,githubRequestId:r.githubRequestId}}async function CS(e,t,A){let r=A??await CI(e),i=await Cy(`${e.apiBaseUrl}/app/installations/${e.installationId}/access_tokens`,{method:"POST",headers:CC(`Bearer ${r}`)},Cs,e,t),n=await CE(i),a=CQ(i);if(401===i.status)throw new Ch("GITHUB_APP_UNAUTHORIZED","GitHub rejected the App ID or private key",a);if(404===i.status)throw new Ch("INSTALLATION_NOT_FOUND","The GitHub App installation was not found",a);if(!i.ok||!n||"object"!=typeof n)throw new Ch("GITHUB_APP_REQUEST_FAILED",CB(n,i.status,[r,e.privateKey,e.privateKeyPkcs8]),a);if("string"!=typeof n.token||!n.token||"string"!=typeof n.expires_at||Number.isNaN(Date.parse(n.expires_at)))throw new Ch("GITHUB_APP_REQUEST_FAILED","GitHub returned an invalid installation token response",a);if("write"!==(n.permissions?.actions??"none"))throw new Ch("ACTIONS_PERMISSION_REQUIRED","The GitHub App installation must grant Actions: read and write",a);return{token:n.token,expiresAt:new Date(n.expires_at),permissions:n.permissions??{},repositorySelection:n.repository_selection??"selected"}}async function Cv(e,t){let A=Cw(e),r=Cp.get(A);if(r&&r.expiresAt.getTime()-3e5>Date.now())return r;let i=Cg.get(A);if(i)return i;let n=CS(e,t).then(e=>(Cp.set(A,e),e)).finally(()=>Cg.delete(A));return Cg.set(A,n),n}function CR(){Cp.clear(),Cg.clear()}async function CM(e,t,A){let r=Cf(e),i=await Cv(r,A),n=await t(i.token);return 401===n.status&&(Cp.delete(Cw(r)),i=await Cv(r,A),n=await t(i.token)),{response:n,token:i.token}}async function CT(e,t,A,r){let{response:i,token:n}=await CM(e,i=>Cy(e.graphqlUrl,{method:"POST",headers:{...CC(`Bearer ${i}`),"content-type":"application/json"},body:JSON.stringify({query:t,variables:A})},null,e,r),r),a=await CE(i),s=CQ(i),o=w0(i.headers);if(401===i.status)throw new Ch("GITHUB_APP_UNAUTHORIZED","GitHub rejected the installation access token",s,i.status,o);if(!i.ok||a?.errors?.length||!a?.data){let t=a?.errors?.map(e=>e.message).filter(Boolean).join("; ")||CB(a,i.status,[n]);throw new Ch("GITHUB_APP_REQUEST_FAILED",CB({message:t},i.status,[n,e.privateKey]),s,i.status,o)}return{data:a.data,githubRequestId:s,statusCode:i.status,rateLimit:o}}async function CU(e){let t=Cf(e),A=await CI(t),[r,i]=await Promise.all([Cb(t,A),CD(t,A)]),n=await CS(t,"GITHUB_SETTINGS",A);Cp.set(Cw(t),n);let a=await CT(t,"query VerifyGitHubApp { viewer { login } }",{},"GITHUB_SETTINGS");return{appId:t.appId,installationId:t.installationId,keyFingerprint:t.keyFingerprint,appSlug:i.details.slug,appOwnerLogin:i.details.owner.login,appOwnerType:i.details.owner.type,accountLogin:r.account.login,repositorySelection:n.repositorySelection,actionsPermission:n.permissions.actions??"none",checksPermission:n.permissions.checks??"none",commitStatusesPermission:n.permissions.statuses??"none",webhookEvents:Array.isArray(r.events)?r.events:[],viewerLogin:a.data.viewer.login,verifiedAt:new Date,githubRequestId:a.githubRequestId}}async function Cx(e,t){let A=Cf(e),r=await CI(A),i=await Cy(`${A.apiBaseUrl}/app/hook/config`,{method:"PATCH",headers:{...CC(`Bearer ${r}`),"content-type":"application/json"},body:JSON.stringify({url:t.url,content_type:"json",secret:t.secret,insecure_ssl:"0"})},Cc,A,"GITHUB_SETTINGS"),n=CQ(i);if(404===i.status)return{configured:!1,githubRequestId:n};if(!i.ok)throw new Ch("GITHUB_APP_REQUEST_FAILED",CB(await CE(i),i.status,[r,t.secret,A.privateKey]),n);return{configured:!0,githubRequestId:n}}async function CN(e,t){let A=`${e.apiBaseUrl}/repos/${encodeURIComponent(t.owner)}/${encodeURIComponent(t.repository)}/actions/runs/${encodeURIComponent(t.workflowRunId)}/rerun`,{response:r,token:i}=await CM(e,r=>Cy(A,{method:"POST",headers:CC(`Bearer ${r}`)},Cn,e,t.requestSource),t.requestSource),n=CQ(r);if(401===r.status)throw new Ch("GITHUB_APP_UNAUTHORIZED","GitHub rejected the installation access token",n);if(!r.ok){let t=await CE(r);throw new Ch(404===r.status?"REPOSITORY_NOT_INSTALLED":"GITHUB_APP_REQUEST_FAILED",404===r.status?"The repository or workflow run is not available to this installation":CB(t,r.status,[i,e.privateKey]),n)}return{githubRequestId:n}}async function CF(e,t){let A=`${e.apiBaseUrl}/repos/${encodeURIComponent(t.owner)}/${encodeURIComponent(t.repository)}/actions/runs/${encodeURIComponent(t.workflowRunId)}/rerun-failed-jobs`,{response:r,token:i}=await CM(e,r=>Cy(A,{method:"POST",headers:CC(`Bearer ${r}`)},Ca,e,t.requestSource),t.requestSource),n=CQ(r);if(!r.ok){let t=await CE(r);throw new Ch(404===r.status?"REPOSITORY_NOT_INSTALLED":"GITHUB_APP_REQUEST_FAILED",404===r.status?"The repository or workflow run is not available to this installation":CB(t,r.status,[i,e.privateKey]),n)}return{githubRequestId:n}}async function CG(e,t){let A=t.force?"force-cancel":"cancel",r=t.force?w3:w4,i=`${e.apiBaseUrl}/repos/${encodeURIComponent(t.owner)}/${encodeURIComponent(t.repository)}/actions/runs/${encodeURIComponent(t.workflowRunId)}/${A}`,{response:n,token:a}=await CM(e,A=>Cy(i,{method:"POST",headers:CC(`Bearer ${A}`)},r,e,t.requestSource),t.requestSource),s=CQ(n);if(401===n.status)throw new Ch("GITHUB_APP_UNAUTHORIZED","GitHub rejected the installation access token",s);if(!n.ok){let t=await CE(n);throw new Ch(404===n.status?"REPOSITORY_NOT_INSTALLED":"GITHUB_APP_REQUEST_FAILED",404===n.status?"The repository or workflow run is not available to this installation":CB(t,n.status,[a,e.privateKey]),s)}return{githubRequestId:s}}async function CO(e,t){let A=[],r=1,i=0;do{let n=`${e.apiBaseUrl}/repos/${encodeURIComponent(t.owner)}/${encodeURIComponent(t.repository)}/actions/runs/${encodeURIComponent(t.workflowRunId)}/jobs?filter=latest&per_page=100&page=${r}`,{response:a,token:s}=await CM(e,A=>Cy(n,{headers:CC(`Bearer ${A}`)},w7,e,t.requestSource),t.requestSource),o=CQ(a);if(401===a.status)throw new Ch("GITHUB_APP_UNAUTHORIZED","GitHub rejected the installation access token",o);let l=await CE(a);if(!a.ok||!l||"object"!=typeof l)throw new Ch("GITHUB_APP_REQUEST_FAILED",CB(l,a.status,[s,e.privateKey]),o);if(!Number.isInteger(l.total_count)||!Array.isArray(l.jobs))throw new Ch("GITHUB_APP_REQUEST_FAILED","GitHub returned an invalid workflow jobs response",o);i=l.total_count??0,A.push(...l.jobs),r+=1}while(A.length<i)return A}async function CJ(e,t){let A=`${e.apiBaseUrl}/repos/${encodeURIComponent(t.owner)}/${encodeURIComponent(t.repository)}`,r=`${A}/actions/jobs/${encodeURIComponent(t.jobId)}`,i=await CM(e,A=>Cy(r,{headers:CC(`Bearer ${A}`)},w6,e,t.requestSource),t.requestSource),n=CQ(i.response);if(401===i.response.status)throw new Ch("GITHUB_APP_UNAUTHORIZED","GitHub rejected the installation access token",n);let a=await CE(i.response);if(!i.response.ok||!a||"object"!=typeof a)throw new Ch(404===i.response.status?"ACTIONS_JOB_NOT_FOUND":"GITHUB_APP_REQUEST_FAILED",404===i.response.status?"The GitHub Actions job is not available to this installation":CB(a,i.response.status,[i.token,e.privateKey]),n);if(String(a.run_id??"")!==t.workflowRunId)throw new Ch("ACTIONS_JOB_RUN_MISMATCH","The GitHub Actions job does not belong to the selected workflow run",n);if(a.status?.toLowerCase()!=="completed")throw new Ch("ACTIONS_JOB_NOT_COMPLETED","The GitHub Actions job must be completed before it can be retried",n);let s=await CM(e,A=>Cy(`${r}/rerun`,{method:"POST",headers:CC(`Bearer ${A}`)},Ci,e,t.requestSource),t.requestSource),o=CQ(s.response);if(401===s.response.status)throw new Ch("GITHUB_APP_UNAUTHORIZED","GitHub rejected the installation access token",o);if(!s.response.ok){let t=await CE(s.response);throw new Ch(404===s.response.status?"ACTIONS_JOB_NOT_FOUND":"GITHUB_APP_REQUEST_FAILED",404===s.response.status?"The GitHub Actions job is not available to this installation":CB(t,s.response.status,[s.token,e.privateKey]),o)}return{githubRequestId:o}}let C_=new Set(["FAILURE","ERROR","STARTUP_FAILURE","TIMED_OUT"]),CV=new Set(["ACTION_REQUIRED","EXPECTED","IN_PROGRESS","PENDING","QUEUED"]),CP=["COMPLETED","EXHAUSTED","STOPPED"],CL={WORKFLOW_RUN:4,PULL_REQUEST:3,WORKTREE_BRANCH:2,REPOSITORY:1},CH="server:github-auto-retry";function Cj(e){return e.toISOString()}function Cq(e){return{...e,scope:e.scope,mode:e.mode,failureStrategy:e.failureStrategy,status:e.status,executions:e.executions.map(e=>({...e,lastStatus:e.lastStatus,updatedAt:Cj(e.updatedAt)})),createdAt:Cj(e.createdAt),updatedAt:Cj(e.updatedAt)}}class CK{github;polling;timer;pollingTickRunning;rerunRequested;reconciling;constructor(e,t,A=!0){this.github=e,this.polling=t,this.timer=null,this.pollingTickRunning=!1,this.rerunRequested=!1,this.reconciling=!1,this.polling?.register({id:CH,kind:"GITHUB_AUTO_RETRY",runtime:"SERVER",enabled:!0,cadenceSeconds:60,details:{}}),A&&queueMicrotask(()=>void this.pollReconcile())}schedule(e){this.timer&&clearTimeout(this.timer);let t=1e3*Math.max(30,e);this.timer=setTimeout(()=>void this.pollReconcile(),t),this.timer.unref(),this.polling?.schedule(CH,new Date(Date.now()+t))}configurationChanged(){if(this.pollingTickRunning){this.rerunRequested=!0;return}this.timer&&clearTimeout(this.timer),this.timer=null,queueMicrotask(()=>void this.pollReconcile())}async pollReconcile(){if(this.pollingTickRunning)return;this.pollingTickRunning=!0;let e=60;try{let t=async()=>(e=(await (await aJ()).gitHubSettings.upsert({where:{id:"default"},create:{id:"default"},update:{}})).actionsNotificationPollIntervalSeconds,this.polling?.configure(CH,{cadenceSeconds:e}),this.reconcile());this.polling?await this.polling.run(CH,t,e=>({activeRules:e})):await t()}catch{}finally{this.pollingTickRunning=!1,this.rerunRequested?(this.rerunRequested=!1,queueMicrotask(()=>void this.pollReconcile())):this.schedule(e)}}include(){return{targets:{orderBy:{createdAt:"asc"}},executions:{orderBy:{updatedAt:"desc"}}}}async list(e){let t=await aJ(),A=e.codebaseRepositoryId?await this.github.autoRetryRepositoryId(e.codebaseRepositoryId):null;return(await t.gitHubAutoRetryRule.findMany({where:{...A?{codebaseRepositoryId:A}:{},...e.workflowRunId?{targets:{some:{workflowRunId:e.workflowRunId}}}:{}},include:this.include(),orderBy:{updatedAt:"desc"}})).map(Cq)}validate(e){if(!e.codebaseRepositoryId.trim())throw Error("Codebase repository is required");if("COUNT"===e.mode&&null==e.retryLimit)throw Error("Count mode requires a retry limit");if(null!=e.retryLimit&&(!Number.isInteger(e.retryLimit)||e.retryLimit<1||e.retryLimit>100))throw Error("Retry limit must be an integer from 1 to 100");if("FAILURE"===e.mode&&void 0===e.retryLimit)throw Error("Failure retry limit must be a number or null");if("WORKFLOW_RUN"===e.scope){if(!e.targets.length||e.targets.some(e=>!e.workflowRunId))throw Error("Current-run rules require workflow run targets")}else if(!e.allWorkflows&&!e.targets.length)throw Error("Select at least one workflow or choose all workflows");if("WORKTREE_BRANCH"===e.scope&&!e.worktreeId)throw Error("Worktree future rules require a worktree");if("PULL_REQUEST"===e.scope&&!e.pullRequestNumber)throw Error("Pull request future rules require a pull request number")}async save(e){if(!await this.github.autoRetryCredentialsReady())throw Error("A GitHub token and verified GitHub App with Actions write access are required");e={...e,codebaseRepositoryId:await this.github.autoRetryRepositoryId(e.codebaseRepositoryId)},this.validate(e);let t=await aJ(),A=e.branch?.trim()||null;if("WORKTREE_BRANCH"===e.scope&&e.worktreeId){let r=await t.worktree.findUnique({where:{id:e.worktreeId},select:{branch:!0}});if(!(A=r?.branch??null))throw Error("The worktree does not have a branch")}let r=await t.gitHubAutoRetryRule.findMany({where:{id:e.id?{not:e.id}:void 0,enabled:!0,scope:e.scope,codebaseRepositoryId:e.codebaseRepositoryId},include:{targets:!0}}),i=new Set(e.targets.map(e=>e.workflowRunId).filter(e=>!!e));if(r.find(t=>"WORKFLOW_RUN"===e.scope?t.targets.some(e=>e.workflowRunId&&i.has(e.workflowRunId)):"WORKTREE_BRANCH"===e.scope?t.branch===A:"PULL_REQUEST"!==e.scope||t.pullRequestNumber===e.pullRequestNumber))throw Error("An enabled Auto Retry rule already exists for this scope");let n=e.id??(0,AP.randomUUID)(),a=await t.$transaction(async t=>(await t.gitHubAutoRetryRule.upsert({where:{id:n},create:{id:n,scope:e.scope,codebaseRepositoryId:e.codebaseRepositoryId,repositoryGithubId:e.repositoryGithubId??null,worktreeId:e.worktreeId??null,branch:A,pullRequestNumber:e.pullRequestNumber??null,allWorkflows:e.allWorkflows,mode:e.mode,retryLimit:e.retryLimit??null,failureStrategy:e.failureStrategy,status:"ACTIVE",enabled:!0},update:{scope:e.scope,codebaseRepositoryId:e.codebaseRepositoryId,repositoryGithubId:e.repositoryGithubId??null,worktreeId:e.worktreeId??null,branch:A,pullRequestNumber:e.pullRequestNumber??null,allWorkflows:e.allWorkflows,mode:e.mode,retryLimit:e.retryLimit??null,failureStrategy:e.failureStrategy,status:"ACTIVE",enabled:!0,lastError:null,activatedAt:new Date}}),await t.gitHubAutoRetryTarget.deleteMany({where:{ruleId:n}}),e.targets.length&&await t.gitHubAutoRetryTarget.createMany({data:e.targets.map(e=>({id:(0,AP.randomUUID)(),ruleId:n,workflowId:e.workflowId?.trim()||null,workflowRunId:e.workflowRunId?.trim()||null,jobName:e.jobName?.trim()||null}))}),await t.gitHubAutoRetryExecution.deleteMany({where:{ruleId:n}}),t.gitHubAutoRetryRule.findUniqueOrThrow({where:{id:n},include:this.include()})));return queueMicrotask(()=>void this.reconcile().catch(()=>void 0)),Cq(a)}async setEnabled(e,t){let A=await aJ(),r=await A.$transaction(async A=>(t&&await A.gitHubAutoRetryExecution.updateMany({where:{ruleId:e,pendingFromAttempt:{not:null}},data:{pendingFromAttempt:null,observedAttempt:0,status:"WATCHING",lastError:null,finishedAt:null}}),A.gitHubAutoRetryRule.update({where:{id:e},data:{enabled:t,status:t?"ACTIVE":"PAUSED",lastError:null,...t?{activatedAt:new Date}:{}},include:this.include()})));return t&&queueMicrotask(()=>void this.reconcile().catch(()=>void 0)),Cq(r)}async delete(e){return(await (await aJ()).gitHubAutoRetryRule.deleteMany({where:{id:e}})).count>0}matches(e,t,A=!1){if("WORKFLOW_RUN"!==e.scope){let r=CV.has(t.status);if(!A&&!r&&Date.parse(t.createdAt)<e.activatedAt.getTime())return!1}return"WORKTREE_BRANCH"===e.scope?t.headBranch===e.branch:"PULL_REQUEST"!==e.scope||t.pullRequests.some(t=>t.number===e.pullRequestNumber)}async execution(e,t,A){return(await aJ()).gitHubAutoRetryExecution.upsert({where:{ruleId_workflowRunId_targetKey:{ruleId:e,workflowRunId:t.id,targetKey:A}},create:{id:(0,AP.randomUUID)(),ruleId:e,workflowRunId:t.id,workflowId:t.workflowId,targetKey:A},update:{}})}targetKeys(e,t){if(e.allWorkflows)return["workflow"];let A=e.targets.filter(e=>e.workflowRunId===t.id||e.workflowId===t.workflowId);return A.some(e=>!e.jobName)||"FAILURE"===e.mode&&"ALL_JOBS"===e.failureStrategy?["workflow"]:A.flatMap(e=>e.jobName?[`job:${e.jobName}`]:[])}async finishExecution(e,t,A){await (await aJ()).gitHubAutoRetryExecution.update({where:{id:e},data:{status:A,observedAttempt:t.runAttempt,lastStatus:t.status,pendingFromAttempt:null,finishedAt:new Date,lastError:null}})}async trigger(e,t,A,r,i){let n=await aJ();await n.gitHubAutoRetryExecution.update({where:{id:t.id},data:{status:"RETRYING",pendingFromAttempt:A.runAttempt,observedAttempt:A.runAttempt,lastStatus:A.status,lastError:null}});try{await this.github.autoRetryRerun(e.codebaseRepositoryId,A.id,r,i,{actor:"auto-retry",ipAddress:null,autoRetryRuleId:e.id,autoRetryExecutionId:t.id}),await n.gitHubAutoRetryExecution.update({where:{id:t.id},data:{automaticRetries:{increment:1},lastError:null}})}catch(r){let A=r instanceof Error?r.message:String(r);await n.gitHubAutoRetryExecution.update({where:{id:t.id},data:{lastError:A}}),await n.gitHubAutoRetryRule.update({where:{id:e.id},data:{lastError:A}})}}async reconcileExecution(e,t,A,r){var i;let n,a=await this.execution(e.id,t,A);if(null!=a.pendingFromAttempt)if(t.runAttempt>a.pendingFromAttempt)await (await aJ()).gitHubAutoRetryExecution.update({where:{id:a.id},data:{pendingFromAttempt:null,status:"WATCHING",lastError:null}});else{if(Date.now()-a.updatedAt.getTime()<12e4)return!1;let t=await aJ(),A="GitHub did not report a new attempt after the rerun request; automatic retries are paused to prevent a duplicate rerun";return await t.$transaction(async t=>{await t.gitHubAutoRetryExecution.update({where:{id:a.id},data:{status:"ERROR",lastError:A}}),await t.gitHubAutoRetryRule.update({where:{id:e.id},data:{enabled:!1,status:"PAUSED",lastError:A}})}),!1}if(a.observedAttempt===t.runAttempt&&null==a.pendingFromAttempt)return!1;let s=r?.status??t.status,o=(n=null!=(i={mode:e.mode,retryLimit:e.retryLimit,automaticRetries:a.automaticRetries,state:s}).retryLimit&&i.automaticRetries>=i.retryLimit,"COUNT"===i.mode?"SUCCESS"!==i.state?"STOP":n?"COMPLETE":"RETRY":"SUCCESS"===i.state?"COMPLETE":C_.has(i.state)?n?"EXHAUSTED":"RETRY":"STOP");return"COMPLETE"===o?(await this.finishExecution(a.id,t,"COMPLETED"),!1):"EXHAUSTED"===o?(await this.finishExecution(a.id,t,"EXHAUSTED"),!1):"STOP"===o?(await this.finishExecution(a.id,t,"STOPPED"),!1):("COUNT"===e.mode?await this.trigger(e,a,t,r?"JOB":"ALL_JOBS",r?.id??null):await this.trigger(e,a,t,r?"ALL_JOBS"===e.failureStrategy?"ALL_JOBS":"JOB":"ALL_JOBS"===e.failureStrategy?"ALL_JOBS":"FAILED_JOBS",r?.id??null),!0)}async reconcile(){if(this.reconciling)return 0;this.reconciling=!0;let e=0;try{let t=await aJ(),A=await t.gitHubAutoRetryRule.findMany({where:{enabled:!0,status:"ACTIVE"},include:{targets:!0},orderBy:{createdAt:"asc"}});e=A.length;let r=new Map,i=A.length?await t.gitHubAutoRetryExecution.findMany({where:{ruleId:{in:A.map(e=>e.id)},status:{notIn:CP}},select:{ruleId:!0,workflowRunId:!0}}):[],n=new Map;for(let e of i){let t=n.get(e.ruleId)??new Set;t.add(e.workflowRunId),n.set(e.ruleId,t)}let a=new Map;for(let e of A){let A=r.get(e.codebaseRepositoryId);if(!A)try{A=await this.github.autoRetryRuns(e.codebaseRepositoryId),r.set(e.codebaseRepositoryId,A)}catch(A){await t.gitHubAutoRetryRule.update({where:{id:e.id},data:{lastError:A instanceof Error?A.message:String(A)}});continue}let i=new Set(e.targets.map(e=>e.workflowRunId).filter(e=>!!e)),s=n.get(e.id)??new Set;for(let r of new Set([...i,...s]))if(!A.some(e=>e.id===r))try{A.push(await this.github.autoRetryRun(e.codebaseRepositoryId,r,!1))}catch(A){await t.gitHubAutoRetryRule.update({where:{id:e.id},data:{lastError:A instanceof Error?A.message:String(A)}})}for(let t of A){if("WORKFLOW_RUN"===e.scope&&!i.has(t.id)||!this.matches(e,t,s.has(t.id))||!e.allWorkflows&&!e.targets.some(e=>e.workflowRunId===t.id||e.workflowId===t.workflowId))continue;let A=a.get(t.id);(!A||CL[e.scope]>CL[A.rule.scope])&&a.set(t.id,{rule:e,run:t})}}for(let{rule:e,run:A}of a.values()){let r=this.targetKeys(e,A);if(CV.has(A.status)){await Promise.all(r.map(t=>this.execution(e.id,A,t)));continue}let i=A,n=e.allWorkflows?[{jobName:null}]:e.targets.filter(e=>e.workflowRunId===i.id||e.workflowId===i.workflowId);if(n.some(e=>!e.jobName)){await this.reconcileExecution(e,i,"workflow",null);continue}let a=await Promise.all(r.map(t=>this.execution(e.id,i,t)));if(!a.some(e=>e.observedAttempt!==i.runAttempt||null!=e.pendingFromAttempt&&i.runAttempt>e.pendingFromAttempt)){for(let t=0;t<a.length;t+=1)a[t]?.pendingFromAttempt!=null&&await this.reconcileExecution(e,i,r[t],null);continue}try{i=await this.github.autoRetryRun(e.codebaseRepositoryId,i.id)}catch(A){await t.gitHubAutoRetryRule.update({where:{id:e.id},data:{lastError:A instanceof Error?A.message:String(A)}});continue}if("FAILURE"===e.mode&&"ALL_JOBS"===e.failureStrategy){let t=i.jobs.filter(e=>n.some(t=>t.jobName===e.name)),A=t.find(e=>C_.has(e.status))??t.find(e=>"SUCCESS"!==e.status)??t[0];A?await this.reconcileExecution(e,i,"workflow",A):a[0]&&await this.finishExecution(a[0].id,i,"STOPPED");continue}let s=new Map(r.map((e,t)=>[e,a[t]]));for(let t of n){let A=i.jobs.find(e=>e.name===t.jobName);if(!A){let e=s.get(`job:${t.jobName}`);e&&await this.finishExecution(e.id,i,"STOPPED");continue}if(await this.reconcileExecution(e,i,`job:${A.name}`,A))break}}for(let e of A.filter(e=>"WORKFLOW_RUN"===e.scope)){let A=await t.gitHubAutoRetryExecution.findMany({where:{ruleId:e.id},select:{status:!0}});A.length>0&&A.every(e=>CP.includes(e.status))&&await t.gitHubAutoRetryRule.update({where:{id:e.id},data:{enabled:!1,status:A.some(e=>"EXHAUSTED"===e.status)?"EXHAUSTED":"COMPLETED"}})}}finally{this.reconciling=!1}return e}}let CY={LEGACY:0,GRAPHQL:1,REST:2,WEBHOOK:3,MUTATION:4},CW=new Set(["CANCELLED","FAILURE","STALE","STARTUP_FAILURE","TIMED_OUT"]),C$=new Set(["ACTION_REQUIRED","IN_PROGRESS","PENDING","QUEUED"]),CZ=new Set(["SUCCESS","NEUTRAL","SKIPPED"]);function Cz(e,t=null){return e.some(e=>"ERROR"===e)?"ERROR":e.some(e=>CW.has(e))?"FAILURE":e.some(e=>C$.has(e))?"PENDING":e.some(e=>"EXPECTED"===e)||"EXPECTED"===t?"EXPECTED":e.length>0&&e.every(e=>CZ.has(e))?"SUCCESS":0===e.length&&t?t:"NONE"}function CX(e,t){let A=(t||e||"NONE").toUpperCase();return C8(A)?A:"REQUESTED"===A||"WAITING"===A?"QUEUED":"NONE"}function C0(e){return C$.has(e)?1:2*("NONE"!==e&&"EXPECTED"!==e)}function C1(e,t,A){let r=e.runAttempt??0,i=t.runAttempt??0;if(i!==r)return i>r;let n=e.githubUpdatedAt?.getTime()??0,a=t.githubUpdatedAt?.getTime()??0;if(a!==n)return a>n;if("MUTATION"===e.source&&e.optimisticUntil&&e.optimisticUntil.getTime()>A.getTime())return"MUTATION"===t.source;let s="MUTATION"===e.source?CY.LEGACY:CY[e.source],o=CY[t.source];if("MUTATION"!==e.source&&"MUTATION"!==t.source&&e.status&&t.status){let A=C0(e.status),r=C0(t.status);if(r!==A)return r>A}return o===s||o>s}function C8(e){return"ACTION_REQUIRED"===e||"CANCELLED"===e||"ERROR"===e||"EXPECTED"===e||"FAILURE"===e||"IN_PROGRESS"===e||"NEUTRAL"===e||"PENDING"===e||"QUEUED"===e||"SKIPPED"===e||"STALE"===e||"STARTUP_FAILURE"===e||"SUCCESS"===e||"TIMED_OUT"===e||"NONE"===e}function C4(e){return"ERROR"===e||"EXPECTED"===e||"FAILURE"===e||"PENDING"===e||"SUCCESS"===e||"NONE"===e}function C2(e){try{let t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}function C3(e){return"NONE"===e||"EXPECTED"===e?0:"ACTION_REQUIRED"===e||"PENDING"===e||"QUEUED"===e?1:"IN_PROGRESS"===e?2:3}function C6(e){return"GRAPHQL"===e||"REST"===e||"WEBHOOK"===e||"MUTATION"===e?e:"LEGACY"}function C5(e){return{id:e.githubPipelineId,name:e.name,status:C8(e.status)?e.status:"NONE",url:e.url,checkSuiteId:e.checkSuiteId,canRetry:e.canRetry,retryUnavailableReason:e.retryUnavailableReason,jobs:C2(e.jobsJson),workflowRunId:e.workflowRunId,workflowId:e.workflowId,runNumber:e.runNumber,runAttempt:e.runAttempt}}function C9(e,t){return{...C5(t),repositoryGithubId:e.repositoryGithubId,headSha:e.headSha,revision:e.revision,isCurrent:t.isCurrent}}function C7(e){return{repositoryGithubId:e.repositoryGithubId,repositoryNameWithOwner:e.repositoryNameWithOwner,repositoryUrl:e.repositoryUrl,headSha:e.headSha,pipelineStatus:C4(e.pipelineStatus)?e.pipelineStatus:"NONE",pipelines:e.records.filter(e=>e.isCurrent).map(C5).sort((e,t)=>e.name.localeCompare(t.name)),revision:e.revision,updatedAt:e.updatedAt.toISOString()}}function ye(e){return JSON.stringify({identityKey:e.identityKey,githubPipelineId:e.githubPipelineId,name:e.name,status:e.status,url:e.url,checkSuiteId:e.checkSuiteId,workflowRunId:e.workflowRunId,workflowId:e.workflowId,runNumber:e.runNumber,runAttempt:e.runAttempt,canRetry:e.canRetry,retryUnavailableReason:e.retryUnavailableReason,jobsJson:e.jobsJson,isCurrent:e.isCurrent})}function yt(e){return JSON.stringify({repositoryNameWithOwner:e.repositoryNameWithOwner,repositoryUrl:e.repositoryUrl,pipelineStatus:e.pipelineStatus,records:e.records.map(ye).sort((e,t)=>e.localeCompare(t))})}class yA{lastPrunedAt=0;async snapshot(e){let t=await aJ(),A=await t.gitHubPipelineSnapshot.findUnique({where:{repositoryGithubId_headSha:{repositoryGithubId:e.repositoryGithubId.trim(),headSha:e.headSha.trim()}},include:{records:!0}});return A?C7(A):null}async snapshots(e){let t=e.map(e=>({repositoryGithubId:e.repositoryGithubId.trim(),headSha:e.headSha.trim()})).filter(e=>e.repositoryGithubId&&e.headSha);if(0===t.length)return[];let A=await aJ();return(await A.gitHubPipelineSnapshot.findMany({where:{OR:t},include:{records:!0}})).map(C7)}async records(e){let t=e.map(e=>({repositoryGithubId:e.repositoryGithubId.trim(),workflowRunId:e.workflowRunId.trim()})).filter(e=>e.repositoryGithubId&&e.workflowRunId);if(0===t.length)return[];let A=await aJ();return(await A.gitHubPipelineRecord.findMany({where:{OR:t.map(e=>({workflowRunId:e.workflowRunId,snapshot:{repositoryGithubId:e.repositoryGithubId}}))},include:{snapshot:{include:{records:!0}}}})).map(e=>C9(e.snapshot,e))}async observeWorkflowRuns(e,t="REST",A=!0){let r=new Map;for(let t of e){if(!t.repositoryGithubId||!t.headSha)continue;let e=`${t.repositoryGithubId}\u0000${t.headSha}`,A=r.get(e)??[];A.push(t),r.set(e,A)}let i=new Map;for(let e of r.values()){let r=e[0];await this.observeSnapshot({repositoryGithubId:r.repositoryGithubId,repositoryNameWithOwner:r.repositoryNameWithOwner,repositoryUrl:r.repositoryUrl,headSha:r.headSha,pipelines:e.map(e=>(function(e,t,A=!0){return{id:e.id,name:e.name,status:e.status,url:e.url,checkSuiteId:e.checkSuiteId,workflowRunId:e.id,workflowId:e.workflowId,runNumber:e.runNumber,runAttempt:e.runAttempt,canRetry:e.canRetry,retryUnavailableReason:e.retryUnavailableReason,source:t,githubUpdatedAt:new Date(e.updatedAt),sourceFetchedAt:new Date,isCurrent:A}})(e,t,A))})}for(let t of(await this.records(e.map(e=>({repositoryGithubId:e.repositoryGithubId,workflowRunId:e.id})))))t.workflowRunId&&i.set(t.workflowRunId,t);return i}async observeJobs(e,t,A,r="REST",i=null){let n=await aJ(),a=await n.gitHubPipelineRecord.findFirst({where:{workflowRunId:t,...e?{snapshot:{repositoryGithubId:e}}:{}},include:{snapshot:!0},orderBy:[{runAttempt:"desc"},{sourceFetchedAt:"desc"}]});if(!a)return null;let s=A.filter(e=>null==e.runAttempt||null==a.runAttempt||e.runAttempt===a.runAttempt);if(A.length>0&&0===s.length)return C9({...a.snapshot,records:[a]},a);let o=C2(a.jobsJson),l=new Map(o.map(e=>[e.id,e])),c=s.map(e=>(function(e,t){if(!e)return t;let A=e.runAttempt??0,r=t.runAttempt??0;if(r!==A)return r>A?t:e;let i=C3(e.status),n=C3(t.status);return n<i?e:n===i&&t.steps.length<e.steps.length?{...t,steps:e.steps}:t})(l.get(e.id),e)),u="WEBHOOK"===r?[...new Map([...o,...c].map(e=>[e.id,e])).values()]:c,d=C8(a.status)?a.status:"NONE",h="REST"===r&&s.length>0?Cz(s.map(e=>e.status),null):"NONE",p=("ERROR"===h||"FAILURE"===h||"SUCCESS"===h)&&a.snapshot.graphqlRollupStatus===h?h:d;return(await this.observeSnapshot({repositoryGithubId:a.snapshot.repositoryGithubId,repositoryNameWithOwner:a.snapshot.repositoryNameWithOwner,repositoryUrl:a.snapshot.repositoryUrl,headSha:a.snapshot.headSha,pipelines:[{...C5(a),status:p,source:r,jobs:u,githubUpdatedAt:i??a.githubUpdatedAt,isCurrent:a.isCurrent}]})).changedPipeline}async optimisticByCheckSuite(e,t,A){return this.optimisticRecord({repositoryGithubId:e,checkSuiteId:t,workflowRunId:null},A)}async optimisticByWorkflowRun(e,t,A){return this.optimisticRecord({repositoryGithubId:e,checkSuiteId:null,workflowRunId:t},A)}async optimisticJobByCheckSuite(e,t,A){let r=await aJ(),i=await r.gitHubPipelineRecord.findFirst({where:{checkSuiteId:t,snapshot:{repositoryGithubId:e}},orderBy:[{runAttempt:"desc"},{sourceFetchedAt:"desc"}]});if(!i)return null;let n=C2(i.jobsJson).map(e=>e.id===A?{...e,status:"QUEUED",canRetry:!1,retryUnavailableReason:"NOT_COMPLETED"}:e);return this.optimisticByCheckSuite(e,t,{status:"QUEUED",jobs:n})}async optimisticJobByWorkflowRun(e,t,A){let r=await aJ(),i=await r.gitHubPipelineRecord.findFirst({where:{workflowRunId:t,...e?{snapshot:{repositoryGithubId:e}}:{}},orderBy:[{runAttempt:"desc"},{sourceFetchedAt:"desc"}]});if(!i)return null;let n=C2(i.jobsJson).map(e=>e.id===A?{...e,status:"QUEUED",canRetry:!1,retryUnavailableReason:"NOT_COMPLETED"}:e);return this.optimisticByWorkflowRun(e,t,{status:"QUEUED",jobs:n})}async optimisticRecord(e,t){let A=await aJ(),r=await A.gitHubPipelineRecord.findFirst({where:{...e.repositoryGithubId?{snapshot:{repositoryGithubId:e.repositoryGithubId}}:{},...e.checkSuiteId?{checkSuiteId:e.checkSuiteId}:{workflowRunId:e.workflowRunId}},include:{snapshot:!0},orderBy:[{runAttempt:"desc"},{sourceFetchedAt:"desc"}]});if(!r)return null;let i=new Date;return(await this.observeSnapshot({repositoryGithubId:r.snapshot.repositoryGithubId,repositoryNameWithOwner:r.snapshot.repositoryNameWithOwner,repositoryUrl:r.snapshot.repositoryUrl,headSha:r.snapshot.headSha,pipelines:[{...C5(r),status:t.status,jobs:t.jobs,canRetry:!1,retryUnavailableReason:"NOT_COMPLETED",source:"MUTATION",githubUpdatedAt:r.githubUpdatedAt,sourceFetchedAt:i,optimisticUntil:new Date(i.getTime()+12e4),isCurrent:r.isCurrent}]})).changedPipeline}async observeSnapshot(e){let t=e.repositoryGithubId.trim(),A=e.headSha.trim();if(!t||!A)throw Error("GitHub repository ID and head SHA are required");let r=new Date,i=e.sourceFetchedAt??r,n=await aJ(),a=await n.$transaction(async n=>{let a=await n.gitHubPipelineSnapshot.upsert({where:{repositoryGithubId_headSha:{repositoryGithubId:t,headSha:A}},create:{id:(0,AP.randomUUID)(),repositoryGithubId:t,repositoryNameWithOwner:e.repositoryNameWithOwner,repositoryUrl:e.repositoryUrl,headSha:A,pipelineStatus:"NONE",graphqlRollupStatus:null,revision:0,lastGraphqlSyncAt:null,lastObservedAt:r},update:{lastObservedAt:r},include:{records:!0}}),s=yt(a),o=!!(e.completeGraphqlRollup&&(!a.lastGraphqlSyncAt||i.getTime()>=a.lastGraphqlSyncAt.getTime())),l=new Set,c=null;for(let t of e.pipelines){let e=function(e){var t;return(t={id:e.id,checkSuiteId:e.checkSuiteId,workflowRunId:e.workflowRunId,statusContext:e.statusContext}).checkSuiteId?`CHECK_SUITE:${t.checkSuiteId}`:t.workflowRunId?`WORKFLOW_RUN:${t.workflowRunId}`:t.statusContext?`STATUS_CONTEXT:${t.statusContext}`:`PIPELINE:${t.id}`}(t),A=(await n.gitHubPipelineRecord.findMany({where:{snapshotId:a.id}})).filter(A=>A.identityKey===e||t.checkSuiteId&&A.checkSuiteId===t.checkSuiteId||t.workflowRunId&&A.workflowRunId===t.workflowRunId),s=A[0]??null;for(let e of A.slice(1))s&&C1({runAttempt:s.runAttempt,githubUpdatedAt:s.githubUpdatedAt,source:C6(s.source),optimisticUntil:s.optimisticUntil,status:C8(s.status)?s.status:"NONE"},{runAttempt:e.runAttempt,githubUpdatedAt:e.githubUpdatedAt,source:C6(e.source),status:C8(e.status)?e.status:"NONE"},r)&&(s=e);for(let e of A)s&&e.id!==s.id&&(0===C2(s.jobsJson).length&&C2(e.jobsJson).length>0&&(s=await n.gitHubPipelineRecord.update({where:{id:s.id},data:{jobsJson:e.jobsJson}})),await n.gitHubPipelineRecord.delete({where:{id:e.id}}),c=s.id);let u=t.sourceFetchedAt??i,d=t.githubUpdatedAt??null,h=void 0===t.runAttempt?s?.runAttempt??null:t.runAttempt,p=void 0!==t.jobs?JSON.stringify(t.jobs):s&&(h??0)<=(s.runAttempt??0)?s.jobsJson:"[]",g=!!o||(!1===t.isCurrent?s?.isCurrent??!1:t.isCurrent??s?.isCurrent??!0);if(s){l.add(s.id);let A=ye(s),i=C1({runAttempt:s.runAttempt,githubUpdatedAt:s.githubUpdatedAt,source:C6(s.source),optimisticUntil:s.optimisticUntil,status:C8(s.status)?s.status:"NONE"},{runAttempt:h,githubUpdatedAt:d,source:t.source,status:t.status},r),a=!!(!i&&"MUTATION"===s.source&&s.optimisticUntil&&s.optimisticUntil.getTime()>r.getTime()&&"MUTATION"!==t.source);A!==ye(s=await n.gitHubPipelineRecord.update({where:{id:s.id},data:i?{identityKey:e,githubPipelineId:t.id,name:t.name,status:t.status,url:void 0===t.url?s.url:t.url,checkSuiteId:void 0===t.checkSuiteId?s.checkSuiteId:t.checkSuiteId,workflowRunId:void 0===t.workflowRunId?s.workflowRunId:t.workflowRunId,workflowId:void 0===t.workflowId?s.workflowId:t.workflowId,runNumber:void 0===t.runNumber?s.runNumber:t.runNumber,runAttempt:h,canRetry:void 0===t.canRetry?s.canRetry:t.canRetry,retryUnavailableReason:void 0===t.retryUnavailableReason?s.retryUnavailableReason:t.retryUnavailableReason,jobsJson:p,source:t.source,githubUpdatedAt:d,sourceFetchedAt:u,lastObservedAt:r,optimisticUntil:void 0===t.optimisticUntil?s.optimisticUntil:t.optimisticUntil,isCurrent:g}:{lastObservedAt:r,...void 0!==t.jobs&&!a?{jobsJson:p}:{},...o?{isCurrent:!0}:{}}}))&&(c=s.id)}else c=(s=await n.gitHubPipelineRecord.create({data:{id:(0,AP.randomUUID)(),snapshotId:a.id,identityKey:e,githubPipelineId:t.id,name:t.name,status:t.status,url:t.url??null,checkSuiteId:t.checkSuiteId??null,workflowRunId:t.workflowRunId??null,workflowId:t.workflowId??null,runNumber:t.runNumber??null,runAttempt:h,canRetry:t.canRetry??!1,retryUnavailableReason:t.retryUnavailableReason??null,jobsJson:p,source:t.source,githubUpdatedAt:d,sourceFetchedAt:u,lastObservedAt:r,optimisticUntil:t.optimisticUntil??null,isCurrent:g}})).id;l.add(s.id)}if(o)for(let e of(await n.gitHubPipelineRecord.findMany({where:{snapshotId:a.id,isCurrent:!0}})))!l.has(e.id)&&e.sourceFetchedAt.getTime()<=i.getTime()&&(!e.optimisticUntil||e.optimisticUntil.getTime()<=r.getTime())&&(await n.gitHubPipelineRecord.update({where:{id:e.id},data:{isCurrent:!1}}),c??=e.id);let u=await n.gitHubPipelineRecord.findMany({where:{snapshotId:a.id}}),d=o?e.graphqlRollupStatus??null:a.graphqlRollupStatus,h=Cz(u.filter(e=>e.isCurrent).map(e=>C8(e.status)?e.status:"NONE"),d&&C4(d)?d:null),p=s!==yt(a=await n.gitHubPipelineSnapshot.update({where:{id:a.id},data:{repositoryNameWithOwner:e.repositoryNameWithOwner,repositoryUrl:e.repositoryUrl,pipelineStatus:h,graphqlRollupStatus:d,lastGraphqlSyncAt:o?i:a.lastGraphqlSyncAt,lastObservedAt:r},include:{records:!0}}))||null!==c;p&&(a=await n.gitHubPipelineSnapshot.update({where:{id:a.id},data:{revision:{increment:1}},include:{records:!0}}));let g=a,m=c?g.records.find(e=>e.id===c)??null:null;return{changed:p,change:{snapshot:C7(g),changedPipeline:m?C9(g,m):null}}});return a.changed&&aq.publish(a1,{githubPipelineStatusChanged:a.change}),this.pruneIfNeeded().catch(()=>void 0),a.change}subscribe(){return aq.iterate(a1)}async pruneIfNeeded(){let e=Date.now();if(e-this.lastPrunedAt<864e5)return;this.lastPrunedAt=e;let t=await aJ();await t.gitHubPipelineSnapshot.deleteMany({where:{lastObservedAt:{lt:new Date(e-2592e6)}}})}}let yr=/^[_A-Za-z][_0-9A-Za-z]*$/,yi=new Map([["GitHubWorktreePullRequestStatuses",60]]),yn=[{window:"5m",milliseconds:3e5},{window:"10m",milliseconds:6e5},{window:"1h",milliseconds:36e5},{window:"24h",milliseconds:864e5}];function ya(e){return JSON.stringify(function e(t){return Array.isArray(t)?t.map(e):t&&"object"==typeof t?Object.fromEntries(Object.keys(t).sort().map(A=>[A,e(t[A])])):t}(e))}let ys=/(?:authorization|password|private.?key|secret|token)$/i;function yo(e,t=""){return ys.test(t)?"[REDACTED]":Array.isArray(e)?e.map(e=>yo(e)):e&&"object"==typeof e?Object.fromEntries(Object.entries(e).map(([e,t])=>[e,yo(t,e)])):e}function yl(e){try{return JSON.parse(e)}catch{return null}}function yc(e){return e&&"object"==typeof e?{statusCode:"number"==typeof e.statusCode?e.statusCode:null,rateLimit:e.rateLimit&&"object"==typeof e.rateLimit?e.rateLimit:null}:{statusCode:null,rateLimit:null}}class yu{recordCallLogs;inFlight;cacheWrites;cacheGeneration;lastPrunedAt;constructor(e="true"!==process.env.GITHUB_CACHE_LOGGING_DISABLED){this.recordCallLogs=e,this.inFlight=new Map,this.cacheWrites=new Set,this.cacheGeneration=0,this.lastPrunedAt=0}cacheKey(e){return(0,AP.createHash)("sha256").update(ya({authentication:e.authentication,endpoint:e.endpoint,query:e.normalizedQuery,variables:e.variables})).digest("hex")}inFlightKey(e,t,A){return[A,e,!0===t.force?"force":"normal",!1===t.allowStaleOnError?"strict":"stale"].join(":")}async defaultTtlSeconds(){let e=await aJ();return(await e.gitHubSettings.upsert({where:{id:"default"},create:{id:"default",cacheTtlSeconds:300},update:{}})).cacheTtlSeconds}async effectiveTtlSeconds(e){let t=await aJ(),[A,r]=await Promise.all([t.gitHubGraphqlCacheTtlOverride.findUnique({where:{operation:e}}),this.defaultTtlSeconds()]);return A?.ttlSeconds??r}async query(e){let t=this.cacheGeneration,A=await aJ(),r=this.cacheKey(e),i=this.inFlightKey(r,e,t),n=Date.now(),[a,s,o]=await Promise.all([A.gitHubGraphqlCacheEntry.findUnique({where:{cacheKey:r}}),this.effectiveTtlSeconds(e.operation),A.gitHubRateLimitSnapshot.findUnique({where:{authentication_resource:{authentication:e.authentication,resource:"graphql"}}})]);if(t!==this.cacheGeneration)return this.query(e);let l=null!==a&&Date.now()-a.fetchedAt.getTime()<1e3*s;if(!e.force&&l)return(await this.log({...this.graphqlContext(e),authentication:e.authentication,operation:e.operation,source:"CACHE",durationMs:Date.now()-n,pointCost:0,pointsAvoided:a.pointCost??0}).catch(()=>void 0),t!==this.cacheGeneration)?this.query(e):{data:yl(a.responseJson),source:"CACHE",stale:!1,fetchedAt:a.fetchedAt,entryId:a.id,pointCost:a.pointCost};let c=this.inFlight.get(i);if(c){let A=await c;return t!==this.cacheGeneration||(await this.log({...this.graphqlContext(e),authentication:e.authentication,operation:e.operation,source:"CACHE",durationMs:Date.now()-n,pointCost:0,pointsAvoided:A.pointCost??0}).catch(()=>void 0),t!==this.cacheGeneration)?this.query(e):{...A,source:"CACHE"}}if(o?.remaining===0&&o.resetAt.getTime()>Date.now()){let A=`GitHub GraphQL rate limit is exhausted until ${o.resetAt.toISOString()}`,r=null!==a&&!1!==e.allowStaleOnError;if(await this.log({...this.graphqlContext(e),authentication:e.authentication,operation:e.operation,source:"ERROR",durationMs:Date.now()-n,error:A,servedStale:r,pointCost:0,pointsAvoided:r?a.pointCost??0:0,rateLimit:{limit:o.limit,remaining:o.remaining,used:o.used,resetAt:o.resetAt,resource:o.resource}}).catch(()=>void 0),t!==this.cacheGeneration)return this.query(e);if(r)return{data:yl(a.responseJson),source:"ERROR",stale:!0,fetchedAt:a.fetchedAt,entryId:a.id,pointCost:a.pointCost};throw Error(A)}let u=(async()=>{try{let i=await e.fetcher(),a=new Date,s=null;if(t===this.cacheGeneration){let t=A.gitHubGraphqlCacheEntry.upsert({where:{cacheKey:r},create:{id:(0,AP.randomUUID)(),cacheKey:r,authentication:e.authentication,endpoint:e.endpoint,operation:e.operation,query:e.query,variablesJson:ya(e.variables),responseJson:JSON.stringify(i.data),fetchedAt:a,pointCost:i.pointCost},update:{operation:e.operation,query:e.query,variablesJson:ya(e.variables),responseJson:JSON.stringify(i.data),fetchedAt:a,pointCost:i.pointCost}});this.cacheWrites.add(t);try{s=await t}finally{this.cacheWrites.delete(t)}}return await this.log({...this.graphqlContext(e),authentication:e.authentication,operation:e.operation,source:"LIVE",durationMs:Date.now()-n,statusCode:i.statusCode,pointCost:i.pointCost,rateLimit:i.rateLimit}).catch(()=>void 0),{data:i.data,source:"LIVE",stale:!1,fetchedAt:a,entryId:t===this.cacheGeneration?s?.id??null:null,pointCost:i.pointCost}}catch(i){let A=yc(i),r=t===this.cacheGeneration&&null!==a&&!1!==e.allowStaleOnError;if(await this.log({...this.graphqlContext(e),authentication:e.authentication,operation:e.operation,source:"ERROR",durationMs:Date.now()-n,statusCode:A.statusCode,error:i instanceof Error?i.message:String(i),servedStale:r,pointsAvoided:r?a?.pointCost??0:0,rateLimit:A.rateLimit}).catch(()=>void 0),t!==this.cacheGeneration)throw i;if(r)return{data:yl(a.responseJson),source:"ERROR",stale:!0,fetchedAt:a.fetchedAt,entryId:a.id,pointCost:a.pointCost};throw i}})();this.inFlight.set(i,u);try{return await u}finally{this.inFlight.get(i)===u&&this.inFlight.delete(i)}}async mutation(e){let t,A=Date.now();try{t=await e.fetcher()}catch(r){let t=yc(r);throw await this.log({...this.graphqlContext(e),authentication:e.authentication,operation:e.operation,source:"ERROR",durationMs:Date.now()-A,statusCode:t.statusCode,error:r instanceof Error?r.message:String(r),rateLimit:t.rateLimit}).catch(()=>void 0),r}return await this.clear(),await this.log({...this.graphqlContext(e),authentication:e.authentication,operation:e.operation,source:"LIVE",durationMs:Date.now()-A,statusCode:t.statusCode,pointCost:null,rateLimit:t.rateLimit}).catch(()=>void 0),t.data}async updateTtl(e,t){if(!Number.isInteger(e)||e<1||e>1440)throw Error("Cache TTL must be an integer from 1 to 1440 minutes");let A=await aJ();return await A.gitHubSettings.upsert({where:{id:"default"},create:{id:"default",cacheTtlSeconds:60*e},update:{cacheTtlSeconds:60*e}}),t()}async ttlOverrides(){let e=await aJ();return(await e.gitHubGraphqlCacheTtlOverride.findMany({orderBy:{operation:"asc"}})).map(e=>({operation:e.operation,ttlSeconds:e.ttlSeconds,builtIn:yi.has(e.operation),createdAt:e.createdAt.toISOString(),updatedAt:e.updatedAt.toISOString()}))}async cacheableOperations(){let e=await aJ(),[t,A]=await Promise.all([e.gitHubGraphqlCacheTtlOverride.findMany({select:{operation:!0}}),e.gitHubGraphqlCacheEntry.findMany({distinct:["operation"],select:{operation:!0}})]);return[...new Set([...yi.keys(),...t.map(({operation:e})=>e),...A.map(({operation:e})=>e)])].sort((e,t)=>e.localeCompare(t))}async saveTtlOverride(e,t){let A=e.trim();if(!yr.test(A))throw Error("Operation must be a valid GraphQL operation name");if(!Number.isInteger(t)||t<1||t>86400)throw Error("Cache TTL must be an integer from 1 to 86400 seconds");let r=await aJ(),i=await r.gitHubGraphqlCacheTtlOverride.upsert({where:{operation:A},create:{operation:A,ttlSeconds:t},update:{ttlSeconds:t}});return{operation:i.operation,ttlSeconds:i.ttlSeconds,builtIn:yi.has(i.operation),createdAt:i.createdAt.toISOString(),updatedAt:i.updatedAt.toISOString()}}async deleteTtlOverride(e){let t=e.trim();if(yi.has(t))throw Error("Built-in cache TTL overrides cannot be deleted");let A=await aJ();return(await A.gitHubGraphqlCacheTtlOverride.deleteMany({where:{operation:t}})).count>0}async recordRestCall(e){let t=e.endpoint,A={};try{let r=new URL(e.endpoint);t=r.pathname,A={path:r.pathname,query:Object.fromEntries(r.searchParams)}}catch{A={endpoint:e.endpoint}}await this.log({authentication:e.authentication,apiType:"REST",method:e.method.toUpperCase(),endpoint:e.endpoint,operation:e.operation,requestSource:e.requestSource,requestSummary:`${e.method.toUpperCase()} ${t}`,variables:A,source:e.error?"ERROR":"LIVE",durationMs:e.durationMs,statusCode:e.statusCode,error:e.error,pointCost:1,rateLimit:e.rateLimit})}async recordGraphqlTransportCall(e){await this.log({...this.graphqlContext(e),authentication:e.authentication,operation:e.operation,requestSource:e.requestSource,source:e.error?"ERROR":"LIVE",durationMs:e.durationMs,statusCode:e.statusCode,error:e.error,rateLimit:e.rateLimit})}async clear(){let{cacheWrites:e}=this.beginInvalidation();await Promise.allSettled(e);let t=await aJ();return await t.gitHubGraphqlCacheEntry.deleteMany(),!0}async clearForCredentialChange(e){let{cacheWrites:t,inFlight:A}=this.beginInvalidation();await Promise.allSettled(t);let r=await aJ();return await r.gitHubGraphqlCacheEntry.deleteMany(),await Promise.allSettled(A),await r.gitHubRateLimitSnapshot.deleteMany({where:{authentication:e}}),!0}async clearCalls(){let e=await aJ();return await e.gitHubApiCallLog.deleteMany(),!0}async delete(e){let t=await aJ();return(await t.gitHubGraphqlCacheEntry.deleteMany({where:{id:e}})).count>0}async entries(e=50,t=0){let A=this.pagination(e,t),r=await aJ(),[i,n,a,s]=await Promise.all([r.gitHubGraphqlCacheEntry.findMany({take:A.limit,skip:A.offset,orderBy:{fetchedAt:"desc"}}),r.gitHubGraphqlCacheEntry.count(),this.defaultTtlSeconds(),r.gitHubGraphqlCacheTtlOverride.findMany({select:{operation:!0,ttlSeconds:!0}})]),o=new Map(s.map(({operation:e,ttlSeconds:t})=>[e,t]));return{...A,total:n,items:i.map(e=>this.entryView(e,o.get(e.operation)??a))}}async entry(e){let t=await aJ(),A=await t.gitHubGraphqlCacheEntry.findUnique({where:{id:e}});if(!A)return null;let r=await this.effectiveTtlSeconds(A.operation);return{...this.entryView(A,r),query:A.query,variables:yl(A.variablesJson),response:yl(A.responseJson)}}async calls(e=50,t=0,A={}){let r=this.pagination(e,t);await this.pruneLogs();let i=await aJ(),n={...A.apiType?{apiType:A.apiType}:{},...A.requestSource?{requestSource:A.requestSource}:{},...A.source?{source:A.source}:{}},[a,s]=await Promise.all([i.gitHubApiCallLog.findMany({where:n,take:r.limit,skip:r.offset,orderBy:{createdAt:"desc"}}),i.gitHubApiCallLog.count({where:n})]);return{...r,total:s,items:a.map(e=>({id:e.id,authentication:e.authentication,apiType:e.apiType,method:e.method,endpoint:e.endpoint,operation:e.operation,requestSource:e.requestSource,requestSummary:e.requestSummary,variables:yl(e.variablesJson),source:e.source,durationMs:e.durationMs,statusCode:e.statusCode,error:e.error,servedStale:e.servedStale,pointCost:e.pointCost,pointsAvoided:e.pointsAvoided,rateLimitLimit:e.rateLimitLimit,rateLimitRemaining:e.rateLimitRemaining,rateLimitUsed:e.rateLimitUsed,rateLimitResetAt:e.rateLimitResetAt?.toISOString()??null,rateLimitResource:e.rateLimitResource,createdAt:e.createdAt.toISOString()}))}}async metrics(){await this.pruneLogs();let e=await aJ(),t=Date.now(),A=await e.gitHubApiCallLog.findMany({where:{createdAt:{gte:new Date(t-yn.at(-1).milliseconds)}},orderBy:{createdAt:"asc"}}),r=yn.map(e=>this.metricWindow(e.window,A.filter(A=>A.createdAt.getTime()>=t-e.milliseconds)));return{windows:r,apiTypes:["GRAPHQL","REST"].map(e=>({apiType:e,windows:yn.map(r=>this.metricWindow(r.window,A.filter(A=>A.apiType===e&&A.createdAt.getTime()>=t-r.milliseconds)))})),operations:[...new Set(A.map(e=>e.operation))].sort().map(e=>({operation:e,windows:yn.map(r=>this.metricWindow(r.window,A.filter(A=>A.operation===e&&A.createdAt.getTime()>=t-r.milliseconds)))})),requestSources:[...new Set(A.map(e=>e.requestSource))].sort().map(e=>({requestSource:e,windows:yn.map(r=>this.metricWindow(r.window,A.filter(A=>A.requestSource===e&&A.createdAt.getTime()>=t-r.milliseconds)))}))}}entryView(e,t){return{id:e.id,authentication:e.authentication,operation:e.operation,endpoint:e.endpoint,fetchedAt:e.fetchedAt.toISOString(),pointCost:e.pointCost,stale:Date.now()-e.fetchedAt.getTime()>=1e3*t}}metricWindow(e,t){let A=t.length;return{window:e,total:A,live:t.filter(e=>"LIVE"===e.source).length,cache:t.filter(e=>"CACHE"===e.source).length,errors:t.filter(e=>"ERROR"===e.source).length,averageMs:0===A?0:Math.round(t.reduce((e,t)=>e+t.durationMs,0)/A),pointsUsed:t.reduce((e,t)=>e+Math.max(0,t.pointCost??0),0),pointsAvoided:t.reduce((e,t)=>e+Math.max(0,t.pointsAvoided),0)}}pagination(e,t){if(!Number.isInteger(e)||e<1||e>100)throw Error("limit must be an integer from 1 to 100");if(!Number.isInteger(t)||t<0)throw Error("offset must be a non-negative integer");return{limit:e,offset:t}}beginInvalidation(){let e=[...this.cacheWrites],t=[...new Set(this.inFlight.values())];return this.cacheGeneration+=1,this.inFlight.clear(),{cacheWrites:e,inFlight:t}}graphqlContext(e){let t=yo(e.variables);return{apiType:"GRAPHQL",method:"POST",endpoint:e.endpoint,requestSource:e.requestSource,requestSummary:function(e){if(!e||"object"!=typeof e||Array.isArray(e))return"No variables";let t=Object.entries(e);return t.length?t.map(([e,t])=>{let A=("string"==typeof t?t:JSON.stringify(t))??String(t);return`${e}=${A.length>120?`${A.slice(0,117)}…`:A}`}).join(" · "):"No variables"}(t),variables:t}}async log(e){if(!this.recordCallLogs)return;await this.pruneLogs();let t=await aJ();await t.gitHubApiCallLog.create({data:{id:(0,AP.randomUUID)(),authentication:e.authentication,apiType:e.apiType,method:e.method,endpoint:e.endpoint,operation:e.operation,requestSource:e.requestSource,requestSummary:e.requestSummary,variablesJson:ya(yo(e.variables)),source:e.source,durationMs:Math.max(0,Math.round(e.durationMs)),statusCode:e.statusCode??null,error:e.error?.slice(0,2e3)??null,servedStale:e.servedStale??!1,pointCost:e.pointCost??null,pointsAvoided:Math.max(0,e.pointsAvoided??0),rateLimitLimit:e.rateLimit?.limit??null,rateLimitRemaining:e.rateLimit?.remaining??null,rateLimitUsed:e.rateLimit?.used??null,rateLimitResetAt:e.rateLimit?.resetAt??null,rateLimitResource:e.rateLimit?.resource??null}})}async pruneLogs(){let e=Date.now();if(e-this.lastPrunedAt<36e5)return;this.lastPrunedAt=e;let t=await aJ();await t.gitHubApiCallLog.deleteMany({where:{createdAt:{lt:new Date(e-2592e6)}}})}}let yd=(process.env.GITHUB_API_BASE_URL||"https://api.github.com").replace(/\/+$/,""),yh=process.env.GITHUB_GRAPHQL_URL||`${yd}/graphql`,yp="_adeRateLimit";function yg(e){let t=(0,v.parse)(e),A=t.definitions.filter(e=>e.kind===es.Kind.OPERATION_DEFINITION);if(1!==A.length||!A[0])throw Error("GitHub GraphQL requests must contain one operation");let r=A[0],i=r.name?.value??("mutation"===r.operation?"AnonymousMutation":"AnonymousQuery"),n=(0,eB.print)(t);if("query"!==r.operation)return{kind:"mutation",operation:i,normalizedQuery:n,liveQuery:n};let a={...t,definitions:t.definitions.map(e=>e===r?{...r,selectionSet:{...r.selectionSet,selections:[...r.selectionSet.selections,{kind:es.Kind.FIELD,alias:{kind:es.Kind.NAME,value:yp},name:{kind:es.Kind.NAME,value:"rateLimit"},arguments:[],directives:[],selectionSet:{kind:es.Kind.SELECTION_SET,selections:[{kind:es.Kind.FIELD,name:{kind:es.Kind.NAME,value:"cost"},arguments:[],directives:[]}]}}]}}:e)};return{kind:"query",operation:i,normalizedQuery:n,liveQuery:(0,eB.print)(a)}}function ym(e){if(!e||"object"!=typeof e||Array.isArray(e))return{data:e,pointCost:null};let t=e[yp],A=t&&"object"==typeof t&&!Array.isArray(t)&&Number.isSafeInteger(t.cost)?t.cost:null;if(!(yp in e))return{data:e,pointCost:A};let r={...e};return delete r[yp],{data:r,pointCost:A}}let yf="default",yI="default",yw=String.raw`\b([A-Z][A-Z0-9_]*-\d+)\b`,yC=["workflow_run","workflow_job","check_run","check_suite","status"];function yy(e){return"read"===e||"write"===e}function yE(e){let t=[];for(let A of(e.webhookConfigured||t.push("configure the signed webhook URL"),yy(e.actionsPermission)||t.push("grant Actions read permission"),yy(e.checksPermission)||t.push("grant Checks read permission"),yy(e.commitStatusesPermission)||t.push("grant Commit statuses read permission"),yC))e.webhookEvents.includes(A)||t.push(`subscribe to the ${A} event`);return t}function yQ(e){return"auto-retry"===e.actor?"AUTO_RETRY":"workflow"===e.actor?"WORKFLOW_AUTOMATION":"ACTIONS_PAGE"}class yB extends Error{statusCode;rateLimit;constructor(e,t,A){super(e),this.statusCode=t,this.rateLimit=A,this.name="GitHubRequestError"}}let yb=`
|
|
12274
|
+
${t}`}splitMarkdownIntoSections(e){let t=e.split(/(?=^#{1,6}\s)|(?:\n\s*\n)/m).filter(e=>e.trim().length>0);return t.length>0?t:[e]}async parseMarkdownSection(e){try{let t=[this.createTextFallback(e)];return{success:!0,data:{version:1,type:"doc",content:t},warnings:[]}}catch(e){return{success:!1,error:e,warnings:[]}}}createTextFallback(e){return{type:"paragraph",content:[{type:"text",text:e.trim()}]}}createPlaceholder(e){return e.operation.includes("adfToMarkdown")?`[Error converting ADF to Markdown: ${e.operation}]`:e.operation.includes("markdownToAdf")?{version:1,type:"doc",content:[{type:"paragraph",content:[{type:"text",text:`[Error converting Markdown to ADF: ${e.operation}]`}]}]}:`[Error in operation: ${e.operation}]`}},I5=class{constructor(e){(0,pe.__publicField)(this,"mdToAdfEngine"),(0,pe.__publicField)(this,"adfToMdEngine"),(0,pe.__publicField)(this,"options"),(0,pe.__publicField)(this,"errorRecovery"),(0,pe.__publicField)(this,"remarkProcessor"),(0,pe.__publicField)(this,"registry");try{this.options=e||{},this.mdToAdfEngine=new IQ(this.options),this.adfToMdEngine=new I3(this.options),this.errorRecovery=new I6({maxRetries:e?.maxRetries||3,retryDelay:e?.retryDelay||100,fallbackStrategy:e?.fallbackStrategy||"best-effort",enableLogging:e?.enableLogging||!1,onError:e?.onError,onRecovery:e?.onRecovery}),this.remarkProcessor=pE().use(gY).use(mH,["yaml"]).use(fz).use(f5,{strict:e?.strict||!1}).use(mM),this.registry=new Ii,this.registerConverters()}catch(e){throw new It("Failed to initialize Parser","INIT_ERROR")}}adfToMarkdown(e,t){return t&&Object.keys(t).length>0?new I3({...this.options,...t}).convert(e):this.adfToMdEngine.convert(e)}async adfToMarkdownWithRecovery(e,t){let A=await this.errorRecovery.executeWithRecovery(()=>this.adfToMarkdown(e,t),{operation:"adfToMarkdown",input:e,nodeType:e.type});if(!A.success)throw A.error||Error("ADF to Markdown conversion failed");return A.data}markdownToAdf(e,t){return t&&Object.keys(t).length>0?new IQ({...this.options,...t}).convert(e):this.mdToAdfEngine.convert(e)}async markdownToAdfWithRecovery(e,t){let A=await this.errorRecovery.executeWithRecovery(()=>this.markdownToAdf(e,t),{operation:"markdownToAdf",input:e});if(!A.success)throw A.error||Error("Markdown to ADF conversion failed");return A.data}async markdownToAdfAsync(e,t){return await this.mdToAdfEngine.convertAsync(e)}async markdownToAdfAsyncWithRecovery(e,t){let A=await this.errorRecovery.executeWithRecovery(async()=>this.markdownToAdfAsync(e,t),{operation:"markdownToAdfAsync",input:e});if(!A.success)throw A.error||Error("Async Markdown to ADF conversion failed");return A.data}async validateMarkdownAsync(e){let t=await this.mdToAdfEngine.validate(e);return{valid:t.valid,errors:t.errors.map(e=>({message:e})),warnings:t.warnings}}async getStats(e){return await this.mdToAdfEngine.getStats(e)}stringify(e,t){return this.adfToMarkdown(e,t)}async stringifyAsync(e,t){return this.adfToMarkdownWithRecovery(e,t)}validateAdf(e){return new f7().validate(e)}validateMarkdown(e){return new Ie().validate(e)}getErrorRecovery(){return this.errorRecovery}registerConverters(){this.registry.registerNodes([new IB,new Ib,new ID,new Ik,new IS,new Iv,new IR,new IM,new IT,new IU,new Ix,new IN,new IF,new IG,new IO,new IJ,new I_,new IV,new IP,new IL,new IH,new Ij,new Iq,new IK,new IY,new IW]),this.registry.registerMarks([new I$,new IZ,new Iz,new IX,new I0,new I1,new I8,new I4,new I2])}convertAdfToMarkdown(e){return this.adfToMdEngine.convert(e)}convertMdastToAdf(e){return this.mdToAdfEngine.convert(e)}fallbackConversion(e){return this.mdToAdfEngine.convert(e)}countNodes(e){let t=0;for(let A of e)t++,A.content&&Array.isArray(A.content)&&(t+=this.countNodes(A.content));return t}postProcessAdfFenceBlocks(e){return e}parseAdfLanguageString(e,t){return{}}},I9=e.i(436057);let I7=[/^h[1-6]\.\s/m,/^bq\.\s/m,/\{code(?::[^}]+)?\}/i,/\{noformat\}/i,/\{\{[^}\n]+\}\}/,/^\|\|.+\|\|\s*$/m,/\[[^\]\n]+\|https?:\/\//i,/\[~[^\]\n]+\]/,/\[\^[^\]\n]+\]/,/![^!\n]+!/];function we(e){return!(!e||"object"!=typeof e||Array.isArray(e))&&"doc"===e.type&&1===e.version&&Array.isArray(e.content)}function wt(e,t){return I9.default.to_markdown(e.replace(/\[~([^\]\n]+)\]/g,"@$1").replace(/\[\^([^\]\n]+)\]/g,"[Attachment: $1]").replace(/\[([A-Z][A-Z0-9_]*-\d+)\]/g,(e,A)=>t?`[${A}](${t}/browse/${A})`:`**${A}**`))}let wA=new I5;function wr(e,t){if(null==e)return null;let A=function(e){if(we(e))return"ADF";let t="string"==typeof e?e:"";return I7.some(e=>e.test(t))?"JIRA_WIKI":"MARKDOWN"}(e),r="string"==typeof e?e:null==e?"":JSON.stringify(e,null,2),i="ADF"===A?function(e){try{return wA.adfToMarkdown(e)}catch{return function e(t){return t&&"object"==typeof t?["string"==typeof t.text?t.text:"",...Array.isArray(t.content)?t.content.map(e).filter(Boolean):[]].filter(Boolean).join("\n"):""}(e)}}(e):"JIRA_WIKI"===A?wt(r,t):r;return{format:A,raw:e,rawText:r,markdown:i,wikiMarkup:"JIRA_WIKI"===A?r:I9.default.to_jira(i)}}function wi(e){let t=e.value.trim(),A="JIRA_WIKI"===e.format?wt(t):t,r=wA.markdownToAdf(A);if(!we(r))throw Error("The Jira text could not be converted to valid ADF");return r}let wn="default",wa=["summary","status","issuetype","priority","assignee","project","updated"],ws=[{window:"5m",milliseconds:3e5},{window:"10m",milliseconds:6e5},{window:"1h",milliseconds:36e5},{window:"24h",milliseconds:864e5}];function wo(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)}function wl(e){return wo(e)?e:{}}function wc(e){return Array.isArray(e)?e:[]}function wu(e){return"string"==typeof e&&e.length>0?e:null}function wd(e){return"number"==typeof e&&Number.isFinite(e)?e:null}function wh(e){let t=e.trim().toUpperCase();if(!/^[A-Z][A-Z0-9_]*-\d+$/.test(t))throw Error("Invalid Jira issue key");return t}function wp(e){if(null===e)return null;try{return JSON.parse(e)}catch{return null}}function wg(e){return wc(wp(e)).flatMap(e=>"string"==typeof e&&e.length>0?[e]:[])}function wm(e){return JSON.stringify(function e(t){return Array.isArray(t)?t.map(e):wo(t)?Object.fromEntries(Object.keys(t).sort().map(A=>[A,e(t[A])])):t}(e))}function wf(e){if(!wo(e))return null;let t=e.status??wl(e.response).status;return"number"==typeof t?t:null}function wI(e,t){let A=e instanceof Error?e.message:String(e);return(t?A.replaceAll(t,"[REDACTED]"):A).slice(0,1e3)}function ww(e){return wu(wl(wl(e.fields).project).key)??(e.key?.split("-")[0]||"UNKNOWN")}function wC(e){let t=wl(e),A=wu(t.displayName);if(!A)return null;let r=wl(t.avatarUrls);return{accountId:wu(t.accountId),displayName:A,avatarUrl:wu(r["48x48"])??wu(r["32x32"])??wu(r["24x24"])}}function wy(e){return wc(e).map(wl).map(e=>({id:wu(e.id),name:wu(e.name)??"Unknown"}))}function wE(e,t){let A=wl(e),r=wu(A.key);if(!r)return null;let i=wl(A.fields);return{relationship:t,key:r,summary:wu(i.summary)??r,status:wu(wl(i.status).name)}}function wQ(e){return{...e,kind:"BOARD"===e.kind?"BOARD":"JQL"}}function wB(e){return{source:e.source,stale:e.stale,fetchedAt:e.fetchedAt.toISOString()}}function wb(e){return 0===e.length?{source:"CACHE",stale:!1,fetchedAt:new Date(0).toISOString()}:{source:e.some(e=>"ERROR"===e.source)?"ERROR":e.some(e=>"LIVE"===e.source)?"LIVE":"CACHE",stale:e.some(e=>e.stale),fetchedAt:new Date(Math.max(...e.map(e=>e.fetchedAt.getTime()))).toISOString()}}function wD(e){let t=wl(e.fields),A=wl(t.status),r=wl(A.statusCategory),i=wl(t.assignee),n=wl(i.avatarUrls),a=wl(t.project),s=e.key??"UNKNOWN";return{id:e.id??s,key:s,summary:wu(t.summary)??s,statusId:wu(A.id)??wu(A.name)??"unknown",status:wu(A.name)??"Unknown",statusCategory:wu(r.key)??wu(r.name)??"unknown",issueType:wu(wl(t.issuetype).name),priority:wu(wl(t.priority).name),assignee:wu(i.displayName),assigneeAccountId:wu(i.accountId),assigneeAvatarUrl:wu(n["48x48"])??wu(n["32x32"]),projectKey:wu(a.key)??ww(e),updatedAt:wu(t.updated)}}function wk(e){let t=e.toLowerCase();return"new"===t||t.includes("to do")?0:"indeterminate"===t||t.includes("progress")?1:"done"===t?2:3}let wS=new Set(["ALL","UNASSIGNED_OR_SELF","SELF_IN_PROGRESS"]);function wv(e){return wS.has(e)?e:"ALL"}class wR{credentials;workflowEvents;recordCallLogs;inFlight;clients;lastPrunedAt;constructor(e=new hP,t,A="true"!==process.env.JIRA_CACHE_LOGGING_DISABLED){this.credentials=e,this.workflowEvents=t,this.recordCallLogs=A,this.inFlight=new Map,this.lastPrunedAt=0}async storedConnection(){return hL(this.credentials,hm.jiraConnectionSettings,hY)}async recordTicketWorkflowEvents(e,t){if(!this.workflowEvents)return;let A=e.comments.at(-1)??null,r={ticket:{key:e.key,title:e.summary,type:e.issueType,status:e.status,statusId:e.statusId,statusCategory:e.statusCategory,assignee:e.assignee,assigneeAccountId:e.assigneeAccountId,labels:e.labels,sprintNames:e.sprintNames,activeSprintNames:e.activeSprintNames,closedSprintNames:e.closedSprintNames,url:e.jiraUrl},comment:A?{id:A.id,body:A.content?.rawText??"",author:A.author}:null,...void 0!==t?{changelog:t}:{}},i=e.cache.fetchedAt,n=e.assigneeAccountId?await this.currentAccountId().catch(()=>null):null,a=[["JIRA_STATUS",e.statusId],["JIRA_LABEL",JSON.stringify([...e.labels].sort())],["JIRA_MENTION",A?.id??"none"],["JIRA_SPRINT_STARTED",[...e.activeSprintNames].sort()],["JIRA_TICKET_UPDATED",e.updatedAt??"unknown"],["JIRA_COMMENT_ADDED",A?.id??"none"],["JIRA_SPRINT_ENDED",[...e.closedSprintNames].sort()]];if(n&&n===e.assigneeAccountId&&a.push(["JIRA_ASSIGNED_SELF",n]),t?.items.length){let e=new Set(t.items.flatMap(e=>[e.fieldId,e.field].filter(e=>!!e).map(e=>e.trim().toLowerCase()))),A=new Set(["JIRA_TICKET_UPDATED"]);e.has("status")&&A.add("JIRA_STATUS"),(e.has("label")||e.has("labels"))&&A.add("JIRA_LABEL"),e.has("assignee")&&A.add("JIRA_ASSIGNED_SELF"),e.has("sprint")&&(A.add("JIRA_SPRINT_STARTED"),A.add("JIRA_SPRINT_ENDED")),a=a.filter(([e])=>A.has(e))}await Promise.allSettled(a.map(([t,A])=>this.workflowEvents.record({kind:t,subjectKey:e.key,dedupeKey:`jira-trigger:${t}:${e.key}:${i}`,payload:{...r,sessionData:r,cursorValue:A}})))}async getSettings(){let e=await aJ(),[t,A,r]=await Promise.all([e.jiraSettings.upsert({where:{id:wn},create:{id:wn,cacheTtlSeconds:300},update:{}}),this.storedConnection(),this.credentials.isConfigured(hm.jiraApiToken)]);return{siteUrl:A?.value.siteUrl??null,email:A?.value.email??null,tokenConfigured:!!(A&&r),cacheTtlSeconds:t.cacheTtlSeconds,updatedAt:new Date(Math.max(t.updatedAt.getTime(),A?.updatedAt.getTime()??0)).toISOString()}}async saveSettings(e){let t=await aJ(),A=function(e){let t=new URL(e.trim());if("https:"!==t.protocol)throw Error("Jira Cloud site URL must use HTTPS");if(!t.hostname.toLowerCase().endsWith(".atlassian.net"))throw Error("Only Jira Cloud *.atlassian.net sites are supported");if(t.username||t.password||t.search||t.hash)throw Error("Jira site URL must not include credentials, query, or fragment");return t.origin}(e.siteUrl),r=e.email.trim();if(!/^\S+@\S+\.\S+$/.test(r))throw Error("A valid Jira email is required");let i=await this.storedConnection(),n=e.apiToken?.trim()||null,a=!!(i?.value.siteUrl&&i.value.siteUrl!==A);if(a&&!e.resetSite)throw Error("Changing the Jira site requires resetSite=true");let s=i?.value.siteUrl!==A||i?.value.email!==r||!!n,o={siteUrl:A,email:r},l=async e=>{a&&(await e.jiraProject.deleteMany(),await e.jiraWebhookDelivery.deleteMany()),s&&(await e.jiraCacheEntry.deleteMany(),await e.jiraCachedTicket.deleteMany()),await e.jiraSettings.upsert({where:{id:wn},create:{id:wn,cacheTtlSeconds:300},update:a?{webhookEnabled:!1,webhookConfiguredAt:null,webhookId:null}:{}})},c=[...i&&JSON.stringify(i.value)===JSON.stringify(o)?[]:[{descriptor:hm.jiraConnectionSettings,value:hw(o)}],...n?[{descriptor:hm.jiraApiToken,value:Buffer.from(n,"utf8")}]:[]];return c.length?a?await this.credentials.setAndDeleteMany(c,[hm.jiraWebhookSecret,hm.jiraWebhookSettings],l):await this.credentials.setMany(c,l):await t.$transaction(l),this.clients=void 0,this.getSettings()}async clearCredentials(){let e=await aJ(),[t,A]=await Promise.all([e.jiraSettings.findUnique({where:{id:wn},select:{webhookId:!0}}),this.storedConnection()]),r=await this.credentials.isConfigured(hm.jiraApiToken);if(A?.value.siteUrl&&A.value.email&&t?.webhookId&&r)try{await this.webhookApiRequest("DELETE",`/rest/webhooks/1.0/webhook/${encodeURIComponent(t.webhookId)}`)}catch(e){if(404!==wf(e))throw e}return await this.credentials.deleteMany([hm.jiraConnectionSettings,hm.jiraApiToken,hm.jiraWebhookSettings,hm.jiraWebhookSecret],async e=>{await e.jiraCacheEntry.deleteMany(),await e.jiraCachedTicket.deleteMany(),await e.jiraWebhookDelivery.deleteMany(),await e.jiraSettings.upsert({where:{id:wn},create:{id:wn,cacheTtlSeconds:300},update:{webhookEnabled:!1,webhookConfiguredAt:null,webhookId:null}})}),this.clients=void 0,this.getSettings()}async updateCacheTtl(e){if(!Number.isInteger(e)||e<1||e>1440)throw Error("Cache TTL must be an integer from 1 to 1440 minutes");let t=await aJ();return await t.jiraSettings.upsert({where:{id:wn},create:{id:wn,cacheTtlSeconds:60*e},update:{cacheTtlSeconds:60*e}}),this.getSettings()}async testConnection(){let e=await this.cachedCall({operation:"MYSELF",params:{},requestSummary:"Current Jira user",force:!0,allowStaleOnError:!1,fetcher:async()=>{let{version3:e}=await this.getClients();return e.myself.getCurrentUser()}});if(e.stale)throw Error("Jira connection test failed because the live request failed");let t=wl(e.value);return{accountId:wu(t.accountId),displayName:wu(t.displayName)??"Jira user",emailAddress:wu(t.emailAddress),cache:wB(e)}}async listProjects(){let e=await aJ();return(await e.jiraProject.findMany({include:{sources:{orderBy:[{position:"asc"},{createdAt:"asc"}]}},orderBy:[{position:"asc"},{createdAt:"asc"}]})).map(e=>({id:e.id,jiraId:e.jiraId,key:e.key,name:e.name,avatarUrl:e.avatarUrl,position:e.position,ticketAssignmentFilter:wv(e.ticketAssignmentFilter),hideCompletedTickets:e.hideCompletedTickets,completedStatusIds:wg(e.completedStatusIdsJson),doneStatusId:e.doneStatusId,branchNamingScript:e.branchNamingScript??h5,sources:e.sources.map(wQ)}))}async projectStatuses(e){let t=await aJ(),A=await t.jiraProject.findUnique({where:{id:e},select:{jiraId:!0,key:!0}});if(!A)throw Error("Jira project not found");let r=await this.cachedCall({operation:"PROJECT_STATUSES",params:{jiraId:A.jiraId},requestSummary:`Statuses for project ${A.key}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.projects.getAllStatuses(A.jiraId)}}),i=new Map;for(let e of wc(r.value).map(wl))for(let t of wc(e.statuses).map(wl)){let e=wu(t.id),A=wu(t.name);if(!e||!A||i.has(e))continue;let r=wl(t.statusCategory);i.set(e,{id:e,name:A,category:wu(r.key)??wu(r.name)??"unknown"})}return[...i.values()].sort((e,t)=>wk(e.category)-wk(t.category)||e.name.localeCompare(t.name))}async updateProjectDisplaySettings(e){if(!wS.has(e.ticketAssignmentFilter))throw Error("Invalid Jira ticket assignment filter");let t=[...new Set(e.completedStatusIds.map(e=>e.trim()).filter(Boolean))].slice(0,200),A=await aJ(),r=void 0===e.doneStatusId?void 0:e.doneStatusId?.trim()||null;if(r&&!(await this.projectStatuses(e.projectId)).some(e=>e.id===r))throw Error("The selected Jira done status is not available");return await A.jiraProject.update({where:{id:e.projectId},data:{ticketAssignmentFilter:e.ticketAssignmentFilter,hideCompletedTickets:e.hideCompletedTickets,completedStatusIdsJson:JSON.stringify(t),...void 0===r?{}:{doneStatusId:r}}}),this.listProjects()}async updateProjectBranchNaming(e,t){let A=await aJ(),r=await A.jiraProject.findUnique({where:{id:e},select:{key:!0}});if(!r)throw Error("Jira project not found");let i=await h7(t,r.key);return await A.jiraProject.update({where:{id:e},data:{branchNamingScript:i}}),this.listProjects()}async availableProjects(){let e=[],t=0;for(;;){let A=await this.cachedCall({operation:"PROJECTS",params:{startAt:t,maxResults:100},requestSummary:`Visible projects from ${t}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.projects.searchProjects({startAt:t,maxResults:100,orderBy:"name"})},itemCount:e=>wc(wl(e).values).length}),r=wl(A.value),i=wc(r.values).map(wl);e.push(...i.flatMap(e=>{let t=wu(e.id),A=wu(e.key),r=wu(e.name);if(!t||!A||!r)return[];let i=wl(e.avatarUrls);return[{jiraId:t,key:A,name:r,avatarUrl:wu(i["48x48"])??wu(i["32x32"])}]}));let n=wd(r.total)??e.length;if(0===i.length||e.length>=n)break;t+=i.length}return e}async addProject(e){let t=e.trim();if(!t)throw Error("Jira project ID is required");let A=wl((await this.cachedCall({operation:"PROJECT",params:{jiraId:t},requestSummary:`Project ${t}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.projects.getProject(t)}})).value),r=wu(A.key),i=wu(A.name),n=wu(A.id);if(!r||!i||!n)throw Error("Jira returned an incomplete project");let a=wl(A.avatarUrls),s=await aJ(),o=await s.jiraProject.aggregate({_max:{position:!0}});return await s.jiraProject.create({data:{id:(0,AP.randomUUID)(),jiraId:n,key:r,name:i,avatarUrl:wu(a["48x48"])??wu(a["32x32"]),position:(o._max.position??-1)+1,branchNamingScript:h5}}),this.listProjects()}async removeProject(e){let t=await aJ(),A=(await t.jiraSource.findMany({where:{projectId:e},select:{id:!0}})).map(e=>e.id);return await t.$transaction(async t=>{A.length>0&&await t.jiraCacheEntry.deleteMany({where:{sourceId:{in:A}}}),await t.jiraProject.delete({where:{id:e}}),await t.jiraCachedTicket.deleteMany({where:{cacheEntries:{none:{}}}})}),this.listProjects()}async createSource(e){let t=await this.validateSource(e.kind,e.value),A=this.validateSourceName(e.name),r=await aJ();if(!await r.jiraProject.findUnique({where:{id:e.projectId}}))throw Error("Jira project not found");let i=await r.jiraSource.aggregate({where:{projectId:e.projectId},_max:{position:!0}});return await r.jiraSource.create({data:{id:(0,AP.randomUUID)(),projectId:e.projectId,name:A,kind:e.kind,value:t.value,boardId:t.boardId,position:(i._max.position??-1)+1}}),this.listProjects()}async updateSource(e){let t=await this.validateSource(e.kind,e.value),A=this.validateSourceName(e.name),r=await aJ();return await r.$transaction([r.jiraCacheEntry.deleteMany({where:{sourceId:e.id}}),r.jiraSource.update({where:{id:e.id},data:{name:A,kind:e.kind,value:t.value,boardId:t.boardId}})]),this.listProjects()}async deleteSource(e){let t=await aJ();return await t.$transaction(async t=>{await t.jiraCacheEntry.deleteMany({where:{sourceId:e}}),await t.jiraSource.delete({where:{id:e}}),await t.jiraCachedTicket.deleteMany({where:{cacheEntries:{none:{}}}})}),this.listProjects()}async ticketBoard(e,t=!1){var A;let r,i,n,a=await aJ(),s=await a.jiraSource.findUnique({where:{id:e},include:{project:!0}});if(!s)throw Error("Jira source not found");let o=await a.jiraCacheEntry.findFirst({where:{sourceId:e,issues:{some:{}}},orderBy:{fetchedAt:"desc"},include:{issues:{select:{issueKey:!0}}}}),l=new Set(o?.issues.map(({issueKey:e})=>e)??[]),c="BOARD"===s.kind?await this.loadBoardSource(wQ(s),t):await this.loadJqlSource(wQ(s),t),u={ticketAssignmentFilter:wv(s.project.ticketAssignmentFilter),hideCompletedTickets:s.project.hideCompletedTickets,completedStatusIds:wg(s.project.completedStatusIdsJson)},d="ALL"===u.ticketAssignmentFilter?null:await this.currentAccountId(),h=(A={source:wQ(s),...c},r=u.hideCompletedTickets?new Set(u.completedStatusIds):new Set,i=new Set(A.tickets.filter(e=>r.has(e.statusId)).map(e=>e.status)),n=A.tickets.filter(e=>{let t;return!r.has(e.statusId)&&("ALL"===u.ticketAssignmentFilter||("UNASSIGNED_OR_SELF"===u.ticketAssignmentFilter?null===e.assigneeAccountId||e.assigneeAccountId===d:null!==d&&e.assigneeAccountId===d&&("indeterminate"===(t=e.statusCategory.toLowerCase())||t.includes("progress"))))}),{...A,tickets:n,statusOrder:A.statusOrder.filter(e=>!i.has(e))});return this.workflowEvents&&o&&await Promise.allSettled(h.tickets.filter(({key:e})=>!l.has(e)).map(t=>{let A={ticket:{key:t.key,title:t.summary,type:t.issueType,status:t.status,statusId:t.statusId,statusCategory:t.statusCategory,assignee:t.assignee}};return this.workflowEvents.record({kind:"JIRA_SOURCE_NEW_TICKET",subjectKey:`${e}:${t.key}`,dedupeKey:`jira-source-new:${e}:${t.key}:${h.cache.fetchedAt}`,payload:{...A,sessionData:A,source:{id:e,name:s.name,kind:s.kind},cursorValue:t.key}})})),h}async ticket(e,t=!1,A){let r=wh(e),i=await this.cachedCall({operation:"ISSUE",params:{issueKey:r,fields:"*all",expand:"names,schema"},requestSummary:`Issue ${r} with all fields`,force:t,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issues.getIssue({issueIdOrKey:r,fields:["*all"],expand:["names","schema"],updateHistory:!1})}});"LIVE"===i.source&&await this.storeDetail(i.entryId,i.value,i.fetchedAt);let n=[],a=[],s=0;for(;;){let e=await this.cachedCall({operation:"COMMENTS",params:{issueKey:r,startAt:s,maxResults:100},requestSummary:`Comments for ${r} from ${s}`,force:t,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issueComments.getComments({issueIdOrKey:r,startAt:s,maxResults:100,orderBy:"created"})},itemCount:e=>wc(wl(e).comments).length});n.push(e);let A=wl(e.value),i=wc(A.comments);a.push(...i);let o=wd(A.total)??a.length;if(0===i.length||a.length>=o)break;s+=i.length}let o=new Date(Math.min(...n.map(e=>e.fetchedAt.getTime())));await this.storeComments(r,a,o,n.map(e=>e.entryId));let l=await this.requireCredentials(),c=this.normalizeTicketDetail(i.value,a,l.siteUrl,wB(i),wb(n));return await this.recordTicketWorkflowEvents(c,A),c}async assignableUsers(e,t=""){let A=wh(e),r=t.trim().slice(0,100),i=await this.cachedCall({operation:"ASSIGNABLE_USERS",params:{issueKey:A,query:r,maxResults:50},requestSummary:`Assignable users for ${A}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.userSearch.findAssignableUsers({issueKey:A,query:r,maxResults:50,recommend:!0})},itemCount:e=>wc(e).length});return await this.linkCacheEntryToIssue(A,i.entryId),wc(i.value).map(wC).filter(e=>null!==e)}async ticketTransitions(e){let t=wh(e),A=await this.cachedCall({operation:"ISSUE_TRANSITIONS",params:{issueKey:t,expand:"transitions.fields"},requestSummary:`Available transitions for ${t}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issues.getTransitions({issueIdOrKey:t,expand:"transitions.fields"})},itemCount:e=>wc(wl(e).transitions).length});return await this.linkCacheEntryToIssue(t,A.entryId),wc(wl(A.value).transitions).map(wl).filter(e=>!1!==e.isAvailable).flatMap(e=>{let t=wu(e.id),A=wu(e.name);if(!t||!A)return[];let r=wl(e.to),i=wl(r.statusCategory),n=Object.entries(wl(e.fields)).filter(([,e])=>!0===wl(e).required).map(([e,t])=>wu(wl(t).name)??e);return[{id:t,name:A,toStatusId:wu(r.id),toStatus:wu(r.name)??A,toStatusCategory:wu(i.key)??wu(i.name),hasScreen:!0===e.hasScreen,requiredFields:n}]})}async ticketEditFields(e){let t=wh(e),A=await this.cachedCall({operation:"ISSUE_EDIT_META",params:{issueKey:t},requestSummary:`Editable fields for ${t}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issues.getEditIssueMeta({issueIdOrKey:t})},itemCount:e=>Object.keys(wl(wl(e).fields)).length});return await this.linkCacheEntryToIssue(t,A.entryId),Object.entries(wl(wl(A.value).fields)).map(([e,t])=>{let A=wl(t);return{id:e,name:wu(A.name)??e,required:!0===A.required,schemaType:wu(wl(A.schema).type),allowedValues:wc(A.allowedValues).flatMap(e=>{if("string"==typeof e)return[{id:e,name:e}];let t=wl(e),A=wu(t.name)??wu(t.value)??wu(t.displayName)??wu(t.key);return A?[{id:wu(t.id)??wu(t.accountId)??wu(t.value)??A,name:A}]:[]})}}).sort((e,t)=>e.name.localeCompare(t.name))}async ticketChanges(e,t=50,A=0){let r=wh(e),i=this.validatePagination(t,A),n=await this.cachedCall({operation:"ISSUE_CHANGELOG",params:{issueKey:r,startAt:0,maxResults:1},requestSummary:`Changelog count for ${r}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issues.getChangeLogs({issueIdOrKey:r,startAt:0,maxResults:1})},itemCount:e=>wc(wl(e).values).length});await this.linkCacheEntryToIssue(r,n.entryId);let a=wd(wl(n.value).total)??0,s=Math.min(i.limit,Math.max(0,a-i.offset)),o=Math.max(0,a-i.offset-s);if(0===s)return{...i,total:a,items:[],cache:wB(n)};let l=await this.cachedCall({operation:"ISSUE_CHANGELOG",params:{issueKey:r,startAt:o,maxResults:s},requestSummary:`Changelog for ${r} from ${o}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issues.getChangeLogs({issueIdOrKey:r,startAt:o,maxResults:s})},itemCount:e=>wc(wl(e).values).length});await this.linkCacheEntryToIssue(r,l.entryId);let c=wc(wl(l.value).values).map(wl).reverse().map(e=>({id:wu(e.id)??(0,AP.randomUUID)(),author:wC(e.author),createdAt:wu(e.created),items:wc(e.items).map(wl).map(e=>({field:wu(e.field)??"Field",fieldId:wu(e.fieldId),from:wu(e.fromString)??wu(e.from),to:wu(e.toString)??wu(e.to)}))}));return{...i,total:a,items:c,cache:wb([n,l])}}async ticketWorklogs(e,t=50,A=0){let r=wh(e),i=this.validatePagination(t,A),n=await this.cachedCall({operation:"ISSUE_WORKLOGS",params:{issueKey:r,startAt:0,maxResults:1},requestSummary:`Worklog count for ${r}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issueWorklogs.getIssueWorklog({issueIdOrKey:r,startAt:0,maxResults:1})},itemCount:e=>wc(wl(e).worklogs).length});await this.linkCacheEntryToIssue(r,n.entryId);let a=wd(wl(n.value).total)??0,s=Math.min(i.limit,Math.max(0,a-i.offset)),o=Math.max(0,a-i.offset-s);if(0===s)return{...i,total:a,items:[],cache:wB(n)};let l=await this.cachedCall({operation:"ISSUE_WORKLOGS",params:{issueKey:r,startAt:o,maxResults:s},requestSummary:`Worklogs for ${r} from ${o}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issueWorklogs.getIssueWorklog({issueIdOrKey:r,startAt:o,maxResults:s})},itemCount:e=>wc(wl(e).worklogs).length});await this.linkCacheEntryToIssue(r,l.entryId);let c=await this.requireCredentials(),u=wc(wl(l.value).worklogs).map(wl).reverse().map(e=>({id:wu(e.id)??(0,AP.randomUUID)(),author:wC(e.author),comment:wr(e.comment??null,c.siteUrl),timeSpent:wu(e.timeSpent),timeSpentSeconds:wd(e.timeSpentSeconds),startedAt:wu(e.started),createdAt:wu(e.created),updatedAt:wu(e.updated)})),d=u[0];if(this.workflowEvents&&d){let e={ticket:{key:r},worklog:{id:d.id,author:d.author,timeSpent:d.timeSpent,timeSpentSeconds:d.timeSpentSeconds,startedAt:d.startedAt,updatedAt:d.updatedAt}};await this.workflowEvents.record({kind:"JIRA_WORKLOG_ADDED",subjectKey:r,dedupeKey:`jira-worklog:${r}:${d.id}:${l.fetchedAt}`,payload:{...e,sessionData:e,cursorValue:d.id}})}return{...i,total:a,items:u,cache:wb([n,l])}}async addComment(e,t){let A=wh(e);if(!t.value.trim())throw Error("Comment text is required");let r=wi(t);return this.mutateTicket(A,"ADD_COMMENT",async()=>{let{version3:e}=await this.getClients();await e.issueComments.addComment({issueIdOrKey:A,comment:r})})}async assignTicket(e,t){let A=wh(e),r=t?.trim()||null;return this.mutateTicket(A,"ASSIGN_ISSUE",async()=>{let{version3:e}=await this.getClients();await e.issues.assignIssue({issueIdOrKey:A,accountId:r})})}async transitionTicket(e,t){let A=wh(e),r=(await this.ticketTransitions(A)).find(e=>e.id===t);if(!r)throw Error("The Jira transition is not available");if(r.requiredFields.length>0)throw Error(`This transition requires fields that must be completed in Jira: ${r.requiredFields.join(", ")}`);return this.mutateTicket(A,"TRANSITION_ISSUE",async()=>{let{version3:e}=await this.getClients();await e.issues.doTransition({issueIdOrKey:A,transition:{id:r.id}})})}async transitionTicketToConfiguredDone(e){let t=wh(e),A=t.split("-")[0]??"",r=await aJ(),i=await r.jiraProject.findUnique({where:{key:A},select:{doneStatusId:!0}});if(!i?.doneStatusId)throw Error(`Configure a done status for Jira project ${A} before using this option`);let n=await this.ticket(t);if(n.statusId===i.doneStatusId)return n;let a=(await this.ticketTransitions(t)).filter(e=>e.toStatusId===i.doneStatusId).sort((e,t)=>e.requiredFields.length-t.requiredFields.length)[0];if(!a)throw Error("Jira does not currently offer a transition to the configured done status");return this.transitionTicket(t,a.id)}async updateTicket(e){let t=wh(e.issueKey),A=new Map((await this.ticketEditFields(t)).map(e=>[e.id,e])),r={},i=e=>{let t=A.get(e);if(!t)throw Error(`${e} is not editable on this ticket`);return t},n=t=>Object.prototype.hasOwnProperty.call(e,t);if(n("summary")){i("summary");let t=e.summary?.trim();if(!t)throw Error("Ticket summary is required");r.summary=t}if(n("description")){let t=i("description");if(null===e.description){if(t.required)throw Error("Description is required");r.description=null}else e.description&&(r.description=wi(e.description))}if(n("priorityId")){let t=i("priority"),A=e.priorityId?.trim()||null;if(!A&&t.required)throw Error("Priority is required");if(A&&t.allowedValues.length>0&&!t.allowedValues.some(e=>e.id===A))throw Error("The selected priority is not available");r.priority=A?{id:A}:null}n("labels")&&(i("labels"),r.labels=[...new Set((e.labels??[]).map(e=>e.trim()).filter(Boolean))]);let a=(t,A)=>{if(!n(t))return;let a=i(A),s=[...new Set(e[t]??[])];if(a.allowedValues.length>0&&s.some(e=>!a.allowedValues.some(t=>t.id===e)))throw Error(`A selected ${a.name} value is not available`);r[A]=s.map(e=>({id:e}))};if(a("componentIds","components"),a("fixVersionIds","fixVersions"),a("affectedVersionIds","versions"),n("dueDate")){let t=i("duedate"),A=e.dueDate?.trim()||null;if(A&&!/^\d{4}-\d{2}-\d{2}$/.test(A))throw Error("Due date must use YYYY-MM-DD");if(!A&&t.required)throw Error("Due date is required");r.duedate=A}if(0===Object.keys(r).length)throw Error("At least one editable Jira field is required");return this.mutateTicket(t,"EDIT_ISSUE",async()=>{let{version3:e}=await this.getClients();await e.issues.editIssue({issueIdOrKey:t,fields:r})})}async createTicket(e){let t=e.projectKey.trim().toUpperCase(),A=e.issueTypeId.trim(),r=e.summary.trim();if(!t||!A||!r)throw Error("Project, issue type, and summary are required");let{version3:i}=await this.getClients(),n=await i.issues.createIssue({fields:{...e.fields??{},project:{key:t},issuetype:{id:A},summary:r,...e.description?{description:wi(e.description)}:{}}});if(!n.key)throw Error("Jira did not return the created issue key");return this.ticket(n.key,!0)}async addWorklog(e){let t=wh(e.issueKey);if(!Number.isInteger(e.timeSpentSeconds)||e.timeSpentSeconds<1)throw Error("Time spent must be a positive number of seconds");let{version3:A}=await this.getClients();return await A.issueWorklogs.addWorklog({issueIdOrKey:t,timeSpentSeconds:e.timeSpentSeconds,started:e.startedAt??new Date().toISOString(),...e.comment?{comment:wi(e.comment)}:{}}),this.ticket(t,!0)}async linkTickets(e){let t=wh(e.inwardIssueKey),A=wh(e.outwardIssueKey),r=e.linkType.trim();if(!r)throw Error("Jira issue link type is required");let{version3:i}=await this.getClients();return await i.issueLinks.linkIssues({type:{name:r},inwardIssue:{key:t},outwardIssue:{key:A}}),this.ticket(t,!0)}async branchTicket(e){let t=wh(e),A=t.replace(/-\d+$/,""),r=await aJ(),i=await r.jiraProject.findUnique({where:{key:A},select:{key:!0,branchNamingScript:!0}});if(!i)throw Error(`Jira project ${A} is not managed; add it in Manage Jira projects and sources`);let n=await this.cachedCall({operation:"ISSUE_BRANCH",params:{issueKey:t,fields:["summary","issuetype","project"]},requestSummary:`Branch details for ${t}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issues.getIssue({issueIdOrKey:t,fields:["summary","issuetype","project"],updateHistory:!1})}});await this.linkCacheEntryToIssue(t,n.entryId);let a=wl(n.value.fields);if((wu(wl(a.project).key)??ww(n.value))!==i.key)throw Error(`Jira ticket ${t} does not belong to project ${i.key}`);return{ticketKey:n.value.key??t,ticketTitle:wu(a.summary)??t,ticketType:wu(wl(a.issuetype).name),projectKey:i.key,branchNamingScript:i.branchNamingScript??h5}}async clearCache(){let e=await aJ();return await e.$transaction([e.jiraCacheEntry.deleteMany(),e.jiraCachedTicket.deleteMany()]),!0}async clearApiCalls(){let e=await aJ();return await e.jiraApiCallLog.deleteMany(),!0}async deleteCachedTicket(e){return await this.invalidateIssueCaches(wh(e)),!0}async invalidateIssueCaches(e){let t=await aJ(),A=await t.jiraCacheEntryIssue.findMany({where:{issueKey:e},select:{cacheEntryId:!0}});await t.$transaction(async t=>{A.length>0&&await t.jiraCacheEntry.deleteMany({where:{id:{in:A.map(e=>e.cacheEntryId)}}}),await t.jiraCachedTicket.deleteMany({where:{issueKey:e}})})}async refreshCachedTicket(e,t){let A=await aJ(),r=await A.jiraCacheEntryIssue.findMany({where:{issueKey:e},select:{cacheEntryId:!0}});return r.length>0&&await A.jiraCacheEntry.deleteMany({where:{id:{in:r.map(e=>e.cacheEntryId)}}}),this.ticket(e,!0,t)}async resolveIssueKeys(e){let t=[...new Set(e.map(e=>e.trim()).filter(Boolean))];if(0===t.length)return[];let{version3:A}=await this.getClients();return[...new Set((await Promise.all(t.map(e=>A.issues.getIssue({issueIdOrKey:e,fields:["key"]})))).map(e=>{let t=wu(e.key);if(!t)throw Error(`Jira issue ${e.id??""} has no key`);return wh(t)}))]}async refreshSprintTickets(e){if(!Number.isSafeInteger(e)||e<=0)throw Error("Invalid Jira sprint ID");let{agile:t}=await this.getClients(),A=[],r=0;for(;A.length<1e3;){let i=Math.min(100,1e3-A.length),n=await t.sprint.getIssuesForSprint({sprintId:e,startAt:r,maxResults:i,fields:["key"]}),a=n.issues??[];A.push(...a.flatMap(e=>{let t=wu(e.key);return t?[wh(t)]:[]}));let s=void 0===n.total?a.length<i:r+a.length>=n.total;if(0===a.length||s)break;r+=a.length}let i=[],n=[...new Set(A)];for(let e=0;e<n.length;e+=5)i.push(...await Promise.all(n.slice(e,e+5).map(e=>this.refreshCachedTicket(e))));return i}async listCachedTickets(e=50,t=0){let A=this.validatePagination(e,t),r=await aJ(),[i,n,a]=await Promise.all([r.jiraCachedTicket.findMany({take:A.limit,skip:A.offset,orderBy:{updatedAt:"desc"}}),r.jiraCachedTicket.count(),this.getSettings()]);return{...A,total:n,items:i.map(e=>this.cachedTicketView(e,a.cacheTtlSeconds))}}async cachedTicket(e){let t=await aJ(),[A,r]=await Promise.all([t.jiraCachedTicket.findUnique({where:{issueKey:e},include:{cacheEntries:{include:{cacheEntry:!0}}}}),this.getSettings()]);return A?{...this.cachedTicketView(A,r.cacheTtlSeconds),summaryData:wp(A.summaryJson),detailData:wp(A.detailJson),commentsData:wp(A.commentsJson),cacheEntries:A.cacheEntries.map(e=>({id:e.cacheEntry.id,operation:e.cacheEntry.operation,fetchedAt:e.cacheEntry.fetchedAt.toISOString()})).sort((e,t)=>t.fetchedAt.localeCompare(e.fetchedAt))}:null}async listApiCalls(e=50,t=0){let A=this.validatePagination(e,t);await this.pruneLogs();let r=await aJ(),[i,n]=await Promise.all([r.jiraApiCallLog.findMany({take:A.limit,skip:A.offset,orderBy:{createdAt:"desc"}}),r.jiraApiCallLog.count()]);return{...A,total:n,items:i.map(e=>({id:e.id,operation:e.operation,requestSummary:e.requestSummary,source:e.source,durationMs:e.durationMs,statusCode:e.statusCode,error:e.error,itemCount:e.itemCount,servedStale:e.servedStale,createdAt:e.createdAt.toISOString()}))}}async cacheMetrics(){await this.pruneLogs();let e=await aJ(),t=Date.now(),A=await e.jiraApiCallLog.findMany({where:{createdAt:{gte:new Date(t-ws.at(-1).milliseconds)}},orderBy:{createdAt:"asc"}});return{windows:ws.map(e=>this.metricWindow(e.window,A.filter(A=>A.createdAt.getTime()>=t-e.milliseconds))),operations:[...new Set(A.map(e=>e.operation))].sort().map(e=>({operation:e,windows:ws.map(r=>this.metricWindow(r.window,A.filter(A=>A.operation===e&&A.createdAt.getTime()>=t-r.milliseconds)))}))}}async requireCredentials(){let e=await aJ(),[t,A]=await Promise.all([e.jiraSettings.findUnique({where:{id:wn}}),this.storedConnection()]);if(!A)throw Error("Configure the Jira site, email, and API token in Settings first");let r=await this.credentials.getText(hm.jiraApiToken);if(!r)throw Error("Configure the Jira site, email, and API token in Settings first");return{siteUrl:A.value.siteUrl,email:A.value.email,apiToken:r,cacheTtlSeconds:t?.cacheTtlSeconds??300}}async getClients(){let e=await this.requireCredentials(),t=(0,AP.createHash)("sha256").update(`${e.siteUrl}\0${e.email}\0${e.apiToken}`).digest("hex");if(this.clients?.key===t)return this.clients;let A={host:e.siteUrl,authentication:{basic:{email:e.email,apiToken:e.apiToken}},baseRequestConfig:{timeout:15e3}};return this.clients={key:t,version3:new d4(A),agile:new ud(A)},this.clients}async webhookApiRequest(e,t,A){let r,i=await this.requireCredentials(),n=Buffer.from(`${i.email}:${i.apiToken}`).toString("base64");try{r=await fetch(`${i.siteUrl}${t}`,{method:e,headers:{Accept:"application/json",Authorization:`Basic ${n}`,"Content-Type":"application/json"},body:void 0===A?void 0:JSON.stringify(A),signal:AbortSignal.timeout(15e3)})}catch(e){throw Error(wI(e,i.apiToken))}let a=await r.text();if(!r.ok){let e=a.trim().slice(0,300)||r.statusText;throw Object.assign(Error(wI(`Jira rejected the webhook request with ${r.status}: ${e}`,i.apiToken)),{status:r.status})}if(!a.trim())return null;try{return JSON.parse(a)}catch{return null}}async currentAccountId(){let e=wu(wl((await this.cachedCall({operation:"MYSELF",params:{},requestSummary:"Current Jira user",fetcher:async()=>{let{version3:e}=await this.getClients();return e.myself.getCurrentUser()}})).value).accountId);if(!e)throw Error("Jira did not return the current user ID");return e}async linkCacheEntryToIssue(e,t){let A=await aJ();await A.$transaction(async A=>{await A.jiraCachedTicket.upsert({where:{issueKey:e},create:{issueKey:e,projectKey:e.replace(/-\d+$/,"")},update:{}}),await A.jiraCacheEntryIssue.upsert({where:{cacheEntryId_issueKey:{cacheEntryId:t,issueKey:e}},create:{cacheEntryId:t,issueKey:e},update:{}})})}async mutateTicket(e,t,A){let r,i=await this.requireCredentials(),n=Date.now();try{await A(),await this.logCall({operation:t,requestSummary:`${t.replaceAll("_"," ")} for ${e}`,source:"LIVE",durationMs:Date.now()-n})}catch(r){let A=wI(r,i.apiToken);throw await this.logCall({operation:t,requestSummary:`${t.replaceAll("_"," ")} for ${e}`,source:"ERROR",durationMs:Date.now()-n,statusCode:wf(r),error:A}),Error(A)}await this.invalidateIssueCaches(e);try{r=await this.ticket(e,!0)}catch(e){throw Error(`Jira accepted the update, but refreshed ticket details could not be loaded: ${wI(e,i.apiToken)}`)}return aq.publish(a4,{jiraTicketChanged:{issueKey:r.key,projectKey:r.projectKey,event:`aide:${t.toLowerCase()}`}}),r}cacheKey(e,t,A){return(0,AP.createHash)("sha256").update(wm({siteUrl:e,operation:t,params:A})).digest("hex")}async cachedCall(e){let t=await this.requireCredentials(),A=await aJ(),r=this.cacheKey(t.siteUrl,e.operation,e.params),i=Date.now(),n=await A.jiraCacheEntry.findUnique({where:{cacheKey:r}}),a=null!==n&&Date.now()-n.fetchedAt.getTime()<1e3*t.cacheTtlSeconds;if(!e.force&&a)return await this.logCall({operation:e.operation,requestSummary:e.requestSummary,source:"CACHE",durationMs:Date.now()-i,itemCount:e.itemCount?.(wp(n.responseJson))??null,sourceId:e.sourceId}),{value:wp(n.responseJson),source:"CACHE",stale:!1,fetchedAt:n.fetchedAt,entryId:n.id};let s=this.inFlight.get(r);if(s){let t=await s;return await this.logCall({operation:e.operation,requestSummary:`${e.requestSummary} (coalesced)`,source:"CACHE",durationMs:Date.now()-i,itemCount:e.itemCount?.(t.value)??null,sourceId:e.sourceId}),{...t,source:"CACHE"}}let o=(async()=>{try{let t=await e.fetcher(),n=new Date,a=await A.jiraCacheEntry.upsert({where:{cacheKey:r},create:{id:(0,AP.randomUUID)(),cacheKey:r,operation:e.operation,paramsJson:wm(e.params),responseJson:JSON.stringify(t),fetchedAt:n,sourceId:e.sourceId??null},update:{operation:e.operation,paramsJson:wm(e.params),responseJson:JSON.stringify(t),fetchedAt:n,sourceId:e.sourceId??null}});return await this.logCall({operation:e.operation,requestSummary:e.requestSummary,source:"LIVE",durationMs:Date.now()-i,itemCount:e.itemCount?.(t)??null,sourceId:e.sourceId}),{value:t,source:"LIVE",stale:!1,fetchedAt:n,entryId:a.id}}catch(r){let A=null!==n&&!1!==e.allowStaleOnError;if(await this.logCall({operation:e.operation,requestSummary:e.requestSummary,source:"ERROR",durationMs:Date.now()-i,statusCode:wf(r),error:wI(r,t.apiToken),servedStale:A,sourceId:e.sourceId}),A)return{value:wp(n.responseJson),source:"ERROR",stale:!0,fetchedAt:n.fetchedAt,entryId:n.id};throw Error(wI(r,t.apiToken))}})();this.inFlight.set(r,o);try{return await o}finally{this.inFlight.delete(r)}}async logCall(e){if(!this.recordCallLogs)return;let t=await aJ();await t.jiraApiCallLog.create({data:{id:(0,AP.randomUUID)(),operation:e.operation,requestSummary:e.requestSummary.slice(0,1e3),source:e.source,durationMs:Math.max(0,Math.round(e.durationMs)),statusCode:e.statusCode??null,error:e.error??null,itemCount:e.itemCount??null,servedStale:e.servedStale??!1,sourceId:e.sourceId??null}})}validateSourceName(e){let t=e.trim();if(!t||t.length>100)throw Error("Source name must be 1 to 100 characters");return t}async validateSource(e,t){let A=t.trim();if(!A)throw Error("BOARD"===e?"Board URL is required":"JQL is required");if("JQL"===e)return await this.cachedCall({operation:"JQL_VALIDATE",params:{jql:A},requestSummary:`Validate JQL: ${A}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issueSearch.searchForIssuesUsingJqlEnhancedSearch({jql:A,maxResults:1,fields:["key"],failFast:!0})}}),{value:A,boardId:null};let r=function(e,t){let A=new URL(e.trim());if(A.origin!==new URL(t).origin)throw Error("Board URL must belong to the configured Jira site");let r=A.pathname.match(/\/boards\/(\d+)(?:\/|$)/i),i=A.searchParams.get("rapidView"),n=Number(r?.[1]??i);if(!Number.isSafeInteger(n)||n<=0)throw Error("Board URL must contain a Jira board ID");return{boardId:n,normalizedUrl:A.toString()}}(A,(await this.requireCredentials()).siteUrl);return await this.cachedCall({operation:"BOARD",params:{boardId:r.boardId},requestSummary:`Board ${r.boardId}`,fetcher:async()=>{let{agile:e}=await this.getClients();return e.board.getBoard({boardId:r.boardId})}}),{value:r.normalizedUrl,boardId:r.boardId}}async loadJqlSource(e,t){let A,r=[],i=[],n=[],a=!1;do{let s=Math.min(100,1e3-r.length),o=await this.cachedCall({operation:"JQL_SEARCH",params:{jql:e.value,nextPageToken:A??null,maxResults:s,fields:wa},requestSummary:`JQL ${e.name}${A?" next page":""}`,sourceId:e.id,force:t,fetcher:async()=>{let{version3:t}=await this.getClients();return t.issueSearch.searchForIssuesUsingJqlEnhancedSearch({jql:e.value,nextPageToken:A,maxResults:s,fields:wa})},itemCount:e=>e.issues?.length??0});i.push(o);let l=o.value.issues??[];r.push(...l),n.push(...o.value.warningMessages??[]),"LIVE"===o.source&&await this.storeSummaries(o.entryId,l,o.fetchedAt),A=o.value.nextPageToken,r.length>=1e3&&A&&(a=!0)}while(A&&r.length<1e3)return this.buildBoardResult(r,i,n,a)}async loadBoardSource(e,t){if(!e.boardId)throw Error("Saved board source has no board ID");let A=await this.cachedCall({operation:"BOARD",params:{boardId:e.boardId},requestSummary:`Board ${e.boardId}`,sourceId:e.id,force:t,fetcher:async()=>{let{agile:t}=await this.getClients();return t.board.getBoard({boardId:e.boardId})}}),r=await this.cachedCall({operation:"BOARD_CONFIGURATION",params:{boardId:e.boardId},requestSummary:`Board ${e.boardId} configuration`,sourceId:e.id,force:t,fetcher:async()=>{let{agile:t}=await this.getClients();return t.board.getConfiguration({boardId:e.boardId})}}),i=[A,r],n=[],a=[],s=!1;if("scrum"===(wu(A.value.type)??"").toLowerCase()){let A=await this.cachedCall({operation:"SPRINTS",params:{boardId:e.boardId,state:"active"},requestSummary:`Active sprints for board ${e.boardId}`,sourceId:e.id,force:t,fetcher:async()=>{let{agile:t}=await this.getClients();return t.board.getAllSprints({boardId:e.boardId,state:"active",startAt:0,maxResults:100})},itemCount:e=>wc(e.values).length});i.push(A);let r=wc(A.value.values).map(wl);for(let A of(0===r.length&&a.push("This Scrum board has no active sprint."),r)){let r=wd(A.id);if(!r||n.length>=1e3)continue;let o=await this.loadAgileIssues("SPRINT_ISSUES",e,t,(e,t)=>({sprintId:r,startAt:e,maxResults:t,fields:wa}),async e=>{let{agile:t}=await this.getClients();return t.sprint.getIssuesForSprint(e)},n.length);n.push(...o.issues),i.push(...o.results),a.push(...o.warnings),s||=o.truncated}}else{let A=await this.loadAgileIssues("BOARD_ISSUES",e,t,(t,A)=>({boardId:e.boardId,startAt:t,maxResults:A,fields:wa}),async e=>{let{agile:t}=await this.getClients();return t.board.getIssuesForBoard(e)},0);n.push(...A.issues),i.push(...A.results),a.push(...A.warnings),s=A.truncated}let o=[...new Map(n.map(e=>[e.key??e.id,e])).values()],l=new Map;return wc(wl(r.value.columnConfig).columns).map(wl).forEach((e,t)=>{wc(e.statuses).map(wl).forEach(e=>{let A=wu(e.id);A&&l.set(A,t)})}),this.buildBoardResult(o,i,a,s,l)}async loadAgileIssues(e,t,A,r,i,n){let a=[],s=[],o=[],l=0,c=1/0,u=!1;for(;l<c&&a.length+n<1e3;){let u=r(l,Math.min(100,1e3-n-a.length)),d=await this.cachedCall({operation:e,params:u,requestSummary:`${e.replaceAll("_"," ")} from ${l}`,sourceId:t.id,force:A,fetcher:()=>i(u),itemCount:e=>e.issues?.length??0});s.push(d);let h=d.value.issues??[];if(a.push(...h),o.push(...d.value.warningMessages??[]),"LIVE"===d.source&&await this.storeSummaries(d.entryId,h,d.fetchedAt),c=d.value.total??a.length,0===h.length)break;l+=h.length}return a.length+n>=1e3&&l<c&&(u=!0),{issues:a,results:s,warnings:o,truncated:u}}buildBoardResult(e,t,A,r,i){let n=e.slice(0,1e3).map(wD),a=[...new Map(n.map(e=>[e.status,e])).values()];return a.sort((e,t)=>{let A=i?.get(e.statusId),r=i?.get(t.statusId);return void 0!==A||void 0!==r?(A??Number.MAX_SAFE_INTEGER)-(r??Number.MAX_SAFE_INTEGER):wk(e.statusCategory)-wk(t.statusCategory)||e.status.localeCompare(t.status)}),{tickets:n,statusOrder:a.map(e=>e.status),cache:wb(t),truncated:r,warnings:[...new Set(A)]}}async storeSummaries(e,t,A){let r=await aJ();await r.$transaction(async r=>{for(let e of t)e.key&&await r.jiraCachedTicket.upsert({where:{issueKey:e.key},create:{issueKey:e.key,projectKey:ww(e),summaryJson:JSON.stringify(e),summaryFetchedAt:A},update:{projectKey:ww(e),summaryJson:JSON.stringify(e),summaryFetchedAt:A}});await r.jiraCacheEntryIssue.deleteMany({where:{cacheEntryId:e}});let i=[...new Set(t.map(e=>e.key).filter(Boolean))];i.length>0&&await r.jiraCacheEntryIssue.createMany({data:i.map(t=>({cacheEntryId:e,issueKey:t}))})})}async storeDetail(e,t,A){if(!t.key)throw Error("Jira detail response did not include an issue key");let r=await aJ();await r.$transaction(async r=>{await r.jiraCachedTicket.upsert({where:{issueKey:t.key},create:{issueKey:t.key,projectKey:ww(t),detailJson:JSON.stringify(t),detailFetchedAt:A},update:{projectKey:ww(t),detailJson:JSON.stringify(t),detailFetchedAt:A}}),await r.jiraCacheEntryIssue.upsert({where:{cacheEntryId_issueKey:{cacheEntryId:e,issueKey:t.key}},create:{cacheEntryId:e,issueKey:t.key},update:{}})})}async storeComments(e,t,A,r){let i=await aJ();await i.$transaction(async i=>{for(let n of(await i.jiraCachedTicket.upsert({where:{issueKey:e},create:{issueKey:e,projectKey:e.split("-")[0]??"UNKNOWN",commentsJson:JSON.stringify(t),commentsFetchedAt:A},update:{commentsJson:JSON.stringify(t),commentsFetchedAt:A}}),r))await i.jiraCacheEntryIssue.upsert({where:{cacheEntryId_issueKey:{cacheEntryId:n,issueKey:e}},create:{cacheEntryId:n,issueKey:e},update:{}})})}normalizeTicketDetail(e,t,A,r,i){let n=wD(e),a=wl(e.fields),s=wl(e.names),o=wl(e.schema),l=[];for(let e of wc(a.issuelinks).map(wl)){let t=wl(e.type),A=wE(e.outwardIssue,wu(t.outward)??"relates to"),r=wE(e.inwardIssue,wu(t.inward)??"relates to");A&&l.push(A),r&&l.push(r)}let c=wE(a.parent,"parent"),u=wc(a.subtasks).map(e=>wE(e,"subtask")).filter(e=>null!==e),d=wc(a.sprint).map(wl),h=wc(a.closedSprints).map(wl),p=d.filter(e=>{let t=wu(e.state)?.toLowerCase();return!t||"active"===t}).map(e=>wu(e.name)).filter(e=>!!e),g=h.concat(d.filter(e=>wu(e.state)?.toLowerCase()==="closed")).map(e=>wu(e.name)).filter(e=>!!e),m=p.concat(g),f=t.map(wl).map(e=>({id:wu(e.id)??(0,AP.randomUUID)(),author:wC(e.author),body:e.body??null,content:wr(e.body??null,A),createdAt:wu(e.created),updatedAt:wu(e.updated)}));return{...n,jiraUrl:`${A}/browse/${n.key}`,description:a.description??null,descriptionContent:wr(a.description??null,A),reporter:wC(a.reporter),creator:wC(a.creator),labels:wc(a.labels).filter(e=>"string"==typeof e),components:wy(a.components),fixVersions:wy(a.fixVersions),affectedVersions:wy(a.versions),sprintNames:[...new Set(m)],activeSprintNames:[...new Set(p)],closedSprintNames:[...new Set(g)],parent:c,subtasks:u,issueLinks:l,attachments:wc(a.attachment).map(wl).map(e=>({id:wu(e.id)??(0,AP.randomUUID)(),filename:wu(e.filename)??"Attachment",contentUrl:wu(e.content),mimeType:wu(e.mimeType),size:wd(e.size),author:wC(e.author),createdAt:wu(e.created)})),comments:f,createdAt:wu(a.created),dueAt:wu(a.duedate),resolvedAt:wu(a.resolutiondate),timeTracking:a.timetracking??null,allFields:Object.entries(a).map(([e,t])=>{let r=wl(o[e]),i="string"==typeof t||wo(t)&&"doc"===t.type?wr(t,A):null;return{id:e,name:wu(s[e])??e,schemaType:wu(r.type),custom:!0===r.custom||e.startsWith("customfield_"),value:t??null,content:i}}).sort((e,t)=>e.name.localeCompare(t.name)),cache:r,commentsCache:i}}cachedTicketView(e,t){let A=wD(wl(wp(e.detailJson)??wp(e.summaryJson))),r=e.detailJson&&e.commentsJson?"FULL":e.detailJson?"DETAIL":"SUMMARY",i=[e.summaryFetchedAt,e.detailFetchedAt,e.commentsFetchedAt].filter(e=>null!==e).some(e=>Date.now()-e.getTime()>=1e3*t);return{issueKey:e.issueKey,projectKey:e.projectKey,summary:A.summary,status:"Unknown"===A.status?null:A.status,coverage:r,stale:i,summaryFetchedAt:e.summaryFetchedAt?.toISOString()??null,detailFetchedAt:e.detailFetchedAt?.toISOString()??null,commentsFetchedAt:e.commentsFetchedAt?.toISOString()??null,updatedAt:e.updatedAt.toISOString()}}validatePagination(e,t){if(!Number.isInteger(e)||e<1||e>100)throw Error("Pagination limit must be from 1 to 100");if(!Number.isInteger(t)||t<0)throw Error("Pagination offset must be non-negative");return{limit:e,offset:t}}metricWindow(e,t){return{window:e,total:t.length,live:t.filter(e=>"LIVE"===e.source).length,cache:t.filter(e=>"CACHE"===e.source).length,errors:t.filter(e=>"ERROR"===e.source).length,averageMs:0===t.length?0:Math.round(t.reduce((e,t)=>e+t.durationMs,0)/t.length)}}async pruneLogs(){let e=Date.now();if(e-this.lastPrunedAt<36e5)return;this.lastPrunedAt=e;let t=await aJ();await t.jiraApiCallLog.deleteMany({where:{createdAt:{lt:new Date(e-2592e6)}}})}}let wM="default",wT=/^[A-Z][A-Z0-9_]*-\d+$/,wU=new Set(["jira:issue_created","jira:issue_updated","comment_created","comment_updated","comment_deleted","worklog_created","worklog_updated","worklog_deleted","jira:worklog_updated","attachment_created","attachment_deleted","issuelink_created","issuelink_deleted","sprint_started","sprint_closed"]),wx={"jira:issue_created":"JIRA_ISSUE_CREATED","jira:issue_deleted":"JIRA_ISSUE_DELETED",comment_created:"JIRA_ISSUE_COMMAND",attachment_created:"JIRA_ATTACHMENT_ADDED",issuelink_created:"JIRA_ISSUE_LINKED"},wN="/api/public/jira/webhook",wF="/rest/webhooks/1.0/webhook",wG=new Set(["localhost","0.0.0.0","::1","[::1]",""]),wO=["jira:issue_created","jira:issue_updated","jira:issue_deleted","comment_created","worklog_created","attachment_created","issuelink_created","sprint_started","sprint_closed"];class wJ extends Error{httpStatus;constructor(e,t){super(e),this.httpStatus=t,this.name="JiraWebhookRequestError"}}function w_(e){return"string"==typeof e&&e.trim()?e.trim():null}function wV(e){return"string"==typeof e?e.length?e:null:"number"==typeof e||"boolean"==typeof e?String(e):null}function wP(e){let t=wL(e);if(!t)return null;let A=Array.isArray(t.items)?t.items:[];return{id:wV(t.id),items:A.map(wL).filter(e=>null!==e).map(e=>({field:w_(e.field)??w_(e.fieldId)??"Field",fieldId:w_(e.fieldId),fieldType:w_(e.fieldtype)??w_(e.fieldType),from:wV(e.from),fromString:wV(e.fromString),to:wV(e.to),toString:wV(e.toString)}))}}function wL(e){return"object"!=typeof e||null===e||Array.isArray(e)?null:e}function wH(e){return"object"==typeof e&&null!==e&&"status"in e&&"number"==typeof e.status?e.status:null}function wj(e){let t=wL(e);return t?{accountId:w_(t.accountId),displayName:w_(t.displayName)}:null}class wq{jira;credentials;workflowEvents;constructor(e,t,A){this.jira=e,this.credentials=t,this.workflowEvents=A}async storedWebhookSettings(){return hL(this.credentials,hm.jiraWebhookSettings,hW)}async webhooksEnabled(){let e=await aJ(),t=await e.jiraSettings.findUnique({where:{id:wM},select:{webhookEnabled:!0}});return!!t?.webhookEnabled&&this.credentials.isConfigured(hm.jiraWebhookSecret)}async getWebhookSettings(){let e=await aJ(),[t,A,r,i]=await Promise.all([e.jiraSettings.upsert({where:{id:wM},create:{id:wM},update:{}}),this.storedWebhookSettings(),this.credentials.isConfigured(hm.jiraWebhookSecret),e.jiraWebhookDelivery.findFirst({orderBy:[{receivedAt:"desc"},{deliveryId:"desc"}]})]);return{enabled:t.webhookEnabled&&r,secretConfigured:r,registered:!!t.webhookId,registrationId:t.webhookId??null,registeredUrl:A?.value.url??null,jql:A?.value.jql??null,configuredAt:t.webhookConfiguredAt?.toISOString()??null,lastReceivedAt:i?.receivedAt.toISOString()??null,lastOutcome:i?.outcome??null,lastError:i?.error??null}}async enableWebhook(){let e=(0,AP.randomBytes)(32).toString("base64url");return await this.credentials.setText(hm.jiraWebhookSecret,e,async e=>{await e.jiraSettings.upsert({where:{id:wM},create:{id:wM,webhookEnabled:!0,webhookConfiguredAt:new Date},update:{webhookEnabled:!0,webhookConfiguredAt:new Date}})}),{settings:await this.getWebhookSettings(),secret:e}}async registerWebhook(e){let t=function(e){let t;try{t=new URL(e.trim())}catch{throw Error("Enter the public URL of this server")}if("https:"!==t.protocol&&"http:"!==t.protocol)throw Error("The webhook URL must use HTTP or HTTPS");if(t.username||t.password||t.search||t.hash)throw Error("The webhook URL must not include credentials, query, or fragment");let A=t.hostname.toLowerCase().replace(/^\[|\]$/g,"");if(wG.has(A)||A.endsWith(".local")||A.endsWith(".localhost")||/^127\./.test(A)||/^10\./.test(A)||/^192\.168\./.test(A)||/^172\.(1[6-9]|2\d|3[01])\./.test(A))throw Error(`Jira cannot reach ${t.host}. Expose this server publicly, or set PUBLIC_BASE_URL to its public address.`);let r=t.pathname.replace(/\/+$/,"");if(!r)return`${t.origin}${wN}`;if(r.endsWith(wN))return`${t.origin}${r}`;throw Error(`The webhook URL must end with ${wN}`)}(e.url),A=e.jql?.trim()||null,r=(0,AP.randomBytes)(32).toString("base64url");await this.credentials.assertWritable();let i=await aJ(),n=await i.jiraSettings.findUnique({where:{id:wM},select:{webhookId:!0}}),a=await this.writeToJira({webhookId:n?.webhookId??null,url:t,jql:A,secret:r});return await this.credentials.setMany([{descriptor:hm.jiraWebhookSettings,value:hw({url:t,jql:A})},{descriptor:hm.jiraWebhookSecret,value:Buffer.from(r,"utf8")}],async e=>{await e.jiraSettings.upsert({where:{id:wM},create:{id:wM,webhookEnabled:!0,webhookConfiguredAt:new Date,webhookId:a},update:{webhookEnabled:!0,webhookConfiguredAt:new Date,webhookId:a}})}),{settings:await this.getWebhookSettings(),secret:r}}async rotateSecret(){if(!await this.credentials.isConfigured(hm.jiraWebhookSecret))throw Error("The Jira webhook is not configured");let[e,t]=await Promise.all([(await aJ()).jiraSettings.findUnique({where:{id:wM},select:{webhookId:!0}}),this.storedWebhookSettings()]);return e?.webhookId&&t?this.registerWebhook({url:t.value.url,jql:t.value.jql}):this.enableWebhook()}async disableWebhook(){await this.credentials.assertWritable();let e=await aJ(),t=await e.jiraSettings.findUnique({where:{id:wM},select:{webhookId:!0}});return t?.webhookId&&await this.deleteFromJira(t.webhookId),await this.credentials.deleteMany([hm.jiraWebhookSettings,hm.jiraWebhookSecret],async e=>{await e.jiraSettings.upsert({where:{id:wM},create:{id:wM},update:{webhookEnabled:!1,webhookConfiguredAt:null,webhookId:null}})}),this.getWebhookSettings()}async writeToJira(e){let t,A,r={name:"AI Development Environment",description:"Registered by AI Development Environment. Drives Jira workflow triggers and live ticket updates.",url:e.url,events:[...wO],excludeBody:!1,secret:e.secret,...e.jql?{filters:{"issue-related-events-section":e.jql}}:{}};if(e.webhookId){let t=`${wF}/${encodeURIComponent(e.webhookId)}`;try{return await this.jira.webhookApiRequest("PUT",t,r),e.webhookId}catch(e){if(404!==wH(e))throw e}}let i=await this.jira.webhookApiRequest("POST",wF,r),n=(t=w_(i?.self),(A=t?.match(/\/webhook\/([^/]+)\/?$/)?.[1])?decodeURIComponent(A):null);if(!n)throw Error("Jira did not return the ID of the new webhook");return n}async deleteFromJira(e){try{await this.jira.webhookApiRequest("DELETE",`${wF}/${encodeURIComponent(e)}`)}catch(e){if(404!==wH(e))throw e}}async deliveries(e=50,t=0){if(!Number.isInteger(e)||e<1||e>100)throw Error("Limit must be an integer from 1 to 100");if(!Number.isInteger(t)||t<0)throw Error("Offset must be a non-negative integer");let A=await this.webhooksEnabled();if(!A)return{enabled:A,items:[],total:0,limit:e,offset:t};let r=await aJ(),[i,n]=await Promise.all([r.jiraWebhookDelivery.findMany({orderBy:[{receivedAt:"desc"},{deliveryId:"desc"}],take:e,skip:t}),r.jiraWebhookDelivery.count()]);return{enabled:A,items:i.map(wK),total:n,limit:e,offset:t}}async clearDeliveries(){let e=await aJ();return await e.jiraWebhookDelivery.deleteMany(),!0}async prune(){let e=await aJ();await e.jiraWebhookDelivery.deleteMany({where:{receivedAt:{lt:new Date(Date.now()-2592e6)}}})}async handleWebhook(e){var t,A,r,i,n,a;let s,o,l=await this.credentials.getText(hm.jiraWebhookSecret);if(!l)throw new wJ("Jira webhook is not configured",503);if(!e.signature?.startsWith("sha256="))throw new wJ("Jira webhook signature is missing",401);if(t=`sha256=${(0,AP.createHmac)("sha256",l).update(e.body).digest("hex")}`,A=e.signature,s=Buffer.from(t),o=Buffer.from(A),!(s.length===o.length&&(0,AP.timingSafeEqual)(s,o)))throw new wJ("Jira webhook signature is invalid",401);if(!e.deliveryId?.trim())throw new wJ("Jira delivery ID is missing",400);let c=await aJ(),u=e.deliveryId.trim(),d=Number.parseInt(e.retryCount??"",10),h=Number.isInteger(d)?d:null;try{await c.jiraWebhookDelivery.create({data:{deliveryId:u,event:"unknown",outcome:"RECEIVED",retryCount:h}})}catch(e){if(!("object"==typeof e&&null!==e&&"code"in e&&"P2002"===e.code))throw e;if(0===(await c.jiraWebhookDelivery.updateMany({where:{deliveryId:u,outcome:{notIn:["PROCESSED","IGNORED"]}},data:{event:"unknown",issueKey:null,projectKey:null,changelogJson:null,retryCount:h,outcome:"RECEIVED",error:null,receivedAt:new Date,processedAt:null}})).count)return await this.prune().catch(()=>void 0),{outcome:"DUPLICATE",event:null,issueKey:null,triggersRecorded:0}}let p=async(e,t=null)=>{let A=await c.jiraWebhookDelivery.update({where:{deliveryId:u},data:{outcome:e,error:t,processedAt:new Date}});aq.publish(a8,{jiraWebhookDeliveryChanged:wK(A)})};try{let t,A,s,o,l,d;try{let A=JSON.parse(Buffer.from(e.body).toString("utf8")),r=wL(A);if(!r)throw Error("Payload is not an object");t=r}catch{throw new wJ("Jira webhook payload is invalid JSON",400)}let g=w_(t.webhookEvent),m=(r=t,A=wL(r.issue),(s=w_(A?.key)?.toUpperCase()??null)&&wT.test(s)?s:null),f=(i=t,o=wL(i.issue),l=wL(o?.fields),d=wL(l?.project)??wL(i.project),w_(d?.key)?.toUpperCase()??null),I=wP(t.changelog);if(await c.jiraWebhookDelivery.update({where:{deliveryId:u},data:{event:g??"unknown",issueKey:m,projectKey:f,changelogJson:I?JSON.stringify(I):null}}),!g)return await p("IGNORED","Payload has no webhookEvent"),{outcome:"IGNORED",event:g,issueKey:m,triggersRecorded:0};if(!(wU.has(g)||"jira:issue_deleted"===g))return await p("IGNORED",`Unhandled Jira event ${g}`),{outcome:"IGNORED",event:g,issueKey:m,triggersRecorded:0};let w=m?[m]:[];if("issuelink_created"===g||"issuelink_deleted"===g){let e,A,r=(n=t,e=wL(n.issueLink),[wV(e?.sourceIssueId),wV(e?.destinationIssueId)].filter((e,t,A)=>!!(e&&A.indexOf(e)===t)));if(0===r.length)return await p("IGNORED","Payload has no issue-link issue IDs"),{outcome:"IGNORED",event:g,issueKey:m,triggersRecorded:0};f=(m=(w=await this.jira.resolveIssueKeys(r))[0]??null)?f??((A=(a=m).lastIndexOf("-"))>0?a.slice(0,A):null):f,await c.jiraWebhookDelivery.update({where:{deliveryId:u},data:{issueKey:m,projectKey:f}})}let C="sprint_started"===g||"sprint_closed"===g;if(!C&&!m)return await p("IGNORED","Payload has no issue key"),{outcome:"IGNORED",event:g,issueKey:m,triggersRecorded:0};let y=[];if("jira:issue_deleted"===g)await this.jira.deleteCachedTicket(m),y.push({key:m,projectKey:f});else if(C){let e=function(e){let t=wV(wL(e.sprint)?.id);if(!t)return null;let A=Number(t);return Number.isSafeInteger(A)&&A>0?A:null}(t);if(!e)return await p("IGNORED","Payload has no valid sprint ID"),{outcome:"IGNORED",event:g,issueKey:m,triggersRecorded:0};let A=await this.jira.refreshSprintTickets(e);y.push(...A.map(e=>({key:e.key,projectKey:e.projectKey})))}else if("jira:issue_updated"===g){let e=await this.jira.refreshCachedTicket(m,I);y.push({key:e.key,projectKey:e.projectKey})}else if(wU.has(g)){let e=await Promise.all(w.map(e=>this.jira.refreshCachedTicket(e)));y.push(...e.map(e=>({key:e.key,projectKey:e.projectKey})))}let E=m?await this.recordWebhookTrigger({event:g,deliveryId:u,issueKey:m,projectKey:f,retries:h,payload:t}):0;for(let e of y)aq.publish(a4,{jiraTicketChanged:{issueKey:e.key,projectKey:e.projectKey,event:g}});return await p("PROCESSED"),{outcome:"PROCESSED",event:g,issueKey:m,triggersRecorded:E}}catch(t){let e=t instanceof Error?t.message:String(t);throw await p("ERROR",e),t}finally{await this.prune().catch(()=>void 0)}}async recordWebhookTrigger(e){if(!this.workflowEvents)return 0;let t=wx[e.event];if(!t)return 0;let{payload:A}=e,r=wL(A.issue),i=wL(r?.fields),n=wL(A.comment),a=wL(A.attachment),s=wL(A.issueLink),o=wL(i?.status),l=wP(A.changelog),c={ticket:{key:e.issueKey,title:w_(i?.summary),type:w_(wL(i?.issuetype)?.name),status:w_(o?.name),statusId:w_(o?.id),statusCategory:w_(wL(o?.statusCategory)?.key),assignee:w_(wL(i?.assignee)?.displayName),assigneeAccountId:w_(wL(i?.assignee)?.accountId),labels:Array.isArray(i?.labels)?i.labels:[],projectKey:e.projectKey,url:null},comment:n?{id:w_(n.id),body:w_(n.body)??"",author:wj(n.author)}:null,attachment:a?{id:w_(a.id),filename:w_(a.filename),mimeType:w_(a.mimeType),author:wj(a.author)}:null,link:s?{id:w_(s.id),type:w_(wL(s.issueLinkType)?.name),sourceIssueId:w_(s.sourceIssueId),destinationIssueId:w_(s.destinationIssueId)}:null,user:wj(A.user),changelog:l};return+!!await this.workflowEvents.record({kind:t,subjectKey:e.issueKey,dedupeKey:`jira-webhook-trigger:${e.deliveryId}:${t}`,payload:{...c,sessionData:c,cursorValue:`${e.deliveryId}:${t}`,webhook:{event:e.event,deliveryId:e.deliveryId,retryCount:e.retries}}})}}function wK(e){return{deliveryId:e.deliveryId,event:e.event,issueKey:e.issueKey,projectKey:e.projectKey,changelog:function(e){if(!e)return null;try{return wP(JSON.parse(e))}catch{return null}}(e.changelogJson),retryCount:e.retryCount,outcome:e.outcome,error:e.error,receivedAt:e.receivedAt.toISOString(),processedAt:e.processedAt?.toISOString()??null}}function wY(e){if(e.agentId)throw Error("Agent credentials cannot perform control-plane operations")}var wW=e.i(374186);function w$(e,{flags:t="",label:A="Regex pattern",maxLength:r=1024}={}){if(e.length>r)throw Error(`${A} must not exceed ${r} characters`);try{return new wW.default(e,t.includes("u")?t:`${t}u`)}catch(t){let e=t instanceof Error?t.message:String(t);if(!(t instanceof SyntaxError))throw Error(`${A} could not be compiled: ${e}`,{cause:t});throw Error(`${A} is not valid RE2 syntax: ${e}`,{cause:t})}}var wZ=e.i(898912),wz=e.i(969068);function wX(e){if(null===e||!/^\d+$/.test(e))return null;let t=Number(e);return Number.isSafeInteger(t)?t:null}function w0(e){let t=wX(e.get("x-ratelimit-limit")),A=wX(e.get("x-ratelimit-remaining")),r=wX(e.get("x-ratelimit-used")),i=wX(e.get("x-ratelimit-reset")),n=e.get("x-ratelimit-resource")?.trim()??"";if(null===t||null===A||null===r||null===i||!n)return null;let a=new Date(1e3*i);return Number.isFinite(a.getTime())?{limit:t,remaining:A,used:r,resetAt:a,resource:n}:null}async function w1(e,t){let A=w0(t.headers);if(!A)return null;try{let t=await aJ(),r=`${e}:${A.resource}`,i=new Date;await t.gitHubRateLimitSnapshot.upsert({where:{authentication_resource:{authentication:e,resource:A.resource}},create:{id:r,authentication:e,observedAt:i,...A},update:{observedAt:i,...A}})}catch{}return A}async function w8(){let e=await aJ();return(await e.gitHubRateLimitSnapshot.findMany({orderBy:[{resource:"asc"},{authentication:"asc"}]})).map(e=>({authentication:e.authentication,resource:e.resource,limit:e.limit,remaining:e.remaining,used:e.used,resetAt:e.resetAt.toISOString(),observedAt:e.observedAt.toISOString()}))}let w4="actions.cancelWorkflowRun",w2="actions.dispatchWorkflow",w3="actions.forceCancelWorkflowRun",w6="actions.getJobForWorkflowRun",w5="actions.getWorkflowRun",w9="actions.getWorkflowRunAttempt",w7="actions.listJobsForWorkflowRun",Ce="actions.listJobsForWorkflowRunAttempt",Ct="actions.listRepoWorkflows",CA="actions.listWorkflowRuns",Cr="actions.listWorkflowRunsForRepo",Ci="actions.reRunJobForWorkflowRun",Cn="actions.reRunWorkflow",Ca="actions.reRunWorkflowFailedJobs",Cs="apps.createInstallationAccessToken",Co="apps.getAuthenticated",Cl="apps.getInstallation",Cc="apps.updateWebhookConfigForApp",Cu="repos.listPullRequestsAssociatedWithCommit",Cd="users.listEmailsForAuthenticatedUser";class Ch extends Error{code;githubRequestId;statusCode;rateLimit;constructor(e,t,A=null,r=null,i=null){super(t),this.code=e,this.githubRequestId=A,this.statusCode=r,this.rateLimit=i,this.name="GitHubAppError"}}let Cp=new Map,Cg=new Map;function Cm(e,t,A){let r=e.trim();if(!/^[1-9]\d*$/.test(r))throw new Ch(A,`${t} must be a positive integer`);return r}function Cf(e){let{privateKeyPkcs8:t,keyFingerprint:A}=function(e){try{let t=(0,AP.createPrivateKey)({key:e.trim(),format:"pem"});if("rsa"!==t.asymmetricKeyType)throw Error("The key is not RSA");let A=t.export({format:"pem",type:"pkcs8"}).toString(),r=(0,AP.createPublicKey)(t).export({format:"der",type:"spki"}),i=`SHA256:${(0,AP.createHash)("sha256").update(r).digest("base64url")}`;return{key:t,privateKeyPkcs8:A,keyFingerprint:i}}catch{throw new Ch("INVALID_PRIVATE_KEY","The GitHub App private key is not a valid RSA PEM")}}(e.privateKey);return{...e,appId:Cm(e.appId,"GitHub App ID","INVALID_APP_ID"),installationId:Cm(e.installationId,"GitHub installation ID","INVALID_INSTALLATION_ID"),privateKeyPkcs8:t,keyFingerprint:A}}async function CI(e){try{let t=await (0,wZ.importPKCS8)(e.privateKeyPkcs8,"RS256"),A=Math.floor(Date.now()/1e3);return await new wz.SignJWT({}).setProtectedHeader({alg:"RS256",typ:"JWT"}).setIssuer(e.appId).setIssuedAt(A-60).setExpirationTime(A+540).sign(t)}catch{throw new Ch("INVALID_PRIVATE_KEY","The GitHub App private key could not sign an App JWT")}}function Cw(e){return`${e.appId}:${e.installationId}:${e.keyFingerprint}`}function CC(e){return{accept:"application/vnd.github+json",authorization:e,"user-agent":"ai-development-environment","x-github-api-version":"2022-11-28"}}async function Cy(e,t,A,r,i){let n,a=Date.now(),s=(t.method??"GET").toUpperCase(),o=e===r?.graphqlUrl&&"string"==typeof t.body?t.body:null;try{n=await fetch(e,{...t,cache:"no-store"})}catch{throw r?.requestObserver&&await Promise.resolve(r.requestObserver({url:e,method:s,operation:A,requestSource:i,body:o,durationMs:Date.now()-a,statusCode:null,error:"GitHub could not be reached",rateLimit:null})).catch(()=>void 0),new Ch("GITHUB_APP_REQUEST_FAILED","GitHub could not be reached")}return r?.responseObserver&&await Promise.resolve(r.responseObserver(n)).catch(()=>void 0),r?.requestObserver&&await Promise.resolve(r.requestObserver({url:e,method:s,operation:A,requestSource:i,body:o,durationMs:Date.now()-a,statusCode:n.status,error:n.ok?null:`GitHub returned HTTP ${n.status}`,rateLimit:w0(n.headers)})).catch(()=>void 0),n}async function CE(e){try{return await e.json()}catch{return null}}function CQ(e){return e.headers.get("x-github-request-id")}function CB(e,t,A=[]){let r=`GitHub returned HTTP ${t}`;for(let t of(e&&"object"==typeof e&&"message"in e&&"string"==typeof e.message&&(r=e.message),A))t&&(r=r.split(t).join("[REDACTED]"));return r}async function Cb(e,t){let A=await Cy(`${e.apiBaseUrl}/app/installations/${e.installationId}`,{headers:CC(`Bearer ${t}`)},Cl,e,"GITHUB_SETTINGS"),r=await CE(A),i=CQ(A);if(401===A.status)throw new Ch("GITHUB_APP_UNAUTHORIZED","GitHub rejected the App ID or private key",i);if(404===A.status)throw new Ch("INSTALLATION_NOT_FOUND","The GitHub App installation was not found",i);if(!A.ok||!r||"object"!=typeof r)throw new Ch("GITHUB_APP_REQUEST_FAILED",CB(r,A.status,[t,e.privateKey,e.privateKeyPkcs8]),i);if(String(r.app_id)!==e.appId)throw new Ch("APP_INSTALLATION_MISMATCH","The installation does not belong to the configured GitHub App",i);return r}async function CD(e,t){let A=await Cy(`${e.apiBaseUrl}/app`,{headers:CC(`Bearer ${t}`)},Co,e,"GITHUB_SETTINGS"),r=await CE(A),i=CQ(A);if(401===A.status)throw new Ch("GITHUB_APP_UNAUTHORIZED","GitHub rejected the App ID or private key",i);if(!A.ok||!r||"object"!=typeof r)throw new Ch("GITHUB_APP_REQUEST_FAILED",CB(r,A.status,[t,e.privateKey,e.privateKeyPkcs8]),i);if(String(r.id)!==e.appId||!r.slug||!r.owner?.login||!r.owner.type)throw new Ch("GITHUB_APP_REQUEST_FAILED","GitHub returned incomplete GitHub App registration details",i);return{details:r,githubRequestId:i}}async function Ck(e){let t=Cf(e),A=await CI(t),r=await CD(t,A);return{appSlug:r.details.slug,appOwnerLogin:r.details.owner.login,appOwnerType:r.details.owner.type,githubRequestId:r.githubRequestId}}async function CS(e,t,A){let r=A??await CI(e),i=await Cy(`${e.apiBaseUrl}/app/installations/${e.installationId}/access_tokens`,{method:"POST",headers:CC(`Bearer ${r}`)},Cs,e,t),n=await CE(i),a=CQ(i);if(401===i.status)throw new Ch("GITHUB_APP_UNAUTHORIZED","GitHub rejected the App ID or private key",a);if(404===i.status)throw new Ch("INSTALLATION_NOT_FOUND","The GitHub App installation was not found",a);if(!i.ok||!n||"object"!=typeof n)throw new Ch("GITHUB_APP_REQUEST_FAILED",CB(n,i.status,[r,e.privateKey,e.privateKeyPkcs8]),a);if("string"!=typeof n.token||!n.token||"string"!=typeof n.expires_at||Number.isNaN(Date.parse(n.expires_at)))throw new Ch("GITHUB_APP_REQUEST_FAILED","GitHub returned an invalid installation token response",a);if("write"!==(n.permissions?.actions??"none"))throw new Ch("ACTIONS_PERMISSION_REQUIRED","The GitHub App installation must grant Actions: read and write",a);return{token:n.token,expiresAt:new Date(n.expires_at),permissions:n.permissions??{},repositorySelection:n.repository_selection??"selected"}}async function Cv(e,t){let A=Cw(e),r=Cp.get(A);if(r&&r.expiresAt.getTime()-3e5>Date.now())return r;let i=Cg.get(A);if(i)return i;let n=CS(e,t).then(e=>(Cp.set(A,e),e)).finally(()=>Cg.delete(A));return Cg.set(A,n),n}function CR(){Cp.clear(),Cg.clear()}async function CM(e,t,A){let r=Cf(e),i=await Cv(r,A),n=await t(i.token);return 401===n.status&&(Cp.delete(Cw(r)),i=await Cv(r,A),n=await t(i.token)),{response:n,token:i.token}}async function CT(e,t,A,r){let{response:i,token:n}=await CM(e,i=>Cy(e.graphqlUrl,{method:"POST",headers:{...CC(`Bearer ${i}`),"content-type":"application/json"},body:JSON.stringify({query:t,variables:A})},null,e,r),r),a=await CE(i),s=CQ(i),o=w0(i.headers);if(401===i.status)throw new Ch("GITHUB_APP_UNAUTHORIZED","GitHub rejected the installation access token",s,i.status,o);if(!i.ok||a?.errors?.length||!a?.data){let t=a?.errors?.map(e=>e.message).filter(Boolean).join("; ")||CB(a,i.status,[n]);throw new Ch("GITHUB_APP_REQUEST_FAILED",CB({message:t},i.status,[n,e.privateKey]),s,i.status,o)}return{data:a.data,githubRequestId:s,statusCode:i.status,rateLimit:o}}async function CU(e){let t=Cf(e),A=await CI(t),[r,i]=await Promise.all([Cb(t,A),CD(t,A)]),n=await CS(t,"GITHUB_SETTINGS",A);Cp.set(Cw(t),n);let a=await CT(t,"query VerifyGitHubApp { viewer { login } }",{},"GITHUB_SETTINGS");return{appId:t.appId,installationId:t.installationId,keyFingerprint:t.keyFingerprint,appSlug:i.details.slug,appOwnerLogin:i.details.owner.login,appOwnerType:i.details.owner.type,accountLogin:r.account.login,repositorySelection:n.repositorySelection,actionsPermission:n.permissions.actions??"none",checksPermission:n.permissions.checks??"none",commitStatusesPermission:n.permissions.statuses??"none",webhookEvents:Array.isArray(r.events)?r.events:[],viewerLogin:a.data.viewer.login,verifiedAt:new Date,githubRequestId:a.githubRequestId}}async function Cx(e,t){let A=Cf(e),r=await CI(A),i=await Cy(`${A.apiBaseUrl}/app/hook/config`,{method:"PATCH",headers:{...CC(`Bearer ${r}`),"content-type":"application/json"},body:JSON.stringify({url:t.url,content_type:"json",secret:t.secret,insecure_ssl:"0"})},Cc,A,"GITHUB_SETTINGS"),n=CQ(i);if(404===i.status)return{configured:!1,githubRequestId:n};if(!i.ok)throw new Ch("GITHUB_APP_REQUEST_FAILED",CB(await CE(i),i.status,[r,t.secret,A.privateKey]),n);return{configured:!0,githubRequestId:n}}async function CN(e,t){let A=`${e.apiBaseUrl}/repos/${encodeURIComponent(t.owner)}/${encodeURIComponent(t.repository)}/actions/runs/${encodeURIComponent(t.workflowRunId)}/rerun`,{response:r,token:i}=await CM(e,r=>Cy(A,{method:"POST",headers:CC(`Bearer ${r}`)},Cn,e,t.requestSource),t.requestSource),n=CQ(r);if(401===r.status)throw new Ch("GITHUB_APP_UNAUTHORIZED","GitHub rejected the installation access token",n);if(!r.ok){let t=await CE(r);throw new Ch(404===r.status?"REPOSITORY_NOT_INSTALLED":"GITHUB_APP_REQUEST_FAILED",404===r.status?"The repository or workflow run is not available to this installation":CB(t,r.status,[i,e.privateKey]),n)}return{githubRequestId:n}}async function CF(e,t){let A=`${e.apiBaseUrl}/repos/${encodeURIComponent(t.owner)}/${encodeURIComponent(t.repository)}/actions/runs/${encodeURIComponent(t.workflowRunId)}/rerun-failed-jobs`,{response:r,token:i}=await CM(e,r=>Cy(A,{method:"POST",headers:CC(`Bearer ${r}`)},Ca,e,t.requestSource),t.requestSource),n=CQ(r);if(!r.ok){let t=await CE(r);throw new Ch(404===r.status?"REPOSITORY_NOT_INSTALLED":"GITHUB_APP_REQUEST_FAILED",404===r.status?"The repository or workflow run is not available to this installation":CB(t,r.status,[i,e.privateKey]),n)}return{githubRequestId:n}}async function CG(e,t){let A=t.force?"force-cancel":"cancel",r=t.force?w3:w4,i=`${e.apiBaseUrl}/repos/${encodeURIComponent(t.owner)}/${encodeURIComponent(t.repository)}/actions/runs/${encodeURIComponent(t.workflowRunId)}/${A}`,{response:n,token:a}=await CM(e,A=>Cy(i,{method:"POST",headers:CC(`Bearer ${A}`)},r,e,t.requestSource),t.requestSource),s=CQ(n);if(401===n.status)throw new Ch("GITHUB_APP_UNAUTHORIZED","GitHub rejected the installation access token",s);if(!n.ok){let t=await CE(n);throw new Ch(404===n.status?"REPOSITORY_NOT_INSTALLED":"GITHUB_APP_REQUEST_FAILED",404===n.status?"The repository or workflow run is not available to this installation":CB(t,n.status,[a,e.privateKey]),s)}return{githubRequestId:s}}async function CO(e,t){let A=[],r=1,i=0;do{let n=`${e.apiBaseUrl}/repos/${encodeURIComponent(t.owner)}/${encodeURIComponent(t.repository)}/actions/runs/${encodeURIComponent(t.workflowRunId)}/jobs?filter=latest&per_page=100&page=${r}`,{response:a,token:s}=await CM(e,A=>Cy(n,{headers:CC(`Bearer ${A}`)},w7,e,t.requestSource),t.requestSource),o=CQ(a);if(401===a.status)throw new Ch("GITHUB_APP_UNAUTHORIZED","GitHub rejected the installation access token",o);let l=await CE(a);if(!a.ok||!l||"object"!=typeof l)throw new Ch("GITHUB_APP_REQUEST_FAILED",CB(l,a.status,[s,e.privateKey]),o);if(!Number.isInteger(l.total_count)||!Array.isArray(l.jobs))throw new Ch("GITHUB_APP_REQUEST_FAILED","GitHub returned an invalid workflow jobs response",o);i=l.total_count??0,A.push(...l.jobs),r+=1}while(A.length<i)return A}async function CJ(e,t){let A=`${e.apiBaseUrl}/repos/${encodeURIComponent(t.owner)}/${encodeURIComponent(t.repository)}`,r=`${A}/actions/jobs/${encodeURIComponent(t.jobId)}`,i=await CM(e,A=>Cy(r,{headers:CC(`Bearer ${A}`)},w6,e,t.requestSource),t.requestSource),n=CQ(i.response);if(401===i.response.status)throw new Ch("GITHUB_APP_UNAUTHORIZED","GitHub rejected the installation access token",n);let a=await CE(i.response);if(!i.response.ok||!a||"object"!=typeof a)throw new Ch(404===i.response.status?"ACTIONS_JOB_NOT_FOUND":"GITHUB_APP_REQUEST_FAILED",404===i.response.status?"The GitHub Actions job is not available to this installation":CB(a,i.response.status,[i.token,e.privateKey]),n);if(String(a.run_id??"")!==t.workflowRunId)throw new Ch("ACTIONS_JOB_RUN_MISMATCH","The GitHub Actions job does not belong to the selected workflow run",n);if(a.status?.toLowerCase()!=="completed")throw new Ch("ACTIONS_JOB_NOT_COMPLETED","The GitHub Actions job must be completed before it can be retried",n);let s=await CM(e,A=>Cy(`${r}/rerun`,{method:"POST",headers:CC(`Bearer ${A}`)},Ci,e,t.requestSource),t.requestSource),o=CQ(s.response);if(401===s.response.status)throw new Ch("GITHUB_APP_UNAUTHORIZED","GitHub rejected the installation access token",o);if(!s.response.ok){let t=await CE(s.response);throw new Ch(404===s.response.status?"ACTIONS_JOB_NOT_FOUND":"GITHUB_APP_REQUEST_FAILED",404===s.response.status?"The GitHub Actions job is not available to this installation":CB(t,s.response.status,[s.token,e.privateKey]),o)}return{githubRequestId:o}}let C_=new Set(["FAILURE","ERROR","STARTUP_FAILURE","TIMED_OUT"]),CV=new Set(["ACTION_REQUIRED","EXPECTED","IN_PROGRESS","PENDING","QUEUED"]),CP=["COMPLETED","EXHAUSTED","STOPPED"],CL={WORKFLOW_RUN:4,PULL_REQUEST:3,WORKTREE_BRANCH:2,REPOSITORY:1},CH="server:github-auto-retry";function Cj(e){return e.toISOString()}function Cq(e){return{...e,scope:e.scope,mode:e.mode,failureStrategy:e.failureStrategy,status:e.status,executions:e.executions.map(e=>({...e,lastStatus:e.lastStatus,updatedAt:Cj(e.updatedAt)})),createdAt:Cj(e.createdAt),updatedAt:Cj(e.updatedAt)}}class CK{github;polling;timer;pollingTickRunning;rerunRequested;reconciling;constructor(e,t,A=!0){this.github=e,this.polling=t,this.timer=null,this.pollingTickRunning=!1,this.rerunRequested=!1,this.reconciling=!1,this.polling?.register({id:CH,kind:"GITHUB_AUTO_RETRY",runtime:"SERVER",enabled:!0,cadenceSeconds:60,details:{}}),A&&queueMicrotask(()=>void this.pollReconcile())}schedule(e){this.timer&&clearTimeout(this.timer);let t=1e3*Math.max(30,e);this.timer=setTimeout(()=>void this.pollReconcile(),t),this.timer.unref(),this.polling?.schedule(CH,new Date(Date.now()+t))}configurationChanged(){if(this.pollingTickRunning){this.rerunRequested=!0;return}this.timer&&clearTimeout(this.timer),this.timer=null,queueMicrotask(()=>void this.pollReconcile())}async pollReconcile(){if(this.pollingTickRunning)return;this.pollingTickRunning=!0;let e=60;try{let t=async()=>(e=(await (await aJ()).gitHubSettings.upsert({where:{id:"default"},create:{id:"default"},update:{}})).actionsNotificationPollIntervalSeconds,this.polling?.configure(CH,{cadenceSeconds:e}),this.reconcile());this.polling?await this.polling.run(CH,t,e=>({activeRules:e})):await t()}catch{}finally{this.pollingTickRunning=!1,this.rerunRequested?(this.rerunRequested=!1,queueMicrotask(()=>void this.pollReconcile())):this.schedule(e)}}include(){return{targets:{orderBy:{createdAt:"asc"}},executions:{orderBy:{updatedAt:"desc"}}}}async list(e){let t=await aJ(),A=e.codebaseRepositoryId?await this.github.autoRetryRepositoryId(e.codebaseRepositoryId):null;return(await t.gitHubAutoRetryRule.findMany({where:{...A?{codebaseRepositoryId:A}:{},...e.workflowRunId?{targets:{some:{workflowRunId:e.workflowRunId}}}:{}},include:this.include(),orderBy:{updatedAt:"desc"}})).map(Cq)}validate(e){if(!e.codebaseRepositoryId.trim())throw Error("Codebase repository is required");if("COUNT"===e.mode&&null==e.retryLimit)throw Error("Count mode requires a retry limit");if(null!=e.retryLimit&&(!Number.isInteger(e.retryLimit)||e.retryLimit<1||e.retryLimit>100))throw Error("Retry limit must be an integer from 1 to 100");if("FAILURE"===e.mode&&void 0===e.retryLimit)throw Error("Failure retry limit must be a number or null");if("WORKFLOW_RUN"===e.scope){if(!e.targets.length||e.targets.some(e=>!e.workflowRunId))throw Error("Current-run rules require workflow run targets")}else if(!e.allWorkflows&&!e.targets.length)throw Error("Select at least one workflow or choose all workflows");if("WORKTREE_BRANCH"===e.scope&&!e.worktreeId)throw Error("Worktree future rules require a worktree");if("PULL_REQUEST"===e.scope&&!e.pullRequestNumber)throw Error("Pull request future rules require a pull request number")}async save(e){if(!await this.github.autoRetryCredentialsReady())throw Error("A GitHub token and verified GitHub App with Actions write access are required");e={...e,codebaseRepositoryId:await this.github.autoRetryRepositoryId(e.codebaseRepositoryId)},this.validate(e);let t=await aJ(),A=e.branch?.trim()||null;if("WORKTREE_BRANCH"===e.scope&&e.worktreeId){let r=await t.worktree.findUnique({where:{id:e.worktreeId},select:{branch:!0}});if(!(A=r?.branch??null))throw Error("The worktree does not have a branch")}let r=await t.gitHubAutoRetryRule.findMany({where:{id:e.id?{not:e.id}:void 0,enabled:!0,scope:e.scope,codebaseRepositoryId:e.codebaseRepositoryId},include:{targets:!0}}),i=new Set(e.targets.map(e=>e.workflowRunId).filter(e=>!!e));if(r.find(t=>"WORKFLOW_RUN"===e.scope?t.targets.some(e=>e.workflowRunId&&i.has(e.workflowRunId)):"WORKTREE_BRANCH"===e.scope?t.branch===A:"PULL_REQUEST"!==e.scope||t.pullRequestNumber===e.pullRequestNumber))throw Error("An enabled Auto Retry rule already exists for this scope");let n=e.id??(0,AP.randomUUID)(),a=await t.$transaction(async t=>(await t.gitHubAutoRetryRule.upsert({where:{id:n},create:{id:n,scope:e.scope,codebaseRepositoryId:e.codebaseRepositoryId,repositoryGithubId:e.repositoryGithubId??null,worktreeId:e.worktreeId??null,branch:A,pullRequestNumber:e.pullRequestNumber??null,allWorkflows:e.allWorkflows,mode:e.mode,retryLimit:e.retryLimit??null,failureStrategy:e.failureStrategy,status:"ACTIVE",enabled:!0},update:{scope:e.scope,codebaseRepositoryId:e.codebaseRepositoryId,repositoryGithubId:e.repositoryGithubId??null,worktreeId:e.worktreeId??null,branch:A,pullRequestNumber:e.pullRequestNumber??null,allWorkflows:e.allWorkflows,mode:e.mode,retryLimit:e.retryLimit??null,failureStrategy:e.failureStrategy,status:"ACTIVE",enabled:!0,lastError:null,activatedAt:new Date}}),await t.gitHubAutoRetryTarget.deleteMany({where:{ruleId:n}}),e.targets.length&&await t.gitHubAutoRetryTarget.createMany({data:e.targets.map(e=>({id:(0,AP.randomUUID)(),ruleId:n,workflowId:e.workflowId?.trim()||null,workflowRunId:e.workflowRunId?.trim()||null,jobName:e.jobName?.trim()||null}))}),await t.gitHubAutoRetryExecution.deleteMany({where:{ruleId:n}}),t.gitHubAutoRetryRule.findUniqueOrThrow({where:{id:n},include:this.include()})));return queueMicrotask(()=>void this.reconcile().catch(()=>void 0)),Cq(a)}async setEnabled(e,t){let A=await aJ(),r=await A.$transaction(async A=>(t&&await A.gitHubAutoRetryExecution.updateMany({where:{ruleId:e,pendingFromAttempt:{not:null}},data:{pendingFromAttempt:null,observedAttempt:0,status:"WATCHING",lastError:null,finishedAt:null}}),A.gitHubAutoRetryRule.update({where:{id:e},data:{enabled:t,status:t?"ACTIVE":"PAUSED",lastError:null,...t?{activatedAt:new Date}:{}},include:this.include()})));return t&&queueMicrotask(()=>void this.reconcile().catch(()=>void 0)),Cq(r)}async delete(e){return(await (await aJ()).gitHubAutoRetryRule.deleteMany({where:{id:e}})).count>0}matches(e,t,A=!1){if("WORKFLOW_RUN"!==e.scope){let r=CV.has(t.status);if(!A&&!r&&Date.parse(t.createdAt)<e.activatedAt.getTime())return!1}return"WORKTREE_BRANCH"===e.scope?t.headBranch===e.branch:"PULL_REQUEST"!==e.scope||t.pullRequests.some(t=>t.number===e.pullRequestNumber)}async execution(e,t,A){return(await aJ()).gitHubAutoRetryExecution.upsert({where:{ruleId_workflowRunId_targetKey:{ruleId:e,workflowRunId:t.id,targetKey:A}},create:{id:(0,AP.randomUUID)(),ruleId:e,workflowRunId:t.id,workflowId:t.workflowId,targetKey:A},update:{}})}targetKeys(e,t){if(e.allWorkflows)return["workflow"];let A=e.targets.filter(e=>e.workflowRunId===t.id||e.workflowId===t.workflowId);return A.some(e=>!e.jobName)||"FAILURE"===e.mode&&"ALL_JOBS"===e.failureStrategy?["workflow"]:A.flatMap(e=>e.jobName?[`job:${e.jobName}`]:[])}async finishExecution(e,t,A){await (await aJ()).gitHubAutoRetryExecution.update({where:{id:e},data:{status:A,observedAttempt:t.runAttempt,lastStatus:t.status,pendingFromAttempt:null,finishedAt:new Date,lastError:null}})}async trigger(e,t,A,r,i){let n=await aJ();await n.gitHubAutoRetryExecution.update({where:{id:t.id},data:{status:"RETRYING",pendingFromAttempt:A.runAttempt,observedAttempt:A.runAttempt,lastStatus:A.status,lastError:null}});try{await this.github.autoRetryRerun(e.codebaseRepositoryId,A.id,r,i,{actor:"auto-retry",ipAddress:null,autoRetryRuleId:e.id,autoRetryExecutionId:t.id}),await n.gitHubAutoRetryExecution.update({where:{id:t.id},data:{automaticRetries:{increment:1},lastError:null}})}catch(r){let A=r instanceof Error?r.message:String(r);await n.gitHubAutoRetryExecution.update({where:{id:t.id},data:{lastError:A}}),await n.gitHubAutoRetryRule.update({where:{id:e.id},data:{lastError:A}})}}async reconcileExecution(e,t,A,r){var i;let n,a=await this.execution(e.id,t,A);if(null!=a.pendingFromAttempt)if(t.runAttempt>a.pendingFromAttempt)await (await aJ()).gitHubAutoRetryExecution.update({where:{id:a.id},data:{pendingFromAttempt:null,status:"WATCHING",lastError:null}});else{if(Date.now()-a.updatedAt.getTime()<12e4)return!1;let t=await aJ(),A="GitHub did not report a new attempt after the rerun request; automatic retries are paused to prevent a duplicate rerun";return await t.$transaction(async t=>{await t.gitHubAutoRetryExecution.update({where:{id:a.id},data:{status:"ERROR",lastError:A}}),await t.gitHubAutoRetryRule.update({where:{id:e.id},data:{enabled:!1,status:"PAUSED",lastError:A}})}),!1}if(a.observedAttempt===t.runAttempt&&null==a.pendingFromAttempt)return!1;let s=r?.status??t.status,o=(n=null!=(i={mode:e.mode,retryLimit:e.retryLimit,automaticRetries:a.automaticRetries,state:s}).retryLimit&&i.automaticRetries>=i.retryLimit,"COUNT"===i.mode?"SUCCESS"!==i.state?"STOP":n?"COMPLETE":"RETRY":"SUCCESS"===i.state?"COMPLETE":C_.has(i.state)?n?"EXHAUSTED":"RETRY":"STOP");return"COMPLETE"===o?(await this.finishExecution(a.id,t,"COMPLETED"),!1):"EXHAUSTED"===o?(await this.finishExecution(a.id,t,"EXHAUSTED"),!1):"STOP"===o?(await this.finishExecution(a.id,t,"STOPPED"),!1):("COUNT"===e.mode?await this.trigger(e,a,t,r?"JOB":"ALL_JOBS",r?.id??null):await this.trigger(e,a,t,r?"ALL_JOBS"===e.failureStrategy?"ALL_JOBS":"JOB":"ALL_JOBS"===e.failureStrategy?"ALL_JOBS":"FAILED_JOBS",r?.id??null),!0)}async reconcile(){if(this.reconciling)return 0;this.reconciling=!0;let e=0;try{let t=await aJ(),A=await t.gitHubAutoRetryRule.findMany({where:{enabled:!0,status:"ACTIVE"},include:{targets:!0},orderBy:{createdAt:"asc"}});e=A.length;let r=new Map,i=A.length?await t.gitHubAutoRetryExecution.findMany({where:{ruleId:{in:A.map(e=>e.id)},status:{notIn:CP}},select:{ruleId:!0,workflowRunId:!0}}):[],n=new Map;for(let e of i){let t=n.get(e.ruleId)??new Set;t.add(e.workflowRunId),n.set(e.ruleId,t)}let a=new Map;for(let e of A){let A=r.get(e.codebaseRepositoryId);if(!A)try{A=await this.github.autoRetryRuns(e.codebaseRepositoryId),r.set(e.codebaseRepositoryId,A)}catch(A){await t.gitHubAutoRetryRule.update({where:{id:e.id},data:{lastError:A instanceof Error?A.message:String(A)}});continue}let i=new Set(e.targets.map(e=>e.workflowRunId).filter(e=>!!e)),s=n.get(e.id)??new Set;for(let r of new Set([...i,...s]))if(!A.some(e=>e.id===r))try{A.push(await this.github.autoRetryRun(e.codebaseRepositoryId,r,!1))}catch(A){await t.gitHubAutoRetryRule.update({where:{id:e.id},data:{lastError:A instanceof Error?A.message:String(A)}})}for(let t of A){if("WORKFLOW_RUN"===e.scope&&!i.has(t.id)||!this.matches(e,t,s.has(t.id))||!e.allWorkflows&&!e.targets.some(e=>e.workflowRunId===t.id||e.workflowId===t.workflowId))continue;let A=a.get(t.id);(!A||CL[e.scope]>CL[A.rule.scope])&&a.set(t.id,{rule:e,run:t})}}for(let{rule:e,run:A}of a.values()){let r=this.targetKeys(e,A);if(CV.has(A.status)){await Promise.all(r.map(t=>this.execution(e.id,A,t)));continue}let i=A,n=e.allWorkflows?[{jobName:null}]:e.targets.filter(e=>e.workflowRunId===i.id||e.workflowId===i.workflowId);if(n.some(e=>!e.jobName)){await this.reconcileExecution(e,i,"workflow",null);continue}let a=await Promise.all(r.map(t=>this.execution(e.id,i,t)));if(!a.some(e=>e.observedAttempt!==i.runAttempt||null!=e.pendingFromAttempt&&i.runAttempt>e.pendingFromAttempt)){for(let t=0;t<a.length;t+=1)a[t]?.pendingFromAttempt!=null&&await this.reconcileExecution(e,i,r[t],null);continue}try{i=await this.github.autoRetryRun(e.codebaseRepositoryId,i.id)}catch(A){await t.gitHubAutoRetryRule.update({where:{id:e.id},data:{lastError:A instanceof Error?A.message:String(A)}});continue}if("FAILURE"===e.mode&&"ALL_JOBS"===e.failureStrategy){let t=i.jobs.filter(e=>n.some(t=>t.jobName===e.name)),A=t.find(e=>C_.has(e.status))??t.find(e=>"SUCCESS"!==e.status)??t[0];A?await this.reconcileExecution(e,i,"workflow",A):a[0]&&await this.finishExecution(a[0].id,i,"STOPPED");continue}let s=new Map(r.map((e,t)=>[e,a[t]]));for(let t of n){let A=i.jobs.find(e=>e.name===t.jobName);if(!A){let e=s.get(`job:${t.jobName}`);e&&await this.finishExecution(e.id,i,"STOPPED");continue}if(await this.reconcileExecution(e,i,`job:${A.name}`,A))break}}for(let e of A.filter(e=>"WORKFLOW_RUN"===e.scope)){let A=await t.gitHubAutoRetryExecution.findMany({where:{ruleId:e.id},select:{status:!0}});A.length>0&&A.every(e=>CP.includes(e.status))&&await t.gitHubAutoRetryRule.update({where:{id:e.id},data:{enabled:!1,status:A.some(e=>"EXHAUSTED"===e.status)?"EXHAUSTED":"COMPLETED"}})}}finally{this.reconciling=!1}return e}}let CY={LEGACY:0,GRAPHQL:1,REST:2,WEBHOOK:3,MUTATION:4},CW=new Set(["CANCELLED","FAILURE","STALE","STARTUP_FAILURE","TIMED_OUT"]),C$=new Set(["ACTION_REQUIRED","IN_PROGRESS","PENDING","QUEUED"]),CZ=new Set(["SUCCESS","NEUTRAL","SKIPPED"]);function Cz(e,t=null){return e.some(e=>"ERROR"===e)?"ERROR":e.some(e=>CW.has(e))?"FAILURE":e.some(e=>C$.has(e))?"PENDING":e.some(e=>"EXPECTED"===e)||"EXPECTED"===t?"EXPECTED":e.length>0&&e.every(e=>CZ.has(e))?"SUCCESS":0===e.length&&t?t:"NONE"}function CX(e,t){let A=(t||e||"NONE").toUpperCase();return C8(A)?A:"REQUESTED"===A||"WAITING"===A?"QUEUED":"NONE"}function C0(e){return C$.has(e)?1:2*("NONE"!==e&&"EXPECTED"!==e)}function C1(e,t,A){let r=e.runAttempt??0,i=t.runAttempt??0;if(i!==r)return i>r;let n=e.githubUpdatedAt?.getTime()??0,a=t.githubUpdatedAt?.getTime()??0;if(a!==n)return a>n;if("MUTATION"===e.source&&e.optimisticUntil&&e.optimisticUntil.getTime()>A.getTime())return"MUTATION"===t.source;let s="MUTATION"===e.source?CY.LEGACY:CY[e.source],o=CY[t.source];if("MUTATION"!==e.source&&"MUTATION"!==t.source&&e.status&&t.status){let A=C0(e.status),r=C0(t.status);if(r!==A)return r>A}return o===s||o>s}function C8(e){return"ACTION_REQUIRED"===e||"CANCELLED"===e||"ERROR"===e||"EXPECTED"===e||"FAILURE"===e||"IN_PROGRESS"===e||"NEUTRAL"===e||"PENDING"===e||"QUEUED"===e||"SKIPPED"===e||"STALE"===e||"STARTUP_FAILURE"===e||"SUCCESS"===e||"TIMED_OUT"===e||"NONE"===e}function C4(e){return"ERROR"===e||"EXPECTED"===e||"FAILURE"===e||"PENDING"===e||"SUCCESS"===e||"NONE"===e}function C2(e){try{let t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}function C3(e){return"NONE"===e||"EXPECTED"===e?0:"ACTION_REQUIRED"===e||"PENDING"===e||"QUEUED"===e?1:"IN_PROGRESS"===e?2:3}function C6(e){return"GRAPHQL"===e||"REST"===e||"WEBHOOK"===e||"MUTATION"===e?e:"LEGACY"}function C5(e){return{id:e.githubPipelineId,name:e.name,status:C8(e.status)?e.status:"NONE",url:e.url,checkSuiteId:e.checkSuiteId,canRetry:e.canRetry,retryUnavailableReason:e.retryUnavailableReason,jobs:C2(e.jobsJson),workflowRunId:e.workflowRunId,workflowId:e.workflowId,runNumber:e.runNumber,runAttempt:e.runAttempt}}function C9(e,t){return{...C5(t),repositoryGithubId:e.repositoryGithubId,headSha:e.headSha,revision:e.revision,isCurrent:t.isCurrent}}function C7(e){return{repositoryGithubId:e.repositoryGithubId,repositoryNameWithOwner:e.repositoryNameWithOwner,repositoryUrl:e.repositoryUrl,headSha:e.headSha,pipelineStatus:C4(e.pipelineStatus)?e.pipelineStatus:"NONE",pipelines:e.records.filter(e=>e.isCurrent).map(C5).sort((e,t)=>e.name.localeCompare(t.name)),revision:e.revision,updatedAt:e.updatedAt.toISOString()}}function ye(e){return JSON.stringify({identityKey:e.identityKey,githubPipelineId:e.githubPipelineId,name:e.name,status:e.status,url:e.url,checkSuiteId:e.checkSuiteId,workflowRunId:e.workflowRunId,workflowId:e.workflowId,runNumber:e.runNumber,runAttempt:e.runAttempt,canRetry:e.canRetry,retryUnavailableReason:e.retryUnavailableReason,jobsJson:e.jobsJson,isCurrent:e.isCurrent})}function yt(e){return JSON.stringify({repositoryNameWithOwner:e.repositoryNameWithOwner,repositoryUrl:e.repositoryUrl,pipelineStatus:e.pipelineStatus,records:e.records.map(ye).sort((e,t)=>e.localeCompare(t))})}class yA{lastPrunedAt=0;async snapshot(e){let t=await aJ(),A=await t.gitHubPipelineSnapshot.findUnique({where:{repositoryGithubId_headSha:{repositoryGithubId:e.repositoryGithubId.trim(),headSha:e.headSha.trim()}},include:{records:!0}});return A?C7(A):null}async snapshots(e){let t=e.map(e=>({repositoryGithubId:e.repositoryGithubId.trim(),headSha:e.headSha.trim()})).filter(e=>e.repositoryGithubId&&e.headSha);if(0===t.length)return[];let A=await aJ();return(await A.gitHubPipelineSnapshot.findMany({where:{OR:t},include:{records:!0}})).map(C7)}async records(e){let t=e.map(e=>({repositoryGithubId:e.repositoryGithubId.trim(),workflowRunId:e.workflowRunId.trim()})).filter(e=>e.repositoryGithubId&&e.workflowRunId);if(0===t.length)return[];let A=await aJ();return(await A.gitHubPipelineRecord.findMany({where:{OR:t.map(e=>({workflowRunId:e.workflowRunId,snapshot:{repositoryGithubId:e.repositoryGithubId}}))},include:{snapshot:{include:{records:!0}}}})).map(e=>C9(e.snapshot,e))}async observeWorkflowRuns(e,t="REST",A=!0){let r=new Map;for(let t of e){if(!t.repositoryGithubId||!t.headSha)continue;let e=`${t.repositoryGithubId}\u0000${t.headSha}`,A=r.get(e)??[];A.push(t),r.set(e,A)}let i=new Map;for(let e of r.values()){let r=e[0];await this.observeSnapshot({repositoryGithubId:r.repositoryGithubId,repositoryNameWithOwner:r.repositoryNameWithOwner,repositoryUrl:r.repositoryUrl,headSha:r.headSha,pipelines:e.map(e=>(function(e,t,A=!0){return{id:e.id,name:e.name,status:e.status,url:e.url,checkSuiteId:e.checkSuiteId,workflowRunId:e.id,workflowId:e.workflowId,runNumber:e.runNumber,runAttempt:e.runAttempt,canRetry:e.canRetry,retryUnavailableReason:e.retryUnavailableReason,source:t,githubUpdatedAt:new Date(e.updatedAt),sourceFetchedAt:new Date,isCurrent:A}})(e,t,A))})}for(let t of(await this.records(e.map(e=>({repositoryGithubId:e.repositoryGithubId,workflowRunId:e.id})))))t.workflowRunId&&i.set(t.workflowRunId,t);return i}async observeJobs(e,t,A,r="REST",i=null){let n=await aJ(),a=await n.gitHubPipelineRecord.findFirst({where:{workflowRunId:t,...e?{snapshot:{repositoryGithubId:e}}:{}},include:{snapshot:!0},orderBy:[{runAttempt:"desc"},{sourceFetchedAt:"desc"}]});if(!a)return null;let s=A.filter(e=>null==e.runAttempt||null==a.runAttempt||e.runAttempt===a.runAttempt);if(A.length>0&&0===s.length)return C9({...a.snapshot,records:[a]},a);let o=C2(a.jobsJson),l=new Map(o.map(e=>[e.id,e])),c=s.map(e=>(function(e,t){if(!e)return t;let A=e.runAttempt??0,r=t.runAttempt??0;if(r!==A)return r>A?t:e;let i=C3(e.status),n=C3(t.status);return n<i?e:n===i&&t.steps.length<e.steps.length?{...t,steps:e.steps}:t})(l.get(e.id),e)),u="WEBHOOK"===r?[...new Map([...o,...c].map(e=>[e.id,e])).values()]:c,d=C8(a.status)?a.status:"NONE",h="REST"===r&&s.length>0?Cz(s.map(e=>e.status),null):"NONE",p=("ERROR"===h||"FAILURE"===h||"SUCCESS"===h)&&a.snapshot.graphqlRollupStatus===h?h:d;return(await this.observeSnapshot({repositoryGithubId:a.snapshot.repositoryGithubId,repositoryNameWithOwner:a.snapshot.repositoryNameWithOwner,repositoryUrl:a.snapshot.repositoryUrl,headSha:a.snapshot.headSha,pipelines:[{...C5(a),status:p,source:r,jobs:u,githubUpdatedAt:i??a.githubUpdatedAt,isCurrent:a.isCurrent}]})).changedPipeline}async optimisticByCheckSuite(e,t,A){return this.optimisticRecord({repositoryGithubId:e,checkSuiteId:t,workflowRunId:null},A)}async optimisticByWorkflowRun(e,t,A){return this.optimisticRecord({repositoryGithubId:e,checkSuiteId:null,workflowRunId:t},A)}async optimisticJobByCheckSuite(e,t,A){let r=await aJ(),i=await r.gitHubPipelineRecord.findFirst({where:{checkSuiteId:t,snapshot:{repositoryGithubId:e}},orderBy:[{runAttempt:"desc"},{sourceFetchedAt:"desc"}]});if(!i)return null;let n=C2(i.jobsJson).map(e=>e.id===A?{...e,status:"QUEUED",canRetry:!1,retryUnavailableReason:"NOT_COMPLETED"}:e);return this.optimisticByCheckSuite(e,t,{status:"QUEUED",jobs:n})}async optimisticJobByWorkflowRun(e,t,A){let r=await aJ(),i=await r.gitHubPipelineRecord.findFirst({where:{workflowRunId:t,...e?{snapshot:{repositoryGithubId:e}}:{}},orderBy:[{runAttempt:"desc"},{sourceFetchedAt:"desc"}]});if(!i)return null;let n=C2(i.jobsJson).map(e=>e.id===A?{...e,status:"QUEUED",canRetry:!1,retryUnavailableReason:"NOT_COMPLETED"}:e);return this.optimisticByWorkflowRun(e,t,{status:"QUEUED",jobs:n})}async optimisticRecord(e,t){let A=await aJ(),r=await A.gitHubPipelineRecord.findFirst({where:{...e.repositoryGithubId?{snapshot:{repositoryGithubId:e.repositoryGithubId}}:{},...e.checkSuiteId?{checkSuiteId:e.checkSuiteId}:{workflowRunId:e.workflowRunId}},include:{snapshot:!0},orderBy:[{runAttempt:"desc"},{sourceFetchedAt:"desc"}]});if(!r)return null;let i=new Date;return(await this.observeSnapshot({repositoryGithubId:r.snapshot.repositoryGithubId,repositoryNameWithOwner:r.snapshot.repositoryNameWithOwner,repositoryUrl:r.snapshot.repositoryUrl,headSha:r.snapshot.headSha,pipelines:[{...C5(r),status:t.status,jobs:t.jobs,canRetry:!1,retryUnavailableReason:"NOT_COMPLETED",source:"MUTATION",githubUpdatedAt:r.githubUpdatedAt,sourceFetchedAt:i,optimisticUntil:new Date(i.getTime()+12e4),isCurrent:r.isCurrent}]})).changedPipeline}async observeSnapshot(e){let t=e.repositoryGithubId.trim(),A=e.headSha.trim();if(!t||!A)throw Error("GitHub repository ID and head SHA are required");let r=new Date,i=e.sourceFetchedAt??r,n=await aJ(),a=await n.$transaction(async n=>{let a=await n.gitHubPipelineSnapshot.upsert({where:{repositoryGithubId_headSha:{repositoryGithubId:t,headSha:A}},create:{id:(0,AP.randomUUID)(),repositoryGithubId:t,repositoryNameWithOwner:e.repositoryNameWithOwner,repositoryUrl:e.repositoryUrl,headSha:A,pipelineStatus:"NONE",graphqlRollupStatus:null,revision:0,lastGraphqlSyncAt:null,lastObservedAt:r},update:{lastObservedAt:r},include:{records:!0}}),s=yt(a),o=!!(e.completeGraphqlRollup&&(!a.lastGraphqlSyncAt||i.getTime()>=a.lastGraphqlSyncAt.getTime())),l=new Set,c=null;for(let t of e.pipelines){let e=function(e){var t;return(t={id:e.id,checkSuiteId:e.checkSuiteId,workflowRunId:e.workflowRunId,statusContext:e.statusContext}).checkSuiteId?`CHECK_SUITE:${t.checkSuiteId}`:t.workflowRunId?`WORKFLOW_RUN:${t.workflowRunId}`:t.statusContext?`STATUS_CONTEXT:${t.statusContext}`:`PIPELINE:${t.id}`}(t),A=(await n.gitHubPipelineRecord.findMany({where:{snapshotId:a.id}})).filter(A=>A.identityKey===e||t.checkSuiteId&&A.checkSuiteId===t.checkSuiteId||t.workflowRunId&&A.workflowRunId===t.workflowRunId),s=A[0]??null;for(let e of A.slice(1))s&&C1({runAttempt:s.runAttempt,githubUpdatedAt:s.githubUpdatedAt,source:C6(s.source),optimisticUntil:s.optimisticUntil,status:C8(s.status)?s.status:"NONE"},{runAttempt:e.runAttempt,githubUpdatedAt:e.githubUpdatedAt,source:C6(e.source),status:C8(e.status)?e.status:"NONE"},r)&&(s=e);for(let e of A)s&&e.id!==s.id&&(0===C2(s.jobsJson).length&&C2(e.jobsJson).length>0&&(s=await n.gitHubPipelineRecord.update({where:{id:s.id},data:{jobsJson:e.jobsJson}})),await n.gitHubPipelineRecord.delete({where:{id:e.id}}),c=s.id);let u=t.sourceFetchedAt??i,d=t.githubUpdatedAt??null,h=void 0===t.runAttempt?s?.runAttempt??null:t.runAttempt,p=void 0!==t.jobs?JSON.stringify(t.jobs):s&&(h??0)<=(s.runAttempt??0)?s.jobsJson:"[]",g=!!o||(!1===t.isCurrent?s?.isCurrent??!1:t.isCurrent??s?.isCurrent??!0);if(s){l.add(s.id);let A=ye(s),i=C1({runAttempt:s.runAttempt,githubUpdatedAt:s.githubUpdatedAt,source:C6(s.source),optimisticUntil:s.optimisticUntil,status:C8(s.status)?s.status:"NONE"},{runAttempt:h,githubUpdatedAt:d,source:t.source,status:t.status},r),a=!!(!i&&"MUTATION"===s.source&&s.optimisticUntil&&s.optimisticUntil.getTime()>r.getTime()&&"MUTATION"!==t.source);A!==ye(s=await n.gitHubPipelineRecord.update({where:{id:s.id},data:i?{identityKey:e,githubPipelineId:t.id,name:t.name,status:t.status,url:void 0===t.url?s.url:t.url,checkSuiteId:void 0===t.checkSuiteId?s.checkSuiteId:t.checkSuiteId,workflowRunId:void 0===t.workflowRunId?s.workflowRunId:t.workflowRunId,workflowId:void 0===t.workflowId?s.workflowId:t.workflowId,runNumber:void 0===t.runNumber?s.runNumber:t.runNumber,runAttempt:h,canRetry:void 0===t.canRetry?s.canRetry:t.canRetry,retryUnavailableReason:void 0===t.retryUnavailableReason?s.retryUnavailableReason:t.retryUnavailableReason,jobsJson:p,source:t.source,githubUpdatedAt:d,sourceFetchedAt:u,lastObservedAt:r,optimisticUntil:void 0===t.optimisticUntil?s.optimisticUntil:t.optimisticUntil,isCurrent:g}:{lastObservedAt:r,...void 0!==t.jobs&&!a?{jobsJson:p}:{},...o?{isCurrent:!0}:{}}}))&&(c=s.id)}else c=(s=await n.gitHubPipelineRecord.create({data:{id:(0,AP.randomUUID)(),snapshotId:a.id,identityKey:e,githubPipelineId:t.id,name:t.name,status:t.status,url:t.url??null,checkSuiteId:t.checkSuiteId??null,workflowRunId:t.workflowRunId??null,workflowId:t.workflowId??null,runNumber:t.runNumber??null,runAttempt:h,canRetry:t.canRetry??!1,retryUnavailableReason:t.retryUnavailableReason??null,jobsJson:p,source:t.source,githubUpdatedAt:d,sourceFetchedAt:u,lastObservedAt:r,optimisticUntil:t.optimisticUntil??null,isCurrent:g}})).id;l.add(s.id)}if(o)for(let e of(await n.gitHubPipelineRecord.findMany({where:{snapshotId:a.id,isCurrent:!0}})))!l.has(e.id)&&e.sourceFetchedAt.getTime()<=i.getTime()&&(!e.optimisticUntil||e.optimisticUntil.getTime()<=r.getTime())&&(await n.gitHubPipelineRecord.update({where:{id:e.id},data:{isCurrent:!1}}),c??=e.id);let u=await n.gitHubPipelineRecord.findMany({where:{snapshotId:a.id}}),d=o?e.graphqlRollupStatus??null:a.graphqlRollupStatus,h=Cz(u.filter(e=>e.isCurrent).map(e=>C8(e.status)?e.status:"NONE"),d&&C4(d)?d:null),p=s!==yt(a=await n.gitHubPipelineSnapshot.update({where:{id:a.id},data:{repositoryNameWithOwner:e.repositoryNameWithOwner,repositoryUrl:e.repositoryUrl,pipelineStatus:h,graphqlRollupStatus:d,lastGraphqlSyncAt:o?i:a.lastGraphqlSyncAt,lastObservedAt:r},include:{records:!0}}))||null!==c;p&&(a=await n.gitHubPipelineSnapshot.update({where:{id:a.id},data:{revision:{increment:1}},include:{records:!0}}));let g=a,m=c?g.records.find(e=>e.id===c)??null:null;return{changed:p,change:{snapshot:C7(g),changedPipeline:m?C9(g,m):null}}});return a.changed&&aq.publish(a1,{githubPipelineStatusChanged:a.change}),this.pruneIfNeeded().catch(()=>void 0),a.change}subscribe(){return aq.iterate(a1)}async pruneIfNeeded(){let e=Date.now();if(e-this.lastPrunedAt<864e5)return;this.lastPrunedAt=e;let t=await aJ();await t.gitHubPipelineSnapshot.deleteMany({where:{lastObservedAt:{lt:new Date(e-2592e6)}}})}}let yr=/^[_A-Za-z][_0-9A-Za-z]*$/,yi=new Map([["GitHubWorktreePullRequestStatuses",60]]),yn=[{window:"5m",milliseconds:3e5},{window:"10m",milliseconds:6e5},{window:"1h",milliseconds:36e5},{window:"24h",milliseconds:864e5}];function ya(e){return JSON.stringify(function e(t){return Array.isArray(t)?t.map(e):t&&"object"==typeof t?Object.fromEntries(Object.keys(t).sort().map(A=>[A,e(t[A])])):t}(e))}let ys=/(?:authorization|password|private.?key|secret|token)$/i;function yo(e,t=""){return ys.test(t)?"[REDACTED]":Array.isArray(e)?e.map(e=>yo(e)):e&&"object"==typeof e?Object.fromEntries(Object.entries(e).map(([e,t])=>[e,yo(t,e)])):e}function yl(e){try{return JSON.parse(e)}catch{return null}}function yc(e){return e&&"object"==typeof e?{statusCode:"number"==typeof e.statusCode?e.statusCode:null,rateLimit:e.rateLimit&&"object"==typeof e.rateLimit?e.rateLimit:null}:{statusCode:null,rateLimit:null}}class yu{recordCallLogs;inFlight;cacheWrites;cacheGeneration;lastPrunedAt;constructor(e="true"!==process.env.GITHUB_CACHE_LOGGING_DISABLED){this.recordCallLogs=e,this.inFlight=new Map,this.cacheWrites=new Set,this.cacheGeneration=0,this.lastPrunedAt=0}cacheKey(e){return(0,AP.createHash)("sha256").update(ya({authentication:e.authentication,endpoint:e.endpoint,query:e.normalizedQuery,variables:e.variables})).digest("hex")}inFlightKey(e,t,A){return[A,e,!0===t.force?"force":"normal",!1===t.allowStaleOnError?"strict":"stale"].join(":")}async defaultTtlSeconds(){let e=await aJ();return(await e.gitHubSettings.upsert({where:{id:"default"},create:{id:"default",cacheTtlSeconds:300},update:{}})).cacheTtlSeconds}async effectiveTtlSeconds(e){let t=await aJ(),[A,r]=await Promise.all([t.gitHubGraphqlCacheTtlOverride.findUnique({where:{operation:e}}),this.defaultTtlSeconds()]);return A?.ttlSeconds??r}async query(e){let t=this.cacheGeneration,A=await aJ(),r=this.cacheKey(e),i=this.inFlightKey(r,e,t),n=Date.now(),[a,s,o]=await Promise.all([A.gitHubGraphqlCacheEntry.findUnique({where:{cacheKey:r}}),this.effectiveTtlSeconds(e.operation),A.gitHubRateLimitSnapshot.findUnique({where:{authentication_resource:{authentication:e.authentication,resource:"graphql"}}})]);if(t!==this.cacheGeneration)return this.query(e);let l=null!==a&&Date.now()-a.fetchedAt.getTime()<1e3*s;if(!e.force&&l)return(await this.log({...this.graphqlContext(e),authentication:e.authentication,operation:e.operation,source:"CACHE",durationMs:Date.now()-n,pointCost:0,pointsAvoided:a.pointCost??0}).catch(()=>void 0),t!==this.cacheGeneration)?this.query(e):{data:yl(a.responseJson),source:"CACHE",stale:!1,fetchedAt:a.fetchedAt,entryId:a.id,pointCost:a.pointCost};let c=this.inFlight.get(i);if(c){let A=await c;return t!==this.cacheGeneration||(await this.log({...this.graphqlContext(e),authentication:e.authentication,operation:e.operation,source:"CACHE",durationMs:Date.now()-n,pointCost:0,pointsAvoided:A.pointCost??0}).catch(()=>void 0),t!==this.cacheGeneration)?this.query(e):{...A,source:"CACHE"}}if(o?.remaining===0&&o.resetAt.getTime()>Date.now()){let A=`GitHub GraphQL rate limit is exhausted until ${o.resetAt.toISOString()}`,r=null!==a&&!1!==e.allowStaleOnError;if(await this.log({...this.graphqlContext(e),authentication:e.authentication,operation:e.operation,source:"ERROR",durationMs:Date.now()-n,error:A,servedStale:r,pointCost:0,pointsAvoided:r?a.pointCost??0:0,rateLimit:{limit:o.limit,remaining:o.remaining,used:o.used,resetAt:o.resetAt,resource:o.resource}}).catch(()=>void 0),t!==this.cacheGeneration)return this.query(e);if(r)return{data:yl(a.responseJson),source:"ERROR",stale:!0,fetchedAt:a.fetchedAt,entryId:a.id,pointCost:a.pointCost};throw Error(A)}let u=(async()=>{try{let i=await e.fetcher(),a=new Date,s=null;if(t===this.cacheGeneration){let t=A.gitHubGraphqlCacheEntry.upsert({where:{cacheKey:r},create:{id:(0,AP.randomUUID)(),cacheKey:r,authentication:e.authentication,endpoint:e.endpoint,operation:e.operation,query:e.query,variablesJson:ya(e.variables),responseJson:JSON.stringify(i.data),fetchedAt:a,pointCost:i.pointCost},update:{operation:e.operation,query:e.query,variablesJson:ya(e.variables),responseJson:JSON.stringify(i.data),fetchedAt:a,pointCost:i.pointCost}});this.cacheWrites.add(t);try{s=await t}finally{this.cacheWrites.delete(t)}}return await this.log({...this.graphqlContext(e),authentication:e.authentication,operation:e.operation,source:"LIVE",durationMs:Date.now()-n,statusCode:i.statusCode,pointCost:i.pointCost,rateLimit:i.rateLimit}).catch(()=>void 0),{data:i.data,source:"LIVE",stale:!1,fetchedAt:a,entryId:t===this.cacheGeneration?s?.id??null:null,pointCost:i.pointCost}}catch(i){let A=yc(i),r=t===this.cacheGeneration&&null!==a&&!1!==e.allowStaleOnError;if(await this.log({...this.graphqlContext(e),authentication:e.authentication,operation:e.operation,source:"ERROR",durationMs:Date.now()-n,statusCode:A.statusCode,error:i instanceof Error?i.message:String(i),servedStale:r,pointsAvoided:r?a?.pointCost??0:0,rateLimit:A.rateLimit}).catch(()=>void 0),t!==this.cacheGeneration)throw i;if(r)return{data:yl(a.responseJson),source:"ERROR",stale:!0,fetchedAt:a.fetchedAt,entryId:a.id,pointCost:a.pointCost};throw i}})();this.inFlight.set(i,u);try{return await u}finally{this.inFlight.get(i)===u&&this.inFlight.delete(i)}}async mutation(e){let t,A=Date.now();try{t=await e.fetcher()}catch(r){let t=yc(r);throw await this.log({...this.graphqlContext(e),authentication:e.authentication,operation:e.operation,source:"ERROR",durationMs:Date.now()-A,statusCode:t.statusCode,error:r instanceof Error?r.message:String(r),rateLimit:t.rateLimit}).catch(()=>void 0),r}return await this.clear(),await this.log({...this.graphqlContext(e),authentication:e.authentication,operation:e.operation,source:"LIVE",durationMs:Date.now()-A,statusCode:t.statusCode,pointCost:null,rateLimit:t.rateLimit}).catch(()=>void 0),t.data}async updateTtl(e,t){if(!Number.isInteger(e)||e<1||e>1440)throw Error("Cache TTL must be an integer from 1 to 1440 minutes");let A=await aJ();return await A.gitHubSettings.upsert({where:{id:"default"},create:{id:"default",cacheTtlSeconds:60*e},update:{cacheTtlSeconds:60*e}}),t()}async ttlOverrides(){let e=await aJ();return(await e.gitHubGraphqlCacheTtlOverride.findMany({orderBy:{operation:"asc"}})).map(e=>({operation:e.operation,ttlSeconds:e.ttlSeconds,builtIn:yi.has(e.operation),createdAt:e.createdAt.toISOString(),updatedAt:e.updatedAt.toISOString()}))}async cacheableOperations(){let e=await aJ(),[t,A]=await Promise.all([e.gitHubGraphqlCacheTtlOverride.findMany({select:{operation:!0}}),e.gitHubGraphqlCacheEntry.findMany({distinct:["operation"],select:{operation:!0}})]);return[...new Set([...yi.keys(),...t.map(({operation:e})=>e),...A.map(({operation:e})=>e)])].sort((e,t)=>e.localeCompare(t))}async saveTtlOverride(e,t){let A=e.trim();if(!yr.test(A))throw Error("Operation must be a valid GraphQL operation name");if(!Number.isInteger(t)||t<1||t>86400)throw Error("Cache TTL must be an integer from 1 to 86400 seconds");let r=await aJ(),i=await r.gitHubGraphqlCacheTtlOverride.upsert({where:{operation:A},create:{operation:A,ttlSeconds:t},update:{ttlSeconds:t}});return{operation:i.operation,ttlSeconds:i.ttlSeconds,builtIn:yi.has(i.operation),createdAt:i.createdAt.toISOString(),updatedAt:i.updatedAt.toISOString()}}async deleteTtlOverride(e){let t=e.trim();if(yi.has(t))throw Error("Built-in cache TTL overrides cannot be deleted");let A=await aJ();return(await A.gitHubGraphqlCacheTtlOverride.deleteMany({where:{operation:t}})).count>0}async recordRestCall(e){let t=e.endpoint,A={};try{let r=new URL(e.endpoint);t=r.pathname,A={path:r.pathname,query:Object.fromEntries(r.searchParams)}}catch{A={endpoint:e.endpoint}}await this.log({authentication:e.authentication,apiType:"REST",method:e.method.toUpperCase(),endpoint:e.endpoint,operation:e.operation,requestSource:e.requestSource,requestSummary:`${e.method.toUpperCase()} ${t}`,variables:A,source:e.error?"ERROR":"LIVE",durationMs:e.durationMs,statusCode:e.statusCode,error:e.error,pointCost:1,rateLimit:e.rateLimit})}async recordGraphqlTransportCall(e){await this.log({...this.graphqlContext(e),authentication:e.authentication,operation:e.operation,requestSource:e.requestSource,source:e.error?"ERROR":"LIVE",durationMs:e.durationMs,statusCode:e.statusCode,error:e.error,rateLimit:e.rateLimit})}async clear(){let{cacheWrites:e}=this.beginInvalidation();await Promise.allSettled(e);let t=await aJ();return await t.gitHubGraphqlCacheEntry.deleteMany(),!0}async clearForCredentialChange(e){let{cacheWrites:t,inFlight:A}=this.beginInvalidation();await Promise.allSettled(t);let r=await aJ();return await r.gitHubGraphqlCacheEntry.deleteMany(),await Promise.allSettled(A),await r.gitHubRateLimitSnapshot.deleteMany({where:{authentication:e}}),!0}async clearCalls(){let e=await aJ();return await e.gitHubApiCallLog.deleteMany(),!0}async delete(e){let t=await aJ();return(await t.gitHubGraphqlCacheEntry.deleteMany({where:{id:e}})).count>0}async entries(e=50,t=0){let A=this.pagination(e,t),r=await aJ(),[i,n,a,s]=await Promise.all([r.gitHubGraphqlCacheEntry.findMany({take:A.limit,skip:A.offset,orderBy:{fetchedAt:"desc"}}),r.gitHubGraphqlCacheEntry.count(),this.defaultTtlSeconds(),r.gitHubGraphqlCacheTtlOverride.findMany({select:{operation:!0,ttlSeconds:!0}})]),o=new Map(s.map(({operation:e,ttlSeconds:t})=>[e,t]));return{...A,total:n,items:i.map(e=>this.entryView(e,o.get(e.operation)??a))}}async entry(e){let t=await aJ(),A=await t.gitHubGraphqlCacheEntry.findUnique({where:{id:e}});if(!A)return null;let r=await this.effectiveTtlSeconds(A.operation);return{...this.entryView(A,r),query:A.query,variables:yl(A.variablesJson),response:yl(A.responseJson)}}async calls(e=50,t=0,A={}){let r=this.pagination(e,t);await this.pruneLogs();let i=await aJ(),n={...A.apiType?{apiType:A.apiType}:{},...A.requestSource?{requestSource:A.requestSource}:{},...A.source?{source:A.source}:{}},[a,s]=await Promise.all([i.gitHubApiCallLog.findMany({where:n,take:r.limit,skip:r.offset,orderBy:{createdAt:"desc"}}),i.gitHubApiCallLog.count({where:n})]);return{...r,total:s,items:a.map(e=>({id:e.id,authentication:e.authentication,apiType:e.apiType,method:e.method,endpoint:e.endpoint,operation:e.operation,requestSource:e.requestSource,requestSummary:e.requestSummary,variables:yl(e.variablesJson),source:e.source,durationMs:e.durationMs,statusCode:e.statusCode,error:e.error,servedStale:e.servedStale,pointCost:e.pointCost,pointsAvoided:e.pointsAvoided,rateLimitLimit:e.rateLimitLimit,rateLimitRemaining:e.rateLimitRemaining,rateLimitUsed:e.rateLimitUsed,rateLimitResetAt:e.rateLimitResetAt?.toISOString()??null,rateLimitResource:e.rateLimitResource,createdAt:e.createdAt.toISOString()}))}}async metrics(){await this.pruneLogs();let e=await aJ(),t=Date.now(),A=await e.gitHubApiCallLog.findMany({where:{createdAt:{gte:new Date(t-yn.at(-1).milliseconds)}},orderBy:{createdAt:"asc"}}),r=yn.map(e=>this.metricWindow(e.window,A.filter(A=>A.createdAt.getTime()>=t-e.milliseconds)));return{windows:r,apiTypes:["GRAPHQL","REST"].map(e=>({apiType:e,windows:yn.map(r=>this.metricWindow(r.window,A.filter(A=>A.apiType===e&&A.createdAt.getTime()>=t-r.milliseconds)))})),operations:[...new Set(A.map(e=>e.operation))].sort().map(e=>({operation:e,windows:yn.map(r=>this.metricWindow(r.window,A.filter(A=>A.operation===e&&A.createdAt.getTime()>=t-r.milliseconds)))})),requestSources:[...new Set(A.map(e=>e.requestSource))].sort().map(e=>({requestSource:e,windows:yn.map(r=>this.metricWindow(r.window,A.filter(A=>A.requestSource===e&&A.createdAt.getTime()>=t-r.milliseconds)))}))}}entryView(e,t){return{id:e.id,authentication:e.authentication,operation:e.operation,endpoint:e.endpoint,fetchedAt:e.fetchedAt.toISOString(),pointCost:e.pointCost,stale:Date.now()-e.fetchedAt.getTime()>=1e3*t}}metricWindow(e,t){let A=t.length;return{window:e,total:A,live:t.filter(e=>"LIVE"===e.source).length,cache:t.filter(e=>"CACHE"===e.source).length,errors:t.filter(e=>"ERROR"===e.source).length,averageMs:0===A?0:Math.round(t.reduce((e,t)=>e+t.durationMs,0)/A),pointsUsed:t.reduce((e,t)=>e+Math.max(0,t.pointCost??0),0),pointsAvoided:t.reduce((e,t)=>e+Math.max(0,t.pointsAvoided),0)}}pagination(e,t){if(!Number.isInteger(e)||e<1||e>100)throw Error("limit must be an integer from 1 to 100");if(!Number.isInteger(t)||t<0)throw Error("offset must be a non-negative integer");return{limit:e,offset:t}}beginInvalidation(){let e=[...this.cacheWrites],t=[...new Set(this.inFlight.values())];return this.cacheGeneration+=1,this.inFlight.clear(),{cacheWrites:e,inFlight:t}}graphqlContext(e){let t=yo(e.variables);return{apiType:"GRAPHQL",method:"POST",endpoint:e.endpoint,requestSource:e.requestSource,requestSummary:function(e){if(!e||"object"!=typeof e||Array.isArray(e))return"No variables";let t=Object.entries(e);return t.length?t.map(([e,t])=>{let A=("string"==typeof t?t:JSON.stringify(t))??String(t);return`${e}=${A.length>120?`${A.slice(0,117)}…`:A}`}).join(" · "):"No variables"}(t),variables:t}}async log(e){if(!this.recordCallLogs)return;await this.pruneLogs();let t=await aJ();await t.gitHubApiCallLog.create({data:{id:(0,AP.randomUUID)(),authentication:e.authentication,apiType:e.apiType,method:e.method,endpoint:e.endpoint,operation:e.operation,requestSource:e.requestSource,requestSummary:e.requestSummary,variablesJson:ya(yo(e.variables)),source:e.source,durationMs:Math.max(0,Math.round(e.durationMs)),statusCode:e.statusCode??null,error:e.error?.slice(0,2e3)??null,servedStale:e.servedStale??!1,pointCost:e.pointCost??null,pointsAvoided:Math.max(0,e.pointsAvoided??0),rateLimitLimit:e.rateLimit?.limit??null,rateLimitRemaining:e.rateLimit?.remaining??null,rateLimitUsed:e.rateLimit?.used??null,rateLimitResetAt:e.rateLimit?.resetAt??null,rateLimitResource:e.rateLimit?.resource??null}})}async pruneLogs(){let e=Date.now();if(e-this.lastPrunedAt<36e5)return;this.lastPrunedAt=e;let t=await aJ();await t.gitHubApiCallLog.deleteMany({where:{createdAt:{lt:new Date(e-2592e6)}}})}}let yd=(process.env.GITHUB_API_BASE_URL||"https://api.github.com").replace(/\/+$/,""),yh=process.env.GITHUB_GRAPHQL_URL||`${yd}/graphql`,yp="_adeRateLimit";function yg(e){let t=(0,v.parse)(e),A=t.definitions.filter(e=>e.kind===es.Kind.OPERATION_DEFINITION);if(1!==A.length||!A[0])throw Error("GitHub GraphQL requests must contain one operation");let r=A[0],i=r.name?.value??("mutation"===r.operation?"AnonymousMutation":"AnonymousQuery"),n=(0,eB.print)(t);if("query"!==r.operation)return{kind:"mutation",operation:i,normalizedQuery:n,liveQuery:n};let a={...t,definitions:t.definitions.map(e=>e===r?{...r,selectionSet:{...r.selectionSet,selections:[...r.selectionSet.selections,{kind:es.Kind.FIELD,alias:{kind:es.Kind.NAME,value:yp},name:{kind:es.Kind.NAME,value:"rateLimit"},arguments:[],directives:[],selectionSet:{kind:es.Kind.SELECTION_SET,selections:[{kind:es.Kind.FIELD,name:{kind:es.Kind.NAME,value:"cost"},arguments:[],directives:[]}]}}]}}:e)};return{kind:"query",operation:i,normalizedQuery:n,liveQuery:(0,eB.print)(a)}}function ym(e){if(!e||"object"!=typeof e||Array.isArray(e))return{data:e,pointCost:null};let t=e[yp],A=t&&"object"==typeof t&&!Array.isArray(t)&&Number.isSafeInteger(t.cost)?t.cost:null;if(!(yp in e))return{data:e,pointCost:A};let r={...e};return delete r[yp],{data:r,pointCost:A}}let yf="default",yI="default",yw=String.raw`\b([A-Z][A-Z0-9_]*-\d+)\b`,yC=["workflow_run","workflow_job","check_run","check_suite","status"];function yy(e){return"read"===e||"write"===e}function yE(e){let t=[];for(let A of(e.webhookConfigured||t.push("configure the signed webhook URL"),yy(e.actionsPermission)||t.push("grant Actions read permission"),yy(e.checksPermission)||t.push("grant Checks read permission"),yy(e.commitStatusesPermission)||t.push("grant Commit statuses read permission"),yC))e.webhookEvents.includes(A)||t.push(`subscribe to the ${A} event`);return t}function yQ(e){return"auto-retry"===e.actor?"AUTO_RETRY":"workflow"===e.actor?"WORKFLOW_AUTOMATION":"ACTIONS_PAGE"}class yB extends Error{statusCode;rateLimit;constructor(e,t,A){super(e),this.statusCode=t,this.rateLimit=A,this.name="GitHubRequestError"}}let yb=`
|
|
12275
12275
|
__typename
|
|
12276
12276
|
... on CheckRun {
|
|
12277
12277
|
id
|
|
@@ -13218,7 +13218,7 @@ To resolve this, you can:
|
|
|
13218
13218
|
1. Use only one of the conflicting plugins
|
|
13219
13219
|
2. Configure the plugins to use different paths (if supported)
|
|
13220
13220
|
3. Ensure plugins use different HTTP methods for the same path
|
|
13221
|
-
`)}}(t={...t,secret:r,baseURL:u?t.baseURL:d?new URL(d).origin:"",basePath:t.basePath||"/api/auth",plugins:o.concat(l)},c);let I=t.advanced?.ipAddress?.trustedProxies;if(I&&I.length>0){let e=I.filter(e=>null===eAT(e));e.length>0&&c.warn(`Ignoring invalid \`advanced.ipAddress.trustedProxies\` entries: ${e.join(", ")}. Each entry must be an IP address or CIDR range.`)}let w=(0,er$.getCookies)(t),C=(0,erR.getAuthTables)(t),y=(await Promise.all(Object.entries(t.socialProviders||{}).map(async([e,t])=>{let A="function"==typeof t?await t():t;if(null==A||!1===A.enabled)return null;A.clientId||c.warn(`Social provider ${e} is missing clientId or clientSecret`);let r=eaN[e](A);return r.disableImplicitSignUp=A.disableImplicitSignUp,r}))).filter(e=>null!==e),E=({model:e,size:A})=>{if("function"==typeof t.advanced?.generateId)return t.advanced.generateId({model:e,size:A});let r=t?.advanced?.database?.generateId;return"function"==typeof r?r({model:e,size:A}):"uuid"===r?crypto.randomUUID():"serial"!==r&&!1!==r&&(0,eAL.generateId)(A)},{publish:Q}=await esO(t,{adapter:e.id,database:"function"==typeof t.database?"adapter":A(t.database)}),B=new Set(t.plugins.map(e=>e.id)),b=await eic(t),D=await eip(t),k={appName:t.appName||"Better Auth",baseURL:d||"",version:(0,esf.getBetterAuthVersion)(),socialProviders:y,options:t,oauthConfig:{storeStateStrategy:t.account?.storeStateStrategy||(s?"database":"cookie"),skipStateCookieCheck:!!t.account?.skipStateCookieCheck},tables:C,trustedOrigins:b,trustedProviders:D,isTrustedOrigin(e,t){return this.trustedOrigins.some(A=>erL(e,A,t))},sessionConfig:{updateAge:t.session?.updateAge!==void 0?t.session.updateAge:86400,expiresIn:t.session?.expiresIn||604800,freshAge:t.session?.freshAge===void 0?86400:t.session.freshAge,cookieRefreshCache:(n=t.session?.cookieCache?.refreshCache,a=t.session?.cookieCache?.maxAge||300,s&&n?(c.warn("[better-auth] `session.cookieCache.refreshCache` is enabled while `database` or `secondaryStorage` is configured. `refreshCache` is meant for stateless (DB-less) setups. Disabling `refreshCache` — remove it from your config to silence this warning."),!1):!1!==n&&void 0!==n&&(!0===n?{enabled:!0,updateAge:Math.floor(.2*a)}:{enabled:!0,updateAge:void 0!==n.updateAge?n.updateAge:Math.floor(.2*a)}))},secret:r,secretConfig:i,rateLimit:{...t.rateLimit,enabled:t.rateLimit?.enabled??eAB.isProduction,window:t.rateLimit?.window||10,max:t.rateLimit?.max||100,storage:t.rateLimit?.storage||(t.secondaryStorage?"secondary-storage":"memory")},authCookies:w,logger:c,generateId:E,session:null,secondaryStorage:t.secondaryStorage,password:{hash:t.emailAndPassword?.password?.hash||erK,verify:t.emailAndPassword?.password?.verify||erW,config:{minPasswordLength:t.emailAndPassword?.minPasswordLength||8,maxPasswordLength:t.emailAndPassword?.maxPasswordLength||128},checkPassword:eif},setNewSession(e){this.newSession=e},newSession:null,adapter:e,internalAdapter:er7(e,{options:t,logger:c,hooks:t.databaseHooks?[{source:"user",hooks:t.databaseHooks}]:[],generateId:E}),createAuthCookie:(0,er$.createCookieGetter)(t),async runMigrations(){throw new eAO.BetterAuthError("runMigrations will be set by the specific init implementation")},publishTelemetry:Q,skipCSRFCheck:!!t.advanced?.disableCSRFCheck,skipOriginCheck:t.advanced?.disableOriginCheck!==void 0?t.advanced.disableOriginCheck:!!(0,eAB.isTest)(),runInBackground:t.advanced?.backgroundTasks?.handler??(e=>{e.catch(()=>{})}),async runInBackgroundOrAwait(e){try{t.advanced?.backgroundTasks?.handler?e instanceof Promise&&t.advanced.backgroundTasks.handler(e.catch(e=>{c.error("Failed to run background task:",e)})):await e}catch(e){c.error("Failed to run background task:",e)}},getPlugin:e=>t.plugins.find(t=>t.id===e)??null,hasPlugin:e=>B.has(e)},S=eil(k);return(0,erj.isPromise)(S)&&await S,k}let es_=async e=>{let t=await erU(e),A=await esJ(t,e,e=>(0,erx.getKyselyDatabaseType)(e)||"unknown");return A.runMigrations=async function(){if(!e.database||"updateMany"in e.database)throw new eAO.BetterAuthError("Database is not provided or it's an adapter. Migrations are only supported with a database instance.");let{runMigrations:t}=await er_(e);await t()},A};var esV=e.i(779198),esP=e.i(595544);let esL=(0,eAq.createAccessControl)({user:["create","list","set-role","ban","impersonate","impersonate-admins","delete","set-password","set-email","get","update"],session:["list","revoke","delete"]}),esH={admin:esL.newRole({user:["create","list","set-role","ban","impersonate","delete","set-password","set-email","get","update"],session:["list","revoke","delete"]}),user:esL.newRole({user:[],session:[]})},esj=(0,eAy.defineErrorCodes)({FAILED_TO_CREATE_USER:"Failed to create user",USER_ALREADY_EXISTS:"User already exists.",USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL:"User already exists. Use another email.",YOU_CANNOT_BAN_YOURSELF:"You cannot ban yourself",YOU_ARE_NOT_ALLOWED_TO_CHANGE_USERS_ROLE:"You are not allowed to change users role",YOU_ARE_NOT_ALLOWED_TO_CREATE_USERS:"You are not allowed to create users",YOU_ARE_NOT_ALLOWED_TO_LIST_USERS:"You are not allowed to list users",YOU_ARE_NOT_ALLOWED_TO_LIST_USERS_SESSIONS:"You are not allowed to list users sessions",YOU_ARE_NOT_ALLOWED_TO_BAN_USERS:"You are not allowed to ban users",YOU_ARE_NOT_ALLOWED_TO_IMPERSONATE_USERS:"You are not allowed to impersonate users",YOU_ARE_NOT_ALLOWED_TO_REVOKE_USERS_SESSIONS:"You are not allowed to revoke users sessions",YOU_ARE_NOT_ALLOWED_TO_DELETE_USERS:"You are not allowed to delete users",YOU_ARE_NOT_ALLOWED_TO_SET_USERS_PASSWORD:"You are not allowed to set users password",BANNED_USER:"You have been banned from this application",YOU_ARE_NOT_ALLOWED_TO_GET_USER:"You are not allowed to get user",NO_DATA_TO_UPDATE:"No data to update",YOU_ARE_NOT_ALLOWED_TO_UPDATE_USERS:"You are not allowed to update users",YOU_CANNOT_REMOVE_YOURSELF:"You cannot remove yourself",YOU_ARE_NOT_ALLOWED_TO_SET_NON_EXISTENT_VALUE:"You are not allowed to set a non-existent role value",YOU_CANNOT_IMPERSONATE_ADMINS:"You cannot impersonate admins",INVALID_ROLE_TYPE:"Invalid role type",YOU_ARE_NOT_ALLOWED_TO_SET_USERS_EMAIL:"You are not allowed to update users email",PASSWORD_CANNOT_BE_UPDATED_VIA_UPDATE_USER:"Password cannot be updated through update-user. Use the set-user-password endpoint instead"}),esq=async e=>{let t=e.context.returned;return t?t instanceof Response?200!==t.status?null:await t.clone().json():(0,eiI.isAPIError)(t)?null:t:null},esK=e=>{if(e.userId&&e.options?.adminUserIds?.includes(e.userId))return!0;if(!e.permissions)return!1;let t=(e.role||e.options?.defaultRole||"user").split(","),A=e.options?.roles||esH;for(let r of t)if(A[r]?.authorize(e.permissions)?.success)return!0;return!1};var esY=e.i(752067);let esW=(0,eAQ.createAuthMiddleware)(async e=>{let t=await (0,eAJ.getAuthoritativeSessionFromCtx)(e);if(!t)throw eAO.APIError.fromStatus("UNAUTHORIZED");return{session:t}});function es$(e){return Array.isArray(e)?e.join(","):e}let esZ=by.object({userId:XD.coerce.string().meta({description:"The user id"}),role:by.union([by.string().meta({description:"The role to set. `admin` or `user` by default"}),by.array(by.string().meta({description:"The roles to set. `admin` or `user` by default"}))]).meta({description:"The role to set, this can be a string or an array of strings. Eg: `admin` or `[admin, user]`"})}),esz=by.object({id:by.string().meta({description:"The id of the User"})}),esX=by.object({email:by.string().meta({description:"The email of the user"}),password:by.string().optional().meta({description:"The password of the user. If not provided, the user will be created without a credential account (useful for magic link or social login only users)."}),name:by.string().meta({description:"The name of the user"}),role:by.union([by.string().meta({description:"The role of the user"}),by.array(by.string().meta({description:"The roles of user"}))]).optional().meta({description:'A string or array of strings representing the roles to apply to the new user. Eg: "user"'}),data:by.record(by.string(),by.any()).optional().meta({description:"Extra fields for the user. Including custom additional fields."})}),es0=by.object({userId:XD.coerce.string().meta({description:"The user id"}),data:by.record(by.any(),by.any()).meta({description:"The user data to update"})}),es1=by.object({searchValue:by.string().optional().meta({description:'The value to search for. Eg: "some name"'}),searchField:by.enum(["email","name"]).meta({description:'The field to search in, defaults to email. Can be `email` or `name`. Eg: "name"'}).optional(),searchOperator:by.enum(["contains","starts_with","ends_with"]).meta({description:'The operator to use for the search. Can be `contains`, `starts_with` or `ends_with`. Eg: "contains"'}).optional(),limit:by.string().meta({description:"The number of users to return"}).or(by.number()).optional(),offset:by.string().meta({description:"The offset to start from"}).or(by.number()).optional(),sortBy:by.string().meta({description:"The field to sort by"}).optional(),sortDirection:by.enum(["asc","desc"]).meta({description:"The direction to sort by"}).optional(),filterField:by.string().meta({description:"The field to filter by"}).optional(),filterValue:by.string().meta({description:"The value to filter by"}).or(by.number()).or(by.boolean()).or(by.array(by.string())).or(by.array(by.number())).optional(),filterOperator:by.enum(esY.whereOperators).meta({description:"The operator to use for the filter"}).optional()}),es8=by.object({userId:XD.coerce.string().meta({description:"The user id"})}),es4=by.object({userId:XD.coerce.string().meta({description:"The user id"})}),es2=by.object({userId:XD.coerce.string().meta({description:"The user id"}),banReason:by.string().meta({description:"The reason for the ban"}).optional(),banExpiresIn:by.number().meta({description:"The number of seconds until the ban expires"}).optional()}),es3=by.object({userId:XD.coerce.string().meta({description:"The user id"})}),es6=by.object({sessionToken:by.string().meta({description:"The session token"})}),es5=by.object({userId:XD.coerce.string().meta({description:"The user id"})}),es9=by.object({userId:XD.coerce.string().meta({description:"The user id"})}),es7=by.object({newPassword:by.string().nonempty("newPassword cannot be empty").meta({description:"The new password"}),userId:XD.coerce.string().nonempty("userId cannot be empty").meta({description:"The user id"})}),eoe=by.object({userId:XD.coerce.string().optional().meta({description:'The user id. Eg: "user-id"'}),role:by.string().optional().meta({description:'The role to check permission for. Eg: "admin"'})}).and(by.xor([by.object({permission:by.record(by.string(),by.array(by.string()))}),by.object({permissions:by.record(by.string(),by.array(by.string()))})])),eot={user:{fields:{role:{type:"string",required:!1,input:!1},banned:{type:"boolean",defaultValue:!1,required:!1,input:!1},banReason:{type:"string",required:!1,input:!1},banExpires:{type:"date",required:!1,input:!1}}},session:{fields:{impersonatedBy:{type:"string",required:!1,input:!1}}}};var eoA=e.i(259968),eor=e.i(976394);function eoi(e){try{return decodeURIComponent(e)}catch{return e}}let eon=(0,eAy.defineErrorCodes)({INVALID_OAUTH_CONFIGURATION:"Invalid OAuth configuration",TOKEN_URL_NOT_FOUND:"Invalid OAuth configuration. Token URL not found.",PROVIDER_CONFIG_NOT_FOUND:"No config found for provider",PROVIDER_ID_REQUIRED:"Provider ID is required",INVALID_OAUTH_CONFIG:"Invalid OAuth configuration.",SESSION_REQUIRED:"Session is required",ISSUER_MISMATCH:"OAuth issuer mismatch. The authorization server issuer does not match the expected value (RFC 9207).",ISSUER_MISSING:"OAuth issuer parameter missing. The authorization server did not include the required iss parameter (RFC 9207)."});function eoa(e){return null!=e&&""!==e}let eos=by.object({providerId:by.string().meta({description:"The provider ID for the OAuth provider"}),callbackURL:by.string().meta({description:"The URL to redirect to after sign in"}).optional(),errorCallbackURL:by.string().meta({description:"The URL to redirect to if an error occurs"}).optional(),newUserCallbackURL:by.string().meta({description:'The URL to redirect to after login if the user is new. Eg: "/welcome"'}).optional(),disableRedirect:by.boolean().meta({description:"Disable redirect"}).optional(),scopes:by.array(by.string()).meta({description:"Scopes to be passed to the provider authorization request."}).optional(),requestSignUp:by.boolean().meta({description:"Explicitly request sign-up. Useful when disableImplicitSignUp is true for this provider. Eg: false"}).optional(),additionalData:by.record(by.string(),by.any()).optional()}),eoo=by.object({code:by.string().meta({description:"The OAuth2 code"}).optional(),error:by.string().meta({description:"The error message, if any"}).optional(),error_description:by.string().meta({description:"The error description, if any"}).optional(),state:by.string().meta({description:"The state parameter from the OAuth2 request"}).optional(),iss:by.string().meta({description:"The issuer identifier"}).optional()}),eol=by.object({providerId:by.string(),callbackURL:by.string(),scopes:by.array(by.string()).meta({description:"Additional scopes to request when linking the account"}).optional(),errorCallbackURL:by.string().meta({description:"The URL to redirect to if there is an error during the link process"}).optional()});async function eoc(e,t){if(e.idToken){let t=eaw(e.idToken);if(t&&t.sub&&t.email)return{id:t.sub,emailVerified:t.email_verified,image:t.picture,...t}}if(!t)return null;let A=(await eae(t,{method:"GET",headers:{Authorization:`Bearer ${e.accessToken}`}})).data;if(!A)return null;let{id:r,...i}=A,n=eoa(r)?r:eoa(A.sub)?A.sub:void 0;return{...i,...void 0!==n?{id:n}:{},email:A?.email,emailVerified:A?.email_verified??!1,image:A?.picture,name:A?.name}}function eou(e){return null!=e&&""!==e}let eod=async e=>{let t=await eAG("SHA-256").digest(new TextEncoder().encode(e));return eAN.base64Url.encode(new Uint8Array(t),{padding:!1})},eoh=by.object({token:by.string().meta({description:'The token to verify. Eg: "some-token"'})});function eop(e,t){return e[t]?.trim()||void 0}function eog(e,t){let A=eop(e,t);if(!A)throw Error(`${t} is required for AUTH_MODE.`);return A}let eom="default";async function eof(){let e=await aJ();return await e.authSettings.findUnique({where:{id:eom}})??await e.authSettings.upsert({where:{id:eom},create:{id:eom},update:{}})}async function eoI({allowWhenRegistrationClosed:e=!1}={}){let t=await aJ(),A=await eof();if(A.bootstrapCompleted){if(!A.registrationEnabled&&!e)throw new eAO.APIError("FORBIDDEN",{message:"Account registration is disabled."});return}if(await t.user.count()>0){if(await t.authSettings.update({where:{id:eom},data:{bootstrapCompleted:!0,registrationEnabled:!1,bootstrapClaimId:null,bootstrapClaimedAt:null}}),e)return;throw new eAO.APIError("FORBIDDEN",{message:"Account registration is disabled."})}let r=new Date(Date.now()-18e4),i=(0,AP.randomUUID)();if(1!==(await t.authSettings.updateMany({where:{id:eom,bootstrapCompleted:!1,OR:[{bootstrapClaimedAt:null},{bootstrapClaimedAt:{lt:r}}]},data:{bootstrapClaimId:i,bootstrapClaimedAt:new Date}})).count)throw new eAO.APIError("CONFLICT",{message:"The initial account is already being created. Try again shortly."})}async function eow(){let e=await aJ();await e.authSettings.updateMany({where:{id:eom,bootstrapCompleted:!1},data:{bootstrapCompleted:!0,registrationEnabled:!1,bootstrapClaimId:null,bootstrapClaimedAt:null}})}let eoC={user:{create:{before:async(e,t)=>(await eoI({allowWhenRegistrationClosed:t?.path?.includes("/admin/create-user")??!1}),{data:{...e,role:"user",banned:!1,banReason:null,banExpires:null}}),after:async()=>{await eow()}},update:{before:async e=>({data:{...e,role:"user",banned:!1,banReason:null,banExpires:null}})},delete:{before:async()=>{throw new eAO.APIError("BAD_REQUEST",{message:"Accounts must be deleted through the management API."})}}}},eoy={user:["create","list","set-password","set-email","get","update"],session:["list","revoke","delete"]},eoE=(0,eAq.createAccessControl)(eoy),eoQ=eoE.newRole(eoy),eoB=null;function eob(){return eoB||(eoB=aJ().then(t=>(function(t,A=function(e=process.env){let t=function(e){let t=eop(e,"AUTH_MODE")??"password";if("password"!==t&&"oidc"!==t&&"both"!==t)throw Error('AUTH_MODE must be "password", "oidc", or "both".');return t}(e),A=L(e);return{secret:d7(e).authSecret,origins:A,baseURL:A.canonical,trustProxyHeaders:function(e){let t=eop(e,"TRUST_PROXY_HEADERS")?.toLowerCase();if(!t||"false"===t||"0"===t)return!1;if("true"===t||"1"===t)return!0;throw Error("TRUST_PROXY_HEADERS must be true, false, 1, or 0.")}(e),mode:t,provider:function(e,t){if("password"===t)return null;let A=eop(e,"AUTH_OAUTH_DISCOVERY_URL"),r=eop(e,"AUTH_OAUTH_AUTHORIZATION_URL"),i=eop(e,"AUTH_OAUTH_TOKEN_URL"),n=eop(e,"AUTH_OAUTH_USER_INFO_URL"),a=eop(e,"AUTH_OAUTH_ISSUER"),s=!!(r||i||n),o=r&&i&&n;if(A&&s)throw Error("OIDC configuration must use either discovery or explicit endpoints, not both.");if(!A&&!o)throw Error("OIDC authentication requires AUTH_OAUTH_DISCOVERY_URL or all of AUTH_OAUTH_AUTHORIZATION_URL, AUTH_OAUTH_TOKEN_URL, and AUTH_OAUTH_USER_INFO_URL.");if(s&&!o)throw Error("Explicit OAuth configuration must include authorization, token, and user-info URLs.");if(o&&!a)throw Error("AUTH_OAUTH_ISSUER is required with explicit OAuth endpoints.");let l=eog(e,"AUTH_OAUTH_SCOPES").split(",").map(e=>e.trim()).filter(Boolean);if(0===l.length)throw Error("AUTH_OAUTH_SCOPES must contain at least one scope.");return{providerId:eog(e,"AUTH_OAUTH_PROVIDER_ID"),displayName:eog(e,"AUTH_OAUTH_PROVIDER_NAME"),clientId:eog(e,"AUTH_OAUTH_CLIENT_ID"),clientSecret:eog(e,"AUTH_OAUTH_CLIENT_SECRET"),scopes:l,requireIssuerValidation:function(e){let t=eop(e,"AUTH_OAUTH_REQUIRE_ISSUER_VALIDATION")?.toLowerCase();if(!t||"false"===t||"0"===t)return!1;if("true"===t||"1"===t)return!0;throw Error("AUTH_OAUTH_REQUIRE_ISSUER_VALIDATION must be true, false, 1, or 0.")}(e),discoveryUrl:A,issuer:a,authorizationUrl:r,tokenUrl:i,userInfoUrl:n}}(e,t)}}()){var r,i,n;let a,s,o,l,c,u,d=("oidc"===(r=A.mode)||"both"===r)&&A.provider?(e=>{let t=new Set,A=new Set;for(let r of e.config){let e=r.providerId;t.has(e)&&A.add(e),t.add(e)}return A.size>0&&console.warn(`Duplicate provider IDs found: ${Array.from(A).join(", ")}`),{id:"generic-oauth",version:esP.PACKAGE_VERSION,init:t=>({context:{socialProviders:e.config.map(e=>{let A=e.userInfoUrl;return{id:e.providerId,name:e.providerId,async createAuthorizationURL(r){let i=e.authorizationUrl;if(!i&&e.discoveryUrl){let t=await eae(e.discoveryUrl,{method:"GET",headers:e.discoveryHeaders});t.data&&(i=t.data.authorization_endpoint,A=A??t.data.userinfo_endpoint)}if(!i)throw eAO.APIError.from("BAD_REQUEST",eon.INVALID_OAUTH_CONFIGURATION);return enP({id:e.providerId,options:{clientId:e.clientId,clientSecret:e.clientSecret,redirectURI:e.redirectURI},authorizationEndpoint:i,state:r.state,codeVerifier:e.pkce?r.codeVerifier:void 0,scopes:e.scopes||[],redirectURI:`${t.baseURL}/oauth2/callback/${e.providerId}`})},async validateAuthorizationCode(t){if(e.getToken)return enJ(await e.getToken(t),e.accessTokenExpiresIn);let r=e.tokenUrl;if(e.discoveryUrl){let t=await eae(e.discoveryUrl,{method:"GET",headers:e.discoveryHeaders});t.data&&(r=t.data.token_endpoint,A=t.data.userinfo_endpoint)}if(!r)throw eAO.APIError.from("BAD_REQUEST",eon.TOKEN_URL_NOT_FOUND);return enJ(await eam({headers:e.authorizationHeaders,code:t.code,codeVerifier:t.codeVerifier,redirectURI:t.redirectURI,options:{clientId:e.clientId,clientSecret:e.clientSecret,redirectURI:e.redirectURI},tokenEndpoint:r,authentication:e.authentication}),e.accessTokenExpiresIn)},async refreshAccessToken(t){let A=e.tokenUrl;if(e.discoveryUrl){let t=await eae(e.discoveryUrl,{method:"GET",headers:e.discoveryHeaders});t.data&&(A=t.data.token_endpoint)}if(!A)throw eAO.APIError.from("BAD_REQUEST",eon.TOKEN_URL_NOT_FOUND);return enJ(await eai({refreshToken:t,options:{clientId:e.clientId,clientSecret:e.clientSecret},authentication:e.authentication,tokenEndpoint:A}),e.accessTokenExpiresIn)},async getUserInfo(t){let r=e.getUserInfo?await e.getUserInfo(t):await eoc(t,A);if(!r)return null;let i=await e.mapProfileToUser?.(r),n=eou(i?.id)?i.id:eou(r.id)?r.id:eou(r.sub)?r.sub:void 0;return void 0===n?null:{user:{email:r?.email,emailVerified:r?.emailVerified,image:r?.image,name:r?.name,...i,id:String(n)},data:r}},options:{overrideUserInfoOnSignIn:e.overrideUserInfo}}}).concat(t.socialProviders)}}),endpoints:{signInWithOAuth2:(0,eAQ.createAuthEndpoint)("/sign-in/oauth2",{method:"POST",body:eos,metadata:{openapi:{description:"Sign in with OAuth2",responses:{200:{description:"Sign in with OAuth2",content:{"application/json":{schema:{type:"object",properties:{url:{type:"string"},redirect:{type:"boolean"}}}}}}}}}},async t=>{let{providerId:A}=t.body,r=e.config.find(e=>e.providerId===A);if(!r)throw eAO.APIError.fromStatus("BAD_REQUEST",{message:`${eon.PROVIDER_CONFIG_NOT_FOUND} ${A}`});let{discoveryUrl:i,authorizationUrl:n,tokenUrl:a,clientId:s,clientSecret:o,scopes:l,redirectURI:c,responseType:u,pkce:d,prompt:h,accessType:p,authorizationUrlParams:g,responseMode:m}=r,f=n,I=a;if(i){let e=await eae(i,{method:"GET",headers:r.discoveryHeaders,onError(e){t.context.logger.error(e.error.message,e.error,{discoveryUrl:i})}});e.data&&(f=e.data.authorization_endpoint,I=e.data.token_endpoint)}if(!f||!I)throw eAO.APIError.from("BAD_REQUEST",eon.INVALID_OAUTH_CONFIGURATION);if(g){let e=new URL(f);for(let[t,A]of Object.entries(g))e.searchParams.set(t,A);f=e.toString()}let w="function"==typeof g?g(t):g,{state:C,codeVerifier:y}=await enF(t,void 0,t.body.additionalData),E=await enP({id:A,options:{clientId:s,clientSecret:o,redirectURI:c},authorizationEndpoint:f,state:C,codeVerifier:d?y:void 0,scopes:t.body.scopes?[...t.body.scopes,...l||[]]:l||[],redirectURI:`${t.context.baseURL}/oauth2/callback/${A}`,prompt:h,accessType:p,responseType:u,responseMode:m,additionalParams:w});return t.json({url:E.toString(),redirect:!t.body.disableRedirect})}),oAuth2Callback:(0,eAQ.createAuthEndpoint)("/oauth2/callback/:providerId",{method:"GET",query:eoo,metadata:{...eaK,allowedMediaTypes:["application/x-www-form-urlencoded","application/json"],openapi:{description:"OAuth2 callback",responses:{200:{description:"OAuth2 callback",content:{"application/json":{schema:{type:"object",properties:{url:{type:"string"}}}}}}}}}},async t=>{let A,r,i,n=t.context.options.onAPIError?.errorURL||`${t.context.baseURL}/error`;(t.query.error||!t.query.code)&&eiL(t,n,t.query.error||"oAuth_code_missing",t.query.error_description||void 0);let a=t.params?.providerId;if(!a)throw eAO.APIError.from("BAD_REQUEST",eon.PROVIDER_ID_REQUIRED);let s=e.config.find(e=>e.providerId===a);if(!s)throw eAO.APIError.fromStatus("BAD_REQUEST",{message:`${eon.PROVIDER_CONFIG_NOT_FOUND} ${a}`});let{callbackURL:o,codeVerifier:l,errorURL:c,requestSignUp:u,newUserURL:d,link:h}=await enG(t),p=t.query.code,g=c||n,m=s.tokenUrl,f=s.userInfoUrl,I=s.issuer;if(s.discoveryUrl){let e=await eae(s.discoveryUrl,{method:"GET",headers:s.discoveryHeaders});e.data&&(m=e.data.token_endpoint,f=e.data.userinfo_endpoint,!I&&e.data.issuer&&(I=e.data.issuer))}I&&(t.query.iss?t.query.iss!==I&&(t.context.logger.error("OAuth issuer mismatch",{expected:I,received:t.query.iss}),eiL(t,g,"issuer_mismatch")):s.requireIssuerValidation&&(t.context.logger.error("OAuth issuer parameter missing",{expected:I}),eiL(t,g,"issuer_missing")));try{if(s.getToken)i=await s.getToken({code:p,redirectURI:`${t.context.baseURL}/oauth2/callback/${s.providerId}`,codeVerifier:s.pkce?l:void 0});else{if(!m)throw eAO.APIError.from("BAD_REQUEST",eon.INVALID_OAUTH_CONFIG);let e="function"==typeof s.tokenUrlParams?s.tokenUrlParams(t):s.tokenUrlParams;i=await eam({headers:s.authorizationHeaders,code:p,codeVerifier:s.pkce?l:void 0,redirectURI:`${t.context.baseURL}/oauth2/callback/${s.providerId}`,options:{clientId:s.clientId,clientSecret:s.clientSecret,redirectURI:s.redirectURI},tokenEndpoint:m,authentication:s.authentication,additionalParams:e})}i=enJ(i,s.accessTokenExpiresIn)}catch(e){t.context.logger.error(e&&"object"==typeof e&&"name"in e?e.name:"",e),eiL(t,g,"oauth_code_verification_failed")}if(!i)throw eAO.APIError.from("BAD_REQUEST",eon.INVALID_OAUTH_CONFIG);let w=await async function(){let e=s.getUserInfo?await s.getUserInfo(i):await eoc(i,f);e||eiL(t,g,"user_info_is_missing");let A=s.mapProfileToUser?await s.mapProfileToUser(e):e,r=A.email?A.email.toLowerCase():e.email?.toLowerCase();r||(t.context.logger.error(eiH(s.providerId,{source:"generic"}),e),eiL(t,g,"email_is_missing"));let n=eoa(A.id)?A.id:eoa(e.id)?e.id:eoa(e.sub)?e.sub:void 0,a=void 0!==n?String(n):"";a||(t.context.logger.error("Provider did not return an account id (e.g. `sub`). Unable to sign in.",e),eiL(t,g,"id_is_missing"));let o=A.name?A.name:e.name;return o||(t.context.logger.error("Unable to get user info",e),eiL(t,g,"name_is_missing")),{...e,...A,email:r,id:a,name:o}}();if(h){let e;t.context.options.account?.accountLinking?.allowDifferentEmails!==!0&&h.email.toLowerCase()!==w.email.toLowerCase()&&eiL(t,g,"email_doesn't_match");let A=await t.context.internalAdapter.findAccountByProviderId(String(w.id),s.providerId);if(A){A.userId!==h.userId&&eiL(t,g,"account_already_linked_to_different_user");let e=Object.fromEntries(Object.entries({accessToken:await eny(i.accessToken,t.context),idToken:i.idToken,refreshToken:await eny(i.refreshToken,t.context),accessTokenExpiresAt:i.accessTokenExpiresAt,refreshTokenExpiresAt:i.refreshTokenExpiresAt,scope:i.scopes?.join(",")}).filter(([e,t])=>void 0!==t));await t.context.internalAdapter.updateAccount(A.id,e)}else await t.context.internalAdapter.createAccount({userId:h.userId,providerId:s.providerId,accountId:w.id,accessToken:await eny(i.accessToken,t.context),accessTokenExpiresAt:i.accessTokenExpiresAt,refreshTokenExpiresAt:i.refreshTokenExpiresAt,scope:i.scopes?.join(","),refreshToken:await eny(i.refreshToken,t.context),idToken:i.idToken})||eiL(t,g,"unable_to_link_account");await enR(t,h.userId,w);try{e=o.toString()}catch{e=o}throw t.redirect(e)}try{A=await env(t,{userInfo:w,account:{providerId:s.providerId,accountId:w.id,...i,scope:i.scopes?.join(",")},callbackURL:o,disableSignUp:s.disableImplicitSignUp&&!u||s.disableSignUp,overrideUserInfo:s.overrideUserInfo})}catch(e){throw(0,eiI.isAPIError)(e)&&e.body?.code&&eiL(t,g,e.body.code,e.body.message),e}A.error&&eiL(t,g,A.error.split(" ").join("_"));let{session:C,user:y}=A.data;await (0,er$.setSessionCookie)(t,{session:C,user:y});try{r=(A.isRegister&&d||o).toString()}catch{r=A.isRegister&&d||o}throw t.redirect(r)}),oAuth2LinkAccount:(0,eAQ.createAuthEndpoint)("/oauth2/link",{method:"POST",body:eol,use:[eAJ.sessionMiddleware],metadata:{openapi:{description:"Link an OAuth2 account to the current user session",responses:{200:{description:"Authorization URL generated successfully for linking an OAuth2 account",content:{"application/json":{schema:{type:"object",properties:{url:{type:"string",format:"uri",description:"The authorization URL to redirect the user to for linking the OAuth2 account"},redirect:{type:"boolean",description:"Indicates that the client should redirect to the provided URL",enum:[!0]}},required:["url","redirect"]}}}}}}}},async t=>{let A=t.context.session;if(!A)throw eAO.APIError.from("UNAUTHORIZED",eon.SESSION_REQUIRED);let r=e.config.find(e=>e.providerId===t.body.providerId);if(!r)throw eAO.APIError.from("NOT_FOUND",eig.BASE_ERROR_CODES.PROVIDER_NOT_FOUND);let{providerId:i,clientId:n,clientSecret:a,redirectURI:s,authorizationUrl:o,discoveryUrl:l,pkce:c,scopes:u,prompt:d,accessType:h,authorizationUrlParams:p}=r,g=o;if(!g){if(!l)throw eAO.APIError.from("BAD_REQUEST",eon.INVALID_OAUTH_CONFIGURATION);let e=await eae(l,{method:"GET",headers:r.discoveryHeaders,onError(e){t.context.logger.error(e.error.message,e.error,{discoveryUrl:l})}});e.data&&(g=e.data.authorization_endpoint)}if(!g)throw eAO.APIError.from("BAD_REQUEST",eon.INVALID_OAUTH_CONFIGURATION);let m=await enF(t,{userId:A.user.id,email:A.user.email},void 0),f="function"==typeof p?p(t):p,I=await enP({id:i,options:{clientId:n,clientSecret:a,redirectURI:s||`${t.context.baseURL}/oauth2/callback/${i}`},authorizationEndpoint:g,state:m.state,codeVerifier:c?m.codeVerifier:void 0,scopes:t.body.scopes||u||[],redirectURI:s||`${t.context.baseURL}/oauth2/callback/${i}`,prompt:d,accessType:h,additionalParams:f});return t.json({url:I.toString(),redirect:!0})})},options:e,$ERROR_CODES:eon}})({config:[{providerId:A.provider.providerId,clientId:A.provider.clientId,clientSecret:A.provider.clientSecret,scopes:A.provider.scopes,discoveryUrl:A.provider.discoveryUrl,issuer:A.provider.issuer,authorizationUrl:A.provider.authorizationUrl,tokenUrl:A.provider.tokenUrl,userInfoUrl:A.provider.userInfoUrl,pkce:!0,requireIssuerValidation:A.provider.requireIssuerValidation,disableImplicitSignUp:!1}]}):null;return((e,t)=>{let A=t(e),{api:r}=esm(A,e);return{handler:async t=>{let r,i=await A,n=i.options.basePath||"/api/auth";if((0,erV.isDynamicBaseURLConfig)(e.baseURL))r=await eid(i,t,eiu(i.options));else{r=Object.create(Object.getPrototypeOf(i),Object.getOwnPropertyDescriptors(i));let e=i.options;if(!i.options.baseURL){let A=(0,erV.getBaseURL)(void 0,n,t,void 0,i.options.advanced?.trustedProxyHeaders);if(!A)throw new eAO.BetterAuthError("Could not get base URL from request. Please provide a valid base URL.");r.baseURL=A,r.options={...i.options,baseURL:(0,erV.getOrigin)(A)||void 0},e=r.options}r.trustedOrigins=await eic(e,t),r.trustedProviders=await eip(e,t)}let{handler:a}=((e,t)=>{let{api:A,middlewares:r}=esm(e,t),i=new URL(e.baseURL).pathname;return(0,esg.createRouter)(A,{routerContext:e,openapi:{disabled:!0},basePath:i,routerMiddleware:[{path:"/**",middleware:eiQ},...r],allowedMediaTypes:["application/json"],skipTrailingSlashes:t.advanced?.skipTrailingSlashes??!1,async onRequest(t){let A=e.options.disabledPaths||[],r=eiw(t.url,i);if(A.includes(r))return new Response("Not Found",{status:404});let n=t,a=await eiN(n,e);if(a)return a;for(let t of e.options.plugins||[])if(t.onRequest){let A=await (0,er5.withSpan)(`onRequest ${t.id}`,{[er3]:"onRequest",[er6]:`plugin:${t.id}`},()=>t.onRequest(n,e));if(A&&"response"in A)return A.response;A&&"request"in A&&(n=A.request)}return n},async onResponse(t,A){for(let A of e.options.plugins||[])if(A.onResponse){let r=await (0,er5.withSpan)(`onResponse ${A.id}`,{[er3]:"onResponse",[er6]:`plugin:${A.id}`,[er4.ATTR_HTTP_RESPONSE_STATUS_CODE]:t.status},()=>A.onResponse(t,e));if(r)return r.response}return t},onError(A){if((0,eiI.isAPIError)(A)&&"FOUND"===A.status)return;if(t.onAPIError?.throw)throw A;if(t.onAPIError?.onError)return void t.onAPIError.onError(A,e);let r=t.logger?.level,i="error"===r||"warn"===r||"debug"===r?erM.logger:void 0;if(t.logger?.disabled!==!0){if(A&&"object"==typeof A&&"message"in A&&"string"==typeof A.message&&(A.message.includes("no column")||A.message.includes("column")||A.message.includes("relation")||A.message.includes("table")||A.message.includes("does not exist")))return void e.logger?.error(A.message);(0,eiI.isAPIError)(A)?("INTERNAL_SERVER_ERROR"===A.status&&e.logger.error(A.status,A),i?.error(A.message)):e.logger?.error(A&&"object"==typeof A&&"name"in A?A.name:"",A)}}})})(r,e);return(0,er1.runWithAdapter)(r.adapter,()=>a(t))},api:r,options:e,$context:A,$ERROR_CODES:{...e.plugins?.reduce((e,t)=>t.$ERROR_CODES?{...e,...t.$ERROR_CODES}:e,{}),...eig.BASE_ERROR_CODES}}})({appName:"AI Development Environment",baseURL:function(e){if("inferred"!==e.mode)return"single"===e.mode?e.canonical:{allowedHosts:e.patterns.flatMap(e=>e.port?[e.host]:[e.host,`${e.host}:*`]),protocol:e.allHttps?"https":"auto",fallback:e.canonical}}(A.origins),trustedOrigins:e=>{if(!e)return[];let t=function(e,t){let A=t=>{let A=e.headers.get(t)?.split(",")[0]?.trim();return A&&!/[\s/\\@]/.test(A)?A:null},r=t?A("x-forwarded-host"):null,i=t?A("x-forwarded-proto"):null,n=r??A("host");if(n&&H(n)){let t="https"===i||"http"===i?i:new URL(e.url).protocol.replace(":","");return`${t}://${n.toLowerCase()}`}try{return new URL(e.url).origin}catch{return null}}(e,A.trustProxyHeaders);return t&&K(A.origins,t)?[t]:[]},secret:A.secret,advanced:{trustedProxyHeaders:A.trustProxyHeaders},database:(i={provider:"sqlite"},a=null,s=(e,t=!1)=>({getFieldName:A,getModelName:r,getFieldAttributes:n,getDefaultModelName:a,schema:s})=>{let o=(e,t,i)=>{if(!e&&!i)return;let n={};if(e)for(let r of e)n[A({model:t,field:r})]=!0;if(i){if(!e){let e=s[a(t)]?.fields||{};for(let r of(e.id={type:"string"},Object.keys(e)))n[A({model:t,field:r})]=!0}for(let[e,A]of Object.entries(i)){let i=l(t,r(e),s);"one-to-one"===A.relation?n[i]=!0:n[i]={take:A.limit}}}return n},l=(e,t,A)=>{try{let n=a(e),s=a(t),o=r(t).toLowerCase(),l=Object.entries(A[s]?.fields||{}).filter(([e,t])=>t.references&&a(t.references.model)===n);if(l.length>0){let[e,t]=l[0];return t?.unique===!0||!0===i.usePlural?o:`${o}s`}if((l=Object.entries(A[n]?.fields||{}).filter(([e,t])=>t.references&&a(t.references.model)===s)).length>0)return o}catch{}return`${r(t).toLowerCase()}s`};function c(e){switch(e){case"starts_with":return"startsWith";case"ends_with":return"endsWith";case"ne":return"not";case"not_in":return"notIn";default:return e}}let u=({action:e,model:t,where:r})=>{if(!r||!r.length)return{};let a=e=>{let r=A({model:t,field:e.field}),a=(e.mode??"sensitive")==="insensitive"&&("string"==typeof e.value||Array.isArray(e.value)&&e.value.every(e=>"string"==typeof e)),s="postgresql"===i.provider||"mongodb"===i.provider,o=a&&s?"insensitive":void 0,l=o?{mode:o}:{};if("ne"===e.operator&&null===e.value)return n({model:t,field:e.field})?.required!==!0?{[r]:{not:null}}:{};if(("in"===e.operator||"not_in"===e.operator)&&Array.isArray(e.value)){let t=e.value.filter(e=>null!=e);if(0===t.length)if("in"===e.operator)return{AND:[{[r]:{equals:"__never__"}},{[r]:{not:"__never__"}}]};else return{};return{[r]:{[c(e.operator)]:t,...l}}}return"eq"!==e.operator&&e.operator?"ne"===e.operator?{[r]:{not:{equals:e.value},...l}}:{[r]:{[c(e.operator)]:e.value,...l}}:{[r]:{equals:e.value,...l}}};if("update"===e){let e=r.filter(e=>"AND"===e.connector||!e.connector),i=r.filter(e=>"OR"===e.connector),n=e.filter(e=>"eq"===e.operator||!e.operator),s=e.filter(e=>"eq"!==e.operator&&void 0!==e.operator).map(e=>a(e)),o=i.map(e=>a(e)),l={};for(let e of n)l[A({model:t,field:e.field})]=e.value;return s.length>0&&(l.AND=s),o.length>0&&(l.OR=o),l}if("delete"===e){let e=r.find(e=>"id"===e.field);if(e){let i=A({model:t,field:"id"}),n=r.filter(e=>"id"!==e.field);if(0===n.length)return{[i]:e.value};let s=n.filter(e=>"AND"===e.connector||!e.connector),o=n.filter(e=>"OR"===e.connector),l=s.map(e=>a(e)),c=o.map(e=>a(e)),u={[i]:e.value};return l.length>0&&(u.AND=l),c.length>0&&(u.OR=c),u}}if(1===r.length){let e=r[0];if(!e)return;return a(e)}let s=r.filter(e=>"AND"===e.connector||!e.connector),o=r.filter(e=>"OR"===e.connector),l=s.map(e=>a(e)),u=o.map(e=>a(e));return{...l.length?{AND:l}:{},...u.length?{OR:u}:{}}};return{async create({model:t,data:A,select:r}){if(!e[t])throw new eAO.BetterAuthError(`Model ${t} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`);return await e[t].create({data:A,select:o(r,t)})},async findOne({model:t,where:A,select:i,join:n}){let a=u({model:t,where:A,action:"findOne"});if(!e[t])throw new eAO.BetterAuthError(`Model ${t} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`);let c=new Map;for(let e of Object.keys(n??{})){let A=l(t,e,s);c.set(A,r(e))}let d=o(i,t,n),h=await e[t].findFirst({where:a,select:d});if(n&&h)for(let[e,t]of c.entries())e!==t&&e in h&&(h[t]=h[e],delete h[e]);return h},async findMany({model:t,where:i,limit:n,select:a,offset:c,sortBy:d,join:h}){let p=u({model:t,where:i,action:"findMany"});if(!e[t])throw new eAO.BetterAuthError(`Model ${t} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`);let g=new Map;if(h)for(let[e,A]of Object.entries(h)){let A=l(t,e,s);g.set(A,r(e))}let m=o(a,t,h),f=await e[t].findMany({where:p,take:n||100,skip:c||0,...d?.field?{orderBy:{[A({model:t,field:d.field})]:"desc"===d.direction?"desc":"asc"}}:{},select:m});if(h&&Array.isArray(f))for(let e of f)for(let[t,A]of g.entries())t!==A&&t in e&&(e[A]=e[t],delete e[t]);return f},async count({model:t,where:A}){let r=u({model:t,where:A,action:"count"});if(!e[t])throw new eAO.BetterAuthError(`Model ${t} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`);return await e[t].count({where:r})},async update({model:t,where:A,update:r}){if(!e[t])throw new eAO.BetterAuthError(`Model ${t} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`);if(!(A?.length&&A.some(e=>{if("OR"===e.connector||e.operator&&"eq"!==e.operator)return!1;if("insensitive"===e.mode){let t="postgresql"===i.provider||"mongodb"===i.provider,A="string"==typeof e.value||Array.isArray(e.value)&&e.value.every(e=>"string"==typeof e);if(t&&A)return!1}return"id"===e.field||n({model:t,field:e.field})?.unique===!0}))){let i=u({model:t,where:A,action:"updateMany"});return(await e[t].updateMany({where:i,data:r}))?.count?await e[t].findFirst({where:i}):null}let a=u({model:t,where:A,action:"update"});try{return await e[t].update({where:a,data:r})}catch(e){if(erv(e))return null;throw e}},async updateMany({model:t,where:A,update:r}){if(!e[t])throw new eAO.BetterAuthError(`Model ${t} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`);let i=u({model:t,where:A,action:"updateMany"}),n=await e[t].updateMany({where:i,data:r});return n?n.count:0},async delete({model:t,where:A}){if(!e[t])throw new eAO.BetterAuthError(`Model ${t} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`);if(!A?.some(e=>"id"===e.field)){let r=u({model:t,where:A,action:"deleteMany"});await e[t].deleteMany({where:r});return}let r=u({model:t,where:A,action:"delete"});try{await e[t].delete({where:r})}catch(e){if(erv(e))return;throw e}},async deleteMany({model:t,where:A}){let r=u({model:t,where:A,action:"deleteMany"}),i=await e[t].deleteMany({where:r});return i?i.count:0},async consumeOne({model:A,where:r}){if(!e[A])throw new eAO.BetterAuthError(`Model ${A} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`);if(r?.some(e=>"id"===e.field)){let t=u({model:A,where:r,action:"delete"});try{return await e[A].delete({where:t})??null}catch(e){if(erv(e))return null;throw e}}let i=u({model:A,where:r,action:"findOne"}),n=async e=>{let t=await e[A].findFirst({where:i});if(!t)return null;try{return(await e[A].deleteMany({where:u({model:A,where:[...r??[],{field:"id",value:t.id,operator:"eq",connector:"AND",mode:"sensitive"}],action:"deleteMany"})}))?.count>0?t:null}catch(e){if(erv(e))return null;throw e}};return t||"function"!=typeof e.$transaction?n(e):e.$transaction(n)},async incrementOne({model:A,where:r,increment:i,set:n}){if(!e[A])throw new eAO.BetterAuthError(`Model ${A} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`);let a={...n??{}};for(let[e,t]of Object.entries(i))a[e]={increment:t};if(r?.some(e=>"id"===e.field)){let t=u({model:A,where:r,action:"update"});try{return await e[A].update({where:t,data:a})??null}catch(e){if(erv(e))return null;throw e}}let s=u({model:A,where:r,action:"findOne"}),o=async e=>{let t=await e[A].findFirst({where:s});if(!t)return null;try{return await e[A].update({where:u({model:A,where:[...r,{field:"id",value:t.id,operator:"eq",connector:"AND",mode:"sensitive"}],action:"update"}),data:a})??null}catch(e){if(erv(e))return null;throw e}};return t||"function"!=typeof e.$transaction?o(e):e.$transaction(o)},options:i}},o=null,o={config:{adapterId:"prisma",adapterName:"Prisma Adapter",usePlural:i.usePlural??!1,debugLogs:i.debugLogs??!1,supportsUUIDs:"postgresql"===i.provider,supportsArrays:"postgresql"===i.provider||"mongodb"===i.provider,transaction:!!i.transaction&&(e=>t.$transaction(t=>e((0,erS.createAdapterFactory)({config:{...o.config,transaction:!1},adapter:s(t,!0)})(a))))},adapter:s(t)},l=(0,erS.createAdapterFactory)(o),e=>(a=e,l(e))),emailAndPassword:{enabled:"password"===(n=A.mode)||"both"===n,requireEmailVerification:!1},account:{accountLinking:{enabled:!0,disableImplicitLinking:!0,allowDifferentEmails:!1}},databaseHooks:eoC,plugins:[function(){let e=(e=>{let t={...e||{},defaultRole:e?.defaultRole??"user",adminRoles:e?.adminRoles??["admin"],bannedUserMessage:e?.bannedUserMessage??"You have been banned from this application. Please contact support if you believe this is an error."};if(e?.adminRoles){let t=(Array.isArray(e.adminRoles)?e.adminRoles:[...e.adminRoles.split(",")]).filter(t=>!Object.keys(e?.roles||esH).map(e=>e.toLowerCase()).includes(t.toLowerCase()));if(t.length>0)throw new eAO.BetterAuthError(`Invalid admin roles: ${t.join(", ")}. Admin roles must be defined in the 'roles' configuration.`)}return{id:"admin",version:esP.PACKAGE_VERSION,init:()=>({options:{databaseHooks:{user:{create:{before:async t=>({data:{role:e?.defaultRole??"user",...t}})}},session:{create:{async before(e,A){if(!A)return;let r=await A.context.internalAdapter.findUserById(e.userId);if(r?.banned){if(r.banExpires&&new Date(r.banExpires).getTime()<Date.now())return void await A.context.internalAdapter.updateUser(e.userId,{banned:!1,banReason:null,banExpires:null});throw eAO.APIError.from("FORBIDDEN",{message:t.bannedUserMessage,code:"BANNED_USER"})}}}}}}}),hooks:{after:[{matcher:e=>"/list-sessions"===e.path,handler:(0,eAQ.createAuthMiddleware)(async e=>{let t=await esq(e);if(!t)return;let A=t.filter(e=>!e.impersonatedBy);return e.json(A)})}]},endpoints:{setRole:(0,eAQ.createAuthEndpoint)("/admin/set-role",{method:"POST",body:esZ,requireHeaders:!0,use:[esW],metadata:{openapi:{operationId:"setUserRole",summary:"Set the role of a user",description:"Set the role of a user",responses:{200:{description:"User role updated",content:{"application/json":{schema:{type:"object",properties:{user:{$ref:"#/components/schemas/User"}}}}}}}},$Infer:{body:{}}}},async e=>{if(!esK({userId:e.context.session.user.id,role:e.context.session.user.role,options:t,permissions:{user:["set-role"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_CHANGE_USERS_ROLE);let A=t.roles;if(A){for(let t of Array.isArray(e.body.role)?e.body.role:[e.body.role])if(!A[t])throw eAO.APIError.from("BAD_REQUEST",esj.YOU_ARE_NOT_ALLOWED_TO_SET_NON_EXISTENT_VALUE)}if(!await e.context.internalAdapter.findUserById(e.body.userId))throw eAO.APIError.from("NOT_FOUND",eig.BASE_ERROR_CODES.USER_NOT_FOUND);let r=await e.context.internalAdapter.updateUser(e.body.userId,{role:es$(e.body.role)});return e.json({user:(0,eAP.parseUserOutput)(e.context.options,r)})}),getUser:(0,eAQ.createAuthEndpoint)("/admin/get-user",{method:"GET",query:esz,use:[esW],metadata:{openapi:{operationId:"getUser",summary:"Get an existing user",description:"Get an existing user",responses:{200:{description:"User",content:{"application/json":{schema:{type:"object",properties:{user:{$ref:"#/components/schemas/User"}}}}}}}}}},async e=>{let{id:A}=e.query;if(!esK({userId:e.context.session.user.id,role:e.context.session.user.role,options:t,permissions:{user:["get"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_GET_USER);let r=await e.context.internalAdapter.findUserById(A);if(!r)throw eAO.APIError.from("NOT_FOUND",eig.BASE_ERROR_CODES.USER_NOT_FOUND);return(0,eAP.parseUserOutput)(e.context.options,r)}),createUser:(0,eAQ.createAuthEndpoint)("/admin/create-user",{method:"POST",body:esX,metadata:{openapi:{operationId:"createUser",summary:"Create a new user",description:"Create a new user",responses:{200:{description:"User created",content:{"application/json":{schema:{type:"object",properties:{user:{$ref:"#/components/schemas/User"}}}}}}}},$Infer:{body:{}}}},async e=>{let A=await (0,eAJ.getAuthoritativeSessionFromCtx)(e);if(!A&&(e.request||e.headers))throw e.error("UNAUTHORIZED");if(A&&!esK({userId:A.user.id,role:A.user.role,options:t,permissions:{user:["create"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_CREATE_USERS);let{role:r,...i}=e.body.data??{},n=e.body.role??r;if(void 0!==n){if(A&&!esK({userId:A.user.id,role:A.user.role,options:t,permissions:{user:["set-role"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_CHANGE_USERS_ROLE);for(let e of Array.isArray(n)?n:[n]){if("string"!=typeof e)throw eAO.APIError.from("BAD_REQUEST",esj.INVALID_ROLE_TYPE);if(t.roles&&!t.roles[e])throw eAO.APIError.from("BAD_REQUEST",esj.YOU_ARE_NOT_ALLOWED_TO_SET_NON_EXISTENT_VALUE)}}if(A&&["banned","banReason","banExpires"].some(e=>Object.prototype.hasOwnProperty.call(i,e))&&!esK({userId:A.user.id,role:A.user.role,options:t,permissions:{user:["ban"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_BAN_USERS);let a=e.body.email.toLowerCase();if(!by.email().safeParse(a).success)throw eAO.APIError.from("BAD_REQUEST",eig.BASE_ERROR_CODES.INVALID_EMAIL);if(await e.context.internalAdapter.findUserByEmail(a))throw eAO.APIError.from("BAD_REQUEST",esj.USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL);let s=await e.context.internalAdapter.createUser({...i,email:a,name:e.body.name,role:void 0!==n?es$(n):t?.defaultRole??"user"});if(!s)throw eAO.APIError.from("INTERNAL_SERVER_ERROR",esj.FAILED_TO_CREATE_USER);if(e.body.password){let t=await e.context.password.hash(e.body.password);await e.context.internalAdapter.linkAccount({accountId:s.id,providerId:"credential",password:t,userId:s.id})}return e.json({user:(0,eAP.parseUserOutput)(e.context.options,s)})}),adminUpdateUser:(0,eAQ.createAuthEndpoint)("/admin/update-user",{method:"POST",body:es0,use:[esW],metadata:{openapi:{operationId:"adminUpdateUser",summary:"Update a user",description:"Update a user's details",responses:{200:{description:"User updated",content:{"application/json":{schema:{type:"object",properties:{user:{$ref:"#/components/schemas/User"}}}}}}}}}},async e=>{if(!esK({userId:e.context.session.user.id,role:e.context.session.user.role,options:t,permissions:{user:["update"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_UPDATE_USERS);if(0===Object.keys(e.body.data).length)throw eAO.APIError.from("BAD_REQUEST",esj.NO_DATA_TO_UPDATE);let A=e.body.data,r=e=>Object.prototype.hasOwnProperty.call(A,e);if(r("password"))throw eAO.APIError.from("BAD_REQUEST",esj.PASSWORD_CANNOT_BE_UPDATED_VIA_UPDATE_USER);if(Object.prototype.hasOwnProperty.call(e.body.data,"role")){if(!esK({userId:e.context.session.user.id,role:e.context.session.user.role,options:t,permissions:{user:["set-role"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_CHANGE_USERS_ROLE);let A=e.body.data.role,r=Array.isArray(A)?A:[A];for(let e of r){if("string"!=typeof e)throw eAO.APIError.from("BAD_REQUEST",esj.INVALID_ROLE_TYPE);if(t.roles&&!t.roles[e])throw eAO.APIError.from("BAD_REQUEST",esj.YOU_ARE_NOT_ALLOWED_TO_SET_NON_EXISTENT_VALUE)}e.body.data.role=es$(r)}if(["banned","banReason","banExpires"].some(r)){if(!esK({userId:e.context.session.user.id,role:e.context.session.user.role,options:t,permissions:{user:["ban"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_BAN_USERS);if(!0===A.banned&&e.body.userId===e.context.session.user.id)throw eAO.APIError.from("BAD_REQUEST",esj.YOU_CANNOT_BAN_YOURSELF)}if(r("email")||r("emailVerified")){if(!esK({userId:e.context.session.user.id,role:e.context.session.user.role,options:t,permissions:{user:["set-email"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_SET_USERS_EMAIL);if(r("email")){let t=String(A.email).toLowerCase();if(!by.email().safeParse(t).success)throw eAO.APIError.from("BAD_REQUEST",eig.BASE_ERROR_CODES.INVALID_EMAIL);let r=await e.context.internalAdapter.findUserByEmail(t);if(r&&r.user.id!==e.body.userId)throw eAO.APIError.from("BAD_REQUEST",esj.USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL);A.email=t}}if(!await e.context.internalAdapter.findUserById(e.body.userId))throw eAO.APIError.from("NOT_FOUND",eig.BASE_ERROR_CODES.USER_NOT_FOUND);let i=await e.context.internalAdapter.updateUser(e.body.userId,e.body.data);return!0===A.banned&&await e.context.internalAdapter.deleteUserSessions(e.body.userId),e.json((0,eAP.parseUserOutput)(e.context.options,i))}),listUsers:(0,eAQ.createAuthEndpoint)("/admin/list-users",{method:"GET",use:[esW],query:es1,metadata:{openapi:{operationId:"listUsers",summary:"List users",description:"List users",responses:{200:{description:"List of users",content:{"application/json":{schema:{type:"object",properties:{users:{type:"array",items:{$ref:"#/components/schemas/User"}},total:{type:"number"},limit:{type:"number"},offset:{type:"number"}},required:["users","total"]}}}}}}}},async e=>{let A=e.context.session;if(!esK({userId:e.context.session.user.id,role:A.user.role,options:t,permissions:{user:["list"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_LIST_USERS);let r=[];e.query?.searchValue&&r.push({field:e.query.searchField||"email",operator:e.query.searchOperator||"contains",value:e.query.searchValue}),e.query?.filterValue!==void 0&&r.push({field:e.query.filterField||"email",operator:e.query.filterOperator||"eq",value:e.query.filterValue});try{let t=await e.context.internalAdapter.listUsers(Number(e.query?.limit)||void 0,Number(e.query?.offset)||void 0,e.query?.sortBy?{field:e.query.sortBy,direction:e.query.sortDirection||"asc"}:void 0,r.length?r:void 0),A=await e.context.internalAdapter.countTotalUsers(r.length?r:void 0);return e.json({users:t.map(t=>(0,eAP.parseUserOutput)(e.context.options,t)),total:A,limit:Number(e.query?.limit)||void 0,offset:Number(e.query?.offset)||void 0})}catch{return e.json({users:[],total:0})}}),listUserSessions:(0,eAQ.createAuthEndpoint)("/admin/list-user-sessions",{method:"POST",use:[esW],body:es8,metadata:{openapi:{operationId:"adminListUserSessions",summary:"List user sessions",description:"List user sessions",responses:{200:{description:"List of user sessions",content:{"application/json":{schema:{type:"object",properties:{sessions:{type:"array",items:{$ref:"#/components/schemas/Session"}}}}}}}}}}},async e=>{let A=e.context.session;if(!esK({userId:e.context.session.user.id,role:A.user.role,options:t,permissions:{session:["list"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_LIST_USERS_SESSIONS);let r=await e.context.internalAdapter.listSessions(e.body.userId);return e.json({sessions:r.map(t=>(0,eAP.parseSessionOutput)(e.context.options,t))})}),unbanUser:(0,eAQ.createAuthEndpoint)("/admin/unban-user",{method:"POST",body:es4,use:[esW],metadata:{openapi:{operationId:"unbanUser",summary:"Unban a user",description:"Unban a user",responses:{200:{description:"User unbanned",content:{"application/json":{schema:{type:"object",properties:{user:{$ref:"#/components/schemas/User"}}}}}}}}}},async e=>{let A=e.context.session;if(!esK({userId:e.context.session.user.id,role:A.user.role,options:t,permissions:{user:["ban"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_BAN_USERS);if(!await e.context.internalAdapter.findUserById(e.body.userId))throw eAO.APIError.from("NOT_FOUND",eig.BASE_ERROR_CODES.USER_NOT_FOUND);let r=await e.context.internalAdapter.updateUser(e.body.userId,{banned:!1,banExpires:null,banReason:null,updatedAt:new Date});return e.json({user:(0,eAP.parseUserOutput)(e.context.options,r)})}),banUser:(0,eAQ.createAuthEndpoint)("/admin/ban-user",{method:"POST",body:es2,use:[esW],metadata:{openapi:{operationId:"banUser",summary:"Ban a user",description:"Ban a user",responses:{200:{description:"User banned",content:{"application/json":{schema:{type:"object",properties:{user:{$ref:"#/components/schemas/User"}}}}}}}}}},async e=>{let A=e.context.session;if(!esK({userId:e.context.session.user.id,role:A.user.role,options:t,permissions:{user:["ban"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_BAN_USERS);if(!await e.context.internalAdapter.findUserById(e.body.userId))throw eAO.APIError.from("NOT_FOUND",eig.BASE_ERROR_CODES.USER_NOT_FOUND);if(e.body.userId===e.context.session.user.id)throw eAO.APIError.from("BAD_REQUEST",esj.YOU_CANNOT_BAN_YOURSELF);let r=await e.context.internalAdapter.updateUser(e.body.userId,{banned:!0,banReason:e.body.banReason||t?.defaultBanReason||"No reason",banExpires:e.body.banExpiresIn?(0,erZ.getDate)(e.body.banExpiresIn,"sec"):t?.defaultBanExpiresIn?(0,erZ.getDate)(t.defaultBanExpiresIn,"sec"):void 0,updatedAt:new Date});return await e.context.internalAdapter.deleteUserSessions(e.body.userId),e.json({user:(0,eAP.parseUserOutput)(e.context.options,r)})}),impersonateUser:(0,eAQ.createAuthEndpoint)("/admin/impersonate-user",{method:"POST",body:es3,use:[esW],metadata:{openapi:{operationId:"impersonateUser",summary:"Impersonate a user",description:"Impersonate a user",responses:{200:{description:"Impersonation session created",content:{"application/json":{schema:{type:"object",properties:{session:{$ref:"#/components/schemas/Session"},user:{$ref:"#/components/schemas/User"}}}}}}}}}},async e=>{if(!esK({userId:e.context.session.user.id,role:e.context.session.user.role,options:t,permissions:{user:["impersonate"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_IMPERSONATE_USERS);let A=await e.context.internalAdapter.findUserById(e.body.userId);if(!A)throw eAO.APIError.from("NOT_FOUND",eig.BASE_ERROR_CODES.USER_NOT_FOUND);let r=(Array.isArray(t.adminRoles)?t.adminRoles:t.adminRoles?.split(",")||[]).map(e=>e.trim());if(((A.role||t.defaultRole||"user").split(",").some(e=>r.includes(e))||t.adminUserIds?.includes(A.id))&&!(!0===t.allowImpersonatingAdmins||esK({userId:e.context.session.user.id,role:e.context.session.user.role,options:t,permissions:{user:["impersonate-admins"]}})))throw eAO.APIError.from("FORBIDDEN",esj.YOU_CANNOT_IMPERSONATE_ADMINS);let i=await e.context.internalAdapter.createSession(A.id,!0,{impersonatedBy:e.context.session.user.id,expiresAt:t?.impersonationSessionDuration?(0,erZ.getDate)(t.impersonationSessionDuration,"sec"):(0,erZ.getDate)(3600,"sec")},!0);if(!i)throw eAO.APIError.from("INTERNAL_SERVER_ERROR",esj.FAILED_TO_CREATE_USER);let n=e.context.authCookies;(0,er$.deleteSessionCookie)(e);let a=await e.getSignedCookie(e.context.authCookies.dontRememberToken.name,e.context.secret),s=e.context.createAuthCookie("admin_session");return await e.setSignedCookie(s.name,`${e.context.session.session.token}:${a||""}`,e.context.secret,n.sessionToken.attributes),await (0,er$.setSessionCookie)(e,{session:i,user:A},!0),e.json({session:i,user:(0,eAP.parseUserOutput)(e.context.options,A)})}),stopImpersonating:(0,eAQ.createAuthEndpoint)("/admin/stop-impersonating",{method:"POST",requireHeaders:!0},async e=>{let t=await (0,eAJ.getSessionFromCtx)(e);if(!t)throw eAO.APIError.fromStatus("UNAUTHORIZED");if(!t.session.impersonatedBy)throw eAO.APIError.fromStatus("BAD_REQUEST",{message:"You are not impersonating anyone"});let A=await e.context.internalAdapter.findUserById(t.session.impersonatedBy);if(!A)throw eAO.APIError.fromStatus("INTERNAL_SERVER_ERROR",{message:"Failed to find user"});let r=e.context.createAuthCookie("admin_session"),i=await e.getSignedCookie(r.name,e.context.secret);if(!i)throw eAO.APIError.fromStatus("INTERNAL_SERVER_ERROR",{message:"Failed to find admin session"});let[n,a]=i?.split(":"),s=await e.context.internalAdapter.findSession(n);if(!s||s.session.userId!==A.id)throw eAO.APIError.fromStatus("INTERNAL_SERVER_ERROR",{message:"Failed to find admin session"});return await e.context.internalAdapter.deleteSession(t.session.token),await (0,er$.setSessionCookie)(e,s,!!a),(0,er$.expireCookie)(e,r),e.json({session:(0,eAP.parseSessionOutput)(e.context.options,s.session),user:(0,eAP.parseUserOutput)(e.context.options,s.user)})}),revokeUserSession:(0,eAQ.createAuthEndpoint)("/admin/revoke-user-session",{method:"POST",body:es6,use:[esW],metadata:{openapi:{operationId:"revokeUserSession",summary:"Revoke a user session",description:"Revoke a user session",responses:{200:{description:"Session revoked",content:{"application/json":{schema:{type:"object",properties:{success:{type:"boolean"}}}}}}}}}},async e=>{let A=e.context.session;if(!esK({userId:e.context.session.user.id,role:A.user.role,options:t,permissions:{session:["revoke"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_REVOKE_USERS_SESSIONS);return await e.context.internalAdapter.deleteSession(e.body.sessionToken),e.json({success:!0})}),revokeUserSessions:(0,eAQ.createAuthEndpoint)("/admin/revoke-user-sessions",{method:"POST",body:es5,use:[esW],metadata:{openapi:{operationId:"revokeUserSessions",summary:"Revoke all user sessions",description:"Revoke all user sessions",responses:{200:{description:"Sessions revoked",content:{"application/json":{schema:{type:"object",properties:{success:{type:"boolean"}}}}}}}}}},async e=>{let A=e.context.session;if(!esK({userId:e.context.session.user.id,role:A.user.role,options:t,permissions:{session:["revoke"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_REVOKE_USERS_SESSIONS);return await e.context.internalAdapter.deleteUserSessions(e.body.userId),e.json({success:!0})}),removeUser:(0,eAQ.createAuthEndpoint)("/admin/remove-user",{method:"POST",body:es9,use:[esW],metadata:{openapi:{operationId:"removeUser",summary:"Remove a user",description:"Delete a user and all their sessions and accounts. Cannot be undone.",responses:{200:{description:"User removed",content:{"application/json":{schema:{type:"object",properties:{success:{type:"boolean"}}}}}}}}}},async e=>{let A=e.context.session;if(!esK({userId:e.context.session.user.id,role:A.user.role,options:t,permissions:{user:["delete"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_DELETE_USERS);if(e.body.userId===e.context.session.user.id)throw eAO.APIError.from("BAD_REQUEST",esj.YOU_CANNOT_REMOVE_YOURSELF);if(!await e.context.internalAdapter.findUserById(e.body.userId))throw eAO.APIError.from("NOT_FOUND",eig.BASE_ERROR_CODES.USER_NOT_FOUND);return await e.context.internalAdapter.deleteUserSessions(e.body.userId),await e.context.internalAdapter.deleteUser(e.body.userId),e.json({success:!0})}),setUserPassword:(0,eAQ.createAuthEndpoint)("/admin/set-user-password",{method:"POST",body:es7,use:[esW],metadata:{openapi:{operationId:"setUserPassword",summary:"Set a user's password",description:"Set a user's password",responses:{200:{description:"Password set",content:{"application/json":{schema:{type:"object",properties:{status:{type:"boolean"}}}}}}}}}},async e=>{if(!esK({userId:e.context.session.user.id,role:e.context.session.user.role,options:t,permissions:{user:["set-password"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_SET_USERS_PASSWORD);let{newPassword:A,userId:r}=e.body,i=e.context.password.config.minPasswordLength;if(A.length<i)throw e.context.logger.warn("Password is too short"),eAO.APIError.from("BAD_REQUEST",eig.BASE_ERROR_CODES.PASSWORD_TOO_SHORT);let n=e.context.password.config.maxPasswordLength;if(A.length>n)throw e.context.logger.warn("Password is too long"),eAO.APIError.from("BAD_REQUEST",eig.BASE_ERROR_CODES.PASSWORD_TOO_LONG);if(!await e.context.internalAdapter.findUserById(r))throw eAO.APIError.from("NOT_FOUND",eig.BASE_ERROR_CODES.USER_NOT_FOUND);let a=await e.context.password.hash(A);return(await e.context.internalAdapter.findAccounts(r)).find(e=>"credential"===e.providerId)?await e.context.internalAdapter.updatePassword(r,a):await e.context.internalAdapter.createAccount({userId:r,providerId:"credential",accountId:r,password:a}),e.json({status:!0})}),userHasPermission:(0,eAQ.createAuthEndpoint)("/admin/has-permission",{method:"POST",body:eoe,metadata:{openapi:{description:"Check if the user has permission",requestBody:{content:{"application/json":{schema:{type:"object",properties:{permissions:{type:"object",description:"The permission to check"}},required:["permissions"]}}}},responses:{200:{description:"Success",content:{"application/json":{schema:{type:"object",properties:{error:{type:"string"},success:{type:"boolean"}},required:["success"]}}}}}},$Infer:{body:{}}}},async e=>{if(!e.body?.permissions)throw new eAO.APIError("BAD_REQUEST",{message:"invalid permission check. no permission(s) were passed."});let A=await (0,eAJ.getAuthoritativeSessionFromCtx)(e);if(!A&&(e.request||e.headers))throw new eAO.APIError("UNAUTHORIZED");if(!A&&!e.body.userId&&!e.body.role)throw new eAO.APIError("BAD_REQUEST",{message:"user id or role is required"});let r=A?.user||(e.body.role?{id:e.body.userId||"",role:e.body.role}:null)||(e.body.userId?await e.context.internalAdapter.findUserById(e.body.userId):null);if(!r)throw new eAO.APIError("BAD_REQUEST",{message:"user not found"});let i=esK({userId:r.id,role:r.role,options:t,permissions:e.body.permissions});return e.json({error:null,success:i})})},$ERROR_CODES:esj,schema:(0,eAP.mergeSchema)(eot,t.schema),options:e}})({ac:eoE,roles:{user:eoQ},defaultRole:"user",adminRoles:["user"]}),{setRole:t,banUser:A,unbanUser:r,impersonateUser:i,stopImpersonating:n,removeUser:a,...s}=e.endpoints;return{...e,endpoints:s}}(),function(e){if(Array.isArray(e)&&e.length>0){if(!e.every(e=>e.configId))throw new eAO.BetterAuthError("configId is required for each API key configuration in the api-key plugin.");let t=e.map(e=>e.configId);if(new Set(t).size!==t.length)throw new eAO.BetterAuthError("configId must be unique for each API key configuration in the api-key plugin.")}let t=(void 0)??{schema:Array.isArray(e)?void 0:e?.schema},A=[...(Array.isArray(e)?e:[e]).map(e=>({...e,apiKeyHeaders:e?.apiKeyHeaders??"x-api-key",defaultKeyLength:e?.defaultKeyLength||64,maximumPrefixLength:e?.maximumPrefixLength??32,minimumPrefixLength:e?.minimumPrefixLength??1,maximumNameLength:e?.maximumNameLength??32,minimumNameLength:e?.minimumNameLength??1,enableMetadata:e?.enableMetadata??!1,disableKeyHashing:e?.disableKeyHashing??!1,requireName:e?.requireName??!1,storage:e?.storage??"database",rateLimit:{enabled:e?.rateLimit?.enabled===void 0||e?.rateLimit?.enabled,timeWindow:e?.rateLimit?.timeWindow??864e5,maxRequests:e?.rateLimit?.maxRequests??10},keyExpiration:{defaultExpiresIn:e?.keyExpiration?.defaultExpiresIn??null,disableCustomExpiresTime:e?.keyExpiration?.disableCustomExpiresTime??!1,maxExpiresIn:e?.keyExpiration?.maxExpiresIn??365,minExpiresIn:e?.keyExpiration?.minExpiresIn??1},startingCharactersConfig:{shouldStore:e?.startingCharactersConfig?.shouldStore??!0,charactersLength:e?.startingCharactersConfig?.charactersLength??6},enableSessionForAPIKeys:e?.enableSessionForAPIKeys??!1,fallbackToDatabase:e?.fallbackToDatabase??!1,customStorage:e?.customStorage,deferUpdates:e?.deferUpdates??!1}))],r=(0,eAP.mergeSchema)((({defaultRateLimitMax:e,defaultTimeWindow:t})=>({apikey:{fields:{configId:{type:"string",required:!0,defaultValue:"default",input:!1,index:!0},name:{type:"string",required:!1,input:!1},start:{type:"string",required:!1,input:!1},referenceId:{type:"string",required:!0,input:!1,index:!0},prefix:{type:"string",required:!1,input:!1},key:{type:"string",required:!0,input:!1,index:!0},refillInterval:{type:"number",required:!1,input:!1},refillAmount:{type:"number",required:!1,input:!1},lastRefillAt:{type:"date",required:!1,input:!1},enabled:{type:"boolean",required:!1,input:!1,defaultValue:!0},rateLimitEnabled:{type:"boolean",required:!1,input:!1,defaultValue:!0},rateLimitTimeWindow:{type:"number",required:!1,input:!1,defaultValue:t},rateLimitMax:{type:"number",required:!1,input:!1,defaultValue:e},requestCount:{type:"number",required:!1,input:!1,defaultValue:0},remaining:{type:"number",required:!1,input:!1},lastRequest:{type:"date",required:!1,input:!1},expiresAt:{type:"date",required:!1,input:!1},createdAt:{type:"date",required:!0,input:!1},updatedAt:{type:"date",required:!0,input:!1},permissions:{type:"string",required:!1,input:!1},metadata:{type:"string",required:!1,input:!0,transform:{input:e=>JSON.stringify(e),output:e=>e?(0,eAK.parseJSON)(e):null}}}}}))({defaultRateLimitMax:(1===A.length?A[0]?.rateLimit.maxRequests:void 0)??10,defaultTimeWindow:(1===A.length?A[0]?.rateLimit.timeWindow:void 0)??864e5}),t.schema);function i(e){for(let t of A){if(!t.enableSessionForAPIKeys)continue;let A=function(e,t){if(t.customAPIKeyGetter)return t.customAPIKeyGetter(e);if(Array.isArray(t.apiKeyHeaders)){for(let A of t.apiKeyHeaders){let t=e.headers?.get(A);if(t)return t}return null}return e.headers?.get(t.apiKeyHeaders)??null}(e,t);if(A)return{key:A,config:t}}return null}let n=function({defaultKeyGenerator:e,configurations:t,schema:A}){return{createApiKey:function({defaultKeyGenerator:e,configurations:t,schema:A,deleteAllExpiredApiKeys:r}){return(0,eAQ.createAuthEndpoint)("/api-key/create",{method:"POST",body:erl,metadata:{openapi:{description:"Create a new API key for a user",responses:{200:{description:"API key created successfully",content:{"application/json":{schema:{type:"object",properties:{id:{type:"string",description:"Unique identifier of the API key"},createdAt:{type:"string",format:"date-time",description:"Creation timestamp"},updatedAt:{type:"string",format:"date-time",description:"Last update timestamp"},name:{type:"string",nullable:!0,description:"Name of the API key"},prefix:{type:"string",nullable:!0,description:"Prefix of the API key"},start:{type:"string",nullable:!0,description:"Starting characters of the key (if configured)"},key:{type:"string",description:"The full API key (only returned on creation)"},enabled:{type:"boolean",description:"Whether the key is enabled"},expiresAt:{type:"string",format:"date-time",nullable:!0,description:"Expiration timestamp"},referenceId:{type:"string",description:"ID of the reference owning the key"},lastRefillAt:{type:"string",format:"date-time",nullable:!0,description:"Last refill timestamp"},lastRequest:{type:"string",format:"date-time",nullable:!0,description:"Last request timestamp"},metadata:{type:"object",nullable:!0,additionalProperties:!0,description:"Metadata associated with the key"},rateLimitMax:{type:"number",nullable:!0,description:"Maximum requests in time window"},rateLimitTimeWindow:{type:"number",nullable:!0,description:"Rate limit time window in milliseconds"},remaining:{type:"number",nullable:!0,description:"Remaining requests"},refillAmount:{type:"number",nullable:!0,description:"Amount to refill"},refillInterval:{type:"number",nullable:!0,description:"Refill interval in milliseconds"},rateLimitEnabled:{type:"boolean",description:"Whether rate limiting is enabled"},requestCount:{type:"number",description:"Current request count in window"},permissions:{type:"object",nullable:!0,additionalProperties:{type:"array",items:{type:"string"}},description:"Permissions associated with the key"}},required:["id","createdAt","updatedAt","key","enabled","referenceId","rateLimitEnabled","requestCount"]}}}}}}}},async A=>{let i,n,{configId:a,name:s,expiresIn:o,prefix:l,remaining:c,metadata:u,refillAmount:d,refillInterval:h,permissions:p,rateLimitMax:g,rateLimitTimeWindow:m,rateLimitEnabled:f}=A.body,I=ery(A.context,t,a),w=I.customKeyGenerator||e,C=await (0,eAJ.getSessionFromCtx)(A,{disableCookieCache:!0}),y=A.request||A.headers;if(y&&(void 0!==d||void 0!==h||void 0!==g||void 0!==m||void 0!==f||void 0!==p||null!==c))throw eAO.APIError.from("BAD_REQUEST",eAE.SERVER_ONLY_PROPERTY);if(A.request&&void 0!==A.body.userId)throw eAO.APIError.from("UNAUTHORIZED",eAE.UNAUTHORIZED_SESSION);if("organization"===(I.references??"user")){let e=A.body.organizationId;if(!e){let e=eAE.ORGANIZATION_ID_REQUIRED;throw eAO.APIError.from("BAD_REQUEST",e)}let t=C?.user.id||A.body.userId;if(!t)throw eAO.APIError.from("UNAUTHORIZED",eAE.UNAUTHORIZED_SESSION);await era(A,t,e,"create"),i=e}else if(y){if(!C?.user.id){let e=eAE.UNAUTHORIZED_SESSION;throw eAO.APIError.from("UNAUTHORIZED",e)}i=C.user.id}else{let e=A.body.userId,t=C?.user.id;if(!t&&!e||C&&e&&t!==e){let e=eAE.UNAUTHORIZED_SESSION;throw eAO.APIError.from("UNAUTHORIZED",e)}i=t||e}if(u){if(!1===I.enableMetadata)throw eAO.APIError.from("BAD_REQUEST",eAE.METADATA_DISABLED);if("object"!=typeof u)throw eAO.APIError.from("BAD_REQUEST",eAE.INVALID_METADATA_TYPE)}if(d&&!h){let e=eAE.REFILL_AMOUNT_AND_INTERVAL_REQUIRED;throw eAO.APIError.from("BAD_REQUEST",e)}if(h&&!d){let e=eAE.REFILL_INTERVAL_AND_AMOUNT_REQUIRED;throw eAO.APIError.from("BAD_REQUEST",e)}if(o){if(!0===I.keyExpiration.disableCustomExpiresTime){let e=eAE.KEY_DISABLED_EXPIRATION;throw eAO.APIError.from("BAD_REQUEST",e)}let e=o/86400;if(I.keyExpiration.minExpiresIn>e){let e=eAE.EXPIRES_IN_IS_TOO_SMALL;throw eAO.APIError.from("BAD_REQUEST",e)}if(I.keyExpiration.maxExpiresIn<e){let e=eAE.EXPIRES_IN_IS_TOO_LARGE;throw eAO.APIError.from("BAD_REQUEST",e)}}if(l&&(l.length<I.minimumPrefixLength||l.length>I.maximumPrefixLength))throw eAO.APIError.from("BAD_REQUEST",eAE.INVALID_PREFIX_LENGTH);if(s){if(s.length<I.minimumNameLength||s.length>I.maximumNameLength)throw eAO.APIError.from("BAD_REQUEST",eAE.INVALID_NAME_LENGTH)}else if(I.requireName)throw eAO.APIError.from("BAD_REQUEST",eAE.NAME_REQUIRED);r(A.context);let E=await w({length:I.defaultKeyLength,prefix:l||I.defaultPrefix}),Q=I.disableKeyHashing?E:await erD(E),B=null;I.startingCharactersConfig.shouldStore&&(B=E.substring(0,I.startingCharactersConfig.charactersLength));let b=I.permissions?.defaultPermissions?"function"==typeof I.permissions.defaultPermissions?await I.permissions.defaultPermissions(i,A):I.permissions.defaultPermissions:void 0,D=p?JSON.stringify(p):b?JSON.stringify(b):void 0,k={configId:I.configId??"default",createdAt:new Date,updatedAt:new Date,name:s??null,prefix:l??I.defaultPrefix??null,start:B,key:Q,enabled:!0,expiresAt:o?ero(o,"sec"):I.keyExpiration.defaultExpiresIn?ero(I.keyExpiration.defaultExpiresIn,"sec"):null,referenceId:i,lastRefillAt:null,lastRequest:null,metadata:null,rateLimitMax:g??I.rateLimit.maxRequests??null,rateLimitTimeWindow:m??I.rateLimit.timeWindow??null,remaining:null===c?c:c??d??null,refillAmount:d??null,refillInterval:h??null,rateLimitEnabled:void 0===f?I.rateLimit.enabled??!0:f,requestCount:0,permissions:D};if(u&&(k.metadata=u),"secondary-storage"===I.storage&&I.fallbackToDatabase)n=await A.context.adapter.create({model:erk,data:k}),await erA(A,n,I);else if("secondary-storage"===I.storage){let e=A.context.generateId({model:"apikey"})||(0,eAL.generateId)();n={...k,id:e},await erA(A,n,I)}else n=await A.context.adapter.create({model:erk,data:k});return A.json({...n,key:E,metadata:u??null,permissions:n.permissions?(0,eAH.safeJSONParse)(n.permissions):null})})}({defaultKeyGenerator:e,configurations:t,schema:A,deleteAllExpiredApiKeys:erb}),verifyApiKey:function({configurations:e,schema:t,deleteAllExpiredApiKeys:A}){return eAQ.createAuthEndpoint.serverOnly({method:"POST",body:erC},async r=>{let i,{configId:n,key:a}=r.body,s=ery(r.context,e,n);if(void 0!==n&&s.customAPIKeyValidator&&!await s.customAPIKeyValidator({ctx:r,key:a}))return r.json({valid:!1,error:{message:eAE.INVALID_API_KEY,code:"KEY_NOT_FOUND"},key:null});let o=null;try{let l=await erg({key:a,permissions:r.body.permissions,ctx:r,lookupOpts:s,configurations:e,schema:t,expectedConfigId:n,runCustomValidator:void 0===n});o=l.apiKey,(i=l.opts).deferUpdates&&r.context.runInBackground(A(r.context).catch(e=>{r.context.logger.error("Failed to delete expired API keys:",e)}))}catch(e){if(r.context.logger.error("Failed to validate API key:",e),e instanceof eAO.APIError||e instanceof eAO.APIError||e?.name==="APIError")return r.json({valid:!1,error:{...e.body,message:e.body?.message,code:e.body?.code},key:null});return r.json({valid:!1,error:{message:eAE.INVALID_API_KEY,code:"INVALID_API_KEY"},key:null})}let{key:l,...c}=o??{key:1,permissions:void 0},u=null;return o&&(u=await eAZ(r,o,i)),c.permissions=c.permissions?(0,eAH.safeJSONParse)(c.permissions):null,r.json({valid:!0,error:null,key:null===o?null:{...c,metadata:u}})})}({configurations:t,schema:A,deleteAllExpiredApiKeys:erb}),getApiKey:function({configurations:e,schema:t,deleteAllExpiredApiKeys:A}){return(0,eAQ.createAuthEndpoint)("/api-key/get",{method:"GET",query:eru,use:[eAJ.sessionMiddleware],metadata:{openapi:{description:"Retrieve an existing API key by ID",responses:{200:{description:"API key retrieved successfully",content:{"application/json":{schema:{type:"object",properties:{id:{type:"string",description:"ID"},name:{type:"string",nullable:!0,description:"The name of the key"},start:{type:"string",nullable:!0,description:"Shows the first few characters of the API key, including the prefix. This allows you to show those few characters in the UI to make it easier for users to identify the API key."},prefix:{type:"string",nullable:!0,description:"The API Key prefix. Stored as plain text."},userId:{type:"string",description:"The owner of the user id"},refillInterval:{type:"number",nullable:!0,description:"The interval in milliseconds between refills of the `remaining` count. Example: 3600000 // refill every hour (3600000ms = 1h)"},refillAmount:{type:"number",nullable:!0,description:"The amount to refill"},lastRefillAt:{type:"string",format:"date-time",nullable:!0,description:"The last refill date"},enabled:{type:"boolean",description:"Sets if key is enabled or disabled",default:!0},rateLimitEnabled:{type:"boolean",description:"Whether the key has rate limiting enabled"},rateLimitTimeWindow:{type:"number",nullable:!0,description:"The duration in milliseconds"},rateLimitMax:{type:"number",nullable:!0,description:"Maximum amount of requests allowed within a window"},requestCount:{type:"number",description:"The number of requests made within the rate limit time window"},remaining:{type:"number",nullable:!0,description:"Remaining requests (every time api key is used this should updated and should be updated on refill as well)"},lastRequest:{type:"string",format:"date-time",nullable:!0,description:"When last request occurred"},expiresAt:{type:"string",format:"date-time",nullable:!0,description:"Expiry date of a key"},createdAt:{type:"string",format:"date-time",description:"created at"},updatedAt:{type:"string",format:"date-time",description:"updated at"},metadata:{type:"object",nullable:!0,additionalProperties:!0,description:"Extra metadata about the apiKey"},permissions:{type:"string",nullable:!0,description:"Permissions for the api key (stored as JSON string)"}},required:["id","userId","enabled","rateLimitEnabled","requestCount","createdAt","updatedAt"]}}}}}}}},async t=>{let{configId:r,id:i}=t.query,n=t.context.session,a=ery(t.context,e,r),s=null;if(!(s=await ert(t,i,a))||!erQ(s.configId,a.configId))throw eAO.APIError.from("NOT_FOUND",eAE.KEY_NOT_FOUND);let o=ery(t.context,e,s.configId);if((o.references??"user")==="organization")await era(t,n.user.id,s.referenceId,"read");else if(s.referenceId!==n.user.id)throw eAO.APIError.from("NOT_FOUND",eAE.KEY_NOT_FOUND);A(t.context);let l=await eAZ(t,s,o),{key:c,...u}=s;return t.json({...u,metadata:l,permissions:u.permissions?(0,eAH.safeJSONParse)(u.permissions):null})})}({configurations:t,schema:A,deleteAllExpiredApiKeys:erb}),updateApiKey:function({configurations:e,schema:t,deleteAllExpiredApiKeys:A}){return(0,eAQ.createAuthEndpoint)("/api-key/update",{method:"POST",body:erh,metadata:{openapi:{description:"Update an existing API key by ID",responses:{200:{description:"API key updated successfully",content:{"application/json":{schema:{type:"object",properties:{id:{type:"string",description:"ID"},name:{type:"string",nullable:!0,description:"The name of the key"},start:{type:"string",nullable:!0,description:"Shows the first few characters of the API key, including the prefix. This allows you to show those few characters in the UI to make it easier for users to identify the API key."},prefix:{type:"string",nullable:!0,description:"The API Key prefix. Stored as plain text."},userId:{type:"string",description:"The owner of the user id"},refillInterval:{type:"number",nullable:!0,description:"The interval in milliseconds between refills of the `remaining` count. Example: 3600000 // refill every hour (3600000ms = 1h)"},refillAmount:{type:"number",nullable:!0,description:"The amount to refill"},lastRefillAt:{type:"string",format:"date-time",nullable:!0,description:"The last refill date"},enabled:{type:"boolean",description:"Sets if key is enabled or disabled",default:!0},rateLimitEnabled:{type:"boolean",description:"Whether the key has rate limiting enabled"},rateLimitTimeWindow:{type:"number",nullable:!0,description:"The duration in milliseconds"},rateLimitMax:{type:"number",nullable:!0,description:"Maximum amount of requests allowed within a window"},requestCount:{type:"number",description:"The number of requests made within the rate limit time window"},remaining:{type:"number",nullable:!0,description:"Remaining requests (every time api key is used this should updated and should be updated on refill as well)"},lastRequest:{type:"string",format:"date-time",nullable:!0,description:"When last request occurred"},expiresAt:{type:"string",format:"date-time",nullable:!0,description:"Expiry date of a key"},createdAt:{type:"string",format:"date-time",description:"created at"},updatedAt:{type:"string",format:"date-time",description:"updated at"},metadata:{type:"object",nullable:!0,additionalProperties:!0,description:"Extra metadata about the apiKey"},permissions:{type:"string",nullable:!0,description:"Permissions for the api key (stored as JSON string)"}},required:["id","userId","enabled","rateLimitEnabled","requestCount","createdAt","updatedAt"]}}}}}}}},async t=>{let{configId:r,keyId:i,expiresIn:n,enabled:a,metadata:s,refillAmount:o,refillInterval:l,remaining:c,name:u,permissions:d,rateLimitEnabled:h,rateLimitTimeWindow:p,rateLimitMax:g}=t.body,m=await (0,eAJ.getSessionFromCtx)(t,{disableCookieCache:!0}),f=t.request||t.headers,I=f&&!m?null:m?.user||{id:t.body.userId};if(!I?.id||m&&t.body.userId&&m?.user.id!==t.body.userId)throw eAO.APIError.from("UNAUTHORIZED",eAE.UNAUTHORIZED_SESSION);if(f&&(void 0!==o||void 0!==l||void 0!==g||void 0!==p||void 0!==h||void 0!==c||void 0!==d))throw eAO.APIError.from("BAD_REQUEST",eAE.SERVER_ONLY_PROPERTY);let w=ery(t.context,e,r),C=null;if(!(C=await ert(t,i,w))||!erQ(C.configId,w.configId))throw eAO.APIError.from("NOT_FOUND",eAE.KEY_NOT_FOUND);let y=ery(t.context,e,C.configId);if((y.references??"user")==="organization")await era(t,I.id,C.referenceId,"update");else if(C.referenceId!==I.id)throw eAO.APIError.from("NOT_FOUND",eAE.KEY_NOT_FOUND);let E={};if(void 0!==u){if(u.length<y.minimumNameLength||u.length>y.maximumNameLength)throw eAO.APIError.from("BAD_REQUEST",eAE.INVALID_NAME_LENGTH);E.name=u}if(void 0!==a&&(E.enabled=a),void 0!==n){if(!0===y.keyExpiration.disableCustomExpiresTime)throw eAO.APIError.from("BAD_REQUEST",eAE.KEY_DISABLED_EXPIRATION);if(null!==n){let e=n/86400;if(e<y.keyExpiration.minExpiresIn)throw eAO.APIError.from("BAD_REQUEST",eAE.EXPIRES_IN_IS_TOO_SMALL);if(e>y.keyExpiration.maxExpiresIn)throw eAO.APIError.from("BAD_REQUEST",eAE.EXPIRES_IN_IS_TOO_LARGE)}E.expiresAt=n?ero(n,"sec"):null}if(void 0!==s&&!0===y.enableMetadata){if("object"!=typeof s)throw eAO.APIError.from("BAD_REQUEST",eAE.INVALID_METADATA_TYPE);E.metadata=s}if(void 0!==c&&(E.remaining=c),void 0!==o||void 0!==l){if(void 0!==o&&void 0===l)throw eAO.APIError.from("BAD_REQUEST",eAE.REFILL_AMOUNT_AND_INTERVAL_REQUIRED);if(void 0!==l&&void 0===o)throw eAO.APIError.from("BAD_REQUEST",eAE.REFILL_INTERVAL_AND_AMOUNT_REQUIRED);E.refillAmount=o,E.refillInterval=l}if(void 0!==h&&(E.rateLimitEnabled=h),void 0!==p&&(E.rateLimitTimeWindow=p),void 0!==g&&(E.rateLimitMax=g),void 0!==d&&(E.permissions=JSON.stringify(d)),0===Object.keys(E).length)throw eAO.APIError.from("BAD_REQUEST",eAE.NO_VALUES_TO_UPDATE);let Q=C;try{if("secondary-storage"===y.storage&&y.fallbackToDatabase){let e=await t.context.adapter.update({model:erk,where:[{field:"id",value:C.id}],update:E});e&&(await erA(t,e,y),Q=e)}else if("database"===y.storage){let e=await t.context.adapter.update({model:erk,where:[{field:"id",value:C.id}],update:E});e&&(Q=e)}else{let e={...C,...E,updatedAt:new Date};await erA(t,e,y),Q=e}}catch(e){throw eAO.APIError.fromStatus("INTERNAL_SERVER_ERROR",{message:e?.message})}A(t.context);let B=await eAZ(t,Q,y),{key:b,...D}=Q;return t.json({...D,metadata:B,permissions:D.permissions?(0,eAH.safeJSONParse)(D.permissions):null})})}({configurations:t,schema:A,deleteAllExpiredApiKeys:erb}),deleteApiKey:function({configurations:e,schema:t,deleteAllExpiredApiKeys:A}){return(0,eAQ.createAuthEndpoint)("/api-key/delete",{method:"POST",body:erc,use:[eAJ.sessionMiddleware],metadata:{openapi:{description:"Delete an existing API key",requestBody:{content:{"application/json":{schema:{type:"object",properties:{keyId:{type:"string",description:"The id of the API key to delete"}},required:["keyId"]}}}},responses:{200:{description:"API key deleted successfully",content:{"application/json":{schema:{type:"object",properties:{success:{type:"boolean",description:"Indicates if the API key was successfully deleted"}},required:["success"]}}}}}}}},async t=>{let{configId:r,keyId:i}=t.body,n=t.context.session;if(!0===n.user.banned)throw eAO.APIError.from("UNAUTHORIZED",eAE.USER_BANNED);let a=ery(t.context,e,r),s=null;if(!(s=await ert(t,i,a))||!erQ(s.configId,a.configId))throw eAO.APIError.from("NOT_FOUND",eAE.KEY_NOT_FOUND);let o=ery(t.context,e,s.configId);if((o.references??"user")==="organization")await era(t,n.user.id,s.referenceId,"delete");else if(s.referenceId!==n.user.id)throw eAO.APIError.from("NOT_FOUND",eAE.KEY_NOT_FOUND);try{"secondary-storage"===o.storage&&o.fallbackToDatabase?(await err(t,s,o),await t.context.adapter.delete({model:erk,where:[{field:"id",value:s.id}]})):"database"===o.storage?await t.context.adapter.delete({model:erk,where:[{field:"id",value:s.id}]}):await err(t,s,o)}catch(e){throw eAO.APIError.fromStatus("INTERNAL_SERVER_ERROR",{message:e?.message})}return A(t.context),t.json({success:!0})})}({configurations:t,schema:A,deleteAllExpiredApiKeys:erb}),listApiKeys:function({configurations:e,schema:t,deleteAllExpiredApiKeys:A}){return(0,eAQ.createAuthEndpoint)("/api-key/list",{method:"GET",use:[eAJ.sessionMiddleware],query:erd,metadata:{openapi:{description:"List all API keys for the authenticated user or for a specific organization",responses:{200:{description:"API keys retrieved successfully",content:{"application/json":{schema:{type:"object",properties:{apiKeys:{type:"array",items:{type:"object",properties:{id:{type:"string",description:"ID"},name:{type:"string",nullable:!0,description:"The name of the key"},start:{type:"string",nullable:!0,description:"Shows the first few characters of the API key, including the prefix. This allows you to show those few characters in the UI to make it easier for users to identify the API key."},prefix:{type:"string",nullable:!0,description:"The API Key prefix. Stored as plain text."},userId:{type:"string",description:"The owner of the user id"},refillInterval:{type:"number",nullable:!0,description:"The interval in milliseconds between refills of the `remaining` count. Example: 3600000 // refill every hour (3600000ms = 1h)"},refillAmount:{type:"number",nullable:!0,description:"The amount to refill"},lastRefillAt:{type:"string",format:"date-time",nullable:!0,description:"The last refill date"},enabled:{type:"boolean",description:"Sets if key is enabled or disabled",default:!0},rateLimitEnabled:{type:"boolean",description:"Whether the key has rate limiting enabled"},rateLimitTimeWindow:{type:"number",nullable:!0,description:"The duration in milliseconds"},rateLimitMax:{type:"number",nullable:!0,description:"Maximum amount of requests allowed within a window"},requestCount:{type:"number",description:"The number of requests made within the rate limit time window"},remaining:{type:"number",nullable:!0,description:"Remaining requests (every time api key is used this should updated and should be updated on refill as well)"},lastRequest:{type:"string",format:"date-time",nullable:!0,description:"When last request occurred"},expiresAt:{type:"string",format:"date-time",nullable:!0,description:"Expiry date of a key"},createdAt:{type:"string",format:"date-time",description:"created at"},updatedAt:{type:"string",format:"date-time",description:"updated at"},metadata:{type:"object",nullable:!0,additionalProperties:!0,description:"Extra metadata about the apiKey"},permissions:{type:"string",nullable:!0,description:"Permissions for the api key (stored as JSON string)"}},required:["id","userId","enabled","rateLimitEnabled","requestCount","createdAt","updatedAt"]}},total:{type:"number",description:"Total number of API keys"},limit:{type:"number",nullable:!0,description:"The limit used for pagination"},offset:{type:"number",nullable:!0,description:"The offset used for pagination"}},required:["apiKeys","total"]}}}}}}}},async t=>{let r=t.context.session,i=t.query?.configId,n=t.query?.organizationId,a=t.query?.limit!=null?Number(t.query.limit):void 0,s=t.query?.offset!=null?Number(t.query.offset):void 0;n&&await era(t,r.user.id,n,"read");let o=n??r.user.id,l=n?"organization":"user",c=[];if(i){let{apiKeys:A}=await ern(t,o,ery(t.context,e,i),{limit:void 0,offset:void 0,sortBy:t.query?.sortBy,sortDirection:t.query?.sortDirection});c=A}else{let A=new Map;for(let t of e){let e="database"===t.storage?"database":t.customStorage?`custom:${t.configId??"default"}`:t.fallbackToDatabase?"secondary-storage-with-fallback":"secondary-storage";A.has(e)||A.set(e,t)}let r=await Promise.all([...A.values()].map(e=>ern(t,o,e,{limit:void 0,offset:void 0,sortBy:t.query?.sortBy,sortDirection:t.query?.sortDirection}))),i=new Set;for(let{apiKeys:e}of r)for(let t of e)i.has(t.id)||(i.add(t.id),c.push(t))}let u=c.filter(t=>(e.find(e=>erE(t.configId)?erE(e.configId):e.configId===t.configId)?.references??"user")===l&&t.referenceId===o);i&&(u=u.filter(e=>erQ(e.configId,i)));let d=u.length,h=u;void 0!==s&&(h=h.slice(s)),void 0!==a&&(h=h.slice(0,a)),A(t.context);let p=h.map(e=>{let{key:t,...A}=e;return{...A,metadata:eAY(e.metadata),permissions:A.permissions?(0,eAH.safeJSONParse)(A.permissions):null}}),g=e.find(e=>"database"===e.storage||e.fallbackToDatabase);return g&&await t.context.runInBackgroundOrAwait(eA$(t,h,g)),t.json({apiKeys:p,total:d,limit:a,offset:s})})}({configurations:t,schema:A,deleteAllExpiredApiKeys:erb}),deleteAllExpiredApiKeys:function({deleteAllExpiredApiKeys:e}){return eAQ.createAuthEndpoint.serverOnly({method:"POST"},async t=>{try{await e(t.context,!0)}catch(e){return t.context.logger.error("[API KEY PLUGIN] Failed to delete expired API keys:",e),t.json({success:!1,error:e})}return t.json({success:!0,error:null})})}({deleteAllExpiredApiKeys:erb})}}({defaultKeyGenerator:async e=>{let t=eAV(e.length,"a-z","A-Z");return`${e.prefix||""}${t}`},configurations:A,schema:r});return{id:"api-key",version:"1.6.25",$ERROR_CODES:eAE,hooks:{before:[{matcher:e=>!!i(e),handler:(0,eAQ.createAuthMiddleware)(async e=>{let{key:t,config:n}=i(e);if("string"!=typeof t)throw eAO.APIError.from("BAD_REQUEST",eAE.INVALID_API_KEY_GETTER_RETURN_TYPE);if(t.length<n.defaultKeyLength||n.customAPIKeyValidator&&!await n.customAPIKeyValidator({ctx:e,key:t}))throw eAO.APIError.from("FORBIDDEN",eAE.INVALID_API_KEY);let{apiKey:a}=await erg({key:t,ctx:e,lookupOpts:n,configurations:A,schema:r,expectedConfigId:n.configId}),s=erb(e.context).catch(t=>{e.context.logger.error("Failed to delete expired API keys:",t)});if(n.deferUpdates&&e.context.runInBackground(s),(n.references??"user")!=="user"){let e=eAE.INVALID_REFERENCE_ID_FROM_API_KEY;throw eAO.APIError.from("UNAUTHORIZED",e)}let o=await e.context.internalAdapter.findUserById(a.referenceId);if(!o){let e=eAE.INVALID_REFERENCE_ID_FROM_API_KEY;throw eAO.APIError.from("UNAUTHORIZED",e)}let l={user:o,session:{id:a.id,token:t,userId:a.referenceId,userAgent:e.request?.headers.get("user-agent")??null,ipAddress:e.request?eAx(e.request,e.context.options):null,createdAt:new Date,updatedAt:new Date,expiresAt:a.expiresAt||ero(e.context.options.session?.expiresIn||604800,"ms")}};return(e.context.session=l,"/get-session"===e.path)?l:{context:e}})}]},endpoints:{createApiKey:n.createApiKey,verifyApiKey:n.verifyApiKey,getApiKey:n.getApiKey,updateApiKey:n.updateApiKey,deleteApiKey:n.deleteApiKey,listApiKeys:n.listApiKeys,deleteAllExpiredApiKeys:n.deleteAllExpiredApiKeys},schema:r}}({schema:{apikey:{modelName:"ApiKey"}},defaultPrefix:"aide_",requireName:!0,startingCharactersConfig:{shouldStore:!0,charactersLength:12},keyExpiration:{defaultExpiresIn:null,disableCustomExpiresTime:!1,minExpiresIn:1,maxExpiresIn:3650},rateLimit:{enabled:!1},enableSessionForAPIKeys:!1}),{id:"bearer",version:esP.PACKAGE_VERSION,hooks:{before:[{matcher:e=>!!(e.request?.headers.get("authorization")||e.headers?.get("authorization")),handler:(0,eAQ.createAuthMiddleware)(async e=>{let t,A=e.request?.headers.get("authorization")||e.headers?.get("Authorization");if(!A||"bearer "!==A.slice(0,7).toLowerCase())return;let r=A.slice(7).trim();if(!r)return;if(r.includes("."))t=r.includes("%")?eoi(r):r;else{if(c?.requireSignature)return;t=eoi((await (0,eoA.serializeSignedCookie)("",r,e.context.secret)).replace("=",""))}try{if(!await (0,eor.createHMAC)("SHA-256","base64urlnopad").verify(e.context.secret,t.split(".")[0],t.split(".")[1]))return}catch{return}let i=e.request?.headers||e.headers,n=new Headers({...Object.fromEntries(i?.entries())});return(0,esV.setRequestCookie)(n,e.context.authCookies.sessionToken.name,t),{context:{headers:n}}})}],after:[{matcher:e=>!0,handler:(0,eAQ.createAuthMiddleware)(async e=>{let t=e.context.responseHeaders?.get("set-cookie");if(!t)return;let A=(0,esV.parseSetCookieHeader)(t),r=e.context.authCookies.sessionToken.name,i=A.get(r);if(!i||!i.value||0===i["max-age"])return;let n=i.value,a=new Set((e.context.responseHeaders?.get("access-control-expose-headers")||"").split(",").map(e=>e.trim()).filter(Boolean));a.add("set-auth-token"),e.setHeader("set-auth-token",n),e.setHeader("Access-Control-Expose-Headers",Array.from(a).join(", "))})}]},options:c},(e=>{let t={storeToken:"plain",...e};async function A(e,A){return"hashed"===t.storeToken?await eod(A):"object"==typeof t.storeToken&&"type"in t.storeToken&&"custom-hasher"===t.storeToken.type?await t.storeToken.hash(A):A}async function r(e,r){let i=t?.generateToken?await t.generateToken(r,e):eAV(32),n=new Date(Date.now()+(t?.expiresIn??3)*6e4),a=await A(e,i);return await e.context.internalAdapter.createVerificationValue({value:r.session.token,identifier:`one-time-token:${a}`,expiresAt:n}),i}return{id:"one-time-token",version:esP.PACKAGE_VERSION,endpoints:{generateOneTimeToken:(0,eAQ.createAuthEndpoint)("/one-time-token/generate",{method:"GET",use:[eAJ.sessionMiddleware]},async e=>{if(t?.disableClientRequest&&e.request)throw e.error("BAD_REQUEST",{message:"Client requests are disabled"});let A=e.context.session,i=await r(e,A);return e.json({token:i})}),verifyOneTimeToken:(0,eAQ.createAuthEndpoint)("/one-time-token/verify",{method:"POST",body:eoh},async e=>{let{token:r}=e.body,i=await A(e,r),n=await e.context.internalAdapter.consumeVerificationValue(`one-time-token:${i}`);if(!n)throw e.error("BAD_REQUEST",{message:"Invalid token"});let a=await e.context.internalAdapter.findSession(n.value);if(!a)throw e.error("BAD_REQUEST",{message:"Session not found"});if(t?.disableSetSessionCookie||await (0,er$.setSessionCookie)(e,a),a.session.expiresAt<new Date)throw e.error("BAD_REQUEST",{message:"Session expired"});return e.json(a)})},hooks:{after:[{matcher:()=>!0,handler:(0,eAQ.createAuthMiddleware)(async e=>{if(e.context.newSession){if(!t?.setOttHeaderOnNewSession)return;let A=new Set((e.context.responseHeaders?.get("access-control-expose-headers")||"").split(",").map(e=>e.trim()).filter(Boolean));A.add("set-ott");let i=await r(e,e.context.newSession);e.setHeader("set-ott",i),e.setHeader("Access-Control-Expose-Headers",Array.from(A).join(", "))}})}]},options:e}})({disableClientRequest:!0,expiresIn:1,storeToken:"hashed"}),...d?[d]:[],(u=!1,{id:"next-cookies",version:esP.PACKAGE_VERSION,hooks:{before:[{matcher:e=>"/get-session"===e.path,handler:(0,eAQ.createAuthMiddleware)(async t=>{let A;if(u||(!function(e,t){let A=e.options.plugins||[];if(0===A.length)return;let r=A.findIndex(e=>e.id===t);-1===r||A.slice(r+1).some(e=>e.hooks&&Array.isArray(e.hooks.after)&&e.hooks.after.length>0)&&e.logger.warn(`[better-auth] Cookie integration plugin "${t}" should be placed last in the plugins array. Plugins with \`hooks.after\` running after it may set cookies that are not forwarded to the framework cookie store. Move your cookie integration plugin to the end of the \`plugins\` array to avoid missing \`Set-Cookie\` headers.`)}(t.context,"next-cookies"),u=!0),"_flag"in t&&"router"===t._flag)return;try{let{headers:t}=await e.A(162916);A=await t()}catch{return}let r="1"===A.get("RSC"),i=!!A.get("next-action");r&&!i&&await (0,eiV.setShouldSkipSessionRefresh)(!0)})}],after:[{matcher:e=>!0,handler:(0,eAQ.createAuthMiddleware)(async t=>{let A=t.context.responseHeaders;if((!("_flag"in t)||"router"!==t._flag)&&A instanceof Headers){let t,r=A?.get("set-cookie");if(!r)return;let i=(0,esV.parseSetCookieHeader)(r);try{let{cookies:A}=await e.A(162916);t=await A()}catch(e){if(e instanceof Error&&(e.message.startsWith("`cookies` was called outside a request scope.")||e.message.includes("Cannot find module")))return;throw e}i.forEach((e,A)=>{if(A)try{t.set(A,e.value,(0,esV.toCookieOptions)(e))}catch{}});return}})}]}})]},es_)})(t))),eoB}class eoD extends Error{status;constructor(e,t=401){super(e),this.status=t,this.name="PrincipalResolutionError"}}async function eok(e,t){let A=e.get("x-api-key")?.trim()||null,r=function(e){let t=e.get("authorization");if(!t)return null;if(!t.startsWith("Bearer "))throw new eoD("Authorization must use the Bearer scheme.");let A=t.slice(7).trim();if(!A)throw new eoD("The bearer credential is empty.");return A}(e),i=/(?:^|;\s*)(?:__Secure-)?better-auth\.session_token=/.test(e.get("cookie")??"");if(Number(!!A)+Number(!!r)+Number(i)>1)throw new eoD("Provide exactly one application credential.",400);if(A){let e=await eob(),t=await e.api.verifyApiKey({body:{key:A}});if(!t.valid||!t.key)throw new eoD("The API key is invalid or inactive.");return{kind:"apiKey",apiKeyId:t.key.id,userId:t.key.referenceId,name:t.key.name??null}}if(r?.startsWith("agent_")){if(!t)throw new eoD("Agent credentials are not accepted by this endpoint.");let e=await t.authenticate(r);if(!e)throw new eoD("The agent credential is invalid.");return{kind:"agent",agentId:e}}if(r||i){let t=await eob(),A=await t.api.getSession({headers:e});if(!A?.session||!A.user)throw new eoD("The session is invalid or expired.");return{kind:"user",userId:A.user.id,email:A.user.email,sessionId:A.session.id}}return{kind:"anonymous"}}Symbol.for("mcp.completable"),(B||(B={})).Completable="McpCompletable";let eoS="server:worktree-automations",eov=new Set(["SUCCEEDED","FAILED","CANCELLED","TIMED_OUT"]),eoR=new Set(["SUCCEEDED","FAILED","CANCELLED"]);function eoM(e){let[t,A,r]=e.split("/");if(!t||!A||r)throw Error("A GitHub repository must be in owner/name format");return{owner:t,name:A}}function eoT(e){return{worktreeId:e.worktreeId,state:e.state,conflictWorkflowId:e.conflictWorkflowId,conflictWorkflowChoice:e.conflictWorkflowChoice,lastError:e.lastError,lastSyncedAt:e.lastSyncedAt?.toISOString()??null,updatedAt:e.updatedAt.toISOString()}}function eoU(e){return{...e,mergeMethod:e.mergeMethod,updatedAt:e.updatedAt.toISOString()}}class eox{worktrees;github;jira;workflows;agentControl;polling;timer;running;rerunRequested;constructor(e,t,A,r,i,n){this.worktrees=e,this.github=t,this.jira=A,this.workflows=r,this.agentControl=i,this.polling=n,this.timer=null,this.running=!1,this.rerunRequested=!1,this.agentControl.registerCompletionObserver(async e=>{e.kind===iu&&this.changed()}),this.polling?.register({id:eoS,kind:"WORKTREE_AUTOMATION",runtime:"SERVER",enabled:!0,cadenceSeconds:60,details:{}})}startRuntime(){queueMicrotask(()=>void this.reconcile())}schedule(){this.timer&&clearTimeout(this.timer),this.timer=setTimeout(()=>void this.reconcile(),6e4),this.timer.unref(),this.polling?.schedule(eoS,new Date(Date.now()+6e4))}changed(){if(this.running){this.rerunRequested=!0;return}this.timer&&clearTimeout(this.timer),this.timer=null,queueMicrotask(()=>void this.reconcile())}async stopAutoSyncWork(e){e?.activeJobId&&await this.agentControl.cancelJob(e.activeJobId).catch(()=>null),e?.workflowRunId&&await this.workflows.lifecycle(e.workflowRunId,"CANCEL").catch(()=>null)}async autoSync(e){let t=await aJ(),A=await t.worktreeAutoSync.findUnique({where:{worktreeId:e}});return A?eoT(A):null}async configureAutoSync(e){let t=await aJ(),A=await t.worktree.findFirst({where:{id:e.worktreeId,missingAt:null},select:{id:!0,branch:!0,codebaseId:!0,codebase:{select:{repositoryId:!0}}}});if(!A?.branch)throw Error("Auto Sync requires a branch");await this.stopAutoSyncWork(await t.worktreeAutoSync.findUnique({where:{worktreeId:A.id},select:{activeJobId:!0,workflowRunId:!0}}));let r=e.conflictWorkflowId?.trim()||null;if(r){let e=await t.workflow.findUnique({where:{id:r},select:{enabled:!0,archivedAt:!0,activeVersionId:!0,quickActionKind:!0,quickActionRepositories:{select:{repositoryId:!0}}}});if(!e?.enabled||e.archivedAt||!e.activeVersionId||"MERGE_CONFLICT"!==e.quickActionKind)throw Error("Select an enabled merge-conflict quick action workflow");if(e.quickActionRepositories.length>0&&!e.quickActionRepositories.some(({repositoryId:e})=>e===A.codebase.repositoryId))throw Error("The merge-conflict workflow is not available for this repository")}let i=await t.worktreeAutoSync.upsert({where:{worktreeId:A.id},create:{worktreeId:A.id,branch:A.branch,conflictWorkflowId:r,conflictWorkflowChoice:e.conflictWorkflowChoice?.trim()||null},update:{state:"ACTIVE",branch:A.branch,conflictWorkflowId:r,conflictWorkflowChoice:e.conflictWorkflowChoice?.trim()||null,activeJobId:null,workflowRunId:null,lastError:null}});return this.worktrees.publishAutomationChange(A.id,A.codebaseId),this.changed(),eoT(i)}async cancelAutoSync(e){let t=await aJ(),A=await t.worktreeAutoSync.findUnique({where:{worktreeId:e},select:{activeJobId:!0,workflowRunId:!0}});await this.stopAutoSyncWork(A);let r=await t.worktreeAutoSync.deleteMany({where:{worktreeId:e}});return this.worktrees.publishAutomationChange(e),r.count>0}async retryAutoSync(e){let t=await aJ(),A=await t.worktreeAutoSync.update({where:{worktreeId:e},data:{state:"ACTIVE",activeJobId:null,workflowRunId:null,lastError:null}});return this.worktrees.publishAutomationChange(e),this.changed(),eoT(A)}async autoMerge(e){let t=await aJ(),A=await t.worktreeAutoMerge.findUnique({where:{worktreeId:e}});return A?eoU(A):null}async configureAutoMerge(e){let t=await aJ(),A=await t.worktree.findFirst({where:{id:e.worktreeId,missingAt:null},select:{id:!0,primary:!0,branch:!0,codebaseId:!0,codebase:{select:{repository:{select:{canonicalOrigin:!0}}}}}});if(!A?.branch)throw Error("Auto Merge requires a branch");if(e.deleteWorktree&&A.primary)throw Error("The primary worktree cannot be deleted after merge");let r=await t.worktreeAutoMerge.findUnique({where:{worktreeId:A.id}}),i=await this.worktrees.ticketKeyForWorktree(A.id);if(e.moveTicketToDone){if(!i)throw Error("This worktree is not linked to a Jira ticket");let e=await t.jiraProject.findUnique({where:{key:i.split("-")[0]??""},select:{doneStatusId:!0}});if(!e?.doneStatusId)throw Error("Configure this Jira project's done status before enabling this option")}let n=eoM(e.repositoryNameWithOwner),a=await this.github.pullRequestAutomationState(n.owner,n.name,e.pullRequestNumber);if(a.headRefName!==A.branch)throw Error("The pull request does not belong to this worktree branch");if(!a.headRepositoryNameWithOwner)throw Error("The pull request head repository is unavailable");if(A.codebase.repository.canonicalOrigin.toLowerCase()!==`github.com/${a.headRepositoryNameWithOwner.toLowerCase()}`)throw Error("The pull request head repository does not match this worktree");let s=!!(r&&(r.repositoryNameWithOwner.toLowerCase()!==e.repositoryNameWithOwner.toLowerCase()||r.pullRequestNumber!==e.pullRequestNumber)),o=!1,l=!1;try{if(r&&s){let e=eoM(r.repositoryNameWithOwner),t=await this.github.pullRequestAutomationState(e.owner,e.name,r.pullRequestNumber);"OPEN"===t.state&&t.autoMergeEnabled&&(await this.github.disablePullRequestAutoMerge({...e,number:r.pullRequestNumber},"WORKTREE_AUTOMATION"),o=!0)}l=!0,await this.github.enablePullRequestAutoMerge({...n,number:e.pullRequestNumber,method:e.method,commitHeadline:e.commitHeadline,commitBody:e.commitBody,authorEmail:e.authorEmail},"WORKTREE_AUTOMATION");let a=await t.worktreeAutoMerge.upsert({where:{worktreeId:A.id},create:{worktreeId:A.id,repositoryNameWithOwner:e.repositoryNameWithOwner,pullRequestNumber:e.pullRequestNumber,branch:A.branch,mergeMethod:e.method,commitHeadline:e.commitHeadline.trim(),commitBody:e.commitBody,authorEmail:e.authorEmail?.trim()||null,deleteWorktree:e.deleteWorktree,moveTicketToDone:e.moveTicketToDone,ticketKey:i},update:{state:"ACTIVE",repositoryNameWithOwner:e.repositoryNameWithOwner,pullRequestNumber:e.pullRequestNumber,branch:A.branch,mergeMethod:e.method,commitHeadline:e.commitHeadline.trim(),commitBody:e.commitBody,authorEmail:e.authorEmail?.trim()||null,deleteWorktree:e.deleteWorktree,moveTicketToDone:e.moveTicketToDone,ticketKey:i,ticketMovedAt:null,deleteJobId:null,lastError:null}});return this.worktrees.publishAutomationChange(A.id,A.codebaseId),this.changed(),eoU(a)}catch(t){if(l&&await this.github.disablePullRequestAutoMerge({...n,number:e.pullRequestNumber},"WORKTREE_AUTOMATION").catch(()=>null),r&&(o||!s)){let e=eoM(r.repositoryNameWithOwner);await this.github.enablePullRequestAutoMerge({...e,number:r.pullRequestNumber,method:r.mergeMethod,commitHeadline:r.commitHeadline,commitBody:r.commitBody,authorEmail:r.authorEmail},"WORKTREE_AUTOMATION").catch(()=>null)}throw t}}async cancelAutoMerge(e){let t=await aJ(),A=await t.worktreeAutoMerge.findUnique({where:{worktreeId:e}});if(!A)return!1;let r=eoM(A.repositoryNameWithOwner),i=await this.github.pullRequestAutomationState(r.owner,r.name,A.pullRequestNumber);return"OPEN"===i.state&&i.autoMergeEnabled&&await this.github.disablePullRequestAutoMerge({...r,number:A.pullRequestNumber},"WORKTREE_AUTOMATION"),await t.worktreeAutoMerge.delete({where:{worktreeId:e}}),this.worktrees.publishAutomationChange(e),!0}async retryAutoMerge(e){let t=await aJ(),A=await t.worktreeAutoMerge.findUniqueOrThrow({where:{worktreeId:e}}),r=eoM(A.repositoryNameWithOwner),i="MERGED"===(await this.github.pullRequestAutomationState(r.owner,r.name,A.pullRequestNumber)).state?"POST_MERGE":"ACTIVE",n=await t.worktreeAutoMerge.update({where:{worktreeId:e},data:{state:i,lastError:null,deleteJobId:null}});return this.worktrees.publishAutomationChange(e),this.changed(),eoU(n)}async reconcile(){if(this.running){this.rerunRequested=!0;return}this.running=!0;try{let e=async()=>{do this.rerunRequested=!1,await this.reconcileAutoSync(),await this.reconcileAutoMerge();while(this.rerunRequested)};this.polling?await this.polling.run(eoS,e):await e()}catch{}finally{this.running=!1,this.schedule()}}async reconcileAutoSync(){let e=await aJ();for(let t of(await e.worktreeAutoSync.findMany({where:{state:{in:["ACTIVE","SYNCING","RESOLVING"]}},include:{worktree:{select:{codebaseId:!0}}}})))try{let A=await e.worktree.findUnique({where:{id:t.worktreeId},select:{branch:!0}});if(A?.branch!==t.branch)throw Error("Auto Sync paused because the worktree branch changed");if("ACTIVE"===t.state){let A=await this.worktrees.createAutoSyncJob(t.worktreeId,"SYNC",t.branch,(0,AP.randomUUID)());await e.worktreeAutoSync.update({where:{worktreeId:t.worktreeId},data:{state:"SYNCING",activeJobId:A.id,lastError:null}});continue}if("RESOLVING"===t.state){if(!t.workflowRunId)throw Error("The conflict workflow run is missing");let A=await this.workflows.run(t.workflowRunId);if(!A||!eoR.has(A.status))continue;if("SUCCEEDED"!==A.status)throw Error(`The conflict workflow ${A.status.toLowerCase()}`);let r=await this.worktrees.createAutoSyncJob(t.worktreeId,"FINALIZE",t.branch,(0,AP.randomUUID)());await e.worktreeAutoSync.update({where:{worktreeId:t.worktreeId},data:{state:"SYNCING",activeJobId:r.id,workflowRunId:null}});continue}if(!t.activeJobId)throw Error("The Auto Sync job is missing");let r=await this.agentControl.getJob(t.activeJobId);if(!r||!eov.has(r.status))continue;if("SUCCEEDED"!==r.status)throw Error(r.error||`Auto Sync ${r.status.toLowerCase()}`);let i=function(e){if(!e)return null;try{let t=JSON.parse(e);if(!t||"object"!=typeof t||Array.isArray(t))return null;return"string"==typeof t.outcome?String(t.outcome):null}catch{return null}}(r.resultJson);if("CONFLICT"===i){if(!t.conflictWorkflowId)throw Error("Auto Sync paused because the rebase has merge conflicts");let A=await this.workflows.trigger({workflowId:t.conflictWorkflowId,resourceKind:"WORKTREE",resourceId:t.worktreeId,subjectKey:`auto-sync:${t.worktreeId}:${r.id}`,choice:t.conflictWorkflowChoice});if(!A)throw Error("The conflict workflow did not start");await e.worktreeAutoSync.update({where:{worktreeId:t.worktreeId},data:{state:"RESOLVING",activeJobId:null,workflowRunId:A.id,lastError:null}});continue}if("UNRESOLVED"===i)throw Error("The conflict workflow did not fully resolve the rebase");if("SYNCED"!==i&&"NO_CHANGE"!==i)throw Error("The Auto Sync job returned an unknown result");await e.worktreeAutoSync.update({where:{worktreeId:t.worktreeId},data:{state:"ACTIVE",activeJobId:null,workflowRunId:null,lastError:null,..."SYNCED"===i?{lastSyncedAt:new Date}:{}}})}catch(i){let A=i instanceof Error?i.message:String(i),r=/offline|busy|already has an active job|temporarily/i.test(A);await e.worktreeAutoSync.updateMany({where:{worktreeId:t.worktreeId},data:{state:r?"ACTIVE":"PAUSED",activeJobId:null,workflowRunId:null,lastError:A}})}finally{this.worktrees.publishAutomationChange(t.worktreeId,t.worktree.codebaseId)}}async reconcileAutoMerge(){let e=await aJ();for(let t of(await e.worktreeAutoMerge.findMany({where:{state:{in:["ACTIVE","POST_MERGE"]}},include:{worktree:{select:{codebaseId:!0,branch:!0,headSha:!0,primary:!0}}}})))try{let A=eoM(t.repositoryNameWithOwner);if("ACTIVE"===t.state){let r=await this.github.pullRequestAutomationState(A.owner,A.name,t.pullRequestNumber);if("MERGED"===r.state)await e.worktreeAutoMerge.update({where:{worktreeId:t.worktreeId},data:{state:"POST_MERGE",lastError:null}}),this.rerunRequested=!0;else if("OPEN"!==r.state)throw Error("The pull request closed without merging");else if(!r.autoMergeEnabled)throw Error("GitHub Auto Merge is no longer enabled");continue}if(t.moveTicketToDone&&t.ticketKey&&!t.ticketMovedAt&&(await this.jira.transitionTicketToConfiguredDone(t.ticketKey),await e.worktreeAutoMerge.update({where:{worktreeId:t.worktreeId},data:{ticketMovedAt:new Date,lastError:null}})),!t.deleteWorktree){await e.worktreeAutoMerge.update({where:{worktreeId:t.worktreeId},data:{state:"COMPLETED",lastError:null}});continue}if(t.worktree.primary)throw Error("The primary worktree cannot be deleted");if(!t.deleteJobId){let r=await this.github.pullRequestAutomationState(A.owner,A.name,t.pullRequestNumber);if("MERGED"!==r.state)throw Error("The pull request is no longer merged");if(r.headRefName!==t.branch)throw Error("The merged pull request branch does not match the Auto Merge rule");if(t.worktree.branch!==t.branch)throw Error("The worktree branch changed after Auto Merge completed");if(!t.worktree.headSha||t.worktree.headSha!==r.headRefOid)throw Error("The worktree HEAD does not match the merged pull request");let i=await this.worktrees.deleteWorktree({worktreeId:t.worktreeId,deleteRemoteBranch:!1,requireClean:!0,expectedBranch:t.branch,expectedHeadSha:r.headRefOid,requestId:`auto-merge-${(0,AP.randomUUID)()}`});await e.worktreeAutoMerge.update({where:{worktreeId:t.worktreeId},data:{deleteJobId:i.id,lastError:null}});continue}let r=await this.agentControl.getJob(t.deleteJobId);if(!r||!eov.has(r.status))continue;if("SUCCEEDED"!==r.status)throw Error(r.error||`Worktree deletion ${r.status.toLowerCase()}`);await e.worktreeAutoMerge.updateMany({where:{worktreeId:t.worktreeId},data:{state:"COMPLETED",lastError:null}})}catch(A){await e.worktreeAutoMerge.updateMany({where:{worktreeId:t.worktreeId},data:{state:"ACTION_REQUIRED",lastError:A instanceof Error?A.message:String(A)}})}finally{this.worktrees.publishAutomationChange(t.worktreeId,t.worktree.codebaseId)}}}function eoN(e,t){let A=[],r=e.includes("CLAUDE");return r&&A.push("CLAUDE"),(e.includes("CODEX")||!r&&e.length>0||"GLOBAL"===t&&e.includes("GITHUB_COPILOT"))&&A.push("AGENTS"),A}let eoF="default",eoG=["PREPARING","READY","APPLYING","NEEDS_RESOLUTION"],eoO=["SCAN","READ"],eoJ=[...eoO,"APPLY"],eo_={files:{orderBy:{path:"asc"}},groups:{include:{group:!0}}},eoV={skills:{include:{skill:{include:{files:!0}}}},repositories:{include:{repository:!0}}};function eoP(e,t){if(!e)return t;try{return JSON.parse(e)}catch{return t}}function eoL(e){return[...e.cursorEnabled?["CURSOR"]:[],...e.githubCopilotEnabled?["GITHUB_COPILOT"]:[],...e.codexEnabled?["CODEX"]:[],...e.claudeEnabled?["CLAUDE"]:[],...e.openCodeEnabled?["OPENCODE"]:[]]}function eoH(e,t){return"AGENTS"===t?[".agents","skills"]:"CLAUDE"===t?[".claude","skills"]:"GLOBAL"===e?"CURSOR"===t?[".cursor","skills"]:"GITHUB_COPILOT"===t?[".copilot","skills"]:"CODEX_LEGACY"===t?[".codex","skills"]:[".config","opencode","skills"]:"CURSOR"===t?[".cursor","skills"]:"GITHUB_COPILOT"===t?[".github","skills"]:"CODEX_LEGACY"===t?[".codex","skills"]:[".opencode","skills"]}function eoj(e){return/^[A-Za-z]:[\\/]/.test(e)||e.startsWith("\\\\")?A_.win32:A_.posix}function eoq(e,...t){return eoj(e).join(e,...t)}function eoK(e){return eoj(e).dirname(e)}class eoY{agentControl;constructor(e){this.agentControl=e,this.agentControl.registerCompletionHandler(iL,e=>this.completeScan(e)),this.agentControl.registerCompletionHandler(iH,e=>this.completeRead(e)),this.agentControl.registerCompletionHandler(ij,e=>this.completeApply(e)),this.agentControl.registerConnectionHandler(async()=>{await this.requestAutoReconcile()})}publish(e){aq.publish(a2,{id:e??null}),e&&aq.publish(sw(e),{id:e})}subscribe(){return aq.iterate(a2)}subscribeRun(e){return aq.iterate(sw(e))}async settings(){return(await aJ()).skillSettings.upsert({where:{id:eoF},create:{id:eoF},update:{}})}async overview(e=""){let t=await aJ(),A=e.trim().toLocaleLowerCase(),[r,i,n,a,s,o]=await Promise.all([t.skill.findMany({where:{deletedAt:null},include:eo_,orderBy:{name:"asc"}}),t.skillGroup.findMany({include:eoV,orderBy:{name:"asc"}}),t.skillToolObservation.findMany({include:{agent:!0},orderBy:[{tool:"asc"},{agent:{name:"asc"}}]}),t.skillInstallation.findMany({where:{present:!0},include:{agent:!0,codebase:{include:{repository:!0}},worktree:!0,baseline:!0,skill:!0},orderBy:[{skillName:"asc"},{rootPath:"asc"}]}),this.settings(),t.codebaseRepository.findMany({orderBy:{name:"asc"}})]);return{skills:A?r.filter(e=>[e.name,e.description,...e.groups.map(({group:e})=>e.name)].some(e=>e.toLocaleLowerCase().includes(A))):r,groups:i,observations:n,installations:A?a.filter(e=>[e.skillName,e.description,e.agent.name,e.rootPath,e.codebase?.repository.name??""].some(e=>e.toLocaleLowerCase().includes(A))):a,settings:s,repositories:o}}async getSkill(e){return(await aJ()).skill.findFirst({where:{id:e,deletedAt:null},include:eo_})}async saveSkill(e){let t,A=(t=e.files.map(e=>({path:e.path,contentsBase64:e.contentsBase64,executable:e.executable})),i4({name:e.name,description:e.description,packageHash:i$(t),files:t})),r=[...new Set(e.groupIds)].slice(0,100),i=await aJ();if(await i.skillGroup.count({where:{id:{in:r}}})!==r.length)throw Error("One or more skill groups were not found");let n=await i.skill.findUnique({where:{name:A.name}});if(n&&n.id!==e.id)throw Error("Skill names must be unique");let a=e.id??(0,AP.randomUUID)(),s=e.id?await i.skillGroupSkill.findMany({where:{skillId:a},select:{groupId:!0}}):[];return await i.$transaction(async t=>{await t.skill.upsert({where:{id:a},create:{id:a,name:A.name,description:A.description,syncGlobally:e.syncGlobally,packageHash:A.packageHash},update:{name:A.name,description:A.description,syncGlobally:e.syncGlobally,packageHash:A.packageHash,deletedAt:null}}),await t.skillFile.deleteMany({where:{skillId:a}}),await t.skillFile.createMany({data:A.files.map(e=>{let t=Buffer.from(e.contentsBase64,"base64");return{id:(0,AP.randomUUID)(),skillId:a,path:e.path,contents:t,executable:e.executable,contentHash:(0,AP.createHash)("sha256").update(t).digest("hex")}})}),await t.skillGroupSkill.deleteMany({where:{skillId:a}}),r.length&&await t.skillGroupSkill.createMany({data:r.map(e=>({groupId:e,skillId:a}))})}),this.publish(),await this.scheduleAutoSync([...r,...s.map(e=>e.groupId)]),await this.getSkill(a)}async deleteSkill(e){let t=await aJ(),A=await t.skill.findUnique({where:{id:e},include:{groups:!0}});return!!A&&(await t.skill.update({where:{id:e},data:{deletedAt:new Date}}),this.publish(),await this.scheduleAutoSync(A.groups.map(e=>e.groupId)),!0)}async saveGroup(e){let t=e.name.trim();if(!t||t.length>80)throw Error("Group names must contain 1-80 characters");let A=[...new Set(e.skillIds)].slice(0,500),r=[...new Set(e.repositoryIds)].slice(0,500),i=await aJ(),[n,a,s]=await Promise.all([i.skill.count({where:{id:{in:A},deletedAt:null}}),i.codebaseRepository.count({where:{id:{in:r}}}),i.skillGroup.findUnique({where:{name:t}})]);if(n!==A.length)throw Error("One or more skills were not found");if(a!==r.length)throw Error("One or more repositories were not found");if(s&&s.id!==e.id)throw Error("Group names must be unique");let o=e.id??(0,AP.randomUUID)();return await i.$transaction(async e=>{await e.skillGroup.upsert({where:{id:o},create:{id:o,name:t},update:{name:t}}),await e.skillGroupSkill.deleteMany({where:{groupId:o}}),await e.codebaseRepositorySkillGroup.deleteMany({where:{groupId:o}}),A.length&&await e.skillGroupSkill.createMany({data:A.map(e=>({groupId:o,skillId:e}))}),r.length&&await e.codebaseRepositorySkillGroup.createMany({data:r.map(e=>({groupId:o,repositoryId:e}))})}),this.publish(),await this.scheduleAutoSync([o]),i.skillGroup.findUniqueOrThrow({where:{id:o},include:eoV})}async validateGroupIds(e){let t=[...new Set(e)].slice(0,100),A=await aJ();if(await A.skillGroup.count({where:{id:{in:t}}})!==t.length)throw Error("One or more skill groups were not found");return t}async groupsForRepository(e){let t=await aJ();return(await t.codebaseRepositorySkillGroup.findMany({where:{repositoryId:e},include:{group:!0},orderBy:{group:{name:"asc"}}})).map(e=>e.group)}async deleteGroup(e){let t=await aJ(),A=await t.skillGroup.deleteMany({where:{id:e}});return A.count&&this.publish(),A.count&&(await this.settings()).autoSyncProjectGroups&&await this.prepareSync("GROUP",null,!0),A.count>0}async saveSettings(e){let t=await aJ(),A=await t.skillSettings.upsert({where:{id:eoF},create:{id:eoF,...e},update:e});return this.publish(),A.autoSyncProjectGroups&&await this.prepareSync("GROUP",null,!0),A}async setRepositoryGroups(e,t){let A=await this.validateGroupIds(t),r=await aJ();await r.$transaction(async t=>{await t.codebaseRepositorySkillGroup.deleteMany({where:{repositoryId:e}}),A.length&&await t.codebaseRepositorySkillGroup.createMany({data:A.map(t=>({repositoryId:e,groupId:t}))})}),this.publish(),(await this.settings()).autoSyncProjectGroups&&await this.prepareSync("GROUP",null,!0)}async scheduleAutoSync(e){if((await this.settings()).autoSyncProjectGroups&&e.length)for(let t of[...new Set(e)])await this.prepareSync("GROUP",t,!0)}async requestAutoReconcile(){return(await this.settings()).autoSyncProjectGroups?this.prepareSync("GROUP",null,!0):null}async targets(e){let t=await aJ(),A=await t.codebase.findMany({where:{agentId:e,availability:"AVAILABLE"},include:{worktrees:{where:{missingAt:null}}}}),r=new Map;for(let e of A)for(let t of(r.set(e.folder,{codebaseId:e.id,worktreeId:null,folder:e.folder}),e.worktrees))r.set(t.folder,{codebaseId:e.id,worktreeId:t.id,folder:t.folder});return[...r.values()]}async prepareSync(e,t,A=!1){let r=await aJ();if(t&&!await r.skillGroup.findUnique({where:{id:t}}))throw Error("Skill group not found");if(A){let A=await r.skillSyncRun.findFirst({where:{kind:e,groupId:t??null,status:{in:eoG}},orderBy:{createdAt:"desc"}});if(A)return A}let i=await r.skillSyncRun.create({data:{id:(0,AP.randomUUID)(),kind:e,groupId:t??null,automatic:A,status:"PREPARING"}}),n=eoL(await this.settings()),a=await r.agent.findMany({orderBy:{name:"asc"}});for(let e of a){let t=await r.skillSyncItem.create({data:{id:(0,AP.randomUUID)(),runId:i.id,agentId:e.id,direction:"SCAN",status:"PENDING"}});await this.agentControl.createJob({agentId:e.id,kind:iL,payload:{tools:n,targets:await this.targets(e.id),syncRunId:i.id,syncItemId:t.id},idempotencyKey:`skills:scan:${i.id}:${e.id}`,timeoutSeconds:300,visibility:A?"SYSTEM":"USER"})}return!a.length&&(await r.skillSyncRun.update({where:{id:i.id},data:{status:"READY"}}),A)?this.applyRun(i.id):(this.publish(i.id),this.getRun(i.id))}async getRun(e){return(await aJ()).skillSyncRun.findUnique({where:{id:e},include:{group:!0,items:{include:{skill:!0,installation:{include:{agent:!0}},agent:!0},orderBy:{createdAt:"asc"}}}})}completionIds(e){return eoP(e.payloadJson,{})}async completeScan(e){let{syncRunId:t,syncItemId:A}=this.completionIds(e);if(!t||!A)return;let r=await aJ();if(await r.skillSyncItem.findFirst({where:{id:A,runId:t,direction:"SCAN",status:"PENDING"}})){if("SUCCEEDED"===e.status&&e.resultJson){let t=eoP(e.resultJson,{configuredTools:[],installations:[],warnings:[]}),i=new Date;await r.$transaction(async r=>{for(let A of(await r.skillInstallation.updateMany({where:{agentId:e.agentId},data:{present:!1}}),t.configuredTools))iK.includes(A.tool)&&await r.skillToolObservation.upsert({where:{agentId_tool:{agentId:e.agentId,tool:A.tool}},create:{agentId:e.agentId,tool:A.tool,configured:A.configured,homePath:A.homePath,checkedAt:i},update:{configured:A.configured,homePath:A.homePath,checkedAt:i}});for(let A of t.installations){let t=await r.skill.findUnique({where:{name:A.skillName},select:{id:!0,deletedAt:!0}});await r.skillInstallation.upsert({where:{agentId_rootPath_skillName:{agentId:e.agentId,rootPath:A.rootPath,skillName:A.skillName}},create:{id:(0,AP.randomUUID)(),agentId:e.agentId,skillId:t&&!t.deletedAt?t.id:null,codebaseId:A.codebaseId,worktreeId:A.worktreeId,scope:A.scope,rootKind:A.rootKind,rootPath:A.rootPath,skillName:A.skillName,description:A.description,packageHash:A.packageHash,present:!0,fileCount:A.fileCount,totalBytes:A.totalBytes,tracked:A.tracked,consumersJson:JSON.stringify(A.consumers),lastSeenAt:i},update:{skillId:t&&!t.deletedAt?t.id:void 0,codebaseId:A.codebaseId,worktreeId:A.worktreeId,scope:A.scope,rootKind:A.rootKind,description:A.description,packageHash:A.packageHash,present:!0,fileCount:A.fileCount,totalBytes:A.totalBytes,tracked:A.tracked,consumersJson:JSON.stringify(A.consumers),lastSeenAt:i}})}await r.skillSyncItem.updateMany({where:{id:A,status:"PENDING"},data:{status:"COMPLETE",error:t.warnings?.length?t.warnings.join("\n").slice(0,64e3):null}})})}else await r.skillSyncItem.updateMany({where:{id:A,status:"PENDING"},data:{status:"FAILED",error:e.error??"Skill scan failed"}});await r.skillSyncItem.count({where:{runId:t,direction:"SCAN",status:"PENDING"}})||await this.buildPlan(t),this.publish(t)}}async configuredByAgent(){let e=await aJ(),t=new Set(eoL(await this.settings())),A=await e.skillToolObservation.findMany({where:{configured:!0}}),r=new Map;for(let e of A){if(!t.has(e.tool))continue;let A=r.get(e.agentId)??[];A.push(e.tool),r.set(e.agentId,A)}return r}async desiredLocations(e,t=new Set){let A=await aJ(),r=await this.configuredByAgent(),i=await A.skillToolObservation.findMany({where:{configured:!0}}),n=new Map;for(let e of i)n.set(e.agentId,e.homePath);let a=[];if("ALL"===e.kind){let e=await A.skill.findMany({where:{deletedAt:null,syncGlobally:!0},include:eo_});for(let[A,i]of r){if(t.has(A))continue;let r=n.get(A);if(r)for(let t of eoN(i,"GLOBAL")){let i=eoq(r,...eoH("GLOBAL",t));for(let r of e)a.push({skill:r,agentId:A,codebaseId:null,worktreeId:null,scope:"GLOBAL",rootKind:t,folder:null,rootPath:i,targetPath:eoq(i,r.name)})}}}for(let i of(await A.skillGroup.findMany({where:"GROUP"===e.kind&&e.groupId?{id:e.groupId}:void 0,include:{skills:{where:{skill:{deletedAt:null}},include:{skill:{include:eo_}}},repositories:{include:{repository:{include:{codebases:{where:{availability:"AVAILABLE"},include:{worktrees:{where:{missingAt:null}}}}}}}}}})))for(let e of i.repositories)for(let A of e.repository.codebases){if(t.has(A.agentId))continue;let e=eoN(r.get(A.agentId)??[],"PROJECT");for(let t of[{folder:A.folder,worktreeId:null},...A.worktrees.map(e=>({folder:e.folder,worktreeId:e.id}))])for(let r of e){let e=eoq(t.folder,...eoH("PROJECT",r));for(let n of i.skills)a.push({skill:n.skill,agentId:A.agentId,codebaseId:A.id,worktreeId:t.worktreeId,scope:"PROJECT",rootKind:r,folder:t.folder,rootPath:e,targetPath:eoq(e,n.skill.name)})}}return[...new Map(a.map(e=>[`${e.agentId}\0${e.targetPath}`,e])).values()]}installationWhere(e,t){return{present:!0,...t.size?{agentId:{notIn:[...t]}}:{},..."GROUP"===e.kind?{scope:"PROJECT",...e.groupId?{codebase:{repository:{skillGroups:{some:{groupId:e.groupId}}}}}:{}}:{}}}async buildPlan(e){let t=await aJ(),A=await t.skillSyncRun.findUniqueOrThrow({where:{id:e}}),r=new Set((await t.skillSyncItem.findMany({where:{runId:e,direction:"SCAN",status:"SKIPPED"},select:{agentId:!0}})).flatMap(e=>e.agentId?[e.agentId]:[]));await t.skillSyncItem.deleteMany({where:{runId:e,direction:{not:"SCAN"}}});let[i,n,a,s,o]=await Promise.all([t.skill.findMany({where:{deletedAt:null},include:eo_}),t.skill.findMany({where:{deletedAt:{not:null}}}),t.skillInstallation.findMany({where:this.installationWhere(A,r),include:{baseline:!0}}),this.desiredLocations(A,r),"GROUP"===A.kind&&A.groupId?this.desiredLocations({...A,groupId:null},r):this.desiredLocations(A,r)]),l=new Map(i.map(e=>[e.name,e])),c=new Map(i.map(e=>[e.id,e])),u=new Map(n.map(e=>[e.name,e])),d=new Map(n.map(e=>[e.id,e])),h=new Map;for(let e of a){let t=h.get(e.skillName)??[];t.push(e.packageHash),h.set(e.skillName,t)}let p=new Set([...h].flatMap(([e,t])=>{var A;return(A=l.get(e)?.packageHash??null,new Set(t.filter(e=>null===A||e!==A)).size>1)?[e]:[]})),g=[];for(let t of s)a.find(e=>e.agentId===t.agentId&&e.rootPath===t.rootPath&&e.skillName===t.skill.name)||g.push({id:(0,AP.randomUUID)(),runId:e,skillId:t.skill.id,agentId:t.agentId,direction:"EXPORT",status:"READY",sourceHash:t.skill.packageHash,candidatePackageJson:JSON.stringify({location:t})});for(let A of a){let r=A.baseline?.skillId??A.skillId,i=(r?c.get(r):void 0)??l.get(A.skillName),n=(r?d.get(r):void 0)??u.get(A.skillName),a=!!A.baseline&&!!i&&i.name!==A.skillName,h=s.find(e=>e.agentId===A.agentId&&e.rootPath===A.rootPath&&e.skill.name===A.skillName),f=o.find(e=>e.agentId===A.agentId&&e.rootPath===A.rootPath&&e.skill.name===A.skillName);i&&A.packageHash===i.packageHash&&!A.baseline&&await t.skillSyncBaseline.upsert({where:{installationId:A.id},create:{id:(0,AP.randomUUID)(),installationId:A.id,skillId:i.id,packageHash:i.packageHash},update:{skillId:i.id,packageHash:i.packageHash,syncedAt:new Date}});let I="UNCHANGED",w="COMPLETE";if(n&&A.baseline&&!A.tracked)I="DELETE_MANAGED",w="READY";else if(a)I=A.tracked?"CONFLICT":"DELETE_MANAGED",w=A.tracked?"BLOCKED":"READY";else if(f||!A.baseline||A.tracked)if(i)if(A.packageHash!==i.packageHash){var m;w="CONFLICT"===(I=p.has(A.skillName)?"CONFLICT":(m={databaseHash:i.packageHash,targetHash:A.packageHash,baselineHash:A.baseline?.packageHash??null,tracked:A.tracked}).databaseHash===m.targetHash?"UNCHANGED":m.tracked?"CONFLICT":m.baselineHash===m.databaseHash?"IMPORT":m.baselineHash===m.targetHash?"EXPORT":"CONFLICT")?"BLOCKED":"READY"}else!f&&["CURSOR","GITHUB_COPILOT","CODEX_LEGACY","OPENCODE"].includes(A.rootKind)&&o.some(e=>e.agentId===A.agentId&&e.scope===A.scope&&("GLOBAL"===A.scope||e.codebaseId===A.codebaseId&&e.worktreeId===A.worktreeId)&&e.skill.name===A.skillName&&e.skill.packageHash===A.packageHash)&&!A.tracked&&(I="DELETE_REDUNDANT",w="READY");else w="CONFLICT"==(I=p.has(A.skillName)?"CONFLICT":"IMPORT")||"PROJECT"===A.scope?"BLOCKED":"READY";else I="DELETE_MANAGED",w="READY";g.push({id:(0,AP.randomUUID)(),runId:e,skillId:i?.id??n?.id??null,installationId:A.id,agentId:A.agentId,direction:I,status:w,sourceHash:i?.packageHash??null,targetHash:A.packageHash,candidatePackageJson:JSON.stringify({location:{scope:A.scope,rootKind:A.rootKind,folder:"PROJECT"===A.scope?h?.folder??null:null,skillName:A.skillName},projectGroupRequired:!i&&"PROJECT"===A.scope})})}g.length&&await t.skillSyncItem.createMany({data:g});let f=await t.skillSyncItem.findMany({where:{runId:e,installationId:{not:null},direction:{in:["IMPORT","CONFLICT"]}},include:{installation:!0}}),I=new Map;for(let e of f){if(!e.agentId||!e.installation)continue;let t=I.get(e.agentId)??[];t.push(e),I.set(e.agentId,t)}let w=eoL(await this.settings());for(let[A,r]of I){let i=await t.skillSyncItem.create({data:{id:(0,AP.randomUUID)(),runId:e,agentId:A,direction:"READ",status:"PENDING"}}),n=await this.targets(A);await this.agentControl.createJob({agentId:A,kind:iH,payload:{tools:w,targets:n,requests:r.map(e=>({scope:e.installation.scope,rootKind:e.installation.rootKind,folder:"PROJECT"===e.installation.scope?n.find(t=>t.codebaseId===e.installation.codebaseId&&t.worktreeId===e.installation.worktreeId)?.folder??null:null,skillName:e.installation.skillName})),syncRunId:e,syncItemId:i.id},idempotencyKey:`skills:read:${e}:${A}`,timeoutSeconds:300})}await this.refreshRunStatus(e)}async completeRead(e){let{syncRunId:t,syncItemId:A}=this.completionIds(e);if(!t||!A)return;let r=await aJ();if(await r.skillSyncItem.findFirst({where:{id:A,runId:t,direction:"READ",status:"PENDING"}})){if("SUCCEEDED"===e.status&&e.resultJson){let i=eoP(e.resultJson,{packages:[]}),n=await r.skillSyncItem.findMany({where:{runId:t,agentId:e.agentId,installationId:{not:null},direction:{in:["IMPORT","CONFLICT"]}},include:{installation:!0}});for(let e of i.packages){let t=n.find(t=>t.installation?.skillName===e.package.name&&t.installation?.rootKind===e.rootKind&&t.installation?.scope===e.scope&&("GLOBAL"===e.scope||t.installation?.rootPath===eoq(e.folder,...eoH("PROJECT",e.rootKind))));if(!t)continue;let A=eoP(t.candidatePackageJson,{});await r.skillSyncItem.update({where:{id:t.id},data:{candidatePackageJson:JSON.stringify({...A,package:e.package})}})}await r.skillSyncItem.updateMany({where:{id:A,status:"PENDING"},data:{status:"COMPLETE"}})}else await r.skillSyncItem.updateMany({where:{id:A,status:"PENDING"},data:{status:"FAILED",error:e.error??"Skill package read failed"}});await this.refreshRunStatus(t),this.publish(t)}}async refreshRunStatus(e){let t=await aJ(),A=await t.skillSyncItem.findMany({where:{runId:e}});if(A.some(e=>eoO.includes(e.direction)&&"PENDING"===e.status))return;let r=A.some(e=>"BLOCKED"===e.status),i=A.some(e=>"FAILED"===e.status),n=r?"NEEDS_RESOLUTION":i?"PARTIAL":"READY",a=await t.skillSyncRun.update({where:{id:e},data:{status:n}});this.publish(e),a.automatic&&"READY"===n&&await this.applyRun(e)}async skipPending(e){let t=await aJ();await t.skillSyncRun.findUniqueOrThrow({where:{id:e}});let A=await t.skillSyncItem.findMany({where:{runId:e,direction:{in:eoJ},status:"PENDING",agentId:{not:null}}}),r=[];for(let i of A){if(1!==(await t.skillSyncItem.updateMany({where:{id:i.id,status:"PENDING"},data:{status:"SKIPPED",resolution:"SKIP"}})).count||!i.agentId)continue;r.push(i);let A=await t.agentJob.findUnique({where:{agentId_idempotencyKey:{agentId:i.agentId,idempotencyKey:`skills:${i.direction.toLowerCase()}:${e}:${i.agentId}`}}});A&&await this.agentControl.cancelJob(A.id)}if(!r.length)return this.getRun(e);let i=[...new Set(r.flatMap(e=>"READ"===e.direction&&e.agentId?[e.agentId]:[]))];i.length&&await t.skillSyncItem.updateMany({where:{runId:e,agentId:{in:i},direction:{notIn:eoJ},status:{in:["READY","BLOCKED"]}},data:{status:"SKIPPED",resolution:"SKIP"}});let n=r.filter(e=>"APPLY"===e.direction),a=n.flatMap(e=>{let{deployments:t=[]}=eoP(e.candidatePackageJson,{});return t.map(e=>e.id)});return a.length&&await t.skillDeployment.updateMany({where:{id:{in:a},status:"PENDING"},data:{status:"SKIPPED"}}),r.some(e=>"SCAN"===e.direction)?await t.skillSyncItem.count({where:{runId:e,direction:"SCAN",status:"PENDING"}})||await this.buildPlan(e):i.length&&await this.refreshRunStatus(e),n.length&&(await t.skillSyncItem.count({where:{runId:e,direction:"APPLY",status:"PENDING"}})||await t.skillSyncRun.update({where:{id:e},data:{status:"PARTIAL",finishedAt:new Date}})),this.publish(e),this.getRun(e)}async resolveItem(e){let t=await aJ(),A=await t.skillSyncItem.findUniqueOrThrow({where:{id:e.itemId}});if(!["BLOCKED","READY"].includes(A.status))throw Error("Sync item cannot be resolved");let r=eoP(A.candidatePackageJson,{});if("MANUAL"===e.resolution&&(r.package=i4(e.package,"manual resolution package")),"TARGET"===e.resolution&&!r.package)throw Error("The target package is unavailable");if("DELETE"===e.resolution&&!A.installationId)throw Error("The client skill installation is unavailable");if(r.projectGroupRequired&&["TARGET","MANUAL"].includes(e.resolution)){if(!e.groupId||!await t.skillGroup.findUnique({where:{id:e.groupId}}))throw Error("A project skill import requires a skill group");r.groupId=e.groupId}if(await t.skillSyncItem.update({where:{id:A.id},data:{resolution:e.resolution,direction:"DELETE"===e.resolution?"DELETE_REDUNDANT":A.direction,candidatePackageJson:JSON.stringify(r),status:"SKIP"===e.resolution?"SKIPPED":"READY"}}),["TARGET","MANUAL"].includes(e.resolution)){let e=r.package?.name??null;if(e){let r=(await t.skillSyncItem.findMany({where:{runId:A.runId,id:{not:A.id},direction:"CONFLICT",status:{in:["BLOCKED","READY"]}},include:{skill:!0,installation:!0}})).flatMap(t=>(t.skill?.name??t.installation?.skillName)===e?[t.id]:[]);r.length&&await t.skillSyncItem.updateMany({where:{id:{in:r}},data:{resolution:"DATABASE",status:"READY"}})}}return await this.refreshRunStatus(A.runId),this.getRun(A.runId)}async importCandidates(e){let t=await aJ();for(let A of(await t.skillSyncItem.findMany({where:{runId:e,status:"READY",OR:[{direction:"IMPORT"},{direction:"CONFLICT",resolution:{in:["TARGET","MANUAL"]}}]},include:{installation:!0}}))){let e=eoP(A.candidatePackageJson,{});if(!e.package)continue;let r=await t.skill.findUnique({where:{name:e.package.name},include:eo_}),i=await this.saveSkill({id:r?.id,name:e.package.name,description:e.package.description,syncGlobally:r?.syncGlobally??!e.groupId,groupIds:[...r?.groups.map(e=>e.groupId)??[],...e.groupId?[e.groupId]:[]],files:e.package.files});A.installationId&&(await t.skillInstallation.update({where:{id:A.installationId},data:{skillId:i.id}}),A.targetHash===i.packageHash&&await t.skillSyncBaseline.upsert({where:{installationId:A.installationId},create:{id:(0,AP.randomUUID)(),installationId:A.installationId,skillId:i.id,packageHash:i.packageHash},update:{skillId:i.id,packageHash:i.packageHash,syncedAt:new Date}}))}}async applyRun(e){let t=await aJ(),A=await t.skillSyncRun.findUniqueOrThrow({where:{id:e}});if(await t.skillSyncItem.count({where:{runId:e,status:"BLOCKED"}}))throw Error("Resolve all conflicts before applying sync");await this.importCandidates(e);let r=new Set((await t.skillSyncItem.findMany({where:{runId:e,direction:{in:eoO},status:"SKIPPED"},select:{agentId:!0}})).flatMap(e=>e.agentId?[e.agentId]:[])),i=await this.desiredLocations(A,r),n=await t.skillInstallation.findMany({where:this.installationWhere(A,r)}),a=new Map,s=new Map,o=(e,t)=>{let A=a.get(e)??[];A.push(t),a.set(e,A)},l=(e,t)=>{let A=s.get(e)??[];A.push(t),s.set(e,A)};for(let e of i){let A=n.find(t=>t.agentId===e.agentId&&t.rootPath===e.rootPath&&t.skillName===e.skill.name);if(A?.packageHash===e.skill.packageHash||A?.tracked)continue;o(e.agentId,{kind:"WRITE",scope:e.scope,rootKind:e.rootKind,folder:e.folder,package:function(e){let t=e.files.map(e=>({path:e.path,contentsBase64:Buffer.from(e.contents).toString("base64"),executable:e.executable}));return{name:e.name,description:e.description,packageHash:e.packageHash,files:t}}(e.skill),manageGitExclude:"PROJECT"===e.scope});let r=await t.skillDeployment.upsert({where:{agentId_targetPath:{agentId:e.agentId,targetPath:e.targetPath}},create:{id:(0,AP.randomUUID)(),skillId:e.skill.id,agentId:e.agentId,codebaseId:e.codebaseId,worktreeId:e.worktreeId,scope:e.scope,rootKind:e.rootKind,targetPath:e.targetPath,desiredHash:e.skill.packageHash,status:"PENDING"},update:{skillId:e.skill.id,desiredHash:e.skill.packageHash,status:"PENDING",lastError:null}});l(e.agentId,{id:r.id,desiredHash:e.skill.packageHash})}let c=await t.skillSyncItem.findMany({where:{runId:e,direction:{in:["DELETE_REDUNDANT","DELETE_MANAGED"]},status:"READY"},include:{installation:!0}}),u=new Set(c.flatMap(e=>e.installationId?[e.installationId]:[])),d=n.filter(e=>!u.has(e.id)&&!e.tracked&&["CURSOR","GITHUB_COPILOT","CODEX_LEGACY","OPENCODE"].includes(e.rootKind)&&!i.some(t=>t.agentId===e.agentId&&t.rootPath===e.rootPath&&t.skill.name===e.skillName)&&i.some(t=>t.agentId===e.agentId&&t.scope===e.scope&&("GLOBAL"===e.scope||t.codebaseId===e.codebaseId&&t.worktreeId===e.worktreeId)&&t.skill.name===e.skillName&&t.skill.packageHash===e.packageHash));for(let e of[...c.flatMap(e=>e.installation?[e.installation]:[]),...d]){if(!e||e.tracked)continue;let t=await this.targets(e.agentId),A="PROJECT"===e.scope?t.find(t=>t.codebaseId===e.codebaseId&&t.worktreeId===e.worktreeId)?.folder??null:null;("PROJECT"!==e.scope||A)&&o(e.agentId,{kind:"DELETE",scope:e.scope,rootKind:e.rootKind,folder:A,skillName:e.skillName,manageGitExclude:"PROJECT"===e.scope})}for(let[A,r]of a){let i=await t.skillSyncItem.create({data:{id:(0,AP.randomUUID)(),runId:e,agentId:A,direction:"APPLY",status:"PENDING",candidatePackageJson:JSON.stringify({deployments:s.get(A)??[]})}});await this.agentControl.createJob({agentId:A,kind:ij,payload:{operations:r,syncRunId:e,syncItemId:i.id},idempotencyKey:`skills:apply:${e}:${A}`,timeoutSeconds:600})}return await t.skillSyncRun.update({where:{id:e},data:a.size?{status:"APPLYING"}:{status:"SUCCEEDED",finishedAt:new Date}}),this.publish(e),this.getRun(e)}async completeApply(e){let{syncRunId:t,syncItemId:A}=this.completionIds(e);if(!t||!A)return;let r=await aJ(),i=await r.skillSyncItem.findFirst({where:{id:A,runId:t,direction:"APPLY",status:"PENDING"}});if(!i)return;let n="SUCCEEDED"===e.status,{deployments:a=[]}=eoP(i?.candidatePackageJson??null,{});await r.skillSyncItem.updateMany({where:{id:A,status:"PENDING"},data:{status:n?"COMPLETE":"FAILED",error:n?null:e.error??"Skill apply failed"}});let s=await r.skillDeployment.findMany({where:{id:{in:a.map(e=>e.id)},agentId:e.agentId,status:"PENDING"},include:{skill:{include:{files:!0}}}}),o=eoP(e.resultJson,{});if(n){let t=await this.configuredByAgent();for(let e of s){let A=a.find(t=>t.id===e.id),i=o.results?.find(t=>"WRITE"===t.kind&&t.path===e.targetPath);if(!A||e.desiredHash!==A.desiredHash||i?.packageHash!==A.desiredHash)continue;let n=await r.skillInstallation.upsert({where:{agentId_rootPath_skillName:{agentId:e.agentId,rootPath:eoK(e.targetPath),skillName:e.skill.name}},create:{id:(0,AP.randomUUID)(),skillId:e.skillId,agentId:e.agentId,codebaseId:e.codebaseId,worktreeId:e.worktreeId,scope:e.scope,rootKind:e.rootKind,rootPath:eoK(e.targetPath),skillName:e.skill.name,description:e.skill.description,packageHash:e.desiredHash,present:!0,fileCount:e.skill.files.length,totalBytes:e.skill.files.reduce((e,t)=>e+t.contents.byteLength,0),tracked:!1,consumersJson:JSON.stringify(t.get(e.agentId)??[]),lastSeenAt:new Date},update:{skillId:e.skillId,codebaseId:e.codebaseId,worktreeId:e.worktreeId,scope:e.scope,rootKind:e.rootKind,description:e.skill.description,packageHash:e.desiredHash,present:!0,fileCount:e.skill.files.length,totalBytes:e.skill.files.reduce((e,t)=>e+t.contents.byteLength,0),tracked:!1,consumersJson:JSON.stringify(t.get(e.agentId)??[]),lastSeenAt:new Date}});await r.skillSyncBaseline.upsert({where:{installationId:n.id},create:{id:(0,AP.randomUUID)(),installationId:n.id,skillId:e.skillId,packageHash:e.desiredHash},update:{skillId:e.skillId,packageHash:e.desiredHash,syncedAt:new Date}}),await r.skillDeployment.update({where:{id:e.id},data:{status:"INSTALLED",installedHash:e.desiredHash,lastError:null}})}for(let t of o.results??[])if("DELETE"===t.kind){var l;await r.skillInstallation.updateMany({where:{agentId:e.agentId,rootPath:eoK(t.path),skillName:eoj(l=t.path).basename(l)},data:{present:!1,lastSeenAt:new Date}})}}else for(let t of a)await r.skillDeployment.updateMany({where:{id:t.id,agentId:e.agentId,desiredHash:t.desiredHash,status:"PENDING"},data:{status:"FAILED",lastError:e.error??"Skill apply failed"}});if(!await r.skillSyncItem.count({where:{runId:t,direction:"APPLY",status:"PENDING"}})){let e=await r.skillSyncItem.count({where:{runId:t,direction:"APPLY",status:{in:["FAILED","SKIPPED"]}}});await r.skillSyncRun.update({where:{id:t},data:{status:e?"PARTIAL":"SUCCEEDED",finishedAt:new Date}})}this.publish(t)}}let eoW=/^[A-Za-z_$][A-Za-z0-9_$]*$/;function eo$(e){return function e(t){return null===t?"null":Array.isArray(t)?`[${t.map(e).join(",")}]`:"object"==typeof t?`{${Object.entries(t).sort(([e],[t])=>e.localeCompare(t)).map(([t,A])=>`${JSON.stringify(t)}:${e(A)}`).join(",")}}`:JSON.stringify(t)}(e)}function eoZ(e){return eoW.test(e)?`.${e}`:`[${JSON.stringify(e)}]`}function eoz(e,t){let A={},r=(e,t)=>{if(t&&"object"==typeof t&&!Array.isArray(t)&&Object.getPrototypeOf(t)===Object.prototype){let i=Object.entries(t);if(0===i.length)A[e]=t;else for(let[t,A]of i)r(`${e}${eoZ(t)}`,A)}else A[e]=t};for(let[A,i]of Object.entries(t))r(`${e}${eoZ(A)}`,i);return A}function eoX(e){let t={default:e.defaultParameters,additional:e.additionalParameters};return{...{source:e.entryType,time:e.clientTime,receivedAt:e.receivedAt,deviceIp:e.deviceIp,message:e.message,level:e.level,category:e.category,eventName:e.eventName,eventKind:e.eventKind,levelKind:e.level??e.eventKind,screenName:e.screenName,buildId:e.buildId,sessionId:e.sessionId,attributes:e.attributes,defaultParameters:e.defaultParameters,additionalParameters:e.additionalParameters,parameters:t,detail:"CONSOLE"===e.entryType?e.message:`${e.eventName??""}${e.screenName?` (${e.screenName})`:""}`},...eoz("attributes",e.attributes),...eoz("defaultParameters",e.defaultParameters),...eoz("additionalParameters",e.additionalParameters)}}function eo0(e){return null==e?"":"string"==typeof e?e:"number"==typeof e||"boolean"==typeof e?String(e):eo$(e)}function eo1(e){return Object.entries(eoX(e)).flatMap(([e,t])=>[e,eo0(t)]).join("\n")}let eo8=["CONSOLE","ANALYTICS","UNIFIED"],eo4=["TEXT","GLOB","REGEX"],eo2=["CONTAINS","DOES_NOT_CONTAIN","IS","IS_NOT","MATCHES_GLOB","MATCHES_REGEX","NO_REGEX_MATCH","IS_EMPTY","IS_NOT_EMPTY"],eo3={CONSOLE:["time","level","category","message","buildId","sessionId"],ANALYTICS:["time","eventKind","eventName","screenName","parameters","buildId","sessionId"],UNIFIED:["time","source","levelKind","detail","buildId","sessionId"]},eo6=["gray","stone","red","rose","orange","amber","yellow","lime","green","emerald","teal","cyan","sky","blue","indigo","violet","purple","fuchsia","pink"],eo5=new Map;function eo9(e,t,A){let r;if(t.length>1024)throw Error("Pattern must not exceed 1024 characters");if(!eo4.includes(e))throw Error("Unknown search mode");let i=`${e}\u0000${A?"1":"0"}\u0000${t}`,n=eo5.get(i);if(n)return n;if("TEXT"===e){let e=A?t:t.toLocaleLowerCase();r=t=>(A?t:t.toLocaleLowerCase()).includes(e)}else{let i="GLOB"===e?`^${function(e){let t="";for(let A=0;A<e.length;A+=1){let r=e[A];if("*"===r)t+=".*";else if("?"===r)t+=".";else if("["===r){let r=e.indexOf("]",A+1);if(-1===r)throw Error("Invalid glob pattern: missing ]");{let i=e.slice(A+1,r).replace(/^!/,"^");t+=`[${i}]`,A=r}}else t+=r.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&")}return t}(t)}$`:t,n=new wW.RE2(i,A?"su":"isu");r=e=>n.test(e)}return eo5.set(i,r),eo5.size>100&&eo5.delete(eo5.keys().next().value),r}function eo7(e){return null==e||""===e||Array.isArray(e)&&0===e.length||"object"==typeof e&&!Array.isArray(e)&&0===Object.keys(e).length}function ele(e){return"CONSOLE"===e?["CONSOLE"]:"ANALYTICS"===e?["ANALYTICS"]:["CONSOLE","ANALYTICS"]}function elt(e,t){return"SEPARATOR"!==e.entryType&&!!ele(t.view).includes(e.entryType)&&(!t.search||!!eo9(t.searchMode??"TEXT",t.search,!0===t.caseSensitive)(eo1(e)))&&function(e,t){if(!t)return!0;let A=eoX(e);return Object.entries(t).every(([e,t])=>0===t.length||t.includes(eo0(A[e])))}(e,t.quickFilters)&&function(e,t){if(!t?.conditions.length)return!0;let A=t.conditions.filter(t=>!t.sources?.length||"SEPARATOR"!==e.entryType&&t.sources.includes(e.entryType));if(0===A.length)return!0;let r=eoX(e),i=A.map(e=>(function(e,t){if(!eo2.includes(t.operator))throw Error("Unknown filter operator");let A=e[t.field];if("IS_EMPTY"===t.operator)return eo7(A);if("IS_NOT_EMPTY"===t.operator)return!eo7(A);let r=eo0(A),i=t.value??"",n=!0===t.caseSensitive,a=n?r:r.toLocaleLowerCase(),s=n?i:i.toLocaleLowerCase();if("CONTAINS"===t.operator)return a.includes(s);if("DOES_NOT_CONTAIN"===t.operator)return!a.includes(s);if("IS"===t.operator)return a===s;if("IS_NOT"===t.operator)return a!==s;if("MATCHES_GLOB"===t.operator)return eo9("GLOB",i,n)(r);let o=eo9("REGEX",i,n)(r);return"MATCHES_REGEX"===t.operator?o:!o})(r,e));return"ANY"===t.mode?i.some(Boolean):i.every(Boolean)}(e,t.advancedFilter)}function elA(e){for(let t of(e.search&&eo9(e.searchMode??"TEXT",e.search,!0===e.caseSensitive),e.advancedFilter?.conditions??[]))["MATCHES_GLOB","MATCHES_REGEX","NO_REGEX_MATCH"].includes(t.operator)&&eo9("MATCHES_GLOB"===t.operator?"GLOB":"REGEX",t.value??"",!0===t.caseSensitive)}let elr="default";function eli(e){try{let t=JSON.parse(e);return t&&"object"==typeof t&&!Array.isArray(t)?t:{}}catch{return{}}}function eln(e){return{id:e.id,entryType:e.entryType,clientTime:e.clientTime.toISOString(),receivedAt:e.receivedAt.toISOString(),deviceIp:e.deviceIp,message:e.message,level:e.level,category:e.category,eventName:e.eventName,eventKind:e.eventKind,screenName:e.screenName,buildId:e.buildId,sessionId:e.sessionId,attributes:eli(e.attributesJson),defaultParameters:eli(e.defaultParametersJson),additionalParameters:eli(e.additionalParametersJson),highlightColor:e.highlightColor,separatorKind:e.separatorKind,separatorName:e.separatorName}}function ela(e){if(!eo8.includes(e))throw Error("Unknown telemetry view");return e}function els(e){let t=e.trim();if(!t||t.length>100)throw Error("Name must contain 1-100 characters");return{name:t,normalizedName:t.toLocaleLowerCase()}}function elo(e){let t;try{t=new URL(e.trim())}catch{throw Error("Telemetry URL must be a valid HTTP(S) origin")}if(!["http:","https:"].includes(t.protocol)||t.username||t.password||"/"!==t.pathname&&""!==t.pathname||t.search||t.hash)throw Error("Telemetry URL must be an HTTP(S) origin without a path, credentials, query, or fragment");return t.origin}function ell(e){return e?.trim()?elo(e):null}function elc(e){if(!e?.trim())return null;try{let t=new URL(e.trim());return["http:","https:"].includes(t.protocol)?t.origin:null}catch{return null}}function elu(e){if(!e)return null;try{let t=JSON.parse(Buffer.from(e,"base64url").toString("utf8"));if(t&&"object"==typeof t&&"string"==typeof t.clientTime&&"string"==typeof t.receivedAt&&"string"==typeof t.id&&Number.isFinite(Date.parse(t.clientTime))&&Number.isFinite(Date.parse(t.receivedAt)))return t}catch{}throw Error("Invalid telemetry cursor")}function eld(e){let t=new Date(e.clientTime),A=new Date(e.receivedAt);return{OR:[{clientTime:{lt:t}},{clientTime:t,receivedAt:{lt:A}},{clientTime:t,receivedAt:A,id:{lt:e.id}}]}}function elh(e){return Buffer.from(JSON.stringify({clientTime:e.clientTime,receivedAt:e.receivedAt,id:e.id})).toString("base64url")}function elp(e,t){return e.clientTime!==t.clientTime?e.clientTime<t.clientTime:e.receivedAt!==t.receivedAt?e.receivedAt<t.receivedAt:e.id<t.id}function elg(e){return!!(e.search||Object.values(e.quickFilters??{}).some(e=>e.length)||e.advancedFilter?.conditions.length)}function elm(e){return{entryType:{in:ele(e)}}}let elf={source:{name:"entryType",nullable:!1},deviceIp:{name:"deviceIp",nullable:!0},message:{name:"message",nullable:!0},level:{name:"level",nullable:!0},category:{name:"category",nullable:!0},eventName:{name:"eventName",nullable:!0},eventKind:{name:"eventKind",nullable:!0},screenName:{name:"screenName",nullable:!0},buildId:{name:"buildId",nullable:!0},sessionId:{name:"sessionId",nullable:!0}};function elI(e){let t=[...new Set(e.map(e=>e.trim()).filter(Boolean))];if(0===t.length||t.length>100||t.some(e=>e.length>512))throw Error("Columns must contain 1-100 valid column identifiers");return JSON.stringify(t)}function elw(e,t){try{let t=JSON.parse(e);if(Array.isArray(t)&&t.every(e=>"string"==typeof e)&&t.length)return t}catch{}return eo3[t]}class elC{subscribe(){return aq.iterate(sg)}subscribeSettings(){return aq.iterate(sm)}publish(e,t){aq.publish(sg,{ids:e,reason:t})}notifyChange(e,t){this.publish(e,t)}async rawSettings(){return(await aJ()).telemetrySettings.upsert({where:{id:elr},create:{id:elr},update:{}})}async settings(e={}){let[t,A]=await Promise.all([this.rawSettings(),Promise.resolve(function(e={}){let t,A=elc(e.requestOrigin),r=(e.localOrigins??function(){let e=Number(process.env.PORT??3e3),t=Number.isInteger(e)&&e>0&&e<=65535?e:3e3;var A=(0,esw.networkInterfaces)();let r=new Set;for(let e of Object.values(A))for(let A of e??[])A&&!A.internal&&("IPv4"===A.family?r.add(`http://${A.address}:${t}`):"IPv6"!==A.family||A.address.toLowerCase().startsWith("fe80:")||r.add(`http://[${A.address}]:${t}`));return[...r]}()).flatMap(e=>{try{return[elo(e)]}catch{return[]}}),i=elc(e.publicBaseUrl??process.env.PUBLIC_BASE_URL),n=!!A&&("localhost"===(t=new URL(A).hostname.toLowerCase().replace(/^\[|\]$/g,""))||"::1"===t||t.endsWith(".local")||/^127\./.test(t)||/^10\./.test(t)||/^192\.168\./.test(t)||/^172\.(1[6-9]|2\d|3[01])\./.test(t)),a=A&&n?A:r[0]??A??"http://127.0.0.1:3000",s=i??A??a;return{local:a,remote:s}}(e))]);return{localBaseUrlOverride:t.localBaseUrlOverride,remoteBaseUrlOverride:t.remoteBaseUrlOverride,consoleCollectionEnabled:t.consoleCollectionEnabled,analyticsCollectionEnabled:t.analyticsCollectionEnabled,detectedLocalBaseUrl:A.local,detectedRemoteBaseUrl:A.remote,effectiveLocalBaseUrl:t.localBaseUrlOverride??A.local,effectiveRemoteBaseUrl:t.remoteBaseUrlOverride??A.remote,updatedAt:t.updatedAt.toISOString()}}async saveSettings(e,t={}){let A=await aJ(),r=await this.rawSettings(),i=await A.telemetrySettings.update({where:{id:elr},data:{localBaseUrlOverride:void 0===e.localBaseUrlOverride?r.localBaseUrlOverride:ell(e.localBaseUrlOverride),remoteBaseUrlOverride:void 0===e.remoteBaseUrlOverride?r.remoteBaseUrlOverride:ell(e.remoteBaseUrlOverride),consoleCollectionEnabled:e.consoleCollectionEnabled??r.consoleCollectionEnabled,analyticsCollectionEnabled:e.analyticsCollectionEnabled??r.analyticsCollectionEnabled}});return aq.publish(sm,{updatedAt:i.updatedAt.toISOString()}),this.settings(t)}async buildSettings(e,t={}){let A=await this.settings(t),r="SIMULATOR"===e?A.effectiveLocalBaseUrl:A.effectiveRemoteBaseUrl;return{localBaseUrl:A.effectiveLocalBaseUrl,remoteBaseUrl:A.effectiveRemoteBaseUrl,selectedBaseUrl:r,consoleLogsUrl:`${r}/api/telemetry/console-logs`,analyticsEventsUrl:`${r}/api/telemetry/analytics-events`,consoleCollectionEnabled:A.consoleCollectionEnabled,analyticsCollectionEnabled:A.analyticsCollectionEnabled}}async ingestConsole(e,t){if(!(await this.rawSettings()).consoleCollectionEnabled)return{collected:!1,items:[]};let A=await aJ(),r=new Date,i=e.map(e=>{let A={id:(0,AP.randomUUID)(),entryType:"CONSOLE",clientTime:new Date(e.time),receivedAt:r,deviceIp:t,message:e.message,level:e.level,category:e.category,buildId:e.buildId,sessionId:e.sessionId,attributesJson:JSON.stringify(e.attributes),searchText:""},i=eln({...A,eventName:null,eventKind:null,screenName:null,defaultParametersJson:"{}",additionalParametersJson:"{}",highlightColor:null,separatorKind:null,separatorName:null});return{...A,searchText:eo1(i)}});return await A.telemetryEntry.createMany({data:i}),this.publish(i.map(({id:e})=>e),"INGESTED"),{collected:!0,items:i.map(({id:e})=>({id:e,receivedAt:r.toISOString(),deviceIp:t}))}}async ingestAnalytics(e,t){if(!(await this.rawSettings()).analyticsCollectionEnabled)return{collected:!1,items:[]};let A=await aJ(),r=new Date,i=e.map(e=>{let A={id:(0,AP.randomUUID)(),entryType:"ANALYTICS",clientTime:new Date(e.time),receivedAt:r,deviceIp:t,eventName:e.eventName,eventKind:e.kind,screenName:e.screenName,buildId:e.buildId,sessionId:e.sessionId,defaultParametersJson:JSON.stringify(e.defaultParameters),additionalParametersJson:JSON.stringify(e.additionalParameters),searchText:""},i=eln({...A,message:null,level:null,category:null,attributesJson:"{}",highlightColor:null,separatorKind:null,separatorName:null});return{...A,searchText:eo1(i)}});return await A.telemetryEntry.createMany({data:i}),this.publish(i.map(({id:e})=>e),"INGESTED"),{collected:!0,items:i.map(({id:e})=>({id:e,receivedAt:r.toISOString(),deviceIp:t}))}}async scan(e,t,A=1e3){let r=await aJ(),i=null;for(;;){let n=await r.telemetryEntry.findMany({where:i?{AND:[e,{OR:[{clientTime:{lt:i.clientTime}},{clientTime:i.clientTime,receivedAt:{lt:i.receivedAt}},{clientTime:i.clientTime,receivedAt:i.receivedAt,id:{lt:i.id}}]}]}:e,orderBy:[{clientTime:"desc"},{receivedAt:"desc"},{id:"desc"}],take:A});for(let e of n)if(await t(eln(e))===!1)return;if(n.length<A)break;i=n.at(-1)}}async timeline(e){let t=ela(e.view);elA(e);let A=Math.min(500,Math.max(1,e.first??200)),r=elu(e.after),i=await aJ(),n=await i.telemetryEntry.count({where:elm(t)}),a=elg(e);if(!a){let e=[],i=0,a=!1,s=null,o=!1,l={entryType:{in:[...ele(t),"SEPARATOR"]}};return(await this.scan(r?{AND:[l,eld(r)]}:l,t=>{if("SEPARATOR"===t.entryType){o&&e.push(t),o=!1;return}if(i<A){e.push(t),i+=1,s=t,o=!0;return}return a=!0,!1},Math.min(1e3,A+1)),s)?{items:e,nextCursor:a?elh(s):null,matchingCount:n,totalCount:n}:{items:[],nextCursor:null,matchingCount:n,totalCount:n}}let s=[],o=0,l=!1,c=0,u=null,d=!1,h=!1,p=function(e){let t=[];for(let[A,r]of(e.search&&(e.searchMode??"TEXT")==="TEXT"&&!0===e.caseSensitive&&t.push({searchText:{contains:e.search}}),Object.entries(e.quickFilters??{}))){if(!r.length)continue;let e=elf[A];if(!e)continue;let i=function(e,t){let A=[...new Set(t)],r=A.filter(Boolean),i=[];return(r.length&&i.push({[e.name]:{in:r}}),A.includes("")&&(i.push({[e.name]:""}),e.nullable&&i.push({[e.name]:null})),0===i.length)?null:1===i.length?i[0]:{OR:i}}(e,r);i&&t.push(i)}if(e.advancedFilter?.mode==="ALL")for(let A of e.advancedFilter.conditions){if(A.sources?.length||!0!==A.caseSensitive)continue;let e=elf[A.field],r=A.value??"";e&&r&&("IS"===A.operator?t.push({[e.name]:r}):"CONTAINS"===A.operator&&t.push({[e.name]:{contains:r}}))}return t.length?1===t.length?t[0]:{AND:t}:null}(e);return(await this.scan(p?{OR:[{entryType:"SEPARATOR"},{AND:[elm(t),p]}]}:{entryType:{in:[...ele(t),"SEPARATOR"]}},t=>{if("SEPARATOR"===t.entryType){(!r||elp(t,r))&&(!a&&!l||a&&d&&!h)&&s.push(t),d=!1,h=!1;return}!elt(t,e)||(o+=1,(!r||elp(t,r))&&(c<A?(s.push(t),c+=1,u=t,d=!0):(l=!0,h=!0)))}),u)?{items:s,nextCursor:l?elh(u):null,matchingCount:o,totalCount:n}:{items:[],nextCursor:null,matchingCount:o,totalCount:n}}async entries(e){let t=await aJ(),A=[...new Set(e)].slice(0,1e3);return(await t.telemetryEntry.findMany({where:{id:{in:A}}})).map(eln)}async entry(e,t){let A=ela(t),r=(await this.entries([e]))[0]??null;if(!r)return null;if("SEPARATOR"===r.entryType||!ele(A).includes(r.entryType))throw Error(`Telemetry entry ${e} does not belong to ${A}`);return r}async latestSeparator(){let e=await aJ(),t=await e.telemetryEntry.findFirst({where:{entryType:"SEPARATOR"},orderBy:[{clientTime:"desc"},{receivedAt:"desc"},{id:"desc"}]});return t?eln(t):null}async separators(e){let t=Math.min(500,Math.max(1,e.first??100)),A=elu(e.after),r=[{entryType:"SEPARATOR"}];e.kind?.trim()&&r.push({separatorKind:e.kind.trim()}),e.name?.trim()&&r.push({separatorName:{contains:e.name.trim()}}),e.buildId?.trim()&&r.push({buildId:e.buildId.trim()}),A&&r.push(eld(A));let i=await aJ(),n=await i.telemetryEntry.findMany({where:{AND:r},orderBy:[{clientTime:"desc"},{receivedAt:"desc"},{id:"desc"}],take:t+1}),a=n.length>t,s=n.slice(0,t).map(eln);return{items:s,nextCursor:a&&s.length?elh(s.at(-1)):null}}async timelineSinceLatestSeparator(e){let t,A,r=ela(e.view);elA(e);let i=Math.min(500,Math.max(1,e.first??200)),n=elu(e.after),a=await this.latestSeparator(),s=a?{clientTime:a.clientTime,receivedAt:a.receivedAt,id:a.id}:null,o=elg(e),l=s?{AND:[elm(r),(t=new Date(s.clientTime),{OR:[{clientTime:{gt:t}},{clientTime:t,receivedAt:{gt:A=new Date(s.receivedAt)}},{clientTime:t,receivedAt:A,id:{gt:s.id}}]})]}:elm(r);if(!o){let e=await aJ(),t=await e.telemetryEntry.count({where:l}),A=[],r=!1,s=null;return await this.scan(n?{AND:[l,eld(n)]}:l,e=>{if(A.length<i){A.push(e),s=e;return}return r=!0,!1},Math.min(1e3,i+1)),{separator:a,items:A,nextCursor:r&&s?elh(s):null,matchingCount:t,totalCount:t}}let c=[],u=0,d=0,h=!1,p=null;return await this.scan(l,t=>{d+=1,!elt(t,e)||(u+=1,(!n||elp(t,n))&&(c.length<i?(c.push(t),p=t):h=!0))}),{separator:a,items:c,nextCursor:h&&p?elh(p):null,matchingCount:u,totalCount:d}}async facets(e){let t=ela(e),A="CONSOLE"===t?["level","category","deviceIp","buildId","sessionId"]:"ANALYTICS"===t?["eventKind","eventName","screenName","deviceIp","buildId","sessionId"]:["source","level","eventKind","deviceIp","buildId","sessionId"],r=Object.fromEntries(A.map(e=>[e,new Set]));return await this.scan(elm(t),e=>{let i=eoX(e);for(let e of A){let t=i[e];null!=t&&""!==String(t)&&r[e].add(String(t))}"UNIFIED"===t&&r.source.add(e.entryType)}),Object.fromEntries(Object.entries(r).map(([e,t])=>[e,[...t].sort((e,t)=>e.localeCompare(t))]))}async fields(e){let t=ela(e),A=new Set;return await this.scan(elm(t),e=>{for(let t of Object.keys(eoX(e)))A.add(t)}),[...A].sort((e,t)=>e.localeCompare(t))}async addSeparator(e){let t=e?.trim()||null;if(t&&t.length>100)throw Error("Separator name must not exceed 100 characters");let A=await aJ(),r=await A.telemetryEntry.create({data:{id:(0,AP.randomUUID)(),entryType:"SEPARATOR",clientTime:new Date,receivedAt:new Date,separatorKind:"MANUAL",separatorName:t}});return this.publish([r.id],"SEPARATOR_ADDED"),eln(r)}async addBuildSeparator(e){let t=await aJ(),A=await t.telemetryEntry.upsert({where:{separatorKind_buildId:{separatorKind:"BUILD",buildId:e.buildId}},create:{id:(0,AP.randomUUID)(),entryType:"SEPARATOR",clientTime:e.clientTime??new Date,receivedAt:new Date,separatorKind:"BUILD",separatorName:e.name.slice(0,100),buildId:e.buildId},update:{}});return this.publish([A.id],"BUILD_SEPARATOR_ADDED"),eln(A)}async highlight(e,t){if(null!==t&&!eo6.includes(t))throw Error("Unknown telemetry highlight color");let A=await aJ();if("SEPARATOR"===(await A.telemetryEntry.findUniqueOrThrow({where:{id:e}})).entryType)throw Error("Separators cannot be highlighted");let r=await A.telemetryEntry.update({where:{id:e},data:{highlightColor:t}});return this.publish([e],"HIGHLIGHT_CHANGED"),eln(r)}selectionRanges(e){return(Array.isArray(e.ranges)?e.ranges.slice(0,500):[]).map(e=>{if(!e||"object"!=typeof e)throw Error("Invalid telemetry selection range");let t=e.startTime?Date.parse(e.startTime):null,A=e.endTime?Date.parse(e.endTime):null;if(null!==t&&!Number.isFinite(t)||null!==A&&!Number.isFinite(A)||null!==t&&null!==A&&t>=A)throw Error("Invalid telemetry selection range");return{start:t,end:A,includeSeparators:!0===e.includeSeparators}})}async selectionIds(e){let t=new Set((Array.isArray(e.ids)?e.ids:[]).filter(e=>"string"==typeof e).slice(0,1e5)),A=new Set((Array.isArray(e.excludedIds)?e.excludedIds:[]).filter(e=>"string"==typeof e).slice(0,1e5));if(!e.query){for(let e of A)t.delete(e);return[...t]}if("object"!=typeof e.query||Array.isArray(e.query))throw Error("Invalid telemetry selection query");ela(e.query.view),elA(e.query);let r=this.selectionRanges(e);return await this.scan(e.includeSeparators||r.some(e=>e.includeSeparators)?{entryType:{in:[...ele(e.query.view),"SEPARATOR"]}}:elm(e.query.view),i=>{let n=Date.parse(i.clientTime),a=r.filter(e=>(null===e.start||n>=e.start)&&(null===e.end||n<e.end));if((!(r.length>0)||0!==a.length)&&!A.has(i.id)){if("SEPARATOR"===i.entryType){(e.includeSeparators||a.some(e=>e.includeSeparators))&&t.add(i.id);return}elt(i,e.query)&&t.add(i.id)}}),[...t]}async clearSelected(e){let t=await this.selectionIds(e);if(!t.length)return 0;let A=await aJ(),r=0;for(let e=0;e<t.length;e+=500)r+=(await A.telemetryEntry.deleteMany({where:{id:{in:t.slice(e,e+500)}}})).count;return this.publish([],"CLEARED"),r}async clearAll(e,t=!1){let A=ela(e),r=await aJ(),i=await r.telemetryEntry.deleteMany({where:t?{entryType:{in:[...ele(A),"SEPARATOR"]}}:elm(A)});return this.publish([],t?"CLEARED_WITH_SEPARATORS":"CLEARED"),i.count}async clearBeforeLatestSeparator(e,t=!1){let A=ela(e),r=await this.latestSeparator();if(!r)return 0;let i=await aJ(),n=await i.telemetryEntry.deleteMany({where:{AND:[t?{entryType:{in:[...ele(A),"SEPARATOR"]}}:elm(A),eld({clientTime:r.clientTime,receivedAt:r.receivedAt,id:r.id})]}});return this.publish([],"CLEARED_BEFORE_SEPARATOR"),n.count}async clearScoped(e){let t=ela(e.view);if("ALL"===e.scope)return this.clearAll(t,!!e.includeSeparators);if("BEFORE_LATEST_SEPARATOR"===e.scope)return this.clearBeforeLatestSeparator(t,!!e.includeSeparators);if("MATCHING"===e.scope){if(!e.query)throw Error("A matching query is required");return this.clearSelected({query:{...e.query,view:t}})}let A=[...new Set(e.ids??[])].slice(0,1e3);if(!A.length)throw Error("At least one telemetry entry ID is required");let r=await aJ(),i=await r.telemetryEntry.findMany({where:{id:{in:A},entryType:{in:[...ele(t),"SEPARATOR"]}},select:{id:!0}});if(!i.length)return 0;let n=await r.telemetryEntry.deleteMany({where:{id:{in:i.map(({id:e})=>e)}}});return this.publish([],"CLEARED"),n.count}async viewSettings(e){let t=ela(e),A=await aJ(),r=await A.telemetryViewSettings.upsert({where:{view:t},create:{id:t,view:t,columnsJson:JSON.stringify(eo3[t])},update:{}});return{view:t,columns:elw(r.columnsJson,t),timeFormat:"24"===r.timeFormat?"24":"12",activeColumnPresetId:r.activeColumnPresetId,activeSavedFilterId:r.activeSavedFilterId}}async saveViewSettings(e){let t=ela(e.view);if(e.timeFormat&&!["12","24"].includes(e.timeFormat))throw Error("Unknown time format");let A=await this.viewSettings(t),r=await aJ();return await r.telemetryViewSettings.upsert({where:{view:t},create:{id:t,view:t,columnsJson:elI(e.columns??A.columns),timeFormat:e.timeFormat??A.timeFormat,activeColumnPresetId:e.activeColumnPresetId??null,activeSavedFilterId:e.activeSavedFilterId??null},update:{columnsJson:e.columns?elI(e.columns):void 0,timeFormat:e.timeFormat??void 0,activeColumnPresetId:void 0===e.activeColumnPresetId?void 0:e.activeColumnPresetId,activeSavedFilterId:void 0===e.activeSavedFilterId?void 0:e.activeSavedFilterId}}),this.viewSettings(t)}async columnPresets(e){let t=ela(e),A=await aJ();return(await A.telemetryColumnPreset.findMany({where:{view:t},orderBy:[{isDefault:"desc"},{name:"asc"}]})).map(e=>({id:e.id,view:t,name:e.name,columns:elw(e.columnsJson,t),isDefault:e.isDefault,createdAt:e.createdAt.toISOString(),updatedAt:e.updatedAt.toISOString()}))}async saveColumnPreset(e){let t=ela(e.view),{name:A,normalizedName:r}=els(e.name),i=await aJ(),n=e.id??(0,AP.randomUUID)();return await i.$transaction(async i=>{e.isDefault&&await i.telemetryColumnPreset.updateMany({where:{view:t},data:{isDefault:!1}}),await i.telemetryColumnPreset.upsert({where:{id:n},create:{id:n,view:t,name:A,normalizedName:r,columnsJson:elI(e.columns),isDefault:!0===e.isDefault},update:{name:A,normalizedName:r,columnsJson:elI(e.columns),isDefault:e.isDefault??void 0}})}),(await this.columnPresets(t)).find(e=>e.id===n)}async deleteColumnPreset(e){let t=await aJ();return await t.telemetryViewSettings.updateMany({where:{activeColumnPresetId:e},data:{activeColumnPresetId:null}}),(await t.telemetryColumnPreset.deleteMany({where:{id:e}})).count>0}async savedFilters(e){let t=ela(e),A=await aJ();return(await A.telemetrySavedFilter.findMany({where:{view:t},orderBy:{name:"asc"}})).map(e=>({id:e.id,view:t,name:e.name,definition:JSON.parse(e.definitionJson),createdAt:e.createdAt.toISOString(),updatedAt:e.updatedAt.toISOString()}))}async saveFilter(e){let t=ela(e.view);elA({view:t,advancedFilter:e.definition});let{name:A,normalizedName:r}=els(e.name),i=await aJ(),n=e.id??(0,AP.randomUUID)();return await i.telemetrySavedFilter.upsert({where:{id:n},create:{id:n,view:t,name:A,normalizedName:r,definitionJson:eo$(e.definition)},update:{name:A,normalizedName:r,definitionJson:eo$(e.definition)}}),(await this.savedFilters(t)).find(e=>e.id===n)}async deleteFilter(e){let t=await aJ();return await t.telemetryViewSettings.updateMany({where:{activeSavedFilterId:e},data:{activeSavedFilterId:null}}),(await t.telemetrySavedFilter.deleteMany({where:{id:e}})).count>0}async exportEntries(e){elA(e.query);let t=e.selection??(e.ids?.length?{ids:e.ids}:null);if(t){let e=new Set(await this.selectionIds(t)),A=[],r=[...e];for(let e=0;e<r.length;e+=500)await this.scan({id:{in:r.slice(e,e+500)}},e=>{A.push(e)});return A.sort((e,t)=>{let A=t.clientTime.localeCompare(e.clientTime);return A||t.receivedAt.localeCompare(e.receivedAt)||t.id.localeCompare(e.id)}),A}let A=[],r=!1,i=elg(e.query);return await this.scan({entryType:{in:[...ele(e.query.view),"SEPARATOR"]}},t=>{"SEPARATOR"===t.entryType?((!i||r)&&A.push(t),r=!1):elt(t,e.query)&&(A.push(t),r=!0)}),A}}let ely={type:"object",required:["collected","items"],properties:{collected:{type:"boolean"},items:{type:"array",items:{type:"object",required:["id","receivedAt","deviceIp"],properties:{id:{type:"string",format:"uuid"},receivedAt:{type:"string",format:"date-time"},deviceIp:{type:"string"}}}}}};function elE(e,t,A){return{post:{tags:["Telemetry"],summary:A,description:"Unauthenticated ingestion. Accepts one record or an atomic `{ items: [...] }` batch of at most 500 records. The request body is capped at 2 MiB.",requestBody:{required:!0,content:{"application/json":{schema:{oneOf:[e,{type:"object",additionalProperties:!1,required:["items"],properties:{items:{type:"array",minItems:1,maxItems:500,items:e}}}]},examples:{single:{value:t},batch:{value:{items:[t]}}}}}},responses:{201:{description:"Records collected",content:{"application/json":{schema:ely}}},202:{description:"Payload valid but collection is disabled",content:{"application/json":{schema:ely}}},400:{$ref:"#/components/responses/TelemetryBadRequest"},413:{$ref:"#/components/responses/TelemetryPayloadTooLarge"},415:{$ref:"#/components/responses/TelemetryUnsupportedMediaType"},500:{$ref:"#/components/responses/InternalError"}}}}}function elQ(e){if(!e)return{};let t=JSON.parse(e);return t&&"object"==typeof t&&!Array.isArray(t)?t:{}}function elB(e){if(!e)return null;let t=new Date(e);return Number.isNaN(t.valueOf())?null:t}function elb(e){try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>"string"==typeof e):[]}catch{return[]}}elE({$ref:"#/components/schemas/ConsoleLogInput"},{message:"Checkout completed",time:"2026-07-20T18:30:00.000Z",level:"info",category:"checkout",buildId:"build-123",sessionId:"session-456",attributes:{durationMs:412,cache:{hit:!0}}},"Collect console logs"),elE({$ref:"#/components/schemas/AnalyticsEventInput"},{eventName:"checkout_completed",kind:"product",screenName:"Checkout",time:"2026-07-20T18:30:00.000Z",defaultParameters:{appVersion:"1.0"},additionalParameters:{cartItems:3},buildId:"build-123",sessionId:"session-456"},"Collect analytics events"),e.i(477685),(0,A_.join)(process.cwd(),"node_modules","@fontpkg","unifont","unifont-15.0.01.ttf"),(0,A_.join)(process.cwd(),"node_modules","@expo-google-fonts","noto-emoji","400Regular","NotoEmoji_400Regular.ttf"),new Intl.Segmenter(void 0,{granularity:"grapheme"});class elD{agentControl;fetcher;credentials;constructor(e,t=fetch,A=new hP){for(const r of(this.agentControl=e,this.fetcher=t,this.credentials=A,this.agentControl.registerCompletionHandler(i9,e=>this.completeScan(e)),[i7,ne,nt,nA,nr]))this.agentControl.registerCompletionHandler(r,e=>this.completeOperation(e))}changed(){aq.publish(a5,{changed:!0})}deleteTransferJobSoon(e){setTimeout(()=>{aJ().then(t=>t.agentJob.deleteMany({where:{id:e,visibility:"SYSTEM"}}))},3e4).unref()}subscribe(){return aq.iterate(a5)}async completeScan(e){if("SUCCEEDED"!==e.status)return;let t=function(e){let t=nn(e,"signing assets result");if(!Array.isArray(t.profiles)||!Array.isArray(t.certificates)||!Array.isArray(t.warnings))throw Error("Signing assets result arrays are invalid");return{profiles:t.profiles.map((e,t)=>{let A=nn(e,`signing profiles[${t}]`),r=na(A.profileType,`signing profiles[${t}].profileType`);if(!["DEVELOPMENT","AD_HOC","ENTERPRISE","APP_STORE"].includes(r))throw Error(`signing profiles[${t}].profileType is invalid`);let i=A.deviceCount;if("number"!=typeof i||!Number.isInteger(i)||i<0)throw Error(`signing profiles[${t}].deviceCount is invalid`);return{uuid:na(A.uuid,`signing profiles[${t}].uuid`),contentHash:na(A.contentHash,`signing profiles[${t}].contentHash`),name:na(A.name,`signing profiles[${t}].name`),profileType:r,bundleId:na(A.bundleId,`signing profiles[${t}].bundleId`),teamId:ns(A.teamId,`signing profiles[${t}].teamId`),teamName:ns(A.teamName,`signing profiles[${t}].teamName`),platforms:no(A.platforms,`signing profiles[${t}].platforms`),deviceCount:i,deviceUdids:void 0===A.deviceUdids?[]:no(A.deviceUdids,`signing profiles[${t}].deviceUdids`),certificateSha1s:no(A.certificateSha1s,`signing profiles[${t}].certificateSha1s`),createdAt:nc(A.createdAt,`signing profiles[${t}].createdAt`),expiresAt:nc(A.expiresAt,`signing profiles[${t}].expiresAt`),expired:nl(A.expired,`signing profiles[${t}].expired`),xcodeManaged:nl(A.xcodeManaged,`signing profiles[${t}].xcodeManaged`)}}),certificates:t.certificates.map((e,t)=>{let A=nn(e,`signing certificates[${t}]`);return{sha1:na(A.sha1,`signing certificates[${t}].sha1`),sha256:ns(A.sha256,`signing certificates[${t}].sha256`),name:na(A.name,`signing certificates[${t}].name`),teamId:ns(A.teamId,`signing certificates[${t}].teamId`),certificateType:ns(A.certificateType,`signing certificates[${t}].certificateType`),notBefore:nc(A.notBefore,`signing certificates[${t}].notBefore`),expiresAt:nc(A.expiresAt,`signing certificates[${t}].expiresAt`),expired:nl(A.expired,`signing certificates[${t}].expired`),hasPrivateKey:nl(A.hasPrivateKey,`signing certificates[${t}].hasPrivateKey`)}}),warnings:no(t.warnings,"signing warnings")}}(elQ(e.resultJson)),A=await aJ(),r=new Date;await A.$transaction(async A=>{for(let i of(await A.signingProfileAsset.updateMany({where:{agentId:e.agentId,missingAt:null},data:{missingAt:r}}),await A.signingCertificateAsset.updateMany({where:{agentId:e.agentId,missingAt:null},data:{missingAt:r}}),t.profiles))await A.signingProfileAsset.upsert({where:{agentId_uuid:{agentId:e.agentId,uuid:i.uuid}},create:{id:(0,AP.randomUUID)(),agentId:e.agentId,uuid:i.uuid,contentHash:i.contentHash,name:i.name,profileType:i.profileType,bundleId:i.bundleId,teamId:i.teamId,teamName:i.teamName,platformsJson:JSON.stringify(i.platforms),deviceCount:i.deviceCount,deviceUdidsJson:JSON.stringify(i.deviceUdids),certificateSha1sJson:JSON.stringify(i.certificateSha1s),createdAt:elB(i.createdAt),expiresAt:elB(i.expiresAt),expired:i.expired,xcodeManaged:i.xcodeManaged,observedAt:r},update:{contentHash:i.contentHash,name:i.name,profileType:i.profileType,bundleId:i.bundleId,teamId:i.teamId,teamName:i.teamName,platformsJson:JSON.stringify(i.platforms),deviceCount:i.deviceCount,deviceUdidsJson:JSON.stringify(i.deviceUdids),certificateSha1sJson:JSON.stringify(i.certificateSha1s),createdAt:elB(i.createdAt),expiresAt:elB(i.expiresAt),expired:i.expired,xcodeManaged:i.xcodeManaged,observedAt:r,missingAt:null}});for(let i of t.certificates)await A.signingCertificateAsset.upsert({where:{agentId_sha1:{agentId:e.agentId,sha1:i.sha1}},create:{id:(0,AP.randomUUID)(),agentId:e.agentId,sha1:i.sha1,sha256:i.sha256,name:i.name,teamId:i.teamId,certificateType:i.certificateType,notBefore:elB(i.notBefore),expiresAt:elB(i.expiresAt),expired:i.expired,hasPrivateKey:i.hasPrivateKey,observedAt:r},update:{sha256:i.sha256,name:i.name,teamId:i.teamId,certificateType:i.certificateType,notBefore:elB(i.notBefore),expiresAt:elB(i.expiresAt),expired:i.expired,hasPrivateKey:i.hasPrivateKey,observedAt:r,missingAt:null}})}),this.deleteTransferJobSoon(e.id),this.changed()}async refreshAfterMutation(e,t){await this.agentControl.createJob({agentId:e,kind:i9,payload:{},idempotencyKey:`signing:${t}:${e}:refresh`,timeoutSeconds:60,visibility:"SYSTEM"})}async finishOperation(e){let t=await aJ(),A=await t.signingOperationItem.findMany({where:{operationId:e}});if(A.some(e=>["WAITING","QUEUED","RUNNING"].includes(e.status)))return;let r=A.filter(e=>"SUCCEEDED"!==e.status);await t.signingOperation.update({where:{id:e},data:{status:r.length?"FAILED":"SUCCEEDED",error:r.map(e=>e.error).filter(Boolean).join("; ")||null,finishedAt:new Date}}),this.changed()}async completeOperation(e){let t=await aJ(),A=await t.signingOperationItem.findUnique({where:{jobId:e.id},include:{operation:!0}});if(A){if(await t.signingOperationItem.update({where:{id:A.id},data:{status:e.status,error:e.error,finishedAt:new Date}}),e.kind===i7&&"SUCCEEDED"===e.status&&"SYNC_PROFILE"===A.operation.kind){let r=elQ(e.resultJson).contentBase64;if("string"==typeof r&&r)for(let e of(await t.signingOperationItem.findMany({where:{operationId:A.operationId,status:"WAITING"}}))){let i=await this.agentControl.createJob({agentId:e.agentId,kind:ne,payload:{contentBase64:r},idempotencyKey:`signing:${A.operationId}:${e.agentId}:install`,timeoutSeconds:60,visibility:"SYSTEM"});await t.signingOperationItem.update({where:{id:e.id},data:{jobId:i.id,status:i.status}})}else await t.signingOperation.update({where:{id:A.operationId},data:{status:"FAILED",error:"Profile read returned no content"}})}e.kind===i7&&"SUCCEEDED"!==e.status&&"SYNC_PROFILE"===A.operation.kind&&await t.signingOperationItem.updateMany({where:{operationId:A.operationId,status:"WAITING"},data:{status:"FAILED",error:"Source profile could not be read",finishedAt:new Date}}),"SUCCEEDED"===e.status&&e.kind!==i7&&await this.refreshAfterMutation(e.agentId,A.operationId),await this.finishOperation(A.operationId),this.deleteTransferJobSoon(e.id)}}async refresh(e){let t=await aJ(),A=await t.agent.findMany({where:e?.length?{id:{in:[...new Set(e)]}}:void 0,orderBy:{name:"asc"}}),r=[];for(let e of A)elb(e.capabilitiesJson).includes(i9)&&r.push(await this.agentControl.createJob({agentId:e.id,kind:i9,payload:{},idempotencyKey:`signing:scan:${Date.now()}:${e.id}`,timeoutSeconds:60,visibility:"SYSTEM"}));return r}async agents(){let e=await aJ();return(await e.agent.findMany({orderBy:{name:"asc"}})).map(e=>({id:e.id,name:e.name,hostname:e.hostname,supported:elb(e.capabilitiesJson).includes(i9),lastSeenAt:e.lastSeenAt?.toISOString()??null}))}async profiles(){let e=await aJ(),t=await e.signingProfileAsset.findMany({where:{missingAt:null},include:{agent:{select:{id:!0,name:!0}}},orderBy:[{expiresAt:"asc"},{name:"asc"}]}),A=new Map;for(let e of t){let t=`${e.uuid}:${e.contentHash}`;A.set(t,[...A.get(t)??[],e])}return[...A.values()].map(e=>{let t=e[0];return{id:`${t.uuid}:${t.contentHash}`,uuid:t.uuid,contentHash:t.contentHash,name:t.name,profileType:t.profileType,bundleId:t.bundleId,teamId:t.teamId,teamName:t.teamName,platforms:elb(t.platformsJson),deviceCount:t.deviceCount,deviceUdids:elb(t.deviceUdidsJson),certificateSha1s:elb(t.certificateSha1sJson),createdAt:t.createdAt?.toISOString()??null,expiresAt:t.expiresAt?.toISOString()??null,expired:t.expired,xcodeManaged:t.xcodeManaged,installedAgents:e.map(({agent:e})=>e)}})}async profile(e){return(await this.profiles()).find(t=>t.id===e)??null}async profileDevices(e){let t=new Set,A=e.filter(e=>{let A=e.toUpperCase();return!t.has(A)&&(t.add(A),!0)}),r=A.map(e=>e.toUpperCase());if(!r.length)return[];let i=await aJ(),n=new Map((await i.iosDevice.findMany({where:{udid:{in:r}},select:{id:!0,udid:!0,displayName:!0,product:!0,osVersion:!0,status:!0}})).map(e=>[e.udid.toUpperCase(),e]));return A.map(e=>{let t=n.get(e.toUpperCase());return{udid:e,deviceId:t?.id??null,displayName:t?.displayName??null,product:t?.product??null,osVersion:t?.osVersion??null,status:t?.status??null}})}async certificates(){let e=await aJ(),t=await e.signingCertificateAsset.findMany({where:{missingAt:null},include:{agent:{select:{id:!0,name:!0}}},orderBy:[{expiresAt:"asc"},{name:"asc"}]}),A=new Map;for(let e of t)A.set(e.sha1,[...A.get(e.sha1)??[],e]);return[...A.values()].map(e=>{let t=e[0];return{id:t.sha1,sha1:t.sha1,sha256:t.sha256,name:t.name,teamId:t.teamId,certificateType:t.certificateType,notBefore:t.notBefore?.toISOString()??null,expiresAt:t.expiresAt?.toISOString()??null,expired:t.expired,hasPrivateKey:e.some(e=>e.hasPrivateKey),installedAgents:e.map(({agent:e})=>e),privateKeyAgents:e.filter(e=>e.hasPrivateKey).map(({agent:e})=>e)}})}async operations(e=50){return(await aJ()).signingOperation.findMany({include:{items:{include:{agent:{select:{id:!0,name:!0}}},orderBy:{createdAt:"asc"}}},orderBy:{createdAt:"desc"},take:Math.max(1,Math.min(e,200))})}async operation(e,t,A,r=null,i=[]){let n=await aJ(),a=(0,AP.randomUUID)();return n.signingOperation.create({data:{id:a,kind:e,assetKey:t,sourceAgentId:r,items:{create:[...new Set(A)].map(e=>({id:(0,AP.randomUUID)(),agentId:e,status:i.includes(e)?"WAITING":"QUEUED"}))}},include:{items:{include:{agent:{select:{id:!0,name:!0}}}}}})}async attachJob(e,t){let A=await aJ();await A.signingOperationItem.update({where:{id:e},data:{jobId:t.id,status:t.status}})}async uploadProfile(e,t){if(!t.length)throw Error("Select at least one agent");let A=(0,AP.createHash)("sha256").update(Buffer.from(e,"base64")).digest("hex").toUpperCase(),r=await this.operation("INSTALL_PROFILE",A,t);for(let t of r.items){let A=await this.agentControl.createJob({agentId:t.agentId,kind:ne,payload:{contentBase64:e},idempotencyKey:`signing:${r.id}:${t.agentId}:install`,timeoutSeconds:60,visibility:"SYSTEM"});await this.attachJob(t.id,A)}return this.changed(),r}async downloadProfile(e,t){let A=(0,AP.randomUUID)(),r=await this.agentControl.createJob({agentId:t,kind:i7,payload:{uuid:e},idempotencyKey:`signing:download:${A}:${e}`,timeoutSeconds:60,visibility:"SYSTEM"}),i=await aJ();try{let t=Date.now()+55e3;for(;Date.now()<t;){let t=await this.agentControl.getJob(r.id);if(!t)throw Error("Profile download job was removed");if(["FAILED","CANCELLED","TIMED_OUT"].includes(t.status))throw Error(t.error||"Could not read provisioning profile");if("SUCCEEDED"===t.status){let A=elQ(t.resultJson);if("string"!=typeof A.contentBase64)throw Error("Agent returned no provisioning profile content");return{uuid:e,filename:`${e}.mobileprovision`,contentBase64:A.contentBase64}}await new Promise(e=>setTimeout(e,250))}throw Error("Timed out reading provisioning profile")}finally{await i.agentJob.deleteMany({where:{id:r.id,visibility:"SYSTEM"}})}}async syncProfile(e,t,A){let r=[...new Set(A)].filter(e=>e!==t);if(!r.length)throw Error("Select at least one target agent");let i=await this.operation("SYNC_PROFILE",e,[t,...r],t,r),n=i.items.find(e=>e.agentId===t),a=await this.agentControl.createJob({agentId:t,kind:i7,payload:{uuid:e},idempotencyKey:`signing:${i.id}:${t}:read`,timeoutSeconds:60,visibility:"SYSTEM"});return await this.attachJob(n.id,a),this.changed(),i}async deleteProfile(e,t){if(!t.length)throw Error("Select at least one agent");let A=await this.operation("DELETE_PROFILE",e,t);for(let t of A.items){let r=await this.agentControl.createJob({agentId:t.agentId,kind:nt,payload:{uuid:e},idempotencyKey:`signing:${A.id}:${t.agentId}:delete`,timeoutSeconds:60,visibility:"SYSTEM"});await this.attachJob(t.id,r)}return this.changed(),A}async deleteExpiredProfiles(e){let t=await aJ(),A=await t.signingProfileAsset.findMany({where:{expired:!0,missingAt:null,...e?.length?{agentId:{in:e}}:{}}}),r=new Map;for(let e of A)r.set(e.uuid,[...r.get(e.uuid)??[],e.agentId]);let i=[];for(let[e,t]of r)i.push(await this.deleteProfile(e,t));return i}async importIdentity(e){if(!e.targetAgentIds.length)throw Error("Select at least one agent");let t=Buffer.from(e.p12Base64,"base64");if(!t.length||t.length>0x1400000)throw Error("The .p12 file is empty or larger than 20 MiB");let A=[...new Set(e.targetAgentIds)],r=await aJ(),i=new Map((await r.agent.findMany({where:{id:{in:A}},select:{id:!0,name:!0,capabilitiesJson:!0,lastSeenAt:!0,disconnectedAt:!0,heartbeatIntervalSeconds:!0}})).map(e=>[e.id,e])),n=Date.now(),a=A.filter(e=>{let t=i.get(e);return!t||!function(e,t=Date.now()){return null!==e.lastSeenAt&&t-e.lastSeenAt.getTime()<=sQ(e)&&null===e.disconnectedAt}(t,n)||!elb(t.capabilitiesJson).includes(nA)});if(a.length)throw Error(`Identity imports require online supported agents: ${a.map(e=>i.get(e)?.name??e).join(", ")}`);let s=(0,AP.createHash)("sha256").update(t).digest("hex").toUpperCase(),o=await this.operation("IMPORT_IDENTITY",s,A);for(let t of o.items){let A=this.agentControl.createSigningSecretTransfer(t.agentId,{p12Base64:e.p12Base64,passphrase:e.passphrase});try{let e=await this.agentControl.createJob({agentId:t.agentId,kind:nA,payload:{transferId:A,sha256:s},idempotencyKey:`signing:${o.id}:${t.agentId}:import`,timeoutSeconds:120,visibility:"SYSTEM"});await this.attachJob(t.id,e)}catch(e){throw this.agentControl.revokeSigningSecretTransfer(A),e}}return this.changed(),o}async deleteIdentity(e,t){if(!t.length)throw Error("Select at least one agent");let A=e.toUpperCase(),r=[...new Set(t)],i=await aJ(),n=new Set((await i.signingCertificateAsset.findMany({where:{sha1:A,agentId:{in:r},hasPrivateKey:!0,missingAt:null},select:{agentId:!0}})).map(e=>e.agentId)),a=r.filter(e=>n.has(e));if(!a.length)throw Error("The identity has no private key on the selected agents");let s=await this.operation("DELETE_IDENTITY",A,a);for(let e of s.items){let t=await this.agentControl.createJob({agentId:e.agentId,kind:nr,payload:{sha1:A},idempotencyKey:`signing:${s.id}:${e.agentId}:delete`,timeoutSeconds:60,visibility:"SYSTEM"});await this.attachJob(e.id,t)}return this.changed(),s}async appleClient(){return new qb(await qB(this.credentials),this.fetcher)}async portalInventory(){let e=await this.appleClient(),[t,A,r,i]=await Promise.all([e.listProfiles(),e.listCertificates(),e.listBundleIds(),e.listDevices()]);return{profiles:t,certificates:A,bundleIds:r,devices:i}}async createPortalProfile(e){let t=await (await this.appleClient()).createProfile(e);return this.changed(),t.data}async deletePortalProfile(e){return await (await this.appleClient()).deleteProfile(e),this.changed(),!0}async revokePortalCertificate(e){return await (await this.appleClient()).revokeCertificate(e),this.changed(),!0}}var elk=e.i(290474);let elS=/^[A-Za-z0-9][A-Za-z0-9.-]{0,254}$/;function elv(e,t,A){if("string"!=typeof e||!e.trim())throw Error(`${t} is required`);let r=e.trim();if(r.length>A||r.includes("\0"))throw Error(`${t} is invalid`);return r}function elR(e,t,A){return null==e||""===e?null:elv(e,t,A)}let elM={IOS_BUILD_SUCCEEDED:{key:"IOS_BUILD_SUCCEEDED",category:"BUILDS",label:"iOS build succeeded",description:"An iOS build finishes successfully.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1,defaultApnsEnabled:!0},IOS_BUILD_FAILED:{key:"IOS_BUILD_FAILED",category:"BUILDS",label:"iOS build failed",description:"An iOS build finishes with a failure.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1,defaultApnsEnabled:!0},COMMAND_RUN_SUCCEEDED:{key:"COMMAND_RUN_SUCCEEDED",category:"COMMANDS",label:"Command run succeeded",description:"A saved command finishes successfully.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1,defaultApnsEnabled:!0},COMMAND_RUN_FAILED:{key:"COMMAND_RUN_FAILED",category:"COMMANDS",label:"Command run failed",description:"A saved command finishes with a failure.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1,defaultApnsEnabled:!0},GITHUB_ACTIONS_SUCCEEDED:{key:"GITHUB_ACTIONS_SUCCEEDED",category:"GITHUB",label:"GitHub Actions succeeded",description:"A GitHub Actions workflow finishes successfully.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1,defaultApnsEnabled:!0},GITHUB_ACTIONS_FAILED:{key:"GITHUB_ACTIONS_FAILED",category:"GITHUB",label:"GitHub Actions failed",description:"A GitHub Actions workflow finishes with a failure.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1,defaultApnsEnabled:!0},RUN_NEEDS_ANSWER:{key:"RUN_NEEDS_ANSWER",category:"RUNS",label:"Plan or session needs an answer",description:"A managed plan or session asks for user input.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1,defaultApnsEnabled:!0},RUN_COMPLETED:{key:"RUN_COMPLETED",category:"RUNS",label:"Plan or session completed",description:"A managed plan or session completes successfully.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1,defaultApnsEnabled:!0},RUN_FAILED:{key:"RUN_FAILED",category:"RUNS",label:"Plan or session failed",description:"A managed plan or session fails.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1,defaultApnsEnabled:!0},RUN_CANCELLED:{key:"RUN_CANCELLED",category:"RUNS",label:"Plan or session cancelled",description:"A managed plan or session is cancelled.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!1,defaultWebPushEnabled:!1,defaultApnsEnabled:!1},RUN_RECOVERY_PAUSED:{key:"RUN_RECOVERY_PAUSED",category:"RUNS",label:"Plan or session paused after recovery",description:"A managed plan or session is paused after its agent restarts.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1,defaultApnsEnabled:!0},WORKFLOW_MESSAGE:{key:"WORKFLOW_MESSAGE",category:"WORKFLOWS",label:"Workflow message",description:"A workflow sends a generic notification.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1,defaultApnsEnabled:!0},WORKFLOW_NEEDS_ATTENTION:{key:"WORKFLOW_NEEDS_ATTENTION",category:"WORKFLOWS",label:"Workflow needs attention",description:"A workflow is waiting for data or a decision.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1,defaultApnsEnabled:!0},WORKFLOW_COMPLETED:{key:"WORKFLOW_COMPLETED",category:"WORKFLOWS",label:"Workflow completed",description:"A workflow run completes successfully.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1,defaultApnsEnabled:!0},WORKFLOW_FAILED:{key:"WORKFLOW_FAILED",category:"WORKFLOWS",label:"Workflow failed",description:"A workflow run fails.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1,defaultApnsEnabled:!0},WORKFLOW_RECOVERY_PAUSED:{key:"WORKFLOW_RECOVERY_PAUSED",category:"WORKFLOWS",label:"Workflow paused after recovery",description:"A workflow pauses while recovering durable work.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1,defaultApnsEnabled:!0}};function elT(e){return e in elM?elM[e]:null}let elU="default",elx=new Set(["BadDeviceToken","DeviceTokenNotForTopic","Unregistered"]);function elN(e,t,A){let r=e.trim();if(!r)throw Error(`${t} is required`);if(r.length>A)throw Error(`${t} is too long`);return r}function elF(e){let t,A=elN(e,"Push endpoint",4e3);try{t=new URL(A)}catch{throw Error("Push endpoint must be a valid URL")}if("https:"!==t.protocol)throw Error("Push endpoint must use HTTPS");return A}function elG(e,t){let A=new Date(e);if(!Number.isFinite(A.getTime()))throw Error(`${t} is invalid`);return A}function elO(){let e=process.env.PUBLIC_BASE_URL?.trim();if(e)try{let t=new URL(e);if("https:"===t.protocol)return t.origin}catch{}return"mailto:notifications@ai-development-environment.local"}function elJ(e){if(!e||"object"!=typeof e)return null;let t=e.statusCode;return"number"==typeof t?t:null}function el_(e){return Buffer.byteLength(JSON.stringify(e),"utf8")}function elV(e,t,A){if(4096>=el_(A(e)))return e;let r=Array.from(e),i=e=>0===e?"":`${r.slice(0,e).join("")}${t}`,n=0,a=r.length-1;for(;n<a;){let e=Math.ceil((n+a)/2);4096>=el_(A(i(e)))?n=e:a=e-1}return i(n)}class elP{credentialService;apns;vapidPreparation;constructor(e,t=new EB){this.credentialService=e,this.apns=t,this.vapidPreparation=null}publish(e){aq.publish(a7,{notificationsChanged:e})}subscribe(){return aq.iterate(a7)}async preferences(){let e=await aJ(),t=new Map((await e.notificationPreference.findMany()).map(e=>[e.typeKey,e]));return Object.values(elM).map(e=>{let A=t.get(e.key);return{...e,sidebarEnabled:A?.sidebarEnabled??e.defaultSidebarEnabled,browserEnabled:A?.browserEnabled??e.defaultBrowserEnabled,webPushEnabled:A?.webPushEnabled??e.defaultWebPushEnabled,apnsEnabled:A?.apnsEnabled??e.defaultApnsEnabled,updatedAt:A?.updatedAt??null}})}async savePreference(e){let t=elT(e.typeKey);if(!t)throw Error("Unknown notification type");let A=await aJ(),r=await A.notificationPreference.findUnique({where:{typeKey:t.key}}),i=e.apnsEnabled??r?.apnsEnabled??t.defaultApnsEnabled,n=await A.notificationPreference.upsert({where:{typeKey:t.key},create:{typeKey:t.key,sidebarEnabled:e.sidebarEnabled,browserEnabled:e.browserEnabled,webPushEnabled:e.webPushEnabled,apnsEnabled:i},update:{sidebarEnabled:e.sidebarEnabled,browserEnabled:e.browserEnabled,webPushEnabled:e.webPushEnabled,apnsEnabled:i}});return this.publish({kind:"PREFERENCES_UPDATED",notification:null,notificationId:null}),{...t,...n}}async recordInTransaction(e,t){let A=elT(t.typeKey);if(!A)throw Error("Unknown notification type");let r=await e.notificationPreference.findUnique({where:{typeKey:A.key}}),i=r?.sidebarEnabled??A.defaultSidebarEnabled,n=r?.browserEnabled??A.defaultBrowserEnabled,a=r?.webPushEnabled??A.defaultWebPushEnabled,s=r?.apnsEnabled??A.defaultApnsEnabled;if(!i&&!n&&!a&&!s)return null;let o=elN(t.dedupeKey,"Deduplication key",500);return await e.appNotification.findUnique({where:{dedupeKey:o}})?null:e.appNotification.create({data:{id:(0,AP.randomUUID)(),dedupeKey:o,typeKey:A.key,title:elN(t.title,"Notification title",240),body:elN(t.body,"Notification body",1e3),href:function(e){let t=elN(e,"Notification link",2e3);if(!t.startsWith("/")||t.startsWith("//"))throw Error("Notification links must be same-origin paths");return t}(t.href),resourceKind:elN(t.resourceKind,"Resource kind",100),resourceId:elN(t.resourceId,"Resource ID",500),worktreeId:t.worktreeId??null,highlightColor:t.highlightColor?.trim()||null,sidebarRequested:i,browserRequested:n,webPushRequested:a,apnsRequested:s}})}created(e){e&&(this.publish({kind:"CREATED",notification:e,notificationId:e.id}),e.webPushRequested&&this.deliverWebPush(e).catch(e=>{console.error("Web Push delivery failed:",e)}),e.apnsRequested&&this.deliverApns(e).catch(e=>{console.error("APNs delivery failed:",e)}))}async history(e={}){let t=Math.max(1,Math.min(e.first??100,200)),A=await aJ(),[r,i]=await Promise.all([A.appNotification.findMany({orderBy:[{createdAt:"desc"},{id:"desc"}],take:t+1,...e.after?{cursor:{id:e.after},skip:1}:void 0}),A.appNotification.count()]);return{items:r.slice(0,t),nextCursor:r.length>t?r[t-1].id:null,totalCount:i}}async sidebar(e=50){return(await aJ()).appNotification.findMany({where:{sidebarRequested:!0,sidebarDismissedAt:null},orderBy:[{createdAt:"desc"},{id:"desc"}],take:Math.max(1,Math.min(e,100))})}async dismiss(e){let t=await aJ(),A=await t.appNotification.updateMany({where:{id:e,sidebarRequested:!0,sidebarDismissedAt:null},data:{sidebarDismissedAt:new Date}});return A.count&&this.publish({kind:"DISMISSED",notification:null,notificationId:e}),A.count>0}async dismissAll(){let e=await aJ(),t=await e.appNotification.updateMany({where:{sidebarRequested:!0,sidebarDismissedAt:null},data:{sidebarDismissedAt:new Date}});return t.count&&this.publish({kind:"SIDEBAR_CLEARED",notification:null,notificationId:null}),t.count}selectionWhere(e){let t=e.excludedRanges??[],A=e.all&&0===t.length?[]:[...new Set(e.ids??[])],r=[...new Set(e.excludedIds??[])],i=e.ranges??[];if(A.length>5e3||r.length>5e3)throw Error("Notification selection is too large");if(i.length>366||t.length>366)throw Error("Notification date selection is too large");let n=t.map(e=>{let t=elG(e.start,"Excluded selection start"),A=elG(e.end,"Excluded selection end");if(t>=A)throw Error("Excluded selection range is invalid");return{createdAt:{gte:t,lt:A}}}),a={NOT:{OR:n}},s=[];if(A.length&&s.push({id:{in:A}}),e.all)s.push(n.length?a:{});else if(i.length){let e=i.map(e=>{let t=elG(e.start,"Selection start"),A=elG(e.end,"Selection end");if(t>=A)throw Error("Selection range is invalid");return{createdAt:{gte:t,lt:A}}});s.push({AND:[{OR:e},...n.length?[a]:[]]})}if(!s.length)return{id:{in:[]}};let o=1===s.length?s[0]:{OR:s};return r.length?{AND:[o,{id:{notIn:r}}]}:o}async deleteSelection(e){let t=await aJ(),A=await t.appNotification.deleteMany({where:this.selectionWhere(e)});return A.count&&this.publish({kind:"DELETED",notification:null,notificationId:null}),A.count}async deleteAll(){let e=await aJ(),t=await e.appNotification.deleteMany();return t.count&&this.publish({kind:"HISTORY_CLEARED",notification:null,notificationId:null}),t.count}async webPushState(){let e=await aJ(),[t,A]=await Promise.all([e.webPushSettings.findUnique({where:{id:elU}}),e.webPushSubscription.count()]),r=await this.credentialService.isConfigured(hm.webPushVapidPrivateKey);return{configured:!!(t?.vapidPublicKey&&r),publicKey:t?.vapidPublicKey??null,subscriptionCount:A}}async webPushSubscriptions(){return(await aJ()).webPushSubscription.findMany({orderBy:[{lastSeenAt:"desc"},{createdAt:"desc"}],select:{id:!0,endpoint:!0,expirationTime:!0,locale:!0,userAgent:!0,lastSeenAt:!0,createdAt:!0,updatedAt:!0}})}async prepareWebPush(){return this.vapidPreparation||(this.vapidPreparation=this.prepareWebPushOnce().finally(()=>{this.vapidPreparation=null})),this.vapidPreparation}async prepareWebPushOnce(){let e=await aJ(),t=await e.webPushSettings.findUnique({where:{id:elU}});if(t?.vapidPublicKey){if(!await this.credentialService.getText(hm.webPushVapidPrivateKey))throw Error("The Web Push private key is unavailable");return{publicKey:t.vapidPublicKey}}let A=elk.default.generateVAPIDKeys();return await this.credentialService.setText(hm.webPushVapidPrivateKey,A.privateKey,e=>e.webPushSettings.upsert({where:{id:elU},create:{id:elU,vapidPublicKey:A.publicKey,vapidGeneratedAt:new Date},update:{vapidPublicKey:A.publicKey,vapidGeneratedAt:new Date}}).then(()=>void 0)),{publicKey:A.publicKey}}async registerWebPush(e){let t=elF(e.endpoint),A=elN(e.p256dh,"Push p256dh key",1e3),r=elN(e.auth,"Push auth key",1e3),i=null===e.expirationTime||void 0===e.expirationTime?null:new Date(e.expirationTime);if(i&&!Number.isFinite(i.getTime()))throw Error("Push subscription expiration is invalid");return await this.prepareWebPush(),(await aJ()).webPushSubscription.upsert({where:{endpoint:t},create:{id:(0,AP.randomUUID)(),endpoint:t,p256dh:A,auth:r,expirationTime:i,locale:e.locale?.trim().slice(0,35)||null,userAgent:e.userAgent?.trim().slice(0,1e3)||null},update:{p256dh:A,auth:r,expirationTime:i,locale:e.locale?.trim().slice(0,35)||null,userAgent:e.userAgent?.trim().slice(0,1e3)||null,lastSeenAt:new Date}})}async unregisterWebPush(e){let t=elF(e),A=await aJ();return(await A.webPushSubscription.deleteMany({where:{endpoint:t}})).count>0}async deleteWebPushSubscription(e){let t=elN(e,"Push subscription",200),A=await aJ();return(await A.webPushSubscription.deleteMany({where:{id:t}})).count>0}async testWebPushSubscription(e){let t=elN(e,"Push subscription",200),A=await aJ(),[r,i]=await Promise.all([A.webPushSettings.findUnique({where:{id:elU}}),A.webPushSubscription.findUnique({where:{id:t}})]);if(!i)throw Error("Push subscription was not found");if(!r?.vapidPublicKey)throw Error("Web Push is not configured");let n=await this.credentialService.getText(hm.webPushVapidPrivateKey);if(!n)throw Error("The Web Push private key is unavailable");elk.default.setVapidDetails(elO(),r.vapidPublicKey,n);try{return await elk.default.sendNotification({endpoint:i.endpoint,expirationTime:i.expirationTime?.getTime()??null,keys:{p256dh:i.p256dh,auth:i.auth}},JSON.stringify({id:`test:${Date.now()}`,title:"Test notification",body:"Web Push is working for this browser.",href:"/notifications",icon:"/icon-192.png",badge:"/icon-192.png"}),{TTL:60,timeout:1e4}),!0}catch(e){if([404,410].includes(elJ(e)??0))throw await A.webPushSubscription.deleteMany({where:{id:t}}),Error("The browser subscription expired and was removed");throw e}}async apnsState(){let e=await aJ(),[t,A]=await Promise.all([hL(this.credentialService,hm.apnsTokenSettings,hX),e.notificationDevice.count({where:{status:"ACTIVE"}})]),r=await this.credentialService.isConfigured(hm.apnsTokenPrivateKey);return{configured:!!(t&&r),deviceCount:A}}async notificationDevices(){let e=await aJ();return(await e.notificationDevice.findMany({orderBy:[{status:"asc"},{lastRegisteredAt:"desc"}]})).map(({token:e,tokenHash:t,...A})=>({...A,tokenMasked:`${e.slice(0,8)}…${e.slice(-8)}`}))}async registerDevice(e,t){let A=function(e){let t=function(e,t){if(!e||"object"!=typeof e||Array.isArray(e))throw Error(`${t} must be an object`);return e}(e,"device"),A=new Set(["clientRegistrationId","token","tokenEncoding","topic","environment","displayName","deviceModel","osVersion","appVersion","appBuild","locale"]),r=Object.keys(t).filter(e=>!A.has(e));if(r.length)throw Error(`device has unsupported fields: ${r.join(", ")}`);let i=t.tokenEncoding??"HEX";if("HEX"!==i&&"BASE64"!==i)throw Error("tokenEncoding must be HEX or BASE64");let n=t.environment;if("SANDBOX"!==n&&"PRODUCTION"!==n)throw Error("environment must be SANDBOX or PRODUCTION");let a=elv(t.topic,"topic",255);if(!elS.test(a))throw Error("topic is invalid");return{clientRegistrationId:elv(t.clientRegistrationId,"clientRegistrationId",200),token:EM(elv(t.token,"token",500),i),topic:a,environment:n,displayName:elv(t.displayName,"displayName",120),deviceModel:elR(t.deviceModel,"deviceModel",120),osVersion:elR(t.osVersion,"osVersion",60),appVersion:elR(t.appVersion,"appVersion",60),appBuild:elR(t.appBuild,"appBuild",60),locale:elR(t.locale,"locale",35)}}(e);return this.registerDeviceValidated(A,t)}async registerDeviceValidated(e,t){let A=await aJ(),r=(0,AP.createHash)("sha256").update(e.token).digest("hex"),i=new Date,n={token:e.token,tokenHash:r,topic:e.topic,environment:e.environment,displayName:e.displayName,deviceModel:e.deviceModel,osVersion:e.osVersion,appVersion:e.appVersion,appBuild:e.appBuild,locale:e.locale,lastIpAddress:t,status:"ACTIVE",lastFailureReason:null,lastFailureAt:null,lastRegisteredAt:i},a=await A.$transaction(async t=>{let A=await t.notificationDevice.findUnique({where:{clientRegistrationId:e.clientRegistrationId}}),i=await t.notificationDevice.findUnique({where:{tokenHash:r}});return i&&i.id!==A?.id&&await t.notificationDevice.delete({where:{id:i.id}}),{device:A?await t.notificationDevice.update({where:{id:A.id},data:n}):await t.notificationDevice.create({data:{id:(0,AP.randomUUID)(),clientRegistrationId:e.clientRegistrationId,...n}}),created:!A}});return this.publish({kind:"DEVICES_CHANGED",notification:null,notificationId:null}),a}async deleteNotificationDevice(e){let t=elN(e,"Notification device",200),A=await aJ(),r=await A.notificationDevice.deleteMany({where:{id:t}});return r.count&&this.publish({kind:"DEVICES_CHANGED",notification:null,notificationId:null}),r.count>0}async renameNotificationDevice(e,t){let A=elN(e,"Notification device",200),r=elN(t,"Display name",120),i=await aJ(),n=await i.notificationDevice.update({where:{id:A},data:{displayName:r}});return this.publish({kind:"DEVICES_CHANGED",notification:null,notificationId:null}),n}async apnsAuthentication(){let e=await hL(this.credentialService,hm.apnsTokenSettings,hX),t=await this.credentialService.getText(hm.apnsTokenPrivateKey);if(!e||!t)throw Error("APNs token authentication is not configured. Add the team ID, key ID, and .p8 key under Settings.");return{kind:"TOKEN",teamId:e.value.teamId,keyId:e.value.keyId,privateKey:t}}async sendApns(e,t,A){let r,i=await aJ(),n=new Date;try{r=await this.apns.send({environment:e.environment,authentication:t,deviceToken:e.token,payload:function(e){let t=e.title,A=e.body,r=e.href,i=(i=t,n=A,a=r)=>({aps:{alert:{title:i,body:n},sound:"default","thread-id":e.typeKey,"interruption-level":"active"},notificationId:e.id,typeKey:e.typeKey,href:a});A=elV(A,"…",e=>i(t,e,r)),r=elV(r,"",e=>i(t,A,e)),t=elV(t,"…",e=>i(e,A,r));let n=i();if(el_(n)>4096)throw Error("APNs payload exceeds the 4096-byte alert limit");return n}(A),headers:{"apns-topic":e.topic,"apns-push-type":"alert","apns-priority":"10","apns-expiration":String(Math.floor(n.getTime()/1e3)+3600),...A.collapseId?{"apns-collapse-id":A.collapseId.slice(0,64)}:{}}})}catch(t){throw await i.notificationDevice.updateMany({where:{id:e.id,token:e.token},data:{lastFailureReason:t instanceof Error?t.message.slice(0,200):"SendFailed",lastFailureAt:n}}),t}if(200===r.status)return await i.notificationDevice.updateMany({where:{id:e.id,token:e.token},data:{lastDeliveredAt:n,lastFailureReason:null,lastFailureAt:null}}),!0;let a=r.reason??`HTTP ${r.status}`,s=410===r.status||elx.has(a),o=await i.notificationDevice.updateMany({where:{id:e.id,token:e.token},data:{lastFailureReason:a,lastFailureAt:n,...s?{status:"INACTIVE"}:{}}});return s&&o.count>0&&this.publish({kind:"DEVICES_CHANGED",notification:null,notificationId:null}),!1}async testNotificationDevice(e){let t=elN(e,"Notification device",200),A=await aJ(),r=await A.notificationDevice.findUnique({where:{id:t}});if(!r)throw Error("Notification device was not found");let i=await this.apnsAuthentication();if(!await this.sendApns(r,i,{id:`test:${Date.now()}`,title:"Test notification",body:"Native notifications are working on this device.",href:"/notifications",typeKey:"TEST"})){let e=await A.notificationDevice.findUnique({where:{id:t}});throw Error(e?.lastFailureReason?`APNs rejected the notification: ${e.lastFailureReason}`:"APNs rejected the notification")}return!0}async deliverApns(e){let t;if(!e.apnsRequested)return;let A=await aJ(),r=await A.notificationDevice.findMany({where:{status:"ACTIVE"}});if(r.length){try{t=await this.apnsAuthentication()}catch(e){console.error("APNs delivery skipped:",e);return}await Promise.allSettled(r.map(async A=>{try{await this.sendApns(A,t,{id:e.id,title:e.title,body:e.body,href:e.href,typeKey:e.typeKey,collapseId:e.dedupeKey})}catch(e){console.error(`APNs delivery to ${A.displayName} failed:`,e)}}))}}async deliverWebPush(e){if(!e.webPushRequested)return;let t=await aJ(),[A,r]=await Promise.all([t.webPushSettings.findUnique({where:{id:elU}}),t.webPushSubscription.findMany()]);if(!A?.vapidPublicKey||!r.length)return;let i=await this.credentialService.getText(hm.webPushVapidPrivateKey);if(!i)return;elk.default.setVapidDetails(elO(),A.vapidPublicKey,i);let n=JSON.stringify({id:e.id,title:e.title,body:e.body,href:e.href,icon:"/icon-192.png",badge:"/icon-192.png"});await Promise.allSettled(r.map(async e=>{try{await elk.default.sendNotification({endpoint:e.endpoint,expirationTime:e.expirationTime?.getTime()??null,keys:{p256dh:e.p256dh,auth:e.auth}},n,{TTL:3600,timeout:1e4})}catch(A){if([404,410].includes(elJ(A)??0))return void await t.webPushSubscription.deleteMany({where:{endpoint:e.endpoint}});console.error(`Web Push delivery to ${e.endpoint} failed:`,A)}}))}}let elL=e=>e?.toISOString()??null;function elH(e,t,A,r,i){return e?t?"RUNNING":i?"ERROR":A&&!r||A&&r&&Date.now()-r.getTime()>2e3*A+5e3?"STALE":"HEALTHY":"DISABLED"}class elj{operations=new Map;register(e){let t=this.operations.get(e.id);this.operations.set(e.id,{...e,lastStartedAt:t?.lastStartedAt??null,lastCompletedAt:t?.lastCompletedAt??null,lastSucceededAt:t?.lastSucceededAt??null,nextScheduledAt:t?.nextScheduledAt??null,durationMs:t?.durationMs??null,lastError:t?.lastError??null}),this.changed(e.id)}configure(e,t){let A=this.operations.get(e);A&&(Object.assign(A,t),A.enabled||(A.nextScheduledAt=null),this.changed(e))}schedule(e,t){let A=this.operations.get(e);A&&(A.nextScheduledAt=t,this.changed(e))}async run(e,t,A){let r=this.operations.get(e);if(!r)throw Error(`Polling operation ${e} is not registered`);let i=new Date;r.lastStartedAt=i,r.lastError=null,this.changed(e);try{let e=await t(),n=new Date;return r.lastCompletedAt=n,r.lastSucceededAt=n,r.durationMs=n.getTime()-i.getTime(),r.lastError=null,A&&(r.details={...r.details,...A(e)}),e}catch(t){let e=new Date;throw r.lastCompletedAt=e,r.durationMs=e.getTime()-i.getTime(),r.lastError=t instanceof Error?t.message:String(t),t}finally{this.changed(e)}}changed(e){aq.publish(sd,{pollingOperationChanged:e})}subscribe(){return aq.iterate(sd)}serverViews(){return[...this.operations.values()].map(e=>({...e,status:elH(e.enabled,!!(e.lastStartedAt&&(!e.lastCompletedAt||e.lastStartedAt>e.lastCompletedAt)),e.cadenceSeconds,e.lastCompletedAt,e.lastError),lastStartedAt:elL(e.lastStartedAt),lastCompletedAt:elL(e.lastCompletedAt),lastSucceededAt:elL(e.lastSucceededAt),nextScheduledAt:elL(e.nextScheduledAt)}))}async list(){let e=await aJ(),[t,A,r]=await Promise.all([e.codebaseSettings.findUnique({where:{id:"default"}}),e.agent.findMany({orderBy:{name:"asc"},select:{id:!0,name:!0,lastSeenAt:!0,disconnectedAt:!0,codebaseScanIntervalSeconds:!0,jobReconciliationIntervalSeconds:!0,gitFetchIntervalSeconds:!0,heartbeatIntervalSeconds:!0,codebases:{select:{lastCheckedAt:!0,lastFetchedAt:!0,lastFetchAttemptAt:!0,lastFetchError:!0}},diskSpaceState:{select:{enabled:!0,lastReportedAt:!0,lastError:!0,volumesJson:!0}}}}),e.agentJob.groupBy({by:["agentId","status"],where:{status:{in:["QUEUED","RUNNING"]}},_count:{_all:!0}})]),i=t?.refreshIntervalSeconds??30,n=t?.fetchIntervalSeconds??300,a=new Map;for(let e of r)a.set(e.agentId,(a.get(e.agentId)??0)+e._count._all);let s=[];for(let e of A){let t=e.heartbeatIntervalSeconds??15,A=e.jobReconciliationIntervalSeconds??15,r=e.codebaseScanIntervalSeconds??i,o=e.gitFetchIntervalSeconds??n,l=null!==e.lastSeenAt&&null===e.disconnectedAt&&Date.now()-e.lastSeenAt.getTime()<=sQ(e);s.push({id:`agent-heartbeat:${e.id}`,kind:"AGENT_HEARTBEAT",runtime:"AGENT",status:l?"HEALTHY":"STALE",enabled:!0,cadenceSeconds:t,lastStartedAt:null,lastCompletedAt:elL(e.lastSeenAt),lastSucceededAt:elL(e.lastSeenAt),nextScheduledAt:e.lastSeenAt?new Date(e.lastSeenAt.getTime()+1e3*t).toISOString():null,durationMs:null,lastError:null,details:{agentId:e.id,agentName:e.name,connection:l?"ONLINE":"OFFLINE"}});let c=e.diskSpaceState,u=c?.enabled??!0,d=c?.lastReportedAt??null,h=0;try{let e=JSON.parse(c?.volumesJson??"[]");h=Array.isArray(e)?e.length:0}catch{h=0}s.push({id:`agent-disk-space:${e.id}`,kind:"AGENT_DISK_SPACE",runtime:"AGENT",status:u?elH(!0,!1,60,d,c?.lastError??null):"DISABLED",enabled:u,cadenceSeconds:60,lastStartedAt:null,lastCompletedAt:elL(d),lastSucceededAt:c?.lastError?null:elL(d),nextScheduledAt:u&&d?new Date(d.getTime()+6e4).toISOString():null,durationMs:null,lastError:c?.lastError??null,details:{agentId:e.id,agentName:e.name,volumes:h}}),s.push({id:`agent-job-reconciliation:${e.id}`,kind:"AGENT_JOB_RECONCILIATION",runtime:"AGENT",status:l?"HEALTHY":"STALE",enabled:!0,cadenceSeconds:A,lastStartedAt:null,lastCompletedAt:elL(e.lastSeenAt),lastSucceededAt:elL(e.lastSeenAt),nextScheduledAt:e.lastSeenAt?new Date(e.lastSeenAt.getTime()+1e3*A).toISOString():null,durationMs:null,lastError:null,details:{agentId:e.id,agentName:e.name,pendingJobs:a.get(e.id)??0}});let p=e.codebases.map(e=>e.lastCheckedAt).filter(e=>null!==e).sort((e,t)=>t.getTime()-e.getTime())[0]??null,g=e.codebases.map(e=>e.lastFetchAttemptAt??e.lastFetchedAt).filter(e=>null!==e).sort((e,t)=>t.getTime()-e.getTime())[0]??null,m=e.codebases.filter(e=>e.lastFetchError).length;s.push({id:`agent-codebase-scan:${e.id}`,kind:"CODEBASE_SCAN",runtime:"AGENT",status:elH(e.codebases.length>0,!1,r,p,null),enabled:e.codebases.length>0,cadenceSeconds:r,lastStartedAt:null,lastCompletedAt:elL(p),lastSucceededAt:elL(p),nextScheduledAt:p?new Date(p.getTime()+1e3*r).toISOString():null,durationMs:null,lastError:null,details:{agentId:e.id,agentName:e.name,repositories:e.codebases.length}}),s.push({id:`agent-git-fetch:${e.id}`,kind:"GIT_FETCH",runtime:"AGENT",status:m>0?"ERROR":elH(e.codebases.length>0,!1,o,g,null),enabled:e.codebases.length>0,cadenceSeconds:o,lastStartedAt:null,lastCompletedAt:elL(g),lastSucceededAt:m>0?null:elL(g),nextScheduledAt:g?new Date(g.getTime()+1e3*o).toISOString():null,durationMs:null,lastError:m>0?`${m} repositories have fetch errors`:null,details:{agentId:e.id,agentName:e.name,repositories:e.codebases.length,fetchErrors:m}})}return[...this.serverViews(),...s]}}let elq="default",elK="https://raw.githubusercontent.com/BerriAI/litellm/refs/heads/main/model_prices_and_context_window.json",elY=new Set(["sample_spec"]);function elW(e){return"number"==typeof e&&Number.isFinite(e)?e:null}function el$(e){let t=elW(e);return null===t?null:Math.trunc(t)}function elZ(e){return"string"==typeof e&&e.trim()?e.trim():null}function elz(e){let t=e.lastIndexOf("/");return t<0?e:e.slice(t+1)}let elX={MODEL:"model",PROVIDER:"provider",INPUT_COST:"inputCostPerToken",OUTPUT_COST:"outputCostPerToken",CACHE_READ_COST:"cacheReadCostPerToken",CACHE_WRITE_COST:"cacheWriteCostPerToken",CONTEXT_WINDOW:"maxInputTokens"};function el0(e){return{model:e.model,provider:e.provider,mode:e.mode,inputCostPerToken:e.inputCostPerToken,outputCostPerToken:e.outputCostPerToken,cacheReadCostPerToken:e.cacheReadCostPerToken,cacheWriteCostPerToken:e.cacheWriteCostPerToken,maxInputTokens:e.maxInputTokens,maxOutputTokens:e.maxOutputTokens,updatedAt:e.updatedAt.toISOString()}}class el1{refreshing=null;checkedAt=0;async getCatalog(){let e=await aJ(),t=await e.modelCostSettings.upsert({where:{id:elq},create:{id:elq},update:{}}),A=t.catalogUrl??elK;return{url:A,defaultUrl:elK,customUrl:t.catalogUrl,fetchedAt:t.fetchedAt?.toISOString()??null,entryCount:t.entryCount,error:t.error,stale:this.isStale(t.fetchedAt)||t.sourceUrl!==A}}isStale(e){return!e||Date.now()-e.getTime()>=864e5}async saveSettings(e){let t=e?.trim()??"",A=t&&t!==elK?t:null;if(A){let e;try{e=new URL(A)}catch{throw Error("The model cost URL must be a valid URL")}if("https:"!==e.protocol&&"http:"!==e.protocol)throw Error("The model cost URL must be an http or https URL")}let r=await aJ();await r.modelCostSettings.upsert({where:{id:elq},create:{id:elq,catalogUrl:A},update:{catalogUrl:A}}),this.checkedAt=0;let i=await this.getCatalog();return aq.publish(sn,{catalog:i}),i}async refresh(){return this.refreshing||(this.refreshing=this.runRefresh().finally(()=>{this.refreshing=null})),this.refreshing}async runRefresh(){let e=await aJ(),t=await this.getCatalog();try{let A=await fetch(t.url,{headers:{accept:"application/json"},signal:AbortSignal.timeout(3e4)});if(!A.ok)throw Error(`The model cost catalog request failed with ${A.status}`);let r=function(e){if(!e||"object"!=typeof e||Array.isArray(e))throw Error("The model cost catalog is not a JSON object");let t=[];for(let[A,r]of Object.entries(e)){if(elY.has(A)||!r||"object"!=typeof r||Array.isArray(r))continue;let e=elW(r.input_cost_per_token),i=elW(r.output_cost_per_token);if((null!==e||null!==i)&&(t.push({model:A,provider:elZ(r.litellm_provider),mode:elZ(r.mode),inputCostPerToken:e,outputCostPerToken:i,cacheReadCostPerToken:elW(r.cache_read_input_token_cost),cacheWriteCostPerToken:elW(r.cache_creation_input_token_cost),maxInputTokens:el$(r.max_input_tokens),maxOutputTokens:el$(r.max_output_tokens)}),t.length>=2e4))break}if(!t.length)throw Error("The model cost catalog contained no priced models");return t}(await A.json());await e.$transaction(async e=>{await e.modelCostEntry.deleteMany({});for(let t=0;t<r.length;t+=500)await e.modelCostEntry.createMany({data:r.slice(t,t+500)});await e.modelCostSettings.update({where:{id:elq},data:{fetchedAt:new Date,sourceUrl:t.url,entryCount:r.length,error:null}})})}catch(A){let t=A instanceof Error?A.message:String(A);await e.modelCostSettings.update({where:{id:elq},data:{error:t.slice(0,2e3)}})}let A=await this.getCatalog();return aq.publish(sn,{catalog:A}),A}async ensureFresh(){this.refreshing&&await this.refreshing,Date.now()-this.checkedAt<3e5||((await this.getCatalog()).stale&&await this.refresh(),this.checkedAt=Date.now())}async listEntries({search:e,first:t=100,offset:A=0,sortKey:r="MODEL",direction:i="ASC"}){var n;let a,s;await this.ensureFresh();let o=await aJ(),l=e?.trim(),c=l?{OR:[{model:{contains:l}},{provider:{contains:l}}]}:{},u=Math.min(Math.max(t??100,1),500),d=Math.max(A??0,0),[h,p]=await Promise.all([o.modelCostEntry.findMany({where:c,orderBy:(n=r??"MODEL",a="DESC"===(i??"ASC")?"desc":"asc","model"===(s=elX[n]??"model")?[{model:a}]:[{[s]:{sort:a,nulls:"last"}},{model:a}]),skip:d,take:u}),o.modelCostEntry.count({where:c})]);return{items:h.map(el0),totalCount:p}}async lookup(e){let t=[...new Set(e.filter(Boolean))],A=new Map;if(!t.length)return A;let r=await aJ(),i=[...new Set(t.flatMap(e=>[e,elz(e)]))],n=new Map((await r.modelCostEntry.findMany({where:{model:{in:i}}})).map(e=>[e.model,e])),a=[];for(let e of t){let t=n.get(e)??n.get(elz(e));t?A.set(e,el0(t)):a.push(e)}if(!a.length)return A;let s=await r.modelCostEntry.findMany({where:{OR:a.map(e=>({model:{endsWith:`/${elz(e)}`}}))}});for(let e of a){let t=elz(e).toLowerCase(),r=s.find(e=>elz(e.model).toLowerCase()===t);r&&A.set(e,el0(r))}return A}estimate(e,t){if(!e)return null;let A=e.inputCostPerToken,r=e.outputCostPerToken;if(null===A&&null===r)return null;let i=e.cacheReadCostPerToken??A??0,n=e.cacheWriteCostPerToken??A??0;return t.inputTokens*(A??0)+t.outputTokens*(r??0)+t.cacheReadTokens*i+t.cacheWriteTokens*n}}async function el8(e){if(!e.length)return[];let t=await aJ(),A=await t.runAttachment.findMany({where:{id:{in:e}}});if(A.length!==e.length)throw Error("Attachment is unavailable");let r=(0,A_.resolve)(function(){if(process.env.RUN_DATA_DIRECTORY)return(0,A_.resolve)(process.env.RUN_DATA_DIRECTORY);let e=process.env.DATABASE_URL||"file:./prisma/dev.db";return(0,A_.join)((0,A_.dirname)((0,A_.resolve)(aG(e))),"run-data")}(),"attachments");await (0,hx.mkdir)(r,{recursive:!0,mode:448});let i=[];try{for(let e of A){let A=(0,AP.randomUUID)(),n=(0,A_.join)(r,A);await (0,hx.copyFile)(e.storagePath,n),await t.runAttachment.create({data:{id:A,sha256:e.sha256,filename:e.filename,contentType:e.contentType,size:e.size,storagePath:n}}),i.push({id:A,path:n})}return i.map(({id:e})=>e)}catch(e){throw await t.runAttachment.deleteMany({where:{id:{in:i.map(({id:e})=>e)}}}),await el4(i.map(({path:e})=>e)),e}}async function el4(e){await Promise.all(e.map(e=>(0,hx.rm)(e,{force:!0})))}e.i(81111),e.i(188646);let el2=["PLAN","SESSION"],el3=["CODEX","CLAUDE","OPENCODE"],el6=new Set(["COMPLETED","CANCELLED","FAILED"]),el5="ANSWER_REVISION",el9=["PAUSED","COMPLETED","CANCELLED","FAILED","SUPERSEDED"];function el7(e,t,A){let r=t.trim().toUpperCase();if(!e.includes(r))throw Error(`${A} is not supported`);return r}function ece(e,t,A){let r=e.trim();if(!r)throw Error(`${t} is required`);if(r.length>A)throw Error(`${t} is too long`);return r}function ect(e,t){let A=e?.trim()||null;if(A&&A.length>t)throw Error("Value is too long");return A}function ecA(e){return ect(e,100)?.toUpperCase()??null}function ecr(e,t){let A=t??+("SESSION"===e);if(!Number.isInteger(A)||A<0||A>32)throw Error("Worktree concurrency limit must be between 0 and 32");return A}function eci(e){if(!e)return;let t=new Date(e);return Number.isNaN(t.getTime())?void 0:t}function ecn(e){return`/${"PLAN"===e.kind?"plans":"sessions"}/${encodeURIComponent(e.id)}`}function eca(e){let t={runChanged:{id:e}};aq.publish(sl(e),t),aq.publish(se,t),aq.publish(sp,{sidebarStatusChanged:!0})}function ecs(e,t){aq.publish(aY(t),{agentEvents:{type:"RUN_COMMAND_AVAILABLE",job:null,runCommand:e}})}async function eco(e,t){return(await e.runNumberSequence.upsert({where:{kind:t},create:{kind:t,nextValue:1},update:{nextValue:{increment:1}}})).nextValue-1}async function ecl(e,t){let A=await e.runCommand.findFirst({where:{runId:t},orderBy:{sequence:"desc"},select:{sequence:!0}});return(A?.sequence??-1)+1}let ecc={run:{include:{worktree:!0,inputs:{include:{attachments:!0}},attempts:!0,sourcePlan:{include:{attempts:!0}},parentRun:{include:{attempts:!0}}}}};async function ecu(e,t){let A=await ecl(e,t.runId);return e.runCommand.create({data:{id:(0,AP.randomUUID)(),runId:t.runId,agentId:t.agentId,sequence:A,type:t.type,payloadJson:JSON.stringify(t.payload??{}),idempotencyKey:t.idempotencyKey??`${t.runId}:${A}:${t.type}`},include:ecc})}let ecd={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"}}};class ech{notifications;agentControl;diskSpace;reaperTimer;mcpPresetResolver;worktreeAdmissionPromoter;constructor(e,t,A){this.notifications=e,this.agentControl=t,this.diskSpace=A}setMcpPresetResolver(e){this.mcpPresetResolver=e}setWorktreeAdmissionPromoter(e){this.worktreeAdmissionPromoter=e}async promoteQueuedLane(e,t){let A=await aJ(),r=await A.$transaction(async A=>{let r=new Date;await A.worktreeAdmissionLane.upsert({where:{worktreeId:e},create:{worktreeId:e},update:{updatedAt:r}}),await A.worktreeRunConcurrencyLane.upsert({where:{worktreeId_kind:{worktreeId:e,kind:t}},create:{worktreeId:e,kind:t},update:{updatedAt:r}}),await A.worktreeRunLease.deleteMany({where:{worktreeId:e,purpose:{not:el5},run:{status:{in:[...el6]}}}}),await A.worktreeWorkflowLease.deleteMany({where:{worktreeId:e,workflowRun:{status:{in:["SUCCEEDED","FAILED","CANCELLED"]}}}});let i=await A.worktreeWorkflowLease.findUnique({where:{worktreeId:e}}),n=i?null:await A.workflowRun.findFirst({where:{worktreeId:e,status:"QUEUED",parentRunId:null,worktreeConcurrency:"EXCLUSIVE"},orderBy:[{queuedAt:"asc"},{id:"asc"}],select:{id:!0,queuedAt:!0}}),a=await A.worktreeRunLease.count({where:{worktreeId:e,OR:[{run:{kind:t,origin:"MANAGED",status:{in:["IN_PROGRESS","PAUSED"]}}},{purpose:el5,run:{kind:t,origin:"MANAGED"}}]}}),s=await A.agentRun.findMany({where:{worktreeId:e,kind:t,origin:"MANAGED",status:"QUEUED"},orderBy:[{createdAt:"asc"},{id:"asc"}],select:{id:!0,agentId:!0,createdAt:!0,worktreeConcurrencyLimit:!0,workflowRun:{select:{worktreeLeaseOwnerRunId:!0}}}}),o=[];for(let t of i?s.filter(e=>e.workflowRun?.worktreeLeaseOwnerRunId===i.workflowRunId):s){if(n&&function(e,t,A,r){let i=e.getTime()-A.getTime();return i<0||0===i&&t<r}(n.queuedAt,n.id,t.createdAt,t.id)||0!==t.worktreeConcurrencyLimit&&a>=t.worktreeConcurrencyLimit)break;if(!(await A.agentRun.updateMany({where:{id:t.id,status:"QUEUED"},data:{status:"IN_PROGRESS",phase:"QUEUED"}})).count)continue;await A.worktreeRunLease.create({data:{id:(0,AP.randomUUID)(),worktreeId:e,runId:t.id}}),a+=1;let r=await A.runCommand.findFirst({where:{runId:t.id,status:"QUEUED"},orderBy:{sequence:"asc"},include:ecc});r&&t.agentId&&o.push({runId:t.id,agentId:t.agentId,command:r})}return o});for(let e of r)eca(e.runId),ecs(e.command,e.agentId);return r.length}async promoteQueuedLaneSafely(e,t){try{await this.promoteQueuedLane(e,t),await this.worktreeAdmissionPromoter?.(e)}catch(A){console.error(`Could not promote ${t.toLowerCase()} queue for ${e}:`,A instanceof Error?A.message:A)}}async reconcileQueuedRuns(e){let t=await aJ(),A=await t.agentRun.findMany({where:{origin:"MANAGED",status:"QUEUED",worktreeId:{not:null},...e?{agentId:e}:{}},select:{worktreeId:!0,kind:!0},distinct:["worktreeId","kind"]}),r=0;for(let e of A)e.worktreeId&&("PLAN"===e.kind||"SESSION"===e.kind)&&(r+=await this.promoteQueuedLane(e.worktreeId,e.kind));return r}async waitForJob(e){let t=aq.iterate(aW(e)),A=Date.now()+6e4;try{for(;Date.now()<A;){let r=await this.agentControl.getJob(e);if(!r)throw Error("Agent job disappeared");if(["SUCCEEDED","FAILED","CANCELLED","TIMED_OUT"].includes(r.status))return r;await Promise.race([t.next(),new Promise(e=>setTimeout(e,A-Date.now()))])}throw await this.agentControl.cancelJob(e),Error("Agent did not respond in time")}finally{await t.return?.()}}async nativeSessionFile(e){var t;if(!this.agentControl)throw Error("Agent control is unavailable");let A=await aJ(),r=await A.agentRun.findUnique({where:{id:e},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(e=>e.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!==(t=r.agent).lastSeenAt&&Date.now()-t.lastSeenAt.getTime()<=sQ(t)&&null===t.disconnectedAt))throw Error("Agent is offline");if(!(function(e){try{let t=JSON.parse(e.capabilitiesJson);return Array.isArray(t)?t.filter(e=>"string"==typeof e):[]}catch{return[]}})(r.agent).includes(i3))throw Error("Agent must be updated to export session files");let n=await this.agentControl.createJob({agentId:r.agentId,kind:i3,payload:{provider:r.provider,nativeId:i,folder:r.worktree.folder},idempotencyKey:`runs:session:read:${e}:${i}`,timeoutSeconds:60,visibility:"SYSTEM"});try{let e=function(e){if("SUCCEEDED"!==e.status||!e.resultJson)throw Error(e.error||"Agent job failed");let t=JSON.parse(e.resultJson);if(!t||"object"!=typeof t||Array.isArray(t))throw Error("Agent job returned an invalid result");return t}(await this.waitForJob(n.id)),t="string"==typeof e.contentBase64?e.contentBase64:null;if(!t)throw Error("Agent returned an invalid session file");return{filename:"string"==typeof e.filename&&e.filename?e.filename:`${i}.jsonl`,contentBase64:t}}finally{await A.agentJob.deleteMany({where:{id:n.id,visibility:"SYSTEM"}})}}startReaper(e=6e4){this.reaperTimer||(this.reaperTimer=setInterval(()=>{this.reapOrphanedRuns().catch(e=>{console.error("Run reaper failed:",e instanceof Error?e.message:e)})},e),this.reaperTimer.unref())}stopReaper(){this.reaperTimer&&clearInterval(this.reaperTimer),this.reaperTimer=void 0}async reapOrphanedRuns(e=Date.now()){let t=await aJ(),A=await t.agentRun.findMany({where:{status:"IN_PROGRESS"},select:{id:!0,agentId:!0,worktreeId:!0,kind:!0}});if(!A.length)return 0;let r=[...new Set(A.map(e=>e.agentId).filter(e=>!!e))],i=new Set((r.length?await t.agent.findMany({where:{id:{in:r}},select:{id:!0,lastSeenAt:!0,disconnectedAt:!0,heartbeatIntervalSeconds:!0}}):[]).filter(t=>null===t.disconnectedAt&&null!==t.lastSeenAt&&e-t.lastSeenAt.getTime()<=sQ(t)+12e4).map(e=>e.id)),n=A.filter(e=>!e.agentId||!i.has(e.agentId)).map(e=>e.id);if(!n.length)return 0;let a=new Date(e);for(let e of(await t.$transaction(async e=>{await e.runAttempt.updateMany({where:{runId:{in:n},status:{notIn:el9}},data:{status:"FAILED",finishedAt:a}}),await e.agentRun.updateMany({where:{id:{in:n},status:{notIn:[...el6]}},data:{status:"FAILED",phase:"AGENT_OFFLINE",error:"Agent went offline while this run was active",finishedAt:a}}),await e.runCommand.updateMany({where:{runId:{in:n},status:{in:["QUEUED","RUNNING"]}},data:{status:"FAILED",error:"Agent went offline",finishedAt:a}}),await e.worktreeRunLease.deleteMany({where:{runId:{in:n}}})}),n))eca(e);for(let e of new Set(A.filter(e=>n.includes(e.id)&&e.worktreeId).map(e=>`${e.worktreeId}:${e.kind}`))){let t=e.lastIndexOf(":"),A=e.slice(0,t),r=e.slice(t+1);("PLAN"===r||"SESSION"===r)&&await this.promoteQueuedLaneSafely(A,r)}return n.length}async list(e){let t=el7(el2,e.kind,"Run kind"),A=Math.max(1,Math.min(e.first??100,200)),r=e.search?.trim(),i=e.archive?.toUpperCase()??"ACTIVE",n={kind:t,..."ARCHIVED"===i?{archivedAt:{not:null}}:"ALL"===i?{}:{archivedAt:null},...e.provider?{provider:e.provider.trim().toUpperCase()}:{},...e.origin?{origin:e.origin.trim().toUpperCase()}:{},...e.appId?{repository:{apps:{some:{appId:e.appId}}}}:{},...r?{OR:[{initialPrompt:{contains:r}},{repositoryName:{contains:r}},{branch:{contains:r}},{jiraIssueKey:{contains:r}},{model:{contains:r}}]}:{}},a=await aJ(),[s,o]=await Promise.all([a.agentRun.findMany({where:n,orderBy:[{createdAt:"desc"},{id:"desc"}],take:A+1,...e.after?{cursor:{id:e.after},skip:1}:{},include:{worktree:!0,sourcePlan:!0,playedSession:!0}}),a.agentRun.count({where:n})]);return{items:s.slice(0,A),nextCursor:s.length>A?s[A-1].id:null,totalCount:o}}async get(e){return(await aJ()).agentRun.findUnique({where:{id:e},include:ecd})}async events(e){let t=await aJ(),A=Math.max(1,Math.min(e.first??200,500));return t.runEvent.findMany({where:{runId:e.runId,sequence:{gt:e.afterSequence??-1},...e.includeSuperseded?{}:{supersededAt:null},...e.search?.trim()?{searchText:{contains:e.search.trim()}}:{}},orderBy:{sequence:"asc"},take:A})}async questions(e){let t=await aJ(),A=Math.max(1,Math.min(e.first??100,200)),r={runId:e.runId},[i,n]=await Promise.all([t.runQuestionBatch.findMany({where:r,orderBy:[{createdAt:"asc"},{id:"asc"}],take:A+1,...e.after?{cursor:{id:e.after},skip:1}:{},include:{questions:{orderBy:{position:"asc"},include:{options:{orderBy:{position:"asc"}}}},answerRevisions:{orderBy:{revision:"asc"}},checkpoint:!0}}),t.runQuestionBatch.count({where:r})]);return{items:i.slice(0,A),nextCursor:i.length>A?i[A-1].id:null,totalCount:n}}async usage(e){return(await aJ()).agentRun.findUnique({where:{id:e},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(e){let t=await aJ(),A=await t.agentRun.findUnique({where:{id:e},select:{sourcePlanId:!0,parentRunId:!0}});return A?t.agentRun.findMany({where:{OR:[{id:{in:[A.sourcePlanId,A.parentRunId].filter(e=>!!e)}},{sourcePlanId:e},{parentRunId:e}]},orderBy:{createdAt:"asc"}}):[]}async drafts(e={}){let t=await aJ(),A=Math.max(1,Math.min(e.first??100,200)),r=e.archive?.toUpperCase()??"ACTIVE",i=e.search?.trim(),n={..."ARCHIVED"===r?{archivedAt:{not:null}}:"ALL"===r?{}:{archivedAt:null},...i?{OR:[{prompt:{contains:i}},{jiraIssueKey:{contains:i}},{provider:{contains:i}},{model:{contains:i}}]}:{}},[a,s]=await Promise.all([t.runDraft.findMany({where:n,orderBy:[{updatedAt:"desc"},{id:"desc"}],take:A+1,...e.after?{cursor:{id:e.after},skip:1}:{},include:{worktree:!0,attachments:!0}}),t.runDraft.count({where:n})]);return{items:a.slice(0,A),nextCursor:a.length>A?a[A-1].id:null,totalCount:s}}async draft(e){return(await aJ()).runDraft.findUnique({where:{id:e},include:{worktree:!0,attachments:!0}})}async questionBatch(e){return(await aJ()).runQuestionBatch.findUnique({where:{id:e},include:{questions:{orderBy:{position:"asc"},include:{options:{orderBy:{position:"asc"}}}},answerRevisions:{orderBy:{revision:"asc"}}}})}async saveDraft(e){let t=el7(el2,e.kind,"Run kind"),A=el7(el3,e.provider,"Provider"),r=ece(e.prompt,"Prompt",2e5),i=await this.requireWorktree(e.worktreeId),n=[...new Set(e.attachmentIds??[])],a=[...new Set(e.mcpPresetIds??[])];await this.requireAttachments(n,e.id??void 0);let s=await aJ(),o=e.id??(0,AP.randomUUID)(),l=await s.$transaction(async s=>{let l=await s.runDraft.upsert({where:{id:o},create:{id:o,kind:t,worktreeId:i.id,agentId:i.codebase.agentId,jiraIssueKey:ecA(e.jiraIssueKey),provider:A,model:ece(e.model,"Model",200),effort:ect(e.effort,100),webSearchEnabled:!1!==e.webSearchEnabled,mcpPresetIdsJson:JSON.stringify(a),prompt:r},update:{kind:t,worktreeId:i.id,agentId:i.codebase.agentId,jiraIssueKey:ecA(e.jiraIssueKey),provider:A,model:ece(e.model,"Model",200),effort:ect(e.effort,100),webSearchEnabled:!1!==e.webSearchEnabled,mcpPresetIdsJson:JSON.stringify(a),prompt:r}});return n.length&&await s.runAttachment.updateMany({where:{id:{in:n},inputId:null},data:{draftId:o}}),await s.runAttachment.updateMany({where:{draftId:o,...n.length?{id:{notIn:n}}:{}},data:{draftId:null}}),l});return aq.publish(se,{runChanged:{id:l.id}}),this.draft(l.id)}async create(e){return this.createInternal(e)}async createInternal(e,t={}){let A=el7(el2,e.kind,"Run kind"),r=ecr(A,e.worktreeConcurrencyLimit),i=el7(el3,e.provider,"Provider"),n=ece(e.prompt,"Prompt",2e5),a=ece(e.model,"Model",200),s=await this.requireWorktree(e.worktreeId,i);await this.diskSpace?.assertWorktreeCanStart(s.id);let o=this.mcpPresetResolver?await this.mcpPresetResolver(A,[...new Set(e.mcpPresetIds??[])]):{presetIds:[],toolNames:[]},l=[...new Set(e.attachmentIds??[])];await this.requireAttachments(l,e.draftId??void 0);let c=await aJ(),u=await c.$transaction(async c=>{let u=await eco(c,A),d=(0,AP.randomUUID)(),h=(0,AP.randomUUID)(),p=e.sourcePlanId?await c.agentRun.findUnique({where:{id:e.sourcePlanId}}):null;if(e.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 g=e.parentRunId?await c.agentRun.findUnique({where:{id:e.parentRunId}}):null,m=t.transferLeaseFromRunId?await c.worktreeRunLease.findUnique({where:{runId:t.transferLeaseFromRunId}}):null,f=m?.worktreeId===s.id;t.transferLeaseFromRunId&&await c.agentRun.update({where:{id:t.transferLeaseFromRunId},data:{status:"CANCELLED",phase:"SUPERSEDED_BY_FOLLOW_UP",finishedAt:new Date}});let I=await c.agentRun.create({data:{id:d,kind:A,displayNumber:u,status:f?"IN_PROGRESS":"QUEUED",phase:f?"QUEUED":"WAITING_FOR_WORKTREE",provider:i,worktreeId:s.id,repositoryId:s.codebase.repository.id,agentId:s.codebase.agentId,jiraIssueKey:ecA(e.jiraIssueKey),repositoryName:s.codebase.repository.name,branch:s.branch,model:a,effort:ect(e.effort,100),webSearchEnabled:!1!==e.webSearchEnabled,mcpPresetIdsJson:JSON.stringify(o.presetIds),mcpToolNamesJson:JSON.stringify(o.toolNames),worktreeConcurrencyLimit:r,workflowRunId:e.workflowRunId??null,initialPrompt:n,sourcePlanId:p?.id,sourcePlanNumber:p?.displayNumber,parentRunId:g?.id,parentRunNumber:g?.displayNumber,followUpMode:ect(e.followUpMode,50),inputs:{create:{id:h,sequence:0,kind:"INITIAL",prompt:n}}}});if(p&&await c.agentRun.update({where:{id:p.id},data:{playedAt:new Date,playedSessionNumber:u}}),f&&await c.worktreeRunLease.update({where:{runId:t.transferLeaseFromRunId},data:{runId:d,purpose:"RUN",reservationKey:null,acquiredAt:new Date}}),l.length&&(await c.runAttachment.updateMany({where:{id:{in:l},inputId:null},data:{inputId:h,draftId:null}})).count!==l.length)throw Error("One or more attachments are no longer available");return e.draftId&&await c.runDraft.deleteMany({where:{id:e.draftId}}),{run:I,command:await ecu(c,{runId:d,agentId:s.codebase.agentId,type:e.sourcePlanId?"PLAY_PLAN":"START",payload:{contextMode:e.contextMode??null,sourcePlanId:e.sourcePlanId??null,parentRunId:e.parentRunId??null,followUpMode:e.followUpMode??null}}),transfersSlot:f}});return eca(u.run.id),t.transferLeaseFromRunId&&eca(t.transferLeaseFromRunId),u.transfersSlot&&ecs(u.command,u.run.agentId),await this.promoteQueuedLaneSafely(s.id,A),this.get(u.run.id)}async playPlan(e,t=[],A,r){let i=await this.get(e);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:
|
|
13221
|
+
`)}}(t={...t,secret:r,baseURL:u?t.baseURL:d?new URL(d).origin:"",basePath:t.basePath||"/api/auth",plugins:o.concat(l)},c);let I=t.advanced?.ipAddress?.trustedProxies;if(I&&I.length>0){let e=I.filter(e=>null===eAT(e));e.length>0&&c.warn(`Ignoring invalid \`advanced.ipAddress.trustedProxies\` entries: ${e.join(", ")}. Each entry must be an IP address or CIDR range.`)}let w=(0,er$.getCookies)(t),C=(0,erR.getAuthTables)(t),y=(await Promise.all(Object.entries(t.socialProviders||{}).map(async([e,t])=>{let A="function"==typeof t?await t():t;if(null==A||!1===A.enabled)return null;A.clientId||c.warn(`Social provider ${e} is missing clientId or clientSecret`);let r=eaN[e](A);return r.disableImplicitSignUp=A.disableImplicitSignUp,r}))).filter(e=>null!==e),E=({model:e,size:A})=>{if("function"==typeof t.advanced?.generateId)return t.advanced.generateId({model:e,size:A});let r=t?.advanced?.database?.generateId;return"function"==typeof r?r({model:e,size:A}):"uuid"===r?crypto.randomUUID():"serial"!==r&&!1!==r&&(0,eAL.generateId)(A)},{publish:Q}=await esO(t,{adapter:e.id,database:"function"==typeof t.database?"adapter":A(t.database)}),B=new Set(t.plugins.map(e=>e.id)),b=await eic(t),D=await eip(t),k={appName:t.appName||"Better Auth",baseURL:d||"",version:(0,esf.getBetterAuthVersion)(),socialProviders:y,options:t,oauthConfig:{storeStateStrategy:t.account?.storeStateStrategy||(s?"database":"cookie"),skipStateCookieCheck:!!t.account?.skipStateCookieCheck},tables:C,trustedOrigins:b,trustedProviders:D,isTrustedOrigin(e,t){return this.trustedOrigins.some(A=>erL(e,A,t))},sessionConfig:{updateAge:t.session?.updateAge!==void 0?t.session.updateAge:86400,expiresIn:t.session?.expiresIn||604800,freshAge:t.session?.freshAge===void 0?86400:t.session.freshAge,cookieRefreshCache:(n=t.session?.cookieCache?.refreshCache,a=t.session?.cookieCache?.maxAge||300,s&&n?(c.warn("[better-auth] `session.cookieCache.refreshCache` is enabled while `database` or `secondaryStorage` is configured. `refreshCache` is meant for stateless (DB-less) setups. Disabling `refreshCache` — remove it from your config to silence this warning."),!1):!1!==n&&void 0!==n&&(!0===n?{enabled:!0,updateAge:Math.floor(.2*a)}:{enabled:!0,updateAge:void 0!==n.updateAge?n.updateAge:Math.floor(.2*a)}))},secret:r,secretConfig:i,rateLimit:{...t.rateLimit,enabled:t.rateLimit?.enabled??eAB.isProduction,window:t.rateLimit?.window||10,max:t.rateLimit?.max||100,storage:t.rateLimit?.storage||(t.secondaryStorage?"secondary-storage":"memory")},authCookies:w,logger:c,generateId:E,session:null,secondaryStorage:t.secondaryStorage,password:{hash:t.emailAndPassword?.password?.hash||erK,verify:t.emailAndPassword?.password?.verify||erW,config:{minPasswordLength:t.emailAndPassword?.minPasswordLength||8,maxPasswordLength:t.emailAndPassword?.maxPasswordLength||128},checkPassword:eif},setNewSession(e){this.newSession=e},newSession:null,adapter:e,internalAdapter:er7(e,{options:t,logger:c,hooks:t.databaseHooks?[{source:"user",hooks:t.databaseHooks}]:[],generateId:E}),createAuthCookie:(0,er$.createCookieGetter)(t),async runMigrations(){throw new eAO.BetterAuthError("runMigrations will be set by the specific init implementation")},publishTelemetry:Q,skipCSRFCheck:!!t.advanced?.disableCSRFCheck,skipOriginCheck:t.advanced?.disableOriginCheck!==void 0?t.advanced.disableOriginCheck:!!(0,eAB.isTest)(),runInBackground:t.advanced?.backgroundTasks?.handler??(e=>{e.catch(()=>{})}),async runInBackgroundOrAwait(e){try{t.advanced?.backgroundTasks?.handler?e instanceof Promise&&t.advanced.backgroundTasks.handler(e.catch(e=>{c.error("Failed to run background task:",e)})):await e}catch(e){c.error("Failed to run background task:",e)}},getPlugin:e=>t.plugins.find(t=>t.id===e)??null,hasPlugin:e=>B.has(e)},S=eil(k);return(0,erj.isPromise)(S)&&await S,k}let es_=async e=>{let t=await erU(e),A=await esJ(t,e,e=>(0,erx.getKyselyDatabaseType)(e)||"unknown");return A.runMigrations=async function(){if(!e.database||"updateMany"in e.database)throw new eAO.BetterAuthError("Database is not provided or it's an adapter. Migrations are only supported with a database instance.");let{runMigrations:t}=await er_(e);await t()},A};var esV=e.i(779198),esP=e.i(595544);let esL=(0,eAq.createAccessControl)({user:["create","list","set-role","ban","impersonate","impersonate-admins","delete","set-password","set-email","get","update"],session:["list","revoke","delete"]}),esH={admin:esL.newRole({user:["create","list","set-role","ban","impersonate","delete","set-password","set-email","get","update"],session:["list","revoke","delete"]}),user:esL.newRole({user:[],session:[]})},esj=(0,eAy.defineErrorCodes)({FAILED_TO_CREATE_USER:"Failed to create user",USER_ALREADY_EXISTS:"User already exists.",USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL:"User already exists. Use another email.",YOU_CANNOT_BAN_YOURSELF:"You cannot ban yourself",YOU_ARE_NOT_ALLOWED_TO_CHANGE_USERS_ROLE:"You are not allowed to change users role",YOU_ARE_NOT_ALLOWED_TO_CREATE_USERS:"You are not allowed to create users",YOU_ARE_NOT_ALLOWED_TO_LIST_USERS:"You are not allowed to list users",YOU_ARE_NOT_ALLOWED_TO_LIST_USERS_SESSIONS:"You are not allowed to list users sessions",YOU_ARE_NOT_ALLOWED_TO_BAN_USERS:"You are not allowed to ban users",YOU_ARE_NOT_ALLOWED_TO_IMPERSONATE_USERS:"You are not allowed to impersonate users",YOU_ARE_NOT_ALLOWED_TO_REVOKE_USERS_SESSIONS:"You are not allowed to revoke users sessions",YOU_ARE_NOT_ALLOWED_TO_DELETE_USERS:"You are not allowed to delete users",YOU_ARE_NOT_ALLOWED_TO_SET_USERS_PASSWORD:"You are not allowed to set users password",BANNED_USER:"You have been banned from this application",YOU_ARE_NOT_ALLOWED_TO_GET_USER:"You are not allowed to get user",NO_DATA_TO_UPDATE:"No data to update",YOU_ARE_NOT_ALLOWED_TO_UPDATE_USERS:"You are not allowed to update users",YOU_CANNOT_REMOVE_YOURSELF:"You cannot remove yourself",YOU_ARE_NOT_ALLOWED_TO_SET_NON_EXISTENT_VALUE:"You are not allowed to set a non-existent role value",YOU_CANNOT_IMPERSONATE_ADMINS:"You cannot impersonate admins",INVALID_ROLE_TYPE:"Invalid role type",YOU_ARE_NOT_ALLOWED_TO_SET_USERS_EMAIL:"You are not allowed to update users email",PASSWORD_CANNOT_BE_UPDATED_VIA_UPDATE_USER:"Password cannot be updated through update-user. Use the set-user-password endpoint instead"}),esq=async e=>{let t=e.context.returned;return t?t instanceof Response?200!==t.status?null:await t.clone().json():(0,eiI.isAPIError)(t)?null:t:null},esK=e=>{if(e.userId&&e.options?.adminUserIds?.includes(e.userId))return!0;if(!e.permissions)return!1;let t=(e.role||e.options?.defaultRole||"user").split(","),A=e.options?.roles||esH;for(let r of t)if(A[r]?.authorize(e.permissions)?.success)return!0;return!1};var esY=e.i(752067);let esW=(0,eAQ.createAuthMiddleware)(async e=>{let t=await (0,eAJ.getAuthoritativeSessionFromCtx)(e);if(!t)throw eAO.APIError.fromStatus("UNAUTHORIZED");return{session:t}});function es$(e){return Array.isArray(e)?e.join(","):e}let esZ=by.object({userId:XD.coerce.string().meta({description:"The user id"}),role:by.union([by.string().meta({description:"The role to set. `admin` or `user` by default"}),by.array(by.string().meta({description:"The roles to set. `admin` or `user` by default"}))]).meta({description:"The role to set, this can be a string or an array of strings. Eg: `admin` or `[admin, user]`"})}),esz=by.object({id:by.string().meta({description:"The id of the User"})}),esX=by.object({email:by.string().meta({description:"The email of the user"}),password:by.string().optional().meta({description:"The password of the user. If not provided, the user will be created without a credential account (useful for magic link or social login only users)."}),name:by.string().meta({description:"The name of the user"}),role:by.union([by.string().meta({description:"The role of the user"}),by.array(by.string().meta({description:"The roles of user"}))]).optional().meta({description:'A string or array of strings representing the roles to apply to the new user. Eg: "user"'}),data:by.record(by.string(),by.any()).optional().meta({description:"Extra fields for the user. Including custom additional fields."})}),es0=by.object({userId:XD.coerce.string().meta({description:"The user id"}),data:by.record(by.any(),by.any()).meta({description:"The user data to update"})}),es1=by.object({searchValue:by.string().optional().meta({description:'The value to search for. Eg: "some name"'}),searchField:by.enum(["email","name"]).meta({description:'The field to search in, defaults to email. Can be `email` or `name`. Eg: "name"'}).optional(),searchOperator:by.enum(["contains","starts_with","ends_with"]).meta({description:'The operator to use for the search. Can be `contains`, `starts_with` or `ends_with`. Eg: "contains"'}).optional(),limit:by.string().meta({description:"The number of users to return"}).or(by.number()).optional(),offset:by.string().meta({description:"The offset to start from"}).or(by.number()).optional(),sortBy:by.string().meta({description:"The field to sort by"}).optional(),sortDirection:by.enum(["asc","desc"]).meta({description:"The direction to sort by"}).optional(),filterField:by.string().meta({description:"The field to filter by"}).optional(),filterValue:by.string().meta({description:"The value to filter by"}).or(by.number()).or(by.boolean()).or(by.array(by.string())).or(by.array(by.number())).optional(),filterOperator:by.enum(esY.whereOperators).meta({description:"The operator to use for the filter"}).optional()}),es8=by.object({userId:XD.coerce.string().meta({description:"The user id"})}),es4=by.object({userId:XD.coerce.string().meta({description:"The user id"})}),es2=by.object({userId:XD.coerce.string().meta({description:"The user id"}),banReason:by.string().meta({description:"The reason for the ban"}).optional(),banExpiresIn:by.number().meta({description:"The number of seconds until the ban expires"}).optional()}),es3=by.object({userId:XD.coerce.string().meta({description:"The user id"})}),es6=by.object({sessionToken:by.string().meta({description:"The session token"})}),es5=by.object({userId:XD.coerce.string().meta({description:"The user id"})}),es9=by.object({userId:XD.coerce.string().meta({description:"The user id"})}),es7=by.object({newPassword:by.string().nonempty("newPassword cannot be empty").meta({description:"The new password"}),userId:XD.coerce.string().nonempty("userId cannot be empty").meta({description:"The user id"})}),eoe=by.object({userId:XD.coerce.string().optional().meta({description:'The user id. Eg: "user-id"'}),role:by.string().optional().meta({description:'The role to check permission for. Eg: "admin"'})}).and(by.xor([by.object({permission:by.record(by.string(),by.array(by.string()))}),by.object({permissions:by.record(by.string(),by.array(by.string()))})])),eot={user:{fields:{role:{type:"string",required:!1,input:!1},banned:{type:"boolean",defaultValue:!1,required:!1,input:!1},banReason:{type:"string",required:!1,input:!1},banExpires:{type:"date",required:!1,input:!1}}},session:{fields:{impersonatedBy:{type:"string",required:!1,input:!1}}}};var eoA=e.i(259968),eor=e.i(976394);function eoi(e){try{return decodeURIComponent(e)}catch{return e}}let eon=(0,eAy.defineErrorCodes)({INVALID_OAUTH_CONFIGURATION:"Invalid OAuth configuration",TOKEN_URL_NOT_FOUND:"Invalid OAuth configuration. Token URL not found.",PROVIDER_CONFIG_NOT_FOUND:"No config found for provider",PROVIDER_ID_REQUIRED:"Provider ID is required",INVALID_OAUTH_CONFIG:"Invalid OAuth configuration.",SESSION_REQUIRED:"Session is required",ISSUER_MISMATCH:"OAuth issuer mismatch. The authorization server issuer does not match the expected value (RFC 9207).",ISSUER_MISSING:"OAuth issuer parameter missing. The authorization server did not include the required iss parameter (RFC 9207)."});function eoa(e){return null!=e&&""!==e}let eos=by.object({providerId:by.string().meta({description:"The provider ID for the OAuth provider"}),callbackURL:by.string().meta({description:"The URL to redirect to after sign in"}).optional(),errorCallbackURL:by.string().meta({description:"The URL to redirect to if an error occurs"}).optional(),newUserCallbackURL:by.string().meta({description:'The URL to redirect to after login if the user is new. Eg: "/welcome"'}).optional(),disableRedirect:by.boolean().meta({description:"Disable redirect"}).optional(),scopes:by.array(by.string()).meta({description:"Scopes to be passed to the provider authorization request."}).optional(),requestSignUp:by.boolean().meta({description:"Explicitly request sign-up. Useful when disableImplicitSignUp is true for this provider. Eg: false"}).optional(),additionalData:by.record(by.string(),by.any()).optional()}),eoo=by.object({code:by.string().meta({description:"The OAuth2 code"}).optional(),error:by.string().meta({description:"The error message, if any"}).optional(),error_description:by.string().meta({description:"The error description, if any"}).optional(),state:by.string().meta({description:"The state parameter from the OAuth2 request"}).optional(),iss:by.string().meta({description:"The issuer identifier"}).optional()}),eol=by.object({providerId:by.string(),callbackURL:by.string(),scopes:by.array(by.string()).meta({description:"Additional scopes to request when linking the account"}).optional(),errorCallbackURL:by.string().meta({description:"The URL to redirect to if there is an error during the link process"}).optional()});async function eoc(e,t){if(e.idToken){let t=eaw(e.idToken);if(t&&t.sub&&t.email)return{id:t.sub,emailVerified:t.email_verified,image:t.picture,...t}}if(!t)return null;let A=(await eae(t,{method:"GET",headers:{Authorization:`Bearer ${e.accessToken}`}})).data;if(!A)return null;let{id:r,...i}=A,n=eoa(r)?r:eoa(A.sub)?A.sub:void 0;return{...i,...void 0!==n?{id:n}:{},email:A?.email,emailVerified:A?.email_verified??!1,image:A?.picture,name:A?.name}}function eou(e){return null!=e&&""!==e}let eod=async e=>{let t=await eAG("SHA-256").digest(new TextEncoder().encode(e));return eAN.base64Url.encode(new Uint8Array(t),{padding:!1})},eoh=by.object({token:by.string().meta({description:'The token to verify. Eg: "some-token"'})});function eop(e,t){return e[t]?.trim()||void 0}function eog(e,t){let A=eop(e,t);if(!A)throw Error(`${t} is required for AUTH_MODE.`);return A}let eom="default";async function eof(){let e=await aJ();return await e.authSettings.findUnique({where:{id:eom}})??await e.authSettings.upsert({where:{id:eom},create:{id:eom},update:{}})}async function eoI({allowWhenRegistrationClosed:e=!1}={}){let t=await aJ(),A=await eof();if(A.bootstrapCompleted){if(!A.registrationEnabled&&!e)throw new eAO.APIError("FORBIDDEN",{message:"Account registration is disabled."});return}if(await t.user.count()>0){if(await t.authSettings.update({where:{id:eom},data:{bootstrapCompleted:!0,registrationEnabled:!1,bootstrapClaimId:null,bootstrapClaimedAt:null}}),e)return;throw new eAO.APIError("FORBIDDEN",{message:"Account registration is disabled."})}let r=new Date(Date.now()-18e4),i=(0,AP.randomUUID)();if(1!==(await t.authSettings.updateMany({where:{id:eom,bootstrapCompleted:!1,OR:[{bootstrapClaimedAt:null},{bootstrapClaimedAt:{lt:r}}]},data:{bootstrapClaimId:i,bootstrapClaimedAt:new Date}})).count)throw new eAO.APIError("CONFLICT",{message:"The initial account is already being created. Try again shortly."})}async function eow(){let e=await aJ();await e.authSettings.updateMany({where:{id:eom,bootstrapCompleted:!1},data:{bootstrapCompleted:!0,registrationEnabled:!1,bootstrapClaimId:null,bootstrapClaimedAt:null}})}let eoC={user:{create:{before:async(e,t)=>(await eoI({allowWhenRegistrationClosed:t?.path?.includes("/admin/create-user")??!1}),{data:{...e,role:"user",banned:!1,banReason:null,banExpires:null}}),after:async()=>{await eow()}},update:{before:async e=>({data:{...e,role:"user",banned:!1,banReason:null,banExpires:null}})},delete:{before:async()=>{throw new eAO.APIError("BAD_REQUEST",{message:"Accounts must be deleted through the management API."})}}}},eoy={user:["create","list","set-password","set-email","get","update"],session:["list","revoke","delete"]},eoE=(0,eAq.createAccessControl)(eoy),eoQ=eoE.newRole(eoy),eoB=null;function eob(){return eoB||(eoB=aJ().then(t=>(function(t,A=function(e=process.env){let t=function(e){let t=eop(e,"AUTH_MODE")??"password";if("password"!==t&&"oidc"!==t&&"both"!==t)throw Error('AUTH_MODE must be "password", "oidc", or "both".');return t}(e),A=L(e);return{secret:d7(e).authSecret,origins:A,baseURL:A.canonical,trustProxyHeaders:function(e){let t=eop(e,"TRUST_PROXY_HEADERS")?.toLowerCase();if(!t||"false"===t||"0"===t)return!1;if("true"===t||"1"===t)return!0;throw Error("TRUST_PROXY_HEADERS must be true, false, 1, or 0.")}(e),mode:t,provider:function(e,t){if("password"===t)return null;let A=eop(e,"AUTH_OAUTH_DISCOVERY_URL"),r=eop(e,"AUTH_OAUTH_AUTHORIZATION_URL"),i=eop(e,"AUTH_OAUTH_TOKEN_URL"),n=eop(e,"AUTH_OAUTH_USER_INFO_URL"),a=eop(e,"AUTH_OAUTH_ISSUER"),s=!!(r||i||n),o=r&&i&&n;if(A&&s)throw Error("OIDC configuration must use either discovery or explicit endpoints, not both.");if(!A&&!o)throw Error("OIDC authentication requires AUTH_OAUTH_DISCOVERY_URL or all of AUTH_OAUTH_AUTHORIZATION_URL, AUTH_OAUTH_TOKEN_URL, and AUTH_OAUTH_USER_INFO_URL.");if(s&&!o)throw Error("Explicit OAuth configuration must include authorization, token, and user-info URLs.");if(o&&!a)throw Error("AUTH_OAUTH_ISSUER is required with explicit OAuth endpoints.");let l=eog(e,"AUTH_OAUTH_SCOPES").split(",").map(e=>e.trim()).filter(Boolean);if(0===l.length)throw Error("AUTH_OAUTH_SCOPES must contain at least one scope.");return{providerId:eog(e,"AUTH_OAUTH_PROVIDER_ID"),displayName:eog(e,"AUTH_OAUTH_PROVIDER_NAME"),clientId:eog(e,"AUTH_OAUTH_CLIENT_ID"),clientSecret:eog(e,"AUTH_OAUTH_CLIENT_SECRET"),scopes:l,requireIssuerValidation:function(e){let t=eop(e,"AUTH_OAUTH_REQUIRE_ISSUER_VALIDATION")?.toLowerCase();if(!t||"false"===t||"0"===t)return!1;if("true"===t||"1"===t)return!0;throw Error("AUTH_OAUTH_REQUIRE_ISSUER_VALIDATION must be true, false, 1, or 0.")}(e),discoveryUrl:A,issuer:a,authorizationUrl:r,tokenUrl:i,userInfoUrl:n}}(e,t)}}()){var r,i,n;let a,s,o,l,c,u,d=("oidc"===(r=A.mode)||"both"===r)&&A.provider?(e=>{let t=new Set,A=new Set;for(let r of e.config){let e=r.providerId;t.has(e)&&A.add(e),t.add(e)}return A.size>0&&console.warn(`Duplicate provider IDs found: ${Array.from(A).join(", ")}`),{id:"generic-oauth",version:esP.PACKAGE_VERSION,init:t=>({context:{socialProviders:e.config.map(e=>{let A=e.userInfoUrl;return{id:e.providerId,name:e.providerId,async createAuthorizationURL(r){let i=e.authorizationUrl;if(!i&&e.discoveryUrl){let t=await eae(e.discoveryUrl,{method:"GET",headers:e.discoveryHeaders});t.data&&(i=t.data.authorization_endpoint,A=A??t.data.userinfo_endpoint)}if(!i)throw eAO.APIError.from("BAD_REQUEST",eon.INVALID_OAUTH_CONFIGURATION);return enP({id:e.providerId,options:{clientId:e.clientId,clientSecret:e.clientSecret,redirectURI:e.redirectURI},authorizationEndpoint:i,state:r.state,codeVerifier:e.pkce?r.codeVerifier:void 0,scopes:e.scopes||[],redirectURI:`${t.baseURL}/oauth2/callback/${e.providerId}`})},async validateAuthorizationCode(t){if(e.getToken)return enJ(await e.getToken(t),e.accessTokenExpiresIn);let r=e.tokenUrl;if(e.discoveryUrl){let t=await eae(e.discoveryUrl,{method:"GET",headers:e.discoveryHeaders});t.data&&(r=t.data.token_endpoint,A=t.data.userinfo_endpoint)}if(!r)throw eAO.APIError.from("BAD_REQUEST",eon.TOKEN_URL_NOT_FOUND);return enJ(await eam({headers:e.authorizationHeaders,code:t.code,codeVerifier:t.codeVerifier,redirectURI:t.redirectURI,options:{clientId:e.clientId,clientSecret:e.clientSecret,redirectURI:e.redirectURI},tokenEndpoint:r,authentication:e.authentication}),e.accessTokenExpiresIn)},async refreshAccessToken(t){let A=e.tokenUrl;if(e.discoveryUrl){let t=await eae(e.discoveryUrl,{method:"GET",headers:e.discoveryHeaders});t.data&&(A=t.data.token_endpoint)}if(!A)throw eAO.APIError.from("BAD_REQUEST",eon.TOKEN_URL_NOT_FOUND);return enJ(await eai({refreshToken:t,options:{clientId:e.clientId,clientSecret:e.clientSecret},authentication:e.authentication,tokenEndpoint:A}),e.accessTokenExpiresIn)},async getUserInfo(t){let r=e.getUserInfo?await e.getUserInfo(t):await eoc(t,A);if(!r)return null;let i=await e.mapProfileToUser?.(r),n=eou(i?.id)?i.id:eou(r.id)?r.id:eou(r.sub)?r.sub:void 0;return void 0===n?null:{user:{email:r?.email,emailVerified:r?.emailVerified,image:r?.image,name:r?.name,...i,id:String(n)},data:r}},options:{overrideUserInfoOnSignIn:e.overrideUserInfo}}}).concat(t.socialProviders)}}),endpoints:{signInWithOAuth2:(0,eAQ.createAuthEndpoint)("/sign-in/oauth2",{method:"POST",body:eos,metadata:{openapi:{description:"Sign in with OAuth2",responses:{200:{description:"Sign in with OAuth2",content:{"application/json":{schema:{type:"object",properties:{url:{type:"string"},redirect:{type:"boolean"}}}}}}}}}},async t=>{let{providerId:A}=t.body,r=e.config.find(e=>e.providerId===A);if(!r)throw eAO.APIError.fromStatus("BAD_REQUEST",{message:`${eon.PROVIDER_CONFIG_NOT_FOUND} ${A}`});let{discoveryUrl:i,authorizationUrl:n,tokenUrl:a,clientId:s,clientSecret:o,scopes:l,redirectURI:c,responseType:u,pkce:d,prompt:h,accessType:p,authorizationUrlParams:g,responseMode:m}=r,f=n,I=a;if(i){let e=await eae(i,{method:"GET",headers:r.discoveryHeaders,onError(e){t.context.logger.error(e.error.message,e.error,{discoveryUrl:i})}});e.data&&(f=e.data.authorization_endpoint,I=e.data.token_endpoint)}if(!f||!I)throw eAO.APIError.from("BAD_REQUEST",eon.INVALID_OAUTH_CONFIGURATION);if(g){let e=new URL(f);for(let[t,A]of Object.entries(g))e.searchParams.set(t,A);f=e.toString()}let w="function"==typeof g?g(t):g,{state:C,codeVerifier:y}=await enF(t,void 0,t.body.additionalData),E=await enP({id:A,options:{clientId:s,clientSecret:o,redirectURI:c},authorizationEndpoint:f,state:C,codeVerifier:d?y:void 0,scopes:t.body.scopes?[...t.body.scopes,...l||[]]:l||[],redirectURI:`${t.context.baseURL}/oauth2/callback/${A}`,prompt:h,accessType:p,responseType:u,responseMode:m,additionalParams:w});return t.json({url:E.toString(),redirect:!t.body.disableRedirect})}),oAuth2Callback:(0,eAQ.createAuthEndpoint)("/oauth2/callback/:providerId",{method:"GET",query:eoo,metadata:{...eaK,allowedMediaTypes:["application/x-www-form-urlencoded","application/json"],openapi:{description:"OAuth2 callback",responses:{200:{description:"OAuth2 callback",content:{"application/json":{schema:{type:"object",properties:{url:{type:"string"}}}}}}}}}},async t=>{let A,r,i,n=t.context.options.onAPIError?.errorURL||`${t.context.baseURL}/error`;(t.query.error||!t.query.code)&&eiL(t,n,t.query.error||"oAuth_code_missing",t.query.error_description||void 0);let a=t.params?.providerId;if(!a)throw eAO.APIError.from("BAD_REQUEST",eon.PROVIDER_ID_REQUIRED);let s=e.config.find(e=>e.providerId===a);if(!s)throw eAO.APIError.fromStatus("BAD_REQUEST",{message:`${eon.PROVIDER_CONFIG_NOT_FOUND} ${a}`});let{callbackURL:o,codeVerifier:l,errorURL:c,requestSignUp:u,newUserURL:d,link:h}=await enG(t),p=t.query.code,g=c||n,m=s.tokenUrl,f=s.userInfoUrl,I=s.issuer;if(s.discoveryUrl){let e=await eae(s.discoveryUrl,{method:"GET",headers:s.discoveryHeaders});e.data&&(m=e.data.token_endpoint,f=e.data.userinfo_endpoint,!I&&e.data.issuer&&(I=e.data.issuer))}I&&(t.query.iss?t.query.iss!==I&&(t.context.logger.error("OAuth issuer mismatch",{expected:I,received:t.query.iss}),eiL(t,g,"issuer_mismatch")):s.requireIssuerValidation&&(t.context.logger.error("OAuth issuer parameter missing",{expected:I}),eiL(t,g,"issuer_missing")));try{if(s.getToken)i=await s.getToken({code:p,redirectURI:`${t.context.baseURL}/oauth2/callback/${s.providerId}`,codeVerifier:s.pkce?l:void 0});else{if(!m)throw eAO.APIError.from("BAD_REQUEST",eon.INVALID_OAUTH_CONFIG);let e="function"==typeof s.tokenUrlParams?s.tokenUrlParams(t):s.tokenUrlParams;i=await eam({headers:s.authorizationHeaders,code:p,codeVerifier:s.pkce?l:void 0,redirectURI:`${t.context.baseURL}/oauth2/callback/${s.providerId}`,options:{clientId:s.clientId,clientSecret:s.clientSecret,redirectURI:s.redirectURI},tokenEndpoint:m,authentication:s.authentication,additionalParams:e})}i=enJ(i,s.accessTokenExpiresIn)}catch(e){t.context.logger.error(e&&"object"==typeof e&&"name"in e?e.name:"",e),eiL(t,g,"oauth_code_verification_failed")}if(!i)throw eAO.APIError.from("BAD_REQUEST",eon.INVALID_OAUTH_CONFIG);let w=await async function(){let e=s.getUserInfo?await s.getUserInfo(i):await eoc(i,f);e||eiL(t,g,"user_info_is_missing");let A=s.mapProfileToUser?await s.mapProfileToUser(e):e,r=A.email?A.email.toLowerCase():e.email?.toLowerCase();r||(t.context.logger.error(eiH(s.providerId,{source:"generic"}),e),eiL(t,g,"email_is_missing"));let n=eoa(A.id)?A.id:eoa(e.id)?e.id:eoa(e.sub)?e.sub:void 0,a=void 0!==n?String(n):"";a||(t.context.logger.error("Provider did not return an account id (e.g. `sub`). Unable to sign in.",e),eiL(t,g,"id_is_missing"));let o=A.name?A.name:e.name;return o||(t.context.logger.error("Unable to get user info",e),eiL(t,g,"name_is_missing")),{...e,...A,email:r,id:a,name:o}}();if(h){let e;t.context.options.account?.accountLinking?.allowDifferentEmails!==!0&&h.email.toLowerCase()!==w.email.toLowerCase()&&eiL(t,g,"email_doesn't_match");let A=await t.context.internalAdapter.findAccountByProviderId(String(w.id),s.providerId);if(A){A.userId!==h.userId&&eiL(t,g,"account_already_linked_to_different_user");let e=Object.fromEntries(Object.entries({accessToken:await eny(i.accessToken,t.context),idToken:i.idToken,refreshToken:await eny(i.refreshToken,t.context),accessTokenExpiresAt:i.accessTokenExpiresAt,refreshTokenExpiresAt:i.refreshTokenExpiresAt,scope:i.scopes?.join(",")}).filter(([e,t])=>void 0!==t));await t.context.internalAdapter.updateAccount(A.id,e)}else await t.context.internalAdapter.createAccount({userId:h.userId,providerId:s.providerId,accountId:w.id,accessToken:await eny(i.accessToken,t.context),accessTokenExpiresAt:i.accessTokenExpiresAt,refreshTokenExpiresAt:i.refreshTokenExpiresAt,scope:i.scopes?.join(","),refreshToken:await eny(i.refreshToken,t.context),idToken:i.idToken})||eiL(t,g,"unable_to_link_account");await enR(t,h.userId,w);try{e=o.toString()}catch{e=o}throw t.redirect(e)}try{A=await env(t,{userInfo:w,account:{providerId:s.providerId,accountId:w.id,...i,scope:i.scopes?.join(",")},callbackURL:o,disableSignUp:s.disableImplicitSignUp&&!u||s.disableSignUp,overrideUserInfo:s.overrideUserInfo})}catch(e){throw(0,eiI.isAPIError)(e)&&e.body?.code&&eiL(t,g,e.body.code,e.body.message),e}A.error&&eiL(t,g,A.error.split(" ").join("_"));let{session:C,user:y}=A.data;await (0,er$.setSessionCookie)(t,{session:C,user:y});try{r=(A.isRegister&&d||o).toString()}catch{r=A.isRegister&&d||o}throw t.redirect(r)}),oAuth2LinkAccount:(0,eAQ.createAuthEndpoint)("/oauth2/link",{method:"POST",body:eol,use:[eAJ.sessionMiddleware],metadata:{openapi:{description:"Link an OAuth2 account to the current user session",responses:{200:{description:"Authorization URL generated successfully for linking an OAuth2 account",content:{"application/json":{schema:{type:"object",properties:{url:{type:"string",format:"uri",description:"The authorization URL to redirect the user to for linking the OAuth2 account"},redirect:{type:"boolean",description:"Indicates that the client should redirect to the provided URL",enum:[!0]}},required:["url","redirect"]}}}}}}}},async t=>{let A=t.context.session;if(!A)throw eAO.APIError.from("UNAUTHORIZED",eon.SESSION_REQUIRED);let r=e.config.find(e=>e.providerId===t.body.providerId);if(!r)throw eAO.APIError.from("NOT_FOUND",eig.BASE_ERROR_CODES.PROVIDER_NOT_FOUND);let{providerId:i,clientId:n,clientSecret:a,redirectURI:s,authorizationUrl:o,discoveryUrl:l,pkce:c,scopes:u,prompt:d,accessType:h,authorizationUrlParams:p}=r,g=o;if(!g){if(!l)throw eAO.APIError.from("BAD_REQUEST",eon.INVALID_OAUTH_CONFIGURATION);let e=await eae(l,{method:"GET",headers:r.discoveryHeaders,onError(e){t.context.logger.error(e.error.message,e.error,{discoveryUrl:l})}});e.data&&(g=e.data.authorization_endpoint)}if(!g)throw eAO.APIError.from("BAD_REQUEST",eon.INVALID_OAUTH_CONFIGURATION);let m=await enF(t,{userId:A.user.id,email:A.user.email},void 0),f="function"==typeof p?p(t):p,I=await enP({id:i,options:{clientId:n,clientSecret:a,redirectURI:s||`${t.context.baseURL}/oauth2/callback/${i}`},authorizationEndpoint:g,state:m.state,codeVerifier:c?m.codeVerifier:void 0,scopes:t.body.scopes||u||[],redirectURI:s||`${t.context.baseURL}/oauth2/callback/${i}`,prompt:d,accessType:h,additionalParams:f});return t.json({url:I.toString(),redirect:!0})})},options:e,$ERROR_CODES:eon}})({config:[{providerId:A.provider.providerId,clientId:A.provider.clientId,clientSecret:A.provider.clientSecret,scopes:A.provider.scopes,discoveryUrl:A.provider.discoveryUrl,issuer:A.provider.issuer,authorizationUrl:A.provider.authorizationUrl,tokenUrl:A.provider.tokenUrl,userInfoUrl:A.provider.userInfoUrl,pkce:!0,requireIssuerValidation:A.provider.requireIssuerValidation,disableImplicitSignUp:!1}]}):null;return((e,t)=>{let A=t(e),{api:r}=esm(A,e);return{handler:async t=>{let r,i=await A,n=i.options.basePath||"/api/auth";if((0,erV.isDynamicBaseURLConfig)(e.baseURL))r=await eid(i,t,eiu(i.options));else{r=Object.create(Object.getPrototypeOf(i),Object.getOwnPropertyDescriptors(i));let e=i.options;if(!i.options.baseURL){let A=(0,erV.getBaseURL)(void 0,n,t,void 0,i.options.advanced?.trustedProxyHeaders);if(!A)throw new eAO.BetterAuthError("Could not get base URL from request. Please provide a valid base URL.");r.baseURL=A,r.options={...i.options,baseURL:(0,erV.getOrigin)(A)||void 0},e=r.options}r.trustedOrigins=await eic(e,t),r.trustedProviders=await eip(e,t)}let{handler:a}=((e,t)=>{let{api:A,middlewares:r}=esm(e,t),i=new URL(e.baseURL).pathname;return(0,esg.createRouter)(A,{routerContext:e,openapi:{disabled:!0},basePath:i,routerMiddleware:[{path:"/**",middleware:eiQ},...r],allowedMediaTypes:["application/json"],skipTrailingSlashes:t.advanced?.skipTrailingSlashes??!1,async onRequest(t){let A=e.options.disabledPaths||[],r=eiw(t.url,i);if(A.includes(r))return new Response("Not Found",{status:404});let n=t,a=await eiN(n,e);if(a)return a;for(let t of e.options.plugins||[])if(t.onRequest){let A=await (0,er5.withSpan)(`onRequest ${t.id}`,{[er3]:"onRequest",[er6]:`plugin:${t.id}`},()=>t.onRequest(n,e));if(A&&"response"in A)return A.response;A&&"request"in A&&(n=A.request)}return n},async onResponse(t,A){for(let A of e.options.plugins||[])if(A.onResponse){let r=await (0,er5.withSpan)(`onResponse ${A.id}`,{[er3]:"onResponse",[er6]:`plugin:${A.id}`,[er4.ATTR_HTTP_RESPONSE_STATUS_CODE]:t.status},()=>A.onResponse(t,e));if(r)return r.response}return t},onError(A){if((0,eiI.isAPIError)(A)&&"FOUND"===A.status)return;if(t.onAPIError?.throw)throw A;if(t.onAPIError?.onError)return void t.onAPIError.onError(A,e);let r=t.logger?.level,i="error"===r||"warn"===r||"debug"===r?erM.logger:void 0;if(t.logger?.disabled!==!0){if(A&&"object"==typeof A&&"message"in A&&"string"==typeof A.message&&(A.message.includes("no column")||A.message.includes("column")||A.message.includes("relation")||A.message.includes("table")||A.message.includes("does not exist")))return void e.logger?.error(A.message);(0,eiI.isAPIError)(A)?("INTERNAL_SERVER_ERROR"===A.status&&e.logger.error(A.status,A),i?.error(A.message)):e.logger?.error(A&&"object"==typeof A&&"name"in A?A.name:"",A)}}})})(r,e);return(0,er1.runWithAdapter)(r.adapter,()=>a(t))},api:r,options:e,$context:A,$ERROR_CODES:{...e.plugins?.reduce((e,t)=>t.$ERROR_CODES?{...e,...t.$ERROR_CODES}:e,{}),...eig.BASE_ERROR_CODES}}})({appName:"AI Development Environment",baseURL:function(e){if("inferred"!==e.mode)return"single"===e.mode?e.canonical:{allowedHosts:e.patterns.flatMap(e=>e.port?[e.host]:[e.host,`${e.host}:*`]),protocol:e.allHttps?"https":"auto",fallback:e.canonical}}(A.origins),trustedOrigins:e=>{if(!e)return[];let t=function(e,t){let A=t=>{let A=e.headers.get(t)?.split(",")[0]?.trim();return A&&!/[\s/\\@]/.test(A)?A:null},r=t?A("x-forwarded-host"):null,i=t?A("x-forwarded-proto"):null,n=r??A("host");if(n&&H(n)){let t="https"===i||"http"===i?i:new URL(e.url).protocol.replace(":","");return`${t}://${n.toLowerCase()}`}try{return new URL(e.url).origin}catch{return null}}(e,A.trustProxyHeaders);return t&&K(A.origins,t)?[t]:[]},secret:A.secret,advanced:{trustedProxyHeaders:A.trustProxyHeaders},database:(i={provider:"sqlite"},a=null,s=(e,t=!1)=>({getFieldName:A,getModelName:r,getFieldAttributes:n,getDefaultModelName:a,schema:s})=>{let o=(e,t,i)=>{if(!e&&!i)return;let n={};if(e)for(let r of e)n[A({model:t,field:r})]=!0;if(i){if(!e){let e=s[a(t)]?.fields||{};for(let r of(e.id={type:"string"},Object.keys(e)))n[A({model:t,field:r})]=!0}for(let[e,A]of Object.entries(i)){let i=l(t,r(e),s);"one-to-one"===A.relation?n[i]=!0:n[i]={take:A.limit}}}return n},l=(e,t,A)=>{try{let n=a(e),s=a(t),o=r(t).toLowerCase(),l=Object.entries(A[s]?.fields||{}).filter(([e,t])=>t.references&&a(t.references.model)===n);if(l.length>0){let[e,t]=l[0];return t?.unique===!0||!0===i.usePlural?o:`${o}s`}if((l=Object.entries(A[n]?.fields||{}).filter(([e,t])=>t.references&&a(t.references.model)===s)).length>0)return o}catch{}return`${r(t).toLowerCase()}s`};function c(e){switch(e){case"starts_with":return"startsWith";case"ends_with":return"endsWith";case"ne":return"not";case"not_in":return"notIn";default:return e}}let u=({action:e,model:t,where:r})=>{if(!r||!r.length)return{};let a=e=>{let r=A({model:t,field:e.field}),a=(e.mode??"sensitive")==="insensitive"&&("string"==typeof e.value||Array.isArray(e.value)&&e.value.every(e=>"string"==typeof e)),s="postgresql"===i.provider||"mongodb"===i.provider,o=a&&s?"insensitive":void 0,l=o?{mode:o}:{};if("ne"===e.operator&&null===e.value)return n({model:t,field:e.field})?.required!==!0?{[r]:{not:null}}:{};if(("in"===e.operator||"not_in"===e.operator)&&Array.isArray(e.value)){let t=e.value.filter(e=>null!=e);if(0===t.length)if("in"===e.operator)return{AND:[{[r]:{equals:"__never__"}},{[r]:{not:"__never__"}}]};else return{};return{[r]:{[c(e.operator)]:t,...l}}}return"eq"!==e.operator&&e.operator?"ne"===e.operator?{[r]:{not:{equals:e.value},...l}}:{[r]:{[c(e.operator)]:e.value,...l}}:{[r]:{equals:e.value,...l}}};if("update"===e){let e=r.filter(e=>"AND"===e.connector||!e.connector),i=r.filter(e=>"OR"===e.connector),n=e.filter(e=>"eq"===e.operator||!e.operator),s=e.filter(e=>"eq"!==e.operator&&void 0!==e.operator).map(e=>a(e)),o=i.map(e=>a(e)),l={};for(let e of n)l[A({model:t,field:e.field})]=e.value;return s.length>0&&(l.AND=s),o.length>0&&(l.OR=o),l}if("delete"===e){let e=r.find(e=>"id"===e.field);if(e){let i=A({model:t,field:"id"}),n=r.filter(e=>"id"!==e.field);if(0===n.length)return{[i]:e.value};let s=n.filter(e=>"AND"===e.connector||!e.connector),o=n.filter(e=>"OR"===e.connector),l=s.map(e=>a(e)),c=o.map(e=>a(e)),u={[i]:e.value};return l.length>0&&(u.AND=l),c.length>0&&(u.OR=c),u}}if(1===r.length){let e=r[0];if(!e)return;return a(e)}let s=r.filter(e=>"AND"===e.connector||!e.connector),o=r.filter(e=>"OR"===e.connector),l=s.map(e=>a(e)),u=o.map(e=>a(e));return{...l.length?{AND:l}:{},...u.length?{OR:u}:{}}};return{async create({model:t,data:A,select:r}){if(!e[t])throw new eAO.BetterAuthError(`Model ${t} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`);return await e[t].create({data:A,select:o(r,t)})},async findOne({model:t,where:A,select:i,join:n}){let a=u({model:t,where:A,action:"findOne"});if(!e[t])throw new eAO.BetterAuthError(`Model ${t} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`);let c=new Map;for(let e of Object.keys(n??{})){let A=l(t,e,s);c.set(A,r(e))}let d=o(i,t,n),h=await e[t].findFirst({where:a,select:d});if(n&&h)for(let[e,t]of c.entries())e!==t&&e in h&&(h[t]=h[e],delete h[e]);return h},async findMany({model:t,where:i,limit:n,select:a,offset:c,sortBy:d,join:h}){let p=u({model:t,where:i,action:"findMany"});if(!e[t])throw new eAO.BetterAuthError(`Model ${t} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`);let g=new Map;if(h)for(let[e,A]of Object.entries(h)){let A=l(t,e,s);g.set(A,r(e))}let m=o(a,t,h),f=await e[t].findMany({where:p,take:n||100,skip:c||0,...d?.field?{orderBy:{[A({model:t,field:d.field})]:"desc"===d.direction?"desc":"asc"}}:{},select:m});if(h&&Array.isArray(f))for(let e of f)for(let[t,A]of g.entries())t!==A&&t in e&&(e[A]=e[t],delete e[t]);return f},async count({model:t,where:A}){let r=u({model:t,where:A,action:"count"});if(!e[t])throw new eAO.BetterAuthError(`Model ${t} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`);return await e[t].count({where:r})},async update({model:t,where:A,update:r}){if(!e[t])throw new eAO.BetterAuthError(`Model ${t} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`);if(!(A?.length&&A.some(e=>{if("OR"===e.connector||e.operator&&"eq"!==e.operator)return!1;if("insensitive"===e.mode){let t="postgresql"===i.provider||"mongodb"===i.provider,A="string"==typeof e.value||Array.isArray(e.value)&&e.value.every(e=>"string"==typeof e);if(t&&A)return!1}return"id"===e.field||n({model:t,field:e.field})?.unique===!0}))){let i=u({model:t,where:A,action:"updateMany"});return(await e[t].updateMany({where:i,data:r}))?.count?await e[t].findFirst({where:i}):null}let a=u({model:t,where:A,action:"update"});try{return await e[t].update({where:a,data:r})}catch(e){if(erv(e))return null;throw e}},async updateMany({model:t,where:A,update:r}){if(!e[t])throw new eAO.BetterAuthError(`Model ${t} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`);let i=u({model:t,where:A,action:"updateMany"}),n=await e[t].updateMany({where:i,data:r});return n?n.count:0},async delete({model:t,where:A}){if(!e[t])throw new eAO.BetterAuthError(`Model ${t} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`);if(!A?.some(e=>"id"===e.field)){let r=u({model:t,where:A,action:"deleteMany"});await e[t].deleteMany({where:r});return}let r=u({model:t,where:A,action:"delete"});try{await e[t].delete({where:r})}catch(e){if(erv(e))return;throw e}},async deleteMany({model:t,where:A}){let r=u({model:t,where:A,action:"deleteMany"}),i=await e[t].deleteMany({where:r});return i?i.count:0},async consumeOne({model:A,where:r}){if(!e[A])throw new eAO.BetterAuthError(`Model ${A} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`);if(r?.some(e=>"id"===e.field)){let t=u({model:A,where:r,action:"delete"});try{return await e[A].delete({where:t})??null}catch(e){if(erv(e))return null;throw e}}let i=u({model:A,where:r,action:"findOne"}),n=async e=>{let t=await e[A].findFirst({where:i});if(!t)return null;try{return(await e[A].deleteMany({where:u({model:A,where:[...r??[],{field:"id",value:t.id,operator:"eq",connector:"AND",mode:"sensitive"}],action:"deleteMany"})}))?.count>0?t:null}catch(e){if(erv(e))return null;throw e}};return t||"function"!=typeof e.$transaction?n(e):e.$transaction(n)},async incrementOne({model:A,where:r,increment:i,set:n}){if(!e[A])throw new eAO.BetterAuthError(`Model ${A} does not exist in the database. If you haven't generated the Prisma client, you need to run 'npx prisma generate'`);let a={...n??{}};for(let[e,t]of Object.entries(i))a[e]={increment:t};if(r?.some(e=>"id"===e.field)){let t=u({model:A,where:r,action:"update"});try{return await e[A].update({where:t,data:a})??null}catch(e){if(erv(e))return null;throw e}}let s=u({model:A,where:r,action:"findOne"}),o=async e=>{let t=await e[A].findFirst({where:s});if(!t)return null;try{return await e[A].update({where:u({model:A,where:[...r,{field:"id",value:t.id,operator:"eq",connector:"AND",mode:"sensitive"}],action:"update"}),data:a})??null}catch(e){if(erv(e))return null;throw e}};return t||"function"!=typeof e.$transaction?o(e):e.$transaction(o)},options:i}},o=null,o={config:{adapterId:"prisma",adapterName:"Prisma Adapter",usePlural:i.usePlural??!1,debugLogs:i.debugLogs??!1,supportsUUIDs:"postgresql"===i.provider,supportsArrays:"postgresql"===i.provider||"mongodb"===i.provider,transaction:!!i.transaction&&(e=>t.$transaction(t=>e((0,erS.createAdapterFactory)({config:{...o.config,transaction:!1},adapter:s(t,!0)})(a))))},adapter:s(t)},l=(0,erS.createAdapterFactory)(o),e=>(a=e,l(e))),emailAndPassword:{enabled:"password"===(n=A.mode)||"both"===n,requireEmailVerification:!1},account:{accountLinking:{enabled:!0,disableImplicitLinking:!0,allowDifferentEmails:!1}},databaseHooks:eoC,plugins:[function(){let e=(e=>{let t={...e||{},defaultRole:e?.defaultRole??"user",adminRoles:e?.adminRoles??["admin"],bannedUserMessage:e?.bannedUserMessage??"You have been banned from this application. Please contact support if you believe this is an error."};if(e?.adminRoles){let t=(Array.isArray(e.adminRoles)?e.adminRoles:[...e.adminRoles.split(",")]).filter(t=>!Object.keys(e?.roles||esH).map(e=>e.toLowerCase()).includes(t.toLowerCase()));if(t.length>0)throw new eAO.BetterAuthError(`Invalid admin roles: ${t.join(", ")}. Admin roles must be defined in the 'roles' configuration.`)}return{id:"admin",version:esP.PACKAGE_VERSION,init:()=>({options:{databaseHooks:{user:{create:{before:async t=>({data:{role:e?.defaultRole??"user",...t}})}},session:{create:{async before(e,A){if(!A)return;let r=await A.context.internalAdapter.findUserById(e.userId);if(r?.banned){if(r.banExpires&&new Date(r.banExpires).getTime()<Date.now())return void await A.context.internalAdapter.updateUser(e.userId,{banned:!1,banReason:null,banExpires:null});throw eAO.APIError.from("FORBIDDEN",{message:t.bannedUserMessage,code:"BANNED_USER"})}}}}}}}),hooks:{after:[{matcher:e=>"/list-sessions"===e.path,handler:(0,eAQ.createAuthMiddleware)(async e=>{let t=await esq(e);if(!t)return;let A=t.filter(e=>!e.impersonatedBy);return e.json(A)})}]},endpoints:{setRole:(0,eAQ.createAuthEndpoint)("/admin/set-role",{method:"POST",body:esZ,requireHeaders:!0,use:[esW],metadata:{openapi:{operationId:"setUserRole",summary:"Set the role of a user",description:"Set the role of a user",responses:{200:{description:"User role updated",content:{"application/json":{schema:{type:"object",properties:{user:{$ref:"#/components/schemas/User"}}}}}}}},$Infer:{body:{}}}},async e=>{if(!esK({userId:e.context.session.user.id,role:e.context.session.user.role,options:t,permissions:{user:["set-role"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_CHANGE_USERS_ROLE);let A=t.roles;if(A){for(let t of Array.isArray(e.body.role)?e.body.role:[e.body.role])if(!A[t])throw eAO.APIError.from("BAD_REQUEST",esj.YOU_ARE_NOT_ALLOWED_TO_SET_NON_EXISTENT_VALUE)}if(!await e.context.internalAdapter.findUserById(e.body.userId))throw eAO.APIError.from("NOT_FOUND",eig.BASE_ERROR_CODES.USER_NOT_FOUND);let r=await e.context.internalAdapter.updateUser(e.body.userId,{role:es$(e.body.role)});return e.json({user:(0,eAP.parseUserOutput)(e.context.options,r)})}),getUser:(0,eAQ.createAuthEndpoint)("/admin/get-user",{method:"GET",query:esz,use:[esW],metadata:{openapi:{operationId:"getUser",summary:"Get an existing user",description:"Get an existing user",responses:{200:{description:"User",content:{"application/json":{schema:{type:"object",properties:{user:{$ref:"#/components/schemas/User"}}}}}}}}}},async e=>{let{id:A}=e.query;if(!esK({userId:e.context.session.user.id,role:e.context.session.user.role,options:t,permissions:{user:["get"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_GET_USER);let r=await e.context.internalAdapter.findUserById(A);if(!r)throw eAO.APIError.from("NOT_FOUND",eig.BASE_ERROR_CODES.USER_NOT_FOUND);return(0,eAP.parseUserOutput)(e.context.options,r)}),createUser:(0,eAQ.createAuthEndpoint)("/admin/create-user",{method:"POST",body:esX,metadata:{openapi:{operationId:"createUser",summary:"Create a new user",description:"Create a new user",responses:{200:{description:"User created",content:{"application/json":{schema:{type:"object",properties:{user:{$ref:"#/components/schemas/User"}}}}}}}},$Infer:{body:{}}}},async e=>{let A=await (0,eAJ.getAuthoritativeSessionFromCtx)(e);if(!A&&(e.request||e.headers))throw e.error("UNAUTHORIZED");if(A&&!esK({userId:A.user.id,role:A.user.role,options:t,permissions:{user:["create"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_CREATE_USERS);let{role:r,...i}=e.body.data??{},n=e.body.role??r;if(void 0!==n){if(A&&!esK({userId:A.user.id,role:A.user.role,options:t,permissions:{user:["set-role"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_CHANGE_USERS_ROLE);for(let e of Array.isArray(n)?n:[n]){if("string"!=typeof e)throw eAO.APIError.from("BAD_REQUEST",esj.INVALID_ROLE_TYPE);if(t.roles&&!t.roles[e])throw eAO.APIError.from("BAD_REQUEST",esj.YOU_ARE_NOT_ALLOWED_TO_SET_NON_EXISTENT_VALUE)}}if(A&&["banned","banReason","banExpires"].some(e=>Object.prototype.hasOwnProperty.call(i,e))&&!esK({userId:A.user.id,role:A.user.role,options:t,permissions:{user:["ban"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_BAN_USERS);let a=e.body.email.toLowerCase();if(!by.email().safeParse(a).success)throw eAO.APIError.from("BAD_REQUEST",eig.BASE_ERROR_CODES.INVALID_EMAIL);if(await e.context.internalAdapter.findUserByEmail(a))throw eAO.APIError.from("BAD_REQUEST",esj.USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL);let s=await e.context.internalAdapter.createUser({...i,email:a,name:e.body.name,role:void 0!==n?es$(n):t?.defaultRole??"user"});if(!s)throw eAO.APIError.from("INTERNAL_SERVER_ERROR",esj.FAILED_TO_CREATE_USER);if(e.body.password){let t=await e.context.password.hash(e.body.password);await e.context.internalAdapter.linkAccount({accountId:s.id,providerId:"credential",password:t,userId:s.id})}return e.json({user:(0,eAP.parseUserOutput)(e.context.options,s)})}),adminUpdateUser:(0,eAQ.createAuthEndpoint)("/admin/update-user",{method:"POST",body:es0,use:[esW],metadata:{openapi:{operationId:"adminUpdateUser",summary:"Update a user",description:"Update a user's details",responses:{200:{description:"User updated",content:{"application/json":{schema:{type:"object",properties:{user:{$ref:"#/components/schemas/User"}}}}}}}}}},async e=>{if(!esK({userId:e.context.session.user.id,role:e.context.session.user.role,options:t,permissions:{user:["update"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_UPDATE_USERS);if(0===Object.keys(e.body.data).length)throw eAO.APIError.from("BAD_REQUEST",esj.NO_DATA_TO_UPDATE);let A=e.body.data,r=e=>Object.prototype.hasOwnProperty.call(A,e);if(r("password"))throw eAO.APIError.from("BAD_REQUEST",esj.PASSWORD_CANNOT_BE_UPDATED_VIA_UPDATE_USER);if(Object.prototype.hasOwnProperty.call(e.body.data,"role")){if(!esK({userId:e.context.session.user.id,role:e.context.session.user.role,options:t,permissions:{user:["set-role"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_CHANGE_USERS_ROLE);let A=e.body.data.role,r=Array.isArray(A)?A:[A];for(let e of r){if("string"!=typeof e)throw eAO.APIError.from("BAD_REQUEST",esj.INVALID_ROLE_TYPE);if(t.roles&&!t.roles[e])throw eAO.APIError.from("BAD_REQUEST",esj.YOU_ARE_NOT_ALLOWED_TO_SET_NON_EXISTENT_VALUE)}e.body.data.role=es$(r)}if(["banned","banReason","banExpires"].some(r)){if(!esK({userId:e.context.session.user.id,role:e.context.session.user.role,options:t,permissions:{user:["ban"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_BAN_USERS);if(!0===A.banned&&e.body.userId===e.context.session.user.id)throw eAO.APIError.from("BAD_REQUEST",esj.YOU_CANNOT_BAN_YOURSELF)}if(r("email")||r("emailVerified")){if(!esK({userId:e.context.session.user.id,role:e.context.session.user.role,options:t,permissions:{user:["set-email"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_SET_USERS_EMAIL);if(r("email")){let t=String(A.email).toLowerCase();if(!by.email().safeParse(t).success)throw eAO.APIError.from("BAD_REQUEST",eig.BASE_ERROR_CODES.INVALID_EMAIL);let r=await e.context.internalAdapter.findUserByEmail(t);if(r&&r.user.id!==e.body.userId)throw eAO.APIError.from("BAD_REQUEST",esj.USER_ALREADY_EXISTS_USE_ANOTHER_EMAIL);A.email=t}}if(!await e.context.internalAdapter.findUserById(e.body.userId))throw eAO.APIError.from("NOT_FOUND",eig.BASE_ERROR_CODES.USER_NOT_FOUND);let i=await e.context.internalAdapter.updateUser(e.body.userId,e.body.data);return!0===A.banned&&await e.context.internalAdapter.deleteUserSessions(e.body.userId),e.json((0,eAP.parseUserOutput)(e.context.options,i))}),listUsers:(0,eAQ.createAuthEndpoint)("/admin/list-users",{method:"GET",use:[esW],query:es1,metadata:{openapi:{operationId:"listUsers",summary:"List users",description:"List users",responses:{200:{description:"List of users",content:{"application/json":{schema:{type:"object",properties:{users:{type:"array",items:{$ref:"#/components/schemas/User"}},total:{type:"number"},limit:{type:"number"},offset:{type:"number"}},required:["users","total"]}}}}}}}},async e=>{let A=e.context.session;if(!esK({userId:e.context.session.user.id,role:A.user.role,options:t,permissions:{user:["list"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_LIST_USERS);let r=[];e.query?.searchValue&&r.push({field:e.query.searchField||"email",operator:e.query.searchOperator||"contains",value:e.query.searchValue}),e.query?.filterValue!==void 0&&r.push({field:e.query.filterField||"email",operator:e.query.filterOperator||"eq",value:e.query.filterValue});try{let t=await e.context.internalAdapter.listUsers(Number(e.query?.limit)||void 0,Number(e.query?.offset)||void 0,e.query?.sortBy?{field:e.query.sortBy,direction:e.query.sortDirection||"asc"}:void 0,r.length?r:void 0),A=await e.context.internalAdapter.countTotalUsers(r.length?r:void 0);return e.json({users:t.map(t=>(0,eAP.parseUserOutput)(e.context.options,t)),total:A,limit:Number(e.query?.limit)||void 0,offset:Number(e.query?.offset)||void 0})}catch{return e.json({users:[],total:0})}}),listUserSessions:(0,eAQ.createAuthEndpoint)("/admin/list-user-sessions",{method:"POST",use:[esW],body:es8,metadata:{openapi:{operationId:"adminListUserSessions",summary:"List user sessions",description:"List user sessions",responses:{200:{description:"List of user sessions",content:{"application/json":{schema:{type:"object",properties:{sessions:{type:"array",items:{$ref:"#/components/schemas/Session"}}}}}}}}}}},async e=>{let A=e.context.session;if(!esK({userId:e.context.session.user.id,role:A.user.role,options:t,permissions:{session:["list"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_LIST_USERS_SESSIONS);let r=await e.context.internalAdapter.listSessions(e.body.userId);return e.json({sessions:r.map(t=>(0,eAP.parseSessionOutput)(e.context.options,t))})}),unbanUser:(0,eAQ.createAuthEndpoint)("/admin/unban-user",{method:"POST",body:es4,use:[esW],metadata:{openapi:{operationId:"unbanUser",summary:"Unban a user",description:"Unban a user",responses:{200:{description:"User unbanned",content:{"application/json":{schema:{type:"object",properties:{user:{$ref:"#/components/schemas/User"}}}}}}}}}},async e=>{let A=e.context.session;if(!esK({userId:e.context.session.user.id,role:A.user.role,options:t,permissions:{user:["ban"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_BAN_USERS);if(!await e.context.internalAdapter.findUserById(e.body.userId))throw eAO.APIError.from("NOT_FOUND",eig.BASE_ERROR_CODES.USER_NOT_FOUND);let r=await e.context.internalAdapter.updateUser(e.body.userId,{banned:!1,banExpires:null,banReason:null,updatedAt:new Date});return e.json({user:(0,eAP.parseUserOutput)(e.context.options,r)})}),banUser:(0,eAQ.createAuthEndpoint)("/admin/ban-user",{method:"POST",body:es2,use:[esW],metadata:{openapi:{operationId:"banUser",summary:"Ban a user",description:"Ban a user",responses:{200:{description:"User banned",content:{"application/json":{schema:{type:"object",properties:{user:{$ref:"#/components/schemas/User"}}}}}}}}}},async e=>{let A=e.context.session;if(!esK({userId:e.context.session.user.id,role:A.user.role,options:t,permissions:{user:["ban"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_BAN_USERS);if(!await e.context.internalAdapter.findUserById(e.body.userId))throw eAO.APIError.from("NOT_FOUND",eig.BASE_ERROR_CODES.USER_NOT_FOUND);if(e.body.userId===e.context.session.user.id)throw eAO.APIError.from("BAD_REQUEST",esj.YOU_CANNOT_BAN_YOURSELF);let r=await e.context.internalAdapter.updateUser(e.body.userId,{banned:!0,banReason:e.body.banReason||t?.defaultBanReason||"No reason",banExpires:e.body.banExpiresIn?(0,erZ.getDate)(e.body.banExpiresIn,"sec"):t?.defaultBanExpiresIn?(0,erZ.getDate)(t.defaultBanExpiresIn,"sec"):void 0,updatedAt:new Date});return await e.context.internalAdapter.deleteUserSessions(e.body.userId),e.json({user:(0,eAP.parseUserOutput)(e.context.options,r)})}),impersonateUser:(0,eAQ.createAuthEndpoint)("/admin/impersonate-user",{method:"POST",body:es3,use:[esW],metadata:{openapi:{operationId:"impersonateUser",summary:"Impersonate a user",description:"Impersonate a user",responses:{200:{description:"Impersonation session created",content:{"application/json":{schema:{type:"object",properties:{session:{$ref:"#/components/schemas/Session"},user:{$ref:"#/components/schemas/User"}}}}}}}}}},async e=>{if(!esK({userId:e.context.session.user.id,role:e.context.session.user.role,options:t,permissions:{user:["impersonate"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_IMPERSONATE_USERS);let A=await e.context.internalAdapter.findUserById(e.body.userId);if(!A)throw eAO.APIError.from("NOT_FOUND",eig.BASE_ERROR_CODES.USER_NOT_FOUND);let r=(Array.isArray(t.adminRoles)?t.adminRoles:t.adminRoles?.split(",")||[]).map(e=>e.trim());if(((A.role||t.defaultRole||"user").split(",").some(e=>r.includes(e))||t.adminUserIds?.includes(A.id))&&!(!0===t.allowImpersonatingAdmins||esK({userId:e.context.session.user.id,role:e.context.session.user.role,options:t,permissions:{user:["impersonate-admins"]}})))throw eAO.APIError.from("FORBIDDEN",esj.YOU_CANNOT_IMPERSONATE_ADMINS);let i=await e.context.internalAdapter.createSession(A.id,!0,{impersonatedBy:e.context.session.user.id,expiresAt:t?.impersonationSessionDuration?(0,erZ.getDate)(t.impersonationSessionDuration,"sec"):(0,erZ.getDate)(3600,"sec")},!0);if(!i)throw eAO.APIError.from("INTERNAL_SERVER_ERROR",esj.FAILED_TO_CREATE_USER);let n=e.context.authCookies;(0,er$.deleteSessionCookie)(e);let a=await e.getSignedCookie(e.context.authCookies.dontRememberToken.name,e.context.secret),s=e.context.createAuthCookie("admin_session");return await e.setSignedCookie(s.name,`${e.context.session.session.token}:${a||""}`,e.context.secret,n.sessionToken.attributes),await (0,er$.setSessionCookie)(e,{session:i,user:A},!0),e.json({session:i,user:(0,eAP.parseUserOutput)(e.context.options,A)})}),stopImpersonating:(0,eAQ.createAuthEndpoint)("/admin/stop-impersonating",{method:"POST",requireHeaders:!0},async e=>{let t=await (0,eAJ.getSessionFromCtx)(e);if(!t)throw eAO.APIError.fromStatus("UNAUTHORIZED");if(!t.session.impersonatedBy)throw eAO.APIError.fromStatus("BAD_REQUEST",{message:"You are not impersonating anyone"});let A=await e.context.internalAdapter.findUserById(t.session.impersonatedBy);if(!A)throw eAO.APIError.fromStatus("INTERNAL_SERVER_ERROR",{message:"Failed to find user"});let r=e.context.createAuthCookie("admin_session"),i=await e.getSignedCookie(r.name,e.context.secret);if(!i)throw eAO.APIError.fromStatus("INTERNAL_SERVER_ERROR",{message:"Failed to find admin session"});let[n,a]=i?.split(":"),s=await e.context.internalAdapter.findSession(n);if(!s||s.session.userId!==A.id)throw eAO.APIError.fromStatus("INTERNAL_SERVER_ERROR",{message:"Failed to find admin session"});return await e.context.internalAdapter.deleteSession(t.session.token),await (0,er$.setSessionCookie)(e,s,!!a),(0,er$.expireCookie)(e,r),e.json({session:(0,eAP.parseSessionOutput)(e.context.options,s.session),user:(0,eAP.parseUserOutput)(e.context.options,s.user)})}),revokeUserSession:(0,eAQ.createAuthEndpoint)("/admin/revoke-user-session",{method:"POST",body:es6,use:[esW],metadata:{openapi:{operationId:"revokeUserSession",summary:"Revoke a user session",description:"Revoke a user session",responses:{200:{description:"Session revoked",content:{"application/json":{schema:{type:"object",properties:{success:{type:"boolean"}}}}}}}}}},async e=>{let A=e.context.session;if(!esK({userId:e.context.session.user.id,role:A.user.role,options:t,permissions:{session:["revoke"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_REVOKE_USERS_SESSIONS);return await e.context.internalAdapter.deleteSession(e.body.sessionToken),e.json({success:!0})}),revokeUserSessions:(0,eAQ.createAuthEndpoint)("/admin/revoke-user-sessions",{method:"POST",body:es5,use:[esW],metadata:{openapi:{operationId:"revokeUserSessions",summary:"Revoke all user sessions",description:"Revoke all user sessions",responses:{200:{description:"Sessions revoked",content:{"application/json":{schema:{type:"object",properties:{success:{type:"boolean"}}}}}}}}}},async e=>{let A=e.context.session;if(!esK({userId:e.context.session.user.id,role:A.user.role,options:t,permissions:{session:["revoke"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_REVOKE_USERS_SESSIONS);return await e.context.internalAdapter.deleteUserSessions(e.body.userId),e.json({success:!0})}),removeUser:(0,eAQ.createAuthEndpoint)("/admin/remove-user",{method:"POST",body:es9,use:[esW],metadata:{openapi:{operationId:"removeUser",summary:"Remove a user",description:"Delete a user and all their sessions and accounts. Cannot be undone.",responses:{200:{description:"User removed",content:{"application/json":{schema:{type:"object",properties:{success:{type:"boolean"}}}}}}}}}},async e=>{let A=e.context.session;if(!esK({userId:e.context.session.user.id,role:A.user.role,options:t,permissions:{user:["delete"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_DELETE_USERS);if(e.body.userId===e.context.session.user.id)throw eAO.APIError.from("BAD_REQUEST",esj.YOU_CANNOT_REMOVE_YOURSELF);if(!await e.context.internalAdapter.findUserById(e.body.userId))throw eAO.APIError.from("NOT_FOUND",eig.BASE_ERROR_CODES.USER_NOT_FOUND);return await e.context.internalAdapter.deleteUserSessions(e.body.userId),await e.context.internalAdapter.deleteUser(e.body.userId),e.json({success:!0})}),setUserPassword:(0,eAQ.createAuthEndpoint)("/admin/set-user-password",{method:"POST",body:es7,use:[esW],metadata:{openapi:{operationId:"setUserPassword",summary:"Set a user's password",description:"Set a user's password",responses:{200:{description:"Password set",content:{"application/json":{schema:{type:"object",properties:{status:{type:"boolean"}}}}}}}}}},async e=>{if(!esK({userId:e.context.session.user.id,role:e.context.session.user.role,options:t,permissions:{user:["set-password"]}}))throw eAO.APIError.from("FORBIDDEN",esj.YOU_ARE_NOT_ALLOWED_TO_SET_USERS_PASSWORD);let{newPassword:A,userId:r}=e.body,i=e.context.password.config.minPasswordLength;if(A.length<i)throw e.context.logger.warn("Password is too short"),eAO.APIError.from("BAD_REQUEST",eig.BASE_ERROR_CODES.PASSWORD_TOO_SHORT);let n=e.context.password.config.maxPasswordLength;if(A.length>n)throw e.context.logger.warn("Password is too long"),eAO.APIError.from("BAD_REQUEST",eig.BASE_ERROR_CODES.PASSWORD_TOO_LONG);if(!await e.context.internalAdapter.findUserById(r))throw eAO.APIError.from("NOT_FOUND",eig.BASE_ERROR_CODES.USER_NOT_FOUND);let a=await e.context.password.hash(A);return(await e.context.internalAdapter.findAccounts(r)).find(e=>"credential"===e.providerId)?await e.context.internalAdapter.updatePassword(r,a):await e.context.internalAdapter.createAccount({userId:r,providerId:"credential",accountId:r,password:a}),e.json({status:!0})}),userHasPermission:(0,eAQ.createAuthEndpoint)("/admin/has-permission",{method:"POST",body:eoe,metadata:{openapi:{description:"Check if the user has permission",requestBody:{content:{"application/json":{schema:{type:"object",properties:{permissions:{type:"object",description:"The permission to check"}},required:["permissions"]}}}},responses:{200:{description:"Success",content:{"application/json":{schema:{type:"object",properties:{error:{type:"string"},success:{type:"boolean"}},required:["success"]}}}}}},$Infer:{body:{}}}},async e=>{if(!e.body?.permissions)throw new eAO.APIError("BAD_REQUEST",{message:"invalid permission check. no permission(s) were passed."});let A=await (0,eAJ.getAuthoritativeSessionFromCtx)(e);if(!A&&(e.request||e.headers))throw new eAO.APIError("UNAUTHORIZED");if(!A&&!e.body.userId&&!e.body.role)throw new eAO.APIError("BAD_REQUEST",{message:"user id or role is required"});let r=A?.user||(e.body.role?{id:e.body.userId||"",role:e.body.role}:null)||(e.body.userId?await e.context.internalAdapter.findUserById(e.body.userId):null);if(!r)throw new eAO.APIError("BAD_REQUEST",{message:"user not found"});let i=esK({userId:r.id,role:r.role,options:t,permissions:e.body.permissions});return e.json({error:null,success:i})})},$ERROR_CODES:esj,schema:(0,eAP.mergeSchema)(eot,t.schema),options:e}})({ac:eoE,roles:{user:eoQ},defaultRole:"user",adminRoles:["user"]}),{setRole:t,banUser:A,unbanUser:r,impersonateUser:i,stopImpersonating:n,removeUser:a,...s}=e.endpoints;return{...e,endpoints:s}}(),function(e){if(Array.isArray(e)&&e.length>0){if(!e.every(e=>e.configId))throw new eAO.BetterAuthError("configId is required for each API key configuration in the api-key plugin.");let t=e.map(e=>e.configId);if(new Set(t).size!==t.length)throw new eAO.BetterAuthError("configId must be unique for each API key configuration in the api-key plugin.")}let t=(void 0)??{schema:Array.isArray(e)?void 0:e?.schema},A=[...(Array.isArray(e)?e:[e]).map(e=>({...e,apiKeyHeaders:e?.apiKeyHeaders??"x-api-key",defaultKeyLength:e?.defaultKeyLength||64,maximumPrefixLength:e?.maximumPrefixLength??32,minimumPrefixLength:e?.minimumPrefixLength??1,maximumNameLength:e?.maximumNameLength??32,minimumNameLength:e?.minimumNameLength??1,enableMetadata:e?.enableMetadata??!1,disableKeyHashing:e?.disableKeyHashing??!1,requireName:e?.requireName??!1,storage:e?.storage??"database",rateLimit:{enabled:e?.rateLimit?.enabled===void 0||e?.rateLimit?.enabled,timeWindow:e?.rateLimit?.timeWindow??864e5,maxRequests:e?.rateLimit?.maxRequests??10},keyExpiration:{defaultExpiresIn:e?.keyExpiration?.defaultExpiresIn??null,disableCustomExpiresTime:e?.keyExpiration?.disableCustomExpiresTime??!1,maxExpiresIn:e?.keyExpiration?.maxExpiresIn??365,minExpiresIn:e?.keyExpiration?.minExpiresIn??1},startingCharactersConfig:{shouldStore:e?.startingCharactersConfig?.shouldStore??!0,charactersLength:e?.startingCharactersConfig?.charactersLength??6},enableSessionForAPIKeys:e?.enableSessionForAPIKeys??!1,fallbackToDatabase:e?.fallbackToDatabase??!1,customStorage:e?.customStorage,deferUpdates:e?.deferUpdates??!1}))],r=(0,eAP.mergeSchema)((({defaultRateLimitMax:e,defaultTimeWindow:t})=>({apikey:{fields:{configId:{type:"string",required:!0,defaultValue:"default",input:!1,index:!0},name:{type:"string",required:!1,input:!1},start:{type:"string",required:!1,input:!1},referenceId:{type:"string",required:!0,input:!1,index:!0},prefix:{type:"string",required:!1,input:!1},key:{type:"string",required:!0,input:!1,index:!0},refillInterval:{type:"number",required:!1,input:!1},refillAmount:{type:"number",required:!1,input:!1},lastRefillAt:{type:"date",required:!1,input:!1},enabled:{type:"boolean",required:!1,input:!1,defaultValue:!0},rateLimitEnabled:{type:"boolean",required:!1,input:!1,defaultValue:!0},rateLimitTimeWindow:{type:"number",required:!1,input:!1,defaultValue:t},rateLimitMax:{type:"number",required:!1,input:!1,defaultValue:e},requestCount:{type:"number",required:!1,input:!1,defaultValue:0},remaining:{type:"number",required:!1,input:!1},lastRequest:{type:"date",required:!1,input:!1},expiresAt:{type:"date",required:!1,input:!1},createdAt:{type:"date",required:!0,input:!1},updatedAt:{type:"date",required:!0,input:!1},permissions:{type:"string",required:!1,input:!1},metadata:{type:"string",required:!1,input:!0,transform:{input:e=>JSON.stringify(e),output:e=>e?(0,eAK.parseJSON)(e):null}}}}}))({defaultRateLimitMax:(1===A.length?A[0]?.rateLimit.maxRequests:void 0)??10,defaultTimeWindow:(1===A.length?A[0]?.rateLimit.timeWindow:void 0)??864e5}),t.schema);function i(e){for(let t of A){if(!t.enableSessionForAPIKeys)continue;let A=function(e,t){if(t.customAPIKeyGetter)return t.customAPIKeyGetter(e);if(Array.isArray(t.apiKeyHeaders)){for(let A of t.apiKeyHeaders){let t=e.headers?.get(A);if(t)return t}return null}return e.headers?.get(t.apiKeyHeaders)??null}(e,t);if(A)return{key:A,config:t}}return null}let n=function({defaultKeyGenerator:e,configurations:t,schema:A}){return{createApiKey:function({defaultKeyGenerator:e,configurations:t,schema:A,deleteAllExpiredApiKeys:r}){return(0,eAQ.createAuthEndpoint)("/api-key/create",{method:"POST",body:erl,metadata:{openapi:{description:"Create a new API key for a user",responses:{200:{description:"API key created successfully",content:{"application/json":{schema:{type:"object",properties:{id:{type:"string",description:"Unique identifier of the API key"},createdAt:{type:"string",format:"date-time",description:"Creation timestamp"},updatedAt:{type:"string",format:"date-time",description:"Last update timestamp"},name:{type:"string",nullable:!0,description:"Name of the API key"},prefix:{type:"string",nullable:!0,description:"Prefix of the API key"},start:{type:"string",nullable:!0,description:"Starting characters of the key (if configured)"},key:{type:"string",description:"The full API key (only returned on creation)"},enabled:{type:"boolean",description:"Whether the key is enabled"},expiresAt:{type:"string",format:"date-time",nullable:!0,description:"Expiration timestamp"},referenceId:{type:"string",description:"ID of the reference owning the key"},lastRefillAt:{type:"string",format:"date-time",nullable:!0,description:"Last refill timestamp"},lastRequest:{type:"string",format:"date-time",nullable:!0,description:"Last request timestamp"},metadata:{type:"object",nullable:!0,additionalProperties:!0,description:"Metadata associated with the key"},rateLimitMax:{type:"number",nullable:!0,description:"Maximum requests in time window"},rateLimitTimeWindow:{type:"number",nullable:!0,description:"Rate limit time window in milliseconds"},remaining:{type:"number",nullable:!0,description:"Remaining requests"},refillAmount:{type:"number",nullable:!0,description:"Amount to refill"},refillInterval:{type:"number",nullable:!0,description:"Refill interval in milliseconds"},rateLimitEnabled:{type:"boolean",description:"Whether rate limiting is enabled"},requestCount:{type:"number",description:"Current request count in window"},permissions:{type:"object",nullable:!0,additionalProperties:{type:"array",items:{type:"string"}},description:"Permissions associated with the key"}},required:["id","createdAt","updatedAt","key","enabled","referenceId","rateLimitEnabled","requestCount"]}}}}}}}},async A=>{let i,n,{configId:a,name:s,expiresIn:o,prefix:l,remaining:c,metadata:u,refillAmount:d,refillInterval:h,permissions:p,rateLimitMax:g,rateLimitTimeWindow:m,rateLimitEnabled:f}=A.body,I=ery(A.context,t,a),w=I.customKeyGenerator||e,C=await (0,eAJ.getSessionFromCtx)(A,{disableCookieCache:!0}),y=A.request||A.headers;if(y&&(void 0!==d||void 0!==h||void 0!==g||void 0!==m||void 0!==f||void 0!==p||null!==c))throw eAO.APIError.from("BAD_REQUEST",eAE.SERVER_ONLY_PROPERTY);if(A.request&&void 0!==A.body.userId)throw eAO.APIError.from("UNAUTHORIZED",eAE.UNAUTHORIZED_SESSION);if("organization"===(I.references??"user")){let e=A.body.organizationId;if(!e){let e=eAE.ORGANIZATION_ID_REQUIRED;throw eAO.APIError.from("BAD_REQUEST",e)}let t=C?.user.id||A.body.userId;if(!t)throw eAO.APIError.from("UNAUTHORIZED",eAE.UNAUTHORIZED_SESSION);await era(A,t,e,"create"),i=e}else if(y){if(!C?.user.id){let e=eAE.UNAUTHORIZED_SESSION;throw eAO.APIError.from("UNAUTHORIZED",e)}i=C.user.id}else{let e=A.body.userId,t=C?.user.id;if(!t&&!e||C&&e&&t!==e){let e=eAE.UNAUTHORIZED_SESSION;throw eAO.APIError.from("UNAUTHORIZED",e)}i=t||e}if(u){if(!1===I.enableMetadata)throw eAO.APIError.from("BAD_REQUEST",eAE.METADATA_DISABLED);if("object"!=typeof u)throw eAO.APIError.from("BAD_REQUEST",eAE.INVALID_METADATA_TYPE)}if(d&&!h){let e=eAE.REFILL_AMOUNT_AND_INTERVAL_REQUIRED;throw eAO.APIError.from("BAD_REQUEST",e)}if(h&&!d){let e=eAE.REFILL_INTERVAL_AND_AMOUNT_REQUIRED;throw eAO.APIError.from("BAD_REQUEST",e)}if(o){if(!0===I.keyExpiration.disableCustomExpiresTime){let e=eAE.KEY_DISABLED_EXPIRATION;throw eAO.APIError.from("BAD_REQUEST",e)}let e=o/86400;if(I.keyExpiration.minExpiresIn>e){let e=eAE.EXPIRES_IN_IS_TOO_SMALL;throw eAO.APIError.from("BAD_REQUEST",e)}if(I.keyExpiration.maxExpiresIn<e){let e=eAE.EXPIRES_IN_IS_TOO_LARGE;throw eAO.APIError.from("BAD_REQUEST",e)}}if(l&&(l.length<I.minimumPrefixLength||l.length>I.maximumPrefixLength))throw eAO.APIError.from("BAD_REQUEST",eAE.INVALID_PREFIX_LENGTH);if(s){if(s.length<I.minimumNameLength||s.length>I.maximumNameLength)throw eAO.APIError.from("BAD_REQUEST",eAE.INVALID_NAME_LENGTH)}else if(I.requireName)throw eAO.APIError.from("BAD_REQUEST",eAE.NAME_REQUIRED);r(A.context);let E=await w({length:I.defaultKeyLength,prefix:l||I.defaultPrefix}),Q=I.disableKeyHashing?E:await erD(E),B=null;I.startingCharactersConfig.shouldStore&&(B=E.substring(0,I.startingCharactersConfig.charactersLength));let b=I.permissions?.defaultPermissions?"function"==typeof I.permissions.defaultPermissions?await I.permissions.defaultPermissions(i,A):I.permissions.defaultPermissions:void 0,D=p?JSON.stringify(p):b?JSON.stringify(b):void 0,k={configId:I.configId??"default",createdAt:new Date,updatedAt:new Date,name:s??null,prefix:l??I.defaultPrefix??null,start:B,key:Q,enabled:!0,expiresAt:o?ero(o,"sec"):I.keyExpiration.defaultExpiresIn?ero(I.keyExpiration.defaultExpiresIn,"sec"):null,referenceId:i,lastRefillAt:null,lastRequest:null,metadata:null,rateLimitMax:g??I.rateLimit.maxRequests??null,rateLimitTimeWindow:m??I.rateLimit.timeWindow??null,remaining:null===c?c:c??d??null,refillAmount:d??null,refillInterval:h??null,rateLimitEnabled:void 0===f?I.rateLimit.enabled??!0:f,requestCount:0,permissions:D};if(u&&(k.metadata=u),"secondary-storage"===I.storage&&I.fallbackToDatabase)n=await A.context.adapter.create({model:erk,data:k}),await erA(A,n,I);else if("secondary-storage"===I.storage){let e=A.context.generateId({model:"apikey"})||(0,eAL.generateId)();n={...k,id:e},await erA(A,n,I)}else n=await A.context.adapter.create({model:erk,data:k});return A.json({...n,key:E,metadata:u??null,permissions:n.permissions?(0,eAH.safeJSONParse)(n.permissions):null})})}({defaultKeyGenerator:e,configurations:t,schema:A,deleteAllExpiredApiKeys:erb}),verifyApiKey:function({configurations:e,schema:t,deleteAllExpiredApiKeys:A}){return eAQ.createAuthEndpoint.serverOnly({method:"POST",body:erC},async r=>{let i,{configId:n,key:a}=r.body,s=ery(r.context,e,n);if(void 0!==n&&s.customAPIKeyValidator&&!await s.customAPIKeyValidator({ctx:r,key:a}))return r.json({valid:!1,error:{message:eAE.INVALID_API_KEY,code:"KEY_NOT_FOUND"},key:null});let o=null;try{let l=await erg({key:a,permissions:r.body.permissions,ctx:r,lookupOpts:s,configurations:e,schema:t,expectedConfigId:n,runCustomValidator:void 0===n});o=l.apiKey,(i=l.opts).deferUpdates&&r.context.runInBackground(A(r.context).catch(e=>{r.context.logger.error("Failed to delete expired API keys:",e)}))}catch(e){if(r.context.logger.error("Failed to validate API key:",e),e instanceof eAO.APIError||e instanceof eAO.APIError||e?.name==="APIError")return r.json({valid:!1,error:{...e.body,message:e.body?.message,code:e.body?.code},key:null});return r.json({valid:!1,error:{message:eAE.INVALID_API_KEY,code:"INVALID_API_KEY"},key:null})}let{key:l,...c}=o??{key:1,permissions:void 0},u=null;return o&&(u=await eAZ(r,o,i)),c.permissions=c.permissions?(0,eAH.safeJSONParse)(c.permissions):null,r.json({valid:!0,error:null,key:null===o?null:{...c,metadata:u}})})}({configurations:t,schema:A,deleteAllExpiredApiKeys:erb}),getApiKey:function({configurations:e,schema:t,deleteAllExpiredApiKeys:A}){return(0,eAQ.createAuthEndpoint)("/api-key/get",{method:"GET",query:eru,use:[eAJ.sessionMiddleware],metadata:{openapi:{description:"Retrieve an existing API key by ID",responses:{200:{description:"API key retrieved successfully",content:{"application/json":{schema:{type:"object",properties:{id:{type:"string",description:"ID"},name:{type:"string",nullable:!0,description:"The name of the key"},start:{type:"string",nullable:!0,description:"Shows the first few characters of the API key, including the prefix. This allows you to show those few characters in the UI to make it easier for users to identify the API key."},prefix:{type:"string",nullable:!0,description:"The API Key prefix. Stored as plain text."},userId:{type:"string",description:"The owner of the user id"},refillInterval:{type:"number",nullable:!0,description:"The interval in milliseconds between refills of the `remaining` count. Example: 3600000 // refill every hour (3600000ms = 1h)"},refillAmount:{type:"number",nullable:!0,description:"The amount to refill"},lastRefillAt:{type:"string",format:"date-time",nullable:!0,description:"The last refill date"},enabled:{type:"boolean",description:"Sets if key is enabled or disabled",default:!0},rateLimitEnabled:{type:"boolean",description:"Whether the key has rate limiting enabled"},rateLimitTimeWindow:{type:"number",nullable:!0,description:"The duration in milliseconds"},rateLimitMax:{type:"number",nullable:!0,description:"Maximum amount of requests allowed within a window"},requestCount:{type:"number",description:"The number of requests made within the rate limit time window"},remaining:{type:"number",nullable:!0,description:"Remaining requests (every time api key is used this should updated and should be updated on refill as well)"},lastRequest:{type:"string",format:"date-time",nullable:!0,description:"When last request occurred"},expiresAt:{type:"string",format:"date-time",nullable:!0,description:"Expiry date of a key"},createdAt:{type:"string",format:"date-time",description:"created at"},updatedAt:{type:"string",format:"date-time",description:"updated at"},metadata:{type:"object",nullable:!0,additionalProperties:!0,description:"Extra metadata about the apiKey"},permissions:{type:"string",nullable:!0,description:"Permissions for the api key (stored as JSON string)"}},required:["id","userId","enabled","rateLimitEnabled","requestCount","createdAt","updatedAt"]}}}}}}}},async t=>{let{configId:r,id:i}=t.query,n=t.context.session,a=ery(t.context,e,r),s=null;if(!(s=await ert(t,i,a))||!erQ(s.configId,a.configId))throw eAO.APIError.from("NOT_FOUND",eAE.KEY_NOT_FOUND);let o=ery(t.context,e,s.configId);if((o.references??"user")==="organization")await era(t,n.user.id,s.referenceId,"read");else if(s.referenceId!==n.user.id)throw eAO.APIError.from("NOT_FOUND",eAE.KEY_NOT_FOUND);A(t.context);let l=await eAZ(t,s,o),{key:c,...u}=s;return t.json({...u,metadata:l,permissions:u.permissions?(0,eAH.safeJSONParse)(u.permissions):null})})}({configurations:t,schema:A,deleteAllExpiredApiKeys:erb}),updateApiKey:function({configurations:e,schema:t,deleteAllExpiredApiKeys:A}){return(0,eAQ.createAuthEndpoint)("/api-key/update",{method:"POST",body:erh,metadata:{openapi:{description:"Update an existing API key by ID",responses:{200:{description:"API key updated successfully",content:{"application/json":{schema:{type:"object",properties:{id:{type:"string",description:"ID"},name:{type:"string",nullable:!0,description:"The name of the key"},start:{type:"string",nullable:!0,description:"Shows the first few characters of the API key, including the prefix. This allows you to show those few characters in the UI to make it easier for users to identify the API key."},prefix:{type:"string",nullable:!0,description:"The API Key prefix. Stored as plain text."},userId:{type:"string",description:"The owner of the user id"},refillInterval:{type:"number",nullable:!0,description:"The interval in milliseconds between refills of the `remaining` count. Example: 3600000 // refill every hour (3600000ms = 1h)"},refillAmount:{type:"number",nullable:!0,description:"The amount to refill"},lastRefillAt:{type:"string",format:"date-time",nullable:!0,description:"The last refill date"},enabled:{type:"boolean",description:"Sets if key is enabled or disabled",default:!0},rateLimitEnabled:{type:"boolean",description:"Whether the key has rate limiting enabled"},rateLimitTimeWindow:{type:"number",nullable:!0,description:"The duration in milliseconds"},rateLimitMax:{type:"number",nullable:!0,description:"Maximum amount of requests allowed within a window"},requestCount:{type:"number",description:"The number of requests made within the rate limit time window"},remaining:{type:"number",nullable:!0,description:"Remaining requests (every time api key is used this should updated and should be updated on refill as well)"},lastRequest:{type:"string",format:"date-time",nullable:!0,description:"When last request occurred"},expiresAt:{type:"string",format:"date-time",nullable:!0,description:"Expiry date of a key"},createdAt:{type:"string",format:"date-time",description:"created at"},updatedAt:{type:"string",format:"date-time",description:"updated at"},metadata:{type:"object",nullable:!0,additionalProperties:!0,description:"Extra metadata about the apiKey"},permissions:{type:"string",nullable:!0,description:"Permissions for the api key (stored as JSON string)"}},required:["id","userId","enabled","rateLimitEnabled","requestCount","createdAt","updatedAt"]}}}}}}}},async t=>{let{configId:r,keyId:i,expiresIn:n,enabled:a,metadata:s,refillAmount:o,refillInterval:l,remaining:c,name:u,permissions:d,rateLimitEnabled:h,rateLimitTimeWindow:p,rateLimitMax:g}=t.body,m=await (0,eAJ.getSessionFromCtx)(t,{disableCookieCache:!0}),f=t.request||t.headers,I=f&&!m?null:m?.user||{id:t.body.userId};if(!I?.id||m&&t.body.userId&&m?.user.id!==t.body.userId)throw eAO.APIError.from("UNAUTHORIZED",eAE.UNAUTHORIZED_SESSION);if(f&&(void 0!==o||void 0!==l||void 0!==g||void 0!==p||void 0!==h||void 0!==c||void 0!==d))throw eAO.APIError.from("BAD_REQUEST",eAE.SERVER_ONLY_PROPERTY);let w=ery(t.context,e,r),C=null;if(!(C=await ert(t,i,w))||!erQ(C.configId,w.configId))throw eAO.APIError.from("NOT_FOUND",eAE.KEY_NOT_FOUND);let y=ery(t.context,e,C.configId);if((y.references??"user")==="organization")await era(t,I.id,C.referenceId,"update");else if(C.referenceId!==I.id)throw eAO.APIError.from("NOT_FOUND",eAE.KEY_NOT_FOUND);let E={};if(void 0!==u){if(u.length<y.minimumNameLength||u.length>y.maximumNameLength)throw eAO.APIError.from("BAD_REQUEST",eAE.INVALID_NAME_LENGTH);E.name=u}if(void 0!==a&&(E.enabled=a),void 0!==n){if(!0===y.keyExpiration.disableCustomExpiresTime)throw eAO.APIError.from("BAD_REQUEST",eAE.KEY_DISABLED_EXPIRATION);if(null!==n){let e=n/86400;if(e<y.keyExpiration.minExpiresIn)throw eAO.APIError.from("BAD_REQUEST",eAE.EXPIRES_IN_IS_TOO_SMALL);if(e>y.keyExpiration.maxExpiresIn)throw eAO.APIError.from("BAD_REQUEST",eAE.EXPIRES_IN_IS_TOO_LARGE)}E.expiresAt=n?ero(n,"sec"):null}if(void 0!==s&&!0===y.enableMetadata){if("object"!=typeof s)throw eAO.APIError.from("BAD_REQUEST",eAE.INVALID_METADATA_TYPE);E.metadata=s}if(void 0!==c&&(E.remaining=c),void 0!==o||void 0!==l){if(void 0!==o&&void 0===l)throw eAO.APIError.from("BAD_REQUEST",eAE.REFILL_AMOUNT_AND_INTERVAL_REQUIRED);if(void 0!==l&&void 0===o)throw eAO.APIError.from("BAD_REQUEST",eAE.REFILL_INTERVAL_AND_AMOUNT_REQUIRED);E.refillAmount=o,E.refillInterval=l}if(void 0!==h&&(E.rateLimitEnabled=h),void 0!==p&&(E.rateLimitTimeWindow=p),void 0!==g&&(E.rateLimitMax=g),void 0!==d&&(E.permissions=JSON.stringify(d)),0===Object.keys(E).length)throw eAO.APIError.from("BAD_REQUEST",eAE.NO_VALUES_TO_UPDATE);let Q=C;try{if("secondary-storage"===y.storage&&y.fallbackToDatabase){let e=await t.context.adapter.update({model:erk,where:[{field:"id",value:C.id}],update:E});e&&(await erA(t,e,y),Q=e)}else if("database"===y.storage){let e=await t.context.adapter.update({model:erk,where:[{field:"id",value:C.id}],update:E});e&&(Q=e)}else{let e={...C,...E,updatedAt:new Date};await erA(t,e,y),Q=e}}catch(e){throw eAO.APIError.fromStatus("INTERNAL_SERVER_ERROR",{message:e?.message})}A(t.context);let B=await eAZ(t,Q,y),{key:b,...D}=Q;return t.json({...D,metadata:B,permissions:D.permissions?(0,eAH.safeJSONParse)(D.permissions):null})})}({configurations:t,schema:A,deleteAllExpiredApiKeys:erb}),deleteApiKey:function({configurations:e,schema:t,deleteAllExpiredApiKeys:A}){return(0,eAQ.createAuthEndpoint)("/api-key/delete",{method:"POST",body:erc,use:[eAJ.sessionMiddleware],metadata:{openapi:{description:"Delete an existing API key",requestBody:{content:{"application/json":{schema:{type:"object",properties:{keyId:{type:"string",description:"The id of the API key to delete"}},required:["keyId"]}}}},responses:{200:{description:"API key deleted successfully",content:{"application/json":{schema:{type:"object",properties:{success:{type:"boolean",description:"Indicates if the API key was successfully deleted"}},required:["success"]}}}}}}}},async t=>{let{configId:r,keyId:i}=t.body,n=t.context.session;if(!0===n.user.banned)throw eAO.APIError.from("UNAUTHORIZED",eAE.USER_BANNED);let a=ery(t.context,e,r),s=null;if(!(s=await ert(t,i,a))||!erQ(s.configId,a.configId))throw eAO.APIError.from("NOT_FOUND",eAE.KEY_NOT_FOUND);let o=ery(t.context,e,s.configId);if((o.references??"user")==="organization")await era(t,n.user.id,s.referenceId,"delete");else if(s.referenceId!==n.user.id)throw eAO.APIError.from("NOT_FOUND",eAE.KEY_NOT_FOUND);try{"secondary-storage"===o.storage&&o.fallbackToDatabase?(await err(t,s,o),await t.context.adapter.delete({model:erk,where:[{field:"id",value:s.id}]})):"database"===o.storage?await t.context.adapter.delete({model:erk,where:[{field:"id",value:s.id}]}):await err(t,s,o)}catch(e){throw eAO.APIError.fromStatus("INTERNAL_SERVER_ERROR",{message:e?.message})}return A(t.context),t.json({success:!0})})}({configurations:t,schema:A,deleteAllExpiredApiKeys:erb}),listApiKeys:function({configurations:e,schema:t,deleteAllExpiredApiKeys:A}){return(0,eAQ.createAuthEndpoint)("/api-key/list",{method:"GET",use:[eAJ.sessionMiddleware],query:erd,metadata:{openapi:{description:"List all API keys for the authenticated user or for a specific organization",responses:{200:{description:"API keys retrieved successfully",content:{"application/json":{schema:{type:"object",properties:{apiKeys:{type:"array",items:{type:"object",properties:{id:{type:"string",description:"ID"},name:{type:"string",nullable:!0,description:"The name of the key"},start:{type:"string",nullable:!0,description:"Shows the first few characters of the API key, including the prefix. This allows you to show those few characters in the UI to make it easier for users to identify the API key."},prefix:{type:"string",nullable:!0,description:"The API Key prefix. Stored as plain text."},userId:{type:"string",description:"The owner of the user id"},refillInterval:{type:"number",nullable:!0,description:"The interval in milliseconds between refills of the `remaining` count. Example: 3600000 // refill every hour (3600000ms = 1h)"},refillAmount:{type:"number",nullable:!0,description:"The amount to refill"},lastRefillAt:{type:"string",format:"date-time",nullable:!0,description:"The last refill date"},enabled:{type:"boolean",description:"Sets if key is enabled or disabled",default:!0},rateLimitEnabled:{type:"boolean",description:"Whether the key has rate limiting enabled"},rateLimitTimeWindow:{type:"number",nullable:!0,description:"The duration in milliseconds"},rateLimitMax:{type:"number",nullable:!0,description:"Maximum amount of requests allowed within a window"},requestCount:{type:"number",description:"The number of requests made within the rate limit time window"},remaining:{type:"number",nullable:!0,description:"Remaining requests (every time api key is used this should updated and should be updated on refill as well)"},lastRequest:{type:"string",format:"date-time",nullable:!0,description:"When last request occurred"},expiresAt:{type:"string",format:"date-time",nullable:!0,description:"Expiry date of a key"},createdAt:{type:"string",format:"date-time",description:"created at"},updatedAt:{type:"string",format:"date-time",description:"updated at"},metadata:{type:"object",nullable:!0,additionalProperties:!0,description:"Extra metadata about the apiKey"},permissions:{type:"string",nullable:!0,description:"Permissions for the api key (stored as JSON string)"}},required:["id","userId","enabled","rateLimitEnabled","requestCount","createdAt","updatedAt"]}},total:{type:"number",description:"Total number of API keys"},limit:{type:"number",nullable:!0,description:"The limit used for pagination"},offset:{type:"number",nullable:!0,description:"The offset used for pagination"}},required:["apiKeys","total"]}}}}}}}},async t=>{let r=t.context.session,i=t.query?.configId,n=t.query?.organizationId,a=t.query?.limit!=null?Number(t.query.limit):void 0,s=t.query?.offset!=null?Number(t.query.offset):void 0;n&&await era(t,r.user.id,n,"read");let o=n??r.user.id,l=n?"organization":"user",c=[];if(i){let{apiKeys:A}=await ern(t,o,ery(t.context,e,i),{limit:void 0,offset:void 0,sortBy:t.query?.sortBy,sortDirection:t.query?.sortDirection});c=A}else{let A=new Map;for(let t of e){let e="database"===t.storage?"database":t.customStorage?`custom:${t.configId??"default"}`:t.fallbackToDatabase?"secondary-storage-with-fallback":"secondary-storage";A.has(e)||A.set(e,t)}let r=await Promise.all([...A.values()].map(e=>ern(t,o,e,{limit:void 0,offset:void 0,sortBy:t.query?.sortBy,sortDirection:t.query?.sortDirection}))),i=new Set;for(let{apiKeys:e}of r)for(let t of e)i.has(t.id)||(i.add(t.id),c.push(t))}let u=c.filter(t=>(e.find(e=>erE(t.configId)?erE(e.configId):e.configId===t.configId)?.references??"user")===l&&t.referenceId===o);i&&(u=u.filter(e=>erQ(e.configId,i)));let d=u.length,h=u;void 0!==s&&(h=h.slice(s)),void 0!==a&&(h=h.slice(0,a)),A(t.context);let p=h.map(e=>{let{key:t,...A}=e;return{...A,metadata:eAY(e.metadata),permissions:A.permissions?(0,eAH.safeJSONParse)(A.permissions):null}}),g=e.find(e=>"database"===e.storage||e.fallbackToDatabase);return g&&await t.context.runInBackgroundOrAwait(eA$(t,h,g)),t.json({apiKeys:p,total:d,limit:a,offset:s})})}({configurations:t,schema:A,deleteAllExpiredApiKeys:erb}),deleteAllExpiredApiKeys:function({deleteAllExpiredApiKeys:e}){return eAQ.createAuthEndpoint.serverOnly({method:"POST"},async t=>{try{await e(t.context,!0)}catch(e){return t.context.logger.error("[API KEY PLUGIN] Failed to delete expired API keys:",e),t.json({success:!1,error:e})}return t.json({success:!0,error:null})})}({deleteAllExpiredApiKeys:erb})}}({defaultKeyGenerator:async e=>{let t=eAV(e.length,"a-z","A-Z");return`${e.prefix||""}${t}`},configurations:A,schema:r});return{id:"api-key",version:"1.6.25",$ERROR_CODES:eAE,hooks:{before:[{matcher:e=>!!i(e),handler:(0,eAQ.createAuthMiddleware)(async e=>{let{key:t,config:n}=i(e);if("string"!=typeof t)throw eAO.APIError.from("BAD_REQUEST",eAE.INVALID_API_KEY_GETTER_RETURN_TYPE);if(t.length<n.defaultKeyLength||n.customAPIKeyValidator&&!await n.customAPIKeyValidator({ctx:e,key:t}))throw eAO.APIError.from("FORBIDDEN",eAE.INVALID_API_KEY);let{apiKey:a}=await erg({key:t,ctx:e,lookupOpts:n,configurations:A,schema:r,expectedConfigId:n.configId}),s=erb(e.context).catch(t=>{e.context.logger.error("Failed to delete expired API keys:",t)});if(n.deferUpdates&&e.context.runInBackground(s),(n.references??"user")!=="user"){let e=eAE.INVALID_REFERENCE_ID_FROM_API_KEY;throw eAO.APIError.from("UNAUTHORIZED",e)}let o=await e.context.internalAdapter.findUserById(a.referenceId);if(!o){let e=eAE.INVALID_REFERENCE_ID_FROM_API_KEY;throw eAO.APIError.from("UNAUTHORIZED",e)}let l={user:o,session:{id:a.id,token:t,userId:a.referenceId,userAgent:e.request?.headers.get("user-agent")??null,ipAddress:e.request?eAx(e.request,e.context.options):null,createdAt:new Date,updatedAt:new Date,expiresAt:a.expiresAt||ero(e.context.options.session?.expiresIn||604800,"ms")}};return(e.context.session=l,"/get-session"===e.path)?l:{context:e}})}]},endpoints:{createApiKey:n.createApiKey,verifyApiKey:n.verifyApiKey,getApiKey:n.getApiKey,updateApiKey:n.updateApiKey,deleteApiKey:n.deleteApiKey,listApiKeys:n.listApiKeys,deleteAllExpiredApiKeys:n.deleteAllExpiredApiKeys},schema:r}}({schema:{apikey:{modelName:"ApiKey"}},defaultPrefix:"aide_",requireName:!0,startingCharactersConfig:{shouldStore:!0,charactersLength:12},keyExpiration:{defaultExpiresIn:null,disableCustomExpiresTime:!1,minExpiresIn:1,maxExpiresIn:3650},rateLimit:{enabled:!1},enableSessionForAPIKeys:!1}),{id:"bearer",version:esP.PACKAGE_VERSION,hooks:{before:[{matcher:e=>!!(e.request?.headers.get("authorization")||e.headers?.get("authorization")),handler:(0,eAQ.createAuthMiddleware)(async e=>{let t,A=e.request?.headers.get("authorization")||e.headers?.get("Authorization");if(!A||"bearer "!==A.slice(0,7).toLowerCase())return;let r=A.slice(7).trim();if(!r)return;if(r.includes("."))t=r.includes("%")?eoi(r):r;else{if(c?.requireSignature)return;t=eoi((await (0,eoA.serializeSignedCookie)("",r,e.context.secret)).replace("=",""))}try{if(!await (0,eor.createHMAC)("SHA-256","base64urlnopad").verify(e.context.secret,t.split(".")[0],t.split(".")[1]))return}catch{return}let i=e.request?.headers||e.headers,n=new Headers({...Object.fromEntries(i?.entries())});return(0,esV.setRequestCookie)(n,e.context.authCookies.sessionToken.name,t),{context:{headers:n}}})}],after:[{matcher:e=>!0,handler:(0,eAQ.createAuthMiddleware)(async e=>{let t=e.context.responseHeaders?.get("set-cookie");if(!t)return;let A=(0,esV.parseSetCookieHeader)(t),r=e.context.authCookies.sessionToken.name,i=A.get(r);if(!i||!i.value||0===i["max-age"])return;let n=i.value,a=new Set((e.context.responseHeaders?.get("access-control-expose-headers")||"").split(",").map(e=>e.trim()).filter(Boolean));a.add("set-auth-token"),e.setHeader("set-auth-token",n),e.setHeader("Access-Control-Expose-Headers",Array.from(a).join(", "))})}]},options:c},(e=>{let t={storeToken:"plain",...e};async function A(e,A){return"hashed"===t.storeToken?await eod(A):"object"==typeof t.storeToken&&"type"in t.storeToken&&"custom-hasher"===t.storeToken.type?await t.storeToken.hash(A):A}async function r(e,r){let i=t?.generateToken?await t.generateToken(r,e):eAV(32),n=new Date(Date.now()+(t?.expiresIn??3)*6e4),a=await A(e,i);return await e.context.internalAdapter.createVerificationValue({value:r.session.token,identifier:`one-time-token:${a}`,expiresAt:n}),i}return{id:"one-time-token",version:esP.PACKAGE_VERSION,endpoints:{generateOneTimeToken:(0,eAQ.createAuthEndpoint)("/one-time-token/generate",{method:"GET",use:[eAJ.sessionMiddleware]},async e=>{if(t?.disableClientRequest&&e.request)throw e.error("BAD_REQUEST",{message:"Client requests are disabled"});let A=e.context.session,i=await r(e,A);return e.json({token:i})}),verifyOneTimeToken:(0,eAQ.createAuthEndpoint)("/one-time-token/verify",{method:"POST",body:eoh},async e=>{let{token:r}=e.body,i=await A(e,r),n=await e.context.internalAdapter.consumeVerificationValue(`one-time-token:${i}`);if(!n)throw e.error("BAD_REQUEST",{message:"Invalid token"});let a=await e.context.internalAdapter.findSession(n.value);if(!a)throw e.error("BAD_REQUEST",{message:"Session not found"});if(t?.disableSetSessionCookie||await (0,er$.setSessionCookie)(e,a),a.session.expiresAt<new Date)throw e.error("BAD_REQUEST",{message:"Session expired"});return e.json(a)})},hooks:{after:[{matcher:()=>!0,handler:(0,eAQ.createAuthMiddleware)(async e=>{if(e.context.newSession){if(!t?.setOttHeaderOnNewSession)return;let A=new Set((e.context.responseHeaders?.get("access-control-expose-headers")||"").split(",").map(e=>e.trim()).filter(Boolean));A.add("set-ott");let i=await r(e,e.context.newSession);e.setHeader("set-ott",i),e.setHeader("Access-Control-Expose-Headers",Array.from(A).join(", "))}})}]},options:e}})({disableClientRequest:!0,expiresIn:1,storeToken:"hashed"}),...d?[d]:[],(u=!1,{id:"next-cookies",version:esP.PACKAGE_VERSION,hooks:{before:[{matcher:e=>"/get-session"===e.path,handler:(0,eAQ.createAuthMiddleware)(async t=>{let A;if(u||(!function(e,t){let A=e.options.plugins||[];if(0===A.length)return;let r=A.findIndex(e=>e.id===t);-1===r||A.slice(r+1).some(e=>e.hooks&&Array.isArray(e.hooks.after)&&e.hooks.after.length>0)&&e.logger.warn(`[better-auth] Cookie integration plugin "${t}" should be placed last in the plugins array. Plugins with \`hooks.after\` running after it may set cookies that are not forwarded to the framework cookie store. Move your cookie integration plugin to the end of the \`plugins\` array to avoid missing \`Set-Cookie\` headers.`)}(t.context,"next-cookies"),u=!0),"_flag"in t&&"router"===t._flag)return;try{let{headers:t}=await e.A(162916);A=await t()}catch{return}let r="1"===A.get("RSC"),i=!!A.get("next-action");r&&!i&&await (0,eiV.setShouldSkipSessionRefresh)(!0)})}],after:[{matcher:e=>!0,handler:(0,eAQ.createAuthMiddleware)(async t=>{let A=t.context.responseHeaders;if((!("_flag"in t)||"router"!==t._flag)&&A instanceof Headers){let t,r=A?.get("set-cookie");if(!r)return;let i=(0,esV.parseSetCookieHeader)(r);try{let{cookies:A}=await e.A(162916);t=await A()}catch(e){if(e instanceof Error&&(e.message.startsWith("`cookies` was called outside a request scope.")||e.message.includes("Cannot find module")))return;throw e}i.forEach((e,A)=>{if(A)try{t.set(A,e.value,(0,esV.toCookieOptions)(e))}catch{}});return}})}]}})]},es_)})(t))),eoB}class eoD extends Error{status;constructor(e,t=401){super(e),this.status=t,this.name="PrincipalResolutionError"}}async function eok(e,t){let A=e.get("x-api-key")?.trim()||null,r=function(e){let t=e.get("authorization");if(!t)return null;if(!t.startsWith("Bearer "))throw new eoD("Authorization must use the Bearer scheme.");let A=t.slice(7).trim();if(!A)throw new eoD("The bearer credential is empty.");return A}(e),i=/(?:^|;\s*)(?:__Secure-)?better-auth\.session_token=/.test(e.get("cookie")??"");if(Number(!!A)+Number(!!r)+Number(i)>1)throw new eoD("Provide exactly one application credential.",400);if(A){let e=await eob(),t=await e.api.verifyApiKey({body:{key:A}});if(!t.valid||!t.key)throw new eoD("The API key is invalid or inactive.");return{kind:"apiKey",apiKeyId:t.key.id,userId:t.key.referenceId,name:t.key.name??null}}if(r?.startsWith("agent_")){if(!t)throw new eoD("Agent credentials are not accepted by this endpoint.");let e=await t.authenticate(r);if(!e)throw new eoD("The agent credential is invalid.");return{kind:"agent",agentId:e}}if(r||i){let t=await eob(),A=await t.api.getSession({headers:e});if(!A?.session||!A.user)throw new eoD("The session is invalid or expired.");return{kind:"user",userId:A.user.id,email:A.user.email,sessionId:A.session.id}}return{kind:"anonymous"}}Symbol.for("mcp.completable"),(B||(B={})).Completable="McpCompletable";let eoS="server:worktree-automations",eov=new Set(["SUCCEEDED","FAILED","CANCELLED","TIMED_OUT"]),eoR=new Set(["SUCCEEDED","FAILED","CANCELLED"]);function eoM(e){let[t,A,r]=e.split("/");if(!t||!A||r)throw Error("A GitHub repository must be in owner/name format");return{owner:t,name:A}}function eoT(e){return{worktreeId:e.worktreeId,state:e.state,conflictWorkflowId:e.conflictWorkflowId,conflictWorkflowChoice:e.conflictWorkflowChoice,lastError:e.lastError,lastSyncedAt:e.lastSyncedAt?.toISOString()??null,updatedAt:e.updatedAt.toISOString()}}function eoU(e){return{...e,mergeMethod:e.mergeMethod,updatedAt:e.updatedAt.toISOString()}}class eox{worktrees;github;jira;workflows;agentControl;polling;timer;running;rerunRequested;constructor(e,t,A,r,i,n){this.worktrees=e,this.github=t,this.jira=A,this.workflows=r,this.agentControl=i,this.polling=n,this.timer=null,this.running=!1,this.rerunRequested=!1,this.agentControl.registerCompletionObserver(async e=>{e.kind===iu&&this.changed()}),this.polling?.register({id:eoS,kind:"WORKTREE_AUTOMATION",runtime:"SERVER",enabled:!0,cadenceSeconds:60,details:{}})}startRuntime(){queueMicrotask(()=>void this.reconcile())}schedule(){this.timer&&clearTimeout(this.timer),this.timer=setTimeout(()=>void this.reconcile(),6e4),this.timer.unref(),this.polling?.schedule(eoS,new Date(Date.now()+6e4))}changed(){if(this.running){this.rerunRequested=!0;return}this.timer&&clearTimeout(this.timer),this.timer=null,queueMicrotask(()=>void this.reconcile())}async stopAutoSyncWork(e){e?.activeJobId&&await this.agentControl.cancelJob(e.activeJobId).catch(()=>null),e?.workflowRunId&&await this.workflows.lifecycle(e.workflowRunId,"CANCEL").catch(()=>null)}async autoSync(e){let t=await aJ(),A=await t.worktreeAutoSync.findUnique({where:{worktreeId:e}});return A?eoT(A):null}async configureAutoSync(e){let t=await aJ(),A=await t.worktree.findFirst({where:{id:e.worktreeId,missingAt:null},select:{id:!0,branch:!0,codebaseId:!0,codebase:{select:{repositoryId:!0}}}});if(!A?.branch)throw Error("Auto Sync requires a branch");await this.stopAutoSyncWork(await t.worktreeAutoSync.findUnique({where:{worktreeId:A.id},select:{activeJobId:!0,workflowRunId:!0}}));let r=e.conflictWorkflowId?.trim()||null;if(r){let e=await t.workflow.findUnique({where:{id:r},select:{enabled:!0,archivedAt:!0,activeVersionId:!0,quickActionKind:!0,quickActionRepositories:{select:{repositoryId:!0}}}});if(!e?.enabled||e.archivedAt||!e.activeVersionId||"MERGE_CONFLICT"!==e.quickActionKind)throw Error("Select an enabled merge-conflict quick action workflow");if(e.quickActionRepositories.length>0&&!e.quickActionRepositories.some(({repositoryId:e})=>e===A.codebase.repositoryId))throw Error("The merge-conflict workflow is not available for this repository")}let i=await t.worktreeAutoSync.upsert({where:{worktreeId:A.id},create:{worktreeId:A.id,branch:A.branch,conflictWorkflowId:r,conflictWorkflowChoice:e.conflictWorkflowChoice?.trim()||null},update:{state:"ACTIVE",branch:A.branch,conflictWorkflowId:r,conflictWorkflowChoice:e.conflictWorkflowChoice?.trim()||null,activeJobId:null,workflowRunId:null,lastError:null}});return this.worktrees.publishAutomationChange(A.id,A.codebaseId),this.changed(),eoT(i)}async cancelAutoSync(e){let t=await aJ(),A=await t.worktreeAutoSync.findUnique({where:{worktreeId:e},select:{activeJobId:!0,workflowRunId:!0}});await this.stopAutoSyncWork(A);let r=await t.worktreeAutoSync.deleteMany({where:{worktreeId:e}});return this.worktrees.publishAutomationChange(e),r.count>0}async retryAutoSync(e){let t=await aJ(),A=await t.worktreeAutoSync.update({where:{worktreeId:e},data:{state:"ACTIVE",activeJobId:null,workflowRunId:null,lastError:null}});return this.worktrees.publishAutomationChange(e),this.changed(),eoT(A)}async autoMerge(e){let t=await aJ(),A=await t.worktreeAutoMerge.findUnique({where:{worktreeId:e}});return A?eoU(A):null}async configureAutoMerge(e){let t=await aJ(),A=await t.worktree.findFirst({where:{id:e.worktreeId,missingAt:null},select:{id:!0,primary:!0,branch:!0,codebaseId:!0,codebase:{select:{repository:{select:{canonicalOrigin:!0}}}}}});if(!A?.branch)throw Error("Auto Merge requires a branch");if(e.deleteWorktree&&A.primary)throw Error("The primary worktree cannot be deleted after merge");let r=await t.worktreeAutoMerge.findUnique({where:{worktreeId:A.id}}),i=await this.worktrees.ticketKeyForWorktree(A.id);if(e.moveTicketToDone){if(!i)throw Error("This worktree is not linked to a Jira ticket");let e=await t.jiraProject.findUnique({where:{key:i.split("-")[0]??""},select:{doneStatusId:!0}});if(!e?.doneStatusId)throw Error("Configure this Jira project's done status before enabling this option")}let n=eoM(e.repositoryNameWithOwner),a=await this.github.pullRequestAutomationState(n.owner,n.name,e.pullRequestNumber);if(a.headRefName!==A.branch)throw Error("The pull request does not belong to this worktree branch");if(!a.headRepositoryNameWithOwner)throw Error("The pull request head repository is unavailable");if(A.codebase.repository.canonicalOrigin.toLowerCase()!==`github.com/${a.headRepositoryNameWithOwner.toLowerCase()}`)throw Error("The pull request head repository does not match this worktree");let s=!!(r&&(r.repositoryNameWithOwner.toLowerCase()!==e.repositoryNameWithOwner.toLowerCase()||r.pullRequestNumber!==e.pullRequestNumber)),o=!1,l=!1;try{if(r&&s){let e=eoM(r.repositoryNameWithOwner),t=await this.github.pullRequestAutomationState(e.owner,e.name,r.pullRequestNumber);"OPEN"===t.state&&t.autoMergeEnabled&&(await this.github.disablePullRequestAutoMerge({...e,number:r.pullRequestNumber},"WORKTREE_AUTOMATION"),o=!0)}l=!0,await this.github.enablePullRequestAutoMerge({...n,number:e.pullRequestNumber,method:e.method,commitHeadline:e.commitHeadline,commitBody:e.commitBody,authorEmail:e.authorEmail},"WORKTREE_AUTOMATION");let a=await t.worktreeAutoMerge.upsert({where:{worktreeId:A.id},create:{worktreeId:A.id,repositoryNameWithOwner:e.repositoryNameWithOwner,pullRequestNumber:e.pullRequestNumber,branch:A.branch,mergeMethod:e.method,commitHeadline:e.commitHeadline.trim(),commitBody:e.commitBody,authorEmail:e.authorEmail?.trim()||null,deleteWorktree:e.deleteWorktree,moveTicketToDone:e.moveTicketToDone,ticketKey:i},update:{state:"ACTIVE",repositoryNameWithOwner:e.repositoryNameWithOwner,pullRequestNumber:e.pullRequestNumber,branch:A.branch,mergeMethod:e.method,commitHeadline:e.commitHeadline.trim(),commitBody:e.commitBody,authorEmail:e.authorEmail?.trim()||null,deleteWorktree:e.deleteWorktree,moveTicketToDone:e.moveTicketToDone,ticketKey:i,ticketMovedAt:null,deleteJobId:null,lastError:null}});return this.worktrees.publishAutomationChange(A.id,A.codebaseId),this.changed(),eoU(a)}catch(t){if(l&&await this.github.disablePullRequestAutoMerge({...n,number:e.pullRequestNumber},"WORKTREE_AUTOMATION").catch(()=>null),r&&(o||!s)){let e=eoM(r.repositoryNameWithOwner);await this.github.enablePullRequestAutoMerge({...e,number:r.pullRequestNumber,method:r.mergeMethod,commitHeadline:r.commitHeadline,commitBody:r.commitBody,authorEmail:r.authorEmail},"WORKTREE_AUTOMATION").catch(()=>null)}throw t}}async cancelAutoMerge(e){let t=await aJ(),A=await t.worktreeAutoMerge.findUnique({where:{worktreeId:e}});if(!A)return!1;let r=eoM(A.repositoryNameWithOwner),i=await this.github.pullRequestAutomationState(r.owner,r.name,A.pullRequestNumber);return"OPEN"===i.state&&i.autoMergeEnabled&&await this.github.disablePullRequestAutoMerge({...r,number:A.pullRequestNumber},"WORKTREE_AUTOMATION"),await t.worktreeAutoMerge.delete({where:{worktreeId:e}}),this.worktrees.publishAutomationChange(e),!0}async retryAutoMerge(e){let t=await aJ(),A=await t.worktreeAutoMerge.findUniqueOrThrow({where:{worktreeId:e}}),r=eoM(A.repositoryNameWithOwner),i="MERGED"===(await this.github.pullRequestAutomationState(r.owner,r.name,A.pullRequestNumber)).state?"POST_MERGE":"ACTIVE",n=await t.worktreeAutoMerge.update({where:{worktreeId:e},data:{state:i,lastError:null,deleteJobId:null}});return this.worktrees.publishAutomationChange(e),this.changed(),eoU(n)}async reconcile(){if(this.running){this.rerunRequested=!0;return}this.running=!0;try{let e=async()=>{do this.rerunRequested=!1,await this.reconcileAutoSync(),await this.reconcileAutoMerge();while(this.rerunRequested)};this.polling?await this.polling.run(eoS,e):await e()}catch{}finally{this.running=!1,this.schedule()}}async reconcileAutoSync(){let e=await aJ();for(let t of(await e.worktreeAutoSync.findMany({where:{state:{in:["ACTIVE","SYNCING","RESOLVING"]}},include:{worktree:{select:{codebaseId:!0}}}})))try{let A=await e.worktree.findUnique({where:{id:t.worktreeId},select:{branch:!0}});if(A?.branch!==t.branch)throw Error("Auto Sync paused because the worktree branch changed");if("ACTIVE"===t.state){let A=await this.worktrees.createAutoSyncJob(t.worktreeId,"SYNC",t.branch,(0,AP.randomUUID)());await e.worktreeAutoSync.update({where:{worktreeId:t.worktreeId},data:{state:"SYNCING",activeJobId:A.id,lastError:null}});continue}if("RESOLVING"===t.state){if(!t.workflowRunId)throw Error("The conflict workflow run is missing");let A=await this.workflows.run(t.workflowRunId);if(!A||!eoR.has(A.status))continue;if("SUCCEEDED"!==A.status)throw Error(`The conflict workflow ${A.status.toLowerCase()}`);let r=await this.worktrees.createAutoSyncJob(t.worktreeId,"FINALIZE",t.branch,(0,AP.randomUUID)());await e.worktreeAutoSync.update({where:{worktreeId:t.worktreeId},data:{state:"SYNCING",activeJobId:r.id,workflowRunId:null}});continue}if(!t.activeJobId)throw Error("The Auto Sync job is missing");let r=await this.agentControl.getJob(t.activeJobId);if(!r||!eov.has(r.status))continue;if("SUCCEEDED"!==r.status)throw Error(r.error||`Auto Sync ${r.status.toLowerCase()}`);let i=function(e){if(!e)return null;try{let t=JSON.parse(e);if(!t||"object"!=typeof t||Array.isArray(t))return null;return"string"==typeof t.outcome?String(t.outcome):null}catch{return null}}(r.resultJson);if("CONFLICT"===i){if(!t.conflictWorkflowId)throw Error("Auto Sync paused because the rebase has merge conflicts");let A=await this.workflows.trigger({workflowId:t.conflictWorkflowId,resourceKind:"WORKTREE",resourceId:t.worktreeId,subjectKey:`auto-sync:${t.worktreeId}:${r.id}`,choice:t.conflictWorkflowChoice});if(!A)throw Error("The conflict workflow did not start");await e.worktreeAutoSync.update({where:{worktreeId:t.worktreeId},data:{state:"RESOLVING",activeJobId:null,workflowRunId:A.id,lastError:null}});continue}if("UNRESOLVED"===i)throw Error("The conflict workflow did not fully resolve the rebase");if("SYNCED"!==i&&"NO_CHANGE"!==i)throw Error("The Auto Sync job returned an unknown result");await e.worktreeAutoSync.update({where:{worktreeId:t.worktreeId},data:{state:"ACTIVE",activeJobId:null,workflowRunId:null,lastError:null,..."SYNCED"===i?{lastSyncedAt:new Date}:{}}})}catch(i){let A=i instanceof Error?i.message:String(i),r=/offline|busy|already has an active job|temporarily/i.test(A);await e.worktreeAutoSync.updateMany({where:{worktreeId:t.worktreeId},data:{state:r?"ACTIVE":"PAUSED",activeJobId:null,workflowRunId:null,lastError:A}})}finally{this.worktrees.publishAutomationChange(t.worktreeId,t.worktree.codebaseId)}}async reconcileAutoMerge(){let e=await aJ();for(let t of(await e.worktreeAutoMerge.findMany({where:{state:{in:["ACTIVE","POST_MERGE"]}},include:{worktree:{select:{codebaseId:!0,branch:!0,headSha:!0,primary:!0}}}})))try{let A=eoM(t.repositoryNameWithOwner);if("ACTIVE"===t.state){let r=await this.github.pullRequestAutomationState(A.owner,A.name,t.pullRequestNumber);if("MERGED"===r.state)await e.worktreeAutoMerge.update({where:{worktreeId:t.worktreeId},data:{state:"POST_MERGE",lastError:null}}),this.rerunRequested=!0;else if("OPEN"!==r.state)throw Error("The pull request closed without merging");else if(!r.autoMergeEnabled)throw Error("GitHub Auto Merge is no longer enabled");continue}if(t.moveTicketToDone&&t.ticketKey&&!t.ticketMovedAt&&(await this.jira.transitionTicketToConfiguredDone(t.ticketKey),await e.worktreeAutoMerge.update({where:{worktreeId:t.worktreeId},data:{ticketMovedAt:new Date,lastError:null}})),!t.deleteWorktree){await e.worktreeAutoMerge.update({where:{worktreeId:t.worktreeId},data:{state:"COMPLETED",lastError:null}});continue}if(t.worktree.primary)throw Error("The primary worktree cannot be deleted");if(!t.deleteJobId){let r=await this.github.pullRequestAutomationState(A.owner,A.name,t.pullRequestNumber);if("MERGED"!==r.state)throw Error("The pull request is no longer merged");if(r.headRefName!==t.branch)throw Error("The merged pull request branch does not match the Auto Merge rule");if(t.worktree.branch!==t.branch)throw Error("The worktree branch changed after Auto Merge completed");if(!t.worktree.headSha||t.worktree.headSha!==r.headRefOid)throw Error("The worktree HEAD does not match the merged pull request");let i=await this.worktrees.deleteWorktree({worktreeId:t.worktreeId,deleteRemoteBranch:!1,requireClean:!0,expectedBranch:t.branch,expectedHeadSha:r.headRefOid,requestId:`auto-merge-${(0,AP.randomUUID)()}`});await e.worktreeAutoMerge.update({where:{worktreeId:t.worktreeId},data:{deleteJobId:i.id,lastError:null}});continue}let r=await this.agentControl.getJob(t.deleteJobId);if(!r||!eov.has(r.status))continue;if("SUCCEEDED"!==r.status)throw Error(r.error||`Worktree deletion ${r.status.toLowerCase()}`);await e.worktreeAutoMerge.updateMany({where:{worktreeId:t.worktreeId},data:{state:"COMPLETED",lastError:null}})}catch(A){await e.worktreeAutoMerge.updateMany({where:{worktreeId:t.worktreeId},data:{state:"ACTION_REQUIRED",lastError:A instanceof Error?A.message:String(A)}})}finally{this.worktrees.publishAutomationChange(t.worktreeId,t.worktree.codebaseId)}}}function eoN(e,t){let A=[],r=e.includes("CLAUDE");return r&&A.push("CLAUDE"),(e.includes("CODEX")||!r&&e.length>0||"GLOBAL"===t&&e.includes("GITHUB_COPILOT"))&&A.push("AGENTS"),A}let eoF="default",eoG=["PREPARING","READY","APPLYING","NEEDS_RESOLUTION"],eoO=["SCAN","READ"],eoJ=[...eoO,"APPLY"],eo_={files:{orderBy:{path:"asc"}},groups:{include:{group:!0}}},eoV={skills:{include:{skill:{include:{files:!0}}}},repositories:{include:{repository:!0}}};function eoP(e,t){if(!e)return t;try{return JSON.parse(e)}catch{return t}}function eoL(e){return[...e.cursorEnabled?["CURSOR"]:[],...e.githubCopilotEnabled?["GITHUB_COPILOT"]:[],...e.codexEnabled?["CODEX"]:[],...e.claudeEnabled?["CLAUDE"]:[],...e.openCodeEnabled?["OPENCODE"]:[]]}function eoH(e,t){return"AGENTS"===t?[".agents","skills"]:"CLAUDE"===t?[".claude","skills"]:"GLOBAL"===e?"CURSOR"===t?[".cursor","skills"]:"GITHUB_COPILOT"===t?[".copilot","skills"]:"CODEX_LEGACY"===t?[".codex","skills"]:[".config","opencode","skills"]:"CURSOR"===t?[".cursor","skills"]:"GITHUB_COPILOT"===t?[".github","skills"]:"CODEX_LEGACY"===t?[".codex","skills"]:[".opencode","skills"]}function eoj(e){return/^[A-Za-z]:[\\/]/.test(e)||e.startsWith("\\\\")?A_.win32:A_.posix}function eoq(e,...t){return eoj(e).join(e,...t)}function eoK(e){return eoj(e).dirname(e)}class eoY{agentControl;constructor(e){this.agentControl=e,this.agentControl.registerCompletionHandler(iL,e=>this.completeScan(e)),this.agentControl.registerCompletionHandler(iH,e=>this.completeRead(e)),this.agentControl.registerCompletionHandler(ij,e=>this.completeApply(e)),this.agentControl.registerConnectionHandler(async()=>{await this.requestAutoReconcile()})}publish(e){aq.publish(a2,{id:e??null}),e&&aq.publish(sw(e),{id:e})}subscribe(){return aq.iterate(a2)}subscribeRun(e){return aq.iterate(sw(e))}async settings(){return(await aJ()).skillSettings.upsert({where:{id:eoF},create:{id:eoF},update:{}})}async overview(e=""){let t=await aJ(),A=e.trim().toLocaleLowerCase(),[r,i,n,a,s,o]=await Promise.all([t.skill.findMany({where:{deletedAt:null},include:eo_,orderBy:{name:"asc"}}),t.skillGroup.findMany({include:eoV,orderBy:{name:"asc"}}),t.skillToolObservation.findMany({include:{agent:!0},orderBy:[{tool:"asc"},{agent:{name:"asc"}}]}),t.skillInstallation.findMany({where:{present:!0},include:{agent:!0,codebase:{include:{repository:!0}},worktree:!0,baseline:!0,skill:!0},orderBy:[{skillName:"asc"},{rootPath:"asc"}]}),this.settings(),t.codebaseRepository.findMany({orderBy:{name:"asc"}})]);return{skills:A?r.filter(e=>[e.name,e.description,...e.groups.map(({group:e})=>e.name)].some(e=>e.toLocaleLowerCase().includes(A))):r,groups:i,observations:n,installations:A?a.filter(e=>[e.skillName,e.description,e.agent.name,e.rootPath,e.codebase?.repository.name??""].some(e=>e.toLocaleLowerCase().includes(A))):a,settings:s,repositories:o}}async getSkill(e){return(await aJ()).skill.findFirst({where:{id:e,deletedAt:null},include:eo_})}async saveSkill(e){let t,A=(t=e.files.map(e=>({path:e.path,contentsBase64:e.contentsBase64,executable:e.executable})),i4({name:e.name,description:e.description,packageHash:i$(t),files:t})),r=[...new Set(e.groupIds)].slice(0,100),i=await aJ();if(await i.skillGroup.count({where:{id:{in:r}}})!==r.length)throw Error("One or more skill groups were not found");let n=await i.skill.findUnique({where:{name:A.name}});if(n&&n.id!==e.id)throw Error("Skill names must be unique");let a=e.id??(0,AP.randomUUID)(),s=e.id?await i.skillGroupSkill.findMany({where:{skillId:a},select:{groupId:!0}}):[];return await i.$transaction(async t=>{await t.skill.upsert({where:{id:a},create:{id:a,name:A.name,description:A.description,syncGlobally:e.syncGlobally,packageHash:A.packageHash},update:{name:A.name,description:A.description,syncGlobally:e.syncGlobally,packageHash:A.packageHash,deletedAt:null}}),await t.skillFile.deleteMany({where:{skillId:a}}),await t.skillFile.createMany({data:A.files.map(e=>{let t=Buffer.from(e.contentsBase64,"base64");return{id:(0,AP.randomUUID)(),skillId:a,path:e.path,contents:t,executable:e.executable,contentHash:(0,AP.createHash)("sha256").update(t).digest("hex")}})}),await t.skillGroupSkill.deleteMany({where:{skillId:a}}),r.length&&await t.skillGroupSkill.createMany({data:r.map(e=>({groupId:e,skillId:a}))})}),this.publish(),await this.scheduleAutoSync([...r,...s.map(e=>e.groupId)]),await this.getSkill(a)}async deleteSkill(e){let t=await aJ(),A=await t.skill.findUnique({where:{id:e},include:{groups:!0}});return!!A&&(await t.skill.update({where:{id:e},data:{deletedAt:new Date}}),this.publish(),await this.scheduleAutoSync(A.groups.map(e=>e.groupId)),!0)}async saveGroup(e){let t=e.name.trim();if(!t||t.length>80)throw Error("Group names must contain 1-80 characters");let A=[...new Set(e.skillIds)].slice(0,500),r=[...new Set(e.repositoryIds)].slice(0,500),i=await aJ(),[n,a,s]=await Promise.all([i.skill.count({where:{id:{in:A},deletedAt:null}}),i.codebaseRepository.count({where:{id:{in:r}}}),i.skillGroup.findUnique({where:{name:t}})]);if(n!==A.length)throw Error("One or more skills were not found");if(a!==r.length)throw Error("One or more repositories were not found");if(s&&s.id!==e.id)throw Error("Group names must be unique");let o=e.id??(0,AP.randomUUID)();return await i.$transaction(async e=>{await e.skillGroup.upsert({where:{id:o},create:{id:o,name:t},update:{name:t}}),await e.skillGroupSkill.deleteMany({where:{groupId:o}}),await e.codebaseRepositorySkillGroup.deleteMany({where:{groupId:o}}),A.length&&await e.skillGroupSkill.createMany({data:A.map(e=>({groupId:o,skillId:e}))}),r.length&&await e.codebaseRepositorySkillGroup.createMany({data:r.map(e=>({groupId:o,repositoryId:e}))})}),this.publish(),await this.scheduleAutoSync([o]),i.skillGroup.findUniqueOrThrow({where:{id:o},include:eoV})}async validateGroupIds(e){let t=[...new Set(e)].slice(0,100),A=await aJ();if(await A.skillGroup.count({where:{id:{in:t}}})!==t.length)throw Error("One or more skill groups were not found");return t}async groupsForRepository(e){let t=await aJ();return(await t.codebaseRepositorySkillGroup.findMany({where:{repositoryId:e},include:{group:!0},orderBy:{group:{name:"asc"}}})).map(e=>e.group)}async deleteGroup(e){let t=await aJ(),A=await t.skillGroup.deleteMany({where:{id:e}});return A.count&&this.publish(),A.count&&(await this.settings()).autoSyncProjectGroups&&await this.prepareSync("GROUP",null,!0),A.count>0}async saveSettings(e){let t=await aJ(),A=await t.skillSettings.upsert({where:{id:eoF},create:{id:eoF,...e},update:e});return this.publish(),A.autoSyncProjectGroups&&await this.prepareSync("GROUP",null,!0),A}async setRepositoryGroups(e,t){let A=await this.validateGroupIds(t),r=await aJ();await r.$transaction(async t=>{await t.codebaseRepositorySkillGroup.deleteMany({where:{repositoryId:e}}),A.length&&await t.codebaseRepositorySkillGroup.createMany({data:A.map(t=>({repositoryId:e,groupId:t}))})}),this.publish(),(await this.settings()).autoSyncProjectGroups&&await this.prepareSync("GROUP",null,!0)}async scheduleAutoSync(e){if((await this.settings()).autoSyncProjectGroups&&e.length)for(let t of[...new Set(e)])await this.prepareSync("GROUP",t,!0)}async requestAutoReconcile(){return(await this.settings()).autoSyncProjectGroups?this.prepareSync("GROUP",null,!0):null}async targets(e){let t=await aJ(),A=await t.codebase.findMany({where:{agentId:e,availability:"AVAILABLE"},include:{worktrees:{where:{missingAt:null}}}}),r=new Map;for(let e of A)for(let t of(r.set(e.folder,{codebaseId:e.id,worktreeId:null,folder:e.folder}),e.worktrees))r.set(t.folder,{codebaseId:e.id,worktreeId:t.id,folder:t.folder});return[...r.values()]}async prepareSync(e,t,A=!1){let r=await aJ();if(t&&!await r.skillGroup.findUnique({where:{id:t}}))throw Error("Skill group not found");if(A){let A=await r.skillSyncRun.findFirst({where:{kind:e,groupId:t??null,status:{in:eoG}},orderBy:{createdAt:"desc"}});if(A)return A}let i=await r.skillSyncRun.create({data:{id:(0,AP.randomUUID)(),kind:e,groupId:t??null,automatic:A,status:"PREPARING"}}),n=eoL(await this.settings()),a=await r.agent.findMany({orderBy:{name:"asc"}});for(let e of a){let t=await r.skillSyncItem.create({data:{id:(0,AP.randomUUID)(),runId:i.id,agentId:e.id,direction:"SCAN",status:"PENDING"}});await this.agentControl.createJob({agentId:e.id,kind:iL,payload:{tools:n,targets:await this.targets(e.id),syncRunId:i.id,syncItemId:t.id},idempotencyKey:`skills:scan:${i.id}:${e.id}`,timeoutSeconds:300,visibility:A?"SYSTEM":"USER"})}return!a.length&&(await r.skillSyncRun.update({where:{id:i.id},data:{status:"READY"}}),A)?this.applyRun(i.id):(this.publish(i.id),this.getRun(i.id))}async getRun(e){return(await aJ()).skillSyncRun.findUnique({where:{id:e},include:{group:!0,items:{include:{skill:!0,installation:{include:{agent:!0}},agent:!0},orderBy:{createdAt:"asc"}}}})}completionIds(e){return eoP(e.payloadJson,{})}async completeScan(e){let{syncRunId:t,syncItemId:A}=this.completionIds(e);if(!t||!A)return;let r=await aJ();if(await r.skillSyncItem.findFirst({where:{id:A,runId:t,direction:"SCAN",status:"PENDING"}})){if("SUCCEEDED"===e.status&&e.resultJson){let t=eoP(e.resultJson,{configuredTools:[],installations:[],warnings:[]}),i=new Date;await r.$transaction(async r=>{for(let A of(await r.skillInstallation.updateMany({where:{agentId:e.agentId},data:{present:!1}}),t.configuredTools))iK.includes(A.tool)&&await r.skillToolObservation.upsert({where:{agentId_tool:{agentId:e.agentId,tool:A.tool}},create:{agentId:e.agentId,tool:A.tool,configured:A.configured,homePath:A.homePath,checkedAt:i},update:{configured:A.configured,homePath:A.homePath,checkedAt:i}});for(let A of t.installations){let t=await r.skill.findUnique({where:{name:A.skillName},select:{id:!0,deletedAt:!0}});await r.skillInstallation.upsert({where:{agentId_rootPath_skillName:{agentId:e.agentId,rootPath:A.rootPath,skillName:A.skillName}},create:{id:(0,AP.randomUUID)(),agentId:e.agentId,skillId:t&&!t.deletedAt?t.id:null,codebaseId:A.codebaseId,worktreeId:A.worktreeId,scope:A.scope,rootKind:A.rootKind,rootPath:A.rootPath,skillName:A.skillName,description:A.description,packageHash:A.packageHash,present:!0,fileCount:A.fileCount,totalBytes:A.totalBytes,tracked:A.tracked,consumersJson:JSON.stringify(A.consumers),lastSeenAt:i},update:{skillId:t&&!t.deletedAt?t.id:void 0,codebaseId:A.codebaseId,worktreeId:A.worktreeId,scope:A.scope,rootKind:A.rootKind,description:A.description,packageHash:A.packageHash,present:!0,fileCount:A.fileCount,totalBytes:A.totalBytes,tracked:A.tracked,consumersJson:JSON.stringify(A.consumers),lastSeenAt:i}})}await r.skillSyncItem.updateMany({where:{id:A,status:"PENDING"},data:{status:"COMPLETE",error:t.warnings?.length?t.warnings.join("\n").slice(0,64e3):null}})})}else await r.skillSyncItem.updateMany({where:{id:A,status:"PENDING"},data:{status:"FAILED",error:e.error??"Skill scan failed"}});await r.skillSyncItem.count({where:{runId:t,direction:"SCAN",status:"PENDING"}})||await this.buildPlan(t),this.publish(t)}}async configuredByAgent(){let e=await aJ(),t=new Set(eoL(await this.settings())),A=await e.skillToolObservation.findMany({where:{configured:!0}}),r=new Map;for(let e of A){if(!t.has(e.tool))continue;let A=r.get(e.agentId)??[];A.push(e.tool),r.set(e.agentId,A)}return r}async desiredLocations(e,t=new Set){let A=await aJ(),r=await this.configuredByAgent(),i=await A.skillToolObservation.findMany({where:{configured:!0}}),n=new Map;for(let e of i)n.set(e.agentId,e.homePath);let a=[];if("ALL"===e.kind){let e=await A.skill.findMany({where:{deletedAt:null,syncGlobally:!0},include:eo_});for(let[A,i]of r){if(t.has(A))continue;let r=n.get(A);if(r)for(let t of eoN(i,"GLOBAL")){let i=eoq(r,...eoH("GLOBAL",t));for(let r of e)a.push({skill:r,agentId:A,codebaseId:null,worktreeId:null,scope:"GLOBAL",rootKind:t,folder:null,rootPath:i,targetPath:eoq(i,r.name)})}}}for(let i of(await A.skillGroup.findMany({where:"GROUP"===e.kind&&e.groupId?{id:e.groupId}:void 0,include:{skills:{where:{skill:{deletedAt:null}},include:{skill:{include:eo_}}},repositories:{include:{repository:{include:{codebases:{where:{availability:"AVAILABLE"},include:{worktrees:{where:{missingAt:null}}}}}}}}}})))for(let e of i.repositories)for(let A of e.repository.codebases){if(t.has(A.agentId))continue;let e=eoN(r.get(A.agentId)??[],"PROJECT");for(let t of[{folder:A.folder,worktreeId:null},...A.worktrees.map(e=>({folder:e.folder,worktreeId:e.id}))])for(let r of e){let e=eoq(t.folder,...eoH("PROJECT",r));for(let n of i.skills)a.push({skill:n.skill,agentId:A.agentId,codebaseId:A.id,worktreeId:t.worktreeId,scope:"PROJECT",rootKind:r,folder:t.folder,rootPath:e,targetPath:eoq(e,n.skill.name)})}}return[...new Map(a.map(e=>[`${e.agentId}\0${e.targetPath}`,e])).values()]}installationWhere(e,t){return{present:!0,...t.size?{agentId:{notIn:[...t]}}:{},..."GROUP"===e.kind?{scope:"PROJECT",...e.groupId?{codebase:{repository:{skillGroups:{some:{groupId:e.groupId}}}}}:{}}:{}}}async buildPlan(e){let t=await aJ(),A=await t.skillSyncRun.findUniqueOrThrow({where:{id:e}}),r=new Set((await t.skillSyncItem.findMany({where:{runId:e,direction:"SCAN",status:"SKIPPED"},select:{agentId:!0}})).flatMap(e=>e.agentId?[e.agentId]:[]));await t.skillSyncItem.deleteMany({where:{runId:e,direction:{not:"SCAN"}}});let[i,n,a,s,o]=await Promise.all([t.skill.findMany({where:{deletedAt:null},include:eo_}),t.skill.findMany({where:{deletedAt:{not:null}}}),t.skillInstallation.findMany({where:this.installationWhere(A,r),include:{baseline:!0}}),this.desiredLocations(A,r),"GROUP"===A.kind&&A.groupId?this.desiredLocations({...A,groupId:null},r):this.desiredLocations(A,r)]),l=new Map(i.map(e=>[e.name,e])),c=new Map(i.map(e=>[e.id,e])),u=new Map(n.map(e=>[e.name,e])),d=new Map(n.map(e=>[e.id,e])),h=new Map;for(let e of a){let t=h.get(e.skillName)??[];t.push(e.packageHash),h.set(e.skillName,t)}let p=new Set([...h].flatMap(([e,t])=>{var A;return(A=l.get(e)?.packageHash??null,new Set(t.filter(e=>null===A||e!==A)).size>1)?[e]:[]})),g=[];for(let t of s)a.find(e=>e.agentId===t.agentId&&e.rootPath===t.rootPath&&e.skillName===t.skill.name)||g.push({id:(0,AP.randomUUID)(),runId:e,skillId:t.skill.id,agentId:t.agentId,direction:"EXPORT",status:"READY",sourceHash:t.skill.packageHash,candidatePackageJson:JSON.stringify({location:t})});for(let A of a){let r=A.baseline?.skillId??A.skillId,i=(r?c.get(r):void 0)??l.get(A.skillName),n=(r?d.get(r):void 0)??u.get(A.skillName),a=!!A.baseline&&!!i&&i.name!==A.skillName,h=s.find(e=>e.agentId===A.agentId&&e.rootPath===A.rootPath&&e.skill.name===A.skillName),f=o.find(e=>e.agentId===A.agentId&&e.rootPath===A.rootPath&&e.skill.name===A.skillName);i&&A.packageHash===i.packageHash&&!A.baseline&&await t.skillSyncBaseline.upsert({where:{installationId:A.id},create:{id:(0,AP.randomUUID)(),installationId:A.id,skillId:i.id,packageHash:i.packageHash},update:{skillId:i.id,packageHash:i.packageHash,syncedAt:new Date}});let I="UNCHANGED",w="COMPLETE";if(n&&A.baseline&&!A.tracked)I="DELETE_MANAGED",w="READY";else if(a)I=A.tracked?"CONFLICT":"DELETE_MANAGED",w=A.tracked?"BLOCKED":"READY";else if(f||!A.baseline||A.tracked)if(i)if(A.packageHash!==i.packageHash){var m;w="CONFLICT"===(I=p.has(A.skillName)?"CONFLICT":(m={databaseHash:i.packageHash,targetHash:A.packageHash,baselineHash:A.baseline?.packageHash??null,tracked:A.tracked}).databaseHash===m.targetHash?"UNCHANGED":m.tracked?"CONFLICT":m.baselineHash===m.databaseHash?"IMPORT":m.baselineHash===m.targetHash?"EXPORT":"CONFLICT")?"BLOCKED":"READY"}else!f&&["CURSOR","GITHUB_COPILOT","CODEX_LEGACY","OPENCODE"].includes(A.rootKind)&&o.some(e=>e.agentId===A.agentId&&e.scope===A.scope&&("GLOBAL"===A.scope||e.codebaseId===A.codebaseId&&e.worktreeId===A.worktreeId)&&e.skill.name===A.skillName&&e.skill.packageHash===A.packageHash)&&!A.tracked&&(I="DELETE_REDUNDANT",w="READY");else w="CONFLICT"==(I=p.has(A.skillName)?"CONFLICT":"IMPORT")||"PROJECT"===A.scope?"BLOCKED":"READY";else I="DELETE_MANAGED",w="READY";g.push({id:(0,AP.randomUUID)(),runId:e,skillId:i?.id??n?.id??null,installationId:A.id,agentId:A.agentId,direction:I,status:w,sourceHash:i?.packageHash??null,targetHash:A.packageHash,candidatePackageJson:JSON.stringify({location:{scope:A.scope,rootKind:A.rootKind,folder:"PROJECT"===A.scope?h?.folder??null:null,skillName:A.skillName},projectGroupRequired:!i&&"PROJECT"===A.scope})})}g.length&&await t.skillSyncItem.createMany({data:g});let f=await t.skillSyncItem.findMany({where:{runId:e,installationId:{not:null},direction:{in:["IMPORT","CONFLICT"]}},include:{installation:!0}}),I=new Map;for(let e of f){if(!e.agentId||!e.installation)continue;let t=I.get(e.agentId)??[];t.push(e),I.set(e.agentId,t)}let w=eoL(await this.settings());for(let[A,r]of I){let i=await t.skillSyncItem.create({data:{id:(0,AP.randomUUID)(),runId:e,agentId:A,direction:"READ",status:"PENDING"}}),n=await this.targets(A);await this.agentControl.createJob({agentId:A,kind:iH,payload:{tools:w,targets:n,requests:r.map(e=>({scope:e.installation.scope,rootKind:e.installation.rootKind,folder:"PROJECT"===e.installation.scope?n.find(t=>t.codebaseId===e.installation.codebaseId&&t.worktreeId===e.installation.worktreeId)?.folder??null:null,skillName:e.installation.skillName})),syncRunId:e,syncItemId:i.id},idempotencyKey:`skills:read:${e}:${A}`,timeoutSeconds:300})}await this.refreshRunStatus(e)}async completeRead(e){let{syncRunId:t,syncItemId:A}=this.completionIds(e);if(!t||!A)return;let r=await aJ();if(await r.skillSyncItem.findFirst({where:{id:A,runId:t,direction:"READ",status:"PENDING"}})){if("SUCCEEDED"===e.status&&e.resultJson){let i=eoP(e.resultJson,{packages:[]}),n=await r.skillSyncItem.findMany({where:{runId:t,agentId:e.agentId,installationId:{not:null},direction:{in:["IMPORT","CONFLICT"]}},include:{installation:!0}});for(let e of i.packages){let t=n.find(t=>t.installation?.skillName===e.package.name&&t.installation?.rootKind===e.rootKind&&t.installation?.scope===e.scope&&("GLOBAL"===e.scope||t.installation?.rootPath===eoq(e.folder,...eoH("PROJECT",e.rootKind))));if(!t)continue;let A=eoP(t.candidatePackageJson,{});await r.skillSyncItem.update({where:{id:t.id},data:{candidatePackageJson:JSON.stringify({...A,package:e.package})}})}await r.skillSyncItem.updateMany({where:{id:A,status:"PENDING"},data:{status:"COMPLETE"}})}else await r.skillSyncItem.updateMany({where:{id:A,status:"PENDING"},data:{status:"FAILED",error:e.error??"Skill package read failed"}});await this.refreshRunStatus(t),this.publish(t)}}async refreshRunStatus(e){let t=await aJ(),A=await t.skillSyncItem.findMany({where:{runId:e}});if(A.some(e=>eoO.includes(e.direction)&&"PENDING"===e.status))return;let r=A.some(e=>"BLOCKED"===e.status),i=A.some(e=>"FAILED"===e.status),n=r?"NEEDS_RESOLUTION":i?"PARTIAL":"READY",a=await t.skillSyncRun.update({where:{id:e},data:{status:n}});this.publish(e),a.automatic&&"READY"===n&&await this.applyRun(e)}async skipPending(e){let t=await aJ();await t.skillSyncRun.findUniqueOrThrow({where:{id:e}});let A=await t.skillSyncItem.findMany({where:{runId:e,direction:{in:eoJ},status:"PENDING",agentId:{not:null}}}),r=[];for(let i of A){if(1!==(await t.skillSyncItem.updateMany({where:{id:i.id,status:"PENDING"},data:{status:"SKIPPED",resolution:"SKIP"}})).count||!i.agentId)continue;r.push(i);let A=await t.agentJob.findUnique({where:{agentId_idempotencyKey:{agentId:i.agentId,idempotencyKey:`skills:${i.direction.toLowerCase()}:${e}:${i.agentId}`}}});A&&await this.agentControl.cancelJob(A.id)}if(!r.length)return this.getRun(e);let i=[...new Set(r.flatMap(e=>"READ"===e.direction&&e.agentId?[e.agentId]:[]))];i.length&&await t.skillSyncItem.updateMany({where:{runId:e,agentId:{in:i},direction:{notIn:eoJ},status:{in:["READY","BLOCKED"]}},data:{status:"SKIPPED",resolution:"SKIP"}});let n=r.filter(e=>"APPLY"===e.direction),a=n.flatMap(e=>{let{deployments:t=[]}=eoP(e.candidatePackageJson,{});return t.map(e=>e.id)});return a.length&&await t.skillDeployment.updateMany({where:{id:{in:a},status:"PENDING"},data:{status:"SKIPPED"}}),r.some(e=>"SCAN"===e.direction)?await t.skillSyncItem.count({where:{runId:e,direction:"SCAN",status:"PENDING"}})||await this.buildPlan(e):i.length&&await this.refreshRunStatus(e),n.length&&(await t.skillSyncItem.count({where:{runId:e,direction:"APPLY",status:"PENDING"}})||await t.skillSyncRun.update({where:{id:e},data:{status:"PARTIAL",finishedAt:new Date}})),this.publish(e),this.getRun(e)}async resolveItem(e){let t=await aJ(),A=await t.skillSyncItem.findUniqueOrThrow({where:{id:e.itemId}});if(!["BLOCKED","READY"].includes(A.status))throw Error("Sync item cannot be resolved");let r=eoP(A.candidatePackageJson,{});if("MANUAL"===e.resolution&&(r.package=i4(e.package,"manual resolution package")),"TARGET"===e.resolution&&!r.package)throw Error("The target package is unavailable");if("DELETE"===e.resolution&&!A.installationId)throw Error("The client skill installation is unavailable");if(r.projectGroupRequired&&["TARGET","MANUAL"].includes(e.resolution)){if(!e.groupId||!await t.skillGroup.findUnique({where:{id:e.groupId}}))throw Error("A project skill import requires a skill group");r.groupId=e.groupId}if(await t.skillSyncItem.update({where:{id:A.id},data:{resolution:e.resolution,direction:"DELETE"===e.resolution?"DELETE_REDUNDANT":A.direction,candidatePackageJson:JSON.stringify(r),status:"SKIP"===e.resolution?"SKIPPED":"READY"}}),["TARGET","MANUAL"].includes(e.resolution)){let e=r.package?.name??null;if(e){let r=(await t.skillSyncItem.findMany({where:{runId:A.runId,id:{not:A.id},direction:"CONFLICT",status:{in:["BLOCKED","READY"]}},include:{skill:!0,installation:!0}})).flatMap(t=>(t.skill?.name??t.installation?.skillName)===e?[t.id]:[]);r.length&&await t.skillSyncItem.updateMany({where:{id:{in:r}},data:{resolution:"DATABASE",status:"READY"}})}}return await this.refreshRunStatus(A.runId),this.getRun(A.runId)}async importCandidates(e){let t=await aJ();for(let A of(await t.skillSyncItem.findMany({where:{runId:e,status:"READY",OR:[{direction:"IMPORT"},{direction:"CONFLICT",resolution:{in:["TARGET","MANUAL"]}}]},include:{installation:!0}}))){let e=eoP(A.candidatePackageJson,{});if(!e.package)continue;let r=await t.skill.findUnique({where:{name:e.package.name},include:eo_}),i=await this.saveSkill({id:r?.id,name:e.package.name,description:e.package.description,syncGlobally:r?.syncGlobally??!e.groupId,groupIds:[...r?.groups.map(e=>e.groupId)??[],...e.groupId?[e.groupId]:[]],files:e.package.files});A.installationId&&(await t.skillInstallation.update({where:{id:A.installationId},data:{skillId:i.id}}),A.targetHash===i.packageHash&&await t.skillSyncBaseline.upsert({where:{installationId:A.installationId},create:{id:(0,AP.randomUUID)(),installationId:A.installationId,skillId:i.id,packageHash:i.packageHash},update:{skillId:i.id,packageHash:i.packageHash,syncedAt:new Date}}))}}async applyRun(e){let t=await aJ(),A=await t.skillSyncRun.findUniqueOrThrow({where:{id:e}});if(await t.skillSyncItem.count({where:{runId:e,status:"BLOCKED"}}))throw Error("Resolve all conflicts before applying sync");await this.importCandidates(e);let r=new Set((await t.skillSyncItem.findMany({where:{runId:e,direction:{in:eoO},status:"SKIPPED"},select:{agentId:!0}})).flatMap(e=>e.agentId?[e.agentId]:[])),i=await this.desiredLocations(A,r),n=await t.skillInstallation.findMany({where:this.installationWhere(A,r)}),a=new Map,s=new Map,o=(e,t)=>{let A=a.get(e)??[];A.push(t),a.set(e,A)},l=(e,t)=>{let A=s.get(e)??[];A.push(t),s.set(e,A)};for(let e of i){let A=n.find(t=>t.agentId===e.agentId&&t.rootPath===e.rootPath&&t.skillName===e.skill.name);if(A?.packageHash===e.skill.packageHash||A?.tracked)continue;o(e.agentId,{kind:"WRITE",scope:e.scope,rootKind:e.rootKind,folder:e.folder,package:function(e){let t=e.files.map(e=>({path:e.path,contentsBase64:Buffer.from(e.contents).toString("base64"),executable:e.executable}));return{name:e.name,description:e.description,packageHash:e.packageHash,files:t}}(e.skill),manageGitExclude:"PROJECT"===e.scope});let r=await t.skillDeployment.upsert({where:{agentId_targetPath:{agentId:e.agentId,targetPath:e.targetPath}},create:{id:(0,AP.randomUUID)(),skillId:e.skill.id,agentId:e.agentId,codebaseId:e.codebaseId,worktreeId:e.worktreeId,scope:e.scope,rootKind:e.rootKind,targetPath:e.targetPath,desiredHash:e.skill.packageHash,status:"PENDING"},update:{skillId:e.skill.id,desiredHash:e.skill.packageHash,status:"PENDING",lastError:null}});l(e.agentId,{id:r.id,desiredHash:e.skill.packageHash})}let c=await t.skillSyncItem.findMany({where:{runId:e,direction:{in:["DELETE_REDUNDANT","DELETE_MANAGED"]},status:"READY"},include:{installation:!0}}),u=new Set(c.flatMap(e=>e.installationId?[e.installationId]:[])),d=n.filter(e=>!u.has(e.id)&&!e.tracked&&["CURSOR","GITHUB_COPILOT","CODEX_LEGACY","OPENCODE"].includes(e.rootKind)&&!i.some(t=>t.agentId===e.agentId&&t.rootPath===e.rootPath&&t.skill.name===e.skillName)&&i.some(t=>t.agentId===e.agentId&&t.scope===e.scope&&("GLOBAL"===e.scope||t.codebaseId===e.codebaseId&&t.worktreeId===e.worktreeId)&&t.skill.name===e.skillName&&t.skill.packageHash===e.packageHash));for(let e of[...c.flatMap(e=>e.installation?[e.installation]:[]),...d]){if(!e||e.tracked)continue;let t=await this.targets(e.agentId),A="PROJECT"===e.scope?t.find(t=>t.codebaseId===e.codebaseId&&t.worktreeId===e.worktreeId)?.folder??null:null;("PROJECT"!==e.scope||A)&&o(e.agentId,{kind:"DELETE",scope:e.scope,rootKind:e.rootKind,folder:A,skillName:e.skillName,manageGitExclude:"PROJECT"===e.scope})}for(let[A,r]of a){let i=await t.skillSyncItem.create({data:{id:(0,AP.randomUUID)(),runId:e,agentId:A,direction:"APPLY",status:"PENDING",candidatePackageJson:JSON.stringify({deployments:s.get(A)??[]})}});await this.agentControl.createJob({agentId:A,kind:ij,payload:{operations:r,syncRunId:e,syncItemId:i.id},idempotencyKey:`skills:apply:${e}:${A}`,timeoutSeconds:600})}return await t.skillSyncRun.update({where:{id:e},data:a.size?{status:"APPLYING"}:{status:"SUCCEEDED",finishedAt:new Date}}),this.publish(e),this.getRun(e)}async completeApply(e){let{syncRunId:t,syncItemId:A}=this.completionIds(e);if(!t||!A)return;let r=await aJ(),i=await r.skillSyncItem.findFirst({where:{id:A,runId:t,direction:"APPLY",status:"PENDING"}});if(!i)return;let n="SUCCEEDED"===e.status,{deployments:a=[]}=eoP(i?.candidatePackageJson??null,{});await r.skillSyncItem.updateMany({where:{id:A,status:"PENDING"},data:{status:n?"COMPLETE":"FAILED",error:n?null:e.error??"Skill apply failed"}});let s=await r.skillDeployment.findMany({where:{id:{in:a.map(e=>e.id)},agentId:e.agentId,status:"PENDING"},include:{skill:{include:{files:!0}}}}),o=eoP(e.resultJson,{});if(n){let t=await this.configuredByAgent();for(let e of s){let A=a.find(t=>t.id===e.id),i=o.results?.find(t=>"WRITE"===t.kind&&t.path===e.targetPath);if(!A||e.desiredHash!==A.desiredHash||i?.packageHash!==A.desiredHash)continue;let n=await r.skillInstallation.upsert({where:{agentId_rootPath_skillName:{agentId:e.agentId,rootPath:eoK(e.targetPath),skillName:e.skill.name}},create:{id:(0,AP.randomUUID)(),skillId:e.skillId,agentId:e.agentId,codebaseId:e.codebaseId,worktreeId:e.worktreeId,scope:e.scope,rootKind:e.rootKind,rootPath:eoK(e.targetPath),skillName:e.skill.name,description:e.skill.description,packageHash:e.desiredHash,present:!0,fileCount:e.skill.files.length,totalBytes:e.skill.files.reduce((e,t)=>e+t.contents.byteLength,0),tracked:!1,consumersJson:JSON.stringify(t.get(e.agentId)??[]),lastSeenAt:new Date},update:{skillId:e.skillId,codebaseId:e.codebaseId,worktreeId:e.worktreeId,scope:e.scope,rootKind:e.rootKind,description:e.skill.description,packageHash:e.desiredHash,present:!0,fileCount:e.skill.files.length,totalBytes:e.skill.files.reduce((e,t)=>e+t.contents.byteLength,0),tracked:!1,consumersJson:JSON.stringify(t.get(e.agentId)??[]),lastSeenAt:new Date}});await r.skillSyncBaseline.upsert({where:{installationId:n.id},create:{id:(0,AP.randomUUID)(),installationId:n.id,skillId:e.skillId,packageHash:e.desiredHash},update:{skillId:e.skillId,packageHash:e.desiredHash,syncedAt:new Date}}),await r.skillDeployment.update({where:{id:e.id},data:{status:"INSTALLED",installedHash:e.desiredHash,lastError:null}})}for(let t of o.results??[])if("DELETE"===t.kind){var l;await r.skillInstallation.updateMany({where:{agentId:e.agentId,rootPath:eoK(t.path),skillName:eoj(l=t.path).basename(l)},data:{present:!1,lastSeenAt:new Date}})}}else for(let t of a)await r.skillDeployment.updateMany({where:{id:t.id,agentId:e.agentId,desiredHash:t.desiredHash,status:"PENDING"},data:{status:"FAILED",lastError:e.error??"Skill apply failed"}});if(!await r.skillSyncItem.count({where:{runId:t,direction:"APPLY",status:"PENDING"}})){let e=await r.skillSyncItem.count({where:{runId:t,direction:"APPLY",status:{in:["FAILED","SKIPPED"]}}});await r.skillSyncRun.update({where:{id:t},data:{status:e?"PARTIAL":"SUCCEEDED",finishedAt:new Date}})}this.publish(t)}}let eoW=/^[A-Za-z_$][A-Za-z0-9_$]*$/;function eo$(e){return function e(t){return null===t?"null":Array.isArray(t)?`[${t.map(e).join(",")}]`:"object"==typeof t?`{${Object.entries(t).sort(([e],[t])=>e.localeCompare(t)).map(([t,A])=>`${JSON.stringify(t)}:${e(A)}`).join(",")}}`:JSON.stringify(t)}(e)}function eoZ(e){return eoW.test(e)?`.${e}`:`[${JSON.stringify(e)}]`}function eoz(e,t){let A={},r=(e,t)=>{if(t&&"object"==typeof t&&!Array.isArray(t)&&Object.getPrototypeOf(t)===Object.prototype){let i=Object.entries(t);if(0===i.length)A[e]=t;else for(let[t,A]of i)r(`${e}${eoZ(t)}`,A)}else A[e]=t};for(let[A,i]of Object.entries(t))r(`${e}${eoZ(A)}`,i);return A}function eoX(e){let t={default:e.defaultParameters,additional:e.additionalParameters};return{...{source:e.entryType,time:e.clientTime,receivedAt:e.receivedAt,deviceIp:e.deviceIp,message:e.message,level:e.level,category:e.category,eventName:e.eventName,eventKind:e.eventKind,levelKind:e.level??e.eventKind,screenName:e.screenName,buildId:e.buildId,sessionId:e.sessionId,attributes:e.attributes,defaultParameters:e.defaultParameters,additionalParameters:e.additionalParameters,parameters:t,detail:"CONSOLE"===e.entryType?e.message:`${e.eventName??""}${e.screenName?` (${e.screenName})`:""}`},...eoz("attributes",e.attributes),...eoz("defaultParameters",e.defaultParameters),...eoz("additionalParameters",e.additionalParameters)}}function eo0(e){return null==e?"":"string"==typeof e?e:"number"==typeof e||"boolean"==typeof e?String(e):eo$(e)}function eo1(e){return Object.entries(eoX(e)).flatMap(([e,t])=>[e,eo0(t)]).join("\n")}let eo8=["CONSOLE","ANALYTICS","UNIFIED"],eo4=["TEXT","GLOB","REGEX"],eo2=["CONTAINS","DOES_NOT_CONTAIN","IS","IS_NOT","MATCHES_GLOB","MATCHES_REGEX","NO_REGEX_MATCH","IS_EMPTY","IS_NOT_EMPTY"],eo3={CONSOLE:["time","level","category","message","buildId","sessionId"],ANALYTICS:["time","eventKind","eventName","screenName","parameters","buildId","sessionId"],UNIFIED:["time","source","levelKind","detail","buildId","sessionId"]},eo6=["gray","stone","red","rose","orange","amber","yellow","lime","green","emerald","teal","cyan","sky","blue","indigo","violet","purple","fuchsia","pink"],eo5=new Map;function eo9(e,t,A){let r;if(t.length>1024)throw Error("Pattern must not exceed 1024 characters");if(!eo4.includes(e))throw Error("Unknown search mode");let i=`${e}\u0000${A?"1":"0"}\u0000${t}`,n=eo5.get(i);if(n)return n;if("TEXT"===e){let e=A?t:t.toLocaleLowerCase();r=t=>(A?t:t.toLocaleLowerCase()).includes(e)}else{let i="GLOB"===e?`^${function(e){let t="";for(let A=0;A<e.length;A+=1){let r=e[A];if("*"===r)t+=".*";else if("?"===r)t+=".";else if("["===r){let r=e.indexOf("]",A+1);if(-1===r)throw Error("Invalid glob pattern: missing ]");{let i=e.slice(A+1,r).replace(/^!/,"^");t+=`[${i}]`,A=r}}else t+=r.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&")}return t}(t)}$`:t,n=new wW.default(i,A?"su":"isu");r=e=>n.test(e)}return eo5.set(i,r),eo5.size>100&&eo5.delete(eo5.keys().next().value),r}function eo7(e){return null==e||""===e||Array.isArray(e)&&0===e.length||"object"==typeof e&&!Array.isArray(e)&&0===Object.keys(e).length}function ele(e){return"CONSOLE"===e?["CONSOLE"]:"ANALYTICS"===e?["ANALYTICS"]:["CONSOLE","ANALYTICS"]}function elt(e,t){return"SEPARATOR"!==e.entryType&&!!ele(t.view).includes(e.entryType)&&(!t.search||!!eo9(t.searchMode??"TEXT",t.search,!0===t.caseSensitive)(eo1(e)))&&function(e,t){if(!t)return!0;let A=eoX(e);return Object.entries(t).every(([e,t])=>0===t.length||t.includes(eo0(A[e])))}(e,t.quickFilters)&&function(e,t){if(!t?.conditions.length)return!0;let A=t.conditions.filter(t=>!t.sources?.length||"SEPARATOR"!==e.entryType&&t.sources.includes(e.entryType));if(0===A.length)return!0;let r=eoX(e),i=A.map(e=>(function(e,t){if(!eo2.includes(t.operator))throw Error("Unknown filter operator");let A=e[t.field];if("IS_EMPTY"===t.operator)return eo7(A);if("IS_NOT_EMPTY"===t.operator)return!eo7(A);let r=eo0(A),i=t.value??"",n=!0===t.caseSensitive,a=n?r:r.toLocaleLowerCase(),s=n?i:i.toLocaleLowerCase();if("CONTAINS"===t.operator)return a.includes(s);if("DOES_NOT_CONTAIN"===t.operator)return!a.includes(s);if("IS"===t.operator)return a===s;if("IS_NOT"===t.operator)return a!==s;if("MATCHES_GLOB"===t.operator)return eo9("GLOB",i,n)(r);let o=eo9("REGEX",i,n)(r);return"MATCHES_REGEX"===t.operator?o:!o})(r,e));return"ANY"===t.mode?i.some(Boolean):i.every(Boolean)}(e,t.advancedFilter)}function elA(e){for(let t of(e.search&&eo9(e.searchMode??"TEXT",e.search,!0===e.caseSensitive),e.advancedFilter?.conditions??[]))["MATCHES_GLOB","MATCHES_REGEX","NO_REGEX_MATCH"].includes(t.operator)&&eo9("MATCHES_GLOB"===t.operator?"GLOB":"REGEX",t.value??"",!0===t.caseSensitive)}let elr="default";function eli(e){try{let t=JSON.parse(e);return t&&"object"==typeof t&&!Array.isArray(t)?t:{}}catch{return{}}}function eln(e){return{id:e.id,entryType:e.entryType,clientTime:e.clientTime.toISOString(),receivedAt:e.receivedAt.toISOString(),deviceIp:e.deviceIp,message:e.message,level:e.level,category:e.category,eventName:e.eventName,eventKind:e.eventKind,screenName:e.screenName,buildId:e.buildId,sessionId:e.sessionId,attributes:eli(e.attributesJson),defaultParameters:eli(e.defaultParametersJson),additionalParameters:eli(e.additionalParametersJson),highlightColor:e.highlightColor,separatorKind:e.separatorKind,separatorName:e.separatorName}}function ela(e){if(!eo8.includes(e))throw Error("Unknown telemetry view");return e}function els(e){let t=e.trim();if(!t||t.length>100)throw Error("Name must contain 1-100 characters");return{name:t,normalizedName:t.toLocaleLowerCase()}}function elo(e){let t;try{t=new URL(e.trim())}catch{throw Error("Telemetry URL must be a valid HTTP(S) origin")}if(!["http:","https:"].includes(t.protocol)||t.username||t.password||"/"!==t.pathname&&""!==t.pathname||t.search||t.hash)throw Error("Telemetry URL must be an HTTP(S) origin without a path, credentials, query, or fragment");return t.origin}function ell(e){return e?.trim()?elo(e):null}function elc(e){if(!e?.trim())return null;try{let t=new URL(e.trim());return["http:","https:"].includes(t.protocol)?t.origin:null}catch{return null}}function elu(e){if(!e)return null;try{let t=JSON.parse(Buffer.from(e,"base64url").toString("utf8"));if(t&&"object"==typeof t&&"string"==typeof t.clientTime&&"string"==typeof t.receivedAt&&"string"==typeof t.id&&Number.isFinite(Date.parse(t.clientTime))&&Number.isFinite(Date.parse(t.receivedAt)))return t}catch{}throw Error("Invalid telemetry cursor")}function eld(e){let t=new Date(e.clientTime),A=new Date(e.receivedAt);return{OR:[{clientTime:{lt:t}},{clientTime:t,receivedAt:{lt:A}},{clientTime:t,receivedAt:A,id:{lt:e.id}}]}}function elh(e){return Buffer.from(JSON.stringify({clientTime:e.clientTime,receivedAt:e.receivedAt,id:e.id})).toString("base64url")}function elp(e,t){return e.clientTime!==t.clientTime?e.clientTime<t.clientTime:e.receivedAt!==t.receivedAt?e.receivedAt<t.receivedAt:e.id<t.id}function elg(e){return!!(e.search||Object.values(e.quickFilters??{}).some(e=>e.length)||e.advancedFilter?.conditions.length)}function elm(e){return{entryType:{in:ele(e)}}}let elf={source:{name:"entryType",nullable:!1},deviceIp:{name:"deviceIp",nullable:!0},message:{name:"message",nullable:!0},level:{name:"level",nullable:!0},category:{name:"category",nullable:!0},eventName:{name:"eventName",nullable:!0},eventKind:{name:"eventKind",nullable:!0},screenName:{name:"screenName",nullable:!0},buildId:{name:"buildId",nullable:!0},sessionId:{name:"sessionId",nullable:!0}};function elI(e){let t=[...new Set(e.map(e=>e.trim()).filter(Boolean))];if(0===t.length||t.length>100||t.some(e=>e.length>512))throw Error("Columns must contain 1-100 valid column identifiers");return JSON.stringify(t)}function elw(e,t){try{let t=JSON.parse(e);if(Array.isArray(t)&&t.every(e=>"string"==typeof e)&&t.length)return t}catch{}return eo3[t]}class elC{subscribe(){return aq.iterate(sg)}subscribeSettings(){return aq.iterate(sm)}publish(e,t){aq.publish(sg,{ids:e,reason:t})}notifyChange(e,t){this.publish(e,t)}async rawSettings(){return(await aJ()).telemetrySettings.upsert({where:{id:elr},create:{id:elr},update:{}})}async settings(e={}){let[t,A]=await Promise.all([this.rawSettings(),Promise.resolve(function(e={}){let t,A=elc(e.requestOrigin),r=(e.localOrigins??function(){let e=Number(process.env.PORT??3e3),t=Number.isInteger(e)&&e>0&&e<=65535?e:3e3;var A=(0,esw.networkInterfaces)();let r=new Set;for(let e of Object.values(A))for(let A of e??[])A&&!A.internal&&("IPv4"===A.family?r.add(`http://${A.address}:${t}`):"IPv6"!==A.family||A.address.toLowerCase().startsWith("fe80:")||r.add(`http://[${A.address}]:${t}`));return[...r]}()).flatMap(e=>{try{return[elo(e)]}catch{return[]}}),i=elc(e.publicBaseUrl??process.env.PUBLIC_BASE_URL),n=!!A&&("localhost"===(t=new URL(A).hostname.toLowerCase().replace(/^\[|\]$/g,""))||"::1"===t||t.endsWith(".local")||/^127\./.test(t)||/^10\./.test(t)||/^192\.168\./.test(t)||/^172\.(1[6-9]|2\d|3[01])\./.test(t)),a=A&&n?A:r[0]??A??"http://127.0.0.1:3000",s=i??A??a;return{local:a,remote:s}}(e))]);return{localBaseUrlOverride:t.localBaseUrlOverride,remoteBaseUrlOverride:t.remoteBaseUrlOverride,consoleCollectionEnabled:t.consoleCollectionEnabled,analyticsCollectionEnabled:t.analyticsCollectionEnabled,detectedLocalBaseUrl:A.local,detectedRemoteBaseUrl:A.remote,effectiveLocalBaseUrl:t.localBaseUrlOverride??A.local,effectiveRemoteBaseUrl:t.remoteBaseUrlOverride??A.remote,updatedAt:t.updatedAt.toISOString()}}async saveSettings(e,t={}){let A=await aJ(),r=await this.rawSettings(),i=await A.telemetrySettings.update({where:{id:elr},data:{localBaseUrlOverride:void 0===e.localBaseUrlOverride?r.localBaseUrlOverride:ell(e.localBaseUrlOverride),remoteBaseUrlOverride:void 0===e.remoteBaseUrlOverride?r.remoteBaseUrlOverride:ell(e.remoteBaseUrlOverride),consoleCollectionEnabled:e.consoleCollectionEnabled??r.consoleCollectionEnabled,analyticsCollectionEnabled:e.analyticsCollectionEnabled??r.analyticsCollectionEnabled}});return aq.publish(sm,{updatedAt:i.updatedAt.toISOString()}),this.settings(t)}async buildSettings(e,t={}){let A=await this.settings(t),r="SIMULATOR"===e?A.effectiveLocalBaseUrl:A.effectiveRemoteBaseUrl;return{localBaseUrl:A.effectiveLocalBaseUrl,remoteBaseUrl:A.effectiveRemoteBaseUrl,selectedBaseUrl:r,consoleLogsUrl:`${r}/api/telemetry/console-logs`,analyticsEventsUrl:`${r}/api/telemetry/analytics-events`,consoleCollectionEnabled:A.consoleCollectionEnabled,analyticsCollectionEnabled:A.analyticsCollectionEnabled}}async ingestConsole(e,t){if(!(await this.rawSettings()).consoleCollectionEnabled)return{collected:!1,items:[]};let A=await aJ(),r=new Date,i=e.map(e=>{let A={id:(0,AP.randomUUID)(),entryType:"CONSOLE",clientTime:new Date(e.time),receivedAt:r,deviceIp:t,message:e.message,level:e.level,category:e.category,buildId:e.buildId,sessionId:e.sessionId,attributesJson:JSON.stringify(e.attributes),searchText:""},i=eln({...A,eventName:null,eventKind:null,screenName:null,defaultParametersJson:"{}",additionalParametersJson:"{}",highlightColor:null,separatorKind:null,separatorName:null});return{...A,searchText:eo1(i)}});return await A.telemetryEntry.createMany({data:i}),this.publish(i.map(({id:e})=>e),"INGESTED"),{collected:!0,items:i.map(({id:e})=>({id:e,receivedAt:r.toISOString(),deviceIp:t}))}}async ingestAnalytics(e,t){if(!(await this.rawSettings()).analyticsCollectionEnabled)return{collected:!1,items:[]};let A=await aJ(),r=new Date,i=e.map(e=>{let A={id:(0,AP.randomUUID)(),entryType:"ANALYTICS",clientTime:new Date(e.time),receivedAt:r,deviceIp:t,eventName:e.eventName,eventKind:e.kind,screenName:e.screenName,buildId:e.buildId,sessionId:e.sessionId,defaultParametersJson:JSON.stringify(e.defaultParameters),additionalParametersJson:JSON.stringify(e.additionalParameters),searchText:""},i=eln({...A,message:null,level:null,category:null,attributesJson:"{}",highlightColor:null,separatorKind:null,separatorName:null});return{...A,searchText:eo1(i)}});return await A.telemetryEntry.createMany({data:i}),this.publish(i.map(({id:e})=>e),"INGESTED"),{collected:!0,items:i.map(({id:e})=>({id:e,receivedAt:r.toISOString(),deviceIp:t}))}}async scan(e,t,A=1e3){let r=await aJ(),i=null;for(;;){let n=await r.telemetryEntry.findMany({where:i?{AND:[e,{OR:[{clientTime:{lt:i.clientTime}},{clientTime:i.clientTime,receivedAt:{lt:i.receivedAt}},{clientTime:i.clientTime,receivedAt:i.receivedAt,id:{lt:i.id}}]}]}:e,orderBy:[{clientTime:"desc"},{receivedAt:"desc"},{id:"desc"}],take:A});for(let e of n)if(await t(eln(e))===!1)return;if(n.length<A)break;i=n.at(-1)}}async timeline(e){let t=ela(e.view);elA(e);let A=Math.min(500,Math.max(1,e.first??200)),r=elu(e.after),i=await aJ(),n=await i.telemetryEntry.count({where:elm(t)}),a=elg(e);if(!a){let e=[],i=0,a=!1,s=null,o=!1,l={entryType:{in:[...ele(t),"SEPARATOR"]}};return(await this.scan(r?{AND:[l,eld(r)]}:l,t=>{if("SEPARATOR"===t.entryType){o&&e.push(t),o=!1;return}if(i<A){e.push(t),i+=1,s=t,o=!0;return}return a=!0,!1},Math.min(1e3,A+1)),s)?{items:e,nextCursor:a?elh(s):null,matchingCount:n,totalCount:n}:{items:[],nextCursor:null,matchingCount:n,totalCount:n}}let s=[],o=0,l=!1,c=0,u=null,d=!1,h=!1,p=function(e){let t=[];for(let[A,r]of(e.search&&(e.searchMode??"TEXT")==="TEXT"&&!0===e.caseSensitive&&t.push({searchText:{contains:e.search}}),Object.entries(e.quickFilters??{}))){if(!r.length)continue;let e=elf[A];if(!e)continue;let i=function(e,t){let A=[...new Set(t)],r=A.filter(Boolean),i=[];return(r.length&&i.push({[e.name]:{in:r}}),A.includes("")&&(i.push({[e.name]:""}),e.nullable&&i.push({[e.name]:null})),0===i.length)?null:1===i.length?i[0]:{OR:i}}(e,r);i&&t.push(i)}if(e.advancedFilter?.mode==="ALL")for(let A of e.advancedFilter.conditions){if(A.sources?.length||!0!==A.caseSensitive)continue;let e=elf[A.field],r=A.value??"";e&&r&&("IS"===A.operator?t.push({[e.name]:r}):"CONTAINS"===A.operator&&t.push({[e.name]:{contains:r}}))}return t.length?1===t.length?t[0]:{AND:t}:null}(e);return(await this.scan(p?{OR:[{entryType:"SEPARATOR"},{AND:[elm(t),p]}]}:{entryType:{in:[...ele(t),"SEPARATOR"]}},t=>{if("SEPARATOR"===t.entryType){(!r||elp(t,r))&&(!a&&!l||a&&d&&!h)&&s.push(t),d=!1,h=!1;return}!elt(t,e)||(o+=1,(!r||elp(t,r))&&(c<A?(s.push(t),c+=1,u=t,d=!0):(l=!0,h=!0)))}),u)?{items:s,nextCursor:l?elh(u):null,matchingCount:o,totalCount:n}:{items:[],nextCursor:null,matchingCount:o,totalCount:n}}async entries(e){let t=await aJ(),A=[...new Set(e)].slice(0,1e3);return(await t.telemetryEntry.findMany({where:{id:{in:A}}})).map(eln)}async entry(e,t){let A=ela(t),r=(await this.entries([e]))[0]??null;if(!r)return null;if("SEPARATOR"===r.entryType||!ele(A).includes(r.entryType))throw Error(`Telemetry entry ${e} does not belong to ${A}`);return r}async latestSeparator(){let e=await aJ(),t=await e.telemetryEntry.findFirst({where:{entryType:"SEPARATOR"},orderBy:[{clientTime:"desc"},{receivedAt:"desc"},{id:"desc"}]});return t?eln(t):null}async separators(e){let t=Math.min(500,Math.max(1,e.first??100)),A=elu(e.after),r=[{entryType:"SEPARATOR"}];e.kind?.trim()&&r.push({separatorKind:e.kind.trim()}),e.name?.trim()&&r.push({separatorName:{contains:e.name.trim()}}),e.buildId?.trim()&&r.push({buildId:e.buildId.trim()}),A&&r.push(eld(A));let i=await aJ(),n=await i.telemetryEntry.findMany({where:{AND:r},orderBy:[{clientTime:"desc"},{receivedAt:"desc"},{id:"desc"}],take:t+1}),a=n.length>t,s=n.slice(0,t).map(eln);return{items:s,nextCursor:a&&s.length?elh(s.at(-1)):null}}async timelineSinceLatestSeparator(e){let t,A,r=ela(e.view);elA(e);let i=Math.min(500,Math.max(1,e.first??200)),n=elu(e.after),a=await this.latestSeparator(),s=a?{clientTime:a.clientTime,receivedAt:a.receivedAt,id:a.id}:null,o=elg(e),l=s?{AND:[elm(r),(t=new Date(s.clientTime),{OR:[{clientTime:{gt:t}},{clientTime:t,receivedAt:{gt:A=new Date(s.receivedAt)}},{clientTime:t,receivedAt:A,id:{gt:s.id}}]})]}:elm(r);if(!o){let e=await aJ(),t=await e.telemetryEntry.count({where:l}),A=[],r=!1,s=null;return await this.scan(n?{AND:[l,eld(n)]}:l,e=>{if(A.length<i){A.push(e),s=e;return}return r=!0,!1},Math.min(1e3,i+1)),{separator:a,items:A,nextCursor:r&&s?elh(s):null,matchingCount:t,totalCount:t}}let c=[],u=0,d=0,h=!1,p=null;return await this.scan(l,t=>{d+=1,!elt(t,e)||(u+=1,(!n||elp(t,n))&&(c.length<i?(c.push(t),p=t):h=!0))}),{separator:a,items:c,nextCursor:h&&p?elh(p):null,matchingCount:u,totalCount:d}}async facets(e){let t=ela(e),A="CONSOLE"===t?["level","category","deviceIp","buildId","sessionId"]:"ANALYTICS"===t?["eventKind","eventName","screenName","deviceIp","buildId","sessionId"]:["source","level","eventKind","deviceIp","buildId","sessionId"],r=Object.fromEntries(A.map(e=>[e,new Set]));return await this.scan(elm(t),e=>{let i=eoX(e);for(let e of A){let t=i[e];null!=t&&""!==String(t)&&r[e].add(String(t))}"UNIFIED"===t&&r.source.add(e.entryType)}),Object.fromEntries(Object.entries(r).map(([e,t])=>[e,[...t].sort((e,t)=>e.localeCompare(t))]))}async fields(e){let t=ela(e),A=new Set;return await this.scan(elm(t),e=>{for(let t of Object.keys(eoX(e)))A.add(t)}),[...A].sort((e,t)=>e.localeCompare(t))}async addSeparator(e){let t=e?.trim()||null;if(t&&t.length>100)throw Error("Separator name must not exceed 100 characters");let A=await aJ(),r=await A.telemetryEntry.create({data:{id:(0,AP.randomUUID)(),entryType:"SEPARATOR",clientTime:new Date,receivedAt:new Date,separatorKind:"MANUAL",separatorName:t}});return this.publish([r.id],"SEPARATOR_ADDED"),eln(r)}async addBuildSeparator(e){let t=await aJ(),A=await t.telemetryEntry.upsert({where:{separatorKind_buildId:{separatorKind:"BUILD",buildId:e.buildId}},create:{id:(0,AP.randomUUID)(),entryType:"SEPARATOR",clientTime:e.clientTime??new Date,receivedAt:new Date,separatorKind:"BUILD",separatorName:e.name.slice(0,100),buildId:e.buildId},update:{}});return this.publish([A.id],"BUILD_SEPARATOR_ADDED"),eln(A)}async highlight(e,t){if(null!==t&&!eo6.includes(t))throw Error("Unknown telemetry highlight color");let A=await aJ();if("SEPARATOR"===(await A.telemetryEntry.findUniqueOrThrow({where:{id:e}})).entryType)throw Error("Separators cannot be highlighted");let r=await A.telemetryEntry.update({where:{id:e},data:{highlightColor:t}});return this.publish([e],"HIGHLIGHT_CHANGED"),eln(r)}selectionRanges(e){return(Array.isArray(e.ranges)?e.ranges.slice(0,500):[]).map(e=>{if(!e||"object"!=typeof e)throw Error("Invalid telemetry selection range");let t=e.startTime?Date.parse(e.startTime):null,A=e.endTime?Date.parse(e.endTime):null;if(null!==t&&!Number.isFinite(t)||null!==A&&!Number.isFinite(A)||null!==t&&null!==A&&t>=A)throw Error("Invalid telemetry selection range");return{start:t,end:A,includeSeparators:!0===e.includeSeparators}})}async selectionIds(e){let t=new Set((Array.isArray(e.ids)?e.ids:[]).filter(e=>"string"==typeof e).slice(0,1e5)),A=new Set((Array.isArray(e.excludedIds)?e.excludedIds:[]).filter(e=>"string"==typeof e).slice(0,1e5));if(!e.query){for(let e of A)t.delete(e);return[...t]}if("object"!=typeof e.query||Array.isArray(e.query))throw Error("Invalid telemetry selection query");ela(e.query.view),elA(e.query);let r=this.selectionRanges(e);return await this.scan(e.includeSeparators||r.some(e=>e.includeSeparators)?{entryType:{in:[...ele(e.query.view),"SEPARATOR"]}}:elm(e.query.view),i=>{let n=Date.parse(i.clientTime),a=r.filter(e=>(null===e.start||n>=e.start)&&(null===e.end||n<e.end));if((!(r.length>0)||0!==a.length)&&!A.has(i.id)){if("SEPARATOR"===i.entryType){(e.includeSeparators||a.some(e=>e.includeSeparators))&&t.add(i.id);return}elt(i,e.query)&&t.add(i.id)}}),[...t]}async clearSelected(e){let t=await this.selectionIds(e);if(!t.length)return 0;let A=await aJ(),r=0;for(let e=0;e<t.length;e+=500)r+=(await A.telemetryEntry.deleteMany({where:{id:{in:t.slice(e,e+500)}}})).count;return this.publish([],"CLEARED"),r}async clearAll(e,t=!1){let A=ela(e),r=await aJ(),i=await r.telemetryEntry.deleteMany({where:t?{entryType:{in:[...ele(A),"SEPARATOR"]}}:elm(A)});return this.publish([],t?"CLEARED_WITH_SEPARATORS":"CLEARED"),i.count}async clearBeforeLatestSeparator(e,t=!1){let A=ela(e),r=await this.latestSeparator();if(!r)return 0;let i=await aJ(),n=await i.telemetryEntry.deleteMany({where:{AND:[t?{entryType:{in:[...ele(A),"SEPARATOR"]}}:elm(A),eld({clientTime:r.clientTime,receivedAt:r.receivedAt,id:r.id})]}});return this.publish([],"CLEARED_BEFORE_SEPARATOR"),n.count}async clearScoped(e){let t=ela(e.view);if("ALL"===e.scope)return this.clearAll(t,!!e.includeSeparators);if("BEFORE_LATEST_SEPARATOR"===e.scope)return this.clearBeforeLatestSeparator(t,!!e.includeSeparators);if("MATCHING"===e.scope){if(!e.query)throw Error("A matching query is required");return this.clearSelected({query:{...e.query,view:t}})}let A=[...new Set(e.ids??[])].slice(0,1e3);if(!A.length)throw Error("At least one telemetry entry ID is required");let r=await aJ(),i=await r.telemetryEntry.findMany({where:{id:{in:A},entryType:{in:[...ele(t),"SEPARATOR"]}},select:{id:!0}});if(!i.length)return 0;let n=await r.telemetryEntry.deleteMany({where:{id:{in:i.map(({id:e})=>e)}}});return this.publish([],"CLEARED"),n.count}async viewSettings(e){let t=ela(e),A=await aJ(),r=await A.telemetryViewSettings.upsert({where:{view:t},create:{id:t,view:t,columnsJson:JSON.stringify(eo3[t])},update:{}});return{view:t,columns:elw(r.columnsJson,t),timeFormat:"24"===r.timeFormat?"24":"12",activeColumnPresetId:r.activeColumnPresetId,activeSavedFilterId:r.activeSavedFilterId}}async saveViewSettings(e){let t=ela(e.view);if(e.timeFormat&&!["12","24"].includes(e.timeFormat))throw Error("Unknown time format");let A=await this.viewSettings(t),r=await aJ();return await r.telemetryViewSettings.upsert({where:{view:t},create:{id:t,view:t,columnsJson:elI(e.columns??A.columns),timeFormat:e.timeFormat??A.timeFormat,activeColumnPresetId:e.activeColumnPresetId??null,activeSavedFilterId:e.activeSavedFilterId??null},update:{columnsJson:e.columns?elI(e.columns):void 0,timeFormat:e.timeFormat??void 0,activeColumnPresetId:void 0===e.activeColumnPresetId?void 0:e.activeColumnPresetId,activeSavedFilterId:void 0===e.activeSavedFilterId?void 0:e.activeSavedFilterId}}),this.viewSettings(t)}async columnPresets(e){let t=ela(e),A=await aJ();return(await A.telemetryColumnPreset.findMany({where:{view:t},orderBy:[{isDefault:"desc"},{name:"asc"}]})).map(e=>({id:e.id,view:t,name:e.name,columns:elw(e.columnsJson,t),isDefault:e.isDefault,createdAt:e.createdAt.toISOString(),updatedAt:e.updatedAt.toISOString()}))}async saveColumnPreset(e){let t=ela(e.view),{name:A,normalizedName:r}=els(e.name),i=await aJ(),n=e.id??(0,AP.randomUUID)();return await i.$transaction(async i=>{e.isDefault&&await i.telemetryColumnPreset.updateMany({where:{view:t},data:{isDefault:!1}}),await i.telemetryColumnPreset.upsert({where:{id:n},create:{id:n,view:t,name:A,normalizedName:r,columnsJson:elI(e.columns),isDefault:!0===e.isDefault},update:{name:A,normalizedName:r,columnsJson:elI(e.columns),isDefault:e.isDefault??void 0}})}),(await this.columnPresets(t)).find(e=>e.id===n)}async deleteColumnPreset(e){let t=await aJ();return await t.telemetryViewSettings.updateMany({where:{activeColumnPresetId:e},data:{activeColumnPresetId:null}}),(await t.telemetryColumnPreset.deleteMany({where:{id:e}})).count>0}async savedFilters(e){let t=ela(e),A=await aJ();return(await A.telemetrySavedFilter.findMany({where:{view:t},orderBy:{name:"asc"}})).map(e=>({id:e.id,view:t,name:e.name,definition:JSON.parse(e.definitionJson),createdAt:e.createdAt.toISOString(),updatedAt:e.updatedAt.toISOString()}))}async saveFilter(e){let t=ela(e.view);elA({view:t,advancedFilter:e.definition});let{name:A,normalizedName:r}=els(e.name),i=await aJ(),n=e.id??(0,AP.randomUUID)();return await i.telemetrySavedFilter.upsert({where:{id:n},create:{id:n,view:t,name:A,normalizedName:r,definitionJson:eo$(e.definition)},update:{name:A,normalizedName:r,definitionJson:eo$(e.definition)}}),(await this.savedFilters(t)).find(e=>e.id===n)}async deleteFilter(e){let t=await aJ();return await t.telemetryViewSettings.updateMany({where:{activeSavedFilterId:e},data:{activeSavedFilterId:null}}),(await t.telemetrySavedFilter.deleteMany({where:{id:e}})).count>0}async exportEntries(e){elA(e.query);let t=e.selection??(e.ids?.length?{ids:e.ids}:null);if(t){let e=new Set(await this.selectionIds(t)),A=[],r=[...e];for(let e=0;e<r.length;e+=500)await this.scan({id:{in:r.slice(e,e+500)}},e=>{A.push(e)});return A.sort((e,t)=>{let A=t.clientTime.localeCompare(e.clientTime);return A||t.receivedAt.localeCompare(e.receivedAt)||t.id.localeCompare(e.id)}),A}let A=[],r=!1,i=elg(e.query);return await this.scan({entryType:{in:[...ele(e.query.view),"SEPARATOR"]}},t=>{"SEPARATOR"===t.entryType?((!i||r)&&A.push(t),r=!1):elt(t,e.query)&&(A.push(t),r=!0)}),A}}let ely={type:"object",required:["collected","items"],properties:{collected:{type:"boolean"},items:{type:"array",items:{type:"object",required:["id","receivedAt","deviceIp"],properties:{id:{type:"string",format:"uuid"},receivedAt:{type:"string",format:"date-time"},deviceIp:{type:"string"}}}}}};function elE(e,t,A){return{post:{tags:["Telemetry"],summary:A,description:"Unauthenticated ingestion. Accepts one record or an atomic `{ items: [...] }` batch of at most 500 records. The request body is capped at 2 MiB.",requestBody:{required:!0,content:{"application/json":{schema:{oneOf:[e,{type:"object",additionalProperties:!1,required:["items"],properties:{items:{type:"array",minItems:1,maxItems:500,items:e}}}]},examples:{single:{value:t},batch:{value:{items:[t]}}}}}},responses:{201:{description:"Records collected",content:{"application/json":{schema:ely}}},202:{description:"Payload valid but collection is disabled",content:{"application/json":{schema:ely}}},400:{$ref:"#/components/responses/TelemetryBadRequest"},413:{$ref:"#/components/responses/TelemetryPayloadTooLarge"},415:{$ref:"#/components/responses/TelemetryUnsupportedMediaType"},500:{$ref:"#/components/responses/InternalError"}}}}}function elQ(e){if(!e)return{};let t=JSON.parse(e);return t&&"object"==typeof t&&!Array.isArray(t)?t:{}}function elB(e){if(!e)return null;let t=new Date(e);return Number.isNaN(t.valueOf())?null:t}function elb(e){try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>"string"==typeof e):[]}catch{return[]}}elE({$ref:"#/components/schemas/ConsoleLogInput"},{message:"Checkout completed",time:"2026-07-20T18:30:00.000Z",level:"info",category:"checkout",buildId:"build-123",sessionId:"session-456",attributes:{durationMs:412,cache:{hit:!0}}},"Collect console logs"),elE({$ref:"#/components/schemas/AnalyticsEventInput"},{eventName:"checkout_completed",kind:"product",screenName:"Checkout",time:"2026-07-20T18:30:00.000Z",defaultParameters:{appVersion:"1.0"},additionalParameters:{cartItems:3},buildId:"build-123",sessionId:"session-456"},"Collect analytics events"),e.i(477685),(0,A_.join)(process.cwd(),"node_modules","@fontpkg","unifont","unifont-15.0.01.ttf"),(0,A_.join)(process.cwd(),"node_modules","@expo-google-fonts","noto-emoji","400Regular","NotoEmoji_400Regular.ttf"),new Intl.Segmenter(void 0,{granularity:"grapheme"});class elD{agentControl;fetcher;credentials;constructor(e,t=fetch,A=new hP){for(const r of(this.agentControl=e,this.fetcher=t,this.credentials=A,this.agentControl.registerCompletionHandler(i9,e=>this.completeScan(e)),[i7,ne,nt,nA,nr]))this.agentControl.registerCompletionHandler(r,e=>this.completeOperation(e))}changed(){aq.publish(a5,{changed:!0})}deleteTransferJobSoon(e){setTimeout(()=>{aJ().then(t=>t.agentJob.deleteMany({where:{id:e,visibility:"SYSTEM"}}))},3e4).unref()}subscribe(){return aq.iterate(a5)}async completeScan(e){if("SUCCEEDED"!==e.status)return;let t=function(e){let t=nn(e,"signing assets result");if(!Array.isArray(t.profiles)||!Array.isArray(t.certificates)||!Array.isArray(t.warnings))throw Error("Signing assets result arrays are invalid");return{profiles:t.profiles.map((e,t)=>{let A=nn(e,`signing profiles[${t}]`),r=na(A.profileType,`signing profiles[${t}].profileType`);if(!["DEVELOPMENT","AD_HOC","ENTERPRISE","APP_STORE"].includes(r))throw Error(`signing profiles[${t}].profileType is invalid`);let i=A.deviceCount;if("number"!=typeof i||!Number.isInteger(i)||i<0)throw Error(`signing profiles[${t}].deviceCount is invalid`);return{uuid:na(A.uuid,`signing profiles[${t}].uuid`),contentHash:na(A.contentHash,`signing profiles[${t}].contentHash`),name:na(A.name,`signing profiles[${t}].name`),profileType:r,bundleId:na(A.bundleId,`signing profiles[${t}].bundleId`),teamId:ns(A.teamId,`signing profiles[${t}].teamId`),teamName:ns(A.teamName,`signing profiles[${t}].teamName`),platforms:no(A.platforms,`signing profiles[${t}].platforms`),deviceCount:i,deviceUdids:void 0===A.deviceUdids?[]:no(A.deviceUdids,`signing profiles[${t}].deviceUdids`),certificateSha1s:no(A.certificateSha1s,`signing profiles[${t}].certificateSha1s`),createdAt:nc(A.createdAt,`signing profiles[${t}].createdAt`),expiresAt:nc(A.expiresAt,`signing profiles[${t}].expiresAt`),expired:nl(A.expired,`signing profiles[${t}].expired`),xcodeManaged:nl(A.xcodeManaged,`signing profiles[${t}].xcodeManaged`)}}),certificates:t.certificates.map((e,t)=>{let A=nn(e,`signing certificates[${t}]`);return{sha1:na(A.sha1,`signing certificates[${t}].sha1`),sha256:ns(A.sha256,`signing certificates[${t}].sha256`),name:na(A.name,`signing certificates[${t}].name`),teamId:ns(A.teamId,`signing certificates[${t}].teamId`),certificateType:ns(A.certificateType,`signing certificates[${t}].certificateType`),notBefore:nc(A.notBefore,`signing certificates[${t}].notBefore`),expiresAt:nc(A.expiresAt,`signing certificates[${t}].expiresAt`),expired:nl(A.expired,`signing certificates[${t}].expired`),hasPrivateKey:nl(A.hasPrivateKey,`signing certificates[${t}].hasPrivateKey`)}}),warnings:no(t.warnings,"signing warnings")}}(elQ(e.resultJson)),A=await aJ(),r=new Date;await A.$transaction(async A=>{for(let i of(await A.signingProfileAsset.updateMany({where:{agentId:e.agentId,missingAt:null},data:{missingAt:r}}),await A.signingCertificateAsset.updateMany({where:{agentId:e.agentId,missingAt:null},data:{missingAt:r}}),t.profiles))await A.signingProfileAsset.upsert({where:{agentId_uuid:{agentId:e.agentId,uuid:i.uuid}},create:{id:(0,AP.randomUUID)(),agentId:e.agentId,uuid:i.uuid,contentHash:i.contentHash,name:i.name,profileType:i.profileType,bundleId:i.bundleId,teamId:i.teamId,teamName:i.teamName,platformsJson:JSON.stringify(i.platforms),deviceCount:i.deviceCount,deviceUdidsJson:JSON.stringify(i.deviceUdids),certificateSha1sJson:JSON.stringify(i.certificateSha1s),createdAt:elB(i.createdAt),expiresAt:elB(i.expiresAt),expired:i.expired,xcodeManaged:i.xcodeManaged,observedAt:r},update:{contentHash:i.contentHash,name:i.name,profileType:i.profileType,bundleId:i.bundleId,teamId:i.teamId,teamName:i.teamName,platformsJson:JSON.stringify(i.platforms),deviceCount:i.deviceCount,deviceUdidsJson:JSON.stringify(i.deviceUdids),certificateSha1sJson:JSON.stringify(i.certificateSha1s),createdAt:elB(i.createdAt),expiresAt:elB(i.expiresAt),expired:i.expired,xcodeManaged:i.xcodeManaged,observedAt:r,missingAt:null}});for(let i of t.certificates)await A.signingCertificateAsset.upsert({where:{agentId_sha1:{agentId:e.agentId,sha1:i.sha1}},create:{id:(0,AP.randomUUID)(),agentId:e.agentId,sha1:i.sha1,sha256:i.sha256,name:i.name,teamId:i.teamId,certificateType:i.certificateType,notBefore:elB(i.notBefore),expiresAt:elB(i.expiresAt),expired:i.expired,hasPrivateKey:i.hasPrivateKey,observedAt:r},update:{sha256:i.sha256,name:i.name,teamId:i.teamId,certificateType:i.certificateType,notBefore:elB(i.notBefore),expiresAt:elB(i.expiresAt),expired:i.expired,hasPrivateKey:i.hasPrivateKey,observedAt:r,missingAt:null}})}),this.deleteTransferJobSoon(e.id),this.changed()}async refreshAfterMutation(e,t){await this.agentControl.createJob({agentId:e,kind:i9,payload:{},idempotencyKey:`signing:${t}:${e}:refresh`,timeoutSeconds:60,visibility:"SYSTEM"})}async finishOperation(e){let t=await aJ(),A=await t.signingOperationItem.findMany({where:{operationId:e}});if(A.some(e=>["WAITING","QUEUED","RUNNING"].includes(e.status)))return;let r=A.filter(e=>"SUCCEEDED"!==e.status);await t.signingOperation.update({where:{id:e},data:{status:r.length?"FAILED":"SUCCEEDED",error:r.map(e=>e.error).filter(Boolean).join("; ")||null,finishedAt:new Date}}),this.changed()}async completeOperation(e){let t=await aJ(),A=await t.signingOperationItem.findUnique({where:{jobId:e.id},include:{operation:!0}});if(A){if(await t.signingOperationItem.update({where:{id:A.id},data:{status:e.status,error:e.error,finishedAt:new Date}}),e.kind===i7&&"SUCCEEDED"===e.status&&"SYNC_PROFILE"===A.operation.kind){let r=elQ(e.resultJson).contentBase64;if("string"==typeof r&&r)for(let e of(await t.signingOperationItem.findMany({where:{operationId:A.operationId,status:"WAITING"}}))){let i=await this.agentControl.createJob({agentId:e.agentId,kind:ne,payload:{contentBase64:r},idempotencyKey:`signing:${A.operationId}:${e.agentId}:install`,timeoutSeconds:60,visibility:"SYSTEM"});await t.signingOperationItem.update({where:{id:e.id},data:{jobId:i.id,status:i.status}})}else await t.signingOperation.update({where:{id:A.operationId},data:{status:"FAILED",error:"Profile read returned no content"}})}e.kind===i7&&"SUCCEEDED"!==e.status&&"SYNC_PROFILE"===A.operation.kind&&await t.signingOperationItem.updateMany({where:{operationId:A.operationId,status:"WAITING"},data:{status:"FAILED",error:"Source profile could not be read",finishedAt:new Date}}),"SUCCEEDED"===e.status&&e.kind!==i7&&await this.refreshAfterMutation(e.agentId,A.operationId),await this.finishOperation(A.operationId),this.deleteTransferJobSoon(e.id)}}async refresh(e){let t=await aJ(),A=await t.agent.findMany({where:e?.length?{id:{in:[...new Set(e)]}}:void 0,orderBy:{name:"asc"}}),r=[];for(let e of A)elb(e.capabilitiesJson).includes(i9)&&r.push(await this.agentControl.createJob({agentId:e.id,kind:i9,payload:{},idempotencyKey:`signing:scan:${Date.now()}:${e.id}`,timeoutSeconds:60,visibility:"SYSTEM"}));return r}async agents(){let e=await aJ();return(await e.agent.findMany({orderBy:{name:"asc"}})).map(e=>({id:e.id,name:e.name,hostname:e.hostname,supported:elb(e.capabilitiesJson).includes(i9),lastSeenAt:e.lastSeenAt?.toISOString()??null}))}async profiles(){let e=await aJ(),t=await e.signingProfileAsset.findMany({where:{missingAt:null},include:{agent:{select:{id:!0,name:!0}}},orderBy:[{expiresAt:"asc"},{name:"asc"}]}),A=new Map;for(let e of t){let t=`${e.uuid}:${e.contentHash}`;A.set(t,[...A.get(t)??[],e])}return[...A.values()].map(e=>{let t=e[0];return{id:`${t.uuid}:${t.contentHash}`,uuid:t.uuid,contentHash:t.contentHash,name:t.name,profileType:t.profileType,bundleId:t.bundleId,teamId:t.teamId,teamName:t.teamName,platforms:elb(t.platformsJson),deviceCount:t.deviceCount,deviceUdids:elb(t.deviceUdidsJson),certificateSha1s:elb(t.certificateSha1sJson),createdAt:t.createdAt?.toISOString()??null,expiresAt:t.expiresAt?.toISOString()??null,expired:t.expired,xcodeManaged:t.xcodeManaged,installedAgents:e.map(({agent:e})=>e)}})}async profile(e){return(await this.profiles()).find(t=>t.id===e)??null}async profileDevices(e){let t=new Set,A=e.filter(e=>{let A=e.toUpperCase();return!t.has(A)&&(t.add(A),!0)}),r=A.map(e=>e.toUpperCase());if(!r.length)return[];let i=await aJ(),n=new Map((await i.iosDevice.findMany({where:{udid:{in:r}},select:{id:!0,udid:!0,displayName:!0,product:!0,osVersion:!0,status:!0}})).map(e=>[e.udid.toUpperCase(),e]));return A.map(e=>{let t=n.get(e.toUpperCase());return{udid:e,deviceId:t?.id??null,displayName:t?.displayName??null,product:t?.product??null,osVersion:t?.osVersion??null,status:t?.status??null}})}async certificates(){let e=await aJ(),t=await e.signingCertificateAsset.findMany({where:{missingAt:null},include:{agent:{select:{id:!0,name:!0}}},orderBy:[{expiresAt:"asc"},{name:"asc"}]}),A=new Map;for(let e of t)A.set(e.sha1,[...A.get(e.sha1)??[],e]);return[...A.values()].map(e=>{let t=e[0];return{id:t.sha1,sha1:t.sha1,sha256:t.sha256,name:t.name,teamId:t.teamId,certificateType:t.certificateType,notBefore:t.notBefore?.toISOString()??null,expiresAt:t.expiresAt?.toISOString()??null,expired:t.expired,hasPrivateKey:e.some(e=>e.hasPrivateKey),installedAgents:e.map(({agent:e})=>e),privateKeyAgents:e.filter(e=>e.hasPrivateKey).map(({agent:e})=>e)}})}async operations(e=50){return(await aJ()).signingOperation.findMany({include:{items:{include:{agent:{select:{id:!0,name:!0}}},orderBy:{createdAt:"asc"}}},orderBy:{createdAt:"desc"},take:Math.max(1,Math.min(e,200))})}async operation(e,t,A,r=null,i=[]){let n=await aJ(),a=(0,AP.randomUUID)();return n.signingOperation.create({data:{id:a,kind:e,assetKey:t,sourceAgentId:r,items:{create:[...new Set(A)].map(e=>({id:(0,AP.randomUUID)(),agentId:e,status:i.includes(e)?"WAITING":"QUEUED"}))}},include:{items:{include:{agent:{select:{id:!0,name:!0}}}}}})}async attachJob(e,t){let A=await aJ();await A.signingOperationItem.update({where:{id:e},data:{jobId:t.id,status:t.status}})}async uploadProfile(e,t){if(!t.length)throw Error("Select at least one agent");let A=(0,AP.createHash)("sha256").update(Buffer.from(e,"base64")).digest("hex").toUpperCase(),r=await this.operation("INSTALL_PROFILE",A,t);for(let t of r.items){let A=await this.agentControl.createJob({agentId:t.agentId,kind:ne,payload:{contentBase64:e},idempotencyKey:`signing:${r.id}:${t.agentId}:install`,timeoutSeconds:60,visibility:"SYSTEM"});await this.attachJob(t.id,A)}return this.changed(),r}async downloadProfile(e,t){let A=(0,AP.randomUUID)(),r=await this.agentControl.createJob({agentId:t,kind:i7,payload:{uuid:e},idempotencyKey:`signing:download:${A}:${e}`,timeoutSeconds:60,visibility:"SYSTEM"}),i=await aJ();try{let t=Date.now()+55e3;for(;Date.now()<t;){let t=await this.agentControl.getJob(r.id);if(!t)throw Error("Profile download job was removed");if(["FAILED","CANCELLED","TIMED_OUT"].includes(t.status))throw Error(t.error||"Could not read provisioning profile");if("SUCCEEDED"===t.status){let A=elQ(t.resultJson);if("string"!=typeof A.contentBase64)throw Error("Agent returned no provisioning profile content");return{uuid:e,filename:`${e}.mobileprovision`,contentBase64:A.contentBase64}}await new Promise(e=>setTimeout(e,250))}throw Error("Timed out reading provisioning profile")}finally{await i.agentJob.deleteMany({where:{id:r.id,visibility:"SYSTEM"}})}}async syncProfile(e,t,A){let r=[...new Set(A)].filter(e=>e!==t);if(!r.length)throw Error("Select at least one target agent");let i=await this.operation("SYNC_PROFILE",e,[t,...r],t,r),n=i.items.find(e=>e.agentId===t),a=await this.agentControl.createJob({agentId:t,kind:i7,payload:{uuid:e},idempotencyKey:`signing:${i.id}:${t}:read`,timeoutSeconds:60,visibility:"SYSTEM"});return await this.attachJob(n.id,a),this.changed(),i}async deleteProfile(e,t){if(!t.length)throw Error("Select at least one agent");let A=await this.operation("DELETE_PROFILE",e,t);for(let t of A.items){let r=await this.agentControl.createJob({agentId:t.agentId,kind:nt,payload:{uuid:e},idempotencyKey:`signing:${A.id}:${t.agentId}:delete`,timeoutSeconds:60,visibility:"SYSTEM"});await this.attachJob(t.id,r)}return this.changed(),A}async deleteExpiredProfiles(e){let t=await aJ(),A=await t.signingProfileAsset.findMany({where:{expired:!0,missingAt:null,...e?.length?{agentId:{in:e}}:{}}}),r=new Map;for(let e of A)r.set(e.uuid,[...r.get(e.uuid)??[],e.agentId]);let i=[];for(let[e,t]of r)i.push(await this.deleteProfile(e,t));return i}async importIdentity(e){if(!e.targetAgentIds.length)throw Error("Select at least one agent");let t=Buffer.from(e.p12Base64,"base64");if(!t.length||t.length>0x1400000)throw Error("The .p12 file is empty or larger than 20 MiB");let A=[...new Set(e.targetAgentIds)],r=await aJ(),i=new Map((await r.agent.findMany({where:{id:{in:A}},select:{id:!0,name:!0,capabilitiesJson:!0,lastSeenAt:!0,disconnectedAt:!0,heartbeatIntervalSeconds:!0}})).map(e=>[e.id,e])),n=Date.now(),a=A.filter(e=>{let t=i.get(e);return!t||!function(e,t=Date.now()){return null!==e.lastSeenAt&&t-e.lastSeenAt.getTime()<=sQ(e)&&null===e.disconnectedAt}(t,n)||!elb(t.capabilitiesJson).includes(nA)});if(a.length)throw Error(`Identity imports require online supported agents: ${a.map(e=>i.get(e)?.name??e).join(", ")}`);let s=(0,AP.createHash)("sha256").update(t).digest("hex").toUpperCase(),o=await this.operation("IMPORT_IDENTITY",s,A);for(let t of o.items){let A=this.agentControl.createSigningSecretTransfer(t.agentId,{p12Base64:e.p12Base64,passphrase:e.passphrase});try{let e=await this.agentControl.createJob({agentId:t.agentId,kind:nA,payload:{transferId:A,sha256:s},idempotencyKey:`signing:${o.id}:${t.agentId}:import`,timeoutSeconds:120,visibility:"SYSTEM"});await this.attachJob(t.id,e)}catch(e){throw this.agentControl.revokeSigningSecretTransfer(A),e}}return this.changed(),o}async deleteIdentity(e,t){if(!t.length)throw Error("Select at least one agent");let A=e.toUpperCase(),r=[...new Set(t)],i=await aJ(),n=new Set((await i.signingCertificateAsset.findMany({where:{sha1:A,agentId:{in:r},hasPrivateKey:!0,missingAt:null},select:{agentId:!0}})).map(e=>e.agentId)),a=r.filter(e=>n.has(e));if(!a.length)throw Error("The identity has no private key on the selected agents");let s=await this.operation("DELETE_IDENTITY",A,a);for(let e of s.items){let t=await this.agentControl.createJob({agentId:e.agentId,kind:nr,payload:{sha1:A},idempotencyKey:`signing:${s.id}:${e.agentId}:delete`,timeoutSeconds:60,visibility:"SYSTEM"});await this.attachJob(e.id,t)}return this.changed(),s}async appleClient(){return new qb(await qB(this.credentials),this.fetcher)}async portalInventory(){let e=await this.appleClient(),[t,A,r,i]=await Promise.all([e.listProfiles(),e.listCertificates(),e.listBundleIds(),e.listDevices()]);return{profiles:t,certificates:A,bundleIds:r,devices:i}}async createPortalProfile(e){let t=await (await this.appleClient()).createProfile(e);return this.changed(),t.data}async deletePortalProfile(e){return await (await this.appleClient()).deleteProfile(e),this.changed(),!0}async revokePortalCertificate(e){return await (await this.appleClient()).revokeCertificate(e),this.changed(),!0}}var elk=e.i(290474);let elS=/^[A-Za-z0-9][A-Za-z0-9.-]{0,254}$/;function elv(e,t,A){if("string"!=typeof e||!e.trim())throw Error(`${t} is required`);let r=e.trim();if(r.length>A||r.includes("\0"))throw Error(`${t} is invalid`);return r}function elR(e,t,A){return null==e||""===e?null:elv(e,t,A)}let elM={IOS_BUILD_SUCCEEDED:{key:"IOS_BUILD_SUCCEEDED",category:"BUILDS",label:"iOS build succeeded",description:"An iOS build finishes successfully.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1,defaultApnsEnabled:!0},IOS_BUILD_FAILED:{key:"IOS_BUILD_FAILED",category:"BUILDS",label:"iOS build failed",description:"An iOS build finishes with a failure.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1,defaultApnsEnabled:!0},COMMAND_RUN_SUCCEEDED:{key:"COMMAND_RUN_SUCCEEDED",category:"COMMANDS",label:"Command run succeeded",description:"A saved command finishes successfully.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1,defaultApnsEnabled:!0},COMMAND_RUN_FAILED:{key:"COMMAND_RUN_FAILED",category:"COMMANDS",label:"Command run failed",description:"A saved command finishes with a failure.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1,defaultApnsEnabled:!0},GITHUB_ACTIONS_SUCCEEDED:{key:"GITHUB_ACTIONS_SUCCEEDED",category:"GITHUB",label:"GitHub Actions succeeded",description:"A GitHub Actions workflow finishes successfully.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1,defaultApnsEnabled:!0},GITHUB_ACTIONS_FAILED:{key:"GITHUB_ACTIONS_FAILED",category:"GITHUB",label:"GitHub Actions failed",description:"A GitHub Actions workflow finishes with a failure.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1,defaultApnsEnabled:!0},RUN_NEEDS_ANSWER:{key:"RUN_NEEDS_ANSWER",category:"RUNS",label:"Plan or session needs an answer",description:"A managed plan or session asks for user input.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1,defaultApnsEnabled:!0},RUN_COMPLETED:{key:"RUN_COMPLETED",category:"RUNS",label:"Plan or session completed",description:"A managed plan or session completes successfully.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1,defaultApnsEnabled:!0},RUN_FAILED:{key:"RUN_FAILED",category:"RUNS",label:"Plan or session failed",description:"A managed plan or session fails.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1,defaultApnsEnabled:!0},RUN_CANCELLED:{key:"RUN_CANCELLED",category:"RUNS",label:"Plan or session cancelled",description:"A managed plan or session is cancelled.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!1,defaultWebPushEnabled:!1,defaultApnsEnabled:!1},RUN_RECOVERY_PAUSED:{key:"RUN_RECOVERY_PAUSED",category:"RUNS",label:"Plan or session paused after recovery",description:"A managed plan or session is paused after its agent restarts.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1,defaultApnsEnabled:!0},WORKFLOW_MESSAGE:{key:"WORKFLOW_MESSAGE",category:"WORKFLOWS",label:"Workflow message",description:"A workflow sends a generic notification.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1,defaultApnsEnabled:!0},WORKFLOW_NEEDS_ATTENTION:{key:"WORKFLOW_NEEDS_ATTENTION",category:"WORKFLOWS",label:"Workflow needs attention",description:"A workflow is waiting for data or a decision.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1,defaultApnsEnabled:!0},WORKFLOW_COMPLETED:{key:"WORKFLOW_COMPLETED",category:"WORKFLOWS",label:"Workflow completed",description:"A workflow run completes successfully.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1,defaultApnsEnabled:!0},WORKFLOW_FAILED:{key:"WORKFLOW_FAILED",category:"WORKFLOWS",label:"Workflow failed",description:"A workflow run fails.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1,defaultApnsEnabled:!0},WORKFLOW_RECOVERY_PAUSED:{key:"WORKFLOW_RECOVERY_PAUSED",category:"WORKFLOWS",label:"Workflow paused after recovery",description:"A workflow pauses while recovering durable work.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1,defaultApnsEnabled:!0}};function elT(e){return e in elM?elM[e]:null}let elU="default",elx=new Set(["BadDeviceToken","DeviceTokenNotForTopic","Unregistered"]);function elN(e,t,A){let r=e.trim();if(!r)throw Error(`${t} is required`);if(r.length>A)throw Error(`${t} is too long`);return r}function elF(e){let t,A=elN(e,"Push endpoint",4e3);try{t=new URL(A)}catch{throw Error("Push endpoint must be a valid URL")}if("https:"!==t.protocol)throw Error("Push endpoint must use HTTPS");return A}function elG(e,t){let A=new Date(e);if(!Number.isFinite(A.getTime()))throw Error(`${t} is invalid`);return A}function elO(){let e=process.env.PUBLIC_BASE_URL?.trim();if(e)try{let t=new URL(e);if("https:"===t.protocol)return t.origin}catch{}return"mailto:notifications@ai-development-environment.local"}function elJ(e){if(!e||"object"!=typeof e)return null;let t=e.statusCode;return"number"==typeof t?t:null}function el_(e){return Buffer.byteLength(JSON.stringify(e),"utf8")}function elV(e,t,A){if(4096>=el_(A(e)))return e;let r=Array.from(e),i=e=>0===e?"":`${r.slice(0,e).join("")}${t}`,n=0,a=r.length-1;for(;n<a;){let e=Math.ceil((n+a)/2);4096>=el_(A(i(e)))?n=e:a=e-1}return i(n)}class elP{credentialService;apns;vapidPreparation;constructor(e,t=new EB){this.credentialService=e,this.apns=t,this.vapidPreparation=null}publish(e){aq.publish(a7,{notificationsChanged:e})}subscribe(){return aq.iterate(a7)}async preferences(){let e=await aJ(),t=new Map((await e.notificationPreference.findMany()).map(e=>[e.typeKey,e]));return Object.values(elM).map(e=>{let A=t.get(e.key);return{...e,sidebarEnabled:A?.sidebarEnabled??e.defaultSidebarEnabled,browserEnabled:A?.browserEnabled??e.defaultBrowserEnabled,webPushEnabled:A?.webPushEnabled??e.defaultWebPushEnabled,apnsEnabled:A?.apnsEnabled??e.defaultApnsEnabled,updatedAt:A?.updatedAt??null}})}async savePreference(e){let t=elT(e.typeKey);if(!t)throw Error("Unknown notification type");let A=await aJ(),r=await A.notificationPreference.findUnique({where:{typeKey:t.key}}),i=e.apnsEnabled??r?.apnsEnabled??t.defaultApnsEnabled,n=await A.notificationPreference.upsert({where:{typeKey:t.key},create:{typeKey:t.key,sidebarEnabled:e.sidebarEnabled,browserEnabled:e.browserEnabled,webPushEnabled:e.webPushEnabled,apnsEnabled:i},update:{sidebarEnabled:e.sidebarEnabled,browserEnabled:e.browserEnabled,webPushEnabled:e.webPushEnabled,apnsEnabled:i}});return this.publish({kind:"PREFERENCES_UPDATED",notification:null,notificationId:null}),{...t,...n}}async recordInTransaction(e,t){let A=elT(t.typeKey);if(!A)throw Error("Unknown notification type");let r=await e.notificationPreference.findUnique({where:{typeKey:A.key}}),i=r?.sidebarEnabled??A.defaultSidebarEnabled,n=r?.browserEnabled??A.defaultBrowserEnabled,a=r?.webPushEnabled??A.defaultWebPushEnabled,s=r?.apnsEnabled??A.defaultApnsEnabled;if(!i&&!n&&!a&&!s)return null;let o=elN(t.dedupeKey,"Deduplication key",500);return await e.appNotification.findUnique({where:{dedupeKey:o}})?null:e.appNotification.create({data:{id:(0,AP.randomUUID)(),dedupeKey:o,typeKey:A.key,title:elN(t.title,"Notification title",240),body:elN(t.body,"Notification body",1e3),href:function(e){let t=elN(e,"Notification link",2e3);if(!t.startsWith("/")||t.startsWith("//"))throw Error("Notification links must be same-origin paths");return t}(t.href),resourceKind:elN(t.resourceKind,"Resource kind",100),resourceId:elN(t.resourceId,"Resource ID",500),worktreeId:t.worktreeId??null,highlightColor:t.highlightColor?.trim()||null,sidebarRequested:i,browserRequested:n,webPushRequested:a,apnsRequested:s}})}created(e){e&&(this.publish({kind:"CREATED",notification:e,notificationId:e.id}),e.webPushRequested&&this.deliverWebPush(e).catch(e=>{console.error("Web Push delivery failed:",e)}),e.apnsRequested&&this.deliverApns(e).catch(e=>{console.error("APNs delivery failed:",e)}))}async history(e={}){let t=Math.max(1,Math.min(e.first??100,200)),A=await aJ(),[r,i]=await Promise.all([A.appNotification.findMany({orderBy:[{createdAt:"desc"},{id:"desc"}],take:t+1,...e.after?{cursor:{id:e.after},skip:1}:void 0}),A.appNotification.count()]);return{items:r.slice(0,t),nextCursor:r.length>t?r[t-1].id:null,totalCount:i}}async sidebar(e=50){return(await aJ()).appNotification.findMany({where:{sidebarRequested:!0,sidebarDismissedAt:null},orderBy:[{createdAt:"desc"},{id:"desc"}],take:Math.max(1,Math.min(e,100))})}async dismiss(e){let t=await aJ(),A=await t.appNotification.updateMany({where:{id:e,sidebarRequested:!0,sidebarDismissedAt:null},data:{sidebarDismissedAt:new Date}});return A.count&&this.publish({kind:"DISMISSED",notification:null,notificationId:e}),A.count>0}async dismissAll(){let e=await aJ(),t=await e.appNotification.updateMany({where:{sidebarRequested:!0,sidebarDismissedAt:null},data:{sidebarDismissedAt:new Date}});return t.count&&this.publish({kind:"SIDEBAR_CLEARED",notification:null,notificationId:null}),t.count}selectionWhere(e){let t=e.excludedRanges??[],A=e.all&&0===t.length?[]:[...new Set(e.ids??[])],r=[...new Set(e.excludedIds??[])],i=e.ranges??[];if(A.length>5e3||r.length>5e3)throw Error("Notification selection is too large");if(i.length>366||t.length>366)throw Error("Notification date selection is too large");let n=t.map(e=>{let t=elG(e.start,"Excluded selection start"),A=elG(e.end,"Excluded selection end");if(t>=A)throw Error("Excluded selection range is invalid");return{createdAt:{gte:t,lt:A}}}),a={NOT:{OR:n}},s=[];if(A.length&&s.push({id:{in:A}}),e.all)s.push(n.length?a:{});else if(i.length){let e=i.map(e=>{let t=elG(e.start,"Selection start"),A=elG(e.end,"Selection end");if(t>=A)throw Error("Selection range is invalid");return{createdAt:{gte:t,lt:A}}});s.push({AND:[{OR:e},...n.length?[a]:[]]})}if(!s.length)return{id:{in:[]}};let o=1===s.length?s[0]:{OR:s};return r.length?{AND:[o,{id:{notIn:r}}]}:o}async deleteSelection(e){let t=await aJ(),A=await t.appNotification.deleteMany({where:this.selectionWhere(e)});return A.count&&this.publish({kind:"DELETED",notification:null,notificationId:null}),A.count}async deleteAll(){let e=await aJ(),t=await e.appNotification.deleteMany();return t.count&&this.publish({kind:"HISTORY_CLEARED",notification:null,notificationId:null}),t.count}async webPushState(){let e=await aJ(),[t,A]=await Promise.all([e.webPushSettings.findUnique({where:{id:elU}}),e.webPushSubscription.count()]),r=await this.credentialService.isConfigured(hm.webPushVapidPrivateKey);return{configured:!!(t?.vapidPublicKey&&r),publicKey:t?.vapidPublicKey??null,subscriptionCount:A}}async webPushSubscriptions(){return(await aJ()).webPushSubscription.findMany({orderBy:[{lastSeenAt:"desc"},{createdAt:"desc"}],select:{id:!0,endpoint:!0,expirationTime:!0,locale:!0,userAgent:!0,lastSeenAt:!0,createdAt:!0,updatedAt:!0}})}async prepareWebPush(){return this.vapidPreparation||(this.vapidPreparation=this.prepareWebPushOnce().finally(()=>{this.vapidPreparation=null})),this.vapidPreparation}async prepareWebPushOnce(){let e=await aJ(),t=await e.webPushSettings.findUnique({where:{id:elU}});if(t?.vapidPublicKey){if(!await this.credentialService.getText(hm.webPushVapidPrivateKey))throw Error("The Web Push private key is unavailable");return{publicKey:t.vapidPublicKey}}let A=elk.default.generateVAPIDKeys();return await this.credentialService.setText(hm.webPushVapidPrivateKey,A.privateKey,e=>e.webPushSettings.upsert({where:{id:elU},create:{id:elU,vapidPublicKey:A.publicKey,vapidGeneratedAt:new Date},update:{vapidPublicKey:A.publicKey,vapidGeneratedAt:new Date}}).then(()=>void 0)),{publicKey:A.publicKey}}async registerWebPush(e){let t=elF(e.endpoint),A=elN(e.p256dh,"Push p256dh key",1e3),r=elN(e.auth,"Push auth key",1e3),i=null===e.expirationTime||void 0===e.expirationTime?null:new Date(e.expirationTime);if(i&&!Number.isFinite(i.getTime()))throw Error("Push subscription expiration is invalid");return await this.prepareWebPush(),(await aJ()).webPushSubscription.upsert({where:{endpoint:t},create:{id:(0,AP.randomUUID)(),endpoint:t,p256dh:A,auth:r,expirationTime:i,locale:e.locale?.trim().slice(0,35)||null,userAgent:e.userAgent?.trim().slice(0,1e3)||null},update:{p256dh:A,auth:r,expirationTime:i,locale:e.locale?.trim().slice(0,35)||null,userAgent:e.userAgent?.trim().slice(0,1e3)||null,lastSeenAt:new Date}})}async unregisterWebPush(e){let t=elF(e),A=await aJ();return(await A.webPushSubscription.deleteMany({where:{endpoint:t}})).count>0}async deleteWebPushSubscription(e){let t=elN(e,"Push subscription",200),A=await aJ();return(await A.webPushSubscription.deleteMany({where:{id:t}})).count>0}async testWebPushSubscription(e){let t=elN(e,"Push subscription",200),A=await aJ(),[r,i]=await Promise.all([A.webPushSettings.findUnique({where:{id:elU}}),A.webPushSubscription.findUnique({where:{id:t}})]);if(!i)throw Error("Push subscription was not found");if(!r?.vapidPublicKey)throw Error("Web Push is not configured");let n=await this.credentialService.getText(hm.webPushVapidPrivateKey);if(!n)throw Error("The Web Push private key is unavailable");elk.default.setVapidDetails(elO(),r.vapidPublicKey,n);try{return await elk.default.sendNotification({endpoint:i.endpoint,expirationTime:i.expirationTime?.getTime()??null,keys:{p256dh:i.p256dh,auth:i.auth}},JSON.stringify({id:`test:${Date.now()}`,title:"Test notification",body:"Web Push is working for this browser.",href:"/notifications",icon:"/icon-192.png",badge:"/icon-192.png"}),{TTL:60,timeout:1e4}),!0}catch(e){if([404,410].includes(elJ(e)??0))throw await A.webPushSubscription.deleteMany({where:{id:t}}),Error("The browser subscription expired and was removed");throw e}}async apnsState(){let e=await aJ(),[t,A]=await Promise.all([hL(this.credentialService,hm.apnsTokenSettings,hX),e.notificationDevice.count({where:{status:"ACTIVE"}})]),r=await this.credentialService.isConfigured(hm.apnsTokenPrivateKey);return{configured:!!(t&&r),deviceCount:A}}async notificationDevices(){let e=await aJ();return(await e.notificationDevice.findMany({orderBy:[{status:"asc"},{lastRegisteredAt:"desc"}]})).map(({token:e,tokenHash:t,...A})=>({...A,tokenMasked:`${e.slice(0,8)}…${e.slice(-8)}`}))}async registerDevice(e,t){let A=function(e){let t=function(e,t){if(!e||"object"!=typeof e||Array.isArray(e))throw Error(`${t} must be an object`);return e}(e,"device"),A=new Set(["clientRegistrationId","token","tokenEncoding","topic","environment","displayName","deviceModel","osVersion","appVersion","appBuild","locale"]),r=Object.keys(t).filter(e=>!A.has(e));if(r.length)throw Error(`device has unsupported fields: ${r.join(", ")}`);let i=t.tokenEncoding??"HEX";if("HEX"!==i&&"BASE64"!==i)throw Error("tokenEncoding must be HEX or BASE64");let n=t.environment;if("SANDBOX"!==n&&"PRODUCTION"!==n)throw Error("environment must be SANDBOX or PRODUCTION");let a=elv(t.topic,"topic",255);if(!elS.test(a))throw Error("topic is invalid");return{clientRegistrationId:elv(t.clientRegistrationId,"clientRegistrationId",200),token:EM(elv(t.token,"token",500),i),topic:a,environment:n,displayName:elv(t.displayName,"displayName",120),deviceModel:elR(t.deviceModel,"deviceModel",120),osVersion:elR(t.osVersion,"osVersion",60),appVersion:elR(t.appVersion,"appVersion",60),appBuild:elR(t.appBuild,"appBuild",60),locale:elR(t.locale,"locale",35)}}(e);return this.registerDeviceValidated(A,t)}async registerDeviceValidated(e,t){let A=await aJ(),r=(0,AP.createHash)("sha256").update(e.token).digest("hex"),i=new Date,n={token:e.token,tokenHash:r,topic:e.topic,environment:e.environment,displayName:e.displayName,deviceModel:e.deviceModel,osVersion:e.osVersion,appVersion:e.appVersion,appBuild:e.appBuild,locale:e.locale,lastIpAddress:t,status:"ACTIVE",lastFailureReason:null,lastFailureAt:null,lastRegisteredAt:i},a=await A.$transaction(async t=>{let A=await t.notificationDevice.findUnique({where:{clientRegistrationId:e.clientRegistrationId}}),i=await t.notificationDevice.findUnique({where:{tokenHash:r}});return i&&i.id!==A?.id&&await t.notificationDevice.delete({where:{id:i.id}}),{device:A?await t.notificationDevice.update({where:{id:A.id},data:n}):await t.notificationDevice.create({data:{id:(0,AP.randomUUID)(),clientRegistrationId:e.clientRegistrationId,...n}}),created:!A}});return this.publish({kind:"DEVICES_CHANGED",notification:null,notificationId:null}),a}async deleteNotificationDevice(e){let t=elN(e,"Notification device",200),A=await aJ(),r=await A.notificationDevice.deleteMany({where:{id:t}});return r.count&&this.publish({kind:"DEVICES_CHANGED",notification:null,notificationId:null}),r.count>0}async renameNotificationDevice(e,t){let A=elN(e,"Notification device",200),r=elN(t,"Display name",120),i=await aJ(),n=await i.notificationDevice.update({where:{id:A},data:{displayName:r}});return this.publish({kind:"DEVICES_CHANGED",notification:null,notificationId:null}),n}async apnsAuthentication(){let e=await hL(this.credentialService,hm.apnsTokenSettings,hX),t=await this.credentialService.getText(hm.apnsTokenPrivateKey);if(!e||!t)throw Error("APNs token authentication is not configured. Add the team ID, key ID, and .p8 key under Settings.");return{kind:"TOKEN",teamId:e.value.teamId,keyId:e.value.keyId,privateKey:t}}async sendApns(e,t,A){let r,i=await aJ(),n=new Date;try{r=await this.apns.send({environment:e.environment,authentication:t,deviceToken:e.token,payload:function(e){let t=e.title,A=e.body,r=e.href,i=(i=t,n=A,a=r)=>({aps:{alert:{title:i,body:n},sound:"default","thread-id":e.typeKey,"interruption-level":"active"},notificationId:e.id,typeKey:e.typeKey,href:a});A=elV(A,"…",e=>i(t,e,r)),r=elV(r,"",e=>i(t,A,e)),t=elV(t,"…",e=>i(e,A,r));let n=i();if(el_(n)>4096)throw Error("APNs payload exceeds the 4096-byte alert limit");return n}(A),headers:{"apns-topic":e.topic,"apns-push-type":"alert","apns-priority":"10","apns-expiration":String(Math.floor(n.getTime()/1e3)+3600),...A.collapseId?{"apns-collapse-id":A.collapseId.slice(0,64)}:{}}})}catch(t){throw await i.notificationDevice.updateMany({where:{id:e.id,token:e.token},data:{lastFailureReason:t instanceof Error?t.message.slice(0,200):"SendFailed",lastFailureAt:n}}),t}if(200===r.status)return await i.notificationDevice.updateMany({where:{id:e.id,token:e.token},data:{lastDeliveredAt:n,lastFailureReason:null,lastFailureAt:null}}),!0;let a=r.reason??`HTTP ${r.status}`,s=410===r.status||elx.has(a),o=await i.notificationDevice.updateMany({where:{id:e.id,token:e.token},data:{lastFailureReason:a,lastFailureAt:n,...s?{status:"INACTIVE"}:{}}});return s&&o.count>0&&this.publish({kind:"DEVICES_CHANGED",notification:null,notificationId:null}),!1}async testNotificationDevice(e){let t=elN(e,"Notification device",200),A=await aJ(),r=await A.notificationDevice.findUnique({where:{id:t}});if(!r)throw Error("Notification device was not found");let i=await this.apnsAuthentication();if(!await this.sendApns(r,i,{id:`test:${Date.now()}`,title:"Test notification",body:"Native notifications are working on this device.",href:"/notifications",typeKey:"TEST"})){let e=await A.notificationDevice.findUnique({where:{id:t}});throw Error(e?.lastFailureReason?`APNs rejected the notification: ${e.lastFailureReason}`:"APNs rejected the notification")}return!0}async deliverApns(e){let t;if(!e.apnsRequested)return;let A=await aJ(),r=await A.notificationDevice.findMany({where:{status:"ACTIVE"}});if(r.length){try{t=await this.apnsAuthentication()}catch(e){console.error("APNs delivery skipped:",e);return}await Promise.allSettled(r.map(async A=>{try{await this.sendApns(A,t,{id:e.id,title:e.title,body:e.body,href:e.href,typeKey:e.typeKey,collapseId:e.dedupeKey})}catch(e){console.error(`APNs delivery to ${A.displayName} failed:`,e)}}))}}async deliverWebPush(e){if(!e.webPushRequested)return;let t=await aJ(),[A,r]=await Promise.all([t.webPushSettings.findUnique({where:{id:elU}}),t.webPushSubscription.findMany()]);if(!A?.vapidPublicKey||!r.length)return;let i=await this.credentialService.getText(hm.webPushVapidPrivateKey);if(!i)return;elk.default.setVapidDetails(elO(),A.vapidPublicKey,i);let n=JSON.stringify({id:e.id,title:e.title,body:e.body,href:e.href,icon:"/icon-192.png",badge:"/icon-192.png"});await Promise.allSettled(r.map(async e=>{try{await elk.default.sendNotification({endpoint:e.endpoint,expirationTime:e.expirationTime?.getTime()??null,keys:{p256dh:e.p256dh,auth:e.auth}},n,{TTL:3600,timeout:1e4})}catch(A){if([404,410].includes(elJ(A)??0))return void await t.webPushSubscription.deleteMany({where:{endpoint:e.endpoint}});console.error(`Web Push delivery to ${e.endpoint} failed:`,A)}}))}}let elL=e=>e?.toISOString()??null;function elH(e,t,A,r,i){return e?t?"RUNNING":i?"ERROR":A&&!r||A&&r&&Date.now()-r.getTime()>2e3*A+5e3?"STALE":"HEALTHY":"DISABLED"}class elj{operations=new Map;register(e){let t=this.operations.get(e.id);this.operations.set(e.id,{...e,lastStartedAt:t?.lastStartedAt??null,lastCompletedAt:t?.lastCompletedAt??null,lastSucceededAt:t?.lastSucceededAt??null,nextScheduledAt:t?.nextScheduledAt??null,durationMs:t?.durationMs??null,lastError:t?.lastError??null}),this.changed(e.id)}configure(e,t){let A=this.operations.get(e);A&&(Object.assign(A,t),A.enabled||(A.nextScheduledAt=null),this.changed(e))}schedule(e,t){let A=this.operations.get(e);A&&(A.nextScheduledAt=t,this.changed(e))}async run(e,t,A){let r=this.operations.get(e);if(!r)throw Error(`Polling operation ${e} is not registered`);let i=new Date;r.lastStartedAt=i,r.lastError=null,this.changed(e);try{let e=await t(),n=new Date;return r.lastCompletedAt=n,r.lastSucceededAt=n,r.durationMs=n.getTime()-i.getTime(),r.lastError=null,A&&(r.details={...r.details,...A(e)}),e}catch(t){let e=new Date;throw r.lastCompletedAt=e,r.durationMs=e.getTime()-i.getTime(),r.lastError=t instanceof Error?t.message:String(t),t}finally{this.changed(e)}}changed(e){aq.publish(sd,{pollingOperationChanged:e})}subscribe(){return aq.iterate(sd)}serverViews(){return[...this.operations.values()].map(e=>({...e,status:elH(e.enabled,!!(e.lastStartedAt&&(!e.lastCompletedAt||e.lastStartedAt>e.lastCompletedAt)),e.cadenceSeconds,e.lastCompletedAt,e.lastError),lastStartedAt:elL(e.lastStartedAt),lastCompletedAt:elL(e.lastCompletedAt),lastSucceededAt:elL(e.lastSucceededAt),nextScheduledAt:elL(e.nextScheduledAt)}))}async list(){let e=await aJ(),[t,A,r]=await Promise.all([e.codebaseSettings.findUnique({where:{id:"default"}}),e.agent.findMany({orderBy:{name:"asc"},select:{id:!0,name:!0,lastSeenAt:!0,disconnectedAt:!0,codebaseScanIntervalSeconds:!0,jobReconciliationIntervalSeconds:!0,gitFetchIntervalSeconds:!0,heartbeatIntervalSeconds:!0,codebases:{select:{lastCheckedAt:!0,lastFetchedAt:!0,lastFetchAttemptAt:!0,lastFetchError:!0}},diskSpaceState:{select:{enabled:!0,lastReportedAt:!0,lastError:!0,volumesJson:!0}}}}),e.agentJob.groupBy({by:["agentId","status"],where:{status:{in:["QUEUED","RUNNING"]}},_count:{_all:!0}})]),i=t?.refreshIntervalSeconds??30,n=t?.fetchIntervalSeconds??300,a=new Map;for(let e of r)a.set(e.agentId,(a.get(e.agentId)??0)+e._count._all);let s=[];for(let e of A){let t=e.heartbeatIntervalSeconds??15,A=e.jobReconciliationIntervalSeconds??15,r=e.codebaseScanIntervalSeconds??i,o=e.gitFetchIntervalSeconds??n,l=null!==e.lastSeenAt&&null===e.disconnectedAt&&Date.now()-e.lastSeenAt.getTime()<=sQ(e);s.push({id:`agent-heartbeat:${e.id}`,kind:"AGENT_HEARTBEAT",runtime:"AGENT",status:l?"HEALTHY":"STALE",enabled:!0,cadenceSeconds:t,lastStartedAt:null,lastCompletedAt:elL(e.lastSeenAt),lastSucceededAt:elL(e.lastSeenAt),nextScheduledAt:e.lastSeenAt?new Date(e.lastSeenAt.getTime()+1e3*t).toISOString():null,durationMs:null,lastError:null,details:{agentId:e.id,agentName:e.name,connection:l?"ONLINE":"OFFLINE"}});let c=e.diskSpaceState,u=c?.enabled??!0,d=c?.lastReportedAt??null,h=0;try{let e=JSON.parse(c?.volumesJson??"[]");h=Array.isArray(e)?e.length:0}catch{h=0}s.push({id:`agent-disk-space:${e.id}`,kind:"AGENT_DISK_SPACE",runtime:"AGENT",status:u?elH(!0,!1,60,d,c?.lastError??null):"DISABLED",enabled:u,cadenceSeconds:60,lastStartedAt:null,lastCompletedAt:elL(d),lastSucceededAt:c?.lastError?null:elL(d),nextScheduledAt:u&&d?new Date(d.getTime()+6e4).toISOString():null,durationMs:null,lastError:c?.lastError??null,details:{agentId:e.id,agentName:e.name,volumes:h}}),s.push({id:`agent-job-reconciliation:${e.id}`,kind:"AGENT_JOB_RECONCILIATION",runtime:"AGENT",status:l?"HEALTHY":"STALE",enabled:!0,cadenceSeconds:A,lastStartedAt:null,lastCompletedAt:elL(e.lastSeenAt),lastSucceededAt:elL(e.lastSeenAt),nextScheduledAt:e.lastSeenAt?new Date(e.lastSeenAt.getTime()+1e3*A).toISOString():null,durationMs:null,lastError:null,details:{agentId:e.id,agentName:e.name,pendingJobs:a.get(e.id)??0}});let p=e.codebases.map(e=>e.lastCheckedAt).filter(e=>null!==e).sort((e,t)=>t.getTime()-e.getTime())[0]??null,g=e.codebases.map(e=>e.lastFetchAttemptAt??e.lastFetchedAt).filter(e=>null!==e).sort((e,t)=>t.getTime()-e.getTime())[0]??null,m=e.codebases.filter(e=>e.lastFetchError).length;s.push({id:`agent-codebase-scan:${e.id}`,kind:"CODEBASE_SCAN",runtime:"AGENT",status:elH(e.codebases.length>0,!1,r,p,null),enabled:e.codebases.length>0,cadenceSeconds:r,lastStartedAt:null,lastCompletedAt:elL(p),lastSucceededAt:elL(p),nextScheduledAt:p?new Date(p.getTime()+1e3*r).toISOString():null,durationMs:null,lastError:null,details:{agentId:e.id,agentName:e.name,repositories:e.codebases.length}}),s.push({id:`agent-git-fetch:${e.id}`,kind:"GIT_FETCH",runtime:"AGENT",status:m>0?"ERROR":elH(e.codebases.length>0,!1,o,g,null),enabled:e.codebases.length>0,cadenceSeconds:o,lastStartedAt:null,lastCompletedAt:elL(g),lastSucceededAt:m>0?null:elL(g),nextScheduledAt:g?new Date(g.getTime()+1e3*o).toISOString():null,durationMs:null,lastError:m>0?`${m} repositories have fetch errors`:null,details:{agentId:e.id,agentName:e.name,repositories:e.codebases.length,fetchErrors:m}})}return[...this.serverViews(),...s]}}let elq="default",elK="https://raw.githubusercontent.com/BerriAI/litellm/refs/heads/main/model_prices_and_context_window.json",elY=new Set(["sample_spec"]);function elW(e){return"number"==typeof e&&Number.isFinite(e)?e:null}function el$(e){let t=elW(e);return null===t?null:Math.trunc(t)}function elZ(e){return"string"==typeof e&&e.trim()?e.trim():null}function elz(e){let t=e.lastIndexOf("/");return t<0?e:e.slice(t+1)}let elX={MODEL:"model",PROVIDER:"provider",INPUT_COST:"inputCostPerToken",OUTPUT_COST:"outputCostPerToken",CACHE_READ_COST:"cacheReadCostPerToken",CACHE_WRITE_COST:"cacheWriteCostPerToken",CONTEXT_WINDOW:"maxInputTokens"};function el0(e){return{model:e.model,provider:e.provider,mode:e.mode,inputCostPerToken:e.inputCostPerToken,outputCostPerToken:e.outputCostPerToken,cacheReadCostPerToken:e.cacheReadCostPerToken,cacheWriteCostPerToken:e.cacheWriteCostPerToken,maxInputTokens:e.maxInputTokens,maxOutputTokens:e.maxOutputTokens,updatedAt:e.updatedAt.toISOString()}}class el1{refreshing=null;checkedAt=0;async getCatalog(){let e=await aJ(),t=await e.modelCostSettings.upsert({where:{id:elq},create:{id:elq},update:{}}),A=t.catalogUrl??elK;return{url:A,defaultUrl:elK,customUrl:t.catalogUrl,fetchedAt:t.fetchedAt?.toISOString()??null,entryCount:t.entryCount,error:t.error,stale:this.isStale(t.fetchedAt)||t.sourceUrl!==A}}isStale(e){return!e||Date.now()-e.getTime()>=864e5}async saveSettings(e){let t=e?.trim()??"",A=t&&t!==elK?t:null;if(A){let e;try{e=new URL(A)}catch{throw Error("The model cost URL must be a valid URL")}if("https:"!==e.protocol&&"http:"!==e.protocol)throw Error("The model cost URL must be an http or https URL")}let r=await aJ();await r.modelCostSettings.upsert({where:{id:elq},create:{id:elq,catalogUrl:A},update:{catalogUrl:A}}),this.checkedAt=0;let i=await this.getCatalog();return aq.publish(sn,{catalog:i}),i}async refresh(){return this.refreshing||(this.refreshing=this.runRefresh().finally(()=>{this.refreshing=null})),this.refreshing}async runRefresh(){let e=await aJ(),t=await this.getCatalog();try{let A=await fetch(t.url,{headers:{accept:"application/json"},signal:AbortSignal.timeout(3e4)});if(!A.ok)throw Error(`The model cost catalog request failed with ${A.status}`);let r=function(e){if(!e||"object"!=typeof e||Array.isArray(e))throw Error("The model cost catalog is not a JSON object");let t=[];for(let[A,r]of Object.entries(e)){if(elY.has(A)||!r||"object"!=typeof r||Array.isArray(r))continue;let e=elW(r.input_cost_per_token),i=elW(r.output_cost_per_token);if((null!==e||null!==i)&&(t.push({model:A,provider:elZ(r.litellm_provider),mode:elZ(r.mode),inputCostPerToken:e,outputCostPerToken:i,cacheReadCostPerToken:elW(r.cache_read_input_token_cost),cacheWriteCostPerToken:elW(r.cache_creation_input_token_cost),maxInputTokens:el$(r.max_input_tokens),maxOutputTokens:el$(r.max_output_tokens)}),t.length>=2e4))break}if(!t.length)throw Error("The model cost catalog contained no priced models");return t}(await A.json());await e.$transaction(async e=>{await e.modelCostEntry.deleteMany({});for(let t=0;t<r.length;t+=500)await e.modelCostEntry.createMany({data:r.slice(t,t+500)});await e.modelCostSettings.update({where:{id:elq},data:{fetchedAt:new Date,sourceUrl:t.url,entryCount:r.length,error:null}})})}catch(A){let t=A instanceof Error?A.message:String(A);await e.modelCostSettings.update({where:{id:elq},data:{error:t.slice(0,2e3)}})}let A=await this.getCatalog();return aq.publish(sn,{catalog:A}),A}async ensureFresh(){this.refreshing&&await this.refreshing,Date.now()-this.checkedAt<3e5||((await this.getCatalog()).stale&&await this.refresh(),this.checkedAt=Date.now())}async listEntries({search:e,first:t=100,offset:A=0,sortKey:r="MODEL",direction:i="ASC"}){var n;let a,s;await this.ensureFresh();let o=await aJ(),l=e?.trim(),c=l?{OR:[{model:{contains:l}},{provider:{contains:l}}]}:{},u=Math.min(Math.max(t??100,1),500),d=Math.max(A??0,0),[h,p]=await Promise.all([o.modelCostEntry.findMany({where:c,orderBy:(n=r??"MODEL",a="DESC"===(i??"ASC")?"desc":"asc","model"===(s=elX[n]??"model")?[{model:a}]:[{[s]:{sort:a,nulls:"last"}},{model:a}]),skip:d,take:u}),o.modelCostEntry.count({where:c})]);return{items:h.map(el0),totalCount:p}}async lookup(e){let t=[...new Set(e.filter(Boolean))],A=new Map;if(!t.length)return A;let r=await aJ(),i=[...new Set(t.flatMap(e=>[e,elz(e)]))],n=new Map((await r.modelCostEntry.findMany({where:{model:{in:i}}})).map(e=>[e.model,e])),a=[];for(let e of t){let t=n.get(e)??n.get(elz(e));t?A.set(e,el0(t)):a.push(e)}if(!a.length)return A;let s=await r.modelCostEntry.findMany({where:{OR:a.map(e=>({model:{endsWith:`/${elz(e)}`}}))}});for(let e of a){let t=elz(e).toLowerCase(),r=s.find(e=>elz(e.model).toLowerCase()===t);r&&A.set(e,el0(r))}return A}estimate(e,t){if(!e)return null;let A=e.inputCostPerToken,r=e.outputCostPerToken;if(null===A&&null===r)return null;let i=e.cacheReadCostPerToken??A??0,n=e.cacheWriteCostPerToken??A??0;return t.inputTokens*(A??0)+t.outputTokens*(r??0)+t.cacheReadTokens*i+t.cacheWriteTokens*n}}async function el8(e){if(!e.length)return[];let t=await aJ(),A=await t.runAttachment.findMany({where:{id:{in:e}}});if(A.length!==e.length)throw Error("Attachment is unavailable");let r=(0,A_.resolve)(function(){if(process.env.RUN_DATA_DIRECTORY)return(0,A_.resolve)(process.env.RUN_DATA_DIRECTORY);let e=process.env.DATABASE_URL||"file:./prisma/dev.db";return(0,A_.join)((0,A_.dirname)((0,A_.resolve)(aG(e))),"run-data")}(),"attachments");await (0,hx.mkdir)(r,{recursive:!0,mode:448});let i=[];try{for(let e of A){let A=(0,AP.randomUUID)(),n=(0,A_.join)(r,A);await (0,hx.copyFile)(e.storagePath,n),await t.runAttachment.create({data:{id:A,sha256:e.sha256,filename:e.filename,contentType:e.contentType,size:e.size,storagePath:n}}),i.push({id:A,path:n})}return i.map(({id:e})=>e)}catch(e){throw await t.runAttachment.deleteMany({where:{id:{in:i.map(({id:e})=>e)}}}),await el4(i.map(({path:e})=>e)),e}}async function el4(e){await Promise.all(e.map(e=>(0,hx.rm)(e,{force:!0})))}e.i(81111),e.i(188646);let el2=["PLAN","SESSION"],el3=["CODEX","CLAUDE","OPENCODE"],el6=new Set(["COMPLETED","CANCELLED","FAILED"]),el5="ANSWER_REVISION",el9=["PAUSED","COMPLETED","CANCELLED","FAILED","SUPERSEDED"];function el7(e,t,A){let r=t.trim().toUpperCase();if(!e.includes(r))throw Error(`${A} is not supported`);return r}function ece(e,t,A){let r=e.trim();if(!r)throw Error(`${t} is required`);if(r.length>A)throw Error(`${t} is too long`);return r}function ect(e,t){let A=e?.trim()||null;if(A&&A.length>t)throw Error("Value is too long");return A}function ecA(e){return ect(e,100)?.toUpperCase()??null}function ecr(e,t){let A=t??+("SESSION"===e);if(!Number.isInteger(A)||A<0||A>32)throw Error("Worktree concurrency limit must be between 0 and 32");return A}function eci(e){if(!e)return;let t=new Date(e);return Number.isNaN(t.getTime())?void 0:t}function ecn(e){return`/${"PLAN"===e.kind?"plans":"sessions"}/${encodeURIComponent(e.id)}`}function eca(e){let t={runChanged:{id:e}};aq.publish(sl(e),t),aq.publish(se,t),aq.publish(sp,{sidebarStatusChanged:!0})}function ecs(e,t){aq.publish(aY(t),{agentEvents:{type:"RUN_COMMAND_AVAILABLE",job:null,runCommand:e}})}async function eco(e,t){return(await e.runNumberSequence.upsert({where:{kind:t},create:{kind:t,nextValue:1},update:{nextValue:{increment:1}}})).nextValue-1}async function ecl(e,t){let A=await e.runCommand.findFirst({where:{runId:t},orderBy:{sequence:"desc"},select:{sequence:!0}});return(A?.sequence??-1)+1}let ecc={run:{include:{worktree:!0,inputs:{include:{attachments:!0}},attempts:!0,sourcePlan:{include:{attempts:!0}},parentRun:{include:{attempts:!0}}}}};async function ecu(e,t){let A=await ecl(e,t.runId);return e.runCommand.create({data:{id:(0,AP.randomUUID)(),runId:t.runId,agentId:t.agentId,sequence:A,type:t.type,payloadJson:JSON.stringify(t.payload??{}),idempotencyKey:t.idempotencyKey??`${t.runId}:${A}:${t.type}`},include:ecc})}let ecd={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"}}};class ech{notifications;agentControl;diskSpace;reaperTimer;mcpPresetResolver;worktreeAdmissionPromoter;constructor(e,t,A){this.notifications=e,this.agentControl=t,this.diskSpace=A}setMcpPresetResolver(e){this.mcpPresetResolver=e}setWorktreeAdmissionPromoter(e){this.worktreeAdmissionPromoter=e}async promoteQueuedLane(e,t){let A=await aJ(),r=await A.$transaction(async A=>{let r=new Date;await A.worktreeAdmissionLane.upsert({where:{worktreeId:e},create:{worktreeId:e},update:{updatedAt:r}}),await A.worktreeRunConcurrencyLane.upsert({where:{worktreeId_kind:{worktreeId:e,kind:t}},create:{worktreeId:e,kind:t},update:{updatedAt:r}}),await A.worktreeRunLease.deleteMany({where:{worktreeId:e,purpose:{not:el5},run:{status:{in:[...el6]}}}}),await A.worktreeWorkflowLease.deleteMany({where:{worktreeId:e,workflowRun:{status:{in:["SUCCEEDED","FAILED","CANCELLED"]}}}});let i=await A.worktreeWorkflowLease.findUnique({where:{worktreeId:e}}),n=i?null:await A.workflowRun.findFirst({where:{worktreeId:e,status:"QUEUED",parentRunId:null,worktreeConcurrency:"EXCLUSIVE"},orderBy:[{queuedAt:"asc"},{id:"asc"}],select:{id:!0,queuedAt:!0}}),a=await A.worktreeRunLease.count({where:{worktreeId:e,OR:[{run:{kind:t,origin:"MANAGED",status:{in:["IN_PROGRESS","PAUSED"]}}},{purpose:el5,run:{kind:t,origin:"MANAGED"}}]}}),s=await A.agentRun.findMany({where:{worktreeId:e,kind:t,origin:"MANAGED",status:"QUEUED"},orderBy:[{createdAt:"asc"},{id:"asc"}],select:{id:!0,agentId:!0,createdAt:!0,worktreeConcurrencyLimit:!0,workflowRun:{select:{worktreeLeaseOwnerRunId:!0}}}}),o=[];for(let t of i?s.filter(e=>e.workflowRun?.worktreeLeaseOwnerRunId===i.workflowRunId):s){if(n&&function(e,t,A,r){let i=e.getTime()-A.getTime();return i<0||0===i&&t<r}(n.queuedAt,n.id,t.createdAt,t.id)||0!==t.worktreeConcurrencyLimit&&a>=t.worktreeConcurrencyLimit)break;if(!(await A.agentRun.updateMany({where:{id:t.id,status:"QUEUED"},data:{status:"IN_PROGRESS",phase:"QUEUED"}})).count)continue;await A.worktreeRunLease.create({data:{id:(0,AP.randomUUID)(),worktreeId:e,runId:t.id}}),a+=1;let r=await A.runCommand.findFirst({where:{runId:t.id,status:"QUEUED"},orderBy:{sequence:"asc"},include:ecc});r&&t.agentId&&o.push({runId:t.id,agentId:t.agentId,command:r})}return o});for(let e of r)eca(e.runId),ecs(e.command,e.agentId);return r.length}async promoteQueuedLaneSafely(e,t){try{await this.promoteQueuedLane(e,t),await this.worktreeAdmissionPromoter?.(e)}catch(A){console.error(`Could not promote ${t.toLowerCase()} queue for ${e}:`,A instanceof Error?A.message:A)}}async reconcileQueuedRuns(e){let t=await aJ(),A=await t.agentRun.findMany({where:{origin:"MANAGED",status:"QUEUED",worktreeId:{not:null},...e?{agentId:e}:{}},select:{worktreeId:!0,kind:!0},distinct:["worktreeId","kind"]}),r=0;for(let e of A)e.worktreeId&&("PLAN"===e.kind||"SESSION"===e.kind)&&(r+=await this.promoteQueuedLane(e.worktreeId,e.kind));return r}async waitForJob(e){let t=aq.iterate(aW(e)),A=Date.now()+6e4;try{for(;Date.now()<A;){let r=await this.agentControl.getJob(e);if(!r)throw Error("Agent job disappeared");if(["SUCCEEDED","FAILED","CANCELLED","TIMED_OUT"].includes(r.status))return r;await Promise.race([t.next(),new Promise(e=>setTimeout(e,A-Date.now()))])}throw await this.agentControl.cancelJob(e),Error("Agent did not respond in time")}finally{await t.return?.()}}async nativeSessionFile(e){var t;if(!this.agentControl)throw Error("Agent control is unavailable");let A=await aJ(),r=await A.agentRun.findUnique({where:{id:e},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(e=>e.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!==(t=r.agent).lastSeenAt&&Date.now()-t.lastSeenAt.getTime()<=sQ(t)&&null===t.disconnectedAt))throw Error("Agent is offline");if(!(function(e){try{let t=JSON.parse(e.capabilitiesJson);return Array.isArray(t)?t.filter(e=>"string"==typeof e):[]}catch{return[]}})(r.agent).includes(i3))throw Error("Agent must be updated to export session files");let n=await this.agentControl.createJob({agentId:r.agentId,kind:i3,payload:{provider:r.provider,nativeId:i,folder:r.worktree.folder},idempotencyKey:`runs:session:read:${e}:${i}`,timeoutSeconds:60,visibility:"SYSTEM"});try{let e=function(e){if("SUCCEEDED"!==e.status||!e.resultJson)throw Error(e.error||"Agent job failed");let t=JSON.parse(e.resultJson);if(!t||"object"!=typeof t||Array.isArray(t))throw Error("Agent job returned an invalid result");return t}(await this.waitForJob(n.id)),t="string"==typeof e.contentBase64?e.contentBase64:null;if(!t)throw Error("Agent returned an invalid session file");return{filename:"string"==typeof e.filename&&e.filename?e.filename:`${i}.jsonl`,contentBase64:t}}finally{await A.agentJob.deleteMany({where:{id:n.id,visibility:"SYSTEM"}})}}startReaper(e=6e4){this.reaperTimer||(this.reaperTimer=setInterval(()=>{this.reapOrphanedRuns().catch(e=>{console.error("Run reaper failed:",e instanceof Error?e.message:e)})},e),this.reaperTimer.unref())}stopReaper(){this.reaperTimer&&clearInterval(this.reaperTimer),this.reaperTimer=void 0}async reapOrphanedRuns(e=Date.now()){let t=await aJ(),A=await t.agentRun.findMany({where:{status:"IN_PROGRESS"},select:{id:!0,agentId:!0,worktreeId:!0,kind:!0}});if(!A.length)return 0;let r=[...new Set(A.map(e=>e.agentId).filter(e=>!!e))],i=new Set((r.length?await t.agent.findMany({where:{id:{in:r}},select:{id:!0,lastSeenAt:!0,disconnectedAt:!0,heartbeatIntervalSeconds:!0}}):[]).filter(t=>null===t.disconnectedAt&&null!==t.lastSeenAt&&e-t.lastSeenAt.getTime()<=sQ(t)+12e4).map(e=>e.id)),n=A.filter(e=>!e.agentId||!i.has(e.agentId)).map(e=>e.id);if(!n.length)return 0;let a=new Date(e);for(let e of(await t.$transaction(async e=>{await e.runAttempt.updateMany({where:{runId:{in:n},status:{notIn:el9}},data:{status:"FAILED",finishedAt:a}}),await e.agentRun.updateMany({where:{id:{in:n},status:{notIn:[...el6]}},data:{status:"FAILED",phase:"AGENT_OFFLINE",error:"Agent went offline while this run was active",finishedAt:a}}),await e.runCommand.updateMany({where:{runId:{in:n},status:{in:["QUEUED","RUNNING"]}},data:{status:"FAILED",error:"Agent went offline",finishedAt:a}}),await e.worktreeRunLease.deleteMany({where:{runId:{in:n}}})}),n))eca(e);for(let e of new Set(A.filter(e=>n.includes(e.id)&&e.worktreeId).map(e=>`${e.worktreeId}:${e.kind}`))){let t=e.lastIndexOf(":"),A=e.slice(0,t),r=e.slice(t+1);("PLAN"===r||"SESSION"===r)&&await this.promoteQueuedLaneSafely(A,r)}return n.length}async list(e){let t=el7(el2,e.kind,"Run kind"),A=Math.max(1,Math.min(e.first??100,200)),r=e.search?.trim(),i=e.archive?.toUpperCase()??"ACTIVE",n={kind:t,..."ARCHIVED"===i?{archivedAt:{not:null}}:"ALL"===i?{}:{archivedAt:null},...e.provider?{provider:e.provider.trim().toUpperCase()}:{},...e.origin?{origin:e.origin.trim().toUpperCase()}:{},...e.appId?{repository:{apps:{some:{appId:e.appId}}}}:{},...r?{OR:[{initialPrompt:{contains:r}},{repositoryName:{contains:r}},{branch:{contains:r}},{jiraIssueKey:{contains:r}},{model:{contains:r}}]}:{}},a=await aJ(),[s,o]=await Promise.all([a.agentRun.findMany({where:n,orderBy:[{createdAt:"desc"},{id:"desc"}],take:A+1,...e.after?{cursor:{id:e.after},skip:1}:{},include:{worktree:!0,sourcePlan:!0,playedSession:!0}}),a.agentRun.count({where:n})]);return{items:s.slice(0,A),nextCursor:s.length>A?s[A-1].id:null,totalCount:o}}async get(e){return(await aJ()).agentRun.findUnique({where:{id:e},include:ecd})}async events(e){let t=await aJ(),A=Math.max(1,Math.min(e.first??200,500));return t.runEvent.findMany({where:{runId:e.runId,sequence:{gt:e.afterSequence??-1},...e.includeSuperseded?{}:{supersededAt:null},...e.search?.trim()?{searchText:{contains:e.search.trim()}}:{}},orderBy:{sequence:"asc"},take:A})}async questions(e){let t=await aJ(),A=Math.max(1,Math.min(e.first??100,200)),r={runId:e.runId},[i,n]=await Promise.all([t.runQuestionBatch.findMany({where:r,orderBy:[{createdAt:"asc"},{id:"asc"}],take:A+1,...e.after?{cursor:{id:e.after},skip:1}:{},include:{questions:{orderBy:{position:"asc"},include:{options:{orderBy:{position:"asc"}}}},answerRevisions:{orderBy:{revision:"asc"}},checkpoint:!0}}),t.runQuestionBatch.count({where:r})]);return{items:i.slice(0,A),nextCursor:i.length>A?i[A-1].id:null,totalCount:n}}async usage(e){return(await aJ()).agentRun.findUnique({where:{id:e},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(e){let t=await aJ(),A=await t.agentRun.findUnique({where:{id:e},select:{sourcePlanId:!0,parentRunId:!0}});return A?t.agentRun.findMany({where:{OR:[{id:{in:[A.sourcePlanId,A.parentRunId].filter(e=>!!e)}},{sourcePlanId:e},{parentRunId:e}]},orderBy:{createdAt:"asc"}}):[]}async drafts(e={}){let t=await aJ(),A=Math.max(1,Math.min(e.first??100,200)),r=e.archive?.toUpperCase()??"ACTIVE",i=e.search?.trim(),n={..."ARCHIVED"===r?{archivedAt:{not:null}}:"ALL"===r?{}:{archivedAt:null},...i?{OR:[{prompt:{contains:i}},{jiraIssueKey:{contains:i}},{provider:{contains:i}},{model:{contains:i}}]}:{}},[a,s]=await Promise.all([t.runDraft.findMany({where:n,orderBy:[{updatedAt:"desc"},{id:"desc"}],take:A+1,...e.after?{cursor:{id:e.after},skip:1}:{},include:{worktree:!0,attachments:!0}}),t.runDraft.count({where:n})]);return{items:a.slice(0,A),nextCursor:a.length>A?a[A-1].id:null,totalCount:s}}async draft(e){return(await aJ()).runDraft.findUnique({where:{id:e},include:{worktree:!0,attachments:!0}})}async questionBatch(e){return(await aJ()).runQuestionBatch.findUnique({where:{id:e},include:{questions:{orderBy:{position:"asc"},include:{options:{orderBy:{position:"asc"}}}},answerRevisions:{orderBy:{revision:"asc"}}}})}async saveDraft(e){let t=el7(el2,e.kind,"Run kind"),A=el7(el3,e.provider,"Provider"),r=ece(e.prompt,"Prompt",2e5),i=await this.requireWorktree(e.worktreeId),n=[...new Set(e.attachmentIds??[])],a=[...new Set(e.mcpPresetIds??[])];await this.requireAttachments(n,e.id??void 0);let s=await aJ(),o=e.id??(0,AP.randomUUID)(),l=await s.$transaction(async s=>{let l=await s.runDraft.upsert({where:{id:o},create:{id:o,kind:t,worktreeId:i.id,agentId:i.codebase.agentId,jiraIssueKey:ecA(e.jiraIssueKey),provider:A,model:ece(e.model,"Model",200),effort:ect(e.effort,100),webSearchEnabled:!1!==e.webSearchEnabled,mcpPresetIdsJson:JSON.stringify(a),prompt:r},update:{kind:t,worktreeId:i.id,agentId:i.codebase.agentId,jiraIssueKey:ecA(e.jiraIssueKey),provider:A,model:ece(e.model,"Model",200),effort:ect(e.effort,100),webSearchEnabled:!1!==e.webSearchEnabled,mcpPresetIdsJson:JSON.stringify(a),prompt:r}});return n.length&&await s.runAttachment.updateMany({where:{id:{in:n},inputId:null},data:{draftId:o}}),await s.runAttachment.updateMany({where:{draftId:o,...n.length?{id:{notIn:n}}:{}},data:{draftId:null}}),l});return aq.publish(se,{runChanged:{id:l.id}}),this.draft(l.id)}async create(e){return this.createInternal(e)}async createInternal(e,t={}){let A=el7(el2,e.kind,"Run kind"),r=ecr(A,e.worktreeConcurrencyLimit),i=el7(el3,e.provider,"Provider"),n=ece(e.prompt,"Prompt",2e5),a=ece(e.model,"Model",200),s=await this.requireWorktree(e.worktreeId,i);await this.diskSpace?.assertWorktreeCanStart(s.id);let o=this.mcpPresetResolver?await this.mcpPresetResolver(A,[...new Set(e.mcpPresetIds??[])]):{presetIds:[],toolNames:[]},l=[...new Set(e.attachmentIds??[])];await this.requireAttachments(l,e.draftId??void 0);let c=await aJ(),u=await c.$transaction(async c=>{let u=await eco(c,A),d=(0,AP.randomUUID)(),h=(0,AP.randomUUID)(),p=e.sourcePlanId?await c.agentRun.findUnique({where:{id:e.sourcePlanId}}):null;if(e.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 g=e.parentRunId?await c.agentRun.findUnique({where:{id:e.parentRunId}}):null,m=t.transferLeaseFromRunId?await c.worktreeRunLease.findUnique({where:{runId:t.transferLeaseFromRunId}}):null,f=m?.worktreeId===s.id;t.transferLeaseFromRunId&&await c.agentRun.update({where:{id:t.transferLeaseFromRunId},data:{status:"CANCELLED",phase:"SUPERSEDED_BY_FOLLOW_UP",finishedAt:new Date}});let I=await c.agentRun.create({data:{id:d,kind:A,displayNumber:u,status:f?"IN_PROGRESS":"QUEUED",phase:f?"QUEUED":"WAITING_FOR_WORKTREE",provider:i,worktreeId:s.id,repositoryId:s.codebase.repository.id,agentId:s.codebase.agentId,jiraIssueKey:ecA(e.jiraIssueKey),repositoryName:s.codebase.repository.name,branch:s.branch,model:a,effort:ect(e.effort,100),webSearchEnabled:!1!==e.webSearchEnabled,mcpPresetIdsJson:JSON.stringify(o.presetIds),mcpToolNamesJson:JSON.stringify(o.toolNames),worktreeConcurrencyLimit:r,workflowRunId:e.workflowRunId??null,initialPrompt:n,sourcePlanId:p?.id,sourcePlanNumber:p?.displayNumber,parentRunId:g?.id,parentRunNumber:g?.displayNumber,followUpMode:ect(e.followUpMode,50),inputs:{create:{id:h,sequence:0,kind:"INITIAL",prompt:n}}}});if(p&&await c.agentRun.update({where:{id:p.id},data:{playedAt:new Date,playedSessionNumber:u}}),f&&await c.worktreeRunLease.update({where:{runId:t.transferLeaseFromRunId},data:{runId:d,purpose:"RUN",reservationKey:null,acquiredAt:new Date}}),l.length&&(await c.runAttachment.updateMany({where:{id:{in:l},inputId:null},data:{inputId:h,draftId:null}})).count!==l.length)throw Error("One or more attachments are no longer available");return e.draftId&&await c.runDraft.deleteMany({where:{id:e.draftId}}),{run:I,command:await ecu(c,{runId:d,agentId:s.codebase.agentId,type:e.sourcePlanId?"PLAY_PLAN":"START",payload:{contextMode:e.contextMode??null,sourcePlanId:e.sourcePlanId??null,parentRunId:e.parentRunId??null,followUpMode:e.followUpMode??null}}),transfersSlot:f}});return eca(u.run.id),t.transferLeaseFromRunId&&eca(t.transferLeaseFromRunId),u.transfersSlot&&ecs(u.command,u.run.agentId),await this.promoteQueuedLaneSafely(s.id,A),this.get(u.run.id)}async playPlan(e,t=[],A,r){let i=await this.get(e);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:
|
|
13222
13222
|
|
|
13223
13223
|
${i.finalOutput??""}`,sourcePlanId:i.id,parentRunId:i.id,followUpMode:"PLAN_PLAY",contextMode:"NATIVE",attachmentIds:[],mcpPresetIds:t,worktreeConcurrencyLimit:A,workflowRunId:r})}async followUp(e,t){let A=await this.get(e);if(!A||!A.worktreeId)throw Error("Source run not found");let r=ece(t.followUpMode??"","Follow-up mode",50).toUpperCase();if(!["RESUME","FRESH","RESEND"].includes(r))throw Error("Follow-up mode is not supported");let i="SESSION"===A.kind&&"PAUSED"===A.status?A.id:void 0,n="RESEND"!==r||t.attachmentIds?.length?t.attachmentIds:await el8(A.inputs[0]?.attachments.map(({id:e})=>e)??[]),a="RESEND"!==r||t.prompt.trim()?t.prompt:A.initialPrompt;return"RESUME"===r&&t.provider.toUpperCase()!==A.provider&&(a=["Continue from this normalized visible context. Hidden provider state is not available across providers.","SUMMARY"==(t.contextMode?.toUpperCase()==="SUMMARY"?"SUMMARY":"NORMALIZED")?A.finalOutput||"No final summary is available.":[...A.inputs.map(e=>`[${e.kind}]
|
|
13224
13224
|
${e.prompt}`),...(await this.events({runId:A.id,first:500})).map(e=>`[${e.type}] ${e.summary}${e.detailMarkdown?`
|