@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,1561 @@
1
+ import { af as head, aj as escape_html, ai as attr, aa as ensure_array_like, ak as stringify, ah as attr_class, _ as derived, a6 as bind_props, ae as spread_props, m as is_array, l as get_prototype_of, o as object_prototype } from '../../../chunks/index.js-Bn6j9diM.js';
2
+ import { g as goto } from '../../../chunks/client.js-BUNengrw.js';
3
+ import { B as Button } from '../../../chunks/button.js-HeBqLheH.js';
4
+ import { a as currentFleet } from '../../../chunks/live.svelte.js-BRUTNc9D.js';
5
+ import { S as SESSION_HEADER } from '../../../chunks/messages.js-CFyGKoqq.js';
6
+ import { h as html, c as composerBus } from '../../../chunks/bus.svelte.js-DRTptEhF.js';
7
+ import { D as DictateTextarea } from '../../../chunks/DictateTextarea.js-BlEnOzcN.js';
8
+ import '../_page.svelte.js-BI4c5H0n.js';
9
+ import { d as dictation } from '../../../chunks/MicButton.js-BZSQAyuM.js';
10
+ import { L as Loader_circle } from '../../../chunks/loader-circle.js-IYRaUYWq.js';
11
+ import { R as Rotate_ccw, P as Plus, T as Trash } from '../../../chunks/trash.js-DYFbRevY.js';
12
+ import { A as Arrow_up } from '../../../chunks/arrow-up.js-AhghNbhW.js';
13
+ import { C as Compass } from '../../../chunks/compass.js-Tq6uiG8I.js';
14
+ import { t as tick } from '../../../chunks/index-server.js-CtyUzIGY.js';
15
+ import { h as specTitle, S as SPEC_SECTIONS, j as sectionFilled, d as specMessage, g as specMarkdown, k as sectionMarkdown, s as summarize } from '../../../chunks/spec.js-B0yI1XqG.js';
16
+ import { X } from '../../../chunks/x.js-tlds9Ooz.js';
17
+ import { I as Icon } from '../../../chunks/Icon.js-D7CY3joB.js';
18
+ import { A as Arrow_left } from '../../../chunks/arrow-left.js-6Yey35CE.js';
19
+ import { A as Arrow_right } from '../../../chunks/arrow-right.js-CfbPWRqu.js';
20
+ import { C as Check } from '../../../chunks/check.js-bmUhmMEz.js';
21
+ import { a as ago } from '../../../chunks/format.js-D3lWEg6U.js';
22
+ import { C as Chevron_down } from '../../../chunks/chevron-down.js-D75hVSIe.js';
23
+ import { H as Hammer } from '../../../chunks/hammer.js-fp_Kidfj.js';
24
+ import '../../../chunks/utils.js-DTSGDHlH.js';
25
+ import '../../../chunks/utils2.js-BQzn9ikS.js';
26
+ import '../../../chunks/exports.js-BZBK1HC9.js';
27
+ import '../../../chunks/root.js-CQzYN4Pu.js';
28
+ import '../../../chunks/index2.js-CXaRTuov.js';
29
+ import '../../../chunks/slots.svelte.js-0Ejhe-hS.js';
30
+ import '../../../chunks/keys.js-CdtCzv-v.js';
31
+ import '../../../chunks/harbour.js-xu7EfIHk.js';
32
+ import '../../../chunks/chat.svelte.js-Cgdbtjbw.js';
33
+ import '../../../chunks/blocks.js-BL9jLCe-.js';
34
+ import 'yaml';
35
+ import '../../../chunks/SlotContent.js-YqZXXtRz.js';
36
+ import '../../../chunks/external-link.js-WxVF0xXO.js';
37
+ import '../../../chunks/git-pull-request.js-Cx1w8BQr.js';
38
+ import '../../../chunks/index-server2.js-DMc-UvjC.js';
39
+ import '../../../chunks/anchor.js-ByXDBfbi.js';
40
+ import '../../../chunks/triangle-alert.js-DuE40HSU.js';
41
+ import '../../../chunks/file-text.js-CAo3vdqd.js';
42
+ import '../../../chunks/square-terminal.js-D5Z4Sl2-.js';
43
+ import '../../../chunks/split.js-BsCU24rQ.js';
44
+ import '../../../chunks/message-square-text.js-N5uEmy8L.js';
45
+ import '../../../chunks/hand.js-xkYPYJZj.js';
46
+ import '../../../chunks/circle-dashed.js-Bm3gZCXK.js';
47
+ import '../../../chunks/chevron-right.js-yhLg_GaH.js';
48
+ import '../../../chunks/message-circle-question-mark.js-DwrMi0ty.js';
49
+ import '../../../chunks/gauge.js-Dw9bgE72.js';
50
+ import '../../../chunks/insights.js-CzzfyHGp.js';
51
+ import '../../../chunks/EtaLine.js-Pa4_VV6V.js';
52
+ import '../../../chunks/checks.js-BnIxIaus.js';
53
+ import '../../../chunks/clock.js-D7JTvRbC.js';
54
+ import '../../../chunks/StageTrack.js-BaorW-yk.js';
55
+ import '../../../chunks/tone.js-r2qFVrZC.js';
56
+ import '../../../chunks/AllowanceMeter.js-C9jRsAGU.js';
57
+ import '../../../chunks/TimeBar.js-k38rc7ZI.js';
58
+ import '../../../chunks/inbox.svelte.js-OoKhjjWM.js';
59
+ import '../../../chunks/inbox.js-CW2sFmx9.js';
60
+ import '../../../chunks/DecisionCard.js-u1VQ9s_v.js';
61
+ import '../../../chunks/monitor-play.js-B7qbbPH6.js';
62
+ import '../../../chunks/scale.js-vP4G0lZM.js';
63
+ import '../../../chunks/message-square.js-Hp-6BHgG.js';
64
+
65
+ const empty = [];
66
+ function snapshot(value, skip_warning = false, no_tojson = false) {
67
+ return clone(value, /* @__PURE__ */ new Map(), "", empty, null, no_tojson);
68
+ }
69
+ function clone(value, cloned, path, paths, original = null, no_tojson = false) {
70
+ if (typeof value === "object" && value !== null) {
71
+ var unwrapped = cloned.get(value);
72
+ if (unwrapped !== void 0) return unwrapped;
73
+ if (value instanceof Map) return (
74
+ /** @type {Snapshot<T>} */
75
+ new Map(value)
76
+ );
77
+ if (value instanceof Set) return (
78
+ /** @type {Snapshot<T>} */
79
+ new Set(value)
80
+ );
81
+ if (is_array(value)) {
82
+ var copy = (
83
+ /** @type {Snapshot<any>} */
84
+ Array(value.length)
85
+ );
86
+ cloned.set(value, copy);
87
+ if (original !== null) {
88
+ cloned.set(original, copy);
89
+ }
90
+ for (var i = 0; i < value.length; i += 1) {
91
+ var element = value[i];
92
+ if (i in value) {
93
+ copy[i] = clone(element, cloned, path, paths, null, no_tojson);
94
+ }
95
+ }
96
+ return copy;
97
+ }
98
+ if (get_prototype_of(value) === object_prototype) {
99
+ copy = {};
100
+ cloned.set(value, copy);
101
+ if (original !== null) {
102
+ cloned.set(original, copy);
103
+ }
104
+ for (var key of Object.keys(value)) {
105
+ copy[key] = clone(
106
+ // @ts-expect-error
107
+ value[key],
108
+ cloned,
109
+ path,
110
+ paths,
111
+ null,
112
+ no_tojson
113
+ );
114
+ }
115
+ return copy;
116
+ }
117
+ if (value instanceof Date) {
118
+ value.getTime();
119
+ return (
120
+ /** @type {Snapshot<T>} */
121
+ structuredClone(value)
122
+ );
123
+ }
124
+ if (typeof /** @type {T & { toJSON?: any } } */
125
+ value.toJSON === "function" && !no_tojson) {
126
+ return clone(
127
+ /** @type {T & { toJSON(): any } } */
128
+ value.toJSON(),
129
+ cloned,
130
+ path,
131
+ paths,
132
+ // Associate the instance with the toJSON clone
133
+ value
134
+ );
135
+ }
136
+ }
137
+ if (value instanceof EventTarget) {
138
+ return (
139
+ /** @type {Snapshot<T>} */
140
+ value
141
+ );
142
+ }
143
+ try {
144
+ return (
145
+ /** @type {Snapshot<T>} */
146
+ structuredClone(value)
147
+ );
148
+ } catch (e) {
149
+ return (
150
+ /** @type {Snapshot<T>} */
151
+ value
152
+ );
153
+ }
154
+ }
155
+ function File_plus_corner($$renderer, $$props) {
156
+ let { $$slots, $$events, ...props } = $$props;
157
+ const iconData = {
158
+ "name": "file-plus-corner",
159
+ "size": 24,
160
+ "node": [
161
+ [
162
+ "path",
163
+ {
164
+ "d": "M11.35 22H6a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.706.706l3.588 3.588A2.4 2.4 0 0 1 20 8v5.35"
165
+ }
166
+ ],
167
+ ["path", { "d": "M14 2v5a1 1 0 0 0 1 1h5" }],
168
+ ["path", { "d": "M14 19h6" }],
169
+ ["path", { "d": "M17 16v6" }]
170
+ ],
171
+ "aliases": ["file-plus-2"]
172
+ };
173
+ Icon($$renderer, spread_props([props, { icon: iconData }]));
174
+ }
175
+ function Image_plus($$renderer, $$props) {
176
+ let { $$slots, $$events, ...props } = $$props;
177
+ const iconData = {
178
+ "name": "image-plus",
179
+ "size": 24,
180
+ "node": [
181
+ ["path", { "d": "M16 5h6" }],
182
+ ["path", { "d": "M19 2v6" }],
183
+ [
184
+ "path",
185
+ {
186
+ "d": "M21 11.5V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h7.5"
187
+ }
188
+ ],
189
+ ["path", { "d": "m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21" }],
190
+ ["circle", { "cx": "9", "cy": "9", "r": "2" }]
191
+ ]
192
+ };
193
+ Icon($$renderer, spread_props([props, { icon: iconData }]));
194
+ }
195
+ function Message_square_plus($$renderer, $$props) {
196
+ let { $$slots, $$events, ...props } = $$props;
197
+ const iconData = {
198
+ "name": "message-square-plus",
199
+ "size": 24,
200
+ "node": [
201
+ [
202
+ "path",
203
+ {
204
+ "d": "M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z"
205
+ }
206
+ ],
207
+ ["path", { "d": "M12 8v6" }],
208
+ ["path", { "d": "M9 11h6" }]
209
+ ]
210
+ };
211
+ Icon($$renderer, spread_props([props, { icon: iconData }]));
212
+ }
213
+ function agentHead($$renderer) {
214
+ $$renderer.push(`<span class="flex size-7 shrink-0 items-center justify-center rounded-full border border-brass bg-card text-sea" aria-hidden="true">`);
215
+ Compass($$renderer, { class: "size-4" });
216
+ $$renderer.push(`<!----></span>`);
217
+ }
218
+ function Interview($$renderer, $$props) {
219
+ $$renderer.component(($$renderer2) => {
220
+ let {
221
+ draft,
222
+ busy,
223
+ streaming,
224
+ activity,
225
+ error,
226
+ pending,
227
+ model,
228
+ effort,
229
+ onAnswer,
230
+ onRetry
231
+ /** The agent's message so far, while it writes. */
232
+ /** What the agent is looking at in the project, while it does. */
233
+ /** What the captain just said, shown until the interview's record of it arrives. */
234
+ } = $$props;
235
+ let answer = "";
236
+ const turns = derived(() => draft.interview.turns);
237
+ const started = derived(() => turns().length > 0);
238
+ const last = derived(() => turns().at(-1));
239
+ const offered = derived(() => !busy && last()?.role === "agent" ? last() : null);
240
+ const unanswered = derived(() => !busy && last()?.role === "captain");
241
+ const usage = derived(() => draft.interview.usage);
242
+ async function send() {
243
+ if (dictation.phase !== "idle") dictation.commit();
244
+ const text = answer.trim();
245
+ if (!text || busy) return;
246
+ const before = answer;
247
+ answer = "";
248
+ if (!await onAnswer(text)) answer = before;
249
+ }
250
+ function onkeydown(e) {
251
+ if (e.key === "Enter" && !e.shiftKey && !e.isComposing) {
252
+ e.preventDefault();
253
+ void send();
254
+ }
255
+ }
256
+ const tokens = (n) => n >= 1e3 ? `${(n / 1e3).toFixed(1)}k` : String(n);
257
+ const usageNote = derived(() => usage().turns ? ` · ${usage().turns} turn${usage().turns === 1 ? "" : "s"}, ${tokens(usage().inputTokens)} tokens in, ${tokens(usage().outputTokens)} out${usage().costUsd > 0 ? `, about $${usage().costUsd.toFixed(2)} at API prices` : ""}` : "");
258
+ let $$settled = true;
259
+ let $$inner_renderer;
260
+ function $$render_inner($$renderer3) {
261
+ $$renderer3.push(`<div class="flex min-h-0 flex-col"><div class="max-h-[65dvh] min-h-0 flex-1 space-y-5 overflow-y-auto pr-1 xl:max-h-[calc(100dvh-20rem)]" aria-live="polite"${attr("aria-busy", busy)}>`);
262
+ if (!started()) {
263
+ $$renderer3.push(`<!--[0--><div class="rounded-lg border border-dashed border-hair p-5"><h2 class="font-display text-xl font-medium">What do you want built?</h2> <p class="mt-2 max-w-prose text-sm text-muted-foreground">Describe the idea in a sentence or two. The interviewer asks one question at a time,
264
+ offers answers with the one it recommends, and writes the spec alongside as you go.
265
+ Comment on anything in the spec and it will be addressed. When it is ready, send it to
266
+ build.</p></div>`);
267
+ } else {
268
+ $$renderer3.push("<!--[-1-->");
269
+ }
270
+ $$renderer3.push(`<!--]--> <!--[-->`);
271
+ const each_array = ensure_array_like(turns());
272
+ for (let i = 0, $$length = each_array.length; i < $$length; i++) {
273
+ let t = each_array[i];
274
+ if (t.role === "agent") {
275
+ $$renderer3.push(`<!--[0--><div class="flex items-start gap-3">`);
276
+ agentHead($$renderer3);
277
+ $$renderer3.push(`<!----> <div class="min-w-0 flex-1"><p class="mb-1 text-xs text-muted-foreground"><span class="font-semibold text-foreground">Interviewer</span></p> <div class="bubble bubble-firstmate chat-md text-[0.95rem]">`);
278
+ {
279
+ $$renderer3.push(`<!--[-1-->${escape_html(t.text)}`);
280
+ }
281
+ $$renderer3.push(`<!--]--></div> `);
282
+ if (offered() === t && t.options.length) {
283
+ $$renderer3.push(`<!--[0--><div class="mt-2 flex flex-wrap gap-2" role="group" aria-label="Suggested answers"><!--[-->`);
284
+ const each_array_1 = ensure_array_like(t.options);
285
+ for (let k = 0, $$length2 = each_array_1.length; k < $$length2; k++) {
286
+ let o = each_array_1[k];
287
+ $$renderer3.push(`<button${attr_class(`rounded-md border px-3 py-1.5 text-left text-sm hover:bg-accent ${t.recommended === k ? "border-brass bg-card" : "border-hair bg-card"}`)}>${escape_html(o)} `);
288
+ if (t.recommended === k) {
289
+ $$renderer3.push(`<!--[0--><span class="ml-1.5 text-[0.7rem] font-medium tracking-wide text-brass uppercase">Recommended</span>`);
290
+ } else {
291
+ $$renderer3.push("<!--[-1-->");
292
+ }
293
+ $$renderer3.push(`<!--]--></button>`);
294
+ }
295
+ $$renderer3.push(`<!--]--></div>`);
296
+ } else {
297
+ $$renderer3.push("<!--[-1-->");
298
+ }
299
+ $$renderer3.push(`<!--]--></div></div>`);
300
+ } else {
301
+ $$renderer3.push(`<!--[-1--><div class="flex justify-end"><div class="bubble bubble-captain max-w-[85%] text-[0.95rem]">${escape_html(t.text)}</div></div>`);
302
+ }
303
+ $$renderer3.push(`<!--]-->`);
304
+ }
305
+ $$renderer3.push(`<!--]--> `);
306
+ if (pending) {
307
+ $$renderer3.push(`<!--[0--><div class="flex justify-end"><div class="bubble bubble-captain max-w-[85%] text-[0.95rem]">${escape_html(pending)}</div></div>`);
308
+ } else {
309
+ $$renderer3.push("<!--[-1-->");
310
+ }
311
+ $$renderer3.push(`<!--]--> `);
312
+ if (busy) {
313
+ $$renderer3.push(`<!--[0--><div class="flex items-start gap-3">`);
314
+ agentHead($$renderer3);
315
+ $$renderer3.push(`<!----> <div class="min-w-0 flex-1"><p class="mb-1 flex items-center gap-2 text-xs text-muted-foreground"><span class="font-semibold text-foreground">Interviewer</span> `);
316
+ Loader_circle($$renderer3, { class: "size-3 animate-spin", "aria-hidden": "true" });
317
+ $$renderer3.push(`<!----> ${escape_html(activity ?? (streaming ? "Writing…" : "Thinking…"))}</p> `);
318
+ if (streaming) {
319
+ $$renderer3.push(`<!--[0--><div class="bubble bubble-firstmate chat-md text-[0.95rem]">`);
320
+ {
321
+ $$renderer3.push(`<!--[-1-->${escape_html(streaming)}`);
322
+ }
323
+ $$renderer3.push(`<!--]--></div>`);
324
+ } else {
325
+ $$renderer3.push("<!--[-1-->");
326
+ }
327
+ $$renderer3.push(`<!--]--></div></div>`);
328
+ } else {
329
+ $$renderer3.push("<!--[-1-->");
330
+ }
331
+ $$renderer3.push(`<!--]--> `);
332
+ if (draft.interview.done && !busy && last()?.role === "agent") {
333
+ $$renderer3.push(`<!--[0--><p class="rounded-md border border-sea/40 bg-sea/5 px-4 py-3 text-sm">The interviewer thinks the spec is ready. Read it over, comment on anything that is off, and
334
+ send it to build when you are happy. You can keep answering to add more.</p>`);
335
+ } else {
336
+ $$renderer3.push("<!--[-1-->");
337
+ }
338
+ $$renderer3.push(`<!--]--> `);
339
+ if (error) {
340
+ $$renderer3.push(`<!--[0--><div class="flex flex-wrap items-center gap-3 rounded-md border border-danger/30 bg-danger/5 px-4 py-3" role="alert"><p class="min-w-0 flex-1 text-sm text-danger">${escape_html(error)}</p> `);
341
+ if (unanswered()) {
342
+ $$renderer3.push("<!--[0-->");
343
+ Button($$renderer3, {
344
+ variant: "outline",
345
+ size: "sm",
346
+ onclick: onRetry,
347
+ children: ($$renderer4) => {
348
+ Rotate_ccw($$renderer4, { "aria-hidden": "true" });
349
+ $$renderer4.push(`<!---->Try again`);
350
+ },
351
+ $$slots: { default: true }
352
+ });
353
+ } else {
354
+ $$renderer3.push("<!--[-1-->");
355
+ }
356
+ $$renderer3.push(`<!--]--></div>`);
357
+ } else if (unanswered()) {
358
+ $$renderer3.push(`<!--[1--><div class="flex items-center gap-3 text-sm text-muted-foreground">Your last answer has no reply yet. `);
359
+ Button($$renderer3, {
360
+ variant: "outline",
361
+ size: "sm",
362
+ onclick: onRetry,
363
+ children: ($$renderer4) => {
364
+ Rotate_ccw($$renderer4, { "aria-hidden": "true" });
365
+ $$renderer4.push(`<!---->Ask the interviewer`);
366
+ },
367
+ $$slots: { default: true }
368
+ });
369
+ $$renderer3.push(`<!----></div>`);
370
+ } else {
371
+ $$renderer3.push("<!--[-1-->");
372
+ }
373
+ $$renderer3.push(`<!--]--></div> <div class="mt-4 border-t border-hair pt-4"><label for="spec-answer" class="sr-only">${escape_html(started() ? "Your answer" : "What you want built")}</label> <div class="flex items-end gap-2"><div class="min-w-0 flex-1">`);
374
+ DictateTextarea($$renderer3, {
375
+ id: "spec-answer",
376
+ "data-answer": true,
377
+ rows: started() ? 2 : 3,
378
+ placeholder: started() ? "Answer in your own words, or pick a suggestion…" : "e.g. Let a family add their trip photos to one shared album",
379
+ onkeydown,
380
+ class: "bg-card text-[0.95rem]",
381
+ get value() {
382
+ return answer;
383
+ },
384
+ set value($$value) {
385
+ answer = $$value;
386
+ $$settled = false;
387
+ }
388
+ });
389
+ $$renderer3.push(`<!----></div> `);
390
+ Button($$renderer3, {
391
+ size: "icon",
392
+ onclick: send,
393
+ disabled: busy || !answer.trim(),
394
+ "aria-label": started() ? "Send answer" : "Start the interview",
395
+ title: "Send (Enter)",
396
+ children: ($$renderer4) => {
397
+ if (busy) {
398
+ $$renderer4.push("<!--[0-->");
399
+ Loader_circle($$renderer4, { class: "animate-spin", "aria-hidden": "true" });
400
+ } else {
401
+ $$renderer4.push("<!--[-1-->");
402
+ Arrow_up($$renderer4, { "aria-hidden": "true" });
403
+ }
404
+ $$renderer4.push(`<!--]-->`);
405
+ },
406
+ $$slots: { default: true }
407
+ });
408
+ $$renderer3.push(`<!----></div> <p class="mt-2 text-xs text-muted-foreground">Enter sends, Shift+Enter starts a new line. Interviewer: Claude ${escape_html(model)}, ${escape_html(effort)} effort, read-only${escape_html(usageNote())}.</p></div></div>`);
409
+ }
410
+ do {
411
+ $$settled = true;
412
+ $$inner_renderer = $$renderer2.copy();
413
+ $$render_inner($$inner_renderer);
414
+ } while (!$$settled);
415
+ $$renderer2.subsume($$inner_renderer);
416
+ });
417
+ }
418
+ function ListField($$renderer, $$props) {
419
+ $$renderer.component(($$renderer2) => {
420
+ let {
421
+ items = void 0,
422
+ label,
423
+ item,
424
+ addLabel,
425
+ placeholder,
426
+ numbered = false,
427
+ multiline = false
428
+ /** The list's name, e.g. "Requirements". */
429
+ /** One entry's name, e.g. "Requirement". */
430
+ } = $$props;
431
+ let list = void 0;
432
+ const entry = (i) => list?.querySelectorAll("[data-entry]")[i];
433
+ async function add(at = items.length) {
434
+ items = [...items.slice(0, at), "", ...items.slice(at)];
435
+ await tick();
436
+ }
437
+ async function remove(i) {
438
+ items = items.filter((_, j) => j !== i);
439
+ await tick();
440
+ entry(Math.min(i, items.length - 1))?.focus();
441
+ }
442
+ function onkeydown(e, i) {
443
+ if (e.key === "Enter" && !e.shiftKey && !e.isComposing && (!multiline || e.metaKey)) {
444
+ e.preventDefault();
445
+ void add(i + 1);
446
+ } else if (e.key === "Backspace" && !items[i] && items.length > 1) {
447
+ e.preventDefault();
448
+ void remove(i).then(() => entry(Math.max(0, i - 1))?.focus());
449
+ }
450
+ }
451
+ let $$settled = true;
452
+ let $$inner_renderer;
453
+ function $$render_inner($$renderer3) {
454
+ $$renderer3.push(`<fieldset class="min-w-0"><legend class="text-sm font-medium">${escape_html(label)}</legend> <p class="mt-0.5 text-xs text-muted-foreground">${escape_html(multiline ? "⌘ Enter" : "Enter")} adds another; an empty one is left out.</p> <ol class="mt-2 space-y-2"><!--[-->`);
455
+ const each_array = ensure_array_like(items);
456
+ for (let i = 0, $$length = each_array.length; i < $$length; i++) {
457
+ each_array[i];
458
+ $$renderer3.push(`<li class="flex items-start gap-2"><span class="tabular mt-2 w-6 shrink-0 text-right text-sm text-muted-foreground" aria-hidden="true">${escape_html(numbered ? `${i + 1}.` : "•")}</span> `);
459
+ if (multiline) {
460
+ $$renderer3.push("<!--[0-->");
461
+ DictateTextarea($$renderer3, {
462
+ "data-entry": true,
463
+ rows: 2,
464
+ placeholder,
465
+ "aria-label": `${stringify(item)} ${stringify(i + 1)}`,
466
+ class: "min-h-10 bg-card",
467
+ onkeydown: (e) => onkeydown(e, i),
468
+ get value() {
469
+ return items[i];
470
+ },
471
+ set value($$value) {
472
+ items[i] = $$value;
473
+ $$settled = false;
474
+ }
475
+ });
476
+ } else {
477
+ $$renderer3.push(`<!--[-1--><input data-entry=""${attr("value", items[i])}${attr("placeholder", placeholder)}${attr("aria-label", `${stringify(item)} ${stringify(i + 1)}`)} class="h-9 w-full min-w-0 rounded-md border border-input bg-card px-2.5 text-sm shadow-xs outline-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50"/>`);
478
+ }
479
+ $$renderer3.push(`<!--]--> <button type="button" class="mt-1 rounded-md p-1.5 text-muted-foreground hover:bg-muted hover:text-foreground"${attr("aria-label", `Remove ${stringify(item.toLowerCase())} ${stringify(i + 1)}`)}>`);
480
+ X($$renderer3, { class: "size-4" });
481
+ $$renderer3.push(`<!----></button></li>`);
482
+ }
483
+ $$renderer3.push(`<!--]--></ol> <button type="button" class="mt-2 inline-flex items-center gap-1.5 rounded-md px-2 py-1 text-sm text-sea hover:bg-muted">`);
484
+ Plus($$renderer3, { class: "size-4", "aria-hidden": "true" });
485
+ $$renderer3.push(`<!---->${escape_html(addLabel)}</button></fieldset>`);
486
+ }
487
+ do {
488
+ $$settled = true;
489
+ $$inner_renderer = $$renderer2.copy();
490
+ $$render_inner($$inner_renderer);
491
+ } while (!$$settled);
492
+ $$renderer2.subsume($$inner_renderer);
493
+ bind_props($$props, { items });
494
+ });
495
+ }
496
+ function field($$renderer, id, label, hint) {
497
+ $$renderer.push(`<label${attr("for", id)} class="block text-sm font-medium">${escape_html(label)}</label> <p class="mt-0.5 text-xs text-muted-foreground">${escape_html(hint)}</p>`);
498
+ }
499
+ function SectionFields($$renderer, $$props) {
500
+ $$renderer.component(($$renderer2) => {
501
+ let {
502
+ draft,
503
+ section,
504
+ projects,
505
+ imageUrl,
506
+ uploading = false,
507
+ uploadError = null
508
+ /** Project names Firstmate knows, offered as suggestions. */
509
+ } = $$props;
510
+ const newProject = derived(() => !!draft.project.trim() && projects.length > 0 && !projects.some((p) => p.toLowerCase() === draft.project.trim().toLowerCase()));
511
+ let $$settled = true;
512
+ let $$inner_renderer;
513
+ function $$render_inner($$renderer3) {
514
+ $$renderer3.push(`<div class="space-y-6">`);
515
+ if (section === "project") {
516
+ $$renderer3.push(`<!--[0--><div>`);
517
+ field($$renderer3, "spec-project", "Project", "Pick one Firstmate knows, or type a new name.");
518
+ $$renderer3.push(`<!----> <input id="spec-project" class="h-9 w-full min-w-0 rounded-md border border-input bg-card px-2.5 text-sm shadow-xs outline-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 mt-2" list="spec-projects" autocomplete="off"${attr("value", draft.project)}/> <datalist id="spec-projects"><!--[-->`);
519
+ const each_array = ensure_array_like(projects);
520
+ for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
521
+ let p = each_array[$$index];
522
+ $$renderer3.option({ value: p }, ($$renderer4) => {
523
+ });
524
+ }
525
+ $$renderer3.push(`<!--]--></datalist> `);
526
+ if (newProject()) {
527
+ $$renderer3.push(`<!--[0--><p class="mt-1.5 text-xs text-muted-foreground">A project Firstmate does not know yet; it will ask where it lives.</p>`);
528
+ } else {
529
+ $$renderer3.push("<!--[-1-->");
530
+ }
531
+ $$renderer3.push(`<!--]--></div> <div>`);
532
+ field($$renderer3, "spec-title", "Title", "A short name for the work.");
533
+ $$renderer3.push(`<!----> <input id="spec-title" class="h-9 w-full min-w-0 rounded-md border border-input bg-card px-2.5 text-sm shadow-xs outline-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 mt-2"${attr("value", draft.title)}/></div> <div>`);
534
+ field($$renderer3, "spec-summary", "In one sentence", "What it is, as you would say it aloud.");
535
+ $$renderer3.push(`<!----> `);
536
+ DictateTextarea($$renderer3, {
537
+ id: "spec-summary",
538
+ class: "mt-2 bg-card",
539
+ rows: 2,
540
+ get value() {
541
+ return draft.summary;
542
+ },
543
+ set value($$value) {
544
+ draft.summary = $$value;
545
+ $$settled = false;
546
+ }
547
+ });
548
+ $$renderer3.push(`<!----></div>`);
549
+ } else if (section === "problem") {
550
+ $$renderer3.push(`<!--[1--><div>`);
551
+ field($$renderer3, "spec-problem", "The problem", "What is wrong or missing today.");
552
+ $$renderer3.push(`<!----> `);
553
+ DictateTextarea($$renderer3, {
554
+ id: "spec-problem",
555
+ class: "mt-2 min-h-28 bg-card",
556
+ get value() {
557
+ return draft.problem;
558
+ },
559
+ set value($$value) {
560
+ draft.problem = $$value;
561
+ $$settled = false;
562
+ }
563
+ });
564
+ $$renderer3.push(`<!----></div> <div>`);
565
+ field($$renderer3, "spec-goal", "The goal", "What will be true once this is done.");
566
+ $$renderer3.push(`<!----> `);
567
+ DictateTextarea($$renderer3, {
568
+ id: "spec-goal",
569
+ class: "mt-2 min-h-24 bg-card",
570
+ get value() {
571
+ return draft.goal;
572
+ },
573
+ set value($$value) {
574
+ draft.goal = $$value;
575
+ $$settled = false;
576
+ }
577
+ });
578
+ $$renderer3.push(`<!----></div>`);
579
+ } else if (section === "audience") {
580
+ $$renderer3.push(`<!--[2--><div>`);
581
+ field($$renderer3, "spec-audience", "Who it is for", "Who uses it, what they are trying to get done, and how often.");
582
+ $$renderer3.push(`<!----> `);
583
+ DictateTextarea($$renderer3, {
584
+ id: "spec-audience",
585
+ class: "mt-2 min-h-32 bg-card",
586
+ get value() {
587
+ return draft.audience;
588
+ },
589
+ set value($$value) {
590
+ draft.audience = $$value;
591
+ $$settled = false;
592
+ }
593
+ });
594
+ $$renderer3.push(`<!----></div>`);
595
+ } else if (section === "journeys") {
596
+ $$renderer3.push("<!--[3-->");
597
+ ListField($$renderer3, {
598
+ label: "Journeys",
599
+ item: "Journey",
600
+ addLabel: "Add a journey",
601
+ placeholder: "Describe one journey, step by step",
602
+ numbered: true,
603
+ multiline: true,
604
+ get items() {
605
+ return draft.journeys;
606
+ },
607
+ set items($$value) {
608
+ draft.journeys = $$value;
609
+ $$settled = false;
610
+ }
611
+ });
612
+ } else if (section === "scope") {
613
+ $$renderer3.push(`<!--[4--><div>`);
614
+ field($$renderer3, "spec-scope", "In scope", "What this piece of work includes.");
615
+ $$renderer3.push(`<!----> `);
616
+ DictateTextarea($$renderer3, {
617
+ id: "spec-scope",
618
+ class: "mt-2 min-h-24 bg-card",
619
+ get value() {
620
+ return draft.scope;
621
+ },
622
+ set value($$value) {
623
+ draft.scope = $$value;
624
+ $$settled = false;
625
+ }
626
+ });
627
+ $$renderer3.push(`<!----></div> <div>`);
628
+ field($$renderer3, "spec-non-goals", "Not in scope", "What it deliberately leaves for later.");
629
+ $$renderer3.push(`<!----> `);
630
+ DictateTextarea($$renderer3, {
631
+ id: "spec-non-goals",
632
+ class: "mt-2 min-h-24 bg-card",
633
+ get value() {
634
+ return draft.nonGoals;
635
+ },
636
+ set value($$value) {
637
+ draft.nonGoals = $$value;
638
+ $$settled = false;
639
+ }
640
+ });
641
+ $$renderer3.push(`<!----></div>`);
642
+ } else if (section === "requirements") {
643
+ $$renderer3.push("<!--[5-->");
644
+ ListField($$renderer3, {
645
+ label: "Requirements",
646
+ item: "Requirement",
647
+ addLabel: "Add a requirement",
648
+ placeholder: "One thing that must be true when it is done",
649
+ get items() {
650
+ return draft.requirements;
651
+ },
652
+ set items($$value) {
653
+ draft.requirements = $$value;
654
+ $$settled = false;
655
+ }
656
+ });
657
+ } else if (section === "ui") {
658
+ $$renderer3.push(`<!--[6--><div>`);
659
+ field($$renderer3, "spec-ui", "Look and feel", "Layout, tone, anything to match or avoid.");
660
+ $$renderer3.push(`<!----> `);
661
+ DictateTextarea($$renderer3, {
662
+ id: "spec-ui",
663
+ class: "mt-2 min-h-24 bg-card",
664
+ get value() {
665
+ return draft.uiNotes;
666
+ },
667
+ set value($$value) {
668
+ draft.uiNotes = $$value;
669
+ $$settled = false;
670
+ }
671
+ });
672
+ $$renderer3.push(`<!----></div> `);
673
+ ListField($$renderer3, {
674
+ label: "References",
675
+ item: "Reference",
676
+ addLabel: "Add a link",
677
+ placeholder: "https://… or the name of a page to follow",
678
+ get items() {
679
+ return draft.links;
680
+ },
681
+ set items($$value) {
682
+ draft.links = $$value;
683
+ $$settled = false;
684
+ }
685
+ });
686
+ $$renderer3.push(`<!----> <div><p class="text-sm font-medium">Screenshots</p> <p class="mt-0.5 text-xs text-muted-foreground">Drop pictures here, paste them, or choose files. Firstmate receives each one with its
687
+ caption.</p> <div${attr_class(`mt-2 rounded-lg border border-dashed p-4 transition-colors ${"border-hair"}`)}>`);
688
+ if (draft.images.length) {
689
+ $$renderer3.push(`<!--[0--><ul class="mb-4 grid grid-cols-[repeat(auto-fill,minmax(10rem,1fr))] gap-3"><!--[-->`);
690
+ const each_array_1 = ensure_array_like(draft.images);
691
+ for (let $$index_1 = 0, $$length = each_array_1.length; $$index_1 < $$length; $$index_1++) {
692
+ let img = each_array_1[$$index_1];
693
+ $$renderer3.push(`<li class="min-w-0 rounded-md border bg-card p-2"><div class="relative"><img${attr("src", imageUrl(img))}${attr("alt", img.caption || "Screenshot")} class="aspect-video w-full rounded-sm bg-muted object-cover" loading="lazy"/> <button type="button" class="absolute top-1 right-1 rounded-full bg-background/90 p-1 text-muted-foreground shadow-sm hover:text-foreground" aria-label="Remove this screenshot">`);
694
+ X($$renderer3, { class: "size-3.5" });
695
+ $$renderer3.push(`<!----></button></div> <input class="mt-2 h-8 w-full min-w-0 rounded-sm border border-transparent bg-transparent px-1 text-xs outline-none hover:border-input focus-visible:border-ring"${attr("value", img.caption)} placeholder="Caption" aria-label="Caption"/></li>`);
696
+ }
697
+ $$renderer3.push(`<!--]--></ul>`);
698
+ } else {
699
+ $$renderer3.push("<!--[-1-->");
700
+ }
701
+ $$renderer3.push(`<!--]--> <button type="button" class="inline-flex items-center gap-2 rounded-md px-2 py-1 text-sm text-sea hover:bg-muted"${attr("disabled", uploading, true)}>`);
702
+ if (uploading) {
703
+ $$renderer3.push("<!--[0-->");
704
+ Loader_circle($$renderer3, { class: "size-4 animate-spin", "aria-hidden": "true" });
705
+ $$renderer3.push(`<!---->Adding…`);
706
+ } else {
707
+ $$renderer3.push("<!--[-1-->");
708
+ Image_plus($$renderer3, { class: "size-4", "aria-hidden": "true" });
709
+ $$renderer3.push(`<!---->Choose screenshots`);
710
+ }
711
+ $$renderer3.push(`<!--]--></button> <input type="file" accept="image/png,image/jpeg,image/webp,image/gif" multiple="" class="hidden"/> `);
712
+ if (uploadError) {
713
+ $$renderer3.push(`<!--[0--><p class="mt-2 text-sm text-danger" role="alert">${escape_html(uploadError)}</p>`);
714
+ } else {
715
+ $$renderer3.push("<!--[-1-->");
716
+ }
717
+ $$renderer3.push(`<!--]--></div></div>`);
718
+ } else if (section === "constraints") {
719
+ $$renderer3.push(`<!--[7--><div>`);
720
+ field($$renderer3, "spec-constraints", "Constraints", "Rules it must follow: technology, data, permissions, deadlines.");
721
+ $$renderer3.push(`<!----> `);
722
+ DictateTextarea($$renderer3, {
723
+ id: "spec-constraints",
724
+ class: "mt-2 min-h-24 bg-card",
725
+ get value() {
726
+ return draft.constraints;
727
+ },
728
+ set value($$value) {
729
+ draft.constraints = $$value;
730
+ $$settled = false;
731
+ }
732
+ });
733
+ $$renderer3.push(`<!----></div> <div>`);
734
+ field($$renderer3, "spec-risks", "Risks", "What could go wrong, or needs extra care.");
735
+ $$renderer3.push(`<!----> `);
736
+ DictateTextarea($$renderer3, {
737
+ id: "spec-risks",
738
+ class: "mt-2 min-h-24 bg-card",
739
+ get value() {
740
+ return draft.risks;
741
+ },
742
+ set value($$value) {
743
+ draft.risks = $$value;
744
+ $$settled = false;
745
+ }
746
+ });
747
+ $$renderer3.push(`<!----></div>`);
748
+ } else if (section === "questions") {
749
+ $$renderer3.push("<!--[8-->");
750
+ ListField($$renderer3, {
751
+ label: "Questions",
752
+ item: "Question",
753
+ addLabel: "Add a question",
754
+ placeholder: "Something still to decide",
755
+ get items() {
756
+ return draft.questions;
757
+ },
758
+ set items($$value) {
759
+ draft.questions = $$value;
760
+ $$settled = false;
761
+ }
762
+ });
763
+ } else {
764
+ $$renderer3.push("<!--[-1-->");
765
+ }
766
+ $$renderer3.push(`<!--]--></div>`);
767
+ }
768
+ do {
769
+ $$settled = true;
770
+ $$inner_renderer = $$renderer2.copy();
771
+ $$render_inner($$inner_renderer);
772
+ } while (!$$settled);
773
+ $$renderer2.subsume($$inner_renderer);
774
+ });
775
+ }
776
+ function SpecPreview($$renderer, $$props) {
777
+ $$renderer.component(($$renderer2) => {
778
+ let mode = "document";
779
+ $$renderer2.push(`<div class="flex items-center gap-1" role="radiogroup" aria-label="Preview as"><!--[-->`);
780
+ const each_array = ensure_array_like(
781
+ // Scroll when the section (or whether it shows yet) changes, not on every keystroke.
782
+ [["document", "Document"], ["sent", "As sent"]]
783
+ );
784
+ for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
785
+ let [m, label] = each_array[$$index];
786
+ $$renderer2.push(`<button role="radio"${attr("aria-checked", mode === m)}${attr_class(`rounded-full border px-3 py-0.5 text-xs ${mode === m ? "border-foreground/30 bg-accent font-medium" : "border-transparent text-muted-foreground hover:text-foreground"}`)}>${escape_html(label)}</button>`);
787
+ }
788
+ $$renderer2.push(`<!--]--></div> <div class="relative mt-3 rounded-lg border bg-card px-6 py-5 shadow-xs xl:max-h-[calc(100dvh-13rem)] xl:overflow-y-auto">`);
789
+ {
790
+ $$renderer2.push("<!--[-1-->");
791
+ }
792
+ $$renderer2.push(`<!--]--></div>`);
793
+ });
794
+ }
795
+ function QuickForm($$renderer, $$props) {
796
+ $$renderer.component(($$renderer2) => {
797
+ let {
798
+ draft,
799
+ projects,
800
+ imageUrl,
801
+ uploading,
802
+ uploadError
803
+ /** The spec as Markdown, with pictures the page can show. */
804
+ /** The message as sent. */
805
+ } = $$props;
806
+ let step = 0;
807
+ const section = derived(() => SPEC_SECTIONS[step]);
808
+ const filled = derived(() => SPEC_SECTIONS.filter((s) => sectionFilled(draft, s.id)).length);
809
+ async function go(i) {
810
+ step = i;
811
+ await tick();
812
+ return;
813
+ }
814
+ $$renderer2.push(`<div class="grid items-start gap-8 xl:grid-cols-2"><section class="min-w-0 scroll-mt-20" aria-labelledby="section-heading"><div class="flex flex-wrap items-baseline gap-3"><label><span class="sr-only">Section</span> `);
815
+ $$renderer2.select(
816
+ {
817
+ class: "h-8 rounded-md border border-input bg-card px-2 text-xs",
818
+ value: step,
819
+ onchange: (e) => go(Number(e.currentTarget.value))
820
+ },
821
+ ($$renderer3) => {
822
+ $$renderer3.push(`<!--[-->`);
823
+ const each_array = ensure_array_like(SPEC_SECTIONS);
824
+ for (let i = 0, $$length = each_array.length; i < $$length; i++) {
825
+ let s = each_array[i];
826
+ $$renderer3.option({ value: i }, ($$renderer4) => {
827
+ $$renderer4.push(`Step ${escape_html(i + 1)} of ${escape_html(SPEC_SECTIONS.length)}: ${escape_html(s.title)}${escape_html(sectionFilled(draft, s.id) ? " ✓" : "")}`);
828
+ });
829
+ }
830
+ $$renderer3.push(`<!--]-->`);
831
+ }
832
+ );
833
+ $$renderer2.push(`</label> <p class="text-xs text-muted-foreground">${escape_html(filled())} of ${escape_html(SPEC_SECTIONS.length)} sections written</p></div> <h2 id="section-heading" tabindex="-1" class="mt-2 scroll-mt-20 font-display text-2xl font-medium outline-none">${escape_html(section().title)}</h2> <p class="mt-1 max-w-prose text-sm text-muted-foreground">${escape_html(section().prompt)}</p> <p class="mt-3 max-w-prose border-l-2 border-hair pl-3 text-sm text-muted-foreground italic"><span class="not-italic">For example:</span> ${escape_html(section().example)}</p> <div class="mt-6"><!---->`);
834
+ {
835
+ SectionFields($$renderer2, {
836
+ draft,
837
+ section: section().id,
838
+ projects,
839
+ imageUrl,
840
+ uploading,
841
+ uploadError
842
+ });
843
+ }
844
+ $$renderer2.push(`<!----></div> <div class="mt-8 flex flex-wrap items-center gap-3 border-t border-hair pt-5">`);
845
+ Button($$renderer2, {
846
+ variant: "ghost",
847
+ onclick: () => go(step - 1),
848
+ disabled: step === 0,
849
+ children: ($$renderer3) => {
850
+ Arrow_left($$renderer3, { "aria-hidden": "true" });
851
+ $$renderer3.push(`<!---->Back`);
852
+ },
853
+ $$slots: { default: true }
854
+ });
855
+ $$renderer2.push(`<!----> `);
856
+ if (step < SPEC_SECTIONS.length - 1) {
857
+ $$renderer2.push("<!--[0-->");
858
+ Button($$renderer2, {
859
+ variant: "outline",
860
+ onclick: () => go(step + 1),
861
+ children: ($$renderer3) => {
862
+ $$renderer3.push(`<!---->Next: ${escape_html(SPEC_SECTIONS[step + 1].title)}`);
863
+ Arrow_right($$renderer3, { "aria-hidden": "true" });
864
+ $$renderer3.push(`<!---->`);
865
+ },
866
+ $$slots: { default: true }
867
+ });
868
+ } else {
869
+ $$renderer2.push(`<!--[-1--><p class="text-sm text-muted-foreground">That is every section. Read the preview, then send it to build.</p>`);
870
+ }
871
+ $$renderer2.push(`<!--]--></div></section> <section class="min-w-0 xl:sticky xl:top-20" aria-labelledby="preview-heading"><h2 id="preview-heading" class="section-label">Preview</h2> <div class="mt-3">`);
872
+ SpecPreview($$renderer2, {
873
+ focus: section().id === "project" ? null : section().title
874
+ });
875
+ $$renderer2.push(`<!----></div></section></div>`);
876
+ });
877
+ }
878
+ function SpecDocument($$renderer, $$props) {
879
+ $$renderer.component(($$renderer2) => {
880
+ let { draft, changed, busy, onComment } = $$props;
881
+ const sections = SPEC_SECTIONS.filter((s) => s.id !== "project");
882
+ const covered = derived(() => SPEC_SECTIONS.filter((s) => sectionFilled(draft, s.id)).length);
883
+ const html$1 = (id) => "";
884
+ const comments = (id) => draft.comments.filter((c) => c.section === id);
885
+ const openCount = derived(() => draft.comments.filter((c) => !c.resolvedAt).length);
886
+ const changedTitles = derived(() => SPEC_SECTIONS.filter((s) => changed.includes(s.id)).map((s) => s.id === "project" ? "Title and summary" : s.title));
887
+ let writing = null;
888
+ let text = "";
889
+ let posting = false;
890
+ async function post() {
891
+ if (!writing || !text.trim() || posting) return;
892
+ posting = true;
893
+ const ok = await onComment({ ...writing, text: text.trim() });
894
+ posting = false;
895
+ if (ok) {
896
+ writing = null;
897
+ text = "";
898
+ window.getSelection()?.removeAllRanges();
899
+ }
900
+ }
901
+ function onkeydown(e) {
902
+ if (e.key === "Enter" && (e.metaKey || e.ctrlKey)) {
903
+ e.preventDefault();
904
+ void post();
905
+ } else if (e.key === "Escape") {
906
+ writing = null;
907
+ }
908
+ }
909
+ function commentBox($$renderer3, section) {
910
+ if (writing?.section === section) {
911
+ $$renderer3.push(`<!--[0--><div class="mt-3 rounded-md border border-brass/50 bg-background p-3" data-comment-box="">`);
912
+ if (writing.quote) {
913
+ $$renderer3.push(`<!--[0--><p class="mb-2 border-l-2 border-brass pl-2 text-xs text-muted-foreground italic">“${escape_html(writing.quote)}”</p>`);
914
+ } else {
915
+ $$renderer3.push("<!--[-1-->");
916
+ }
917
+ $$renderer3.push(`<!--]--> `);
918
+ DictateTextarea($$renderer3, {
919
+ rows: 2,
920
+ placeholder: "What should change here?",
921
+ "aria-label": "Your comment",
922
+ onkeydown,
923
+ get value() {
924
+ return text;
925
+ },
926
+ set value($$value) {
927
+ text = $$value;
928
+ $$settled = false;
929
+ }
930
+ });
931
+ $$renderer3.push(`<!----> <div class="mt-2 flex items-center justify-end gap-2">`);
932
+ Button($$renderer3, {
933
+ variant: "ghost",
934
+ size: "sm",
935
+ onclick: () => writing = null,
936
+ children: ($$renderer4) => {
937
+ $$renderer4.push(`<!---->Cancel`);
938
+ },
939
+ $$slots: { default: true }
940
+ });
941
+ $$renderer3.push(`<!----> `);
942
+ Button($$renderer3, {
943
+ size: "sm",
944
+ onclick: post,
945
+ disabled: !text.trim() || posting,
946
+ children: ($$renderer4) => {
947
+ if (posting) {
948
+ $$renderer4.push("<!--[0-->");
949
+ Loader_circle($$renderer4, { class: "animate-spin", "aria-hidden": "true" });
950
+ } else {
951
+ $$renderer4.push("<!--[-1-->");
952
+ }
953
+ $$renderer4.push(`<!--]--> Comment`);
954
+ },
955
+ $$slots: { default: true }
956
+ });
957
+ $$renderer3.push(`<!----></div></div>`);
958
+ } else {
959
+ $$renderer3.push("<!--[-1-->");
960
+ }
961
+ $$renderer3.push(`<!--]-->`);
962
+ }
963
+ function commentList($$renderer3, section) {
964
+ const list = comments(section);
965
+ if (list.length) {
966
+ $$renderer3.push(`<!--[0--><ul class="mt-3 space-y-2" aria-label="Comments"><!--[-->`);
967
+ const each_array = ensure_array_like(list);
968
+ for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
969
+ let c = each_array[$$index];
970
+ $$renderer3.push(`<li${attr_class(`rounded-md border px-3 py-2 text-sm ${c.resolvedAt ? "border-hair bg-muted/40 text-muted-foreground" : "border-brass/50 bg-background"}`)}><div class="flex items-start gap-2"><div class="min-w-0 flex-1">`);
971
+ if (c.quote) {
972
+ $$renderer3.push(`<!--[0--><p class="mb-1 border-l-2 border-brass/70 pl-2 text-xs italic">“${escape_html(c.quote)}”</p>`);
973
+ } else {
974
+ $$renderer3.push("<!--[-1-->");
975
+ }
976
+ $$renderer3.push(`<!--]--> <p${attr_class(`break-words ${c.resolvedAt ? "" : "text-foreground"}`)}>${escape_html(c.text)}</p> `);
977
+ if (c.resolvedAt) {
978
+ $$renderer3.push(`<!--[0--><p class="mt-1 flex items-start gap-1.5 text-xs">`);
979
+ Check($$renderer3, {
980
+ class: "mt-0.5 size-3.5 shrink-0 text-sea",
981
+ "aria-hidden": "true"
982
+ });
983
+ $$renderer3.push(`<!----> <span><span class="sr-only">Resolved:</span>${escape_html(c.reply || "Addressed.")}</span></p>`);
984
+ } else {
985
+ $$renderer3.push(`<!--[-1--><p class="mt-1 flex items-center gap-1.5 text-xs text-muted-foreground">`);
986
+ if (busy) {
987
+ $$renderer3.push("<!--[0-->");
988
+ Loader_circle($$renderer3, { class: "size-3 animate-spin", "aria-hidden": "true" });
989
+ $$renderer3.push(`<!---->The
990
+ interviewer is on it`);
991
+ } else {
992
+ $$renderer3.push(`<!--[-1-->Open: the interviewer addresses it next`);
993
+ }
994
+ $$renderer3.push(`<!--]--></p>`);
995
+ }
996
+ $$renderer3.push(`<!--]--></div> `);
997
+ if (!c.resolvedAt) {
998
+ $$renderer3.push(`<!--[0--><button class="-mt-0.5 -mr-1 rounded p-1 text-muted-foreground hover:bg-muted hover:text-foreground" aria-label="Remove this comment" title="Remove this comment">`);
999
+ X($$renderer3, { class: "size-3.5", "aria-hidden": "true" });
1000
+ $$renderer3.push(`<!----></button>`);
1001
+ } else {
1002
+ $$renderer3.push("<!--[-1-->");
1003
+ }
1004
+ $$renderer3.push(`<!--]--></div></li>`);
1005
+ }
1006
+ $$renderer3.push(`<!--]--></ul>`);
1007
+ } else {
1008
+ $$renderer3.push("<!--[-1-->");
1009
+ }
1010
+ $$renderer3.push(`<!--]-->`);
1011
+ }
1012
+ function commentButton($$renderer3, section, label) {
1013
+ $$renderer3.push(`<button class="comment-btn ml-auto shrink-0 rounded p-1 text-muted-foreground hover:bg-muted hover:text-foreground svelte-byyley"${attr("aria-label", `Comment on ${stringify(label)}`)}${attr("title", `Comment on ${stringify(label)}`)}>`);
1014
+ Message_square_plus($$renderer3, { class: "size-4", "aria-hidden": "true" });
1015
+ $$renderer3.push(`<!----></button>`);
1016
+ }
1017
+ let $$settled = true;
1018
+ let $$inner_renderer;
1019
+ function $$render_inner($$renderer3) {
1020
+ $$renderer3.push(`<div class="spec-doc relative rounded-lg border border-hair bg-card px-5 py-5 sm:px-7 sm:py-6"><p class="flex flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted-foreground"><span class="tabular">${escape_html(covered())} of ${escape_html(SPEC_SECTIONS.length)} sections covered</span> `);
1021
+ if (openCount()) {
1022
+ $$renderer3.push(`<!--[0--><span class="text-brass">${escape_html(openCount())} open comment${escape_html(openCount() === 1 ? "" : "s")}</span>`);
1023
+ } else {
1024
+ $$renderer3.push("<!--[-1-->");
1025
+ }
1026
+ $$renderer3.push(`<!--]--> `);
1027
+ if (draft.interview.done) {
1028
+ $$renderer3.push(`<!--[0--><span class="rounded-full border border-sea/50 px-2 py-0.5 font-medium text-sea">Ready to build</span>`);
1029
+ } else {
1030
+ $$renderer3.push("<!--[-1-->");
1031
+ }
1032
+ $$renderer3.push(`<!--]--></p> `);
1033
+ if (changedTitles().length) {
1034
+ $$renderer3.push(`<!--[0--><p class="mt-1 text-xs text-muted-foreground" aria-live="polite">Just changed: ${escape_html(changedTitles().join(", "))}.</p>`);
1035
+ } else {
1036
+ $$renderer3.push("<!--[-1-->");
1037
+ }
1038
+ $$renderer3.push(`<!--]--> <header data-section="project"${attr_class(`doc-section mt-4 ${changed.includes("project") ? "is-updated" : ""}`, "svelte-byyley")}><div class="flex items-start gap-2"><h2 class="min-w-0 flex-1 font-display text-[1.7rem] leading-tight font-medium">${escape_html(specTitle(draft))}</h2> `);
1039
+ commentButton($$renderer3, "project", "the title and summary");
1040
+ $$renderer3.push(`<!----></div> `);
1041
+ if (sectionMarkdown(draft, "project")) {
1042
+ $$renderer3.push(`<!--[0--><div class="chat-md mt-2 text-[0.95rem]">${html(html$1())}</div>`);
1043
+ } else {
1044
+ $$renderer3.push(`<!--[-1--><p class="mt-2 text-sm text-muted-foreground italic">The project and a one-line summary appear here as the interview goes.</p>`);
1045
+ }
1046
+ $$renderer3.push(`<!--]--> `);
1047
+ commentList($$renderer3, "project");
1048
+ $$renderer3.push(`<!----> `);
1049
+ commentBox($$renderer3, "project");
1050
+ $$renderer3.push(`<!----></header> <!--[-->`);
1051
+ const each_array_1 = ensure_array_like(sections);
1052
+ for (let $$index_1 = 0, $$length = each_array_1.length; $$index_1 < $$length; $$index_1++) {
1053
+ let s = each_array_1[$$index_1];
1054
+ const body = sectionMarkdown(draft, s.id);
1055
+ $$renderer3.push(`<section${attr("data-section", s.id)}${attr_class(`doc-section mt-6 ${changed.includes(s.id) ? "is-updated" : ""}`, "svelte-byyley")}${attr("aria-labelledby", `doc-${stringify(s.id)}`)}><div class="flex items-center gap-2 border-b border-hair pb-1"><h3${attr("id", `doc-${stringify(s.id)}`)} class="font-display text-[1.2rem] font-medium">${escape_html(s.title)}</h3> `);
1056
+ if (changed.includes(s.id)) {
1057
+ $$renderer3.push(`<!--[0--><span class="rounded-full bg-brass/15 px-2 py-0.5 text-[0.7rem] font-medium tracking-wide text-brass">Updated</span>`);
1058
+ } else {
1059
+ $$renderer3.push("<!--[-1-->");
1060
+ }
1061
+ $$renderer3.push(`<!--]--> `);
1062
+ commentButton($$renderer3, s.id, s.title);
1063
+ $$renderer3.push(`<!----></div> `);
1064
+ if (body) {
1065
+ $$renderer3.push(`<!--[0--><div class="chat-md doc-md mt-2 text-[0.95rem] svelte-byyley">${html(html$1(s.id))}</div>`);
1066
+ } else {
1067
+ $$renderer3.push(`<!--[-1--><p class="mt-2 text-sm text-muted-foreground italic">Not covered yet.</p>`);
1068
+ }
1069
+ $$renderer3.push(`<!--]--> `);
1070
+ commentList($$renderer3, s.id);
1071
+ $$renderer3.push(`<!----> `);
1072
+ commentBox($$renderer3, s.id);
1073
+ $$renderer3.push(`<!----></section>`);
1074
+ }
1075
+ $$renderer3.push(`<!--]--> `);
1076
+ {
1077
+ $$renderer3.push("<!--[-1-->");
1078
+ }
1079
+ $$renderer3.push(`<!--]--></div>`);
1080
+ }
1081
+ do {
1082
+ $$settled = true;
1083
+ $$inner_renderer = $$renderer2.copy();
1084
+ $$render_inner($$inner_renderer);
1085
+ } while (!$$settled);
1086
+ $$renderer2.subsume($$inner_renderer);
1087
+ });
1088
+ }
1089
+ function _page($$renderer, $$props) {
1090
+ $$renderer.component(($$renderer2) => {
1091
+ let { data } = $$props;
1092
+ const clone2 = (d) => d ? JSON.parse(JSON.stringify(d)) : null;
1093
+ const initial = clone2(data.draft);
1094
+ let draft = initial;
1095
+ let specs = data.specs;
1096
+ let savedJson = JSON.stringify(initial);
1097
+ let saveState = "saved";
1098
+ let saveError = null;
1099
+ let uploading = false;
1100
+ let uploadError = null;
1101
+ let confirmDelete = false;
1102
+ let busy = false;
1103
+ let now = Date.now();
1104
+ let working = !!data.interviewer?.busy;
1105
+ let streaming = "";
1106
+ let activity = null;
1107
+ let turnError = null;
1108
+ let pendingAnswer = null;
1109
+ let commentsWaiting = false;
1110
+ let pane = "interview";
1111
+ let specUnseen = false;
1112
+ initial?.id ?? null;
1113
+ const fleet = derived(currentFleet);
1114
+ const projects = derived(() => (fleet()?.projects ?? []).map((p) => p.name).filter(Boolean));
1115
+ const imageUrl = (img) => `/api/specs/${encodeURIComponent(draft?.id ?? "")}/images/${encodeURIComponent(img.name)}`;
1116
+ const preview = derived(() => draft ? specMarkdown(draft, imageUrl) : "");
1117
+ const asSent = derived(() => draft ? specMessage(draft, () => "attached").replace(/!\[([^\]]*)\]\(<attached>\)/g, "[Screenshot: $1, sent as a file]") : "");
1118
+ const lastAgent = derived(() => draft?.interview.turns.findLast((t) => t.role === "agent") ?? null);
1119
+ const changed = derived(() => lastAgent()?.changed ?? []);
1120
+ const openComments = derived(() => draft?.comments.filter((c) => !c.resolvedAt).length ?? 0);
1121
+ const hasWhat = derived(() => !!draft && (!!draft.title.trim() || !!draft.summary.trim()));
1122
+ const hasProject = derived(() => !!draft?.project.trim());
1123
+ const editedSinceSent = (s) => !!s.sentAt && Date.parse(s.updatedAt) - Date.parse(s.sentAt) > 5e3;
1124
+ const canSend = derived(() => hasWhat() && hasProject() && !busy && !working);
1125
+ const headers = (extra = {}) => ({ [SESSION_HEADER]: data.sessionToken, ...extra });
1126
+ async function problem(res) {
1127
+ const body = await res.json().catch(() => null);
1128
+ return body?.message ?? `Wheelhouse answered ${res.status}.`;
1129
+ }
1130
+ function adopt(d) {
1131
+ if (!d || d.id !== draft?.id) return;
1132
+ const local = saveState === "saved" ? null : { project: draft.project, mode: draft.mode };
1133
+ const next = clone2(d);
1134
+ savedJson = JSON.stringify(next);
1135
+ if (local) Object.assign(next, local);
1136
+ draft = next;
1137
+ specs = specs.map((s) => s.id === d.id ? summarize(d) : s);
1138
+ if (pendingAnswer && d.interview.turns.at(-1)?.role === "captain") pendingAnswer = null;
1139
+ }
1140
+ let timer;
1141
+ let saving = Promise.resolve(true);
1142
+ function save(keepalive = false) {
1143
+ clearTimeout(timer);
1144
+ saving = saving.then(() => saveNow(keepalive));
1145
+ return saving;
1146
+ }
1147
+ async function saveNow(keepalive) {
1148
+ if (!draft) return true;
1149
+ const snapshot$1 = draft;
1150
+ const json = JSON.stringify(snapshot$1);
1151
+ if (json === savedJson) {
1152
+ saveState = "saved";
1153
+ return true;
1154
+ }
1155
+ saveState = "saving";
1156
+ const base = JSON.parse(savedJson);
1157
+ const edited = ["project", "title", "mode"].filter((f) => base?.[f] !== snapshot$1[f]);
1158
+ try {
1159
+ const res = await fetch(`/api/specs/${encodeURIComponent(snapshot$1.id)}`, {
1160
+ method: "PUT",
1161
+ headers: headers({ "content-type": "application/json" }),
1162
+ body: JSON.stringify({ ...snapshot$1, edited }),
1163
+ keepalive
1164
+ });
1165
+ if (!res.ok) {
1166
+ saveError = await problem(res);
1167
+ saveState = "error";
1168
+ return false;
1169
+ }
1170
+ const stored = (await res.json()).draft;
1171
+ saveError = null;
1172
+ specs = specs.map((s) => s.id === stored.id ? summarize(stored) : s);
1173
+ if (draft?.id === stored.id) {
1174
+ savedJson = JSON.stringify(stored);
1175
+ if (JSON.stringify(snapshot(draft)) === json) draft = clone2(stored);
1176
+ if (pendingAnswer && stored.interview.turns.at(-1)?.role === "captain") pendingAnswer = null;
1177
+ }
1178
+ saveState = draft && JSON.stringify(draft) !== savedJson ? "unsaved" : "saved";
1179
+ return true;
1180
+ } catch {
1181
+ saveError = "Could not reach the Wheelhouse server.";
1182
+ saveState = "error";
1183
+ return false;
1184
+ }
1185
+ }
1186
+ let wide = true;
1187
+ async function* events(res) {
1188
+ const reader = res.body.pipeThrough(new TextDecoderStream()).getReader();
1189
+ let buf = "";
1190
+ for (; ; ) {
1191
+ const { value, done } = await reader.read();
1192
+ if (done) return;
1193
+ buf += value;
1194
+ let end;
1195
+ while ((end = buf.indexOf("\n\n")) >= 0) {
1196
+ const chunk = buf.slice(0, end);
1197
+ buf = buf.slice(end + 2);
1198
+ const event = /^event: (.*)$/m.exec(chunk)?.[1];
1199
+ const body = /^data: (.*)$/m.exec(chunk)?.[1];
1200
+ if (event && body) yield { event, data: JSON.parse(body) };
1201
+ }
1202
+ }
1203
+ }
1204
+ async function runTurn(answer) {
1205
+ if (!draft || working) return false;
1206
+ const id = draft.id;
1207
+ if (!await save()) return false;
1208
+ working = true;
1209
+ streaming = "";
1210
+ activity = null;
1211
+ turnError = null;
1212
+ pendingAnswer = answer;
1213
+ let accepted = false;
1214
+ try {
1215
+ const res = await fetch(`/api/specs/${encodeURIComponent(id)}/turn`, {
1216
+ method: "POST",
1217
+ headers: headers({ "content-type": "application/json" }),
1218
+ body: JSON.stringify(answer ? { answer } : {})
1219
+ });
1220
+ if (!res.ok || !res.body) {
1221
+ turnError = await problem(res);
1222
+ if (res.status === 409) void waitForTurn();
1223
+ return false;
1224
+ }
1225
+ accepted = true;
1226
+ for await (const e of events(res)) {
1227
+ const d = e.data;
1228
+ if (e.event === "text") {
1229
+ streaming += d.text ?? "";
1230
+ activity = null;
1231
+ } else if (e.event === "reset") streaming = "";
1232
+ else if (e.event === "tool") activity = `Reading ${d.detail || d.name}`;
1233
+ else if (e.event === "done") {
1234
+ adopt(d.draft);
1235
+ if (pane === "interview" && lastAgent()?.changed.length) specUnseen = true;
1236
+ } else if (e.event === "error") {
1237
+ turnError = d.message ?? "The interviewer stopped.";
1238
+ adopt(d.draft);
1239
+ }
1240
+ }
1241
+ return true;
1242
+ } catch {
1243
+ turnError ??= "Lost touch with the Wheelhouse server. Reload to see where the interview got to.";
1244
+ return accepted;
1245
+ } finally {
1246
+ if (draft?.id === id) {
1247
+ working = false;
1248
+ streaming = "";
1249
+ activity = null;
1250
+ pendingAnswer = null;
1251
+ if (commentsWaiting) {
1252
+ commentsWaiting = false;
1253
+ void runTurn(null);
1254
+ }
1255
+ }
1256
+ }
1257
+ }
1258
+ async function waitForTurn() {
1259
+ const id = draft?.id;
1260
+ if (!id) return;
1261
+ working = true;
1262
+ for (; ; ) {
1263
+ await new Promise((r) => setTimeout(r, 1500));
1264
+ if (draft?.id !== id) return;
1265
+ const res = await fetch(`/api/specs/${encodeURIComponent(id)}`).catch(() => null);
1266
+ if (!res?.ok) continue;
1267
+ const body = await res.json();
1268
+ if (body.busy) continue;
1269
+ adopt(body.draft);
1270
+ working = false;
1271
+ if (turnError?.startsWith("The interviewer is already")) turnError = null;
1272
+ return;
1273
+ }
1274
+ }
1275
+ async function addComment(c) {
1276
+ if (!draft) return false;
1277
+ const res = await fetch(`/api/specs/${encodeURIComponent(draft.id)}/comments`, {
1278
+ method: "POST",
1279
+ headers: headers({ "content-type": "application/json" }),
1280
+ body: JSON.stringify(c)
1281
+ }).catch(() => null);
1282
+ if (!res?.ok) {
1283
+ turnError = res ? await problem(res) : "Could not reach the Wheelhouse server.";
1284
+ return false;
1285
+ }
1286
+ adopt((await res.json()).draft);
1287
+ if (working) commentsWaiting = true;
1288
+ else void runTurn(null);
1289
+ return true;
1290
+ }
1291
+ async function newSpec() {
1292
+ busy = true;
1293
+ if (!await save()) {
1294
+ busy = false;
1295
+ return;
1296
+ }
1297
+ try {
1298
+ const res = await fetch("/api/specs", { method: "POST", headers: headers() });
1299
+ if (!res.ok) {
1300
+ saveError = await problem(res);
1301
+ saveState = "error";
1302
+ return;
1303
+ }
1304
+ const { draft: d } = await res.json();
1305
+ await goto(`/spec?id=${encodeURIComponent(d.id)}`, { invalidateAll: true });
1306
+ } finally {
1307
+ busy = false;
1308
+ }
1309
+ }
1310
+ async function remove() {
1311
+ if (!draft) return;
1312
+ busy = true;
1313
+ clearTimeout(timer);
1314
+ const res = await fetch(`/api/specs/${encodeURIComponent(draft.id)}`, { method: "DELETE", headers: headers() }).catch(() => null);
1315
+ busy = false;
1316
+ confirmDelete = false;
1317
+ if (!res?.ok && res?.status !== 404) {
1318
+ saveError = res ? await problem(res) : "Could not reach the Wheelhouse server.";
1319
+ saveState = "error";
1320
+ return;
1321
+ }
1322
+ savedJson = "null";
1323
+ draft = null;
1324
+ await goto("/spec", {});
1325
+ }
1326
+ async function send() {
1327
+ if (!draft || !canSend()) return;
1328
+ busy = true;
1329
+ const id = draft.id;
1330
+ try {
1331
+ if (!await save()) return;
1332
+ const res = await fetch(`/api/specs/${encodeURIComponent(id)}/build-request`, { method: "POST", headers: headers() }).catch(() => null);
1333
+ if (!res?.ok) {
1334
+ saveError = res ? await problem(res) : "Could not reach the Wheelhouse server.";
1335
+ saveState = "error";
1336
+ return;
1337
+ }
1338
+ const { message } = await res.json();
1339
+ const token = data.sessionToken;
1340
+ composerBus.outgoing = {
1341
+ text: message,
1342
+ from: `/spec?id=${encodeURIComponent(id)}`,
1343
+ onSent: () => {
1344
+ void fetch(`/api/specs/${encodeURIComponent(id)}/sent`, { method: "POST", headers: { [SESSION_HEADER]: token } });
1345
+ }
1346
+ };
1347
+ await goto("/");
1348
+ } finally {
1349
+ busy = false;
1350
+ }
1351
+ }
1352
+ const saveLabel = derived(() => saveState === "saving" ? "Saving…" : saveState === "unsaved" ? "Unsaved changes" : saveState === "error" ? "Not saved" : "Saved");
1353
+ const sendHint = derived(() => {
1354
+ if (!draft) return "";
1355
+ if (!hasWhat()) return "Send to build once the spec has a title or a summary.";
1356
+ if (!hasProject()) return "Choose the project it is for, then send it to build.";
1357
+ if (working) return "Wait for the interviewer to finish its turn.";
1358
+ if (draft.sentAt) {
1359
+ return `Sent to build ${ago(draft.sentAt, now)}${editedSinceSent(draft) ? "; edited since" : ""}.`;
1360
+ }
1361
+ return `Sends the spec to Firstmate as one build request for ${draft.project.trim()}.`;
1362
+ });
1363
+ head("1flepf4", $$renderer2, ($$renderer3) => {
1364
+ $$renderer3.title(($$renderer4) => {
1365
+ $$renderer4.push(`<title>Spec · Wheelhouse</title>`);
1366
+ });
1367
+ });
1368
+ $$renderer2.push(`<main class="px-4 py-6 sm:px-6 lg:px-10"><div class="surface px-4 py-6 sm:px-8 sm:py-8"><h1 class="text-2xl">Write a spec</h1> <p class="mt-1 max-w-prose text-sm text-muted-foreground">An interviewer asks you one question at a time and writes the spec as you answer. Comment on
1369
+ anything in the spec to have it changed, then send it to build.</p> `);
1370
+ if (data.problem) {
1371
+ $$renderer2.push(`<!--[0--><p class="mt-8 rounded-lg border border-dashed p-6 text-sm text-muted-foreground">${escape_html(data.problem)}</p>`);
1372
+ } else {
1373
+ $$renderer2.push(`<!--[-1--><div class="mt-8 grid items-start gap-8 lg:grid-cols-[14rem_minmax(0,1fr)]"><aside class="min-w-0 lg:sticky lg:top-20"><details class="group"${attr("open", wide, true)}><summary class="section-label list-none lg:pointer-events-none [&amp;::-webkit-details-marker]:hidden"><span id="specs-heading">Your specs</span><span class="lg:hidden"> (${escape_html(specs.length)})</span> `);
1374
+ Chevron_down($$renderer2, {
1375
+ class: "size-4 shrink-0 transition-transform group-open:rotate-180 lg:hidden",
1376
+ "aria-hidden": "true"
1377
+ });
1378
+ $$renderer2.push(`<!----></summary> `);
1379
+ Button($$renderer2, {
1380
+ variant: "outline",
1381
+ size: "sm",
1382
+ class: "mt-3 w-full justify-start",
1383
+ onclick: newSpec,
1384
+ disabled: busy,
1385
+ children: ($$renderer3) => {
1386
+ File_plus_corner($$renderer3, { "aria-hidden": "true" });
1387
+ $$renderer3.push(`<!---->New spec`);
1388
+ },
1389
+ $$slots: { default: true }
1390
+ });
1391
+ $$renderer2.push(`<!----> `);
1392
+ if (specs.length) {
1393
+ $$renderer2.push(`<!--[0--><ul class="mt-3 space-y-0.5" aria-labelledby="specs-heading"><!--[-->`);
1394
+ const each_array = ensure_array_like(specs);
1395
+ for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
1396
+ let s = each_array[$$index];
1397
+ const open = draft?.id === s.id;
1398
+ $$renderer2.push(`<li><a${attr("href", `/spec?id=${stringify(encodeURIComponent(s.id))}`)}${attr("aria-current", open ? "page" : void 0)}${attr_class(`block rounded-md border-l-2 px-3 py-2 hover:bg-muted ${open ? "border-brass bg-accent" : "border-transparent"}`)}><span class="block truncate text-sm font-medium">${escape_html(open && draft ? specTitle(draft) : s.title)}</span> <span class="block truncate text-xs text-muted-foreground">${escape_html([
1399
+ (open && draft ? draft.project.trim() : s.project) || null,
1400
+ s.sentAt ? editedSinceSent(s) ? "Edited since sent" : "Sent" : null,
1401
+ `edited ${ago(s.updatedAt, now)}`
1402
+ ].filter(Boolean).join(" · "))}</span></a></li>`);
1403
+ }
1404
+ $$renderer2.push(`<!--]--></ul>`);
1405
+ } else {
1406
+ $$renderer2.push("<!--[-1-->");
1407
+ }
1408
+ $$renderer2.push(`<!--]--></details></aside> `);
1409
+ if (!draft) {
1410
+ $$renderer2.push(`<!--[0--><section class="rounded-lg border border-dashed p-8" aria-label="No spec open"><h2 class="font-display text-xl font-medium">Start a spec for Firstmate</h2> <p class="mt-2 max-w-prose text-sm text-muted-foreground">Say what you want built. An interviewer grills you on it one question at a time,
1411
+ offering answers with the one it recommends, and writes the spec as you go: the
1412
+ problem, who it is for, how they use it, what is in and out, how you will know it is
1413
+ done, and what to watch out for. Your work is saved as you go.</p> `);
1414
+ Button($$renderer2, {
1415
+ class: "mt-5",
1416
+ onclick: newSpec,
1417
+ disabled: busy,
1418
+ children: ($$renderer3) => {
1419
+ File_plus_corner($$renderer3, { "aria-hidden": "true" });
1420
+ $$renderer3.push(`<!---->Start a spec`);
1421
+ },
1422
+ $$slots: { default: true }
1423
+ });
1424
+ $$renderer2.push(`<!----></section>`);
1425
+ } else {
1426
+ $$renderer2.push(`<!--[-1--><div class="min-w-0"><div class="flex flex-wrap items-center gap-x-4 gap-y-3 border-b border-hair pb-4"><div class="flex rounded-md border border-hair p-0.5" role="radiogroup" aria-label="Build the spec with"><!--[-->`);
1427
+ const each_array_1 = ensure_array_like([["interview", "Interview"], ["form", "Quick form"]]);
1428
+ for (let $$index_1 = 0, $$length = each_array_1.length; $$index_1 < $$length; $$index_1++) {
1429
+ let [m, label] = each_array_1[$$index_1];
1430
+ $$renderer2.push(`<button role="radio"${attr("aria-checked", draft.mode === m)}${attr_class(`rounded px-3 py-1 text-sm ${draft.mode === m ? "bg-accent font-medium text-foreground" : "text-muted-foreground hover:text-foreground"}`)}>${escape_html(label)}</button>`);
1431
+ }
1432
+ $$renderer2.push(`<!--]--></div> <label class="flex min-w-0 items-center gap-2 text-sm"><span class="text-muted-foreground">Project</span> <input class="h-8 w-44 min-w-0 rounded-md border border-input bg-card px-2.5 text-sm shadow-xs outline-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50" name="project" list="spec-projects"${attr("value", draft.project)} placeholder="Choose a project"/> <datalist id="spec-projects"><!--[-->`);
1433
+ const each_array_2 = ensure_array_like(projects());
1434
+ for (let $$index_2 = 0, $$length = each_array_2.length; $$index_2 < $$length; $$index_2++) {
1435
+ let p = each_array_2[$$index_2];
1436
+ $$renderer2.option({ value: p }, ($$renderer3) => {
1437
+ });
1438
+ }
1439
+ $$renderer2.push(`<!--]--></datalist></label> <p${attr_class(`text-xs ${saveState === "error" ? "text-danger" : "text-muted-foreground"}`)} aria-live="polite">${escape_html(saveLabel())}</p> <div class="ml-auto flex items-center gap-2">`);
1440
+ if (!confirmDelete) {
1441
+ $$renderer2.push("<!--[0-->");
1442
+ Button($$renderer2, {
1443
+ variant: "ghost",
1444
+ size: "sm",
1445
+ class: "text-muted-foreground",
1446
+ onclick: () => confirmDelete = true,
1447
+ children: ($$renderer3) => {
1448
+ Trash($$renderer3, { "aria-hidden": "true" });
1449
+ $$renderer3.push(`<!---->Delete`);
1450
+ },
1451
+ $$slots: { default: true }
1452
+ });
1453
+ } else {
1454
+ $$renderer2.push("<!--[-1-->");
1455
+ }
1456
+ $$renderer2.push(`<!--]--> `);
1457
+ Button($$renderer2, {
1458
+ onclick: send,
1459
+ disabled: !canSend(),
1460
+ children: ($$renderer3) => {
1461
+ if (busy) {
1462
+ $$renderer3.push("<!--[0-->");
1463
+ Loader_circle($$renderer3, { class: "animate-spin", "aria-hidden": "true" });
1464
+ } else {
1465
+ $$renderer3.push("<!--[-1-->");
1466
+ Hammer($$renderer3, { "aria-hidden": "true" });
1467
+ }
1468
+ $$renderer3.push(`<!--]--> ${escape_html(draft.sentAt ? "Send to build again" : "Send to build")}`);
1469
+ },
1470
+ $$slots: { default: true }
1471
+ });
1472
+ $$renderer2.push(`<!----></div></div> <p class="mt-2 text-xs text-muted-foreground">${escape_html(sendHint())}</p> `);
1473
+ if (saveState === "error" && saveError) {
1474
+ $$renderer2.push(`<!--[0--><p class="mt-2 text-sm text-danger" role="alert">${escape_html(saveError)}</p>`);
1475
+ } else {
1476
+ $$renderer2.push("<!--[-1-->");
1477
+ }
1478
+ $$renderer2.push(`<!--]--> `);
1479
+ if (confirmDelete) {
1480
+ $$renderer2.push(`<!--[0--><div class="mt-3 flex flex-wrap items-center gap-3 rounded-md border border-danger/30 bg-danger/5 px-4 py-3" role="group" aria-label="Delete this spec"><p class="text-sm">Delete “${escape_html(specTitle(draft))}”, its interview and its screenshots for good?</p> <div class="ml-auto flex gap-2">`);
1481
+ Button($$renderer2, {
1482
+ variant: "ghost",
1483
+ size: "sm",
1484
+ onclick: () => confirmDelete = false,
1485
+ children: ($$renderer3) => {
1486
+ $$renderer3.push(`<!---->Keep it`);
1487
+ },
1488
+ $$slots: { default: true }
1489
+ });
1490
+ $$renderer2.push(`<!----> `);
1491
+ Button($$renderer2, {
1492
+ variant: "destructive",
1493
+ size: "sm",
1494
+ onclick: remove,
1495
+ disabled: busy,
1496
+ children: ($$renderer3) => {
1497
+ $$renderer3.push(`<!---->Delete`);
1498
+ },
1499
+ $$slots: { default: true }
1500
+ });
1501
+ $$renderer2.push(`<!----></div></div>`);
1502
+ } else {
1503
+ $$renderer2.push("<!--[-1-->");
1504
+ }
1505
+ $$renderer2.push(`<!--]--> <div class="mt-6">`);
1506
+ if (draft.mode === "form") {
1507
+ $$renderer2.push("<!--[0-->");
1508
+ QuickForm($$renderer2, {
1509
+ draft,
1510
+ projects: projects(),
1511
+ imageUrl,
1512
+ preview: preview(),
1513
+ asSent: asSent(),
1514
+ uploading,
1515
+ uploadError
1516
+ });
1517
+ } else {
1518
+ $$renderer2.push(`<!--[-1--><div class="mb-4 flex rounded-md border border-hair p-0.5 xl:hidden" role="tablist" aria-label="Show"><button role="tab"${attr("aria-selected", pane === "interview")}${attr_class(`flex-1 rounded px-3 py-1.5 text-sm ${"bg-accent font-medium"}`)}>Interview</button> <button role="tab"${attr("aria-selected", pane === "spec")}${attr_class(`flex flex-1 items-center justify-center gap-1.5 rounded px-3 py-1.5 text-sm ${"text-muted-foreground"}`)}>Spec`);
1519
+ if (openComments()) {
1520
+ $$renderer2.push(`<!--[0--><span class="text-xs text-brass">(${escape_html(openComments())})</span>`);
1521
+ } else {
1522
+ $$renderer2.push("<!--[-1-->");
1523
+ }
1524
+ $$renderer2.push(`<!--]--> `);
1525
+ if (specUnseen) {
1526
+ $$renderer2.push(`<!--[0--><span class="size-1.5 rounded-full bg-brass" aria-label="Updated" role="img"></span>`);
1527
+ } else {
1528
+ $$renderer2.push("<!--[-1-->");
1529
+ }
1530
+ $$renderer2.push(`<!--]--></button></div> <div class="grid items-start gap-8 xl:grid-cols-[minmax(0,1fr)_minmax(0,1.15fr)]"><section${attr_class(`min-w-0 ${""}`)} aria-label="Interview">`);
1531
+ Interview($$renderer2, {
1532
+ draft,
1533
+ busy: working,
1534
+ streaming,
1535
+ activity,
1536
+ error: turnError,
1537
+ pending: pendingAnswer,
1538
+ model: data.interviewer?.model ?? "sonnet",
1539
+ effort: data.interviewer?.effort ?? "low",
1540
+ onAnswer: (text) => runTurn(text),
1541
+ onRetry: () => void runTurn(null)
1542
+ });
1543
+ $$renderer2.push(`<!----></section> <section${attr_class(`min-w-0 xl:sticky xl:top-20 xl:max-h-[calc(100dvh-7rem)] xl:overflow-y-auto ${"hidden xl:block"}`)} aria-label="The spec">`);
1544
+ SpecDocument($$renderer2, {
1545
+ draft,
1546
+ changed: changed(),
1547
+ busy: working,
1548
+ onComment: addComment
1549
+ });
1550
+ $$renderer2.push(`<!----></section></div>`);
1551
+ }
1552
+ $$renderer2.push(`<!--]--></div></div>`);
1553
+ }
1554
+ $$renderer2.push(`<!--]--></div>`);
1555
+ }
1556
+ $$renderer2.push(`<!--]--></div></main>`);
1557
+ });
1558
+ }
1559
+
1560
+ export { _page as default };
1561
+ //# sourceMappingURL=_page.svelte.js-BJjweG9u.js.map