factory-factory 0.4.8 → 0.4.9

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 (425) hide show
  1. package/README.md +66 -29
  2. package/dist/client/assets/{Archive.es-CGY-HOtI.js → Archive.es-moH8rDRO.js} +1 -1
  3. package/dist/client/assets/{ArrowLeft.es-BkuVunBb.js → ArrowLeft.es-CVl_zVBC.js} +1 -1
  4. package/dist/client/assets/{abnfDiagram-VCTEODGH-B2jWIJ_F.js → abnfDiagram-VCTEODGH-DzuBdUSN.js} +1 -1
  5. package/dist/client/assets/admin-page-CAsPxzW9.js +1 -0
  6. package/dist/client/assets/{alert-PePzkOCj.js → alert-2CAe526X.js} +1 -1
  7. package/dist/client/assets/{alert-dialog-BgqiS2Mp.js → alert-dialog-8vhMuR-k.js} +1 -1
  8. package/dist/client/assets/architecture-7GRP2DOG-Bcwjoi8B.js +1 -0
  9. package/dist/client/assets/{architectureDiagram-5GKGNRK7-CV8YjPRr.js → architectureDiagram-5GKGNRK7-CeuoQvaW.js} +1 -1
  10. package/dist/client/assets/{badge-BESbZ2wy.js → badge-CoDH1rER.js} +1 -1
  11. package/dist/client/assets/{blockDiagram-I7D4REHJ-BdQWAITV.js → blockDiagram-I7D4REHJ-BY92gQgN.js} +1 -1
  12. package/dist/client/assets/{c4Diagram-7LVT6UL2-Dp1ETdzU.js → c4Diagram-7LVT6UL2-D5TNBYXh.js} +1 -1
  13. package/dist/client/assets/channel-NEbtzeVB.js +1 -0
  14. package/dist/client/assets/{chunk-4HAMMTFA-BXRLulFZ.js → chunk-4HAMMTFA-DBbX-wzu.js} +1 -1
  15. package/dist/client/assets/{chunk-75Z2AOVW-FUHgKXYa.js → chunk-75Z2AOVW-962-yyBD.js} +1 -1
  16. package/dist/client/assets/{chunk-DU6HZSFF-nxkO_ute.js → chunk-DU6HZSFF-CHHMX1CR.js} +1 -1
  17. package/dist/client/assets/{chunk-F27PBJKO-Dal8QxK3.js → chunk-F27PBJKO-BOnYAGjZ.js} +1 -1
  18. package/dist/client/assets/{chunk-GMAD6QVW-B_VbYl2S.js → chunk-GMAD6QVW-DQF31PdR.js} +1 -1
  19. package/dist/client/assets/{chunk-GVQU2GXP-DobNOfAy.js → chunk-GVQU2GXP-rruJzn36.js} +1 -1
  20. package/dist/client/assets/{chunk-IMKFNOWR-D_P1eTAa.js → chunk-IMKFNOWR-GIKO0MCA.js} +1 -1
  21. package/dist/client/assets/{chunk-L3NEJ4N5-CZpV3_Q0.js → chunk-L3NEJ4N5-USlKRxmU.js} +1 -1
  22. package/dist/client/assets/{chunk-OSK3NFVY-e3uqzkQq.js → chunk-OSK3NFVY-DYQeYWNP.js} +1 -1
  23. package/dist/client/assets/{chunk-P2QGCYS3-B1FUAlmg.js → chunk-P2QGCYS3-SDkZ9hQX.js} +1 -1
  24. package/dist/client/assets/{chunk-POPQ4Y6H-BKVSxG-w.js → chunk-POPQ4Y6H-bdnFdIMc.js} +1 -1
  25. package/dist/client/assets/{chunk-PWAF6VOD-DQe8ztwz.js → chunk-PWAF6VOD-DuKrEmQw.js} +1 -1
  26. package/dist/client/assets/{chunk-SHT3W25Y-D8Ie2IK_.js → chunk-SHT3W25Y-BnWDS29f.js} +1 -1
  27. package/dist/client/assets/{chunk-SVP7TREG-_l4ZFWYL.js → chunk-SVP7TREG-BqyZjR36.js} +1 -1
  28. package/dist/client/assets/{chunk-TICWLB2K-BfcOBlR4.js → chunk-TICWLB2K-ZCb3dlre.js} +1 -1
  29. package/dist/client/assets/{ci-status-ChifTKM1.js → ci-status-cs76P3se.js} +1 -1
  30. package/dist/client/assets/classDiagram-ZZMXUADV-zE_E4kYq.js +1 -0
  31. package/dist/client/assets/classDiagram-v2-VYDZK3BY-zE_E4kYq.js +1 -0
  32. package/dist/client/assets/components-CoS_rGt2.js +1 -0
  33. package/dist/client/assets/{confirm-dialog-BAfboPjS.js → confirm-dialog-CfvO9f42.js} +1 -1
  34. package/dist/client/assets/{core-DW1Rn28Z.js → core-DW3tuXQ3.js} +1 -1
  35. package/dist/client/assets/{cynefin-OW5HDTMX-B7JP5WcM.js → cynefin-OW5HDTMX-Ci2WypGa.js} +1 -1
  36. package/dist/client/assets/{cynefinDiagram-5FMLGOSQ-B5jcLvUi.js → cynefinDiagram-5FMLGOSQ-CGea7wa2.js} +1 -1
  37. package/dist/client/assets/{dagre-GXQ25YYZ-CFkt7lun.js → dagre-GXQ25YYZ-CJcHs09G.js} +1 -1
  38. package/dist/client/assets/data-import-button-cvKmYZJe.js +6 -0
  39. package/dist/client/assets/detail-C3U9ED1b.js +1 -0
  40. package/dist/client/assets/{diagram-S7CK7UJ4-DpT9R2w0.js → diagram-S7CK7UJ4-Drsfjeco.js} +1 -1
  41. package/dist/client/assets/{diagram-UQ7AKVKN-DAy1Fpaf.js → diagram-UQ7AKVKN-0SrBP_3E.js} +1 -1
  42. package/dist/client/assets/{diagram-VSXAHHWV-Co-NFSf3.js → diagram-VSXAHHWV-DB2rqHgv.js} +1 -1
  43. package/dist/client/assets/{diagram-VX7I27RA-CaIWof2e.js → diagram-VX7I27RA-B2y3VQbR.js} +1 -1
  44. package/dist/client/assets/{diagram-Z3DM3KII-BpcVyNtl.js → diagram-Z3DM3KII-D63_zfy5.js} +1 -1
  45. package/dist/client/assets/diff-highlight.worker-FEJq0yPv.js +60 -0
  46. package/dist/client/assets/dist-BO6Gz-vk.js +1 -0
  47. package/dist/client/assets/{dist-Dtgf0TOg.js → dist-DGw3MClt.js} +1 -1
  48. package/dist/client/assets/{ebnfDiagram-PWID7BFC-CS26Rt0p.js → ebnfDiagram-PWID7BFC-8gEK-ifx.js} +1 -1
  49. package/dist/client/assets/{en-US-SlQiGO_s.js → en-US-C-x19js7.js} +1 -1
  50. package/dist/client/assets/{erDiagram-RLTQ6QDP-DsdFXV4-.js → erDiagram-RLTQ6QDP-B2CcHHg7.js} +1 -1
  51. package/dist/client/assets/eventmodeling-NTZA5JFV-DqUwwD9w.js +1 -0
  52. package/dist/client/assets/{factory-config-scripts-BoDNVi6q.js → factory-config-scripts-C2BfO5od.js} +1 -1
  53. package/dist/client/assets/flowDiagram-HODETNUW-DCZkaOsj.js +1 -0
  54. package/dist/client/assets/{ganttDiagram-EL5Y4UJY-D_b7Bn-J.js → ganttDiagram-EL5Y4UJY-B_Y3HJTL.js} +1 -1
  55. package/dist/client/assets/{gitGraph-4MIJSDKK-De5ASUSY.js → gitGraph-4MIJSDKK-DBd1UxTm.js} +1 -1
  56. package/dist/client/assets/{gitGraphDiagram-WWUBYQGX-BHMJvUNJ.js → gitGraphDiagram-WWUBYQGX-CrdKibnu.js} +1 -1
  57. package/dist/client/assets/{home-DjDt91tt.js → home-DRzNpm0E.js} +1 -1
  58. package/dist/client/assets/hooks-3rxtNHRh.js +1 -0
  59. package/dist/client/assets/index-BJo4hZ8z.js +10 -0
  60. package/dist/client/assets/{info-A6RAGUB7-DNiM6MW6.js → info-A6RAGUB7-CCMRmQ2H.js} +1 -1
  61. package/dist/client/assets/{infoDiagram-27XIBGKW-4g58w-zo.js → infoDiagram-27XIBGKW-DO-IhKUM.js} +1 -1
  62. package/dist/client/assets/{ishikawaDiagram-5VMMS53U-DO7_eJ6Q.js → ishikawaDiagram-5VMMS53U-KejlLQ1k.js} +1 -1
  63. package/dist/client/assets/{journeyDiagram-3NMN7TZE-6CJtdIGo.js → journeyDiagram-3NMN7TZE-DemWKqD6.js} +1 -1
  64. package/dist/client/assets/jsx-runtime-BNakU3Ej.js +1 -0
  65. package/dist/client/assets/{kanban-definition-UXKFOSKX-D211MzXr.js → kanban-definition-UXKFOSKX-uRffHAE9.js} +1 -1
  66. package/dist/client/assets/{label-CI3jpwv-.js → label-ANA2Lfpk.js} +1 -1
  67. package/dist/client/assets/lib-CHy_7XQu.js +1 -0
  68. package/dist/client/assets/{line-DotOMT4o.js → line-CfCBYCoS.js} +1 -1
  69. package/dist/client/assets/list-C3P6JbyU.js +30 -0
  70. package/dist/client/assets/{list-bUzF8ozJ.js → list-oJCufmEX.js} +1 -1
  71. package/dist/client/assets/{logs-CjKXHkrB.js → logs-zb2la033.js} +1 -1
  72. package/dist/client/assets/{mermaid-diagram-CESNj6Ju.js → mermaid-diagram-kbWN558y.js} +4 -4
  73. package/dist/client/assets/{mermaid-parser.core-DK0kgowR.js → mermaid-parser.core-CpkwJ-8U.js} +3 -3
  74. package/dist/client/assets/{mindmap-definition-YA3MSWOX-DF5ewLZ5.js → mindmap-definition-YA3MSWOX-DYYi_9Si.js} +1 -1
  75. package/dist/client/assets/{mobile-baseline-B0PakiKB.js → mobile-baseline-BVS3GXLz.js} +1 -1
  76. package/dist/client/assets/new-BiEmR60A.js +1 -0
  77. package/dist/client/assets/new-CcQm3ES8.js +1 -0
  78. package/dist/client/assets/{packet-AYTQ26CC-C4EHUAzU.js → packet-AYTQ26CC-kvNXQn-j.js} +1 -1
  79. package/dist/client/assets/{page-header-BCpV1oUO.js → page-header-CpSh-j1O.js} +1 -1
  80. package/dist/client/assets/{pegDiagram-XKGWAZYB-_WrA16pJ.js → pegDiagram-XKGWAZYB-CMAngYAK.js} +1 -1
  81. package/dist/client/assets/{pie-WAS4IAKB-BkSTK6KM.js → pie-WAS4IAKB-DFNGAljQ.js} +1 -1
  82. package/dist/client/assets/{pieDiagram-E7YTZNPT-CUR0mgrL.js → pieDiagram-E7YTZNPT-XGRy7b5E.js} +1 -1
  83. package/dist/client/assets/{popover-D-6mugCQ.js → popover-CIfFCO0U.js} +1 -1
  84. package/dist/client/assets/pr-inbox-item-D9UcI0SS.js +2 -0
  85. package/dist/client/assets/{preload-helper-Czpn1I53.js → preload-helper-BZ1Pz5am.js} +1 -1
  86. package/dist/client/assets/{project-repo-form-DjzRbY9O.js → project-repo-form-Dc8ha6XP.js} +1 -1
  87. package/dist/client/assets/{provider-cli-warning-LYUDO_5Y.js → provider-cli-warning-CIAJ88Cy.js} +1 -1
  88. package/dist/client/assets/{quadrantDiagram-AXDQQJYC-QXmh8FnA.js → quadrantDiagram-AXDQQJYC-BFek-axl.js} +1 -1
  89. package/dist/client/assets/{radar-RG4KPBEZ-ymOfNW7I.js → radar-RG4KPBEZ-k-UBw86I.js} +1 -1
  90. package/dist/client/assets/{radio-group-CcAx51bT.js → radio-group-BhmTXkIv.js} +1 -1
  91. package/dist/client/assets/{railroad-74A4TZTK-CwWB40du.js → railroad-74A4TZTK-B6DuT-HY.js} +1 -1
  92. package/dist/client/assets/railroad-abnf-HS5TGJTU-DF-z1cVb.js +1 -0
  93. package/dist/client/assets/railroad-ebnf-LZEXJU2U-C6VgaalR.js +1 -0
  94. package/dist/client/assets/railroad-peg-WCYAUIDC-DRMqhGU3.js +1 -0
  95. package/dist/client/assets/{railroadDiagram-O6MQD6OU-O7DCuidl.js → railroadDiagram-O6MQD6OU-CBzDTFh9.js} +1 -1
  96. package/dist/client/assets/redirect-DexaYCz_.js +1 -0
  97. package/dist/client/assets/{requirementDiagram-BXWQKSXE-BajIi2rw.js → requirementDiagram-BXWQKSXE-DSgpbBy3.js} +1 -1
  98. package/dist/client/assets/{reviews-B04-ADI9.js → reviews-DDO7Pvrz.js} +1 -1
  99. package/dist/client/assets/{sankeyDiagram-P5KCCOFB-CnR7slVB.js → sankeyDiagram-P5KCCOFB-BOWaOPXp.js} +1 -1
  100. package/dist/client/assets/{select-BgEObL9n.js → select-Cq3ddA2b.js} +1 -1
  101. package/dist/client/assets/{sequenceDiagram-WJ2MYXX4-BUxl34n_.js → sequenceDiagram-WJ2MYXX4-9wHsZFGh.js} +1 -1
  102. package/dist/client/assets/spinner-BszfzCYe.js +1 -0
  103. package/dist/client/assets/{startup-script-form-c7w0nnHp.js → startup-script-form-CHvwd1Nb.js} +1 -1
  104. package/dist/client/assets/{stateDiagram-D77RDMKH-aFuhfmKp.js → stateDiagram-D77RDMKH-Blo9H6q_.js} +1 -1
  105. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-BzJ9AKXW.js +1 -0
  106. package/dist/client/assets/{swimlanes-42K2YHIH-BccYx63r.js → swimlanes-42K2YHIH-DI0BHdWG.js} +1 -1
  107. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DSnxWZUW.js +8 -0
  108. package/dist/client/assets/{table-wIG3osPW.js → table-CUvMM0aA.js} +1 -1
  109. package/dist/client/assets/{tabs-Cn3M4k-N.js → tabs-BBAQyvSA.js} +1 -1
  110. package/dist/client/assets/{terminal-instance-7W1Sdy6P.js → terminal-instance-BEqkmyvv.js} +1 -1
  111. package/dist/client/assets/{textarea-BVHmIkCM.js → textarea-DxWYClhS.js} +1 -1
  112. package/dist/client/assets/{timeline-definition-24CTP7MA-CM_waoCp.js → timeline-definition-24CTP7MA-C8fyxpVm.js} +1 -1
  113. package/dist/client/assets/{tooltip-DCH0jP98.js → tooltip-DXcY1U7y.js} +1 -1
  114. package/dist/client/assets/{treeView-Q6P3EWNA-CkV-8YWk.js → treeView-Q6P3EWNA-CzQAwJw-.js} +1 -1
  115. package/dist/client/assets/{treemap-WGGIJYW6-L1FedAzz.js → treemap-WGGIJYW6-zWRSK6WR.js} +1 -1
  116. package/dist/client/assets/trpc-CQO3zfei.js +1 -0
  117. package/dist/client/assets/{use-auto-scroll-QQMmbsX-.js → use-auto-scroll-DNohsNoz.js} +1 -1
  118. package/dist/client/assets/{use-download-server-log-Bag_Et_8.js → use-download-server-log-efKIcIwE.js} +1 -1
  119. package/dist/client/assets/use-project-header-navigation-D5yIIgnb.js +1 -0
  120. package/dist/client/assets/{use-websocket-channel-DW9rsEG5.js → use-websocket-channel-dNXOJZfW.js} +1 -1
  121. package/dist/client/assets/use-websocket-transport-BuYcrZTd.js +55 -0
  122. package/dist/client/assets/vbnet-CwR9YcOY.js +57 -0
  123. package/dist/client/assets/{vennDiagram-4TSXK5OY-Djoofmfi.js → vennDiagram-4TSXK5OY-ffnMpD5u.js} +1 -1
  124. package/dist/client/assets/{wardley-WFR3VGLG-BU-g6L7U.js → wardley-WFR3VGLG-acbsrLnl.js} +1 -1
  125. package/dist/client/assets/{wardleyDiagram-VM6X3IG4-DZNgTneT.js → wardleyDiagram-VM6X3IG4-BtqGCwsu.js} +1 -1
  126. package/dist/client/assets/workspace-a6lf168c.js +18 -0
  127. package/dist/client/assets/{xychartDiagram-S5SC5T6Z-WTubjsZj.js → xychartDiagram-S5SC5T6Z-Bfy9xcWF.js} +1 -1
  128. package/dist/client/index.html +28 -35
  129. package/dist/prisma/generated/internal/class.js +1 -1
  130. package/dist/prisma/generated/internal/class.js.map +1 -1
  131. package/dist/prompts/quick-actions/fetch-rebase.md +5 -9
  132. package/dist/prompts/quick-actions/rename-branch.md +4 -8
  133. package/dist/prompts/quick-actions/review.md +6 -5
  134. package/dist/prompts/quick-actions/screenshots.md +7 -20
  135. package/dist/prompts/quick-actions/simplify.md +4 -1
  136. package/dist/prompts/ratchet/dispatch.md +13 -46
  137. package/dist/src/backend/orchestration/cli-health.service.d.ts.map +1 -1
  138. package/dist/src/backend/orchestration/cli-health.service.js +31 -23
  139. package/dist/src/backend/orchestration/cli-health.service.js.map +1 -1
  140. package/dist/src/backend/orchestration/cli-health.service.test.js +40 -0
  141. package/dist/src/backend/orchestration/cli-health.service.test.js.map +1 -1
  142. package/dist/src/backend/orchestration/data-backup.service.test.js +37 -4
  143. package/dist/src/backend/orchestration/data-backup.service.test.js.map +1 -1
  144. package/dist/src/backend/orchestration/event-collector.idle-refresh.test.d.ts +2 -0
  145. package/dist/src/backend/orchestration/event-collector.idle-refresh.test.d.ts.map +1 -0
  146. package/dist/src/backend/orchestration/event-collector.idle-refresh.test.js +83 -0
  147. package/dist/src/backend/orchestration/event-collector.idle-refresh.test.js.map +1 -0
  148. package/dist/src/backend/orchestration/event-collector.linear.test.d.ts +2 -0
  149. package/dist/src/backend/orchestration/event-collector.linear.test.d.ts.map +1 -0
  150. package/dist/src/backend/orchestration/event-collector.linear.test.js +206 -0
  151. package/dist/src/backend/orchestration/event-collector.linear.test.js.map +1 -0
  152. package/dist/src/backend/orchestration/event-collector.orchestrator.d.ts.map +1 -1
  153. package/dist/src/backend/orchestration/event-collector.orchestrator.js +40 -8
  154. package/dist/src/backend/orchestration/event-collector.orchestrator.js.map +1 -1
  155. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.d.ts +1 -0
  156. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.d.ts.map +1 -1
  157. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.js +20 -4
  158. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.js.map +1 -1
  159. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.test.js +55 -104
  160. package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.test.js.map +1 -1
  161. package/dist/src/backend/orchestration/snapshot-reconciliation.test-helpers.d.ts +6 -0
  162. package/dist/src/backend/orchestration/snapshot-reconciliation.test-helpers.d.ts.map +1 -0
  163. package/dist/src/backend/orchestration/snapshot-reconciliation.test-helpers.js +117 -0
  164. package/dist/src/backend/orchestration/snapshot-reconciliation.test-helpers.js.map +1 -0
  165. package/dist/src/backend/orchestration/snapshot-reconciliation.test-helpers.test.d.ts +2 -0
  166. package/dist/src/backend/orchestration/snapshot-reconciliation.test-helpers.test.d.ts.map +1 -0
  167. package/dist/src/backend/orchestration/snapshot-reconciliation.test-helpers.test.js +8 -0
  168. package/dist/src/backend/orchestration/snapshot-reconciliation.test-helpers.test.js.map +1 -0
  169. package/dist/src/backend/orchestration/workspace-archive.orchestrator.d.ts.map +1 -1
  170. package/dist/src/backend/orchestration/workspace-archive.orchestrator.js +40 -34
  171. package/dist/src/backend/orchestration/workspace-archive.orchestrator.js.map +1 -1
  172. package/dist/src/backend/orchestration/workspace-archive.orchestrator.test.js +4 -0
  173. package/dist/src/backend/orchestration/workspace-archive.orchestrator.test.js.map +1 -1
  174. package/dist/src/backend/orchestration/workspace-children.orchestrator.d.ts.map +1 -1
  175. package/dist/src/backend/orchestration/workspace-children.orchestrator.js +1 -2
  176. package/dist/src/backend/orchestration/workspace-children.orchestrator.js.map +1 -1
  177. package/dist/src/backend/orchestration/workspace-init-issue-prompts.test.js +3 -3
  178. package/dist/src/backend/orchestration/workspace-init-issue-prompts.test.js.map +1 -1
  179. package/dist/src/backend/orchestration/workspace-init-script-pipeline.d.ts.map +1 -1
  180. package/dist/src/backend/orchestration/workspace-init-script-pipeline.js +3 -3
  181. package/dist/src/backend/orchestration/workspace-init-script-pipeline.js.map +1 -1
  182. package/dist/src/backend/orchestration/workspace-init-script-pipeline.test.d.ts +2 -0
  183. package/dist/src/backend/orchestration/workspace-init-script-pipeline.test.d.ts.map +1 -0
  184. package/dist/src/backend/orchestration/workspace-init-script-pipeline.test.js +52 -0
  185. package/dist/src/backend/orchestration/workspace-init-script-pipeline.test.js.map +1 -0
  186. package/dist/src/backend/orchestration/workspace-runtime-cleanup-notification.test.d.ts +2 -0
  187. package/dist/src/backend/orchestration/workspace-runtime-cleanup-notification.test.d.ts.map +1 -0
  188. package/dist/src/backend/orchestration/workspace-runtime-cleanup-notification.test.js +175 -0
  189. package/dist/src/backend/orchestration/workspace-runtime-cleanup-notification.test.js.map +1 -0
  190. package/dist/src/backend/prompts/branch-rename.js +1 -1
  191. package/dist/src/backend/prompts/ratchet-dispatch.d.ts.map +1 -1
  192. package/dist/src/backend/prompts/ratchet-dispatch.js +12 -78
  193. package/dist/src/backend/prompts/ratchet-dispatch.js.map +1 -1
  194. package/dist/src/backend/prompts/ratchet-dispatch.test.js +39 -27
  195. package/dist/src/backend/prompts/ratchet-dispatch.test.js.map +1 -1
  196. package/dist/src/backend/services/auto-iteration/service/auto-iteration.service.d.ts.map +1 -1
  197. package/dist/src/backend/services/auto-iteration/service/auto-iteration.service.js +6 -1
  198. package/dist/src/backend/services/auto-iteration/service/auto-iteration.service.js.map +1 -1
  199. package/dist/src/backend/services/auto-iteration/service/auto-iteration.service.test.js +60 -1
  200. package/dist/src/backend/services/auto-iteration/service/auto-iteration.service.test.js.map +1 -1
  201. package/dist/src/backend/services/auto-iteration/service/prompts.d.ts.map +1 -1
  202. package/dist/src/backend/services/auto-iteration/service/prompts.js +14 -54
  203. package/dist/src/backend/services/auto-iteration/service/prompts.js.map +1 -1
  204. package/dist/src/backend/services/github/service/github-cli-health-cache.test.d.ts +2 -0
  205. package/dist/src/backend/services/github/service/github-cli-health-cache.test.d.ts.map +1 -0
  206. package/dist/src/backend/services/github/service/github-cli-health-cache.test.js +45 -0
  207. package/dist/src/backend/services/github/service/github-cli-health-cache.test.js.map +1 -0
  208. package/dist/src/backend/services/github/service/github-cli.service.d.ts +1 -1
  209. package/dist/src/backend/services/github/service/github-cli.service.d.ts.map +1 -1
  210. package/dist/src/backend/services/github/service/github-cli.service.js +25 -23
  211. package/dist/src/backend/services/github/service/github-cli.service.js.map +1 -1
  212. package/dist/src/backend/services/linear/service/linear-client.service.d.ts +1 -1
  213. package/dist/src/backend/services/linear/service/linear-client.service.d.ts.map +1 -1
  214. package/dist/src/backend/services/linear/service/linear-client.service.js +24 -9
  215. package/dist/src/backend/services/linear/service/linear-client.service.js.map +1 -1
  216. package/dist/src/backend/services/linear/service/linear-client.service.test.js +46 -5
  217. package/dist/src/backend/services/linear/service/linear-client.service.test.js.map +1 -1
  218. package/dist/src/backend/services/linear/service/linear-state-sync.service.d.ts +1 -1
  219. package/dist/src/backend/services/linear/service/linear-state-sync.service.d.ts.map +1 -1
  220. package/dist/src/backend/services/linear/service/linear-state-sync.service.js +2 -1
  221. package/dist/src/backend/services/linear/service/linear-state-sync.service.js.map +1 -1
  222. package/dist/src/backend/services/linear/service/linear-state-sync.service.test.js +7 -3
  223. package/dist/src/backend/services/linear/service/linear-state-sync.service.test.js.map +1 -1
  224. package/dist/src/backend/services/ratchet/service/fixer-session.service.js +1 -1
  225. package/dist/src/backend/services/ratchet/service/fixer-session.service.js.map +1 -1
  226. package/dist/src/backend/services/ratchet/service/ratchet.service.test.js +1 -1
  227. package/dist/src/backend/services/ratchet/service/ratchet.service.test.js.map +1 -1
  228. package/dist/src/backend/services/run-script/service/startup-script.service.d.ts +1 -0
  229. package/dist/src/backend/services/run-script/service/startup-script.service.d.ts.map +1 -1
  230. package/dist/src/backend/services/run-script/service/startup-script.service.js +3 -1
  231. package/dist/src/backend/services/run-script/service/startup-script.service.js.map +1 -1
  232. package/dist/src/backend/services/session/service/acp/acp-runtime-quiescence.js +1 -1
  233. package/dist/src/backend/services/session/service/acp/acp-runtime-quiescence.js.map +1 -1
  234. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.js +1 -1
  235. package/dist/src/backend/services/session/service/acp/acp-runtime-supervisor.js.map +1 -1
  236. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-notification-queue.d.ts.map +1 -1
  237. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-notification-queue.js +1 -3
  238. package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-notification-queue.js.map +1 -1
  239. package/dist/src/backend/services/session/service/acp/types.d.ts +0 -1
  240. package/dist/src/backend/services/session/service/acp/types.d.ts.map +1 -1
  241. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/start.handler.test.js +0 -1
  242. package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/start.handler.test.js.map +1 -1
  243. package/dist/src/backend/services/session/service/data/session-provider-resolver.service.test.js +1 -1
  244. package/dist/src/backend/services/session/service/data/session-provider-resolver.service.test.js.map +1 -1
  245. package/dist/src/backend/services/session/service/index.d.ts +1 -1
  246. package/dist/src/backend/services/session/service/index.d.ts.map +1 -1
  247. package/dist/src/backend/services/session/service/index.js +1 -1
  248. package/dist/src/backend/services/session/service/index.js.map +1 -1
  249. package/dist/src/backend/services/session/service/lifecycle/session-context.service.d.ts +1 -5
  250. package/dist/src/backend/services/session/service/lifecycle/session-context.service.d.ts.map +1 -1
  251. package/dist/src/backend/services/session/service/lifecycle/session-context.service.js +2 -63
  252. package/dist/src/backend/services/session/service/lifecycle/session-context.service.js.map +1 -1
  253. package/dist/src/backend/services/session/service/lifecycle/session-context.service.test.js +23 -99
  254. package/dist/src/backend/services/session/service/lifecycle/session-context.service.test.js.map +1 -1
  255. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-external-ports.d.ts.map +1 -1
  256. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-external-ports.js +13 -7
  257. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-external-ports.js.map +1 -1
  258. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-external-ports.test.js +26 -5
  259. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-external-ports.test.js.map +1 -1
  260. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-gate.d.ts +1 -0
  261. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-gate.d.ts.map +1 -1
  262. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-gate.js +3 -0
  263. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-gate.js.map +1 -1
  264. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle.test-helpers.d.ts +1 -1
  265. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle.test-helpers.d.ts.map +1 -1
  266. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle.test-helpers.js +0 -11
  267. package/dist/src/backend/services/session/service/lifecycle/session-lifecycle.test-helpers.js.map +1 -1
  268. package/dist/src/backend/services/session/service/lifecycle/session-runtime-exit.coordinator.d.ts +1 -1
  269. package/dist/src/backend/services/session/service/lifecycle/session-runtime-exit.coordinator.d.ts.map +1 -1
  270. package/dist/src/backend/services/session/service/lifecycle/session-runtime-exit.coordinator.js +8 -5
  271. package/dist/src/backend/services/session/service/lifecycle/session-runtime-exit.coordinator.js.map +1 -1
  272. package/dist/src/backend/services/session/service/lifecycle/session-runtime-exit.coordinator.test.js +9 -5
  273. package/dist/src/backend/services/session/service/lifecycle/session-runtime-exit.coordinator.test.js.map +1 -1
  274. package/dist/src/backend/services/session/service/lifecycle/session-services.composition.test.js +0 -1
  275. package/dist/src/backend/services/session/service/lifecycle/session-services.composition.test.js.map +1 -1
  276. package/dist/src/backend/services/session/service/lifecycle/session-startup.coordinator.d.ts.map +1 -1
  277. package/dist/src/backend/services/session/service/lifecycle/session-startup.coordinator.js +0 -1
  278. package/dist/src/backend/services/session/service/lifecycle/session-startup.coordinator.js.map +1 -1
  279. package/dist/src/backend/services/session/service/lifecycle/session-workflow-permissions.d.ts +7 -0
  280. package/dist/src/backend/services/session/service/lifecycle/session-workflow-permissions.d.ts.map +1 -0
  281. package/dist/src/backend/services/session/service/lifecycle/session-workflow-permissions.js +9 -0
  282. package/dist/src/backend/services/session/service/lifecycle/session-workflow-permissions.js.map +1 -0
  283. package/dist/src/backend/services/session/service/lifecycle/session.config.service.d.ts.map +1 -1
  284. package/dist/src/backend/services/session/service/lifecycle/session.config.service.js +4 -5
  285. package/dist/src/backend/services/session/service/lifecycle/session.config.service.js.map +1 -1
  286. package/dist/src/backend/services/session/service/lifecycle/session.config.service.test.js +8 -8
  287. package/dist/src/backend/services/session/service/lifecycle/session.config.service.test.js.map +1 -1
  288. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.facade.test.js +0 -2
  289. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.facade.test.js.map +1 -1
  290. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.d.ts +0 -1
  291. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.d.ts.map +1 -1
  292. package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.js.map +1 -1
  293. package/dist/src/backend/services/session/service/lifecycle/session.prompt-builder.d.ts +0 -33
  294. package/dist/src/backend/services/session/service/lifecycle/session.prompt-builder.d.ts.map +1 -1
  295. package/dist/src/backend/services/session/service/lifecycle/session.prompt-builder.js +0 -40
  296. package/dist/src/backend/services/session/service/lifecycle/session.prompt-builder.js.map +1 -1
  297. package/dist/src/backend/services/session/service/lifecycle/session.prompt-builder.test.js +2 -170
  298. package/dist/src/backend/services/session/service/lifecycle/session.prompt-builder.test.js.map +1 -1
  299. package/dist/src/backend/services/session/service/lifecycle/session.repository.d.ts +4 -12
  300. package/dist/src/backend/services/session/service/lifecycle/session.repository.d.ts.map +1 -1
  301. package/dist/src/backend/services/session/service/lifecycle/session.repository.js +2 -7
  302. package/dist/src/backend/services/session/service/lifecycle/session.repository.js.map +1 -1
  303. package/dist/src/backend/services/session/service/lifecycle/session.repository.test.js +1 -4
  304. package/dist/src/backend/services/session/service/lifecycle/session.repository.test.js.map +1 -1
  305. package/dist/src/backend/services/session/service/lifecycle/session.service.test.js +0 -162
  306. package/dist/src/backend/services/session/service/lifecycle/session.service.test.js.map +1 -1
  307. package/dist/src/backend/services/session/service/voice/voice-narration.service.d.ts +1 -0
  308. package/dist/src/backend/services/session/service/voice/voice-narration.service.d.ts.map +1 -1
  309. package/dist/src/backend/services/session/service/voice/voice-narration.service.js +69 -19
  310. package/dist/src/backend/services/session/service/voice/voice-narration.service.js.map +1 -1
  311. package/dist/src/backend/services/session/service/voice/voice-narration.service.test.js +196 -113
  312. package/dist/src/backend/services/session/service/voice/voice-narration.service.test.js.map +1 -1
  313. package/dist/src/backend/services/workspace/resources/project.accessor.d.ts.map +1 -1
  314. package/dist/src/backend/services/workspace/resources/project.accessor.js +3 -0
  315. package/dist/src/backend/services/workspace/resources/project.accessor.js.map +1 -1
  316. package/dist/src/backend/services/workspace/resources/project.accessor.test.js +24 -2
  317. package/dist/src/backend/services/workspace/resources/project.accessor.test.js.map +1 -1
  318. package/dist/src/backend/services/workspace/service/lifecycle/activity.service.d.ts +2 -0
  319. package/dist/src/backend/services/workspace/service/lifecycle/activity.service.d.ts.map +1 -1
  320. package/dist/src/backend/services/workspace/service/lifecycle/activity.service.js +30 -0
  321. package/dist/src/backend/services/workspace/service/lifecycle/activity.service.js.map +1 -1
  322. package/dist/src/backend/services/workspace/service/lifecycle/activity.service.test.js +113 -0
  323. package/dist/src/backend/services/workspace/service/lifecycle/activity.service.test.js.map +1 -1
  324. package/dist/src/backend/services/workspace/service/lifecycle/creation.service.test.js +2 -2
  325. package/dist/src/backend/services/workspace/service/lifecycle/creation.service.test.js.map +1 -1
  326. package/dist/src/backend/services/workspace/service/worktree/git-ops.service.d.ts.map +1 -1
  327. package/dist/src/backend/services/workspace/service/worktree/git-ops.service.js +12 -1
  328. package/dist/src/backend/services/workspace/service/worktree/git-ops.service.js.map +1 -1
  329. package/dist/src/backend/services/workspace/service/worktree/git-ops.service.test.js +15 -0
  330. package/dist/src/backend/services/workspace/service/worktree/git-ops.service.test.js.map +1 -1
  331. package/dist/src/backend/services/workspace-git-state.service.js +1 -1
  332. package/dist/src/backend/services/workspace-git-state.service.js.map +1 -1
  333. package/dist/src/backend/trpc/admin.router.test.js +34 -1
  334. package/dist/src/backend/trpc/admin.router.test.js.map +1 -1
  335. package/dist/src/backend/trpc/admin.trpc.d.ts.map +1 -1
  336. package/dist/src/backend/trpc/admin.trpc.js +2 -2
  337. package/dist/src/backend/trpc/admin.trpc.js.map +1 -1
  338. package/dist/src/backend/trpc/voice.trpc.d.ts.map +1 -1
  339. package/dist/src/backend/trpc/voice.trpc.js +6 -3
  340. package/dist/src/backend/trpc/voice.trpc.js.map +1 -1
  341. package/dist/src/backend/trpc/voice.trpc.test.js +27 -8
  342. package/dist/src/backend/trpc/voice.trpc.test.js.map +1 -1
  343. package/dist/src/backend/trpc/workspace/init.router.test.js +40 -1
  344. package/dist/src/backend/trpc/workspace/init.router.test.js.map +1 -1
  345. package/dist/src/backend/trpc/workspace/init.trpc.d.ts.map +1 -1
  346. package/dist/src/backend/trpc/workspace/init.trpc.js +20 -14
  347. package/dist/src/backend/trpc/workspace/init.trpc.js.map +1 -1
  348. package/dist/src/backend/trpc/workspace.router.test.js +1 -0
  349. package/dist/src/backend/trpc/workspace.router.test.js.map +1 -1
  350. package/dist/src/backend/trpc/workspace.trpc.d.ts.map +1 -1
  351. package/dist/src/backend/trpc/workspace.trpc.js +17 -16
  352. package/dist/src/backend/trpc/workspace.trpc.js.map +1 -1
  353. package/dist/src/shared/deepgram-voices.d.ts +7 -3
  354. package/dist/src/shared/deepgram-voices.d.ts.map +1 -1
  355. package/dist/src/shared/deepgram-voices.js +62 -45
  356. package/dist/src/shared/deepgram-voices.js.map +1 -1
  357. package/dist/src/shared/issue-start-prompt.d.ts.map +1 -1
  358. package/dist/src/shared/issue-start-prompt.js +6 -160
  359. package/dist/src/shared/issue-start-prompt.js.map +1 -1
  360. package/dist/src/shared/schemas/export-data.schema.d.ts +4 -4
  361. package/dist/src/shared/schemas/export-data.schema.d.ts.map +1 -1
  362. package/dist/src/shared/schemas/export-data.schema.js +13 -5
  363. package/dist/src/shared/schemas/export-data.schema.js.map +1 -1
  364. package/dist/tsconfig.backend.tsbuildinfo +1 -1
  365. package/package.json +34 -28
  366. package/prisma/migrations/20260904150539_upgrade_deepgram_flux_tts/migration.sql +43 -0
  367. package/prisma/schema.prisma +1 -1
  368. package/prompts/quick-actions/fetch-rebase.md +5 -9
  369. package/prompts/quick-actions/rename-branch.md +4 -8
  370. package/prompts/quick-actions/review.md +6 -5
  371. package/prompts/quick-actions/screenshots.md +7 -20
  372. package/prompts/quick-actions/simplify.md +4 -1
  373. package/prompts/ratchet/dispatch.md +13 -46
  374. package/dist/client/assets/admin-page-DSQHBVdP.js +0 -1
  375. package/dist/client/assets/architecture-7GRP2DOG-iqZodW6v.js +0 -1
  376. package/dist/client/assets/channel-CuF41sy9.js +0 -1
  377. package/dist/client/assets/classDiagram-ZZMXUADV-CSnIdOhD.js +0 -1
  378. package/dist/client/assets/classDiagram-v2-VYDZK3BY-CSnIdOhD.js +0 -1
  379. package/dist/client/assets/components-CYsyoHP0.js +0 -1
  380. package/dist/client/assets/data-import-button-D-ZWnQAg.js +0 -6
  381. package/dist/client/assets/detail-C1zBkWd-.js +0 -1
  382. package/dist/client/assets/diff-highlight.worker-C-7SSG_d.js +0 -55
  383. package/dist/client/assets/dist-BiFeezwN.js +0 -1
  384. package/dist/client/assets/eventmodeling-NTZA5JFV-C4d4RnR4.js +0 -1
  385. package/dist/client/assets/flowDiagram-HODETNUW-Df-T-03y.js +0 -1
  386. package/dist/client/assets/hooks-BTcY6K1q.js +0 -1
  387. package/dist/client/assets/index-D34fUfAP.js +0 -10
  388. package/dist/client/assets/jsx-runtime-DE3RlOCf.js +0 -1
  389. package/dist/client/assets/lib-DyBYhPHb.js +0 -1
  390. package/dist/client/assets/list-DozL_ZP-.js +0 -184
  391. package/dist/client/assets/new-C3e5S62x.js +0 -1
  392. package/dist/client/assets/new-CCDeoRvw.js +0 -1
  393. package/dist/client/assets/pr-inbox-item-vOH1gfSf.js +0 -2
  394. package/dist/client/assets/railroad-abnf-HS5TGJTU-DGUx-UBP.js +0 -1
  395. package/dist/client/assets/railroad-ebnf-LZEXJU2U-isA18bJo.js +0 -1
  396. package/dist/client/assets/railroad-peg-WCYAUIDC-Qz11I2dz.js +0 -1
  397. package/dist/client/assets/redirect-CNaRFL8d.js +0 -1
  398. package/dist/client/assets/spinner-ASaPCL5c.js +0 -1
  399. package/dist/client/assets/stateDiagram-v2-MP3YSRHH-C3HBCmSp.js +0 -1
  400. package/dist/client/assets/swimlanesDiagram-VR7AAH4N-DXqJPUvi.js +0 -8
  401. package/dist/client/assets/trpc-X4t2_jd5.js +0 -1
  402. package/dist/client/assets/use-project-header-navigation-BXqLQ4G_.js +0 -1
  403. package/dist/client/assets/use-websocket-transport-BT1hhmkl.js +0 -50
  404. package/dist/client/assets/vbnet-CrqJJ08J.js +0 -57
  405. package/dist/client/assets/workspace-CsQCO4D_.js +0 -18
  406. package/dist/prompts/workflows/bugfix.md +0 -86
  407. package/dist/prompts/workflows/ci-fix.md +0 -52
  408. package/dist/prompts/workflows/explore.md +0 -54
  409. package/dist/prompts/workflows/feature.md +0 -80
  410. package/dist/prompts/workflows/followup.md +0 -32
  411. package/dist/prompts/workflows/pr-review-fix.md +0 -50
  412. package/dist/src/backend/prompts/workflows.d.ts +0 -14
  413. package/dist/src/backend/prompts/workflows.d.ts.map +0 -1
  414. package/dist/src/backend/prompts/workflows.js +0 -47
  415. package/dist/src/backend/prompts/workflows.js.map +0 -1
  416. package/dist/src/backend/prompts/workflows.test.d.ts +0 -2
  417. package/dist/src/backend/prompts/workflows.test.d.ts.map +0 -1
  418. package/dist/src/backend/prompts/workflows.test.js +0 -128
  419. package/dist/src/backend/prompts/workflows.test.js.map +0 -1
  420. package/prompts/workflows/bugfix.md +0 -86
  421. package/prompts/workflows/ci-fix.md +0 -52
  422. package/prompts/workflows/explore.md +0 -54
  423. package/prompts/workflows/feature.md +0 -80
  424. package/prompts/workflows/followup.md +0 -32
  425. package/prompts/workflows/pr-review-fix.md +0 -50
