factory-factory 0.3.4 → 0.3.6

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 (313) hide show
  1. package/README.md +17 -0
  2. package/dist/client/assets/_basePickBy-CzLmZHC2.js +1 -0
  3. package/dist/client/assets/{_baseUniq-DisTPj-I.js → _baseUniq-B2vXSgXW.js} +1 -1
  4. package/dist/client/assets/arc-Dq49BrkB.js +1 -0
  5. package/dist/client/assets/architectureDiagram-VXUJARFQ-BGubq_o9.js +36 -0
  6. package/dist/client/assets/{blockDiagram-VD42YOAC-DXpmez0y.js → blockDiagram-VD42YOAC-CJ7hB7tD.js} +4 -4
  7. package/dist/client/assets/{c4Diagram-YG6GDRKO-C6sDxR49.js → c4Diagram-YG6GDRKO-C9-3yIl7.js} +3 -3
  8. package/dist/client/assets/channel-DMaON2vY.js +1 -0
  9. package/dist/client/assets/{chunk-4BX2VUAB-CQxlRbYu.js → chunk-4BX2VUAB-LA-tkKjD.js} +1 -1
  10. package/dist/client/assets/{chunk-55IACEB6-DxubFDep.js → chunk-55IACEB6-D8Jq3_Ne.js} +1 -1
  11. package/dist/client/assets/{chunk-B4BG7PRW-BtTQ0im9.js → chunk-B4BG7PRW-BbB1Mssd.js} +1 -1
  12. package/dist/client/assets/{chunk-DI55MBZ5-C2tNYDZj.js → chunk-DI55MBZ5-CpO3WS5m.js} +1 -1
  13. package/dist/client/assets/{chunk-FMBD7UC4-kRQRN6vP.js → chunk-FMBD7UC4-zaxR2CzR.js} +1 -1
  14. package/dist/client/assets/chunk-QN33PNHL-BMmRcEqx.js +1 -0
  15. package/dist/client/assets/{chunk-QZHKN3VN-BfxMFZDN.js → chunk-QZHKN3VN-CbCQqsiw.js} +1 -1
  16. package/dist/client/assets/chunk-TZMSLE5B-BhRzmVVB.js +1 -0
  17. package/dist/client/assets/classDiagram-2ON5EDUG-BKODUnN9.js +1 -0
  18. package/dist/client/assets/classDiagram-v2-WZHVMYZB-BKODUnN9.js +1 -0
  19. package/dist/client/assets/clone-d5fivKBG.js +1 -0
  20. package/dist/client/assets/{cose-bilkent-S5V4N54A-QPsUxyAe.js → cose-bilkent-S5V4N54A-BZtg5BPr.js} +1 -1
  21. package/dist/client/assets/{dagre-6UL2VRFP-BAmsmcnI.js → dagre-6UL2VRFP-DiejfPfI.js} +2 -2
  22. package/dist/client/assets/diagram-PSM6KHXK-CRE7v2e7.js +24 -0
  23. package/dist/client/assets/diagram-QEK2KX5R-DpAOzBlm.js +43 -0
  24. package/dist/client/assets/diagram-S2PKOQOG-BOJvuhJd.js +24 -0
  25. package/dist/client/assets/{erDiagram-Q2GNP2WA-DMKIVzp4.js → erDiagram-Q2GNP2WA-IM11uKRy.js} +4 -4
  26. package/dist/client/assets/{flowDiagram-NV44I4VS-op3xA_nS.js → flowDiagram-NV44I4VS-DTbQf_7g.js} +5 -5
  27. package/dist/client/assets/{ganttDiagram-JELNMOA3-nrnzVCJK.js → ganttDiagram-JELNMOA3-Bqd3rUDW.js} +2 -2
  28. package/dist/client/assets/gitGraphDiagram-V2S2FVAM-Cd1j3VMN.js +65 -0
  29. package/dist/client/assets/{graph-D_lEcPMk.js → graph-D667hHAk.js} +1 -1
  30. package/dist/client/assets/{index-C2qHRaOH.js → index-BXRnTMjJ.js} +170 -171
  31. package/dist/client/assets/index-DllMnbgu.css +1 -0
  32. package/dist/client/assets/infoDiagram-HS3SLOUP-CzpZPq7Y.js +2 -0
  33. package/dist/client/assets/{journeyDiagram-XKPGCS4Q-Bnhe4U1x.js → journeyDiagram-XKPGCS4Q-Br2GUbhE.js} +1 -1
  34. package/dist/client/assets/{kanban-definition-3W4ZIXB7-DpTaTXko.js → kanban-definition-3W4ZIXB7-D0SM1ldH.js} +6 -6
  35. package/dist/client/assets/{layout-HT5qr--Q.js → layout-BPE9Dzp9.js} +1 -1
  36. package/dist/client/assets/{linear-CDmQ8HG8.js → linear-5exZFNBA.js} +1 -1
  37. package/dist/client/assets/{mindmap-definition-VGOIOE7T-zDr7s4o2.js → mindmap-definition-VGOIOE7T-D1W9h2lc.js} +3 -3
  38. package/dist/client/assets/mobile-baseline-BHP-K4kd.js +10 -0
  39. package/dist/client/assets/pieDiagram-ADFJNKIX-DG-umOTY.js +30 -0
  40. package/dist/client/assets/{quadrantDiagram-AYHSOK5B-DzdJzkAJ.js → quadrantDiagram-AYHSOK5B-Cb0ciONq.js} +1 -1
  41. package/dist/client/assets/{requirementDiagram-UZGBJVZJ-ChrLzx8S.js → requirementDiagram-UZGBJVZJ-BKYaJZ83.js} +1 -1
  42. package/dist/client/assets/sankeyDiagram-TZEHDZUN-DkR9L4Vw.js +10 -0
  43. package/dist/client/assets/{sequenceDiagram-WL72ISMW-BHxEpSCU.js → sequenceDiagram-WL72ISMW-Cys03qhv.js} +6 -6
  44. package/dist/client/assets/stateDiagram-FKZM4ZOC-DQWCRtS7.js +1 -0
  45. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-DoWi8XaX.js +1 -0
  46. package/dist/client/assets/terminal-instance-CpEqekOB.js +1 -0
  47. package/dist/client/assets/{timeline-definition-IT6M3QCI-BcCmIxix.js → timeline-definition-IT6M3QCI-C0mVV_zL.js} +4 -4
  48. package/dist/client/assets/treemap-GDKQZRPO-DK-Wlxvy.js +160 -0
  49. package/dist/client/assets/{xychartDiagram-PRI3JC2R-DrgKBPUM.js → xychartDiagram-PRI3JC2R-CFg2MfK9.js} +4 -4
  50. package/dist/client/index.html +3 -3
  51. package/dist/prisma/generated/commonInputTypes.d.ts +69 -39
  52. package/dist/prisma/generated/commonInputTypes.d.ts.map +1 -1
  53. package/dist/prisma/generated/enums.d.ts +6 -0
  54. package/dist/prisma/generated/enums.d.ts.map +1 -1
  55. package/dist/prisma/generated/enums.js +6 -1
  56. package/dist/prisma/generated/enums.js.map +1 -1
  57. package/dist/prisma/generated/internal/class.d.ts.map +1 -1
  58. package/dist/prisma/generated/internal/class.js +12 -4
  59. package/dist/prisma/generated/internal/class.js.map +1 -1
  60. package/dist/prisma/generated/internal/prismaNamespace.d.ts +13 -7
  61. package/dist/prisma/generated/internal/prismaNamespace.d.ts.map +1 -1
  62. package/dist/prisma/generated/internal/prismaNamespace.js +11 -6
  63. package/dist/prisma/generated/internal/prismaNamespace.js.map +1 -1
  64. package/dist/prisma/generated/internal/prismaNamespaceBrowser.d.ts +10 -5
  65. package/dist/prisma/generated/internal/prismaNamespaceBrowser.d.ts.map +1 -1
  66. package/dist/prisma/generated/internal/prismaNamespaceBrowser.js +9 -4
  67. package/dist/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
  68. package/dist/prisma/generated/models/Project.d.ts +63 -1
  69. package/dist/prisma/generated/models/Project.d.ts.map +1 -1
  70. package/dist/prisma/generated/models/Workspace.d.ts +130 -1
  71. package/dist/prisma/generated/models/Workspace.d.ts.map +1 -1
  72. package/dist/prompts/quick-actions/screenshots.md +12 -6
  73. package/dist/prompts/ratchet/dispatch.md +4 -0
  74. package/dist/src/backend/domains/linear/index.d.ts +3 -0
  75. package/dist/src/backend/domains/linear/index.d.ts.map +1 -0
  76. package/dist/src/backend/domains/linear/index.js +3 -0
  77. package/dist/src/backend/domains/linear/index.js.map +1 -0
  78. package/dist/src/backend/domains/linear/linear-client.service.d.ts +40 -0
  79. package/dist/src/backend/domains/linear/linear-client.service.d.ts.map +1 -0
  80. package/dist/src/backend/domains/linear/linear-client.service.js +134 -0
  81. package/dist/src/backend/domains/linear/linear-client.service.js.map +1 -0
  82. package/dist/src/backend/domains/linear/linear-state-sync.service.d.ts +7 -0
  83. package/dist/src/backend/domains/linear/linear-state-sync.service.d.ts.map +1 -0
  84. package/dist/src/backend/domains/linear/linear-state-sync.service.js +29 -0
  85. package/dist/src/backend/domains/linear/linear-state-sync.service.js.map +1 -0
  86. package/dist/src/backend/domains/ratchet/bridges.d.ts +5 -1
  87. package/dist/src/backend/domains/ratchet/bridges.d.ts.map +1 -1
  88. package/dist/src/backend/domains/ratchet/ratchet.service.d.ts +2 -0
  89. package/dist/src/backend/domains/ratchet/ratchet.service.d.ts.map +1 -1
  90. package/dist/src/backend/domains/ratchet/ratchet.service.js +43 -53
  91. package/dist/src/backend/domains/ratchet/ratchet.service.js.map +1 -1
  92. package/dist/src/backend/domains/ratchet/ratchet.service.test.js +61 -18
  93. package/dist/src/backend/domains/ratchet/ratchet.service.test.js.map +1 -1
  94. package/dist/src/backend/domains/session/acp/acp-runtime-manager.d.ts.map +1 -1
  95. package/dist/src/backend/domains/session/acp/acp-runtime-manager.js +5 -1
  96. package/dist/src/backend/domains/session/acp/acp-runtime-manager.js.map +1 -1
  97. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.d.ts +13 -2
  98. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.d.ts.map +1 -1
  99. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.js +839 -106
  100. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.js.map +1 -1
  101. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.js +735 -8
  102. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.js.map +1 -1
  103. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.d.ts +20 -0
  104. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.d.ts.map +1 -1
  105. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.js +16 -0
  106. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.js.map +1 -1
  107. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.test.js +15 -0
  108. package/dist/src/backend/domains/session/acp/codex-app-server-adapter/codex-zod.test.js.map +1 -1
  109. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/load-session.handler.d.ts +2 -2
  110. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/load-session.handler.d.ts.map +1 -1
  111. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/load-session.handler.js +32 -1
  112. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/load-session.handler.js.map +1 -1
  113. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/load-session.handler.test.js +79 -9
  114. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/load-session.handler.test.js.map +1 -1
  115. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/stop.handler.d.ts +2 -2
  116. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/stop.handler.d.ts.map +1 -1
  117. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/stop.handler.js +3 -1
  118. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/stop.handler.js.map +1 -1
  119. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/stop.handler.test.js +10 -1
  120. package/dist/src/backend/domains/session/chat/chat-message-handlers/handlers/stop.handler.test.js.map +1 -1
  121. package/dist/src/backend/domains/session/chat/chat-message-handlers/registry.js +2 -2
  122. package/dist/src/backend/domains/session/chat/chat-message-handlers/registry.js.map +1 -1
  123. package/dist/src/backend/domains/session/chat/chat-message-handlers/types.d.ts +1 -0
  124. package/dist/src/backend/domains/session/chat/chat-message-handlers/types.d.ts.map +1 -1
  125. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.d.ts +5 -1
  126. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.d.ts.map +1 -1
  127. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.js +39 -13
  128. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.js.map +1 -1
  129. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.test.js +81 -0
  130. package/dist/src/backend/domains/session/chat/chat-message-handlers.service.test.js.map +1 -1
  131. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.d.ts.map +1 -1
  132. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.js +12 -59
  133. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.js.map +1 -1
  134. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.test.js +11 -21
  135. package/dist/src/backend/domains/session/data/codex-session-history-loader.service.test.js.map +1 -1
  136. package/dist/src/backend/domains/session/data/session-data.service.d.ts +6 -0
  137. package/dist/src/backend/domains/session/data/session-data.service.d.ts.map +1 -1
  138. package/dist/src/backend/domains/session/lifecycle/session.service.d.ts +7 -0
  139. package/dist/src/backend/domains/session/lifecycle/session.service.d.ts.map +1 -1
  140. package/dist/src/backend/domains/session/lifecycle/session.service.js +105 -6
  141. package/dist/src/backend/domains/session/lifecycle/session.service.js.map +1 -1
  142. package/dist/src/backend/domains/session/lifecycle/session.service.test.js +84 -0
  143. package/dist/src/backend/domains/session/lifecycle/session.service.test.js.map +1 -1
  144. package/dist/src/backend/domains/session/session-domain.service.d.ts +8 -1
  145. package/dist/src/backend/domains/session/session-domain.service.d.ts.map +1 -1
  146. package/dist/src/backend/domains/session/session-domain.service.js +43 -2
  147. package/dist/src/backend/domains/session/session-domain.service.js.map +1 -1
  148. package/dist/src/backend/domains/session/session-domain.service.test.js +21 -0
  149. package/dist/src/backend/domains/session/session-domain.service.test.js.map +1 -1
  150. package/dist/src/backend/domains/session/store/session-store.types.d.ts +1 -1
  151. package/dist/src/backend/domains/session/store/session-store.types.d.ts.map +1 -1
  152. package/dist/src/backend/domains/session/store/session-transcript.d.ts +1 -0
  153. package/dist/src/backend/domains/session/store/session-transcript.d.ts.map +1 -1
  154. package/dist/src/backend/domains/session/store/session-transcript.js +8 -0
  155. package/dist/src/backend/domains/session/store/session-transcript.js.map +1 -1
  156. package/dist/src/backend/domains/workspace/lifecycle/creation.service.d.ts +9 -0
  157. package/dist/src/backend/domains/workspace/lifecycle/creation.service.d.ts.map +1 -1
  158. package/dist/src/backend/domains/workspace/lifecycle/creation.service.js +18 -0
  159. package/dist/src/backend/domains/workspace/lifecycle/creation.service.js.map +1 -1
  160. package/dist/src/backend/domains/workspace/lifecycle/creation.service.test.js +46 -0
  161. package/dist/src/backend/domains/workspace/lifecycle/creation.service.test.js.map +1 -1
  162. package/dist/src/backend/domains/workspace/lifecycle/data.service.d.ts +25 -0
  163. package/dist/src/backend/domains/workspace/lifecycle/data.service.d.ts.map +1 -1
  164. package/dist/src/backend/domains/workspace/query/project-management.service.d.ts +16 -0
  165. package/dist/src/backend/domains/workspace/query/project-management.service.d.ts.map +1 -1
  166. package/dist/src/backend/domains/workspace/query/project-management.service.js.map +1 -1
  167. package/dist/src/backend/domains/workspace/query/workspace-query.service.d.ts +6 -0
  168. package/dist/src/backend/domains/workspace/query/workspace-query.service.d.ts.map +1 -1
  169. package/dist/src/backend/interceptors/pr-detection.interceptor.d.ts.map +1 -1
  170. package/dist/src/backend/interceptors/pr-detection.interceptor.js +5 -1
  171. package/dist/src/backend/interceptors/pr-detection.interceptor.js.map +1 -1
  172. package/dist/src/backend/interceptors/pr-detection.interceptor.test.js +14 -0
  173. package/dist/src/backend/interceptors/pr-detection.interceptor.test.js.map +1 -1
  174. package/dist/src/backend/migrate.d.ts.map +1 -1
  175. package/dist/src/backend/migrate.js +13 -3
  176. package/dist/src/backend/migrate.js.map +1 -1
  177. package/dist/src/backend/migrate.test.js +44 -0
  178. package/dist/src/backend/migrate.test.js.map +1 -1
  179. package/dist/src/backend/orchestration/cli-health.service.d.ts +1 -0
  180. package/dist/src/backend/orchestration/cli-health.service.d.ts.map +1 -1
  181. package/dist/src/backend/orchestration/cli-health.service.js +16 -1
  182. package/dist/src/backend/orchestration/cli-health.service.js.map +1 -1
  183. package/dist/src/backend/orchestration/cli-health.service.test.js +23 -0
  184. package/dist/src/backend/orchestration/cli-health.service.test.js.map +1 -1
  185. package/dist/src/backend/orchestration/data-backup.service.d.ts.map +1 -1
  186. package/dist/src/backend/orchestration/data-backup.service.js +21 -1
  187. package/dist/src/backend/orchestration/data-backup.service.js.map +1 -1
  188. package/dist/src/backend/orchestration/data-backup.service.test.js +19 -9
  189. package/dist/src/backend/orchestration/data-backup.service.test.js.map +1 -1
  190. package/dist/src/backend/orchestration/event-collector.orchestrator.d.ts.map +1 -1
  191. package/dist/src/backend/orchestration/event-collector.orchestrator.js +63 -3
  192. package/dist/src/backend/orchestration/event-collector.orchestrator.js.map +1 -1
  193. package/dist/src/backend/orchestration/event-collector.orchestrator.test.js +49 -3
  194. package/dist/src/backend/orchestration/event-collector.orchestrator.test.js.map +1 -1
  195. package/dist/src/backend/orchestration/linear-config.helper.d.ts +9 -0
  196. package/dist/src/backend/orchestration/linear-config.helper.d.ts.map +1 -0
  197. package/dist/src/backend/orchestration/linear-config.helper.js +23 -0
  198. package/dist/src/backend/orchestration/linear-config.helper.js.map +1 -0
  199. package/dist/src/backend/orchestration/workspace-archive.orchestrator.d.ts +3 -0
  200. package/dist/src/backend/orchestration/workspace-archive.orchestrator.d.ts.map +1 -1
  201. package/dist/src/backend/orchestration/workspace-init.orchestrator.d.ts.map +1 -1
  202. package/dist/src/backend/orchestration/workspace-init.orchestrator.js +228 -3
  203. package/dist/src/backend/orchestration/workspace-init.orchestrator.js.map +1 -1
  204. package/dist/src/backend/prompts/ratchet-dispatch.d.ts +8 -1
  205. package/dist/src/backend/prompts/ratchet-dispatch.d.ts.map +1 -1
  206. package/dist/src/backend/prompts/ratchet-dispatch.js +20 -3
  207. package/dist/src/backend/prompts/ratchet-dispatch.js.map +1 -1
  208. package/dist/src/backend/resource_accessors/project.accessor.d.ts +7 -1
  209. package/dist/src/backend/resource_accessors/project.accessor.d.ts.map +1 -1
  210. package/dist/src/backend/resource_accessors/project.accessor.js +8 -1
  211. package/dist/src/backend/resource_accessors/project.accessor.js.map +1 -1
  212. package/dist/src/backend/resource_accessors/workspace.accessor.d.ts +4 -1
  213. package/dist/src/backend/resource_accessors/workspace.accessor.d.ts.map +1 -1
  214. package/dist/src/backend/resource_accessors/workspace.accessor.js +3 -0
  215. package/dist/src/backend/resource_accessors/workspace.accessor.js.map +1 -1
  216. package/dist/src/backend/server.d.ts.map +1 -1
  217. package/dist/src/backend/server.js +11 -9
  218. package/dist/src/backend/server.js.map +1 -1
  219. package/dist/src/backend/services/constants.d.ts +1 -0
  220. package/dist/src/backend/services/constants.d.ts.map +1 -1
  221. package/dist/src/backend/services/constants.js +1 -0
  222. package/dist/src/backend/services/constants.js.map +1 -1
  223. package/dist/src/backend/services/crypto.service.d.ts +10 -0
  224. package/dist/src/backend/services/crypto.service.d.ts.map +1 -0
  225. package/dist/src/backend/services/crypto.service.js +61 -0
  226. package/dist/src/backend/services/crypto.service.js.map +1 -0
  227. package/dist/src/backend/trpc/admin.trpc.d.ts +14 -4
  228. package/dist/src/backend/trpc/admin.trpc.d.ts.map +1 -1
  229. package/dist/src/backend/trpc/index.d.ts +169 -9
  230. package/dist/src/backend/trpc/index.d.ts.map +1 -1
  231. package/dist/src/backend/trpc/index.js +2 -0
  232. package/dist/src/backend/trpc/index.js.map +1 -1
  233. package/dist/src/backend/trpc/linear.trpc.d.ts +44 -0
  234. package/dist/src/backend/trpc/linear.trpc.d.ts.map +1 -0
  235. package/dist/src/backend/trpc/linear.trpc.js +69 -0
  236. package/dist/src/backend/trpc/linear.trpc.js.map +1 -0
  237. package/dist/src/backend/trpc/project.trpc.d.ts +50 -5
  238. package/dist/src/backend/trpc/project.trpc.d.ts.map +1 -1
  239. package/dist/src/backend/trpc/project.trpc.js +46 -18
  240. package/dist/src/backend/trpc/project.trpc.js.map +1 -1
  241. package/dist/src/backend/trpc/session.trpc.d.ts +13 -0
  242. package/dist/src/backend/trpc/session.trpc.d.ts.map +1 -1
  243. package/dist/src/backend/trpc/session.trpc.js +5 -1
  244. package/dist/src/backend/trpc/session.trpc.js.map +1 -1
  245. package/dist/src/backend/trpc/workspace/git.trpc.d.ts +10 -0
  246. package/dist/src/backend/trpc/workspace/git.trpc.d.ts.map +1 -1
  247. package/dist/src/backend/trpc/workspace/git.trpc.js +25 -0
  248. package/dist/src/backend/trpc/workspace/git.trpc.js.map +1 -1
  249. package/dist/src/backend/trpc/workspace/init.trpc.d.ts +3 -0
  250. package/dist/src/backend/trpc/workspace/init.trpc.d.ts.map +1 -1
  251. package/dist/src/backend/trpc/workspace/workspace-helpers.d.ts +8 -0
  252. package/dist/src/backend/trpc/workspace/workspace-helpers.d.ts.map +1 -1
  253. package/dist/src/backend/trpc/workspace.trpc.d.ts +49 -0
  254. package/dist/src/backend/trpc/workspace.trpc.d.ts.map +1 -1
  255. package/dist/src/backend/trpc/workspace.trpc.js +20 -4
  256. package/dist/src/backend/trpc/workspace.trpc.js.map +1 -1
  257. package/dist/src/cli/index.js +17 -91
  258. package/dist/src/cli/index.js.map +1 -1
  259. package/dist/src/cli/proxy.d.ts +80 -0
  260. package/dist/src/cli/proxy.d.ts.map +1 -0
  261. package/dist/src/cli/proxy.js +1054 -0
  262. package/dist/src/cli/proxy.js.map +1 -0
  263. package/dist/src/cli/proxy.test.d.ts +2 -0
  264. package/dist/src/cli/proxy.test.d.ts.map +1 -0
  265. package/dist/src/cli/proxy.test.js +249 -0
  266. package/dist/src/cli/proxy.test.js.map +1 -0
  267. package/dist/src/cli/runtime-utils.d.ts +9 -0
  268. package/dist/src/cli/runtime-utils.d.ts.map +1 -0
  269. package/dist/src/cli/runtime-utils.js +86 -0
  270. package/dist/src/cli/runtime-utils.js.map +1 -0
  271. package/dist/src/shared/core/enums.d.ts +6 -0
  272. package/dist/src/shared/core/enums.d.ts.map +1 -1
  273. package/dist/src/shared/core/enums.js +5 -0
  274. package/dist/src/shared/core/enums.js.map +1 -1
  275. package/dist/src/shared/core/index.d.ts +1 -1
  276. package/dist/src/shared/core/index.d.ts.map +1 -1
  277. package/dist/src/shared/core/index.js +1 -1
  278. package/dist/src/shared/core/index.js.map +1 -1
  279. package/dist/src/shared/schemas/export-data.schema.d.ts +19 -1
  280. package/dist/src/shared/schemas/export-data.schema.d.ts.map +1 -1
  281. package/dist/src/shared/schemas/export-data.schema.js +8 -2
  282. package/dist/src/shared/schemas/export-data.schema.js.map +1 -1
  283. package/dist/src/shared/schemas/issue-tracker-config.schema.d.ts +35 -0
  284. package/dist/src/shared/schemas/issue-tracker-config.schema.d.ts.map +1 -0
  285. package/dist/src/shared/schemas/issue-tracker-config.schema.js +29 -0
  286. package/dist/src/shared/schemas/issue-tracker-config.schema.js.map +1 -0
  287. package/dist/tsconfig.backend.tsbuildinfo +1 -1
  288. package/package.json +40 -36
  289. package/prisma/migrations/20260217190642_add_linear_integration/migration.sql +34 -0
  290. package/prisma/schema.prisma +13 -0
  291. package/prompts/quick-actions/screenshots.md +12 -6
  292. package/prompts/ratchet/dispatch.md +4 -0
  293. package/dist/client/assets/_basePickBy-kS1IrKFQ.js +0 -1
  294. package/dist/client/assets/arc-CWpVTRns.js +0 -1
  295. package/dist/client/assets/architectureDiagram-VXUJARFQ-Dp1AYPMt.js +0 -36
  296. package/dist/client/assets/channel-D5BCeybW.js +0 -1
  297. package/dist/client/assets/chunk-QN33PNHL-DP72lCp6.js +0 -1
  298. package/dist/client/assets/chunk-TZMSLE5B-G3wPktxK.js +0 -1
  299. package/dist/client/assets/classDiagram-2ON5EDUG-BUS1JDwr.js +0 -1
  300. package/dist/client/assets/classDiagram-v2-WZHVMYZB-BUS1JDwr.js +0 -1
  301. package/dist/client/assets/clone-C5xhPZw8.js +0 -1
  302. package/dist/client/assets/diagram-PSM6KHXK-QA-3O0wr.js +0 -24
  303. package/dist/client/assets/diagram-QEK2KX5R-VZkRJLXU.js +0 -43
  304. package/dist/client/assets/diagram-S2PKOQOG-DwLmogjW.js +0 -24
  305. package/dist/client/assets/gitGraphDiagram-NY62KEGX-CK2ytvyZ.js +0 -65
  306. package/dist/client/assets/index-D5ywoSOH.css +0 -1
  307. package/dist/client/assets/infoDiagram-WHAUD3N6-DO5X8HkW.js +0 -2
  308. package/dist/client/assets/pieDiagram-ADFJNKIX-BVBJCvYL.js +0 -30
  309. package/dist/client/assets/sankeyDiagram-TZEHDZUN-GIzxIQQB.js +0 -10
  310. package/dist/client/assets/stateDiagram-FKZM4ZOC-ByvdYZKl.js +0 -1
  311. package/dist/client/assets/stateDiagram-v2-4FDKWEC3-ynQtAOKH.js +0 -1
  312. package/dist/client/assets/terminal-instance-xdECz0dx.js +0 -1
  313. package/dist/client/assets/treemap-KMMF4GRG-CVpLLzhu.js +0 -128
