@chrisjowen/wheelhouse 0.0.0-stage → 0.1.0

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 (528) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +112 -2
  3. package/build/client/_app/immutable/assets/0.DaQhCSel.css +1 -0
  4. package/build/client/_app/immutable/assets/0.DaQhCSel.css.br +0 -0
  5. package/build/client/_app/immutable/assets/0.DaQhCSel.css.gz +0 -0
  6. package/build/client/_app/immutable/assets/12.DT1C9nmd.css +1 -0
  7. package/build/client/_app/immutable/assets/12.DT1C9nmd.css.br +0 -0
  8. package/build/client/_app/immutable/assets/12.DT1C9nmd.css.gz +0 -0
  9. package/build/client/_app/immutable/assets/14.CjNfSPQ6.css +1 -0
  10. package/build/client/_app/immutable/assets/14.CjNfSPQ6.css.br +0 -0
  11. package/build/client/_app/immutable/assets/14.CjNfSPQ6.css.gz +0 -0
  12. package/build/client/_app/immutable/assets/15.KLSHp5Yu.css +1 -0
  13. package/build/client/_app/immutable/assets/15.KLSHp5Yu.css.br +0 -0
  14. package/build/client/_app/immutable/assets/15.KLSHp5Yu.css.gz +0 -0
  15. package/build/client/_app/immutable/assets/2.DvyEOdRq.css +1 -0
  16. package/build/client/_app/immutable/assets/2.DvyEOdRq.css.br +0 -0
  17. package/build/client/_app/immutable/assets/2.DvyEOdRq.css.gz +0 -0
  18. package/build/client/_app/immutable/assets/4.5dJKCkOT.css +1 -0
  19. package/build/client/_app/immutable/assets/4.5dJKCkOT.css.br +0 -0
  20. package/build/client/_app/immutable/assets/4.5dJKCkOT.css.gz +0 -0
  21. package/build/client/_app/immutable/assets/MicButton.Dga9zAug.css +1 -0
  22. package/build/client/_app/immutable/assets/MicButton.Dga9zAug.css.br +2 -0
  23. package/build/client/_app/immutable/assets/MicButton.Dga9zAug.css.gz +0 -0
  24. package/build/client/_app/immutable/assets/inter-cyrillic-ext-wght-italic.B5xAaiFk.woff2 +0 -0
  25. package/build/client/_app/immutable/assets/inter-cyrillic-ext-wght-normal.BOeWTOD4.woff2 +0 -0
  26. package/build/client/_app/immutable/assets/inter-cyrillic-wght-italic.DzZdc28x.woff2 +0 -0
  27. package/build/client/_app/immutable/assets/inter-cyrillic-wght-normal.DqGufNeO.woff2 +0 -0
  28. package/build/client/_app/immutable/assets/inter-greek-ext-wght-italic.DcOpz6Lw.woff2 +0 -0
  29. package/build/client/_app/immutable/assets/inter-greek-ext-wght-normal.DlzME5K_.woff2 +0 -0
  30. package/build/client/_app/immutable/assets/inter-greek-wght-italic.CILZdfAp.woff2 +0 -0
  31. package/build/client/_app/immutable/assets/inter-greek-wght-normal.CkhJZR-_.woff2 +0 -0
  32. package/build/client/_app/immutable/assets/inter-latin-ext-wght-italic.0pjOp8NU.woff2 +0 -0
  33. package/build/client/_app/immutable/assets/inter-latin-ext-wght-normal.DO1Apj_S.woff2 +0 -0
  34. package/build/client/_app/immutable/assets/inter-latin-wght-italic.DpCbqKDY.woff2 +0 -0
  35. package/build/client/_app/immutable/assets/inter-latin-wght-normal.Dx4kXJAl.woff2 +0 -0
  36. package/build/client/_app/immutable/assets/inter-vietnamese-wght-italic.K3WlGtc8.woff2 +0 -0
  37. package/build/client/_app/immutable/assets/inter-vietnamese-wght-normal.CBcvBZtf.woff2 +0 -0
  38. package/build/client/_app/immutable/assets/jetbrains-mono-cyrillic-wght-normal.D73BlboJ.woff2 +0 -0
  39. package/build/client/_app/immutable/assets/jetbrains-mono-greek-wght-normal.Bw9x6K1M.woff2 +0 -0
  40. package/build/client/_app/immutable/assets/jetbrains-mono-latin-ext-wght-normal.DBQx-q_a.woff2 +0 -0
  41. package/build/client/_app/immutable/assets/jetbrains-mono-latin-wght-normal.B9CIFXIH.woff2 +0 -0
  42. package/build/client/_app/immutable/assets/jetbrains-mono-vietnamese-wght-normal.Bt-aOZkq.woff2 +0 -0
  43. package/build/client/_app/immutable/assets/newsreader-latin-ext-wght-italic.DFS986qL.woff2 +0 -0
  44. package/build/client/_app/immutable/assets/newsreader-latin-ext-wght-normal.C-3rgBeH.woff2 +0 -0
  45. package/build/client/_app/immutable/assets/newsreader-latin-wght-italic.Bxi8ein9.woff2 +0 -0
  46. package/build/client/_app/immutable/assets/newsreader-latin-wght-normal.CCVVNp6i.woff2 +0 -0
  47. package/build/client/_app/immutable/assets/newsreader-vietnamese-wght-italic.xAqemagA.woff2 +0 -0
  48. package/build/client/_app/immutable/assets/newsreader-vietnamese-wght-normal.Czsa-EzN.woff2 +0 -0
  49. package/build/client/_app/immutable/chunks/36FDwM1G.js +1 -0
  50. package/build/client/_app/immutable/chunks/36FDwM1G.js.br +0 -0
  51. package/build/client/_app/immutable/chunks/36FDwM1G.js.gz +0 -0
  52. package/build/client/_app/immutable/chunks/B-qIQCd3.js +16 -0
  53. package/build/client/_app/immutable/chunks/B-qIQCd3.js.br +0 -0
  54. package/build/client/_app/immutable/chunks/B-qIQCd3.js.gz +0 -0
  55. package/build/client/_app/immutable/chunks/B1XxiJam.js +1 -0
  56. package/build/client/_app/immutable/chunks/B1XxiJam.js.br +0 -0
  57. package/build/client/_app/immutable/chunks/B1XxiJam.js.gz +0 -0
  58. package/build/client/_app/immutable/chunks/B2wEHue2.js +1 -0
  59. package/build/client/_app/immutable/chunks/B2wEHue2.js.br +0 -0
  60. package/build/client/_app/immutable/chunks/B2wEHue2.js.gz +0 -0
  61. package/build/client/_app/immutable/chunks/BAurN1n6.js +2 -0
  62. package/build/client/_app/immutable/chunks/BAurN1n6.js.br +0 -0
  63. package/build/client/_app/immutable/chunks/BAurN1n6.js.gz +0 -0
  64. package/build/client/_app/immutable/chunks/BEAYWcbT.js +1 -0
  65. package/build/client/_app/immutable/chunks/BEAYWcbT.js.br +0 -0
  66. package/build/client/_app/immutable/chunks/BEAYWcbT.js.gz +0 -0
  67. package/build/client/_app/immutable/chunks/BGINfGsV.js +1 -0
  68. package/build/client/_app/immutable/chunks/BGINfGsV.js.br +4 -0
  69. package/build/client/_app/immutable/chunks/BGINfGsV.js.gz +0 -0
  70. package/build/client/_app/immutable/chunks/BHsdHLbF.js +1 -0
  71. package/build/client/_app/immutable/chunks/BHsdHLbF.js.br +0 -0
  72. package/build/client/_app/immutable/chunks/BHsdHLbF.js.gz +0 -0
  73. package/build/client/_app/immutable/chunks/BR5v76-T.js +1 -0
  74. package/build/client/_app/immutable/chunks/BR5v76-T.js.br +0 -0
  75. package/build/client/_app/immutable/chunks/BR5v76-T.js.gz +0 -0
  76. package/build/client/_app/immutable/chunks/BUo4hMcM.js +1 -0
  77. package/build/client/_app/immutable/chunks/BUo4hMcM.js.br +0 -0
  78. package/build/client/_app/immutable/chunks/BUo4hMcM.js.gz +0 -0
  79. package/build/client/_app/immutable/chunks/BVVO3JPx.js +1 -0
  80. package/build/client/_app/immutable/chunks/BVVO3JPx.js.br +0 -0
  81. package/build/client/_app/immutable/chunks/BVVO3JPx.js.gz +0 -0
  82. package/build/client/_app/immutable/chunks/BXN538J3.js +1 -0
  83. package/build/client/_app/immutable/chunks/BXN538J3.js.br +2 -0
  84. package/build/client/_app/immutable/chunks/BXN538J3.js.gz +0 -0
  85. package/build/client/_app/immutable/chunks/BZm5e4fE.js +1 -0
  86. package/build/client/_app/immutable/chunks/BZm5e4fE.js.br +0 -0
  87. package/build/client/_app/immutable/chunks/BZm5e4fE.js.gz +0 -0
  88. package/build/client/_app/immutable/chunks/Bfi4vm-w.js +1 -0
  89. package/build/client/_app/immutable/chunks/Bfi4vm-w.js.br +0 -0
  90. package/build/client/_app/immutable/chunks/Bfi4vm-w.js.gz +0 -0
  91. package/build/client/_app/immutable/chunks/BiTivU7x.js +1 -0
  92. package/build/client/_app/immutable/chunks/BiTivU7x.js.br +0 -0
  93. package/build/client/_app/immutable/chunks/BiTivU7x.js.gz +0 -0
  94. package/build/client/_app/immutable/chunks/BiuLIp4b.js +1 -0
  95. package/build/client/_app/immutable/chunks/BiuLIp4b.js.br +0 -0
  96. package/build/client/_app/immutable/chunks/BiuLIp4b.js.gz +0 -0
  97. package/build/client/_app/immutable/chunks/Bns_F-QV.js +1 -0
  98. package/build/client/_app/immutable/chunks/Bns_F-QV.js.br +0 -0
  99. package/build/client/_app/immutable/chunks/Bns_F-QV.js.gz +0 -0
  100. package/build/client/_app/immutable/chunks/Brlpgp90.js +1 -0
  101. package/build/client/_app/immutable/chunks/Brlpgp90.js.br +0 -0
  102. package/build/client/_app/immutable/chunks/Brlpgp90.js.gz +0 -0
  103. package/build/client/_app/immutable/chunks/BunkbzFG.js +1 -0
  104. package/build/client/_app/immutable/chunks/BunkbzFG.js.br +0 -0
  105. package/build/client/_app/immutable/chunks/BunkbzFG.js.gz +0 -0
  106. package/build/client/_app/immutable/chunks/BwOfqJw9.js +1 -0
  107. package/build/client/_app/immutable/chunks/BwOfqJw9.js.br +0 -0
  108. package/build/client/_app/immutable/chunks/BwOfqJw9.js.gz +0 -0
  109. package/build/client/_app/immutable/chunks/C-xrRA1Y.js +1 -0
  110. package/build/client/_app/immutable/chunks/C-xrRA1Y.js.br +0 -0
  111. package/build/client/_app/immutable/chunks/C-xrRA1Y.js.gz +0 -0
  112. package/build/client/_app/immutable/chunks/C2_XZrIO.js +7 -0
  113. package/build/client/_app/immutable/chunks/C2_XZrIO.js.br +0 -0
  114. package/build/client/_app/immutable/chunks/C2_XZrIO.js.gz +0 -0
  115. package/build/client/_app/immutable/chunks/C2d4bDYU.js +1 -0
  116. package/build/client/_app/immutable/chunks/C2d4bDYU.js.br +0 -0
  117. package/build/client/_app/immutable/chunks/C2d4bDYU.js.gz +0 -0
  118. package/build/client/_app/immutable/chunks/C6BQPSOs.js +62 -0
  119. package/build/client/_app/immutable/chunks/C6BQPSOs.js.br +0 -0
  120. package/build/client/_app/immutable/chunks/C6BQPSOs.js.gz +0 -0
  121. package/build/client/_app/immutable/chunks/CDphfOBv.js +1 -0
  122. package/build/client/_app/immutable/chunks/CDphfOBv.js.br +0 -0
  123. package/build/client/_app/immutable/chunks/CDphfOBv.js.gz +0 -0
  124. package/build/client/_app/immutable/chunks/CHoQMvOZ.js +1 -0
  125. package/build/client/_app/immutable/chunks/CHoQMvOZ.js.br +0 -0
  126. package/build/client/_app/immutable/chunks/CHoQMvOZ.js.gz +0 -0
  127. package/build/client/_app/immutable/chunks/CIE0U5Ih.js +1 -0
  128. package/build/client/_app/immutable/chunks/CIE0U5Ih.js.br +0 -0
  129. package/build/client/_app/immutable/chunks/CIE0U5Ih.js.gz +0 -0
  130. package/build/client/_app/immutable/chunks/CLs9Rkbg.js +1 -0
  131. package/build/client/_app/immutable/chunks/CLs9Rkbg.js.br +0 -0
  132. package/build/client/_app/immutable/chunks/CLs9Rkbg.js.gz +0 -0
  133. package/build/client/_app/immutable/chunks/COQ3aAYj.js +1 -0
  134. package/build/client/_app/immutable/chunks/COQ3aAYj.js.br +0 -0
  135. package/build/client/_app/immutable/chunks/COQ3aAYj.js.gz +0 -0
  136. package/build/client/_app/immutable/chunks/COiIt96y.js +1 -0
  137. package/build/client/_app/immutable/chunks/COiIt96y.js.br +0 -0
  138. package/build/client/_app/immutable/chunks/COiIt96y.js.gz +0 -0
  139. package/build/client/_app/immutable/chunks/CQ7gIAH8.js +1 -0
  140. package/build/client/_app/immutable/chunks/CQ7gIAH8.js.br +2 -0
  141. package/build/client/_app/immutable/chunks/CQ7gIAH8.js.gz +0 -0
  142. package/build/client/_app/immutable/chunks/CQlHU-Rx.js +1 -0
  143. package/build/client/_app/immutable/chunks/CQlHU-Rx.js.br +0 -0
  144. package/build/client/_app/immutable/chunks/CQlHU-Rx.js.gz +0 -0
  145. package/build/client/_app/immutable/chunks/CR7y1ULG.js +1 -0
  146. package/build/client/_app/immutable/chunks/CR7y1ULG.js.br +0 -0
  147. package/build/client/_app/immutable/chunks/CR7y1ULG.js.gz +0 -0
  148. package/build/client/_app/immutable/chunks/CXfdgbLv.js +1 -0
  149. package/build/client/_app/immutable/chunks/CXfdgbLv.js.br +0 -0
  150. package/build/client/_app/immutable/chunks/CXfdgbLv.js.gz +0 -0
  151. package/build/client/_app/immutable/chunks/CeYIQAXD.js +1 -0
  152. package/build/client/_app/immutable/chunks/CeYIQAXD.js.br +0 -0
  153. package/build/client/_app/immutable/chunks/CeYIQAXD.js.gz +0 -0
  154. package/build/client/_app/immutable/chunks/CewXGI4o.js +14 -0
  155. package/build/client/_app/immutable/chunks/CewXGI4o.js.br +0 -0
  156. package/build/client/_app/immutable/chunks/CewXGI4o.js.gz +0 -0
  157. package/build/client/_app/immutable/chunks/CfdzAfq2.js +1 -0
  158. package/build/client/_app/immutable/chunks/CfdzAfq2.js.br +0 -0
  159. package/build/client/_app/immutable/chunks/CfdzAfq2.js.gz +0 -0
  160. package/build/client/_app/immutable/chunks/CkFDaaNz.js +1 -0
  161. package/build/client/_app/immutable/chunks/CkFDaaNz.js.br +0 -0
  162. package/build/client/_app/immutable/chunks/CkFDaaNz.js.gz +0 -0
  163. package/build/client/_app/immutable/chunks/CkLriSVx.js +1 -0
  164. package/build/client/_app/immutable/chunks/CkLriSVx.js.br +0 -0
  165. package/build/client/_app/immutable/chunks/CkLriSVx.js.gz +0 -0
  166. package/build/client/_app/immutable/chunks/Clzs_eXS.js +5 -0
  167. package/build/client/_app/immutable/chunks/Clzs_eXS.js.br +0 -0
  168. package/build/client/_app/immutable/chunks/Clzs_eXS.js.gz +0 -0
  169. package/build/client/_app/immutable/chunks/CrCQ2NNA.js +1 -0
  170. package/build/client/_app/immutable/chunks/CrCQ2NNA.js.br +0 -0
  171. package/build/client/_app/immutable/chunks/CrCQ2NNA.js.gz +0 -0
  172. package/build/client/_app/immutable/chunks/CrgqcyB_.js +1 -0
  173. package/build/client/_app/immutable/chunks/CrgqcyB_.js.br +0 -0
  174. package/build/client/_app/immutable/chunks/CrgqcyB_.js.gz +0 -0
  175. package/build/client/_app/immutable/chunks/CtlVBKf-.js +1 -0
  176. package/build/client/_app/immutable/chunks/CtlVBKf-.js.br +0 -0
  177. package/build/client/_app/immutable/chunks/CtlVBKf-.js.gz +0 -0
  178. package/build/client/_app/immutable/chunks/D4aeBIhU.js +1 -0
  179. package/build/client/_app/immutable/chunks/D4aeBIhU.js.br +0 -0
  180. package/build/client/_app/immutable/chunks/D4aeBIhU.js.gz +0 -0
  181. package/build/client/_app/immutable/chunks/D7IP_ZEm.js +1 -0
  182. package/build/client/_app/immutable/chunks/D7IP_ZEm.js.br +0 -0
  183. package/build/client/_app/immutable/chunks/D7IP_ZEm.js.gz +0 -0
  184. package/build/client/_app/immutable/chunks/D8Hx-_mj.js +1 -0
  185. package/build/client/_app/immutable/chunks/D8Hx-_mj.js.br +3 -0
  186. package/build/client/_app/immutable/chunks/D8Hx-_mj.js.gz +0 -0
  187. package/build/client/_app/immutable/chunks/DC8T2WRZ.js +1 -0
  188. package/build/client/_app/immutable/chunks/DC8T2WRZ.js.br +0 -0
  189. package/build/client/_app/immutable/chunks/DC8T2WRZ.js.gz +0 -0
  190. package/build/client/_app/immutable/chunks/DGy76IbW.js +2 -0
  191. package/build/client/_app/immutable/chunks/DGy76IbW.js.br +0 -0
  192. package/build/client/_app/immutable/chunks/DGy76IbW.js.gz +0 -0
  193. package/build/client/_app/immutable/chunks/DIABVMrA.js +1 -0
  194. package/build/client/_app/immutable/chunks/DIABVMrA.js.br +0 -0
  195. package/build/client/_app/immutable/chunks/DIABVMrA.js.gz +0 -0
  196. package/build/client/_app/immutable/chunks/DKQe4Tss.js +1 -0
  197. package/build/client/_app/immutable/chunks/DKQe4Tss.js.br +0 -0
  198. package/build/client/_app/immutable/chunks/DKQe4Tss.js.gz +0 -0
  199. package/build/client/_app/immutable/chunks/DLith9Yi.js +1 -0
  200. package/build/client/_app/immutable/chunks/DLith9Yi.js.br +0 -0
  201. package/build/client/_app/immutable/chunks/DLith9Yi.js.gz +0 -0
  202. package/build/client/_app/immutable/chunks/DPTtvukI.js +1 -0
  203. package/build/client/_app/immutable/chunks/DPTtvukI.js.br +0 -0
  204. package/build/client/_app/immutable/chunks/DPTtvukI.js.gz +0 -0
  205. package/build/client/_app/immutable/chunks/DX4qG4td.js +1 -0
  206. package/build/client/_app/immutable/chunks/DX4qG4td.js.br +1 -0
  207. package/build/client/_app/immutable/chunks/DX4qG4td.js.gz +0 -0
  208. package/build/client/_app/immutable/chunks/Da92_52d.js +1 -0
  209. package/build/client/_app/immutable/chunks/Da92_52d.js.br +0 -0
  210. package/build/client/_app/immutable/chunks/Da92_52d.js.gz +0 -0
  211. package/build/client/_app/immutable/chunks/Db0WMrvR.js +1 -0
  212. package/build/client/_app/immutable/chunks/Db0WMrvR.js.br +0 -0
  213. package/build/client/_app/immutable/chunks/Db0WMrvR.js.gz +0 -0
  214. package/build/client/_app/immutable/chunks/Dlb_KqyS.js +2 -0
  215. package/build/client/_app/immutable/chunks/Dlb_KqyS.js.br +0 -0
  216. package/build/client/_app/immutable/chunks/Dlb_KqyS.js.gz +0 -0
  217. package/build/client/_app/immutable/chunks/DmcreR7o.js +1 -0
  218. package/build/client/_app/immutable/chunks/DmcreR7o.js.br +0 -0
  219. package/build/client/_app/immutable/chunks/DmcreR7o.js.gz +0 -0
  220. package/build/client/_app/immutable/chunks/Dq9kJk5R.js +1 -0
  221. package/build/client/_app/immutable/chunks/Dq9kJk5R.js.br +0 -0
  222. package/build/client/_app/immutable/chunks/Dq9kJk5R.js.gz +0 -0
  223. package/build/client/_app/immutable/chunks/DsnmJJEf.js +1 -0
  224. package/build/client/_app/immutable/chunks/DsnmJJEf.js.br +2 -0
  225. package/build/client/_app/immutable/chunks/DsnmJJEf.js.gz +0 -0
  226. package/build/client/_app/immutable/chunks/DxGQT-Hz.js +1 -0
  227. package/build/client/_app/immutable/chunks/DxGQT-Hz.js.br +0 -0
  228. package/build/client/_app/immutable/chunks/DxGQT-Hz.js.gz +0 -0
  229. package/build/client/_app/immutable/chunks/ET-O1REu.js +1 -0
  230. package/build/client/_app/immutable/chunks/ET-O1REu.js.br +0 -0
  231. package/build/client/_app/immutable/chunks/ET-O1REu.js.gz +0 -0
  232. package/build/client/_app/immutable/chunks/Ewrw42Vq.js +1 -0
  233. package/build/client/_app/immutable/chunks/Ewrw42Vq.js.br +0 -0
  234. package/build/client/_app/immutable/chunks/Ewrw42Vq.js.gz +0 -0
  235. package/build/client/_app/immutable/chunks/FQ69txbU.js +1 -0
  236. package/build/client/_app/immutable/chunks/FQ69txbU.js.br +0 -0
  237. package/build/client/_app/immutable/chunks/FQ69txbU.js.gz +0 -0
  238. package/build/client/_app/immutable/chunks/L-6wuY5f.js +2 -0
  239. package/build/client/_app/immutable/chunks/L-6wuY5f.js.br +0 -0
  240. package/build/client/_app/immutable/chunks/L-6wuY5f.js.gz +0 -0
  241. package/build/client/_app/immutable/chunks/M201SoVK.js +1 -0
  242. package/build/client/_app/immutable/chunks/M201SoVK.js.br +1 -0
  243. package/build/client/_app/immutable/chunks/M201SoVK.js.gz +0 -0
  244. package/build/client/_app/immutable/chunks/OeqXO44y.js +1 -0
  245. package/build/client/_app/immutable/chunks/OeqXO44y.js.br +0 -0
  246. package/build/client/_app/immutable/chunks/OeqXO44y.js.gz +0 -0
  247. package/build/client/_app/immutable/chunks/PPVm8Dsz.js +1 -0
  248. package/build/client/_app/immutable/chunks/PPVm8Dsz.js.br +0 -0
  249. package/build/client/_app/immutable/chunks/PPVm8Dsz.js.gz +0 -0
  250. package/build/client/_app/immutable/chunks/QAFSHLn2.js +1 -0
  251. package/build/client/_app/immutable/chunks/QAFSHLn2.js.br +0 -0
  252. package/build/client/_app/immutable/chunks/QAFSHLn2.js.gz +0 -0
  253. package/build/client/_app/immutable/chunks/Tm9AblHs.js +1 -0
  254. package/build/client/_app/immutable/chunks/Tm9AblHs.js.br +0 -0
  255. package/build/client/_app/immutable/chunks/Tm9AblHs.js.gz +0 -0
  256. package/build/client/_app/immutable/chunks/bvY4yrzM.js +4 -0
  257. package/build/client/_app/immutable/chunks/bvY4yrzM.js.br +0 -0
  258. package/build/client/_app/immutable/chunks/bvY4yrzM.js.gz +0 -0
  259. package/build/client/_app/immutable/chunks/cAfuCUf-.js +1 -0
  260. package/build/client/_app/immutable/chunks/cAfuCUf-.js.br +0 -0
  261. package/build/client/_app/immutable/chunks/cAfuCUf-.js.gz +0 -0
  262. package/build/client/_app/immutable/chunks/eMSiEzFi.js +1 -0
  263. package/build/client/_app/immutable/chunks/eMSiEzFi.js.br +0 -0
  264. package/build/client/_app/immutable/chunks/eMSiEzFi.js.gz +0 -0
  265. package/build/client/_app/immutable/chunks/iVpzjqp1.js +1 -0
  266. package/build/client/_app/immutable/chunks/iVpzjqp1.js.br +0 -0
  267. package/build/client/_app/immutable/chunks/iVpzjqp1.js.gz +0 -0
  268. package/build/client/_app/immutable/chunks/m3YfhLk1.js +1 -0
  269. package/build/client/_app/immutable/chunks/m3YfhLk1.js.br +0 -0
  270. package/build/client/_app/immutable/chunks/m3YfhLk1.js.gz +0 -0
  271. package/build/client/_app/immutable/chunks/p7x6PRF0.js +1 -0
  272. package/build/client/_app/immutable/chunks/p7x6PRF0.js.br +0 -0
  273. package/build/client/_app/immutable/chunks/p7x6PRF0.js.gz +0 -0
  274. package/build/client/_app/immutable/chunks/t4rxsdjl.js +74 -0
  275. package/build/client/_app/immutable/chunks/t4rxsdjl.js.br +0 -0
  276. package/build/client/_app/immutable/chunks/t4rxsdjl.js.gz +0 -0
  277. package/build/client/_app/immutable/chunks/uD7-7yV9.js +1 -0
  278. package/build/client/_app/immutable/chunks/uD7-7yV9.js.br +4 -0
  279. package/build/client/_app/immutable/chunks/uD7-7yV9.js.gz +0 -0
  280. package/build/client/_app/immutable/chunks/wbPk3Yxo.js +81 -0
  281. package/build/client/_app/immutable/chunks/wbPk3Yxo.js.br +0 -0
  282. package/build/client/_app/immutable/chunks/wbPk3Yxo.js.gz +0 -0
  283. package/build/client/_app/immutable/entry/app.D22_AlD8.js +2 -0
  284. package/build/client/_app/immutable/entry/app.D22_AlD8.js.br +0 -0
  285. package/build/client/_app/immutable/entry/app.D22_AlD8.js.gz +0 -0
  286. package/build/client/_app/immutable/entry/start.xwa7znED.js +1 -0
  287. package/build/client/_app/immutable/entry/start.xwa7znED.js.br +0 -0
  288. package/build/client/_app/immutable/entry/start.xwa7znED.js.gz +0 -0
  289. package/build/client/_app/immutable/nodes/0.DsfUbybd.js +5 -0
  290. package/build/client/_app/immutable/nodes/0.DsfUbybd.js.br +0 -0
  291. package/build/client/_app/immutable/nodes/0.DsfUbybd.js.gz +0 -0
  292. package/build/client/_app/immutable/nodes/1.9tnApS8T.js +1 -0
  293. package/build/client/_app/immutable/nodes/1.9tnApS8T.js.br +0 -0
  294. package/build/client/_app/immutable/nodes/1.9tnApS8T.js.gz +0 -0
  295. package/build/client/_app/immutable/nodes/10.CbyVViLq.js +14 -0
  296. package/build/client/_app/immutable/nodes/10.CbyVViLq.js.br +0 -0
  297. package/build/client/_app/immutable/nodes/10.CbyVViLq.js.gz +0 -0
  298. package/build/client/_app/immutable/nodes/11.xg5UTCOx.js +77 -0
  299. package/build/client/_app/immutable/nodes/11.xg5UTCOx.js.br +0 -0
  300. package/build/client/_app/immutable/nodes/11.xg5UTCOx.js.gz +0 -0
  301. package/build/client/_app/immutable/nodes/12.C6hLGaov.js +32 -0
  302. package/build/client/_app/immutable/nodes/12.C6hLGaov.js.br +0 -0
  303. package/build/client/_app/immutable/nodes/12.C6hLGaov.js.gz +0 -0
  304. package/build/client/_app/immutable/nodes/13.DHbTeLkm.js +5 -0
  305. package/build/client/_app/immutable/nodes/13.DHbTeLkm.js.br +0 -0
  306. package/build/client/_app/immutable/nodes/13.DHbTeLkm.js.gz +0 -0
  307. package/build/client/_app/immutable/nodes/14.BMIOGjF-.js +1 -0
  308. package/build/client/_app/immutable/nodes/14.BMIOGjF-.js.br +0 -0
  309. package/build/client/_app/immutable/nodes/14.BMIOGjF-.js.gz +0 -0
  310. package/build/client/_app/immutable/nodes/15.DYSMqa5A.js +10 -0
  311. package/build/client/_app/immutable/nodes/15.DYSMqa5A.js.br +0 -0
  312. package/build/client/_app/immutable/nodes/15.DYSMqa5A.js.gz +0 -0
  313. package/build/client/_app/immutable/nodes/16.B0mX0t_j.js +6 -0
  314. package/build/client/_app/immutable/nodes/16.B0mX0t_j.js.br +0 -0
  315. package/build/client/_app/immutable/nodes/16.B0mX0t_j.js.gz +0 -0
  316. package/build/client/_app/immutable/nodes/2.CSYV0jmk.js +4 -0
  317. package/build/client/_app/immutable/nodes/2.CSYV0jmk.js.br +0 -0
  318. package/build/client/_app/immutable/nodes/2.CSYV0jmk.js.gz +0 -0
  319. package/build/client/_app/immutable/nodes/3.X5qqsIUa.js +5 -0
  320. package/build/client/_app/immutable/nodes/3.X5qqsIUa.js.br +0 -0
  321. package/build/client/_app/immutable/nodes/3.X5qqsIUa.js.gz +0 -0
  322. package/build/client/_app/immutable/nodes/4.Di4k8SR2.js +3 -0
  323. package/build/client/_app/immutable/nodes/4.Di4k8SR2.js.br +0 -0
  324. package/build/client/_app/immutable/nodes/4.Di4k8SR2.js.gz +0 -0
  325. package/build/client/_app/immutable/nodes/5.DMFYTxVa.js +7 -0
  326. package/build/client/_app/immutable/nodes/5.DMFYTxVa.js.br +0 -0
  327. package/build/client/_app/immutable/nodes/5.DMFYTxVa.js.gz +0 -0
  328. package/build/client/_app/immutable/nodes/6.6yDAURLV.js +4 -0
  329. package/build/client/_app/immutable/nodes/6.6yDAURLV.js.br +0 -0
  330. package/build/client/_app/immutable/nodes/6.6yDAURLV.js.gz +0 -0
  331. package/build/client/_app/immutable/nodes/7.xxvMU05c.js +1 -0
  332. package/build/client/_app/immutable/nodes/7.xxvMU05c.js.br +0 -0
  333. package/build/client/_app/immutable/nodes/7.xxvMU05c.js.gz +0 -0
  334. package/build/client/_app/immutable/nodes/8.GSaWotW8.js +1 -0
  335. package/build/client/_app/immutable/nodes/8.GSaWotW8.js.br +0 -0
  336. package/build/client/_app/immutable/nodes/8.GSaWotW8.js.gz +0 -0
  337. package/build/client/_app/immutable/nodes/9.CEiUwDDg.js +1 -0
  338. package/build/client/_app/immutable/nodes/9.CEiUwDDg.js.br +0 -0
  339. package/build/client/_app/immutable/nodes/9.CEiUwDDg.js.gz +0 -0
  340. package/build/client/_app/version.json +1 -0
  341. package/build/client/_app/version.json.br +0 -0
  342. package/build/client/_app/version.json.gz +0 -0
  343. package/build/client/favicon.svg +1 -0
  344. package/build/client/favicon.svg.br +0 -0
  345. package/build/client/favicon.svg.gz +0 -0
  346. package/build/env.js +70 -0
  347. package/build/handler.js +23 -0
  348. package/build/index.js +146 -0
  349. package/build/server/chunks/chunks/AllowanceMeter.js-C9jRsAGU.js +42 -0
  350. package/build/server/chunks/chunks/DecisionCard.js-u1VQ9s_v.js +350 -0
  351. package/build/server/chunks/chunks/DictateTextarea.js-BlEnOzcN.js +85 -0
  352. package/build/server/chunks/chunks/EtaLine.js-Pa4_VV6V.js +79 -0
  353. package/build/server/chunks/chunks/Icon.js-D7CY3joB.js +129 -0
  354. package/build/server/chunks/chunks/InsightsNav.js-BlxFBJfj.js +22 -0
  355. package/build/server/chunks/chunks/MicButton.js-BZSQAyuM.js +336 -0
  356. package/build/server/chunks/chunks/QuestionList.js-DglKezUe.js +259 -0
  357. package/build/server/chunks/chunks/SlotContent.js-YqZXXtRz.js +1977 -0
  358. package/build/server/chunks/chunks/StageTrack.js-BaorW-yk.js +59 -0
  359. package/build/server/chunks/chunks/TimeBar.js-k38rc7ZI.js +32 -0
  360. package/build/server/chunks/chunks/TimeLegend.js-BQVvgsvs.js +29 -0
  361. package/build/server/chunks/chunks/access.js-CS2pJasF.js +816 -0
  362. package/build/server/chunks/chunks/anchor.js-ByXDBfbi.js +20 -0
  363. package/build/server/chunks/chunks/arrow-down.js-DXDJc9EE.js +18 -0
  364. package/build/server/chunks/chunks/arrow-left.js-6Yey35CE.js +18 -0
  365. package/build/server/chunks/chunks/arrow-right.js-CfbPWRqu.js +18 -0
  366. package/build/server/chunks/chunks/arrow-up.js-AhghNbhW.js +18 -0
  367. package/build/server/chunks/chunks/bell.js-CAlv92RY.js +143 -0
  368. package/build/server/chunks/chunks/blocks.js-BL9jLCe-.js +710 -0
  369. package/build/server/chunks/chunks/buildlog.js-BCKtSKOt.js +55 -0
  370. package/build/server/chunks/chunks/bus.svelte.js-DRTptEhF.js +9 -0
  371. package/build/server/chunks/chunks/button.js-HeBqLheH.js +7311 -0
  372. package/build/server/chunks/chunks/chat.svelte.js-Cgdbtjbw.js +537 -0
  373. package/build/server/chunks/chunks/check.js-bmUhmMEz.js +15 -0
  374. package/build/server/chunks/chunks/checks.js-BnIxIaus.js +175 -0
  375. package/build/server/chunks/chunks/chevron-down.js-D75hVSIe.js +15 -0
  376. package/build/server/chunks/chunks/chevron-right.js-yhLg_GaH.js +15 -0
  377. package/build/server/chunks/chunks/circle-dashed.js-Bm3gZCXK.js +24 -0
  378. package/build/server/chunks/chunks/client.js-BUNengrw.js +24 -0
  379. package/build/server/chunks/chunks/clock.js-D7JTvRbC.js +18 -0
  380. package/build/server/chunks/chunks/compass.js-Tq6uiG8I.js +23 -0
  381. package/build/server/chunks/chunks/detail.js-CSjOmiVi.js +133 -0
  382. package/build/server/chunks/chunks/exports.js-BZBK1HC9.js +161 -0
  383. package/build/server/chunks/chunks/external-link.js-WxVF0xXO.js +24 -0
  384. package/build/server/chunks/chunks/file-text.js-CAo3vdqd.js +26 -0
  385. package/build/server/chunks/chunks/format.js-D3lWEg6U.js +70 -0
  386. package/build/server/chunks/chunks/gauge.js-Dw9bgE72.js +35 -0
  387. package/build/server/chunks/chunks/git-pull-request.js-Cx1w8BQr.js +20 -0
  388. package/build/server/chunks/chunks/hammer.js-fp_Kidfj.js +24 -0
  389. package/build/server/chunks/chunks/hand.js-xkYPYJZj.js +37 -0
  390. package/build/server/chunks/chunks/harbour.js-xu7EfIHk.js +113 -0
  391. package/build/server/chunks/chunks/http.js-TzZuOtxn.js +25 -0
  392. package/build/server/chunks/chunks/http2.js-Cr9xuMRL.js +26 -0
  393. package/build/server/chunks/chunks/inbox.js-CW2sFmx9.js +114 -0
  394. package/build/server/chunks/chunks/inbox.svelte.js-OoKhjjWM.js +134 -0
  395. package/build/server/chunks/chunks/index-server.js-CtyUzIGY.js +17 -0
  396. package/build/server/chunks/chunks/index-server2.js-DMc-UvjC.js +19 -0
  397. package/build/server/chunks/chunks/index.js-Bn6j9diM.js +1524 -0
  398. package/build/server/chunks/chunks/index2.js-CXaRTuov.js +46 -0
  399. package/build/server/chunks/chunks/insights.js-CzzfyHGp.js +100 -0
  400. package/build/server/chunks/chunks/internal.js-Co-6PAQm.js +146 -0
  401. package/build/server/chunks/chunks/keys.js-CdtCzv-v.js +20 -0
  402. package/build/server/chunks/chunks/live.svelte.js-BRUTNc9D.js +196 -0
  403. package/build/server/chunks/chunks/loader-circle.js-IYRaUYWq.js +16 -0
  404. package/build/server/chunks/chunks/message-circle-question-mark.js-DwrMi0ty.js +25 -0
  405. package/build/server/chunks/chunks/message-square-text.js-N5uEmy8L.js +25 -0
  406. package/build/server/chunks/chunks/message-square.js-Hp-6BHgG.js +22 -0
  407. package/build/server/chunks/chunks/messages.js-CFyGKoqq.js +4 -0
  408. package/build/server/chunks/chunks/minus.js-bsfnwE-h.js +15 -0
  409. package/build/server/chunks/chunks/monitor-play.js-B7qbbPH6.js +28 -0
  410. package/build/server/chunks/chunks/passage-meta.js-uvNUyJkg.js +232 -0
  411. package/build/server/chunks/chunks/plain.js-Dc97sYaJ.js +101 -0
  412. package/build/server/chunks/chunks/preview.js-CVD-Kwks.js +68 -0
  413. package/build/server/chunks/chunks/prreview.js-C5XxDIu2.js +85 -0
  414. package/build/server/chunks/chunks/root.js-CQzYN4Pu.js +3105 -0
  415. package/build/server/chunks/chunks/runtime.js-C0n924wq.js +13280 -0
  416. package/build/server/chunks/chunks/scale.js-vP4G0lZM.js +21 -0
  417. package/build/server/chunks/chunks/server.js-Bf8x1V_n.js +16 -0
  418. package/build/server/chunks/chunks/shield-check.js-PJLnCKD9.js +23 -0
  419. package/build/server/chunks/chunks/slots.svelte.js-0Ejhe-hS.js +34 -0
  420. package/build/server/chunks/chunks/spec.js-B0yI1XqG.js +307 -0
  421. package/build/server/chunks/chunks/split.js-BsCU24rQ.js +20 -0
  422. package/build/server/chunks/chunks/square-terminal.js-D5Z4Sl2-.js +47 -0
  423. package/build/server/chunks/chunks/tone.js-r2qFVrZC.js +30 -0
  424. package/build/server/chunks/chunks/trash.js-DYFbRevY.js +46 -0
  425. package/build/server/chunks/chunks/triangle-alert.js-DuE40HSU.js +38 -0
  426. package/build/server/chunks/chunks/utils.js-DTSGDHlH.js +2956 -0
  427. package/build/server/chunks/chunks/utils2.js-BQzn9ikS.js +38 -0
  428. package/build/server/chunks/chunks/view.js-BtcLmKUY.js +76 -0
  429. package/build/server/chunks/chunks/view2.js-BdUXqNlY.js +87 -0
  430. package/build/server/chunks/chunks/views.js-B0wP-tuB.js +137 -0
  431. package/build/server/chunks/chunks/waypoints.js-D3HN7bje.js +67 -0
  432. package/build/server/chunks/chunks/x.js-tlds9Ooz.js +18 -0
  433. package/build/server/chunks/entries/endpoints/api/events/_server.ts.js-DNHG661Q.js +93 -0
  434. package/build/server/chunks/entries/endpoints/api/firstmate/chat/_server.ts.js-XBUQePMq.js +74 -0
  435. package/build/server/chunks/entries/endpoints/api/firstmate/commands/_server.ts.js-D1tzpRWy.js +110 -0
  436. package/build/server/chunks/entries/endpoints/api/firstmate/input/_server.ts.js-DqhQUZUA.js +42 -0
  437. package/build/server/chunks/entries/endpoints/api/firstmate/interrupt/_server.ts.js-LsZer0Bi.js +35 -0
  438. package/build/server/chunks/entries/endpoints/api/firstmate/messages/_server.ts.js-DQob0XkJ.js +57 -0
  439. package/build/server/chunks/entries/endpoints/api/firstmate/pick/_server.ts.js-DgFjtYYL.js +45 -0
  440. package/build/server/chunks/entries/endpoints/api/firstmate/start/_server.ts.js-DOoA4rRW.js +35 -0
  441. package/build/server/chunks/entries/endpoints/api/fleet/_server.ts.js-DZQsFY87.js +27 -0
  442. package/build/server/chunks/entries/endpoints/api/health/_server.ts.js-DuSzTlq5.js +27 -0
  443. package/build/server/chunks/entries/endpoints/api/inbox/_server.ts.js-C15XwPXH.js +51 -0
  444. package/build/server/chunks/entries/endpoints/api/insights/_server.ts.js--gavJO4f.js +27 -0
  445. package/build/server/chunks/entries/endpoints/api/plugins/_server.ts.js-CsTy_jT6.js +27 -0
  446. package/build/server/chunks/entries/endpoints/api/projects/_id_/passage/_server.ts.js-BWOcGtOU.js +32 -0
  447. package/build/server/chunks/entries/endpoints/api/projects/_id_/passage/commands/_server.ts.js-Kjwbc2wm.js +41 -0
  448. package/build/server/chunks/entries/endpoints/api/projects/_id_/passage/consent/_server.ts.js-BTIb8CUb.js +53 -0
  449. package/build/server/chunks/entries/endpoints/api/projects/_id_/passage/draft/_server.ts.js-Vh52yDJ9.js +40 -0
  450. package/build/server/chunks/entries/endpoints/api/projects/_id_/passage/file/_server.ts.js-LJDJLrpB.js +63 -0
  451. package/build/server/chunks/entries/endpoints/api/projects/_id_/passage/test/_server.ts.js-CdDBYH6K.js +46 -0
  452. package/build/server/chunks/entries/endpoints/api/services/_server.ts.js-DoElFmWK.js +46 -0
  453. package/build/server/chunks/entries/endpoints/api/slots/_server.ts.js-KiiPnPLF.js +35 -0
  454. package/build/server/chunks/entries/endpoints/api/specs/_id_/_server.ts.js-LMXTPr04.js +59 -0
  455. package/build/server/chunks/entries/endpoints/api/specs/_id_/build-request/_server.ts.js-bqjJGIjt.js +47 -0
  456. package/build/server/chunks/entries/endpoints/api/specs/_id_/comments/_comment_/_server.ts.js-DD1qQE9w.js +36 -0
  457. package/build/server/chunks/entries/endpoints/api/specs/_id_/comments/_server.ts.js-Bby1xkpH.js +57 -0
  458. package/build/server/chunks/entries/endpoints/api/specs/_id_/images/_name_/_server.ts.js-CPX8OLQa.js +49 -0
  459. package/build/server/chunks/entries/endpoints/api/specs/_id_/images/_server.ts.js-BjBV4SVl.js +55 -0
  460. package/build/server/chunks/entries/endpoints/api/specs/_id_/sent/_server.ts.js-BAqm0IW0.js +36 -0
  461. package/build/server/chunks/entries/endpoints/api/specs/_id_/turn/_server.ts.js-CNFIHA70.js +82 -0
  462. package/build/server/chunks/entries/endpoints/api/specs/_server.ts.js-Bix9PKKr.js +40 -0
  463. package/build/server/chunks/entries/endpoints/api/tasks/_id_/_server.ts.js-CT7cLDQU.js +32 -0
  464. package/build/server/chunks/entries/endpoints/api/tasks/_id_/artifacts/_...name_/_server.ts.js-zCsm8UJT.js +51 -0
  465. package/build/server/chunks/entries/endpoints/api/tasks/_id_/diff/_server.ts.js-ccyEPbua.js +39 -0
  466. package/build/server/chunks/entries/endpoints/api/tasks/_id_/output/_server.ts.js-eZPQtK6T.js +84 -0
  467. package/build/server/chunks/entries/endpoints/api/tasks/_id_/preview/_server.ts.js-CW76hSLW.js +102 -0
  468. package/build/server/chunks/entries/endpoints/api/tasks/_id_/review/_server.ts.js-Cjuig1dr.js +34 -0
  469. package/build/server/chunks/entries/endpoints/api/tasks/_id_/review/ask/_server.ts.js-C04r1OFS.js +40 -0
  470. package/build/server/chunks/entries/endpoints/api/tasks/_id_/review/check/_server.ts.js-Ca5VNJtJ.js +39 -0
  471. package/build/server/chunks/entries/endpoints/api/tasks/_id_/review/guide/_server.ts.js-BKLIKSUM.js +39 -0
  472. package/build/server/chunks/entries/endpoints/api/tasks/_id_/review/runs/_run_/stop/_server.ts.js-C-D9zXgK.js +32 -0
  473. package/build/server/chunks/entries/fallbacks/error.svelte.js-DlN_tCrh.js +15 -0
  474. package/build/server/chunks/entries/hooks.server.js-Cgq1_RNe.js +40 -0
  475. package/build/server/chunks/entries/pages/_layout.server.ts.js-B7EWMhm1.js +20 -0
  476. package/build/server/chunks/entries/pages/_layout.svelte.js-BJuZaosz.js +10454 -0
  477. package/build/server/chunks/entries/pages/_page.server.ts.js-CrjekE3C.js +16 -0
  478. package/build/server/chunks/entries/pages/_page.svelte.js-BI4c5H0n.js +3699 -0
  479. package/build/server/chunks/entries/pages/decisions/_page.server.ts.js-Olm_zS-k.js +11 -0
  480. package/build/server/chunks/entries/pages/decisions/_page.svelte.js-ClTz3O_K.js +167 -0
  481. package/build/server/chunks/entries/pages/harbour/_page.server.ts.js-CVhhNUGy.js +20 -0
  482. package/build/server/chunks/entries/pages/harbour/_page.svelte.js-43FRNSVK.js +1346 -0
  483. package/build/server/chunks/entries/pages/headroom/_page.server.ts.js-Bv8GukD1.js +11 -0
  484. package/build/server/chunks/entries/pages/headroom/_page.svelte.js-zmKQdAwy.js +135 -0
  485. package/build/server/chunks/entries/pages/inbox/_page.svelte.js-wTvAFPNM.js +175 -0
  486. package/build/server/chunks/entries/pages/plugins/_plugin_/_page_/_page.server.ts.js-BJRmRxez.js +15 -0
  487. package/build/server/chunks/entries/pages/plugins/_plugin_/_page_/_page.svelte.js-DfAqJJ3i.js +55 -0
  488. package/build/server/chunks/entries/pages/projects/_id_/_plugin_/_tab_/_page.server.ts.js-DawJ61h-.js +15 -0
  489. package/build/server/chunks/entries/pages/projects/_id_/_plugin_/_tab_/_page.svelte.js-B472Pugu.js +66 -0
  490. package/build/server/chunks/entries/pages/projects/_id_/passage/_page.server.ts.js-Cm-4qkeb.js +14 -0
  491. package/build/server/chunks/entries/pages/projects/_id_/passage/_page.svelte.js-CWjEArXY.js +394 -0
  492. package/build/server/chunks/entries/pages/projects/_id_/passage/edit/_page.server.ts.js-DWNW8L5o.js +15 -0
  493. package/build/server/chunks/entries/pages/projects/_id_/passage/edit/_page.svelte.js-iHacn81K.js +1859 -0
  494. package/build/server/chunks/entries/pages/projects/_page.server.ts.js-BVDM5Frg.js +37 -0
  495. package/build/server/chunks/entries/pages/projects/_page.svelte.js-B_NQ-Wg3.js +270 -0
  496. package/build/server/chunks/entries/pages/spec/_page.server.ts.js-B3atEUDm.js +31 -0
  497. package/build/server/chunks/entries/pages/spec/_page.svelte.js-BJjweG9u.js +1561 -0
  498. package/build/server/chunks/entries/pages/tasks/_id_/_page.server.ts.js-BDQIO7Ft.js +25 -0
  499. package/build/server/chunks/entries/pages/tasks/_id_/_page.svelte.js-Dr2wwDJG.js +2063 -0
  500. package/build/server/chunks/entries/pages/tasks/_id_/doc/_page.server.ts.js-Bw-3fcQ6.js +24 -0
  501. package/build/server/chunks/entries/pages/tasks/_id_/doc/_page.svelte.js-DOyZ1QzI.js +145 -0
  502. package/build/server/chunks/entries/pages/tasks/_id_/review/_page.server.ts.js-CJek9uLa.js +15 -0
  503. package/build/server/chunks/entries/pages/tasks/_id_/review/_page.svelte.js-BDaRELgE.js +692 -0
  504. package/build/server/chunks/entries/pages/time/_page.server.ts.js-An6F-Ydg.js +11 -0
  505. package/build/server/chunks/entries/pages/time/_page.svelte.js-CSXGxvVs.js +107 -0
  506. package/build/server/chunks/handler-BnRz5A8m.js +1474 -0
  507. package/build/server/chunks/index.js-C8djlQGs.js +4296 -0
  508. package/build/server/chunks/manifest.js-YAglwkb0.js +434 -0
  509. package/build/server/chunks/nodes/0.js-lkzICUiD.js +32 -0
  510. package/build/server/chunks/nodes/1.js-BJHI215Q.js +9 -0
  511. package/build/server/chunks/nodes/10.js-BWB-fD67.js +33 -0
  512. package/build/server/chunks/nodes/11.js-DWkXu85W.js +33 -0
  513. package/build/server/chunks/nodes/12.js-CKTx5eRx.js +37 -0
  514. package/build/server/chunks/nodes/13.js-C9YUj8Wf.js +33 -0
  515. package/build/server/chunks/nodes/14.js-CvfRHrCy.js +33 -0
  516. package/build/server/chunks/nodes/15.js-D_eEoMQb.js +33 -0
  517. package/build/server/chunks/nodes/16.js-BQhgpvij.js +32 -0
  518. package/build/server/chunks/nodes/2.js-C-3t-e-a.js +32 -0
  519. package/build/server/chunks/nodes/3.js-DgwKYi6C.js +32 -0
  520. package/build/server/chunks/nodes/4.js-DRDQ1cZ6.js +34 -0
  521. package/build/server/chunks/nodes/5.js-Bn5aoN6C.js +32 -0
  522. package/build/server/chunks/nodes/6.js-lazTWxVv.js +9 -0
  523. package/build/server/chunks/nodes/7.js-PUjlFfxr.js +32 -0
  524. package/build/server/chunks/nodes/8.js-DYPhaWV-.js +34 -0
  525. package/build/server/chunks/nodes/9.js-C2q_Jaiu.js +32 -0
  526. package/build/shims.js +33 -0
  527. package/dist/cli.js +534 -0
  528. package/package.json +96 -5
