factory-factory 0.4.3 → 0.4.5
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-Bu9-2m-t.js → abnfDiagram-VRR7QNED-DygwVN25.js} +1 -1
- package/dist/client/assets/{arc-Dh_ay4bc.js → arc-CcnMw5av.js} +1 -1
- package/dist/client/assets/{architectureDiagram-ZJ3FMSHR-V4AJKU23.js → architectureDiagram-ZJ3FMSHR-BZgeaNrI.js} +1 -1
- package/dist/client/assets/{blockDiagram-677ZJIJ3-unJzynY2.js → blockDiagram-677ZJIJ3-DQ77xvqH.js} +1 -1
- package/dist/client/assets/{c4Diagram-LMCZKHZV-De_-3fVv.js → c4Diagram-LMCZKHZV-B-9QZJ1e.js} +1 -1
- package/dist/client/assets/channel-zAL33ya-.js +1 -0
- package/dist/client/assets/{chunk-2Q5K7J3B-CdZ0ANE_.js → chunk-2Q5K7J3B-DhfBY-Wd.js} +1 -1
- package/dist/client/assets/{chunk-32BRIVSS-BzFpxDmT.js → chunk-32BRIVSS-CV9UmSkI.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-8_Qj_VeY.js → chunk-5VM5RSS4-BUNj3iDY.js} +1 -1
- package/dist/client/assets/{chunk-EX3LRPZG-Chc6HGsz.js → chunk-EX3LRPZG-Dj63JdET.js} +1 -1
- package/dist/client/assets/{chunk-JWPE2WC7-CFeGNH2a.js → chunk-JWPE2WC7-i6Ud3VAu.js} +1 -1
- package/dist/client/assets/{chunk-MOJQB5TN-DY39i_O8.js → chunk-MOJQB5TN-PY5GLOxr.js} +1 -1
- package/dist/client/assets/{chunk-RYQCIY6F-C3bbEdeB.js → chunk-RYQCIY6F-pIEuQy1L.js} +1 -1
- package/dist/client/assets/{chunk-V7JOEXUC-BpNgC7Ah.js → chunk-V7JOEXUC--zp7Z0xS.js} +1 -1
- package/dist/client/assets/{chunk-VR4S4FIN-BKsk7moo.js → chunk-VR4S4FIN-JstmsazP.js} +1 -1
- package/dist/client/assets/{chunk-XXDRQBXY-D7Pgr1uy.js → chunk-XXDRQBXY-C66lsFmy.js} +1 -1
- package/dist/client/assets/classDiagram-OUVF2IWQ-Dksz7rAA.js +1 -0
- package/dist/client/assets/classDiagram-v2-EOCWNBFH-Dksz7rAA.js +1 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-DvmyUiBK.js → cose-bilkent-JH36ORCC-D3jSuAHn.js} +1 -1
- package/dist/client/assets/{cynefin-VYW2F7L2-DyPz67uy.js → cynefin-VYW2F7L2-Dx3xfGS7.js} +1 -1
- package/dist/client/assets/{cynefinDiagram-TSTJHNR4-CxZzWly_.js → cynefinDiagram-TSTJHNR4-BcGYZcSJ.js} +1 -1
- package/dist/client/assets/{dagre-VKFMJZFB-BkNT_0vs.js → dagre-VKFMJZFB-CLZSDf9x.js} +1 -1
- package/dist/client/assets/{diagram-FQU43EPY-C9c41Tpz.js → diagram-FQU43EPY-Nosv2FJf.js} +1 -1
- package/dist/client/assets/{diagram-G47NLZAW-CogAwMLq.js → diagram-G47NLZAW-CPjqONaO.js} +1 -1
- package/dist/client/assets/{diagram-NH7WQ7WH-jtYr2rjE.js → diagram-NH7WQ7WH-BmRiUIAJ.js} +1 -1
- package/dist/client/assets/{diagram-OA4YK3LP-CfCfCJfY.js → diagram-OA4YK3LP-C7WEtC2B.js} +1 -1
- package/dist/client/assets/{diagram-WEI45ONY-C3m0dfDy.js → diagram-WEI45ONY-up5rQ6My.js} +1 -1
- package/dist/client/assets/{ebnfDiagram-CCIWWBDH-Dr4BkxJz.js → ebnfDiagram-CCIWWBDH-D2Ye87k4.js} +1 -1
- package/dist/client/assets/{erDiagram-Q63AITRT-BbDab_v6.js → erDiagram-Q63AITRT-CgZF8eG-.js} +1 -1
- package/dist/client/assets/{flowDiagram-23GEKE2U-DOeJX8aU.js → flowDiagram-23GEKE2U-bxoO3Eep.js} +1 -1
- package/dist/client/assets/{ganttDiagram-NO4QXBWP-BpgtL3Q5.js → ganttDiagram-NO4QXBWP-BAtqPw6P.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-IHSO6WYX-DTDPlnSN.js → gitGraphDiagram-IHSO6WYX-DYQqeJ8w.js} +1 -1
- package/dist/client/assets/{index-DuSjh2zd.js → index-BZQlu-dZ.js} +158 -153
- package/dist/client/assets/index-CwfNzqG5.css +1 -0
- package/dist/client/assets/{infoDiagram-FWYZ7A6U-CHKlHAG9.js → infoDiagram-FWYZ7A6U-CZQCerFQ.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-FXEZZL3T-B7EQbtqY.js → ishikawaDiagram-FXEZZL3T-Bc7wE25N.js} +1 -1
- package/dist/client/assets/{journeyDiagram-5HDEW3XC-DTUiiqrL.js → journeyDiagram-5HDEW3XC-D5qqjKJz.js} +1 -1
- package/dist/client/assets/{kanban-definition-HUTT4EX6-eObIHBDx.js → kanban-definition-HUTT4EX6-42kkaHBo.js} +1 -1
- package/dist/client/assets/{linear-DQu4w17X.js → linear-Dg3NQEM3.js} +1 -1
- package/dist/client/assets/{mindmap-definition-LN4V7U3C-XqlKfmJa.js → mindmap-definition-LN4V7U3C-CRANKUcD.js} +1 -1
- package/dist/client/assets/{mobile-baseline-v5lnTluf.js → mobile-baseline-D6bQ8WTB.js} +1 -1
- package/dist/client/assets/{pegDiagram-2B236MQR-By2J0vHR.js → pegDiagram-2B236MQR-qJQPOd8H.js} +1 -1
- package/dist/client/assets/{pieDiagram-ENE6RG2P-DWliRlHi.js → pieDiagram-ENE6RG2P-B5wB7Ccf.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-ABIIQ3AL-DxxsQgGe.js → quadrantDiagram-ABIIQ3AL-CCZfXF8m.js} +1 -1
- package/dist/client/assets/{railroadDiagram-RFXS5EU6-CRjYLslW.js → railroadDiagram-RFXS5EU6-BuIrSJUW.js} +1 -1
- package/dist/client/assets/{requirementDiagram-TGXJPOKE-CuZgujay.js → requirementDiagram-TGXJPOKE-DfIr0zZ3.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-HTMAVEWB-DhxT75Go.js → sankeyDiagram-HTMAVEWB-CJoUXRWq.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-DBY2YBRQ-Tz8RVPsp.js → sequenceDiagram-DBY2YBRQ-Cq1lOU1b.js} +1 -1
- package/dist/client/assets/{sizeCapture-X5ZJPWSS-BME47q1I.js → sizeCapture-X5ZJPWSS-XHOsOkor.js} +1 -1
- package/dist/client/assets/{stateDiagram-2N3HPSRC-DQoKLjSj.js → stateDiagram-2N3HPSRC-BLVzzete.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-6OUMAXLB-DA02HYvU.js +1 -0
- package/dist/client/assets/{swimlanes-5IMT3BWC-DZ78RZi9.js → swimlanes-5IMT3BWC-C20mYIPR.js} +2 -2
- package/dist/client/assets/swimlanesDiagram-G3AALYLV-CbfcpXpQ.js +8 -0
- package/dist/client/assets/{terminal-instance-CbXOfRoa.js → terminal-instance-Dw2gcPib.js} +1 -1
- package/dist/client/assets/{timeline-definition-FHXFAJF6-DS_K1N-M.js → timeline-definition-FHXFAJF6-DlceJAxJ.js} +1 -1
- package/dist/client/assets/{vennDiagram-L72KCM5P-D9evf7U9.js → vennDiagram-L72KCM5P-CFl-Eo1Y.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-EHGQE667-8-WkkQfu.js → wardleyDiagram-EHGQE667-eBpeLOoN.js} +1 -1
- package/dist/client/assets/{xychartDiagram-FW5EYKEG-gEXjpSMB.js → xychartDiagram-FW5EYKEG-B8RBkKiX.js} +1 -1
- package/dist/client/index.html +2 -2
- package/dist/prisma/generated/browser.d.ts +1 -0
- package/dist/prisma/generated/browser.d.ts.map +1 -1
- package/dist/prisma/generated/client.d.ts +1 -0
- package/dist/prisma/generated/client.d.ts.map +1 -1
- package/dist/prisma/generated/commonInputTypes.d.ts +60 -0
- package/dist/prisma/generated/commonInputTypes.d.ts.map +1 -1
- package/dist/prisma/generated/enums.d.ts +15 -0
- package/dist/prisma/generated/enums.d.ts.map +1 -1
- package/dist/prisma/generated/enums.js +13 -0
- package/dist/prisma/generated/enums.js.map +1 -1
- package/dist/prisma/generated/internal/class.d.ts +3 -0
- package/dist/prisma/generated/internal/class.d.ts.map +1 -1
- 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 +90 -1
- package/dist/prisma/generated/internal/prismaNamespace.d.ts.map +1 -1
- package/dist/prisma/generated/internal/prismaNamespace.js +11 -0
- package/dist/prisma/generated/internal/prismaNamespace.js.map +1 -1
- package/dist/prisma/generated/internal/prismaNamespaceBrowser.d.ts +12 -0
- package/dist/prisma/generated/internal/prismaNamespaceBrowser.d.ts.map +1 -1
- package/dist/prisma/generated/internal/prismaNamespaceBrowser.js +11 -0
- package/dist/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
- package/dist/prisma/generated/models/SessionLifecycleEvent.d.ts +657 -0
- package/dist/prisma/generated/models/SessionLifecycleEvent.d.ts.map +1 -0
- package/dist/prisma/generated/models/SessionLifecycleEvent.js +2 -0
- package/dist/prisma/generated/models/SessionLifecycleEvent.js.map +1 -0
- package/dist/prisma/generated/models/Workspace.d.ts +264 -0
- package/dist/prisma/generated/models/Workspace.d.ts.map +1 -1
- package/dist/prisma/generated/models.d.ts +1 -0
- package/dist/prisma/generated/models.d.ts.map +1 -1
- package/dist/src/backend/app-context.d.ts.map +1 -1
- package/dist/src/backend/app-context.js +2 -1
- package/dist/src/backend/app-context.js.map +1 -1
- package/dist/src/backend/interceptors/branch-naming.interceptor.d.ts.map +1 -1
- package/dist/src/backend/interceptors/branch-naming.interceptor.js +0 -4
- package/dist/src/backend/interceptors/branch-naming.interceptor.js.map +1 -1
- package/dist/src/backend/interceptors/branch-naming.interceptor.test.js +26 -0
- package/dist/src/backend/interceptors/branch-naming.interceptor.test.js.map +1 -1
- package/dist/src/backend/orchestration/domain-bridges.orchestrator.d.ts +2 -1
- package/dist/src/backend/orchestration/domain-bridges.orchestrator.d.ts.map +1 -1
- package/dist/src/backend/orchestration/domain-bridges.orchestrator.js +8 -7
- package/dist/src/backend/orchestration/domain-bridges.orchestrator.js.map +1 -1
- package/dist/src/backend/orchestration/domain-bridges.orchestrator.test.js +18 -8
- package/dist/src/backend/orchestration/domain-bridges.orchestrator.test.js.map +1 -1
- package/dist/src/backend/orchestration/event-collector.orchestrator.d.ts.map +1 -1
- package/dist/src/backend/orchestration/event-collector.orchestrator.js +3 -1
- package/dist/src/backend/orchestration/event-collector.orchestrator.js.map +1 -1
- package/dist/src/backend/orchestration/event-collector.orchestrator.test.js +3 -1
- package/dist/src/backend/orchestration/event-collector.orchestrator.test.js.map +1 -1
- package/dist/src/backend/orchestration/reconciliation.service.d.ts +11 -8
- package/dist/src/backend/orchestration/reconciliation.service.d.ts.map +1 -1
- package/dist/src/backend/orchestration/reconciliation.service.js +41 -33
- package/dist/src/backend/orchestration/reconciliation.service.js.map +1 -1
- package/dist/src/backend/orchestration/reconciliation.service.test.js +9 -42
- package/dist/src/backend/orchestration/reconciliation.service.test.js.map +1 -1
- package/dist/src/backend/orchestration/workspace-archive.orchestrator.d.ts +4 -1
- package/dist/src/backend/orchestration/workspace-archive.orchestrator.d.ts.map +1 -1
- package/dist/src/backend/orchestration/workspace-archive.orchestrator.js +4 -1
- package/dist/src/backend/orchestration/workspace-archive.orchestrator.js.map +1 -1
- package/dist/src/backend/orchestration/workspace-archive.orchestrator.test.js +15 -2
- package/dist/src/backend/orchestration/workspace-archive.orchestrator.test.js.map +1 -1
- package/dist/src/backend/orchestration/workspace-init-issue-prompts.d.ts.map +1 -1
- package/dist/src/backend/orchestration/workspace-init-issue-prompts.js +3 -1
- package/dist/src/backend/orchestration/workspace-init-issue-prompts.js.map +1 -1
- package/dist/src/backend/orchestration/workspace-init-issue-prompts.test.d.ts +2 -0
- package/dist/src/backend/orchestration/workspace-init-issue-prompts.test.d.ts.map +1 -0
- package/dist/src/backend/orchestration/workspace-init-issue-prompts.test.js +75 -0
- package/dist/src/backend/orchestration/workspace-init-issue-prompts.test.js.map +1 -0
- package/dist/src/backend/orchestration/workspace-init.orchestrator.d.ts +7 -4
- package/dist/src/backend/orchestration/workspace-init.orchestrator.d.ts.map +1 -1
- package/dist/src/backend/orchestration/workspace-init.orchestrator.js +36 -1
- package/dist/src/backend/orchestration/workspace-init.orchestrator.js.map +1 -1
- package/dist/src/backend/orchestration/workspace-init.orchestrator.test.js +117 -8
- package/dist/src/backend/orchestration/workspace-init.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/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 +35 -11
- 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 +89 -0
- package/dist/src/backend/services/periodic-task/resources/periodic-task.accessor.test.js.map +1 -1
- package/dist/src/backend/services/port.service.d.ts.map +1 -1
- package/dist/src/backend/services/port.service.js +4 -0
- package/dist/src/backend/services/port.service.js.map +1 -1
- package/dist/src/backend/services/port.service.test.js +8 -0
- package/dist/src/backend/services/port.service.test.js.map +1 -1
- package/dist/src/backend/services/ratchet/service/bridges.d.ts +1 -0
- package/dist/src/backend/services/ratchet/service/bridges.d.ts.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.map +1 -1
- package/dist/src/backend/services/ratchet/service/ratchet.service.js +1 -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 +31 -1
- package/dist/src/backend/services/ratchet/service/ratchet.service.test.js.map +1 -1
- package/dist/src/backend/services/registry.d.ts +2 -2
- package/dist/src/backend/services/registry.d.ts.map +1 -1
- package/dist/src/backend/services/registry.js +2 -1
- package/dist/src/backend/services/registry.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/resources/session-lifecycle-event.accessor.d.ts +23 -0
- package/dist/src/backend/services/session/resources/session-lifecycle-event.accessor.d.ts.map +1 -0
- package/dist/src/backend/services/session/resources/session-lifecycle-event.accessor.js +23 -0
- package/dist/src/backend/services/session/resources/session-lifecycle-event.accessor.js.map +1 -0
- package/dist/src/backend/services/session/resources/session-lifecycle-event.accessor.test.d.ts +2 -0
- package/dist/src/backend/services/session/resources/session-lifecycle-event.accessor.test.d.ts.map +1 -0
- package/dist/src/backend/services/session/resources/session-lifecycle-event.accessor.test.js +62 -0
- package/dist/src/backend/services/session/resources/session-lifecycle-event.accessor.test.js.map +1 -0
- package/dist/src/backend/services/session/service/acp/acp-runtime-manager.d.ts +2 -1
- package/dist/src/backend/services/session/service/acp/acp-runtime-manager.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/acp/acp-runtime-manager.js +14 -7
- package/dist/src/backend/services/session/service/acp/acp-runtime-manager.js.map +1 -1
- package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test.js +33 -0
- package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test.js.map +1 -1
- package/dist/src/backend/services/session/service/chat/chat-message-handlers/attachment-processing.test.js +21 -0
- 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/handlers/load-session.handler.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/load-session.handler.js +3 -279
- package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/load-session.handler.js.map +1 -1
- package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/load-session.handler.test.js +154 -7
- package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/load-session.handler.test.js.map +1 -1
- package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/stop.handler.js +1 -1
- package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/stop.handler.js.map +1 -1
- package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/stop.handler.test.js +1 -1
- package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/stop.handler.test.js.map +1 -1
- package/dist/src/backend/services/session/service/chat/chat-message-handlers/image-format-validation.js +1 -1
- package/dist/src/backend/services/session/service/chat/chat-message-handlers/image-format-validation.js.map +1 -1
- package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.js +4 -1
- 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 +49 -0
- package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.test.js.map +1 -1
- package/dist/src/backend/services/session/service/index.d.ts +1 -1
- package/dist/src/backend/services/session/service/index.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/index.js +1 -1
- package/dist/src/backend/services/session/service/index.js.map +1 -1
- package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.d.ts +5 -1
- package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.js +23 -4
- package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.js.map +1 -1
- package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.text-streaming.test.js +28 -0
- package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.text-streaming.test.js.map +1 -1
- package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-event.service.d.ts +26 -0
- package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-event.service.d.ts.map +1 -0
- package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-event.service.js +84 -0
- package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-event.service.js.map +1 -0
- package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-event.service.test.d.ts +2 -0
- package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-event.service.test.d.ts.map +1 -0
- package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-event.service.test.js +283 -0
- package/dist/src/backend/services/session/service/lifecycle/session-lifecycle-event.service.test.js.map +1 -0
- package/dist/src/backend/services/session/service/lifecycle/session-provider-history-hydrator.d.ts +10 -0
- package/dist/src/backend/services/session/service/lifecycle/session-provider-history-hydrator.d.ts.map +1 -0
- package/dist/src/backend/services/session/service/lifecycle/session-provider-history-hydrator.js +299 -0
- package/dist/src/backend/services/session/service/lifecycle/session-provider-history-hydrator.js.map +1 -0
- package/dist/src/backend/services/session/service/lifecycle/session-services.d.ts +2 -0
- package/dist/src/backend/services/session/service/lifecycle/session-services.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/lifecycle/session-services.js +11 -0
- package/dist/src/backend/services/session/service/lifecycle/session-services.js.map +1 -1
- package/dist/src/backend/services/session/service/lifecycle/session.config.service.d.ts +1 -0
- package/dist/src/backend/services/session/service/lifecycle/session.config.service.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/lifecycle/session.config.service.js +17 -0
- package/dist/src/backend/services/session/service/lifecycle/session.config.service.js.map +1 -1
- package/dist/src/backend/services/session/service/lifecycle/session.config.service.test.js +42 -0
- package/dist/src/backend/services/session/service/lifecycle/session.config.service.test.js.map +1 -1
- package/dist/src/backend/services/session/service/lifecycle/session.error-message.d.ts +2 -0
- package/dist/src/backend/services/session/service/lifecycle/session.error-message.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/lifecycle/session.error-message.js +21 -0
- package/dist/src/backend/services/session/service/lifecycle/session.error-message.js.map +1 -1
- package/dist/src/backend/services/session/service/lifecycle/session.error-message.test.js +26 -1
- package/dist/src/backend/services/session/service/lifecycle/session.error-message.test.js.map +1 -1
- package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.d.ts +31 -2
- 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 +281 -109
- package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.js.map +1 -1
- package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.test.js +465 -8
- package/dist/src/backend/services/session/service/lifecycle/session.lifecycle.service.test.js.map +1 -1
- package/dist/src/backend/services/session/service/lifecycle/session.prompt.service.test.js +206 -5
- package/dist/src/backend/services/session/service/lifecycle/session.prompt.service.test.js.map +1 -1
- package/dist/src/backend/services/session/service/lifecycle/session.service.d.ts +15 -2
- package/dist/src/backend/services/session/service/lifecycle/session.service.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/lifecycle/session.service.js +87 -14
- package/dist/src/backend/services/session/service/lifecycle/session.service.js.map +1 -1
- package/dist/src/backend/services/session/service/lifecycle/session.service.test.js +105 -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 +4 -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 +34 -25
- 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 +119 -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-lifecycle-transcript.d.ts +6 -0
- package/dist/src/backend/services/session/service/store/session-lifecycle-transcript.d.ts.map +1 -0
- package/dist/src/backend/services/session/service/store/session-lifecycle-transcript.js +114 -0
- package/dist/src/backend/services/session/service/store/session-lifecycle-transcript.js.map +1 -0
- package/dist/src/backend/services/session/service/store/session-lifecycle-transcript.test.d.ts +2 -0
- package/dist/src/backend/services/session/service/store/session-lifecycle-transcript.test.d.ts.map +1 -0
- package/dist/src/backend/services/session/service/store/session-lifecycle-transcript.test.js +129 -0
- package/dist/src/backend/services/session/service/store/session-lifecycle-transcript.test.js.map +1 -0
- 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-transcript.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/store/session-transcript.js +7 -4
- package/dist/src/backend/services/session/service/store/session-transcript.js.map +1 -1
- package/dist/src/backend/services/workspace/resources/workspace.accessor.d.ts +1 -0
- 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 +31 -0
- package/dist/src/backend/services/workspace/resources/workspace.accessor.test.js.map +1 -1
- package/dist/src/backend/services/workspace/service/lifecycle/creation.service.d.ts.map +1 -1
- package/dist/src/backend/services/workspace/service/lifecycle/creation.service.js +1 -0
- package/dist/src/backend/services/workspace/service/lifecycle/creation.service.js.map +1 -1
- package/dist/src/backend/services/workspace/service/lifecycle/creation.service.test.js +12 -0
- package/dist/src/backend/services/workspace/service/lifecycle/creation.service.test.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/worktree/worktree-lifecycle.service.d.ts +1 -0
- 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 +14 -0
- 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 +54 -0
- package/dist/src/backend/services/workspace/service/worktree/worktree-lifecycle.service.test.js.map +1 -1
- package/dist/src/backend/trpc/project.router.test.js +19 -0
- package/dist/src/backend/trpc/project.router.test.js.map +1 -1
- package/dist/src/backend/trpc/project.trpc.js +1 -1
- package/dist/src/backend/trpc/project.trpc.js.map +1 -1
- package/dist/src/backend/trpc/session.router.test.js +11 -0
- package/dist/src/backend/trpc/session.router.test.js.map +1 -1
- package/dist/src/backend/trpc/session.trpc.d.ts.map +1 -1
- package/dist/src/backend/trpc/session.trpc.js +4 -0
- package/dist/src/backend/trpc/session.trpc.js.map +1 -1
- package/dist/src/cli/runtime-utils.d.ts.map +1 -1
- package/dist/src/cli/runtime-utils.js +4 -0
- package/dist/src/cli/runtime-utils.js.map +1 -1
- package/dist/src/cli/runtime-utils.test.js +7 -0
- package/dist/src/cli/runtime-utils.test.js.map +1 -1
- package/dist/src/shared/acp-protocol/protocol/messages.d.ts +18 -2
- package/dist/src/shared/acp-protocol/protocol/messages.d.ts.map +1 -1
- package/dist/src/shared/acp-protocol/protocol/messages.js +1 -0
- package/dist/src/shared/acp-protocol/protocol/messages.js.map +1 -1
- package/dist/src/shared/acp-protocol/protocol/renderer-window.d.ts.map +1 -1
- package/dist/src/shared/acp-protocol/protocol/renderer-window.js +3 -0
- package/dist/src/shared/acp-protocol/protocol/renderer-window.js.map +1 -1
- package/dist/src/shared/core/enums.d.ts +15 -0
- package/dist/src/shared/core/enums.d.ts.map +1 -1
- package/dist/src/shared/core/enums.js +13 -0
- package/dist/src/shared/core/enums.js.map +1 -1
- package/dist/src/shared/core/index.d.ts +1 -1
- package/dist/src/shared/core/index.d.ts.map +1 -1
- package/dist/src/shared/core/index.js +1 -1
- package/dist/src/shared/core/index.js.map +1 -1
- package/dist/src/shared/issue-start-prompt.d.ts.map +1 -1
- package/dist/src/shared/issue-start-prompt.js +8 -3
- package/dist/src/shared/issue-start-prompt.js.map +1 -1
- package/dist/src/test-utils/application-graph.d.ts.map +1 -1
- package/dist/src/test-utils/application-graph.js +3 -1
- package/dist/src/test-utils/application-graph.js.map +1 -1
- package/dist/tsconfig.backend.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/prisma/migrations/20260730140000_add_session_lifecycle_events/migration.sql +20 -0
- package/prisma/schema.prisma +32 -0
- package/dist/client/assets/channel-8o5vp5Nl.js +0 -1
- package/dist/client/assets/classDiagram-OUVF2IWQ-BNBqP_D4.js +0 -1
- package/dist/client/assets/classDiagram-v2-EOCWNBFH-BNBqP_D4.js +0 -1
- package/dist/client/assets/index-dP7LJD2L.css +0 -1
- package/dist/client/assets/stateDiagram-v2-6OUMAXLB-BnQzcOjM.js +0 -1
- package/dist/client/assets/swimlanesDiagram-G3AALYLV-mI62K_37.js +0 -8
|
@@ -1,15 +1,39 @@
|
|
|
1
1
|
import pLimit from 'p-limit';
|
|
2
2
|
import { createLogger } from '../../../../../backend/services/logger.service.js';
|
|
3
|
-
import {
|
|
3
|
+
import { PromptTimeoutError } from '../../../../../backend/services/session/service/acp/index.js';
|
|
4
|
+
import { SessionLifecycleEventKind, SessionLifecycleEventReason } from '../../../../../shared/core/index.js';
|
|
5
|
+
import { toErrorMessage, toProviderFailureChatMessage } from './session.error-message.js';
|
|
4
6
|
const logger = createLogger('session');
|
|
5
|
-
const DEFAULT_USER_PROMPT_TIMEOUT_MS = 60 * 60 * 1000;
|
|
7
|
+
const DEFAULT_USER_PROMPT_TIMEOUT_MS = 4 * 60 * 60 * 1000;
|
|
6
8
|
const TURN_ALREADY_IN_PROGRESS_REASON = 'A turn is already in progress for this session';
|
|
9
|
+
function formatTimeoutDuration(timeoutMs) {
|
|
10
|
+
const units = [
|
|
11
|
+
{ milliseconds: 60 * 60 * 1000, label: 'hour' },
|
|
12
|
+
{ milliseconds: 60 * 1000, label: 'minute' },
|
|
13
|
+
{ milliseconds: 1000, label: 'second' },
|
|
14
|
+
];
|
|
15
|
+
for (const unit of units) {
|
|
16
|
+
if (timeoutMs >= unit.milliseconds && timeoutMs % unit.milliseconds === 0) {
|
|
17
|
+
const value = timeoutMs / unit.milliseconds;
|
|
18
|
+
return `${value}-${unit.label}`;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return `${timeoutMs}-millisecond`;
|
|
22
|
+
}
|
|
23
|
+
function timeoutMessage(timeoutMs, timeoutKind) {
|
|
24
|
+
if (timeoutKind === 'standard_user_turn' && timeoutMs === DEFAULT_USER_PROMPT_TIMEOUT_MS) {
|
|
25
|
+
return 'Turn stopped: reached the 4-hour limit.';
|
|
26
|
+
}
|
|
27
|
+
return `Turn stopped: reached the configured ${formatTimeoutDuration(timeoutMs)} limit.`;
|
|
28
|
+
}
|
|
7
29
|
export class SessionService {
|
|
8
30
|
runtimeManager;
|
|
9
31
|
sessionDomainService;
|
|
10
32
|
acpEventProcessor;
|
|
11
33
|
promptTurnCompletionService;
|
|
34
|
+
lifecycleEventService;
|
|
12
35
|
getStopGeneration;
|
|
36
|
+
isStopGenerationCurrent;
|
|
13
37
|
isSessionStopping;
|
|
14
38
|
acpPromptLimiters = new Map();
|
|
15
39
|
workspaceBridge = null;
|
|
@@ -18,7 +42,9 @@ export class SessionService {
|
|
|
18
42
|
this.sessionDomainService = options.sessionDomainService;
|
|
19
43
|
this.acpEventProcessor = options.acpEventProcessor;
|
|
20
44
|
this.promptTurnCompletionService = options.promptTurnCompletionService;
|
|
45
|
+
this.lifecycleEventService = options.lifecycleEventService;
|
|
21
46
|
this.getStopGeneration = options.getStopGeneration;
|
|
47
|
+
this.isStopGenerationCurrent = options.isStopGenerationCurrent;
|
|
22
48
|
this.isSessionStopping = options.isSessionStopping;
|
|
23
49
|
}
|
|
24
50
|
configure(bridges) {
|
|
@@ -30,7 +56,9 @@ export class SessionService {
|
|
|
30
56
|
const prompt = typeof content === 'string'
|
|
31
57
|
? [{ type: 'text', text: content }]
|
|
32
58
|
: this.toContentBlocks(content, acpClient.supportsImages());
|
|
33
|
-
return this.sendAcpMessage(sessionId, prompt, DEFAULT_USER_PROMPT_TIMEOUT_MS
|
|
59
|
+
return this.sendAcpMessage(sessionId, prompt, DEFAULT_USER_PROMPT_TIMEOUT_MS, {
|
|
60
|
+
timeoutKind: 'standard_user_turn',
|
|
61
|
+
})
|
|
34
62
|
.then(() => undefined)
|
|
35
63
|
.catch((error) => {
|
|
36
64
|
const errorMessage = toErrorMessage(error);
|
|
@@ -89,8 +117,8 @@ export class SessionService {
|
|
|
89
117
|
}
|
|
90
118
|
return blocks;
|
|
91
119
|
}
|
|
92
|
-
sendAcpMessage(sessionId, prompt, timeoutMs) {
|
|
93
|
-
return this.withSerializedAcpPrompt(sessionId, () => this.executeAcpMessage(sessionId, prompt, timeoutMs));
|
|
120
|
+
sendAcpMessage(sessionId, prompt, timeoutMs, options) {
|
|
121
|
+
return this.withSerializedAcpPrompt(sessionId, () => this.executeAcpMessage(sessionId, prompt, timeoutMs, options?.timeoutKind ?? 'configured'));
|
|
94
122
|
}
|
|
95
123
|
withSerializedAcpPrompt(sessionId, task) {
|
|
96
124
|
const limiter = this.getAcpPromptLimiter(sessionId);
|
|
@@ -123,14 +151,14 @@ export class SessionService {
|
|
|
123
151
|
this.acpPromptLimiters.set(sessionId, limiter);
|
|
124
152
|
return limiter;
|
|
125
153
|
}
|
|
126
|
-
async executeAcpMessage(sessionId, prompt, timeoutMs) {
|
|
154
|
+
async executeAcpMessage(sessionId, prompt, timeoutMs, timeoutKind) {
|
|
127
155
|
const stopGeneration = this.getStopGeneration(sessionId);
|
|
128
156
|
const workspaceId = this.acpEventProcessor.getWorkspaceId(sessionId);
|
|
129
157
|
let workspaceActivityGeneration;
|
|
130
158
|
let promptCompleted = false;
|
|
131
159
|
let promptError;
|
|
132
160
|
let promptErrorSet = false;
|
|
133
|
-
this.acpEventProcessor.beginPromptTurn(sessionId);
|
|
161
|
+
const attemptKey = this.acpEventProcessor.beginPromptTurn(sessionId);
|
|
134
162
|
this.sessionDomainService.setRuntimeSnapshot(sessionId, {
|
|
135
163
|
phase: 'running',
|
|
136
164
|
processState: 'alive',
|
|
@@ -143,17 +171,25 @@ export class SessionService {
|
|
|
143
171
|
try {
|
|
144
172
|
const result = await this.runtimeManager.sendPrompt(sessionId, prompt, timeoutMs);
|
|
145
173
|
promptCompleted = true;
|
|
146
|
-
this.
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
updatedAt: new Date().toISOString(),
|
|
174
|
+
this.completeSuccessfulPromptTurn({
|
|
175
|
+
sessionId,
|
|
176
|
+
stopGeneration,
|
|
177
|
+
stopReason: result.stopReason,
|
|
151
178
|
});
|
|
152
179
|
return result.stopReason;
|
|
153
180
|
}
|
|
154
181
|
catch (error) {
|
|
155
182
|
promptError = error;
|
|
156
183
|
promptErrorSet = true;
|
|
184
|
+
if (this.shouldRecordPromptFailure(sessionId, stopGeneration, error)) {
|
|
185
|
+
await this.recordPromptFailure({
|
|
186
|
+
sessionId,
|
|
187
|
+
workspaceId,
|
|
188
|
+
attemptKey,
|
|
189
|
+
error,
|
|
190
|
+
timeoutKind,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
157
193
|
this.completePromptTurnIfCurrent(sessionId, stopGeneration, 'prompt_error', {
|
|
158
194
|
phase: 'error',
|
|
159
195
|
processState: 'alive',
|
|
@@ -174,13 +210,50 @@ export class SessionService {
|
|
|
174
210
|
}
|
|
175
211
|
if ((promptCompleted || (promptErrorSet && !this.isTurnAlreadyInProgressError(promptError))) &&
|
|
176
212
|
!this.isSessionStopping(sessionId) &&
|
|
177
|
-
this.
|
|
213
|
+
this.isStopGenerationCurrent(sessionId, stopGeneration)) {
|
|
178
214
|
this.promptTurnCompletionService.schedule(sessionId);
|
|
179
215
|
}
|
|
180
216
|
}
|
|
181
217
|
}
|
|
218
|
+
completeSuccessfulPromptTurn({ sessionId, stopGeneration, stopReason, }) {
|
|
219
|
+
this.completePromptTurnIfCurrent(sessionId, stopGeneration, `stop_reason:${stopReason}`, {
|
|
220
|
+
phase: 'idle',
|
|
221
|
+
processState: 'alive',
|
|
222
|
+
activity: 'IDLE',
|
|
223
|
+
updatedAt: new Date().toISOString(),
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
async recordPromptFailure({ sessionId, workspaceId, attemptKey, error, timeoutKind, }) {
|
|
227
|
+
const reason = error instanceof PromptTimeoutError
|
|
228
|
+
? SessionLifecycleEventReason.PROMPT_TIMEOUT
|
|
229
|
+
: SessionLifecycleEventReason.PROVIDER_ERROR;
|
|
230
|
+
if (!workspaceId) {
|
|
231
|
+
logger.warn('Skipped prompt failure lifecycle event without workspace owner', {
|
|
232
|
+
sessionId,
|
|
233
|
+
attemptKey,
|
|
234
|
+
reason,
|
|
235
|
+
});
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
await this.lifecycleEventService.record({
|
|
239
|
+
workspaceId,
|
|
240
|
+
sessionId,
|
|
241
|
+
kind: SessionLifecycleEventKind.TURN_INTERRUPTED,
|
|
242
|
+
reason,
|
|
243
|
+
message: error instanceof PromptTimeoutError
|
|
244
|
+
? timeoutMessage(error.timeoutMs, timeoutKind)
|
|
245
|
+
: toProviderFailureChatMessage(this.acpEventProcessor.getProvider(sessionId), error),
|
|
246
|
+
dedupeKey: `turn:${attemptKey}:stop`,
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
shouldRecordPromptFailure(sessionId, stopGeneration, error) {
|
|
250
|
+
if (this.isTurnAlreadyInProgressError(error) || this.isSessionStopping(sessionId)) {
|
|
251
|
+
return false;
|
|
252
|
+
}
|
|
253
|
+
return this.getStopGeneration(sessionId) === stopGeneration;
|
|
254
|
+
}
|
|
182
255
|
completePromptTurnIfCurrent(sessionId, stopGeneration, orphanedToolCallReason, runtime) {
|
|
183
|
-
if (this.
|
|
256
|
+
if (!this.isStopGenerationCurrent(sessionId, stopGeneration)) {
|
|
184
257
|
return;
|
|
185
258
|
}
|
|
186
259
|
this.acpEventProcessor.finishPromptTurn(sessionId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.service.js","sourceRoot":"","sources":["../../../../../../../src/backend/services/session/service/lifecycle/session.service.ts"],"names":[],"mappings":"AACA,OAAO,MAA8B,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"session.service.js","sourceRoot":"","sources":["../../../../../../../src/backend/services/session/service/lifecycle/session.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,6 +33,7 @@ vi.mock('@/backend/services/session/service/acp', async (importOriginal) => {
|
|
|
33
33
|
getClient: vi.fn().mockReturnValue(undefined),
|
|
34
34
|
getOrCreateClient: vi.fn(),
|
|
35
35
|
stopClient: vi.fn(),
|
|
36
|
+
beginShutdown: vi.fn().mockReturnValue([]),
|
|
36
37
|
stopAllClients: vi.fn(),
|
|
37
38
|
sendPrompt: vi.fn(),
|
|
38
39
|
cancelPrompt: vi.fn(),
|
|
@@ -1005,7 +1006,9 @@ describe('SessionService', () => {
|
|
|
1005
1006
|
vi.mocked(sessionRepository.updateSession).mockResolvedValue({});
|
|
1006
1007
|
const clearSessionSpy = vi.spyOn(sessionDomainService, 'clearSession');
|
|
1007
1008
|
await sessionLifecycleService.stopSession('session-clear');
|
|
1008
|
-
expect(clearSessionSpy).toHaveBeenCalledWith('session-clear'
|
|
1009
|
+
expect(clearSessionSpy).toHaveBeenCalledWith('session-clear', {
|
|
1010
|
+
preserveRejections: true,
|
|
1011
|
+
});
|
|
1009
1012
|
});
|
|
1010
1013
|
it('keeps in-memory session state after manual stop when clients are connected', async () => {
|
|
1011
1014
|
vi.mocked(acpRuntimeManager.isStopInProgress).mockReturnValue(false);
|
|
@@ -1156,6 +1159,7 @@ describe('SessionService', () => {
|
|
|
1156
1159
|
const transcriptSpy = vi
|
|
1157
1160
|
.spyOn(sessionDomainService, 'getTranscriptSnapshot')
|
|
1158
1161
|
.mockReturnValue(transcript);
|
|
1162
|
+
const clearSessionSpy = vi.spyOn(sessionDomainService, 'clearSession');
|
|
1159
1163
|
vi.mocked(acpRuntimeManager.isStopInProgress).mockReturnValue(false);
|
|
1160
1164
|
vi.mocked(acpRuntimeManager.stopClient).mockResolvedValue();
|
|
1161
1165
|
vi.mocked(sessionRepository.getSessionById).mockResolvedValue(unsafeCoerce({
|
|
@@ -1184,7 +1188,11 @@ describe('SessionService', () => {
|
|
|
1184
1188
|
messages: transcript,
|
|
1185
1189
|
});
|
|
1186
1190
|
expect(sessionRepository.deleteSession).toHaveBeenCalledWith('session-1');
|
|
1191
|
+
expect(clearSessionSpy).toHaveBeenCalledWith('session-1');
|
|
1192
|
+
const destructiveClearCallIndex = clearSessionSpy.mock.calls.findIndex(([sessionId, options]) => sessionId === 'session-1' && options === undefined);
|
|
1193
|
+
expect(destructiveClearCallIndex).toBeGreaterThanOrEqual(0);
|
|
1187
1194
|
expect(vi.mocked(closedSessionPersistenceService.persistClosedSession).mock.invocationCallOrder[0]).toBeLessThan(vi.mocked(sessionRepository.deleteSession).mock.invocationCallOrder[0]);
|
|
1195
|
+
expect(vi.mocked(sessionRepository.deleteSession).mock.invocationCallOrder[0]).toBeLessThan(clearSessionSpy.mock.invocationCallOrder[destructiveClearCallIndex]);
|
|
1188
1196
|
}
|
|
1189
1197
|
finally {
|
|
1190
1198
|
transcriptSpy.mockRestore();
|
|
@@ -1340,6 +1348,7 @@ describe('SessionService', () => {
|
|
|
1340
1348
|
});
|
|
1341
1349
|
mockCreatedAcpClient(acpHandle);
|
|
1342
1350
|
vi.mocked(acpRuntimeManager.sendPrompt).mockResolvedValue({ stopReason: 'end_turn' });
|
|
1351
|
+
const clearSessionSpy = vi.spyOn(sessionDomainService, 'clearSession');
|
|
1343
1352
|
await sessionLifecycleService.startSession('session-1');
|
|
1344
1353
|
const acpHandlers = vi.mocked(acpRuntimeManager.getOrCreateClient).mock.calls[0][2];
|
|
1345
1354
|
await acpHandlers.onExit('session-1', 0);
|
|
@@ -1348,6 +1357,10 @@ describe('SessionService', () => {
|
|
|
1348
1357
|
});
|
|
1349
1358
|
expect(mockRecordRatchetSessionEnd).toHaveBeenCalledWith('workspace-1', 'session-1', 'COMPLETED');
|
|
1350
1359
|
expect(sessionRepository.deleteSession).toHaveBeenCalledWith('session-1');
|
|
1360
|
+
expect(clearSessionSpy).toHaveBeenCalledWith('session-1');
|
|
1361
|
+
const destructiveClearCallIndex = clearSessionSpy.mock.calls.findIndex(([sessionId, options]) => sessionId === 'session-1' && options === undefined);
|
|
1362
|
+
expect(destructiveClearCallIndex).toBeGreaterThanOrEqual(0);
|
|
1363
|
+
expect(vi.mocked(sessionRepository.deleteSession).mock.invocationCallOrder[0]).toBeLessThan(clearSessionSpy.mock.invocationCallOrder[destructiveClearCallIndex]);
|
|
1351
1364
|
});
|
|
1352
1365
|
it('does not delete ratchet session when closed-session persistence fails', async () => {
|
|
1353
1366
|
const session = unsafeCoerce({
|
|
@@ -1445,6 +1458,97 @@ describe('SessionService', () => {
|
|
|
1445
1458
|
});
|
|
1446
1459
|
expect(sessionRepository.deleteSession).not.toHaveBeenCalled();
|
|
1447
1460
|
});
|
|
1461
|
+
it('preserves a failed draft recorded while runtime-exit persistence is in flight', async () => {
|
|
1462
|
+
const sessionId = 'session-runtime-exit-failed-draft';
|
|
1463
|
+
const session = unsafeCoerce({
|
|
1464
|
+
id: sessionId,
|
|
1465
|
+
workspaceId: 'workspace-1',
|
|
1466
|
+
status: SessionStatus.RUNNING,
|
|
1467
|
+
workflow: 'default',
|
|
1468
|
+
model: 'sonnet',
|
|
1469
|
+
provider: 'CLAUDE',
|
|
1470
|
+
providerSessionId: null,
|
|
1471
|
+
});
|
|
1472
|
+
const workspace = unsafeCoerce({
|
|
1473
|
+
id: 'workspace-1',
|
|
1474
|
+
worktreePath: '/tmp/work',
|
|
1475
|
+
branchName: 'fix-branch',
|
|
1476
|
+
isAutoGeneratedBranch: false,
|
|
1477
|
+
name: 'Workspace A',
|
|
1478
|
+
description: null,
|
|
1479
|
+
projectId: 'project-1',
|
|
1480
|
+
});
|
|
1481
|
+
const acpHandle = unsafeCoerce({
|
|
1482
|
+
getPid: vi.fn().mockReturnValue(790),
|
|
1483
|
+
isPromptInFlight: true,
|
|
1484
|
+
configOptions: [],
|
|
1485
|
+
});
|
|
1486
|
+
const exitUpdate = createDeferred();
|
|
1487
|
+
sessionDomainService.clearSession(sessionId);
|
|
1488
|
+
vi.mocked(sessionRepository.getWorkspaceById).mockResolvedValue(workspace);
|
|
1489
|
+
vi.mocked(sessionRepository.markWorkspaceHasHadSessions).mockResolvedValue();
|
|
1490
|
+
vi.mocked(sessionRepository.updateSession).mockResolvedValue(session);
|
|
1491
|
+
vi.mocked(sessionPromptBuilder.shouldInjectBranchRename).mockReturnValue(false);
|
|
1492
|
+
vi.mocked(sessionPromptBuilder.buildSystemPrompt).mockReturnValue({
|
|
1493
|
+
workflowPrompt: undefined,
|
|
1494
|
+
systemPrompt: undefined,
|
|
1495
|
+
injectedBranchRename: false,
|
|
1496
|
+
});
|
|
1497
|
+
mockCreatedAcpClient(acpHandle);
|
|
1498
|
+
await sessionLifecycleService.getOrCreateSessionClientFromRecord(session);
|
|
1499
|
+
const acpHandlers = vi.mocked(acpRuntimeManager.getOrCreateClient).mock.calls[0][2];
|
|
1500
|
+
vi.mocked(sessionRepository.updateSession).mockReset();
|
|
1501
|
+
vi.mocked(sessionRepository.updateSession).mockReturnValueOnce(exitUpdate.promise);
|
|
1502
|
+
const exitPromise = acpHandlers.onExit(sessionId, 1);
|
|
1503
|
+
await vi.waitFor(() => {
|
|
1504
|
+
expect(sessionRepository.updateSession).toHaveBeenCalledWith(sessionId, {
|
|
1505
|
+
status: SessionStatus.FAILED,
|
|
1506
|
+
});
|
|
1507
|
+
});
|
|
1508
|
+
sessionDomainService.failMessage(sessionId, {
|
|
1509
|
+
id: 'failed-during-exit',
|
|
1510
|
+
text: 'recover after crash',
|
|
1511
|
+
timestamp: '2026-07-29T12:00:00.000Z',
|
|
1512
|
+
settings: {
|
|
1513
|
+
selectedModel: null,
|
|
1514
|
+
reasoningEffort: null,
|
|
1515
|
+
thinkingEnabled: false,
|
|
1516
|
+
planModeEnabled: false,
|
|
1517
|
+
},
|
|
1518
|
+
}, 'ACP runtime crashed');
|
|
1519
|
+
exitUpdate.resolve(session);
|
|
1520
|
+
await exitPromise;
|
|
1521
|
+
const publishToSessionSpy = vi.spyOn(sessionEventBus, 'publishToSession');
|
|
1522
|
+
sessionDomainService.subscribe({
|
|
1523
|
+
sessionId,
|
|
1524
|
+
sessionRuntime: {
|
|
1525
|
+
phase: 'error',
|
|
1526
|
+
processState: 'stopped',
|
|
1527
|
+
activity: 'IDLE',
|
|
1528
|
+
errorMessage: 'ACP runtime crashed',
|
|
1529
|
+
updatedAt: '2026-07-29T12:00:01.000Z',
|
|
1530
|
+
},
|
|
1531
|
+
});
|
|
1532
|
+
const replayBatch = publishToSessionSpy.mock.calls
|
|
1533
|
+
.map(([, payload]) => payload)
|
|
1534
|
+
.find((payload) => payload.type === 'session_replay_batch');
|
|
1535
|
+
expect(replayBatch).toMatchObject({
|
|
1536
|
+
replayEvents: expect.arrayContaining([
|
|
1537
|
+
{
|
|
1538
|
+
type: 'message_state_changed',
|
|
1539
|
+
id: 'failed-during-exit',
|
|
1540
|
+
newState: 'FAILED',
|
|
1541
|
+
errorMessage: 'ACP runtime crashed',
|
|
1542
|
+
userMessage: {
|
|
1543
|
+
text: 'recover after crash',
|
|
1544
|
+
timestamp: '2026-07-29T12:00:00.000Z',
|
|
1545
|
+
attachments: undefined,
|
|
1546
|
+
sessionId,
|
|
1547
|
+
},
|
|
1548
|
+
},
|
|
1549
|
+
]),
|
|
1550
|
+
});
|
|
1551
|
+
});
|
|
1448
1552
|
it.each([
|
|
1449
1553
|
{ exitCode: 1, expectedStatus: SessionStatus.FAILED },
|
|
1450
1554
|
{ exitCode: null, expectedStatus: SessionStatus.FAILED },
|