@@ -4,18 +4,24 @@ description: Capture screenshots of the running dev app
4
4
  type: agent
5
5
  icon: camera
6
6
  ---
7
- Take a screenshot of the workspace's running development app to capture the current state of the UI.
7
+ Take exactly one screenshot of the workspace's running development app to capture the current state of the UI.
8
8
 
9
9
  ## Step 1: Start the dev server
10
10
 
11
11
  1. Read `factory-factory.json` in the repo root for the `scripts.run` command
12
12
  2. Pick a free port and replace `{port}` in the command with it
13
- 3. Start the dev server in the background and wait for it to be ready
13
+ 3. Start the dev server in the background with `BROWSER=none` set in the environment (do NOT open a browser window) and wait for it to be ready
14
14
 
15
- ## Step 2: Take a screenshot
15
+ ## Step 2: Take a single screenshot
16
16
 
17
17
  1. `mkdir -p .factory-factory/screenshots`
18
18
  2. Use `browser_navigate` to visit the dev server URL
19
- 3. Determine the most relevant screen that captures the current state of the app
20
- 4. Use `browser_screenshot` to capture it
21
- 5. Save to `.factory-factory/screenshots/` with a descriptive PNG filename
19
+ 3. Use `browser_screenshot` to capture the page
20
+ 4. Save to `.factory-factory/screenshots/` with a descriptive PNG filename
21
+
22
+ ## Step 3: Clean up
23
+
24
+ 1. Kill the dev server process you started in Step 1
25
+ 2. Close any browser pages you opened
26
+
27
+ Do not take more than one screenshot. Do not open extra browser tabs or windows.
@@ -6,6 +6,10 @@ Context:
6
6
  - PR Number: {{PR_NUMBER}}