@@ -0,0 +1,1859 @@
1
+ import { af as head, ai as attr, ak as stringify, aj as escape_html, aa as ensure_array_like, ah as attr_class, _ as derived, a5 as clsx, ae as spread_props, a6 as bind_props } from '../../../../../../chunks/index.js-Bn6j9diM.js';
2
+ import '../../../../../../chunks/exports.js-BZBK1HC9.js';
3
+ import '../../../../../../chunks/utils2.js-BQzn9ikS.js';
4
+ import '../../../../../../chunks/utils.js-DTSGDHlH.js';
5
+ import '../../../../../../chunks/root.js-CQzYN4Pu.js';
6
+ import { p as page } from '../../../../../../chunks/index2.js-CXaRTuov.js';
7
+ import { a as currentFleet } from '../../../../../../chunks/live.svelte.js-BRUTNc9D.js';
8
+ import { a as SvelteSet } from '../../../../../../chunks/index-server2.js-DMc-UvjC.js';
9
+ import { B as Button } from '../../../../../../chunks/button.js-HeBqLheH.js';
10
+ import { S as SESSION_HEADER } from '../../../../../../chunks/messages.js-CFyGKoqq.js';
11
+ import { parseDocument, isSeq, isScalar, isMap } from 'yaml';
12
+ import { s as shipPassageDraft, a as CHECK_WORDS, E as EVIDENCE_WORDS, F as FACT_WORDS, O as OUTCOMES, o as outcomeWords, C as COMMAND_BASE_ENV, b as CHECK_FIELDS } from '../../../../../../chunks/passage-meta.js-uvNUyJkg.js';
13
+ import { A as Arrow_left } from '../../../../../../chunks/arrow-left.js-6Yey35CE.js';
14
+ import { C as Circle_alert, S as Square_terminal } from '../../../../../../chunks/square-terminal.js-D5Z4Sl2-.js';
15
+ import { P as Plus, T as Trash, R as Rotate_ccw } from '../../../../../../chunks/trash.js-DYFbRevY.js';
16
+ import { X } from '../../../../../../chunks/x.js-tlds9Ooz.js';
17
+ import { A as Arrow_up } from '../../../../../../chunks/arrow-up.js-AhghNbhW.js';
18
+ import { A as Arrow_down } from '../../../../../../chunks/arrow-down.js-DXDJc9EE.js';
19
+ import { I as Icon } from '../../../../../../chunks/Icon.js-D7CY3joB.js';
20
+ import { C as Check } from '../../../../../../chunks/check.js-bmUhmMEz.js';
21
+ import { M as Minus } from '../../../../../../chunks/minus.js-bsfnwE-h.js';
22
+ import { C as Circle_dashed } from '../../../../../../chunks/circle-dashed.js-Bm3gZCXK.js';
23
+
24
+ function Circle_dot($$renderer, $$props) {
25
+ let { $$slots, $$events, ...props } = $$props;
26
+ const iconData = {
27
+ "name": "circle-dot",
28
+ "size": 24,
29
+ "node": [
30
+ ["circle", { "cx": "12", "cy": "12", "r": "1" }],
31
+ ["circle", { "cx": "12", "cy": "12", "r": "10" }]
32
+ ]
33
+ };
34
+ Icon($$renderer, spread_props([props, { icon: iconData }]));
35
+ }
36
+ function Flask_conical($$renderer, $$props) {
37
+ let { $$slots, $$events, ...props } = $$props;
38
+ const iconData = {
39
+ "name": "flask-conical",
40
+ "size": 24,
41
+ "node": [
42
+ [
43
+ "path",
44
+ {
45
+ "d": "M14 2v6a2 2 0 0 0 .245.96l5.51 10.08A2 2 0 0 1 18 22H6a2 2 0 0 1-1.755-2.96l5.51-10.08A2 2 0 0 0 10 8V2"
46
+ }
47
+ ],
48
+ ["path", { "d": "M6.453 15h11.094" }],
49
+ ["path", { "d": "M8.5 2h7" }]
50
+ ]
51
+ };
52
+ Icon($$renderer, spread_props([props, { icon: iconData }]));
53
+ }
54
+ function Play($$renderer, $$props) {
55
+ let { $$slots, $$events, ...props } = $$props;
56
+ const iconData = {
57
+ "name": "play",
58
+ "size": 24,
59
+ "node": [
60
+ [
61
+ "path",
62
+ {
63
+ "d": "M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z"
64
+ }
65
+ ]
66
+ ]
67
+ };
68
+ Icon($$renderer, spread_props([props, { icon: iconData }]));
69
+ }
70
+ function diffLines(a, b) {
71
+ let start = 0;
72
+ while (start < a.length && start < b.length && a[start] === b[start]) start++;
73
+ let endA = a.length;
74
+ let endB = b.length;
75
+ while (endA > start && endB > start && a[endA - 1] === b[endB - 1]) {
76
+ endA--;
77
+ endB--;
78
+ }
79
+ const n = endA - start;
80
+ const m = endB - start;
81
+ const w = m + 1;
82
+ const t = new Uint32Array((n + 1) * w);
83
+ for (let i2 = n - 1; i2 >= 0; i2--) {
84
+ for (let j2 = m - 1; j2 >= 0; j2--) {
85
+ t[i2 * w + j2] = a[start + i2] === b[start + j2] ? t[(i2 + 1) * w + j2 + 1] + 1 : Math.max(t[(i2 + 1) * w + j2], t[i2 * w + j2 + 1]);
86
+ }
87
+ }
88
+ const out = [];
89
+ for (let k = 0; k < start; k++) out.push({ op: " ", text: a[k], from: k });
90
+ let i = 0;
91
+ let j = 0;
92
+ while (i < n || j < m) {
93
+ if (i < n && j < m && a[start + i] === b[start + j]) {
94
+ out.push({ op: " ", text: a[start + i], from: start + i });
95
+ i++;
96
+ j++;
97
+ } else if (j < m && (i >= n || t[i * w + j + 1] >= t[(i + 1) * w + j])) {
98
+ out.push({ op: "+", text: b[start + j++] });
99
+ } else {
100
+ out.push({ op: "-", text: a[start + i++] });
101
+ }
102
+ }
103
+ for (let k = endA; k < a.length; k++) out.push({ op: " ", text: a[k], from: k });
104
+ return out;
105
+ }
106
+ const linesOf = (text) => {
107
+ const l = text.split("\n");
108
+ if (l.length && l[l.length - 1] === "") l.pop();
109
+ return l;
110
+ };
111
+ const starterText = (track = "ship") => `version: 1
112
+ extends: ${track}
113
+ `;
114
+ function load(text) {
115
+ const doc = parseDocument(text || starterText(), { uniqueKeys: true });
116
+ return {
117
+ doc,
118
+ error: doc.errors.length ? doc.errors[0].message.split("\n")[0] : null
119
+ };
120
+ }
121
+ function model(text) {
122
+ const { doc, error } = load(text);
123
+ if (error) return null;
124
+ let js;
125
+ try {
126
+ js = doc.toJS({ maxAliasCount: 0 });
127
+ } catch {
128
+ return null;
129
+ }
130
+ const o = js && typeof js === "object" && !Array.isArray(js) ? js : {};
131
+ const checks = o.checks && typeof o.checks === "object" && !Array.isArray(o.checks) ? o.checks : {};
132
+ const stages = Array.isArray(o.stages) ? o.stages.filter((s) => s && typeof s === "object") : [];
133
+ return { extends: o.extends === "scout" ? "scout" : "ship", checks, stages };
134
+ }
135
+ function listSteps(base, stages) {
136
+ const steps = base.steps.map((s) => ({
137
+ id: s.id,
138
+ label: s.label,
139
+ added: false,
140
+ fileIndex: null,
141
+ restyled: false,
142
+ lost: false
143
+ }));
144
+ const lastAfter = /* @__PURE__ */ new Map();
145
+ stages.forEach((s, i) => {
146
+ if (typeof s.id !== "string" || !s.id) return;
147
+ const label = typeof s.label === "string" && s.label ? s.label : null;
148
+ const existing = steps.find((x) => x.id === s.id);
149
+ if (existing) {
150
+ if (existing.added) return;
151
+ existing.fileIndex = i;
152
+ existing.restyled = true;
153
+ if (label) existing.label = label;
154
+ return;
155
+ }
156
+ let at = steps.length;
157
+ let lost = false;
158
+ if (typeof s.after === "string" && s.after) {
159
+ const anchor = lastAfter.get(s.after) ?? s.after;
160
+ const j = steps.findIndex((x) => x.id === anchor);
161
+ if (j < 0) lost = true;
162
+ else at = j + 1;
163
+ lastAfter.set(s.after, s.id);
164
+ }
165
+ steps.splice(at, 0, {
166
+ id: s.id,
167
+ label: label ?? s.id,
168
+ added: true,
169
+ fileIndex: i,
170
+ restyled: false,
171
+ lost
172
+ });
173
+ });
174
+ return steps;
175
+ }
176
+ function stagesSeq(doc) {
177
+ let seq = doc.get("stages", true);
178
+ if (!isSeq(seq)) {
179
+ seq = doc.createNode([]);
180
+ doc.set("stages", seq);
181
+ }
182
+ return seq;
183
+ }
184
+ const keyOf = (k) => isScalar(k) ? k.value : k;
185
+ function checksMap(doc) {
186
+ let map = doc.get("checks", true);
187
+ if (!isMap(map)) {
188
+ map = doc.createNode({});
189
+ doc.set("checks", map);
190
+ const contents = doc.contents;
191
+ const items = contents.items;
192
+ const ci = items.findIndex((p) => keyOf(p.key) === "checks");
193
+ const si = items.findIndex((p) => keyOf(p.key) === "stages");
194
+ if (si >= 0 && ci > si) items.splice(si, 0, ...items.splice(ci, 1));
195
+ }
196
+ return map;
197
+ }
198
+ const empty = (v) => v === void 0 || v === null || v === "" || Array.isArray(v) && v.length === 0 || typeof v === "object" && !Array.isArray(v) && Object.keys(v).length === 0;
199
+ const OUT = { lineWidth: 0 };
200
+ function edit(text, fn) {
201
+ const { doc, error } = load(text);
202
+ if (error) return text;
203
+ const before = linesOf(doc.toString(OUT));
204
+ if (fn(doc) === false) return text;
205
+ const after = doc.toString(OUT);
206
+ const original = linesOf(text);
207
+ if (!text || original.length !== before.length) return after;
208
+ const out = diffLines(before, linesOf(after)).filter((d) => d.op !== "-").map((d) => d.op === " " ? original[d.from] : d.text);
209
+ return `${out.join("\n")}
210
+ `;
211
+ }
212
+ function setStageField(doc, index, key, value) {
213
+ const node = stagesSeq(doc).get(index, true);
214
+ if (!isMap(node)) return;
215
+ if (empty(value)) node.delete(key);
216
+ else node.set(key, node_(doc, value));
217
+ }
218
+ function node_(doc, value) {
219
+ const n = doc.createNode(value);
220
+ if (isSeq(n) && n.items.every((x) => isScalar(x))) n.flow = true;
221
+ return n;
222
+ }
223
+ function entryFor(doc, id) {
224
+ const seq = stagesSeq(doc);
225
+ const i = seq.items.findIndex((n) => isMap(n) && n.get("id") === id);
226
+ if (i >= 0) return i;
227
+ seq.add(doc.createNode({ id }));
228
+ return seq.items.length - 1;
229
+ }
230
+ function removeStage(doc, index) {
231
+ stagesSeq(doc).delete(index);
232
+ }
233
+ function slug(name, taken, fallback = "step") {
234
+ const used = new Set(taken);
235
+ let base = name.toLowerCase().normalize("NFKD").replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 32) || fallback;
236
+ if (!/^[a-z]/.test(base)) base = `${fallback}-${base}`.slice(0, 32);
237
+ let id = base;
238
+ for (let n = 2; used.has(id); n++) id = `${base}-${n}`;
239
+ return id;
240
+ }
241
+ function addStage(doc, stage, afterId) {
242
+ const seq = stagesSeq(doc);
243
+ const s = { id: stage.id, label: stage.label };
244
+ if (afterId) s.after = afterId;
245
+ for (const [k, v] of Object.entries(stage)) if (!(k in s) && !empty(v)) s[k] = v;
246
+ const n = doc.createNode(s);
247
+ for (const p of n.items) {
248
+ if (isSeq(p.value) && p.value.items.every((x) => isScalar(x))) p.value.flow = true;
249
+ }
250
+ seq.add(n);
251
+ return seq.items.length - 1;
252
+ }
253
+ function placeStage(doc, base, id, index) {
254
+ const js = doc.toJS();
255
+ const list = listSteps(base, Array.isArray(js?.stages) ? js.stages : []);
256
+ const i = list.findIndex((s) => s.id === id);
257
+ if (i < 0 || !list[i].added || index < 1 || index >= list.length || index === i) return false;
258
+ const [moved] = list.splice(i, 1);
259
+ list.splice(index, 0, moved);
260
+ const seq = stagesSeq(doc);
261
+ const byId = /* @__PURE__ */ new Map();
262
+ for (const n of seq.items) if (isMap(n)) byId.set(String(n.get("id")), n);
263
+ const kept = seq.items.filter((n) => {
264
+ const nid = isMap(n) ? String(n.get("id")) : "";
265
+ return !list.some((s) => s.added && s.id === nid);
266
+ });
267
+ const added = list.map((s, k) => ({ s, prev: list[k - 1] })).filter(({ s }) => s.added).map(({ s, prev }) => {
268
+ const n = byId.get(s.id);
269
+ n.set("after", prev.id);
270
+ return n;
271
+ });
272
+ seq.items = [...kept, ...added];
273
+ return true;
274
+ }
275
+ function moveStage(doc, base, id, delta) {
276
+ const js = doc.toJS();
277
+ const list = listSteps(base, Array.isArray(js?.stages) ? js.stages : []);
278
+ const i = list.findIndex((s) => s.id === id);
279
+ return i >= 0 && placeStage(doc, base, id, i + delta);
280
+ }
281
+ function setCheck(doc, id, spec) {
282
+ const map = checksMap(doc);
283
+ if (spec === null) {
284
+ map.delete(id);
285
+ if (!map.items.length) doc.delete("checks");
286
+ return;
287
+ }
288
+ const clean = {};
289
+ for (const [k, v] of Object.entries(spec)) {
290
+ if (v && typeof v === "object" && !Array.isArray(v)) {
291
+ const inner = Object.fromEntries(Object.entries(v).filter(([, x]) => !empty(x)));
292
+ if (!empty(inner)) clean[k] = inner;
293
+ } else if (!empty(v)) clean[k] = v;
294
+ }
295
+ const existing = map.get(id, true);
296
+ if (isMap(existing)) {
297
+ for (const k of [...existing.items.map((p) => String(keyOf(p.key)))]) {
298
+ if (!(k in clean)) existing.delete(k);
299
+ }
300
+ const now = existing.toJSON();
301
+ for (const [k, v] of Object.entries(clean)) {
302
+ if (JSON.stringify(now[k]) !== JSON.stringify(v)) existing.set(k, node_(doc, v));
303
+ }
304
+ } else {
305
+ const n = doc.createNode(clean);
306
+ for (const p of n.items) {
307
+ if (isSeq(p.value) && p.value.items.every((x) => isScalar(x))) p.value.flow = true;
308
+ }
309
+ map.set(id, n);
310
+ }
311
+ }
312
+ function setTop(doc, key, value) {
313
+ if (empty(value)) doc.delete(key);
314
+ else doc.set(key, doc.createNode(value));
315
+ }
316
+ function refsTo(stages, checkId) {
317
+ const out = [];
318
+ const walk = (c) => {
319
+ if (typeof c === "string" && c.startsWith(`${checkId}.`)) out.push(c);
320
+ else if (c && typeof c === "object") for (const v of Object.values(c)) walk(v);
321
+ };
322
+ for (const s of stages) {
323
+ walk(s.reached_when);
324
+ walk(s.failed_when);
325
+ walk(s.skip_when);
326
+ if (s.note && typeof s.note === "object") walk(s.note.when);
327
+ if (Array.isArray(s.evidence) && s.evidence.includes(`check:${checkId}`))
328
+ out.push(`check:${checkId}`);
329
+ if (s.primary_link === `${checkId}.url`) out.push(`${checkId}.url`);
330
+ }
331
+ return out;
332
+ }
333
+ function toBuilder(c) {
334
+ if (c === void 0 || c === null) return { join: "all", items: [] };
335
+ const item = (x) => {
336
+ if (typeof x === "string") return { not: false, ref: x };
337
+ if (x && typeof x === "object" && "not" in x && typeof x.not === "string")
338
+ return { not: true, ref: x.not };
339
+ return null;
340
+ };
341
+ const one = item(c);
342
+ if (one) return { join: "all", items: [one] };
343
+ if (typeof c !== "object") return null;
344
+ const join = "all" in c ? "all" : "any" in c ? "any" : null;
345
+ if (!join) return null;
346
+ const list = c[join];
347
+ if (!Array.isArray(list)) return null;
348
+ const items = list.map((x) => item(x));
349
+ return items.every((x) => x) ? { join, items } : null;
350
+ }
351
+ function fromBuilder(b) {
352
+ const items = b.items.filter((x) => x.ref);
353
+ const one = (x) => x.not ? { not: x.ref } : x.ref;
354
+ if (!items.length) return void 0;
355
+ if (items.length === 1) return one(items[0]);
356
+ return b.join === "all" ? { all: items.map(one) } : { any: items.map(one) };
357
+ }
358
+ const labelOf = (v, id) => typeof v === "string" && v ? v : id;
359
+ function summarize(beforeText, afterText, base) {
360
+ const a = model(beforeText) ?? { extends: "ship", checks: {}, stages: [] };
361
+ const b = model(afterText);
362
+ if (!b) return ["The YAML could not be read."];
363
+ const out = [];
364
+ if (a.extends !== b.extends)
365
+ out.push(`It now builds on ${b.extends === "scout" ? "scout" : "ship"} work.`);
366
+ const before = new Map(listSteps(base, a.stages).map((s) => [s.id, s]));
367
+ const after = listSteps(base, b.stages);
368
+ const stageOf = (m, id) => m.stages.find((s) => s.id === id);
369
+ after.forEach((s, i) => {
370
+ const old = before.get(s.id);
371
+ const prev = after[i - 1]?.label;
372
+ if (s.added && !old?.added)
373
+ out.push(`Adds the step “${s.label}”${prev ? ` after ${prev}` : ""}.`);
374
+ else if (old && old.label !== s.label) out.push(`Renames “${old.label}” to “${s.label}”.`);
375
+ else if (old && JSON.stringify(stageOf(a, s.id) ?? null) !== JSON.stringify(stageOf(b, s.id) ?? null))
376
+ out.push(`Changes the step “${s.label}”.`);
377
+ });
378
+ for (const [id, s] of before) {
379
+ if (s.added && !after.some((x) => x.id === id)) out.push(`Removes the step “${s.label}”.`);
380
+ }
381
+ const ids = /* @__PURE__ */ new Set([...Object.keys(a.checks), ...Object.keys(b.checks)]);
382
+ let commands = false;
383
+ for (const id of ids) {
384
+ const x = a.checks[id];
385
+ const y = b.checks[id];
386
+ if (JSON.stringify(x ?? null) === JSON.stringify(y ?? null)) continue;
387
+ if (x?.type === "command" || y?.type === "command") commands = true;
388
+ if (!x) out.push(`Adds the check “${labelOf(y.label, id)}”.`);
389
+ else if (!y) out.push(`Removes the check “${labelOf(x.label, id)}”.`);
390
+ else out.push(`Changes the check “${labelOf(y.label, id)}”.`);
391
+ }
392
+ if (commands)
393
+ out.push(
394
+ "Command checks change, so they stay off until you allow them again on the passage page."
395
+ );
396
+ if (!out.length && beforeText !== afterText)
397
+ out.push("Changes the file’s layout or comments only.");
398
+ return out;
399
+ }
400
+ function CheckForm($$renderer, $$props) {
401
+ $$renderer.component(($$renderer2) => {
402
+ let {
403
+ checkId,
404
+ spec,
405
+ readonly = false,
406
+ readonlyWhy = null,
407
+ captain,
408
+ releaseChecks,
409
+ usedBy,
410
+ onchange,
411
+ back = null,
412
+ onremove
413
+ /** Return to the step this check was opened from. */
414
+ } = $$props;
415
+ const type = derived(() => spec.type);
416
+ const words = derived(() => CHECK_WORDS[type()] ?? { name: String(spec.type), what: "" });
417
+ const fields = derived(() => (CHECK_FIELDS[type()] ?? []).filter((f) => !f.captainOnly || captain));
418
+ function get(key) {
419
+ const [a, b] = key.split(".");
420
+ const v = spec[a];
421
+ return b ? v && typeof v === "object" ? v[b] : void 0 : v;
422
+ }
423
+ function put(key, value) {
424
+ const [a, b] = key.split(".");
425
+ const next = { ...spec };
426
+ if (b) {
427
+ const inner = { ...next[a] ?? {} };
428
+ inner[b] = value;
429
+ next[a] = inner;
430
+ } else next[a] = value;
431
+ onchange(next);
432
+ }
433
+ const text = (v) => v === void 0 || v === null ? "" : String(v);
434
+ const lines = (v) => Array.isArray(v) ? v.map(String).join("\n") : text(v);
435
+ const mapText = (v) => v && typeof v === "object" ? Object.entries(v).map(([k, x]) => `${k}: ${x}`).join("\n") : "";
436
+ const shown = (run) => Array.isArray(run) ? run.map((a) => String(a)).map((a) => /^[A-Za-z0-9_@%+=:,./-]+$/.test(a) ? a : `'${a.replace(/'/g, `'\\''`)}'`).join(" ") : "";
437
+ const WHEN = {
438
+ merged: "After the merge",
439
+ "pr.recorded": "Once a pull request is open",
440
+ "crew.done": "Once the worker reports done"
441
+ };
442
+ function whenText(sp) {
443
+ const when = sp.when === void 0 ? "As soon as a task can use it, even before the merge" : WHEN[String(sp.when)] ?? "When its condition holds";
444
+ const per = sp.ref === "merge.commit" ? ", once per merged commit" : sp.ref === "pr.head" ? ", once per pull request commit" : "";
445
+ return `${when}${per}. A pass is not run again.`;
446
+ }
447
+ const inputClass = "mt-1 w-full rounded-md border border-input bg-card px-3 py-1.5 text-sm disabled:opacity-60";
448
+ function field($$renderer3, f) {
449
+ const fid = `check-${checkId}-${f.key}`;
450
+ $$renderer3.push(`<div class="min-w-0"><label${attr("for", fid)} class="block text-sm font-medium">${escape_html(f.label)}`);
451
+ if (f.required) {
452
+ $$renderer3.push(`<!--[0--><span class="ml-1 font-normal text-muted-foreground">(required)</span>`);
453
+ } else {
454
+ $$renderer3.push("<!--[-1-->");
455
+ }
456
+ $$renderer3.push(`<!--]--></label> `);
457
+ if (f.kind === "select") {
458
+ $$renderer3.push("<!--[0-->");
459
+ const cur = text(get(f.key));
460
+ $$renderer3.select(
461
+ {
462
+ id: fid,
463
+ class: inputClass,
464
+ disabled: readonly,
465
+ value: text(get(f.key)),
466
+ onchange: (e) => {
467
+ const v = e.currentTarget.value;
468
+ if (v !== cur || typeof get(f.key) === "string" || !v) put(f.key, v || void 0);
469
+ }
470
+ },
471
+ ($$renderer4) => {
472
+ if (!f.required) {
473
+ $$renderer4.push("<!--[0-->");
474
+ $$renderer4.option({ value: "" }, ($$renderer5) => {
475
+ $$renderer5.push(`Not set`);
476
+ });
477
+ } else {
478
+ $$renderer4.push("<!--[-1-->");
479
+ }
480
+ $$renderer4.push(`<!--]-->`);
481
+ if (get(f.key) !== void 0 && typeof get(f.key) !== "string") {
482
+ $$renderer4.push("<!--[0-->");
483
+ $$renderer4.option({ value: cur }, ($$renderer5) => {
484
+ $$renderer5.push(`As written in the YAML`);
485
+ });
486
+ } else if (cur && !(f.options ?? []).some((o) => o.value === cur)) {
487
+ $$renderer4.push("<!--[1-->");
488
+ $$renderer4.option({ value: cur }, ($$renderer5) => {
489
+ $$renderer5.push(`${escape_html(cur)}`);
490
+ });
491
+ } else {
492
+ $$renderer4.push("<!--[-1-->");
493
+ }
494
+ $$renderer4.push(`<!--]--><!--[-->`);
495
+ const each_array = ensure_array_like(f.options ?? []);
496
+ for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
497
+ let o = each_array[$$index];
498
+ $$renderer4.option({ value: o.value }, ($$renderer5) => {
499
+ $$renderer5.push(`${escape_html(o.label)}`);
500
+ });
501
+ }
502
+ $$renderer4.push(`<!--]-->`);
503
+ }
504
+ );
505
+ } else if (f.kind === "check") {
506
+ $$renderer3.push("<!--[1-->");
507
+ $$renderer3.select(
508
+ {
509
+ id: fid,
510
+ class: inputClass,
511
+ disabled: readonly,
512
+ value: text(get(f.key)),
513
+ onchange: (e) => put(f.key, e.currentTarget.value || void 0)
514
+ },
515
+ ($$renderer4) => {
516
+ $$renderer4.option({ value: "" }, ($$renderer5) => {
517
+ $$renderer5.push(`Choose a release check`);
518
+ });
519
+ $$renderer4.push(`<!--[-->`);
520
+ const each_array_1 = ensure_array_like(releaseChecks);
521
+ for (let $$index_1 = 0, $$length = each_array_1.length; $$index_1 < $$length; $$index_1++) {
522
+ let c = each_array_1[$$index_1];
523
+ $$renderer4.option({ value: c.id }, ($$renderer5) => {
524
+ $$renderer5.push(`${escape_html(c.label)}`);
525
+ });
526
+ }
527
+ $$renderer4.push(`<!--]-->`);
528
+ }
529
+ );
530
+ } else if (f.kind === "list") {
531
+ $$renderer3.push(`<!--[2--><textarea${attr("id", fid)}${attr("rows", Math.max(2, get(f.key)?.length ?? 2))} class="mt-1 w-full rounded-md border border-input bg-card px-3 py-1.5 text-sm disabled:opacity-60 font-mono"${attr("disabled", readonly, true)}>`);
532
+ const $$body = escape_html(lines(get(f.key)));
533
+ if ($$body) {
534
+ $$renderer3.push(`${$$body}`);
535
+ }
536
+ $$renderer3.push(`</textarea>`);
537
+ } else if (f.kind === "map") {
538
+ $$renderer3.push(`<!--[3--><textarea${attr("id", fid)} rows="2" class="mt-1 w-full rounded-md border border-input bg-card px-3 py-1.5 text-sm disabled:opacity-60 font-mono"${attr("disabled", readonly, true)}>`);
539
+ const $$body_1 = escape_html(mapText(get(f.key)));
540
+ if ($$body_1) {
541
+ $$renderer3.push(`${$$body_1}`);
542
+ }
543
+ $$renderer3.push(`</textarea>`);
544
+ } else if (f.kind === "number") {
545
+ $$renderer3.push(`<!--[4--><input${attr("id", fid)} type="number"${attr_class(clsx(inputClass))}${attr("disabled", readonly, true)}${attr("placeholder", f.placeholder)}${attr("value", text(get(f.key)))}/>`);
546
+ } else {
547
+ $$renderer3.push(`<!--[-1--><input${attr("id", fid)}${attr_class(`mt-1 w-full rounded-md border border-input bg-card px-3 py-1.5 text-sm disabled:opacity-60 ${f.kind === "duration" ? "max-w-40" : ""}`)}${attr("disabled", readonly, true)}${attr("placeholder", f.placeholder)}${attr("value", text(get(f.key)))}/>`);
548
+ }
549
+ $$renderer3.push(`<!--]--> `);
550
+ if (f.help) {
551
+ $$renderer3.push(`<!--[0--><p class="mt-1 text-xs text-muted-foreground">${escape_html(f.help)}</p>`);
552
+ } else {
553
+ $$renderer3.push("<!--[-1-->");
554
+ }
555
+ $$renderer3.push(`<!--]--></div>`);
556
+ }
557
+ $$renderer2.push(`<section${attr("aria-labelledby", `check-${stringify(checkId)}-title`)}${attr("data-check-form", checkId)}>`);
558
+ if (back) {
559
+ $$renderer2.push(`<!--[0--><button type="button" class="mb-3 inline-flex items-center gap-1 text-sm text-sea hover:underline">`);
560
+ Arrow_left($$renderer2, { class: "size-3.5", "aria-hidden": "true" });
561
+ $$renderer2.push(`<!---->Back to ${escape_html(back.label)}</button>`);
562
+ } else {
563
+ $$renderer2.push("<!--[-1-->");
564
+ }
565
+ $$renderer2.push(`<!--]--> <p class="text-xs tracking-wide text-muted-foreground uppercase">${escape_html(words().name)}</p> <h2${attr("id", `check-${stringify(checkId)}-title`)} class="mt-0.5 text-xl">${escape_html(text(spec.label) || checkId)}</h2> <p class="mt-1 text-sm text-muted-foreground">${escape_html(words().what)}</p> `);
566
+ if (readonlyWhy) {
567
+ $$renderer2.push(`<!--[0--><p class="mt-2 text-sm text-muted-foreground">${escape_html(readonlyWhy)}</p>`);
568
+ } else {
569
+ $$renderer2.push("<!--[-1-->");
570
+ }
571
+ $$renderer2.push(`<!--]--> <div class="mt-5 grid gap-4 sm:grid-cols-2"><div class="min-w-0 sm:col-span-2"><label${attr("for", `check-${stringify(checkId)}-label`)} class="block text-sm font-medium">Name</label> <input${attr("id", `check-${stringify(checkId)}-label`)}${attr_class(clsx(inputClass))}${attr("disabled", readonly, true)}${attr("value", text(spec.label))}${attr("placeholder", checkId)}/></div> <!--[-->`);
572
+ const each_array_2 = ensure_array_like(fields());
573
+ for (let $$index_2 = 0, $$length = each_array_2.length; $$index_2 < $$length; $$index_2++) {
574
+ let f = each_array_2[$$index_2];
575
+ $$renderer2.push(`<div${attr_class(clsx(f.kind === "list" || f.key === "url" ? "sm:col-span-2" : ""))}>`);
576
+ field($$renderer2, f);
577
+ $$renderer2.push(`<!----></div>`);
578
+ }
579
+ $$renderer2.push(`<!--]--> `);
580
+ if (type() !== "status.note") {
581
+ $$renderer2.push(`<!--[0--><div><label${attr("for", `check-${stringify(checkId)}-interval`)} class="block text-sm font-medium">How often</label> <input${attr("id", `check-${stringify(checkId)}-interval`)} class="mt-1 w-full rounded-md border border-input bg-card px-3 py-1.5 text-sm disabled:opacity-60 max-w-40"${attr("disabled", readonly, true)}${attr("placeholder", type() === "command" ? "10m" : type() === "github.release" || type() === "npm.published" ? "5m" : "60s")}${attr("value", text(spec.interval))}/> <p class="mt-1 text-xs text-muted-foreground">At least 30s, e.g. 60s, 5m or 1h.</p></div>`);
582
+ } else {
583
+ $$renderer2.push("<!--[-1-->");
584
+ }
585
+ $$renderer2.push(`<!--]--></div> `);
586
+ if (type() === "command") {
587
+ $$renderer2.push(`<!--[0--><div class="mt-6 rounded-lg border bg-panel p-4 text-sm" data-command-preview=""><p class="flex items-center gap-2 font-medium">`);
588
+ Square_terminal($$renderer2, { class: "size-4", "aria-hidden": "true" });
589
+ $$renderer2.push(`<!---->Exactly what will run</p> <pre class="mt-2 overflow-x-auto rounded-md bg-terminal px-3 py-2 font-mono text-xs text-terminal-foreground">${escape_html(shown(spec.run) || "(no program yet)")}</pre> <dl class="mt-3 grid gap-x-4 gap-y-1 text-xs sm:grid-cols-[9rem_minmax(0,1fr)]"><dt class="text-muted-foreground">In the folder</dt> <dd>${escape_html(text(spec.cwd) && spec.cwd !== "." ? `${spec.cwd}, inside the project` : "At the top of the project")}, in a fresh checkout of ${escape_html(spec.ref === "merge.commit" ? "the merge commit" : spec.ref === "pr.head" ? "the pull request’s latest commit" : "the default branch")}</dd> <dt class="text-muted-foreground">For at most</dt> <dd>${escape_html(text(spec.timeout) || "5m")}</dd> <dt class="text-muted-foreground">With only</dt> <dd class="break-words">${escape_html([...COMMAND_BASE_ENV, ...spec.env ?? []].join(", "))} from Wheelhouse’s
590
+ environment, plus the task and project names</dd> <dt class="text-muted-foreground">When</dt> <dd>${escape_html(whenText(spec))}</dd></dl> <p class="mt-3 text-xs text-muted-foreground">It never goes through a shell. Command checks run only after you allow them on the project’s
591
+ passage page, and changing a command line turns them off again. Allowing them trusts the
592
+ project’s own scripts as they are at that commit: consent covers the command line, not the
593
+ scripts it calls, which can change through merged pull requests without turning the commands
594
+ off.</p> <p class="mt-2 text-xs text-muted-foreground">Each run gets a fresh checkout with no installed dependencies and none of the clone’s
595
+ untracked files (such as .env), so the command must install what it needs.</p></div>`);
596
+ } else {
597
+ $$renderer2.push("<!--[-1-->");
598
+ }
599
+ $$renderer2.push(`<!--]--> `);
600
+ if (!readonly) {
601
+ $$renderer2.push(`<!--[0--><div class="mt-6 flex flex-wrap items-center gap-3 border-t pt-4">`);
602
+ Button($$renderer2, {
603
+ variant: "destructive",
604
+ size: "sm",
605
+ onclick: onremove,
606
+ children: ($$renderer3) => {
607
+ Trash($$renderer3, { "aria-hidden": "true" });
608
+ $$renderer3.push(`<!---->Remove this check`);
609
+ },
610
+ $$slots: { default: true }
611
+ });
612
+ $$renderer2.push(`<!----> `);
613
+ if (usedBy.length) {
614
+ $$renderer2.push(`<!--[0--><p class="text-xs text-muted-foreground">Used by ${escape_html(usedBy.join(", "))}; removing it takes it out of ${escape_html(usedBy.length === 1 ? "that step" : "those steps")}.</p>`);
615
+ } else {
616
+ $$renderer2.push("<!--[-1-->");
617
+ }
618
+ $$renderer2.push(`<!--]--></div>`);
619
+ } else {
620
+ $$renderer2.push("<!--[-1-->");
621
+ }
622
+ $$renderer2.push(`<!--]--></section>`);
623
+ });
624
+ }
625
+ function ReviewDialog($$renderer, $$props) {
626
+ $$renderer.component(($$renderer2) => {
627
+ let {
628
+ open = false,
629
+ before,
630
+ after,
631
+ summary,
632
+ target,
633
+ defaultRef,
634
+ busy,
635
+ error,
636
+ onsave
637
+ /** What the edit changes, in plain sentences. */
638
+ } = $$props;
639
+ const lines = derived(() => open ? diffLines(linesOf(before), linesOf(after)) : []);
640
+ const added = derived(() => lines().filter((l) => l.op === "+").length);
641
+ const removed = derived(() => lines().filter((l) => l.op === "-").length);
642
+ const branch = derived(() => defaultRef?.replace(/^origin\//, "") ?? "the default branch");
643
+ $$renderer2.push(`<dialog class="m-auto max-h-[90vh] w-[min(94vw,980px)] max-w-none overflow-hidden rounded-xl border bg-background p-0 text-foreground shadow-xl backdrop:bg-black/60" aria-labelledby="review-title">`);
644
+ if (open) {
645
+ $$renderer2.push(`<!--[0--><div class="flex max-h-[90vh] flex-col"><div class="flex items-start gap-3 border-b px-5 py-4"><div class="min-w-0 flex-1"><h2 id="review-title" class="text-lg">Review and save</h2> <p class="mt-1 text-sm text-muted-foreground">The file: ${escape_html(added())} line${escape_html(added() === 1 ? "" : "s")} added, ${escape_html(removed())} removed.</p></div> <button type="button" class="inline-flex size-8 items-center justify-center rounded-md text-muted-foreground hover:bg-muted hover:text-foreground" aria-label="Close">`);
646
+ X($$renderer2, { class: "size-4", "aria-hidden": "true" });
647
+ $$renderer2.push(`<!----></button></div> `);
648
+ if (summary.length) {
649
+ $$renderer2.push(`<!--[0--><ul class="space-y-1 border-b px-5 py-3 text-sm" aria-label="What changes"><!--[-->`);
650
+ const each_array = ensure_array_like(summary);
651
+ for (let i = 0, $$length = each_array.length; i < $$length; i++) {
652
+ let line = each_array[i];
653
+ $$renderer2.push(`<li>${escape_html(line)}</li>`);
654
+ }
655
+ $$renderer2.push(`<!--]--></ul>`);
656
+ } else {
657
+ $$renderer2.push("<!--[-1-->");
658
+ }
659
+ $$renderer2.push(`<!--]--> <pre class="min-h-0 flex-1 overflow-auto bg-card px-0 py-2 font-mono text-xs leading-5" aria-label="Changes"><!--[-->`);
660
+ const each_array_1 = ensure_array_like(lines());
661
+ for (let i = 0, $$length = each_array_1.length; i < $$length; i++) {
662
+ let l = each_array_1[i];
663
+ $$renderer2.push(`<span${attr_class(`block px-5 ${l.op === "+" ? "bg-success/10 text-success" : l.op === "-" ? "bg-danger/10 text-danger" : "text-muted-foreground"}`)}><span class="mr-3 inline-block w-3 select-none" aria-hidden="true">${escape_html(l.op === " " ? "" : l.op)}</span><span class="sr-only">${escape_html(l.op === "+" ? "added: " : l.op === "-" ? "removed: " : "")}</span>${escape_html(l.text)}</span>`);
664
+ }
665
+ $$renderer2.push(`<!--]--></pre> <div class="border-t px-5 py-4"><p class="text-sm leading-relaxed" data-save-note="">`);
666
+ if (target === "project") {
667
+ $$renderer2.push(`<!--[0--><strong class="font-medium">This changes a file in the project’s repository:</strong> <code class="font-mono text-xs">.wheelhouse.yaml</code> in Firstmate’s clone of the
668
+ project. It is not committed. Wheelhouse uses it once it is on ${escape_html(branch())}, so ask
669
+ Firstmate to ship it.`);
670
+ } else {
671
+ $$renderer2.push(`<!--[-1--><strong class="font-medium">This changes your own Wheelhouse config</strong> for this project,
672
+ outside the repository. Wheelhouse uses it within a minute.`);
673
+ }
674
+ $$renderer2.push(`<!--]--></p> `);
675
+ if (error) {
676
+ $$renderer2.push(`<!--[0--><p class="mt-2 text-sm text-danger" role="alert">${escape_html(error)}</p>`);
677
+ } else {
678
+ $$renderer2.push("<!--[-1-->");
679
+ }
680
+ $$renderer2.push(`<!--]--> <div class="mt-4 flex flex-wrap justify-end gap-2">`);
681
+ Button($$renderer2, {
682
+ variant: "outline",
683
+ onclick: () => open = false,
684
+ children: ($$renderer3) => {
685
+ $$renderer3.push(`<!---->Keep editing`);
686
+ },
687
+ $$slots: { default: true }
688
+ });
689
+ $$renderer2.push(`<!----> `);
690
+ Button($$renderer2, {
691
+ disabled: busy || !added() && !removed(),
692
+ onclick: onsave,
693
+ children: ($$renderer3) => {
694
+ $$renderer3.push(`<!---->${escape_html(busy ? "Saving…" : target === "project" ? "Save to the repository file" : "Save to your config")}`);
695
+ },
696
+ $$slots: { default: true }
697
+ });
698
+ $$renderer2.push(`<!----></div></div></div>`);
699
+ } else {
700
+ $$renderer2.push("<!--[-1-->");
701
+ }
702
+ $$renderer2.push(`<!--]--></dialog>`);
703
+ bind_props($$props, { open });
704
+ });
705
+ }
706
+ function CondField($$renderer, $$props) {
707
+ $$renderer.component(($$renderer2) => {
708
+ let {
709
+ id,
710
+ label,
711
+ help = null,
712
+ value,
713
+ refs,
714
+ disabled = false,
715
+ onchange
716
+ } = $$props;
717
+ const b = derived(() => toBuilder(value));
718
+ const known = derived(() => new Set(refs.flatMap((g) => g.options.map((o) => o.value))));
719
+ function set(next) {
720
+ onchange(fromBuilder(next));
721
+ }
722
+ $$renderer2.push(`<fieldset class="min-w-0"${attr("aria-describedby", help ? `${id}-help` : void 0)}><legend class="text-sm font-medium">${escape_html(label)}</legend> `);
723
+ if (help) {
724
+ $$renderer2.push(`<!--[0--><p${attr("id", `${stringify(id)}-help`)} class="mt-0.5 text-xs text-muted-foreground">${escape_html(help)}</p>`);
725
+ } else {
726
+ $$renderer2.push("<!--[-1-->");
727
+ }
728
+ $$renderer2.push(`<!--]--> `);
729
+ if (b() === null) {
730
+ $$renderer2.push(`<!--[0--><p class="mt-2 rounded-md border border-dashed px-3 py-2 text-sm text-muted-foreground">This condition is more involved than the form shows. Edit it in the YAML view.</p>`);
731
+ } else {
732
+ $$renderer2.push("<!--[-1-->");
733
+ if (b().items.length > 1) {
734
+ $$renderer2.push(`<!--[0--><label class="mt-2 inline-flex items-center gap-2 text-sm"><span class="sr-only">How these combine</span> `);
735
+ $$renderer2.select(
736
+ {
737
+ class: "rounded-md border border-input bg-card px-2 py-1 text-sm",
738
+ value: b().join,
739
+ disabled,
740
+ onchange: (e) => set({ ...b(), join: e.currentTarget.value })
741
+ },
742
+ ($$renderer3) => {
743
+ $$renderer3.option({ value: "all" }, ($$renderer4) => {
744
+ $$renderer4.push(`All of these`);
745
+ });
746
+ $$renderer3.option({ value: "any" }, ($$renderer4) => {
747
+ $$renderer4.push(`Any of these`);
748
+ });
749
+ }
750
+ );
751
+ $$renderer2.push(`</label>`);
752
+ } else {
753
+ $$renderer2.push("<!--[-1-->");
754
+ }
755
+ $$renderer2.push(`<!--]--> <ul class="mt-2 space-y-2"><!--[-->`);
756
+ const each_array = ensure_array_like(b().items);
757
+ for (let i = 0, $$length = each_array.length; i < $$length; i++) {
758
+ let item = each_array[i];
759
+ $$renderer2.push(`<li class="flex flex-wrap items-center gap-2">`);
760
+ $$renderer2.select(
761
+ {
762
+ class: "rounded-md border border-input bg-card px-2 py-1 text-sm",
763
+ "aria-label": `${stringify(label)}: when`,
764
+ value: item.not ? "not" : "is",
765
+ disabled,
766
+ onchange: (e) => {
767
+ const items = [...b().items];
768
+ items[i] = { ...item, not: e.currentTarget.value === "not" };
769
+ set({ ...b(), items });
770
+ }
771
+ },
772
+ ($$renderer3) => {
773
+ $$renderer3.option({ value: "is" }, ($$renderer4) => {
774
+ $$renderer4.push(`When`);
775
+ });
776
+ $$renderer3.option({ value: "not" }, ($$renderer4) => {
777
+ $$renderer4.push(`Unless`);
778
+ });
779
+ }
780
+ );
781
+ $$renderer2.push(` `);
782
+ $$renderer2.select(
783
+ {
784
+ class: "min-w-0 flex-1 rounded-md border border-input bg-card px-2 py-1 text-sm",
785
+ "aria-label": `${stringify(label)}: condition ${stringify(i + 1)}`,
786
+ value: item.ref,
787
+ disabled,
788
+ onchange: (e) => {
789
+ const items = [...b().items];
790
+ items[i] = { ...item, ref: e.currentTarget.value };
791
+ set({ ...b(), items });
792
+ }
793
+ },
794
+ ($$renderer3) => {
795
+ if (!known().has(item.ref)) {
796
+ $$renderer3.push("<!--[0-->");
797
+ $$renderer3.option({ value: item.ref }, ($$renderer4) => {
798
+ $$renderer4.push(`${escape_html(item.ref)} (not known)`);
799
+ });
800
+ } else {
801
+ $$renderer3.push("<!--[-1-->");
802
+ }
803
+ $$renderer3.push(`<!--]--><!--[-->`);
804
+ const each_array_1 = ensure_array_like(refs);
805
+ for (let $$index_1 = 0, $$length2 = each_array_1.length; $$index_1 < $$length2; $$index_1++) {
806
+ let g = each_array_1[$$index_1];
807
+ $$renderer3.push(`<optgroup${attr("label", g.group)}><!--[-->`);
808
+ const each_array_2 = ensure_array_like(g.options);
809
+ for (let $$index = 0, $$length3 = each_array_2.length; $$index < $$length3; $$index++) {
810
+ let o = each_array_2[$$index];
811
+ $$renderer3.option({ value: o.value }, ($$renderer4) => {
812
+ $$renderer4.push(`${escape_html(o.label)}`);
813
+ });
814
+ }
815
+ $$renderer3.push(`<!--]--></optgroup>`);
816
+ }
817
+ $$renderer3.push(`<!--]-->`);
818
+ }
819
+ );
820
+ $$renderer2.push(` <button type="button" class="inline-flex size-8 items-center justify-center rounded-md text-muted-foreground hover:bg-muted hover:text-foreground" aria-label="Remove this condition"${attr("disabled", disabled, true)}>`);
821
+ X($$renderer2, { class: "size-4", "aria-hidden": "true" });
822
+ $$renderer2.push(`<!----></button></li>`);
823
+ }
824
+ $$renderer2.push(`<!--]--></ul> <button type="button" class="mt-2 inline-flex items-center gap-1 text-sm text-sea hover:underline disabled:opacity-50"${attr("disabled", disabled, true)}>`);
825
+ Plus($$renderer2, { class: "size-3.5", "aria-hidden": "true" });
826
+ $$renderer2.push(`<!---->${escape_html(b().items.length ? "Add another" : "Add a condition")}</button>`);
827
+ }
828
+ $$renderer2.push(`<!--]--></fieldset>`);
829
+ });
830
+ }
831
+ function StepForm($$renderer, $$props) {
832
+ $$renderer.component(($$renderer2) => {
833
+ let {
834
+ step,
835
+ entry,
836
+ declared,
837
+ refs,
838
+ evidence,
839
+ links,
840
+ uses,
841
+ canUp,
842
+ canDown,
843
+ onfield,
844
+ belowName,
845
+ onmove,
846
+ onremove,
847
+ onreset,
848
+ onaddcheck
849
+ /** Where the step is declared: built-in, the project file, or added by this file. */
850
+ /** The name was finished (the field lost focus). */
851
+ /** Where steps declared below this file come from, in words. */
852
+ } = $$props;
853
+ const rules = derived(() => declared !== "builtin");
854
+ const text = (v) => typeof v === "string" ? v : "";
855
+ const shows = derived(() => Array.isArray(entry?.evidence) ? entry.evidence : null);
856
+ const noteText = derived(() => typeof entry?.note === "string" ? entry.note : "");
857
+ const noteIsRule = derived(() => !!entry?.note && typeof entry.note === "object");
858
+ const ORIGIN = {
859
+ builtin: "A built-in step",
860
+ project: "Added by the project’s repository file",
861
+ captain: "Added by your Wheelhouse config",
862
+ file: "Added by this file"
863
+ };
864
+ const inputClass = "mt-1 w-full rounded-md border border-input bg-card px-3 py-1.5 text-sm";
865
+ let adding = "command";
866
+ $$renderer2.push(`<section aria-labelledby="step-title"${attr("data-step-form", step.id)}><p class="text-xs tracking-wide text-muted-foreground uppercase">${escape_html(ORIGIN[declared])}${escape_html(step.restyled && !step.added ? ", changed by this file" : "")}</p> <h2 id="step-title" class="mt-0.5 text-xl">${escape_html(step.label)}</h2> `);
867
+ if (step.lost) {
868
+ $$renderer2.push(`<!--[0--><p class="mt-2 text-sm text-danger" role="alert">It is placed after a step that does not exist. Move it to put it back in the passage.</p>`);
869
+ } else {
870
+ $$renderer2.push("<!--[-1-->");
871
+ }
872
+ $$renderer2.push(`<!--]--> <div class="mt-5 grid gap-4 sm:grid-cols-[minmax(0,2fr)_minmax(0,1fr)]"><div><label for="step-label" class="block text-sm font-medium">Name`);
873
+ if (step.added) {
874
+ $$renderer2.push(`<!--[0--><span class="ml-1 font-normal text-muted-foreground">(required)</span>`);
875
+ } else {
876
+ $$renderer2.push("<!--[-1-->");
877
+ }
878
+ $$renderer2.push(`<!--]--></label> <input id="step-label"${attr_class(clsx(inputClass))}${attr("value", text(entry?.label))}${attr("placeholder", step.added ? "e.g. Deployed locally" : step.label)}/></div> <div><label for="step-short" class="block text-sm font-medium">Short name</label> <input id="step-short"${attr_class(clsx(inputClass))}${attr("value", text(entry?.short))} placeholder="For narrow layouts"/></div></div> <div class="mt-6 space-y-5">`);
879
+ if (rules()) {
880
+ $$renderer2.push("<!--[0-->");
881
+ CondField($$renderer2, {
882
+ id: "reached",
883
+ label: "Reached when",
884
+ help: step.added ? "Required. The step is current once this holds." : null,
885
+ value: entry?.reached_when,
886
+ refs,
887
+ onchange: (c) => onfield("reached_when", c)
888
+ });
889
+ $$renderer2.push(`<!----> `);
890
+ CondField($$renderer2, {
891
+ id: "failed",
892
+ label: "Failed when",
893
+ help: "Optional. The task shows as failed at this step.",
894
+ value: entry?.failed_when,
895
+ refs,
896
+ onchange: (c) => onfield("failed_when", c)
897
+ });
898
+ $$renderer2.push(`<!----> `);
899
+ CondField($$renderer2, {
900
+ id: "skipped",
901
+ label: "Skipped when",
902
+ help: "Optional. Shown as skipped unless it is the current step.",
903
+ value: entry?.skip_when,
904
+ refs,
905
+ onchange: (c) => onfield("skip_when", c)
906
+ });
907
+ $$renderer2.push(`<!----> `);
908
+ if (entry?.skip_when !== void 0) {
909
+ $$renderer2.push(`<!--[0--><div><label for="step-skip-note" class="block text-sm font-medium">Why it is skipped</label> <input id="step-skip-note"${attr_class(clsx(inputClass))}${attr("value", text(entry?.skip_note))}/></div>`);
910
+ } else {
911
+ $$renderer2.push("<!--[-1-->");
912
+ }
913
+ $$renderer2.push(`<!--]-->`);
914
+ } else {
915
+ $$renderer2.push(`<!--[-1--><p class="rounded-md bg-muted/60 px-3 py-2 text-sm text-muted-foreground">When a built-in step is reached is fixed. You can rename it and choose what it shows.</p>`);
916
+ }
917
+ $$renderer2.push(`<!--]--> <fieldset><legend class="block text-sm font-medium">What it shows on the task page</legend> <p class="mt-0.5 text-xs text-muted-foreground">${escape_html(shows() ? "Chosen here." : `As in ${belowName}; tick to choose your own.`)}</p> <div class="mt-2 grid gap-x-4 gap-y-1.5 sm:grid-cols-2 xl:grid-cols-3"><!--[-->`);
918
+ const each_array = ensure_array_like(evidence);
919
+ for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
920
+ let o = each_array[$$index];
921
+ $$renderer2.push(`<label class="flex items-center gap-2 text-sm"><input type="checkbox" class="size-4 accent-[var(--sea)]"${attr("checked", shows()?.includes(o.value) ?? false, true)}/>${escape_html(o.label)}</label>`);
922
+ }
923
+ $$renderer2.push(`<!--]--></div></fieldset> <div class="grid gap-4 sm:grid-cols-2"><div><label for="step-link" class="block text-sm font-medium">Main link while current</label> `);
924
+ $$renderer2.select(
925
+ {
926
+ id: "step-link",
927
+ class: inputClass,
928
+ value: text(entry?.primary_link),
929
+ onchange: (e) => onfield("primary_link", e.currentTarget.value)
930
+ },
931
+ ($$renderer3) => {
932
+ $$renderer3.option({ value: "" }, ($$renderer4) => {
933
+ $$renderer4.push(`None`);
934
+ });
935
+ $$renderer3.push(`<!--[-->`);
936
+ const each_array_1 = ensure_array_like(links);
937
+ for (let $$index_1 = 0, $$length = each_array_1.length; $$index_1 < $$length; $$index_1++) {
938
+ let c = each_array_1[$$index_1];
939
+ $$renderer3.option({ value: `${stringify(c.id)}.url` }, ($$renderer4) => {
940
+ $$renderer4.push(`${escape_html(c.label)}`);
941
+ });
942
+ }
943
+ $$renderer3.push(`<!--]-->`);
944
+ }
945
+ );
946
+ $$renderer2.push(`</div> `);
947
+ if (rules()) {
948
+ $$renderer2.push(`<!--[0--><div><label for="step-give-up" class="block text-sm font-medium">Stop checking after</label> <input id="step-give-up" class="mt-1 w-full rounded-md border border-input bg-card px-3 py-1.5 text-sm max-w-40" placeholder="e.g. 24h"${attr("value", text(entry?.give_up_after))}/></div>`);
949
+ } else {
950
+ $$renderer2.push("<!--[-1-->");
951
+ }
952
+ $$renderer2.push(`<!--]--></div> <div><label for="step-note" class="block text-sm font-medium">Note shown with the step</label> `);
953
+ if (noteIsRule()) {
954
+ $$renderer2.push(`<!--[0--><p class="mt-1 text-sm text-muted-foreground">This note depends on a condition; edit it in the YAML view.</p>`);
955
+ } else {
956
+ $$renderer2.push(`<!--[-1--><textarea id="step-note" rows="2"${attr_class(clsx(inputClass))}>`);
957
+ const $$body = escape_html(noteText());
958
+ if ($$body) {
959
+ $$renderer2.push(`${$$body}`);
960
+ }
961
+ $$renderer2.push(`</textarea>`);
962
+ }
963
+ $$renderer2.push(`<!--]--></div></div> <div class="mt-8 border-t pt-5"><h3 class="block text-sm font-medium">Checks this step uses</h3> `);
964
+ if (uses.length) {
965
+ $$renderer2.push(`<!--[0--><ul class="mt-2 divide-y rounded-lg border"><!--[-->`);
966
+ const each_array_2 = ensure_array_like(uses);
967
+ for (let $$index_2 = 0, $$length = each_array_2.length; $$index_2 < $$length; $$index_2++) {
968
+ let c = each_array_2[$$index_2];
969
+ $$renderer2.push(`<li><button type="button" class="flex w-full items-baseline justify-between gap-3 px-3 py-2 text-left text-sm hover:bg-muted/60"><span class="font-medium">${escape_html(c.label)}</span> <span class="text-xs text-muted-foreground">${escape_html(CHECK_WORDS[c.type]?.name ?? c.type)}</span></button></li>`);
970
+ }
971
+ $$renderer2.push(`<!--]--></ul>`);
972
+ } else {
973
+ $$renderer2.push(`<!--[-1--><p class="mt-1 text-sm text-muted-foreground">None yet.</p>`);
974
+ }
975
+ $$renderer2.push(`<!--]--> `);
976
+ if (rules()) {
977
+ $$renderer2.push(`<!--[0--><div class="mt-3 flex flex-wrap items-center gap-2"><label for="add-check-type" class="sr-only">Kind of check</label> `);
978
+ $$renderer2.select(
979
+ {
980
+ id: "add-check-type",
981
+ class: "rounded-md border border-input bg-card px-2 py-1.5 text-sm",
982
+ value: adding
983
+ },
984
+ ($$renderer3) => {
985
+ $$renderer3.push(`<!--[-->`);
986
+ const each_array_3 = ensure_array_like(Object.entries(CHECK_WORDS));
987
+ for (let $$index_3 = 0, $$length = each_array_3.length; $$index_3 < $$length; $$index_3++) {
988
+ let [t, w] = each_array_3[$$index_3];
989
+ $$renderer3.option({ value: t }, ($$renderer4) => {
990
+ $$renderer4.push(`${escape_html(w.name)}`);
991
+ });
992
+ }
993
+ $$renderer3.push(`<!--]-->`);
994
+ }
995
+ );
996
+ $$renderer2.push(` `);
997
+ Button($$renderer2, {
998
+ variant: "outline",
999
+ size: "sm",
1000
+ onclick: () => onaddcheck(adding),
1001
+ children: ($$renderer3) => {
1002
+ Plus($$renderer3, { "aria-hidden": "true" });
1003
+ $$renderer3.push(`<!---->Add a check to this step`);
1004
+ },
1005
+ $$slots: { default: true }
1006
+ });
1007
+ $$renderer2.push(`<!----></div> <p class="mt-1 text-xs text-muted-foreground">The step is then reached when the check passes, and shows its result.</p>`);
1008
+ } else {
1009
+ $$renderer2.push("<!--[-1-->");
1010
+ }
1011
+ $$renderer2.push(`<!--]--></div> <div class="mt-8 flex flex-wrap gap-2 border-t pt-5">`);
1012
+ if (step.added) {
1013
+ $$renderer2.push("<!--[0-->");
1014
+ Button($$renderer2, {
1015
+ variant: "outline",
1016
+ size: "sm",
1017
+ disabled: !canUp,
1018
+ onclick: () => onmove(-1),
1019
+ children: ($$renderer3) => {
1020
+ Arrow_up($$renderer3, { "aria-hidden": "true" });
1021
+ $$renderer3.push(`<!---->Move up`);
1022
+ },
1023
+ $$slots: { default: true }
1024
+ });
1025
+ $$renderer2.push(`<!----> `);
1026
+ Button($$renderer2, {
1027
+ variant: "outline",
1028
+ size: "sm",
1029
+ disabled: !canDown,
1030
+ onclick: () => onmove(1),
1031
+ children: ($$renderer3) => {
1032
+ Arrow_down($$renderer3, { "aria-hidden": "true" });
1033
+ $$renderer3.push(`<!---->Move down`);
1034
+ },
1035
+ $$slots: { default: true }
1036
+ });
1037
+ $$renderer2.push(`<!----> `);
1038
+ Button($$renderer2, {
1039
+ variant: "destructive",
1040
+ size: "sm",
1041
+ onclick: onremove,
1042
+ children: ($$renderer3) => {
1043
+ Trash($$renderer3, { "aria-hidden": "true" });
1044
+ $$renderer3.push(`<!---->Remove this step`);
1045
+ },
1046
+ $$slots: { default: true }
1047
+ });
1048
+ $$renderer2.push(`<!---->`);
1049
+ } else if (step.restyled) {
1050
+ $$renderer2.push("<!--[1-->");
1051
+ Button($$renderer2, {
1052
+ variant: "outline",
1053
+ size: "sm",
1054
+ onclick: onreset,
1055
+ children: ($$renderer3) => {
1056
+ Rotate_ccw($$renderer3, { "aria-hidden": "true" });
1057
+ $$renderer3.push(`<!---->Undo this file’s changes to the step`);
1058
+ },
1059
+ $$slots: { default: true }
1060
+ });
1061
+ } else {
1062
+ $$renderer2.push("<!--[-1-->");
1063
+ }
1064
+ $$renderer2.push(`<!--]--> `);
1065
+ if (declared === "builtin") {
1066
+ $$renderer2.push(`<!--[0--><p class="self-center text-xs text-muted-foreground">Built-in steps stay in place and cannot be removed.</p>`);
1067
+ } else {
1068
+ $$renderer2.push("<!--[-1-->");
1069
+ }
1070
+ $$renderer2.push(`<!--]--></div></section>`);
1071
+ });
1072
+ }
1073
+ function TestPanel($$renderer, $$props) {
1074
+ $$renderer.component(($$renderer2) => {
1075
+ let {
1076
+ projectId,
1077
+ target,
1078
+ text,
1079
+ track,
1080
+ tasks,
1081
+ commands,
1082
+ blocked
1083
+ } = $$props;
1084
+ const fits = derived(() => tasks.filter((t) => t.track === track));
1085
+ let taskId = "";
1086
+ let runCommands = false;
1087
+ let busy = false;
1088
+ let result = null;
1089
+ let error = null;
1090
+ async function run() {
1091
+ busy = true;
1092
+ error = null;
1093
+ result = null;
1094
+ try {
1095
+ const res = await fetch(`/api/projects/${encodeURIComponent(projectId)}/passage/test`, {
1096
+ method: "POST",
1097
+ headers: {
1098
+ "content-type": "application/json",
1099
+ [SESSION_HEADER]: page.data.sessionToken
1100
+ },
1101
+ body: JSON.stringify({
1102
+ target,
1103
+ text,
1104
+ taskId,
1105
+ commands: runCommands && commands.length > 0 ? commands : null
1106
+ })
1107
+ });
1108
+ const body = await res.json().catch(() => null);
1109
+ if (body && typeof body.ok === "boolean") result = body;
1110
+ else error = typeof body?.message === "string" ? body.message : `Wheelhouse answered ${res.status}.`;
1111
+ } catch {
1112
+ error = "Could not reach the Wheelhouse server.";
1113
+ } finally {
1114
+ busy = false;
1115
+ }
1116
+ }
1117
+ const BAD = /* @__PURE__ */ new Set(["failed", "failure", "error", "mismatch"]);
1118
+ const NOT_YET = /* @__PURE__ */ new Set(["absent", "not_yet", "no", "in_progress"]);
1119
+ function verdict(c) {
1120
+ if (c.state === "observed" && c.outcome && BAD.has(c.outcome)) return { word: "Failed", tone: "text-danger" };
1121
+ if (c.state === "observed" && c.outcome && NOT_YET.has(c.outcome)) return { word: "Not yet", tone: "text-muted-foreground" };
1122
+ if (c.state === "observed") return { word: "Passed", tone: "text-success" };
1123
+ if (c.state === "unknown") return { word: "Couldn’t tell", tone: "text-warning" };
1124
+ return { word: "Not run", tone: "text-muted-foreground" };
1125
+ }
1126
+ $$renderer2.push(`<section class="rounded-xl border bg-card p-5" aria-labelledby="test-title" data-test-panel=""><div class="flex items-start gap-3"><div class="min-w-0 flex-1"><h2 id="test-title" class="text-lg">Test this passage</h2> <p class="mt-1 text-sm text-muted-foreground">See where a task would be with your edits. Each check runs once now; nothing is saved or
1127
+ recorded.</p></div> <button type="button" class="inline-flex size-8 items-center justify-center rounded-md text-muted-foreground hover:bg-muted hover:text-foreground" aria-label="Close the test">`);
1128
+ X($$renderer2, { class: "size-4", "aria-hidden": "true" });
1129
+ $$renderer2.push(`<!----></button></div> `);
1130
+ if (!fits().length) {
1131
+ $$renderer2.push(`<!--[0--><p class="mt-4 text-sm text-muted-foreground">${escape_html(tasks.length ? `None of this project’s recent tasks follow the ${track === "ship" ? "ship" : "scout"} passage.` : "Wheelhouse has not seen any of this project’s tasks recently.")}</p>`);
1132
+ } else {
1133
+ $$renderer2.push(`<!--[-1--><div class="mt-4 flex flex-wrap items-end gap-3"><label class="min-w-0 flex-1 text-sm font-medium" for="test-task">Task `);
1134
+ $$renderer2.select(
1135
+ {
1136
+ id: "test-task",
1137
+ class: "mt-1 block w-full max-w-xl rounded-md border border-input bg-card px-3 py-1.5 text-sm font-normal",
1138
+ value: taskId
1139
+ },
1140
+ ($$renderer3) => {
1141
+ $$renderer3.push(`<!--[-->`);
1142
+ const each_array = ensure_array_like(fits());
1143
+ for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
1144
+ let t = each_array[$$index];
1145
+ $$renderer3.option({ value: t.id }, ($$renderer4) => {
1146
+ $$renderer4.push(`${escape_html(t.title)}${escape_html(t.step ? ` (now at ${t.step})` : "")}`);
1147
+ });
1148
+ }
1149
+ $$renderer3.push(`<!--]-->`);
1150
+ }
1151
+ );
1152
+ $$renderer2.push(`</label> `);
1153
+ Button($$renderer2, {
1154
+ disabled: busy || blocked || !taskId,
1155
+ onclick: run,
1156
+ children: ($$renderer3) => {
1157
+ Play($$renderer3, { "aria-hidden": "true" });
1158
+ $$renderer3.push(`<!---->${escape_html(busy ? "Testing…" : "Run the test")}`);
1159
+ },
1160
+ $$slots: { default: true }
1161
+ });
1162
+ $$renderer2.push(`<!----></div> `);
1163
+ if (blocked) {
1164
+ $$renderer2.push(`<!--[0--><p class="mt-2 text-sm text-danger">Fix the file’s problems to test it.</p>`);
1165
+ } else {
1166
+ $$renderer2.push("<!--[-1-->");
1167
+ }
1168
+ $$renderer2.push(`<!--]--> `);
1169
+ if (commands.length) {
1170
+ $$renderer2.push(`<!--[0--><div class="mt-4 rounded-lg border bg-panel p-3 text-sm"><label class="flex items-start gap-2"><input type="checkbox" class="mt-0.5 size-4 accent-[var(--sea)]"${attr("checked", runCommands, true)}/> <span>Also run ${escape_html(commands.length === 1 ? "this command" : `these ${commands.length} commands`)} on
1171
+ this machine now. Otherwise they are left out of the test.</span></label> <ul class="mt-2 space-y-1 pl-6"><!--[-->`);
1172
+ const each_array_1 = ensure_array_like(commands);
1173
+ for (let $$index_1 = 0, $$length = each_array_1.length; $$index_1 < $$length; $$index_1++) {
1174
+ let c = each_array_1[$$index_1];
1175
+ $$renderer2.push(`<li><span class="font-medium">${escape_html(c.label)}:</span> <code class="font-mono text-xs">${escape_html(c.line)}</code> <span class="text-xs text-muted-foreground">in ${escape_html(c.cwd === "." ? "the project folder" : c.cwd)}, up to ${escape_html(c.timeout)}</span></li>`);
1176
+ }
1177
+ $$renderer2.push(`<!--]--></ul> `);
1178
+ {
1179
+ $$renderer2.push("<!--[-1-->");
1180
+ }
1181
+ $$renderer2.push(`<!--]--></div>`);
1182
+ } else {
1183
+ $$renderer2.push("<!--[-1-->");
1184
+ }
1185
+ $$renderer2.push(`<!--]-->`);
1186
+ }
1187
+ $$renderer2.push(`<!--]--> `);
1188
+ if (error) {
1189
+ $$renderer2.push(`<!--[0--><p class="mt-3 text-sm text-danger" role="alert">${escape_html(error)}</p>`);
1190
+ } else {
1191
+ $$renderer2.push("<!--[-1-->");
1192
+ }
1193
+ $$renderer2.push(`<!--]--> `);
1194
+ if (result && !result.ok) {
1195
+ $$renderer2.push(`<!--[0--><div class="mt-4 text-sm text-danger" role="alert"><p>${escape_html(result.message)}</p> `);
1196
+ if (result.errors.length) {
1197
+ $$renderer2.push(`<!--[0--><ul class="mt-1 list-disc pl-5 font-mono text-xs"><!--[-->`);
1198
+ const each_array_2 = ensure_array_like(result.errors);
1199
+ for (let i = 0, $$length = each_array_2.length; i < $$length; i++) {
1200
+ let e = each_array_2[i];
1201
+ $$renderer2.push(`<li>${escape_html(e)}</li>`);
1202
+ }
1203
+ $$renderer2.push(`<!--]--></ul>`);
1204
+ } else {
1205
+ $$renderer2.push("<!--[-1-->");
1206
+ }
1207
+ $$renderer2.push(`<!--]--></div>`);
1208
+ } else if (result?.ok) {
1209
+ $$renderer2.push("<!--[1-->");
1210
+ const p = result.passage;
1211
+ const cur = p.steps[p.current];
1212
+ const failed = p.checks.filter((c) => verdict(c).word === "Failed").length;
1213
+ const unclear = p.checks.filter((c) => c.state === "unknown").length;
1214
+ const bad = new Set(p.checks.filter((c) => verdict(c).word === "Failed").map((c) => c.id));
1215
+ $$renderer2.push(`<div class="mt-5 grid gap-6 lg:grid-cols-[minmax(0,1fr)_minmax(0,1.4fr)]" aria-live="polite"><div><h3 class="text-sm font-medium">It would be at <span${attr_class(clsx(cur.failed ? "text-danger" : "text-sea"))}>${escape_html(cur.label)}${escape_html(cur.failed ? ", failed" : "")}</span></h3> <p class="mt-1 text-xs text-muted-foreground">${escape_html(p.basis)}</p> `);
1216
+ if (failed || unclear) {
1217
+ $$renderer2.push(`<!--[0--><p class="mt-2 text-sm text-warning" role="status">${escape_html([
1218
+ failed ? `${failed} check${failed === 1 ? "" : "s"} failed` : "",
1219
+ unclear ? `${unclear} couldn’t tell` : ""
1220
+ ].filter(Boolean).join(" and "))}; see what each check found.</p>`);
1221
+ } else {
1222
+ $$renderer2.push("<!--[-1-->");
1223
+ }
1224
+ $$renderer2.push(`<!--]--> <ol class="mt-3 space-y-1.5 text-sm"><!--[-->`);
1225
+ const each_array_3 = ensure_array_like(p.steps);
1226
+ for (let $$index_3 = 0, $$length = each_array_3.length; $$index_3 < $$length; $$index_3++) {
1227
+ let s = each_array_3[$$index_3];
1228
+ const own = s.evidence.some((e) => e.startsWith("check:") && bad.has(e.slice(6)));
1229
+ $$renderer2.push(`<li class="flex items-start gap-2"${attr("data-state", s.state)}>`);
1230
+ if (s.failed || own) {
1231
+ $$renderer2.push("<!--[0-->");
1232
+ Circle_alert($$renderer2, {
1233
+ class: "mt-0.5 size-4 shrink-0 text-danger",
1234
+ "aria-hidden": "true"
1235
+ });
1236
+ } else if (s.state === "done") {
1237
+ $$renderer2.push("<!--[1-->");
1238
+ Check($$renderer2, {
1239
+ class: "mt-0.5 size-4 shrink-0 text-success",
1240
+ "aria-hidden": "true"
1241
+ });
1242
+ } else if (s.state === "current") {
1243
+ $$renderer2.push("<!--[2-->");
1244
+ Circle_dot($$renderer2, {
1245
+ class: "mt-0.5 size-4 shrink-0 text-sea",
1246
+ "aria-hidden": "true"
1247
+ });
1248
+ } else if (s.state === "skipped") {
1249
+ $$renderer2.push("<!--[3-->");
1250
+ Minus($$renderer2, {
1251
+ class: "mt-0.5 size-4 shrink-0 text-muted-foreground",
1252
+ "aria-hidden": "true"
1253
+ });
1254
+ } else {
1255
+ $$renderer2.push("<!--[-1-->");
1256
+ Circle_dashed($$renderer2, {
1257
+ class: "mt-0.5 size-4 shrink-0 text-muted-foreground",
1258
+ "aria-hidden": "true"
1259
+ });
1260
+ }
1261
+ $$renderer2.push(`<!--]--> <span class="min-w-0"><span${attr_class(clsx(s.state === "upcoming" ? "text-muted-foreground" : ""))}>${escape_html(s.label)}</span> <span class="sr-only">(${escape_html(s.failed ? "failed" : s.state)})</span> `);
1262
+ if (own && !s.failed) {
1263
+ $$renderer2.push(`<!--[0--><span class="block text-xs text-danger">Its check failed${escape_html(s.state === "done" ? ", though a later step was reached" : "")}.</span>`);
1264
+ } else {
1265
+ $$renderer2.push("<!--[-1-->");
1266
+ }
1267
+ $$renderer2.push(`<!--]--> `);
1268
+ if (s.note) {
1269
+ $$renderer2.push(`<!--[0--><span class="block text-xs text-muted-foreground">${escape_html(s.note)}</span>`);
1270
+ } else {
1271
+ $$renderer2.push("<!--[-1-->");
1272
+ }
1273
+ $$renderer2.push(`<!--]--></span></li>`);
1274
+ }
1275
+ $$renderer2.push(`<!--]--></ol></div> <div><h3 class="text-sm font-medium">What each check found</h3> `);
1276
+ if (!p.checks.length) {
1277
+ $$renderer2.push(`<!--[0--><p class="mt-1 text-sm text-muted-foreground">This passage has no checks.</p>`);
1278
+ } else {
1279
+ $$renderer2.push(`<!--[-1--><ul class="mt-3 space-y-2"><!--[-->`);
1280
+ const each_array_4 = ensure_array_like(p.checks);
1281
+ for (let $$index_4 = 0, $$length = each_array_4.length; $$index_4 < $$length; $$index_4++) {
1282
+ let c = each_array_4[$$index_4];
1283
+ const v = verdict(c);
1284
+ $$renderer2.push(`<li${attr_class(`rounded-lg border px-3 py-2 text-sm ${v.word === "Failed" ? "border-danger/50" : v.word === "Couldn’t tell" ? "border-warning/50" : ""}`)}${attr("data-verdict", v.word)}><p class="flex flex-wrap items-baseline gap-x-2"><span class="font-medium">${escape_html(c.label)}</span> <span${attr_class(`text-xs font-medium ${stringify(v.tone)}`)}>${escape_html(v.word)}</span></p> <p class="mt-0.5 text-muted-foreground">${escape_html(c.summary)}</p> `);
1285
+ if (c.command) {
1286
+ $$renderer2.push(`<!--[0--><p class="mt-0.5 font-mono text-xs text-muted-foreground">${escape_html(c.command)}</p>`);
1287
+ } else {
1288
+ $$renderer2.push("<!--[-1-->");
1289
+ }
1290
+ $$renderer2.push(`<!--]--> `);
1291
+ if (c.output) {
1292
+ $$renderer2.push(`<!--[0--><details class="mt-1"><summary class="cursor-pointer text-xs text-sea">Output</summary> <pre class="mt-1 max-h-72 overflow-auto rounded-md bg-terminal px-3 py-2 font-mono text-xs text-terminal-foreground">${escape_html(c.output)}</pre></details>`);
1293
+ } else {
1294
+ $$renderer2.push("<!--[-1-->");
1295
+ }
1296
+ $$renderer2.push(`<!--]--></li>`);
1297
+ }
1298
+ $$renderer2.push(`<!--]--></ul>`);
1299
+ }
1300
+ $$renderer2.push(`<!--]--></div></div>`);
1301
+ } else {
1302
+ $$renderer2.push("<!--[-1-->");
1303
+ }
1304
+ $$renderer2.push(`<!--]--></section>`);
1305
+ });
1306
+ }
1307
+ function PassageEditor($$renderer, $$props) {
1308
+ $$renderer.component(($$renderer2) => {
1309
+ let { editor, tasks, onsaved } = $$props;
1310
+ const loadedText = editor.file.exists ? editor.file.text : starterText();
1311
+ let text = loadedText;
1312
+ let view = "form";
1313
+ let selected = null;
1314
+ let testing = false;
1315
+ let reviewing = false;
1316
+ let saving = false;
1317
+ let saveError = null;
1318
+ let savedNote = null;
1319
+ let checking = false;
1320
+ let showProblems = false;
1321
+ const m = derived(() => model(text));
1322
+ const track = derived(() => m()?.extends ?? "ship");
1323
+ const base = derived(() => editor.below[track()]);
1324
+ const steps = derived(() => m() ? listSteps(base(), m().stages) : []);
1325
+ const fileChecks = derived(() => m()?.checks ?? {});
1326
+ const dirty = derived(() => text !== loadedText);
1327
+ const yamlBroken = derived(() => m() === null);
1328
+ const problems = derived(() => yamlBroken() ? ["The YAML could not be read."] : []);
1329
+ const commands = derived(() => []);
1330
+ const project = derived(() => editor.target === "project");
1331
+ const branch = derived(() => editor.defaultRef?.replace(/^origin\//, "") ?? "the default branch");
1332
+ const allChecks = derived(() => {
1333
+ const out = {};
1334
+ for (const c of base().checks) out[c.id] = { ...c, mine: false };
1335
+ for (const [id, spec] of Object.entries(fileChecks())) {
1336
+ out[id] = {
1337
+ id,
1338
+ label: typeof spec?.label === "string" && spec.label ? spec.label : id,
1339
+ type: String(spec?.type ?? ""),
1340
+ mine: true
1341
+ };
1342
+ }
1343
+ return Object.values(out);
1344
+ });
1345
+ const refs = derived(() => [
1346
+ {
1347
+ group: "Firstmate",
1348
+ options: Object.entries(FACT_WORDS).map(([value, label]) => ({ value, label: label.charAt(0).toUpperCase() + label.slice(1) }))
1349
+ },
1350
+ ...allChecks().map((c) => ({
1351
+ group: c.label,
1352
+ options: (OUTCOMES[c.type] ?? []).map((o) => ({
1353
+ value: `${c.id}.${o}`,
1354
+ label: `${c.label} ${outcomeWords(o)}`
1355
+ }))
1356
+ }))
1357
+ ]);
1358
+ const evidence = derived(() => [
1359
+ ...Object.entries(EVIDENCE_WORDS).map(([value, label]) => ({ value, label })),
1360
+ ...allChecks().map((c) => ({ value: `check:${c.id}`, label: `${c.label} result` }))
1361
+ ]);
1362
+ const change = (fn) => {
1363
+ text = edit(text, fn);
1364
+ savedNote = null;
1365
+ };
1366
+ const sel = derived(() => selected?.kind === "step" ? steps().find((s) => s.id === selected.id) : void 0);
1367
+ const entry = derived(() => sel() && sel().fileIndex !== null ? m()?.stages[sel().fileIndex] ?? null : null);
1368
+ const declared = derived(() => {
1369
+ if (!sel()) return "builtin";
1370
+ if (sel().added) return "file";
1371
+ return base().steps.find((s) => s.id === sel().id)?.origin ?? "builtin";
1372
+ });
1373
+ const selIndex = derived(() => sel() ? steps().indexOf(sel()) : -1);
1374
+ const fresh = new SvelteSet();
1375
+ const freshChecks = new SvelteSet();
1376
+ const taken = (except) => steps().map((s) => s.id).filter((x) => x !== except);
1377
+ const takenChecks = (except) => allChecks().map((c) => c.id).filter((x) => x !== except);
1378
+ function stageField(key, value) {
1379
+ if (!sel()) return;
1380
+ const id = sel().id;
1381
+ change((d) => {
1382
+ const i = sel().fileIndex ?? entryFor(d, id);
1383
+ setStageField(d, i, key, value);
1384
+ });
1385
+ }
1386
+ function pick(kind, id) {
1387
+ selected = { kind, id };
1388
+ if (typeof window !== "undefined" && window.innerWidth < 1024) {
1389
+ requestAnimationFrame(() => document.getElementById("passage-detail")?.scrollIntoView({ behavior: "smooth", block: "start" }));
1390
+ }
1391
+ }
1392
+ function addStep() {
1393
+ const id = slug("New step", taken(""));
1394
+ const after = sel()?.id ?? steps().at(-1)?.id ?? null;
1395
+ const at = sel() ? steps().indexOf(sel()) + 1 : steps().length;
1396
+ change((d) => {
1397
+ addStage(d, { id, label: "New step", reached_when: "merged" }, after);
1398
+ placeStage(d, base(), id, at);
1399
+ });
1400
+ fresh.add(id);
1401
+ pick("step", id);
1402
+ }
1403
+ function removeStep() {
1404
+ if (!sel() || sel().fileIndex === null) return;
1405
+ if (!confirm(`Remove the step “${sel().label}” from this file?`)) return;
1406
+ const i = sel().fileIndex;
1407
+ change((d) => removeStage(d, i));
1408
+ selected = null;
1409
+ }
1410
+ function resetStep() {
1411
+ if (!sel() || sel().fileIndex === null) return;
1412
+ const i = sel().fileIndex;
1413
+ change((d) => removeStage(d, i));
1414
+ }
1415
+ const SUCCESS = {
1416
+ "github.deployment": "success",
1417
+ "github.workflow": "success",
1418
+ "github.release": "included",
1419
+ "npm.published": "published",
1420
+ http: "ok",
1421
+ "git.contains": "yes",
1422
+ "status.note": "present",
1423
+ command: "passed"
1424
+ };
1425
+ const FAILURE = {
1426
+ "github.deployment": "failure",
1427
+ "github.workflow": "failure",
1428
+ command: "failed"
1429
+ };
1430
+ const STARTER = {
1431
+ "github.deployment": { ref: "merge.commit" },
1432
+ "github.workflow": { ref: "pr.head" },
1433
+ "github.release": { contains: "merge.commit" },
1434
+ "npm.published": {},
1435
+ http: {},
1436
+ "git.contains": { repo: "project-clone", commit: "merge.commit" },
1437
+ "status.note": { prefix: "preview" },
1438
+ command: { timeout: "5m" }
1439
+ };
1440
+ function addCheck(type) {
1441
+ if (!sel()) return;
1442
+ const step = sel();
1443
+ const name = allChecks().some((c) => c.label === step.label) ? `${step.label}: ${CHECK_WORDS[type].name.toLowerCase()}` : step.label;
1444
+ const id = slug(name, takenChecks(""), "check");
1445
+ const landed = steps().findIndex((s) => s.id === "landed");
1446
+ const afterMerge = landed >= 0 && steps().indexOf(step) > landed;
1447
+ change((d) => {
1448
+ setCheck(d, id, {
1449
+ type,
1450
+ label: name,
1451
+ ...STARTER[type],
1452
+ ...type === "command" && afterMerge ? { when: "merged" } : {}
1453
+ });
1454
+ const i = step.fileIndex ?? entryFor(d, step.id);
1455
+ const st = d.toJS().stages[i];
1456
+ if (declared() !== "builtin") {
1457
+ const add = (cur, ref) => {
1458
+ const b = toBuilder(cur);
1459
+ if (!b) return cur;
1460
+ const items = b.items.filter((x) => !(x.ref === "merged" && !x.not && step.added));
1461
+ return fromBuilder({ ...b, items: [...items, { not: false, ref }] });
1462
+ };
1463
+ setStageField(d, i, "reached_when", add(st.reached_when, `${id}.${SUCCESS[type]}`));
1464
+ if (FAILURE[type]) setStageField(d, i, "failed_when", add(st.failed_when, `${id}.${FAILURE[type]}`));
1465
+ }
1466
+ const ev = Array.isArray(st.evidence) ? st.evidence : [];
1467
+ setStageField(d, i, "evidence", [...ev, `check:${id}`]);
1468
+ });
1469
+ freshChecks.add(id);
1470
+ backTo = step.id;
1471
+ pick("check", id);
1472
+ }
1473
+ let backTo = null;
1474
+ const usesOf = (stageId) => {
1475
+ const s = m()?.stages.find((x) => x.id === stageId);
1476
+ if (!s) return [];
1477
+ return allChecks().filter((c) => refsTo([s], c.id).length > 0);
1478
+ };
1479
+ const selCheck = derived(() => selected?.kind === "check" ? allChecks().find((c) => c.id === selected.id) : void 0);
1480
+ function removeCheck(id) {
1481
+ if (!confirm("Remove this check? Steps that use it stop using it.")) return;
1482
+ change((d) => {
1483
+ setCheck(d, id, null);
1484
+ const stages = d.toJS().stages ?? [];
1485
+ stages.forEach((s, i) => {
1486
+ for (const k of ["reached_when", "failed_when", "skip_when"]) {
1487
+ const b = toBuilder(s[k]);
1488
+ if (b && s[k] !== void 0) setStageField(d, i, k, fromBuilder({
1489
+ ...b,
1490
+ items: b.items.filter((x) => !x.ref.startsWith(`${id}.`))
1491
+ }));
1492
+ }
1493
+ if (Array.isArray(s.evidence)) setStageField(d, i, "evidence", s.evidence.filter((e) => e !== `check:${id}`));
1494
+ if (s.primary_link === `${id}.url`) setStageField(d, i, "primary_link", void 0);
1495
+ });
1496
+ });
1497
+ selected = null;
1498
+ }
1499
+ async function save() {
1500
+ saving = true;
1501
+ saveError = null;
1502
+ try {
1503
+ const res = await fetch(`/api/projects/${encodeURIComponent(editor.projectId)}/passage/file`, {
1504
+ method: "PUT",
1505
+ headers: {
1506
+ "content-type": "application/json",
1507
+ [SESSION_HEADER]: page.data.sessionToken
1508
+ },
1509
+ body: JSON.stringify({ target: editor.target, text, baseDigest: editor.file.digest })
1510
+ });
1511
+ const body = await res.json().catch(() => null);
1512
+ if (res.ok && body?.schema === "wheelhouse-passage-editor.v1") {
1513
+ reviewing = false;
1514
+ const { tasks: t, ...e } = body;
1515
+ onsaved(e, t);
1516
+ } else {
1517
+ saveError = (typeof body?.message === "string" ? body.message : `Wheelhouse answered ${res.status}.`) + (Array.isArray(body?.errors) && body.errors.length ? ` ${body.errors[0]}` : "");
1518
+ }
1519
+ } catch {
1520
+ saveError = "Could not reach the Wheelhouse server.";
1521
+ } finally {
1522
+ saving = false;
1523
+ }
1524
+ }
1525
+ const tabClass = (on) => `inline-flex items-center rounded-sm px-3 py-1.5 text-sm ${on ? "bg-card font-medium shadow-xs" : "text-muted-foreground hover:text-foreground"}`;
1526
+ let $$settled = true;
1527
+ let $$inner_renderer;
1528
+ function $$render_inner($$renderer3) {
1529
+ $$renderer3.push(`<div class="mt-6 flex flex-wrap items-center gap-x-4 gap-y-3 border-y py-3"><div class="inline-flex rounded-md bg-muted p-0.5" role="tablist" aria-label="Edit as"><button type="button" role="tab"${attr("aria-selected", view === "form")}${attr_class(clsx(tabClass(view === "form")))}>Form</button> <button type="button" role="tab"${attr("aria-selected", view === "yaml")}${attr_class(clsx(tabClass(view === "yaml")))}>YAML</button></div> <label class="inline-flex items-center gap-2 text-sm"><span class="text-muted-foreground">Builds on</span> `);
1530
+ $$renderer3.select(
1531
+ {
1532
+ class: "rounded-md border border-input bg-card px-2 py-1 text-sm",
1533
+ value: track(),
1534
+ disabled: yamlBroken(),
1535
+ onchange: (e) => {
1536
+ const v = e.currentTarget.value;
1537
+ change((d) => setTop(d, "extends", v));
1538
+ selected = null;
1539
+ }
1540
+ },
1541
+ ($$renderer4) => {
1542
+ $$renderer4.option({ value: "ship" }, ($$renderer5) => {
1543
+ $$renderer5.push(`Ship work`);
1544
+ });
1545
+ $$renderer4.option({ value: "scout" }, ($$renderer5) => {
1546
+ $$renderer5.push(`Scout work`);
1547
+ });
1548
+ }
1549
+ );
1550
+ $$renderer3.push(`</label> <div class="min-w-0 flex-1 text-sm" aria-live="polite">`);
1551
+ if (problems().length) {
1552
+ $$renderer3.push(`<!--[0--><button type="button" class="inline-flex items-center gap-1.5 text-danger hover:underline"${attr("aria-expanded", showProblems)}>`);
1553
+ Circle_alert($$renderer3, { class: "size-4", "aria-hidden": "true" });
1554
+ $$renderer3.push(`<!---->${escape_html(problems().length === 1 ? "1 problem" : `${problems().length} problems`)}; it can’t be saved yet</button>`);
1555
+ } else {
1556
+ $$renderer3.push(`<!--[1--><span class="text-muted-foreground">Checking…</span>`);
1557
+ }
1558
+ $$renderer3.push(`<!--]--></div> <div class="flex gap-2">`);
1559
+ Button($$renderer3, {
1560
+ variant: "outline",
1561
+ onclick: () => testing = !testing,
1562
+ "aria-expanded": testing,
1563
+ children: ($$renderer4) => {
1564
+ Flask_conical($$renderer4, { "aria-hidden": "true" });
1565
+ $$renderer4.push(`<!---->Test`);
1566
+ },
1567
+ $$slots: { default: true }
1568
+ });
1569
+ $$renderer3.push(`<!----> `);
1570
+ Button($$renderer3, {
1571
+ disabled: !dirty() || problems().length > 0 || checking,
1572
+ onclick: () => {
1573
+ saveError = null;
1574
+ reviewing = true;
1575
+ },
1576
+ children: ($$renderer4) => {
1577
+ $$renderer4.push(`<!---->Review and save`);
1578
+ },
1579
+ $$slots: { default: true }
1580
+ });
1581
+ $$renderer3.push(`<!----></div></div> `);
1582
+ {
1583
+ $$renderer3.push("<!--[-1-->");
1584
+ }
1585
+ $$renderer3.push(`<!--]--> `);
1586
+ if (savedNote) {
1587
+ $$renderer3.push(`<!--[0--><p class="mt-3 text-sm text-success" role="status">${escape_html(savedNote)}</p>`);
1588
+ } else {
1589
+ $$renderer3.push("<!--[-1-->");
1590
+ }
1591
+ $$renderer3.push(`<!--]--> `);
1592
+ if (testing) {
1593
+ $$renderer3.push(`<!--[0--><div class="mt-5">`);
1594
+ TestPanel($$renderer3, {
1595
+ projectId: editor.projectId,
1596
+ target: editor.target,
1597
+ text,
1598
+ track: track(),
1599
+ tasks,
1600
+ commands: commands(),
1601
+ blocked: problems().length > 0
1602
+ });
1603
+ $$renderer3.push(`<!----></div>`);
1604
+ } else {
1605
+ $$renderer3.push("<!--[-1-->");
1606
+ }
1607
+ $$renderer3.push(`<!--]--> `);
1608
+ if (yamlBroken()) {
1609
+ $$renderer3.push(`<!--[0--><div class="mt-6">`);
1610
+ if (yamlBroken() && view === "form") {
1611
+ $$renderer3.push(`<!--[0--><p class="mb-3 text-sm text-danger">The YAML could not be read, so the form is unavailable. Fix it here.</p>`);
1612
+ } else {
1613
+ $$renderer3.push("<!--[-1-->");
1614
+ }
1615
+ $$renderer3.push(`<!--]--> <label for="yaml" class="sr-only">The passage file as YAML</label> <textarea id="yaml" class="min-h-[60vh] w-full rounded-lg border border-input bg-card p-4 font-mono text-sm leading-6" spellcheck="false">`);
1616
+ const $$body = escape_html(text);
1617
+ if ($$body) {
1618
+ $$renderer3.push(`${$$body}`);
1619
+ }
1620
+ $$renderer3.push(`</textarea></div>`);
1621
+ } else {
1622
+ $$renderer3.push(`<!--[-1--><div class="mt-6 grid gap-8 lg:grid-cols-[minmax(17rem,24rem)_minmax(0,1fr)]"><div class="min-w-0 space-y-8"><section aria-labelledby="steps-title"><h2 id="steps-title" class="text-sm font-medium">Steps, in order</h2> <ol class="mt-2 divide-y rounded-xl border bg-card" data-step-list=""><!--[-->`);
1623
+ const each_array_1 = ensure_array_like(steps());
1624
+ for (let i = 0, $$length = each_array_1.length; i < $$length; i++) {
1625
+ let s = each_array_1[i];
1626
+ const on = selected?.kind === "step" && selected.id === s.id;
1627
+ $$renderer3.push(`<li><button type="button"${attr_class(`flex w-full items-baseline gap-2 px-3 py-2.5 text-left text-sm hover:bg-muted/60 ${on ? "bg-sea/10" : ""}`)}${attr("aria-current", on ? "true" : void 0)}${attr("data-step", s.id)}><span class="tabular w-5 shrink-0 text-muted-foreground">${escape_html(i + 1)}.</span> <span${attr_class(`min-w-0 flex-1 ${on ? "font-medium" : ""}`)}>${escape_html(s.label)}</span> <span${attr_class(`text-xs ${s.lost ? "text-danger" : "text-muted-foreground"}`)}>${escape_html(s.lost ? "misplaced" : s.added ? "added here" : s.restyled ? "changed here" : "")}</span></button> `);
1628
+ if (on && s.added) {
1629
+ $$renderer3.push(`<!--[0--><div class="flex gap-1 px-3 pb-2" role="group"${attr("aria-label", `Move ${stringify(s.label)}`)}>`);
1630
+ Button($$renderer3, {
1631
+ variant: "ghost",
1632
+ size: "xs",
1633
+ disabled: i <= 1,
1634
+ onclick: () => change((d) => moveStage(d, base(), s.id, -1)),
1635
+ children: ($$renderer4) => {
1636
+ Arrow_up($$renderer4, { "aria-hidden": "true" });
1637
+ $$renderer4.push(`<!---->Up`);
1638
+ },
1639
+ $$slots: { default: true }
1640
+ });
1641
+ $$renderer3.push(`<!----> `);
1642
+ Button($$renderer3, {
1643
+ variant: "ghost",
1644
+ size: "xs",
1645
+ disabled: i >= steps().length - 1,
1646
+ onclick: () => change((d) => moveStage(d, base(), s.id, 1)),
1647
+ children: ($$renderer4) => {
1648
+ Arrow_down($$renderer4, { "aria-hidden": "true" });
1649
+ $$renderer4.push(`<!---->Down`);
1650
+ },
1651
+ $$slots: { default: true }
1652
+ });
1653
+ $$renderer3.push(`<!----></div>`);
1654
+ } else {
1655
+ $$renderer3.push("<!--[-1-->");
1656
+ }
1657
+ $$renderer3.push(`<!--]--></li>`);
1658
+ }
1659
+ $$renderer3.push(`<!--]--></ol> `);
1660
+ Button($$renderer3, {
1661
+ variant: "outline",
1662
+ size: "sm",
1663
+ class: "mt-3",
1664
+ onclick: addStep,
1665
+ children: ($$renderer4) => {
1666
+ Plus($$renderer4, { "aria-hidden": "true" });
1667
+ $$renderer4.push(`<!---->Add a step${escape_html(sel() ? ` after ${sel().label}` : "")}`);
1668
+ },
1669
+ $$slots: { default: true }
1670
+ });
1671
+ $$renderer3.push(`<!----></section> <section aria-labelledby="checks-title"><h2 id="checks-title" class="text-sm font-medium">Checks</h2> `);
1672
+ if (allChecks().length) {
1673
+ $$renderer3.push(`<!--[0--><ul class="mt-2 divide-y rounded-xl border bg-card"><!--[-->`);
1674
+ const each_array_2 = ensure_array_like(allChecks());
1675
+ for (let $$index_2 = 0, $$length = each_array_2.length; $$index_2 < $$length; $$index_2++) {
1676
+ let c = each_array_2[$$index_2];
1677
+ const on = selected?.kind === "check" && selected.id === c.id;
1678
+ $$renderer3.push(`<li><button type="button"${attr_class(`flex w-full items-baseline justify-between gap-3 px-3 py-2.5 text-left text-sm hover:bg-muted/60 ${on ? "bg-sea/10" : ""}`)}${attr("aria-current", on ? "true" : void 0)}><span${attr_class(`min-w-0 ${on ? "font-medium" : ""}`)}>${escape_html(c.label)}</span> <span class="text-xs text-muted-foreground">${escape_html(CHECK_WORDS[c.type]?.name ?? c.type)}${escape_html(c.mine ? "" : ", below")}</span></button></li>`);
1679
+ }
1680
+ $$renderer3.push(`<!--]--></ul>`);
1681
+ } else {
1682
+ $$renderer3.push(`<!--[-1--><p class="mt-1 text-sm text-muted-foreground">None yet. Choose a step and add a check to it.</p>`);
1683
+ }
1684
+ $$renderer3.push(`<!--]--></section></div> <div id="passage-detail" class="min-w-0 scroll-mt-20 rounded-xl border bg-card p-5 lg:p-6">`);
1685
+ if (sel()) {
1686
+ $$renderer3.push(`<!--[0--><!---->`);
1687
+ {
1688
+ StepForm($$renderer3, {
1689
+ step: sel(),
1690
+ entry: entry(),
1691
+ declared: declared(),
1692
+ refs: refs(),
1693
+ evidence: evidence(),
1694
+ links: allChecks(),
1695
+ uses: usesOf(sel().id),
1696
+ canUp: sel().added && selIndex() > 1,
1697
+ canDown: sel().added && selIndex() < steps().length - 1,
1698
+ onfield: stageField,
1699
+ belowName: project() ? "the built-in passage" : "the repository file or the built-in passage",
1700
+ onmove: (delta) => change((d) => moveStage(d, base(), sel().id, delta)),
1701
+ onremove: removeStep,
1702
+ onreset: resetStep,
1703
+ onaddcheck: addCheck
1704
+ });
1705
+ }
1706
+ $$renderer3.push(`<!---->`);
1707
+ } else if (selCheck()) {
1708
+ $$renderer3.push(`<!--[1--><!---->`);
1709
+ {
1710
+ CheckForm($$renderer3, {
1711
+ checkId: selCheck().id,
1712
+ spec: selCheck().mine ? fileChecks()[selCheck().id] : { type: selCheck().type, label: selCheck().label },
1713
+ readonly: !selCheck().mine,
1714
+ readonlyWhy: selCheck().mine ? null : "Declared in the project’s repository file; change it there.",
1715
+ captain: !project(),
1716
+ releaseChecks: allChecks().filter((c) => c.type === "github.release"),
1717
+ usedBy: steps().filter((s) => usesOf(s.id).some((c) => c.id === selCheck().id)).map((s) => s.label),
1718
+ onchange: (spec) => change((d) => setCheck(d, selCheck().id, spec)),
1719
+ back: backTo && steps().some((s) => s.id === backTo) ? {
1720
+ label: steps().find((s) => s.id === backTo).label,
1721
+ go: () => pick("step", backTo)
1722
+ } : null,
1723
+ onremove: () => removeCheck(selCheck().id)
1724
+ });
1725
+ }
1726
+ $$renderer3.push(`<!---->`);
1727
+ } else {
1728
+ $$renderer3.push(`<!--[-1--><div class="py-6 text-sm text-muted-foreground"><p>Choose a step or a check to edit it.</p> <p class="mt-1">Or add a step, such as a local deploy after the merge.</p></div>`);
1729
+ }
1730
+ $$renderer3.push(`<!--]--></div></div>`);
1731
+ }
1732
+ $$renderer3.push(`<!--]--> `);
1733
+ ReviewDialog($$renderer3, {
1734
+ before: editor.file.text,
1735
+ after: text,
1736
+ summary: reviewing ? summarize(editor.file.text, text, base()) : [],
1737
+ target: editor.target,
1738
+ defaultRef: editor.defaultRef,
1739
+ busy: saving,
1740
+ error: saveError,
1741
+ onsave: save,
1742
+ get open() {
1743
+ return reviewing;
1744
+ },
1745
+ set open($$value) {
1746
+ reviewing = $$value;
1747
+ $$settled = false;
1748
+ }
1749
+ });
1750
+ $$renderer3.push(`<!----> <p class="mt-8 text-xs text-muted-foreground">`);
1751
+ if (project()) {
1752
+ $$renderer3.push(`<!--[0-->Saving writes the file in the project’s repository; Wheelhouse uses it once it is on ${escape_html(branch())}.`);
1753
+ } else {
1754
+ $$renderer3.push(`<!--[-1-->Saving writes your own file for this project; Wheelhouse uses it within a minute.`);
1755
+ }
1756
+ $$renderer3.push(`<!--]--></p>`);
1757
+ }
1758
+ do {
1759
+ $$settled = true;
1760
+ $$inner_renderer = $$renderer2.copy();
1761
+ $$render_inner($$inner_renderer);
1762
+ } while (!$$settled);
1763
+ $$renderer2.subsume($$inner_renderer);
1764
+ });
1765
+ }
1766
+ function _page($$renderer, $$props) {
1767
+ $$renderer.component(($$renderer2) => {
1768
+ let { data } = $$props;
1769
+ const id = derived(() => page.params.id);
1770
+ const name = derived(() => currentFleet()?.projects.find((p) => p.id === id())?.name ?? id());
1771
+ let saved = null;
1772
+ let note = null;
1773
+ const editor = derived(() => saved && saved.editor.target === data.editor?.target && saved.editor.projectId === id() ? saved.editor : data.editor);
1774
+ const tasks = derived(() => saved && editor() === saved.editor ? saved.tasks : data.tasks);
1775
+ const FILES = {
1776
+ project: {
1777
+ name: "Repository file",
1778
+ line: "The project’s .wheelhouse.yaml, shared with everyone who works on the repository."
1779
+ },
1780
+ captain: {
1781
+ name: "Your Wheelhouse config",
1782
+ line: "Your own file for this project, outside the repository. It applies on top of the repository file."
1783
+ }
1784
+ };
1785
+ head("txb91p", $$renderer2, ($$renderer3) => {
1786
+ $$renderer3.title(($$renderer4) => {
1787
+ $$renderer4.push(`<title>Edit ${escape_html(name())} passage · Wheelhouse</title>`);
1788
+ });
1789
+ });
1790
+ $$renderer2.push(`<main class="px-4 pt-6 pb-24 sm:px-6 lg:px-10"><div class="surface px-5 py-6 sm:px-8 sm:py-8"><a${attr("href", `/projects/${stringify(encodeURIComponent(id()))}/passage`)} class="inline-flex items-center gap-1.5 text-sm text-muted-foreground hover:text-foreground">`);
1791
+ Arrow_left($$renderer2, { class: "size-4", "aria-hidden": "true" });
1792
+ $$renderer2.push(`<!---->${escape_html(name())} passage</a> `);
1793
+ if (!editor()) {
1794
+ $$renderer2.push(`<!--[0--><p class="mt-10 text-muted-foreground">${escape_html(data.problem ?? "Loading…")}</p>`);
1795
+ } else {
1796
+ $$renderer2.push(`<!--[-1--><p class="mt-6 text-sm text-muted-foreground">${escape_html(name())}</p> <h1 class="mt-1 text-2xl font-semibold tracking-tight">Edit passage</h1> <p class="mt-2 max-w-3xl leading-relaxed text-muted-foreground">Add, rename and reorder the steps this project’s tasks pass through, and the checks that
1797
+ move them along. Test your edits on a real task before you save.</p> <div class="mt-6" role="radiogroup" aria-label="Which file to edit"><div class="flex flex-wrap gap-3"><!--[-->`);
1798
+ const each_array = ensure_array_like(["project", "captain"]);
1799
+ for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
1800
+ let t = each_array[$$index];
1801
+ const on = editor().target === t;
1802
+ const ok = editor().targets[t].available;
1803
+ $$renderer2.push(`<button type="button" role="radio"${attr("aria-checked", on)}${attr("disabled", !ok, true)}${attr_class(`w-full max-w-sm rounded-lg border px-4 py-3 text-left transition-colors sm:w-auto ${on ? "border-primary bg-card shadow-xs" : "border-border hover:bg-muted/60"} disabled:opacity-60`)}><span class="block text-sm font-medium">${escape_html(FILES[t].name)}</span> <span class="mt-0.5 block text-xs text-muted-foreground">${escape_html(ok ? FILES[t].line : editor().targets[t].why)}</span></button>`);
1804
+ }
1805
+ $$renderer2.push(`<!--]--></div> <p class="mt-3 max-w-3xl text-sm" data-file-state="">`);
1806
+ if (editor().target === "project") {
1807
+ $$renderer2.push("<!--[0-->");
1808
+ if (!editor().file.exists) {
1809
+ $$renderer2.push(`<!--[0-->There is no repository file yet; saving creates one.`);
1810
+ } else if (editor().inEffect) {
1811
+ $$renderer2.push(`<!--[1--><span class="text-success">This is the version Wheelhouse uses now.</span>`);
1812
+ } else {
1813
+ $$renderer2.push(`<!--[-1--><span class="text-warning">This version is saved in the clone but not yet on ${escape_html(editor().defaultRef?.replace(/^origin\//, "") ?? "the default branch")}, so Wheelhouse does not use it yet.</span> <a class="ml-1 text-sea hover:underline"${attr("href", `/?draft=${stringify(encodeURIComponent(shipPassageDraft(name())))}`)}>Ask Firstmate to ship it</a>`);
1814
+ }
1815
+ $$renderer2.push(`<!--]-->`);
1816
+ } else if (!editor().file.exists) {
1817
+ $$renderer2.push(`<!--[1-->You have no config for this project yet; saving creates it.`);
1818
+ } else if (editor().inEffect) {
1819
+ $$renderer2.push(`<!--[2--><span class="text-success">In use.</span>`);
1820
+ } else {
1821
+ $$renderer2.push(`<!--[-1--><span class="text-danger">Not in use: it has problems.</span>`);
1822
+ }
1823
+ $$renderer2.push(`<!--]--></p> `);
1824
+ if (editor().file.location) {
1825
+ $$renderer2.push(`<!--[0--><details class="mt-1 text-xs text-muted-foreground"><summary class="cursor-pointer">Where the file is</summary> <p class="mt-1 font-mono break-all">${escape_html(editor().file.location)}</p></details>`);
1826
+ } else {
1827
+ $$renderer2.push("<!--[-1-->");
1828
+ }
1829
+ $$renderer2.push(`<!--]--> `);
1830
+ if (editor().file.problem) {
1831
+ $$renderer2.push(`<!--[0--><p class="mt-2 text-sm text-danger">${escape_html(editor().file.problem)}</p>`);
1832
+ } else {
1833
+ $$renderer2.push("<!--[-1-->");
1834
+ }
1835
+ $$renderer2.push(`<!--]--> `);
1836
+ if (note) {
1837
+ $$renderer2.push(`<!--[0--><p class="mt-2 text-sm text-success" role="status">${escape_html(note)}</p>`);
1838
+ } else {
1839
+ $$renderer2.push("<!--[-1-->");
1840
+ }
1841
+ $$renderer2.push(`<!--]--></div> <!---->`);
1842
+ {
1843
+ PassageEditor($$renderer2, {
1844
+ editor: editor(),
1845
+ tasks: tasks(),
1846
+ onsaved: (e, t) => {
1847
+ saved = { editor: e, tasks: t };
1848
+ note = e.target === "project" ? `Saved to the repository file. Wheelhouse uses it once it is on ${e.defaultRef?.replace(/^origin\//, "") ?? "the default branch"}.` : "Saved to your config. Wheelhouse uses it within a minute.";
1849
+ }
1850
+ });
1851
+ }
1852
+ $$renderer2.push(`<!---->`);
1853
+ }
1854
+ $$renderer2.push(`<!--]--></div></main>`);
1855
+ });
1856
+ }
1857
+
1858
+ export { _page as default };
1859
+ //# sourceMappingURL=_page.svelte.js-iHacn81K.js.map