@ai-development-environment/server 0.0.30 → 0.0.32

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.
Files changed (192) hide show
  1. package/package.json +1 -1
  2. package/standalone/.next/BUILD_ID +1 -1
  3. package/standalone/.next/app-path-routes-manifest.json +1 -0
  4. package/standalone/.next/build-manifest.json +3 -3
  5. package/standalone/.next/prerender-manifest.json +3 -3
  6. package/standalone/.next/routes-manifest.json +9 -0
  7. package/standalone/.next/server/app/[locale]/actions/page.js +2 -1
  8. package/standalone/.next/server/app/[locale]/actions/page.js.nft.json +1 -1
  9. package/standalone/.next/server/app/[locale]/actions/page_client-reference-manifest.js +1 -1
  10. package/standalone/.next/server/app/[locale]/agents/[id]/page.js +2 -1
  11. package/standalone/.next/server/app/[locale]/agents/[id]/page.js.nft.json +1 -1
  12. package/standalone/.next/server/app/[locale]/agents/[id]/page_client-reference-manifest.js +1 -1
  13. package/standalone/.next/server/app/[locale]/agents/page.js +2 -1
  14. package/standalone/.next/server/app/[locale]/agents/page.js.nft.json +1 -1
  15. package/standalone/.next/server/app/[locale]/agents/page_client-reference-manifest.js +1 -1
  16. package/standalone/.next/server/app/[locale]/build-data/page.js +2 -1
  17. package/standalone/.next/server/app/[locale]/build-data/page.js.nft.json +1 -1
  18. package/standalone/.next/server/app/[locale]/build-data/page_client-reference-manifest.js +1 -1
  19. package/standalone/.next/server/app/[locale]/builds/[buildId]/coverage/page.js +2 -1
  20. package/standalone/.next/server/app/[locale]/builds/[buildId]/coverage/page.js.nft.json +1 -1
  21. package/standalone/.next/server/app/[locale]/builds/[buildId]/coverage/page_client-reference-manifest.js +1 -1
  22. package/standalone/.next/server/app/[locale]/builds/[buildId]/page.js +2 -1
  23. package/standalone/.next/server/app/[locale]/builds/[buildId]/page.js.nft.json +1 -1
  24. package/standalone/.next/server/app/[locale]/builds/[buildId]/page_client-reference-manifest.js +1 -1
  25. package/standalone/.next/server/app/[locale]/builds/page.js +2 -1
  26. package/standalone/.next/server/app/[locale]/builds/page.js.nft.json +1 -1
  27. package/standalone/.next/server/app/[locale]/builds/page_client-reference-manifest.js +1 -1
  28. package/standalone/.next/server/app/[locale]/codebases/[codebaseId]/page.js +2 -1
  29. package/standalone/.next/server/app/[locale]/codebases/[codebaseId]/page.js.nft.json +1 -1
  30. package/standalone/.next/server/app/[locale]/codebases/[codebaseId]/page_client-reference-manifest.js +1 -1
  31. package/standalone/.next/server/app/[locale]/codebases/page.js +2 -1
  32. package/standalone/.next/server/app/[locale]/codebases/page.js.nft.json +1 -1
  33. package/standalone/.next/server/app/[locale]/codebases/page_client-reference-manifest.js +1 -1
  34. package/standalone/.next/server/app/[locale]/codebases/repositories/[repositoryId]/page.js +2 -1
  35. package/standalone/.next/server/app/[locale]/codebases/repositories/[repositoryId]/page.js.nft.json +1 -1
  36. package/standalone/.next/server/app/[locale]/codebases/repositories/[repositoryId]/page_client-reference-manifest.js +1 -1
  37. package/standalone/.next/server/app/[locale]/comments/page.js +2 -1
  38. package/standalone/.next/server/app/[locale]/comments/page.js.nft.json +1 -1
  39. package/standalone/.next/server/app/[locale]/comments/page_client-reference-manifest.js +1 -1
  40. package/standalone/.next/server/app/[locale]/jira/cache/page.js +2 -1
  41. package/standalone/.next/server/app/[locale]/jira/cache/page.js.nft.json +1 -1
  42. package/standalone/.next/server/app/[locale]/jira/cache/page_client-reference-manifest.js +1 -1
  43. package/standalone/.next/server/app/[locale]/jira/cache/tickets/[issueKey]/page.js +2 -1
  44. package/standalone/.next/server/app/[locale]/jira/cache/tickets/[issueKey]/page.js.nft.json +1 -1
  45. package/standalone/.next/server/app/[locale]/jira/cache/tickets/[issueKey]/page_client-reference-manifest.js +1 -1
  46. package/standalone/.next/server/app/[locale]/jira/tickets/[issueKey]/page.js +2 -1
  47. package/standalone/.next/server/app/[locale]/jira/tickets/[issueKey]/page.js.nft.json +1 -1
  48. package/standalone/.next/server/app/[locale]/jira/tickets/[issueKey]/page_client-reference-manifest.js +1 -1
  49. package/standalone/.next/server/app/[locale]/jira/tickets/page.js +2 -1
  50. package/standalone/.next/server/app/[locale]/jira/tickets/page.js.nft.json +1 -1
  51. package/standalone/.next/server/app/[locale]/jira/tickets/page_client-reference-manifest.js +1 -1
  52. package/standalone/.next/server/app/[locale]/jobs/[jobId]/page.js +2 -1
  53. package/standalone/.next/server/app/[locale]/jobs/[jobId]/page.js.nft.json +1 -1
  54. package/standalone/.next/server/app/[locale]/jobs/[jobId]/page_client-reference-manifest.js +1 -1
  55. package/standalone/.next/server/app/[locale]/page.js +2 -1
  56. package/standalone/.next/server/app/[locale]/page.js.nft.json +1 -1
  57. package/standalone/.next/server/app/[locale]/page_client-reference-manifest.js +1 -1
  58. package/standalone/.next/server/app/[locale]/pull-requests/[owner]/[repository]/[number]/page.js +2 -1
  59. package/standalone/.next/server/app/[locale]/pull-requests/[owner]/[repository]/[number]/page.js.nft.json +1 -1
  60. package/standalone/.next/server/app/[locale]/pull-requests/[owner]/[repository]/[number]/page_client-reference-manifest.js +1 -1
  61. package/standalone/.next/server/app/[locale]/pull-requests/page.js +2 -1
  62. package/standalone/.next/server/app/[locale]/pull-requests/page.js.nft.json +1 -1
  63. package/standalone/.next/server/app/[locale]/pull-requests/page_client-reference-manifest.js +1 -1
  64. package/standalone/.next/server/app/[locale]/settings/page.js +2 -1
  65. package/standalone/.next/server/app/[locale]/settings/page.js.nft.json +1 -1
  66. package/standalone/.next/server/app/[locale]/settings/page_client-reference-manifest.js +1 -1
  67. package/standalone/.next/server/app/[locale]/skills/[skillId]/page.js +2 -1
  68. package/standalone/.next/server/app/[locale]/skills/[skillId]/page.js.nft.json +1 -1
  69. package/standalone/.next/server/app/[locale]/skills/[skillId]/page_client-reference-manifest.js +1 -1
  70. package/standalone/.next/server/app/[locale]/skills/groups/[groupId]/page.js +2 -1
  71. package/standalone/.next/server/app/[locale]/skills/groups/[groupId]/page.js.nft.json +1 -1
  72. package/standalone/.next/server/app/[locale]/skills/groups/[groupId]/page_client-reference-manifest.js +1 -1
  73. package/standalone/.next/server/app/[locale]/skills/groups/page.js +2 -1
  74. package/standalone/.next/server/app/[locale]/skills/groups/page.js.nft.json +1 -1
  75. package/standalone/.next/server/app/[locale]/skills/groups/page_client-reference-manifest.js +1 -1
  76. package/standalone/.next/server/app/[locale]/skills/page.js +2 -1
  77. package/standalone/.next/server/app/[locale]/skills/page.js.nft.json +1 -1
  78. package/standalone/.next/server/app/[locale]/skills/page_client-reference-manifest.js +1 -1
  79. package/standalone/.next/server/app/[locale]/skills/sync/[runId]/page.js +2 -1
  80. package/standalone/.next/server/app/[locale]/skills/sync/[runId]/page.js.nft.json +1 -1
  81. package/standalone/.next/server/app/[locale]/skills/sync/[runId]/page_client-reference-manifest.js +1 -1
  82. package/standalone/.next/server/app/[locale]/tools/page.js +2 -1
  83. package/standalone/.next/server/app/[locale]/tools/page.js.nft.json +1 -1
  84. package/standalone/.next/server/app/[locale]/tools/page_client-reference-manifest.js +1 -1
  85. package/standalone/.next/server/app/[locale]/usage/page.js +2 -1
  86. package/standalone/.next/server/app/[locale]/usage/page.js.nft.json +1 -1
  87. package/standalone/.next/server/app/[locale]/usage/page_client-reference-manifest.js +1 -1
  88. package/standalone/.next/server/app/[locale]/worktrees/[worktreeId]/page.js +2 -1
  89. package/standalone/.next/server/app/[locale]/worktrees/[worktreeId]/page.js.nft.json +1 -1
  90. package/standalone/.next/server/app/[locale]/worktrees/[worktreeId]/page_client-reference-manifest.js +1 -1
  91. package/standalone/.next/server/app/[locale]/worktrees/page.js +2 -1
  92. package/standalone/.next/server/app/[locale]/worktrees/page.js.nft.json +1 -1
  93. package/standalone/.next/server/app/[locale]/worktrees/page_client-reference-manifest.js +1 -1
  94. package/standalone/.next/server/app/_global-error.html +1 -1
  95. package/standalone/.next/server/app/_global-error.rsc +1 -1
  96. package/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  97. package/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  98. package/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  99. package/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  100. package/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  101. package/standalone/.next/server/app/_not-found.html +1 -1
  102. package/standalone/.next/server/app/_not-found.rsc +1 -1
  103. package/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  104. package/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  105. package/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  106. package/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  107. package/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  108. package/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  109. package/standalone/.next/server/app/api/build-artifact-uploads/[uploadId]/route.js +1 -1
  110. package/standalone/.next/server/app/api/build-artifact-uploads/[uploadId]/route.js.nft.json +1 -1
  111. package/standalone/.next/server/app/api/builds/[buildId]/artifacts/[artifactId]/manifest.plist/route/app-paths-manifest.json +3 -0
  112. package/standalone/.next/server/app/api/builds/[buildId]/artifacts/[artifactId]/manifest.plist/route/build-manifest.json +9 -0
  113. package/standalone/.next/server/app/api/builds/[buildId]/artifacts/[artifactId]/manifest.plist/route/server-reference-manifest.json +4 -0
  114. package/standalone/.next/server/app/api/builds/[buildId]/artifacts/[artifactId]/manifest.plist/route.js +11 -0
  115. package/standalone/.next/server/app/api/builds/[buildId]/artifacts/[artifactId]/manifest.plist/route.js.map +5 -0
  116. package/standalone/.next/server/app/api/builds/[buildId]/artifacts/[artifactId]/manifest.plist/route.js.nft.json +1 -0
  117. package/standalone/.next/server/app/api/builds/[buildId]/artifacts/[artifactId]/manifest.plist/route_client-reference-manifest.js +3 -0
  118. package/standalone/.next/server/app/api/builds/[buildId]/artifacts/[artifactId]/route.js +4 -3
  119. package/standalone/.next/server/app/api/builds/[buildId]/artifacts/[artifactId]/route.js.nft.json +1 -1
  120. package/standalone/.next/server/app/api/codebases/by-path/route.js.nft.json +1 -1
  121. package/standalone/.next/server/app/api/codebases/route.js.nft.json +1 -1
  122. package/standalone/.next/server/app/api/graphql/route.js.nft.json +1 -1
  123. package/standalone/.next/server/app/api/mcp/route.js.nft.json +1 -1
  124. package/standalone/.next/server/app/api/tools/call/route.js.nft.json +1 -1
  125. package/standalone/.next/server/app/api/tools/catalog/route.js.nft.json +1 -1
  126. package/standalone/.next/server/app/api/worktrees/[worktreeId]/diff-image/route.js +1 -1
  127. package/standalone/.next/server/app/api/worktrees/[worktreeId]/diff-image/route.js.nft.json +1 -1
  128. package/standalone/.next/server/app-paths-manifest.json +1 -0
  129. package/standalone/.next/server/chunks/07_e_builds_[buildId]_artifacts_[artifactId]_manifest_plist_route_actions_18mzaf3.js +3 -0
  130. package/standalone/.next/server/chunks/[root-of-the-server]__08mnmfs._.js +3 -0
  131. package/standalone/.next/server/chunks/[root-of-the-server]__0906ea6._.js +3 -0
  132. package/standalone/.next/server/chunks/{[root-of-the-server]__09skp6r._.js → [root-of-the-server]__0cz4ap5._.js} +1 -1
  133. package/standalone/.next/server/chunks/[root-of-the-server]__0nvcazp._.js +3 -0
  134. package/standalone/.next/server/chunks/{[root-of-the-server]__1wtng3p._.js → [root-of-the-server]__12807ia._.js} +1 -1
  135. package/standalone/.next/server/chunks/[root-of-the-server]__1csx222._.js +3 -0
  136. package/standalone/.next/server/chunks/{[root-of-the-server]__0zyqmd4._.js → [root-of-the-server]__1ix62p0._.js} +3 -3
  137. package/standalone/.next/server/chunks/[root-of-the-server]__1j-hk6b._.js +3 -0
  138. package/standalone/.next/server/chunks/{[root-of-the-server]__15aat79._.js → [root-of-the-server]__1j0u03u._.js} +1 -1
  139. package/standalone/.next/server/chunks/[root-of-the-server]__1qmvsu_._.js +3 -0
  140. package/standalone/.next/server/chunks/[root-of-the-server]__1w59u6o._.js +3 -0
  141. package/standalone/.next/server/chunks/{[root-of-the-server]__0-ypkf7._.js → [root-of-the-server]__1z-3x8k._.js} +1 -1
  142. package/standalone/.next/server/chunks/_0exkna-._.js +51 -1
  143. package/standalone/.next/server/chunks/_0jurkow._.js +1 -1
  144. package/standalone/.next/server/chunks/_0rx5rfm._.js +1 -1
  145. package/standalone/.next/server/chunks/_0tufgj0._.js +111 -61
  146. package/standalone/.next/server/chunks/_0w2eghf._.js +51 -1
  147. package/standalone/.next/server/chunks/_152rnkf._.js +3 -3
  148. package/standalone/.next/server/chunks/_16x77b_._.js +1 -1
  149. package/standalone/.next/server/chunks/_1dbqy8c._.js +3 -3
  150. package/standalone/.next/server/chunks/_1vrixpc._.js +3 -3
  151. package/standalone/.next/server/chunks/_1yfz-9u._.js +3 -3
  152. package/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_08x37wy.js +6 -0
  153. package/standalone/.next/server/chunks/node_modules_next_dist_esm_build_templates_app-route_0eghv0a.js +3 -0
  154. package/standalone/.next/server/chunks/ssr/[root-of-the-server]__08bbv6z._.js +1 -1
  155. package/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ckj6wg._.js +1 -1
  156. package/standalone/.next/server/chunks/ssr/[root-of-the-server]__0qy28ku._.js +3 -0
  157. package/standalone/.next/server/chunks/ssr/[root-of-the-server]__1potsqg._.js +1 -1
  158. package/standalone/.next/server/chunks/ssr/_0a1ligo._.js +1 -1
  159. package/standalone/.next/server/chunks/ssr/{_1n9rteq._.js → _1f5k6bj._.js} +2 -2
  160. package/standalone/.next/server/chunks/ssr/messages_de_json_[json]_cjs_1uig1ud._.js +1 -1
  161. package/standalone/.next/server/chunks/ssr/messages_en_json_[json]_cjs_206072-._.js +1 -1
  162. package/standalone/.next/server/chunks/ssr/messages_es_json_[json]_cjs_082yukd._.js +1 -1
  163. package/standalone/.next/server/chunks/ssr/messages_fr_json_[json]_cjs_0j6-w0i._.js +1 -1
  164. package/standalone/.next/server/chunks/ssr/node_modules_0obs0k7._.js +5 -0
  165. package/standalone/.next/server/chunks/ssr/node_modules_next_1ep9xf4._.js +3 -0
  166. package/standalone/.next/server/chunks/ssr/src_components_builds_build-detail-page_tsx_0q1lvps._.js +20 -10
  167. package/standalone/.next/server/functions-config-manifest.json +5 -2
  168. package/standalone/.next/server/middleware-build-manifest.js +3 -3
  169. package/standalone/.next/server/pages/404.html +1 -1
  170. package/standalone/.next/server/pages/500.html +1 -1
  171. package/standalone/.next/server/server-reference-manifest.js +1 -1
  172. package/standalone/.next/server/server-reference-manifest.json +1 -1
  173. package/standalone/.next/static/chunks/{1ut0xkaqsykm4.js → 0mq066ue0yufb.js} +1 -1
  174. package/standalone/.next/static/chunks/{041g9raf1naqv.js → 175269y15-grc.js} +1 -1
  175. package/standalone/.next/static/chunks/17t4ft9o1tqw3.js +35 -0
  176. package/standalone/.next/static/chunks/{3q0q6_ntq8aa5.js → 208k3moxxd_53.js} +1 -1
  177. package/standalone/.next/static/chunks/2zwijj9t6y7gn.js +7 -0
  178. package/standalone/.next/static/chunks/398uw5_4-ciaz.css +1 -0
  179. package/standalone/.next/static/chunks/{29zl8lgsa28tb.js → 3l2g83119oyl0.js} +1 -1
  180. package/standalone/src/services/builds/artifact-cache.test.ts +271 -0
  181. package/standalone/src/services/builds/artifact-cache.ts +272 -0
  182. package/standalone/src/services/builds/artifact-transfer.ts +2 -1
  183. package/standalone/src/services/builds/builds.service.ts +139 -56
  184. package/standalone/.next/server/chunks/[root-of-the-server]__02vqwey._.js +0 -3
  185. package/standalone/.next/server/chunks/[root-of-the-server]__0rwpsai._.js +0 -3
  186. package/standalone/.next/server/chunks/ssr/[root-of-the-server]__10-ftkj._.js +0 -3
  187. package/standalone/.next/server/chunks/ssr/node_modules_1n5939e._.js +0 -5
  188. package/standalone/.next/static/chunks/3p7wbgo7qd6_m.css +0 -1
  189. package/standalone/.next/static/chunks/3vg6y29m047x9.js +0 -31
  190. /package/standalone/.next/static/{ePu377E66yy0icQx3ykQJ → qUqJkVkzos1XoXFl7PSxx}/_buildManifest.js +0 -0
  191. /package/standalone/.next/static/{ePu377E66yy0icQx3ykQJ → qUqJkVkzos1XoXFl7PSxx}/_clientMiddlewareManifest.js +0 -0
  192. /package/standalone/.next/static/{ePu377E66yy0icQx3ykQJ → qUqJkVkzos1XoXFl7PSxx}/_ssgManifest.js +0 -0
@@ -53,7 +53,7 @@ ${i}
53
53
  ${i}
54
54
  ~~~`}},ua=class{constructor(){(0,nT.__publicField)(this,"nodeType","blockquote")}toMarkdown(e,t){if(!e.content||0===e.content.length)return"> ";let r=e.content.map(r=>{let i=t.options.registry?.getNodeConverter(r.type);return i?i.toMarkdown(r,{...t,depth:t.depth+1,parent:e}):""}).join("\n").split("\n").map(e=>""===e.trim()?">":`> ${e}`);if(e.attrs&&Object.keys(e.attrs).length>0){let t=r.join("\n");return`${t}<!-- adf:blockquote attrs='${JSON.stringify(e.attrs)}' -->`}return r.join("\n")}},un=class{constructor(){(0,nT.__publicField)(this,"nodeType","rule")}toMarkdown(e,t){return"---"}},us=class{constructor(){(0,nT.__publicField)(this,"nodeType","hardBreak")}toMarkdown(e,t){return" \n"}},uo=class{constructor(){(0,nT.__publicField)(this,"nodeType","mention")}toMarkdown(e,t){let{id:r,text:i,userType:a}=e.attrs||{},n=`adf://mention/${r||"unknown"}`,s=i||`@${r||"unknown"}`;if(e.attrs&&Object.keys(e.attrs).length>0){let t=`<!-- adf:mention attrs='${JSON.stringify(e.attrs)}' -->`;return`[${s}](${n})${t}`}return`[${s}](${n})`}},ul=class{constructor(){(0,nT.__publicField)(this,"nodeType","date")}toMarkdown(e,t){let{timestamp:r}=e.attrs||{};if(!r)return"[Date]";let i=new Date(parseInt(r));if(isNaN(i.getTime())){if(e.attrs&&Object.keys(e.attrs).length>0){let t=`<!-- adf:date attrs='${JSON.stringify(e.attrs)}' -->`;return`[Invalid Date]${t}`}return"[Invalid Date]"}let a=i.toISOString().split("T")[0];if(e.attrs&&Object.keys(e.attrs).length>0){let t=`<!-- adf:date attrs='${JSON.stringify(e.attrs)}' -->`;return`${a}${t}`}return a}},uc=class{constructor(){(0,nT.__publicField)(this,"nodeType","emoji")}toMarkdown(e,t){let{shortName:r,text:i}=e.attrs||{};if(i){if(e.attrs&&Object.keys(e.attrs).length>0){let t=`<!-- adf:emoji attrs='${JSON.stringify(e.attrs)}' -->`;return`${i}${t}`}return i}if(r){let t=r.startsWith(":")&&r.endsWith(":")?r:`:${r}:`;if(e.attrs&&Object.keys(e.attrs).length>0){let r=`<!-- adf:emoji attrs='${JSON.stringify(e.attrs)}' -->`;return`${t}${r}`}return t}return":emoji:"}},uu=class{constructor(){(0,nT.__publicField)(this,"nodeType","status")}toMarkdown(e,t){let{text:r,color:i}=e.attrs||{},a=r||"Status";return i&&"neutral"!==i?`{status:${a}|color:${i}}`:`{status:${a}}`}},ud=class{constructor(){(0,nT.__publicField)(this,"nodeType","inlineCard")}toMarkdown(e,t){let{url:r,data:i}=e.attrs||{};if(!r)return"[Card]";let a=i?.title||i?.name||"Card",n=`adf://card/${encodeURIComponent(r)}`;if(e.attrs&&Object.keys(e.attrs).length>0){let t=`<!-- adf:inlineCard attrs='${JSON.stringify(e.attrs)}' -->`;return`[${a}](${n})${t}`}return`[${a}](${n})`}},up=class{constructor(){(0,nT.__publicField)(this,"nodeType","mediaGroup")}toMarkdown(e,t){return(e.content||[]).map(e=>{let r=t.options.registry?.getNodeConverter(e.type);return r?r.toMarkdown(e,t):""}).filter(e=>e.length>0).join(" ")+"\n\n"}},um=class{constructor(){(0,nT.__publicField)(this,"nodeType","doc")}toMarkdown(e,t){let r=e.content||[];return t.convertChildren(r).trim()+"\n"}},uh=class{constructor(){(0,nT.__publicField)(this,"markType","strong")}toMarkdown(e,t,r){return t.attrs&&Object.keys(t.attrs).length>0?`**${e}**<!-- adf:strong attrs='${JSON.stringify(t.attrs)}' -->`:`**${e}**`}},uf=class{constructor(){(0,nT.__publicField)(this,"markType","em")}toMarkdown(e,t,r){return t.attrs&&Object.keys(t.attrs).length>0?`*${e}*<!-- adf:em attrs='${JSON.stringify(t.attrs)}' -->`:`*${e}*`}},ug=class{constructor(){(0,nT.__publicField)(this,"markType","code")}toMarkdown(e,t,r){return t.attrs&&Object.keys(t.attrs).length>0?`\`${e}\`<!-- adf:code attrs='${JSON.stringify(t.attrs)}' -->`:`\`${e}\``}},uy=class{constructor(){(0,nT.__publicField)(this,"markType","link")}toMarkdown(e,t,r){let i;if(!t.attrs?.href)return e;let{href:a,title:n,...s}=t.attrs;return i=n?`[${e}](${a} "${n}")`:`[${e}](${a})`,Object.keys(s).length>0&&(i+=`<!-- adf:link attrs='${JSON.stringify(s)}' -->`),i}},uv=class{constructor(){(0,nT.__publicField)(this,"markType","strike")}toMarkdown(e,t,r){return t.attrs&&Object.keys(t.attrs).length>0?`~~${e}~~<!-- adf:strike attrs='${JSON.stringify(t.attrs)}' -->`:`~~${e}~~`}},ub=class{constructor(){(0,nT.__publicField)(this,"markType","underline")}toMarkdown(e,t,r){let i=`<u>${e}</u>`;return t.attrs&&Object.keys(t.attrs).length>0?`${i}<!-- adf:underline attrs='${JSON.stringify(t.attrs)}' -->`:i}},uw=class{constructor(){(0,nT.__publicField)(this,"markType","textColor")}toMarkdown(e,t,r){if(!t.attrs?.color)return e;let{color:i,...a}=t.attrs,n=`<span style="color: ${i}">${e}</span>`;return Object.keys(a).length>0&&(n+=`<!-- adf:textColor attrs='${JSON.stringify(a)}' -->`),n}},ux=class{constructor(){(0,nT.__publicField)(this,"markType","backgroundColor")}toMarkdown(e,t,r){let{color:i}=t.attrs||{},a=`<mark style="background-color: ${i||"yellow"}">${e}</mark>`;if(t.attrs&&Object.keys(t.attrs).length>0){let e=`<!-- adf:backgroundColor attrs='${JSON.stringify(t.attrs)}' -->`;return`${a}${e}`}return a}},uk=class{constructor(){(0,nT.__publicField)(this,"markType","subsup")}toMarkdown(e,t,r){let i,{type:a}=t.attrs||{};if(i="sub"===a?`<sub>${e}</sub>`:`<sup>${e}</sup>`,t.attrs&&Object.keys(t.attrs).length>0){let e=`<!-- adf:subsup attrs='${JSON.stringify(t.attrs)}' -->`;return`${i}${e}`}return i}},u_=class{constructor(e={}){(0,nT.__publicField)(this,"registry"),(0,nT.__publicField)(this,"validator"),(0,nT.__publicField)(this,"options"),this.options={strict:!1,gfm:!0,frontmatter:!0,enableAdfExtensions:!0,maxDepth:5,enableLogging:!1,preserveWhitespace:!1,validateInput:!1,preserveUnknownNodes:!0,maxRetries:3,retryDelay:100,fallbackStrategy:"best-effort",...e},this.registry=new cA,this.validator=new cE,this.registerConverters()}convert(e){if(!e||"object"!=typeof e){if(this.options.strict)throw Error("Invalid ADF document: must be a non-null object");return""}if("doc"!==e.type&&this.options.strict)throw Error('Invalid ADF document: root node must be of type "doc"');try{let t=this.validator.validate(e);if(!t.valid&&this.options.strict)throw Error(`Invalid ADF structure: ${t.errors.map(e=>e.message).join(", ")}`);return this.convertAdfToMarkdown(e)}catch(e){if(this.options.strict)throw e;return this.options.enableLogging&&console.warn("ADF to Markdown conversion failed, returning empty string:",e),""}}convertWithValidation(e){let t=[],r=this.validator.validate(e);if(!r.valid){if(this.options.strict)throw Error(`Invalid ADF structure: ${r.errors.map(e=>e.message).join(", ")}`);t.push(...r.errors.map(e=>e.message))}try{return{markdown:this.convertAdfToMarkdown(e),warnings:t}}catch(e){if(this.options.strict)throw e;return t.push(`Conversion failed: ${e instanceof Error?e.message:"Unknown error"}`),{markdown:"",warnings:t}}}getStats(e){let t={nodeCount:0,hasAdfExtensions:!1,hasGfmFeatures:!1,supportedTypes:new Set,unsupportedTypes:new Set},r=e=>{t.nodeCount++;try{this.registry.getNodeConverter(e.type),t.supportedTypes.add(e.type)}catch{t.unsupportedTypes.add(e.type)}["panel","expand","mediaSingle","mediaGroup","mention","emoji","date","status"].includes(e.type)&&(t.hasAdfExtensions=!0),["table","tableRow","tableHeader","tableCell"].includes(e.type)&&(t.hasGfmFeatures=!0),e.content&&Array.isArray(e.content)&&e.content.forEach(r)};e.content&&e.content.forEach(r);let i=t.nodeCount<10?"simple":t.nodeCount<50?"moderate":"complex";return{nodeCount:t.nodeCount,hasAdfExtensions:t.hasAdfExtensions,hasGfmFeatures:t.hasGfmFeatures,complexity:i,supportedTypes:Array.from(t.supportedTypes),unsupportedTypes:Array.from(t.unsupportedTypes)}}registerConverters(){this.registry.registerNodes([new cY,new cX,new c0,new c1,new c4,new c3,new c2,new c6,new c9,new c8,new c5,new c7,new ue,new ut,new ur,new ui,new ua,new un,new us,new uo,new ul,new uc,new uu,new ud,new up,new um]),this.registry.registerMarks([new uh,new uf,new ug,new uy,new uv,new ub,new uw,new ux,new uk])}convertAdfToMarkdown(e){let t={convertChildren:e=>Array.isArray(e)?e.map(e=>{try{return this.registry.getNodeConverter(e.type).toMarkdown(e,t)}catch(t){return this.options.enableLogging&&console.warn(`Failed to convert node type "${e.type}":`,t),this.options.preserveUnknownNodes?`<!-- Unknown node: ${e.type} -->`:""}}).join(""):"",depth:0,options:{...this.options,registry:this.registry}};return e.content&&Array.isArray(e.content)?e.content.map(e=>{try{return this.registry.getNodeConverter(e.type).toMarkdown(e,t)}catch(t){return this.options.enableLogging&&console.warn(`Failed to convert node type "${e.type}":`,t),this.options.preserveUnknownNodes?`<!-- Unknown node: ${e.type} -->`:""}}).filter(e=>e.length>0).join("\n\n"):""}},u$=class{constructor(e={}){(0,nT.__publicField)(this,"options"),this.options={maxRetries:3,retryDelay:100,fallbackStrategy:"best-effort",onError:()=>{},onRecovery:()=>{},enableLogging:!1,...e}}async executeWithRecovery(e,t){let r,i={operation:"unknown",input:"",attempt:0,previousErrors:[],...t},a=[];for(let t=0;t<=this.options.maxRetries;t++){i.attempt=t;try{let r=await e();return t>0&&this.options.onRecovery&&this.options.onRecovery("retry-success",i),{success:!0,data:r,warnings:a}}catch(e){if(r=e,i.previousErrors.push(r),this.options.onError&&this.options.onError(r,i),this.options.enableLogging&&console.warn(`Attempt ${t+1} failed:`,r.message),this.isNonRetryableError(r))break;t<this.options.maxRetries&&await this.delay(this.options.retryDelay)}}return this.applyFallbackStrategy(r,i,a)}async recoverAdfToMarkdown(e,t,r){let i=[];try{if(e.content&&Array.isArray(e.content)){let t=[];for(let r of e.content)try{let e=await this.recoverNodeConversion(r,"adf-to-markdown");e.success&&e.data?t.push(e.data):(i.push(`Failed to convert node type: ${r.type}`),t.push(this.createNodeFallback(r,"markdown")))}catch(e){i.push(`Node conversion error: ${e}`),t.push(this.createNodeFallback(r,"markdown"))}let a=t.join("\n\n");return this.options.onRecovery&&this.options.onRecovery("node-by-node-recovery",r),{success:!0,data:a,strategy:"node-by-node-recovery",fallback:!0,warnings:i}}let t=this.createMinimalMarkdown(e);return i.push("Used minimal fallback conversion"),{success:!0,data:t,strategy:"minimal-fallback",fallback:!0,warnings:i}}catch(e){return{success:!1,error:e,warnings:i}}}async recoverMarkdownToAdf(e,t,r){let i=[];try{let t=this.splitMarkdownIntoSections(e),a=[];for(let e of t)try{let t=await this.parseMarkdownSection(e);t.success&&t.data?a.push(...t.data.content):(i.push(`Failed to parse section: ${e.substring(0,50)}...`),a.push(this.createTextFallback(e)))}catch(t){i.push(`Section parsing error: ${t}`),a.push(this.createTextFallback(e))}return this.options.onRecovery&&this.options.onRecovery("section-by-section-recovery",r),{success:!0,data:{version:1,type:"doc",content:a},strategy:"section-by-section-recovery",fallback:!0,warnings:i}}catch(r){let t={version:1,type:"doc",content:[this.createTextFallback(e)]};return i.push("Used text-only fallback conversion"),{success:!0,data:t,strategy:"text-fallback",fallback:!0,warnings:i}}}async applyFallbackStrategy(e,t,r){switch(this.options.fallbackStrategy){case"skip":return r.push("Operation skipped due to errors"),{success:!1,error:e,warnings:r};case"placeholder":let i=this.createPlaceholder(t);return r.push("Used placeholder due to errors"),{success:!0,data:i,strategy:"placeholder",fallback:!0,warnings:r};case"best-effort":return await this.attemptBestEffortRecovery(e,t,r);default:return{success:!1,error:e,warnings:r}}}async attemptBestEffortRecovery(e,t,r){try{if(t.operation.includes("adfToMarkdown"))return await this.recoverAdfToMarkdown(t.input,e,t);if(t.operation.includes("markdownToAdf"))return await this.recoverMarkdownToAdf(t.input,e,t);return r.push("Applied generic fallback recovery"),{success:!1,error:e,strategy:"generic-fallback",warnings:r}}catch(e){return{success:!1,error:e,warnings:r}}}isNonRetryableError(e){return e instanceof cR||e.message.includes("Invalid JSON")||e.message.includes("Syntax error")}delay(e){return new Promise(t=>setTimeout(t,e))}async recoverNodeConversion(e,t){try{if("adf-to-markdown"===t)return{success:!0,data:this.createNodeFallback(e,"markdown"),warnings:[]};return{success:!0,data:JSON.stringify(e),warnings:[]}}catch(e){return{success:!1,error:e,warnings:[]}}}createNodeFallback(e,t){if("markdown"!==t)return JSON.stringify(e,null,2);switch(e.type){case"paragraph":return e.content?this.extractTextFromNodes(e.content):"[Paragraph]";case"heading":let r=e.attrs?.level||1,i=e.content?this.extractTextFromNodes(e.content):"[Heading]";return"#".repeat(r)+" "+i;case"codeBlock":return"```\n[Code Block]\n```";case"panel":return`> [${e.attrs?.panelType||"info"} panel]`;default:return`[${e.type}]`}}extractTextFromNodes(e){return e.map(e=>"text"===e.type&&e.text?e.text:e.content?this.extractTextFromNodes(e.content):"").join("")}createMinimalMarkdown(e){let t=e.content?e.content.map(e=>this.createNodeFallback(e,"markdown")).join("\n\n"):"[No content]";return`# Document
55
55
 
56
- ${t}`}splitMarkdownIntoSections(e){let t=e.split(/(?=^#{1,6}\s)|(?:\n\s*\n)/m).filter(e=>e.trim().length>0);return t.length>0?t:[e]}async parseMarkdownSection(e){try{let t=[this.createTextFallback(e)];return{success:!0,data:{version:1,type:"doc",content:t},warnings:[]}}catch(e){return{success:!1,error:e,warnings:[]}}}createTextFallback(e){return{type:"paragraph",content:[{type:"text",text:e.trim()}]}}createPlaceholder(e){return e.operation.includes("adfToMarkdown")?`[Error converting ADF to Markdown: ${e.operation}]`:e.operation.includes("markdownToAdf")?{version:1,type:"doc",content:[{type:"paragraph",content:[{type:"text",text:`[Error converting Markdown to ADF: ${e.operation}]`}]}]}:`[Error in operation: ${e.operation}]`}},uI=class{constructor(e){(0,nT.__publicField)(this,"mdToAdfEngine"),(0,nT.__publicField)(this,"adfToMdEngine"),(0,nT.__publicField)(this,"options"),(0,nT.__publicField)(this,"errorRecovery"),(0,nT.__publicField)(this,"remarkProcessor"),(0,nT.__publicField)(this,"registry");try{this.options=e||{},this.mdToAdfEngine=new cQ(this.options),this.adfToMdEngine=new u_(this.options),this.errorRecovery=new u$({maxRetries:e?.maxRetries||3,retryDelay:e?.retryDelay||100,fallbackStrategy:e?.fallbackStrategy||"best-effort",enableLogging:e?.enableLogging||!1,onError:e?.onError,onRecovery:e?.onRecovery}),this.remarkProcessor=nW().use(op).use(ll,["yaml"]).use(cg).use(cI,{strict:e?.strict||!1}).use(o6),this.registry=new cA,this.registerConverters()}catch(e){throw new cC("Failed to initialize Parser","INIT_ERROR")}}adfToMarkdown(e,t){return t&&Object.keys(t).length>0?new u_({...this.options,...t}).convert(e):this.adfToMdEngine.convert(e)}async adfToMarkdownWithRecovery(e,t){let r=await this.errorRecovery.executeWithRecovery(()=>this.adfToMarkdown(e,t),{operation:"adfToMarkdown",input:e,nodeType:e.type});if(!r.success)throw r.error||Error("ADF to Markdown conversion failed");return r.data}markdownToAdf(e,t){return t&&Object.keys(t).length>0?new cQ({...this.options,...t}).convert(e):this.mdToAdfEngine.convert(e)}async markdownToAdfWithRecovery(e,t){let r=await this.errorRecovery.executeWithRecovery(()=>this.markdownToAdf(e,t),{operation:"markdownToAdf",input:e});if(!r.success)throw r.error||Error("Markdown to ADF conversion failed");return r.data}async markdownToAdfAsync(e,t){return await this.mdToAdfEngine.convertAsync(e)}async markdownToAdfAsyncWithRecovery(e,t){let r=await this.errorRecovery.executeWithRecovery(async()=>this.markdownToAdfAsync(e,t),{operation:"markdownToAdfAsync",input:e});if(!r.success)throw r.error||Error("Async Markdown to ADF conversion failed");return r.data}async validateMarkdownAsync(e){let t=await this.mdToAdfEngine.validate(e);return{valid:t.valid,errors:t.errors.map(e=>({message:e})),warnings:t.warnings}}async getStats(e){return await this.mdToAdfEngine.getStats(e)}stringify(e,t){return this.adfToMarkdown(e,t)}async stringifyAsync(e,t){return this.adfToMarkdownWithRecovery(e,t)}validateAdf(e){return new cE().validate(e)}validateMarkdown(e){return new cT().validate(e)}getErrorRecovery(){return this.errorRecovery}registerConverters(){this.registry.registerNodes([new cY,new cX,new c0,new c1,new c4,new c3,new c2,new c6,new c9,new c8,new c5,new c7,new ue,new ut,new ur,new ui,new ua,new un,new us,new uo,new ul,new uc,new uu,new ud,new up,new um]),this.registry.registerMarks([new uh,new uf,new ug,new uy,new uv,new ub,new uw,new ux,new uk])}convertAdfToMarkdown(e){return this.adfToMdEngine.convert(e)}convertMdastToAdf(e){return this.mdToAdfEngine.convert(e)}fallbackConversion(e){return this.mdToAdfEngine.convert(e)}countNodes(e){let t=0;for(let r of e)t++,r.content&&Array.isArray(r.content)&&(t+=this.countNodes(r.content));return t}postProcessAdfFenceBlocks(e){return e}parseAdfLanguageString(e,t){return{}}},uS=e.i(378731);let uE=[/^h[1-6]\.\s/m,/^bq\.\s/m,/\{code(?::[^}]+)?\}/i,/\{noformat\}/i,/\{\{[^}\n]+\}\}/,/^\|\|.+\|\|\s*$/m,/\[[^\]\n]+\|https?:\/\//i,/\[~[^\]\n]+\]/,/\[\^[^\]\n]+\]/,/![^!\n]+!/];function uT(e){return!(!e||"object"!=typeof e||Array.isArray(e))&&"doc"===e.type&&1===e.version&&Array.isArray(e.content)}function uC(e,t){return uS.default.to_markdown(e.replace(/\[~([^\]\n]+)\]/g,"@$1").replace(/\[\^([^\]\n]+)\]/g,"[Attachment: $1]").replace(/\[([A-Z][A-Z0-9_]*-\d+)\]/g,(e,r)=>t?`[${r}](${t}/browse/${r})`:`**${r}**`))}let uR=new uI;function uP(e,t){if(null==e)return null;let r=function(e){if(uT(e))return"ADF";let t="string"==typeof e?e:"";return uE.some(e=>e.test(t))?"JIRA_WIKI":"MARKDOWN"}(e),i="string"==typeof e?e:null==e?"":JSON.stringify(e,null,2),a="ADF"===r?function(e){try{return uR.adfToMarkdown(e)}catch{return function e(t){return t&&"object"==typeof t?["string"==typeof t.text?t.text:"",...Array.isArray(t.content)?t.content.map(e).filter(Boolean):[]].filter(Boolean).join("\n"):""}(e)}}(e):"JIRA_WIKI"===r?uC(i,t):i;return{format:r,raw:e,rawText:i,markdown:a,wikiMarkup:"JIRA_WIKI"===r?i:uS.default.to_jira(a)}}function uA(e){let t=e.value.trim(),r="JIRA_WIKI"===e.format?uC(t):t,i=uR.markdownToAdf(r);if(!uT(i))throw Error("The Jira text could not be converted to valid ADF");return i}let uD="default",uO=["summary","status","issuetype","priority","assignee","project","updated"],uj=[{window:"5m",milliseconds:3e5},{window:"10m",milliseconds:6e5},{window:"1h",milliseconds:36e5},{window:"24h",milliseconds:864e5}];function uN(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)}function uq(e){return uN(e)?e:{}}function uU(e){return Array.isArray(e)?e:[]}function uL(e){return"string"==typeof e&&e.length>0?e:null}function uF(e){return"number"==typeof e&&Number.isFinite(e)?e:null}function uM(e){let t=e.trim().toUpperCase();if(!/^[A-Z][A-Z0-9_]*-\d+$/.test(t))throw Error("Invalid Jira issue key");return t}function uB(e){if(null===e)return null;try{return JSON.parse(e)}catch{return null}}function uz(e){return uU(uB(e)).flatMap(e=>"string"==typeof e&&e.length>0?[e]:[])}function uK(e){return JSON.stringify(function e(t){return Array.isArray(t)?t.map(e):uN(t)?Object.fromEntries(Object.keys(t).sort().map(r=>[r,e(t[r])])):t}(e))}function uG(e){if(!uN(e))return null;let t=e.status??uq(e.response).status;return"number"==typeof t?t:null}function uH(e,t){let r=e instanceof Error?e.message:String(e);return(t?r.replaceAll(t,"[REDACTED]"):r).slice(0,1e3)}function uZ(e){return uL(uq(uq(e.fields).project).key)??(e.key?.split("-")[0]||"UNKNOWN")}function uV(e){let t=uq(e),r=uL(t.displayName);if(!r)return null;let i=uq(t.avatarUrls);return{accountId:uL(t.accountId),displayName:r,avatarUrl:uL(i["48x48"])??uL(i["32x32"])??uL(i["24x24"])}}function uJ(e){return uU(e).map(uq).map(e=>({id:uL(e.id),name:uL(e.name)??"Unknown"}))}function uW(e,t){let r=uq(e),i=uL(r.key);if(!i)return null;let a=uq(r.fields);return{relationship:t,key:i,summary:uL(a.summary)??i,status:uL(uq(a.status).name)}}function uQ(e){return{...e,kind:"BOARD"===e.kind?"BOARD":"JQL"}}function uY(e){return{source:e.source,stale:e.stale,fetchedAt:e.fetchedAt.toISOString()}}function uX(e){return 0===e.length?{source:"CACHE",stale:!1,fetchedAt:new Date(0).toISOString()}:{source:e.some(e=>"ERROR"===e.source)?"ERROR":e.some(e=>"LIVE"===e.source)?"LIVE":"CACHE",stale:e.some(e=>e.stale),fetchedAt:new Date(Math.max(...e.map(e=>e.fetchedAt.getTime()))).toISOString()}}function u0(e){let t=uq(e.fields),r=uq(t.status),i=uq(r.statusCategory),a=uq(t.assignee),n=uq(a.avatarUrls),s=uq(t.project),o=e.key??"UNKNOWN";return{id:e.id??o,key:o,summary:uL(t.summary)??o,statusId:uL(r.id)??uL(r.name)??"unknown",status:uL(r.name)??"Unknown",statusCategory:uL(i.key)??uL(i.name)??"unknown",issueType:uL(uq(t.issuetype).name),priority:uL(uq(t.priority).name),assignee:uL(a.displayName),assigneeAccountId:uL(a.accountId),assigneeAvatarUrl:uL(n["48x48"])??uL(n["32x32"]),projectKey:uL(s.key)??uZ(e),updatedAt:uL(t.updated)}}function u1(e){let t=e.toLowerCase();return"new"===t||t.includes("to do")?0:"indeterminate"===t||t.includes("progress")?1:"done"===t?2:3}let u4=new Set(["ALL","UNASSIGNED_OR_SELF","SELF_IN_PROGRESS"]);function u3(e){return u4.has(e)?e:"ALL"}class u2{inFlight=new Map;clients;lastPrunedAt=0;async getSettings(){let e=await (0,h.getPrismaClient)(),t=await e.jiraSettings.upsert({where:{id:uD},create:{id:uD,cacheTtlSeconds:300},update:{}});return{siteUrl:t.siteUrl,email:t.email,tokenConfigured:!!t.apiToken,cacheTtlSeconds:t.cacheTtlSeconds,updatedAt:t.updatedAt.toISOString()}}async saveSettings(e){let t=await (0,h.getPrismaClient)(),r=function(e){let t=new URL(e.trim());if("https:"!==t.protocol)throw Error("Jira Cloud site URL must use HTTPS");if(!t.hostname.toLowerCase().endsWith(".atlassian.net"))throw Error("Only Jira Cloud *.atlassian.net sites are supported");if(t.username||t.password||t.search||t.hash)throw Error("Jira site URL must not include credentials, query, or fragment");return t.origin}(e.siteUrl),i=e.email.trim();if(!/^\S+@\S+\.\S+$/.test(i))throw Error("A valid Jira email is required");let a=await t.jiraSettings.findUnique({where:{id:uD}}),n=e.apiToken?.trim()||a?.apiToken||null,s=!!(a?.siteUrl&&a.siteUrl!==r);if(s&&!e.resetSite)throw Error("Changing the Jira site requires resetSite=true");let o=a?.siteUrl!==r||a?.email!==i||a?.apiToken!==n;return await t.$transaction(async e=>{s&&await e.jiraProject.deleteMany(),o&&(await e.jiraCacheEntry.deleteMany(),await e.jiraCachedTicket.deleteMany()),await e.jiraSettings.upsert({where:{id:uD},create:{id:uD,siteUrl:r,email:i,apiToken:n,cacheTtlSeconds:300},update:{siteUrl:r,email:i,apiToken:n}})}),this.clients=void 0,this.getSettings()}async clearCredentials(){let e=await (0,h.getPrismaClient)();return await e.$transaction([e.jiraCacheEntry.deleteMany(),e.jiraCachedTicket.deleteMany(),e.jiraSettings.upsert({where:{id:uD},create:{id:uD,cacheTtlSeconds:300},update:{email:null,apiToken:null}})]),this.clients=void 0,this.getSettings()}async updateCacheTtl(e){if(!Number.isInteger(e)||e<1||e>1440)throw Error("Cache TTL must be an integer from 1 to 1440 minutes");let t=await (0,h.getPrismaClient)();return await t.jiraSettings.upsert({where:{id:uD},create:{id:uD,cacheTtlSeconds:60*e},update:{cacheTtlSeconds:60*e}}),this.getSettings()}async testConnection(){let e=await this.cachedCall({operation:"MYSELF",params:{},requestSummary:"Current Jira user",force:!0,allowStaleOnError:!1,fetcher:async()=>{let{version3:e}=await this.getClients();return e.myself.getCurrentUser()}});if(e.stale)throw Error("Jira connection test failed because the live request failed");let t=uq(e.value);return{accountId:uL(t.accountId),displayName:uL(t.displayName)??"Jira user",emailAddress:uL(t.emailAddress),cache:uY(e)}}async listProjects(){let e=await (0,h.getPrismaClient)();return(await e.jiraProject.findMany({include:{sources:{orderBy:[{position:"asc"},{createdAt:"asc"}]}},orderBy:[{position:"asc"},{createdAt:"asc"}]})).map(e=>({id:e.id,jiraId:e.jiraId,key:e.key,name:e.name,avatarUrl:e.avatarUrl,position:e.position,ticketAssignmentFilter:u3(e.ticketAssignmentFilter),hideCompletedTickets:e.hideCompletedTickets,completedStatusIds:uz(e.completedStatusIdsJson),branchNamingScript:e.branchNamingScript??nI,sources:e.sources.map(uQ)}))}async projectStatuses(e){let t=await (0,h.getPrismaClient)(),r=await t.jiraProject.findUnique({where:{id:e},select:{jiraId:!0,key:!0}});if(!r)throw Error("Jira project not found");let i=await this.cachedCall({operation:"PROJECT_STATUSES",params:{jiraId:r.jiraId},requestSummary:`Statuses for project ${r.key}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.projects.getAllStatuses(r.jiraId)}}),a=new Map;for(let e of uU(i.value).map(uq))for(let t of uU(e.statuses).map(uq)){let e=uL(t.id),r=uL(t.name);if(!e||!r||a.has(e))continue;let i=uq(t.statusCategory);a.set(e,{id:e,name:r,category:uL(i.key)??uL(i.name)??"unknown"})}return[...a.values()].sort((e,t)=>u1(e.category)-u1(t.category)||e.name.localeCompare(t.name))}async updateProjectDisplaySettings(e){if(!u4.has(e.ticketAssignmentFilter))throw Error("Invalid Jira ticket assignment filter");let t=[...new Set(e.completedStatusIds.map(e=>e.trim()).filter(Boolean))].slice(0,200),r=await (0,h.getPrismaClient)();return await r.jiraProject.update({where:{id:e.projectId},data:{ticketAssignmentFilter:e.ticketAssignmentFilter,hideCompletedTickets:e.hideCompletedTickets,completedStatusIdsJson:JSON.stringify(t)}}),this.listProjects()}async updateProjectBranchNaming(e,t){let r=await (0,h.getPrismaClient)(),i=await r.jiraProject.findUnique({where:{id:e},select:{key:!0}});if(!i)throw Error("Jira project not found");let a=await nE(t,i.key);return await r.jiraProject.update({where:{id:e},data:{branchNamingScript:a}}),this.listProjects()}async availableProjects(){let e=[],t=0;for(;;){let r=await this.cachedCall({operation:"PROJECTS",params:{startAt:t,maxResults:100},requestSummary:`Visible projects from ${t}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.projects.searchProjects({startAt:t,maxResults:100,orderBy:"name"})},itemCount:e=>uU(uq(e).values).length}),i=uq(r.value),a=uU(i.values).map(uq);e.push(...a.flatMap(e=>{let t=uL(e.id),r=uL(e.key),i=uL(e.name);if(!t||!r||!i)return[];let a=uq(e.avatarUrls);return[{jiraId:t,key:r,name:i,avatarUrl:uL(a["48x48"])??uL(a["32x32"])}]}));let n=uF(i.total)??e.length;if(0===a.length||e.length>=n)break;t+=a.length}return e}async addProject(e){let t=e.trim();if(!t)throw Error("Jira project ID is required");let r=uq((await this.cachedCall({operation:"PROJECT",params:{jiraId:t},requestSummary:`Project ${t}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.projects.getProject(t)}})).value),i=uL(r.key),a=uL(r.name),n=uL(r.id);if(!i||!a||!n)throw Error("Jira returned an incomplete project");let s=uq(r.avatarUrls),o=await (0,h.getPrismaClient)(),l=await o.jiraProject.aggregate({_max:{position:!0}});return await o.jiraProject.create({data:{id:(0,d.randomUUID)(),jiraId:n,key:i,name:a,avatarUrl:uL(s["48x48"])??uL(s["32x32"]),position:(l._max.position??-1)+1,branchNamingScript:nI}}),this.listProjects()}async removeProject(e){let t=await (0,h.getPrismaClient)(),r=(await t.jiraSource.findMany({where:{projectId:e},select:{id:!0}})).map(e=>e.id);return await t.$transaction(async t=>{r.length>0&&await t.jiraCacheEntry.deleteMany({where:{sourceId:{in:r}}}),await t.jiraProject.delete({where:{id:e}}),await t.jiraCachedTicket.deleteMany({where:{cacheEntries:{none:{}}}})}),this.listProjects()}async createSource(e){let t=await this.validateSource(e.kind,e.value),r=this.validateSourceName(e.name),i=await (0,h.getPrismaClient)();if(!await i.jiraProject.findUnique({where:{id:e.projectId}}))throw Error("Jira project not found");let a=await i.jiraSource.aggregate({where:{projectId:e.projectId},_max:{position:!0}});return await i.jiraSource.create({data:{id:(0,d.randomUUID)(),projectId:e.projectId,name:r,kind:e.kind,value:t.value,boardId:t.boardId,position:(a._max.position??-1)+1}}),this.listProjects()}async updateSource(e){let t=await this.validateSource(e.kind,e.value),r=this.validateSourceName(e.name),i=await (0,h.getPrismaClient)();return await i.$transaction([i.jiraCacheEntry.deleteMany({where:{sourceId:e.id}}),i.jiraSource.update({where:{id:e.id},data:{name:r,kind:e.kind,value:t.value,boardId:t.boardId}})]),this.listProjects()}async deleteSource(e){let t=await (0,h.getPrismaClient)();return await t.$transaction(async t=>{await t.jiraCacheEntry.deleteMany({where:{sourceId:e}}),await t.jiraSource.delete({where:{id:e}}),await t.jiraCachedTicket.deleteMany({where:{cacheEntries:{none:{}}}})}),this.listProjects()}async ticketBoard(e,t=!1){var r;let i,a,n,s=await (0,h.getPrismaClient)(),o=await s.jiraSource.findUnique({where:{id:e},include:{project:!0}});if(!o)throw Error("Jira source not found");let l="BOARD"===o.kind?await this.loadBoardSource(uQ(o),t):await this.loadJqlSource(uQ(o),t),c={ticketAssignmentFilter:u3(o.project.ticketAssignmentFilter),hideCompletedTickets:o.project.hideCompletedTickets,completedStatusIds:uz(o.project.completedStatusIdsJson)},u="ALL"===c.ticketAssignmentFilter?null:await this.currentAccountId();return r={source:uQ(o),...l},i=c.hideCompletedTickets?new Set(c.completedStatusIds):new Set,a=new Set(r.tickets.filter(e=>i.has(e.statusId)).map(e=>e.status)),n=r.tickets.filter(e=>{let t;return!i.has(e.statusId)&&("ALL"===c.ticketAssignmentFilter||("UNASSIGNED_OR_SELF"===c.ticketAssignmentFilter?null===e.assigneeAccountId||e.assigneeAccountId===u:null!==u&&e.assigneeAccountId===u&&("indeterminate"===(t=e.statusCategory.toLowerCase())||t.includes("progress"))))}),{...r,tickets:n,statusOrder:r.statusOrder.filter(e=>!a.has(e))}}async ticket(e,t=!1){let r=uM(e),i=await this.cachedCall({operation:"ISSUE",params:{issueKey:r,fields:"*all",expand:"names,schema"},requestSummary:`Issue ${r} with all fields`,force:t,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issues.getIssue({issueIdOrKey:r,fields:["*all"],expand:["names","schema"],updateHistory:!1})}});"LIVE"===i.source&&await this.storeDetail(i.entryId,i.value,i.fetchedAt);let a=[],n=[],s=0;for(;;){let e=await this.cachedCall({operation:"COMMENTS",params:{issueKey:r,startAt:s,maxResults:100},requestSummary:`Comments for ${r} from ${s}`,force:t,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issueComments.getComments({issueIdOrKey:r,startAt:s,maxResults:100,orderBy:"created"})},itemCount:e=>uU(uq(e).comments).length});a.push(e);let i=uq(e.value),o=uU(i.comments);n.push(...o);let l=uF(i.total)??n.length;if(0===o.length||n.length>=l)break;s+=o.length}let o=new Date(Math.min(...a.map(e=>e.fetchedAt.getTime())));await this.storeComments(r,n,o,a.map(e=>e.entryId));let l=await this.requireCredentials();return this.normalizeTicketDetail(i.value,n,l.siteUrl,uY(i),uX(a))}async assignableUsers(e,t=""){let r=uM(e),i=t.trim().slice(0,100),a=await this.cachedCall({operation:"ASSIGNABLE_USERS",params:{issueKey:r,query:i,maxResults:50},requestSummary:`Assignable users for ${r}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.userSearch.findAssignableUsers({issueKey:r,query:i,maxResults:50,recommend:!0})},itemCount:e=>uU(e).length});return await this.linkCacheEntryToIssue(r,a.entryId),uU(a.value).map(uV).filter(e=>null!==e)}async ticketTransitions(e){let t=uM(e),r=await this.cachedCall({operation:"ISSUE_TRANSITIONS",params:{issueKey:t,expand:"transitions.fields"},requestSummary:`Available transitions for ${t}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issues.getTransitions({issueIdOrKey:t,expand:"transitions.fields"})},itemCount:e=>uU(uq(e).transitions).length});return await this.linkCacheEntryToIssue(t,r.entryId),uU(uq(r.value).transitions).map(uq).filter(e=>!1!==e.isAvailable).flatMap(e=>{let t=uL(e.id),r=uL(e.name);if(!t||!r)return[];let i=uq(e.to),a=uq(i.statusCategory),n=Object.entries(uq(e.fields)).filter(([,e])=>!0===uq(e).required).map(([e,t])=>uL(uq(t).name)??e);return[{id:t,name:r,toStatusId:uL(i.id),toStatus:uL(i.name)??r,toStatusCategory:uL(a.key)??uL(a.name),hasScreen:!0===e.hasScreen,requiredFields:n}]})}async ticketEditFields(e){let t=uM(e),r=await this.cachedCall({operation:"ISSUE_EDIT_META",params:{issueKey:t},requestSummary:`Editable fields for ${t}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issues.getEditIssueMeta({issueIdOrKey:t})},itemCount:e=>Object.keys(uq(uq(e).fields)).length});return await this.linkCacheEntryToIssue(t,r.entryId),Object.entries(uq(uq(r.value).fields)).map(([e,t])=>{let r=uq(t);return{id:e,name:uL(r.name)??e,required:!0===r.required,schemaType:uL(uq(r.schema).type),allowedValues:uU(r.allowedValues).flatMap(e=>{if("string"==typeof e)return[{id:e,name:e}];let t=uq(e),r=uL(t.name)??uL(t.value)??uL(t.displayName)??uL(t.key);return r?[{id:uL(t.id)??uL(t.accountId)??uL(t.value)??r,name:r}]:[]})}}).sort((e,t)=>e.name.localeCompare(t.name))}async ticketChanges(e,t=50,r=0){let i=uM(e),a=this.validatePagination(t,r),n=await this.cachedCall({operation:"ISSUE_CHANGELOG",params:{issueKey:i,startAt:0,maxResults:1},requestSummary:`Changelog count for ${i}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issues.getChangeLogs({issueIdOrKey:i,startAt:0,maxResults:1})},itemCount:e=>uU(uq(e).values).length});await this.linkCacheEntryToIssue(i,n.entryId);let s=uF(uq(n.value).total)??0,o=Math.min(a.limit,Math.max(0,s-a.offset)),l=Math.max(0,s-a.offset-o);if(0===o)return{...a,total:s,items:[],cache:uY(n)};let c=await this.cachedCall({operation:"ISSUE_CHANGELOG",params:{issueKey:i,startAt:l,maxResults:o},requestSummary:`Changelog for ${i} from ${l}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issues.getChangeLogs({issueIdOrKey:i,startAt:l,maxResults:o})},itemCount:e=>uU(uq(e).values).length});await this.linkCacheEntryToIssue(i,c.entryId);let u=uU(uq(c.value).values).map(uq).reverse().map(e=>({id:uL(e.id)??(0,d.randomUUID)(),author:uV(e.author),createdAt:uL(e.created),items:uU(e.items).map(uq).map(e=>({field:uL(e.field)??"Field",fieldId:uL(e.fieldId),from:uL(e.fromString)??uL(e.from),to:uL(e.toString)??uL(e.to)}))}));return{...a,total:s,items:u,cache:uX([n,c])}}async ticketWorklogs(e,t=50,r=0){let i=uM(e),a=this.validatePagination(t,r),n=await this.cachedCall({operation:"ISSUE_WORKLOGS",params:{issueKey:i,startAt:0,maxResults:1},requestSummary:`Worklog count for ${i}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issueWorklogs.getIssueWorklog({issueIdOrKey:i,startAt:0,maxResults:1})},itemCount:e=>uU(uq(e).worklogs).length});await this.linkCacheEntryToIssue(i,n.entryId);let s=uF(uq(n.value).total)??0,o=Math.min(a.limit,Math.max(0,s-a.offset)),l=Math.max(0,s-a.offset-o);if(0===o)return{...a,total:s,items:[],cache:uY(n)};let c=await this.cachedCall({operation:"ISSUE_WORKLOGS",params:{issueKey:i,startAt:l,maxResults:o},requestSummary:`Worklogs for ${i} from ${l}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issueWorklogs.getIssueWorklog({issueIdOrKey:i,startAt:l,maxResults:o})},itemCount:e=>uU(uq(e).worklogs).length});await this.linkCacheEntryToIssue(i,c.entryId);let u=await this.requireCredentials(),p=uU(uq(c.value).worklogs).map(uq).reverse().map(e=>({id:uL(e.id)??(0,d.randomUUID)(),author:uV(e.author),comment:uP(e.comment??null,u.siteUrl),timeSpent:uL(e.timeSpent),timeSpentSeconds:uF(e.timeSpentSeconds),startedAt:uL(e.started),createdAt:uL(e.created),updatedAt:uL(e.updated)}));return{...a,total:s,items:p,cache:uX([n,c])}}async addComment(e,t){let r=uM(e);if(!t.value.trim())throw Error("Comment text is required");let i=uA(t);return this.mutateTicket(r,"ADD_COMMENT",async()=>{let{version3:e}=await this.getClients();await e.issueComments.addComment({issueIdOrKey:r,comment:i})})}async assignTicket(e,t){let r=uM(e),i=t?.trim()||null;return this.mutateTicket(r,"ASSIGN_ISSUE",async()=>{let{version3:e}=await this.getClients();await e.issues.assignIssue({issueIdOrKey:r,accountId:i})})}async transitionTicket(e,t){let r=uM(e),i=(await this.ticketTransitions(r)).find(e=>e.id===t);if(!i)throw Error("The Jira transition is not available");if(i.requiredFields.length>0)throw Error(`This transition requires fields that must be completed in Jira: ${i.requiredFields.join(", ")}`);return this.mutateTicket(r,"TRANSITION_ISSUE",async()=>{let{version3:e}=await this.getClients();await e.issues.doTransition({issueIdOrKey:r,transition:{id:i.id}})})}async updateTicket(e){let t=uM(e.issueKey),r=new Map((await this.ticketEditFields(t)).map(e=>[e.id,e])),i={},a=e=>{let t=r.get(e);if(!t)throw Error(`${e} is not editable on this ticket`);return t},n=t=>Object.prototype.hasOwnProperty.call(e,t);if(n("summary")){a("summary");let t=e.summary?.trim();if(!t)throw Error("Ticket summary is required");i.summary=t}if(n("description")){let t=a("description");if(null===e.description){if(t.required)throw Error("Description is required");i.description=null}else e.description&&(i.description=uA(e.description))}if(n("priorityId")){let t=a("priority"),r=e.priorityId?.trim()||null;if(!r&&t.required)throw Error("Priority is required");if(r&&t.allowedValues.length>0&&!t.allowedValues.some(e=>e.id===r))throw Error("The selected priority is not available");i.priority=r?{id:r}:null}n("labels")&&(a("labels"),i.labels=[...new Set((e.labels??[]).map(e=>e.trim()).filter(Boolean))]);let s=(t,r)=>{if(!n(t))return;let s=a(r),o=[...new Set(e[t]??[])];if(s.allowedValues.length>0&&o.some(e=>!s.allowedValues.some(t=>t.id===e)))throw Error(`A selected ${s.name} value is not available`);i[r]=o.map(e=>({id:e}))};if(s("componentIds","components"),s("fixVersionIds","fixVersions"),s("affectedVersionIds","versions"),n("dueDate")){let t=a("duedate"),r=e.dueDate?.trim()||null;if(r&&!/^\d{4}-\d{2}-\d{2}$/.test(r))throw Error("Due date must use YYYY-MM-DD");if(!r&&t.required)throw Error("Due date is required");i.duedate=r}if(0===Object.keys(i).length)throw Error("At least one editable Jira field is required");return this.mutateTicket(t,"EDIT_ISSUE",async()=>{let{version3:e}=await this.getClients();await e.issues.editIssue({issueIdOrKey:t,fields:i})})}async branchTicket(e){let t=uM(e),r=t.replace(/-\d+$/,""),i=await (0,h.getPrismaClient)(),a=await i.jiraProject.findUnique({where:{key:r},select:{key:!0,branchNamingScript:!0}});if(!a)throw Error(`Jira project ${r} is not managed; add it in Manage Jira projects and sources`);let n=await this.cachedCall({operation:"ISSUE_BRANCH",params:{issueKey:t,fields:["summary","issuetype","project"]},requestSummary:`Branch details for ${t}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issues.getIssue({issueIdOrKey:t,fields:["summary","issuetype","project"],updateHistory:!1})}});await this.linkCacheEntryToIssue(t,n.entryId);let s=uq(n.value.fields);if((uL(uq(s.project).key)??uZ(n.value))!==a.key)throw Error(`Jira ticket ${t} does not belong to project ${a.key}`);return{ticketKey:n.value.key??t,ticketTitle:uL(s.summary)??t,ticketType:uL(uq(s.issuetype).name),projectKey:a.key,branchNamingScript:a.branchNamingScript??nI}}async clearCache(){let e=await (0,h.getPrismaClient)();return await e.$transaction([e.jiraCacheEntry.deleteMany(),e.jiraCachedTicket.deleteMany()]),!0}async deleteCachedTicket(e){return await this.invalidateIssueCaches(uM(e)),!0}async invalidateIssueCaches(e){let t=await (0,h.getPrismaClient)(),r=await t.jiraCacheEntryIssue.findMany({where:{issueKey:e},select:{cacheEntryId:!0}});await t.$transaction(async t=>{r.length>0&&await t.jiraCacheEntry.deleteMany({where:{id:{in:r.map(e=>e.cacheEntryId)}}}),await t.jiraCachedTicket.deleteMany({where:{issueKey:e}})})}async refreshCachedTicket(e){let t=await (0,h.getPrismaClient)(),r=await t.jiraCacheEntryIssue.findMany({where:{issueKey:e},select:{cacheEntryId:!0}});return r.length>0&&await t.jiraCacheEntry.deleteMany({where:{id:{in:r.map(e=>e.cacheEntryId)}}}),this.ticket(e,!0)}async listCachedTickets(e=50,t=0){let r=this.validatePagination(e,t),i=await (0,h.getPrismaClient)(),[a,n,s]=await Promise.all([i.jiraCachedTicket.findMany({take:r.limit,skip:r.offset,orderBy:{updatedAt:"desc"}}),i.jiraCachedTicket.count(),this.getSettings()]);return{...r,total:n,items:a.map(e=>this.cachedTicketView(e,s.cacheTtlSeconds))}}async cachedTicket(e){let t=await (0,h.getPrismaClient)(),[r,i]=await Promise.all([t.jiraCachedTicket.findUnique({where:{issueKey:e},include:{cacheEntries:{include:{cacheEntry:!0}}}}),this.getSettings()]);return r?{...this.cachedTicketView(r,i.cacheTtlSeconds),summaryData:uB(r.summaryJson),detailData:uB(r.detailJson),commentsData:uB(r.commentsJson),cacheEntries:r.cacheEntries.map(e=>({id:e.cacheEntry.id,operation:e.cacheEntry.operation,fetchedAt:e.cacheEntry.fetchedAt.toISOString()})).sort((e,t)=>t.fetchedAt.localeCompare(e.fetchedAt))}:null}async listApiCalls(e=50,t=0){let r=this.validatePagination(e,t);await this.pruneLogs();let i=await (0,h.getPrismaClient)(),[a,n]=await Promise.all([i.jiraApiCallLog.findMany({take:r.limit,skip:r.offset,orderBy:{createdAt:"desc"}}),i.jiraApiCallLog.count()]);return{...r,total:n,items:a.map(e=>({id:e.id,operation:e.operation,requestSummary:e.requestSummary,source:e.source,durationMs:e.durationMs,statusCode:e.statusCode,error:e.error,itemCount:e.itemCount,servedStale:e.servedStale,createdAt:e.createdAt.toISOString()}))}}async cacheMetrics(){await this.pruneLogs();let e=await (0,h.getPrismaClient)(),t=Date.now(),r=await e.jiraApiCallLog.findMany({where:{createdAt:{gte:new Date(t-uj.at(-1).milliseconds)}},orderBy:{createdAt:"asc"}});return{windows:uj.map(e=>this.metricWindow(e.window,r.filter(r=>r.createdAt.getTime()>=t-e.milliseconds))),operations:[...new Set(r.map(e=>e.operation))].sort().map(e=>({operation:e,windows:uj.map(i=>this.metricWindow(i.window,r.filter(r=>r.operation===e&&r.createdAt.getTime()>=t-i.milliseconds)))}))}}async requireCredentials(){let e=await (0,h.getPrismaClient)(),t=await e.jiraSettings.findUnique({where:{id:uD}});if(!t?.siteUrl||!t.email||!t.apiToken)throw Error("Configure the Jira site, email, and API token in Settings first");return{siteUrl:t.siteUrl,email:t.email,apiToken:t.apiToken,cacheTtlSeconds:t.cacheTtlSeconds}}async getClients(){let e=await this.requireCredentials(),t=(0,d.createHash)("sha256").update(`${e.siteUrl}\0${e.email}\0${e.apiToken}`).digest("hex");if(this.clients?.key===t)return this.clients;let r={host:e.siteUrl,authentication:{basic:{email:e.email,apiToken:e.apiToken}},baseRequestConfig:{timeout:15e3}};return this.clients={key:t,version3:new nv(r),agile:new iU(r)},this.clients}async currentAccountId(){let e=uL(uq((await this.cachedCall({operation:"MYSELF",params:{},requestSummary:"Current Jira user",fetcher:async()=>{let{version3:e}=await this.getClients();return e.myself.getCurrentUser()}})).value).accountId);if(!e)throw Error("Jira did not return the current user ID");return e}async linkCacheEntryToIssue(e,t){let r=await (0,h.getPrismaClient)();await r.$transaction(async r=>{await r.jiraCachedTicket.upsert({where:{issueKey:e},create:{issueKey:e,projectKey:e.replace(/-\d+$/,"")},update:{}}),await r.jiraCacheEntryIssue.upsert({where:{cacheEntryId_issueKey:{cacheEntryId:t,issueKey:e}},create:{cacheEntryId:t,issueKey:e},update:{}})})}async mutateTicket(e,t,r){let i=await this.requireCredentials(),a=Date.now();try{await r(),await this.logCall({operation:t,requestSummary:`${t.replaceAll("_"," ")} for ${e}`,source:"LIVE",durationMs:Date.now()-a})}catch(n){let r=uH(n,i.apiToken);throw await this.logCall({operation:t,requestSummary:`${t.replaceAll("_"," ")} for ${e}`,source:"ERROR",durationMs:Date.now()-a,statusCode:uG(n),error:r}),Error(r)}await this.invalidateIssueCaches(e);try{return await this.ticket(e,!0)}catch(e){throw Error(`Jira accepted the update, but refreshed ticket details could not be loaded: ${uH(e,i.apiToken)}`)}}cacheKey(e,t,r){return(0,d.createHash)("sha256").update(uK({siteUrl:e,operation:t,params:r})).digest("hex")}async cachedCall(e){let t=await this.requireCredentials(),r=await (0,h.getPrismaClient)(),i=this.cacheKey(t.siteUrl,e.operation,e.params),a=Date.now(),n=await r.jiraCacheEntry.findUnique({where:{cacheKey:i}}),s=null!==n&&Date.now()-n.fetchedAt.getTime()<1e3*t.cacheTtlSeconds;if(!e.force&&s)return await this.logCall({operation:e.operation,requestSummary:e.requestSummary,source:"CACHE",durationMs:Date.now()-a,itemCount:e.itemCount?.(uB(n.responseJson))??null,sourceId:e.sourceId}),{value:uB(n.responseJson),source:"CACHE",stale:!1,fetchedAt:n.fetchedAt,entryId:n.id};let o=this.inFlight.get(i);if(o){let t=await o;return await this.logCall({operation:e.operation,requestSummary:`${e.requestSummary} (coalesced)`,source:"CACHE",durationMs:Date.now()-a,itemCount:e.itemCount?.(t.value)??null,sourceId:e.sourceId}),{...t,source:"CACHE"}}let l=(async()=>{try{let t=await e.fetcher(),n=new Date,s=await r.jiraCacheEntry.upsert({where:{cacheKey:i},create:{id:(0,d.randomUUID)(),cacheKey:i,operation:e.operation,paramsJson:uK(e.params),responseJson:JSON.stringify(t),fetchedAt:n,sourceId:e.sourceId??null},update:{operation:e.operation,paramsJson:uK(e.params),responseJson:JSON.stringify(t),fetchedAt:n,sourceId:e.sourceId??null}});return await this.logCall({operation:e.operation,requestSummary:e.requestSummary,source:"LIVE",durationMs:Date.now()-a,itemCount:e.itemCount?.(t)??null,sourceId:e.sourceId}),{value:t,source:"LIVE",stale:!1,fetchedAt:n,entryId:s.id}}catch(i){let r=null!==n&&!1!==e.allowStaleOnError;if(await this.logCall({operation:e.operation,requestSummary:e.requestSummary,source:"ERROR",durationMs:Date.now()-a,statusCode:uG(i),error:uH(i,t.apiToken),servedStale:r,sourceId:e.sourceId}),r)return{value:uB(n.responseJson),source:"ERROR",stale:!0,fetchedAt:n.fetchedAt,entryId:n.id};throw Error(uH(i,t.apiToken))}})();this.inFlight.set(i,l);try{return await l}finally{this.inFlight.delete(i)}}async logCall(e){let t=await (0,h.getPrismaClient)();await t.jiraApiCallLog.create({data:{id:(0,d.randomUUID)(),operation:e.operation,requestSummary:e.requestSummary.slice(0,1e3),source:e.source,durationMs:Math.max(0,Math.round(e.durationMs)),statusCode:e.statusCode??null,error:e.error??null,itemCount:e.itemCount??null,servedStale:e.servedStale??!1,sourceId:e.sourceId??null}})}validateSourceName(e){let t=e.trim();if(!t||t.length>100)throw Error("Source name must be 1 to 100 characters");return t}async validateSource(e,t){let r=t.trim();if(!r)throw Error("BOARD"===e?"Board URL is required":"JQL is required");if("JQL"===e)return await this.cachedCall({operation:"JQL_VALIDATE",params:{jql:r},requestSummary:`Validate JQL: ${r}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issueSearch.searchForIssuesUsingJqlEnhancedSearch({jql:r,maxResults:1,fields:["key"],failFast:!0})}}),{value:r,boardId:null};let i=function(e,t){let r=new URL(e.trim());if(r.origin!==new URL(t).origin)throw Error("Board URL must belong to the configured Jira site");let i=r.pathname.match(/\/boards\/(\d+)(?:\/|$)/i),a=r.searchParams.get("rapidView"),n=Number(i?.[1]??a);if(!Number.isSafeInteger(n)||n<=0)throw Error("Board URL must contain a Jira board ID");return{boardId:n,normalizedUrl:r.toString()}}(r,(await this.requireCredentials()).siteUrl);return await this.cachedCall({operation:"BOARD",params:{boardId:i.boardId},requestSummary:`Board ${i.boardId}`,fetcher:async()=>{let{agile:e}=await this.getClients();return e.board.getBoard({boardId:i.boardId})}}),{value:i.normalizedUrl,boardId:i.boardId}}async loadJqlSource(e,t){let r,i=[],a=[],n=[],s=!1;do{let o=Math.min(100,1e3-i.length),l=await this.cachedCall({operation:"JQL_SEARCH",params:{jql:e.value,nextPageToken:r??null,maxResults:o,fields:uO},requestSummary:`JQL ${e.name}${r?" next page":""}`,sourceId:e.id,force:t,fetcher:async()=>{let{version3:t}=await this.getClients();return t.issueSearch.searchForIssuesUsingJqlEnhancedSearch({jql:e.value,nextPageToken:r,maxResults:o,fields:uO})},itemCount:e=>e.issues?.length??0});a.push(l);let c=l.value.issues??[];i.push(...c),n.push(...l.value.warningMessages??[]),"LIVE"===l.source&&await this.storeSummaries(l.entryId,c,l.fetchedAt),r=l.value.nextPageToken,i.length>=1e3&&r&&(s=!0)}while(r&&i.length<1e3)return this.buildBoardResult(i,a,n,s)}async loadBoardSource(e,t){if(!e.boardId)throw Error("Saved board source has no board ID");let r=await this.cachedCall({operation:"BOARD",params:{boardId:e.boardId},requestSummary:`Board ${e.boardId}`,sourceId:e.id,force:t,fetcher:async()=>{let{agile:t}=await this.getClients();return t.board.getBoard({boardId:e.boardId})}}),i=await this.cachedCall({operation:"BOARD_CONFIGURATION",params:{boardId:e.boardId},requestSummary:`Board ${e.boardId} configuration`,sourceId:e.id,force:t,fetcher:async()=>{let{agile:t}=await this.getClients();return t.board.getConfiguration({boardId:e.boardId})}}),a=[r,i],n=[],s=[],o=!1;if("scrum"===(uL(r.value.type)??"").toLowerCase()){let r=await this.cachedCall({operation:"SPRINTS",params:{boardId:e.boardId,state:"active"},requestSummary:`Active sprints for board ${e.boardId}`,sourceId:e.id,force:t,fetcher:async()=>{let{agile:t}=await this.getClients();return t.board.getAllSprints({boardId:e.boardId,state:"active",startAt:0,maxResults:100})},itemCount:e=>uU(e.values).length});a.push(r);let i=uU(r.value.values).map(uq);for(let r of(0===i.length&&s.push("This Scrum board has no active sprint."),i)){let i=uF(r.id);if(!i||n.length>=1e3)continue;let l=await this.loadAgileIssues("SPRINT_ISSUES",e,t,(e,t)=>({sprintId:i,startAt:e,maxResults:t,fields:uO}),async e=>{let{agile:t}=await this.getClients();return t.sprint.getIssuesForSprint(e)},n.length);n.push(...l.issues),a.push(...l.results),s.push(...l.warnings),o||=l.truncated}}else{let r=await this.loadAgileIssues("BOARD_ISSUES",e,t,(t,r)=>({boardId:e.boardId,startAt:t,maxResults:r,fields:uO}),async e=>{let{agile:t}=await this.getClients();return t.board.getIssuesForBoard(e)},0);n.push(...r.issues),a.push(...r.results),s.push(...r.warnings),o=r.truncated}let l=[...new Map(n.map(e=>[e.key??e.id,e])).values()],c=new Map;return uU(uq(i.value.columnConfig).columns).map(uq).forEach((e,t)=>{uU(e.statuses).map(uq).forEach(e=>{let r=uL(e.id);r&&c.set(r,t)})}),this.buildBoardResult(l,a,s,o,c)}async loadAgileIssues(e,t,r,i,a,n){let s=[],o=[],l=[],c=0,u=1/0,d=!1;for(;c<u&&s.length+n<1e3;){let d=i(c,Math.min(100,1e3-n-s.length)),p=await this.cachedCall({operation:e,params:d,requestSummary:`${e.replaceAll("_"," ")} from ${c}`,sourceId:t.id,force:r,fetcher:()=>a(d),itemCount:e=>e.issues?.length??0});o.push(p);let m=p.value.issues??[];if(s.push(...m),l.push(...p.value.warningMessages??[]),"LIVE"===p.source&&await this.storeSummaries(p.entryId,m,p.fetchedAt),u=p.value.total??s.length,0===m.length)break;c+=m.length}return s.length+n>=1e3&&c<u&&(d=!0),{issues:s,results:o,warnings:l,truncated:d}}buildBoardResult(e,t,r,i,a){let n=e.slice(0,1e3).map(u0),s=[...new Map(n.map(e=>[e.status,e])).values()];return s.sort((e,t)=>{let r=a?.get(e.statusId),i=a?.get(t.statusId);return void 0!==r||void 0!==i?(r??Number.MAX_SAFE_INTEGER)-(i??Number.MAX_SAFE_INTEGER):u1(e.statusCategory)-u1(t.statusCategory)||e.status.localeCompare(t.status)}),{tickets:n,statusOrder:s.map(e=>e.status),cache:uX(t),truncated:i,warnings:[...new Set(r)]}}async storeSummaries(e,t,r){let i=await (0,h.getPrismaClient)();await i.$transaction(async i=>{for(let e of t)e.key&&await i.jiraCachedTicket.upsert({where:{issueKey:e.key},create:{issueKey:e.key,projectKey:uZ(e),summaryJson:JSON.stringify(e),summaryFetchedAt:r},update:{projectKey:uZ(e),summaryJson:JSON.stringify(e),summaryFetchedAt:r}});await i.jiraCacheEntryIssue.deleteMany({where:{cacheEntryId:e}});let a=[...new Set(t.map(e=>e.key).filter(Boolean))];a.length>0&&await i.jiraCacheEntryIssue.createMany({data:a.map(t=>({cacheEntryId:e,issueKey:t}))})})}async storeDetail(e,t,r){if(!t.key)throw Error("Jira detail response did not include an issue key");let i=await (0,h.getPrismaClient)();await i.$transaction(async i=>{await i.jiraCachedTicket.upsert({where:{issueKey:t.key},create:{issueKey:t.key,projectKey:uZ(t),detailJson:JSON.stringify(t),detailFetchedAt:r},update:{projectKey:uZ(t),detailJson:JSON.stringify(t),detailFetchedAt:r}}),await i.jiraCacheEntryIssue.upsert({where:{cacheEntryId_issueKey:{cacheEntryId:e,issueKey:t.key}},create:{cacheEntryId:e,issueKey:t.key},update:{}})})}async storeComments(e,t,r,i){let a=await (0,h.getPrismaClient)();await a.$transaction(async a=>{for(let n of(await a.jiraCachedTicket.upsert({where:{issueKey:e},create:{issueKey:e,projectKey:e.split("-")[0]??"UNKNOWN",commentsJson:JSON.stringify(t),commentsFetchedAt:r},update:{commentsJson:JSON.stringify(t),commentsFetchedAt:r}}),i))await a.jiraCacheEntryIssue.upsert({where:{cacheEntryId_issueKey:{cacheEntryId:n,issueKey:e}},create:{cacheEntryId:n,issueKey:e},update:{}})})}normalizeTicketDetail(e,t,r,i,a){let n=u0(e),s=uq(e.fields),o=uq(e.names),l=uq(e.schema),c=[];for(let e of uU(s.issuelinks).map(uq)){let t=uq(e.type),r=uW(e.outwardIssue,uL(t.outward)??"relates to"),i=uW(e.inwardIssue,uL(t.inward)??"relates to");r&&c.push(r),i&&c.push(i)}let u=uW(s.parent,"parent"),p=uU(s.subtasks).map(e=>uW(e,"subtask")).filter(e=>null!==e),m=uU(s.sprint).concat(uU(s.closedSprints)).map(uq).map(e=>uL(e.name)).filter(e=>!!e),h=t.map(uq).map(e=>({id:uL(e.id)??(0,d.randomUUID)(),author:uV(e.author),body:e.body??null,content:uP(e.body??null,r),createdAt:uL(e.created),updatedAt:uL(e.updated)}));return{...n,jiraUrl:`${r}/browse/${n.key}`,description:s.description??null,descriptionContent:uP(s.description??null,r),reporter:uV(s.reporter),creator:uV(s.creator),labels:uU(s.labels).filter(e=>"string"==typeof e),components:uJ(s.components),fixVersions:uJ(s.fixVersions),affectedVersions:uJ(s.versions),sprintNames:[...new Set(m)],parent:u,subtasks:p,issueLinks:c,attachments:uU(s.attachment).map(uq).map(e=>({id:uL(e.id)??(0,d.randomUUID)(),filename:uL(e.filename)??"Attachment",contentUrl:uL(e.content),mimeType:uL(e.mimeType),size:uF(e.size),author:uV(e.author),createdAt:uL(e.created)})),comments:h,createdAt:uL(s.created),dueAt:uL(s.duedate),resolvedAt:uL(s.resolutiondate),timeTracking:s.timetracking??null,allFields:Object.entries(s).map(([e,t])=>{let i=uq(l[e]),a="string"==typeof t||uN(t)&&"doc"===t.type?uP(t,r):null;return{id:e,name:uL(o[e])??e,schemaType:uL(i.type),custom:!0===i.custom||e.startsWith("customfield_"),value:t??null,content:a}}).sort((e,t)=>e.name.localeCompare(t.name)),cache:i,commentsCache:a}}cachedTicketView(e,t){let r=u0(uq(uB(e.detailJson)??uB(e.summaryJson))),i=e.detailJson&&e.commentsJson?"FULL":e.detailJson?"DETAIL":"SUMMARY",a=[e.summaryFetchedAt,e.detailFetchedAt,e.commentsFetchedAt].filter(e=>null!==e).some(e=>Date.now()-e.getTime()>=1e3*t);return{issueKey:e.issueKey,projectKey:e.projectKey,summary:r.summary,status:"Unknown"===r.status?null:r.status,coverage:i,stale:a,summaryFetchedAt:e.summaryFetchedAt?.toISOString()??null,detailFetchedAt:e.detailFetchedAt?.toISOString()??null,commentsFetchedAt:e.commentsFetchedAt?.toISOString()??null,updatedAt:e.updatedAt.toISOString()}}validatePagination(e,t){if(!Number.isInteger(e)||e<1||e>100)throw Error("Pagination limit must be from 1 to 100");if(!Number.isInteger(t)||t<0)throw Error("Pagination offset must be non-negative");return{limit:e,offset:t}}metricWindow(e,t){return{window:e,total:t.length,live:t.filter(e=>"LIVE"===e.source).length,cache:t.filter(e=>"CACHE"===e.source).length,errors:t.filter(e=>"ERROR"===e.source).length,averageMs:0===t.length?0:Math.round(t.reduce((e,t)=>e+t.durationMs,0)/t.length)}}async pruneLogs(){let e=Date.now();if(e-this.lastPrunedAt<36e5)return;this.lastPrunedAt=e;let t=await (0,h.getPrismaClient)();await t.jiraApiCallLog.deleteMany({where:{createdAt:{lt:new Date(e-2592e6)}}})}}e.s(["JiraService",0,u2],126223),e.s([],151666)},984179,e=>{"use strict";let t=new Set(["QUEUED","PREPARING","RUNNING"]);e.s(["buildOutOfDate",0,function(e){let r;if(t.has(e.status)||!e.worktree||(e.worktree._count?.builds??0)>0||e.finishedAt&&(!e.worktree.lastCheckedAt||e.worktree.lastCheckedAt<e.finishedAt))return!1;try{r=JSON.parse(e.snapshotJson)}catch{return!1}if(!r||"object"!=typeof r||Array.isArray(r))return!1;let i=r.worktree;if(!i||"object"!=typeof i||Array.isArray(i))return!1;if("string"==typeof i.codeStateHash&&e.worktree.codeStateHash)return i.codeStateHash!==e.worktree.codeStateHash;if("string"==typeof i.headSha&&e.worktree.headSha!==i.headSha)return!0;if("boolean"==typeof i.hasStagedChanges){if(i.hasStagedChanges!==e.worktree.hasStagedChanges)return!0}else if(e.worktree.hasStagedChanges)return!0;return"boolean"==typeof i.hasUnstagedChanges?i.hasUnstagedChanges!==e.worktree.hasUnstagedChanges:e.worktree.hasUnstagedChanges}])},396763,504173,925991,e=>{"use strict";var t=e.i(666680),r=e.i(885418),i=e.i(243783);e.i(805422);var a=e.i(694355),n=e.i(661983),s=e.i(750227),o=e.i(119909);e.i(151666);var l=e.i(468399),c=e.i(984179);let u="default",d=["QUEUED","RUNNING"],p=["PUSHING","CHECKING_OUT","AWAITING_STASH","CLEANING_UP"],m=new Set([o.WORKTREE_DIFF_JOB_KIND,o.WORKTREE_DIFF_ASSET_JOB_KIND]),h=["gray","stone","red","rose","orange","amber","yellow","lime","green","emerald","teal","cyan","sky","blue","indigo","violet","purple","fuchsia","pink"],f={codebase:{include:{agent:!0,repository:{include:{projects:{where:{type:"IOS_APP"},include:{configurations:{select:{id:!0}}}}}},jobs:{where:{status:{in:d}},orderBy:{createdAt:"desc"},take:1}}},tags:{include:{tag:!0}},builds:{orderBy:{createdAt:"desc"},take:1,select:{id:!0,status:!0,action:!0,destinationType:!0,destinationJson:!0,snapshotJson:!0,createdAt:!0,finishedAt:!0,artifacts:{select:{id:!0,kind:!0}}}},_count:{select:{builds:{where:{status:{in:["QUEUED","PREPARING","RUNNING"]}}}}}};function g(e){return null!==e.lastSeenAt&&Date.now()-e.lastSeenAt.getTime()<=a.AGENT_ONLINE_WINDOW_MS&&null===e.disconnectedAt}function y(e){try{let t=JSON.parse(e.capabilitiesJson);return Array.isArray(t)?t.filter(e=>"string"==typeof e):[]}catch{return[]}}function v(e){try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>"string"==typeof e):[]}catch{return[]}}function b(e){return/^[A-Za-z]:[\\/]/.test(e)||e.startsWith("\\\\")}function w(e,t){if(!t)return e;let r=b(t);if(r!==b(e))return e;let i=r?s.win32:s.posix,a=i.relative(t,e);return i.isAbsolute(a)||".."===a||a.startsWith(`..${i.sep}`)?e:a||"."}function x(e){if("SUCCEEDED"!==e.status||!e.resultJson)throw Error(e.error||"Worktree job failed");let t=JSON.parse(e.resultJson);if(!t||"object"!=typeof t||Array.isArray(t))throw Error("Worktree job returned an invalid result");return t}e.s(["WorktreesService",0,class{agentControl;jiraService;gitHubService;skillsService;pullRequestCache;watchDemand;constructor(e,t,r,i){this.agentControl=e,this.jiraService=t,this.gitHubService=r,this.skillsService=i,this.pullRequestCache=new Map,this.watchDemand=new Map,this.agentControl.registerCompletionHandler(o.WORKTREE_OPERATION_JOB_KIND,e=>this.projectOperation(e)),this.agentControl.registerCompletionHandler(o.WORKTREE_BRANCH_JOB_KIND,e=>this.projectBranchOperation(e)),this.agentControl.registerCompletionHandler(o.WORKTREE_MOVE_PUSH_JOB_KIND,e=>this.advanceMoveAfterPush(e)),this.agentControl.registerCompletionHandler(o.WORKTREE_MOVE_CHECKOUT_JOB_KIND,e=>this.advanceMoveAfterCheckout(e)),this.agentControl.registerCompletionHandler(o.WORKTREE_DELETE_JOB_KIND,e=>this.projectDeleteOperation(e))}async settings(){return(await (0,i.getPrismaClient)()).worktreeSettings.upsert({where:{id:u},create:{id:u,editorVariant:"CODE"},update:{}})}async saveSettings(e){if(!["CODE","CODE_INSIDERS","NONE"].includes(e))throw Error("Unknown editor setting");let t=await (0,i.getPrismaClient)(),r=await t.worktreeSettings.upsert({where:{id:u},create:{id:u,editorVariant:e},update:{editorVariant:e}});return this.publish(null,null),r}async requestRefresh(){let e=await (0,i.getPrismaClient)(),t=await e.codebase.findMany({select:{agentId:!0}});return this.agentControl.requestCodebaseReconcile(t.map(e=>e.agentId))}invalidatePullRequestsForOrigin(e){let t=e.toLowerCase();for(let e of this.pullRequestCache.keys())e.toLowerCase()===t&&this.pullRequestCache.delete(e)}async cleanupExpired(){let e=await (0,i.getPrismaClient)();await e.worktree.deleteMany({where:{missingAt:{lt:new Date(Date.now()-6048e5)}}})}view(e,t=""){let r=e.codebase.repository.jiraBranchRegex??t;return{...e,relativePath:w(e.folder,e.codebase.agent.baseRepoDirectory),tags:e.tags.map(e=>e.tag),activeJob:e.codebase.jobs.find(t=>t.worktreeId===e.id)??e.codebase.jobs[0]??null,baseBranch:e.baseBranchOverride??e.codebase.defaultBranch??null,ticketKey:function(e,t){if(!e||!t)return null;try{let r=RegExp(t,"i").exec(e),i=(r?.[1]??r?.[0])?.trim();return i?i.toUpperCase():null}catch{return null}}(e.branch,String(r)),ticketTitle:null,ticketStatus:null,pullRequest:null,latestBuild:e.builds?.[0]?{...e.builds[0],outOfDate:(0,c.buildOutOfDate)({...e.builds[0],worktree:e})}:null}}async overview(){await this.cleanupExpired();let e=await (0,i.getPrismaClient)(),[t,r,a,n,s,o]=await Promise.all([e.worktree.findMany({where:{missingAt:null},include:f,orderBy:[{codebase:{agent:{name:"asc"}}},{codebase:{repository:{name:"asc"}}},{primary:"desc"},{branch:"asc"},{folder:"asc"}]}),e.worktreeTag.findMany({orderBy:{name:"asc"}}),this.settings(),e.codebaseSettings.findUnique({where:{id:"default"}}),e.worktree.count({where:{missingAt:{not:null}}}),e.worktreeMove.findMany({where:{status:{in:p}},orderBy:{createdAt:"asc"}})]),l=n?.defaultJiraBranchRegex??"",c=t.map(e=>this.view(e,l)),u=[...new Set(c.map(e=>e.codebase.repository.canonicalOrigin))],d=new Map;await Promise.all(u.map(async e=>{let t=this.pullRequestCache.get(e);if(t&&t.expiresAt>Date.now())return void d.set(e,t.items);try{let t=await this.gitHubService.pullRequestsForOrigin(e);this.pullRequestCache.set(e,{items:t,expiresAt:Date.now()+6e4}),d.set(e,t)}catch{d.set(e,[])}}));let m=[...new Set(c.map(e=>e.ticketKey).filter(Boolean))],h=new Map;for(let e of(await Promise.all(m.map(async e=>{try{let t=await this.jiraService.cachedTicket(e)??await this.jiraService.ticket(e);h.set(e,{title:t.summary,status:t.status})}catch{}})),c))e.ticketTitle=e.ticketKey?h.get(e.ticketKey)?.title??null:null,e.ticketStatus=e.ticketKey?h.get(e.ticketKey)?.status??null:null,e.pullRequest=d.get(e.codebase.repository.canonicalOrigin)?.find(t=>t.headRefName===e.branch)??null;let g=new Map;for(let e of c){let t=e.codebase.agent,r=g.get(t.id);r||(r={agent:t,codebases:[],codebaseMap:new Map},g.set(t.id,r));let i=r.codebaseMap.get(e.codebase.id);i||(i={codebase:e.codebase,repository:e.codebase.repository,worktrees:[],iosBuildConfigured:e.codebase.repository.projects?.some(e=>e.configurations.length>0)??!1},r.codebaseMap.set(e.codebase.id,i),r.codebases.push(i)),i.worktrees.push(e)}return{agents:[...g.values()].map(e=>({agent:e.agent,codebases:e.codebases})),tags:r,settings:a,hiddenCount:s,activeMoves:o}}async hidden(){await this.cleanupExpired();let e=await (0,i.getPrismaClient)(),t=await e.codebaseSettings.findUnique({where:{id:"default"}});return(await e.worktree.findMany({where:{missingAt:{not:null}},include:f,orderBy:{missingAt:"desc"}})).map(e=>this.view(e,t?.defaultJiraBranchRegex??""))}async report(e,r){let a=await (0,i.getPrismaClient)(),n=[],s=!1;for(let i of r.slice(0,100)){let r=(0,o.parseCodebaseWorktreeReport)(i),l=await a.codebase.findUnique({where:{id:r.codebaseId}});if(!l||l.agentId!==e)throw Error("Codebase not found for this agent");let c=r.worktrees.slice(0,1e3).map(e=>(0,o.parseWorktreeInventoryItem)(e)),u=await a.worktree.findMany({where:{codebaseId:l.id},select:{gitDirectory:!0,folder:!0,missingAt:!0}}),d=new Map(u.map(e=>[e.gitDirectory,e])),p=new Set(c.map(e=>e.gitDirectory));s||=c.some(e=>{let t=d.get(e.gitDirectory);return!t||t.folder!==e.folder||null!==t.missingAt})||r.complete&&u.some(e=>null===e.missingAt&&!p.has(e.gitDirectory)),await a.$transaction(async e=>{await e.codebase.update({where:{id:l.id},data:{defaultBranch:r.defaultBranch,localBranchesJson:JSON.stringify(r.localBranches),remoteBranchesJson:JSON.stringify(r.remoteBranches),...r.fetchedAt?{lastFetchedAt:new Date(r.fetchedAt)}:{},...r.fetchAttemptedAt?{lastFetchAttemptAt:new Date(r.fetchAttemptedAt),lastFetchError:r.fetchError}:r.fetchError?{lastFetchError:r.fetchError}:{}}});let i=[];for(let r of c){i.push(r.gitDirectory);let a=await e.worktree.upsert({where:{codebaseId_gitDirectory:{codebaseId:l.id,gitDirectory:r.gitDirectory}},create:{id:(0,t.randomUUID)(),codebaseId:l.id,gitDirectory:r.gitDirectory,...this.inventoryData(r)},update:{}});await e.worktree.updateMany({where:{id:a.id,OR:[{lastCheckedAt:null},{lastCheckedAt:{lt:new Date(r.checkedAt)}}]},data:{...this.inventoryData(r),missingAt:null}}),n.push(a.id)}r.complete&&await e.worktree.updateMany({where:{codebaseId:l.id,missingAt:null,...i.length?{gitDirectory:{notIn:i}}:{}},data:{missingAt:new Date}})}),this.publish(null,l.id)}return await this.cleanupExpired(),s&&await this.skillsService?.requestAutoReconcile(),a.worktree.findMany({where:{id:{in:n}},include:f})}async reportActivity(e,t){let r=(0,o.parseWorktreeActivityReport)(t),a=await (0,i.getPrismaClient)(),s=await a.worktree.findFirst({where:{codebaseId:r.codebaseId,gitDirectory:r.gitDirectory,missingAt:null,codebase:{agentId:e}},select:{id:!0,codebaseId:!0}});if(!s)throw Error("Worktree activity source was not found");let l=void 0!==r.branch||void 0!==r.headSha||void 0!==r.upstream||void 0!==r.ahead||void 0!==r.behind||void 0!==r.syncState||void 0!==r.baseAhead||void 0!==r.baseBehind,c=!0;(l||void 0!==r.hasStagedChanges||void 0!==r.hasUnstagedChanges||void 0!==r.codeStateHash||void 0!==r.pushStatus)&&(c=(await a.worktree.updateMany({where:{id:s.id,OR:[{lastCheckedAt:null},{lastCheckedAt:{lt:new Date(r.observedAt)}}]},data:{...void 0===r.branch?{}:{branch:r.branch},...void 0===r.headSha?{}:{headSha:r.headSha},...void 0===r.upstream?{}:{upstream:r.upstream},...void 0===r.ahead?{}:{ahead:r.ahead},...void 0===r.behind?{}:{behind:r.behind},...void 0===r.syncState?{}:{syncState:r.syncState},...void 0===r.baseAhead?{}:{baseAhead:r.baseAhead},...void 0===r.baseBehind?{}:{baseBehind:r.baseBehind},lastCheckedAt:new Date(r.observedAt),...void 0===r.hasStagedChanges?{}:{hasStagedChanges:r.hasStagedChanges},...void 0===r.hasUnstagedChanges?{}:{hasUnstagedChanges:r.hasUnstagedChanges},...void 0===r.codeStateHash?{}:{codeStateHash:r.codeStateHash},...void 0===r.pushStatus?{}:{pushStatus:r.pushStatus}}})).count>0)&&this.publish(s.id,s.codebaseId);let u={worktreeId:s.id,...void 0===r.branch?{}:{branch:r.branch},...void 0===r.headSha?{}:{headSha:r.headSha},...void 0===r.upstream?{}:{upstream:r.upstream},...void 0===r.ahead?{}:{ahead:r.ahead},...void 0===r.behind?{}:{behind:r.behind},...void 0===r.syncState?{}:{syncState:r.syncState},...void 0===r.baseAhead?{}:{baseAhead:r.baseAhead},...void 0===r.baseBehind?{}:{baseBehind:r.baseBehind},...void 0===r.hasStagedChanges?{}:{hasStagedChanges:r.hasStagedChanges},...void 0===r.hasUnstagedChanges?{}:{hasUnstagedChanges:r.hasUnstagedChanges},...void 0===r.pushStatus?{}:{pushStatus:r.pushStatus},observedAt:r.observedAt};return this.watchDemand.has(s.id)&&c&&n.agentEventBus.publish((0,n.worktreeInspectionTopic)(s.id),{worktreeInspectionChanged:u}),u}inventoryData(e){return{folder:e.folder,relativePath:e.relativePath,primary:e.primary,branch:e.branch,headSha:e.headSha,codeStateHash:e.codeStateHash??null,upstream:e.upstream,ahead:e.ahead,behind:e.behind,syncState:e.syncState,baseAhead:e.baseAhead,baseBehind:e.baseBehind,hasStagedChanges:e.hasStagedChanges??!1,hasUnstagedChanges:e.hasUnstagedChanges??!1,pushStatus:e.pushStatus??"UNKNOWN",availability:e.availability,statusError:e.error,lastCheckedAt:new Date(e.checkedAt)}}async updateBaseBranch(e,t){let r=await (0,i.getPrismaClient)(),a=await r.worktree.findUnique({where:{id:e},include:{codebase:!0}});if(!a||a.missingAt)throw Error("Worktree not found");let n=t?.trim()||null;if(n&&!v(a.codebase.remoteBranchesJson).includes(n))throw Error("The selected origin branch is unavailable; fetch and try again");let s=await r.worktree.update({where:{id:e},data:{baseBranchOverride:n},include:f});return this.publish(e,a.codebaseId),await this.restartWatch(e),this.view(s)}requireColor(e){if(null===e||""===e)return null;if(!h.includes(e))throw Error("Unknown worktree color");return e}async updateHighlight(e,t){let r=await (0,i.getPrismaClient)(),a=await r.worktree.update({where:{id:e},data:{highlightColor:this.requireColor(t)},include:f});return this.publish(e,a.codebaseId),this.view(a)}async setTags(e,t){let r=await (0,i.getPrismaClient)(),a=[...new Set(t)].slice(0,100);if(await r.worktreeTag.count({where:{id:{in:a}}})!==a.length)throw Error("One or more tags were not found");await r.$transaction([r.worktreeTagAssignment.deleteMany({where:{worktreeId:e}}),...a.length?[r.worktreeTagAssignment.createMany({data:a.map(t=>({worktreeId:e,tagId:t}))})]:[]]);let n=await r.worktree.findUniqueOrThrow({where:{id:e},include:f});return this.publish(e,n.codebaseId),this.view(n)}async saveTag(e){let r=e.name.trim();if(!r||r.length>40)throw Error("Tag names must contain 1–40 characters");let a=this.requireColor(e.color),n=await (0,i.getPrismaClient)(),s=(await n.worktreeTag.findMany()).find(e=>e.name.toLocaleLowerCase()===r.toLocaleLowerCase());if(s&&s.id!==e.id)throw Error("Tag names must be unique");let o=e.id?await n.worktreeTag.update({where:{id:e.id},data:{name:r,color:a}}):await n.worktreeTag.create({data:{id:(0,t.randomUUID)(),name:r,color:a}});return this.publish(null,null),o}async deleteTag(e){let t=await (0,i.getPrismaClient)(),r=await t.worktreeTag.deleteMany({where:{id:e}});return r.count&&this.publish(null,null),r.count>0}async repositoryTakenBranches(e){let t=await (0,i.getPrismaClient)();return new Set((await t.codebase.findMany({where:{repositoryId:e},select:{localBranchesJson:!0,remoteBranchesJson:!0,worktrees:{where:{missingAt:null},select:{branch:!0}}}})).flatMap(e=>[...v(e.localBranchesJson),...v(e.remoteBranchesJson),...e.worktrees.flatMap(e=>e.branch?[e.branch]:[])]))}requireBaseBranch(e,t){let r=t.trim();if(!r||!v(e.remoteBranchesJson).includes(r))throw Error("The selected origin base branch is unavailable; fetch and try again");return r}async ticketBranch(e,t,r){let i=t?.trim()??"",a=await this.jiraService.branchTicket(i),n=await (0,l.jiraBranchCandidates)(a.branchNamingScript,{ticketKey:a.ticketKey,type:a.ticketType??"",title:a.ticketTitle}),s=await this.repositoryTakenBranches(e.repositoryId),o=n.filter(e=>e===r||!s.has(e));if(!o.length)throw Error("Every generated ticket branch name is already taken");return{ticket:a,candidates:o}}async previewTicketBranch(e){let t=await (0,i.getPrismaClient)(),r=await t.codebase.findUnique({where:{id:e.codebaseId},include:{agent:!0,repository:!0}});if(!r)throw Error("Codebase not found");let a=null;if(e.worktreeId){let r=await t.worktree.findFirst({where:{id:e.worktreeId,codebaseId:e.codebaseId,missingAt:null},select:{branch:!0}});if(!r)throw Error("Worktree not found for this codebase");a=r.branch}let{ticket:n,candidates:s}=await this.ticketBranch(r,e.ticketKey,a);return{ticketKey:n.ticketKey,ticketTitle:n.ticketTitle,ticketType:n.ticketType,projectKey:n.projectKey,branchName:s[0]}}async resolveBranchSelection(e,t,r){let a=this.requireBaseBranch(e,t.baseBranch);if("TICKET"===t.mode){let{candidates:i}=await this.ticketBranch(e,t.ticketKey,r?.branch??null);return{baseBranch:a,mode:"NEW",candidates:i}}let n=t.branchName?.trim()??"";if(!(0,o.validGitBranchName)(n))throw Error("Enter a valid Git branch name");if("NEW"===t.mode){if((await this.repositoryTakenBranches(e.repositoryId)).has(n))throw Error(`Branch ${n} is already taken`);return{baseBranch:a,mode:"NEW",candidates:[n]}}if("EXISTING"!==t.mode)throw Error("Unknown worktree branch mode");if(!new Set([...v(e.localBranchesJson),...v(e.remoteBranchesJson)]).has(n))throw Error(`Existing branch ${n} is unavailable; refresh and try again`);let s=await (0,i.getPrismaClient)();if(await s.worktree.findFirst({where:{codebaseId:e.id,branch:n,missingAt:null,...r?{id:{not:r.id}}:{}},select:{id:!0}}))throw Error(`Branch ${n} is checked out in another worktree`);return{baseBranch:a,mode:"EXISTING",candidates:[n]}}async createWorktree(e){let t=await this.requireRunnableCodebase(e.codebaseId),r=await this.resolveBranchSelection(t,e.selection,null);return this.agentControl.createJob({agentId:t.agentId,codebaseId:t.id,kind:o.WORKTREE_BRANCH_JOB_KIND,payload:{codebaseId:t.id,rootFolder:t.folder,folder:null,gitDirectory:null,expectedOrigin:t.repository.canonicalOrigin,baseBranch:r.baseBranch,action:"CREATE",mode:r.mode,candidates:r.candidates,stashOnFailure:!1},idempotencyKey:`worktree:branch:create:${e.requestId}:${t.id}`,timeoutSeconds:600})}async changeWorktreeBranch(e){let t=await this.requireRunnable(e.worktreeId,o.WORKTREE_BRANCH_JOB_KIND),r=await this.resolveBranchSelection(t.codebase,e.selection,{id:t.id,branch:t.branch});return this.agentControl.createJob({agentId:t.codebase.agentId,codebaseId:t.codebaseId,worktreeId:t.id,kind:o.WORKTREE_BRANCH_JOB_KIND,payload:{codebaseId:t.codebaseId,rootFolder:t.codebase.folder,folder:t.folder,gitDirectory:t.gitDirectory,expectedOrigin:t.codebase.repository.canonicalOrigin,baseBranch:r.baseBranch,action:"CHANGE",mode:r.mode,candidates:r.candidates,stashOnFailure:!!e.stashOnFailure},idempotencyKey:`worktree:branch:change:${e.requestId}:${t.id}`,timeoutSeconds:600})}async getMove(e){return(await (0,i.getPrismaClient)()).worktreeMove.findUnique({where:{id:e}})}async moveWorktree(e){let r,a=await (0,i.getPrismaClient)(),n=await a.worktreeMove.findUnique({where:{sourceWorktreeId_requestId:{sourceWorktreeId:e.sourceWorktreeId,requestId:e.requestId}}});if(n)return n;let s=await this.requireRunnable(e.sourceWorktreeId,o.WORKTREE_MOVE_PUSH_JOB_KIND);if(!s.branch||!s.headSha)throw Error("A named source branch is required");if(s.hasStagedChanges||s.hasUnstagedChanges||"READY"!==s.pushStatus)throw Error("The source branch must be clean and safely pushable before moving");if(e.deleteSource&&s.primary)throw Error("The primary worktree cannot be deleted after moving");if(e.deleteSource&&!y(s.codebase.agent).includes(o.WORKTREE_DELETE_JOB_KIND))throw Error("Source agent must be updated to remove the old worktree");let l=await this.requireRunnableCodebase(e.targetCodebaseId,o.WORKTREE_MOVE_CHECKOUT_JOB_KIND);if(s.codebase.repositoryId!==l.repositoryId||s.codebase.agentId===l.agentId)throw Error("The destination must be the same repository on another agent");let c=e.targetWorktreeId?await a.worktree.findFirst({where:{id:e.targetWorktreeId,codebaseId:l.id,missingAt:null,availability:"AVAILABLE"}}):null;if(e.targetWorktreeId&&!c)throw Error("Destination worktree not found");if(await a.worktree.findFirst({where:{codebaseId:l.id,branch:s.branch,missingAt:null,...c?{id:{not:c.id}}:{}},select:{id:!0}}))throw Error("The source branch is already checked out in another destination worktree");let u=l.defaultBranch??s.codebase.defaultBranch;if(!u)throw Error("The destination default branch is unavailable");let d=(0,t.randomUUID)();try{r=await a.worktreeMove.create({data:{id:d,requestId:e.requestId,sourceWorktreeId:s.id,sourceCodebaseId:s.codebaseId,targetCodebaseId:l.id,targetWorktreeId:c?.id??null,destinationMode:c?"EXISTING":"NEW",branch:s.branch,headSha:s.headSha,baseBranch:u,deleteSource:e.deleteSource,status:"PUSHING"}})}catch(r){let t=await a.worktreeMove.findUnique({where:{sourceWorktreeId_requestId:{sourceWorktreeId:e.sourceWorktreeId,requestId:e.requestId}}});if(t)return t;throw r}try{let e=await this.agentControl.createJob({agentId:s.codebase.agentId,codebaseId:s.codebaseId,worktreeId:s.id,kind:o.WORKTREE_MOVE_PUSH_JOB_KIND,payload:{moveId:r.id,codebaseId:s.codebaseId,folder:s.folder,gitDirectory:s.gitDirectory,expectedOrigin:s.codebase.repository.canonicalOrigin,branch:s.branch,expectedHeadSha:s.headSha},idempotencyKey:`worktree:move:push:${r.id}`,timeoutSeconds:600});return r=await a.worktreeMove.update({where:{id:r.id},data:{sourceJobId:e.id}}),this.publish(s.id,s.codebaseId),r}catch(e){throw await a.worktreeMove.update({where:{id:r.id},data:{status:"FAILED",error:e instanceof Error?e.message:String(e),finishedAt:new Date}}),e}}async retryWorktreeMoveWithStash(e){let t=await (0,i.getPrismaClient)(),r=await t.worktreeMove.findUnique({where:{id:e}});if(!r||"AWAITING_STASH"!==r.status)throw Error("This move is not waiting for a stash decision");let a=await this.createMoveCheckoutJob(r,!0);if(1!==(await t.worktreeMove.updateMany({where:{id:e,status:"AWAITING_STASH"},data:{status:"CHECKING_OUT",targetJobId:a.id,error:null}})).count){let r=await t.worktreeMove.findUniqueOrThrow({where:{id:e}});if("AWAITING_STASH"!==r.status)return r;throw Error("The move state changed; refresh and try again")}return this.publish(r.sourceWorktreeId,r.sourceCodebaseId),t.worktreeMove.findUniqueOrThrow({where:{id:e}})}async cancelWorktreeMove(e){let t=await (0,i.getPrismaClient)(),r=await t.worktreeMove.findUnique({where:{id:e}});if(!r||"AWAITING_STASH"!==r.status)throw Error("Only a move waiting for a stash decision can be cancelled");let a=await t.worktreeMove.update({where:{id:e},data:{status:"CANCELLED",finishedAt:new Date}});return this.publish(r.sourceWorktreeId,r.sourceCodebaseId),a}async deleteWorktree(e){let t=await this.requireRunnable(e.worktreeId,o.WORKTREE_DELETE_JOB_KIND);if(t.primary)throw Error("The primary worktree cannot be deleted");if(e.deleteRemoteBranch&&(!t.branch||t.branch===t.codebase.defaultBranch))throw Error("The default remote branch cannot be deleted");return this.agentControl.createJob({agentId:t.codebase.agentId,codebaseId:t.codebaseId,worktreeId:t.id,kind:o.WORKTREE_DELETE_JOB_KIND,payload:{moveId:null,codebaseId:t.codebaseId,rootFolder:t.codebase.folder,folder:t.folder,gitDirectory:t.gitDirectory,expectedOrigin:t.codebase.repository.canonicalOrigin,branch:t.branch,defaultBranch:t.codebase.defaultBranch,deleteRemoteBranch:e.deleteRemoteBranch,requireClean:!1,expectedHeadSha:null},idempotencyKey:`worktree:delete:${e.requestId}:${t.id}`,timeoutSeconds:600})}async inspect(e,t){let r=await this.requireRunnable(e,o.WORKTREE_INSPECT_JOB_KIND),a=await this.createSerializedDiffJob({agentId:r.codebase.agentId,codebaseId:r.codebaseId,worktreeId:r.id,kind:o.WORKTREE_INSPECT_JOB_KIND,payload:this.payload(r),idempotencyKey:`worktree:inspect:${t}:${e}`,timeoutSeconds:30,visibility:"SYSTEM"});try{let e=await this.waitForJob(a.id),t=x(e).detail;if(!t||"object"!=typeof t)throw Error("Invalid worktree detail");let r=Array.isArray(t.changes)?t.changes.map(e=>e&&"object"==typeof e&&!Array.isArray(e)?{...e,changeType:"string"==typeof e.changeType?e.changeType:"MODIFIED"}:e):[];return{...t,changes:r,branchChanges:Array.isArray(t.branchChanges)?t.branchChanges:[],branchChangesTruncated:!0===t.branchChangesTruncated}}finally{let e=await (0,i.getPrismaClient)();await e.agentJob.deleteMany({where:{id:a.id,visibility:"SYSTEM"}})}}async inspectDiff(e,t,r){let a=await this.requireRunnable(e,o.WORKTREE_DIFF_JOB_KIND,!0),n=this.payload(a);if(!n.baseBranch)throw Error("A base branch is required");let s=await this.createSerializedDiffJob({agentId:a.codebase.agentId,codebaseId:a.codebaseId,worktreeId:a.id,kind:o.WORKTREE_DIFF_JOB_KIND,payload:{...n,baseBranch:n.baseBranch,scope:t.scope,path:t.path??null,previousPath:t.previousPath??null,commitSha:t.commitSha??null,uploadId:null,side:null},idempotencyKey:`worktree:diff:${r}:${e}`,timeoutSeconds:30,visibility:"SYSTEM"});try{let e=await this.waitForJob(s.id),t=x(e).diff;if(!t||"object"!=typeof t)throw Error("Invalid worktree diff result");return t}finally{let e=await (0,i.getPrismaClient)();await e.agentJob.deleteMany({where:{id:s.id,visibility:"SYSTEM"}})}}async prepareDiffAsset(e,t,r){let a=await this.requireRunnable(e,o.WORKTREE_DIFF_ASSET_JOB_KIND,!0),n=this.payload(a);if(!n.baseBranch)throw Error("A base branch is required");let s=await this.createSerializedDiffJob({agentId:a.codebase.agentId,codebaseId:a.codebaseId,worktreeId:a.id,kind:o.WORKTREE_DIFF_ASSET_JOB_KIND,payload:{...n,baseBranch:n.baseBranch,scope:t.scope,path:t.path,previousPath:t.previousPath??null,commitSha:t.commitSha??null,uploadId:r,side:t.side},idempotencyKey:`worktree:diff-asset:${r}:${e}`,timeoutSeconds:60,visibility:"SYSTEM"});try{x(await this.waitForJob(s.id))}finally{let e=await (0,i.getPrismaClient)();await e.agentJob.deleteMany({where:{id:s.id,visibility:"SYSTEM"}})}}async diffAssetAgentId(e){let t=await (0,i.getPrismaClient)(),r=await t.worktree.findUnique({where:{id:e},select:{codebase:{select:{agentId:!0}}}});return r?.codebase.agentId??null}async runOperation(e,t,r){if(!o.WORKTREE_OPERATIONS.includes(t))throw Error("Unknown worktree operation");let i=await this.requireRunnable(e,o.WORKTREE_OPERATION_JOB_KIND),a=await this.settings();return this.agentControl.createJob({agentId:i.codebase.agentId,codebaseId:i.codebaseId,worktreeId:i.id,kind:o.WORKTREE_OPERATION_JOB_KIND,payload:{...this.payload(i),operation:t,..."OPEN_EDITOR"===t?{editorVariant:a.editorVariant}:{}},idempotencyKey:`worktree:operation:${r}:${e}`,timeoutSeconds:"OPEN_EDITOR"===t?30:600})}payload(e){return{codebaseId:e.codebaseId,folder:e.folder,gitDirectory:e.gitDirectory,expectedOrigin:e.codebase.repository.canonicalOrigin,baseBranch:e.baseBranchOverride??e.codebase.defaultBranch??null}}async createSerializedDiffJob(e){let t=await (0,i.getPrismaClient)(),r=Date.now()+3e4;for(;Date.now()<r;){let i=await t.agentJob.findFirst({where:{codebaseId:e.codebaseId,status:{in:d}},select:{id:!0,idempotencyKey:!0,kind:!0}});if(i){if(i.idempotencyKey===e.idempotencyKey)return this.agentControl.createJob(e);if(!m.has(i.kind))throw Error("Another operation is active for this codebase");await this.waitForSerializedDiffJob(i.id,r);continue}try{return await this.agentControl.createJob(e)}catch(e){if(!function(e){if(!e||"object"!=typeof e||"P2002"!==e.code)return!1;let t=e.meta?.target;return Array.isArray(t)?t.includes("codebaseId"):"string"==typeof t&&t.includes("codebaseId")}(e))throw e}}throw Error("Another diff request is still active for this codebase")}async waitForSerializedDiffJob(e,t){let r=n.agentEventBus.iterate((0,n.agentJobChangedTopic)(e));try{for(;Date.now()<t;){let i=await this.agentControl.getJob(e);if(!i||!d.includes(i.status))return;await Promise.race([r.next(),new Promise(e=>setTimeout(e,Math.max(0,t-Date.now())))])}throw Error("Another diff request is still active for this codebase")}finally{await r.return?.()}}async requireRunnable(e,t,r=!1){let a=await (0,i.getPrismaClient)(),n=await a.worktree.findUnique({where:{id:e},include:{codebase:{include:{agent:!0,repository:!0}}}});if(!n||n.missingAt||"AVAILABLE"!==n.availability)throw Error("Worktree is unavailable");if(!g(n.codebase.agent))throw Error("Agent is offline");if(!y(n.codebase.agent).includes(t))throw Error("Agent must be updated to use worktrees");if(!r){let[e,t]=await Promise.all([a.agentJob.findFirst({where:{codebaseId:n.codebaseId,status:{in:d}}}),a.worktreeMove.findFirst({where:{status:{in:p},OR:[{sourceCodebaseId:n.codebaseId},{targetCodebaseId:n.codebaseId}]}})]);if(e||t)throw Error("Another operation is active for this codebase")}return n}async requireRunnableCodebase(e,t=o.WORKTREE_BRANCH_JOB_KIND){let r=await (0,i.getPrismaClient)(),a=await r.codebase.findUnique({where:{id:e},include:{agent:!0,repository:!0}});if(!a||"AVAILABLE"!==a.availability)throw Error("Codebase is unavailable");if(!g(a.agent))throw Error("Agent is offline");if(!y(a.agent).includes(t))throw Error("Agent must be updated to create or change worktrees");let[n,s]=await Promise.all([r.agentJob.findFirst({where:{codebaseId:e,status:{in:d}}}),r.worktreeMove.findFirst({where:{status:{in:p},OR:[{sourceCodebaseId:e},{targetCodebaseId:e}]}})]);if(n||s)throw Error("Another operation is active for this codebase");return a}async purge(e){let t=await (0,i.getPrismaClient)(),r=await t.worktree.deleteMany({where:{id:e,missingAt:{not:null}}});return r.count&&this.publish(e,null),r.count>0}async purgeAll(){let e=await (0,i.getPrismaClient)(),t=await e.worktree.deleteMany({where:{missingAt:{not:null}}});return t.count&&this.publish(null,null),t.count}subscribe(){return n.agentEventBus.iterate(n.WORKTREE_CHANGED_TOPIC)}async *subscribeInspection(e){let t=n.agentEventBus.iterate((0,n.worktreeInspectionTopic)(e)),r=!1;try{for await(let i of(await this.acquireWatch(e),r=!0,t))yield i}finally{await t.return?.(),r&&await this.releaseWatch(e)}}async acquireWatch(e){let r=this.watchDemand.get(e);if(r){r.subscribers+=1,await r.started;return}let i=await this.requireRunnable(e,o.WORKTREE_WATCH_JOB_KIND,!0),a=(0,t.randomUUID)(),n=this.payload(i),s={subscribers:1,watchId:a,agentId:i.codebase.agentId,worktreeId:i.id,codebaseId:i.codebaseId,payload:n,started:Promise.resolve()};s.started=this.runWatchAction(s,"START"),this.watchDemand.set(e,s);try{await s.started}catch(t){throw this.watchDemand.get(e)===s&&this.watchDemand.delete(e),t}}async releaseWatch(e){let t=this.watchDemand.get(e);if(t&&(t.subscribers-=1,!(t.subscribers>0))){this.watchDemand.delete(e);try{await t.started,await this.runWatchAction(t,"STOP")}catch(e){console.error("Could not stop worktree watcher:",e instanceof Error?e.message:e)}}}async runWatchAction(e,t){let r=await this.agentControl.createJob({agentId:e.agentId,worktreeId:e.worktreeId,kind:o.WORKTREE_WATCH_JOB_KIND,payload:{...e.payload,action:t,watchId:e.watchId},idempotencyKey:`worktree:watch:${t}:${e.watchId}`,timeoutSeconds:30,visibility:"SYSTEM"});try{x(await this.waitForJob(r.id))}finally{let e=await (0,i.getPrismaClient)();await e.agentJob.deleteMany({where:{id:r.id,visibility:"SYSTEM"}})}}async restartWatch(e){let r=this.watchDemand.get(e);if(r)try{if(await r.started,this.watchDemand.get(e)!==r||(await this.runWatchAction(r,"STOP"),this.watchDemand.get(e)!==r))return;let i=await this.requireRunnable(e,o.WORKTREE_WATCH_JOB_KIND,!0),a={subscribers:r.subscribers,watchId:(0,t.randomUUID)(),agentId:i.codebase.agentId,worktreeId:i.id,codebaseId:i.codebaseId,payload:this.payload(i),started:Promise.resolve()};a.started=this.runWatchAction(a,"START"),this.watchDemand.set(e,a),await a.started}catch(e){console.error("Could not restart worktree watcher:",e instanceof Error?e.message:e)}}publish(e,t){n.agentEventBus.publish(n.WORKTREE_CHANGED_TOPIC,{worktreeOverviewChanged:{worktreeId:e,codebaseId:t}})}moveIdFromJob(e){let t=JSON.parse(e.payloadJson);if(!t||"object"!=typeof t||Array.isArray(t)||"string"!=typeof t.moveId)throw Error("Move job is missing its workflow identifier");return String(t.moveId)}async failMove(e,t,r){let a=await (0,i.getPrismaClient)();(await a.worktreeMove.updateMany({where:{id:e,status:t},data:{status:"FAILED",error:r,finishedAt:new Date}})).count&&this.publish(null,null)}async createMoveCheckoutJob(e,t){let r=await (0,i.getPrismaClient)(),a=await r.codebase.findUnique({where:{id:e.targetCodebaseId},include:{agent:!0,repository:!0}});if(!a)throw Error("Destination codebase no longer exists");if(!g(a.agent))throw Error("Destination agent is offline");if(!y(a.agent).includes(o.WORKTREE_MOVE_CHECKOUT_JOB_KIND))throw Error("Destination agent must be updated to move worktrees");let n=e.targetWorktreeId?await r.worktree.findFirst({where:{id:e.targetWorktreeId,codebaseId:a.id,missingAt:null,availability:"AVAILABLE"}}):null;if("EXISTING"===e.destinationMode&&!n)throw Error("Destination worktree is no longer available");return this.agentControl.createJob({agentId:a.agentId,codebaseId:a.id,worktreeId:n?.id??null,kind:o.WORKTREE_MOVE_CHECKOUT_JOB_KIND,payload:{moveId:e.id,codebaseId:a.id,rootFolder:a.folder,folder:n?.folder??null,gitDirectory:n?.gitDirectory??null,expectedOrigin:a.repository.canonicalOrigin,branch:e.branch,expectedHeadSha:e.headSha,baseBranch:e.baseBranch,mode:e.destinationMode,stashOnFailure:t},idempotencyKey:`worktree:move:checkout:${e.id}:${t?"stash":"initial"}`,timeoutSeconds:600})}async advanceMoveAfterPush(e){let t=this.moveIdFromJob(e),r=await (0,i.getPrismaClient)(),a=await r.worktreeMove.findUnique({where:{id:t}});if(!a||"PUSHING"!==a.status||a.sourceJobId&&a.sourceJobId!==e.id)return;if("SUCCEEDED"!==e.status)return void await this.failMove(a.id,"PUSHING",e.error||"Could not push the source branch");let n=x(e);if(n.headSha!==a.headSha||n.branch!==a.branch)return void await this.failMove(a.id,"PUSHING","The source push returned an unexpected branch");try{let e=await this.createMoveCheckoutJob(a,!1);await r.worktreeMove.updateMany({where:{id:a.id,status:"PUSHING"},data:{status:"CHECKING_OUT",targetJobId:e.id}}),this.publish(a.sourceWorktreeId,a.sourceCodebaseId)}catch(e){await this.failMove(a.id,"PUSHING",e instanceof Error?e.message:String(e))}}async projectMoveDestination(e,r){let a=(0,o.parseWorktreeInventoryItem)(r),n=await (0,i.getPrismaClient)(),s=await n.codebase.findUnique({where:{id:e.targetCodebaseId},select:{localBranchesJson:!0}});if(!s)throw Error("Destination codebase no longer exists");let l=new Set(v(s.localBranchesJson));a.branch&&l.add(a.branch);let c=e.targetWorktreeId;return await n.$transaction(async r=>{if(await r.codebase.update({where:{id:e.targetCodebaseId},data:{localBranchesJson:JSON.stringify([...l].sort((e,t)=>e.localeCompare(t)))}}),c){if(1!==(await r.worktree.updateMany({where:{id:c,codebaseId:e.targetCodebaseId},data:{...this.inventoryData(a),gitDirectory:a.gitDirectory,baseBranchOverride:e.baseBranch,missingAt:null}})).count)throw Error("Destination worktree no longer exists")}else c=(await r.worktree.upsert({where:{codebaseId_gitDirectory:{codebaseId:e.targetCodebaseId,gitDirectory:a.gitDirectory}},create:{id:(0,t.randomUUID)(),codebaseId:e.targetCodebaseId,gitDirectory:a.gitDirectory,...this.inventoryData(a),baseBranchOverride:e.baseBranch},update:{...this.inventoryData(a),baseBranchOverride:e.baseBranch,missingAt:null}})).id;await r.worktreeMove.update({where:{id:e.id},data:{targetWorktreeId:c}})}),this.publish(c??null,e.targetCodebaseId),await this.skillsService?.requestAutoReconcile(),c}async scheduleMoveCleanup(e){let t=await (0,i.getPrismaClient)(),r=await t.worktreeMove.findUniqueOrThrow({where:{id:e}}),a=await t.worktree.findUnique({where:{id:r.sourceWorktreeId},include:{codebase:{include:{agent:!0,repository:!0}}}});if(!a||a.missingAt||a.primary){await t.worktreeMove.update({where:{id:r.id},data:{status:"SUCCEEDED_WITH_WARNING",warning:"Destination is ready, but the source worktree could not be removed",finishedAt:new Date}}),this.publish(r.sourceWorktreeId,r.sourceCodebaseId);return}try{let e=await this.agentControl.createJob({agentId:a.codebase.agentId,codebaseId:a.codebaseId,worktreeId:a.id,kind:o.WORKTREE_DELETE_JOB_KIND,payload:{moveId:r.id,codebaseId:a.codebaseId,rootFolder:a.codebase.folder,folder:a.folder,gitDirectory:a.gitDirectory,expectedOrigin:a.codebase.repository.canonicalOrigin,branch:a.branch,defaultBranch:a.codebase.defaultBranch,deleteRemoteBranch:!1,requireClean:!0,expectedHeadSha:r.headSha},idempotencyKey:`worktree:move:cleanup:${r.id}`,timeoutSeconds:600});await t.worktreeMove.updateMany({where:{id:r.id,status:{in:["PUSHING","CHECKING_OUT","AWAITING_STASH"]}},data:{status:"CLEANING_UP",cleanupJobId:e.id}}),this.publish(a.id,a.codebaseId)}catch(e){await t.worktreeMove.update({where:{id:r.id},data:{status:"SUCCEEDED_WITH_WARNING",warning:e instanceof Error?e.message:String(e),finishedAt:new Date}}),this.publish(a.id,a.codebaseId)}}async advanceMoveAfterCheckout(e){let t=this.moveIdFromJob(e),r=await (0,i.getPrismaClient)(),a=await r.worktreeMove.findUnique({where:{id:t}});if(!a||!["PUSHING","CHECKING_OUT","AWAITING_STASH"].includes(a.status)||a.targetJobId&&a.targetJobId!==e.id)return;if("SUCCEEDED"!==e.status)return void await this.failMove(a.id,a.status,e.error||"Could not check out the destination branch");let n=x(e);if("NEEDS_STASH"===n.outcome){await r.worktreeMove.updateMany({where:{id:a.id,status:{in:["PUSHING","CHECKING_OUT","AWAITING_STASH"]}},data:{status:"AWAITING_STASH",error:"string"==typeof n.message?n.message:"Destination changes block the branch switch"}}),this.publish(a.sourceWorktreeId,a.sourceCodebaseId);return}"CHECKED_OUT"===n.outcome&&n.worktree?(await this.projectMoveDestination(a,n.worktree),a.deleteSource?await this.scheduleMoveCleanup(a.id):(await r.worktreeMove.update({where:{id:a.id},data:{status:"SUCCEEDED",error:null,finishedAt:new Date}}),this.publish(a.sourceWorktreeId,a.sourceCodebaseId))):await this.failMove(a.id,a.status,"Destination checkout returned an invalid result")}async projectDeleteOperation(e){let t=JSON.parse(e.payloadJson),r=t&&"object"==typeof t&&!Array.isArray(t)&&"string"==typeof t.moveId?String(t.moveId):null,a=await (0,i.getPrismaClient)();if(r){let t=await a.worktreeMove.findUnique({where:{id:r}});if(!t||!["PUSHING","CHECKING_OUT","AWAITING_STASH","CLEANING_UP"].includes(t.status)||t.cleanupJobId&&t.cleanupJobId!==e.id)return;if("SUCCEEDED"!==e.status){await a.worktreeMove.update({where:{id:t.id},data:{status:"SUCCEEDED_WITH_WARNING",warning:e.error||"Destination is ready, but the source worktree was retained",finishedAt:new Date}}),this.publish(t.sourceWorktreeId,t.sourceCodebaseId);return}await a.$transaction([a.worktree.deleteMany({where:{id:t.sourceWorktreeId}}),a.worktreeMove.update({where:{id:t.id},data:{status:"SUCCEEDED",finishedAt:new Date}})]),this.publish(t.sourceWorktreeId,t.sourceCodebaseId);return}if("SUCCEEDED"!==e.status||!e.worktreeId)return;let n=await a.worktree.findUnique({where:{id:e.worktreeId},select:{codebaseId:!0}});await a.worktree.deleteMany({where:{id:e.worktreeId}}),this.publish(e.worktreeId,n?.codebaseId??null)}async projectOperation(e){if(!e.worktreeId||"SUCCEEDED"!==e.status||!e.resultJson)return;let t=x({...e,error:null});if(!t.worktree)return;let r=(0,o.parseWorktreeInventoryItem)(t.worktree),a=await (0,i.getPrismaClient)(),n=await a.worktree.findUnique({where:{id:e.worktreeId}});if(!n)return;let s=new Date(r.checkedAt);(await a.worktree.updateMany({where:{id:n.id,OR:[{lastCheckedAt:null},{lastCheckedAt:{lt:s}}]},data:{branch:r.branch,headSha:r.headSha,upstream:r.upstream,ahead:r.ahead,behind:r.behind,syncState:r.syncState,baseAhead:r.baseAhead,baseBehind:r.baseBehind,hasStagedChanges:r.hasStagedChanges??!1,hasUnstagedChanges:r.hasUnstagedChanges??!1,pushStatus:r.pushStatus??"UNKNOWN",availability:r.availability,statusError:r.error,lastCheckedAt:s}})).count>0&&this.publish(n.id,n.codebaseId)}async projectBranchOperation(e){if(!e.codebaseId||"SUCCEEDED"!==e.status||!e.resultJson)return;let r=x({...e,error:null});if(!r.worktree||"string"!=typeof r.baseBranch)return;let a=(0,o.parseWorktreeInventoryItem)(r.worktree),n=await (0,i.getPrismaClient)(),s=await n.codebase.findUnique({where:{id:e.codebaseId},select:{localBranchesJson:!0}});if(!s)return;let l=new Set(v(s.localBranchesJson));a.branch&&l.add(a.branch);let c=e.worktreeId;await n.$transaction(async i=>{if(await i.codebase.update({where:{id:e.codebaseId},data:{localBranchesJson:JSON.stringify([...l].sort((e,t)=>e.localeCompare(t)))}}),e.worktreeId){if(1!==(await i.worktree.updateMany({where:{id:e.worktreeId,codebaseId:e.codebaseId},data:{...this.inventoryData(a),gitDirectory:a.gitDirectory,baseBranchOverride:r.baseBranch,missingAt:null}})).count)throw Error("Worktree no longer exists");return}c=(await i.worktree.upsert({where:{codebaseId_gitDirectory:{codebaseId:e.codebaseId,gitDirectory:a.gitDirectory}},create:{id:(0,t.randomUUID)(),codebaseId:e.codebaseId,gitDirectory:a.gitDirectory,...this.inventoryData(a),baseBranchOverride:r.baseBranch},update:{...this.inventoryData(a),baseBranchOverride:r.baseBranch,missingAt:null}})).id}),this.publish(c??null,e.codebaseId),await this.skillsService?.requestAutoReconcile(),e.worktreeId&&await this.restartWatch(e.worktreeId)}async waitForJob(e){let t=n.agentEventBus.iterate((0,n.agentJobChangedTopic)(e)),r=Date.now()+3e4;try{for(;Date.now()<r;){let i=await this.agentControl.getJob(e);if(!i)throw Error("Worktree job disappeared");if(["SUCCEEDED","FAILED","CANCELLED","TIMED_OUT"].includes(i.status))return i;await Promise.race([t.next(),new Promise(e=>setTimeout(e,r-Date.now()))])}throw await this.agentControl.cancelJob(e),Error("Agent did not respond in time")}finally{await t.return?.()}}},"worktreeDisplayPath",0,w],504173);let k=new Set(["SUCCEEDED","FAILED","CANCELLED","TIMED_OUT","INVALID"]),_={agents:{include:{agent:!0}},jobs:{orderBy:{createdAt:"asc"}}};function $(e){return null!==e.lastSeenAt&&Date.now()-e.lastSeenAt.getTime()<=a.AGENT_ONLINE_WINDOW_MS&&null===e.disconnectedAt}function I(e){try{let t=JSON.parse(e.capabilitiesJson);return Array.isArray(t)?t.filter(e=>"string"==typeof e):[]}catch{return[]}}function S(e){return null===e?null:JSON.parse(e)}function E(e){return(0,r.buildDataTargetsPayload)(S(e.payloadJson)).targets.map(e=>e.path)}function T(e,t){let i=e===r.BUILD_DATA_DELETE_JOB_KIND?"delete":"size";return`Invalid Build Data ${i} result: ${t instanceof Error?t.message:String(t)}`}function C(e,t,r){try{for(let i of E(t)){let a=e.get(R(t.agentId,i));a&&(a.error=r)}}catch{}}function R(e,r){return(0,t.createHash)("sha256").update(e).update("\0").update(r).digest("base64url")}e.s(["BuildDataService",0,class{agentControlService;initialized;constructor(e){this.agentControlService=e,this.initialized=!1,this.agentControlService.registerCompletionHandler(r.BUILD_DATA_DELETE_JOB_KIND,e=>this.projectDeletion(e))}async initialize(){this.initialized||(await this.pruneHistory(),this.initialized=!0)}async refresh(e){await this.initialize();let r=e?.trim()||(0,t.randomUUID)();return await this.ensureCollection(r),await this.getCollection(r)}async getCollection(e){await this.initialize();let t=await this.loadCollection(e);if(!t)return null;!t.finishedAt&&t.deadlineAt.getTime()<=Date.now()&&(await this.expireCollection(t),t=await this.loadCollection(e)??t);let r=await this.snapshot(t);if("COMPLETED"===r.status&&!t.finishedAt){let t=new Date,a=await (0,i.getPrismaClient)();await a.buildDataCollection.updateMany({where:{id:e,finishedAt:null},data:{finishedAt:t}}),r.finishedAt=t.toISOString()}return r}async *subscribe(e){await this.initialize();let t=n.agentEventBus.iterate((0,n.buildDataCollectionChangedTopic)(e));try{let r=await this.getCollection(e);for(r&&(yield r);;){if((await t.next()).done)return;let r=await this.getCollection(e);r&&(yield r)}}finally{await t.return?.()}}async calculateSizes(e,t,i){let a=await this.requireCollection(e);return await this.createTargetJobs(a,t,i,r.BUILD_DATA_SIZE_JOB_KIND),await this.getCollection(e)}async deleteEntries(e,t,i){let a=await this.requireCollection(e);return await this.createTargetJobs(a,t,i,r.BUILD_DATA_DELETE_JOB_KIND),await this.getCollection(e)}async history(e=100,t){await this.initialize(),await this.pruneHistory();let r=Math.max(1,Math.min(e,200)),a=await (0,i.getPrismaClient)(),n=t?await a.buildDataDeletionHistory.findUnique({where:{id:t},select:{id:!0,deletedAt:!0}}):null,s=await a.buildDataDeletionHistory.findMany({where:n?{OR:[{deletedAt:{lt:n.deletedAt}},{deletedAt:n.deletedAt,id:{lt:n.id}}]}:void 0,orderBy:[{deletedAt:"desc"},{id:"desc"}],take:r+1}),o=s.length>r,l=s.slice(0,r);return{items:l,nextCursor:o?l.at(-1)?.id??null:null}}async clearHistory(){await this.initialize();let e=await (0,i.getPrismaClient)();return(await e.buildDataDeletionHistory.deleteMany()).count}async ensureCollection(e){let t=await (0,i.getPrismaClient)(),a=await t.buildDataCollection.findUnique({where:{id:e},select:{id:!0}});if(!a){let i=await this.agentControlService.listAgents();try{a=await t.buildDataCollection.create({data:{id:e,deadlineAt:new Date(Date.now()+6e4),agents:{create:i.map(e=>({agentId:e.id,initialStatus:$(e)?I(e).includes(r.BUILD_DATA_SCAN_JOB_KIND)?"QUEUING":"UNSUPPORTED":"OFFLINE"}))}},select:{id:!0}}),this.publish(e)}catch(r){if(!(a=await t.buildDataCollection.findUnique({where:{id:e},select:{id:!0}})))throw r}}await this.ensureScanJobs(e)}async ensureScanJobs(e){let t=await (0,i.getPrismaClient)(),a=await t.buildDataCollection.findUnique({where:{id:e},select:{deadlineAt:!0,finishedAt:!0}});if(!a||a.finishedAt||a.deadlineAt<=new Date)return;let n=await t.buildDataCollectionAgent.findMany({where:{collectionId:e,initialStatus:"QUEUING"},include:{agent:!0}}),s=new Set((await t.agentJob.findMany({where:{buildDataCollectionId:e,kind:r.BUILD_DATA_SCAN_JOB_KIND},select:{agentId:!0}})).map(e=>e.agentId));for(let i of n)if(!s.has(i.agentId))try{let a=await t.worktree.findMany({where:{missingAt:null,codebase:{agentId:i.agentId}},select:{id:!0,folder:!0}});await this.agentControlService.createJob({agentId:i.agentId,kind:r.BUILD_DATA_SCAN_JOB_KIND,payload:{mode:i.agent.derivedDataLocationMode,path:i.agent.derivedDataPath,worktrees:a},idempotencyKey:`build-data:scan:${e}`,timeoutSeconds:45,buildDataCollectionId:e,visibility:"SYSTEM"})}catch(r){await t.buildDataCollectionAgent.update({where:{collectionId_agentId:{collectionId:e,agentId:i.agentId}},data:{initialStatus:"FAILED",error:r instanceof Error?r.message:String(r)}}),this.publish(e)}}async createTargetJobs(e,t,r,a){let n=[...new Set(t)];if(!n.length)throw Error("Select at least one Derived Data entry");let s=new Map(e.entries.map(e=>[e.id,e])),o=n.map(e=>{let t=s.get(e);if(!t)throw Error("A selected Derived Data entry is no longer available");return t}),l=new Map;for(let e of o){let t=l.get(e.agent.id)??[];t.push(e),l.set(e.agent.id,t)}let c=await (0,i.getPrismaClient)(),u=[];for(let[e,t]of l){let r=t[0].agent,i=await c.agent.findUnique({where:{id:e}});if(!i||!$(i))throw Error(`${r.name} is offline; reconnect it before running this operation`);if(!I(i).includes(a))throw Error(`${r.name} must be updated before this operation can run`);u.push({agentId:e,entries:t})}for(let{agentId:t,entries:i}of u)await this.agentControlService.createJob({agentId:t,kind:a,payload:{targets:i.map(({path:e,rootPath:t})=>({path:e,rootPath:t}))},idempotencyKey:`${a}:${e.id}:${r}:${t}`,timeoutSeconds:604800,buildDataCollectionId:e.id,visibility:"SYSTEM"})}async requireCollection(e){let t=await this.getCollection(e);if(!t)throw Error("Derived Data collection not found");if("COMPLETED"!==t.status)throw Error("Wait for the Derived Data scan to finish");return t}async loadCollection(e){return(await (0,i.getPrismaClient)()).buildDataCollection.findUnique({where:{id:e},include:_})}progress(e){let t=new Map(e.jobs.filter(e=>e.kind===r.BUILD_DATA_SCAN_JOB_KIND).map(e=>[e.agentId,e])),i=e.agents.map(e=>{let i=t.get(e.agentId),a=e.initialStatus,n=e.error,s=[];if("QUEUING"===e.initialStatus&&i&&(a=i.status,n=i.error,"SUCCEEDED"===i.status))try{s=(0,r.parseBuildDataScanResult)(S(i.resultJson)).warnings}catch(e){a="INVALID",n=e instanceof Error?e.message:String(e)}return{agent:e.agent,status:a,jobId:i?.id??null,error:n,warnings:s}}),a=i.filter(({status:e})=>"OFFLINE"!==e&&"UNSUPPORTED"!==e),n=a.filter(({status:e})=>k.has(e));return{agents:i,eligibleCount:a.length,finishedCount:n.length,successfulCount:a.filter(({status:e})=>"SUCCEEDED"===e).length}}async snapshot(e){let t=this.progress(e),r=await this.entries(e,!1);return{id:e.id,status:t.finishedCount===t.eligibleCount?"COMPLETED":"COLLECTING",createdAt:e.createdAt.toISOString(),deadlineAt:e.deadlineAt.toISOString(),finishedAt:e.finishedAt?.toISOString()??null,progress:t,entries:r}}async entries(e,t){let a=await (0,i.getPrismaClient)(),n=new Map(e.agents.map(e=>[e.agentId,e.agent])),s=await a.worktree.findMany({where:{missingAt:null,codebase:{agentId:{in:[...n.keys()]}}},include:{codebase:{select:{agentId:!0}}}}),o=new Map;for(let e of s){let t=o.get(e.codebase.agentId)??[];t.push(e),o.set(e.codebase.agentId,t)}let l=new Map;for(let t of e.jobs){let e;if(t.kind!==r.BUILD_DATA_SCAN_JOB_KIND||"SUCCEEDED"!==t.status)continue;let i=n.get(t.agentId);if(i){try{e=(0,r.parseBuildDataScanResult)(S(t.resultJson))}catch{continue}for(let r of e.entries){let e=(r.workspacePath?(o.get(t.agentId)??[]).filter(e=>(function(e,t){let r="/"===e?e:e.replace(/\/+$/,"");return t===r||t.startsWith(`${r}/`)})(e.folder,r.workspacePath)).sort((e,t)=>t.folder.length-e.folder.length):[])[0]??null,a=R(t.agentId,r.path);l.set(a,{id:a,name:r.name,status:"PENDING"===r.kind?"PENDING":"SHARED_CACHE"===r.kind?"SHARED_CACHE":e?"READY":"UNLINKED",workspacePath:r.workspacePath,worktreeId:e?.id??null,worktreePath:e?w(e.folder,i.baseRepoDirectory):null,sizeBytes:null,operation:"IDLE",error:null,agent:i,path:r.path,rootPath:r.rootPath})}}}for(let i of e.jobs){if(i.kind===r.BUILD_DATA_SIZE_JOB_KIND&&"SUCCEEDED"===i.status)try{for(let e of(0,r.parseBuildDataSizeResult)(S(i.resultJson)).sizes){let t=l.get(R(i.agentId,e.path));t&&(t.sizeBytes=e.sizeBytes,t.error=e.error)}}catch(e){C(l,i,T(r.BUILD_DATA_SIZE_JOB_KIND,e))}if(i.kind===r.BUILD_DATA_DELETE_JOB_KIND&&"SUCCEEDED"===i.status)try{for(let e of(0,r.parseBuildDataDeleteResult)(S(i.resultJson)).deleted){let r=R(i.agentId,e.path),a=l.get(r);a&&(e.deleted&&!t?l.delete(r):a.error=e.error)}}catch(e){C(l,i,T(r.BUILD_DATA_DELETE_JOB_KIND,e))}if("QUEUED"===i.status||"RUNNING"===i.status){if(i.kind!==r.BUILD_DATA_SIZE_JOB_KIND&&i.kind!==r.BUILD_DATA_DELETE_JOB_KIND)continue;try{for(let e of E(i)){let t=l.get(R(i.agentId,e));t&&(t.operation=i.kind===r.BUILD_DATA_DELETE_JOB_KIND?"DELETING":"SIZING")}}catch{}}if("SUCCEEDED"!==i.status&&k.has(i.status)&&(i.kind===r.BUILD_DATA_SIZE_JOB_KIND||i.kind===r.BUILD_DATA_DELETE_JOB_KIND))try{for(let e of E(i)){let t=l.get(R(i.agentId,e));t&&(t.error=i.error||"Build Data operation failed")}}catch{}}return[...l.values()].sort((e,t)=>e.agent.name.localeCompare(t.agent.name)||e.name.localeCompare(t.name))}async expireCollection(e){let t=await (0,i.getPrismaClient)(),a=new Set(e.jobs.filter(e=>e.kind===r.BUILD_DATA_SCAN_JOB_KIND).map(e=>e.agentId));await t.buildDataCollectionAgent.updateMany({where:{collectionId:e.id,initialStatus:"QUEUING",agentId:{notIn:[...a]}},data:{initialStatus:"TIMED_OUT"}}),await this.agentControlService.timeoutBuildDataCollectionJobs(e.id),this.publish(e.id)}async projectDeletion(e){let a;if("SUCCEEDED"!==e.status||!e.buildDataCollectionId||!e.resultJson)return;await this.pruneHistory();let n=await (0,i.getPrismaClient)();if(await n.buildDataDeleteProjection.findUnique({where:{jobId:e.id}}))return;try{a=(0,r.parseBuildDataDeleteResult)(S(e.resultJson)).deleted.filter(e=>e.deleted)}catch(i){let t=T(r.BUILD_DATA_DELETE_JOB_KIND,i);try{await n.buildDataDeleteProjection.create({data:{jobId:e.id,error:t}})}catch(t){if(!await n.buildDataDeleteProjection.findUnique({where:{jobId:e.id}}))throw t}return}if(!a.length)return void await n.buildDataDeleteProjection.create({data:{jobId:e.id}});let s=await this.loadCollection(e.buildDataCollectionId);if(!s)return;let o=new Map((await this.entries(s,!0)).filter(t=>t.agent.id===e.agentId).map(e=>[e.path,e]));try{await n.$transaction(async r=>{if(!await r.buildDataDeleteProjection.findUnique({where:{jobId:e.id}}))for(let i of(await r.buildDataDeleteProjection.create({data:{jobId:e.id}}),a)){let a=o.get(i.path);if(!a)continue;let n=a.worktreeId?(await r.worktree.findUnique({where:{id:a.worktreeId},select:{id:!0}}))?.id??null:null;await r.buildDataDeletionHistory.create({data:{id:(0,t.randomUUID)(),agentId:a.agent.id,agentName:a.agent.name,folderName:a.name,worktreeId:n,worktreePath:a.worktreePath,source:"USER",jobId:e.id,targetKey:a.id}})}})}catch(t){if(!await n.buildDataDeleteProjection.findUnique({where:{jobId:e.id}}))throw t}}async pruneHistory(){let e=await (0,i.getPrismaClient)();await e.buildDataDeletionHistory.deleteMany({where:{deletedAt:{lt:new Date(Date.now()-7776e6)}}})}publish(e){n.agentEventBus.publish((0,n.buildDataCollectionChangedTopic)(e),{buildDataCollectionChanged:{id:e}})}}],925991),e.s([],396763)},971619,e=>{"use strict";var t=e.i(750227);e.s(["effectiveBuildsDirectory",0,function(e){var r;return e.buildsDirectory??((r=e.baseRepoDirectory)?/^[a-z]:[\\/]/i.test(r)||r.startsWith("\\\\")?t.win32.join(r,"Builds"):t.posix.join(r,"Builds"):null)}])},224174,669602,190714,e=>{"use strict";var t=e.i(666680),r=e.i(750227),i=e.i(807055),a=e.i(243783);e.i(805422);var n=e.i(694355),s=e.i(661983),o=e.i(971619);let l=new Set(["smartphone","hammer","play","test-tube","archive","rocket"]),c=new Set(["SUCCEEDED","FAILED","CANCELLED","TIMED_OUT"]),u=["QUEUED","PREPARING","RUNNING"];function d(e,t=null){if(null===e)return t;try{return JSON.parse(e)}catch{return t}}function p(e,t){if(!e||"object"!=typeof e||Array.isArray(e))throw Error(`${t} must be an object`);return e}function m(e){return Array.isArray(e)?e.filter(e=>"string"==typeof e):[]}function h(e){return null!==e.lastSeenAt&&Date.now()-e.lastSeenAt.getTime()<=n.AGENT_ONLINE_WINDOW_MS&&null===e.disconnectedAt}function f(e){return m(d(e.capabilitiesJson,[]))}function g(e,t,r=80){let i=e.trim();if(!i)throw Error(`${t} is required`);if(i.length>r)throw Error(`${t} is too long`);return i}function y(e){return`${e.type}:${e.id}`}function v(e){if(e.codebaseId)return e.codebaseId;let t=d(e.snapshotJson,{});if(t&&"object"==typeof t&&!Array.isArray(t)){let e=t.codebase;if(e&&"object"==typeof e&&!Array.isArray(e)){let t=e.id;if("string"==typeof t&&t.trim())return t}}throw Error("Build coordination metadata is unavailable")}function b(e){return"SUCCEEDED"===e?"SUCCEEDED":"CANCELLED"===e?"CANCELLED":"FAILED"}let w={agent:!0,codebase:{include:{repository:!0}},worktree:{include:{_count:{select:{builds:{where:{status:{in:u}}}}}}},configuration:{include:{source:!0,project:!0}},artifacts:{orderBy:{createdAt:"asc"}},scriptExecutions:{orderBy:[{phase:"asc"},{position:"asc"}]},deployments:{orderBy:{createdAt:"desc"}},exports:{orderBy:{createdAt:"desc"}}};e.s(["BuildsService",0,class{agentControl;constructor(e){this.agentControl=e,this.agentControl.registerCompletionHandler(i.IOS_BUILD_JOB_KIND,e=>this.projectBuildCompletion(e)),this.agentControl.registerCompletionHandler(i.IOS_DEPLOY_JOB_KIND,e=>this.projectDeploymentCompletion(e)),this.agentControl.registerCompletionHandler(i.IOS_EXPORT_JOB_KIND,e=>this.projectExportCompletion(e)),this.agentControl.registerCompletionHandler(i.IOS_TEST_RESULTS_JOB_KIND,e=>this.projectGeneratedReportCompletion(e)),this.agentControl.registerCompletionHandler(i.IOS_COVERAGE_REPORT_JOB_KIND,e=>this.projectGeneratedReportCompletion(e))}publish(e){s.agentEventBus.publish((0,s.buildTopic)(e),{buildChanged:{id:e}}),s.agentEventBus.publish(s.BUILDS_CHANGED_TOPIC,{buildsChanged:{id:e}})}async requireWorktree(e,t){let r=await (0,a.getPrismaClient)(),i=await r.worktree.findUnique({where:{id:e},include:{codebase:{include:{agent:!0,repository:!0}}}});if(!i||i.missingAt||"AVAILABLE"!==i.availability)throw Error("Worktree is unavailable");if(!h(i.codebase.agent))throw Error("Agent is offline");if(!f(i.codebase.agent).includes(t))throw Error("Agent must be updated to use iOS builds");return i}identity(e){return{codebaseId:e.codebaseId,worktreeId:e.id,branch:e.branch,folder:e.folder,gitDirectory:e.gitDirectory,expectedOrigin:e.codebase.repository.canonicalOrigin,headSha:e.headSha,baseBranch:e.baseBranchOverride??e.codebase.defaultBranch??null}}async ensureProject(e){let r=await (0,a.getPrismaClient)(),i=await r.codebase.findUnique({where:{id:e},select:{repositoryId:!0}});if(!i)throw Error("Codebase not found");return r.codebaseProject.upsert({where:{repositoryId_type:{repositoryId:i.repositoryId,type:"IOS_APP"}},create:{id:(0,t.randomUUID)(),repositoryId:i.repositoryId,type:"IOS_APP"},update:{}})}async project(e){let t=await (0,a.getPrismaClient)(),r=await t.codebase.findUnique({where:{id:e},include:{repository:!0}});if(!r)return null;let i=await t.codebaseProject.findUnique({where:{repositoryId_type:{repositoryId:r.repositoryId,type:"IOS_APP"}},include:{configurations:{orderBy:{name:"asc"},include:{source:{include:{observations:{where:{codebaseId:e},orderBy:{lastParseAttemptAt:"desc"},take:1}}}}}}}),n=await t.codebaseRepositoryBuildScript.findMany({where:{repositoryId:r.repositoryId,script:{deletedAt:null}},orderBy:[{position:"asc"},{script:{name:"asc"}}],include:{script:!0}});return i?{...i,repository:r.repository,allowedScripts:n}:null}async createProject(e){return await this.ensureProject(e),this.project(e)}async projectForWorktree(e){let t=await (0,a.getPrismaClient)(),r=await t.worktree.findUnique({where:{id:e},select:{codebaseId:!0}});return r?this.project(r.codebaseId):null}async saveConfiguration(e){let r=await this.ensureProject(e.codebaseId),n=(0,i.parseBuildSource)({kind:e.sourceKind,relativePath:e.sourcePath}),s=g(e.name,"Configuration name"),o=g(e.scheme,"Scheme",256),c=g(e.buildConfiguration,"Xcode configuration",256);if(!i.BUILD_ACTIONS.includes(e.defaultAction))throw Error("Build action is invalid");let u=e.iconKey?.trim()||null;if(u&&!l.has(u))throw Error("Icon is invalid");let d=(0,i.parseBuildAdvancedSettings)(e.advancedSettings??i.DEFAULT_BUILD_ADVANCED_SETTINGS),p=await (0,a.getPrismaClient)(),m=e.id?await p.buildConfiguration.findUnique({where:{id:e.id}}):null;if(e.id&&(!m||m.projectId!==r.id))throw Error("Build configuration not found");let h=await p.buildSource.upsert({where:{projectId_relativePath:{projectId:r.id,relativePath:n.relativePath}},create:{id:(0,t.randomUUID)(),projectId:r.id,kind:n.kind,relativePath:n.relativePath},update:{kind:n.kind}}),f=m?.id??(0,t.randomUUID)();return p.buildConfiguration.upsert({where:{id:f},create:{id:f,projectId:r.id,sourceId:h.id,name:s,iconKey:u,scheme:o,buildConfiguration:c,defaultAction:e.defaultAction,advancedSettingsJson:JSON.stringify(d)},update:{sourceId:h.id,name:s,iconKey:u,scheme:o,buildConfiguration:c,defaultAction:e.defaultAction,advancedSettingsJson:JSON.stringify(d)},include:{source:!0}})}async deleteConfiguration(e){let t=await (0,a.getPrismaClient)();if(await t.build.findFirst({where:{configurationId:e,status:{in:u}}}))throw Error("Configuration has an active build");return 1===(await t.buildConfiguration.deleteMany({where:{id:e}})).count}async scripts(){return(await (0,a.getPrismaClient)()).buildScript.findMany({where:{deletedAt:null},orderBy:{name:"asc"}})}async saveScript(e){let r=g(e.name,"Script name"),n=e.preBuildScript?.trim()||null,s=e.postBuildScript?.trim()||null;if(!n&&!s)throw Error("A pre-build or post-build script is required");let o=e.timeoutSeconds??300;if(!Number.isInteger(o)||o<1||o>3600)throw Error("Script timeout must be between 1 and 3600 seconds");if(!i.BUILD_SCRIPT_FAILURE_BEHAVIORS.includes(e.failureBehavior))throw Error("Script failure behavior is invalid");let l=await (0,a.getPrismaClient)(),c=e.id??(0,t.randomUUID)();return l.buildScript.upsert({where:{id:c},create:{id:c,name:r,preBuildScript:n,postBuildScript:s,enabledByDefault:e.enabledByDefault,timeoutSeconds:o,failureBehavior:e.failureBehavior},update:{name:r,preBuildScript:n,postBuildScript:s,enabledByDefault:e.enabledByDefault,timeoutSeconds:o,failureBehavior:e.failureBehavior,deletedAt:null}})}async deleteScript(e){let t=await (0,a.getPrismaClient)(),r=await t.buildScript.updateMany({where:{id:e,deletedAt:null},data:{deletedAt:new Date}});return await t.codebaseRepositoryBuildScript.deleteMany({where:{scriptId:e}}),1===r.count}async setAllowedScripts(e,t){let r=await (0,a.getPrismaClient)(),i=await r.codebase.findUnique({where:{id:e}});if(!i)throw Error("Codebase not found");let n=[...new Set(t)];if((await r.buildScript.findMany({where:{id:{in:n},deletedAt:null}})).length!==n.length)throw Error("Build script not found");return await r.$transaction(async e=>{await e.codebaseRepositoryBuildScript.deleteMany({where:{repositoryId:i.repositoryId}}),n.length&&await e.codebaseRepositoryBuildScript.createMany({data:n.map((e,t)=>({repositoryId:i.repositoryId,scriptId:e,position:t}))})}),this.project(e)}async waitForJob(e,t=12e4){let r=s.agentEventBus.iterate((0,s.agentJobChangedTopic)(e)),i=Date.now()+t;try{for(;Date.now()<i;){let t=await this.agentControl.getJob(e);if(!t)throw Error("Agent job disappeared");if(c.has(t.status))return t;await Promise.race([r.next(),new Promise(e=>setTimeout(e,Math.max(1,i-Date.now())))])}throw await this.agentControl.cancelJob(e),Error("Agent did not respond in time")}finally{await r.return?.()}}result(e){if("SUCCEEDED"!==e.status)throw Error(e.error||"Agent operation failed");return p(d(e.resultJson,{}),"agent result")}async discoverSources(e,t){let r=await this.requireWorktree(e,i.IOS_SOURCE_DISCOVER_JOB_KIND),n=await this.agentControl.createJob({agentId:r.codebase.agentId,codebaseId:r.codebaseId,worktreeId:r.id,kind:i.IOS_SOURCE_DISCOVER_JOB_KIND,payload:this.identity(r),idempotencyKey:`ios:source:discover:${t}:${r.id}`,timeoutSeconds:60,visibility:"SYSTEM"});try{let e=this.result(await this.waitForJob(n.id));return Array.isArray(e.sources)?e.sources:[]}finally{let e=await (0,a.getPrismaClient)();await e.agentJob.deleteMany({where:{id:n.id,visibility:"SYSTEM"}})}}async reparse(e,r,n){let s=await this.requireWorktree(r,i.IOS_SOURCE_PARSE_JOB_KIND),o=await (0,a.getPrismaClient)(),l=await o.buildConfiguration.findUnique({where:{id:e},include:{source:{include:{project:!0}}}});if(!l||l.source.project.repositoryId!==s.codebase.repositoryId)throw Error("Build configuration is not available for this worktree");let c=`worktree:${s.id}`,u=await o.buildSourceObservation.findUnique({where:{sourceId_scopeKey:{sourceId:l.sourceId,scopeKey:c}}}),d=new Date;await o.buildSourceObservation.upsert({where:{sourceId_scopeKey:{sourceId:l.sourceId,scopeKey:c}},create:{id:(0,t.randomUUID)(),sourceId:l.sourceId,scopeKey:c,codebaseId:s.codebaseId,worktreeId:s.id,status:"PARSING",lastParseAttemptAt:d},update:{status:"PARSING",error:null,lastParseAttemptAt:d}});let p=await this.agentControl.createJob({agentId:s.codebase.agentId,codebaseId:s.codebaseId,worktreeId:s.id,kind:i.IOS_SOURCE_PARSE_JOB_KIND,payload:{...this.identity(s),source:{kind:l.source.kind,relativePath:l.source.relativePath},scheme:l.scheme},idempotencyKey:`ios:source:parse:${n}:${l.id}:${s.id}`,timeoutSeconds:120,visibility:"SYSTEM"});try{let e=this.result(await this.waitForJob(p.id)),t=m(e.schemes),r=m(e.configurations),i=t.includes(l.scheme)&&r.includes(l.buildConfiguration);return o.buildSourceObservation.update({where:{sourceId_scopeKey:{sourceId:l.sourceId,scopeKey:c}},data:{status:i?"VALID":"INVALID",schemesJson:JSON.stringify(t),configurationsJson:JSON.stringify(r),testPlansJson:JSON.stringify(m(e.testPlans)),error:i?null:"The saved scheme or configuration is no longer available",stale:!1,headSha:"string"==typeof e.headSha?e.headSha:s.headSha,xcodeVersion:"string"==typeof e.xcodeVersion?e.xcodeVersion:null,lastParsedAt:new Date}})}catch(t){let e=t instanceof Error?t.message:String(t);return o.buildSourceObservation.update({where:{sourceId_scopeKey:{sourceId:l.sourceId,scopeKey:c}},data:{status:"ERROR",error:e,stale:!!u?.lastParsedAt}})}finally{await o.agentJob.deleteMany({where:{id:p.id,visibility:"SYSTEM"}})}}async inspectSource(e){let t=await this.requireWorktree(e.worktreeId,i.IOS_SOURCE_PARSE_JOB_KIND),r=(0,i.parseBuildSource)({kind:e.sourceKind,relativePath:e.sourcePath}),n=await this.agentControl.createJob({agentId:t.codebase.agentId,codebaseId:t.codebaseId,worktreeId:t.id,kind:i.IOS_SOURCE_PARSE_JOB_KIND,payload:{...this.identity(t),source:r,scheme:e.scheme?.trim()||null},idempotencyKey:`ios:source:inspect:${e.requestId}:${t.id}:${r.relativePath}:${e.scheme??""}`,timeoutSeconds:120,visibility:"SYSTEM"});try{let e=this.result(await this.waitForJob(n.id));return{source:r,schemes:m(e.schemes),configurations:m(e.configurations),testPlans:m(e.testPlans),headSha:"string"==typeof e.headSha?e.headSha:t.headSha,xcodeVersion:"string"==typeof e.xcodeVersion?e.xcodeVersion:null}}finally{let e=await (0,a.getPrismaClient)();await e.agentJob.deleteMany({where:{id:n.id,visibility:"SYSTEM"}})}}async destinations(e){let t=await this.requireWorktree(e.worktreeId,i.IOS_DESTINATIONS_JOB_KIND),r=await (0,a.getPrismaClient)(),n=await r.buildConfiguration.findUnique({where:{id:e.configurationId},include:{source:{include:{project:!0}}}});if(!n||n.source.project.repositoryId!==t.codebase.repositoryId)throw Error("Build configuration is not available for this worktree");let s=e.action??n.defaultAction;if(!i.BUILD_ACTIONS.includes(s))throw Error("Build action is invalid");let o=function(e){if(!i.GENERIC_BUILD_DESTINATION_ACTIONS.includes(e))return[];let t={type:"PHYSICAL_DEVICE",id:"generic-ios",name:"Any Physical iOS Device",platform:"iOS",osVersion:null,state:null,generic:!0};return"ARCHIVE"===e?[t]:[{type:"SIMULATOR",id:"generic-ios-simulator",name:"Any iOS Simulator",platform:"iOS Simulator",osVersion:null,state:null,generic:!0},t]}(s);if("ARCHIVE"===s)return o;let l=await this.agentControl.createJob({agentId:t.codebase.agentId,codebaseId:t.codebaseId,worktreeId:t.id,kind:i.IOS_DESTINATIONS_JOB_KIND,payload:{...this.identity(t),source:{kind:n.source.kind,relativePath:n.source.relativePath},scheme:n.scheme,configuration:n.buildConfiguration,action:s},idempotencyKey:`ios:destinations:${e.requestId}:${n.id}:${t.id}:${s}`,timeoutSeconds:120,visibility:"SYSTEM"});try{let e=this.result(await this.waitForJob(l.id));return Array.isArray(e.destinations)?e.destinations:[]}finally{await r.agentJob.deleteMany({where:{id:l.id,visibility:"SYSTEM"}})}}async destinationsForBuild(e,t){let r=await (0,a.getPrismaClient)(),n=await r.build.findUnique({where:{id:e},include:{artifacts:!0}});if(!n||"SUCCEEDED"!==n.status||!n.worktreeId||!n.artifacts.some(e=>"RUNNABLE_APP"===e.kind))throw Error("A successful runnable build is required");let s=await this.requireWorktree(n.worktreeId,i.IOS_RUN_DESTINATIONS_JOB_KIND);if(n.agentId!==s.codebase.agentId||n.codebaseId!==s.codebaseId)throw Error("The build no longer belongs to this worktree checkout");let o=await this.agentControl.createJob({agentId:s.codebase.agentId,codebaseId:s.codebaseId,worktreeId:s.id,kind:i.IOS_RUN_DESTINATIONS_JOB_KIND,payload:{...this.identity(s),destinationType:n.destinationType},idempotencyKey:`ios:build-destinations:${g(t,"Request ID",200)}:${n.id}`,timeoutSeconds:120,visibility:"SYSTEM"});try{let e=this.result(await this.waitForJob(o.id));return(Array.isArray(e.destinations)?e.destinations:[]).map(e=>(0,i.parseBuildDestination)(e)).filter(e=>e.type===n.destinationType&&!e.generic)}finally{await r.agentJob.deleteMany({where:{id:o.id,visibility:"SYSTEM"}})}}async startBuild(e){let n=g(e.requestId,"Request ID",200),s=`${e.worktreeId}:${n}`,l=await (0,a.getPrismaClient)(),c=await l.build.findUnique({where:{requestKey:s},include:w});if(c)return c;let u=await this.requireWorktree(e.worktreeId,i.IOS_BUILD_JOB_KIND);if(e.worktreeCoverage&&!f(u.codebase.agent).includes(i.IOS_COVERAGE_REPORT_JOB_KIND))throw Error("Build agent must be updated for worktree coverage");let m=await l.buildConfiguration.findUnique({where:{id:e.configurationId},include:{source:{include:{project:!0}}}});if(!m||m.source.project.repositoryId!==u.codebase.repositoryId)throw Error("Build configuration is not available for this worktree");let h=await l.buildSourceObservation.findUnique({where:{sourceId_scopeKey:{sourceId:m.sourceId,scopeKey:`worktree:${u.id}`}}}),y=e.action??m.defaultAction;if(!i.BUILD_ACTIONS.includes(y))throw Error("Build action is invalid");let v=(0,i.parseBuildDestination)(e.destination);if(!i.BUILD_DESTINATION_TYPES.includes(v.type))throw Error("Destination is invalid");if("ARCHIVE"===y&&("PHYSICAL_DEVICE"!==v.type||!v.generic))throw Error("Archive builds require the generic physical iOS destination");if(v.generic&&!i.GENERIC_BUILD_DESTINATION_ACTIONS.includes(y))throw Error("This build action requires a concrete destination");let b=p(d(m.advancedSettingsJson,{}),"saved advanced settings"),x=e.advancedSettings?p(e.advancedSettings,"advanced settings override"):{},k=(0,i.parseBuildAdvancedSettings)({...b,...x,buildSettingOverrides:{...p(b.buildSettingOverrides??{},"saved overrides"),...p(x.buildSettingOverrides??{},"run overrides")}});if("TEST_WITHOUT_BUILDING"===y){if(!k.priorBuildForTestingId)throw Error("Test Without Building requires a prior Build for Testing result");let e=await l.build.findUnique({where:{id:k.priorBuildForTestingId},include:{artifacts:{where:{kind:{in:["TEST_PRODUCTS","XCTESTRUN"]}},orderBy:{createdAt:"asc"}}}});if(!e||"SUCCEEDED"!==e.status||"BUILD_FOR_TESTING"!==e.action)throw Error("Test Without Building requires a successful Build for Testing result");if(e.agentId!==u.codebase.agentId||e.worktreeId!==u.id||e.configurationId!==m.id)throw Error("The prior Build for Testing result is not compatible with this agent, worktree, and configuration");if(e.destinationType!==v.type)throw Error("The prior Build for Testing result uses a different destination type");let t=p(d(e.snapshotJson,{}),"prior Build for Testing snapshot"),a=p(t.configuration??{},"prior Build for Testing configuration snapshot"),n=(0,i.parseBuildAdvancedSettings)(a.advancedSettings??{});if(k.testPlan&&n.testPlan&&k.testPlan!==n.testPlan)throw Error("The selected test plan does not match the prior Build for Testing result");let s=k.testPlan??n.testPlan??null,o=e.artifacts.filter(e=>"TEST_PRODUCTS"===e.kind&&e.relativePath.endsWith(".xctestproducts")),c=e.artifacts.filter(e=>"XCTESTRUN"===e.kind&&e.relativePath.endsWith(".xctestrun"));if(o.length>1)throw Error("The prior Build for Testing result contains multiple test-products artifacts");let h=o[0];if(h||1!==c.length||(h=c[0]),!h&&c.length>1&&s&&(h=c.find(e=>p(d(e.metadataJson,{}),"test-run artifact metadata").testPlan===s||e.relativePath.endsWith(`/${s}.xctestrun`)||e.relativePath===`${s}.xctestrun`)),!h&&c.length>1)throw Error("Select a test plan to choose among the captured .xctestrun artifacts");let f=h?.relativePath??"test-products.xctestproducts",g=(0,r.resolve)(e.artifactDirectory),y=(0,r.resolve)(g,f),b=(0,r.relative)(g,y);if(!b||b.startsWith("..")||(0,r.isAbsolute)(b))throw Error("The prior Build for Testing artifact path is invalid");k={...k,testPlan:s,priorTestProductsPath:f.endsWith(".xctestproducts")?y:null,priorXctestrunPath:f.endsWith(".xctestrun")?y:null}}let _=await l.codebaseRepositoryBuildScript.findMany({where:{repositoryId:u.codebase.repositoryId,script:{deletedAt:null}},orderBy:[{position:"asc"},{script:{name:"asc"}}],include:{script:!0}}),$=new Set(e.scriptIds??[]);if([...$].some(e=>!_.some(t=>t.scriptId===e)))throw Error("A selected build script is not allowed for this codebase");let I=_.filter(e=>$.has(e.scriptId)),S=(0,t.randomUUID)(),E=(0,o.effectiveBuildsDirectory)(u.codebase.agent);if(!E)throw Error("The agent builds directory is unavailable");let T=(0,r.join)(E,S),C={kind:m.source.kind,relativePath:m.source.relativePath},R=function(e){var t;let i=e.advancedSettings,a="TEST_WITHOUT_BUILDING"===e.action,n=["xcodebuild",...a?[]:[..."PACKAGE"===e.source.kind?[]:"PROJECT"===e.source.kind?["-project",e.source.relativePath]:["-workspace",e.source.relativePath],"-scheme",e.scheme,"-configuration",e.configuration],"-destination",(t=e.destination).generic?"SIMULATOR"===t.type?"generic/platform=iOS Simulator":"generic/platform=iOS":"SIMULATOR"===t.type?`platform=iOS Simulator,id=${t.id}`:`platform=iOS,id=${t.id}`,"-hideShellScriptEnvironment","-resultBundlePath",(0,r.join)(e.artifactDirectory,"result.xcresult")];for(let e of(!a&&("RESOLVED_ONLY"===i.packageResolution?n.push("-onlyUsePackageVersionsFromResolvedFile"):"SKIP_UPDATES"===i.packageResolution?n.push("-skipPackageUpdates"):"DISABLE_AUTOMATIC"===i.packageResolution&&n.push("-disableAutomaticPackageResolution"),i.disablePackageRepositoryCache&&n.push("-disablePackageRepositoryCache"),"PROJECT_DEFAULT"!==i.signingStyle&&n.push(`CODE_SIGN_STYLE=${"AUTOMATIC"===i.signingStyle?"Automatic":"Manual"}`),i.developmentTeam&&n.push(`DEVELOPMENT_TEAM=${i.developmentTeam}`),i.codeSignIdentity&&n.push(`CODE_SIGN_IDENTITY=${i.codeSignIdentity}`),i.provisioningProfileSpecifier&&n.push(`PROVISIONING_PROFILE_SPECIFIER=${i.provisioningProfileSpecifier}`),i.productBundleIdentifier&&n.push(`PRODUCT_BUNDLE_IDENTIFIER=${i.productBundleIdentifier}`),i.allowProvisioningUpdates&&n.push("-allowProvisioningUpdates"),i.allowProvisioningDeviceRegistration&&n.push("-allowProvisioningDeviceRegistration")),i.testPlan&&n.push("-testPlan",i.testPlan),i.codeCoverage&&n.push("-enableCodeCoverage","YES"),null!==i.parallelTesting&&n.push("-parallel-testing-enabled",i.parallelTesting?"YES":"NO"),null!==i.parallelTestingWorkers&&n.push("-parallel-testing-worker-count",String(i.parallelTestingWorkers)),i.onlyTesting))n.push(`-only-testing:${e}`);for(let e of i.skipTesting)n.push(`-skip-testing:${e}`);if(!a)for(let[e,t]of Object.entries(i.buildSettingOverrides))n.push(`${e}=${t}`);"ARCHIVE"===e.action&&n.push("-archivePath",(0,r.join)(e.artifactDirectory,"archive.xcarchive")),"BUILD_FOR_TESTING"===e.action&&n.push("-testProductsPath",(0,r.join)(e.artifactDirectory,"test-products.xctestproducts")),"TEST_WITHOUT_BUILDING"===e.action&&i.priorTestProductsPath&&n.push("-testProductsPath",i.priorTestProductsPath),"TEST_WITHOUT_BUILDING"===e.action&&!i.priorTestProductsPath&&i.priorXctestrunPath&&n.push("-xctestrun",i.priorXctestrunPath),n.push({BUILD:"build",TEST:"test",ANALYZE:"analyze",ARCHIVE:"archive",BUILD_FOR_TESTING:"build-for-testing",TEST_WITHOUT_BUILDING:"test-without-building"}[e.action]);let s=n.map(e=>/^[A-Za-z0-9_./:=,-]+$/.test(e)?e:JSON.stringify(e)).join(" ");return`cd ${JSON.stringify(e.folder)} && xcrun ${s}`}({folder:u.folder,source:C,scheme:m.scheme,configuration:m.buildConfiguration,destination:v,action:y,advancedSettings:k,artifactDirectory:T}),P=I.map(({script:e,position:t})=>({id:e.id,name:e.name,preBuildScript:e.preBuildScript,postBuildScript:e.postBuildScript,timeoutSeconds:e.timeoutSeconds,failureBehavior:e.failureBehavior,position:t})),A={repository:{id:u.codebase.repository.id,name:u.codebase.repository.name,canonicalOrigin:u.codebase.repository.canonicalOrigin},codebase:{id:u.codebase.id,folder:u.codebase.folder},worktree:{id:u.id,folder:u.folder,branch:u.branch,headSha:u.headSha,codeStateHash:u.codeStateHash,hasStagedChanges:u.hasStagedChanges,hasUnstagedChanges:u.hasUnstagedChanges},agent:{id:u.codebase.agent.id,name:u.codebase.agent.name,hostname:u.codebase.agent.hostname},configuration:{id:m.id,name:m.name,iconKey:m.iconKey,source:C,scheme:m.scheme,buildConfiguration:m.buildConfiguration,action:y,advancedSettings:k,parse:h?{status:h.status,schemes:d(h.schemesJson,[]),configurations:d(h.configurationsJson,[]),testPlans:d(h.testPlansJson,[]),headSha:h.headSha,xcodeVersion:h.xcodeVersion,parsedAt:h.lastParsedAt?.toISOString()??null}:{status:"UNPARSED",schemes:[],configurations:[],testPlans:[],headSha:null,xcodeVersion:null,parsedAt:null}},destination:v,scripts:P,worktreeCoverage:!0===e.worktreeCoverage};await l.build.create({data:{id:S,requestKey:s,requestId:n,agentId:u.codebase.agentId,codebaseId:u.codebaseId,worktreeId:u.id,configurationId:m.id,status:"QUEUED",action:y,destinationType:v.type,destinationJson:JSON.stringify(v),snapshotJson:JSON.stringify(A),commandSummary:R,artifactDirectory:T,scriptExecutions:{create:P.flatMap(e=>[...e.preBuildScript?[{id:(0,t.randomUUID)(),scriptId:e.id,phase:"PRE_BUILD",position:e.position,nameSnapshot:e.name,sourceSnapshot:e.preBuildScript,timeoutSeconds:e.timeoutSeconds,failureBehavior:e.failureBehavior}]:[],...e.postBuildScript?[{id:(0,t.randomUUID)(),scriptId:e.id,phase:"POST_BUILD",position:e.position,nameSnapshot:e.name,sourceSnapshot:e.postBuildScript,timeoutSeconds:e.timeoutSeconds,failureBehavior:e.failureBehavior}]:[]])}}});try{let t=await this.agentControl.createJob({agentId:u.codebase.agentId,codebaseId:u.codebaseId,worktreeId:u.id,kind:i.IOS_BUILD_JOB_KIND,payload:{...this.identity(u),buildId:S,artifactDirectory:T,source:C,scheme:m.scheme,configuration:m.buildConfiguration,action:y,destination:v,advancedSettings:k,scripts:P,worktreeCoverage:!0===e.worktreeCoverage},idempotencyKey:`ios:build:${n}:${u.id}`,timeoutSeconds:604800});await l.build.update({where:{id:S},data:{jobId:t.id}})}catch(e){throw await l.build.update({where:{id:S},data:{status:"FAILED",errorCode:"QUEUE_FAILED",error:e instanceof Error?e.message:String(e),finishedAt:new Date}}),e}return this.publish(S),l.build.findUniqueOrThrow({where:{id:S},include:w})}async rebuildBuild(e,t){let r=await (0,a.getPrismaClient)(),i=await r.build.findUnique({where:{id:e},select:{worktreeId:!0,configurationId:!0,destinationJson:!0,action:!0,snapshotJson:!0}});if(!i)throw Error("Build not found");let n=p(d(i.snapshotJson,{}),"build snapshot"),s=p(n.worktree??{},"build worktree snapshot"),o=p(n.configuration??{},"build configuration snapshot"),l=Array.isArray(n.scripts)?n.scripts:[],c=i.worktreeId??("string"==typeof s.id?s.id:null),u=i.configurationId??("string"==typeof o.id?o.id:null);if(!c||!u)throw Error("The original build settings are unavailable");return this.startBuild({worktreeId:c,configurationId:u,destination:d(i.destinationJson,{}),scriptIds:l.flatMap(e=>{if(!e||"object"!=typeof e||Array.isArray(e))return[];let t=e.id;return"string"==typeof t?[t]:[]}),action:i.action,advancedSettings:o.advancedSettings,requestId:t})}async startWorktreeCoverage(e){let t=await (0,a.getPrismaClient)(),r=await t.worktree.findUnique({where:{id:e.worktreeId},select:{baseBranchOverride:!0,codebase:{select:{defaultBranch:!0}}}});if(!r||!(r.baseBranchOverride??r.codebase.defaultBranch))throw Error("A base branch is required for worktree coverage");let i=p(e.advancedSettings??{},"coverage advanced settings");return this.startBuild({...e,action:"TEST",advancedSettings:{...i,codeCoverage:!0,parseTestResults:!0},worktreeCoverage:!0})}async generateReport(e,r,n){let s=await (0,a.getPrismaClient)(),o=await s.buildReport.findUnique({where:{buildId_kind:{buildId:e,kind:r}},include:{artifact:!0}});if(o?.status==="READY")return o;let l=await s.build.findUnique({where:{id:e},include:{agent:!0,artifacts:!0}});if(!l)throw Error("Build not found");if(u.includes(l.status))throw Error("Wait for the build to finish before generating reports");if(!l.agentId||!l.agent||!h(l.agent))throw Error("Build agent is offline");let c="TEST_RESULTS"===r?i.IOS_TEST_RESULTS_JOB_KIND:i.IOS_COVERAGE_REPORT_JOB_KIND;if(!f(l.agent).includes(c))throw Error("Build agent must be updated to generate reports");if(!l.artifacts.some(e=>"RESULT_BUNDLE"===e.kind))throw Error("The build result bundle is unavailable");if("TEST_RESULTS"===r&&!["TEST","TEST_WITHOUT_BUILDING"].includes(l.action))throw Error("This build did not run tests");let d=await s.buildReport.upsert({where:{buildId_kind:{buildId:e,kind:r}},create:{id:(0,t.randomUUID)(),buildId:e,kind:r,source:"MANUAL",status:"PENDING"},update:{source:"MANUAL",status:"PENDING",error:null,finishedAt:null}});this.publish(e);let p=v(l),m=await this.agentControl.createJob({agentId:l.agentId,codebaseId:p,worktreeId:l.worktreeId,kind:c,payload:{buildId:e,artifactDirectory:l.artifactDirectory,codebaseId:p,reportKind:r,source:"MANUAL"},idempotencyKey:`ios:report:${r}:${g(n,"Request ID",200)}:${e}`,timeoutSeconds:180,visibility:"SYSTEM"});try{return await this.waitForJob(m.id,17e4),s.buildReport.findUniqueOrThrow({where:{id:d.id},include:{artifact:!0}})}finally{await s.agentJob.deleteMany({where:{id:m.id,visibility:"SYSTEM"}})}}async coverageHistory(e){return(await (0,a.getPrismaClient)()).buildReport.findMany({where:{kind:"CODE_COVERAGE",source:"WORKTREE",build:{worktreeId:e}},orderBy:{createdAt:"desc"},take:50,select:{id:!0,buildId:!0,artifactId:!0,kind:!0,source:!0,status:!0,summaryJson:!0,error:!0,createdAt:!0,updatedAt:!0,finishedAt:!0,artifact:!0,build:{select:{id:!0,status:!0,action:!0,destinationType:!0,destinationJson:!0,snapshotJson:!0,createdAt:!0,startedAt:!0,finishedAt:!0,updatedAt:!0,worktree:{select:{headSha:!0,codeStateHash:!0,hasStagedChanges:!0,hasUnstagedChanges:!0,lastCheckedAt:!0,_count:{select:{builds:{where:{status:{in:u}}}}}}},artifacts:{orderBy:{createdAt:"asc"}}}}}})}async reportsForBuild(e){return(await (0,a.getPrismaClient)()).buildReport.findMany({where:{buildId:e},orderBy:{createdAt:"asc"},include:{artifact:!0}})}async reportData(e){let t=await (0,a.getPrismaClient)(),r=await t.buildReport.findUnique({where:{id:e},select:{dataJson:!0}});return r?.dataJson??"{}"}async builds(e={}){let t=await (0,a.getPrismaClient)(),r=Math.max(1,Math.min(e.first??50,200)),i=await t.build.findMany({where:{...e.status?{status:e.status}:{},...e.codebaseId?{codebaseId:e.codebaseId}:{},...e.worktreeId?{worktreeId:e.worktreeId}:{}},orderBy:[{createdAt:"desc"},{id:"desc"}],...e.after?{cursor:{id:e.after},skip:1}:{},take:r+1,include:w});return{items:i.slice(0,r),nextCursor:i.length>r?i[r-1].id:null}}async getBuild(e){return(await (0,a.getPrismaClient)()).build.findUnique({where:{id:e},include:w})}async deleteBuilds(e){let t=[...new Set(e)];if(!t.length)return 0;if(t.length>200)throw Error("At most 200 builds can be deleted at once");let n=await (0,a.getPrismaClient)(),s=await n.build.findMany({where:{id:{in:t}},select:{id:!0,status:!0,artifactDirectory:!0,snapshotJson:!0,agentId:!0,agent:{select:{capabilitiesJson:!0}},codebaseId:!0,worktreeId:!0,deployments:{where:{status:{in:u}},select:{id:!0}},exports:{where:{status:{in:u}},select:{id:!0}}}});if(s.some(e=>u.includes(e.status)))throw Error("Running builds cannot be deleted");if(s.some(e=>e.deployments.length>0||e.exports.length>0))throw Error("Builds with running deployments or exports cannot be deleted");for(let e of s){if(!(0,r.isAbsolute)(e.artifactDirectory)||(0,r.basename)(e.artifactDirectory)!==e.id)throw Error(`Build folder is invalid for ${e.id}`);if(e.agentId){let t=v(e);if(!e.agent||!f(e.agent).includes(i.IOS_BUILD_DELETE_JOB_KIND))throw Error("Build agent must be updated to delete builds");await this.agentControl.createJob({agentId:e.agentId,codebaseId:t,worktreeId:e.worktreeId,kind:i.IOS_BUILD_DELETE_JOB_KIND,payload:{buildId:e.id,artifactDirectory:e.artifactDirectory,codebaseId:t},idempotencyKey:`ios:build:delete:${e.id}`,timeoutSeconds:300,visibility:"SYSTEM"})}}let o=await n.build.deleteMany({where:{id:{in:s.map(e=>e.id)}}});for(let e of s)this.publish(e.id);return o.count}async prepareArtifactDownload(e,t,r){let n=await (0,a.getPrismaClient)(),s=await n.buildArtifact.findFirst({where:{id:t,buildId:e},include:{build:{include:{agent:!0}}}});if(!s)throw Error("Build artifact not found");let{build:o}=s;if(!o.agentId||!o.agent)throw Error("The build agent is no longer available");if(!h(o.agent))throw Error("Build agent is offline");if(!f(o.agent).includes(i.IOS_ARTIFACT_DOWNLOAD_JOB_KIND))throw Error("Build agent must be updated to download artifacts");let l=v(o),c=await this.agentControl.createJob({agentId:o.agentId,codebaseId:l,worktreeId:o.worktreeId,kind:i.IOS_ARTIFACT_DOWNLOAD_JOB_KIND,payload:{buildId:o.id,artifactDirectory:o.artifactDirectory,artifactRelativePath:s.relativePath,uploadId:r,codebaseId:l},idempotencyKey:`ios:artifact:download:${r}`,timeoutSeconds:180,visibility:"SYSTEM"});try{this.result(await this.waitForJob(c.id,17e4))}finally{await n.agentJob.deleteMany({where:{id:c.id,visibility:"SYSTEM"}})}}async logs(e,t=null,r=1e3){let i=await (0,a.getPrismaClient)(),n=t?await i.buildLogEvent.findFirst({where:{id:t,buildId:e},select:{id:!0,createdAt:!0}}):null;if(t&&!n)throw Error("Build log cursor not found");return i.buildLogEvent.findMany({where:{buildId:e,...n?{OR:[{createdAt:{gt:n.createdAt}},{createdAt:n.createdAt,id:{gt:n.id}}]}:{}},orderBy:[{createdAt:"asc"},{id:"asc"}],take:Math.max(1,Math.min(r,5e3))})}async cancelBuild(e){let t=await (0,a.getPrismaClient)(),r=await t.build.findUnique({where:{id:e}});if(!r)throw Error("Build not found");return u.includes(r.status)&&(r.jobId&&await this.agentControl.cancelJob(r.jobId),await t.build.update({where:{id:e},data:{status:"CANCELLED",finishedAt:new Date,errorCode:"CANCELLED"}}),this.publish(e)),this.getBuild(e)}async reportProgress(e,t){if(!["PREPARING","RUNNING"].includes(t.status))throw Error("Build progress status is invalid");let r=await (0,a.getPrismaClient)(),i=await r.build.findUnique({where:{id:t.buildId}});if(!i||i.agentId!==e)throw Error("Build not found for agent");if(!u.includes(i.status))return i;let n=await r.build.update({where:{id:t.buildId},data:{status:t.status,startedAt:i.startedAt??(t.startedAt?new Date(t.startedAt):new Date),errorCode:t.errorCode??void 0,error:t.error??void 0}});return this.publish(t.buildId),n}async appendLogs(e,r,i){let n=await (0,a.getPrismaClient)(),o=await n.build.findUnique({where:{id:r}});if(!o||o.agentId!==e)throw Error("Build not found for agent");let l=i.slice(0,200).map(e=>({id:(0,t.randomUUID)(),buildId:r,scope:g(e.scope,"Log scope",40),scopeId:g(e.scopeId,"Log scope ID",200),sequence:e.sequence,phase:g(e.phase,"Log phase",80),level:g(e.level,"Log level",20),stream:g(e.stream,"Log stream",20),message:e.message.replace(/(Bearer\s+)[A-Za-z0-9._~+\/-]+=*/gi,"$1[REDACTED]").replace(/([A-Za-z][A-Za-z0-9+.-]*:\/\/)[^\s/@]+@/g,"$1[REDACTED]@").replace(/\b([A-Z0-9_]*(?:TOKEN|SECRET|PASSWORD|PASSWD|API_KEY|PRIVATE_KEY)[A-Z0-9_]*)\s*=\s*[^\s]+/gi,"$1=[REDACTED]").replace(/-----BEGIN [^-]*PRIVATE KEY-----[\s\S]*?-----END [^-]*PRIVATE KEY-----/g,"[REDACTED PRIVATE KEY]").slice(0,64e3),createdAt:new Date(e.createdAt)}));for(let e of l){if(!Number.isInteger(e.sequence)||e.sequence<0)throw Error("Log sequence must be a non-negative integer");if(Number.isNaN(e.createdAt.valueOf()))throw Error("Log date is invalid");await n.buildLogEvent.upsert({where:{scope_scopeId_sequence:{scope:e.scope,scopeId:e.scopeId,sequence:e.sequence}},create:e,update:{}}),s.agentEventBus.publish((0,s.buildLogTopic)(r),{buildLogAdded:e})}return l}async runBuild(e){let r=await (0,a.getPrismaClient)(),n=await r.build.findUnique({where:{id:e.buildId},include:{artifacts:!0,worktree:{include:{codebase:{include:{agent:!0,repository:!0}}}}}});if(!n||"SUCCEEDED"!==n.status||!n.worktree)throw Error("A successful build is required");let s=n.artifacts.find(e=>"RUNNABLE_APP"===e.kind);if(!s)throw Error("Build does not contain a runnable app");let o=g(String(p(d(s.metadataJson,{}),"runnable metadata").bundleIdentifier??""),"Runnable bundle identifier",512),l=e.destinations.map(i.parseBuildDestination);if(!l.length)throw Error("Select at least one destination");if(new Set(l.map(e=>`${e.type}:${e.id}`)).size!==l.length)throw Error("Run destinations must be unique");if(l.some(e=>e.type!==n.destinationType))throw Error("Run destinations must match the build destination type");let c=await this.destinationsForBuild(n.id,`${g(e.requestId,"Request ID",200)}:preflight`),u=l.map(e=>c.find(t=>t.type===e.type&&t.id===e.id));if(u.some(e=>!e))throw Error("A selected run destination is no longer available");l=u;let m=await this.requireWorktree(n.worktree.id,i.IOS_DEPLOY_JOB_KIND),h=(0,t.randomUUID)(),f=[];for(let i of l){let a=await r.buildDeployment.findUnique({where:{buildId_requestId_destinationKey:{buildId:n.id,requestId:e.requestId,destinationKey:y(i)}}});f.push(a??await r.buildDeployment.create({data:{id:(0,t.randomUUID)(),buildId:n.id,batchId:h,requestId:e.requestId,destinationJson:JSON.stringify(i),destinationKey:y(i),commandSummary:"SIMULATOR"===i.type?`open -a Simulator --args -CurrentDeviceUDID ${i.id}; xcrun simctl install/launch ${i.id}`:`xcrun devicectl device install/process launch --device ${i.id}`}}))}let v=await this.agentControl.createJob({agentId:m.codebase.agentId,codebaseId:m.codebaseId,worktreeId:m.id,kind:i.IOS_DEPLOY_JOB_KIND,payload:{...this.identity(m),buildId:n.id,artifactDirectory:n.artifactDirectory,artifactRelativePath:s.relativePath,bundleIdentifier:o,deployments:f.map((e,t)=>({id:e.id,destination:l[t]}))},idempotencyKey:`ios:deploy:${n.id}:${e.requestId}`,timeoutSeconds:3600});return await r.buildDeployment.updateMany({where:{id:{in:f.map(e=>e.id)}},data:{jobId:v.id}}),this.publish(n.id),r.buildDeployment.findMany({where:{id:{in:f.map(e=>e.id)}},orderBy:{createdAt:"asc"}})}async exportArchive(e){let r=await (0,a.getPrismaClient)(),n=await r.buildExport.findUnique({where:{buildId_requestId:{buildId:e.buildId,requestId:e.requestId}}});if(n)return n;let s=await r.build.findUnique({where:{id:e.buildId},include:{artifacts:!0,worktree:!0}});if(!s||"SUCCEEDED"!==s.status||!s.worktree)throw Error("A successful archive build is required");let o=s.artifacts.find(e=>"ARCHIVE"===e.kind);if(!o)throw Error("Build does not contain an archive");let l=(0,i.parseBuildExportSettings)(e.settings),c=await this.requireWorktree(s.worktree.id,i.IOS_EXPORT_JOB_KIND),u=(0,t.randomUUID)(),d=await r.buildExport.create({data:{id:u,buildId:s.id,requestId:e.requestId,settingsSnapshotJson:JSON.stringify(l),commandSummary:`xcrun xcodebuild -exportArchive -archivePath ${JSON.stringify(o.relativePath)} -exportPath exports/${u}`}}),p=await this.agentControl.createJob({agentId:c.codebase.agentId,codebaseId:c.codebaseId,worktreeId:c.id,kind:i.IOS_EXPORT_JOB_KIND,payload:{...this.identity(c),buildId:s.id,exportId:u,artifactDirectory:s.artifactDirectory,archiveRelativePath:o.relativePath,settings:l},idempotencyKey:`ios:export:${s.id}:${e.requestId}`,timeoutSeconds:3600}),m=await r.buildExport.update({where:{id:d.id},data:{jobId:p.id}});return this.publish(s.id),m}async upsertReportProjection(e,r,i,a){let n=p(i,"build report");if("TEST_RESULTS"!==n.kind&&"CODE_COVERAGE"!==n.kind)return;let s=n.kind,o=n.artifact&&"object"==typeof n.artifact?p(n.artifact,"build report artifact"):null,l=o&&"string"==typeof o.relativePath?await e.buildArtifact.findUnique({where:{buildId_relativePath:{buildId:r,relativePath:o.relativePath}}}):null,c="READY"===n.status?"READY":"FAILED";await e.buildReport.upsert({where:{buildId_kind:{buildId:r,kind:s}},create:{id:(0,t.randomUUID)(),buildId:r,artifactId:l?.id??null,kind:s,source:a,status:c,summaryJson:JSON.stringify(n.summary&&"object"==typeof n.summary?n.summary:{}),dataJson:JSON.stringify(n.data&&"object"==typeof n.data?n.data:{}),error:"string"==typeof n.error?n.error:null,finishedAt:new Date},update:{artifactId:l?.id??null,source:a,status:c,summaryJson:JSON.stringify(n.summary&&"object"==typeof n.summary?n.summary:{}),dataJson:JSON.stringify(n.data&&"object"==typeof n.data?n.data:{}),error:"string"==typeof n.error?n.error:null,finishedAt:new Date}})}async projectBuildCompletion(e){let r=await (0,a.getPrismaClient)(),i=await r.build.findFirst({where:{jobId:e.id}});if(!i)return;let n=p(d(e.resultJson,{}),"build result"),s="CANCELLED"===i.status?"CANCELLED":b(e.status),o="string"==typeof n.sourceStateHash?n.sourceStateHash:null,l="string"==typeof n.finalStateHash?n.finalStateHash:null,c="string"==typeof n.codeStateObservedAt&&Number.isFinite(Date.parse(n.codeStateObservedAt))?new Date(n.codeStateObservedAt):new Date,u=l?c:new Date,m=i.snapshotJson;if(o){let e=p(d(i.snapshotJson,{}),"build snapshot"),t=p(e.worktree??{},"build worktree snapshot");m=JSON.stringify({...e,worktree:{...t,codeStateHash:o}})}await r.$transaction(async r=>{if(await r.build.update({where:{id:i.id},data:{status:s,errorCode:"string"==typeof n.errorCode?n.errorCode:"TIMED_OUT"===e.status?"TIMEOUT":"FAILED"===s?"XCODEBUILD_FAILED":i.errorCode,error:e.error??("string"==typeof n.error?n.error:i.error),startedAt:i.startedAt??new Date,finishedAt:u,snapshotJson:m}}),i.worktreeId&&l&&await r.worktree.updateMany({where:{id:i.worktreeId,OR:[{lastCheckedAt:null},{lastCheckedAt:{lt:c}}]},data:{codeStateHash:l,lastCheckedAt:c}}),Array.isArray(n.artifacts))for(let e of n.artifacts){let a=p(e,"build artifact");"string"==typeof a.relativePath&&"string"==typeof a.kind&&await r.buildArtifact.upsert({where:{buildId_relativePath:{buildId:i.id,relativePath:a.relativePath}},create:{id:(0,t.randomUUID)(),buildId:i.id,kind:a.kind,relativePath:a.relativePath,sizeBytes:"number"==typeof a.sizeBytes?a.sizeBytes:null,checksum:"string"==typeof a.checksum?a.checksum:null,metadataJson:JSON.stringify(a.metadata&&"object"==typeof a.metadata?a.metadata:{})},update:{}})}if(Array.isArray(n.scriptExecutions))for(let e of n.scriptExecutions){let t=p(e,"script execution");"string"==typeof t.phase&&"number"==typeof t.position&&await r.buildScriptExecution.updateMany({where:{buildId:i.id,phase:t.phase,position:t.position},data:{status:"string"==typeof t.status?t.status:"FAILED",exitCode:"number"==typeof t.exitCode?t.exitCode:null,durationMs:"number"==typeof t.durationMs?t.durationMs:null,causedBuildFailure:!0===t.causedBuildFailure,outputRelativePath:"string"==typeof t.outputRelativePath?t.outputRelativePath:null,error:"string"==typeof t.error?t.error:null}})}if(Array.isArray(n.reports))for(let e of n.reports){let t=e&&"object"==typeof e&&!Array.isArray(e)?e:{};await this.upsertReportProjection(r,i.id,e,"CODE_COVERAGE"===t.kind?"WORKTREE":"AUTOMATIC")}}),this.publish(i.id)}async projectGeneratedReportCompletion(e){let r=p(d(e.payloadJson,{}),"build report payload");if("string"!=typeof r.buildId)return;let i=r.buildId,n=p(d(e.resultJson,{}),"build report result"),s=await (0,a.getPrismaClient)();await s.$transaction(async a=>{if(Array.isArray(n.artifacts))for(let e of n.artifacts){let r=p(e,"build report artifact");"string"==typeof r.relativePath&&"string"==typeof r.kind&&await a.buildArtifact.upsert({where:{buildId_relativePath:{buildId:i,relativePath:r.relativePath}},create:{id:(0,t.randomUUID)(),buildId:i,kind:r.kind,relativePath:r.relativePath,sizeBytes:"number"==typeof r.sizeBytes?r.sizeBytes:null,checksum:"string"==typeof r.checksum?r.checksum:null,metadataJson:JSON.stringify(r.metadata&&"object"==typeof r.metadata?r.metadata:{})},update:{}})}if(n.report&&"object"==typeof n.report)await this.upsertReportProjection(a,i,n.report,"WORKTREE"===r.source?"WORKTREE":"MANUAL");else{let n="CODE_COVERAGE"===r.reportKind?"CODE_COVERAGE":"TEST_RESULTS";await a.buildReport.upsert({where:{buildId_kind:{buildId:i,kind:n}},create:{id:(0,t.randomUUID)(),buildId:i,kind:n,source:"WORKTREE"===r.source?"WORKTREE":"MANUAL",status:"FAILED",error:e.error||"Report generation failed",finishedAt:new Date},update:{status:"FAILED",error:e.error||"Report generation failed",finishedAt:new Date}})}}),this.publish(i)}async projectDeploymentCompletion(e){let t=await (0,a.getPrismaClient)(),r=await t.buildDeployment.findMany({where:{jobId:e.id}});if(!r.length)return;let i=p(d(e.resultJson,{}),"deployment result"),n=Array.isArray(i.deployments)?i.deployments:[];for(let i of r){let r=n.map(e=>p(e,"deployment outcome")).find(e=>e.id===i.id);await t.buildDeployment.update({where:{id:i.id},data:{status:"string"==typeof r?.status?r.status:b(e.status),error:"string"==typeof r?.error?r.error:e.error,outputRelativePath:"string"==typeof r?.outputRelativePath?r.outputRelativePath:null,startedAt:i.startedAt??new Date,finishedAt:new Date}})}this.publish(r[0].buildId)}async projectExportCompletion(e){let r=await (0,a.getPrismaClient)(),i=await r.buildExport.findFirst({where:{jobId:e.id}});if(!i)return;let n=p(d(e.resultJson,{}),"export result");await r.buildExport.update({where:{id:i.id},data:{status:b(e.status),error:e.error??("string"==typeof n.error?n.error:null),outputRelativePath:"string"==typeof n.outputRelativePath?n.outputRelativePath:null,startedAt:i.startedAt??new Date,finishedAt:new Date}}),"SUCCEEDED"===e.status&&"string"==typeof n.outputRelativePath&&await r.buildArtifact.upsert({where:{buildId_relativePath:{buildId:i.buildId,relativePath:n.outputRelativePath}},create:{id:(0,t.randomUUID)(),buildId:i.buildId,kind:"EXPORT",relativePath:n.outputRelativePath,sizeBytes:"number"==typeof n.sizeBytes?n.sizeBytes:null,metadataJson:JSON.stringify({exportId:i.id})},update:{}}),this.publish(i.buildId)}}],669602);var x=e.i(907855);let k=x.object({status:x.string().optional(),codebaseId:x.string().optional(),worktreeId:x.string().optional(),first:x.number().int().min(1).max(200).default(50),after:x.string().optional()}),_=x.object({builds:x.array(x.unknown()),nextCursor:x.string().nullable()}),$=x.object({buildId:x.string().min(1),afterLogId:x.string().min(1).nullable().default(null),logLimit:x.number().int().min(1).max(5e3).default(1e3)}),I=x.object({build:x.unknown(),logs:x.array(x.unknown())}),S=x.object({worktreeId:x.string().min(1)}),E=x.object({project:x.unknown().nullable()}),T=x.union([x.object({buildId:x.string().min(1),requestId:x.string().min(1)}),x.object({worktreeId:x.string().min(1),configurationId:x.string().min(1),action:x.string().optional(),requestId:x.string().min(1)})]),C=x.object({destinations:x.array(x.unknown())}),R=x.object({worktreeId:x.string().min(1),configurationId:x.string().min(1),destination:x.record(x.string(),x.unknown()),scriptIds:x.array(x.string()).default([]),action:x.string().optional(),advancedSettings:x.record(x.string(),x.unknown()).optional(),requestId:x.string().min(1)}),P=x.object({build:x.unknown()}),A=x.object({buildId:x.string().min(1),requestId:x.string().min(1)}),D=x.object({build:x.unknown()}),O=x.object({buildId:x.string().min(1),destinations:x.array(x.record(x.string(),x.unknown())).min(1),requestId:x.string().min(1)}),j=x.object({deployments:x.array(x.unknown())}),N=x.object({buildId:x.string().min(1),settings:x.record(x.string(),x.unknown()),requestId:x.string().min(1)}),q=x.object({export:x.unknown()});e.s(["CancelBuildToolInputSchema",0,A,"CancelBuildToolOutputSchema",0,D,"ExportBuildToolInputSchema",0,N,"ExportBuildToolOutputSchema",0,q,"GetBuildConfigurationsInputSchema",0,S,"GetBuildConfigurationsOutputSchema",0,E,"GetBuildDestinationsInputSchema",0,T,"GetBuildDestinationsOutputSchema",0,C,"GetBuildInputSchema",0,$,"GetBuildOutputSchema",0,I,"GetBuildsInputSchema",0,k,"GetBuildsOutputSchema",0,_,"RunBuildToolInputSchema",0,O,"RunBuildToolOutputSchema",0,j,"StartBuildToolInputSchema",0,R,"StartBuildToolOutputSchema",0,P],190714),e.s([],224174)},107058,112627,e=>{"use strict";let t;var r=e.i(666680),i=e.i(243783);function a(e,t,...r){if((r=r.filter(Boolean)).length>2){let t=r.pop();e+=`one of type ${r.join(", ")}, or ${t}.`}else 2===r.length?e+=`one of type ${r[0]} or ${r[1]}.`:e+=`of type ${r[0]}.`;return null==t?e+=` Received ${t}`:"function"==typeof t&&t.name?e+=` Received function ${t.name}`:"object"==typeof t&&null!=t&&t.constructor?.name&&(e+=` Received an instance of ${t.constructor.name}`),e}let n=(e,t,...r)=>a(`Key for the ${e} algorithm must be `,t,...r);function s(e){if(Uint8Array.fromBase64)return Uint8Array.fromBase64(e);let t=atob(e),r=new Uint8Array(t.length);for(let e=0;e<t.length;e++)r[e]=t.charCodeAt(e);return r}class o extends Error{static code="ERR_JOSE_GENERIC";code="ERR_JOSE_GENERIC";constructor(e,t){super(e,t),this.name=this.constructor.name,Error.captureStackTrace?.(this,this.constructor)}}class l extends o{static code="ERR_JOSE_NOT_SUPPORTED";code="ERR_JOSE_NOT_SUPPORTED"}class c extends o{static code="ERR_JWS_INVALID";code="ERR_JWS_INVALID"}class u extends o{static code="ERR_JWT_INVALID";code="ERR_JWT_INVALID"}class d extends o{[Symbol.asyncIterator];static code="ERR_JWKS_MULTIPLE_MATCHING_KEYS";code="ERR_JWKS_MULTIPLE_MATCHING_KEYS";constructor(e="multiple matching keys found in the JSON Web Key Set",t){super(e,t)}}let p=e=>{if(e?.[Symbol.toStringTag]==="CryptoKey")return!0;try{return e instanceof CryptoKey}catch{return!1}},m=e=>e?.[Symbol.toStringTag]==="KeyObject",h=e=>p(e)||m(e),f=(e,t)=>{if(e.byteLength!==t.length)return!1;for(let r=0;r<e.byteLength;r++)if(e[r]!==t[r])return!1;return!0},g=e=>{let t=e.data[e.pos++];if(128&t){let r=127&t,i=0;for(let t=0;t<r;t++)i=i<<8|e.data[e.pos++];return i}return t},y=(e,t,r)=>{if(e.data[e.pos++]!==t)throw Error(r)},v=(e,t)=>{let r=e.data.subarray(e.pos,e.pos+t);return e.pos+=t,r},b=async(e,t,r,i)=>{let a,n,s="spki"===e,o=()=>s?["verify"]:["sign"];switch(r){case"PS256":case"PS384":case"PS512":a={name:"RSA-PSS",hash:`SHA-${r.slice(-3)}`},n=o();break;case"RS256":case"RS384":case"RS512":a={name:"RSASSA-PKCS1-v1_5",hash:`SHA-${r.slice(-3)}`},n=o();break;case"RSA-OAEP":case"RSA-OAEP-256":case"RSA-OAEP-384":case"RSA-OAEP-512":a={name:"RSA-OAEP",hash:`SHA-${parseInt(r.slice(-3),10)||1}`},n=s?["encrypt","wrapKey"]:["decrypt","unwrapKey"];break;case"ES256":case"ES384":case"ES512":a={name:"ECDSA",namedCurve:({ES256:"P-256",ES384:"P-384",ES512:"P-521"})[r]},n=o();break;case"ECDH-ES":case"ECDH-ES+A128KW":case"ECDH-ES+A192KW":case"ECDH-ES+A256KW":try{let e=i.getNamedCurve(t);a="X25519"===e?{name:"X25519"}:{name:"ECDH",namedCurve:e}}catch(e){throw new l("Invalid or unsupported key format")}n=s?[]:["deriveBits"];break;case"Ed25519":case"EdDSA":a={name:"Ed25519"},n=o();break;case"ML-DSA-44":case"ML-DSA-65":case"ML-DSA-87":a={name:r},n=o();break;default:throw new l('Invalid or unsupported "alg" (Algorithm) value')}return crypto.subtle.importKey(e,t,a,i?.extractable??!!s,n)};async function w(e,t,r){let i,a,n;if("string"!=typeof e||0!==e.indexOf("-----BEGIN PRIVATE KEY-----"))throw TypeError('"pkcs8" must be PKCS#8 formatted string');return i=/(?:-----(?:BEGIN|END) PRIVATE KEY-----|\s)/g,a=s(e.replace(i,"")),n=r,t?.startsWith?.("ECDH-ES")&&((n||={}).getNamedCurve=e=>{let t,r={data:e,pos:0};return y(r,48,"Invalid PKCS#8 structure"),g(r),y(r,2,"Expected version field"),t=g(r),r.pos+=t,y(r,48,"Expected algorithm identifier"),g(r),r.pos,(e=>{let t,r=(y(e,6,"Expected algorithm OID"),t=g(e),v(e,t));if(f(r,[43,101,110]))return"X25519";if(!f(r,[42,134,72,206,61,2,1]))throw Error("Unsupported key algorithm");y(e,6,"Expected curve OID");let i=g(e),a=v(e,i);for(let{name:e,oid:t}of[{name:"P-256",oid:[42,134,72,206,61,3,1,7]},{name:"P-384",oid:[43,129,4,0,34]},{name:"P-521",oid:[43,129,4,0,35]}])if(f(a,t))return e;throw Error("Unsupported named curve")})(r)}),b("pkcs8",a,t,n)}let x=new TextEncoder,k=new TextDecoder;function _(e){let t=new Uint8Array(e.length);for(let r=0;r<e.length;r++){let i=e.charCodeAt(r);if(i>127)throw TypeError("non-ASCII string encountered in encode()");t[r]=i}return t}function $(e){let t=e;return("string"==typeof t&&(t=x.encode(t)),Uint8Array.prototype.toBase64)?t.toBase64({alphabet:"base64url",omitPadding:!0}):(function(e){if(Uint8Array.prototype.toBase64)return e.toBase64();let t=[];for(let r=0;r<e.length;r+=32768)t.push(String.fromCharCode.apply(null,e.subarray(r,r+32768)));return btoa(t.join(""))})(t).replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}let I=(e,t="algorithm.name")=>TypeError(`CryptoKey does not support this operation, its ${t} must be ${e}`);function S(e,t){if(parseInt(e.hash.name.slice(4),10)!==t)throw I(`SHA-${t}`,"algorithm.hash")}async function E(e,t,r){if(t instanceof Uint8Array){if(!e.startsWith("HS"))throw TypeError(((e,...t)=>a("Key must be ",e,...t))(t,"CryptoKey","KeyObject","JSON Web Key"));return crypto.subtle.importKey("raw",t,{hash:`SHA-${e.slice(-3)}`,name:"HMAC"},!1,[r])}return!function(e,t,r){switch(t){case"HS256":case"HS384":case"HS512":if("HMAC"!==e.algorithm.name)throw I("HMAC");S(e.algorithm,parseInt(t.slice(2),10));break;case"RS256":case"RS384":case"RS512":if("RSASSA-PKCS1-v1_5"!==e.algorithm.name)throw I("RSASSA-PKCS1-v1_5");S(e.algorithm,parseInt(t.slice(2),10));break;case"PS256":case"PS384":case"PS512":if("RSA-PSS"!==e.algorithm.name)throw I("RSA-PSS");S(e.algorithm,parseInt(t.slice(2),10));break;case"Ed25519":case"EdDSA":if("Ed25519"!==e.algorithm.name)throw I("Ed25519");break;case"ML-DSA-44":case"ML-DSA-65":case"ML-DSA-87":let i;if(i=e.algorithm,i.name!==t)throw I(t);break;case"ES256":case"ES384":case"ES512":{if("ECDSA"!==e.algorithm.name)throw I("ECDSA");let r=function(e){switch(e){case"ES256":return"P-256";case"ES384":return"P-384";case"ES512":return"P-521";default:throw Error("unreachable")}}(t);if(e.algorithm.namedCurve!==r)throw I(r,"algorithm.namedCurve");break}default:throw TypeError("CryptoKey does not support this operation")}if(r&&!e.usages.includes(r))throw TypeError(`CryptoKey does not support this operation, its usages must include ${r}.`)}(t,e,r),t}async function T(e,t,r){let i=await E(e,t,"sign");return!function(e,t){if(e.startsWith("RS")||e.startsWith("PS")){let{modulusLength:r}=t.algorithm;if("number"!=typeof r||r<2048)throw TypeError(`${e} requires key modulusLength to be 2048 bits or larger`)}}(e,i),new Uint8Array(await crypto.subtle.sign(function(e,t){let r=`SHA-${e.slice(-3)}`;switch(e){case"HS256":case"HS384":case"HS512":return{hash:r,name:"HMAC"};case"PS256":case"PS384":case"PS512":return{hash:r,name:"RSA-PSS",saltLength:parseInt(e.slice(-3),10)>>3};case"RS256":case"RS384":case"RS512":return{hash:r,name:"RSASSA-PKCS1-v1_5"};case"ES256":case"ES384":case"ES512":return{hash:r,name:"ECDSA",namedCurve:t.namedCurve};case"Ed25519":case"EdDSA":return{name:"Ed25519"};case"ML-DSA-44":case"ML-DSA-65":case"ML-DSA-87":return{name:e};default:throw new l(`alg ${e} is not supported either by JOSE or your javascript runtime`)}}(e,i.algorithm),i,r))}function C(e){if("object"!=typeof e||null===e||"[object Object]"!==Object.prototype.toString.call(e))return!1;if(null===Object.getPrototypeOf(e))return!0;let t=e;for(;null!==Object.getPrototypeOf(t);)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t}let R=e=>C(e)&&"string"==typeof e.kty,P=e=>e?.[Symbol.toStringTag],A=(e,t,r)=>{if(void 0!==t.use){let e;switch(r){case"sign":case"verify":e="sig";break;case"encrypt":case"decrypt":e="enc"}if(t.use!==e)throw TypeError(`Invalid key for this operation, its "use" must be "${e}" when present`)}if(void 0!==t.alg&&t.alg!==e)throw TypeError(`Invalid key for this operation, its "alg" must be "${e}" when present`);if(Array.isArray(t.key_ops)){let i;switch(!0){case"sign"===r||"verify"===r:case"dir"===e:case e.includes("CBC-HS"):i=r;break;case e.startsWith("PBES2"):i="deriveBits";break;case/^A\d{3}(?:GCM)?(?:KW)?$/.test(e):i=!e.includes("GCM")&&e.endsWith("KW")?"encrypt"===r?"wrapKey":"unwrapKey":r;break;case"encrypt"===r&&e.startsWith("RSA"):i="wrapKey";break;case"decrypt"===r:i=e.startsWith("RSA")?"unwrapKey":"deriveBits"}if(i&&t.key_ops?.includes?.(i)===!1)throw TypeError(`Invalid key for this operation, its "key_ops" must include "${i}" when present`)}return!0},D='Invalid or unsupported JWK "alg" (Algorithm) Parameter value';async function O(e){if(!e.alg)throw TypeError('"alg" argument is required when "jwk.alg" is not present');let{algorithm:t,keyUsages:r}=function(e){let t,r;switch(e.kty){case"AKP":switch(e.alg){case"ML-DSA-44":case"ML-DSA-65":case"ML-DSA-87":t={name:e.alg},r=e.priv?["sign"]:["verify"];break;default:throw new l(D)}break;case"RSA":switch(e.alg){case"PS256":case"PS384":case"PS512":t={name:"RSA-PSS",hash:`SHA-${e.alg.slice(-3)}`},r=e.d?["sign"]:["verify"];break;case"RS256":case"RS384":case"RS512":t={name:"RSASSA-PKCS1-v1_5",hash:`SHA-${e.alg.slice(-3)}`},r=e.d?["sign"]:["verify"];break;case"RSA-OAEP":case"RSA-OAEP-256":case"RSA-OAEP-384":case"RSA-OAEP-512":t={name:"RSA-OAEP",hash:`SHA-${parseInt(e.alg.slice(-3),10)||1}`},r=e.d?["decrypt","unwrapKey"]:["encrypt","wrapKey"];break;default:throw new l(D)}break;case"EC":switch(e.alg){case"ES256":case"ES384":case"ES512":t={name:"ECDSA",namedCurve:({ES256:"P-256",ES384:"P-384",ES512:"P-521"})[e.alg]},r=e.d?["sign"]:["verify"];break;case"ECDH-ES":case"ECDH-ES+A128KW":case"ECDH-ES+A192KW":case"ECDH-ES+A256KW":t={name:"ECDH",namedCurve:e.crv},r=e.d?["deriveBits"]:[];break;default:throw new l(D)}break;case"OKP":switch(e.alg){case"Ed25519":case"EdDSA":t={name:"Ed25519"},r=e.d?["sign"]:["verify"];break;case"ECDH-ES":case"ECDH-ES+A128KW":case"ECDH-ES+A192KW":case"ECDH-ES+A256KW":t={name:e.crv},r=e.d?["deriveBits"]:[];break;default:throw new l(D)}break;default:throw new l('Invalid or unsupported JWK "kty" (Key Type) Parameter value')}return{algorithm:t,keyUsages:r}}(e),i={...e};return"AKP"!==i.kty&&delete i.alg,delete i.use,crypto.subtle.importKey("jwk",i,t,e.ext??(!e.d&&!e.priv),e.key_ops??r)}let j="given KeyObject instance cannot be used for this algorithm",N=async(e,r,i,a=!1)=>{let n=(t||=new WeakMap).get(e);if(n?.[i])return n[i];let s=await O({...r,alg:i});return a&&Object.freeze(e),n?n[i]=s:t.set(e,{[i]:s}),s};async function q(e,r){if(e instanceof Uint8Array||p(e))return e;if(m(e)){if("secret"===e.type)return e.export();if("toCryptoKey"in e&&"function"==typeof e.toCryptoKey)try{return((e,r)=>{let i,a=(t||=new WeakMap).get(e);if(a?.[r])return a[r];let n="public"===e.type,s=!!n;if("x25519"===e.asymmetricKeyType){switch(r){case"ECDH-ES":case"ECDH-ES+A128KW":case"ECDH-ES+A192KW":case"ECDH-ES+A256KW":break;default:throw TypeError(j)}i=e.toCryptoKey(e.asymmetricKeyType,s,n?[]:["deriveBits"])}if("ed25519"===e.asymmetricKeyType){if("EdDSA"!==r&&"Ed25519"!==r)throw TypeError(j);i=e.toCryptoKey(e.asymmetricKeyType,s,[n?"verify":"sign"])}switch(e.asymmetricKeyType){case"ml-dsa-44":case"ml-dsa-65":case"ml-dsa-87":if(r!==e.asymmetricKeyType.toUpperCase())throw TypeError(j);i=e.toCryptoKey(e.asymmetricKeyType,s,[n?"verify":"sign"])}if("rsa"===e.asymmetricKeyType){let t;switch(r){case"RSA-OAEP":t="SHA-1";break;case"RS256":case"PS256":case"RSA-OAEP-256":t="SHA-256";break;case"RS384":case"PS384":case"RSA-OAEP-384":t="SHA-384";break;case"RS512":case"PS512":case"RSA-OAEP-512":t="SHA-512";break;default:throw TypeError(j)}if(r.startsWith("RSA-OAEP"))return e.toCryptoKey({name:"RSA-OAEP",hash:t},s,n?["encrypt"]:["decrypt"]);i=e.toCryptoKey({name:r.startsWith("PS")?"RSA-PSS":"RSASSA-PKCS1-v1_5",hash:t},s,[n?"verify":"sign"])}if("ec"===e.asymmetricKeyType){let t=new Map([["prime256v1","P-256"],["secp384r1","P-384"],["secp521r1","P-521"]]).get(e.asymmetricKeyDetails?.namedCurve);if(!t)throw TypeError(j);let a={ES256:"P-256",ES384:"P-384",ES512:"P-521"};a[r]&&t===a[r]&&(i=e.toCryptoKey({name:"ECDSA",namedCurve:t},s,[n?"verify":"sign"])),r.startsWith("ECDH-ES")&&(i=e.toCryptoKey({name:"ECDH",namedCurve:t},s,n?[]:["deriveBits"]))}if(!i)throw TypeError(j);return a?a[r]=i:t.set(e,{[r]:i}),i})(e,r)}catch(e){if(e instanceof TypeError)throw e}let i=e.export({format:"jwk"});return N(e,i,r)}if(R(e)){if(e.k){var i=e.k;if(Uint8Array.fromBase64)return Uint8Array.fromBase64("string"==typeof i?i:k.decode(i),{alphabet:"base64url"});let t=i;t instanceof Uint8Array&&(t=k.decode(t)),t=t.replace(/-/g,"+").replace(/_/g,"/");try{return s(t)}catch{throw TypeError("The input to be decoded is not correctly encoded.")}}return N(e,e,r,!0)}throw Error("unreachable")}function U(e,t){if(e)throw TypeError(`${t} can only be called once`)}Symbol();class L{#e;#t;#r;constructor(e){if(!(e instanceof Uint8Array))throw TypeError("payload must be an instance of Uint8Array");this.#e=e}setProtectedHeader(e){return U(this.#t,"setProtectedHeader"),this.#t=e,this}setUnprotectedHeader(e){return U(this.#r,"setUnprotectedHeader"),this.#r=e,this}async sign(e,t){let r,i,a,s;if(!this.#t&&!this.#r)throw new c("either setProtectedHeader or setUnprotectedHeader must be called before #sign()");if(!function(...e){let t,r=e.filter(Boolean);if(0===r.length||1===r.length)return!0;for(let e of r){let r=Object.keys(e);if(!t||0===t.size){t=new Set(r);continue}for(let e of r){if(t.has(e))return!1;t.add(e)}}return!0}(this.#t,this.#r))throw new c("JWS Protected and JWS Unprotected Header Parameter names must be disjoint");let o={...this.#t,...this.#r},u=function(e,t,r,i,a){let n;if(void 0!==a.crit&&i?.crit===void 0)throw new e('"crit" (Critical) Header Parameter MUST be integrity protected');if(!i||void 0===i.crit)return new Set;if(!Array.isArray(i.crit)||0===i.crit.length||i.crit.some(e=>"string"!=typeof e||0===e.length))throw new e('"crit" (Critical) Header Parameter MUST be an array of non-empty strings when present');for(let s of(n=void 0!==r?new Map([...Object.entries(r),...t.entries()]):t,i.crit)){if(!n.has(s))throw new l(`Extension Header Parameter "${s}" is not recognized`);if(void 0===a[s])throw new e(`Extension Header Parameter "${s}" is missing`);if(n.get(s)&&void 0===i[s])throw new e(`Extension Header Parameter "${s}" MUST be integrity protected`)}return new Set(i.crit)}(c,new Map([["b64",!0]]),t?.crit,this.#t,o),d=!0;if(u.has("b64")&&"boolean"!=typeof(d=this.#t.b64))throw new c('The "b64" (base64url-encode payload) Header Parameter must be a boolean');let{alg:p}=o;if("string"!=typeof p||!p)throw new c('JWS "alg" (Algorithm) Header Parameter missing or invalid');var m="sign";switch(p.substring(0,2)){case"A1":case"A2":case"di":case"HS":case"PB":((e,t,r)=>{if(!(t instanceof Uint8Array)){if(R(t)){if("oct"===t.kty&&"string"==typeof t.k&&A(e,t,r))return;throw TypeError('JSON Web Key for symmetric algorithms must have JWK "kty" (Key Type) equal to "oct" and the JWK "k" (Key Value) present')}if(!h(t))throw TypeError(n(e,t,"CryptoKey","KeyObject","JSON Web Key","Uint8Array"));if("secret"!==t.type)throw TypeError(`${P(t)} instances for symmetric algorithms must be of type "secret"`)}})(p,e,m);break;default:((e,t,r)=>{if(R(t))switch(r){case"decrypt":case"sign":if("oct"!==t.kty&&("AKP"===t.kty&&"string"==typeof t.priv||"string"==typeof t.d)&&A(e,t,r))return;throw TypeError("JSON Web Key for this operation must be a private JWK");case"encrypt":case"verify":if("oct"!==t.kty&&void 0===t.d&&void 0===t.priv&&A(e,t,r))return;throw TypeError("JSON Web Key for this operation must be a public JWK")}if(!h(t))throw TypeError(n(e,t,"CryptoKey","KeyObject","JSON Web Key"));if("secret"===t.type)throw TypeError(`${P(t)} instances for asymmetric algorithms must not be of type "secret"`);if("public"===t.type)switch(r){case"sign":throw TypeError(`${P(t)} instances for asymmetric algorithm signing must be of type "private"`);case"decrypt":throw TypeError(`${P(t)} instances for asymmetric algorithm decryption must be of type "private"`)}if("private"===t.type)switch(r){case"verify":throw TypeError(`${P(t)} instances for asymmetric algorithm verifying must be of type "public"`);case"encrypt":throw TypeError(`${P(t)} instances for asymmetric algorithm encryption must be of type "public"`)}})(p,e,m)}d?i=_(r=$(this.#e)):(i=this.#e,r=""),this.#t?s=_(a=$(JSON.stringify(this.#t))):(a="",s=new Uint8Array);let f=function(...e){let t=new Uint8Array(e.reduce((e,{length:t})=>e+t,0)),r=0;for(let i of e)t.set(i,r),r+=i.length;return t}(s,_("."),i),g=await q(e,p),y={signature:$(await T(p,g,f)),payload:r};return this.#r&&(y.header=this.#r),this.#t&&(y.protected=a),y}}class F{#i;constructor(e){this.#i=new L(e)}setProtectedHeader(e){return this.#i.setProtectedHeader(e),this}async sign(e,t){let r=await this.#i.sign(e,t);if(void 0===r.payload)throw TypeError("use the flattened module for creating JWS with b64: false");return`${r.protected}.${r.payload}.${r.signature}`}}let M=e=>Math.floor(e.getTime()/1e3),B=/^(\+|\-)? ?(\d+|\d+\.\d+) ?(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)(?: (ago|from now))?$/i;function z(e){let t,r=B.exec(e);if(!r||r[4]&&r[1])throw TypeError("Invalid time period format");let i=parseFloat(r[2]);switch(r[3].toLowerCase()){case"sec":case"secs":case"second":case"seconds":case"s":t=Math.round(i);break;case"minute":case"minutes":case"min":case"mins":case"m":t=Math.round(60*i);break;case"hour":case"hours":case"hr":case"hrs":case"h":t=Math.round(3600*i);break;case"day":case"days":case"d":t=Math.round(86400*i);break;case"week":case"weeks":case"w":t=Math.round(604800*i);break;default:t=Math.round(0x1e187e0*i)}return"-"===r[1]||"ago"===r[4]?-t:t}function K(e,t){if(!Number.isFinite(t))throw TypeError(`Invalid ${e} input`);return t}class G{#e;constructor(e){if(!C(e))throw TypeError("JWT Claims Set MUST be an object");this.#e=structuredClone(e)}data(){return x.encode(JSON.stringify(this.#e))}get iss(){return this.#e.iss}set iss(e){this.#e.iss=e}get sub(){return this.#e.sub}set sub(e){this.#e.sub=e}get aud(){return this.#e.aud}set aud(e){this.#e.aud=e}set jti(e){this.#e.jti=e}set nbf(e){"number"==typeof e?this.#e.nbf=K("setNotBefore",e):e instanceof Date?this.#e.nbf=K("setNotBefore",M(e)):this.#e.nbf=M(new Date)+z(e)}set exp(e){"number"==typeof e?this.#e.exp=K("setExpirationTime",e):e instanceof Date?this.#e.exp=K("setExpirationTime",M(e)):this.#e.exp=M(new Date)+z(e)}set iat(e){void 0===e?this.#e.iat=M(new Date):e instanceof Date?this.#e.iat=K("setIssuedAt",M(e)):"string"==typeof e?this.#e.iat=K("setIssuedAt",M(new Date)+z(e)):this.#e.iat=K("setIssuedAt",e)}}class H{#t;#a;constructor(e={}){this.#a=new G(e)}setIssuer(e){return this.#a.iss=e,this}setSubject(e){return this.#a.sub=e,this}setAudience(e){return this.#a.aud=e,this}setJti(e){return this.#a.jti=e,this}setNotBefore(e){return this.#a.nbf=e,this}setExpirationTime(e){return this.#a.exp=e,this}setIssuedAt(e){return this.#a.iat=e,this}setProtectedHeader(e){return this.#t=e,this}async sign(e,t){let r=new F(this.#a.data());if(r.setProtectedHeader(this.#t),Array.isArray(this.#t?.crit)&&this.#t.crit.includes("b64")&&!1===this.#t.b64)throw new u("JWTs MUST NOT use unencoded payload");return r.sign(e,t)}}class Z extends Error{code;githubRequestId;constructor(e,t,r=null){super(t),this.code=e,this.githubRequestId=r,this.name="GitHubAppError"}}let V=new Map,J=new Map;function W(e,t,r){let i=e.trim();if(!/^[1-9]\d*$/.test(i))throw new Z(r,`${t} must be a positive integer`);return i}function Q(e){let{privateKeyPkcs8:t,keyFingerprint:i}=function(e){try{let t=(0,r.createPrivateKey)({key:e.trim(),format:"pem"});if("rsa"!==t.asymmetricKeyType)throw Error("The key is not RSA");let i=t.export({format:"pem",type:"pkcs8"}).toString(),a=(0,r.createPublicKey)(t).export({format:"der",type:"spki"}),n=`SHA256:${(0,r.createHash)("sha256").update(a).digest("base64url")}`;return{key:t,privateKeyPkcs8:i,keyFingerprint:n}}catch{throw new Z("INVALID_PRIVATE_KEY","The GitHub App private key is not a valid RSA PEM")}}(e.privateKey);return{...e,appId:W(e.appId,"GitHub App ID","INVALID_APP_ID"),installationId:W(e.installationId,"GitHub installation ID","INVALID_INSTALLATION_ID"),privateKeyPkcs8:t,keyFingerprint:i}}async function Y(e){try{let t=await w(e.privateKeyPkcs8,"RS256"),r=Math.floor(Date.now()/1e3);return await new H({}).setProtectedHeader({alg:"RS256",typ:"JWT"}).setIssuer(e.appId).setIssuedAt(r-60).setExpirationTime(r+540).sign(t)}catch{throw new Z("INVALID_PRIVATE_KEY","The GitHub App private key could not sign an App JWT")}}function X(e){return`${e.appId}:${e.installationId}:${e.keyFingerprint}`}function ee(e){return{accept:"application/vnd.github+json",authorization:e,"user-agent":"ai-development-environment","x-github-api-version":"2022-11-28"}}async function et(e,t){try{return await fetch(e,{...t,cache:"no-store"})}catch{throw new Z("GITHUB_APP_REQUEST_FAILED","GitHub could not be reached")}}async function er(e){try{return await e.json()}catch{return null}}function ei(e){return e.headers.get("x-github-request-id")}function ea(e,t,r=[]){let i=`GitHub returned HTTP ${t}`;for(let t of(e&&"object"==typeof e&&"message"in e&&"string"==typeof e.message&&(i=e.message),r))t&&(i=i.split(t).join("[REDACTED]"));return i}async function en(e,t){let r=await et(`${e.apiBaseUrl}/app/installations/${e.installationId}`,{headers:ee(`Bearer ${t}`)}),i=await er(r),a=ei(r);if(401===r.status)throw new Z("GITHUB_APP_UNAUTHORIZED","GitHub rejected the App ID or private key",a);if(404===r.status)throw new Z("INSTALLATION_NOT_FOUND","The GitHub App installation was not found",a);if(!r.ok||!i||"object"!=typeof i)throw new Z("GITHUB_APP_REQUEST_FAILED",ea(i,r.status,[t,e.privateKey,e.privateKeyPkcs8]),a);if(String(i.app_id)!==e.appId)throw new Z("APP_INSTALLATION_MISMATCH","The installation does not belong to the configured GitHub App",a);return i}async function es(e,t){let r=t??await Y(e),i=await et(`${e.apiBaseUrl}/app/installations/${e.installationId}/access_tokens`,{method:"POST",headers:ee(`Bearer ${r}`)}),a=await er(i),n=ei(i);if(401===i.status)throw new Z("GITHUB_APP_UNAUTHORIZED","GitHub rejected the App ID or private key",n);if(404===i.status)throw new Z("INSTALLATION_NOT_FOUND","The GitHub App installation was not found",n);if(!i.ok||!a||"object"!=typeof a)throw new Z("GITHUB_APP_REQUEST_FAILED",ea(a,i.status,[r,e.privateKey,e.privateKeyPkcs8]),n);if("string"!=typeof a.token||!a.token||"string"!=typeof a.expires_at||Number.isNaN(Date.parse(a.expires_at)))throw new Z("GITHUB_APP_REQUEST_FAILED","GitHub returned an invalid installation token response",n);if("write"!==(a.permissions?.actions??"none"))throw new Z("ACTIONS_PERMISSION_REQUIRED","The GitHub App installation must grant Actions: read and write",n);return{token:a.token,expiresAt:new Date(a.expires_at),permissions:a.permissions??{},repositorySelection:a.repository_selection??"selected"}}async function eo(e){let t=X(e),r=V.get(t);if(r&&r.expiresAt.getTime()-3e5>Date.now())return r;let i=J.get(t);if(i)return i;let a=es(e).then(e=>(V.set(t,e),e)).finally(()=>J.delete(t));return J.set(t,a),a}function el(){V.clear(),J.clear()}async function ec(e,t){let r=Q(e),i=await eo(r),a=await t(i.token);return 401===a.status&&(V.delete(X(r)),i=await eo(r),a=await t(i.token)),{response:a,token:i.token}}async function eu(e,t,r){let{response:i,token:a}=await ec(e,i=>et(e.graphqlUrl,{method:"POST",headers:{...ee(`Bearer ${i}`),"content-type":"application/json"},body:JSON.stringify({query:t,variables:r})})),n=await er(i),s=ei(i);if(401===i.status)throw new Z("GITHUB_APP_UNAUTHORIZED","GitHub rejected the installation access token",s);if(!i.ok||n?.errors?.length||!n?.data){let t=n?.errors?.map(e=>e.message).filter(Boolean).join("; ")||ea(n,i.status,[a]);throw new Z("GITHUB_APP_REQUEST_FAILED",ea({message:t},i.status,[a,e.privateKey]),s)}return{data:n.data,githubRequestId:s}}async function ed(e){let t=Q(e),r=await Y(t),i=await en(t,r),a=await es(t,r);V.set(X(t),a);let n=await eu(t,"query VerifyGitHubApp { viewer { login } }",{});return{appId:t.appId,installationId:t.installationId,keyFingerprint:t.keyFingerprint,appSlug:i.app_slug,accountLogin:i.account.login,repositorySelection:a.repositorySelection,actionsPermission:a.permissions.actions??"none",viewerLogin:n.data.viewer.login,verifiedAt:new Date,githubRequestId:n.githubRequestId}}async function ep(e,t){let r=`${e.apiBaseUrl}/repos/${encodeURIComponent(t.owner)}/${encodeURIComponent(t.repository)}/actions/runs/${encodeURIComponent(t.workflowRunId)}/rerun`,{response:i,token:a}=await ec(e,e=>et(r,{method:"POST",headers:ee(`Bearer ${e}`)})),n=ei(i);if(401===i.status)throw new Z("GITHUB_APP_UNAUTHORIZED","GitHub rejected the installation access token",n);if(!i.ok){let t=await er(i);throw new Z(404===i.status?"REPOSITORY_NOT_INSTALLED":"GITHUB_APP_REQUEST_FAILED",404===i.status?"The repository or workflow run is not available to this installation":ea(t,i.status,[a,e.privateKey]),n)}return{githubRequestId:n}}async function em(e,t){let r=[],i=1,a=0;do{let n=`${e.apiBaseUrl}/repos/${encodeURIComponent(t.owner)}/${encodeURIComponent(t.repository)}/actions/runs/${encodeURIComponent(t.workflowRunId)}/jobs?filter=latest&per_page=100&page=${i}`,{response:s,token:o}=await ec(e,e=>et(n,{headers:ee(`Bearer ${e}`)})),l=ei(s);if(401===s.status)throw new Z("GITHUB_APP_UNAUTHORIZED","GitHub rejected the installation access token",l);let c=await er(s);if(!s.ok||!c||"object"!=typeof c)throw new Z("GITHUB_APP_REQUEST_FAILED",ea(c,s.status,[o,e.privateKey]),l);if(!Number.isInteger(c.total_count)||!Array.isArray(c.jobs))throw new Z("GITHUB_APP_REQUEST_FAILED","GitHub returned an invalid workflow jobs response",l);a=c.total_count??0,r.push(...c.jobs),i+=1}while(r.length<a)return r}async function eh(e,t){let r=`${e.apiBaseUrl}/repos/${encodeURIComponent(t.owner)}/${encodeURIComponent(t.repository)}`,i=`${r}/actions/jobs/${encodeURIComponent(t.jobId)}`,a=await ec(e,e=>et(i,{headers:ee(`Bearer ${e}`)})),n=ei(a.response);if(401===a.response.status)throw new Z("GITHUB_APP_UNAUTHORIZED","GitHub rejected the installation access token",n);let s=await er(a.response);if(!a.response.ok||!s||"object"!=typeof s)throw new Z(404===a.response.status?"ACTIONS_JOB_NOT_FOUND":"GITHUB_APP_REQUEST_FAILED",404===a.response.status?"The GitHub Actions job is not available to this installation":ea(s,a.response.status,[a.token,e.privateKey]),n);if(String(s.run_id??"")!==t.workflowRunId)throw new Z("ACTIONS_JOB_RUN_MISMATCH","The GitHub Actions job does not belong to the selected workflow run",n);if(s.status?.toLowerCase()!=="completed")throw new Z("ACTIONS_JOB_NOT_COMPLETED","The GitHub Actions job must be completed before it can be retried",n);let o=await ec(e,e=>et(`${i}/rerun`,{method:"POST",headers:ee(`Bearer ${e}`)})),l=ei(o.response);if(401===o.response.status)throw new Z("GITHUB_APP_UNAUTHORIZED","GitHub rejected the installation access token",l);if(!o.response.ok){let t=await er(o.response);throw new Z(404===o.response.status?"ACTIONS_JOB_NOT_FOUND":"GITHUB_APP_REQUEST_FAILED",404===o.response.status?"The GitHub Actions job is not available to this installation":ea(t,o.response.status,[o.token,e.privateKey]),l)}return{githubRequestId:l}}let ef="default",eg="default",ey="https://api.github.com",ev="https://api.github.com/graphql",eb=String.raw`\b([A-Z][A-Z0-9_]*-\d+)\b`,ew=`
56
+ ${t}`}splitMarkdownIntoSections(e){let t=e.split(/(?=^#{1,6}\s)|(?:\n\s*\n)/m).filter(e=>e.trim().length>0);return t.length>0?t:[e]}async parseMarkdownSection(e){try{let t=[this.createTextFallback(e)];return{success:!0,data:{version:1,type:"doc",content:t},warnings:[]}}catch(e){return{success:!1,error:e,warnings:[]}}}createTextFallback(e){return{type:"paragraph",content:[{type:"text",text:e.trim()}]}}createPlaceholder(e){return e.operation.includes("adfToMarkdown")?`[Error converting ADF to Markdown: ${e.operation}]`:e.operation.includes("markdownToAdf")?{version:1,type:"doc",content:[{type:"paragraph",content:[{type:"text",text:`[Error converting Markdown to ADF: ${e.operation}]`}]}]}:`[Error in operation: ${e.operation}]`}},uI=class{constructor(e){(0,nT.__publicField)(this,"mdToAdfEngine"),(0,nT.__publicField)(this,"adfToMdEngine"),(0,nT.__publicField)(this,"options"),(0,nT.__publicField)(this,"errorRecovery"),(0,nT.__publicField)(this,"remarkProcessor"),(0,nT.__publicField)(this,"registry");try{this.options=e||{},this.mdToAdfEngine=new cQ(this.options),this.adfToMdEngine=new u_(this.options),this.errorRecovery=new u$({maxRetries:e?.maxRetries||3,retryDelay:e?.retryDelay||100,fallbackStrategy:e?.fallbackStrategy||"best-effort",enableLogging:e?.enableLogging||!1,onError:e?.onError,onRecovery:e?.onRecovery}),this.remarkProcessor=nW().use(op).use(ll,["yaml"]).use(cg).use(cI,{strict:e?.strict||!1}).use(o6),this.registry=new cA,this.registerConverters()}catch(e){throw new cC("Failed to initialize Parser","INIT_ERROR")}}adfToMarkdown(e,t){return t&&Object.keys(t).length>0?new u_({...this.options,...t}).convert(e):this.adfToMdEngine.convert(e)}async adfToMarkdownWithRecovery(e,t){let r=await this.errorRecovery.executeWithRecovery(()=>this.adfToMarkdown(e,t),{operation:"adfToMarkdown",input:e,nodeType:e.type});if(!r.success)throw r.error||Error("ADF to Markdown conversion failed");return r.data}markdownToAdf(e,t){return t&&Object.keys(t).length>0?new cQ({...this.options,...t}).convert(e):this.mdToAdfEngine.convert(e)}async markdownToAdfWithRecovery(e,t){let r=await this.errorRecovery.executeWithRecovery(()=>this.markdownToAdf(e,t),{operation:"markdownToAdf",input:e});if(!r.success)throw r.error||Error("Markdown to ADF conversion failed");return r.data}async markdownToAdfAsync(e,t){return await this.mdToAdfEngine.convertAsync(e)}async markdownToAdfAsyncWithRecovery(e,t){let r=await this.errorRecovery.executeWithRecovery(async()=>this.markdownToAdfAsync(e,t),{operation:"markdownToAdfAsync",input:e});if(!r.success)throw r.error||Error("Async Markdown to ADF conversion failed");return r.data}async validateMarkdownAsync(e){let t=await this.mdToAdfEngine.validate(e);return{valid:t.valid,errors:t.errors.map(e=>({message:e})),warnings:t.warnings}}async getStats(e){return await this.mdToAdfEngine.getStats(e)}stringify(e,t){return this.adfToMarkdown(e,t)}async stringifyAsync(e,t){return this.adfToMarkdownWithRecovery(e,t)}validateAdf(e){return new cE().validate(e)}validateMarkdown(e){return new cT().validate(e)}getErrorRecovery(){return this.errorRecovery}registerConverters(){this.registry.registerNodes([new cY,new cX,new c0,new c1,new c4,new c3,new c2,new c6,new c9,new c8,new c5,new c7,new ue,new ut,new ur,new ui,new ua,new un,new us,new uo,new ul,new uc,new uu,new ud,new up,new um]),this.registry.registerMarks([new uh,new uf,new ug,new uy,new uv,new ub,new uw,new ux,new uk])}convertAdfToMarkdown(e){return this.adfToMdEngine.convert(e)}convertMdastToAdf(e){return this.mdToAdfEngine.convert(e)}fallbackConversion(e){return this.mdToAdfEngine.convert(e)}countNodes(e){let t=0;for(let r of e)t++,r.content&&Array.isArray(r.content)&&(t+=this.countNodes(r.content));return t}postProcessAdfFenceBlocks(e){return e}parseAdfLanguageString(e,t){return{}}},uS=e.i(378731);let uE=[/^h[1-6]\.\s/m,/^bq\.\s/m,/\{code(?::[^}]+)?\}/i,/\{noformat\}/i,/\{\{[^}\n]+\}\}/,/^\|\|.+\|\|\s*$/m,/\[[^\]\n]+\|https?:\/\//i,/\[~[^\]\n]+\]/,/\[\^[^\]\n]+\]/,/![^!\n]+!/];function uT(e){return!(!e||"object"!=typeof e||Array.isArray(e))&&"doc"===e.type&&1===e.version&&Array.isArray(e.content)}function uC(e,t){return uS.default.to_markdown(e.replace(/\[~([^\]\n]+)\]/g,"@$1").replace(/\[\^([^\]\n]+)\]/g,"[Attachment: $1]").replace(/\[([A-Z][A-Z0-9_]*-\d+)\]/g,(e,r)=>t?`[${r}](${t}/browse/${r})`:`**${r}**`))}let uR=new uI;function uP(e,t){if(null==e)return null;let r=function(e){if(uT(e))return"ADF";let t="string"==typeof e?e:"";return uE.some(e=>e.test(t))?"JIRA_WIKI":"MARKDOWN"}(e),i="string"==typeof e?e:null==e?"":JSON.stringify(e,null,2),a="ADF"===r?function(e){try{return uR.adfToMarkdown(e)}catch{return function e(t){return t&&"object"==typeof t?["string"==typeof t.text?t.text:"",...Array.isArray(t.content)?t.content.map(e).filter(Boolean):[]].filter(Boolean).join("\n"):""}(e)}}(e):"JIRA_WIKI"===r?uC(i,t):i;return{format:r,raw:e,rawText:i,markdown:a,wikiMarkup:"JIRA_WIKI"===r?i:uS.default.to_jira(a)}}function uA(e){let t=e.value.trim(),r="JIRA_WIKI"===e.format?uC(t):t,i=uR.markdownToAdf(r);if(!uT(i))throw Error("The Jira text could not be converted to valid ADF");return i}let uD="default",uO=["summary","status","issuetype","priority","assignee","project","updated"],uj=[{window:"5m",milliseconds:3e5},{window:"10m",milliseconds:6e5},{window:"1h",milliseconds:36e5},{window:"24h",milliseconds:864e5}];function uN(e){return null!==e&&"object"==typeof e&&!Array.isArray(e)}function uq(e){return uN(e)?e:{}}function uU(e){return Array.isArray(e)?e:[]}function uL(e){return"string"==typeof e&&e.length>0?e:null}function uF(e){return"number"==typeof e&&Number.isFinite(e)?e:null}function uM(e){let t=e.trim().toUpperCase();if(!/^[A-Z][A-Z0-9_]*-\d+$/.test(t))throw Error("Invalid Jira issue key");return t}function uB(e){if(null===e)return null;try{return JSON.parse(e)}catch{return null}}function uz(e){return uU(uB(e)).flatMap(e=>"string"==typeof e&&e.length>0?[e]:[])}function uK(e){return JSON.stringify(function e(t){return Array.isArray(t)?t.map(e):uN(t)?Object.fromEntries(Object.keys(t).sort().map(r=>[r,e(t[r])])):t}(e))}function uG(e){if(!uN(e))return null;let t=e.status??uq(e.response).status;return"number"==typeof t?t:null}function uH(e,t){let r=e instanceof Error?e.message:String(e);return(t?r.replaceAll(t,"[REDACTED]"):r).slice(0,1e3)}function uZ(e){return uL(uq(uq(e.fields).project).key)??(e.key?.split("-")[0]||"UNKNOWN")}function uV(e){let t=uq(e),r=uL(t.displayName);if(!r)return null;let i=uq(t.avatarUrls);return{accountId:uL(t.accountId),displayName:r,avatarUrl:uL(i["48x48"])??uL(i["32x32"])??uL(i["24x24"])}}function uJ(e){return uU(e).map(uq).map(e=>({id:uL(e.id),name:uL(e.name)??"Unknown"}))}function uW(e,t){let r=uq(e),i=uL(r.key);if(!i)return null;let a=uq(r.fields);return{relationship:t,key:i,summary:uL(a.summary)??i,status:uL(uq(a.status).name)}}function uQ(e){return{...e,kind:"BOARD"===e.kind?"BOARD":"JQL"}}function uY(e){return{source:e.source,stale:e.stale,fetchedAt:e.fetchedAt.toISOString()}}function uX(e){return 0===e.length?{source:"CACHE",stale:!1,fetchedAt:new Date(0).toISOString()}:{source:e.some(e=>"ERROR"===e.source)?"ERROR":e.some(e=>"LIVE"===e.source)?"LIVE":"CACHE",stale:e.some(e=>e.stale),fetchedAt:new Date(Math.max(...e.map(e=>e.fetchedAt.getTime()))).toISOString()}}function u0(e){let t=uq(e.fields),r=uq(t.status),i=uq(r.statusCategory),a=uq(t.assignee),n=uq(a.avatarUrls),s=uq(t.project),o=e.key??"UNKNOWN";return{id:e.id??o,key:o,summary:uL(t.summary)??o,statusId:uL(r.id)??uL(r.name)??"unknown",status:uL(r.name)??"Unknown",statusCategory:uL(i.key)??uL(i.name)??"unknown",issueType:uL(uq(t.issuetype).name),priority:uL(uq(t.priority).name),assignee:uL(a.displayName),assigneeAccountId:uL(a.accountId),assigneeAvatarUrl:uL(n["48x48"])??uL(n["32x32"]),projectKey:uL(s.key)??uZ(e),updatedAt:uL(t.updated)}}function u1(e){let t=e.toLowerCase();return"new"===t||t.includes("to do")?0:"indeterminate"===t||t.includes("progress")?1:"done"===t?2:3}let u4=new Set(["ALL","UNASSIGNED_OR_SELF","SELF_IN_PROGRESS"]);function u3(e){return u4.has(e)?e:"ALL"}class u2{inFlight=new Map;clients;lastPrunedAt=0;async getSettings(){let e=await (0,h.getPrismaClient)(),t=await e.jiraSettings.upsert({where:{id:uD},create:{id:uD,cacheTtlSeconds:300},update:{}});return{siteUrl:t.siteUrl,email:t.email,tokenConfigured:!!t.apiToken,cacheTtlSeconds:t.cacheTtlSeconds,updatedAt:t.updatedAt.toISOString()}}async saveSettings(e){let t=await (0,h.getPrismaClient)(),r=function(e){let t=new URL(e.trim());if("https:"!==t.protocol)throw Error("Jira Cloud site URL must use HTTPS");if(!t.hostname.toLowerCase().endsWith(".atlassian.net"))throw Error("Only Jira Cloud *.atlassian.net sites are supported");if(t.username||t.password||t.search||t.hash)throw Error("Jira site URL must not include credentials, query, or fragment");return t.origin}(e.siteUrl),i=e.email.trim();if(!/^\S+@\S+\.\S+$/.test(i))throw Error("A valid Jira email is required");let a=await t.jiraSettings.findUnique({where:{id:uD}}),n=e.apiToken?.trim()||a?.apiToken||null,s=!!(a?.siteUrl&&a.siteUrl!==r);if(s&&!e.resetSite)throw Error("Changing the Jira site requires resetSite=true");let o=a?.siteUrl!==r||a?.email!==i||a?.apiToken!==n;return await t.$transaction(async e=>{s&&await e.jiraProject.deleteMany(),o&&(await e.jiraCacheEntry.deleteMany(),await e.jiraCachedTicket.deleteMany()),await e.jiraSettings.upsert({where:{id:uD},create:{id:uD,siteUrl:r,email:i,apiToken:n,cacheTtlSeconds:300},update:{siteUrl:r,email:i,apiToken:n}})}),this.clients=void 0,this.getSettings()}async clearCredentials(){let e=await (0,h.getPrismaClient)();return await e.$transaction([e.jiraCacheEntry.deleteMany(),e.jiraCachedTicket.deleteMany(),e.jiraSettings.upsert({where:{id:uD},create:{id:uD,cacheTtlSeconds:300},update:{email:null,apiToken:null}})]),this.clients=void 0,this.getSettings()}async updateCacheTtl(e){if(!Number.isInteger(e)||e<1||e>1440)throw Error("Cache TTL must be an integer from 1 to 1440 minutes");let t=await (0,h.getPrismaClient)();return await t.jiraSettings.upsert({where:{id:uD},create:{id:uD,cacheTtlSeconds:60*e},update:{cacheTtlSeconds:60*e}}),this.getSettings()}async testConnection(){let e=await this.cachedCall({operation:"MYSELF",params:{},requestSummary:"Current Jira user",force:!0,allowStaleOnError:!1,fetcher:async()=>{let{version3:e}=await this.getClients();return e.myself.getCurrentUser()}});if(e.stale)throw Error("Jira connection test failed because the live request failed");let t=uq(e.value);return{accountId:uL(t.accountId),displayName:uL(t.displayName)??"Jira user",emailAddress:uL(t.emailAddress),cache:uY(e)}}async listProjects(){let e=await (0,h.getPrismaClient)();return(await e.jiraProject.findMany({include:{sources:{orderBy:[{position:"asc"},{createdAt:"asc"}]}},orderBy:[{position:"asc"},{createdAt:"asc"}]})).map(e=>({id:e.id,jiraId:e.jiraId,key:e.key,name:e.name,avatarUrl:e.avatarUrl,position:e.position,ticketAssignmentFilter:u3(e.ticketAssignmentFilter),hideCompletedTickets:e.hideCompletedTickets,completedStatusIds:uz(e.completedStatusIdsJson),branchNamingScript:e.branchNamingScript??nI,sources:e.sources.map(uQ)}))}async projectStatuses(e){let t=await (0,h.getPrismaClient)(),r=await t.jiraProject.findUnique({where:{id:e},select:{jiraId:!0,key:!0}});if(!r)throw Error("Jira project not found");let i=await this.cachedCall({operation:"PROJECT_STATUSES",params:{jiraId:r.jiraId},requestSummary:`Statuses for project ${r.key}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.projects.getAllStatuses(r.jiraId)}}),a=new Map;for(let e of uU(i.value).map(uq))for(let t of uU(e.statuses).map(uq)){let e=uL(t.id),r=uL(t.name);if(!e||!r||a.has(e))continue;let i=uq(t.statusCategory);a.set(e,{id:e,name:r,category:uL(i.key)??uL(i.name)??"unknown"})}return[...a.values()].sort((e,t)=>u1(e.category)-u1(t.category)||e.name.localeCompare(t.name))}async updateProjectDisplaySettings(e){if(!u4.has(e.ticketAssignmentFilter))throw Error("Invalid Jira ticket assignment filter");let t=[...new Set(e.completedStatusIds.map(e=>e.trim()).filter(Boolean))].slice(0,200),r=await (0,h.getPrismaClient)();return await r.jiraProject.update({where:{id:e.projectId},data:{ticketAssignmentFilter:e.ticketAssignmentFilter,hideCompletedTickets:e.hideCompletedTickets,completedStatusIdsJson:JSON.stringify(t)}}),this.listProjects()}async updateProjectBranchNaming(e,t){let r=await (0,h.getPrismaClient)(),i=await r.jiraProject.findUnique({where:{id:e},select:{key:!0}});if(!i)throw Error("Jira project not found");let a=await nE(t,i.key);return await r.jiraProject.update({where:{id:e},data:{branchNamingScript:a}}),this.listProjects()}async availableProjects(){let e=[],t=0;for(;;){let r=await this.cachedCall({operation:"PROJECTS",params:{startAt:t,maxResults:100},requestSummary:`Visible projects from ${t}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.projects.searchProjects({startAt:t,maxResults:100,orderBy:"name"})},itemCount:e=>uU(uq(e).values).length}),i=uq(r.value),a=uU(i.values).map(uq);e.push(...a.flatMap(e=>{let t=uL(e.id),r=uL(e.key),i=uL(e.name);if(!t||!r||!i)return[];let a=uq(e.avatarUrls);return[{jiraId:t,key:r,name:i,avatarUrl:uL(a["48x48"])??uL(a["32x32"])}]}));let n=uF(i.total)??e.length;if(0===a.length||e.length>=n)break;t+=a.length}return e}async addProject(e){let t=e.trim();if(!t)throw Error("Jira project ID is required");let r=uq((await this.cachedCall({operation:"PROJECT",params:{jiraId:t},requestSummary:`Project ${t}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.projects.getProject(t)}})).value),i=uL(r.key),a=uL(r.name),n=uL(r.id);if(!i||!a||!n)throw Error("Jira returned an incomplete project");let s=uq(r.avatarUrls),o=await (0,h.getPrismaClient)(),l=await o.jiraProject.aggregate({_max:{position:!0}});return await o.jiraProject.create({data:{id:(0,d.randomUUID)(),jiraId:n,key:i,name:a,avatarUrl:uL(s["48x48"])??uL(s["32x32"]),position:(l._max.position??-1)+1,branchNamingScript:nI}}),this.listProjects()}async removeProject(e){let t=await (0,h.getPrismaClient)(),r=(await t.jiraSource.findMany({where:{projectId:e},select:{id:!0}})).map(e=>e.id);return await t.$transaction(async t=>{r.length>0&&await t.jiraCacheEntry.deleteMany({where:{sourceId:{in:r}}}),await t.jiraProject.delete({where:{id:e}}),await t.jiraCachedTicket.deleteMany({where:{cacheEntries:{none:{}}}})}),this.listProjects()}async createSource(e){let t=await this.validateSource(e.kind,e.value),r=this.validateSourceName(e.name),i=await (0,h.getPrismaClient)();if(!await i.jiraProject.findUnique({where:{id:e.projectId}}))throw Error("Jira project not found");let a=await i.jiraSource.aggregate({where:{projectId:e.projectId},_max:{position:!0}});return await i.jiraSource.create({data:{id:(0,d.randomUUID)(),projectId:e.projectId,name:r,kind:e.kind,value:t.value,boardId:t.boardId,position:(a._max.position??-1)+1}}),this.listProjects()}async updateSource(e){let t=await this.validateSource(e.kind,e.value),r=this.validateSourceName(e.name),i=await (0,h.getPrismaClient)();return await i.$transaction([i.jiraCacheEntry.deleteMany({where:{sourceId:e.id}}),i.jiraSource.update({where:{id:e.id},data:{name:r,kind:e.kind,value:t.value,boardId:t.boardId}})]),this.listProjects()}async deleteSource(e){let t=await (0,h.getPrismaClient)();return await t.$transaction(async t=>{await t.jiraCacheEntry.deleteMany({where:{sourceId:e}}),await t.jiraSource.delete({where:{id:e}}),await t.jiraCachedTicket.deleteMany({where:{cacheEntries:{none:{}}}})}),this.listProjects()}async ticketBoard(e,t=!1){var r;let i,a,n,s=await (0,h.getPrismaClient)(),o=await s.jiraSource.findUnique({where:{id:e},include:{project:!0}});if(!o)throw Error("Jira source not found");let l="BOARD"===o.kind?await this.loadBoardSource(uQ(o),t):await this.loadJqlSource(uQ(o),t),c={ticketAssignmentFilter:u3(o.project.ticketAssignmentFilter),hideCompletedTickets:o.project.hideCompletedTickets,completedStatusIds:uz(o.project.completedStatusIdsJson)},u="ALL"===c.ticketAssignmentFilter?null:await this.currentAccountId();return r={source:uQ(o),...l},i=c.hideCompletedTickets?new Set(c.completedStatusIds):new Set,a=new Set(r.tickets.filter(e=>i.has(e.statusId)).map(e=>e.status)),n=r.tickets.filter(e=>{let t;return!i.has(e.statusId)&&("ALL"===c.ticketAssignmentFilter||("UNASSIGNED_OR_SELF"===c.ticketAssignmentFilter?null===e.assigneeAccountId||e.assigneeAccountId===u:null!==u&&e.assigneeAccountId===u&&("indeterminate"===(t=e.statusCategory.toLowerCase())||t.includes("progress"))))}),{...r,tickets:n,statusOrder:r.statusOrder.filter(e=>!a.has(e))}}async ticket(e,t=!1){let r=uM(e),i=await this.cachedCall({operation:"ISSUE",params:{issueKey:r,fields:"*all",expand:"names,schema"},requestSummary:`Issue ${r} with all fields`,force:t,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issues.getIssue({issueIdOrKey:r,fields:["*all"],expand:["names","schema"],updateHistory:!1})}});"LIVE"===i.source&&await this.storeDetail(i.entryId,i.value,i.fetchedAt);let a=[],n=[],s=0;for(;;){let e=await this.cachedCall({operation:"COMMENTS",params:{issueKey:r,startAt:s,maxResults:100},requestSummary:`Comments for ${r} from ${s}`,force:t,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issueComments.getComments({issueIdOrKey:r,startAt:s,maxResults:100,orderBy:"created"})},itemCount:e=>uU(uq(e).comments).length});a.push(e);let i=uq(e.value),o=uU(i.comments);n.push(...o);let l=uF(i.total)??n.length;if(0===o.length||n.length>=l)break;s+=o.length}let o=new Date(Math.min(...a.map(e=>e.fetchedAt.getTime())));await this.storeComments(r,n,o,a.map(e=>e.entryId));let l=await this.requireCredentials();return this.normalizeTicketDetail(i.value,n,l.siteUrl,uY(i),uX(a))}async assignableUsers(e,t=""){let r=uM(e),i=t.trim().slice(0,100),a=await this.cachedCall({operation:"ASSIGNABLE_USERS",params:{issueKey:r,query:i,maxResults:50},requestSummary:`Assignable users for ${r}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.userSearch.findAssignableUsers({issueKey:r,query:i,maxResults:50,recommend:!0})},itemCount:e=>uU(e).length});return await this.linkCacheEntryToIssue(r,a.entryId),uU(a.value).map(uV).filter(e=>null!==e)}async ticketTransitions(e){let t=uM(e),r=await this.cachedCall({operation:"ISSUE_TRANSITIONS",params:{issueKey:t,expand:"transitions.fields"},requestSummary:`Available transitions for ${t}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issues.getTransitions({issueIdOrKey:t,expand:"transitions.fields"})},itemCount:e=>uU(uq(e).transitions).length});return await this.linkCacheEntryToIssue(t,r.entryId),uU(uq(r.value).transitions).map(uq).filter(e=>!1!==e.isAvailable).flatMap(e=>{let t=uL(e.id),r=uL(e.name);if(!t||!r)return[];let i=uq(e.to),a=uq(i.statusCategory),n=Object.entries(uq(e.fields)).filter(([,e])=>!0===uq(e).required).map(([e,t])=>uL(uq(t).name)??e);return[{id:t,name:r,toStatusId:uL(i.id),toStatus:uL(i.name)??r,toStatusCategory:uL(a.key)??uL(a.name),hasScreen:!0===e.hasScreen,requiredFields:n}]})}async ticketEditFields(e){let t=uM(e),r=await this.cachedCall({operation:"ISSUE_EDIT_META",params:{issueKey:t},requestSummary:`Editable fields for ${t}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issues.getEditIssueMeta({issueIdOrKey:t})},itemCount:e=>Object.keys(uq(uq(e).fields)).length});return await this.linkCacheEntryToIssue(t,r.entryId),Object.entries(uq(uq(r.value).fields)).map(([e,t])=>{let r=uq(t);return{id:e,name:uL(r.name)??e,required:!0===r.required,schemaType:uL(uq(r.schema).type),allowedValues:uU(r.allowedValues).flatMap(e=>{if("string"==typeof e)return[{id:e,name:e}];let t=uq(e),r=uL(t.name)??uL(t.value)??uL(t.displayName)??uL(t.key);return r?[{id:uL(t.id)??uL(t.accountId)??uL(t.value)??r,name:r}]:[]})}}).sort((e,t)=>e.name.localeCompare(t.name))}async ticketChanges(e,t=50,r=0){let i=uM(e),a=this.validatePagination(t,r),n=await this.cachedCall({operation:"ISSUE_CHANGELOG",params:{issueKey:i,startAt:0,maxResults:1},requestSummary:`Changelog count for ${i}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issues.getChangeLogs({issueIdOrKey:i,startAt:0,maxResults:1})},itemCount:e=>uU(uq(e).values).length});await this.linkCacheEntryToIssue(i,n.entryId);let s=uF(uq(n.value).total)??0,o=Math.min(a.limit,Math.max(0,s-a.offset)),l=Math.max(0,s-a.offset-o);if(0===o)return{...a,total:s,items:[],cache:uY(n)};let c=await this.cachedCall({operation:"ISSUE_CHANGELOG",params:{issueKey:i,startAt:l,maxResults:o},requestSummary:`Changelog for ${i} from ${l}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issues.getChangeLogs({issueIdOrKey:i,startAt:l,maxResults:o})},itemCount:e=>uU(uq(e).values).length});await this.linkCacheEntryToIssue(i,c.entryId);let u=uU(uq(c.value).values).map(uq).reverse().map(e=>({id:uL(e.id)??(0,d.randomUUID)(),author:uV(e.author),createdAt:uL(e.created),items:uU(e.items).map(uq).map(e=>({field:uL(e.field)??"Field",fieldId:uL(e.fieldId),from:uL(e.fromString)??uL(e.from),to:uL(e.toString)??uL(e.to)}))}));return{...a,total:s,items:u,cache:uX([n,c])}}async ticketWorklogs(e,t=50,r=0){let i=uM(e),a=this.validatePagination(t,r),n=await this.cachedCall({operation:"ISSUE_WORKLOGS",params:{issueKey:i,startAt:0,maxResults:1},requestSummary:`Worklog count for ${i}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issueWorklogs.getIssueWorklog({issueIdOrKey:i,startAt:0,maxResults:1})},itemCount:e=>uU(uq(e).worklogs).length});await this.linkCacheEntryToIssue(i,n.entryId);let s=uF(uq(n.value).total)??0,o=Math.min(a.limit,Math.max(0,s-a.offset)),l=Math.max(0,s-a.offset-o);if(0===o)return{...a,total:s,items:[],cache:uY(n)};let c=await this.cachedCall({operation:"ISSUE_WORKLOGS",params:{issueKey:i,startAt:l,maxResults:o},requestSummary:`Worklogs for ${i} from ${l}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issueWorklogs.getIssueWorklog({issueIdOrKey:i,startAt:l,maxResults:o})},itemCount:e=>uU(uq(e).worklogs).length});await this.linkCacheEntryToIssue(i,c.entryId);let u=await this.requireCredentials(),p=uU(uq(c.value).worklogs).map(uq).reverse().map(e=>({id:uL(e.id)??(0,d.randomUUID)(),author:uV(e.author),comment:uP(e.comment??null,u.siteUrl),timeSpent:uL(e.timeSpent),timeSpentSeconds:uF(e.timeSpentSeconds),startedAt:uL(e.started),createdAt:uL(e.created),updatedAt:uL(e.updated)}));return{...a,total:s,items:p,cache:uX([n,c])}}async addComment(e,t){let r=uM(e);if(!t.value.trim())throw Error("Comment text is required");let i=uA(t);return this.mutateTicket(r,"ADD_COMMENT",async()=>{let{version3:e}=await this.getClients();await e.issueComments.addComment({issueIdOrKey:r,comment:i})})}async assignTicket(e,t){let r=uM(e),i=t?.trim()||null;return this.mutateTicket(r,"ASSIGN_ISSUE",async()=>{let{version3:e}=await this.getClients();await e.issues.assignIssue({issueIdOrKey:r,accountId:i})})}async transitionTicket(e,t){let r=uM(e),i=(await this.ticketTransitions(r)).find(e=>e.id===t);if(!i)throw Error("The Jira transition is not available");if(i.requiredFields.length>0)throw Error(`This transition requires fields that must be completed in Jira: ${i.requiredFields.join(", ")}`);return this.mutateTicket(r,"TRANSITION_ISSUE",async()=>{let{version3:e}=await this.getClients();await e.issues.doTransition({issueIdOrKey:r,transition:{id:i.id}})})}async updateTicket(e){let t=uM(e.issueKey),r=new Map((await this.ticketEditFields(t)).map(e=>[e.id,e])),i={},a=e=>{let t=r.get(e);if(!t)throw Error(`${e} is not editable on this ticket`);return t},n=t=>Object.prototype.hasOwnProperty.call(e,t);if(n("summary")){a("summary");let t=e.summary?.trim();if(!t)throw Error("Ticket summary is required");i.summary=t}if(n("description")){let t=a("description");if(null===e.description){if(t.required)throw Error("Description is required");i.description=null}else e.description&&(i.description=uA(e.description))}if(n("priorityId")){let t=a("priority"),r=e.priorityId?.trim()||null;if(!r&&t.required)throw Error("Priority is required");if(r&&t.allowedValues.length>0&&!t.allowedValues.some(e=>e.id===r))throw Error("The selected priority is not available");i.priority=r?{id:r}:null}n("labels")&&(a("labels"),i.labels=[...new Set((e.labels??[]).map(e=>e.trim()).filter(Boolean))]);let s=(t,r)=>{if(!n(t))return;let s=a(r),o=[...new Set(e[t]??[])];if(s.allowedValues.length>0&&o.some(e=>!s.allowedValues.some(t=>t.id===e)))throw Error(`A selected ${s.name} value is not available`);i[r]=o.map(e=>({id:e}))};if(s("componentIds","components"),s("fixVersionIds","fixVersions"),s("affectedVersionIds","versions"),n("dueDate")){let t=a("duedate"),r=e.dueDate?.trim()||null;if(r&&!/^\d{4}-\d{2}-\d{2}$/.test(r))throw Error("Due date must use YYYY-MM-DD");if(!r&&t.required)throw Error("Due date is required");i.duedate=r}if(0===Object.keys(i).length)throw Error("At least one editable Jira field is required");return this.mutateTicket(t,"EDIT_ISSUE",async()=>{let{version3:e}=await this.getClients();await e.issues.editIssue({issueIdOrKey:t,fields:i})})}async branchTicket(e){let t=uM(e),r=t.replace(/-\d+$/,""),i=await (0,h.getPrismaClient)(),a=await i.jiraProject.findUnique({where:{key:r},select:{key:!0,branchNamingScript:!0}});if(!a)throw Error(`Jira project ${r} is not managed; add it in Manage Jira projects and sources`);let n=await this.cachedCall({operation:"ISSUE_BRANCH",params:{issueKey:t,fields:["summary","issuetype","project"]},requestSummary:`Branch details for ${t}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issues.getIssue({issueIdOrKey:t,fields:["summary","issuetype","project"],updateHistory:!1})}});await this.linkCacheEntryToIssue(t,n.entryId);let s=uq(n.value.fields);if((uL(uq(s.project).key)??uZ(n.value))!==a.key)throw Error(`Jira ticket ${t} does not belong to project ${a.key}`);return{ticketKey:n.value.key??t,ticketTitle:uL(s.summary)??t,ticketType:uL(uq(s.issuetype).name),projectKey:a.key,branchNamingScript:a.branchNamingScript??nI}}async clearCache(){let e=await (0,h.getPrismaClient)();return await e.$transaction([e.jiraCacheEntry.deleteMany(),e.jiraCachedTicket.deleteMany()]),!0}async deleteCachedTicket(e){return await this.invalidateIssueCaches(uM(e)),!0}async invalidateIssueCaches(e){let t=await (0,h.getPrismaClient)(),r=await t.jiraCacheEntryIssue.findMany({where:{issueKey:e},select:{cacheEntryId:!0}});await t.$transaction(async t=>{r.length>0&&await t.jiraCacheEntry.deleteMany({where:{id:{in:r.map(e=>e.cacheEntryId)}}}),await t.jiraCachedTicket.deleteMany({where:{issueKey:e}})})}async refreshCachedTicket(e){let t=await (0,h.getPrismaClient)(),r=await t.jiraCacheEntryIssue.findMany({where:{issueKey:e},select:{cacheEntryId:!0}});return r.length>0&&await t.jiraCacheEntry.deleteMany({where:{id:{in:r.map(e=>e.cacheEntryId)}}}),this.ticket(e,!0)}async listCachedTickets(e=50,t=0){let r=this.validatePagination(e,t),i=await (0,h.getPrismaClient)(),[a,n,s]=await Promise.all([i.jiraCachedTicket.findMany({take:r.limit,skip:r.offset,orderBy:{updatedAt:"desc"}}),i.jiraCachedTicket.count(),this.getSettings()]);return{...r,total:n,items:a.map(e=>this.cachedTicketView(e,s.cacheTtlSeconds))}}async cachedTicket(e){let t=await (0,h.getPrismaClient)(),[r,i]=await Promise.all([t.jiraCachedTicket.findUnique({where:{issueKey:e},include:{cacheEntries:{include:{cacheEntry:!0}}}}),this.getSettings()]);return r?{...this.cachedTicketView(r,i.cacheTtlSeconds),summaryData:uB(r.summaryJson),detailData:uB(r.detailJson),commentsData:uB(r.commentsJson),cacheEntries:r.cacheEntries.map(e=>({id:e.cacheEntry.id,operation:e.cacheEntry.operation,fetchedAt:e.cacheEntry.fetchedAt.toISOString()})).sort((e,t)=>t.fetchedAt.localeCompare(e.fetchedAt))}:null}async listApiCalls(e=50,t=0){let r=this.validatePagination(e,t);await this.pruneLogs();let i=await (0,h.getPrismaClient)(),[a,n]=await Promise.all([i.jiraApiCallLog.findMany({take:r.limit,skip:r.offset,orderBy:{createdAt:"desc"}}),i.jiraApiCallLog.count()]);return{...r,total:n,items:a.map(e=>({id:e.id,operation:e.operation,requestSummary:e.requestSummary,source:e.source,durationMs:e.durationMs,statusCode:e.statusCode,error:e.error,itemCount:e.itemCount,servedStale:e.servedStale,createdAt:e.createdAt.toISOString()}))}}async cacheMetrics(){await this.pruneLogs();let e=await (0,h.getPrismaClient)(),t=Date.now(),r=await e.jiraApiCallLog.findMany({where:{createdAt:{gte:new Date(t-uj.at(-1).milliseconds)}},orderBy:{createdAt:"asc"}});return{windows:uj.map(e=>this.metricWindow(e.window,r.filter(r=>r.createdAt.getTime()>=t-e.milliseconds))),operations:[...new Set(r.map(e=>e.operation))].sort().map(e=>({operation:e,windows:uj.map(i=>this.metricWindow(i.window,r.filter(r=>r.operation===e&&r.createdAt.getTime()>=t-i.milliseconds)))}))}}async requireCredentials(){let e=await (0,h.getPrismaClient)(),t=await e.jiraSettings.findUnique({where:{id:uD}});if(!t?.siteUrl||!t.email||!t.apiToken)throw Error("Configure the Jira site, email, and API token in Settings first");return{siteUrl:t.siteUrl,email:t.email,apiToken:t.apiToken,cacheTtlSeconds:t.cacheTtlSeconds}}async getClients(){let e=await this.requireCredentials(),t=(0,d.createHash)("sha256").update(`${e.siteUrl}\0${e.email}\0${e.apiToken}`).digest("hex");if(this.clients?.key===t)return this.clients;let r={host:e.siteUrl,authentication:{basic:{email:e.email,apiToken:e.apiToken}},baseRequestConfig:{timeout:15e3}};return this.clients={key:t,version3:new nv(r),agile:new iU(r)},this.clients}async currentAccountId(){let e=uL(uq((await this.cachedCall({operation:"MYSELF",params:{},requestSummary:"Current Jira user",fetcher:async()=>{let{version3:e}=await this.getClients();return e.myself.getCurrentUser()}})).value).accountId);if(!e)throw Error("Jira did not return the current user ID");return e}async linkCacheEntryToIssue(e,t){let r=await (0,h.getPrismaClient)();await r.$transaction(async r=>{await r.jiraCachedTicket.upsert({where:{issueKey:e},create:{issueKey:e,projectKey:e.replace(/-\d+$/,"")},update:{}}),await r.jiraCacheEntryIssue.upsert({where:{cacheEntryId_issueKey:{cacheEntryId:t,issueKey:e}},create:{cacheEntryId:t,issueKey:e},update:{}})})}async mutateTicket(e,t,r){let i=await this.requireCredentials(),a=Date.now();try{await r(),await this.logCall({operation:t,requestSummary:`${t.replaceAll("_"," ")} for ${e}`,source:"LIVE",durationMs:Date.now()-a})}catch(n){let r=uH(n,i.apiToken);throw await this.logCall({operation:t,requestSummary:`${t.replaceAll("_"," ")} for ${e}`,source:"ERROR",durationMs:Date.now()-a,statusCode:uG(n),error:r}),Error(r)}await this.invalidateIssueCaches(e);try{return await this.ticket(e,!0)}catch(e){throw Error(`Jira accepted the update, but refreshed ticket details could not be loaded: ${uH(e,i.apiToken)}`)}}cacheKey(e,t,r){return(0,d.createHash)("sha256").update(uK({siteUrl:e,operation:t,params:r})).digest("hex")}async cachedCall(e){let t=await this.requireCredentials(),r=await (0,h.getPrismaClient)(),i=this.cacheKey(t.siteUrl,e.operation,e.params),a=Date.now(),n=await r.jiraCacheEntry.findUnique({where:{cacheKey:i}}),s=null!==n&&Date.now()-n.fetchedAt.getTime()<1e3*t.cacheTtlSeconds;if(!e.force&&s)return await this.logCall({operation:e.operation,requestSummary:e.requestSummary,source:"CACHE",durationMs:Date.now()-a,itemCount:e.itemCount?.(uB(n.responseJson))??null,sourceId:e.sourceId}),{value:uB(n.responseJson),source:"CACHE",stale:!1,fetchedAt:n.fetchedAt,entryId:n.id};let o=this.inFlight.get(i);if(o){let t=await o;return await this.logCall({operation:e.operation,requestSummary:`${e.requestSummary} (coalesced)`,source:"CACHE",durationMs:Date.now()-a,itemCount:e.itemCount?.(t.value)??null,sourceId:e.sourceId}),{...t,source:"CACHE"}}let l=(async()=>{try{let t=await e.fetcher(),n=new Date,s=await r.jiraCacheEntry.upsert({where:{cacheKey:i},create:{id:(0,d.randomUUID)(),cacheKey:i,operation:e.operation,paramsJson:uK(e.params),responseJson:JSON.stringify(t),fetchedAt:n,sourceId:e.sourceId??null},update:{operation:e.operation,paramsJson:uK(e.params),responseJson:JSON.stringify(t),fetchedAt:n,sourceId:e.sourceId??null}});return await this.logCall({operation:e.operation,requestSummary:e.requestSummary,source:"LIVE",durationMs:Date.now()-a,itemCount:e.itemCount?.(t)??null,sourceId:e.sourceId}),{value:t,source:"LIVE",stale:!1,fetchedAt:n,entryId:s.id}}catch(i){let r=null!==n&&!1!==e.allowStaleOnError;if(await this.logCall({operation:e.operation,requestSummary:e.requestSummary,source:"ERROR",durationMs:Date.now()-a,statusCode:uG(i),error:uH(i,t.apiToken),servedStale:r,sourceId:e.sourceId}),r)return{value:uB(n.responseJson),source:"ERROR",stale:!0,fetchedAt:n.fetchedAt,entryId:n.id};throw Error(uH(i,t.apiToken))}})();this.inFlight.set(i,l);try{return await l}finally{this.inFlight.delete(i)}}async logCall(e){let t=await (0,h.getPrismaClient)();await t.jiraApiCallLog.create({data:{id:(0,d.randomUUID)(),operation:e.operation,requestSummary:e.requestSummary.slice(0,1e3),source:e.source,durationMs:Math.max(0,Math.round(e.durationMs)),statusCode:e.statusCode??null,error:e.error??null,itemCount:e.itemCount??null,servedStale:e.servedStale??!1,sourceId:e.sourceId??null}})}validateSourceName(e){let t=e.trim();if(!t||t.length>100)throw Error("Source name must be 1 to 100 characters");return t}async validateSource(e,t){let r=t.trim();if(!r)throw Error("BOARD"===e?"Board URL is required":"JQL is required");if("JQL"===e)return await this.cachedCall({operation:"JQL_VALIDATE",params:{jql:r},requestSummary:`Validate JQL: ${r}`,fetcher:async()=>{let{version3:e}=await this.getClients();return e.issueSearch.searchForIssuesUsingJqlEnhancedSearch({jql:r,maxResults:1,fields:["key"],failFast:!0})}}),{value:r,boardId:null};let i=function(e,t){let r=new URL(e.trim());if(r.origin!==new URL(t).origin)throw Error("Board URL must belong to the configured Jira site");let i=r.pathname.match(/\/boards\/(\d+)(?:\/|$)/i),a=r.searchParams.get("rapidView"),n=Number(i?.[1]??a);if(!Number.isSafeInteger(n)||n<=0)throw Error("Board URL must contain a Jira board ID");return{boardId:n,normalizedUrl:r.toString()}}(r,(await this.requireCredentials()).siteUrl);return await this.cachedCall({operation:"BOARD",params:{boardId:i.boardId},requestSummary:`Board ${i.boardId}`,fetcher:async()=>{let{agile:e}=await this.getClients();return e.board.getBoard({boardId:i.boardId})}}),{value:i.normalizedUrl,boardId:i.boardId}}async loadJqlSource(e,t){let r,i=[],a=[],n=[],s=!1;do{let o=Math.min(100,1e3-i.length),l=await this.cachedCall({operation:"JQL_SEARCH",params:{jql:e.value,nextPageToken:r??null,maxResults:o,fields:uO},requestSummary:`JQL ${e.name}${r?" next page":""}`,sourceId:e.id,force:t,fetcher:async()=>{let{version3:t}=await this.getClients();return t.issueSearch.searchForIssuesUsingJqlEnhancedSearch({jql:e.value,nextPageToken:r,maxResults:o,fields:uO})},itemCount:e=>e.issues?.length??0});a.push(l);let c=l.value.issues??[];i.push(...c),n.push(...l.value.warningMessages??[]),"LIVE"===l.source&&await this.storeSummaries(l.entryId,c,l.fetchedAt),r=l.value.nextPageToken,i.length>=1e3&&r&&(s=!0)}while(r&&i.length<1e3)return this.buildBoardResult(i,a,n,s)}async loadBoardSource(e,t){if(!e.boardId)throw Error("Saved board source has no board ID");let r=await this.cachedCall({operation:"BOARD",params:{boardId:e.boardId},requestSummary:`Board ${e.boardId}`,sourceId:e.id,force:t,fetcher:async()=>{let{agile:t}=await this.getClients();return t.board.getBoard({boardId:e.boardId})}}),i=await this.cachedCall({operation:"BOARD_CONFIGURATION",params:{boardId:e.boardId},requestSummary:`Board ${e.boardId} configuration`,sourceId:e.id,force:t,fetcher:async()=>{let{agile:t}=await this.getClients();return t.board.getConfiguration({boardId:e.boardId})}}),a=[r,i],n=[],s=[],o=!1;if("scrum"===(uL(r.value.type)??"").toLowerCase()){let r=await this.cachedCall({operation:"SPRINTS",params:{boardId:e.boardId,state:"active"},requestSummary:`Active sprints for board ${e.boardId}`,sourceId:e.id,force:t,fetcher:async()=>{let{agile:t}=await this.getClients();return t.board.getAllSprints({boardId:e.boardId,state:"active",startAt:0,maxResults:100})},itemCount:e=>uU(e.values).length});a.push(r);let i=uU(r.value.values).map(uq);for(let r of(0===i.length&&s.push("This Scrum board has no active sprint."),i)){let i=uF(r.id);if(!i||n.length>=1e3)continue;let l=await this.loadAgileIssues("SPRINT_ISSUES",e,t,(e,t)=>({sprintId:i,startAt:e,maxResults:t,fields:uO}),async e=>{let{agile:t}=await this.getClients();return t.sprint.getIssuesForSprint(e)},n.length);n.push(...l.issues),a.push(...l.results),s.push(...l.warnings),o||=l.truncated}}else{let r=await this.loadAgileIssues("BOARD_ISSUES",e,t,(t,r)=>({boardId:e.boardId,startAt:t,maxResults:r,fields:uO}),async e=>{let{agile:t}=await this.getClients();return t.board.getIssuesForBoard(e)},0);n.push(...r.issues),a.push(...r.results),s.push(...r.warnings),o=r.truncated}let l=[...new Map(n.map(e=>[e.key??e.id,e])).values()],c=new Map;return uU(uq(i.value.columnConfig).columns).map(uq).forEach((e,t)=>{uU(e.statuses).map(uq).forEach(e=>{let r=uL(e.id);r&&c.set(r,t)})}),this.buildBoardResult(l,a,s,o,c)}async loadAgileIssues(e,t,r,i,a,n){let s=[],o=[],l=[],c=0,u=1/0,d=!1;for(;c<u&&s.length+n<1e3;){let d=i(c,Math.min(100,1e3-n-s.length)),p=await this.cachedCall({operation:e,params:d,requestSummary:`${e.replaceAll("_"," ")} from ${c}`,sourceId:t.id,force:r,fetcher:()=>a(d),itemCount:e=>e.issues?.length??0});o.push(p);let m=p.value.issues??[];if(s.push(...m),l.push(...p.value.warningMessages??[]),"LIVE"===p.source&&await this.storeSummaries(p.entryId,m,p.fetchedAt),u=p.value.total??s.length,0===m.length)break;c+=m.length}return s.length+n>=1e3&&c<u&&(d=!0),{issues:s,results:o,warnings:l,truncated:d}}buildBoardResult(e,t,r,i,a){let n=e.slice(0,1e3).map(u0),s=[...new Map(n.map(e=>[e.status,e])).values()];return s.sort((e,t)=>{let r=a?.get(e.statusId),i=a?.get(t.statusId);return void 0!==r||void 0!==i?(r??Number.MAX_SAFE_INTEGER)-(i??Number.MAX_SAFE_INTEGER):u1(e.statusCategory)-u1(t.statusCategory)||e.status.localeCompare(t.status)}),{tickets:n,statusOrder:s.map(e=>e.status),cache:uX(t),truncated:i,warnings:[...new Set(r)]}}async storeSummaries(e,t,r){let i=await (0,h.getPrismaClient)();await i.$transaction(async i=>{for(let e of t)e.key&&await i.jiraCachedTicket.upsert({where:{issueKey:e.key},create:{issueKey:e.key,projectKey:uZ(e),summaryJson:JSON.stringify(e),summaryFetchedAt:r},update:{projectKey:uZ(e),summaryJson:JSON.stringify(e),summaryFetchedAt:r}});await i.jiraCacheEntryIssue.deleteMany({where:{cacheEntryId:e}});let a=[...new Set(t.map(e=>e.key).filter(Boolean))];a.length>0&&await i.jiraCacheEntryIssue.createMany({data:a.map(t=>({cacheEntryId:e,issueKey:t}))})})}async storeDetail(e,t,r){if(!t.key)throw Error("Jira detail response did not include an issue key");let i=await (0,h.getPrismaClient)();await i.$transaction(async i=>{await i.jiraCachedTicket.upsert({where:{issueKey:t.key},create:{issueKey:t.key,projectKey:uZ(t),detailJson:JSON.stringify(t),detailFetchedAt:r},update:{projectKey:uZ(t),detailJson:JSON.stringify(t),detailFetchedAt:r}}),await i.jiraCacheEntryIssue.upsert({where:{cacheEntryId_issueKey:{cacheEntryId:e,issueKey:t.key}},create:{cacheEntryId:e,issueKey:t.key},update:{}})})}async storeComments(e,t,r,i){let a=await (0,h.getPrismaClient)();await a.$transaction(async a=>{for(let n of(await a.jiraCachedTicket.upsert({where:{issueKey:e},create:{issueKey:e,projectKey:e.split("-")[0]??"UNKNOWN",commentsJson:JSON.stringify(t),commentsFetchedAt:r},update:{commentsJson:JSON.stringify(t),commentsFetchedAt:r}}),i))await a.jiraCacheEntryIssue.upsert({where:{cacheEntryId_issueKey:{cacheEntryId:n,issueKey:e}},create:{cacheEntryId:n,issueKey:e},update:{}})})}normalizeTicketDetail(e,t,r,i,a){let n=u0(e),s=uq(e.fields),o=uq(e.names),l=uq(e.schema),c=[];for(let e of uU(s.issuelinks).map(uq)){let t=uq(e.type),r=uW(e.outwardIssue,uL(t.outward)??"relates to"),i=uW(e.inwardIssue,uL(t.inward)??"relates to");r&&c.push(r),i&&c.push(i)}let u=uW(s.parent,"parent"),p=uU(s.subtasks).map(e=>uW(e,"subtask")).filter(e=>null!==e),m=uU(s.sprint).concat(uU(s.closedSprints)).map(uq).map(e=>uL(e.name)).filter(e=>!!e),h=t.map(uq).map(e=>({id:uL(e.id)??(0,d.randomUUID)(),author:uV(e.author),body:e.body??null,content:uP(e.body??null,r),createdAt:uL(e.created),updatedAt:uL(e.updated)}));return{...n,jiraUrl:`${r}/browse/${n.key}`,description:s.description??null,descriptionContent:uP(s.description??null,r),reporter:uV(s.reporter),creator:uV(s.creator),labels:uU(s.labels).filter(e=>"string"==typeof e),components:uJ(s.components),fixVersions:uJ(s.fixVersions),affectedVersions:uJ(s.versions),sprintNames:[...new Set(m)],parent:u,subtasks:p,issueLinks:c,attachments:uU(s.attachment).map(uq).map(e=>({id:uL(e.id)??(0,d.randomUUID)(),filename:uL(e.filename)??"Attachment",contentUrl:uL(e.content),mimeType:uL(e.mimeType),size:uF(e.size),author:uV(e.author),createdAt:uL(e.created)})),comments:h,createdAt:uL(s.created),dueAt:uL(s.duedate),resolvedAt:uL(s.resolutiondate),timeTracking:s.timetracking??null,allFields:Object.entries(s).map(([e,t])=>{let i=uq(l[e]),a="string"==typeof t||uN(t)&&"doc"===t.type?uP(t,r):null;return{id:e,name:uL(o[e])??e,schemaType:uL(i.type),custom:!0===i.custom||e.startsWith("customfield_"),value:t??null,content:a}}).sort((e,t)=>e.name.localeCompare(t.name)),cache:i,commentsCache:a}}cachedTicketView(e,t){let r=u0(uq(uB(e.detailJson)??uB(e.summaryJson))),i=e.detailJson&&e.commentsJson?"FULL":e.detailJson?"DETAIL":"SUMMARY",a=[e.summaryFetchedAt,e.detailFetchedAt,e.commentsFetchedAt].filter(e=>null!==e).some(e=>Date.now()-e.getTime()>=1e3*t);return{issueKey:e.issueKey,projectKey:e.projectKey,summary:r.summary,status:"Unknown"===r.status?null:r.status,coverage:i,stale:a,summaryFetchedAt:e.summaryFetchedAt?.toISOString()??null,detailFetchedAt:e.detailFetchedAt?.toISOString()??null,commentsFetchedAt:e.commentsFetchedAt?.toISOString()??null,updatedAt:e.updatedAt.toISOString()}}validatePagination(e,t){if(!Number.isInteger(e)||e<1||e>100)throw Error("Pagination limit must be from 1 to 100");if(!Number.isInteger(t)||t<0)throw Error("Pagination offset must be non-negative");return{limit:e,offset:t}}metricWindow(e,t){return{window:e,total:t.length,live:t.filter(e=>"LIVE"===e.source).length,cache:t.filter(e=>"CACHE"===e.source).length,errors:t.filter(e=>"ERROR"===e.source).length,averageMs:0===t.length?0:Math.round(t.reduce((e,t)=>e+t.durationMs,0)/t.length)}}async pruneLogs(){let e=Date.now();if(e-this.lastPrunedAt<36e5)return;this.lastPrunedAt=e;let t=await (0,h.getPrismaClient)();await t.jiraApiCallLog.deleteMany({where:{createdAt:{lt:new Date(e-2592e6)}}})}}e.s(["JiraService",0,u2],126223),e.s([],151666)},984179,e=>{"use strict";let t=new Set(["QUEUED","PREPARING","RUNNING"]);e.s(["buildOutOfDate",0,function(e){let r;if(t.has(e.status)||!e.worktree||(e.worktree._count?.builds??0)>0||e.finishedAt&&(!e.worktree.lastCheckedAt||e.worktree.lastCheckedAt<e.finishedAt))return!1;try{r=JSON.parse(e.snapshotJson)}catch{return!1}if(!r||"object"!=typeof r||Array.isArray(r))return!1;let i=r.worktree;if(!i||"object"!=typeof i||Array.isArray(i))return!1;if("string"==typeof i.codeStateHash&&e.worktree.codeStateHash)return i.codeStateHash!==e.worktree.codeStateHash;if("string"==typeof i.headSha&&e.worktree.headSha!==i.headSha)return!0;if("boolean"==typeof i.hasStagedChanges){if(i.hasStagedChanges!==e.worktree.hasStagedChanges)return!0}else if(e.worktree.hasStagedChanges)return!0;return"boolean"==typeof i.hasUnstagedChanges?i.hasUnstagedChanges!==e.worktree.hasUnstagedChanges:e.worktree.hasUnstagedChanges}])},396763,504173,925991,e=>{"use strict";var t=e.i(666680),r=e.i(885418),i=e.i(243783);e.i(805422);var a=e.i(694355),n=e.i(661983),s=e.i(750227),o=e.i(119909);e.i(151666);var l=e.i(468399),c=e.i(984179);let u="default",d=["QUEUED","RUNNING"],p=["PUSHING","CHECKING_OUT","AWAITING_STASH","CLEANING_UP"],m=new Set([o.WORKTREE_DIFF_JOB_KIND,o.WORKTREE_DIFF_ASSET_JOB_KIND]),h=["gray","stone","red","rose","orange","amber","yellow","lime","green","emerald","teal","cyan","sky","blue","indigo","violet","purple","fuchsia","pink"],f={codebase:{include:{agent:!0,repository:{include:{projects:{where:{type:"IOS_APP"},include:{configurations:{select:{id:!0}}}}}},jobs:{where:{status:{in:d}},orderBy:{createdAt:"desc"},take:1}}},tags:{include:{tag:!0}},builds:{orderBy:{createdAt:"desc"},take:1,select:{id:!0,status:!0,action:!0,destinationType:!0,destinationJson:!0,snapshotJson:!0,createdAt:!0,finishedAt:!0,artifacts:{select:{id:!0,kind:!0}}}},_count:{select:{builds:{where:{status:{in:["QUEUED","PREPARING","RUNNING"]}}}}}};function g(e){return null!==e.lastSeenAt&&Date.now()-e.lastSeenAt.getTime()<=a.AGENT_ONLINE_WINDOW_MS&&null===e.disconnectedAt}function y(e){try{let t=JSON.parse(e.capabilitiesJson);return Array.isArray(t)?t.filter(e=>"string"==typeof e):[]}catch{return[]}}function v(e){try{let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>"string"==typeof e):[]}catch{return[]}}function b(e){return/^[A-Za-z]:[\\/]/.test(e)||e.startsWith("\\\\")}function w(e,t){if(!t)return e;let r=b(t);if(r!==b(e))return e;let i=r?s.win32:s.posix,a=i.relative(t,e);return i.isAbsolute(a)||".."===a||a.startsWith(`..${i.sep}`)?e:a||"."}function x(e){if("SUCCEEDED"!==e.status||!e.resultJson)throw Error(e.error||"Worktree job failed");let t=JSON.parse(e.resultJson);if(!t||"object"!=typeof t||Array.isArray(t))throw Error("Worktree job returned an invalid result");return t}e.s(["WorktreesService",0,class{agentControl;jiraService;gitHubService;skillsService;pullRequestCache;watchDemand;constructor(e,t,r,i){this.agentControl=e,this.jiraService=t,this.gitHubService=r,this.skillsService=i,this.pullRequestCache=new Map,this.watchDemand=new Map,this.agentControl.registerCompletionHandler(o.WORKTREE_OPERATION_JOB_KIND,e=>this.projectOperation(e)),this.agentControl.registerCompletionHandler(o.WORKTREE_BRANCH_JOB_KIND,e=>this.projectBranchOperation(e)),this.agentControl.registerCompletionHandler(o.WORKTREE_MOVE_PUSH_JOB_KIND,e=>this.advanceMoveAfterPush(e)),this.agentControl.registerCompletionHandler(o.WORKTREE_MOVE_CHECKOUT_JOB_KIND,e=>this.advanceMoveAfterCheckout(e)),this.agentControl.registerCompletionHandler(o.WORKTREE_DELETE_JOB_KIND,e=>this.projectDeleteOperation(e))}async settings(){return(await (0,i.getPrismaClient)()).worktreeSettings.upsert({where:{id:u},create:{id:u,editorVariant:"CODE"},update:{}})}async saveSettings(e){if(!["CODE","CODE_INSIDERS","NONE"].includes(e))throw Error("Unknown editor setting");let t=await (0,i.getPrismaClient)(),r=await t.worktreeSettings.upsert({where:{id:u},create:{id:u,editorVariant:e},update:{editorVariant:e}});return this.publish(null,null),r}async requestRefresh(){let e=await (0,i.getPrismaClient)(),t=await e.codebase.findMany({select:{agentId:!0}});return this.agentControl.requestCodebaseReconcile(t.map(e=>e.agentId))}invalidatePullRequestsForOrigin(e){let t=e.toLowerCase();for(let e of this.pullRequestCache.keys())e.toLowerCase()===t&&this.pullRequestCache.delete(e)}async cleanupExpired(){let e=await (0,i.getPrismaClient)();await e.worktree.deleteMany({where:{missingAt:{lt:new Date(Date.now()-6048e5)}}})}view(e,t=""){let r=e.codebase.repository.jiraBranchRegex??t;return{...e,relativePath:w(e.folder,e.codebase.agent.baseRepoDirectory),tags:e.tags.map(e=>e.tag),activeJob:e.codebase.jobs.find(t=>t.worktreeId===e.id)??e.codebase.jobs[0]??null,baseBranch:e.baseBranchOverride??e.codebase.defaultBranch??null,ticketKey:function(e,t){if(!e||!t)return null;try{let r=RegExp(t,"i").exec(e),i=(r?.[1]??r?.[0])?.trim();return i?i.toUpperCase():null}catch{return null}}(e.branch,String(r)),ticketTitle:null,ticketStatus:null,pullRequest:null,latestBuild:e.builds?.[0]?{...e.builds[0],outOfDate:(0,c.buildOutOfDate)({...e.builds[0],worktree:e})}:null}}async overview(){await this.cleanupExpired();let e=await (0,i.getPrismaClient)(),[t,r,a,n,s,o]=await Promise.all([e.worktree.findMany({where:{missingAt:null},include:f,orderBy:[{codebase:{agent:{name:"asc"}}},{codebase:{repository:{name:"asc"}}},{primary:"desc"},{branch:"asc"},{folder:"asc"}]}),e.worktreeTag.findMany({orderBy:{name:"asc"}}),this.settings(),e.codebaseSettings.findUnique({where:{id:"default"}}),e.worktree.count({where:{missingAt:{not:null}}}),e.worktreeMove.findMany({where:{status:{in:p}},orderBy:{createdAt:"asc"}})]),l=n?.defaultJiraBranchRegex??"",c=t.map(e=>this.view(e,l)),u=[...new Set(c.map(e=>e.codebase.repository.canonicalOrigin))],d=new Map;await Promise.all(u.map(async e=>{let t=this.pullRequestCache.get(e);if(t&&t.expiresAt>Date.now())return void d.set(e,t.items);try{let t=await this.gitHubService.pullRequestsForOrigin(e);this.pullRequestCache.set(e,{items:t,expiresAt:Date.now()+6e4}),d.set(e,t)}catch{d.set(e,[])}}));let m=[...new Set(c.map(e=>e.ticketKey).filter(Boolean))],h=new Map;for(let e of(await Promise.all(m.map(async e=>{try{let t=await this.jiraService.cachedTicket(e)??await this.jiraService.ticket(e);h.set(e,{title:t.summary,status:t.status})}catch{}})),c))e.ticketTitle=e.ticketKey?h.get(e.ticketKey)?.title??null:null,e.ticketStatus=e.ticketKey?h.get(e.ticketKey)?.status??null:null,e.pullRequest=d.get(e.codebase.repository.canonicalOrigin)?.find(t=>t.headRefName===e.branch)??null;let g=new Map;for(let e of c){let t=e.codebase.agent,r=g.get(t.id);r||(r={agent:t,codebases:[],codebaseMap:new Map},g.set(t.id,r));let i=r.codebaseMap.get(e.codebase.id);i||(i={codebase:e.codebase,repository:e.codebase.repository,worktrees:[],iosBuildConfigured:e.codebase.repository.projects?.some(e=>e.configurations.length>0)??!1},r.codebaseMap.set(e.codebase.id,i),r.codebases.push(i)),i.worktrees.push(e)}return{agents:[...g.values()].map(e=>({agent:e.agent,codebases:e.codebases})),tags:r,settings:a,hiddenCount:s,activeMoves:o}}async hidden(){await this.cleanupExpired();let e=await (0,i.getPrismaClient)(),t=await e.codebaseSettings.findUnique({where:{id:"default"}});return(await e.worktree.findMany({where:{missingAt:{not:null}},include:f,orderBy:{missingAt:"desc"}})).map(e=>this.view(e,t?.defaultJiraBranchRegex??""))}async report(e,r){let a=await (0,i.getPrismaClient)(),n=[],s=!1;for(let i of r.slice(0,100)){let r=(0,o.parseCodebaseWorktreeReport)(i),l=await a.codebase.findUnique({where:{id:r.codebaseId}});if(!l||l.agentId!==e)throw Error("Codebase not found for this agent");let c=r.worktrees.slice(0,1e3).map(e=>(0,o.parseWorktreeInventoryItem)(e)),u=await a.worktree.findMany({where:{codebaseId:l.id},select:{gitDirectory:!0,folder:!0,missingAt:!0}}),d=new Map(u.map(e=>[e.gitDirectory,e])),p=new Set(c.map(e=>e.gitDirectory));s||=c.some(e=>{let t=d.get(e.gitDirectory);return!t||t.folder!==e.folder||null!==t.missingAt})||r.complete&&u.some(e=>null===e.missingAt&&!p.has(e.gitDirectory)),await a.$transaction(async e=>{await e.codebase.update({where:{id:l.id},data:{defaultBranch:r.defaultBranch,localBranchesJson:JSON.stringify(r.localBranches),remoteBranchesJson:JSON.stringify(r.remoteBranches),...r.fetchedAt?{lastFetchedAt:new Date(r.fetchedAt)}:{},...r.fetchAttemptedAt?{lastFetchAttemptAt:new Date(r.fetchAttemptedAt),lastFetchError:r.fetchError}:r.fetchError?{lastFetchError:r.fetchError}:{}}});let i=[];for(let r of c){i.push(r.gitDirectory);let a=await e.worktree.upsert({where:{codebaseId_gitDirectory:{codebaseId:l.id,gitDirectory:r.gitDirectory}},create:{id:(0,t.randomUUID)(),codebaseId:l.id,gitDirectory:r.gitDirectory,...this.inventoryData(r)},update:{}});await e.worktree.updateMany({where:{id:a.id,OR:[{lastCheckedAt:null},{lastCheckedAt:{lt:new Date(r.checkedAt)}}]},data:{...this.inventoryData(r),missingAt:null}}),n.push(a.id)}r.complete&&await e.worktree.updateMany({where:{codebaseId:l.id,missingAt:null,...i.length?{gitDirectory:{notIn:i}}:{}},data:{missingAt:new Date}})}),this.publish(null,l.id)}return await this.cleanupExpired(),s&&await this.skillsService?.requestAutoReconcile(),a.worktree.findMany({where:{id:{in:n}},include:f})}async reportActivity(e,t){let r=(0,o.parseWorktreeActivityReport)(t),a=await (0,i.getPrismaClient)(),s=await a.worktree.findFirst({where:{codebaseId:r.codebaseId,gitDirectory:r.gitDirectory,missingAt:null,codebase:{agentId:e}},select:{id:!0,codebaseId:!0}});if(!s)throw Error("Worktree activity source was not found");let l=void 0!==r.branch||void 0!==r.headSha||void 0!==r.upstream||void 0!==r.ahead||void 0!==r.behind||void 0!==r.syncState||void 0!==r.baseAhead||void 0!==r.baseBehind,c=!0;(l||void 0!==r.hasStagedChanges||void 0!==r.hasUnstagedChanges||void 0!==r.codeStateHash||void 0!==r.pushStatus)&&(c=(await a.worktree.updateMany({where:{id:s.id,OR:[{lastCheckedAt:null},{lastCheckedAt:{lt:new Date(r.observedAt)}}]},data:{...void 0===r.branch?{}:{branch:r.branch},...void 0===r.headSha?{}:{headSha:r.headSha},...void 0===r.upstream?{}:{upstream:r.upstream},...void 0===r.ahead?{}:{ahead:r.ahead},...void 0===r.behind?{}:{behind:r.behind},...void 0===r.syncState?{}:{syncState:r.syncState},...void 0===r.baseAhead?{}:{baseAhead:r.baseAhead},...void 0===r.baseBehind?{}:{baseBehind:r.baseBehind},lastCheckedAt:new Date(r.observedAt),...void 0===r.hasStagedChanges?{}:{hasStagedChanges:r.hasStagedChanges},...void 0===r.hasUnstagedChanges?{}:{hasUnstagedChanges:r.hasUnstagedChanges},...void 0===r.codeStateHash?{}:{codeStateHash:r.codeStateHash},...void 0===r.pushStatus?{}:{pushStatus:r.pushStatus}}})).count>0)&&this.publish(s.id,s.codebaseId);let u={worktreeId:s.id,...void 0===r.branch?{}:{branch:r.branch},...void 0===r.headSha?{}:{headSha:r.headSha},...void 0===r.upstream?{}:{upstream:r.upstream},...void 0===r.ahead?{}:{ahead:r.ahead},...void 0===r.behind?{}:{behind:r.behind},...void 0===r.syncState?{}:{syncState:r.syncState},...void 0===r.baseAhead?{}:{baseAhead:r.baseAhead},...void 0===r.baseBehind?{}:{baseBehind:r.baseBehind},...void 0===r.hasStagedChanges?{}:{hasStagedChanges:r.hasStagedChanges},...void 0===r.hasUnstagedChanges?{}:{hasUnstagedChanges:r.hasUnstagedChanges},...void 0===r.pushStatus?{}:{pushStatus:r.pushStatus},observedAt:r.observedAt};return this.watchDemand.has(s.id)&&c&&n.agentEventBus.publish((0,n.worktreeInspectionTopic)(s.id),{worktreeInspectionChanged:u}),u}inventoryData(e){return{folder:e.folder,relativePath:e.relativePath,primary:e.primary,branch:e.branch,headSha:e.headSha,codeStateHash:e.codeStateHash??null,upstream:e.upstream,ahead:e.ahead,behind:e.behind,syncState:e.syncState,baseAhead:e.baseAhead,baseBehind:e.baseBehind,hasStagedChanges:e.hasStagedChanges??!1,hasUnstagedChanges:e.hasUnstagedChanges??!1,pushStatus:e.pushStatus??"UNKNOWN",availability:e.availability,statusError:e.error,lastCheckedAt:new Date(e.checkedAt)}}async updateBaseBranch(e,t){let r=await (0,i.getPrismaClient)(),a=await r.worktree.findUnique({where:{id:e},include:{codebase:!0}});if(!a||a.missingAt)throw Error("Worktree not found");let n=t?.trim()||null;if(n&&!v(a.codebase.remoteBranchesJson).includes(n))throw Error("The selected origin branch is unavailable; fetch and try again");let s=await r.worktree.update({where:{id:e},data:{baseBranchOverride:n},include:f});return this.publish(e,a.codebaseId),await this.restartWatch(e),this.view(s)}requireColor(e){if(null===e||""===e)return null;if(!h.includes(e))throw Error("Unknown worktree color");return e}async updateHighlight(e,t){let r=await (0,i.getPrismaClient)(),a=await r.worktree.update({where:{id:e},data:{highlightColor:this.requireColor(t)},include:f});return this.publish(e,a.codebaseId),this.view(a)}async setTags(e,t){let r=await (0,i.getPrismaClient)(),a=[...new Set(t)].slice(0,100);if(await r.worktreeTag.count({where:{id:{in:a}}})!==a.length)throw Error("One or more tags were not found");await r.$transaction([r.worktreeTagAssignment.deleteMany({where:{worktreeId:e}}),...a.length?[r.worktreeTagAssignment.createMany({data:a.map(t=>({worktreeId:e,tagId:t}))})]:[]]);let n=await r.worktree.findUniqueOrThrow({where:{id:e},include:f});return this.publish(e,n.codebaseId),this.view(n)}async saveTag(e){let r=e.name.trim();if(!r||r.length>40)throw Error("Tag names must contain 1–40 characters");let a=this.requireColor(e.color),n=await (0,i.getPrismaClient)(),s=(await n.worktreeTag.findMany()).find(e=>e.name.toLocaleLowerCase()===r.toLocaleLowerCase());if(s&&s.id!==e.id)throw Error("Tag names must be unique");let o=e.id?await n.worktreeTag.update({where:{id:e.id},data:{name:r,color:a}}):await n.worktreeTag.create({data:{id:(0,t.randomUUID)(),name:r,color:a}});return this.publish(null,null),o}async deleteTag(e){let t=await (0,i.getPrismaClient)(),r=await t.worktreeTag.deleteMany({where:{id:e}});return r.count&&this.publish(null,null),r.count>0}async repositoryTakenBranches(e){let t=await (0,i.getPrismaClient)();return new Set((await t.codebase.findMany({where:{repositoryId:e},select:{localBranchesJson:!0,remoteBranchesJson:!0,worktrees:{where:{missingAt:null},select:{branch:!0}}}})).flatMap(e=>[...v(e.localBranchesJson),...v(e.remoteBranchesJson),...e.worktrees.flatMap(e=>e.branch?[e.branch]:[])]))}requireBaseBranch(e,t){let r=t.trim();if(!r||!v(e.remoteBranchesJson).includes(r))throw Error("The selected origin base branch is unavailable; fetch and try again");return r}async ticketBranch(e,t,r){let i=t?.trim()??"",a=await this.jiraService.branchTicket(i),n=await (0,l.jiraBranchCandidates)(a.branchNamingScript,{ticketKey:a.ticketKey,type:a.ticketType??"",title:a.ticketTitle}),s=await this.repositoryTakenBranches(e.repositoryId),o=n.filter(e=>e===r||!s.has(e));if(!o.length)throw Error("Every generated ticket branch name is already taken");return{ticket:a,candidates:o}}async previewTicketBranch(e){let t=await (0,i.getPrismaClient)(),r=await t.codebase.findUnique({where:{id:e.codebaseId},include:{agent:!0,repository:!0}});if(!r)throw Error("Codebase not found");let a=null;if(e.worktreeId){let r=await t.worktree.findFirst({where:{id:e.worktreeId,codebaseId:e.codebaseId,missingAt:null},select:{branch:!0}});if(!r)throw Error("Worktree not found for this codebase");a=r.branch}let{ticket:n,candidates:s}=await this.ticketBranch(r,e.ticketKey,a);return{ticketKey:n.ticketKey,ticketTitle:n.ticketTitle,ticketType:n.ticketType,projectKey:n.projectKey,branchName:s[0]}}async resolveBranchSelection(e,t,r){let a=this.requireBaseBranch(e,t.baseBranch);if("TICKET"===t.mode){let{candidates:i}=await this.ticketBranch(e,t.ticketKey,r?.branch??null);return{baseBranch:a,mode:"NEW",candidates:i}}let n=t.branchName?.trim()??"";if(!(0,o.validGitBranchName)(n))throw Error("Enter a valid Git branch name");if("NEW"===t.mode){if((await this.repositoryTakenBranches(e.repositoryId)).has(n))throw Error(`Branch ${n} is already taken`);return{baseBranch:a,mode:"NEW",candidates:[n]}}if("EXISTING"!==t.mode)throw Error("Unknown worktree branch mode");if(!new Set([...v(e.localBranchesJson),...v(e.remoteBranchesJson)]).has(n))throw Error(`Existing branch ${n} is unavailable; refresh and try again`);let s=await (0,i.getPrismaClient)();if(await s.worktree.findFirst({where:{codebaseId:e.id,branch:n,missingAt:null,...r?{id:{not:r.id}}:{}},select:{id:!0}}))throw Error(`Branch ${n} is checked out in another worktree`);return{baseBranch:a,mode:"EXISTING",candidates:[n]}}async createWorktree(e){let t=await this.requireRunnableCodebase(e.codebaseId),r=await this.resolveBranchSelection(t,e.selection,null);return this.agentControl.createJob({agentId:t.agentId,codebaseId:t.id,kind:o.WORKTREE_BRANCH_JOB_KIND,payload:{codebaseId:t.id,rootFolder:t.folder,folder:null,gitDirectory:null,expectedOrigin:t.repository.canonicalOrigin,baseBranch:r.baseBranch,action:"CREATE",mode:r.mode,candidates:r.candidates,stashOnFailure:!1},idempotencyKey:`worktree:branch:create:${e.requestId}:${t.id}`,timeoutSeconds:600})}async changeWorktreeBranch(e){let t=await this.requireRunnable(e.worktreeId,o.WORKTREE_BRANCH_JOB_KIND),r=await this.resolveBranchSelection(t.codebase,e.selection,{id:t.id,branch:t.branch});return this.agentControl.createJob({agentId:t.codebase.agentId,codebaseId:t.codebaseId,worktreeId:t.id,kind:o.WORKTREE_BRANCH_JOB_KIND,payload:{codebaseId:t.codebaseId,rootFolder:t.codebase.folder,folder:t.folder,gitDirectory:t.gitDirectory,expectedOrigin:t.codebase.repository.canonicalOrigin,baseBranch:r.baseBranch,action:"CHANGE",mode:r.mode,candidates:r.candidates,stashOnFailure:!!e.stashOnFailure},idempotencyKey:`worktree:branch:change:${e.requestId}:${t.id}`,timeoutSeconds:600})}async getMove(e){return(await (0,i.getPrismaClient)()).worktreeMove.findUnique({where:{id:e}})}async moveWorktree(e){let r,a=await (0,i.getPrismaClient)(),n=await a.worktreeMove.findUnique({where:{sourceWorktreeId_requestId:{sourceWorktreeId:e.sourceWorktreeId,requestId:e.requestId}}});if(n)return n;let s=await this.requireRunnable(e.sourceWorktreeId,o.WORKTREE_MOVE_PUSH_JOB_KIND);if(!s.branch||!s.headSha)throw Error("A named source branch is required");if(s.hasStagedChanges||s.hasUnstagedChanges||"READY"!==s.pushStatus)throw Error("The source branch must be clean and safely pushable before moving");if(e.deleteSource&&s.primary)throw Error("The primary worktree cannot be deleted after moving");if(e.deleteSource&&!y(s.codebase.agent).includes(o.WORKTREE_DELETE_JOB_KIND))throw Error("Source agent must be updated to remove the old worktree");let l=await this.requireRunnableCodebase(e.targetCodebaseId,o.WORKTREE_MOVE_CHECKOUT_JOB_KIND);if(s.codebase.repositoryId!==l.repositoryId||s.codebase.agentId===l.agentId)throw Error("The destination must be the same repository on another agent");let c=e.targetWorktreeId?await a.worktree.findFirst({where:{id:e.targetWorktreeId,codebaseId:l.id,missingAt:null,availability:"AVAILABLE"}}):null;if(e.targetWorktreeId&&!c)throw Error("Destination worktree not found");if(await a.worktree.findFirst({where:{codebaseId:l.id,branch:s.branch,missingAt:null,...c?{id:{not:c.id}}:{}},select:{id:!0}}))throw Error("The source branch is already checked out in another destination worktree");let u=l.defaultBranch??s.codebase.defaultBranch;if(!u)throw Error("The destination default branch is unavailable");let d=(0,t.randomUUID)();try{r=await a.worktreeMove.create({data:{id:d,requestId:e.requestId,sourceWorktreeId:s.id,sourceCodebaseId:s.codebaseId,targetCodebaseId:l.id,targetWorktreeId:c?.id??null,destinationMode:c?"EXISTING":"NEW",branch:s.branch,headSha:s.headSha,baseBranch:u,deleteSource:e.deleteSource,status:"PUSHING"}})}catch(r){let t=await a.worktreeMove.findUnique({where:{sourceWorktreeId_requestId:{sourceWorktreeId:e.sourceWorktreeId,requestId:e.requestId}}});if(t)return t;throw r}try{let e=await this.agentControl.createJob({agentId:s.codebase.agentId,codebaseId:s.codebaseId,worktreeId:s.id,kind:o.WORKTREE_MOVE_PUSH_JOB_KIND,payload:{moveId:r.id,codebaseId:s.codebaseId,folder:s.folder,gitDirectory:s.gitDirectory,expectedOrigin:s.codebase.repository.canonicalOrigin,branch:s.branch,expectedHeadSha:s.headSha},idempotencyKey:`worktree:move:push:${r.id}`,timeoutSeconds:600});return r=await a.worktreeMove.update({where:{id:r.id},data:{sourceJobId:e.id}}),this.publish(s.id,s.codebaseId),r}catch(e){throw await a.worktreeMove.update({where:{id:r.id},data:{status:"FAILED",error:e instanceof Error?e.message:String(e),finishedAt:new Date}}),e}}async retryWorktreeMoveWithStash(e){let t=await (0,i.getPrismaClient)(),r=await t.worktreeMove.findUnique({where:{id:e}});if(!r||"AWAITING_STASH"!==r.status)throw Error("This move is not waiting for a stash decision");let a=await this.createMoveCheckoutJob(r,!0);if(1!==(await t.worktreeMove.updateMany({where:{id:e,status:"AWAITING_STASH"},data:{status:"CHECKING_OUT",targetJobId:a.id,error:null}})).count){let r=await t.worktreeMove.findUniqueOrThrow({where:{id:e}});if("AWAITING_STASH"!==r.status)return r;throw Error("The move state changed; refresh and try again")}return this.publish(r.sourceWorktreeId,r.sourceCodebaseId),t.worktreeMove.findUniqueOrThrow({where:{id:e}})}async cancelWorktreeMove(e){let t=await (0,i.getPrismaClient)(),r=await t.worktreeMove.findUnique({where:{id:e}});if(!r||"AWAITING_STASH"!==r.status)throw Error("Only a move waiting for a stash decision can be cancelled");let a=await t.worktreeMove.update({where:{id:e},data:{status:"CANCELLED",finishedAt:new Date}});return this.publish(r.sourceWorktreeId,r.sourceCodebaseId),a}async deleteWorktree(e){let t=await this.requireRunnable(e.worktreeId,o.WORKTREE_DELETE_JOB_KIND);if(t.primary)throw Error("The primary worktree cannot be deleted");if(e.deleteRemoteBranch&&(!t.branch||t.branch===t.codebase.defaultBranch))throw Error("The default remote branch cannot be deleted");return this.agentControl.createJob({agentId:t.codebase.agentId,codebaseId:t.codebaseId,worktreeId:t.id,kind:o.WORKTREE_DELETE_JOB_KIND,payload:{moveId:null,codebaseId:t.codebaseId,rootFolder:t.codebase.folder,folder:t.folder,gitDirectory:t.gitDirectory,expectedOrigin:t.codebase.repository.canonicalOrigin,branch:t.branch,defaultBranch:t.codebase.defaultBranch,deleteRemoteBranch:e.deleteRemoteBranch,requireClean:!1,expectedHeadSha:null},idempotencyKey:`worktree:delete:${e.requestId}:${t.id}`,timeoutSeconds:600})}async inspect(e,t){let r=await this.requireRunnable(e,o.WORKTREE_INSPECT_JOB_KIND),a=await this.createSerializedDiffJob({agentId:r.codebase.agentId,codebaseId:r.codebaseId,worktreeId:r.id,kind:o.WORKTREE_INSPECT_JOB_KIND,payload:this.payload(r),idempotencyKey:`worktree:inspect:${t}:${e}`,timeoutSeconds:30,visibility:"SYSTEM"});try{let e=await this.waitForJob(a.id),t=x(e).detail;if(!t||"object"!=typeof t)throw Error("Invalid worktree detail");let r=Array.isArray(t.changes)?t.changes.map(e=>e&&"object"==typeof e&&!Array.isArray(e)?{...e,changeType:"string"==typeof e.changeType?e.changeType:"MODIFIED"}:e):[];return{...t,changes:r,branchChanges:Array.isArray(t.branchChanges)?t.branchChanges:[],branchChangesTruncated:!0===t.branchChangesTruncated}}finally{let e=await (0,i.getPrismaClient)();await e.agentJob.deleteMany({where:{id:a.id,visibility:"SYSTEM"}})}}async inspectDiff(e,t,r){let a=await this.requireRunnable(e,o.WORKTREE_DIFF_JOB_KIND,!0),n=this.payload(a);if(!n.baseBranch)throw Error("A base branch is required");let s=await this.createSerializedDiffJob({agentId:a.codebase.agentId,codebaseId:a.codebaseId,worktreeId:a.id,kind:o.WORKTREE_DIFF_JOB_KIND,payload:{...n,baseBranch:n.baseBranch,scope:t.scope,path:t.path??null,previousPath:t.previousPath??null,commitSha:t.commitSha??null,uploadId:null,side:null},idempotencyKey:`worktree:diff:${r}:${e}`,timeoutSeconds:30,visibility:"SYSTEM"});try{let e=await this.waitForJob(s.id),t=x(e).diff;if(!t||"object"!=typeof t)throw Error("Invalid worktree diff result");return t}finally{let e=await (0,i.getPrismaClient)();await e.agentJob.deleteMany({where:{id:s.id,visibility:"SYSTEM"}})}}async prepareDiffAsset(e,t,r){let a=await this.requireRunnable(e,o.WORKTREE_DIFF_ASSET_JOB_KIND,!0),n=this.payload(a);if(!n.baseBranch)throw Error("A base branch is required");let s=await this.createSerializedDiffJob({agentId:a.codebase.agentId,codebaseId:a.codebaseId,worktreeId:a.id,kind:o.WORKTREE_DIFF_ASSET_JOB_KIND,payload:{...n,baseBranch:n.baseBranch,scope:t.scope,path:t.path,previousPath:t.previousPath??null,commitSha:t.commitSha??null,uploadId:r,side:t.side},idempotencyKey:`worktree:diff-asset:${r}:${e}`,timeoutSeconds:60,visibility:"SYSTEM"});try{x(await this.waitForJob(s.id))}finally{let e=await (0,i.getPrismaClient)();await e.agentJob.deleteMany({where:{id:s.id,visibility:"SYSTEM"}})}}async diffAssetAgentId(e){let t=await (0,i.getPrismaClient)(),r=await t.worktree.findUnique({where:{id:e},select:{codebase:{select:{agentId:!0}}}});return r?.codebase.agentId??null}async runOperation(e,t,r){if(!o.WORKTREE_OPERATIONS.includes(t))throw Error("Unknown worktree operation");let i=await this.requireRunnable(e,o.WORKTREE_OPERATION_JOB_KIND),a=await this.settings();return this.agentControl.createJob({agentId:i.codebase.agentId,codebaseId:i.codebaseId,worktreeId:i.id,kind:o.WORKTREE_OPERATION_JOB_KIND,payload:{...this.payload(i),operation:t,..."OPEN_EDITOR"===t?{editorVariant:a.editorVariant}:{}},idempotencyKey:`worktree:operation:${r}:${e}`,timeoutSeconds:"OPEN_EDITOR"===t?30:600})}payload(e){return{codebaseId:e.codebaseId,folder:e.folder,gitDirectory:e.gitDirectory,expectedOrigin:e.codebase.repository.canonicalOrigin,baseBranch:e.baseBranchOverride??e.codebase.defaultBranch??null}}async createSerializedDiffJob(e){let t=await (0,i.getPrismaClient)(),r=Date.now()+3e4;for(;Date.now()<r;){let i=await t.agentJob.findFirst({where:{codebaseId:e.codebaseId,status:{in:d}},select:{id:!0,idempotencyKey:!0,kind:!0}});if(i){if(i.idempotencyKey===e.idempotencyKey)return this.agentControl.createJob(e);if(!m.has(i.kind))throw Error("Another operation is active for this codebase");await this.waitForSerializedDiffJob(i.id,r);continue}try{return await this.agentControl.createJob(e)}catch(e){if(!function(e){if(!e||"object"!=typeof e||"P2002"!==e.code)return!1;let t=e.meta?.target;return Array.isArray(t)?t.includes("codebaseId"):"string"==typeof t&&t.includes("codebaseId")}(e))throw e}}throw Error("Another diff request is still active for this codebase")}async waitForSerializedDiffJob(e,t){let r=n.agentEventBus.iterate((0,n.agentJobChangedTopic)(e));try{for(;Date.now()<t;){let i=await this.agentControl.getJob(e);if(!i||!d.includes(i.status))return;await Promise.race([r.next(),new Promise(e=>setTimeout(e,Math.max(0,t-Date.now())))])}throw Error("Another diff request is still active for this codebase")}finally{await r.return?.()}}async requireRunnable(e,t,r=!1){let a=await (0,i.getPrismaClient)(),n=await a.worktree.findUnique({where:{id:e},include:{codebase:{include:{agent:!0,repository:!0}}}});if(!n||n.missingAt||"AVAILABLE"!==n.availability)throw Error("Worktree is unavailable");if(!g(n.codebase.agent))throw Error("Agent is offline");if(!y(n.codebase.agent).includes(t))throw Error("Agent must be updated to use worktrees");if(!r){let[e,t]=await Promise.all([a.agentJob.findFirst({where:{codebaseId:n.codebaseId,status:{in:d}}}),a.worktreeMove.findFirst({where:{status:{in:p},OR:[{sourceCodebaseId:n.codebaseId},{targetCodebaseId:n.codebaseId}]}})]);if(e||t)throw Error("Another operation is active for this codebase")}return n}async requireRunnableCodebase(e,t=o.WORKTREE_BRANCH_JOB_KIND){let r=await (0,i.getPrismaClient)(),a=await r.codebase.findUnique({where:{id:e},include:{agent:!0,repository:!0}});if(!a||"AVAILABLE"!==a.availability)throw Error("Codebase is unavailable");if(!g(a.agent))throw Error("Agent is offline");if(!y(a.agent).includes(t))throw Error("Agent must be updated to create or change worktrees");let[n,s]=await Promise.all([r.agentJob.findFirst({where:{codebaseId:e,status:{in:d}}}),r.worktreeMove.findFirst({where:{status:{in:p},OR:[{sourceCodebaseId:e},{targetCodebaseId:e}]}})]);if(n||s)throw Error("Another operation is active for this codebase");return a}async purge(e){let t=await (0,i.getPrismaClient)(),r=await t.worktree.deleteMany({where:{id:e,missingAt:{not:null}}});return r.count&&this.publish(e,null),r.count>0}async purgeAll(){let e=await (0,i.getPrismaClient)(),t=await e.worktree.deleteMany({where:{missingAt:{not:null}}});return t.count&&this.publish(null,null),t.count}subscribe(){return n.agentEventBus.iterate(n.WORKTREE_CHANGED_TOPIC)}async *subscribeInspection(e){let t=n.agentEventBus.iterate((0,n.worktreeInspectionTopic)(e)),r=!1;try{for await(let i of(await this.acquireWatch(e),r=!0,t))yield i}finally{await t.return?.(),r&&await this.releaseWatch(e)}}async acquireWatch(e){let r=this.watchDemand.get(e);if(r){r.subscribers+=1,await r.started;return}let i=await this.requireRunnable(e,o.WORKTREE_WATCH_JOB_KIND,!0),a=(0,t.randomUUID)(),n=this.payload(i),s={subscribers:1,watchId:a,agentId:i.codebase.agentId,worktreeId:i.id,codebaseId:i.codebaseId,payload:n,started:Promise.resolve()};s.started=this.runWatchAction(s,"START"),this.watchDemand.set(e,s);try{await s.started}catch(t){throw this.watchDemand.get(e)===s&&this.watchDemand.delete(e),t}}async releaseWatch(e){let t=this.watchDemand.get(e);if(t&&(t.subscribers-=1,!(t.subscribers>0))){this.watchDemand.delete(e);try{await t.started,await this.runWatchAction(t,"STOP")}catch(e){console.error("Could not stop worktree watcher:",e instanceof Error?e.message:e)}}}async runWatchAction(e,t){let r=await this.agentControl.createJob({agentId:e.agentId,worktreeId:e.worktreeId,kind:o.WORKTREE_WATCH_JOB_KIND,payload:{...e.payload,action:t,watchId:e.watchId},idempotencyKey:`worktree:watch:${t}:${e.watchId}`,timeoutSeconds:30,visibility:"SYSTEM"});try{x(await this.waitForJob(r.id))}finally{let e=await (0,i.getPrismaClient)();await e.agentJob.deleteMany({where:{id:r.id,visibility:"SYSTEM"}})}}async restartWatch(e){let r=this.watchDemand.get(e);if(r)try{if(await r.started,this.watchDemand.get(e)!==r||(await this.runWatchAction(r,"STOP"),this.watchDemand.get(e)!==r))return;let i=await this.requireRunnable(e,o.WORKTREE_WATCH_JOB_KIND,!0),a={subscribers:r.subscribers,watchId:(0,t.randomUUID)(),agentId:i.codebase.agentId,worktreeId:i.id,codebaseId:i.codebaseId,payload:this.payload(i),started:Promise.resolve()};a.started=this.runWatchAction(a,"START"),this.watchDemand.set(e,a),await a.started}catch(e){console.error("Could not restart worktree watcher:",e instanceof Error?e.message:e)}}publish(e,t){n.agentEventBus.publish(n.WORKTREE_CHANGED_TOPIC,{worktreeOverviewChanged:{worktreeId:e,codebaseId:t}})}moveIdFromJob(e){let t=JSON.parse(e.payloadJson);if(!t||"object"!=typeof t||Array.isArray(t)||"string"!=typeof t.moveId)throw Error("Move job is missing its workflow identifier");return String(t.moveId)}async failMove(e,t,r){let a=await (0,i.getPrismaClient)();(await a.worktreeMove.updateMany({where:{id:e,status:t},data:{status:"FAILED",error:r,finishedAt:new Date}})).count&&this.publish(null,null)}async createMoveCheckoutJob(e,t){let r=await (0,i.getPrismaClient)(),a=await r.codebase.findUnique({where:{id:e.targetCodebaseId},include:{agent:!0,repository:!0}});if(!a)throw Error("Destination codebase no longer exists");if(!g(a.agent))throw Error("Destination agent is offline");if(!y(a.agent).includes(o.WORKTREE_MOVE_CHECKOUT_JOB_KIND))throw Error("Destination agent must be updated to move worktrees");let n=e.targetWorktreeId?await r.worktree.findFirst({where:{id:e.targetWorktreeId,codebaseId:a.id,missingAt:null,availability:"AVAILABLE"}}):null;if("EXISTING"===e.destinationMode&&!n)throw Error("Destination worktree is no longer available");return this.agentControl.createJob({agentId:a.agentId,codebaseId:a.id,worktreeId:n?.id??null,kind:o.WORKTREE_MOVE_CHECKOUT_JOB_KIND,payload:{moveId:e.id,codebaseId:a.id,rootFolder:a.folder,folder:n?.folder??null,gitDirectory:n?.gitDirectory??null,expectedOrigin:a.repository.canonicalOrigin,branch:e.branch,expectedHeadSha:e.headSha,baseBranch:e.baseBranch,mode:e.destinationMode,stashOnFailure:t},idempotencyKey:`worktree:move:checkout:${e.id}:${t?"stash":"initial"}`,timeoutSeconds:600})}async advanceMoveAfterPush(e){let t=this.moveIdFromJob(e),r=await (0,i.getPrismaClient)(),a=await r.worktreeMove.findUnique({where:{id:t}});if(!a||"PUSHING"!==a.status||a.sourceJobId&&a.sourceJobId!==e.id)return;if("SUCCEEDED"!==e.status)return void await this.failMove(a.id,"PUSHING",e.error||"Could not push the source branch");let n=x(e);if(n.headSha!==a.headSha||n.branch!==a.branch)return void await this.failMove(a.id,"PUSHING","The source push returned an unexpected branch");try{let e=await this.createMoveCheckoutJob(a,!1);await r.worktreeMove.updateMany({where:{id:a.id,status:"PUSHING"},data:{status:"CHECKING_OUT",targetJobId:e.id}}),this.publish(a.sourceWorktreeId,a.sourceCodebaseId)}catch(e){await this.failMove(a.id,"PUSHING",e instanceof Error?e.message:String(e))}}async projectMoveDestination(e,r){let a=(0,o.parseWorktreeInventoryItem)(r),n=await (0,i.getPrismaClient)(),s=await n.codebase.findUnique({where:{id:e.targetCodebaseId},select:{localBranchesJson:!0}});if(!s)throw Error("Destination codebase no longer exists");let l=new Set(v(s.localBranchesJson));a.branch&&l.add(a.branch);let c=e.targetWorktreeId;return await n.$transaction(async r=>{if(await r.codebase.update({where:{id:e.targetCodebaseId},data:{localBranchesJson:JSON.stringify([...l].sort((e,t)=>e.localeCompare(t)))}}),c){if(1!==(await r.worktree.updateMany({where:{id:c,codebaseId:e.targetCodebaseId},data:{...this.inventoryData(a),gitDirectory:a.gitDirectory,baseBranchOverride:e.baseBranch,missingAt:null}})).count)throw Error("Destination worktree no longer exists")}else c=(await r.worktree.upsert({where:{codebaseId_gitDirectory:{codebaseId:e.targetCodebaseId,gitDirectory:a.gitDirectory}},create:{id:(0,t.randomUUID)(),codebaseId:e.targetCodebaseId,gitDirectory:a.gitDirectory,...this.inventoryData(a),baseBranchOverride:e.baseBranch},update:{...this.inventoryData(a),baseBranchOverride:e.baseBranch,missingAt:null}})).id;await r.worktreeMove.update({where:{id:e.id},data:{targetWorktreeId:c}})}),this.publish(c??null,e.targetCodebaseId),await this.skillsService?.requestAutoReconcile(),c}async scheduleMoveCleanup(e){let t=await (0,i.getPrismaClient)(),r=await t.worktreeMove.findUniqueOrThrow({where:{id:e}}),a=await t.worktree.findUnique({where:{id:r.sourceWorktreeId},include:{codebase:{include:{agent:!0,repository:!0}}}});if(!a||a.missingAt||a.primary){await t.worktreeMove.update({where:{id:r.id},data:{status:"SUCCEEDED_WITH_WARNING",warning:"Destination is ready, but the source worktree could not be removed",finishedAt:new Date}}),this.publish(r.sourceWorktreeId,r.sourceCodebaseId);return}try{let e=await this.agentControl.createJob({agentId:a.codebase.agentId,codebaseId:a.codebaseId,worktreeId:a.id,kind:o.WORKTREE_DELETE_JOB_KIND,payload:{moveId:r.id,codebaseId:a.codebaseId,rootFolder:a.codebase.folder,folder:a.folder,gitDirectory:a.gitDirectory,expectedOrigin:a.codebase.repository.canonicalOrigin,branch:a.branch,defaultBranch:a.codebase.defaultBranch,deleteRemoteBranch:!1,requireClean:!0,expectedHeadSha:r.headSha},idempotencyKey:`worktree:move:cleanup:${r.id}`,timeoutSeconds:600});await t.worktreeMove.updateMany({where:{id:r.id,status:{in:["PUSHING","CHECKING_OUT","AWAITING_STASH"]}},data:{status:"CLEANING_UP",cleanupJobId:e.id}}),this.publish(a.id,a.codebaseId)}catch(e){await t.worktreeMove.update({where:{id:r.id},data:{status:"SUCCEEDED_WITH_WARNING",warning:e instanceof Error?e.message:String(e),finishedAt:new Date}}),this.publish(a.id,a.codebaseId)}}async advanceMoveAfterCheckout(e){let t=this.moveIdFromJob(e),r=await (0,i.getPrismaClient)(),a=await r.worktreeMove.findUnique({where:{id:t}});if(!a||!["PUSHING","CHECKING_OUT","AWAITING_STASH"].includes(a.status)||a.targetJobId&&a.targetJobId!==e.id)return;if("SUCCEEDED"!==e.status)return void await this.failMove(a.id,a.status,e.error||"Could not check out the destination branch");let n=x(e);if("NEEDS_STASH"===n.outcome){await r.worktreeMove.updateMany({where:{id:a.id,status:{in:["PUSHING","CHECKING_OUT","AWAITING_STASH"]}},data:{status:"AWAITING_STASH",error:"string"==typeof n.message?n.message:"Destination changes block the branch switch"}}),this.publish(a.sourceWorktreeId,a.sourceCodebaseId);return}"CHECKED_OUT"===n.outcome&&n.worktree?(await this.projectMoveDestination(a,n.worktree),a.deleteSource?await this.scheduleMoveCleanup(a.id):(await r.worktreeMove.update({where:{id:a.id},data:{status:"SUCCEEDED",error:null,finishedAt:new Date}}),this.publish(a.sourceWorktreeId,a.sourceCodebaseId))):await this.failMove(a.id,a.status,"Destination checkout returned an invalid result")}async projectDeleteOperation(e){let t=JSON.parse(e.payloadJson),r=t&&"object"==typeof t&&!Array.isArray(t)&&"string"==typeof t.moveId?String(t.moveId):null,a=await (0,i.getPrismaClient)();if(r){let t=await a.worktreeMove.findUnique({where:{id:r}});if(!t||!["PUSHING","CHECKING_OUT","AWAITING_STASH","CLEANING_UP"].includes(t.status)||t.cleanupJobId&&t.cleanupJobId!==e.id)return;if("SUCCEEDED"!==e.status){await a.worktreeMove.update({where:{id:t.id},data:{status:"SUCCEEDED_WITH_WARNING",warning:e.error||"Destination is ready, but the source worktree was retained",finishedAt:new Date}}),this.publish(t.sourceWorktreeId,t.sourceCodebaseId);return}await a.$transaction([a.worktree.deleteMany({where:{id:t.sourceWorktreeId}}),a.worktreeMove.update({where:{id:t.id},data:{status:"SUCCEEDED",finishedAt:new Date}})]),this.publish(t.sourceWorktreeId,t.sourceCodebaseId);return}if("SUCCEEDED"!==e.status||!e.worktreeId)return;let n=await a.worktree.findUnique({where:{id:e.worktreeId},select:{codebaseId:!0}});await a.worktree.deleteMany({where:{id:e.worktreeId}}),this.publish(e.worktreeId,n?.codebaseId??null)}async projectOperation(e){if(!e.worktreeId||"SUCCEEDED"!==e.status||!e.resultJson)return;let t=x({...e,error:null});if(!t.worktree)return;let r=(0,o.parseWorktreeInventoryItem)(t.worktree),a=await (0,i.getPrismaClient)(),n=await a.worktree.findUnique({where:{id:e.worktreeId}});if(!n)return;let s=new Date(r.checkedAt);(await a.worktree.updateMany({where:{id:n.id,OR:[{lastCheckedAt:null},{lastCheckedAt:{lt:s}}]},data:{branch:r.branch,headSha:r.headSha,upstream:r.upstream,ahead:r.ahead,behind:r.behind,syncState:r.syncState,baseAhead:r.baseAhead,baseBehind:r.baseBehind,hasStagedChanges:r.hasStagedChanges??!1,hasUnstagedChanges:r.hasUnstagedChanges??!1,pushStatus:r.pushStatus??"UNKNOWN",availability:r.availability,statusError:r.error,lastCheckedAt:s}})).count>0&&this.publish(n.id,n.codebaseId)}async projectBranchOperation(e){if(!e.codebaseId||"SUCCEEDED"!==e.status||!e.resultJson)return;let r=x({...e,error:null});if(!r.worktree||"string"!=typeof r.baseBranch)return;let a=(0,o.parseWorktreeInventoryItem)(r.worktree),n=await (0,i.getPrismaClient)(),s=await n.codebase.findUnique({where:{id:e.codebaseId},select:{localBranchesJson:!0}});if(!s)return;let l=new Set(v(s.localBranchesJson));a.branch&&l.add(a.branch);let c=e.worktreeId;await n.$transaction(async i=>{if(await i.codebase.update({where:{id:e.codebaseId},data:{localBranchesJson:JSON.stringify([...l].sort((e,t)=>e.localeCompare(t)))}}),e.worktreeId){if(1!==(await i.worktree.updateMany({where:{id:e.worktreeId,codebaseId:e.codebaseId},data:{...this.inventoryData(a),gitDirectory:a.gitDirectory,baseBranchOverride:r.baseBranch,missingAt:null}})).count)throw Error("Worktree no longer exists");return}c=(await i.worktree.upsert({where:{codebaseId_gitDirectory:{codebaseId:e.codebaseId,gitDirectory:a.gitDirectory}},create:{id:(0,t.randomUUID)(),codebaseId:e.codebaseId,gitDirectory:a.gitDirectory,...this.inventoryData(a),baseBranchOverride:r.baseBranch},update:{...this.inventoryData(a),baseBranchOverride:r.baseBranch,missingAt:null}})).id}),this.publish(c??null,e.codebaseId),await this.skillsService?.requestAutoReconcile(),e.worktreeId&&await this.restartWatch(e.worktreeId)}async waitForJob(e){let t=n.agentEventBus.iterate((0,n.agentJobChangedTopic)(e)),r=Date.now()+3e4;try{for(;Date.now()<r;){let i=await this.agentControl.getJob(e);if(!i)throw Error("Worktree job disappeared");if(["SUCCEEDED","FAILED","CANCELLED","TIMED_OUT"].includes(i.status))return i;await Promise.race([t.next(),new Promise(e=>setTimeout(e,r-Date.now()))])}throw await this.agentControl.cancelJob(e),Error("Agent did not respond in time")}finally{await t.return?.()}}},"worktreeDisplayPath",0,w],504173);let k=new Set(["SUCCEEDED","FAILED","CANCELLED","TIMED_OUT","INVALID"]),_={agents:{include:{agent:!0}},jobs:{orderBy:{createdAt:"asc"}}};function $(e){return null!==e.lastSeenAt&&Date.now()-e.lastSeenAt.getTime()<=a.AGENT_ONLINE_WINDOW_MS&&null===e.disconnectedAt}function I(e){try{let t=JSON.parse(e.capabilitiesJson);return Array.isArray(t)?t.filter(e=>"string"==typeof e):[]}catch{return[]}}function S(e){return null===e?null:JSON.parse(e)}function E(e){return(0,r.buildDataTargetsPayload)(S(e.payloadJson)).targets.map(e=>e.path)}function T(e,t){let i=e===r.BUILD_DATA_DELETE_JOB_KIND?"delete":"size";return`Invalid Build Data ${i} result: ${t instanceof Error?t.message:String(t)}`}function C(e,t,r){try{for(let i of E(t)){let a=e.get(R(t.agentId,i));a&&(a.error=r)}}catch{}}function R(e,r){return(0,t.createHash)("sha256").update(e).update("\0").update(r).digest("base64url")}e.s(["BuildDataService",0,class{agentControlService;initialized;constructor(e){this.agentControlService=e,this.initialized=!1,this.agentControlService.registerCompletionHandler(r.BUILD_DATA_DELETE_JOB_KIND,e=>this.projectDeletion(e))}async initialize(){this.initialized||(await this.pruneHistory(),this.initialized=!0)}async refresh(e){await this.initialize();let r=e?.trim()||(0,t.randomUUID)();return await this.ensureCollection(r),await this.getCollection(r)}async getCollection(e){await this.initialize();let t=await this.loadCollection(e);if(!t)return null;!t.finishedAt&&t.deadlineAt.getTime()<=Date.now()&&(await this.expireCollection(t),t=await this.loadCollection(e)??t);let r=await this.snapshot(t);if("COMPLETED"===r.status&&!t.finishedAt){let t=new Date,a=await (0,i.getPrismaClient)();await a.buildDataCollection.updateMany({where:{id:e,finishedAt:null},data:{finishedAt:t}}),r.finishedAt=t.toISOString()}return r}async *subscribe(e){await this.initialize();let t=n.agentEventBus.iterate((0,n.buildDataCollectionChangedTopic)(e));try{let r=await this.getCollection(e);for(r&&(yield r);;){if((await t.next()).done)return;let r=await this.getCollection(e);r&&(yield r)}}finally{await t.return?.()}}async calculateSizes(e,t,i){let a=await this.requireCollection(e);return await this.createTargetJobs(a,t,i,r.BUILD_DATA_SIZE_JOB_KIND),await this.getCollection(e)}async deleteEntries(e,t,i){let a=await this.requireCollection(e);return await this.createTargetJobs(a,t,i,r.BUILD_DATA_DELETE_JOB_KIND),await this.getCollection(e)}async history(e=100,t){await this.initialize(),await this.pruneHistory();let r=Math.max(1,Math.min(e,200)),a=await (0,i.getPrismaClient)(),n=t?await a.buildDataDeletionHistory.findUnique({where:{id:t},select:{id:!0,deletedAt:!0}}):null,s=await a.buildDataDeletionHistory.findMany({where:n?{OR:[{deletedAt:{lt:n.deletedAt}},{deletedAt:n.deletedAt,id:{lt:n.id}}]}:void 0,orderBy:[{deletedAt:"desc"},{id:"desc"}],take:r+1}),o=s.length>r,l=s.slice(0,r);return{items:l,nextCursor:o?l.at(-1)?.id??null:null}}async clearHistory(){await this.initialize();let e=await (0,i.getPrismaClient)();return(await e.buildDataDeletionHistory.deleteMany()).count}async ensureCollection(e){let t=await (0,i.getPrismaClient)(),a=await t.buildDataCollection.findUnique({where:{id:e},select:{id:!0}});if(!a){let i=await this.agentControlService.listAgents();try{a=await t.buildDataCollection.create({data:{id:e,deadlineAt:new Date(Date.now()+6e4),agents:{create:i.map(e=>({agentId:e.id,initialStatus:$(e)?I(e).includes(r.BUILD_DATA_SCAN_JOB_KIND)?"QUEUING":"UNSUPPORTED":"OFFLINE"}))}},select:{id:!0}}),this.publish(e)}catch(r){if(!(a=await t.buildDataCollection.findUnique({where:{id:e},select:{id:!0}})))throw r}}await this.ensureScanJobs(e)}async ensureScanJobs(e){let t=await (0,i.getPrismaClient)(),a=await t.buildDataCollection.findUnique({where:{id:e},select:{deadlineAt:!0,finishedAt:!0}});if(!a||a.finishedAt||a.deadlineAt<=new Date)return;let n=await t.buildDataCollectionAgent.findMany({where:{collectionId:e,initialStatus:"QUEUING"},include:{agent:!0}}),s=new Set((await t.agentJob.findMany({where:{buildDataCollectionId:e,kind:r.BUILD_DATA_SCAN_JOB_KIND},select:{agentId:!0}})).map(e=>e.agentId));for(let i of n)if(!s.has(i.agentId))try{let a=await t.worktree.findMany({where:{missingAt:null,codebase:{agentId:i.agentId}},select:{id:!0,folder:!0}});await this.agentControlService.createJob({agentId:i.agentId,kind:r.BUILD_DATA_SCAN_JOB_KIND,payload:{mode:i.agent.derivedDataLocationMode,path:i.agent.derivedDataPath,worktrees:a},idempotencyKey:`build-data:scan:${e}`,timeoutSeconds:45,buildDataCollectionId:e,visibility:"SYSTEM"})}catch(r){await t.buildDataCollectionAgent.update({where:{collectionId_agentId:{collectionId:e,agentId:i.agentId}},data:{initialStatus:"FAILED",error:r instanceof Error?r.message:String(r)}}),this.publish(e)}}async createTargetJobs(e,t,r,a){let n=[...new Set(t)];if(!n.length)throw Error("Select at least one Derived Data entry");let s=new Map(e.entries.map(e=>[e.id,e])),o=n.map(e=>{let t=s.get(e);if(!t)throw Error("A selected Derived Data entry is no longer available");return t}),l=new Map;for(let e of o){let t=l.get(e.agent.id)??[];t.push(e),l.set(e.agent.id,t)}let c=await (0,i.getPrismaClient)(),u=[];for(let[e,t]of l){let r=t[0].agent,i=await c.agent.findUnique({where:{id:e}});if(!i||!$(i))throw Error(`${r.name} is offline; reconnect it before running this operation`);if(!I(i).includes(a))throw Error(`${r.name} must be updated before this operation can run`);u.push({agentId:e,entries:t})}for(let{agentId:t,entries:i}of u)await this.agentControlService.createJob({agentId:t,kind:a,payload:{targets:i.map(({path:e,rootPath:t})=>({path:e,rootPath:t}))},idempotencyKey:`${a}:${e.id}:${r}:${t}`,timeoutSeconds:604800,buildDataCollectionId:e.id,visibility:"SYSTEM"})}async requireCollection(e){let t=await this.getCollection(e);if(!t)throw Error("Derived Data collection not found");if("COMPLETED"!==t.status)throw Error("Wait for the Derived Data scan to finish");return t}async loadCollection(e){return(await (0,i.getPrismaClient)()).buildDataCollection.findUnique({where:{id:e},include:_})}progress(e){let t=new Map(e.jobs.filter(e=>e.kind===r.BUILD_DATA_SCAN_JOB_KIND).map(e=>[e.agentId,e])),i=e.agents.map(e=>{let i=t.get(e.agentId),a=e.initialStatus,n=e.error,s=[];if("QUEUING"===e.initialStatus&&i&&(a=i.status,n=i.error,"SUCCEEDED"===i.status))try{s=(0,r.parseBuildDataScanResult)(S(i.resultJson)).warnings}catch(e){a="INVALID",n=e instanceof Error?e.message:String(e)}return{agent:e.agent,status:a,jobId:i?.id??null,error:n,warnings:s}}),a=i.filter(({status:e})=>"OFFLINE"!==e&&"UNSUPPORTED"!==e),n=a.filter(({status:e})=>k.has(e));return{agents:i,eligibleCount:a.length,finishedCount:n.length,successfulCount:a.filter(({status:e})=>"SUCCEEDED"===e).length}}async snapshot(e){let t=this.progress(e),r=await this.entries(e,!1);return{id:e.id,status:t.finishedCount===t.eligibleCount?"COMPLETED":"COLLECTING",createdAt:e.createdAt.toISOString(),deadlineAt:e.deadlineAt.toISOString(),finishedAt:e.finishedAt?.toISOString()??null,progress:t,entries:r}}async entries(e,t){let a=await (0,i.getPrismaClient)(),n=new Map(e.agents.map(e=>[e.agentId,e.agent])),s=await a.worktree.findMany({where:{missingAt:null,codebase:{agentId:{in:[...n.keys()]}}},include:{codebase:{select:{agentId:!0}}}}),o=new Map;for(let e of s){let t=o.get(e.codebase.agentId)??[];t.push(e),o.set(e.codebase.agentId,t)}let l=new Map;for(let t of e.jobs){let e;if(t.kind!==r.BUILD_DATA_SCAN_JOB_KIND||"SUCCEEDED"!==t.status)continue;let i=n.get(t.agentId);if(i){try{e=(0,r.parseBuildDataScanResult)(S(t.resultJson))}catch{continue}for(let r of e.entries){let e=(r.workspacePath?(o.get(t.agentId)??[]).filter(e=>(function(e,t){let r="/"===e?e:e.replace(/\/+$/,"");return t===r||t.startsWith(`${r}/`)})(e.folder,r.workspacePath)).sort((e,t)=>t.folder.length-e.folder.length):[])[0]??null,a=R(t.agentId,r.path);l.set(a,{id:a,name:r.name,status:"PENDING"===r.kind?"PENDING":"SHARED_CACHE"===r.kind?"SHARED_CACHE":e?"READY":"UNLINKED",workspacePath:r.workspacePath,worktreeId:e?.id??null,worktreePath:e?w(e.folder,i.baseRepoDirectory):null,sizeBytes:null,operation:"IDLE",error:null,agent:i,path:r.path,rootPath:r.rootPath})}}}for(let i of e.jobs){if(i.kind===r.BUILD_DATA_SIZE_JOB_KIND&&"SUCCEEDED"===i.status)try{for(let e of(0,r.parseBuildDataSizeResult)(S(i.resultJson)).sizes){let t=l.get(R(i.agentId,e.path));t&&(t.sizeBytes=e.sizeBytes,t.error=e.error)}}catch(e){C(l,i,T(r.BUILD_DATA_SIZE_JOB_KIND,e))}if(i.kind===r.BUILD_DATA_DELETE_JOB_KIND&&"SUCCEEDED"===i.status)try{for(let e of(0,r.parseBuildDataDeleteResult)(S(i.resultJson)).deleted){let r=R(i.agentId,e.path),a=l.get(r);a&&(e.deleted&&!t?l.delete(r):a.error=e.error)}}catch(e){C(l,i,T(r.BUILD_DATA_DELETE_JOB_KIND,e))}if("QUEUED"===i.status||"RUNNING"===i.status){if(i.kind!==r.BUILD_DATA_SIZE_JOB_KIND&&i.kind!==r.BUILD_DATA_DELETE_JOB_KIND)continue;try{for(let e of E(i)){let t=l.get(R(i.agentId,e));t&&(t.operation=i.kind===r.BUILD_DATA_DELETE_JOB_KIND?"DELETING":"SIZING")}}catch{}}if("SUCCEEDED"!==i.status&&k.has(i.status)&&(i.kind===r.BUILD_DATA_SIZE_JOB_KIND||i.kind===r.BUILD_DATA_DELETE_JOB_KIND))try{for(let e of E(i)){let t=l.get(R(i.agentId,e));t&&(t.error=i.error||"Build Data operation failed")}}catch{}}return[...l.values()].sort((e,t)=>e.agent.name.localeCompare(t.agent.name)||e.name.localeCompare(t.name))}async expireCollection(e){let t=await (0,i.getPrismaClient)(),a=new Set(e.jobs.filter(e=>e.kind===r.BUILD_DATA_SCAN_JOB_KIND).map(e=>e.agentId));await t.buildDataCollectionAgent.updateMany({where:{collectionId:e.id,initialStatus:"QUEUING",agentId:{notIn:[...a]}},data:{initialStatus:"TIMED_OUT"}}),await this.agentControlService.timeoutBuildDataCollectionJobs(e.id),this.publish(e.id)}async projectDeletion(e){let a;if("SUCCEEDED"!==e.status||!e.buildDataCollectionId||!e.resultJson)return;await this.pruneHistory();let n=await (0,i.getPrismaClient)();if(await n.buildDataDeleteProjection.findUnique({where:{jobId:e.id}}))return;try{a=(0,r.parseBuildDataDeleteResult)(S(e.resultJson)).deleted.filter(e=>e.deleted)}catch(i){let t=T(r.BUILD_DATA_DELETE_JOB_KIND,i);try{await n.buildDataDeleteProjection.create({data:{jobId:e.id,error:t}})}catch(t){if(!await n.buildDataDeleteProjection.findUnique({where:{jobId:e.id}}))throw t}return}if(!a.length)return void await n.buildDataDeleteProjection.create({data:{jobId:e.id}});let s=await this.loadCollection(e.buildDataCollectionId);if(!s)return;let o=new Map((await this.entries(s,!0)).filter(t=>t.agent.id===e.agentId).map(e=>[e.path,e]));try{await n.$transaction(async r=>{if(!await r.buildDataDeleteProjection.findUnique({where:{jobId:e.id}}))for(let i of(await r.buildDataDeleteProjection.create({data:{jobId:e.id}}),a)){let a=o.get(i.path);if(!a)continue;let n=a.worktreeId?(await r.worktree.findUnique({where:{id:a.worktreeId},select:{id:!0}}))?.id??null:null;await r.buildDataDeletionHistory.create({data:{id:(0,t.randomUUID)(),agentId:a.agent.id,agentName:a.agent.name,folderName:a.name,worktreeId:n,worktreePath:a.worktreePath,source:"USER",jobId:e.id,targetKey:a.id}})}})}catch(t){if(!await n.buildDataDeleteProjection.findUnique({where:{jobId:e.id}}))throw t}}async pruneHistory(){let e=await (0,i.getPrismaClient)();await e.buildDataDeletionHistory.deleteMany({where:{deletedAt:{lt:new Date(Date.now()-7776e6)}}})}publish(e){n.agentEventBus.publish((0,n.buildDataCollectionChangedTopic)(e),{buildDataCollectionChanged:{id:e}})}}],925991),e.s([],396763)},971619,e=>{"use strict";var t=e.i(750227);e.s(["effectiveBuildsDirectory",0,function(e){var r;return e.buildsDirectory??((r=e.baseRepoDirectory)?/^[a-z]:[\\/]/i.test(r)||r.startsWith("\\\\")?t.win32.join(r,"Builds"):t.posix.join(r,"Builds"):null)}])},224174,669602,190714,e=>{"use strict";var t=e.i(666680),r=e.i(750227),i=e.i(807055),a=e.i(243783);e.i(805422);var n=e.i(694355),s=e.i(661983),o=e.i(971619);let l=new Set(["smartphone","hammer","play","test-tube","archive","rocket"]),c=new Set(["SUCCEEDED","FAILED","CANCELLED","TIMED_OUT"]),u=["QUEUED","PREPARING","RUNNING"];function d(e,t=null){if(null===e)return t;try{return JSON.parse(e)}catch{return t}}function p(e,t){if(!e||"object"!=typeof e||Array.isArray(e))throw Error(`${t} must be an object`);return e}function m(e){return Array.isArray(e)?e.filter(e=>"string"==typeof e):[]}function h(e){return null!==e.lastSeenAt&&Date.now()-e.lastSeenAt.getTime()<=n.AGENT_ONLINE_WINDOW_MS&&null===e.disconnectedAt}function f(e){return m(d(e.capabilitiesJson,[]))}function g(e,t,r=80){let i=e.trim();if(!i)throw Error(`${t} is required`);if(i.length>r)throw Error(`${t} is too long`);return i}function y(e){return`${e.type}:${e.id}`}function v(e){if(e.codebaseId)return e.codebaseId;let t=d(e.snapshotJson,{});if(t&&"object"==typeof t&&!Array.isArray(t)){let e=t.codebase;if(e&&"object"==typeof e&&!Array.isArray(e)){let t=e.id;if("string"==typeof t&&t.trim())return t}}throw Error("Build coordination metadata is unavailable")}function b(e){return"SUCCEEDED"===e?"SUCCEEDED":"CANCELLED"===e?"CANCELLED":"FAILED"}let w={agent:!0,codebase:{include:{repository:!0}},worktree:{include:{_count:{select:{builds:{where:{status:{in:u}}}}}}},configuration:{include:{source:!0,project:!0}},artifacts:{orderBy:{createdAt:"asc"}},scriptExecutions:{orderBy:[{phase:"asc"},{position:"asc"}]},deployments:{orderBy:{createdAt:"desc"}},exports:{orderBy:{createdAt:"desc"}}};e.s(["BuildsService",0,class{agentControl;constructor(e){this.agentControl=e,this.agentControl.registerCompletionHandler(i.IOS_BUILD_JOB_KIND,e=>this.projectBuildCompletion(e)),this.agentControl.registerCompletionHandler(i.IOS_DEPLOY_JOB_KIND,e=>this.projectDeploymentCompletion(e)),this.agentControl.registerCompletionHandler(i.IOS_EXPORT_JOB_KIND,e=>this.projectExportCompletion(e)),this.agentControl.registerCompletionHandler(i.IOS_TEST_RESULTS_JOB_KIND,e=>this.projectGeneratedReportCompletion(e)),this.agentControl.registerCompletionHandler(i.IOS_COVERAGE_REPORT_JOB_KIND,e=>this.projectGeneratedReportCompletion(e))}publish(e){s.agentEventBus.publish((0,s.buildTopic)(e),{buildChanged:{id:e}}),s.agentEventBus.publish(s.BUILDS_CHANGED_TOPIC,{buildsChanged:{id:e}})}async requireWorktree(e,t){let r=await (0,a.getPrismaClient)(),i=await r.worktree.findUnique({where:{id:e},include:{codebase:{include:{agent:!0,repository:!0}}}});if(!i||i.missingAt||"AVAILABLE"!==i.availability)throw Error("Worktree is unavailable");if(!h(i.codebase.agent))throw Error("Agent is offline");if(!f(i.codebase.agent).includes(t))throw Error("Agent must be updated to use iOS builds");return i}identity(e){return{codebaseId:e.codebaseId,worktreeId:e.id,branch:e.branch,folder:e.folder,gitDirectory:e.gitDirectory,expectedOrigin:e.codebase.repository.canonicalOrigin,headSha:e.headSha,baseBranch:e.baseBranchOverride??e.codebase.defaultBranch??null}}async ensureProject(e){let r=await (0,a.getPrismaClient)(),i=await r.codebase.findUnique({where:{id:e},select:{repositoryId:!0}});if(!i)throw Error("Codebase not found");return r.codebaseProject.upsert({where:{repositoryId_type:{repositoryId:i.repositoryId,type:"IOS_APP"}},create:{id:(0,t.randomUUID)(),repositoryId:i.repositoryId,type:"IOS_APP"},update:{}})}async project(e){let t=await (0,a.getPrismaClient)(),r=await t.codebase.findUnique({where:{id:e},include:{repository:!0}});if(!r)return null;let i=await t.codebaseProject.findUnique({where:{repositoryId_type:{repositoryId:r.repositoryId,type:"IOS_APP"}},include:{configurations:{orderBy:{name:"asc"},include:{source:{include:{observations:{where:{codebaseId:e},orderBy:{lastParseAttemptAt:"desc"},take:1}}}}}}}),n=await t.codebaseRepositoryBuildScript.findMany({where:{repositoryId:r.repositoryId,script:{deletedAt:null}},orderBy:[{position:"asc"},{script:{name:"asc"}}],include:{script:!0}});return i?{...i,repository:r.repository,allowedScripts:n}:null}async createProject(e){return await this.ensureProject(e),this.project(e)}async projectForWorktree(e){let t=await (0,a.getPrismaClient)(),r=await t.worktree.findUnique({where:{id:e},select:{codebaseId:!0}});return r?this.project(r.codebaseId):null}async saveConfiguration(e){let r=await this.ensureProject(e.codebaseId),n=(0,i.parseBuildSource)({kind:e.sourceKind,relativePath:e.sourcePath}),s=g(e.name,"Configuration name"),o=g(e.scheme,"Scheme",256),c=g(e.buildConfiguration,"Xcode configuration",256);if(!i.BUILD_ACTIONS.includes(e.defaultAction))throw Error("Build action is invalid");let u=e.iconKey?.trim()||null;if(u&&!l.has(u))throw Error("Icon is invalid");let d=(0,i.parseBuildAdvancedSettings)(e.advancedSettings??i.DEFAULT_BUILD_ADVANCED_SETTINGS),p=await (0,a.getPrismaClient)(),m=e.id?await p.buildConfiguration.findUnique({where:{id:e.id}}):null;if(e.id&&(!m||m.projectId!==r.id))throw Error("Build configuration not found");let h=await p.buildSource.upsert({where:{projectId_relativePath:{projectId:r.id,relativePath:n.relativePath}},create:{id:(0,t.randomUUID)(),projectId:r.id,kind:n.kind,relativePath:n.relativePath},update:{kind:n.kind}}),f=m?.id??(0,t.randomUUID)();return p.buildConfiguration.upsert({where:{id:f},create:{id:f,projectId:r.id,sourceId:h.id,name:s,iconKey:u,scheme:o,buildConfiguration:c,defaultAction:e.defaultAction,advancedSettingsJson:JSON.stringify(d)},update:{sourceId:h.id,name:s,iconKey:u,scheme:o,buildConfiguration:c,defaultAction:e.defaultAction,advancedSettingsJson:JSON.stringify(d)},include:{source:!0}})}async deleteConfiguration(e){let t=await (0,a.getPrismaClient)();if(await t.build.findFirst({where:{configurationId:e,status:{in:u}}}))throw Error("Configuration has an active build");return 1===(await t.buildConfiguration.deleteMany({where:{id:e}})).count}async scripts(){return(await (0,a.getPrismaClient)()).buildScript.findMany({where:{deletedAt:null},orderBy:{name:"asc"}})}async saveScript(e){let r=g(e.name,"Script name"),n=e.preBuildScript?.trim()||null,s=e.postBuildScript?.trim()||null;if(!n&&!s)throw Error("A pre-build or post-build script is required");let o=e.timeoutSeconds??300;if(!Number.isInteger(o)||o<1||o>3600)throw Error("Script timeout must be between 1 and 3600 seconds");if(!i.BUILD_SCRIPT_FAILURE_BEHAVIORS.includes(e.failureBehavior))throw Error("Script failure behavior is invalid");let l=await (0,a.getPrismaClient)(),c=e.id??(0,t.randomUUID)();return l.buildScript.upsert({where:{id:c},create:{id:c,name:r,preBuildScript:n,postBuildScript:s,enabledByDefault:e.enabledByDefault,timeoutSeconds:o,failureBehavior:e.failureBehavior},update:{name:r,preBuildScript:n,postBuildScript:s,enabledByDefault:e.enabledByDefault,timeoutSeconds:o,failureBehavior:e.failureBehavior,deletedAt:null}})}async deleteScript(e){let t=await (0,a.getPrismaClient)(),r=await t.buildScript.updateMany({where:{id:e,deletedAt:null},data:{deletedAt:new Date}});return await t.codebaseRepositoryBuildScript.deleteMany({where:{scriptId:e}}),1===r.count}async setAllowedScripts(e,t){let r=await (0,a.getPrismaClient)(),i=await r.codebase.findUnique({where:{id:e}});if(!i)throw Error("Codebase not found");let n=[...new Set(t)];if((await r.buildScript.findMany({where:{id:{in:n},deletedAt:null}})).length!==n.length)throw Error("Build script not found");return await r.$transaction(async e=>{await e.codebaseRepositoryBuildScript.deleteMany({where:{repositoryId:i.repositoryId}}),n.length&&await e.codebaseRepositoryBuildScript.createMany({data:n.map((e,t)=>({repositoryId:i.repositoryId,scriptId:e,position:t}))})}),this.project(e)}async waitForJob(e,t=12e4){let r=s.agentEventBus.iterate((0,s.agentJobChangedTopic)(e)),i=Date.now()+t;try{for(;Date.now()<i;){let t=await this.agentControl.getJob(e);if(!t)throw Error("Agent job disappeared");if(c.has(t.status))return t;await Promise.race([r.next(),new Promise(e=>setTimeout(e,Math.max(1,i-Date.now())))])}throw await this.agentControl.cancelJob(e),Error("Agent did not respond in time")}finally{await r.return?.()}}result(e){if("SUCCEEDED"!==e.status)throw Error(e.error||"Agent operation failed");return p(d(e.resultJson,{}),"agent result")}async discoverSources(e,t){let r=await this.requireWorktree(e,i.IOS_SOURCE_DISCOVER_JOB_KIND),n=await this.agentControl.createJob({agentId:r.codebase.agentId,codebaseId:r.codebaseId,worktreeId:r.id,kind:i.IOS_SOURCE_DISCOVER_JOB_KIND,payload:this.identity(r),idempotencyKey:`ios:source:discover:${t}:${r.id}`,timeoutSeconds:60,visibility:"SYSTEM"});try{let e=this.result(await this.waitForJob(n.id));return Array.isArray(e.sources)?e.sources:[]}finally{let e=await (0,a.getPrismaClient)();await e.agentJob.deleteMany({where:{id:n.id,visibility:"SYSTEM"}})}}async reparse(e,r,n){let s=await this.requireWorktree(r,i.IOS_SOURCE_PARSE_JOB_KIND),o=await (0,a.getPrismaClient)(),l=await o.buildConfiguration.findUnique({where:{id:e},include:{source:{include:{project:!0}}}});if(!l||l.source.project.repositoryId!==s.codebase.repositoryId)throw Error("Build configuration is not available for this worktree");let c=`worktree:${s.id}`,u=await o.buildSourceObservation.findUnique({where:{sourceId_scopeKey:{sourceId:l.sourceId,scopeKey:c}}}),d=new Date;await o.buildSourceObservation.upsert({where:{sourceId_scopeKey:{sourceId:l.sourceId,scopeKey:c}},create:{id:(0,t.randomUUID)(),sourceId:l.sourceId,scopeKey:c,codebaseId:s.codebaseId,worktreeId:s.id,status:"PARSING",lastParseAttemptAt:d},update:{status:"PARSING",error:null,lastParseAttemptAt:d}});let p=await this.agentControl.createJob({agentId:s.codebase.agentId,codebaseId:s.codebaseId,worktreeId:s.id,kind:i.IOS_SOURCE_PARSE_JOB_KIND,payload:{...this.identity(s),source:{kind:l.source.kind,relativePath:l.source.relativePath},scheme:l.scheme},idempotencyKey:`ios:source:parse:${n}:${l.id}:${s.id}`,timeoutSeconds:120,visibility:"SYSTEM"});try{let e=this.result(await this.waitForJob(p.id)),t=m(e.schemes),r=m(e.configurations),i=t.includes(l.scheme)&&r.includes(l.buildConfiguration);return o.buildSourceObservation.update({where:{sourceId_scopeKey:{sourceId:l.sourceId,scopeKey:c}},data:{status:i?"VALID":"INVALID",schemesJson:JSON.stringify(t),configurationsJson:JSON.stringify(r),testPlansJson:JSON.stringify(m(e.testPlans)),error:i?null:"The saved scheme or configuration is no longer available",stale:!1,headSha:"string"==typeof e.headSha?e.headSha:s.headSha,xcodeVersion:"string"==typeof e.xcodeVersion?e.xcodeVersion:null,lastParsedAt:new Date}})}catch(t){let e=t instanceof Error?t.message:String(t);return o.buildSourceObservation.update({where:{sourceId_scopeKey:{sourceId:l.sourceId,scopeKey:c}},data:{status:"ERROR",error:e,stale:!!u?.lastParsedAt}})}finally{await o.agentJob.deleteMany({where:{id:p.id,visibility:"SYSTEM"}})}}async inspectSource(e){let t=await this.requireWorktree(e.worktreeId,i.IOS_SOURCE_PARSE_JOB_KIND),r=(0,i.parseBuildSource)({kind:e.sourceKind,relativePath:e.sourcePath}),n=await this.agentControl.createJob({agentId:t.codebase.agentId,codebaseId:t.codebaseId,worktreeId:t.id,kind:i.IOS_SOURCE_PARSE_JOB_KIND,payload:{...this.identity(t),source:r,scheme:e.scheme?.trim()||null},idempotencyKey:`ios:source:inspect:${e.requestId}:${t.id}:${r.relativePath}:${e.scheme??""}`,timeoutSeconds:120,visibility:"SYSTEM"});try{let e=this.result(await this.waitForJob(n.id));return{source:r,schemes:m(e.schemes),configurations:m(e.configurations),testPlans:m(e.testPlans),headSha:"string"==typeof e.headSha?e.headSha:t.headSha,xcodeVersion:"string"==typeof e.xcodeVersion?e.xcodeVersion:null}}finally{let e=await (0,a.getPrismaClient)();await e.agentJob.deleteMany({where:{id:n.id,visibility:"SYSTEM"}})}}async destinations(e){let t=await this.requireWorktree(e.worktreeId,i.IOS_DESTINATIONS_JOB_KIND),r=await (0,a.getPrismaClient)(),n=await r.buildConfiguration.findUnique({where:{id:e.configurationId},include:{source:{include:{project:!0}}}});if(!n||n.source.project.repositoryId!==t.codebase.repositoryId)throw Error("Build configuration is not available for this worktree");let s=e.action??n.defaultAction;if(!i.BUILD_ACTIONS.includes(s))throw Error("Build action is invalid");let o=function(e){if(!i.GENERIC_BUILD_DESTINATION_ACTIONS.includes(e))return[];let t={type:"PHYSICAL_DEVICE",id:"generic-ios",name:"Any Physical iOS Device",platform:"iOS",osVersion:null,state:null,generic:!0};return"ARCHIVE"===e?[t]:[{type:"SIMULATOR",id:"generic-ios-simulator",name:"Any iOS Simulator",platform:"iOS Simulator",osVersion:null,state:null,generic:!0},t]}(s);if("ARCHIVE"===s)return o;let l=await this.agentControl.createJob({agentId:t.codebase.agentId,codebaseId:t.codebaseId,worktreeId:t.id,kind:i.IOS_DESTINATIONS_JOB_KIND,payload:{...this.identity(t),source:{kind:n.source.kind,relativePath:n.source.relativePath},scheme:n.scheme,configuration:n.buildConfiguration,action:s},idempotencyKey:`ios:destinations:${e.requestId}:${n.id}:${t.id}:${s}`,timeoutSeconds:120,visibility:"SYSTEM"});try{let e=this.result(await this.waitForJob(l.id));return Array.isArray(e.destinations)?e.destinations:[]}finally{await r.agentJob.deleteMany({where:{id:l.id,visibility:"SYSTEM"}})}}async signingOptionsForBuild(e){let t=await (0,a.getPrismaClient)(),r=await t.build.findUnique({where:{id:e},include:{artifacts:!0}}),n=r?.artifacts.find(e=>"ARCHIVE"===e.kind);if(!r||"SUCCEEDED"!==r.status||!r.worktreeId)throw Error("A successful archive build is required");if(!n)throw Error("Build does not contain an archive");let s=await this.requireWorktree(r.worktreeId,i.IOS_SIGNING_INSPECT_JOB_KIND),o=await this.agentControl.createJob({agentId:s.codebase.agentId,codebaseId:s.codebaseId,worktreeId:s.id,kind:i.IOS_SIGNING_INSPECT_JOB_KIND,payload:{buildId:r.id,codebaseId:s.codebaseId,artifactDirectory:r.artifactDirectory,archiveRelativePath:n.relativePath},idempotencyKey:`ios:signing:${r.id}:${n.id}`,timeoutSeconds:120,visibility:"SYSTEM"});try{let e=this.result(await this.waitForJob(o.id));return{teams:Array.isArray(e.teams)?e.teams:[],identities:Array.isArray(e.identities)?e.identities:[],profiles:Array.isArray(e.profiles)?e.profiles:[],bundles:Array.isArray(e.bundles)?e.bundles:[]}}finally{await t.agentJob.deleteMany({where:{id:o.id,visibility:"SYSTEM"}})}}async destinationsForBuild(e,t){let r=await (0,a.getPrismaClient)(),n=await r.build.findUnique({where:{id:e},include:{artifacts:!0}});if(!n||"SUCCEEDED"!==n.status||!n.worktreeId||!n.artifacts.some(e=>"RUNNABLE_APP"===e.kind))throw Error("A successful runnable build is required");let s=await this.requireWorktree(n.worktreeId,i.IOS_RUN_DESTINATIONS_JOB_KIND);if(n.agentId!==s.codebase.agentId||n.codebaseId!==s.codebaseId)throw Error("The build no longer belongs to this worktree checkout");let o=await this.agentControl.createJob({agentId:s.codebase.agentId,codebaseId:s.codebaseId,worktreeId:s.id,kind:i.IOS_RUN_DESTINATIONS_JOB_KIND,payload:{...this.identity(s),destinationType:n.destinationType},idempotencyKey:`ios:build-destinations:${g(t,"Request ID",200)}:${n.id}`,timeoutSeconds:120,visibility:"SYSTEM"});try{let e=this.result(await this.waitForJob(o.id));return(Array.isArray(e.destinations)?e.destinations:[]).map(e=>(0,i.parseBuildDestination)(e)).filter(e=>e.type===n.destinationType&&!e.generic)}finally{await r.agentJob.deleteMany({where:{id:o.id,visibility:"SYSTEM"}})}}async startBuild(e){let n=g(e.requestId,"Request ID",200),s=`${e.worktreeId}:${n}`,l=await (0,a.getPrismaClient)(),c=await l.build.findUnique({where:{requestKey:s},include:w});if(c)return c;let u=await this.requireWorktree(e.worktreeId,i.IOS_BUILD_JOB_KIND);if(e.worktreeCoverage&&!f(u.codebase.agent).includes(i.IOS_COVERAGE_REPORT_JOB_KIND))throw Error("Build agent must be updated for worktree coverage");let m=await l.buildConfiguration.findUnique({where:{id:e.configurationId},include:{source:{include:{project:!0}}}});if(!m||m.source.project.repositoryId!==u.codebase.repositoryId)throw Error("Build configuration is not available for this worktree");let h=await l.buildSourceObservation.findUnique({where:{sourceId_scopeKey:{sourceId:m.sourceId,scopeKey:`worktree:${u.id}`}}}),y=e.action??m.defaultAction;if(!i.BUILD_ACTIONS.includes(y))throw Error("Build action is invalid");let v=(0,i.parseBuildDestination)(e.destination);if(!i.BUILD_DESTINATION_TYPES.includes(v.type))throw Error("Destination is invalid");if("ARCHIVE"===y&&("PHYSICAL_DEVICE"!==v.type||!v.generic))throw Error("Archive builds require the generic physical iOS destination");if(v.generic&&!i.GENERIC_BUILD_DESTINATION_ACTIONS.includes(y))throw Error("This build action requires a concrete destination");let b=p(d(m.advancedSettingsJson,{}),"saved advanced settings"),x=e.advancedSettings?p(e.advancedSettings,"advanced settings override"):{},k=(0,i.parseBuildAdvancedSettings)({...b,...x,buildSettingOverrides:{...p(b.buildSettingOverrides??{},"saved overrides"),...p(x.buildSettingOverrides??{},"run overrides")}});if("TEST_WITHOUT_BUILDING"===y){if(!k.priorBuildForTestingId)throw Error("Test Without Building requires a prior Build for Testing result");let e=await l.build.findUnique({where:{id:k.priorBuildForTestingId},include:{artifacts:{where:{kind:{in:["TEST_PRODUCTS","XCTESTRUN"]}},orderBy:{createdAt:"asc"}}}});if(!e||"SUCCEEDED"!==e.status||"BUILD_FOR_TESTING"!==e.action)throw Error("Test Without Building requires a successful Build for Testing result");if(e.agentId!==u.codebase.agentId||e.worktreeId!==u.id||e.configurationId!==m.id)throw Error("The prior Build for Testing result is not compatible with this agent, worktree, and configuration");if(e.destinationType!==v.type)throw Error("The prior Build for Testing result uses a different destination type");let t=p(d(e.snapshotJson,{}),"prior Build for Testing snapshot"),a=p(t.configuration??{},"prior Build for Testing configuration snapshot"),n=(0,i.parseBuildAdvancedSettings)(a.advancedSettings??{});if(k.testPlan&&n.testPlan&&k.testPlan!==n.testPlan)throw Error("The selected test plan does not match the prior Build for Testing result");let s=k.testPlan??n.testPlan??null,o=e.artifacts.filter(e=>"TEST_PRODUCTS"===e.kind&&e.relativePath.endsWith(".xctestproducts")),c=e.artifacts.filter(e=>"XCTESTRUN"===e.kind&&e.relativePath.endsWith(".xctestrun"));if(o.length>1)throw Error("The prior Build for Testing result contains multiple test-products artifacts");let h=o[0];if(h||1!==c.length||(h=c[0]),!h&&c.length>1&&s&&(h=c.find(e=>p(d(e.metadataJson,{}),"test-run artifact metadata").testPlan===s||e.relativePath.endsWith(`/${s}.xctestrun`)||e.relativePath===`${s}.xctestrun`)),!h&&c.length>1)throw Error("Select a test plan to choose among the captured .xctestrun artifacts");let f=h?.relativePath??"test-products.xctestproducts",g=(0,r.resolve)(e.artifactDirectory),y=(0,r.resolve)(g,f),b=(0,r.relative)(g,y);if(!b||b.startsWith("..")||(0,r.isAbsolute)(b))throw Error("The prior Build for Testing artifact path is invalid");k={...k,testPlan:s,priorTestProductsPath:f.endsWith(".xctestproducts")?y:null,priorXctestrunPath:f.endsWith(".xctestrun")?y:null}}let _=await l.codebaseRepositoryBuildScript.findMany({where:{repositoryId:u.codebase.repositoryId,script:{deletedAt:null}},orderBy:[{position:"asc"},{script:{name:"asc"}}],include:{script:!0}}),$=new Set(e.scriptIds??[]);if([...$].some(e=>!_.some(t=>t.scriptId===e)))throw Error("A selected build script is not allowed for this codebase");let I=_.filter(e=>$.has(e.scriptId)),S=(0,t.randomUUID)(),E=(0,o.effectiveBuildsDirectory)(u.codebase.agent);if(!E)throw Error("The agent builds directory is unavailable");let T=(0,r.join)(E,S),C={kind:m.source.kind,relativePath:m.source.relativePath},R=function(e){var t;let i=e.advancedSettings,a="TEST_WITHOUT_BUILDING"===e.action,n=["xcodebuild",...a?[]:[..."PACKAGE"===e.source.kind?[]:"PROJECT"===e.source.kind?["-project",e.source.relativePath]:["-workspace",e.source.relativePath],"-scheme",e.scheme,"-configuration",e.configuration],"-destination",(t=e.destination).generic?"SIMULATOR"===t.type?"generic/platform=iOS Simulator":"generic/platform=iOS":"SIMULATOR"===t.type?`platform=iOS Simulator,id=${t.id}`:`platform=iOS,id=${t.id}`,"-hideShellScriptEnvironment","-resultBundlePath",(0,r.join)(e.artifactDirectory,"result.xcresult")];for(let e of(!a&&("RESOLVED_ONLY"===i.packageResolution?n.push("-onlyUsePackageVersionsFromResolvedFile"):"SKIP_UPDATES"===i.packageResolution?n.push("-skipPackageUpdates"):"DISABLE_AUTOMATIC"===i.packageResolution&&n.push("-disableAutomaticPackageResolution"),i.disablePackageRepositoryCache&&n.push("-disablePackageRepositoryCache"),"PROJECT_DEFAULT"!==i.signingStyle&&n.push(`CODE_SIGN_STYLE=${"AUTOMATIC"===i.signingStyle?"Automatic":"Manual"}`),i.developmentTeam&&n.push(`DEVELOPMENT_TEAM=${i.developmentTeam}`),i.codeSignIdentity&&n.push(`CODE_SIGN_IDENTITY=${i.codeSignIdentity}`),i.provisioningProfileSpecifier&&n.push(`PROVISIONING_PROFILE_SPECIFIER=${i.provisioningProfileSpecifier}`),i.productBundleIdentifier&&n.push(`PRODUCT_BUNDLE_IDENTIFIER=${i.productBundleIdentifier}`),i.allowProvisioningUpdates&&n.push("-allowProvisioningUpdates"),i.allowProvisioningDeviceRegistration&&n.push("-allowProvisioningDeviceRegistration")),i.testPlan&&n.push("-testPlan",i.testPlan),i.codeCoverage&&n.push("-enableCodeCoverage","YES"),null!==i.parallelTesting&&n.push("-parallel-testing-enabled",i.parallelTesting?"YES":"NO"),null!==i.parallelTestingWorkers&&n.push("-parallel-testing-worker-count",String(i.parallelTestingWorkers)),i.onlyTesting))n.push(`-only-testing:${e}`);for(let e of i.skipTesting)n.push(`-skip-testing:${e}`);if(!a)for(let[e,t]of Object.entries(i.buildSettingOverrides))n.push(`${e}=${t}`);"ARCHIVE"===e.action&&n.push("-archivePath",(0,r.join)(e.artifactDirectory,"archive.xcarchive")),"BUILD_FOR_TESTING"===e.action&&n.push("-testProductsPath",(0,r.join)(e.artifactDirectory,"test-products.xctestproducts")),"TEST_WITHOUT_BUILDING"===e.action&&i.priorTestProductsPath&&n.push("-testProductsPath",i.priorTestProductsPath),"TEST_WITHOUT_BUILDING"===e.action&&!i.priorTestProductsPath&&i.priorXctestrunPath&&n.push("-xctestrun",i.priorXctestrunPath),n.push({BUILD:"build",TEST:"test",ANALYZE:"analyze",ARCHIVE:"archive",BUILD_FOR_TESTING:"build-for-testing",TEST_WITHOUT_BUILDING:"test-without-building"}[e.action]);let s=n.map(e=>/^[A-Za-z0-9_./:=,-]+$/.test(e)?e:JSON.stringify(e)).join(" ");return`cd ${JSON.stringify(e.folder)} && xcrun ${s}`}({folder:u.folder,source:C,scheme:m.scheme,configuration:m.buildConfiguration,destination:v,action:y,advancedSettings:k,artifactDirectory:T}),P=I.map(({script:e,position:t})=>({id:e.id,name:e.name,preBuildScript:e.preBuildScript,postBuildScript:e.postBuildScript,timeoutSeconds:e.timeoutSeconds,failureBehavior:e.failureBehavior,position:t})),A={repository:{id:u.codebase.repository.id,name:u.codebase.repository.name,canonicalOrigin:u.codebase.repository.canonicalOrigin},codebase:{id:u.codebase.id,folder:u.codebase.folder},worktree:{id:u.id,folder:u.folder,branch:u.branch,headSha:u.headSha,codeStateHash:u.codeStateHash,hasStagedChanges:u.hasStagedChanges,hasUnstagedChanges:u.hasUnstagedChanges},agent:{id:u.codebase.agent.id,name:u.codebase.agent.name,hostname:u.codebase.agent.hostname},configuration:{id:m.id,name:m.name,iconKey:m.iconKey,source:C,scheme:m.scheme,buildConfiguration:m.buildConfiguration,action:y,advancedSettings:k,parse:h?{status:h.status,schemes:d(h.schemesJson,[]),configurations:d(h.configurationsJson,[]),testPlans:d(h.testPlansJson,[]),headSha:h.headSha,xcodeVersion:h.xcodeVersion,parsedAt:h.lastParsedAt?.toISOString()??null}:{status:"UNPARSED",schemes:[],configurations:[],testPlans:[],headSha:null,xcodeVersion:null,parsedAt:null}},destination:v,scripts:P,worktreeCoverage:!0===e.worktreeCoverage};await l.build.create({data:{id:S,requestKey:s,requestId:n,agentId:u.codebase.agentId,codebaseId:u.codebaseId,worktreeId:u.id,configurationId:m.id,status:"QUEUED",action:y,destinationType:v.type,destinationJson:JSON.stringify(v),snapshotJson:JSON.stringify(A),commandSummary:R,artifactDirectory:T,scriptExecutions:{create:P.flatMap(e=>[...e.preBuildScript?[{id:(0,t.randomUUID)(),scriptId:e.id,phase:"PRE_BUILD",position:e.position,nameSnapshot:e.name,sourceSnapshot:e.preBuildScript,timeoutSeconds:e.timeoutSeconds,failureBehavior:e.failureBehavior}]:[],...e.postBuildScript?[{id:(0,t.randomUUID)(),scriptId:e.id,phase:"POST_BUILD",position:e.position,nameSnapshot:e.name,sourceSnapshot:e.postBuildScript,timeoutSeconds:e.timeoutSeconds,failureBehavior:e.failureBehavior}]:[]])}}});try{let t=await this.agentControl.createJob({agentId:u.codebase.agentId,codebaseId:u.codebaseId,worktreeId:u.id,kind:i.IOS_BUILD_JOB_KIND,payload:{...this.identity(u),buildId:S,artifactDirectory:T,source:C,scheme:m.scheme,configuration:m.buildConfiguration,action:y,destination:v,advancedSettings:k,scripts:P,worktreeCoverage:!0===e.worktreeCoverage},idempotencyKey:`ios:build:${n}:${u.id}`,timeoutSeconds:604800});await l.build.update({where:{id:S},data:{jobId:t.id}})}catch(e){throw await l.build.update({where:{id:S},data:{status:"FAILED",errorCode:"QUEUE_FAILED",error:e instanceof Error?e.message:String(e),finishedAt:new Date}}),e}return this.publish(S),l.build.findUniqueOrThrow({where:{id:S},include:w})}async rebuildBuild(e,t){let r=await (0,a.getPrismaClient)(),i=await r.build.findUnique({where:{id:e},select:{worktreeId:!0,configurationId:!0,destinationJson:!0,action:!0,snapshotJson:!0}});if(!i)throw Error("Build not found");let n=p(d(i.snapshotJson,{}),"build snapshot"),s=p(n.worktree??{},"build worktree snapshot"),o=p(n.configuration??{},"build configuration snapshot"),l=Array.isArray(n.scripts)?n.scripts:[],c=i.worktreeId??("string"==typeof s.id?s.id:null),u=i.configurationId??("string"==typeof o.id?o.id:null);if(!c||!u)throw Error("The original build settings are unavailable");return this.startBuild({worktreeId:c,configurationId:u,destination:d(i.destinationJson,{}),scriptIds:l.flatMap(e=>{if(!e||"object"!=typeof e||Array.isArray(e))return[];let t=e.id;return"string"==typeof t?[t]:[]}),action:i.action,advancedSettings:o.advancedSettings,requestId:t})}async startWorktreeCoverage(e){let t=await (0,a.getPrismaClient)(),r=await t.worktree.findUnique({where:{id:e.worktreeId},select:{baseBranchOverride:!0,codebase:{select:{defaultBranch:!0}}}});if(!r||!(r.baseBranchOverride??r.codebase.defaultBranch))throw Error("A base branch is required for worktree coverage");let i=p(e.advancedSettings??{},"coverage advanced settings");return this.startBuild({...e,action:"TEST",advancedSettings:{...i,codeCoverage:!0,parseTestResults:!0},worktreeCoverage:!0})}async generateReport(e,r,n){let s=await (0,a.getPrismaClient)(),o=await s.buildReport.findUnique({where:{buildId_kind:{buildId:e,kind:r}},include:{artifact:!0}});if(o?.status==="READY")return o;let l=await s.build.findUnique({where:{id:e},include:{agent:!0,artifacts:!0}});if(!l)throw Error("Build not found");if(u.includes(l.status))throw Error("Wait for the build to finish before generating reports");if(!l.agentId||!l.agent||!h(l.agent))throw Error("Build agent is offline");let c="TEST_RESULTS"===r?i.IOS_TEST_RESULTS_JOB_KIND:i.IOS_COVERAGE_REPORT_JOB_KIND;if(!f(l.agent).includes(c))throw Error("Build agent must be updated to generate reports");if(!l.artifacts.some(e=>"RESULT_BUNDLE"===e.kind))throw Error("The build result bundle is unavailable");if("TEST_RESULTS"===r&&!["TEST","TEST_WITHOUT_BUILDING"].includes(l.action))throw Error("This build did not run tests");let d=await s.buildReport.upsert({where:{buildId_kind:{buildId:e,kind:r}},create:{id:(0,t.randomUUID)(),buildId:e,kind:r,source:"MANUAL",status:"PENDING"},update:{source:"MANUAL",status:"PENDING",error:null,finishedAt:null}});this.publish(e);let p=v(l),m=await this.agentControl.createJob({agentId:l.agentId,codebaseId:p,worktreeId:l.worktreeId,kind:c,payload:{buildId:e,artifactDirectory:l.artifactDirectory,codebaseId:p,reportKind:r,source:"MANUAL"},idempotencyKey:`ios:report:${r}:${g(n,"Request ID",200)}:${e}`,timeoutSeconds:180,visibility:"SYSTEM"});try{return await this.waitForJob(m.id,17e4),s.buildReport.findUniqueOrThrow({where:{id:d.id},include:{artifact:!0}})}finally{await s.agentJob.deleteMany({where:{id:m.id,visibility:"SYSTEM"}})}}async coverageHistory(e){return(await (0,a.getPrismaClient)()).buildReport.findMany({where:{kind:"CODE_COVERAGE",source:"WORKTREE",build:{worktreeId:e}},orderBy:{createdAt:"desc"},take:50,select:{id:!0,buildId:!0,artifactId:!0,kind:!0,source:!0,status:!0,summaryJson:!0,error:!0,createdAt:!0,updatedAt:!0,finishedAt:!0,artifact:!0,build:{select:{id:!0,status:!0,action:!0,destinationType:!0,destinationJson:!0,snapshotJson:!0,createdAt:!0,startedAt:!0,finishedAt:!0,updatedAt:!0,worktree:{select:{headSha:!0,codeStateHash:!0,hasStagedChanges:!0,hasUnstagedChanges:!0,lastCheckedAt:!0,_count:{select:{builds:{where:{status:{in:u}}}}}}},artifacts:{orderBy:{createdAt:"asc"}}}}}})}async reportsForBuild(e){return(await (0,a.getPrismaClient)()).buildReport.findMany({where:{buildId:e},orderBy:{createdAt:"asc"},include:{artifact:!0}})}async reportData(e){let t=await (0,a.getPrismaClient)(),r=await t.buildReport.findUnique({where:{id:e},select:{dataJson:!0}});return r?.dataJson??"{}"}async builds(e={}){let t=await (0,a.getPrismaClient)(),r=Math.max(1,Math.min(e.first??50,200)),i=await t.build.findMany({where:{...e.status?{status:e.status}:{},...e.codebaseId?{codebaseId:e.codebaseId}:{},...e.worktreeId?{worktreeId:e.worktreeId}:{}},orderBy:[{createdAt:"desc"},{id:"desc"}],...e.after?{cursor:{id:e.after},skip:1}:{},take:r+1,include:w});return{items:i.slice(0,r),nextCursor:i.length>r?i[r-1].id:null}}async getBuild(e){return(await (0,a.getPrismaClient)()).build.findUnique({where:{id:e},include:w})}async deleteBuilds(e){let t=[...new Set(e)];if(!t.length)return 0;if(t.length>200)throw Error("At most 200 builds can be deleted at once");let n=await (0,a.getPrismaClient)(),s=await n.build.findMany({where:{id:{in:t}},select:{id:!0,status:!0,artifactDirectory:!0,snapshotJson:!0,agentId:!0,agent:{select:{capabilitiesJson:!0}},codebaseId:!0,worktreeId:!0,deployments:{where:{status:{in:u}},select:{id:!0}},exports:{where:{status:{in:u}},select:{id:!0}}}});if(s.some(e=>u.includes(e.status)))throw Error("Running builds cannot be deleted");if(s.some(e=>e.deployments.length>0||e.exports.length>0))throw Error("Builds with running deployments or exports cannot be deleted");for(let e of s){if(!(0,r.isAbsolute)(e.artifactDirectory)||(0,r.basename)(e.artifactDirectory)!==e.id)throw Error(`Build folder is invalid for ${e.id}`);if(e.agentId){let t=v(e);if(!e.agent||!f(e.agent).includes(i.IOS_BUILD_DELETE_JOB_KIND))throw Error("Build agent must be updated to delete builds");await this.agentControl.createJob({agentId:e.agentId,codebaseId:t,worktreeId:e.worktreeId,kind:i.IOS_BUILD_DELETE_JOB_KIND,payload:{buildId:e.id,artifactDirectory:e.artifactDirectory,codebaseId:t},idempotencyKey:`ios:build:delete:${e.id}`,timeoutSeconds:300,visibility:"SYSTEM"})}}let o=await n.build.deleteMany({where:{id:{in:s.map(e=>e.id)}}});for(let e of s)this.publish(e.id);return o.count}async artifactForInstall(e,t){let r=await (0,a.getPrismaClient)(),i=await r.buildArtifact.findFirst({where:{id:t,buildId:e}});return i?{id:i.id,kind:i.kind,relativePath:i.relativePath,sizeBytes:i.sizeBytes,checksum:i.checksum,createdAt:i.createdAt.toISOString(),metadata:p(d(i.metadataJson,{}),"build artifact metadata")}:null}async prepareArtifactDownload(e,t,r,n=17e4){let s=await (0,a.getPrismaClient)(),o=await s.buildArtifact.findFirst({where:{id:t,buildId:e},include:{build:{include:{agent:!0}}}});if(!o)throw Error("Build artifact not found");let{build:l}=o;if(!l.agentId||!l.agent)throw Error("The build agent is no longer available");if(!h(l.agent))throw Error("Build agent is offline");if(!f(l.agent).includes(i.IOS_ARTIFACT_DOWNLOAD_JOB_KIND))throw Error("Build agent must be updated to download artifacts");let c=v(l),u=await this.agentControl.createJob({agentId:l.agentId,codebaseId:c,worktreeId:l.worktreeId,kind:i.IOS_ARTIFACT_DOWNLOAD_JOB_KIND,payload:{buildId:l.id,artifactDirectory:l.artifactDirectory,artifactRelativePath:o.relativePath,uploadId:r,codebaseId:c},idempotencyKey:`ios:artifact:download:${r}`,timeoutSeconds:Math.ceil(n/1e3)+10,visibility:"SYSTEM"});try{this.result(await this.waitForJob(u.id,n))}finally{await s.agentJob.deleteMany({where:{id:u.id,visibility:"SYSTEM"}})}}async logs(e,t=null,r=1e3){let i=await (0,a.getPrismaClient)(),n=t?await i.buildLogEvent.findFirst({where:{id:t,buildId:e},select:{id:!0,createdAt:!0}}):null;if(t&&!n)throw Error("Build log cursor not found");return i.buildLogEvent.findMany({where:{buildId:e,...n?{OR:[{createdAt:{gt:n.createdAt}},{createdAt:n.createdAt,id:{gt:n.id}}]}:{}},orderBy:[{createdAt:"asc"},{id:"asc"}],take:Math.max(1,Math.min(r,5e3))})}async cancelBuild(e){let t=await (0,a.getPrismaClient)(),r=await t.build.findUnique({where:{id:e}});if(!r)throw Error("Build not found");return u.includes(r.status)&&(r.jobId&&await this.agentControl.cancelJob(r.jobId),await t.build.update({where:{id:e},data:{status:"CANCELLED",finishedAt:new Date,errorCode:"CANCELLED"}}),this.publish(e)),this.getBuild(e)}async reportProgress(e,t){if(!["PREPARING","RUNNING"].includes(t.status))throw Error("Build progress status is invalid");let r=await (0,a.getPrismaClient)(),i=await r.build.findUnique({where:{id:t.buildId}});if(!i||i.agentId!==e)throw Error("Build not found for agent");if(!u.includes(i.status))return i;let n=await r.build.update({where:{id:t.buildId},data:{status:t.status,startedAt:i.startedAt??(t.startedAt?new Date(t.startedAt):new Date),errorCode:t.errorCode??void 0,error:t.error??void 0}});return this.publish(t.buildId),n}async appendLogs(e,r,i){let n=await (0,a.getPrismaClient)(),o=await n.build.findUnique({where:{id:r}});if(!o||o.agentId!==e)throw Error("Build not found for agent");let l=i.slice(0,200).map(e=>({id:(0,t.randomUUID)(),buildId:r,scope:g(e.scope,"Log scope",40),scopeId:g(e.scopeId,"Log scope ID",200),sequence:e.sequence,phase:g(e.phase,"Log phase",80),level:g(e.level,"Log level",20),stream:g(e.stream,"Log stream",20),message:e.message.replace(/(Bearer\s+)[A-Za-z0-9._~+\/-]+=*/gi,"$1[REDACTED]").replace(/([A-Za-z][A-Za-z0-9+.-]*:\/\/)[^\s/@]+@/g,"$1[REDACTED]@").replace(/\b([A-Z0-9_]*(?:TOKEN|SECRET|PASSWORD|PASSWD|API_KEY|PRIVATE_KEY)[A-Z0-9_]*)\s*=\s*[^\s]+/gi,"$1=[REDACTED]").replace(/-----BEGIN [^-]*PRIVATE KEY-----[\s\S]*?-----END [^-]*PRIVATE KEY-----/g,"[REDACTED PRIVATE KEY]").slice(0,64e3),createdAt:new Date(e.createdAt)}));for(let e of l){if(!Number.isInteger(e.sequence)||e.sequence<0)throw Error("Log sequence must be a non-negative integer");if(Number.isNaN(e.createdAt.valueOf()))throw Error("Log date is invalid");await n.buildLogEvent.upsert({where:{scope_scopeId_sequence:{scope:e.scope,scopeId:e.scopeId,sequence:e.sequence}},create:e,update:{}}),s.agentEventBus.publish((0,s.buildLogTopic)(r),{buildLogAdded:e})}return l}async runBuild(e){let r=await (0,a.getPrismaClient)(),n=await r.build.findUnique({where:{id:e.buildId},include:{artifacts:!0,worktree:{include:{codebase:{include:{agent:!0,repository:!0}}}}}});if(!n||"SUCCEEDED"!==n.status||!n.worktree)throw Error("A successful build is required");let s=n.artifacts.find(e=>"RUNNABLE_APP"===e.kind);if(!s)throw Error("Build does not contain a runnable app");let o=g(String(p(d(s.metadataJson,{}),"runnable metadata").bundleIdentifier??""),"Runnable bundle identifier",512),l=e.destinations.map(i.parseBuildDestination);if(!l.length)throw Error("Select at least one destination");if(new Set(l.map(e=>`${e.type}:${e.id}`)).size!==l.length)throw Error("Run destinations must be unique");if(l.some(e=>e.type!==n.destinationType))throw Error("Run destinations must match the build destination type");let c=await this.destinationsForBuild(n.id,`${g(e.requestId,"Request ID",200)}:preflight`),u=l.map(e=>c.find(t=>t.type===e.type&&t.id===e.id));if(u.some(e=>!e))throw Error("A selected run destination is no longer available");l=u;let m=await this.requireWorktree(n.worktree.id,i.IOS_DEPLOY_JOB_KIND),h=(0,t.randomUUID)(),f=[];for(let i of l){let a=await r.buildDeployment.findUnique({where:{buildId_requestId_destinationKey:{buildId:n.id,requestId:e.requestId,destinationKey:y(i)}}});f.push(a??await r.buildDeployment.create({data:{id:(0,t.randomUUID)(),buildId:n.id,batchId:h,requestId:e.requestId,destinationJson:JSON.stringify(i),destinationKey:y(i),commandSummary:"SIMULATOR"===i.type?`open -a Simulator --args -CurrentDeviceUDID ${i.id}; xcrun simctl install/launch ${i.id}`:`xcrun devicectl device install/process launch --device ${i.id}`}}))}let v=await this.agentControl.createJob({agentId:m.codebase.agentId,codebaseId:m.codebaseId,worktreeId:m.id,kind:i.IOS_DEPLOY_JOB_KIND,payload:{...this.identity(m),buildId:n.id,artifactDirectory:n.artifactDirectory,artifactRelativePath:s.relativePath,bundleIdentifier:o,deployments:f.map((e,t)=>({id:e.id,destination:l[t]}))},idempotencyKey:`ios:deploy:${n.id}:${e.requestId}`,timeoutSeconds:3600});return await r.buildDeployment.updateMany({where:{id:{in:f.map(e=>e.id)}},data:{jobId:v.id}}),this.publish(n.id),r.buildDeployment.findMany({where:{id:{in:f.map(e=>e.id)}},orderBy:{createdAt:"asc"}})}async exportArchive(e){let r=await (0,a.getPrismaClient)(),n=await r.buildExport.findUnique({where:{buildId_requestId:{buildId:e.buildId,requestId:e.requestId}}});if(n)return n;let s=await r.build.findUnique({where:{id:e.buildId},include:{artifacts:!0,worktree:!0}});if(!s||"SUCCEEDED"!==s.status||!s.worktree)throw Error("A successful archive build is required");let o=s.artifacts.find(e=>"ARCHIVE"===e.kind);if(!o)throw Error("Build does not contain an archive");let l=(0,i.parseBuildExportSettings)(e.settings),c=await this.requireWorktree(s.worktree.id,i.IOS_EXPORT_JOB_KIND),u=(0,t.randomUUID)(),d=await r.buildExport.create({data:{id:u,buildId:s.id,requestId:e.requestId,settingsSnapshotJson:JSON.stringify(l),commandSummary:`xcrun xcodebuild -exportArchive -archivePath ${JSON.stringify(o.relativePath)} -exportPath exports/${u}`}}),p=await this.agentControl.createJob({agentId:c.codebase.agentId,codebaseId:c.codebaseId,worktreeId:c.id,kind:i.IOS_EXPORT_JOB_KIND,payload:{...this.identity(c),buildId:s.id,exportId:u,artifactDirectory:s.artifactDirectory,archiveRelativePath:o.relativePath,settings:l},idempotencyKey:`ios:export:${s.id}:${e.requestId}`,timeoutSeconds:3600}),m=await r.buildExport.update({where:{id:d.id},data:{jobId:p.id}});return this.publish(s.id),m}async upsertArtifacts(e,r,a){for(let n of(0,i.parseBuildArtifactSnapshots)(a)){let i={kind:n.kind,sizeBytes:n.sizeBytes,checksum:n.checksum,metadataJson:JSON.stringify(n.metadata)};await e.buildArtifact.upsert({where:{buildId_relativePath:{buildId:r,relativePath:n.relativePath}},create:{id:(0,t.randomUUID)(),buildId:r,relativePath:n.relativePath,...i},update:i})}}async upsertReportProjection(e,r,i,a){let n=p(i,"build report");if("TEST_RESULTS"!==n.kind&&"CODE_COVERAGE"!==n.kind)return;let s=n.kind,o=n.artifact&&"object"==typeof n.artifact?p(n.artifact,"build report artifact"):null,l=o&&"string"==typeof o.relativePath?await e.buildArtifact.findUnique({where:{buildId_relativePath:{buildId:r,relativePath:o.relativePath}}}):null,c="READY"===n.status?"READY":"FAILED";await e.buildReport.upsert({where:{buildId_kind:{buildId:r,kind:s}},create:{id:(0,t.randomUUID)(),buildId:r,artifactId:l?.id??null,kind:s,source:a,status:c,summaryJson:JSON.stringify(n.summary&&"object"==typeof n.summary?n.summary:{}),dataJson:JSON.stringify(n.data&&"object"==typeof n.data?n.data:{}),error:"string"==typeof n.error?n.error:null,finishedAt:new Date},update:{artifactId:l?.id??null,source:a,status:c,summaryJson:JSON.stringify(n.summary&&"object"==typeof n.summary?n.summary:{}),dataJson:JSON.stringify(n.data&&"object"==typeof n.data?n.data:{}),error:"string"==typeof n.error?n.error:null,finishedAt:new Date}})}async projectBuildCompletion(e){let r=await (0,a.getPrismaClient)(),i=await r.build.findFirst({where:{jobId:e.id}});if(!i)return;let n=p(d(e.resultJson,{}),"build result"),s="CANCELLED"===i.status?"CANCELLED":b(e.status),o="string"==typeof n.sourceStateHash?n.sourceStateHash:null,l="string"==typeof n.finalStateHash?n.finalStateHash:null,c="string"==typeof n.codeStateObservedAt&&Number.isFinite(Date.parse(n.codeStateObservedAt))?new Date(n.codeStateObservedAt):new Date,u=l?c:new Date,m=i.snapshotJson;if(o){let e=p(d(i.snapshotJson,{}),"build snapshot"),t=p(e.worktree??{},"build worktree snapshot");m=JSON.stringify({...e,worktree:{...t,codeStateHash:o}})}await r.$transaction(async r=>{if(await r.build.update({where:{id:i.id},data:{status:s,errorCode:"string"==typeof n.errorCode?n.errorCode:"TIMED_OUT"===e.status?"TIMEOUT":"FAILED"===s?"XCODEBUILD_FAILED":i.errorCode,error:e.error??("string"==typeof n.error?n.error:i.error),startedAt:i.startedAt??new Date,finishedAt:u,snapshotJson:m}}),i.worktreeId&&l&&await r.worktree.updateMany({where:{id:i.worktreeId,OR:[{lastCheckedAt:null},{lastCheckedAt:{lt:c}}]},data:{codeStateHash:l,lastCheckedAt:c}}),Array.isArray(n.artifacts))for(let e of n.artifacts){let a=p(e,"build artifact");"string"==typeof a.relativePath&&"string"==typeof a.kind&&await r.buildArtifact.upsert({where:{buildId_relativePath:{buildId:i.id,relativePath:a.relativePath}},create:{id:(0,t.randomUUID)(),buildId:i.id,kind:a.kind,relativePath:a.relativePath,sizeBytes:"number"==typeof a.sizeBytes?a.sizeBytes:null,checksum:"string"==typeof a.checksum?a.checksum:null,metadataJson:JSON.stringify(a.metadata&&"object"==typeof a.metadata?a.metadata:{})},update:{}})}if(Array.isArray(n.scriptExecutions))for(let e of n.scriptExecutions){let t=p(e,"script execution");"string"==typeof t.phase&&"number"==typeof t.position&&await r.buildScriptExecution.updateMany({where:{buildId:i.id,phase:t.phase,position:t.position},data:{status:"string"==typeof t.status?t.status:"FAILED",exitCode:"number"==typeof t.exitCode?t.exitCode:null,durationMs:"number"==typeof t.durationMs?t.durationMs:null,causedBuildFailure:!0===t.causedBuildFailure,outputRelativePath:"string"==typeof t.outputRelativePath?t.outputRelativePath:null,error:"string"==typeof t.error?t.error:null}})}if(Array.isArray(n.reports))for(let e of n.reports){let t=e&&"object"==typeof e&&!Array.isArray(e)?e:{};await this.upsertReportProjection(r,i.id,e,"CODE_COVERAGE"===t.kind?"WORKTREE":"AUTOMATIC")}}),this.publish(i.id)}async projectGeneratedReportCompletion(e){let r=p(d(e.payloadJson,{}),"build report payload");if("string"!=typeof r.buildId)return;let i=r.buildId,n=p(d(e.resultJson,{}),"build report result"),s=await (0,a.getPrismaClient)();await s.$transaction(async a=>{if(await this.upsertArtifacts(a,i,n.artifacts),n.report&&"object"==typeof n.report)await this.upsertReportProjection(a,i,n.report,"WORKTREE"===r.source?"WORKTREE":"MANUAL");else{let n="CODE_COVERAGE"===r.reportKind?"CODE_COVERAGE":"TEST_RESULTS";await a.buildReport.upsert({where:{buildId_kind:{buildId:i,kind:n}},create:{id:(0,t.randomUUID)(),buildId:i,kind:n,source:"WORKTREE"===r.source?"WORKTREE":"MANUAL",status:"FAILED",error:e.error||"Report generation failed",finishedAt:new Date},update:{status:"FAILED",error:e.error||"Report generation failed",finishedAt:new Date}})}}),this.publish(i)}async projectDeploymentCompletion(e){let t=await (0,a.getPrismaClient)(),r=await t.buildDeployment.findMany({where:{jobId:e.id}});if(!r.length)return;let i=p(d(e.resultJson,{}),"deployment result"),n=Array.isArray(i.deployments)?i.deployments:[];for(let i of r){let r=n.map(e=>p(e,"deployment outcome")).find(e=>e.id===i.id);await t.buildDeployment.update({where:{id:i.id},data:{status:"string"==typeof r?.status?r.status:b(e.status),error:"string"==typeof r?.error?r.error:e.error,outputRelativePath:"string"==typeof r?.outputRelativePath?r.outputRelativePath:null,startedAt:i.startedAt??new Date,finishedAt:new Date}})}this.publish(r[0].buildId)}async projectExportCompletion(e){let r=await (0,a.getPrismaClient)(),i=await r.buildExport.findFirst({where:{jobId:e.id}});if(!i)return;let n=p(d(e.resultJson,{}),"export result");if(await r.buildExport.update({where:{id:i.id},data:{status:b(e.status),error:e.error??("string"==typeof n.error?n.error:null),outputRelativePath:"string"==typeof n.outputRelativePath?n.outputRelativePath:null,startedAt:i.startedAt??new Date,finishedAt:new Date}}),"SUCCEEDED"===e.status&&"string"==typeof n.outputRelativePath){let e=n.outputRelativePath;await r.$transaction(async r=>{await r.buildArtifact.upsert({where:{buildId_relativePath:{buildId:i.buildId,relativePath:e}},create:{id:(0,t.randomUUID)(),buildId:i.buildId,kind:"EXPORT",relativePath:e,sizeBytes:"number"==typeof n.sizeBytes?n.sizeBytes:null,metadataJson:JSON.stringify({exportId:i.id})},update:{}}),await this.upsertArtifacts(r,i.buildId,n.artifacts)})}this.publish(i.buildId)}}],669602);var x=e.i(907855);let k=x.object({status:x.string().optional(),codebaseId:x.string().optional(),worktreeId:x.string().optional(),first:x.number().int().min(1).max(200).default(50),after:x.string().optional()}),_=x.object({builds:x.array(x.unknown()),nextCursor:x.string().nullable()}),$=x.object({buildId:x.string().min(1),afterLogId:x.string().min(1).nullable().default(null),logLimit:x.number().int().min(1).max(5e3).default(1e3)}),I=x.object({build:x.unknown(),logs:x.array(x.unknown())}),S=x.object({worktreeId:x.string().min(1)}),E=x.object({project:x.unknown().nullable()}),T=x.union([x.object({buildId:x.string().min(1),requestId:x.string().min(1)}),x.object({worktreeId:x.string().min(1),configurationId:x.string().min(1),action:x.string().optional(),requestId:x.string().min(1)})]),C=x.object({destinations:x.array(x.unknown())}),R=x.object({worktreeId:x.string().min(1),configurationId:x.string().min(1),destination:x.record(x.string(),x.unknown()),scriptIds:x.array(x.string()).default([]),action:x.string().optional(),advancedSettings:x.record(x.string(),x.unknown()).optional(),requestId:x.string().min(1)}),P=x.object({build:x.unknown()}),A=x.object({buildId:x.string().min(1),requestId:x.string().min(1)}),D=x.object({build:x.unknown()}),O=x.object({buildId:x.string().min(1),destinations:x.array(x.record(x.string(),x.unknown())).min(1),requestId:x.string().min(1)}),j=x.object({deployments:x.array(x.unknown())}),N=x.object({buildId:x.string().min(1),settings:x.record(x.string(),x.unknown()),requestId:x.string().min(1)}),q=x.object({export:x.unknown()});e.s(["CancelBuildToolInputSchema",0,A,"CancelBuildToolOutputSchema",0,D,"ExportBuildToolInputSchema",0,N,"ExportBuildToolOutputSchema",0,q,"GetBuildConfigurationsInputSchema",0,S,"GetBuildConfigurationsOutputSchema",0,E,"GetBuildDestinationsInputSchema",0,T,"GetBuildDestinationsOutputSchema",0,C,"GetBuildInputSchema",0,$,"GetBuildOutputSchema",0,I,"GetBuildsInputSchema",0,k,"GetBuildsOutputSchema",0,_,"RunBuildToolInputSchema",0,O,"RunBuildToolOutputSchema",0,j,"StartBuildToolInputSchema",0,R,"StartBuildToolOutputSchema",0,P],190714),e.s([],224174)},107058,112627,e=>{"use strict";let t;var r=e.i(666680),i=e.i(243783);function a(e,t,...r){if((r=r.filter(Boolean)).length>2){let t=r.pop();e+=`one of type ${r.join(", ")}, or ${t}.`}else 2===r.length?e+=`one of type ${r[0]} or ${r[1]}.`:e+=`of type ${r[0]}.`;return null==t?e+=` Received ${t}`:"function"==typeof t&&t.name?e+=` Received function ${t.name}`:"object"==typeof t&&null!=t&&t.constructor?.name&&(e+=` Received an instance of ${t.constructor.name}`),e}let n=(e,t,...r)=>a(`Key for the ${e} algorithm must be `,t,...r);function s(e){if(Uint8Array.fromBase64)return Uint8Array.fromBase64(e);let t=atob(e),r=new Uint8Array(t.length);for(let e=0;e<t.length;e++)r[e]=t.charCodeAt(e);return r}class o extends Error{static code="ERR_JOSE_GENERIC";code="ERR_JOSE_GENERIC";constructor(e,t){super(e,t),this.name=this.constructor.name,Error.captureStackTrace?.(this,this.constructor)}}class l extends o{static code="ERR_JOSE_NOT_SUPPORTED";code="ERR_JOSE_NOT_SUPPORTED"}class c extends o{static code="ERR_JWS_INVALID";code="ERR_JWS_INVALID"}class u extends o{static code="ERR_JWT_INVALID";code="ERR_JWT_INVALID"}class d extends o{[Symbol.asyncIterator];static code="ERR_JWKS_MULTIPLE_MATCHING_KEYS";code="ERR_JWKS_MULTIPLE_MATCHING_KEYS";constructor(e="multiple matching keys found in the JSON Web Key Set",t){super(e,t)}}let p=e=>{if(e?.[Symbol.toStringTag]==="CryptoKey")return!0;try{return e instanceof CryptoKey}catch{return!1}},m=e=>e?.[Symbol.toStringTag]==="KeyObject",h=e=>p(e)||m(e),f=(e,t)=>{if(e.byteLength!==t.length)return!1;for(let r=0;r<e.byteLength;r++)if(e[r]!==t[r])return!1;return!0},g=e=>{let t=e.data[e.pos++];if(128&t){let r=127&t,i=0;for(let t=0;t<r;t++)i=i<<8|e.data[e.pos++];return i}return t},y=(e,t,r)=>{if(e.data[e.pos++]!==t)throw Error(r)},v=(e,t)=>{let r=e.data.subarray(e.pos,e.pos+t);return e.pos+=t,r},b=async(e,t,r,i)=>{let a,n,s="spki"===e,o=()=>s?["verify"]:["sign"];switch(r){case"PS256":case"PS384":case"PS512":a={name:"RSA-PSS",hash:`SHA-${r.slice(-3)}`},n=o();break;case"RS256":case"RS384":case"RS512":a={name:"RSASSA-PKCS1-v1_5",hash:`SHA-${r.slice(-3)}`},n=o();break;case"RSA-OAEP":case"RSA-OAEP-256":case"RSA-OAEP-384":case"RSA-OAEP-512":a={name:"RSA-OAEP",hash:`SHA-${parseInt(r.slice(-3),10)||1}`},n=s?["encrypt","wrapKey"]:["decrypt","unwrapKey"];break;case"ES256":case"ES384":case"ES512":a={name:"ECDSA",namedCurve:({ES256:"P-256",ES384:"P-384",ES512:"P-521"})[r]},n=o();break;case"ECDH-ES":case"ECDH-ES+A128KW":case"ECDH-ES+A192KW":case"ECDH-ES+A256KW":try{let e=i.getNamedCurve(t);a="X25519"===e?{name:"X25519"}:{name:"ECDH",namedCurve:e}}catch(e){throw new l("Invalid or unsupported key format")}n=s?[]:["deriveBits"];break;case"Ed25519":case"EdDSA":a={name:"Ed25519"},n=o();break;case"ML-DSA-44":case"ML-DSA-65":case"ML-DSA-87":a={name:r},n=o();break;default:throw new l('Invalid or unsupported "alg" (Algorithm) value')}return crypto.subtle.importKey(e,t,a,i?.extractable??!!s,n)};async function w(e,t,r){let i,a,n;if("string"!=typeof e||0!==e.indexOf("-----BEGIN PRIVATE KEY-----"))throw TypeError('"pkcs8" must be PKCS#8 formatted string');return i=/(?:-----(?:BEGIN|END) PRIVATE KEY-----|\s)/g,a=s(e.replace(i,"")),n=r,t?.startsWith?.("ECDH-ES")&&((n||={}).getNamedCurve=e=>{let t,r={data:e,pos:0};return y(r,48,"Invalid PKCS#8 structure"),g(r),y(r,2,"Expected version field"),t=g(r),r.pos+=t,y(r,48,"Expected algorithm identifier"),g(r),r.pos,(e=>{let t,r=(y(e,6,"Expected algorithm OID"),t=g(e),v(e,t));if(f(r,[43,101,110]))return"X25519";if(!f(r,[42,134,72,206,61,2,1]))throw Error("Unsupported key algorithm");y(e,6,"Expected curve OID");let i=g(e),a=v(e,i);for(let{name:e,oid:t}of[{name:"P-256",oid:[42,134,72,206,61,3,1,7]},{name:"P-384",oid:[43,129,4,0,34]},{name:"P-521",oid:[43,129,4,0,35]}])if(f(a,t))return e;throw Error("Unsupported named curve")})(r)}),b("pkcs8",a,t,n)}let x=new TextEncoder,k=new TextDecoder;function _(e){let t=new Uint8Array(e.length);for(let r=0;r<e.length;r++){let i=e.charCodeAt(r);if(i>127)throw TypeError("non-ASCII string encountered in encode()");t[r]=i}return t}function $(e){let t=e;return("string"==typeof t&&(t=x.encode(t)),Uint8Array.prototype.toBase64)?t.toBase64({alphabet:"base64url",omitPadding:!0}):(function(e){if(Uint8Array.prototype.toBase64)return e.toBase64();let t=[];for(let r=0;r<e.length;r+=32768)t.push(String.fromCharCode.apply(null,e.subarray(r,r+32768)));return btoa(t.join(""))})(t).replace(/=/g,"").replace(/\+/g,"-").replace(/\//g,"_")}let I=(e,t="algorithm.name")=>TypeError(`CryptoKey does not support this operation, its ${t} must be ${e}`);function S(e,t){if(parseInt(e.hash.name.slice(4),10)!==t)throw I(`SHA-${t}`,"algorithm.hash")}async function E(e,t,r){if(t instanceof Uint8Array){if(!e.startsWith("HS"))throw TypeError(((e,...t)=>a("Key must be ",e,...t))(t,"CryptoKey","KeyObject","JSON Web Key"));return crypto.subtle.importKey("raw",t,{hash:`SHA-${e.slice(-3)}`,name:"HMAC"},!1,[r])}return!function(e,t,r){switch(t){case"HS256":case"HS384":case"HS512":if("HMAC"!==e.algorithm.name)throw I("HMAC");S(e.algorithm,parseInt(t.slice(2),10));break;case"RS256":case"RS384":case"RS512":if("RSASSA-PKCS1-v1_5"!==e.algorithm.name)throw I("RSASSA-PKCS1-v1_5");S(e.algorithm,parseInt(t.slice(2),10));break;case"PS256":case"PS384":case"PS512":if("RSA-PSS"!==e.algorithm.name)throw I("RSA-PSS");S(e.algorithm,parseInt(t.slice(2),10));break;case"Ed25519":case"EdDSA":if("Ed25519"!==e.algorithm.name)throw I("Ed25519");break;case"ML-DSA-44":case"ML-DSA-65":case"ML-DSA-87":let i;if(i=e.algorithm,i.name!==t)throw I(t);break;case"ES256":case"ES384":case"ES512":{if("ECDSA"!==e.algorithm.name)throw I("ECDSA");let r=function(e){switch(e){case"ES256":return"P-256";case"ES384":return"P-384";case"ES512":return"P-521";default:throw Error("unreachable")}}(t);if(e.algorithm.namedCurve!==r)throw I(r,"algorithm.namedCurve");break}default:throw TypeError("CryptoKey does not support this operation")}if(r&&!e.usages.includes(r))throw TypeError(`CryptoKey does not support this operation, its usages must include ${r}.`)}(t,e,r),t}async function T(e,t,r){let i=await E(e,t,"sign");return!function(e,t){if(e.startsWith("RS")||e.startsWith("PS")){let{modulusLength:r}=t.algorithm;if("number"!=typeof r||r<2048)throw TypeError(`${e} requires key modulusLength to be 2048 bits or larger`)}}(e,i),new Uint8Array(await crypto.subtle.sign(function(e,t){let r=`SHA-${e.slice(-3)}`;switch(e){case"HS256":case"HS384":case"HS512":return{hash:r,name:"HMAC"};case"PS256":case"PS384":case"PS512":return{hash:r,name:"RSA-PSS",saltLength:parseInt(e.slice(-3),10)>>3};case"RS256":case"RS384":case"RS512":return{hash:r,name:"RSASSA-PKCS1-v1_5"};case"ES256":case"ES384":case"ES512":return{hash:r,name:"ECDSA",namedCurve:t.namedCurve};case"Ed25519":case"EdDSA":return{name:"Ed25519"};case"ML-DSA-44":case"ML-DSA-65":case"ML-DSA-87":return{name:e};default:throw new l(`alg ${e} is not supported either by JOSE or your javascript runtime`)}}(e,i.algorithm),i,r))}function C(e){if("object"!=typeof e||null===e||"[object Object]"!==Object.prototype.toString.call(e))return!1;if(null===Object.getPrototypeOf(e))return!0;let t=e;for(;null!==Object.getPrototypeOf(t);)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t}let R=e=>C(e)&&"string"==typeof e.kty,P=e=>e?.[Symbol.toStringTag],A=(e,t,r)=>{if(void 0!==t.use){let e;switch(r){case"sign":case"verify":e="sig";break;case"encrypt":case"decrypt":e="enc"}if(t.use!==e)throw TypeError(`Invalid key for this operation, its "use" must be "${e}" when present`)}if(void 0!==t.alg&&t.alg!==e)throw TypeError(`Invalid key for this operation, its "alg" must be "${e}" when present`);if(Array.isArray(t.key_ops)){let i;switch(!0){case"sign"===r||"verify"===r:case"dir"===e:case e.includes("CBC-HS"):i=r;break;case e.startsWith("PBES2"):i="deriveBits";break;case/^A\d{3}(?:GCM)?(?:KW)?$/.test(e):i=!e.includes("GCM")&&e.endsWith("KW")?"encrypt"===r?"wrapKey":"unwrapKey":r;break;case"encrypt"===r&&e.startsWith("RSA"):i="wrapKey";break;case"decrypt"===r:i=e.startsWith("RSA")?"unwrapKey":"deriveBits"}if(i&&t.key_ops?.includes?.(i)===!1)throw TypeError(`Invalid key for this operation, its "key_ops" must include "${i}" when present`)}return!0},D='Invalid or unsupported JWK "alg" (Algorithm) Parameter value';async function O(e){if(!e.alg)throw TypeError('"alg" argument is required when "jwk.alg" is not present');let{algorithm:t,keyUsages:r}=function(e){let t,r;switch(e.kty){case"AKP":switch(e.alg){case"ML-DSA-44":case"ML-DSA-65":case"ML-DSA-87":t={name:e.alg},r=e.priv?["sign"]:["verify"];break;default:throw new l(D)}break;case"RSA":switch(e.alg){case"PS256":case"PS384":case"PS512":t={name:"RSA-PSS",hash:`SHA-${e.alg.slice(-3)}`},r=e.d?["sign"]:["verify"];break;case"RS256":case"RS384":case"RS512":t={name:"RSASSA-PKCS1-v1_5",hash:`SHA-${e.alg.slice(-3)}`},r=e.d?["sign"]:["verify"];break;case"RSA-OAEP":case"RSA-OAEP-256":case"RSA-OAEP-384":case"RSA-OAEP-512":t={name:"RSA-OAEP",hash:`SHA-${parseInt(e.alg.slice(-3),10)||1}`},r=e.d?["decrypt","unwrapKey"]:["encrypt","wrapKey"];break;default:throw new l(D)}break;case"EC":switch(e.alg){case"ES256":case"ES384":case"ES512":t={name:"ECDSA",namedCurve:({ES256:"P-256",ES384:"P-384",ES512:"P-521"})[e.alg]},r=e.d?["sign"]:["verify"];break;case"ECDH-ES":case"ECDH-ES+A128KW":case"ECDH-ES+A192KW":case"ECDH-ES+A256KW":t={name:"ECDH",namedCurve:e.crv},r=e.d?["deriveBits"]:[];break;default:throw new l(D)}break;case"OKP":switch(e.alg){case"Ed25519":case"EdDSA":t={name:"Ed25519"},r=e.d?["sign"]:["verify"];break;case"ECDH-ES":case"ECDH-ES+A128KW":case"ECDH-ES+A192KW":case"ECDH-ES+A256KW":t={name:e.crv},r=e.d?["deriveBits"]:[];break;default:throw new l(D)}break;default:throw new l('Invalid or unsupported JWK "kty" (Key Type) Parameter value')}return{algorithm:t,keyUsages:r}}(e),i={...e};return"AKP"!==i.kty&&delete i.alg,delete i.use,crypto.subtle.importKey("jwk",i,t,e.ext??(!e.d&&!e.priv),e.key_ops??r)}let j="given KeyObject instance cannot be used for this algorithm",N=async(e,r,i,a=!1)=>{let n=(t||=new WeakMap).get(e);if(n?.[i])return n[i];let s=await O({...r,alg:i});return a&&Object.freeze(e),n?n[i]=s:t.set(e,{[i]:s}),s};async function q(e,r){if(e instanceof Uint8Array||p(e))return e;if(m(e)){if("secret"===e.type)return e.export();if("toCryptoKey"in e&&"function"==typeof e.toCryptoKey)try{return((e,r)=>{let i,a=(t||=new WeakMap).get(e);if(a?.[r])return a[r];let n="public"===e.type,s=!!n;if("x25519"===e.asymmetricKeyType){switch(r){case"ECDH-ES":case"ECDH-ES+A128KW":case"ECDH-ES+A192KW":case"ECDH-ES+A256KW":break;default:throw TypeError(j)}i=e.toCryptoKey(e.asymmetricKeyType,s,n?[]:["deriveBits"])}if("ed25519"===e.asymmetricKeyType){if("EdDSA"!==r&&"Ed25519"!==r)throw TypeError(j);i=e.toCryptoKey(e.asymmetricKeyType,s,[n?"verify":"sign"])}switch(e.asymmetricKeyType){case"ml-dsa-44":case"ml-dsa-65":case"ml-dsa-87":if(r!==e.asymmetricKeyType.toUpperCase())throw TypeError(j);i=e.toCryptoKey(e.asymmetricKeyType,s,[n?"verify":"sign"])}if("rsa"===e.asymmetricKeyType){let t;switch(r){case"RSA-OAEP":t="SHA-1";break;case"RS256":case"PS256":case"RSA-OAEP-256":t="SHA-256";break;case"RS384":case"PS384":case"RSA-OAEP-384":t="SHA-384";break;case"RS512":case"PS512":case"RSA-OAEP-512":t="SHA-512";break;default:throw TypeError(j)}if(r.startsWith("RSA-OAEP"))return e.toCryptoKey({name:"RSA-OAEP",hash:t},s,n?["encrypt"]:["decrypt"]);i=e.toCryptoKey({name:r.startsWith("PS")?"RSA-PSS":"RSASSA-PKCS1-v1_5",hash:t},s,[n?"verify":"sign"])}if("ec"===e.asymmetricKeyType){let t=new Map([["prime256v1","P-256"],["secp384r1","P-384"],["secp521r1","P-521"]]).get(e.asymmetricKeyDetails?.namedCurve);if(!t)throw TypeError(j);let a={ES256:"P-256",ES384:"P-384",ES512:"P-521"};a[r]&&t===a[r]&&(i=e.toCryptoKey({name:"ECDSA",namedCurve:t},s,[n?"verify":"sign"])),r.startsWith("ECDH-ES")&&(i=e.toCryptoKey({name:"ECDH",namedCurve:t},s,n?[]:["deriveBits"]))}if(!i)throw TypeError(j);return a?a[r]=i:t.set(e,{[r]:i}),i})(e,r)}catch(e){if(e instanceof TypeError)throw e}let i=e.export({format:"jwk"});return N(e,i,r)}if(R(e)){if(e.k){var i=e.k;if(Uint8Array.fromBase64)return Uint8Array.fromBase64("string"==typeof i?i:k.decode(i),{alphabet:"base64url"});let t=i;t instanceof Uint8Array&&(t=k.decode(t)),t=t.replace(/-/g,"+").replace(/_/g,"/");try{return s(t)}catch{throw TypeError("The input to be decoded is not correctly encoded.")}}return N(e,e,r,!0)}throw Error("unreachable")}function U(e,t){if(e)throw TypeError(`${t} can only be called once`)}Symbol();class L{#e;#t;#r;constructor(e){if(!(e instanceof Uint8Array))throw TypeError("payload must be an instance of Uint8Array");this.#e=e}setProtectedHeader(e){return U(this.#t,"setProtectedHeader"),this.#t=e,this}setUnprotectedHeader(e){return U(this.#r,"setUnprotectedHeader"),this.#r=e,this}async sign(e,t){let r,i,a,s;if(!this.#t&&!this.#r)throw new c("either setProtectedHeader or setUnprotectedHeader must be called before #sign()");if(!function(...e){let t,r=e.filter(Boolean);if(0===r.length||1===r.length)return!0;for(let e of r){let r=Object.keys(e);if(!t||0===t.size){t=new Set(r);continue}for(let e of r){if(t.has(e))return!1;t.add(e)}}return!0}(this.#t,this.#r))throw new c("JWS Protected and JWS Unprotected Header Parameter names must be disjoint");let o={...this.#t,...this.#r},u=function(e,t,r,i,a){let n;if(void 0!==a.crit&&i?.crit===void 0)throw new e('"crit" (Critical) Header Parameter MUST be integrity protected');if(!i||void 0===i.crit)return new Set;if(!Array.isArray(i.crit)||0===i.crit.length||i.crit.some(e=>"string"!=typeof e||0===e.length))throw new e('"crit" (Critical) Header Parameter MUST be an array of non-empty strings when present');for(let s of(n=void 0!==r?new Map([...Object.entries(r),...t.entries()]):t,i.crit)){if(!n.has(s))throw new l(`Extension Header Parameter "${s}" is not recognized`);if(void 0===a[s])throw new e(`Extension Header Parameter "${s}" is missing`);if(n.get(s)&&void 0===i[s])throw new e(`Extension Header Parameter "${s}" MUST be integrity protected`)}return new Set(i.crit)}(c,new Map([["b64",!0]]),t?.crit,this.#t,o),d=!0;if(u.has("b64")&&"boolean"!=typeof(d=this.#t.b64))throw new c('The "b64" (base64url-encode payload) Header Parameter must be a boolean');let{alg:p}=o;if("string"!=typeof p||!p)throw new c('JWS "alg" (Algorithm) Header Parameter missing or invalid');var m="sign";switch(p.substring(0,2)){case"A1":case"A2":case"di":case"HS":case"PB":((e,t,r)=>{if(!(t instanceof Uint8Array)){if(R(t)){if("oct"===t.kty&&"string"==typeof t.k&&A(e,t,r))return;throw TypeError('JSON Web Key for symmetric algorithms must have JWK "kty" (Key Type) equal to "oct" and the JWK "k" (Key Value) present')}if(!h(t))throw TypeError(n(e,t,"CryptoKey","KeyObject","JSON Web Key","Uint8Array"));if("secret"!==t.type)throw TypeError(`${P(t)} instances for symmetric algorithms must be of type "secret"`)}})(p,e,m);break;default:((e,t,r)=>{if(R(t))switch(r){case"decrypt":case"sign":if("oct"!==t.kty&&("AKP"===t.kty&&"string"==typeof t.priv||"string"==typeof t.d)&&A(e,t,r))return;throw TypeError("JSON Web Key for this operation must be a private JWK");case"encrypt":case"verify":if("oct"!==t.kty&&void 0===t.d&&void 0===t.priv&&A(e,t,r))return;throw TypeError("JSON Web Key for this operation must be a public JWK")}if(!h(t))throw TypeError(n(e,t,"CryptoKey","KeyObject","JSON Web Key"));if("secret"===t.type)throw TypeError(`${P(t)} instances for asymmetric algorithms must not be of type "secret"`);if("public"===t.type)switch(r){case"sign":throw TypeError(`${P(t)} instances for asymmetric algorithm signing must be of type "private"`);case"decrypt":throw TypeError(`${P(t)} instances for asymmetric algorithm decryption must be of type "private"`)}if("private"===t.type)switch(r){case"verify":throw TypeError(`${P(t)} instances for asymmetric algorithm verifying must be of type "public"`);case"encrypt":throw TypeError(`${P(t)} instances for asymmetric algorithm encryption must be of type "public"`)}})(p,e,m)}d?i=_(r=$(this.#e)):(i=this.#e,r=""),this.#t?s=_(a=$(JSON.stringify(this.#t))):(a="",s=new Uint8Array);let f=function(...e){let t=new Uint8Array(e.reduce((e,{length:t})=>e+t,0)),r=0;for(let i of e)t.set(i,r),r+=i.length;return t}(s,_("."),i),g=await q(e,p),y={signature:$(await T(p,g,f)),payload:r};return this.#r&&(y.header=this.#r),this.#t&&(y.protected=a),y}}class F{#i;constructor(e){this.#i=new L(e)}setProtectedHeader(e){return this.#i.setProtectedHeader(e),this}async sign(e,t){let r=await this.#i.sign(e,t);if(void 0===r.payload)throw TypeError("use the flattened module for creating JWS with b64: false");return`${r.protected}.${r.payload}.${r.signature}`}}let M=e=>Math.floor(e.getTime()/1e3),B=/^(\+|\-)? ?(\d+|\d+\.\d+) ?(seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)(?: (ago|from now))?$/i;function z(e){let t,r=B.exec(e);if(!r||r[4]&&r[1])throw TypeError("Invalid time period format");let i=parseFloat(r[2]);switch(r[3].toLowerCase()){case"sec":case"secs":case"second":case"seconds":case"s":t=Math.round(i);break;case"minute":case"minutes":case"min":case"mins":case"m":t=Math.round(60*i);break;case"hour":case"hours":case"hr":case"hrs":case"h":t=Math.round(3600*i);break;case"day":case"days":case"d":t=Math.round(86400*i);break;case"week":case"weeks":case"w":t=Math.round(604800*i);break;default:t=Math.round(0x1e187e0*i)}return"-"===r[1]||"ago"===r[4]?-t:t}function K(e,t){if(!Number.isFinite(t))throw TypeError(`Invalid ${e} input`);return t}class G{#e;constructor(e){if(!C(e))throw TypeError("JWT Claims Set MUST be an object");this.#e=structuredClone(e)}data(){return x.encode(JSON.stringify(this.#e))}get iss(){return this.#e.iss}set iss(e){this.#e.iss=e}get sub(){return this.#e.sub}set sub(e){this.#e.sub=e}get aud(){return this.#e.aud}set aud(e){this.#e.aud=e}set jti(e){this.#e.jti=e}set nbf(e){"number"==typeof e?this.#e.nbf=K("setNotBefore",e):e instanceof Date?this.#e.nbf=K("setNotBefore",M(e)):this.#e.nbf=M(new Date)+z(e)}set exp(e){"number"==typeof e?this.#e.exp=K("setExpirationTime",e):e instanceof Date?this.#e.exp=K("setExpirationTime",M(e)):this.#e.exp=M(new Date)+z(e)}set iat(e){void 0===e?this.#e.iat=M(new Date):e instanceof Date?this.#e.iat=K("setIssuedAt",M(e)):"string"==typeof e?this.#e.iat=K("setIssuedAt",M(new Date)+z(e)):this.#e.iat=K("setIssuedAt",e)}}class H{#t;#a;constructor(e={}){this.#a=new G(e)}setIssuer(e){return this.#a.iss=e,this}setSubject(e){return this.#a.sub=e,this}setAudience(e){return this.#a.aud=e,this}setJti(e){return this.#a.jti=e,this}setNotBefore(e){return this.#a.nbf=e,this}setExpirationTime(e){return this.#a.exp=e,this}setIssuedAt(e){return this.#a.iat=e,this}setProtectedHeader(e){return this.#t=e,this}async sign(e,t){let r=new F(this.#a.data());if(r.setProtectedHeader(this.#t),Array.isArray(this.#t?.crit)&&this.#t.crit.includes("b64")&&!1===this.#t.b64)throw new u("JWTs MUST NOT use unencoded payload");return r.sign(e,t)}}class Z extends Error{code;githubRequestId;constructor(e,t,r=null){super(t),this.code=e,this.githubRequestId=r,this.name="GitHubAppError"}}let V=new Map,J=new Map;function W(e,t,r){let i=e.trim();if(!/^[1-9]\d*$/.test(i))throw new Z(r,`${t} must be a positive integer`);return i}function Q(e){let{privateKeyPkcs8:t,keyFingerprint:i}=function(e){try{let t=(0,r.createPrivateKey)({key:e.trim(),format:"pem"});if("rsa"!==t.asymmetricKeyType)throw Error("The key is not RSA");let i=t.export({format:"pem",type:"pkcs8"}).toString(),a=(0,r.createPublicKey)(t).export({format:"der",type:"spki"}),n=`SHA256:${(0,r.createHash)("sha256").update(a).digest("base64url")}`;return{key:t,privateKeyPkcs8:i,keyFingerprint:n}}catch{throw new Z("INVALID_PRIVATE_KEY","The GitHub App private key is not a valid RSA PEM")}}(e.privateKey);return{...e,appId:W(e.appId,"GitHub App ID","INVALID_APP_ID"),installationId:W(e.installationId,"GitHub installation ID","INVALID_INSTALLATION_ID"),privateKeyPkcs8:t,keyFingerprint:i}}async function Y(e){try{let t=await w(e.privateKeyPkcs8,"RS256"),r=Math.floor(Date.now()/1e3);return await new H({}).setProtectedHeader({alg:"RS256",typ:"JWT"}).setIssuer(e.appId).setIssuedAt(r-60).setExpirationTime(r+540).sign(t)}catch{throw new Z("INVALID_PRIVATE_KEY","The GitHub App private key could not sign an App JWT")}}function X(e){return`${e.appId}:${e.installationId}:${e.keyFingerprint}`}function ee(e){return{accept:"application/vnd.github+json",authorization:e,"user-agent":"ai-development-environment","x-github-api-version":"2022-11-28"}}async function et(e,t){try{return await fetch(e,{...t,cache:"no-store"})}catch{throw new Z("GITHUB_APP_REQUEST_FAILED","GitHub could not be reached")}}async function er(e){try{return await e.json()}catch{return null}}function ei(e){return e.headers.get("x-github-request-id")}function ea(e,t,r=[]){let i=`GitHub returned HTTP ${t}`;for(let t of(e&&"object"==typeof e&&"message"in e&&"string"==typeof e.message&&(i=e.message),r))t&&(i=i.split(t).join("[REDACTED]"));return i}async function en(e,t){let r=await et(`${e.apiBaseUrl}/app/installations/${e.installationId}`,{headers:ee(`Bearer ${t}`)}),i=await er(r),a=ei(r);if(401===r.status)throw new Z("GITHUB_APP_UNAUTHORIZED","GitHub rejected the App ID or private key",a);if(404===r.status)throw new Z("INSTALLATION_NOT_FOUND","The GitHub App installation was not found",a);if(!r.ok||!i||"object"!=typeof i)throw new Z("GITHUB_APP_REQUEST_FAILED",ea(i,r.status,[t,e.privateKey,e.privateKeyPkcs8]),a);if(String(i.app_id)!==e.appId)throw new Z("APP_INSTALLATION_MISMATCH","The installation does not belong to the configured GitHub App",a);return i}async function es(e,t){let r=t??await Y(e),i=await et(`${e.apiBaseUrl}/app/installations/${e.installationId}/access_tokens`,{method:"POST",headers:ee(`Bearer ${r}`)}),a=await er(i),n=ei(i);if(401===i.status)throw new Z("GITHUB_APP_UNAUTHORIZED","GitHub rejected the App ID or private key",n);if(404===i.status)throw new Z("INSTALLATION_NOT_FOUND","The GitHub App installation was not found",n);if(!i.ok||!a||"object"!=typeof a)throw new Z("GITHUB_APP_REQUEST_FAILED",ea(a,i.status,[r,e.privateKey,e.privateKeyPkcs8]),n);if("string"!=typeof a.token||!a.token||"string"!=typeof a.expires_at||Number.isNaN(Date.parse(a.expires_at)))throw new Z("GITHUB_APP_REQUEST_FAILED","GitHub returned an invalid installation token response",n);if("write"!==(a.permissions?.actions??"none"))throw new Z("ACTIONS_PERMISSION_REQUIRED","The GitHub App installation must grant Actions: read and write",n);return{token:a.token,expiresAt:new Date(a.expires_at),permissions:a.permissions??{},repositorySelection:a.repository_selection??"selected"}}async function eo(e){let t=X(e),r=V.get(t);if(r&&r.expiresAt.getTime()-3e5>Date.now())return r;let i=J.get(t);if(i)return i;let a=es(e).then(e=>(V.set(t,e),e)).finally(()=>J.delete(t));return J.set(t,a),a}function el(){V.clear(),J.clear()}async function ec(e,t){let r=Q(e),i=await eo(r),a=await t(i.token);return 401===a.status&&(V.delete(X(r)),i=await eo(r),a=await t(i.token)),{response:a,token:i.token}}async function eu(e,t,r){let{response:i,token:a}=await ec(e,i=>et(e.graphqlUrl,{method:"POST",headers:{...ee(`Bearer ${i}`),"content-type":"application/json"},body:JSON.stringify({query:t,variables:r})})),n=await er(i),s=ei(i);if(401===i.status)throw new Z("GITHUB_APP_UNAUTHORIZED","GitHub rejected the installation access token",s);if(!i.ok||n?.errors?.length||!n?.data){let t=n?.errors?.map(e=>e.message).filter(Boolean).join("; ")||ea(n,i.status,[a]);throw new Z("GITHUB_APP_REQUEST_FAILED",ea({message:t},i.status,[a,e.privateKey]),s)}return{data:n.data,githubRequestId:s}}async function ed(e){let t=Q(e),r=await Y(t),i=await en(t,r),a=await es(t,r);V.set(X(t),a);let n=await eu(t,"query VerifyGitHubApp { viewer { login } }",{});return{appId:t.appId,installationId:t.installationId,keyFingerprint:t.keyFingerprint,appSlug:i.app_slug,accountLogin:i.account.login,repositorySelection:a.repositorySelection,actionsPermission:a.permissions.actions??"none",viewerLogin:n.data.viewer.login,verifiedAt:new Date,githubRequestId:n.githubRequestId}}async function ep(e,t){let r=`${e.apiBaseUrl}/repos/${encodeURIComponent(t.owner)}/${encodeURIComponent(t.repository)}/actions/runs/${encodeURIComponent(t.workflowRunId)}/rerun`,{response:i,token:a}=await ec(e,e=>et(r,{method:"POST",headers:ee(`Bearer ${e}`)})),n=ei(i);if(401===i.status)throw new Z("GITHUB_APP_UNAUTHORIZED","GitHub rejected the installation access token",n);if(!i.ok){let t=await er(i);throw new Z(404===i.status?"REPOSITORY_NOT_INSTALLED":"GITHUB_APP_REQUEST_FAILED",404===i.status?"The repository or workflow run is not available to this installation":ea(t,i.status,[a,e.privateKey]),n)}return{githubRequestId:n}}async function em(e,t){let r=[],i=1,a=0;do{let n=`${e.apiBaseUrl}/repos/${encodeURIComponent(t.owner)}/${encodeURIComponent(t.repository)}/actions/runs/${encodeURIComponent(t.workflowRunId)}/jobs?filter=latest&per_page=100&page=${i}`,{response:s,token:o}=await ec(e,e=>et(n,{headers:ee(`Bearer ${e}`)})),l=ei(s);if(401===s.status)throw new Z("GITHUB_APP_UNAUTHORIZED","GitHub rejected the installation access token",l);let c=await er(s);if(!s.ok||!c||"object"!=typeof c)throw new Z("GITHUB_APP_REQUEST_FAILED",ea(c,s.status,[o,e.privateKey]),l);if(!Number.isInteger(c.total_count)||!Array.isArray(c.jobs))throw new Z("GITHUB_APP_REQUEST_FAILED","GitHub returned an invalid workflow jobs response",l);a=c.total_count??0,r.push(...c.jobs),i+=1}while(r.length<a)return r}async function eh(e,t){let r=`${e.apiBaseUrl}/repos/${encodeURIComponent(t.owner)}/${encodeURIComponent(t.repository)}`,i=`${r}/actions/jobs/${encodeURIComponent(t.jobId)}`,a=await ec(e,e=>et(i,{headers:ee(`Bearer ${e}`)})),n=ei(a.response);if(401===a.response.status)throw new Z("GITHUB_APP_UNAUTHORIZED","GitHub rejected the installation access token",n);let s=await er(a.response);if(!a.response.ok||!s||"object"!=typeof s)throw new Z(404===a.response.status?"ACTIONS_JOB_NOT_FOUND":"GITHUB_APP_REQUEST_FAILED",404===a.response.status?"The GitHub Actions job is not available to this installation":ea(s,a.response.status,[a.token,e.privateKey]),n);if(String(s.run_id??"")!==t.workflowRunId)throw new Z("ACTIONS_JOB_RUN_MISMATCH","The GitHub Actions job does not belong to the selected workflow run",n);if(s.status?.toLowerCase()!=="completed")throw new Z("ACTIONS_JOB_NOT_COMPLETED","The GitHub Actions job must be completed before it can be retried",n);let o=await ec(e,e=>et(`${i}/rerun`,{method:"POST",headers:ee(`Bearer ${e}`)})),l=ei(o.response);if(401===o.response.status)throw new Z("GITHUB_APP_UNAUTHORIZED","GitHub rejected the installation access token",l);if(!o.response.ok){let t=await er(o.response);throw new Z(404===o.response.status?"ACTIONS_JOB_NOT_FOUND":"GITHUB_APP_REQUEST_FAILED",404===o.response.status?"The GitHub Actions job is not available to this installation":ea(t,o.response.status,[o.token,e.privateKey]),l)}return{githubRequestId:l}}let ef="default",eg="default",ey="https://api.github.com",ev="https://api.github.com/graphql",eb=String.raw`\b([A-Z][A-Z0-9_]*-\d+)\b`,ew=`
57
57
  __typename
58
58
  ... on CheckRun {
59
59
  id