package/README.md CHANGED
@@ -21,19 +21,24 @@
21
21
  <img src="public/working.png" alt="Factory Factory workspace with parallel agents, code changes, and an integrated terminal" width="1000">
22
22
  </p>
23
23
 
24
- Factory Factory is a local workspace manager for AI coding agents. Every workspace gets its own git worktree and branch, so agents can work on separate tasks without stepping on each other. The UI brings chat, diffs, files, terminals, issues, and pull request status together in one place.
24
+ Factory Factory is a local workspace manager for AI coding agents. Every
25
+ workspace gets its own git worktree and branch, so agents can work on separate
26
+ tasks without stepping on each other. The UI brings chat, diffs, files,
27
+ terminals, issues, and pull request status together in one place.
25
28
 
26
29
  ## Quick start
27
30
 
28
31
  You will need:
29
32
 
30
- - Node.js 26.8.1+ for the CLI and development (pinned in `.node-version`); the desktop app uses Electron's bundled Node.js runtime
33
+ - Node.js 26.8.1+ for the CLI and development (pinned in `.node-version`); the
34
+ desktop app uses Electron's bundled Node.js runtime
31
35
  - macOS 13 (Ventura) or newer for the macOS desktop app
32
36
  - A local git repository
33
37
  - At least one agent provider:
34
38
  - Claude Code, authenticated with `claude login`
35
39
  - A ChatGPT/Codex account configured for Codex sessions