7
7
  - PR URL: {{PR_URL}}
8
8
 
9
+ ## Review Comments
10
+
11
+ {{REVIEW_COMMENTS}}
12
+
9
13
  Goal:
10
14
  - Move this PR forward safely without waiting for user input.
11
15
 
@@ -0,0 +1,3 @@
1
+ export { type LinearIssue, type LinearTeam, type LinearValidationResult, type LinearWorkflowState, linearClientService, } from './linear-client.service.js';
2
+ export { linearStateSyncService } from './linear-state-sync.service.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/backend/domains/linear/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,mBAAmB,GACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { linearClientService, } from './linear-client.service.js';
2
+ export { linearStateSyncService } from './linear-state-sync.service.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/backend/domains/linear/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAKL,mBAAmB,GACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,40 @@
1
+ export interface LinearTeam {
2
+ id: string;
3
+ name: string;
4
+ key: string;
5
+ }
6
+ export interface LinearIssue {
7
+ id: string;
8
+ identifier: string;
9
+ title: string;
10
+ description: string;
11
+ url: string;
12
+ state: string;
13
+ createdAt: string;
14
+ assigneeName: string | null;
15
+ }
16
+ export interface LinearWorkflowState {
17
+ id: string;
18
+ name: string;
19
+ type: string;
20
+ }
21
+ export interface LinearValidationResult {
22
+ valid: boolean;
23
+ viewerName?: string;
24
+ error?: string;
25
+ }
26
+ declare class LinearClientService {
27
+ private createClient;
28
+ validateApiKey(apiKey: string): Promise<LinearValidationResult>;
29
+ listTeams(apiKey: string): Promise<LinearTeam[]>;
30
+ validateKeyAndListTeams(apiKey: string): Promise<LinearValidationResult & {
31
+ teams?: LinearTeam[];
32
+ }>;
33
+ listMyIssues(apiKey: string, teamId: string): Promise<LinearIssue[]>;
34
+ getIssue(apiKey: string, issueId: string): Promise<LinearIssue | null>;
35
+ findWorkflowState(apiKey: string, teamId: string, stateType: 'unstarted' | 'started' | 'completed' | 'cancelled'): Promise<LinearWorkflowState | null>;
36
+ transitionIssueState(apiKey: string, issueId: string, targetStateType: 'started' | 'completed' | 'cancelled'): Promise<void>;
37
+ }
38
+ export declare const linearClientService: LinearClientService;
39
+ export {};
40
+ //# sourceMappingURL=linear-client.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear-client.service.d.ts","sourceRoot":"","sources":["../../../../../src/backend/domains/linear/linear-client.service.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAGD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAGD,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAGD,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID,cAAM,mBAAmB;IAEvB,OAAO,CAAC,YAAY;IAKd,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAa/D,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAWhD,uBAAuB,CAC3B,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,sBAAsB,GAAG;QAAE,KAAK,CAAC,EAAE,UAAU,EAAE,CAAA;KAAE,CAAC;IAavD,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA6BpE,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IA8BtE,iBAAiB,CACrB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,GAC7D,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC;IA+BhC,oBAAoB,CACxB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,SAAS,GAAG,WAAW,GAAG,WAAW,GACrD,OAAO,CAAC,IAAI,CAAC;CA6BjB;AAED,eAAO,MAAM,mBAAmB,qBAA4B,CAAC"}
@@ -0,0 +1,134 @@
1
+ import { LinearClient } from '@linear/sdk';
2
+ import { createLogger } from '../../../backend/services/logger.service.js';
3
+ const logger = createLogger('linear-client');
4
+ class LinearClientService {
5
+ createClient(apiKey) {
6
+ return new LinearClient({ apiKey });
7
+ }
8
+ async validateApiKey(apiKey) {
9
+ try {
10
+ const client = this.createClient(apiKey);
11
+ const viewer = await client.viewer;
12
+ return { valid: true, viewerName: viewer.displayName ?? viewer.name };
13
+ }
14
+ catch (error) {
15
+ const message = error instanceof Error ? error.message : String(error);
16
+ logger.warn('Linear API key validation failed', { error: message });
17
+ return { valid: false, error: message };
18
+ }
19
+ }
20
+ async listTeams(apiKey) {
21
+ const client = this.createClient(apiKey);
22
+ const connection = await client.teams();
23
+ return connection.nodes.map((team) => ({
24
+ id: team.id,
25
+ name: team.name,
26
+ key: team.key,
27
+ }));
28
+ }
29
+ async validateKeyAndListTeams(apiKey) {
30
+ const validation = await this.validateApiKey(apiKey);
31
+ if (!validation.valid) {
32
+ return validation;
33
+ }
34
+ const teams = await this.listTeams(apiKey);
35
+ return { ...validation, teams };
36
+ }
37
+ async listMyIssues(apiKey, teamId) {
38
+ const client = this.createClient(apiKey);
39
+ const viewer = await client.viewer;
40
+ const issues = await viewer.assignedIssues({
41
+ filter: {
42
+ team: { id: { eq: teamId } },
43
+ state: { type: { eq: 'unstarted' } },
44
+ },
45
+ first: 50,
46
+ });
47
+ return Promise.all(issues.nodes.map(async (issue) => {
48
+ const [state, assignee] = await Promise.all([issue.state, issue.assignee]);
49
+ return {
50
+ id: issue.id,
51
+ identifier: issue.identifier,
52
+ title: issue.title,
53
+ description: issue.description ?? '',
54
+ url: issue.url,
55
+ state: state?.name ?? 'Unknown',
56
+ createdAt: issue.createdAt.toISOString(),
57
+ assigneeName: assignee?.displayName ?? assignee?.name ?? null,
58
+ };
59
+ }));
60
+ }
61
+ async getIssue(apiKey, issueId) {
62
+ try {
63
+ const client = this.createClient(apiKey);
64
+ const issue = await client.issue(issueId);
65
+ const state = await issue.state;
66
+ const assignee = await issue.assignee;
67
+ return {
68
+ id: issue.id,
69
+ identifier: issue.identifier,
70
+ title: issue.title,
71
+ description: issue.description ?? '',
72
+ url: issue.url,
73
+ state: state?.name ?? 'Unknown',
74
+ createdAt: issue.createdAt.toISOString(),
75
+ assigneeName: assignee?.displayName ?? assignee?.name ?? null,
76
+ };
77
+ }
78
+ catch (error) {
79
+ logger.warn('Failed to fetch Linear issue', {
80
+ issueId,
81
+ error: error instanceof Error ? error.message : String(error),
82
+ });
83
+ return null;
84
+ }
85
+ }
86
+ async findWorkflowState(apiKey, teamId, stateType) {
87
+ const client = this.createClient(apiKey);
88
+ const states = await client.workflowStates({
89
+ filter: {
90
+ team: { id: { eq: teamId } },
91
+ type: { eq: stateType },
92
+ },
93
+ });
94
+ if (states.nodes.length === 0) {
95
+ return null;
96
+ }
97
+ const sorted = [...states.nodes].sort((a, b) => a.position - b.position);
98
+ const first = sorted[0];
99
+ if (!first) {
100
+ return null;
101
+ }
102
+ return {
103
+ id: first.id,
104
+ name: first.name,
105
+ type: first.type,
106
+ };
107
+ }
108
+ async transitionIssueState(apiKey, issueId, targetStateType) {
109
+ const client = this.createClient(apiKey);
110
+ const issue = await client.issue(issueId);
111
+ const team = await issue.team;
112
+ if (!team) {
113
+ logger.warn('Cannot transition issue: no team found', { issueId });
114
+ return;
115
+ }
116
+ const targetState = await this.findWorkflowState(apiKey, team.id, targetStateType);
117
+ if (!targetState) {
118
+ logger.warn('Cannot transition issue: no workflow state found', {
119
+ issueId,
120
+ teamId: team.id,
121
+ targetStateType,
122
+ });
123
+ return;
124
+ }
125
+ await client.updateIssue(issueId, { stateId: targetState.id });
126
+ logger.info('Transitioned Linear issue state', {
127
+ issueId,
128
+ targetState: targetState.name,
129
+ targetStateType,
130
+ });
131
+ }
132
+ }
133
+ export const linearClientService = new LinearClientService();
134
+ //# sourceMappingURL=linear-client.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear-client.service.js","sourceRoot":"","sources":["../../../../../src/backend/domains/linear/linear-client.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ declare class LinearStateSyncService {
2
+ markIssueStarted(apiKey: string, issueId: string): Promise<void>;
3
+ markIssueCompleted(apiKey: string, issueId: string): Promise<void>;
4
+ }
5
+ export declare const linearStateSyncService: LinearStateSyncService;
6
+ export {};
7
+ //# sourceMappingURL=linear-state-sync.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear-state-sync.service.d.ts","sourceRoot":"","sources":["../../../../../src/backend/domains/linear/linear-state-sync.service.ts"],"names":[],"mappings":"AAcA,cAAM,sBAAsB;IAKpB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAehE,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAUzE;AAED,eAAO,MAAM,sBAAsB,wBAA+B,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { createLogger } from '../../../backend/services/logger.service.js';
2
+ import { linearClientService } from './linear-client.service.js';
3
+ const logger = createLogger('linear-state-sync');
4
+ class LinearStateSyncService {
5
+ async markIssueStarted(apiKey, issueId) {
6
+ try {
7
+ await linearClientService.transitionIssueState(apiKey, issueId, 'started');
8
+ }
9
+ catch (error) {
10
+ logger.warn('Failed to mark Linear issue as started', {
11
+ issueId,
12
+ error: error instanceof Error ? error.message : String(error),
13
+ });
14
+ }
15
+ }
16
+ async markIssueCompleted(apiKey, issueId) {
17
+ try {
18
+ await linearClientService.transitionIssueState(apiKey, issueId, 'completed');
19
+ }
20
+ catch (error) {
21
+ logger.warn('Failed to mark Linear issue as completed', {
22
+ issueId,
23
+ error: error instanceof Error ? error.message : String(error),
24
+ });
25
+ }
26
+ }
27
+ }
28
+ export const linearStateSyncService = new LinearStateSyncService();
29
+ //# sourceMappingURL=linear-state-sync.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear-state-sync.service.js","sourceRoot":"","sources":["../../../../../src/backend/domains/linear/linear-state-sync.service.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,MAAM,GAAG,YAAY,CAAC,mBAAmB,CAAC,CAAC;AAEjD,MAAM,sBAAsB;IAK1B,KAAK,CAAC,gBAAgB,CAAC,MAAc,EAAE,OAAe;QACpD,IAAI,CAAC;YACH,MAAM,mBAAmB,CAAC,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;QAC7E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,wCAAwC,EAAE;gBACpD,OAAO;gBACP,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAMD,KAAK,CAAC,kBAAkB,CAAC,MAAc,EAAE,OAAe;QACtD,IAAI,CAAC;YACH,MAAM,mBAAmB,CAAC,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QAC/E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,0CAA0C,EAAE;gBACtD,OAAO;gBACP,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,sBAAsB,EAAE,CAAC"}
@@ -34,10 +34,14 @@ export interface RatchetPRFullDetails {
34
34
  }> | null;
