@baochunli/flakes 0.0.4 → 0.0.6

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 (275) hide show
  1. package/dist/commands/host.d.ts.map +1 -1
  2. package/dist/commands/host.js +76 -2
  3. package/dist/commands/host.js.map +1 -1
  4. package/dist/commands/projects.d.ts +4 -0
  5. package/dist/commands/projects.d.ts.map +1 -0
  6. package/dist/commands/projects.js +133 -0
  7. package/dist/commands/projects.js.map +1 -0
  8. package/dist/commands/runs.d.ts.map +1 -1
  9. package/dist/commands/runs.js +5 -1
  10. package/dist/commands/runs.js.map +1 -1
  11. package/dist/commands/runtime.d.ts +0 -1
  12. package/dist/commands/runtime.d.ts.map +1 -1
  13. package/dist/commands/runtime.js +2 -280
  14. package/dist/commands/runtime.js.map +1 -1
  15. package/dist/commands/server.d.ts.map +1 -1
  16. package/dist/commands/server.js +0 -6
  17. package/dist/commands/server.js.map +1 -1
  18. package/dist/config-example.js +1 -1
  19. package/dist/config-example.js.map +1 -1
  20. package/dist/host-config.d.ts +1 -6
  21. package/dist/host-config.d.ts.map +1 -1
  22. package/dist/host-config.js +10 -28
  23. package/dist/host-config.js.map +1 -1
  24. package/dist/host-runner.d.ts +3 -0
  25. package/dist/host-runner.d.ts.map +1 -1
  26. package/dist/host-runner.js +18 -6
  27. package/dist/host-runner.js.map +1 -1
  28. package/dist/host-runtime.d.ts.map +1 -1
  29. package/dist/host-runtime.js +92 -2
  30. package/dist/host-runtime.js.map +1 -1
  31. package/dist/host-transport.js +2 -5
  32. package/dist/host-transport.js.map +1 -1
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +19 -28
  35. package/dist/index.js.map +1 -1
  36. package/dist/node_modules/@flakes/auth/package.json +1 -1
  37. package/dist/node_modules/@flakes/console/.output/nitro.json +1 -1
  38. package/dist/node_modules/@flakes/console/.output/public/assets/DocumentationPage-CGIcMKwf.js +1 -0
  39. package/dist/node_modules/@flakes/console/.output/public/assets/ProjectsPage-ByTl4Kyy.js +1 -0
  40. package/dist/node_modules/@flakes/console/.output/public/assets/RunPage-5MmbVpaE.js +3 -0
  41. package/dist/node_modules/@flakes/console/.output/public/assets/RunsPage-fbDKP9kM.js +1 -0
  42. package/dist/node_modules/@flakes/console/.output/public/assets/SandboxesLens-DPG87mUE.js +1 -0
  43. package/dist/node_modules/@flakes/console/.output/public/assets/SandboxesPage-DIpzR_Ef.js +1 -0
  44. package/dist/node_modules/@flakes/console/.output/public/assets/TranscriptPage-mCgSqfv0.js +1 -0
  45. package/dist/node_modules/@flakes/console/.output/public/assets/_-CM2hE2sZ.js +1 -0
  46. package/dist/node_modules/@flakes/console/.output/public/assets/_runId-3ZZOAqUK.js +2 -0
  47. package/dist/node_modules/@flakes/console/.output/public/assets/_taskId-cy4RxW8Y.js +2 -0
  48. package/dist/node_modules/@flakes/console/.output/public/assets/account-BWoGGXJw.js +1 -0
  49. package/dist/node_modules/@flakes/console/.output/public/assets/account-forms-Dq70JDyg.js +1 -0
  50. package/dist/node_modules/@flakes/console/.output/public/assets/arrow-right-QzVbRzF_.js +1 -0
  51. package/dist/node_modules/@flakes/console/.output/public/assets/auth-layout-BFusNq3W.js +1 -0
  52. package/dist/node_modules/@flakes/console/.output/public/assets/bits-CTGNpp-v.js +1 -0
  53. package/dist/node_modules/@flakes/console/.output/public/assets/card-37qs8AAd.js +1 -0
  54. package/dist/node_modules/@flakes/console/.output/public/assets/circle-alert-CM0SVfzc.js +1 -0
  55. package/dist/node_modules/@flakes/console/.output/public/assets/circle-check-CzwcEElH.js +1 -0
  56. package/dist/node_modules/@flakes/console/.output/public/assets/circle-x-C_sOQVNQ.js +1 -0
  57. package/dist/node_modules/@flakes/console/.output/public/assets/device-BajR3eSF.js +1 -0
  58. package/dist/node_modules/@flakes/console/.output/public/assets/documentation-6ao_Ux6x.js +1 -0
  59. package/dist/node_modules/@flakes/console/.output/public/assets/{external-link-BW8lpiMR.js → external-link-BWhbbPgy.js} +1 -1
  60. package/dist/node_modules/@flakes/console/.output/public/assets/{file-text-DMdy8OfN.js → file-text-DLxLJ7P1.js} +1 -1
  61. package/dist/node_modules/@flakes/console/.output/public/assets/forgot-password-DOKn8_7P.js +1 -0
  62. package/dist/node_modules/@flakes/console/.output/public/assets/inbox-BVu38EN6.js +1 -0
  63. package/dist/node_modules/@flakes/console/.output/public/assets/{lib-DtfURcG3.js → lib-COfgMmRR.js} +3 -3
  64. package/dist/node_modules/@flakes/console/.output/public/assets/link-ll3nLBSM.js +1 -0
  65. package/dist/node_modules/@flakes/console/.output/public/assets/{lock-D4OhqEPW.js → lock-Ck2SfQA2.js} +1 -1
  66. package/dist/node_modules/@flakes/console/.output/public/assets/main-DVO9gWzi.js +1215 -0
  67. package/dist/node_modules/@flakes/console/.output/public/assets/matchContext-puEkI9BI.js +1 -0
  68. package/dist/node_modules/@flakes/console/.output/public/assets/otp-verification-qolVtiom.js +20 -0
  69. package/dist/node_modules/@flakes/console/.output/public/assets/projects-n5LSsNi3.js +2 -0
  70. package/dist/node_modules/@flakes/console/.output/public/assets/react-B8IZ02wI.js +1 -0
  71. package/dist/node_modules/@flakes/console/.output/public/assets/react-dom-ki7NpxV4.js +1 -0
  72. package/dist/node_modules/@flakes/console/.output/public/assets/redirect-Cu9zBy04.js +1 -0
  73. package/dist/node_modules/@flakes/console/.output/public/assets/reset-password-D-OlZeHQ.js +1 -0
  74. package/dist/node_modules/@flakes/console/.output/public/assets/runs-BB9ogobQ.js +2 -0
  75. package/dist/node_modules/@flakes/console/.output/public/assets/sandboxes-BIimz5FI.js +2 -0
  76. package/dist/node_modules/@flakes/console/.output/public/assets/{save-1uf5fQff.js → save-Bte_1tnN.js} +1 -1
  77. package/dist/node_modules/@flakes/console/.output/public/assets/security-DdQNcp6k.js +1 -0
  78. package/dist/node_modules/@flakes/console/.output/public/assets/signin-BoZiVxyq.js +1 -0
  79. package/dist/node_modules/@flakes/console/.output/public/assets/signin-form-tTBWDjhi.js +1 -0
  80. package/dist/node_modules/@flakes/console/.output/public/assets/signup-CBSszmUC.js +1 -0
  81. package/dist/node_modules/@flakes/console/.output/public/assets/styles-B8OXOvkO.css +2 -0
  82. package/dist/node_modules/@flakes/console/.output/public/assets/table-WMIs2m3R.js +1 -0
  83. package/dist/node_modules/@flakes/console/.output/public/assets/tiny-invariant-CO5X59di.js +1 -0
  84. package/dist/node_modules/@flakes/console/.output/public/assets/user-Bt9z7sSI.js +1 -0
  85. package/dist/node_modules/@flakes/console/.output/public/assets/utils-CBxvVKOM.js +1 -0
  86. package/dist/node_modules/@flakes/console/.output/public/assets/x-Bdsfqbi3.js +1 -0
  87. package/dist/node_modules/@flakes/console/.output/server/{_-DwPiGKLE.mjs → _-BGsKgsbF.mjs} +3 -3
  88. package/dist/node_modules/@flakes/console/.output/server/{_-C-u135Pp.mjs → _-DtPMXzt0.mjs} +3 -3
  89. package/dist/node_modules/@flakes/console/.output/server/_chunks/ProjectsPage.mjs +588 -0
  90. package/dist/node_modules/@flakes/console/.output/server/_chunks/RunPage.mjs +13 -7
  91. package/dist/node_modules/@flakes/console/.output/server/_chunks/RunsPage.mjs +43 -13
  92. package/dist/node_modules/@flakes/console/.output/server/_chunks/SandboxesLens.mjs +1 -1
  93. package/dist/node_modules/@flakes/console/.output/server/_chunks/SandboxesPage.mjs +253 -18
  94. package/dist/node_modules/@flakes/console/.output/server/_chunks/TranscriptPage.mjs +2 -3
  95. package/dist/node_modules/@flakes/console/.output/server/_chunks/bits.mjs +1 -1
  96. package/dist/node_modules/@flakes/console/.output/server/_chunks/button.mjs +461 -3
  97. package/dist/node_modules/@flakes/console/.output/server/_chunks/card.mjs +1 -1
  98. package/dist/node_modules/@flakes/console/.output/server/_chunks/project-navigation.mjs +79 -0
  99. package/dist/node_modules/@flakes/console/.output/server/_chunks/router.mjs +193 -111
  100. package/dist/node_modules/@flakes/console/.output/server/_chunks/table.mjs +1 -1
  101. package/dist/node_modules/@flakes/console/.output/server/_libs/lucide-react.mjs +178 -1
  102. package/dist/node_modules/@flakes/console/.output/server/{_runId-Cag5UaYU.mjs → _runId-P1u-vfcm.mjs} +2 -2
  103. package/dist/node_modules/@flakes/console/.output/server/{_runId-CJ5_8uS8.mjs → _runId-vO4tlCOP.mjs} +3 -3
  104. package/dist/node_modules/@flakes/console/.output/server/_ssr/{App-CwFtUgAz.mjs → App-C-XaVKoO.mjs} +118 -64
  105. package/dist/node_modules/@flakes/console/.output/server/_ssr/{DocumentationPage-CtBAQbzy.mjs → DocumentationPage-BR2KosFz.mjs} +3 -3
  106. package/dist/node_modules/@flakes/console/.output/server/_ssr/ProjectsPage-BUrep1wl.mjs +590 -0
  107. package/dist/node_modules/@flakes/console/.output/server/_ssr/{RunPage-CatpnkFy.mjs → RunPage-BHs-v0LU.mjs} +14 -7
  108. package/dist/node_modules/@flakes/console/.output/server/_ssr/{RunsPage-BmLTih8Z.mjs → RunsPage-iTNYVwL0.mjs} +44 -13
  109. package/dist/node_modules/@flakes/console/.output/server/_ssr/SandboxesPage-C1Z6dVce.mjs +423 -0
  110. package/dist/node_modules/@flakes/console/.output/server/_ssr/{TranscriptPage-DaSIDCKk.mjs → TranscriptPage-BcomoTls.mjs} +3 -3
  111. package/dist/node_modules/@flakes/console/.output/server/_ssr/{account-DzluYS58.mjs → account-Cp0s_IQK.mjs} +2 -2
  112. package/dist/node_modules/@flakes/console/.output/server/_ssr/account-forms-CsothyLo.mjs +1 -1
  113. package/dist/node_modules/@flakes/console/.output/server/_ssr/device-CRZl7dGv.mjs +1 -1
  114. package/dist/node_modules/@flakes/console/.output/server/_ssr/documentation-BnxmM-Yo.mjs +210 -0
  115. package/dist/node_modules/@flakes/console/.output/server/_ssr/{documentation-PC93pMWl.mjs → documentation-Cgyr3VKK.mjs} +3 -3
  116. package/dist/node_modules/@flakes/console/.output/server/_ssr/{hooks-COIYuQzf.mjs → hooks-CsVtQ1m-.mjs} +178 -6
  117. package/dist/node_modules/@flakes/console/.output/server/_ssr/project-navigation-DI77TL9a.mjs +79 -0
  118. package/dist/node_modules/@flakes/console/.output/server/_ssr/projects-R9sxR_t4.mjs +5 -0
  119. package/dist/node_modules/@flakes/console/.output/server/_ssr/reset-password-SmmTixcr.mjs +1 -1
  120. package/dist/node_modules/@flakes/console/.output/server/_ssr/{router-elhBqT5k.mjs → router-CobdI6gO.mjs} +49 -41
  121. package/dist/node_modules/@flakes/console/.output/server/_ssr/runs-D8MHe3QU.mjs +19 -0
  122. package/dist/node_modules/@flakes/console/.output/server/_ssr/{runs-CBkO-RO8.mjs → runs-mTxbc_pm.mjs} +17 -5
  123. package/dist/node_modules/@flakes/console/.output/server/_ssr/{sandboxes-qSX_pfUJ.mjs → sandboxes-B2z_9JyU.mjs} +2 -2
  124. package/dist/node_modules/@flakes/console/.output/server/_ssr/{sandboxes-BIAgn8pu2.mjs → sandboxes-r0y6Ihg6.mjs} +3 -3
  125. package/dist/node_modules/@flakes/console/.output/server/_ssr/signin-form-CQDi-0A5.mjs +1 -1
  126. package/dist/node_modules/@flakes/console/.output/server/_ssr/ssr.mjs +2 -2
  127. package/dist/node_modules/@flakes/console/.output/server/{_tanstack-start-manifest_v-CR_hZXXv.mjs → _tanstack-start-manifest_v-DpAwCFK9.mjs} +53 -46
  128. package/dist/node_modules/@flakes/console/.output/server/{_taskId-BaezvY0w.mjs → _taskId-Cz9xwj5L.mjs} +2 -2
  129. package/dist/node_modules/@flakes/console/.output/server/{_taskId-Da7kHKj9.mjs → _taskId-wQsG2CQj.mjs} +3 -3
  130. package/dist/node_modules/@flakes/console/package.json +1 -1
  131. package/dist/node_modules/@flakes/control-plane/dist/client-access.d.ts +17 -0
  132. package/dist/node_modules/@flakes/control-plane/dist/client-access.d.ts.map +1 -1
  133. package/dist/node_modules/@flakes/control-plane/dist/client-access.js +12 -0
  134. package/dist/node_modules/@flakes/control-plane/dist/client-access.js.map +1 -1
  135. package/dist/node_modules/@flakes/control-plane/dist/host-pool-matching.d.ts +24 -1
  136. package/dist/node_modules/@flakes/control-plane/dist/host-pool-matching.d.ts.map +1 -1
  137. package/dist/node_modules/@flakes/control-plane/dist/host-pool-matching.js +87 -3
  138. package/dist/node_modules/@flakes/control-plane/dist/host-pool-matching.js.map +1 -1
  139. package/dist/node_modules/@flakes/control-plane/dist/host-stream.d.ts.map +1 -1
  140. package/dist/node_modules/@flakes/control-plane/dist/host-stream.js +150 -40
  141. package/dist/node_modules/@flakes/control-plane/dist/host-stream.js.map +1 -1
  142. package/dist/node_modules/@flakes/control-plane/dist/routes/hosts.d.ts.map +1 -1
  143. package/dist/node_modules/@flakes/control-plane/dist/routes/hosts.js +219 -0
  144. package/dist/node_modules/@flakes/control-plane/dist/routes/hosts.js.map +1 -1
  145. package/dist/node_modules/@flakes/control-plane/dist/routes/projects.d.ts +3 -0
  146. package/dist/node_modules/@flakes/control-plane/dist/routes/projects.d.ts.map +1 -0
  147. package/dist/node_modules/@flakes/control-plane/dist/routes/projects.js +226 -0
  148. package/dist/node_modules/@flakes/control-plane/dist/routes/projects.js.map +1 -0
  149. package/dist/node_modules/@flakes/control-plane/dist/routes/runs.d.ts.map +1 -1
  150. package/dist/node_modules/@flakes/control-plane/dist/routes/runs.js +93 -6
  151. package/dist/node_modules/@flakes/control-plane/dist/routes/runs.js.map +1 -1
  152. package/dist/node_modules/@flakes/control-plane/dist/routes/sandboxes.js +48 -3
  153. package/dist/node_modules/@flakes/control-plane/dist/routes/sandboxes.js.map +1 -1
  154. package/dist/node_modules/@flakes/control-plane/dist/routes/tasks.js +2 -2
  155. package/dist/node_modules/@flakes/control-plane/dist/routes/tasks.js.map +1 -1
  156. package/dist/node_modules/@flakes/control-plane/dist/scheduler.d.ts +2 -0
  157. package/dist/node_modules/@flakes/control-plane/dist/scheduler.d.ts.map +1 -1
  158. package/dist/node_modules/@flakes/control-plane/dist/scheduler.js +53 -21
  159. package/dist/node_modules/@flakes/control-plane/dist/scheduler.js.map +1 -1
  160. package/dist/node_modules/@flakes/control-plane/dist/server.d.ts.map +1 -1
  161. package/dist/node_modules/@flakes/control-plane/dist/server.js +2 -0
  162. package/dist/node_modules/@flakes/control-plane/dist/server.js.map +1 -1
  163. package/dist/node_modules/@flakes/control-plane/dist/types.d.ts +2 -0
  164. package/dist/node_modules/@flakes/control-plane/dist/types.d.ts.map +1 -1
  165. package/dist/node_modules/@flakes/control-plane/package.json +1 -1
  166. package/dist/node_modules/@flakes/core/dist/config.d.ts.map +1 -1
  167. package/dist/node_modules/@flakes/core/dist/config.js +6 -2
  168. package/dist/node_modules/@flakes/core/dist/config.js.map +1 -1
  169. package/dist/node_modules/@flakes/core/dist/ids.d.ts +4 -0
  170. package/dist/node_modules/@flakes/core/dist/ids.d.ts.map +1 -1
  171. package/dist/node_modules/@flakes/core/dist/ids.js +2 -0
  172. package/dist/node_modules/@flakes/core/dist/ids.js.map +1 -1
  173. package/dist/node_modules/@flakes/core/dist/runtime.d.ts +1 -1
  174. package/dist/node_modules/@flakes/core/dist/schemas.d.ts +11 -0
  175. package/dist/node_modules/@flakes/core/dist/schemas.d.ts.map +1 -1
  176. package/dist/node_modules/@flakes/core/dist/schemas.js +10 -0
  177. package/dist/node_modules/@flakes/core/dist/schemas.js.map +1 -1
  178. package/dist/node_modules/@flakes/core/package.json +1 -1
  179. package/dist/node_modules/@flakes/harness-agent/package.json +1 -1
  180. package/dist/node_modules/@flakes/harness-sdk/package.json +1 -1
  181. package/dist/node_modules/@flakes/pi-agent/package.json +1 -1
  182. package/dist/node_modules/@flakes/protocol/dist/index.d.ts +1 -1
  183. package/dist/node_modules/@flakes/protocol/dist/index.d.ts.map +1 -1
  184. package/dist/node_modules/@flakes/protocol/dist/index.js +1 -1
  185. package/dist/node_modules/@flakes/protocol/dist/index.js.map +1 -1
  186. package/dist/node_modules/@flakes/protocol/dist/v1.d.ts +317 -0
  187. package/dist/node_modules/@flakes/protocol/dist/v1.d.ts.map +1 -1
  188. package/dist/node_modules/@flakes/protocol/dist/v1.js +50 -1
  189. package/dist/node_modules/@flakes/protocol/dist/v1.js.map +1 -1
  190. package/dist/node_modules/@flakes/protocol/package.json +1 -1
  191. package/dist/node_modules/@flakes/sandbox-runtime/dist/transport.js +3 -6
  192. package/dist/node_modules/@flakes/sandbox-runtime/dist/transport.js.map +1 -1
  193. package/dist/node_modules/@flakes/sandbox-runtime/package.json +1 -1
  194. package/dist/node_modules/@flakes/store/dist/artifacts-events-store.d.ts.map +1 -1
  195. package/dist/node_modules/@flakes/store/dist/artifacts-events-store.js +10 -0
  196. package/dist/node_modules/@flakes/store/dist/artifacts-events-store.js.map +1 -1
  197. package/dist/node_modules/@flakes/store/dist/host-provisioning-limits.d.ts +2 -1
  198. package/dist/node_modules/@flakes/store/dist/host-provisioning-limits.d.ts.map +1 -1
  199. package/dist/node_modules/@flakes/store/dist/host-provisioning-limits.js +1 -0
  200. package/dist/node_modules/@flakes/store/dist/host-provisioning-limits.js.map +1 -1
  201. package/dist/node_modules/@flakes/store/dist/kysely-store.d.ts +2 -2
  202. package/dist/node_modules/@flakes/store/dist/kysely-store.d.ts.map +1 -1
  203. package/dist/node_modules/@flakes/store/dist/kysely-store.js +2 -2
  204. package/dist/node_modules/@flakes/store/dist/kysely-store.js.map +1 -1
  205. package/dist/node_modules/@flakes/store/dist/managed-sandbox-instances-store.d.ts +14 -2
  206. package/dist/node_modules/@flakes/store/dist/managed-sandbox-instances-store.d.ts.map +1 -1
  207. package/dist/node_modules/@flakes/store/dist/managed-sandbox-instances-store.js +567 -9
  208. package/dist/node_modules/@flakes/store/dist/managed-sandbox-instances-store.js.map +1 -1
  209. package/dist/node_modules/@flakes/store/dist/mappers.d.ts +10 -2
  210. package/dist/node_modules/@flakes/store/dist/mappers.d.ts.map +1 -1
  211. package/dist/node_modules/@flakes/store/dist/mappers.js +46 -0
  212. package/dist/node_modules/@flakes/store/dist/mappers.js.map +1 -1
  213. package/dist/node_modules/@flakes/store/dist/projects-store.d.ts +42 -0
  214. package/dist/node_modules/@flakes/store/dist/projects-store.d.ts.map +1 -0
  215. package/dist/node_modules/@flakes/store/dist/projects-store.js +376 -0
  216. package/dist/node_modules/@flakes/store/dist/projects-store.js.map +1 -0
  217. package/dist/node_modules/@flakes/store/dist/runs-store.d.ts.map +1 -1
  218. package/dist/node_modules/@flakes/store/dist/runs-store.js +7 -2
  219. package/dist/node_modules/@flakes/store/dist/runs-store.js.map +1 -1
  220. package/dist/node_modules/@flakes/store/dist/schema.js +72 -0
  221. package/dist/node_modules/@flakes/store/dist/schema.js.map +1 -1
  222. package/dist/node_modules/@flakes/store/dist/store-base.d.ts +14 -12
  223. package/dist/node_modules/@flakes/store/dist/store-base.d.ts.map +1 -1
  224. package/dist/node_modules/@flakes/store/dist/tables.d.ts +41 -1
  225. package/dist/node_modules/@flakes/store/dist/tables.d.ts.map +1 -1
  226. package/dist/node_modules/@flakes/store/dist/tasks-store.d.ts.map +1 -1
  227. package/dist/node_modules/@flakes/store/dist/tasks-store.js +9 -2
  228. package/dist/node_modules/@flakes/store/dist/tasks-store.js.map +1 -1
  229. package/dist/node_modules/@flakes/store/dist/types.d.ts +189 -2
  230. package/dist/node_modules/@flakes/store/dist/types.d.ts.map +1 -1
  231. package/dist/node_modules/@flakes/store/package.json +1 -1
  232. package/package.json +1 -1
  233. package/dist/node_modules/@flakes/console/.output/public/assets/DocumentationPage-DM-ZYPgQ.js +0 -1
  234. package/dist/node_modules/@flakes/console/.output/public/assets/RunPage-i03UqHYF.js +0 -3
  235. package/dist/node_modules/@flakes/console/.output/public/assets/RunsPage-u8qbeAoV.js +0 -1
  236. package/dist/node_modules/@flakes/console/.output/public/assets/SandboxesLens-BUQQWmH6.js +0 -1
  237. package/dist/node_modules/@flakes/console/.output/public/assets/SandboxesPage-D8D_5kXP.js +0 -1
  238. package/dist/node_modules/@flakes/console/.output/public/assets/TranscriptPage-ChoFjiPI.js +0 -1
  239. package/dist/node_modules/@flakes/console/.output/public/assets/_-C4ecJpHe.js +0 -1
  240. package/dist/node_modules/@flakes/console/.output/public/assets/_runId-BZXYFY32.js +0 -2
  241. package/dist/node_modules/@flakes/console/.output/public/assets/_taskId-C28oHEU_.js +0 -2
  242. package/dist/node_modules/@flakes/console/.output/public/assets/account-B4wDEC7t.js +0 -1
  243. package/dist/node_modules/@flakes/console/.output/public/assets/account-forms-BLo66Mqa.js +0 -1
  244. package/dist/node_modules/@flakes/console/.output/public/assets/arrow-right-BMW8fJP5.js +0 -1
  245. package/dist/node_modules/@flakes/console/.output/public/assets/auth-layout-DiUSgtaY.js +0 -1
  246. package/dist/node_modules/@flakes/console/.output/public/assets/bits-Cv0Te4iz.js +0 -1
  247. package/dist/node_modules/@flakes/console/.output/public/assets/card-DSG3_teC.js +0 -1
  248. package/dist/node_modules/@flakes/console/.output/public/assets/circle-check-B0gtb8OH.js +0 -1
  249. package/dist/node_modules/@flakes/console/.output/public/assets/device-NrLWypMd.js +0 -1
  250. package/dist/node_modules/@flakes/console/.output/public/assets/dist-BtPw3IIV.js +0 -1
  251. package/dist/node_modules/@flakes/console/.output/public/assets/documentation-NRDmcDud.js +0 -1
  252. package/dist/node_modules/@flakes/console/.output/public/assets/forgot-password--3Mujc8s.js +0 -1
  253. package/dist/node_modules/@flakes/console/.output/public/assets/link-BsixJinJ.js +0 -1
  254. package/dist/node_modules/@flakes/console/.output/public/assets/main-KBvz0mSQ.js +0 -1055
  255. package/dist/node_modules/@flakes/console/.output/public/assets/matchContext-tJ0VTv5m.js +0 -1
  256. package/dist/node_modules/@flakes/console/.output/public/assets/otp-verification-BSXwS5bo.js +0 -20
  257. package/dist/node_modules/@flakes/console/.output/public/assets/react-DtOYBmep.js +0 -1
  258. package/dist/node_modules/@flakes/console/.output/public/assets/react-dom-DrIU40PY.js +0 -1
  259. package/dist/node_modules/@flakes/console/.output/public/assets/redirect-BEm0VK76.js +0 -1
  260. package/dist/node_modules/@flakes/console/.output/public/assets/reset-password-C7SbNx2J.js +0 -1
  261. package/dist/node_modules/@flakes/console/.output/public/assets/runs-xD4ynllK.js +0 -2
  262. package/dist/node_modules/@flakes/console/.output/public/assets/sandboxes-Cfr1Y2Dn.js +0 -2
  263. package/dist/node_modules/@flakes/console/.output/public/assets/security-CCThSJae.js +0 -1
  264. package/dist/node_modules/@flakes/console/.output/public/assets/signin-CYeR3TaY.js +0 -1
  265. package/dist/node_modules/@flakes/console/.output/public/assets/signin-form-Bp22jPob.js +0 -1
  266. package/dist/node_modules/@flakes/console/.output/public/assets/signup-DHhPfohX.js +0 -1
  267. package/dist/node_modules/@flakes/console/.output/public/assets/styles-8wEqfToJ.css +0 -2
  268. package/dist/node_modules/@flakes/console/.output/public/assets/table-DptQuuuq.js +0 -1
  269. package/dist/node_modules/@flakes/console/.output/public/assets/user-DK27uFod.js +0 -1
  270. package/dist/node_modules/@flakes/console/.output/public/assets/utils-CEE0-YEp.js +0 -1
  271. package/dist/node_modules/@flakes/console/.output/public/assets/x-fKvnmCoQ.js +0 -1
  272. package/dist/node_modules/@flakes/console/.output/server/_chunks/utils.mjs +0 -285
  273. package/dist/node_modules/@flakes/console/.output/server/_ssr/SandboxesPage-Dlq0Ga24.mjs +0 -187
  274. package/dist/node_modules/@flakes/console/.output/server/_ssr/documentation-Bf0VPrnt.mjs +0 -210
  275. package/dist/node_modules/@flakes/console/.output/server/_ssr/runs-BzfGldVd.mjs +0 -12
