@baochunli/flakes 0.0.4 → 0.0.5

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