factory-factory 0.3.5 → 0.3.7

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 (552) hide show
  1. package/README.md +17 -0
  2. package/dist/client/assets/_basePickBy-BsuMuaCZ.js +1 -0
  3. package/dist/client/assets/{_baseUniq-DuVP6l01.js → _baseUniq-BDd8f52s.js} +1 -1
  4. package/dist/client/assets/{arc-BRTVE1a5.js → arc-BWbaJQoA.js} +1 -1
  5. package/dist/client/assets/{architectureDiagram-VXUJARFQ-DphOng2K.js → architectureDiagram-VXUJARFQ-C_FQG3JS.js} +1 -1
  6. package/dist/client/assets/{blockDiagram-VD42YOAC-DvVRHTty.js → blockDiagram-VD42YOAC-CLwvH-wA.js} +1 -1
  7. package/dist/client/assets/{c4Diagram-YG6GDRKO-BZaLUCEP.js → c4Diagram-YG6GDRKO-Ba80_haP.js} +1 -1
  8. package/dist/client/assets/channel-B2z94T-9.js +1 -0
  9. package/dist/client/assets/{chunk-4BX2VUAB-n69YHsoN.js → chunk-4BX2VUAB-CSlDSMiy.js} +1 -1
  10. package/dist/client/assets/{chunk-55IACEB6-C67Ak1Qy.js → chunk-55IACEB6-Dm3keBAf.js} +1 -1
  11. package/dist/client/assets/{chunk-B4BG7PRW-_Ja9GXA4.js → chunk-B4BG7PRW-BSrvNYuP.js} +1 -1
  12. package/dist/client/assets/{chunk-DI55MBZ5-C1TAOocX.js → chunk-DI55MBZ5-DFQPoLQZ.js} +1 -1
  13. package/dist/client/assets/{chunk-FMBD7UC4-Co8OmD7c.js → chunk-FMBD7UC4-C1KS438H.js} +1 -1
  14. package/dist/client/assets/{chunk-QN33PNHL-ESdvapXF.js → chunk-QN33PNHL-4rPPxHo4.js} +1 -1
  15. package/dist/client/assets/{chunk-QZHKN3VN-DQTGFT4I.js → chunk-QZHKN3VN-B_sF5IzV.js} +1 -1
  16. package/dist/client/assets/{chunk-TZMSLE5B-C7a0BTNr.js → chunk-TZMSLE5B-L-qbjoBp.js} +1 -1
  17. package/dist/client/assets/classDiagram-2ON5EDUG-B2LoFG_o.js +1 -0
  18. package/dist/client/assets/classDiagram-v2-WZHVMYZB-B2LoFG_o.js +1 -0
  19. package/dist/client/assets/clone-C8LA0zQQ.js +1 -0
  20. package/dist/client/assets/{cose-bilkent-S5V4N54A-Dg_Elpr2.js → cose-bilkent-S5V4N54A-DB7lwAnl.js} +1 -1
  21. package/dist/client/assets/{dagre-6UL2VRFP-DC_BntL_.js → dagre-6UL2VRFP-z2fl_1iD.js} +2 -2
  22. package/dist/client/assets/{diagram-PSM6KHXK-D4EnEadG.js → diagram-PSM6KHXK-BL2iv8II.js} +1 -1
  23. package/dist/client/assets/{diagram-QEK2KX5R-DeDgxkkd.js → diagram-QEK2KX5R-DgMZW0D1.js} +1 -1
  24. package/dist/client/assets/{diagram-S2PKOQOG-DqCrW2Mz.js → diagram-S2PKOQOG-Ct2QBl2c.js} +1 -1
  25. package/dist/client/assets/{erDiagram-Q2GNP2WA-CoIzOJMx.js → erDiagram-Q2GNP2WA-DII-pqkb.js} +1 -1
  26. package/dist/client/assets/{flowDiagram-NV44I4VS-H-hzyVxN.js → flowDiagram-NV44I4VS-BV4CMZAZ.js} +1 -1
  27. package/dist/client/assets/{ganttDiagram-JELNMOA3-BZbu1Bvf.js → ganttDiagram-JELNMOA3-Dfj064tE.js} +1 -1
  28. package/dist/client/assets/{gitGraphDiagram-NY62KEGX-yHNzOwte.js → gitGraphDiagram-V2S2FVAM-Cg2b-j3t.js} +1 -1
  29. package/dist/client/assets/{graph-0fFVLhuM.js → graph-wzICjOO_.js} +1 -1
  30. package/dist/client/assets/index-DvtmO7DV.css +1 -0
  31. package/dist/client/assets/index-EVrp_NXm.js +429 -0
  32. package/dist/client/assets/{infoDiagram-WHAUD3N6-BdYcSIzA.js → infoDiagram-HS3SLOUP-D09mbfgG.js} +1 -1
  33. package/dist/client/assets/{journeyDiagram-XKPGCS4Q-BgD0iboh.js → journeyDiagram-XKPGCS4Q-BebsQbuf.js} +1 -1
  34. package/dist/client/assets/{kanban-definition-3W4ZIXB7-2cCK2J0j.js → kanban-definition-3W4ZIXB7-DOuawTNU.js} +1 -1
  35. package/dist/client/assets/{layout-UQByNmge.js → layout-Bj6cMfF5.js} +1 -1
  36. package/dist/client/assets/{linear-COsW-oY4.js → linear-B58HS9F4.js} +1 -1
  37. package/dist/client/assets/{mindmap-definition-VGOIOE7T-CnhVGcBr.js → mindmap-definition-VGOIOE7T-hSFgcTL2.js} +1 -1
  38. package/dist/client/assets/mobile-baseline-CmdjqYSm.js +10 -0
  39. package/dist/client/assets/{pieDiagram-ADFJNKIX-DX0wt7fJ.js → pieDiagram-ADFJNKIX-D1vkoKs3.js} +1 -1
  40. package/dist/client/assets/{quadrantDiagram-AYHSOK5B-nfJepDyE.js → quadrantDiagram-AYHSOK5B-pMQj9xcS.js} +1 -1
  41. package/dist/client/assets/{requirementDiagram-UZGBJVZJ-I_tnp42L.js → requirementDiagram-UZGBJVZJ-DvRtxnIi.js} +1 -1
  42. package/dist/client/assets/{sankeyDiagram-TZEHDZUN-4r_mPLW_.js → sankeyDiagram-TZEHDZUN-BWoDxXkR.js} +1 -1
  43. package/dist/client/assets/{sequenceDiagram-WL72ISMW-DWymCFZa.js → sequenceDiagram-WL72ISMW-Dz5i1ly3.js} +1 -1
  44. package/dist/client/assets/{stateDiagram-FKZM4ZOC-CCHlcmzO.js → stateDiagram-FKZM4ZOC-BFd_gXUo.js} +1 -1
  45. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-CO6XGRkL.js +1 -0
  46. package/dist/client/assets/terminal-instance-BTIzq32H.js +16 -0
  47. package/dist/client/assets/terminal-instance-DDGTF8rc.css +1 -0
  48. package/dist/client/assets/{timeline-definition-IT6M3QCI-EkYjHzU_.js → timeline-definition-IT6M3QCI-BFEIWW6m.js} +1 -1
  49. package/dist/client/assets/treemap-GDKQZRPO-CC2Fh6RQ.js +160 -0
  50. package/dist/client/assets/{xychartDiagram-PRI3JC2R-DwOnTNwE.js → xychartDiagram-PRI3JC2R-DFygXQrm.js} +1 -1
  51. package/dist/client/index.html +3 -3
  52. package/dist/prisma/generated/commonInputTypes.d.ts +99 -39
  53. package/dist/prisma/generated/commonInputTypes.d.ts.map +1 -1
  54. package/dist/prisma/generated/enums.d.ts +12 -0
  55. package/dist/prisma/generated/enums.d.ts.map +1 -1
  56. package/dist/prisma/generated/enums.js +11 -1
  57. package/dist/prisma/generated/enums.js.map +1 -1
  58. package/dist/prisma/generated/internal/class.d.ts.map +1 -1
  59. package/dist/prisma/generated/internal/class.js +12 -4
  60. package/dist/prisma/generated/internal/class.js.map +1 -1
  61. package/dist/prisma/generated/internal/prismaNamespace.d.ts +16 -7
  62. package/dist/prisma/generated/internal/prismaNamespace.d.ts.map +1 -1
  63. package/dist/prisma/generated/internal/prismaNamespace.js +13 -6
  64. package/dist/prisma/generated/internal/prismaNamespace.js.map +1 -1
  65. package/dist/prisma/generated/internal/prismaNamespaceBrowser.d.ts +12 -5
  66. package/dist/prisma/generated/internal/prismaNamespaceBrowser.d.ts.map +1 -1
  67. package/dist/prisma/generated/internal/prismaNamespaceBrowser.js +11 -4
  68. package/dist/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
  69. package/dist/prisma/generated/models/Project.d.ts +63 -1
  70. package/dist/prisma/generated/models/Project.d.ts.map +1 -1
  71. package/dist/prisma/generated/models/UserSettings.d.ts +60 -1
  72. package/dist/prisma/generated/models/UserSettings.d.ts.map +1 -1
  73. package/dist/prisma/generated/models/Workspace.d.ts +130 -1
  74. package/dist/prisma/generated/models/Workspace.d.ts.map +1 -1
  75. package/dist/prompts/ratchet/dispatch.md +5 -2
  76. package/dist/prompts/workflows/pr-review-fix.md +2 -1
  77. package/dist/src/backend/domains/github/github-cli/schemas.d.ts +1 -1
  78. package/dist/src/backend/domains/github/github-cli/schemas.js +1 -1
  79. package/dist/src/backend/domains/github/github-cli/schemas.js.map +1 -1
  80. package/dist/src/backend/domains/github/github-cli.service.test.js +44 -0
  81. package/dist/src/backend/domains/github/github-cli.service.test.js.map +1 -1
  82. package/dist/src/backend/domains/linear/index.d.ts +3 -0
  83. package/dist/src/backend/domains/linear/index.d.ts.map +1 -0
  84. package/dist/src/backend/domains/linear/index.js +3 -0
  85. package/dist/src/backend/domains/linear/index.js.map +1 -0
  86. package/dist/src/backend/domains/linear/linear-client.service.d.ts +40 -0
  87. package/dist/src/backend/domains/linear/linear-client.service.d.ts.map +1 -0
  88. package/dist/src/backend/domains/linear/linear-client.service.js +134 -0
  89. package/dist/src/backend/domains/linear/linear-client.service.js.map +1 -0
  90. package/dist/src/backend/domains/linear/linear-state-sync.service.d.ts +7 -0
  91. package/dist/src/backend/domains/linear/linear-state-sync.service.d.ts.map +1 -0
  92. package/dist/src/backend/domains/linear/linear-state-sync.service.js +29 -0
  93. package/dist/src/backend/domains/linear/linear-state-sync.service.js.map +1 -0
  94. package/dist/src/backend/domains/ratchet/bridges.d.ts +1 -1
  95. package/dist/src/backend/domains/ratchet/bridges.d.ts.map +1 -1
  96. package/dist/src/backend/domains/ratchet/index.d.ts +2 -2
  97. package/dist/src/backend/domains/ratchet/index.d.ts.map +1 -1
  98. package/dist/src/backend/domains/ratchet/index.js +1 -1
  99. package/dist/src/backend/domains/ratchet/index.js.map +1 -1
  100. package/dist/src/backend/domains/ratchet/ratchet.service.d.ts +12 -0
  101. package/dist/src/backend/domains/ratchet/ratchet.service.d.ts.map +1 -1
  102. package/dist/src/backend/domains/ratchet/ratchet.service.js +83 -4
  103. package/dist/src/backend/domains/ratchet/ratchet.service.js.map +1 -1
  104. package/dist/src/backend/domains/ratchet/ratchet.service.test.js +272 -1
  105. package/dist/src/backend/domains/ratchet/ratchet.service.test.js.map +1 -1
  106. package/dist/src/backend/domains/run-script/run-script.service.d.ts +3 -0
  107. package/dist/src/backend/domains/run-script/run-script.service.d.ts.map +1 -1
  108. package/dist/src/backend/domains/run-script/run-script.service.js +34 -2
  109. package/dist/src/backend/domains/run-script/run-script.service.js.map +1 -1
  110. package/dist/src/backend/domains/run-script/run-script.service.test.js +42 -0
  111. package/dist/src/backend/domains/run-script/run-script.service.test.js.map +1 -1
  112. package/dist/src/backend/domains/run-script/startup-script.service.test.d.ts +2 -0
  113. package/dist/src/backend/domains/run-script/startup-script.service.test.d.ts.map +1 -0
  114. package/dist/src/backend/domains/run-script/startup-script.service.test.js +159 -0
  115. package/dist/src/backend/domains/run-script/startup-script.service.test.js.map +1 -0
  116. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.d.ts.map +1 -1
  117. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.js +35 -4
  118. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.js.map +1 -1
  119. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.js +108 -0
  120. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.js.map +1 -1
  121. package/dist/src/backend/domains/session/acp/codex-cli-import-resolution.integration.test.js +2 -2
  122. package/dist/src/backend/domains/session/acp/codex-cli-import-resolution.integration.test.js.map +1 -1
  123. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/start.handler.d.ts.map +1 -1
  124. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/start.handler.js +15 -7
  125. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/start.handler.js.map +1 -1
  126. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/start.handler.test.js +1 -1
  127. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/start.handler.test.js.map +1 -1
  128. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/stop.handler.d.ts.map +1 -1
  129. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/stop.handler.js +1 -0
  130. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/stop.handler.js.map +1 -1
  131. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/stop.handler.test.js +3 -0
  132. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/stop.handler.test.js.map +1 -1
  133. package/dist/src/backend/domains/session/chat/chat-message-handlers/types.d.ts +1 -0
  134. package/dist/src/backend/domains/session/chat/chat-message-handlers/types.d.ts.map +1 -1
  135. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.d.ts +4 -0
  136. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.d.ts.map +1 -1
  137. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.js +33 -5
  138. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.js.map +1 -1
  139. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.test.js +39 -1
  140. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.test.js.map +1 -1
  141. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.d.ts.map +1 -1
  142. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.js +0 -11
  143. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.js.map +1 -1
  144. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.test.js +9 -6
  145. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.test.js.map +1 -1
  146. package/dist/src/backend/domains/session/data/session-data.service.d.ts +6 -0
  147. package/dist/src/backend/domains/session/data/session-data.service.d.ts.map +1 -1
  148. package/dist/src/backend/domains/session/data/session-provider-resolver.service.d.ts +1 -0
  149. package/dist/src/backend/domains/session/data/session-provider-resolver.service.d.ts.map +1 -1
  150. package/dist/src/backend/domains/session/data/session-provider-resolver.service.js +6 -0
  151. package/dist/src/backend/domains/session/data/session-provider-resolver.service.js.map +1 -1
  152. package/dist/src/backend/domains/session/data/session-provider-resolver.service.test.js +2 -0
  153. package/dist/src/backend/domains/session/data/session-provider-resolver.service.test.js.map +1 -1
  154. package/dist/src/backend/domains/session/lifecycle/session.service.d.ts +5 -0
  155. package/dist/src/backend/domains/session/lifecycle/session.service.d.ts.map +1 -1
  156. package/dist/src/backend/domains/session/lifecycle/session.service.js +240 -32
  157. package/dist/src/backend/domains/session/lifecycle/session.service.js.map +1 -1
  158. package/dist/src/backend/domains/session/lifecycle/session.service.test.js +166 -1
  159. package/dist/src/backend/domains/session/lifecycle/session.service.test.js.map +1 -1
  160. package/dist/src/backend/domains/session/session-domain.service.d.ts +3 -2
  161. package/dist/src/backend/domains/session/session-domain.service.d.ts.map +1 -1
  162. package/dist/src/backend/domains/session/session-domain.service.js +27 -2
  163. package/dist/src/backend/domains/session/session-domain.service.js.map +1 -1
  164. package/dist/src/backend/domains/session/session-domain.service.test.js +113 -0
  165. package/dist/src/backend/domains/session/session-domain.service.test.js.map +1 -1
  166. package/dist/src/backend/domains/session/store/session-runtime-machine.d.ts +1 -0
  167. package/dist/src/backend/domains/session/store/session-runtime-machine.d.ts.map +1 -1
  168. package/dist/src/backend/domains/session/store/session-runtime-machine.js +5 -2
  169. package/dist/src/backend/domains/session/store/session-runtime-machine.js.map +1 -1
  170. package/dist/src/backend/domains/session/store/session-runtime-machine.test.js +13 -0
  171. package/dist/src/backend/domains/session/store/session-runtime-machine.test.js.map +1 -1
  172. package/dist/src/backend/domains/workspace/index.d.ts +1 -0
  173. package/dist/src/backend/domains/workspace/index.d.ts.map +1 -1
  174. package/dist/src/backend/domains/workspace/index.js +1 -0
  175. package/dist/src/backend/domains/workspace/index.js.map +1 -1
  176. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.d.ts +10 -0
  177. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.d.ts.map +1 -0
  178. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.js +24 -0
  179. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.js.map +1 -0
  180. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.test.d.ts +2 -0
  181. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.test.d.ts.map +1 -0
  182. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.test.js +17 -0
  183. package/dist/src/backend/domains/workspace/lifecycle/archive-tracker.service.test.js.map +1 -0
  184. package/dist/src/backend/domains/workspace/lifecycle/creation.service.d.ts +12 -1
  185. package/dist/src/backend/domains/workspace/lifecycle/creation.service.d.ts.map +1 -1
  186. package/dist/src/backend/domains/workspace/lifecycle/creation.service.js +30 -10
  187. package/dist/src/backend/domains/workspace/lifecycle/creation.service.js.map +1 -1
  188. package/dist/src/backend/domains/workspace/lifecycle/creation.service.test.js +53 -2
  189. package/dist/src/backend/domains/workspace/lifecycle/creation.service.test.js.map +1 -1
  190. package/dist/src/backend/domains/workspace/lifecycle/data.service.d.ts +75 -0
  191. package/dist/src/backend/domains/workspace/lifecycle/data.service.d.ts.map +1 -1
  192. package/dist/src/backend/domains/workspace/lifecycle/data.service.js +8 -1
  193. package/dist/src/backend/domains/workspace/lifecycle/data.service.js.map +1 -1
  194. package/dist/src/backend/domains/workspace/query/project-management.service.d.ts +16 -0
  195. package/dist/src/backend/domains/workspace/query/project-management.service.d.ts.map +1 -1
  196. package/dist/src/backend/domains/workspace/query/project-management.service.js.map +1 -1
  197. package/dist/src/backend/domains/workspace/query/user-settings-query.service.d.ts +2 -0
  198. package/dist/src/backend/domains/workspace/query/user-settings-query.service.d.ts.map +1 -1
  199. package/dist/src/backend/domains/workspace/query/user-settings-query.service.js.map +1 -1
  200. package/dist/src/backend/domains/workspace/query/workspace-query.service.d.ts +8 -0
  201. package/dist/src/backend/domains/workspace/query/workspace-query.service.d.ts.map +1 -1
  202. package/dist/src/backend/domains/workspace/query/workspace-query.service.js +5 -1
  203. package/dist/src/backend/domains/workspace/query/workspace-query.service.js.map +1 -1
  204. package/dist/src/backend/domains/workspace/query/workspace-query.service.test.js +269 -65
  205. package/dist/src/backend/domains/workspace/query/workspace-query.service.test.js.map +1 -1
  206. package/dist/src/backend/domains/workspace/state/flow-state.d.ts.map +1 -1
  207. package/dist/src/backend/domains/workspace/state/flow-state.js +9 -1
  208. package/dist/src/backend/domains/workspace/state/flow-state.js.map +1 -1
  209. package/dist/src/backend/domains/workspace/state/flow-state.test.js +22 -2
  210. package/dist/src/backend/domains/workspace/state/flow-state.test.js.map +1 -1
  211. package/dist/src/backend/domains/workspace/state/kanban-state.test.js +169 -202
  212. package/dist/src/backend/domains/workspace/state/kanban-state.test.js.map +1 -1
  213. package/dist/src/backend/interceptors/branch-rename.interceptor.test.d.ts +2 -0
  214. package/dist/src/backend/interceptors/branch-rename.interceptor.test.d.ts.map +1 -0
  215. package/dist/src/backend/interceptors/branch-rename.interceptor.test.js +79 -0
  216. package/dist/src/backend/interceptors/branch-rename.interceptor.test.js.map +1 -0
  217. package/dist/src/backend/interceptors/branch-rename.utils.d.ts +8 -0
  218. package/dist/src/backend/interceptors/branch-rename.utils.d.ts.map +1 -0
  219. package/dist/src/backend/interceptors/branch-rename.utils.js +34 -0
  220. package/dist/src/backend/interceptors/branch-rename.utils.js.map +1 -0
  221. package/dist/src/backend/interceptors/conversation-rename.interceptor.test.d.ts +2 -0
  222. package/dist/src/backend/interceptors/conversation-rename.interceptor.test.d.ts.map +1 -0
  223. package/dist/src/backend/interceptors/conversation-rename.interceptor.test.js +116 -0
  224. package/dist/src/backend/interceptors/conversation-rename.interceptor.test.js.map +1 -0
  225. package/dist/src/backend/interceptors/index.d.ts.map +1 -1
  226. package/dist/src/backend/interceptors/index.js +4 -0
  227. package/dist/src/backend/interceptors/index.js.map +1 -1
  228. package/dist/src/backend/interceptors/pre-pr-rename.interceptor.d.ts +5 -0
  229. package/dist/src/backend/interceptors/pre-pr-rename.interceptor.d.ts.map +1 -0
  230. package/dist/src/backend/interceptors/pre-pr-rename.interceptor.js +211 -0
  231. package/dist/src/backend/interceptors/pre-pr-rename.interceptor.js.map +1 -0
  232. package/dist/src/backend/interceptors/pre-pr-rename.interceptor.test.d.ts +2 -0
  233. package/dist/src/backend/interceptors/pre-pr-rename.interceptor.test.d.ts.map +1 -0
  234. package/dist/src/backend/interceptors/pre-pr-rename.interceptor.test.js +304 -0
  235. package/dist/src/backend/interceptors/pre-pr-rename.interceptor.test.js.map +1 -0
  236. package/dist/src/backend/interceptors/pre-push-rename.interceptor.d.ts +3 -0
  237. package/dist/src/backend/interceptors/pre-push-rename.interceptor.d.ts.map +1 -0
  238. package/dist/src/backend/interceptors/pre-push-rename.interceptor.js +81 -0
  239. package/dist/src/backend/interceptors/pre-push-rename.interceptor.js.map +1 -0
  240. package/dist/src/backend/interceptors/pre-push-rename.interceptor.test.d.ts +2 -0
  241. package/dist/src/backend/interceptors/pre-push-rename.interceptor.test.d.ts.map +1 -0
  242. package/dist/src/backend/interceptors/pre-push-rename.interceptor.test.js +130 -0
  243. package/dist/src/backend/interceptors/pre-push-rename.interceptor.test.js.map +1 -0
  244. package/dist/src/backend/lib/git-status-parser.test.d.ts +2 -0
  245. package/dist/src/backend/lib/git-status-parser.test.d.ts.map +1 -0
  246. package/dist/src/backend/{trpc/workspace.trpc.test.js → lib/git-status-parser.test.js} +1 -1
  247. package/dist/src/backend/lib/git-status-parser.test.js.map +1 -0
  248. package/dist/src/backend/lib/provider-cli-availability.d.ts +15 -0
  249. package/dist/src/backend/lib/provider-cli-availability.d.ts.map +1 -0
  250. package/dist/src/backend/lib/provider-cli-availability.js +26 -0
  251. package/dist/src/backend/lib/provider-cli-availability.js.map +1 -0
  252. package/dist/src/backend/lib/provider-cli-availability.test.d.ts +2 -0
  253. package/dist/src/backend/lib/provider-cli-availability.test.d.ts.map +1 -0
  254. package/dist/src/backend/lib/provider-cli-availability.test.js +39 -0
  255. package/dist/src/backend/lib/provider-cli-availability.test.js.map +1 -0
  256. package/dist/src/backend/lib/session-summaries.d.ts.map +1 -1
  257. package/dist/src/backend/lib/session-summaries.js +1 -0
  258. package/dist/src/backend/lib/session-summaries.js.map +1 -1
  259. package/dist/src/backend/migrate.d.ts.map +1 -1
  260. package/dist/src/backend/migrate.js +13 -3
  261. package/dist/src/backend/migrate.js.map +1 -1
  262. package/dist/src/backend/migrate.test.js +44 -0
  263. package/dist/src/backend/migrate.test.js.map +1 -1
  264. package/dist/src/backend/orchestration/cli-health.service.d.ts +18 -0
  265. package/dist/src/backend/orchestration/cli-health.service.d.ts.map +1 -1
  266. package/dist/src/backend/orchestration/cli-health.service.js +106 -3
  267. package/dist/src/backend/orchestration/cli-health.service.js.map +1 -1
  268. package/dist/src/backend/orchestration/cli-health.service.test.js +22 -0
  269. package/dist/src/backend/orchestration/cli-health.service.test.js.map +1 -1
  270. package/dist/src/backend/orchestration/data-backup.service.d.ts.map +1 -1
  271. package/dist/src/backend/orchestration/data-backup.service.js +25 -1
  272. package/dist/src/backend/orchestration/data-backup.service.js.map +1 -1
  273. package/dist/src/backend/orchestration/data-backup.service.test.js +25 -9
  274. package/dist/src/backend/orchestration/data-backup.service.test.js.map +1 -1
  275. package/dist/src/backend/orchestration/decision-log-query.service.test.d.ts +2 -0
  276. package/dist/src/backend/orchestration/decision-log-query.service.test.d.ts.map +1 -0
  277. package/dist/src/backend/orchestration/decision-log-query.service.test.js +44 -0
  278. package/dist/src/backend/orchestration/decision-log-query.service.test.js.map +1 -0
  279. package/dist/src/backend/orchestration/event-collector.orchestrator.d.ts +5 -1
  280. package/dist/src/backend/orchestration/event-collector.orchestrator.d.ts.map +1 -1
  281. package/dist/src/backend/orchestration/event-collector.orchestrator.js +139 -8
  282. package/dist/src/backend/orchestration/event-collector.orchestrator.js.map +1 -1
  283. package/dist/src/backend/orchestration/event-collector.orchestrator.test.js +143 -11
  284. package/dist/src/backend/orchestration/event-collector.orchestrator.test.js.map +1 -1
  285. package/dist/src/backend/orchestration/linear-config.helper.d.ts +9 -0
  286. package/dist/src/backend/orchestration/linear-config.helper.d.ts.map +1 -0
  287. package/dist/src/backend/orchestration/linear-config.helper.js +23 -0
  288. package/dist/src/backend/orchestration/linear-config.helper.js.map +1 -0
  289. package/dist/src/backend/orchestration/workspace-archive.orchestrator.d.ts +3 -0
  290. package/dist/src/backend/orchestration/workspace-archive.orchestrator.d.ts.map +1 -1
  291. package/dist/src/backend/orchestration/workspace-archive.orchestrator.js +40 -34
  292. package/dist/src/backend/orchestration/workspace-archive.orchestrator.js.map +1 -1
  293. package/dist/src/backend/orchestration/workspace-archive.orchestrator.test.js +19 -1
  294. package/dist/src/backend/orchestration/workspace-archive.orchestrator.test.js.map +1 -1
  295. package/dist/src/backend/orchestration/workspace-init.orchestrator.d.ts.map +1 -1
  296. package/dist/src/backend/orchestration/workspace-init.orchestrator.js +275 -40
  297. package/dist/src/backend/orchestration/workspace-init.orchestrator.js.map +1 -1
  298. package/dist/src/backend/prompts/quick-actions.test.d.ts +2 -0
  299. package/dist/src/backend/prompts/quick-actions.test.d.ts.map +1 -0
  300. package/dist/src/backend/prompts/quick-actions.test.js +59 -0
  301. package/dist/src/backend/prompts/quick-actions.test.js.map +1 -0
  302. package/dist/src/backend/prompts/ratchet-dispatch.d.ts.map +1 -1
  303. package/dist/src/backend/prompts/ratchet-dispatch.js +3 -1
  304. package/dist/src/backend/prompts/ratchet-dispatch.js.map +1 -1
  305. package/dist/src/backend/resource_accessors/project.accessor.d.ts +7 -1
  306. package/dist/src/backend/resource_accessors/project.accessor.d.ts.map +1 -1
  307. package/dist/src/backend/resource_accessors/project.accessor.js +8 -1
  308. package/dist/src/backend/resource_accessors/project.accessor.js.map +1 -1
  309. package/dist/src/backend/resource_accessors/user-settings.accessor.d.ts +3 -1
  310. package/dist/src/backend/resource_accessors/user-settings.accessor.d.ts.map +1 -1
  311. package/dist/src/backend/resource_accessors/user-settings.accessor.js +4 -0
  312. package/dist/src/backend/resource_accessors/user-settings.accessor.js.map +1 -1
  313. package/dist/src/backend/resource_accessors/workspace.accessor.d.ts +4 -1
  314. package/dist/src/backend/resource_accessors/workspace.accessor.d.ts.map +1 -1
  315. package/dist/src/backend/resource_accessors/workspace.accessor.js +3 -0
  316. package/dist/src/backend/resource_accessors/workspace.accessor.js.map +1 -1
  317. package/dist/src/backend/routers/websocket/chat.handler.test.js +162 -43
  318. package/dist/src/backend/routers/websocket/chat.handler.test.js.map +1 -1
  319. package/dist/src/backend/routers/websocket/index.d.ts +1 -0
  320. package/dist/src/backend/routers/websocket/index.d.ts.map +1 -1
  321. package/dist/src/backend/routers/websocket/index.js +1 -0
  322. package/dist/src/backend/routers/websocket/index.js.map +1 -1
  323. package/dist/src/backend/routers/websocket/setup-terminal.handler.d.ts +6 -0
  324. package/dist/src/backend/routers/websocket/setup-terminal.handler.d.ts.map +1 -0
  325. package/dist/src/backend/routers/websocket/setup-terminal.handler.js +108 -0
  326. package/dist/src/backend/routers/websocket/setup-terminal.handler.js.map +1 -0
  327. package/dist/src/backend/routers/websocket/terminal.handler.test.js +166 -0
  328. package/dist/src/backend/routers/websocket/terminal.handler.test.js.map +1 -1
  329. package/dist/src/backend/server.d.ts.map +1 -1
  330. package/dist/src/backend/server.js +18 -10
  331. package/dist/src/backend/server.js.map +1 -1
  332. package/dist/src/backend/server.upgrade.test.js +2 -0
  333. package/dist/src/backend/server.upgrade.test.js.map +1 -1
  334. package/dist/src/backend/services/config.service.d.ts +2 -0
  335. package/dist/src/backend/services/config.service.d.ts.map +1 -1
  336. package/dist/src/backend/services/config.service.js +4 -0
  337. package/dist/src/backend/services/config.service.js.map +1 -1
  338. package/dist/src/backend/services/constants.d.ts +4 -0
  339. package/dist/src/backend/services/constants.d.ts.map +1 -1
  340. package/dist/src/backend/services/constants.js +4 -0
  341. package/dist/src/backend/services/constants.js.map +1 -1
  342. package/dist/src/backend/services/crypto.service.d.ts +10 -0
  343. package/dist/src/backend/services/crypto.service.d.ts.map +1 -0
  344. package/dist/src/backend/services/crypto.service.js +61 -0
  345. package/dist/src/backend/services/crypto.service.js.map +1 -0
  346. package/dist/src/backend/services/env-schemas.d.ts +1 -0
  347. package/dist/src/backend/services/env-schemas.d.ts.map +1 -1
  348. package/dist/src/backend/services/env-schemas.js +1 -0
  349. package/dist/src/backend/services/env-schemas.js.map +1 -1
  350. package/dist/src/backend/services/factory-config.service.test.d.ts +2 -0
  351. package/dist/src/backend/services/factory-config.service.test.d.ts.map +1 -0
  352. package/dist/src/backend/{trpc/project.trpc.test.js → services/factory-config.service.test.js} +1 -1
  353. package/dist/src/backend/services/factory-config.service.test.js.map +1 -0
  354. package/dist/src/backend/services/git-clone.service.d.ts +23 -0
  355. package/dist/src/backend/services/git-clone.service.d.ts.map +1 -0
  356. package/dist/src/backend/services/git-clone.service.js +67 -0
  357. package/dist/src/backend/services/git-clone.service.js.map +1 -0
  358. package/dist/src/backend/services/git-ops.service.test.d.ts +2 -0
  359. package/dist/src/backend/services/git-ops.service.test.d.ts.map +1 -0
  360. package/dist/src/backend/services/git-ops.service.test.js +133 -0
  361. package/dist/src/backend/services/git-ops.service.test.js.map +1 -0
  362. package/dist/src/backend/services/notification.service.test.d.ts +2 -0
  363. package/dist/src/backend/services/notification.service.test.d.ts.map +1 -0
  364. package/dist/src/backend/services/notification.service.test.js +118 -0
  365. package/dist/src/backend/services/notification.service.test.js.map +1 -0
  366. package/dist/src/backend/services/rate-limiter.service.test.d.ts +2 -0
  367. package/dist/src/backend/services/rate-limiter.service.test.d.ts.map +1 -0
  368. package/dist/src/backend/services/rate-limiter.service.test.js +92 -0
  369. package/dist/src/backend/services/rate-limiter.service.test.js.map +1 -0
  370. package/dist/src/backend/services/run-script-proxy.service.d.ts +12 -0
  371. package/dist/src/backend/services/run-script-proxy.service.d.ts.map +1 -0
  372. package/dist/src/backend/services/run-script-proxy.service.js +210 -0
  373. package/dist/src/backend/services/run-script-proxy.service.js.map +1 -0
  374. package/dist/src/backend/services/run-script-proxy.service.test.d.ts +2 -0
  375. package/dist/src/backend/services/run-script-proxy.service.test.d.ts.map +1 -0
  376. package/dist/src/backend/services/run-script-proxy.service.test.js +133 -0
  377. package/dist/src/backend/services/run-script-proxy.service.test.js.map +1 -0
  378. package/dist/src/backend/trpc/admin.router.test.d.ts +2 -0
  379. package/dist/src/backend/trpc/admin.router.test.d.ts.map +1 -0
  380. package/dist/src/backend/trpc/admin.router.test.js +238 -0
  381. package/dist/src/backend/trpc/admin.router.test.js.map +1 -0
  382. package/dist/src/backend/trpc/admin.trpc.d.ts +32 -4
  383. package/dist/src/backend/trpc/admin.trpc.d.ts.map +1 -1
  384. package/dist/src/backend/trpc/admin.trpc.js +18 -0
  385. package/dist/src/backend/trpc/admin.trpc.js.map +1 -1
  386. package/dist/src/backend/trpc/decision-log.router.test.d.ts +2 -0
  387. package/dist/src/backend/trpc/decision-log.router.test.d.ts.map +1 -0
  388. package/dist/src/backend/trpc/decision-log.router.test.js +37 -0
  389. package/dist/src/backend/trpc/decision-log.router.test.js.map +1 -0
  390. package/dist/src/backend/trpc/github.router.test.d.ts +2 -0
  391. package/dist/src/backend/trpc/github.router.test.d.ts.map +1 -0
  392. package/dist/src/backend/trpc/github.router.test.js +89 -0
  393. package/dist/src/backend/trpc/github.router.test.js.map +1 -0
  394. package/dist/src/backend/trpc/index.d.ts +254 -9
  395. package/dist/src/backend/trpc/index.d.ts.map +1 -1
  396. package/dist/src/backend/trpc/index.js +2 -0
  397. package/dist/src/backend/trpc/index.js.map +1 -1
  398. package/dist/src/backend/trpc/linear.router.test.d.ts +2 -0
  399. package/dist/src/backend/trpc/linear.router.test.d.ts.map +1 -0
  400. package/dist/src/backend/trpc/linear.router.test.js +101 -0
  401. package/dist/src/backend/trpc/linear.router.test.js.map +1 -0
  402. package/dist/src/backend/trpc/linear.trpc.d.ts +44 -0
  403. package/dist/src/backend/trpc/linear.trpc.d.ts.map +1 -0
  404. package/dist/src/backend/trpc/linear.trpc.js +69 -0
  405. package/dist/src/backend/trpc/linear.trpc.js.map +1 -0
  406. package/dist/src/backend/trpc/pr-review.router.test.d.ts +2 -0
  407. package/dist/src/backend/trpc/pr-review.router.test.d.ts.map +1 -0
  408. package/dist/src/backend/trpc/pr-review.router.test.js +86 -0
  409. package/dist/src/backend/trpc/pr-review.router.test.js.map +1 -0
  410. package/dist/src/backend/trpc/procedures/project-scoped.test.d.ts +2 -0
  411. package/dist/src/backend/trpc/procedures/project-scoped.test.d.ts.map +1 -0
  412. package/dist/src/backend/trpc/procedures/project-scoped.test.js +17 -0
  413. package/dist/src/backend/trpc/procedures/project-scoped.test.js.map +1 -0
  414. package/dist/src/backend/trpc/project.router.test.d.ts +2 -0
  415. package/dist/src/backend/trpc/project.router.test.d.ts.map +1 -0
  416. package/dist/src/backend/trpc/project.router.test.js +151 -0
  417. package/dist/src/backend/trpc/project.router.test.js.map +1 -0
  418. package/dist/src/backend/trpc/project.trpc.d.ts +86 -5
  419. package/dist/src/backend/trpc/project.trpc.d.ts.map +1 -1
  420. package/dist/src/backend/trpc/project.trpc.js +92 -18
  421. package/dist/src/backend/trpc/project.trpc.js.map +1 -1
  422. package/dist/src/backend/trpc/session.router.test.d.ts +2 -0
  423. package/dist/src/backend/trpc/session.router.test.d.ts.map +1 -0
  424. package/dist/src/backend/trpc/session.router.test.js +162 -0
  425. package/dist/src/backend/trpc/session.router.test.js.map +1 -0
  426. package/dist/src/backend/trpc/session.trpc.d.ts +12 -0
  427. package/dist/src/backend/trpc/session.trpc.d.ts.map +1 -1
  428. package/dist/src/backend/trpc/session.trpc.js +9 -0
  429. package/dist/src/backend/trpc/session.trpc.js.map +1 -1
  430. package/dist/src/backend/trpc/user-settings.router.test.d.ts +2 -0
  431. package/dist/src/backend/trpc/user-settings.router.test.d.ts.map +1 -0
  432. package/dist/src/backend/trpc/user-settings.router.test.js +60 -0
  433. package/dist/src/backend/trpc/user-settings.router.test.js.map +1 -0
  434. package/dist/src/backend/trpc/user-settings.trpc.d.ts +7 -1
  435. package/dist/src/backend/trpc/user-settings.trpc.d.ts.map +1 -1
  436. package/dist/src/backend/trpc/user-settings.trpc.js +3 -1
  437. package/dist/src/backend/trpc/user-settings.trpc.js.map +1 -1
  438. package/dist/src/backend/trpc/workspace/files.router.test.d.ts +2 -0
  439. package/dist/src/backend/trpc/workspace/files.router.test.d.ts.map +1 -0
  440. package/dist/src/backend/trpc/workspace/files.router.test.js +117 -0
  441. package/dist/src/backend/trpc/workspace/files.router.test.js.map +1 -0
  442. package/dist/src/backend/trpc/workspace/git.router.test.d.ts +2 -0
  443. package/dist/src/backend/trpc/workspace/git.router.test.d.ts.map +1 -0
  444. package/dist/src/backend/trpc/workspace/git.router.test.js +130 -0
  445. package/dist/src/backend/trpc/workspace/git.router.test.js.map +1 -0
  446. package/dist/src/backend/trpc/workspace/git.trpc.d.ts +10 -0
  447. package/dist/src/backend/trpc/workspace/git.trpc.d.ts.map +1 -1
  448. package/dist/src/backend/trpc/workspace/git.trpc.js +25 -0
  449. package/dist/src/backend/trpc/workspace/git.trpc.js.map +1 -1
  450. package/dist/src/backend/trpc/workspace/ide.router.test.d.ts +2 -0
  451. package/dist/src/backend/trpc/workspace/ide.router.test.d.ts.map +1 -0
  452. package/dist/src/backend/trpc/workspace/ide.router.test.js +71 -0
  453. package/dist/src/backend/trpc/workspace/ide.router.test.js.map +1 -0
  454. package/dist/src/backend/trpc/workspace/init.router.test.d.ts +2 -0
  455. package/dist/src/backend/trpc/workspace/init.router.test.d.ts.map +1 -0
  456. package/dist/src/backend/trpc/workspace/init.router.test.js +136 -0
  457. package/dist/src/backend/trpc/workspace/init.router.test.js.map +1 -0
  458. package/dist/src/backend/trpc/workspace/init.trpc.d.ts +3 -0
  459. package/dist/src/backend/trpc/workspace/init.trpc.d.ts.map +1 -1
  460. package/dist/src/backend/trpc/workspace/run-script.router.test.d.ts +2 -0
  461. package/dist/src/backend/trpc/workspace/run-script.router.test.d.ts.map +1 -0
  462. package/dist/src/backend/trpc/workspace/run-script.router.test.js +106 -0
  463. package/dist/src/backend/trpc/workspace/run-script.router.test.js.map +1 -0
  464. package/dist/src/backend/trpc/workspace/run-script.trpc.d.ts +2 -0
  465. package/dist/src/backend/trpc/workspace/run-script.trpc.d.ts.map +1 -1
  466. package/dist/src/backend/trpc/workspace/run-script.trpc.js +1 -0
  467. package/dist/src/backend/trpc/workspace/run-script.trpc.js.map +1 -1
  468. package/dist/src/backend/trpc/workspace/workspace-helpers.d.ts +8 -0
  469. package/dist/src/backend/trpc/workspace/workspace-helpers.d.ts.map +1 -1
  470. package/dist/src/backend/trpc/workspace/workspace-helpers.test.d.ts +2 -0
  471. package/dist/src/backend/trpc/workspace/workspace-helpers.test.d.ts.map +1 -0
  472. package/dist/src/backend/trpc/workspace/workspace-helpers.test.js +54 -0
  473. package/dist/src/backend/trpc/workspace/workspace-helpers.test.js.map +1 -0
  474. package/dist/src/backend/trpc/workspace.router.test.d.ts +2 -0
  475. package/dist/src/backend/trpc/workspace.router.test.d.ts.map +1 -0
  476. package/dist/src/backend/trpc/workspace.router.test.js +228 -0
  477. package/dist/src/backend/trpc/workspace.router.test.js.map +1 -0
  478. package/dist/src/backend/trpc/workspace.trpc.d.ts +81 -6
  479. package/dist/src/backend/trpc/workspace.trpc.d.ts.map +1 -1
  480. package/dist/src/backend/trpc/workspace.trpc.js +78 -6
  481. package/dist/src/backend/trpc/workspace.trpc.js.map +1 -1
  482. package/dist/src/cli/index.js +17 -91
  483. package/dist/src/cli/index.js.map +1 -1
  484. package/dist/src/cli/proxy.d.ts +68 -0
  485. package/dist/src/cli/proxy.d.ts.map +1 -0
  486. package/dist/src/cli/proxy.js +825 -0
  487. package/dist/src/cli/proxy.js.map +1 -0
  488. package/dist/src/cli/proxy.test.d.ts +2 -0
  489. package/dist/src/cli/proxy.test.d.ts.map +1 -0
  490. package/dist/src/cli/proxy.test.js +276 -0
  491. package/dist/src/cli/proxy.test.js.map +1 -0
  492. package/dist/src/cli/runtime-utils.d.ts +9 -0
  493. package/dist/src/cli/runtime-utils.d.ts.map +1 -0
  494. package/dist/src/cli/runtime-utils.js +86 -0
  495. package/dist/src/cli/runtime-utils.js.map +1 -0
  496. package/dist/src/shared/chat-capabilities.d.ts +1 -0
  497. package/dist/src/shared/chat-capabilities.d.ts.map +1 -1
  498. package/dist/src/shared/chat-capabilities.js +24 -0
  499. package/dist/src/shared/chat-capabilities.js.map +1 -1
  500. package/dist/src/shared/core/enums.d.ts +6 -0
  501. package/dist/src/shared/core/enums.d.ts.map +1 -1
  502. package/dist/src/shared/core/enums.js +5 -0
  503. package/dist/src/shared/core/enums.js.map +1 -1
  504. package/dist/src/shared/core/index.d.ts +1 -1
  505. package/dist/src/shared/core/index.d.ts.map +1 -1
  506. package/dist/src/shared/core/index.js +1 -1
  507. package/dist/src/shared/core/index.js.map +1 -1
  508. package/dist/src/shared/github-types.d.ts +1 -1
  509. package/dist/src/shared/github-types.d.ts.map +1 -1
  510. package/dist/src/shared/proxy-utils.d.ts +61 -0
  511. package/dist/src/shared/proxy-utils.d.ts.map +1 -0
  512. package/dist/src/shared/proxy-utils.js +334 -0
  513. package/dist/src/shared/proxy-utils.js.map +1 -0
  514. package/dist/src/shared/schemas/export-data.schema.d.ts +39 -1
  515. package/dist/src/shared/schemas/export-data.schema.d.ts.map +1 -1
  516. package/dist/src/shared/schemas/export-data.schema.js +11 -2
  517. package/dist/src/shared/schemas/export-data.schema.js.map +1 -1
  518. package/dist/src/shared/schemas/issue-tracker-config.schema.d.ts +35 -0
  519. package/dist/src/shared/schemas/issue-tracker-config.schema.d.ts.map +1 -0
  520. package/dist/src/shared/schemas/issue-tracker-config.schema.js +29 -0
  521. package/dist/src/shared/schemas/issue-tracker-config.schema.js.map +1 -0
  522. package/dist/src/shared/session-runtime.d.ts +8 -0
  523. package/dist/src/shared/session-runtime.d.ts.map +1 -1
  524. package/dist/src/shared/session-runtime.js +40 -0
  525. package/dist/src/shared/session-runtime.js.map +1 -1
  526. package/dist/src/shared/workspace-words.d.ts +1 -0
  527. package/dist/src/shared/workspace-words.d.ts.map +1 -1
  528. package/dist/src/shared/workspace-words.js +77 -0
  529. package/dist/src/shared/workspace-words.js.map +1 -1
  530. package/dist/tsconfig.backend.tsbuildinfo +1 -1
  531. package/package.json +49 -41
  532. package/prisma/migrations/20260217190642_add_linear_integration/migration.sql +34 -0
  533. package/prisma/migrations/20260220110000_add_user_permission_presets/migration.sql +2 -0
  534. package/prisma/schema.prisma +21 -0
  535. package/prompts/ratchet/dispatch.md +5 -2
  536. package/prompts/workflows/pr-review-fix.md +2 -1
  537. package/dist/client/assets/_basePickBy-DOa44aLB.js +0 -1
  538. package/dist/client/assets/channel-v55vPUhK.js +0 -1
  539. package/dist/client/assets/classDiagram-2ON5EDUG-DV-E9odE.js +0 -1
  540. package/dist/client/assets/classDiagram-v2-WZHVMYZB-DV-E9odE.js +0 -1
  541. package/dist/client/assets/clone-DQgzPMba.js +0 -1
  542. package/dist/client/assets/index-CzQJ6qnR.css +0 -1
  543. package/dist/client/assets/index-D2gG7VAV.js +0 -447
  544. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-CuSoER-j.js +0 -1
  545. package/dist/client/assets/terminal-instance-DKydBe-u.js +0 -1
  546. package/dist/client/assets/treemap-KMMF4GRG-BH9wTzrS.js +0 -128
  547. package/dist/src/backend/trpc/project.trpc.test.d.ts +0 -2
  548. package/dist/src/backend/trpc/project.trpc.test.d.ts.map +0 -1
  549. package/dist/src/backend/trpc/project.trpc.test.js.map +0 -1
  550. package/dist/src/backend/trpc/workspace.trpc.test.d.ts +0 -2
  551. package/dist/src/backend/trpc/workspace.trpc.test.d.ts.map +0 -1
  552. package/dist/src/backend/trpc/workspace.trpc.test.js.map +0 -1