35
35
  }
36
36
  export interface RatchetReviewComment {
37
- updatedAt: string;
38
37
  author: {
39
38
  login: string;
40
39
  };
40
+ body: string;
41
+ path: string;
42
+ line: number | null;
43
+ updatedAt: string;
44
+ url: string;
41
45
  }
42
46
  export interface RatchetStatusCheckInput {
43
47
  name?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"bridges.d.ts","sourceRoot":"","sources":["../../../../../src/backend/domains/ratchet/bridges.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bridges.d.ts","sourceRoot":"","sources":["../../../../../src/backend/domains/ratchet/bridges.ts"],"names":[],"mappings":"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"}
@@ -44,6 +44,7 @@ declare class RatchetService extends EventEmitter {
44
44
  private sleepTimeout;
45
45
  private sleepResolve;
46
46
  private readonly checkLimit;
47
+ private readonly inFlightWorkspaceChecks;
47
48
  private cachedAuthenticatedUsername;
48
49
  private readonly backoff;
49
50
  private readonly reviewPollTrackers;
@@ -65,6 +66,7 @@ declare class RatchetService extends EventEmitter {
65
66
  private wakeSleep;
66
67
  checkAllWorkspaces(): Promise<RatchetCheckResult>;
67
68
  checkWorkspaceById(workspaceId: string): Promise<WorkspaceRatchetResult | null>;
69
+ private runWorkspaceCheck;
68
70
  setWorkspaceRatcheting(workspaceId: string, enabled: boolean): Promise<void>;
69
71
  private processWorkspace;
70
72
  private logWorkspaceRatchetingDecision;
@@ -1 +1 @@
1
- {"version":3,"file":"ratchet.service.d.ts","sourceRoot":"","sources":["../../../../../src/backend/domains/ratchet/ratchet.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ratchet.service.d.ts","sourceRoot":"","sources":["../../../../../src/backend/domains/ratchet/ratchet.service.ts"],"names":[],"mappings":"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"}
@@ -11,13 +11,7 @@ import { fixerSessionService } from './fixer-session.service.js';
11
11
  import { ratchetProviderResolverService } from './ratchet-provider-resolver.service.js';
12
12
  const logger = createLogger('ratchet');
13
13
  const RATCHET_WORKFLOW = 'ratchet';
14
- const REVIEW_POLL_OFFSETS_MS = [
15
- 2 * 60_000,
16
- 5 * 60_000,
17
- 15 * 60_000,
18
- 45 * 60_000,
19
- 120 * 60_000,
20
- ];
14
+ const REVIEW_POLL_INTERVAL_MS = 2 * 60_000;
21
15
  export const RATCHET_STATE_CHANGED = 'ratchet_state_changed';
22
16
  class RatchetService extends EventEmitter {
23
17
  isShuttingDown = false;
@@ -25,6 +19,7 @@ class RatchetService extends EventEmitter {
25
19
  sleepTimeout = null;
26
20
  sleepResolve = null;
27
21
  checkLimit = pLimit(SERVICE_CONCURRENCY.ratchetWorkspaceChecks);
22
+ inFlightWorkspaceChecks = new Map();
28
23
  cachedAuthenticatedUsername = null;
29
24
  backoff = new RateLimitBackoff();
30
25
  reviewPollTrackers = new Map();
@@ -133,7 +128,7 @@ class RatchetService extends EventEmitter {
133
128
  if (workspaces.length === 0) {
134
129
  return { checked: 0, stateChanges: 0, actionsTriggered: 0, results: [] };
135
130
  }
136
- const results = await Promise.all(workspaces.map((workspace) => this.checkLimit(() => this.processWorkspace(workspace))));
131
+ const results = await Promise.all(workspaces.map((workspace) => this.checkLimit(() => this.runWorkspaceCheck(workspace.id, () => this.processWorkspace(workspace)))));
137
132
  const stateChanges = results.filter((r) => r.previousState !== r.newState).length;
138
133
  const actionsTriggered = results.filter((r) => r.action.type === 'TRIGGERED_FIXER').length;
139
134
  if (stateChanges > 0 || actionsTriggered > 0) {
@@ -153,7 +148,20 @@ class RatchetService extends EventEmitter {
153
148
  if (!workspace) {
154
149
  return null;
155
150
  }
156
- return this.processWorkspace(workspace);
151
+ return this.runWorkspaceCheck(workspace.id, () => this.processWorkspace(workspace));
152
+ }
153
+ runWorkspaceCheck(workspaceId, runner) {
154
+ const existing = this.inFlightWorkspaceChecks.get(workspaceId);
155
+ if (existing) {
156
+ return existing;
157
+ }
158
+ const inFlight = runner().finally(() => {
159
+ if (this.inFlightWorkspaceChecks.get(workspaceId) === inFlight) {
160
+ this.inFlightWorkspaceChecks.delete(workspaceId);
161
+ }
162
+ });
163
+ this.inFlightWorkspaceChecks.set(workspaceId, inFlight);
164
+ return inFlight;
157
165
  }
158
166
  async setWorkspaceRatcheting(workspaceId, enabled) {
159
167
  const workspace = await workspaceAccessor.findById(workspaceId);
@@ -226,8 +234,11 @@ class RatchetService extends EventEmitter {
226
234
  }
227
235
  const decisionContext = await this.buildRatchetDecisionContext(workspace, prStateInfo);
228
236
  const decision = this.decideRatchetAction(decisionContext);
229
- if (decisionContext.isCleanPrWithNoNewReviewActivity) {
230
- const pollDispatch = await this.processReviewCommentPoll(workspace, prStateInfo, authenticatedUsername, decisionContext);
237
+ if (prStateInfo.prState === 'MERGED') {
238
+ this.reviewPollTrackers.delete(workspace.id);
239
+ }
240
+ else if (decisionContext.isCleanPrWithNoNewReviewActivity) {
241
+ const pollDispatch = await this.processReviewCommentPoll(workspace, prStateInfo, authenticatedUsername);
231
242
  if (pollDispatch) {
232
243
  return pollDispatch;
233
244
  }
@@ -526,8 +537,8 @@ class RatchetService extends EventEmitter {
526
537
  }
527
538
  return false;
528
539
  }
529
- async processReviewCommentPoll(workspace, prStateInfo, authenticatedUsername, decisionContext) {
530
- const pollResult = await this.handleReviewCommentPoll(workspace, prStateInfo, authenticatedUsername, decisionContext.hasStateChangedSinceLastDispatch);
540
+ async processReviewCommentPoll(workspace, prStateInfo, authenticatedUsername) {
541
+ const pollResult = await this.handleReviewCommentPoll(workspace, prStateInfo, authenticatedUsername);
531
542
  if (pollResult.action === 'comments-found') {
532
543
  const freshContext = await this.buildRatchetDecisionContext(workspace, pollResult.freshPrState);
533
544
  const freshDecision = this.decideRatchetAction(freshContext);
@@ -548,25 +559,17 @@ class RatchetService extends EventEmitter {
548
559
  action: freshAction,
549
560
  };
550
561
  }
551
- if (pollResult.action === 'exhausted') {
552
- await workspaceAccessor.update(workspace.id, {
553
- ratchetLastCiRunId: prStateInfo.snapshotKey,
554
- });
555
- }
556
562
  return null;
557
563
  }
558
- async handleReviewCommentPoll(workspace, prStateInfo, authenticatedUsername, hasStateChangedSinceLastDispatch) {
564
+ async handleReviewCommentPoll(workspace, prStateInfo, authenticatedUsername) {
559
565
  const existing = this.reviewPollTrackers.get(workspace.id);
560
566
  if (!existing) {
561
- if (!hasStateChangedSinceLastDispatch) {
562
- return { action: 'waiting' };
563
- }
564
567
  this.reviewPollTrackers.set(workspace.id, {
565
568
  snapshotKey: prStateInfo.snapshotKey,
566
- startedAt: Date.now(),
569
+ lastPolledAt: Date.now(),
567
570
  pollCount: 0,
568
571
  });
569
- logger.info('Started review comment backoff polling', {
572
+ logger.info('Started review comment polling', {
570
573
  workspaceId: workspace.id,
571
574
  snapshotKey: prStateInfo.snapshotKey,
572
575
  });
@@ -575,30 +578,16 @@ class RatchetService extends EventEmitter {
575
578
  if (existing.snapshotKey !== prStateInfo.snapshotKey) {
576
579
  this.reviewPollTrackers.set(workspace.id, {
577
580
  snapshotKey: prStateInfo.snapshotKey,
578
- startedAt: Date.now(),
581
+ lastPolledAt: Date.now(),
579
582
  pollCount: 0,
580
583
  });
581
- logger.info('Reset review comment backoff polling (new snapshot)', {
584
+ logger.info('Reset review comment polling (new snapshot)', {
582
585
  workspaceId: workspace.id,
583
586
  snapshotKey: prStateInfo.snapshotKey,
584
587
  });
585
588
  return { action: 'waiting' };
586
589
  }
587
- if (existing.pollCount >= REVIEW_POLL_OFFSETS_MS.length) {
588
- this.reviewPollTrackers.delete(workspace.id);
589
- logger.info('Review comment backoff polling exhausted', {
590
- workspaceId: workspace.id,
591
- totalPolls: existing.pollCount,
592
- elapsedMs: Date.now() - existing.startedAt,
593
- });
594
- return { action: 'exhausted' };
595
- }
596
- const offset = REVIEW_POLL_OFFSETS_MS[existing.pollCount];
597
- if (offset === undefined) {
598
- return { action: 'waiting' };
599
- }
600
- const nextPollAt = existing.startedAt + offset;
601
- if (Date.now() < nextPollAt) {
590
+ if (Date.now() - existing.lastPolledAt < REVIEW_POLL_INTERVAL_MS) {
602
591
  return { action: 'waiting' };
603
592
  }
604
593
  if (this.isShuttingDown) {
@@ -609,25 +598,16 @@ class RatchetService extends EventEmitter {
609
598
  return { action: 'waiting' };
610
599
  }
611
600
  existing.pollCount++;
601
+ existing.lastPolledAt = Date.now();
612
602
  if (!this.shouldSkipCleanPR(workspace, freshPrState)) {
613
603
  this.reviewPollTrackers.delete(workspace.id);
614
- logger.info('Review comments detected during backoff poll', {
604
+ logger.info('Review comments detected during poll', {
615
605
  workspaceId: workspace.id,
616
606
  pollNumber: existing.pollCount,
617
- elapsedMs: Date.now() - existing.startedAt,
618
607
  latestReviewActivityAtMs: freshPrState.latestReviewActivityAtMs,
619
608
  });
620
609
  return { action: 'comments-found', freshPrState };
621
610
  }
622
- if (existing.pollCount >= REVIEW_POLL_OFFSETS_MS.length) {
623
- this.reviewPollTrackers.delete(workspace.id);
624
- logger.info('Review comment backoff polling exhausted', {
625
- workspaceId: workspace.id,
626
- totalPolls: existing.pollCount,
627
- elapsedMs: Date.now() - existing.startedAt,
628
- });
629
- return { action: 'exhausted' };
630
- }
631
611
  return { action: 'waiting' };
632
612
  }
633
613
  hasStateChangedSinceLastDispatch(workspace, prStateInfo) {
@@ -765,6 +745,15 @@ class RatchetService extends EventEmitter {
765
745
  const hasChangesRequested = prDetails.reviewDecision === 'CHANGES_REQUESTED';
766
746
  const latestReviewActivityAtMs = this.computeLatestReviewActivityAtMs(prDetails, reviewComments, authenticatedUsername);
767
747
  const snapshotKey = this.computeDispatchSnapshotKey(ciStatus, hasChangesRequested, latestReviewActivityAtMs, statusCheckRollup);
748
+ const filteredReviewComments = reviewComments
749
+ .filter((c) => !this.isIgnoredReviewAuthor(c.author.login, authenticatedUsername))
750
+ .map((c) => ({
751
+ author: c.author.login,
752
+ body: c.body,
753
+ path: c.path,
754
+ line: c.line,
755
+ url: c.url,
756
+ }));
768
757
  return {
769
758
  ciStatus,
770
759
  snapshotKey,
@@ -773,6 +762,7 @@ class RatchetService extends EventEmitter {
773
762
  statusCheckRollup,
774
763
  prState: prDetails.state,
775
764
  prNumber: prDetails.number,
765
+ reviewComments: filteredReviewComments,
776
766
  };
777
767
  }
778
768
  catch (error) {
@@ -876,7 +866,7 @@ class RatchetService extends EventEmitter {
876
866
  sessionName: 'Ratchet',
877
867
  runningIdleAction: 'restart',
878
868
  dispatchMode: 'start_empty_and_send',
879
- buildPrompt: () => buildRatchetDispatchPrompt(workspace.prUrl, prStateInfo.prNumber),
869
+ buildPrompt: () => buildRatchetDispatchPrompt(workspace.prUrl, prStateInfo.prNumber, prStateInfo.reviewComments),
880
870
  beforeStart: ({ sessionId, prompt }) => {
881
871
  this.session.injectCommittedUserMessage(sessionId, prompt);
882
872
  },