@ai-development-environment/server 0.0.28 → 0.0.30

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 (402) hide show
  1. package/package.json +1 -1
  2. package/prisma-runtime/prisma/migrations/20260718220000_add_build_freshness/migration.sql +1 -0
  3. package/prisma-runtime/prisma/migrations/20260719010000_add_build_reports/migration.sql +29 -0
  4. package/prisma-runtime/prisma/schema.prisma +24 -0
  5. package/standalone/.next/BUILD_ID +1 -1
  6. package/standalone/.next/app-path-routes-manifest.json +2 -0
  7. package/standalone/.next/build-manifest.json +6 -6
  8. package/standalone/.next/prerender-manifest.json +3 -3
  9. package/standalone/.next/routes-manifest.json +17 -0
  10. package/standalone/.next/server/app/[locale]/actions/page/build-manifest.json +3 -3
  11. package/standalone/.next/server/app/[locale]/actions/page.js.nft.json +1 -1
  12. package/standalone/.next/server/app/[locale]/actions/page_client-reference-manifest.js +1 -1
  13. package/standalone/.next/server/app/[locale]/agents/[id]/page/build-manifest.json +3 -3
  14. package/standalone/.next/server/app/[locale]/agents/[id]/page.js.nft.json +1 -1
  15. package/standalone/.next/server/app/[locale]/agents/[id]/page_client-reference-manifest.js +1 -1
  16. package/standalone/.next/server/app/[locale]/agents/page/build-manifest.json +3 -3
  17. package/standalone/.next/server/app/[locale]/agents/page.js.nft.json +1 -1
  18. package/standalone/.next/server/app/[locale]/agents/page_client-reference-manifest.js +1 -1
  19. package/standalone/.next/server/app/[locale]/build-data/page/build-manifest.json +3 -3
  20. package/standalone/.next/server/app/[locale]/build-data/page.js.nft.json +1 -1
  21. package/standalone/.next/server/app/[locale]/build-data/page_client-reference-manifest.js +1 -1
  22. package/standalone/.next/server/app/[locale]/builds/[buildId]/coverage/page/app-paths-manifest.json +3 -0
  23. package/standalone/.next/server/app/[locale]/builds/[buildId]/coverage/page/build-manifest.json +16 -0
  24. package/standalone/.next/server/app/[locale]/builds/[buildId]/coverage/page/next-font-manifest.json +11 -0
  25. package/standalone/.next/server/app/[locale]/builds/[buildId]/coverage/page/react-loadable-manifest.json +1 -0
  26. package/standalone/.next/server/app/[locale]/builds/[buildId]/coverage/page/server-reference-manifest.json +4 -0
  27. package/standalone/.next/server/app/[locale]/builds/[buildId]/coverage/page.js +16 -0
  28. package/standalone/.next/server/app/[locale]/builds/[buildId]/coverage/page.js.map +5 -0
  29. package/standalone/.next/server/app/[locale]/builds/[buildId]/coverage/page.js.nft.json +1 -0
  30. package/standalone/.next/server/app/[locale]/builds/[buildId]/coverage/page_client-reference-manifest.js +3 -0
  31. package/standalone/.next/server/app/[locale]/builds/[buildId]/page/build-manifest.json +3 -3
  32. package/standalone/.next/server/app/[locale]/builds/[buildId]/page.js.nft.json +1 -1
  33. package/standalone/.next/server/app/[locale]/builds/[buildId]/page_client-reference-manifest.js +1 -1
  34. package/standalone/.next/server/app/[locale]/builds/page/build-manifest.json +3 -3
  35. package/standalone/.next/server/app/[locale]/builds/page.js.nft.json +1 -1
  36. package/standalone/.next/server/app/[locale]/builds/page_client-reference-manifest.js +1 -1
  37. package/standalone/.next/server/app/[locale]/codebases/[codebaseId]/page/build-manifest.json +3 -3
  38. package/standalone/.next/server/app/[locale]/codebases/[codebaseId]/page.js.nft.json +1 -1
  39. package/standalone/.next/server/app/[locale]/codebases/[codebaseId]/page_client-reference-manifest.js +1 -1
  40. package/standalone/.next/server/app/[locale]/codebases/page/build-manifest.json +3 -3
  41. package/standalone/.next/server/app/[locale]/codebases/page.js.nft.json +1 -1
  42. package/standalone/.next/server/app/[locale]/codebases/page_client-reference-manifest.js +1 -1
  43. package/standalone/.next/server/app/[locale]/codebases/repositories/[repositoryId]/page/build-manifest.json +3 -3
  44. package/standalone/.next/server/app/[locale]/codebases/repositories/[repositoryId]/page.js.nft.json +1 -1
  45. package/standalone/.next/server/app/[locale]/codebases/repositories/[repositoryId]/page_client-reference-manifest.js +1 -1
  46. package/standalone/.next/server/app/[locale]/comments/page/build-manifest.json +3 -3
  47. package/standalone/.next/server/app/[locale]/comments/page.js.nft.json +1 -1
  48. package/standalone/.next/server/app/[locale]/comments/page_client-reference-manifest.js +1 -1
  49. package/standalone/.next/server/app/[locale]/jira/cache/page/build-manifest.json +3 -3
  50. package/standalone/.next/server/app/[locale]/jira/cache/page.js.nft.json +1 -1
  51. package/standalone/.next/server/app/[locale]/jira/cache/page_client-reference-manifest.js +1 -1
  52. package/standalone/.next/server/app/[locale]/jira/cache/tickets/[issueKey]/page/build-manifest.json +3 -3
  53. package/standalone/.next/server/app/[locale]/jira/cache/tickets/[issueKey]/page.js.nft.json +1 -1
  54. package/standalone/.next/server/app/[locale]/jira/cache/tickets/[issueKey]/page_client-reference-manifest.js +1 -1
  55. package/standalone/.next/server/app/[locale]/jira/tickets/[issueKey]/page/build-manifest.json +3 -3
  56. package/standalone/.next/server/app/[locale]/jira/tickets/[issueKey]/page.js.nft.json +1 -1
  57. package/standalone/.next/server/app/[locale]/jira/tickets/[issueKey]/page_client-reference-manifest.js +1 -1
  58. package/standalone/.next/server/app/[locale]/jira/tickets/page/build-manifest.json +3 -3
  59. package/standalone/.next/server/app/[locale]/jira/tickets/page.js.nft.json +1 -1
  60. package/standalone/.next/server/app/[locale]/jira/tickets/page_client-reference-manifest.js +1 -1
  61. package/standalone/.next/server/app/[locale]/jobs/[jobId]/page/build-manifest.json +3 -3
  62. package/standalone/.next/server/app/[locale]/jobs/[jobId]/page.js.nft.json +1 -1
  63. package/standalone/.next/server/app/[locale]/jobs/[jobId]/page_client-reference-manifest.js +1 -1
  64. package/standalone/.next/server/app/[locale]/page/build-manifest.json +3 -3
  65. package/standalone/.next/server/app/[locale]/page.js.nft.json +1 -1
  66. package/standalone/.next/server/app/[locale]/page_client-reference-manifest.js +1 -1
  67. package/standalone/.next/server/app/[locale]/pull-requests/[owner]/[repository]/[number]/page/build-manifest.json +3 -3
  68. package/standalone/.next/server/app/[locale]/pull-requests/[owner]/[repository]/[number]/page.js.nft.json +1 -1
  69. package/standalone/.next/server/app/[locale]/pull-requests/[owner]/[repository]/[number]/page_client-reference-manifest.js +1 -1
  70. package/standalone/.next/server/app/[locale]/pull-requests/page/build-manifest.json +3 -3
  71. package/standalone/.next/server/app/[locale]/pull-requests/page.js.nft.json +1 -1
  72. package/standalone/.next/server/app/[locale]/pull-requests/page_client-reference-manifest.js +1 -1
  73. package/standalone/.next/server/app/[locale]/settings/page/build-manifest.json +3 -3
  74. package/standalone/.next/server/app/[locale]/settings/page.js.nft.json +1 -1
  75. package/standalone/.next/server/app/[locale]/settings/page_client-reference-manifest.js +1 -1
  76. package/standalone/.next/server/app/[locale]/skills/[skillId]/page/build-manifest.json +3 -3
  77. package/standalone/.next/server/app/[locale]/skills/[skillId]/page.js.nft.json +1 -1
  78. package/standalone/.next/server/app/[locale]/skills/[skillId]/page_client-reference-manifest.js +1 -1
  79. package/standalone/.next/server/app/[locale]/skills/groups/[groupId]/page/build-manifest.json +3 -3
  80. package/standalone/.next/server/app/[locale]/skills/groups/[groupId]/page.js.nft.json +1 -1
  81. package/standalone/.next/server/app/[locale]/skills/groups/[groupId]/page_client-reference-manifest.js +1 -1
  82. package/standalone/.next/server/app/[locale]/skills/groups/page/build-manifest.json +3 -3
  83. package/standalone/.next/server/app/[locale]/skills/groups/page.js.nft.json +1 -1
  84. package/standalone/.next/server/app/[locale]/skills/groups/page_client-reference-manifest.js +1 -1
  85. package/standalone/.next/server/app/[locale]/skills/page/build-manifest.json +3 -3
  86. package/standalone/.next/server/app/[locale]/skills/page.js.nft.json +1 -1
  87. package/standalone/.next/server/app/[locale]/skills/page_client-reference-manifest.js +1 -1
  88. package/standalone/.next/server/app/[locale]/skills/sync/[runId]/page/build-manifest.json +3 -3
  89. package/standalone/.next/server/app/[locale]/skills/sync/[runId]/page.js.nft.json +1 -1
  90. package/standalone/.next/server/app/[locale]/skills/sync/[runId]/page_client-reference-manifest.js +1 -1
  91. package/standalone/.next/server/app/[locale]/tools/page/build-manifest.json +3 -3
  92. package/standalone/.next/server/app/[locale]/tools/page.js.nft.json +1 -1
  93. package/standalone/.next/server/app/[locale]/tools/page_client-reference-manifest.js +1 -1
  94. package/standalone/.next/server/app/[locale]/usage/page/build-manifest.json +3 -3
  95. package/standalone/.next/server/app/[locale]/usage/page.js.nft.json +1 -1
  96. package/standalone/.next/server/app/[locale]/usage/page_client-reference-manifest.js +1 -1
  97. package/standalone/.next/server/app/[locale]/worktrees/[worktreeId]/page/build-manifest.json +3 -3
  98. package/standalone/.next/server/app/[locale]/worktrees/[worktreeId]/page.js.nft.json +1 -1
  99. package/standalone/.next/server/app/[locale]/worktrees/[worktreeId]/page_client-reference-manifest.js +1 -1
  100. package/standalone/.next/server/app/[locale]/worktrees/page/build-manifest.json +3 -3
  101. package/standalone/.next/server/app/[locale]/worktrees/page.js.nft.json +1 -1
  102. package/standalone/.next/server/app/[locale]/worktrees/page_client-reference-manifest.js +1 -1
  103. package/standalone/.next/server/app/_global-error/page/build-manifest.json +3 -3
  104. package/standalone/.next/server/app/_global-error.html +1 -1
  105. package/standalone/.next/server/app/_global-error.rsc +1 -1
  106. package/standalone/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  107. package/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  108. package/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  109. package/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  110. package/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  111. package/standalone/.next/server/app/_not-found/page/build-manifest.json +3 -3
  112. package/standalone/.next/server/app/_not-found.html +1 -1
  113. package/standalone/.next/server/app/_not-found.rsc +1 -1
  114. package/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  115. package/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  116. package/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  117. package/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  118. package/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  119. package/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  120. package/standalone/.next/server/app/api/build-artifact-uploads/[uploadId]/route.js +2 -2
  121. package/standalone/.next/server/app/api/build-artifact-uploads/[uploadId]/route.js.nft.json +1 -1
  122. package/standalone/.next/server/app/api/builds/[buildId]/artifacts/[artifactId]/route.js +2 -2
  123. package/standalone/.next/server/app/api/builds/[buildId]/artifacts/[artifactId]/route.js.nft.json +1 -1
  124. package/standalone/.next/server/app/api/codebases/by-path/route.js +2 -2
  125. package/standalone/.next/server/app/api/codebases/by-path/route.js.nft.json +1 -1
  126. package/standalone/.next/server/app/api/codebases/route.js +2 -2
  127. package/standalone/.next/server/app/api/codebases/route.js.nft.json +1 -1
  128. package/standalone/.next/server/app/api/graphql/route.js +2 -2
  129. package/standalone/.next/server/app/api/graphql/route.js.nft.json +1 -1
  130. package/standalone/.next/server/app/api/mcp/route.js +2 -2
  131. package/standalone/.next/server/app/api/mcp/route.js.nft.json +1 -1
  132. package/standalone/.next/server/app/api/tools/call/route.js +2 -2
  133. package/standalone/.next/server/app/api/tools/call/route.js.nft.json +1 -1
  134. package/standalone/.next/server/app/api/tools/catalog/route.js +2 -2
  135. package/standalone/.next/server/app/api/tools/catalog/route.js.nft.json +1 -1
  136. package/standalone/.next/server/app/api/worktrees/[worktreeId]/diff-image/route/app-paths-manifest.json +3 -0
  137. package/standalone/.next/server/app/api/worktrees/[worktreeId]/diff-image/route/build-manifest.json +9 -0
  138. package/standalone/.next/server/app/api/worktrees/[worktreeId]/diff-image/route/server-reference-manifest.json +4 -0
  139. package/standalone/.next/server/app/api/worktrees/[worktreeId]/diff-image/route.js +10 -0
  140. package/standalone/.next/server/app/api/worktrees/[worktreeId]/diff-image/route.js.map +5 -0
  141. package/standalone/.next/server/app/api/worktrees/[worktreeId]/diff-image/route.js.nft.json +1 -0
  142. package/standalone/.next/server/app/api/worktrees/[worktreeId]/diff-image/route_client-reference-manifest.js +3 -0
  143. package/standalone/.next/server/app-paths-manifest.json +2 -0
  144. package/standalone/.next/server/chunks/1oeh_server_app_api_worktrees_[worktreeId]_diff-image_route_actions_0nie5n3.js +3 -0
  145. package/standalone/.next/server/chunks/{[root-of-the-server]__1iv83x0._.js → [root-of-the-server]__0-ypkf7._.js} +1 -1
  146. package/standalone/.next/server/chunks/{[root-of-the-server]__08w_8a-._.js → [root-of-the-server]__00ku6-v._.js} +1 -1
  147. package/standalone/.next/server/chunks/{[root-of-the-server]__0yfvw4a._.js → [root-of-the-server]__0138gz-._.js} +1 -1
  148. package/standalone/.next/server/chunks/{[root-of-the-server]__0r5s0h6._.js → [root-of-the-server]__02vqwey._.js} +2 -2
  149. package/standalone/.next/server/chunks/{[root-of-the-server]__098f8w4._.js → [root-of-the-server]__056cnsc._.js} +1 -1
  150. package/standalone/.next/server/chunks/{[root-of-the-server]__1l6ed2g._.js → [root-of-the-server]__08mfybr._.js} +2 -2
  151. package/standalone/.next/server/chunks/{[root-of-the-server]__0cs2bfc._.js → [root-of-the-server]__08u874i._.js} +1 -1
  152. package/standalone/.next/server/chunks/{[root-of-the-server]__01h2pl1._.js → [root-of-the-server]__09skp6r._.js} +1 -1
  153. package/standalone/.next/server/chunks/{[root-of-the-server]__1mgcft0._.js → [root-of-the-server]__09v6swg._.js} +1 -1
  154. package/standalone/.next/server/chunks/{[root-of-the-server]__0h0mvv8._.js → [root-of-the-server]__0aiyd05._.js} +1 -1
  155. package/standalone/.next/server/chunks/{[root-of-the-server]__14-aq4c._.js → [root-of-the-server]__0cyubup._.js} +1 -1
  156. package/standalone/.next/server/chunks/{[root-of-the-server]__0_l5rqe._.js → [root-of-the-server]__0da1wsf._.js} +1 -1
  157. package/standalone/.next/server/chunks/[root-of-the-server]__0e1fqyr._.js +3 -0
  158. package/standalone/.next/server/chunks/{[root-of-the-server]__1frrx8s._.js → [root-of-the-server]__0f3ptor._.js} +2 -2
  159. package/standalone/.next/server/chunks/{[root-of-the-server]__0k01mi-._.js → [root-of-the-server]__0fih0li._.js} +1 -1
  160. package/standalone/.next/server/chunks/{[root-of-the-server]__02qjyhj._.js → [root-of-the-server]__0g0tnct._.js} +1 -1
  161. package/standalone/.next/server/chunks/{[root-of-the-server]__1ehdq4c._.js → [root-of-the-server]__0gbor-2._.js} +1 -1
  162. package/standalone/.next/server/chunks/{[root-of-the-server]__09lyzw2._.js → [root-of-the-server]__0mj6qcr._.js} +2 -2
  163. package/standalone/.next/server/chunks/{[root-of-the-server]__14uwobw._.js → [root-of-the-server]__0p_h088._.js} +1 -1
  164. package/standalone/.next/server/chunks/[root-of-the-server]__0rwpsai._.js +3 -0
  165. package/standalone/.next/server/chunks/{[root-of-the-server]__0i4bd9d._.js → [root-of-the-server]__0vvjqp5._.js} +1 -1
  166. package/standalone/.next/server/chunks/{[root-of-the-server]__04rx7b9._.js → [root-of-the-server]__0w20bq-._.js} +2 -2
  167. package/standalone/.next/server/chunks/{[root-of-the-server]__0hmrx3m._.js → [root-of-the-server]__0wf0pka._.js} +1 -1
  168. package/standalone/.next/server/chunks/{[root-of-the-server]__0nxj1ky._.js → [root-of-the-server]__0wg2umj._.js} +1 -1
  169. package/standalone/.next/server/chunks/{[root-of-the-server]__17bgip6._.js → [root-of-the-server]__0xa_els._.js} +1 -1
  170. package/standalone/.next/server/chunks/{[root-of-the-server]__0wx4-1l._.js → [root-of-the-server]__0xukz2x._.js} +2 -2
  171. package/standalone/.next/server/chunks/[root-of-the-server]__0zyqmd4._.js +122 -0
  172. package/standalone/.next/server/chunks/[root-of-the-server]__1-z6lg_._.js +3 -0
  173. package/standalone/.next/server/chunks/{[root-of-the-server]__0kxltc8._.js → [root-of-the-server]__15_clsj._.js} +1 -1
  174. package/standalone/.next/server/chunks/{[root-of-the-server]__020ggc3._.js → [root-of-the-server]__15aat79._.js} +1 -1
  175. package/standalone/.next/server/chunks/{[root-of-the-server]__00_-x1w._.js → [root-of-the-server]__15bbm2q._.js} +2 -2
  176. package/standalone/.next/server/chunks/{[root-of-the-server]__09c7zmy._.js → [root-of-the-server]__16l4wed._.js} +1 -1
  177. package/standalone/.next/server/chunks/{[root-of-the-server]__04hrhu3._.js → [root-of-the-server]__19zwwdv._.js} +1 -1
  178. package/standalone/.next/server/chunks/{[root-of-the-server]__0d4_f1e._.js → [root-of-the-server]__1a5_am-._.js} +1 -1
  179. package/standalone/.next/server/chunks/[root-of-the-server]__1ajaiy1._.js +3 -0
  180. package/standalone/.next/server/chunks/[root-of-the-server]__1dtlzq1._.js +3 -0
  181. package/standalone/.next/server/chunks/[root-of-the-server]__1kpqohm._.js +3 -0
  182. package/standalone/.next/server/chunks/[root-of-the-server]__1l7234r._.js +3 -0
  183. package/standalone/.next/server/chunks/{[root-of-the-server]__0c02fce._.js → [root-of-the-server]__1oa-sy6._.js} +2 -2
  184. package/standalone/.next/server/chunks/[root-of-the-server]__1vip3sa._.js +3 -0
  185. package/standalone/.next/server/chunks/[root-of-the-server]__1vxtcsq._.js +3 -0
  186. package/standalone/.next/server/chunks/{[root-of-the-server]__0cryh-d._.js → [root-of-the-server]__1wtng3p._.js} +1 -1
  187. package/standalone/.next/server/chunks/[root-of-the-server]__1wu654b._.js +3 -0
  188. package/standalone/.next/server/chunks/[root-of-the-server]__1x2nph5._.js +3 -0
  189. package/standalone/.next/server/chunks/[root-of-the-server]__1xk-0be._.js +3 -0
  190. package/standalone/.next/server/chunks/[root-of-the-server]__210dhdj._.js +3 -0
  191. package/standalone/.next/server/chunks/_0exkna-._.js +164 -8
  192. package/standalone/.next/server/chunks/{_0bru086._.js → _0jurkow._.js} +26 -26
  193. package/standalone/.next/server/chunks/{_00mzn-u._.js → _0rx5rfm._.js} +27 -27
  194. package/standalone/.next/server/chunks/_0tufgj0._.js +234 -78
  195. package/standalone/.next/server/chunks/_0w2eghf._.js +164 -8
  196. package/standalone/.next/server/chunks/_152rnkf._.js +17 -17
  197. package/standalone/.next/server/chunks/{_1_g2i-t._.js → _16x77b_._.js} +27 -27
  198. package/standalone/.next/server/chunks/_1dbqy8c._.js +17 -17
  199. package/standalone/.next/server/chunks/_1vrixpc._.js +17 -17
  200. package/standalone/.next/server/chunks/_1yfz-9u._.js +17 -17
  201. package/standalone/.next/server/chunks/src_0o4-snj._.js +1 -1
  202. package/standalone/.next/server/chunks/ssr/1oeh_server_app_[locale]_builds_[buildId]_coverage_page_actions_20i_0zd.js +3 -0
  203. package/standalone/.next/server/chunks/ssr/[root-of-the-server]__08bbv6z._.js +9 -0
  204. package/standalone/.next/server/chunks/ssr/[root-of-the-server]__0ckj6wg._.js +13 -0
  205. package/standalone/.next/server/chunks/ssr/[root-of-the-server]__0eit075._.js +3 -0
  206. package/standalone/.next/server/chunks/ssr/[root-of-the-server]__0tsac-e._.js +15 -0
  207. package/standalone/.next/server/chunks/ssr/[root-of-the-server]__0uo4dhz._.js +11 -0
  208. package/standalone/.next/server/chunks/ssr/[root-of-the-server]__10-ftkj._.js +3 -0
  209. package/standalone/.next/server/chunks/ssr/[root-of-the-server]__15v1geo._.js +3 -0
  210. package/standalone/.next/server/chunks/ssr/[root-of-the-server]__1qm_j4s._.js +3 -0
  211. package/standalone/.next/server/chunks/ssr/[root-of-the-server]__1s6_fta._.js +3 -0
  212. package/standalone/.next/server/chunks/ssr/_0-o77zz._.js +3 -0
  213. package/standalone/.next/server/chunks/ssr/_00m30gw._.js +3 -0
  214. package/standalone/.next/server/chunks/ssr/_03961l6._.js +3 -0
  215. package/standalone/.next/server/chunks/ssr/_08q5hnx._.js +35 -0
  216. package/standalone/.next/server/chunks/ssr/_093--4s._.js +3 -0
  217. package/standalone/.next/server/chunks/ssr/{_1kaz2gq._.js → _09lh67h._.js} +2 -2
  218. package/standalone/.next/server/chunks/ssr/_0a1ligo._.js +3 -0
  219. package/standalone/.next/server/chunks/ssr/{_1h3p6oi._.js → _0cw_tqx._.js} +2 -2
  220. package/standalone/.next/server/chunks/ssr/{_0hoc_fd._.js → _0ddgabq._.js} +2 -2
  221. package/standalone/.next/server/chunks/ssr/_0dq-84j._.js +22 -0
  222. package/standalone/.next/server/chunks/ssr/_0dy1ovj._.js +3 -0
  223. package/standalone/.next/server/chunks/ssr/_0ezo890._.js +3 -0
  224. package/standalone/.next/server/chunks/ssr/_0id1774._.js +13 -0
  225. package/standalone/.next/server/chunks/ssr/_0j48up8._.js +1 -1
  226. package/standalone/.next/server/chunks/ssr/_0nhtqty._.js +1 -1
  227. package/standalone/.next/server/chunks/ssr/_0oh246z._.js +3 -0
  228. package/standalone/.next/server/chunks/ssr/{_1r9ohdr._.js → _0q8sy0w._.js} +2 -2
  229. package/standalone/.next/server/chunks/ssr/_0qra30j._.js +3 -0
  230. package/standalone/.next/server/chunks/ssr/_0t2jwg3._.js +109 -0
  231. package/standalone/.next/server/chunks/ssr/{_13jl9nw._.js → _0ufkrvm._.js} +2 -2
  232. package/standalone/.next/server/chunks/ssr/{_0sp1ojg._.js → _0vjihfb._.js} +26 -2
  233. package/standalone/.next/server/chunks/ssr/_0xh-lyy._.js +3 -0
  234. package/standalone/.next/server/chunks/ssr/_1-2qcpf._.js +3 -0
  235. package/standalone/.next/server/chunks/ssr/_15erjna._.js +3 -0
  236. package/standalone/.next/server/chunks/ssr/_17a3xuq._.js +3 -0
  237. package/standalone/.next/server/chunks/ssr/_17p59oz._.js +3 -0
  238. package/standalone/.next/server/chunks/ssr/_1bzibio._.js +109 -0
  239. package/standalone/.next/server/chunks/ssr/_1c2fde9._.js +11 -0
  240. package/standalone/.next/server/chunks/ssr/_1ekznx8._.js +3 -0
  241. package/standalone/.next/server/chunks/ssr/_1k1tyz4._.js +3 -0
  242. package/standalone/.next/server/chunks/ssr/{_1dsdn7w._.js → _1n9rteq._.js} +8 -2
  243. package/standalone/.next/server/chunks/ssr/_1och_zk._.js +3 -0
  244. package/standalone/.next/server/chunks/ssr/_1tpguta._.js +3 -0
  245. package/standalone/.next/server/chunks/ssr/_1v1lo7c._.js +3 -0
  246. package/standalone/.next/server/chunks/ssr/_1vv-dg-._.js +3 -0
  247. package/standalone/.next/server/chunks/ssr/_1zgu74l._.js +1 -1
  248. package/standalone/.next/server/chunks/ssr/messages_de_json_[json]_cjs_1uig1ud._.js +1 -1
  249. package/standalone/.next/server/chunks/ssr/messages_en_json_[json]_cjs_206072-._.js +1 -1
  250. package/standalone/.next/server/chunks/ssr/messages_es_json_[json]_cjs_082yukd._.js +1 -1
  251. package/standalone/.next/server/chunks/ssr/messages_fr_json_[json]_cjs_0j6-w0i._.js +1 -1
  252. package/standalone/.next/server/chunks/ssr/node_modules_next_dist_esm_build_templates_app-page_1uzalot.js +4 -0
  253. package/standalone/.next/server/chunks/ssr/src_components_agents_agent-detail_tsx_0lfa4ui._.js +2 -2
  254. package/standalone/.next/server/chunks/ssr/src_components_builds_build-detail-page_tsx_0q1lvps._.js +15 -13
  255. package/standalone/.next/server/chunks/ssr/src_components_builds_builds-page_tsx_17qzmsl._.js +8 -12
  256. package/standalone/.next/server/chunks/ssr/src_components_builds_coverage-report-page_tsx_1nhwba1._.js +11 -0
  257. package/standalone/.next/server/chunks/ssr/src_components_codebases_repository-detail-page_tsx_20_7wk_._.js +5 -5
  258. package/standalone/.next/server/chunks/ssr/src_components_github_actions-page_tsx_18434xt._.js +5 -5
  259. package/standalone/.next/server/chunks/ssr/src_components_github_pull-requests-page_tsx_1il3ga-._.js +12 -12
  260. package/standalone/.next/server/chunks/ssr/src_components_jira_cache-page_tsx_1znt1yl._.js +1 -1
  261. package/standalone/.next/server/chunks/ssr/src_components_skills_skill-sync-page_tsx_15sidhb._.js +1 -1
  262. package/standalone/.next/server/chunks/ssr/src_components_skills_skills-page_tsx_0o1nlbg._.js +3 -3
  263. package/standalone/.next/server/chunks/ssr/src_components_tools_tools-page_tsx_0k1jqcz._.js +2 -2
  264. package/standalone/.next/server/chunks/ssr/src_components_worktrees_worktree-detail-page_tsx_1oexgu_._.js +21 -4
  265. package/standalone/.next/server/functions-config-manifest.json +3 -0
  266. package/standalone/.next/server/middleware-build-manifest.js +6 -6
  267. package/standalone/.next/server/next-font-manifest.js +1 -1
  268. package/standalone/.next/server/next-font-manifest.json +4 -0
  269. package/standalone/.next/server/pages/404.html +1 -1
  270. package/standalone/.next/server/pages/500.html +1 -1
  271. package/standalone/.next/server/server-reference-manifest.js +1 -1
  272. package/standalone/.next/server/server-reference-manifest.json +1 -1
  273. package/standalone/.next/static/chunks/041g9raf1naqv.js +48 -0
  274. package/standalone/.next/static/chunks/08ujwkhzkokhf.js +1 -0
  275. package/standalone/.next/static/chunks/0a82bgw37ev__.js +33 -0
  276. package/standalone/.next/static/chunks/0cw4z7_m01m5f.js +31 -0
  277. package/standalone/.next/static/chunks/0emxr8tr7kji0.js +33 -0
  278. package/standalone/.next/static/chunks/0h8zu6aywqh1-.js +27 -0
  279. package/standalone/.next/static/chunks/0ng892ycfzv2q.js +1 -0
  280. package/standalone/.next/static/chunks/0tgtji0dbbefa.js +107 -0
  281. package/standalone/.next/static/chunks/15_8kla24ff9f.js +1 -0
  282. package/standalone/.next/static/chunks/16-l4kp9o217d.js +1 -0
  283. package/standalone/.next/static/chunks/1c7ci5ai5qyfo.js +1 -0
  284. package/standalone/.next/static/chunks/1egccqmgk3kbi.js +1 -0
  285. package/standalone/.next/static/chunks/1gwvywh0e6i17.js +3 -0
  286. package/standalone/.next/static/chunks/1hehq94hslvbl.js +7 -0
  287. package/standalone/.next/static/chunks/1k5cw41bd4e5r.js +51 -0
  288. package/standalone/.next/static/chunks/{1rivge68m21sm.js → 1mprxk0uebv70.js} +10 -10
  289. package/standalone/.next/static/chunks/1rus13s58mkxy.js +1 -0
  290. package/standalone/.next/static/chunks/{2fzxwi39odugq.js → 1rwqeg_l_plzt.js} +1 -1
  291. package/standalone/.next/static/chunks/1u_jwc-bo10k3.js +1 -0
  292. package/standalone/.next/static/chunks/1ut0xkaqsykm4.js +7 -0
  293. package/standalone/.next/static/chunks/1w_zvfx_jdyv_.js +29 -0
  294. package/standalone/.next/static/chunks/2-wrd12dmwbo-.js +1 -0
  295. package/standalone/.next/static/chunks/23kut2_l2y2-w.js +9 -0
  296. package/standalone/.next/static/chunks/23xyv764-kx8z.js +38 -0
  297. package/standalone/.next/static/chunks/{1wihkuyju-wa-.js → 25haryfoj4x3h.js} +1 -1
  298. package/standalone/.next/static/chunks/{0fr0zp4cwlyrr.js → 28ljy-uz6n_g9.js} +2 -2
  299. package/standalone/.next/static/chunks/29zl8lgsa28tb.js +1 -0
  300. package/standalone/.next/static/chunks/{0w8rd_g6hnvmz.js → 2__bi79el56lb.js} +5 -5
  301. package/standalone/.next/static/chunks/2aq80hyo4l8a2.js +7 -0
  302. package/standalone/.next/static/chunks/{24a_ux27e8jj4.js → 2l_wayk-ioguc.js} +1 -1
  303. package/standalone/.next/static/chunks/2swvzbwm_dr9y.js +1 -0
  304. package/standalone/.next/static/chunks/{0m26h4h36cb_0.js → 3120xcqaqci82.js} +1 -1
  305. package/standalone/.next/static/chunks/315cis1es_5t3.js +41 -0
  306. package/standalone/.next/static/chunks/321feys_9vp2v.js +33 -0
  307. package/standalone/.next/static/chunks/{0d-e51sawr2y8.js → 34oyci46fsc5w.js} +1 -1
  308. package/standalone/.next/static/chunks/{1nqkxeuycfmrt.js → 36_1bjzx79v18.js} +5 -5
  309. package/standalone/.next/static/chunks/37mczlawlcx5l.js +1 -0
  310. package/standalone/.next/static/chunks/3ajj69p_sj615.js +1 -0
  311. package/standalone/.next/static/chunks/{1tcqtaedz7922.js → 3d4ijy7zglgv5.js} +1 -1
  312. package/standalone/.next/static/chunks/3ir4b8po439x7.js +40 -0
  313. package/standalone/.next/static/chunks/3p7wbgo7qd6_m.css +1 -0
  314. package/standalone/.next/static/chunks/3q0q6_ntq8aa5.js +51 -0
  315. package/standalone/.next/static/chunks/3r-6igcofcwxj.js +107 -0
  316. package/standalone/.next/static/chunks/{0m--47yk9j-ec.js → 3tycetq7o8g3h.js} +1 -1
  317. package/standalone/.next/static/chunks/3vg6y29m047x9.js +31 -0
  318. package/standalone/.next/static/chunks/{0biu8z1f8c42u.js → 40ovzayigkz_-.js} +1 -1
  319. package/standalone/.next/static/chunks/41wq-96yyl0uw.js +1 -0
  320. package/standalone/.next/static/chunks/44xu63hsh11xp.js +1 -0
  321. package/standalone/.next/static/chunks/{turbopack-1rw7om86c18dg.js → turbopack-1v9ogj_5hv56l.js} +1 -1
  322. package/standalone/src/services/builds/build-freshness.test.ts +107 -0
  323. package/standalone/src/services/builds/build-freshness.ts +73 -0
  324. package/standalone/src/services/builds/builds.service.test.ts +222 -8
  325. package/standalone/src/services/builds/builds.service.ts +514 -3
  326. package/standalone/.next/server/chunks/[root-of-the-server]__0qjhcow._.js +0 -122
  327. package/standalone/.next/server/chunks/[root-of-the-server]__1878s0b._.js +0 -3
  328. package/standalone/.next/server/chunks/[root-of-the-server]__18zrtty._.js +0 -3
  329. package/standalone/.next/server/chunks/[root-of-the-server]__1_xz_m2._.js +0 -3
  330. package/standalone/.next/server/chunks/[root-of-the-server]__1mx1hqe._.js +0 -3
  331. package/standalone/.next/server/chunks/[root-of-the-server]__1sjjkyp._.js +0 -3
  332. package/standalone/.next/server/chunks/[root-of-the-server]__1vk9266._.js +0 -3
  333. package/standalone/.next/server/chunks/[root-of-the-server]__1yn6pds._.js +0 -3
  334. package/standalone/.next/server/chunks/[root-of-the-server]__1zwpjfo._.js +0 -3
  335. package/standalone/.next/server/chunks/ssr/[root-of-the-server]__03m5q8h._.js +0 -27
  336. package/standalone/.next/server/chunks/ssr/[root-of-the-server]__06bk7ik._.js +0 -3
  337. package/standalone/.next/server/chunks/ssr/[root-of-the-server]__06f05jg._.js +0 -3
  338. package/standalone/.next/server/chunks/ssr/[root-of-the-server]__0oj1os4._.js +0 -3
  339. package/standalone/.next/server/chunks/ssr/[root-of-the-server]__1349-us._.js +0 -3
  340. package/standalone/.next/server/chunks/ssr/[root-of-the-server]__1osx7qy._.js +0 -27
  341. package/standalone/.next/server/chunks/ssr/_09l5w5d._.js +0 -3
  342. package/standalone/.next/server/chunks/ssr/_0_726fj._.js +0 -3
  343. package/standalone/.next/server/chunks/ssr/_0a1zku5._.js +0 -3
  344. package/standalone/.next/server/chunks/ssr/_0bvpmhm._.js +0 -97
  345. package/standalone/.next/server/chunks/ssr/_0ndnmkz._.js +0 -3
  346. package/standalone/.next/server/chunks/ssr/_0pe56xv._.js +0 -3
  347. package/standalone/.next/server/chunks/ssr/_0pu14lm._.js +0 -3
  348. package/standalone/.next/server/chunks/ssr/_1-1mnp6._.js +0 -3
  349. package/standalone/.next/server/chunks/ssr/_1-7r8vu._.js +0 -3
  350. package/standalone/.next/server/chunks/ssr/_10evhql._.js +0 -3
  351. package/standalone/.next/server/chunks/ssr/_142x9wn._.js +0 -22
  352. package/standalone/.next/server/chunks/ssr/_1_ta7g1._.js +0 -3
  353. package/standalone/.next/server/chunks/ssr/_1eol9we._.js +0 -3
  354. package/standalone/.next/server/chunks/ssr/_1ey5mmy._.js +0 -3
  355. package/standalone/.next/server/chunks/ssr/_1fdyu2w._.js +0 -3
  356. package/standalone/.next/server/chunks/ssr/_1h3t5g1._.js +0 -3
  357. package/standalone/.next/server/chunks/ssr/_1kemhyd._.js +0 -39
  358. package/standalone/.next/server/chunks/ssr/_1kmkrz5._.js +0 -3
  359. package/standalone/.next/server/chunks/ssr/_1lseili._.js +0 -3
  360. package/standalone/.next/server/chunks/ssr/_1oh35yj._.js +0 -3
  361. package/standalone/.next/server/chunks/ssr/_1vhf014._.js +0 -3
  362. package/standalone/.next/server/chunks/ssr/_1x13g5y._.js +0 -3
  363. package/standalone/.next/server/chunks/ssr/_1yzb5-u._.js +0 -11
  364. package/standalone/.next/server/chunks/ssr/_1za3z6k._.js +0 -97
  365. package/standalone/.next/server/chunks/ssr/src_components_0wvh73y._.js +0 -11
  366. package/standalone/.next/server/chunks/ssr/src_components_github_167_ydi._.js +0 -35
  367. package/standalone/.next/static/chunks/00dx8gu-2oyqe.js +0 -45
  368. package/standalone/.next/static/chunks/091l-ij_cv0b6.js +0 -41
  369. package/standalone/.next/static/chunks/0a3s519wuzjet.js +0 -1
  370. package/standalone/.next/static/chunks/0j5n6p9i-vyzo.js +0 -9
  371. package/standalone/.next/static/chunks/0sp_r-c6262te.js +0 -3
  372. package/standalone/.next/static/chunks/0weklluydd2mf.js +0 -23
  373. package/standalone/.next/static/chunks/1eehbcjby4go8.js +0 -95
  374. package/standalone/.next/static/chunks/1joeb4m-mmn69.js +0 -7
  375. package/standalone/.next/static/chunks/1xjd6ye7mxyf5.js +0 -7
  376. package/standalone/.next/static/chunks/23_75iur2dq8p.js +0 -1
  377. package/standalone/.next/static/chunks/24sd_kmnetibb.js +0 -1
  378. package/standalone/.next/static/chunks/278dxvyf095b_.js +0 -55
  379. package/standalone/.next/static/chunks/27k7_zc-iuppd.js +0 -1
  380. package/standalone/.next/static/chunks/2baaj4mpr6i-i.js +0 -1
  381. package/standalone/.next/static/chunks/2cj2ndz_e0hbz.js +0 -1
  382. package/standalone/.next/static/chunks/2dwchs_6y_o5f.js +0 -1
  383. package/standalone/.next/static/chunks/2hv6pkoloju0g.js +0 -33
  384. package/standalone/.next/static/chunks/2lgsgstcvc7uk.css +0 -1
  385. package/standalone/.next/static/chunks/2sqprazdqp7f7.js +0 -1
  386. package/standalone/.next/static/chunks/32agjzrkphjrl.js +0 -9
  387. package/standalone/.next/static/chunks/33y_b6dqfx3tk.js +0 -1
  388. package/standalone/.next/static/chunks/399uxexoo8x7f.js +0 -33
  389. package/standalone/.next/static/chunks/39ecics7n8z5m.js +0 -1
  390. package/standalone/.next/static/chunks/3_kaby2qep1pd.js +0 -34
  391. package/standalone/.next/static/chunks/3h1pxh5fd97ym.js +0 -27
  392. package/standalone/.next/static/chunks/3jbfibit05k5o.js +0 -29
  393. package/standalone/.next/static/chunks/3oyhf7rk2xr_g.js +0 -1
  394. package/standalone/.next/static/chunks/3q7vh58-5dkv2.js +0 -25
  395. package/standalone/.next/static/chunks/3td_-1s61zkpa.js +0 -38
  396. package/standalone/.next/static/chunks/3xkoiasuwi3ms.js +0 -95
  397. package/standalone/.next/static/chunks/41s57pssydrel.js +0 -43
  398. package/standalone/.next/static/chunks/42flok13o-l0b.js +0 -1
  399. package/standalone/.next/static/chunks/43gw6_6hbw18w.js +0 -51
  400. /package/standalone/.next/static/{_pMjurqsAcC478HIzIe-d → ePu377E66yy0icQx3ykQJ}/_buildManifest.js +0 -0
  401. /package/standalone/.next/static/{_pMjurqsAcC478HIzIe-d → ePu377E66yy0icQx3ykQJ}/_clientMiddlewareManifest.js +0 -0
  402. /package/standalone/.next/static/{_pMjurqsAcC478HIzIe-d → ePu377E66yy0icQx3ykQJ}/_ssgManifest.js +0 -0