@@ -0,0 +1,825 @@
1
+ import { execFile, spawn } from 'node:child_process';
2
+ import { randomBytes, randomInt } from 'node:crypto';
3
+ import { existsSync } from 'node:fs';
4
+ import { createServer as createHttpServer } from 'node:http';
5
+ import { homedir } from 'node:os';
6
+ import { join } from 'node:path';
7
+ import { promisify } from 'node:util';
8
+ import chalk from 'chalk';
9
+ import * as QRCode from 'qrcode';
10
+ import { runMigrations as runDbMigrations } from '../backend/migrate.js';
11
+ import { appendBoundedOutputBuffer, authenticateRequest as authenticateProxyRequest, createSessionValue, createAuthCookie as createSharedAuthCookie, extractTryCloudflareUrl, matchesToken, mergeSetCookieValues, parseCookieHeader, proxyAuthenticatedHttpRequest, proxyAuthenticatedWebSocketUpgrade, signValue, startCloudflaredTunnel, toSafeRedirectPath, verifySessionValue, } from '../shared/proxy-utils.js';
12
+ import { ensureDataDir, findAvailablePort, treeKillAsync, waitForPort } from './runtime-utils.js';
13
+ const execFileAsync = promisify(execFile);
14
+ const PASSWORD_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
15
+ const PASSWORD_LENGTH = 6;
16
+ const SESSION_COOKIE_NAME = 'ff_proxy_session';
17
+ const LOGIN_PATH = '/__proxy_auth/login';
18
+ const LOCAL_HOST = '127.0.0.1';
19
+ const LOCKOUT_THRESHOLD_PER_IP = 5;
20
+ const LOCKOUT_WINDOW_MS = 5 * 60 * 1000;
21
+ const MAX_BRUTE_FORCE_TRACKED_IPS = 5000;
22
+ function supportsTerminalQrRendering(stream = process.stdout, env = process.env) {
23
+ if (!stream.isTTY) {
24
+ return false;
25
+ }
26
+ const term = (env.TERM || '').toLowerCase();
27
+ return term !== '' && term !== 'dumb';
28
+ }
29
+ async function tryRenderTerminalQrCode(url, renderQrCode = (text, options) => QRCode.toString(text, options)) {
30
+ try {
31
+ const output = await renderQrCode(url, {
32
+ type: 'terminal',
33
+ margin: 1,
34
+ small: true,
35
+ });
36
+ return output.trim() ? output : null;
37
+ }
38
+ catch {
39
+ return null;
40
+ }
41
+ }
42
+ async function printDirectLinkQrCode(url) {
43
+ if (!supportsTerminalQrRendering()) {
44
+ return;
45
+ }
46
+ const qr = await tryRenderTerminalQrCode(url);
47
+ if (!qr) {
48
+ return;
49
+ }
50
+ console.log(chalk.green('📱 Scan direct link:'));
51
+ process.stdout.write(`${qr}\n`);
52
+ }
53
+ function generatePassword(length = PASSWORD_LENGTH) {
54
+ let output = '';
55
+ for (let i = 0; i < length; i += 1) {
56
+ const index = randomInt(PASSWORD_CHARS.length);
57
+ output += PASSWORD_CHARS[index] ?? PASSWORD_CHARS[0] ?? 'A';
58
+ }
59
+ return output;
60
+ }
61
+ function generateMagicToken() {
62
+ return randomBytes(16).toString('hex');
63
+ }
64
+ function escapeHtml(value) {
65
+ return value
66
+ .replaceAll('&', '&amp;')
67
+ .replaceAll('<', '&lt;')
68
+ .replaceAll('>', '&gt;')
69
+ .replaceAll('"', '&quot;')
70
+ .replaceAll("'", '&#39;');
71
+ }
72
+ function matchesMagicToken(candidate, expected) {
73
+ return matchesToken(candidate, expected);
74
+ }
75
+ function matchesPassword(candidate, expected) {
76
+ return matchesMagicToken(candidate, expected);
77
+ }
78
+ function getClientIp(req) {
79
+ const cfConnectingIp = req.headers['cf-connecting-ip'];
80
+ if (typeof cfConnectingIp === 'string' && cfConnectingIp.trim()) {
81
+ return cfConnectingIp.trim();
82
+ }
83
+ const xForwardedFor = req.headers['x-forwarded-for'];
84
+ if (typeof xForwardedFor === 'string' && xForwardedFor.trim()) {
85
+ return xForwardedFor.split(',')[0]?.trim() || 'unknown';
86
+ }
87
+ return req.socket.remoteAddress || 'unknown';
88
+ }
89
+ class BruteForceGuard {
90
+ attemptsByIp = new Map();
91
+ evictStaleEntries(nowMs) {
92
+ for (const [ip, state] of this.attemptsByIp.entries()) {
93
+ const lockExpired = state.lockedUntilMs <= nowMs;
94
+ const stale = nowMs - state.lastSeenMs > LOCKOUT_WINDOW_MS;
95
+ if (lockExpired && stale) {
96
+ this.attemptsByIp.delete(ip);
97
+ }
98
+ }
99
+ while (this.attemptsByIp.size > MAX_BRUTE_FORCE_TRACKED_IPS) {
100
+ const oldest = this.attemptsByIp.keys().next().value;
101
+ if (!oldest) {
102
+ break;
103
+ }
104
+ this.attemptsByIp.delete(oldest);
105
+ }
106
+ }
107
+ isLocked(ip, nowMs = Date.now()) {
108
+ this.evictStaleEntries(nowMs);
109
+ const state = this.attemptsByIp.get(ip);
110
+ if (!state || state.lockedUntilMs <= 0) {
111
+ return { locked: false, retryAfterSeconds: 0 };
112
+ }
113
+ if (state.lockedUntilMs <= nowMs) {
114
+ this.attemptsByIp.delete(ip);
115
+ return { locked: false, retryAfterSeconds: 0 };
116
+ }
117
+ return {
118
+ locked: true,
119
+ retryAfterSeconds: Math.max(1, Math.ceil((state.lockedUntilMs - nowMs) / 1000)),
120
+ };
121
+ }
122
+ registerFailure(ip, nowMs = Date.now()) {
123
+ this.evictStaleEntries(nowMs);
124
+ const current = this.attemptsByIp.get(ip) ?? { failures: 0, lockedUntilMs: 0, lastSeenMs: 0 };
125
+ const normalized = current.lockedUntilMs > 0 && current.lockedUntilMs <= nowMs
126
+ ? { failures: 0, lockedUntilMs: 0, lastSeenMs: nowMs }
127
+ : current;
128
+ const nextFailures = normalized.failures + 1;
129
+ const ipLocked = nextFailures >= LOCKOUT_THRESHOLD_PER_IP;
130
+ this.attemptsByIp.delete(ip);
131
+ this.attemptsByIp.set(ip, {
132
+ failures: ipLocked ? 0 : nextFailures,
133
+ lockedUntilMs: ipLocked ? nowMs + LOCKOUT_WINDOW_MS : 0,
134
+ lastSeenMs: nowMs,
135
+ });
136
+ return { ipLocked };
137
+ }
138
+ }
139
+ function getDefaultDatabasePath() {
140
+ return process.env.DATABASE_PATH || join(homedir(), 'factory-factory', 'data.db');
141
+ }
142
+ function runMigrations(projectRoot, databasePath) {
143
+ const migrationsPath = join(projectRoot, 'prisma', 'migrations');
144
+ runDbMigrations({
145
+ databasePath,
146
+ migrationsPath,
147
+ log: () => {
148
+ },
149
+ });
150
+ }
151
+ async function killProcessTree(proc) {
152
+ if (!proc.pid) {
153
+ return;
154
+ }
155
+ try {
156
+ await treeKillAsync(proc.pid, 'SIGTERM');
157
+ }
158
+ catch {
159
+ }
160
+ }
161
+ async function ensureCloudflaredInstalled() {
162
+ try {
163
+ await execFileAsync('cloudflared', ['--version'], { timeout: 5000 });
164
+ }
165
+ catch {
166
+ console.error(chalk.red('\n❌ cloudflared is not installed.\n'));
167
+ console.error('Install it:');
168
+ console.error(' macOS: brew install cloudflared');
169
+ console.error(' Linux: curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -o /usr/local/bin/cloudflared && chmod +x /usr/local/bin/cloudflared');
170
+ console.error(' Windows: winget install Cloudflare.cloudflared');
171
+ console.error('\nThen re-run this command.');
172
+ process.exit(1);
173
+ }
174
+ }
175
+ async function startFactoryFactoryServer(params) {
176
+ const frontendDist = join(params.projectRoot, 'dist', 'client');
177
+ const backendDist = join(params.projectRoot, 'dist', 'src', 'backend', 'index.js');
178
+ if (!existsSync(frontendDist)) {
179
+ throw new Error('Frontend not built. Run `ff build` or `pnpm build` first.');
180
+ }
181
+ if (!existsSync(backendDist)) {
182
+ throw new Error('Backend not built. Run `ff build` or `pnpm build` first.');
183
+ }
184
+ const backend = spawn('node', [backendDist], {
185
+ cwd: params.projectRoot,
186
+ env: {
187
+ ...process.env,
188
+ NODE_ENV: 'production',
189
+ DATABASE_PATH: params.databasePath,
190
+ BACKEND_PORT: params.requestedPort.toString(),
191
+ BACKEND_HOST: LOCAL_HOST,
192
+ FF_RUN_SCRIPT_PROXY_ENABLED: '1',
193
+ FRONTEND_STATIC_PATH: frontendDist,
194
+ },
195
+ stdio: ['ignore', 'pipe', 'pipe'],
196
+ });
197
+ backend.stderr?.on('data', (chunk) => {
198
+ const message = chunk.toString().trim();
199
+ if (!message) {
200
+ return;
201
+ }
202
+ process.stderr.write(chalk.red(` [server] ${message}\n`));
203
+ });
204
+ let startupBuffer = '';
205
+ let actualPort;
206
+ try {
207
+ actualPort = await new Promise((resolve, reject) => {
208
+ const timeout = setTimeout(() => {
209
+ reject(new Error('Timed out waiting for server startup signal'));
210
+ }, 30_000);
211
+ timeout.unref?.();
212
+ const cleanup = () => {
213
+ clearTimeout(timeout);
214
+ backend.stdout?.off('data', onStdoutData);
215
+ backend.off('exit', onExit);
216
+ backend.off('error', onError);
217
+ };
218
+ const onStdoutData = (chunk) => {
219
+ startupBuffer += chunk.toString();
220
+ const match = startupBuffer.match(/BACKEND_PORT:(\d+)/);
221
+ if (match?.[1]) {
222
+ const parsed = Number.parseInt(match[1], 10);
223
+ if (Number.isNaN(parsed)) {
224
+ cleanup();
225
+ reject(new Error('Received invalid backend port from server startup'));
226
+ return;
227
+ }
228
+ cleanup();
229
+ resolve(parsed);
230
+ return;
231
+ }
232
+ if (startupBuffer.length > 4096) {
233
+ startupBuffer = startupBuffer.slice(-2048);
234
+ }
235
+ };
236
+ const onExit = (code, signal) => {
237
+ cleanup();
238
+ reject(new Error(`Server exited before startup completed (code: ${code ?? 'null'}, signal: ${signal ?? 'null'})`));
239
+ };
240
+ const onError = (error) => {
241
+ cleanup();
242
+ reject(new Error(`Failed to start backend server: ${error.message}`));
243
+ };
244
+ backend.stdout?.on('data', onStdoutData);
245
+ backend.once('exit', onExit);
246
+ backend.once('error', onError);
247
+ });
248
+ await waitForPort(actualPort, LOCAL_HOST);
249
+ }
250
+ catch (error) {
251
+ await killProcessTree(backend);
252
+ throw error;
253
+ }
254
+ return { process: backend, port: actualPort };
255
+ }
256
+ function createLoginPage(errorMessage) {
257
+ const escapedErrorMessage = errorMessage ? escapeHtml(errorMessage) : '';
258
+ const errorHtml = escapedErrorMessage
259
+ ? `<p style="color:#dc2626;font-family:system-ui, sans-serif;margin:0 0 16px 0;">${escapedErrorMessage}</p>`
260
+ : '';
261
+ return `<!doctype html>
262
+ <html lang="en">
263
+ <head>
264
+ <meta charset="utf-8" />
265
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
266
+ <title>Factory Factory Proxy</title>
267
+ <style>
268
+ :root { color-scheme: light; }
269
+ body {
270
+ margin: 0;
271
+ min-height: 100vh;
272
+ display: grid;
273
+ place-items: center;
274
+ background: radial-gradient(circle at top, #f5f7ff, #eef2ff 45%, #e2e8f0 100%);
275
+ font-family: system-ui, sans-serif;
276
+ color: #0f172a;
277
+ }
278
+ .card {
279
+ width: min(420px, calc(100vw - 24px));
280
+ background: rgba(255, 255, 255, 0.95);
281
+ border: 1px solid rgba(15, 23, 42, 0.08);
282
+ border-radius: 18px;
283
+ padding: 24px;
284
+ box-shadow: 0 20px 45px rgba(15, 23, 42, 0.15);
285
+ box-sizing: border-box;
286
+ }
287
+ h1 {
288
+ margin: 0 0 8px 0;
289
+ font-size: 22px;
290
+ font-weight: 650;
291
+ letter-spacing: -0.02em;
292
+ }
293
+ p {
294
+ margin: 0 0 20px 0;
295
+ color: #334155;
296
+ line-height: 1.5;
297
+ font-size: 14px;
298
+ }
299
+ form {
300
+ display: grid;
301
+ gap: 18px;
302
+ }
303
+ .otp {
304
+ display: grid;
305
+ grid-template-columns: repeat(6, minmax(0, 1fr));
306
+ gap: 10px;
307
+ }
308
+ .otp input {
309
+ width: 100%;
310
+ min-width: 0;
311
+ aspect-ratio: 1 / 1;
312
+ border: 1px solid #cbd5e1;
313
+ border-radius: 10px;
314
+ text-align: center;
315
+ font-size: 24px;
316
+ font-weight: 700;
317
+ text-transform: uppercase;
318
+ background: #fff;
319
+ box-sizing: border-box;
320
+ }
321
+ .otp input:focus {
322
+ outline: 2px solid #3b82f6;
323
+ outline-offset: 1px;
324
+ border-color: #3b82f6;
325
+ }
326
+ button {
327
+ border: 0;
328
+ border-radius: 10px;
329
+ padding: 12px 14px;
330
+ font-size: 14px;
331
+ font-weight: 600;
332
+ background: #0f172a;
333
+ color: #fff;
334
+ cursor: pointer;
335
+ }
336
+ button:hover { background: #1e293b; }
337
+ @media (max-width: 420px) {
338
+ .card {
339
+ border-radius: 14px;
340
+ padding: 16px;
341
+ }
342
+ .otp {
343
+ gap: 6px;
344
+ }
345
+ .otp input {
346
+ font-size: 20px;
347
+ }
348
+ }
349
+ </style>
350
+ </head>
351
+ <body>
352
+ <main class="card">
353
+ <h1>Enter Access Code</h1>
354
+ <p>This Factory Factory demo is password-protected.</p>
355
+ ${errorHtml}
356
+ <form method="post" action="${LOGIN_PATH}" id="login-form">
357
+ <input type="hidden" name="password" id="password" />
358
+ <div class="otp" aria-label="Password fields">
359
+ <input inputmode="text" maxlength="1" autocomplete="one-time-code" />
360
+ <input inputmode="text" maxlength="1" autocomplete="one-time-code" />
361
+ <input inputmode="text" maxlength="1" autocomplete="one-time-code" />
362
+ <input inputmode="text" maxlength="1" autocomplete="one-time-code" />
363
+ <input inputmode="text" maxlength="1" autocomplete="one-time-code" />
364
+ <input inputmode="text" maxlength="1" autocomplete="one-time-code" />
365
+ </div>
366
+ <button type="submit">Continue</button>
367
+ </form>
368
+ </main>
369
+ <script>
370
+ const form = document.getElementById('login-form');
371
+ const hidden = document.getElementById('password');
372
+ const inputs = Array.from(form.querySelectorAll('.otp input'));
373
+
374
+ const normalize = (value) => value.replace(/[^a-z0-9]/gi, '').toUpperCase().slice(-1);
375
+
376
+ inputs.forEach((input, index) => {
377
+ input.addEventListener('input', () => {
378
+ input.value = normalize(input.value);
379
+ if (input.value && index < inputs.length - 1) {
380
+ inputs[index + 1].focus();
381
+ }
382
+ });
383
+
384
+ input.addEventListener('keydown', (event) => {
385
+ if (event.key === 'Backspace' && !input.value && index > 0) {
386
+ inputs[index - 1].focus();
387
+ }
388
+ });
389
+
390
+ input.addEventListener('paste', (event) => {
391
+ const pasted = (event.clipboardData || window.clipboardData).getData('text') || '';
392
+ const chars = pasted.replace(/[^a-z0-9]/gi, '').toUpperCase().slice(0, inputs.length).split('');
393
+ if (chars.length === 0) {
394
+ return;
395
+ }
396
+ event.preventDefault();
397
+ inputs.forEach((otpInput, otpIndex) => {
398
+ otpInput.value = chars[otpIndex] || '';
399
+ });
400
+ const nextIndex = Math.min(chars.length, inputs.length - 1);
401
+ inputs[nextIndex].focus();
402
+ });
403
+ });
404
+
405
+ form.addEventListener('submit', (event) => {
406
+ const value = inputs.map((input) => normalize(input.value)).join('');
407
+ hidden.value = value;
408
+ if (value.length !== inputs.length) {
409
+ event.preventDefault();
410
+ inputs.find((input) => !input.value)?.focus();
411
+ }
412
+ });
413
+
414
+ inputs[0].focus();
415
+ </script>
416
+ </body>
417
+ </html>`;
418
+ }
419
+ function parseFormBody(rawBody) {
420
+ const params = new URLSearchParams(rawBody);
421
+ const output = {};
422
+ for (const [key, value] of params.entries()) {
423
+ output[key] = value;
424
+ }
425
+ return output;
426
+ }
427
+ function writeRateLimitResponse(res, retryAfterSeconds) {
428
+ res.statusCode = 429;
429
+ res.setHeader('Content-Type', 'text/html; charset=utf-8');
430
+ res.end(createLoginPage(`Too many attempts. Try again in ${retryAfterSeconds} seconds.`));
431
+ }
432
+ function writeUnauthorizedResponse(res, message, ipLocked = false) {
433
+ res.statusCode = ipLocked ? 429 : 401;
434
+ res.setHeader('Content-Type', 'text/html; charset=utf-8');
435
+ res.end(createLoginPage(message));
436
+ }
437
+ function createAuthCookie(session) {
438
+ return createSharedAuthCookie(session, SESSION_COOKIE_NAME);
439
+ }
440
+ function authenticateRequest(params) {
441
+ return authenticateProxyRequest({
442
+ req: params.req,
443
+ cookieSecret: params.cookieSecret,
444
+ authToken: params.magicToken,
445
+ sessionCookieName: SESSION_COOKIE_NAME,
446
+ });
447
+ }
448
+ async function readRequestBody(req) {
449
+ const chunks = [];
450
+ for await (const chunk of req) {
451
+ const value = typeof chunk === 'string' ? Buffer.from(chunk) : chunk;
452
+ chunks.push(value);
453
+ const size = chunks.reduce((acc, current) => acc + current.length, 0);
454
+ if (size > 4096) {
455
+ throw new Error('Request body too large');
456
+ }
457
+ }
458
+ return Buffer.concat(chunks).toString('utf8');
459
+ }
460
+ function setSessionCookie(res, cookieSecret) {
461
+ const session = createSessionValue(cookieSecret);
462
+ res.setHeader('Set-Cookie', createAuthCookie(session));
463
+ }
464
+ function writeLoginPage(res) {
465
+ res.statusCode = 200;
466
+ res.setHeader('Content-Type', 'text/html; charset=utf-8');
467
+ res.end(createLoginPage());
468
+ }
469
+ function registerFailureAndRespond(params) {
470
+ const failure = params.guard.registerFailure(params.ip);
471
+ if (failure.ipLocked) {
472
+ const retry = params.guard.isLocked(params.ip);
473
+ writeUnauthorizedResponse(params.res, `Too many failed attempts. Try again in ${retry.retryAfterSeconds} seconds.`, true);
474
+ return 'handled';
475
+ }
476
+ writeUnauthorizedResponse(params.res, params.message);
477
+ return 'handled';
478
+ }
479
+ async function handleLoginSubmission(params) {
480
+ if (params.lockState.locked) {
481
+ writeRateLimitResponse(params.res, params.lockState.retryAfterSeconds);
482
+ return 'handled';
483
+ }
484
+ let submittedPassword = '';
485
+ try {
486
+ const body = await readRequestBody(params.req);
487
+ const form = parseFormBody(body);
488
+ submittedPassword = (form.password || '').trim().toUpperCase();
489
+ }
490
+ catch {
491
+ submittedPassword = '';
492
+ }
493
+ if (submittedPassword && matchesPassword(submittedPassword, params.password)) {
494
+ setSessionCookie(params.res, params.cookieSecret);
495
+ params.res.statusCode = 302;
496
+ params.res.setHeader('Location', '/');
497
+ params.res.end();
498
+ return 'handled';
499
+ }
500
+ return registerFailureAndRespond({
501
+ guard: params.guard,
502
+ ip: params.ip,
503
+ res: params.res,
504
+ message: 'Invalid password. Please try again.',
505
+ });
506
+ }
507
+ async function handleAuthHttpRequest(params) {
508
+ const ip = getClientIp(params.req);
509
+ const lockState = params.guard.isLocked(ip);
510
+ const isLoginPath = params.req.url?.startsWith(LOGIN_PATH) ?? false;
511
+ const isLoginSubmission = params.req.method === 'POST' && isLoginPath;
512
+ if (lockState.locked && !isLoginSubmission) {
513
+ writeRateLimitResponse(params.res, lockState.retryAfterSeconds);
514
+ return;
515
+ }
516
+ const auth = authenticateRequest({
517
+ req: params.req,
518
+ cookieSecret: params.cookieSecret,
519
+ magicToken: params.magicToken,
520
+ });
521
+ if (isLoginSubmission) {
522
+ await handleLoginSubmission({
523
+ req: params.req,
524
+ res: params.res,
525
+ lockState,
526
+ guard: params.guard,
527
+ ip,
528
+ password: params.password,
529
+ cookieSecret: params.cookieSecret,
530
+ });
531
+ return;
532
+ }
533
+ if (!auth.authenticated) {
534
+ if (auth.invalidToken) {
535
+ registerFailureAndRespond({
536
+ guard: params.guard,
537
+ ip,
538
+ res: params.res,
539
+ message: 'Invalid token. Please use the shared link again.',
540
+ });
541
+ return;
542
+ }
543
+ writeLoginPage(params.res);
544
+ return;
545
+ }
546
+ if (auth.viaToken) {
547
+ setSessionCookie(params.res, params.cookieSecret);
548
+ }
549
+ proxyAuthenticatedHttpRequest({
550
+ req: params.req,
551
+ res: params.res,
552
+ upstreamPort: params.upstreamPort,
553
+ path: auth.sanitizedPath,
554
+ sessionCookieName: SESSION_COOKIE_NAME,
555
+ localHost: LOCAL_HOST,
556
+ });
557
+ }
558
+ function createAuthProxy(params) {
559
+ const bruteForceGuard = new BruteForceGuard();
560
+ const cookieSecret = randomBytes(32);
561
+ const activeSockets = new Set();
562
+ const server = createHttpServer((req, res) => {
563
+ void handleAuthHttpRequest({
564
+ req,
565
+ res,
566
+ upstreamPort: params.upstreamPort,
567
+ password: params.password,
568
+ magicToken: params.magicToken,
569
+ cookieSecret,
570
+ guard: bruteForceGuard,
571
+ }).catch((error) => {
572
+ process.stderr.write(chalk.red(` [proxy] ${error.message}\n`));
573
+ if (!res.headersSent) {
574
+ res.statusCode = 500;
575
+ res.end('Proxy error');
576
+ }
577
+ });
578
+ });
579
+ server.on('connection', (socket) => {
580
+ activeSockets.add(socket);
581
+ socket.once('close', () => {
582
+ activeSockets.delete(socket);
583
+ });
584
+ });
585
+ server.on('upgrade', (req, socket, head) => {
586
+ const ip = getClientIp(req);
587
+ const lockState = bruteForceGuard.isLocked(ip);
588
+ if (lockState.locked) {
589
+ socket.write('HTTP/1.1 429 Too Many Requests\r\nConnection: close\r\n\r\n');
590
+ socket.destroy();
591
+ return;
592
+ }
593
+ const auth = authenticateRequest({
594
+ req,
595
+ cookieSecret,
596
+ magicToken: params.magicToken,
597
+ });
598
+ if (!auth.authenticated) {
599
+ if (auth.invalidToken) {
600
+ bruteForceGuard.registerFailure(ip);
601
+ }
602
+ socket.write('HTTP/1.1 401 Unauthorized\r\nConnection: close\r\n\r\n');
603
+ socket.destroy();
604
+ return;
605
+ }
606
+ proxyAuthenticatedWebSocketUpgrade({
607
+ req,
608
+ socket,
609
+ head,
610
+ upstreamPort: params.upstreamPort,
611
+ sanitizedPath: auth.sanitizedPath,
612
+ sessionCookieName: SESSION_COOKIE_NAME,
613
+ localHost: LOCAL_HOST,
614
+ });
615
+ });
616
+ return new Promise((resolve, reject) => {
617
+ server.once('error', reject);
618
+ server.listen(0, LOCAL_HOST, () => {
619
+ const address = server.address();
620
+ if (!address || typeof address === 'string') {
621
+ reject(new Error('Could not determine auth proxy port'));
622
+ return;
623
+ }
624
+ resolve({
625
+ port: address.port,
626
+ close: async () => {
627
+ await new Promise((closeResolve) => {
628
+ const timeout = setTimeout(() => {
629
+ closeResolve();
630
+ }, 1000);
631
+ timeout.unref?.();
632
+ server.close(() => {
633
+ clearTimeout(timeout);
634
+ closeResolve();
635
+ });
636
+ for (const socket of activeSockets) {
637
+ socket.destroy();
638
+ }
639
+ });
640
+ },
641
+ });
642
+ });
643
+ });
644
+ }
645
+ function createExitPromise(proc, name, shutdownState) {
646
+ return new Promise((resolve, reject) => {
647
+ proc.once('exit', (code, signal) => {
648
+ if (shutdownState.shuttingDown) {
649
+ resolve();
650
+ return;
651
+ }
652
+ reject(new Error(`${name} exited unexpectedly (code: ${code ?? 'null'}, signal: ${signal ?? 'null'})`));
653
+ });
654
+ proc.once('error', (error) => {
655
+ if (shutdownState.shuttingDown) {
656
+ resolve();
657
+ return;
658
+ }
659
+ reject(new Error(`${name} failed: ${error.message}`));
660
+ });
661
+ });
662
+ }
663
+ export async function runProxyCommand({ options, projectRoot, }) {
664
+ const usePrivateMode = options.private ?? false;
665
+ const shutdownState = { shuttingDown: false };
666
+ const processes = [];
667
+ let authProxyClose = null;
668
+ let signalHandlersAttached = false;
669
+ const shutdown = async (exitCode, message) => {
670
+ if (shutdownState.shuttingDown) {
671
+ return;
672
+ }
673
+ shutdownState.shuttingDown = true;
674
+ detachSignalHandlers();
675
+ if (message) {
676
+ if (exitCode === 0) {
677
+ console.log(chalk.yellow(`\n${message}`));
678
+ }
679
+ else {
680
+ console.error(chalk.red(`\n${message}`));
681
+ }
682
+ }
683
+ if (authProxyClose) {
684
+ try {
685
+ await authProxyClose();
686
+ }
687
+ catch {
688
+ }
689
+ }
690
+ await Promise.all(processes.map(async ({ proc }) => killProcessTree(proc)));
691
+ process.exit(exitCode);
692
+ };
693
+ const onSigint = () => {
694
+ void shutdown(0, 'SIGINT received, shutting down...');
695
+ };
696
+ const onSigterm = () => {
697
+ void shutdown(0, 'SIGTERM received, shutting down...');
698
+ };
699
+ const detachSignalHandlers = () => {
700
+ if (!signalHandlersAttached) {
701
+ return;
702
+ }
703
+ process.off('SIGINT', onSigint);
704
+ process.off('SIGTERM', onSigterm);
705
+ signalHandlersAttached = false;
706
+ };
707
+ const attachSignalHandlers = () => {
708
+ if (signalHandlersAttached) {
709
+ return;
710
+ }
711
+ process.on('SIGINT', onSigint);
712
+ process.on('SIGTERM', onSigterm);
713
+ signalHandlersAttached = true;
714
+ };
715
+ await ensureCloudflaredInstalled();
716
+ const databasePath = getDefaultDatabasePath();
717
+ ensureDataDir(databasePath);
718
+ try {
719
+ runMigrations(projectRoot, databasePath);
720
+ }
721
+ catch (error) {
722
+ console.error(chalk.red(`\n❌ Migration failed: ${error.message}`));
723
+ detachSignalHandlers();
724
+ process.exit(1);
725
+ return;
726
+ }
727
+ const requestedPort = await findAvailablePort(3001, { maxAttempts: 50 });
728
+ console.log(chalk.blue(`Starting server on port ${requestedPort}...`));
729
+ let backend;
730
+ attachSignalHandlers();
731
+ try {
732
+ backend = await startFactoryFactoryServer({
733
+ projectRoot,
734
+ databasePath,
735
+ requestedPort,
736
+ });
737
+ }
738
+ catch (error) {
739
+ console.error(chalk.red(`\n❌ ${error.message}`));
740
+ detachSignalHandlers();
741
+ process.exit(1);
742
+ return;
743
+ }
744
+ processes.push({ name: 'server', proc: backend.process });
745
+ let targetPort = backend.port;
746
+ let password = null;
747
+ let directToken = null;
748
+ if (usePrivateMode) {
749
+ password = generatePassword();
750
+ directToken = generateMagicToken();
751
+ let authProxy;
752
+ try {
753
+ authProxy = await createAuthProxy({
754
+ upstreamPort: backend.port,
755
+ password,
756
+ magicToken: directToken,
757
+ });
758
+ }
759
+ catch (error) {
760
+ await shutdown(1, `❌ ${error.message}`);
761
+ return;
762
+ }
763
+ targetPort = authProxy.port;
764
+ authProxyClose = authProxy.close;
765
+ }
766
+ console.log(chalk.blue('Starting tunnel...'));
767
+ let tunnel;
768
+ try {
769
+ tunnel = await startCloudflaredTunnel({
770
+ targetUrl: `http://${LOCAL_HOST}:${targetPort}`,
771
+ killProcess: (proc) => killProcessTree(proc),
772
+ });
773
+ }
774
+ catch (error) {
775
+ await shutdown(1, `❌ ${error.message}`);
776
+ return;
777
+ }
778
+ processes.push({ name: 'cloudflared', proc: tunnel.proc });
779
+ if (usePrivateMode && password && directToken) {
780
+ const directLink = `${tunnel.publicUrl}?token=${directToken}`;
781
+ console.log(chalk.green(`🌍 Public URL: ${tunnel.publicUrl}`));
782
+ console.log(chalk.green(`🔑 Password: ${password}`));
783
+ console.log(chalk.green(`🔗 Direct link: ${directLink}\n`));
784
+ await printDirectLinkQrCode(directLink);
785
+ console.log('Share the password or direct link with people you want to grant access.');
786
+ console.log('Press Ctrl+C to stop.');
787
+ }
788
+ else {
789
+ console.log(chalk.green(`🌍 Public URL: ${tunnel.publicUrl}\n`));
790
+ console.log('Press Ctrl+C to stop.');
791
+ }
792
+ try {
793
+ await Promise.race([
794
+ createExitPromise(backend.process, 'Factory Factory server', shutdownState),
795
+ createExitPromise(tunnel.proc, 'cloudflared', shutdownState),
796
+ ]);
797
+ }
798
+ catch (error) {
799
+ await shutdown(1, `❌ ${error.message}`);
800
+ return;
801
+ }
802
+ }
803
+ export const proxyInternals = {
804
+ BruteForceGuard,
805
+ createSessionValue,
806
+ createAuthCookie,
807
+ authenticateRequest,
808
+ createLoginPage,
809
+ escapeHtml,
810
+ extractTryCloudflareUrl,
811
+ appendBoundedOutputBuffer,
812
+ generatePassword,
813
+ generateMagicToken,
814
+ mergeSetCookieValues,
815
+ matchesMagicToken,
816
+ matchesPassword,
817
+ createAuthProxy,
818
+ toSafeRedirectPath,
819
+ supportsTerminalQrRendering,
820
+ tryRenderTerminalQrCode,
821
+ parseCookieHeader,
822
+ signValue,
823
+ verifySessionValue,
824
+ };
825
+ //# sourceMappingURL=proxy.js.map