factory-factory 0.4.5 → 0.4.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/assets/{abnfDiagram-VRR7QNED-DygwVN25.js → abnfDiagram-N423BO3Z-BcUuFtOj.js} +1 -1
- package/dist/client/assets/{arc-CcnMw5av.js → arc-Cp8_E6ha.js} +1 -1
- package/dist/client/assets/architectureDiagram-T3A2C74G-C3_2J0tC.js +36 -0
- package/dist/client/assets/{blockDiagram-677ZJIJ3-DQ77xvqH.js → blockDiagram-VBNYF7ZC-Dy0jc6lP.js} +1 -1
- package/dist/client/assets/{c4Diagram-LMCZKHZV-B-9QZJ1e.js → c4Diagram-5PPSVZJV-97TkD6w-.js} +1 -1
- package/dist/client/assets/channel-DLBBfejH.js +1 -0
- package/dist/client/assets/{chunk-32BRIVSS-CV9UmSkI.js → chunk-2GRJ4B5K-Dc0I7ume.js} +1 -1
- package/dist/client/assets/{chunk-2Q5K7J3B-DhfBY-Wd.js → chunk-2Q5K7J3B-DbFPWZwu.js} +1 -1
- package/dist/client/assets/{chunk-EX3LRPZG-Dj63JdET.js → chunk-5RXB4S5H-Dci_7ZDD.js} +1 -1
- package/dist/client/assets/{chunk-5VM5RSS4-BUNj3iDY.js → chunk-5VM5RSS4-Ca82Rzl0.js} +1 -1
- package/dist/client/assets/{chunk-MOJQB5TN-PY5GLOxr.js → chunk-6Q2QTUOP-Be2f5Q2t.js} +1 -1
- package/dist/client/assets/{chunk-V7JOEXUC--zp7Z0xS.js → chunk-GF5L2VYU-C4VRs6xS.js} +1 -1
- package/dist/client/assets/{chunk-JWPE2WC7-i6Ud3VAu.js → chunk-JWPE2WC7-DVlW0c7f.js} +1 -1
- package/dist/client/assets/{chunk-VR4S4FIN-JstmsazP.js → chunk-KBJHAD2P-BKRpW89b.js} +1 -1
- package/dist/client/assets/{chunk-RYQCIY6F-pIEuQy1L.js → chunk-RYQCIY6F-BwMw9oh9.js} +1 -1
- package/dist/client/assets/{chunk-XXDRQBXY-C66lsFmy.js → chunk-XXDRQBXY-py-FQquv.js} +1 -1
- package/dist/client/assets/classDiagram-JCYQIIEL-Ds5wVQR3.js +1 -0
- package/dist/client/assets/classDiagram-v2-OCEON4UE-Ds5wVQR3.js +1 -0
- package/dist/client/assets/{cose-bilkent-JH36ORCC-D3jSuAHn.js → cose-bilkent-JH36ORCC-BMCtQCZ8.js} +1 -1
- package/dist/client/assets/{cynefin-VYW2F7L2-Dx3xfGS7.js → cynefin-VYW2F7L2-BTHAy6wD.js} +1 -1
- package/dist/client/assets/{cynefinDiagram-TSTJHNR4-BcGYZcSJ.js → cynefinDiagram-MW4NZA55-pQCQD0Ih.js} +1 -1
- package/dist/client/assets/{dagre-VKFMJZFB-CLZSDf9x.js → dagre-VZM6K2ZE-CZcoEFVf.js} +1 -1
- package/dist/client/assets/{diagram-OA4YK3LP-C7WEtC2B.js → diagram-7IWD3JNH-DgQv_208.js} +1 -1
- package/dist/client/assets/{diagram-FQU43EPY-Nosv2FJf.js → diagram-B4RE2ZJO-DoFotcsB.js} +1 -1
- package/dist/client/assets/{diagram-NH7WQ7WH-BmRiUIAJ.js → diagram-LBJQPF4R-C5zkL1ml.js} +1 -1
- package/dist/client/assets/{diagram-G47NLZAW-CPjqONaO.js → diagram-Q27KOJAE-ERKqnoHP.js} +1 -1
- package/dist/client/assets/diagram-UB23O5K3-Dyt6sy3Z.js +41 -0
- package/dist/client/assets/{ebnfDiagram-CCIWWBDH-D2Ye87k4.js → ebnfDiagram-BXEA7PRR-DqsFEAw2.js} +1 -1
- package/dist/client/assets/{erDiagram-Q63AITRT-CgZF8eG-.js → erDiagram-JOGREHBK-Dn8Aqkgn.js} +1 -1
- package/dist/client/assets/{flowDiagram-23GEKE2U-bxoO3Eep.js → flowDiagram-UKHOOZJN-DcArGyH-.js} +6 -6
- package/dist/client/assets/{ganttDiagram-NO4QXBWP-BAtqPw6P.js → ganttDiagram-PKOTCBZU-BuHaeolc.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-IHSO6WYX-DYQqeJ8w.js → gitGraphDiagram-DS77QQ5N-iKWWNsQK.js} +1 -1
- package/dist/client/assets/index-CVVo6xHd.css +1 -0
- package/dist/client/assets/index-DY0TryY7.js +695 -0
- package/dist/client/assets/{infoDiagram-FWYZ7A6U-CZQCerFQ.js → infoDiagram-6WML65LV-C7IulVvo.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-FXEZZL3T-Bc7wE25N.js → ishikawaDiagram-WSZJBQD7-DW4cB_Nk.js} +1 -1
- package/dist/client/assets/{journeyDiagram-5HDEW3XC-D5qqjKJz.js → journeyDiagram-NVQOT4AX-Nzsiy4H7.js} +1 -1
- package/dist/client/assets/{kanban-definition-HUTT4EX6-42kkaHBo.js → kanban-definition-27J2QSJJ-BUsK9dj9.js} +1 -1
- package/dist/client/assets/{linear-Dg3NQEM3.js → linear-CyoW-usj.js} +1 -1
- package/dist/client/assets/{mindmap-definition-LN4V7U3C-CRANKUcD.js → mindmap-definition-FAOFIHXS-Bd9cSJjQ.js} +1 -1
- package/dist/client/assets/{mobile-baseline-D6bQ8WTB.js → mobile-baseline-K78aE4nt.js} +1 -1
- package/dist/client/assets/{pegDiagram-2B236MQR-qJQPOd8H.js → pegDiagram-VL7TDLO6-BrmAKdiE.js} +1 -1
- package/dist/client/assets/{pieDiagram-ENE6RG2P-B5wB7Ccf.js → pieDiagram-7S7Q4E2Y-Ce0k6LI1.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-ABIIQ3AL-CCZfXF8m.js → quadrantDiagram-CIZ2JOQS-_9HxOOGa.js} +1 -1
- package/dist/client/assets/{railroadDiagram-RFXS5EU6-BuIrSJUW.js → railroadDiagram-AXF67PYL-ChdF1CBw.js} +1 -1
- package/dist/client/assets/{requirementDiagram-TGXJPOKE-DfIr0zZ3.js → requirementDiagram-LRYGKXZP-Bm2gdYTE.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-HTMAVEWB-CJoUXRWq.js → sankeyDiagram-W5VNT64P-Kf7zUiC-.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-DBY2YBRQ-Cq1lOU1b.js → sequenceDiagram-SI44F4Z6-DyPqsgh1.js} +1 -1
- package/dist/client/assets/{sizeCapture-X5ZJPWSS-XHOsOkor.js → sizeCapture-X5ZJPWSS-Cgn8Hxr2.js} +1 -1
- package/dist/client/assets/{stateDiagram-2N3HPSRC-BLVzzete.js → stateDiagram-OKZ733FA-CJxSzxmg.js} +1 -1
- package/dist/client/assets/stateDiagram-v2-UEYNNEHI-BwUaUW2J.js +1 -0
- package/dist/client/assets/{swimlanes-5IMT3BWC-C20mYIPR.js → swimlanes-SLNWSIFB-Ckb_izEZ.js} +2 -2
- package/dist/client/assets/swimlanesDiagram-ULZ7WXOC-D87lLmuW.js +8 -0
- package/dist/client/assets/{terminal-instance-Dw2gcPib.js → terminal-instance-DWySt2_t.js} +1 -1
- package/dist/client/assets/{timeline-definition-FHXFAJF6-DlceJAxJ.js → timeline-definition-Z64GVDOM-BWx_NLrK.js} +1 -1
- package/dist/client/assets/{vennDiagram-L72KCM5P-CFl-Eo1Y.js → vennDiagram-T6HMQDX7-BgN2-lO-.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-EHGQE667-eBpeLOoN.js → wardleyDiagram-T6FBY63Y-C9iwoeki.js} +1 -1
- package/dist/client/assets/{xychartDiagram-FW5EYKEG-B8RBkKiX.js → xychartDiagram-ELKLHX3M-B3AYy5ZN.js} +4 -4
- package/dist/client/audio-worklets/pcm-capture-processor.js +67 -0
- package/dist/client/index.html +2 -2
- package/dist/client/sounds/voice-thinking-start.mp3 +0 -0
- package/dist/prisma/generated/commonInputTypes.d.ts +40 -0
- package/dist/prisma/generated/commonInputTypes.d.ts.map +1 -1
- package/dist/prisma/generated/enums.d.ts +1 -0
- package/dist/prisma/generated/enums.d.ts.map +1 -1
- package/dist/prisma/generated/enums.js +2 -1
- package/dist/prisma/generated/enums.js.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 +7 -1
- package/dist/prisma/generated/internal/prismaNamespace.d.ts.map +1 -1
- package/dist/prisma/generated/internal/prismaNamespace.js +6 -0
- package/dist/prisma/generated/internal/prismaNamespace.js.map +1 -1
- package/dist/prisma/generated/internal/prismaNamespaceBrowser.d.ts +6 -0
- package/dist/prisma/generated/internal/prismaNamespaceBrowser.d.ts.map +1 -1
- package/dist/prisma/generated/internal/prismaNamespaceBrowser.js +6 -0
- package/dist/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
- package/dist/prisma/generated/models/UserSettings.d.ts +216 -1
- package/dist/prisma/generated/models/UserSettings.d.ts.map +1 -1
- package/dist/src/backend/app-context.d.ts +4 -1
- package/dist/src/backend/app-context.d.ts.map +1 -1
- package/dist/src/backend/app-context.js +4 -1
- package/dist/src/backend/app-context.js.map +1 -1
- package/dist/src/backend/orchestration/data-backup.service.d.ts.map +1 -1
- package/dist/src/backend/orchestration/data-backup.service.js +10 -0
- package/dist/src/backend/orchestration/data-backup.service.js.map +1 -1
- package/dist/src/backend/orchestration/data-backup.service.test.js +23 -0
- package/dist/src/backend/orchestration/data-backup.service.test.js.map +1 -1
- package/dist/src/backend/orchestration/reconciliation.service.d.ts.map +1 -1
- package/dist/src/backend/orchestration/reconciliation.service.js +4 -0
- package/dist/src/backend/orchestration/reconciliation.service.js.map +1 -1
- package/dist/src/backend/orchestration/reconciliation.service.test.js +39 -0
- package/dist/src/backend/orchestration/reconciliation.service.test.js.map +1 -1
- package/dist/src/backend/routers/websocket/index.d.ts +1 -0
- package/dist/src/backend/routers/websocket/index.d.ts.map +1 -1
- package/dist/src/backend/routers/websocket/index.js +1 -0
- package/dist/src/backend/routers/websocket/index.js.map +1 -1
- package/dist/src/backend/routers/websocket/voice-soft-stop.handler.d.ts +11 -0
- package/dist/src/backend/routers/websocket/voice-soft-stop.handler.d.ts.map +1 -0
- package/dist/src/backend/routers/websocket/voice-soft-stop.handler.js +28 -0
- package/dist/src/backend/routers/websocket/voice-soft-stop.handler.js.map +1 -0
- package/dist/src/backend/routers/websocket/voice-soft-stop.handler.test.d.ts +2 -0
- package/dist/src/backend/routers/websocket/voice-soft-stop.handler.test.d.ts.map +1 -0
- package/dist/src/backend/routers/websocket/voice-soft-stop.handler.test.js +84 -0
- package/dist/src/backend/routers/websocket/voice-soft-stop.handler.test.js.map +1 -0
- package/dist/src/backend/routers/websocket/voice.handler.d.ts +3 -0
- package/dist/src/backend/routers/websocket/voice.handler.d.ts.map +1 -0
- package/dist/src/backend/routers/websocket/voice.handler.js +46 -0
- package/dist/src/backend/routers/websocket/voice.handler.js.map +1 -0
- package/dist/src/backend/server.d.ts.map +1 -1
- package/dist/src/backend/server.js +3 -1
- package/dist/src/backend/server.js.map +1 -1
- package/dist/src/backend/server.upgrade.test.js +16 -0
- package/dist/src/backend/server.upgrade.test.js.map +1 -1
- package/dist/src/backend/services/ratchet/service/ratchet.service.test.js +6 -0
- package/dist/src/backend/services/ratchet/service/ratchet.service.test.js.map +1 -1
- package/dist/src/backend/services/session/service/acp/acp-client-handler.d.ts +1 -0
- package/dist/src/backend/services/session/service/acp/acp-client-handler.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/acp/acp-client-handler.js +30 -0
- package/dist/src/backend/services/session/service/acp/acp-client-handler.js.map +1 -1
- package/dist/src/backend/services/session/service/acp/acp-client-handler.test.js +57 -0
- package/dist/src/backend/services/session/service/acp/acp-client-handler.test.js.map +1 -1
- package/dist/src/backend/services/session/service/acp/acp-event-translator.d.ts +1 -37
- package/dist/src/backend/services/session/service/acp/acp-event-translator.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/acp/acp-event-translator.js +1 -334
- package/dist/src/backend/services/session/service/acp/acp-event-translator.js.map +1 -1
- package/dist/src/backend/services/session/service/acp/acp-event-translator.test.js +5 -484
- package/dist/src/backend/services/session/service/acp/acp-event-translator.test.js.map +1 -1
- package/dist/src/backend/services/session/service/acp/acp-process-handle.d.ts +2 -0
- package/dist/src/backend/services/session/service/acp/acp-process-handle.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/acp/acp-process-handle.js +12 -0
- package/dist/src/backend/services/session/service/acp/acp-process-handle.js.map +1 -1
- package/dist/src/backend/services/session/service/acp/acp-process-handle.test.d.ts +2 -0
- package/dist/src/backend/services/session/service/acp/acp-process-handle.test.d.ts.map +1 -0
- package/dist/src/backend/services/session/service/acp/acp-process-handle.test.js +66 -0
- package/dist/src/backend/services/session/service/acp/acp-process-handle.test.js.map +1 -0
- package/dist/src/backend/services/session/service/acp/acp-runtime-events.d.ts +7 -1
- package/dist/src/backend/services/session/service/acp/acp-runtime-events.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/acp/acp-runtime-manager.d.ts +19 -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 +240 -54
- 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 +320 -22
- package/dist/src/backend/services/session/service/acp/acp-runtime-manager.test.js.map +1 -1
- package/dist/src/backend/services/session/service/acp/acp-session-config-options.d.ts +1 -0
- package/dist/src/backend/services/session/service/acp/acp-session-config-options.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/acp/acp-session-config-options.js +4 -17
- package/dist/src/backend/services/session/service/acp/acp-session-config-options.js.map +1 -1
- package/dist/src/backend/services/session/service/acp/acp-session-config-options.test.d.ts +2 -0
- package/dist/src/backend/services/session/service/acp/acp-session-config-options.test.d.ts.map +1 -0
- package/dist/src/backend/services/session/service/acp/acp-session-config-options.test.js +121 -0
- package/dist/src/backend/services/session/service/acp/acp-session-config-options.test.js.map +1 -0
- package/dist/src/backend/services/session/service/acp/acp-session-negotiation.integration.test.js +1 -1
- package/dist/src/backend/services/session/service/acp/acp-session-negotiation.integration.test.js.map +1 -1
- package/dist/src/backend/services/session/service/acp/claude-model-catalog-loader.d.ts +7 -0
- package/dist/src/backend/services/session/service/acp/claude-model-catalog-loader.d.ts.map +1 -0
- package/dist/src/backend/services/session/service/acp/claude-model-catalog-loader.js +160 -0
- package/dist/src/backend/services/session/service/acp/claude-model-catalog-loader.js.map +1 -0
- package/dist/src/backend/services/session/service/acp/claude-model-catalog-loader.test.d.ts +2 -0
- package/dist/src/backend/services/session/service/acp/claude-model-catalog-loader.test.d.ts.map +1 -0
- package/dist/src/backend/services/session/service/acp/claude-model-catalog-loader.test.js +260 -0
- package/dist/src/backend/services/session/service/acp/claude-model-catalog-loader.test.js.map +1 -0
- package/dist/src/backend/services/session/service/acp/claude-model-options.d.ts +5 -0
- package/dist/src/backend/services/session/service/acp/claude-model-options.d.ts.map +1 -0
- package/dist/src/backend/services/session/service/acp/claude-model-options.js +25 -0
- package/dist/src/backend/services/session/service/acp/claude-model-options.js.map +1 -0
- package/dist/src/backend/services/session/service/acp/claude-model-options.test.d.ts +2 -0
- package/dist/src/backend/services/session/service/acp/claude-model-options.test.d.ts.map +1 -0
- package/dist/src/backend/services/session/service/acp/claude-model-options.test.js +49 -0
- package/dist/src/backend/services/session/service/acp/claude-model-options.test.js.map +1 -0
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/adapter-state.d.ts +2 -0
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/adapter-state.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.d.ts +2 -0
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.js +64 -1
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.js.map +1 -1
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.manual.integration.test.js +169 -0
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.manual.integration.test.js.map +1 -1
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.js +251 -0
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-app-server-acp-adapter.test.js.map +1 -1
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.d.ts +38 -0
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.d.ts.map +1 -0
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.js +287 -0
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.js.map +1 -0
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.test.d.ts +2 -0
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.test.d.ts.map +1 -0
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.test.js +648 -0
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-controller.test.js.map +1 -0
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.d.ts +12 -0
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.d.ts.map +1 -0
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.js +51 -0
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.js.map +1 -0
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.test.d.ts +2 -0
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.test.d.ts.map +1 -0
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.test.js +85 -0
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-subagent-mapper.test.js.map +1 -0
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.d.ts +154 -19
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.js +73 -4
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.js.map +1 -1
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.test.js +86 -1
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/codex-zod.test.js.map +1 -1
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.d.ts +7 -0
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.js +85 -16
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.js.map +1 -1
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.test.js +356 -0
- package/dist/src/backend/services/session/service/acp/codex-app-server-adapter/stream-event-handler.test.js.map +1 -1
- package/dist/src/backend/services/session/service/acp/index.d.ts +2 -1
- package/dist/src/backend/services/session/service/acp/index.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/acp/index.js +1 -0
- package/dist/src/backend/services/session/service/acp/index.js.map +1 -1
- package/dist/src/backend/services/session/service/acp/types.d.ts +1 -0
- package/dist/src/backend/services/session/service/acp/types.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/chat/chat-event-forwarder.service.d.ts +3 -0
- package/dist/src/backend/services/session/service/chat/chat-event-forwarder.service.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/chat/chat-event-forwarder.service.js +44 -2
- package/dist/src/backend/services/session/service/chat/chat-event-forwarder.service.js.map +1 -1
- package/dist/src/backend/services/session/service/chat/chat-event-forwarder.service.test.d.ts +2 -0
- package/dist/src/backend/services/session/service/chat/chat-event-forwarder.service.test.d.ts.map +1 -0
- package/dist/src/backend/services/session/service/chat/chat-event-forwarder.service.test.js +108 -0
- package/dist/src/backend/services/session/service/chat/chat-event-forwarder.service.test.js.map +1 -0
- package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/queue-message.handler.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/queue-message.handler.js +4 -0
- package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/queue-message.handler.js.map +1 -1
- package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/queue-message.handler.test.js +24 -0
- package/dist/src/backend/services/session/service/chat/chat-message-handlers/handlers/queue-message.handler.test.js.map +1 -1
- package/dist/src/backend/services/session/service/chat/chat-message-handlers/utils.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/chat/chat-message-handlers/utils.js +1 -0
- package/dist/src/backend/services/session/service/chat/chat-message-handlers/utils.js.map +1 -1
- package/dist/src/backend/services/session/service/chat/chat-message-handlers/utils.test.js +17 -0
- package/dist/src/backend/services/session/service/chat/chat-message-handlers/utils.test.js.map +1 -1
- package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.d.ts +2 -0
- 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 +40 -11
- 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 +131 -2
- package/dist/src/backend/services/session/service/chat/chat-message-handlers.service.test.js.map +1 -1
- package/dist/src/backend/services/session/service/data/session-provider-resolver.service.test.js +6 -0
- package/dist/src/backend/services/session/service/data/session-provider-resolver.service.test.js.map +1 -1
- package/dist/src/backend/services/session/service/index.d.ts +4 -3
- package/dist/src/backend/services/session/service/index.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/index.js +3 -2
- 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 +1 -0
- 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 +36 -26
- 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.subagents.test.d.ts +2 -0
- package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.subagents.test.d.ts.map +1 -0
- package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.subagents.test.js +70 -0
- package/dist/src/backend/services/session/service/lifecycle/acp-event-processor.subagents.test.js.map +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 +8 -4
- 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 +58 -5
- 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.lifecycle.service.d.ts +4 -0
- 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 +154 -53
- 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 +220 -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.service.test.js +45 -7
- 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.map +1 -1
- package/dist/src/backend/services/session/service/session-domain.service.js +1 -0
- package/dist/src/backend/services/session/service/session-domain.service.js.map +1 -1
- package/dist/src/backend/services/session/service/store/session-store.types.d.ts +1 -1
- package/dist/src/backend/services/session/service/store/session-store.types.d.ts.map +1 -1
- package/dist/src/backend/services/session/service/voice/voice-mode-instructions.d.ts +2 -0
- package/dist/src/backend/services/session/service/voice/voice-mode-instructions.d.ts.map +1 -0
- package/dist/src/backend/services/session/service/voice/voice-mode-instructions.js +5 -0
- package/dist/src/backend/services/session/service/voice/voice-mode-instructions.js.map +1 -0
- package/dist/src/backend/services/session/service/voice/voice-narration.service.d.ts +28 -0
- package/dist/src/backend/services/session/service/voice/voice-narration.service.d.ts.map +1 -0
- package/dist/src/backend/services/session/service/voice/voice-narration.service.js +431 -0
- package/dist/src/backend/services/session/service/voice/voice-narration.service.js.map +1 -0
- package/dist/src/backend/services/session/service/voice/voice-narration.service.test.d.ts +2 -0
- package/dist/src/backend/services/session/service/voice/voice-narration.service.test.d.ts.map +1 -0
- package/dist/src/backend/services/session/service/voice/voice-narration.service.test.js +536 -0
- package/dist/src/backend/services/session/service/voice/voice-narration.service.test.js.map +1 -0
- package/dist/src/backend/services/settings/resources/user-settings.accessor.d.ts +6 -0
- package/dist/src/backend/services/settings/resources/user-settings.accessor.d.ts.map +1 -1
- package/dist/src/backend/services/settings/resources/user-settings.accessor.js +46 -17
- package/dist/src/backend/services/settings/resources/user-settings.accessor.js.map +1 -1
- package/dist/src/backend/services/settings/service/user-settings.service.d.ts +6 -0
- package/dist/src/backend/services/settings/service/user-settings.service.d.ts.map +1 -1
- package/dist/src/backend/services/settings/service/user-settings.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/worktree/worktree-lifecycle.service.d.ts.map +1 -1
- package/dist/src/backend/services/workspace/service/worktree/worktree-lifecycle.service.js +9 -12
- 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 +5 -4
- package/dist/src/backend/services/workspace/service/worktree/worktree-lifecycle.service.test.js.map +1 -1
- package/dist/src/backend/trpc/admin.trpc.d.ts +10 -0
- package/dist/src/backend/trpc/admin.trpc.d.ts.map +1 -1
- package/dist/src/backend/trpc/index.d.ts +631 -4
- package/dist/src/backend/trpc/index.d.ts.map +1 -1
- package/dist/src/backend/trpc/index.js +2 -0
- package/dist/src/backend/trpc/index.js.map +1 -1
- package/dist/src/backend/trpc/session.router.test.js +193 -2
- package/dist/src/backend/trpc/session.router.test.js.map +1 -1
- package/dist/src/backend/trpc/session.trpc.d.ts +539 -0
- package/dist/src/backend/trpc/session.trpc.d.ts.map +1 -1
- package/dist/src/backend/trpc/session.trpc.js +53 -0
- package/dist/src/backend/trpc/session.trpc.js.map +1 -1
- package/dist/src/backend/trpc/user-settings.router.test.js +117 -6
- package/dist/src/backend/trpc/user-settings.router.test.js.map +1 -1
- package/dist/src/backend/trpc/user-settings.trpc.d.ts +16 -4
- package/dist/src/backend/trpc/user-settings.trpc.d.ts.map +1 -1
- package/dist/src/backend/trpc/user-settings.trpc.js +25 -2
- package/dist/src/backend/trpc/user-settings.trpc.js.map +1 -1
- package/dist/src/backend/trpc/voice.trpc.d.ts +67 -0
- package/dist/src/backend/trpc/voice.trpc.d.ts.map +1 -0
- package/dist/src/backend/trpc/voice.trpc.js +156 -0
- package/dist/src/backend/trpc/voice.trpc.js.map +1 -0
- package/dist/src/backend/trpc/voice.trpc.test.d.ts +2 -0
- package/dist/src/backend/trpc/voice.trpc.test.d.ts.map +1 -0
- package/dist/src/backend/trpc/voice.trpc.test.js +259 -0
- package/dist/src/backend/trpc/voice.trpc.test.js.map +1 -0
- package/dist/src/shared/acp-protocol/index.d.ts +2 -0
- package/dist/src/shared/acp-protocol/index.d.ts.map +1 -1
- package/dist/src/shared/acp-protocol/index.js +2 -0
- package/dist/src/shared/acp-protocol/index.js.map +1 -1
- package/dist/src/shared/acp-protocol/protocol/queued.d.ts +1 -0
- package/dist/src/shared/acp-protocol/protocol/queued.d.ts.map +1 -1
- package/dist/src/shared/acp-protocol/protocol/websocket.d.ts +7 -0
- package/dist/src/shared/acp-protocol/protocol/websocket.d.ts.map +1 -1
- package/dist/src/shared/acp-protocol/protocol/websocket.js +1 -0
- package/dist/src/shared/acp-protocol/protocol/websocket.js.map +1 -1
- package/dist/src/shared/acp-protocol/session-update-translator.d.ts +39 -0
- package/dist/src/shared/acp-protocol/session-update-translator.d.ts.map +1 -0
- package/dist/src/shared/acp-protocol/session-update-translator.js +356 -0
- package/dist/src/shared/acp-protocol/session-update-translator.js.map +1 -0
- package/dist/src/shared/acp-protocol/subagents.d.ts +1175 -0
- package/dist/src/shared/acp-protocol/subagents.d.ts.map +1 -0
- package/dist/src/shared/acp-protocol/subagents.js +259 -0
- package/dist/src/shared/acp-protocol/subagents.js.map +1 -0
- package/dist/src/shared/core/enums.d.ts +1 -0
- package/dist/src/shared/core/enums.d.ts.map +1 -1
- package/dist/src/shared/core/enums.js +1 -0
- package/dist/src/shared/core/enums.js.map +1 -1
- package/dist/src/shared/deepgram-voices.d.ts +12 -0
- package/dist/src/shared/deepgram-voices.d.ts.map +1 -0
- package/dist/src/shared/deepgram-voices.js +51 -0
- package/dist/src/shared/deepgram-voices.js.map +1 -0
- package/dist/src/shared/schemas/export-data.schema.d.ts +10 -0
- package/dist/src/shared/schemas/export-data.schema.d.ts.map +1 -1
- package/dist/src/shared/schemas/export-data.schema.js +19 -0
- package/dist/src/shared/schemas/export-data.schema.js.map +1 -1
- package/dist/src/shared/voice-vad.d.ts +11 -0
- package/dist/src/shared/voice-vad.d.ts.map +1 -0
- package/dist/src/shared/voice-vad.js +19 -0
- package/dist/src/shared/voice-vad.js.map +1 -0
- package/dist/src/shared/websocket/chat-message.schema.d.ts +1 -0
- package/dist/src/shared/websocket/chat-message.schema.d.ts.map +1 -1
- package/dist/src/shared/websocket/chat-message.schema.js +1 -0
- package/dist/src/shared/websocket/chat-message.schema.js.map +1 -1
- package/dist/src/shared/websocket/voice-message.schema.d.ts +25 -0
- package/dist/src/shared/websocket/voice-message.schema.d.ts.map +1 -0
- package/dist/src/shared/websocket/voice-message.schema.js +14 -0
- package/dist/src/shared/websocket/voice-message.schema.js.map +1 -0
- package/dist/src/shared/workspace-snapshot.d.ts +5 -5
- package/dist/src/test-utils/application-graph.d.ts.map +1 -1
- package/dist/src/test-utils/application-graph.js +7 -1
- package/dist/src/test-utils/application-graph.js.map +1 -1
- package/dist/tsconfig.backend.tsbuildinfo +1 -1
- package/package.json +6 -6
- package/prisma/migrations/20260802152257_add_voice_mode_settings/migration.sql +34 -0
- package/prisma/migrations/20260802200414_add_voice_tts_model_and_speed/migration.sql +36 -0
- package/prisma/migrations/20260807222320_voice_vad_aggressiveness_settings/migration.sql +38 -0
- package/prisma/schema.prisma +9 -0
- package/dist/client/assets/architectureDiagram-ZJ3FMSHR-BZgeaNrI.js +0 -36
- package/dist/client/assets/channel-zAL33ya-.js +0 -1
- package/dist/client/assets/classDiagram-OUVF2IWQ-Dksz7rAA.js +0 -1
- package/dist/client/assets/classDiagram-v2-EOCWNBFH-Dksz7rAA.js +0 -1
- package/dist/client/assets/diagram-WEI45ONY-up5rQ6My.js +0 -41
- package/dist/client/assets/index-BZQlu-dZ.js +0 -694
- package/dist/client/assets/index-CwfNzqG5.css +0 -1
- package/dist/client/assets/stateDiagram-v2-6OUMAXLB-DA02HYvU.js +0 -1
- package/dist/client/assets/swimlanesDiagram-G3AALYLV-CbfcpXpQ.js +0 -8
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { RequestPermissionRequest, SessionNotification } from '@agentclientprotocol/sdk';
|
|
2
|
+
import type { SubagentsChangedParams } from '../../../../../shared/acp-protocol/subagents.js';
|
|
2
3
|
export type AcpSessionUpdateEvent = {
|
|
3
4
|
type: 'acp_session_update';
|
|
4
5
|
update: SessionNotification['update'];
|
|
@@ -8,5 +9,10 @@ export type AcpPermissionRequestEvent = {
|
|
|
8
9
|
requestId: string;
|
|
9
10
|
params: RequestPermissionRequest;
|
|
10
11
|
};
|
|
11
|
-
export type
|
|
12
|
+
export type AcpSubagentsChangedEvent = {
|
|
13
|
+
type: 'acp_subagents_changed';
|
|
14
|
+
subagentId: string;
|
|
15
|
+
change: SubagentsChangedParams['change'];
|
|
16
|
+
};
|
|
17
|
+
export type AcpRuntimeEvent = AcpSessionUpdateEvent | AcpPermissionRequestEvent | AcpSubagentsChangedEvent;
|
|
12
18
|
//# sourceMappingURL=acp-runtime-events.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acp-runtime-events.d.ts","sourceRoot":"","sources":["../../../../../../../src/backend/services/session/service/acp/acp-runtime-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"acp-runtime-events.d.ts","sourceRoot":"","sources":["../../../../../../../src/backend/services/session/service/acp/acp-runtime-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC9F,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAE9E,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,MAAM,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,wBAAwB,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,wBAAwB,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,uBAAuB,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,sBAAsB,CAAC,QAAQ,CAAC,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,eAAe,GACvB,qBAAqB,GACrB,yBAAyB,GACzB,wBAAwB,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type ContentBlock, type SessionConfigOption } from '@agentclientprotocol/sdk';
|
|
2
|
+
import { type SubagentBrowseCapability, type SubagentListParams, type SubagentListResult, type SubagentReadParams, type SubagentReadResult } from '../../../../../shared/acp-protocol/subagents.js';
|
|
2
3
|
import type { AcpPermissionBridge } from './acp-permission-bridge.js';
|
|
3
4
|
import { AcpProcessHandle } from './acp-process-handle.js';
|
|
4
5
|
import type { AcpRuntimeEvent } from './acp-runtime-events.js';
|
|
@@ -7,6 +8,9 @@ export declare class PromptTimeoutError extends Error {
|
|
|
7
8
|
readonly timeoutMs: number;
|
|
8
9
|
constructor(sessionId: string, timeoutMs: number);
|
|
9
10
|
}
|
|
11
|
+
export declare class AcpBrowseSessionUnavailableError extends Error {
|
|
12
|
+
constructor(message: string, options?: ErrorOptions);
|
|
13
|
+
}
|
|
10
14
|
export type AcpRuntimeCreatedCallback = (sessionId: string, client: AcpProcessHandle, context: {
|
|
11
15
|
workspaceId: string;
|
|
12
16
|
workingDir: string;
|
|
@@ -21,8 +25,10 @@ export type AcpRuntimeEventHandlers = {
|
|
|
21
25
|
};
|
|
22
26
|
export declare class AcpRuntimeManager {
|
|
23
27
|
private readonly sessions;
|
|
28
|
+
private readonly browseOnlySessions;
|
|
24
29
|
private readonly pendingCreation;
|
|
25
30
|
private readonly stoppingInProgress;
|
|
31
|
+
private readonly stopOperations;
|
|
26
32
|
private readonly managedStopChildren;
|
|
27
33
|
private readonly creationLocks;
|
|
28
34
|
private readonly lockRefCounts;
|
|
@@ -44,11 +50,20 @@ export declare class AcpRuntimeManager {
|
|
|
44
50
|
setOnClientCreated(callback: AcpRuntimeCreatedCallback): void;
|
|
45
51
|
isStopInProgress(sessionId: string): boolean;
|
|
46
52
|
getClient(sessionId: string): AcpProcessHandle | undefined;
|
|
53
|
+
getBrowseClient(sessionId: string): AcpProcessHandle | undefined;
|
|
54
|
+
isBrowseOnlySession(sessionId: string): boolean;
|
|
47
55
|
getPendingClient(sessionId: string): Promise<AcpProcessHandle> | undefined;
|
|
56
|
+
getSubagentBrowseCapability(sessionId: string): SubagentBrowseCapability | null;
|
|
57
|
+
listSubagents(sessionId: string, input: Omit<SubagentListParams, 'sessionId'>): Promise<SubagentListResult>;
|
|
58
|
+
readSubagentTranscript(sessionId: string, input: Omit<SubagentReadParams, 'sessionId'>): Promise<SubagentReadResult>;
|
|
59
|
+
private requireSubagentBrowseHandle;
|
|
48
60
|
getOrCreateClient(sessionId: string, options: AcpClientOptions, handlers: AcpRuntimeEventHandlers, context: {
|
|
49
61
|
workspaceId: string;
|
|
50
62
|
workingDir: string;
|
|
51
63
|
}): Promise<AcpProcessHandle>;
|
|
64
|
+
private promoteForActiveUse;
|
|
65
|
+
private recordClientPurpose;
|
|
66
|
+
private clearBrowseOnlyPurposeIfUnused;
|
|
52
67
|
private createClient;
|
|
53
68
|
private cleanupFailedClientCreation;
|
|
54
69
|
private abortClientCreationIfStopping;
|
|
@@ -63,14 +78,17 @@ export declare class AcpRuntimeManager {
|
|
|
63
78
|
private notifyClientCreated;
|
|
64
79
|
private wireChildErrorHandler;
|
|
65
80
|
private createOrResumeSession;
|
|
81
|
+
private tryLoadStoredSession;
|
|
82
|
+
private logLoadSessionFailure;
|
|
66
83
|
stopClient(sessionId: string): Promise<void>;
|
|
84
|
+
private stopClientOnce;
|
|
67
85
|
sendPrompt(sessionId: string, prompt: ContentBlock[], timeoutMs?: number): Promise<{
|
|
68
86
|
stopReason: string;
|
|
69
87
|
}>;
|
|
70
88
|
private escalatePromptTimeout;
|
|
71
89
|
private isCurrentPromptTimeoutHandle;
|
|
72
90
|
private clearPromptInFlight;
|
|
73
|
-
cancelPrompt(sessionId: string): Promise<
|
|
91
|
+
cancelPrompt(sessionId: string): Promise<boolean>;
|
|
74
92
|
setConfigOption(sessionId: string, configId: string, value: string): Promise<SessionConfigOption[]>;
|
|
75
93
|
setSessionMode(sessionId: string, modeId: string): Promise<SessionConfigOption[]>;
|
|
76
94
|
setSessionModel(sessionId: string, modelId: string): Promise<SessionConfigOption[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acp-runtime-manager.d.ts","sourceRoot":"","sources":["../../../../../../../src/backend/services/session/service/acp/acp-runtime-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,YAAY,EAIjB,KAAK,mBAAmB,EACzB,MAAM,0BAA0B,CAAC;AAIlC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAW5D,OAAO,KAAK,EAAE,gBAAgB,EAAoB,MAAM,SAAS,CAAC;AAKlE,qBAAa,kBAAmB,SAAQ,KAAK;aAGzB,SAAS,EAAE,MAAM;gBADjC,SAAS,EAAE,MAAM,EACD,SAAS,EAAE,MAAM;CAKpC;AAED,MAAM,MAAM,yBAAyB,GAAG,CACtC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,KACjD,IAAI,CAAC;AAEV,MAAM,MAAM,uBAAuB,GAAG;IACpC,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACpE,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IACjE,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAEzE,gBAAgB,CAAC,EAAE,mBAAmB,CAAC;CACxC,CAAC;
|
|
1
|
+
{"version":3,"file":"acp-runtime-manager.d.ts","sourceRoot":"","sources":["../../../../../../../src/backend/services/session/service/acp/acp-runtime-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,9 @@ import { spawn } from 'node:child_process';
|
|
|
2
2
|
import { Readable, Writable } from 'node:stream';
|
|
3
3
|
import { ClientSideConnection, ndJsonStream, PROTOCOL_VERSION, } from '@agentclientprotocol/sdk';
|
|
4
4
|
import pLimit from 'p-limit';
|
|
5
|
+
import { z } from 'zod';
|
|
5
6
|
import { createLogger, getCurrentProcessEnv } from '../../../../../backend/services/logger.service.js';
|
|
7
|
+
import { SUBAGENTS_LIST_METHOD, SUBAGENTS_READ_METHOD, subagentListParamsSchema, subagentListResultSchema, subagentReadParamsSchema, subagentReadResultSchema, } from '../../../../../shared/acp-protocol/subagents.js';
|
|
6
8
|
import { AcpClientHandler } from './acp-client-handler.js';
|
|
7
9
|
import { AcpProcessHandle } from './acp-process-handle.js';
|
|
8
10
|
import { createAcpSpawnError, hasUsableWorkingDir, resolveAcpBinary, resolveInternalCodexAcpSpawnCommand, withTimeout, } from './acp-runtime-spawn.js';
|
|
@@ -17,6 +19,20 @@ export class PromptTimeoutError extends Error {
|
|
|
17
19
|
this.name = 'PromptTimeoutError';
|
|
18
20
|
}
|
|
19
21
|
}
|
|
22
|
+
export class AcpBrowseSessionUnavailableError extends Error {
|
|
23
|
+
constructor(message, options) {
|
|
24
|
+
super(message, options);
|
|
25
|
+
this.name = 'AcpBrowseSessionUnavailableError';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
class AcpSubagentBrowseError extends Error {
|
|
29
|
+
code;
|
|
30
|
+
constructor(code, message, options) {
|
|
31
|
+
super(message, options);
|
|
32
|
+
this.code = code;
|
|
33
|
+
this.name = 'AcpSubagentBrowseError';
|
|
34
|
+
}
|
|
35
|
+
}
|
|
20
36
|
function resolveAutoApprovePolicy(preset) {
|
|
21
37
|
if (preset === 'YOLO' || preset === 'RELAXED') {
|
|
22
38
|
return 'all';
|
|
@@ -24,9 +40,20 @@ function resolveAutoApprovePolicy(preset) {
|
|
|
24
40
|
return 'none';
|
|
25
41
|
}
|
|
26
42
|
const DEFAULT_ACP_STARTUP_TIMEOUT_MS = 30_000;
|
|
43
|
+
function getAcpErrorMetadata(error) {
|
|
44
|
+
const code = typeof error.code === 'number' || typeof error.code === 'string' ? error.code : undefined;
|
|
45
|
+
return {
|
|
46
|
+
...(code !== undefined ? { code } : {}),
|
|
47
|
+
...(typeof error.data !== 'undefined' ? { data: error.data } : {}),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
27
50
|
function getAcpErrorLogDetails(error) {
|
|
28
51
|
if (error instanceof Error) {
|
|
29
|
-
|
|
52
|
+
const maybe = error;
|
|
53
|
+
return {
|
|
54
|
+
message: error.message,
|
|
55
|
+
...getAcpErrorMetadata(maybe),
|
|
56
|
+
};
|
|
30
57
|
}
|
|
31
58
|
if (typeof error === 'object' && error !== null) {
|
|
32
59
|
const maybe = error;
|
|
@@ -40,11 +67,9 @@ function getAcpErrorLogDetails(error) {
|
|
|
40
67
|
return String(error);
|
|
41
68
|
}
|
|
42
69
|
})();
|
|
43
|
-
const code = typeof maybe.code === 'number' || typeof maybe.code === 'string' ? maybe.code : undefined;
|
|
44
70
|
return {
|
|
45
71
|
message,
|
|
46
|
-
...(
|
|
47
|
-
...(typeof maybe.data !== 'undefined' ? { data: maybe.data } : {}),
|
|
72
|
+
...getAcpErrorMetadata(maybe),
|
|
48
73
|
};
|
|
49
74
|
}
|
|
50
75
|
return { message: String(error) };
|
|
@@ -53,6 +78,48 @@ function isMethodNotFoundError(error) {
|
|
|
53
78
|
const details = getAcpErrorLogDetails(error);
|
|
54
79
|
return details.code === -32_601 || details.message.includes('Method not found');
|
|
55
80
|
}
|
|
81
|
+
function subagentBrowseMessage(operation, kind) {
|
|
82
|
+
const subject = operation === 'list' ? 'Sub-agent list' : 'Sub-agent transcript';
|
|
83
|
+
if (kind === 'invalid') {
|
|
84
|
+
return `Invalid ${subject.toLowerCase()} request.`;
|
|
85
|
+
}
|
|
86
|
+
if (kind === 'not_found') {
|
|
87
|
+
return `${subject} not found for this session.`;
|
|
88
|
+
}
|
|
89
|
+
if (kind === 'protocol') {
|
|
90
|
+
return `${subject} is unavailable because the provider returned an invalid response.`;
|
|
91
|
+
}
|
|
92
|
+
return `${subject} request failed.`;
|
|
93
|
+
}
|
|
94
|
+
function normalizeSubagentBrowseError(error, operation) {
|
|
95
|
+
if (error instanceof AcpSubagentBrowseError) {
|
|
96
|
+
return error;
|
|
97
|
+
}
|
|
98
|
+
if (error instanceof z.ZodError) {
|
|
99
|
+
return new AcpSubagentBrowseError('PRECONDITION_FAILED', subagentBrowseMessage(operation, 'protocol'), { cause: error });
|
|
100
|
+
}
|
|
101
|
+
const details = getAcpErrorLogDetails(error);
|
|
102
|
+
if (details.code === -32_602) {
|
|
103
|
+
return new AcpSubagentBrowseError('INVALID_INPUT', subagentBrowseMessage(operation, 'invalid'), { cause: error });
|
|
104
|
+
}
|
|
105
|
+
if (details.code === -32_002) {
|
|
106
|
+
return new AcpSubagentBrowseError('NOT_FOUND', subagentBrowseMessage(operation, 'not_found'), {
|
|
107
|
+
cause: error,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
if (details.code === -32_601) {
|
|
111
|
+
return new AcpSubagentBrowseError('PRECONDITION_FAILED', 'Sub-agent browsing is unavailable for this session.', { cause: error });
|
|
112
|
+
}
|
|
113
|
+
if (details.code === -32_000) {
|
|
114
|
+
return new AcpSubagentBrowseError('PRECONDITION_FAILED', 'Provider authentication is required for sub-agent browsing.', { cause: error });
|
|
115
|
+
}
|
|
116
|
+
if (details.code === -32_603 || details.code === -32_600 || details.code === -32_700) {
|
|
117
|
+
return new AcpSubagentBrowseError('PRECONDITION_FAILED', subagentBrowseMessage(operation, 'protocol'), { cause: error });
|
|
118
|
+
}
|
|
119
|
+
return new AcpSubagentBrowseError('INTERNAL_ERROR', subagentBrowseMessage(operation, 'failed'), {
|
|
120
|
+
cause: error,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
56
123
|
async function raceWithSoftTimeout(promise, timeoutMs) {
|
|
57
124
|
let timeout;
|
|
58
125
|
const timeoutPromise = new Promise((resolve) => {
|
|
@@ -70,8 +137,10 @@ async function raceWithSoftTimeout(promise, timeoutMs) {
|
|
|
70
137
|
}
|
|
71
138
|
export class AcpRuntimeManager {
|
|
72
139
|
sessions = new Map();
|
|
140
|
+
browseOnlySessions = new Set();
|
|
73
141
|
pendingCreation = new Map();
|
|
74
142
|
stoppingInProgress = new Set();
|
|
143
|
+
stopOperations = new Map();
|
|
75
144
|
managedStopChildren = new WeakSet();
|
|
76
145
|
creationLocks = new Map();
|
|
77
146
|
lockRefCounts = new Map();
|
|
@@ -103,12 +172,70 @@ export class AcpRuntimeManager {
|
|
|
103
172
|
return this.stoppingInProgress.has(sessionId);
|
|
104
173
|
}
|
|
105
174
|
getClient(sessionId) {
|
|
175
|
+
if (this.browseOnlySessions.has(sessionId)) {
|
|
176
|
+
return undefined;
|
|
177
|
+
}
|
|
178
|
+
return this.getBrowseClient(sessionId);
|
|
179
|
+
}
|
|
180
|
+
getBrowseClient(sessionId) {
|
|
106
181
|
const handle = this.sessions.get(sessionId);
|
|
107
182
|
return handle?.isRunning() ? handle : undefined;
|
|
108
183
|
}
|
|
184
|
+
isBrowseOnlySession(sessionId) {
|
|
185
|
+
return this.browseOnlySessions.has(sessionId);
|
|
186
|
+
}
|
|
109
187
|
getPendingClient(sessionId) {
|
|
110
188
|
return this.pendingCreation.get(sessionId);
|
|
111
189
|
}
|
|
190
|
+
getSubagentBrowseCapability(sessionId) {
|
|
191
|
+
return this.getBrowseClient(sessionId)?.getSubagentBrowseCapability() ?? null;
|
|
192
|
+
}
|
|
193
|
+
async listSubagents(sessionId, input) {
|
|
194
|
+
const handle = this.requireSubagentBrowseHandle(sessionId);
|
|
195
|
+
const parsedParams = subagentListParamsSchema.safeParse({
|
|
196
|
+
...input,
|
|
197
|
+
sessionId: handle.providerSessionId,
|
|
198
|
+
});
|
|
199
|
+
if (!parsedParams.success) {
|
|
200
|
+
throw new AcpSubagentBrowseError('INVALID_INPUT', subagentBrowseMessage('list', 'invalid'), {
|
|
201
|
+
cause: parsedParams.error,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
try {
|
|
205
|
+
const response = await handle.connection.extMethod(SUBAGENTS_LIST_METHOD, parsedParams.data);
|
|
206
|
+
return subagentListResultSchema.parse(response);
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
throw normalizeSubagentBrowseError(error, 'list');
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
async readSubagentTranscript(sessionId, input) {
|
|
213
|
+
const handle = this.requireSubagentBrowseHandle(sessionId);
|
|
214
|
+
const parsedParams = subagentReadParamsSchema.safeParse({
|
|
215
|
+
...input,
|
|
216
|
+
sessionId: handle.providerSessionId,
|
|
217
|
+
});
|
|
218
|
+
if (!parsedParams.success) {
|
|
219
|
+
throw new AcpSubagentBrowseError('INVALID_INPUT', subagentBrowseMessage('transcript', 'invalid'), { cause: parsedParams.error });
|
|
220
|
+
}
|
|
221
|
+
try {
|
|
222
|
+
const response = await handle.connection.extMethod(SUBAGENTS_READ_METHOD, parsedParams.data);
|
|
223
|
+
return subagentReadResultSchema.parse(response);
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
throw normalizeSubagentBrowseError(error, 'transcript');
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
requireSubagentBrowseHandle(sessionId) {
|
|
230
|
+
const handle = this.getBrowseClient(sessionId);
|
|
231
|
+
if (!handle) {
|
|
232
|
+
throw new AcpSubagentBrowseError('PRECONDITION_FAILED', 'Sub-agent browsing requires a running parent session.');
|
|
233
|
+
}
|
|
234
|
+
if (!handle.getSubagentBrowseCapability()) {
|
|
235
|
+
throw new AcpSubagentBrowseError('PRECONDITION_FAILED', 'Sub-agent browsing is unavailable for this session.');
|
|
236
|
+
}
|
|
237
|
+
return handle;
|
|
238
|
+
}
|
|
112
239
|
getOrCreateClient(sessionId, options, handlers, context) {
|
|
113
240
|
if (this.isShuttingDown) {
|
|
114
241
|
return Promise.reject(this.createShutdownError(sessionId));
|
|
@@ -126,17 +253,21 @@ export class AcpRuntimeManager {
|
|
|
126
253
|
if (this.isShuttingDown) {
|
|
127
254
|
throw this.createShutdownError(sessionId);
|
|
128
255
|
}
|
|
129
|
-
const existing = this.
|
|
256
|
+
const existing = this.getBrowseClient(sessionId);
|
|
130
257
|
if (existing?.isRunning()) {
|
|
258
|
+
this.promoteForActiveUse(sessionId, options);
|
|
131
259
|
logger.debug('Returning existing running ACP client', { sessionId });
|
|
132
260
|
return existing;
|
|
133
261
|
}
|
|
134
262
|
const pending = this.pendingCreation.get(sessionId);
|
|
135
263
|
if (pending) {
|
|
136
264
|
logger.debug('Waiting for pending ACP client creation', { sessionId });
|
|
137
|
-
|
|
265
|
+
const handle = await pending;
|
|
266
|
+
this.promoteForActiveUse(sessionId, options);
|
|
267
|
+
return handle;
|
|
138
268
|
}
|
|
139
269
|
logger.info('Creating new ACP client', { sessionId, provider: options.provider });
|
|
270
|
+
this.recordClientPurpose(sessionId, options);
|
|
140
271
|
const createPromise = this.createClient(sessionId, options, handlers, context);
|
|
141
272
|
this.pendingCreation.set(sessionId, createPromise);
|
|
142
273
|
try {
|
|
@@ -144,6 +275,7 @@ export class AcpRuntimeManager {
|
|
|
144
275
|
}
|
|
145
276
|
finally {
|
|
146
277
|
this.pendingCreation.delete(sessionId);
|
|
278
|
+
this.clearBrowseOnlyPurposeIfUnused(sessionId);
|
|
147
279
|
}
|
|
148
280
|
}
|
|
149
281
|
finally {
|
|
@@ -159,6 +291,23 @@ export class AcpRuntimeManager {
|
|
|
159
291
|
}
|
|
160
292
|
});
|
|
161
293
|
}
|
|
294
|
+
promoteForActiveUse(sessionId, options) {
|
|
295
|
+
if (options.purpose !== 'browse') {
|
|
296
|
+
this.browseOnlySessions.delete(sessionId);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
recordClientPurpose(sessionId, options) {
|
|
300
|
+
if (options.purpose === 'browse') {
|
|
301
|
+
this.browseOnlySessions.add(sessionId);
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
this.browseOnlySessions.delete(sessionId);
|
|
305
|
+
}
|
|
306
|
+
clearBrowseOnlyPurposeIfUnused(sessionId) {
|
|
307
|
+
if (!(this.sessions.has(sessionId) || this.pendingCreation.has(sessionId))) {
|
|
308
|
+
this.browseOnlySessions.delete(sessionId);
|
|
309
|
+
}
|
|
310
|
+
}
|
|
162
311
|
async createClient(sessionId, options, handlers, context) {
|
|
163
312
|
if (this.isShuttingDown) {
|
|
164
313
|
throw this.createShutdownError(sessionId);
|
|
@@ -309,6 +458,7 @@ export class AcpRuntimeManager {
|
|
|
309
458
|
});
|
|
310
459
|
handle.configOptions = sessionInfo.configOptions;
|
|
311
460
|
this.sessions.set(sessionId, handle);
|
|
461
|
+
this.recordClientPurpose(sessionId, options);
|
|
312
462
|
this.wireChildExitHandler(sessionId, child, handlers);
|
|
313
463
|
await this.notifyClientCreated(sessionId, handle, context, handlers);
|
|
314
464
|
return handle;
|
|
@@ -433,19 +583,23 @@ export class AcpRuntimeManager {
|
|
|
433
583
|
wireChildExitHandler(sessionId, child, handlers) {
|
|
434
584
|
child.on('exit', async (code) => {
|
|
435
585
|
if (this.shouldSkipChildExitHandler(sessionId, child, code)) {
|
|
586
|
+
this.clearBrowseOnlyPurposeIfUnused(sessionId);
|
|
436
587
|
return;
|
|
437
588
|
}
|
|
438
589
|
this.pendingCreation.delete(sessionId);
|
|
439
|
-
|
|
440
|
-
|
|
590
|
+
try {
|
|
591
|
+
if (handlers.onExit) {
|
|
441
592
|
await handlers.onExit(sessionId, code);
|
|
442
593
|
}
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
}
|
|
594
|
+
}
|
|
595
|
+
catch (error) {
|
|
596
|
+
logger.warn('Failed to handle ACP exit event', {
|
|
597
|
+
sessionId,
|
|
598
|
+
error: error instanceof Error ? error.message : String(error),
|
|
599
|
+
});
|
|
600
|
+
}
|
|
601
|
+
finally {
|
|
602
|
+
this.clearBrowseOnlyPurposeIfUnused(sessionId);
|
|
449
603
|
}
|
|
450
604
|
});
|
|
451
605
|
}
|
|
@@ -513,42 +667,21 @@ export class AcpRuntimeManager {
|
|
|
513
667
|
}
|
|
514
668
|
async createOrResumeSession(connection, sessionId, options, agentCapabilities) {
|
|
515
669
|
const storedId = options.resumeProviderSessionId;
|
|
516
|
-
const
|
|
670
|
+
const browseOnly = options.purpose === 'browse';
|
|
517
671
|
const mcpServers = (options.mcpServers ?? []).map((s) => ({
|
|
518
672
|
name: s.name,
|
|
519
673
|
command: s.command,
|
|
520
674
|
args: s.args,
|
|
521
675
|
env: Object.entries(s.env).map(([name, value]) => ({ name, value })),
|
|
522
676
|
}));
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
}
|
|
532
|
-
catch (error) {
|
|
533
|
-
const details = getAcpErrorLogDetails(error);
|
|
534
|
-
logger.warn('loadSession failed, falling back to newSession', {
|
|
535
|
-
sessionId,
|
|
536
|
-
storedProviderSessionId: storedId,
|
|
537
|
-
error: details.message,
|
|
538
|
-
...(details.code !== undefined ? { errorCode: details.code } : {}),
|
|
539
|
-
...(typeof details.data !== 'undefined' ? { errorData: details.data } : {}),
|
|
540
|
-
});
|
|
541
|
-
}
|
|
542
|
-
if (loadResult !== null) {
|
|
543
|
-
logger.info('ACP session resumed via loadSession', {
|
|
544
|
-
sessionId,
|
|
545
|
-
providerSessionId: storedId,
|
|
546
|
-
});
|
|
547
|
-
return {
|
|
548
|
-
providerSessionId: storedId,
|
|
549
|
-
configOptions: requireSessionConfigOptions(options.provider, 'loadSession', loadResult),
|
|
550
|
-
};
|
|
551
|
-
}
|
|
677
|
+
const resumed = await this.tryLoadStoredSession(connection, sessionId, options, agentCapabilities, mcpServers);
|
|
678
|
+
if (resumed) {
|
|
679
|
+
return resumed;
|
|
680
|
+
}
|
|
681
|
+
if (browseOnly) {
|
|
682
|
+
throw new AcpBrowseSessionUnavailableError(storedId
|
|
683
|
+
? 'Provider does not support restoring this session for sub-agent browsing.'
|
|
684
|
+
: 'Stored provider session is required for sub-agent browsing.');
|
|
552
685
|
}
|
|
553
686
|
const sessionResult = await connection.newSession({
|
|
554
687
|
cwd: options.workingDir,
|
|
@@ -563,11 +696,62 @@ export class AcpRuntimeManager {
|
|
|
563
696
|
configOptions: requireSessionConfigOptions(options.provider, 'newSession', sessionResult),
|
|
564
697
|
};
|
|
565
698
|
}
|
|
566
|
-
async
|
|
567
|
-
|
|
699
|
+
async tryLoadStoredSession(connection, sessionId, options, agentCapabilities, mcpServers) {
|
|
700
|
+
const storedId = options.resumeProviderSessionId;
|
|
701
|
+
if (!(agentCapabilities.loadSession === true && storedId)) {
|
|
702
|
+
return null;
|
|
703
|
+
}
|
|
704
|
+
let loadResult;
|
|
705
|
+
try {
|
|
706
|
+
loadResult = await connection.loadSession({
|
|
707
|
+
sessionId: storedId,
|
|
708
|
+
cwd: options.workingDir,
|
|
709
|
+
mcpServers,
|
|
710
|
+
});
|
|
711
|
+
}
|
|
712
|
+
catch (error) {
|
|
713
|
+
this.logLoadSessionFailure(sessionId, storedId, error, options.purpose === 'browse');
|
|
714
|
+
if (options.purpose === 'browse') {
|
|
715
|
+
throw new AcpBrowseSessionUnavailableError('Provider failed to restore this session for sub-agent browsing.', { cause: error });
|
|
716
|
+
}
|
|
717
|
+
return null;
|
|
718
|
+
}
|
|
719
|
+
logger.info('ACP session resumed via loadSession', {
|
|
720
|
+
sessionId,
|
|
721
|
+
providerSessionId: storedId,
|
|
722
|
+
});
|
|
723
|
+
return {
|
|
724
|
+
providerSessionId: storedId,
|
|
725
|
+
configOptions: requireSessionConfigOptions(options.provider, 'loadSession', loadResult),
|
|
726
|
+
};
|
|
727
|
+
}
|
|
728
|
+
logLoadSessionFailure(sessionId, storedProviderSessionId, error, browseOnly) {
|
|
729
|
+
const details = getAcpErrorLogDetails(error);
|
|
730
|
+
logger.warn(browseOnly ? 'Browse-only loadSession failed' : 'loadSession failed', {
|
|
731
|
+
sessionId,
|
|
732
|
+
storedProviderSessionId,
|
|
733
|
+
error: details.message,
|
|
734
|
+
...(details.code !== undefined ? { errorCode: details.code } : {}),
|
|
735
|
+
...(typeof details.data !== 'undefined' ? { errorData: details.data } : {}),
|
|
736
|
+
...(!browseOnly ? { fallback: 'newSession' } : {}),
|
|
737
|
+
});
|
|
738
|
+
}
|
|
739
|
+
stopClient(sessionId) {
|
|
740
|
+
const existingStop = this.stopOperations.get(sessionId);
|
|
741
|
+
if (existingStop) {
|
|
568
742
|
logger.debug('ACP session stop already in progress', { sessionId });
|
|
569
|
-
return;
|
|
743
|
+
return existingStop;
|
|
570
744
|
}
|
|
745
|
+
let trackedStop;
|
|
746
|
+
trackedStop = this.stopClientOnce(sessionId).finally(() => {
|
|
747
|
+
if (this.stopOperations.get(sessionId) === trackedStop) {
|
|
748
|
+
this.stopOperations.delete(sessionId);
|
|
749
|
+
}
|
|
750
|
+
});
|
|
751
|
+
this.stopOperations.set(sessionId, trackedStop);
|
|
752
|
+
return trackedStop;
|
|
753
|
+
}
|
|
754
|
+
async stopClientOnce(sessionId) {
|
|
571
755
|
const pendingCreation = this.pendingCreation.get(sessionId);
|
|
572
756
|
const initialHandle = this.sessions.get(sessionId);
|
|
573
757
|
if (!(initialHandle || pendingCreation)) {
|
|
@@ -619,6 +803,7 @@ export class AcpRuntimeManager {
|
|
|
619
803
|
const current = this.sessions.get(sessionId);
|
|
620
804
|
if (current === stoppedHandle) {
|
|
621
805
|
this.sessions.delete(sessionId);
|
|
806
|
+
this.browseOnlySessions.delete(sessionId);
|
|
622
807
|
}
|
|
623
808
|
}
|
|
624
809
|
}
|
|
@@ -709,13 +894,15 @@ export class AcpRuntimeManager {
|
|
|
709
894
|
async cancelPrompt(sessionId) {
|
|
710
895
|
const handle = this.sessions.get(sessionId);
|
|
711
896
|
if (!handle) {
|
|
712
|
-
return;
|
|
897
|
+
return false;
|
|
713
898
|
}
|
|
714
|
-
if (handle.isPromptInFlight) {
|
|
715
|
-
|
|
716
|
-
sessionId: handle.providerSessionId,
|
|
717
|
-
});
|
|
899
|
+
if (!handle.isPromptInFlight) {
|
|
900
|
+
return false;
|
|
718
901
|
}
|
|
902
|
+
await handle.connection.cancel({
|
|
903
|
+
sessionId: handle.providerSessionId,
|
|
904
|
+
});
|
|
905
|
+
return true;
|
|
719
906
|
}
|
|
720
907
|
async setConfigOption(sessionId, configId, value) {
|
|
721
908
|
const handle = this.sessions.get(sessionId);
|
|
@@ -832,8 +1019,7 @@ export class AcpRuntimeManager {
|
|
|
832
1019
|
return this.sessions.entries();
|
|
833
1020
|
}
|
|
834
1021
|
isSessionRunning(sessionId) {
|
|
835
|
-
|
|
836
|
-
return handle?.isRunning() ?? false;
|
|
1022
|
+
return this.getClient(sessionId) !== undefined;
|
|
837
1023
|
}
|
|
838
1024
|
isSessionWorking(sessionId) {
|
|
839
1025
|
const handle = this.sessions.get(sessionId);
|