@@ -13,6 +13,8 @@ import {
13
13
  IOS_DEPLOY_JOB_KIND,
14
14
  IOS_DESTINATIONS_JOB_KIND,
15
15
  IOS_EXPORT_JOB_KIND,
16
+ IOS_TEST_RESULTS_JOB_KIND,
17
+ IOS_COVERAGE_REPORT_JOB_KIND,
16
18
  IOS_RUN_DESTINATIONS_JOB_KIND,
17
19
  IOS_SOURCE_DISCOVER_JOB_KIND,
18
20
  IOS_SOURCE_PARSE_JOB_KIND,
@@ -23,6 +25,7 @@ import {
23
25
  type BuildAction,
24
26
  type BuildAdvancedSettings,
25
27
  type BuildDestination,
28
+ type BuildReportKind,
26
29
  type BuildSourceKind,
27
30
  } from "@ai-development-environment/agent-contract/builds";
28
31
 
@@ -320,7 +323,15 @@ function commandPreview(input: {
320
323
  const buildInclude = {
321
324
  agent: true,
322
325
  codebase: { include: { repository: true } },
323
- worktree: true,
326
+ worktree: {
327
+ include: {
328
+ _count: {
329
+ select: {
330
+ builds: { where: { status: { in: ACTIVE_BUILD_STATUSES } } },
331
+ },
332
+ },
333
+ },
334
+ },
324
335
  configuration: { include: { source: true, project: true } },
325
336
  artifacts: { orderBy: { createdAt: "asc" as const } },
326
337
  scriptExecutions: {
@@ -364,6 +375,14 @@ export class BuildsService {
364
375
  this.agentControl.registerCompletionHandler(IOS_EXPORT_JOB_KIND, (job) =>
365
376
  this.projectExportCompletion(job),
366
377
  );
378
+ this.agentControl.registerCompletionHandler(
379
+ IOS_TEST_RESULTS_JOB_KIND,
380
+ (job) => this.projectGeneratedReportCompletion(job),
381
+ );
382
+ this.agentControl.registerCompletionHandler(
383
+ IOS_COVERAGE_REPORT_JOB_KIND,
384
+ (job) => this.projectGeneratedReportCompletion(job),
385
+ );
367
386
  }
368
387
 
369
388
  private publish(buildId: string): void {
@@ -408,6 +427,8 @@ export class BuildsService {
408
427
  gitDirectory: worktree.gitDirectory,
409
428
  expectedOrigin: worktree.codebase.repository.canonicalOrigin,
410
429
  headSha: worktree.headSha,
430
+ baseBranch:
431
+ worktree.baseBranchOverride ?? worktree.codebase.defaultBranch ?? null,
411
432
  };
412
433
  }
413
434
 
@@ -912,7 +933,7 @@ export class BuildsService {
912
933
  if (!BUILD_ACTIONS.includes(action))
913
934
  throw new Error("Build action is invalid");
914
935
  const genericDestinations = genericBuildDestinations(action);
915
- if (genericDestinations.length) return genericDestinations;
936
+ if (action === "ARCHIVE") return genericDestinations;
916
937
  const job = await this.agentControl.createJob({
917
938
  agentId: worktree.codebase.agentId,
918
939
  codebaseId: worktree.codebaseId,
@@ -1001,6 +1022,7 @@ export class BuildsService {
1001
1022
  scriptIds?: string[] | null;
1002
1023
  action?: BuildAction | null;
1003
1024
  advancedSettings?: unknown;
1025
+ worktreeCoverage?: boolean;
1004
1026
  requestId: string;
1005
1027
  }) {
1006
1028
  const requestId = cleanName(input.requestId, "Request ID", 200);
@@ -1015,6 +1037,14 @@ export class BuildsService {
1015
1037
  input.worktreeId,
1016
1038
  IOS_BUILD_JOB_KIND,
1017
1039
  );
1040
+ if (
1041
+ input.worktreeCoverage &&
1042
+ !capabilities(worktree.codebase.agent).includes(
1043
+ IOS_COVERAGE_REPORT_JOB_KIND,
1044
+ )
1045
+ ) {
1046
+ throw new Error("Build agent must be updated for worktree coverage");
1047
+ }
1018
1048
  const configuration = await prisma.buildConfiguration.findUnique({
1019
1049
  where: { id: input.configurationId },
1020
1050
  include: { source: { include: { project: true } } },
@@ -1254,6 +1284,9 @@ export class BuildsService {
1254
1284
  folder: worktree.folder,
1255
1285
  branch: worktree.branch,
1256
1286
  headSha: worktree.headSha,
1287
+ codeStateHash: worktree.codeStateHash,
1288
+ hasStagedChanges: worktree.hasStagedChanges,
1289
+ hasUnstagedChanges: worktree.hasUnstagedChanges,
1257
1290
  },
1258
1291
  agent: {
1259
1292
  id: worktree.codebase.agent.id,
@@ -1291,6 +1324,7 @@ export class BuildsService {
1291
1324
  },
1292
1325
  destination,
1293
1326
  scripts,
1327
+ worktreeCoverage: input.worktreeCoverage === true,
1294
1328
  };
1295
1329
  await prisma.build.create({
1296
1330
  data: {
@@ -1359,6 +1393,7 @@ export class BuildsService {
1359
1393
  destination,
1360
1394
  advancedSettings,
1361
1395
  scripts,
1396
+ worktreeCoverage: input.worktreeCoverage === true,
1362
1397
  },
1363
1398
  idempotencyKey: `ios:build:${requestId}:${worktree.id}`,
1364
1399
  timeoutSeconds: 7 * 24 * 60 * 60,
@@ -1386,6 +1421,268 @@ export class BuildsService {
1386
1421
  });
1387
1422
  }
1388
1423
 
1424
+ async rebuildBuild(id: string, requestId: string) {
1425
+ const prisma = await getPrismaClient();
1426
+ const build = await prisma.build.findUnique({
1427
+ where: { id },
1428
+ select: {
1429
+ worktreeId: true,
1430
+ configurationId: true,
1431
+ destinationJson: true,
1432
+ action: true,
1433
+ snapshotJson: true,
1434
+ },
1435
+ });
1436
+ if (!build) throw new Error("Build not found");
1437
+
1438
+ const snapshot = objectValue(
1439
+ parseJson(build.snapshotJson, {}),
1440
+ "build snapshot",
1441
+ );
1442
+ const snapshotWorktree = objectValue(
1443
+ snapshot.worktree ?? {},
1444
+ "build worktree snapshot",
1445
+ );
1446
+ const snapshotConfiguration = objectValue(
1447
+ snapshot.configuration ?? {},
1448
+ "build configuration snapshot",
1449
+ );
1450
+ const snapshotScripts = Array.isArray(snapshot.scripts)
1451
+ ? snapshot.scripts
1452
+ : [];
1453
+ const worktreeId =
1454
+ build.worktreeId ??
1455
+ (typeof snapshotWorktree.id === "string" ? snapshotWorktree.id : null);
1456
+ const configurationId =
1457
+ build.configurationId ??
1458
+ (typeof snapshotConfiguration.id === "string"
1459
+ ? snapshotConfiguration.id
1460
+ : null);
1461
+ if (!worktreeId || !configurationId) {
1462
+ throw new Error("The original build settings are unavailable");
1463
+ }
1464
+
1465
+ return this.startBuild({
1466
+ worktreeId,
1467
+ configurationId,
1468
+ destination: parseJson(build.destinationJson, {}),
1469
+ scriptIds: snapshotScripts.flatMap((script) => {
1470
+ if (!script || typeof script !== "object" || Array.isArray(script)) {
1471
+ return [];
1472
+ }
1473
+ const scriptId = (script as JsonObject).id;
1474
+ return typeof scriptId === "string" ? [scriptId] : [];
1475
+ }),
1476
+ action: build.action as BuildAction,
1477
+ advancedSettings: snapshotConfiguration.advancedSettings,
1478
+ requestId,
1479
+ });
1480
+ }
1481
+
1482
+ async startWorktreeCoverage(input: {
1483
+ worktreeId: string;
1484
+ configurationId: string;
1485
+ destination: unknown;
1486
+ scriptIds?: string[] | null;
1487
+ advancedSettings?: unknown;
1488
+ requestId: string;
1489
+ }) {
1490
+ const prisma = await getPrismaClient();
1491
+ const coverageWorktree = await prisma.worktree.findUnique({
1492
+ where: { id: input.worktreeId },
1493
+ select: {
1494
+ baseBranchOverride: true,
1495
+ codebase: { select: { defaultBranch: true } },
1496
+ },
1497
+ });
1498
+ if (
1499
+ !coverageWorktree ||
1500
+ !(
1501
+ coverageWorktree.baseBranchOverride ??
1502
+ coverageWorktree.codebase.defaultBranch
1503
+ )
1504
+ ) {
1505
+ throw new Error("A base branch is required for worktree coverage");
1506
+ }
1507
+ const advanced = objectValue(
1508
+ input.advancedSettings ?? {},
1509
+ "coverage advanced settings",
1510
+ );
1511
+ return this.startBuild({
1512
+ ...input,
1513
+ action: "TEST",
1514
+ advancedSettings: {
1515
+ ...advanced,
1516
+ codeCoverage: true,
1517
+ parseTestResults: true,
1518
+ },
1519
+ worktreeCoverage: true,
1520
+ });
1521
+ }
1522
+
1523
+ async generateReport(
1524
+ buildId: string,
1525
+ kind: BuildReportKind,
1526
+ requestId: string,
1527
+ ) {
1528
+ const prisma = await getPrismaClient();
1529
+ const existing = await prisma.buildReport.findUnique({
1530
+ where: { buildId_kind: { buildId, kind } },
1531
+ include: { artifact: true },
1532
+ });
1533
+ if (existing?.status === "READY") return existing;
1534
+ const build = await prisma.build.findUnique({
1535
+ where: { id: buildId },
1536
+ include: { agent: true, artifacts: true },
1537
+ });
1538
+ if (!build) throw new Error("Build not found");
1539
+ if (ACTIVE_BUILD_STATUSES.includes(build.status)) {
1540
+ throw new Error("Wait for the build to finish before generating reports");
1541
+ }
1542
+ if (!build.agentId || !build.agent || !online(build.agent)) {
1543
+ throw new Error("Build agent is offline");
1544
+ }
1545
+ const capability =
1546
+ kind === "TEST_RESULTS"
1547
+ ? IOS_TEST_RESULTS_JOB_KIND
1548
+ : IOS_COVERAGE_REPORT_JOB_KIND;
1549
+ if (!capabilities(build.agent).includes(capability)) {
1550
+ throw new Error("Build agent must be updated to generate reports");
1551
+ }
1552
+ if (
1553
+ !build.artifacts.some((artifact) => artifact.kind === "RESULT_BUNDLE")
1554
+ ) {
1555
+ throw new Error("The build result bundle is unavailable");
1556
+ }
1557
+ if (
1558
+ kind === "TEST_RESULTS" &&
1559
+ !["TEST", "TEST_WITHOUT_BUILDING"].includes(build.action)
1560
+ ) {
1561
+ throw new Error("This build did not run tests");
1562
+ }
1563
+ const report = await prisma.buildReport.upsert({
1564
+ where: { buildId_kind: { buildId, kind } },
1565
+ create: {
1566
+ id: randomUUID(),
1567
+ buildId,
1568
+ kind,
1569
+ source: "MANUAL",
1570
+ status: "PENDING",
1571
+ },
1572
+ update: {
1573
+ source: "MANUAL",
1574
+ status: "PENDING",
1575
+ error: null,
1576
+ finishedAt: null,
1577
+ },
1578
+ });
1579
+ this.publish(buildId);
1580
+ const codebaseId = coordinationCodebaseId(build);
1581
+ const job = await this.agentControl.createJob({
1582
+ agentId: build.agentId,
1583
+ codebaseId,
1584
+ worktreeId: build.worktreeId,
1585
+ kind: capability,
1586
+ payload: {
1587
+ buildId,
1588
+ artifactDirectory: build.artifactDirectory,
1589
+ codebaseId,
1590
+ reportKind: kind,
1591
+ source: "MANUAL",
1592
+ },
1593
+ idempotencyKey: `ios:report:${kind}:${cleanName(requestId, "Request ID", 200)}:${buildId}`,
1594
+ timeoutSeconds: 180,
1595
+ visibility: "SYSTEM",
1596
+ });
1597
+ try {
1598
+ await this.waitForJob(job.id, 170_000);
1599
+ return prisma.buildReport.findUniqueOrThrow({
1600
+ where: { id: report.id },
1601
+ include: { artifact: true },
1602
+ });
1603
+ } finally {
1604
+ await prisma.agentJob.deleteMany({
1605
+ where: { id: job.id, visibility: "SYSTEM" },
1606
+ });
1607
+ }
1608
+ }
1609
+
1610
+ async coverageHistory(worktreeId: string) {
1611
+ const prisma = await getPrismaClient();
1612
+ return prisma.buildReport.findMany({
1613
+ where: {
1614
+ kind: "CODE_COVERAGE",
1615
+ source: "WORKTREE",
1616
+ build: { worktreeId },
1617
+ },
1618
+ orderBy: { createdAt: "desc" },
1619
+ take: 50,
1620
+ select: {
1621
+ id: true,
1622
+ buildId: true,
1623
+ artifactId: true,
1624
+ kind: true,
1625
+ source: true,
1626
+ status: true,
1627
+ summaryJson: true,
1628
+ error: true,
1629
+ createdAt: true,
1630
+ updatedAt: true,
1631
+ finishedAt: true,
1632
+ artifact: true,
1633
+ build: {
1634
+ select: {
1635
+ id: true,
1636
+ status: true,
1637
+ action: true,
1638
+ destinationType: true,
1639
+ destinationJson: true,
1640
+ snapshotJson: true,
1641
+ createdAt: true,
1642
+ startedAt: true,
1643
+ finishedAt: true,
1644
+ updatedAt: true,
1645
+ worktree: {
1646
+ select: {
1647
+ headSha: true,
1648
+ codeStateHash: true,
1649
+ hasStagedChanges: true,
1650
+ hasUnstagedChanges: true,
1651
+ lastCheckedAt: true,
1652
+ _count: {
1653
+ select: {
1654
+ builds: {
1655
+ where: { status: { in: ACTIVE_BUILD_STATUSES } },
1656
+ },
1657
+ },
1658
+ },
1659
+ },
1660
+ },
1661
+ artifacts: { orderBy: { createdAt: "asc" } },
1662
+ },
1663
+ },
1664
+ },
1665
+ });
1666
+ }
1667
+
1668
+ async reportsForBuild(buildId: string) {
1669
+ const prisma = await getPrismaClient();
1670
+ return prisma.buildReport.findMany({
1671
+ where: { buildId },
1672
+ orderBy: { createdAt: "asc" },
1673
+ include: { artifact: true },
1674
+ });
1675
+ }
1676
+
1677
+ async reportData(id: string): Promise<string> {
1678
+ const prisma = await getPrismaClient();
1679
+ const report = await prisma.buildReport.findUnique({
1680
+ where: { id },
1681
+ select: { dataJson: true },
1682
+ });
1683
+ return report?.dataJson ?? "{}";
1684
+ }
1685
+
1389
1686
  async builds(
1390
1687
  input: {
1391
1688
  first?: number | null;
@@ -1868,6 +2165,71 @@ export class BuildsService {
1868
2165
  return updated;
1869
2166
  }
1870
2167
 
2168
+ private async upsertReportProjection(
2169
+ transaction: Prisma.TransactionClient,
2170
+ buildId: string,
2171
+ raw: unknown,
2172
+ source: "AUTOMATIC" | "MANUAL" | "WORKTREE",
2173
+ ) {
2174
+ const report = objectValue(raw, "build report");
2175
+ if (report.kind !== "TEST_RESULTS" && report.kind !== "CODE_COVERAGE") {
2176
+ return;
2177
+ }
2178
+ const kind = report.kind;
2179
+ const artifactValue =
2180
+ report.artifact && typeof report.artifact === "object"
2181
+ ? objectValue(report.artifact, "build report artifact")
2182
+ : null;
2183
+ const artifact =
2184
+ artifactValue && typeof artifactValue.relativePath === "string"
2185
+ ? await transaction.buildArtifact.findUnique({
2186
+ where: {
2187
+ buildId_relativePath: {
2188
+ buildId,
2189
+ relativePath: artifactValue.relativePath,
2190
+ },
2191
+ },
2192
+ })
2193
+ : null;
2194
+ const status = report.status === "READY" ? "READY" : "FAILED";
2195
+ await transaction.buildReport.upsert({
2196
+ where: { buildId_kind: { buildId, kind } },
2197
+ create: {
2198
+ id: randomUUID(),
2199
+ buildId,
2200
+ artifactId: artifact?.id ?? null,
2201
+ kind,
2202
+ source,
2203
+ status,
2204
+ summaryJson: JSON.stringify(
2205
+ report.summary && typeof report.summary === "object"
2206
+ ? report.summary
2207
+ : {},
2208
+ ),
2209
+ dataJson: JSON.stringify(
2210
+ report.data && typeof report.data === "object" ? report.data : {},
2211
+ ),
2212
+ error: typeof report.error === "string" ? report.error : null,
2213
+ finishedAt: new Date(),
2214
+ },
2215
+ update: {
2216
+ artifactId: artifact?.id ?? null,
2217
+ source,
2218
+ status,
2219
+ summaryJson: JSON.stringify(
2220
+ report.summary && typeof report.summary === "object"
2221
+ ? report.summary
2222
+ : {},
2223
+ ),
2224
+ dataJson: JSON.stringify(
2225
+ report.data && typeof report.data === "object" ? report.data : {},
2226
+ ),
2227
+ error: typeof report.error === "string" ? report.error : null,
2228
+ finishedAt: new Date(),
2229
+ },
2230
+ });
2231
+ }
2232
+
1871
2233
  private async projectBuildCompletion(job: {
1872
2234
  id: string;
1873
2235
  status: string;
@@ -1882,6 +2244,36 @@ export class BuildsService {
1882
2244
  build.status === "CANCELLED"
1883
2245
  ? "CANCELLED"
1884
2246
  : buildStatusFromJob(job.status);
2247
+ const sourceStateHash =
2248
+ typeof result.sourceStateHash === "string"
2249
+ ? result.sourceStateHash
2250
+ : null;
2251
+ const finalStateHash =
2252
+ typeof result.finalStateHash === "string" ? result.finalStateHash : null;
2253
+ const observedAt =
2254
+ typeof result.codeStateObservedAt === "string" &&
2255
+ Number.isFinite(Date.parse(result.codeStateObservedAt))
2256
+ ? new Date(result.codeStateObservedAt)
2257
+ : new Date();
2258
+ const completedAt = finalStateHash ? observedAt : new Date();
2259
+ let snapshotJson = build.snapshotJson;
2260
+ if (sourceStateHash) {
2261
+ const snapshot = objectValue(
2262
+ parseJson(build.snapshotJson, {}),
2263
+ "build snapshot",
2264
+ );
2265
+ const worktreeSnapshot = objectValue(
2266
+ snapshot.worktree ?? {},
2267
+ "build worktree snapshot",
2268
+ );
2269
+ snapshotJson = JSON.stringify({
2270
+ ...snapshot,
2271
+ worktree: {
2272
+ ...worktreeSnapshot,
2273
+ codeStateHash: sourceStateHash,
2274
+ },
2275
+ });
2276
+ }
1885
2277
  await prisma.$transaction(async (transaction) => {
1886
2278
  await transaction.build.update({
1887
2279
  where: { id: build.id },
@@ -1899,9 +2291,22 @@ export class BuildsService {
1899
2291
  job.error ??
1900
2292
  (typeof result.error === "string" ? result.error : build.error),
1901
2293
  startedAt: build.startedAt ?? new Date(),
1902
- finishedAt: new Date(),
2294
+ finishedAt: completedAt,
2295
+ snapshotJson,
1903
2296
  },
1904
2297
  });
2298
+ if (build.worktreeId && finalStateHash) {
2299
+ await transaction.worktree.updateMany({
2300
+ where: {
2301
+ id: build.worktreeId,
2302
+ OR: [
2303
+ { lastCheckedAt: null },
2304
+ { lastCheckedAt: { lt: observedAt } },
2305
+ ],
2306
+ },
2307
+ data: { codeStateHash: finalStateHash, lastCheckedAt: observedAt },
2308
+ });
2309
+ }
1905
2310
  if (Array.isArray(result.artifacts)) {
1906
2311
  for (const raw of result.artifacts) {
1907
2312
  const artifact = objectValue(raw, "build artifact");
@@ -1978,10 +2383,116 @@ export class BuildsService {
1978
2383
  });
1979
2384
  }
1980
2385
  }
2386
+ if (Array.isArray(result.reports)) {
2387
+ for (const raw of result.reports) {
2388
+ const candidate =
2389
+ raw && typeof raw === "object" && !Array.isArray(raw)
2390
+ ? (raw as JsonObject)
2391
+ : {};
2392
+ await this.upsertReportProjection(
2393
+ transaction,
2394
+ build.id,
2395
+ raw,
2396
+ candidate.kind === "CODE_COVERAGE" ? "WORKTREE" : "AUTOMATIC",
2397
+ );
2398
+ }
2399
+ }
1981
2400
  });
1982
2401
  this.publish(build.id);
1983
2402
  }
1984
2403
 
2404
+ private async projectGeneratedReportCompletion(job: {
2405
+ id: string;
2406
+ status: string;
2407
+ payloadJson: string;
2408
+ resultJson: string | null;
2409
+ error: string | null;
2410
+ }) {
2411
+ const payload = objectValue(
2412
+ parseJson(job.payloadJson, {}),
2413
+ "build report payload",
2414
+ );
2415
+ if (typeof payload.buildId !== "string") return;
2416
+ const buildId = payload.buildId;
2417
+ const result = objectValue(
2418
+ parseJson(job.resultJson, {}),
2419
+ "build report result",
2420
+ );
2421
+ const prisma = await getPrismaClient();
2422
+ await prisma.$transaction(async (transaction) => {
2423
+ if (Array.isArray(result.artifacts)) {
2424
+ for (const raw of result.artifacts) {
2425
+ const artifact = objectValue(raw, "build report artifact");
2426
+ if (
2427
+ typeof artifact.relativePath !== "string" ||
2428
+ typeof artifact.kind !== "string"
2429
+ ) {
2430
+ continue;
2431
+ }
2432
+ await transaction.buildArtifact.upsert({
2433
+ where: {
2434
+ buildId_relativePath: {
2435
+ buildId,
2436
+ relativePath: artifact.relativePath,
2437
+ },
2438
+ },
2439
+ create: {
2440
+ id: randomUUID(),
2441
+ buildId,
2442
+ kind: artifact.kind,
2443
+ relativePath: artifact.relativePath,
2444
+ sizeBytes:
2445
+ typeof artifact.sizeBytes === "number"
2446
+ ? artifact.sizeBytes
2447
+ : null,
2448
+ checksum:
2449
+ typeof artifact.checksum === "string"
2450
+ ? artifact.checksum
2451
+ : null,
2452
+ metadataJson: JSON.stringify(
2453
+ artifact.metadata && typeof artifact.metadata === "object"
2454
+ ? artifact.metadata
2455
+ : {},
2456
+ ),
2457
+ },
2458
+ update: {},
2459
+ });
2460
+ }
2461
+ }
2462
+ if (result.report && typeof result.report === "object") {
2463
+ await this.upsertReportProjection(
2464
+ transaction,
2465
+ buildId,
2466
+ result.report,
2467
+ payload.source === "WORKTREE" ? "WORKTREE" : "MANUAL",
2468
+ );
2469
+ } else {
2470
+ const kind =
2471
+ payload.reportKind === "CODE_COVERAGE"
2472
+ ? "CODE_COVERAGE"
2473
+ : "TEST_RESULTS";
2474
+ await transaction.buildReport.upsert({
2475
+ where: { buildId_kind: { buildId, kind } },
2476
+ create: {
2477
+ id: randomUUID(),
2478
+ buildId,
2479
+ kind,
2480
+ source: payload.source === "WORKTREE" ? "WORKTREE" : "MANUAL",
2481
+ status: "FAILED",
2482
+ error: job.error || "Report generation failed",
2483
+ finishedAt: new Date(),
2484
+ },
2485
+ update: {
2486
+ status: "FAILED",
2487
+ error: job.error || "Report generation failed",
2488
+ finishedAt: new Date(),
2489
+ },
2490
+ });
2491
+ }
2492
+ });
2493
+ this.publish(buildId);
2494
+ }
2495
+
1985
2496
  private async projectDeploymentCompletion(job: {
1986
2497
  id: string;
1987
2498
  status: string;