@@ -0,0 +1,588 @@
1
+ import { o as __toESM } from "../_runtime.mjs";
2
+ import { c as require_jsx_runtime } from "../_libs/@radix-ui/react-arrow+[...].mjs";
3
+ import { d as Link } from "../_libs/@tanstack/react-router+[...].mjs";
4
+ import { u as require_react } from "../_libs/@floating-ui/react-dom+[...].mjs";
5
+ import { A as Inbox, B as Clock3, D as LoaderCircle, H as CircleDashed, M as Folder, P as FolderCog, Q as Archive, U as CircleCheck, V as CircleX, W as CircleAlert, d as Server, j as HardDrive } from "../_libs/lucide-react.mjs";
6
+ import { C as useUpsertHostProjectBinding, E as poolChoicesForBinding, T as hostProjectWorkspacePath, a as useHostPools, c as useProjects, m as useRuns, n as cn, o as useHostProjectBindings, s as useHosts, t as Button, v as useSetHostProjectWorkspaceRoot, w as bindingValidationView } from "./button.mjs";
7
+ import { i as splitProjectsByStatus, r as projectMatchesRun } from "./project-navigation.mjs";
8
+ import { a as CardTitle, i as CardHeader, n as CardContent, t as Card } from "./card.mjs";
9
+ import { c as timeAgo, d as Skeleton, f as Badge, l as useClockTick } from "./bits.mjs";
10
+ //#region src/views/ProjectsPage.tsx
11
+ var import_react = /* @__PURE__ */ __toESM(require_react(), 1);
12
+ var import_jsx_runtime = require_jsx_runtime();
13
+ function ProjectsPage() {
14
+ const projects = useProjects();
15
+ const runs = useRuns();
16
+ const projectList = projects.data?.projects ?? [];
17
+ const loadedRuns = (runs.data?.pages ?? []).flatMap((page) => page.runs);
18
+ const { active, archived } = splitProjectsByStatus(projectList);
19
+ useClockTick(3e4);
20
+ if (projects.isPending && projects.data === void 0) return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", {
21
+ className: "grid gap-5",
22
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(PageHeader, {}), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ProjectSkeleton, {})]
23
+ });
24
+ if (projects.isError && projects.data === void 0) return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", {
25
+ className: "grid gap-5",
26
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(PageHeader, {}), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Card, {
27
+ className: "py-10 text-center",
28
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(CardContent, {
29
+ className: "grid justify-items-center gap-2",
30
+ children: [
31
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CircleAlert, { className: "size-8 text-status-failed" }),
32
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
33
+ className: "font-medium",
34
+ children: "Cannot list projects"
35
+ }),
36
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
37
+ className: "max-w-md text-sm text-muted-foreground",
38
+ children: String(projects.error)
39
+ })
40
+ ]
41
+ })
42
+ })]
43
+ });
44
+ if (projectList.length === 0) return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", {
45
+ className: "grid gap-5",
46
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(PageHeader, {}), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Card, {
47
+ className: "py-12 text-center",
48
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(CardContent, {
49
+ className: "grid justify-items-center gap-2",
50
+ children: [
51
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Inbox, { className: "size-8 text-muted-foreground" }),
52
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
53
+ className: "font-medium",
54
+ children: "No projects yet"
55
+ }),
56
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
57
+ className: "text-sm text-muted-foreground",
58
+ children: "Create a project from the CLI or API and it will appear here."
59
+ })
60
+ ]
61
+ })
62
+ })]
63
+ });
64
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("section", {
65
+ className: "grid gap-5",
66
+ children: [
67
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PageHeader, {}),
68
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ProjectSection, {
69
+ title: "Active projects",
70
+ projects: active,
71
+ runs: loadedRuns
72
+ }),
73
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ProjectPlacementManager, { projects: active }),
74
+ archived.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ProjectSection, {
75
+ title: "Archived projects",
76
+ projects: archived,
77
+ runs: loadedRuns,
78
+ archived: true
79
+ }) : null
80
+ ]
81
+ });
82
+ }
83
+ function ProjectPlacementManager(props) {
84
+ const hosts = useHosts();
85
+ const hostList = hosts.data?.hosts ?? [];
86
+ const [selectedHostId, setSelectedHostId] = (0, import_react.useState)(null);
87
+ const [selectedProjectKey, setSelectedProjectKey] = (0, import_react.useState)(null);
88
+ (0, import_react.useEffect)(() => {
89
+ const next = hostList.some((host) => host.hostId === selectedHostId) ? selectedHostId : hostList[0]?.hostId ?? null;
90
+ if (next !== selectedHostId) setSelectedHostId(next);
91
+ }, [hostList, selectedHostId]);
92
+ (0, import_react.useEffect)(() => {
93
+ const next = props.projects.some((project) => project.projectKey === selectedProjectKey) ? selectedProjectKey : props.projects[0]?.projectKey ?? null;
94
+ if (next !== selectedProjectKey) setSelectedProjectKey(next);
95
+ }, [props.projects, selectedProjectKey]);
96
+ if (props.projects.length === 0) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Card, {
97
+ className: "border-dashed",
98
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(CardContent, {
99
+ className: "flex items-center gap-3 p-4 text-sm text-muted-foreground",
100
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(FolderCog, { className: "size-4" }), "No active projects to place on hosts."]
101
+ })
102
+ });
103
+ if (hosts.isPending && hosts.data === void 0) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ProjectPlacementSkeleton, {});
104
+ if (hosts.isError && hosts.data === void 0) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Card, {
105
+ className: "py-8 text-center",
106
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(CardContent, {
107
+ className: "grid justify-items-center gap-2",
108
+ children: [
109
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CircleAlert, { className: "size-8 text-status-failed" }),
110
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
111
+ className: "font-medium",
112
+ children: "Cannot list hosts"
113
+ }),
114
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
115
+ className: "max-w-md text-sm text-muted-foreground",
116
+ children: String(hosts.error)
117
+ })
118
+ ]
119
+ })
120
+ });
121
+ if (hostList.length === 0) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Card, {
122
+ className: "border-dashed py-8 text-center",
123
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(CardContent, {
124
+ className: "grid justify-items-center gap-2",
125
+ children: [
126
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Server, { className: "size-8 text-muted-foreground" }),
127
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
128
+ className: "font-medium",
129
+ children: "No hosts available"
130
+ }),
131
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
132
+ className: "max-w-md text-sm text-muted-foreground",
133
+ children: "Add a host before assigning project workspace roots or pool bindings."
134
+ })
135
+ ]
136
+ })
137
+ });
138
+ const selectedHost = hostList.find((host) => host.hostId === selectedHostId) ?? hostList[0];
139
+ const selectedProject = props.projects.find((project) => project.projectKey === selectedProjectKey) ?? props.projects[0];
140
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Card, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(CardHeader, {
141
+ className: "gap-4",
142
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
143
+ className: "flex min-w-0 items-start gap-3",
144
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
145
+ className: "mt-0.5 flex size-9 shrink-0 items-center justify-center rounded-md border bg-background",
146
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(FolderCog, { className: "size-4 text-muted-foreground" })
147
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
148
+ className: "min-w-0 flex-1",
149
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(CardTitle, {
150
+ className: "text-base",
151
+ children: "Host placement"
152
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
153
+ className: "mt-1 text-sm text-muted-foreground",
154
+ children: "Manage project workspace roots and host pool bindings."
155
+ })]
156
+ })]
157
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
158
+ className: "grid gap-3 md:grid-cols-2",
159
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("label", {
160
+ className: "grid gap-1.5 text-sm",
161
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
162
+ className: "console-callout",
163
+ children: "Host"
164
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("select", {
165
+ value: selectedHost?.hostId ?? "",
166
+ onChange: (event) => setSelectedHostId(event.target.value),
167
+ className: "h-9 min-w-0 rounded-md border bg-background px-2 text-sm",
168
+ children: hostList.map((host) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("option", {
169
+ value: host.hostId,
170
+ children: [
171
+ host.name,
172
+ " (",
173
+ host.hostId,
174
+ ")"
175
+ ]
176
+ }, host.hostId))
177
+ })]
178
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("label", {
179
+ className: "grid gap-1.5 text-sm",
180
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
181
+ className: "console-callout",
182
+ children: "Project"
183
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("select", {
184
+ value: selectedProject?.projectKey ?? "",
185
+ onChange: (event) => setSelectedProjectKey(event.target.value),
186
+ className: "h-9 min-w-0 rounded-md border bg-background px-2 text-sm",
187
+ children: props.projects.map((project) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("option", {
188
+ value: project.projectKey,
189
+ children: [
190
+ project.name,
191
+ " (",
192
+ project.projectKey,
193
+ ")"
194
+ ]
195
+ }, project.projectId))
196
+ })]
197
+ })]
198
+ })]
199
+ }), selectedHost && selectedProject ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(HostProjectPlacementEditor, {
200
+ host: selectedHost,
201
+ project: selectedProject
202
+ }, `${selectedHost.hostId}:${selectedProject.projectKey}`) : null] });
203
+ }
204
+ function HostProjectPlacementEditor(props) {
205
+ const rootMutation = useSetHostProjectWorkspaceRoot();
206
+ const bindingMutation = useUpsertHostProjectBinding();
207
+ const pools = useHostPools(props.host.hostId);
208
+ const projectWorkspaceRoot = props.host.projectWorkspaceRoot;
209
+ const rootConfigured = typeof projectWorkspaceRoot === "string" && projectWorkspaceRoot.trim().length > 0;
210
+ const bindings = useHostProjectBindings(props.host.hostId, rootConfigured);
211
+ const bindingLoading = rootConfigured && bindings.isPending && bindings.data === void 0;
212
+ const binding = bindings.data?.bindings.find((entry) => entry.projectKey === props.project.projectKey);
213
+ const savedPoolKeySignature = (binding?.poolKeys ?? []).join("\0");
214
+ const [rootDraft, setRootDraft] = (0, import_react.useState)(projectWorkspaceRoot ?? "");
215
+ const [selectedPoolKeys, setSelectedPoolKeys] = (0, import_react.useState)([]);
216
+ (0, import_react.useEffect)(() => {
217
+ setRootDraft(projectWorkspaceRoot ?? "");
218
+ }, [projectWorkspaceRoot]);
219
+ (0, import_react.useEffect)(() => {
220
+ setSelectedPoolKeys(savedPoolKeySignature === "" ? [] : savedPoolKeySignature.split("\0"));
221
+ }, [savedPoolKeySignature]);
222
+ const poolList = pools.data?.hostPools ?? [];
223
+ const currentPoolKeys = new Set(poolList.map((pool) => pool.poolKey));
224
+ const selectedCurrentPoolKeys = selectedPoolKeys.filter((poolKey) => currentPoolKeys.has(poolKey));
225
+ const rootChanged = rootDraft !== (projectWorkspaceRoot ?? "");
226
+ const workspacePath = binding?.workspacePath ?? (rootConfigured ? hostProjectWorkspacePath(projectWorkspaceRoot, props.project.projectKey) : void 0);
227
+ function togglePool(poolKey) {
228
+ setSelectedPoolKeys((current) => current.includes(poolKey) ? current.filter((entry) => entry !== poolKey) : [...current, poolKey]);
229
+ }
230
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(CardContent, {
231
+ className: "grid gap-4",
232
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("form", {
233
+ className: "grid gap-3 rounded-md border p-3",
234
+ onSubmit: (event) => {
235
+ event.preventDefault();
236
+ rootMutation.mutate({
237
+ hostId: props.host.hostId,
238
+ path: rootDraft
239
+ });
240
+ },
241
+ children: [
242
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
243
+ className: "flex min-w-0 flex-wrap items-center gap-3",
244
+ children: [
245
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(HardDrive, { className: "size-4 text-muted-foreground" }),
246
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
247
+ className: "min-w-0 flex-1",
248
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", {
249
+ className: "text-sm font-medium",
250
+ children: "Project workspace root"
251
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
252
+ className: "truncate font-mono text-xs text-muted-foreground",
253
+ children: props.host.hostId
254
+ })]
255
+ }),
256
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(HostStatusBadge, { host: props.host })
257
+ ]
258
+ }),
259
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
260
+ className: "grid gap-2 md:grid-cols-[minmax(0,1fr)_auto]",
261
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", {
262
+ value: rootDraft,
263
+ onChange: (event) => setRootDraft(event.target.value),
264
+ placeholder: "/srv/flakes/projects",
265
+ className: "h-9 min-w-0 rounded-md border bg-background px-3 font-mono text-sm"
266
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Button, {
267
+ type: "submit",
268
+ size: "sm",
269
+ disabled: rootMutation.isPending || rootDraft.trim().length === 0 || !rootChanged,
270
+ children: [rootMutation.isPending ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(LoaderCircle, { className: "size-4 animate-spin" }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CircleCheck, { className: "size-4" }), "Save root"]
271
+ })]
272
+ }),
273
+ rootMutation.isError ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", {
274
+ className: "text-sm text-destructive",
275
+ children: ["Cannot save root: ", String(rootMutation.error)]
276
+ }) : null
277
+ ]
278
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
279
+ className: "grid gap-3 rounded-md border p-3",
280
+ children: [
281
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
282
+ className: "flex min-w-0 flex-wrap items-center gap-3",
283
+ children: [
284
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(FolderCog, { className: "size-4 text-muted-foreground" }),
285
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
286
+ className: "min-w-0 flex-1",
287
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", {
288
+ className: "text-sm font-medium",
289
+ children: "Project host binding"
290
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
291
+ className: "truncate font-mono text-xs text-muted-foreground",
292
+ children: props.project.projectKey
293
+ })]
294
+ }),
295
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BindingValidationBadge, {
296
+ binding,
297
+ loading: bindingLoading
298
+ })
299
+ ]
300
+ }),
301
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ReadOnlyField, {
302
+ label: "Workspace path",
303
+ value: workspacePath ?? "Root required",
304
+ muted: workspacePath === void 0
305
+ }),
306
+ !rootConfigured ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(InlineState, {
307
+ icon: HardDrive,
308
+ title: "Workspace root required",
309
+ detail: "Set a host project workspace root before creating bindings."
310
+ }) : pools.isPending && pools.data === void 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PoolSkeleton, {}) : pools.isError && pools.data === void 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(InlineState, {
311
+ icon: CircleAlert,
312
+ title: "Cannot list pools",
313
+ detail: String(pools.error),
314
+ tone: "error"
315
+ }) : poolList.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(InlineState, {
316
+ icon: Server,
317
+ title: "No host pools",
318
+ detail: "This host has not reported any pool keys."
319
+ }) : bindingLoading ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BindingLoadingState, {}) : bindings.isError && bindings.data === void 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(InlineState, {
320
+ icon: CircleAlert,
321
+ title: "Cannot list bindings",
322
+ detail: String(bindings.error),
323
+ tone: "error"
324
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("form", {
325
+ className: "grid gap-3",
326
+ onSubmit: (event) => {
327
+ event.preventDefault();
328
+ bindingMutation.mutate({
329
+ hostId: props.host.hostId,
330
+ projectKey: props.project.projectKey,
331
+ poolKeys: selectedCurrentPoolKeys
332
+ });
333
+ },
334
+ children: [
335
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PoolChoiceList, {
336
+ pools: poolList,
337
+ binding: { poolKeys: selectedPoolKeys },
338
+ onToggle: togglePool
339
+ }),
340
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
341
+ className: "flex min-w-0 flex-wrap items-center gap-3",
342
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Button, {
343
+ type: "submit",
344
+ size: "sm",
345
+ disabled: bindingMutation.isPending || selectedCurrentPoolKeys.length === 0,
346
+ children: [bindingMutation.isPending ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(LoaderCircle, { className: "size-4 animate-spin" }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CircleCheck, { className: "size-4" }), "Save binding"]
347
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", {
348
+ className: "min-w-0 flex-1 truncate font-mono text-xs text-muted-foreground",
349
+ children: [
350
+ selectedCurrentPoolKeys.length,
351
+ " selected pool",
352
+ selectedCurrentPoolKeys.length === 1 ? "" : "s"
353
+ ]
354
+ })]
355
+ }),
356
+ bindingMutation.isError ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", {
357
+ className: "text-sm text-destructive",
358
+ children: ["Cannot save binding: ", String(bindingMutation.error)]
359
+ }) : null
360
+ ]
361
+ })
362
+ ]
363
+ })]
364
+ });
365
+ }
366
+ function HostStatusBadge(props) {
367
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Badge, {
368
+ variant: "outline",
369
+ className: "gap-1.5 font-mono text-[11px]",
370
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: cn("size-1.5 rounded-full", props.host.status === "online" ? "bg-status-succeeded" : props.host.status === "disabled" ? "bg-status-failed" : "bg-status-idle") }), props.host.status.toUpperCase()]
371
+ });
372
+ }
373
+ function BindingValidationBadge(props) {
374
+ if (props.loading === true) return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Badge, {
375
+ variant: "outline",
376
+ className: "gap-1.5 font-mono text-[11px] uppercase tracking-[0.08em] text-status-warn",
377
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(LoaderCircle, { className: "size-3.5 animate-spin" }), "Loading binding"]
378
+ });
379
+ const view = bindingValidationView(props.binding);
380
+ const Icon = validationIcon(view.tone);
381
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Badge, {
382
+ variant: "outline",
383
+ className: cn("gap-1.5 font-mono text-[11px] uppercase tracking-[0.08em]", validationToneClass(view.tone)),
384
+ title: view.detail,
385
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Icon, { className: "size-3.5" }), view.label]
386
+ });
387
+ }
388
+ function BindingLoadingState() {
389
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
390
+ className: "flex min-w-0 items-start gap-3 rounded-md border border-dashed p-3",
391
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(LoaderCircle, { className: "mt-0.5 size-4 shrink-0 animate-spin text-status-warn" }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
392
+ className: "min-w-0",
393
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
394
+ className: "text-sm font-medium",
395
+ children: "Loading bindings"
396
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
397
+ className: "mt-1 text-sm text-muted-foreground",
398
+ children: "Loading current host project bindings before edits are enabled."
399
+ })]
400
+ })]
401
+ });
402
+ }
403
+ function PoolChoiceList(props) {
404
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
405
+ className: "grid gap-2 sm:grid-cols-2",
406
+ children: poolChoicesForBinding(props.pools, props.binding).map((choice) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("label", {
407
+ className: cn("flex min-w-0 items-center gap-3 rounded-md border p-3 text-sm transition-colors", choice.selected ? "bg-secondary/70" : "hover:bg-secondary/40"),
408
+ children: [
409
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", {
410
+ type: "checkbox",
411
+ checked: choice.selected,
412
+ onChange: () => props.onToggle(choice.poolKey),
413
+ className: "size-4 shrink-0 accent-primary"
414
+ }),
415
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
416
+ className: "min-w-0 flex-1 truncate font-mono text-xs",
417
+ children: choice.poolKey
418
+ }),
419
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Badge, {
420
+ variant: "outline",
421
+ className: "font-mono text-[10px]",
422
+ children: choice.statusLabel
423
+ })
424
+ ]
425
+ }, choice.poolKey))
426
+ });
427
+ }
428
+ function ReadOnlyField(props) {
429
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("label", {
430
+ className: "grid gap-1.5 text-sm",
431
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
432
+ className: "console-callout",
433
+ children: props.label
434
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("input", {
435
+ readOnly: true,
436
+ value: props.value,
437
+ className: cn("h-9 min-w-0 rounded-md border bg-muted px-3 font-mono text-sm", props.muted && "text-muted-foreground")
438
+ })]
439
+ });
440
+ }
441
+ function InlineState(props) {
442
+ const Icon = props.icon;
443
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
444
+ className: "flex min-w-0 items-start gap-3 rounded-md border border-dashed p-3",
445
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Icon, { className: cn("mt-0.5 size-4 shrink-0", props.tone === "error" ? "text-status-failed" : "text-muted-foreground") }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
446
+ className: "min-w-0",
447
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
448
+ className: "text-sm font-medium",
449
+ children: props.title
450
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
451
+ className: "mt-1 text-sm text-muted-foreground",
452
+ children: props.detail
453
+ })]
454
+ })]
455
+ });
456
+ }
457
+ function ProjectPlacementSkeleton() {
458
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Card, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(CardHeader, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-5 w-40" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-4 w-80 max-w-full" })] }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(CardContent, {
459
+ className: "grid gap-3",
460
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-24 w-full" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-36 w-full" })]
461
+ })] });
462
+ }
463
+ function PoolSkeleton() {
464
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
465
+ className: "grid gap-2 sm:grid-cols-2",
466
+ children: [0, 1].map((index) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-12 w-full" }, index))
467
+ });
468
+ }
469
+ function validationIcon(tone) {
470
+ switch (tone) {
471
+ case "available": return CircleCheck;
472
+ case "unavailable": return CircleX;
473
+ case "pending": return Clock3;
474
+ case "idle": return CircleDashed;
475
+ }
476
+ }
477
+ function validationToneClass(tone) {
478
+ switch (tone) {
479
+ case "available": return "text-status-succeeded";
480
+ case "unavailable": return "text-status-failed";
481
+ case "pending": return "text-status-warn";
482
+ case "idle": return "text-muted-foreground";
483
+ }
484
+ }
485
+ function PageHeader() {
486
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h1", {
487
+ className: "text-lg font-semibold tracking-tight",
488
+ children: "Projects"
489
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
490
+ className: "text-sm text-muted-foreground",
491
+ children: "Project-scoped run history for this account."
492
+ })] });
493
+ }
494
+ function ProjectSection(props) {
495
+ if (props.projects.length === 0) return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Card, {
496
+ className: "py-8 text-center",
497
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CardContent, {
498
+ className: "text-sm text-muted-foreground",
499
+ children: "No active projects."
500
+ })
501
+ });
502
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
503
+ className: "grid gap-2",
504
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", {
505
+ className: "console-callout",
506
+ children: props.title
507
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
508
+ className: "grid gap-3 md:grid-cols-2",
509
+ children: props.projects.map((project) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ProjectCard, {
510
+ project,
511
+ runCount: countProjectRuns(project, props.runs),
512
+ archived: props.archived === true
513
+ }, project.projectId))
514
+ })]
515
+ });
516
+ }
517
+ function ProjectCard(props) {
518
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Card, {
519
+ className: props.archived ? "border-dashed opacity-80" : void 0,
520
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(CardHeader, {
521
+ className: "gap-3",
522
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
523
+ className: "flex min-w-0 items-start gap-3",
524
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
525
+ className: "mt-0.5 flex size-9 shrink-0 items-center justify-center rounded-md border bg-background",
526
+ children: props.archived ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Archive, { className: "size-4 text-muted-foreground" }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Folder, { className: "size-4 text-muted-foreground" })
527
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
528
+ className: "min-w-0 flex-1",
529
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
530
+ className: "flex min-w-0 flex-wrap items-center gap-2",
531
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(CardTitle, {
532
+ className: "truncate text-base",
533
+ children: props.project.name
534
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Badge, {
535
+ variant: props.archived ? "outline" : "secondary",
536
+ children: props.project.status
537
+ })]
538
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
539
+ className: "mt-1 font-mono text-xs text-muted-foreground",
540
+ children: props.project.projectKey
541
+ })]
542
+ })]
543
+ })
544
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(CardContent, {
545
+ className: "flex flex-wrap items-center gap-3",
546
+ children: [
547
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
548
+ className: "font-mono text-xs text-muted-foreground",
549
+ "data-num": true,
550
+ children: [props.runCount, " loaded runs"]
551
+ }),
552
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
553
+ className: "font-mono text-xs text-muted-foreground",
554
+ title: props.project.updatedAt,
555
+ "data-num": true,
556
+ children: ["Updated ", timeAgo(props.project.updatedAt)]
557
+ }),
558
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Button, {
559
+ asChild: true,
560
+ size: "sm",
561
+ variant: "outline",
562
+ className: "ml-auto",
563
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Link, {
564
+ to: "/runs",
565
+ search: { project: props.project.projectKey },
566
+ children: "Runs"
567
+ })
568
+ })
569
+ ]
570
+ })]
571
+ });
572
+ }
573
+ function ProjectSkeleton() {
574
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
575
+ className: "grid gap-3 md:grid-cols-2",
576
+ children: [
577
+ 0,
578
+ 1,
579
+ 2,
580
+ 3
581
+ ].map((index) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Card, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(CardHeader, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-5 w-40" }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-4 w-24" })] }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CardContent, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-8 w-full" }) })] }, index))
582
+ });
583
+ }
584
+ function countProjectRuns(project, runs) {
585
+ return runs.filter((run) => projectMatchesRun(project, run)).length;
586
+ }
587
+ //#endregion
588
+ export { ProjectsPage };
@@ -4,9 +4,9 @@ import { f as useNavigate } from "../_libs/@tanstack/react-router+[...].mjs";
4
4
  import { l as require_react_dom, u as require_react } from "../_libs/@floating-ui/react-dom+[...].mjs";
