factory-factory 0.4.2 → 0.4.4
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.
- package/dist/client/assets/{abnfDiagram-VRR7QNED-Bz06FkfB.js → abnfDiagram-VRR7QNED-CtUj9J56.js} +1 -1
- package/dist/client/assets/{arc--1iscGgN.js → arc-2QeawLbF.js} +1 -1
- package/dist/client/assets/{architectureDiagram-ZJ3FMSHR-Ds-52hDI.js → architectureDiagram-ZJ3FMSHR-Cz-V9xRh.js} +1 -1
- package/dist/client/assets/{blockDiagram-677ZJIJ3-DZwPPZmp.js → blockDiagram-677ZJIJ3-BN6MDejN.js} +1 -1
- package/dist/client/assets/{c4Diagram-LMCZKHZV-RQch21fC.js → c4Diagram-LMCZKHZV-ZxcmUt9u.js} +1 -1
- package/dist/client/assets/channel-DVMObwOq.js +1 -0
- package/dist/client/assets/{chunk-2Q5K7J3B-Df6Q19iI.js → chunk-2Q5K7J3B-CyvdNBvs.js} +1 -1
- package/dist/client/assets/{chunk-32BRIVSS-DlbaZtVC.js → chunk-32BRIVSS-BXA35oY0.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-KgkMhS6k.js → chunk-5VM5RSS4-6lY9D3Us.js} +1 -1
- package/dist/client/assets/{chunk-EX3LRPZG-DAfTWCem.js → chunk-EX3LRPZG-BRYEhwoK.js} +1 -1
- package/dist/client/assets/{chunk-JWPE2WC7-D6Y5C5Yz.js → chunk-JWPE2WC7-DBeDDTf3.js} +1 -1
- package/dist/client/assets/{chunk-MOJQB5TN-B_P4pqPC.js → chunk-MOJQB5TN-MIX8YUEz.js} +1 -1
- package/dist/client/assets/{chunk-RYQCIY6F-CzFboHFv.js → chunk-RYQCIY6F-CT_f1sbt.js} +1 -1
- package/dist/client/assets/{chunk-V7JOEXUC-8yT3lW_D.js → chunk-V7JOEXUC-DpMacC1A.js} +1 -1
- package/dist/client/assets/{chunk-VR4S4FIN-B_QG1di-.js → chunk-VR4S4FIN-Bd6MGh78.js} +1 -1
- package/dist/client/assets/{chunk-XXDRQBXY-CzL4_omu.js → chunk-XXDRQBXY-BYg-oILv.js} +1 -1
- package/dist/client/assets/classDiagram-OUVF2IWQ-wHGXcbfd.js +1 -0
- package/dist/client/assets/classDiagram-v2-EOCWNBFH-wHGXcbfd.js +1 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-DmZLPx5-.js → cose-bilkent-JH36ORCC-BGhjYi6z.js} +1 -1
- package/dist/client/assets/{cynefin-VYW2F7L2-DUejQU5F.js → cynefin-VYW2F7L2-BouObN4T.js} +1 -1
- package/dist/client/assets/{cynefinDiagram-TSTJHNR4-BjallChk.js → cynefinDiagram-TSTJHNR4-DrbscNyk.js} +1 -1
- package/dist/client/assets/{dagre-VKFMJZFB-COdOy8Kp.js → dagre-VKFMJZFB-CpHBhtab.js} +1 -1
- package/dist/client/assets/{diagram-FQU43EPY-C8Xk7Fyh.js → diagram-FQU43EPY-C_pXymmj.js} +1 -1
- package/dist/client/assets/{diagram-G47NLZAW-B_qqKBqq.js → diagram-G47NLZAW-DNPz9Qrh.js} +1 -1
- package/dist/client/assets/{diagram-NH7WQ7WH-DS1-6fzl.js → diagram-NH7WQ7WH-DWHcerSm.js} +1 -1
- package/dist/client/assets/{diagram-OA4YK3LP-enaDU5V4.js → diagram-OA4YK3LP-C6Jnb8nm.js} +1 -1
- package/dist/client/assets/{diagram-WEI45ONY-Cx6LFRuh.js → diagram-WEI45ONY-DF667tXW.js} +1 -1
- package/dist/client/assets/{ebnfDiagram-CCIWWBDH-DVGMcsj6.js → ebnfDiagram-CCIWWBDH-_Wt4C-Lm.js} +1 -1
- package/dist/client/assets/{erDiagram-Q63AITRT-DCsDfIB_.js → erDiagram-Q63AITRT-D9F9IIZ7.js} +1 -1
- package/dist/client/assets/{flowDiagram-23GEKE2U-C5QCjsF8.js → flowDiagram-23GEKE2U-BzTUtnLY.js} +1 -1
- package/dist/client/assets/{ganttDiagram-NO4QXBWP-CLvtSsZ-.js → ganttDiagram-NO4QXBWP-lmFnKYE5.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-IHSO6WYX-BS6vNDTo.js → gitGraphDiagram-IHSO6WYX-DiIQa_m6.js} +1 -1
- package/dist/client/assets/{index-0-xpZu6O.js → index-CpvT2M5m.js} +168 -168
- package/dist/client/assets/index-CwfNzqG5.css +1 -0
- package/dist/client/assets/{infoDiagram-FWYZ7A6U-CIuYQAoE.js → infoDiagram-FWYZ7A6U-BXtmiN5g.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-FXEZZL3T-DeVUVV8X.js → ishikawaDiagram-FXEZZL3T-Ce8fzasD.js} +1 -1
- package/dist/client/assets/{journeyDiagram-5HDEW3XC-BsmmwqMS.js → journeyDiagram-5HDEW3XC-CAhJE-OU.js} +1 -1
- package/dist/client/assets/{kanban-definition-HUTT4EX6-D-mDPzR0.js → kanban-definition-HUTT4EX6-B8br5xew.js} +1 -1
- package/dist/client/assets/{linear-BSdMIO3_.js → linear-BPVVEns_.js} +1 -1
- package/dist/client/assets/{mindmap-definition-LN4V7U3C-DOuSISM2.js → mindmap-definition-LN4V7U3C-lX6h9H-N.js} +1 -1
- package/dist/client/assets/{mobile-baseline-C-1Tc5b_.js → mobile-baseline-C45NSkzw.js} +1 -1
- package/dist/client/assets/{pegDiagram-2B236MQR-C8CMsmVK.js → pegDiagram-2B236MQR-CiFWwnk4.js} +1 -1
- package/dist/client/assets/{pieDiagram-ENE6RG2P-B1UfUhQO.js → pieDiagram-ENE6RG2P-CvkwWtzQ.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-ABIIQ3AL-DujmyYtF.js → quadrantDiagram-ABIIQ3AL-B40anMyK.js} +1 -1
- package/dist/client/assets/{railroadDiagram-RFXS5EU6-DaF-IoiS.js → railroadDiagram-RFXS5EU6-WVYsdkDC.js} +1 -1
- package/dist/client/assets/{requirementDiagram-TGXJPOKE-dfpBVIPb.js → requirementDiagram-TGXJPOKE-DBTIsXpA.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-HTMAVEWB-BYCvwHlS.js → sankeyDiagram-HTMAVEWB-Dx8y47pZ.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-DBY2YBRQ-DOdQoxUf.js → sequenceDiagram-DBY2YBRQ-C6ZZMZJm.js} +1 -1
- package/dist/client/assets/{sizeCapture-X5ZJPWSS-9sUXw3Q8.js → sizeCapture-X5ZJPWSS-DLy8loNR.js} +1 -1
- package/dist/client/assets/{stateDiagram-2N3HPSRC-QZszWUA_.js → stateDiagram-2N3HPSRC-RoTcqZkX.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-6OUMAXLB-CGxDgHho.js +1 -0
- package/dist/client/assets/{swimlanes-5IMT3BWC-CtEVTRNN.js → swimlanes-5IMT3BWC-CFmoSHiT.js} +2 -2
- package/dist/client/assets/swimlanesDiagram-G3AALYLV-1u_1g3u4.js +8 -0
- package/dist/client/assets/{terminal-instance-nU4PXHMm.js → terminal-instance-Br0jXsXE.js} +1 -1
- package/dist/client/assets/{timeline-definition-FHXFAJF6-0fOfnsxU.js → timeline-definition-FHXFAJF6-Bh5XA09y.js} +1 -1
- package/dist/client/assets/{vennDiagram-L72KCM5P-5eWMXdkg.js → vennDiagram-L72KCM5P-BC754zGO.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-EHGQE667-BwNCxx2w.js → wardleyDiagram-EHGQE667-xJdUzWCg.js} +1 -1
- package/dist/client/assets/{xychartDiagram-FW5EYKEG-VIc8vlw6.js → xychartDiagram-FW5EYKEG-wxQH1S7i.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/client/logo.png +0 -0
- package/dist/client/logo.sips.png +0 -0
- package/dist/prisma/generated/internal/class.js +4 -4
- package/dist/prisma/generated/internal/class.js.map +1 -1
- package/dist/prisma/generated/internal/prismaNamespace.d.ts +1 -0
- package/dist/prisma/generated/internal/prismaNamespace.d.ts.map +1 -1
- package/dist/prisma/generated/internal/prismaNamespace.js +2 -1
- package/dist/prisma/generated/internal/prismaNamespace.js.map +1 -1
- package/dist/prisma/generated/internal/prismaNamespaceBrowser.d.ts +1 -0
- package/dist/prisma/generated/internal/prismaNamespaceBrowser.d.ts.map +1 -1
- package/dist/prisma/generated/internal/prismaNamespaceBrowser.js +2 -1
- package/dist/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
- package/dist/prisma/generated/models/WorkspaceRatchet.d.ts +33 -1
- package/dist/prisma/generated/models/WorkspaceRatchet.d.ts.map +1 -1
- package/dist/scripts/check-fk-indexes.d.ts +2 -0
- package/dist/scripts/check-fk-indexes.d.ts.map +1 -0
- package/dist/scripts/check-fk-indexes.js +143 -0
- package/dist/scripts/check-fk-indexes.js.map +1 -0
- package/dist/src/backend/lib/application-error.d.ts +6 -1
- package/dist/src/backend/lib/application-error.d.ts.map +1 -1
- package/dist/src/backend/lib/application-error.js +2 -0
- package/dist/src/backend/lib/application-error.js.map +1 -1
- package/dist/src/backend/lib/application-error.test.js +10 -0
- package/dist/src/backend/lib/application-error.test.js.map +1 -1
- package/dist/src/backend/lib/workspace-derived-state.d.ts +7 -16
- package/dist/src/backend/lib/workspace-derived-state.d.ts.map +1 -1
- package/dist/src/backend/lib/workspace-derived-state.js +21 -24
- package/dist/src/backend/lib/workspace-derived-state.js.map +1 -1
- package/dist/src/backend/lib/workspace-derived-state.test.js +37 -50
- package/dist/src/backend/lib/workspace-derived-state.test.js.map +1 -1
- package/dist/src/backend/orchestration/data-backup.service.test.js +1 -0
- package/dist/src/backend/orchestration/data-backup.service.test.js.map +1 -1
- package/dist/src/backend/orchestration/domain-bridges.orchestrator.d.ts.map +1 -1
- package/dist/src/backend/orchestration/domain-bridges.orchestrator.js +4 -3
- package/dist/src/backend/orchestration/domain-bridges.orchestrator.js.map +1 -1
- package/dist/src/backend/orchestration/event-coalescer.integration.test.js +7 -16
- package/dist/src/backend/orchestration/event-coalescer.integration.test.js.map +1 -1
- package/dist/src/backend/orchestration/event-collector.orchestrator.d.ts +2 -1
- package/dist/src/backend/orchestration/event-collector.orchestrator.d.ts.map +1 -1
- package/dist/src/backend/orchestration/event-collector.orchestrator.js +8 -1
- package/dist/src/backend/orchestration/event-collector.orchestrator.js.map +1 -1
- package/dist/src/backend/orchestration/event-collector.orchestrator.test.js +39 -2
- package/dist/src/backend/orchestration/event-collector.orchestrator.test.js.map +1 -1
- package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.d.ts.map +1 -1
- package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.js +4 -0
- package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.js.map +1 -1
- package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.test.js +7 -2
- package/dist/src/backend/orchestration/snapshot-reconciliation.orchestrator.test.js.map +1 -1
- package/dist/src/backend/orchestration/workspace-archive.orchestrator.d.ts +4 -4
- package/dist/src/backend/orchestration/workspace-archive.orchestrator.d.ts.map +1 -1
- package/dist/src/backend/orchestration/workspace-archive.orchestrator.js +1 -1
- package/dist/src/backend/orchestration/workspace-archive.orchestrator.js.map +1 -1
- package/dist/src/backend/orchestration/workspace-archive.orchestrator.test.js +5 -7
- package/dist/src/backend/orchestration/workspace-archive.orchestrator.test.js.map +1 -1
- package/dist/src/backend/routers/websocket/chat.handler.js +1 -1
- package/dist/src/backend/routers/websocket/chat.handler.js.map +1 -1
- package/dist/src/backend/routers/websocket/chat.handler.test.js +6 -2
- package/dist/src/backend/routers/websocket/chat.handler.test.js.map +1 -1
- package/dist/src/backend/routers/websocket/websocket.integration.test.js +0 -1
- package/dist/src/backend/routers/websocket/websocket.integration.test.js.map +1 -1
- package/dist/src/backend/server.d.ts.map +1 -1
- package/dist/src/backend/server.js +2 -1
- package/dist/src/backend/server.js.map +1 -1
- package/dist/src/backend/server.upgrade.test.js +20 -0
- package/dist/src/backend/server.upgrade.test.js.map +1 -1
- package/dist/src/backend/services/github/service/bridges.d.ts +1 -0
- package/dist/src/backend/services/github/service/bridges.d.ts.map +1 -1
- package/dist/src/backend/services/github/service/pr-snapshot.service.d.ts +1 -0
- package/dist/src/backend/services/github/service/pr-snapshot.service.d.ts.map +1 -1
- package/dist/src/backend/services/github/service/pr-snapshot.service.js +1 -0
- package/dist/src/backend/services/github/service/pr-snapshot.service.js.map +1 -1
- package/dist/src/backend/services/github/service/pr-snapshot.service.test.js +11 -0
- package/dist/src/backend/services/github/service/pr-snapshot.service.test.js.map +1 -1
- package/dist/src/backend/services/linear/service/linear-client.service.d.ts +1 -1
- package/dist/src/backend/services/linear/service/linear-client.service.d.ts.map +1 -1
- package/dist/src/backend/services/linear/service/linear-client.service.js +4 -4
- package/dist/src/backend/services/linear/service/linear-client.service.js.map +1 -1
- package/dist/src/backend/services/linear/service/linear-client.service.test.js +10 -10
- package/dist/src/backend/services/linear/service/linear-client.service.test.js.map +1 -1
- package/dist/src/backend/services/periodic-task/resources/periodic-task.accessor.d.ts.map +1 -1
- package/dist/src/backend/services/periodic-task/resources/periodic-task.accessor.js +8 -5
- package/dist/src/backend/services/periodic-task/resources/periodic-task.accessor.js.map +1 -1
- package/dist/src/backend/services/periodic-task/resources/periodic-task.accessor.test.js +82 -0
- package/dist/src/backend/services/periodic-task/resources/periodic-task.accessor.test.js.map +1 -1
- package/dist/src/backend/services/ratchet/service/bridges.d.ts +2 -0
- package/dist/src/backend/services/ratchet/service/bridges.d.ts.map +1 -1
- package/dist/src/backend/services/ratchet/service/fixer-session.service.test.js +1 -0
- package/dist/src/backend/services/ratchet/service/fixer-session.service.test.js.map +1 -1
- package/dist/src/backend/services/ratchet/service/ratchet-active-session.helpers.d.ts.map +1 -1
- package/dist/src/backend/services/ratchet/service/ratchet-active-session.helpers.js +10 -2
- package/dist/src/backend/services/ratchet/service/ratchet-active-session.helpers.js.map +1 -1
- package/dist/src/backend/services/ratchet/service/ratchet.service.d.ts +2 -0
- package/dist/src/backend/services/ratchet/service/ratchet.service.d.ts.map +1 -1
- package/dist/src/backend/services/ratchet/service/ratchet.service.js +30 -0
- package/dist/src/backend/services/ratchet/service/ratchet.service.js.map +1 -1
- package/dist/src/backend/services/ratchet/service/ratchet.service.test.js +284 -5
- package/dist/src/backend/services/ratchet/service/ratchet.service.test.js.map +1 -1
- package/dist/src/backend/services/run-script/service/run-script.service.d.ts +1 -0
- package/dist/src/backend/services/run-script/service/run-script.service.d.ts.map +1 -1
- package/dist/src/backend/services/run-script/service/run-script.service.js +26 -17
- package/dist/src/backend/services/run-script/service/run-script.service.js.map +1 -1
- package/dist/src/backend/services/run-script/service/run-script.service.test.js +23 -0
- package/dist/src/backend/services/run-script/service/run-script.service.test.js.map +1 -1
- package/dist/src/backend/services/session/service/acp/child-workspace-mcp-server.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/acp/child-workspace-mcp-server.js +5 -0
- package/dist/src/backend/services/session/service/acp/child-workspace-mcp-server.js.map +1 -1
- package/dist/src/backend/services/session/service/acp/child-workspace-mcp-server.test.js +39 -6
- package/dist/src/backend/services/session/service/acp/child-workspace-mcp-server.test.js.map +1 -1
- package/dist/src/backend/services/session/service/chat/chat-message-handlers/attachment-processing.d.ts +0 -3
- package/dist/src/backend/services/session/service/chat/chat-message-handlers/attachment-processing.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/chat/chat-message-handlers/attachment-processing.js +66 -26
- package/dist/src/backend/services/session/service/chat/chat-message-handlers/attachment-processing.js.map +1 -1
- package/dist/src/backend/services/session/service/chat/chat-message-handlers/attachment-processing.test.js +194 -6
- package/dist/src/backend/services/session/service/chat/chat-message-handlers/attachment-processing.test.js.map +1 -1
- package/dist/src/backend/services/session/service/chat/chat-message-handlers/image-format-validation.d.ts +7 -0
- package/dist/src/backend/services/session/service/chat/chat-message-handlers/image-format-validation.d.ts.map +1 -0
- package/dist/src/backend/services/session/service/chat/chat-message-handlers/image-format-validation.js +466 -0
- package/dist/src/backend/services/session/service/chat/chat-message-handlers/image-format-validation.js.map +1 -0
- package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.js +6 -4
- package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.js.map +1 -1
- package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.test.js +52 -15
- package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.test.js.map +1 -1
- package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.js +3 -1
- package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.js.map +1 -1
- package/dist/src/backend/services/session/service/lifecycle/session.service.test.js +104 -1
- package/dist/src/backend/services/session/service/lifecycle/session.service.test.js.map +1 -1
- package/dist/src/backend/services/session/service/session-domain.service.d.ts +5 -1
- package/dist/src/backend/services/session/service/session-domain.service.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/session-domain.service.js +50 -31
- package/dist/src/backend/services/session/service/session-domain.service.js.map +1 -1
- package/dist/src/backend/services/session/service/session-domain.service.test.js +108 -0
- package/dist/src/backend/services/session/service/session-domain.service.test.js.map +1 -1
- package/dist/src/backend/services/session/service/store/session-replay-builder.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/store/session-replay-builder.js +2 -1
- package/dist/src/backend/services/session/service/store/session-replay-builder.js.map +1 -1
- package/dist/src/backend/services/session/service/store/session-store-registry.d.ts +8 -1
- package/dist/src/backend/services/session/service/store/session-store-registry.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/store/session-store-registry.js +58 -1
- package/dist/src/backend/services/session/service/store/session-store-registry.js.map +1 -1
- package/dist/src/backend/services/session/service/store/session-store-registry.test.js +120 -0
- package/dist/src/backend/services/session/service/store/session-store-registry.test.js.map +1 -1
- package/dist/src/backend/services/session/service/store/session-store.types.d.ts +5 -1
- package/dist/src/backend/services/session/service/store/session-store.types.d.ts.map +1 -1
- package/dist/src/backend/services/workspace/resources/workspace-auto-iteration.accessor.d.ts +8 -2
- package/dist/src/backend/services/workspace/resources/workspace-auto-iteration.accessor.d.ts.map +1 -1
- package/dist/src/backend/services/workspace/resources/workspace-auto-iteration.accessor.js +17 -10
- package/dist/src/backend/services/workspace/resources/workspace-auto-iteration.accessor.js.map +1 -1
- package/dist/src/backend/services/workspace/resources/workspace-auto-iteration.accessor.test.js +26 -10
- package/dist/src/backend/services/workspace/resources/workspace-auto-iteration.accessor.test.js.map +1 -1
- package/dist/src/backend/services/workspace/resources/workspace-ratchet.accessor.d.ts +4 -1
- package/dist/src/backend/services/workspace/resources/workspace-ratchet.accessor.d.ts.map +1 -1
- package/dist/src/backend/services/workspace/resources/workspace-ratchet.accessor.js +20 -2
- package/dist/src/backend/services/workspace/resources/workspace-ratchet.accessor.js.map +1 -1
- package/dist/src/backend/services/workspace/resources/workspace-ratchet.accessor.test.js +35 -1
- package/dist/src/backend/services/workspace/resources/workspace-ratchet.accessor.test.js.map +1 -1
- package/dist/src/backend/services/workspace/resources/workspace.accessor.d.ts +10 -3
- package/dist/src/backend/services/workspace/resources/workspace.accessor.d.ts.map +1 -1
- package/dist/src/backend/services/workspace/resources/workspace.accessor.js +16 -6
- package/dist/src/backend/services/workspace/resources/workspace.accessor.js.map +1 -1
- package/dist/src/backend/services/workspace/resources/workspace.accessor.test.js +33 -2
- package/dist/src/backend/services/workspace/resources/workspace.accessor.test.js.map +1 -1
- package/dist/src/backend/services/workspace/service/index.d.ts +1 -2
- package/dist/src/backend/services/workspace/service/index.d.ts.map +1 -1
- package/dist/src/backend/services/workspace/service/index.js +1 -2
- package/dist/src/backend/services/workspace/service/index.js.map +1 -1
- package/dist/src/backend/services/workspace/service/lifecycle/creation.service.test.js +1 -0
- package/dist/src/backend/services/workspace/service/lifecycle/creation.service.test.js.map +1 -1
- package/dist/src/backend/services/workspace/service/lifecycle/data.service.d.ts +3 -1
- package/dist/src/backend/services/workspace/service/lifecycle/data.service.d.ts.map +1 -1
- package/dist/src/backend/services/workspace/service/lifecycle/workspace-auto-iteration.service.d.ts +10 -2
- package/dist/src/backend/services/workspace/service/lifecycle/workspace-auto-iteration.service.d.ts.map +1 -1
- package/dist/src/backend/services/workspace/service/lifecycle/workspace-auto-iteration.service.js +19 -5
- package/dist/src/backend/services/workspace/service/lifecycle/workspace-auto-iteration.service.js.map +1 -1
- package/dist/src/backend/services/workspace/service/lifecycle/workspace-pr-snapshot.service.test.js +1 -0
- package/dist/src/backend/services/workspace/service/lifecycle/workspace-pr-snapshot.service.test.js.map +1 -1
- package/dist/src/backend/services/workspace/service/lifecycle/workspace-ratchet.service.d.ts +1 -0
- package/dist/src/backend/services/workspace/service/lifecycle/workspace-ratchet.service.d.ts.map +1 -1
- package/dist/src/backend/services/workspace/service/lifecycle/workspace-ratchet.service.js +3 -0
- package/dist/src/backend/services/workspace/service/lifecycle/workspace-ratchet.service.js.map +1 -1
- package/dist/src/backend/services/workspace/service/lifecycle/workspace-relationships.service.d.ts +1 -0
- package/dist/src/backend/services/workspace/service/lifecycle/workspace-relationships.service.d.ts.map +1 -1
- package/dist/src/backend/services/workspace/service/lifecycle/workspace-state-capabilities.test.js +38 -3
- package/dist/src/backend/services/workspace/service/lifecycle/workspace-state-capabilities.test.js.map +1 -1
- package/dist/src/backend/services/workspace/service/query/workspace-maintenance.service.d.ts +1 -0
- package/dist/src/backend/services/workspace/service/query/workspace-maintenance.service.d.ts.map +1 -1
- package/dist/src/backend/services/workspace/service/query/workspace-query.service.d.ts +2 -0
- package/dist/src/backend/services/workspace/service/query/workspace-query.service.d.ts.map +1 -1
- package/dist/src/backend/services/workspace/service/query/workspace-query.service.js +34 -20
- package/dist/src/backend/services/workspace/service/query/workspace-query.service.js.map +1 -1
- package/dist/src/backend/services/workspace/service/query/workspace-query.service.test.js +102 -11
- package/dist/src/backend/services/workspace/service/query/workspace-query.service.test.js.map +1 -1
- package/dist/src/backend/services/workspace/service/snapshot/workspace-snapshot-store.service.d.ts +5 -12
- package/dist/src/backend/services/workspace/service/snapshot/workspace-snapshot-store.service.d.ts.map +1 -1
- package/dist/src/backend/services/workspace/service/snapshot/workspace-snapshot-store.service.js +23 -9
- package/dist/src/backend/services/workspace/service/snapshot/workspace-snapshot-store.service.js.map +1 -1
- package/dist/src/backend/services/workspace/service/snapshot/workspace-snapshot-store.service.test.js +28 -18
- package/dist/src/backend/services/workspace/service/snapshot/workspace-snapshot-store.service.test.js.map +1 -1
- package/dist/src/backend/services/workspace/service/state/flow-state.d.ts.map +1 -1
- package/dist/src/backend/services/workspace/service/state/flow-state.js +1 -9
- package/dist/src/backend/services/workspace/service/state/flow-state.js.map +1 -1
- package/dist/src/backend/services/workspace/service/state/flow-state.test.js +10 -27
- package/dist/src/backend/services/workspace/service/state/flow-state.test.js.map +1 -1
- package/dist/src/backend/services/workspace/service/workspace-domain-exports.test.js +1 -4
- package/dist/src/backend/services/workspace/service/workspace-domain-exports.test.js.map +1 -1
- package/dist/src/backend/services/workspace/service/worktree/git-ops.service.d.ts +8 -1
- package/dist/src/backend/services/workspace/service/worktree/git-ops.service.d.ts.map +1 -1
- package/dist/src/backend/services/workspace/service/worktree/git-ops.service.js +45 -8
- package/dist/src/backend/services/workspace/service/worktree/git-ops.service.js.map +1 -1
- package/dist/src/backend/services/workspace/service/worktree/git-ops.service.test.js +108 -13
- package/dist/src/backend/services/workspace/service/worktree/git-ops.service.test.js.map +1 -1
- package/dist/src/backend/services/workspace/service/worktree/worktree-lifecycle.service.d.ts +3 -3
- package/dist/src/backend/services/workspace/service/worktree/worktree-lifecycle.service.d.ts.map +1 -1
- package/dist/src/backend/services/workspace/service/worktree/worktree-lifecycle.service.js +8 -1
- package/dist/src/backend/services/workspace/service/worktree/worktree-lifecycle.service.js.map +1 -1
- package/dist/src/backend/services/workspace/service/worktree/worktree-lifecycle.service.test.js +29 -12
- package/dist/src/backend/services/workspace/service/worktree/worktree-lifecycle.service.test.js.map +1 -1
- package/dist/src/backend/services/workspace-git-state.service.d.ts +1 -0
- package/dist/src/backend/services/workspace-git-state.service.d.ts.map +1 -1
- package/dist/src/backend/services/workspace-git-state.service.js +14 -0
- package/dist/src/backend/services/workspace-git-state.service.js.map +1 -1
- package/dist/src/backend/services/workspace-git-state.service.test.js +37 -0
- package/dist/src/backend/services/workspace-git-state.service.test.js.map +1 -1
- package/dist/src/backend/testing/check-fk-indexes-script.test.d.ts +2 -0
- package/dist/src/backend/testing/check-fk-indexes-script.test.d.ts.map +1 -0
- package/dist/src/backend/testing/check-fk-indexes-script.test.js +46 -0
- package/dist/src/backend/testing/check-fk-indexes-script.test.js.map +1 -0
- package/dist/src/backend/trpc/admin.trpc.d.ts +11 -1
- package/dist/src/backend/trpc/admin.trpc.d.ts.map +1 -1
- package/dist/src/backend/trpc/auto-iteration.trpc.d.ts +11 -1
- package/dist/src/backend/trpc/auto-iteration.trpc.d.ts.map +1 -1
- package/dist/src/backend/trpc/closed-sessions.trpc.d.ts +11 -1
- package/dist/src/backend/trpc/closed-sessions.trpc.d.ts.map +1 -1
- package/dist/src/backend/trpc/context-dependencies.test.js +0 -1
- package/dist/src/backend/trpc/context-dependencies.test.js.map +1 -1
- package/dist/src/backend/trpc/decision-log.trpc.d.ts +11 -1
- package/dist/src/backend/trpc/decision-log.trpc.d.ts.map +1 -1
- package/dist/src/backend/trpc/github.trpc.d.ts +11 -1
- package/dist/src/backend/trpc/github.trpc.d.ts.map +1 -1
- package/dist/src/backend/trpc/index.d.ts +151 -16
- package/dist/src/backend/trpc/index.d.ts.map +1 -1
- package/dist/src/backend/trpc/linear.trpc.d.ts +11 -1
- package/dist/src/backend/trpc/linear.trpc.d.ts.map +1 -1
- package/dist/src/backend/trpc/periodic-task.trpc.d.ts +11 -1
- package/dist/src/backend/trpc/periodic-task.trpc.d.ts.map +1 -1
- package/dist/src/backend/trpc/pr-review.trpc.d.ts +11 -1
- package/dist/src/backend/trpc/pr-review.trpc.d.ts.map +1 -1
- package/dist/src/backend/trpc/project.trpc.d.ts +11 -1
- package/dist/src/backend/trpc/project.trpc.d.ts.map +1 -1
- package/dist/src/backend/trpc/session.trpc.d.ts +11 -1
- package/dist/src/backend/trpc/session.trpc.d.ts.map +1 -1
- package/dist/src/backend/trpc/trpc.d.ts +11 -1
- package/dist/src/backend/trpc/trpc.d.ts.map +1 -1
- package/dist/src/backend/trpc/trpc.js +10 -0
- package/dist/src/backend/trpc/trpc.js.map +1 -1
- package/dist/src/backend/trpc/user-settings.trpc.d.ts +11 -1
- package/dist/src/backend/trpc/user-settings.trpc.d.ts.map +1 -1
- package/dist/src/backend/trpc/workspace/children.router.test.js +7 -1
- package/dist/src/backend/trpc/workspace/children.router.test.js.map +1 -1
- package/dist/src/backend/trpc/workspace/children.trpc.d.ts +12 -2
- package/dist/src/backend/trpc/workspace/children.trpc.d.ts.map +1 -1
- package/dist/src/backend/trpc/workspace/children.trpc.js +11 -8
- package/dist/src/backend/trpc/workspace/children.trpc.js.map +1 -1
- package/dist/src/backend/trpc/workspace/files.trpc.d.ts +11 -1
- package/dist/src/backend/trpc/workspace/files.trpc.d.ts.map +1 -1
- package/dist/src/backend/trpc/workspace/git.trpc.d.ts +11 -1
- package/dist/src/backend/trpc/workspace/git.trpc.d.ts.map +1 -1
- package/dist/src/backend/trpc/workspace/ide.trpc.d.ts +11 -1
- package/dist/src/backend/trpc/workspace/ide.trpc.d.ts.map +1 -1
- package/dist/src/backend/trpc/workspace/init.trpc.d.ts +12 -1
- package/dist/src/backend/trpc/workspace/init.trpc.d.ts.map +1 -1
- package/dist/src/backend/trpc/workspace/run-script.trpc.d.ts +11 -1
- package/dist/src/backend/trpc/workspace/run-script.trpc.d.ts.map +1 -1
- package/dist/src/backend/trpc/workspace/workspace-helpers.d.ts +1 -0
- package/dist/src/backend/trpc/workspace/workspace-helpers.d.ts.map +1 -1
- package/dist/src/backend/trpc/workspace.router.test.js +11 -7
- package/dist/src/backend/trpc/workspace.router.test.js.map +1 -1
- package/dist/src/backend/trpc/workspace.trpc.d.ts +36 -7
- package/dist/src/backend/trpc/workspace.trpc.d.ts.map +1 -1
- package/dist/src/backend/trpc/workspace.trpc.js +22 -13
- package/dist/src/backend/trpc/workspace.trpc.js.map +1 -1
- package/dist/src/shared/acp-protocol/protocol/websocket.d.ts +1 -0
- package/dist/src/shared/acp-protocol/protocol/websocket.d.ts.map +1 -1
- package/dist/src/shared/acp-protocol/protocol/websocket.js.map +1 -1
- package/dist/src/shared/attachment-limits.d.ts +2 -0
- package/dist/src/shared/attachment-limits.d.ts.map +1 -0
- package/dist/src/shared/attachment-limits.js +2 -0
- package/dist/src/shared/attachment-limits.js.map +1 -0
- package/dist/src/shared/kanban-column-projection.d.ts +5 -0
- package/dist/src/shared/kanban-column-projection.d.ts.map +1 -0
- package/dist/src/shared/kanban-column-projection.js +31 -0
- package/dist/src/shared/kanban-column-projection.js.map +1 -0
- package/dist/src/shared/session-runtime.d.ts +1 -0
- package/dist/src/shared/session-runtime.d.ts.map +1 -1
- package/dist/src/shared/session-runtime.js +3 -0
- package/dist/src/shared/session-runtime.js.map +1 -1
- package/dist/src/shared/workspace-snapshot.d.ts +100 -5
- package/dist/src/shared/workspace-snapshot.d.ts.map +1 -1
- package/dist/src/shared/workspace-snapshot.js +5 -1
- package/dist/src/shared/workspace-snapshot.js.map +1 -1
- package/dist/src/shared/workspace-status-reason.d.ts +8 -3
- package/dist/src/shared/workspace-status-reason.d.ts.map +1 -1
- package/dist/src/shared/workspace-status-reason.js +50 -20
- package/dist/src/shared/workspace-status-reason.js.map +1 -1
- package/dist/src/test-utils/application-graph.d.ts +0 -1
- package/dist/src/test-utils/application-graph.d.ts.map +1 -1
- package/dist/src/test-utils/application-graph.js +0 -2
- package/dist/src/test-utils/application-graph.js.map +1 -1
- package/dist/tsconfig.backend.tsbuildinfo +1 -1
- package/package.json +3 -2
- package/prisma/migrations/20260728000000_add_workspace_periodic_task_id_index/migration.sql +2 -0
- package/prisma/migrations/20260728232525_add_ratchet_dispatch_stalled/migration.sql +20 -0
- package/prisma/schema.prisma +8 -0
- package/dist/client/assets/channel-DFzHt_cl.js +0 -1
- package/dist/client/assets/classDiagram-OUVF2IWQ-IkvZ4qsF.js +0 -1
- package/dist/client/assets/classDiagram-v2-EOCWNBFH-IkvZ4qsF.js +0 -1
- package/dist/client/assets/index-CxLzpVmH.css +0 -1
- package/dist/client/assets/stateDiagram-v2-6OUMAXLB-CueME36n.js +0 -1
- package/dist/client/assets/swimlanesDiagram-G3AALYLV-DITFxuwY.js +0 -8
- package/dist/src/backend/services/workspace/service/state/kanban-state.d.ts +0 -16
- package/dist/src/backend/services/workspace/service/state/kanban-state.d.ts.map +0 -1
- package/dist/src/backend/services/workspace/service/state/kanban-state.js +0 -29
- package/dist/src/backend/services/workspace/service/state/kanban-state.js.map +0 -1
- package/dist/src/backend/services/workspace/service/state/kanban-state.test.d.ts +0 -2
- package/dist/src/backend/services/workspace/service/state/kanban-state.test.d.ts.map +0 -1
- package/dist/src/backend/services/workspace/service/state/kanban-state.test.js +0 -60
- package/dist/src/backend/services/workspace/service/state/kanban-state.test.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
-
import { SERVICE_TIMEOUT_MS } from '../../../../backend/services/constants.js';
|
|
2
|
+
import { SERVICE_THRESHOLDS, SERVICE_TIMEOUT_MS } from '../../../../backend/services/constants.js';
|
|
3
3
|
import { CIStatus, RatchetState, SessionStatus } from '../../../../shared/core/index.js';
|
|
4
4
|
import { unsafeCoerce } from '../../../../test-utils/unsafe-coerce.js';
|
|
5
5
|
vi.mock('@/backend/services/workspace', () => ({
|
|
@@ -64,6 +64,7 @@ const mockSessionBridge = {
|
|
|
64
64
|
const mockWorkspaceBridge = {
|
|
65
65
|
findFixerContext: vi.fn(),
|
|
66
66
|
recordSessionEnd: vi.fn(),
|
|
67
|
+
markDispatchStalled: vi.fn().mockResolvedValue(true),
|
|
67
68
|
};
|
|
68
69
|
const fakeCoordinator = { cooldownActive: false, inFlightSkips: 0 };
|
|
69
70
|
const mockGitHubBridge = {
|
|
@@ -176,6 +177,7 @@ describe('ratchet service (state-change + idle dispatch)', () => {
|
|
|
176
177
|
prReviewLastCheckedAt: null,
|
|
177
178
|
ratchetDispatchOutcome: null,
|
|
178
179
|
ratchetDispatchRetryCount: 0,
|
|
180
|
+
ratchetDispatchStalled: false,
|
|
179
181
|
},
|
|
180
182
|
]);
|
|
181
183
|
vi.spyOn(unsafeCoerce(ratchetService), 'processWorkspace').mockResolvedValue({
|
|
@@ -478,6 +480,175 @@ describe('ratchet service (state-change + idle dispatch)', () => {
|
|
|
478
480
|
expect(mockSessionBridge.findSessionsByWorkspaceId).not.toHaveBeenCalled();
|
|
479
481
|
expect(mockSnapshotBridge.recordReviewCheck).not.toHaveBeenCalled();
|
|
480
482
|
});
|
|
483
|
+
it('marks the dispatch stalled when a settled dispatch achieved nothing', async () => {
|
|
484
|
+
const workspace = {
|
|
485
|
+
id: 'ws-1',
|
|
486
|
+
prUrl: 'https://github.com/example/repo/pull/5',
|
|
487
|
+
prNumber: 5,
|
|
488
|
+
prState: 'OPEN',
|
|
489
|
+
prReviewState: null,
|
|
490
|
+
prHasMergeConflict: false,
|
|
491
|
+
prCiStatus: CIStatus.UNKNOWN,
|
|
492
|
+
ratchetEnabled: true,
|
|
493
|
+
ratchetState: RatchetState.READY,
|
|
494
|
+
ratchetActiveSessionId: null,
|
|
495
|
+
ratchetDispatchSnapshotKey: '2026-01-02T00:00:00Z',
|
|
496
|
+
prReviewLastCheckedAt: new Date('2026-01-02T00:00:00Z'),
|
|
497
|
+
ratchetDispatchOutcome: 'COMPLETED',
|
|
498
|
+
ratchetDispatchRetryCount: 0,
|
|
499
|
+
};
|
|
500
|
+
vi.mocked(workspaceRatchetService.findCandidateById).mockResolvedValue(workspace);
|
|
501
|
+
vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
|
|
502
|
+
ciStatus: CIStatus.FAILURE,
|
|
503
|
+
snapshotKey: '2026-01-02T00:00:00Z',
|
|
504
|
+
hasChangesRequested: false,
|
|
505
|
+
latestReviewActivityAtMs: null,
|
|
506
|
+
statusCheckRollup: null,
|
|
507
|
+
prState: 'OPEN',
|
|
508
|
+
prNumber: 5,
|
|
509
|
+
});
|
|
510
|
+
vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([]);
|
|
511
|
+
await ratchetService.checkWorkspaceById('ws-1');
|
|
512
|
+
expect(mockWorkspaceBridge.markDispatchStalled).toHaveBeenCalledWith('ws-1', '2026-01-02T00:00:00Z');
|
|
513
|
+
});
|
|
514
|
+
it('marks the dispatch stalled when a DIED fixer exhausts its retries', async () => {
|
|
515
|
+
const workspace = {
|
|
516
|
+
id: 'ws-1',
|
|
517
|
+
prUrl: 'https://github.com/example/repo/pull/15',
|
|
518
|
+
prNumber: 15,
|
|
519
|
+
prState: 'OPEN',
|
|
520
|
+
prReviewState: null,
|
|
521
|
+
prHasMergeConflict: false,
|
|
522
|
+
prCiStatus: CIStatus.FAILURE,
|
|
523
|
+
ratchetEnabled: true,
|
|
524
|
+
ratchetState: RatchetState.CI_FAILED,
|
|
525
|
+
ratchetActiveSessionId: null,
|
|
526
|
+
ratchetDispatchSnapshotKey: 'same-snapshot',
|
|
527
|
+
prReviewLastCheckedAt: new Date('2026-01-01T00:00:00Z'),
|
|
528
|
+
ratchetDispatchOutcome: 'DIED',
|
|
529
|
+
ratchetDispatchRetryCount: SERVICE_THRESHOLDS.ratchetDispatchMaxRetries,
|
|
530
|
+
};
|
|
531
|
+
vi.mocked(workspaceRatchetService.findCandidateById).mockResolvedValue(workspace);
|
|
532
|
+
vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
|
|
533
|
+
ciStatus: CIStatus.FAILURE,
|
|
534
|
+
snapshotKey: 'same-snapshot',
|
|
535
|
+
hasChangesRequested: false,
|
|
536
|
+
latestReviewActivityAtMs: null,
|
|
537
|
+
statusCheckRollup: null,
|
|
538
|
+
prState: 'OPEN',
|
|
539
|
+
prNumber: 15,
|
|
540
|
+
});
|
|
541
|
+
await ratchetService.checkWorkspaceById('ws-1');
|
|
542
|
+
expect(mockWorkspaceBridge.markDispatchStalled).toHaveBeenCalledWith('ws-1', 'same-snapshot');
|
|
543
|
+
});
|
|
544
|
+
it('publishes a dispatch-changed event when the stall flag actually flips', async () => {
|
|
545
|
+
const workspace = {
|
|
546
|
+
id: 'ws-1',
|
|
547
|
+
prUrl: 'https://github.com/example/repo/pull/5',
|
|
548
|
+
prNumber: 5,
|
|
549
|
+
prState: 'OPEN',
|
|
550
|
+
prReviewState: null,
|
|
551
|
+
prHasMergeConflict: false,
|
|
552
|
+
prCiStatus: CIStatus.FAILURE,
|
|
553
|
+
ratchetEnabled: true,
|
|
554
|
+
ratchetState: RatchetState.CI_FAILED,
|
|
555
|
+
ratchetActiveSessionId: null,
|
|
556
|
+
ratchetDispatchSnapshotKey: 'stalled-key',
|
|
557
|
+
prReviewLastCheckedAt: new Date('2026-01-02T00:00:00Z'),
|
|
558
|
+
ratchetDispatchOutcome: 'COMPLETED',
|
|
559
|
+
ratchetDispatchRetryCount: 0,
|
|
560
|
+
};
|
|
561
|
+
vi.mocked(workspaceRatchetService.findCandidateById).mockResolvedValue(workspace);
|
|
562
|
+
vi.mocked(mockWorkspaceBridge.markDispatchStalled).mockResolvedValue(true);
|
|
563
|
+
vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
|
|
564
|
+
ciStatus: CIStatus.FAILURE,
|
|
565
|
+
snapshotKey: 'stalled-key',
|
|
566
|
+
hasChangesRequested: false,
|
|
567
|
+
latestReviewActivityAtMs: null,
|
|
568
|
+
statusCheckRollup: null,
|
|
569
|
+
prState: 'OPEN',
|
|
570
|
+
prNumber: 5,
|
|
571
|
+
});
|
|
572
|
+
vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([]);
|
|
573
|
+
const events = [];
|
|
574
|
+
ratchetService.on(RATCHET_DISPATCH_CHANGED, (event) => {
|
|
575
|
+
events.push(event);
|
|
576
|
+
});
|
|
577
|
+
await ratchetService.checkWorkspaceById('ws-1');
|
|
578
|
+
expect(events).toEqual([{ workspaceId: 'ws-1' }]);
|
|
579
|
+
});
|
|
580
|
+
it('publishes nothing when the stall flag was already set', async () => {
|
|
581
|
+
const workspace = {
|
|
582
|
+
id: 'ws-1',
|
|
583
|
+
prUrl: 'https://github.com/example/repo/pull/5',
|
|
584
|
+
prNumber: 5,
|
|
585
|
+
prState: 'OPEN',
|
|
586
|
+
prReviewState: null,
|
|
587
|
+
prHasMergeConflict: false,
|
|
588
|
+
prCiStatus: CIStatus.FAILURE,
|
|
589
|
+
ratchetEnabled: true,
|
|
590
|
+
ratchetState: RatchetState.CI_FAILED,
|
|
591
|
+
ratchetActiveSessionId: null,
|
|
592
|
+
ratchetDispatchSnapshotKey: 'stalled-key',
|
|
593
|
+
prReviewLastCheckedAt: new Date('2026-01-02T00:00:00Z'),
|
|
594
|
+
ratchetDispatchOutcome: 'COMPLETED',
|
|
595
|
+
ratchetDispatchRetryCount: 0,
|
|
596
|
+
};
|
|
597
|
+
vi.mocked(workspaceRatchetService.findCandidateById).mockResolvedValue(workspace);
|
|
598
|
+
vi.mocked(mockWorkspaceBridge.markDispatchStalled).mockResolvedValue(false);
|
|
599
|
+
vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
|
|
600
|
+
ciStatus: CIStatus.FAILURE,
|
|
601
|
+
snapshotKey: 'stalled-key',
|
|
602
|
+
hasChangesRequested: false,
|
|
603
|
+
latestReviewActivityAtMs: null,
|
|
604
|
+
statusCheckRollup: null,
|
|
605
|
+
prState: 'OPEN',
|
|
606
|
+
prNumber: 5,
|
|
607
|
+
});
|
|
608
|
+
vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([]);
|
|
609
|
+
const events = [];
|
|
610
|
+
ratchetService.on(RATCHET_DISPATCH_CHANGED, (event) => {
|
|
611
|
+
events.push(event);
|
|
612
|
+
});
|
|
613
|
+
await ratchetService.checkWorkspaceById('ws-1');
|
|
614
|
+
expect(events).toEqual([]);
|
|
615
|
+
});
|
|
616
|
+
it('does not mark the dispatch stalled when the PR state has changed', async () => {
|
|
617
|
+
const workspace = {
|
|
618
|
+
id: 'ws-1',
|
|
619
|
+
prUrl: 'https://github.com/example/repo/pull/5',
|
|
620
|
+
prNumber: 5,
|
|
621
|
+
prState: 'OPEN',
|
|
622
|
+
prReviewState: null,
|
|
623
|
+
prHasMergeConflict: false,
|
|
624
|
+
prCiStatus: CIStatus.UNKNOWN,
|
|
625
|
+
ratchetEnabled: true,
|
|
626
|
+
ratchetState: RatchetState.READY,
|
|
627
|
+
ratchetActiveSessionId: null,
|
|
628
|
+
ratchetDispatchSnapshotKey: 'old-snapshot',
|
|
629
|
+
prReviewLastCheckedAt: new Date('2026-01-02T00:00:00Z'),
|
|
630
|
+
ratchetDispatchOutcome: null,
|
|
631
|
+
ratchetDispatchRetryCount: 0,
|
|
632
|
+
};
|
|
633
|
+
vi.mocked(workspaceRatchetService.findCandidateById).mockResolvedValue(workspace);
|
|
634
|
+
vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
|
|
635
|
+
ciStatus: CIStatus.FAILURE,
|
|
636
|
+
snapshotKey: '2026-01-02T00:00:00Z',
|
|
637
|
+
hasChangesRequested: false,
|
|
638
|
+
latestReviewActivityAtMs: null,
|
|
639
|
+
statusCheckRollup: null,
|
|
640
|
+
prState: 'OPEN',
|
|
641
|
+
prNumber: 5,
|
|
642
|
+
});
|
|
643
|
+
vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([]);
|
|
644
|
+
vi.mocked(fixerSessionService.acquireAndDispatch).mockResolvedValue({
|
|
645
|
+
status: 'started',
|
|
646
|
+
sessionId: 'fresh-session',
|
|
647
|
+
promptSent: true,
|
|
648
|
+
});
|
|
649
|
+
await ratchetService.checkWorkspaceById('ws-1');
|
|
650
|
+
expect(mockWorkspaceBridge.markDispatchStalled).not.toHaveBeenCalled();
|
|
651
|
+
});
|
|
481
652
|
it('does not dispatch repeatedly for unchanged CHANGES_REQUESTED state', async () => {
|
|
482
653
|
const workspace = {
|
|
483
654
|
id: 'ws-review-unchanged',
|
|
@@ -899,13 +1070,14 @@ describe('ratchet service (state-change + idle dispatch)', () => {
|
|
|
899
1070
|
await unsafeCoerce(ratchetService).processWorkspace(workspace);
|
|
900
1071
|
expect(mockSnapshotBridge.recordPrObservation).toHaveBeenCalledWith(expect.objectContaining({
|
|
901
1072
|
workspaceId: 'ws-observation',
|
|
1073
|
+
prUrl: 'https://github.com/example/repo/pull/44',
|
|
902
1074
|
prState: 'CHANGES_REQUESTED',
|
|
903
1075
|
reviewState: 'CHANGES_REQUESTED',
|
|
904
1076
|
ciStatus: CIStatus.SUCCESS,
|
|
905
1077
|
hasMergeConflict: false,
|
|
906
1078
|
}));
|
|
907
1079
|
});
|
|
908
|
-
it('
|
|
1080
|
+
it('stops live ratchet sessions before persisting a merged PR', async () => {
|
|
909
1081
|
const workspace = {
|
|
910
1082
|
id: 'ws-merged',
|
|
911
1083
|
prUrl: 'https://github.com/example/repo/pull/45',
|
|
@@ -935,9 +1107,91 @@ describe('ratchet service (state-change + idle dispatch)', () => {
|
|
|
935
1107
|
prNumber: 45,
|
|
936
1108
|
reviewComments: [],
|
|
937
1109
|
});
|
|
938
|
-
vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([
|
|
939
|
-
|
|
940
|
-
|
|
1110
|
+
vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([
|
|
1111
|
+
{
|
|
1112
|
+
id: 'ratchet-running',
|
|
1113
|
+
workflow: 'ratchet',
|
|
1114
|
+
status: SessionStatus.RUNNING,
|
|
1115
|
+
},
|
|
1116
|
+
{
|
|
1117
|
+
id: 'ratchet-idle',
|
|
1118
|
+
workflow: 'ratchet',
|
|
1119
|
+
status: SessionStatus.IDLE,
|
|
1120
|
+
},
|
|
1121
|
+
{
|
|
1122
|
+
id: 'ratchet-completed',
|
|
1123
|
+
workflow: 'ratchet',
|
|
1124
|
+
status: SessionStatus.COMPLETED,
|
|
1125
|
+
},
|
|
1126
|
+
{
|
|
1127
|
+
id: 'manual-running',
|
|
1128
|
+
workflow: 'default',
|
|
1129
|
+
status: SessionStatus.RUNNING,
|
|
1130
|
+
},
|
|
1131
|
+
]);
|
|
1132
|
+
vi.mocked(mockSessionBridge.isSessionRunning).mockImplementation((sessionId) => ['ratchet-running', 'ratchet-idle', 'manual-running'].includes(sessionId));
|
|
1133
|
+
const result = await unsafeCoerce(ratchetService).processWorkspace(workspace);
|
|
1134
|
+
expect(mockSessionBridge.stopSession).toHaveBeenCalledTimes(2);
|
|
1135
|
+
expect(mockSessionBridge.stopSession).toHaveBeenNthCalledWith(1, 'ratchet-running');
|
|
1136
|
+
expect(mockSessionBridge.stopSession).toHaveBeenNthCalledWith(2, 'ratchet-idle');
|
|
1137
|
+
expect(mockSnapshotBridge.recordPrObservation).toHaveBeenCalledWith(expect.objectContaining({
|
|
1138
|
+
workspaceId: 'ws-merged',
|
|
1139
|
+
prUrl: 'https://github.com/example/repo/pull/45',
|
|
1140
|
+
prState: 'MERGED',
|
|
1141
|
+
}));
|
|
1142
|
+
expect(vi.mocked(mockSessionBridge.stopSession).mock.invocationCallOrder.at(-1)).toBeLessThan(vi.mocked(mockSnapshotBridge.recordPrObservation).mock.invocationCallOrder[0] ?? 0);
|
|
1143
|
+
expect(result).toMatchObject({
|
|
1144
|
+
newState: RatchetState.MERGED,
|
|
1145
|
+
action: { type: 'COMPLETED' },
|
|
1146
|
+
});
|
|
1147
|
+
});
|
|
1148
|
+
it('does not persist a merged PR when stopping a ratchet session fails', async () => {
|
|
1149
|
+
const workspace = {
|
|
1150
|
+
id: 'ws-merged-stop-failure',
|
|
1151
|
+
prUrl: 'https://github.com/example/repo/pull/46',
|
|
1152
|
+
prNumber: 46,
|
|
1153
|
+
prState: 'OPEN',
|
|
1154
|
+
prReviewState: null,
|
|
1155
|
+
prHasMergeConflict: false,
|
|
1156
|
+
prCiStatus: CIStatus.SUCCESS,
|
|
1157
|
+
ratchetEnabled: true,
|
|
1158
|
+
ratchetState: RatchetState.READY,
|
|
1159
|
+
ratchetActiveSessionId: 'ratchet-running',
|
|
1160
|
+
ratchetDispatchSnapshotKey: 'merged-stop-failure-snapshot',
|
|
1161
|
+
prReviewLastCheckedAt: null,
|
|
1162
|
+
ratchetDispatchOutcome: 'RUNNING',
|
|
1163
|
+
ratchetDispatchRetryCount: 0,
|
|
1164
|
+
};
|
|
1165
|
+
vi.spyOn(unsafeCoerce(ratchetService), 'fetchPRState').mockResolvedValue({
|
|
1166
|
+
ciStatus: CIStatus.SUCCESS,
|
|
1167
|
+
snapshotKey: 'merged-stop-failure-snapshot',
|
|
1168
|
+
hasChangesRequested: false,
|
|
1169
|
+
hasMergeConflict: false,
|
|
1170
|
+
latestReviewActivityAtMs: null,
|
|
1171
|
+
statusCheckRollup: null,
|
|
1172
|
+
prState: 'MERGED',
|
|
1173
|
+
cachedPrState: 'MERGED',
|
|
1174
|
+
reviewDecision: null,
|
|
1175
|
+
prNumber: 46,
|
|
1176
|
+
reviewComments: [],
|
|
1177
|
+
});
|
|
1178
|
+
vi.mocked(mockSessionBridge.findSessionsByWorkspaceId).mockResolvedValue([
|
|
1179
|
+
{
|
|
1180
|
+
id: 'ratchet-running',
|
|
1181
|
+
workflow: 'ratchet',
|
|
1182
|
+
status: SessionStatus.RUNNING,
|
|
1183
|
+
},
|
|
1184
|
+
]);
|
|
1185
|
+
vi.mocked(mockSessionBridge.isSessionRunning).mockReturnValue(true);
|
|
1186
|
+
vi.mocked(mockSessionBridge.stopSession).mockRejectedValue(new Error('stop failed'));
|
|
1187
|
+
const result = await unsafeCoerce(ratchetService).processWorkspace(workspace);
|
|
1188
|
+
expect(result).toMatchObject({
|
|
1189
|
+
previousState: RatchetState.READY,
|
|
1190
|
+
newState: RatchetState.READY,
|
|
1191
|
+
action: { type: 'ERROR', error: 'stop failed' },
|
|
1192
|
+
});
|
|
1193
|
+
expect(workspaceRatchetService.recordCheckIfEnabled).not.toHaveBeenCalled();
|
|
1194
|
+
expect(mockSnapshotBridge.recordPrObservation).not.toHaveBeenCalled();
|
|
941
1195
|
});
|
|
942
1196
|
it('persists a newly observed merge conflict even when CI status is unchanged', async () => {
|
|
943
1197
|
const workspace = {
|
|
@@ -973,6 +1227,7 @@ describe('ratchet service (state-change + idle dispatch)', () => {
|
|
|
973
1227
|
await unsafeCoerce(ratchetService).processWorkspace(workspace);
|
|
974
1228
|
expect(mockSnapshotBridge.recordPrObservation).toHaveBeenCalledWith(expect.objectContaining({
|
|
975
1229
|
workspaceId: 'ws-conflict',
|
|
1230
|
+
prUrl: 'https://github.com/example/repo/pull/43',
|
|
976
1231
|
ciStatus: CIStatus.SUCCESS,
|
|
977
1232
|
hasMergeConflict: true,
|
|
978
1233
|
}));
|
|
@@ -2565,6 +2820,30 @@ describe('ratchet service (state-change + idle dispatch)', () => {
|
|
|
2565
2820
|
finishStop();
|
|
2566
2821
|
await pendingStop;
|
|
2567
2822
|
});
|
|
2823
|
+
it('stops completed session even when abort fires after settlement', async () => {
|
|
2824
|
+
const controller = new AbortController();
|
|
2825
|
+
const timeoutError = new Error('Workspace check timed out');
|
|
2826
|
+
vi.mocked(mockSessionBridge.findSessionById).mockResolvedValue({
|
|
2827
|
+
id: 'completed-session',
|
|
2828
|
+
provider: 'CLAUDE',
|
|
2829
|
+
status: SessionStatus.RUNNING,
|
|
2830
|
+
});
|
|
2831
|
+
vi.mocked(mockSessionBridge.isSessionRunning).mockReturnValue(true);
|
|
2832
|
+
vi.mocked(mockSessionBridge.isSessionWorking).mockReturnValue(false);
|
|
2833
|
+
vi.mocked(mockSessionBridge.stopSession).mockResolvedValue();
|
|
2834
|
+
vi.mocked(mockWorkspaceBridge.recordSessionEnd).mockImplementation(() => {
|
|
2835
|
+
controller.abort(timeoutError);
|
|
2836
|
+
return Promise.resolve(true);
|
|
2837
|
+
});
|
|
2838
|
+
const check = unsafeCoerce(ratchetService).checkActiveFixerSession({
|
|
2839
|
+
id: 'ws-completed-aborted-after-settlement',
|
|
2840
|
+
ratchetActiveSessionId: 'completed-session',
|
|
2841
|
+
defaultSessionProvider: 'CLAUDE',
|
|
2842
|
+
ratchetSessionProvider: 'CLAUDE',
|
|
2843
|
+
}, controller.signal);
|
|
2844
|
+
await expect(check).rejects.toBe(timeoutError);
|
|
2845
|
+
expect(mockSessionBridge.stopSession).toHaveBeenCalledWith('completed-session');
|
|
2846
|
+
});
|
|
2568
2847
|
it('returns the active fixer when the session is working', async () => {
|
|
2569
2848
|
vi.mocked(mockSessionBridge.findSessionById).mockResolvedValue({
|
|
2570
2849
|
id: 'working-session',
|