@ai-development-environment/server 0.0.56 → 0.0.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/standalone/.next/BUILD_ID +1 -1
- package/standalone/.next/app-path-routes-manifest.json +2 -0
- package/standalone/.next/build-manifest.json +3 -3
- package/standalone/.next/prerender-manifest.json +3 -3
- package/standalone/.next/routes-manifest.json +18 -0
- package/standalone/.next/server/app/[locale]/actions/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/actions/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/actions-cache/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/actions-cache/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/agents/[id]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/agents/[id]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/agents/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/agents/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/analytics-events/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/analytics-events/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/build-data/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/build-data/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/builds/[buildId]/coverage/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/builds/[buildId]/coverage/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/builds/[buildId]/output/route/app-paths-manifest.json +3 -0
- package/standalone/.next/server/app/[locale]/builds/[buildId]/output/route/build-manifest.json +9 -0
- package/standalone/.next/server/app/[locale]/builds/[buildId]/output/route/server-reference-manifest.json +4 -0
- package/standalone/.next/server/app/[locale]/builds/[buildId]/output/route.js +12 -0
- package/standalone/.next/server/app/[locale]/builds/[buildId]/output/route.js.map +5 -0
- package/standalone/.next/server/app/[locale]/builds/[buildId]/output/route.js.nft.json +1 -0
- package/standalone/.next/server/app/[locale]/builds/[buildId]/output/route_client-reference-manifest.js +3 -0
- package/standalone/.next/server/app/[locale]/builds/[buildId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/builds/[buildId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/builds/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/builds/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/codebases/[codebaseId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/codebases/[codebaseId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/codebases/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/codebases/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/codebases/repositories/[repositoryId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/codebases/repositories/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/commands/[commandId]/edit/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/commands/[commandId]/edit/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/commands/new/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/commands/new/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/commands/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/commands/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/commands/runs/[runId]/output/route/app-paths-manifest.json +3 -0
- package/standalone/.next/server/app/[locale]/commands/runs/[runId]/output/route/build-manifest.json +9 -0
- package/standalone/.next/server/app/[locale]/commands/runs/[runId]/output/route/server-reference-manifest.json +4 -0
- package/standalone/.next/server/app/[locale]/commands/runs/[runId]/output/route.js +12 -0
- package/standalone/.next/server/app/[locale]/commands/runs/[runId]/output/route.js.map +5 -0
- package/standalone/.next/server/app/[locale]/commands/runs/[runId]/output/route.js.nft.json +1 -0
- package/standalone/.next/server/app/[locale]/commands/runs/[runId]/output/route_client-reference-manifest.js +3 -0
- package/standalone/.next/server/app/[locale]/commands/runs/[runId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/commands/runs/[runId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/comments/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/comments/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/console-logs/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/console-logs/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/costs/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/costs/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/credentials/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/credentials/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/devices/[id]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/devices/[id]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/devices/enroll/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/devices/enroll/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/devices/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/devices/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/drafts/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/drafts/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/jira/cache/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/jira/cache/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/jira/cache/tickets/[issueKey]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/jira/cache/tickets/[issueKey]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/jira/tickets/[issueKey]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/jira/tickets/[issueKey]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/jira/tickets/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/jira/tickets/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/jobs/[jobId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/jobs/[jobId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/notifications/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/notifications/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/plans/[runId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/plans/[runId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/plans/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/plans/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/polling/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/polling/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/provisioning-profiles/[profileId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/provisioning-profiles/[profileId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/provisioning-profiles/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/provisioning-profiles/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/pull-requests/[owner]/[repository]/[number]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/pull-requests/[owner]/[repository]/[number]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/pull-requests/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/pull-requests/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/push-notifications/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/push-notifications/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/runs/new/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/runs/new/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/sessions/[runId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/sessions/[runId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/sessions/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/sessions/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/settings/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/settings/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/skills/[skillId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/skills/[skillId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/skills/groups/[groupId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/skills/groups/[groupId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/skills/groups/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/skills/groups/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/skills/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/skills/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/skills/sync/[runId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/skills/sync/[runId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/tools/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/tools/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/unified-events/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/unified-events/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/usage/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/usage/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/workflows/[workflowId]/edit/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/workflows/[workflowId]/edit/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/workflows/[workflowId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/workflows/[workflowId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/workflows/new/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/workflows/new/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/workflows/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/workflows/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/workflows/runs/[runId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/workflows/runs/[runId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/worktrees/[worktreeId]/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/worktrees/[worktreeId]/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/[locale]/worktrees/page.js.nft.json +1 -1
- package/standalone/.next/server/app/[locale]/worktrees/page_client-reference-manifest.js +1 -1
- package/standalone/.next/server/app/_global-error.html +1 -1
- package/standalone/.next/server/app/_global-error.rsc +1 -1
- package/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/standalone/.next/server/app/_global-error.segments/_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.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-paths-manifest.json +2 -0
- package/standalone/.next/server/chunks/1oeh_server_app_[locale]_commands_runs_[runId]_output_route_actions_1cukkg_.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__0690e_i._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__0g-b1k_._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__0jwejc1._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__19aveol._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1d8yo1w._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1gjcicg._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1kb6o8v._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1m-eb8h._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1tl064i._.js +3 -0
- package/standalone/.next/server/chunks/[root-of-the-server]__1y28_j-._.js +3 -0
- package/standalone/.next/server/chunks/_04easfx._.js +1 -1
- package/standalone/.next/server/chunks/_060s_2_._.js +1 -1
- package/standalone/.next/server/chunks/_0mno1rd._.js +1 -1
- package/standalone/.next/server/chunks/_17vom8o._.js +1 -1
- package/standalone/.next/server/chunks/_1_97_xc._.js +1 -1
- package/standalone/.next/server/chunks/_1hmzed-._.js +1 -1
- package/standalone/.next/server/chunks/_1ua7367._.js +1 -1
- package/standalone/.next/server/chunks/_next-internal_server_app_[locale]_builds_[buildId]_output_route_actions_1taut05.js +3 -0
- package/standalone/.next/server/chunks/ssr/{[root-of-the-server]__12ujp5k._.js → [root-of-the-server]__0lmk9bz._.js} +2 -2
- package/standalone/.next/server/chunks/ssr/{[root-of-the-server]__163pha9._.js → [root-of-the-server]__1102h2k._.js} +10 -2
- package/standalone/.next/server/chunks/ssr/{[root-of-the-server]__04vu2d2._.js → [root-of-the-server]__1246vo_._.js} +2 -2
- package/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1zdw3xq._.js → [root-of-the-server]__13y5te1._.js} +2 -2
- package/standalone/.next/server/chunks/ssr/{[root-of-the-server]__14x7em1._.js → [root-of-the-server]__15g2tdw._.js} +2 -2
- package/standalone/.next/server/chunks/ssr/{[root-of-the-server]__1urzzjr._.js → [root-of-the-server]__1c5ldng._.js} +2 -2
- package/standalone/.next/server/chunks/ssr/{[root-of-the-server]__0szkx1z._.js → [root-of-the-server]__1etlhw0._.js} +2 -2
- package/standalone/.next/server/chunks/ssr/_02c2d4f._.js +24 -0
- package/standalone/.next/server/chunks/ssr/{_0mpp4zy._.js → _046yruk._.js} +3 -3
- package/standalone/.next/server/chunks/ssr/{_17qauas._.js → _04o65jz._.js} +2 -2
- package/standalone/.next/server/chunks/ssr/{_1i8x-4q._.js → _0bobqfl._.js} +3 -3
- package/standalone/.next/server/chunks/ssr/{_0u5fbj1._.js → _0lkknxk._.js} +2 -2
- package/standalone/.next/server/chunks/ssr/_0ywojby._.js +24 -0
- package/standalone/.next/server/chunks/ssr/{_0ts0l7b._.js → _0zjisu4._.js} +2 -2
- package/standalone/.next/server/chunks/ssr/{_182yko5._.js → _18cp9pu._.js} +2 -2
- package/standalone/.next/server/chunks/ssr/_1eryu4w._.js +19 -0
- package/standalone/.next/server/chunks/ssr/{_0cc1vi6._.js → _1l052-e._.js} +2 -2
- package/standalone/.next/server/chunks/ssr/_1lic210._.js +3 -0
- package/standalone/.next/server/chunks/ssr/_1zgu74l._.js +10 -10
- package/standalone/.next/server/chunks/ssr/messages_de_json_[json]_cjs_1uig1ud._.js +1 -1
- package/standalone/.next/server/chunks/ssr/messages_en_json_[json]_cjs_206072-._.js +1 -1
- package/standalone/.next/server/chunks/ssr/messages_es_json_[json]_cjs_082yukd._.js +1 -1
- package/standalone/.next/server/chunks/ssr/messages_fr_json_[json]_cjs_0j6-w0i._.js +1 -1
- package/standalone/.next/server/chunks/ssr/node_modules_0k28hjd._.js +3 -0
- package/standalone/.next/server/chunks/ssr/src_components_builds_build-detail-page_tsx_0q1lvps._.js +5 -5
- package/standalone/.next/server/functions-config-manifest.json +2 -0
- 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/.next/static/chunks/{0n2u5wjjmaseb.js → 04zmk6cyju031.js} +1 -1
- package/standalone/.next/static/chunks/{09q-nz-e_tbiy.js → 0f6x_7136ws5e.js} +1 -1
- package/standalone/.next/static/chunks/{3tfj2uhflnkvu.js → 0fm8vlctux_d4.js} +7 -7
- package/standalone/.next/static/chunks/{27a270srtknzi.js → 0k-tj18pj2jw3.js} +3 -3
- package/standalone/.next/static/chunks/{3r2wqa5gcorck.js → 0ntu55tvqo74a.js} +7 -7
- package/standalone/.next/static/chunks/0qo8_-dnk-8es.js +22 -0
- package/standalone/.next/static/chunks/{1kwddx0lygohb.js → 12pz55savz83-.js} +1 -1
- package/standalone/.next/static/chunks/18-qgh9p9g9gn.js +17 -0
- package/standalone/.next/static/chunks/{0tm88xq1je0ik.js → 1ehd9ff-t9y4q.js} +1 -1
- package/standalone/.next/static/chunks/{3ege33ljteolq.js → 1gsma655t74si.js} +1 -1
- package/standalone/.next/static/chunks/{1mmo8lspdk0y2.js → 1kas2cg1m9t70.js} +8 -8
- package/standalone/.next/static/chunks/{446mel_yhca9u.js → 2a7-21p5ltjf0.js} +2 -2
- package/standalone/.next/static/chunks/{3_tux_4hkdpja.js → 2buxoh6cj1vav.js} +1 -1
- package/standalone/.next/static/chunks/{1-v397t7o9cqz.js → 2grj-b5r57kpq.js} +2 -2
- package/standalone/.next/static/chunks/2kc9nohdlg9t0.js +1 -0
- package/standalone/.next/static/chunks/{3o8__1my6dk1_.js → 2yqx6j1xnzns8.js} +1 -1
- package/standalone/.next/static/chunks/{2ne14u5xzix6t.js → 3atzn4uq1z4g-.js} +1 -1
- package/standalone/.next/static/chunks/3cuivj8-h9d2a.js +1 -0
- package/standalone/.next/static/chunks/{1y-end2fvx0wt.js → 3kz00cbmpyo2-.js} +1 -1
- package/standalone/.next/static/chunks/{26dvl4pn5yw16.js → 3nxz8k1j8fgad.js} +7 -7
- package/standalone/.next/static/chunks/3sr3c0rfmkyg2.js +23 -0
- package/standalone/.next/static/chunks/3xx3qtf7ebz58.css +1 -0
- package/standalone/.next/server/chunks/ssr/_03tz2ed._.js +0 -3
- package/standalone/.next/server/chunks/ssr/_0_7xzsn._.js +0 -19
- package/standalone/.next/server/chunks/ssr/_0brpuee._.js +0 -24
- package/standalone/.next/server/chunks/ssr/_0jklnn-._.js +0 -11
- package/standalone/.next/server/chunks/ssr/_0qppm0k._.js +0 -24
- package/standalone/.next/server/chunks/ssr/node_modules_@radix-ui_react-menu_dist_index_mjs_0r8d9ly._.js +0 -3
- package/standalone/.next/server/chunks/ssr/src_096v3r6._.js +0 -3
- package/standalone/.next/static/chunks/0oyi9lj201nul.css +0 -1
- package/standalone/.next/static/chunks/168hnxx43r6g0.js +0 -27
- package/standalone/.next/static/chunks/193zouh7q03-q.js +0 -22
- package/standalone/.next/static/chunks/19fy68juspikd.js +0 -23
- package/standalone/.next/static/chunks/1c42xu-oct3-l.js +0 -1
- package/standalone/.next/static/chunks/33u7b61cg10r7.js +0 -17
- /package/standalone/.next/static/{PEh7pBYRizgKlQhA6uiAl → pMygSj2GOth47wwuxgqsB}/_buildManifest.js +0 -0
- /package/standalone/.next/static/{PEh7pBYRizgKlQhA6uiAl → pMygSj2GOth47wwuxgqsB}/_clientMiddlewareManifest.js +0 -0
- /package/standalone/.next/static/{PEh7pBYRizgKlQhA6uiAl → pMygSj2GOth47wwuxgqsB}/_ssgManifest.js +0 -0
|
@@ -465,6 +465,6 @@ ${n}`,d++}else ef(e,r,a)?p=e.slice(32===e.charCodeAt(r+6)?r+7:r+6,i)||void 0:g(e
|
|
|
465
465
|
`,r),a=-1;if(-1!==t&&-1!==i?a=t<i?t:i:-1!==t?a=t===e.length-1?-1:t:-1!==i&&(a=i),-1===a)break;g(e,r,a),r=a+1,13===e.charCodeAt(r-1)&&10===e.charCodeAt(r)&&r++}return e.slice(r)}function g(e,r,i){if(r===i)return void(d>0&&t({id:c,event:p,data:u}),c=void 0,u="",d=0,p=void 0);let n=e.charCodeAt(r);if(em(e,r,n)){let t=32===e.charCodeAt(r+5)?r+6:r+5,a=e.slice(t,i);u=0===d?a:`${u}
|
|
466
466
|
${a}`,d++;return}if(ef(e,r,n)){p=e.slice(32===e.charCodeAt(r+6)?r+7:r+6,i)||void 0;return}if(105===n&&100===e.charCodeAt(r+1)&&58===e.charCodeAt(r+2)){let t=e.slice(32===e.charCodeAt(r+3)?r+4:r+3,i);c=t.includes("\0")?void 0:t;return}if(58===n){a&&a(e.slice(r,i).slice(32===e.charCodeAt(r+1)?2:1));return}let s=e.slice(r,i),o=s.indexOf(":");if(-1===o)return void y(s,"",s);let l=s.slice(0,o),h=32===s.charCodeAt(o+1)?2:1;y(l,s.slice(o+h),s)}function y(e,t,a){switch(e){case"event":p=t||void 0;break;case"data":u=0===d?t:`${u}
|
|
467
467
|
${t}`,d++;break;case"id":c=t.includes("\0")?void 0:t;break;case"retry":/^\d+$/.test(t)?i(parseInt(t,10)):r(new ed(`Invalid \`retry\` value: "${t}"`,{type:"invalid-retry",value:t,line:a}));break;default:r(new ed(`Unknown field "${e.length>20?`${e.slice(0,20)}\u2026`:e}"`,{type:"unknown-field",field:e,value:t,line:a}))}}return{feed:function(e){if(h)throw Error("Cannot feed parser: it was terminated after exceeding the configured max buffer size. Call `reset()` to resume parsing.");if(l&&(l=!1,239===e.charCodeAt(0)&&187===e.charCodeAt(1)&&191===e.charCodeAt(2)&&(e=e.slice(3))),0===s.length){let t=f(e);""!==t&&(s.push(t),o=t.length),m();return}if(-1===e.indexOf(`
|
|
468
|
-
`)&&-1===e.indexOf("\r")){s.push(e),o+=e.length,m();return}s.push(e);let t=s.join("");s.length=0,o=0;let r=f(t);""!==r&&(s.push(r),o=r.length),m()},reset:function(e={}){if(e.consume&&s.length>0){let e=s.join("");g(e,0,e.length)}l=!0,c=void 0,u="",d=0,p=void 0,s.length=0,o=0,h=!1}}}function em(e,t,r){return 100===r&&97===e.charCodeAt(t+1)&&116===e.charCodeAt(t+2)&&97===e.charCodeAt(t+3)&&58===e.charCodeAt(t+4)}function ef(e,t,r){return 101===r&&118===e.charCodeAt(t+1)&&101===e.charCodeAt(t+2)&&110===e.charCodeAt(t+3)&&116===e.charCodeAt(t+4)&&58===e.charCodeAt(t+5)}class eg extends Event{constructor(e,t){var r,i;super(e),this.code=null!=(r=null==t?void 0:t.code)?r:void 0,this.message=null!=(i=null==t?void 0:t.message)?i:void 0}[Symbol.for("nodejs.util.inspect.custom")](e,t,r){return r(ey(this),t)}[Symbol.for("Deno.customInspect")](e,t){return e(ey(this),t)}}function ey(e){return{type:e.type,message:e.message,code:e.code,defaultPrevented:e.defaultPrevented,cancelable:e.cancelable,timeStamp:e.timeStamp}}var ev,ew,eb,ek,ex,eS,eI,eE,eA,e_,eC,eT,eR,eD,eN,eO,eP,e$,eU,eB,ej,eL,eM,eq=e=>{throw TypeError(e)},eF=(e,t,r)=>t.has(e)||eq("Cannot "+r),eV=(e,t,r)=>(eF(e,t,"read from private field"),r?r.call(e):t.get(e)),eK=(e,t,r)=>t.has(e)?eq("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,r),eH=(e,t,r,i)=>(eF(e,t,"write to private field"),t.set(e,r),r),eG=(e,t,r)=>(eF(e,t,"access private method"),r);class eW extends EventTarget{constructor(e,t){var r,i;super(),eK(this,eD),this.CONNECTING=0,this.OPEN=1,this.CLOSED=2,eK(this,ev),eK(this,ew),eK(this,eb),eK(this,ek),eK(this,ex),eK(this,eS),eK(this,eI),eK(this,eE,null),eK(this,eA),eK(this,e_),eK(this,eC,null),eK(this,eT,null),eK(this,eR,null),eK(this,eO,async e=>{var t;eV(this,e_).reset();let{body:r,redirected:i,status:a,headers:n}=e;if(204===a){eG(this,eD,ej).call(this,"Server sent HTTP 204, not reconnecting",204),this.close();return}if(i?eH(this,eb,new URL(e.url)):eH(this,eb,void 0),200!==a)return void eG(this,eD,ej).call(this,`Non-200 status code (${a})`,a);if(!(n.get("content-type")||"").startsWith("text/event-stream"))return void eG(this,eD,ej).call(this,'Invalid content type, expected "text/event-stream"',a);if(eV(this,ev)===this.CLOSED)return;eH(this,ev,this.OPEN);let s=new Event("open");if(null==(t=eV(this,eR))||t.call(this,s),this.dispatchEvent(s),"object"!=typeof r||!r||!("getReader"in r)){eG(this,eD,ej).call(this,"Invalid response body, expected a web ReadableStream",a),this.close();return}let o=new TextDecoder,l=r.getReader(),c=!0;do{let{done:e,value:t}=await l.read();t&&eV(this,e_).feed(o.decode(t,{stream:!e})),e&&(c=!1,eV(this,e_).reset(),eG(this,eD,eL).call(this))}while(c)}),eK(this,eP,e=>{eH(this,eA,void 0),"AbortError"!==e.name&&"aborted"!==e.type&&eG(this,eD,eL).call(this,function e(t){return t instanceof Error?"errors"in t&&Array.isArray(t.errors)?t.errors.map(e).join(", "):"cause"in t&&t.cause instanceof Error?`${t}: ${e(t.cause)}`:t.message:`${t}`}(e))}),eK(this,eU,e=>{"string"==typeof e.id&&eH(this,eE,e.id);let t=new MessageEvent(e.event||"message",{data:e.data,origin:eV(this,eb)?eV(this,eb).origin:eV(this,ew).origin,lastEventId:e.id||""});eV(this,eT)&&(!e.event||"message"===e.event)&&eV(this,eT).call(this,t),this.dispatchEvent(t)}),eK(this,eB,e=>{eH(this,eS,e)}),eK(this,eM,()=>{eH(this,eI,void 0),eV(this,ev)===this.CONNECTING&&eG(this,eD,eN).call(this)});try{if(e instanceof URL)eH(this,ew,e);else if("string"==typeof e)eH(this,ew,new URL(e,function(){let e="document"in globalThis?globalThis.document:void 0;return e&&"object"==typeof e&&"baseURI"in e&&"string"==typeof e.baseURI?e.baseURI:void 0}()));else throw Error("Invalid URL")}catch{throw function(e){let t=globalThis.DOMException;return"function"==typeof t?new t(e,"SyntaxError"):SyntaxError(e)}("An invalid or illegal string was specified")}eH(this,e_,eh({onEvent:eV(this,eU),onRetry:eV(this,eB)})),eH(this,ev,this.CONNECTING),eH(this,eS,3e3),eH(this,ex,null!=(r=null==t?void 0:t.fetch)?r:globalThis.fetch),eH(this,ek,null!=(i=null==t?void 0:t.withCredentials)&&i),eG(this,eD,eN).call(this)}get readyState(){return eV(this,ev)}get url(){return eV(this,ew).href}get withCredentials(){return eV(this,ek)}get onerror(){return eV(this,eC)}set onerror(e){eH(this,eC,e)}get onmessage(){return eV(this,eT)}set onmessage(e){eH(this,eT,e)}get onopen(){return eV(this,eR)}set onopen(e){eH(this,eR,e)}addEventListener(e,t,r){super.addEventListener(e,t,r)}removeEventListener(e,t,r){super.removeEventListener(e,t,r)}close(){eV(this,eI)&&clearTimeout(eV(this,eI)),eV(this,ev)!==this.CLOSED&&(eV(this,eA)&&eV(this,eA).abort(),eH(this,ev,this.CLOSED),eH(this,eA,void 0))}}function eJ(e){return e?e instanceof Headers?Object.fromEntries(e.entries()):Array.isArray(e)?Object.fromEntries(e):{...e}:{}}function ez(e=fetch,t){return t?async(r,i)=>e(r,{...t,...i,headers:i?.headers?{...eJ(t.headers),...eJ(i.headers)}:t.headers}):e}async function eZ(e){return(await t).getRandomValues(new Uint8Array(e))}async function eY(e){let t="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~",r=256-256%t.length,i="";for(;i.length<e;)for(let a of(await eZ(e-i.length)))a<r&&(i+=t[a%t.length]);return i}async function eQ(e){return await eY(e)}async function eX(e){return btoa(String.fromCharCode(...new Uint8Array(await (await t).subtle.digest("SHA-256",new TextEncoder().encode(e))))).replace(/\//g,"_").replace(/\+/g,"-").replace(/=/g,"")}async function e0(e){if(e||(e=43),e<43||e>128)throw`Expected a length between 43 and 128. Received ${e}.`;let t=await eQ(e),r=await eX(t);return{code_verifier:t,code_challenge:r}}ev=new WeakMap,ew=new WeakMap,eb=new WeakMap,ek=new WeakMap,ex=new WeakMap,eS=new WeakMap,eI=new WeakMap,eE=new WeakMap,eA=new WeakMap,e_=new WeakMap,eC=new WeakMap,eT=new WeakMap,eR=new WeakMap,eD=new WeakSet,eN=function(){eH(this,ev,this.CONNECTING),eH(this,eA,new AbortController),eV(this,ex)(eV(this,ew),eG(this,eD,e$).call(this)).then(eV(this,eO)).catch(eV(this,eP))},eO=new WeakMap,eP=new WeakMap,e$=function(){var e;let t={mode:"cors",redirect:"follow",headers:{Accept:"text/event-stream",...eV(this,eE)?{"Last-Event-ID":eV(this,eE)}:void 0},cache:"no-store",signal:null==(e=eV(this,eA))?void 0:e.signal};return"window"in globalThis&&(t.credentials=this.withCredentials?"include":"same-origin"),t},eU=new WeakMap,eB=new WeakMap,ej=function(e,t){var r;eV(this,ev)!==this.CLOSED&&eH(this,ev,this.CLOSED);let i=new eg("error",{code:t,message:e});null==(r=eV(this,eC))||r.call(this,i),this.dispatchEvent(i)},eL=function(e,t){var r;if(eV(this,ev)===this.CLOSED)return;eH(this,ev,this.CONNECTING);let i=new eg("error",{code:t,message:e});null==(r=eV(this,eC))||r.call(this,i),this.dispatchEvent(i),eH(this,eI,setTimeout(eV(this,eM),eV(this,eS)))},eM=new WeakMap,eW.CONNECTING=0,eW.OPEN=1,eW.CLOSED=2,t=globalThis.crypto?.webcrypto??globalThis.crypto??e.A(70729).then(e=>e.webcrypto);var e1=e.i(907855),e2=e.i(733137),e3=e.i(127438),e4=e.i(334512),e4=e4;let e6=e1.url().superRefine((e,t)=>{if(!URL.canParse(e))return t.addIssue({code:e2.ZodIssueCode.custom,message:"URL must be parseable",fatal:!0}),e3.NEVER}).refine(e=>{let t=new URL(e);return"javascript:"!==t.protocol&&"data:"!==t.protocol&&"vbscript:"!==t.protocol},{message:"URL cannot use javascript:, data:, or vbscript: scheme"}),e8=e1.looseObject({resource:e1.string().url(),authorization_servers:e1.array(e6).optional(),jwks_uri:e1.string().url().optional(),scopes_supported:e1.array(e1.string()).optional(),bearer_methods_supported:e1.array(e1.string()).optional(),resource_signing_alg_values_supported:e1.array(e1.string()).optional(),resource_name:e1.string().optional(),resource_documentation:e1.string().optional(),resource_policy_uri:e1.string().url().optional(),resource_tos_uri:e1.string().url().optional(),tls_client_certificate_bound_access_tokens:e1.boolean().optional(),authorization_details_types_supported:e1.array(e1.string()).optional(),dpop_signing_alg_values_supported:e1.array(e1.string()).optional(),dpop_bound_access_tokens_required:e1.boolean().optional()}),e5=e1.looseObject({issuer:e1.string(),authorization_endpoint:e6,token_endpoint:e6,registration_endpoint:e6.optional(),scopes_supported:e1.array(e1.string()).optional(),response_types_supported:e1.array(e1.string()),response_modes_supported:e1.array(e1.string()).optional(),grant_types_supported:e1.array(e1.string()).optional(),token_endpoint_auth_methods_supported:e1.array(e1.string()).optional(),token_endpoint_auth_signing_alg_values_supported:e1.array(e1.string()).optional(),service_documentation:e6.optional(),revocation_endpoint:e6.optional(),revocation_endpoint_auth_methods_supported:e1.array(e1.string()).optional(),revocation_endpoint_auth_signing_alg_values_supported:e1.array(e1.string()).optional(),introspection_endpoint:e1.string().optional(),introspection_endpoint_auth_methods_supported:e1.array(e1.string()).optional(),introspection_endpoint_auth_signing_alg_values_supported:e1.array(e1.string()).optional(),code_challenge_methods_supported:e1.array(e1.string()).optional(),client_id_metadata_document_supported:e1.boolean().optional()}),e9=e1.looseObject({issuer:e1.string(),authorization_endpoint:e6,token_endpoint:e6,userinfo_endpoint:e6.optional(),jwks_uri:e6,registration_endpoint:e6.optional(),scopes_supported:e1.array(e1.string()).optional(),response_types_supported:e1.array(e1.string()),response_modes_supported:e1.array(e1.string()).optional(),grant_types_supported:e1.array(e1.string()).optional(),acr_values_supported:e1.array(e1.string()).optional(),subject_types_supported:e1.array(e1.string()),id_token_signing_alg_values_supported:e1.array(e1.string()),id_token_encryption_alg_values_supported:e1.array(e1.string()).optional(),id_token_encryption_enc_values_supported:e1.array(e1.string()).optional(),userinfo_signing_alg_values_supported:e1.array(e1.string()).optional(),userinfo_encryption_alg_values_supported:e1.array(e1.string()).optional(),userinfo_encryption_enc_values_supported:e1.array(e1.string()).optional(),request_object_signing_alg_values_supported:e1.array(e1.string()).optional(),request_object_encryption_alg_values_supported:e1.array(e1.string()).optional(),request_object_encryption_enc_values_supported:e1.array(e1.string()).optional(),token_endpoint_auth_methods_supported:e1.array(e1.string()).optional(),token_endpoint_auth_signing_alg_values_supported:e1.array(e1.string()).optional(),display_values_supported:e1.array(e1.string()).optional(),claim_types_supported:e1.array(e1.string()).optional(),claims_supported:e1.array(e1.string()).optional(),service_documentation:e1.string().optional(),claims_locales_supported:e1.array(e1.string()).optional(),ui_locales_supported:e1.array(e1.string()).optional(),claims_parameter_supported:e1.boolean().optional(),request_parameter_supported:e1.boolean().optional(),request_uri_parameter_supported:e1.boolean().optional(),require_request_uri_registration:e1.boolean().optional(),op_policy_uri:e6.optional(),op_tos_uri:e6.optional(),client_id_metadata_document_supported:e1.boolean().optional()}),e7=e1.object({...e9.shape,...e5.pick({code_challenge_methods_supported:!0}).shape}),te=e1.object({access_token:e1.string(),id_token:e1.string().optional(),token_type:e1.string(),expires_in:e4.number().optional(),scope:e1.string().optional(),refresh_token:e1.string().optional()}).strip(),tt=e1.object({error:e1.string(),error_description:e1.string().optional(),error_uri:e1.string().optional()}),tr=e6.optional().or(e1.literal("").transform(()=>void 0)),ti=e1.object({redirect_uris:e1.array(e6),token_endpoint_auth_method:e1.string().optional(),grant_types:e1.array(e1.string()).optional(),response_types:e1.array(e1.string()).optional(),client_name:e1.string().optional(),client_uri:e6.optional(),logo_uri:tr,scope:e1.string().optional(),contacts:e1.array(e1.string()).optional(),tos_uri:tr,policy_uri:e1.string().optional(),jwks_uri:e6.optional(),jwks:e1.any().optional(),software_id:e1.string().optional(),software_version:e1.string().optional(),software_statement:e1.string().optional()}).strip(),ta=e1.object({client_id:e1.string(),client_secret:e1.string().optional(),client_id_issued_at:e1.number().optional(),client_secret_expires_at:e1.number().optional()}).strip(),tn=ti.merge(ta);e1.object({error:e1.string(),error_description:e1.string().optional()}).strip(),e1.object({token:e1.string(),token_type_hint:e1.string().optional()}).strip();class ts extends Error{constructor(e,t){super(e),this.errorUri=t,this.name=this.constructor.name}toResponseObject(){let e={error:this.errorCode,error_description:this.message};return this.errorUri&&(e.error_uri=this.errorUri),e}get errorCode(){return this.constructor.errorCode}}class to extends ts{}to.errorCode="invalid_request";class tl extends ts{}tl.errorCode="invalid_client";class tc extends ts{}tc.errorCode="invalid_grant";class tu extends ts{}tu.errorCode="unauthorized_client";class td extends ts{}td.errorCode="unsupported_grant_type";class tp extends ts{}tp.errorCode="invalid_scope";class th extends ts{}th.errorCode="access_denied";class tm extends ts{}tm.errorCode="server_error";class tf extends ts{}tf.errorCode="temporarily_unavailable";class tg extends ts{}tg.errorCode="unsupported_response_type";class ty extends ts{}ty.errorCode="unsupported_token_type";class tv extends ts{}tv.errorCode="invalid_token";class tw extends ts{}tw.errorCode="method_not_allowed";class tb extends ts{}tb.errorCode="too_many_requests";class tk extends ts{}tk.errorCode="invalid_client_metadata";class tx extends ts{}tx.errorCode="insufficient_scope";class tS extends ts{}tS.errorCode="invalid_target";let tI={[to.errorCode]:to,[tl.errorCode]:tl,[tc.errorCode]:tc,[tu.errorCode]:tu,[td.errorCode]:td,[tp.errorCode]:tp,[th.errorCode]:th,[tm.errorCode]:tm,[tf.errorCode]:tf,[tg.errorCode]:tg,[ty.errorCode]:ty,[tv.errorCode]:tv,[tw.errorCode]:tw,[tb.errorCode]:tb,[tk.errorCode]:tk,[tx.errorCode]:tx,[tS.errorCode]:tS};class tE extends Error{constructor(e){super(e??"Unauthorized")}}let tA="code",t_="S256";async function tC(e){let t=e instanceof Response?e.status:void 0,r=e instanceof Response?await e.text():e;try{let{error:e,error_description:t,error_uri:i}=tt.parse(JSON.parse(r));return new(tI[e]||tm)(t||"",i)}catch(e){return new tm(`${t?`HTTP ${t}: `:""}Invalid OAuth error response: ${e}. Raw body: ${r}`)}}async function tT(e,t){try{return await tR(e,t)}catch(r){if(r instanceof tl||r instanceof tu)return await e.invalidateCredentials?.("all"),await tR(e,t);if(r instanceof tc)return await e.invalidateCredentials?.("tokens"),await tR(e,t);throw r}}async function tR(e,{serverUrl:t,authorizationCode:r,scope:i,resourceMetadataUrl:a,fetchFn:n}){let s,o,l,c=await e.discoveryState?.(),u=a;if(!u&&c?.resourceMetadataUrl&&(u=new URL(c.resourceMetadataUrl)),c?.authorizationServerUrl){if(o=c.authorizationServerUrl,s=c.resourceMetadata,l=c.authorizationServerMetadata??await tj(o,{fetchFn:n}),!s)try{s=await tP(t,{resourceMetadataUrl:u},n)}catch{}(l!==c.authorizationServerMetadata||s!==c.resourceMetadata)&&await e.saveDiscoveryState?.({authorizationServerUrl:String(o),resourceMetadataUrl:u?.toString(),resourceMetadata:s,authorizationServerMetadata:l})}else{let r=await tL(t,{resourceMetadataUrl:u,fetchFn:n});o=r.authorizationServerUrl,l=r.authorizationServerMetadata,s=r.resourceMetadata,await e.saveDiscoveryState?.({authorizationServerUrl:String(o),resourceMetadataUrl:u?.toString(),resourceMetadata:s,authorizationServerMetadata:l})}let d=await tD(t,e,s),p=i||s?.scopes_supported?.join(" ")||e.clientMetadata.scope,h=await Promise.resolve(e.clientInformation());if(!h){if(void 0!==r)throw Error("Existing OAuth client information is required when exchanging an authorization code");let t=l?.client_id_metadata_document_supported===!0,i=e.clientMetadataUrl;if(i&&!function(e){if(!e)return!1;try{let t=new URL(e);return"https:"===t.protocol&&"/"!==t.pathname}catch{return!1}}(i))throw new tk(`clientMetadataUrl must be a valid HTTPS URL with a non-root pathname, got: ${i}`);if(t&&i)h={client_id:i},await e.saveClientInformation?.(h);else{if(!e.saveClientInformation)throw Error("OAuth client information must be saveable for dynamic registration");let t=await tK(o,{metadata:l,clientMetadata:e.clientMetadata,scope:p,fetchFn:n});await e.saveClientInformation(t),h=t}}let m=!e.redirectUrl;if(void 0!==r||m){let t=await tV(e,o,{metadata:l,resource:d,authorizationCode:r,fetchFn:n});return await e.saveTokens(t),"AUTHORIZED"}let f=await e.tokens();if(f?.refresh_token)try{let t=await tF(o,{metadata:l,clientInformation:h,refreshToken:f.refresh_token,resource:d,addClientAuthentication:e.addClientAuthentication,fetchFn:n});return await e.saveTokens(t),"AUTHORIZED"}catch(e){if(!(e instanceof ts)||e instanceof tm);else throw e}let g=e.state?await e.state():void 0,{authorizationUrl:y,codeVerifier:v}=await tM(o,{metadata:l,clientInformation:h,state:g,redirectUrl:e.redirectUrl,scope:p,resource:d});return await e.saveCodeVerifier(v),await e.redirectToAuthorization(y),"REDIRECT"}async function tD(e,t,r){let i,a=((i=new URL("string"==typeof e?e:e.href)).hash="",i);if(t.validateResourceURL)return await t.validateResourceURL(a,r?.resource);if(r){if(!function({requestedResource:e,configuredResource:t}){let r=new URL("string"==typeof e?e:e.href),i=new URL("string"==typeof t?t:t.href);if(r.origin!==i.origin||r.pathname.length<i.pathname.length)return!1;let a=r.pathname.endsWith("/")?r.pathname:r.pathname+"/",n=i.pathname.endsWith("/")?i.pathname:i.pathname+"/";return a.startsWith(n)}({requestedResource:a,configuredResource:r.resource}))throw Error(`Protected resource ${r.resource} does not match expected ${a} (or origin)`);return new URL(r.resource)}}function tN(e){let t,r=e.headers.get("WWW-Authenticate");if(!r)return{};let[i,a]=r.split(" ");if("bearer"!==i.toLowerCase()||!a)return{};let n=tO(e,"resource_metadata")||void 0;if(n)try{t=new URL(n)}catch{}return{resourceMetadataUrl:t,scope:tO(e,"scope")||void 0,error:tO(e,"error")||void 0}}function tO(e,t){let r=e.headers.get("WWW-Authenticate");if(!r)return null;let i=RegExp(`${t}=(?:"([^"]+)"|([^\\s,]+))`),a=r.match(i);return a?a[1]||a[2]:null}async function tP(e,t,r=fetch){let i=await tB(e,"oauth-protected-resource",r,{protocolVersion:t?.protocolVersion,metadataUrl:t?.resourceMetadataUrl});if(!i||404===i.status)throw await i?.body?.cancel(),Error("Resource server does not implement OAuth 2.0 Protected Resource Metadata.");if(!i.ok)throw await i.body?.cancel(),Error(`HTTP ${i.status} trying to load well-known OAuth protected resource metadata.`);return e8.parse(await i.json())}async function t$(e,t,r=fetch){try{return await r(e,{headers:t})}catch(i){if(i instanceof TypeError)if(t)return t$(e,void 0,r);else return;throw i}}async function tU(e,t,r=fetch){return await t$(e,{"MCP-Protocol-Version":t},r)}async function tB(e,t,r,i){var a,n;let s,o=new URL(e),l=i?.protocolVersion??v.LATEST_PROTOCOL_VERSION;i?.metadataUrl?s=new URL(i.metadataUrl):(s=new URL(function(e,t="",r={}){return t.endsWith("/")&&(t=t.slice(0,-1)),r.prependPathname?`${t}/.well-known/${e}`:`/.well-known/${e}${t}`}(t,o.pathname),i?.metadataServerUrl??o)).search=o.search;let c=await tU(s,l,r);if(!i?.metadataUrl&&(a=c,n=o.pathname,!a||a.status>=400&&a.status<500&&"/"!==n)){let e=new URL(`/.well-known/${t}`,o);c=await tU(e,l,r)}return c}async function tj(e,{fetchFn:t=fetch,protocolVersion:r=v.LATEST_PROTOCOL_VERSION}={}){let i={"MCP-Protocol-Version":r,Accept:"application/json"};for(let{url:r,type:a}of function(e){let t="string"==typeof e?new URL(e):e,r="/"!==t.pathname,i=[];if(!r)return i.push({url:new URL("/.well-known/oauth-authorization-server",t.origin),type:"oauth"}),i.push({url:new URL("/.well-known/openid-configuration",t.origin),type:"oidc"}),i;let a=t.pathname;return a.endsWith("/")&&(a=a.slice(0,-1)),i.push({url:new URL(`/.well-known/oauth-authorization-server${a}`,t.origin),type:"oauth"}),i.push({url:new URL(`/.well-known/openid-configuration${a}`,t.origin),type:"oidc"}),i.push({url:new URL(`${a}/.well-known/openid-configuration`,t.origin),type:"oidc"}),i}(e)){let e=await t$(r,i,t);if(e){if(!e.ok){if(await e.body?.cancel(),e.status>=400&&e.status<500)continue;throw Error(`HTTP ${e.status} trying to load ${"oauth"===a?"OAuth":"OpenID provider"} metadata from ${r}`)}if("oauth"===a)return e5.parse(await e.json());return e7.parse(await e.json())}}}async function tL(e,t){let r,i;try{(r=await tP(e,{resourceMetadataUrl:t?.resourceMetadataUrl},t?.fetchFn)).authorization_servers&&r.authorization_servers.length>0&&(i=r.authorization_servers[0])}catch{}i||(i=String(new URL("/",e)));let a=await tj(i,{fetchFn:t?.fetchFn});return{authorizationServerUrl:i,authorizationServerMetadata:a,resourceMetadata:r}}async function tM(e,{metadata:t,clientInformation:r,redirectUrl:i,scope:a,state:n,resource:s}){let o;if(t){if(o=new URL(t.authorization_endpoint),!t.response_types_supported.includes(tA))throw Error(`Incompatible auth server: does not support response type ${tA}`);if(t.code_challenge_methods_supported&&!t.code_challenge_methods_supported.includes(t_))throw Error(`Incompatible auth server: does not support code challenge method ${t_}`)}else o=new URL("/authorize",e);let l=await e0(),c=l.code_verifier,u=l.code_challenge;return o.searchParams.set("response_type",tA),o.searchParams.set("client_id",r.client_id),o.searchParams.set("code_challenge",u),o.searchParams.set("code_challenge_method",t_),o.searchParams.set("redirect_uri",String(i)),n&&o.searchParams.set("state",n),a&&o.searchParams.set("scope",a),a?.includes("offline_access")&&o.searchParams.append("prompt","consent"),s&&o.searchParams.set("resource",s.href),{authorizationUrl:o,codeVerifier:c}}async function tq(e,{metadata:t,tokenRequestParams:r,clientInformation:i,addClientAuthentication:a,resource:n,fetchFn:s}){var o,l;let c,u=t?.token_endpoint?new URL(t.token_endpoint):new URL("/token",e),d=new Headers({"Content-Type":"application/x-www-form-urlencoded",Accept:"application/json"});n&&r.set("resource",n.href),a?await a(d,r,u,t):i&&function(e,t,r,i){let{client_id:a,client_secret:n}=t;switch(e){case"client_secret_basic":var s,o,l,c,u=a,d=n,p=r;if(!d)throw Error("client_secret_basic authentication requires a client_secret");let h=btoa(`${u}:${d}`);p.set("Authorization",`Basic ${h}`);return;case"client_secret_post":s=a,o=n,(l=i).set("client_id",s),o&&l.set("client_secret",o);return;case"none":c=a,i.set("client_id",c);return;default:throw Error(`Unsupported client authentication method: ${e}`)}}((o=i,l=t?.token_endpoint_auth_methods_supported??[],c=void 0!==o.client_secret,"token_endpoint_auth_method"in o&&o.token_endpoint_auth_method&&["client_secret_basic","client_secret_post","none"].includes(o.token_endpoint_auth_method)&&(0===l.length||l.includes(o.token_endpoint_auth_method))?o.token_endpoint_auth_method:0===l.length?c?"client_secret_basic":"none":c&&l.includes("client_secret_basic")?"client_secret_basic":c&&l.includes("client_secret_post")?"client_secret_post":l.includes("none")?"none":c?"client_secret_post":"none"),i,d,r);let p=await (s??fetch)(u,{method:"POST",headers:d,body:r});if(!p.ok)throw await tC(p);return te.parse(await p.json())}async function tF(e,{metadata:t,clientInformation:r,refreshToken:i,resource:a,addClientAuthentication:n,fetchFn:s}){let o=new URLSearchParams({grant_type:"refresh_token",refresh_token:i});return{refresh_token:i,...await tq(e,{metadata:t,tokenRequestParams:o,clientInformation:r,addClientAuthentication:n,resource:a,fetchFn:s})}}async function tV(e,t,{metadata:r,resource:i,authorizationCode:a,fetchFn:n}={}){let s,o=e.clientMetadata.scope;if(e.prepareTokenRequest&&(s=await e.prepareTokenRequest(o)),!s){if(!a)throw Error("Either provider.prepareTokenRequest() or authorizationCode is required");if(!e.redirectUrl)throw Error("redirectUrl is required for authorization_code flow");s=new URLSearchParams({grant_type:"authorization_code",code:a,code_verifier:await e.codeVerifier(),redirect_uri:String(e.redirectUrl)})}return tq(t,{metadata:r,tokenRequestParams:s,clientInformation:await e.clientInformation()??void 0,addClientAuthentication:e.addClientAuthentication,resource:i,fetchFn:n})}async function tK(e,{metadata:t,clientMetadata:r,scope:i,fetchFn:a}){let n;if(t){if(!t.registration_endpoint)throw Error("Incompatible auth server: does not support dynamic client registration");n=new URL(t.registration_endpoint)}else n=new URL("/register",e);let s=await (a??fetch)(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...r,...void 0!==i?{scope:i}:{}})});if(!s.ok)throw await tC(s);return tn.parse(await s.json())}class tH extends Error{constructor(e,t,r){super(`SSE error: ${t}`),this.code=e,this.event=r}}class tG{constructor(e,t){this._url=e,this._resourceMetadataUrl=void 0,this._scope=void 0,this._eventSourceInit=t?.eventSourceInit,this._requestInit=t?.requestInit,this._authProvider=t?.authProvider,this._fetch=t?.fetch,this._fetchWithInit=ez(t?.fetch,t?.requestInit)}async _authThenStart(){let e;if(!this._authProvider)throw new tE("No auth provider");try{e=await tT(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})}catch(e){throw this.onerror?.(e),e}if("AUTHORIZED"!==e)throw new tE;return await this._startOrAuth()}async _commonHeaders(){let e={};if(this._authProvider){let t=await this._authProvider.tokens();t&&(e.Authorization=`Bearer ${t.access_token}`)}this._protocolVersion&&(e["mcp-protocol-version"]=this._protocolVersion);let t=eJ(this._requestInit?.headers);return new Headers({...e,...t})}_startOrAuth(){let e=this?._eventSourceInit?.fetch??this._fetch??fetch;return new Promise((t,r)=>{this._eventSource=new eW(this._url.href,{...this._eventSourceInit,fetch:async(t,r)=>{let i=await this._commonHeaders();i.set("Accept","text/event-stream");let a=await e(t,{...r,headers:i});if(401===a.status&&a.headers.has("www-authenticate")){let{resourceMetadataUrl:e,scope:t}=tN(a);this._resourceMetadataUrl=e,this._scope=t}return a}}),this._abortController=new AbortController,this._eventSource.onerror=e=>{if(401===e.code&&this._authProvider)return void this._authThenStart().then(t,r);let i=new tH(e.code,e.message,e);r(i),this.onerror?.(i)},this._eventSource.onopen=()=>{},this._eventSource.addEventListener("endpoint",e=>{try{if(this._endpoint=new URL(e.data,this._url),this._endpoint.origin!==this._url.origin)throw Error(`Endpoint origin does not match connection origin: ${this._endpoint.origin}`)}catch(e){r(e),this.onerror?.(e),this.close();return}t()}),this._eventSource.onmessage=e=>{let t;try{t=v.JSONRPCMessageSchema.parse(JSON.parse(e.data))}catch(e){this.onerror?.(e);return}this.onmessage?.(t)}})}async start(){if(this._eventSource)throw Error("SSEClientTransport already started! If using Client class, note that connect() calls start() automatically.");return await this._startOrAuth()}async finishAuth(e){if(!this._authProvider)throw new tE("No auth provider");if("AUTHORIZED"!==await tT(this._authProvider,{serverUrl:this._url,authorizationCode:e,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit}))throw new tE("Failed to authorize")}async close(){this._abortController?.abort(),this._eventSource?.close(),this.onclose?.()}async send(e){if(!this._endpoint)throw Error("Not connected");try{let t=await this._commonHeaders();t.set("content-type","application/json");let r={...this._requestInit,method:"POST",headers:t,body:JSON.stringify(e),signal:this._abortController?.signal},i=await (this._fetch??fetch)(this._endpoint,r);if(!i.ok){let t=await i.text().catch(()=>null);if(401===i.status&&this._authProvider){let{resourceMetadataUrl:t,scope:r}=tN(i);this._resourceMetadataUrl=t,this._scope=r;let a=await tT(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit});if("AUTHORIZED"!==a)throw new tE;return this.send(e)}throw Error(`Error POSTing to endpoint (HTTP ${i.status}): ${t}`)}await i.body?.cancel()}catch(e){throw this.onerror?.(e),e}}setProtocolVersion(e){this._protocolVersion=e}}class tW extends TransformStream{constructor({onError:e,onRetry:t,onComment:r,maxBufferSize:i}={}){let a;super({start(n){a=eh({onEvent:e=>{n.enqueue(e)},onError(t){"function"==typeof e&&e(t),("terminate"===e||"max-buffer-size-exceeded"===t.type)&&n.error(t)},onRetry:t,onComment:r,maxBufferSize:i})},transform(e){a.feed(e)}})}}let tJ={initialReconnectionDelay:1e3,maxReconnectionDelay:3e4,reconnectionDelayGrowFactor:1.5,maxRetries:2};class tz extends Error{constructor(e,t){super(`Streamable HTTP error: ${t}`),this.code=e}}class tZ{constructor(e,t){this._hasCompletedAuthFlow=!1,this._url=e,this._resourceMetadataUrl=void 0,this._scope=void 0,this._requestInit=t?.requestInit,this._authProvider=t?.authProvider,this._fetch=t?.fetch,this._fetchWithInit=ez(t?.fetch,t?.requestInit),this._sessionId=t?.sessionId,this._reconnectionOptions=t?.reconnectionOptions??tJ}async _authThenStart(){let e;if(!this._authProvider)throw new tE("No auth provider");try{e=await tT(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})}catch(e){throw this.onerror?.(e),e}if("AUTHORIZED"!==e)throw new tE;return await this._startOrAuthSse({resumptionToken:void 0})}async _commonHeaders(){let e={};if(this._authProvider){let t=await this._authProvider.tokens();t&&(e.Authorization=`Bearer ${t.access_token}`)}this._sessionId&&(e["mcp-session-id"]=this._sessionId),this._protocolVersion&&(e["mcp-protocol-version"]=this._protocolVersion);let t=eJ(this._requestInit?.headers);return new Headers({...e,...t})}async _startOrAuthSse(e){let{resumptionToken:t}=e;try{let r=await this._commonHeaders();r.set("Accept","text/event-stream"),t&&r.set("last-event-id",t);let i=await (this._fetch??fetch)(this._url,{method:"GET",headers:r,signal:this._abortController?.signal});if(!i.ok){if(await i.body?.cancel(),401===i.status&&this._authProvider)return await this._authThenStart();if(405===i.status)return;throw new tz(i.status,`Failed to open SSE stream: ${i.statusText}`)}this._handleSseStream(i.body,e,!0)}catch(e){throw this.onerror?.(e),e}}_getNextReconnectionDelay(e){return void 0!==this._serverRetryMs?this._serverRetryMs:Math.min(this._reconnectionOptions.initialReconnectionDelay*Math.pow(this._reconnectionOptions.reconnectionDelayGrowFactor,e),this._reconnectionOptions.maxReconnectionDelay)}_scheduleReconnection(e,t=0){let r=this._reconnectionOptions.maxRetries;if(t>=r)return void this.onerror?.(Error(`Maximum reconnection attempts (${r}) exceeded.`));let i=this._getNextReconnectionDelay(t);this._reconnectionTimeout=setTimeout(()=>{this._startOrAuthSse(e).catch(r=>{this.onerror?.(Error(`Failed to reconnect SSE stream: ${r instanceof Error?r.message:String(r)}`)),this._scheduleReconnection(e,t+1)})},i)}_handleSseStream(e,t,r){let i;if(!e)return;let{onresumptiontoken:a,replayMessageId:n}=t,s=!1,o=!1;(async()=>{try{let t=e.pipeThrough(new TextDecoderStream).pipeThrough(new tW({onRetry:e=>{this._serverRetryMs=e}})).getReader();for(;;){let{value:e,done:r}=await t.read();if(r)break;if((e.id&&(i=e.id,s=!0,a?.(e.id)),e.data)&&(!e.event||"message"===e.event))try{let t=v.JSONRPCMessageSchema.parse(JSON.parse(e.data));(0,v.isJSONRPCResultResponse)(t)&&(o=!0,void 0!==n&&(t.id=n)),this.onmessage?.(t)}catch(e){this.onerror?.(e)}}(r||s)&&!o&&this._abortController&&!this._abortController.signal.aborted&&this._scheduleReconnection({resumptionToken:i,onresumptiontoken:a,replayMessageId:n},0)}catch(e){if(this.onerror?.(Error(`SSE stream disconnected: ${e}`)),(r||s)&&!o&&this._abortController&&!this._abortController.signal.aborted)try{this._scheduleReconnection({resumptionToken:i,onresumptiontoken:a,replayMessageId:n},0)}catch(e){this.onerror?.(Error(`Failed to reconnect: ${e instanceof Error?e.message:String(e)}`))}}})()}async start(){if(this._abortController)throw Error("StreamableHTTPClientTransport already started! If using Client class, note that connect() calls start() automatically.");this._abortController=new AbortController}async finishAuth(e){if(!this._authProvider)throw new tE("No auth provider");if("AUTHORIZED"!==await tT(this._authProvider,{serverUrl:this._url,authorizationCode:e,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit}))throw new tE("Failed to authorize")}async close(){this._reconnectionTimeout&&(clearTimeout(this._reconnectionTimeout),this._reconnectionTimeout=void 0),this._abortController?.abort(),this.onclose?.()}async send(e,t){try{let{resumptionToken:r,onresumptiontoken:i}=t||{};if(r)return void this._startOrAuthSse({resumptionToken:r,replayMessageId:(0,v.isJSONRPCRequest)(e)?e.id:void 0}).catch(e=>this.onerror?.(e));let a=await this._commonHeaders();a.set("content-type","application/json"),a.set("accept","application/json, text/event-stream");let n={...this._requestInit,method:"POST",headers:a,body:JSON.stringify(e),signal:this._abortController?.signal},s=await (this._fetch??fetch)(this._url,n),o=s.headers.get("mcp-session-id");if(o&&(this._sessionId=o),!s.ok){let t=await s.text().catch(()=>null);if(401===s.status&&this._authProvider){if(this._hasCompletedAuthFlow)throw new tz(401,"Server returned 401 after successful authentication");let{resourceMetadataUrl:t,scope:r}=tN(s);this._resourceMetadataUrl=t,this._scope=r;let i=await tT(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit});if("AUTHORIZED"!==i)throw new tE;return this._hasCompletedAuthFlow=!0,this.send(e)}if(403===s.status&&this._authProvider){let{resourceMetadataUrl:t,scope:r,error:i}=tN(s);if("insufficient_scope"===i){let i=s.headers.get("WWW-Authenticate");if(this._lastUpscopingHeader===i)throw new tz(403,"Server returned 403 after trying upscoping");r&&(this._scope=r),t&&(this._resourceMetadataUrl=t),this._lastUpscopingHeader=i??void 0;let a=await tT(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetch});if("AUTHORIZED"!==a)throw new tE;return this.send(e)}}throw new tz(s.status,`Error POSTing to endpoint: ${t}`)}if(this._hasCompletedAuthFlow=!1,this._lastUpscopingHeader=void 0,202===s.status){await s.body?.cancel(),(0,v.isInitializedNotification)(e)&&this._startOrAuthSse({resumptionToken:void 0}).catch(e=>this.onerror?.(e));return}let l=(Array.isArray(e)?e:[e]).filter(e=>"method"in e&&"id"in e&&void 0!==e.id).length>0,c=s.headers.get("content-type");if(l)if(c?.includes("text/event-stream"))this._handleSseStream(s.body,{onresumptiontoken:i},!1);else if(c?.includes("application/json")){let e=await s.json();for(let t of Array.isArray(e)?e.map(e=>v.JSONRPCMessageSchema.parse(e)):[v.JSONRPCMessageSchema.parse(e)])this.onmessage?.(t)}else throw await s.body?.cancel(),new tz(-1,`Unexpected content type: ${c}`);else await s.body?.cancel()}catch(e){throw this.onerror?.(e),e}}get sessionId(){return this._sessionId}async terminateSession(){if(this._sessionId)try{let e=await this._commonHeaders(),t={...this._requestInit,method:"DELETE",headers:e,signal:this._abortController?.signal},r=await (this._fetch??fetch)(this._url,t);if(await r.body?.cancel(),!r.ok&&405!==r.status)throw new tz(r.status,`Failed to terminate session: ${r.statusText}`);this._sessionId=void 0}catch(e){throw this.onerror?.(e),e}}setProtocolVersion(e){this._protocolVersion=e}get protocolVersion(){return this._protocolVersion}async resumeStream(e,t){await this._startOrAuthSse({resumptionToken:e,onresumptiontoken:t?.onresumptiontoken})}}var tY=e.i(243783);e.i(582482);var tQ=e.i(91022),tX=e.i(318905),t0=e.i(971619);function t1(e){if("string"!=typeof e)return e??null;try{return JSON.parse(e)}catch{return null}}function t2(e){return e instanceof Date?e.toISOString():"string"==typeof e&&Number.isFinite(Date.parse(e))?new Date(e).toISOString():null}function t3(e){let t;return{id:String(e.id),name:String(e.name),hostname:String(e.hostname),version:String(e.version),osVersion:String(e.osVersion),architecture:String(e.architecture),cpuModel:"string"==typeof e.cpuModel?e.cpuModel:null,memoryTotalBytes:"number"==typeof e.memoryTotalBytes?e.memoryTotalBytes:null,memoryFreeBytes:"number"==typeof e.memoryFreeBytes?e.memoryFreeBytes:null,diskTotalBytes:"number"==typeof e.diskTotalBytes?e.diskTotalBytes:null,diskFreeBytes:"number"==typeof e.diskFreeBytes?e.diskFreeBytes:null,capabilities:Array.isArray(e.capabilities)?e.capabilities:t1(e.capabilitiesJson)??[],baseRepoDirectory:"string"==typeof e.baseRepoDirectory?e.baseRepoDirectory:null,derivedDataLocationMode:String(e.derivedDataLocationMode),derivedDataPath:"string"==typeof e.derivedDataPath?e.derivedDataPath:null,buildsDirectory:"string"==typeof e.buildsDirectory?e.buildsDirectory:null,defaultBuildsDirectory:"string"==typeof e.defaultBuildsDirectory?e.defaultBuildsDirectory:null,effectiveBuildsDirectory:(0,t0.effectiveBuildsDirectory)(e),connectionStatus:null!==(t=t2(e.lastSeenAt))&&Date.now()-Date.parse(t)<=(0,a.agentOnlineWindowMs)(e)&&!e.disconnectedAt?"ONLINE":"OFFLINE",ipAddress:"string"==typeof e.ipAddress?e.ipAddress:null,lastSeenAt:t2(e.lastSeenAt),disconnectedAt:t2(e.disconnectedAt),createdAt:t2(e.createdAt),updatedAt:t2(e.updatedAt)}}function t4(e){let t=t3(e);return{agentId:t.id,baseRepoDirectory:t.baseRepoDirectory,buildsDirectory:t.buildsDirectory,defaultBuildsDirectory:t.defaultBuildsDirectory,effectiveBuildsDirectory:t.effectiveBuildsDirectory,derivedDataLocationMode:t.derivedDataLocationMode,derivedDataPath:t.derivedDataPath,updatedAt:t.updatedAt}}function t6(e){return{id:String(e.id),agentId:String(e.agentId),worktreeId:"string"==typeof e.worktreeId?e.worktreeId:null,codebaseId:"string"==typeof e.codebaseId?e.codebaseId:null,kind:String(e.kind),payload:t1(e.payload??e.payloadJson),status:String(e.status),idempotencyKey:String(e.idempotencyKey),result:t1(e.result??e.resultJson),error:"string"==typeof e.error?e.error:null,timeoutSeconds:Number(e.timeoutSeconds),createdAt:t2(e.createdAt),startedAt:t2(e.startedAt),finishedAt:t2(e.finishedAt),updatedAt:t2(e.updatedAt)}}function t8(e){return JSON.parse(JSON.stringify(e))}function t5(e){let t=e._count,r=e.versions;return{id:String(e.id),name:String(e.name),description:String(e.description??""),enabled:!0===e.enabled,overlapPolicy:String(e.overlapPolicy),maxConcurrentRuns:Number(e.maxConcurrentRuns),activeVersionId:"string"==typeof e.activeVersionId?e.activeVersionId:null,draftSchemaVersion:Number(e.draftSchemaVersion),quickActionKind:String(e.quickActionKind??"NONE"),archivedAt:t2(e.archivedAt),versionCount:t?.versions??r?.length??0,runCount:t?.runs??0,createdAt:t2(e.createdAt),updatedAt:t2(e.updatedAt)}}function t9(e){return{id:String(e.id),workflowId:String(e.workflowId),version:Number(e.version),name:String(e.name),description:String(e.description??""),schemaVersion:Number(e.schemaVersion),contentHash:String(e.contentHash),definition:t1(e.definitionJson),publishedAt:t2(e.publishedAt)}}function t7(e){let t=e._count;return{id:String(e.id),displayNumber:Number(e.displayNumber),workflowId:String(e.workflowId),versionId:String(e.versionId),parentRunId:"string"==typeof e.parentRunId?e.parentRunId:null,triggerKind:String(e.triggerKind),triggerSubjectKey:String(e.triggerSubjectKey??""),triggerPayload:t1(e.triggerPayloadJson),status:String(e.status),phase:String(e.phase),generation:Number(e.generation),sessionData:t1(e.sessionDataJson),blockedReason:"string"==typeof e.blockedReason?e.blockedReason:null,error:"string"==typeof e.error?e.error:null,attemptCount:t?.attempts??e.attempts?.length??0,eventCount:t?.events??e.events?.length??0,queuedAt:t2(e.queuedAt),startedAt:t2(e.startedAt),pausedAt:t2(e.pausedAt),finishedAt:t2(e.finishedAt),updatedAt:t2(e.updatedAt)}}let re=e1.object({}),rt=e1.object({id:e1.string(),name:e1.string(),hostname:e1.string(),version:e1.string(),osVersion:e1.string(),architecture:e1.string(),cpuModel:e1.string().nullable(),memoryTotalBytes:e1.number().nullable(),memoryFreeBytes:e1.number().nullable(),diskTotalBytes:e1.number().nullable(),diskFreeBytes:e1.number().nullable(),capabilities:e1.array(e1.string()),baseRepoDirectory:e1.string().nullable(),derivedDataLocationMode:e1.enum(["DEFAULT","ABSOLUTE","RELATIVE"]),derivedDataPath:e1.string().nullable(),buildsDirectory:e1.string().nullable(),defaultBuildsDirectory:e1.string().nullable(),effectiveBuildsDirectory:e1.string().nullable(),connectionStatus:e1.enum(["ONLINE","OFFLINE"]),ipAddress:e1.string().nullable(),lastSeenAt:e1.string().nullable(),disconnectedAt:e1.string().nullable(),createdAt:e1.string(),updatedAt:e1.string()}),rr=e1.object({agentId:e1.string(),baseRepoDirectory:e1.string().nullable(),buildsDirectory:e1.string().nullable(),defaultBuildsDirectory:e1.string().nullable(),effectiveBuildsDirectory:e1.string().nullable(),derivedDataLocationMode:e1.enum(["DEFAULT","ABSOLUTE","RELATIVE"]),derivedDataPath:e1.string().nullable(),updatedAt:e1.string()}),ri=e1.object({id:e1.string(),agentId:e1.string(),worktreeId:e1.string().nullable(),codebaseId:e1.string().nullable(),kind:e1.string(),payload:e1.unknown(),status:e1.string(),idempotencyKey:e1.string(),result:e1.unknown().nullable(),error:e1.string().nullable(),timeoutSeconds:e1.number().int(),createdAt:e1.string(),startedAt:e1.string().nullable(),finishedAt:e1.string().nullable(),updatedAt:e1.string()}),ra=e1.object({id:e1.string(),jobId:e1.string(),sequence:e1.number().int(),stream:e1.string(),message:e1.string(),createdAt:e1.string()}),rn=e1.object({agentId:e1.string().min(1)});var rs=e.i(190714),ro=e.i(184015);let rl=e1.object({}),rc=e1.object({settings:e1.object({refreshIntervalSeconds:e1.number().int(),fetchIntervalSeconds:e1.number().int(),defaultJiraBranchRegex:e1.string(),updatedAt:e1.string()})}),ru=e1.object({agentId:e1.string().min(1),path:e1.string().nullable().default(null),requestId:e1.string().min(1)}),rd=e1.object({listing:e1.unknown()}),rp=e1.object({agentId:e1.string().min(1),folder:e1.string().min(1),requestId:e1.string().min(1)}),rh=e1.object({inspection:e1.unknown()}),rm=e1.object({codebaseIds:e1.array(e1.string().min(1)).min(1).max(500),requestId:e1.string().min(1)}),rf=e1.object({jobs:e1.array(e1.unknown()),skipped:e1.array(e1.object({codebaseId:e1.string(),reason:e1.string()}))}),rg=e1.object({codebaseId:e1.string().min(1),requestId:e1.string().min(1)}),ry=e1.object({state:e1.unknown()}),rv=e1.object({codebaseId:e1.string().min(1),stashOid:e1.string().regex(/^[0-9a-f]{40}(?:[0-9a-f]{24})?$/i),requestId:e1.string().min(1)}),rw=e1.object({diff:e1.unknown()});e.i(282790);var rb=e.i(474170);function rk(e){return e instanceof Date?e.toISOString():null}function rx(e){if("string"!=typeof e)return e??null;try{return JSON.parse(e)}catch{return null}}let rS=e1.object({id:e1.string(),clientRegistrationId:e1.string(),tokenMasked:e1.string(),topic:e1.string(),environment:e1.string(),supportedPushTypes:e1.array(e1.string()),displayName:e1.string(),deviceModel:e1.string().nullable(),osVersion:e1.string().nullable(),appVersion:e1.string().nullable(),appBuild:e1.string().nullable(),locale:e1.string().nullable(),pushMagicConfigured:e1.boolean(),status:e1.string(),invalidatedAt:e1.string().nullable(),lastFailureReason:e1.string().nullable(),lastFailureAt:e1.string().nullable(),lastRegisteredAt:e1.string(),lastSentAt:e1.string().nullable(),createdAt:e1.string(),updatedAt:e1.string()}),rI=e1.object({id:e1.string(),name:e1.string(),topic:e1.string(),environment:e1.string(),fingerprint:e1.string(),expiresAt:e1.string().nullable(),lastTestedAt:e1.string().nullable(),lastError:e1.string().nullable(),createdAt:e1.string(),updatedAt:e1.string()}),rE=e1.object({tokenConfigured:e1.boolean(),tokenTeamId:e1.string().nullable(),tokenKeyId:e1.string().nullable(),tokenPrivateKeyFingerprint:e1.string().nullable(),tokenConfiguredAt:e1.string().nullable(),tokenLastUsedAt:e1.string().nullable(),tokenLastError:e1.string().nullable(),certificates:e1.array(rI),updatedAt:e1.string()}),rA=e1.object({id:e1.string(),channelId:e1.string(),bundleId:e1.string(),environment:e1.string(),storagePolicy:e1.string(),createdAt:e1.string(),updatedAt:e1.string()}),r_=e1.object({id:e1.string(),name:e1.string(),editor:e1.unknown(),createdAt:e1.string(),updatedAt:e1.string()}),rC=e1.object({id:e1.string(),registrationId:e1.string().nullable(),topic:e1.string(),environment:e1.string(),status:e1.string(),apnsId:e1.string().nullable(),responseCode:e1.number().int().nullable(),reason:e1.string().nullable(),responseTimestamp:e1.string().nullable(),attempts:e1.number().int(),durationMs:e1.number().int().nullable(),createdAt:e1.string(),startedAt:e1.string().nullable(),finishedAt:e1.string().nullable()}),rT=e1.object({id:e1.string(),requestId:e1.string(),status:e1.string(),editor:e1.unknown(),payload:e1.unknown(),headers:e1.unknown(),targetMode:e1.string(),channelId:e1.string().nullable(),recipientCount:e1.number().int(),successCount:e1.number().int(),failureCount:e1.number().int(),error:e1.string().nullable(),createdAt:e1.string(),startedAt:e1.string().nullable(),finishedAt:e1.string().nullable(),updatedAt:e1.string(),deliveries:e1.array(rC)});function rR(e){return{id:String(e.id),requestId:String(e.requestId),status:String(e.status),editor:rx(e.editor??e.editorJson),payload:rx(e.payload??e.payloadJson),headers:rx(e.headers??e.headersJson),targetMode:String(e.targetMode),channelId:"string"==typeof e.channelId?e.channelId:null,recipientCount:Number(e.recipientCount),successCount:Number(e.successCount),failureCount:Number(e.failureCount),error:"string"==typeof e.error?e.error:null,createdAt:rk(e.createdAt),startedAt:rk(e.startedAt),finishedAt:rk(e.finishedAt),updatedAt:rk(e.updatedAt),deliveries:Array.isArray(e.deliveries)?e.deliveries.map(e=>({id:String(e.id),registrationId:"string"==typeof e.registrationId?e.registrationId:null,topic:String(e.topic),environment:String(e.environment),status:String(e.status),apnsId:"string"==typeof e.apnsId?e.apnsId:null,responseCode:"number"==typeof e.responseCode?e.responseCode:null,reason:"string"==typeof e.reason?e.reason:null,responseTimestamp:rk(e.responseTimestamp),attempts:Number(e.attempts),durationMs:"number"==typeof e.durationMs?e.durationMs:null,createdAt:rk(e.createdAt),startedAt:rk(e.startedAt),finishedAt:rk(e.finishedAt)})):[]}}let rD={requestId:e1.string().min(1),editor:e1.record(e1.string(),e1.unknown())},rN={requestId:e1.string().min(1),presetId:e1.string().min(1)},rO=e1.discriminatedUnion("targetMode",[e1.object({...rD,targetMode:e1.literal("DEVICES"),registrationIds:e1.array(e1.string().min(1)).min(1)}),e1.object({...rD,targetMode:e1.literal("ALL")}),e1.object({...rD,targetMode:e1.literal("BROADCAST"),channelId:e1.string().min(1)}),e1.object({...rD,targetMode:e1.literal("DIRECT"),directToken:e1.string().min(1),directTokenEncoding:e1.enum(["HEX","BASE64"]).default("HEX"),directEnvironment:e1.enum(["SANDBOX","PRODUCTION"]).default("SANDBOX")})]),rP=e1.discriminatedUnion("targetMode",[e1.object({...rN,targetMode:e1.literal("DEVICES"),registrationIds:e1.array(e1.string().min(1)).min(1)}),e1.object({...rN,targetMode:e1.literal("ALL")}),e1.object({...rN,targetMode:e1.literal("BROADCAST"),channelId:e1.string().min(1)}),e1.object({...rN,targetMode:e1.literal("DIRECT"),directToken:e1.string().min(1),directTokenEncoding:e1.enum(["HEX","BASE64"]).default("HEX"),directEnvironment:e1.enum(["SANDBOX","PRODUCTION"]).default("SANDBOX")})]);function r$(e){return{requestId:e.requestId,editor:e.editor,targetMode:e.targetMode,registrationIds:"DEVICES"===e.targetMode?e.registrationIds:void 0,channelId:"BROADCAST"===e.targetMode?e.channelId:void 0,directToken:"DIRECT"===e.targetMode?e.directToken:void 0,directTokenEncoding:"DIRECT"===e.targetMode?e.directTokenEncoding:void 0,directEnvironment:"DIRECT"===e.targetMode?e.directEnvironment:void 0}}let rU=e1.object({id:e1.string(),entryType:e1.enum(["CONSOLE","ANALYTICS","SEPARATOR"]),clientTime:e1.string(),receivedAt:e1.string(),deviceIp:e1.string().nullable(),message:e1.string().nullable(),level:e1.string().nullable(),category:e1.string().nullable(),eventName:e1.string().nullable(),eventKind:e1.string().nullable(),screenName:e1.string().nullable(),buildId:e1.string().nullable(),sessionId:e1.string().nullable(),attributes:e1.record(e1.string(),e1.unknown()),defaultParameters:e1.record(e1.string(),e1.unknown()),additionalParameters:e1.record(e1.string(),e1.unknown()),highlightColor:e1.string().nullable(),separatorKind:e1.string().nullable(),separatorName:e1.string().nullable()}),rB=e1.object({items:e1.array(rU),nextCursor:e1.string().nullable(),matchingCount:e1.number().int().nonnegative(),totalCount:e1.number().int().nonnegative()}),rj=rB.extend({separator:rU.nullable()}),rL=e1.object({first:e1.number().int().min(1).max(500).default(200),after:e1.string().nullable().default(null)}),rM=e1.object({field:e1.string().min(1),operator:e1.enum(["CONTAINS","DOES_NOT_CONTAIN","IS","IS_NOT","MATCHES_GLOB","MATCHES_REGEX","NO_REGEX_MATCH","IS_EMPTY","IS_NOT_EMPTY"]),value:e1.string().nullable().optional(),caseSensitive:e1.boolean().default(!1),sources:e1.array(e1.enum(["CONSOLE","ANALYTICS"])).optional()}),rq=e1.object({mode:e1.enum(["ALL","ANY"]),conditions:e1.array(rM).min(1).max(100)}),rF={search:e1.string().min(1).nullable().optional(),searchMode:e1.enum(["TEXT","GLOB","REGEX"]).default("TEXT"),caseSensitive:e1.boolean().default(!1),quickFilters:e1.record(e1.string(),e1.array(e1.string()).max(500)).nullable().optional(),advancedFilter:rq.nullable().optional()},rV=rL.extend(rF).refine(rW,{message:"At least one telemetry search filter is required"}),rK=rL.extend(rF),rH=e1.object({scope:e1.literal("MATCHING"),...rF}).refine(rW,{message:"At least one telemetry search filter is required"}),rG=e1.union([e1.object({scope:e1.literal("IDS"),ids:e1.array(e1.string().min(1)).min(1).max(1e3)}),rH,e1.object({scope:e1.literal("ALL"),includeSeparators:e1.boolean().default(!1)}),e1.object({scope:e1.literal("BEFORE_LATEST_SEPARATOR"),includeSeparators:e1.boolean().default(!1)})]);function rW(e){return!!(e.search||Object.values(e.quickFilters??{}).some(e=>e.length)||e.advancedFilter?.conditions.length)}function rJ(e,t){return{view:e,first:t.first,after:t.after,search:t.search,searchMode:t.searchMode??"TEXT",caseSensitive:t.caseSensitive??!1,quickFilters:t.quickFilters,advancedFilter:t.advancedFilter}}function rz(e,t,r){return[iP({name:`get_${r.plural}`,title:`Get ${r.label}`,description:`Fetch the newest ${r.label.toLocaleLowerCase()} with cursor pagination.`,inputSchema:rL,outputSchema:rB,annotations:iD,handler:r=>e.timeline(rJ(t,r))}),iP({name:`get_${r.singular}`,title:`Get ${r.singular.replaceAll("_"," ")}`,description:`Fetch one ${r.label.toLocaleLowerCase()} item by ID.`,inputSchema:e1.object({id:e1.string().min(1)}),outputSchema:e1.object({entry:rU.nullable()}),annotations:iD,handler:async({id:r})=>({entry:await e.entry(r,t)})}),iP({name:`search_${r.plural}`,title:`Search ${r.label}`,description:"Search with text, glob, regex, quick facets, or advanced filter conditions.",inputSchema:rV,outputSchema:rB,annotations:iD,handler:r=>e.timeline(rJ(t,r))}),iP({name:`get_${r.plural}_since_latest_separator`,title:`Get ${r.label} since latest separator`,description:"Fetch entries strictly newer than the latest global telemetry separator.",inputSchema:rK,outputSchema:rj,annotations:iD,handler:r=>e.timelineSinceLatestSeparator(rJ(t,r))}),iP({name:`get_${r.singular}_search_metadata`,title:`Get ${r.label} search metadata`,description:"Get searchable fields and current facet values.",inputSchema:e1.object({}),outputSchema:e1.object({fields:e1.array(e1.string()),facets:e1.record(e1.string(),e1.array(e1.string()))}),annotations:iD,handler:async()=>{let[r,i]=await Promise.all([e.fields(t),e.facets(t)]);return{fields:r,facets:i}}}),iP({name:`clear_${r.plural}`,title:`Clear ${r.label}`,description:"Clear explicit IDs, matching entries, all entries, or entries before the latest separator.",inputSchema:rG,outputSchema:e1.object({view:e1.enum(["CONSOLE","ANALYTICS","UNIFIED"]),scope:e1.enum(["IDS","MATCHING","ALL","BEFORE_LATEST_SEPARATOR"]),deletedCount:e1.number().int().nonnegative()}),annotations:iO,handler:async r=>{let i="MATCHING"===r.scope?r:null,a=await e.clearScoped({view:t,scope:r.scope,ids:"IDS"===r.scope?r.ids:null,includeSeparators:("ALL"===r.scope||"BEFORE_LATEST_SEPARATOR"===r.scope)&&r.includeSeparators,query:i?{search:i.search,searchMode:i.searchMode,caseSensitive:i.caseSensitive,quickFilters:i.quickFilters,advancedFilter:i.advancedFilter}:null});return{view:t,scope:r.scope,deletedCount:a}}})]}var rZ=e.i(885418),rY=e.i(586589),rQ=e.i(661983),rX=e.i(504173),r0=e.i(518733);function r1(e,t,r=null){let i=[...t.volumes].filter(e=>e.monitored).sort((e,t)=>e.freeBytes-t.freeBytes||e.id.localeCompare(t.id))[0],n=i&&i.totalBytes>0?i.freeBytes/i.totalBytes*100:null,s=null===t.agent.disconnectedAt&&null!==t.agent.lastSeenAt&&Date.now()-t.agent.lastSeenAt.getTime()<=(0,a.agentOnlineWindowMs)(t.agent);return{agent:{id:t.agent.id,name:t.agent.name,hostname:t.agent.hostname,connected:s,diskTotalBytes:t.agent.diskTotalBytes,diskFreeBytes:t.agent.diskFreeBytes},codebase:{agentId:t.agent.id},disk:{enabled:t.enabled,status:t.status,pressureMode:t.pressureMode,manualPressureMode:t.manualPressureMode,automaticPressureMode:t.automaticPressureMode,lastReportedAt:t.lastReportedAt,lastError:t.lastError,warnings:[...t.warnings],monitoredVolumeId:i?.id??null,freeBytes:i?.freeBytes??null,totalBytes:i?.totalBytes??null,freeGiB:i?i.freeBytes/0x40000000:null,freePercent:n,usedPercent:null===n?null:100-n,effectiveThresholdBytes:i?.effectiveThresholdBytes??null,normalThresholdGiB:e.normalThresholdGiB,pressureThresholdGiB:e.pressureThresholdGiB,pollIntervalSeconds:e.pollIntervalSeconds,staleAfterSeconds:e.staleAfterSeconds,changeReason:r,volumes:t.volumes.map(e=>({...e}))}}}function r2(e){return{enabled:e.disk.enabled,status:e.disk.status,pressureMode:e.disk.pressureMode,lastError:e.disk.lastError,warnings:e.disk.warnings,monitoredVolumeId:e.disk.monitoredVolumeId}}function r3(e){try{let t=JSON.parse(e??"[]");return Array.isArray(t)?t:[]}catch{return[]}}function r4(e,t){if(!Number.isFinite(e)||e<=0||e>1e6)throw Error(`${t} must be a positive finite GiB value`);return e}class r6{agentControl;constructor(e){this.agentControl=e,this.agentControl.registerCompletionObserver(e=>this.observeCompletion(e))}async settings(){let e=await (0,tY.getPrismaClient)(),t=await e.diskSpaceSettings.upsert({where:{id:"default"},create:{id:"default",normalThresholdGiB:rY.DEFAULT_DISK_SPACE_THRESHOLD_GIB,pressureThresholdGiB:rY.DEFAULT_DISK_SPACE_PRESSURE_THRESHOLD_GIB},update:{}});return{normalThresholdGiB:t.normalThresholdGiB,pressureThresholdGiB:t.pressureThresholdGiB,pollIntervalSeconds:rY.DISK_SPACE_POLL_INTERVAL_SECONDS,staleAfterSeconds:rY.DISK_SPACE_STALE_AFTER_SECONDS}}async updateSettings(e){let t=r4(e.normalThresholdGiB,"Normal disk threshold"),r=r4(e.pressureThresholdGiB,"Pressure disk threshold");if(r>=t)throw Error("Pressure disk threshold must be lower than the normal threshold");let i=await (0,tY.getPrismaClient)();for(let{agentId:e}of(await i.diskSpaceSettings.upsert({where:{id:"default"},create:{id:"default",normalThresholdGiB:t,pressureThresholdGiB:r},update:{normalThresholdGiB:t,pressureThresholdGiB:r}}),this.publish("settings","SETTINGS_UPDATED"),await i.agentDiskSpaceState.findMany({where:{enabled:!0},select:{agentId:!0}})))this.reconcileAgent(e);return this.settings()}async configuration(e){let t=await (0,tY.getPrismaClient)(),[r,i,a]=await Promise.all([t.agent.findUnique({where:{id:e}}),t.agentDiskSpaceState.findUnique({where:{agentId:e}}),t.worktree.findMany({where:{missingAt:null,codebase:{agentId:e}},select:{id:!0,folder:!0}})]);if(!r)throw Error("Agent not found");return{enabled:i?.enabled??!0,pollIntervalSeconds:rY.DISK_SPACE_POLL_INTERVAL_SECONDS,baseRepoDirectory:r.baseRepoDirectory,derivedDataLocationMode:r.derivedDataLocationMode,derivedDataPath:r.derivedDataPath,worktrees:a}}async report(e,t){let r=(0,rY.parseAgentDiskSpaceReport)(t),i=await (0,tY.getPrismaClient)(),[a,n]=await Promise.all([i.agent.findUnique({where:{id:e}}),i.worktree.findMany({where:{missingAt:null,codebase:{agentId:e}},include:{codebase:{select:{agentId:!0}}}})]);if(!a)throw Error("Agent not found");let s=new Date(r.observedAt),o=r.entries.map(e=>{let t=e.workspacePath?n.filter(t=>{var r,i;let a;return r=t.folder,i=e.workspacePath,i===(a="/"===r?r:r.replace(/\/+$/,""))||i.startsWith(`${a}/`)}).sort((e,t)=>t.folder.length-e.folder.length)[0]:null;return{...e,worktreeId:t?.id??null,worktreePath:t?(0,rX.worktreeDisplayPath)(t.folder,a.baseRepoDirectory):null}});await i.agentDiskSpaceState.upsert({where:{agentId:e},create:{agentId:e,volumesJson:JSON.stringify(r.volumes),entriesJson:JSON.stringify(o),warningsJson:JSON.stringify(r.warnings),lastReportedAt:s,lastError:null},update:{volumesJson:JSON.stringify(r.volumes),entriesJson:JSON.stringify(o),warningsJson:JSON.stringify(r.warnings),lastReportedAt:s,lastError:null}}),this.publish(e,"REPORT_RECEIVED"),this.reconcileAgent(e)}async overview(){let e=await (0,tY.getPrismaClient)();await e.derivedDataCleanupLease.deleteMany({where:{jobId:null,expiresAt:{lte:new Date}}});let[t,r,i]=await Promise.all([this.settings(),e.agent.findMany({orderBy:{name:"asc"},include:{diskSpaceState:!0}}),e.derivedDataCleanupLease.findMany({select:{agentId:!0}})]),a=new Set(i.map(e=>e.agentId));return{settings:t,agents:r.map(e=>{let r=e.diskSpaceState,i=r?.enabled??!0,n=r?.manualPressureMode??!1,s=r?.automaticPressureMode??!1,o=r?.lastReportedAt??null,l=!o||Date.now()-o.getTime()>1e3*t.staleAfterSeconds,c=(n||s?t.pressureThresholdGiB:t.normalThresholdGiB)*0x40000000,u=r3(r?.volumesJson),d=(0,rY.monitoredDiskSpaceVolumes)(u),p=d.some(e=>e.freeBytes<=0x40000000*t.pressureThresholdGiB),h=d.some(e=>e.freeBytes<c),m="IDLE";i?l?m="STALE":r?.lastError||0===u.length&&r3(r?.warningsJson).length>0?m="ERROR":p?m="CRITICAL":a.has(e.id)?m="DELETING":n||s?m="PRESSURE":h&&(m="CLEANUP_REQUIRED"):m="DISABLED";let f=u.map(r=>{let o=(0,rY.isMonitoredDiskSpaceVolume)(r);return{...r,effectiveThresholdBytes:c,monitored:o,status:i?l?"STALE":o?r.freeBytes<=0x40000000*t.pressureThresholdGiB?"CRITICAL":a.has(e.id)&&r.freeBytes<c?"DELETING":n||s?"PRESSURE":r.freeBytes<c?"CLEANUP_REQUIRED":"IDLE":"IDLE":"DISABLED"}}),g=r3(r?.warningsJson);return i&&!l&&u.length>0&&0===d.length&&g.push("No Derived Data volume was reported, so free space is not being monitored for this agent"),{agent:e,enabled:i,status:m,pressureMode:n?"MANUAL":s?"AUTOMATIC":"NORMAL",manualPressureMode:n,automaticPressureMode:s,lastReportedAt:o?.toISOString()??null,lastError:r?.lastError??null,warnings:g,volumes:f}})}}async agentView(e){let t=(await this.overview()).agents.find(t=>t.agent.id===e);if(!t)throw Error("Agent not found");return t}async snapshot(e,t=null){let r=await this.overview(),i=r.agents.find(t=>t.agent.id===e);if(!i)throw Error("Agent not found");return r1(r.settings,i,t)}async requestRefresh(e){let t=await this.agentView(e);if(!t.enabled)throw Error("Disk-space monitoring is disabled for this agent");let r=new Date().toISOString();return this.agentControl.requestDiskSpacePoll(e),{agentId:e,requestedAt:r,previousReportedAt:t.lastReportedAt}}async setMonitoring(e,t){let r=await (0,tY.getPrismaClient)();return await r.agent.findUniqueOrThrow({where:{id:e}}),await r.agentDiskSpaceState.upsert({where:{agentId:e},create:{agentId:e,enabled:t},update:{enabled:t,...!t?{manualPressureMode:!1,automaticPressureMode:!1}:{}}}),t||await r.derivedDataCleanupLease.deleteMany({where:{agentId:e,jobId:null}}),this.publish(e,"MONITORING_CHANGED"),this.agentControl.requestAgentConfigurationRefresh(e),this.agentView(e)}async setManualPressureMode(e,t){let r=await (0,tY.getPrismaClient)();return await r.agent.findUniqueOrThrow({where:{id:e}}),await r.agentDiskSpaceState.upsert({where:{agentId:e},create:{agentId:e,manualPressureMode:t},update:{manualPressureMode:t}}),this.publish(e,"MANUAL_PRESSURE_CHANGED"),this.reconcileAgent(e),this.agentView(e)}async assertWorktreeCanStart(e){let t=await (0,tY.getPrismaClient)();await t.derivedDataCleanupLease.deleteMany({where:{worktreeId:e,jobId:null,expiresAt:{lte:new Date}}});let[r,i]=await Promise.all([t.derivedDataCleanupLease.findUnique({where:{worktreeId:e}}),t.worktree.findUnique({where:{id:e},select:{codebase:{select:{agentId:!0}}}})]);if(r)throw Error("Derived Data cleanup is in progress for this worktree; try again shortly");i&&await this.assertAgentCanStart(i.codebase.agentId)}async assertAgentCanStart(e){let t=await (0,tY.getPrismaClient)(),[r,i]=await Promise.all([this.settings(),t.agentDiskSpaceState.findUnique({where:{agentId:e}})]);if(!(!i?.enabled||!i.lastReportedAt||i.lastError||Date.now()-i.lastReportedAt.getTime()>1e3*r.staleAfterSeconds)&&(0,rY.monitoredDiskSpaceVolumes)(r3(i.volumesJson)).some(e=>e.freeBytes<=0x40000000*r.pressureThresholdGiB))throw Error(`New builds, plans, and sessions are paused because this agent has ${r.pressureThresholdGiB} GiB or less free disk space`)}subscribe(){return rQ.agentEventBus.iterate(rQ.DISK_SPACE_CHANGED_TOPIC)}async reconcileAgent(e){let t=await (0,tY.getPrismaClient)();await t.derivedDataCleanupLease.deleteMany({where:{jobId:null,expiresAt:{lte:new Date}}});let[r,i,n,s,o]=await Promise.all([this.settings(),t.agentDiskSpaceState.findUnique({where:{agentId:e}}),t.derivedDataLock.findMany({where:{agentId:e},select:{path:!0}}),t.derivedDataCleanupLease.findFirst({where:{agentId:e}}),t.agent.findUnique({where:{id:e}})]);if(!i?.enabled||!i.lastReportedAt||i.lastError||s||!o||null!==o.disconnectedAt||null===o.lastSeenAt||Date.now()-o.lastSeenAt.getTime()>(0,a.agentOnlineWindowMs)(o)||!r3(o.capabilitiesJson).includes(rZ.BUILD_DATA_DELETE_JOB_KIND)||Date.now()-i.lastReportedAt.getTime()>1e3*r.staleAfterSeconds)return;let l=r3(i.entriesJson),c=r3(i.volumesJson),u=(0,rY.monitoredDiskSpaceVolumes)(c),d=l.map(e=>e.worktreeId).filter(e=>!!e),p=await (0,r0.executingResourcesByWorktree)(d),h=new Set(n.map(e=>e.path));l=l.filter(e=>"PROJECT"===e.kind&&!!e.worktreeId&&!h.has(e.path)&&(p.get(e.worktreeId)?.length??0)===0);let m=0x40000000*r.normalThresholdGiB,f=0x40000000*r.pressureThresholdGiB,y=u.filter(e=>e.freeBytes<m),v=e=>e.capacityId??e.id,w=new Map(c.map(e=>[e.id,v(e)])),b=e=>l.some(t=>w.get(t.volumeId)===v(e)),k=i.automaticPressureMode;if(!i.manualPressureMode){let r=y.length>0&&y.some(e=>!b(e)),a=k&&(0===y.length||y.every(e=>b(e)));r?k=!0:a&&(k=!1),k!==i.automaticPressureMode&&(await t.agentDiskSpaceState.update({where:{agentId:e},data:{automaticPressureMode:k}}),this.publish(e,"AUTOMATIC_PRESSURE_CHANGED"))}let x=i.manualPressureMode||k?f:m,S=new Set(u.filter(e=>e.freeBytes<x).map(v)),I=l.filter(e=>S.has(w.get(e.volumeId)??"")).sort((e,t)=>new Date(e.modifiedAt).getTime()-new Date(t.modifiedAt).getTime()||e.path.localeCompare(t.path))[0];if(!I?.worktreeId)return;try{await t.derivedDataCleanupLease.create({data:{worktreeId:I.worktreeId,agentId:e,path:I.path,source:"AUTOMATIC",expiresAt:new Date(Date.now()+6e5)}})}catch{return}let E=await (0,r0.executingResourcesByWorktree)([I.worktreeId]);if((E.get(I.worktreeId)?.length??0)>0){await t.derivedDataCleanupLease.deleteMany({where:{worktreeId:I.worktreeId,jobId:null}}),this.publish(e,"CLEANUP_SKIPPED");return}try{var A;let r=await this.agentControl.createJob({agentId:e,kind:rZ.BUILD_DATA_DELETE_JOB_KIND,payload:{source:"AUTOMATIC",targets:[{path:I.path,rootPath:I.rootPath,name:I.name,kind:I.kind,worktreeId:I.worktreeId,worktreePath:I.worktreePath}]},idempotencyKey:`disk-space:auto:${(A=I.path,(0,g.createHash)("sha256").update(e).update("\0").update(A).digest("base64url"))}:${(0,g.randomUUID)()}`,timeoutSeconds:600,visibility:"SYSTEM"});await t.derivedDataCleanupLease.update({where:{worktreeId:I.worktreeId},data:{jobId:r.id}}),this.publish(e,"CLEANUP_STARTED")}catch(r){await t.derivedDataCleanupLease.deleteMany({where:{worktreeId:I.worktreeId}}),await t.agentDiskSpaceState.update({where:{agentId:e},data:{lastError:r instanceof Error?r.message:String(r)}}),this.publish(e,"CLEANUP_START_FAILED")}}async observeCompletion(e){if(e.kind!==rZ.BUILD_DATA_DELETE_JOB_KIND)return;let t="USER",r=[];try{let i=(0,rZ.buildDataDeletePayload)(JSON.parse(e.payloadJson));t=i.source,r=i.targets}catch{}let i=await (0,tY.getPrismaClient)(),a=await i.derivedDataCleanupLease.deleteMany({where:{jobId:e.id}});if("AUTOMATIC"===t&&"SUCCEEDED"!==e.status&&await i.agentDiskSpaceState.updateMany({where:{agentId:e.agentId},data:{lastError:e.error||"Automatic Derived Data cleanup failed"}}),a.count||"AUTOMATIC"===t){let i=[];if("AUTOMATIC"===t&&e.resultJson)try{i=(0,rZ.parseBuildDataDeleteResult)(JSON.parse(e.resultJson)).deleted}catch{}this.publish(e.agentId,"CLEANUP_COMPLETED","AUTOMATIC"===t?{jobId:e.id,status:e.status,source:t,error:e.error,targets:r,deleted:i}:null),this.agentControl.requestDiskSpacePoll(e.agentId)}}publish(e,t,r=null){rQ.agentEventBus.publish(rQ.DISK_SPACE_CHANGED_TOPIC,{diskSpaceChanged:e,diskSpaceChange:{id:(0,g.randomUUID)(),reason:t,cleanup:r}}),rQ.agentEventBus.publish(rQ.SIDEBAR_STATUS_CHANGED_TOPIC,{sidebarStatusChanged:!0}),rQ.agentEventBus.publish(rQ.POLLING_CHANGED_TOPIC,{pollingOperationChanged:`agent-disk-space:${e}`})}}let r8=e1.object({normalThresholdGiB:e1.number(),pressureThresholdGiB:e1.number(),pollIntervalSeconds:e1.number().int(),staleAfterSeconds:e1.number().int()}),r5=e1.object({id:e1.string(),name:e1.string(),hostname:e1.string(),connected:e1.boolean(),diskTotalBytes:e1.number().nullable(),diskFreeBytes:e1.number().nullable()}),r9=e1.enum(["DISABLED","STALE","IDLE","CLEANUP_REQUIRED","DELETING","PRESSURE","CRITICAL","ERROR"]),r7=e1.object({id:e1.string(),capacityId:e1.string(),totalBytes:e1.number(),freeBytes:e1.number(),roles:e1.array(e1.enum(["MAIN","BASE_REPO","DERIVED_DATA"])),paths:e1.array(e1.string()),status:r9,effectiveThresholdBytes:e1.number(),monitored:e1.boolean()}),ie=e1.object({enabled:e1.boolean(),status:r9,pressureMode:e1.enum(["NORMAL","MANUAL","AUTOMATIC"]),manualPressureMode:e1.boolean(),automaticPressureMode:e1.boolean(),lastReportedAt:e1.string().nullable(),lastError:e1.string().nullable(),warnings:e1.array(e1.string()),monitoredVolumeId:e1.string().nullable(),freeBytes:e1.number().nullable(),totalBytes:e1.number().nullable(),freeGiB:e1.number().nullable(),freePercent:e1.number().nullable(),usedPercent:e1.number().nullable(),effectiveThresholdBytes:e1.number().nullable(),normalThresholdGiB:e1.number(),pressureThresholdGiB:e1.number(),pollIntervalSeconds:e1.number().int(),staleAfterSeconds:e1.number().int(),changeReason:e1.string().nullable(),volumes:e1.array(r7)}),it=e1.object({agent:r5,codebase:e1.object({agentId:e1.string()}),disk:ie}),ir=e1.object({agentId:e1.string().min(1)});var ii=e.i(497800),ia=e.i(835544);function is(e,t){let r=new Set([...e.nodes.map(({id:e})=>e),...e.triggers.map(({id:e})=>e)]);for(let e=1;;e+=1){let i=`${t}-${e}`;if(!r.has(i))return i}}function io(e,t){return e.nodes.find(e=>e.id===t)??e.triggers.find(e=>e.id===t)}function il(e){return(0,ia.isChoiceTriggerKind)(e.kind)?(0,ii.workflowTriggerChoices)(e.config).map(({key:e})=>e):(0,ia.workflowStaticSourceHandles)(e.kind)}function ic(e,t){if(t.config)return t.config;if(!t.configPatch)return e;let r={...e};for(let[e,i]of Object.entries(t.configPatch))null===i?delete r[e]:r[e]=i;return r}function iu(e,t){let r=io(e,t.source);if(!r)throw Error(`${t.source} is not in this workflow`);if(!e.nodes.some(({id:e})=>e===t.target))throw Error(`${t.target} is not a step — triggers cannot have incoming connections`);let i=il(r),a=t.sourceHandle??i[0];if(!a)throw Error(`${t.source} offers no connectors yet — a choice trigger needs its options set first`);if(!i.includes(a))throw Error(`${t.source} has no ${a} connector; it offers ${i.join(", ")}`);let n=t.targetHandle??"input",s=e.edges.find(e=>e.source===t.source&&e.target===t.target&&e.sourceHandle===a);if(s)return{definition:e,edgeId:s.id};let o=function(e){let t=new Set(e.edges.map(({id:e})=>e));for(let e=1;;e+=1){let r=`edge-${e}`;if(!t.has(r))return r}}(e);return{definition:{...e,edges:[...e.edges,{id:o,source:t.source,target:t.target,sourceHandle:a,targetHandle:n}]},edgeId:o}}let id={workflow:[{name:"id",description:"Workflow definition id"},{name:"name",description:"Workflow name"},{name:"runId",description:"Current run id"},{name:"startedAt",description:"Run start timestamp"},{name:"trigger",description:"Trigger that started the run"}],repo:[{name:"id",description:"Repository id"},{name:"githubId",description:"GitHub repository id"},{name:"owner",description:"Repository owner / organization"},{name:"name",description:"Repository name"},{name:"url",description:"Repository URL"},{name:"canonicalOrigin",description:"Normalized repository origin"},{name:"displayOrigin",description:"Human-readable repository origin"},{name:"defaultBranch",description:"Repository default branch"}],codebase:[{name:"id",description:"Codebase id"},{name:"agentId",description:"Owning agent id"},{name:"folder",description:"Codebase filesystem path"},{name:"branch",description:"Current branch"},{name:"headSha",description:"HEAD commit SHA"},{name:"dirty",description:"Whether the working tree has changes"},{name:"branches",description:"Local and remote Git branches"},{name:"branchesTruncated",description:"Whether branch results were truncated"},{name:"stashes",description:"Git stashes"},{name:"stashesTruncated",description:"Whether stash results were truncated"},{name:"remoteBranches",description:"Known remote branches"}],agent:[{name:"id",description:"Owning agent id"},{name:"name",description:"Agent display name"},{name:"hostname",description:"Agent hostname"},{name:"connected",description:"Whether the agent is connected"},{name:"diskTotalBytes",description:"Root disk capacity in bytes"},{name:"diskFreeBytes",description:"Available disk space in bytes"},{name:"memoryFreeBytes",description:"Available memory in bytes"}],disk:[{name:"enabled",description:"Whether disk monitoring is enabled"},{name:"status",description:"Current disk monitor status"},{name:"pressureMode",description:"Normal, manual, or automatic pressure mode"},{name:"manualPressureMode",description:"Whether manual pressure mode is enabled"},{name:"automaticPressureMode",description:"Whether automatic pressure mode is active"},{name:"lastReportedAt",description:"Timestamp of the latest accepted disk report"},{name:"lastError",description:"Latest monitor or cleanup error"},{name:"warnings",description:"Current disk report warnings"},{name:"monitoredVolumeId",description:"Least-free monitored Derived Data volume id"},{name:"freeBytes",description:"Monitored Derived Data free bytes"},{name:"totalBytes",description:"Monitored Derived Data total bytes"},{name:"freeGiB",description:"Monitored Derived Data free space in GiB"},{name:"freePercent",description:"Monitored Derived Data free percentage"},{name:"usedPercent",description:"Monitored Derived Data used percentage"},{name:"effectiveThresholdBytes",description:"Current cleanup threshold in bytes"},{name:"normalThresholdGiB",description:"Global normal threshold in GiB"},{name:"pressureThresholdGiB",description:"Global pressure threshold in GiB"},{name:"pollIntervalSeconds",description:"Agent disk report cadence"},{name:"staleAfterSeconds",description:"Age at which a report is stale"},{name:"changeReason",description:"Internal reason for the monitor event"},{name:"volumes",description:"All reported volumes and their monitor status"}],cleanup:[{name:"jobId",description:"Automatic cleanup agent job id"},{name:"status",description:"Automatic cleanup terminal status"},{name:"source",description:"Cleanup source"},{name:"error",description:"Cleanup error, if any"},{name:"targets",description:"Derived Data entries selected for cleanup"},{name:"deleted",description:"Derived Data entries reported deleted"}],ticket:[{name:"key",description:"Jira issue key (e.g. AIDE-42)"},{name:"projectKey",description:"Jira project key"},{name:"title",description:"Issue summary / title"},{name:"type",description:"Issue type (Bug, Story, …)"},{name:"status",description:"Workflow status name"},{name:"statusId",description:"Workflow status id"},{name:"statusCategory",description:"Status category (To Do, Done, …)"},{name:"assignee",description:"Assigned user"},{name:"assigneeAccountId",description:"Assigned Jira account id"},{name:"labels",description:"Issue labels"},{name:"sprintNames",description:"Sprints containing the issue"},{name:"url",description:"Jira issue URL"}],pr:[{name:"id",description:"Pull request id"},{name:"number",description:"Pull request number"},{name:"state",description:"Open / closed / merged state"},{name:"merged",description:"Whether the pull request was merged"},{name:"title",description:"Pull request title"},{name:"url",description:"Pull request URL"},{name:"labels",description:"Pull request labels"},{name:"isDraft",description:"Whether the pull request is a draft"},{name:"headBranch",description:"Pull request head branch"},{name:"headRefName",description:"Pull request head ref"},{name:"headSha",description:"Pull request head commit SHA"},{name:"baseBranch",description:"Pull request base branch"},{name:"reviewDecision",description:"Latest review decision"},{name:"pipelineStatus",description:"Combined pull request check status"},{name:"pipelines",description:"CI pipelines linked to the pull request"},{name:"reviewThreads",description:"Pull request review threads"},{name:"mergeable",description:"Pull request mergeability"},{name:"repositoryGithubId",description:"GitHub repository id"},{name:"repositoryNameWithOwner",description:"GitHub owner and repository name"},{name:"jiraKey",description:"Jira key linked to the pull request"},{name:"unresolvedThreads",description:"Unresolved review threads"}],worktree:[{name:"id",description:"Worktree id"},{name:"branch",description:"Worktree branch"},{name:"baseBranch",description:"Base branch the work targets"},{name:"path",description:"Filesystem path"},{name:"headSha",description:"Worktree HEAD commit SHA"},{name:"pushStatus",description:"Push readiness status"},{name:"upstream",description:"Tracked upstream branch"},{name:"syncState",description:"Relationship to the tracked branch"},{name:"ahead",description:"Commits ahead of upstream"},{name:"behind",description:"Commits behind upstream"},{name:"baseAhead",description:"Commits ahead of the base branch"},{name:"baseBehind",description:"Commits behind the base branch"},{name:"commits",description:"Commits on the branch"},{name:"changes",description:"Pending file changes"},{name:"branchChanges",description:"Files changed from the base branch"},{name:"commitsTruncated",description:"Whether commit results were truncated"},{name:"changesTruncated",description:"Whether pending changes were truncated"},{name:"branchChangesTruncated",description:"Whether branch change results were truncated"},{name:"dirty",description:"Whether the working tree has changes"},{name:"branches",description:"Local and remote Git branches"},{name:"branchesTruncated",description:"Whether branch results were truncated"},{name:"stashes",description:"Git stashes"},{name:"stashesTruncated",description:"Whether stash results were truncated"},{name:"rebaseInProgress",description:"Whether a rebase is in progress"},{name:"hasConflicts",description:"Whether Git reports conflicts"},{name:"conflicted",description:"Whether an inspection found conflicts"},{name:"conflicts",description:"Conflicting files"},{name:"missingAt",description:"When the worktree was found missing"},{name:"dirtySince",description:"When the worktree became dirty"}],pipeline:[{name:"id",description:"CI pipeline id"},{name:"runId",description:"CI run id"},{name:"workflowId",description:"CI workflow id"},{name:"name",description:"CI workflow name"},{name:"displayTitle",description:"CI run display title"},{name:"status",description:"Run status"},{name:"conclusion",description:"Run conclusion"},{name:"headBranch",description:"Branch built by the CI run"},{name:"headSha",description:"Commit built by the CI run"},{name:"pullRequests",description:"Pull requests linked to the CI run"},{name:"url",description:"CI run URL"},{name:"failedJobs",description:"Failed jobs"},{name:"jobs",description:"Jobs in the CI run"},{name:"checkSuiteId",description:"GitHub check suite id"},{name:"runNumber",description:"GitHub Actions run number"},{name:"runAttempt",description:"GitHub Actions run attempt"},{name:"jiraKey",description:"Jira key inferred from the run"}],build:[{name:"id",description:"Build id"},{name:"status",description:"Build status"},{name:"action",description:"Build action"},{name:"error",description:"Build error, if any"},{name:"artifactDirectory",description:"Build artifact directory"},{name:"testSummary",description:"Test result summary"},{name:"tests",description:"Individual test results"},{name:"coverageSummary",description:"Coverage summary"},{name:"coverageFiles",description:"Per-file coverage results"},{name:"changedCoverageFiles",description:"Coverage for files changed on the branch"},{name:"artifacts",description:"Exported build artifacts"},{name:"exportId",description:"Build export id"}],run:[{name:"id",description:"Agent run id"},{name:"kind",description:"Run kind (PLAN / SESSION)"},{name:"status",description:"Run status"},{name:"phase",description:"Run phase"},{name:"origin",description:"Run origin"},{name:"provider",description:"AI provider"},{name:"model",description:"AI model"},{name:"branch",description:"Branch used by the run"},{name:"finalOutput",description:"Final output text"},{name:"error",description:"Run error, if any"},{name:"usage",description:"Token usage and cost"},{name:"questions",description:"Questions asked by the run"},{name:"events",description:"Run events"},{name:"links",description:"Resources linked to the run"}],steps:[{name:"status",description:"Step completion status"},{name:"output",description:"Step output payload"},{name:"answer",description:"Human answer for the step"},{name:"snapshotId",description:"Captured snapshot id"},{name:"items",description:"Items produced for iteration"},{name:"commandRunId",description:"Command run id"},{name:"displayNumber",description:"Resource display number"}],comment:[{name:"id",description:"Comment id"},{name:"body",description:"Comment body"},{name:"author",description:"Comment author"}],push:[{name:"ref",description:"Pushed Git ref"},{name:"before",description:"Commit before the push"},{name:"after",description:"Commit after the push"}],job:[{name:"id",description:"Job id"},{name:"name",description:"Job name"},{name:"status",description:"Job status"},{name:"url",description:"Job URL"},{name:"runAttempt",description:"Workflow run attempt"}]},ip=new Map(Object.entries(id).flatMap(([e,t])=>t.map(t=>[`${e}.${t.name}`,t.description])));function ih(e){return e.split(".")[0]??e}let im=e1.object({workflowId:e1.string().min(1).describe("Workflow id.")}),ig=e1.object({x:e1.number(),y:e1.number()}).describe("Canvas position. Presentation only — omit it and a sensible spot is chosen."),iy=e1.record(e1.string(),e1.unknown()).describe("Config object for this kind. Call describe_workflow_kind for its schema. A value may be a constant, a session binding `{source:'SESSION',path:'ticket.key'}`, or a string with `{{ticket.key}}` interpolation."),iv=e1.array(e1.string()).max(100).describe("Extra session paths this step guarantees, on top of what its kind always provides. Required when a step writes to a config-chosen path — e.g. a CONTROL_SET_VARIABLE with `path: 'checks.ready'` must declare ['checks.ready'], or a later step binding it fails validation with REQUIREMENT_UNSATISFIED."),iw=e1.array(e1.string()).max(100).describe("Extra session paths this step demands, on top of its kind's own. Publishing fails unless every trigger that reaches the step guarantees them."),ib=e1.object({severity:e1.enum(["ERROR","WARNING"]),code:e1.string(),message:e1.string(),nodeId:e1.string().nullable(),triggerId:e1.string().nullable(),path:e1.string().nullable()}),ik=e1.object({workflowId:e1.string(),definition:e1.unknown().describe("The saved draft definition."),valid:e1.boolean().describe("Whether the draft would publish. Warnings do not block."),diagnostics:e1.array(ib),nodeId:e1.string().nullable().describe("Id of a step this call created."),triggerId:e1.string().nullable().describe("Id of a trigger this call created."),edgeId:e1.string().nullable().describe("Id of a connection this call created.")}),ix=e1.object({id:e1.string(),name:e1.string(),description:e1.string(),enabled:e1.boolean(),overlapPolicy:e1.string(),maxConcurrentRuns:e1.number(),activeVersionId:e1.string().nullable(),draftSchemaVersion:e1.number(),quickActionKind:e1.enum(["STANDARD","MERGE_CONFLICT","GITHUB_ACTIONS","NONE"]),archivedAt:e1.string().nullable(),versionCount:e1.number(),runCount:e1.number(),createdAt:e1.string().nullable(),updatedAt:e1.string().nullable()}),iS=e1.object({id:e1.string(),displayNumber:e1.number(),workflowId:e1.string(),versionId:e1.string(),parentRunId:e1.string().nullable(),triggerKind:e1.string(),triggerSubjectKey:e1.string(),triggerPayload:e1.unknown(),status:e1.string(),phase:e1.string(),generation:e1.number(),sessionData:e1.unknown(),blockedReason:e1.string().nullable(),error:e1.string().nullable(),attemptCount:e1.number(),eventCount:e1.number(),queuedAt:e1.string().nullable(),startedAt:e1.string().nullable(),pausedAt:e1.string().nullable(),finishedAt:e1.string().nullable(),updatedAt:e1.string().nullable()}),iI=e1.object({id:e1.string(),runId:e1.string(),attemptId:e1.string().nullable(),sequence:e1.number(),type:e1.string(),message:e1.string(),detail:e1.unknown(),createdAt:e1.string().nullable()}),iE=e1.object({batchId:e1.string(),runId:e1.string().nullable(),status:e1.string(),createdAt:e1.string().nullable(),questions:e1.array(e1.object({id:e1.string(),header:e1.string().nullable(),prompt:e1.string(),multiSelect:e1.boolean(),allowCustom:e1.boolean(),options:e1.array(e1.object({label:e1.string(),description:e1.string().nullable()}))}))}),iA={readOnlyHint:!1,destructiveHint:!0,idempotentHint:!1,openWorldHint:!0};function i_(e,t){return!t||e.toLowerCase().includes(t.toLowerCase())}async function iC(e,t){let r=await e().get(t);if(!r)throw Error(`Workflow ${t} was not found`);return(0,ii.parseWorkflowDefinition)(JSON.parse(r.draftDefinitionJson))}async function iT(e,t,r,i={}){let a=e();await a.saveDraft({id:t,definition:r});let{valid:n,diagnostics:s}=await a.validateDraft(t);return{workflowId:t,definition:t8(r),valid:n,diagnostics:s.map(e=>({severity:e.severity,code:e.code,message:e.message,nodeId:e.nodeId??null,triggerId:e.triggerId??null,path:e.path??null})),nodeId:i.nodeId??null,triggerId:i.triggerId??null,edgeId:i.edgeId??null}}function iR(e){let t=ii.WORKFLOW_TRIGGER_CATALOG.find(t=>t.kind===e);if(!t)throw Error(`Unknown trigger kind ${e}`);return t}let iD={readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},iN={readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},iO={readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1};function iP(e){return{name:e.name,title:e.title,description:e.description,inputSchema:e.inputSchema,outputSchema:e.outputSchema,annotations:e.annotations??iD,invoke:async t=>{let r=e.inputSchema.parse(t);return e.outputSchema.parse(await e.handler(r))}}}function i$(e){return{id:e.id,name:e.name,source:"BUILTIN",transport:null,url:null,error:null,tools:e.tools.map(e=>({name:e.name,title:e.title,description:e.description,inputSchema:b.toJSONSchema(e.inputSchema),outputSchema:b.toJSONSchema(e.outputSchema)})),children:e.children.map(i$)}}function iU(e){if(!e||"object"!=typeof e||Array.isArray(e))throw Error("Built-in tool output must be a JSON object");return{content:[{type:"text",text:JSON.stringify(e,null,2)}],structuredContent:e}}class iB{groups;indexed;byName;groupIds;constructor(e){this.groups=e,this.indexed=function e(t){return t.flatMap(t=>[...t.tools.map(e=>({groupId:t.id,definition:e})),...e(t.children)])}(e),this.byName=new Map,this.groupIds=new Set;const t=e=>{if(this.groupIds.has(e.id))throw Error(`Duplicate built-in tool group id: ${e.id}`);this.groupIds.add(e.id),e.children.forEach(t)};for(const r of(e.forEach(t),this.indexed)){if(this.byName.has(r.definition.name))throw Error(`Duplicate built-in MCP tool name: ${r.definition.name}`);this.byName.set(r.definition.name,r)}}definitions(){return this.indexed.map(({definition:e})=>e)}catalog(){return this.groups.map(i$)}hasGroup(e){return this.groupIds.has(e)}async call(e,t,r){let i=this.byName.get(t);if(!i||i.groupId!==e)throw Error(`Unknown built-in tool: ${t}`);return iU(await i.definition.invoke(r))}async callByName(e,t){let r=this.byName.get(e);if(!r)throw Error(`Unknown built-in tool: ${e}`);return iU(await r.definition.invoke(t))}}let ij="external:",iL=new Set(["accept","connection","content-length","content-type","host","last-event-id","mcp-protocol-version","mcp-session-id","transfer-encoding"]);function iM(e){if("STREAMABLE_HTTP"===e||"SSE"===e)return e;throw Error(`Unsupported MCP transport: ${e}`)}function iq(e,t){return{id:e.id,name:e.name,url:e.url,transport:iM(e.transport),toolNamePrefix:e.toolNamePrefix,headers:[...e.headers].sort((e,t)=>e.name.localeCompare(t.name)).map(e=>({id:e.id,name:e.name,valueConfigured:t})),createdAt:e.createdAt.toISOString(),updatedAt:e.updatedAt.toISOString()}}class iF{credentials;builtInTools;constructor(e,t,r={},i=new tQ.CredentialService){this.credentials=i,this.builtInTools=function(e){var t,r,i,a,n,s,o,l;let u,d,p,h,m=[(t=e.codebaseTools,r=e.codebases,u=[iP({name:"get_codebases",title:"Get codebases",description:"List every registered codebase checkout.",inputSchema:c.GetCodebasesInputSchema,outputSchema:c.GetCodebasesOutputSchema,annotations:iD,handler:async()=>({codebases:await t.list()})}),iP({name:"get_codebase",title:"Get codebase",description:"Get one registered codebase by ID or exact folder path.",inputSchema:c.GetCodebaseInputSchema,outputSchema:c.GetCodebaseOutputSchema,annotations:iD,handler:async e=>({codebase:"id"in e?await t.getById(e.id):e.agentId?await t.getByPath(e.path,e.agentId):await t.getByPath(e.path)})})],r&&(u.splice(1,0,iP({name:"search_codebases",title:"Search codebases",description:"Search registered codebases by text, agent, repository, branch, availability, or sync state.",inputSchema:c.SearchCodebasesInputSchema,outputSchema:c.SearchCodebasesOutputSchema,annotations:iD,handler:e=>t.search(e)})),u.push(iP({name:"get_codebase_repositories",title:"Get codebase repositories",description:"List canonical repositories and their checkout counts.",inputSchema:rl,outputSchema:c.GetCodebaseRepositoriesOutputSchema,annotations:iD,handler:async()=>({repositories:await t.repositories()})}),iP({name:"get_codebase_repository",title:"Get codebase repository",description:"Get a canonical repository and all of its registered checkouts.",inputSchema:c.GetCodebaseRepositoryInputSchema,outputSchema:c.GetCodebaseRepositoryOutputSchema,annotations:iD,handler:async({id:e})=>({repository:await t.repository(e)})}),iP({name:"get_codebase_settings",title:"Get codebase settings",description:"Get global codebase refresh, fetch, and branch settings.",inputSchema:rl,outputSchema:rc,annotations:iD,handler:async()=>{let e=await r.settings();return{settings:{refreshIntervalSeconds:e.refreshIntervalSeconds,fetchIntervalSeconds:e.fetchIntervalSeconds,defaultJiraBranchRegex:e.defaultJiraBranchRegex,updatedAt:e.updatedAt.toISOString()}}}}),iP({name:"browse_agent_directory",title:"Browse agent directory",description:"List candidate repository folders on an enrolled agent.",inputSchema:ru,outputSchema:rd,annotations:iD,handler:async({agentId:e,path:t,requestId:i})=>({listing:await r.browse(e,t,i)})}),iP({name:"inspect_agent_codebase",title:"Inspect agent codebase",description:"Inspect a repository folder without registering or changing it.",inputSchema:rp,outputSchema:rh,annotations:iD,handler:async({agentId:e,folder:t,requestId:i})=>({inspection:t8(await r.inspect(e,t,i))})}),iP({name:"refresh_codebases",title:"Refresh codebases",description:"Queue local metadata refreshes for registered codebases.",inputSchema:rm,outputSchema:rf,annotations:iN,handler:async({codebaseIds:e,requestId:t})=>{let i=await r.runOperation(ro.CODEBASE_REFRESH_JOB_KIND,e,t);return{jobs:i.jobs.map(e=>t6(e)),skipped:i.skipped}}}),iP({name:"fetch_codebases",title:"Fetch codebases",description:"Queue remote Git fetches and configured base-branch updates.",inputSchema:rm,outputSchema:rf,annotations:{...iN,openWorldHint:!0},handler:async({codebaseIds:e,requestId:t})=>{let i=await r.runOperation(ro.CODEBASE_FETCH_JOB_KIND,e,t);return{jobs:i.jobs.map(e=>t6(e)),skipped:i.skipped}}}),iP({name:"inspect_codebase_git_state",title:"Inspect codebase Git state",description:"Inspect branches, checkout locations, and stashes.",inputSchema:rg,outputSchema:ry,annotations:iD,handler:async({codebaseId:e,requestId:t})=>({state:await r.inspectGitState(e,t)})}),iP({name:"inspect_codebase_stash",title:"Inspect codebase stash",description:"Read a bounded textual patch for a Git stash.",inputSchema:rv,outputSchema:rw,annotations:iD,handler:async({codebaseId:e,stashOid:t,requestId:i})=>({diff:await r.inspectStash(e,t,i)})}))),{id:"builtin:codebases",name:"Codebases",tools:u,children:[]})];return e.builds&&m.push((i=e.builds,{id:"builtin:builds",name:"Builds",children:[],tools:[iP({name:"get_builds",title:"Get builds",description:"List immutable iOS build records.",inputSchema:rs.GetBuildsInputSchema,outputSchema:rs.GetBuildsOutputSchema,annotations:iD,handler:async e=>{let t=await i.builds(e);return{builds:t.items,nextCursor:t.nextCursor}}}),iP({name:"get_build",title:"Get build",description:"Get a build with sanitized logs.",inputSchema:rs.GetBuildInputSchema,outputSchema:rs.GetBuildOutputSchema,annotations:iD,handler:async({buildId:e,afterLogId:t,logLimit:r})=>{let a=await i.getBuild(e);if(!a)throw Error("Build not found");return{build:a,logs:await i.logChunks(e,t,r)}}}),iP({name:"get_build_configurations",title:"Get build configurations",description:"List build configurations for a worktree.",inputSchema:rs.GetBuildConfigurationsInputSchema,outputSchema:rs.GetBuildConfigurationsOutputSchema,annotations:iD,handler:async({worktreeId:e})=>({project:await i.projectForWorktree(e)})}),iP({name:"get_build_destinations",title:"Get build destinations",description:"Inspect compatible build destinations.",inputSchema:rs.GetBuildDestinationsInputSchema,outputSchema:rs.GetBuildDestinationsOutputSchema,annotations:iD,handler:async e=>({destinations:"buildId"in e?await i.destinationsForBuild(e.buildId,e.requestId):await i.destinations(e)})}),iP({name:"start_build",title:"Start build",description:"Queue an iOS build.",inputSchema:rs.StartBuildToolInputSchema,outputSchema:rs.StartBuildToolOutputSchema,annotations:iN,handler:async e=>({build:await i.startBuild(e)})}),iP({name:"cancel_build",title:"Cancel build",description:"Cancel an active build.",inputSchema:rs.CancelBuildToolInputSchema,outputSchema:rs.CancelBuildToolOutputSchema,annotations:iO,handler:async({buildId:e})=>({build:await i.cancelBuild(e)})}),iP({name:"run_build",title:"Run build",description:"Install and launch without rebuilding.",inputSchema:rs.RunBuildToolInputSchema,outputSchema:rs.RunBuildToolOutputSchema,annotations:iN,handler:async e=>({deployments:await i.runBuild(e)})}),iP({name:"export_build_archive",title:"Export build archive",description:"Export an archive to a local IPA folder.",inputSchema:rs.ExportBuildToolInputSchema,outputSchema:rs.ExportBuildToolOutputSchema,annotations:iN,handler:async e=>({export:await i.exportArchive(e)})})]})),e.telemetry&&e.pushNotifications&&m.push((a=e.telemetry,n=e.pushNotifications,(d=rz(a,"UNIFIED",{plural:"unified_events",singular:"unified_event",label:"Unified Events"})).push(iP({name:"get_telemetry_separators",title:"Get telemetry separators",description:"List global manual and build separators with optional filters.",inputSchema:e1.object({first:e1.number().int().min(1).max(500).default(100),after:e1.string().nullable().default(null),kind:e1.string().min(1).nullable().optional(),name:e1.string().min(1).nullable().optional(),buildId:e1.string().min(1).nullable().optional()}),outputSchema:e1.object({items:e1.array(rU),nextCursor:e1.string().nullable()}),annotations:iD,handler:e=>a.separators(e)}),iP({name:"add_telemetry_separator",title:"Add telemetry separator",description:"Add a global manual separator to all telemetry views.",inputSchema:e1.object({name:e1.string().max(100).nullable().default(null)}),outputSchema:e1.object({separator:rU}),annotations:{...iN,idempotentHint:!1},handler:async({name:e})=>({separator:await a.addSeparator(e)})}),iP({name:"get_telemetry_settings",title:"Get telemetry settings",description:"Get telemetry collection state and effective ingestion URLs.",inputSchema:e1.object({}),outputSchema:e1.object({settings:e1.object({localBaseUrlOverride:e1.string().nullable(),remoteBaseUrlOverride:e1.string().nullable(),consoleCollectionEnabled:e1.boolean(),analyticsCollectionEnabled:e1.boolean(),detectedLocalBaseUrl:e1.string(),detectedRemoteBaseUrl:e1.string(),effectiveLocalBaseUrl:e1.string(),effectiveRemoteBaseUrl:e1.string(),updatedAt:e1.string()})}),annotations:iD,handler:async()=>({settings:await a.settings()})})),{id:"builtin:debugging",name:"Debugging",tools:d,children:[{id:"builtin:debugging:console-logs",name:"Console Logs",tools:rz(a,"CONSOLE",{plural:"console_logs",singular:"console_log",label:"Console Logs"}),children:[]},{id:"builtin:debugging:analytics-events",name:"Analytics Events",tools:rz(a,"ANALYTICS",{plural:"analytics_events",singular:"analytics_event",label:"Analytics Events"}),children:[]},(p={...iN,openWorldHint:!0},{id:"builtin:debugging:push-notifications",name:"Push Notifications",children:[],tools:[iP({name:"get_push_notification_registrations",title:"Get push notification registrations",description:"List registered APNs devices with masked tokens.",inputSchema:e1.object({}),outputSchema:e1.object({registrations:e1.array(rS)}),annotations:iD,handler:async()=>({registrations:(await n.registrations()).map(e=>{let t,r;return t=Array.isArray(e.supportedPushTypes)?e.supportedPushTypes:rx(e.pushTypesJson),r="string"==typeof e.token?e.token:"",{id:String(e.id),clientRegistrationId:String(e.clientRegistrationId),tokenMasked:"string"==typeof e.tokenMasked?e.tokenMasked:r?`${r.slice(0,8)}…${r.slice(-8)}`:"—",topic:String(e.topic),environment:String(e.environment),supportedPushTypes:Array.isArray(t)?t:[],displayName:String(e.displayName),deviceModel:"string"==typeof e.deviceModel?e.deviceModel:null,osVersion:"string"==typeof e.osVersion?e.osVersion:null,appVersion:"string"==typeof e.appVersion?e.appVersion:null,appBuild:"string"==typeof e.appBuild?e.appBuild:null,locale:"string"==typeof e.locale?e.locale:null,pushMagicConfigured:!!e.pushMagic,status:String(e.status),invalidatedAt:rk(e.invalidatedAt),lastFailureReason:"string"==typeof e.lastFailureReason?e.lastFailureReason:null,lastFailureAt:rk(e.lastFailureAt),lastRegisteredAt:rk(e.lastRegisteredAt),lastSentAt:rk(e.lastSentAt),createdAt:rk(e.createdAt),updatedAt:rk(e.updatedAt)}})})}),iP({name:"get_push_notification_settings",title:"Get push notification settings",description:"Inspect APNs credential status without returning secrets.",inputSchema:e1.object({}),outputSchema:e1.object({settings:rE}),annotations:iD,handler:async()=>{var e;return{settings:{tokenConfigured:!!(e=await n.settings()).tokenConfigured,tokenTeamId:"string"==typeof e.tokenTeamId?e.tokenTeamId:null,tokenKeyId:"string"==typeof e.tokenKeyId?e.tokenKeyId:null,tokenPrivateKeyFingerprint:"string"==typeof e.tokenPrivateKeyFingerprint?e.tokenPrivateKeyFingerprint:null,tokenConfiguredAt:rk(e.tokenConfiguredAt),tokenLastUsedAt:rk(e.tokenLastUsedAt),tokenLastError:"string"==typeof e.tokenLastError?e.tokenLastError:null,certificates:Array.isArray(e.certificates)?e.certificates.map(e=>({id:String(e.id),name:String(e.name),topic:String(e.topic),environment:String(e.environment),fingerprint:String(e.fingerprint),expiresAt:rk(e.expiresAt),lastTestedAt:rk(e.lastTestedAt),lastError:"string"==typeof e.lastError?e.lastError:null,createdAt:rk(e.createdAt),updatedAt:rk(e.updatedAt)})):[],updatedAt:rk(e.updatedAt)}}}}),iP({name:"get_push_notification_channels",title:"Get push notification channels",description:"List configured APNs broadcast channels.",inputSchema:e1.object({}),outputSchema:e1.object({channels:e1.array(rA)}),annotations:iD,handler:async()=>({channels:(await n.channels()).map(e=>({id:String(e.id),channelId:String(e.channelId),bundleId:String(e.bundleId),environment:String(e.environment),storagePolicy:String(e.storagePolicy),createdAt:rk(e.createdAt),updatedAt:rk(e.updatedAt)}))})}),iP({name:"get_push_notification_presets",title:"Get push notification presets",description:"List saved, validated push editor presets.",inputSchema:e1.object({}),outputSchema:e1.object({presets:e1.array(r_)}),annotations:iD,handler:async()=>({presets:(await n.presets()).map(e=>({id:String(e.id),name:String(e.name),editor:rx(e.editor??e.editorJson),createdAt:rk(e.createdAt),updatedAt:rk(e.updatedAt)}))})}),iP({name:"get_push_notification_history",title:"Get push notification history",description:"List recent push batches and per-recipient delivery results.",inputSchema:e1.object({limit:e1.number().int().min(1).max(200).default(100)}),outputSchema:e1.object({batches:e1.array(rT)}),annotations:iD,handler:async({limit:e})=>({batches:(await n.history(e)).map(e=>rR(e))})}),iP({name:"get_push_notification_history_item",title:"Get push notification history item",description:"Get one push batch and all delivery results by ID.",inputSchema:e1.object({id:e1.string().min(1)}),outputSchema:e1.object({batch:rT.nullable()}),annotations:iD,handler:async({id:e})=>{let t=await n.historyItem(e);return{batch:t?rR(t):null}}}),iP({name:"preview_push_notification",title:"Preview push notification",description:"Validate an editor and return its final payload and APNs headers.",inputSchema:e1.object({editor:e1.record(e1.string(),e1.unknown())}),outputSchema:e1.object({editor:e1.unknown(),payload:e1.unknown(),headers:e1.record(e1.string(),e1.string()),byteLength:e1.number().int().nonnegative()}),annotations:iD,handler:({editor:e})=>(0,rb.validatePushEditor)(e)}),iP({name:"send_push_notification",title:"Send push notification",description:"Validate and queue a raw APNs editor payload for delivery.",inputSchema:rO,outputSchema:e1.object({batch:rT}),annotations:p,handler:async e=>({batch:rR(await n.send(r$(e)))})}),iP({name:"send_push_notification_preset",title:"Send push notification preset",description:"Load a saved preset by ID and queue it for APNs delivery.",inputSchema:rP,outputSchema:e1.object({batch:rT}),annotations:p,handler:async e=>{let t=await n.preset(e.presetId);if(!t)throw Error("Push notification preset not found");let r={...e,editor:rx(t.editorJson)};return{batch:rR(await n.send(r$(r)))}}}),iP({name:"resend_push_notification",title:"Resend push notification",description:"Queue a historical non-draft, non-direct batch again.",inputSchema:e1.object({id:e1.string().min(1),requestId:e1.string().min(1)}),outputSchema:e1.object({batch:rT}),annotations:p,handler:async({id:e,requestId:t})=>({batch:rR(await n.resend(e,t))})})]})]})),e.agents&&m.push((s=e.agents,{id:"builtin:agents",name:"Agents",children:[],tools:[iP({name:"get_agents",title:"Get agents",description:"List enrolled agents, capabilities, resources, and status.",inputSchema:re,outputSchema:e1.object({agents:e1.array(rt)}),annotations:iD,handler:async()=>({agents:(await s.listAgents()).map(e=>t3(e))})}),iP({name:"get_agent",title:"Get agent",description:"Get one enrolled agent by ID.",inputSchema:rn,outputSchema:e1.object({agent:rt.nullable()}),annotations:iD,handler:async({agentId:e})=>{let t=await s.getAgent(e);return{agent:t?t3(t):null}}}),iP({name:"get_agent_settings",title:"Get agent settings",description:"Get repository, build, and Derived Data paths for an agent.",inputSchema:rn,outputSchema:e1.object({settings:rr}),annotations:iD,handler:async({agentId:e})=>{let t=await s.getAgent(e);if(!t)throw Error("Agent not found");return{settings:t4(t)}}}),iP({name:"get_agent_jobs",title:"Get agent jobs",description:"List recent user-visible jobs for an agent.",inputSchema:e1.object({agentId:e1.string().min(1),limit:e1.number().int().min(1).max(200).default(50)}),outputSchema:e1.object({jobs:e1.array(ri)}),annotations:iD,handler:async({agentId:e,limit:t})=>({jobs:(await s.listJobs(e,t)).map(e=>t6(e))})}),iP({name:"get_agent_job",title:"Get agent job",description:"Get one agent job and its result by ID.",inputSchema:e1.object({jobId:e1.string().min(1)}),outputSchema:e1.object({job:ri.nullable()}),annotations:iD,handler:async({jobId:e})=>{let t=await s.getJob(e);return{job:t?t6(t):null}}}),iP({name:"get_agent_job_logs",title:"Get agent job logs",description:"Fetch ordered job logs after an optional sequence number.",inputSchema:e1.object({jobId:e1.string().min(1),afterSequence:e1.number().int().min(-1).default(-1)}),outputSchema:e1.object({logs:e1.array(ra)}),annotations:iD,handler:async({jobId:e,afterSequence:t})=>({logs:(await s.listLogs(e,t)).map(e=>({id:String(e.id),jobId:String(e.jobId),sequence:Number(e.sequence),stream:String(e.stream),message:String(e.message),createdAt:t2(e.createdAt)}))})}),iP({name:"update_agent_base_repo_directory",title:"Update agent base repository directory",description:"Set or reset the absolute base repository directory.",inputSchema:e1.object({agentId:e1.string().min(1),baseRepoDirectory:e1.string().min(1).nullable()}),outputSchema:e1.object({settings:rr}),annotations:iN,handler:async({agentId:e,baseRepoDirectory:t})=>({settings:t4(await s.updateBaseRepoDirectory(e,t))})}),iP({name:"update_agent_builds_directory",title:"Update agent builds directory",description:"Set or reset the absolute build-output directory.",inputSchema:e1.object({agentId:e1.string().min(1),buildsDirectory:e1.string().min(1).nullable()}),outputSchema:e1.object({settings:rr}),annotations:iN,handler:async({agentId:e,buildsDirectory:t})=>({settings:t4(await s.updateBuildsDirectory(e,t))})}),iP({name:"update_agent_derived_data_settings",title:"Update agent Derived Data settings",description:"Set default, absolute, or worktree-relative Derived Data paths.",inputSchema:e1.object({agentId:e1.string().min(1),mode:e1.enum(["DEFAULT","ABSOLUTE","RELATIVE"]),path:e1.string().min(1).nullable().default(null)}),outputSchema:e1.object({settings:rr}),annotations:iN,handler:async({agentId:e,mode:t,path:r})=>({settings:t4(await s.updateDerivedDataSettings(e,t,r))})}),iP({name:"request_agent_codebase_reconcile",title:"Request agent codebase reconcile",description:"Ask an online agent to reconcile its registered codebases.",inputSchema:rn,outputSchema:e1.object({requested:e1.boolean()}),annotations:iN,handler:async({agentId:e})=>({requested:await s.requestCodebaseReconcile([e])===1})}),iP({name:"cancel_agent_job",title:"Cancel agent job",description:"Cancel a queued or running agent job.",inputSchema:e1.object({jobId:e1.string().min(1)}),outputSchema:e1.object({job:ri}),annotations:iO,handler:async({jobId:e})=>({job:t6(await s.cancelJob(e))})})]})),e.diskSpace&&m.push((o=e.diskSpace,{id:"builtin:disk-space",name:"Disk Space",children:[],tools:[iP({name:"get_disk_space_overview",title:"Get disk-space overview",description:"Get global thresholds and canonical Derived Data disk snapshots for every agent.",inputSchema:e1.object({}),outputSchema:e1.object({settings:r8,agents:e1.array(it)}),annotations:iD,handler:async()=>{let e=await o.overview();return{settings:e.settings,agents:e.agents.map(t=>r1(e.settings,t))}}}),iP({name:"get_disk_space_settings",title:"Get disk-space settings",description:"Get global disk thresholds and report timing settings.",inputSchema:e1.object({}),outputSchema:e1.object({settings:r8}),annotations:iD,handler:async()=>({settings:await o.settings()})}),iP({name:"get_agent_disk_space",title:"Get agent disk space",description:"Get one agent's canonical Derived Data disk-space monitor snapshot.",inputSchema:ir,outputSchema:e1.object({snapshot:it}),annotations:iD,handler:async({agentId:e})=>({snapshot:await o.snapshot(e)})}),iP({name:"update_disk_space_settings",title:"Update disk-space settings",description:"Update the global normal and pressure free-space thresholds in GiB.",inputSchema:e1.object({normalThresholdGiB:e1.number().positive(),pressureThresholdGiB:e1.number().positive()}),outputSchema:e1.object({settings:r8}),annotations:iN,handler:async e=>({settings:await o.updateSettings(e)})}),iP({name:"set_agent_disk_space_monitoring",title:"Set agent disk-space monitoring",description:"Enable or disable Derived Data disk-space monitoring for an agent.",inputSchema:ir.extend({enabled:e1.boolean()}),outputSchema:e1.object({snapshot:it}),annotations:iN,handler:async({agentId:e,enabled:t})=>(await o.setMonitoring(e,t),{snapshot:await o.snapshot(e)})}),iP({name:"set_agent_disk_space_pressure_mode",title:"Set agent disk pressure mode",description:"Enable or clear manual disk pressure mode for an agent.",inputSchema:ir.extend({enabled:e1.boolean()}),outputSchema:e1.object({snapshot:it}),annotations:iN,handler:async({agentId:e,enabled:t})=>(await o.setManualPressureMode(e,t),{snapshot:await o.snapshot(e)})}),iP({name:"request_agent_disk_space_refresh",title:"Request agent disk-space refresh",description:"Ask an agent to collect and report disk-space telemetry immediately.",inputSchema:ir,outputSchema:e1.object({agentId:e1.string(),requestedAt:e1.string(),previousReportedAt:e1.string().nullable()}),annotations:iN,handler:async({agentId:e})=>o.requestRefresh(e)})]})),e.workflows&&m.push((l=e.workflows,h={id:"builtin:workflows:discovery",name:"Discovery",children:[],tools:[iP({name:"list_workflow_step_kinds",title:"List workflow step kinds",description:"Browse the step kinds a workflow can be built from, with a short description of each. Start here when authoring; use describe_workflow_kind for the config schema of one kind.",inputSchema:e1.object({category:e1.string().optional().describe("Restrict to one category, e.g. 'Jira' or 'Control flow'."),search:e1.string().optional().describe("Match against kind, label, category, and description.")}),outputSchema:e1.object({steps:e1.array(e1.object({kind:e1.string(),category:e1.string(),label:e1.string(),description:e1.string(),execution:e1.string(),requiredPaths:e1.array(e1.string()),providedPaths:e1.array(e1.string()),sourceHandles:e1.array(e1.string()),mutatesExternal:e1.boolean(),mutatesWorktree:e1.boolean()}))}),annotations:iD,handler:({category:e,search:t})=>({steps:ii.WORKFLOW_STEP_CATALOG.filter(r=>(!e||r.category===e)&&i_(`${r.kind} ${r.label} ${r.category} ${r.description}`,t)).map(e=>({kind:e.kind,category:e.category,label:e.label,description:e.description,execution:e.execution,requiredPaths:e.requiredPaths,providedPaths:e.providedPaths,sourceHandles:e.sourceHandles,mutatesExternal:e.mutatesExternal,mutatesWorktree:e.mutatesWorktree}))})}),iP({name:"list_workflow_trigger_kinds",title:"List workflow trigger kinds",description:"Browse the trigger kinds that can start a workflow, with what each one seeds into session data. Every workflow needs at least one trigger.",inputSchema:e1.object({category:e1.string().optional(),search:e1.string().optional()}),outputSchema:e1.object({triggers:e1.array(e1.object({kind:e1.string(),category:e1.string(),label:e1.string(),description:e1.string(),seedPaths:e1.array(e1.string()),sourceHandles:e1.array(e1.string())}))}),annotations:iD,handler:({category:e,search:t})=>({triggers:ii.WORKFLOW_TRIGGER_CATALOG.filter(r=>(!e||r.category===e)&&i_(`${r.kind} ${r.label} ${r.category} ${r.description}`,t)).map(e=>({kind:e.kind,category:e.category,label:e.label,description:e.description,seedPaths:e.seedPaths,sourceHandles:e.sourceHandles}))})}),iP({name:"describe_workflow_kind",title:"Describe a workflow step or trigger kind",description:"Full detail for one kind: long-form notes on preconditions and side effects, the JSON Schema for its config, the session paths it requires and provides, and the handles edges may leave it from.",inputSchema:e1.object({kind:e1.string().min(1).describe("A step or trigger kind.")}),outputSchema:e1.object({scope:e1.enum(["step","trigger"]),kind:e1.string(),category:e1.string(),label:e1.string(),description:e1.string(),details:e1.string(),execution:e1.string().nullable(),configSchema:e1.unknown(),requiredPaths:e1.array(e1.string()),providedPaths:e1.array(e1.string()),seedPaths:e1.array(e1.string()),sourceHandles:e1.array(e1.string()),mutatesExternal:e1.boolean(),mutatesWorktree:e1.boolean()}),annotations:iD,handler:({kind:e})=>{let t=ii.WORKFLOW_STEP_CATALOG.find(t=>t.kind===e);if(t)return{scope:"step",...t,configSchema:t8(t.configSchema),seedPaths:[]};let r=iR(e);return{scope:"trigger",...r,configSchema:t8(r.configSchema),execution:null,requiredPaths:[],providedPaths:[],mutatesExternal:!1,mutatesWorktree:!1}}}),iP({name:"list_workflow_session_paths",title:"List workflow session-data paths",description:"The session-data vocabulary a step's config can bind to — concrete paths like `ticket.key` or `pr.number`, with what each holds. Use it to write bindings that resolve at run time.",inputSchema:e1.object({namespace:e1.string().optional().describe("Restrict to one namespace, e.g. 'ticket' or 'pr'.")}),outputSchema:e1.object({paths:e1.array(e1.object({path:e1.string(),description:e1.string().nullable()}))}),annotations:iD,handler:({namespace:e})=>({paths:(function(e){let t=new Map,r=e=>{t.has(e.path)||t.set(e.path,e)};for(let t of e){let e=t.trim();if(e&&"*"!==e){if(e.endsWith(".*")){let t=e.slice(0,-2),i=id[ih(t)];if(i)for(let e of i)r({path:`${t}.${e.name}`,description:e.description});else r({path:e});continue}r({path:e,description:function(e){let t=e.split(".");if(t.length<2)return;let r=t[t.length-1];return ip.get(`${ih(e)}.${r}`)}(e)})}}return[...t.values()].sort((e,t)=>e.path.localeCompare(t.path))})(e?[`${e}.*`]:[...new Set(ii.WORKFLOW_TRIGGER_CATALOG.flatMap(({seedPaths:e})=>e))]).map(({path:e,description:t})=>({path:e,description:t??null}))})}),iP({name:"get_workflow_path_availability",title:"Get workflow path availability",description:"Per step, the session paths guaranteed to exist before it runs and the ones it contributes. This is what decides whether a config binding is legal — check it before binding a step to a path.",inputSchema:im,outputSchema:e1.object({steps:e1.array(e1.object({nodeId:e1.string(),kind:e1.string(),availableBefore:e1.array(e1.string()),provides:e1.array(e1.string())})),triggerSeeds:e1.array(e1.object({triggerId:e1.string(),kind:e1.string(),seedPaths:e1.array(e1.string())})),violations:e1.array(e1.object({nodeId:e1.string(),triggerId:e1.string(),triggerName:e1.string(),path:e1.string()}))}),annotations:iD,handler:async({workflowId:e})=>{let t=await iC(l,e),r=(0,ii.computeWorkflowPathAvailability)(t);return{steps:t.nodes.map(e=>({nodeId:e.id,kind:e.kind,availableBefore:r.availableBefore.get(e.id)??[],provides:r.provides.get(e.id)??[]})),triggerSeeds:t.triggers.map(e=>({triggerId:e.id,kind:e.kind,seedPaths:["workflow.*",...iR(e.kind).seedPaths,...(0,ii.resourceManualSeedPaths)(e.kind,e.config)]})),violations:r.requirementViolations}}})]},{id:"builtin:workflows",name:"Workflows",tools:[],children:[h,{id:"builtin:workflows:authoring",name:"Authoring",children:[],tools:[iP({name:"list_workflows",title:"List workflows",description:"List workflows with their publish and enablement state.",inputSchema:e1.object({search:e1.string().optional().describe("Match name or description."),archive:e1.enum(["ACTIVE","ARCHIVED","ALL"]).optional().describe("Defaults to ACTIVE."),enabled:e1.boolean().optional(),first:e1.number().int().min(1).max(200).optional(),after:e1.string().optional().describe("Cursor from a previous page.")}),outputSchema:e1.object({workflows:e1.array(ix),nextCursor:e1.string().nullable(),totalCount:e1.number()}),annotations:iD,handler:async e=>{let t=await l().list(e);return{workflows:t.items.map(e=>t5(e)),nextCursor:t.nextCursor,totalCount:t.totalCount}}}),iP({name:"get_workflow",title:"Get workflow",description:"Read one workflow, optionally with its full draft definition — every trigger, step, and connection.",inputSchema:e1.object({workflowId:e1.string().min(1),includeDefinition:e1.boolean().optional().describe("Include the draft graph. Defaults to true.")}),outputSchema:e1.object({workflow:ix,definition:e1.unknown().nullable(),activeVersion:e1.unknown().nullable()}),annotations:iD,handler:async({workflowId:e,includeDefinition:t})=>{let r=await l().get(e);if(!r)throw Error(`Workflow ${e} was not found`);return{workflow:t5(r),definition:!1===t?null:JSON.parse(r.draftDefinitionJson),activeVersion:r.activeVersion?t9(r.activeVersion):null}}}),iP({name:"create_workflow",title:"Create workflow",description:"Create a workflow. Without a definition it starts as a draft holding one manual trigger and no steps, ready for add_workflow_step.",inputSchema:e1.object({name:e1.string().min(1).max(200),description:e1.string().max(2e3).optional(),definition:e1.unknown().optional().describe("A complete definition, e.g. from export_workflow."),overlapPolicy:e1.enum(["QUEUE","CONCURRENT","COALESCE_LATEST"]).optional().describe("What happens when a run starts while one is in flight. Defaults to QUEUE."),maxConcurrentRuns:e1.number().int().min(1).optional()}),outputSchema:e1.object({workflow:ix,definition:e1.unknown()}),annotations:iN,handler:async e=>{let t=await l().create(e);if(!t)throw Error("Workflow could not be created");return{workflow:t5(t),definition:JSON.parse(t.draftDefinitionJson)}}}),iP({name:"update_workflow_settings",title:"Update workflow settings",description:"Change a workflow's name, description, or concurrency. Name and description live inside the definition, so this rewrites the draft.",inputSchema:e1.object({workflowId:e1.string().min(1),name:e1.string().min(1).max(200).optional(),description:e1.string().max(2e3).optional(),overlapPolicy:e1.enum(["QUEUE","CONCURRENT","COALESCE_LATEST"]).optional(),maxConcurrentRuns:e1.number().int().min(1).optional()}),outputSchema:ik,annotations:iN,handler:async e=>{let t=await iC(l,e.workflowId),r={...t,name:e.name??t.name,description:e.description??t.description};return await l().saveDraft({id:e.workflowId,definition:r,overlapPolicy:e.overlapPolicy??null,maxConcurrentRuns:e.maxConcurrentRuns??null}),iT(l,e.workflowId,r)}}),iP({name:"set_workflow_enabled",title:"Enable or pause workflow",description:"Enable a workflow or pause it. A paused workflow ignores its triggers and refuses manual runs.",inputSchema:e1.object({workflowId:e1.string().min(1),enabled:e1.boolean()}),outputSchema:e1.object({workflow:ix}),annotations:iN,handler:async({workflowId:e,enabled:t})=>({workflow:t5(await l().setEnabled(e,t))})}),iP({name:"archive_workflow",title:"Archive or restore workflow",description:"Move a workflow out of the active list, or bring it back. Reversible — use delete_workflow to remove it for good.",inputSchema:e1.object({workflowId:e1.string().min(1),archived:e1.boolean()}),outputSchema:e1.object({workflow:ix}),annotations:iN,handler:async({workflowId:e,archived:t})=>({workflow:t5(await l().archive(e,t))})}),iP({name:"delete_workflow",title:"Delete workflow",description:"Permanently delete a workflow and its published versions. Refused once the workflow has run history — archive_workflow is the way to retire one that has run. Not reversible.",inputSchema:e1.object({workflowId:e1.string().min(1)}),outputSchema:e1.object({deleted:e1.boolean()}),annotations:iO,handler:async({workflowId:e})=>({deleted:await l().delete(e)})}),iP({name:"add_workflow_step",title:"Add workflow step",description:"Add a step to the draft and optionally wire it to an existing trigger or step. Returns the new step's id and the validator's view of the result.",inputSchema:e1.object({workflowId:e1.string().min(1),kind:e1.enum(ia.WORKFLOW_STEP_KINDS).describe("Step kind. See list_workflow_step_kinds."),name:e1.string().max(200).optional().describe("Display name. Defaults to the kind's label."),config:iy.optional(),connectFrom:e1.object({from:e1.string().min(1).describe("Trigger or step id this one follows."),sourceHandle:e1.string().optional().describe("Handle to leave from — 'success' by default, 'true'/'false' on an If, 'body'/'empty' on a For each, an option key on a choice trigger.")}).optional(),position:ig.optional(),failurePolicy:e1.enum(["FAIL","CONTINUE"]).optional().describe("CONTINUE lets the run carry on past a failure."),retry:e1.object({maxAttempts:e1.number().int().min(1).max(20),strategy:e1.enum(["FIXED","EXPONENTIAL"]),delaySeconds:e1.number().int().min(1).max(86400)}).optional(),providedPaths:iv.optional(),requiredPaths:iw.optional()}),outputSchema:ik,annotations:iN,handler:async e=>{let t=function(e,t){let r=is(e,"node"),i={id:r,kind:t.kind,name:t.name??void 0,position:t.position??function(e,t){let r=t?io(e,t):void 0,i=r?r.position.x+320:320,a=r?r.position.y:120,n=[...e.nodes,...e.triggers].filter(e=>160>Math.abs(e.position.x-i)).map(e=>e.position.y),s=a;for(;n.some(e=>80>Math.abs(e-s));)s+=160;return{x:i,y:s}}(e,t.connectFrom?.from??null),config:t.config??{},requiredPaths:t.requiredPaths??[],providedPaths:t.providedPaths??[],retry:t.retry??{maxAttempts:1,strategy:"EXPONENTIAL",delaySeconds:5},failurePolicy:t.failurePolicy??"FAIL"},a={...e,nodes:[...e.nodes,i]};if(!t.connectFrom)return{definition:a,nodeId:r,edgeId:null};let n=iu(a,{source:t.connectFrom.from,target:r,sourceHandle:t.connectFrom.sourceHandle??null});return{definition:n.definition,nodeId:r,edgeId:n.edgeId}}(await iC(l,e.workflowId),{...e,name:e.name??function(e){let t=ii.WORKFLOW_STEP_CATALOG.find(t=>t.kind===e);if(!t)throw Error(`Unknown step kind ${e}`);return t}(e.kind).label});return iT(l,e.workflowId,t.definition,{nodeId:t.nodeId,edgeId:t.edgeId})}}),iP({name:"update_workflow_step",title:"Update workflow step",description:"Change a step's name, config, retry, or failure policy. Prefer configPatch, which merges — config replaces the object wholesale.",inputSchema:e1.object({workflowId:e1.string().min(1),nodeId:e1.string().min(1),name:e1.string().max(200).optional(),config:iy.optional().describe("Replaces the entire config. Keys left out are dropped."),configPatch:e1.record(e1.string(),e1.unknown()).optional().describe("Merges into the existing config. A null value removes that key."),position:ig.optional(),failurePolicy:e1.enum(["FAIL","CONTINUE"]).optional(),retry:e1.object({maxAttempts:e1.number().int().min(1).max(20),strategy:e1.enum(["FIXED","EXPONENTIAL"]),delaySeconds:e1.number().int().min(1).max(86400)}).optional(),providedPaths:iv.optional(),requiredPaths:iw.optional()}),outputSchema:ik,annotations:iN,handler:async e=>{let t=await iC(l,e.workflowId);return iT(l,e.workflowId,function(e,t){if(!e.nodes.some(({id:e})=>e===t.nodeId))throw Error(`Step ${t.nodeId} is not in this workflow`);if(t.config&&t.configPatch)throw Error("Pass either config or configPatch, not both");return{...e,nodes:e.nodes.map(e=>e.id===t.nodeId?{...e,name:t.name??e.name,config:ic(e.config,t),position:t.position??e.position,retry:t.retry??e.retry,failurePolicy:t.failurePolicy??e.failurePolicy,requiredPaths:t.requiredPaths??e.requiredPaths,providedPaths:t.providedPaths??e.providedPaths}:e)}}(t,e),{nodeId:e.nodeId})}}),iP({name:"add_workflow_trigger",title:"Add workflow trigger",description:"Add a trigger to the draft. A workflow needs at least one, and each must reach a step before it can be published.",inputSchema:e1.object({workflowId:e1.string().min(1),kind:e1.enum(ia.WORKFLOW_TRIGGER_KINDS).describe("Trigger kind. See list_workflow_trigger_kinds."),name:e1.string().max(200).optional(),config:iy.optional().describe("Trigger config. Resource triggers need `resourceKind`; choice triggers need keyed `choices`; issue-command triggers need `allowedLogins` and an anchored `commandPattern`."),position:ig.optional()}),outputSchema:ik,annotations:iN,handler:async e=>{var t,r;let i,a,n=(t=await iC(l,e.workflowId),r={...e,name:e.name??iR(e.kind).label},a={id:i=is(t,"trigger"),kind:r.kind,name:r.name??void 0,config:r.config??{},position:r.position??{x:0,y:100+140*t.triggers.length}},{definition:{...t,triggers:[...t.triggers,a]},triggerId:i});return iT(l,e.workflowId,n.definition,{triggerId:n.triggerId})}}),iP({name:"update_workflow_trigger",title:"Update workflow trigger",description:"Change a trigger's name or config. Narrowing a choice trigger's options also removes the connections that left the options you dropped.",inputSchema:e1.object({workflowId:e1.string().min(1),triggerId:e1.string().min(1),name:e1.string().max(200).optional(),config:iy.optional(),configPatch:e1.record(e1.string(),e1.unknown()).optional(),position:ig.optional()}),outputSchema:ik,annotations:iN,handler:async e=>{let t=await iC(l,e.workflowId);return iT(l,e.workflowId,function(e,t){let r=e.triggers.find(({id:e})=>e===t.triggerId);if(!r)throw Error(`Trigger ${t.triggerId} is not in this workflow`);if(t.config&&t.configPatch)throw Error("Pass either config or configPatch, not both");let i={...r,name:t.name??r.name,config:ic(r.config,t),position:t.position??r.position},a=new Set(il(i)),n=(0,ia.isChoiceTriggerKind)(i.kind)?e.edges.filter(e=>e.source!==i.id||a.has(e.sourceHandle)):e.edges;return{...e,triggers:e.triggers.map(e=>e.id===i.id?i:e),edges:n}}(t,e),{triggerId:e.triggerId})}}),iP({name:"remove_workflow_node",title:"Remove workflow step or trigger",description:"Delete a step or trigger from the draft along with its connections. Set reconnect to stitch its predecessors to its successors so the chain survives.",inputSchema:e1.object({workflowId:e1.string().min(1),id:e1.string().min(1).describe("Step or trigger id."),reconnect:e1.boolean().optional().describe("Join what came before to what came after.")}),outputSchema:ik,annotations:iO,handler:async({workflowId:e,id:t,reconnect:r})=>{let i=await iC(l,e);return iT(l,e,function(e,t,r={}){if(!io(e,t))throw Error(`${t} is not in this workflow`);let i=e.edges.filter(e=>e.target===t),a=e.edges.filter(e=>e.source===t),n=e.edges.filter(e=>e.source!==t&&e.target!==t),s={...e,nodes:e.nodes.filter(e=>e.id!==t),triggers:e.triggers.filter(e=>e.id!==t),edges:n};if(!r.reconnect)return s;for(let e of i)for(let t of a)s=iu(s,{source:e.source,sourceHandle:e.sourceHandle,target:t.target,targetHandle:t.targetHandle}).definition;return s}(i,t,{reconnect:r}))}}),iP({name:"connect_workflow_nodes",title:"Connect workflow nodes",description:"Draw a connection from a trigger or step to a step. A step with more than one incoming connection must be a CONTROL_JOIN.",inputSchema:e1.object({workflowId:e1.string().min(1),source:e1.string().min(1).describe("Trigger or step id."),target:e1.string().min(1).describe("Step id. Triggers take no input."),sourceHandle:e1.string().optional().describe("Handle to leave from. Defaults to the source's first — 'success' for a step.")}),outputSchema:ik,annotations:iN,handler:async e=>{let t=iu(await iC(l,e.workflowId),e);return iT(l,e.workflowId,t.definition,{edgeId:t.edgeId})}}),iP({name:"disconnect_workflow_nodes",title:"Disconnect workflow nodes",description:"Remove a connection, either by its edge id or by the pair of nodes it joins.",inputSchema:e1.object({workflowId:e1.string().min(1),edgeId:e1.string().optional(),source:e1.string().optional(),target:e1.string().optional(),sourceHandle:e1.string().optional()}),outputSchema:ik.extend({removedEdgeIds:e1.array(e1.string())}),annotations:iN,handler:async e=>{let t=function(e,t){let r=e.edges.filter(e=>t.edgeId?e.id===t.edgeId:(!!t.source||!!t.target)&&(!t.source||e.source===t.source)&&(!t.target||e.target===t.target)&&(!t.sourceHandle||e.sourceHandle===t.sourceHandle));if(!r.length)throw Error("No matching connection to remove");let i=new Set(r.map(({id:e})=>e));return{definition:{...e,edges:e.edges.filter(e=>!i.has(e.id))},removedEdgeIds:[...i]}}(await iC(l,e.workflowId),e);return{...await iT(l,e.workflowId,t.definition),removedEdgeIds:t.removedEdgeIds}}}),iP({name:"layout_workflow",title:"Lay out workflow graph",description:"Reposition every trigger and step into readable left-to-right columns. Worth calling once after building a workflow, so it does not open as a pile of overlapping cards.",inputSchema:im,outputSchema:ik,annotations:iN,handler:async({workflowId:e})=>{let t=await iC(l,e);return iT(l,e,function(e){let t=new Map;for(let r of e.edges)t.set(r.source,[...t.get(r.source)??[],r.target]);let r=new Map;for(let t of e.triggers)r.set(t.id,0);let i=e.triggers.map(({id:e})=>e),a=e.nodes.length*e.edges.length+1;for(;i.length&&a-- >0;){let e=i.shift(),a=r.get(e)??0;for(let n of t.get(e)??[])(r.get(n)??-1)>=a+1||(r.set(n,a+1),i.push(n))}let n=Math.max(0,...r.values());for(let t of e.nodes)r.has(t.id)||r.set(t.id,n+1);let s=new Map,o=e=>{let t=r.get(e.id)??0,i=s.get(t)??0;return s.set(t,i+1),{...e,position:{x:320*t,y:160*i}}},l=e.triggers.map(o),c=e.nodes.map(o);return{...e,triggers:l,nodes:c}}(t))}}),iP({name:"set_workflow_definition",title:"Replace workflow definition",description:"Overwrite the entire draft graph. The bulk escape hatch — prefer the granular tools for single edits, which cannot clobber work they did not read.",inputSchema:e1.object({workflowId:e1.string().min(1),definition:e1.unknown().describe("A complete definition object, as returned by get_workflow.")}),outputSchema:ik,annotations:iN,handler:async({workflowId:e,definition:t})=>iT(l,e,(0,ii.parseWorkflowDefinition)(t))}),iP({name:"validate_workflow",title:"Validate workflow draft",description:"Check the draft without saving anything. Errors block publishing; the codes name the problem — REQUIREMENT_UNSATISFIED means a step binds a path its trigger cannot seed.",inputSchema:im,outputSchema:e1.object({valid:e1.boolean(),diagnostics:e1.array(ib)}),annotations:iD,handler:async({workflowId:e})=>{let t=await l().validateDraft(e);return{valid:t.valid,diagnostics:t.diagnostics.map(e=>({severity:e.severity,code:e.code,message:e.message,nodeId:e.nodeId??null,triggerId:e.triggerId??null,path:e.path??null}))}}}),iP({name:"publish_workflow",title:"Publish workflow",description:"Publish the draft as a new immutable version. Only a published version can run, and publishing fails if the draft has errors.",inputSchema:im,outputSchema:e1.object({version:e1.unknown()}),annotations:iN,handler:async({workflowId:e})=>({version:t9(await l().publish(e))})}),iP({name:"export_workflow",title:"Export workflow",description:"Export a workflow as a portable document, with secrets and machine-specific paths stripped. Pass a version id to export a published version instead of the draft.",inputSchema:e1.object({workflowId:e1.string().min(1),versionId:e1.string().optional()}),outputSchema:e1.object({export:e1.unknown()}),annotations:iD,handler:async({workflowId:e,versionId:t})=>({export:t8(await l().export(e,t))})}),iP({name:"import_workflow",title:"Import workflow",description:"Create a workflow from an exported document. References that cannot be resolved on this machine come in marked unresolved and must be fixed before publishing.",inputSchema:e1.object({payload:e1.unknown().describe("A document from export_workflow."),name:e1.string().max(200).optional()}),outputSchema:e1.object({workflow:ix,definition:e1.unknown()}),annotations:iN,handler:async e=>{let t=await l().import(e);if(!t)throw Error("Workflow could not be imported");return{workflow:t5(t),definition:JSON.parse(t.draftDefinitionJson)}}})]},{id:"builtin:workflows:runs",name:"Runs",children:[],tools:[iP({name:"trigger_workflow",title:"Trigger workflow run",description:"Start a run of a published, enabled workflow. Runs whatever the workflow's steps do, including external side effects.",inputSchema:e1.object({workflowId:e1.string().min(1),sessionData:e1.record(e1.string(),e1.unknown()).optional().describe("Initial session data, merged with the trigger's seeds."),resourceKind:e1.enum(ia.WORKFLOW_RESOURCE_KINDS).optional().describe("Launch through a resource trigger of this kind."),resourceId:e1.string().optional().describe("The resource to launch against."),choice:e1.string().optional().describe("Option key when the workflow's trigger offers choices. Omitting it on a choice-only workflow returns the valid keys."),subjectKey:e1.string().optional().describe("Dedupe key. Defaults to the resource or a fresh id.")}),outputSchema:e1.object({run:iS}),annotations:iA,handler:async e=>{let t=await l().trigger(e);if(!t)throw Error("Workflow run could not be started");return{run:t7(t)}}}),iP({name:"list_workflow_runs",title:"List workflow runs",description:"List runs, newest first, optionally filtered.",inputSchema:e1.object({workflowId:e1.string().optional(),status:e1.enum(["QUEUED","RUNNING","PAUSING","PAUSED","WAITING","BLOCKED","SUCCEEDED","FAILED","CANCELLED"]).optional(),search:e1.string().optional().describe("A run number, or part of a workflow name."),first:e1.number().int().min(1).max(200).optional(),after:e1.string().optional()}),outputSchema:e1.object({runs:e1.array(iS),nextCursor:e1.string().nullable(),totalCount:e1.number()}),annotations:iD,handler:async e=>{let t=await l().runs(e);return{runs:t.items.map(e=>t7(e)),nextCursor:t.nextCursor,totalCount:t.totalCount}}}),iP({name:"get_workflow_run",title:"Get workflow run",description:"Read a run's status and session data, with its per-step attempts and any questions it is blocked on. Poll this after trigger_workflow.",inputSchema:e1.object({runId:e1.string().min(1),includeAttempts:e1.boolean().optional().describe("Include per-step attempts. Defaults to true.")}),outputSchema:e1.object({run:iS,attempts:e1.array(e1.unknown()),pendingQuestions:e1.array(iE)}),annotations:iD,handler:async({runId:e,includeAttempts:t})=>{let r=await l().run(e);if(!r)throw Error(`Workflow run ${e} was not found`);let i=r.attempts??[];return{run:t7(r),attempts:!1===t?[]:i.map(e=>({id:String(e.id),nodeId:String(e.nodeId),kind:String(e.kind),generation:Number(e.generation),iterationKey:String(e.iterationKey??""),attempt:Number(e.attempt),status:String(e.status),phase:String(e.phase),input:t1(e.inputJson),output:t1(e.outputJson),error:"string"==typeof e.error?e.error:null,startedAt:t2(e.startedAt),finishedAt:t2(e.finishedAt)})),pendingQuestions:i.flatMap(e=>e.questionBatches??[]).filter(e=>"PENDING"===e.status).map(e=>{let t;return t=Array.isArray(e.questions)?e.questions:[],{batchId:String(e.id),runId:"string"==typeof e.runId?e.runId:null,status:String(e.status),createdAt:t2(e.createdAt),questions:t.map(e=>{let t=Array.isArray(e.options)?e.options:[];return{id:String(e.id),header:"string"==typeof e.header?e.header:null,prompt:String(e.prompt??""),multiSelect:!0===e.multiSelect,allowCustom:!0===e.allowCustom,options:t.map(e=>({label:String(e.label??""),description:"string"==typeof e.description?e.description:null}))}})}})}}}),iP({name:"get_workflow_run_events",title:"Get workflow run events",description:"Read a run's event log in order. Pass the last sequence you saw to tail only what is new.",inputSchema:e1.object({runId:e1.string().min(1),afterSequence:e1.number().int().optional(),first:e1.number().int().min(1).max(500).optional()}),outputSchema:e1.object({events:e1.array(iI)}),annotations:iD,handler:async({runId:e,afterSequence:t,first:r})=>({events:(await l().runEvents(e,t,r)).map(e=>({id:String(e.id),runId:String(e.runId),attemptId:"string"==typeof e.attemptId?e.attemptId:null,sequence:Number(e.sequence),type:String(e.type),message:String(e.message??""),detail:t1(e.detailJson),createdAt:t2(e.createdAt)}))})}),iP({name:"control_workflow_run",title:"Pause, resume, or cancel a run",description:"Change an in-flight run's lifecycle. Cancelling is final, and leaves any external effects already applied in place.",inputSchema:e1.object({runId:e1.string().min(1),action:e1.enum(["PAUSE","RESUME","CANCEL"])}),outputSchema:e1.object({run:iS}),annotations:iO,handler:async({runId:e,action:t})=>{let r=await l().lifecycle(e,t);if(!r)throw Error("Workflow run lifecycle change failed");return{run:t7(r)}}}),iP({name:"answer_workflow_question",title:"Answer a workflow question",description:"Answer the question a run is parked on so it can continue. Find the batch id and the questions through get_workflow_run.",inputSchema:e1.object({batchId:e1.string().min(1).describe("From get_workflow_run."),answers:e1.record(e1.string(),e1.unknown()).describe("Answers keyed by question id. A value is the chosen option label, a list of labels for a multi-select, or free text where a custom answer is allowed.")}),outputSchema:e1.object({run:iS}),annotations:iN,handler:async({batchId:e,answers:t})=>{let r=await l().answerQuestion(e,t);if(!r)throw Error("Workflow question could not be answered");return{run:t7(r)}}}),iP({name:"prepare_workflow_replay",title:"Preview a workflow replay",description:"See what replaying a run from a given step would affect: the downstream steps, the external effects that would happen again, and whether a Git checkpoint is available. Read-only — call it before replay_workflow_run.",inputSchema:e1.object({runId:e1.string().min(1),nodeId:e1.string().min(1).describe("Step to replay from.")}),outputSchema:e1.object({preview:e1.unknown()}),annotations:iD,handler:async({runId:e,nodeId:t})=>({preview:t8(await l().prepareReplay(e,t))})}),iP({name:"replay_workflow_run",title:"Replay a workflow run from a step",description:"Re-run a workflow from one step onward. Every external effect downstream happens again — merges, comments, deploys — so preview it with prepare_workflow_replay first.",inputSchema:e1.object({runId:e1.string().min(1),nodeId:e1.string().min(1),restore:e1.boolean().optional().describe("Restore the worktree to the Git checkpoint at that step, discarding later changes."),stash:e1.boolean().optional().describe("Stash uncommitted changes before restoring.")}),outputSchema:e1.object({run:iS}),annotations:iO,handler:async({runId:e,nodeId:t,restore:r,stash:i})=>{let a=await l().replay(e,t,{restore:r,stash:i});if(!a)throw Error("Workflow run could not be replayed");return{run:t7(a)}}})]}]})),new iB(m)}({codebaseTools:e,builds:t,...r})}async externalServers(){let e=await (0,tY.getPrismaClient)();return Promise.all((await e.externalMcpServer.findMany({orderBy:{name:"asc"},include:{headers:!0}})).map(async e=>iq(e,0===e.headers.length||await this.credentials.isConfigured((0,tX.externalMcpHeadersCredential)(e.id)))))}async createExternalServer(e){return this.saveExternalServer(null,e)}async updateExternalServer(e,t){return this.saveExternalServer(e,t)}async saveExternalServer(e,t){let r=function(e){let t,r=e.name.trim();if(!r)throw Error("Server name is required");if(r.length>80)throw Error("Server name must be 80 characters or fewer");try{t=new URL(e.url.trim())}catch{throw Error("Server URL must be a valid HTTP or HTTPS URL")}if(!["http:","https:"].includes(t.protocol)||t.username||t.password)throw Error("Server URL must be an HTTP or HTTPS URL without embedded credentials");if("STREAMABLE_HTTP"!==e.transport&&"SSE"!==e.transport)throw Error("Transport must be Streamable HTTP or SSE");let i=e.toolNamePrefix?.trim()??"";if(i.length>64||!/^[A-Za-z0-9_.-]*$/.test(i))throw Error("Tool name prefix may contain up to 64 letters, numbers, underscores, periods, or hyphens");let a=new Set,n=e.headers.map(e=>{let t=e.name.trim();if(!t)throw Error("Header name is required");let r=t.toLowerCase();if(iL.has(r))throw Error(`${t} is managed by the MCP transport`);if(a.has(r))throw Error(`Duplicate header name: ${t}`);a.add(r);try{new Headers([[t,e.value??"validation"]])}catch{throw Error(`Invalid HTTP header: ${t}`)}return{id:e.id??null,name:t,value:e.value}});return{name:r,url:t.toString(),transport:e.transport,toolNamePrefix:i,headers:n}}(t),i=await (0,tY.getPrismaClient)();if((await i.externalMcpServer.findMany({select:{id:!0,name:!0}})).some(t=>t.id!==e&&t.name.toLocaleLowerCase()===r.name.toLocaleLowerCase()))throw Error("An MCP server with this name already exists");let a=e?await i.externalMcpServer.findUnique({where:{id:e},include:{headers:!0}}):null;if(e&&!a)throw Error("External MCP server not found");let n=new Map(a?.headers.map(e=>[e.id,e])??[]),s=e??(0,g.randomUUID)(),o=(0,tX.externalMcpHeadersCredential)(s),l=new Map((e?await this.credentials.getJson(o)??[]:[]).map(e=>[e.id,e]));for(let e of r.headers){if(e.id&&!n.has(e.id))throw Error(`Header ${e.name} does not belong to this server`);if(!e.id&&!e.value)throw Error(`A value is required for the new ${e.name} header`)}let c=r.headers.map(e=>{let t=e.id??(0,g.randomUUID)(),r=e.value||l.get(t)?.value;if(!r)throw Error(`A value is required for ${e.name}`);return{id:t,name:e.name,value:r}}),u=async e=>{await e.externalMcpServer.upsert({where:{id:s},create:{id:s,name:r.name,url:r.url,transport:r.transport,toolNamePrefix:r.toolNamePrefix},update:{name:r.name,url:r.url,transport:r.transport,toolNamePrefix:r.toolNamePrefix}}),await e.externalMcpServerHeader.deleteMany({where:{serverId:s}}),c.length&&await e.externalMcpServerHeader.createMany({data:c.map(e=>({id:e.id,serverId:s,name:e.name}))})};return c.length?await this.credentials.setJson(o,c,u):await this.credentials.delete(o,u),iq(await i.externalMcpServer.findUniqueOrThrow({where:{id:s},include:{headers:!0}}),!0)}async deleteExternalServer(e){return await this.credentials.delete((0,tX.externalMcpHeadersCredential)(e),async t=>{await t.externalMcpServer.delete({where:{id:e}})}),{id:e}}async catalog(){let e=await (0,tY.getPrismaClient)(),t=await e.externalMcpServer.findMany({orderBy:{name:"asc"},include:{headers:!0}}),r=await Promise.all(t.map(async e=>{try{let t=await this.listRemoteTools(await this.externalServerWithSecrets(e.id));return{id:`${ij}${e.id}`,name:e.name,source:"EXTERNAL",transport:iM(e.transport),url:e.url,error:null,tools:t.map(t=>({...t,name:`${e.toolNamePrefix}${t.name}`})),children:[]}}catch(t){return{id:`${ij}${e.id}`,name:e.name,source:"EXTERNAL",transport:iM(e.transport),url:e.url,error:t instanceof Error?t.message:String(t),tools:[],children:[]}}}));return{groups:[...this.builtInTools.catalog(),...r]}}async callTool(e){if(this.builtInTools.hasGroup(e.groupId))return this.builtInTools.call(e.groupId,e.name,e.arguments);if(!e.groupId.startsWith(ij))throw Error("Unknown tool group");let t=e.groupId.slice(ij.length),r=await this.externalServerWithSecrets(t);if(!e.name.startsWith(r.toolNamePrefix))throw Error("Tool name does not use this server's configured prefix");let i=e.name.slice(r.toolNamePrefix.length);if(!i)throw Error("Tool name is required");return this.withClient(r,t=>t.callTool({name:i,arguments:e.arguments},void 0,{timeout:12e4,resetTimeoutOnProgress:!0}))}async externalServerWithSecrets(e){let t=await (0,tY.getPrismaClient)(),r=await t.externalMcpServer.findUnique({where:{id:e},include:{headers:!0}});if(!r)throw Error("External MCP server not found");if(iM(r.transport),!r.headers.length)return{...r,headers:[]};let i=await this.credentials.getJson((0,tX.externalMcpHeadersCredential)(r.id));if(!i)throw Error("External MCP server headers are not configured; re-enter them in Settings");let a=new Map(i.map(e=>[e.id,e]));return{...r,headers:r.headers.map(e=>{let t=a.get(e.id);if(!t?.value)throw Error(`External MCP header ${e.name} is missing; re-enter it in Settings`);return{id:e.id,name:e.name,value:t.value}})}}async withClient(e,t){var r;let i,a=new eu({name:"ai-development-environment-tools",version:"0.1.0"}),n=(r=e,async(e,t)=>{let i=new Headers(r.headers.map(e=>[e.name,e.value]));return e instanceof Request&&e.headers.forEach((e,t)=>i.set(t,e)),new Headers(t?.headers).forEach((e,t)=>i.set(t,e)),fetch(e,{...t,headers:i})}),s="STREAMABLE_HTTP"===iM(e.transport)?new tZ(new URL(e.url),{fetch:n}):new tG(new URL(e.url),{fetch:n}),o=()=>i??=a.close().catch(()=>void 0);try{let e;try{await Promise.race([a.connect(s,{timeout:15e3}),new Promise((t,r)=>{e=setTimeout(()=>{o(),r(Error("External MCP server connection timed out after 15000ms"))},15e3)})])}finally{e&&clearTimeout(e)}return await t(a)}finally{await o()}}async listRemoteTools(e){return this.withClient(e,async e=>{let t,r=[],i=new Set,a=0;do{let n=await e.listTools(t?{cursor:t}:void 0,{timeout:15e3});a+=1,r.push(...n.tools.map(e=>({name:e.name,title:e.title??null,description:e.description??null,inputSchema:e.inputSchema,outputSchema:e.outputSchema??null})));let s=n.nextCursor;if(s){if(i.has(s))throw Error("External MCP server returned a repeated tools/list cursor");if(a>=100)throw Error("External MCP server exceeded the tools/list pagination limit of 100 pages");i.add(s)}t=s}while(t)return r})}}class iV{constructor(e){this._server=e}requestStream(e,t,r){return this._server.requestStream(e,t,r)}createMessageStream(e,t){let r=this._server.getClientCapabilities();if((e.tools||e.toolChoice)&&!r?.sampling?.tools)throw Error("Client does not support sampling tools capability.");if(e.messages.length>0){let t=e.messages[e.messages.length-1],r=Array.isArray(t.content)?t.content:[t.content],i=r.some(e=>"tool_result"===e.type),a=e.messages.length>1?e.messages[e.messages.length-2]:void 0,n=a?Array.isArray(a.content)?a.content:[a.content]:[],s=n.some(e=>"tool_use"===e.type);if(i){if(r.some(e=>"tool_result"!==e.type))throw Error("The last message must contain only tool_result content if any is present");if(!s)throw Error("tool_result blocks are not matching any tool_use from the previous message")}if(s){let e=new Set(n.filter(e=>"tool_use"===e.type).map(e=>e.id)),t=new Set(r.filter(e=>"tool_result"===e.type).map(e=>e.toolUseId));if(e.size!==t.size||![...e].every(e=>t.has(e)))throw Error("ids of tool_result blocks and tool_use blocks from previous message do not match")}}return this.requestStream({method:"sampling/createMessage",params:e},v.CreateMessageResultSchema,t)}elicitInputStream(e,t){let r=this._server.getClientCapabilities(),i=e.mode??"form";switch(i){case"url":if(!r?.elicitation?.url)throw Error("Client does not support url elicitation.");break;case"form":if(!r?.elicitation?.form)throw Error("Client does not support form elicitation.")}let a="form"===i&&void 0===e.mode?{...e,mode:"form"}:e;return this.requestStream({method:"elicitation/create",params:a},v.ElicitResultSchema,t)}async getTask(e,t){return this._server.getTask({taskId:e},t)}async getTaskResult(e,t,r){return this._server.getTaskResult({taskId:e},t,r)}async listTasks(e,t){return this._server.listTasks(e?{cursor:e}:void 0,t)}async cancelTask(e,t){return this._server.cancelTask({taskId:e},t)}}class iK extends et{constructor(e,t){super(t),this._serverInfo=e,this._loggingLevels=new Map,this.LOG_LEVEL_SEVERITY=new Map(v.LoggingLevelSchema.options.map((e,t)=>[e,t])),this.isMessageIgnored=(e,t)=>{let r=this._loggingLevels.get(t);return!!r&&this.LOG_LEVEL_SEVERITY.get(e)<this.LOG_LEVEL_SEVERITY.get(r)},this._capabilities=t?.capabilities??{},this._instructions=t?.instructions,this._jsonSchemaValidator=t?.jsonSchemaValidator??new es,this.setRequestHandler(v.InitializeRequestSchema,e=>this._oninitialize(e)),this.setNotificationHandler(v.InitializedNotificationSchema,()=>this.oninitialized?.()),this._capabilities.logging&&this.setRequestHandler(v.SetLevelRequestSchema,async(e,t)=>{let r=t.sessionId||t.requestInfo?.headers["mcp-session-id"]||void 0,{level:i}=e.params,a=v.LoggingLevelSchema.safeParse(i);return a.success&&this._loggingLevels.set(r,a.data),{}})}get experimental(){return this._experimental||(this._experimental={tasks:new iV(this)}),this._experimental}registerCapabilities(e){if(this.transport)throw Error("Cannot register capabilities after connecting to transport");this._capabilities=ei(this._capabilities,e)}setRequestHandler(e,t){let r,i=(0,y.getObjectShape)(e),a=i?.method;if(!a)throw Error("Schema is missing a method literal");if((0,y.isZ4Schema)(a)){let e=a._zod?.def;r=e?.value??a.value}else{let e=a._def;r=e?.value??a.value}if("string"!=typeof r)throw Error("Schema method literal must be a string");if("tools/call"===r){let r=async(e,r)=>{let i=(0,y.safeParse)(v.CallToolRequestSchema,e);if(!i.success){let e=i.error instanceof Error?i.error.message:String(i.error);throw new v.McpError(v.ErrorCode.InvalidParams,`Invalid tools/call request: ${e}`)}let{params:a}=i.data,n=await Promise.resolve(t(e,r));if(a.task){let e=(0,y.safeParse)(v.CreateTaskResultSchema,n);if(!e.success){let t=e.error instanceof Error?e.error.message:String(e.error);throw new v.McpError(v.ErrorCode.InvalidParams,`Invalid task creation result: ${t}`)}return e.data}let s=(0,y.safeParse)(v.CallToolResultSchema,n);if(!s.success){let e=s.error instanceof Error?s.error.message:String(s.error);throw new v.McpError(v.ErrorCode.InvalidParams,`Invalid tools/call result: ${e}`)}return s.data};return super.setRequestHandler(e,r)}return super.setRequestHandler(e,t)}assertCapabilityForMethod(e){switch(e){case"sampling/createMessage":if(!this._clientCapabilities?.sampling)throw Error(`Client does not support sampling (required for ${e})`);break;case"elicitation/create":if(!this._clientCapabilities?.elicitation)throw Error(`Client does not support elicitation (required for ${e})`);break;case"roots/list":if(!this._clientCapabilities?.roots)throw Error(`Client does not support listing roots (required for ${e})`)}}assertNotificationCapability(e){switch(e){case"notifications/message":if(!this._capabilities.logging)throw Error(`Server does not support logging (required for ${e})`);break;case"notifications/resources/updated":case"notifications/resources/list_changed":if(!this._capabilities.resources)throw Error(`Server does not support notifying about resources (required for ${e})`);break;case"notifications/tools/list_changed":if(!this._capabilities.tools)throw Error(`Server does not support notifying of tool list changes (required for ${e})`);break;case"notifications/prompts/list_changed":if(!this._capabilities.prompts)throw Error(`Server does not support notifying of prompt list changes (required for ${e})`);break;case"notifications/elicitation/complete":if(!this._clientCapabilities?.elicitation?.url)throw Error(`Client does not support URL elicitation (required for ${e})`)}}assertRequestHandlerCapability(e){if(this._capabilities)switch(e){case"completion/complete":if(!this._capabilities.completions)throw Error(`Server does not support completions (required for ${e})`);break;case"logging/setLevel":if(!this._capabilities.logging)throw Error(`Server does not support logging (required for ${e})`);break;case"prompts/get":case"prompts/list":if(!this._capabilities.prompts)throw Error(`Server does not support prompts (required for ${e})`);break;case"resources/list":case"resources/templates/list":case"resources/read":if(!this._capabilities.resources)throw Error(`Server does not support resources (required for ${e})`);break;case"tools/call":case"tools/list":if(!this._capabilities.tools)throw Error(`Server does not support tools (required for ${e})`);break;case"tasks/get":case"tasks/list":case"tasks/result":case"tasks/cancel":if(!this._capabilities.tasks)throw Error(`Server does not support tasks capability (required for ${e})`)}}assertTaskCapability(e){ec(this._clientCapabilities?.tasks?.requests,e,"Client")}assertTaskHandlerCapability(e){this._capabilities&&el(this._capabilities.tasks?.requests,e,"Server")}async _oninitialize(e){let t=e.params.protocolVersion;return this._clientCapabilities=e.params.capabilities,this._clientVersion=e.params.clientInfo,{protocolVersion:v.SUPPORTED_PROTOCOL_VERSIONS.includes(t)?t:v.LATEST_PROTOCOL_VERSION,capabilities:this.getCapabilities(),serverInfo:this._serverInfo,...this._instructions&&{instructions:this._instructions}}}getClientCapabilities(){return this._clientCapabilities}getClientVersion(){return this._clientVersion}getCapabilities(){return this._capabilities}async ping(){return this.request({method:"ping"},v.EmptyResultSchema)}async createMessage(e,t){if((e.tools||e.toolChoice)&&!this._clientCapabilities?.sampling?.tools)throw Error("Client does not support sampling tools capability.");if(e.messages.length>0){let t=e.messages[e.messages.length-1],r=Array.isArray(t.content)?t.content:[t.content],i=r.some(e=>"tool_result"===e.type),a=e.messages.length>1?e.messages[e.messages.length-2]:void 0,n=a?Array.isArray(a.content)?a.content:[a.content]:[],s=n.some(e=>"tool_use"===e.type);if(i){if(r.some(e=>"tool_result"!==e.type))throw Error("The last message must contain only tool_result content if any is present");if(!s)throw Error("tool_result blocks are not matching any tool_use from the previous message")}if(s){let e=new Set(n.filter(e=>"tool_use"===e.type).map(e=>e.id)),t=new Set(r.filter(e=>"tool_result"===e.type).map(e=>e.toolUseId));if(e.size!==t.size||![...e].every(e=>t.has(e)))throw Error("ids of tool_result blocks and tool_use blocks from previous message do not match")}}return e.tools?this.request({method:"sampling/createMessage",params:e},v.CreateMessageResultWithToolsSchema,t):this.request({method:"sampling/createMessage",params:e},v.CreateMessageResultSchema,t)}async elicitInput(e,t){switch(e.mode??"form"){case"url":if(!this._clientCapabilities?.elicitation?.url)throw Error("Client does not support url elicitation.");return this.request({method:"elicitation/create",params:e},v.ElicitResultSchema,t);case"form":{if(!this._clientCapabilities?.elicitation?.form)throw Error("Client does not support form elicitation.");let r="form"===e.mode?e:{...e,mode:"form"},i=await this.request({method:"elicitation/create",params:r},v.ElicitResultSchema,t);if("accept"===i.action&&i.content&&r.requestedSchema)try{let e=this._jsonSchemaValidator.getValidator(r.requestedSchema)(i.content);if(!e.valid)throw new v.McpError(v.ErrorCode.InvalidParams,`Elicitation response content does not match requested schema: ${e.errorMessage}`)}catch(e){if(e instanceof v.McpError)throw e;throw new v.McpError(v.ErrorCode.InternalError,`Error validating elicitation response: ${e instanceof Error?e.message:String(e)}`)}return i}}}createElicitationCompletionNotifier(e,t){if(!this._clientCapabilities?.elicitation?.url)throw Error("Client does not support URL elicitation (required for notifications/elicitation/complete)");return()=>this.notification({method:"notifications/elicitation/complete",params:{elicitationId:e}},t)}async listRoots(e,t){return this.request({method:"roots/list",params:e},v.ListRootsResultSchema,t)}async sendLoggingMessage(e,t){if(this._capabilities.logging&&!this.isMessageIgnored(e.level,t))return this.notification({method:"notifications/message",params:e})}async sendResourceUpdated(e){return this.notification({method:"notifications/resources/updated",params:e})}async sendResourceListChanged(){return this.notification({method:"notifications/resources/list_changed"})}async sendToolListChanged(){return this.notification({method:"notifications/tools/list_changed"})}async sendPromptListChanged(){return this.notification({method:"notifications/prompts/list_changed"})}}let iH=Symbol.for("mcp.completable");function iG(e){return!!e&&"object"==typeof e&&iH in e}(i||(i={})).Completable="McpCompletable";let iW=/^[A-Za-z0-9._-]{1,128}$/;function iJ(e){let t=function(e){let t=[];if(0===e.length)return{isValid:!1,warnings:["Tool name cannot be empty"]};if(e.length>128)return{isValid:!1,warnings:[`Tool name exceeds maximum length of 128 characters (current: ${e.length})`]};if(e.includes(" ")&&t.push("Tool name contains spaces, which may cause parsing issues"),e.includes(",")&&t.push("Tool name contains commas, which may cause parsing issues"),(e.startsWith("-")||e.endsWith("-"))&&t.push("Tool name starts or ends with a dash, which may cause parsing issues in some contexts"),(e.startsWith(".")||e.endsWith("."))&&t.push("Tool name starts or ends with a dot, which may cause parsing issues in some contexts"),!iW.test(e)){let r=e.split("").filter(e=>!/[A-Za-z0-9._-]/.test(e)).filter((e,t,r)=>r.indexOf(e)===t);return t.push(`Tool name contains invalid characters: ${r.map(e=>`"${e}"`).join(", ")}`,"Allowed characters are: A-Z, a-z, 0-9, underscore (_), dash (-), and dot (.)"),{isValid:!1,warnings:t}}return{isValid:!0,warnings:t}}(e);var r=t.warnings;if(r.length>0){for(let t of(console.warn(`Tool name validation warning for "${e}":`),r))console.warn(` - ${t}`);console.warn("Tool registration will proceed, but this may cause compatibility issues."),console.warn("Consider updating the tool name to conform to the MCP tool naming standard."),console.warn("See SEP: Specify Format for Tool Names (https://github.com/modelcontextprotocol/modelcontextprotocol/issues/986) for more details.")}return t.isValid}class iz{constructor(e){this._mcpServer=e}registerToolTask(e,t,r){let i={taskSupport:"required",...t.execution};if("forbidden"===i.taskSupport)throw Error(`Cannot register task-based tool '${e}' with taskSupport 'forbidden'. Use registerTool() instead.`);return this._mcpServer._createRegisteredTool(e,t.title,t.description,t.inputSchema,t.outputSchema,t.annotations,i,t._meta,r)}}class iZ{constructor(e,t){this._registeredResources={},this._registeredResourceTemplates={},this._registeredTools={},this._registeredPrompts={},this._toolHandlersInitialized=!1,this._completionHandlerInitialized=!1,this._resourceHandlersInitialized=!1,this._promptHandlersInitialized=!1,this.server=new iK(e,t)}get experimental(){return this._experimental||(this._experimental={tasks:new iz(this)}),this._experimental}async connect(e){return await this.server.connect(e)}async close(){await this.server.close()}setToolRequestHandlers(){this._toolHandlersInitialized||(this.server.assertCanSetRequestHandler(i2(v.ListToolsRequestSchema)),this.server.assertCanSetRequestHandler(i2(v.CallToolRequestSchema)),this.server.registerCapabilities({tools:{listChanged:!0}}),this.server.setRequestHandler(v.ListToolsRequestSchema,()=>({tools:Object.entries(this._registeredTools).filter(([,e])=>e.enabled).map(([e,t])=>{let r,i={name:e,title:t.title,description:t.description,inputSchema:(r=(0,y.normalizeObjectSchema)(t.inputSchema))?Q(r,{strictUnions:!0,pipeStrategy:"input"}):iY,annotations:t.annotations,execution:t.execution,_meta:t._meta};if(t.outputSchema){let e=(0,y.normalizeObjectSchema)(t.outputSchema);e&&(i.outputSchema=Q(e,{strictUnions:!0,pipeStrategy:"output"}))}return i})})),this.server.setRequestHandler(v.CallToolRequestSchema,async(e,t)=>{try{let r=this._registeredTools[e.params.name];if(!r)throw new v.McpError(v.ErrorCode.InvalidParams,`Tool ${e.params.name} not found`);if(!r.enabled)throw new v.McpError(v.ErrorCode.InvalidParams,`Tool ${e.params.name} disabled`);let i=!!e.params.task,a=r.execution?.taskSupport,n="createTask"in r.handler;if(("required"===a||"optional"===a)&&!n)throw new v.McpError(v.ErrorCode.InternalError,`Tool ${e.params.name} has taskSupport '${a}' but was not registered with registerToolTask`);if("required"===a&&!i)throw new v.McpError(v.ErrorCode.MethodNotFound,`Tool ${e.params.name} requires task augmentation (taskSupport: 'required')`);if("optional"===a&&!i&&n)return await this.handleAutomaticTaskPolling(r,e,t);let s=await this.validateToolInput(r,e.params.arguments,e.params.name),o=await this.executeToolHandler(r,s,t);if(i)return o;return await this.validateToolOutput(r,o,e.params.name),o}catch(e){if(e instanceof v.McpError&&e.code===v.ErrorCode.UrlElicitationRequired)throw e;return this.createToolError(e instanceof Error?e.message:String(e))}}),this._toolHandlersInitialized=!0)}createToolError(e){return{content:[{type:"text",text:e}],isError:!0}}async validateToolInput(e,t,r){if(!e.inputSchema)return;let i=(0,y.normalizeObjectSchema)(e.inputSchema)??e.inputSchema,a=await (0,y.safeParseAsync)(i,t);if(!a.success){let e="error"in a?a.error:"Unknown error",t=(0,y.getParseErrorMessage)(e);throw new v.McpError(v.ErrorCode.InvalidParams,`Input validation error: Invalid arguments for tool ${r}: ${t}`)}return a.data}async validateToolOutput(e,t,r){if(!e.outputSchema||!("content"in t)||t.isError)return;if(!t.structuredContent)throw new v.McpError(v.ErrorCode.InvalidParams,`Output validation error: Tool ${r} has an output schema but no structured content was provided`);let i=(0,y.normalizeObjectSchema)(e.outputSchema),a=await (0,y.safeParseAsync)(i,t.structuredContent);if(!a.success){let e="error"in a?a.error:"Unknown error",t=(0,y.getParseErrorMessage)(e);throw new v.McpError(v.ErrorCode.InvalidParams,`Output validation error: Invalid structured content for tool ${r}: ${t}`)}}async executeToolHandler(e,t,r){let i=e.handler;if("createTask"in i){if(!r.taskStore)throw Error("No task store provided.");let a={...r,taskStore:r.taskStore};return e.inputSchema?await Promise.resolve(i.createTask(t,a)):await Promise.resolve(i.createTask(a))}return e.inputSchema?await Promise.resolve(i(t,r)):await Promise.resolve(i(r))}async handleAutomaticTaskPolling(e,t,r){if(!r.taskStore)throw Error("No task store provided for task-capable tool.");let i=await this.validateToolInput(e,t.params.arguments,t.params.name),a=e.handler,n={...r,taskStore:r.taskStore},s=i?await Promise.resolve(a.createTask(i,n)):await Promise.resolve(a.createTask(n)),o=s.task.taskId,l=s.task,c=l.pollInterval??5e3;for(;"completed"!==l.status&&"failed"!==l.status&&"cancelled"!==l.status;){await new Promise(e=>setTimeout(e,c));let e=await r.taskStore.getTask(o);if(!e)throw new v.McpError(v.ErrorCode.InternalError,`Task ${o} not found during polling`);l=e}return await r.taskStore.getTaskResult(o)}setCompletionRequestHandler(){this._completionHandlerInitialized||(this.server.assertCanSetRequestHandler(i2(v.CompleteRequestSchema)),this.server.registerCapabilities({completions:{}}),this.server.setRequestHandler(v.CompleteRequestSchema,async e=>{switch(e.params.ref.type){case"ref/prompt":return(0,v.assertCompleteRequestPrompt)(e),this.handlePromptCompletion(e,e.params.ref);case"ref/resource":return(0,v.assertCompleteRequestResourceTemplate)(e),this.handleResourceCompletion(e,e.params.ref);default:throw new v.McpError(v.ErrorCode.InvalidParams,`Invalid completion reference: ${e.params.ref}`)}}),this._completionHandlerInitialized=!0)}async handlePromptCompletion(e,t){let r,i=this._registeredPrompts[t.name];if(!i)throw new v.McpError(v.ErrorCode.InvalidParams,`Prompt ${t.name} not found`);if(!i.enabled)throw new v.McpError(v.ErrorCode.InvalidParams,`Prompt ${t.name} disabled`);if(!i.argsSchema)return i4;let a=(0,y.getObjectShape)(i.argsSchema),n=a?.[e.params.argument.name];if(!iG(n))return i4;let s=(r=n[iH],r?.complete);return s?i3(await s(e.params.argument.value,e.params.context)):i4}async handleResourceCompletion(e,t){let r=Object.values(this._registeredResourceTemplates).find(e=>e.resourceTemplate.uriTemplate.toString()===t.uri);if(!r){if(this._registeredResources[t.uri])return i4;throw new v.McpError(v.ErrorCode.InvalidParams,`Resource template ${e.params.ref.uri} not found`)}let i=r.resourceTemplate.completeCallback(e.params.argument.name);return i?i3(await i(e.params.argument.value,e.params.context)):i4}setResourceRequestHandlers(){this._resourceHandlersInitialized||(this.server.assertCanSetRequestHandler(i2(v.ListResourcesRequestSchema)),this.server.assertCanSetRequestHandler(i2(v.ListResourceTemplatesRequestSchema)),this.server.assertCanSetRequestHandler(i2(v.ReadResourceRequestSchema)),this.server.registerCapabilities({resources:{listChanged:!0}}),this.server.setRequestHandler(v.ListResourcesRequestSchema,async(e,t)=>{let r=Object.entries(this._registeredResources).filter(([e,t])=>t.enabled).map(([e,t])=>({uri:e,name:t.name,...t.metadata})),i=[];for(let e of Object.values(this._registeredResourceTemplates))if(e.resourceTemplate.listCallback)for(let r of(await e.resourceTemplate.listCallback(t)).resources)i.push({...e.metadata,...r});return{resources:[...r,...i]}}),this.server.setRequestHandler(v.ListResourceTemplatesRequestSchema,async()=>({resourceTemplates:Object.entries(this._registeredResourceTemplates).map(([e,t])=>({name:e,uriTemplate:t.resourceTemplate.uriTemplate.toString(),...t.metadata}))})),this.server.setRequestHandler(v.ReadResourceRequestSchema,async(e,t)=>{let r=new URL(e.params.uri),i=this._registeredResources[r.toString()];if(i){if(!i.enabled)throw new v.McpError(v.ErrorCode.InvalidParams,`Resource ${r} disabled`);return i.readCallback(r,t)}for(let e of Object.values(this._registeredResourceTemplates)){let i=e.resourceTemplate.uriTemplate.match(r.toString());if(i)return e.readCallback(r,i,t)}throw new v.McpError(v.ErrorCode.InvalidParams,`Resource ${r} not found`)}),this._resourceHandlersInitialized=!0)}setPromptRequestHandlers(){this._promptHandlersInitialized||(this.server.assertCanSetRequestHandler(i2(v.ListPromptsRequestSchema)),this.server.assertCanSetRequestHandler(i2(v.GetPromptRequestSchema)),this.server.registerCapabilities({prompts:{listChanged:!0}}),this.server.setRequestHandler(v.ListPromptsRequestSchema,()=>({prompts:Object.entries(this._registeredPrompts).filter(([,e])=>e.enabled).map(([e,t])=>{var r;let i;return{name:e,title:t.title,description:t.description,arguments:t.argsSchema?(r=t.argsSchema,(i=(0,y.getObjectShape)(r))?Object.entries(i).map(([e,t])=>({name:e,description:(0,y.getSchemaDescription)(t),required:!(0,y.isSchemaOptional)(t)})):[]):void 0}})})),this.server.setRequestHandler(v.GetPromptRequestSchema,async(e,t)=>{let r=this._registeredPrompts[e.params.name];if(!r)throw new v.McpError(v.ErrorCode.InvalidParams,`Prompt ${e.params.name} not found`);if(!r.enabled)throw new v.McpError(v.ErrorCode.InvalidParams,`Prompt ${e.params.name} disabled`);if(r.argsSchema){let i=(0,y.normalizeObjectSchema)(r.argsSchema),a=await (0,y.safeParseAsync)(i,e.params.arguments);if(!a.success){let t="error"in a?a.error:"Unknown error",r=(0,y.getParseErrorMessage)(t);throw new v.McpError(v.ErrorCode.InvalidParams,`Invalid arguments for prompt ${e.params.name}: ${r}`)}let n=a.data,s=r.callback;return await Promise.resolve(s(n,t))}{let e=r.callback;return await Promise.resolve(e(t))}}),this._promptHandlersInitialized=!0)}resource(e,t,...r){let i;"object"==typeof r[0]&&(i=r.shift());let a=r[0];if("string"==typeof t){if(this._registeredResources[t])throw Error(`Resource ${t} is already registered`);let r=this._createRegisteredResource(e,void 0,t,i,a);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),r}{if(this._registeredResourceTemplates[e])throw Error(`Resource template ${e} is already registered`);let r=this._createRegisteredResourceTemplate(e,void 0,t,i,a);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),r}}registerResource(e,t,r,i){if("string"==typeof t){if(this._registeredResources[t])throw Error(`Resource ${t} is already registered`);let a=this._createRegisteredResource(e,r.title,t,r,i);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),a}{if(this._registeredResourceTemplates[e])throw Error(`Resource template ${e} is already registered`);let a=this._createRegisteredResourceTemplate(e,r.title,t,r,i);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),a}}_createRegisteredResource(e,t,r,i,a){let n={name:e,title:t,metadata:i,readCallback:a,enabled:!0,disable:()=>n.update({enabled:!1}),enable:()=>n.update({enabled:!0}),remove:()=>n.update({uri:null}),update:e=>{void 0!==e.uri&&e.uri!==r&&(delete this._registeredResources[r],e.uri&&(this._registeredResources[e.uri]=n)),void 0!==e.name&&(n.name=e.name),void 0!==e.title&&(n.title=e.title),void 0!==e.metadata&&(n.metadata=e.metadata),void 0!==e.callback&&(n.readCallback=e.callback),void 0!==e.enabled&&(n.enabled=e.enabled),this.sendResourceListChanged()}};return this._registeredResources[r]=n,n}_createRegisteredResourceTemplate(e,t,r,i,a){let n={resourceTemplate:r,title:t,metadata:i,readCallback:a,enabled:!0,disable:()=>n.update({enabled:!1}),enable:()=>n.update({enabled:!0}),remove:()=>n.update({name:null}),update:t=>{void 0!==t.name&&t.name!==e&&(delete this._registeredResourceTemplates[e],t.name&&(this._registeredResourceTemplates[t.name]=n)),void 0!==t.title&&(n.title=t.title),void 0!==t.template&&(n.resourceTemplate=t.template),void 0!==t.metadata&&(n.metadata=t.metadata),void 0!==t.callback&&(n.readCallback=t.callback),void 0!==t.enabled&&(n.enabled=t.enabled),this.sendResourceListChanged()}};this._registeredResourceTemplates[e]=n;let s=r.uriTemplate.variableNames;return Array.isArray(s)&&s.some(e=>!!r.completeCallback(e))&&this.setCompletionRequestHandler(),n}_createRegisteredPrompt(e,t,r,i,a){let n={title:t,description:r,argsSchema:void 0===i?void 0:(0,y.objectFromShape)(i),callback:a,enabled:!0,disable:()=>n.update({enabled:!1}),enable:()=>n.update({enabled:!0}),remove:()=>n.update({name:null}),update:t=>{void 0!==t.name&&t.name!==e&&(delete this._registeredPrompts[e],t.name&&(this._registeredPrompts[t.name]=n)),void 0!==t.title&&(n.title=t.title),void 0!==t.description&&(n.description=t.description),void 0!==t.argsSchema&&(n.argsSchema=(0,y.objectFromShape)(t.argsSchema)),void 0!==t.callback&&(n.callback=t.callback),void 0!==t.enabled&&(n.enabled=t.enabled),this.sendPromptListChanged()}};return this._registeredPrompts[e]=n,i&&Object.values(i).some(e=>iG(e instanceof e1.ZodOptional?e._def?.innerType:e))&&this.setCompletionRequestHandler(),n}_createRegisteredTool(e,t,r,i,a,n,s,o,l){iJ(e);let c={title:t,description:r,inputSchema:i1(i),outputSchema:i1(a),annotations:n,execution:s,_meta:o,handler:l,enabled:!0,disable:()=>c.update({enabled:!1}),enable:()=>c.update({enabled:!0}),remove:()=>c.update({name:null}),update:t=>{void 0!==t.name&&t.name!==e&&("string"==typeof t.name&&iJ(t.name),delete this._registeredTools[e],t.name&&(this._registeredTools[t.name]=c)),void 0!==t.title&&(c.title=t.title),void 0!==t.description&&(c.description=t.description),void 0!==t.paramsSchema&&(c.inputSchema=(0,y.objectFromShape)(t.paramsSchema)),void 0!==t.outputSchema&&(c.outputSchema=(0,y.objectFromShape)(t.outputSchema)),void 0!==t.callback&&(c.handler=t.callback),void 0!==t.annotations&&(c.annotations=t.annotations),void 0!==t._meta&&(c._meta=t._meta),void 0!==t.enabled&&(c.enabled=t.enabled),this.sendToolListChanged()}};return this._registeredTools[e]=c,this.setToolRequestHandlers(),this.sendToolListChanged(),c}tool(e,...t){let r,i,a,n;if(this._registeredTools[e])throw Error(`Tool ${e} is already registered`);if("string"==typeof t[0]&&(r=t.shift()),t.length>1){let r=t[0];if(i0(r))i=t.shift(),t.length>1&&"object"==typeof t[0]&&null!==t[0]&&!i0(t[0])&&(n=t.shift());else if("object"==typeof r&&null!==r){if(Object.values(r).some(e=>"object"==typeof e&&null!==e))throw Error(`Tool ${e} expected a Zod schema or ToolAnnotations, but received an unrecognized object`);n=t.shift()}}let s=t[0];return this._createRegisteredTool(e,void 0,r,i,a,n,{taskSupport:"forbidden"},void 0,s)}registerTool(e,t,r){if(this._registeredTools[e])throw Error(`Tool ${e} is already registered`);let{title:i,description:a,inputSchema:n,outputSchema:s,annotations:o,_meta:l}=t;return this._createRegisteredTool(e,i,a,n,s,o,{taskSupport:"forbidden"},l,r)}prompt(e,...t){let r,i;if(this._registeredPrompts[e])throw Error(`Prompt ${e} is already registered`);"string"==typeof t[0]&&(r=t.shift()),t.length>1&&(i=t.shift());let a=t[0],n=this._createRegisteredPrompt(e,void 0,r,i,a);return this.setPromptRequestHandlers(),this.sendPromptListChanged(),n}registerPrompt(e,t,r){if(this._registeredPrompts[e])throw Error(`Prompt ${e} is already registered`);let{title:i,description:a,argsSchema:n}=t,s=this._createRegisteredPrompt(e,i,a,n,r);return this.setPromptRequestHandlers(),this.sendPromptListChanged(),s}isConnected(){return void 0!==this.server.transport}async sendLoggingMessage(e,t){return this.server.sendLoggingMessage(e,t)}sendResourceListChanged(){this.isConnected()&&this.server.sendResourceListChanged()}sendToolListChanged(){this.isConnected()&&this.server.sendToolListChanged()}sendPromptListChanged(){this.isConnected()&&this.server.sendPromptListChanged()}}let iY={type:"object",properties:{}};function iQ(e){return null!==e&&"object"==typeof e&&"parse"in e&&"function"==typeof e.parse&&"safeParse"in e&&"function"==typeof e.safeParse}function iX(e){return"_def"in e||"_zod"in e||iQ(e)}function i0(e){return!("object"!=typeof e||null===e||iX(e))&&(0===Object.keys(e).length||Object.values(e).some(iQ))}function i1(e){if(e){if(i0(e))return(0,y.objectFromShape)(e);if(!iX(e))throw Error("inputSchema must be a Zod schema or raw shape, received an unrecognized object");return e}}function i2(e){let t=(0,y.getObjectShape)(e),r=t?.method;if(!r)throw Error("Schema is missing a method literal");let i=(0,y.getLiteralValue)(r);if("string"==typeof i)return i;throw Error("Schema method literal must be a string")}function i3(e){return{completion:{values:e.slice(0,100),total:e.length,hasMore:e.length>100}}}let i4={completion:{values:[],hasMore:!1}};e.s(["createBuiltInMcpServer",0,function(e){let t=new iZ({name:"ai-development-environment",version:"0.1.0"}),r=t.registerTool.bind(t);for(let t of e.definitions())r(t.name,{title:t.title,description:t.description,inputSchema:t.inputSchema,outputSchema:t.outputSchema,annotations:t.annotations},async r=>e.callByName(t.name,r));return t}],700909),e.s([],719961);var i6=e.i(750227),i8=e.i(320058);function i5(e,t){let r=[],i=e.includes("CLAUDE");return i&&r.push("CLAUDE"),(e.includes("CODEX")||!i&&e.length>0||"GLOBAL"===t&&e.includes("GITHUB_COPILOT"))&&r.push("AGENTS"),r}let i9="default",i7=["PREPARING","READY","APPLYING","NEEDS_RESOLUTION"],ae=["SCAN","READ"],at=[...ae,"APPLY"],ar={files:{orderBy:{path:"asc"}},groups:{include:{group:!0}}},ai={skills:{include:{skill:{include:{files:!0}}}},repositories:{include:{repository:!0}}};function aa(e,t){if(!e)return t;try{return JSON.parse(e)}catch{return t}}function an(e){return[...e.cursorEnabled?["CURSOR"]:[],...e.githubCopilotEnabled?["GITHUB_COPILOT"]:[],...e.codexEnabled?["CODEX"]:[],...e.claudeEnabled?["CLAUDE"]:[],...e.openCodeEnabled?["OPENCODE"]:[]]}function as(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 ao(e){return/^[A-Za-z]:[\\/]/.test(e)||e.startsWith("\\\\")?i6.win32:i6.posix}function al(e,...t){return ao(e).join(e,...t)}function ac(e){return ao(e).dirname(e)}class au{agentControl;constructor(e){this.agentControl=e,this.agentControl.registerCompletionHandler(i8.SKILL_SCAN_JOB_KIND,e=>this.completeScan(e)),this.agentControl.registerCompletionHandler(i8.SKILL_READ_JOB_KIND,e=>this.completeRead(e)),this.agentControl.registerCompletionHandler(i8.SKILL_APPLY_JOB_KIND,e=>this.completeApply(e)),this.agentControl.registerConnectionHandler(async()=>{await this.requestAutoReconcile()})}publish(e){rQ.agentEventBus.publish(rQ.SKILLS_CHANGED_TOPIC,{id:e??null}),e&&rQ.agentEventBus.publish((0,rQ.skillSyncRunTopic)(e),{id:e})}subscribe(){return rQ.agentEventBus.iterate(rQ.SKILLS_CHANGED_TOPIC)}subscribeRun(e){return rQ.agentEventBus.iterate((0,rQ.skillSyncRunTopic)(e))}async settings(){return(await (0,tY.getPrismaClient)()).skillSettings.upsert({where:{id:i9},create:{id:i9},update:{}})}async overview(e=""){let t=await (0,tY.getPrismaClient)(),r=e.trim().toLocaleLowerCase(),[i,a,n,s,o,l]=await Promise.all([t.skill.findMany({where:{deletedAt:null},include:ar,orderBy:{name:"asc"}}),t.skillGroup.findMany({include:ai,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:r?i.filter(e=>[e.name,e.description,...e.groups.map(({group:e})=>e.name)].some(e=>e.toLocaleLowerCase().includes(r))):i,groups:a,observations:n,installations:r?s.filter(e=>[e.skillName,e.description,e.agent.name,e.rootPath,e.codebase?.repository.name??""].some(e=>e.toLocaleLowerCase().includes(r))):s,settings:o,repositories:l}}async getSkill(e){return(await (0,tY.getPrismaClient)()).skill.findFirst({where:{id:e,deletedAt:null},include:ar})}async saveSkill(e){let t,r=(t=e.files.map(e=>({path:e.path,contentsBase64:e.contentsBase64,executable:e.executable})),(0,i8.parseSkillPackage)({name:e.name,description:e.description,packageHash:(0,i8.hashSkillFiles)(t),files:t})),i=[...new Set(e.groupIds)].slice(0,100),a=await (0,tY.getPrismaClient)();if(await a.skillGroup.count({where:{id:{in:i}}})!==i.length)throw Error("One or more skill groups were not found");let n=await a.skill.findUnique({where:{name:r.name}});if(n&&n.id!==e.id)throw Error("Skill names must be unique");let s=e.id??(0,g.randomUUID)(),o=e.id?await a.skillGroupSkill.findMany({where:{skillId:s},select:{groupId:!0}}):[];return await a.$transaction(async t=>{await t.skill.upsert({where:{id:s},create:{id:s,name:r.name,description:r.description,syncGlobally:e.syncGlobally,packageHash:r.packageHash},update:{name:r.name,description:r.description,syncGlobally:e.syncGlobally,packageHash:r.packageHash,deletedAt:null}}),await t.skillFile.deleteMany({where:{skillId:s}}),await t.skillFile.createMany({data:r.files.map(e=>{let t=Buffer.from(e.contentsBase64,"base64");return{id:(0,g.randomUUID)(),skillId:s,path:e.path,contents:t,executable:e.executable,contentHash:(0,g.createHash)("sha256").update(t).digest("hex")}})}),await t.skillGroupSkill.deleteMany({where:{skillId:s}}),i.length&&await t.skillGroupSkill.createMany({data:i.map(e=>({groupId:e,skillId:s}))})}),this.publish(),await this.scheduleAutoSync([...i,...o.map(e=>e.groupId)]),await this.getSkill(s)}async deleteSkill(e){let t=await (0,tY.getPrismaClient)(),r=await t.skill.findUnique({where:{id:e},include:{groups:!0}});return!!r&&(await t.skill.update({where:{id:e},data:{deletedAt:new Date}}),this.publish(),await this.scheduleAutoSync(r.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 r=[...new Set(e.skillIds)].slice(0,500),i=[...new Set(e.repositoryIds)].slice(0,500),a=await (0,tY.getPrismaClient)(),[n,s,o]=await Promise.all([a.skill.count({where:{id:{in:r},deletedAt:null}}),a.codebaseRepository.count({where:{id:{in:i}}}),a.skillGroup.findUnique({where:{name:t}})]);if(n!==r.length)throw Error("One or more skills were not found");if(s!==i.length)throw Error("One or more repositories were not found");if(o&&o.id!==e.id)throw Error("Group names must be unique");let l=e.id??(0,g.randomUUID)();return await a.$transaction(async e=>{await e.skillGroup.upsert({where:{id:l},create:{id:l,name:t},update:{name:t}}),await e.skillGroupSkill.deleteMany({where:{groupId:l}}),await e.codebaseRepositorySkillGroup.deleteMany({where:{groupId:l}}),r.length&&await e.skillGroupSkill.createMany({data:r.map(e=>({groupId:l,skillId:e}))}),i.length&&await e.codebaseRepositorySkillGroup.createMany({data:i.map(e=>({groupId:l,repositoryId:e}))})}),this.publish(),await this.scheduleAutoSync([l]),a.skillGroup.findUniqueOrThrow({where:{id:l},include:ai})}async validateGroupIds(e){let t=[...new Set(e)].slice(0,100),r=await (0,tY.getPrismaClient)();if(await r.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 (0,tY.getPrismaClient)();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 (0,tY.getPrismaClient)(),r=await t.skillGroup.deleteMany({where:{id:e}});return r.count&&this.publish(),r.count&&(await this.settings()).autoSyncProjectGroups&&await this.prepareSync("GROUP",null,!0),r.count>0}async saveSettings(e){let t=await (0,tY.getPrismaClient)(),r=await t.skillSettings.upsert({where:{id:i9},create:{id:i9,...e},update:e});return this.publish(),r.autoSyncProjectGroups&&await this.prepareSync("GROUP",null,!0),r}async setRepositoryGroups(e,t){let r=await this.validateGroupIds(t),i=await (0,tY.getPrismaClient)();await i.$transaction(async t=>{await t.codebaseRepositorySkillGroup.deleteMany({where:{repositoryId:e}}),r.length&&await t.codebaseRepositorySkillGroup.createMany({data:r.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 (0,tY.getPrismaClient)(),r=await t.codebase.findMany({where:{agentId:e,availability:"AVAILABLE"},include:{worktrees:{where:{missingAt:null}}}}),i=new Map;for(let e of r)for(let t of(i.set(e.folder,{codebaseId:e.id,worktreeId:null,folder:e.folder}),e.worktrees))i.set(t.folder,{codebaseId:e.id,worktreeId:t.id,folder:t.folder});return[...i.values()]}async prepareSync(e,t,r=!1){let i=await (0,tY.getPrismaClient)();if(t&&!await i.skillGroup.findUnique({where:{id:t}}))throw Error("Skill group not found");if(r){let r=await i.skillSyncRun.findFirst({where:{kind:e,groupId:t??null,status:{in:i7}},orderBy:{createdAt:"desc"}});if(r)return r}let a=await i.skillSyncRun.create({data:{id:(0,g.randomUUID)(),kind:e,groupId:t??null,automatic:r,status:"PREPARING"}}),n=an(await this.settings()),s=await i.agent.findMany({orderBy:{name:"asc"}});for(let e of s){let t=await i.skillSyncItem.create({data:{id:(0,g.randomUUID)(),runId:a.id,agentId:e.id,direction:"SCAN",status:"PENDING"}});await this.agentControl.createJob({agentId:e.id,kind:i8.SKILL_SCAN_JOB_KIND,payload:{tools:n,targets:await this.targets(e.id),syncRunId:a.id,syncItemId:t.id},idempotencyKey:`skills:scan:${a.id}:${e.id}`,timeoutSeconds:300,visibility:r?"SYSTEM":"USER"})}return!s.length&&(await i.skillSyncRun.update({where:{id:a.id},data:{status:"READY"}}),r)?this.applyRun(a.id):(this.publish(a.id),this.getRun(a.id))}async getRun(e){return(await (0,tY.getPrismaClient)()).skillSyncRun.findUnique({where:{id:e},include:{group:!0,items:{include:{skill:!0,installation:{include:{agent:!0}},agent:!0},orderBy:{createdAt:"asc"}}}})}completionIds(e){return aa(e.payloadJson,{})}async completeScan(e){let{syncRunId:t,syncItemId:r}=this.completionIds(e);if(!t||!r)return;let i=await (0,tY.getPrismaClient)();if(await i.skillSyncItem.findFirst({where:{id:r,runId:t,direction:"SCAN",status:"PENDING"}})){if("SUCCEEDED"===e.status&&e.resultJson){let t=aa(e.resultJson,{configuredTools:[],installations:[],warnings:[]}),a=new Date;await i.$transaction(async i=>{for(let r of(await i.skillInstallation.updateMany({where:{agentId:e.agentId},data:{present:!1}}),t.configuredTools))i8.AI_TOOLS.includes(r.tool)&&await i.skillToolObservation.upsert({where:{agentId_tool:{agentId:e.agentId,tool:r.tool}},create:{agentId:e.agentId,tool:r.tool,configured:r.configured,homePath:r.homePath,checkedAt:a},update:{configured:r.configured,homePath:r.homePath,checkedAt:a}});for(let r of t.installations){let t=await i.skill.findUnique({where:{name:r.skillName},select:{id:!0,deletedAt:!0}});await i.skillInstallation.upsert({where:{agentId_rootPath_skillName:{agentId:e.agentId,rootPath:r.rootPath,skillName:r.skillName}},create:{id:(0,g.randomUUID)(),agentId:e.agentId,skillId:t&&!t.deletedAt?t.id:null,codebaseId:r.codebaseId,worktreeId:r.worktreeId,scope:r.scope,rootKind:r.rootKind,rootPath:r.rootPath,skillName:r.skillName,description:r.description,packageHash:r.packageHash,present:!0,fileCount:r.fileCount,totalBytes:r.totalBytes,tracked:r.tracked,consumersJson:JSON.stringify(r.consumers),lastSeenAt:a},update:{skillId:t&&!t.deletedAt?t.id:void 0,codebaseId:r.codebaseId,worktreeId:r.worktreeId,scope:r.scope,rootKind:r.rootKind,description:r.description,packageHash:r.packageHash,present:!0,fileCount:r.fileCount,totalBytes:r.totalBytes,tracked:r.tracked,consumersJson:JSON.stringify(r.consumers),lastSeenAt:a}})}await i.skillSyncItem.updateMany({where:{id:r,status:"PENDING"},data:{status:"COMPLETE",error:t.warnings?.length?t.warnings.join("\n").slice(0,64e3):null}})})}else await i.skillSyncItem.updateMany({where:{id:r,status:"PENDING"},data:{status:"FAILED",error:e.error??"Skill scan failed"}});await i.skillSyncItem.count({where:{runId:t,direction:"SCAN",status:"PENDING"}})||await this.buildPlan(t),this.publish(t)}}async configuredByAgent(){let e=await (0,tY.getPrismaClient)(),t=new Set(an(await this.settings())),r=await e.skillToolObservation.findMany({where:{configured:!0}}),i=new Map;for(let e of r){if(!t.has(e.tool))continue;let r=i.get(e.agentId)??[];r.push(e.tool),i.set(e.agentId,r)}return i}async desiredLocations(e,t=new Set){let r=await (0,tY.getPrismaClient)(),i=await this.configuredByAgent(),a=await r.skillToolObservation.findMany({where:{configured:!0}}),n=new Map;for(let e of a)n.set(e.agentId,e.homePath);let s=[];if("ALL"===e.kind){let e=await r.skill.findMany({where:{deletedAt:null,syncGlobally:!0},include:ar});for(let[r,a]of i){if(t.has(r))continue;let i=n.get(r);if(i)for(let t of i5(a,"GLOBAL")){let a=al(i,...as("GLOBAL",t));for(let i of e)s.push({skill:i,agentId:r,codebaseId:null,worktreeId:null,scope:"GLOBAL",rootKind:t,folder:null,rootPath:a,targetPath:al(a,i.name)})}}}for(let a of(await r.skillGroup.findMany({where:"GROUP"===e.kind&&e.groupId?{id:e.groupId}:void 0,include:{skills:{where:{skill:{deletedAt:null}},include:{skill:{include:ar}}},repositories:{include:{repository:{include:{codebases:{where:{availability:"AVAILABLE"},include:{worktrees:{where:{missingAt:null}}}}}}}}}})))for(let e of a.repositories)for(let r of e.repository.codebases){if(t.has(r.agentId))continue;let e=i5(i.get(r.agentId)??[],"PROJECT");for(let t of[{folder:r.folder,worktreeId:null},...r.worktrees.map(e=>({folder:e.folder,worktreeId:e.id}))])for(let i of e){let e=al(t.folder,...as("PROJECT",i));for(let n of a.skills)s.push({skill:n.skill,agentId:r.agentId,codebaseId:r.id,worktreeId:t.worktreeId,scope:"PROJECT",rootKind:i,folder:t.folder,rootPath:e,targetPath:al(e,n.skill.name)})}}return[...new Map(s.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 (0,tY.getPrismaClient)(),r=await t.skillSyncRun.findUniqueOrThrow({where:{id:e}}),i=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[a,n,s,o,l]=await Promise.all([t.skill.findMany({where:{deletedAt:null},include:ar}),t.skill.findMany({where:{deletedAt:{not:null}}}),t.skillInstallation.findMany({where:this.installationWhere(r,i),include:{baseline:!0}}),this.desiredLocations(r,i),"GROUP"===r.kind&&r.groupId?this.desiredLocations({...r,groupId:null},i):this.desiredLocations(r,i)]),c=new Map(a.map(e=>[e.name,e])),u=new Map(a.map(e=>[e.id,e])),d=new Map(n.map(e=>[e.name,e])),p=new Map(n.map(e=>[e.id,e])),h=new Map;for(let e of s){let t=h.get(e.skillName)??[];t.push(e.packageHash),h.set(e.skillName,t)}let m=new Set([...h].flatMap(([e,t])=>{var r;return(r=c.get(e)?.packageHash??null,new Set(t.filter(e=>null===r||e!==r)).size>1)?[e]:[]})),f=[];for(let t of o)s.find(e=>e.agentId===t.agentId&&e.rootPath===t.rootPath&&e.skillName===t.skill.name)||f.push({id:(0,g.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 r of s){let i=r.baseline?.skillId??r.skillId,a=(i?u.get(i):void 0)??c.get(r.skillName),n=(i?p.get(i):void 0)??d.get(r.skillName),s=!!r.baseline&&!!a&&a.name!==r.skillName,h=o.find(e=>e.agentId===r.agentId&&e.rootPath===r.rootPath&&e.skill.name===r.skillName),v=l.find(e=>e.agentId===r.agentId&&e.rootPath===r.rootPath&&e.skill.name===r.skillName);a&&r.packageHash===a.packageHash&&!r.baseline&&await t.skillSyncBaseline.upsert({where:{installationId:r.id},create:{id:(0,g.randomUUID)(),installationId:r.id,skillId:a.id,packageHash:a.packageHash},update:{skillId:a.id,packageHash:a.packageHash,syncedAt:new Date}});let w="UNCHANGED",b="COMPLETE";if(n&&r.baseline&&!r.tracked)w="DELETE_MANAGED",b="READY";else if(s)w=r.tracked?"CONFLICT":"DELETE_MANAGED",b=r.tracked?"BLOCKED":"READY";else if(v||!r.baseline||r.tracked)if(a)if(r.packageHash!==a.packageHash){var y;b="CONFLICT"===(w=m.has(r.skillName)?"CONFLICT":(y={databaseHash:a.packageHash,targetHash:r.packageHash,baselineHash:r.baseline?.packageHash??null,tracked:r.tracked}).databaseHash===y.targetHash?"UNCHANGED":y.tracked?"CONFLICT":y.baselineHash===y.databaseHash?"IMPORT":y.baselineHash===y.targetHash?"EXPORT":"CONFLICT")?"BLOCKED":"READY"}else!v&&["CURSOR","GITHUB_COPILOT","CODEX_LEGACY","OPENCODE"].includes(r.rootKind)&&l.some(e=>e.agentId===r.agentId&&e.scope===r.scope&&("GLOBAL"===r.scope||e.codebaseId===r.codebaseId&&e.worktreeId===r.worktreeId)&&e.skill.name===r.skillName&&e.skill.packageHash===r.packageHash)&&!r.tracked&&(w="DELETE_REDUNDANT",b="READY");else b="CONFLICT"==(w=m.has(r.skillName)?"CONFLICT":"IMPORT")||"PROJECT"===r.scope?"BLOCKED":"READY";else w="DELETE_MANAGED",b="READY";f.push({id:(0,g.randomUUID)(),runId:e,skillId:a?.id??n?.id??null,installationId:r.id,agentId:r.agentId,direction:w,status:b,sourceHash:a?.packageHash??null,targetHash:r.packageHash,candidatePackageJson:JSON.stringify({location:{scope:r.scope,rootKind:r.rootKind,folder:"PROJECT"===r.scope?h?.folder??null:null,skillName:r.skillName},projectGroupRequired:!a&&"PROJECT"===r.scope})})}f.length&&await t.skillSyncItem.createMany({data:f});let v=await t.skillSyncItem.findMany({where:{runId:e,installationId:{not:null},direction:{in:["IMPORT","CONFLICT"]}},include:{installation:!0}}),w=new Map;for(let e of v){if(!e.agentId||!e.installation)continue;let t=w.get(e.agentId)??[];t.push(e),w.set(e.agentId,t)}let b=an(await this.settings());for(let[r,i]of w){let a=await t.skillSyncItem.create({data:{id:(0,g.randomUUID)(),runId:e,agentId:r,direction:"READ",status:"PENDING"}}),n=await this.targets(r);await this.agentControl.createJob({agentId:r,kind:i8.SKILL_READ_JOB_KIND,payload:{tools:b,targets:n,requests:i.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:a.id},idempotencyKey:`skills:read:${e}:${r}`,timeoutSeconds:300})}await this.refreshRunStatus(e)}async completeRead(e){let{syncRunId:t,syncItemId:r}=this.completionIds(e);if(!t||!r)return;let i=await (0,tY.getPrismaClient)();if(await i.skillSyncItem.findFirst({where:{id:r,runId:t,direction:"READ",status:"PENDING"}})){if("SUCCEEDED"===e.status&&e.resultJson){let a=aa(e.resultJson,{packages:[]}),n=await i.skillSyncItem.findMany({where:{runId:t,agentId:e.agentId,installationId:{not:null},direction:{in:["IMPORT","CONFLICT"]}},include:{installation:!0}});for(let e of a.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===al(e.folder,...as("PROJECT",e.rootKind))));if(!t)continue;let r=aa(t.candidatePackageJson,{});await i.skillSyncItem.update({where:{id:t.id},data:{candidatePackageJson:JSON.stringify({...r,package:e.package})}})}await i.skillSyncItem.updateMany({where:{id:r,status:"PENDING"},data:{status:"COMPLETE"}})}else await i.skillSyncItem.updateMany({where:{id:r,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 (0,tY.getPrismaClient)(),r=await t.skillSyncItem.findMany({where:{runId:e}});if(r.some(e=>ae.includes(e.direction)&&"PENDING"===e.status))return;let i=r.some(e=>"BLOCKED"===e.status),a=r.some(e=>"FAILED"===e.status),n=i?"NEEDS_RESOLUTION":a?"PARTIAL":"READY",s=await t.skillSyncRun.update({where:{id:e},data:{status:n}});this.publish(e),s.automatic&&"READY"===n&&await this.applyRun(e)}async skipPending(e){let t=await (0,tY.getPrismaClient)();await t.skillSyncRun.findUniqueOrThrow({where:{id:e}});let r=await t.skillSyncItem.findMany({where:{runId:e,direction:{in:at},status:"PENDING",agentId:{not:null}}}),i=[];for(let a of r){if(1!==(await t.skillSyncItem.updateMany({where:{id:a.id,status:"PENDING"},data:{status:"SKIPPED",resolution:"SKIP"}})).count||!a.agentId)continue;i.push(a);let r=await t.agentJob.findUnique({where:{agentId_idempotencyKey:{agentId:a.agentId,idempotencyKey:`skills:${a.direction.toLowerCase()}:${e}:${a.agentId}`}}});r&&await this.agentControl.cancelJob(r.id)}if(!i.length)return this.getRun(e);let a=[...new Set(i.flatMap(e=>"READ"===e.direction&&e.agentId?[e.agentId]:[]))];a.length&&await t.skillSyncItem.updateMany({where:{runId:e,agentId:{in:a},direction:{notIn:at},status:{in:["READY","BLOCKED"]}},data:{status:"SKIPPED",resolution:"SKIP"}});let n=i.filter(e=>"APPLY"===e.direction),s=n.flatMap(e=>{let{deployments:t=[]}=aa(e.candidatePackageJson,{});return t.map(e=>e.id)});return s.length&&await t.skillDeployment.updateMany({where:{id:{in:s},status:"PENDING"},data:{status:"SKIPPED"}}),i.some(e=>"SCAN"===e.direction)?await t.skillSyncItem.count({where:{runId:e,direction:"SCAN",status:"PENDING"}})||await this.buildPlan(e):a.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 (0,tY.getPrismaClient)(),r=await t.skillSyncItem.findUniqueOrThrow({where:{id:e.itemId}});if(!["BLOCKED","READY"].includes(r.status))throw Error("Sync item cannot be resolved");let i=aa(r.candidatePackageJson,{});if("MANUAL"===e.resolution&&(i.package=(0,i8.parseSkillPackage)(e.package,"manual resolution package")),"TARGET"===e.resolution&&!i.package)throw Error("The target package is unavailable");if("DELETE"===e.resolution&&!r.installationId)throw Error("The client skill installation is unavailable");if(i.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");i.groupId=e.groupId}if(await t.skillSyncItem.update({where:{id:r.id},data:{resolution:e.resolution,direction:"DELETE"===e.resolution?"DELETE_REDUNDANT":r.direction,candidatePackageJson:JSON.stringify(i),status:"SKIP"===e.resolution?"SKIPPED":"READY"}}),["TARGET","MANUAL"].includes(e.resolution)){let e=i.package?.name??null;if(e){let i=(await t.skillSyncItem.findMany({where:{runId:r.runId,id:{not:r.id},direction:"CONFLICT",status:{in:["BLOCKED","READY"]}},include:{skill:!0,installation:!0}})).flatMap(t=>(t.skill?.name??t.installation?.skillName)===e?[t.id]:[]);i.length&&await t.skillSyncItem.updateMany({where:{id:{in:i}},data:{resolution:"DATABASE",status:"READY"}})}}return await this.refreshRunStatus(r.runId),this.getRun(r.runId)}async importCandidates(e){let t=await (0,tY.getPrismaClient)();for(let r of(await t.skillSyncItem.findMany({where:{runId:e,status:"READY",OR:[{direction:"IMPORT"},{direction:"CONFLICT",resolution:{in:["TARGET","MANUAL"]}}]},include:{installation:!0}}))){let e=aa(r.candidatePackageJson,{});if(!e.package)continue;let i=await t.skill.findUnique({where:{name:e.package.name},include:ar}),a=await this.saveSkill({id:i?.id,name:e.package.name,description:e.package.description,syncGlobally:i?.syncGlobally??!e.groupId,groupIds:[...i?.groups.map(e=>e.groupId)??[],...e.groupId?[e.groupId]:[]],files:e.package.files});r.installationId&&(await t.skillInstallation.update({where:{id:r.installationId},data:{skillId:a.id}}),r.targetHash===a.packageHash&&await t.skillSyncBaseline.upsert({where:{installationId:r.installationId},create:{id:(0,g.randomUUID)(),installationId:r.installationId,skillId:a.id,packageHash:a.packageHash},update:{skillId:a.id,packageHash:a.packageHash,syncedAt:new Date}}))}}async applyRun(e){let t=await (0,tY.getPrismaClient)(),r=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 i=new Set((await t.skillSyncItem.findMany({where:{runId:e,direction:{in:ae},status:"SKIPPED"},select:{agentId:!0}})).flatMap(e=>e.agentId?[e.agentId]:[])),a=await this.desiredLocations(r,i),n=await t.skillInstallation.findMany({where:this.installationWhere(r,i)}),s=new Map,o=new Map,l=(e,t)=>{let r=s.get(e)??[];r.push(t),s.set(e,r)},c=(e,t)=>{let r=o.get(e)??[];r.push(t),o.set(e,r)};for(let e of a){let r=n.find(t=>t.agentId===e.agentId&&t.rootPath===e.rootPath&&t.skillName===e.skill.name);if(r?.packageHash===e.skill.packageHash||r?.tracked)continue;l(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 i=await t.skillDeployment.upsert({where:{agentId_targetPath:{agentId:e.agentId,targetPath:e.targetPath}},create:{id:(0,g.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}});c(e.agentId,{id:i.id,desiredHash:e.skill.packageHash})}let u=await t.skillSyncItem.findMany({where:{runId:e,direction:{in:["DELETE_REDUNDANT","DELETE_MANAGED"]},status:"READY"},include:{installation:!0}}),d=new Set(u.flatMap(e=>e.installationId?[e.installationId]:[])),p=n.filter(e=>!d.has(e.id)&&!e.tracked&&["CURSOR","GITHUB_COPILOT","CODEX_LEGACY","OPENCODE"].includes(e.rootKind)&&!a.some(t=>t.agentId===e.agentId&&t.rootPath===e.rootPath&&t.skill.name===e.skillName)&&a.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[...u.flatMap(e=>e.installation?[e.installation]:[]),...p]){if(!e||e.tracked)continue;let t=await this.targets(e.agentId),r="PROJECT"===e.scope?t.find(t=>t.codebaseId===e.codebaseId&&t.worktreeId===e.worktreeId)?.folder??null:null;("PROJECT"!==e.scope||r)&&l(e.agentId,{kind:"DELETE",scope:e.scope,rootKind:e.rootKind,folder:r,skillName:e.skillName,manageGitExclude:"PROJECT"===e.scope})}for(let[r,i]of s){let a=await t.skillSyncItem.create({data:{id:(0,g.randomUUID)(),runId:e,agentId:r,direction:"APPLY",status:"PENDING",candidatePackageJson:JSON.stringify({deployments:o.get(r)??[]})}});await this.agentControl.createJob({agentId:r,kind:i8.SKILL_APPLY_JOB_KIND,payload:{operations:i,syncRunId:e,syncItemId:a.id},idempotencyKey:`skills:apply:${e}:${r}`,timeoutSeconds:600})}return await t.skillSyncRun.update({where:{id:e},data:s.size?{status:"APPLYING"}:{status:"SUCCEEDED",finishedAt:new Date}}),this.publish(e),this.getRun(e)}async completeApply(e){let{syncRunId:t,syncItemId:r}=this.completionIds(e);if(!t||!r)return;let i=await (0,tY.getPrismaClient)(),a=await i.skillSyncItem.findFirst({where:{id:r,runId:t,direction:"APPLY",status:"PENDING"}});if(!a)return;let n="SUCCEEDED"===e.status,{deployments:s=[]}=aa(a?.candidatePackageJson??null,{});await i.skillSyncItem.updateMany({where:{id:r,status:"PENDING"},data:{status:n?"COMPLETE":"FAILED",error:n?null:e.error??"Skill apply failed"}});let o=await i.skillDeployment.findMany({where:{id:{in:s.map(e=>e.id)},agentId:e.agentId,status:"PENDING"},include:{skill:{include:{files:!0}}}}),l=aa(e.resultJson,{});if(n){let t=await this.configuredByAgent();for(let e of o){let r=s.find(t=>t.id===e.id),a=l.results?.find(t=>"WRITE"===t.kind&&t.path===e.targetPath);if(!r||e.desiredHash!==r.desiredHash||a?.packageHash!==r.desiredHash)continue;let n=await i.skillInstallation.upsert({where:{agentId_rootPath_skillName:{agentId:e.agentId,rootPath:ac(e.targetPath),skillName:e.skill.name}},create:{id:(0,g.randomUUID)(),skillId:e.skillId,agentId:e.agentId,codebaseId:e.codebaseId,worktreeId:e.worktreeId,scope:e.scope,rootKind:e.rootKind,rootPath:ac(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 i.skillSyncBaseline.upsert({where:{installationId:n.id},create:{id:(0,g.randomUUID)(),installationId:n.id,skillId:e.skillId,packageHash:e.desiredHash},update:{skillId:e.skillId,packageHash:e.desiredHash,syncedAt:new Date}}),await i.skillDeployment.update({where:{id:e.id},data:{status:"INSTALLED",installedHash:e.desiredHash,lastError:null}})}for(let t of l.results??[])if("DELETE"===t.kind){var c;await i.skillInstallation.updateMany({where:{agentId:e.agentId,rootPath:ac(t.path),skillName:ao(c=t.path).basename(c)},data:{present:!1,lastSeenAt:new Date}})}}else for(let t of s)await i.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 i.skillSyncItem.count({where:{runId:t,direction:"APPLY",status:"PENDING"}})){let e=await i.skillSyncItem.count({where:{runId:t,direction:"APPLY",status:{in:["FAILED","SKIPPED"]}}});await i.skillSyncRun.update({where:{id:t},data:{status:e?"PARTIAL":"SUCCEEDED",finishedAt:new Date}})}this.publish(t)}}e.i(464841);var ad=e.i(220629),ap=e.i(692680);e.i(493015);var ah=e.i(49172);function am(e){if(!e)return{};let t=JSON.parse(e);return t&&"object"==typeof t&&!Array.isArray(t)?t:{}}function af(e){if(!e)return null;let t=new Date(e);return Number.isNaN(t.valueOf())?null:t}function ag(e){try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>"string"==typeof e):[]}catch{return[]}}class ay{agentControl;fetcher;credentials;constructor(e,t=fetch,r=new tQ.CredentialService){for(const i of(this.agentControl=e,this.fetcher=t,this.credentials=r,this.agentControl.registerCompletionHandler(ap.SIGNING_ASSETS_SCAN_JOB_KIND,e=>this.completeScan(e)),[ap.SIGNING_PROFILE_READ_JOB_KIND,ap.SIGNING_PROFILE_INSTALL_JOB_KIND,ap.SIGNING_PROFILE_DELETE_JOB_KIND,ap.SIGNING_IDENTITY_IMPORT_JOB_KIND,ap.SIGNING_IDENTITY_DELETE_JOB_KIND]))this.agentControl.registerCompletionHandler(i,e=>this.completeOperation(e))}changed(){rQ.agentEventBus.publish(rQ.SIGNING_ASSETS_CHANGED_TOPIC,{changed:!0})}deleteTransferJobSoon(e){setTimeout(()=>{(0,tY.getPrismaClient)().then(t=>t.agentJob.deleteMany({where:{id:e,visibility:"SYSTEM"}}))},3e4).unref()}subscribe(){return rQ.agentEventBus.iterate(rQ.SIGNING_ASSETS_CHANGED_TOPIC)}async completeScan(e){if("SUCCEEDED"!==e.status)return;let t=(0,ap.parseSigningAssetsScanResult)(am(e.resultJson)),r=await (0,tY.getPrismaClient)(),i=new Date;await r.$transaction(async r=>{for(let a of(await r.signingProfileAsset.updateMany({where:{agentId:e.agentId,missingAt:null},data:{missingAt:i}}),await r.signingCertificateAsset.updateMany({where:{agentId:e.agentId,missingAt:null},data:{missingAt:i}}),t.profiles))await r.signingProfileAsset.upsert({where:{agentId_uuid:{agentId:e.agentId,uuid:a.uuid}},create:{id:(0,g.randomUUID)(),agentId:e.agentId,uuid:a.uuid,contentHash:a.contentHash,name:a.name,profileType:a.profileType,bundleId:a.bundleId,teamId:a.teamId,teamName:a.teamName,platformsJson:JSON.stringify(a.platforms),deviceCount:a.deviceCount,deviceUdidsJson:JSON.stringify(a.deviceUdids),certificateSha1sJson:JSON.stringify(a.certificateSha1s),createdAt:af(a.createdAt),expiresAt:af(a.expiresAt),expired:a.expired,xcodeManaged:a.xcodeManaged,observedAt:i},update:{contentHash:a.contentHash,name:a.name,profileType:a.profileType,bundleId:a.bundleId,teamId:a.teamId,teamName:a.teamName,platformsJson:JSON.stringify(a.platforms),deviceCount:a.deviceCount,deviceUdidsJson:JSON.stringify(a.deviceUdids),certificateSha1sJson:JSON.stringify(a.certificateSha1s),createdAt:af(a.createdAt),expiresAt:af(a.expiresAt),expired:a.expired,xcodeManaged:a.xcodeManaged,observedAt:i,missingAt:null}});for(let a of t.certificates)await r.signingCertificateAsset.upsert({where:{agentId_sha1:{agentId:e.agentId,sha1:a.sha1}},create:{id:(0,g.randomUUID)(),agentId:e.agentId,sha1:a.sha1,sha256:a.sha256,name:a.name,teamId:a.teamId,certificateType:a.certificateType,notBefore:af(a.notBefore),expiresAt:af(a.expiresAt),expired:a.expired,hasPrivateKey:a.hasPrivateKey,observedAt:i},update:{sha256:a.sha256,name:a.name,teamId:a.teamId,certificateType:a.certificateType,notBefore:af(a.notBefore),expiresAt:af(a.expiresAt),expired:a.expired,hasPrivateKey:a.hasPrivateKey,observedAt:i,missingAt:null}})}),this.deleteTransferJobSoon(e.id),this.changed()}async refreshAfterMutation(e,t){await this.agentControl.createJob({agentId:e,kind:ap.SIGNING_ASSETS_SCAN_JOB_KIND,payload:{},idempotencyKey:`signing:${t}:${e}:refresh`,timeoutSeconds:60,visibility:"SYSTEM"})}async finishOperation(e){let t=await (0,tY.getPrismaClient)(),r=await t.signingOperationItem.findMany({where:{operationId:e}});if(r.some(e=>["WAITING","QUEUED","RUNNING"].includes(e.status)))return;let i=r.filter(e=>"SUCCEEDED"!==e.status);await t.signingOperation.update({where:{id:e},data:{status:i.length?"FAILED":"SUCCEEDED",error:i.map(e=>e.error).filter(Boolean).join("; ")||null,finishedAt:new Date}}),this.changed()}async completeOperation(e){let t=await (0,tY.getPrismaClient)(),r=await t.signingOperationItem.findUnique({where:{jobId:e.id},include:{operation:!0}});if(r){if(await t.signingOperationItem.update({where:{id:r.id},data:{status:e.status,error:e.error,finishedAt:new Date}}),e.kind===ap.SIGNING_PROFILE_READ_JOB_KIND&&"SUCCEEDED"===e.status&&"SYNC_PROFILE"===r.operation.kind){let i=am(e.resultJson).contentBase64;if("string"==typeof i&&i)for(let e of(await t.signingOperationItem.findMany({where:{operationId:r.operationId,status:"WAITING"}}))){let a=await this.agentControl.createJob({agentId:e.agentId,kind:ap.SIGNING_PROFILE_INSTALL_JOB_KIND,payload:{contentBase64:i},idempotencyKey:`signing:${r.operationId}:${e.agentId}:install`,timeoutSeconds:60,visibility:"SYSTEM"});await t.signingOperationItem.update({where:{id:e.id},data:{jobId:a.id,status:a.status}})}else await t.signingOperation.update({where:{id:r.operationId},data:{status:"FAILED",error:"Profile read returned no content"}})}e.kind===ap.SIGNING_PROFILE_READ_JOB_KIND&&"SUCCEEDED"!==e.status&&"SYNC_PROFILE"===r.operation.kind&&await t.signingOperationItem.updateMany({where:{operationId:r.operationId,status:"WAITING"},data:{status:"FAILED",error:"Source profile could not be read",finishedAt:new Date}}),"SUCCEEDED"===e.status&&e.kind!==ap.SIGNING_PROFILE_READ_JOB_KIND&&await this.refreshAfterMutation(e.agentId,r.operationId),await this.finishOperation(r.operationId),this.deleteTransferJobSoon(e.id)}}async refresh(e){let t=await (0,tY.getPrismaClient)(),r=await t.agent.findMany({where:e?.length?{id:{in:[...new Set(e)]}}:void 0,orderBy:{name:"asc"}}),i=[];for(let e of r)ag(e.capabilitiesJson).includes(ap.SIGNING_ASSETS_SCAN_JOB_KIND)&&i.push(await this.agentControl.createJob({agentId:e.id,kind:ap.SIGNING_ASSETS_SCAN_JOB_KIND,payload:{},idempotencyKey:`signing:scan:${Date.now()}:${e.id}`,timeoutSeconds:60,visibility:"SYSTEM"}));return i}async agents(){let e=await (0,tY.getPrismaClient)();return(await e.agent.findMany({orderBy:{name:"asc"}})).map(e=>({id:e.id,name:e.name,hostname:e.hostname,supported:ag(e.capabilitiesJson).includes(ap.SIGNING_ASSETS_SCAN_JOB_KIND),lastSeenAt:e.lastSeenAt?.toISOString()??null}))}async profiles(){let e=await (0,tY.getPrismaClient)(),t=await e.signingProfileAsset.findMany({where:{missingAt:null},include:{agent:{select:{id:!0,name:!0}}},orderBy:[{expiresAt:"asc"},{name:"asc"}]}),r=new Map;for(let e of t){let t=`${e.uuid}:${e.contentHash}`;r.set(t,[...r.get(t)??[],e])}return[...r.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:ag(t.platformsJson),deviceCount:t.deviceCount,deviceUdids:ag(t.deviceUdidsJson),certificateSha1s:ag(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,r=e.filter(e=>{let r=e.toUpperCase();return!t.has(r)&&(t.add(r),!0)}),i=r.map(e=>e.toUpperCase());if(!i.length)return[];let a=await (0,tY.getPrismaClient)(),n=new Map((await a.iosDevice.findMany({where:{udid:{in:i}},select:{id:!0,udid:!0,displayName:!0,product:!0,osVersion:!0,status:!0}})).map(e=>[e.udid.toUpperCase(),e]));return r.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 (0,tY.getPrismaClient)(),t=await e.signingCertificateAsset.findMany({where:{missingAt:null},include:{agent:{select:{id:!0,name:!0}}},orderBy:[{expiresAt:"asc"},{name:"asc"}]}),r=new Map;for(let e of t)r.set(e.sha1,[...r.get(e.sha1)??[],e]);return[...r.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 (0,tY.getPrismaClient)()).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,r,i=null,a=[]){let n=await (0,tY.getPrismaClient)(),s=(0,g.randomUUID)();return n.signingOperation.create({data:{id:s,kind:e,assetKey:t,sourceAgentId:i,items:{create:[...new Set(r)].map(e=>({id:(0,g.randomUUID)(),agentId:e,status:a.includes(e)?"WAITING":"QUEUED"}))}},include:{items:{include:{agent:{select:{id:!0,name:!0}}}}}})}async attachJob(e,t){let r=await (0,tY.getPrismaClient)();await r.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 r=(0,g.createHash)("sha256").update(Buffer.from(e,"base64")).digest("hex").toUpperCase(),i=await this.operation("INSTALL_PROFILE",r,t);for(let t of i.items){let r=await this.agentControl.createJob({agentId:t.agentId,kind:ap.SIGNING_PROFILE_INSTALL_JOB_KIND,payload:{contentBase64:e},idempotencyKey:`signing:${i.id}:${t.agentId}:install`,timeoutSeconds:60,visibility:"SYSTEM"});await this.attachJob(t.id,r)}return this.changed(),i}async downloadProfile(e,t){let r=(0,g.randomUUID)(),i=await this.agentControl.createJob({agentId:t,kind:ap.SIGNING_PROFILE_READ_JOB_KIND,payload:{uuid:e},idempotencyKey:`signing:download:${r}:${e}`,timeoutSeconds:60,visibility:"SYSTEM"}),a=await (0,tY.getPrismaClient)();try{let t=Date.now()+55e3;for(;Date.now()<t;){let t=await this.agentControl.getJob(i.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 r=am(t.resultJson);if("string"!=typeof r.contentBase64)throw Error("Agent returned no provisioning profile content");return{uuid:e,filename:`${e}.mobileprovision`,contentBase64:r.contentBase64}}await new Promise(e=>setTimeout(e,250))}throw Error("Timed out reading provisioning profile")}finally{await a.agentJob.deleteMany({where:{id:i.id,visibility:"SYSTEM"}})}}async syncProfile(e,t,r){let i=[...new Set(r)].filter(e=>e!==t);if(!i.length)throw Error("Select at least one target agent");let a=await this.operation("SYNC_PROFILE",e,[t,...i],t,i),n=a.items.find(e=>e.agentId===t),s=await this.agentControl.createJob({agentId:t,kind:ap.SIGNING_PROFILE_READ_JOB_KIND,payload:{uuid:e},idempotencyKey:`signing:${a.id}:${t}:read`,timeoutSeconds:60,visibility:"SYSTEM"});return await this.attachJob(n.id,s),this.changed(),a}async deleteProfile(e,t){if(!t.length)throw Error("Select at least one agent");let r=await this.operation("DELETE_PROFILE",e,t);for(let t of r.items){let i=await this.agentControl.createJob({agentId:t.agentId,kind:ap.SIGNING_PROFILE_DELETE_JOB_KIND,payload:{uuid:e},idempotencyKey:`signing:${r.id}:${t.agentId}:delete`,timeoutSeconds:60,visibility:"SYSTEM"});await this.attachJob(t.id,i)}return this.changed(),r}async deleteExpiredProfiles(e){let t=await (0,tY.getPrismaClient)(),r=await t.signingProfileAsset.findMany({where:{expired:!0,missingAt:null,...e?.length?{agentId:{in:e}}:{}}}),i=new Map;for(let e of r)i.set(e.uuid,[...i.get(e.uuid)??[],e.agentId]);let a=[];for(let[e,t]of i)a.push(await this.deleteProfile(e,t));return a}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 r=[...new Set(e.targetAgentIds)],i=await (0,tY.getPrismaClient)(),n=new Map((await i.agent.findMany({where:{id:{in:r}},select:{id:!0,name:!0,capabilitiesJson:!0,lastSeenAt:!0,disconnectedAt:!0,heartbeatIntervalSeconds:!0}})).map(e=>[e.id,e])),s=Date.now(),o=r.filter(e=>{let t=n.get(e);return!t||!function(e,t=Date.now()){return null!==e.lastSeenAt&&t-e.lastSeenAt.getTime()<=(0,a.agentOnlineWindowMs)(e)&&null===e.disconnectedAt}(t,s)||!ag(t.capabilitiesJson).includes(ap.SIGNING_IDENTITY_IMPORT_JOB_KIND)});if(o.length)throw Error(`Identity imports require online supported agents: ${o.map(e=>n.get(e)?.name??e).join(", ")}`);let l=(0,g.createHash)("sha256").update(t).digest("hex").toUpperCase(),c=await this.operation("IMPORT_IDENTITY",l,r);for(let t of c.items){let r=this.agentControl.createSigningSecretTransfer(t.agentId,{p12Base64:e.p12Base64,passphrase:e.passphrase});try{let e=await this.agentControl.createJob({agentId:t.agentId,kind:ap.SIGNING_IDENTITY_IMPORT_JOB_KIND,payload:{transferId:r,sha256:l},idempotencyKey:`signing:${c.id}:${t.agentId}:import`,timeoutSeconds:120,visibility:"SYSTEM"});await this.attachJob(t.id,e)}catch(e){throw this.agentControl.revokeSigningSecretTransfer(r),e}}return this.changed(),c}async deleteIdentity(e,t){if(!t.length)throw Error("Select at least one agent");let r=e.toUpperCase(),i=[...new Set(t)],a=await (0,tY.getPrismaClient)(),n=new Set((await a.signingCertificateAsset.findMany({where:{sha1:r,agentId:{in:i},hasPrivateKey:!0,missingAt:null},select:{agentId:!0}})).map(e=>e.agentId)),s=i.filter(e=>n.has(e));if(!s.length)throw Error("The identity has no private key on the selected agents");let o=await this.operation("DELETE_IDENTITY",r,s);for(let e of o.items){let t=await this.agentControl.createJob({agentId:e.agentId,kind:ap.SIGNING_IDENTITY_DELETE_JOB_KIND,payload:{sha1:r},idempotencyKey:`signing:${o.id}:${e.agentId}:delete`,timeoutSeconds:60,visibility:"SYSTEM"});await this.attachJob(e.id,t)}return this.changed(),o}async appleClient(){return new ah.AppleDeveloperClient(await (0,ah.storedAppleDeveloperCredentials)(this.credentials),this.fetcher)}async portalInventory(){let e=await this.appleClient(),[t,r,i,a]=await Promise.all([e.listProfiles(),e.listCertificates(),e.listBundleIds(),e.listDevices()]);return{profiles:t,certificates:r,bundleIds:i,devices:a}}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 av=e.i(308810),aw=e.i(726355);let ab={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},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},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},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},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},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},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},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},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},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},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},WORKFLOW_MESSAGE:{key:"WORKFLOW_MESSAGE",category:"WORKFLOWS",label:"Workflow message",description:"A workflow sends a generic notification.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1},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},WORKFLOW_COMPLETED:{key:"WORKFLOW_COMPLETED",category:"WORKFLOWS",label:"Workflow completed",description:"A workflow run completes successfully.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1},WORKFLOW_FAILED:{key:"WORKFLOW_FAILED",category:"WORKFLOWS",label:"Workflow failed",description:"A workflow run fails.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1},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}};function ak(e){return e in ab?ab[e]:null}let ax="default";function aS(e,t,r){let i=e.trim();if(!i)throw Error(`${t} is required`);if(i.length>r)throw Error(`${t} is too long`);return i}function aI(e){let t,r=aS(e,"Push endpoint",4e3);try{t=new URL(r)}catch{throw Error("Push endpoint must be a valid URL")}if("https:"!==t.protocol)throw Error("Push endpoint must use HTTPS");return r}function aE(e,t){let r=new Date(e);if(!Number.isFinite(r.getTime()))throw Error(`${t} is invalid`);return r}function aA(){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 a_(e){if(!e||"object"!=typeof e)return null;let t=e.statusCode;return"number"==typeof t?t:null}class aC{credentialService;vapidPreparation;constructor(e){this.credentialService=e,this.vapidPreparation=null}publish(e){rQ.agentEventBus.publish(rQ.APP_NOTIFICATIONS_CHANGED_TOPIC,{notificationsChanged:e})}subscribe(){return rQ.agentEventBus.iterate(rQ.APP_NOTIFICATIONS_CHANGED_TOPIC)}async preferences(){let e=await (0,tY.getPrismaClient)(),t=new Map((await e.notificationPreference.findMany()).map(e=>[e.typeKey,e]));return Object.values(ab).map(e=>{let r=t.get(e.key);return{...e,sidebarEnabled:r?.sidebarEnabled??e.defaultSidebarEnabled,browserEnabled:r?.browserEnabled??e.defaultBrowserEnabled,webPushEnabled:r?.webPushEnabled??e.defaultWebPushEnabled,updatedAt:r?.updatedAt??null}})}async savePreference(e){let t=ak(e.typeKey);if(!t)throw Error("Unknown notification type");let r=await (0,tY.getPrismaClient)(),i=await r.notificationPreference.upsert({where:{typeKey:t.key},create:{typeKey:t.key,sidebarEnabled:e.sidebarEnabled,browserEnabled:e.browserEnabled,webPushEnabled:e.webPushEnabled},update:{sidebarEnabled:e.sidebarEnabled,browserEnabled:e.browserEnabled,webPushEnabled:e.webPushEnabled}});return this.publish({kind:"PREFERENCES_UPDATED",notification:null,notificationId:null}),{...t,...i}}async recordInTransaction(e,t){let r=ak(t.typeKey);if(!r)throw Error("Unknown notification type");let i=await e.notificationPreference.findUnique({where:{typeKey:r.key}}),a=i?.sidebarEnabled??r.defaultSidebarEnabled,n=i?.browserEnabled??r.defaultBrowserEnabled,s=i?.webPushEnabled??r.defaultWebPushEnabled;if(!a&&!n&&!s)return null;let o=aS(t.dedupeKey,"Deduplication key",500);return await e.appNotification.findUnique({where:{dedupeKey:o}})?null:e.appNotification.create({data:{id:(0,g.randomUUID)(),dedupeKey:o,typeKey:r.key,title:aS(t.title,"Notification title",240),body:aS(t.body,"Notification body",1e3),href:function(e){let t=aS(e,"Notification link",2e3);if(!t.startsWith("/")||t.startsWith("//"))throw Error("Notification links must be same-origin paths");return t}(t.href),resourceKind:aS(t.resourceKind,"Resource kind",100),resourceId:aS(t.resourceId,"Resource ID",500),worktreeId:t.worktreeId??null,highlightColor:t.highlightColor?.trim()||null,sidebarRequested:a,browserRequested:n,webPushRequested: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)}))}async history(e={}){let t=Math.max(1,Math.min(e.first??100,200)),r=await (0,tY.getPrismaClient)(),[i,a]=await Promise.all([r.appNotification.findMany({orderBy:[{createdAt:"desc"},{id:"desc"}],take:t+1,...e.after?{cursor:{id:e.after},skip:1}:void 0}),r.appNotification.count()]);return{items:i.slice(0,t),nextCursor:i.length>t?i[t-1].id:null,totalCount:a}}async sidebar(e=50){return(await (0,tY.getPrismaClient)()).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 (0,tY.getPrismaClient)(),r=await t.appNotification.updateMany({where:{id:e,sidebarRequested:!0,sidebarDismissedAt:null},data:{sidebarDismissedAt:new Date}});return r.count&&this.publish({kind:"DISMISSED",notification:null,notificationId:e}),r.count>0}async dismissAll(){let e=await (0,tY.getPrismaClient)(),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??[],r=e.all&&0===t.length?[]:[...new Set(e.ids??[])],i=[...new Set(e.excludedIds??[])],a=e.ranges??[];if(r.length>5e3||i.length>5e3)throw Error("Notification selection is too large");if(a.length>366||t.length>366)throw Error("Notification date selection is too large");let n=t.map(e=>{let t=aE(e.start,"Excluded selection start"),r=aE(e.end,"Excluded selection end");if(t>=r)throw Error("Excluded selection range is invalid");return{createdAt:{gte:t,lt:r}}}),s={NOT:{OR:n}},o=[];if(r.length&&o.push({id:{in:r}}),e.all)o.push(n.length?s:{});else if(a.length){let e=a.map(e=>{let t=aE(e.start,"Selection start"),r=aE(e.end,"Selection end");if(t>=r)throw Error("Selection range is invalid");return{createdAt:{gte:t,lt:r}}});o.push({AND:[{OR:e},...n.length?[s]:[]]})}if(!o.length)return{id:{in:[]}};let l=1===o.length?o[0]:{OR:o};return i.length?{AND:[l,{id:{notIn:i}}]}:l}async deleteSelection(e){let t=await (0,tY.getPrismaClient)(),r=await t.appNotification.deleteMany({where:this.selectionWhere(e)});return r.count&&this.publish({kind:"DELETED",notification:null,notificationId:null}),r.count}async deleteAll(){let e=await (0,tY.getPrismaClient)(),t=await e.appNotification.deleteMany();return t.count&&this.publish({kind:"HISTORY_CLEARED",notification:null,notificationId:null}),t.count}async webPushState(){let e=await (0,tY.getPrismaClient)(),[t,r]=await Promise.all([e.webPushSettings.findUnique({where:{id:ax}}),e.webPushSubscription.count()]),i=await this.credentialService.isConfigured(tX.CREDENTIALS.webPushVapidPrivateKey);return{configured:!!(t?.vapidPublicKey&&i),publicKey:t?.vapidPublicKey??null,subscriptionCount:r}}async webPushSubscriptions(){return(await (0,tY.getPrismaClient)()).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 (0,tY.getPrismaClient)(),t=await e.webPushSettings.findUnique({where:{id:ax}});if(t?.vapidPublicKey){if(!await this.credentialService.getText(tX.CREDENTIALS.webPushVapidPrivateKey))throw Error("The Web Push private key is unavailable");return{publicKey:t.vapidPublicKey}}let r=aw.default.generateVAPIDKeys();return await this.credentialService.setText(tX.CREDENTIALS.webPushVapidPrivateKey,r.privateKey,e=>e.webPushSettings.upsert({where:{id:ax},create:{id:ax,vapidPublicKey:r.publicKey,vapidGeneratedAt:new Date},update:{vapidPublicKey:r.publicKey,vapidGeneratedAt:new Date}}).then(()=>void 0)),{publicKey:r.publicKey}}async registerWebPush(e){let t=aI(e.endpoint),r=aS(e.p256dh,"Push p256dh key",1e3),i=aS(e.auth,"Push auth key",1e3),a=null===e.expirationTime||void 0===e.expirationTime?null:new Date(e.expirationTime);if(a&&!Number.isFinite(a.getTime()))throw Error("Push subscription expiration is invalid");return await this.prepareWebPush(),(await (0,tY.getPrismaClient)()).webPushSubscription.upsert({where:{endpoint:t},create:{id:(0,g.randomUUID)(),endpoint:t,p256dh:r,auth:i,expirationTime:a,locale:e.locale?.trim().slice(0,35)||null,userAgent:e.userAgent?.trim().slice(0,1e3)||null},update:{p256dh:r,auth:i,expirationTime:a,locale:e.locale?.trim().slice(0,35)||null,userAgent:e.userAgent?.trim().slice(0,1e3)||null,lastSeenAt:new Date}})}async unregisterWebPush(e){let t=aI(e),r=await (0,tY.getPrismaClient)();return(await r.webPushSubscription.deleteMany({where:{endpoint:t}})).count>0}async deleteWebPushSubscription(e){let t=aS(e,"Push subscription",200),r=await (0,tY.getPrismaClient)();return(await r.webPushSubscription.deleteMany({where:{id:t}})).count>0}async testWebPushSubscription(e){let t=aS(e,"Push subscription",200),r=await (0,tY.getPrismaClient)(),[i,a]=await Promise.all([r.webPushSettings.findUnique({where:{id:ax}}),r.webPushSubscription.findUnique({where:{id:t}})]);if(!a)throw Error("Push subscription was not found");if(!i?.vapidPublicKey)throw Error("Web Push is not configured");let n=await this.credentialService.getText(tX.CREDENTIALS.webPushVapidPrivateKey);if(!n)throw Error("The Web Push private key is unavailable");aw.default.setVapidDetails(aA(),i.vapidPublicKey,n);try{return await aw.default.sendNotification({endpoint:a.endpoint,expirationTime:a.expirationTime?.getTime()??null,keys:{p256dh:a.p256dh,auth:a.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(a_(e)??0))throw await r.webPushSubscription.deleteMany({where:{id:t}}),Error("The browser subscription expired and was removed");throw e}}async deliverWebPush(e){if(!e.webPushRequested)return;let t=await (0,tY.getPrismaClient)(),[r,i]=await Promise.all([t.webPushSettings.findUnique({where:{id:ax}}),t.webPushSubscription.findMany()]);if(!r?.vapidPublicKey||!i.length)return;let a=await this.credentialService.getText(tX.CREDENTIALS.webPushVapidPrivateKey);if(!a)return;aw.default.setVapidDetails(aA(),r.vapidPublicKey,a);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(i.map(async e=>{try{await aw.default.sendNotification({endpoint:e.endpoint,expirationTime:e.expirationTime?.getTime()??null,keys:{p256dh:e.p256dh,auth:e.auth}},n,{TTL:3600,timeout:1e4})}catch(r){if([404,410].includes(a_(r)??0))return void await t.webPushSubscription.deleteMany({where:{endpoint:e.endpoint}});console.error(`Web Push delivery to ${e.endpoint} failed:`,r)}}))}}var aT=e.i(986847);let aR=e=>e?.toISOString()??null;function aD(e,t,r,i,a){return e?t?"RUNNING":a?"ERROR":r&&!i||r&&i&&Date.now()-i.getTime()>2e3*r+5e3?"STALE":"HEALTHY":"DISABLED"}class aN{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 r=this.operations.get(e);r&&(Object.assign(r,t),r.enabled||(r.nextScheduledAt=null),this.changed(e))}schedule(e,t){let r=this.operations.get(e);r&&(r.nextScheduledAt=t,this.changed(e))}async run(e,t,r){let i=this.operations.get(e);if(!i)throw Error(`Polling operation ${e} is not registered`);let a=new Date;i.lastStartedAt=a,i.lastError=null,this.changed(e);try{let e=await t(),n=new Date;return i.lastCompletedAt=n,i.lastSucceededAt=n,i.durationMs=n.getTime()-a.getTime(),i.lastError=null,r&&(i.details={...i.details,...r(e)}),e}catch(t){let e=new Date;throw i.lastCompletedAt=e,i.durationMs=e.getTime()-a.getTime(),i.lastError=t instanceof Error?t.message:String(t),t}finally{this.changed(e)}}changed(e){rQ.agentEventBus.publish(rQ.POLLING_CHANGED_TOPIC,{pollingOperationChanged:e})}subscribe(){return rQ.agentEventBus.iterate(rQ.POLLING_CHANGED_TOPIC)}serverViews(){return[...this.operations.values()].map(e=>({...e,status:aD(e.enabled,!!(e.lastStartedAt&&(!e.lastCompletedAt||e.lastStartedAt>e.lastCompletedAt)),e.cadenceSeconds,e.lastCompletedAt,e.lastError),lastStartedAt:aR(e.lastStartedAt),lastCompletedAt:aR(e.lastCompletedAt),lastSucceededAt:aR(e.lastSucceededAt),nextScheduledAt:aR(e.nextScheduledAt)}))}async list(){let e=await (0,tY.getPrismaClient)(),[t,r,i]=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}})]),n=t?.refreshIntervalSeconds??30,s=t?.fetchIntervalSeconds??300,o=new Map;for(let e of i)o.set(e.agentId,(o.get(e.agentId)??0)+e._count._all);let l=[];for(let e of r){let t=e.heartbeatIntervalSeconds??aT.DEFAULT_AGENT_HEARTBEAT_INTERVAL_SECONDS,r=e.jobReconciliationIntervalSeconds??aT.DEFAULT_AGENT_JOB_RECONCILIATION_INTERVAL_SECONDS,i=e.codebaseScanIntervalSeconds??n,c=e.gitFetchIntervalSeconds??s,u=null!==e.lastSeenAt&&null===e.disconnectedAt&&Date.now()-e.lastSeenAt.getTime()<=(0,a.agentOnlineWindowMs)(e);l.push({id:`agent-heartbeat:${e.id}`,kind:"AGENT_HEARTBEAT",runtime:"AGENT",status:u?"HEALTHY":"STALE",enabled:!0,cadenceSeconds:t,lastStartedAt:null,lastCompletedAt:aR(e.lastSeenAt),lastSucceededAt:aR(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:u?"ONLINE":"OFFLINE"}});let d=e.diskSpaceState,p=d?.enabled??!0,h=d?.lastReportedAt??null,m=0;try{let e=JSON.parse(d?.volumesJson??"[]");m=Array.isArray(e)?e.length:0}catch{m=0}l.push({id:`agent-disk-space:${e.id}`,kind:"AGENT_DISK_SPACE",runtime:"AGENT",status:p?aD(!0,!1,rY.DISK_SPACE_POLL_INTERVAL_SECONDS,h,d?.lastError??null):"DISABLED",enabled:p,cadenceSeconds:rY.DISK_SPACE_POLL_INTERVAL_SECONDS,lastStartedAt:null,lastCompletedAt:aR(h),lastSucceededAt:d?.lastError?null:aR(h),nextScheduledAt:p&&h?new Date(h.getTime()+1e3*rY.DISK_SPACE_POLL_INTERVAL_SECONDS).toISOString():null,durationMs:null,lastError:d?.lastError??null,details:{agentId:e.id,agentName:e.name,volumes:m}}),l.push({id:`agent-job-reconciliation:${e.id}`,kind:"AGENT_JOB_RECONCILIATION",runtime:"AGENT",status:u?"HEALTHY":"STALE",enabled:!0,cadenceSeconds:r,lastStartedAt:null,lastCompletedAt:aR(e.lastSeenAt),lastSucceededAt:aR(e.lastSeenAt),nextScheduledAt:e.lastSeenAt?new Date(e.lastSeenAt.getTime()+1e3*r).toISOString():null,durationMs:null,lastError:null,details:{agentId:e.id,agentName:e.name,pendingJobs:o.get(e.id)??0}});let f=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,y=e.codebases.filter(e=>e.lastFetchError).length;l.push({id:`agent-codebase-scan:${e.id}`,kind:"CODEBASE_SCAN",runtime:"AGENT",status:aD(e.codebases.length>0,!1,i,f,null),enabled:e.codebases.length>0,cadenceSeconds:i,lastStartedAt:null,lastCompletedAt:aR(f),lastSucceededAt:aR(f),nextScheduledAt:f?new Date(f.getTime()+1e3*i).toISOString():null,durationMs:null,lastError:null,details:{agentId:e.id,agentName:e.name,repositories:e.codebases.length}}),l.push({id:`agent-git-fetch:${e.id}`,kind:"GIT_FETCH",runtime:"AGENT",status:y>0?"ERROR":aD(e.codebases.length>0,!1,c,g,null),enabled:e.codebases.length>0,cadenceSeconds:c,lastStartedAt:null,lastCompletedAt:aR(g),lastSucceededAt:y>0?null:aR(g),nextScheduledAt:g?new Date(g.getTime()+1e3*c).toISOString():null,durationMs:null,lastError:y>0?`${y} repositories have fetch errors`:null,details:{agentId:e.id,agentName:e.name,repositories:e.codebases.length,fetchErrors:y}})}return[...this.serverViews(),...l]}}let aO="default",aP="https://raw.githubusercontent.com/BerriAI/litellm/refs/heads/main/model_prices_and_context_window.json",a$=new Set(["sample_spec"]);function aU(e){return"number"==typeof e&&Number.isFinite(e)?e:null}function aB(e){let t=aU(e);return null===t?null:Math.trunc(t)}function aj(e){return"string"==typeof e&&e.trim()?e.trim():null}function aL(e){let t=e.lastIndexOf("/");return t<0?e:e.slice(t+1)}let aM={MODEL:"model",PROVIDER:"provider",INPUT_COST:"inputCostPerToken",OUTPUT_COST:"outputCostPerToken",CACHE_READ_COST:"cacheReadCostPerToken",CACHE_WRITE_COST:"cacheWriteCostPerToken",CONTEXT_WINDOW:"maxInputTokens"};function aq(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 aF{refreshing=null;checkedAt=0;async getCatalog(){let e=await (0,tY.getPrismaClient)(),t=await e.modelCostSettings.upsert({where:{id:aO},create:{id:aO},update:{}}),r=t.catalogUrl??aP;return{url:r,defaultUrl:aP,customUrl:t.catalogUrl,fetchedAt:t.fetchedAt?.toISOString()??null,entryCount:t.entryCount,error:t.error,stale:this.isStale(t.fetchedAt)||t.sourceUrl!==r}}isStale(e){return!e||Date.now()-e.getTime()>=864e5}async saveSettings(e){let t=e?.trim()??"",r=t&&t!==aP?t:null;if(r){let e;try{e=new URL(r)}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 i=await (0,tY.getPrismaClient)();return await i.modelCostSettings.upsert({where:{id:aO},create:{id:aO,catalogUrl:r},update:{catalogUrl:r}}),this.checkedAt=0,this.getCatalog()}async refresh(){return this.refreshing||(this.refreshing=this.runRefresh().finally(()=>{this.refreshing=null})),this.refreshing}async runRefresh(){let e=await (0,tY.getPrismaClient)(),t=await this.getCatalog();try{let r=await fetch(t.url,{headers:{accept:"application/json"},signal:AbortSignal.timeout(3e4)});if(!r.ok)throw Error(`The model cost catalog request failed with ${r.status}`);let i=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[r,i]of Object.entries(e)){if(a$.has(r)||!i||"object"!=typeof i||Array.isArray(i))continue;let e=aU(i.input_cost_per_token),a=aU(i.output_cost_per_token);if((null!==e||null!==a)&&(t.push({model:r,provider:aj(i.litellm_provider),mode:aj(i.mode),inputCostPerToken:e,outputCostPerToken:a,cacheReadCostPerToken:aU(i.cache_read_input_token_cost),cacheWriteCostPerToken:aU(i.cache_creation_input_token_cost),maxInputTokens:aB(i.max_input_tokens),maxOutputTokens:aB(i.max_output_tokens)}),t.length>=2e4))break}if(!t.length)throw Error("The model cost catalog contained no priced models");return t}(await r.json());await e.$transaction(async e=>{await e.modelCostEntry.deleteMany({});for(let t=0;t<i.length;t+=500)await e.modelCostEntry.createMany({data:i.slice(t,t+500)});await e.modelCostSettings.update({where:{id:aO},data:{fetchedAt:new Date,sourceUrl:t.url,entryCount:i.length,error:null}})})}catch(r){let t=r instanceof Error?r.message:String(r);await e.modelCostSettings.update({where:{id:aO},data:{error:t.slice(0,2e3)}})}return this.getCatalog()}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:r=0,sortKey:i="MODEL",direction:a="ASC"}){var n;let s,o;await this.ensureFresh();let l=await (0,tY.getPrismaClient)(),c=e?.trim(),u=c?{OR:[{model:{contains:c}},{provider:{contains:c}}]}:{},d=Math.min(Math.max(t??100,1),500),p=Math.max(r??0,0),[h,m]=await Promise.all([l.modelCostEntry.findMany({where:u,orderBy:(n=i??"MODEL",s="DESC"===(a??"ASC")?"desc":"asc","model"===(o=aM[n]??"model")?[{model:s}]:[{[o]:{sort:s,nulls:"last"}},{model:s}]),skip:p,take:d}),l.modelCostEntry.count({where:u})]);return{items:h.map(aq),totalCount:m}}async lookup(e){let t=[...new Set(e.filter(Boolean))],r=new Map;if(!t.length)return r;let i=await (0,tY.getPrismaClient)(),a=[...new Set(t.flatMap(e=>[e,aL(e)]))],n=new Map((await i.modelCostEntry.findMany({where:{model:{in:a}}})).map(e=>[e.model,e])),s=[];for(let e of t){let t=n.get(e)??n.get(aL(e));t?r.set(e,aq(t)):s.push(e)}if(!s.length)return r;let o=await i.modelCostEntry.findMany({where:{OR:s.map(e=>({model:{endsWith:`/${aL(e)}`}}))}});for(let e of s){let t=aL(e).toLowerCase(),i=o.find(e=>aL(e.model).toLowerCase()===t);i&&r.set(e,aq(i))}return r}estimate(e,t){if(!e)return null;let r=e.inputCostPerToken,i=e.outputCostPerToken;if(null===r&&null===i)return null;let a=e.cacheReadCostPerToken??r??0,n=e.cacheWriteCostPerToken??r??0;return t.inputTokens*(r??0)+t.outputTokens*(i??0)+t.cacheReadTokens*a+t.cacheWriteTokens*n}}e.i(648153);var aV=e.i(594875),aK=e.i(937121);let aH=["ANY_AGENT_HOME","SPECIFIC_AGENT_HOME","ANY_WORKTREE","REPOSITORY_WORKTREE"],aG=["NEVER","ON_FAILURE","ALWAYS"],aW=["QUEUED","RUNNING","RESTARTING","CANCELLING"],aJ=["SUCCEEDED","FAILED","CANCELLED"];function az(e,t,r){let i=t.trim().toUpperCase();if(!e.includes(i))throw Error(`${r} is not supported`);return i}function aZ(e,t,r){let i=e.trim();if(!i)throw Error(`${t} is required`);if(i.length>r)throw Error(`${t} is too long`);return i}function aY(e){rQ.agentEventBus.publish(rQ.COMMANDS_CHANGED_TOPIC,{commandsChanged:e})}function aQ(e){rQ.agentEventBus.publish(rQ.COMMAND_RUNS_CHANGED_TOPIC,{commandRunsChanged:e}),rQ.agentEventBus.publish((0,rQ.commandRunChangedTopic)(e.id),{commandRunChanged:e})}class aX{agentControl;notifications;timer;reconciliation;constructor(e,t){this.agentControl=e,this.notifications=t,this.timer=null,this.reconciliation=null,this.agentControl.registerCompletionHandler(aK.COMMAND_RUN_JOB_KIND,e=>this.handleAttemptCompletion(e)),this.agentControl.registerConnectionHandler(e=>this.reconcileWithReporting({agentId:e}))}startRuntime(){this.timer||(this.reconcileWithReporting(),this.timer=setInterval(()=>void this.reconcileWithReporting(),1e3),this.timer.unref())}async reconcileWithReporting(e={}){if(this.reconciliation)return this.reconciliation;this.reconciliation=this.reconcile(e);try{await this.reconciliation}catch(e){console.error("Command runtime reconciliation failed:",e)}finally{this.reconciliation=null}}async listDefinitions(e=!1){return(await (0,tY.getPrismaClient)()).commandDefinition.findMany({where:e?{}:{archivedAt:null},include:{targetAgent:!0,targetRepository:!0},orderBy:[{archivedAt:"asc"},{name:"asc"}]})}async getDefinition(e){return(await (0,tY.getPrismaClient)()).commandDefinition.findUnique({where:{id:e},include:{targetAgent:!0,targetRepository:!0}})}normalizeDefinition(e){let t=az(aH,e.targetKind,"Target scope"),r=az(aG,e.restartPolicy??"NEVER","Restart policy"),i=void 0===e.restartLimit?3:e.restartLimit;if(null!==i&&(!Number.isInteger(i)||i<0||i>100))throw Error("Restart limit must be null or an integer from 0 to 100");let a="SPECIFIC_AGENT_HOME"===t,n="REPOSITORY_WORKTREE"===t;if(!!e.targetAgentId!==a)throw Error(a?"A specific-agent command requires an agent":"This target scope does not accept a specific agent");if(!!e.targetRepositoryId!==n)throw Error(n?"A repository-worktree command requires a repository":"This target scope does not accept a repository");return{name:aZ(e.name,"Name",120),description:(e.description??"").trim().slice(0,2e3),script:aZ(e.script,"Script",1e6),targetKind:t,targetAgentId:e.targetAgentId??null,targetRepositoryId:e.targetRepositoryId??null,restartPolicy:r,restartLimit:i,quickActionEnabled:e.quickActionEnabled??!1,quickActionIconKey:aZ(e.quickActionIconKey??"terminal","Quick action icon",40),quickActionButtonVariant:aZ(e.quickActionButtonVariant??"default","Quick action style",40),notificationsEnabled:e.notificationsEnabled??!0}}async createDefinition(e){let t=await (0,tY.getPrismaClient)(),r=await t.commandDefinition.create({data:{id:(0,g.randomUUID)(),...this.normalizeDefinition(e)},include:{targetAgent:!0,targetRepository:!0}});return aY(r),r}async updateDefinition(e,t){let r=await (0,tY.getPrismaClient)(),i=await r.commandDefinition.update({where:{id:e},data:this.normalizeDefinition(t),include:{targetAgent:!0,targetRepository:!0}});return aY(i),i}async archiveDefinition(e,t){let r=await (0,tY.getPrismaClient)(),i=await r.commandDefinition.update({where:{id:e},data:{archivedAt:t?new Date:null},include:{targetAgent:!0,targetRepository:!0}});return aY(i),i}async eligibleForAgent(e){return(await (0,tY.getPrismaClient)()).commandDefinition.findMany({where:{archivedAt:null,OR:[{targetKind:"ANY_AGENT_HOME"},{targetKind:"SPECIFIC_AGENT_HOME",targetAgentId:e}]},include:{targetAgent:!0,targetRepository:!0},orderBy:{name:"asc"}})}async eligibleForWorktree(e){let t=await (0,tY.getPrismaClient)(),r=await t.worktree.findUnique({where:{id:e},select:{codebase:{select:{repositoryId:!0}}}});if(!r)throw Error("Worktree not found");return t.commandDefinition.findMany({where:{archivedAt:null,OR:[{targetKind:"ANY_WORKTREE"},{targetKind:"REPOSITORY_WORKTREE",targetRepositoryId:r.codebase.repositoryId}]},include:{targetAgent:!0,targetRepository:!0},orderBy:{name:"asc"}})}async listRuns(e){let t=await (0,tY.getPrismaClient)(),r=Math.max(1,Math.min(e.first??50,200)),i=e.search?.trim(),a={...e.includeArchived?{}:{archivedAt:null},...e.agentId?{agentId:e.agentId}:{},...e.worktreeId?{worktreeId:e.worktreeId}:{},...i?{OR:[{snapshotName:{contains:i}},{agentName:{contains:i}},{worktreePath:{contains:i}}]}:{}},[n,s]=await Promise.all([t.commandRun.findMany({where:a,include:{command:!0,agent:!0,worktree:{include:{codebase:{include:{repository:!0}}}},attempts:{orderBy:{attempt:"asc"}}},orderBy:[{createdAt:"desc"},{id:"desc"}],take:r+1,...e.after?{cursor:{id:e.after},skip:1}:{}}),t.commandRun.count({where:a})]),o=n.length>r,l=n.slice(0,r);return{nodes:l,totalCount:s,pageInfo:{hasNextPage:o,endCursor:l.at(-1)?.id??null}}}async getRun(e){return(await (0,tY.getPrismaClient)()).commandRun.findUnique({where:{id:e},include:{command:!0,agent:!0,worktree:{include:{codebase:{include:{repository:!0}}}},attempts:{include:{agentJob:!0},orderBy:{attempt:"asc"}},predecessor:!0,successor:!0}})}async listOutput(e,t=0,r=-1,i=1e3){let a=await (0,tY.getPrismaClient)();return i<1?[]:a.commandRunOutputChunk.findMany({where:{OR:[{attempt:{runId:e,attempt:{gt:t}}},{attempt:{runId:e,attempt:t},sequence:{gt:r}}]},include:{attempt:{select:{attempt:!0,runId:!0}}},orderBy:[{attempt:{attempt:"asc"}},{sequence:"asc"}],take:Math.max(1,Math.min(i,5e3))})}async resolveTarget(e,t){let r=await (0,tY.getPrismaClient)();if("ANY_AGENT_HOME"===e.targetKind||"SPECIFIC_AGENT_HOME"===e.targetKind){if(!t.agentId||t.worktreeId)throw Error("This command requires an agent-home target");if("SPECIFIC_AGENT_HOME"===e.targetKind&&e.targetAgentId!==t.agentId)throw Error("This command is not eligible for the selected agent");let i=await r.agent.findUnique({where:{id:t.agentId}});if(!i)throw Error("Agent not found");return this.requireCapability(i.capabilitiesJson),{agent:i,worktree:null}}if(!t.worktreeId||t.agentId)throw Error("This command requires a worktree target");let i=await r.worktree.findUnique({where:{id:t.worktreeId},include:{codebase:{include:{agent:!0,repository:!0}}}});if(!i||i.missingAt)throw Error("Worktree is unavailable");if("REPOSITORY_WORKTREE"===e.targetKind&&e.targetRepositoryId!==i.codebase.repositoryId)throw Error("This command is not eligible for the selected repository");return this.requireCapability(i.codebase.agent.capabilitiesJson),{agent:i.codebase.agent,worktree:i}}requireCapability(e){if(!(function(e){try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>"string"==typeof e):[]}catch{return[]}})(e).includes(aK.COMMAND_RUN_JOB_KIND))throw Error("The selected agent must be upgraded before it can run commands")}async startRun(e){let t,r=await (0,tY.getPrismaClient)(),i=e.idempotencyKey?.trim()||(0,g.randomUUID)(),a=await r.commandRun.findUnique({where:{idempotencyKey:i}});if(a)return this.getRun(a.id);let n=await r.commandDefinition.findUnique({where:{id:e.commandId}});if(!n||n.archivedAt)throw Error("Command not found");let{agent:s,worktree:o}=await this.resolveTarget(n,e);try{t=await r.$transaction(async t=>{let r=await t.commandRunNumberSequence.upsert({where:{id:"default"},create:{id:"default",nextValue:1},update:{nextValue:{increment:1}}});return t.commandRun.create({data:{id:(0,g.randomUUID)(),displayNumber:r.nextValue,commandId:n.id,idempotencyKey:i,origin:(e.origin??"MANUAL").trim().toUpperCase(),snapshotName:n.name,snapshotDescription:n.description,snapshotScript:n.script,snapshotTargetKind:n.targetKind,snapshotRestartPolicy:n.restartPolicy,snapshotRestartLimit:n.restartLimit,snapshotNotificationsEnabled:n.notificationsEnabled,snapshotJson:JSON.stringify(n),agentId:s.id,worktreeId:o?.id??null,agentName:s.name,agentHostname:s.hostname,worktreePath:o?.folder??null,worktreeBranch:o?.branch??null}})})}catch(t){let e=await r.commandRun.findUnique({where:{idempotencyKey:i}});if(!e)throw t;return this.getRun(e.id)}return aQ(t),await this.dispatch(t.id),this.getRun(t.id)}async startCustomRun(e){let t,r=await (0,tY.getPrismaClient)(),i=e.idempotencyKey?.trim()||(0,g.randomUUID)(),a=await r.commandRun.findUnique({where:{idempotencyKey:i}});if(a)return this.getRun(a.id);let n=aZ(e.script,"Script",1e6),s=e.agentId&&!e.worktreeId?"ANY_AGENT_HOME":e.worktreeId&&!e.agentId?"ANY_WORKTREE":null;if(!s)throw Error("A custom command requires exactly one agent-home or worktree target");let{agent:o,worktree:l}=await this.resolveTarget({targetKind:s,targetAgentId:null,targetRepositoryId:null},e),c={name:"Custom command",description:"",script:n,targetKind:s,restartPolicy:"NEVER",restartLimit:null,notificationsEnabled:!0};try{t=await r.$transaction(async t=>{let r=await t.commandRunNumberSequence.upsert({where:{id:"default"},create:{id:"default",nextValue:1},update:{nextValue:{increment:1}}});return t.commandRun.create({data:{id:(0,g.randomUUID)(),displayNumber:r.nextValue,commandId:null,idempotencyKey:i,origin:(e.origin??"MANUAL").trim().toUpperCase(),status:"QUEUED",snapshotName:c.name,snapshotDescription:c.description,snapshotScript:c.script,snapshotTargetKind:c.targetKind,snapshotRestartPolicy:c.restartPolicy,snapshotRestartLimit:c.restartLimit,snapshotNotificationsEnabled:c.notificationsEnabled,snapshotJson:JSON.stringify(c),agentId:o.id,worktreeId:l?.id??null,agentName:o.name,agentHostname:o.hostname,worktreePath:l?.folder??null,worktreeBranch:l?.branch??null}})})}catch(t){let e=await r.commandRun.findUnique({where:{idempotencyKey:i}});if(!e)throw t;return this.getRun(e.id)}aQ(t);try{await this.dispatch(t.id)}catch(e){throw await this.failDispatch(t.id,e instanceof Error?e.message:String(e)),e}return this.getRun(t.id)}async dispatch(e){let t=await (0,tY.getPrismaClient)(),r=await t.commandRun.findUnique({where:{id:e},include:{agent:!0,worktree:{include:{codebase:!0}},attempts:!0}});if(!r||r.stopRequested)return;if(!r.agentId||!r.agent)return void await this.failDispatch(r.id,"The command agent is no longer available");if(r.predecessorRunId){let e=await t.commandRun.findUnique({where:{id:r.predecessorRunId},select:{status:!0}});if(e&&!aJ.includes(e.status))return}if(new Set(["ANY_WORKTREE","REPOSITORY_WORKTREE"]).has(r.snapshotTargetKind)&&(!r.worktreeId||!r.worktree||r.worktree.missingAt))return void await this.failDispatch(r.id,"The command worktree is no longer available");if(r.worktree&&r.worktree.codebase.agentId!==r.agentId)return void await this.failDispatch(r.id,"The worktree is no longer assigned to the command agent");try{this.requireCapability(r.agent.capabilitiesJson)}catch(e){await this.failDispatch(r.id,e instanceof Error?e.message:String(e));return}let i=r.attempts.reduce((e,t)=>!e||t.attempt>e.attempt?t:e,null),a=!i||i.agentJobId||i.completionProcessedAt||i.finishedAt?(i?.attempt??0)+1:i.attempt,n=i?.attempt===a?i:await t.commandRunAttempt.findUnique({where:{runId_attempt:{runId:e,attempt:a}}});if(!n)try{n=await t.commandRunAttempt.create({data:{id:(0,g.randomUUID)(),runId:e,attempt:a}})}catch(r){if(!(n=await t.commandRunAttempt.findUnique({where:{runId_attempt:{runId:e,attempt:a}}})))throw r}if(!n.agentJobId){let e=await this.agentControl.createJob({agentId:r.agentId,kind:aK.COMMAND_RUN_JOB_KIND,payload:{commandRunId:r.id,attemptId:n.id,targetKind:r.worktreeId?"WORKTREE":"AGENT_HOME",cwd:r.worktree?.folder??null,script:r.snapshotScript},idempotencyKey:`command-run:${r.id}:attempt:${a}`,timeoutSeconds:0,worktreeId:r.worktreeId,codebaseId:r.worktree?.codebaseId??null,visibility:"SYSTEM"});n=await t.commandRunAttempt.update({where:{id:n.id},data:{agentJobId:e.id,status:e.status}})}aQ(await t.commandRun.update({where:{id:r.id},data:{status:"RUNNING"===n.status?"RUNNING":"QUEUED",startedAt:"RUNNING"===n.status?r.startedAt??new Date:null,nextRestartAt:null,error:null}}))}async failDispatch(e,t){let r=await (0,tY.getPrismaClient)(),i=await r.commandRun.update({where:{id:e},data:{status:"FAILED",error:t,finishedAt:new Date,nextRestartAt:null},include:{worktree:{select:{highlightColor:!0}}}});aQ(i),await this.notifyFinishedRun(i)}async terminateRun(e){let t=await (0,tY.getPrismaClient)(),r=await t.commandRun.findUnique({where:{id:e},include:{attempts:{orderBy:{attempt:"desc"},take:1}}});if(!r)throw Error("Command run not found");if(aJ.includes(r.status))return r;let i=await t.commandRun.update({where:{id:e},data:{stopRequested:!0,status:"CANCELLING",nextRestartAt:null}}),a=r.attempts[0]?.agentJobId;return a?await this.agentControl.cancelJob(a):await this.finishCancelled(e),aQ(i),this.getRun(e)}async rerun(e){let t=await (0,tY.getPrismaClient)(),r=await t.commandRun.findUnique({where:{id:e}});if(!r)throw Error("Command run not found");let i=await t.commandRun.findUnique({where:{predecessorRunId:r.id}});if(i)return this.getRun(i.id);let a=await t.$transaction(async e=>{let t=await e.commandRunNumberSequence.upsert({where:{id:"default"},create:{id:"default",nextValue:1},update:{nextValue:{increment:1}}});return e.commandRun.create({data:{id:(0,g.randomUUID)(),displayNumber:t.nextValue,commandId:r.commandId,idempotencyKey:`rerun:${r.id}:${(0,g.randomUUID)()}`,origin:"RERUN",snapshotName:r.snapshotName,snapshotDescription:r.snapshotDescription,snapshotScript:r.snapshotScript,snapshotTargetKind:r.snapshotTargetKind,snapshotRestartPolicy:r.snapshotRestartPolicy,snapshotRestartLimit:r.snapshotRestartLimit,snapshotNotificationsEnabled:r.snapshotNotificationsEnabled,snapshotJson:r.snapshotJson,agentId:r.agentId,worktreeId:r.worktreeId,agentName:r.agentName,agentHostname:r.agentHostname,worktreePath:r.worktreePath,worktreeBranch:r.worktreeBranch,predecessorRunId:r.id}})});return aQ(a),aJ.includes(r.status)?await this.dispatch(a.id):await this.terminateRun(r.id),this.getRun(a.id)}async archiveRuns(e,t){let r=await (0,tY.getPrismaClient)();for(let i of(await r.commandRun.updateMany({where:{id:{in:e},status:{in:[...aJ]}},data:{archivedAt:t?new Date:null}}),e)){let e=await r.commandRun.findUnique({where:{id:i}});e&&aQ(e)}return!0}async deleteRuns(e){let t=await (0,tY.getPrismaClient)();return(await t.commandRun.deleteMany({where:{id:{in:e},status:{in:[...aJ]}}})).count}async appendOutput(e,t,r,i){if(!i.length||i.length>200)throw Error("Output batches must contain 1 to 200 chunks");let a=await (0,tY.getPrismaClient)(),n=await a.commandRunAttempt.findUnique({where:{id:r},include:{run:!0}});if(!n||n.agentJobId!==t||n.run.agentId!==e)throw Error("Command attempt not found for this agent job");let s=i.map(e=>{if(!Number.isInteger(e.sequence)||e.sequence<0)throw Error("Output sequence must be a non-negative integer");if(!["STDOUT","STDERR","SYSTEM"].includes(e.stream))throw Error("Output stream is invalid");let t=Buffer.from(e.dataBase64,"base64");if(t.length!==e.byteLength||t.length>262144)throw Error("Output byte length is invalid");let r=new Date(e.createdAt);if(Number.isNaN(r.valueOf()))throw Error("Output date is invalid");return{...e,createdAt:r}});await Promise.all(s.map(e=>a.commandRunOutputChunk.upsert({where:{attemptId_sequence:{attemptId:r,sequence:e.sequence}},create:{id:(0,g.randomUUID)(),attemptId:r,...e},update:{}})));let o=await a.commandRunOutputChunk.findMany({where:{attemptId:r,sequence:{in:s.map(e=>e.sequence)}},orderBy:{sequence:"asc"}});for(let e of o)rQ.agentEventBus.publish((0,rQ.commandRunOutputTopic)(n.runId),{commandRunOutputAdded:{...e,attemptNumber:n.attempt}});return o}async finishCancelled(e){let t=await (0,tY.getPrismaClient)();aQ(await t.commandRun.update({where:{id:e},data:{status:"CANCELLED",finishedAt:new Date,nextRestartAt:null}}));let r=await t.commandRun.findUnique({where:{predecessorRunId:e}});r&&await this.dispatch(r.id)}async notifyFinishedRun(e){if(!this.notifications||!e.snapshotNotificationsEnabled||"SUCCEEDED"!==e.status&&"FAILED"!==e.status)return;let t=[e.worktreeBranch??e.worktreePath??`${e.agentName} \xb7 ${e.agentHostname}`,"FAILED"===e.status?e.error:null].filter(e=>!!e).join(" · ").slice(0,1e3);try{let r=await (0,tY.getPrismaClient)(),i=await r.$transaction(r=>this.notifications.recordInTransaction(r,{dedupeKey:`command-run:${e.id}:${e.status}`,typeKey:"SUCCEEDED"===e.status?"COMMAND_RUN_SUCCEEDED":"COMMAND_RUN_FAILED",title:`${e.snapshotName} ${e.status.toLowerCase()}`,body:t,href:`/commands/runs/${e.id}`,resourceKind:"COMMAND_RUN",resourceId:e.id,worktreeId:e.worktreeId,highlightColor:e.worktree?.highlightColor??null}));this.notifications.created(i)}catch(e){console.error("Command run notification failed:",e)}}async handleAttemptCompletion(e){let t=await (0,tY.getPrismaClient)(),r=await t.commandRunAttempt.findUnique({where:{agentJobId:e.id},include:{run:!0,agentJob:!0}});if(!r||r.completionProcessedAt)return;let i=new Date,a=function(e){if(!e)return{};try{let t=JSON.parse(e);return t&&"object"==typeof t?t:{}}catch{return{}}}(e.resultJson);if(1!==(await t.commandRunAttempt.updateMany({where:{id:r.id,completionProcessedAt:null},data:{status:e.status,exitCode:a.exitCode??null,signal:a.signal??null,error:e.error,startedAt:r.agentJob?.startedAt??r.startedAt,finishedAt:r.agentJob?.finishedAt??i,completionProcessedAt:i}})).count)return;if(r.run.stopRequested||"CANCELLED"===e.status)return void await this.finishCancelled(r.runId);let n="SUCCEEDED"===e.status&&0===a.exitCode,s=az(aG,r.run.snapshotRestartPolicy,"Restart policy"),o=r.agentJob?.startedAt??r.createdAt,l=function(e){if(e.manualStop||!("ALWAYS"===e.policy||"ON_FAILURE"===e.policy&&!e.clean))return{restart:!1,restartCount:e.restartCount,exhausted:!1};let t=(e.durationMs>=6e4?0:e.restartCount)+1,r=null!==e.limit&&t>e.limit;return{restart:!r,restartCount:t,exhausted:r}}({policy:s,limit:r.run.snapshotRestartLimit,restartCount:r.run.restartCount,durationMs:i.getTime()-o.getTime(),clean:n,manualStop:r.run.stopRequested});if(l.restart)return void aQ(await t.commandRun.update({where:{id:r.runId},data:{status:"RESTARTING",restartCount:l.restartCount,nextRestartAt:new Date(i.getTime()+1e3),exitCode:a.exitCode??null,signal:a.signal??null,error:e.error}}));let c=await t.commandRun.update({where:{id:r.runId},data:{status:n?"SUCCEEDED":"FAILED",exitCode:a.exitCode??null,signal:a.signal??null,error:e.error??(l.exhausted?"Restart limit reached":n?null:"Command failed"),finishedAt:i,nextRestartAt:null},include:{worktree:{select:{highlightColor:!0}}}});aQ(c),await this.notifyFinishedRun(c)}async reconcile(e={}){let t=await (0,tY.getPrismaClient)(),r=new Date;for(let i of(await t.commandRun.findMany({where:{status:{in:[...aW]},...e.agentId?{agentId:e.agentId}:{}},include:{attempts:{include:{agentJob:!0},orderBy:{attempt:"desc"},take:1}}}))){let e=i.attempts[0];if(i.stopRequested){e?.agentJobId&&e.agentJob&&!["SUCCEEDED","FAILED","CANCELLED","TIMED_OUT"].includes(e.agentJob.status)?await this.agentControl.cancelJob(e.agentJobId):e&&e.agentJob?.status!=="CANCELLED"||await this.finishCancelled(i.id);continue}if("RESTARTING"===i.status&&(!i.nextRestartAt||i.nextRestartAt<=r)){await this.dispatch(i.id);continue}if(e?.agentJob&&["SUCCEEDED","FAILED","CANCELLED","TIMED_OUT"].includes(e.agentJob.status)){await this.handleAttemptCompletion(e.agentJob);continue}if(e?.agentJob&&["QUEUED","RUNNING"].includes(e.agentJob.status)){let a="RUNNING"===e.agentJob.status?"RUNNING":"QUEUED";e.status!==e.agentJob.status&&await t.commandRunAttempt.update({where:{id:e.id},data:{status:e.agentJob.status,startedAt:e.agentJob.startedAt}}),i.status!==a&&aQ(await t.commandRun.update({where:{id:i.id},data:{status:a,startedAt:"RUNNING"===a?i.startedAt??e.agentJob.startedAt??r:i.startedAt}}));continue}"QUEUED"!==i.status||e&&(e.agentJobId||e.completionProcessedAt||e.finishedAt)||await this.dispatch(i.id)}}}var a0=e.i(735255);function a1(e=new Date){let t=e.getFullYear(),r=String(e.getMonth()+1).padStart(2,"0"),i=String(e.getDate()).padStart(2,"0");return`${t}-${r}-${i}`}class a2{ccusage;diskSpace;polling;usageTimer;usageRunning;constructor(e,t,r){this.ccusage=e,this.diskSpace=t,this.polling=r,this.usageRunning=!1,this.ccusage.registerCompletionObserver(e=>this.recordCompletedUsage(e))}async recordCompletedUsage(e){if(0===e.progress.successfulCount)return;let t=a1(),r=e.aggregate.days.find(e=>e.period===t);await this.persistUsage(t,r?.totalCost??0,new Date)}startRuntime(){this.polling.register({id:"sidebar-usage",kind:"SIDEBAR_USAGE",runtime:"SERVER",enabled:!0,cadenceSeconds:300,details:{}}),this.pruneInterruptedCollections().finally(()=>this.runUsagePoll())}stopRuntime(){this.usageTimer&&clearTimeout(this.usageTimer),this.usageTimer=void 0}scheduleUsagePoll(){this.usageTimer&&clearTimeout(this.usageTimer);let e=new Date(Date.now()+3e5);this.polling.schedule("sidebar-usage",e),this.usageTimer=setTimeout(()=>void this.runUsagePoll(),3e5),this.usageTimer.unref()}async runUsagePoll(){if(!this.usageRunning){this.usageRunning=!0,this.polling.schedule("sidebar-usage",null);try{await this.polling.run("sidebar-usage",()=>this.collectUsage(),e=>({period:e.period,successfulAgents:e.successfulAgents}))}catch(e){console.error("Sidebar usage refresh failed:",e instanceof Error?e.message:e)}finally{this.usageRunning=!1,this.scheduleUsagePoll()}}}async collectUsage(){let e=`sidebar-usage:${(0,g.randomUUID)()}`;try{let t=await this.ccusage.collect(e);return{period:a1(),successfulAgents:t.progress.successfulCount}}finally{await this.removeCollection(e)}}async persistUsage(e,t,r){let i=await (0,tY.getPrismaClient)();await i.sidebarUsageSummary.upsert({where:{id:"default"},create:{id:"default",period:e,totalCost:t,collectedAt:r},update:{period:e,totalCost:t,collectedAt:r}}),this.publish()}async latestSuccessfulUsage(e){let t=await (0,tY.getPrismaClient)(),r=await t.agentJob.findMany({where:{kind:aT.CCUSAGE_REPORT_JOB_KIND,status:"SUCCEEDED",resultJson:{not:null}},orderBy:[{finishedAt:"desc"},{createdAt:"desc"}],distinct:["agentId"],select:{resultJson:!0,finishedAt:!0,createdAt:!0,agent:{select:{id:!0,name:!0,hostname:!0}}}}),i=r.flatMap(e=>{try{let t=(0,aT.parseCcusageJobResult)(JSON.parse(e.resultJson));return[{agent:e.agent,report:t.report}]}catch{return[]}});if(!i.length)return null;let a=(0,a0.aggregateUsage)(i).days.find(t=>t.period===e);return a?{totalCost:a.totalCost,collectedAt:r.reduce((e,t)=>{let r=t.finishedAt??t.createdAt;return r>e?r:e},new Date(0))}:null}async removeCollection(e){let t=await (0,tY.getPrismaClient)();await t.agentJob.deleteMany({where:{ccusageCollectionId:e}}),await t.ccusageCollection.deleteMany({where:{id:e}})}async pruneInterruptedCollections(){let e=await (0,tY.getPrismaClient)(),t=await e.ccusageCollection.findMany({where:{id:{startsWith:"sidebar-usage:"}},select:{id:!0}});if(!t.length)return;let r=t.map(({id:e})=>e);await e.agentJob.deleteMany({where:{ccusageCollectionId:{in:r}}}),await e.ccusageCollection.deleteMany({where:{id:{in:r}}})}async status(){let e=await (0,tY.getPrismaClient)(),t=a1(),[r,i,a,n,s,o]=await Promise.all([e.sidebarUsageSummary.findUnique({where:{id:"default"}}),e.agentRun.count({where:{kind:"PLAN",archivedAt:null,status:"IN_PROGRESS",attempts:{some:{status:{in:["STARTING","RUNNING"]},supersededAt:null}}}}),e.agentRun.count({where:{kind:"SESSION",archivedAt:null,status:"IN_PROGRESS",attempts:{some:{status:{in:["STARTING","RUNNING"]},supersededAt:null}}}}),e.build.count({where:{status:{in:["PREPARING","RUNNING"]}}}),e.workflowRun.count({where:{archivedAt:null,status:"RUNNING"}}),this.diskSpace.overview()]),l=r?.period===t?{totalCost:r.totalCost,collectedAt:r.collectedAt}:null;if(!l){let e=await this.latestSuccessfulUsage(t);e&&(l=e,this.persistUsage(t,e.totalCost,e.collectedAt)),this.runUsagePoll()}return{usageToday:{totalCost:l?.totalCost??null,collectedAt:l?.collectedAt.toISOString()??null},activity:{plans:i,sessions:a,builds:n,workflows:s},diskSpace:o}}subscribe(){return rQ.agentEventBus.iterate(rQ.SIDEBAR_STATUS_CHANGED_TOPIC)}publish(){rQ.agentEventBus.publish(rQ.SIDEBAR_STATUS_CHANGED_TOPIC,{sidebarStatusChanged:!0})}}var a3=e.i(807055),a4=e.i(119909);function a6(e,t,r){let i=e.trim().toLowerCase(),a=t.trim().toLowerCase();if(!i||!a)throw Error("Pull request repository coordinates are required");if(!Number.isInteger(r)||r<1)throw Error("Pull request number must be a positive integer");return`${i}/${a}#${r}`}function a8(e){return e&&"object"==typeof e&&!Array.isArray(e)?e:{}}function a5(e,t,r){return a8(e[t])[r]}function a9(e,t,r={}){if("string"!=typeof t&&"number"!=typeof t)return null;let i=String(t).trim();return i?{kind:e,resourceId:i,...r}:null}let a7=new Set(["JIRA_STATUS","JIRA_LABEL","JIRA_ASSIGNED_SELF","JIRA_SOURCE_NEW_TICKET","JIRA_MENTION","JIRA_SPRINT_STARTED"]),ne=new Set(["RUN_STARTED","RUN_COMPLETED","RUN_QUESTION_NEEDED","RUN_QUESTION_ANSWERED","RUN_PAUSED","RUN_CONTINUED","RUN_FAILED","RUN_CANCELLED","RUN_PLAN_PLAYED","RUN_FOLLOW_UP","RUN_IMPORTED","RUN_USAGE_THRESHOLD","RUN_EVENT_MATCH"]),nt=new Set(["BUILD_RESULT","BUILD_TEST_THRESHOLD","BUILD_COVERAGE_THRESHOLD","BUILD_HOOK_FAILED"]),nr=new Set(["WORKTREE_CREATED","WORKTREE_BEHIND","WORKTREE_CONFLICT","WORKTREE_MISSING","WORKTREE_DIVERGED","WORKTREE_DIRTY_DURATION","WORKTREE_NEW_COMMIT"]),ni=new Set(["GITHUB_PR_STATE","GITHUB_REVIEW_CHANGES_REQUESTED","GITHUB_REVIEW_COMMENT","GITHUB_PR_CLOSED","GITHUB_ISSUE_COMMAND","GITHUB_PR_LABEL"]),na=new Set(["GITHUB_CHECK_FAILED","GITHUB_WORKFLOW_SUCCEEDED","GITHUB_ACTIONS_RESULT"]);var nn=e.i(499162);function ns(e,t){let r="string"==typeof e?Number(e.trim()):e;return"number"!=typeof r||!Number.isFinite(r)||r<=0?null:Math.min(31536e3,Math.max(t,r))}function no(e,t=null){let r=ns(e.timeoutSeconds,10)??(null===t?null:ns(t,10));return null===r?null:new Date(Date.now()+1e3*r)}function nl(e,t){return ns(e.cadenceSeconds,1)??Math.max(1,t)}function nc(e,t=1){return new Date(Date.now()+1e3*nl(e,t))}let nu=(e,t)=>{if(!e||"object"!=typeof e||Array.isArray(e))throw Error(`${t} must be an object`);return e},nd=(e,t,r=2e4)=>{if("string"!=typeof e||!e.trim())throw Error(`${t} is required`);if(e.length>r)throw Error(`${t} is too long`);return e.trim()},np=(e,t=2e4)=>null==e||""===e?null:nd(e,"Value",t),nh=(e,t,r,i)=>nd(e.node.config[t]??(0,nn.getSessionValue)(e.sessionData,r),i,500),nm=(e,t="operation")=>`${e.run.id}:${e.attempt.id}:${t}`,nf=(e,t,r=!1)=>({output:t,sessionPatch:{run:{[e.node.id]:t}},links:"string"==typeof t.id?[{kind:"AGENT_RUN",resourceId:t.id,label:"string"==typeof t.kind?t.kind:"Agent run",url:`/${"PLAN"===t.kind?"plans":"sessions"}/${t.id}`,metadata:{runKind:t.kind}}]:void 0,wait:r&&"string"==typeof t.id?{kind:"AGENT_RUN",externalKey:t.id,resumeAfter:nc(e.node.config),timeoutAt:no(e.node.config)}:void 0}),ng=(e,t,r,i=[])=>({output:{jobId:t.id},sessionPatch:r,links:[...i,{kind:"AGENT_JOB",resourceId:t.id,label:"Agent job",url:`/jobs/${t.id}`}],wait:{kind:"AGENT_JOB",externalKey:t.id,resumeAfter:nc(e.node.config),timeoutAt:no(e.node.config,t.timeoutSeconds??3600)}}),ny=(e,t,r,i,a)=>({kind:e,resourceId:t,label:r,url:i,metadata:a}),nv=(e,t)=>ny("JIRA_TICKET",e,t??e);function nw(e,t,r){let i=nI(e);return ny("PULL_REQUEST",a6(i.owner,i.name,nT(e)),t??"Pull request",r)}function nb(e){let t=nS(e),r=nC(e);return t&&r?ny("PULL_REQUEST",a6(t.owner,t.name,r),"Pull request"):null}function nk(e){let t=e.node.config.workflowRunId??(0,nn.getSessionValue)(e.sessionData,"pipeline.runId"),r=(0,nn.getSessionValue)(e.sessionData,"pipeline.url");return("string"==typeof t||"number"==typeof t)&&"string"==typeof r&&r?ny("GITHUB_WORKFLOW_RUN",String(t),"Workflow run",r):null}function nx(e){let t=(0,nn.getSessionValue)(e.sessionData,"run.kind");if("PLAN"!==t&&"SESSION"!==t)return null;let r=function(e){try{return n$(e)}catch{return null}}(e);return r?ny("AGENT_RUN",r,t,`/${"PLAN"===t?"plans":"sessions"}/${r}`,{runKind:t}):null}function nS(e){let t=e.node.config.owner,r=e.node.config.name;if("string"==typeof t&&t.trim()&&"string"==typeof r&&r.trim())return{owner:t.trim(),name:r.trim()};let i=e.sessionData.repo&&"object"==typeof e.sessionData.repo&&!Array.isArray(e.sessionData.repo)?e.sessionData.repo.displayOrigin:null,a="string"==typeof i?i.match(/(?:https?:\/\/)?github\.com[/:]([^/]+)\/([^/.]+)(?:\.git)?$/i):null,n=a?.[1]?.trim(),s=a?.[2]?.trim();return n&&s?{owner:n,name:s}:null}function nI(e){let t=nS(e);if(!t)throw Error("GitHub owner and repository are required");return t}function nE(e){let t=nu(e,"Jira ticket"),r=t.issueType&&"object"==typeof t.issueType?t.issueType:{},i=t.status&&"object"==typeof t.status?t.status:{};return{...t,key:t.key,title:t.summary??t.title,type:r.name??t.type,status:i.name??t.status,statusCategory:i.category??t.statusCategory}}function nA(e){let t=nu(e,"Pull request"),r=Array.isArray(t.reviewThreads)?t.reviewThreads:[];return{...t,unresolvedThreads:r.filter(e=>e&&"object"==typeof e&&!Array.isArray(e)&&!0!==e.isResolved)}}function n_(e){return nd(e.node.config.issueKey??(0,nn.getSessionValue)(e.sessionData,"ticket.key"),"Jira issue key",100)}function nC(e){let t=e.node.config.number??(0,nn.getSessionValue)(e.sessionData,"pr.number"),r="string"==typeof t?Number(t):t;return"number"==typeof r&&Number.isInteger(r)&&r>=1?r:null}function nT(e){let t=nC(e);if(!t)throw Error("Pull request number is required");return t}function nR(e){return nh(e,"worktreeId","worktree.id","Worktree ID")}function nD(e){return nh(e,"codebaseId","codebase.id","Codebase ID")}function nN(e){let t=String(e.node.config.mode??"NEW").toUpperCase();if(!new Set(["NEW","EXISTING","TICKET"]).has(t))throw Error("Worktree branch mode must be NEW, EXISTING, or TICKET");return{mode:t,branchName:"TICKET"===t?null:np(e.node.config.branchName??(0,nn.getSessionValue)(e.sessionData,"worktree.branch"),500),ticketKey:"TICKET"===t?np(e.node.config.ticketKey??(0,nn.getSessionValue)(e.sessionData,"ticket.key"),100):null,baseBranch:nd(e.node.config.baseBranch??(0,nn.getSessionValue)(e.sessionData,"worktree.baseBranch")??(0,nn.getSessionValue)(e.sessionData,"repo.defaultBranch"),"Base branch",500)}}function nO(e){return nh(e,"buildId","build.id","Build ID")}function nP(e){return nd(e.node.config.agentId??(0,nn.getSessionValue)(e.sessionData,"agent.id")??(0,nn.getSessionValue)(e.sessionData,"codebase.agentId"),"Agent ID",500)}function n$(e){let t=e.node.config.runId;if("string"==typeof t&&t)return t;let r=e.node.config.sourceStepId;return"string"==typeof r?nd((0,nn.getSessionValue)(e.sessionData,`run.${r}.id`),"Agent run ID",500):nd((0,nn.getSessionValue)(e.sessionData,"run.id"),"Agent run ID",500)}function nU(e,t){let r,i;return{kind:t,worktreeId:(r=e.node.config.worktreeId,i=(0,nn.getSessionValue)(e.sessionData,"worktree.id"),"string"==typeof r&&r===e.run.workflowId&&"string"==typeof i&&i!==r?nd(i,"Worktree ID",500):nR(e)),jiraIssueKey:np(e.node.config.jiraIssueKey??(0,nn.getSessionValue)(e.sessionData,"ticket.key"),100),provider:nd(e.node.config.provider??"CODEX","Provider",50),model:nd(e.node.config.model,"Model",200),effort:np(e.node.config.effort,50),webSearchEnabled:!0===e.node.config.webSearchEnabled,prompt:nd(e.node.config.prompt,"Prompt",2e5),attachmentIds:Array.isArray(e.node.config.attachmentIds)?e.node.config.attachmentIds.map(String):[]}}let nB="workflow:trigger-events";class nj{async record(e){let t=await (0,tY.getPrismaClient)(),r=await this.recordInTransaction(t,e);return this.created(r.id),r}async recordInTransaction(e,t){let r=await e.workflowTriggerEvent.findUnique({where:{dedupeKey:t.dedupeKey}});return r||e.workflowTriggerEvent.create({data:{id:(0,g.randomUUID)(),kind:t.kind,subjectKey:t.subjectKey,dedupeKey:t.dedupeKey,payloadJson:JSON.stringify(t.payload)}})}created(e){rQ.agentEventBus.publish(nB,{workflowTriggerEventCreated:{id:e}})}subscribe(){return rQ.agentEventBus.iterate(nB)}}function nL(e){try{let t=JSON.parse(e);return t&&"object"==typeof t&&!Array.isArray(t)?t:{}}catch{return{}}}function nM(e,t){return{id:e.id,name:e.name,url:e.displayOrigin,canonicalOrigin:e.canonicalOrigin,displayOrigin:e.displayOrigin,defaultBranch:t??null}}function nq(e){return{id:e.id,name:e.name,hostname:e.hostname,connected:null===e.disconnectedAt,diskFreeBytes:e.diskFreeBytes,memoryFreeBytes:e.memoryFreeBytes}}class nF{events;agentControl;worktrees;diskSpace;started;running;diskAuditTimer;diskStateFingerprints;constructor(e,t,r,i){this.events=e,this.agentControl=t,this.worktrees=r,this.diskSpace=i,this.started=!1,this.running=!1,this.diskStateFingerprints=new Map}start(){!this.started&&(this.started=!0,this.running=!0,this.agentControl.registerCompletionObserver(e=>this.observeAgentJob(e)),this.consumeRuns(),this.consumeBuilds(),this.consumeWorktrees(),this.consumeCodebases(),this.consumeAgents(),this.diskSpace&&(this.consumeDiskSpace(),this.auditDiskSpace(!0)))}stop(){this.running=!1,this.diskAuditTimer&&clearTimeout(this.diskAuditTimer),this.diskAuditTimer=void 0}async record(e,t,r,i,a={}){await this.events.record({kind:e,subjectKey:t,dedupeKey:r,payload:{...i,...a,sessionData:i}})}async worktreeSessionData(e,t=!1){return e&&this.worktrees?this.worktrees.workflowSessionDataForWorktree(e,{includeMissing:t}):{}}async observeAgentJob(e){if("ccusage.report"===e.kind&&"SUCCEEDED"===e.status&&e.resultJson){let t=nL(e.resultJson),r=t.report&&"object"==typeof t.report&&!Array.isArray(t.report)?t.report:{},i=r.totals&&"object"==typeof r.totals&&!Array.isArray(r.totals)?r.totals:{};await this.record("CCUSAGE_THRESHOLD",e.agentId,`ccusage:${e.ccusageCollectionId??e.id}:${e.agentId}`,{run:{usage:i},agent:{id:e.agentId}},{cursorValue:e.ccusageCollectionId??e.id});return}if(!new Set(["FAILED","TIMED_OUT"]).has(e.status))return;let t=await this.worktreeSessionData(e.worktreeId,!0);await this.record("AGENT_JOB_FAILED",e.agentId,`agent-job:${e.id}:${e.status}`,(0,nn.mergeSessionData)(t,{agent:{id:e.agentId},codebase:{id:e.codebaseId,agentId:e.agentId},...e.worktreeId?{worktree:{id:e.worktreeId}}:{},steps:{trigger:{id:e.id,kind:e.kind,status:e.status,error:e.error}}}),{cursorValue:`${e.id}:${e.status}`})}async consumeRuns(){let e=rQ.agentEventBus.iterate(rQ.RUNS_CHANGED_TOPIC);try{for await(let t of e){if(!this.running)break;"drafts"!==t.runChanged.id&&await this.observeRun(t.runChanged.id).catch(e=>console.error("Could not record workflow run trigger:",e))}}finally{await e.return?.()}}async observeRun(e){let t=await (0,tY.getPrismaClient)(),r=await t.agentRun.findUnique({where:{id:e},include:{worktree:{include:{codebase:{include:{repository:!0}}}},agent:{select:{id:!0,name:!0,hostname:!0,disconnectedAt:!0,diskFreeBytes:!0,memoryFreeBytes:!0}},questionBatches:{orderBy:{createdAt:"desc"},take:1,include:{questions:{include:{options:!0}}}},events:{orderBy:{sequence:"desc"},take:1},toolCalls:{orderBy:{sequence:"desc"},take:1}}});if(!r)return;let i=await t.workflowRunResourceLink.findFirst({where:{kind:"AGENT_RUN",resourceId:r.id},include:{run:!0},orderBy:{createdAt:"desc"}}),a=await this.worktreeSessionData(r.worktree?.id??null),n=(0,nn.mergeSessionData)(a,{run:{id:r.id,kind:r.kind,status:r.status,phase:r.phase,origin:r.origin,provider:r.provider,model:r.model,finalOutput:r.finalOutput,error:r.error,sourcePlanId:r.sourcePlanId,parentRunId:r.parentRunId,followUpMode:r.followUpMode,usage:{inputTokens:r.inputTokens,outputTokens:r.outputTokens,reasoningTokens:r.reasoningTokens,cacheReadTokens:r.cacheReadTokens,cacheWriteTokens:r.cacheWriteTokens,toolCallCount:r.toolCallCount,estimatedCost:r.estimatedCost}},...r.worktree?{worktree:{id:r.worktree.id,path:r.worktree.folder,branch:r.worktree.branch,headSha:r.worktree.headSha},codebase:{id:r.worktree.codebase.id,folder:r.worktree.codebase.folder,agentId:r.worktree.codebase.agentId},repo:nM(r.worktree.codebase.repository,r.worktree.codebase.defaultBranch)}:{},...r.agent?{agent:nq(r.agent)}:{},...r.jiraIssueKey?{ticket:{key:r.jiraIssueKey}}:{}}),s=i?{workflowId:i.run.workflowId,runId:i.runId,attemptId:i.attemptId}:null,o={cursorValue:`${r.status}:${r.phase}`,workflowCorrelation:s};r.startedAt&&await this.record("RUN_STARTED",r.id,`run-started:${r.id}:${r.startedAt.toISOString()}`,n,o);let l="COMPLETED"===r.status?"RUN_COMPLETED":"FAILED"===r.status?"RUN_FAILED":"CANCELLED"===r.status?"RUN_CANCELLED":"PAUSED"===r.status?"RUN_PAUSED":null;l&&await this.record(l,r.id,`run-status:${r.id}:${r.status}:${r.finishedAt?.toISOString()??r.updatedAt.toISOString()}`,n,o),"RUNNING"===r.phase&&r.startedAt&&r.updatedAt>r.startedAt&&await this.record("RUN_CONTINUED",r.id,`run-continued:${r.id}:${r.updatedAt.toISOString()}`,n,o),r.sourcePlanId&&await this.record("RUN_PLAN_PLAYED",r.id,`run-plan-played:${r.id}:${r.sourcePlanId}`,n,o),r.parentRunId&&"PLAN_PLAY"!==r.followUpMode&&await this.record("RUN_FOLLOW_UP",r.id,`run-follow-up:${r.id}:${r.parentRunId}`,n,o),"IMPORTED"===r.origin&&await this.record("RUN_IMPORTED",r.id,`run-imported:${r.id}:${r.updatedAt.toISOString()}`,n,o),await this.record("RUN_USAGE_THRESHOLD",r.id,`run-usage:${r.id}:${r.updatedAt.toISOString()}`,n,{...o,cursorValue:r.updatedAt.toISOString()});let c=r.questionBatches[0];if(c){let e={...n,run:{...n.run,questions:c.questions}};"PENDING"===c.status?await this.record("RUN_QUESTION_NEEDED",r.id,`run-question:${c.id}:pending`,e,o):"ANSWERED"===c.status&&await this.record("RUN_QUESTION_ANSWERED",r.id,`run-question:${c.id}:answered`,e,o)}let u=r.events[0];u&&await this.record("RUN_EVENT_MATCH",r.id,`run-event:${u.id}`,n,{...o,event:u});let d=r.toolCalls[0];d&&await this.record("RUN_EVENT_MATCH",r.id,`run-tool:${d.id}:${d.status}`,n,{...o,toolCall:d})}async consumeBuilds(){let e=rQ.agentEventBus.iterate(rQ.BUILDS_CHANGED_TOPIC);try{for await(let t of e){if(!this.running)break;await this.observeBuild(t.buildsChanged.id).catch(e=>console.error("Could not record workflow build trigger:",e))}}finally{await e.return?.()}}async observeBuild(e){let t=await (0,tY.getPrismaClient)(),r=await t.build.findUnique({where:{id:e},include:{codebase:{include:{repository:!0,agent:{select:{id:!0,name:!0,hostname:!0,disconnectedAt:!0,diskFreeBytes:!0,memoryFreeBytes:!0}}}},worktree:!0,reports:!0,scriptExecutions:!0}});if(!r)return;let i=await this.worktreeSessionData(r.worktree?.id??null),a=(0,nn.mergeSessionData)(i,{build:{id:r.id,status:r.status,action:r.action,error:r.error},...r.codebase?{codebase:{id:r.codebase.id,folder:r.codebase.folder,agentId:r.codebase.agentId},repo:nM(r.codebase.repository,r.codebase.defaultBranch),agent:nq(r.codebase.agent)}:{},...r.worktree?{worktree:{id:r.worktree.id,path:r.worktree.folder,branch:r.worktree.branch,headSha:r.worktree.headSha}}:{}});for(let e of(new Set(["SUCCEEDED","FAILED","CANCELLED"]).has(r.status)&&await this.record("BUILD_RESULT",r.id,`build-result:${r.id}:${r.status}`,a,{cursorValue:r.status}),r.reports.filter(({status:e})=>"READY"===e))){let t=nL(e.summaryJson),i={...a,build:{...a.build,..."TEST_RESULTS"===e.kind?{testSummary:t}:{coverageSummary:t}}};await this.record("TEST_RESULTS"===e.kind?"BUILD_TEST_THRESHOLD":"BUILD_COVERAGE_THRESHOLD",r.id,`build-report:${e.id}:${e.updatedAt.toISOString()}`,i,{cursorValue:e.updatedAt.toISOString()})}for(let e of r.scriptExecutions.filter(({causedBuildFailure:e})=>e))await this.record("BUILD_HOOK_FAILED",r.id,`build-hook:${e.id}:failed`,a,{cursorValue:e.id,script:{id:e.id,name:e.nameSnapshot,phase:e.phase}})}async consumeWorktrees(){let e=rQ.agentEventBus.iterate(rQ.WORKTREE_CHANGED_TOPIC);try{for await(let t of e){if(!this.running)break;let e=t.worktreeOverviewChanged,r=await (0,tY.getPrismaClient)();for(let t of(await r.worktree.findMany({where:e.worktreeId?{id:e.worktreeId}:e.codebaseId?{codebaseId:e.codebaseId}:{},include:{codebase:{include:{repository:!0}}},take:e.worktreeId?1:500})))await this.observeWorktree(t).catch(e=>console.error("Could not record workflow worktree trigger:",e))}}finally{await e.return?.()}}async observeWorktree(e){let t=e.lastCheckedAt??e.updatedAt,r=e.hasStagedChanges||e.hasUnstagedChanges,i=await this.worktreeSessionData(e.id,!0),a=(0,nn.mergeSessionData)(i,{repo:nM(e.codebase.repository,e.codebase.defaultBranch),codebase:{id:e.codebase.id,folder:e.codebase.folder,agentId:e.codebase.agentId},worktree:{id:e.id,path:e.folder,branch:e.branch,headSha:e.headSha,pushStatus:e.pushStatus,baseBehind:e.baseBehind,dirty:r,missingAt:e.missingAt?.toISOString()??null,dirtySince:r?e.updatedAt.toISOString():null}}),n={cursorValue:t.toISOString()};(e.baseBehind??0)>0&&await this.record("WORKTREE_BEHIND",e.id,`worktree-behind:${e.id}:${t.toISOString()}`,a,n),await this.record("WORKTREE_DIRTY_DURATION",e.id,`worktree-dirty:${e.id}:${t.toISOString()}`,a,n),await this.record("WORKTREE_MISSING",e.id,`worktree-missing:${e.id}:${t.toISOString()}`,a,{cursorValue:!!e.missingAt}),await this.record("WORKTREE_DIVERGED",e.id,`worktree-diverged:${e.id}:${t.toISOString()}`,a,{cursorValue:"DIVERGED"===e.pushStatus}),e.headSha&&await this.record("WORKTREE_NEW_COMMIT",e.id,`worktree-commit:${e.id}:${e.headSha}`,a,{cursorValue:e.headSha})}async consumeCodebases(){let e=rQ.agentEventBus.iterate(rQ.CODEBASE_CHANGED_TOPIC);try{for await(let t of e){if(!this.running)break;let e=await (0,tY.getPrismaClient)(),r=t.codebaseOverviewChanged;for(let t of(await e.codebase.findMany({where:r.codebaseId?{id:r.codebaseId}:r.repositoryId?{repositoryId:r.repositoryId}:{},include:{repository:!0,agent:{select:{id:!0,name:!0,hostname:!0,disconnectedAt:!0,diskFreeBytes:!0,memoryFreeBytes:!0}}},take:r.codebaseId?1:500}))){let e={repo:nM(t.repository,t.defaultBranch),agent:nq(t.agent),codebase:{id:t.id,folder:t.folder,agentId:t.agentId,branch:t.defaultBranch,remoteBranches:JSON.parse(t.remoteBranchesJson)}},r=e.codebase.remoteBranches;if(Array.isArray(r))for(let i of r.filter(e=>"string"==typeof e))await this.record("CODEBASE_REMOTE_BRANCH",t.id,`codebase-remote-branch:${t.id}:${i}`,e,{cursorValue:i,branch:i})}}}finally{await e.return?.()}}async emitDiskSnapshot(e,t){let r=e.agent.id;t.report&&await this.record("AGENT_DISK_REPORT",r,`agent-disk-report:${r}:${e.disk.lastReportedAt??t.changeId}`,e,{cursorValue:e.disk.lastReportedAt}),t.threshold&&await this.record("AGENT_DISK_THRESHOLD",r,`agent-disk-threshold:${r}:${t.changeId}`,e);let i=r2(e);if(await this.record("AGENT_DISK_STATE_CHANGED",r,`agent-disk-state:${r}:${t.changeId}`,e,{cursorValue:i}),this.diskStateFingerprints.set(r,JSON.stringify(i)),t.cleanup){let i={...e,cleanup:t.cleanup};await this.record("AGENT_DISK_CLEANUP_RESULT",r,`agent-disk-cleanup:${t.cleanup.jobId}:${t.cleanup.status}`,i,{cleanup:t.cleanup})}}async observeDiskChange(e){if(!this.diskSpace)return;let{id:t,reason:r,cleanup:i}=e.diskSpaceChange;if("settings"===e.diskSpaceChanged){let e=await this.diskSpace.overview();for(let i of e.agents)await this.emitDiskSnapshot(r1(e.settings,i,r),{changeId:t,report:!1,threshold:!0});return}let a=await this.diskSpace.snapshot(e.diskSpaceChanged,r);await this.emitDiskSnapshot(a,{changeId:t,report:"REPORT_RECEIVED"===r,threshold:!0,cleanup:i})}async consumeDiskSpace(){if(!this.diskSpace)return;let e=this.diskSpace.subscribe();try{for await(let t of e){if(!this.running)break;await this.observeDiskChange(t).catch(e=>console.error("Could not record disk-space workflow trigger:",e))}}finally{await e.return?.()}}async auditDiskSpace(e){if(this.diskSpace&&this.running)try{let t=await this.diskSpace.overview();for(let r of t.agents){let i=r1(t.settings,r,e?"STARTUP_RECONCILE":"STATE_AUDIT"),a=JSON.stringify(r2(i));(e||this.diskStateFingerprints.get(r.agent.id)!==a)&&await this.emitDiskSnapshot(i,{changeId:(0,g.randomUUID)(),report:!1,threshold:e})}}catch(e){console.error("Could not audit disk-space workflow state:",e)}finally{this.running&&(this.diskAuditTimer=setTimeout(()=>void this.auditDiskSpace(!1),1e3*rY.DISK_SPACE_POLL_INTERVAL_SECONDS),this.diskAuditTimer.unref?.())}}async consumeAgents(){let e=rQ.agentEventBus.iterate(rQ.AGENT_CHANGED_TOPIC);try{for await(let t of e){if(!this.running)break;let e=await (0,tY.getPrismaClient)(),r=await e.agent.findUnique({where:{id:t.agentChanged.id}});if(!r)continue;let i=null===r.disconnectedAt,a={codebase:{agentId:r.id},agent:{id:r.id,name:r.name,connected:i,diskFreeBytes:r.diskFreeBytes,memoryFreeBytes:r.memoryFreeBytes}};await this.record("AGENT_CONNECTION",r.id,`agent-connection:${r.id}:${r.updatedAt.toISOString()}`,a,{cursorValue:i})}}finally{await e.return?.()}}}var nV=e.i(988349),nK=e.i(248626),nH=e.i(336921),nG=e.i(53803),nW=e.i(264977);async function nJ(e,t){let r=e.trim();if(!r||r.length>5e4)throw Error(`Workflow script must contain 1–${5e4.toLocaleString()} characters`);let i=await (0,nG.getQuickJS)(),a=Date.now()+250;try{return i.evalCode(`"use strict"; const session = Object.freeze(${JSON.stringify(t)}); (${r})(session);`,{memoryLimitBytes:8388608,maxStackSizeBytes:524288,shouldInterrupt:(0,nW.shouldInterruptAfterDeadline)(a)})}catch(t){let e=t instanceof Error?t.message:String(t);throw Error(`Workflow script failed: ${"interrupted"===e?"execution timed out after 250ms":e}`)}}class nz{handlers=new Map;register(e,t){this.handlers.set(e,t)}has(e){return this.handlers.has(e)}execute(e){let t=this.handlers.get(e.node.kind);if(!t)throw Error(`Workflow step ${e.node.kind} is not registered`);return t(e)}}let nZ="workflows:changed",nY=e=>`workflow-run:${e}`,nQ=e=>`workflow-run:${e}:events`,nX=e=>`workflow-run:${e}:questions`,n0=["QUEUED","RUNNING","PAUSING","PAUSED","WAITING","BLOCKED"],n1=new Set(["SUCCEEDED","FAILED","CANCELLED"]),n2=new Set(["SUCCEEDED","FAILED","CANCELLED","SKIPPED","SUPERSEDED"]),n3=new Set(["RUNNING","WAITING"]),n4=e=>JSON.parse(e);function n6(e){return{agent:{id:e.id,name:e.name,hostname:e.hostname,...void 0!==e.lastSeenAt&&void 0!==e.disconnectedAt?{connected:null!==e.lastSeenAt&&null===e.disconnectedAt&&Date.now()-e.lastSeenAt.getTime()<=(0,a.agentOnlineWindowMs)(e)}:{},...void 0!==e.diskFreeBytes?{diskFreeBytes:e.diskFreeBytes}:{},...void 0!==e.memoryFreeBytes?{memoryFreeBytes:e.memoryFreeBytes}:{}}}}function n8(e){return(0,nn.mergeSessionData)(n6(e.agent),{codebase:{id:e.id,folder:e.folder,agentId:e.agentId,branch:e.branch,headSha:e.headSha},repo:{id:e.repository.id,name:e.repository.name,url:e.repository.displayOrigin,canonicalOrigin:e.repository.canonicalOrigin,displayOrigin:e.repository.displayOrigin,defaultBranch:e.defaultBranch}})}function n5(e,t,r){let i=e.trim();if(!i)throw Error(`${t} is required`);if(i.length>r)throw Error(`${t} is too long`);return i}function n9(e){let t=e?.trim().toUpperCase()||"QUEUE";if(!new Set(["QUEUE","CONCURRENT","COALESCE_LATEST"]).has(t))throw Error("Workflow overlap policy is not supported");return t}function n7(e,t){let r=e??("CONCURRENT"===t?4:1);if(!Number.isInteger(r)||r<1||r>32)throw Error("Maximum concurrent runs must be between 1 and 32");return r}function se(e){return Array.isArray(e)?`[${e.map(se).join(",")}]`:e&&"object"==typeof e?`{${Object.entries(e).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>`${JSON.stringify(e)}:${se(t)}`).join(",")}}`:JSON.stringify(e)}function st(e,t,r){if(Buffer.byteLength(e,"utf8")>r)throw Error(`${t} is too large`)}function sr(e,t){if(!e||"object"!=typeof e||Array.isArray(e))throw Error(`${t} must be an object`);return e}function si(e){rQ.agentEventBus.publish(nZ,{workflowChanged:{id:e}})}function sa(e){rQ.agentEventBus.publish(nY(e),{workflowRunChanged:{id:e}}),rQ.agentEventBus.publish(nZ,{workflowChanged:{id:"runs",runId:e}}),rQ.agentEventBus.publish(rQ.SIDEBAR_STATUS_CHANGED_TOPIC,{sidebarStatusChanged:!0})}function sn(e){return[...ii.WORKFLOW_STEP_BY_KIND.get(e.kind).requiredPaths.map(t=>t.replaceAll("<stepId>",e.id)),...e.requiredPaths,...(0,nK.requiredConfigSessionPaths)(e.kind,"step",e.config)]}function ss(e){return[...ii.WORKFLOW_STEP_BY_KIND.get(e.kind).providedPaths.map(t=>t.replaceAll("<stepId>",e.id)),...e.providedPaths,`steps.${e.id}.*`]}async function so(e){return(await e.workflowRunNumberSequence.upsert({where:{id:"default"},create:{id:"default",nextValue:2},update:{nextValue:{increment:1}}})).nextValue-1}class sl{events;executor;checkpointRestorer;credentials;agentControl;notifications;runsService;worktrees;commandsService;githubService;jiraService;runtimeTimer;ticking;workerId;activeExecutions;claimedSecretJobs;waitPollers;constructor(e,t=new nz,r,i,a,n,s,o,l,c,u){this.events=e,this.executor=t,this.checkpointRestorer=r,this.credentials=i,this.agentControl=a,this.notifications=n,this.runsService=s,this.worktrees=o,this.commandsService=l,this.githubService=c,this.jiraService=u,this.ticking=!1,this.workerId=(0,g.randomUUID)(),this.activeExecutions=new Map,this.claimedSecretJobs=new Set,this.waitPollers=new Map,this.agentControl&&(this.executor.register("TERMINAL_RUN",e=>this.startTerminalJob(e)),this.executor.register("WORKTREE_SNAPSHOT",e=>this.startCheckpointJob(e)),this.agentControl.registerCompletionHandler(nH.WORKFLOW_TERMINAL_JOB_KIND,e=>this.workflowAgentJobCompleted(e)),this.agentControl.registerCompletionObserver(e=>this.genericAgentJobCompleted(e)),this.agentControl.registerCompletionHandler(nH.WORKFLOW_GIT_CHECKPOINT_JOB_KIND,e=>this.workflowAgentJobCompleted(e)))}async controlLinkedAgentRuns(e,t){if(!this.runsService)return;let r=await (0,tY.getPrismaClient)(),i=await r.workflowRunResourceLink.findMany({where:{runId:e,kind:"AGENT_RUN",attempt:{status:{in:["RUNNING","WAITING"]}}},select:{resourceId:!0},distinct:["resourceId"]});await Promise.allSettled(i.map(async({resourceId:e})=>{let r=await this.runsService.get(e);!r||"MANAGED"!==r.origin||"PAUSE"===t&&"IN_PROGRESS"!==r.status||"CONTINUE"===t&&"PAUSED"!==r.status||"CANCEL"===t&&new Set(["COMPLETED","FAILED","CANCELLED"]).has(r.status)||await this.runsService.lifecycle(e,t)}))}async cancelWaitingCommandRuns(e){if(!this.commandsService)return;let t=await (0,tY.getPrismaClient)(),r=await t.workflowRunResourceLink.findMany({where:{runId:e,kind:"COMMAND_RUN",attempt:{status:"WAITING"}},select:{resourceId:!0},distinct:["resourceId"]});await Promise.allSettled(r.map(({resourceId:e})=>this.commandsService.terminateRun(e)))}async runWorktree(e){let t=(0,nn.getSessionValue)(n4(e),"worktree.id");return"string"==typeof t&&t?(await (0,tY.getPrismaClient)()).worktree.findUnique({where:{id:t},select:{id:!0,folder:!0,branch:!0,highlightColor:!0}}):null}async notifyRun(e,t,r,i,a){if(!this.notifications)return;let n=await (0,tY.getPrismaClient)(),s=await n.workflowRun.findUnique({where:{id:e},select:{sessionDataJson:!0}}),o=s?await this.runWorktree(s.sessionDataJson):null,l=await n.$transaction(n=>this.notifications.recordInTransaction(n,{dedupeKey:`workflow:${e}:${a}`,typeKey:t,title:r,body:i,href:`/workflows/runs/${e}`,resourceKind:"WORKFLOW_RUN",resourceId:e,worktreeId:o?.id??null,highlightColor:o?.highlightColor??null}));this.notifications.created(l)}startRuntime(){this.runtimeTimer||(this.runtimeTimer=setInterval(()=>{this.tick().catch(e=>{console.error("Workflow runtime tick failed:",e)})},1e3),this.runtimeTimer.unref?.(),this.tick().catch(e=>{console.error("Workflow runtime startup failed:",e)}))}stopRuntime(){for(let e of(this.runtimeTimer&&clearInterval(this.runtimeTimer),this.runtimeTimer=void 0,this.activeExecutions.values()))e.abort();this.activeExecutions.clear()}catalog(){return{schemaVersion:ii.WORKFLOW_SCHEMA_VERSION,globalConcurrency:4,steps:ii.WORKFLOW_STEP_CATALOG,triggers:ii.WORKFLOW_TRIGGER_CATALOG}}registerWaitPoller(e,t){this.waitPollers.set(e,t)}async list(e={}){let t=await (0,tY.getPrismaClient)(),r=Math.min(Math.max(e.first??100,1),200),i=e.archive?.toUpperCase()??"ACTIVE",a=e.search?.trim(),n=await t.workflow.findMany({where:{..."ALL"===i?{}:"ARCHIVED"===i?{archivedAt:{not:null}}:{archivedAt:null},...null===e.enabled||void 0===e.enabled?{}:{enabled:e.enabled},...a?{OR:[{name:{contains:a}},{description:{contains:a}}]}:{}},include:{activeVersion:!0,quickActionRepositories:{include:{repository:!0}},_count:{select:{versions:!0,runs:!0}}},orderBy:[{updatedAt:"desc"},{id:"desc"}],take:r+1,...e.after?{cursor:{id:e.after},skip:1}:{}});return{items:n.slice(0,r),nextCursor:n.length>r?n[r-1].id:null,totalCount:await t.workflow.count()}}async get(e){return(await (0,tY.getPrismaClient)()).workflow.findUnique({where:{id:e},include:{activeVersion:!0,versions:{orderBy:{version:"desc"}},quickActionRepositories:{include:{repository:!0}},_count:{select:{runs:!0}}}})}async version(e){return(await (0,tY.getPrismaClient)()).workflowVersion.findUnique({where:{id:e},include:{triggers:!0}})}async create(e){let t=n5(e.name,"Workflow name",200),r=(0,ii.parseWorkflowDefinition)(e.definition??(0,ii.emptyWorkflowDefinition)(t)),i=JSON.stringify({...r,name:t,description:e.description?.trim()??r.description});st(i,"Workflow definition",2097152);let a=n9(e.overlapPolicy),n=await (0,tY.getPrismaClient)(),s=await n.workflow.create({data:{id:(0,g.randomUUID)(),name:t,description:e.description?.trim()??r.description,draftDefinitionJson:i,draftSchemaVersion:ii.WORKFLOW_SCHEMA_VERSION,overlapPolicy:a,maxConcurrentRuns:n7(e.maxConcurrentRuns,a)}});return si(s.id),this.get(s.id)}async saveDraft(e){let t=(0,ii.parseWorkflowDefinition)(e.definition),r=JSON.stringify(t);st(r,"Workflow definition",2097152);let i=await this.get(e.id);if(!i)throw Error("Workflow not found");let a=n9(e.overlapPolicy??i.overlapPolicy),n=await (0,tY.getPrismaClient)();return await n.workflow.update({where:{id:e.id},data:{name:t.name,description:t.description,draftDefinitionJson:r,draftSchemaVersion:t.schemaVersion,overlapPolicy:a,maxConcurrentRuns:n7(e.maxConcurrentRuns??i.maxConcurrentRuns,a)}}),si(e.id),this.get(e.id)}async validateDraft(e){let t=await this.get(e);if(!t)throw Error("Workflow not found");let r=(0,ii.validateWorkflowDefinition)(n4(t.draftDefinitionJson)),i=[...r.diagnostics];return r.definition&&i.push(...await this.validateSubworkflows(t.id,r.definition)),{valid:!(0,ii.hasWorkflowErrors)(i),diagnostics:i}}async validateSubworkflows(e,t){let r=t.nodes.filter(({kind:e})=>"CONTROL_SUBWORKFLOW"===e).map(e=>({node:e,versionId:e.config.versionId})).filter(e=>"string"==typeof e.versionId);if(!r.length)return[];let i=await (0,tY.getPrismaClient)(),a=new Map,n=new Map,s=new Set,o=new Set,l=r.map(({versionId:e})=>e);for(;l.length;){let e=[...new Set(l)].filter(e=>!o.has(e));if(!e.length)break;for(let t of(e.forEach(e=>o.add(e)),l=[],await i.workflowVersion.findMany({where:{id:{in:e}}}))){a.set(t.id,t);try{let e=(0,ii.parseWorkflowDefinition)(n4(t.definitionJson)).nodes.filter(({kind:e})=>"CONTROL_SUBWORKFLOW"===e).map(({config:e})=>e.versionId).filter(e=>"string"==typeof e);n.set(t.id,e),l.push(...e)}catch{s.add(t.id)}}}let c=(e,t)=>{let r=a.get(e);if(!r)return"MISSING";if(s.has(e))return"INVALID";if(t.has(r.workflowId))return"RECURSIVE";let i=new Set(t).add(r.workflowId);for(let t of n.get(e)??[]){let e=c(t,i);if(e)return e}return null},u=[];for(let{node:t,versionId:i}of r){let r=c(i,new Set([e]));"MISSING"===r?u.push({severity:"ERROR",code:"SUBWORKFLOW_NOT_FOUND",message:"Pinned sub-workflow chain contains a missing version",nodeId:t.id}):"INVALID"===r?u.push({severity:"ERROR",code:"SUBWORKFLOW_INVALID",message:"Pinned sub-workflow chain contains an invalid definition",nodeId:t.id}):"RECURSIVE"===r&&u.push({severity:"ERROR",code:"SUBWORKFLOW_RECURSION",message:"Pinned sub-workflow calls cannot form a recursive chain",nodeId:t.id})}return u}async publish(e){let t=await this.get(e);if(!t)throw Error("Workflow not found");let r=(0,ii.parseWorkflowDefinition)(n4(t.draftDefinitionJson)),i=await this.validateDraft(e);if(!i.valid)throw Error(`Workflow cannot be published: ${i.diagnostics.filter(({severity:e})=>"ERROR"===e).map(({message:e})=>e).slice(0,5).join("; ")}`);let a=await (0,tY.getPrismaClient)(),n=await a.$transaction(async t=>{let i=await t.workflowVersion.findFirst({where:{workflowId:e},orderBy:{version:"desc"}}),a=(0,g.randomUUID)(),n=await t.workflowVersion.create({data:{id:a,workflowId:e,version:(i?.version??0)+1,name:r.name,description:r.description,schemaVersion:r.schemaVersion,definitionJson:JSON.stringify(r),contentHash:(0,g.createHash)("sha256").update(se(r)).digest("hex"),triggers:{create:r.triggers.map(e=>({id:(0,g.randomUUID)(),nodeId:e.id,kind:e.kind,configJson:JSON.stringify(e.config)}))}},include:{triggers:!0}});return await t.workflow.update({where:{id:e},data:{activeVersionId:a}}),n});return si(e),n}async setEnabled(e,t){let r=await (0,tY.getPrismaClient)(),i=await r.workflow.findUnique({where:{id:e}});if(!i)throw Error("Workflow not found");if(t&&!i.activeVersionId)throw Error("Publish the workflow before enabling it");return await r.workflow.update({where:{id:e},data:{enabled:t}}),si(e),this.get(e)}async setQuickAction(e){let t=await (0,tY.getPrismaClient)(),r=[...new Set(e.repositoryIds.map(e=>e.trim()).filter(Boolean))],[i,a]=await Promise.all([t.workflow.findUnique({where:{id:e.id},select:{id:!0}}),t.codebaseRepository.count({where:{id:{in:r}}})]);if(!i)throw Error("Workflow not found");if(a!==r.length)throw Error("One or more repositories were not found");let n=e.quickActionIconKey.trim();if(!ia.WORKFLOW_QUICK_ACTION_KINDS.includes(e.kind))throw Error("Quick action kind is invalid");if("none"!==n&&!a3.BUILD_CONFIGURATION_ICON_KEYS.includes(n))throw Error("Quick action icon is invalid");let s=e.quickActionButtonVariant.trim();if(!["default","outline","secondary","destructive"].includes(s))throw Error("Quick action button style is invalid");return await t.$transaction(async t=>{await t.workflow.update({where:{id:e.id},data:{quickActionKind:e.kind,quickActionIconKey:n,quickActionButtonVariant:s}}),await t.workflowQuickActionRepository.deleteMany({where:{workflowId:e.id}}),r.length&&await t.workflowQuickActionRepository.createMany({data:r.map(t=>({workflowId:e.id,repositoryId:t}))})}),si(e.id),this.get(e.id)}async archive(e,t){let r=await (0,tY.getPrismaClient)();return await r.workflow.update({where:{id:e},data:{archivedAt:t?new Date:null,...t?{enabled:!1}:{}}}),si(e),this.get(e)}async delete(e){let t=await (0,tY.getPrismaClient)();if(await t.workflowRun.count({where:{workflowId:e}}))throw Error("Archive workflows that have run history instead of deleting them");return await t.workflow.delete({where:{id:e}}),si(e),!0}export(e,t){return this.exportInternal(e,t)}async exportInternal(e,t){let r=await this.get(e);if(!r)throw Error("Workflow not found");let i=t?r.versions.find(e=>e.id===t):null;if(t&&!i)throw Error("Workflow version not found");let a=(0,ii.parseWorkflowDefinition)(n4(i?.definitionJson??r.draftDefinitionJson));return{format:"aide.workflow.export",schemaVersion:ii.WORKFLOW_SCHEMA_VERSION,exportedAt:new Date().toISOString(),workflow:{name:i?.name??r.name,description:i?.description??r.description,overlapPolicy:r.overlapPolicy,maxConcurrentRuns:r.maxConcurrentRuns,definition:(0,ii.sanitizeWorkflowExportDefinition)(a)}}}async import(e){st("string"==typeof e.payload?e.payload:JSON.stringify(e.payload),"Workflow import",2097152);let t=sr("string"==typeof e.payload?JSON.parse(e.payload):e.payload,"Workflow import"),r="aide.workflow.export"===t.format,i=r?sr(t.workflow,"Exported workflow"):t,a=(0,ii.parseWorkflowDefinition)(r?i.definition:i);return this.create({name:e.name?.trim()||a.name,description:a.description,definition:{...a,name:e.name?.trim()||a.name},overlapPolicy:"string"==typeof i.overlapPolicy?i.overlapPolicy:"QUEUE",maxConcurrentRuns:"number"==typeof i.maxConcurrentRuns?i.maxConcurrentRuns:1})}async runs(e={}){let t=await (0,tY.getPrismaClient)(),r=Math.min(Math.max(e.first??100,1),200),i=Number(e.search),a=e.archive?.toUpperCase()??"ACTIVE",n="ALL"===a?{}:"ARCHIVED"===a?{archivedAt:{not:null}}:{archivedAt:null},s=await t.workflowRun.findMany({where:{...n,...e.workflowId?{workflowId:e.workflowId}:{},...e.status?{status:e.status.toUpperCase()}:{},...Number.isInteger(i)&&i>0?{displayNumber:i}:e.search?.trim()?{workflow:{name:{contains:e.search.trim()}}}:{}},include:{workflow:!0,version:!0,trigger:!0,_count:{select:{attempts:!0,events:!0}}},orderBy:[{createdAt:"desc"},{id:"desc"}],take:r+1,...e.after?{cursor:{id:e.after},skip:1}:{}});return{items:s.slice(0,r),nextCursor:s.length>r?s[r-1].id:null,totalCount:await t.workflowRun.count({where:{...n,...e.workflowId?{workflowId:e.workflowId}:{}}})}}async archiveRuns(e,t){let r=await (0,tY.getPrismaClient)(),i=[...new Set(e)],a=await r.workflowRun.updateMany({where:{id:{in:i}},data:{archivedAt:t?new Date:null}});for(let e of i)sa(e);return a.count}async deleteRuns(e){let t=await (0,tY.getPrismaClient)(),r=[...new Set(e)];if(await t.workflowRun.count({where:{id:{in:r},status:{notIn:["SUCCEEDED","FAILED","CANCELLED"]}}}))throw Error("Cancel runs that have not finished before deleting them");let i=await t.workflowRun.deleteMany({where:{id:{in:r}}});for(let e of r)sa(e);return i.count}async run(e){return(await (0,tY.getPrismaClient)()).workflowRun.findUnique({where:{id:e},include:{workflow:!0,version:!0,trigger:!0,parentRun:!0,childRuns:{orderBy:{createdAt:"asc"}},attempts:{orderBy:[{generation:"asc"},{nodeId:"asc"},{iterationKey:"asc"},{attempt:"asc"}],include:{waits:{orderBy:{createdAt:"asc"}},resourceLinks:{orderBy:{createdAt:"asc"}},questionBatches:{orderBy:{createdAt:"asc"},include:{questions:{orderBy:{position:"asc"},include:{options:{orderBy:{position:"asc"}}}},answerRevisions:{orderBy:{revision:"asc"}},checkpoint:!0}},checkpoints:{orderBy:{createdAt:"asc"}}}},waits:{orderBy:{createdAt:"asc"}},events:{orderBy:{sequence:"asc"}},resourceLinks:{orderBy:{createdAt:"asc"}}}})}async runEvents(e,t=-1,r=500){return(await (0,tY.getPrismaClient)()).workflowRunEvent.findMany({where:{runId:e,sequence:{gt:t}},orderBy:{sequence:"asc"},take:Math.min(Math.max(r,1),1e3)})}async questionBatch(e){return(await (0,tY.getPrismaClient)()).runQuestionBatch.findUnique({where:{id:e},include:{questions:{orderBy:{position:"asc"},include:{options:{orderBy:{position:"asc"}}}},answerRevisions:{orderBy:{revision:"asc"}},checkpoint:!0}})}async jobSecrets(e,t){if(!this.credentials||!this.agentControl)throw Error("Workflow credentials are unavailable");if(this.claimedSecretJobs.has(t))throw Error("Workflow job secrets were already claimed");let r=await this.agentControl.getJob(t);if(!r||r.agentId!==e||"workflow.terminal.run"!==r.kind||"RUNNING"!==r.status)throw Error("Workflow job is not eligible to claim secrets");let i=(0,nH.parseWorkflowTerminalPayload)(n4(r.payloadJson)),a=new Set(Object.values(tX.CREDENTIAL_KINDS)),n=[];for(let e of i.credentialEnvironment){if(!a.has(e.credential.kind))throw Error("Workflow references an unsupported credential kind");let t=await this.credentials.getText(e.credential);if(null===t)throw Error(`Credential ${e.credential.id} is unavailable`);n.push({name:e.name,value:t})}return this.claimedSecretJobs.add(t),n}async workflowAgentContext(e){let t=await (0,tY.getPrismaClient)(),r=(0,nn.getSessionValue)(e,"worktree.id");if("string"==typeof r){let e=await t.worktree.findUnique({where:{id:r},include:{codebase:{include:{agent:!0}}}});if(!e)throw Error("Workflow worktree is unavailable");let i=JSON.parse(e.codebase.agent.capabilitiesJson);return{agentId:e.codebase.agentId,codebaseId:e.codebaseId,worktreeId:e.id,cwd:e.folder,capabilities:Array.isArray(i)?i.filter(e=>"string"==typeof e):[]}}let i=(0,nn.getSessionValue)(e,"codebase.id");if("string"!=typeof i)throw Error("Workflow requires a codebase or worktree");let a=await t.codebase.findUnique({where:{id:i},include:{agent:!0}});if(!a)throw Error("Workflow codebase is unavailable");let n=JSON.parse(a.agent.capabilitiesJson);return{agentId:a.agentId,codebaseId:a.id,worktreeId:null,cwd:a.folder,capabilities:Array.isArray(n)?n.filter(e=>"string"==typeof e):[]}}async startTerminalJob(e){if(!this.agentControl)throw Error("Agent control is unavailable");let t=await this.workflowAgentContext(e.sessionData);if(!t.capabilities.includes(nH.WORKFLOW_TERMINAL_JOB_KIND))throw Error("The selected agent must be updated to run workflow terminal steps");let r={...e.node.config.environment&&"object"==typeof e.node.config.environment&&!Array.isArray(e.node.config.environment)?Object.fromEntries(Object.entries(e.node.config.environment).map(([e,t])=>[e,String(t)])):{},AIDE_TICKET_KEY:String((0,nn.getSessionValue)(e.sessionData,"ticket.key")??""),AIDE_TICKET_TITLE:String((0,nn.getSessionValue)(e.sessionData,"ticket.title")??""),AIDE_BRANCH:String((0,nn.getSessionValue)(e.sessionData,"worktree.branch")??""),AIDE_BASE_BRANCH:String((0,nn.getSessionValue)(e.sessionData,"worktree.baseBranch")??""),AIDE_WORKTREE_PATH:String((0,nn.getSessionValue)(e.sessionData,"worktree.path")??t.cwd),AIDE_CODEBASE_PATH:String((0,nn.getSessionValue)(e.sessionData,"codebase.folder")??t.cwd),AIDE_REPO_ORIGIN:String((0,nn.getSessionValue)(e.sessionData,"repo.displayOrigin")??"")},i=Array.isArray(e.node.config.credentials)?e.node.config.credentials:[],a=await this.agentControl.createJob({agentId:t.agentId,kind:nH.WORKFLOW_TERMINAL_JOB_KIND,payload:{workflowRunId:e.run.id,stepAttemptId:e.attempt.id,stepId:e.node.id,codebaseId:t.codebaseId,worktreeId:t.worktreeId,cwd:t.cwd,script:n5(String(e.node.config.script??""),"Terminal script",1e6),interpreter:"NODE"===e.node.config.interpreter?"NODE":"SHELL",sessionData:e.sessionData,environment:r,credentialEnvironment:i},idempotencyKey:e.attempt.idempotencyKey,timeoutSeconds:Number(e.node.config.timeoutSeconds??900),codebaseId:t.codebaseId,worktreeId:t.worktreeId,visibility:"SYSTEM"});return{output:{jobId:a.id},links:[{kind:"AGENT_JOB",resourceId:a.id,label:"Workflow terminal job",url:`/jobs/${a.id}`}],wait:{kind:"AGENT_JOB",externalKey:a.id,resumeAfter:nc(e.node.config),timeoutAt:no(e.node.config,900)}}}async startCheckpointJob(e){if(!this.agentControl)throw Error("Agent control is unavailable");let t=await this.workflowAgentContext(e.sessionData);if(!t.capabilities.includes(nH.WORKFLOW_GIT_CHECKPOINT_JOB_KIND))throw Error("The selected agent must be updated to capture workflow checkpoints");let r=await this.agentControl.createJob({agentId:t.agentId,kind:nH.WORKFLOW_GIT_CHECKPOINT_JOB_KIND,payload:{operation:"CAPTURE",workflowRunId:e.run.id,stepAttemptId:e.attempt.id,cwd:t.cwd,kind:String(e.node.config.kind??"STEP"),checkpoint:null,stash:!1},idempotencyKey:e.attempt.idempotencyKey,timeoutSeconds:300,codebaseId:t.codebaseId,worktreeId:t.worktreeId,visibility:"SYSTEM"});return{output:{jobId:r.id},links:[{kind:"AGENT_JOB",resourceId:r.id,label:"Workflow checkpoint job",url:`/jobs/${r.id}`}],wait:{kind:"AGENT_JOB",externalKey:r.id,resumeAfter:nc(e.node.config),timeoutAt:no(e.node.config)}}}async workflowAgentJobCompleted(e){if(e.kind===nH.WORKFLOW_TERMINAL_JOB_KIND){let t=(0,nH.parseWorkflowTerminalPayload)(n4(e.payloadJson));if("SUCCEEDED"!==e.status||!e.resultJson)return void await this.resolveExternalWait("AGENT_JOB",e.id,{jobId:e.id,status:e.status},e.error||`Workflow terminal job ${e.status.toLowerCase()}`);let r=sr(n4(e.resultJson),"Workflow terminal result");return void await this.resolveExternalWait("AGENT_JOB",e.id,{...r,jobId:e.id,stepAttemptId:t.stepAttemptId})}if(e.kind!==nH.WORKFLOW_GIT_CHECKPOINT_JOB_KIND)return;let t=(0,nH.parseWorkflowGitCheckpointPayload)(n4(e.payloadJson));if("SUCCEEDED"!==e.status||!e.resultJson)return void await this.resolveExternalWait("AGENT_JOB",e.id,{jobId:e.id,status:e.status},e.error||`Workflow checkpoint job ${e.status.toLowerCase()}`);let r=sr(n4(e.resultJson),"Workflow checkpoint result"),i=null;if(r.checkpoint&&"object"==typeof r.checkpoint){let e=r.checkpoint,a=await (0,tY.getPrismaClient)();i=(0,g.randomUUID)(),await a.$transaction([a.runCheckpoint.create({data:{id:i,workflowStepAttemptId:t.stepAttemptId,kind:String(e.kind??t.kind),headSha:"string"==typeof e.headSha?e.headSha:null,branch:"string"==typeof e.branch?e.branch:null,upstreamSha:"string"==typeof e.upstreamSha?e.upstreamSha:null,indexTree:"string"==typeof e.indexTree?e.indexTree:null,worktreeTree:"string"==typeof e.worktreeTree?e.worktreeTree:null,refName:"string"==typeof e.refName?e.refName:null,manifestJson:"string"==typeof e.manifestJson?e.manifestJson:null,diffSummary:"string"==typeof e.diffSummary?e.diffSummary:null,diffPatch:"string"==typeof e.diffPatch?e.diffPatch:null,stashRef:"string"==typeof r.stashRef?r.stashRef:"string"==typeof e.stashRef?e.stashRef:null}}),a.workflowRunResourceLink.create({data:{id:(0,g.randomUUID)(),runId:t.workflowRunId,attemptId:t.stepAttemptId,kind:"CHECKPOINT",resourceId:i,label:`${String(e.kind??t.kind)} checkpoint`}})])}await this.resolveExternalWait("AGENT_JOB",e.id,{...r,jobId:e.id,checkpointId:i})}async genericAgentJobCompleted(e){if(e.kind===nH.WORKFLOW_TERMINAL_JOB_KIND||e.kind===nH.WORKFLOW_GIT_CHECKPOINT_JOB_KIND)return;let t=e.resultJson?sr(n4(e.resultJson),"Agent job result"):{status:e.status};if("SUCCEEDED"===e.status){let r=await (0,tY.getPrismaClient)(),i=t.worktree&&"object"==typeof t.worktree&&!Array.isArray(t.worktree)?t.worktree:null,a=i&&"string"==typeof i.gitDirectory?i.gitDirectory:null,n=e.codebaseId?await r.worktree.findFirst({where:{codebaseId:e.codebaseId,...e.worktreeId?{id:e.worktreeId}:a?{gitDirectory:a}:{id:"__missing__"}},include:{codebase:{include:{repository:!0,agent:!0}}}}):null,s=n?.codebase??(e.codebaseId?await r.codebase.findUnique({where:{id:e.codebaseId},include:{repository:!0,agent:!0}}):null),o={};if(n&&this.worktrees?.workflowSessionDataForWorktree)try{o=await this.worktrees.workflowSessionDataForWorktree(n.id,{includeMissing:!0})}catch{}if(s&&!o.codebase&&(o.repo={id:s.repository.id,name:s.repository.name,url:s.repository.displayOrigin,canonicalOrigin:s.repository.canonicalOrigin,displayOrigin:s.repository.displayOrigin,defaultBranch:s.defaultBranch},o.codebase={id:s.id,folder:s.folder,agentId:s.agentId,branch:s.defaultBranch,headSha:s.headSha},o.agent={id:s.agent.id,name:s.agent.name,hostname:s.agent.hostname}),n&&!o.worktree&&(o.worktree={id:n.id,path:n.folder,branch:n.branch,baseBranch:n.baseBranchOverride??n.codebase.defaultBranch,headSha:n.headSha,pushStatus:n.pushStatus,ahead:n.ahead,behind:n.behind,baseBehind:n.baseBehind,dirty:n.hasStagedChanges||n.hasUnstagedChanges}),Object.keys(o).length){let e=t.sessionPatch&&"object"==typeof t.sessionPatch&&!Array.isArray(t.sessionPatch)?t.sessionPatch:{};t={...t,sessionPatch:(0,nn.mergeSessionData)(e,o)}}}await this.resolveExternalWait("AGENT_JOB",e.id,{...t,jobId:e.id,status:e.status},"SUCCEEDED"===e.status?null:e.error||`Agent job ${e.status.toLowerCase()}`)}async restoreCheckpointWithAgent(e,t){if(!this.agentControl)throw Error("Agent control is unavailable");let r=await (0,tY.getPrismaClient)(),i=await r.runCheckpoint.findUnique({where:{id:e},include:{workflowStepAttempt:{include:{run:!0}}}}),a=i?.workflowStepAttempt;if(!i||!a)throw Error("Workflow checkpoint not found");let n=await this.workflowAgentContext((0,nn.workflowSessionData)(a.run.sessionDataJson)),s=await this.agentControl.createJob({agentId:n.agentId,kind:nH.WORKFLOW_GIT_CHECKPOINT_JOB_KIND,payload:{operation:"RESTORE",workflowRunId:a.runId,stepAttemptId:a.id,cwd:n.cwd,kind:"REPLAY_RESTORE",checkpoint:{headSha:i.headSha,branch:i.branch,upstreamSha:i.upstreamSha,indexTree:i.indexTree,worktreeTree:i.worktreeTree,refName:i.refName},stash:t.stash},idempotencyKey:`workflow:restore:${e}:${(0,g.randomUUID)()}`,timeoutSeconds:300,codebaseId:n.codebaseId,worktreeId:n.worktreeId,visibility:"SYSTEM"}),o=Date.now()+3e5;for(;Date.now()<o;){let e=await this.agentControl.getJob(s.id);if(!e)throw Error("Workflow restore job disappeared");if(new Set(["SUCCEEDED","FAILED","CANCELLED","TIMED_OUT"]).has(e.status)){if("SUCCEEDED"!==e.status)throw Error(e.error||`Workflow restore job ${e.status.toLowerCase()}`);return}await new Promise(e=>setTimeout(e,250))}throw await this.agentControl.cancelJob(s.id),Error("Workflow restore job timed out")}async compareCheckpointWithAgent(e){if(!this.agentControl)throw Error("Agent control is unavailable");let t=await (0,tY.getPrismaClient)(),r=await t.runCheckpoint.findUnique({where:{id:e},include:{workflowStepAttempt:{include:{run:!0}}}}),i=r?.workflowStepAttempt;if(!r||!i)throw Error("Workflow checkpoint not found");let a=await this.workflowAgentContext((0,nn.workflowSessionData)(i.run.sessionDataJson)),n=await this.agentControl.createJob({agentId:a.agentId,kind:nH.WORKFLOW_GIT_CHECKPOINT_JOB_KIND,payload:{operation:"COMPARE",workflowRunId:i.runId,stepAttemptId:i.id,cwd:a.cwd,kind:"REPLAY_PREVIEW",checkpoint:{headSha:r.headSha,branch:r.branch,upstreamSha:r.upstreamSha,indexTree:r.indexTree,worktreeTree:r.worktreeTree,refName:r.refName},stash:!1},idempotencyKey:`workflow:compare:${e}:${(0,g.randomUUID)()}`,timeoutSeconds:60,codebaseId:a.codebaseId,worktreeId:a.worktreeId,visibility:"SYSTEM"}),s=Date.now()+6e4;for(;Date.now()<s;){let e=await this.agentControl.getJob(n.id);if(!e)throw Error("Workflow comparison job disappeared");if(new Set(["SUCCEEDED","FAILED","CANCELLED","TIMED_OUT"]).has(e.status)){if("SUCCEEDED"!==e.status||!e.resultJson)throw Error(e.error||`Workflow comparison job ${e.status.toLowerCase()}`);let t=sr(n4(e.resultJson),"Workflow comparison result");return sr(t.comparison,"Git checkpoint comparison")}await new Promise(e=>setTimeout(e,250))}throw await this.agentControl.cancelJob(n.id),Error("Workflow comparison job timed out")}async runsForResource(e,t){let r=await (0,tY.getPrismaClient)(),i=await r.workflowRunResourceLink.findMany({where:{kind:e.trim().toUpperCase(),resourceId:t.trim()},select:{runId:!0},distinct:["runId"],orderBy:{createdAt:"desc"}});return r.workflowRun.findMany({where:{id:{in:i.map(({runId:e})=>e)}},include:{workflow:!0,version:!0,trigger:!0,attempts:{orderBy:[{generation:"asc"},{createdAt:"asc"}],include:{resourceLinks:{orderBy:{createdAt:"asc"}},questionBatches:{orderBy:{createdAt:"asc"},include:{questions:{orderBy:{position:"asc"},include:{options:{orderBy:{position:"asc"}}}}}}}},resourceLinks:{orderBy:{createdAt:"asc"}}},orderBy:{createdAt:"desc"}})}async acceptingResource(e){let t=e.trim().toUpperCase(),r=await (0,tY.getPrismaClient)();return(await r.workflow.findMany({where:{enabled:!0,archivedAt:null,activeVersionId:{not:null}},include:{activeVersion:!0},orderBy:{name:"asc"}})).filter(e=>!!e.activeVersion&&(0,ii.parseWorkflowDefinition)(n4(e.activeVersion.definitionJson)).triggers.some(e=>(0,ia.isResourceTriggerKind)(e.kind)&&(0,ii.workflowResourceKind)(e.config)===t))}async quickActions(e){let t=await (0,tY.getPrismaClient)();if(!ia.WORKFLOW_QUICK_ACTION_KINDS.includes(e.kind))throw Error("Quick action kind is invalid");let r=e.resourceKind.trim().toUpperCase(),i=e.repositoryId?.trim()||null;return(await t.workflow.findMany({where:{enabled:!0,archivedAt:null,activeVersionId:{not:null},quickActionKind:e.kind,OR:[{quickActionRepositories:{none:{}}},{quickActionRepositories:{some:{repositoryId:i??""}}}]},include:{activeVersion:!0},orderBy:[{name:"asc"},{id:"asc"}]})).filter(e=>!!e.activeVersion&&(0,ii.parseWorkflowDefinition)(n4(e.activeVersion.definitionJson)).triggers.some(e=>(0,ia.isResourceTriggerKind)(e.kind)&&(0,ii.workflowResourceKind)(e.config)===r))}async recordEvent(e){return this.events.record(e)}async hydrateResourceSessionData(e,t,r){let i=e?.toUpperCase()??null,a=await (0,tY.getPrismaClient)(),n={},s=null;if("CODEBASE"===i&&t){let e=await a.codebase.findUnique({where:{id:t},select:{id:!0,folder:!0,agentId:!0,branch:!0,headSha:!0,defaultBranch:!0,agent:{select:{id:!0,name:!0,hostname:!0,lastSeenAt:!0,disconnectedAt:!0,heartbeatIntervalSeconds:!0,diskFreeBytes:!0,memoryFreeBytes:!0}},repository:{select:{id:!0,name:!0,canonicalOrigin:!0,displayOrigin:!0}}}});e&&(n=n8(e))}if("BUILD"===i&&t){let e=await a.build.findUnique({where:{id:t},select:{id:!0,status:!0,action:!0,error:!0,artifactDirectory:!0,worktreeId:!0,agent:{select:{id:!0,name:!0,hostname:!0,lastSeenAt:!0,disconnectedAt:!0,heartbeatIntervalSeconds:!0,diskFreeBytes:!0,memoryFreeBytes:!0}},codebase:{select:{id:!0,folder:!0,agentId:!0,branch:!0,headSha:!0,defaultBranch:!0,agent:{select:{id:!0,name:!0,hostname:!0,lastSeenAt:!0,disconnectedAt:!0,heartbeatIntervalSeconds:!0,diskFreeBytes:!0,memoryFreeBytes:!0}},repository:{select:{id:!0,name:!0,canonicalOrigin:!0,displayOrigin:!0}}}},artifacts:{select:{id:!0,kind:!0,relativePath:!0,sizeBytes:!0,checksum:!0}},reports:{where:{status:"READY"},select:{kind:!0,summaryJson:!0}}}});if(e){s=e.worktreeId;let t=t=>{let r=e.reports.find(e=>e.kind===t);if(r)try{return(0,nn.workflowSessionData)(r.summaryJson)}catch{return}},r=t("TEST_RESULTS"),i=t("CODE_COVERAGE");n=(0,nn.mergeSessionData)(e.codebase?n8(e.codebase):e.agent?n6(e.agent):{},{build:{id:e.id,status:e.status,action:e.action,error:e.error,artifactDirectory:e.artifactDirectory,artifacts:e.artifacts,...r?{testSummary:r}:{},...i?{coverageSummary:i}:{}}})}}if("AGENT_RUN"===i&&t){let e=await a.agentRun.findUnique({where:{id:t},select:{id:!0,kind:!0,status:!0,phase:!0,origin:!0,provider:!0,model:!0,branch:!0,finalOutput:!0,error:!0,jiraIssueKey:!0,worktreeId:!0,agent:{select:{id:!0,name:!0,hostname:!0,disconnectedAt:!0,diskFreeBytes:!0,memoryFreeBytes:!0}},inputTokens:!0,outputTokens:!0,reasoningTokens:!0,cacheReadTokens:!0,cacheWriteTokens:!0,toolCallCount:!0,estimatedCost:!0}});e&&(s=e.worktreeId,n=(0,nn.mergeSessionData)(e.agent?n6(e.agent):{},{run:{id:e.id,kind:e.kind,status:e.status,phase:e.phase,origin:e.origin,provider:e.provider,model:e.model,branch:e.branch,finalOutput:e.finalOutput,error:e.error,usage:{inputTokens:e.inputTokens,outputTokens:e.outputTokens,reasoningTokens:e.reasoningTokens,cacheReadTokens:e.cacheReadTokens,cacheWriteTokens:e.cacheWriteTokens,toolCallCount:e.toolCallCount,estimatedCost:e.estimatedCost}},...e.jiraIssueKey?{ticket:{key:e.jiraIssueKey}}:{}}))}if("PULL_REQUEST"===i&&t&&this.githubService){let e=/^([^/]+)\/([^#]+)#([1-9]\d*)$/.exec(t);if(e)try{let t=await this.githubService.pullRequest(e[1],e[2],Number(e[3]));t&&(s=t.worktreeId,n=(0,nn.mergeSessionData)(n,{repo:{id:t.codebaseRepositoryId,githubId:t.repositoryGithubId,name:t.repositoryNameWithOwner.split("/").at(-1),displayOrigin:t.repositoryNameWithOwner,url:t.repositoryUrl},pr:{...t,headBranch:t.headRefName,baseBranch:t.baseRefName,unresolvedThreads:t.reviewThreads.filter(({isResolved:e})=>!e)},...t.jiraKey?{ticket:{key:t.jiraKey}}:{}}))}catch{}}if("JIRA_TICKET"===i&&t&&this.jiraService)try{let e=await this.jiraService.ticket(t),r=e.comments.at(-1)??null;n=(0,nn.mergeSessionData)(n,{ticket:{...e,title:e.summary,type:e.issueType,url:e.jiraUrl},...r?{comment:{id:r.id,body:r.content?.rawText??"",author:r.author}}:{}})}catch{}let o=(0,nn.getSessionValue)(r,"worktree.id"),l="WORKTREE"===i?t:"GITHUB_PIPELINE"===i||"GITHUB_JOB"===i?"string"==typeof o?o:null:s;if(l&&this.worktrees)if(this.worktrees.workflowSessionDataForWorktree)n=(0,nn.mergeSessionData)(await this.worktrees.workflowSessionDataForWorktree(l),n);else{let e=await this.worktrees.ticketKeyForWorktree(l);e&&(n=(0,nn.mergeSessionData)({ticket:{key:e}},n))}let c=(0,nn.getSessionValue)(r,"pipeline.pullRequests");!(0,nn.getSessionValue)(n,"pr")&&!(0,nn.getSessionValue)(r,"pr")&&Array.isArray(c)&&c[0]&&"object"==typeof c[0]&&!Array.isArray(c[0])&&(n=(0,nn.mergeSessionData)(n,{pr:c[0]}));let u=(0,nn.getSessionValue)(r,"pr.jiraKey")??(0,nn.getSessionValue)(r,"pipeline.jiraKey");return"string"!=typeof(0,nn.getSessionValue)(n,"ticket.key")&&"string"==typeof u&&u.trim()&&(n=(0,nn.mergeSessionData)(n,{ticket:{key:u}})),(0,nn.mergeSessionData)(n,r)}async trigger(e){let t=await (0,tY.getPrismaClient)(),r=await t.workflow.findUnique({where:{id:e.workflowId},include:{activeVersion:{include:{triggers:!0}}}});if(!r?.activeVersion)throw Error("Published workflow not found");if(!r.enabled||r.archivedAt)throw Error("Workflow is paused");let i=e.resourceKind?.toUpperCase()??null,a=e.choice?.trim()||null,{triggers:n}=r.activeVersion,s=i?"RESOURCE_MANUAL":"MANUAL",o=i?"RESOURCE_MANUAL_CHOICE":"MANUAL_CHOICE",l=e=>n.find(t=>t.kind===e&&(!i||(0,ii.workflowResourceKind)(sr(n4(t.configJson),"Trigger configuration"))===i))??null,c=l(o),u=l(s),d=a?c:u;if(a&&!c)throw Error(i?`No resource trigger offers choices for ${i} resources`:"This workflow has no manual trigger with choices");if(!a&&!u&&c){let e=(0,ii.workflowTriggerChoices)(sr(n4(c.configJson),"Trigger configuration"));throw Error(`This workflow needs a choice: ${e.map(({key:e})=>e).join(", ")}`)}if(i&&!d)throw Error(`No resource trigger accepts ${e.resourceKind} resources`);if(a&&c&&!(0,ii.workflowTriggerChoices)(sr(n4(c.configJson),"Trigger configuration")).some(({key:e})=>e===a))throw Error(`Unknown choice ${a}`);let p=e.subjectKey?.trim()||(i&&e.resourceId?`${i}:${e.resourceId}`:`manual:${(0,g.randomUUID)()}`),h={sessionData:await this.hydrateResourceSessionData(e.resourceKind,e.resourceId,e.sessionData??{}),resourceKind:e.resourceKind??null,resourceId:e.resourceId??null,choice:a,manual:!0},m=await this.createRunForTrigger(r,r.activeVersion,d,null,a?o:s,p,h,`manual:${r.id}:${(0,g.randomUUID)()}`);return sa(m.id),this.run(m.id)}async createRunForTrigger(e,t,r,i,a,n,s,o,l=null){return(await (0,tY.getPrismaClient)()).$transaction(async c=>{let u=await c.workflowRun.findUnique({where:{idempotencyKey:o}});if(u)return u;if("COALESCE_LATEST"===e.overlapPolicy){let t=await c.workflowRun.findFirst({where:{workflowId:e.id,triggerSubjectKey:n,status:"QUEUED"},orderBy:{queuedAt:"desc"}});if(t)return c.workflowRun.update({where:{id:t.id},data:{triggerId:r?.id??null,triggerEventId:i,triggerKind:a,triggerPayloadJson:JSON.stringify(s),queuedAt:new Date}})}let d=(0,g.randomUUID)(),p=sr(s.sessionData??{},"Session data"),h=JSON.stringify((0,nn.mergeSessionData)({workflow:{id:e.id,name:t.name,runId:d,startedAt:null,trigger:{id:r?.nodeId??null,kind:a,subjectKey:n,choice:"string"==typeof s.choice?s.choice:null}},steps:{}},p));st(h,"Workflow session data",2097152);let m=await c.workflowRun.create({data:{id:d,displayNumber:await so(c),workflowId:e.id,versionId:t.id,triggerId:r?.id??null,triggerEventId:i,parentRunId:l,idempotencyKey:o,triggerKind:a,triggerSubjectKey:n,triggerPayloadJson:JSON.stringify(s),sessionDataJson:h}}),f=function(e,t){let r=e.trim().toUpperCase(),i=a8(t.sessionData);if((0,ia.isResourceTriggerKind)(r)){let e=t.resourceKind,r="string"==typeof e?e.toUpperCase():null,a="GITHUB_JOB"===r?a5(i,"job","url"):"GITHUB_PIPELINE"===r?a5(i,"pipeline","url"):null;return"string"==typeof e?a9(e.toUpperCase(),t.resourceId,{url:"string"==typeof a?a:null,metadata:"AGENT_RUN"===e.toUpperCase()?{runKind:a5(i,"run","kind")}:null}):null}if(a7.has(r))return a9("JIRA_TICKET",a5(i,"ticket","key"));if(ne.has(r))return a9("AGENT_RUN",a5(i,"run","id"),{metadata:{runKind:a5(i,"run","kind")}});if(nt.has(r))return a9("BUILD",a5(i,"build","id"));if(nr.has(r))return a9("WORKTREE",a5(i,"worktree","id"));if("CODEBASE_REMOTE_BRANCH"===r)return a9("CODEBASE",a5(i,"codebase","id"));if("AGENT_JOB_FAILED"===r)return a9("AGENT_JOB",a5(a8(i.steps),"trigger","id"));if("AGENT_CONNECTION"===r||"AGENT_DISK_REPORT"===r||"AGENT_DISK_THRESHOLD"===r||"AGENT_DISK_STATE_CHANGED"===r||"AGENT_DISK_CLEANUP_RESULT"===r||"CCUSAGE_THRESHOLD"===r)return a9("AGENT",a5(i,"agent","id")??a5(i,"codebase","agentId"));if("WORKFLOW_FINISHED"===r)return a9("WORKFLOW_RUN",a5(t,"run","id"));if(ni.has(r)){let e=function(e){if("string"!=typeof e)return null;let t=e.trim(),r=t.match(/(?:https?:\/\/|ssh:\/\/git@|git@)?github\.com[/:]([^/]+)\/([^/#]+?)(?:\.git)?$/i)??t.match(/^([^/:]+)\/([^/#]+?)(?:\.git)?$/);return r?.[1]&&r[2]?{owner:r[1],repository:r[2]}:null}(a5(i,"repo","displayOrigin")),t=Number(a5(i,"pr","number"));return e&&Number.isInteger(t)&&t>0?a9("PULL_REQUEST",a6(e.owner,e.repository,t)):null}if(na.has(r)){let e=a5(i,"pipeline","url");return a9("GITHUB_WORKFLOW_RUN",a5(i,"pipeline","runId"),{url:"string"==typeof e?e:null})}return"GITHUB_PUSH_DEFAULT"===r?a9("CODEBASE_REPOSITORY",a5(i,"repo","id")):null}(a,s);return f&&await c.workflowRunResourceLink.create({data:{id:(0,g.randomUUID)(),runId:m.id,kind:f.kind.toUpperCase(),resourceId:f.resourceId,label:f.label??null,url:f.url??null,metadataJson:f.metadata?JSON.stringify(f.metadata):null}}),m})}async processTriggerEvents(){let e=await (0,tY.getPrismaClient)();for(let t of(await e.workflowTriggerEvent.findMany({where:{status:"PENDING"},orderBy:{receivedAt:"asc"},take:50})))try{let r=sr(n4(t.payloadJson),"Trigger payload");for(let i of(await e.workflow.findMany({where:{enabled:!0,archivedAt:null,activeVersionId:{not:null}},include:{activeVersion:{include:{triggers:!0}}}})))if(i.activeVersion)for(let e of i.activeVersion.triggers.filter(({kind:e})=>e===t.kind)){if(!await this.triggerMatches(e,t.subjectKey,r)||r.workflowCorrelation&&"object"==typeof r.workflowCorrelation&&r.workflowCorrelation.workflowId===i.id)continue;let a=await this.createRunForTrigger({...i,activeVersion:i.activeVersion},i.activeVersion,e,t.id,t.kind,t.subjectKey,r,`${t.id}:${i.id}:${e.id}`);sa(a.id)}await e.workflowTriggerEvent.update({where:{id:t.id},data:{status:"PROCESSED",processedAt:new Date,error:null}})}catch(r){await e.workflowTriggerEvent.update({where:{id:t.id},data:{status:"FAILED",processedAt:new Date,error:r instanceof Error?r.message:String(r)}})}}async triggerMatches(e,t,r){let i=(0,nn.resolveWorkflowValue)(sr(n4(e.configJson),"Trigger configuration"),r),a=null;if(void 0!==r.cursorValue&&("string"!=typeof i.thresholdPath||"string"!=typeof i.thresholdOperator)){let i=await (0,tY.getPrismaClient)(),n=await i.workflowTriggerState.findUnique({where:{triggerId_subjectKey:{triggerId:e.id,subjectKey:t}}});a=se(n?.cursorJson?sr(n4(n.cursorJson),"Trigger cursor").value:void 0)!==se(r.cursorValue),await i.workflowTriggerState.upsert({where:{triggerId_subjectKey:{triggerId:e.id,subjectKey:t}},create:{id:(0,g.randomUUID)(),triggerId:e.id,subjectKey:t,cursorJson:JSON.stringify({value:r.cursorValue}),lastMatched:a,...a?{lastFiredAt:new Date}:{}},update:{cursorJson:JSON.stringify({value:r.cursorValue}),lastMatched:a,...a?{lastFiredAt:new Date}:{}}})}if("GITHUB_ISSUE_COMMAND"===e.kind){let e=(0,nn.getSessionValue)(r,"comment.author.login"),t=(0,nn.getSessionValue)(r,"comment.body"),a=Array.isArray(i.allowedLogins)?i.allowedLogins:[];if("string"!=typeof e||!a.includes(e)||"string"!=typeof t||"string"!=typeof i.commandPattern||!new RegExp(i.commandPattern).test(t))return!1}if("WORKTREE_CONFLICT"===e.kind&&!0!==(0,nn.getSessionValue)(r,"worktree.conflicted")||"WORKTREE_MISSING"===e.kind&&null==(0,nn.getSessionValue)(r,"worktree.missingAt")||"WORKTREE_DIVERGED"===e.kind&&"DIVERGED"!==(0,nn.getSessionValue)(r,"worktree.pushStatus"))return!1;if(i.filters&&"object"==typeof i.filters)for(let[e,t]of Object.entries(i.filters)){let i=(0,nn.getSessionValue)(r,e);if(Array.isArray(t)){if(!t.some(e=>se(e)===se(i)))return!1}else if(se(t)!==se(i))return!1}if("string"==typeof i.thresholdPath&&"string"==typeof i.thresholdOperator){let a={op:i.thresholdOperator,left:{source:"SESSION",path:i.thresholdPath},right:i.thresholdValue},n=(0,nn.evaluateWorkflowCondition)(a,r),s=await (0,tY.getPrismaClient)(),o=await s.workflowTriggerState.findUnique({where:{triggerId_subjectKey:{triggerId:e.id,subjectKey:t}}});return await s.workflowTriggerState.upsert({where:{triggerId_subjectKey:{triggerId:e.id,subjectKey:t}},create:{id:(0,g.randomUUID)(),triggerId:e.id,subjectKey:t,lastMatched:n,cursorJson:JSON.stringify({value:(0,nn.getSessionValue)(r,i.thresholdPath)}),...n?{lastFiredAt:new Date}:{}},update:{lastMatched:n,cursorJson:JSON.stringify({value:(0,nn.getSessionValue)(r,i.thresholdPath)}),...n&&!o?.lastMatched?{lastFiredAt:new Date}:{}}}),n&&!o?.lastMatched}return a??!0}async processSchedules(){let e=await (0,tY.getPrismaClient)(),t=await e.workflow.findMany({where:{enabled:!0,archivedAt:null,activeVersionId:{not:null}},include:{activeVersion:{include:{triggers:{where:{kind:"SCHEDULE"},include:{states:!0}}}}}}),r=new Date;for(let i of t)for(let t of i.activeVersion?.triggers??[]){let a=sr(n4(t.configJson),"Schedule configuration"),n=Number(a.cadenceSeconds);if(!Number.isInteger(n)||n<1)continue;let s=i.id,o=t.states.find(e=>e.subjectKey===s);if(!o){let i="string"==typeof a.firstRunAt?new Date(a.firstRunAt):null,l=i&&Number.isFinite(i.getTime())?i:new Date(r.getTime()+1e3*n);o=await e.workflowTriggerState.create({data:{id:(0,g.randomUUID)(),triggerId:t.id,subjectKey:s,nextScheduledAt:l}})}if(!o.nextScheduledAt||o.nextScheduledAt>r)continue;let l=o.nextScheduledAt,c=new Date(Math.max(r.getTime(),l.getTime())+1e3*n);await e.workflowTriggerState.update({where:{id:o.id},data:{lastFiredAt:r,nextScheduledAt:c}}),await this.events.record({kind:"SCHEDULE",subjectKey:s,dedupeKey:`schedule:${t.id}:${l.toISOString()}`,payload:{sessionData:{},scheduledFor:l.toISOString(),cadenceSeconds:n}})}}async lifecycle(e,t){let r=await (0,tY.getPrismaClient)(),i=await r.workflowRun.findUnique({where:{id:e}});if(!i)throw Error("Workflow run not found");if("PAUSE"===t){if(!new Set(["RUNNING","WAITING","BLOCKED"]).has(i.status))throw Error("Only an active workflow run can be paused");if(!await r.$transaction(async t=>!!(await t.workflowRun.updateMany({where:{id:e,status:{in:["RUNNING","WAITING","BLOCKED"]}},data:{status:"PAUSING",phase:"DRAINING"}})).count&&(await t.workflowStepAttempt.updateMany({where:{runId:e,status:"READY"},data:{status:"PENDING",phase:"PAUSED_PENDING"}}),!0)))return this.run(e);await this.controlLinkedAgentRuns(e,"PAUSE"),await this.appendEvent(e,null,"RUN_PAUSING","Workflow pause requested")}else if("RESUME"===t){if("PAUSED"!==i.status)throw Error("Only a paused workflow run can be resumed");if(!(await r.workflowRun.updateMany({where:{id:e,status:"PAUSED"},data:{status:"RUNNING",phase:"SCHEDULING",pausedAt:null}})).count)return this.run(e);await this.controlLinkedAgentRuns(e,"CONTINUE"),await this.appendEvent(e,null,"RUN_RESUMED","Workflow resumed")}else{if(n1.has(i.status))return this.run(e);for(let[t,i]of(await this.controlLinkedAgentRuns(e,"CANCEL"),await this.cancelWaitingCommandRuns(e),this.activeExecutions)){let a=await r.workflowStepAttempt.findUnique({where:{id:t},select:{runId:!0}});a?.runId===e&&i.abort()}if(!await r.$transaction(async t=>!!(await t.workflowRun.updateMany({where:{id:e,status:{notIn:[...n1]}},data:{status:"CANCELLED",phase:"CANCELLED",finishedAt:new Date}})).count&&(await t.workflowStepAttempt.updateMany({where:{runId:e,status:{notIn:[...n2]}},data:{status:"CANCELLED",phase:"CANCELLED",finishedAt:new Date,claimOwner:null,claimExpiresAt:null}}),await t.workflowWait.updateMany({where:{runId:e,status:"PENDING"},data:{status:"CANCELLED",resolvedAt:new Date}}),await t.workflowResourceLease.deleteMany({where:{runId:e}}),!0)))return this.run(e);await this.appendEvent(e,null,"RUN_CANCELLED","Workflow cancelled")}return sa(e),this.run(e)}async repairRunData(e,t){let r=sr(t,"Session data patch"),i=await (0,tY.getPrismaClient)(),a=await i.workflowRun.findUnique({where:{id:e}});if(!a)throw Error("Workflow run not found");if(!new Set(["BLOCKED","PAUSED"]).has(a.status))throw Error("Only blocked or paused workflows accept repair data");let n=(0,nn.workflowSessionData)(a.sessionDataJson),s=(0,nn.getSessionValue)(n,"workflow"),o=(0,nn.mergeSessionData)(n,r);s&&"object"==typeof s&&(o=(0,nn.setSessionValue)(o,"workflow",s));let l=JSON.stringify(o);return st(l,"Workflow session data",2097152),await i.$transaction([i.workflowRun.update({where:{id:e},data:{sessionDataJson:l,sessionRevision:{increment:1},status:"PAUSED"===a.status?"PAUSED":"RUNNING",phase:"PAUSED"===a.status?"PAUSED":"SCHEDULING",blockedReason:null}}),i.workflowStepAttempt.updateMany({where:{runId:e,status:"BLOCKED"},data:{status:"PENDING",phase:"PENDING",error:null}})]),await this.appendEvent(e,null,"RUN_DATA_REPAIRED","Workflow session data repaired"),sa(e),this.run(e)}async answerQuestion(e,t){let r=await (0,tY.getPrismaClient)(),i=await r.$transaction(async r=>{let i=await r.runQuestionBatch.findUnique({where:{id:e},include:{workflowStepAttempt:!0,answerRevisions:!0}}),a=i?.workflowStepAttempt;if(!i||!a)throw Error("Workflow question not found");if("PENDING"!==i.status)throw Error("Question was already answered");return await r.runAnswerRevision.create({data:{id:(0,g.randomUUID)(),batchId:e,revision:i.answerRevisions.length,answersJson:JSON.stringify(t)}}),await r.runQuestionBatch.update({where:{id:e},data:{status:"ANSWERED",answeredAt:new Date}}),await r.workflowWait.updateMany({where:{attemptId:a.id,status:"PENDING",kind:"HUMAN"},data:{status:"RESOLVED",resultJson:JSON.stringify({answers:t}),resolvedAt:new Date}}),a});return await this.completeWaitingAttempt(i.id,{answers:t}),rQ.agentEventBus.publish(nX(i.runId),{workflowQuestionChanged:{id:e,runId:i.runId}}),this.run(i.runId)}async tick(){if(!this.ticking){this.ticking=!0;try{await this.recoverExpiredClaims(),await this.processSchedules(),await this.processTriggerEvents(),await this.resolveDueWaits(),await this.startQueuedRuns();let e=await (0,tY.getPrismaClient)();for(let{id:t}of(await e.workflowRun.findMany({where:{status:{in:["RUNNING","WAITING","PAUSING"]}},select:{id:!0},orderBy:{updatedAt:"asc"},take:100})))await this.progressRun(t);await this.dispatchReadyAttempts()}finally{this.ticking=!1}}}async recoverExpiredClaims(){let e=await (0,tY.getPrismaClient)();for(let t of(await e.workflowStepAttempt.findMany({where:{status:"RUNNING",claimExpiresAt:{lt:new Date}},include:{run:!0},take:100})))await e.$transaction([e.workflowStepAttempt.update({where:{id:t.id},data:{status:"BLOCKED",phase:"RECOVERY_BLOCKED",error:"The workflow worker stopped while this step was running; verify external state before retrying.",claimOwner:null,claimExpiresAt:null}}),e.workflowRun.update({where:{id:t.runId},data:{status:"BLOCKED",phase:"RECOVERY_BLOCKED",blockedReason:`Step ${t.nodeId} needs recovery review`}}),e.workflowResourceLease.deleteMany({where:{attemptId:t.id}})]),await this.appendEvent(t.runId,t.id,"STEP_RECOVERY_BLOCKED","Step needs recovery review after its worker lease expired"),await this.notifyRun(t.runId,"WORKFLOW_RECOVERY_PAUSED","Workflow paused during recovery","An interrupted step requires external-state verification before replay.",`recovery:${t.id}`),sa(t.runId)}async startQueuedRuns(){let e=await (0,tY.getPrismaClient)();for(let t of(await e.workflowRun.findMany({where:{status:"QUEUED"},include:{workflow:!0,version:!0},orderBy:{queuedAt:"asc"},take:50}))){let r="CONCURRENT"===t.workflow.overlapPolicy?t.workflow.maxConcurrentRuns:1;if(await e.workflowRun.count({where:{workflowId:t.workflowId,id:{not:t.id},status:{in:n0.filter(e=>"QUEUED"!==e)}}})>=r)continue;let i=(0,ii.parseWorkflowDefinition)(n4(t.version.definitionJson)),a=new Date,n=(0,nn.setSessionValue)((0,nn.workflowSessionData)(t.sessionDataJson),"workflow.startedAt",a.toISOString());await e.$transaction(async e=>!!(await e.workflowRun.updateMany({where:{id:t.id,status:"QUEUED"},data:{status:"RUNNING",phase:"SCHEDULING",startedAt:a,sessionDataJson:JSON.stringify(n),sessionRevision:{increment:1}}})).count&&(await e.workflowStepAttempt.createMany({data:i.nodes.map(e=>({id:(0,g.randomUUID)(),runId:t.id,nodeId:e.id,kind:e.kind,generation:t.generation,iterationKey:"",attempt:0,requiredPathsJson:JSON.stringify(sn(e)),providedPathsJson:JSON.stringify(ss(e)),idempotencyKey:`${t.id}:${e.id}:${t.generation}::0`}))}),!0))&&(await this.appendEvent(t.id,null,"RUN_STARTED","Workflow started"),sa(t.id))}}selectedTrigger(e,t){let r=e.trigger?.nodeId??t.triggers.find(({kind:t})=>t===e.triggerKind)?.id??null;if(!(0,ia.isChoiceTriggerKind)(e.triggerKind))return{id:r,choice:null};let i=sr(n4(e.triggerPayloadJson),"Trigger payload");return{id:r,choice:"string"==typeof i.choice?i.choice:null}}attemptOutput(e){if(!e.outputJson)return{};let t=n4(e.outputJson);return t&&"object"==typeof t&&!Array.isArray(t)?t:{value:t}}edgeState(e,t,r,i){if(!i.has(e.source))return e.source!==t.id||t.choice&&e.sourceHandle!==t.choice?"INACTIVE":"ACTIVE";let a=r.get(e.source);if(!a||!n2.has(a.status))return"PENDING";if(new Set(["SKIPPED","CANCELLED","SUPERSEDED"]).has(a.status))return"INACTIVE";let n=i.get(e.source);if("FAILED"===a.status)return"failure"===e.sourceHandle||"catch"===e.sourceHandle||"CONTINUE"===n.failurePolicy&&"success"===e.sourceHandle?"ACTIVE":"INACTIVE";let s=this.attemptOutput(a).selectedHandles;return s?.length?s.includes(e.sourceHandle)?"ACTIVE":"INACTIVE":"success"===e.sourceHandle||"output"===e.sourceHandle?"ACTIVE":"INACTIVE"}async progressRun(e){let t=await (0,tY.getPrismaClient)(),r=await t.workflowRun.findUnique({where:{id:e},include:{version:!0,trigger:!0,attempts:!0,waits:!0}});if(!r||n1.has(r.status))return;if("PAUSING"===r.status){await t.workflowStepAttempt.updateMany({where:{runId:e,status:"READY"},data:{status:"PENDING",phase:"PAUSED_PENDING"}});let i=new Set(["AGENT_JOB","BUILD","SKILL_RUN","WORKTREE_MOVE","GITHUB_CHECKS"]),a=new Set(r.waits.filter(({status:e,kind:t})=>"PENDING"===e&&i.has(t)).map(({attemptId:e})=>e));!r.attempts.some(({id:e,status:t})=>"RUNNING"===t||"WAITING"===t&&a.has(e))&&(await t.workflowRun.updateMany({where:{id:e,status:"PAUSING"},data:{status:"PAUSED",phase:"PAUSED",pausedAt:new Date}})).count&&(await this.appendEvent(e,null,"RUN_PAUSED","Workflow paused"),sa(e));return}if(!new Set(["RUNNING","WAITING"]).has(r.status))return;let i=(0,ii.parseWorkflowDefinition)(n4(r.version.definitionJson)),a=new Map(i.nodes.map(e=>[e.id,e])),n=new Map;for(let e of i.edges)n.set(e.target,[...n.get(e.target)??[],e]);let s=!0;for(;s;){if(s=!1,!(r=await t.workflowRun.findUnique({where:{id:e},include:{version:!0,trigger:!0,attempts:!0,waits:!0}})))return;let o=r.attempts.filter(({generation:e,supersededAt:t})=>e===r.generation&&!t),l=new Map;for(let e of o){let t=`${e.nodeId}:${e.iterationKey}`,r=l.get(t);(!r||r.attempt<e.attempt)&&l.set(t,e)}let c=new Map([...l.values()].filter(({iterationKey:e})=>!e).map(e=>[e.nodeId,e])),u=this.selectedTrigger(r,i);for(let e of i.nodes){let r=c.get(e.id);if(!r||"PENDING"!==r.status)continue;let o=i.nodes.find(t=>"CONTROL_FOR_EACH"===t.kind&&t.config.joinNodeId===e.id);if(o){let e=c.get(o.id);if(!e||!n2.has(e.status)||[...l.values()].filter(({iterationKey:e})=>!!e).some(({status:e})=>!n2.has(e)))continue;await t.workflowStepAttempt.update({where:{id:r.id},data:{status:"READY",phase:"ITERATIONS_JOINED"}}),s=!0;continue}let d=n.get(e.id)??[];if(!d.length)continue;let p=d.map(e=>this.edgeState(e,u,c,a)),h=p.filter(e=>"ACTIVE"===e).length,m=p.filter(e=>"PENDING"===e).length;("ANY"==("CONTROL_JOIN"===e.kind&&"ANY"===e.config.mode?"ANY":"ALL")?h>0:0===m&&h>0)?(await t.workflowStepAttempt.update({where:{id:r.id},data:{status:"READY",phase:"READY"}}),s=!0):0===m&&0===h&&(await t.workflowStepAttempt.update({where:{id:r.id},data:{status:"SKIPPED",phase:"INACTIVE_BRANCH",finishedAt:new Date}}),s=!0)}await this.progressIterationAttempts(i,r,u,a,n,l,c)&&(s=!0)}if(!(r=await t.workflowRun.findUnique({where:{id:e},include:{version:!0,trigger:!0,attempts:!0,waits:!0}})))return;let o=new Map;for(let e of r.attempts.filter(({generation:e,supersededAt:t})=>e===r.generation&&!t)){let t=`${e.nodeId}:${e.iterationKey}`,r=o.get(t);(!r||r.attempt<e.attempt)&&o.set(t,e)}let l=[...o.values()],c=r.waits.some(({status:e})=>"PENDING"===e),u=l.some(({status:e})=>!n2.has(e));if(c||u){let i=c?"WAITING":"RUNNING";r.status!==i&&(await t.workflowRun.updateMany({where:{id:e,status:{in:[...n3]}},data:{status:i,phase:c?"WAITING":"SCHEDULING"}})).count&&sa(e);return}let d=(0,ii.parseWorkflowDefinition)(n4(r.version.definitionJson)),p=l.find(e=>{if("FAILED"!==e.status)return!1;let t=d.nodes.find(({id:t})=>t===e.nodeId);return!!t&&"CONTINUE"!==t.failurePolicy&&!d.edges.some(e=>e.source===t.id&&new Set(["failure","catch"]).has(e.sourceHandle))});await this.finishRun(r,p?"FAILED":"SUCCEEDED",p?.error??null)}async finishRun(e,t,r){let i=await (0,tY.getPrismaClient)();await i.$transaction(async i=>!!(await i.workflowRun.updateMany({where:{id:e.id,status:{in:[...n3]}},data:{status:t,phase:t,error:r,finishedAt:new Date}})).count&&(await i.workflowResourceLease.deleteMany({where:{runId:e.id}}),!0))&&(await this.appendEvent(e.id,null,`RUN_${t}`,"SUCCEEDED"===t?"Workflow completed":"Workflow failed",r?{error:r}:null),await this.resolveExternalWait("WORKFLOW_RUN",e.id,{status:t,runId:e.id},"FAILED"===t?r||"Sub-workflow failed":null),await this.events.record({kind:"WORKFLOW_FINISHED",subjectKey:e.workflowId,dedupeKey:`workflow-finished:${e.id}`,payload:{sessionData:(0,nn.workflowSessionData)(e.sessionDataJson),run:{id:e.id,status:t},workflowCorrelation:{workflowId:e.workflowId,runId:e.id}}}),await this.notifyRun(e.id,"SUCCEEDED"===t?"WORKFLOW_COMPLETED":"WORKFLOW_FAILED","SUCCEEDED"===t?"Workflow completed":"Workflow failed",r||`Workflow run ${e.displayNumber} ${t.toLowerCase()}`,t.toLowerCase()),sa(e.id))}async dispatchReadyAttempts(){let e=await (0,tY.getPrismaClient)(),t=Math.max(0,4-await e.workflowStepAttempt.count({where:{status:"RUNNING"}}));if(t)for(let r of(await e.workflowStepAttempt.findMany({where:{status:"READY",run:{status:"RUNNING"}},orderBy:{createdAt:"asc"},take:2*t}))){if(t<=0)break;if(!(await e.workflowStepAttempt.updateMany({where:{id:r.id,status:"READY",run:{status:"RUNNING"}},data:{status:"RUNNING",phase:"RUNNING",claimOwner:this.workerId,claimExpiresAt:new Date(Date.now()+3e5),startedAt:r.startedAt??new Date}})).count)continue;t-=1;let i=new AbortController;this.activeExecutions.set(r.id,i),this.executeAttempt(r.id,i.signal).catch(e=>{console.error(`Workflow attempt ${r.id} failed unexpectedly:`,e)}).finally(()=>{this.activeExecutions.delete(r.id)})}}async acquireResourceLease(e,t,r){let i=ii.WORKFLOW_STEP_BY_KIND.get(t.kind),a=null;if(i.mutatesWorktree){let e=(0,nn.getSessionValue)(r,"worktree.id")??(0,nn.getSessionValue)(r,"worktree.path")??(0,nn.getSessionValue)(r,"codebase.id");e&&(a=`git:${String(e)}`)}else if(t.kind.startsWith("BUILD_")){let e=(0,nn.getSessionValue)(r,"build.id");e&&(a=`build:${String(e)}`)}if(!a)return!0;let n=await (0,tY.getPrismaClient)();await n.workflowResourceLease.deleteMany({where:{key:a,expiresAt:{lt:new Date}}});try{return await n.workflowResourceLease.create({data:{key:a,runId:e.runId,attemptId:e.id,expiresAt:new Date(Date.now()+3e5)}}),await n.workflowStepAttempt.update({where:{id:e.id},data:{resourceLockKey:a}}),!0}catch{return await n.workflowStepAttempt.update({where:{id:e.id},data:{status:"READY",phase:"WAITING_FOR_RESOURCE",claimOwner:null,claimExpiresAt:null}}),!1}}async executeAttempt(e,t){let r=await (0,tY.getPrismaClient)(),i=await r.workflowStepAttempt.findUnique({where:{id:e},include:{run:{include:{version:!0}}}});if(!i||"RUNNING"!==i.status)return;let a=(0,ii.parseWorkflowDefinition)(n4(i.run.version.definitionJson)),n=a.nodes.find(({id:e})=>e===i.nodeId);if(!n)return void await this.failAttempt(i,null,Error("Workflow step definition is missing"));let s=(0,nn.workflowSessionData)(i.run.sessionDataJson);i.iterationKey&&(s=await this.iterationSessionData(i.run,i,s));let o=sn(n).filter(e=>!(0,nn.hasSessionValue)(s,e));if(o.length){await r.$transaction([r.workflowStepAttempt.update({where:{id:i.id},data:{status:"BLOCKED",phase:"MISSING_REQUIREMENTS",error:`Missing required session data: ${o.join(", ")}`,claimOwner:null,claimExpiresAt:null}}),r.workflowRun.update({where:{id:i.runId},data:{status:"BLOCKED",phase:"MISSING_REQUIREMENTS",blockedReason:`Step ${n.name??n.id} needs ${o.join(", ")}`}}),r.workflowResourceLease.deleteMany({where:{attemptId:e}})]),await this.appendEvent(i.runId,i.id,"STEP_BLOCKED",`Step blocked by missing requirements: ${o.join(", ")}`),await this.notifyRun(i.runId,"WORKFLOW_NEEDS_ATTENTION","Workflow needs data",`Step ${n.name??n.id} needs ${o.join(", ")}`,`blocked:${i.id}`),sa(i.runId);return}if(await r.workflowStepAttempt.update({where:{id:i.id},data:{inputJson:JSON.stringify(s)}}),await this.acquireResourceLease(i,n,s))try{let e,r={...n,config:(0,nn.resolveWorkflowValue)(n.config,s)};if(e=n.kind.startsWith("CONTROL_")||"HUMAN_CONFIRM"===n.kind||"HUMAN_CHOICE"===n.kind?await this.executeControl(i.run,i,r,s,a):await this.executor.execute({run:i.run,attempt:i,node:r,sessionData:s,signal:t}),t.aborted)throw Error("Workflow step was cancelled");e.wait?await this.parkAttempt(i,e):await this.completeAttempt(i,n,e)}catch(t){let e=t instanceof Error?t:Error(String(t));if(await this.holdForBusyCodebase(i,e))return;await this.failAttempt(i,n,e)}}async holdForBusyCodebase(e,t){if(!(0,nV.isCodebaseBusyError)(t))return!1;let r=e.startedAt??e.createdAt;if(Date.now()-r.getTime()>6e5)return!1;let i=await (0,tY.getPrismaClient)();return!!(await i.workflowStepAttempt.updateMany({where:{id:e.id,status:"RUNNING",claimOwner:this.workerId},data:{status:"READY",phase:"WAITING_FOR_RESOURCE",error:t.message,claimOwner:null,claimExpiresAt:null}})).count&&(await i.workflowResourceLease.deleteMany({where:{attemptId:e.id}}),await i.workflowRunEvent.findFirst({where:{attemptId:e.id,type:"STEP_WAITING_FOR_RESOURCE"},select:{id:!0}})||await this.appendEvent(e.runId,e.id,"STEP_WAITING_FOR_RESOURCE","Step is waiting for the codebase to become available",{error:t.message}),sa(e.runId),!0)}async iterationSessionData(e,t,r){let i=await (0,tY.getPrismaClient)(),a=await i.workflowStepAttempt.findMany({where:{runId:e.id,generation:t.generation,iterationKey:t.iterationKey,status:"SUCCEEDED"},orderBy:{finishedAt:"asc"}}),n=r;for(let e of(t.inputJson&&(n=(0,nn.mergeSessionData)(n,sr(n4(t.inputJson),"Iteration input"))),a)){let t=this.attemptOutput(e);t.sessionPatch&&(n=(0,nn.mergeSessionData)(n,t.sessionPatch))}return n}async executeControl(e,t,r,i,a){switch(r.kind){case"CONTROL_IF":{let e=r.config.condition;if(!e)throw Error("If steps require a condition");let t=(0,nn.evaluateWorkflowCondition)(e,i);return{output:{matched:t},selectedHandles:[t?"true":"false"]}}case"CONTROL_JOIN":{let i=a.nodes.find(e=>"CONTROL_FOR_EACH"===e.kind&&e.config.joinNodeId===r.id);if(i){let r=await (0,tY.getPrismaClient)(),a=await r.workflowStepAttempt.findMany({where:{runId:e.id,generation:t.generation,iterationKey:{not:""},status:"FAILED"}});if(a.length&&"COLLECT_ERRORS"!==i.config.errorMode)throw Error(`${a.length} for-each iteration step(s) failed`);return{output:{iterations:await r.workflowStepAttempt.count({where:{runId:e.id,generation:t.generation,iterationKey:{not:""}}}),failures:a.map(({nodeId:e,iterationKey:t,error:r})=>({nodeId:e,iterationKey:t,error:r}))}}}return{output:{joined:!0}}}case"CONTROL_TRY":return{output:{started:!0}};case"CONTROL_DELAY":{let e=Number(r.config.seconds??0);if(!Number.isFinite(e)||e<0||e>31536e3)throw Error("Delay must be between zero and 31,536,000 seconds");return{wait:{kind:"DELAY",resumeAfter:new Date(Date.now()+1e3*e)}}}case"CONTROL_WAIT_UNTIL":{let e=r.config.condition;if(!e)throw Error("Wait-until steps require a condition");if((0,nn.evaluateWorkflowCondition)(e,i))return{output:{matched:!0}};let t=nl(r.config,15);return{wait:{kind:"PREDICATE",predicate:{condition:e,cadenceSeconds:t},resumeAfter:new Date(Date.now()+1e3*t),timeoutAt:no(r.config)}}}case"CONTROL_SET_VARIABLE":{if("string"!=typeof r.config.path)throw Error("Set-variable steps require an output path");let e="string"==typeof r.config.script?await nJ(r.config.script,i):r.config.value;return{output:e,sessionPatch:(0,nn.setSessionValue)({},r.config.path,e)}}case"CONTROL_FOR_EACH":{let n=Array.isArray(r.config.items)?r.config.items:"string"==typeof r.config.listPath?(0,nn.getSessionValue)(i,r.config.listPath):null;if(!Array.isArray(n))throw Error("For-each source must be an array");if(n.length>1e3)throw Error("For-each is limited to 1,000 items");return await this.spawnForEach(e,t,r,a,n),{output:{itemCount:n.length},selectedHandles:n.length?["body"]:["empty"],sessionPatch:(0,nn.setSessionValue)({},`steps.${r.id}.items`,n)}}case"CONTROL_SUBWORKFLOW":return this.startSubworkflow(e,t,r,i);case"HUMAN_CONFIRM":case"HUMAN_CHOICE":return this.createHumanQuestion(e,t,r);default:throw Error(`Unsupported control step ${r.kind}`)}}async progressIterationAttempts(e,t,r,i,a,n,s){let o=await (0,tY.getPrismaClient)(),l=!1;for(let e of new Set([...n.values()].map(({iterationKey:e})=>e).filter(Boolean))){let t=new Map(s);for(let r of n.values())r.iterationKey===e&&t.set(r.nodeId,r);for(let n of t.values()){if(n.iterationKey!==e||"PENDING"!==n.status)continue;let s=i.get(n.nodeId);if(!s)continue;let c=(a.get(s.id)??[]).map(e=>this.edgeState(e,r,t,i)),u=c.filter(e=>"ACTIVE"===e).length,d=c.filter(e=>"PENDING"===e).length;("ANY"==("CONTROL_JOIN"===s.kind&&"ANY"===s.config.mode?"ANY":"ALL")?u>0:0===d&&u>0)?(await o.workflowStepAttempt.update({where:{id:n.id},data:{status:"READY",phase:"ITERATION_READY"}}),l=!0):0===d&&0===u&&(await o.workflowStepAttempt.update({where:{id:n.id},data:{status:"SKIPPED",phase:"INACTIVE_ITERATION_BRANCH",finishedAt:new Date}}),l=!0)}}return l}async spawnForEach(e,t,r,i,a){let n="string"==typeof r.config.joinNodeId?r.config.joinNodeId:null,s=i.nodes.find(({id:e})=>e===n);if(!s||"CONTROL_JOIN"!==s.kind)throw Error("For-each steps require an explicit joinNodeId");let o=new Map;for(let e of i.edges)o.set(e.source,[...o.get(e.source)??[],e]);let l=(o.get(r.id)??[]).filter(({sourceHandle:e})=>"body"===e).map(({target:e})=>e),c=new Set;for(;l.length;){let e=l.shift();e===n||c.has(e)||(c.add(e),l.push(...(o.get(e)??[]).map(({target:e})=>e)))}if(a.length&&!c.size)throw Error("For-each body is not connected to its body handle");let u=i.nodes.filter(({id:e})=>c.has(e)),d=await (0,tY.getPrismaClient)();await d.$transaction(async i=>{await i.workflowStepAttempt.updateMany({where:{runId:e.id,generation:t.generation,iterationKey:t.iterationKey,nodeId:{in:[...c]},status:"PENDING"},data:{status:"SKIPPED",phase:"ITERATION_TEMPLATE",finishedAt:new Date}}),a.length&&u.length&&await i.workflowStepAttempt.createMany({data:a.flatMap((i,a)=>{let n=t.iterationKey?`${t.iterationKey}.${a}`:String(a),s=JSON.stringify({loop:{current:{forEachNodeId:r.id,index:a,item:i},[r.id]:{index:a,item:i}}});return u.map(r=>({id:(0,g.randomUUID)(),runId:e.id,nodeId:r.id,kind:r.kind,generation:t.generation,iterationKey:n,attempt:0,status:"PENDING",phase:"ITERATION_PENDING",inputJson:s,requiredPathsJson:JSON.stringify(sn(r)),providedPathsJson:JSON.stringify(ss(r)),idempotencyKey:`${e.id}:${r.id}:${t.generation}:${n}:0`}))})})})}async startSubworkflow(e,t,r,i){let a="string"==typeof r.config.versionId?r.config.versionId:null;if(!a)throw Error("Sub-workflow version is required");let n=await (0,tY.getPrismaClient)(),s=await n.workflowVersion.findUnique({where:{id:a},include:{workflow:{include:{activeVersion:!0}}}});if(!s)throw Error("Sub-workflow version not found");if(!s.workflow.enabled||s.workflow.archivedAt)throw Error("Sub-workflow is paused");let o=e,l=0;for(;o;){if(o.workflowId===s.workflowId)throw Error("Recursive sub-workflow invocation is not allowed");if((l+=1)>=10)throw Error("Sub-workflow depth is limited to 10");o=o.parentRunId?await n.workflowRun.findUnique({where:{id:o.parentRunId}}):null}let c={};if(r.config.inputMapping&&"object"==typeof r.config.inputMapping)for(let[e,t]of Object.entries(r.config.inputMapping))c=(0,nn.setSessionValue)(c,e,(0,nn.resolveWorkflowValue)(t,i));let u=await this.createRunForTrigger({...s.workflow,activeVersion:s},s,null,null,"SUBWORKFLOW",e.id,{sessionData:c,parentRunId:e.id},`${t.id}:subworkflow:${s.id}`,e.id);return sa(u.id),{output:{childRunId:u.id},links:[{kind:"WORKFLOW_RUN",resourceId:u.id,label:`Workflow run #${u.displayNumber}`,url:`/workflows/runs/${u.id}`}],wait:{kind:"WORKFLOW_RUN",externalKey:u.id,resumeAfter:nc(r.config),timeoutAt:no(r.config)}}}async createHumanQuestion(e,t,r){let i=Array.isArray(r.config.questions)?r.config.questions:[{header:r.name??null,prompt:"string"==typeof r.config.prompt?r.config.prompt:"HUMAN_CONFIRM"===r.kind?"Continue this workflow?":"Choose an option",multiSelect:!!r.config.multiSelect,allowCustom:"HUMAN_CONFIRM"!==r.kind&&!1!==r.config.allowCustom,options:"HUMAN_CONFIRM"===r.kind?[{label:"Confirm",description:null},{label:"Cancel",description:null}]:Array.isArray(r.config.options)?r.config.options:[]}];if(!i.length||i.length>10)throw Error("Workflow questions must contain between one and ten questions");let a=await (0,tY.getPrismaClient)(),n=(0,g.randomUUID)();return await a.runQuestionBatch.create({data:{id:n,workflowStepAttemptId:t.id,nativeRequestId:`workflow:${t.id}`,questions:{create:i.map((e,t)=>{let r=sr(e,"Workflow question"),i=Array.isArray(r.options)?r.options:[];return{id:(0,g.randomUUID)(),position:t,header:"string"==typeof r.header?r.header:null,prompt:n5(String(r.prompt??""),"Question prompt",1e4),multiSelect:!!r.multiSelect,allowCustom:!1!==r.allowCustom,options:{create:i.map((e,t)=>{let r=sr(e,"Question option");return{id:(0,g.randomUUID)(),position:t,label:n5(String(r.label??""),"Option label",500),description:"string"==typeof r.description?r.description.slice(0,2e3):null}})}}})}}}),rQ.agentEventBus.publish(nX(e.id),{workflowQuestionChanged:{id:n,runId:e.id}}),{output:{questionBatchId:n},wait:{kind:"HUMAN",externalKey:n,timeoutAt:no(r.config)}}}async parkAttempt(e,t){let r=t.wait;if(!r)throw Error("Workflow wait is missing");let i=await (0,tY.getPrismaClient)(),a=(0,g.randomUUID)();await i.$transaction(async i=>{let n=await i.workflowRun.findUnique({where:{id:e.runId},select:{status:!0}});return!(!n||n1.has(n.status))&&!!(await i.workflowStepAttempt.updateMany({where:{id:e.id,status:"RUNNING"},data:{status:"WAITING",phase:r.kind,outputJson:JSON.stringify({value:t.output,selectedHandles:t.selectedHandles,sessionPatch:t.sessionPatch}),claimOwner:null,claimExpiresAt:null}})).count&&(await i.workflowWait.create({data:{id:a,runId:e.runId,attemptId:e.id,kind:r.kind,predicateJson:r.predicate?JSON.stringify(r.predicate):null,externalKey:r.externalKey??null,resumeAfter:r.resumeAfter??null,timeoutAt:r.timeoutAt??null}}),t.links?.length&&await i.workflowRunResourceLink.createMany({data:t.links.map(t=>({id:(0,g.randomUUID)(),runId:e.runId,attemptId:e.id,kind:t.kind.toUpperCase(),resourceId:t.resourceId,label:t.label??null,url:t.url??null,metadataJson:t.metadata?JSON.stringify(t.metadata):null}))}),await i.workflowRun.updateMany({where:{id:e.runId,status:{in:[...n3]}},data:{status:"WAITING",phase:r.kind}}),await i.workflowResourceLease.deleteMany({where:{attemptId:e.id}}),!0)})&&(await this.appendEvent(e.runId,e.id,"STEP_WAITING",`Step is waiting for ${r.kind.toLowerCase().replaceAll("_"," ")}`,{waitId:a}),sa(e.runId))}async completeAttempt(e,t,r){let i=await (0,tY.getPrismaClient)();await i.$transaction(async i=>{let a=await i.workflowRun.findUnique({where:{id:e.runId}});if(!a)throw Error("Workflow run disappeared");if(n1.has(a.status))return!1;let n=(0,nn.workflowSessionData)(a.sessionDataJson);e.iterationKey?n=(0,nn.setSessionValue)(n,`steps.${t.id}.iterations.${e.iterationKey.replaceAll(".","_")}`,{status:"SUCCEEDED",output:r.output??null,data:r.sessionPatch??null}):(r.sessionPatch&&(n=(0,nn.mergeSessionData)(n,r.sessionPatch)),n=(0,nn.setSessionValue)(n,`steps.${t.id}`,{status:"SUCCEEDED",output:r.output??null,snapshotId:r.links?.find(({kind:e})=>"CHECKPOINT"===e)?.resourceId??null}));let s=JSON.stringify(n);return st(s,"Workflow session data",2097152),!!(await i.workflowStepAttempt.updateMany({where:{id:e.id,status:{in:["RUNNING","WAITING"]}},data:{status:"SUCCEEDED",phase:"SUCCEEDED",outputJson:JSON.stringify({value:r.output,selectedHandles:r.selectedHandles,sessionPatch:r.sessionPatch}),error:null,finishedAt:new Date,claimOwner:null,claimExpiresAt:null}})).count&&(r.links?.length&&await i.workflowRunResourceLink.createMany({data:r.links.map(t=>({id:(0,g.randomUUID)(),runId:e.runId,attemptId:e.id,kind:t.kind.toUpperCase(),resourceId:t.resourceId,label:t.label??null,url:t.url??null,metadataJson:t.metadata?JSON.stringify(t.metadata):null}))}),await i.workflowRun.update({where:{id:e.runId},data:{sessionDataJson:s,sessionRevision:{increment:1}}}),await i.workflowRun.updateMany({where:{id:e.runId,status:{in:[...n3]}},data:{status:"RUNNING",phase:"SCHEDULING"}}),await i.workflowResourceLease.deleteMany({where:{attemptId:e.id}}),!0)})&&(await this.appendEvent(e.runId,e.id,"STEP_SUCCEEDED",`Step ${t.name??t.id} completed`),sa(e.runId))}async failAttempt(e,t,r){let i=await (0,tY.getPrismaClient)(),a=t??(await i.workflowRun.findUnique({where:{id:e.runId},include:{version:!0}}))?.version.definitionJson,n="string"==typeof a?(0,ii.parseWorkflowDefinition)(n4(a)).nodes.find(({id:t})=>t===e.nodeId)??null:a,s=n?.retry,o=!!(s&&e.attempt+1<s.maxAttempts),l=s?Math.min(86400,"EXPONENTIAL"===s.strategy?s.delaySeconds*2**e.attempt:s.delaySeconds):0;await i.$transaction(async t=>{let i=await t.workflowRun.findUnique({where:{id:e.runId}});if(!i||n1.has(i.status))return!1;let a=(0,nn.workflowSessionData)(i.sessionDataJson);return e.iterationKey||(a=(0,nn.setSessionValue)(a,`steps.${e.nodeId}`,{status:"FAILED",error:r.message})),!!(await t.workflowStepAttempt.updateMany({where:{id:e.id,status:{in:["RUNNING","WAITING"]}},data:{status:"FAILED",phase:o?"RETRY_SCHEDULED":"FAILED",error:r.message.slice(0,2e4),finishedAt:new Date,claimOwner:null,claimExpiresAt:null}})).count&&(o&&await t.workflowWait.create({data:{id:(0,g.randomUUID)(),runId:e.runId,attemptId:e.id,kind:"RETRY",resumeAfter:new Date(Date.now()+1e3*l)}}),await t.workflowRun.update({where:{id:e.runId},data:{sessionDataJson:JSON.stringify(a),sessionRevision:{increment:1}}}),await t.workflowRun.updateMany({where:{id:e.runId,status:{in:[...n3]}},data:{status:o?"WAITING":"RUNNING",phase:o?"RETRY_WAIT":"SCHEDULING"}}),await t.workflowResourceLease.deleteMany({where:{attemptId:e.id}}),!0)})&&(await this.appendEvent(e.runId,e.id,o?"STEP_RETRY_SCHEDULED":"STEP_FAILED",o?`Step failed and will retry in ${l} seconds`:`Step failed: ${r.message}`,{error:r.message,retry:o}),sa(e.runId))}async resolveDueWaits(){let e=await (0,tY.getPrismaClient)(),t=new Date,r=(t,r)=>e.workflowWait.updateMany({where:{id:t,status:"PENDING",run:{status:{in:[...n3]}}},data:r});for(let i of(await e.workflowWait.findMany({where:{status:"PENDING",run:{status:{in:[...n3]}},OR:[{resumeAfter:{lte:t}},{timeoutAt:{lte:t}}]},include:{attempt:{include:{run:{include:{version:!0}}}}},orderBy:{createdAt:"asc"},take:100}))){if(i.timeoutAt&&i.timeoutAt<=t&&"RETRY"!==i.kind&&"DELAY"!==i.kind){if(!(await r(i.id,{status:"TIMED_OUT",resolvedAt:t})).count)continue;await this.failAttempt(i.attempt,(0,ii.parseWorkflowDefinition)(n4(i.attempt.run.version.definitionJson)).nodes.find(({id:e})=>e===i.attempt.nodeId)??null,Error("Workflow wait timed out"));continue}if("RETRY"===i.kind){let r=i.attempt.attempt+1;await e.$transaction(async e=>{if(!(await e.workflowWait.updateMany({where:{id:i.id,status:"PENDING",run:{status:{in:[...n3]}}},data:{status:"RESOLVED",resolvedAt:t}})).count)return!1;if(await e.workflowStepAttempt.create({data:{id:(0,g.randomUUID)(),runId:i.runId,nodeId:i.attempt.nodeId,kind:i.attempt.kind,generation:i.attempt.generation,iterationKey:i.attempt.iterationKey,attempt:r,status:"PENDING",phase:"RETRY_PENDING",inputJson:i.attempt.inputJson,requiredPathsJson:i.attempt.requiredPathsJson,providedPathsJson:i.attempt.providedPathsJson,idempotencyKey:`${i.runId}:${i.attempt.nodeId}:${i.attempt.generation}:${i.attempt.iterationKey}:${r}`,replayedFromId:i.attempt.id}}),!(await e.workflowRun.updateMany({where:{id:i.runId,status:{in:[...n3]}},data:{status:"RUNNING",phase:"SCHEDULING"}})).count)throw Error("Workflow lifecycle changed while resuming retry");return!0})&&sa(i.runId)}else if("DELAY"===i.kind){if(!(await r(i.id,{status:"RESOLVED",resolvedAt:t})).count)continue;await this.completeWaitingAttempt(i.attemptId,{delayed:!0})}else if("PREDICATE"===i.kind){let e=i.predicateJson?sr(n4(i.predicateJson),"Wait predicate"):{},a=e.condition,n=(0,nn.workflowSessionData)(i.attempt.run.sessionDataJson);if(a&&(0,nn.evaluateWorkflowCondition)(a,n)){if(!(await r(i.id,{status:"RESOLVED",resultJson:JSON.stringify({matched:!0}),resolvedAt:t})).count)continue;await this.completeWaitingAttempt(i.attemptId,{matched:!0})}else{let t=Math.max(1,Number(e.cadenceSeconds??15));await r(i.id,{resumeAfter:new Date(Date.now()+1e3*t)})}}else if(i.externalKey&&this.waitPollers.has(i.kind)){let e=await this.waitPollers.get(i.kind)(i.externalKey);if(e.pending){let t=(0,ii.parseWorkflowDefinition)(n4(i.attempt.run.version.definitionJson)).nodes.find(({id:e})=>e===i.attempt.nodeId)?.config??{};await r(i.id,{resumeAfter:new Date(Date.now()+1e3*nl(t,e.pollAfterSeconds??15))})}else{if(!(await r(i.id,{status:e.error?"FAILED":"RESOLVED",resultJson:JSON.stringify(e.result??{}),resolvedAt:new Date})).count)continue;if(e.error){let t=(0,ii.parseWorkflowDefinition)(n4(i.attempt.run.version.definitionJson)).nodes.find(({id:e})=>e===i.attempt.nodeId);await this.failAttempt(i.attempt,t??null,Error(e.error))}else await this.completeWaitingAttempt(i.attemptId,e.result??{})}}}}async completeWaitingAttempt(e,t){let r=await (0,tY.getPrismaClient)(),i=await r.workflowStepAttempt.findUnique({where:{id:e},include:{run:{include:{version:!0}}}});if(!i||"WAITING"!==i.status)return;let a=(0,ii.parseWorkflowDefinition)(n4(i.run.version.definitionJson)).nodes.find(({id:e})=>e===i.nodeId);if(!a)throw Error("Workflow step definition is missing");let n=this.attemptOutput(i),s=n.sessionPatch;if("TERMINAL_RUN"===a.kind&&t&&"object"==typeof t&&!Array.isArray(t)&&t.sessionData&&"object"==typeof t.sessionData&&!Array.isArray(t.sessionData)){let e=structuredClone(t.sessionData),r=(0,nn.getSessionValue)((0,nn.workflowSessionData)(i.run.sessionDataJson),"workflow");s=r?(0,nn.setSessionValue)(e,"workflow",r):e}t&&"object"==typeof t&&!Array.isArray(t)&&t.sessionPatch&&"object"==typeof t.sessionPatch&&!Array.isArray(t.sessionPatch)&&(s=(0,nn.mergeSessionData)(s??{},t.sessionPatch)),a.kind.startsWith("RUN_")&&t&&"object"==typeof t&&!Array.isArray(t)&&(s=(0,nn.mergeSessionData)(s??{},(0,nn.setSessionValue)({},`run.${a.id}`,t))),"BUILD_START"===a.kind&&t&&"object"==typeof t&&!Array.isArray(t)&&(s=(0,nn.mergeSessionData)(s??{},(0,nn.setSessionValue)({},"build",t))),"WORKTREE_WAIT_PUSH_READY"===a.kind&&t&&"object"==typeof t&&!Array.isArray(t)&&(s=(0,nn.mergeSessionData)(s??{},(0,nn.setSessionValue)({},"worktree",{id:t.id,pushStatus:t.pushStatus}))),"SKILL_APPLY"===a.kind&&t&&"object"==typeof t&&!Array.isArray(t)&&(s=(0,nn.mergeSessionData)(s??{},(0,nn.setSessionValue)({},`steps.${a.id}`,t))),("HUMAN_CONFIRM"===a.kind||"HUMAN_CHOICE"===a.kind)&&(s=(0,nn.mergeSessionData)(s??{},(0,nn.setSessionValue)({},`steps.${a.id}.answer`,t))),await this.completeAttempt(i,a,{output:t??n.value,selectedHandles:n.selectedHandles,sessionPatch:s})}async resolveExternalWait(e,t,r,i=null){let a=await (0,tY.getPrismaClient)(),n=await a.workflowWait.findMany({where:{kind:e,externalKey:t,status:"PENDING"},include:{attempt:{include:{run:{include:{version:!0}}}}}});for(let e of n)if(await a.workflowWait.update({where:{id:e.id},data:{status:i?"FAILED":"RESOLVED",resultJson:JSON.stringify(r),resolvedAt:new Date}}),i){let t=(0,ii.parseWorkflowDefinition)(n4(e.attempt.run.version.definitionJson)).nodes.find(({id:t})=>t===e.attempt.nodeId);await this.failAttempt(e.attempt,t??null,Error(i))}else await this.completeWaitingAttempt(e.attemptId,r);return n.length}descendants(e,t){let r=new Map;for(let t of e.edges)r.set(t.source,[...r.get(t.source)??[],t.target]);let i=new Set([t]),a=[t];for(;a.length;){let e=a.shift();for(let t of r.get(e)??[])i.has(t)||(i.add(t),a.push(t))}return[...i]}async prepareReplay(e,t){let r=await (0,tY.getPrismaClient)(),i=await r.workflowRun.findUnique({where:{id:e},include:{version:!0,attempts:{include:{checkpoints:!0,resourceLinks:!0}}}});if(!i)throw Error("Workflow run not found");if(!new Set(["PAUSED","BLOCKED","FAILED","SUCCEEDED","CANCELLED"]).has(i.status))throw Error("Pause the workflow before replaying a step");let a=(0,ii.parseWorkflowDefinition)(n4(i.version.definitionJson));if(!a.nodes.some(({id:e})=>e===t))throw Error("Workflow step not found");let n=this.descendants(a,t),s=i.attempts.filter(({generation:e,nodeId:t})=>e===i.generation&&n.includes(t)),o=s.filter(e=>e.nodeId===t).sort((e,t)=>t.attempt-e.attempt)[0],l=o?.checkpoints.slice().sort((e,t)=>e.createdAt.getTime()-t.createdAt.getTime())[0],c=s.flatMap(e=>e.resourceLinks.filter(({kind:e})=>"CHECKPOINT"!==e).map(({kind:e,resourceId:t,label:r,url:i})=>({kind:e,resourceId:t,label:r,url:i}))),u=null,d=null;if(l&&this.agentControl)try{u=await this.compareCheckpointWithAgent(l.id)}catch(e){d=`Git comparison unavailable: ${e instanceof Error?e.message:String(e)}`}return{runId:e,nodeId:t,affectedNodeIds:n,affectedAttemptIds:s.map(({id:e})=>e),externalEffects:c,checkpointId:l?.id??null,gitComparison:u,warning:[c.length?"External Jira, GitHub, build, deployment, and notification effects will not be undone.":null,d].filter(Boolean).join(" ")||null}}async replay(e,t,r={}){let i=await this.prepareReplay(e,t);if(r.restore){if(!i.checkpointId)throw Error("No restorable Git checkpoint is available for this step");this.checkpointRestorer?await this.checkpointRestorer(i.checkpointId,{stash:!!r.stash}):await this.restoreCheckpointWithAgent(i.checkpointId,{stash:!!r.stash})}let a=await (0,tY.getPrismaClient)(),n=await a.workflowRun.findUnique({where:{id:e},include:{version:!0,attempts:!0}});if(!n)throw Error("Workflow run not found");let s=(0,ii.parseWorkflowDefinition)(n4(n.version.definitionJson)),o=n.attempts.filter(e=>e.generation===n.generation&&e.nodeId===t).sort((e,t)=>t.attempt-e.attempt)[0];if(!o)throw Error("Selected step has no execution history");let l=o.inputJson?sr(n4(o.inputJson),"Step input snapshot"):(0,nn.workflowSessionData)(n.sessionDataJson),c=n.generation+1,u=new Map;for(let e of n.attempts.filter(({generation:e,iterationKey:t})=>e===n.generation&&!t)){let t=u.get(e.nodeId);(!t||t.attempt<e.attempt)&&u.set(e.nodeId,e)}let d=(0,nn.setSessionValue)(l,"workflow.replay",{generation:c,fromNodeId:t,replayedAt:new Date().toISOString()});return await a.$transaction(async t=>{await t.workflowStepAttempt.updateMany({where:{runId:e,generation:n.generation,nodeId:{in:i.affectedNodeIds},supersededAt:null},data:{supersededAt:new Date}}),await t.workflowStepAttempt.createMany({data:s.nodes.map(t=>{let r=i.affectedNodeIds.includes(t.id),a=u.get(t.id);return{id:(0,g.randomUUID)(),runId:e,nodeId:t.id,kind:t.kind,generation:c,iterationKey:"",attempt:0,status:r?"PENDING":a?.status==="SKIPPED"?"SKIPPED":"SUCCEEDED",phase:r?"REPLAY_PENDING":"REUSED_FROM_PRIOR_GENERATION",inputJson:r?null:a?.inputJson,outputJson:r?null:a?.outputJson,error:null,startedAt:r?null:a?.startedAt,finishedAt:r?null:new Date,requiredPathsJson:JSON.stringify(sn(t)),providedPathsJson:JSON.stringify(ss(t)),idempotencyKey:`${e}:${t.id}:${c}::0`,replayedFromId:a?.id??null}})}),await t.workflowWait.updateMany({where:{runId:e,status:"PENDING"},data:{status:"SUPERSEDED",resolvedAt:new Date}}),await t.workflowRun.update({where:{id:e},data:{generation:c,sessionDataJson:JSON.stringify(d),sessionRevision:{increment:1},status:"RUNNING",phase:"REPLAYING",blockedReason:null,error:null,pausedAt:null,finishedAt:null}})}),await this.appendEvent(e,null,"RUN_REPLAYED",`Replaying from step ${t}`,{generation:c,affectedNodeIds:i.affectedNodeIds}),sa(e),this.run(e)}async appendEvent(e,t,r,i,a=null){let n=await (0,tY.getPrismaClient)(),s=await n.$transaction(async n=>{let s=await n.workflowRunEvent.findFirst({where:{runId:e},orderBy:{sequence:"desc"},select:{sequence:!0}});return n.workflowRunEvent.create({data:{id:(0,g.randomUUID)(),runId:e,attemptId:t,sequence:(s?.sequence??-1)+1,type:r,message:i.slice(0,2e4),detailJson:a?JSON.stringify(a):null}})});return rQ.agentEventBus.publish(nQ(e),{workflowRunEventAdded:s}),s}subscribeWorkflows(){return rQ.agentEventBus.iterate(nZ)}subscribeRun(e){return rQ.agentEventBus.iterate(nY(e))}subscribeRunEvents(e){return rQ.agentEventBus.iterate(nQ(e))}subscribeRunQuestions(e){return rQ.agentEventBus.iterate(nX(e))}}let sc=globalThis;e.s(["getServerServices",0,function(){var e,t,r,i,g,y,v,w,b,k,x,S,I,E,A,_,C,T;let R,D,N,O,P,$,U,B,j,L,M,q,F,V,K,H,G,W,J,z,Z,Y,Q,X,ee,et,er,ei,ea,en,es;return sc.serverServices??(R=new f.PrismaService,D=new tQ.CredentialService,N=new nj,O=new a.AgentControlService,P=new aC(D),$=new aN,U=new r6(O),(B=new aX(O,P)).startRuntime(),j=new n.CcusageService(O),L=new s.BuildDataService(O),M=new ad.TelemetryService,q=new ay(O,void 0,D),F=new aF,V=new av.PushNotificationsService(void 0,D,$),(K=new aV.RunsService(P,O,U)).startReaper(),H=new o.BuildsService(O,M,P,U),G=new au(O),W=new l.CodebasesService(O,G),J=new c.CodebaseToolsService(W),z=new h.JiraService(D,N),Z=new m.IosDevicesService(void 0,D),Y=new u.GitHubActionsNotificationsService(D,P,$,!0,N),Q=new d.GitHubService(!0,D,$,()=>Y.configurationChanged()),X=new p.CacheServerService(D),ee=new rX.WorktreesService(O,z,Q,G,N),et=new iF(J,H,{codebases:W,telemetry:M,pushNotifications:V,agents:O,diskSpace:U,workflows:()=>ei},D),e=ei=new sl(N,er=new nz,void 0,D,O,P,K,ee,B,Q,z),r=e,i=t={agentControl:O,jira:z,github:Q,worktrees:ee,codebases:W,builds:H,skills:G,runs:K,commands:B,notifications:P,pushNotifications:V,tools:et,diskSpace:U},r.registerWaitPoller("AGENT_JOB",async e=>{let t=await i.agentControl.getJob(e);return t?new Set(["QUEUED","RUNNING"]).has(t.status)?{pending:!0,pollAfterSeconds:2}:{pending:!1,result:t.resultJson?{...nu(JSON.parse(t.resultJson),"Agent job result"),jobId:e}:{jobId:e,status:t.status},error:"SUCCEEDED"===t.status?null:t.error||`Agent job ${t.status.toLowerCase()}`}:{pending:!1,error:"Agent job disappeared"}}),r.registerWaitPoller("AGENT_RUN",async e=>{let t=await i.runs.get(e);return t?new Set(["IN_PROGRESS","PAUSED"]).has(t.status)?{pending:!0,pollAfterSeconds:3}:{pending:!1,result:{id:t.id,kind:t.kind,status:t.status,phase:t.phase,finalOutput:t.finalOutput,error:t.error,usage:{inputTokens:t.inputTokens,outputTokens:t.outputTokens,reasoningTokens:t.reasoningTokens,estimatedCost:t.estimatedCost}},error:"COMPLETED"===t.status?null:t.error||`Run ${t.status.toLowerCase()}`}:{pending:!1,error:"Plan or session disappeared"}}),r.registerWaitPoller("COMMAND_RUN",async e=>{let t=await i.commands.getRun(e);return t?new Set(["QUEUED","RUNNING","RESTARTING","CANCELLING"]).has(t.status)?{pending:!0,pollAfterSeconds:1}:{pending:!1,result:{id:t.id,displayNumber:t.displayNumber,status:t.status,exitCode:t.exitCode,signal:t.signal,error:t.error},error:"SUCCEEDED"===t.status?null:t.error||`Command run ${t.status.toLowerCase()}`}:{pending:!1,error:"Command run disappeared"}}),r.registerWaitPoller("BUILD",async e=>{let t=await i.builds.getBuild(e);return t?new Set(["QUEUED","PREPARING","RUNNING"]).has(t.status)?{pending:!0,pollAfterSeconds:3}:{pending:!1,result:{id:t.id,status:t.status,action:t.action},error:"SUCCEEDED"===t.status?null:t.error||`Build ${t.status.toLowerCase()}`}:{pending:!1,error:"Build disappeared"}}),r.registerWaitPoller("SKILL_RUN",async e=>{let t=await i.skills.getRun(e);return t?("READY"===t.status&&(t=await i.skills.applyRun(e)),new Set(["PREPARING","READY","APPLYING"]).has(t?.status??""))?{pending:!0,pollAfterSeconds:3}:{pending:!1,result:{id:e,status:t?.status},error:t?.status==="SUCCEEDED"?null:t?.error||`Skill run ${t?.status?.toLowerCase()}`}:{pending:!1,error:"Skill run disappeared"}}),r.registerWaitPoller("WORKTREE_MOVE",async e=>{let t=await i.worktrees.getMove(e);if(!t)return{pending:!1,error:"Worktree move disappeared"};if(new Set(["PUSHING","CHECKING_OUT","DELETING_SOURCE"]).has(t.status))return{pending:!0,pollAfterSeconds:3};let r=t.targetWorktreeId?await i.worktrees.workflowSessionDataForWorktree(t.targetWorktreeId,{includeMissing:!0}):{};return{pending:!1,result:{id:t.id,status:t.status,targetWorktreeId:t.targetWorktreeId,sessionPatch:r},error:"SUCCEEDED"===t.status?null:t.error||`Worktree move ${t.status.toLowerCase()}`}}),r.registerWaitPoller("WORKTREE_PUSH_READY",async e=>{let t=await (0,tY.getPrismaClient)(),r=await t.worktree.findUnique({where:{id:e}});if(!r)return{pending:!1,error:"Worktree disappeared"};if("READY"!==r.pushStatus)return{pending:!0,pollAfterSeconds:5};let a=await i.worktrees.workflowSessionDataForWorktree(r.id,{includeMissing:!0});return{pending:!1,result:{id:r.id,pushStatus:r.pushStatus,sessionPatch:a}}}),r.registerWaitPoller("WORKFLOW_RUN",async e=>{let t=await r.run(e);return t?new Set(["SUCCEEDED","FAILED","CANCELLED"]).has(t.status)?{pending:!1,result:{id:t.id,status:t.status,sessionData:JSON.parse(t.sessionDataJson)},error:"SUCCEEDED"===t.status?null:t.error||`Sub-workflow ${t.status.toLowerCase()}`}:{pending:!0,pollAfterSeconds:3}:{pending:!1,error:"Sub-workflow disappeared"}}),r.registerWaitPoller("RUN_ANSWER_REVISION",async e=>{let t=nu(JSON.parse(e),"Answer revision wait"),r=nd(t.batchId,"Question batch ID",500),a=await i.runs.questionBatch(r);if(!a)return{pending:!1,error:"Question batch disappeared"};if(!a.revisionPreparedAt)return{pending:!0,pollAfterSeconds:2};let n=await i.runs.reviseAnswer(r,t.answers??{},!0===t.stash,!1!==t.rollback);return n?{pending:!1,result:{id:n.id,kind:n.kind,status:n.status,phase:n.phase,parentRunId:n.parentRunId,followUpMode:n.followUpMode}}:{pending:!1,error:"Answer revision failed"}}),r.registerWaitPoller("GITHUB_CHECKS",async e=>{let t=nu(JSON.parse(e),"GitHub checks wait"),r=await i.github.autoRetryRun(nd(t.repositoryId,"Repository ID"),nd(t.workflowRunId,"Workflow run ID"),!0);return new Set(["SUCCESS","FAILURE","CANCELLED","SKIPPED","TIMED_OUT","ACTION_REQUIRED","ERROR","NEUTRAL","STALE","STARTUP_FAILURE"]).has(r.status)?{pending:!1,result:{runId:r.id,status:r.status,jobs:r.jobs,sessionPatch:{pipeline:{runId:r.id,status:r.status,conclusion:r.status,jobs:r.jobs}}},error:"SUCCESS"===r.status?null:`GitHub checks concluded ${r.status.toLowerCase()}`}:{pending:!0,pollAfterSeconds:10}}),r.registerWaitPoller("DISK_SPACE_REPORT",async e=>{let t=nu(JSON.parse(e),"Disk-space report wait"),r=nd(t.agentId,"Agent ID",500),a=await i.diskSpace.snapshot(r);if(!a.disk.enabled)return{pending:!1,error:"Disk-space monitoring was disabled while awaiting a report"};let n=a.disk.lastReportedAt,s="string"==typeof t.previousReportedAt?t.previousReportedAt:null;return(nd(t.requestedAt,"Requested timestamp",100),n&&(!s||Date.parse(n)>Date.parse(s)))?{pending:!1,result:{...a,sessionPatch:a}}:{pending:!0,pollAfterSeconds:2}}),g=er,y=t,g.register("JIRA_LOAD_TICKET",async e=>{let t=nE(await y.jira.ticket(n_(e),!0===e.node.config.force));return{output:t,sessionPatch:{ticket:t},links:[nv(String(t.key),String(t.title??t.key))]}}),g.register("JIRA_TRANSITION",async e=>{let t=nE(await y.jira.transitionTicket(n_(e),nd(e.node.config.transitionId,"Jira transition ID",200)));return{output:t,sessionPatch:{ticket:t},links:[nv(String(t.key),String(t.title??t.key))]}}),g.register("JIRA_COMMENT",async e=>{let t=nE(await y.jira.addComment(n_(e),{value:nd(e.node.config.content,"Jira comment",1e5),format:"JIRA_WIKI"===e.node.config.format?"JIRA_WIKI":"MARKDOWN"}));return{output:t,sessionPatch:{ticket:t},links:[nv(String(t.key),String(t.title??t.key))]}}),g.register("JIRA_ASSIGN",async e=>{let t=null===e.node.config.accountId?null:nd(e.node.config.accountId,"Jira account ID",500),r=nE(await y.jira.assignTicket(n_(e),t));return{output:r,sessionPatch:{ticket:r},links:[nv(String(r.key),String(r.title??r.key))]}}),g.register("JIRA_UPDATE_FIELDS",async e=>{let t=nu(e.node.config.fields??{},"Jira fields"),r=nE(await y.jira.updateTicket({issueKey:n_(e),...t}));return{output:r,sessionPatch:{ticket:r},links:[nv(String(r.key),String(r.title??r.key))]}}),g.register("JIRA_RESOLVE_BRANCH",async e=>{let t=await y.worktrees.previewTicketBranch({codebaseId:nd(e.node.config.codebaseId??(0,nn.getSessionValue)(e.sessionData,"codebase.id"),"Codebase ID",200),worktreeId:"string"==typeof(0,nn.getSessionValue)(e.sessionData,"worktree.id")?String((0,nn.getSessionValue)(e.sessionData,"worktree.id")):null,ticketKey:n_(e)});return{output:t,sessionPatch:{worktree:{branch:t.branchName},ticket:{key:t.ticketKey,title:t.ticketTitle,type:t.ticketType}},links:[nv(t.ticketKey,t.ticketTitle)]}}),v=er,w=t,v.register("GITHUB_LOAD_PR",async e=>{let t=nI(e),r=await w.github.pullRequest(t.owner,t.name,nT(e));if(!r)throw Error("Pull request was not found");let i=nA(r);return{output:i,sessionPatch:{pr:i},links:[ny("PULL_REQUEST",a6(t.owner,t.name,r.number),r.title,r.url)]}}),v.register("GITHUB_MERGE_PR",async e=>{let t=nI(e),r=nT(e),i=await w.github.pullRequestMergeOptions(t.owner,t.name,r);if(!i.canMerge)throw Error(i.blockedReason||"Pull request cannot be merged");let a=await w.github.mergePullRequest({...t,number:r,method:"MERGE"===e.node.config.method||"REBASE"===e.node.config.method?e.node.config.method:"SQUASH",commitHeadline:"string"==typeof e.node.config.commitHeadline?e.node.config.commitHeadline:i.defaultCommitHeadline,commitBody:"string"==typeof e.node.config.commitBody?e.node.config.commitBody:i.defaultCommitBody,authorEmail:"string"==typeof e.node.config.authorEmail?e.node.config.authorEmail:null});return{output:a,sessionPatch:{pr:{state:a.state}},links:[nw(e)]}}),v.register("GITHUB_COLLECT_REVIEW_THREADS",async e=>{let t=nI(e),r=await w.github.pullRequest(t.owner,t.name,nT(e));if(!r)throw Error("Pull request was not found");let i=r.reviewThreads.filter(({isResolved:e})=>!e);return{output:i,sessionPatch:{pr:{unresolvedThreads:i}},links:[nw(e,r.title,r.url)]}}),v.register("GITHUB_REPLY_REVIEW_THREAD",async e=>{let t=await w.github.replyToReviewThread(nd(e.node.config.threadId,"Review thread ID",500),nd(e.node.config.body,"Review reply",1e5)),r=nb(e);return{output:t,links:r?[r]:void 0}}),v.register("GITHUB_SET_REVIEW_THREAD_RESOLVED",async e=>{let t=await w.github.setReviewThreadResolved(nd(e.node.config.threadId,"Review thread ID",500),!1!==e.node.config.resolved),r=nb(e);return{output:t,links:r?[r]:void 0}}),v.register("GITHUB_CREATE_PR",async e=>{let t=nI(e),r=await w.github.createPullRequest({...t,baseRefName:nd(e.node.config.baseRefName??(0,nn.getSessionValue)(e.sessionData,"worktree.baseBranch"),"Base branch",500),headRefName:nd(e.node.config.headRefName??(0,nn.getSessionValue)(e.sessionData,"worktree.branch"),"Head branch",500),title:nd(e.node.config.title??(0,nn.getSessionValue)(e.sessionData,"ticket.title"),"Pull request title",500),body:"string"==typeof e.node.config.body?e.node.config.body:null,draft:!0===e.node.config.draft}),i=nA(r);return{output:i,sessionPatch:{pr:i},links:[ny("PULL_REQUEST",a6(t.owner,t.name,r.number),r.title,r.url)]}}),v.register("GITHUB_SET_PR_LABELS",async e=>{let t=nI(e),r=Array.isArray(e.node.config.labels)?e.node.config.labels.map(String):[],i=await w.github.setPullRequestLabels({...t,number:nT(e),labels:r});return{output:i.labels,sessionPatch:{pr:{labels:i.labels}},links:[nw(e)]}}),v.register("GITHUB_RETRY_PIPELINE",async e=>{let t=await w.github.retryPipeline(nd(e.node.config.repositoryId??(0,nn.getSessionValue)(e.sessionData,"pr.repositoryGithubId"),"GitHub repository ID",500),nd(e.node.config.checkSuiteId??(0,nn.getSessionValue)(e.sessionData,"pipeline.checkSuiteId"),"Check suite ID",500),{actor:"workflow",ipAddress:null}),r=nk(e);return{output:t,sessionPatch:{pipeline:{status:t.status}},links:r?[r]:void 0}}),v.register("GITHUB_RETRY_JOB",async e=>{let t=await w.github.retryWorkflowJob(nd(e.node.config.repositoryId,"GitHub repository ID",500),nd(e.node.config.checkSuiteId,"Check suite ID",500),nd(e.node.config.jobId,"Workflow job ID",500),{actor:"workflow",ipAddress:null}),r=nk(e);return{output:t,links:r?[r]:void 0}}),v.register("GITHUB_CANCEL_WORKFLOW_RUN",async e=>{let t=await w.github.cancelActionsWorkflowRun(nd(e.node.config.codebaseRepositoryId??(0,nn.getSessionValue)(e.sessionData,"repo.id"),"Codebase repository ID",500),nd(e.node.config.workflowRunId??(0,nn.getSessionValue)(e.sessionData,"pipeline.runId"),"Workflow run ID",500),!0===e.node.config.force,{actor:"workflow",ipAddress:null}),r=nk(e);return{output:t,sessionPatch:{pipeline:{status:"CANCELLED"}},links:r?[r]:void 0}}),v.register("GITHUB_SAVE_AUTO_RETRY",async e=>({output:await w.github.saveAutoRetryRule(nu(e.node.config.input,"Auto-retry rule"))})),v.register("GITHUB_WAIT_CHECKS",async e=>{let t=nd(e.node.config.repositoryId??(0,nn.getSessionValue)(e.sessionData,"repo.id"),"Repository ID",500),r=nd(e.node.config.workflowRunId??(0,nn.getSessionValue)(e.sessionData,"pipeline.runId"),"Workflow run ID",500),i=nk(e);return{links:i?[i]:void 0,wait:{kind:"GITHUB_CHECKS",externalKey:JSON.stringify({repositoryId:t,workflowRunId:r}),resumeAfter:nc(e.node.config),timeoutAt:no(e.node.config)}}}),b=er,k=t,b.register("WORKTREE_CREATE",async e=>{let t=nN(e),r=await k.worktrees.createWorktree({codebaseId:nD(e),selection:t,requestId:nm(e,"create")});return ng(e,r,{worktree:{branch:t.branchName,baseBranch:t.baseBranch}})}),b.register("WORKTREE_CHANGE_BRANCH",async e=>{let t=nR(e),r=nN(e),i=await k.worktrees.changeWorktreeBranch({worktreeId:t,selection:r,requestId:nm(e,"change-branch"),stashOnFailure:!0===e.node.config.stashOnFailure});return ng(e,i,{worktree:{branch:r.branchName,baseBranch:r.baseBranch}},[ny("WORKTREE",t,"Worktree")])}),b.register("WORKTREE_OPERATION",async e=>{let t=String(e.node.config.operation??"SYNC").toUpperCase();if("OPEN_EDITOR"===t||!a4.WORKTREE_OPERATIONS.includes(t))throw Error("Worktree operation is invalid for workflow execution");let r=nR(e),i=await k.worktrees.runOperation(r,t,nm(e,t.toLowerCase()));return ng(e,i,void 0,[ny("WORKTREE",r,"Worktree")])}),b.register("WORKTREE_DELETE",async e=>{let t=await k.worktrees.deleteWorktree({worktreeId:nR(e),deleteRemoteBranch:!0===e.node.config.deleteRemoteBranch,requestId:nm(e,"delete")});return ng(e,t)}),b.register("WORKTREE_MOVE",async e=>{let t=await k.worktrees.moveWorktree({sourceWorktreeId:nR(e),targetCodebaseId:nd(e.node.config.targetCodebaseId,"Target codebase ID",500),targetWorktreeId:np(e.node.config.targetWorktreeId,500),deleteSource:!0===e.node.config.deleteSource,requestId:nm(e,"move")}),r=t.targetWorktreeId??(!0===e.node.config.deleteSource?null:nR(e));return{output:t,links:[...r?[ny("WORKTREE",r,"Worktree")]:[],{kind:"WORKTREE_MOVE",resourceId:t.id,label:"Worktree move"}],wait:{kind:"WORKTREE_MOVE",externalKey:t.id,resumeAfter:nc(e.node.config),timeoutAt:no(e.node.config)}}}),b.register("WORKTREE_INSPECT",async e=>{let t=nR(e),r=await k.worktrees.inspect(t,nm(e,"inspect"));return{output:r,sessionPatch:{worktree:{commits:r.commits,changes:r.changes,branchChanges:r.branchChanges}},links:[ny("WORKTREE",t,"Worktree")]}}),b.register("WORKTREE_INSPECT_GIT",async e=>{let t=nR(e),r=await k.worktrees.inspectGitState(t,nm(e,"inspect-git"));return{output:r,sessionPatch:{worktree:{...r}},links:[ny("WORKTREE",t,"Worktree")]}}),b.register("WORKTREE_GIT_OPERATION",async e=>{let t=String(e.node.config.operation??"PULL_BRANCH").toUpperCase();if(!a4.WORKTREE_GIT_OPERATIONS.includes(t))throw Error("Worktree Git operation is invalid");let r=nR(e),i=await k.worktrees.runGitOperation({worktreeId:r,operation:t,branch:np(e.node.config.branch,500),stashOid:np(e.node.config.stashOid,200),stashChanges:!0===e.node.config.stashChanges,requestId:nm(e,t.toLowerCase())});return ng(e,i,void 0,[ny("WORKTREE",r,"Worktree")])}),b.register("WORKTREE_WAIT_PUSH_READY",async e=>{let t=nR(e);return{links:[ny("WORKTREE",t,"Worktree")],wait:{kind:"WORKTREE_PUSH_READY",externalKey:t,resumeAfter:nc(e.node.config),timeoutAt:no(e.node.config)}}}),x=er,S=t,x.register("CODEBASE_FETCH_REFRESH",async e=>{let t=nD(e),r="REFRESH"===e.node.config.operation?ro.CODEBASE_REFRESH_JOB_KIND:ro.CODEBASE_FETCH_JOB_KIND,i=await S.codebases.runOperation(r,[t],nm(e,r)),a=i.jobs[0];if(!a)throw Error(i.skipped[0]?.reason??"Codebase operation was skipped");return ng(e,a,void 0,[ny("CODEBASE",t,"Codebase")])}),x.register("CODEBASE_INSPECT_GIT",async e=>{let t=nD(e),r=await S.codebases.inspectGitState(t,nm(e,"inspect-git"));return{output:r,sessionPatch:{codebase:{...r}},links:[ny("CODEBASE",t,"Codebase")]}}),x.register("CODEBASE_GIT_OPERATION",async e=>{let t=String(e.node.config.operation??"PULL_BRANCH").toUpperCase();if(!ro.CODEBASE_GIT_OPERATIONS.includes(t))throw Error("Codebase Git operation is invalid");let r=nD(e),i=await S.codebases.runGitOperation({codebaseId:r,operation:t,branch:np(e.node.config.branch,500),stashOid:np(e.node.config.stashOid,200),stashChanges:!0===e.node.config.stashChanges,requestId:nm(e,t.toLowerCase())});return ng(e,i,void 0,[ny("CODEBASE",r,"Codebase")])}),I=er,E=t,I.register("BUILD_START",async e=>{let t=String(e.node.config.action??"BUILD").toUpperCase();if(!a3.BUILD_ACTIONS.includes(t))throw Error("Build action is invalid");let r=await E.builds.startBuild({worktreeId:nR(e),configurationId:nd(e.node.config.configurationId,"Build configuration ID",500),destination:e.node.config.destination,scriptIds:Array.isArray(e.node.config.scriptIds)?e.node.config.scriptIds.map(String):[],action:t,advancedSettings:e.node.config.advancedSettings,exportWhenComplete:!0===e.node.config.exportWhenComplete,exportSettings:e.node.config.exportSettings,worktreeCoverage:!0===e.node.config.worktreeCoverage,requestId:nm(e,"build"),telemetryRequestOrigin:"workflow"});return{output:r,sessionPatch:{build:{id:r.id,status:r.status,action:r.action}},links:[{kind:"BUILD",resourceId:r.id,label:`${r.action} build`,url:`/builds/${r.id}`}],wait:{kind:"BUILD",externalKey:r.id,resumeAfter:nc(e.node.config),timeoutAt:no(e.node.config)}}}),I.register("BUILD_READ_TEST_RESULTS",async e=>{let t,r=nO(e),i=(await E.builds.reportsForBuild(r)).filter(({kind:e,status:t})=>"TEST_RESULTS"===e&&"READY"===t).at(-1);if(!i)throw Error("Test results are not ready");let a=nu(JSON.parse(i.summaryJson),"Test summary"),n=nu(JSON.parse(i.dataJson),"Test results");return{output:{summary:a,tests:n.tests??[]},sessionPatch:{build:{testSummary:a,tests:n.tests??[]}},links:[ny("BUILD",r,"Build",t)]}}),I.register("BUILD_READ_COVERAGE",async e=>{let t=nO(e),r=(await E.builds.reportsForBuild(t)).filter(({kind:e,status:t})=>"CODE_COVERAGE"===e&&"READY"===t).at(-1);if(!r)throw Error("Coverage results are not ready");let i=nu(JSON.parse(r.summaryJson),"Coverage summary"),a=nu(JSON.parse(r.dataJson),"Coverage results");return{output:{summary:i,files:a.files??[],changedFiles:a.changedFiles??[]},sessionPatch:{build:{coverageSummary:i,coverageFiles:a.files??[],changedCoverageFiles:a.changedFiles??[]}},links:[ny("BUILD",t,"Build",`/builds/${t}/coverage`)]}}),I.register("BUILD_EXPORT",async e=>{let t,r,i=nO(e),a=await E.builds.exportArchive({buildId:i,requestId:nm(e,"export"),settings:nu(e.node.config.settings,"Export settings")});return a.jobId?ng(e,{id:a.jobId,timeoutSeconds:3600},{build:{exportId:a.id}},[ny("BUILD",i,"Build",t)]):{output:a,links:[ny("BUILD",i,"Build",r)]}}),I.register("BUILD_DEPLOY",async e=>{let t,r,i=nO(e),a=await E.builds.runBuild({buildId:i,destinations:Array.isArray(e.node.config.destinations)?e.node.config.destinations:[],requestId:nm(e,"deploy")}),n=a.find(({jobId:e})=>!!e)?.jobId;return n?ng(e,{id:n,timeoutSeconds:3600},void 0,[ny("BUILD",i,"Build",t)]):{output:a,links:[ny("BUILD",i,"Build",r)]}}),I.register("BUILD_CANCEL",async e=>{let t,r=nO(e),i=await E.builds.cancelBuild(r);return{output:i,sessionPatch:{build:{id:i?.id,status:i?.status}},links:[ny("BUILD",r,"Build",t)]}}),A=er,_=t,es=async e=>{let t=await _.diskSpace.snapshot(e);return{output:t,sessionPatch:t,links:[ny("AGENT",e,t.agent.name,`/agents/${encodeURIComponent(e)}`)]}},A.register("DISK_SPACE_LOAD",async e=>es(nP(e))),A.register("DISK_SPACE_REFRESH",async e=>{let t=nP(e),r=await _.diskSpace.requestRefresh(t);return{output:r,links:[ny("AGENT",t,"Agent",`/agents/${encodeURIComponent(t)}`)],wait:{kind:"DISK_SPACE_REPORT",externalKey:JSON.stringify(r),resumeAfter:nc(e.node.config,2),timeoutAt:no(e.node.config,180)}}}),A.register("DISK_SPACE_UPDATE_THRESHOLDS",async e=>{let t=await _.diskSpace.updateSettings({normalThresholdGiB:Number(e.node.config.normalThresholdGiB),pressureThresholdGiB:Number(e.node.config.pressureThresholdGiB)});return{output:t,sessionPatch:{disk:t}}}),A.register("DISK_SPACE_SET_MONITORING",async e=>{let t=nP(e);return await _.diskSpace.setMonitoring(t,!0===e.node.config.enabled),es(t)}),A.register("DISK_SPACE_SET_PRESSURE_MODE",async e=>{let t=nP(e);return await _.diskSpace.setManualPressureMode(t,!0===e.node.config.enabled),es(t)}),function(e,t){for(let[r,i]of(e.register("RUN_CREATE_PLAN",async e=>{let r=await t.runs.create(nU(e,"PLAN"));if(!r)throw Error("Plan could not be created");return nf(e,r,!0)}),e.register("RUN_CREATE_SESSION",async e=>{let r=await t.runs.create(nU(e,"SESSION"));if(!r)throw Error("Session could not be created");return nf(e,r,!0)}),e.register("RUN_PLAY_PLAN",async e=>{let r=await t.runs.playPlan(n$(e));if(!r)throw Error("Plan could not be played");return nf(e,r,!0)}),e.register("RUN_FOLLOW_UP",async e=>{let r=nU(e,"SESSION"),i=await t.runs.followUp(n$(e),{...r,followUpMode:nd(e.node.config.followUpMode??"RESUME","Follow-up mode",50),contextMode:np(e.node.config.contextMode,50)});if(!i)throw Error("Follow-up could not be created");return nf(e,i,!0)}),e.register("RUN_STEER",async e=>{let r=await t.runs.steer(n$(e),nd(e.node.config.prompt,"Steering prompt",2e5),Array.isArray(e.node.config.attachmentIds)?e.node.config.attachmentIds.map(String):[]);if(!r)throw Error("Run could not be steered");return nf(e,r)}),e.register("RUN_ANSWER",async e=>{let r=await t.runs.answerQuestion(nd(e.node.config.batchId,"Question batch ID",500),e.node.config.answers??{});if(!r)throw Error("Question could not be answered");return nf(e,r)}),[["RUN_PAUSE","PAUSE"],["RUN_CONTINUE","CONTINUE"],["RUN_CANCEL","CANCEL"]]))e.register(r,async e=>{let r=await t.runs.lifecycle(n$(e),i);if(!r)throw Error("Run lifecycle operation failed");return nf(e,r)});e.register("RUN_REVISE_ANSWER",async e=>{let r=nd(e.node.config.batchId,"Question batch ID",500),i=await t.runs.questionBatch(r);if(!i)throw Error("Question batch was not found");if(i.revisionPreparedAt){let i=await t.runs.reviseAnswer(r,e.node.config.answers??{},!0===e.node.config.stash,!1!==e.node.config.rollback);if(!i)throw Error("Answer revision failed");return nf(e,i)}await t.runs.prepareAnswerRevision(r);let a=nx(e);return{links:a?[a]:void 0,wait:{kind:"RUN_ANSWER_REVISION",externalKey:JSON.stringify({batchId:r,answers:e.node.config.answers??{},stash:!0===e.node.config.stash,rollback:!1!==e.node.config.rollback}),resumeAfter:nc(e.node.config),timeoutAt:no(e.node.config)}}}),e.register("RUN_READ_RESULT",async e=>{let r=await t.runs.get(n$(e));if(!r)throw Error("Run was not found");let[i,a,n,s]=await Promise.all([t.runs.events({runId:r.id,first:500}),t.runs.questions({runId:r.id,first:200}),t.runs.usage(r.id),t.runs.linkedItems(r.id)]);return nf(e,{...r,events:i,questions:a,usage:n,links:s})}),e.register("RUN_CAPTURE_CHECKPOINT",async e=>{let t=await (0,tY.getPrismaClient)(),r=await t.runCheckpoint.findFirst({where:{runId:n$(e)},orderBy:{createdAt:"desc"}});if(!r)throw Error("Run has no captured checkpoint");let i=nx(e);return{output:r,sessionPatch:{steps:{[e.node.id]:{snapshotId:r.id}}},links:[...i?[i]:[],{kind:"CHECKPOINT",resourceId:r.id,label:`${r.kind} checkpoint`}]}}),e.register("RUN_ARCHIVE_DELETE",async e=>{let r=n$(e),i=!0===e.node.config.delete,a=i?await t.runs.deleteRuns([r]):await t.runs.archive([r],!1!==e.node.config.archived),n=i?null:nx(e);return{output:{id:r,affected:a},links:n?[n]:void 0}})}(er,t),C=er,T=t,C.register("SAVED_COMMAND",async e=>{let t=nd(e.node.config.commandId,"Saved command",500),r=await T.commands.getDefinition(t);if(!r||r.archivedAt)throw Error("Saved command is unavailable");let i="FIRE_AND_FORGET"===e.node.config.completionMode?"FIRE_AND_FORGET":"WAIT_FOR_EXIT";if("WAIT_FOR_EXIT"===i&&"ALWAYS"===r.restartPolicy)throw Error("Always-restart commands require fire and forget");let a=String(e.node.config.targetMode??"CONTEXT"),n=null,s=null,o=new Set(["ANY_AGENT_HOME","SPECIFIC_AGENT_HOME"]).has(r.targetKind);if("FIXED_AGENT"===a)n=nd(e.node.config.agentId,"Fixed agent",500);else if("FIXED_WORKTREE"===a)s=nd(e.node.config.worktreeId,"Fixed worktree",500);else if(o){let t=(0,nn.getSessionValue)(e.sessionData,"agent.id")??(0,nn.getSessionValue)(e.sessionData,"codebase.agentId");if("string"==typeof t&&(n=t),!n){let t=(0,nn.getSessionValue)(e.sessionData,"worktree.id");if("string"==typeof t){let e=await (0,tY.getPrismaClient)(),r=await e.worktree.findUnique({where:{id:t},select:{codebase:{select:{agentId:!0}}}});n=r?.codebase.agentId??null}}}else{let t=(0,nn.getSessionValue)(e.sessionData,"worktree.id");"string"==typeof t&&(s=t)}let l=await T.commands.startRun({commandId:t,agentId:n,worktreeId:s,origin:"WORKFLOW",idempotencyKey:e.attempt.idempotencyKey});if(!l)throw Error("Command run could not be created");return{output:{id:l.id,displayNumber:l.displayNumber,status:l.status},sessionPatch:{steps:{[e.node.id]:{commandRunId:l.id,displayNumber:l.displayNumber}}},links:[{kind:"COMMAND_RUN",resourceId:l.id,label:`Command #${l.displayNumber}`,url:`/commands/runs/${l.id}`}],wait:"WAIT_FOR_EXIT"===i?{kind:"COMMAND_RUN",externalKey:l.id,resumeAfter:nc(e.node.config),timeoutAt:no(e.node.config)}:void 0}}),C.register("CUSTOM_COMMAND",async e=>{let t=nd(e.node.config.script,"Custom command",1e6),r="FIRE_AND_FORGET"===e.node.config.completionMode?"FIRE_AND_FORGET":"WAIT_FOR_EXIT",i=String(e.node.config.targetMode??"CONTEXT"),a=null,n=null;if("FIXED_AGENT"===i)a=nd(e.node.config.agentId,"Fixed agent",500);else if("FIXED_WORKTREE"===i)n=nd(e.node.config.worktreeId,"Fixed worktree",500);else{let t=(0,nn.getSessionValue)(e.sessionData,"worktree.id");if("string"==typeof t)n=t;else{let t=(0,nn.getSessionValue)(e.sessionData,"agent.id")??(0,nn.getSessionValue)(e.sessionData,"codebase.agentId");"string"==typeof t&&(a=t)}}if(!a&&!n)throw Error("Custom command context has no agent or worktree target");let s=await T.commands.startCustomRun({script:t,agentId:a,worktreeId:n,origin:"WORKFLOW",idempotencyKey:e.attempt.idempotencyKey});if(!s)throw Error("Custom command run could not be created");return{output:{id:s.id,displayNumber:s.displayNumber,status:s.status},sessionPatch:{steps:{[e.node.id]:{commandRunId:s.id,displayNumber:s.displayNumber}}},links:[{kind:"COMMAND_RUN",resourceId:s.id,label:`Command #${s.displayNumber}`,url:`/commands/runs/${s.id}`}],wait:"WAIT_FOR_EXIT"===r?{kind:"COMMAND_RUN",externalKey:s.id,resumeAfter:nc(e.node.config),timeoutAt:no(e.node.config)}:void 0}}),C.register("SKILL_APPLY",async e=>{let t=await T.skills.prepareSync(e.node.config.groupId?"GROUP":"ALL",np(e.node.config.groupId,500),!1);if(!t)throw Error("Skill sync could not be prepared");return{output:t,links:[{kind:"SKILL_RUN",resourceId:t.id,label:"Skill sync",url:`/skills/sync/${t.id}`}],wait:{kind:"SKILL_RUN",externalKey:t.id,resumeAfter:nc(e.node.config),timeoutAt:no(e.node.config)}}}),C.register("NOTIFICATION_SEND",async e=>{let t=await (0,tY.getPrismaClient)(),r=await t.$transaction(t=>T.notifications.recordInTransaction(t,{dedupeKey:`${e.run.id}:${e.node.id}:${e.attempt.generation}`,typeKey:"WORKFLOW_MESSAGE",title:nd(e.node.config.title,"Notification title",240),body:nd(e.node.config.body,"Notification body",1e3),href:"string"==typeof e.node.config.href?e.node.config.href:`/workflows/runs/${e.run.id}`,resourceKind:"WORKFLOW_RUN",resourceId:e.run.id,worktreeId:"string"==typeof(0,nn.getSessionValue)(e.sessionData,"worktree.id")?String((0,nn.getSessionValue)(e.sessionData,"worktree.id")):null}));return T.notifications.created(r),{output:r}}),C.register("IOS_PUSH_SEND",async e=>({output:await T.pushNotifications.send({requestId:nm(e,"ios-push"),editor:e.node.config.editor,targetMode:nd(e.node.config.targetMode??"ALL","Push target mode",50),registrationIds:Array.isArray(e.node.config.registrationIds)?e.node.config.registrationIds.map(String):[],channelId:np(e.node.config.channelId,500),directToken:np(e.node.config.directToken,2e4),directTokenEncoding:"BASE64"===e.node.config.directTokenEncoding?"BASE64":"HEX",directEnvironment:"PRODUCTION"===e.node.config.directEnvironment?"PRODUCTION":"SANDBOX"})})),C.register("MCP_CALL",async e=>{let t=await T.tools.callTool({groupId:nd(e.node.config.groupId,"MCP tool group",500),name:nd(e.node.config.name,"MCP tool name",500),arguments:nu(e.node.config.arguments??{},"MCP arguments")});return{output:t,sessionPatch:{steps:{[e.node.id]:{output:t}}}}}),(ea=new nF(N,O,ee,U)).start(),ei.startRuntime(),(en=new a2(j,U,$)).startRuntime(),sc.serverServices={prismaService:R,credentialService:D,agentControlService:O,ccusageService:j,buildDataService:L,buildsService:H,codebasesService:W,codebaseToolsService:J,jiraService:z,iosDevicesService:Z,gitHubService:Q,gitHubActionsNotificationsService:Y,cacheServerService:X,worktreesService:ee,skillsService:G,telemetryService:M,signingAssetsService:q,pushNotificationsService:V,notificationsService:P,pollingService:$,modelCostsService:F,runsService:K,commandsService:B,diskSpaceService:U,systemStatusService:en,toolsService:et,workflowEventsService:N,workflowsService:ei,workflowEventBridge:ea})}],887394)}];
|
|
468
|
+
`)&&-1===e.indexOf("\r")){s.push(e),o+=e.length,m();return}s.push(e);let t=s.join("");s.length=0,o=0;let r=f(t);""!==r&&(s.push(r),o=r.length),m()},reset:function(e={}){if(e.consume&&s.length>0){let e=s.join("");g(e,0,e.length)}l=!0,c=void 0,u="",d=0,p=void 0,s.length=0,o=0,h=!1}}}function em(e,t,r){return 100===r&&97===e.charCodeAt(t+1)&&116===e.charCodeAt(t+2)&&97===e.charCodeAt(t+3)&&58===e.charCodeAt(t+4)}function ef(e,t,r){return 101===r&&118===e.charCodeAt(t+1)&&101===e.charCodeAt(t+2)&&110===e.charCodeAt(t+3)&&116===e.charCodeAt(t+4)&&58===e.charCodeAt(t+5)}class eg extends Event{constructor(e,t){var r,i;super(e),this.code=null!=(r=null==t?void 0:t.code)?r:void 0,this.message=null!=(i=null==t?void 0:t.message)?i:void 0}[Symbol.for("nodejs.util.inspect.custom")](e,t,r){return r(ey(this),t)}[Symbol.for("Deno.customInspect")](e,t){return e(ey(this),t)}}function ey(e){return{type:e.type,message:e.message,code:e.code,defaultPrevented:e.defaultPrevented,cancelable:e.cancelable,timeStamp:e.timeStamp}}var ev,ew,eb,ek,ex,eS,eI,eE,eA,e_,eC,eT,eR,eD,eN,eO,eP,e$,eU,eB,ej,eL,eM,eq=e=>{throw TypeError(e)},eF=(e,t,r)=>t.has(e)||eq("Cannot "+r),eV=(e,t,r)=>(eF(e,t,"read from private field"),r?r.call(e):t.get(e)),eK=(e,t,r)=>t.has(e)?eq("Cannot add the same private member more than once"):t instanceof WeakSet?t.add(e):t.set(e,r),eH=(e,t,r,i)=>(eF(e,t,"write to private field"),t.set(e,r),r),eG=(e,t,r)=>(eF(e,t,"access private method"),r);class eW extends EventTarget{constructor(e,t){var r,i;super(),eK(this,eD),this.CONNECTING=0,this.OPEN=1,this.CLOSED=2,eK(this,ev),eK(this,ew),eK(this,eb),eK(this,ek),eK(this,ex),eK(this,eS),eK(this,eI),eK(this,eE,null),eK(this,eA),eK(this,e_),eK(this,eC,null),eK(this,eT,null),eK(this,eR,null),eK(this,eO,async e=>{var t;eV(this,e_).reset();let{body:r,redirected:i,status:a,headers:n}=e;if(204===a){eG(this,eD,ej).call(this,"Server sent HTTP 204, not reconnecting",204),this.close();return}if(i?eH(this,eb,new URL(e.url)):eH(this,eb,void 0),200!==a)return void eG(this,eD,ej).call(this,`Non-200 status code (${a})`,a);if(!(n.get("content-type")||"").startsWith("text/event-stream"))return void eG(this,eD,ej).call(this,'Invalid content type, expected "text/event-stream"',a);if(eV(this,ev)===this.CLOSED)return;eH(this,ev,this.OPEN);let s=new Event("open");if(null==(t=eV(this,eR))||t.call(this,s),this.dispatchEvent(s),"object"!=typeof r||!r||!("getReader"in r)){eG(this,eD,ej).call(this,"Invalid response body, expected a web ReadableStream",a),this.close();return}let o=new TextDecoder,l=r.getReader(),c=!0;do{let{done:e,value:t}=await l.read();t&&eV(this,e_).feed(o.decode(t,{stream:!e})),e&&(c=!1,eV(this,e_).reset(),eG(this,eD,eL).call(this))}while(c)}),eK(this,eP,e=>{eH(this,eA,void 0),"AbortError"!==e.name&&"aborted"!==e.type&&eG(this,eD,eL).call(this,function e(t){return t instanceof Error?"errors"in t&&Array.isArray(t.errors)?t.errors.map(e).join(", "):"cause"in t&&t.cause instanceof Error?`${t}: ${e(t.cause)}`:t.message:`${t}`}(e))}),eK(this,eU,e=>{"string"==typeof e.id&&eH(this,eE,e.id);let t=new MessageEvent(e.event||"message",{data:e.data,origin:eV(this,eb)?eV(this,eb).origin:eV(this,ew).origin,lastEventId:e.id||""});eV(this,eT)&&(!e.event||"message"===e.event)&&eV(this,eT).call(this,t),this.dispatchEvent(t)}),eK(this,eB,e=>{eH(this,eS,e)}),eK(this,eM,()=>{eH(this,eI,void 0),eV(this,ev)===this.CONNECTING&&eG(this,eD,eN).call(this)});try{if(e instanceof URL)eH(this,ew,e);else if("string"==typeof e)eH(this,ew,new URL(e,function(){let e="document"in globalThis?globalThis.document:void 0;return e&&"object"==typeof e&&"baseURI"in e&&"string"==typeof e.baseURI?e.baseURI:void 0}()));else throw Error("Invalid URL")}catch{throw function(e){let t=globalThis.DOMException;return"function"==typeof t?new t(e,"SyntaxError"):SyntaxError(e)}("An invalid or illegal string was specified")}eH(this,e_,eh({onEvent:eV(this,eU),onRetry:eV(this,eB)})),eH(this,ev,this.CONNECTING),eH(this,eS,3e3),eH(this,ex,null!=(r=null==t?void 0:t.fetch)?r:globalThis.fetch),eH(this,ek,null!=(i=null==t?void 0:t.withCredentials)&&i),eG(this,eD,eN).call(this)}get readyState(){return eV(this,ev)}get url(){return eV(this,ew).href}get withCredentials(){return eV(this,ek)}get onerror(){return eV(this,eC)}set onerror(e){eH(this,eC,e)}get onmessage(){return eV(this,eT)}set onmessage(e){eH(this,eT,e)}get onopen(){return eV(this,eR)}set onopen(e){eH(this,eR,e)}addEventListener(e,t,r){super.addEventListener(e,t,r)}removeEventListener(e,t,r){super.removeEventListener(e,t,r)}close(){eV(this,eI)&&clearTimeout(eV(this,eI)),eV(this,ev)!==this.CLOSED&&(eV(this,eA)&&eV(this,eA).abort(),eH(this,ev,this.CLOSED),eH(this,eA,void 0))}}function eJ(e){return e?e instanceof Headers?Object.fromEntries(e.entries()):Array.isArray(e)?Object.fromEntries(e):{...e}:{}}function ez(e=fetch,t){return t?async(r,i)=>e(r,{...t,...i,headers:i?.headers?{...eJ(t.headers),...eJ(i.headers)}:t.headers}):e}async function eZ(e){return(await t).getRandomValues(new Uint8Array(e))}async function eY(e){let t="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._~",r=256-256%t.length,i="";for(;i.length<e;)for(let a of(await eZ(e-i.length)))a<r&&(i+=t[a%t.length]);return i}async function eQ(e){return await eY(e)}async function eX(e){return btoa(String.fromCharCode(...new Uint8Array(await (await t).subtle.digest("SHA-256",new TextEncoder().encode(e))))).replace(/\//g,"_").replace(/\+/g,"-").replace(/=/g,"")}async function e0(e){if(e||(e=43),e<43||e>128)throw`Expected a length between 43 and 128. Received ${e}.`;let t=await eQ(e),r=await eX(t);return{code_verifier:t,code_challenge:r}}ev=new WeakMap,ew=new WeakMap,eb=new WeakMap,ek=new WeakMap,ex=new WeakMap,eS=new WeakMap,eI=new WeakMap,eE=new WeakMap,eA=new WeakMap,e_=new WeakMap,eC=new WeakMap,eT=new WeakMap,eR=new WeakMap,eD=new WeakSet,eN=function(){eH(this,ev,this.CONNECTING),eH(this,eA,new AbortController),eV(this,ex)(eV(this,ew),eG(this,eD,e$).call(this)).then(eV(this,eO)).catch(eV(this,eP))},eO=new WeakMap,eP=new WeakMap,e$=function(){var e;let t={mode:"cors",redirect:"follow",headers:{Accept:"text/event-stream",...eV(this,eE)?{"Last-Event-ID":eV(this,eE)}:void 0},cache:"no-store",signal:null==(e=eV(this,eA))?void 0:e.signal};return"window"in globalThis&&(t.credentials=this.withCredentials?"include":"same-origin"),t},eU=new WeakMap,eB=new WeakMap,ej=function(e,t){var r;eV(this,ev)!==this.CLOSED&&eH(this,ev,this.CLOSED);let i=new eg("error",{code:t,message:e});null==(r=eV(this,eC))||r.call(this,i),this.dispatchEvent(i)},eL=function(e,t){var r;if(eV(this,ev)===this.CLOSED)return;eH(this,ev,this.CONNECTING);let i=new eg("error",{code:t,message:e});null==(r=eV(this,eC))||r.call(this,i),this.dispatchEvent(i),eH(this,eI,setTimeout(eV(this,eM),eV(this,eS)))},eM=new WeakMap,eW.CONNECTING=0,eW.OPEN=1,eW.CLOSED=2,t=globalThis.crypto?.webcrypto??globalThis.crypto??e.A(70729).then(e=>e.webcrypto);var e1=e.i(907855),e2=e.i(733137),e3=e.i(127438),e4=e.i(334512),e4=e4;let e6=e1.url().superRefine((e,t)=>{if(!URL.canParse(e))return t.addIssue({code:e2.ZodIssueCode.custom,message:"URL must be parseable",fatal:!0}),e3.NEVER}).refine(e=>{let t=new URL(e);return"javascript:"!==t.protocol&&"data:"!==t.protocol&&"vbscript:"!==t.protocol},{message:"URL cannot use javascript:, data:, or vbscript: scheme"}),e8=e1.looseObject({resource:e1.string().url(),authorization_servers:e1.array(e6).optional(),jwks_uri:e1.string().url().optional(),scopes_supported:e1.array(e1.string()).optional(),bearer_methods_supported:e1.array(e1.string()).optional(),resource_signing_alg_values_supported:e1.array(e1.string()).optional(),resource_name:e1.string().optional(),resource_documentation:e1.string().optional(),resource_policy_uri:e1.string().url().optional(),resource_tos_uri:e1.string().url().optional(),tls_client_certificate_bound_access_tokens:e1.boolean().optional(),authorization_details_types_supported:e1.array(e1.string()).optional(),dpop_signing_alg_values_supported:e1.array(e1.string()).optional(),dpop_bound_access_tokens_required:e1.boolean().optional()}),e5=e1.looseObject({issuer:e1.string(),authorization_endpoint:e6,token_endpoint:e6,registration_endpoint:e6.optional(),scopes_supported:e1.array(e1.string()).optional(),response_types_supported:e1.array(e1.string()),response_modes_supported:e1.array(e1.string()).optional(),grant_types_supported:e1.array(e1.string()).optional(),token_endpoint_auth_methods_supported:e1.array(e1.string()).optional(),token_endpoint_auth_signing_alg_values_supported:e1.array(e1.string()).optional(),service_documentation:e6.optional(),revocation_endpoint:e6.optional(),revocation_endpoint_auth_methods_supported:e1.array(e1.string()).optional(),revocation_endpoint_auth_signing_alg_values_supported:e1.array(e1.string()).optional(),introspection_endpoint:e1.string().optional(),introspection_endpoint_auth_methods_supported:e1.array(e1.string()).optional(),introspection_endpoint_auth_signing_alg_values_supported:e1.array(e1.string()).optional(),code_challenge_methods_supported:e1.array(e1.string()).optional(),client_id_metadata_document_supported:e1.boolean().optional()}),e9=e1.looseObject({issuer:e1.string(),authorization_endpoint:e6,token_endpoint:e6,userinfo_endpoint:e6.optional(),jwks_uri:e6,registration_endpoint:e6.optional(),scopes_supported:e1.array(e1.string()).optional(),response_types_supported:e1.array(e1.string()),response_modes_supported:e1.array(e1.string()).optional(),grant_types_supported:e1.array(e1.string()).optional(),acr_values_supported:e1.array(e1.string()).optional(),subject_types_supported:e1.array(e1.string()),id_token_signing_alg_values_supported:e1.array(e1.string()),id_token_encryption_alg_values_supported:e1.array(e1.string()).optional(),id_token_encryption_enc_values_supported:e1.array(e1.string()).optional(),userinfo_signing_alg_values_supported:e1.array(e1.string()).optional(),userinfo_encryption_alg_values_supported:e1.array(e1.string()).optional(),userinfo_encryption_enc_values_supported:e1.array(e1.string()).optional(),request_object_signing_alg_values_supported:e1.array(e1.string()).optional(),request_object_encryption_alg_values_supported:e1.array(e1.string()).optional(),request_object_encryption_enc_values_supported:e1.array(e1.string()).optional(),token_endpoint_auth_methods_supported:e1.array(e1.string()).optional(),token_endpoint_auth_signing_alg_values_supported:e1.array(e1.string()).optional(),display_values_supported:e1.array(e1.string()).optional(),claim_types_supported:e1.array(e1.string()).optional(),claims_supported:e1.array(e1.string()).optional(),service_documentation:e1.string().optional(),claims_locales_supported:e1.array(e1.string()).optional(),ui_locales_supported:e1.array(e1.string()).optional(),claims_parameter_supported:e1.boolean().optional(),request_parameter_supported:e1.boolean().optional(),request_uri_parameter_supported:e1.boolean().optional(),require_request_uri_registration:e1.boolean().optional(),op_policy_uri:e6.optional(),op_tos_uri:e6.optional(),client_id_metadata_document_supported:e1.boolean().optional()}),e7=e1.object({...e9.shape,...e5.pick({code_challenge_methods_supported:!0}).shape}),te=e1.object({access_token:e1.string(),id_token:e1.string().optional(),token_type:e1.string(),expires_in:e4.number().optional(),scope:e1.string().optional(),refresh_token:e1.string().optional()}).strip(),tt=e1.object({error:e1.string(),error_description:e1.string().optional(),error_uri:e1.string().optional()}),tr=e6.optional().or(e1.literal("").transform(()=>void 0)),ti=e1.object({redirect_uris:e1.array(e6),token_endpoint_auth_method:e1.string().optional(),grant_types:e1.array(e1.string()).optional(),response_types:e1.array(e1.string()).optional(),client_name:e1.string().optional(),client_uri:e6.optional(),logo_uri:tr,scope:e1.string().optional(),contacts:e1.array(e1.string()).optional(),tos_uri:tr,policy_uri:e1.string().optional(),jwks_uri:e6.optional(),jwks:e1.any().optional(),software_id:e1.string().optional(),software_version:e1.string().optional(),software_statement:e1.string().optional()}).strip(),ta=e1.object({client_id:e1.string(),client_secret:e1.string().optional(),client_id_issued_at:e1.number().optional(),client_secret_expires_at:e1.number().optional()}).strip(),tn=ti.merge(ta);e1.object({error:e1.string(),error_description:e1.string().optional()}).strip(),e1.object({token:e1.string(),token_type_hint:e1.string().optional()}).strip();class ts extends Error{constructor(e,t){super(e),this.errorUri=t,this.name=this.constructor.name}toResponseObject(){let e={error:this.errorCode,error_description:this.message};return this.errorUri&&(e.error_uri=this.errorUri),e}get errorCode(){return this.constructor.errorCode}}class to extends ts{}to.errorCode="invalid_request";class tl extends ts{}tl.errorCode="invalid_client";class tc extends ts{}tc.errorCode="invalid_grant";class tu extends ts{}tu.errorCode="unauthorized_client";class td extends ts{}td.errorCode="unsupported_grant_type";class tp extends ts{}tp.errorCode="invalid_scope";class th extends ts{}th.errorCode="access_denied";class tm extends ts{}tm.errorCode="server_error";class tf extends ts{}tf.errorCode="temporarily_unavailable";class tg extends ts{}tg.errorCode="unsupported_response_type";class ty extends ts{}ty.errorCode="unsupported_token_type";class tv extends ts{}tv.errorCode="invalid_token";class tw extends ts{}tw.errorCode="method_not_allowed";class tb extends ts{}tb.errorCode="too_many_requests";class tk extends ts{}tk.errorCode="invalid_client_metadata";class tx extends ts{}tx.errorCode="insufficient_scope";class tS extends ts{}tS.errorCode="invalid_target";let tI={[to.errorCode]:to,[tl.errorCode]:tl,[tc.errorCode]:tc,[tu.errorCode]:tu,[td.errorCode]:td,[tp.errorCode]:tp,[th.errorCode]:th,[tm.errorCode]:tm,[tf.errorCode]:tf,[tg.errorCode]:tg,[ty.errorCode]:ty,[tv.errorCode]:tv,[tw.errorCode]:tw,[tb.errorCode]:tb,[tk.errorCode]:tk,[tx.errorCode]:tx,[tS.errorCode]:tS};class tE extends Error{constructor(e){super(e??"Unauthorized")}}let tA="code",t_="S256";async function tC(e){let t=e instanceof Response?e.status:void 0,r=e instanceof Response?await e.text():e;try{let{error:e,error_description:t,error_uri:i}=tt.parse(JSON.parse(r));return new(tI[e]||tm)(t||"",i)}catch(e){return new tm(`${t?`HTTP ${t}: `:""}Invalid OAuth error response: ${e}. Raw body: ${r}`)}}async function tT(e,t){try{return await tR(e,t)}catch(r){if(r instanceof tl||r instanceof tu)return await e.invalidateCredentials?.("all"),await tR(e,t);if(r instanceof tc)return await e.invalidateCredentials?.("tokens"),await tR(e,t);throw r}}async function tR(e,{serverUrl:t,authorizationCode:r,scope:i,resourceMetadataUrl:a,fetchFn:n}){let s,o,l,c=await e.discoveryState?.(),u=a;if(!u&&c?.resourceMetadataUrl&&(u=new URL(c.resourceMetadataUrl)),c?.authorizationServerUrl){if(o=c.authorizationServerUrl,s=c.resourceMetadata,l=c.authorizationServerMetadata??await tj(o,{fetchFn:n}),!s)try{s=await tP(t,{resourceMetadataUrl:u},n)}catch{}(l!==c.authorizationServerMetadata||s!==c.resourceMetadata)&&await e.saveDiscoveryState?.({authorizationServerUrl:String(o),resourceMetadataUrl:u?.toString(),resourceMetadata:s,authorizationServerMetadata:l})}else{let r=await tL(t,{resourceMetadataUrl:u,fetchFn:n});o=r.authorizationServerUrl,l=r.authorizationServerMetadata,s=r.resourceMetadata,await e.saveDiscoveryState?.({authorizationServerUrl:String(o),resourceMetadataUrl:u?.toString(),resourceMetadata:s,authorizationServerMetadata:l})}let d=await tD(t,e,s),p=i||s?.scopes_supported?.join(" ")||e.clientMetadata.scope,h=await Promise.resolve(e.clientInformation());if(!h){if(void 0!==r)throw Error("Existing OAuth client information is required when exchanging an authorization code");let t=l?.client_id_metadata_document_supported===!0,i=e.clientMetadataUrl;if(i&&!function(e){if(!e)return!1;try{let t=new URL(e);return"https:"===t.protocol&&"/"!==t.pathname}catch{return!1}}(i))throw new tk(`clientMetadataUrl must be a valid HTTPS URL with a non-root pathname, got: ${i}`);if(t&&i)h={client_id:i},await e.saveClientInformation?.(h);else{if(!e.saveClientInformation)throw Error("OAuth client information must be saveable for dynamic registration");let t=await tK(o,{metadata:l,clientMetadata:e.clientMetadata,scope:p,fetchFn:n});await e.saveClientInformation(t),h=t}}let m=!e.redirectUrl;if(void 0!==r||m){let t=await tV(e,o,{metadata:l,resource:d,authorizationCode:r,fetchFn:n});return await e.saveTokens(t),"AUTHORIZED"}let f=await e.tokens();if(f?.refresh_token)try{let t=await tF(o,{metadata:l,clientInformation:h,refreshToken:f.refresh_token,resource:d,addClientAuthentication:e.addClientAuthentication,fetchFn:n});return await e.saveTokens(t),"AUTHORIZED"}catch(e){if(!(e instanceof ts)||e instanceof tm);else throw e}let g=e.state?await e.state():void 0,{authorizationUrl:y,codeVerifier:v}=await tM(o,{metadata:l,clientInformation:h,state:g,redirectUrl:e.redirectUrl,scope:p,resource:d});return await e.saveCodeVerifier(v),await e.redirectToAuthorization(y),"REDIRECT"}async function tD(e,t,r){let i,a=((i=new URL("string"==typeof e?e:e.href)).hash="",i);if(t.validateResourceURL)return await t.validateResourceURL(a,r?.resource);if(r){if(!function({requestedResource:e,configuredResource:t}){let r=new URL("string"==typeof e?e:e.href),i=new URL("string"==typeof t?t:t.href);if(r.origin!==i.origin||r.pathname.length<i.pathname.length)return!1;let a=r.pathname.endsWith("/")?r.pathname:r.pathname+"/",n=i.pathname.endsWith("/")?i.pathname:i.pathname+"/";return a.startsWith(n)}({requestedResource:a,configuredResource:r.resource}))throw Error(`Protected resource ${r.resource} does not match expected ${a} (or origin)`);return new URL(r.resource)}}function tN(e){let t,r=e.headers.get("WWW-Authenticate");if(!r)return{};let[i,a]=r.split(" ");if("bearer"!==i.toLowerCase()||!a)return{};let n=tO(e,"resource_metadata")||void 0;if(n)try{t=new URL(n)}catch{}return{resourceMetadataUrl:t,scope:tO(e,"scope")||void 0,error:tO(e,"error")||void 0}}function tO(e,t){let r=e.headers.get("WWW-Authenticate");if(!r)return null;let i=RegExp(`${t}=(?:"([^"]+)"|([^\\s,]+))`),a=r.match(i);return a?a[1]||a[2]:null}async function tP(e,t,r=fetch){let i=await tB(e,"oauth-protected-resource",r,{protocolVersion:t?.protocolVersion,metadataUrl:t?.resourceMetadataUrl});if(!i||404===i.status)throw await i?.body?.cancel(),Error("Resource server does not implement OAuth 2.0 Protected Resource Metadata.");if(!i.ok)throw await i.body?.cancel(),Error(`HTTP ${i.status} trying to load well-known OAuth protected resource metadata.`);return e8.parse(await i.json())}async function t$(e,t,r=fetch){try{return await r(e,{headers:t})}catch(i){if(i instanceof TypeError)if(t)return t$(e,void 0,r);else return;throw i}}async function tU(e,t,r=fetch){return await t$(e,{"MCP-Protocol-Version":t},r)}async function tB(e,t,r,i){var a,n;let s,o=new URL(e),l=i?.protocolVersion??v.LATEST_PROTOCOL_VERSION;i?.metadataUrl?s=new URL(i.metadataUrl):(s=new URL(function(e,t="",r={}){return t.endsWith("/")&&(t=t.slice(0,-1)),r.prependPathname?`${t}/.well-known/${e}`:`/.well-known/${e}${t}`}(t,o.pathname),i?.metadataServerUrl??o)).search=o.search;let c=await tU(s,l,r);if(!i?.metadataUrl&&(a=c,n=o.pathname,!a||a.status>=400&&a.status<500&&"/"!==n)){let e=new URL(`/.well-known/${t}`,o);c=await tU(e,l,r)}return c}async function tj(e,{fetchFn:t=fetch,protocolVersion:r=v.LATEST_PROTOCOL_VERSION}={}){let i={"MCP-Protocol-Version":r,Accept:"application/json"};for(let{url:r,type:a}of function(e){let t="string"==typeof e?new URL(e):e,r="/"!==t.pathname,i=[];if(!r)return i.push({url:new URL("/.well-known/oauth-authorization-server",t.origin),type:"oauth"}),i.push({url:new URL("/.well-known/openid-configuration",t.origin),type:"oidc"}),i;let a=t.pathname;return a.endsWith("/")&&(a=a.slice(0,-1)),i.push({url:new URL(`/.well-known/oauth-authorization-server${a}`,t.origin),type:"oauth"}),i.push({url:new URL(`/.well-known/openid-configuration${a}`,t.origin),type:"oidc"}),i.push({url:new URL(`${a}/.well-known/openid-configuration`,t.origin),type:"oidc"}),i}(e)){let e=await t$(r,i,t);if(e){if(!e.ok){if(await e.body?.cancel(),e.status>=400&&e.status<500)continue;throw Error(`HTTP ${e.status} trying to load ${"oauth"===a?"OAuth":"OpenID provider"} metadata from ${r}`)}if("oauth"===a)return e5.parse(await e.json());return e7.parse(await e.json())}}}async function tL(e,t){let r,i;try{(r=await tP(e,{resourceMetadataUrl:t?.resourceMetadataUrl},t?.fetchFn)).authorization_servers&&r.authorization_servers.length>0&&(i=r.authorization_servers[0])}catch{}i||(i=String(new URL("/",e)));let a=await tj(i,{fetchFn:t?.fetchFn});return{authorizationServerUrl:i,authorizationServerMetadata:a,resourceMetadata:r}}async function tM(e,{metadata:t,clientInformation:r,redirectUrl:i,scope:a,state:n,resource:s}){let o;if(t){if(o=new URL(t.authorization_endpoint),!t.response_types_supported.includes(tA))throw Error(`Incompatible auth server: does not support response type ${tA}`);if(t.code_challenge_methods_supported&&!t.code_challenge_methods_supported.includes(t_))throw Error(`Incompatible auth server: does not support code challenge method ${t_}`)}else o=new URL("/authorize",e);let l=await e0(),c=l.code_verifier,u=l.code_challenge;return o.searchParams.set("response_type",tA),o.searchParams.set("client_id",r.client_id),o.searchParams.set("code_challenge",u),o.searchParams.set("code_challenge_method",t_),o.searchParams.set("redirect_uri",String(i)),n&&o.searchParams.set("state",n),a&&o.searchParams.set("scope",a),a?.includes("offline_access")&&o.searchParams.append("prompt","consent"),s&&o.searchParams.set("resource",s.href),{authorizationUrl:o,codeVerifier:c}}async function tq(e,{metadata:t,tokenRequestParams:r,clientInformation:i,addClientAuthentication:a,resource:n,fetchFn:s}){var o,l;let c,u=t?.token_endpoint?new URL(t.token_endpoint):new URL("/token",e),d=new Headers({"Content-Type":"application/x-www-form-urlencoded",Accept:"application/json"});n&&r.set("resource",n.href),a?await a(d,r,u,t):i&&function(e,t,r,i){let{client_id:a,client_secret:n}=t;switch(e){case"client_secret_basic":var s,o,l,c,u=a,d=n,p=r;if(!d)throw Error("client_secret_basic authentication requires a client_secret");let h=btoa(`${u}:${d}`);p.set("Authorization",`Basic ${h}`);return;case"client_secret_post":s=a,o=n,(l=i).set("client_id",s),o&&l.set("client_secret",o);return;case"none":c=a,i.set("client_id",c);return;default:throw Error(`Unsupported client authentication method: ${e}`)}}((o=i,l=t?.token_endpoint_auth_methods_supported??[],c=void 0!==o.client_secret,"token_endpoint_auth_method"in o&&o.token_endpoint_auth_method&&["client_secret_basic","client_secret_post","none"].includes(o.token_endpoint_auth_method)&&(0===l.length||l.includes(o.token_endpoint_auth_method))?o.token_endpoint_auth_method:0===l.length?c?"client_secret_basic":"none":c&&l.includes("client_secret_basic")?"client_secret_basic":c&&l.includes("client_secret_post")?"client_secret_post":l.includes("none")?"none":c?"client_secret_post":"none"),i,d,r);let p=await (s??fetch)(u,{method:"POST",headers:d,body:r});if(!p.ok)throw await tC(p);return te.parse(await p.json())}async function tF(e,{metadata:t,clientInformation:r,refreshToken:i,resource:a,addClientAuthentication:n,fetchFn:s}){let o=new URLSearchParams({grant_type:"refresh_token",refresh_token:i});return{refresh_token:i,...await tq(e,{metadata:t,tokenRequestParams:o,clientInformation:r,addClientAuthentication:n,resource:a,fetchFn:s})}}async function tV(e,t,{metadata:r,resource:i,authorizationCode:a,fetchFn:n}={}){let s,o=e.clientMetadata.scope;if(e.prepareTokenRequest&&(s=await e.prepareTokenRequest(o)),!s){if(!a)throw Error("Either provider.prepareTokenRequest() or authorizationCode is required");if(!e.redirectUrl)throw Error("redirectUrl is required for authorization_code flow");s=new URLSearchParams({grant_type:"authorization_code",code:a,code_verifier:await e.codeVerifier(),redirect_uri:String(e.redirectUrl)})}return tq(t,{metadata:r,tokenRequestParams:s,clientInformation:await e.clientInformation()??void 0,addClientAuthentication:e.addClientAuthentication,resource:i,fetchFn:n})}async function tK(e,{metadata:t,clientMetadata:r,scope:i,fetchFn:a}){let n;if(t){if(!t.registration_endpoint)throw Error("Incompatible auth server: does not support dynamic client registration");n=new URL(t.registration_endpoint)}else n=new URL("/register",e);let s=await (a??fetch)(n,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...r,...void 0!==i?{scope:i}:{}})});if(!s.ok)throw await tC(s);return tn.parse(await s.json())}class tH extends Error{constructor(e,t,r){super(`SSE error: ${t}`),this.code=e,this.event=r}}class tG{constructor(e,t){this._url=e,this._resourceMetadataUrl=void 0,this._scope=void 0,this._eventSourceInit=t?.eventSourceInit,this._requestInit=t?.requestInit,this._authProvider=t?.authProvider,this._fetch=t?.fetch,this._fetchWithInit=ez(t?.fetch,t?.requestInit)}async _authThenStart(){let e;if(!this._authProvider)throw new tE("No auth provider");try{e=await tT(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})}catch(e){throw this.onerror?.(e),e}if("AUTHORIZED"!==e)throw new tE;return await this._startOrAuth()}async _commonHeaders(){let e={};if(this._authProvider){let t=await this._authProvider.tokens();t&&(e.Authorization=`Bearer ${t.access_token}`)}this._protocolVersion&&(e["mcp-protocol-version"]=this._protocolVersion);let t=eJ(this._requestInit?.headers);return new Headers({...e,...t})}_startOrAuth(){let e=this?._eventSourceInit?.fetch??this._fetch??fetch;return new Promise((t,r)=>{this._eventSource=new eW(this._url.href,{...this._eventSourceInit,fetch:async(t,r)=>{let i=await this._commonHeaders();i.set("Accept","text/event-stream");let a=await e(t,{...r,headers:i});if(401===a.status&&a.headers.has("www-authenticate")){let{resourceMetadataUrl:e,scope:t}=tN(a);this._resourceMetadataUrl=e,this._scope=t}return a}}),this._abortController=new AbortController,this._eventSource.onerror=e=>{if(401===e.code&&this._authProvider)return void this._authThenStart().then(t,r);let i=new tH(e.code,e.message,e);r(i),this.onerror?.(i)},this._eventSource.onopen=()=>{},this._eventSource.addEventListener("endpoint",e=>{try{if(this._endpoint=new URL(e.data,this._url),this._endpoint.origin!==this._url.origin)throw Error(`Endpoint origin does not match connection origin: ${this._endpoint.origin}`)}catch(e){r(e),this.onerror?.(e),this.close();return}t()}),this._eventSource.onmessage=e=>{let t;try{t=v.JSONRPCMessageSchema.parse(JSON.parse(e.data))}catch(e){this.onerror?.(e);return}this.onmessage?.(t)}})}async start(){if(this._eventSource)throw Error("SSEClientTransport already started! If using Client class, note that connect() calls start() automatically.");return await this._startOrAuth()}async finishAuth(e){if(!this._authProvider)throw new tE("No auth provider");if("AUTHORIZED"!==await tT(this._authProvider,{serverUrl:this._url,authorizationCode:e,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit}))throw new tE("Failed to authorize")}async close(){this._abortController?.abort(),this._eventSource?.close(),this.onclose?.()}async send(e){if(!this._endpoint)throw Error("Not connected");try{let t=await this._commonHeaders();t.set("content-type","application/json");let r={...this._requestInit,method:"POST",headers:t,body:JSON.stringify(e),signal:this._abortController?.signal},i=await (this._fetch??fetch)(this._endpoint,r);if(!i.ok){let t=await i.text().catch(()=>null);if(401===i.status&&this._authProvider){let{resourceMetadataUrl:t,scope:r}=tN(i);this._resourceMetadataUrl=t,this._scope=r;let a=await tT(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit});if("AUTHORIZED"!==a)throw new tE;return this.send(e)}throw Error(`Error POSTing to endpoint (HTTP ${i.status}): ${t}`)}await i.body?.cancel()}catch(e){throw this.onerror?.(e),e}}setProtocolVersion(e){this._protocolVersion=e}}class tW extends TransformStream{constructor({onError:e,onRetry:t,onComment:r,maxBufferSize:i}={}){let a;super({start(n){a=eh({onEvent:e=>{n.enqueue(e)},onError(t){"function"==typeof e&&e(t),("terminate"===e||"max-buffer-size-exceeded"===t.type)&&n.error(t)},onRetry:t,onComment:r,maxBufferSize:i})},transform(e){a.feed(e)}})}}let tJ={initialReconnectionDelay:1e3,maxReconnectionDelay:3e4,reconnectionDelayGrowFactor:1.5,maxRetries:2};class tz extends Error{constructor(e,t){super(`Streamable HTTP error: ${t}`),this.code=e}}class tZ{constructor(e,t){this._hasCompletedAuthFlow=!1,this._url=e,this._resourceMetadataUrl=void 0,this._scope=void 0,this._requestInit=t?.requestInit,this._authProvider=t?.authProvider,this._fetch=t?.fetch,this._fetchWithInit=ez(t?.fetch,t?.requestInit),this._sessionId=t?.sessionId,this._reconnectionOptions=t?.reconnectionOptions??tJ}async _authThenStart(){let e;if(!this._authProvider)throw new tE("No auth provider");try{e=await tT(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit})}catch(e){throw this.onerror?.(e),e}if("AUTHORIZED"!==e)throw new tE;return await this._startOrAuthSse({resumptionToken:void 0})}async _commonHeaders(){let e={};if(this._authProvider){let t=await this._authProvider.tokens();t&&(e.Authorization=`Bearer ${t.access_token}`)}this._sessionId&&(e["mcp-session-id"]=this._sessionId),this._protocolVersion&&(e["mcp-protocol-version"]=this._protocolVersion);let t=eJ(this._requestInit?.headers);return new Headers({...e,...t})}async _startOrAuthSse(e){let{resumptionToken:t}=e;try{let r=await this._commonHeaders();r.set("Accept","text/event-stream"),t&&r.set("last-event-id",t);let i=await (this._fetch??fetch)(this._url,{method:"GET",headers:r,signal:this._abortController?.signal});if(!i.ok){if(await i.body?.cancel(),401===i.status&&this._authProvider)return await this._authThenStart();if(405===i.status)return;throw new tz(i.status,`Failed to open SSE stream: ${i.statusText}`)}this._handleSseStream(i.body,e,!0)}catch(e){throw this.onerror?.(e),e}}_getNextReconnectionDelay(e){return void 0!==this._serverRetryMs?this._serverRetryMs:Math.min(this._reconnectionOptions.initialReconnectionDelay*Math.pow(this._reconnectionOptions.reconnectionDelayGrowFactor,e),this._reconnectionOptions.maxReconnectionDelay)}_scheduleReconnection(e,t=0){let r=this._reconnectionOptions.maxRetries;if(t>=r)return void this.onerror?.(Error(`Maximum reconnection attempts (${r}) exceeded.`));let i=this._getNextReconnectionDelay(t);this._reconnectionTimeout=setTimeout(()=>{this._startOrAuthSse(e).catch(r=>{this.onerror?.(Error(`Failed to reconnect SSE stream: ${r instanceof Error?r.message:String(r)}`)),this._scheduleReconnection(e,t+1)})},i)}_handleSseStream(e,t,r){let i;if(!e)return;let{onresumptiontoken:a,replayMessageId:n}=t,s=!1,o=!1;(async()=>{try{let t=e.pipeThrough(new TextDecoderStream).pipeThrough(new tW({onRetry:e=>{this._serverRetryMs=e}})).getReader();for(;;){let{value:e,done:r}=await t.read();if(r)break;if((e.id&&(i=e.id,s=!0,a?.(e.id)),e.data)&&(!e.event||"message"===e.event))try{let t=v.JSONRPCMessageSchema.parse(JSON.parse(e.data));(0,v.isJSONRPCResultResponse)(t)&&(o=!0,void 0!==n&&(t.id=n)),this.onmessage?.(t)}catch(e){this.onerror?.(e)}}(r||s)&&!o&&this._abortController&&!this._abortController.signal.aborted&&this._scheduleReconnection({resumptionToken:i,onresumptiontoken:a,replayMessageId:n},0)}catch(e){if(this.onerror?.(Error(`SSE stream disconnected: ${e}`)),(r||s)&&!o&&this._abortController&&!this._abortController.signal.aborted)try{this._scheduleReconnection({resumptionToken:i,onresumptiontoken:a,replayMessageId:n},0)}catch(e){this.onerror?.(Error(`Failed to reconnect: ${e instanceof Error?e.message:String(e)}`))}}})()}async start(){if(this._abortController)throw Error("StreamableHTTPClientTransport already started! If using Client class, note that connect() calls start() automatically.");this._abortController=new AbortController}async finishAuth(e){if(!this._authProvider)throw new tE("No auth provider");if("AUTHORIZED"!==await tT(this._authProvider,{serverUrl:this._url,authorizationCode:e,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit}))throw new tE("Failed to authorize")}async close(){this._reconnectionTimeout&&(clearTimeout(this._reconnectionTimeout),this._reconnectionTimeout=void 0),this._abortController?.abort(),this.onclose?.()}async send(e,t){try{let{resumptionToken:r,onresumptiontoken:i}=t||{};if(r)return void this._startOrAuthSse({resumptionToken:r,replayMessageId:(0,v.isJSONRPCRequest)(e)?e.id:void 0}).catch(e=>this.onerror?.(e));let a=await this._commonHeaders();a.set("content-type","application/json"),a.set("accept","application/json, text/event-stream");let n={...this._requestInit,method:"POST",headers:a,body:JSON.stringify(e),signal:this._abortController?.signal},s=await (this._fetch??fetch)(this._url,n),o=s.headers.get("mcp-session-id");if(o&&(this._sessionId=o),!s.ok){let t=await s.text().catch(()=>null);if(401===s.status&&this._authProvider){if(this._hasCompletedAuthFlow)throw new tz(401,"Server returned 401 after successful authentication");let{resourceMetadataUrl:t,scope:r}=tN(s);this._resourceMetadataUrl=t,this._scope=r;let i=await tT(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetchWithInit});if("AUTHORIZED"!==i)throw new tE;return this._hasCompletedAuthFlow=!0,this.send(e)}if(403===s.status&&this._authProvider){let{resourceMetadataUrl:t,scope:r,error:i}=tN(s);if("insufficient_scope"===i){let i=s.headers.get("WWW-Authenticate");if(this._lastUpscopingHeader===i)throw new tz(403,"Server returned 403 after trying upscoping");r&&(this._scope=r),t&&(this._resourceMetadataUrl=t),this._lastUpscopingHeader=i??void 0;let a=await tT(this._authProvider,{serverUrl:this._url,resourceMetadataUrl:this._resourceMetadataUrl,scope:this._scope,fetchFn:this._fetch});if("AUTHORIZED"!==a)throw new tE;return this.send(e)}}throw new tz(s.status,`Error POSTing to endpoint: ${t}`)}if(this._hasCompletedAuthFlow=!1,this._lastUpscopingHeader=void 0,202===s.status){await s.body?.cancel(),(0,v.isInitializedNotification)(e)&&this._startOrAuthSse({resumptionToken:void 0}).catch(e=>this.onerror?.(e));return}let l=(Array.isArray(e)?e:[e]).filter(e=>"method"in e&&"id"in e&&void 0!==e.id).length>0,c=s.headers.get("content-type");if(l)if(c?.includes("text/event-stream"))this._handleSseStream(s.body,{onresumptiontoken:i},!1);else if(c?.includes("application/json")){let e=await s.json();for(let t of Array.isArray(e)?e.map(e=>v.JSONRPCMessageSchema.parse(e)):[v.JSONRPCMessageSchema.parse(e)])this.onmessage?.(t)}else throw await s.body?.cancel(),new tz(-1,`Unexpected content type: ${c}`);else await s.body?.cancel()}catch(e){throw this.onerror?.(e),e}}get sessionId(){return this._sessionId}async terminateSession(){if(this._sessionId)try{let e=await this._commonHeaders(),t={...this._requestInit,method:"DELETE",headers:e,signal:this._abortController?.signal},r=await (this._fetch??fetch)(this._url,t);if(await r.body?.cancel(),!r.ok&&405!==r.status)throw new tz(r.status,`Failed to terminate session: ${r.statusText}`);this._sessionId=void 0}catch(e){throw this.onerror?.(e),e}}setProtocolVersion(e){this._protocolVersion=e}get protocolVersion(){return this._protocolVersion}async resumeStream(e,t){await this._startOrAuthSse({resumptionToken:e,onresumptiontoken:t?.onresumptiontoken})}}var tY=e.i(243783);e.i(582482);var tQ=e.i(91022),tX=e.i(318905),t0=e.i(971619);function t1(e){if("string"!=typeof e)return e??null;try{return JSON.parse(e)}catch{return null}}function t2(e){return e instanceof Date?e.toISOString():"string"==typeof e&&Number.isFinite(Date.parse(e))?new Date(e).toISOString():null}function t3(e){let t;return{id:String(e.id),name:String(e.name),hostname:String(e.hostname),version:String(e.version),osVersion:String(e.osVersion),architecture:String(e.architecture),cpuModel:"string"==typeof e.cpuModel?e.cpuModel:null,memoryTotalBytes:"number"==typeof e.memoryTotalBytes?e.memoryTotalBytes:null,memoryFreeBytes:"number"==typeof e.memoryFreeBytes?e.memoryFreeBytes:null,diskTotalBytes:"number"==typeof e.diskTotalBytes?e.diskTotalBytes:null,diskFreeBytes:"number"==typeof e.diskFreeBytes?e.diskFreeBytes:null,capabilities:Array.isArray(e.capabilities)?e.capabilities:t1(e.capabilitiesJson)??[],baseRepoDirectory:"string"==typeof e.baseRepoDirectory?e.baseRepoDirectory:null,derivedDataLocationMode:String(e.derivedDataLocationMode),derivedDataPath:"string"==typeof e.derivedDataPath?e.derivedDataPath:null,buildsDirectory:"string"==typeof e.buildsDirectory?e.buildsDirectory:null,defaultBuildsDirectory:"string"==typeof e.defaultBuildsDirectory?e.defaultBuildsDirectory:null,effectiveBuildsDirectory:(0,t0.effectiveBuildsDirectory)(e),connectionStatus:null!==(t=t2(e.lastSeenAt))&&Date.now()-Date.parse(t)<=(0,a.agentOnlineWindowMs)(e)&&!e.disconnectedAt?"ONLINE":"OFFLINE",ipAddress:"string"==typeof e.ipAddress?e.ipAddress:null,lastSeenAt:t2(e.lastSeenAt),disconnectedAt:t2(e.disconnectedAt),createdAt:t2(e.createdAt),updatedAt:t2(e.updatedAt)}}function t4(e){let t=t3(e);return{agentId:t.id,baseRepoDirectory:t.baseRepoDirectory,buildsDirectory:t.buildsDirectory,defaultBuildsDirectory:t.defaultBuildsDirectory,effectiveBuildsDirectory:t.effectiveBuildsDirectory,derivedDataLocationMode:t.derivedDataLocationMode,derivedDataPath:t.derivedDataPath,updatedAt:t.updatedAt}}function t6(e){return{id:String(e.id),agentId:String(e.agentId),worktreeId:"string"==typeof e.worktreeId?e.worktreeId:null,codebaseId:"string"==typeof e.codebaseId?e.codebaseId:null,kind:String(e.kind),payload:t1(e.payload??e.payloadJson),status:String(e.status),idempotencyKey:String(e.idempotencyKey),result:t1(e.result??e.resultJson),error:"string"==typeof e.error?e.error:null,timeoutSeconds:Number(e.timeoutSeconds),createdAt:t2(e.createdAt),startedAt:t2(e.startedAt),finishedAt:t2(e.finishedAt),updatedAt:t2(e.updatedAt)}}function t8(e){return JSON.parse(JSON.stringify(e))}function t5(e){let t=e._count,r=e.versions;return{id:String(e.id),name:String(e.name),description:String(e.description??""),enabled:!0===e.enabled,overlapPolicy:String(e.overlapPolicy),maxConcurrentRuns:Number(e.maxConcurrentRuns),activeVersionId:"string"==typeof e.activeVersionId?e.activeVersionId:null,draftSchemaVersion:Number(e.draftSchemaVersion),quickActionKind:String(e.quickActionKind??"NONE"),archivedAt:t2(e.archivedAt),versionCount:t?.versions??r?.length??0,runCount:t?.runs??0,createdAt:t2(e.createdAt),updatedAt:t2(e.updatedAt)}}function t9(e){return{id:String(e.id),workflowId:String(e.workflowId),version:Number(e.version),name:String(e.name),description:String(e.description??""),schemaVersion:Number(e.schemaVersion),contentHash:String(e.contentHash),definition:t1(e.definitionJson),publishedAt:t2(e.publishedAt)}}function t7(e){let t=e._count;return{id:String(e.id),displayNumber:Number(e.displayNumber),workflowId:String(e.workflowId),versionId:String(e.versionId),parentRunId:"string"==typeof e.parentRunId?e.parentRunId:null,triggerKind:String(e.triggerKind),triggerSubjectKey:String(e.triggerSubjectKey??""),triggerPayload:t1(e.triggerPayloadJson),status:String(e.status),phase:String(e.phase),generation:Number(e.generation),sessionData:t1(e.sessionDataJson),blockedReason:"string"==typeof e.blockedReason?e.blockedReason:null,error:"string"==typeof e.error?e.error:null,attemptCount:t?.attempts??e.attempts?.length??0,eventCount:t?.events??e.events?.length??0,queuedAt:t2(e.queuedAt),startedAt:t2(e.startedAt),pausedAt:t2(e.pausedAt),finishedAt:t2(e.finishedAt),updatedAt:t2(e.updatedAt)}}let re=e1.object({}),rt=e1.object({id:e1.string(),name:e1.string(),hostname:e1.string(),version:e1.string(),osVersion:e1.string(),architecture:e1.string(),cpuModel:e1.string().nullable(),memoryTotalBytes:e1.number().nullable(),memoryFreeBytes:e1.number().nullable(),diskTotalBytes:e1.number().nullable(),diskFreeBytes:e1.number().nullable(),capabilities:e1.array(e1.string()),baseRepoDirectory:e1.string().nullable(),derivedDataLocationMode:e1.enum(["DEFAULT","ABSOLUTE","RELATIVE"]),derivedDataPath:e1.string().nullable(),buildsDirectory:e1.string().nullable(),defaultBuildsDirectory:e1.string().nullable(),effectiveBuildsDirectory:e1.string().nullable(),connectionStatus:e1.enum(["ONLINE","OFFLINE"]),ipAddress:e1.string().nullable(),lastSeenAt:e1.string().nullable(),disconnectedAt:e1.string().nullable(),createdAt:e1.string(),updatedAt:e1.string()}),rr=e1.object({agentId:e1.string(),baseRepoDirectory:e1.string().nullable(),buildsDirectory:e1.string().nullable(),defaultBuildsDirectory:e1.string().nullable(),effectiveBuildsDirectory:e1.string().nullable(),derivedDataLocationMode:e1.enum(["DEFAULT","ABSOLUTE","RELATIVE"]),derivedDataPath:e1.string().nullable(),updatedAt:e1.string()}),ri=e1.object({id:e1.string(),agentId:e1.string(),worktreeId:e1.string().nullable(),codebaseId:e1.string().nullable(),kind:e1.string(),payload:e1.unknown(),status:e1.string(),idempotencyKey:e1.string(),result:e1.unknown().nullable(),error:e1.string().nullable(),timeoutSeconds:e1.number().int(),createdAt:e1.string(),startedAt:e1.string().nullable(),finishedAt:e1.string().nullable(),updatedAt:e1.string()}),ra=e1.object({id:e1.string(),jobId:e1.string(),sequence:e1.number().int(),stream:e1.string(),message:e1.string(),createdAt:e1.string()}),rn=e1.object({agentId:e1.string().min(1)});var rs=e.i(190714),ro=e.i(184015);let rl=e1.object({}),rc=e1.object({settings:e1.object({refreshIntervalSeconds:e1.number().int(),fetchIntervalSeconds:e1.number().int(),defaultJiraBranchRegex:e1.string(),updatedAt:e1.string()})}),ru=e1.object({agentId:e1.string().min(1),path:e1.string().nullable().default(null),requestId:e1.string().min(1)}),rd=e1.object({listing:e1.unknown()}),rp=e1.object({agentId:e1.string().min(1),folder:e1.string().min(1),requestId:e1.string().min(1)}),rh=e1.object({inspection:e1.unknown()}),rm=e1.object({codebaseIds:e1.array(e1.string().min(1)).min(1).max(500),requestId:e1.string().min(1)}),rf=e1.object({jobs:e1.array(e1.unknown()),skipped:e1.array(e1.object({codebaseId:e1.string(),reason:e1.string()}))}),rg=e1.object({codebaseId:e1.string().min(1),requestId:e1.string().min(1)}),ry=e1.object({state:e1.unknown()}),rv=e1.object({codebaseId:e1.string().min(1),stashOid:e1.string().regex(/^[0-9a-f]{40}(?:[0-9a-f]{24})?$/i),requestId:e1.string().min(1)}),rw=e1.object({diff:e1.unknown()});e.i(282790);var rb=e.i(474170);function rk(e){return e instanceof Date?e.toISOString():null}function rx(e){if("string"!=typeof e)return e??null;try{return JSON.parse(e)}catch{return null}}let rS=e1.object({id:e1.string(),clientRegistrationId:e1.string(),tokenMasked:e1.string(),topic:e1.string(),environment:e1.string(),supportedPushTypes:e1.array(e1.string()),displayName:e1.string(),deviceModel:e1.string().nullable(),osVersion:e1.string().nullable(),appVersion:e1.string().nullable(),appBuild:e1.string().nullable(),locale:e1.string().nullable(),pushMagicConfigured:e1.boolean(),status:e1.string(),invalidatedAt:e1.string().nullable(),lastFailureReason:e1.string().nullable(),lastFailureAt:e1.string().nullable(),lastRegisteredAt:e1.string(),lastSentAt:e1.string().nullable(),createdAt:e1.string(),updatedAt:e1.string()}),rI=e1.object({id:e1.string(),name:e1.string(),topic:e1.string(),environment:e1.string(),fingerprint:e1.string(),expiresAt:e1.string().nullable(),lastTestedAt:e1.string().nullable(),lastError:e1.string().nullable(),createdAt:e1.string(),updatedAt:e1.string()}),rE=e1.object({tokenConfigured:e1.boolean(),tokenTeamId:e1.string().nullable(),tokenKeyId:e1.string().nullable(),tokenPrivateKeyFingerprint:e1.string().nullable(),tokenConfiguredAt:e1.string().nullable(),tokenLastUsedAt:e1.string().nullable(),tokenLastError:e1.string().nullable(),certificates:e1.array(rI),updatedAt:e1.string()}),rA=e1.object({id:e1.string(),channelId:e1.string(),bundleId:e1.string(),environment:e1.string(),storagePolicy:e1.string(),createdAt:e1.string(),updatedAt:e1.string()}),r_=e1.object({id:e1.string(),name:e1.string(),editor:e1.unknown(),createdAt:e1.string(),updatedAt:e1.string()}),rC=e1.object({id:e1.string(),registrationId:e1.string().nullable(),topic:e1.string(),environment:e1.string(),status:e1.string(),apnsId:e1.string().nullable(),responseCode:e1.number().int().nullable(),reason:e1.string().nullable(),responseTimestamp:e1.string().nullable(),attempts:e1.number().int(),durationMs:e1.number().int().nullable(),createdAt:e1.string(),startedAt:e1.string().nullable(),finishedAt:e1.string().nullable()}),rT=e1.object({id:e1.string(),requestId:e1.string(),status:e1.string(),editor:e1.unknown(),payload:e1.unknown(),headers:e1.unknown(),targetMode:e1.string(),channelId:e1.string().nullable(),recipientCount:e1.number().int(),successCount:e1.number().int(),failureCount:e1.number().int(),error:e1.string().nullable(),createdAt:e1.string(),startedAt:e1.string().nullable(),finishedAt:e1.string().nullable(),updatedAt:e1.string(),deliveries:e1.array(rC)});function rR(e){return{id:String(e.id),requestId:String(e.requestId),status:String(e.status),editor:rx(e.editor??e.editorJson),payload:rx(e.payload??e.payloadJson),headers:rx(e.headers??e.headersJson),targetMode:String(e.targetMode),channelId:"string"==typeof e.channelId?e.channelId:null,recipientCount:Number(e.recipientCount),successCount:Number(e.successCount),failureCount:Number(e.failureCount),error:"string"==typeof e.error?e.error:null,createdAt:rk(e.createdAt),startedAt:rk(e.startedAt),finishedAt:rk(e.finishedAt),updatedAt:rk(e.updatedAt),deliveries:Array.isArray(e.deliveries)?e.deliveries.map(e=>({id:String(e.id),registrationId:"string"==typeof e.registrationId?e.registrationId:null,topic:String(e.topic),environment:String(e.environment),status:String(e.status),apnsId:"string"==typeof e.apnsId?e.apnsId:null,responseCode:"number"==typeof e.responseCode?e.responseCode:null,reason:"string"==typeof e.reason?e.reason:null,responseTimestamp:rk(e.responseTimestamp),attempts:Number(e.attempts),durationMs:"number"==typeof e.durationMs?e.durationMs:null,createdAt:rk(e.createdAt),startedAt:rk(e.startedAt),finishedAt:rk(e.finishedAt)})):[]}}let rD={requestId:e1.string().min(1),editor:e1.record(e1.string(),e1.unknown())},rN={requestId:e1.string().min(1),presetId:e1.string().min(1)},rO=e1.discriminatedUnion("targetMode",[e1.object({...rD,targetMode:e1.literal("DEVICES"),registrationIds:e1.array(e1.string().min(1)).min(1)}),e1.object({...rD,targetMode:e1.literal("ALL")}),e1.object({...rD,targetMode:e1.literal("BROADCAST"),channelId:e1.string().min(1)}),e1.object({...rD,targetMode:e1.literal("DIRECT"),directToken:e1.string().min(1),directTokenEncoding:e1.enum(["HEX","BASE64"]).default("HEX"),directEnvironment:e1.enum(["SANDBOX","PRODUCTION"]).default("SANDBOX")})]),rP=e1.discriminatedUnion("targetMode",[e1.object({...rN,targetMode:e1.literal("DEVICES"),registrationIds:e1.array(e1.string().min(1)).min(1)}),e1.object({...rN,targetMode:e1.literal("ALL")}),e1.object({...rN,targetMode:e1.literal("BROADCAST"),channelId:e1.string().min(1)}),e1.object({...rN,targetMode:e1.literal("DIRECT"),directToken:e1.string().min(1),directTokenEncoding:e1.enum(["HEX","BASE64"]).default("HEX"),directEnvironment:e1.enum(["SANDBOX","PRODUCTION"]).default("SANDBOX")})]);function r$(e){return{requestId:e.requestId,editor:e.editor,targetMode:e.targetMode,registrationIds:"DEVICES"===e.targetMode?e.registrationIds:void 0,channelId:"BROADCAST"===e.targetMode?e.channelId:void 0,directToken:"DIRECT"===e.targetMode?e.directToken:void 0,directTokenEncoding:"DIRECT"===e.targetMode?e.directTokenEncoding:void 0,directEnvironment:"DIRECT"===e.targetMode?e.directEnvironment:void 0}}let rU=e1.object({id:e1.string(),entryType:e1.enum(["CONSOLE","ANALYTICS","SEPARATOR"]),clientTime:e1.string(),receivedAt:e1.string(),deviceIp:e1.string().nullable(),message:e1.string().nullable(),level:e1.string().nullable(),category:e1.string().nullable(),eventName:e1.string().nullable(),eventKind:e1.string().nullable(),screenName:e1.string().nullable(),buildId:e1.string().nullable(),sessionId:e1.string().nullable(),attributes:e1.record(e1.string(),e1.unknown()),defaultParameters:e1.record(e1.string(),e1.unknown()),additionalParameters:e1.record(e1.string(),e1.unknown()),highlightColor:e1.string().nullable(),separatorKind:e1.string().nullable(),separatorName:e1.string().nullable()}),rB=e1.object({items:e1.array(rU),nextCursor:e1.string().nullable(),matchingCount:e1.number().int().nonnegative(),totalCount:e1.number().int().nonnegative()}),rj=rB.extend({separator:rU.nullable()}),rL=e1.object({first:e1.number().int().min(1).max(500).default(200),after:e1.string().nullable().default(null)}),rM=e1.object({field:e1.string().min(1),operator:e1.enum(["CONTAINS","DOES_NOT_CONTAIN","IS","IS_NOT","MATCHES_GLOB","MATCHES_REGEX","NO_REGEX_MATCH","IS_EMPTY","IS_NOT_EMPTY"]),value:e1.string().nullable().optional(),caseSensitive:e1.boolean().default(!1),sources:e1.array(e1.enum(["CONSOLE","ANALYTICS"])).optional()}),rq=e1.object({mode:e1.enum(["ALL","ANY"]),conditions:e1.array(rM).min(1).max(100)}),rF={search:e1.string().min(1).nullable().optional(),searchMode:e1.enum(["TEXT","GLOB","REGEX"]).default("TEXT"),caseSensitive:e1.boolean().default(!1),quickFilters:e1.record(e1.string(),e1.array(e1.string()).max(500)).nullable().optional(),advancedFilter:rq.nullable().optional()},rV=rL.extend(rF).refine(rW,{message:"At least one telemetry search filter is required"}),rK=rL.extend(rF),rH=e1.object({scope:e1.literal("MATCHING"),...rF}).refine(rW,{message:"At least one telemetry search filter is required"}),rG=e1.union([e1.object({scope:e1.literal("IDS"),ids:e1.array(e1.string().min(1)).min(1).max(1e3)}),rH,e1.object({scope:e1.literal("ALL"),includeSeparators:e1.boolean().default(!1)}),e1.object({scope:e1.literal("BEFORE_LATEST_SEPARATOR"),includeSeparators:e1.boolean().default(!1)})]);function rW(e){return!!(e.search||Object.values(e.quickFilters??{}).some(e=>e.length)||e.advancedFilter?.conditions.length)}function rJ(e,t){return{view:e,first:t.first,after:t.after,search:t.search,searchMode:t.searchMode??"TEXT",caseSensitive:t.caseSensitive??!1,quickFilters:t.quickFilters,advancedFilter:t.advancedFilter}}function rz(e,t,r){return[iP({name:`get_${r.plural}`,title:`Get ${r.label}`,description:`Fetch the newest ${r.label.toLocaleLowerCase()} with cursor pagination.`,inputSchema:rL,outputSchema:rB,annotations:iD,handler:r=>e.timeline(rJ(t,r))}),iP({name:`get_${r.singular}`,title:`Get ${r.singular.replaceAll("_"," ")}`,description:`Fetch one ${r.label.toLocaleLowerCase()} item by ID.`,inputSchema:e1.object({id:e1.string().min(1)}),outputSchema:e1.object({entry:rU.nullable()}),annotations:iD,handler:async({id:r})=>({entry:await e.entry(r,t)})}),iP({name:`search_${r.plural}`,title:`Search ${r.label}`,description:"Search with text, glob, regex, quick facets, or advanced filter conditions.",inputSchema:rV,outputSchema:rB,annotations:iD,handler:r=>e.timeline(rJ(t,r))}),iP({name:`get_${r.plural}_since_latest_separator`,title:`Get ${r.label} since latest separator`,description:"Fetch entries strictly newer than the latest global telemetry separator.",inputSchema:rK,outputSchema:rj,annotations:iD,handler:r=>e.timelineSinceLatestSeparator(rJ(t,r))}),iP({name:`get_${r.singular}_search_metadata`,title:`Get ${r.label} search metadata`,description:"Get searchable fields and current facet values.",inputSchema:e1.object({}),outputSchema:e1.object({fields:e1.array(e1.string()),facets:e1.record(e1.string(),e1.array(e1.string()))}),annotations:iD,handler:async()=>{let[r,i]=await Promise.all([e.fields(t),e.facets(t)]);return{fields:r,facets:i}}}),iP({name:`clear_${r.plural}`,title:`Clear ${r.label}`,description:"Clear explicit IDs, matching entries, all entries, or entries before the latest separator.",inputSchema:rG,outputSchema:e1.object({view:e1.enum(["CONSOLE","ANALYTICS","UNIFIED"]),scope:e1.enum(["IDS","MATCHING","ALL","BEFORE_LATEST_SEPARATOR"]),deletedCount:e1.number().int().nonnegative()}),annotations:iO,handler:async r=>{let i="MATCHING"===r.scope?r:null,a=await e.clearScoped({view:t,scope:r.scope,ids:"IDS"===r.scope?r.ids:null,includeSeparators:("ALL"===r.scope||"BEFORE_LATEST_SEPARATOR"===r.scope)&&r.includeSeparators,query:i?{search:i.search,searchMode:i.searchMode,caseSensitive:i.caseSensitive,quickFilters:i.quickFilters,advancedFilter:i.advancedFilter}:null});return{view:t,scope:r.scope,deletedCount:a}}})]}var rZ=e.i(885418),rY=e.i(586589),rQ=e.i(661983),rX=e.i(504173),r0=e.i(518733);function r1(e,t,r=null){let i=[...t.volumes].filter(e=>e.monitored).sort((e,t)=>e.freeBytes-t.freeBytes||e.id.localeCompare(t.id))[0],n=i&&i.totalBytes>0?i.freeBytes/i.totalBytes*100:null,s=null===t.agent.disconnectedAt&&null!==t.agent.lastSeenAt&&Date.now()-t.agent.lastSeenAt.getTime()<=(0,a.agentOnlineWindowMs)(t.agent);return{agent:{id:t.agent.id,name:t.agent.name,hostname:t.agent.hostname,connected:s,diskTotalBytes:t.agent.diskTotalBytes,diskFreeBytes:t.agent.diskFreeBytes},codebase:{agentId:t.agent.id},disk:{enabled:t.enabled,status:t.status,pressureMode:t.pressureMode,manualPressureMode:t.manualPressureMode,automaticPressureMode:t.automaticPressureMode,lastReportedAt:t.lastReportedAt,lastError:t.lastError,warnings:[...t.warnings],monitoredVolumeId:i?.id??null,freeBytes:i?.freeBytes??null,totalBytes:i?.totalBytes??null,freeGiB:i?i.freeBytes/0x40000000:null,freePercent:n,usedPercent:null===n?null:100-n,effectiveThresholdBytes:i?.effectiveThresholdBytes??null,normalThresholdGiB:e.normalThresholdGiB,pressureThresholdGiB:e.pressureThresholdGiB,pollIntervalSeconds:e.pollIntervalSeconds,staleAfterSeconds:e.staleAfterSeconds,changeReason:r,volumes:t.volumes.map(e=>({...e}))}}}function r2(e){return{enabled:e.disk.enabled,status:e.disk.status,pressureMode:e.disk.pressureMode,lastError:e.disk.lastError,warnings:e.disk.warnings,monitoredVolumeId:e.disk.monitoredVolumeId}}function r3(e){try{let t=JSON.parse(e??"[]");return Array.isArray(t)?t:[]}catch{return[]}}function r4(e,t){if(!Number.isFinite(e)||e<=0||e>1e6)throw Error(`${t} must be a positive finite GiB value`);return e}class r6{agentControl;constructor(e){this.agentControl=e,this.agentControl.registerCompletionObserver(e=>this.observeCompletion(e))}async settings(){let e=await (0,tY.getPrismaClient)(),t=await e.diskSpaceSettings.upsert({where:{id:"default"},create:{id:"default",normalThresholdGiB:rY.DEFAULT_DISK_SPACE_THRESHOLD_GIB,pressureThresholdGiB:rY.DEFAULT_DISK_SPACE_PRESSURE_THRESHOLD_GIB},update:{}});return{normalThresholdGiB:t.normalThresholdGiB,pressureThresholdGiB:t.pressureThresholdGiB,pollIntervalSeconds:rY.DISK_SPACE_POLL_INTERVAL_SECONDS,staleAfterSeconds:rY.DISK_SPACE_STALE_AFTER_SECONDS}}async updateSettings(e){let t=r4(e.normalThresholdGiB,"Normal disk threshold"),r=r4(e.pressureThresholdGiB,"Pressure disk threshold");if(r>=t)throw Error("Pressure disk threshold must be lower than the normal threshold");let i=await (0,tY.getPrismaClient)();for(let{agentId:e}of(await i.diskSpaceSettings.upsert({where:{id:"default"},create:{id:"default",normalThresholdGiB:t,pressureThresholdGiB:r},update:{normalThresholdGiB:t,pressureThresholdGiB:r}}),this.publish("settings","SETTINGS_UPDATED"),await i.agentDiskSpaceState.findMany({where:{enabled:!0},select:{agentId:!0}})))this.reconcileAgent(e);return this.settings()}async configuration(e){let t=await (0,tY.getPrismaClient)(),[r,i,a]=await Promise.all([t.agent.findUnique({where:{id:e}}),t.agentDiskSpaceState.findUnique({where:{agentId:e}}),t.worktree.findMany({where:{missingAt:null,codebase:{agentId:e}},select:{id:!0,folder:!0}})]);if(!r)throw Error("Agent not found");return{enabled:i?.enabled??!0,pollIntervalSeconds:rY.DISK_SPACE_POLL_INTERVAL_SECONDS,baseRepoDirectory:r.baseRepoDirectory,derivedDataLocationMode:r.derivedDataLocationMode,derivedDataPath:r.derivedDataPath,worktrees:a}}async report(e,t){let r=(0,rY.parseAgentDiskSpaceReport)(t),i=await (0,tY.getPrismaClient)(),[a,n]=await Promise.all([i.agent.findUnique({where:{id:e}}),i.worktree.findMany({where:{missingAt:null,codebase:{agentId:e}},include:{codebase:{select:{agentId:!0}}}})]);if(!a)throw Error("Agent not found");let s=new Date(r.observedAt),o=r.entries.map(e=>{let t=e.workspacePath?n.filter(t=>{var r,i;let a;return r=t.folder,i=e.workspacePath,i===(a="/"===r?r:r.replace(/\/+$/,""))||i.startsWith(`${a}/`)}).sort((e,t)=>t.folder.length-e.folder.length)[0]:null;return{...e,worktreeId:t?.id??null,worktreePath:t?(0,rX.worktreeDisplayPath)(t.folder,a.baseRepoDirectory):null}});await i.agentDiskSpaceState.upsert({where:{agentId:e},create:{agentId:e,volumesJson:JSON.stringify(r.volumes),entriesJson:JSON.stringify(o),warningsJson:JSON.stringify(r.warnings),lastReportedAt:s,lastError:null},update:{volumesJson:JSON.stringify(r.volumes),entriesJson:JSON.stringify(o),warningsJson:JSON.stringify(r.warnings),lastReportedAt:s,lastError:null}}),this.publish(e,"REPORT_RECEIVED"),this.reconcileAgent(e)}async overview(){let e=await (0,tY.getPrismaClient)();await e.derivedDataCleanupLease.deleteMany({where:{jobId:null,expiresAt:{lte:new Date}}});let[t,r,i]=await Promise.all([this.settings(),e.agent.findMany({orderBy:{name:"asc"},include:{diskSpaceState:!0}}),e.derivedDataCleanupLease.findMany({select:{agentId:!0}})]),a=new Set(i.map(e=>e.agentId));return{settings:t,agents:r.map(e=>{let r=e.diskSpaceState,i=r?.enabled??!0,n=r?.manualPressureMode??!1,s=r?.automaticPressureMode??!1,o=r?.lastReportedAt??null,l=!o||Date.now()-o.getTime()>1e3*t.staleAfterSeconds,c=(n||s?t.pressureThresholdGiB:t.normalThresholdGiB)*0x40000000,u=r3(r?.volumesJson),d=(0,rY.monitoredDiskSpaceVolumes)(u),p=d.some(e=>e.freeBytes<=0x40000000*t.pressureThresholdGiB),h=d.some(e=>e.freeBytes<c),m="IDLE";i?l?m="STALE":r?.lastError||0===u.length&&r3(r?.warningsJson).length>0?m="ERROR":p?m="CRITICAL":a.has(e.id)?m="DELETING":n||s?m="PRESSURE":h&&(m="CLEANUP_REQUIRED"):m="DISABLED";let f=u.map(r=>{let o=(0,rY.isMonitoredDiskSpaceVolume)(r);return{...r,effectiveThresholdBytes:c,monitored:o,status:i?l?"STALE":o?r.freeBytes<=0x40000000*t.pressureThresholdGiB?"CRITICAL":a.has(e.id)&&r.freeBytes<c?"DELETING":n||s?"PRESSURE":r.freeBytes<c?"CLEANUP_REQUIRED":"IDLE":"IDLE":"DISABLED"}}),g=r3(r?.warningsJson);return i&&!l&&u.length>0&&0===d.length&&g.push("No Derived Data volume was reported, so free space is not being monitored for this agent"),{agent:e,enabled:i,status:m,pressureMode:n?"MANUAL":s?"AUTOMATIC":"NORMAL",manualPressureMode:n,automaticPressureMode:s,lastReportedAt:o?.toISOString()??null,lastError:r?.lastError??null,warnings:g,volumes:f}})}}async agentView(e){let t=(await this.overview()).agents.find(t=>t.agent.id===e);if(!t)throw Error("Agent not found");return t}async snapshot(e,t=null){let r=await this.overview(),i=r.agents.find(t=>t.agent.id===e);if(!i)throw Error("Agent not found");return r1(r.settings,i,t)}async requestRefresh(e){let t=await this.agentView(e);if(!t.enabled)throw Error("Disk-space monitoring is disabled for this agent");let r=new Date().toISOString();return this.agentControl.requestDiskSpacePoll(e),{agentId:e,requestedAt:r,previousReportedAt:t.lastReportedAt}}async setMonitoring(e,t){let r=await (0,tY.getPrismaClient)();return await r.agent.findUniqueOrThrow({where:{id:e}}),await r.agentDiskSpaceState.upsert({where:{agentId:e},create:{agentId:e,enabled:t},update:{enabled:t,...!t?{manualPressureMode:!1,automaticPressureMode:!1}:{}}}),t||await r.derivedDataCleanupLease.deleteMany({where:{agentId:e,jobId:null}}),this.publish(e,"MONITORING_CHANGED"),this.agentControl.requestAgentConfigurationRefresh(e),this.agentView(e)}async setManualPressureMode(e,t){let r=await (0,tY.getPrismaClient)();return await r.agent.findUniqueOrThrow({where:{id:e}}),await r.agentDiskSpaceState.upsert({where:{agentId:e},create:{agentId:e,manualPressureMode:t},update:{manualPressureMode:t}}),this.publish(e,"MANUAL_PRESSURE_CHANGED"),this.reconcileAgent(e),this.agentView(e)}async assertWorktreeCanStart(e){let t=await (0,tY.getPrismaClient)();await t.derivedDataCleanupLease.deleteMany({where:{worktreeId:e,jobId:null,expiresAt:{lte:new Date}}});let[r,i]=await Promise.all([t.derivedDataCleanupLease.findUnique({where:{worktreeId:e}}),t.worktree.findUnique({where:{id:e},select:{codebase:{select:{agentId:!0}}}})]);if(r)throw Error("Derived Data cleanup is in progress for this worktree; try again shortly");i&&await this.assertAgentCanStart(i.codebase.agentId)}async assertAgentCanStart(e){let t=await (0,tY.getPrismaClient)(),[r,i]=await Promise.all([this.settings(),t.agentDiskSpaceState.findUnique({where:{agentId:e}})]);if(!(!i?.enabled||!i.lastReportedAt||i.lastError||Date.now()-i.lastReportedAt.getTime()>1e3*r.staleAfterSeconds)&&(0,rY.monitoredDiskSpaceVolumes)(r3(i.volumesJson)).some(e=>e.freeBytes<=0x40000000*r.pressureThresholdGiB))throw Error(`New builds, plans, and sessions are paused because this agent has ${r.pressureThresholdGiB} GiB or less free disk space`)}subscribe(){return rQ.agentEventBus.iterate(rQ.DISK_SPACE_CHANGED_TOPIC)}async reconcileAgent(e){let t=await (0,tY.getPrismaClient)();await t.derivedDataCleanupLease.deleteMany({where:{jobId:null,expiresAt:{lte:new Date}}});let[r,i,n,s,o]=await Promise.all([this.settings(),t.agentDiskSpaceState.findUnique({where:{agentId:e}}),t.derivedDataLock.findMany({where:{agentId:e},select:{path:!0}}),t.derivedDataCleanupLease.findFirst({where:{agentId:e}}),t.agent.findUnique({where:{id:e}})]);if(!i?.enabled||!i.lastReportedAt||i.lastError||s||!o||null!==o.disconnectedAt||null===o.lastSeenAt||Date.now()-o.lastSeenAt.getTime()>(0,a.agentOnlineWindowMs)(o)||!r3(o.capabilitiesJson).includes(rZ.BUILD_DATA_DELETE_JOB_KIND)||Date.now()-i.lastReportedAt.getTime()>1e3*r.staleAfterSeconds)return;let l=r3(i.entriesJson),c=r3(i.volumesJson),u=(0,rY.monitoredDiskSpaceVolumes)(c),d=l.map(e=>e.worktreeId).filter(e=>!!e),p=await (0,r0.executingResourcesByWorktree)(d),h=new Set(n.map(e=>e.path));l=l.filter(e=>"PROJECT"===e.kind&&!!e.worktreeId&&!h.has(e.path)&&(p.get(e.worktreeId)?.length??0)===0);let m=0x40000000*r.normalThresholdGiB,f=0x40000000*r.pressureThresholdGiB,y=u.filter(e=>e.freeBytes<m),v=e=>e.capacityId??e.id,w=new Map(c.map(e=>[e.id,v(e)])),b=e=>l.some(t=>w.get(t.volumeId)===v(e)),k=i.automaticPressureMode;if(!i.manualPressureMode){let r=y.length>0&&y.some(e=>!b(e)),a=k&&(0===y.length||y.every(e=>b(e)));r?k=!0:a&&(k=!1),k!==i.automaticPressureMode&&(await t.agentDiskSpaceState.update({where:{agentId:e},data:{automaticPressureMode:k}}),this.publish(e,"AUTOMATIC_PRESSURE_CHANGED"))}let x=i.manualPressureMode||k?f:m,S=new Set(u.filter(e=>e.freeBytes<x).map(v)),I=l.filter(e=>S.has(w.get(e.volumeId)??"")).sort((e,t)=>new Date(e.modifiedAt).getTime()-new Date(t.modifiedAt).getTime()||e.path.localeCompare(t.path))[0];if(!I?.worktreeId)return;try{await t.derivedDataCleanupLease.create({data:{worktreeId:I.worktreeId,agentId:e,path:I.path,source:"AUTOMATIC",expiresAt:new Date(Date.now()+6e5)}})}catch{return}let E=await (0,r0.executingResourcesByWorktree)([I.worktreeId]);if((E.get(I.worktreeId)?.length??0)>0){await t.derivedDataCleanupLease.deleteMany({where:{worktreeId:I.worktreeId,jobId:null}}),this.publish(e,"CLEANUP_SKIPPED");return}try{var A;let r=await this.agentControl.createJob({agentId:e,kind:rZ.BUILD_DATA_DELETE_JOB_KIND,payload:{source:"AUTOMATIC",targets:[{path:I.path,rootPath:I.rootPath,name:I.name,kind:I.kind,worktreeId:I.worktreeId,worktreePath:I.worktreePath}]},idempotencyKey:`disk-space:auto:${(A=I.path,(0,g.createHash)("sha256").update(e).update("\0").update(A).digest("base64url"))}:${(0,g.randomUUID)()}`,timeoutSeconds:600,visibility:"SYSTEM"});await t.derivedDataCleanupLease.update({where:{worktreeId:I.worktreeId},data:{jobId:r.id}}),this.publish(e,"CLEANUP_STARTED")}catch(r){await t.derivedDataCleanupLease.deleteMany({where:{worktreeId:I.worktreeId}}),await t.agentDiskSpaceState.update({where:{agentId:e},data:{lastError:r instanceof Error?r.message:String(r)}}),this.publish(e,"CLEANUP_START_FAILED")}}async observeCompletion(e){if(e.kind!==rZ.BUILD_DATA_DELETE_JOB_KIND)return;let t="USER",r=[];try{let i=(0,rZ.buildDataDeletePayload)(JSON.parse(e.payloadJson));t=i.source,r=i.targets}catch{}let i=await (0,tY.getPrismaClient)(),a=await i.derivedDataCleanupLease.deleteMany({where:{jobId:e.id}});if("AUTOMATIC"===t&&"SUCCEEDED"!==e.status&&await i.agentDiskSpaceState.updateMany({where:{agentId:e.agentId},data:{lastError:e.error||"Automatic Derived Data cleanup failed"}}),a.count||"AUTOMATIC"===t){let i=[];if("AUTOMATIC"===t&&e.resultJson)try{i=(0,rZ.parseBuildDataDeleteResult)(JSON.parse(e.resultJson)).deleted}catch{}this.publish(e.agentId,"CLEANUP_COMPLETED","AUTOMATIC"===t?{jobId:e.id,status:e.status,source:t,error:e.error,targets:r,deleted:i}:null),this.agentControl.requestDiskSpacePoll(e.agentId)}}publish(e,t,r=null){rQ.agentEventBus.publish(rQ.DISK_SPACE_CHANGED_TOPIC,{diskSpaceChanged:e,diskSpaceChange:{id:(0,g.randomUUID)(),reason:t,cleanup:r}}),rQ.agentEventBus.publish(rQ.SIDEBAR_STATUS_CHANGED_TOPIC,{sidebarStatusChanged:!0}),rQ.agentEventBus.publish(rQ.POLLING_CHANGED_TOPIC,{pollingOperationChanged:`agent-disk-space:${e}`})}}let r8=e1.object({normalThresholdGiB:e1.number(),pressureThresholdGiB:e1.number(),pollIntervalSeconds:e1.number().int(),staleAfterSeconds:e1.number().int()}),r5=e1.object({id:e1.string(),name:e1.string(),hostname:e1.string(),connected:e1.boolean(),diskTotalBytes:e1.number().nullable(),diskFreeBytes:e1.number().nullable()}),r9=e1.enum(["DISABLED","STALE","IDLE","CLEANUP_REQUIRED","DELETING","PRESSURE","CRITICAL","ERROR"]),r7=e1.object({id:e1.string(),capacityId:e1.string(),totalBytes:e1.number(),freeBytes:e1.number(),roles:e1.array(e1.enum(["MAIN","BASE_REPO","DERIVED_DATA"])),paths:e1.array(e1.string()),status:r9,effectiveThresholdBytes:e1.number(),monitored:e1.boolean()}),ie=e1.object({enabled:e1.boolean(),status:r9,pressureMode:e1.enum(["NORMAL","MANUAL","AUTOMATIC"]),manualPressureMode:e1.boolean(),automaticPressureMode:e1.boolean(),lastReportedAt:e1.string().nullable(),lastError:e1.string().nullable(),warnings:e1.array(e1.string()),monitoredVolumeId:e1.string().nullable(),freeBytes:e1.number().nullable(),totalBytes:e1.number().nullable(),freeGiB:e1.number().nullable(),freePercent:e1.number().nullable(),usedPercent:e1.number().nullable(),effectiveThresholdBytes:e1.number().nullable(),normalThresholdGiB:e1.number(),pressureThresholdGiB:e1.number(),pollIntervalSeconds:e1.number().int(),staleAfterSeconds:e1.number().int(),changeReason:e1.string().nullable(),volumes:e1.array(r7)}),it=e1.object({agent:r5,codebase:e1.object({agentId:e1.string()}),disk:ie}),ir=e1.object({agentId:e1.string().min(1)});var ii=e.i(497800),ia=e.i(835544);function is(e,t){let r=new Set([...e.nodes.map(({id:e})=>e),...e.triggers.map(({id:e})=>e)]);for(let e=1;;e+=1){let i=`${t}-${e}`;if(!r.has(i))return i}}function io(e,t){return e.nodes.find(e=>e.id===t)??e.triggers.find(e=>e.id===t)}function il(e){return(0,ia.isChoiceTriggerKind)(e.kind)?(0,ii.workflowTriggerChoices)(e.config).map(({key:e})=>e):(0,ia.workflowStaticSourceHandles)(e.kind)}function ic(e,t){if(t.config)return t.config;if(!t.configPatch)return e;let r={...e};for(let[e,i]of Object.entries(t.configPatch))null===i?delete r[e]:r[e]=i;return r}function iu(e,t){let r=io(e,t.source);if(!r)throw Error(`${t.source} is not in this workflow`);if(!e.nodes.some(({id:e})=>e===t.target))throw Error(`${t.target} is not a step — triggers cannot have incoming connections`);let i=il(r),a=t.sourceHandle??i[0];if(!a)throw Error(`${t.source} offers no connectors yet — a choice trigger needs its options set first`);if(!i.includes(a))throw Error(`${t.source} has no ${a} connector; it offers ${i.join(", ")}`);let n=t.targetHandle??"input",s=e.edges.find(e=>e.source===t.source&&e.target===t.target&&e.sourceHandle===a);if(s)return{definition:e,edgeId:s.id};let o=function(e){let t=new Set(e.edges.map(({id:e})=>e));for(let e=1;;e+=1){let r=`edge-${e}`;if(!t.has(r))return r}}(e);return{definition:{...e,edges:[...e.edges,{id:o,source:t.source,target:t.target,sourceHandle:a,targetHandle:n}]},edgeId:o}}let id={workflow:[{name:"id",description:"Workflow definition id"},{name:"name",description:"Workflow name"},{name:"runId",description:"Current run id"},{name:"startedAt",description:"Run start timestamp"},{name:"trigger",description:"Trigger that started the run"}],repo:[{name:"id",description:"Repository id"},{name:"githubId",description:"GitHub repository id"},{name:"owner",description:"Repository owner / organization"},{name:"name",description:"Repository name"},{name:"url",description:"Repository URL"},{name:"canonicalOrigin",description:"Normalized repository origin"},{name:"displayOrigin",description:"Human-readable repository origin"},{name:"defaultBranch",description:"Repository default branch"}],codebase:[{name:"id",description:"Codebase id"},{name:"agentId",description:"Owning agent id"},{name:"folder",description:"Codebase filesystem path"},{name:"branch",description:"Current branch"},{name:"headSha",description:"HEAD commit SHA"},{name:"dirty",description:"Whether the working tree has changes"},{name:"branches",description:"Local and remote Git branches"},{name:"branchesTruncated",description:"Whether branch results were truncated"},{name:"stashes",description:"Git stashes"},{name:"stashesTruncated",description:"Whether stash results were truncated"},{name:"remoteBranches",description:"Known remote branches"}],agent:[{name:"id",description:"Owning agent id"},{name:"name",description:"Agent display name"},{name:"hostname",description:"Agent hostname"},{name:"connected",description:"Whether the agent is connected"},{name:"diskTotalBytes",description:"Root disk capacity in bytes"},{name:"diskFreeBytes",description:"Available disk space in bytes"},{name:"memoryFreeBytes",description:"Available memory in bytes"}],disk:[{name:"enabled",description:"Whether disk monitoring is enabled"},{name:"status",description:"Current disk monitor status"},{name:"pressureMode",description:"Normal, manual, or automatic pressure mode"},{name:"manualPressureMode",description:"Whether manual pressure mode is enabled"},{name:"automaticPressureMode",description:"Whether automatic pressure mode is active"},{name:"lastReportedAt",description:"Timestamp of the latest accepted disk report"},{name:"lastError",description:"Latest monitor or cleanup error"},{name:"warnings",description:"Current disk report warnings"},{name:"monitoredVolumeId",description:"Least-free monitored Derived Data volume id"},{name:"freeBytes",description:"Monitored Derived Data free bytes"},{name:"totalBytes",description:"Monitored Derived Data total bytes"},{name:"freeGiB",description:"Monitored Derived Data free space in GiB"},{name:"freePercent",description:"Monitored Derived Data free percentage"},{name:"usedPercent",description:"Monitored Derived Data used percentage"},{name:"effectiveThresholdBytes",description:"Current cleanup threshold in bytes"},{name:"normalThresholdGiB",description:"Global normal threshold in GiB"},{name:"pressureThresholdGiB",description:"Global pressure threshold in GiB"},{name:"pollIntervalSeconds",description:"Agent disk report cadence"},{name:"staleAfterSeconds",description:"Age at which a report is stale"},{name:"changeReason",description:"Internal reason for the monitor event"},{name:"volumes",description:"All reported volumes and their monitor status"}],cleanup:[{name:"jobId",description:"Automatic cleanup agent job id"},{name:"status",description:"Automatic cleanup terminal status"},{name:"source",description:"Cleanup source"},{name:"error",description:"Cleanup error, if any"},{name:"targets",description:"Derived Data entries selected for cleanup"},{name:"deleted",description:"Derived Data entries reported deleted"}],ticket:[{name:"key",description:"Jira issue key (e.g. AIDE-42)"},{name:"projectKey",description:"Jira project key"},{name:"title",description:"Issue summary / title"},{name:"type",description:"Issue type (Bug, Story, …)"},{name:"status",description:"Workflow status name"},{name:"statusId",description:"Workflow status id"},{name:"statusCategory",description:"Status category (To Do, Done, …)"},{name:"assignee",description:"Assigned user"},{name:"assigneeAccountId",description:"Assigned Jira account id"},{name:"labels",description:"Issue labels"},{name:"sprintNames",description:"Sprints containing the issue"},{name:"url",description:"Jira issue URL"}],pr:[{name:"id",description:"Pull request id"},{name:"number",description:"Pull request number"},{name:"state",description:"Open / closed / merged state"},{name:"merged",description:"Whether the pull request was merged"},{name:"title",description:"Pull request title"},{name:"url",description:"Pull request URL"},{name:"labels",description:"Pull request labels"},{name:"isDraft",description:"Whether the pull request is a draft"},{name:"headBranch",description:"Pull request head branch"},{name:"headRefName",description:"Pull request head ref"},{name:"headSha",description:"Pull request head commit SHA"},{name:"baseBranch",description:"Pull request base branch"},{name:"reviewDecision",description:"Latest review decision"},{name:"pipelineStatus",description:"Combined pull request check status"},{name:"pipelines",description:"CI pipelines linked to the pull request"},{name:"reviewThreads",description:"Pull request review threads"},{name:"mergeable",description:"Pull request mergeability"},{name:"repositoryGithubId",description:"GitHub repository id"},{name:"repositoryNameWithOwner",description:"GitHub owner and repository name"},{name:"jiraKey",description:"Jira key linked to the pull request"},{name:"unresolvedThreads",description:"Unresolved review threads"}],worktree:[{name:"id",description:"Worktree id"},{name:"branch",description:"Worktree branch"},{name:"baseBranch",description:"Base branch the work targets"},{name:"path",description:"Filesystem path"},{name:"headSha",description:"Worktree HEAD commit SHA"},{name:"pushStatus",description:"Push readiness status"},{name:"upstream",description:"Tracked upstream branch"},{name:"syncState",description:"Relationship to the tracked branch"},{name:"ahead",description:"Commits ahead of upstream"},{name:"behind",description:"Commits behind upstream"},{name:"baseAhead",description:"Commits ahead of the base branch"},{name:"baseBehind",description:"Commits behind the base branch"},{name:"commits",description:"Commits on the branch"},{name:"changes",description:"Pending file changes"},{name:"branchChanges",description:"Files changed from the base branch"},{name:"commitsTruncated",description:"Whether commit results were truncated"},{name:"changesTruncated",description:"Whether pending changes were truncated"},{name:"branchChangesTruncated",description:"Whether branch change results were truncated"},{name:"dirty",description:"Whether the working tree has changes"},{name:"branches",description:"Local and remote Git branches"},{name:"branchesTruncated",description:"Whether branch results were truncated"},{name:"stashes",description:"Git stashes"},{name:"stashesTruncated",description:"Whether stash results were truncated"},{name:"rebaseInProgress",description:"Whether a rebase is in progress"},{name:"hasConflicts",description:"Whether Git reports conflicts"},{name:"conflicted",description:"Whether an inspection found conflicts"},{name:"conflicts",description:"Conflicting files"},{name:"missingAt",description:"When the worktree was found missing"},{name:"dirtySince",description:"When the worktree became dirty"}],pipeline:[{name:"id",description:"CI pipeline id"},{name:"runId",description:"CI run id"},{name:"workflowId",description:"CI workflow id"},{name:"name",description:"CI workflow name"},{name:"displayTitle",description:"CI run display title"},{name:"status",description:"Run status"},{name:"conclusion",description:"Run conclusion"},{name:"headBranch",description:"Branch built by the CI run"},{name:"headSha",description:"Commit built by the CI run"},{name:"pullRequests",description:"Pull requests linked to the CI run"},{name:"url",description:"CI run URL"},{name:"failedJobs",description:"Failed jobs"},{name:"jobs",description:"Jobs in the CI run"},{name:"checkSuiteId",description:"GitHub check suite id"},{name:"runNumber",description:"GitHub Actions run number"},{name:"runAttempt",description:"GitHub Actions run attempt"},{name:"jiraKey",description:"Jira key inferred from the run"}],build:[{name:"id",description:"Build id"},{name:"status",description:"Build status"},{name:"action",description:"Build action"},{name:"error",description:"Build error, if any"},{name:"artifactDirectory",description:"Build artifact directory"},{name:"testSummary",description:"Test result summary"},{name:"tests",description:"Individual test results"},{name:"coverageSummary",description:"Coverage summary"},{name:"coverageFiles",description:"Per-file coverage results"},{name:"changedCoverageFiles",description:"Coverage for files changed on the branch"},{name:"artifacts",description:"Exported build artifacts"},{name:"exportId",description:"Build export id"}],run:[{name:"id",description:"Agent run id"},{name:"kind",description:"Run kind (PLAN / SESSION)"},{name:"status",description:"Run status"},{name:"phase",description:"Run phase"},{name:"origin",description:"Run origin"},{name:"provider",description:"AI provider"},{name:"model",description:"AI model"},{name:"branch",description:"Branch used by the run"},{name:"finalOutput",description:"Final output text"},{name:"error",description:"Run error, if any"},{name:"usage",description:"Token usage and cost"},{name:"questions",description:"Questions asked by the run"},{name:"events",description:"Run events"},{name:"links",description:"Resources linked to the run"}],steps:[{name:"status",description:"Step completion status"},{name:"output",description:"Step output payload"},{name:"answer",description:"Human answer for the step"},{name:"snapshotId",description:"Captured snapshot id"},{name:"items",description:"Items produced for iteration"},{name:"commandRunId",description:"Command run id"},{name:"displayNumber",description:"Resource display number"}],comment:[{name:"id",description:"Comment id"},{name:"body",description:"Comment body"},{name:"author",description:"Comment author"}],push:[{name:"ref",description:"Pushed Git ref"},{name:"before",description:"Commit before the push"},{name:"after",description:"Commit after the push"}],job:[{name:"id",description:"Job id"},{name:"name",description:"Job name"},{name:"status",description:"Job status"},{name:"url",description:"Job URL"},{name:"runAttempt",description:"Workflow run attempt"}]},ip=new Map(Object.entries(id).flatMap(([e,t])=>t.map(t=>[`${e}.${t.name}`,t.description])));function ih(e){return e.split(".")[0]??e}let im=e1.object({workflowId:e1.string().min(1).describe("Workflow id.")}),ig=e1.object({x:e1.number(),y:e1.number()}).describe("Canvas position. Presentation only — omit it and a sensible spot is chosen."),iy=e1.record(e1.string(),e1.unknown()).describe("Config object for this kind. Call describe_workflow_kind for its schema. A value may be a constant, a session binding `{source:'SESSION',path:'ticket.key'}`, or a string with `{{ticket.key}}` interpolation."),iv=e1.array(e1.string()).max(100).describe("Extra session paths this step guarantees, on top of what its kind always provides. Required when a step writes to a config-chosen path — e.g. a CONTROL_SET_VARIABLE with `path: 'checks.ready'` must declare ['checks.ready'], or a later step binding it fails validation with REQUIREMENT_UNSATISFIED."),iw=e1.array(e1.string()).max(100).describe("Extra session paths this step demands, on top of its kind's own. Publishing fails unless every trigger that reaches the step guarantees them."),ib=e1.object({severity:e1.enum(["ERROR","WARNING"]),code:e1.string(),message:e1.string(),nodeId:e1.string().nullable(),triggerId:e1.string().nullable(),path:e1.string().nullable()}),ik=e1.object({workflowId:e1.string(),definition:e1.unknown().describe("The saved draft definition."),valid:e1.boolean().describe("Whether the draft would publish. Warnings do not block."),diagnostics:e1.array(ib),nodeId:e1.string().nullable().describe("Id of a step this call created."),triggerId:e1.string().nullable().describe("Id of a trigger this call created."),edgeId:e1.string().nullable().describe("Id of a connection this call created.")}),ix=e1.object({id:e1.string(),name:e1.string(),description:e1.string(),enabled:e1.boolean(),overlapPolicy:e1.string(),maxConcurrentRuns:e1.number(),activeVersionId:e1.string().nullable(),draftSchemaVersion:e1.number(),quickActionKind:e1.enum(["STANDARD","MERGE_CONFLICT","GITHUB_ACTIONS","NONE"]),archivedAt:e1.string().nullable(),versionCount:e1.number(),runCount:e1.number(),createdAt:e1.string().nullable(),updatedAt:e1.string().nullable()}),iS=e1.object({id:e1.string(),displayNumber:e1.number(),workflowId:e1.string(),versionId:e1.string(),parentRunId:e1.string().nullable(),triggerKind:e1.string(),triggerSubjectKey:e1.string(),triggerPayload:e1.unknown(),status:e1.string(),phase:e1.string(),generation:e1.number(),sessionData:e1.unknown(),blockedReason:e1.string().nullable(),error:e1.string().nullable(),attemptCount:e1.number(),eventCount:e1.number(),queuedAt:e1.string().nullable(),startedAt:e1.string().nullable(),pausedAt:e1.string().nullable(),finishedAt:e1.string().nullable(),updatedAt:e1.string().nullable()}),iI=e1.object({id:e1.string(),runId:e1.string(),attemptId:e1.string().nullable(),sequence:e1.number(),type:e1.string(),message:e1.string(),detail:e1.unknown(),createdAt:e1.string().nullable()}),iE=e1.object({batchId:e1.string(),runId:e1.string().nullable(),status:e1.string(),createdAt:e1.string().nullable(),questions:e1.array(e1.object({id:e1.string(),header:e1.string().nullable(),prompt:e1.string(),multiSelect:e1.boolean(),allowCustom:e1.boolean(),options:e1.array(e1.object({label:e1.string(),description:e1.string().nullable()}))}))}),iA={readOnlyHint:!1,destructiveHint:!0,idempotentHint:!1,openWorldHint:!0};function i_(e,t){return!t||e.toLowerCase().includes(t.toLowerCase())}async function iC(e,t){let r=await e().get(t);if(!r)throw Error(`Workflow ${t} was not found`);return(0,ii.parseWorkflowDefinition)(JSON.parse(r.draftDefinitionJson))}async function iT(e,t,r,i={}){let a=e();await a.saveDraft({id:t,definition:r});let{valid:n,diagnostics:s}=await a.validateDraft(t);return{workflowId:t,definition:t8(r),valid:n,diagnostics:s.map(e=>({severity:e.severity,code:e.code,message:e.message,nodeId:e.nodeId??null,triggerId:e.triggerId??null,path:e.path??null})),nodeId:i.nodeId??null,triggerId:i.triggerId??null,edgeId:i.edgeId??null}}function iR(e){let t=ii.WORKFLOW_TRIGGER_CATALOG.find(t=>t.kind===e);if(!t)throw Error(`Unknown trigger kind ${e}`);return t}let iD={readOnlyHint:!0,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},iN={readOnlyHint:!1,destructiveHint:!1,idempotentHint:!0,openWorldHint:!1},iO={readOnlyHint:!1,destructiveHint:!0,idempotentHint:!0,openWorldHint:!1};function iP(e){return{name:e.name,title:e.title,description:e.description,inputSchema:e.inputSchema,outputSchema:e.outputSchema,annotations:e.annotations??iD,invoke:async t=>{let r=e.inputSchema.parse(t);return e.outputSchema.parse(await e.handler(r))}}}function i$(e){return{id:e.id,name:e.name,source:"BUILTIN",transport:null,url:null,error:null,tools:e.tools.map(e=>({name:e.name,title:e.title,description:e.description,inputSchema:b.toJSONSchema(e.inputSchema),outputSchema:b.toJSONSchema(e.outputSchema)})),children:e.children.map(i$)}}function iU(e){if(!e||"object"!=typeof e||Array.isArray(e))throw Error("Built-in tool output must be a JSON object");return{content:[{type:"text",text:JSON.stringify(e,null,2)}],structuredContent:e}}class iB{groups;indexed;byName;groupIds;constructor(e){this.groups=e,this.indexed=function e(t){return t.flatMap(t=>[...t.tools.map(e=>({groupId:t.id,definition:e})),...e(t.children)])}(e),this.byName=new Map,this.groupIds=new Set;const t=e=>{if(this.groupIds.has(e.id))throw Error(`Duplicate built-in tool group id: ${e.id}`);this.groupIds.add(e.id),e.children.forEach(t)};for(const r of(e.forEach(t),this.indexed)){if(this.byName.has(r.definition.name))throw Error(`Duplicate built-in MCP tool name: ${r.definition.name}`);this.byName.set(r.definition.name,r)}}definitions(){return this.indexed.map(({definition:e})=>e)}catalog(){return this.groups.map(i$)}hasGroup(e){return this.groupIds.has(e)}async call(e,t,r){let i=this.byName.get(t);if(!i||i.groupId!==e)throw Error(`Unknown built-in tool: ${t}`);return iU(await i.definition.invoke(r))}async callByName(e,t){let r=this.byName.get(e);if(!r)throw Error(`Unknown built-in tool: ${e}`);return iU(await r.definition.invoke(t))}}let ij="external:",iL=new Set(["accept","connection","content-length","content-type","host","last-event-id","mcp-protocol-version","mcp-session-id","transfer-encoding"]);function iM(e){if("STREAMABLE_HTTP"===e||"SSE"===e)return e;throw Error(`Unsupported MCP transport: ${e}`)}function iq(e,t){return{id:e.id,name:e.name,url:e.url,transport:iM(e.transport),toolNamePrefix:e.toolNamePrefix,headers:[...e.headers].sort((e,t)=>e.name.localeCompare(t.name)).map(e=>({id:e.id,name:e.name,valueConfigured:t})),createdAt:e.createdAt.toISOString(),updatedAt:e.updatedAt.toISOString()}}class iF{credentials;builtInTools;constructor(e,t,r={},i=new tQ.CredentialService){this.credentials=i,this.builtInTools=function(e){var t,r,i,a,n,s,o,l;let u,d,p,h,m=[(t=e.codebaseTools,r=e.codebases,u=[iP({name:"get_codebases",title:"Get codebases",description:"List every registered codebase checkout.",inputSchema:c.GetCodebasesInputSchema,outputSchema:c.GetCodebasesOutputSchema,annotations:iD,handler:async()=>({codebases:await t.list()})}),iP({name:"get_codebase",title:"Get codebase",description:"Get one registered codebase by ID or exact folder path.",inputSchema:c.GetCodebaseInputSchema,outputSchema:c.GetCodebaseOutputSchema,annotations:iD,handler:async e=>({codebase:"id"in e?await t.getById(e.id):e.agentId?await t.getByPath(e.path,e.agentId):await t.getByPath(e.path)})})],r&&(u.splice(1,0,iP({name:"search_codebases",title:"Search codebases",description:"Search registered codebases by text, agent, repository, branch, availability, or sync state.",inputSchema:c.SearchCodebasesInputSchema,outputSchema:c.SearchCodebasesOutputSchema,annotations:iD,handler:e=>t.search(e)})),u.push(iP({name:"get_codebase_repositories",title:"Get codebase repositories",description:"List canonical repositories and their checkout counts.",inputSchema:rl,outputSchema:c.GetCodebaseRepositoriesOutputSchema,annotations:iD,handler:async()=>({repositories:await t.repositories()})}),iP({name:"get_codebase_repository",title:"Get codebase repository",description:"Get a canonical repository and all of its registered checkouts.",inputSchema:c.GetCodebaseRepositoryInputSchema,outputSchema:c.GetCodebaseRepositoryOutputSchema,annotations:iD,handler:async({id:e})=>({repository:await t.repository(e)})}),iP({name:"get_codebase_settings",title:"Get codebase settings",description:"Get global codebase refresh, fetch, and branch settings.",inputSchema:rl,outputSchema:rc,annotations:iD,handler:async()=>{let e=await r.settings();return{settings:{refreshIntervalSeconds:e.refreshIntervalSeconds,fetchIntervalSeconds:e.fetchIntervalSeconds,defaultJiraBranchRegex:e.defaultJiraBranchRegex,updatedAt:e.updatedAt.toISOString()}}}}),iP({name:"browse_agent_directory",title:"Browse agent directory",description:"List candidate repository folders on an enrolled agent.",inputSchema:ru,outputSchema:rd,annotations:iD,handler:async({agentId:e,path:t,requestId:i})=>({listing:await r.browse(e,t,i)})}),iP({name:"inspect_agent_codebase",title:"Inspect agent codebase",description:"Inspect a repository folder without registering or changing it.",inputSchema:rp,outputSchema:rh,annotations:iD,handler:async({agentId:e,folder:t,requestId:i})=>({inspection:t8(await r.inspect(e,t,i))})}),iP({name:"refresh_codebases",title:"Refresh codebases",description:"Queue local metadata refreshes for registered codebases.",inputSchema:rm,outputSchema:rf,annotations:iN,handler:async({codebaseIds:e,requestId:t})=>{let i=await r.runOperation(ro.CODEBASE_REFRESH_JOB_KIND,e,t);return{jobs:i.jobs.map(e=>t6(e)),skipped:i.skipped}}}),iP({name:"fetch_codebases",title:"Fetch codebases",description:"Queue remote Git fetches and configured base-branch updates.",inputSchema:rm,outputSchema:rf,annotations:{...iN,openWorldHint:!0},handler:async({codebaseIds:e,requestId:t})=>{let i=await r.runOperation(ro.CODEBASE_FETCH_JOB_KIND,e,t);return{jobs:i.jobs.map(e=>t6(e)),skipped:i.skipped}}}),iP({name:"inspect_codebase_git_state",title:"Inspect codebase Git state",description:"Inspect branches, checkout locations, and stashes.",inputSchema:rg,outputSchema:ry,annotations:iD,handler:async({codebaseId:e,requestId:t})=>({state:await r.inspectGitState(e,t)})}),iP({name:"inspect_codebase_stash",title:"Inspect codebase stash",description:"Read a bounded textual patch for a Git stash.",inputSchema:rv,outputSchema:rw,annotations:iD,handler:async({codebaseId:e,stashOid:t,requestId:i})=>({diff:await r.inspectStash(e,t,i)})}))),{id:"builtin:codebases",name:"Codebases",tools:u,children:[]})];return e.builds&&m.push((i=e.builds,{id:"builtin:builds",name:"Builds",children:[],tools:[iP({name:"get_builds",title:"Get builds",description:"List immutable iOS build records.",inputSchema:rs.GetBuildsInputSchema,outputSchema:rs.GetBuildsOutputSchema,annotations:iD,handler:async e=>{let t=await i.builds(e);return{builds:t.items,nextCursor:t.nextCursor}}}),iP({name:"get_build",title:"Get build",description:"Get a build with sanitized logs.",inputSchema:rs.GetBuildInputSchema,outputSchema:rs.GetBuildOutputSchema,annotations:iD,handler:async({buildId:e,afterLogId:t,logLimit:r})=>{let a=await i.getBuild(e);if(!a)throw Error("Build not found");return{build:a,logs:await i.logChunks(e,t,r)}}}),iP({name:"get_build_configurations",title:"Get build configurations",description:"List build configurations for a worktree.",inputSchema:rs.GetBuildConfigurationsInputSchema,outputSchema:rs.GetBuildConfigurationsOutputSchema,annotations:iD,handler:async({worktreeId:e})=>({project:await i.projectForWorktree(e)})}),iP({name:"get_build_destinations",title:"Get build destinations",description:"Inspect compatible build destinations.",inputSchema:rs.GetBuildDestinationsInputSchema,outputSchema:rs.GetBuildDestinationsOutputSchema,annotations:iD,handler:async e=>({destinations:"buildId"in e?await i.destinationsForBuild(e.buildId,e.requestId):await i.destinations(e)})}),iP({name:"start_build",title:"Start build",description:"Queue an iOS build.",inputSchema:rs.StartBuildToolInputSchema,outputSchema:rs.StartBuildToolOutputSchema,annotations:iN,handler:async e=>({build:await i.startBuild(e)})}),iP({name:"cancel_build",title:"Cancel build",description:"Cancel an active build.",inputSchema:rs.CancelBuildToolInputSchema,outputSchema:rs.CancelBuildToolOutputSchema,annotations:iO,handler:async({buildId:e})=>({build:await i.cancelBuild(e)})}),iP({name:"run_build",title:"Run build",description:"Install and launch without rebuilding.",inputSchema:rs.RunBuildToolInputSchema,outputSchema:rs.RunBuildToolOutputSchema,annotations:iN,handler:async e=>({deployments:await i.runBuild(e)})}),iP({name:"export_build_archive",title:"Export build archive",description:"Export an archive to a local IPA folder.",inputSchema:rs.ExportBuildToolInputSchema,outputSchema:rs.ExportBuildToolOutputSchema,annotations:iN,handler:async e=>({export:await i.exportArchive(e)})})]})),e.telemetry&&e.pushNotifications&&m.push((a=e.telemetry,n=e.pushNotifications,(d=rz(a,"UNIFIED",{plural:"unified_events",singular:"unified_event",label:"Unified Events"})).push(iP({name:"get_telemetry_separators",title:"Get telemetry separators",description:"List global manual and build separators with optional filters.",inputSchema:e1.object({first:e1.number().int().min(1).max(500).default(100),after:e1.string().nullable().default(null),kind:e1.string().min(1).nullable().optional(),name:e1.string().min(1).nullable().optional(),buildId:e1.string().min(1).nullable().optional()}),outputSchema:e1.object({items:e1.array(rU),nextCursor:e1.string().nullable()}),annotations:iD,handler:e=>a.separators(e)}),iP({name:"add_telemetry_separator",title:"Add telemetry separator",description:"Add a global manual separator to all telemetry views.",inputSchema:e1.object({name:e1.string().max(100).nullable().default(null)}),outputSchema:e1.object({separator:rU}),annotations:{...iN,idempotentHint:!1},handler:async({name:e})=>({separator:await a.addSeparator(e)})}),iP({name:"get_telemetry_settings",title:"Get telemetry settings",description:"Get telemetry collection state and effective ingestion URLs.",inputSchema:e1.object({}),outputSchema:e1.object({settings:e1.object({localBaseUrlOverride:e1.string().nullable(),remoteBaseUrlOverride:e1.string().nullable(),consoleCollectionEnabled:e1.boolean(),analyticsCollectionEnabled:e1.boolean(),detectedLocalBaseUrl:e1.string(),detectedRemoteBaseUrl:e1.string(),effectiveLocalBaseUrl:e1.string(),effectiveRemoteBaseUrl:e1.string(),updatedAt:e1.string()})}),annotations:iD,handler:async()=>({settings:await a.settings()})})),{id:"builtin:debugging",name:"Debugging",tools:d,children:[{id:"builtin:debugging:console-logs",name:"Console Logs",tools:rz(a,"CONSOLE",{plural:"console_logs",singular:"console_log",label:"Console Logs"}),children:[]},{id:"builtin:debugging:analytics-events",name:"Analytics Events",tools:rz(a,"ANALYTICS",{plural:"analytics_events",singular:"analytics_event",label:"Analytics Events"}),children:[]},(p={...iN,openWorldHint:!0},{id:"builtin:debugging:push-notifications",name:"Push Notifications",children:[],tools:[iP({name:"get_push_notification_registrations",title:"Get push notification registrations",description:"List registered APNs devices with masked tokens.",inputSchema:e1.object({}),outputSchema:e1.object({registrations:e1.array(rS)}),annotations:iD,handler:async()=>({registrations:(await n.registrations()).map(e=>{let t,r;return t=Array.isArray(e.supportedPushTypes)?e.supportedPushTypes:rx(e.pushTypesJson),r="string"==typeof e.token?e.token:"",{id:String(e.id),clientRegistrationId:String(e.clientRegistrationId),tokenMasked:"string"==typeof e.tokenMasked?e.tokenMasked:r?`${r.slice(0,8)}…${r.slice(-8)}`:"—",topic:String(e.topic),environment:String(e.environment),supportedPushTypes:Array.isArray(t)?t:[],displayName:String(e.displayName),deviceModel:"string"==typeof e.deviceModel?e.deviceModel:null,osVersion:"string"==typeof e.osVersion?e.osVersion:null,appVersion:"string"==typeof e.appVersion?e.appVersion:null,appBuild:"string"==typeof e.appBuild?e.appBuild:null,locale:"string"==typeof e.locale?e.locale:null,pushMagicConfigured:!!e.pushMagic,status:String(e.status),invalidatedAt:rk(e.invalidatedAt),lastFailureReason:"string"==typeof e.lastFailureReason?e.lastFailureReason:null,lastFailureAt:rk(e.lastFailureAt),lastRegisteredAt:rk(e.lastRegisteredAt),lastSentAt:rk(e.lastSentAt),createdAt:rk(e.createdAt),updatedAt:rk(e.updatedAt)}})})}),iP({name:"get_push_notification_settings",title:"Get push notification settings",description:"Inspect APNs credential status without returning secrets.",inputSchema:e1.object({}),outputSchema:e1.object({settings:rE}),annotations:iD,handler:async()=>{var e;return{settings:{tokenConfigured:!!(e=await n.settings()).tokenConfigured,tokenTeamId:"string"==typeof e.tokenTeamId?e.tokenTeamId:null,tokenKeyId:"string"==typeof e.tokenKeyId?e.tokenKeyId:null,tokenPrivateKeyFingerprint:"string"==typeof e.tokenPrivateKeyFingerprint?e.tokenPrivateKeyFingerprint:null,tokenConfiguredAt:rk(e.tokenConfiguredAt),tokenLastUsedAt:rk(e.tokenLastUsedAt),tokenLastError:"string"==typeof e.tokenLastError?e.tokenLastError:null,certificates:Array.isArray(e.certificates)?e.certificates.map(e=>({id:String(e.id),name:String(e.name),topic:String(e.topic),environment:String(e.environment),fingerprint:String(e.fingerprint),expiresAt:rk(e.expiresAt),lastTestedAt:rk(e.lastTestedAt),lastError:"string"==typeof e.lastError?e.lastError:null,createdAt:rk(e.createdAt),updatedAt:rk(e.updatedAt)})):[],updatedAt:rk(e.updatedAt)}}}}),iP({name:"get_push_notification_channels",title:"Get push notification channels",description:"List configured APNs broadcast channels.",inputSchema:e1.object({}),outputSchema:e1.object({channels:e1.array(rA)}),annotations:iD,handler:async()=>({channels:(await n.channels()).map(e=>({id:String(e.id),channelId:String(e.channelId),bundleId:String(e.bundleId),environment:String(e.environment),storagePolicy:String(e.storagePolicy),createdAt:rk(e.createdAt),updatedAt:rk(e.updatedAt)}))})}),iP({name:"get_push_notification_presets",title:"Get push notification presets",description:"List saved, validated push editor presets.",inputSchema:e1.object({}),outputSchema:e1.object({presets:e1.array(r_)}),annotations:iD,handler:async()=>({presets:(await n.presets()).map(e=>({id:String(e.id),name:String(e.name),editor:rx(e.editor??e.editorJson),createdAt:rk(e.createdAt),updatedAt:rk(e.updatedAt)}))})}),iP({name:"get_push_notification_history",title:"Get push notification history",description:"List recent push batches and per-recipient delivery results.",inputSchema:e1.object({limit:e1.number().int().min(1).max(200).default(100)}),outputSchema:e1.object({batches:e1.array(rT)}),annotations:iD,handler:async({limit:e})=>({batches:(await n.history(e)).map(e=>rR(e))})}),iP({name:"get_push_notification_history_item",title:"Get push notification history item",description:"Get one push batch and all delivery results by ID.",inputSchema:e1.object({id:e1.string().min(1)}),outputSchema:e1.object({batch:rT.nullable()}),annotations:iD,handler:async({id:e})=>{let t=await n.historyItem(e);return{batch:t?rR(t):null}}}),iP({name:"preview_push_notification",title:"Preview push notification",description:"Validate an editor and return its final payload and APNs headers.",inputSchema:e1.object({editor:e1.record(e1.string(),e1.unknown())}),outputSchema:e1.object({editor:e1.unknown(),payload:e1.unknown(),headers:e1.record(e1.string(),e1.string()),byteLength:e1.number().int().nonnegative()}),annotations:iD,handler:({editor:e})=>(0,rb.validatePushEditor)(e)}),iP({name:"send_push_notification",title:"Send push notification",description:"Validate and queue a raw APNs editor payload for delivery.",inputSchema:rO,outputSchema:e1.object({batch:rT}),annotations:p,handler:async e=>({batch:rR(await n.send(r$(e)))})}),iP({name:"send_push_notification_preset",title:"Send push notification preset",description:"Load a saved preset by ID and queue it for APNs delivery.",inputSchema:rP,outputSchema:e1.object({batch:rT}),annotations:p,handler:async e=>{let t=await n.preset(e.presetId);if(!t)throw Error("Push notification preset not found");let r={...e,editor:rx(t.editorJson)};return{batch:rR(await n.send(r$(r)))}}}),iP({name:"resend_push_notification",title:"Resend push notification",description:"Queue a historical non-draft, non-direct batch again.",inputSchema:e1.object({id:e1.string().min(1),requestId:e1.string().min(1)}),outputSchema:e1.object({batch:rT}),annotations:p,handler:async({id:e,requestId:t})=>({batch:rR(await n.resend(e,t))})})]})]})),e.agents&&m.push((s=e.agents,{id:"builtin:agents",name:"Agents",children:[],tools:[iP({name:"get_agents",title:"Get agents",description:"List enrolled agents, capabilities, resources, and status.",inputSchema:re,outputSchema:e1.object({agents:e1.array(rt)}),annotations:iD,handler:async()=>({agents:(await s.listAgents()).map(e=>t3(e))})}),iP({name:"get_agent",title:"Get agent",description:"Get one enrolled agent by ID.",inputSchema:rn,outputSchema:e1.object({agent:rt.nullable()}),annotations:iD,handler:async({agentId:e})=>{let t=await s.getAgent(e);return{agent:t?t3(t):null}}}),iP({name:"get_agent_settings",title:"Get agent settings",description:"Get repository, build, and Derived Data paths for an agent.",inputSchema:rn,outputSchema:e1.object({settings:rr}),annotations:iD,handler:async({agentId:e})=>{let t=await s.getAgent(e);if(!t)throw Error("Agent not found");return{settings:t4(t)}}}),iP({name:"get_agent_jobs",title:"Get agent jobs",description:"List recent user-visible jobs for an agent.",inputSchema:e1.object({agentId:e1.string().min(1),limit:e1.number().int().min(1).max(200).default(50)}),outputSchema:e1.object({jobs:e1.array(ri)}),annotations:iD,handler:async({agentId:e,limit:t})=>({jobs:(await s.listJobs(e,t)).map(e=>t6(e))})}),iP({name:"get_agent_job",title:"Get agent job",description:"Get one agent job and its result by ID.",inputSchema:e1.object({jobId:e1.string().min(1)}),outputSchema:e1.object({job:ri.nullable()}),annotations:iD,handler:async({jobId:e})=>{let t=await s.getJob(e);return{job:t?t6(t):null}}}),iP({name:"get_agent_job_logs",title:"Get agent job logs",description:"Fetch ordered job logs after an optional sequence number.",inputSchema:e1.object({jobId:e1.string().min(1),afterSequence:e1.number().int().min(-1).default(-1)}),outputSchema:e1.object({logs:e1.array(ra)}),annotations:iD,handler:async({jobId:e,afterSequence:t})=>({logs:(await s.listLogs(e,t)).map(e=>({id:String(e.id),jobId:String(e.jobId),sequence:Number(e.sequence),stream:String(e.stream),message:String(e.message),createdAt:t2(e.createdAt)}))})}),iP({name:"update_agent_base_repo_directory",title:"Update agent base repository directory",description:"Set or reset the absolute base repository directory.",inputSchema:e1.object({agentId:e1.string().min(1),baseRepoDirectory:e1.string().min(1).nullable()}),outputSchema:e1.object({settings:rr}),annotations:iN,handler:async({agentId:e,baseRepoDirectory:t})=>({settings:t4(await s.updateBaseRepoDirectory(e,t))})}),iP({name:"update_agent_builds_directory",title:"Update agent builds directory",description:"Set or reset the absolute build-output directory.",inputSchema:e1.object({agentId:e1.string().min(1),buildsDirectory:e1.string().min(1).nullable()}),outputSchema:e1.object({settings:rr}),annotations:iN,handler:async({agentId:e,buildsDirectory:t})=>({settings:t4(await s.updateBuildsDirectory(e,t))})}),iP({name:"update_agent_derived_data_settings",title:"Update agent Derived Data settings",description:"Set default, absolute, or worktree-relative Derived Data paths.",inputSchema:e1.object({agentId:e1.string().min(1),mode:e1.enum(["DEFAULT","ABSOLUTE","RELATIVE"]),path:e1.string().min(1).nullable().default(null)}),outputSchema:e1.object({settings:rr}),annotations:iN,handler:async({agentId:e,mode:t,path:r})=>({settings:t4(await s.updateDerivedDataSettings(e,t,r))})}),iP({name:"request_agent_codebase_reconcile",title:"Request agent codebase reconcile",description:"Ask an online agent to reconcile its registered codebases.",inputSchema:rn,outputSchema:e1.object({requested:e1.boolean()}),annotations:iN,handler:async({agentId:e})=>({requested:await s.requestCodebaseReconcile([e])===1})}),iP({name:"cancel_agent_job",title:"Cancel agent job",description:"Cancel a queued or running agent job.",inputSchema:e1.object({jobId:e1.string().min(1)}),outputSchema:e1.object({job:ri}),annotations:iO,handler:async({jobId:e})=>({job:t6(await s.cancelJob(e))})})]})),e.diskSpace&&m.push((o=e.diskSpace,{id:"builtin:disk-space",name:"Disk Space",children:[],tools:[iP({name:"get_disk_space_overview",title:"Get disk-space overview",description:"Get global thresholds and canonical Derived Data disk snapshots for every agent.",inputSchema:e1.object({}),outputSchema:e1.object({settings:r8,agents:e1.array(it)}),annotations:iD,handler:async()=>{let e=await o.overview();return{settings:e.settings,agents:e.agents.map(t=>r1(e.settings,t))}}}),iP({name:"get_disk_space_settings",title:"Get disk-space settings",description:"Get global disk thresholds and report timing settings.",inputSchema:e1.object({}),outputSchema:e1.object({settings:r8}),annotations:iD,handler:async()=>({settings:await o.settings()})}),iP({name:"get_agent_disk_space",title:"Get agent disk space",description:"Get one agent's canonical Derived Data disk-space monitor snapshot.",inputSchema:ir,outputSchema:e1.object({snapshot:it}),annotations:iD,handler:async({agentId:e})=>({snapshot:await o.snapshot(e)})}),iP({name:"update_disk_space_settings",title:"Update disk-space settings",description:"Update the global normal and pressure free-space thresholds in GiB.",inputSchema:e1.object({normalThresholdGiB:e1.number().positive(),pressureThresholdGiB:e1.number().positive()}),outputSchema:e1.object({settings:r8}),annotations:iN,handler:async e=>({settings:await o.updateSettings(e)})}),iP({name:"set_agent_disk_space_monitoring",title:"Set agent disk-space monitoring",description:"Enable or disable Derived Data disk-space monitoring for an agent.",inputSchema:ir.extend({enabled:e1.boolean()}),outputSchema:e1.object({snapshot:it}),annotations:iN,handler:async({agentId:e,enabled:t})=>(await o.setMonitoring(e,t),{snapshot:await o.snapshot(e)})}),iP({name:"set_agent_disk_space_pressure_mode",title:"Set agent disk pressure mode",description:"Enable or clear manual disk pressure mode for an agent.",inputSchema:ir.extend({enabled:e1.boolean()}),outputSchema:e1.object({snapshot:it}),annotations:iN,handler:async({agentId:e,enabled:t})=>(await o.setManualPressureMode(e,t),{snapshot:await o.snapshot(e)})}),iP({name:"request_agent_disk_space_refresh",title:"Request agent disk-space refresh",description:"Ask an agent to collect and report disk-space telemetry immediately.",inputSchema:ir,outputSchema:e1.object({agentId:e1.string(),requestedAt:e1.string(),previousReportedAt:e1.string().nullable()}),annotations:iN,handler:async({agentId:e})=>o.requestRefresh(e)})]})),e.workflows&&m.push((l=e.workflows,h={id:"builtin:workflows:discovery",name:"Discovery",children:[],tools:[iP({name:"list_workflow_step_kinds",title:"List workflow step kinds",description:"Browse the step kinds a workflow can be built from, with a short description of each. Start here when authoring; use describe_workflow_kind for the config schema of one kind.",inputSchema:e1.object({category:e1.string().optional().describe("Restrict to one category, e.g. 'Jira' or 'Control flow'."),search:e1.string().optional().describe("Match against kind, label, category, and description.")}),outputSchema:e1.object({steps:e1.array(e1.object({kind:e1.string(),category:e1.string(),label:e1.string(),description:e1.string(),execution:e1.string(),requiredPaths:e1.array(e1.string()),providedPaths:e1.array(e1.string()),sourceHandles:e1.array(e1.string()),mutatesExternal:e1.boolean(),mutatesWorktree:e1.boolean()}))}),annotations:iD,handler:({category:e,search:t})=>({steps:ii.WORKFLOW_STEP_CATALOG.filter(r=>(!e||r.category===e)&&i_(`${r.kind} ${r.label} ${r.category} ${r.description}`,t)).map(e=>({kind:e.kind,category:e.category,label:e.label,description:e.description,execution:e.execution,requiredPaths:e.requiredPaths,providedPaths:e.providedPaths,sourceHandles:e.sourceHandles,mutatesExternal:e.mutatesExternal,mutatesWorktree:e.mutatesWorktree}))})}),iP({name:"list_workflow_trigger_kinds",title:"List workflow trigger kinds",description:"Browse the trigger kinds that can start a workflow, with what each one seeds into session data. Every workflow needs at least one trigger.",inputSchema:e1.object({category:e1.string().optional(),search:e1.string().optional()}),outputSchema:e1.object({triggers:e1.array(e1.object({kind:e1.string(),category:e1.string(),label:e1.string(),description:e1.string(),seedPaths:e1.array(e1.string()),sourceHandles:e1.array(e1.string())}))}),annotations:iD,handler:({category:e,search:t})=>({triggers:ii.WORKFLOW_TRIGGER_CATALOG.filter(r=>(!e||r.category===e)&&i_(`${r.kind} ${r.label} ${r.category} ${r.description}`,t)).map(e=>({kind:e.kind,category:e.category,label:e.label,description:e.description,seedPaths:e.seedPaths,sourceHandles:e.sourceHandles}))})}),iP({name:"describe_workflow_kind",title:"Describe a workflow step or trigger kind",description:"Full detail for one kind: long-form notes on preconditions and side effects, the JSON Schema for its config, the session paths it requires and provides, and the handles edges may leave it from.",inputSchema:e1.object({kind:e1.string().min(1).describe("A step or trigger kind.")}),outputSchema:e1.object({scope:e1.enum(["step","trigger"]),kind:e1.string(),category:e1.string(),label:e1.string(),description:e1.string(),details:e1.string(),execution:e1.string().nullable(),configSchema:e1.unknown(),requiredPaths:e1.array(e1.string()),providedPaths:e1.array(e1.string()),seedPaths:e1.array(e1.string()),sourceHandles:e1.array(e1.string()),mutatesExternal:e1.boolean(),mutatesWorktree:e1.boolean()}),annotations:iD,handler:({kind:e})=>{let t=ii.WORKFLOW_STEP_CATALOG.find(t=>t.kind===e);if(t)return{scope:"step",...t,configSchema:t8(t.configSchema),seedPaths:[]};let r=iR(e);return{scope:"trigger",...r,configSchema:t8(r.configSchema),execution:null,requiredPaths:[],providedPaths:[],mutatesExternal:!1,mutatesWorktree:!1}}}),iP({name:"list_workflow_session_paths",title:"List workflow session-data paths",description:"The session-data vocabulary a step's config can bind to — concrete paths like `ticket.key` or `pr.number`, with what each holds. Use it to write bindings that resolve at run time.",inputSchema:e1.object({namespace:e1.string().optional().describe("Restrict to one namespace, e.g. 'ticket' or 'pr'.")}),outputSchema:e1.object({paths:e1.array(e1.object({path:e1.string(),description:e1.string().nullable()}))}),annotations:iD,handler:({namespace:e})=>({paths:(function(e){let t=new Map,r=e=>{t.has(e.path)||t.set(e.path,e)};for(let t of e){let e=t.trim();if(e&&"*"!==e){if(e.endsWith(".*")){let t=e.slice(0,-2),i=id[ih(t)];if(i)for(let e of i)r({path:`${t}.${e.name}`,description:e.description});else r({path:e});continue}r({path:e,description:function(e){let t=e.split(".");if(t.length<2)return;let r=t[t.length-1];return ip.get(`${ih(e)}.${r}`)}(e)})}}return[...t.values()].sort((e,t)=>e.path.localeCompare(t.path))})(e?[`${e}.*`]:[...new Set(ii.WORKFLOW_TRIGGER_CATALOG.flatMap(({seedPaths:e})=>e))]).map(({path:e,description:t})=>({path:e,description:t??null}))})}),iP({name:"get_workflow_path_availability",title:"Get workflow path availability",description:"Per step, the session paths guaranteed to exist before it runs and the ones it contributes. This is what decides whether a config binding is legal — check it before binding a step to a path.",inputSchema:im,outputSchema:e1.object({steps:e1.array(e1.object({nodeId:e1.string(),kind:e1.string(),availableBefore:e1.array(e1.string()),provides:e1.array(e1.string())})),triggerSeeds:e1.array(e1.object({triggerId:e1.string(),kind:e1.string(),seedPaths:e1.array(e1.string())})),violations:e1.array(e1.object({nodeId:e1.string(),triggerId:e1.string(),triggerName:e1.string(),path:e1.string()}))}),annotations:iD,handler:async({workflowId:e})=>{let t=await iC(l,e),r=(0,ii.computeWorkflowPathAvailability)(t);return{steps:t.nodes.map(e=>({nodeId:e.id,kind:e.kind,availableBefore:r.availableBefore.get(e.id)??[],provides:r.provides.get(e.id)??[]})),triggerSeeds:t.triggers.map(e=>({triggerId:e.id,kind:e.kind,seedPaths:["workflow.*",...iR(e.kind).seedPaths,...(0,ii.resourceManualSeedPaths)(e.kind,e.config)]})),violations:r.requirementViolations}}})]},{id:"builtin:workflows",name:"Workflows",tools:[],children:[h,{id:"builtin:workflows:authoring",name:"Authoring",children:[],tools:[iP({name:"list_workflows",title:"List workflows",description:"List workflows with their publish and enablement state.",inputSchema:e1.object({search:e1.string().optional().describe("Match name or description."),archive:e1.enum(["ACTIVE","ARCHIVED","ALL"]).optional().describe("Defaults to ACTIVE."),enabled:e1.boolean().optional(),first:e1.number().int().min(1).max(200).optional(),after:e1.string().optional().describe("Cursor from a previous page.")}),outputSchema:e1.object({workflows:e1.array(ix),nextCursor:e1.string().nullable(),totalCount:e1.number()}),annotations:iD,handler:async e=>{let t=await l().list(e);return{workflows:t.items.map(e=>t5(e)),nextCursor:t.nextCursor,totalCount:t.totalCount}}}),iP({name:"get_workflow",title:"Get workflow",description:"Read one workflow, optionally with its full draft definition — every trigger, step, and connection.",inputSchema:e1.object({workflowId:e1.string().min(1),includeDefinition:e1.boolean().optional().describe("Include the draft graph. Defaults to true.")}),outputSchema:e1.object({workflow:ix,definition:e1.unknown().nullable(),activeVersion:e1.unknown().nullable()}),annotations:iD,handler:async({workflowId:e,includeDefinition:t})=>{let r=await l().get(e);if(!r)throw Error(`Workflow ${e} was not found`);return{workflow:t5(r),definition:!1===t?null:JSON.parse(r.draftDefinitionJson),activeVersion:r.activeVersion?t9(r.activeVersion):null}}}),iP({name:"create_workflow",title:"Create workflow",description:"Create a workflow. Without a definition it starts as a draft holding one manual trigger and no steps, ready for add_workflow_step.",inputSchema:e1.object({name:e1.string().min(1).max(200),description:e1.string().max(2e3).optional(),definition:e1.unknown().optional().describe("A complete definition, e.g. from export_workflow."),overlapPolicy:e1.enum(["QUEUE","CONCURRENT","COALESCE_LATEST"]).optional().describe("What happens when a run starts while one is in flight. Defaults to QUEUE."),maxConcurrentRuns:e1.number().int().min(1).optional()}),outputSchema:e1.object({workflow:ix,definition:e1.unknown()}),annotations:iN,handler:async e=>{let t=await l().create(e);if(!t)throw Error("Workflow could not be created");return{workflow:t5(t),definition:JSON.parse(t.draftDefinitionJson)}}}),iP({name:"update_workflow_settings",title:"Update workflow settings",description:"Change a workflow's name, description, or concurrency. Name and description live inside the definition, so this rewrites the draft.",inputSchema:e1.object({workflowId:e1.string().min(1),name:e1.string().min(1).max(200).optional(),description:e1.string().max(2e3).optional(),overlapPolicy:e1.enum(["QUEUE","CONCURRENT","COALESCE_LATEST"]).optional(),maxConcurrentRuns:e1.number().int().min(1).optional()}),outputSchema:ik,annotations:iN,handler:async e=>{let t=await iC(l,e.workflowId),r={...t,name:e.name??t.name,description:e.description??t.description};return await l().saveDraft({id:e.workflowId,definition:r,overlapPolicy:e.overlapPolicy??null,maxConcurrentRuns:e.maxConcurrentRuns??null}),iT(l,e.workflowId,r)}}),iP({name:"set_workflow_enabled",title:"Enable or pause workflow",description:"Enable a workflow or pause it. A paused workflow ignores its triggers and refuses manual runs.",inputSchema:e1.object({workflowId:e1.string().min(1),enabled:e1.boolean()}),outputSchema:e1.object({workflow:ix}),annotations:iN,handler:async({workflowId:e,enabled:t})=>({workflow:t5(await l().setEnabled(e,t))})}),iP({name:"archive_workflow",title:"Archive or restore workflow",description:"Move a workflow out of the active list, or bring it back. Reversible — use delete_workflow to remove it for good.",inputSchema:e1.object({workflowId:e1.string().min(1),archived:e1.boolean()}),outputSchema:e1.object({workflow:ix}),annotations:iN,handler:async({workflowId:e,archived:t})=>({workflow:t5(await l().archive(e,t))})}),iP({name:"delete_workflow",title:"Delete workflow",description:"Permanently delete a workflow and its published versions. Refused once the workflow has run history — archive_workflow is the way to retire one that has run. Not reversible.",inputSchema:e1.object({workflowId:e1.string().min(1)}),outputSchema:e1.object({deleted:e1.boolean()}),annotations:iO,handler:async({workflowId:e})=>({deleted:await l().delete(e)})}),iP({name:"add_workflow_step",title:"Add workflow step",description:"Add a step to the draft and optionally wire it to an existing trigger or step. Returns the new step's id and the validator's view of the result.",inputSchema:e1.object({workflowId:e1.string().min(1),kind:e1.enum(ia.WORKFLOW_STEP_KINDS).describe("Step kind. See list_workflow_step_kinds."),name:e1.string().max(200).optional().describe("Display name. Defaults to the kind's label."),config:iy.optional(),connectFrom:e1.object({from:e1.string().min(1).describe("Trigger or step id this one follows."),sourceHandle:e1.string().optional().describe("Handle to leave from — 'success' by default, 'true'/'false' on an If, 'body'/'empty' on a For each, an option key on a choice trigger.")}).optional(),position:ig.optional(),failurePolicy:e1.enum(["FAIL","CONTINUE"]).optional().describe("CONTINUE lets the run carry on past a failure."),retry:e1.object({maxAttempts:e1.number().int().min(1).max(20),strategy:e1.enum(["FIXED","EXPONENTIAL"]),delaySeconds:e1.number().int().min(1).max(86400)}).optional(),providedPaths:iv.optional(),requiredPaths:iw.optional()}),outputSchema:ik,annotations:iN,handler:async e=>{let t=function(e,t){let r=is(e,"node"),i={id:r,kind:t.kind,name:t.name??void 0,position:t.position??function(e,t){let r=t?io(e,t):void 0,i=r?r.position.x+320:320,a=r?r.position.y:120,n=[...e.nodes,...e.triggers].filter(e=>160>Math.abs(e.position.x-i)).map(e=>e.position.y),s=a;for(;n.some(e=>80>Math.abs(e-s));)s+=160;return{x:i,y:s}}(e,t.connectFrom?.from??null),config:t.config??{},requiredPaths:t.requiredPaths??[],providedPaths:t.providedPaths??[],retry:t.retry??{maxAttempts:1,strategy:"EXPONENTIAL",delaySeconds:5},failurePolicy:t.failurePolicy??"FAIL"},a={...e,nodes:[...e.nodes,i]};if(!t.connectFrom)return{definition:a,nodeId:r,edgeId:null};let n=iu(a,{source:t.connectFrom.from,target:r,sourceHandle:t.connectFrom.sourceHandle??null});return{definition:n.definition,nodeId:r,edgeId:n.edgeId}}(await iC(l,e.workflowId),{...e,name:e.name??function(e){let t=ii.WORKFLOW_STEP_CATALOG.find(t=>t.kind===e);if(!t)throw Error(`Unknown step kind ${e}`);return t}(e.kind).label});return iT(l,e.workflowId,t.definition,{nodeId:t.nodeId,edgeId:t.edgeId})}}),iP({name:"update_workflow_step",title:"Update workflow step",description:"Change a step's name, config, retry, or failure policy. Prefer configPatch, which merges — config replaces the object wholesale.",inputSchema:e1.object({workflowId:e1.string().min(1),nodeId:e1.string().min(1),name:e1.string().max(200).optional(),config:iy.optional().describe("Replaces the entire config. Keys left out are dropped."),configPatch:e1.record(e1.string(),e1.unknown()).optional().describe("Merges into the existing config. A null value removes that key."),position:ig.optional(),failurePolicy:e1.enum(["FAIL","CONTINUE"]).optional(),retry:e1.object({maxAttempts:e1.number().int().min(1).max(20),strategy:e1.enum(["FIXED","EXPONENTIAL"]),delaySeconds:e1.number().int().min(1).max(86400)}).optional(),providedPaths:iv.optional(),requiredPaths:iw.optional()}),outputSchema:ik,annotations:iN,handler:async e=>{let t=await iC(l,e.workflowId);return iT(l,e.workflowId,function(e,t){if(!e.nodes.some(({id:e})=>e===t.nodeId))throw Error(`Step ${t.nodeId} is not in this workflow`);if(t.config&&t.configPatch)throw Error("Pass either config or configPatch, not both");return{...e,nodes:e.nodes.map(e=>e.id===t.nodeId?{...e,name:t.name??e.name,config:ic(e.config,t),position:t.position??e.position,retry:t.retry??e.retry,failurePolicy:t.failurePolicy??e.failurePolicy,requiredPaths:t.requiredPaths??e.requiredPaths,providedPaths:t.providedPaths??e.providedPaths}:e)}}(t,e),{nodeId:e.nodeId})}}),iP({name:"add_workflow_trigger",title:"Add workflow trigger",description:"Add a trigger to the draft. A workflow needs at least one, and each must reach a step before it can be published.",inputSchema:e1.object({workflowId:e1.string().min(1),kind:e1.enum(ia.WORKFLOW_TRIGGER_KINDS).describe("Trigger kind. See list_workflow_trigger_kinds."),name:e1.string().max(200).optional(),config:iy.optional().describe("Trigger config. Resource triggers need `resourceKind`; choice triggers need keyed `choices`; issue-command triggers need `allowedLogins` and an anchored `commandPattern`."),position:ig.optional()}),outputSchema:ik,annotations:iN,handler:async e=>{var t,r;let i,a,n=(t=await iC(l,e.workflowId),r={...e,name:e.name??iR(e.kind).label},a={id:i=is(t,"trigger"),kind:r.kind,name:r.name??void 0,config:r.config??{},position:r.position??{x:0,y:100+140*t.triggers.length}},{definition:{...t,triggers:[...t.triggers,a]},triggerId:i});return iT(l,e.workflowId,n.definition,{triggerId:n.triggerId})}}),iP({name:"update_workflow_trigger",title:"Update workflow trigger",description:"Change a trigger's name or config. Narrowing a choice trigger's options also removes the connections that left the options you dropped.",inputSchema:e1.object({workflowId:e1.string().min(1),triggerId:e1.string().min(1),name:e1.string().max(200).optional(),config:iy.optional(),configPatch:e1.record(e1.string(),e1.unknown()).optional(),position:ig.optional()}),outputSchema:ik,annotations:iN,handler:async e=>{let t=await iC(l,e.workflowId);return iT(l,e.workflowId,function(e,t){let r=e.triggers.find(({id:e})=>e===t.triggerId);if(!r)throw Error(`Trigger ${t.triggerId} is not in this workflow`);if(t.config&&t.configPatch)throw Error("Pass either config or configPatch, not both");let i={...r,name:t.name??r.name,config:ic(r.config,t),position:t.position??r.position},a=new Set(il(i)),n=(0,ia.isChoiceTriggerKind)(i.kind)?e.edges.filter(e=>e.source!==i.id||a.has(e.sourceHandle)):e.edges;return{...e,triggers:e.triggers.map(e=>e.id===i.id?i:e),edges:n}}(t,e),{triggerId:e.triggerId})}}),iP({name:"remove_workflow_node",title:"Remove workflow step or trigger",description:"Delete a step or trigger from the draft along with its connections. Set reconnect to stitch its predecessors to its successors so the chain survives.",inputSchema:e1.object({workflowId:e1.string().min(1),id:e1.string().min(1).describe("Step or trigger id."),reconnect:e1.boolean().optional().describe("Join what came before to what came after.")}),outputSchema:ik,annotations:iO,handler:async({workflowId:e,id:t,reconnect:r})=>{let i=await iC(l,e);return iT(l,e,function(e,t,r={}){if(!io(e,t))throw Error(`${t} is not in this workflow`);let i=e.edges.filter(e=>e.target===t),a=e.edges.filter(e=>e.source===t),n=e.edges.filter(e=>e.source!==t&&e.target!==t),s={...e,nodes:e.nodes.filter(e=>e.id!==t),triggers:e.triggers.filter(e=>e.id!==t),edges:n};if(!r.reconnect)return s;for(let e of i)for(let t of a)s=iu(s,{source:e.source,sourceHandle:e.sourceHandle,target:t.target,targetHandle:t.targetHandle}).definition;return s}(i,t,{reconnect:r}))}}),iP({name:"connect_workflow_nodes",title:"Connect workflow nodes",description:"Draw a connection from a trigger or step to a step. A step with more than one incoming connection must be a CONTROL_JOIN.",inputSchema:e1.object({workflowId:e1.string().min(1),source:e1.string().min(1).describe("Trigger or step id."),target:e1.string().min(1).describe("Step id. Triggers take no input."),sourceHandle:e1.string().optional().describe("Handle to leave from. Defaults to the source's first — 'success' for a step.")}),outputSchema:ik,annotations:iN,handler:async e=>{let t=iu(await iC(l,e.workflowId),e);return iT(l,e.workflowId,t.definition,{edgeId:t.edgeId})}}),iP({name:"disconnect_workflow_nodes",title:"Disconnect workflow nodes",description:"Remove a connection, either by its edge id or by the pair of nodes it joins.",inputSchema:e1.object({workflowId:e1.string().min(1),edgeId:e1.string().optional(),source:e1.string().optional(),target:e1.string().optional(),sourceHandle:e1.string().optional()}),outputSchema:ik.extend({removedEdgeIds:e1.array(e1.string())}),annotations:iN,handler:async e=>{let t=function(e,t){let r=e.edges.filter(e=>t.edgeId?e.id===t.edgeId:(!!t.source||!!t.target)&&(!t.source||e.source===t.source)&&(!t.target||e.target===t.target)&&(!t.sourceHandle||e.sourceHandle===t.sourceHandle));if(!r.length)throw Error("No matching connection to remove");let i=new Set(r.map(({id:e})=>e));return{definition:{...e,edges:e.edges.filter(e=>!i.has(e.id))},removedEdgeIds:[...i]}}(await iC(l,e.workflowId),e);return{...await iT(l,e.workflowId,t.definition),removedEdgeIds:t.removedEdgeIds}}}),iP({name:"layout_workflow",title:"Lay out workflow graph",description:"Reposition every trigger and step into readable left-to-right columns. Worth calling once after building a workflow, so it does not open as a pile of overlapping cards.",inputSchema:im,outputSchema:ik,annotations:iN,handler:async({workflowId:e})=>{let t=await iC(l,e);return iT(l,e,function(e){let t=new Map;for(let r of e.edges)t.set(r.source,[...t.get(r.source)??[],r.target]);let r=new Map;for(let t of e.triggers)r.set(t.id,0);let i=e.triggers.map(({id:e})=>e),a=e.nodes.length*e.edges.length+1;for(;i.length&&a-- >0;){let e=i.shift(),a=r.get(e)??0;for(let n of t.get(e)??[])(r.get(n)??-1)>=a+1||(r.set(n,a+1),i.push(n))}let n=Math.max(0,...r.values());for(let t of e.nodes)r.has(t.id)||r.set(t.id,n+1);let s=new Map,o=e=>{let t=r.get(e.id)??0,i=s.get(t)??0;return s.set(t,i+1),{...e,position:{x:320*t,y:160*i}}},l=e.triggers.map(o),c=e.nodes.map(o);return{...e,triggers:l,nodes:c}}(t))}}),iP({name:"set_workflow_definition",title:"Replace workflow definition",description:"Overwrite the entire draft graph. The bulk escape hatch — prefer the granular tools for single edits, which cannot clobber work they did not read.",inputSchema:e1.object({workflowId:e1.string().min(1),definition:e1.unknown().describe("A complete definition object, as returned by get_workflow.")}),outputSchema:ik,annotations:iN,handler:async({workflowId:e,definition:t})=>iT(l,e,(0,ii.parseWorkflowDefinition)(t))}),iP({name:"validate_workflow",title:"Validate workflow draft",description:"Check the draft without saving anything. Errors block publishing; the codes name the problem — REQUIREMENT_UNSATISFIED means a step binds a path its trigger cannot seed.",inputSchema:im,outputSchema:e1.object({valid:e1.boolean(),diagnostics:e1.array(ib)}),annotations:iD,handler:async({workflowId:e})=>{let t=await l().validateDraft(e);return{valid:t.valid,diagnostics:t.diagnostics.map(e=>({severity:e.severity,code:e.code,message:e.message,nodeId:e.nodeId??null,triggerId:e.triggerId??null,path:e.path??null}))}}}),iP({name:"publish_workflow",title:"Publish workflow",description:"Publish the draft as a new immutable version. Only a published version can run, and publishing fails if the draft has errors.",inputSchema:im,outputSchema:e1.object({version:e1.unknown()}),annotations:iN,handler:async({workflowId:e})=>({version:t9(await l().publish(e))})}),iP({name:"export_workflow",title:"Export workflow",description:"Export a workflow as a portable document, with secrets and machine-specific paths stripped. Pass a version id to export a published version instead of the draft.",inputSchema:e1.object({workflowId:e1.string().min(1),versionId:e1.string().optional()}),outputSchema:e1.object({export:e1.unknown()}),annotations:iD,handler:async({workflowId:e,versionId:t})=>({export:t8(await l().export(e,t))})}),iP({name:"import_workflow",title:"Import workflow",description:"Create a workflow from an exported document. References that cannot be resolved on this machine come in marked unresolved and must be fixed before publishing.",inputSchema:e1.object({payload:e1.unknown().describe("A document from export_workflow."),name:e1.string().max(200).optional()}),outputSchema:e1.object({workflow:ix,definition:e1.unknown()}),annotations:iN,handler:async e=>{let t=await l().import(e);if(!t)throw Error("Workflow could not be imported");return{workflow:t5(t),definition:JSON.parse(t.draftDefinitionJson)}}})]},{id:"builtin:workflows:runs",name:"Runs",children:[],tools:[iP({name:"trigger_workflow",title:"Trigger workflow run",description:"Start a run of a published, enabled workflow. Runs whatever the workflow's steps do, including external side effects.",inputSchema:e1.object({workflowId:e1.string().min(1),sessionData:e1.record(e1.string(),e1.unknown()).optional().describe("Initial session data, merged with the trigger's seeds."),resourceKind:e1.enum(ia.WORKFLOW_RESOURCE_KINDS).optional().describe("Launch through a resource trigger of this kind."),resourceId:e1.string().optional().describe("The resource to launch against."),choice:e1.string().optional().describe("Option key when the workflow's trigger offers choices. Omitting it on a choice-only workflow returns the valid keys."),subjectKey:e1.string().optional().describe("Dedupe key. Defaults to the resource or a fresh id.")}),outputSchema:e1.object({run:iS}),annotations:iA,handler:async e=>{let t=await l().trigger(e);if(!t)throw Error("Workflow run could not be started");return{run:t7(t)}}}),iP({name:"list_workflow_runs",title:"List workflow runs",description:"List runs, newest first, optionally filtered.",inputSchema:e1.object({workflowId:e1.string().optional(),status:e1.enum(["QUEUED","RUNNING","PAUSING","PAUSED","WAITING","BLOCKED","SUCCEEDED","FAILED","CANCELLED"]).optional(),search:e1.string().optional().describe("A run number, or part of a workflow name."),first:e1.number().int().min(1).max(200).optional(),after:e1.string().optional()}),outputSchema:e1.object({runs:e1.array(iS),nextCursor:e1.string().nullable(),totalCount:e1.number()}),annotations:iD,handler:async e=>{let t=await l().runs(e);return{runs:t.items.map(e=>t7(e)),nextCursor:t.nextCursor,totalCount:t.totalCount}}}),iP({name:"get_workflow_run",title:"Get workflow run",description:"Read a run's status and session data, with its per-step attempts and any questions it is blocked on. Poll this after trigger_workflow.",inputSchema:e1.object({runId:e1.string().min(1),includeAttempts:e1.boolean().optional().describe("Include per-step attempts. Defaults to true.")}),outputSchema:e1.object({run:iS,attempts:e1.array(e1.unknown()),pendingQuestions:e1.array(iE)}),annotations:iD,handler:async({runId:e,includeAttempts:t})=>{let r=await l().run(e);if(!r)throw Error(`Workflow run ${e} was not found`);let i=r.attempts??[];return{run:t7(r),attempts:!1===t?[]:i.map(e=>({id:String(e.id),nodeId:String(e.nodeId),kind:String(e.kind),generation:Number(e.generation),iterationKey:String(e.iterationKey??""),attempt:Number(e.attempt),status:String(e.status),phase:String(e.phase),input:t1(e.inputJson),output:t1(e.outputJson),error:"string"==typeof e.error?e.error:null,startedAt:t2(e.startedAt),finishedAt:t2(e.finishedAt)})),pendingQuestions:i.flatMap(e=>e.questionBatches??[]).filter(e=>"PENDING"===e.status).map(e=>{let t;return t=Array.isArray(e.questions)?e.questions:[],{batchId:String(e.id),runId:"string"==typeof e.runId?e.runId:null,status:String(e.status),createdAt:t2(e.createdAt),questions:t.map(e=>{let t=Array.isArray(e.options)?e.options:[];return{id:String(e.id),header:"string"==typeof e.header?e.header:null,prompt:String(e.prompt??""),multiSelect:!0===e.multiSelect,allowCustom:!0===e.allowCustom,options:t.map(e=>({label:String(e.label??""),description:"string"==typeof e.description?e.description:null}))}})}})}}}),iP({name:"get_workflow_run_events",title:"Get workflow run events",description:"Read a run's event log in order. Pass the last sequence you saw to tail only what is new.",inputSchema:e1.object({runId:e1.string().min(1),afterSequence:e1.number().int().optional(),first:e1.number().int().min(1).max(500).optional()}),outputSchema:e1.object({events:e1.array(iI)}),annotations:iD,handler:async({runId:e,afterSequence:t,first:r})=>({events:(await l().runEvents(e,t,r)).map(e=>({id:String(e.id),runId:String(e.runId),attemptId:"string"==typeof e.attemptId?e.attemptId:null,sequence:Number(e.sequence),type:String(e.type),message:String(e.message??""),detail:t1(e.detailJson),createdAt:t2(e.createdAt)}))})}),iP({name:"control_workflow_run",title:"Pause, resume, or cancel a run",description:"Change an in-flight run's lifecycle. Cancelling is final, and leaves any external effects already applied in place.",inputSchema:e1.object({runId:e1.string().min(1),action:e1.enum(["PAUSE","RESUME","CANCEL"])}),outputSchema:e1.object({run:iS}),annotations:iO,handler:async({runId:e,action:t})=>{let r=await l().lifecycle(e,t);if(!r)throw Error("Workflow run lifecycle change failed");return{run:t7(r)}}}),iP({name:"answer_workflow_question",title:"Answer a workflow question",description:"Answer the question a run is parked on so it can continue. Find the batch id and the questions through get_workflow_run.",inputSchema:e1.object({batchId:e1.string().min(1).describe("From get_workflow_run."),answers:e1.record(e1.string(),e1.unknown()).describe("Answers keyed by question id. A value is the chosen option label, a list of labels for a multi-select, or free text where a custom answer is allowed.")}),outputSchema:e1.object({run:iS}),annotations:iN,handler:async({batchId:e,answers:t})=>{let r=await l().answerQuestion(e,t);if(!r)throw Error("Workflow question could not be answered");return{run:t7(r)}}}),iP({name:"prepare_workflow_replay",title:"Preview a workflow replay",description:"See what replaying a run from a given step would affect: the downstream steps, the external effects that would happen again, and whether a Git checkpoint is available. Read-only — call it before replay_workflow_run.",inputSchema:e1.object({runId:e1.string().min(1),nodeId:e1.string().min(1).describe("Step to replay from.")}),outputSchema:e1.object({preview:e1.unknown()}),annotations:iD,handler:async({runId:e,nodeId:t})=>({preview:t8(await l().prepareReplay(e,t))})}),iP({name:"replay_workflow_run",title:"Replay a workflow run from a step",description:"Re-run a workflow from one step onward. Every external effect downstream happens again — merges, comments, deploys — so preview it with prepare_workflow_replay first.",inputSchema:e1.object({runId:e1.string().min(1),nodeId:e1.string().min(1),restore:e1.boolean().optional().describe("Restore the worktree to the Git checkpoint at that step, discarding later changes."),stash:e1.boolean().optional().describe("Stash uncommitted changes before restoring.")}),outputSchema:e1.object({run:iS}),annotations:iO,handler:async({runId:e,nodeId:t,restore:r,stash:i})=>{let a=await l().replay(e,t,{restore:r,stash:i});if(!a)throw Error("Workflow run could not be replayed");return{run:t7(a)}}})]}]})),new iB(m)}({codebaseTools:e,builds:t,...r})}async externalServers(){let e=await (0,tY.getPrismaClient)();return Promise.all((await e.externalMcpServer.findMany({orderBy:{name:"asc"},include:{headers:!0}})).map(async e=>iq(e,0===e.headers.length||await this.credentials.isConfigured((0,tX.externalMcpHeadersCredential)(e.id)))))}async createExternalServer(e){return this.saveExternalServer(null,e)}async updateExternalServer(e,t){return this.saveExternalServer(e,t)}async saveExternalServer(e,t){let r=function(e){let t,r=e.name.trim();if(!r)throw Error("Server name is required");if(r.length>80)throw Error("Server name must be 80 characters or fewer");try{t=new URL(e.url.trim())}catch{throw Error("Server URL must be a valid HTTP or HTTPS URL")}if(!["http:","https:"].includes(t.protocol)||t.username||t.password)throw Error("Server URL must be an HTTP or HTTPS URL without embedded credentials");if("STREAMABLE_HTTP"!==e.transport&&"SSE"!==e.transport)throw Error("Transport must be Streamable HTTP or SSE");let i=e.toolNamePrefix?.trim()??"";if(i.length>64||!/^[A-Za-z0-9_.-]*$/.test(i))throw Error("Tool name prefix may contain up to 64 letters, numbers, underscores, periods, or hyphens");let a=new Set,n=e.headers.map(e=>{let t=e.name.trim();if(!t)throw Error("Header name is required");let r=t.toLowerCase();if(iL.has(r))throw Error(`${t} is managed by the MCP transport`);if(a.has(r))throw Error(`Duplicate header name: ${t}`);a.add(r);try{new Headers([[t,e.value??"validation"]])}catch{throw Error(`Invalid HTTP header: ${t}`)}return{id:e.id??null,name:t,value:e.value}});return{name:r,url:t.toString(),transport:e.transport,toolNamePrefix:i,headers:n}}(t),i=await (0,tY.getPrismaClient)();if((await i.externalMcpServer.findMany({select:{id:!0,name:!0}})).some(t=>t.id!==e&&t.name.toLocaleLowerCase()===r.name.toLocaleLowerCase()))throw Error("An MCP server with this name already exists");let a=e?await i.externalMcpServer.findUnique({where:{id:e},include:{headers:!0}}):null;if(e&&!a)throw Error("External MCP server not found");let n=new Map(a?.headers.map(e=>[e.id,e])??[]),s=e??(0,g.randomUUID)(),o=(0,tX.externalMcpHeadersCredential)(s),l=new Map((e?await this.credentials.getJson(o)??[]:[]).map(e=>[e.id,e]));for(let e of r.headers){if(e.id&&!n.has(e.id))throw Error(`Header ${e.name} does not belong to this server`);if(!e.id&&!e.value)throw Error(`A value is required for the new ${e.name} header`)}let c=r.headers.map(e=>{let t=e.id??(0,g.randomUUID)(),r=e.value||l.get(t)?.value;if(!r)throw Error(`A value is required for ${e.name}`);return{id:t,name:e.name,value:r}}),u=async e=>{await e.externalMcpServer.upsert({where:{id:s},create:{id:s,name:r.name,url:r.url,transport:r.transport,toolNamePrefix:r.toolNamePrefix},update:{name:r.name,url:r.url,transport:r.transport,toolNamePrefix:r.toolNamePrefix}}),await e.externalMcpServerHeader.deleteMany({where:{serverId:s}}),c.length&&await e.externalMcpServerHeader.createMany({data:c.map(e=>({id:e.id,serverId:s,name:e.name}))})};return c.length?await this.credentials.setJson(o,c,u):await this.credentials.delete(o,u),iq(await i.externalMcpServer.findUniqueOrThrow({where:{id:s},include:{headers:!0}}),!0)}async deleteExternalServer(e){return await this.credentials.delete((0,tX.externalMcpHeadersCredential)(e),async t=>{await t.externalMcpServer.delete({where:{id:e}})}),{id:e}}async catalog(){let e=await (0,tY.getPrismaClient)(),t=await e.externalMcpServer.findMany({orderBy:{name:"asc"},include:{headers:!0}}),r=await Promise.all(t.map(async e=>{try{let t=await this.listRemoteTools(await this.externalServerWithSecrets(e.id));return{id:`${ij}${e.id}`,name:e.name,source:"EXTERNAL",transport:iM(e.transport),url:e.url,error:null,tools:t.map(t=>({...t,name:`${e.toolNamePrefix}${t.name}`})),children:[]}}catch(t){return{id:`${ij}${e.id}`,name:e.name,source:"EXTERNAL",transport:iM(e.transport),url:e.url,error:t instanceof Error?t.message:String(t),tools:[],children:[]}}}));return{groups:[...this.builtInTools.catalog(),...r]}}async callTool(e){if(this.builtInTools.hasGroup(e.groupId))return this.builtInTools.call(e.groupId,e.name,e.arguments);if(!e.groupId.startsWith(ij))throw Error("Unknown tool group");let t=e.groupId.slice(ij.length),r=await this.externalServerWithSecrets(t);if(!e.name.startsWith(r.toolNamePrefix))throw Error("Tool name does not use this server's configured prefix");let i=e.name.slice(r.toolNamePrefix.length);if(!i)throw Error("Tool name is required");return this.withClient(r,t=>t.callTool({name:i,arguments:e.arguments},void 0,{timeout:12e4,resetTimeoutOnProgress:!0}))}async externalServerWithSecrets(e){let t=await (0,tY.getPrismaClient)(),r=await t.externalMcpServer.findUnique({where:{id:e},include:{headers:!0}});if(!r)throw Error("External MCP server not found");if(iM(r.transport),!r.headers.length)return{...r,headers:[]};let i=await this.credentials.getJson((0,tX.externalMcpHeadersCredential)(r.id));if(!i)throw Error("External MCP server headers are not configured; re-enter them in Settings");let a=new Map(i.map(e=>[e.id,e]));return{...r,headers:r.headers.map(e=>{let t=a.get(e.id);if(!t?.value)throw Error(`External MCP header ${e.name} is missing; re-enter it in Settings`);return{id:e.id,name:e.name,value:t.value}})}}async withClient(e,t){var r;let i,a=new eu({name:"ai-development-environment-tools",version:"0.1.0"}),n=(r=e,async(e,t)=>{let i=new Headers(r.headers.map(e=>[e.name,e.value]));return e instanceof Request&&e.headers.forEach((e,t)=>i.set(t,e)),new Headers(t?.headers).forEach((e,t)=>i.set(t,e)),fetch(e,{...t,headers:i})}),s="STREAMABLE_HTTP"===iM(e.transport)?new tZ(new URL(e.url),{fetch:n}):new tG(new URL(e.url),{fetch:n}),o=()=>i??=a.close().catch(()=>void 0);try{let e;try{await Promise.race([a.connect(s,{timeout:15e3}),new Promise((t,r)=>{e=setTimeout(()=>{o(),r(Error("External MCP server connection timed out after 15000ms"))},15e3)})])}finally{e&&clearTimeout(e)}return await t(a)}finally{await o()}}async listRemoteTools(e){return this.withClient(e,async e=>{let t,r=[],i=new Set,a=0;do{let n=await e.listTools(t?{cursor:t}:void 0,{timeout:15e3});a+=1,r.push(...n.tools.map(e=>({name:e.name,title:e.title??null,description:e.description??null,inputSchema:e.inputSchema,outputSchema:e.outputSchema??null})));let s=n.nextCursor;if(s){if(i.has(s))throw Error("External MCP server returned a repeated tools/list cursor");if(a>=100)throw Error("External MCP server exceeded the tools/list pagination limit of 100 pages");i.add(s)}t=s}while(t)return r})}}class iV{constructor(e){this._server=e}requestStream(e,t,r){return this._server.requestStream(e,t,r)}createMessageStream(e,t){let r=this._server.getClientCapabilities();if((e.tools||e.toolChoice)&&!r?.sampling?.tools)throw Error("Client does not support sampling tools capability.");if(e.messages.length>0){let t=e.messages[e.messages.length-1],r=Array.isArray(t.content)?t.content:[t.content],i=r.some(e=>"tool_result"===e.type),a=e.messages.length>1?e.messages[e.messages.length-2]:void 0,n=a?Array.isArray(a.content)?a.content:[a.content]:[],s=n.some(e=>"tool_use"===e.type);if(i){if(r.some(e=>"tool_result"!==e.type))throw Error("The last message must contain only tool_result content if any is present");if(!s)throw Error("tool_result blocks are not matching any tool_use from the previous message")}if(s){let e=new Set(n.filter(e=>"tool_use"===e.type).map(e=>e.id)),t=new Set(r.filter(e=>"tool_result"===e.type).map(e=>e.toolUseId));if(e.size!==t.size||![...e].every(e=>t.has(e)))throw Error("ids of tool_result blocks and tool_use blocks from previous message do not match")}}return this.requestStream({method:"sampling/createMessage",params:e},v.CreateMessageResultSchema,t)}elicitInputStream(e,t){let r=this._server.getClientCapabilities(),i=e.mode??"form";switch(i){case"url":if(!r?.elicitation?.url)throw Error("Client does not support url elicitation.");break;case"form":if(!r?.elicitation?.form)throw Error("Client does not support form elicitation.")}let a="form"===i&&void 0===e.mode?{...e,mode:"form"}:e;return this.requestStream({method:"elicitation/create",params:a},v.ElicitResultSchema,t)}async getTask(e,t){return this._server.getTask({taskId:e},t)}async getTaskResult(e,t,r){return this._server.getTaskResult({taskId:e},t,r)}async listTasks(e,t){return this._server.listTasks(e?{cursor:e}:void 0,t)}async cancelTask(e,t){return this._server.cancelTask({taskId:e},t)}}class iK extends et{constructor(e,t){super(t),this._serverInfo=e,this._loggingLevels=new Map,this.LOG_LEVEL_SEVERITY=new Map(v.LoggingLevelSchema.options.map((e,t)=>[e,t])),this.isMessageIgnored=(e,t)=>{let r=this._loggingLevels.get(t);return!!r&&this.LOG_LEVEL_SEVERITY.get(e)<this.LOG_LEVEL_SEVERITY.get(r)},this._capabilities=t?.capabilities??{},this._instructions=t?.instructions,this._jsonSchemaValidator=t?.jsonSchemaValidator??new es,this.setRequestHandler(v.InitializeRequestSchema,e=>this._oninitialize(e)),this.setNotificationHandler(v.InitializedNotificationSchema,()=>this.oninitialized?.()),this._capabilities.logging&&this.setRequestHandler(v.SetLevelRequestSchema,async(e,t)=>{let r=t.sessionId||t.requestInfo?.headers["mcp-session-id"]||void 0,{level:i}=e.params,a=v.LoggingLevelSchema.safeParse(i);return a.success&&this._loggingLevels.set(r,a.data),{}})}get experimental(){return this._experimental||(this._experimental={tasks:new iV(this)}),this._experimental}registerCapabilities(e){if(this.transport)throw Error("Cannot register capabilities after connecting to transport");this._capabilities=ei(this._capabilities,e)}setRequestHandler(e,t){let r,i=(0,y.getObjectShape)(e),a=i?.method;if(!a)throw Error("Schema is missing a method literal");if((0,y.isZ4Schema)(a)){let e=a._zod?.def;r=e?.value??a.value}else{let e=a._def;r=e?.value??a.value}if("string"!=typeof r)throw Error("Schema method literal must be a string");if("tools/call"===r){let r=async(e,r)=>{let i=(0,y.safeParse)(v.CallToolRequestSchema,e);if(!i.success){let e=i.error instanceof Error?i.error.message:String(i.error);throw new v.McpError(v.ErrorCode.InvalidParams,`Invalid tools/call request: ${e}`)}let{params:a}=i.data,n=await Promise.resolve(t(e,r));if(a.task){let e=(0,y.safeParse)(v.CreateTaskResultSchema,n);if(!e.success){let t=e.error instanceof Error?e.error.message:String(e.error);throw new v.McpError(v.ErrorCode.InvalidParams,`Invalid task creation result: ${t}`)}return e.data}let s=(0,y.safeParse)(v.CallToolResultSchema,n);if(!s.success){let e=s.error instanceof Error?s.error.message:String(s.error);throw new v.McpError(v.ErrorCode.InvalidParams,`Invalid tools/call result: ${e}`)}return s.data};return super.setRequestHandler(e,r)}return super.setRequestHandler(e,t)}assertCapabilityForMethod(e){switch(e){case"sampling/createMessage":if(!this._clientCapabilities?.sampling)throw Error(`Client does not support sampling (required for ${e})`);break;case"elicitation/create":if(!this._clientCapabilities?.elicitation)throw Error(`Client does not support elicitation (required for ${e})`);break;case"roots/list":if(!this._clientCapabilities?.roots)throw Error(`Client does not support listing roots (required for ${e})`)}}assertNotificationCapability(e){switch(e){case"notifications/message":if(!this._capabilities.logging)throw Error(`Server does not support logging (required for ${e})`);break;case"notifications/resources/updated":case"notifications/resources/list_changed":if(!this._capabilities.resources)throw Error(`Server does not support notifying about resources (required for ${e})`);break;case"notifications/tools/list_changed":if(!this._capabilities.tools)throw Error(`Server does not support notifying of tool list changes (required for ${e})`);break;case"notifications/prompts/list_changed":if(!this._capabilities.prompts)throw Error(`Server does not support notifying of prompt list changes (required for ${e})`);break;case"notifications/elicitation/complete":if(!this._clientCapabilities?.elicitation?.url)throw Error(`Client does not support URL elicitation (required for ${e})`)}}assertRequestHandlerCapability(e){if(this._capabilities)switch(e){case"completion/complete":if(!this._capabilities.completions)throw Error(`Server does not support completions (required for ${e})`);break;case"logging/setLevel":if(!this._capabilities.logging)throw Error(`Server does not support logging (required for ${e})`);break;case"prompts/get":case"prompts/list":if(!this._capabilities.prompts)throw Error(`Server does not support prompts (required for ${e})`);break;case"resources/list":case"resources/templates/list":case"resources/read":if(!this._capabilities.resources)throw Error(`Server does not support resources (required for ${e})`);break;case"tools/call":case"tools/list":if(!this._capabilities.tools)throw Error(`Server does not support tools (required for ${e})`);break;case"tasks/get":case"tasks/list":case"tasks/result":case"tasks/cancel":if(!this._capabilities.tasks)throw Error(`Server does not support tasks capability (required for ${e})`)}}assertTaskCapability(e){ec(this._clientCapabilities?.tasks?.requests,e,"Client")}assertTaskHandlerCapability(e){this._capabilities&&el(this._capabilities.tasks?.requests,e,"Server")}async _oninitialize(e){let t=e.params.protocolVersion;return this._clientCapabilities=e.params.capabilities,this._clientVersion=e.params.clientInfo,{protocolVersion:v.SUPPORTED_PROTOCOL_VERSIONS.includes(t)?t:v.LATEST_PROTOCOL_VERSION,capabilities:this.getCapabilities(),serverInfo:this._serverInfo,...this._instructions&&{instructions:this._instructions}}}getClientCapabilities(){return this._clientCapabilities}getClientVersion(){return this._clientVersion}getCapabilities(){return this._capabilities}async ping(){return this.request({method:"ping"},v.EmptyResultSchema)}async createMessage(e,t){if((e.tools||e.toolChoice)&&!this._clientCapabilities?.sampling?.tools)throw Error("Client does not support sampling tools capability.");if(e.messages.length>0){let t=e.messages[e.messages.length-1],r=Array.isArray(t.content)?t.content:[t.content],i=r.some(e=>"tool_result"===e.type),a=e.messages.length>1?e.messages[e.messages.length-2]:void 0,n=a?Array.isArray(a.content)?a.content:[a.content]:[],s=n.some(e=>"tool_use"===e.type);if(i){if(r.some(e=>"tool_result"!==e.type))throw Error("The last message must contain only tool_result content if any is present");if(!s)throw Error("tool_result blocks are not matching any tool_use from the previous message")}if(s){let e=new Set(n.filter(e=>"tool_use"===e.type).map(e=>e.id)),t=new Set(r.filter(e=>"tool_result"===e.type).map(e=>e.toolUseId));if(e.size!==t.size||![...e].every(e=>t.has(e)))throw Error("ids of tool_result blocks and tool_use blocks from previous message do not match")}}return e.tools?this.request({method:"sampling/createMessage",params:e},v.CreateMessageResultWithToolsSchema,t):this.request({method:"sampling/createMessage",params:e},v.CreateMessageResultSchema,t)}async elicitInput(e,t){switch(e.mode??"form"){case"url":if(!this._clientCapabilities?.elicitation?.url)throw Error("Client does not support url elicitation.");return this.request({method:"elicitation/create",params:e},v.ElicitResultSchema,t);case"form":{if(!this._clientCapabilities?.elicitation?.form)throw Error("Client does not support form elicitation.");let r="form"===e.mode?e:{...e,mode:"form"},i=await this.request({method:"elicitation/create",params:r},v.ElicitResultSchema,t);if("accept"===i.action&&i.content&&r.requestedSchema)try{let e=this._jsonSchemaValidator.getValidator(r.requestedSchema)(i.content);if(!e.valid)throw new v.McpError(v.ErrorCode.InvalidParams,`Elicitation response content does not match requested schema: ${e.errorMessage}`)}catch(e){if(e instanceof v.McpError)throw e;throw new v.McpError(v.ErrorCode.InternalError,`Error validating elicitation response: ${e instanceof Error?e.message:String(e)}`)}return i}}}createElicitationCompletionNotifier(e,t){if(!this._clientCapabilities?.elicitation?.url)throw Error("Client does not support URL elicitation (required for notifications/elicitation/complete)");return()=>this.notification({method:"notifications/elicitation/complete",params:{elicitationId:e}},t)}async listRoots(e,t){return this.request({method:"roots/list",params:e},v.ListRootsResultSchema,t)}async sendLoggingMessage(e,t){if(this._capabilities.logging&&!this.isMessageIgnored(e.level,t))return this.notification({method:"notifications/message",params:e})}async sendResourceUpdated(e){return this.notification({method:"notifications/resources/updated",params:e})}async sendResourceListChanged(){return this.notification({method:"notifications/resources/list_changed"})}async sendToolListChanged(){return this.notification({method:"notifications/tools/list_changed"})}async sendPromptListChanged(){return this.notification({method:"notifications/prompts/list_changed"})}}let iH=Symbol.for("mcp.completable");function iG(e){return!!e&&"object"==typeof e&&iH in e}(i||(i={})).Completable="McpCompletable";let iW=/^[A-Za-z0-9._-]{1,128}$/;function iJ(e){let t=function(e){let t=[];if(0===e.length)return{isValid:!1,warnings:["Tool name cannot be empty"]};if(e.length>128)return{isValid:!1,warnings:[`Tool name exceeds maximum length of 128 characters (current: ${e.length})`]};if(e.includes(" ")&&t.push("Tool name contains spaces, which may cause parsing issues"),e.includes(",")&&t.push("Tool name contains commas, which may cause parsing issues"),(e.startsWith("-")||e.endsWith("-"))&&t.push("Tool name starts or ends with a dash, which may cause parsing issues in some contexts"),(e.startsWith(".")||e.endsWith("."))&&t.push("Tool name starts or ends with a dot, which may cause parsing issues in some contexts"),!iW.test(e)){let r=e.split("").filter(e=>!/[A-Za-z0-9._-]/.test(e)).filter((e,t,r)=>r.indexOf(e)===t);return t.push(`Tool name contains invalid characters: ${r.map(e=>`"${e}"`).join(", ")}`,"Allowed characters are: A-Z, a-z, 0-9, underscore (_), dash (-), and dot (.)"),{isValid:!1,warnings:t}}return{isValid:!0,warnings:t}}(e);var r=t.warnings;if(r.length>0){for(let t of(console.warn(`Tool name validation warning for "${e}":`),r))console.warn(` - ${t}`);console.warn("Tool registration will proceed, but this may cause compatibility issues."),console.warn("Consider updating the tool name to conform to the MCP tool naming standard."),console.warn("See SEP: Specify Format for Tool Names (https://github.com/modelcontextprotocol/modelcontextprotocol/issues/986) for more details.")}return t.isValid}class iz{constructor(e){this._mcpServer=e}registerToolTask(e,t,r){let i={taskSupport:"required",...t.execution};if("forbidden"===i.taskSupport)throw Error(`Cannot register task-based tool '${e}' with taskSupport 'forbidden'. Use registerTool() instead.`);return this._mcpServer._createRegisteredTool(e,t.title,t.description,t.inputSchema,t.outputSchema,t.annotations,i,t._meta,r)}}class iZ{constructor(e,t){this._registeredResources={},this._registeredResourceTemplates={},this._registeredTools={},this._registeredPrompts={},this._toolHandlersInitialized=!1,this._completionHandlerInitialized=!1,this._resourceHandlersInitialized=!1,this._promptHandlersInitialized=!1,this.server=new iK(e,t)}get experimental(){return this._experimental||(this._experimental={tasks:new iz(this)}),this._experimental}async connect(e){return await this.server.connect(e)}async close(){await this.server.close()}setToolRequestHandlers(){this._toolHandlersInitialized||(this.server.assertCanSetRequestHandler(i2(v.ListToolsRequestSchema)),this.server.assertCanSetRequestHandler(i2(v.CallToolRequestSchema)),this.server.registerCapabilities({tools:{listChanged:!0}}),this.server.setRequestHandler(v.ListToolsRequestSchema,()=>({tools:Object.entries(this._registeredTools).filter(([,e])=>e.enabled).map(([e,t])=>{let r,i={name:e,title:t.title,description:t.description,inputSchema:(r=(0,y.normalizeObjectSchema)(t.inputSchema))?Q(r,{strictUnions:!0,pipeStrategy:"input"}):iY,annotations:t.annotations,execution:t.execution,_meta:t._meta};if(t.outputSchema){let e=(0,y.normalizeObjectSchema)(t.outputSchema);e&&(i.outputSchema=Q(e,{strictUnions:!0,pipeStrategy:"output"}))}return i})})),this.server.setRequestHandler(v.CallToolRequestSchema,async(e,t)=>{try{let r=this._registeredTools[e.params.name];if(!r)throw new v.McpError(v.ErrorCode.InvalidParams,`Tool ${e.params.name} not found`);if(!r.enabled)throw new v.McpError(v.ErrorCode.InvalidParams,`Tool ${e.params.name} disabled`);let i=!!e.params.task,a=r.execution?.taskSupport,n="createTask"in r.handler;if(("required"===a||"optional"===a)&&!n)throw new v.McpError(v.ErrorCode.InternalError,`Tool ${e.params.name} has taskSupport '${a}' but was not registered with registerToolTask`);if("required"===a&&!i)throw new v.McpError(v.ErrorCode.MethodNotFound,`Tool ${e.params.name} requires task augmentation (taskSupport: 'required')`);if("optional"===a&&!i&&n)return await this.handleAutomaticTaskPolling(r,e,t);let s=await this.validateToolInput(r,e.params.arguments,e.params.name),o=await this.executeToolHandler(r,s,t);if(i)return o;return await this.validateToolOutput(r,o,e.params.name),o}catch(e){if(e instanceof v.McpError&&e.code===v.ErrorCode.UrlElicitationRequired)throw e;return this.createToolError(e instanceof Error?e.message:String(e))}}),this._toolHandlersInitialized=!0)}createToolError(e){return{content:[{type:"text",text:e}],isError:!0}}async validateToolInput(e,t,r){if(!e.inputSchema)return;let i=(0,y.normalizeObjectSchema)(e.inputSchema)??e.inputSchema,a=await (0,y.safeParseAsync)(i,t);if(!a.success){let e="error"in a?a.error:"Unknown error",t=(0,y.getParseErrorMessage)(e);throw new v.McpError(v.ErrorCode.InvalidParams,`Input validation error: Invalid arguments for tool ${r}: ${t}`)}return a.data}async validateToolOutput(e,t,r){if(!e.outputSchema||!("content"in t)||t.isError)return;if(!t.structuredContent)throw new v.McpError(v.ErrorCode.InvalidParams,`Output validation error: Tool ${r} has an output schema but no structured content was provided`);let i=(0,y.normalizeObjectSchema)(e.outputSchema),a=await (0,y.safeParseAsync)(i,t.structuredContent);if(!a.success){let e="error"in a?a.error:"Unknown error",t=(0,y.getParseErrorMessage)(e);throw new v.McpError(v.ErrorCode.InvalidParams,`Output validation error: Invalid structured content for tool ${r}: ${t}`)}}async executeToolHandler(e,t,r){let i=e.handler;if("createTask"in i){if(!r.taskStore)throw Error("No task store provided.");let a={...r,taskStore:r.taskStore};return e.inputSchema?await Promise.resolve(i.createTask(t,a)):await Promise.resolve(i.createTask(a))}return e.inputSchema?await Promise.resolve(i(t,r)):await Promise.resolve(i(r))}async handleAutomaticTaskPolling(e,t,r){if(!r.taskStore)throw Error("No task store provided for task-capable tool.");let i=await this.validateToolInput(e,t.params.arguments,t.params.name),a=e.handler,n={...r,taskStore:r.taskStore},s=i?await Promise.resolve(a.createTask(i,n)):await Promise.resolve(a.createTask(n)),o=s.task.taskId,l=s.task,c=l.pollInterval??5e3;for(;"completed"!==l.status&&"failed"!==l.status&&"cancelled"!==l.status;){await new Promise(e=>setTimeout(e,c));let e=await r.taskStore.getTask(o);if(!e)throw new v.McpError(v.ErrorCode.InternalError,`Task ${o} not found during polling`);l=e}return await r.taskStore.getTaskResult(o)}setCompletionRequestHandler(){this._completionHandlerInitialized||(this.server.assertCanSetRequestHandler(i2(v.CompleteRequestSchema)),this.server.registerCapabilities({completions:{}}),this.server.setRequestHandler(v.CompleteRequestSchema,async e=>{switch(e.params.ref.type){case"ref/prompt":return(0,v.assertCompleteRequestPrompt)(e),this.handlePromptCompletion(e,e.params.ref);case"ref/resource":return(0,v.assertCompleteRequestResourceTemplate)(e),this.handleResourceCompletion(e,e.params.ref);default:throw new v.McpError(v.ErrorCode.InvalidParams,`Invalid completion reference: ${e.params.ref}`)}}),this._completionHandlerInitialized=!0)}async handlePromptCompletion(e,t){let r,i=this._registeredPrompts[t.name];if(!i)throw new v.McpError(v.ErrorCode.InvalidParams,`Prompt ${t.name} not found`);if(!i.enabled)throw new v.McpError(v.ErrorCode.InvalidParams,`Prompt ${t.name} disabled`);if(!i.argsSchema)return i4;let a=(0,y.getObjectShape)(i.argsSchema),n=a?.[e.params.argument.name];if(!iG(n))return i4;let s=(r=n[iH],r?.complete);return s?i3(await s(e.params.argument.value,e.params.context)):i4}async handleResourceCompletion(e,t){let r=Object.values(this._registeredResourceTemplates).find(e=>e.resourceTemplate.uriTemplate.toString()===t.uri);if(!r){if(this._registeredResources[t.uri])return i4;throw new v.McpError(v.ErrorCode.InvalidParams,`Resource template ${e.params.ref.uri} not found`)}let i=r.resourceTemplate.completeCallback(e.params.argument.name);return i?i3(await i(e.params.argument.value,e.params.context)):i4}setResourceRequestHandlers(){this._resourceHandlersInitialized||(this.server.assertCanSetRequestHandler(i2(v.ListResourcesRequestSchema)),this.server.assertCanSetRequestHandler(i2(v.ListResourceTemplatesRequestSchema)),this.server.assertCanSetRequestHandler(i2(v.ReadResourceRequestSchema)),this.server.registerCapabilities({resources:{listChanged:!0}}),this.server.setRequestHandler(v.ListResourcesRequestSchema,async(e,t)=>{let r=Object.entries(this._registeredResources).filter(([e,t])=>t.enabled).map(([e,t])=>({uri:e,name:t.name,...t.metadata})),i=[];for(let e of Object.values(this._registeredResourceTemplates))if(e.resourceTemplate.listCallback)for(let r of(await e.resourceTemplate.listCallback(t)).resources)i.push({...e.metadata,...r});return{resources:[...r,...i]}}),this.server.setRequestHandler(v.ListResourceTemplatesRequestSchema,async()=>({resourceTemplates:Object.entries(this._registeredResourceTemplates).map(([e,t])=>({name:e,uriTemplate:t.resourceTemplate.uriTemplate.toString(),...t.metadata}))})),this.server.setRequestHandler(v.ReadResourceRequestSchema,async(e,t)=>{let r=new URL(e.params.uri),i=this._registeredResources[r.toString()];if(i){if(!i.enabled)throw new v.McpError(v.ErrorCode.InvalidParams,`Resource ${r} disabled`);return i.readCallback(r,t)}for(let e of Object.values(this._registeredResourceTemplates)){let i=e.resourceTemplate.uriTemplate.match(r.toString());if(i)return e.readCallback(r,i,t)}throw new v.McpError(v.ErrorCode.InvalidParams,`Resource ${r} not found`)}),this._resourceHandlersInitialized=!0)}setPromptRequestHandlers(){this._promptHandlersInitialized||(this.server.assertCanSetRequestHandler(i2(v.ListPromptsRequestSchema)),this.server.assertCanSetRequestHandler(i2(v.GetPromptRequestSchema)),this.server.registerCapabilities({prompts:{listChanged:!0}}),this.server.setRequestHandler(v.ListPromptsRequestSchema,()=>({prompts:Object.entries(this._registeredPrompts).filter(([,e])=>e.enabled).map(([e,t])=>{var r;let i;return{name:e,title:t.title,description:t.description,arguments:t.argsSchema?(r=t.argsSchema,(i=(0,y.getObjectShape)(r))?Object.entries(i).map(([e,t])=>({name:e,description:(0,y.getSchemaDescription)(t),required:!(0,y.isSchemaOptional)(t)})):[]):void 0}})})),this.server.setRequestHandler(v.GetPromptRequestSchema,async(e,t)=>{let r=this._registeredPrompts[e.params.name];if(!r)throw new v.McpError(v.ErrorCode.InvalidParams,`Prompt ${e.params.name} not found`);if(!r.enabled)throw new v.McpError(v.ErrorCode.InvalidParams,`Prompt ${e.params.name} disabled`);if(r.argsSchema){let i=(0,y.normalizeObjectSchema)(r.argsSchema),a=await (0,y.safeParseAsync)(i,e.params.arguments);if(!a.success){let t="error"in a?a.error:"Unknown error",r=(0,y.getParseErrorMessage)(t);throw new v.McpError(v.ErrorCode.InvalidParams,`Invalid arguments for prompt ${e.params.name}: ${r}`)}let n=a.data,s=r.callback;return await Promise.resolve(s(n,t))}{let e=r.callback;return await Promise.resolve(e(t))}}),this._promptHandlersInitialized=!0)}resource(e,t,...r){let i;"object"==typeof r[0]&&(i=r.shift());let a=r[0];if("string"==typeof t){if(this._registeredResources[t])throw Error(`Resource ${t} is already registered`);let r=this._createRegisteredResource(e,void 0,t,i,a);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),r}{if(this._registeredResourceTemplates[e])throw Error(`Resource template ${e} is already registered`);let r=this._createRegisteredResourceTemplate(e,void 0,t,i,a);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),r}}registerResource(e,t,r,i){if("string"==typeof t){if(this._registeredResources[t])throw Error(`Resource ${t} is already registered`);let a=this._createRegisteredResource(e,r.title,t,r,i);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),a}{if(this._registeredResourceTemplates[e])throw Error(`Resource template ${e} is already registered`);let a=this._createRegisteredResourceTemplate(e,r.title,t,r,i);return this.setResourceRequestHandlers(),this.sendResourceListChanged(),a}}_createRegisteredResource(e,t,r,i,a){let n={name:e,title:t,metadata:i,readCallback:a,enabled:!0,disable:()=>n.update({enabled:!1}),enable:()=>n.update({enabled:!0}),remove:()=>n.update({uri:null}),update:e=>{void 0!==e.uri&&e.uri!==r&&(delete this._registeredResources[r],e.uri&&(this._registeredResources[e.uri]=n)),void 0!==e.name&&(n.name=e.name),void 0!==e.title&&(n.title=e.title),void 0!==e.metadata&&(n.metadata=e.metadata),void 0!==e.callback&&(n.readCallback=e.callback),void 0!==e.enabled&&(n.enabled=e.enabled),this.sendResourceListChanged()}};return this._registeredResources[r]=n,n}_createRegisteredResourceTemplate(e,t,r,i,a){let n={resourceTemplate:r,title:t,metadata:i,readCallback:a,enabled:!0,disable:()=>n.update({enabled:!1}),enable:()=>n.update({enabled:!0}),remove:()=>n.update({name:null}),update:t=>{void 0!==t.name&&t.name!==e&&(delete this._registeredResourceTemplates[e],t.name&&(this._registeredResourceTemplates[t.name]=n)),void 0!==t.title&&(n.title=t.title),void 0!==t.template&&(n.resourceTemplate=t.template),void 0!==t.metadata&&(n.metadata=t.metadata),void 0!==t.callback&&(n.readCallback=t.callback),void 0!==t.enabled&&(n.enabled=t.enabled),this.sendResourceListChanged()}};this._registeredResourceTemplates[e]=n;let s=r.uriTemplate.variableNames;return Array.isArray(s)&&s.some(e=>!!r.completeCallback(e))&&this.setCompletionRequestHandler(),n}_createRegisteredPrompt(e,t,r,i,a){let n={title:t,description:r,argsSchema:void 0===i?void 0:(0,y.objectFromShape)(i),callback:a,enabled:!0,disable:()=>n.update({enabled:!1}),enable:()=>n.update({enabled:!0}),remove:()=>n.update({name:null}),update:t=>{void 0!==t.name&&t.name!==e&&(delete this._registeredPrompts[e],t.name&&(this._registeredPrompts[t.name]=n)),void 0!==t.title&&(n.title=t.title),void 0!==t.description&&(n.description=t.description),void 0!==t.argsSchema&&(n.argsSchema=(0,y.objectFromShape)(t.argsSchema)),void 0!==t.callback&&(n.callback=t.callback),void 0!==t.enabled&&(n.enabled=t.enabled),this.sendPromptListChanged()}};return this._registeredPrompts[e]=n,i&&Object.values(i).some(e=>iG(e instanceof e1.ZodOptional?e._def?.innerType:e))&&this.setCompletionRequestHandler(),n}_createRegisteredTool(e,t,r,i,a,n,s,o,l){iJ(e);let c={title:t,description:r,inputSchema:i1(i),outputSchema:i1(a),annotations:n,execution:s,_meta:o,handler:l,enabled:!0,disable:()=>c.update({enabled:!1}),enable:()=>c.update({enabled:!0}),remove:()=>c.update({name:null}),update:t=>{void 0!==t.name&&t.name!==e&&("string"==typeof t.name&&iJ(t.name),delete this._registeredTools[e],t.name&&(this._registeredTools[t.name]=c)),void 0!==t.title&&(c.title=t.title),void 0!==t.description&&(c.description=t.description),void 0!==t.paramsSchema&&(c.inputSchema=(0,y.objectFromShape)(t.paramsSchema)),void 0!==t.outputSchema&&(c.outputSchema=(0,y.objectFromShape)(t.outputSchema)),void 0!==t.callback&&(c.handler=t.callback),void 0!==t.annotations&&(c.annotations=t.annotations),void 0!==t._meta&&(c._meta=t._meta),void 0!==t.enabled&&(c.enabled=t.enabled),this.sendToolListChanged()}};return this._registeredTools[e]=c,this.setToolRequestHandlers(),this.sendToolListChanged(),c}tool(e,...t){let r,i,a,n;if(this._registeredTools[e])throw Error(`Tool ${e} is already registered`);if("string"==typeof t[0]&&(r=t.shift()),t.length>1){let r=t[0];if(i0(r))i=t.shift(),t.length>1&&"object"==typeof t[0]&&null!==t[0]&&!i0(t[0])&&(n=t.shift());else if("object"==typeof r&&null!==r){if(Object.values(r).some(e=>"object"==typeof e&&null!==e))throw Error(`Tool ${e} expected a Zod schema or ToolAnnotations, but received an unrecognized object`);n=t.shift()}}let s=t[0];return this._createRegisteredTool(e,void 0,r,i,a,n,{taskSupport:"forbidden"},void 0,s)}registerTool(e,t,r){if(this._registeredTools[e])throw Error(`Tool ${e} is already registered`);let{title:i,description:a,inputSchema:n,outputSchema:s,annotations:o,_meta:l}=t;return this._createRegisteredTool(e,i,a,n,s,o,{taskSupport:"forbidden"},l,r)}prompt(e,...t){let r,i;if(this._registeredPrompts[e])throw Error(`Prompt ${e} is already registered`);"string"==typeof t[0]&&(r=t.shift()),t.length>1&&(i=t.shift());let a=t[0],n=this._createRegisteredPrompt(e,void 0,r,i,a);return this.setPromptRequestHandlers(),this.sendPromptListChanged(),n}registerPrompt(e,t,r){if(this._registeredPrompts[e])throw Error(`Prompt ${e} is already registered`);let{title:i,description:a,argsSchema:n}=t,s=this._createRegisteredPrompt(e,i,a,n,r);return this.setPromptRequestHandlers(),this.sendPromptListChanged(),s}isConnected(){return void 0!==this.server.transport}async sendLoggingMessage(e,t){return this.server.sendLoggingMessage(e,t)}sendResourceListChanged(){this.isConnected()&&this.server.sendResourceListChanged()}sendToolListChanged(){this.isConnected()&&this.server.sendToolListChanged()}sendPromptListChanged(){this.isConnected()&&this.server.sendPromptListChanged()}}let iY={type:"object",properties:{}};function iQ(e){return null!==e&&"object"==typeof e&&"parse"in e&&"function"==typeof e.parse&&"safeParse"in e&&"function"==typeof e.safeParse}function iX(e){return"_def"in e||"_zod"in e||iQ(e)}function i0(e){return!("object"!=typeof e||null===e||iX(e))&&(0===Object.keys(e).length||Object.values(e).some(iQ))}function i1(e){if(e){if(i0(e))return(0,y.objectFromShape)(e);if(!iX(e))throw Error("inputSchema must be a Zod schema or raw shape, received an unrecognized object");return e}}function i2(e){let t=(0,y.getObjectShape)(e),r=t?.method;if(!r)throw Error("Schema is missing a method literal");let i=(0,y.getLiteralValue)(r);if("string"==typeof i)return i;throw Error("Schema method literal must be a string")}function i3(e){return{completion:{values:e.slice(0,100),total:e.length,hasMore:e.length>100}}}let i4={completion:{values:[],hasMore:!1}};e.s(["createBuiltInMcpServer",0,function(e){let t=new iZ({name:"ai-development-environment",version:"0.1.0"}),r=t.registerTool.bind(t);for(let t of e.definitions())r(t.name,{title:t.title,description:t.description,inputSchema:t.inputSchema,outputSchema:t.outputSchema,annotations:t.annotations},async r=>e.callByName(t.name,r));return t}],700909),e.s([],719961);var i6=e.i(750227),i8=e.i(320058);function i5(e,t){let r=[],i=e.includes("CLAUDE");return i&&r.push("CLAUDE"),(e.includes("CODEX")||!i&&e.length>0||"GLOBAL"===t&&e.includes("GITHUB_COPILOT"))&&r.push("AGENTS"),r}let i9="default",i7=["PREPARING","READY","APPLYING","NEEDS_RESOLUTION"],ae=["SCAN","READ"],at=[...ae,"APPLY"],ar={files:{orderBy:{path:"asc"}},groups:{include:{group:!0}}},ai={skills:{include:{skill:{include:{files:!0}}}},repositories:{include:{repository:!0}}};function aa(e,t){if(!e)return t;try{return JSON.parse(e)}catch{return t}}function an(e){return[...e.cursorEnabled?["CURSOR"]:[],...e.githubCopilotEnabled?["GITHUB_COPILOT"]:[],...e.codexEnabled?["CODEX"]:[],...e.claudeEnabled?["CLAUDE"]:[],...e.openCodeEnabled?["OPENCODE"]:[]]}function as(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 ao(e){return/^[A-Za-z]:[\\/]/.test(e)||e.startsWith("\\\\")?i6.win32:i6.posix}function al(e,...t){return ao(e).join(e,...t)}function ac(e){return ao(e).dirname(e)}class au{agentControl;constructor(e){this.agentControl=e,this.agentControl.registerCompletionHandler(i8.SKILL_SCAN_JOB_KIND,e=>this.completeScan(e)),this.agentControl.registerCompletionHandler(i8.SKILL_READ_JOB_KIND,e=>this.completeRead(e)),this.agentControl.registerCompletionHandler(i8.SKILL_APPLY_JOB_KIND,e=>this.completeApply(e)),this.agentControl.registerConnectionHandler(async()=>{await this.requestAutoReconcile()})}publish(e){rQ.agentEventBus.publish(rQ.SKILLS_CHANGED_TOPIC,{id:e??null}),e&&rQ.agentEventBus.publish((0,rQ.skillSyncRunTopic)(e),{id:e})}subscribe(){return rQ.agentEventBus.iterate(rQ.SKILLS_CHANGED_TOPIC)}subscribeRun(e){return rQ.agentEventBus.iterate((0,rQ.skillSyncRunTopic)(e))}async settings(){return(await (0,tY.getPrismaClient)()).skillSettings.upsert({where:{id:i9},create:{id:i9},update:{}})}async overview(e=""){let t=await (0,tY.getPrismaClient)(),r=e.trim().toLocaleLowerCase(),[i,a,n,s,o,l]=await Promise.all([t.skill.findMany({where:{deletedAt:null},include:ar,orderBy:{name:"asc"}}),t.skillGroup.findMany({include:ai,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:r?i.filter(e=>[e.name,e.description,...e.groups.map(({group:e})=>e.name)].some(e=>e.toLocaleLowerCase().includes(r))):i,groups:a,observations:n,installations:r?s.filter(e=>[e.skillName,e.description,e.agent.name,e.rootPath,e.codebase?.repository.name??""].some(e=>e.toLocaleLowerCase().includes(r))):s,settings:o,repositories:l}}async getSkill(e){return(await (0,tY.getPrismaClient)()).skill.findFirst({where:{id:e,deletedAt:null},include:ar})}async saveSkill(e){let t,r=(t=e.files.map(e=>({path:e.path,contentsBase64:e.contentsBase64,executable:e.executable})),(0,i8.parseSkillPackage)({name:e.name,description:e.description,packageHash:(0,i8.hashSkillFiles)(t),files:t})),i=[...new Set(e.groupIds)].slice(0,100),a=await (0,tY.getPrismaClient)();if(await a.skillGroup.count({where:{id:{in:i}}})!==i.length)throw Error("One or more skill groups were not found");let n=await a.skill.findUnique({where:{name:r.name}});if(n&&n.id!==e.id)throw Error("Skill names must be unique");let s=e.id??(0,g.randomUUID)(),o=e.id?await a.skillGroupSkill.findMany({where:{skillId:s},select:{groupId:!0}}):[];return await a.$transaction(async t=>{await t.skill.upsert({where:{id:s},create:{id:s,name:r.name,description:r.description,syncGlobally:e.syncGlobally,packageHash:r.packageHash},update:{name:r.name,description:r.description,syncGlobally:e.syncGlobally,packageHash:r.packageHash,deletedAt:null}}),await t.skillFile.deleteMany({where:{skillId:s}}),await t.skillFile.createMany({data:r.files.map(e=>{let t=Buffer.from(e.contentsBase64,"base64");return{id:(0,g.randomUUID)(),skillId:s,path:e.path,contents:t,executable:e.executable,contentHash:(0,g.createHash)("sha256").update(t).digest("hex")}})}),await t.skillGroupSkill.deleteMany({where:{skillId:s}}),i.length&&await t.skillGroupSkill.createMany({data:i.map(e=>({groupId:e,skillId:s}))})}),this.publish(),await this.scheduleAutoSync([...i,...o.map(e=>e.groupId)]),await this.getSkill(s)}async deleteSkill(e){let t=await (0,tY.getPrismaClient)(),r=await t.skill.findUnique({where:{id:e},include:{groups:!0}});return!!r&&(await t.skill.update({where:{id:e},data:{deletedAt:new Date}}),this.publish(),await this.scheduleAutoSync(r.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 r=[...new Set(e.skillIds)].slice(0,500),i=[...new Set(e.repositoryIds)].slice(0,500),a=await (0,tY.getPrismaClient)(),[n,s,o]=await Promise.all([a.skill.count({where:{id:{in:r},deletedAt:null}}),a.codebaseRepository.count({where:{id:{in:i}}}),a.skillGroup.findUnique({where:{name:t}})]);if(n!==r.length)throw Error("One or more skills were not found");if(s!==i.length)throw Error("One or more repositories were not found");if(o&&o.id!==e.id)throw Error("Group names must be unique");let l=e.id??(0,g.randomUUID)();return await a.$transaction(async e=>{await e.skillGroup.upsert({where:{id:l},create:{id:l,name:t},update:{name:t}}),await e.skillGroupSkill.deleteMany({where:{groupId:l}}),await e.codebaseRepositorySkillGroup.deleteMany({where:{groupId:l}}),r.length&&await e.skillGroupSkill.createMany({data:r.map(e=>({groupId:l,skillId:e}))}),i.length&&await e.codebaseRepositorySkillGroup.createMany({data:i.map(e=>({groupId:l,repositoryId:e}))})}),this.publish(),await this.scheduleAutoSync([l]),a.skillGroup.findUniqueOrThrow({where:{id:l},include:ai})}async validateGroupIds(e){let t=[...new Set(e)].slice(0,100),r=await (0,tY.getPrismaClient)();if(await r.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 (0,tY.getPrismaClient)();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 (0,tY.getPrismaClient)(),r=await t.skillGroup.deleteMany({where:{id:e}});return r.count&&this.publish(),r.count&&(await this.settings()).autoSyncProjectGroups&&await this.prepareSync("GROUP",null,!0),r.count>0}async saveSettings(e){let t=await (0,tY.getPrismaClient)(),r=await t.skillSettings.upsert({where:{id:i9},create:{id:i9,...e},update:e});return this.publish(),r.autoSyncProjectGroups&&await this.prepareSync("GROUP",null,!0),r}async setRepositoryGroups(e,t){let r=await this.validateGroupIds(t),i=await (0,tY.getPrismaClient)();await i.$transaction(async t=>{await t.codebaseRepositorySkillGroup.deleteMany({where:{repositoryId:e}}),r.length&&await t.codebaseRepositorySkillGroup.createMany({data:r.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 (0,tY.getPrismaClient)(),r=await t.codebase.findMany({where:{agentId:e,availability:"AVAILABLE"},include:{worktrees:{where:{missingAt:null}}}}),i=new Map;for(let e of r)for(let t of(i.set(e.folder,{codebaseId:e.id,worktreeId:null,folder:e.folder}),e.worktrees))i.set(t.folder,{codebaseId:e.id,worktreeId:t.id,folder:t.folder});return[...i.values()]}async prepareSync(e,t,r=!1){let i=await (0,tY.getPrismaClient)();if(t&&!await i.skillGroup.findUnique({where:{id:t}}))throw Error("Skill group not found");if(r){let r=await i.skillSyncRun.findFirst({where:{kind:e,groupId:t??null,status:{in:i7}},orderBy:{createdAt:"desc"}});if(r)return r}let a=await i.skillSyncRun.create({data:{id:(0,g.randomUUID)(),kind:e,groupId:t??null,automatic:r,status:"PREPARING"}}),n=an(await this.settings()),s=await i.agent.findMany({orderBy:{name:"asc"}});for(let e of s){let t=await i.skillSyncItem.create({data:{id:(0,g.randomUUID)(),runId:a.id,agentId:e.id,direction:"SCAN",status:"PENDING"}});await this.agentControl.createJob({agentId:e.id,kind:i8.SKILL_SCAN_JOB_KIND,payload:{tools:n,targets:await this.targets(e.id),syncRunId:a.id,syncItemId:t.id},idempotencyKey:`skills:scan:${a.id}:${e.id}`,timeoutSeconds:300,visibility:r?"SYSTEM":"USER"})}return!s.length&&(await i.skillSyncRun.update({where:{id:a.id},data:{status:"READY"}}),r)?this.applyRun(a.id):(this.publish(a.id),this.getRun(a.id))}async getRun(e){return(await (0,tY.getPrismaClient)()).skillSyncRun.findUnique({where:{id:e},include:{group:!0,items:{include:{skill:!0,installation:{include:{agent:!0}},agent:!0},orderBy:{createdAt:"asc"}}}})}completionIds(e){return aa(e.payloadJson,{})}async completeScan(e){let{syncRunId:t,syncItemId:r}=this.completionIds(e);if(!t||!r)return;let i=await (0,tY.getPrismaClient)();if(await i.skillSyncItem.findFirst({where:{id:r,runId:t,direction:"SCAN",status:"PENDING"}})){if("SUCCEEDED"===e.status&&e.resultJson){let t=aa(e.resultJson,{configuredTools:[],installations:[],warnings:[]}),a=new Date;await i.$transaction(async i=>{for(let r of(await i.skillInstallation.updateMany({where:{agentId:e.agentId},data:{present:!1}}),t.configuredTools))i8.AI_TOOLS.includes(r.tool)&&await i.skillToolObservation.upsert({where:{agentId_tool:{agentId:e.agentId,tool:r.tool}},create:{agentId:e.agentId,tool:r.tool,configured:r.configured,homePath:r.homePath,checkedAt:a},update:{configured:r.configured,homePath:r.homePath,checkedAt:a}});for(let r of t.installations){let t=await i.skill.findUnique({where:{name:r.skillName},select:{id:!0,deletedAt:!0}});await i.skillInstallation.upsert({where:{agentId_rootPath_skillName:{agentId:e.agentId,rootPath:r.rootPath,skillName:r.skillName}},create:{id:(0,g.randomUUID)(),agentId:e.agentId,skillId:t&&!t.deletedAt?t.id:null,codebaseId:r.codebaseId,worktreeId:r.worktreeId,scope:r.scope,rootKind:r.rootKind,rootPath:r.rootPath,skillName:r.skillName,description:r.description,packageHash:r.packageHash,present:!0,fileCount:r.fileCount,totalBytes:r.totalBytes,tracked:r.tracked,consumersJson:JSON.stringify(r.consumers),lastSeenAt:a},update:{skillId:t&&!t.deletedAt?t.id:void 0,codebaseId:r.codebaseId,worktreeId:r.worktreeId,scope:r.scope,rootKind:r.rootKind,description:r.description,packageHash:r.packageHash,present:!0,fileCount:r.fileCount,totalBytes:r.totalBytes,tracked:r.tracked,consumersJson:JSON.stringify(r.consumers),lastSeenAt:a}})}await i.skillSyncItem.updateMany({where:{id:r,status:"PENDING"},data:{status:"COMPLETE",error:t.warnings?.length?t.warnings.join("\n").slice(0,64e3):null}})})}else await i.skillSyncItem.updateMany({where:{id:r,status:"PENDING"},data:{status:"FAILED",error:e.error??"Skill scan failed"}});await i.skillSyncItem.count({where:{runId:t,direction:"SCAN",status:"PENDING"}})||await this.buildPlan(t),this.publish(t)}}async configuredByAgent(){let e=await (0,tY.getPrismaClient)(),t=new Set(an(await this.settings())),r=await e.skillToolObservation.findMany({where:{configured:!0}}),i=new Map;for(let e of r){if(!t.has(e.tool))continue;let r=i.get(e.agentId)??[];r.push(e.tool),i.set(e.agentId,r)}return i}async desiredLocations(e,t=new Set){let r=await (0,tY.getPrismaClient)(),i=await this.configuredByAgent(),a=await r.skillToolObservation.findMany({where:{configured:!0}}),n=new Map;for(let e of a)n.set(e.agentId,e.homePath);let s=[];if("ALL"===e.kind){let e=await r.skill.findMany({where:{deletedAt:null,syncGlobally:!0},include:ar});for(let[r,a]of i){if(t.has(r))continue;let i=n.get(r);if(i)for(let t of i5(a,"GLOBAL")){let a=al(i,...as("GLOBAL",t));for(let i of e)s.push({skill:i,agentId:r,codebaseId:null,worktreeId:null,scope:"GLOBAL",rootKind:t,folder:null,rootPath:a,targetPath:al(a,i.name)})}}}for(let a of(await r.skillGroup.findMany({where:"GROUP"===e.kind&&e.groupId?{id:e.groupId}:void 0,include:{skills:{where:{skill:{deletedAt:null}},include:{skill:{include:ar}}},repositories:{include:{repository:{include:{codebases:{where:{availability:"AVAILABLE"},include:{worktrees:{where:{missingAt:null}}}}}}}}}})))for(let e of a.repositories)for(let r of e.repository.codebases){if(t.has(r.agentId))continue;let e=i5(i.get(r.agentId)??[],"PROJECT");for(let t of[{folder:r.folder,worktreeId:null},...r.worktrees.map(e=>({folder:e.folder,worktreeId:e.id}))])for(let i of e){let e=al(t.folder,...as("PROJECT",i));for(let n of a.skills)s.push({skill:n.skill,agentId:r.agentId,codebaseId:r.id,worktreeId:t.worktreeId,scope:"PROJECT",rootKind:i,folder:t.folder,rootPath:e,targetPath:al(e,n.skill.name)})}}return[...new Map(s.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 (0,tY.getPrismaClient)(),r=await t.skillSyncRun.findUniqueOrThrow({where:{id:e}}),i=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[a,n,s,o,l]=await Promise.all([t.skill.findMany({where:{deletedAt:null},include:ar}),t.skill.findMany({where:{deletedAt:{not:null}}}),t.skillInstallation.findMany({where:this.installationWhere(r,i),include:{baseline:!0}}),this.desiredLocations(r,i),"GROUP"===r.kind&&r.groupId?this.desiredLocations({...r,groupId:null},i):this.desiredLocations(r,i)]),c=new Map(a.map(e=>[e.name,e])),u=new Map(a.map(e=>[e.id,e])),d=new Map(n.map(e=>[e.name,e])),p=new Map(n.map(e=>[e.id,e])),h=new Map;for(let e of s){let t=h.get(e.skillName)??[];t.push(e.packageHash),h.set(e.skillName,t)}let m=new Set([...h].flatMap(([e,t])=>{var r;return(r=c.get(e)?.packageHash??null,new Set(t.filter(e=>null===r||e!==r)).size>1)?[e]:[]})),f=[];for(let t of o)s.find(e=>e.agentId===t.agentId&&e.rootPath===t.rootPath&&e.skillName===t.skill.name)||f.push({id:(0,g.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 r of s){let i=r.baseline?.skillId??r.skillId,a=(i?u.get(i):void 0)??c.get(r.skillName),n=(i?p.get(i):void 0)??d.get(r.skillName),s=!!r.baseline&&!!a&&a.name!==r.skillName,h=o.find(e=>e.agentId===r.agentId&&e.rootPath===r.rootPath&&e.skill.name===r.skillName),v=l.find(e=>e.agentId===r.agentId&&e.rootPath===r.rootPath&&e.skill.name===r.skillName);a&&r.packageHash===a.packageHash&&!r.baseline&&await t.skillSyncBaseline.upsert({where:{installationId:r.id},create:{id:(0,g.randomUUID)(),installationId:r.id,skillId:a.id,packageHash:a.packageHash},update:{skillId:a.id,packageHash:a.packageHash,syncedAt:new Date}});let w="UNCHANGED",b="COMPLETE";if(n&&r.baseline&&!r.tracked)w="DELETE_MANAGED",b="READY";else if(s)w=r.tracked?"CONFLICT":"DELETE_MANAGED",b=r.tracked?"BLOCKED":"READY";else if(v||!r.baseline||r.tracked)if(a)if(r.packageHash!==a.packageHash){var y;b="CONFLICT"===(w=m.has(r.skillName)?"CONFLICT":(y={databaseHash:a.packageHash,targetHash:r.packageHash,baselineHash:r.baseline?.packageHash??null,tracked:r.tracked}).databaseHash===y.targetHash?"UNCHANGED":y.tracked?"CONFLICT":y.baselineHash===y.databaseHash?"IMPORT":y.baselineHash===y.targetHash?"EXPORT":"CONFLICT")?"BLOCKED":"READY"}else!v&&["CURSOR","GITHUB_COPILOT","CODEX_LEGACY","OPENCODE"].includes(r.rootKind)&&l.some(e=>e.agentId===r.agentId&&e.scope===r.scope&&("GLOBAL"===r.scope||e.codebaseId===r.codebaseId&&e.worktreeId===r.worktreeId)&&e.skill.name===r.skillName&&e.skill.packageHash===r.packageHash)&&!r.tracked&&(w="DELETE_REDUNDANT",b="READY");else b="CONFLICT"==(w=m.has(r.skillName)?"CONFLICT":"IMPORT")||"PROJECT"===r.scope?"BLOCKED":"READY";else w="DELETE_MANAGED",b="READY";f.push({id:(0,g.randomUUID)(),runId:e,skillId:a?.id??n?.id??null,installationId:r.id,agentId:r.agentId,direction:w,status:b,sourceHash:a?.packageHash??null,targetHash:r.packageHash,candidatePackageJson:JSON.stringify({location:{scope:r.scope,rootKind:r.rootKind,folder:"PROJECT"===r.scope?h?.folder??null:null,skillName:r.skillName},projectGroupRequired:!a&&"PROJECT"===r.scope})})}f.length&&await t.skillSyncItem.createMany({data:f});let v=await t.skillSyncItem.findMany({where:{runId:e,installationId:{not:null},direction:{in:["IMPORT","CONFLICT"]}},include:{installation:!0}}),w=new Map;for(let e of v){if(!e.agentId||!e.installation)continue;let t=w.get(e.agentId)??[];t.push(e),w.set(e.agentId,t)}let b=an(await this.settings());for(let[r,i]of w){let a=await t.skillSyncItem.create({data:{id:(0,g.randomUUID)(),runId:e,agentId:r,direction:"READ",status:"PENDING"}}),n=await this.targets(r);await this.agentControl.createJob({agentId:r,kind:i8.SKILL_READ_JOB_KIND,payload:{tools:b,targets:n,requests:i.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:a.id},idempotencyKey:`skills:read:${e}:${r}`,timeoutSeconds:300})}await this.refreshRunStatus(e)}async completeRead(e){let{syncRunId:t,syncItemId:r}=this.completionIds(e);if(!t||!r)return;let i=await (0,tY.getPrismaClient)();if(await i.skillSyncItem.findFirst({where:{id:r,runId:t,direction:"READ",status:"PENDING"}})){if("SUCCEEDED"===e.status&&e.resultJson){let a=aa(e.resultJson,{packages:[]}),n=await i.skillSyncItem.findMany({where:{runId:t,agentId:e.agentId,installationId:{not:null},direction:{in:["IMPORT","CONFLICT"]}},include:{installation:!0}});for(let e of a.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===al(e.folder,...as("PROJECT",e.rootKind))));if(!t)continue;let r=aa(t.candidatePackageJson,{});await i.skillSyncItem.update({where:{id:t.id},data:{candidatePackageJson:JSON.stringify({...r,package:e.package})}})}await i.skillSyncItem.updateMany({where:{id:r,status:"PENDING"},data:{status:"COMPLETE"}})}else await i.skillSyncItem.updateMany({where:{id:r,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 (0,tY.getPrismaClient)(),r=await t.skillSyncItem.findMany({where:{runId:e}});if(r.some(e=>ae.includes(e.direction)&&"PENDING"===e.status))return;let i=r.some(e=>"BLOCKED"===e.status),a=r.some(e=>"FAILED"===e.status),n=i?"NEEDS_RESOLUTION":a?"PARTIAL":"READY",s=await t.skillSyncRun.update({where:{id:e},data:{status:n}});this.publish(e),s.automatic&&"READY"===n&&await this.applyRun(e)}async skipPending(e){let t=await (0,tY.getPrismaClient)();await t.skillSyncRun.findUniqueOrThrow({where:{id:e}});let r=await t.skillSyncItem.findMany({where:{runId:e,direction:{in:at},status:"PENDING",agentId:{not:null}}}),i=[];for(let a of r){if(1!==(await t.skillSyncItem.updateMany({where:{id:a.id,status:"PENDING"},data:{status:"SKIPPED",resolution:"SKIP"}})).count||!a.agentId)continue;i.push(a);let r=await t.agentJob.findUnique({where:{agentId_idempotencyKey:{agentId:a.agentId,idempotencyKey:`skills:${a.direction.toLowerCase()}:${e}:${a.agentId}`}}});r&&await this.agentControl.cancelJob(r.id)}if(!i.length)return this.getRun(e);let a=[...new Set(i.flatMap(e=>"READ"===e.direction&&e.agentId?[e.agentId]:[]))];a.length&&await t.skillSyncItem.updateMany({where:{runId:e,agentId:{in:a},direction:{notIn:at},status:{in:["READY","BLOCKED"]}},data:{status:"SKIPPED",resolution:"SKIP"}});let n=i.filter(e=>"APPLY"===e.direction),s=n.flatMap(e=>{let{deployments:t=[]}=aa(e.candidatePackageJson,{});return t.map(e=>e.id)});return s.length&&await t.skillDeployment.updateMany({where:{id:{in:s},status:"PENDING"},data:{status:"SKIPPED"}}),i.some(e=>"SCAN"===e.direction)?await t.skillSyncItem.count({where:{runId:e,direction:"SCAN",status:"PENDING"}})||await this.buildPlan(e):a.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 (0,tY.getPrismaClient)(),r=await t.skillSyncItem.findUniqueOrThrow({where:{id:e.itemId}});if(!["BLOCKED","READY"].includes(r.status))throw Error("Sync item cannot be resolved");let i=aa(r.candidatePackageJson,{});if("MANUAL"===e.resolution&&(i.package=(0,i8.parseSkillPackage)(e.package,"manual resolution package")),"TARGET"===e.resolution&&!i.package)throw Error("The target package is unavailable");if("DELETE"===e.resolution&&!r.installationId)throw Error("The client skill installation is unavailable");if(i.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");i.groupId=e.groupId}if(await t.skillSyncItem.update({where:{id:r.id},data:{resolution:e.resolution,direction:"DELETE"===e.resolution?"DELETE_REDUNDANT":r.direction,candidatePackageJson:JSON.stringify(i),status:"SKIP"===e.resolution?"SKIPPED":"READY"}}),["TARGET","MANUAL"].includes(e.resolution)){let e=i.package?.name??null;if(e){let i=(await t.skillSyncItem.findMany({where:{runId:r.runId,id:{not:r.id},direction:"CONFLICT",status:{in:["BLOCKED","READY"]}},include:{skill:!0,installation:!0}})).flatMap(t=>(t.skill?.name??t.installation?.skillName)===e?[t.id]:[]);i.length&&await t.skillSyncItem.updateMany({where:{id:{in:i}},data:{resolution:"DATABASE",status:"READY"}})}}return await this.refreshRunStatus(r.runId),this.getRun(r.runId)}async importCandidates(e){let t=await (0,tY.getPrismaClient)();for(let r of(await t.skillSyncItem.findMany({where:{runId:e,status:"READY",OR:[{direction:"IMPORT"},{direction:"CONFLICT",resolution:{in:["TARGET","MANUAL"]}}]},include:{installation:!0}}))){let e=aa(r.candidatePackageJson,{});if(!e.package)continue;let i=await t.skill.findUnique({where:{name:e.package.name},include:ar}),a=await this.saveSkill({id:i?.id,name:e.package.name,description:e.package.description,syncGlobally:i?.syncGlobally??!e.groupId,groupIds:[...i?.groups.map(e=>e.groupId)??[],...e.groupId?[e.groupId]:[]],files:e.package.files});r.installationId&&(await t.skillInstallation.update({where:{id:r.installationId},data:{skillId:a.id}}),r.targetHash===a.packageHash&&await t.skillSyncBaseline.upsert({where:{installationId:r.installationId},create:{id:(0,g.randomUUID)(),installationId:r.installationId,skillId:a.id,packageHash:a.packageHash},update:{skillId:a.id,packageHash:a.packageHash,syncedAt:new Date}}))}}async applyRun(e){let t=await (0,tY.getPrismaClient)(),r=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 i=new Set((await t.skillSyncItem.findMany({where:{runId:e,direction:{in:ae},status:"SKIPPED"},select:{agentId:!0}})).flatMap(e=>e.agentId?[e.agentId]:[])),a=await this.desiredLocations(r,i),n=await t.skillInstallation.findMany({where:this.installationWhere(r,i)}),s=new Map,o=new Map,l=(e,t)=>{let r=s.get(e)??[];r.push(t),s.set(e,r)},c=(e,t)=>{let r=o.get(e)??[];r.push(t),o.set(e,r)};for(let e of a){let r=n.find(t=>t.agentId===e.agentId&&t.rootPath===e.rootPath&&t.skillName===e.skill.name);if(r?.packageHash===e.skill.packageHash||r?.tracked)continue;l(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 i=await t.skillDeployment.upsert({where:{agentId_targetPath:{agentId:e.agentId,targetPath:e.targetPath}},create:{id:(0,g.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}});c(e.agentId,{id:i.id,desiredHash:e.skill.packageHash})}let u=await t.skillSyncItem.findMany({where:{runId:e,direction:{in:["DELETE_REDUNDANT","DELETE_MANAGED"]},status:"READY"},include:{installation:!0}}),d=new Set(u.flatMap(e=>e.installationId?[e.installationId]:[])),p=n.filter(e=>!d.has(e.id)&&!e.tracked&&["CURSOR","GITHUB_COPILOT","CODEX_LEGACY","OPENCODE"].includes(e.rootKind)&&!a.some(t=>t.agentId===e.agentId&&t.rootPath===e.rootPath&&t.skill.name===e.skillName)&&a.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[...u.flatMap(e=>e.installation?[e.installation]:[]),...p]){if(!e||e.tracked)continue;let t=await this.targets(e.agentId),r="PROJECT"===e.scope?t.find(t=>t.codebaseId===e.codebaseId&&t.worktreeId===e.worktreeId)?.folder??null:null;("PROJECT"!==e.scope||r)&&l(e.agentId,{kind:"DELETE",scope:e.scope,rootKind:e.rootKind,folder:r,skillName:e.skillName,manageGitExclude:"PROJECT"===e.scope})}for(let[r,i]of s){let a=await t.skillSyncItem.create({data:{id:(0,g.randomUUID)(),runId:e,agentId:r,direction:"APPLY",status:"PENDING",candidatePackageJson:JSON.stringify({deployments:o.get(r)??[]})}});await this.agentControl.createJob({agentId:r,kind:i8.SKILL_APPLY_JOB_KIND,payload:{operations:i,syncRunId:e,syncItemId:a.id},idempotencyKey:`skills:apply:${e}:${r}`,timeoutSeconds:600})}return await t.skillSyncRun.update({where:{id:e},data:s.size?{status:"APPLYING"}:{status:"SUCCEEDED",finishedAt:new Date}}),this.publish(e),this.getRun(e)}async completeApply(e){let{syncRunId:t,syncItemId:r}=this.completionIds(e);if(!t||!r)return;let i=await (0,tY.getPrismaClient)(),a=await i.skillSyncItem.findFirst({where:{id:r,runId:t,direction:"APPLY",status:"PENDING"}});if(!a)return;let n="SUCCEEDED"===e.status,{deployments:s=[]}=aa(a?.candidatePackageJson??null,{});await i.skillSyncItem.updateMany({where:{id:r,status:"PENDING"},data:{status:n?"COMPLETE":"FAILED",error:n?null:e.error??"Skill apply failed"}});let o=await i.skillDeployment.findMany({where:{id:{in:s.map(e=>e.id)},agentId:e.agentId,status:"PENDING"},include:{skill:{include:{files:!0}}}}),l=aa(e.resultJson,{});if(n){let t=await this.configuredByAgent();for(let e of o){let r=s.find(t=>t.id===e.id),a=l.results?.find(t=>"WRITE"===t.kind&&t.path===e.targetPath);if(!r||e.desiredHash!==r.desiredHash||a?.packageHash!==r.desiredHash)continue;let n=await i.skillInstallation.upsert({where:{agentId_rootPath_skillName:{agentId:e.agentId,rootPath:ac(e.targetPath),skillName:e.skill.name}},create:{id:(0,g.randomUUID)(),skillId:e.skillId,agentId:e.agentId,codebaseId:e.codebaseId,worktreeId:e.worktreeId,scope:e.scope,rootKind:e.rootKind,rootPath:ac(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 i.skillSyncBaseline.upsert({where:{installationId:n.id},create:{id:(0,g.randomUUID)(),installationId:n.id,skillId:e.skillId,packageHash:e.desiredHash},update:{skillId:e.skillId,packageHash:e.desiredHash,syncedAt:new Date}}),await i.skillDeployment.update({where:{id:e.id},data:{status:"INSTALLED",installedHash:e.desiredHash,lastError:null}})}for(let t of l.results??[])if("DELETE"===t.kind){var c;await i.skillInstallation.updateMany({where:{agentId:e.agentId,rootPath:ac(t.path),skillName:ao(c=t.path).basename(c)},data:{present:!1,lastSeenAt:new Date}})}}else for(let t of s)await i.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 i.skillSyncItem.count({where:{runId:t,direction:"APPLY",status:"PENDING"}})){let e=await i.skillSyncItem.count({where:{runId:t,direction:"APPLY",status:{in:["FAILED","SKIPPED"]}}});await i.skillSyncRun.update({where:{id:t},data:{status:e?"PARTIAL":"SUCCEEDED",finishedAt:new Date}})}this.publish(t)}}e.i(464841);var ad=e.i(220629),ap=e.i(692680);e.i(493015);var ah=e.i(49172);function am(e){if(!e)return{};let t=JSON.parse(e);return t&&"object"==typeof t&&!Array.isArray(t)?t:{}}function af(e){if(!e)return null;let t=new Date(e);return Number.isNaN(t.valueOf())?null:t}function ag(e){try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>"string"==typeof e):[]}catch{return[]}}class ay{agentControl;fetcher;credentials;constructor(e,t=fetch,r=new tQ.CredentialService){for(const i of(this.agentControl=e,this.fetcher=t,this.credentials=r,this.agentControl.registerCompletionHandler(ap.SIGNING_ASSETS_SCAN_JOB_KIND,e=>this.completeScan(e)),[ap.SIGNING_PROFILE_READ_JOB_KIND,ap.SIGNING_PROFILE_INSTALL_JOB_KIND,ap.SIGNING_PROFILE_DELETE_JOB_KIND,ap.SIGNING_IDENTITY_IMPORT_JOB_KIND,ap.SIGNING_IDENTITY_DELETE_JOB_KIND]))this.agentControl.registerCompletionHandler(i,e=>this.completeOperation(e))}changed(){rQ.agentEventBus.publish(rQ.SIGNING_ASSETS_CHANGED_TOPIC,{changed:!0})}deleteTransferJobSoon(e){setTimeout(()=>{(0,tY.getPrismaClient)().then(t=>t.agentJob.deleteMany({where:{id:e,visibility:"SYSTEM"}}))},3e4).unref()}subscribe(){return rQ.agentEventBus.iterate(rQ.SIGNING_ASSETS_CHANGED_TOPIC)}async completeScan(e){if("SUCCEEDED"!==e.status)return;let t=(0,ap.parseSigningAssetsScanResult)(am(e.resultJson)),r=await (0,tY.getPrismaClient)(),i=new Date;await r.$transaction(async r=>{for(let a of(await r.signingProfileAsset.updateMany({where:{agentId:e.agentId,missingAt:null},data:{missingAt:i}}),await r.signingCertificateAsset.updateMany({where:{agentId:e.agentId,missingAt:null},data:{missingAt:i}}),t.profiles))await r.signingProfileAsset.upsert({where:{agentId_uuid:{agentId:e.agentId,uuid:a.uuid}},create:{id:(0,g.randomUUID)(),agentId:e.agentId,uuid:a.uuid,contentHash:a.contentHash,name:a.name,profileType:a.profileType,bundleId:a.bundleId,teamId:a.teamId,teamName:a.teamName,platformsJson:JSON.stringify(a.platforms),deviceCount:a.deviceCount,deviceUdidsJson:JSON.stringify(a.deviceUdids),certificateSha1sJson:JSON.stringify(a.certificateSha1s),createdAt:af(a.createdAt),expiresAt:af(a.expiresAt),expired:a.expired,xcodeManaged:a.xcodeManaged,observedAt:i},update:{contentHash:a.contentHash,name:a.name,profileType:a.profileType,bundleId:a.bundleId,teamId:a.teamId,teamName:a.teamName,platformsJson:JSON.stringify(a.platforms),deviceCount:a.deviceCount,deviceUdidsJson:JSON.stringify(a.deviceUdids),certificateSha1sJson:JSON.stringify(a.certificateSha1s),createdAt:af(a.createdAt),expiresAt:af(a.expiresAt),expired:a.expired,xcodeManaged:a.xcodeManaged,observedAt:i,missingAt:null}});for(let a of t.certificates)await r.signingCertificateAsset.upsert({where:{agentId_sha1:{agentId:e.agentId,sha1:a.sha1}},create:{id:(0,g.randomUUID)(),agentId:e.agentId,sha1:a.sha1,sha256:a.sha256,name:a.name,teamId:a.teamId,certificateType:a.certificateType,notBefore:af(a.notBefore),expiresAt:af(a.expiresAt),expired:a.expired,hasPrivateKey:a.hasPrivateKey,observedAt:i},update:{sha256:a.sha256,name:a.name,teamId:a.teamId,certificateType:a.certificateType,notBefore:af(a.notBefore),expiresAt:af(a.expiresAt),expired:a.expired,hasPrivateKey:a.hasPrivateKey,observedAt:i,missingAt:null}})}),this.deleteTransferJobSoon(e.id),this.changed()}async refreshAfterMutation(e,t){await this.agentControl.createJob({agentId:e,kind:ap.SIGNING_ASSETS_SCAN_JOB_KIND,payload:{},idempotencyKey:`signing:${t}:${e}:refresh`,timeoutSeconds:60,visibility:"SYSTEM"})}async finishOperation(e){let t=await (0,tY.getPrismaClient)(),r=await t.signingOperationItem.findMany({where:{operationId:e}});if(r.some(e=>["WAITING","QUEUED","RUNNING"].includes(e.status)))return;let i=r.filter(e=>"SUCCEEDED"!==e.status);await t.signingOperation.update({where:{id:e},data:{status:i.length?"FAILED":"SUCCEEDED",error:i.map(e=>e.error).filter(Boolean).join("; ")||null,finishedAt:new Date}}),this.changed()}async completeOperation(e){let t=await (0,tY.getPrismaClient)(),r=await t.signingOperationItem.findUnique({where:{jobId:e.id},include:{operation:!0}});if(r){if(await t.signingOperationItem.update({where:{id:r.id},data:{status:e.status,error:e.error,finishedAt:new Date}}),e.kind===ap.SIGNING_PROFILE_READ_JOB_KIND&&"SUCCEEDED"===e.status&&"SYNC_PROFILE"===r.operation.kind){let i=am(e.resultJson).contentBase64;if("string"==typeof i&&i)for(let e of(await t.signingOperationItem.findMany({where:{operationId:r.operationId,status:"WAITING"}}))){let a=await this.agentControl.createJob({agentId:e.agentId,kind:ap.SIGNING_PROFILE_INSTALL_JOB_KIND,payload:{contentBase64:i},idempotencyKey:`signing:${r.operationId}:${e.agentId}:install`,timeoutSeconds:60,visibility:"SYSTEM"});await t.signingOperationItem.update({where:{id:e.id},data:{jobId:a.id,status:a.status}})}else await t.signingOperation.update({where:{id:r.operationId},data:{status:"FAILED",error:"Profile read returned no content"}})}e.kind===ap.SIGNING_PROFILE_READ_JOB_KIND&&"SUCCEEDED"!==e.status&&"SYNC_PROFILE"===r.operation.kind&&await t.signingOperationItem.updateMany({where:{operationId:r.operationId,status:"WAITING"},data:{status:"FAILED",error:"Source profile could not be read",finishedAt:new Date}}),"SUCCEEDED"===e.status&&e.kind!==ap.SIGNING_PROFILE_READ_JOB_KIND&&await this.refreshAfterMutation(e.agentId,r.operationId),await this.finishOperation(r.operationId),this.deleteTransferJobSoon(e.id)}}async refresh(e){let t=await (0,tY.getPrismaClient)(),r=await t.agent.findMany({where:e?.length?{id:{in:[...new Set(e)]}}:void 0,orderBy:{name:"asc"}}),i=[];for(let e of r)ag(e.capabilitiesJson).includes(ap.SIGNING_ASSETS_SCAN_JOB_KIND)&&i.push(await this.agentControl.createJob({agentId:e.id,kind:ap.SIGNING_ASSETS_SCAN_JOB_KIND,payload:{},idempotencyKey:`signing:scan:${Date.now()}:${e.id}`,timeoutSeconds:60,visibility:"SYSTEM"}));return i}async agents(){let e=await (0,tY.getPrismaClient)();return(await e.agent.findMany({orderBy:{name:"asc"}})).map(e=>({id:e.id,name:e.name,hostname:e.hostname,supported:ag(e.capabilitiesJson).includes(ap.SIGNING_ASSETS_SCAN_JOB_KIND),lastSeenAt:e.lastSeenAt?.toISOString()??null}))}async profiles(){let e=await (0,tY.getPrismaClient)(),t=await e.signingProfileAsset.findMany({where:{missingAt:null},include:{agent:{select:{id:!0,name:!0}}},orderBy:[{expiresAt:"asc"},{name:"asc"}]}),r=new Map;for(let e of t){let t=`${e.uuid}:${e.contentHash}`;r.set(t,[...r.get(t)??[],e])}return[...r.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:ag(t.platformsJson),deviceCount:t.deviceCount,deviceUdids:ag(t.deviceUdidsJson),certificateSha1s:ag(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,r=e.filter(e=>{let r=e.toUpperCase();return!t.has(r)&&(t.add(r),!0)}),i=r.map(e=>e.toUpperCase());if(!i.length)return[];let a=await (0,tY.getPrismaClient)(),n=new Map((await a.iosDevice.findMany({where:{udid:{in:i}},select:{id:!0,udid:!0,displayName:!0,product:!0,osVersion:!0,status:!0}})).map(e=>[e.udid.toUpperCase(),e]));return r.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 (0,tY.getPrismaClient)(),t=await e.signingCertificateAsset.findMany({where:{missingAt:null},include:{agent:{select:{id:!0,name:!0}}},orderBy:[{expiresAt:"asc"},{name:"asc"}]}),r=new Map;for(let e of t)r.set(e.sha1,[...r.get(e.sha1)??[],e]);return[...r.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 (0,tY.getPrismaClient)()).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,r,i=null,a=[]){let n=await (0,tY.getPrismaClient)(),s=(0,g.randomUUID)();return n.signingOperation.create({data:{id:s,kind:e,assetKey:t,sourceAgentId:i,items:{create:[...new Set(r)].map(e=>({id:(0,g.randomUUID)(),agentId:e,status:a.includes(e)?"WAITING":"QUEUED"}))}},include:{items:{include:{agent:{select:{id:!0,name:!0}}}}}})}async attachJob(e,t){let r=await (0,tY.getPrismaClient)();await r.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 r=(0,g.createHash)("sha256").update(Buffer.from(e,"base64")).digest("hex").toUpperCase(),i=await this.operation("INSTALL_PROFILE",r,t);for(let t of i.items){let r=await this.agentControl.createJob({agentId:t.agentId,kind:ap.SIGNING_PROFILE_INSTALL_JOB_KIND,payload:{contentBase64:e},idempotencyKey:`signing:${i.id}:${t.agentId}:install`,timeoutSeconds:60,visibility:"SYSTEM"});await this.attachJob(t.id,r)}return this.changed(),i}async downloadProfile(e,t){let r=(0,g.randomUUID)(),i=await this.agentControl.createJob({agentId:t,kind:ap.SIGNING_PROFILE_READ_JOB_KIND,payload:{uuid:e},idempotencyKey:`signing:download:${r}:${e}`,timeoutSeconds:60,visibility:"SYSTEM"}),a=await (0,tY.getPrismaClient)();try{let t=Date.now()+55e3;for(;Date.now()<t;){let t=await this.agentControl.getJob(i.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 r=am(t.resultJson);if("string"!=typeof r.contentBase64)throw Error("Agent returned no provisioning profile content");return{uuid:e,filename:`${e}.mobileprovision`,contentBase64:r.contentBase64}}await new Promise(e=>setTimeout(e,250))}throw Error("Timed out reading provisioning profile")}finally{await a.agentJob.deleteMany({where:{id:i.id,visibility:"SYSTEM"}})}}async syncProfile(e,t,r){let i=[...new Set(r)].filter(e=>e!==t);if(!i.length)throw Error("Select at least one target agent");let a=await this.operation("SYNC_PROFILE",e,[t,...i],t,i),n=a.items.find(e=>e.agentId===t),s=await this.agentControl.createJob({agentId:t,kind:ap.SIGNING_PROFILE_READ_JOB_KIND,payload:{uuid:e},idempotencyKey:`signing:${a.id}:${t}:read`,timeoutSeconds:60,visibility:"SYSTEM"});return await this.attachJob(n.id,s),this.changed(),a}async deleteProfile(e,t){if(!t.length)throw Error("Select at least one agent");let r=await this.operation("DELETE_PROFILE",e,t);for(let t of r.items){let i=await this.agentControl.createJob({agentId:t.agentId,kind:ap.SIGNING_PROFILE_DELETE_JOB_KIND,payload:{uuid:e},idempotencyKey:`signing:${r.id}:${t.agentId}:delete`,timeoutSeconds:60,visibility:"SYSTEM"});await this.attachJob(t.id,i)}return this.changed(),r}async deleteExpiredProfiles(e){let t=await (0,tY.getPrismaClient)(),r=await t.signingProfileAsset.findMany({where:{expired:!0,missingAt:null,...e?.length?{agentId:{in:e}}:{}}}),i=new Map;for(let e of r)i.set(e.uuid,[...i.get(e.uuid)??[],e.agentId]);let a=[];for(let[e,t]of i)a.push(await this.deleteProfile(e,t));return a}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 r=[...new Set(e.targetAgentIds)],i=await (0,tY.getPrismaClient)(),n=new Map((await i.agent.findMany({where:{id:{in:r}},select:{id:!0,name:!0,capabilitiesJson:!0,lastSeenAt:!0,disconnectedAt:!0,heartbeatIntervalSeconds:!0}})).map(e=>[e.id,e])),s=Date.now(),o=r.filter(e=>{let t=n.get(e);return!t||!function(e,t=Date.now()){return null!==e.lastSeenAt&&t-e.lastSeenAt.getTime()<=(0,a.agentOnlineWindowMs)(e)&&null===e.disconnectedAt}(t,s)||!ag(t.capabilitiesJson).includes(ap.SIGNING_IDENTITY_IMPORT_JOB_KIND)});if(o.length)throw Error(`Identity imports require online supported agents: ${o.map(e=>n.get(e)?.name??e).join(", ")}`);let l=(0,g.createHash)("sha256").update(t).digest("hex").toUpperCase(),c=await this.operation("IMPORT_IDENTITY",l,r);for(let t of c.items){let r=this.agentControl.createSigningSecretTransfer(t.agentId,{p12Base64:e.p12Base64,passphrase:e.passphrase});try{let e=await this.agentControl.createJob({agentId:t.agentId,kind:ap.SIGNING_IDENTITY_IMPORT_JOB_KIND,payload:{transferId:r,sha256:l},idempotencyKey:`signing:${c.id}:${t.agentId}:import`,timeoutSeconds:120,visibility:"SYSTEM"});await this.attachJob(t.id,e)}catch(e){throw this.agentControl.revokeSigningSecretTransfer(r),e}}return this.changed(),c}async deleteIdentity(e,t){if(!t.length)throw Error("Select at least one agent");let r=e.toUpperCase(),i=[...new Set(t)],a=await (0,tY.getPrismaClient)(),n=new Set((await a.signingCertificateAsset.findMany({where:{sha1:r,agentId:{in:i},hasPrivateKey:!0,missingAt:null},select:{agentId:!0}})).map(e=>e.agentId)),s=i.filter(e=>n.has(e));if(!s.length)throw Error("The identity has no private key on the selected agents");let o=await this.operation("DELETE_IDENTITY",r,s);for(let e of o.items){let t=await this.agentControl.createJob({agentId:e.agentId,kind:ap.SIGNING_IDENTITY_DELETE_JOB_KIND,payload:{sha1:r},idempotencyKey:`signing:${o.id}:${e.agentId}:delete`,timeoutSeconds:60,visibility:"SYSTEM"});await this.attachJob(e.id,t)}return this.changed(),o}async appleClient(){return new ah.AppleDeveloperClient(await (0,ah.storedAppleDeveloperCredentials)(this.credentials),this.fetcher)}async portalInventory(){let e=await this.appleClient(),[t,r,i,a]=await Promise.all([e.listProfiles(),e.listCertificates(),e.listBundleIds(),e.listDevices()]);return{profiles:t,certificates:r,bundleIds:i,devices:a}}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 av=e.i(308810),aw=e.i(726355);let ab={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},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},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},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},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},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},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},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},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},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},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},WORKFLOW_MESSAGE:{key:"WORKFLOW_MESSAGE",category:"WORKFLOWS",label:"Workflow message",description:"A workflow sends a generic notification.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1},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},WORKFLOW_COMPLETED:{key:"WORKFLOW_COMPLETED",category:"WORKFLOWS",label:"Workflow completed",description:"A workflow run completes successfully.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1},WORKFLOW_FAILED:{key:"WORKFLOW_FAILED",category:"WORKFLOWS",label:"Workflow failed",description:"A workflow run fails.",defaultSidebarEnabled:!0,defaultBrowserEnabled:!0,defaultWebPushEnabled:!1},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}};function ak(e){return e in ab?ab[e]:null}let ax="default";function aS(e,t,r){let i=e.trim();if(!i)throw Error(`${t} is required`);if(i.length>r)throw Error(`${t} is too long`);return i}function aI(e){let t,r=aS(e,"Push endpoint",4e3);try{t=new URL(r)}catch{throw Error("Push endpoint must be a valid URL")}if("https:"!==t.protocol)throw Error("Push endpoint must use HTTPS");return r}function aE(e,t){let r=new Date(e);if(!Number.isFinite(r.getTime()))throw Error(`${t} is invalid`);return r}function aA(){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 a_(e){if(!e||"object"!=typeof e)return null;let t=e.statusCode;return"number"==typeof t?t:null}class aC{credentialService;vapidPreparation;constructor(e){this.credentialService=e,this.vapidPreparation=null}publish(e){rQ.agentEventBus.publish(rQ.APP_NOTIFICATIONS_CHANGED_TOPIC,{notificationsChanged:e})}subscribe(){return rQ.agentEventBus.iterate(rQ.APP_NOTIFICATIONS_CHANGED_TOPIC)}async preferences(){let e=await (0,tY.getPrismaClient)(),t=new Map((await e.notificationPreference.findMany()).map(e=>[e.typeKey,e]));return Object.values(ab).map(e=>{let r=t.get(e.key);return{...e,sidebarEnabled:r?.sidebarEnabled??e.defaultSidebarEnabled,browserEnabled:r?.browserEnabled??e.defaultBrowserEnabled,webPushEnabled:r?.webPushEnabled??e.defaultWebPushEnabled,updatedAt:r?.updatedAt??null}})}async savePreference(e){let t=ak(e.typeKey);if(!t)throw Error("Unknown notification type");let r=await (0,tY.getPrismaClient)(),i=await r.notificationPreference.upsert({where:{typeKey:t.key},create:{typeKey:t.key,sidebarEnabled:e.sidebarEnabled,browserEnabled:e.browserEnabled,webPushEnabled:e.webPushEnabled},update:{sidebarEnabled:e.sidebarEnabled,browserEnabled:e.browserEnabled,webPushEnabled:e.webPushEnabled}});return this.publish({kind:"PREFERENCES_UPDATED",notification:null,notificationId:null}),{...t,...i}}async recordInTransaction(e,t){let r=ak(t.typeKey);if(!r)throw Error("Unknown notification type");let i=await e.notificationPreference.findUnique({where:{typeKey:r.key}}),a=i?.sidebarEnabled??r.defaultSidebarEnabled,n=i?.browserEnabled??r.defaultBrowserEnabled,s=i?.webPushEnabled??r.defaultWebPushEnabled;if(!a&&!n&&!s)return null;let o=aS(t.dedupeKey,"Deduplication key",500);return await e.appNotification.findUnique({where:{dedupeKey:o}})?null:e.appNotification.create({data:{id:(0,g.randomUUID)(),dedupeKey:o,typeKey:r.key,title:aS(t.title,"Notification title",240),body:aS(t.body,"Notification body",1e3),href:function(e){let t=aS(e,"Notification link",2e3);if(!t.startsWith("/")||t.startsWith("//"))throw Error("Notification links must be same-origin paths");return t}(t.href),resourceKind:aS(t.resourceKind,"Resource kind",100),resourceId:aS(t.resourceId,"Resource ID",500),worktreeId:t.worktreeId??null,highlightColor:t.highlightColor?.trim()||null,sidebarRequested:a,browserRequested:n,webPushRequested: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)}))}async history(e={}){let t=Math.max(1,Math.min(e.first??100,200)),r=await (0,tY.getPrismaClient)(),[i,a]=await Promise.all([r.appNotification.findMany({orderBy:[{createdAt:"desc"},{id:"desc"}],take:t+1,...e.after?{cursor:{id:e.after},skip:1}:void 0}),r.appNotification.count()]);return{items:i.slice(0,t),nextCursor:i.length>t?i[t-1].id:null,totalCount:a}}async sidebar(e=50){return(await (0,tY.getPrismaClient)()).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 (0,tY.getPrismaClient)(),r=await t.appNotification.updateMany({where:{id:e,sidebarRequested:!0,sidebarDismissedAt:null},data:{sidebarDismissedAt:new Date}});return r.count&&this.publish({kind:"DISMISSED",notification:null,notificationId:e}),r.count>0}async dismissAll(){let e=await (0,tY.getPrismaClient)(),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??[],r=e.all&&0===t.length?[]:[...new Set(e.ids??[])],i=[...new Set(e.excludedIds??[])],a=e.ranges??[];if(r.length>5e3||i.length>5e3)throw Error("Notification selection is too large");if(a.length>366||t.length>366)throw Error("Notification date selection is too large");let n=t.map(e=>{let t=aE(e.start,"Excluded selection start"),r=aE(e.end,"Excluded selection end");if(t>=r)throw Error("Excluded selection range is invalid");return{createdAt:{gte:t,lt:r}}}),s={NOT:{OR:n}},o=[];if(r.length&&o.push({id:{in:r}}),e.all)o.push(n.length?s:{});else if(a.length){let e=a.map(e=>{let t=aE(e.start,"Selection start"),r=aE(e.end,"Selection end");if(t>=r)throw Error("Selection range is invalid");return{createdAt:{gte:t,lt:r}}});o.push({AND:[{OR:e},...n.length?[s]:[]]})}if(!o.length)return{id:{in:[]}};let l=1===o.length?o[0]:{OR:o};return i.length?{AND:[l,{id:{notIn:i}}]}:l}async deleteSelection(e){let t=await (0,tY.getPrismaClient)(),r=await t.appNotification.deleteMany({where:this.selectionWhere(e)});return r.count&&this.publish({kind:"DELETED",notification:null,notificationId:null}),r.count}async deleteAll(){let e=await (0,tY.getPrismaClient)(),t=await e.appNotification.deleteMany();return t.count&&this.publish({kind:"HISTORY_CLEARED",notification:null,notificationId:null}),t.count}async webPushState(){let e=await (0,tY.getPrismaClient)(),[t,r]=await Promise.all([e.webPushSettings.findUnique({where:{id:ax}}),e.webPushSubscription.count()]),i=await this.credentialService.isConfigured(tX.CREDENTIALS.webPushVapidPrivateKey);return{configured:!!(t?.vapidPublicKey&&i),publicKey:t?.vapidPublicKey??null,subscriptionCount:r}}async webPushSubscriptions(){return(await (0,tY.getPrismaClient)()).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 (0,tY.getPrismaClient)(),t=await e.webPushSettings.findUnique({where:{id:ax}});if(t?.vapidPublicKey){if(!await this.credentialService.getText(tX.CREDENTIALS.webPushVapidPrivateKey))throw Error("The Web Push private key is unavailable");return{publicKey:t.vapidPublicKey}}let r=aw.default.generateVAPIDKeys();return await this.credentialService.setText(tX.CREDENTIALS.webPushVapidPrivateKey,r.privateKey,e=>e.webPushSettings.upsert({where:{id:ax},create:{id:ax,vapidPublicKey:r.publicKey,vapidGeneratedAt:new Date},update:{vapidPublicKey:r.publicKey,vapidGeneratedAt:new Date}}).then(()=>void 0)),{publicKey:r.publicKey}}async registerWebPush(e){let t=aI(e.endpoint),r=aS(e.p256dh,"Push p256dh key",1e3),i=aS(e.auth,"Push auth key",1e3),a=null===e.expirationTime||void 0===e.expirationTime?null:new Date(e.expirationTime);if(a&&!Number.isFinite(a.getTime()))throw Error("Push subscription expiration is invalid");return await this.prepareWebPush(),(await (0,tY.getPrismaClient)()).webPushSubscription.upsert({where:{endpoint:t},create:{id:(0,g.randomUUID)(),endpoint:t,p256dh:r,auth:i,expirationTime:a,locale:e.locale?.trim().slice(0,35)||null,userAgent:e.userAgent?.trim().slice(0,1e3)||null},update:{p256dh:r,auth:i,expirationTime:a,locale:e.locale?.trim().slice(0,35)||null,userAgent:e.userAgent?.trim().slice(0,1e3)||null,lastSeenAt:new Date}})}async unregisterWebPush(e){let t=aI(e),r=await (0,tY.getPrismaClient)();return(await r.webPushSubscription.deleteMany({where:{endpoint:t}})).count>0}async deleteWebPushSubscription(e){let t=aS(e,"Push subscription",200),r=await (0,tY.getPrismaClient)();return(await r.webPushSubscription.deleteMany({where:{id:t}})).count>0}async testWebPushSubscription(e){let t=aS(e,"Push subscription",200),r=await (0,tY.getPrismaClient)(),[i,a]=await Promise.all([r.webPushSettings.findUnique({where:{id:ax}}),r.webPushSubscription.findUnique({where:{id:t}})]);if(!a)throw Error("Push subscription was not found");if(!i?.vapidPublicKey)throw Error("Web Push is not configured");let n=await this.credentialService.getText(tX.CREDENTIALS.webPushVapidPrivateKey);if(!n)throw Error("The Web Push private key is unavailable");aw.default.setVapidDetails(aA(),i.vapidPublicKey,n);try{return await aw.default.sendNotification({endpoint:a.endpoint,expirationTime:a.expirationTime?.getTime()??null,keys:{p256dh:a.p256dh,auth:a.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(a_(e)??0))throw await r.webPushSubscription.deleteMany({where:{id:t}}),Error("The browser subscription expired and was removed");throw e}}async deliverWebPush(e){if(!e.webPushRequested)return;let t=await (0,tY.getPrismaClient)(),[r,i]=await Promise.all([t.webPushSettings.findUnique({where:{id:ax}}),t.webPushSubscription.findMany()]);if(!r?.vapidPublicKey||!i.length)return;let a=await this.credentialService.getText(tX.CREDENTIALS.webPushVapidPrivateKey);if(!a)return;aw.default.setVapidDetails(aA(),r.vapidPublicKey,a);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(i.map(async e=>{try{await aw.default.sendNotification({endpoint:e.endpoint,expirationTime:e.expirationTime?.getTime()??null,keys:{p256dh:e.p256dh,auth:e.auth}},n,{TTL:3600,timeout:1e4})}catch(r){if([404,410].includes(a_(r)??0))return void await t.webPushSubscription.deleteMany({where:{endpoint:e.endpoint}});console.error(`Web Push delivery to ${e.endpoint} failed:`,r)}}))}}var aT=e.i(986847);let aR=e=>e?.toISOString()??null;function aD(e,t,r,i,a){return e?t?"RUNNING":a?"ERROR":r&&!i||r&&i&&Date.now()-i.getTime()>2e3*r+5e3?"STALE":"HEALTHY":"DISABLED"}class aN{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 r=this.operations.get(e);r&&(Object.assign(r,t),r.enabled||(r.nextScheduledAt=null),this.changed(e))}schedule(e,t){let r=this.operations.get(e);r&&(r.nextScheduledAt=t,this.changed(e))}async run(e,t,r){let i=this.operations.get(e);if(!i)throw Error(`Polling operation ${e} is not registered`);let a=new Date;i.lastStartedAt=a,i.lastError=null,this.changed(e);try{let e=await t(),n=new Date;return i.lastCompletedAt=n,i.lastSucceededAt=n,i.durationMs=n.getTime()-a.getTime(),i.lastError=null,r&&(i.details={...i.details,...r(e)}),e}catch(t){let e=new Date;throw i.lastCompletedAt=e,i.durationMs=e.getTime()-a.getTime(),i.lastError=t instanceof Error?t.message:String(t),t}finally{this.changed(e)}}changed(e){rQ.agentEventBus.publish(rQ.POLLING_CHANGED_TOPIC,{pollingOperationChanged:e})}subscribe(){return rQ.agentEventBus.iterate(rQ.POLLING_CHANGED_TOPIC)}serverViews(){return[...this.operations.values()].map(e=>({...e,status:aD(e.enabled,!!(e.lastStartedAt&&(!e.lastCompletedAt||e.lastStartedAt>e.lastCompletedAt)),e.cadenceSeconds,e.lastCompletedAt,e.lastError),lastStartedAt:aR(e.lastStartedAt),lastCompletedAt:aR(e.lastCompletedAt),lastSucceededAt:aR(e.lastSucceededAt),nextScheduledAt:aR(e.nextScheduledAt)}))}async list(){let e=await (0,tY.getPrismaClient)(),[t,r,i]=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}})]),n=t?.refreshIntervalSeconds??30,s=t?.fetchIntervalSeconds??300,o=new Map;for(let e of i)o.set(e.agentId,(o.get(e.agentId)??0)+e._count._all);let l=[];for(let e of r){let t=e.heartbeatIntervalSeconds??aT.DEFAULT_AGENT_HEARTBEAT_INTERVAL_SECONDS,r=e.jobReconciliationIntervalSeconds??aT.DEFAULT_AGENT_JOB_RECONCILIATION_INTERVAL_SECONDS,i=e.codebaseScanIntervalSeconds??n,c=e.gitFetchIntervalSeconds??s,u=null!==e.lastSeenAt&&null===e.disconnectedAt&&Date.now()-e.lastSeenAt.getTime()<=(0,a.agentOnlineWindowMs)(e);l.push({id:`agent-heartbeat:${e.id}`,kind:"AGENT_HEARTBEAT",runtime:"AGENT",status:u?"HEALTHY":"STALE",enabled:!0,cadenceSeconds:t,lastStartedAt:null,lastCompletedAt:aR(e.lastSeenAt),lastSucceededAt:aR(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:u?"ONLINE":"OFFLINE"}});let d=e.diskSpaceState,p=d?.enabled??!0,h=d?.lastReportedAt??null,m=0;try{let e=JSON.parse(d?.volumesJson??"[]");m=Array.isArray(e)?e.length:0}catch{m=0}l.push({id:`agent-disk-space:${e.id}`,kind:"AGENT_DISK_SPACE",runtime:"AGENT",status:p?aD(!0,!1,rY.DISK_SPACE_POLL_INTERVAL_SECONDS,h,d?.lastError??null):"DISABLED",enabled:p,cadenceSeconds:rY.DISK_SPACE_POLL_INTERVAL_SECONDS,lastStartedAt:null,lastCompletedAt:aR(h),lastSucceededAt:d?.lastError?null:aR(h),nextScheduledAt:p&&h?new Date(h.getTime()+1e3*rY.DISK_SPACE_POLL_INTERVAL_SECONDS).toISOString():null,durationMs:null,lastError:d?.lastError??null,details:{agentId:e.id,agentName:e.name,volumes:m}}),l.push({id:`agent-job-reconciliation:${e.id}`,kind:"AGENT_JOB_RECONCILIATION",runtime:"AGENT",status:u?"HEALTHY":"STALE",enabled:!0,cadenceSeconds:r,lastStartedAt:null,lastCompletedAt:aR(e.lastSeenAt),lastSucceededAt:aR(e.lastSeenAt),nextScheduledAt:e.lastSeenAt?new Date(e.lastSeenAt.getTime()+1e3*r).toISOString():null,durationMs:null,lastError:null,details:{agentId:e.id,agentName:e.name,pendingJobs:o.get(e.id)??0}});let f=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,y=e.codebases.filter(e=>e.lastFetchError).length;l.push({id:`agent-codebase-scan:${e.id}`,kind:"CODEBASE_SCAN",runtime:"AGENT",status:aD(e.codebases.length>0,!1,i,f,null),enabled:e.codebases.length>0,cadenceSeconds:i,lastStartedAt:null,lastCompletedAt:aR(f),lastSucceededAt:aR(f),nextScheduledAt:f?new Date(f.getTime()+1e3*i).toISOString():null,durationMs:null,lastError:null,details:{agentId:e.id,agentName:e.name,repositories:e.codebases.length}}),l.push({id:`agent-git-fetch:${e.id}`,kind:"GIT_FETCH",runtime:"AGENT",status:y>0?"ERROR":aD(e.codebases.length>0,!1,c,g,null),enabled:e.codebases.length>0,cadenceSeconds:c,lastStartedAt:null,lastCompletedAt:aR(g),lastSucceededAt:y>0?null:aR(g),nextScheduledAt:g?new Date(g.getTime()+1e3*c).toISOString():null,durationMs:null,lastError:y>0?`${y} repositories have fetch errors`:null,details:{agentId:e.id,agentName:e.name,repositories:e.codebases.length,fetchErrors:y}})}return[...this.serverViews(),...l]}}let aO="default",aP="https://raw.githubusercontent.com/BerriAI/litellm/refs/heads/main/model_prices_and_context_window.json",a$=new Set(["sample_spec"]);function aU(e){return"number"==typeof e&&Number.isFinite(e)?e:null}function aB(e){let t=aU(e);return null===t?null:Math.trunc(t)}function aj(e){return"string"==typeof e&&e.trim()?e.trim():null}function aL(e){let t=e.lastIndexOf("/");return t<0?e:e.slice(t+1)}let aM={MODEL:"model",PROVIDER:"provider",INPUT_COST:"inputCostPerToken",OUTPUT_COST:"outputCostPerToken",CACHE_READ_COST:"cacheReadCostPerToken",CACHE_WRITE_COST:"cacheWriteCostPerToken",CONTEXT_WINDOW:"maxInputTokens"};function aq(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 aF{refreshing=null;checkedAt=0;async getCatalog(){let e=await (0,tY.getPrismaClient)(),t=await e.modelCostSettings.upsert({where:{id:aO},create:{id:aO},update:{}}),r=t.catalogUrl??aP;return{url:r,defaultUrl:aP,customUrl:t.catalogUrl,fetchedAt:t.fetchedAt?.toISOString()??null,entryCount:t.entryCount,error:t.error,stale:this.isStale(t.fetchedAt)||t.sourceUrl!==r}}isStale(e){return!e||Date.now()-e.getTime()>=864e5}async saveSettings(e){let t=e?.trim()??"",r=t&&t!==aP?t:null;if(r){let e;try{e=new URL(r)}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 i=await (0,tY.getPrismaClient)();return await i.modelCostSettings.upsert({where:{id:aO},create:{id:aO,catalogUrl:r},update:{catalogUrl:r}}),this.checkedAt=0,this.getCatalog()}async refresh(){return this.refreshing||(this.refreshing=this.runRefresh().finally(()=>{this.refreshing=null})),this.refreshing}async runRefresh(){let e=await (0,tY.getPrismaClient)(),t=await this.getCatalog();try{let r=await fetch(t.url,{headers:{accept:"application/json"},signal:AbortSignal.timeout(3e4)});if(!r.ok)throw Error(`The model cost catalog request failed with ${r.status}`);let i=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[r,i]of Object.entries(e)){if(a$.has(r)||!i||"object"!=typeof i||Array.isArray(i))continue;let e=aU(i.input_cost_per_token),a=aU(i.output_cost_per_token);if((null!==e||null!==a)&&(t.push({model:r,provider:aj(i.litellm_provider),mode:aj(i.mode),inputCostPerToken:e,outputCostPerToken:a,cacheReadCostPerToken:aU(i.cache_read_input_token_cost),cacheWriteCostPerToken:aU(i.cache_creation_input_token_cost),maxInputTokens:aB(i.max_input_tokens),maxOutputTokens:aB(i.max_output_tokens)}),t.length>=2e4))break}if(!t.length)throw Error("The model cost catalog contained no priced models");return t}(await r.json());await e.$transaction(async e=>{await e.modelCostEntry.deleteMany({});for(let t=0;t<i.length;t+=500)await e.modelCostEntry.createMany({data:i.slice(t,t+500)});await e.modelCostSettings.update({where:{id:aO},data:{fetchedAt:new Date,sourceUrl:t.url,entryCount:i.length,error:null}})})}catch(r){let t=r instanceof Error?r.message:String(r);await e.modelCostSettings.update({where:{id:aO},data:{error:t.slice(0,2e3)}})}return this.getCatalog()}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:r=0,sortKey:i="MODEL",direction:a="ASC"}){var n;let s,o;await this.ensureFresh();let l=await (0,tY.getPrismaClient)(),c=e?.trim(),u=c?{OR:[{model:{contains:c}},{provider:{contains:c}}]}:{},d=Math.min(Math.max(t??100,1),500),p=Math.max(r??0,0),[h,m]=await Promise.all([l.modelCostEntry.findMany({where:u,orderBy:(n=i??"MODEL",s="DESC"===(a??"ASC")?"desc":"asc","model"===(o=aM[n]??"model")?[{model:s}]:[{[o]:{sort:s,nulls:"last"}},{model:s}]),skip:p,take:d}),l.modelCostEntry.count({where:u})]);return{items:h.map(aq),totalCount:m}}async lookup(e){let t=[...new Set(e.filter(Boolean))],r=new Map;if(!t.length)return r;let i=await (0,tY.getPrismaClient)(),a=[...new Set(t.flatMap(e=>[e,aL(e)]))],n=new Map((await i.modelCostEntry.findMany({where:{model:{in:a}}})).map(e=>[e.model,e])),s=[];for(let e of t){let t=n.get(e)??n.get(aL(e));t?r.set(e,aq(t)):s.push(e)}if(!s.length)return r;let o=await i.modelCostEntry.findMany({where:{OR:s.map(e=>({model:{endsWith:`/${aL(e)}`}}))}});for(let e of s){let t=aL(e).toLowerCase(),i=o.find(e=>aL(e.model).toLowerCase()===t);i&&r.set(e,aq(i))}return r}estimate(e,t){if(!e)return null;let r=e.inputCostPerToken,i=e.outputCostPerToken;if(null===r&&null===i)return null;let a=e.cacheReadCostPerToken??r??0,n=e.cacheWriteCostPerToken??r??0;return t.inputTokens*(r??0)+t.outputTokens*(i??0)+t.cacheReadTokens*a+t.cacheWriteTokens*n}}e.i(648153);var aV=e.i(594875),aK=e.i(937121);let aH=["ANY_AGENT_HOME","SPECIFIC_AGENT_HOME","ANY_WORKTREE","REPOSITORY_WORKTREE"],aG=["NEVER","ON_FAILURE","ALWAYS"],aW=["QUEUED","RUNNING","RESTARTING","CANCELLING"],aJ=["SUCCEEDED","FAILED","CANCELLED"];function az(e,t,r){let i=t.trim().toUpperCase();if(!e.includes(i))throw Error(`${r} is not supported`);return i}function aZ(e,t,r){let i=e.trim();if(!i)throw Error(`${t} is required`);if(i.length>r)throw Error(`${t} is too long`);return i}function aY(e){rQ.agentEventBus.publish(rQ.COMMANDS_CHANGED_TOPIC,{commandsChanged:e})}function aQ(e){rQ.agentEventBus.publish(rQ.COMMAND_RUNS_CHANGED_TOPIC,{commandRunsChanged:e}),rQ.agentEventBus.publish((0,rQ.commandRunChangedTopic)(e.id),{commandRunChanged:e})}class aX{agentControl;notifications;timer;reconciliation;constructor(e,t){this.agentControl=e,this.notifications=t,this.timer=null,this.reconciliation=null,this.agentControl.registerCompletionHandler(aK.COMMAND_RUN_JOB_KIND,e=>this.handleAttemptCompletion(e)),this.agentControl.registerConnectionHandler(e=>this.reconcileWithReporting({agentId:e}))}startRuntime(){this.timer||(this.reconcileWithReporting(),this.timer=setInterval(()=>void this.reconcileWithReporting(),1e3),this.timer.unref())}async reconcileWithReporting(e={}){if(this.reconciliation)return this.reconciliation;this.reconciliation=this.reconcile(e);try{await this.reconciliation}catch(e){console.error("Command runtime reconciliation failed:",e)}finally{this.reconciliation=null}}async listDefinitions(e=!1){return(await (0,tY.getPrismaClient)()).commandDefinition.findMany({where:e?{}:{archivedAt:null},include:{targetAgent:!0,targetRepository:!0},orderBy:[{archivedAt:"asc"},{name:"asc"}]})}async getDefinition(e){return(await (0,tY.getPrismaClient)()).commandDefinition.findUnique({where:{id:e},include:{targetAgent:!0,targetRepository:!0}})}normalizeDefinition(e){let t=az(aH,e.targetKind,"Target scope"),r=az(aG,e.restartPolicy??"NEVER","Restart policy"),i=void 0===e.restartLimit?3:e.restartLimit;if(null!==i&&(!Number.isInteger(i)||i<0||i>100))throw Error("Restart limit must be null or an integer from 0 to 100");let a="SPECIFIC_AGENT_HOME"===t,n="REPOSITORY_WORKTREE"===t;if(!!e.targetAgentId!==a)throw Error(a?"A specific-agent command requires an agent":"This target scope does not accept a specific agent");if(!!e.targetRepositoryId!==n)throw Error(n?"A repository-worktree command requires a repository":"This target scope does not accept a repository");return{name:aZ(e.name,"Name",120),description:(e.description??"").trim().slice(0,2e3),script:aZ(e.script,"Script",1e6),targetKind:t,targetAgentId:e.targetAgentId??null,targetRepositoryId:e.targetRepositoryId??null,restartPolicy:r,restartLimit:i,quickActionEnabled:e.quickActionEnabled??!1,quickActionIconKey:aZ(e.quickActionIconKey??"terminal","Quick action icon",40),quickActionButtonVariant:aZ(e.quickActionButtonVariant??"default","Quick action style",40),notificationsEnabled:e.notificationsEnabled??!0}}async createDefinition(e){let t=await (0,tY.getPrismaClient)(),r=await t.commandDefinition.create({data:{id:(0,g.randomUUID)(),...this.normalizeDefinition(e)},include:{targetAgent:!0,targetRepository:!0}});return aY(r),r}async updateDefinition(e,t){let r=await (0,tY.getPrismaClient)(),i=await r.commandDefinition.update({where:{id:e},data:this.normalizeDefinition(t),include:{targetAgent:!0,targetRepository:!0}});return aY(i),i}async archiveDefinition(e,t){let r=await (0,tY.getPrismaClient)(),i=await r.commandDefinition.update({where:{id:e},data:{archivedAt:t?new Date:null},include:{targetAgent:!0,targetRepository:!0}});return aY(i),i}async eligibleForAgent(e){return(await (0,tY.getPrismaClient)()).commandDefinition.findMany({where:{archivedAt:null,OR:[{targetKind:"ANY_AGENT_HOME"},{targetKind:"SPECIFIC_AGENT_HOME",targetAgentId:e}]},include:{targetAgent:!0,targetRepository:!0},orderBy:{name:"asc"}})}async eligibleForWorktree(e){let t=await (0,tY.getPrismaClient)(),r=await t.worktree.findUnique({where:{id:e},select:{codebase:{select:{repositoryId:!0}}}});if(!r)throw Error("Worktree not found");return t.commandDefinition.findMany({where:{archivedAt:null,OR:[{targetKind:"ANY_WORKTREE"},{targetKind:"REPOSITORY_WORKTREE",targetRepositoryId:r.codebase.repositoryId}]},include:{targetAgent:!0,targetRepository:!0},orderBy:{name:"asc"}})}async listRuns(e){let t=await (0,tY.getPrismaClient)(),r=Math.max(1,Math.min(e.first??50,200)),i=e.search?.trim(),a={...e.includeArchived?{}:{archivedAt:null},...e.agentId?{agentId:e.agentId}:{},...e.worktreeId?{worktreeId:e.worktreeId}:{},...i?{OR:[{snapshotName:{contains:i}},{agentName:{contains:i}},{worktreePath:{contains:i}}]}:{}},[n,s]=await Promise.all([t.commandRun.findMany({where:a,include:{command:!0,agent:!0,worktree:{include:{codebase:{include:{repository:!0}}}},attempts:{orderBy:{attempt:"asc"}}},orderBy:[{createdAt:"desc"},{id:"desc"}],take:r+1,...e.after?{cursor:{id:e.after},skip:1}:{}}),t.commandRun.count({where:a})]),o=n.length>r,l=n.slice(0,r);return{nodes:l,totalCount:s,pageInfo:{hasNextPage:o,endCursor:l.at(-1)?.id??null}}}async getRun(e){return(await (0,tY.getPrismaClient)()).commandRun.findUnique({where:{id:e},include:{command:!0,agent:!0,worktree:{include:{codebase:{include:{repository:!0}}}},attempts:{include:{agentJob:!0},orderBy:{attempt:"asc"}},predecessor:!0,successor:!0}})}async listOutput(e,t=0,r=-1,i=1e3){let a=await (0,tY.getPrismaClient)();return i<1?[]:a.commandRunOutputChunk.findMany({where:{OR:[{attempt:{runId:e,attempt:{gt:t}}},{attempt:{runId:e,attempt:t},sequence:{gt:r}}]},include:{attempt:{select:{attempt:!0,runId:!0}}},orderBy:[{attempt:{attempt:"asc"}},{sequence:"asc"}],take:Math.max(1,Math.min(i,5e3))})}async resolveTarget(e,t){let r=await (0,tY.getPrismaClient)();if("ANY_AGENT_HOME"===e.targetKind||"SPECIFIC_AGENT_HOME"===e.targetKind){if(!t.agentId||t.worktreeId)throw Error("This command requires an agent-home target");if("SPECIFIC_AGENT_HOME"===e.targetKind&&e.targetAgentId!==t.agentId)throw Error("This command is not eligible for the selected agent");let i=await r.agent.findUnique({where:{id:t.agentId}});if(!i)throw Error("Agent not found");return this.requireCapability(i.capabilitiesJson),{agent:i,worktree:null}}if(!t.worktreeId||t.agentId)throw Error("This command requires a worktree target");let i=await r.worktree.findUnique({where:{id:t.worktreeId},include:{codebase:{include:{agent:!0,repository:!0}}}});if(!i||i.missingAt)throw Error("Worktree is unavailable");if("REPOSITORY_WORKTREE"===e.targetKind&&e.targetRepositoryId!==i.codebase.repositoryId)throw Error("This command is not eligible for the selected repository");return this.requireCapability(i.codebase.agent.capabilitiesJson),{agent:i.codebase.agent,worktree:i}}requireCapability(e){if(!(function(e){try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>"string"==typeof e):[]}catch{return[]}})(e).includes(aK.COMMAND_RUN_JOB_KIND))throw Error("The selected agent must be upgraded before it can run commands")}async startRun(e){let t,r=await (0,tY.getPrismaClient)(),i=e.idempotencyKey?.trim()||(0,g.randomUUID)(),a=await r.commandRun.findUnique({where:{idempotencyKey:i}});if(a)return this.getRun(a.id);let n=await r.commandDefinition.findUnique({where:{id:e.commandId}});if(!n||n.archivedAt)throw Error("Command not found");let{agent:s,worktree:o}=await this.resolveTarget(n,e);try{t=await r.$transaction(async t=>{let r=await t.commandRunNumberSequence.upsert({where:{id:"default"},create:{id:"default",nextValue:1},update:{nextValue:{increment:1}}});return t.commandRun.create({data:{id:(0,g.randomUUID)(),displayNumber:r.nextValue,commandId:n.id,idempotencyKey:i,origin:(e.origin??"MANUAL").trim().toUpperCase(),snapshotName:n.name,snapshotDescription:n.description,snapshotScript:n.script,snapshotTargetKind:n.targetKind,snapshotRestartPolicy:n.restartPolicy,snapshotRestartLimit:n.restartLimit,snapshotNotificationsEnabled:n.notificationsEnabled,snapshotJson:JSON.stringify(n),agentId:s.id,worktreeId:o?.id??null,agentName:s.name,agentHostname:s.hostname,worktreePath:o?.folder??null,worktreeBranch:o?.branch??null}})})}catch(t){let e=await r.commandRun.findUnique({where:{idempotencyKey:i}});if(!e)throw t;return this.getRun(e.id)}return aQ(t),await this.dispatch(t.id),this.getRun(t.id)}async startCustomRun(e){let t,r=await (0,tY.getPrismaClient)(),i=e.idempotencyKey?.trim()||(0,g.randomUUID)(),a=await r.commandRun.findUnique({where:{idempotencyKey:i}});if(a)return this.getRun(a.id);let n=aZ(e.script,"Script",1e6),s=e.agentId&&!e.worktreeId?"ANY_AGENT_HOME":e.worktreeId&&!e.agentId?"ANY_WORKTREE":null;if(!s)throw Error("A custom command requires exactly one agent-home or worktree target");let{agent:o,worktree:l}=await this.resolveTarget({targetKind:s,targetAgentId:null,targetRepositoryId:null},e),c={name:"Custom command",description:"",script:n,targetKind:s,restartPolicy:"NEVER",restartLimit:null,notificationsEnabled:!0};try{t=await r.$transaction(async t=>{let r=await t.commandRunNumberSequence.upsert({where:{id:"default"},create:{id:"default",nextValue:1},update:{nextValue:{increment:1}}});return t.commandRun.create({data:{id:(0,g.randomUUID)(),displayNumber:r.nextValue,commandId:null,idempotencyKey:i,origin:(e.origin??"MANUAL").trim().toUpperCase(),status:"QUEUED",snapshotName:c.name,snapshotDescription:c.description,snapshotScript:c.script,snapshotTargetKind:c.targetKind,snapshotRestartPolicy:c.restartPolicy,snapshotRestartLimit:c.restartLimit,snapshotNotificationsEnabled:c.notificationsEnabled,snapshotJson:JSON.stringify(c),agentId:o.id,worktreeId:l?.id??null,agentName:o.name,agentHostname:o.hostname,worktreePath:l?.folder??null,worktreeBranch:l?.branch??null}})})}catch(t){let e=await r.commandRun.findUnique({where:{idempotencyKey:i}});if(!e)throw t;return this.getRun(e.id)}aQ(t);try{await this.dispatch(t.id)}catch(e){throw await this.failDispatch(t.id,e instanceof Error?e.message:String(e)),e}return this.getRun(t.id)}async dispatch(e){let t=await (0,tY.getPrismaClient)(),r=await t.commandRun.findUnique({where:{id:e},include:{agent:!0,worktree:{include:{codebase:!0}},attempts:!0}});if(!r||r.stopRequested)return;if(!r.agentId||!r.agent)return void await this.failDispatch(r.id,"The command agent is no longer available");if(r.predecessorRunId){let e=await t.commandRun.findUnique({where:{id:r.predecessorRunId},select:{status:!0}});if(e&&!aJ.includes(e.status))return}if(new Set(["ANY_WORKTREE","REPOSITORY_WORKTREE"]).has(r.snapshotTargetKind)&&(!r.worktreeId||!r.worktree||r.worktree.missingAt))return void await this.failDispatch(r.id,"The command worktree is no longer available");if(r.worktree&&r.worktree.codebase.agentId!==r.agentId)return void await this.failDispatch(r.id,"The worktree is no longer assigned to the command agent");try{this.requireCapability(r.agent.capabilitiesJson)}catch(e){await this.failDispatch(r.id,e instanceof Error?e.message:String(e));return}let i=r.attempts.reduce((e,t)=>!e||t.attempt>e.attempt?t:e,null),a=!i||i.agentJobId||i.completionProcessedAt||i.finishedAt?(i?.attempt??0)+1:i.attempt,n=i?.attempt===a?i:await t.commandRunAttempt.findUnique({where:{runId_attempt:{runId:e,attempt:a}}});if(!n)try{n=await t.commandRunAttempt.create({data:{id:(0,g.randomUUID)(),runId:e,attempt:a}})}catch(r){if(!(n=await t.commandRunAttempt.findUnique({where:{runId_attempt:{runId:e,attempt:a}}})))throw r}if(!n.agentJobId){let e=await this.agentControl.createJob({agentId:r.agentId,kind:aK.COMMAND_RUN_JOB_KIND,payload:{commandRunId:r.id,attemptId:n.id,targetKind:r.worktreeId?"WORKTREE":"AGENT_HOME",cwd:r.worktree?.folder??null,script:r.snapshotScript},idempotencyKey:`command-run:${r.id}:attempt:${a}`,timeoutSeconds:0,worktreeId:r.worktreeId,codebaseId:r.worktree?.codebaseId??null,visibility:"SYSTEM"});n=await t.commandRunAttempt.update({where:{id:n.id},data:{agentJobId:e.id,status:e.status}})}aQ(await t.commandRun.update({where:{id:r.id},data:{status:"RUNNING"===n.status?"RUNNING":"QUEUED",startedAt:"RUNNING"===n.status?r.startedAt??new Date:null,nextRestartAt:null,error:null}}))}async failDispatch(e,t){let r=await (0,tY.getPrismaClient)(),i=await r.commandRun.update({where:{id:e},data:{status:"FAILED",error:t,finishedAt:new Date,nextRestartAt:null},include:{worktree:{select:{highlightColor:!0}}}});aQ(i),await this.notifyFinishedRun(i)}async terminateRun(e){let t=await (0,tY.getPrismaClient)(),r=await t.commandRun.findUnique({where:{id:e},include:{attempts:{orderBy:{attempt:"desc"},take:1}}});if(!r)throw Error("Command run not found");if(aJ.includes(r.status))return r;let i=await t.commandRun.update({where:{id:e},data:{stopRequested:!0,status:"CANCELLING",nextRestartAt:null}}),a=r.attempts[0]?.agentJobId;return a?await this.agentControl.cancelJob(a):await this.finishCancelled(e),aQ(i),this.getRun(e)}async rerun(e){let t=await (0,tY.getPrismaClient)(),r=await t.commandRun.findUnique({where:{id:e}});if(!r)throw Error("Command run not found");let i=await t.commandRun.findUnique({where:{predecessorRunId:r.id}});if(i)return this.getRun(i.id);let a=await t.$transaction(async e=>{let t=await e.commandRunNumberSequence.upsert({where:{id:"default"},create:{id:"default",nextValue:1},update:{nextValue:{increment:1}}});return e.commandRun.create({data:{id:(0,g.randomUUID)(),displayNumber:t.nextValue,commandId:r.commandId,idempotencyKey:`rerun:${r.id}:${(0,g.randomUUID)()}`,origin:"RERUN",snapshotName:r.snapshotName,snapshotDescription:r.snapshotDescription,snapshotScript:r.snapshotScript,snapshotTargetKind:r.snapshotTargetKind,snapshotRestartPolicy:r.snapshotRestartPolicy,snapshotRestartLimit:r.snapshotRestartLimit,snapshotNotificationsEnabled:r.snapshotNotificationsEnabled,snapshotJson:r.snapshotJson,agentId:r.agentId,worktreeId:r.worktreeId,agentName:r.agentName,agentHostname:r.agentHostname,worktreePath:r.worktreePath,worktreeBranch:r.worktreeBranch,predecessorRunId:r.id}})});return aQ(a),aJ.includes(r.status)?await this.dispatch(a.id):await this.terminateRun(r.id),this.getRun(a.id)}async archiveRuns(e,t){let r=await (0,tY.getPrismaClient)();for(let i of(await r.commandRun.updateMany({where:{id:{in:e},status:{in:[...aJ]}},data:{archivedAt:t?new Date:null}}),e)){let e=await r.commandRun.findUnique({where:{id:i}});e&&aQ(e)}return!0}async deleteRuns(e){let t=await (0,tY.getPrismaClient)();return(await t.commandRun.deleteMany({where:{id:{in:e},status:{in:[...aJ]}}})).count}async appendOutput(e,t,r,i){if(!i.length||i.length>200)throw Error("Output batches must contain 1 to 200 chunks");let a=await (0,tY.getPrismaClient)(),n=await a.commandRunAttempt.findUnique({where:{id:r},include:{run:!0}});if(!n||n.agentJobId!==t||n.run.agentId!==e)throw Error("Command attempt not found for this agent job");let s=i.map(e=>{if(!Number.isInteger(e.sequence)||e.sequence<0)throw Error("Output sequence must be a non-negative integer");if(!["STDOUT","STDERR","SYSTEM"].includes(e.stream))throw Error("Output stream is invalid");let t=Buffer.from(e.dataBase64,"base64");if(t.length!==e.byteLength||t.length>262144)throw Error("Output byte length is invalid");let r=new Date(e.createdAt);if(Number.isNaN(r.valueOf()))throw Error("Output date is invalid");return{...e,createdAt:r}});await Promise.all(s.map(e=>a.commandRunOutputChunk.upsert({where:{attemptId_sequence:{attemptId:r,sequence:e.sequence}},create:{id:(0,g.randomUUID)(),attemptId:r,...e},update:{}})));let o=await a.commandRunOutputChunk.findMany({where:{attemptId:r,sequence:{in:s.map(e=>e.sequence)}},orderBy:{sequence:"asc"}});for(let e of o)rQ.agentEventBus.publish((0,rQ.commandRunOutputTopic)(n.runId),{commandRunOutputAdded:{...e,attemptNumber:n.attempt}});return o}async finishCancelled(e){let t=await (0,tY.getPrismaClient)();aQ(await t.commandRun.update({where:{id:e},data:{status:"CANCELLED",finishedAt:new Date,nextRestartAt:null}}));let r=await t.commandRun.findUnique({where:{predecessorRunId:e}});r&&await this.dispatch(r.id)}async notifyFinishedRun(e){if(!this.notifications||!e.snapshotNotificationsEnabled||"SUCCEEDED"!==e.status&&"FAILED"!==e.status)return;let t=[e.worktreeBranch??e.worktreePath??`${e.agentName} \xb7 ${e.agentHostname}`,"FAILED"===e.status?e.error:null].filter(e=>!!e).join(" · ").slice(0,1e3);try{let r=await (0,tY.getPrismaClient)(),i=await r.$transaction(r=>this.notifications.recordInTransaction(r,{dedupeKey:`command-run:${e.id}:${e.status}`,typeKey:"SUCCEEDED"===e.status?"COMMAND_RUN_SUCCEEDED":"COMMAND_RUN_FAILED",title:`${e.snapshotName} ${e.status.toLowerCase()}`,body:t,href:`/commands/runs/${e.id}`,resourceKind:"COMMAND_RUN",resourceId:e.id,worktreeId:e.worktreeId,highlightColor:e.worktree?.highlightColor??null}));this.notifications.created(i)}catch(e){console.error("Command run notification failed:",e)}}async handleAttemptCompletion(e){let t=await (0,tY.getPrismaClient)(),r=await t.commandRunAttempt.findUnique({where:{agentJobId:e.id},include:{run:!0,agentJob:!0}});if(!r||r.completionProcessedAt)return;let i=new Date,a=function(e){if(!e)return{};try{let t=JSON.parse(e);return t&&"object"==typeof t?t:{}}catch{return{}}}(e.resultJson);if(1!==(await t.commandRunAttempt.updateMany({where:{id:r.id,completionProcessedAt:null},data:{status:e.status,exitCode:a.exitCode??null,signal:a.signal??null,error:e.error,startedAt:r.agentJob?.startedAt??r.startedAt,finishedAt:r.agentJob?.finishedAt??i,completionProcessedAt:i}})).count)return;if(r.run.stopRequested||"CANCELLED"===e.status)return void await this.finishCancelled(r.runId);let n="SUCCEEDED"===e.status&&0===a.exitCode,s=az(aG,r.run.snapshotRestartPolicy,"Restart policy"),o=r.agentJob?.startedAt??r.createdAt,l=function(e){if(e.manualStop||!("ALWAYS"===e.policy||"ON_FAILURE"===e.policy&&!e.clean))return{restart:!1,restartCount:e.restartCount,exhausted:!1};let t=(e.durationMs>=6e4?0:e.restartCount)+1,r=null!==e.limit&&t>e.limit;return{restart:!r,restartCount:t,exhausted:r}}({policy:s,limit:r.run.snapshotRestartLimit,restartCount:r.run.restartCount,durationMs:i.getTime()-o.getTime(),clean:n,manualStop:r.run.stopRequested});if(l.restart)return void aQ(await t.commandRun.update({where:{id:r.runId},data:{status:"RESTARTING",restartCount:l.restartCount,nextRestartAt:new Date(i.getTime()+1e3),exitCode:a.exitCode??null,signal:a.signal??null,error:e.error}}));let c=await t.commandRun.update({where:{id:r.runId},data:{status:n?"SUCCEEDED":"FAILED",exitCode:a.exitCode??null,signal:a.signal??null,error:e.error??(l.exhausted?"Restart limit reached":n?null:"Command failed"),finishedAt:i,nextRestartAt:null},include:{worktree:{select:{highlightColor:!0}}}});aQ(c),await this.notifyFinishedRun(c)}async reconcile(e={}){let t=await (0,tY.getPrismaClient)(),r=new Date;for(let i of(await t.commandRun.findMany({where:{status:{in:[...aW]},...e.agentId?{agentId:e.agentId}:{}},include:{attempts:{include:{agentJob:!0},orderBy:{attempt:"desc"},take:1}}}))){let e=i.attempts[0];if(i.stopRequested){e?.agentJobId&&e.agentJob&&!["SUCCEEDED","FAILED","CANCELLED","TIMED_OUT"].includes(e.agentJob.status)?await this.agentControl.cancelJob(e.agentJobId):e&&e.agentJob?.status!=="CANCELLED"||await this.finishCancelled(i.id);continue}if("RESTARTING"===i.status&&(!i.nextRestartAt||i.nextRestartAt<=r)){await this.dispatch(i.id);continue}if(e?.agentJob&&["SUCCEEDED","FAILED","CANCELLED","TIMED_OUT"].includes(e.agentJob.status)){await this.handleAttemptCompletion(e.agentJob);continue}if(e?.agentJob&&["QUEUED","RUNNING"].includes(e.agentJob.status)){let a="RUNNING"===e.agentJob.status?"RUNNING":"QUEUED";e.status!==e.agentJob.status&&await t.commandRunAttempt.update({where:{id:e.id},data:{status:e.agentJob.status,startedAt:e.agentJob.startedAt}}),i.status!==a&&aQ(await t.commandRun.update({where:{id:i.id},data:{status:a,startedAt:"RUNNING"===a?i.startedAt??e.agentJob.startedAt??r:i.startedAt}}));continue}"QUEUED"!==i.status||e&&(e.agentJobId||e.completionProcessedAt||e.finishedAt)||await this.dispatch(i.id)}}}var a0=e.i(735255);function a1(e=new Date){let t=e.getFullYear(),r=String(e.getMonth()+1).padStart(2,"0"),i=String(e.getDate()).padStart(2,"0");return`${t}-${r}-${i}`}class a2{ccusage;diskSpace;polling;usageTimer;usageRunning;constructor(e,t,r){this.ccusage=e,this.diskSpace=t,this.polling=r,this.usageRunning=!1,this.ccusage.registerCompletionObserver(e=>this.recordCompletedUsage(e))}async recordCompletedUsage(e){if(0===e.progress.successfulCount)return;let t=a1(),r=e.aggregate.days.find(e=>e.period===t);await this.persistUsage(t,r?.totalCost??0,new Date)}startRuntime(){this.polling.register({id:"sidebar-usage",kind:"SIDEBAR_USAGE",runtime:"SERVER",enabled:!0,cadenceSeconds:300,details:{}}),this.pruneInterruptedCollections().catch(e=>{console.error("Sidebar usage cleanup failed:",e instanceof Error?e.message:e)}).finally(()=>void this.runUsagePoll())}stopRuntime(){this.usageTimer&&clearTimeout(this.usageTimer),this.usageTimer=void 0}scheduleUsagePoll(){this.usageTimer&&clearTimeout(this.usageTimer);let e=new Date(Date.now()+3e5);this.polling.schedule("sidebar-usage",e),this.usageTimer=setTimeout(()=>void this.runUsagePoll(),3e5),this.usageTimer.unref()}async runUsagePoll(){if(!this.usageRunning){this.usageRunning=!0,this.polling.schedule("sidebar-usage",null);try{await this.polling.run("sidebar-usage",()=>this.collectUsage(),e=>({period:e.period,successfulAgents:e.successfulAgents}))}catch(e){console.error("Sidebar usage refresh failed:",e instanceof Error?e.message:e)}finally{this.usageRunning=!1,this.scheduleUsagePoll()}}}async collectUsage(){let e=`sidebar-usage:${(0,g.randomUUID)()}`;try{let t=await this.ccusage.collect(e);return{period:a1(),successfulAgents:t.progress.successfulCount}}finally{await this.removeCollection(e)}}async persistUsage(e,t,r){let i=await (0,tY.getPrismaClient)();await i.sidebarUsageSummary.upsert({where:{id:"default"},create:{id:"default",period:e,totalCost:t,collectedAt:r},update:{period:e,totalCost:t,collectedAt:r}}),this.publish()}async latestSuccessfulUsage(e){let t=await (0,tY.getPrismaClient)(),r=await t.agentJob.findMany({where:{kind:aT.CCUSAGE_REPORT_JOB_KIND,status:"SUCCEEDED",resultJson:{not:null}},orderBy:[{finishedAt:"desc"},{createdAt:"desc"}],distinct:["agentId"],select:{resultJson:!0,finishedAt:!0,createdAt:!0,agent:{select:{id:!0,name:!0,hostname:!0}}}}),i=r.flatMap(e=>{try{let t=(0,aT.parseCcusageJobResult)(JSON.parse(e.resultJson));return[{agent:e.agent,report:t.report}]}catch{return[]}});if(!i.length)return null;let a=(0,a0.aggregateUsage)(i).days.find(t=>t.period===e);return a?{totalCost:a.totalCost,collectedAt:r.reduce((e,t)=>{let r=t.finishedAt??t.createdAt;return r>e?r:e},new Date(0))}:null}async removeCollection(e){let t=await (0,tY.getPrismaClient)();await t.agentJob.deleteMany({where:{ccusageCollectionId:e}}),await t.ccusageCollection.deleteMany({where:{id:e}})}async pruneInterruptedCollections(){let e=await (0,tY.getPrismaClient)(),t=await e.ccusageCollection.findMany({where:{id:{startsWith:"sidebar-usage:"}},select:{id:!0}});if(!t.length)return;let r=t.map(({id:e})=>e);await e.agentJob.deleteMany({where:{ccusageCollectionId:{in:r}}}),await e.ccusageCollection.deleteMany({where:{id:{in:r}}})}async status(){let e=await (0,tY.getPrismaClient)(),t=a1(),[r,i,a,n,s,o]=await Promise.all([e.sidebarUsageSummary.findUnique({where:{id:"default"}}),e.agentRun.count({where:{kind:"PLAN",archivedAt:null,status:"IN_PROGRESS",attempts:{some:{status:{in:["STARTING","RUNNING"]},supersededAt:null}}}}),e.agentRun.count({where:{kind:"SESSION",archivedAt:null,status:"IN_PROGRESS",attempts:{some:{status:{in:["STARTING","RUNNING"]},supersededAt:null}}}}),e.build.count({where:{status:{in:["PREPARING","RUNNING"]}}}),e.workflowRun.count({where:{archivedAt:null,status:"RUNNING"}}),this.diskSpace.overview()]),l=r?.period===t?{totalCost:r.totalCost,collectedAt:r.collectedAt}:null;if(!l){let e=await this.latestSuccessfulUsage(t);e&&(l=e,this.persistUsage(t,e.totalCost,e.collectedAt)),this.runUsagePoll()}return{usageToday:{totalCost:l?.totalCost??null,collectedAt:l?.collectedAt.toISOString()??null},activity:{plans:i,sessions:a,builds:n,workflows:s},diskSpace:o}}subscribe(){return rQ.agentEventBus.iterate(rQ.SIDEBAR_STATUS_CHANGED_TOPIC)}publish(){rQ.agentEventBus.publish(rQ.SIDEBAR_STATUS_CHANGED_TOPIC,{sidebarStatusChanged:!0})}}var a3=e.i(807055),a4=e.i(119909);function a6(e,t,r){let i=e.trim().toLowerCase(),a=t.trim().toLowerCase();if(!i||!a)throw Error("Pull request repository coordinates are required");if(!Number.isInteger(r)||r<1)throw Error("Pull request number must be a positive integer");return`${i}/${a}#${r}`}function a8(e){return e&&"object"==typeof e&&!Array.isArray(e)?e:{}}function a5(e,t,r){return a8(e[t])[r]}function a9(e,t,r={}){if("string"!=typeof t&&"number"!=typeof t)return null;let i=String(t).trim();return i?{kind:e,resourceId:i,...r}:null}let a7=new Set(["JIRA_STATUS","JIRA_LABEL","JIRA_ASSIGNED_SELF","JIRA_SOURCE_NEW_TICKET","JIRA_MENTION","JIRA_SPRINT_STARTED"]),ne=new Set(["RUN_STARTED","RUN_COMPLETED","RUN_QUESTION_NEEDED","RUN_QUESTION_ANSWERED","RUN_PAUSED","RUN_CONTINUED","RUN_FAILED","RUN_CANCELLED","RUN_PLAN_PLAYED","RUN_FOLLOW_UP","RUN_IMPORTED","RUN_USAGE_THRESHOLD","RUN_EVENT_MATCH"]),nt=new Set(["BUILD_RESULT","BUILD_TEST_THRESHOLD","BUILD_COVERAGE_THRESHOLD","BUILD_HOOK_FAILED"]),nr=new Set(["WORKTREE_CREATED","WORKTREE_BEHIND","WORKTREE_CONFLICT","WORKTREE_MISSING","WORKTREE_DIVERGED","WORKTREE_DIRTY_DURATION","WORKTREE_NEW_COMMIT"]),ni=new Set(["GITHUB_PR_STATE","GITHUB_REVIEW_CHANGES_REQUESTED","GITHUB_REVIEW_COMMENT","GITHUB_PR_CLOSED","GITHUB_ISSUE_COMMAND","GITHUB_PR_LABEL"]),na=new Set(["GITHUB_CHECK_FAILED","GITHUB_WORKFLOW_SUCCEEDED","GITHUB_ACTIONS_RESULT"]);var nn=e.i(499162);function ns(e,t){let r="string"==typeof e?Number(e.trim()):e;return"number"!=typeof r||!Number.isFinite(r)||r<=0?null:Math.min(31536e3,Math.max(t,r))}function no(e,t=null){let r=ns(e.timeoutSeconds,10)??(null===t?null:ns(t,10));return null===r?null:new Date(Date.now()+1e3*r)}function nl(e,t){return ns(e.cadenceSeconds,1)??Math.max(1,t)}function nc(e,t=1){return new Date(Date.now()+1e3*nl(e,t))}let nu=(e,t)=>{if(!e||"object"!=typeof e||Array.isArray(e))throw Error(`${t} must be an object`);return e},nd=(e,t,r=2e4)=>{if("string"!=typeof e||!e.trim())throw Error(`${t} is required`);if(e.length>r)throw Error(`${t} is too long`);return e.trim()},np=(e,t=2e4)=>null==e||""===e?null:nd(e,"Value",t),nh=(e,t,r,i)=>nd(e.node.config[t]??(0,nn.getSessionValue)(e.sessionData,r),i,500),nm=(e,t="operation")=>`${e.run.id}:${e.attempt.id}:${t}`,nf=(e,t,r=!1)=>({output:t,sessionPatch:{run:{[e.node.id]:t}},links:"string"==typeof t.id?[{kind:"AGENT_RUN",resourceId:t.id,label:"string"==typeof t.kind?t.kind:"Agent run",url:`/${"PLAN"===t.kind?"plans":"sessions"}/${t.id}`,metadata:{runKind:t.kind}}]:void 0,wait:r&&"string"==typeof t.id?{kind:"AGENT_RUN",externalKey:t.id,resumeAfter:nc(e.node.config),timeoutAt:no(e.node.config)}:void 0}),ng=(e,t,r,i=[])=>({output:{jobId:t.id},sessionPatch:r,links:[...i,{kind:"AGENT_JOB",resourceId:t.id,label:"Agent job",url:`/jobs/${t.id}`}],wait:{kind:"AGENT_JOB",externalKey:t.id,resumeAfter:nc(e.node.config),timeoutAt:no(e.node.config,t.timeoutSeconds??3600)}}),ny=(e,t,r,i,a)=>({kind:e,resourceId:t,label:r,url:i,metadata:a}),nv=(e,t)=>ny("JIRA_TICKET",e,t??e);function nw(e,t,r){let i=nI(e);return ny("PULL_REQUEST",a6(i.owner,i.name,nT(e)),t??"Pull request",r)}function nb(e){let t=nS(e),r=nC(e);return t&&r?ny("PULL_REQUEST",a6(t.owner,t.name,r),"Pull request"):null}function nk(e){let t=e.node.config.workflowRunId??(0,nn.getSessionValue)(e.sessionData,"pipeline.runId"),r=(0,nn.getSessionValue)(e.sessionData,"pipeline.url");return("string"==typeof t||"number"==typeof t)&&"string"==typeof r&&r?ny("GITHUB_WORKFLOW_RUN",String(t),"Workflow run",r):null}function nx(e){let t=(0,nn.getSessionValue)(e.sessionData,"run.kind");if("PLAN"!==t&&"SESSION"!==t)return null;let r=function(e){try{return n$(e)}catch{return null}}(e);return r?ny("AGENT_RUN",r,t,`/${"PLAN"===t?"plans":"sessions"}/${r}`,{runKind:t}):null}function nS(e){let t=e.node.config.owner,r=e.node.config.name;if("string"==typeof t&&t.trim()&&"string"==typeof r&&r.trim())return{owner:t.trim(),name:r.trim()};let i=e.sessionData.repo&&"object"==typeof e.sessionData.repo&&!Array.isArray(e.sessionData.repo)?e.sessionData.repo.displayOrigin:null,a="string"==typeof i?i.match(/(?:https?:\/\/)?github\.com[/:]([^/]+)\/([^/.]+)(?:\.git)?$/i):null,n=a?.[1]?.trim(),s=a?.[2]?.trim();return n&&s?{owner:n,name:s}:null}function nI(e){let t=nS(e);if(!t)throw Error("GitHub owner and repository are required");return t}function nE(e){let t=nu(e,"Jira ticket"),r=t.issueType&&"object"==typeof t.issueType?t.issueType:{},i=t.status&&"object"==typeof t.status?t.status:{};return{...t,key:t.key,title:t.summary??t.title,type:r.name??t.type,status:i.name??t.status,statusCategory:i.category??t.statusCategory}}function nA(e){let t=nu(e,"Pull request"),r=Array.isArray(t.reviewThreads)?t.reviewThreads:[];return{...t,unresolvedThreads:r.filter(e=>e&&"object"==typeof e&&!Array.isArray(e)&&!0!==e.isResolved)}}function n_(e){return nd(e.node.config.issueKey??(0,nn.getSessionValue)(e.sessionData,"ticket.key"),"Jira issue key",100)}function nC(e){let t=e.node.config.number??(0,nn.getSessionValue)(e.sessionData,"pr.number"),r="string"==typeof t?Number(t):t;return"number"==typeof r&&Number.isInteger(r)&&r>=1?r:null}function nT(e){let t=nC(e);if(!t)throw Error("Pull request number is required");return t}function nR(e){return nh(e,"worktreeId","worktree.id","Worktree ID")}function nD(e){return nh(e,"codebaseId","codebase.id","Codebase ID")}function nN(e){let t=String(e.node.config.mode??"NEW").toUpperCase();if(!new Set(["NEW","EXISTING","TICKET"]).has(t))throw Error("Worktree branch mode must be NEW, EXISTING, or TICKET");return{mode:t,branchName:"TICKET"===t?null:np(e.node.config.branchName??(0,nn.getSessionValue)(e.sessionData,"worktree.branch"),500),ticketKey:"TICKET"===t?np(e.node.config.ticketKey??(0,nn.getSessionValue)(e.sessionData,"ticket.key"),100):null,baseBranch:nd(e.node.config.baseBranch??(0,nn.getSessionValue)(e.sessionData,"worktree.baseBranch")??(0,nn.getSessionValue)(e.sessionData,"repo.defaultBranch"),"Base branch",500)}}function nO(e){return nh(e,"buildId","build.id","Build ID")}function nP(e){return nd(e.node.config.agentId??(0,nn.getSessionValue)(e.sessionData,"agent.id")??(0,nn.getSessionValue)(e.sessionData,"codebase.agentId"),"Agent ID",500)}function n$(e){let t=e.node.config.runId;if("string"==typeof t&&t)return t;let r=e.node.config.sourceStepId;return"string"==typeof r?nd((0,nn.getSessionValue)(e.sessionData,`run.${r}.id`),"Agent run ID",500):nd((0,nn.getSessionValue)(e.sessionData,"run.id"),"Agent run ID",500)}function nU(e,t){let r,i;return{kind:t,worktreeId:(r=e.node.config.worktreeId,i=(0,nn.getSessionValue)(e.sessionData,"worktree.id"),"string"==typeof r&&r===e.run.workflowId&&"string"==typeof i&&i!==r?nd(i,"Worktree ID",500):nR(e)),jiraIssueKey:np(e.node.config.jiraIssueKey??(0,nn.getSessionValue)(e.sessionData,"ticket.key"),100),provider:nd(e.node.config.provider??"CODEX","Provider",50),model:nd(e.node.config.model,"Model",200),effort:np(e.node.config.effort,50),webSearchEnabled:!0===e.node.config.webSearchEnabled,prompt:nd(e.node.config.prompt,"Prompt",2e5),attachmentIds:Array.isArray(e.node.config.attachmentIds)?e.node.config.attachmentIds.map(String):[]}}let nB="workflow:trigger-events";class nj{async record(e){let t=await (0,tY.getPrismaClient)(),r=await this.recordInTransaction(t,e);return this.created(r.id),r}async recordInTransaction(e,t){let r=await e.workflowTriggerEvent.findUnique({where:{dedupeKey:t.dedupeKey}});return r||e.workflowTriggerEvent.create({data:{id:(0,g.randomUUID)(),kind:t.kind,subjectKey:t.subjectKey,dedupeKey:t.dedupeKey,payloadJson:JSON.stringify(t.payload)}})}created(e){rQ.agentEventBus.publish(nB,{workflowTriggerEventCreated:{id:e}})}subscribe(){return rQ.agentEventBus.iterate(nB)}}function nL(e){try{let t=JSON.parse(e);return t&&"object"==typeof t&&!Array.isArray(t)?t:{}}catch{return{}}}function nM(e,t){return{id:e.id,name:e.name,url:e.displayOrigin,canonicalOrigin:e.canonicalOrigin,displayOrigin:e.displayOrigin,defaultBranch:t??null}}function nq(e){return{id:e.id,name:e.name,hostname:e.hostname,connected:null===e.disconnectedAt,diskFreeBytes:e.diskFreeBytes,memoryFreeBytes:e.memoryFreeBytes}}class nF{events;agentControl;worktrees;diskSpace;started;running;diskAuditTimer;diskStateFingerprints;constructor(e,t,r,i){this.events=e,this.agentControl=t,this.worktrees=r,this.diskSpace=i,this.started=!1,this.running=!1,this.diskStateFingerprints=new Map}start(){!this.started&&(this.started=!0,this.running=!0,this.agentControl.registerCompletionObserver(e=>this.observeAgentJob(e)),this.consumeRuns(),this.consumeBuilds(),this.consumeWorktrees(),this.consumeCodebases(),this.consumeAgents(),this.diskSpace&&(this.consumeDiskSpace(),this.auditDiskSpace(!0)))}stop(){this.running=!1,this.diskAuditTimer&&clearTimeout(this.diskAuditTimer),this.diskAuditTimer=void 0}async record(e,t,r,i,a={}){await this.events.record({kind:e,subjectKey:t,dedupeKey:r,payload:{...i,...a,sessionData:i}})}async worktreeSessionData(e,t=!1){return e&&this.worktrees?this.worktrees.workflowSessionDataForWorktree(e,{includeMissing:t}):{}}async observeAgentJob(e){if("ccusage.report"===e.kind&&"SUCCEEDED"===e.status&&e.resultJson){let t=nL(e.resultJson),r=t.report&&"object"==typeof t.report&&!Array.isArray(t.report)?t.report:{},i=r.totals&&"object"==typeof r.totals&&!Array.isArray(r.totals)?r.totals:{};await this.record("CCUSAGE_THRESHOLD",e.agentId,`ccusage:${e.ccusageCollectionId??e.id}:${e.agentId}`,{run:{usage:i},agent:{id:e.agentId}},{cursorValue:e.ccusageCollectionId??e.id});return}if(!new Set(["FAILED","TIMED_OUT"]).has(e.status))return;let t=await this.worktreeSessionData(e.worktreeId,!0);await this.record("AGENT_JOB_FAILED",e.agentId,`agent-job:${e.id}:${e.status}`,(0,nn.mergeSessionData)(t,{agent:{id:e.agentId},codebase:{id:e.codebaseId,agentId:e.agentId},...e.worktreeId?{worktree:{id:e.worktreeId}}:{},steps:{trigger:{id:e.id,kind:e.kind,status:e.status,error:e.error}}}),{cursorValue:`${e.id}:${e.status}`})}async consumeRuns(){let e=rQ.agentEventBus.iterate(rQ.RUNS_CHANGED_TOPIC);try{for await(let t of e){if(!this.running)break;"drafts"!==t.runChanged.id&&await this.observeRun(t.runChanged.id).catch(e=>console.error("Could not record workflow run trigger:",e))}}finally{await e.return?.()}}async observeRun(e){let t=await (0,tY.getPrismaClient)(),r=await t.agentRun.findUnique({where:{id:e},include:{worktree:{include:{codebase:{include:{repository:!0}}}},agent:{select:{id:!0,name:!0,hostname:!0,disconnectedAt:!0,diskFreeBytes:!0,memoryFreeBytes:!0}},questionBatches:{orderBy:{createdAt:"desc"},take:1,include:{questions:{include:{options:!0}}}},events:{orderBy:{sequence:"desc"},take:1},toolCalls:{orderBy:{sequence:"desc"},take:1}}});if(!r)return;let i=await t.workflowRunResourceLink.findFirst({where:{kind:"AGENT_RUN",resourceId:r.id},include:{run:!0},orderBy:{createdAt:"desc"}}),a=await this.worktreeSessionData(r.worktree?.id??null),n=(0,nn.mergeSessionData)(a,{run:{id:r.id,kind:r.kind,status:r.status,phase:r.phase,origin:r.origin,provider:r.provider,model:r.model,finalOutput:r.finalOutput,error:r.error,sourcePlanId:r.sourcePlanId,parentRunId:r.parentRunId,followUpMode:r.followUpMode,usage:{inputTokens:r.inputTokens,outputTokens:r.outputTokens,reasoningTokens:r.reasoningTokens,cacheReadTokens:r.cacheReadTokens,cacheWriteTokens:r.cacheWriteTokens,toolCallCount:r.toolCallCount,estimatedCost:r.estimatedCost}},...r.worktree?{worktree:{id:r.worktree.id,path:r.worktree.folder,branch:r.worktree.branch,headSha:r.worktree.headSha},codebase:{id:r.worktree.codebase.id,folder:r.worktree.codebase.folder,agentId:r.worktree.codebase.agentId},repo:nM(r.worktree.codebase.repository,r.worktree.codebase.defaultBranch)}:{},...r.agent?{agent:nq(r.agent)}:{},...r.jiraIssueKey?{ticket:{key:r.jiraIssueKey}}:{}}),s=i?{workflowId:i.run.workflowId,runId:i.runId,attemptId:i.attemptId}:null,o={cursorValue:`${r.status}:${r.phase}`,workflowCorrelation:s};r.startedAt&&await this.record("RUN_STARTED",r.id,`run-started:${r.id}:${r.startedAt.toISOString()}`,n,o);let l="COMPLETED"===r.status?"RUN_COMPLETED":"FAILED"===r.status?"RUN_FAILED":"CANCELLED"===r.status?"RUN_CANCELLED":"PAUSED"===r.status?"RUN_PAUSED":null;l&&await this.record(l,r.id,`run-status:${r.id}:${r.status}:${r.finishedAt?.toISOString()??r.updatedAt.toISOString()}`,n,o),"RUNNING"===r.phase&&r.startedAt&&r.updatedAt>r.startedAt&&await this.record("RUN_CONTINUED",r.id,`run-continued:${r.id}:${r.updatedAt.toISOString()}`,n,o),r.sourcePlanId&&await this.record("RUN_PLAN_PLAYED",r.id,`run-plan-played:${r.id}:${r.sourcePlanId}`,n,o),r.parentRunId&&"PLAN_PLAY"!==r.followUpMode&&await this.record("RUN_FOLLOW_UP",r.id,`run-follow-up:${r.id}:${r.parentRunId}`,n,o),"IMPORTED"===r.origin&&await this.record("RUN_IMPORTED",r.id,`run-imported:${r.id}:${r.updatedAt.toISOString()}`,n,o),await this.record("RUN_USAGE_THRESHOLD",r.id,`run-usage:${r.id}:${r.updatedAt.toISOString()}`,n,{...o,cursorValue:r.updatedAt.toISOString()});let c=r.questionBatches[0];if(c){let e={...n,run:{...n.run,questions:c.questions}};"PENDING"===c.status?await this.record("RUN_QUESTION_NEEDED",r.id,`run-question:${c.id}:pending`,e,o):"ANSWERED"===c.status&&await this.record("RUN_QUESTION_ANSWERED",r.id,`run-question:${c.id}:answered`,e,o)}let u=r.events[0];u&&await this.record("RUN_EVENT_MATCH",r.id,`run-event:${u.id}`,n,{...o,event:u});let d=r.toolCalls[0];d&&await this.record("RUN_EVENT_MATCH",r.id,`run-tool:${d.id}:${d.status}`,n,{...o,toolCall:d})}async consumeBuilds(){let e=rQ.agentEventBus.iterate(rQ.BUILDS_CHANGED_TOPIC);try{for await(let t of e){if(!this.running)break;await this.observeBuild(t.buildsChanged.id).catch(e=>console.error("Could not record workflow build trigger:",e))}}finally{await e.return?.()}}async observeBuild(e){let t=await (0,tY.getPrismaClient)(),r=await t.build.findUnique({where:{id:e},include:{codebase:{include:{repository:!0,agent:{select:{id:!0,name:!0,hostname:!0,disconnectedAt:!0,diskFreeBytes:!0,memoryFreeBytes:!0}}}},worktree:!0,reports:!0,scriptExecutions:!0}});if(!r)return;let i=await this.worktreeSessionData(r.worktree?.id??null),a=(0,nn.mergeSessionData)(i,{build:{id:r.id,status:r.status,action:r.action,error:r.error},...r.codebase?{codebase:{id:r.codebase.id,folder:r.codebase.folder,agentId:r.codebase.agentId},repo:nM(r.codebase.repository,r.codebase.defaultBranch),agent:nq(r.codebase.agent)}:{},...r.worktree?{worktree:{id:r.worktree.id,path:r.worktree.folder,branch:r.worktree.branch,headSha:r.worktree.headSha}}:{}});for(let e of(new Set(["SUCCEEDED","FAILED","CANCELLED"]).has(r.status)&&await this.record("BUILD_RESULT",r.id,`build-result:${r.id}:${r.status}`,a,{cursorValue:r.status}),r.reports.filter(({status:e})=>"READY"===e))){let t=nL(e.summaryJson),i={...a,build:{...a.build,..."TEST_RESULTS"===e.kind?{testSummary:t}:{coverageSummary:t}}};await this.record("TEST_RESULTS"===e.kind?"BUILD_TEST_THRESHOLD":"BUILD_COVERAGE_THRESHOLD",r.id,`build-report:${e.id}:${e.updatedAt.toISOString()}`,i,{cursorValue:e.updatedAt.toISOString()})}for(let e of r.scriptExecutions.filter(({causedBuildFailure:e})=>e))await this.record("BUILD_HOOK_FAILED",r.id,`build-hook:${e.id}:failed`,a,{cursorValue:e.id,script:{id:e.id,name:e.nameSnapshot,phase:e.phase}})}async consumeWorktrees(){let e=rQ.agentEventBus.iterate(rQ.WORKTREE_CHANGED_TOPIC);try{for await(let t of e){if(!this.running)break;let e=t.worktreeOverviewChanged,r=await (0,tY.getPrismaClient)();for(let t of(await r.worktree.findMany({where:e.worktreeId?{id:e.worktreeId}:e.codebaseId?{codebaseId:e.codebaseId}:{},include:{codebase:{include:{repository:!0}}},take:e.worktreeId?1:500})))await this.observeWorktree(t).catch(e=>console.error("Could not record workflow worktree trigger:",e))}}finally{await e.return?.()}}async observeWorktree(e){let t=e.lastCheckedAt??e.updatedAt,r=e.hasStagedChanges||e.hasUnstagedChanges,i=await this.worktreeSessionData(e.id,!0),a=(0,nn.mergeSessionData)(i,{repo:nM(e.codebase.repository,e.codebase.defaultBranch),codebase:{id:e.codebase.id,folder:e.codebase.folder,agentId:e.codebase.agentId},worktree:{id:e.id,path:e.folder,branch:e.branch,headSha:e.headSha,pushStatus:e.pushStatus,baseBehind:e.baseBehind,dirty:r,missingAt:e.missingAt?.toISOString()??null,dirtySince:r?e.updatedAt.toISOString():null}}),n={cursorValue:t.toISOString()};(e.baseBehind??0)>0&&await this.record("WORKTREE_BEHIND",e.id,`worktree-behind:${e.id}:${t.toISOString()}`,a,n),await this.record("WORKTREE_DIRTY_DURATION",e.id,`worktree-dirty:${e.id}:${t.toISOString()}`,a,n),await this.record("WORKTREE_MISSING",e.id,`worktree-missing:${e.id}:${t.toISOString()}`,a,{cursorValue:!!e.missingAt}),await this.record("WORKTREE_DIVERGED",e.id,`worktree-diverged:${e.id}:${t.toISOString()}`,a,{cursorValue:"DIVERGED"===e.pushStatus}),e.headSha&&await this.record("WORKTREE_NEW_COMMIT",e.id,`worktree-commit:${e.id}:${e.headSha}`,a,{cursorValue:e.headSha})}async consumeCodebases(){let e=rQ.agentEventBus.iterate(rQ.CODEBASE_CHANGED_TOPIC);try{for await(let t of e){if(!this.running)break;let e=await (0,tY.getPrismaClient)(),r=t.codebaseOverviewChanged;for(let t of(await e.codebase.findMany({where:r.codebaseId?{id:r.codebaseId}:r.repositoryId?{repositoryId:r.repositoryId}:{},include:{repository:!0,agent:{select:{id:!0,name:!0,hostname:!0,disconnectedAt:!0,diskFreeBytes:!0,memoryFreeBytes:!0}}},take:r.codebaseId?1:500}))){let e={repo:nM(t.repository,t.defaultBranch),agent:nq(t.agent),codebase:{id:t.id,folder:t.folder,agentId:t.agentId,branch:t.defaultBranch,remoteBranches:JSON.parse(t.remoteBranchesJson)}},r=e.codebase.remoteBranches;if(Array.isArray(r))for(let i of r.filter(e=>"string"==typeof e))await this.record("CODEBASE_REMOTE_BRANCH",t.id,`codebase-remote-branch:${t.id}:${i}`,e,{cursorValue:i,branch:i})}}}finally{await e.return?.()}}async emitDiskSnapshot(e,t){let r=e.agent.id;t.report&&await this.record("AGENT_DISK_REPORT",r,`agent-disk-report:${r}:${e.disk.lastReportedAt??t.changeId}`,e,{cursorValue:e.disk.lastReportedAt}),t.threshold&&await this.record("AGENT_DISK_THRESHOLD",r,`agent-disk-threshold:${r}:${t.changeId}`,e);let i=r2(e);if(await this.record("AGENT_DISK_STATE_CHANGED",r,`agent-disk-state:${r}:${t.changeId}`,e,{cursorValue:i}),this.diskStateFingerprints.set(r,JSON.stringify(i)),t.cleanup){let i={...e,cleanup:t.cleanup};await this.record("AGENT_DISK_CLEANUP_RESULT",r,`agent-disk-cleanup:${t.cleanup.jobId}:${t.cleanup.status}`,i,{cleanup:t.cleanup})}}async observeDiskChange(e){if(!this.diskSpace)return;let{id:t,reason:r,cleanup:i}=e.diskSpaceChange;if("settings"===e.diskSpaceChanged){let e=await this.diskSpace.overview();for(let i of e.agents)await this.emitDiskSnapshot(r1(e.settings,i,r),{changeId:t,report:!1,threshold:!0});return}let a=await this.diskSpace.snapshot(e.diskSpaceChanged,r);await this.emitDiskSnapshot(a,{changeId:t,report:"REPORT_RECEIVED"===r,threshold:!0,cleanup:i})}async consumeDiskSpace(){if(!this.diskSpace)return;let e=this.diskSpace.subscribe();try{for await(let t of e){if(!this.running)break;await this.observeDiskChange(t).catch(e=>console.error("Could not record disk-space workflow trigger:",e))}}finally{await e.return?.()}}async auditDiskSpace(e){if(this.diskSpace&&this.running)try{let t=await this.diskSpace.overview();for(let r of t.agents){let i=r1(t.settings,r,e?"STARTUP_RECONCILE":"STATE_AUDIT"),a=JSON.stringify(r2(i));(e||this.diskStateFingerprints.get(r.agent.id)!==a)&&await this.emitDiskSnapshot(i,{changeId:(0,g.randomUUID)(),report:!1,threshold:e})}}catch(e){console.error("Could not audit disk-space workflow state:",e)}finally{this.running&&(this.diskAuditTimer=setTimeout(()=>void this.auditDiskSpace(!1),1e3*rY.DISK_SPACE_POLL_INTERVAL_SECONDS),this.diskAuditTimer.unref?.())}}async consumeAgents(){let e=rQ.agentEventBus.iterate(rQ.AGENT_CHANGED_TOPIC);try{for await(let t of e){if(!this.running)break;let e=await (0,tY.getPrismaClient)(),r=await e.agent.findUnique({where:{id:t.agentChanged.id}});if(!r)continue;let i=null===r.disconnectedAt,a={codebase:{agentId:r.id},agent:{id:r.id,name:r.name,connected:i,diskFreeBytes:r.diskFreeBytes,memoryFreeBytes:r.memoryFreeBytes}};await this.record("AGENT_CONNECTION",r.id,`agent-connection:${r.id}:${r.updatedAt.toISOString()}`,a,{cursorValue:i})}}finally{await e.return?.()}}}var nV=e.i(988349),nK=e.i(248626),nH=e.i(336921),nG=e.i(53803),nW=e.i(264977);async function nJ(e,t){let r=e.trim();if(!r||r.length>5e4)throw Error(`Workflow script must contain 1–${5e4.toLocaleString()} characters`);let i=await (0,nG.getQuickJS)(),a=Date.now()+250;try{return i.evalCode(`"use strict"; const session = Object.freeze(${JSON.stringify(t)}); (${r})(session);`,{memoryLimitBytes:8388608,maxStackSizeBytes:524288,shouldInterrupt:(0,nW.shouldInterruptAfterDeadline)(a)})}catch(t){let e=t instanceof Error?t.message:String(t);throw Error(`Workflow script failed: ${"interrupted"===e?"execution timed out after 250ms":e}`)}}class nz{handlers=new Map;register(e,t){this.handlers.set(e,t)}has(e){return this.handlers.has(e)}execute(e){let t=this.handlers.get(e.node.kind);if(!t)throw Error(`Workflow step ${e.node.kind} is not registered`);return t(e)}}let nZ="workflows:changed",nY=e=>`workflow-run:${e}`,nQ=e=>`workflow-run:${e}:events`,nX=e=>`workflow-run:${e}:questions`,n0=["QUEUED","RUNNING","PAUSING","PAUSED","WAITING","BLOCKED"],n1=new Set(["SUCCEEDED","FAILED","CANCELLED"]),n2=new Set(["SUCCEEDED","FAILED","CANCELLED","SKIPPED","SUPERSEDED"]),n3=new Set(["RUNNING","WAITING"]),n4=e=>JSON.parse(e);function n6(e){return{agent:{id:e.id,name:e.name,hostname:e.hostname,...void 0!==e.lastSeenAt&&void 0!==e.disconnectedAt?{connected:null!==e.lastSeenAt&&null===e.disconnectedAt&&Date.now()-e.lastSeenAt.getTime()<=(0,a.agentOnlineWindowMs)(e)}:{},...void 0!==e.diskFreeBytes?{diskFreeBytes:e.diskFreeBytes}:{},...void 0!==e.memoryFreeBytes?{memoryFreeBytes:e.memoryFreeBytes}:{}}}}function n8(e){return(0,nn.mergeSessionData)(n6(e.agent),{codebase:{id:e.id,folder:e.folder,agentId:e.agentId,branch:e.branch,headSha:e.headSha},repo:{id:e.repository.id,name:e.repository.name,url:e.repository.displayOrigin,canonicalOrigin:e.repository.canonicalOrigin,displayOrigin:e.repository.displayOrigin,defaultBranch:e.defaultBranch}})}function n5(e,t,r){let i=e.trim();if(!i)throw Error(`${t} is required`);if(i.length>r)throw Error(`${t} is too long`);return i}function n9(e){let t=e?.trim().toUpperCase()||"QUEUE";if(!new Set(["QUEUE","CONCURRENT","COALESCE_LATEST"]).has(t))throw Error("Workflow overlap policy is not supported");return t}function n7(e,t){let r=e??("CONCURRENT"===t?4:1);if(!Number.isInteger(r)||r<1||r>32)throw Error("Maximum concurrent runs must be between 1 and 32");return r}function se(e){return Array.isArray(e)?`[${e.map(se).join(",")}]`:e&&"object"==typeof e?`{${Object.entries(e).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>`${JSON.stringify(e)}:${se(t)}`).join(",")}}`:JSON.stringify(e)}function st(e,t,r){if(Buffer.byteLength(e,"utf8")>r)throw Error(`${t} is too large`)}function sr(e,t){if(!e||"object"!=typeof e||Array.isArray(e))throw Error(`${t} must be an object`);return e}function si(e){rQ.agentEventBus.publish(nZ,{workflowChanged:{id:e}})}function sa(e){rQ.agentEventBus.publish(nY(e),{workflowRunChanged:{id:e}}),rQ.agentEventBus.publish(nZ,{workflowChanged:{id:"runs",runId:e}}),rQ.agentEventBus.publish(rQ.SIDEBAR_STATUS_CHANGED_TOPIC,{sidebarStatusChanged:!0})}function sn(e){return[...ii.WORKFLOW_STEP_BY_KIND.get(e.kind).requiredPaths.map(t=>t.replaceAll("<stepId>",e.id)),...e.requiredPaths,...(0,nK.requiredConfigSessionPaths)(e.kind,"step",e.config)]}function ss(e){return[...ii.WORKFLOW_STEP_BY_KIND.get(e.kind).providedPaths.map(t=>t.replaceAll("<stepId>",e.id)),...e.providedPaths,`steps.${e.id}.*`]}async function so(e){return(await e.workflowRunNumberSequence.upsert({where:{id:"default"},create:{id:"default",nextValue:2},update:{nextValue:{increment:1}}})).nextValue-1}class sl{events;executor;checkpointRestorer;credentials;agentControl;notifications;runsService;worktrees;commandsService;githubService;jiraService;runtimeTimer;ticking;workerId;activeExecutions;claimedSecretJobs;waitPollers;constructor(e,t=new nz,r,i,a,n,s,o,l,c,u){this.events=e,this.executor=t,this.checkpointRestorer=r,this.credentials=i,this.agentControl=a,this.notifications=n,this.runsService=s,this.worktrees=o,this.commandsService=l,this.githubService=c,this.jiraService=u,this.ticking=!1,this.workerId=(0,g.randomUUID)(),this.activeExecutions=new Map,this.claimedSecretJobs=new Set,this.waitPollers=new Map,this.agentControl&&(this.executor.register("TERMINAL_RUN",e=>this.startTerminalJob(e)),this.executor.register("WORKTREE_SNAPSHOT",e=>this.startCheckpointJob(e)),this.agentControl.registerCompletionHandler(nH.WORKFLOW_TERMINAL_JOB_KIND,e=>this.workflowAgentJobCompleted(e)),this.agentControl.registerCompletionObserver(e=>this.genericAgentJobCompleted(e)),this.agentControl.registerCompletionHandler(nH.WORKFLOW_GIT_CHECKPOINT_JOB_KIND,e=>this.workflowAgentJobCompleted(e)))}async controlLinkedAgentRuns(e,t){if(!this.runsService)return;let r=await (0,tY.getPrismaClient)(),i=await r.workflowRunResourceLink.findMany({where:{runId:e,kind:"AGENT_RUN",attempt:{status:{in:["RUNNING","WAITING"]}}},select:{resourceId:!0},distinct:["resourceId"]});await Promise.allSettled(i.map(async({resourceId:e})=>{let r=await this.runsService.get(e);!r||"MANAGED"!==r.origin||"PAUSE"===t&&"IN_PROGRESS"!==r.status||"CONTINUE"===t&&"PAUSED"!==r.status||"CANCEL"===t&&new Set(["COMPLETED","FAILED","CANCELLED"]).has(r.status)||await this.runsService.lifecycle(e,t)}))}async cancelWaitingCommandRuns(e){if(!this.commandsService)return;let t=await (0,tY.getPrismaClient)(),r=await t.workflowRunResourceLink.findMany({where:{runId:e,kind:"COMMAND_RUN",attempt:{status:"WAITING"}},select:{resourceId:!0},distinct:["resourceId"]});await Promise.allSettled(r.map(({resourceId:e})=>this.commandsService.terminateRun(e)))}async runWorktree(e){let t=(0,nn.getSessionValue)(n4(e),"worktree.id");return"string"==typeof t&&t?(await (0,tY.getPrismaClient)()).worktree.findUnique({where:{id:t},select:{id:!0,folder:!0,branch:!0,highlightColor:!0}}):null}async notifyRun(e,t,r,i,a){if(!this.notifications)return;let n=await (0,tY.getPrismaClient)(),s=await n.workflowRun.findUnique({where:{id:e},select:{sessionDataJson:!0}}),o=s?await this.runWorktree(s.sessionDataJson):null,l=await n.$transaction(n=>this.notifications.recordInTransaction(n,{dedupeKey:`workflow:${e}:${a}`,typeKey:t,title:r,body:i,href:`/workflows/runs/${e}`,resourceKind:"WORKFLOW_RUN",resourceId:e,worktreeId:o?.id??null,highlightColor:o?.highlightColor??null}));this.notifications.created(l)}startRuntime(){this.runtimeTimer||(this.runtimeTimer=setInterval(()=>{this.tick().catch(e=>{console.error("Workflow runtime tick failed:",e)})},1e3),this.runtimeTimer.unref?.(),this.tick().catch(e=>{console.error("Workflow runtime startup failed:",e)}))}stopRuntime(){for(let e of(this.runtimeTimer&&clearInterval(this.runtimeTimer),this.runtimeTimer=void 0,this.activeExecutions.values()))e.abort();this.activeExecutions.clear()}catalog(){return{schemaVersion:ii.WORKFLOW_SCHEMA_VERSION,globalConcurrency:4,steps:ii.WORKFLOW_STEP_CATALOG,triggers:ii.WORKFLOW_TRIGGER_CATALOG}}registerWaitPoller(e,t){this.waitPollers.set(e,t)}async list(e={}){let t=await (0,tY.getPrismaClient)(),r=Math.min(Math.max(e.first??100,1),200),i=e.archive?.toUpperCase()??"ACTIVE",a=e.search?.trim(),n=await t.workflow.findMany({where:{..."ALL"===i?{}:"ARCHIVED"===i?{archivedAt:{not:null}}:{archivedAt:null},...null===e.enabled||void 0===e.enabled?{}:{enabled:e.enabled},...a?{OR:[{name:{contains:a}},{description:{contains:a}}]}:{}},include:{activeVersion:!0,quickActionRepositories:{include:{repository:!0}},_count:{select:{versions:!0,runs:!0}}},orderBy:[{updatedAt:"desc"},{id:"desc"}],take:r+1,...e.after?{cursor:{id:e.after},skip:1}:{}});return{items:n.slice(0,r),nextCursor:n.length>r?n[r-1].id:null,totalCount:await t.workflow.count()}}async get(e){return(await (0,tY.getPrismaClient)()).workflow.findUnique({where:{id:e},include:{activeVersion:!0,versions:{orderBy:{version:"desc"}},quickActionRepositories:{include:{repository:!0}},_count:{select:{runs:!0}}}})}async version(e){return(await (0,tY.getPrismaClient)()).workflowVersion.findUnique({where:{id:e},include:{triggers:!0}})}async create(e){let t=n5(e.name,"Workflow name",200),r=(0,ii.parseWorkflowDefinition)(e.definition??(0,ii.emptyWorkflowDefinition)(t)),i=JSON.stringify({...r,name:t,description:e.description?.trim()??r.description});st(i,"Workflow definition",2097152);let a=n9(e.overlapPolicy),n=await (0,tY.getPrismaClient)(),s=await n.workflow.create({data:{id:(0,g.randomUUID)(),name:t,description:e.description?.trim()??r.description,draftDefinitionJson:i,draftSchemaVersion:ii.WORKFLOW_SCHEMA_VERSION,overlapPolicy:a,maxConcurrentRuns:n7(e.maxConcurrentRuns,a)}});return si(s.id),this.get(s.id)}async saveDraft(e){let t=(0,ii.parseWorkflowDefinition)(e.definition),r=JSON.stringify(t);st(r,"Workflow definition",2097152);let i=await this.get(e.id);if(!i)throw Error("Workflow not found");let a=n9(e.overlapPolicy??i.overlapPolicy),n=await (0,tY.getPrismaClient)();return await n.workflow.update({where:{id:e.id},data:{name:t.name,description:t.description,draftDefinitionJson:r,draftSchemaVersion:t.schemaVersion,overlapPolicy:a,maxConcurrentRuns:n7(e.maxConcurrentRuns??i.maxConcurrentRuns,a)}}),si(e.id),this.get(e.id)}async validateDraft(e){let t=await this.get(e);if(!t)throw Error("Workflow not found");let r=(0,ii.validateWorkflowDefinition)(n4(t.draftDefinitionJson)),i=[...r.diagnostics];return r.definition&&i.push(...await this.validateSubworkflows(t.id,r.definition)),{valid:!(0,ii.hasWorkflowErrors)(i),diagnostics:i}}async validateSubworkflows(e,t){let r=t.nodes.filter(({kind:e})=>"CONTROL_SUBWORKFLOW"===e).map(e=>({node:e,versionId:e.config.versionId})).filter(e=>"string"==typeof e.versionId);if(!r.length)return[];let i=await (0,tY.getPrismaClient)(),a=new Map,n=new Map,s=new Set,o=new Set,l=r.map(({versionId:e})=>e);for(;l.length;){let e=[...new Set(l)].filter(e=>!o.has(e));if(!e.length)break;for(let t of(e.forEach(e=>o.add(e)),l=[],await i.workflowVersion.findMany({where:{id:{in:e}}}))){a.set(t.id,t);try{let e=(0,ii.parseWorkflowDefinition)(n4(t.definitionJson)).nodes.filter(({kind:e})=>"CONTROL_SUBWORKFLOW"===e).map(({config:e})=>e.versionId).filter(e=>"string"==typeof e);n.set(t.id,e),l.push(...e)}catch{s.add(t.id)}}}let c=(e,t)=>{let r=a.get(e);if(!r)return"MISSING";if(s.has(e))return"INVALID";if(t.has(r.workflowId))return"RECURSIVE";let i=new Set(t).add(r.workflowId);for(let t of n.get(e)??[]){let e=c(t,i);if(e)return e}return null},u=[];for(let{node:t,versionId:i}of r){let r=c(i,new Set([e]));"MISSING"===r?u.push({severity:"ERROR",code:"SUBWORKFLOW_NOT_FOUND",message:"Pinned sub-workflow chain contains a missing version",nodeId:t.id}):"INVALID"===r?u.push({severity:"ERROR",code:"SUBWORKFLOW_INVALID",message:"Pinned sub-workflow chain contains an invalid definition",nodeId:t.id}):"RECURSIVE"===r&&u.push({severity:"ERROR",code:"SUBWORKFLOW_RECURSION",message:"Pinned sub-workflow calls cannot form a recursive chain",nodeId:t.id})}return u}async publish(e){let t=await this.get(e);if(!t)throw Error("Workflow not found");let r=(0,ii.parseWorkflowDefinition)(n4(t.draftDefinitionJson)),i=await this.validateDraft(e);if(!i.valid)throw Error(`Workflow cannot be published: ${i.diagnostics.filter(({severity:e})=>"ERROR"===e).map(({message:e})=>e).slice(0,5).join("; ")}`);let a=await (0,tY.getPrismaClient)(),n=await a.$transaction(async t=>{let i=await t.workflowVersion.findFirst({where:{workflowId:e},orderBy:{version:"desc"}}),a=(0,g.randomUUID)(),n=await t.workflowVersion.create({data:{id:a,workflowId:e,version:(i?.version??0)+1,name:r.name,description:r.description,schemaVersion:r.schemaVersion,definitionJson:JSON.stringify(r),contentHash:(0,g.createHash)("sha256").update(se(r)).digest("hex"),triggers:{create:r.triggers.map(e=>({id:(0,g.randomUUID)(),nodeId:e.id,kind:e.kind,configJson:JSON.stringify(e.config)}))}},include:{triggers:!0}});return await t.workflow.update({where:{id:e},data:{activeVersionId:a}}),n});return si(e),n}async setEnabled(e,t){let r=await (0,tY.getPrismaClient)(),i=await r.workflow.findUnique({where:{id:e}});if(!i)throw Error("Workflow not found");if(t&&!i.activeVersionId)throw Error("Publish the workflow before enabling it");return await r.workflow.update({where:{id:e},data:{enabled:t}}),si(e),this.get(e)}async setQuickAction(e){let t=await (0,tY.getPrismaClient)(),r=[...new Set(e.repositoryIds.map(e=>e.trim()).filter(Boolean))],[i,a]=await Promise.all([t.workflow.findUnique({where:{id:e.id},select:{id:!0}}),t.codebaseRepository.count({where:{id:{in:r}}})]);if(!i)throw Error("Workflow not found");if(a!==r.length)throw Error("One or more repositories were not found");let n=e.quickActionIconKey.trim();if(!ia.WORKFLOW_QUICK_ACTION_KINDS.includes(e.kind))throw Error("Quick action kind is invalid");if("none"!==n&&!a3.BUILD_CONFIGURATION_ICON_KEYS.includes(n))throw Error("Quick action icon is invalid");let s=e.quickActionButtonVariant.trim();if(!["default","outline","secondary","destructive"].includes(s))throw Error("Quick action button style is invalid");return await t.$transaction(async t=>{await t.workflow.update({where:{id:e.id},data:{quickActionKind:e.kind,quickActionIconKey:n,quickActionButtonVariant:s}}),await t.workflowQuickActionRepository.deleteMany({where:{workflowId:e.id}}),r.length&&await t.workflowQuickActionRepository.createMany({data:r.map(t=>({workflowId:e.id,repositoryId:t}))})}),si(e.id),this.get(e.id)}async archive(e,t){let r=await (0,tY.getPrismaClient)();return await r.workflow.update({where:{id:e},data:{archivedAt:t?new Date:null,...t?{enabled:!1}:{}}}),si(e),this.get(e)}async delete(e){let t=await (0,tY.getPrismaClient)();if(await t.workflowRun.count({where:{workflowId:e}}))throw Error("Archive workflows that have run history instead of deleting them");return await t.workflow.delete({where:{id:e}}),si(e),!0}export(e,t){return this.exportInternal(e,t)}async exportInternal(e,t){let r=await this.get(e);if(!r)throw Error("Workflow not found");let i=t?r.versions.find(e=>e.id===t):null;if(t&&!i)throw Error("Workflow version not found");let a=(0,ii.parseWorkflowDefinition)(n4(i?.definitionJson??r.draftDefinitionJson));return{format:"aide.workflow.export",schemaVersion:ii.WORKFLOW_SCHEMA_VERSION,exportedAt:new Date().toISOString(),workflow:{name:i?.name??r.name,description:i?.description??r.description,overlapPolicy:r.overlapPolicy,maxConcurrentRuns:r.maxConcurrentRuns,definition:(0,ii.sanitizeWorkflowExportDefinition)(a)}}}async import(e){st("string"==typeof e.payload?e.payload:JSON.stringify(e.payload),"Workflow import",2097152);let t=sr("string"==typeof e.payload?JSON.parse(e.payload):e.payload,"Workflow import"),r="aide.workflow.export"===t.format,i=r?sr(t.workflow,"Exported workflow"):t,a=(0,ii.parseWorkflowDefinition)(r?i.definition:i);return this.create({name:e.name?.trim()||a.name,description:a.description,definition:{...a,name:e.name?.trim()||a.name},overlapPolicy:"string"==typeof i.overlapPolicy?i.overlapPolicy:"QUEUE",maxConcurrentRuns:"number"==typeof i.maxConcurrentRuns?i.maxConcurrentRuns:1})}async runs(e={}){let t=await (0,tY.getPrismaClient)(),r=Math.min(Math.max(e.first??100,1),200),i=Number(e.search),a=e.archive?.toUpperCase()??"ACTIVE",n="ALL"===a?{}:"ARCHIVED"===a?{archivedAt:{not:null}}:{archivedAt:null},s=await t.workflowRun.findMany({where:{...n,...e.workflowId?{workflowId:e.workflowId}:{},...e.status?{status:e.status.toUpperCase()}:{},...Number.isInteger(i)&&i>0?{displayNumber:i}:e.search?.trim()?{workflow:{name:{contains:e.search.trim()}}}:{}},include:{workflow:!0,version:!0,trigger:!0,_count:{select:{attempts:!0,events:!0}}},orderBy:[{createdAt:"desc"},{id:"desc"}],take:r+1,...e.after?{cursor:{id:e.after},skip:1}:{}});return{items:s.slice(0,r),nextCursor:s.length>r?s[r-1].id:null,totalCount:await t.workflowRun.count({where:{...n,...e.workflowId?{workflowId:e.workflowId}:{}}})}}async archiveRuns(e,t){let r=await (0,tY.getPrismaClient)(),i=[...new Set(e)],a=await r.workflowRun.updateMany({where:{id:{in:i}},data:{archivedAt:t?new Date:null}});for(let e of i)sa(e);return a.count}async deleteRuns(e){let t=await (0,tY.getPrismaClient)(),r=[...new Set(e)];if(await t.workflowRun.count({where:{id:{in:r},status:{notIn:["SUCCEEDED","FAILED","CANCELLED"]}}}))throw Error("Cancel runs that have not finished before deleting them");let i=await t.workflowRun.deleteMany({where:{id:{in:r}}});for(let e of r)sa(e);return i.count}async run(e){return(await (0,tY.getPrismaClient)()).workflowRun.findUnique({where:{id:e},include:{workflow:!0,version:!0,trigger:!0,parentRun:!0,childRuns:{orderBy:{createdAt:"asc"}},attempts:{orderBy:[{generation:"asc"},{nodeId:"asc"},{iterationKey:"asc"},{attempt:"asc"}],include:{waits:{orderBy:{createdAt:"asc"}},resourceLinks:{orderBy:{createdAt:"asc"}},questionBatches:{orderBy:{createdAt:"asc"},include:{questions:{orderBy:{position:"asc"},include:{options:{orderBy:{position:"asc"}}}},answerRevisions:{orderBy:{revision:"asc"}},checkpoint:!0}},checkpoints:{orderBy:{createdAt:"asc"}}}},waits:{orderBy:{createdAt:"asc"}},events:{orderBy:{sequence:"asc"}},resourceLinks:{orderBy:{createdAt:"asc"}}}})}async runEvents(e,t=-1,r=500){return(await (0,tY.getPrismaClient)()).workflowRunEvent.findMany({where:{runId:e,sequence:{gt:t}},orderBy:{sequence:"asc"},take:Math.min(Math.max(r,1),1e3)})}async questionBatch(e){return(await (0,tY.getPrismaClient)()).runQuestionBatch.findUnique({where:{id:e},include:{questions:{orderBy:{position:"asc"},include:{options:{orderBy:{position:"asc"}}}},answerRevisions:{orderBy:{revision:"asc"}},checkpoint:!0}})}async jobSecrets(e,t){if(!this.credentials||!this.agentControl)throw Error("Workflow credentials are unavailable");if(this.claimedSecretJobs.has(t))throw Error("Workflow job secrets were already claimed");let r=await this.agentControl.getJob(t);if(!r||r.agentId!==e||"workflow.terminal.run"!==r.kind||"RUNNING"!==r.status)throw Error("Workflow job is not eligible to claim secrets");let i=(0,nH.parseWorkflowTerminalPayload)(n4(r.payloadJson)),a=new Set(Object.values(tX.CREDENTIAL_KINDS)),n=[];for(let e of i.credentialEnvironment){if(!a.has(e.credential.kind))throw Error("Workflow references an unsupported credential kind");let t=await this.credentials.getText(e.credential);if(null===t)throw Error(`Credential ${e.credential.id} is unavailable`);n.push({name:e.name,value:t})}return this.claimedSecretJobs.add(t),n}async workflowAgentContext(e){let t=await (0,tY.getPrismaClient)(),r=(0,nn.getSessionValue)(e,"worktree.id");if("string"==typeof r){let e=await t.worktree.findUnique({where:{id:r},include:{codebase:{include:{agent:!0}}}});if(!e)throw Error("Workflow worktree is unavailable");let i=JSON.parse(e.codebase.agent.capabilitiesJson);return{agentId:e.codebase.agentId,codebaseId:e.codebaseId,worktreeId:e.id,cwd:e.folder,capabilities:Array.isArray(i)?i.filter(e=>"string"==typeof e):[]}}let i=(0,nn.getSessionValue)(e,"codebase.id");if("string"!=typeof i)throw Error("Workflow requires a codebase or worktree");let a=await t.codebase.findUnique({where:{id:i},include:{agent:!0}});if(!a)throw Error("Workflow codebase is unavailable");let n=JSON.parse(a.agent.capabilitiesJson);return{agentId:a.agentId,codebaseId:a.id,worktreeId:null,cwd:a.folder,capabilities:Array.isArray(n)?n.filter(e=>"string"==typeof e):[]}}async startTerminalJob(e){if(!this.agentControl)throw Error("Agent control is unavailable");let t=await this.workflowAgentContext(e.sessionData);if(!t.capabilities.includes(nH.WORKFLOW_TERMINAL_JOB_KIND))throw Error("The selected agent must be updated to run workflow terminal steps");let r={...e.node.config.environment&&"object"==typeof e.node.config.environment&&!Array.isArray(e.node.config.environment)?Object.fromEntries(Object.entries(e.node.config.environment).map(([e,t])=>[e,String(t)])):{},AIDE_TICKET_KEY:String((0,nn.getSessionValue)(e.sessionData,"ticket.key")??""),AIDE_TICKET_TITLE:String((0,nn.getSessionValue)(e.sessionData,"ticket.title")??""),AIDE_BRANCH:String((0,nn.getSessionValue)(e.sessionData,"worktree.branch")??""),AIDE_BASE_BRANCH:String((0,nn.getSessionValue)(e.sessionData,"worktree.baseBranch")??""),AIDE_WORKTREE_PATH:String((0,nn.getSessionValue)(e.sessionData,"worktree.path")??t.cwd),AIDE_CODEBASE_PATH:String((0,nn.getSessionValue)(e.sessionData,"codebase.folder")??t.cwd),AIDE_REPO_ORIGIN:String((0,nn.getSessionValue)(e.sessionData,"repo.displayOrigin")??"")},i=Array.isArray(e.node.config.credentials)?e.node.config.credentials:[],a=await this.agentControl.createJob({agentId:t.agentId,kind:nH.WORKFLOW_TERMINAL_JOB_KIND,payload:{workflowRunId:e.run.id,stepAttemptId:e.attempt.id,stepId:e.node.id,codebaseId:t.codebaseId,worktreeId:t.worktreeId,cwd:t.cwd,script:n5(String(e.node.config.script??""),"Terminal script",1e6),interpreter:"NODE"===e.node.config.interpreter?"NODE":"SHELL",sessionData:e.sessionData,environment:r,credentialEnvironment:i},idempotencyKey:e.attempt.idempotencyKey,timeoutSeconds:Number(e.node.config.timeoutSeconds??900),codebaseId:t.codebaseId,worktreeId:t.worktreeId,visibility:"SYSTEM"});return{output:{jobId:a.id},links:[{kind:"AGENT_JOB",resourceId:a.id,label:"Workflow terminal job",url:`/jobs/${a.id}`}],wait:{kind:"AGENT_JOB",externalKey:a.id,resumeAfter:nc(e.node.config),timeoutAt:no(e.node.config,900)}}}async startCheckpointJob(e){if(!this.agentControl)throw Error("Agent control is unavailable");let t=await this.workflowAgentContext(e.sessionData);if(!t.capabilities.includes(nH.WORKFLOW_GIT_CHECKPOINT_JOB_KIND))throw Error("The selected agent must be updated to capture workflow checkpoints");let r=await this.agentControl.createJob({agentId:t.agentId,kind:nH.WORKFLOW_GIT_CHECKPOINT_JOB_KIND,payload:{operation:"CAPTURE",workflowRunId:e.run.id,stepAttemptId:e.attempt.id,cwd:t.cwd,kind:String(e.node.config.kind??"STEP"),checkpoint:null,stash:!1},idempotencyKey:e.attempt.idempotencyKey,timeoutSeconds:300,codebaseId:t.codebaseId,worktreeId:t.worktreeId,visibility:"SYSTEM"});return{output:{jobId:r.id},links:[{kind:"AGENT_JOB",resourceId:r.id,label:"Workflow checkpoint job",url:`/jobs/${r.id}`}],wait:{kind:"AGENT_JOB",externalKey:r.id,resumeAfter:nc(e.node.config),timeoutAt:no(e.node.config)}}}async workflowAgentJobCompleted(e){if(e.kind===nH.WORKFLOW_TERMINAL_JOB_KIND){let t=(0,nH.parseWorkflowTerminalPayload)(n4(e.payloadJson));if("SUCCEEDED"!==e.status||!e.resultJson)return void await this.resolveExternalWait("AGENT_JOB",e.id,{jobId:e.id,status:e.status},e.error||`Workflow terminal job ${e.status.toLowerCase()}`);let r=sr(n4(e.resultJson),"Workflow terminal result");return void await this.resolveExternalWait("AGENT_JOB",e.id,{...r,jobId:e.id,stepAttemptId:t.stepAttemptId})}if(e.kind!==nH.WORKFLOW_GIT_CHECKPOINT_JOB_KIND)return;let t=(0,nH.parseWorkflowGitCheckpointPayload)(n4(e.payloadJson));if("SUCCEEDED"!==e.status||!e.resultJson)return void await this.resolveExternalWait("AGENT_JOB",e.id,{jobId:e.id,status:e.status},e.error||`Workflow checkpoint job ${e.status.toLowerCase()}`);let r=sr(n4(e.resultJson),"Workflow checkpoint result"),i=null;if(r.checkpoint&&"object"==typeof r.checkpoint){let e=r.checkpoint,a=await (0,tY.getPrismaClient)();i=(0,g.randomUUID)(),await a.$transaction([a.runCheckpoint.create({data:{id:i,workflowStepAttemptId:t.stepAttemptId,kind:String(e.kind??t.kind),headSha:"string"==typeof e.headSha?e.headSha:null,branch:"string"==typeof e.branch?e.branch:null,upstreamSha:"string"==typeof e.upstreamSha?e.upstreamSha:null,indexTree:"string"==typeof e.indexTree?e.indexTree:null,worktreeTree:"string"==typeof e.worktreeTree?e.worktreeTree:null,refName:"string"==typeof e.refName?e.refName:null,manifestJson:"string"==typeof e.manifestJson?e.manifestJson:null,diffSummary:"string"==typeof e.diffSummary?e.diffSummary:null,diffPatch:"string"==typeof e.diffPatch?e.diffPatch:null,stashRef:"string"==typeof r.stashRef?r.stashRef:"string"==typeof e.stashRef?e.stashRef:null}}),a.workflowRunResourceLink.create({data:{id:(0,g.randomUUID)(),runId:t.workflowRunId,attemptId:t.stepAttemptId,kind:"CHECKPOINT",resourceId:i,label:`${String(e.kind??t.kind)} checkpoint`}})])}await this.resolveExternalWait("AGENT_JOB",e.id,{...r,jobId:e.id,checkpointId:i})}async genericAgentJobCompleted(e){if(e.kind===nH.WORKFLOW_TERMINAL_JOB_KIND||e.kind===nH.WORKFLOW_GIT_CHECKPOINT_JOB_KIND)return;let t=e.resultJson?sr(n4(e.resultJson),"Agent job result"):{status:e.status};if("SUCCEEDED"===e.status){let r=await (0,tY.getPrismaClient)(),i=t.worktree&&"object"==typeof t.worktree&&!Array.isArray(t.worktree)?t.worktree:null,a=i&&"string"==typeof i.gitDirectory?i.gitDirectory:null,n=e.codebaseId?await r.worktree.findFirst({where:{codebaseId:e.codebaseId,...e.worktreeId?{id:e.worktreeId}:a?{gitDirectory:a}:{id:"__missing__"}},include:{codebase:{include:{repository:!0,agent:!0}}}}):null,s=n?.codebase??(e.codebaseId?await r.codebase.findUnique({where:{id:e.codebaseId},include:{repository:!0,agent:!0}}):null),o={};if(n&&this.worktrees?.workflowSessionDataForWorktree)try{o=await this.worktrees.workflowSessionDataForWorktree(n.id,{includeMissing:!0})}catch{}if(s&&!o.codebase&&(o.repo={id:s.repository.id,name:s.repository.name,url:s.repository.displayOrigin,canonicalOrigin:s.repository.canonicalOrigin,displayOrigin:s.repository.displayOrigin,defaultBranch:s.defaultBranch},o.codebase={id:s.id,folder:s.folder,agentId:s.agentId,branch:s.defaultBranch,headSha:s.headSha},o.agent={id:s.agent.id,name:s.agent.name,hostname:s.agent.hostname}),n&&!o.worktree&&(o.worktree={id:n.id,path:n.folder,branch:n.branch,baseBranch:n.baseBranchOverride??n.codebase.defaultBranch,headSha:n.headSha,pushStatus:n.pushStatus,ahead:n.ahead,behind:n.behind,baseBehind:n.baseBehind,dirty:n.hasStagedChanges||n.hasUnstagedChanges}),Object.keys(o).length){let e=t.sessionPatch&&"object"==typeof t.sessionPatch&&!Array.isArray(t.sessionPatch)?t.sessionPatch:{};t={...t,sessionPatch:(0,nn.mergeSessionData)(e,o)}}}await this.resolveExternalWait("AGENT_JOB",e.id,{...t,jobId:e.id,status:e.status},"SUCCEEDED"===e.status?null:e.error||`Agent job ${e.status.toLowerCase()}`)}async restoreCheckpointWithAgent(e,t){if(!this.agentControl)throw Error("Agent control is unavailable");let r=await (0,tY.getPrismaClient)(),i=await r.runCheckpoint.findUnique({where:{id:e},include:{workflowStepAttempt:{include:{run:!0}}}}),a=i?.workflowStepAttempt;if(!i||!a)throw Error("Workflow checkpoint not found");let n=await this.workflowAgentContext((0,nn.workflowSessionData)(a.run.sessionDataJson)),s=await this.agentControl.createJob({agentId:n.agentId,kind:nH.WORKFLOW_GIT_CHECKPOINT_JOB_KIND,payload:{operation:"RESTORE",workflowRunId:a.runId,stepAttemptId:a.id,cwd:n.cwd,kind:"REPLAY_RESTORE",checkpoint:{headSha:i.headSha,branch:i.branch,upstreamSha:i.upstreamSha,indexTree:i.indexTree,worktreeTree:i.worktreeTree,refName:i.refName},stash:t.stash},idempotencyKey:`workflow:restore:${e}:${(0,g.randomUUID)()}`,timeoutSeconds:300,codebaseId:n.codebaseId,worktreeId:n.worktreeId,visibility:"SYSTEM"}),o=Date.now()+3e5;for(;Date.now()<o;){let e=await this.agentControl.getJob(s.id);if(!e)throw Error("Workflow restore job disappeared");if(new Set(["SUCCEEDED","FAILED","CANCELLED","TIMED_OUT"]).has(e.status)){if("SUCCEEDED"!==e.status)throw Error(e.error||`Workflow restore job ${e.status.toLowerCase()}`);return}await new Promise(e=>setTimeout(e,250))}throw await this.agentControl.cancelJob(s.id),Error("Workflow restore job timed out")}async compareCheckpointWithAgent(e){if(!this.agentControl)throw Error("Agent control is unavailable");let t=await (0,tY.getPrismaClient)(),r=await t.runCheckpoint.findUnique({where:{id:e},include:{workflowStepAttempt:{include:{run:!0}}}}),i=r?.workflowStepAttempt;if(!r||!i)throw Error("Workflow checkpoint not found");let a=await this.workflowAgentContext((0,nn.workflowSessionData)(i.run.sessionDataJson)),n=await this.agentControl.createJob({agentId:a.agentId,kind:nH.WORKFLOW_GIT_CHECKPOINT_JOB_KIND,payload:{operation:"COMPARE",workflowRunId:i.runId,stepAttemptId:i.id,cwd:a.cwd,kind:"REPLAY_PREVIEW",checkpoint:{headSha:r.headSha,branch:r.branch,upstreamSha:r.upstreamSha,indexTree:r.indexTree,worktreeTree:r.worktreeTree,refName:r.refName},stash:!1},idempotencyKey:`workflow:compare:${e}:${(0,g.randomUUID)()}`,timeoutSeconds:60,codebaseId:a.codebaseId,worktreeId:a.worktreeId,visibility:"SYSTEM"}),s=Date.now()+6e4;for(;Date.now()<s;){let e=await this.agentControl.getJob(n.id);if(!e)throw Error("Workflow comparison job disappeared");if(new Set(["SUCCEEDED","FAILED","CANCELLED","TIMED_OUT"]).has(e.status)){if("SUCCEEDED"!==e.status||!e.resultJson)throw Error(e.error||`Workflow comparison job ${e.status.toLowerCase()}`);let t=sr(n4(e.resultJson),"Workflow comparison result");return sr(t.comparison,"Git checkpoint comparison")}await new Promise(e=>setTimeout(e,250))}throw await this.agentControl.cancelJob(n.id),Error("Workflow comparison job timed out")}async runsForResource(e,t){let r=await (0,tY.getPrismaClient)(),i=await r.workflowRunResourceLink.findMany({where:{kind:e.trim().toUpperCase(),resourceId:t.trim()},select:{runId:!0},distinct:["runId"],orderBy:{createdAt:"desc"}});return r.workflowRun.findMany({where:{id:{in:i.map(({runId:e})=>e)}},include:{workflow:!0,version:!0,trigger:!0,attempts:{orderBy:[{generation:"asc"},{createdAt:"asc"}],include:{resourceLinks:{orderBy:{createdAt:"asc"}},questionBatches:{orderBy:{createdAt:"asc"},include:{questions:{orderBy:{position:"asc"},include:{options:{orderBy:{position:"asc"}}}}}}}},resourceLinks:{orderBy:{createdAt:"asc"}}},orderBy:{createdAt:"desc"}})}async acceptingResource(e){let t=e.trim().toUpperCase(),r=await (0,tY.getPrismaClient)();return(await r.workflow.findMany({where:{enabled:!0,archivedAt:null,activeVersionId:{not:null}},include:{activeVersion:!0},orderBy:{name:"asc"}})).filter(e=>!!e.activeVersion&&(0,ii.parseWorkflowDefinition)(n4(e.activeVersion.definitionJson)).triggers.some(e=>(0,ia.isResourceTriggerKind)(e.kind)&&(0,ii.workflowResourceKind)(e.config)===t))}async quickActions(e){let t=await (0,tY.getPrismaClient)();if(!ia.WORKFLOW_QUICK_ACTION_KINDS.includes(e.kind))throw Error("Quick action kind is invalid");let r=e.resourceKind.trim().toUpperCase(),i=e.repositoryId?.trim()||null;return(await t.workflow.findMany({where:{enabled:!0,archivedAt:null,activeVersionId:{not:null},quickActionKind:e.kind,OR:[{quickActionRepositories:{none:{}}},{quickActionRepositories:{some:{repositoryId:i??""}}}]},include:{activeVersion:!0},orderBy:[{name:"asc"},{id:"asc"}]})).filter(e=>!!e.activeVersion&&(0,ii.parseWorkflowDefinition)(n4(e.activeVersion.definitionJson)).triggers.some(e=>(0,ia.isResourceTriggerKind)(e.kind)&&(0,ii.workflowResourceKind)(e.config)===r))}async recordEvent(e){return this.events.record(e)}async hydrateResourceSessionData(e,t,r){let i=e?.toUpperCase()??null,a=await (0,tY.getPrismaClient)(),n={},s=null;if("CODEBASE"===i&&t){let e=await a.codebase.findUnique({where:{id:t},select:{id:!0,folder:!0,agentId:!0,branch:!0,headSha:!0,defaultBranch:!0,agent:{select:{id:!0,name:!0,hostname:!0,lastSeenAt:!0,disconnectedAt:!0,heartbeatIntervalSeconds:!0,diskFreeBytes:!0,memoryFreeBytes:!0}},repository:{select:{id:!0,name:!0,canonicalOrigin:!0,displayOrigin:!0}}}});e&&(n=n8(e))}if("BUILD"===i&&t){let e=await a.build.findUnique({where:{id:t},select:{id:!0,status:!0,action:!0,error:!0,artifactDirectory:!0,worktreeId:!0,agent:{select:{id:!0,name:!0,hostname:!0,lastSeenAt:!0,disconnectedAt:!0,heartbeatIntervalSeconds:!0,diskFreeBytes:!0,memoryFreeBytes:!0}},codebase:{select:{id:!0,folder:!0,agentId:!0,branch:!0,headSha:!0,defaultBranch:!0,agent:{select:{id:!0,name:!0,hostname:!0,lastSeenAt:!0,disconnectedAt:!0,heartbeatIntervalSeconds:!0,diskFreeBytes:!0,memoryFreeBytes:!0}},repository:{select:{id:!0,name:!0,canonicalOrigin:!0,displayOrigin:!0}}}},artifacts:{select:{id:!0,kind:!0,relativePath:!0,sizeBytes:!0,checksum:!0}},reports:{where:{status:"READY"},select:{kind:!0,summaryJson:!0}}}});if(e){s=e.worktreeId;let t=t=>{let r=e.reports.find(e=>e.kind===t);if(r)try{return(0,nn.workflowSessionData)(r.summaryJson)}catch{return}},r=t("TEST_RESULTS"),i=t("CODE_COVERAGE");n=(0,nn.mergeSessionData)(e.codebase?n8(e.codebase):e.agent?n6(e.agent):{},{build:{id:e.id,status:e.status,action:e.action,error:e.error,artifactDirectory:e.artifactDirectory,artifacts:e.artifacts,...r?{testSummary:r}:{},...i?{coverageSummary:i}:{}}})}}if("AGENT_RUN"===i&&t){let e=await a.agentRun.findUnique({where:{id:t},select:{id:!0,kind:!0,status:!0,phase:!0,origin:!0,provider:!0,model:!0,branch:!0,finalOutput:!0,error:!0,jiraIssueKey:!0,worktreeId:!0,agent:{select:{id:!0,name:!0,hostname:!0,disconnectedAt:!0,diskFreeBytes:!0,memoryFreeBytes:!0}},inputTokens:!0,outputTokens:!0,reasoningTokens:!0,cacheReadTokens:!0,cacheWriteTokens:!0,toolCallCount:!0,estimatedCost:!0}});e&&(s=e.worktreeId,n=(0,nn.mergeSessionData)(e.agent?n6(e.agent):{},{run:{id:e.id,kind:e.kind,status:e.status,phase:e.phase,origin:e.origin,provider:e.provider,model:e.model,branch:e.branch,finalOutput:e.finalOutput,error:e.error,usage:{inputTokens:e.inputTokens,outputTokens:e.outputTokens,reasoningTokens:e.reasoningTokens,cacheReadTokens:e.cacheReadTokens,cacheWriteTokens:e.cacheWriteTokens,toolCallCount:e.toolCallCount,estimatedCost:e.estimatedCost}},...e.jiraIssueKey?{ticket:{key:e.jiraIssueKey}}:{}}))}if("PULL_REQUEST"===i&&t&&this.githubService){let e=/^([^/]+)\/([^#]+)#([1-9]\d*)$/.exec(t);if(e)try{let t=await this.githubService.pullRequest(e[1],e[2],Number(e[3]));t&&(s=t.worktreeId,n=(0,nn.mergeSessionData)(n,{repo:{id:t.codebaseRepositoryId,githubId:t.repositoryGithubId,name:t.repositoryNameWithOwner.split("/").at(-1),displayOrigin:t.repositoryNameWithOwner,url:t.repositoryUrl},pr:{...t,headBranch:t.headRefName,baseBranch:t.baseRefName,unresolvedThreads:t.reviewThreads.filter(({isResolved:e})=>!e)},...t.jiraKey?{ticket:{key:t.jiraKey}}:{}}))}catch{}}if("JIRA_TICKET"===i&&t&&this.jiraService)try{let e=await this.jiraService.ticket(t),r=e.comments.at(-1)??null;n=(0,nn.mergeSessionData)(n,{ticket:{...e,title:e.summary,type:e.issueType,url:e.jiraUrl},...r?{comment:{id:r.id,body:r.content?.rawText??"",author:r.author}}:{}})}catch{}let o=(0,nn.getSessionValue)(r,"worktree.id"),l="WORKTREE"===i?t:"GITHUB_PIPELINE"===i||"GITHUB_JOB"===i?"string"==typeof o?o:null:s;if(l&&this.worktrees)if(this.worktrees.workflowSessionDataForWorktree)n=(0,nn.mergeSessionData)(await this.worktrees.workflowSessionDataForWorktree(l),n);else{let e=await this.worktrees.ticketKeyForWorktree(l);e&&(n=(0,nn.mergeSessionData)({ticket:{key:e}},n))}let c=(0,nn.getSessionValue)(r,"pipeline.pullRequests");!(0,nn.getSessionValue)(n,"pr")&&!(0,nn.getSessionValue)(r,"pr")&&Array.isArray(c)&&c[0]&&"object"==typeof c[0]&&!Array.isArray(c[0])&&(n=(0,nn.mergeSessionData)(n,{pr:c[0]}));let u=(0,nn.getSessionValue)(r,"pr.jiraKey")??(0,nn.getSessionValue)(r,"pipeline.jiraKey");return"string"!=typeof(0,nn.getSessionValue)(n,"ticket.key")&&"string"==typeof u&&u.trim()&&(n=(0,nn.mergeSessionData)(n,{ticket:{key:u}})),(0,nn.mergeSessionData)(n,r)}async trigger(e){let t=await (0,tY.getPrismaClient)(),r=await t.workflow.findUnique({where:{id:e.workflowId},include:{activeVersion:{include:{triggers:!0}}}});if(!r?.activeVersion)throw Error("Published workflow not found");if(!r.enabled||r.archivedAt)throw Error("Workflow is paused");let i=e.resourceKind?.toUpperCase()??null,a=e.choice?.trim()||null,{triggers:n}=r.activeVersion,s=i?"RESOURCE_MANUAL":"MANUAL",o=i?"RESOURCE_MANUAL_CHOICE":"MANUAL_CHOICE",l=e=>n.find(t=>t.kind===e&&(!i||(0,ii.workflowResourceKind)(sr(n4(t.configJson),"Trigger configuration"))===i))??null,c=l(o),u=l(s),d=a?c:u;if(a&&!c)throw Error(i?`No resource trigger offers choices for ${i} resources`:"This workflow has no manual trigger with choices");if(!a&&!u&&c){let e=(0,ii.workflowTriggerChoices)(sr(n4(c.configJson),"Trigger configuration"));throw Error(`This workflow needs a choice: ${e.map(({key:e})=>e).join(", ")}`)}if(i&&!d)throw Error(`No resource trigger accepts ${e.resourceKind} resources`);if(a&&c&&!(0,ii.workflowTriggerChoices)(sr(n4(c.configJson),"Trigger configuration")).some(({key:e})=>e===a))throw Error(`Unknown choice ${a}`);let p=e.subjectKey?.trim()||(i&&e.resourceId?`${i}:${e.resourceId}`:`manual:${(0,g.randomUUID)()}`),h={sessionData:await this.hydrateResourceSessionData(e.resourceKind,e.resourceId,e.sessionData??{}),resourceKind:e.resourceKind??null,resourceId:e.resourceId??null,choice:a,manual:!0},m=await this.createRunForTrigger(r,r.activeVersion,d,null,a?o:s,p,h,`manual:${r.id}:${(0,g.randomUUID)()}`);return sa(m.id),this.run(m.id)}async createRunForTrigger(e,t,r,i,a,n,s,o,l=null){return(await (0,tY.getPrismaClient)()).$transaction(async c=>{let u=await c.workflowRun.findUnique({where:{idempotencyKey:o}});if(u)return u;if("COALESCE_LATEST"===e.overlapPolicy){let t=await c.workflowRun.findFirst({where:{workflowId:e.id,triggerSubjectKey:n,status:"QUEUED"},orderBy:{queuedAt:"desc"}});if(t)return c.workflowRun.update({where:{id:t.id},data:{triggerId:r?.id??null,triggerEventId:i,triggerKind:a,triggerPayloadJson:JSON.stringify(s),queuedAt:new Date}})}let d=(0,g.randomUUID)(),p=sr(s.sessionData??{},"Session data"),h=JSON.stringify((0,nn.mergeSessionData)({workflow:{id:e.id,name:t.name,runId:d,startedAt:null,trigger:{id:r?.nodeId??null,kind:a,subjectKey:n,choice:"string"==typeof s.choice?s.choice:null}},steps:{}},p));st(h,"Workflow session data",2097152);let m=await c.workflowRun.create({data:{id:d,displayNumber:await so(c),workflowId:e.id,versionId:t.id,triggerId:r?.id??null,triggerEventId:i,parentRunId:l,idempotencyKey:o,triggerKind:a,triggerSubjectKey:n,triggerPayloadJson:JSON.stringify(s),sessionDataJson:h}}),f=function(e,t){let r=e.trim().toUpperCase(),i=a8(t.sessionData);if((0,ia.isResourceTriggerKind)(r)){let e=t.resourceKind,r="string"==typeof e?e.toUpperCase():null,a="GITHUB_JOB"===r?a5(i,"job","url"):"GITHUB_PIPELINE"===r?a5(i,"pipeline","url"):null;return"string"==typeof e?a9(e.toUpperCase(),t.resourceId,{url:"string"==typeof a?a:null,metadata:"AGENT_RUN"===e.toUpperCase()?{runKind:a5(i,"run","kind")}:null}):null}if(a7.has(r))return a9("JIRA_TICKET",a5(i,"ticket","key"));if(ne.has(r))return a9("AGENT_RUN",a5(i,"run","id"),{metadata:{runKind:a5(i,"run","kind")}});if(nt.has(r))return a9("BUILD",a5(i,"build","id"));if(nr.has(r))return a9("WORKTREE",a5(i,"worktree","id"));if("CODEBASE_REMOTE_BRANCH"===r)return a9("CODEBASE",a5(i,"codebase","id"));if("AGENT_JOB_FAILED"===r)return a9("AGENT_JOB",a5(a8(i.steps),"trigger","id"));if("AGENT_CONNECTION"===r||"AGENT_DISK_REPORT"===r||"AGENT_DISK_THRESHOLD"===r||"AGENT_DISK_STATE_CHANGED"===r||"AGENT_DISK_CLEANUP_RESULT"===r||"CCUSAGE_THRESHOLD"===r)return a9("AGENT",a5(i,"agent","id")??a5(i,"codebase","agentId"));if("WORKFLOW_FINISHED"===r)return a9("WORKFLOW_RUN",a5(t,"run","id"));if(ni.has(r)){let e=function(e){if("string"!=typeof e)return null;let t=e.trim(),r=t.match(/(?:https?:\/\/|ssh:\/\/git@|git@)?github\.com[/:]([^/]+)\/([^/#]+?)(?:\.git)?$/i)??t.match(/^([^/:]+)\/([^/#]+?)(?:\.git)?$/);return r?.[1]&&r[2]?{owner:r[1],repository:r[2]}:null}(a5(i,"repo","displayOrigin")),t=Number(a5(i,"pr","number"));return e&&Number.isInteger(t)&&t>0?a9("PULL_REQUEST",a6(e.owner,e.repository,t)):null}if(na.has(r)){let e=a5(i,"pipeline","url");return a9("GITHUB_WORKFLOW_RUN",a5(i,"pipeline","runId"),{url:"string"==typeof e?e:null})}return"GITHUB_PUSH_DEFAULT"===r?a9("CODEBASE_REPOSITORY",a5(i,"repo","id")):null}(a,s);return f&&await c.workflowRunResourceLink.create({data:{id:(0,g.randomUUID)(),runId:m.id,kind:f.kind.toUpperCase(),resourceId:f.resourceId,label:f.label??null,url:f.url??null,metadataJson:f.metadata?JSON.stringify(f.metadata):null}}),m})}async processTriggerEvents(){let e=await (0,tY.getPrismaClient)();for(let t of(await e.workflowTriggerEvent.findMany({where:{status:"PENDING"},orderBy:{receivedAt:"asc"},take:50})))try{let r=sr(n4(t.payloadJson),"Trigger payload");for(let i of(await e.workflow.findMany({where:{enabled:!0,archivedAt:null,activeVersionId:{not:null}},include:{activeVersion:{include:{triggers:!0}}}})))if(i.activeVersion)for(let e of i.activeVersion.triggers.filter(({kind:e})=>e===t.kind)){if(!await this.triggerMatches(e,t.subjectKey,r)||r.workflowCorrelation&&"object"==typeof r.workflowCorrelation&&r.workflowCorrelation.workflowId===i.id)continue;let a=await this.createRunForTrigger({...i,activeVersion:i.activeVersion},i.activeVersion,e,t.id,t.kind,t.subjectKey,r,`${t.id}:${i.id}:${e.id}`);sa(a.id)}await e.workflowTriggerEvent.update({where:{id:t.id},data:{status:"PROCESSED",processedAt:new Date,error:null}})}catch(r){await e.workflowTriggerEvent.update({where:{id:t.id},data:{status:"FAILED",processedAt:new Date,error:r instanceof Error?r.message:String(r)}})}}async triggerMatches(e,t,r){let i=(0,nn.resolveWorkflowValue)(sr(n4(e.configJson),"Trigger configuration"),r),a=null;if(void 0!==r.cursorValue&&("string"!=typeof i.thresholdPath||"string"!=typeof i.thresholdOperator)){let i=await (0,tY.getPrismaClient)(),n=await i.workflowTriggerState.findUnique({where:{triggerId_subjectKey:{triggerId:e.id,subjectKey:t}}});a=se(n?.cursorJson?sr(n4(n.cursorJson),"Trigger cursor").value:void 0)!==se(r.cursorValue),await i.workflowTriggerState.upsert({where:{triggerId_subjectKey:{triggerId:e.id,subjectKey:t}},create:{id:(0,g.randomUUID)(),triggerId:e.id,subjectKey:t,cursorJson:JSON.stringify({value:r.cursorValue}),lastMatched:a,...a?{lastFiredAt:new Date}:{}},update:{cursorJson:JSON.stringify({value:r.cursorValue}),lastMatched:a,...a?{lastFiredAt:new Date}:{}}})}if("GITHUB_ISSUE_COMMAND"===e.kind){let e=(0,nn.getSessionValue)(r,"comment.author.login"),t=(0,nn.getSessionValue)(r,"comment.body"),a=Array.isArray(i.allowedLogins)?i.allowedLogins:[];if("string"!=typeof e||!a.includes(e)||"string"!=typeof t||"string"!=typeof i.commandPattern||!new RegExp(i.commandPattern).test(t))return!1}if("WORKTREE_CONFLICT"===e.kind&&!0!==(0,nn.getSessionValue)(r,"worktree.conflicted")||"WORKTREE_MISSING"===e.kind&&null==(0,nn.getSessionValue)(r,"worktree.missingAt")||"WORKTREE_DIVERGED"===e.kind&&"DIVERGED"!==(0,nn.getSessionValue)(r,"worktree.pushStatus"))return!1;if(i.filters&&"object"==typeof i.filters)for(let[e,t]of Object.entries(i.filters)){let i=(0,nn.getSessionValue)(r,e);if(Array.isArray(t)){if(!t.some(e=>se(e)===se(i)))return!1}else if(se(t)!==se(i))return!1}if("string"==typeof i.thresholdPath&&"string"==typeof i.thresholdOperator){let a={op:i.thresholdOperator,left:{source:"SESSION",path:i.thresholdPath},right:i.thresholdValue},n=(0,nn.evaluateWorkflowCondition)(a,r),s=await (0,tY.getPrismaClient)(),o=await s.workflowTriggerState.findUnique({where:{triggerId_subjectKey:{triggerId:e.id,subjectKey:t}}});return await s.workflowTriggerState.upsert({where:{triggerId_subjectKey:{triggerId:e.id,subjectKey:t}},create:{id:(0,g.randomUUID)(),triggerId:e.id,subjectKey:t,lastMatched:n,cursorJson:JSON.stringify({value:(0,nn.getSessionValue)(r,i.thresholdPath)}),...n?{lastFiredAt:new Date}:{}},update:{lastMatched:n,cursorJson:JSON.stringify({value:(0,nn.getSessionValue)(r,i.thresholdPath)}),...n&&!o?.lastMatched?{lastFiredAt:new Date}:{}}}),n&&!o?.lastMatched}return a??!0}async processSchedules(){let e=await (0,tY.getPrismaClient)(),t=await e.workflow.findMany({where:{enabled:!0,archivedAt:null,activeVersionId:{not:null}},include:{activeVersion:{include:{triggers:{where:{kind:"SCHEDULE"},include:{states:!0}}}}}}),r=new Date;for(let i of t)for(let t of i.activeVersion?.triggers??[]){let a=sr(n4(t.configJson),"Schedule configuration"),n=Number(a.cadenceSeconds);if(!Number.isInteger(n)||n<1)continue;let s=i.id,o=t.states.find(e=>e.subjectKey===s);if(!o){let i="string"==typeof a.firstRunAt?new Date(a.firstRunAt):null,l=i&&Number.isFinite(i.getTime())?i:new Date(r.getTime()+1e3*n);o=await e.workflowTriggerState.create({data:{id:(0,g.randomUUID)(),triggerId:t.id,subjectKey:s,nextScheduledAt:l}})}if(!o.nextScheduledAt||o.nextScheduledAt>r)continue;let l=o.nextScheduledAt,c=new Date(Math.max(r.getTime(),l.getTime())+1e3*n);await e.workflowTriggerState.update({where:{id:o.id},data:{lastFiredAt:r,nextScheduledAt:c}}),await this.events.record({kind:"SCHEDULE",subjectKey:s,dedupeKey:`schedule:${t.id}:${l.toISOString()}`,payload:{sessionData:{},scheduledFor:l.toISOString(),cadenceSeconds:n}})}}async lifecycle(e,t){let r=await (0,tY.getPrismaClient)(),i=await r.workflowRun.findUnique({where:{id:e}});if(!i)throw Error("Workflow run not found");if("PAUSE"===t){if(!new Set(["RUNNING","WAITING","BLOCKED"]).has(i.status))throw Error("Only an active workflow run can be paused");if(!await r.$transaction(async t=>!!(await t.workflowRun.updateMany({where:{id:e,status:{in:["RUNNING","WAITING","BLOCKED"]}},data:{status:"PAUSING",phase:"DRAINING"}})).count&&(await t.workflowStepAttempt.updateMany({where:{runId:e,status:"READY"},data:{status:"PENDING",phase:"PAUSED_PENDING"}}),!0)))return this.run(e);await this.controlLinkedAgentRuns(e,"PAUSE"),await this.appendEvent(e,null,"RUN_PAUSING","Workflow pause requested")}else if("RESUME"===t){if("PAUSED"!==i.status)throw Error("Only a paused workflow run can be resumed");if(!(await r.workflowRun.updateMany({where:{id:e,status:"PAUSED"},data:{status:"RUNNING",phase:"SCHEDULING",pausedAt:null}})).count)return this.run(e);await this.controlLinkedAgentRuns(e,"CONTINUE"),await this.appendEvent(e,null,"RUN_RESUMED","Workflow resumed")}else{if(n1.has(i.status))return this.run(e);for(let[t,i]of(await this.controlLinkedAgentRuns(e,"CANCEL"),await this.cancelWaitingCommandRuns(e),this.activeExecutions)){let a=await r.workflowStepAttempt.findUnique({where:{id:t},select:{runId:!0}});a?.runId===e&&i.abort()}if(!await r.$transaction(async t=>!!(await t.workflowRun.updateMany({where:{id:e,status:{notIn:[...n1]}},data:{status:"CANCELLED",phase:"CANCELLED",finishedAt:new Date}})).count&&(await t.workflowStepAttempt.updateMany({where:{runId:e,status:{notIn:[...n2]}},data:{status:"CANCELLED",phase:"CANCELLED",finishedAt:new Date,claimOwner:null,claimExpiresAt:null}}),await t.workflowWait.updateMany({where:{runId:e,status:"PENDING"},data:{status:"CANCELLED",resolvedAt:new Date}}),await t.workflowResourceLease.deleteMany({where:{runId:e}}),!0)))return this.run(e);await this.appendEvent(e,null,"RUN_CANCELLED","Workflow cancelled")}return sa(e),this.run(e)}async repairRunData(e,t){let r=sr(t,"Session data patch"),i=await (0,tY.getPrismaClient)(),a=await i.workflowRun.findUnique({where:{id:e}});if(!a)throw Error("Workflow run not found");if(!new Set(["BLOCKED","PAUSED"]).has(a.status))throw Error("Only blocked or paused workflows accept repair data");let n=(0,nn.workflowSessionData)(a.sessionDataJson),s=(0,nn.getSessionValue)(n,"workflow"),o=(0,nn.mergeSessionData)(n,r);s&&"object"==typeof s&&(o=(0,nn.setSessionValue)(o,"workflow",s));let l=JSON.stringify(o);return st(l,"Workflow session data",2097152),await i.$transaction([i.workflowRun.update({where:{id:e},data:{sessionDataJson:l,sessionRevision:{increment:1},status:"PAUSED"===a.status?"PAUSED":"RUNNING",phase:"PAUSED"===a.status?"PAUSED":"SCHEDULING",blockedReason:null}}),i.workflowStepAttempt.updateMany({where:{runId:e,status:"BLOCKED"},data:{status:"PENDING",phase:"PENDING",error:null}})]),await this.appendEvent(e,null,"RUN_DATA_REPAIRED","Workflow session data repaired"),sa(e),this.run(e)}async answerQuestion(e,t){let r=await (0,tY.getPrismaClient)(),i=await r.$transaction(async r=>{let i=await r.runQuestionBatch.findUnique({where:{id:e},include:{workflowStepAttempt:!0,answerRevisions:!0}}),a=i?.workflowStepAttempt;if(!i||!a)throw Error("Workflow question not found");if("PENDING"!==i.status)throw Error("Question was already answered");return await r.runAnswerRevision.create({data:{id:(0,g.randomUUID)(),batchId:e,revision:i.answerRevisions.length,answersJson:JSON.stringify(t)}}),await r.runQuestionBatch.update({where:{id:e},data:{status:"ANSWERED",answeredAt:new Date}}),await r.workflowWait.updateMany({where:{attemptId:a.id,status:"PENDING",kind:"HUMAN"},data:{status:"RESOLVED",resultJson:JSON.stringify({answers:t}),resolvedAt:new Date}}),a});return await this.completeWaitingAttempt(i.id,{answers:t}),rQ.agentEventBus.publish(nX(i.runId),{workflowQuestionChanged:{id:e,runId:i.runId}}),this.run(i.runId)}async tick(){if(!this.ticking){this.ticking=!0;try{await this.recoverExpiredClaims(),await this.processSchedules(),await this.processTriggerEvents(),await this.resolveDueWaits(),await this.startQueuedRuns();let e=await (0,tY.getPrismaClient)();for(let{id:t}of(await e.workflowRun.findMany({where:{status:{in:["RUNNING","WAITING","PAUSING"]}},select:{id:!0},orderBy:{updatedAt:"asc"},take:100})))await this.progressRun(t);await this.dispatchReadyAttempts()}finally{this.ticking=!1}}}async recoverExpiredClaims(){let e=await (0,tY.getPrismaClient)();for(let t of(await e.workflowStepAttempt.findMany({where:{status:"RUNNING",claimExpiresAt:{lt:new Date}},include:{run:!0},take:100})))await e.$transaction([e.workflowStepAttempt.update({where:{id:t.id},data:{status:"BLOCKED",phase:"RECOVERY_BLOCKED",error:"The workflow worker stopped while this step was running; verify external state before retrying.",claimOwner:null,claimExpiresAt:null}}),e.workflowRun.update({where:{id:t.runId},data:{status:"BLOCKED",phase:"RECOVERY_BLOCKED",blockedReason:`Step ${t.nodeId} needs recovery review`}}),e.workflowResourceLease.deleteMany({where:{attemptId:t.id}})]),await this.appendEvent(t.runId,t.id,"STEP_RECOVERY_BLOCKED","Step needs recovery review after its worker lease expired"),await this.notifyRun(t.runId,"WORKFLOW_RECOVERY_PAUSED","Workflow paused during recovery","An interrupted step requires external-state verification before replay.",`recovery:${t.id}`),sa(t.runId)}async startQueuedRuns(){let e=await (0,tY.getPrismaClient)();for(let t of(await e.workflowRun.findMany({where:{status:"QUEUED"},include:{workflow:!0,version:!0},orderBy:{queuedAt:"asc"},take:50}))){let r="CONCURRENT"===t.workflow.overlapPolicy?t.workflow.maxConcurrentRuns:1;if(await e.workflowRun.count({where:{workflowId:t.workflowId,id:{not:t.id},status:{in:n0.filter(e=>"QUEUED"!==e)}}})>=r)continue;let i=(0,ii.parseWorkflowDefinition)(n4(t.version.definitionJson)),a=new Date,n=(0,nn.setSessionValue)((0,nn.workflowSessionData)(t.sessionDataJson),"workflow.startedAt",a.toISOString());await e.$transaction(async e=>!!(await e.workflowRun.updateMany({where:{id:t.id,status:"QUEUED"},data:{status:"RUNNING",phase:"SCHEDULING",startedAt:a,sessionDataJson:JSON.stringify(n),sessionRevision:{increment:1}}})).count&&(await e.workflowStepAttempt.createMany({data:i.nodes.map(e=>({id:(0,g.randomUUID)(),runId:t.id,nodeId:e.id,kind:e.kind,generation:t.generation,iterationKey:"",attempt:0,requiredPathsJson:JSON.stringify(sn(e)),providedPathsJson:JSON.stringify(ss(e)),idempotencyKey:`${t.id}:${e.id}:${t.generation}::0`}))}),!0))&&(await this.appendEvent(t.id,null,"RUN_STARTED","Workflow started"),sa(t.id))}}selectedTrigger(e,t){let r=e.trigger?.nodeId??t.triggers.find(({kind:t})=>t===e.triggerKind)?.id??null;if(!(0,ia.isChoiceTriggerKind)(e.triggerKind))return{id:r,choice:null};let i=sr(n4(e.triggerPayloadJson),"Trigger payload");return{id:r,choice:"string"==typeof i.choice?i.choice:null}}attemptOutput(e){if(!e.outputJson)return{};let t=n4(e.outputJson);return t&&"object"==typeof t&&!Array.isArray(t)?t:{value:t}}edgeState(e,t,r,i){if(!i.has(e.source))return e.source!==t.id||t.choice&&e.sourceHandle!==t.choice?"INACTIVE":"ACTIVE";let a=r.get(e.source);if(!a||!n2.has(a.status))return"PENDING";if(new Set(["SKIPPED","CANCELLED","SUPERSEDED"]).has(a.status))return"INACTIVE";let n=i.get(e.source);if("FAILED"===a.status)return"failure"===e.sourceHandle||"catch"===e.sourceHandle||"CONTINUE"===n.failurePolicy&&"success"===e.sourceHandle?"ACTIVE":"INACTIVE";let s=this.attemptOutput(a).selectedHandles;return s?.length?s.includes(e.sourceHandle)?"ACTIVE":"INACTIVE":"success"===e.sourceHandle||"output"===e.sourceHandle?"ACTIVE":"INACTIVE"}async progressRun(e){let t=await (0,tY.getPrismaClient)(),r=await t.workflowRun.findUnique({where:{id:e},include:{version:!0,trigger:!0,attempts:!0,waits:!0}});if(!r||n1.has(r.status))return;if("PAUSING"===r.status){await t.workflowStepAttempt.updateMany({where:{runId:e,status:"READY"},data:{status:"PENDING",phase:"PAUSED_PENDING"}});let i=new Set(["AGENT_JOB","BUILD","SKILL_RUN","WORKTREE_MOVE","GITHUB_CHECKS"]),a=new Set(r.waits.filter(({status:e,kind:t})=>"PENDING"===e&&i.has(t)).map(({attemptId:e})=>e));!r.attempts.some(({id:e,status:t})=>"RUNNING"===t||"WAITING"===t&&a.has(e))&&(await t.workflowRun.updateMany({where:{id:e,status:"PAUSING"},data:{status:"PAUSED",phase:"PAUSED",pausedAt:new Date}})).count&&(await this.appendEvent(e,null,"RUN_PAUSED","Workflow paused"),sa(e));return}if(!new Set(["RUNNING","WAITING"]).has(r.status))return;let i=(0,ii.parseWorkflowDefinition)(n4(r.version.definitionJson)),a=new Map(i.nodes.map(e=>[e.id,e])),n=new Map;for(let e of i.edges)n.set(e.target,[...n.get(e.target)??[],e]);let s=!0;for(;s;){if(s=!1,!(r=await t.workflowRun.findUnique({where:{id:e},include:{version:!0,trigger:!0,attempts:!0,waits:!0}})))return;let o=r.attempts.filter(({generation:e,supersededAt:t})=>e===r.generation&&!t),l=new Map;for(let e of o){let t=`${e.nodeId}:${e.iterationKey}`,r=l.get(t);(!r||r.attempt<e.attempt)&&l.set(t,e)}let c=new Map([...l.values()].filter(({iterationKey:e})=>!e).map(e=>[e.nodeId,e])),u=this.selectedTrigger(r,i);for(let e of i.nodes){let r=c.get(e.id);if(!r||"PENDING"!==r.status)continue;let o=i.nodes.find(t=>"CONTROL_FOR_EACH"===t.kind&&t.config.joinNodeId===e.id);if(o){let e=c.get(o.id);if(!e||!n2.has(e.status)||[...l.values()].filter(({iterationKey:e})=>!!e).some(({status:e})=>!n2.has(e)))continue;await t.workflowStepAttempt.update({where:{id:r.id},data:{status:"READY",phase:"ITERATIONS_JOINED"}}),s=!0;continue}let d=n.get(e.id)??[];if(!d.length)continue;let p=d.map(e=>this.edgeState(e,u,c,a)),h=p.filter(e=>"ACTIVE"===e).length,m=p.filter(e=>"PENDING"===e).length;("ANY"==("CONTROL_JOIN"===e.kind&&"ANY"===e.config.mode?"ANY":"ALL")?h>0:0===m&&h>0)?(await t.workflowStepAttempt.update({where:{id:r.id},data:{status:"READY",phase:"READY"}}),s=!0):0===m&&0===h&&(await t.workflowStepAttempt.update({where:{id:r.id},data:{status:"SKIPPED",phase:"INACTIVE_BRANCH",finishedAt:new Date}}),s=!0)}await this.progressIterationAttempts(i,r,u,a,n,l,c)&&(s=!0)}if(!(r=await t.workflowRun.findUnique({where:{id:e},include:{version:!0,trigger:!0,attempts:!0,waits:!0}})))return;let o=new Map;for(let e of r.attempts.filter(({generation:e,supersededAt:t})=>e===r.generation&&!t)){let t=`${e.nodeId}:${e.iterationKey}`,r=o.get(t);(!r||r.attempt<e.attempt)&&o.set(t,e)}let l=[...o.values()],c=r.waits.some(({status:e})=>"PENDING"===e),u=l.some(({status:e})=>!n2.has(e));if(c||u){let i=c?"WAITING":"RUNNING";r.status!==i&&(await t.workflowRun.updateMany({where:{id:e,status:{in:[...n3]}},data:{status:i,phase:c?"WAITING":"SCHEDULING"}})).count&&sa(e);return}let d=(0,ii.parseWorkflowDefinition)(n4(r.version.definitionJson)),p=l.find(e=>{if("FAILED"!==e.status)return!1;let t=d.nodes.find(({id:t})=>t===e.nodeId);return!!t&&"CONTINUE"!==t.failurePolicy&&!d.edges.some(e=>e.source===t.id&&new Set(["failure","catch"]).has(e.sourceHandle))});await this.finishRun(r,p?"FAILED":"SUCCEEDED",p?.error??null)}async finishRun(e,t,r){let i=await (0,tY.getPrismaClient)();await i.$transaction(async i=>!!(await i.workflowRun.updateMany({where:{id:e.id,status:{in:[...n3]}},data:{status:t,phase:t,error:r,finishedAt:new Date}})).count&&(await i.workflowResourceLease.deleteMany({where:{runId:e.id}}),!0))&&(await this.appendEvent(e.id,null,`RUN_${t}`,"SUCCEEDED"===t?"Workflow completed":"Workflow failed",r?{error:r}:null),await this.resolveExternalWait("WORKFLOW_RUN",e.id,{status:t,runId:e.id},"FAILED"===t?r||"Sub-workflow failed":null),await this.events.record({kind:"WORKFLOW_FINISHED",subjectKey:e.workflowId,dedupeKey:`workflow-finished:${e.id}`,payload:{sessionData:(0,nn.workflowSessionData)(e.sessionDataJson),run:{id:e.id,status:t},workflowCorrelation:{workflowId:e.workflowId,runId:e.id}}}),await this.notifyRun(e.id,"SUCCEEDED"===t?"WORKFLOW_COMPLETED":"WORKFLOW_FAILED","SUCCEEDED"===t?"Workflow completed":"Workflow failed",r||`Workflow run ${e.displayNumber} ${t.toLowerCase()}`,t.toLowerCase()),sa(e.id))}async dispatchReadyAttempts(){let e=await (0,tY.getPrismaClient)(),t=Math.max(0,4-await e.workflowStepAttempt.count({where:{status:"RUNNING"}}));if(t)for(let r of(await e.workflowStepAttempt.findMany({where:{status:"READY",run:{status:"RUNNING"}},orderBy:{createdAt:"asc"},take:2*t}))){if(t<=0)break;if(!(await e.workflowStepAttempt.updateMany({where:{id:r.id,status:"READY",run:{status:"RUNNING"}},data:{status:"RUNNING",phase:"RUNNING",claimOwner:this.workerId,claimExpiresAt:new Date(Date.now()+3e5),startedAt:r.startedAt??new Date}})).count)continue;t-=1;let i=new AbortController;this.activeExecutions.set(r.id,i),this.executeAttempt(r.id,i.signal).catch(e=>{console.error(`Workflow attempt ${r.id} failed unexpectedly:`,e)}).finally(()=>{this.activeExecutions.delete(r.id)})}}async acquireResourceLease(e,t,r){let i=ii.WORKFLOW_STEP_BY_KIND.get(t.kind),a=null;if(i.mutatesWorktree){let e=(0,nn.getSessionValue)(r,"worktree.id")??(0,nn.getSessionValue)(r,"worktree.path")??(0,nn.getSessionValue)(r,"codebase.id");e&&(a=`git:${String(e)}`)}else if(t.kind.startsWith("BUILD_")){let e=(0,nn.getSessionValue)(r,"build.id");e&&(a=`build:${String(e)}`)}if(!a)return!0;let n=await (0,tY.getPrismaClient)();await n.workflowResourceLease.deleteMany({where:{key:a,expiresAt:{lt:new Date}}});try{return await n.workflowResourceLease.create({data:{key:a,runId:e.runId,attemptId:e.id,expiresAt:new Date(Date.now()+3e5)}}),await n.workflowStepAttempt.update({where:{id:e.id},data:{resourceLockKey:a}}),!0}catch{return await n.workflowStepAttempt.update({where:{id:e.id},data:{status:"READY",phase:"WAITING_FOR_RESOURCE",claimOwner:null,claimExpiresAt:null}}),!1}}async executeAttempt(e,t){let r=await (0,tY.getPrismaClient)(),i=await r.workflowStepAttempt.findUnique({where:{id:e},include:{run:{include:{version:!0}}}});if(!i||"RUNNING"!==i.status)return;let a=(0,ii.parseWorkflowDefinition)(n4(i.run.version.definitionJson)),n=a.nodes.find(({id:e})=>e===i.nodeId);if(!n)return void await this.failAttempt(i,null,Error("Workflow step definition is missing"));let s=(0,nn.workflowSessionData)(i.run.sessionDataJson);i.iterationKey&&(s=await this.iterationSessionData(i.run,i,s));let o=sn(n).filter(e=>!(0,nn.hasSessionValue)(s,e));if(o.length){await r.$transaction([r.workflowStepAttempt.update({where:{id:i.id},data:{status:"BLOCKED",phase:"MISSING_REQUIREMENTS",error:`Missing required session data: ${o.join(", ")}`,claimOwner:null,claimExpiresAt:null}}),r.workflowRun.update({where:{id:i.runId},data:{status:"BLOCKED",phase:"MISSING_REQUIREMENTS",blockedReason:`Step ${n.name??n.id} needs ${o.join(", ")}`}}),r.workflowResourceLease.deleteMany({where:{attemptId:e}})]),await this.appendEvent(i.runId,i.id,"STEP_BLOCKED",`Step blocked by missing requirements: ${o.join(", ")}`),await this.notifyRun(i.runId,"WORKFLOW_NEEDS_ATTENTION","Workflow needs data",`Step ${n.name??n.id} needs ${o.join(", ")}`,`blocked:${i.id}`),sa(i.runId);return}if(await r.workflowStepAttempt.update({where:{id:i.id},data:{inputJson:JSON.stringify(s)}}),await this.acquireResourceLease(i,n,s))try{let e,r={...n,config:(0,nn.resolveWorkflowValue)(n.config,s)};if(e=n.kind.startsWith("CONTROL_")||"HUMAN_CONFIRM"===n.kind||"HUMAN_CHOICE"===n.kind?await this.executeControl(i.run,i,r,s,a):await this.executor.execute({run:i.run,attempt:i,node:r,sessionData:s,signal:t}),t.aborted)throw Error("Workflow step was cancelled");e.wait?await this.parkAttempt(i,e):await this.completeAttempt(i,n,e)}catch(t){let e=t instanceof Error?t:Error(String(t));if(await this.holdForBusyCodebase(i,e))return;await this.failAttempt(i,n,e)}}async holdForBusyCodebase(e,t){if(!(0,nV.isCodebaseBusyError)(t))return!1;let r=e.startedAt??e.createdAt;if(Date.now()-r.getTime()>6e5)return!1;let i=await (0,tY.getPrismaClient)();return!!(await i.workflowStepAttempt.updateMany({where:{id:e.id,status:"RUNNING",claimOwner:this.workerId},data:{status:"READY",phase:"WAITING_FOR_RESOURCE",error:t.message,claimOwner:null,claimExpiresAt:null}})).count&&(await i.workflowResourceLease.deleteMany({where:{attemptId:e.id}}),await i.workflowRunEvent.findFirst({where:{attemptId:e.id,type:"STEP_WAITING_FOR_RESOURCE"},select:{id:!0}})||await this.appendEvent(e.runId,e.id,"STEP_WAITING_FOR_RESOURCE","Step is waiting for the codebase to become available",{error:t.message}),sa(e.runId),!0)}async iterationSessionData(e,t,r){let i=await (0,tY.getPrismaClient)(),a=await i.workflowStepAttempt.findMany({where:{runId:e.id,generation:t.generation,iterationKey:t.iterationKey,status:"SUCCEEDED"},orderBy:{finishedAt:"asc"}}),n=r;for(let e of(t.inputJson&&(n=(0,nn.mergeSessionData)(n,sr(n4(t.inputJson),"Iteration input"))),a)){let t=this.attemptOutput(e);t.sessionPatch&&(n=(0,nn.mergeSessionData)(n,t.sessionPatch))}return n}async executeControl(e,t,r,i,a){switch(r.kind){case"CONTROL_IF":{let e=r.config.condition;if(!e)throw Error("If steps require a condition");let t=(0,nn.evaluateWorkflowCondition)(e,i);return{output:{matched:t},selectedHandles:[t?"true":"false"]}}case"CONTROL_JOIN":{let i=a.nodes.find(e=>"CONTROL_FOR_EACH"===e.kind&&e.config.joinNodeId===r.id);if(i){let r=await (0,tY.getPrismaClient)(),a=await r.workflowStepAttempt.findMany({where:{runId:e.id,generation:t.generation,iterationKey:{not:""},status:"FAILED"}});if(a.length&&"COLLECT_ERRORS"!==i.config.errorMode)throw Error(`${a.length} for-each iteration step(s) failed`);return{output:{iterations:await r.workflowStepAttempt.count({where:{runId:e.id,generation:t.generation,iterationKey:{not:""}}}),failures:a.map(({nodeId:e,iterationKey:t,error:r})=>({nodeId:e,iterationKey:t,error:r}))}}}return{output:{joined:!0}}}case"CONTROL_TRY":return{output:{started:!0}};case"CONTROL_DELAY":{let e=Number(r.config.seconds??0);if(!Number.isFinite(e)||e<0||e>31536e3)throw Error("Delay must be between zero and 31,536,000 seconds");return{wait:{kind:"DELAY",resumeAfter:new Date(Date.now()+1e3*e)}}}case"CONTROL_WAIT_UNTIL":{let e=r.config.condition;if(!e)throw Error("Wait-until steps require a condition");if((0,nn.evaluateWorkflowCondition)(e,i))return{output:{matched:!0}};let t=nl(r.config,15);return{wait:{kind:"PREDICATE",predicate:{condition:e,cadenceSeconds:t},resumeAfter:new Date(Date.now()+1e3*t),timeoutAt:no(r.config)}}}case"CONTROL_SET_VARIABLE":{if("string"!=typeof r.config.path)throw Error("Set-variable steps require an output path");let e="string"==typeof r.config.script?await nJ(r.config.script,i):r.config.value;return{output:e,sessionPatch:(0,nn.setSessionValue)({},r.config.path,e)}}case"CONTROL_FOR_EACH":{let n=Array.isArray(r.config.items)?r.config.items:"string"==typeof r.config.listPath?(0,nn.getSessionValue)(i,r.config.listPath):null;if(!Array.isArray(n))throw Error("For-each source must be an array");if(n.length>1e3)throw Error("For-each is limited to 1,000 items");return await this.spawnForEach(e,t,r,a,n),{output:{itemCount:n.length},selectedHandles:n.length?["body"]:["empty"],sessionPatch:(0,nn.setSessionValue)({},`steps.${r.id}.items`,n)}}case"CONTROL_SUBWORKFLOW":return this.startSubworkflow(e,t,r,i);case"HUMAN_CONFIRM":case"HUMAN_CHOICE":return this.createHumanQuestion(e,t,r);default:throw Error(`Unsupported control step ${r.kind}`)}}async progressIterationAttempts(e,t,r,i,a,n,s){let o=await (0,tY.getPrismaClient)(),l=!1;for(let e of new Set([...n.values()].map(({iterationKey:e})=>e).filter(Boolean))){let t=new Map(s);for(let r of n.values())r.iterationKey===e&&t.set(r.nodeId,r);for(let n of t.values()){if(n.iterationKey!==e||"PENDING"!==n.status)continue;let s=i.get(n.nodeId);if(!s)continue;let c=(a.get(s.id)??[]).map(e=>this.edgeState(e,r,t,i)),u=c.filter(e=>"ACTIVE"===e).length,d=c.filter(e=>"PENDING"===e).length;("ANY"==("CONTROL_JOIN"===s.kind&&"ANY"===s.config.mode?"ANY":"ALL")?u>0:0===d&&u>0)?(await o.workflowStepAttempt.update({where:{id:n.id},data:{status:"READY",phase:"ITERATION_READY"}}),l=!0):0===d&&0===u&&(await o.workflowStepAttempt.update({where:{id:n.id},data:{status:"SKIPPED",phase:"INACTIVE_ITERATION_BRANCH",finishedAt:new Date}}),l=!0)}}return l}async spawnForEach(e,t,r,i,a){let n="string"==typeof r.config.joinNodeId?r.config.joinNodeId:null,s=i.nodes.find(({id:e})=>e===n);if(!s||"CONTROL_JOIN"!==s.kind)throw Error("For-each steps require an explicit joinNodeId");let o=new Map;for(let e of i.edges)o.set(e.source,[...o.get(e.source)??[],e]);let l=(o.get(r.id)??[]).filter(({sourceHandle:e})=>"body"===e).map(({target:e})=>e),c=new Set;for(;l.length;){let e=l.shift();e===n||c.has(e)||(c.add(e),l.push(...(o.get(e)??[]).map(({target:e})=>e)))}if(a.length&&!c.size)throw Error("For-each body is not connected to its body handle");let u=i.nodes.filter(({id:e})=>c.has(e)),d=await (0,tY.getPrismaClient)();await d.$transaction(async i=>{await i.workflowStepAttempt.updateMany({where:{runId:e.id,generation:t.generation,iterationKey:t.iterationKey,nodeId:{in:[...c]},status:"PENDING"},data:{status:"SKIPPED",phase:"ITERATION_TEMPLATE",finishedAt:new Date}}),a.length&&u.length&&await i.workflowStepAttempt.createMany({data:a.flatMap((i,a)=>{let n=t.iterationKey?`${t.iterationKey}.${a}`:String(a),s=JSON.stringify({loop:{current:{forEachNodeId:r.id,index:a,item:i},[r.id]:{index:a,item:i}}});return u.map(r=>({id:(0,g.randomUUID)(),runId:e.id,nodeId:r.id,kind:r.kind,generation:t.generation,iterationKey:n,attempt:0,status:"PENDING",phase:"ITERATION_PENDING",inputJson:s,requiredPathsJson:JSON.stringify(sn(r)),providedPathsJson:JSON.stringify(ss(r)),idempotencyKey:`${e.id}:${r.id}:${t.generation}:${n}:0`}))})})})}async startSubworkflow(e,t,r,i){let a="string"==typeof r.config.versionId?r.config.versionId:null;if(!a)throw Error("Sub-workflow version is required");let n=await (0,tY.getPrismaClient)(),s=await n.workflowVersion.findUnique({where:{id:a},include:{workflow:{include:{activeVersion:!0}}}});if(!s)throw Error("Sub-workflow version not found");if(!s.workflow.enabled||s.workflow.archivedAt)throw Error("Sub-workflow is paused");let o=e,l=0;for(;o;){if(o.workflowId===s.workflowId)throw Error("Recursive sub-workflow invocation is not allowed");if((l+=1)>=10)throw Error("Sub-workflow depth is limited to 10");o=o.parentRunId?await n.workflowRun.findUnique({where:{id:o.parentRunId}}):null}let c={};if(r.config.inputMapping&&"object"==typeof r.config.inputMapping)for(let[e,t]of Object.entries(r.config.inputMapping))c=(0,nn.setSessionValue)(c,e,(0,nn.resolveWorkflowValue)(t,i));let u=await this.createRunForTrigger({...s.workflow,activeVersion:s},s,null,null,"SUBWORKFLOW",e.id,{sessionData:c,parentRunId:e.id},`${t.id}:subworkflow:${s.id}`,e.id);return sa(u.id),{output:{childRunId:u.id},links:[{kind:"WORKFLOW_RUN",resourceId:u.id,label:`Workflow run #${u.displayNumber}`,url:`/workflows/runs/${u.id}`}],wait:{kind:"WORKFLOW_RUN",externalKey:u.id,resumeAfter:nc(r.config),timeoutAt:no(r.config)}}}async createHumanQuestion(e,t,r){let i=Array.isArray(r.config.questions)?r.config.questions:[{header:r.name??null,prompt:"string"==typeof r.config.prompt?r.config.prompt:"HUMAN_CONFIRM"===r.kind?"Continue this workflow?":"Choose an option",multiSelect:!!r.config.multiSelect,allowCustom:"HUMAN_CONFIRM"!==r.kind&&!1!==r.config.allowCustom,options:"HUMAN_CONFIRM"===r.kind?[{label:"Confirm",description:null},{label:"Cancel",description:null}]:Array.isArray(r.config.options)?r.config.options:[]}];if(!i.length||i.length>10)throw Error("Workflow questions must contain between one and ten questions");let a=await (0,tY.getPrismaClient)(),n=(0,g.randomUUID)();return await a.runQuestionBatch.create({data:{id:n,workflowStepAttemptId:t.id,nativeRequestId:`workflow:${t.id}`,questions:{create:i.map((e,t)=>{let r=sr(e,"Workflow question"),i=Array.isArray(r.options)?r.options:[];return{id:(0,g.randomUUID)(),position:t,header:"string"==typeof r.header?r.header:null,prompt:n5(String(r.prompt??""),"Question prompt",1e4),multiSelect:!!r.multiSelect,allowCustom:!1!==r.allowCustom,options:{create:i.map((e,t)=>{let r=sr(e,"Question option");return{id:(0,g.randomUUID)(),position:t,label:n5(String(r.label??""),"Option label",500),description:"string"==typeof r.description?r.description.slice(0,2e3):null}})}}})}}}),rQ.agentEventBus.publish(nX(e.id),{workflowQuestionChanged:{id:n,runId:e.id}}),{output:{questionBatchId:n},wait:{kind:"HUMAN",externalKey:n,timeoutAt:no(r.config)}}}async parkAttempt(e,t){let r=t.wait;if(!r)throw Error("Workflow wait is missing");let i=await (0,tY.getPrismaClient)(),a=(0,g.randomUUID)();await i.$transaction(async i=>{let n=await i.workflowRun.findUnique({where:{id:e.runId},select:{status:!0}});return!(!n||n1.has(n.status))&&!!(await i.workflowStepAttempt.updateMany({where:{id:e.id,status:"RUNNING"},data:{status:"WAITING",phase:r.kind,outputJson:JSON.stringify({value:t.output,selectedHandles:t.selectedHandles,sessionPatch:t.sessionPatch}),claimOwner:null,claimExpiresAt:null}})).count&&(await i.workflowWait.create({data:{id:a,runId:e.runId,attemptId:e.id,kind:r.kind,predicateJson:r.predicate?JSON.stringify(r.predicate):null,externalKey:r.externalKey??null,resumeAfter:r.resumeAfter??null,timeoutAt:r.timeoutAt??null}}),t.links?.length&&await i.workflowRunResourceLink.createMany({data:t.links.map(t=>({id:(0,g.randomUUID)(),runId:e.runId,attemptId:e.id,kind:t.kind.toUpperCase(),resourceId:t.resourceId,label:t.label??null,url:t.url??null,metadataJson:t.metadata?JSON.stringify(t.metadata):null}))}),await i.workflowRun.updateMany({where:{id:e.runId,status:{in:[...n3]}},data:{status:"WAITING",phase:r.kind}}),await i.workflowResourceLease.deleteMany({where:{attemptId:e.id}}),!0)})&&(await this.appendEvent(e.runId,e.id,"STEP_WAITING",`Step is waiting for ${r.kind.toLowerCase().replaceAll("_"," ")}`,{waitId:a}),sa(e.runId))}async completeAttempt(e,t,r){let i=await (0,tY.getPrismaClient)();await i.$transaction(async i=>{let a=await i.workflowRun.findUnique({where:{id:e.runId}});if(!a)throw Error("Workflow run disappeared");if(n1.has(a.status))return!1;let n=(0,nn.workflowSessionData)(a.sessionDataJson);e.iterationKey?n=(0,nn.setSessionValue)(n,`steps.${t.id}.iterations.${e.iterationKey.replaceAll(".","_")}`,{status:"SUCCEEDED",output:r.output??null,data:r.sessionPatch??null}):(r.sessionPatch&&(n=(0,nn.mergeSessionData)(n,r.sessionPatch)),n=(0,nn.setSessionValue)(n,`steps.${t.id}`,{status:"SUCCEEDED",output:r.output??null,snapshotId:r.links?.find(({kind:e})=>"CHECKPOINT"===e)?.resourceId??null}));let s=JSON.stringify(n);return st(s,"Workflow session data",2097152),!!(await i.workflowStepAttempt.updateMany({where:{id:e.id,status:{in:["RUNNING","WAITING"]}},data:{status:"SUCCEEDED",phase:"SUCCEEDED",outputJson:JSON.stringify({value:r.output,selectedHandles:r.selectedHandles,sessionPatch:r.sessionPatch}),error:null,finishedAt:new Date,claimOwner:null,claimExpiresAt:null}})).count&&(r.links?.length&&await i.workflowRunResourceLink.createMany({data:r.links.map(t=>({id:(0,g.randomUUID)(),runId:e.runId,attemptId:e.id,kind:t.kind.toUpperCase(),resourceId:t.resourceId,label:t.label??null,url:t.url??null,metadataJson:t.metadata?JSON.stringify(t.metadata):null}))}),await i.workflowRun.update({where:{id:e.runId},data:{sessionDataJson:s,sessionRevision:{increment:1}}}),await i.workflowRun.updateMany({where:{id:e.runId,status:{in:[...n3]}},data:{status:"RUNNING",phase:"SCHEDULING"}}),await i.workflowResourceLease.deleteMany({where:{attemptId:e.id}}),!0)})&&(await this.appendEvent(e.runId,e.id,"STEP_SUCCEEDED",`Step ${t.name??t.id} completed`),sa(e.runId))}async failAttempt(e,t,r){let i=await (0,tY.getPrismaClient)(),a=t??(await i.workflowRun.findUnique({where:{id:e.runId},include:{version:!0}}))?.version.definitionJson,n="string"==typeof a?(0,ii.parseWorkflowDefinition)(n4(a)).nodes.find(({id:t})=>t===e.nodeId)??null:a,s=n?.retry,o=!!(s&&e.attempt+1<s.maxAttempts),l=s?Math.min(86400,"EXPONENTIAL"===s.strategy?s.delaySeconds*2**e.attempt:s.delaySeconds):0;await i.$transaction(async t=>{let i=await t.workflowRun.findUnique({where:{id:e.runId}});if(!i||n1.has(i.status))return!1;let a=(0,nn.workflowSessionData)(i.sessionDataJson);return e.iterationKey||(a=(0,nn.setSessionValue)(a,`steps.${e.nodeId}`,{status:"FAILED",error:r.message})),!!(await t.workflowStepAttempt.updateMany({where:{id:e.id,status:{in:["RUNNING","WAITING"]}},data:{status:"FAILED",phase:o?"RETRY_SCHEDULED":"FAILED",error:r.message.slice(0,2e4),finishedAt:new Date,claimOwner:null,claimExpiresAt:null}})).count&&(o&&await t.workflowWait.create({data:{id:(0,g.randomUUID)(),runId:e.runId,attemptId:e.id,kind:"RETRY",resumeAfter:new Date(Date.now()+1e3*l)}}),await t.workflowRun.update({where:{id:e.runId},data:{sessionDataJson:JSON.stringify(a),sessionRevision:{increment:1}}}),await t.workflowRun.updateMany({where:{id:e.runId,status:{in:[...n3]}},data:{status:o?"WAITING":"RUNNING",phase:o?"RETRY_WAIT":"SCHEDULING"}}),await t.workflowResourceLease.deleteMany({where:{attemptId:e.id}}),!0)})&&(await this.appendEvent(e.runId,e.id,o?"STEP_RETRY_SCHEDULED":"STEP_FAILED",o?`Step failed and will retry in ${l} seconds`:`Step failed: ${r.message}`,{error:r.message,retry:o}),sa(e.runId))}async resolveDueWaits(){let e=await (0,tY.getPrismaClient)(),t=new Date,r=(t,r)=>e.workflowWait.updateMany({where:{id:t,status:"PENDING",run:{status:{in:[...n3]}}},data:r});for(let i of(await e.workflowWait.findMany({where:{status:"PENDING",run:{status:{in:[...n3]}},OR:[{resumeAfter:{lte:t}},{timeoutAt:{lte:t}}]},include:{attempt:{include:{run:{include:{version:!0}}}}},orderBy:{createdAt:"asc"},take:100}))){if(i.timeoutAt&&i.timeoutAt<=t&&"RETRY"!==i.kind&&"DELAY"!==i.kind){if(!(await r(i.id,{status:"TIMED_OUT",resolvedAt:t})).count)continue;await this.failAttempt(i.attempt,(0,ii.parseWorkflowDefinition)(n4(i.attempt.run.version.definitionJson)).nodes.find(({id:e})=>e===i.attempt.nodeId)??null,Error("Workflow wait timed out"));continue}if("RETRY"===i.kind){let r=i.attempt.attempt+1;await e.$transaction(async e=>{if(!(await e.workflowWait.updateMany({where:{id:i.id,status:"PENDING",run:{status:{in:[...n3]}}},data:{status:"RESOLVED",resolvedAt:t}})).count)return!1;if(await e.workflowStepAttempt.create({data:{id:(0,g.randomUUID)(),runId:i.runId,nodeId:i.attempt.nodeId,kind:i.attempt.kind,generation:i.attempt.generation,iterationKey:i.attempt.iterationKey,attempt:r,status:"PENDING",phase:"RETRY_PENDING",inputJson:i.attempt.inputJson,requiredPathsJson:i.attempt.requiredPathsJson,providedPathsJson:i.attempt.providedPathsJson,idempotencyKey:`${i.runId}:${i.attempt.nodeId}:${i.attempt.generation}:${i.attempt.iterationKey}:${r}`,replayedFromId:i.attempt.id}}),!(await e.workflowRun.updateMany({where:{id:i.runId,status:{in:[...n3]}},data:{status:"RUNNING",phase:"SCHEDULING"}})).count)throw Error("Workflow lifecycle changed while resuming retry");return!0})&&sa(i.runId)}else if("DELAY"===i.kind){if(!(await r(i.id,{status:"RESOLVED",resolvedAt:t})).count)continue;await this.completeWaitingAttempt(i.attemptId,{delayed:!0})}else if("PREDICATE"===i.kind){let e=i.predicateJson?sr(n4(i.predicateJson),"Wait predicate"):{},a=e.condition,n=(0,nn.workflowSessionData)(i.attempt.run.sessionDataJson);if(a&&(0,nn.evaluateWorkflowCondition)(a,n)){if(!(await r(i.id,{status:"RESOLVED",resultJson:JSON.stringify({matched:!0}),resolvedAt:t})).count)continue;await this.completeWaitingAttempt(i.attemptId,{matched:!0})}else{let t=Math.max(1,Number(e.cadenceSeconds??15));await r(i.id,{resumeAfter:new Date(Date.now()+1e3*t)})}}else if(i.externalKey&&this.waitPollers.has(i.kind)){let e=await this.waitPollers.get(i.kind)(i.externalKey);if(e.pending){let t=(0,ii.parseWorkflowDefinition)(n4(i.attempt.run.version.definitionJson)).nodes.find(({id:e})=>e===i.attempt.nodeId)?.config??{};await r(i.id,{resumeAfter:new Date(Date.now()+1e3*nl(t,e.pollAfterSeconds??15))})}else{if(!(await r(i.id,{status:e.error?"FAILED":"RESOLVED",resultJson:JSON.stringify(e.result??{}),resolvedAt:new Date})).count)continue;if(e.error){let t=(0,ii.parseWorkflowDefinition)(n4(i.attempt.run.version.definitionJson)).nodes.find(({id:e})=>e===i.attempt.nodeId);await this.failAttempt(i.attempt,t??null,Error(e.error))}else await this.completeWaitingAttempt(i.attemptId,e.result??{})}}}}async completeWaitingAttempt(e,t){let r=await (0,tY.getPrismaClient)(),i=await r.workflowStepAttempt.findUnique({where:{id:e},include:{run:{include:{version:!0}}}});if(!i||"WAITING"!==i.status)return;let a=(0,ii.parseWorkflowDefinition)(n4(i.run.version.definitionJson)).nodes.find(({id:e})=>e===i.nodeId);if(!a)throw Error("Workflow step definition is missing");let n=this.attemptOutput(i),s=n.sessionPatch;if("TERMINAL_RUN"===a.kind&&t&&"object"==typeof t&&!Array.isArray(t)&&t.sessionData&&"object"==typeof t.sessionData&&!Array.isArray(t.sessionData)){let e=structuredClone(t.sessionData),r=(0,nn.getSessionValue)((0,nn.workflowSessionData)(i.run.sessionDataJson),"workflow");s=r?(0,nn.setSessionValue)(e,"workflow",r):e}t&&"object"==typeof t&&!Array.isArray(t)&&t.sessionPatch&&"object"==typeof t.sessionPatch&&!Array.isArray(t.sessionPatch)&&(s=(0,nn.mergeSessionData)(s??{},t.sessionPatch)),a.kind.startsWith("RUN_")&&t&&"object"==typeof t&&!Array.isArray(t)&&(s=(0,nn.mergeSessionData)(s??{},(0,nn.setSessionValue)({},`run.${a.id}`,t))),"BUILD_START"===a.kind&&t&&"object"==typeof t&&!Array.isArray(t)&&(s=(0,nn.mergeSessionData)(s??{},(0,nn.setSessionValue)({},"build",t))),"WORKTREE_WAIT_PUSH_READY"===a.kind&&t&&"object"==typeof t&&!Array.isArray(t)&&(s=(0,nn.mergeSessionData)(s??{},(0,nn.setSessionValue)({},"worktree",{id:t.id,pushStatus:t.pushStatus}))),"SKILL_APPLY"===a.kind&&t&&"object"==typeof t&&!Array.isArray(t)&&(s=(0,nn.mergeSessionData)(s??{},(0,nn.setSessionValue)({},`steps.${a.id}`,t))),("HUMAN_CONFIRM"===a.kind||"HUMAN_CHOICE"===a.kind)&&(s=(0,nn.mergeSessionData)(s??{},(0,nn.setSessionValue)({},`steps.${a.id}.answer`,t))),await this.completeAttempt(i,a,{output:t??n.value,selectedHandles:n.selectedHandles,sessionPatch:s})}async resolveExternalWait(e,t,r,i=null){let a=await (0,tY.getPrismaClient)(),n=await a.workflowWait.findMany({where:{kind:e,externalKey:t,status:"PENDING"},include:{attempt:{include:{run:{include:{version:!0}}}}}});for(let e of n)if(await a.workflowWait.update({where:{id:e.id},data:{status:i?"FAILED":"RESOLVED",resultJson:JSON.stringify(r),resolvedAt:new Date}}),i){let t=(0,ii.parseWorkflowDefinition)(n4(e.attempt.run.version.definitionJson)).nodes.find(({id:t})=>t===e.attempt.nodeId);await this.failAttempt(e.attempt,t??null,Error(i))}else await this.completeWaitingAttempt(e.attemptId,r);return n.length}descendants(e,t){let r=new Map;for(let t of e.edges)r.set(t.source,[...r.get(t.source)??[],t.target]);let i=new Set([t]),a=[t];for(;a.length;){let e=a.shift();for(let t of r.get(e)??[])i.has(t)||(i.add(t),a.push(t))}return[...i]}async prepareReplay(e,t){let r=await (0,tY.getPrismaClient)(),i=await r.workflowRun.findUnique({where:{id:e},include:{version:!0,attempts:{include:{checkpoints:!0,resourceLinks:!0}}}});if(!i)throw Error("Workflow run not found");if(!new Set(["PAUSED","BLOCKED","FAILED","SUCCEEDED","CANCELLED"]).has(i.status))throw Error("Pause the workflow before replaying a step");let a=(0,ii.parseWorkflowDefinition)(n4(i.version.definitionJson));if(!a.nodes.some(({id:e})=>e===t))throw Error("Workflow step not found");let n=this.descendants(a,t),s=i.attempts.filter(({generation:e,nodeId:t})=>e===i.generation&&n.includes(t)),o=s.filter(e=>e.nodeId===t).sort((e,t)=>t.attempt-e.attempt)[0],l=o?.checkpoints.slice().sort((e,t)=>e.createdAt.getTime()-t.createdAt.getTime())[0],c=s.flatMap(e=>e.resourceLinks.filter(({kind:e})=>"CHECKPOINT"!==e).map(({kind:e,resourceId:t,label:r,url:i})=>({kind:e,resourceId:t,label:r,url:i}))),u=null,d=null;if(l&&this.agentControl)try{u=await this.compareCheckpointWithAgent(l.id)}catch(e){d=`Git comparison unavailable: ${e instanceof Error?e.message:String(e)}`}return{runId:e,nodeId:t,affectedNodeIds:n,affectedAttemptIds:s.map(({id:e})=>e),externalEffects:c,checkpointId:l?.id??null,gitComparison:u,warning:[c.length?"External Jira, GitHub, build, deployment, and notification effects will not be undone.":null,d].filter(Boolean).join(" ")||null}}async replay(e,t,r={}){let i=await this.prepareReplay(e,t);if(r.restore){if(!i.checkpointId)throw Error("No restorable Git checkpoint is available for this step");this.checkpointRestorer?await this.checkpointRestorer(i.checkpointId,{stash:!!r.stash}):await this.restoreCheckpointWithAgent(i.checkpointId,{stash:!!r.stash})}let a=await (0,tY.getPrismaClient)(),n=await a.workflowRun.findUnique({where:{id:e},include:{version:!0,attempts:!0}});if(!n)throw Error("Workflow run not found");let s=(0,ii.parseWorkflowDefinition)(n4(n.version.definitionJson)),o=n.attempts.filter(e=>e.generation===n.generation&&e.nodeId===t).sort((e,t)=>t.attempt-e.attempt)[0];if(!o)throw Error("Selected step has no execution history");let l=o.inputJson?sr(n4(o.inputJson),"Step input snapshot"):(0,nn.workflowSessionData)(n.sessionDataJson),c=n.generation+1,u=new Map;for(let e of n.attempts.filter(({generation:e,iterationKey:t})=>e===n.generation&&!t)){let t=u.get(e.nodeId);(!t||t.attempt<e.attempt)&&u.set(e.nodeId,e)}let d=(0,nn.setSessionValue)(l,"workflow.replay",{generation:c,fromNodeId:t,replayedAt:new Date().toISOString()});return await a.$transaction(async t=>{await t.workflowStepAttempt.updateMany({where:{runId:e,generation:n.generation,nodeId:{in:i.affectedNodeIds},supersededAt:null},data:{supersededAt:new Date}}),await t.workflowStepAttempt.createMany({data:s.nodes.map(t=>{let r=i.affectedNodeIds.includes(t.id),a=u.get(t.id);return{id:(0,g.randomUUID)(),runId:e,nodeId:t.id,kind:t.kind,generation:c,iterationKey:"",attempt:0,status:r?"PENDING":a?.status==="SKIPPED"?"SKIPPED":"SUCCEEDED",phase:r?"REPLAY_PENDING":"REUSED_FROM_PRIOR_GENERATION",inputJson:r?null:a?.inputJson,outputJson:r?null:a?.outputJson,error:null,startedAt:r?null:a?.startedAt,finishedAt:r?null:new Date,requiredPathsJson:JSON.stringify(sn(t)),providedPathsJson:JSON.stringify(ss(t)),idempotencyKey:`${e}:${t.id}:${c}::0`,replayedFromId:a?.id??null}})}),await t.workflowWait.updateMany({where:{runId:e,status:"PENDING"},data:{status:"SUPERSEDED",resolvedAt:new Date}}),await t.workflowRun.update({where:{id:e},data:{generation:c,sessionDataJson:JSON.stringify(d),sessionRevision:{increment:1},status:"RUNNING",phase:"REPLAYING",blockedReason:null,error:null,pausedAt:null,finishedAt:null}})}),await this.appendEvent(e,null,"RUN_REPLAYED",`Replaying from step ${t}`,{generation:c,affectedNodeIds:i.affectedNodeIds}),sa(e),this.run(e)}async appendEvent(e,t,r,i,a=null){let n=await (0,tY.getPrismaClient)(),s=await n.$transaction(async n=>{let s=await n.workflowRunEvent.findFirst({where:{runId:e},orderBy:{sequence:"desc"},select:{sequence:!0}});return n.workflowRunEvent.create({data:{id:(0,g.randomUUID)(),runId:e,attemptId:t,sequence:(s?.sequence??-1)+1,type:r,message:i.slice(0,2e4),detailJson:a?JSON.stringify(a):null}})});return rQ.agentEventBus.publish(nQ(e),{workflowRunEventAdded:s}),s}subscribeWorkflows(){return rQ.agentEventBus.iterate(nZ)}subscribeRun(e){return rQ.agentEventBus.iterate(nY(e))}subscribeRunEvents(e){return rQ.agentEventBus.iterate(nQ(e))}subscribeRunQuestions(e){return rQ.agentEventBus.iterate(nX(e))}}let sc=globalThis;e.s(["getServerServices",0,function(){var e,t,r,i,g,y,v,w,b,k,x,S,I,E,A,_,C,T;let R,D,N,O,P,$,U,B,j,L,M,q,F,V,K,H,G,W,J,z,Z,Y,Q,X,ee,et,er,ei,ea,en,es;return sc.serverServices??(R=new f.PrismaService,D=new tQ.CredentialService,N=new nj,O=new a.AgentControlService,P=new aC(D),$=new aN,U=new r6(O),(B=new aX(O,P)).startRuntime(),j=new n.CcusageService(O),L=new s.BuildDataService(O),M=new ad.TelemetryService,q=new ay(O,void 0,D),F=new aF,V=new av.PushNotificationsService(void 0,D,$),(K=new aV.RunsService(P,O,U)).startReaper(),H=new o.BuildsService(O,M,P,U),G=new au(O),W=new l.CodebasesService(O,G),J=new c.CodebaseToolsService(W),z=new h.JiraService(D,N),Z=new m.IosDevicesService(void 0,D),Y=new u.GitHubActionsNotificationsService(D,P,$,!0,N),Q=new d.GitHubService(!0,D,$,()=>Y.configurationChanged()),X=new p.CacheServerService(D),ee=new rX.WorktreesService(O,z,Q,G,N),et=new iF(J,H,{codebases:W,telemetry:M,pushNotifications:V,agents:O,diskSpace:U,workflows:()=>ei},D),e=ei=new sl(N,er=new nz,void 0,D,O,P,K,ee,B,Q,z),r=e,i=t={agentControl:O,jira:z,github:Q,worktrees:ee,codebases:W,builds:H,skills:G,runs:K,commands:B,notifications:P,pushNotifications:V,tools:et,diskSpace:U},r.registerWaitPoller("AGENT_JOB",async e=>{let t=await i.agentControl.getJob(e);return t?new Set(["QUEUED","RUNNING"]).has(t.status)?{pending:!0,pollAfterSeconds:2}:{pending:!1,result:t.resultJson?{...nu(JSON.parse(t.resultJson),"Agent job result"),jobId:e}:{jobId:e,status:t.status},error:"SUCCEEDED"===t.status?null:t.error||`Agent job ${t.status.toLowerCase()}`}:{pending:!1,error:"Agent job disappeared"}}),r.registerWaitPoller("AGENT_RUN",async e=>{let t=await i.runs.get(e);return t?new Set(["IN_PROGRESS","PAUSED"]).has(t.status)?{pending:!0,pollAfterSeconds:3}:{pending:!1,result:{id:t.id,kind:t.kind,status:t.status,phase:t.phase,finalOutput:t.finalOutput,error:t.error,usage:{inputTokens:t.inputTokens,outputTokens:t.outputTokens,reasoningTokens:t.reasoningTokens,estimatedCost:t.estimatedCost}},error:"COMPLETED"===t.status?null:t.error||`Run ${t.status.toLowerCase()}`}:{pending:!1,error:"Plan or session disappeared"}}),r.registerWaitPoller("COMMAND_RUN",async e=>{let t=await i.commands.getRun(e);return t?new Set(["QUEUED","RUNNING","RESTARTING","CANCELLING"]).has(t.status)?{pending:!0,pollAfterSeconds:1}:{pending:!1,result:{id:t.id,displayNumber:t.displayNumber,status:t.status,exitCode:t.exitCode,signal:t.signal,error:t.error},error:"SUCCEEDED"===t.status?null:t.error||`Command run ${t.status.toLowerCase()}`}:{pending:!1,error:"Command run disappeared"}}),r.registerWaitPoller("BUILD",async e=>{let t=await i.builds.getBuild(e);return t?new Set(["QUEUED","PREPARING","RUNNING"]).has(t.status)?{pending:!0,pollAfterSeconds:3}:{pending:!1,result:{id:t.id,status:t.status,action:t.action},error:"SUCCEEDED"===t.status?null:t.error||`Build ${t.status.toLowerCase()}`}:{pending:!1,error:"Build disappeared"}}),r.registerWaitPoller("SKILL_RUN",async e=>{let t=await i.skills.getRun(e);return t?("READY"===t.status&&(t=await i.skills.applyRun(e)),new Set(["PREPARING","READY","APPLYING"]).has(t?.status??""))?{pending:!0,pollAfterSeconds:3}:{pending:!1,result:{id:e,status:t?.status},error:t?.status==="SUCCEEDED"?null:t?.error||`Skill run ${t?.status?.toLowerCase()}`}:{pending:!1,error:"Skill run disappeared"}}),r.registerWaitPoller("WORKTREE_MOVE",async e=>{let t=await i.worktrees.getMove(e);if(!t)return{pending:!1,error:"Worktree move disappeared"};if(new Set(["PUSHING","CHECKING_OUT","DELETING_SOURCE"]).has(t.status))return{pending:!0,pollAfterSeconds:3};let r=t.targetWorktreeId?await i.worktrees.workflowSessionDataForWorktree(t.targetWorktreeId,{includeMissing:!0}):{};return{pending:!1,result:{id:t.id,status:t.status,targetWorktreeId:t.targetWorktreeId,sessionPatch:r},error:"SUCCEEDED"===t.status?null:t.error||`Worktree move ${t.status.toLowerCase()}`}}),r.registerWaitPoller("WORKTREE_PUSH_READY",async e=>{let t=await (0,tY.getPrismaClient)(),r=await t.worktree.findUnique({where:{id:e}});if(!r)return{pending:!1,error:"Worktree disappeared"};if("READY"!==r.pushStatus)return{pending:!0,pollAfterSeconds:5};let a=await i.worktrees.workflowSessionDataForWorktree(r.id,{includeMissing:!0});return{pending:!1,result:{id:r.id,pushStatus:r.pushStatus,sessionPatch:a}}}),r.registerWaitPoller("WORKFLOW_RUN",async e=>{let t=await r.run(e);return t?new Set(["SUCCEEDED","FAILED","CANCELLED"]).has(t.status)?{pending:!1,result:{id:t.id,status:t.status,sessionData:JSON.parse(t.sessionDataJson)},error:"SUCCEEDED"===t.status?null:t.error||`Sub-workflow ${t.status.toLowerCase()}`}:{pending:!0,pollAfterSeconds:3}:{pending:!1,error:"Sub-workflow disappeared"}}),r.registerWaitPoller("RUN_ANSWER_REVISION",async e=>{let t=nu(JSON.parse(e),"Answer revision wait"),r=nd(t.batchId,"Question batch ID",500),a=await i.runs.questionBatch(r);if(!a)return{pending:!1,error:"Question batch disappeared"};if(!a.revisionPreparedAt)return{pending:!0,pollAfterSeconds:2};let n=await i.runs.reviseAnswer(r,t.answers??{},!0===t.stash,!1!==t.rollback);return n?{pending:!1,result:{id:n.id,kind:n.kind,status:n.status,phase:n.phase,parentRunId:n.parentRunId,followUpMode:n.followUpMode}}:{pending:!1,error:"Answer revision failed"}}),r.registerWaitPoller("GITHUB_CHECKS",async e=>{let t=nu(JSON.parse(e),"GitHub checks wait"),r=await i.github.autoRetryRun(nd(t.repositoryId,"Repository ID"),nd(t.workflowRunId,"Workflow run ID"),!0);return new Set(["SUCCESS","FAILURE","CANCELLED","SKIPPED","TIMED_OUT","ACTION_REQUIRED","ERROR","NEUTRAL","STALE","STARTUP_FAILURE"]).has(r.status)?{pending:!1,result:{runId:r.id,status:r.status,jobs:r.jobs,sessionPatch:{pipeline:{runId:r.id,status:r.status,conclusion:r.status,jobs:r.jobs}}},error:"SUCCESS"===r.status?null:`GitHub checks concluded ${r.status.toLowerCase()}`}:{pending:!0,pollAfterSeconds:10}}),r.registerWaitPoller("DISK_SPACE_REPORT",async e=>{let t=nu(JSON.parse(e),"Disk-space report wait"),r=nd(t.agentId,"Agent ID",500),a=await i.diskSpace.snapshot(r);if(!a.disk.enabled)return{pending:!1,error:"Disk-space monitoring was disabled while awaiting a report"};let n=a.disk.lastReportedAt,s="string"==typeof t.previousReportedAt?t.previousReportedAt:null;return(nd(t.requestedAt,"Requested timestamp",100),n&&(!s||Date.parse(n)>Date.parse(s)))?{pending:!1,result:{...a,sessionPatch:a}}:{pending:!0,pollAfterSeconds:2}}),g=er,y=t,g.register("JIRA_LOAD_TICKET",async e=>{let t=nE(await y.jira.ticket(n_(e),!0===e.node.config.force));return{output:t,sessionPatch:{ticket:t},links:[nv(String(t.key),String(t.title??t.key))]}}),g.register("JIRA_TRANSITION",async e=>{let t=nE(await y.jira.transitionTicket(n_(e),nd(e.node.config.transitionId,"Jira transition ID",200)));return{output:t,sessionPatch:{ticket:t},links:[nv(String(t.key),String(t.title??t.key))]}}),g.register("JIRA_COMMENT",async e=>{let t=nE(await y.jira.addComment(n_(e),{value:nd(e.node.config.content,"Jira comment",1e5),format:"JIRA_WIKI"===e.node.config.format?"JIRA_WIKI":"MARKDOWN"}));return{output:t,sessionPatch:{ticket:t},links:[nv(String(t.key),String(t.title??t.key))]}}),g.register("JIRA_ASSIGN",async e=>{let t=null===e.node.config.accountId?null:nd(e.node.config.accountId,"Jira account ID",500),r=nE(await y.jira.assignTicket(n_(e),t));return{output:r,sessionPatch:{ticket:r},links:[nv(String(r.key),String(r.title??r.key))]}}),g.register("JIRA_UPDATE_FIELDS",async e=>{let t=nu(e.node.config.fields??{},"Jira fields"),r=nE(await y.jira.updateTicket({issueKey:n_(e),...t}));return{output:r,sessionPatch:{ticket:r},links:[nv(String(r.key),String(r.title??r.key))]}}),g.register("JIRA_RESOLVE_BRANCH",async e=>{let t=await y.worktrees.previewTicketBranch({codebaseId:nd(e.node.config.codebaseId??(0,nn.getSessionValue)(e.sessionData,"codebase.id"),"Codebase ID",200),worktreeId:"string"==typeof(0,nn.getSessionValue)(e.sessionData,"worktree.id")?String((0,nn.getSessionValue)(e.sessionData,"worktree.id")):null,ticketKey:n_(e)});return{output:t,sessionPatch:{worktree:{branch:t.branchName},ticket:{key:t.ticketKey,title:t.ticketTitle,type:t.ticketType}},links:[nv(t.ticketKey,t.ticketTitle)]}}),v=er,w=t,v.register("GITHUB_LOAD_PR",async e=>{let t=nI(e),r=await w.github.pullRequest(t.owner,t.name,nT(e));if(!r)throw Error("Pull request was not found");let i=nA(r);return{output:i,sessionPatch:{pr:i},links:[ny("PULL_REQUEST",a6(t.owner,t.name,r.number),r.title,r.url)]}}),v.register("GITHUB_MERGE_PR",async e=>{let t=nI(e),r=nT(e),i=await w.github.pullRequestMergeOptions(t.owner,t.name,r);if(!i.canMerge)throw Error(i.blockedReason||"Pull request cannot be merged");let a=await w.github.mergePullRequest({...t,number:r,method:"MERGE"===e.node.config.method||"REBASE"===e.node.config.method?e.node.config.method:"SQUASH",commitHeadline:"string"==typeof e.node.config.commitHeadline?e.node.config.commitHeadline:i.defaultCommitHeadline,commitBody:"string"==typeof e.node.config.commitBody?e.node.config.commitBody:i.defaultCommitBody,authorEmail:"string"==typeof e.node.config.authorEmail?e.node.config.authorEmail:null});return{output:a,sessionPatch:{pr:{state:a.state}},links:[nw(e)]}}),v.register("GITHUB_COLLECT_REVIEW_THREADS",async e=>{let t=nI(e),r=await w.github.pullRequest(t.owner,t.name,nT(e));if(!r)throw Error("Pull request was not found");let i=r.reviewThreads.filter(({isResolved:e})=>!e);return{output:i,sessionPatch:{pr:{unresolvedThreads:i}},links:[nw(e,r.title,r.url)]}}),v.register("GITHUB_REPLY_REVIEW_THREAD",async e=>{let t=await w.github.replyToReviewThread(nd(e.node.config.threadId,"Review thread ID",500),nd(e.node.config.body,"Review reply",1e5)),r=nb(e);return{output:t,links:r?[r]:void 0}}),v.register("GITHUB_SET_REVIEW_THREAD_RESOLVED",async e=>{let t=await w.github.setReviewThreadResolved(nd(e.node.config.threadId,"Review thread ID",500),!1!==e.node.config.resolved),r=nb(e);return{output:t,links:r?[r]:void 0}}),v.register("GITHUB_CREATE_PR",async e=>{let t=nI(e),r=await w.github.createPullRequest({...t,baseRefName:nd(e.node.config.baseRefName??(0,nn.getSessionValue)(e.sessionData,"worktree.baseBranch"),"Base branch",500),headRefName:nd(e.node.config.headRefName??(0,nn.getSessionValue)(e.sessionData,"worktree.branch"),"Head branch",500),title:nd(e.node.config.title??(0,nn.getSessionValue)(e.sessionData,"ticket.title"),"Pull request title",500),body:"string"==typeof e.node.config.body?e.node.config.body:null,draft:!0===e.node.config.draft}),i=nA(r);return{output:i,sessionPatch:{pr:i},links:[ny("PULL_REQUEST",a6(t.owner,t.name,r.number),r.title,r.url)]}}),v.register("GITHUB_SET_PR_LABELS",async e=>{let t=nI(e),r=Array.isArray(e.node.config.labels)?e.node.config.labels.map(String):[],i=await w.github.setPullRequestLabels({...t,number:nT(e),labels:r});return{output:i.labels,sessionPatch:{pr:{labels:i.labels}},links:[nw(e)]}}),v.register("GITHUB_RETRY_PIPELINE",async e=>{let t=await w.github.retryPipeline(nd(e.node.config.repositoryId??(0,nn.getSessionValue)(e.sessionData,"pr.repositoryGithubId"),"GitHub repository ID",500),nd(e.node.config.checkSuiteId??(0,nn.getSessionValue)(e.sessionData,"pipeline.checkSuiteId"),"Check suite ID",500),{actor:"workflow",ipAddress:null}),r=nk(e);return{output:t,sessionPatch:{pipeline:{status:t.status}},links:r?[r]:void 0}}),v.register("GITHUB_RETRY_JOB",async e=>{let t=await w.github.retryWorkflowJob(nd(e.node.config.repositoryId,"GitHub repository ID",500),nd(e.node.config.checkSuiteId,"Check suite ID",500),nd(e.node.config.jobId,"Workflow job ID",500),{actor:"workflow",ipAddress:null}),r=nk(e);return{output:t,links:r?[r]:void 0}}),v.register("GITHUB_CANCEL_WORKFLOW_RUN",async e=>{let t=await w.github.cancelActionsWorkflowRun(nd(e.node.config.codebaseRepositoryId??(0,nn.getSessionValue)(e.sessionData,"repo.id"),"Codebase repository ID",500),nd(e.node.config.workflowRunId??(0,nn.getSessionValue)(e.sessionData,"pipeline.runId"),"Workflow run ID",500),!0===e.node.config.force,{actor:"workflow",ipAddress:null}),r=nk(e);return{output:t,sessionPatch:{pipeline:{status:"CANCELLED"}},links:r?[r]:void 0}}),v.register("GITHUB_SAVE_AUTO_RETRY",async e=>({output:await w.github.saveAutoRetryRule(nu(e.node.config.input,"Auto-retry rule"))})),v.register("GITHUB_WAIT_CHECKS",async e=>{let t=nd(e.node.config.repositoryId??(0,nn.getSessionValue)(e.sessionData,"repo.id"),"Repository ID",500),r=nd(e.node.config.workflowRunId??(0,nn.getSessionValue)(e.sessionData,"pipeline.runId"),"Workflow run ID",500),i=nk(e);return{links:i?[i]:void 0,wait:{kind:"GITHUB_CHECKS",externalKey:JSON.stringify({repositoryId:t,workflowRunId:r}),resumeAfter:nc(e.node.config),timeoutAt:no(e.node.config)}}}),b=er,k=t,b.register("WORKTREE_CREATE",async e=>{let t=nN(e),r=await k.worktrees.createWorktree({codebaseId:nD(e),selection:t,requestId:nm(e,"create")});return ng(e,r,{worktree:{branch:t.branchName,baseBranch:t.baseBranch}})}),b.register("WORKTREE_CHANGE_BRANCH",async e=>{let t=nR(e),r=nN(e),i=await k.worktrees.changeWorktreeBranch({worktreeId:t,selection:r,requestId:nm(e,"change-branch"),stashOnFailure:!0===e.node.config.stashOnFailure});return ng(e,i,{worktree:{branch:r.branchName,baseBranch:r.baseBranch}},[ny("WORKTREE",t,"Worktree")])}),b.register("WORKTREE_OPERATION",async e=>{let t=String(e.node.config.operation??"SYNC").toUpperCase();if("OPEN_EDITOR"===t||!a4.WORKTREE_OPERATIONS.includes(t))throw Error("Worktree operation is invalid for workflow execution");let r=nR(e),i=await k.worktrees.runOperation(r,t,nm(e,t.toLowerCase()));return ng(e,i,void 0,[ny("WORKTREE",r,"Worktree")])}),b.register("WORKTREE_DELETE",async e=>{let t=await k.worktrees.deleteWorktree({worktreeId:nR(e),deleteRemoteBranch:!0===e.node.config.deleteRemoteBranch,requestId:nm(e,"delete")});return ng(e,t)}),b.register("WORKTREE_MOVE",async e=>{let t=await k.worktrees.moveWorktree({sourceWorktreeId:nR(e),targetCodebaseId:nd(e.node.config.targetCodebaseId,"Target codebase ID",500),targetWorktreeId:np(e.node.config.targetWorktreeId,500),deleteSource:!0===e.node.config.deleteSource,requestId:nm(e,"move")}),r=t.targetWorktreeId??(!0===e.node.config.deleteSource?null:nR(e));return{output:t,links:[...r?[ny("WORKTREE",r,"Worktree")]:[],{kind:"WORKTREE_MOVE",resourceId:t.id,label:"Worktree move"}],wait:{kind:"WORKTREE_MOVE",externalKey:t.id,resumeAfter:nc(e.node.config),timeoutAt:no(e.node.config)}}}),b.register("WORKTREE_INSPECT",async e=>{let t=nR(e),r=await k.worktrees.inspect(t,nm(e,"inspect"));return{output:r,sessionPatch:{worktree:{commits:r.commits,changes:r.changes,branchChanges:r.branchChanges}},links:[ny("WORKTREE",t,"Worktree")]}}),b.register("WORKTREE_INSPECT_GIT",async e=>{let t=nR(e),r=await k.worktrees.inspectGitState(t,nm(e,"inspect-git"));return{output:r,sessionPatch:{worktree:{...r}},links:[ny("WORKTREE",t,"Worktree")]}}),b.register("WORKTREE_GIT_OPERATION",async e=>{let t=String(e.node.config.operation??"PULL_BRANCH").toUpperCase();if(!a4.WORKTREE_GIT_OPERATIONS.includes(t))throw Error("Worktree Git operation is invalid");let r=nR(e),i=await k.worktrees.runGitOperation({worktreeId:r,operation:t,branch:np(e.node.config.branch,500),stashOid:np(e.node.config.stashOid,200),stashChanges:!0===e.node.config.stashChanges,requestId:nm(e,t.toLowerCase())});return ng(e,i,void 0,[ny("WORKTREE",r,"Worktree")])}),b.register("WORKTREE_WAIT_PUSH_READY",async e=>{let t=nR(e);return{links:[ny("WORKTREE",t,"Worktree")],wait:{kind:"WORKTREE_PUSH_READY",externalKey:t,resumeAfter:nc(e.node.config),timeoutAt:no(e.node.config)}}}),x=er,S=t,x.register("CODEBASE_FETCH_REFRESH",async e=>{let t=nD(e),r="REFRESH"===e.node.config.operation?ro.CODEBASE_REFRESH_JOB_KIND:ro.CODEBASE_FETCH_JOB_KIND,i=await S.codebases.runOperation(r,[t],nm(e,r)),a=i.jobs[0];if(!a)throw Error(i.skipped[0]?.reason??"Codebase operation was skipped");return ng(e,a,void 0,[ny("CODEBASE",t,"Codebase")])}),x.register("CODEBASE_INSPECT_GIT",async e=>{let t=nD(e),r=await S.codebases.inspectGitState(t,nm(e,"inspect-git"));return{output:r,sessionPatch:{codebase:{...r}},links:[ny("CODEBASE",t,"Codebase")]}}),x.register("CODEBASE_GIT_OPERATION",async e=>{let t=String(e.node.config.operation??"PULL_BRANCH").toUpperCase();if(!ro.CODEBASE_GIT_OPERATIONS.includes(t))throw Error("Codebase Git operation is invalid");let r=nD(e),i=await S.codebases.runGitOperation({codebaseId:r,operation:t,branch:np(e.node.config.branch,500),stashOid:np(e.node.config.stashOid,200),stashChanges:!0===e.node.config.stashChanges,requestId:nm(e,t.toLowerCase())});return ng(e,i,void 0,[ny("CODEBASE",r,"Codebase")])}),I=er,E=t,I.register("BUILD_START",async e=>{let t=String(e.node.config.action??"BUILD").toUpperCase();if(!a3.BUILD_ACTIONS.includes(t))throw Error("Build action is invalid");let r=await E.builds.startBuild({worktreeId:nR(e),configurationId:nd(e.node.config.configurationId,"Build configuration ID",500),destination:e.node.config.destination,scriptIds:Array.isArray(e.node.config.scriptIds)?e.node.config.scriptIds.map(String):[],action:t,advancedSettings:e.node.config.advancedSettings,exportWhenComplete:!0===e.node.config.exportWhenComplete,exportSettings:e.node.config.exportSettings,worktreeCoverage:!0===e.node.config.worktreeCoverage,requestId:nm(e,"build"),telemetryRequestOrigin:"workflow"});return{output:r,sessionPatch:{build:{id:r.id,status:r.status,action:r.action}},links:[{kind:"BUILD",resourceId:r.id,label:`${r.action} build`,url:`/builds/${r.id}`}],wait:{kind:"BUILD",externalKey:r.id,resumeAfter:nc(e.node.config),timeoutAt:no(e.node.config)}}}),I.register("BUILD_READ_TEST_RESULTS",async e=>{let t,r=nO(e),i=(await E.builds.reportsForBuild(r)).filter(({kind:e,status:t})=>"TEST_RESULTS"===e&&"READY"===t).at(-1);if(!i)throw Error("Test results are not ready");let a=nu(JSON.parse(i.summaryJson),"Test summary"),n=nu(JSON.parse(i.dataJson),"Test results");return{output:{summary:a,tests:n.tests??[]},sessionPatch:{build:{testSummary:a,tests:n.tests??[]}},links:[ny("BUILD",r,"Build",t)]}}),I.register("BUILD_READ_COVERAGE",async e=>{let t=nO(e),r=(await E.builds.reportsForBuild(t)).filter(({kind:e,status:t})=>"CODE_COVERAGE"===e&&"READY"===t).at(-1);if(!r)throw Error("Coverage results are not ready");let i=nu(JSON.parse(r.summaryJson),"Coverage summary"),a=nu(JSON.parse(r.dataJson),"Coverage results");return{output:{summary:i,files:a.files??[],changedFiles:a.changedFiles??[]},sessionPatch:{build:{coverageSummary:i,coverageFiles:a.files??[],changedCoverageFiles:a.changedFiles??[]}},links:[ny("BUILD",t,"Build",`/builds/${t}/coverage`)]}}),I.register("BUILD_EXPORT",async e=>{let t,r,i=nO(e),a=await E.builds.exportArchive({buildId:i,requestId:nm(e,"export"),settings:nu(e.node.config.settings,"Export settings")});return a.jobId?ng(e,{id:a.jobId,timeoutSeconds:3600},{build:{exportId:a.id}},[ny("BUILD",i,"Build",t)]):{output:a,links:[ny("BUILD",i,"Build",r)]}}),I.register("BUILD_DEPLOY",async e=>{let t,r,i=nO(e),a=await E.builds.runBuild({buildId:i,destinations:Array.isArray(e.node.config.destinations)?e.node.config.destinations:[],requestId:nm(e,"deploy")}),n=a.find(({jobId:e})=>!!e)?.jobId;return n?ng(e,{id:n,timeoutSeconds:3600},void 0,[ny("BUILD",i,"Build",t)]):{output:a,links:[ny("BUILD",i,"Build",r)]}}),I.register("BUILD_CANCEL",async e=>{let t,r=nO(e),i=await E.builds.cancelBuild(r);return{output:i,sessionPatch:{build:{id:i?.id,status:i?.status}},links:[ny("BUILD",r,"Build",t)]}}),A=er,_=t,es=async e=>{let t=await _.diskSpace.snapshot(e);return{output:t,sessionPatch:t,links:[ny("AGENT",e,t.agent.name,`/agents/${encodeURIComponent(e)}`)]}},A.register("DISK_SPACE_LOAD",async e=>es(nP(e))),A.register("DISK_SPACE_REFRESH",async e=>{let t=nP(e),r=await _.diskSpace.requestRefresh(t);return{output:r,links:[ny("AGENT",t,"Agent",`/agents/${encodeURIComponent(t)}`)],wait:{kind:"DISK_SPACE_REPORT",externalKey:JSON.stringify(r),resumeAfter:nc(e.node.config,2),timeoutAt:no(e.node.config,180)}}}),A.register("DISK_SPACE_UPDATE_THRESHOLDS",async e=>{let t=await _.diskSpace.updateSettings({normalThresholdGiB:Number(e.node.config.normalThresholdGiB),pressureThresholdGiB:Number(e.node.config.pressureThresholdGiB)});return{output:t,sessionPatch:{disk:t}}}),A.register("DISK_SPACE_SET_MONITORING",async e=>{let t=nP(e);return await _.diskSpace.setMonitoring(t,!0===e.node.config.enabled),es(t)}),A.register("DISK_SPACE_SET_PRESSURE_MODE",async e=>{let t=nP(e);return await _.diskSpace.setManualPressureMode(t,!0===e.node.config.enabled),es(t)}),function(e,t){for(let[r,i]of(e.register("RUN_CREATE_PLAN",async e=>{let r=await t.runs.create(nU(e,"PLAN"));if(!r)throw Error("Plan could not be created");return nf(e,r,!0)}),e.register("RUN_CREATE_SESSION",async e=>{let r=await t.runs.create(nU(e,"SESSION"));if(!r)throw Error("Session could not be created");return nf(e,r,!0)}),e.register("RUN_PLAY_PLAN",async e=>{let r=await t.runs.playPlan(n$(e));if(!r)throw Error("Plan could not be played");return nf(e,r,!0)}),e.register("RUN_FOLLOW_UP",async e=>{let r=nU(e,"SESSION"),i=await t.runs.followUp(n$(e),{...r,followUpMode:nd(e.node.config.followUpMode??"RESUME","Follow-up mode",50),contextMode:np(e.node.config.contextMode,50)});if(!i)throw Error("Follow-up could not be created");return nf(e,i,!0)}),e.register("RUN_STEER",async e=>{let r=await t.runs.steer(n$(e),nd(e.node.config.prompt,"Steering prompt",2e5),Array.isArray(e.node.config.attachmentIds)?e.node.config.attachmentIds.map(String):[]);if(!r)throw Error("Run could not be steered");return nf(e,r)}),e.register("RUN_ANSWER",async e=>{let r=await t.runs.answerQuestion(nd(e.node.config.batchId,"Question batch ID",500),e.node.config.answers??{});if(!r)throw Error("Question could not be answered");return nf(e,r)}),[["RUN_PAUSE","PAUSE"],["RUN_CONTINUE","CONTINUE"],["RUN_CANCEL","CANCEL"]]))e.register(r,async e=>{let r=await t.runs.lifecycle(n$(e),i);if(!r)throw Error("Run lifecycle operation failed");return nf(e,r)});e.register("RUN_REVISE_ANSWER",async e=>{let r=nd(e.node.config.batchId,"Question batch ID",500),i=await t.runs.questionBatch(r);if(!i)throw Error("Question batch was not found");if(i.revisionPreparedAt){let i=await t.runs.reviseAnswer(r,e.node.config.answers??{},!0===e.node.config.stash,!1!==e.node.config.rollback);if(!i)throw Error("Answer revision failed");return nf(e,i)}await t.runs.prepareAnswerRevision(r);let a=nx(e);return{links:a?[a]:void 0,wait:{kind:"RUN_ANSWER_REVISION",externalKey:JSON.stringify({batchId:r,answers:e.node.config.answers??{},stash:!0===e.node.config.stash,rollback:!1!==e.node.config.rollback}),resumeAfter:nc(e.node.config),timeoutAt:no(e.node.config)}}}),e.register("RUN_READ_RESULT",async e=>{let r=await t.runs.get(n$(e));if(!r)throw Error("Run was not found");let[i,a,n,s]=await Promise.all([t.runs.events({runId:r.id,first:500}),t.runs.questions({runId:r.id,first:200}),t.runs.usage(r.id),t.runs.linkedItems(r.id)]);return nf(e,{...r,events:i,questions:a,usage:n,links:s})}),e.register("RUN_CAPTURE_CHECKPOINT",async e=>{let t=await (0,tY.getPrismaClient)(),r=await t.runCheckpoint.findFirst({where:{runId:n$(e)},orderBy:{createdAt:"desc"}});if(!r)throw Error("Run has no captured checkpoint");let i=nx(e);return{output:r,sessionPatch:{steps:{[e.node.id]:{snapshotId:r.id}}},links:[...i?[i]:[],{kind:"CHECKPOINT",resourceId:r.id,label:`${r.kind} checkpoint`}]}}),e.register("RUN_ARCHIVE_DELETE",async e=>{let r=n$(e),i=!0===e.node.config.delete,a=i?await t.runs.deleteRuns([r]):await t.runs.archive([r],!1!==e.node.config.archived),n=i?null:nx(e);return{output:{id:r,affected:a},links:n?[n]:void 0}})}(er,t),C=er,T=t,C.register("SAVED_COMMAND",async e=>{let t=nd(e.node.config.commandId,"Saved command",500),r=await T.commands.getDefinition(t);if(!r||r.archivedAt)throw Error("Saved command is unavailable");let i="FIRE_AND_FORGET"===e.node.config.completionMode?"FIRE_AND_FORGET":"WAIT_FOR_EXIT";if("WAIT_FOR_EXIT"===i&&"ALWAYS"===r.restartPolicy)throw Error("Always-restart commands require fire and forget");let a=String(e.node.config.targetMode??"CONTEXT"),n=null,s=null,o=new Set(["ANY_AGENT_HOME","SPECIFIC_AGENT_HOME"]).has(r.targetKind);if("FIXED_AGENT"===a)n=nd(e.node.config.agentId,"Fixed agent",500);else if("FIXED_WORKTREE"===a)s=nd(e.node.config.worktreeId,"Fixed worktree",500);else if(o){let t=(0,nn.getSessionValue)(e.sessionData,"agent.id")??(0,nn.getSessionValue)(e.sessionData,"codebase.agentId");if("string"==typeof t&&(n=t),!n){let t=(0,nn.getSessionValue)(e.sessionData,"worktree.id");if("string"==typeof t){let e=await (0,tY.getPrismaClient)(),r=await e.worktree.findUnique({where:{id:t},select:{codebase:{select:{agentId:!0}}}});n=r?.codebase.agentId??null}}}else{let t=(0,nn.getSessionValue)(e.sessionData,"worktree.id");"string"==typeof t&&(s=t)}let l=await T.commands.startRun({commandId:t,agentId:n,worktreeId:s,origin:"WORKFLOW",idempotencyKey:e.attempt.idempotencyKey});if(!l)throw Error("Command run could not be created");return{output:{id:l.id,displayNumber:l.displayNumber,status:l.status},sessionPatch:{steps:{[e.node.id]:{commandRunId:l.id,displayNumber:l.displayNumber}}},links:[{kind:"COMMAND_RUN",resourceId:l.id,label:`Command #${l.displayNumber}`,url:`/commands/runs/${l.id}`}],wait:"WAIT_FOR_EXIT"===i?{kind:"COMMAND_RUN",externalKey:l.id,resumeAfter:nc(e.node.config),timeoutAt:no(e.node.config)}:void 0}}),C.register("CUSTOM_COMMAND",async e=>{let t=nd(e.node.config.script,"Custom command",1e6),r="FIRE_AND_FORGET"===e.node.config.completionMode?"FIRE_AND_FORGET":"WAIT_FOR_EXIT",i=String(e.node.config.targetMode??"CONTEXT"),a=null,n=null;if("FIXED_AGENT"===i)a=nd(e.node.config.agentId,"Fixed agent",500);else if("FIXED_WORKTREE"===i)n=nd(e.node.config.worktreeId,"Fixed worktree",500);else{let t=(0,nn.getSessionValue)(e.sessionData,"worktree.id");if("string"==typeof t)n=t;else{let t=(0,nn.getSessionValue)(e.sessionData,"agent.id")??(0,nn.getSessionValue)(e.sessionData,"codebase.agentId");"string"==typeof t&&(a=t)}}if(!a&&!n)throw Error("Custom command context has no agent or worktree target");let s=await T.commands.startCustomRun({script:t,agentId:a,worktreeId:n,origin:"WORKFLOW",idempotencyKey:e.attempt.idempotencyKey});if(!s)throw Error("Custom command run could not be created");return{output:{id:s.id,displayNumber:s.displayNumber,status:s.status},sessionPatch:{steps:{[e.node.id]:{commandRunId:s.id,displayNumber:s.displayNumber}}},links:[{kind:"COMMAND_RUN",resourceId:s.id,label:`Command #${s.displayNumber}`,url:`/commands/runs/${s.id}`}],wait:"WAIT_FOR_EXIT"===r?{kind:"COMMAND_RUN",externalKey:s.id,resumeAfter:nc(e.node.config),timeoutAt:no(e.node.config)}:void 0}}),C.register("SKILL_APPLY",async e=>{let t=await T.skills.prepareSync(e.node.config.groupId?"GROUP":"ALL",np(e.node.config.groupId,500),!1);if(!t)throw Error("Skill sync could not be prepared");return{output:t,links:[{kind:"SKILL_RUN",resourceId:t.id,label:"Skill sync",url:`/skills/sync/${t.id}`}],wait:{kind:"SKILL_RUN",externalKey:t.id,resumeAfter:nc(e.node.config),timeoutAt:no(e.node.config)}}}),C.register("NOTIFICATION_SEND",async e=>{let t=await (0,tY.getPrismaClient)(),r=await t.$transaction(t=>T.notifications.recordInTransaction(t,{dedupeKey:`${e.run.id}:${e.node.id}:${e.attempt.generation}`,typeKey:"WORKFLOW_MESSAGE",title:nd(e.node.config.title,"Notification title",240),body:nd(e.node.config.body,"Notification body",1e3),href:"string"==typeof e.node.config.href?e.node.config.href:`/workflows/runs/${e.run.id}`,resourceKind:"WORKFLOW_RUN",resourceId:e.run.id,worktreeId:"string"==typeof(0,nn.getSessionValue)(e.sessionData,"worktree.id")?String((0,nn.getSessionValue)(e.sessionData,"worktree.id")):null}));return T.notifications.created(r),{output:r}}),C.register("IOS_PUSH_SEND",async e=>({output:await T.pushNotifications.send({requestId:nm(e,"ios-push"),editor:e.node.config.editor,targetMode:nd(e.node.config.targetMode??"ALL","Push target mode",50),registrationIds:Array.isArray(e.node.config.registrationIds)?e.node.config.registrationIds.map(String):[],channelId:np(e.node.config.channelId,500),directToken:np(e.node.config.directToken,2e4),directTokenEncoding:"BASE64"===e.node.config.directTokenEncoding?"BASE64":"HEX",directEnvironment:"PRODUCTION"===e.node.config.directEnvironment?"PRODUCTION":"SANDBOX"})})),C.register("MCP_CALL",async e=>{let t=await T.tools.callTool({groupId:nd(e.node.config.groupId,"MCP tool group",500),name:nd(e.node.config.name,"MCP tool name",500),arguments:nu(e.node.config.arguments??{},"MCP arguments")});return{output:t,sessionPatch:{steps:{[e.node.id]:{output:t}}}}}),(ea=new nF(N,O,ee,U)).start(),ei.startRuntime(),(en=new a2(j,U,$)).startRuntime(),sc.serverServices={prismaService:R,credentialService:D,agentControlService:O,ccusageService:j,buildDataService:L,buildsService:H,codebasesService:W,codebaseToolsService:J,jiraService:z,iosDevicesService:Z,gitHubService:Q,gitHubActionsNotificationsService:Y,cacheServerService:X,worktreesService:ee,skillsService:G,telemetryService:M,signingAssetsService:q,pushNotificationsService:V,notificationsService:P,pollingService:$,modelCostsService:F,runsService:K,commandsService:B,diskSpaceService:U,systemStatusService:en,toolsService:et,workflowEventsService:N,workflowsService:ei,workflowEventBridge:ea})}],887394)}];
|
|
469
469
|
|
|
470
470
|
//# sourceMappingURL=_17vom8o._.js.map
|