5
5
  import { t as cva } from "../_libs/class-variance-authority+clsx.mjs";
6
6
  import { i as Trigger, n as List, r as Root2, t as Content } from "../_libs/radix-ui__react-tabs.mjs";
7
- import { D as LoaderCircle, E as Lock, F as Download, I as Clock, M as FileText, P as Expand, S as Maximize2, n as ZoomIn, r as X, s as Trash2, t as ZoomOut } from "../_libs/lucide-react.mjs";
8
- import { a as useRunFileReservations, g as downloadFile, i as useRunArtifacts, n as useDeleteRun, o as useRunMetrics, r as useRun, s as useRunTasks, t as cn } from "./utils.mjs";
9
- import { t as Button } from "./button.mjs";
7
+ import { D as LoaderCircle, E as Lock, F as FileText, L as Expand, R as Download, S as Maximize2, n as ZoomIn, r as X, s as Trash2, t as ZoomOut, z as Clock } from "../_libs/lucide-react.mjs";
8
+ import { A as downloadFile, c as useProjects, d as useRunFileReservations, f as useRunMetrics, i as useDeleteRun, l as useRun, n as cn, p as useRunTasks, t as Button, u as useRunArtifacts } from "./button.mjs";
9
+ import { n as projectLabelForRun } from "./project-navigation.mjs";
10
10
  import { n as CardContent, t as Card } from "./card.mjs";