36
- - The authenticated [GitHub CLI](https://cli.github.com/) for GitHub issues and pull requests
40
+ - The authenticated [GitHub CLI](https://cli.github.com/) for GitHub issues and
41
+ pull requests
37
42
 
38
43
  Start Factory Factory without installing it:
39
44
 
@@ -41,25 +46,35 @@ Start Factory Factory without installing it:
41
46
  npx factory-factory@latest serve
42
47
  ```
43
48
 
44
- Factory Factory opens in your browser and stores its database in `~/factory-factory/` by default.
49
+ Factory Factory opens in your browser and stores its database in
50
+ `~/factory-factory/` by default.
45
51
 
46
- See [Settings](docs/admin-settings.md) for IDE commands, default chat models, and project configuration.
52
+ See [Settings](docs/admin-settings.md) for IDE commands, default chat models,
53
+ and project configuration.
47
54
 
48
55
  Then:
49
56
 
50
57
  1. Add a project by selecting a local git repository.
51
58
  2. Create a workspace, or start one from a GitHub or Linear issue.
52
59
  3. Choose Claude or Codex and start a session.
53
- 4. Review the agent's changes, use the integrated terminal when needed, and open a pull request.
60
+ 4. Review the agent's changes, use the integrated terminal when needed, and open
61
+ a pull request.
54
62
 
55
63
  ## What it does
56
64
 
57
- - **Parallel, isolated work:** Each task runs in a dedicated worktree and branch while your main checkout stays untouched.
58
- - **One workspace for the whole task:** Chat with agents, inspect files and diffs, run commands, and track PR state without switching tools.
59
- - **Claude and Codex sessions:** Factory Factory connects to both providers through the Agent Client Protocol (ACP), with resumable sessions and runtime model options.
60
- - **Issue-to-PR workflow:** Pull assigned work from GitHub or Linear, link it to a workspace, and follow it through to merge.
61
- - **Automatic PR progression:** Ratchet watches open pull requests and can dispatch follow-up agents for failing CI and actionable review feedback.
62
- - **Repeatable automation:** Quick actions, periodic tasks, and child workspaces help split up or repeat common workflows.
65
+ - **Parallel, isolated work:** Each task runs in a dedicated worktree and branch
66
+ while your main checkout stays untouched.
67
+ - **One workspace for the whole task:** Chat with agents, inspect files and
68
+ diffs, run commands, and track PR state without switching tools.
69
+ - **Claude and Codex sessions:** Factory Factory connects to both providers
70
+ through the Agent Client Protocol (ACP), with resumable sessions and runtime
71
+ model options.
72
+ - **Issue-to-PR workflow:** Pull assigned work from GitHub or Linear, link it to
73
+ a workspace, and follow it through to merge.
74
+ - **Automatic PR progression:** Ratchet watches open pull requests and can
75
+ dispatch follow-up agents for failing CI and actionable review feedback.
76
+ - **Repeatable automation:** Quick actions, periodic tasks, and child workspaces
77
+ help split up or repeat common workflows.
63
78
 
64
79
  The core model is intentionally small:
65
80
 
@@ -87,34 +102,52 @@ ff proxy --private # Share the app through a password-protected Cloudflare tunn
87
102
  ff db:studio # Inspect the local database with Prisma Studio
88
103
  ```
89
104
 
90
- `ff proxy` requires `cloudflared` on your `PATH`. Factory Factory automatically runs database migrations, finds an available port, and opens the browser when the server is ready.
105
+ `ff proxy` requires `cloudflared` on your `PATH`. Factory Factory automatically
106
+ runs database migrations, finds an available port, and opens the browser when
107
+ the server is ready.
91
108
 
92
109
  ### Hosting behind your own reverse proxy
93
110
 
94
- To serve Factory Factory from your own domain (e.g. `https://ff.example.com`) via nginx, Caddy, or another reverse proxy:
95
-
96
- - Set `CORS_ALLOWED_ORIGINS` to the exact public origin(s), comma-separated: `CORS_ALLOWED_ORIGINS=https://ff.example.com`. This gates both HTTP CORS and WebSocket upgrades; non-loopback origins must match exactly (scheme + host + non-default port, no trailing slash).
97
- - Keep `BACKEND_HOST` bound to `localhost`/`127.0.0.1` so only your proxy can reach the server.
98
-
99
- By default the server rejects WebSocket upgrades that carry client-address headers (`x-forwarded-for`, `cf-connecting-ip`, etc.), because it expects to sit behind an authenticated proxy that strips them. If your reverse proxy adds these headers, either strip them before forwarding, or set `TRUST_PROXY_HEADERS=true` to accept them. **Only enable `TRUST_PROXY_HEADERS` when the backend is reachable solely through your trusted proxy** (i.e. bound to loopback) — otherwise clients could spoof address headers. The remote-address trust check (loopback / `TRUSTED_LOCAL_CIDRS`) still applies.
111
+ To serve Factory Factory from your own domain (e.g. `https://ff.example.com`)
112
+ via nginx, Caddy, or another reverse proxy:
113
+
114
+ - Set `CORS_ALLOWED_ORIGINS` to the exact public origin(s), comma-separated:
115
+ `CORS_ALLOWED_ORIGINS=https://ff.example.com`. This gates both HTTP CORS and
116
+ WebSocket upgrades; non-loopback origins must match exactly (scheme + host +
117
+ non-default port, no trailing slash).
118
+ - Keep `BACKEND_HOST` bound to `localhost`/`127.0.0.1` so only your proxy can
119
+ reach the server.
120
+
121
+ By default the server rejects WebSocket upgrades that carry client-address
122
+ headers (`x-forwarded-for`, `cf-connecting-ip`, etc.), because it expects to sit
123
+ behind an authenticated proxy that strips them. If your reverse proxy adds these
124
+ headers, either strip them before forwarding, or set `TRUST_PROXY_HEADERS=true`
125
+ to accept them. **Only enable `TRUST_PROXY_HEADERS` when the backend is
126
+ reachable solely through your trusted proxy** (i.e. bound to loopback) —
127
+ otherwise clients could spoof address headers. The remote-address trust check
128
+ (loopback / `TRUSTED_LOCAL_CIDRS`) still applies.
100
129
 
101
130
  ## Security
102
131
 
103
- > [!WARNING]
104
- > Factory Factory runs coding agents that can execute commands and modify files without manual confirmation. Workspaces isolate git branches; they are not containers or security sandboxes.
132
+ > [!WARNING] Factory Factory runs coding agents that can execute commands and
133
+ > modify files without manual confirmation. Workspaces isolate git branches;
134
+ > they are not containers or security sandboxes.
105
135
 
106
- Use Factory Factory only with repositories and agent instructions you trust. Review changes before merging, protect your GitHub and Linear credentials, and consider a VM or container when working with untrusted code.
136
+ Use Factory Factory only with repositories and agent instructions you trust.
137
+ Review changes before merging, protect your GitHub and Linear credentials, and
138
+ consider a VM or container when working with untrusted code.
107
139
 
108
140
  ## Development
109
141
 
110
- Use pnpm 12.3.4, pinned in `package.json`. Dependency build permissions live in
142
+ Use pnpm 12.4.2, pinned in `package.json`. Dependency build permissions live in
111
143
  `pnpm-workspace.yaml` under `allowBuilds`; review new build scripts with
112
144
  `pnpm approve-builds` when adding or updating dependencies.
113
145
 
114
- Development requires Git 2.32 or newer for lint-staged. Builds and typechecks use
115
- TypeScript 7 through the `@typescript/native` package alias. The `typescript`
116
- alias provides Microsoft's TypeScript 6 compatibility API for guardrail scripts
117
- and tools that parse source files; `tsc` runs version 7 and `tsc6` runs version 6.
146
+ Development requires Git 2.32 or newer for lint-staged. Builds and typechecks
147
+ use TypeScript 7 through the `@typescript/native` package alias. The
148
+ `typescript` alias provides Microsoft's TypeScript 6 compatibility API for
149
+ guardrail scripts and tools that parse source files; `tsc` runs version 7 and
150
+ `tsc6` runs version 6.
118
151
 
119
152
  ```bash
120
153
  git clone https://github.com/purplefish-ai/factory-factory.git
@@ -131,11 +164,15 @@ pnpm typecheck
131
164
  pnpm check
132
165
  ```
133
166
 
134
- See [CONTRIBUTING.md](CONTRIBUTING.md) for project structure, conventions, and the full contributor workflow.
167
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for project structure, conventions, and
168
+ the full contributor workflow.
135
169
 
136
170
  ## Acknowledgements
137
171
 
138
- Factory Factory was inspired by [Conductor](https://conductor.build), [VibeKanban](https://vibekanban.com), [Gastown](https://github.com/steveyegge/gastown), and [Multiclaude](https://github.com/dlorenc/multiclaude).
172
+ Factory Factory was inspired by [Conductor](https://conductor.build),
173
+ [VibeKanban](https://vibekanban.com),
174
+ [Gastown](https://github.com/steveyegge/gastown), and
175
+ [Multiclaude](https://github.com/dlorenc/multiclaude).
139
176
 
140
177
  ## License
141
178
 
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t}from"./jsx-runtime-DE3RlOCf.js";import{h as n}from"./dist-BiFeezwN.js";var r=e(t(),1),i=new Map([[`bold`,r.createElement(r.Fragment,null,r.createElement(`path`,{d:`M224,44H32A20,20,0,0,0,12,64V88a20,20,0,0,0,16,19.6V192a20,20,0,0,0,20,20H208a20,20,0,0,0,20-20V107.6A20,20,0,0,0,244,88V64A20,20,0,0,0,224,44ZM36,68H220V84H36ZM52,188V108H204v80Zm112-52a12,12,0,0,1-12,12H104a12,12,0,0,1,0-24h48A12,12,0,0,1,164,136Z`}))],[`duotone`,r.createElement(r.Fragment,null,r.createElement(`path`,{d:`M216,96v96a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V96Z`,opacity:`0.2`}),r.createElement(`path`,{d:`M224,48H32A16,16,0,0,0,16,64V88a16,16,0,0,0,16,16v88a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V104a16,16,0,0,0,16-16V64A16,16,0,0,0,224,48ZM208,192H48V104H208ZM224,88H32V64H224V88ZM96,136a8,8,0,0,1,8-8h48a8,8,0,0,1,0,16H104A8,8,0,0,1,96,136Z`}))],[`fill`,r.createElement(r.Fragment,null,r.createElement(`path`,{d:`M224,48H32A16,16,0,0,0,16,64V88a16,16,0,0,0,16,16v88a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V104a16,16,0,0,0,16-16V64A16,16,0,0,0,224,48Zm-72,96H104a8,8,0,0,1,0-16h48a8,8,0,0,1,0,16Zm72-56H32V64H224V88Z`}))],[`light`,r.createElement(r.Fragment,null,r.createElement(`path`,{d:`M224,50H32A14,14,0,0,0,18,64V88a14,14,0,0,0,14,14h2v90a14,14,0,0,0,14,14H208a14,14,0,0,0,14-14V102h2a14,14,0,0,0,14-14V64A14,14,0,0,0,224,50ZM210,192a2,2,0,0,1-2,2H48a2,2,0,0,1-2-2V102H210ZM226,88a2,2,0,0,1-2,2H32a2,2,0,0,1-2-2V64a2,2,0,0,1,2-2H224a2,2,0,0,1,2,2ZM98,136a6,6,0,0,1,6-6h48a6,6,0,0,1,0,12H104A6,6,0,0,1,98,136Z`}))],[`regular`,r.createElement(r.Fragment,null,r.createElement(`path`,{d:`M224,48H32A16,16,0,0,0,16,64V88a16,16,0,0,0,16,16v88a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V104a16,16,0,0,0,16-16V64A16,16,0,0,0,224,48ZM208,192H48V104H208ZM224,88H32V64H224V88ZM96,136a8,8,0,0,1,8-8h48a8,8,0,0,1,0,16H104A8,8,0,0,1,96,136Z`}))],[`thin`,r.createElement(r.Fragment,null,r.createElement(`path`,{d:`M224,52H32A12,12,0,0,0,20,64V88a12,12,0,0,0,12,12h4v92a12,12,0,0,0,12,12H208a12,12,0,0,0,12-12V100h4a12,12,0,0,0,12-12V64A12,12,0,0,0,224,52ZM212,192a4,4,0,0,1-4,4H48a4,4,0,0,1-4-4V100H212ZM228,88a4,4,0,0,1-4,4H32a4,4,0,0,1-4-4V64a4,4,0,0,1,4-4H224a4,4,0,0,1,4,4ZM100,136a4,4,0,0,1,4-4h48a4,4,0,0,1,0,8H104A4,4,0,0,1,100,136Z`}))]]),a=r.forwardRef((e,t)=>r.createElement(n,{ref:t,...e,weights:i}));a.displayName=`ArchiveIcon`;export{a as t};
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t}from"./jsx-runtime-BNakU3Ej.js";import{h as n}from"./dist-BO6Gz-vk.js";var r=e(t(),1),i=new Map([[`bold`,r.createElement(r.Fragment,null,r.createElement(`path`,{d:`M224,44H32A20,20,0,0,0,12,64V88a20,20,0,0,0,16,19.6V192a20,20,0,0,0,20,20H208a20,20,0,0,0,20-20V107.6A20,20,0,0,0,244,88V64A20,20,0,0,0,224,44ZM36,68H220V84H36ZM52,188V108H204v80Zm112-52a12,12,0,0,1-12,12H104a12,12,0,0,1,0-24h48A12,12,0,0,1,164,136Z`}))],[`duotone`,r.createElement(r.Fragment,null,r.createElement(`path`,{d:`M216,96v96a8,8,0,0,1-8,8H48a8,8,0,0,1-8-8V96Z`,opacity:`0.2`}),r.createElement(`path`,{d:`M224,48H32A16,16,0,0,0,16,64V88a16,16,0,0,0,16,16v88a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V104a16,16,0,0,0,16-16V64A16,16,0,0,0,224,48ZM208,192H48V104H208ZM224,88H32V64H224V88ZM96,136a8,8,0,0,1,8-8h48a8,8,0,0,1,0,16H104A8,8,0,0,1,96,136Z`}))],[`fill`,r.createElement(r.Fragment,null,r.createElement(`path`,{d:`M224,48H32A16,16,0,0,0,16,64V88a16,16,0,0,0,16,16v88a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V104a16,16,0,0,0,16-16V64A16,16,0,0,0,224,48Zm-72,96H104a8,8,0,0,1,0-16h48a8,8,0,0,1,0,16Zm72-56H32V64H224V88Z`}))],[`light`,r.createElement(r.Fragment,null,r.createElement(`path`,{d:`M224,50H32A14,14,0,0,0,18,64V88a14,14,0,0,0,14,14h2v90a14,14,0,0,0,14,14H208a14,14,0,0,0,14-14V102h2a14,14,0,0,0,14-14V64A14,14,0,0,0,224,50ZM210,192a2,2,0,0,1-2,2H48a2,2,0,0,1-2-2V102H210ZM226,88a2,2,0,0,1-2,2H32a2,2,0,0,1-2-2V64a2,2,0,0,1,2-2H224a2,2,0,0,1,2,2ZM98,136a6,6,0,0,1,6-6h48a6,6,0,0,1,0,12H104A6,6,0,0,1,98,136Z`}))],[`regular`,r.createElement(r.Fragment,null,r.createElement(`path`,{d:`M224,48H32A16,16,0,0,0,16,64V88a16,16,0,0,0,16,16v88a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V104a16,16,0,0,0,16-16V64A16,16,0,0,0,224,48ZM208,192H48V104H208ZM224,88H32V64H224V88ZM96,136a8,8,0,0,1,8-8h48a8,8,0,0,1,0,16H104A8,8,0,0,1,96,136Z`}))],[`thin`,r.createElement(r.Fragment,null,r.createElement(`path`,{d:`M224,52H32A12,12,0,0,0,20,64V88a12,12,0,0,0,12,12h4v92a12,12,0,0,0,12,12H208a12,12,0,0,0,12-12V100h4a12,12,0,0,0,12-12V64A12,12,0,0,0,224,52ZM212,192a4,4,0,0,1-4,4H48a4,4,0,0,1-4-4V100H212ZM228,88a4,4,0,0,1-4,4H32a4,4,0,0,1-4-4V64a4,4,0,0,1,4-4H224a4,4,0,0,1,4,4ZM100,136a4,4,0,0,1,4-4h48a4,4,0,0,1,0,8H104A4,4,0,0,1,100,136Z`}))]]),a=r.forwardRef((e,t)=>r.createElement(n,{ref:t,...e,weights:i}));a.displayName=`ArchiveIcon`;export{a as t};
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t}from"./jsx-runtime-DE3RlOCf.js";import{h as n}from"./dist-BiFeezwN.js";var r=e(t(),1),i=new Map([[`bold`,r.createElement(r.Fragment,null,r.createElement(`path`,{d:`M228,128a12,12,0,0,1-12,12H69l51.52,51.51a12,12,0,0,1-17,17l-72-72a12,12,0,0,1,0-17l72-72a12,12,0,0,1,17,17L69,116H216A12,12,0,0,1,228,128Z`}))],[`duotone`,r.createElement(r.Fragment,null,r.createElement(`path`,{d:`M112,56V200L40,128Z`,opacity:`0.2`}),r.createElement(`path`,{d:`M216,120H120V56a8,8,0,0,0-13.66-5.66l-72,72a8,8,0,0,0,0,11.32l72,72A8,8,0,0,0,120,200V136h96a8,8,0,0,0,0-16ZM104,180.69,51.31,128,104,75.31Z`}))],[`fill`,r.createElement(r.Fragment,null,r.createElement(`path`,{d:`M224,128a8,8,0,0,1-8,8H120v64a8,8,0,0,1-13.66,5.66l-72-72a8,8,0,0,1,0-11.32l72-72A8,8,0,0,1,120,56v64h96A8,8,0,0,1,224,128Z`}))],[`light`,r.createElement(r.Fragment,null,r.createElement(`path`,{d:`M222,128a6,6,0,0,1-6,6H54.49l61.75,61.76a6,6,0,1,1-8.48,8.48l-72-72a6,6,0,0,1,0-8.48l72-72a6,6,0,0,1,8.48,8.48L54.49,122H216A6,6,0,0,1,222,128Z`}))],[`regular`,r.createElement(r.Fragment,null,r.createElement(`path`,{d:`M224,128a8,8,0,0,1-8,8H59.31l58.35,58.34a8,8,0,0,1-11.32,11.32l-72-72a8,8,0,0,1,0-11.32l72-72a8,8,0,0,1,11.32,11.32L59.31,120H216A8,8,0,0,1,224,128Z`}))],[`thin`,r.createElement(r.Fragment,null,r.createElement(`path`,{d:`M220,128a4,4,0,0,1-4,4H49.66l65.17,65.17a4,4,0,0,1-5.66,5.66l-72-72a4,4,0,0,1,0-5.66l72-72a4,4,0,0,1,5.66,5.66L49.66,124H216A4,4,0,0,1,220,128Z`}))]]),a=r.forwardRef((e,t)=>r.createElement(n,{ref:t,...e,weights:i}));a.displayName=`ArrowLeftIcon`;export{a as t};
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t}from"./jsx-runtime-BNakU3Ej.js";import{h as n}from"./dist-BO6Gz-vk.js";var r=e(t(),1),i=new Map([[`bold`,r.createElement(r.Fragment,null,r.createElement(`path`,{d:`M228,128a12,12,0,0,1-12,12H69l51.52,51.51a12,12,0,0,1-17,17l-72-72a12,12,0,0,1,0-17l72-72a12,12,0,0,1,17,17L69,116H216A12,12,0,0,1,228,128Z`}))],[`duotone`,r.createElement(r.Fragment,null,r.createElement(`path`,{d:`M112,56V200L40,128Z`,opacity:`0.2`}),r.createElement(`path`,{d:`M216,120H120V56a8,8,0,0,0-13.66-5.66l-72,72a8,8,0,0,0,0,11.32l72,72A8,8,0,0,0,120,200V136h96a8,8,0,0,0,0-16ZM104,180.69,51.31,128,104,75.31Z`}))],[`fill`,r.createElement(r.Fragment,null,r.createElement(`path`,{d:`M224,128a8,8,0,0,1-8,8H120v64a8,8,0,0,1-13.66,5.66l-72-72a8,8,0,0,1,0-11.32l72-72A8,8,0,0,1,120,56v64h96A8,8,0,0,1,224,128Z`}))],[`light`,r.createElement(r.Fragment,null,r.createElement(`path`,{d:`M222,128a6,6,0,0,1-6,6H54.49l61.75,61.76a6,6,0,1,1-8.48,8.48l-72-72a6,6,0,0,1,0-8.48l72-72a6,6,0,0,1,8.48,8.48L54.49,122H216A6,6,0,0,1,222,128Z`}))],[`regular`,r.createElement(r.Fragment,null,r.createElement(`path`,{d:`M224,128a8,8,0,0,1-8,8H59.31l58.35,58.34a8,8,0,0,1-11.32,11.32l-72-72a8,8,0,0,1,0-11.32l72-72a8,8,0,0,1,11.32,11.32L59.31,120H216A8,8,0,0,1,224,128Z`}))],[`thin`,r.createElement(r.Fragment,null,r.createElement(`path`,{d:`M220,128a4,4,0,0,1-4,4H49.66l65.17,65.17a4,4,0,0,1-5.66,5.66l-72-72a4,4,0,0,1,0-5.66l72-72a4,4,0,0,1,5.66,5.66L49.66,124H216A4,4,0,0,1,220,128Z`}))]]),a=r.forwardRef((e,t)=>r.createElement(n,{ref:t,...e,weights:i}));a.displayName=`ArrowLeftIcon`;export{a as t};
@@ -1 +1 @@
1
- import{m as e,t}from"./mermaid-parser.core-DK0kgowR.js";import{n}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import{m as r}from"./src-B6xuSHsQ.js";import"./chunk-DU6HZSFF-nxkO_ute.js";import{n as i,r as a,t as o}from"./chunk-SVP7TREG-_l4ZFWYL.js";import{t as s}from"./chunk-JWPE2WC7-DVXcaiue.js";import"./mermaid-diagram-CESNj6Ju.js";var c=e().RailroadAbnf.parser.LangiumParser,l=n(e=>{let t=e.alternatives.map(u);return t.length===1?t[0]:{type:`choice`,alternatives:t}},`transformAlternation`),u=n(e=>{let t=e.elements.map(f);return t.length===1?t[0]:{type:`sequence`,elements:t}},`transformConcatenation`),d=n(e=>{if(e.includes(`*`)){let[t,n]=e.split(`*`);return{min:t?parseInt(t,10):0,max:n?parseInt(n,10):1/0}}let t=parseInt(e,10);return{min:t,max:t}},`parseRepeat`),f=n(e=>{let t=p(e.primary);if(!e.repeat)return t;let{min:n,max:r}=d(e.repeat);return n===0&&r===1?{type:`optional`,element:t}:{type:`repetition`,element:t,min:n,max:r}},`transformElement`),p=n(e=>{switch(e.$type){case`AbnfStringLiteral`:return{type:`terminal`,value:e.value};case`AbnfNumVal`:return{type:`terminal`,value:e.value};case`AbnfRuleName`:return{type:`nonterminal`,name:e.name};case`AbnfGroup`:return l(e.element);case`AbnfOptionalGroup`:return{type:`optional`,element:l(e.element)};default:throw Error(`Unsupported ABNF primary node: ${e.$type}`)}},`transformPrimary`),m=n(e=>({name:e.name,definition:l(e.definition)}),`transformRule`),h=n(e=>{s(e,o),e.title&&o.setTitle(e.title),e.rules.map(e=>o.addRule(m(e)))},`populateDb`),g={parser:{parse:n(e=>{o.clear(),r.debug(`[ABNF Parser] Starting Langium parse`);let n=c.parse(e);if(n.lexerErrors.length>0||n.parserErrors.length>0)throw new t(n);let i=n.value;r.debug(`[ABNF Parser] Parsed rules:`,i.rules.length),h(i),r.debug(`[ABNF Parser] Parse complete`)},`parse`),parser:{yy:o}},db:o,renderer:a,styles:i};export{g as diagram};
1
+ import{m as e,t}from"./mermaid-parser.core-CpkwJ-8U.js";import{n}from"./chunk-Y2CYZVJY-DsF7k-Jl.js";import{m as r}from"./src-B6xuSHsQ.js";import"./chunk-DU6HZSFF-CHHMX1CR.js";import{n as i,r as a,t as o}from"./chunk-SVP7TREG-BqyZjR36.js";import{t as s}from"./chunk-JWPE2WC7-DVXcaiue.js";import"./mermaid-diagram-kbWN558y.js";var c=e().RailroadAbnf.parser.LangiumParser,l=n(e=>{let t=e.alternatives.map(u);return t.length===1?t[0]:{type:`choice`,alternatives:t}},`transformAlternation`),u=n(e=>{let t=e.elements.map(f);return t.length===1?t[0]:{type:`sequence`,elements:t}},`transformConcatenation`),d=n(e=>{if(e.includes(`*`)){let[t,n]=e.split(`*`);return{min:t?parseInt(t,10):0,max:n?parseInt(n,10):1/0}}let t=parseInt(e,10);return{min:t,max:t}},`parseRepeat`),f=n(e=>{let t=p(e.primary);if(!e.repeat)return t;let{min:n,max:r}=d(e.repeat);return n===0&&r===1?{type:`optional`,element:t}:{type:`repetition`,element:t,min:n,max:r}},`transformElement`),p=n(e=>{switch(e.$type){case`AbnfStringLiteral`:return{type:`terminal`,value:e.value};case`AbnfNumVal`:return{type:`terminal`,value:e.value};case`AbnfRuleName`:return{type:`nonterminal`,name:e.name};case`AbnfGroup`:return l(e.element);case`AbnfOptionalGroup`:return{type:`optional`,element:l(e.element)};default:throw Error(`Unsupported ABNF primary node: ${e.$type}`)}},`transformPrimary`),m=n(e=>({name:e.name,definition:l(e.definition)}),`transformRule`),h=n(e=>{s(e,o),e.title&&o.setTitle(e.title),e.rules.map(e=>o.addRule(m(e)))},`populateDb`),g={parser:{parse:n(e=>{o.clear(),r.debug(`[ABNF Parser] Starting Langium parse`);let n=c.parse(e);if(n.lexerErrors.length>0||n.parserErrors.length>0)throw new t(n);let i=n.value;r.debug(`[ABNF Parser] Parsed rules:`,i.rules.length),h(i),r.debug(`[ABNF Parser] Parse complete`)},`parse`),parser:{yy:o}},db:o,renderer:a,styles:i};export{g as diagram};
@@ -0,0 +1 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,t as n}from"./jsx-runtime-BNakU3Ej.js";import{h as r,i,o as a,p as o,r as s,t as c}from"./dist-BO6Gz-vk.js";import{t as l}from"./lib-CHy_7XQu.js";import{C as u,E as d,O as f,p,t as m}from"./workspace-a6lf168c.js";import{n as h}from"./trpc-CQO3zfei.js";import{en as g,fn as _,vn as v}from"./vbnet-CwR9YcOY.js";import{l as y}from"./use-websocket-channel-dNXOJZfW.js";import{p as b}from"./en-US-C-x19js7.js";import{c as x,i as S,l as C,n as w,o as T,s as E,t as D}from"./select-Cq3ddA2b.js";import{r as O,v as k}from"./core-DW3tuXQ3.js";import{p as ee}from"./radio-group-BhmTXkIv.js";import{a as te,c as A,i as ne,l as re,n as ie,r as ae,s as oe,t as se}from"./data-import-button-cvKmYZJe.js";import{n as ce,r as le,t as ue}from"./use-download-server-log-efKIcIwE.js";import{n as de,t as fe}from"./textarea-DxWYClhS.js";import{n as pe,t as me}from"./provider-cli-warning-CIAJ88Cy.js";import{O as he}from"./use-websocket-transport-BuYcrZTd.js";import{C as ge,E as j,b as _e,n as ve,t as ye,u as be,w as M}from"./dist-DGw3MClt.js";import{t as N}from"./badge-CoDH1rER.js";import{t as P}from"./label-ANA2Lfpk.js";import{A as xe,O as Se,T as Ce,_ as F,a as we,g as I,h as L,i as Te,k as R,m as z,v as B}from"./index-BJo4hZ8z.js";import{i as V,n as H,r as Ee,t as De}from"./tabs-BBAQyvSA.js";import{i as Oe,n as ke,r as Ae,t as je}from"./voice-vad-ChMQMgBS.js";import{a as Me,i as U,n as Ne,o as W,r as G,t as Pe}from"./table-CUvMM0aA.js";import{i as Fe,n as Ie,t as Le}from"./formatters-D_bnXRun.js";import{t as Re}from"./factory-config-scripts-C2BfO5od.js";var K=e(t(),1),ze=new Map([[`bold`,K.createElement(K.Fragment,null,K.createElement(`path`,{d:`M117.18,188.74a12,12,0,0,1,0,17l-5.12,5.12A58.26,58.26,0,0,1,70.6,228h0A58.62,58.62,0,0,1,29.14,127.92L63.89,93.17a58.64,58.64,0,0,1,98.56,28.11,12,12,0,1,1-23.37,5.44,34.65,34.65,0,0,0-58.22-16.58L46.11,144.89A34.62,34.62,0,0,0,70.57,204h0a34.41,34.41,0,0,0,24.49-10.14l5.11-5.12A12,12,0,0,1,117.18,188.74ZM226.83,45.17a58.65,58.65,0,0,0-82.93,0l-5.11,5.11a12,12,0,0,0,17,17l5.12-5.12a34.63,34.63,0,1,1,49,49L175.1,145.86A34.39,34.39,0,0,1,150.61,156h0a34.63,34.63,0,0,1-33.69-26.72,12,12,0,0,0-23.38,5.44A58.64,58.64,0,0,0,150.56,180h.05a58.28,58.28,0,0,0,41.47-17.17l34.75-34.75a58.62,58.62,0,0,0,0-82.91Z`}))],[`duotone`,K.createElement(K.Fragment,null,K.createElement(`path`,{d:`M218.34,119.6,183.6,154.34a46.58,46.58,0,0,1-44.31,12.26c-.31.34-.62.67-.95,1L103.6,202.34A46.63,46.63,0,1,1,37.66,136.4L72.4,101.66A46.6,46.6,0,0,1,116.71,89.4c.31-.34.62-.67,1-1L152.4,53.66a46.63,46.63,0,0,1,65.94,65.94Z`,opacity:`0.2`}),K.createElement(`path`,{d:`M240,88.23a54.43,54.43,0,0,1-16,37L189.25,160a54.27,54.27,0,0,1-38.63,16h-.05A54.63,54.63,0,0,1,96,119.84a8,8,0,0,1,16,.45A38.62,38.62,0,0,0,150.58,160h0a38.39,38.39,0,0,0,27.31-11.31l34.75-34.75a38.63,38.63,0,0,0-54.63-54.63l-11,11A8,8,0,0,1,135.7,59l11-11A54.65,54.65,0,0,1,224,48,54.86,54.86,0,0,1,240,88.23ZM109,185.66l-11,11A38.41,38.41,0,0,1,70.6,208h0a38.63,38.63,0,0,1-27.29-65.94L78,107.31A38.63,38.63,0,0,1,144,135.71a8,8,0,0,0,7.78,8.22H152a8,8,0,0,0,8-7.78A54.86,54.86,0,0,0,144,96a54.65,54.65,0,0,0-77.27,0L32,130.75A54.62,54.62,0,0,0,70.56,224h0a54.28,54.28,0,0,0,38.64-16l11-11A8,8,0,0,0,109,185.66Z`}))],[`fill`,K.createElement(K.Fragment,null,K.createElement(`path`,{d:`M208,32H48A16,16,0,0,0,32,48V208a16,16,0,0,0,16,16H208a16,16,0,0,0,16-16V48A16,16,0,0,0,208,32ZM115.7,192.49a43.31,43.31,0,0,1-55-66.43l25.37-25.37a43.35,43.35,0,0,1,61.25,0,42.9,42.9,0,0,1,9.95,15.43,8,8,0,1,1-15,5.6A27.33,27.33,0,0,0,97.37,112L72,137.37a27.32,27.32,0,0,0,34.68,41.91,8,8,0,1,1,9,13.21Zm79.61-62.55-25.37,25.37A43,43,0,0,1,139.32,168h0a43.35,43.35,0,0,1-40.53-28.12,8,8,0,1,1,15-5.6A27.35,27.35,0,0,0,139.28,152h0a27.14,27.14,0,0,0,19.32-8L184,118.63a27.32,27.32,0,0,0-34.68-41.91,8,8,0,1,1-9-13.21,43.32,43.32,0,0,1,55,66.43Z`}))],[`light`,K.createElement(K.Fragment,null,K.createElement(`path`,{d:`M238,88.18a52.42,52.42,0,0,1-15.4,35.66l-34.75,34.75A52.28,52.28,0,0,1,150.62,174h-.05A52.63,52.63,0,0,1,98,119.9a6,6,0,0,1,6-5.84h.17a6,6,0,0,1,5.83,6.16A40.62,40.62,0,0,0,150.58,162h0a40.4,40.4,0,0,0,28.73-11.9l34.75-34.74A40.63,40.63,0,0,0,156.63,57.9l-11,11a6,6,0,0,1-8.49-8.49l11-11a52.62,52.62,0,0,1,74.43,0A52.83,52.83,0,0,1,238,88.18Zm-127.62,98.9-11,11A40.36,40.36,0,0,1,70.6,210h0a40.63,40.63,0,0,1-28.7-69.36L76.62,105.9A40.63,40.63,0,0,1,146,135.77a6,6,0,0,0,5.83,6.16H152a6,6,0,0,0,6-5.84A52.63,52.63,0,0,0,68.14,97.42L33.38,132.16A52.63,52.63,0,0,0,70.56,222h0a52.26,52.26,0,0,0,37.22-15.42l11-11a6,6,0,1,0-8.49-8.48Z`}))],[`regular`,K.createElement(K.Fragment,null,K.createElement(`path`,{d:`M240,88.23a54.43,54.43,0,0,1-16,37L189.25,160a54.27,54.27,0,0,1-38.63,16h-.05A54.63,54.63,0,0,1,96,119.84a8,8,0,0,1,16,.45A38.62,38.62,0,0,0,150.58,160h0a38.39,38.39,0,0,0,27.31-11.31l34.75-34.75a38.63,38.63,0,0,0-54.63-54.63l-11,11A8,8,0,0,1,135.7,59l11-11A54.65,54.65,0,0,1,224,48,54.86,54.86,0,0,1,240,88.23ZM109,185.66l-11,11A38.41,38.41,0,0,1,70.6,208h0a38.63,38.63,0,0,1-27.29-65.94L78,107.31A38.63,38.63,0,0,1,144,135.71a8,8,0,0,0,16,.45A54.86,54.86,0,0,0,144,96a54.65,54.65,0,0,0-77.27,0L32,130.75A54.62,54.62,0,0,0,70.56,224h0a54.28,54.28,0,0,0,38.64-16l11-11A8,8,0,0,0,109,185.66Z`}))],[`thin`,K.createElement(K.Fragment,null,K.createElement(`path`,{d:`M236,88.12a50.44,50.44,0,0,1-14.81,34.31l-34.75,34.74A50.33,50.33,0,0,1,150.62,172h-.05A50.63,50.63,0,0,1,100,120a4,4,0,0,1,4-3.89h.11a4,4,0,0,1,3.89,4.11A42.64,42.64,0,0,0,150.58,164h0a42.32,42.32,0,0,0,30.14-12.49l34.75-34.74a42.63,42.63,0,1,0-60.29-60.28l-11,11a4,4,0,0,1-5.66-5.65l11-11A50.64,50.64,0,0,1,236,88.12ZM111.78,188.49l-11,11A42.33,42.33,0,0,1,70.6,212h0a42.63,42.63,0,0,1-30.11-72.77l34.75-34.74A42.63,42.63,0,0,1,148,135.82a4,4,0,0,0,8,.23A50.64,50.64,0,0,0,69.55,98.83L34.8,133.57A50.63,50.63,0,0,0,70.56,220h0a50.33,50.33,0,0,0,35.81-14.83l11-11a4,4,0,1,0-5.65-5.66Z`}))]]),Be=new Map([[`bold`,K.createElement(K.Fragment,null,K.createElement(`path`,{d:`M216,48H180V36A28,28,0,0,0,152,8H104A28,28,0,0,0,76,36V48H40a12,12,0,0,0,0,24h4V208a20,20,0,0,0,20,20H192a20,20,0,0,0,20-20V72h4a12,12,0,0,0,0-24ZM100,36a4,4,0,0,1,4-4h48a4,4,0,0,1,4,4V48H100Zm88,168H68V72H188ZM116,104v64a12,12,0,0,1-24,0V104a12,12,0,0,1,24,0Zm48,0v64a12,12,0,0,1-24,0V104a12,12,0,0,1,24,0Z`}))],[`duotone`,K.createElement(K.Fragment,null,K.createElement(`path`,{d:`M200,56V208a8,8,0,0,1-8,8H64a8,8,0,0,1-8-8V56Z`,opacity:`0.2`}),K.createElement(`path`,{d:`M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM96,40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8v8H96Zm96,168H64V64H192ZM112,104v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Z`}))],[`fill`,K.createElement(K.Fragment,null,K.createElement(`path`,{d:`M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM112,168a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm0-120H96V40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8Z`}))],[`light`,K.createElement(K.Fragment,null,K.createElement(`path`,{d:`M216,50H174V40a22,22,0,0,0-22-22H104A22,22,0,0,0,82,40V50H40a6,6,0,0,0,0,12H50V208a14,14,0,0,0,14,14H192a14,14,0,0,0,14-14V62h10a6,6,0,0,0,0-12ZM94,40a10,10,0,0,1,10-10h48a10,10,0,0,1,10,10V50H94ZM194,208a2,2,0,0,1-2,2H64a2,2,0,0,1-2-2V62H194ZM110,104v64a6,6,0,0,1-12,0V104a6,6,0,0,1,12,0Zm48,0v64a6,6,0,0,1-12,0V104a6,6,0,0,1,12,0Z`}))],[`regular`,K.createElement(K.Fragment,null,K.createElement(`path`,{d:`M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM96,40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8v8H96Zm96,168H64V64H192ZM112,104v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Z`}))],[`thin`,K.createElement(K.Fragment,null,K.createElement(`path`,{d:`M216,52H172V40a20,20,0,0,0-20-20H104A20,20,0,0,0,84,40V52H40a4,4,0,0,0,0,8H52V208a12,12,0,0,0,12,12H192a12,12,0,0,0,12-12V60h12a4,4,0,0,0,0-8ZM92,40a12,12,0,0,1,12-12h48a12,12,0,0,1,12,12V52H92ZM196,208a4,4,0,0,1-4,4H64a4,4,0,0,1-4-4V60H196ZM108,104v64a4,4,0,0,1-8,0V104a4,4,0,0,1,8,0Zm48,0v64a4,4,0,0,1-8,0V104a4,4,0,0,1,8,0Z`}))]]),Ve=K.forwardRef((e,t)=>K.createElement(r,{ref:t,...e,weights:ze}));Ve.displayName=`LinkIcon`;var He=K.forwardRef((e,t)=>K.createElement(r,{ref:t,...e,weights:Be}));He.displayName=`TrashIcon`;var q=n(),Ue={ok:`border-l-success`,warning:`border-l-warning`,error:`border-l-destructive`};function We({title:e,value:t,subtitle:n,status:r}){return(0,q.jsxs)(z,{className:`border-l-4 ${r?Ue[r]:`border-l-muted`}`,children:[(0,q.jsxs)(F,{className:`pb-2`,children:[(0,q.jsx)(I,{children:e}),(0,q.jsx)(B,{className:`text-2xl`,children:t})]}),n&&(0,q.jsx)(L,{className:`pt-0`,children:(0,q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:n})})]})}function Ge({apiUsage:e,onReset:t,isResetting:n}){return(0,q.jsxs)(z,{children:[(0,q.jsxs)(F,{className:`flex flex-row items-center justify-between space-y-0 pb-4`,children:[(0,q.jsx)(B,{children:`API Usage`}),(0,q.jsx)(i,{variant:`link`,onClick:t,disabled:n,className:`h-auto p-0`,children:`Reset Stats`})]}),(0,q.jsx)(L,{children:(0,q.jsxs)(`div`,{className:`grid grid-cols-1 md:grid-cols-4 gap-4`,children:[(0,q.jsx)(We,{title:`Requests/min`,value:e?.requestsLastMinute||0,status:e?.isRateLimited?`warning`:`ok`}),(0,q.jsx)(We,{title:`Requests/hour`,value:e?.requestsLastHour||0}),(0,q.jsx)(We,{title:`Total Requests`,value:e?.totalRequests||0}),(0,q.jsx)(We,{title:`Queue Depth`,value:e?.queueDepth||0,status:e?.queueDepth&&e.queueDepth>10?`warning`:`ok`})]})})]})}function Ke(e,t=`(restart to detect)`){return e==null?t:String(e)}function qe(e){if(e.port){let t=Number.parseInt(e.port,10);if(!Number.isNaN(t))return String(t)}return e.protocol===`http:`?`80`:e.protocol===`https:`?`443`:`(not available)`}function Je(){let{data:e,isLoading:t}=h.admin.getServerInfo.useQuery(void 0,{retry:1,retryDelay:1e3,meta:{suppressErrors:!0}}),n=qe(window.location),r=e?.backendPort??null;return t?(0,q.jsxs)(z,{children:[(0,q.jsxs)(F,{children:[(0,q.jsx)(B,{children:`App Info`}),(0,q.jsx)(I,{children:`Repository and runtime details`})]}),(0,q.jsx)(L,{children:(0,q.jsx)(R,{className:`h-10 w-full`})})]}):(0,q.jsxs)(z,{children:[(0,q.jsxs)(F,{children:[(0,q.jsx)(B,{children:`App Info`}),(0,q.jsx)(I,{children:`Repository and runtime details`})]}),(0,q.jsxs)(L,{className:`space-y-4`,children:[(0,q.jsxs)(`div`,{className:`space-y-2`,children:[(0,q.jsx)(P,{children:`Repository`}),(0,q.jsxs)(`a`,{href:`https://github.com/purplefish-ai/factory-factory`,target:`_blank`,rel:`noopener noreferrer`,className:`inline-flex items-center gap-1.5 text-sm text-muted-foreground hover:text-foreground transition-colors`,children:[`GitHub`,(0,q.jsx)(v,{className:`h-3.5 w-3.5`})]})]}),(0,q.jsxs)(`div`,{className:`space-y-2`,children:[(0,q.jsx)(P,{children:`Ports`}),(0,q.jsxs)(`div`,{className:`space-y-1 text-sm text-muted-foreground`,children:[(0,q.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,q.jsx)(`span`,{children:`Frontend`}),(0,q.jsx)(`code`,{className:`rounded bg-muted px-1.5 py-0.5`,children:n})]}),(0,q.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,q.jsx)(`span`,{children:`Backend`}),(0,q.jsx)(`code`,{className:`rounded bg-muted px-1.5 py-0.5`,children:Ke(r)})]})]})]})]})]})}function Ye(){let{data:e,isLoading:t}=h.userSettings.get.useQuery(),{data:n}=h.userSettings.getProviderOptions.useQuery(void 0,{staleTime:3e4}),r=h.useUtils(),[i,a]=(0,K.useState)(`sonnet`),[o,s]=(0,K.useState)(`default`),c=h.userSettings.update.useMutation({onSuccess:()=>{j.success(`Chat defaults updated`),r.userSettings.get.invalidate()},onError:(t,n)=>{let i=r.userSettings.get.getData()??e;n.defaultClaudeModel!==void 0&&a(e=>e===n.defaultClaudeModel?i?.defaultClaudeModel??`sonnet`:e),n.defaultCodexModel!==void 0&&s(e=>e===n.defaultCodexModel?i?.defaultCodexModel??`default`:e),j.error(`Failed to update chat defaults: ${t.message}`)}});if((0,K.useEffect)(()=>{a(e?.defaultClaudeModel??`sonnet`),s(e?.defaultCodexModel??`default`)},[e?.defaultClaudeModel,e?.defaultCodexModel]),t)return(0,q.jsxs)(z,{children:[(0,q.jsxs)(F,{children:[(0,q.jsx)(B,{children:`Chat Defaults`}),(0,q.jsx)(I,{children:`Default provider for new chats`})]}),(0,q.jsx)(L,{children:(0,q.jsx)(R,{className:`h-10 w-full`})})]});let l=e?.defaultSessionProvider??`CLAUDE`,u=e?.defaultClaudeModel??`sonnet`,d=e?.defaultCodexModel??`default`,f=e?.defaultClaudeReasoningEffort??null,p=e?.defaultCodexReasoningEffort??null,m=e?.defaultWorkspacePermissions??`STRICT`,g=`__provider_default__`,_=(e,t)=>{let r=n?.[e]?.models??[];return r.some(e=>e.value===t)?r:[{value:t,label:e===`CLAUDE`?`Saved model — ${t} (not in current catalog)`:t},...r]},v=(e,t)=>{let r=n?.[e]?.efforts??[];return!t||r.some(e=>e.value===t)?r:[{value:t,label:t},...r]},y={CLAUDE:{fallbackValue:`sonnet`,currentValue:u,localValue:i,setLocalValue:a,buildPayload:e=>({defaultClaudeModel:e}),buildEffortPayload:e=>({defaultClaudeReasoningEffort:e})},CODEX:{fallbackValue:`default`,currentValue:d,localValue:o,setLocalValue:s,buildPayload:e=>({defaultCodexModel:e}),buildEffortPayload:e=>({defaultCodexReasoningEffort:e})}},b=(e,t)=>{let n=y[e],r=t.trim()||n.fallbackValue;if(r===n.currentValue){n.localValue!==n.currentValue&&n.setLocalValue(n.currentValue);return}c.mutate(n.buildPayload(r))},x=(e,t)=>{let n=t===g?null:t;c.mutate(y[e].buildEffortPayload(n))};return(0,q.jsxs)(z,{children:[(0,q.jsxs)(F,{children:[(0,q.jsx)(B,{children:`Chat Defaults`}),(0,q.jsx)(I,{children:`Default provider used when a workspace defers provider selection`})]}),(0,q.jsxs)(L,{className:`space-y-3`,children:[(0,q.jsx)(P,{htmlFor:`chat-default-provider`,children:`Default chat provider`}),(0,q.jsxs)(D,{value:l,onValueChange:e=>{(e===`CLAUDE`||e===`CODEX`)&&c.mutate({defaultSessionProvider:e})},disabled:c.isPending,children:[(0,q.jsx)(T,{id:`chat-default-provider`,children:(0,q.jsx)(E,{})}),(0,q.jsxs)(w,{children:[(0,q.jsx)(S,{value:`CLAUDE`,children:`Claude`}),(0,q.jsx)(S,{value:`CODEX`,children:`Codex`})]})]}),(0,q.jsx)(me,{provider:l}),(0,q.jsxs)(`div`,{className:`grid gap-3 pt-1 sm:grid-cols-2`,children:[(0,q.jsxs)(`div`,{className:`space-y-2`,children:[(0,q.jsx)(P,{htmlFor:`default-claude-model`,children:`Default Claude model`}),(0,q.jsxs)(D,{value:i,onValueChange:e=>{a(e),b(`CLAUDE`,e)},disabled:c.isPending,children:[(0,q.jsx)(T,{id:`default-claude-model`,children:(0,q.jsx)(E,{})}),(0,q.jsx)(w,{children:_(`CLAUDE`,u).map(e=>(0,q.jsx)(S,{value:e.value,children:e.label},e.value))})]}),(0,q.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Claude aliases like `,(0,q.jsx)(`code`,{className:`rounded bg-muted px-1`,children:`sonnet`}),` and`,` `,(0,q.jsx)(`code`,{className:`rounded bg-muted px-1`,children:`opus`}),` are supported.`]})]}),(0,q.jsxs)(`div`,{className:`space-y-2`,children:[(0,q.jsx)(P,{htmlFor:`default-codex-model`,children:`Default Codex model`}),(0,q.jsxs)(D,{value:o,onValueChange:e=>{s(e),b(`CODEX`,e)},disabled:c.isPending,children:[(0,q.jsx)(T,{id:`default-codex-model`,children:(0,q.jsx)(E,{})}),(0,q.jsx)(w,{children:_(`CODEX`,d).map(e=>(0,q.jsx)(S,{value:e.value,children:e.label},e.value))})]}),(0,q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Codex options are loaded from the CLI when available.`})]})]}),(0,q.jsxs)(`div`,{className:`grid gap-3 pt-1 sm:grid-cols-2`,children:[(0,q.jsxs)(`div`,{className:`space-y-2`,children:[(0,q.jsx)(P,{htmlFor:`default-claude-effort`,children:`Default Claude effort`}),(0,q.jsxs)(D,{value:f??g,onValueChange:e=>x(`CLAUDE`,e),disabled:c.isPending,children:[(0,q.jsx)(T,{id:`default-claude-effort`,children:(0,q.jsx)(E,{})}),(0,q.jsxs)(w,{children:[(0,q.jsx)(S,{value:g,children:`Provider default`}),v(`CLAUDE`,f).map(e=>(0,q.jsx)(S,{value:e.value,children:e.label},e.value))]})]})]}),(0,q.jsxs)(`div`,{className:`space-y-2`,children:[(0,q.jsx)(P,{htmlFor:`default-codex-effort`,children:`Default Codex effort`}),(0,q.jsxs)(D,{value:p??g,onValueChange:e=>x(`CODEX`,e),disabled:c.isPending,children:[(0,q.jsx)(T,{id:`default-codex-effort`,children:(0,q.jsx)(E,{})}),(0,q.jsxs)(w,{children:[(0,q.jsx)(S,{value:g,children:`Provider default`}),v(`CODEX`,p).map(e=>(0,q.jsx)(S,{value:e.value,children:e.label},e.value))]})]})]})]}),(0,q.jsxs)(`div`,{className:`space-y-2 pt-1`,children:[(0,q.jsx)(P,{htmlFor:`workspace-permissions`,children:`Default permissions for new workspaces`}),(0,q.jsxs)(D,{value:m,onValueChange:e=>{(e===`STRICT`||e===`RELAXED`||e===`YOLO`)&&c.mutate({defaultWorkspacePermissions:e})},disabled:c.isPending,children:[(0,q.jsx)(T,{id:`workspace-permissions`,children:(0,q.jsx)(E,{})}),(0,q.jsxs)(w,{children:[(0,q.jsx)(S,{value:`STRICT`,children:`Strict`}),(0,q.jsx)(S,{value:`RELAXED`,children:`Relaxed`}),(0,q.jsx)(S,{value:`YOLO`,children:`YOLO`})]})]})]})]})]})}function Xe(){let[e,t]=(0,K.useState)(!1),{refresh:n}=re();return(0,q.jsxs)(z,{children:[(0,q.jsxs)(F,{children:[(0,q.jsxs)(B,{className:`flex items-center gap-2`,children:[(0,q.jsx)(he,{className:`w-5 h-5`}),`CLI Authentication`]}),(0,q.jsx)(I,{children:`Check and manage authentication for Claude, Codex, and GitHub CLI`})]}),(0,q.jsxs)(L,{children:[(0,q.jsx)(A,{onOpenTerminal:()=>t(!0)}),(0,q.jsx)(oe,{open:e,onClose:()=>{t(!1),n()}})]})]})}function Ze(){let[e,t]=(0,K.useState)(!1),n=h.useUtils();return(0,q.jsxs)(z,{children:[(0,q.jsxs)(F,{children:[(0,q.jsxs)(B,{className:`flex items-center gap-2`,children:[(0,q.jsx)(de,{className:`w-5 h-5`}),`Data Backup`]}),(0,q.jsx)(I,{children:`Export and import database data for backup or migration purposes`})]}),(0,q.jsxs)(L,{className:`space-y-4`,children:[(0,q.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row sm:gap-4`,children:[(0,q.jsxs)(i,{onClick:async()=>{t(!0);try{let e=await n.admin.exportData.fetch(),t=JSON.stringify(e,null,2);ce({data:t,mimeType:`application/json`,fileName:`factory-factory-backup-${new Date().toISOString().split(`T`)[0]}.json`}),j.success(`Export completed`)}catch(e){j.error(`Export failed: ${e instanceof Error?e.message:`Unknown error`}`)}finally{t(!1)}},disabled:e,variant:`outline`,className:`w-full sm:w-auto`,children:[(0,q.jsx)(le,{className:`w-4 h-4 mr-2`}),e?`Exporting...`:`Export Data`]}),(0,q.jsx)(se,{variant:`outline`,className:`w-full sm:w-auto`})]}),(0,q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Export includes projects, workspaces, session metadata, and user preferences. Caches will be rebuilt automatically after import.`})]})]})}function Qe(){let{data:e,isLoading:t}=h.userSettings.get.useQuery(),n=h.useUtils(),[r,a]=(0,K.useState)(!1),o=h.userSettings.update.useMutation({onSuccess:async()=>{j.success(`IDE settings updated`),await Promise.all([n.userSettings.get.invalidate(),n.workspace.getAvailableIdes.invalidate()]),a(!1)},onError:e=>{j.error(`Failed to update settings: ${e.message}`)}}),c=h.userSettings.testCustomCommand.useMutation({onSuccess:()=>{j.success(`Command executed successfully!`)},onError:e=>{j.error(`Command test failed: ${e.message}`)}}),[l,u]=(0,K.useState)(e?.customIdeCommand||``);(0,K.useEffect)(()=>{u(e?.customIdeCommand||``)},[e?.customIdeCommand]);let d=e=>{let t=e.trim();t&&o.mutate({preferredIde:`custom`,customIdeCommand:t})},f=e=>{e===`custom`?(a(!0),d(l)):(e===`cursor`||e===`vscode`)&&(a(!1),o.mutate({preferredIde:e}))},p=r?`custom`:e?.preferredIde??`cursor`;return t?(0,q.jsxs)(z,{children:[(0,q.jsxs)(F,{children:[(0,q.jsx)(B,{children:`IDE Settings`}),(0,q.jsx)(I,{children:`Configure your preferred IDE for opening workspaces`})]}),(0,q.jsx)(L,{children:(0,q.jsx)(R,{className:`h-10 w-full`})})]}):(0,q.jsxs)(z,{children:[(0,q.jsxs)(F,{children:[(0,q.jsx)(B,{children:`IDE Settings`}),(0,q.jsx)(I,{children:`Configure your preferred IDE for opening workspaces`})]}),(0,q.jsxs)(L,{className:`space-y-4`,children:[(0,q.jsxs)(`div`,{className:`space-y-2`,children:[(0,q.jsx)(P,{htmlFor:`ide-select`,children:`Preferred IDE`}),(0,q.jsxs)(D,{value:p,onValueChange:f,disabled:o.isPending,children:[(0,q.jsx)(T,{id:`ide-select`,children:(0,q.jsx)(E,{placeholder:`Select an IDE`})}),(0,q.jsxs)(w,{children:[(0,q.jsx)(S,{value:`cursor`,children:`Cursor`}),(0,q.jsx)(S,{value:`vscode`,children:`VS Code`}),(0,q.jsx)(S,{value:`custom`,children:`Custom`})]})]})]}),p===`custom`&&(0,q.jsxs)(`div`,{className:`space-y-2`,children:[(0,q.jsx)(P,{htmlFor:`custom-command`,children:`Custom Command`}),(0,q.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row`,children:[(0,q.jsx)(s,{id:`custom-command`,value:l,onChange:e=>u(e.target.value),onBlur:()=>d(l),placeholder:`code-insiders {workspace}`,className:`font-mono text-sm flex-1`,disabled:o.isPending}),(0,q.jsx)(i,{variant:`outline`,onClick:()=>{if(!l.trim()){j.error(`Please enter a custom command first`);return}c.mutate({customCommand:l})},disabled:c.isPending||!l.trim(),children:c.isPending?`Testing...`:`Test`})]}),(0,q.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Use `,(0,q.jsx)(`code`,{className:`bg-muted px-1 py-0.5 rounded`,children:`{workspace}`}),` as a placeholder for the workspace path. Example:`,` `,(0,q.jsxs)(`code`,{className:`bg-muted px-1 py-0.5 rounded`,children:[`code-insiders `,`{workspace}`]})]})]})]})]})}function $e({projectId:e,linearConfig:t,onSave:n,isSaving:r}){let[a,o]=(0,K.useState)(``),[c,l]=(0,K.useState)(t?.viewerName??null),[u,d]=(0,K.useState)([]),[f,p]=(0,K.useState)(null),m=h.linear.validateKeyAndListTeams.useMutation({onError:e=>j.error(`Validation failed: ${e.message}`)}),g=async()=>{try{let e=await m.mutateAsync({apiKey:a});e.valid?(l(e.viewerName??null),d(e.teams??[])):j.error(`Validation failed: ${e.error??`Unknown error`}`)}catch{}},_=()=>{let e=u.find(e=>e.id===f);e&&c&&(n({linear:{apiKey:a,teamId:e.id,teamName:`${e.name} (${e.key})`,viewerName:c}}),o(``),l(null),d([]),p(null))},v=c!==null,y=u.length>0,b=t?.hasApiKey??!1,x=t?.teamName??null;return(0,q.jsxs)(q.Fragment,{children:[(0,q.jsxs)(`div`,{className:`flex items-end gap-2`,children:[(0,q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,q.jsx)(P,{htmlFor:`api-key-${e}`,children:`API Key`}),v&&(0,q.jsxs)(`span`,{className:`flex items-center gap-1 text-xs text-green-600`,children:[(0,q.jsx)(k,{className:`w-3 h-3`}),`Connected as `,c]})]}),(0,q.jsx)(s,{id:`api-key-${e}`,type:`password`,value:a,onChange:e=>o(e.target.value),placeholder:b?`••••••••••••••••••••`:`lin_api_...`,className:`font-mono text-sm w-[280px]`})]}),(0,q.jsx)(i,{variant:`outline`,onClick:g,disabled:m.isPending||!a,children:m.isPending?`Validating...`:`Validate`})]}),v&&y&&(0,q.jsxs)(q.Fragment,{children:[(0,q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,q.jsx)(P,{children:`Team`}),(0,q.jsxs)(D,{value:f??``,onValueChange:p,children:[(0,q.jsx)(T,{className:`w-[220px]`,children:(0,q.jsx)(E,{placeholder:`Select a team`})}),(0,q.jsx)(w,{children:u.map(e=>(0,q.jsxs)(S,{value:e.id,children:[e.name,` (`,e.key,`)`]},e.id))})]})]}),(0,q.jsx)(i,{onClick:_,disabled:!f||r,className:`self-end`,children:r?`Saving...`:`Save`})]}),x&&!y&&(0,q.jsxs)(`p`,{className:`text-sm text-muted-foreground self-end pb-2`,children:[`Team: `,x]}),!v&&(0,q.jsxs)(`p`,{className:`text-xs text-muted-foreground mt-2 basis-full`,children:[`Create a personal API key at`,` `,(0,q.jsx)(`a`,{href:`https://linear.app/settings/api`,target:`_blank`,rel:`noopener noreferrer`,className:`underline`,children:`linear.app/settings/api`})]})]})}function et({projectId:e,projectName:t,currentProvider:n,issueTrackerConfig:r}){let i=h.useUtils(),[a,o]=(0,K.useState)(n),s=h.project.update.useMutation({onSuccess:()=>{j.success(`Issue tracking settings saved`),i.project.list.invalidate()},onError:e=>j.error(`Failed to save: ${e.message}`)}),c=t=>{o(t),s.mutate({id:e,issueProvider:t})},l=t=>{s.mutate({id:e,issueProvider:O.LINEAR,issueTrackerConfig:t})},u=a===O.LINEAR,d=!u||r?.linear!=null;return(0,q.jsxs)(`div`,{className:`rounded-lg border bg-card`,children:[(0,q.jsx)(`div`,{className:`border-b bg-muted/50 px-4 py-3`,children:(0,q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,q.jsx)(`h3`,{className:`font-semibold text-sm`,children:t}),d&&(0,q.jsxs)(N,{variant:`default`,className:`bg-green-600 hover:bg-green-700`,children:[(0,q.jsx)(k,{className:`w-3 h-3 mr-1`}),u?`Linear`:`GitHub`]})]})}),(0,q.jsx)(`div`,{className:`p-4`,children:(0,q.jsxs)(`div`,{className:`flex flex-wrap items-end gap-3`,children:[(0,q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,q.jsx)(P,{children:`Issue Provider`}),(0,q.jsxs)(D,{value:a,onValueChange:c,disabled:s.isPending,children:[(0,q.jsx)(T,{className:`w-[180px]`,children:(0,q.jsx)(E,{})}),(0,q.jsxs)(w,{children:[(0,q.jsx)(S,{value:O.GITHUB,children:`GitHub Issues`}),(0,q.jsx)(S,{value:O.LINEAR,children:`Linear Issues`})]})]})]}),u&&(0,q.jsx)($e,{projectId:e,linearConfig:r?.linear??null,onSave:l,isSaving:s.isPending})]})})]})}var tt=Object.defineProperty,J=(e,t)=>tt(e,`name`,{value:t,configurable:!0}),nt=`Switch`,[rt,it]=ge(nt),[at,ot]=rt(nt);function st(e){let{__scopeSwitch:t,checked:n,children:r,defaultChecked:i,disabled:a,form:o,name:s,onCheckedChange:c,required:l,value:u=`on`,internal_do_not_use_render:d}=e,[f,p]=_e({prop:n,defaultProp:i??!1,onChange:c,caller:nt}),[m,h]=K.useState(null),[g,_]=K.useState(null),v=K.useRef(!1),[y,b]=K.useReducer(e=>e+1,0),x={checked:f,setChecked:p,disabled:a,control:m,setControl:h,name:s,form:o,value:u,hasConsumerStoppedPropagationRef:v,userInteractionCount:y,onUserInteraction:b,required:l,defaultChecked:i,isFormControl:!m||!!o||!!m.closest(`form`),bubbleInput:g,setBubbleInput:_};return(0,q.jsx)(at,{scope:t,...x,children:ht(d)?d(x):r})}J(st,`SwitchProvider`);var ct=`SwitchTrigger`,lt=K.forwardRef(J(function({__scopeSwitch:e,onClick:t,...n},r){let{control:i,form:a,value:s,disabled:l,checked:u,required:d,setControl:f,setChecked:p,hasConsumerStoppedPropagationRef:m,onUserInteraction:h,isFormControl:g,bubbleInput:_}=ot(ct,e),v=o(r,f),y=K.useRef(u);return K.useEffect(()=>{let e=a?i?.ownerDocument.getElementById(a):i?.form;if(e instanceof HTMLFormElement){let t=J(()=>p(y.current),`reset`);return e.addEventListener(`reset`,t),()=>e.removeEventListener(`reset`,t)}},[i,a,p]),(0,q.jsx)(c.button,{type:`button`,role:`switch`,"aria-checked":u,"aria-required":d,"data-state":gt(u),"data-disabled":l?``:void 0,disabled:l,value:s,...n,ref:v,onClick:M(t,e=>{h(),p(e=>!e),_&&g&&(m.current=e.isPropagationStopped(),m.current||e.stopPropagation())})})},`SwitchTrigger`)),ut=K.forwardRef(J(function(e,t){let{__scopeSwitch:n,name:r,checked:i,defaultChecked:a,required:o,disabled:s,value:c,onCheckedChange:l,form:u,...d}=e;return(0,q.jsx)(st,{__scopeSwitch:n,checked:i,defaultChecked:a,disabled:s,required:o,onCheckedChange:l,name:r,form:u,value:c,internal_do_not_use_render:({isFormControl:e})=>(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(lt,{...d,ref:t,__scopeSwitch:n}),e&&(0,q.jsx)(mt,{__scopeSwitch:n})]})})},`Switch`)),dt=`SwitchThumb`,ft=K.forwardRef(J(function(e,t){let{__scopeSwitch:n,...r}=e,i=ot(dt,n);return(0,q.jsx)(c.span,{"data-state":gt(i.checked),"data-disabled":i.disabled?``:void 0,...r,ref:t})},`SwitchThumb`)),pt=`SwitchBubbleInput`,mt=K.forwardRef(J(function({__scopeSwitch:e,onClick:t,...n},r){let{control:i,hasConsumerStoppedPropagationRef:a,userInteractionCount:s,checked:l,defaultChecked:u,required:d,disabled:f,name:p,value:m,form:h,bubbleInput:g,setBubbleInput:_}=ot(pt,e),v=o(r,_),y=be(i),b=K.useRef(!1),x=K.useRef(l),S=K.useRef(s);K.useEffect(()=>{let e=g;if(!e)return;let t=window.HTMLInputElement.prototype,n=Object.getOwnPropertyDescriptor(t,`checked`).set,r=s!==S.current;S.current=s;let i=x.current!==l;x.current=l;let o=!(r&&a.current);if(i&&n){b.current=!r;let t=new Event(`click`,{bubbles:o});n.call(e,l),e.dispatchEvent(t),b.current=!1}},[g,l,a,s]);let C=K.useRef(l);return(0,q.jsx)(c.input,{type:`checkbox`,"aria-hidden":!0,defaultChecked:u??C.current,required:d,disabled:f,name:p,value:m,form:h,...n,tabIndex:-1,ref:v,onClick:M(t,e=>{b.current&&e.stopPropagation()}),style:{...n.style,...y,position:`absolute`,pointerEvents:`none`,opacity:0,margin:0,transform:`translateX(-100%)`}})},`SwitchBubbleInput`));function ht(e){return typeof e==`function`}J(ht,`isFunction`);function gt(e){return e?`checked`:`unchecked`}J(gt,`getState`);function Y({className:e,size:t=`default`,...n}){return(0,q.jsx)(ut,{"data-slot":`switch`,"data-size":t,className:a(`peer group/switch inline-flex shrink-0 items-center rounded-full border border-transparent shadow-xs transition-all outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-[1.15rem] data-[size=default]:w-8 data-[size=sm]:h-3.5 data-[size=sm]:w-6 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input dark:data-[state=unchecked]:bg-input/80`,e),...n,children:(0,q.jsx)(ft,{"data-slot":`switch-thumb`,className:a(`pointer-events-none block rounded-full bg-background ring-0 transition-transform group-data-[size=default]/switch:size-4 group-data-[size=sm]/switch:size-3 data-[state=checked]:translate-x-[calc(100%-2px)] data-[state=unchecked]:translate-x-0 dark:data-[state=checked]:bg-primary-foreground dark:data-[state=unchecked]:bg-foreground`)})})}function _t(){let{data:e,isLoading:t}=h.userSettings.get.useQuery(),n=h.useUtils(),r=h.userSettings.update.useMutation({onSuccess:()=>{n.userSettings.get.invalidate()},onError:e=>{j.error(`Failed to update settings: ${e.message}`)}});return t?(0,q.jsxs)(z,{children:[(0,q.jsxs)(F,{children:[(0,q.jsx)(B,{children:`Notification Settings`}),(0,q.jsx)(I,{children:`Configure notification behavior`})]}),(0,q.jsx)(L,{children:(0,q.jsx)(R,{className:`h-10 w-full`})})]}):(0,q.jsxs)(z,{children:[(0,q.jsxs)(F,{children:[(0,q.jsx)(B,{children:`Notification Settings`}),(0,q.jsx)(I,{children:`Configure notification behavior`})]}),(0,q.jsx)(L,{className:`space-y-4`,children:(0,q.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between`,children:[(0,q.jsxs)(`div`,{className:`space-y-0.5`,children:[(0,q.jsx)(P,{htmlFor:`sound-toggle`,children:`Play completion sound`}),(0,q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Play a sound when a workspace finishes`})]}),(0,q.jsx)(Y,{id:`sound-toggle`,checked:e?.playSoundOnComplete??!0,onCheckedChange:e=>{r.mutate({playSoundOnComplete:e})},disabled:r.isPending})]})})]})}var vt=5;function yt(e,t=Date.now()){let n=e.getTime()-t,r=Math.round(n/1e3);if(Math.abs(r)<=vt)return`now`;let i=bt(Math.abs(r));return r<0?`${i} overdue`:`in ${i}`}function bt(e){if(e<60)return`${e}s`;let t=Math.round(e/60);if(t<60)return`${t}m`;let n=Math.round(t/60);return n<24?`${n}h`:`${Math.round(n/24)}d`}function xt(e,t=localStorage){return Te(t)||e[0]?.slug||``}function St({projects:e}){let[t,n]=(0,K.useState)(()=>xt(e)),r=e.find(e=>e.slug===t)??e[0];return(0,K.useEffect)(()=>{r&&r.slug!==t&&(n(r.slug),we(r.slug))},[r,t]),r?(0,q.jsxs)(`div`,{className:`space-y-6`,children:[(0,q.jsx)(`div`,{className:`flex items-center gap-3`,children:(0,q.jsxs)(D,{value:r.slug,onValueChange:e=>{n(e),we(e)},children:[(0,q.jsx)(T,{className:`w-auto max-w-xs`,children:(0,q.jsx)(E,{placeholder:`Select a project`})}),(0,q.jsx)(w,{children:e.map(e=>(0,q.jsx)(S,{value:e.slug,children:e.name},e.id))})]})}),(0,q.jsx)(Ct,{projectId:r.id})]}):(0,q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`No projects found.`})}function Ct({projectId:e}){let t=h.useUtils(),{data:n,isLoading:r}=h.periodicTask.list.useQuery({projectId:e},{refetchInterval:1e4}),i=h.periodicTask.delete.useMutation({onSuccess:()=>{j.success(`Periodic task deleted`),t.periodicTask.list.invalidate({projectId:e})},onError:e=>j.error(`Delete failed: ${e.message}`)}),a=h.periodicTask.toggleEnabled.useMutation({onSuccess:()=>{t.periodicTask.list.invalidate({projectId:e})},onError:e=>j.error(`Toggle failed: ${e.message}`)}),o=h.periodicTask.update.useMutation({onSuccess:()=>{j.success(`Periodic task updated`),t.periodicTask.list.invalidate({projectId:e})},onError:e=>j.error(`Update failed: ${e.message}`)});return r?(0,q.jsxs)(z,{children:[(0,q.jsx)(F,{children:(0,q.jsxs)(B,{className:`flex items-center gap-2`,children:[(0,q.jsx)(b,{className:`w-5 h-5`}),`Periodic Tasks`]})}),(0,q.jsx)(L,{children:(0,q.jsx)(R,{className:`h-20 w-full`})})]}):(0,q.jsxs)(z,{children:[(0,q.jsxs)(F,{children:[(0,q.jsxs)(B,{className:`flex items-center gap-2`,children:[(0,q.jsx)(b,{className:`w-5 h-5`}),`Periodic Tasks`]}),(0,q.jsx)(I,{children:`Recurring tasks that create workspaces on a schedule`})]}),(0,q.jsx)(L,{children:!n||n.length===0?(0,q.jsx)(`p`,{className:`text-sm text-muted-foreground py-4 text-center`,children:`No periodic tasks yet. Create one from the workspace launch dropdown.`}):(0,q.jsx)(`div`,{className:`space-y-3`,children:n.map(e=>(0,q.jsx)(Ot,{task:e,onToggle:t=>a.mutate({id:e.id,enabled:t}),onDelete:()=>i.mutate({id:e.id}),onUpdate:t=>o.mutate({id:e.id,...t}),isUpdating:o.isPending||a.isPending},e.id))})})]})}function wt({status:e}){return(0,q.jsx)(N,{variant:{PR_CREATED:`default`,RUNNING:`secondary`}[e]??`destructive`,className:`text-[10px]`,children:{PR_CREATED:`PR Created`,RUNNING:`Running`,FAILED:`Failed`,SKIPPED:`Skipped`}[e]??e})}var Tt=new Set([`DAILY`,`WEEKLY`,`MONTHLY`]);function Et(e,t,n){return e!==t||!n?Intl.DateTimeFormat().resolvedOptions().timeZone:n}function Dt(e,t){let n=e.split(`:`).map(Number),r=n[0]??0,i=n[1]??0,a=new Date(Date.UTC(2e3,0,1,r,i,0,0)),o=a.toLocaleTimeString([],{hour:`numeric`,minute:`2-digit`,timeZone:`UTC`}),s=new Intl.DateTimeFormat(`en-US`,{timeZone:t,timeZoneName:`short`}).formatToParts(a).find(e=>e.type===`timeZoneName`)?.value;return s?`${o} (${s})`:o}function Ot({task:e,onToggle:t,onDelete:n,onUpdate:r,isUpdating:a}){let[o,c]=(0,K.useState)(!1),[l,u]=(0,K.useState)(e.name),[d,p]=(0,K.useState)(e.prompt),[m,h]=(0,K.useState)(e.cadence),[g,_]=(0,K.useState)(e.scheduledTime??``),[v,y]=(0,K.useState)(!1),b=()=>{let t=Tt.has(m)&&!!g,n=t?g:null,i=t?Et(g,e.scheduledTime,e.timezone):null;r({name:l===e.name?void 0:l,prompt:d===e.prompt?void 0:d,cadence:m===e.cadence?void 0:m,scheduledTime:n===e.scheduledTime?void 0:n,timezone:i===e.timezone?void 0:i}),c(!1)},x={EVERY_MINUTE:`Every minute`,EVERY_FIVE_MINUTES:`Every 5 minutes`,DAILY:`Daily`,WEEKLY:`Weekly`,MONTHLY:`Monthly`}[e.cadence]??e.cadence,C=e.executions[0];return(0,q.jsxs)(`div`,{className:`rounded-md border p-3 space-y-2`,children:[(0,q.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,q.jsxs)(`div`,{className:`flex items-center gap-2 min-w-0`,children:[(0,q.jsx)(Y,{checked:e.isEnabled,onCheckedChange:t,disabled:a,className:`shrink-0`}),(0,q.jsx)(`span`,{className:`font-medium text-sm truncate`,children:e.name}),(0,q.jsx)(N,{variant:`secondary`,className:`shrink-0 text-[10px]`,children:x})]}),(0,q.jsxs)(`div`,{className:`flex items-center gap-1 shrink-0`,children:[(0,q.jsx)(i,{variant:`ghost`,size:`icon`,className:`h-7 w-7`,onClick:()=>{u(e.name),p(e.prompt),h(e.cadence),_(e.scheduledTime??``),c(!o)},children:(0,q.jsx)(f,{className:`h-3.5 w-3.5`})}),(0,q.jsx)(i,{variant:`ghost`,size:`icon`,className:`h-7 w-7 text-destructive hover:text-destructive`,onClick:n,children:(0,q.jsx)(He,{className:`h-3.5 w-3.5`})})]})]}),(0,q.jsx)(`p`,{className:`text-xs text-muted-foreground line-clamp-2`,children:e.prompt}),(0,q.jsxs)(`div`,{className:`flex items-center gap-3 text-[10px] text-muted-foreground`,children:[e.lastRunAt&&(0,q.jsxs)(`span`,{children:[`Last run: `,new Date(e.lastRunAt).toLocaleString()]}),(0,q.jsxs)(`span`,{title:new Date(e.nextRunAt).toLocaleString(),children:[`Next run: `,yt(new Date(e.nextRunAt))]}),Tt.has(e.cadence)&&e.scheduledTime&&e.timezone&&(0,q.jsxs)(`span`,{children:[`at `,Dt(e.scheduledTime,e.timezone)]}),C&&(0,q.jsx)(wt,{status:C.status})]}),o&&(0,q.jsxs)(`div`,{className:`space-y-2 pt-2 border-t`,children:[(0,q.jsxs)(`div`,{className:`space-y-1`,children:[(0,q.jsx)(P,{className:`text-xs`,children:`Name`}),(0,q.jsx)(s,{className:`h-7 text-xs`,value:l,onChange:e=>u(e.target.value)})]}),(0,q.jsxs)(`div`,{className:`space-y-1`,children:[(0,q.jsx)(P,{className:`text-xs`,children:`Prompt`}),(0,q.jsx)(fe,{className:`text-xs min-h-[60px]`,value:d,onChange:e=>p(e.target.value)})]}),(0,q.jsxs)(`div`,{className:`space-y-1`,children:[(0,q.jsx)(P,{className:`text-xs`,children:`Cadence`}),(0,q.jsxs)(D,{value:m,onValueChange:h,children:[(0,q.jsx)(T,{className:`h-7 text-xs`,children:(0,q.jsx)(E,{})}),(0,q.jsxs)(w,{children:[(0,q.jsx)(S,{value:`EVERY_MINUTE`,children:`Every minute (testing)`}),(0,q.jsx)(S,{value:`EVERY_FIVE_MINUTES`,children:`Every 5 minutes (testing)`}),(0,q.jsx)(S,{value:`DAILY`,children:`Daily`}),(0,q.jsx)(S,{value:`WEEKLY`,children:`Weekly`}),(0,q.jsx)(S,{value:`MONTHLY`,children:`Monthly`})]})]})]}),Tt.has(m)&&(0,q.jsxs)(`div`,{className:`space-y-1`,children:[(0,q.jsx)(P,{className:`text-xs`,children:`Run time (optional)`}),(0,q.jsx)(s,{type:`time`,className:`h-7 text-xs`,value:g,onChange:e=>_(e.target.value)})]}),(0,q.jsxs)(`div`,{className:`flex justify-end gap-2`,children:[(0,q.jsx)(i,{variant:`ghost`,size:`sm`,className:`h-7 text-xs`,onClick:()=>c(!1),children:`Cancel`}),(0,q.jsx)(i,{size:`sm`,className:`h-7 text-xs`,onClick:b,disabled:a,children:`Save`})]})]}),e.executions.length>0&&(0,q.jsxs)(`div`,{children:[(0,q.jsxs)(`button`,{type:`button`,className:`text-[10px] text-muted-foreground hover:text-foreground underline`,onClick:()=>y(!v),children:[v?`Hide`:`Show`,` execution history (`,e.executions.length,`)`]}),v&&(0,q.jsx)(`div`,{className:`mt-2 space-y-1`,children:e.executions.map(e=>(0,q.jsxs)(`div`,{className:`flex items-center gap-2 text-[10px] text-muted-foreground`,children:[(0,q.jsx)(wt,{status:e.status}),(0,q.jsx)(`span`,{children:new Date(e.startedAt).toLocaleString()}),e.prUrl&&(0,q.jsx)(`a`,{href:e.prUrl,target:`_blank`,rel:`noopener noreferrer`,className:`text-primary hover:underline`,children:`PR`})]},e.id))})]})]})}function kt(e){switch(e.toUpperCase()){case`RUNNING`:return`default`;case`IDLE`:case`COMPLETED`:return`secondary`;case`FAILED`:return`destructive`;default:return`outline`}}function At(e){let{process:t}=e;return(0,q.jsx)(G,{children:(0,q.jsxs)(`div`,{className:`flex flex-col`,children:[t.projectSlug?(0,q.jsx)(l,{to:`/projects/${t.projectSlug}/workspaces/${t.workspaceId}`,className:`font-medium hover:underline`,children:t.workspaceName}):(0,q.jsx)(`span`,{className:`font-medium`,children:t.workspaceName}),t.workspaceBranch&&(0,q.jsx)(`span`,{className:`text-xs text-muted-foreground font-mono`,children:t.workspaceBranch})]})})}function jt({process:e,isStopping:t,onStop:n}){return(0,q.jsxs)(`div`,{className:`rounded-md border bg-background p-3`,children:[(0,q.jsxs)(`div`,{className:`flex items-start justify-between gap-2`,children:[(0,q.jsxs)(`div`,{className:`min-w-0`,children:[(0,q.jsx)(`div`,{className:`font-medium truncate`,children:e.workspaceName}),e.workspaceBranch&&(0,q.jsx)(`div`,{className:`text-xs text-muted-foreground font-mono truncate`,children:e.workspaceBranch}),(0,q.jsx)(`div`,{className:`mt-1 text-xs text-muted-foreground font-mono`,children:e.name||e.sessionId.slice(0,8)})]}),(0,q.jsx)(i,{variant:`ghost`,size:`sm`,onClick:()=>n(e.sessionId),disabled:t||e.status===`COMPLETED`||e.status===`FAILED`,title:`Stop session`,children:(0,q.jsx)(g,{className:`w-4 h-4`})})]}),(0,q.jsxs)(`div`,{className:`mt-2 flex flex-wrap items-center gap-2 text-xs`,children:[(0,q.jsx)(N,{variant:`outline`,children:e.workflow}),(0,q.jsx)(N,{variant:kt(e.status),children:e.status})]}),(0,q.jsxs)(`div`,{className:`mt-2 grid grid-cols-2 gap-2 text-xs font-mono text-muted-foreground`,children:[(0,q.jsxs)(`span`,{children:[`CPU: `,Ie(e.cpuPercent)]}),(0,q.jsxs)(`span`,{children:[`Mem: `,Le(e.memoryBytes)]}),(0,q.jsxs)(`span`,{children:[`Idle: `,Fe(e.idleTimeMs)]}),(0,q.jsxs)(`span`,{children:[`PID: `,e.pid??`-`]})]})]})}function Mt({process:e}){return(0,q.jsxs)(`div`,{className:`rounded-md border bg-background p-3`,children:[(0,q.jsx)(`div`,{className:`font-medium truncate`,children:e.workspaceName}),e.workspaceBranch&&(0,q.jsx)(`div`,{className:`text-xs text-muted-foreground font-mono truncate`,children:e.workspaceBranch}),(0,q.jsxs)(`div`,{className:`mt-2 flex flex-wrap items-center gap-2 text-xs text-muted-foreground font-mono`,children:[(0,q.jsxs)(`span`,{children:[`Terminal: `,e.terminalId.slice(0,12)]}),(0,q.jsxs)(`span`,{children:[`PID: `,e.pid]}),(0,q.jsxs)(`span`,{children:[`Size: `,e.cols,`x`,e.rows]})]}),(0,q.jsxs)(`div`,{className:`mt-2 flex flex-wrap items-center gap-2 text-xs font-mono text-muted-foreground`,children:[(0,q.jsxs)(`span`,{children:[`CPU: `,Ie(e.cpuPercent)]}),(0,q.jsxs)(`span`,{children:[`Mem: `,Le(e.memoryBytes)]}),(0,q.jsxs)(`span`,{children:[`Created: `,new Date(e.createdAt).toLocaleTimeString()]})]})]})}function Nt(){return(0,q.jsxs)(z,{children:[(0,q.jsxs)(F,{children:[(0,q.jsxs)(B,{className:`flex items-center gap-2`,children:[`Active Processes`,(0,q.jsx)(R,{className:`h-5 w-16 ml-2`})]}),(0,q.jsx)(I,{children:`Agent and Terminal processes currently running`})]}),(0,q.jsx)(L,{className:`space-y-6`,children:(0,q.jsxs)(`div`,{className:`space-y-3`,children:[(0,q.jsx)(R,{className:`h-5 w-48`}),(0,q.jsxs)(`div`,{className:`border rounded-md p-4 space-y-3`,children:[(0,q.jsx)(R,{className:`h-8 w-full`}),(0,q.jsx)(R,{className:`h-12 w-full`}),(0,q.jsx)(R,{className:`h-12 w-full`})]})]})})]})}function Pt({processes:e}){let t=ee(),n=e?.agent&&e.agent.length>0,r=e?.terminal&&e.terminal.length>0,a=!(n||r),[o,s]=(0,K.useState)(new Set),{data:c}=h.session.getMaxSessionsPerWorkspace.useQuery(),l=h.useUtils(),u=h.admin.stopSession.useMutation(),f=(0,K.useCallback)(async e=>{s(t=>new Set(t).add(e));try{(await u.mutateAsync({sessionId:e})).wasRunning?j.success(`Session stopped`):j.info(`Session was already stopped`),l.admin.getActiveProcesses.invalidate()}catch(e){j.error(`Failed to stop session: ${e instanceof Error?e.message:String(e)}`)}finally{s(t=>{let n=new Set(t);return n.delete(e),n})}},[u,l]),p=e?.agent&&e.agent.length>0?Math.max(...Object.values(e.agent.reduce((e,t)=>(e[t.workspaceId]=(e[t.workspaceId]||0)+1,e),{}))):0;return(0,q.jsxs)(z,{children:[(0,q.jsxs)(F,{children:[(0,q.jsxs)(B,{className:`flex flex-wrap items-center gap-2`,children:[`Active Processes`,e?.summary&&(0,q.jsxs)(q.Fragment,{children:[(0,q.jsxs)(N,{variant:`secondary`,className:`ml-2`,children:[e.summary.totalAgent,` Agent sessions`]}),c!==void 0&&p>0&&(0,q.jsxs)(N,{variant:p>=c*.8?`destructive`:`outline`,title:`Highest session count across all workspaces. Limit is ${c} per workspace.`,children:[`Max per workspace: `,p,`/`,c]})]})]}),(0,q.jsx)(I,{children:`Agent and Terminal processes currently running`})]}),(0,q.jsxs)(L,{className:`space-y-6`,children:[a&&(0,q.jsx)(`p`,{className:`text-muted-foreground text-sm`,children:`No active processes`}),n&&(0,q.jsxs)(`div`,{children:[(0,q.jsxs)(`h4`,{className:`text-sm font-medium mb-2 flex items-center gap-2`,children:[(0,q.jsx)(d,{className:`w-4 h-4`}),`Agent Sessions (`,e.agent.length,`)`]}),t?(0,q.jsx)(`div`,{className:`space-y-2`,children:e.agent.map(e=>(0,q.jsx)(jt,{process:e,isStopping:o.has(e.sessionId),onStop:f},e.sessionId))}):(0,q.jsx)(`div`,{className:`border rounded-md`,children:(0,q.jsxs)(Pe,{children:[(0,q.jsx)(Me,{children:(0,q.jsxs)(W,{children:[(0,q.jsx)(U,{children:`Workspace`}),(0,q.jsx)(U,{children:`Session`}),(0,q.jsx)(U,{children:`Workflow`}),(0,q.jsx)(U,{children:`PID`}),(0,q.jsx)(U,{children:`Resources`}),(0,q.jsx)(U,{children:`Status`}),(0,q.jsx)(U,{children:`Actions`})]})}),(0,q.jsx)(Ne,{children:e.agent.map(e=>(0,q.jsxs)(W,{children:[(0,q.jsx)(At,{process:e}),(0,q.jsx)(G,{children:(0,q.jsxs)(`div`,{className:`flex flex-col`,children:[(0,q.jsx)(`span`,{className:`text-xs font-mono text-muted-foreground`,children:e.name||e.sessionId.slice(0,8)}),(0,q.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:e.model})]})}),(0,q.jsx)(G,{children:(0,q.jsx)(N,{variant:`outline`,children:e.workflow})}),(0,q.jsx)(G,{className:`font-mono text-xs`,children:e.pid??`-`}),(0,q.jsx)(G,{children:(0,q.jsxs)(`div`,{className:`flex flex-col text-xs font-mono`,children:[(0,q.jsxs)(`span`,{children:[`CPU: `,Ie(e.cpuPercent)]}),(0,q.jsxs)(`span`,{children:[`Mem: `,Le(e.memoryBytes)]}),(0,q.jsxs)(`span`,{className:`text-muted-foreground`,children:[`Idle: `,Fe(e.idleTimeMs)]})]})}),(0,q.jsx)(G,{children:(0,q.jsxs)(`div`,{className:`flex flex-col gap-1`,children:[(0,q.jsx)(N,{variant:kt(e.status),children:e.status}),e.memoryStatus&&e.memoryStatus!==e.status.toLowerCase()&&(0,q.jsxs)(`span`,{className:`text-xs text-muted-foreground`,children:[`(`,e.memoryStatus,`)`]})]})}),(0,q.jsx)(G,{children:(0,q.jsx)(i,{variant:`ghost`,size:`sm`,onClick:()=>f(e.sessionId),disabled:o.has(e.sessionId)||e.status===`COMPLETED`||e.status===`FAILED`,title:`Stop session`,children:(0,q.jsx)(g,{className:`w-4 h-4`})})})]},e.sessionId))})]})})]}),r&&(0,q.jsxs)(`div`,{children:[(0,q.jsxs)(`h4`,{className:`text-sm font-medium mb-2 flex items-center gap-2`,children:[(0,q.jsx)(he,{className:`w-4 h-4`}),`Terminal Processes (`,e.terminal.length,`)`]}),t?(0,q.jsx)(`div`,{className:`space-y-2`,children:e.terminal.map(e=>(0,q.jsx)(Mt,{process:e},e.terminalId))}):(0,q.jsx)(`div`,{className:`border rounded-md`,children:(0,q.jsxs)(Pe,{children:[(0,q.jsx)(Me,{children:(0,q.jsxs)(W,{children:[(0,q.jsx)(U,{children:`Workspace`}),(0,q.jsx)(U,{children:`Terminal ID`}),(0,q.jsx)(U,{children:`PID`}),(0,q.jsx)(U,{children:`Resources`}),(0,q.jsx)(U,{children:`Size`}),(0,q.jsx)(U,{children:`Created`})]})}),(0,q.jsx)(Ne,{children:e.terminal.map(e=>(0,q.jsxs)(W,{children:[(0,q.jsx)(At,{process:e}),(0,q.jsx)(G,{children:(0,q.jsx)(`span`,{className:`text-xs font-mono text-muted-foreground`,children:e.terminalId.slice(0,12)})}),(0,q.jsx)(G,{className:`font-mono text-xs`,children:e.pid}),(0,q.jsx)(G,{children:(0,q.jsxs)(`div`,{className:`flex flex-col text-xs font-mono`,children:[(0,q.jsxs)(`span`,{children:[`CPU: `,Ie(e.cpuPercent)]}),(0,q.jsxs)(`span`,{children:[`Mem: `,Le(e.memoryBytes)]})]})}),(0,q.jsxs)(G,{className:`font-mono text-xs`,children:[e.cols,`x`,e.rows]}),(0,q.jsx)(G,{className:`text-xs text-muted-foreground`,children:new Date(e.createdAt).toLocaleTimeString()})]},e.terminalId))})]})})]})]})]})}function Ft({projectId:e,projectName:t}){let[n,r]=(0,K.useState)(!1),a=h.useUtils(),{data:o,isPending:s,isSuccess:c,isError:l,error:d,refetch:p}=h.workspace.getFactoryConfig.useQuery({projectId:e});(0,K.useEffect)(()=>{c||r(!1)},[c]);let m=h.project.saveFactoryConfig.useMutation({onSuccess:()=>{a.workspace.getFactoryConfig.invalidate({projectId:e}),r(!1)},onError:e=>{j.error(`Failed to save configuration: ${e.message}`)}}),g=h.workspace.refreshFactoryConfigs.useMutation({onSuccess:e=>{e.errors.length>0?j.warning(`Refreshed ${e.updatedCount} workspace(s), but ${e.errors.length} failed`):j.success(`Refreshed factory-factory.json for ${e.updatedCount} workspace(s)`)},onError:e=>{j.error(`Failed to refresh configurations: ${e.message}`)}});return(0,q.jsxs)(`div`,{className:`rounded-lg border bg-card`,children:[c&&(0,q.jsx)(u,{open:n,onOpenChange:r,currentConfig:o?o.scripts:void 0,onSave:t=>{c&&m.mutate({projectId:e,config:t})},isPending:m.isPending,error:m.error}),(0,q.jsx)(`div`,{className:`border-b bg-muted/50 px-4 py-3`,children:(0,q.jsxs)(`div`,{className:`flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between`,children:[(0,q.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-2`,children:[(0,q.jsx)(`h3`,{className:`min-w-0 truncate font-semibold text-sm`,children:t}),c&&(o?(0,q.jsxs)(N,{variant:`default`,className:`bg-green-600 hover:bg-green-700`,children:[(0,q.jsx)(k,{className:`w-3 h-3 mr-1`}),`Configured`]}):(0,q.jsxs)(N,{variant:`secondary`,className:`bg-muted`,children:[(0,q.jsx)(de,{className:`w-3 h-3 mr-1`}),`Not configured`]})),(0,q.jsx)(i,{variant:`ghost`,size:`icon`,className:`h-7 w-7`,"aria-label":`Edit factory configuration`,disabled:!c,onClick:()=>r(!0),children:(0,q.jsx)(f,{className:`w-3.5 h-3.5`})})]}),(0,q.jsxs)(i,{variant:`outline`,size:`sm`,onClick:()=>{g.mutate({projectId:e})},disabled:g.isPending,className:`w-full gap-2 sm:w-auto`,children:[(0,q.jsx)(y,{className:`w-4 h-4 ${g.isPending?`animate-spin`:``}`}),`Refresh Workspaces`]})]})}),(0,q.jsxs)(`div`,{className:`p-4`,children:[s&&(0,q.jsx)(`p`,{role:`status`,className:`text-sm text-muted-foreground`,children:`Loading configuration...`}),l&&(0,q.jsxs)(`div`,{role:`alert`,className:`space-y-3`,children:[(0,q.jsxs)(`p`,{className:`text-sm text-destructive`,children:[`Failed to load configuration: `,d.message]}),(0,q.jsx)(i,{variant:`outline`,size:`sm`,onClick:()=>void p(),children:`Retry`})]}),c&&(o?(0,q.jsx)(`div`,{className:`space-y-4`,children:(0,q.jsx)(Re,{factoryConfig:o,variant:`card`})}):(0,q.jsx)(`div`,{className:`space-y-3`,children:(0,q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`No factory-factory.json found in this repository. Click the edit button above to configure workspace setup and run scripts.`})}))]})]})}function It({projects:e}){let[t,n]=(0,K.useState)(()=>Te()||e[0]?.slug||``),r=e.find(e=>e.slug===t)??e[0];return r?(0,q.jsxs)(`div`,{className:`space-y-6`,children:[(0,q.jsx)(`div`,{className:`flex items-center gap-3`,children:(0,q.jsxs)(D,{value:r.slug,onValueChange:e=>{n(e),we(e)},children:[(0,q.jsx)(T,{className:`w-auto max-w-xs`,children:(0,q.jsx)(E,{placeholder:`Select a project`})}),(0,q.jsx)(w,{children:e.map(e=>(0,q.jsx)(S,{value:e.slug,children:e.name},e.id))})]})}),(0,q.jsxs)(z,{children:[(0,q.jsxs)(F,{children:[(0,q.jsxs)(B,{className:`flex items-center gap-2`,children:[(0,q.jsx)(de,{className:`w-5 h-5`}),`Factory Configuration`]}),(0,q.jsx)(I,{children:`Configuration for workspace setup and run scripts (factory-factory.json)`})]}),(0,q.jsxs)(L,{className:`space-y-4`,children:[(0,q.jsx)(Ft,{projectId:r.id,projectName:r.name},r.id),(0,q.jsxs)(`div`,{className:`text-xs text-muted-foreground space-y-1 border-t pt-4`,children:[(0,q.jsxs)(`p`,{children:[(0,q.jsx)(`strong`,{children:`Port Allocation:`}),` Use`,` `,(0,q.jsx)(`code`,{className:`bg-muted px-1 rounded`,children:`{port}`}),` in run script for automatic port allocation`]}),(0,q.jsxs)(`p`,{children:[(0,q.jsx)(`strong`,{children:`Location:`}),` factory-factory.json in repository root`]})]})]})]}),(0,q.jsxs)(z,{children:[(0,q.jsxs)(F,{children:[(0,q.jsxs)(B,{className:`flex items-center gap-2`,children:[(0,q.jsx)(Ve,{className:`w-5 h-5`}),`Issue Tracking`]}),(0,q.jsx)(I,{children:`Configure the issue provider (GitHub Issues or Linear)`})]}),(0,q.jsx)(L,{children:(0,q.jsx)(et,{projectId:r.id,projectName:r.name,currentProvider:r.issueProvider,issueTrackerConfig:r.issueTrackerConfig},r.id)})]})]}):(0,q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`No projects found.`})}function Lt(){let{data:e,isLoading:t}=h.userSettings.get.useQuery(),n=h.useUtils(),r=h.userSettings.update.useMutation({onSuccess:()=>{j.success(`Ratchet settings updated`),n.userSettings.get.invalidate()},onError:e=>{j.error(`Failed to update settings: ${e.message}`)}}),a=h.admin.triggerRatchetCheck.useMutation({onSuccess:e=>{j.success(`Ratchet check completed: ${e.checked} checked, ${e.stateChanges} state changes, ${e.actionsTriggered} actions triggered`)},onError:e=>{j.error(`Failed to trigger ratchet check: ${e.message}`)}});if(t)return(0,q.jsxs)(z,{children:[(0,q.jsxs)(F,{children:[(0,q.jsxs)(B,{className:`flex items-center gap-2`,children:[(0,q.jsx)(p,{enabled:!0,className:`w-5 h-5`,iconClassName:`w-3.5 h-3.5`}),`Ratchet Pull Requests`]}),(0,q.jsx)(I,{children:`Automatically dispatch agents to fix CI failures and address code review comments`})]}),(0,q.jsx)(L,{children:(0,q.jsx)(R,{className:`h-10 w-full`})})]});let o=e?.ratchetPermissions??`YOLO`,s=e?.ratchetReviewTriggerMode??`CHANGES_REQUESTED`;return(0,q.jsxs)(z,{children:[(0,q.jsxs)(F,{children:[(0,q.jsxs)(B,{className:`flex items-center gap-2`,children:[(0,q.jsx)(p,{enabled:!0,className:`w-5 h-5`,iconClassName:`w-3.5 h-3.5`}),`Ratchet Pull Requests`]}),(0,q.jsx)(I,{children:`Automatically dispatch agents to fix CI failures and address code review comments`})]}),(0,q.jsxs)(L,{className:`space-y-4`,children:[(0,q.jsxs)(`div`,{className:`rounded-md border bg-muted/40 p-3 space-y-1.5`,children:[(0,q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`When a workspace has an open pull request, Factory Factory can automatically:`}),(0,q.jsxs)(`ul`,{className:`text-sm text-muted-foreground list-disc list-inside space-y-0.5 ml-2`,children:[(0,q.jsx)(`li`,{children:`Fix failing CI checks`}),(0,q.jsx)(`li`,{children:`Address code review comments`})]})]}),(0,q.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between`,children:[(0,q.jsxs)(`div`,{className:`space-y-0.5`,children:[(0,q.jsx)(P,{htmlFor:`ratchet-enabled`,children:`Default for new workspaces`}),(0,q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Enable Ratchet for workspaces created from GitHub issues`})]}),(0,q.jsx)(Y,{id:`ratchet-enabled`,checked:e?.ratchetEnabled??!1,onCheckedChange:e=>{r.mutate({ratchetEnabled:e})},disabled:r.isPending})]}),(0,q.jsxs)(`div`,{className:`space-y-2`,children:[(0,q.jsx)(P,{htmlFor:`ratchet-review-trigger`,children:`Review feedback trigger`}),(0,q.jsxs)(D,{value:s,onValueChange:e=>{(e===`CHANGES_REQUESTED`||e===`ALL_REVIEW_FEEDBACK`)&&r.mutate({ratchetReviewTriggerMode:e})},disabled:r.isPending,children:[(0,q.jsx)(T,{id:`ratchet-review-trigger`,children:(0,q.jsx)(E,{})}),(0,q.jsxs)(w,{children:[(0,q.jsx)(S,{value:`CHANGES_REQUESTED`,children:`Changes requested and unresolved threads`}),(0,q.jsx)(S,{value:`ALL_REVIEW_FEEDBACK`,children:`All review feedback`})]})]}),(0,q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`All review feedback also lets top-level commented review summaries start sessions. Ordinary PR conversation comments never trigger Ratchet.`})]}),(0,q.jsxs)(`div`,{className:`space-y-2`,children:[(0,q.jsx)(P,{htmlFor:`ratchet-permissions`,children:`Ratchet permission defaults`}),(0,q.jsxs)(D,{value:o,onValueChange:e=>{(e===`STRICT`||e===`RELAXED`||e===`YOLO`)&&r.mutate({ratchetPermissions:e})},disabled:r.isPending,children:[(0,q.jsx)(T,{id:`ratchet-permissions`,children:(0,q.jsx)(E,{})}),(0,q.jsxs)(w,{children:[(0,q.jsx)(S,{value:`STRICT`,children:`Strict`}),(0,q.jsx)(S,{value:`RELAXED`,children:`Relaxed`}),(0,q.jsx)(S,{value:`YOLO`,children:`YOLO`})]})]}),(0,q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Controls the default execution mode used when Ratchet starts a fixer session.`})]}),(0,q.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between`,children:[(0,q.jsxs)(`div`,{className:`space-y-0.5`,children:[(0,q.jsx)(P,{htmlFor:`ratchet-reply-to-pr-comments`,children:`Reply to PR comments`}),(0,q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`When enabled, Ratchet replies on review threads and posts a re-review PR comment`})]}),(0,q.jsx)(Y,{id:`ratchet-reply-to-pr-comments`,checked:e?.ratchetReplyToPrComments??!0,onCheckedChange:e=>{r.mutate({ratchetReplyToPrComments:e})},disabled:r.isPending})]}),(0,q.jsx)(`div`,{className:`border-t pt-4`,children:(0,q.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between`,children:[(0,q.jsxs)(`div`,{className:`space-y-0.5`,children:[(0,q.jsx)(P,{children:`Manual Check`}),(0,q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Check all workspaces with PRs and dispatch agents if needed`})]}),(0,q.jsx)(i,{variant:`outline`,size:`sm`,onClick:()=>a.mutate(),disabled:a.isPending,children:a.isPending?(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(y,{className:`w-4 h-4 mr-2 animate-spin`}),`Checking...`]}):(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(y,{className:`w-4 h-4 mr-2`}),`Check All PRs Now`]})})]})})]})]})}function Rt(){let{download:e,isDownloading:t}=ue();return(0,q.jsxs)(z,{children:[(0,q.jsxs)(F,{children:[(0,q.jsxs)(B,{className:`flex items-center gap-2`,children:[(0,q.jsx)(_,{className:`w-5 h-5`}),`Server Logs`]}),(0,q.jsx)(I,{children:`View and search structured server log entries`})]}),(0,q.jsxs)(L,{className:`flex flex-col gap-2 sm:flex-row sm:gap-3`,children:[(0,q.jsx)(i,{variant:`outline`,className:`w-full sm:w-auto`,asChild:!0,children:(0,q.jsx)(l,{to:`/logs`,children:`View Logs`})}),(0,q.jsxs)(i,{variant:`outline`,onClick:e,disabled:t,className:`w-full sm:w-auto`,children:[(0,q.jsx)(le,{className:`w-4 h-4 mr-2`}),t?`Downloading...`:`Download Log File`]})]})]})}var zt=Object.defineProperty,X=(e,t)=>zt(e,`name`,{value:t,configurable:!0}),Bt=[`PageUp`,`PageDown`],Vt=[`ArrowUp`,`ArrowDown`,`ArrowLeft`,`ArrowRight`],Ht={"from-left":[`Home`,`PageDown`,`ArrowDown`,`ArrowLeft`],"from-right":[`Home`,`PageDown`,`ArrowDown`,`ArrowRight`],"from-bottom":[`Home`,`PageDown`,`ArrowDown`,`ArrowLeft`],"from-top":[`Home`,`PageDown`,`ArrowUp`,`ArrowLeft`]},Z=`Slider`,[Ut,Wt,Gt]=ve(Z),[Kt,qt]=ge(Z,[Gt]),[Jt,Q]=Kt(Z),Yt=K.forwardRef(X(function(e,t){let{name:n,min:r=0,max:i=100,step:a=1,orientation:s=`horizontal`,disabled:c=!1,minStepsBetweenThumbs:l=0,defaultValue:u=[r],value:d,onValueChange:f=X(()=>{},`onValueChange`),onValueCommit:p=X(()=>{},`onValueCommit`),inverted:m=!1,form:h,...g}=e,_=K.useRef(new Set),v=K.useRef(0),y=K.useRef(!1),b=s===`horizontal`?Qt:$t,[x,S]=K.useState(null),w=o(t,S),[T=[],E]=_e({prop:d,defaultProp:u,onChange:X(e=>{[..._.current][v.current]?.focus({preventScroll:!0,focusVisible:y.current}),y.current=!1,f(e)},`onChange`)}),D=K.useRef(T),O=K.useRef(T);K.useEffect(()=>{let e=h?x?.ownerDocument.getElementById(h):x?.closest(`form`);if(e instanceof HTMLFormElement){let t=X(()=>E(O.current),`reset`);return e.addEventListener(`reset`,t),()=>e.removeEventListener(`reset`,t)}},[x,h,E]);function k(e){A(e,vn(T,e))}X(k,`handleSlideStart`);function ee(e){A(e,v.current)}X(ee,`handleSlideMove`);function te(){String(T)!==String(D.current)&&p(T)}X(te,`handleSlideEnd`);function A(e,t,{commit:n}={commit:!1}){let o=Cn(a),s=$(Math.round((e-r)/a)*a+r,o),c=C(s,[r,i]);E((e=[])=>{let r=hn(e,c,t);if(xn(r,l*a)){v.current=r.indexOf(c);let t=String(r)!==String(e);return t&&n&&p(r),t?r:e}return e})}return X(A,`updateValues`),(0,q.jsx)(Jt,{scope:e.__scopeSlider,name:n,disabled:c,min:r,max:i,valueIndexToChangeRef:v,thumbs:_.current,values:T,orientation:s,form:h,children:(0,q.jsx)(Ut.Provider,{scope:e.__scopeSlider,children:(0,q.jsx)(Ut.Slot,{scope:e.__scopeSlider,children:(0,q.jsx)(b,{"aria-disabled":c,"data-disabled":c?``:void 0,...g,ref:w,onPointerDown:M(g.onPointerDown,()=>{c||(D.current=T,y.current=!1)}),min:r,max:i,inverted:m,onSlideStart:c?void 0:k,onSlideMove:c?void 0:ee,onSlideEnd:c?void 0:te,onHomeKeyDown:()=>{c||(y.current=!0,A(r,0,{commit:!0}))},onEndKeyDown:()=>{c||(y.current=!0,A(i,T.length-1,{commit:!0}))},onStepKeyDown:({event:e,direction:t})=>{if(!c){y.current=!0;let n=Bt.includes(e.key)||e.shiftKey&&Vt.includes(e.key)?10:1,i=v.current,o=T[i];A(wn(o,{min:r,step:a,direction:t,multiplier:n}),i,{commit:!0})}}})})})})},`Slider`)),[Xt,Zt]=Kt(Z,{startEdge:`left`,endEdge:`right`,size:`width`,direction:1}),Qt=K.forwardRef(X(function(e,t){let{min:n,max:r,dir:i,inverted:a,onSlideStart:s,onSlideMove:c,onSlideEnd:l,onStepKeyDown:u,...d}=e,[f,p]=K.useState(null),m=o(t,p),h=K.useRef(void 0),g=ye(i),_=g===`ltr`,v=_&&!a||!_&&a;function y(e){let t=h.current||f.getBoundingClientRect(),i=Sn([0,t.width],v?[n,r]:[r,n]);return h.current=t,i(e-t.left)}return X(y,`getValueFromPointer`),(0,q.jsx)(Xt,{scope:e.__scopeSlider,startEdge:v?`left`:`right`,endEdge:v?`right`:`left`,direction:v?1:-1,size:`width`,children:(0,q.jsx)(en,{dir:g,"data-orientation":`horizontal`,...d,ref:m,style:{...d.style,"--radix-slider-thumb-transform":`translateX(-50%)`},onSlideStart:e=>{let t=y(e.clientX);s?.(t)},onSlideMove:e=>{let t=y(e.clientX);c?.(t)},onSlideEnd:()=>{h.current=void 0,l?.()},onStepKeyDown:e=>{let t=Ht[v?`from-left`:`from-right`].includes(e.key);u?.({event:e,direction:t?-1:1})}})})},`SliderHorizontal`)),$t=K.forwardRef(X(function(e,t){let{min:n,max:r,inverted:i,onSlideStart:a,onSlideMove:s,onSlideEnd:c,onStepKeyDown:l,...u}=e,d=K.useRef(null),f=o(t,d),p=K.useRef(void 0),m=!i;function h(e){let t=p.current||d.current.getBoundingClientRect(),i=Sn([0,t.height],m?[r,n]:[n,r]);return p.current=t,i(e-t.top)}return X(h,`getValueFromPointer`),(0,q.jsx)(Xt,{scope:e.__scopeSlider,startEdge:m?`bottom`:`top`,endEdge:m?`top`:`bottom`,size:`height`,direction:m?1:-1,children:(0,q.jsx)(en,{"data-orientation":`vertical`,...u,ref:f,style:{...u.style,"--radix-slider-thumb-transform":`translateY(50%)`},onSlideStart:e=>{let t=h(e.clientY);a?.(t)},onSlideMove:e=>{let t=h(e.clientY);s?.(t)},onSlideEnd:()=>{p.current=void 0,c?.()},onStepKeyDown:e=>{let t=Ht[m?`from-bottom`:`from-top`].includes(e.key);l?.({event:e,direction:t?-1:1})}})})},`SliderVertical`)),en=K.forwardRef(X(function(e,t){let{__scopeSlider:n,onSlideStart:r,onSlideMove:i,onSlideEnd:a,onHomeKeyDown:o,onEndKeyDown:s,onStepKeyDown:l,...u}=e,d=Q(Z,n);return(0,q.jsx)(c.span,{...u,ref:t,onKeyDown:M(e.onKeyDown,e=>{e.key===`Home`?(o(e),e.preventDefault()):e.key===`End`?(s(e),e.preventDefault()):Bt.concat(Vt).includes(e.key)&&(l(e),e.preventDefault())}),onPointerDown:M(e.onPointerDown,e=>{let t=e.target;t.setPointerCapture(e.pointerId),e.preventDefault(),d.thumbs.has(t)?t.focus({preventScroll:!0,focusVisible:!1}):r(e)}),onPointerMove:M(e.onPointerMove,e=>{e.target.hasPointerCapture(e.pointerId)&&i(e)}),onPointerUp:M(e.onPointerUp,e=>{let t=e.target;t.hasPointerCapture(e.pointerId)&&(t.releasePointerCapture(e.pointerId),a(e))})})},`SliderImpl`)),tn=`SliderTrack`,nn=K.forwardRef(X(function(e,t){let{__scopeSlider:n,...r}=e,i=Q(tn,n);return(0,q.jsx)(c.span,{"data-disabled":i.disabled?``:void 0,"data-orientation":i.orientation,...r,ref:t})},`SliderTrack`)),rn=`SliderRange`,an=K.forwardRef(X(function(e,t){let{__scopeSlider:n,...r}=e,i=Q(rn,n),a=Zt(rn,n),s=K.useRef(null),l=o(t,s),u=i.values.length,d=i.values.map(e=>gn(e,i.min,i.max)),f=u>1?Math.min(...d):0,p=100-Math.max(...d);return(0,q.jsx)(c.span,{"data-orientation":i.orientation,"data-disabled":i.disabled?``:void 0,...r,ref:l,style:{...e.style,[a.startEdge]:f+`%`,[a.endEdge]:p+`%`}})},`SliderRange`)),[on,sn]=Kt(`SliderThumb`),cn=`SliderThumbProvider`;function ln(e){let{__scopeSlider:t,name:n,children:r,internal_do_not_use_render:i}=e,a=Q(cn,t),o=Wt(t),[s,c]=K.useState(null),l=K.useMemo(()=>s?o().findIndex(e=>e.ref.current===s):-1,[o,s]),u=be(s),d=!s||!!a.form||!!s.closest(`form`),f=a.values[l],p=n??(a.name?a.name+(a.values.length>1?`[]`:``):void 0),m=f===void 0?0:gn(f,a.min,a.max);K.useEffect(()=>{if(s)return a.thumbs.add(s),()=>{a.thumbs.delete(s)}},[s,a.thumbs]);let h={value:f,name:p,form:a.form,isFormControl:d,index:l,thumb:s,onThumbChange:c,percent:m,size:u};return(0,q.jsx)(on,{scope:t,...h,children:Tn(i)?i(h):r})}X(ln,`SliderThumbProvider`);var un=`SliderThumbTrigger`,dn=K.forwardRef(X(function(e,t){let{__scopeSlider:n,...r}=e,i=Q(un,n),a=Zt(un,n),{index:s,value:l,percent:u,size:d,onThumbChange:f}=sn(un,n),p=o(t,f),m=_n(s,i.values.length),h=d?.[a.size],g=h?yn(h,u,a.direction):0;return(0,q.jsx)(`span`,{style:{transform:`var(--radix-slider-thumb-transform)`,position:`absolute`,[a.startEdge]:`calc(${u}% + ${g}px)`},children:(0,q.jsx)(Ut.ItemSlot,{scope:n,children:(0,q.jsx)(c.span,{role:`slider`,"aria-label":e[`aria-label`]||m,"aria-valuemin":i.min,"aria-valuenow":l,"aria-valuemax":i.max,"aria-orientation":i.orientation,"data-orientation":i.orientation,"data-disabled":i.disabled?``:void 0,tabIndex:i.disabled?void 0:0,...r,ref:p,style:l===void 0?{display:`none`}:e.style,onFocus:M(e.onFocus,()=>{i.valueIndexToChangeRef.current=s})})})})},`SliderThumbTrigger`)),fn=K.forwardRef(X(function(e,t){let{__scopeSlider:n,name:r,...i}=e;return(0,q.jsx)(ln,{__scopeSlider:n,name:r,internal_do_not_use_render:({index:e,isFormControl:r})=>(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(dn,{...i,ref:t,__scopeSlider:n}),r?(0,q.jsx)(mn,{__scopeSlider:n},e):null]})})},`SliderThumb`)),pn=`SliderBubbleInput`,mn=K.forwardRef(X(function({__scopeSlider:e,...t},n){let{value:r,name:i,form:a}=sn(pn,e),s=K.useRef(null),l=o(s,n),u=x(r);return K.useEffect(()=>{let e=s.current;if(!e)return;let t=window.HTMLInputElement.prototype,n=Object.getOwnPropertyDescriptor(t,`value`).set;if(u!==r&&n){let t=new Event(`input`,{bubbles:!0});n.call(e,r),e.dispatchEvent(t)}},[u,r]),(0,q.jsx)(c.input,{style:{display:`none`},name:i,form:a,...t,ref:l,defaultValue:r})},`SliderBubbleInput`));function hn(e=[],t,n){let r=[...e];return r[n]=t,r.sort((e,t)=>e-t)}X(hn,`getNextSortedValues`);function gn(e,t,n){let r=100/(n-t)*(e-t);return C(r,[0,100])}X(gn,`convertValueToPercentage`);function _n(e,t){if(t>2)return`Value ${e+1} of ${t}`;if(t===2)return[`Minimum`,`Maximum`][e]}X(_n,`getLabel`);function vn(e,t){if(e.length===1)return 0;let n=e.map(e=>Math.abs(e-t)),r=Math.min(...n);return n.indexOf(r)}X(vn,`getClosestValueIndex`);function yn(e,t,n){let r=e/2;return(r-Sn([0,50],[0,r])(t)*n)*n}X(yn,`getThumbInBoundsOffset`);function bn(e){return e.slice(0,-1).map((t,n)=>e[n+1]-t)}X(bn,`getStepsBetweenValues`);function xn(e,t){if(t>0){let n=bn(e);return Math.min(...n)>=t}return!0}X(xn,`hasMinStepsBetweenValues`);function Sn(e,t){return n=>{if(e[0]===e[1]||t[0]===t[1])return t[0];let r=(t[1]-t[0])/(e[1]-e[0]);return t[0]+r*(n-e[0])}}X(Sn,`linearScale`);function Cn(e){if(!Number.isFinite(e))return 0;let t=e.toString();if(t.includes(`e`)){let[e,n]=t.split(`e`),r=e.split(`.`)[1]||``,i=Number(n);return Math.max(0,r.length-i)}let n=t.split(`.`)[1];return n?n.length:0}X(Cn,`getDecimalCount`);function $(e,t){let n=10**t;return Math.round(e*n)/n}X($,`roundValue`);function wn(e,{min:t,step:n,direction:r,multiplier:i}){let a=Cn(n),o=(e-t)/n,s=Math.round(o),c=$(s*n+t,a)===$(e,a),l;return l=c?s+i*r:r>0?Math.ceil(o):Math.floor(o),$(l*n+t,a)}X(wn,`getNextStepValue`);function Tn(e){return typeof e==`function`}X(Tn,`isFunction`);function En({className:e,defaultValue:t,value:n,min:r=0,max:i=100,...o}){let s=n?.length??t?.length??1,c=K.useMemo(()=>Array.from({length:s},(e,t)=>`thumb-${t}`),[s]);return(0,q.jsxs)(Yt,{"data-slot":`slider`,defaultValue:t,value:n,min:r,max:i,className:a(`relative flex w-full touch-none items-center select-none data-[disabled]:opacity-50 data-[orientation=vertical]:h-full data-[orientation=vertical]:min-h-44 data-[orientation=vertical]:w-auto data-[orientation=vertical]:flex-col`,e),...o,children:[(0,q.jsx)(nn,{"data-slot":`slider-track`,className:a(`relative grow overflow-hidden rounded-full bg-muted data-[orientation=horizontal]:h-1.5 data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1.5`),children:(0,q.jsx)(an,{"data-slot":`slider-range`,className:a(`absolute bg-primary data-[orientation=horizontal]:h-full data-[orientation=vertical]:w-full`)})}),c.map(e=>(0,q.jsx)(fn,{"data-slot":`slider-thumb`,className:`block size-4 shrink-0 rounded-full border border-primary bg-background shadow-sm ring-ring/50 transition-[color,box-shadow] hover:ring-4 focus-visible:ring-4 focus-visible:outline-hidden disabled:pointer-events-none disabled:opacity-50`},e))]})}function Dn({id:e,label:t,helpText:n,value:r,min:i,max:a,step:o,formatValue:s,disabled:c,onChange:l,onCommit:u}){return(0,q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,q.jsxs)(`div`,{className:`flex items-center justify-between w-[280px]`,children:[(0,q.jsx)(P,{htmlFor:e,children:t}),(0,q.jsxs)(`span`,{className:`text-xs text-muted-foreground font-mono`,children:[s(r),` · `,Oe(r,i,a)]})]}),(0,q.jsx)(En,{id:e,className:`w-[280px]`,value:[r],onValueChange:([e])=>l(e??r),onValueCommit:([e])=>u(e??r),min:i,max:a,step:o,disabled:c}),(0,q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:n})]})}function On(e,t){return h.voice.validateApiKey.useMutation({onSuccess:(n,r)=>{n.valid?(t(r.apiKey),j.success(`Deepgram API key is valid`)):(r.apiKey===e&&t(null),j.error(`Validation failed: ${n.error??`Unknown error`}`))},onError:(n,r)=>{r.apiKey===e&&t(null),j.error(`Validation failed: ${n.message}`)}})}function kn({apiKey:e,onApiKeyChange:t,validated:n,hasStoredKey:r,validating:a,saving:o,onValidate:c,onSave:l}){return(0,q.jsxs)(`div`,{className:`flex flex-wrap items-end gap-2`,children:[(0,q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,q.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,q.jsx)(P,{htmlFor:`deepgram-api-key`,children:`Deepgram API Key`}),n&&(0,q.jsxs)(`span`,{className:`flex items-center gap-1 text-xs text-green-600`,children:[(0,q.jsx)(k,{className:`w-3 h-3`}),`Valid`]})]}),(0,q.jsx)(s,{id:`deepgram-api-key`,type:`password`,value:e,onChange:e=>t(e.target.value),placeholder:r?`••••••••••••••••••••`:`Enter your Deepgram API key`,className:`font-mono text-sm w-[280px]`})]}),(0,q.jsx)(i,{variant:`outline`,onClick:c,disabled:a||!e,children:a?`Validating...`:`Validate`}),n&&(0,q.jsx)(i,{onClick:l,disabled:o,children:o?`Saving...`:`Save`})]})}function An({utteranceEndMs:e,bargeInSustainedMs:t,enabled:n,disabled:r,updateConfig:i}){let[a,o]=(0,K.useState)(je),[s,c]=(0,K.useState)(16);return(0,K.useEffect)(()=>{e!==void 0&&o(e)},[e]),(0,K.useEffect)(()=>{t!==void 0&&c(t)},[t]),(0,q.jsxs)(q.Fragment,{children:[(0,q.jsx)(Dn,{id:`voice-utterance-end`,label:`Stop-speaking sensitivity`,helpText:`How long a pause before voice mode decides you've finished talking.`,value:a,min:Ae,max:ke,step:250,formatValue:e=>`${(e/1e3).toFixed(2)}s`,disabled:r,onChange:o,onCommit:t=>i.mutate({enabled:n,utteranceEndMs:t},{onError:()=>o(e??1e3)})}),(0,q.jsx)(Dn,{id:`voice-barge-in`,label:`Barge-in sensitivity`,helpText:`How quickly voice mode notices you've started talking over its spoken reply and stops to listen.`,value:s,min:8,max:80,step:8,formatValue:e=>`${e}ms`,disabled:r,onChange:c,onCommit:e=>i.mutate({enabled:n,bargeInSustainedMs:e},{onError:()=>c(t??16)})})]})}function jn(){let{data:e,isLoading:t}=h.voice.getConfig.useQuery(),n=h.useUtils(),[r,i]=(0,K.useState)(``),[a,o]=(0,K.useState)(null),s=a!==null&&a===r,[c,l]=(0,K.useState)(1);(0,K.useEffect)(()=>{e?.ttsSpeed!==void 0&&l(e.ttsSpeed)},[e?.ttsSpeed]);let u=On(r,o),d=h.voice.updateConfig.useMutation({onSuccess:e=>{n.voice.getConfig.setData(void 0,e),n.voice.getConfig.invalidate()},onError:e=>j.error(`Failed to save: ${e.message}`)});if(t)return(0,q.jsxs)(z,{children:[(0,q.jsx)(F,{children:(0,q.jsxs)(B,{className:`flex items-center gap-2`,children:[(0,q.jsx)(pe,{className:`w-5 h-5`}),`Voice Mode`]})}),(0,q.jsx)(L,{children:(0,q.jsx)(R,{className:`h-10 w-full`})})]});let f=e?.hasApiKey??!1,p=e?.enabled??!1,m=e?.ttsModel??`flux-haley-en`;return(0,q.jsxs)(z,{children:[(0,q.jsxs)(F,{children:[(0,q.jsxs)(B,{className:`flex items-center gap-2`,children:[(0,q.jsx)(pe,{className:`w-5 h-5`}),`Voice Mode`]}),(0,q.jsx)(I,{children:`Talk to Claude/Codex sessions by voice using your own Deepgram API key for speech-to-text and text-to-speech.`})]}),(0,q.jsxs)(L,{className:`space-y-4`,children:[(0,q.jsxs)(`div`,{className:`flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between`,children:[(0,q.jsxs)(`div`,{className:`space-y-0.5`,children:[(0,q.jsx)(P,{htmlFor:`voice-mode-enabled`,children:`Enable voice mode`}),(0,q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:f?`Available in workspace chat`:`Requires a Deepgram API key below`})]}),(0,q.jsx)(Y,{id:`voice-mode-enabled`,checked:p,onCheckedChange:e=>d.mutate({enabled:e}),disabled:d.isPending||!f})]}),(0,q.jsx)(kn,{apiKey:r,onApiKeyChange:e=>{i(e),o(null)},validated:s,hasStoredKey:f,validating:u.isPending,saving:d.isPending,onValidate:()=>{r&&u.mutate({apiKey:r})},onSave:()=>{r&&s&&d.mutate({enabled:p,apiKey:r},{onSuccess:()=>{i(``),o(null)}})}}),(0,q.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Create an API key at`,` `,(0,q.jsx)(`a`,{href:`https://console.deepgram.com/`,target:`_blank`,rel:`noopener noreferrer`,className:`underline`,children:`console.deepgram.com`})]}),(0,q.jsxs)(`div`,{className:`border-t pt-4 space-y-4`,children:[(0,q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,q.jsx)(P,{htmlFor:`voice-model`,children:`Voice`}),(0,q.jsxs)(D,{value:m,onValueChange:e=>d.mutate({enabled:p,ttsModel:e}),disabled:d.isPending||!f,children:[(0,q.jsx)(T,{id:`voice-model`,className:`w-[280px]`,children:(0,q.jsx)(E,{})}),(0,q.jsx)(w,{children:ie.map(e=>(0,q.jsxs)(S,{value:e.model,children:[e.name,e.description?` — ${e.description}`:``]},e.model))})]}),(0,q.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Deepgram Flux TTS English voices`})]}),(0,q.jsxs)(`div`,{className:`space-y-1.5`,children:[(0,q.jsxs)(`div`,{className:`flex items-center justify-between w-[280px]`,children:[(0,q.jsx)(P,{htmlFor:`voice-speed`,children:`Speed`}),(0,q.jsxs)(`span`,{className:`text-xs text-muted-foreground font-mono`,children:[c.toFixed(2),`x`]})]}),(0,q.jsx)(En,{id:`voice-speed`,className:`w-[280px]`,value:[c],onValueChange:([e])=>l(e??1),onValueCommit:([t])=>d.mutate({enabled:p,ttsSpeed:t??1},{onError:()=>l(e?.ttsSpeed??1)}),min:ne,max:ae,step:te,disabled:d.isPending||!f})]}),(0,q.jsx)(An,{utteranceEndMs:e?.utteranceEndMs,bargeInSustainedMs:e?.bargeInSustainedMs,enabled:p,disabled:d.isPending||!f,updateConfig:d})]})]})]})}function Mn(e){if(!e||e.length===0)return;let t=Te();return t&&e.some(e=>e.slug===t)?t:e[0]?.slug}function Nn(){Se({title:`Settings`});let[e,t]=(0,K.useState)(`general`),{data:n,isLoading:r,refetch:i}=h.admin.getSystemStats.useQuery(void 0,{refetchInterval:5e3}),{data:a,isLoading:o}=h.admin.getActiveProcesses.useQuery(void 0,{refetchInterval:5e3}),{data:s}=h.project.list.useQuery(),c=h.admin.resetApiUsageStats.useMutation({onSuccess:()=>{i()}}),l=Mn(s);return r?(0,q.jsx)(xe,{message:`Loading settings...`}):(0,q.jsxs)(`div`,{className:`h-full overflow-y-auto`,children:[l&&(0,q.jsx)(Ce,{children:(0,q.jsx)(m,{projectSlug:l})}),(0,q.jsx)(`div`,{className:`space-y-6 p-3 md:p-6`,children:(0,q.jsxs)(De,{value:e,onValueChange:e=>t(e),children:[(0,q.jsxs)(Ee,{className:`w-full sm:w-auto`,children:[(0,q.jsx)(V,{value:`general`,className:`flex-1 sm:flex-initial`,children:`General Settings`}),(0,q.jsx)(V,{value:`project`,className:`flex-1 sm:flex-initial`,children:`Project Settings`}),(0,q.jsx)(V,{value:`periodic-tasks`,className:`flex-1 sm:flex-initial`,children:`Periodic Tasks`}),(0,q.jsx)(V,{value:`voice`,className:`flex-1 sm:flex-initial`,children:`Voice Mode`})]}),(0,q.jsxs)(H,{value:`general`,className:`space-y-6 mt-4`,children:[(0,q.jsx)(Ge,{apiUsage:n?.apiUsage,onReset:()=>c.mutate(),isResetting:c.isPending}),o?(0,q.jsx)(Nt,{}):(0,q.jsx)(Pt,{processes:a}),(0,q.jsx)(z,{className:`bg-muted/50`,children:(0,q.jsx)(L,{className:`py-4`,children:(0,q.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-2 gap-y-1 text-sm`,children:[(0,q.jsx)(`span`,{className:`font-medium`,children:`Environment:`}),(0,q.jsx)(N,{variant:`outline`,children:n?.environment||`unknown`})]})})}),(0,q.jsx)(_t,{}),(0,q.jsx)(Qe,{}),(0,q.jsx)(Ye,{}),(0,q.jsx)(Xe,{}),(0,q.jsx)(Lt,{}),(0,q.jsx)(Je,{}),(0,q.jsx)(Ze,{}),(0,q.jsx)(Rt,{})]}),(0,q.jsx)(H,{value:`project`,className:`mt-4`,children:s?(0,q.jsx)(It,{projects:s}):(0,q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Loading projects...`})}),(0,q.jsx)(H,{value:`periodic-tasks`,className:`mt-4`,children:s?(0,q.jsx)(St,{projects:s}):(0,q.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Loading projects...`})}),(0,q.jsx)(H,{value:`voice`,className:`mt-4`,children:(0,q.jsx)(jn,{})})]})})]})}export{Nn as default};
@@ -1 +1 @@
1
- import{t as e}from"./jsx-runtime-DE3RlOCf.js";import{c as t,o as n}from"./dist-BiFeezwN.js";var r=e(),i=t(`relative grid w-full grid-cols-[0_1fr] items-start gap-y-0.5 rounded-lg border px-4 py-3 text-sm has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] has-[>svg]:gap-x-3 [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current`,{variants:{variant:{default:`bg-card text-card-foreground`,destructive:`bg-card text-destructive *:data-[slot=alert-description]:text-destructive/90 [&>svg]:text-current`}},defaultVariants:{variant:`default`}});function a({className:e,variant:t,...a}){return(0,r.jsx)(`div`,{"data-slot":`alert`,role:`alert`,className:n(i({variant:t}),e),...a})}function o({className:e,...t}){return(0,r.jsx)(`div`,{"data-slot":`alert-description`,className:n(`col-start-2 grid justify-items-start gap-1 text-sm text-muted-foreground [&_p]:leading-relaxed`,e),...t})}export{o as n,a as t};
1
+ import{t as e}from"./jsx-runtime-BNakU3Ej.js";import{c as t,o as n}from"./dist-BO6Gz-vk.js";var r=e(),i=t(`relative grid w-full grid-cols-[0_1fr] items-start gap-y-0.5 rounded-lg border px-4 py-3 text-sm has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] has-[>svg]:gap-x-3 [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current`,{variants:{variant:{default:`bg-card text-card-foreground`,destructive:`bg-card text-destructive *:data-[slot=alert-description]:text-destructive/90 [&>svg]:text-current`}},defaultVariants:{variant:`default`}});function a({className:e,variant:t,...a}){return(0,r.jsx)(`div`,{"data-slot":`alert`,role:`alert`,className:n(i({variant:t}),e),...a})}function o({className:e,...t}){return(0,r.jsx)(`div`,{"data-slot":`alert-description`,className:n(`col-start-2 grid justify-items-start gap-1 text-sm text-muted-foreground [&_p]:leading-relaxed`,e),...t})}export{o as n,a as t};
@@ -1 +1 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,t as n}from"./jsx-runtime-DE3RlOCf.js";import{i as r,o as i,p as a}from"./dist-BiFeezwN.js";import{S as o,_ as s,b as c,g as l,h as u,m as d,v as f,x as p,y as m}from"./radio-group-CcAx51bT.js";import{C as h,w as g}from"./dist-Dtgf0TOg.js";var _=e(t(),1),v=n(),y=Object.defineProperty,b=(e,t)=>y(e,`name`,{value:t,configurable:!0}),[x,S]=h(`AlertDialog`,[o]),C=o(),w=b(e=>{let{__scopeAlertDialog:t,...n}=e,r=C(t);return(0,v.jsx)(d,{...r,...n,modal:!0})},`AlertDialog`);_.forwardRef(b(function(e,t){let{__scopeAlertDialog:n,...r}=e,i=C(n);return(0,v.jsx)(p,{...i,...r,ref:t})},`AlertDialogTrigger`));var T=b(e=>{let{__scopeAlertDialog:t,...n}=e,r=C(t);return(0,v.jsx)(m,{...r,...n})},`AlertDialogPortal`),E=_.forwardRef(b(function(e,t){let{__scopeAlertDialog:n,...r}=e,i=C(n);return(0,v.jsx)(f,{...i,...r,ref:t})},`AlertDialogOverlay`)),[D,O]=x(`AlertDialogContent`),k=_.forwardRef(b(function(e,t){let{__scopeAlertDialog:n,children:r,...i}=e,o=C(n),s=_.useRef(null),c=a(t,s),u=_.useRef(null);return(0,v.jsx)(D,{scope:n,cancelRef:u,children:(0,v.jsx)(l,{role:`alertdialog`,...o,...i,ref:c,onOpenAutoFocus:g(i.onOpenAutoFocus,e=>{e.preventDefault(),u.current?.focus({preventScroll:!0})}),onPointerDownOutside:e=>e.preventDefault(),onInteractOutside:e=>e.preventDefault(),children:r})})},`AlertDialogContent`)),A=_.forwardRef(b(function(e,t){let{__scopeAlertDialog:n,...r}=e,i=C(n);return(0,v.jsx)(c,{...i,...r,ref:t})},`AlertDialogTitle`)),j=_.forwardRef(b(function(e,t){let{__scopeAlertDialog:n,...r}=e,i=C(n);return(0,v.jsx)(s,{...i,...r,ref:t})},`AlertDialogDescription`)),M=_.forwardRef(b(function(e,t){let{__scopeAlertDialog:n,...r}=e,i=C(n);return(0,v.jsx)(u,{...i,...r,ref:t})},`AlertDialogAction`)),N=`AlertDialogCancel`,P=_.forwardRef(b(function(e,t){let{__scopeAlertDialog:n,...r}=e,{cancelRef:i}=O(N,n),o=C(n),s=a(t,i);return(0,v.jsx)(u,{...o,...r,ref:s})},`AlertDialogCancel`)),F=w,I=T,L=E,R=k,z=M,B=P,V=A,H=j;function U({...e}){return(0,v.jsx)(F,{"data-slot":`alert-dialog`,...e})}function W({...e}){return(0,v.jsx)(I,{"data-slot":`alert-dialog-portal`,...e})}function G({className:e,...t}){return(0,v.jsx)(L,{"data-slot":`alert-dialog-overlay`,className:i(`fixed inset-0 z-50 bg-black/50 motion-reduce:data-[state=open]:animate-none motion-reduce:data-[state=closed]:animate-none data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0`,e),...t})}function K({className:e,size:t=`default`,...n}){return(0,v.jsxs)(W,{children:[(0,v.jsx)(G,{}),(0,v.jsx)(R,{"data-slot":`alert-dialog-content`,"data-size":t,className:i(`group/alert-dialog-content fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border bg-background p-6 shadow-sm duration-200 motion-reduce:data-[state=open]:animate-none motion-reduce:data-[state=closed]:animate-none data-[size=sm]:max-w-xs data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[size=default]:sm:max-w-lg`,e),...n})]})}function q({className:e,...t}){return(0,v.jsx)(`div`,{"data-slot":`alert-dialog-header`,className:i(`grid grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-6 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]`,e),...t})}function J({className:e,...t}){return(0,v.jsx)(`div`,{"data-slot":`alert-dialog-footer`,className:i(`flex flex-col-reverse gap-2 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end`,e),...t})}function Y({className:e,...t}){return(0,v.jsx)(V,{"data-slot":`alert-dialog-title`,className:i(`text-lg font-semibold sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2`,e),...t})}function X({className:e,...t}){return(0,v.jsx)(H,{"data-slot":`alert-dialog-description`,className:i(`text-sm text-muted-foreground`,e),...t})}function Z({className:e,variant:t=`default`,size:n=`default`,...i}){return(0,v.jsx)(r,{variant:t,size:n,className:e,asChild:!0,children:(0,v.jsx)(z,{"data-slot":`alert-dialog-action`,...i})})}function Q({className:e,variant:t=`outline`,size:n=`default`,...i}){return(0,v.jsx)(r,{variant:t,size:n,className:e,asChild:!0,children:(0,v.jsx)(B,{"data-slot":`alert-dialog-cancel`,...i})})}export{X as a,Y as c,K as i,Z as n,J as o,Q as r,q as s,U as t};
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,t as n}from"./jsx-runtime-BNakU3Ej.js";import{i as r,o as i,p as a}from"./dist-BO6Gz-vk.js";import{S as o,_ as s,b as c,g as l,h as u,m as d,v as f,x as p,y as m}from"./radio-group-BhmTXkIv.js";import{C as h,w as g}from"./dist-DGw3MClt.js";var _=e(t(),1),v=n(),y=Object.defineProperty,b=(e,t)=>y(e,`name`,{value:t,configurable:!0}),[x,S]=h(`AlertDialog`,[o]),C=o(),w=b(e=>{let{__scopeAlertDialog:t,...n}=e,r=C(t);return(0,v.jsx)(d,{...r,...n,modal:!0})},`AlertDialog`);_.forwardRef(b(function(e,t){let{__scopeAlertDialog:n,...r}=e,i=C(n);return(0,v.jsx)(p,{...i,...r,ref:t})},`AlertDialogTrigger`));var T=b(e=>{let{__scopeAlertDialog:t,...n}=e,r=C(t);return(0,v.jsx)(m,{...r,...n})},`AlertDialogPortal`),E=_.forwardRef(b(function(e,t){let{__scopeAlertDialog:n,...r}=e,i=C(n);return(0,v.jsx)(f,{...i,...r,ref:t})},`AlertDialogOverlay`)),[D,O]=x(`AlertDialogContent`),k=_.forwardRef(b(function(e,t){let{__scopeAlertDialog:n,children:r,...i}=e,o=C(n),s=_.useRef(null),c=a(t,s),u=_.useRef(null);return(0,v.jsx)(D,{scope:n,cancelRef:u,children:(0,v.jsx)(l,{role:`alertdialog`,...o,...i,ref:c,onOpenAutoFocus:g(i.onOpenAutoFocus,e=>{e.preventDefault(),u.current?.focus({preventScroll:!0})}),onPointerDownOutside:e=>e.preventDefault(),onInteractOutside:e=>e.preventDefault(),children:r})})},`AlertDialogContent`)),A=_.forwardRef(b(function(e,t){let{__scopeAlertDialog:n,...r}=e,i=C(n);return(0,v.jsx)(c,{...i,...r,ref:t})},`AlertDialogTitle`)),j=_.forwardRef(b(function(e,t){let{__scopeAlertDialog:n,...r}=e,i=C(n);return(0,v.jsx)(s,{...i,...r,ref:t})},`AlertDialogDescription`)),M=_.forwardRef(b(function(e,t){let{__scopeAlertDialog:n,...r}=e,i=C(n);return(0,v.jsx)(u,{...i,...r,ref:t})},`AlertDialogAction`)),N=`AlertDialogCancel`,P=_.forwardRef(b(function(e,t){let{__scopeAlertDialog:n,...r}=e,{cancelRef:i}=O(N,n),o=C(n),s=a(t,i);return(0,v.jsx)(u,{...o,...r,ref:s})},`AlertDialogCancel`)),F=w,I=T,L=E,R=k,z=M,B=P,V=A,H=j;function U({...e}){return(0,v.jsx)(F,{"data-slot":`alert-dialog`,...e})}function W({...e}){return(0,v.jsx)(I,{"data-slot":`alert-dialog-portal`,...e})}function G({className:e,...t}){return(0,v.jsx)(L,{"data-slot":`alert-dialog-overlay`,className:i(`fixed inset-0 z-50 bg-black/50 motion-reduce:data-[state=open]:animate-none motion-reduce:data-[state=closed]:animate-none data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:animate-in data-[state=open]:fade-in-0`,e),...t})}function K({className:e,size:t=`default`,...n}){return(0,v.jsxs)(W,{children:[(0,v.jsx)(G,{}),(0,v.jsx)(R,{"data-slot":`alert-dialog-content`,"data-size":t,className:i(`group/alert-dialog-content fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border bg-background p-6 shadow-sm duration-200 motion-reduce:data-[state=open]:animate-none motion-reduce:data-[state=closed]:animate-none data-[size=sm]:max-w-xs data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[size=default]:sm:max-w-lg`,e),...n})]})}function q({className:e,...t}){return(0,v.jsx)(`div`,{"data-slot":`alert-dialog-header`,className:i(`grid grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-6 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]`,e),...t})}function J({className:e,...t}){return(0,v.jsx)(`div`,{"data-slot":`alert-dialog-footer`,className:i(`flex flex-col-reverse gap-2 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end`,e),...t})}function Y({className:e,...t}){return(0,v.jsx)(V,{"data-slot":`alert-dialog-title`,className:i(`text-lg font-semibold sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2`,e),...t})}function X({className:e,...t}){return(0,v.jsx)(H,{"data-slot":`alert-dialog-description`,className:i(`text-sm text-muted-foreground`,e),...t})}function Z({className:e,variant:t=`default`,size:n=`default`,...i}){return(0,v.jsx)(r,{variant:t,size:n,className:e,asChild:!0,children:(0,v.jsx)(z,{"data-slot":`alert-dialog-action`,...i})})}function Q({className:e,variant:t=`outline`,size:n=`default`,...i}){return(0,v.jsx)(r,{variant:t,size:n,className:e,asChild:!0,children:(0,v.jsx)(B,{"data-slot":`alert-dialog-cancel`,...i})})}export{X as a,Y as c,K as i,Z as n,J as o,Q as r,q as s,U as t};
@@ -0,0 +1 @@
1
+ import"./chunk-FOHPRMQF-CoA4358r.js";import{M as e}from"./mermaid-parser.core-CpkwJ-8U.js";export{e as createArchitectureServices};