11
11
  import { a as taskDisplayName, c as timeAgo, d as Skeleton, f as Badge, i as hashDelay, l as useClockTick, n as StatusBar, o as taskOrdinals, r as fmtTime, t as StateBadge, u as useFlash } from "./bits.mjs";
12
12
  import { a as TableHeader, i as TableHead, n as TableBody, o as TableRow, r as TableCell, t as Table } from "./table.mjs";
@@ -1165,6 +1165,7 @@ function runElapsed(run) {
1165
1165
  }
1166
1166
  function RunPage(props) {
1167
1167
  const run = useRun(props.runId);
1168
+ const projects = useProjects();
1168
1169
  const tasks = useRunTasks(props.runId);
1169
1170
  const artifacts = useRunArtifacts(props.runId);
1170
1171
  const metrics = useRunMetrics(props.runId);
@@ -1192,6 +1193,7 @@ function RunPage(props) {
1192
1193
  const terminalTasks = terminalTaskStatuses.reduce((sum, status) => sum + (counts[status] ?? 0), 0);
1193
1194
  const terminalFlash = useFlash(terminalTasks);
1194
1195
  const elapsed = runElapsed(run.data);
1196
+ const projectLabel = run.data === void 0 ? void 0 : projectLabelForRun(projects.data?.projects ?? [], run.data);
1195
1197
  const canvasShown = canvasChoice ?? taskList.length <= MAP_AUTO_COLLAPSE_TASKS;
1196
1198
  const canDeleteRun = run.data !== void 0 && terminalRunStates.has(run.data.state);
1197
1199
  async function deleteThisRun() {
@@ -1265,10 +1267,14 @@ function RunPage(props) {
1265
1267
  }),
1266
1268
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", {
1267
1269
  className: "font-mono text-xs text-muted-foreground",
1268
- children: [props.runId, run.data ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [" · created ", /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
1269
- title: run.data.createdAt,
1270
- children: timeAgo(run.data.createdAt)
1271
- })] }) : null]
1270
+ children: [
1271
+ props.runId,
1272
+ projectLabel !== void 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [" · ", projectLabel] }) : null,
1273
+ run.data ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [" · created ", /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
1274
+ title: run.data.createdAt,
1275
+ children: timeAgo(run.data.createdAt)
1276
+ })] }) : null
1277
+ ]
1272
1278
  }),
1273
1279
  deleteError ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
1274
1280
  className: "text-xs text-destructive",