@yalehwang/cloudpit 2.0.0 → 3.0.0
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/README.md +1 -1
- package/dist/api-docs.html +3 -3
- package/dist/assets/{abnfDiagram-N423BO3Z-D5yLnMt9.js → abnfDiagram-N423BO3Z-D7Xt05gV.js} +1 -1
- package/dist/assets/{abnfDiagram-N423BO3Z-bTHtQIhR.js → abnfDiagram-N423BO3Z-dmPRRPEm.js} +1 -1
- package/dist/assets/{arc-1DmrBEyG.js → arc-B7W3R5qH.js} +1 -1
- package/dist/assets/{arc-BlGK--01.js → arc-BHMlIcaQ.js} +1 -1
- package/dist/assets/{architectureDiagram-T3A2C74G--lzbKBn9.js → architectureDiagram-T3A2C74G-CUUpAoN0.js} +1 -1
- package/dist/assets/{architectureDiagram-T3A2C74G-7lKNAbUU.js → architectureDiagram-T3A2C74G-DpXhbHxu.js} +1 -1
- package/dist/assets/{blockDiagram-VBNYF7ZC-17cdO9zs.js → blockDiagram-VBNYF7ZC-Bf0yfNxj.js} +1 -1
- package/dist/assets/{blockDiagram-VBNYF7ZC-BPavJfDj.js → blockDiagram-VBNYF7ZC-Cki9AOhc.js} +1 -1
- package/dist/assets/{c4Diagram-5PPSVZJV-Bm1-2w3b.js → c4Diagram-5PPSVZJV-DK2RqNDO.js} +1 -1
- package/dist/assets/{c4Diagram-5PPSVZJV-aHvFL3Wb.js → c4Diagram-5PPSVZJV-DyhTF0e5.js} +1 -1
- package/dist/assets/channel-DTLMNzbH.js +1 -0
- package/dist/assets/channel-DiqxUuPf.js +1 -0
- package/dist/assets/{chunk-2GRJ4B5K-D7WqZewM.js → chunk-2GRJ4B5K-BYtByJbf.js} +1 -1
- package/dist/assets/{chunk-2GRJ4B5K-DbwzBiPF.js → chunk-2GRJ4B5K-CksFgocc.js} +1 -1
- package/dist/assets/{chunk-2Q5K7J3B-DdCr89uy.js → chunk-2Q5K7J3B-D2kQa5TZ.js} +1 -1
- package/dist/assets/{chunk-2Q5K7J3B-TFd0ECKO.js → chunk-2Q5K7J3B-NSSX86FA.js} +1 -1
- package/dist/assets/{chunk-5RXB4S5H-BdhRBpEi.js → chunk-5RXB4S5H-DNNYC8_t.js} +1 -1
- package/dist/assets/{chunk-5RXB4S5H-D0SQ3nIe.js → chunk-5RXB4S5H-Rx0YaqNI.js} +1 -1
- package/dist/assets/{chunk-5VM5RSS4-B9Lv3cWR.js → chunk-5VM5RSS4-B1k4I4CX.js} +1 -1
- package/dist/assets/{chunk-5VM5RSS4-DioqTIvB.js → chunk-5VM5RSS4-CsvQj3QC.js} +1 -1
- package/dist/assets/{chunk-6Q2QTUOP-09bwlcIv.js → chunk-6Q2QTUOP-48-dEgAs.js} +1 -1
- package/dist/assets/{chunk-6Q2QTUOP-JuhPJZZL.js → chunk-6Q2QTUOP-DCMSW5_0.js} +1 -1
- package/dist/assets/{chunk-GF5L2VYU-C6f2SgCw.js → chunk-GF5L2VYU-CGyvOsdN.js} +1 -1
- package/dist/assets/{chunk-GF5L2VYU-DzD9aOyp.js → chunk-GF5L2VYU-YXe113hp.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-BggnWNZv.js → chunk-JWPE2WC7-BT7vCW4x.js} +1 -1
- package/dist/assets/{chunk-JWPE2WC7-Dte_Ax9K.js → chunk-JWPE2WC7-D2K1Oywq.js} +1 -1
- package/dist/assets/{chunk-KBJHAD2P-9TCQV92m.js → chunk-KBJHAD2P-CQZWamtE.js} +1 -1
- package/dist/assets/{chunk-KBJHAD2P-DDnJp7kJ.js → chunk-KBJHAD2P-gpEwZrNy.js} +1 -1
- package/dist/assets/{chunk-RYQCIY6F-CE2Y4D_h.js → chunk-RYQCIY6F-BI0fMtjY.js} +1 -1
- package/dist/assets/{chunk-RYQCIY6F-DsgFSTNw.js → chunk-RYQCIY6F-vguRdb4F.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-B1FIfsqq.js → chunk-XXDRQBXY-B99qH1_w.js} +1 -1
- package/dist/assets/{chunk-XXDRQBXY-B4YfaqTO.js → chunk-XXDRQBXY-DZLJnbBB.js} +1 -1
- package/dist/assets/classDiagram-JCYQIIEL-BaV-s6x8.js +1 -0
- package/dist/assets/classDiagram-JCYQIIEL-D4M03B4L.js +1 -0
- package/dist/assets/classDiagram-v2-OCEON4UE-BaV-s6x8.js +1 -0
- package/dist/assets/classDiagram-v2-OCEON4UE-D4M03B4L.js +1 -0
- package/dist/assets/{cose-bilkent-JH36ORCC-C1AG5Pib.js → cose-bilkent-JH36ORCC-EsVnz-E6.js} +1 -1
- package/dist/assets/{cose-bilkent-JH36ORCC-lMwWDibI.js → cose-bilkent-JH36ORCC-VI2OjCIx.js} +1 -1
- package/dist/assets/{cynefin-VYW2F7L2-BlabniRL.js → cynefin-VYW2F7L2-BVYg0ixs.js} +1 -1
- package/dist/assets/{cynefin-VYW2F7L2-W-c-z4IW.js → cynefin-VYW2F7L2-BnHmA5I2.js} +1 -1
- package/dist/assets/{cynefinDiagram-MW4NZA55-BtTep_pq.js → cynefinDiagram-MW4NZA55-B-OCRLIw.js} +1 -1
- package/dist/assets/{cynefinDiagram-MW4NZA55-Due6EIPh.js → cynefinDiagram-MW4NZA55-ItLlzjDR.js} +1 -1
- package/dist/assets/{dagre-VZM6K2ZE-CWLaFfdt.js → dagre-VZM6K2ZE-DkVDkAWJ.js} +1 -1
- package/dist/assets/{dagre-VZM6K2ZE-DZldvqiQ.js → dagre-VZM6K2ZE-bYR4z8-Z.js} +1 -1
- package/dist/assets/{diagram-7IWD3JNH-RnmUHYwN.js → diagram-7IWD3JNH-DjXMue67.js} +1 -1
- package/dist/assets/{diagram-7IWD3JNH-Di-7-nSA.js → diagram-7IWD3JNH-FNEXlm5k.js} +1 -1
- package/dist/assets/{diagram-B4RE2ZJO-Wybyn8fw.js → diagram-B4RE2ZJO-73NYiO_P.js} +1 -1
- package/dist/assets/{diagram-B4RE2ZJO-mrK79C2E.js → diagram-B4RE2ZJO-dB4QHq0D.js} +1 -1
- package/dist/assets/{diagram-LBJQPF4R-JY6FqSFu.js → diagram-LBJQPF4R-DyKT610O.js} +1 -1
- package/dist/assets/{diagram-LBJQPF4R-sWhu2VLy.js → diagram-LBJQPF4R-rMgmnjvd.js} +1 -1
- package/dist/assets/{diagram-Q27KOJAE-BJ4T0WGp.js → diagram-Q27KOJAE-BvsfmmQt.js} +1 -1
- package/dist/assets/{diagram-Q27KOJAE-DyGT9KhB.js → diagram-Q27KOJAE-c6DEjLQX.js} +1 -1
- package/dist/assets/{diagram-UB23O5K3-oXFJAndB.js → diagram-UB23O5K3-BMo2VXVb.js} +1 -1
- package/dist/assets/{diagram-UB23O5K3-tTd8qwEM.js → diagram-UB23O5K3-DRMKefnZ.js} +1 -1
- package/dist/assets/{ebnfDiagram-BXEA7PRR-DV67cBe6.js → ebnfDiagram-BXEA7PRR-BrOAekWh.js} +1 -1
- package/dist/assets/{ebnfDiagram-BXEA7PRR-OQGm8tPs.js → ebnfDiagram-BXEA7PRR-YmQkylwV.js} +1 -1
- package/dist/assets/{elk-BRx4gEGg.js → elk-Hz3WRESK.js} +1 -1
- package/dist/assets/{elk-CdAQJ-NA.js → elk-tPSZwRVB.js} +1 -1
- package/dist/assets/{erDiagram-JOGREHBK-BhD2xZ2I.js → erDiagram-JOGREHBK-BlaZnoQi.js} +1 -1
- package/dist/assets/{erDiagram-JOGREHBK-BqP8DqqW.js → erDiagram-JOGREHBK-CRCfRUXt.js} +1 -1
- package/dist/assets/{flowDiagram-UKHOOZJN-B4AjZxPJ.js → flowDiagram-UKHOOZJN-DQ1gbjxo.js} +1 -1
- package/dist/assets/{flowDiagram-UKHOOZJN-CP_1WsW4.js → flowDiagram-UKHOOZJN-Dinlbmds.js} +1 -1
- package/dist/assets/{ganttDiagram-PKOTCBZU-BMk6nngr.js → ganttDiagram-PKOTCBZU-CMGpcBZO.js} +1 -1
- package/dist/assets/{ganttDiagram-PKOTCBZU-B_ce39Ld.js → ganttDiagram-PKOTCBZU-Eh94zuPI.js} +1 -1
- package/dist/assets/{gitGraphDiagram-DS77QQ5N-CnZA42iA.js → gitGraphDiagram-DS77QQ5N-Bp8xIZbk.js} +1 -1
- package/dist/assets/{gitGraphDiagram-DS77QQ5N-DqEz_iTn.js → gitGraphDiagram-DS77QQ5N-Cu-b4YNw.js} +1 -1
- package/dist/assets/index-51e8fagd.css +32 -0
- package/dist/assets/{index-D5nLH7qP.js → index-CQE9C6k6.js} +356 -356
- package/dist/assets/{index-CqyOGerp.js → index-S8ow0XfK.js} +356 -356
- package/dist/assets/{infoDiagram-6WML65LV-BQf7m4X4.js → infoDiagram-6WML65LV-CClEEtTq.js} +1 -1
- package/dist/assets/{infoDiagram-6WML65LV-Dntf4YFM.js → infoDiagram-6WML65LV-QmHeojgl.js} +1 -1
- package/dist/assets/{ishikawaDiagram-WSZJBQD7-BDjsldAI.js → ishikawaDiagram-WSZJBQD7-BemSj9lN.js} +1 -1
- package/dist/assets/{ishikawaDiagram-WSZJBQD7-BqXpJeoL.js → ishikawaDiagram-WSZJBQD7-nw48g1vr.js} +1 -1
- package/dist/assets/{journeyDiagram-NVQOT4AX-CBcFzP2M.js → journeyDiagram-NVQOT4AX-DeNtO6OU.js} +1 -1
- package/dist/assets/{journeyDiagram-NVQOT4AX-DoWKjgKd.js → journeyDiagram-NVQOT4AX-q1lCfOYn.js} +1 -1
- package/dist/assets/{kanban-definition-27J2QSJJ-9bspl7j-.js → kanban-definition-27J2QSJJ-Bzhu6hql.js} +1 -1
- package/dist/assets/{kanban-definition-27J2QSJJ-Cjxa-Fbb.js → kanban-definition-27J2QSJJ-VfvD33YG.js} +1 -1
- package/dist/assets/{linear-YogAXmU_.js → linear-C0Kwu3Yp.js} +1 -1
- package/dist/assets/{linear-lIhI5Y8l.js → linear-CbM_4-fP.js} +1 -1
- package/dist/assets/{mermaid.core-2Spxcrg7.js → mermaid.core-G2huIsXn.js} +5 -5
- package/dist/assets/{mermaid.core-BxxInCBm.js → mermaid.core-fvTQFUX1.js} +5 -5
- package/dist/assets/{mindmap-definition-FAOFIHXS-DblO5EG4.js → mindmap-definition-FAOFIHXS-BONvuyvz.js} +1 -1
- package/dist/assets/{mindmap-definition-FAOFIHXS-_nlvJ9VK.js → mindmap-definition-FAOFIHXS-BzYawGKQ.js} +1 -1
- package/dist/assets/{pegDiagram-VL7TDLO6-BBJFPAZG.js → pegDiagram-VL7TDLO6-Df2HAKGH.js} +1 -1
- package/dist/assets/{pegDiagram-VL7TDLO6-DhRH7YRf.js → pegDiagram-VL7TDLO6-DnMwBHn_.js} +1 -1
- package/dist/assets/{pieDiagram-7S7Q4E2Y-4Qy7Nk4U.js → pieDiagram-7S7Q4E2Y-Cd3-a-dM.js} +1 -1
- package/dist/assets/{pieDiagram-7S7Q4E2Y-BUtdeYBT.js → pieDiagram-7S7Q4E2Y-LV6TOhOD.js} +1 -1
- package/dist/assets/{quadrantDiagram-CIZ2JOQS-BUoIDY1r.js → quadrantDiagram-CIZ2JOQS-8VOnA3FV.js} +1 -1
- package/dist/assets/{quadrantDiagram-CIZ2JOQS-D90kdHA1.js → quadrantDiagram-CIZ2JOQS-CnwxFPxh.js} +1 -1
- package/dist/assets/{railroadDiagram-AXF67PYL-CJf9--tj.js → railroadDiagram-AXF67PYL-CXBFj3Iu.js} +1 -1
- package/dist/assets/{railroadDiagram-AXF67PYL-D3S1oliC.js → railroadDiagram-AXF67PYL-DLoAPcsb.js} +1 -1
- package/dist/assets/{requirementDiagram-LRYGKXZP-C04jhjS6.js → requirementDiagram-LRYGKXZP-LrVlZXSz.js} +1 -1
- package/dist/assets/{requirementDiagram-LRYGKXZP-cQaGai5h.js → requirementDiagram-LRYGKXZP-pakITowN.js} +1 -1
- package/dist/assets/{sankeyDiagram-W5VNT64P-AT4cTVbY.js → sankeyDiagram-W5VNT64P-BIQQ8A1I.js} +1 -1
- package/dist/assets/{sankeyDiagram-W5VNT64P-DfFUdqYO.js → sankeyDiagram-W5VNT64P-C6QWOxNM.js} +1 -1
- package/dist/assets/{sequenceDiagram-SI44F4Z6-DbjhG030.js → sequenceDiagram-SI44F4Z6-CpHBe2CG.js} +1 -1
- package/dist/assets/{sequenceDiagram-SI44F4Z6-DKjdupix.js → sequenceDiagram-SI44F4Z6-cnLxaxcV.js} +1 -1
- package/dist/assets/{sizeCapture-X5ZJPWSS-CCcKLP8m.js → sizeCapture-X5ZJPWSS-3g-1onHD.js} +1 -1
- package/dist/assets/{sizeCapture-X5ZJPWSS-DGxRWxeo.js → sizeCapture-X5ZJPWSS-4U6b3PSL.js} +1 -1
- package/dist/assets/{stateDiagram-OKZ733FA-D7wGCNb7.js → stateDiagram-OKZ733FA-CFwVDdlY.js} +1 -1
- package/dist/assets/{stateDiagram-OKZ733FA-qdMAailp.js → stateDiagram-OKZ733FA-CKVGJcM2.js} +1 -1
- package/dist/assets/{stateDiagram-v2-UEYNNEHI-BbmmtA9w.js → stateDiagram-v2-UEYNNEHI-Dnbk8ftm.js} +1 -1
- package/dist/assets/{stateDiagram-v2-UEYNNEHI-Diz_hFvh.js → stateDiagram-v2-UEYNNEHI-rlA-woxH.js} +1 -1
- package/dist/assets/{swimlanes-SLNWSIFB-CZgIPz6I.js → swimlanes-SLNWSIFB-DCwz8-mf.js} +2 -2
- package/dist/assets/{swimlanes-SLNWSIFB-B16H-6OU.js → swimlanes-SLNWSIFB-M9Oumwnl.js} +2 -2
- package/dist/assets/swimlanesDiagram-ULZ7WXOC-CTtTyW6-.js +8 -0
- package/dist/assets/swimlanesDiagram-ULZ7WXOC-Caohx6WZ.js +8 -0
- package/dist/assets/{timeline-definition-Z64GVDOM-7r7OVlrT.js → timeline-definition-Z64GVDOM-BVmfjoWH.js} +1 -1
- package/dist/assets/{timeline-definition-Z64GVDOM-nhnkS_wy.js → timeline-definition-Z64GVDOM-DyXvto1l.js} +1 -1
- package/dist/assets/{vennDiagram-T6HMQDX7-B1piFYrz.js → vennDiagram-T6HMQDX7-CNe6zorb.js} +1 -1
- package/dist/assets/{vennDiagram-T6HMQDX7-x8SJTFhK.js → vennDiagram-T6HMQDX7-DyzOWKx3.js} +1 -1
- package/dist/assets/{wardleyDiagram-T6FBY63Y-BdD4GExj.js → wardleyDiagram-T6FBY63Y-D5YvMVwa.js} +1 -1
- package/dist/assets/{wardleyDiagram-T6FBY63Y-C90xqNVS.js → wardleyDiagram-T6FBY63Y-DXo8BCrA.js} +1 -1
- package/dist/assets/{xychartDiagram-ELKLHX3M--Ndoz0Cq.js → xychartDiagram-ELKLHX3M-CIBffVxC.js} +1 -1
- package/dist/assets/{xychartDiagram-ELKLHX3M-BAKns-7o.js → xychartDiagram-ELKLHX3M-XlsWelDb.js} +1 -1
- package/dist/build-info.json +2 -2
- package/dist/convert-icons.md +10 -46
- package/dist/favicon.png +0 -0
- package/dist/favicon.svg +1 -9
- package/dist/generate-icons.js +67 -47
- package/dist/icons/icon-128x128.png +0 -0
- package/dist/icons/icon-144x144.png +0 -0
- package/dist/icons/icon-152x152.png +0 -0
- package/dist/icons/icon-192x192.png +0 -0
- package/dist/icons/icon-384x384.png +0 -0
- package/dist/icons/icon-512x512.png +0 -0
- package/dist/icons/icon-72x72.png +0 -0
- package/dist/icons/icon-96x96.png +0 -0
- package/dist/index.html +2 -2
- package/dist/logo-128.png +0 -0
- package/dist/logo-256.png +0 -0
- package/dist/logo-32.png +0 -0
- package/dist/logo-512.png +0 -0
- package/dist/logo-64.png +0 -0
- package/dist/logo-source.png +0 -0
- package/dist/logo.svg +1 -17
- package/dist/sw.js +7 -9
- package/dist-server/build-info.json +2 -2
- package/dist-server/server/load-env.js +12 -4
- package/dist-server/server/load-env.js.map +1 -1
- package/dist-server/server/modules/browser-use/browser-use.service.js +33 -11
- package/dist-server/server/modules/browser-use/browser-use.service.js.map +1 -1
- package/dist-server/server/modules/browser-use/index.js +4 -4
- package/dist-server/server/modules/browser-use/index.js.map +1 -1
- package/dist-server/server/modules/browser-use/mcp-server-names.js +6 -4
- package/dist-server/server/modules/browser-use/mcp-server-names.js.map +1 -1
- package/dist-server/server/modules/browser-use/tests/browser-use.service.test.js +49 -1
- package/dist-server/server/modules/browser-use/tests/browser-use.service.test.js.map +1 -1
- package/dist-server/server/modules/cli/asset-migration-files.js +74 -0
- package/dist-server/server/modules/cli/asset-migration-files.js.map +1 -0
- package/dist-server/server/modules/cli/asset-migration-report.js +80 -0
- package/dist-server/server/modules/cli/asset-migration-report.js.map +1 -0
- package/dist-server/server/modules/cli/asset-migration-store.js +153 -0
- package/dist-server/server/modules/cli/asset-migration-store.js.map +1 -0
- package/dist-server/server/modules/cli/asset-migration.service.js +161 -0
- package/dist-server/server/modules/cli/asset-migration.service.js.map +1 -0
- package/dist-server/server/modules/cli/browser-use-mcp.js +9 -4
- package/dist-server/server/modules/cli/browser-use-mcp.js.map +1 -1
- package/dist-server/server/modules/cli/cli.module.js +21 -1
- package/dist-server/server/modules/cli/cli.module.js.map +1 -1
- package/dist-server/server/modules/cli/cli.service.js +6 -1
- package/dist-server/server/modules/cli/cli.service.js.map +1 -1
- package/dist-server/server/modules/cli/tests/asset-migration.service.test.js +275 -0
- package/dist-server/server/modules/cli/tests/asset-migration.service.test.js.map +1 -0
- package/dist-server/server/modules/cli/tests/browser-use-mcp-entry.test.js +157 -0
- package/dist-server/server/modules/cli/tests/browser-use-mcp-entry.test.js.map +1 -1
- package/dist-server/server/modules/cli/tests/cli-environment-bootstrap.test.js +1 -0
- package/dist-server/server/modules/cli/tests/cli-environment-bootstrap.test.js.map +1 -1
- package/dist-server/server/modules/cli/tests/cli.service.test.js +6 -1
- package/dist-server/server/modules/cli/tests/cli.service.test.js.map +1 -1
- package/dist-server/server/modules/cockpit/cockpit-brief-prompt.js +1 -1
- package/dist-server/server/modules/cockpit/cockpit-card-actions.js +19 -3
- package/dist-server/server/modules/cockpit/cockpit-card-actions.js.map +1 -1
- package/dist-server/server/modules/cockpit/cockpit-card-feedback-store.js +94 -9
- package/dist-server/server/modules/cockpit/cockpit-card-feedback-store.js.map +1 -1
- package/dist-server/server/modules/cockpit/cockpit-card-registry.js +1 -1
- package/dist-server/server/modules/cockpit/cockpit-fleet-card-projection.js +3 -0
- package/dist-server/server/modules/cockpit/cockpit-fleet-card-projection.js.map +1 -1
- package/dist-server/server/modules/cockpit/cockpit-knowledge-reading.js +16 -0
- package/dist-server/server/modules/cockpit/cockpit-knowledge-reading.js.map +1 -1
- package/dist-server/server/modules/cockpit/cockpit.module.js +1 -1
- package/dist-server/server/modules/cockpit/tests/cockpit-card-feedback.test.js +96 -1
- package/dist-server/server/modules/cockpit/tests/cockpit-card-feedback.test.js.map +1 -1
- package/dist-server/server/modules/cockpit/tests/cockpit-fleet-card-provider.test.js +2 -2
- package/dist-server/server/modules/cockpit/tests/cockpit-knowledge-decision-handoff.test.js +169 -3
- package/dist-server/server/modules/cockpit/tests/cockpit-knowledge-decision-handoff.test.js.map +1 -1
- package/dist-server/server/modules/context-events/context-event-writer.js +5 -5
- package/dist-server/server/modules/context-events/context-events.module.js +2 -2
- package/dist-server/server/modules/context-events/session-ask-stream-reader.js +1 -1
- package/dist-server/server/modules/context-events/session-blocked-events.js +3 -3
- package/dist-server/server/modules/context-events/tests/session-ask-event-writer.test.js +1 -1
- package/dist-server/server/modules/context-events/tests/session-blocked-events.test.js +3 -3
- package/dist-server/server/modules/context-events/tests/session-run-events.test.js +1 -1
- package/dist-server/server/modules/database/migrations.js +23 -1
- package/dist-server/server/modules/database/migrations.js.map +1 -1
- package/dist-server/server/modules/database/repositories/sessions.db.js +25 -4
- package/dist-server/server/modules/database/repositories/sessions.db.js.map +1 -1
- package/dist-server/server/modules/database/repositories/voice-user-identifiers.db.js +1 -1
- package/dist-server/server/modules/database/schema.js +16 -2
- package/dist-server/server/modules/database/schema.js.map +1 -1
- package/dist-server/server/modules/database/tests/migrations-ensure-columns.test.js +2 -0
- package/dist-server/server/modules/database/tests/migrations-ensure-columns.test.js.map +1 -1
- package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js +2 -2
- package/dist-server/server/modules/debug-agent/tests/debug-agent-permission-popup.test.js +2 -2
- package/dist-server/server/modules/liaison/liaison-deliver.service.js +3 -3
- package/dist-server/server/modules/liaison/liaison.module.js +1 -1
- package/dist-server/server/modules/mcp-gateway/mcp-gateway.auth.js +3 -2
- package/dist-server/server/modules/mcp-gateway/mcp-gateway.auth.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/mcp-self-target.js +2 -2
- package/dist-server/server/modules/mcp-gateway/mcp-session-send.js +7 -0
- package/dist-server/server/modules/mcp-gateway/mcp-session-send.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/mcp-tool-annotations.js +4 -4
- package/dist-server/server/modules/mcp-gateway/oauth-metadata.gate.js +4 -2
- package/dist-server/server/modules/mcp-gateway/oauth-metadata.gate.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/knowledge-effective-config-proof.test.js +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/knowledge-peer-correlation-proof.test.js +2 -2
- package/dist-server/server/modules/mcp-gateway/tests/mcp-approvals.test.js +3 -2
- package/dist-server/server/modules/mcp-gateway/tests/mcp-approvals.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-audit-route.test.js +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-audit.test.js +4 -4
- package/dist-server/server/modules/mcp-gateway/tests/mcp-auth.test.js +3 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-auth.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-cancel-queued.test.js +3 -2
- package/dist-server/server/modules/mcp-gateway/tests/mcp-cancel-queued.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-cockpit-tools.test.js +7 -3
- package/dist-server/server/modules/mcp-gateway/tests/mcp-cockpit-tools.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-correlation-id.test.js +8 -8
- package/dist-server/server/modules/mcp-gateway/tests/mcp-draft.test.js +3 -2
- package/dist-server/server/modules/mcp-gateway/tests/mcp-draft.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-english-only.test.js +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-gateway-wiring.test.js +2 -2
- package/dist-server/server/modules/mcp-gateway/tests/mcp-insufficient-scope.test.js +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-insufficient-scope.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-knowledge-facts.test.js +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-not-found-semantics.test.js +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-not-found-semantics.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-oauth-challenge.test.js +3 -2
- package/dist-server/server/modules/mcp-gateway/tests/mcp-oauth-challenge.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-overview.test.js +2 -2
- package/dist-server/server/modules/mcp-gateway/tests/mcp-pending-interaction.test.js +2 -2
- package/dist-server/server/modules/mcp-gateway/tests/mcp-read-tools.test.js +3 -3
- package/dist-server/server/modules/mcp-gateway/tests/mcp-read-tools.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-run-get.test.js +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-self-target.test.js +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-self-target.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-session-background.test.js +2 -2
- package/dist-server/server/modules/mcp-gateway/tests/mcp-session-background.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-session-host-control.test.js +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-session-host-control.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-session-lifecycle.test.js +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-session-lifecycle.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-session-reconfigure.test.js +2 -2
- package/dist-server/server/modules/mcp-gateway/tests/mcp-session-reconfigure.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-session-search-pruning.test.js +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-session-search.test.js +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-session-send.test.js +2 -2
- package/dist-server/server/modules/mcp-gateway/tests/mcp-session-send.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-ui-last-opened.test.js +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-usage-stats.test.js +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-usage-stats.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/mcp-write-notification.test.js +2 -2
- package/dist-server/server/modules/mcp-gateway/tests/mcp-write-notification.test.js.map +1 -1
- package/dist-server/server/modules/mcp-gateway/tests/oauth-flow.e2e.test.js +3 -3
- package/dist-server/server/modules/notifications/services/notification-orchestrator.service.js +1 -1
- package/dist-server/server/modules/oauth/access-tokens.service.js +8 -8
- package/dist-server/server/modules/oauth/oauth-consent.service.js +20 -15
- package/dist-server/server/modules/oauth/oauth-consent.service.js.map +1 -1
- package/dist-server/server/modules/oauth/tests/access-token-scopes.test.js +54 -34
- package/dist-server/server/modules/oauth/tests/access-token-scopes.test.js.map +1 -1
- package/dist-server/server/modules/oauth/tests/access-tokens.service.test.js +35 -14
- package/dist-server/server/modules/oauth/tests/access-tokens.service.test.js.map +1 -1
- package/dist-server/server/modules/oauth/tests/oauth-consent-page.test.js +27 -22
- package/dist-server/server/modules/oauth/tests/oauth-consent-page.test.js.map +1 -1
- package/dist-server/server/modules/oauth/tests/oauth-consent-ratelimit.test.js +2 -2
- package/dist-server/server/modules/oauth/tests/token-info.routes.test.js +2 -2
- package/dist-server/server/modules/oauth/tests/token-info.routes.test.js.map +1 -1
- package/dist-server/server/modules/observation/blind-spots.js +1 -1
- package/dist-server/server/modules/observation/observation-store.js +50 -17
- package/dist-server/server/modules/observation/observation-store.js.map +1 -1
- package/dist-server/server/modules/observation/observation-uri.js +31 -19
- package/dist-server/server/modules/observation/observation-uri.js.map +1 -1
- package/dist-server/server/modules/observation/observation.routes.js +1 -1
- package/dist-server/server/modules/observation/project-truth.js +1 -1
- package/dist-server/server/modules/observation/session-ask-decision-answer.js +2 -1
- package/dist-server/server/modules/observation/session-ask-decision-answer.js.map +1 -1
- package/dist-server/server/modules/observation/session-digest-llm.js +7 -1
- package/dist-server/server/modules/observation/session-digest-llm.js.map +1 -1
- package/dist-server/server/modules/observation/session-digest.js +39 -5
- package/dist-server/server/modules/observation/session-digest.js.map +1 -1
- package/dist-server/server/modules/observation/tests/architecture-delta.test.js +1 -1
- package/dist-server/server/modules/observation/tests/observation-routes.test.js +9 -0
- package/dist-server/server/modules/observation/tests/observation-routes.test.js.map +1 -1
- package/dist-server/server/modules/observation/tests/observation-store.test.js +38 -0
- package/dist-server/server/modules/observation/tests/observation-store.test.js.map +1 -1
- package/dist-server/server/modules/observation/tests/project-truth.test.js +2 -2
- package/dist-server/server/modules/observation/tests/session-ask-decision-digest.test.js +150 -0
- package/dist-server/server/modules/observation/tests/session-ask-decision-digest.test.js.map +1 -1
- package/dist-server/server/modules/observation/tests/session-digest.test.js +24 -1
- package/dist-server/server/modules/observation/tests/session-digest.test.js.map +1 -1
- package/dist-server/server/modules/providers/index.js +9 -0
- package/dist-server/server/modules/providers/index.js.map +1 -1
- package/dist-server/server/modules/providers/list/claude/claude-host-driver.provider.js +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-app-server.client.js +22 -3
- package/dist-server/server/modules/providers/list/codex/codex-app-server.client.js.map +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-app-server.connection.js +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-host-driver.contract.js +11 -9
- package/dist-server/server/modules/providers/list/codex/codex-host-driver.contract.js.map +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-host-driver.provider.js +15 -1
- package/dist-server/server/modules/providers/list/codex/codex-host-driver.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-models.provider.js +14 -3
- package/dist-server/server/modules/providers/list/codex/codex-models.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/codex/codex-provider-injection.js +248 -0
- package/dist-server/server/modules/providers/list/codex/codex-provider-injection.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-resident-provider-launch.js +37 -0
- package/dist-server/server/modules/providers/list/codex/codex-resident-provider-launch.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-runtime.provider.js +19 -1
- package/dist-server/server/modules/providers/list/codex/codex-runtime.provider.js.map +1 -1
- package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js +1 -1
- package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js +1 -1
- package/dist-server/server/modules/providers/provider.routes.js +23 -2
- package/dist-server/server/modules/providers/provider.routes.js.map +1 -1
- package/dist-server/server/modules/providers/services/provider-models.service.js +136 -106
- package/dist-server/server/modules/providers/services/provider-models.service.js.map +1 -1
- package/dist-server/server/modules/providers/services/provider-runtime.service.js +3 -0
- package/dist-server/server/modules/providers/services/provider-runtime.service.js.map +1 -1
- package/dist-server/server/modules/providers/services/session-model-resolver.js +106 -0
- package/dist-server/server/modules/providers/services/session-model-resolver.js.map +1 -0
- package/dist-server/server/modules/providers/services/session-provider-binding.js +89 -0
- package/dist-server/server/modules/providers/services/session-provider-binding.js.map +1 -0
- package/dist-server/server/modules/providers/services/sessions.service.js +5 -1
- package/dist-server/server/modules/providers/services/sessions.service.js.map +1 -1
- package/dist-server/server/modules/providers/tests/claude-resident-addressable.test.js +2 -2
- package/dist-server/server/modules/providers/tests/claude-session-name-authority.test.js +4 -4
- package/dist-server/server/modules/providers/tests/codex-app-server-protocol.test.js +1 -1
- package/dist-server/server/modules/providers/tests/codex-host-driver-persistent.test.js +2 -2
- package/dist-server/server/modules/providers/tests/codex-provider-model-binding.test.js +270 -0
- package/dist-server/server/modules/providers/tests/codex-provider-model-binding.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/codex-resident-provider-injection.test.js +484 -0
- package/dist-server/server/modules/providers/tests/codex-resident-provider-injection.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/codex-runtime-provider-injection.test.js +228 -0
- package/dist-server/server/modules/providers/tests/codex-runtime-provider-injection.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/codex-session-provider-binding.test.js +306 -0
- package/dist-server/server/modules/providers/tests/codex-session-provider-binding.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/codex-sessions.test.js +1 -1
- package/dist-server/server/modules/providers/tests/opencode-sessions.test.js +2 -2
- package/dist-server/server/modules/providers/tests/provider-models.service.test.js +15 -0
- package/dist-server/server/modules/providers/tests/provider-models.service.test.js.map +1 -1
- package/dist-server/server/modules/providers/tests/provider.routes.test.js +1 -1
- package/dist-server/server/modules/quay/index.js +1 -1
- package/dist-server/server/modules/quay/quay-fleet-cli.js +1 -1
- package/dist-server/server/modules/quay/quay-fleet-locator.js +2 -2
- package/dist-server/server/modules/quay/quay-fleet-project-id.js +7 -7
- package/dist-server/server/modules/quay/quay-fleet-registry.js +3 -3
- package/dist-server/server/modules/quay/quay-suite-fanin-reader.js +1 -1
- package/dist-server/server/modules/quay/quay-uri-resolve.js +6 -6
- package/dist-server/server/modules/quay/quay.module.js +3 -3
- package/dist-server/server/modules/quay/quay.routes.js +1 -1
- package/dist-server/server/modules/quay/quay.service.js +4 -4
- package/dist-server/server/modules/quay/tests/contracts/fleet-cli-contracts.test.js +3 -3
- package/dist-server/server/modules/quay/tests/contracts/shapes.js +9 -9
- package/dist-server/server/modules/quay/tests/quay-fleet-locator.test.js +1 -1
- package/dist-server/server/modules/quay/tests/quay-fleet-project-id.test.js +4 -4
- package/dist-server/server/modules/quay/tests/quay-uri-resolve.test.js +10 -10
- package/dist-server/server/modules/session-hosts/tests/resident-server-restart.test.js +1 -1
- package/dist-server/server/modules/settings/codex-mcp-gateway.settings.js +1 -1
- package/dist-server/server/modules/settings/codex-model-providers.schema.js +349 -0
- package/dist-server/server/modules/settings/codex-model-providers.schema.js.map +1 -0
- package/dist-server/server/modules/settings/codex-model-providers.service.js +199 -0
- package/dist-server/server/modules/settings/codex-model-providers.service.js.map +1 -0
- package/dist-server/server/modules/settings/codex-model-providers.settings.js +547 -0
- package/dist-server/server/modules/settings/codex-model-providers.settings.js.map +1 -0
- package/dist-server/server/modules/settings/codex-model-providers.store.js +200 -0
- package/dist-server/server/modules/settings/codex-model-providers.store.js.map +1 -0
- package/dist-server/server/modules/settings/index.js +10 -0
- package/dist-server/server/modules/settings/index.js.map +1 -1
- package/dist-server/server/modules/settings/server-settings-file.js +28 -32
- package/dist-server/server/modules/settings/server-settings-file.js.map +1 -1
- package/dist-server/server/modules/settings/server-settings.js +2 -2
- package/dist-server/server/modules/settings/server-settings.js.map +1 -1
- package/dist-server/server/modules/settings/settings.module.js +35 -0
- package/dist-server/server/modules/settings/settings.module.js.map +1 -1
- package/dist-server/server/modules/settings/settings.routes.js +42 -0
- package/dist-server/server/modules/settings/settings.routes.js.map +1 -1
- package/dist-server/server/modules/settings/settings.service.js +8 -21
- package/dist-server/server/modules/settings/settings.service.js.map +1 -1
- package/dist-server/server/modules/settings/tests/cockpit-session-start-settings.routes.test.js +1 -0
- package/dist-server/server/modules/settings/tests/cockpit-session-start-settings.routes.test.js.map +1 -1
- package/dist-server/server/modules/settings/tests/codex-model-providers-settings.test.js +336 -0
- package/dist-server/server/modules/settings/tests/codex-model-providers-settings.test.js.map +1 -0
- package/dist-server/server/modules/settings/tests/codex-provider-advanced.test.js +466 -0
- package/dist-server/server/modules/settings/tests/codex-provider-advanced.test.js.map +1 -0
- package/dist-server/server/modules/settings/tests/codex-provider-import.test.js +475 -0
- package/dist-server/server/modules/settings/tests/codex-provider-import.test.js.map +1 -0
- package/dist-server/server/modules/voice/tests/voice-lexicon.test.js +9 -9
- package/dist-server/server/modules/voice/tests/voice-lexicon.test.js.map +1 -1
- package/dist-server/server/modules/voice/voice-lexicon.js +1 -1
- package/dist-server/server/modules/websocket/services/chat-control.service.js +21 -1
- package/dist-server/server/modules/websocket/services/chat-control.service.js.map +1 -1
- package/dist-server/server/modules/websocket/services/chat-websocket.service.js +25 -1
- package/dist-server/server/modules/websocket/services/chat-websocket.service.js.map +1 -1
- package/dist-server/server/modules/websocket/tests/chat-background-task.test.js +18 -1
- package/dist-server/server/modules/websocket/tests/chat-background-task.test.js.map +1 -1
- package/dist-server/server/modules/websocket/tests/chat-stop-task.test.js +18 -1
- package/dist-server/server/modules/websocket/tests/chat-stop-task.test.js.map +1 -1
- package/dist-server/server/modules/worktrees/services/worktree-list.service.js +1 -1
- package/dist-server/server/modules/worktrees/services/worktree-open.service.js +1 -1
- package/dist-server/server/modules/worktrees/services/worktree-remove.service.js +1 -1
- package/dist-server/server/shared/brand.js +18 -20
- package/dist-server/server/shared/brand.js.map +1 -1
- package/dist-server/server/shared/data-root-migration.js +3 -2
- package/dist-server/server/shared/data-root-migration.js.map +1 -1
- package/dist-server/server/shared/data-root.js +54 -59
- package/dist-server/server/shared/data-root.js.map +1 -1
- package/dist-server/server/shared/mcp-contract/types.js +20 -15
- package/dist-server/server/shared/mcp-contract/types.js.map +1 -1
- package/dist-server/server/shared/ports/codex-provider-registry.port.js +66 -0
- package/dist-server/server/shared/ports/codex-provider-registry.port.js.map +1 -0
- package/dist-server/server/shared/settings-file.js +120 -6
- package/dist-server/server/shared/settings-file.js.map +1 -1
- package/dist-server/server/shared/tests/cloudpit-brand-env.test.js +76 -34
- package/dist-server/server/shared/tests/cloudpit-brand-env.test.js.map +1 -1
- package/dist-server/server/shared/tests/cloudpit-data-root.test.js +35 -18
- package/dist-server/server/shared/tests/cloudpit-data-root.test.js.map +1 -1
- package/dist-server/server/shared/tests/cloudpit-goal-exit-gate.test.js +153 -17
- package/dist-server/server/shared/tests/cloudpit-goal-exit-gate.test.js.map +1 -1
- package/dist-server/server/shared/tests/cloudpit-runtime-flip.test.js +116 -114
- package/dist-server/server/shared/tests/cloudpit-runtime-flip.test.js.map +1 -1
- package/dist-server/server/shared/tests/frontend-import-cycle-budget.test.js +9 -1
- package/dist-server/server/shared/tests/frontend-import-cycle-budget.test.js.map +1 -1
- package/dist-server/server/shared/tests/quay-test-script.test.js +40 -6
- package/dist-server/server/shared/tests/quay-test-script.test.js.map +1 -1
- package/dist-server/server/shared/tests/settings-file.test.js +58 -2
- package/dist-server/server/shared/tests/settings-file.test.js.map +1 -1
- package/dist-server/server/shared/types.js.map +1 -1
- package/dist-server/server/shared/utils.js +1 -1
- package/electron/appIdMigration.js +467 -0
- package/electron/assets/logo-macos.icns +0 -0
- package/electron/assets/logo-macos.png +0 -0
- package/electron/assets/logo-windows.ico +0 -0
- package/electron/brandEnv.js +64 -0
- package/electron/cloud.js +3 -3
- package/electron/desktopNotifications.js +1 -1
- package/electron/launcher/index.html +1 -1
- package/electron/localServer.js +41 -7
- package/electron/main.js +33 -15
- package/electron/scripts/generate-macos-icon.js +34 -28
- package/electron/scripts/generate-windows-icon.js +66 -0
- package/electron/serverInstaller.js +20 -11
- package/electron/tests/cloudpit-appid-migration.test.mjs +514 -0
- package/electron/tests/cloudpit-brand-env-wiring.test.mjs +324 -0
- package/electron/tests/cloudpit-desktop-identity.test.mjs +42 -19
- package/electron/tests/cloudpit-runtime-identity-surfaces.test.mjs +10 -4
- package/electron/tests/cloudpit-userdata-migration.test.mjs +18 -5
- package/electron/userDataMigration.js +3 -0
- package/package.json +7 -6
- package/public/api-docs.html +3 -3
- package/scripts/brand-allowlist-check.mjs +233 -12
- package/scripts/brand-allowlist-check.test.mjs +270 -1
- package/scripts/cloudpit-distribution-check.mjs +57 -23
- package/scripts/cloudpit-distribution-check.test.mjs +42 -9
- package/scripts/codex-protocol-smoke.mjs +1 -1
- package/scripts/isolated-instance.sh +1 -1
- package/scripts/mcp-smoke.mjs +2 -2
- package/scripts/release/tests/fork-release-workflows.test.mjs +45 -0
- package/scripts/release/tests/server-installer-bundle-url.test.mjs +57 -9
- package/scripts/restart-when-idle.sh +1 -1
- package/scripts/shadow-prediction-report.mjs +1 -1
- package/scripts/suite-duration-baseline.tsv +45 -0
- package/scripts/ui-scenario.mjs +195 -0
- package/scripts/ui-scenarios/codex-provider-import.json +63 -0
- package/scripts/ui-scenarios/codex-provider-settings.json +77 -0
- package/scripts/voice-capture-process-check.false-forms.test.mjs +1 -1
- package/scripts/voice-phase0-report.test.mjs +1 -1
- package/server/load-env.ts +15 -4
- package/server/modules/browser-use/browser-use.service.ts +45 -14
- package/server/modules/browser-use/index.ts +3 -4
- package/server/modules/browser-use/mcp-server-names.ts +6 -5
- package/server/modules/browser-use/tests/browser-use.service.test.ts +63 -1
- package/server/modules/cli/asset-migration-files.ts +96 -0
- package/server/modules/cli/asset-migration-report.ts +123 -0
- package/server/modules/cli/asset-migration-store.ts +228 -0
- package/server/modules/cli/asset-migration.service.ts +236 -0
- package/server/modules/cli/browser-use-mcp.ts +9 -4
- package/server/modules/cli/cli.module.ts +21 -1
- package/server/modules/cli/cli.service.ts +14 -1
- package/server/modules/cli/tests/asset-migration.service.test.ts +349 -0
- package/server/modules/cli/tests/browser-use-mcp-entry.test.ts +202 -0
- package/server/modules/cli/tests/cli-environment-bootstrap.test.ts +1 -0
- package/server/modules/cli/tests/cli.service.test.ts +6 -1
- package/server/modules/cockpit/cockpit-brief-prompt.ts +1 -1
- package/server/modules/cockpit/cockpit-card-actions.ts +20 -3
- package/server/modules/cockpit/cockpit-card-feedback-store.ts +104 -9
- package/server/modules/cockpit/cockpit-card-registry.ts +2 -2
- package/server/modules/cockpit/cockpit-fleet-card-projection.ts +3 -0
- package/server/modules/cockpit/cockpit-fleet-executor.ts +1 -1
- package/server/modules/cockpit/cockpit-knowledge-reading.ts +17 -0
- package/server/modules/cockpit/cockpit.module.ts +2 -2
- package/server/modules/cockpit/cockpit.reducer.ts +1 -1
- package/server/modules/cockpit/tests/cockpit-card-feedback.test.ts +116 -1
- package/server/modules/cockpit/tests/cockpit-fleet-card-provider.test.ts +2 -2
- package/server/modules/cockpit/tests/cockpit-knowledge-decision-handoff.test.ts +205 -3
- package/server/modules/context-events/context-event-writer.ts +6 -6
- package/server/modules/context-events/context-events.module.ts +2 -2
- package/server/modules/context-events/session-ask-stream-reader.ts +1 -1
- package/server/modules/context-events/session-blocked-events.ts +3 -3
- package/server/modules/context-events/tests/session-ask-event-writer.test.ts +1 -1
- package/server/modules/context-events/tests/session-blocked-events.test.ts +3 -3
- package/server/modules/context-events/tests/session-run-events.test.ts +1 -1
- package/server/modules/database/migrations.ts +24 -1
- package/server/modules/database/repositories/sessions.db.ts +41 -4
- package/server/modules/database/repositories/voice-user-identifiers.db.ts +1 -1
- package/server/modules/database/schema.ts +16 -2
- package/server/modules/database/tests/migrations-ensure-columns.test.ts +2 -0
- package/server/modules/database/tests/sessions-provider-mapping.test.ts +2 -2
- package/server/modules/debug-agent/tests/debug-agent-permission-popup.test.ts +2 -2
- package/server/modules/liaison/liaison-deliver.service.ts +4 -4
- package/server/modules/liaison/liaison.module.ts +1 -1
- package/server/modules/mcp-gateway/mcp-gateway.auth.ts +3 -2
- package/server/modules/mcp-gateway/mcp-self-target.ts +2 -2
- package/server/modules/mcp-gateway/mcp-session-send.ts +21 -2
- package/server/modules/mcp-gateway/mcp-tool-annotations.ts +4 -4
- package/server/modules/mcp-gateway/oauth-metadata.gate.ts +4 -5
- package/server/modules/mcp-gateway/tests/knowledge-effective-config-proof.test.ts +1 -1
- package/server/modules/mcp-gateway/tests/knowledge-peer-correlation-proof.test.ts +2 -2
- package/server/modules/mcp-gateway/tests/mcp-approvals.test.ts +3 -2
- package/server/modules/mcp-gateway/tests/mcp-audit-route.test.ts +1 -1
- package/server/modules/mcp-gateway/tests/mcp-audit.test.ts +4 -4
- package/server/modules/mcp-gateway/tests/mcp-auth.test.ts +3 -1
- package/server/modules/mcp-gateway/tests/mcp-cancel-queued.test.ts +3 -2
- package/server/modules/mcp-gateway/tests/mcp-cockpit-tools.test.ts +7 -3
- package/server/modules/mcp-gateway/tests/mcp-correlation-id.test.ts +8 -8
- package/server/modules/mcp-gateway/tests/mcp-draft.test.ts +3 -2
- package/server/modules/mcp-gateway/tests/mcp-english-only.test.ts +1 -1
- package/server/modules/mcp-gateway/tests/mcp-gateway-wiring.test.ts +2 -2
- package/server/modules/mcp-gateway/tests/mcp-insufficient-scope.test.ts +1 -1
- package/server/modules/mcp-gateway/tests/mcp-knowledge-facts.test.ts +1 -1
- package/server/modules/mcp-gateway/tests/mcp-not-found-semantics.test.ts +1 -1
- package/server/modules/mcp-gateway/tests/mcp-oauth-challenge.test.ts +3 -2
- package/server/modules/mcp-gateway/tests/mcp-overview.test.ts +2 -2
- package/server/modules/mcp-gateway/tests/mcp-pending-interaction.test.ts +2 -2
- package/server/modules/mcp-gateway/tests/mcp-read-tools.test.ts +3 -3
- package/server/modules/mcp-gateway/tests/mcp-run-get.test.ts +1 -1
- package/server/modules/mcp-gateway/tests/mcp-self-target.test.ts +1 -1
- package/server/modules/mcp-gateway/tests/mcp-session-background.test.ts +2 -2
- package/server/modules/mcp-gateway/tests/mcp-session-host-control.test.ts +1 -1
- package/server/modules/mcp-gateway/tests/mcp-session-lifecycle.test.ts +1 -1
- package/server/modules/mcp-gateway/tests/mcp-session-reconfigure.test.ts +2 -2
- package/server/modules/mcp-gateway/tests/mcp-session-search-pruning.test.ts +1 -1
- package/server/modules/mcp-gateway/tests/mcp-session-search.test.ts +1 -1
- package/server/modules/mcp-gateway/tests/mcp-session-send.test.ts +2 -2
- package/server/modules/mcp-gateway/tests/mcp-ui-last-opened.test.ts +1 -1
- package/server/modules/mcp-gateway/tests/mcp-usage-stats.test.ts +1 -1
- package/server/modules/mcp-gateway/tests/mcp-write-notification.test.ts +2 -2
- package/server/modules/mcp-gateway/tests/oauth-flow.e2e.test.ts +3 -3
- package/server/modules/notifications/services/notification-orchestrator.service.js +1 -1
- package/server/modules/oauth/access-tokens.service.ts +8 -8
- package/server/modules/oauth/oauth-consent.service.ts +20 -15
- package/server/modules/oauth/tests/access-token-scopes.test.ts +55 -34
- package/server/modules/oauth/tests/access-tokens.service.test.ts +50 -14
- package/server/modules/oauth/tests/oauth-consent-page.test.ts +29 -21
- package/server/modules/oauth/tests/oauth-consent-ratelimit.test.ts +2 -2
- package/server/modules/oauth/tests/token-info.routes.test.ts +2 -2
- package/server/modules/observation/architecture-delta.producer.ts +1 -1
- package/server/modules/observation/blind-spots.ts +1 -1
- package/server/modules/observation/observation-store.ts +54 -16
- package/server/modules/observation/observation-uri.ts +34 -21
- package/server/modules/observation/observation.routes.ts +1 -1
- package/server/modules/observation/project-truth.ts +3 -3
- package/server/modules/observation/session-ask-decision-answer.ts +2 -1
- package/server/modules/observation/session-digest-llm.ts +7 -1
- package/server/modules/observation/session-digest.ts +39 -5
- package/server/modules/observation/tests/architecture-delta.test.ts +1 -1
- package/server/modules/observation/tests/observation-routes.test.ts +13 -0
- package/server/modules/observation/tests/observation-store.test.ts +58 -0
- package/server/modules/observation/tests/project-truth.test.ts +2 -2
- package/server/modules/observation/tests/session-ask-decision-digest.test.ts +189 -0
- package/server/modules/observation/tests/session-digest.test.ts +43 -0
- package/server/modules/providers/index.ts +13 -0
- package/server/modules/providers/list/claude/claude-host-driver.provider.ts +1 -1
- package/server/modules/providers/list/codex/codex-app-server.client.ts +37 -5
- package/server/modules/providers/list/codex/codex-app-server.connection.ts +1 -1
- package/server/modules/providers/list/codex/codex-host-driver.contract.ts +18 -9
- package/server/modules/providers/list/codex/codex-host-driver.provider.ts +15 -1
- package/server/modules/providers/list/codex/codex-models.provider.ts +16 -3
- package/server/modules/providers/list/codex/codex-provider-injection.ts +323 -0
- package/server/modules/providers/list/codex/codex-resident-provider-launch.ts +71 -0
- package/server/modules/providers/list/codex/codex-runtime.provider.ts +20 -1
- package/server/modules/providers/list/cursor/cursor-models.provider.ts +1 -1
- package/server/modules/providers/list/opencode/opencode-models.provider.ts +1 -1
- package/server/modules/providers/provider.routes.ts +23 -2
- package/server/modules/providers/services/provider-models.service.ts +187 -124
- package/server/modules/providers/services/provider-runtime.service.ts +3 -0
- package/server/modules/providers/services/session-model-resolver.ts +180 -0
- package/server/modules/providers/services/session-provider-binding.ts +176 -0
- package/server/modules/providers/services/sessions.service.ts +5 -1
- package/server/modules/providers/tests/claude-resident-addressable.test.ts +2 -2
- package/server/modules/providers/tests/claude-session-name-authority.test.ts +4 -4
- package/server/modules/providers/tests/codex-app-server-protocol.test.ts +1 -1
- package/server/modules/providers/tests/codex-host-driver-persistent.test.ts +2 -2
- package/server/modules/providers/tests/codex-provider-model-binding.test.ts +345 -0
- package/server/modules/providers/tests/codex-resident-provider-injection.test.ts +561 -0
- package/server/modules/providers/tests/codex-runtime-provider-injection.test.ts +269 -0
- package/server/modules/providers/tests/codex-session-provider-binding.test.ts +386 -0
- package/server/modules/providers/tests/codex-sessions.test.ts +1 -1
- package/server/modules/providers/tests/opencode-sessions.test.ts +2 -2
- package/server/modules/providers/tests/provider-models.service.test.ts +15 -0
- package/server/modules/providers/tests/provider.routes.test.ts +1 -1
- package/server/modules/quay/index.ts +1 -1
- package/server/modules/quay/quay-dispatch-carrier.ts +1 -1
- package/server/modules/quay/quay-fleet-cli.ts +1 -1
- package/server/modules/quay/quay-fleet-locator.ts +2 -2
- package/server/modules/quay/quay-fleet-project-id.ts +14 -14
- package/server/modules/quay/quay-fleet-registry.ts +8 -8
- package/server/modules/quay/quay-suite-fanin-reader.ts +1 -1
- package/server/modules/quay/quay-uri-resolve.ts +8 -8
- package/server/modules/quay/quay.module.ts +3 -3
- package/server/modules/quay/quay.routes.ts +1 -1
- package/server/modules/quay/quay.service.ts +6 -6
- package/server/modules/quay/session-task-chain.service.ts +1 -1
- package/server/modules/quay/tests/contracts/fleet-cli-contracts.test.ts +3 -3
- package/server/modules/quay/tests/contracts/shapes.ts +10 -10
- package/server/modules/quay/tests/quay-fleet-locator.test.ts +1 -1
- package/server/modules/quay/tests/quay-fleet-project-id.test.ts +6 -6
- package/server/modules/quay/tests/quay-uri-resolve.test.ts +10 -10
- package/server/modules/session-hosts/tests/resident-server-restart.test.ts +1 -1
- package/server/modules/settings/codex-mcp-gateway.settings.ts +1 -1
- package/server/modules/settings/codex-model-providers.schema.ts +460 -0
- package/server/modules/settings/codex-model-providers.service.ts +235 -0
- package/server/modules/settings/codex-model-providers.settings.ts +713 -0
- package/server/modules/settings/codex-model-providers.store.ts +244 -0
- package/server/modules/settings/index.ts +18 -0
- package/server/modules/settings/server-settings-file.ts +29 -41
- package/server/modules/settings/server-settings.ts +2 -3
- package/server/modules/settings/settings.module.ts +41 -0
- package/server/modules/settings/settings.routes.ts +37 -0
- package/server/modules/settings/settings.service.ts +21 -26
- package/server/modules/settings/tests/cockpit-session-start-settings.routes.test.ts +1 -0
- package/server/modules/settings/tests/codex-model-providers-settings.test.ts +413 -0
- package/server/modules/settings/tests/codex-provider-advanced.test.ts +540 -0
- package/server/modules/settings/tests/codex-provider-import.test.ts +621 -0
- package/server/modules/voice/tests/voice-lexicon.test.ts +10 -10
- package/server/modules/voice/voice-lexicon.ts +1 -1
- package/server/modules/websocket/services/chat-control.service.ts +35 -2
- package/server/modules/websocket/services/chat-websocket.service.ts +25 -1
- package/server/modules/websocket/tests/chat-background-task.test.ts +17 -1
- package/server/modules/websocket/tests/chat-stop-task.test.ts +17 -1
- package/server/modules/worktrees/services/worktree-list.service.ts +1 -1
- package/server/modules/worktrees/services/worktree-open.service.ts +1 -1
- package/server/modules/worktrees/services/worktree-remove.service.ts +1 -1
- package/server/shared/brand.ts +24 -38
- package/server/shared/data-root-migration.ts +3 -2
- package/server/shared/data-root.ts +73 -79
- package/server/shared/interfaces.ts +1 -1
- package/server/shared/mcp-contract/types.ts +20 -15
- package/server/shared/ports/codex-provider-registry.port.ts +133 -0
- package/server/shared/ports/session-blocked-events.port.ts +1 -1
- package/server/shared/ports/session-run-events.port.ts +2 -2
- package/server/shared/settings-file.ts +167 -6
- package/server/shared/tests/architecture-ratchet.baseline.json +15 -15
- package/server/shared/tests/cloudpit-brand-env.test.ts +106 -36
- package/server/shared/tests/cloudpit-data-root.test.ts +42 -18
- package/server/shared/tests/cloudpit-goal-exit-gate.baseline.json +6 -2
- package/server/shared/tests/cloudpit-goal-exit-gate.test.ts +179 -17
- package/server/shared/tests/cloudpit-runtime-flip.test.ts +162 -123
- package/server/shared/tests/frontend-import-cycle-budget.baseline.json +8 -6
- package/server/shared/tests/frontend-import-cycle-budget.test.ts +9 -1
- package/server/shared/tests/quay-test-script.test.ts +40 -6
- package/server/shared/tests/settings-file.test.ts +83 -1
- package/server/shared/types.ts +121 -8
- package/server/shared/utils.ts +1 -1
- package/dist/assets/channel-D7XqNTJC.js +0 -1
- package/dist/assets/channel-sbQyI1an.js +0 -1
- package/dist/assets/classDiagram-JCYQIIEL-DHudi-zH.js +0 -1
- package/dist/assets/classDiagram-JCYQIIEL-DV7ybJJG.js +0 -1
- package/dist/assets/classDiagram-v2-OCEON4UE-DHudi-zH.js +0 -1
- package/dist/assets/classDiagram-v2-OCEON4UE-DV7ybJJG.js +0 -1
- package/dist/assets/index-BsACp0s2.css +0 -32
- package/dist/assets/swimlanesDiagram-ULZ7WXOC-CNMNp6YA.js +0 -8
- package/dist/assets/swimlanesDiagram-ULZ7WXOC-DOjtDEUW.js +0 -8
- package/dist/icons/icon-128x128.svg +0 -12
- package/dist/icons/icon-144x144.svg +0 -12
- package/dist/icons/icon-152x152.svg +0 -12
- package/dist/icons/icon-192x192.svg +0 -12
- package/dist/icons/icon-384x384.svg +0 -12
- package/dist/icons/icon-512x512.svg +0 -12
- package/dist/icons/icon-72x72.svg +0 -12
- package/dist/icons/icon-96x96.svg +0 -12
- package/dist/icons/icon-template.svg +0 -12
|
@@ -182,7 +182,18 @@ type SendResult =
|
|
|
182
182
|
}
|
|
183
183
|
| {
|
|
184
184
|
ok: false;
|
|
185
|
-
code:
|
|
185
|
+
code:
|
|
186
|
+
| 'SESSION_NOT_FOUND'
|
|
187
|
+
| 'UNSUPPORTED_PROVIDER'
|
|
188
|
+
| 'RUN_IN_PROGRESS'
|
|
189
|
+
| 'FORBIDDEN'
|
|
190
|
+
// A send whose model would move the session to another upstream
|
|
191
|
+
// provider (`SESSION_PROVIDER_MISMATCH`), or whose model is bound to a
|
|
192
|
+
// provider that no longer exists (`SESSION_PROVIDER_UNKNOWN`). Both are
|
|
193
|
+
// decided by `dispatchRun` before it reserves a run and are handed back
|
|
194
|
+
// here rather than relabelled RUN_IN_PROGRESS.
|
|
195
|
+
| 'SESSION_PROVIDER_MISMATCH'
|
|
196
|
+
| 'SESSION_PROVIDER_UNKNOWN';
|
|
186
197
|
message: string;
|
|
187
198
|
};
|
|
188
199
|
|
|
@@ -658,6 +669,11 @@ export function createChatControlService(deps: ChatControlDependencies) {
|
|
|
658
669
|
resolveRunId = resolve;
|
|
659
670
|
});
|
|
660
671
|
let busyAccepted = false;
|
|
672
|
+
// The dispatch-level refusal (busy session, upstream-provider switch),
|
|
673
|
+
// remembered so the result can carry its real code: the race below only
|
|
674
|
+
// knows "the dispatch settled instead of registering a run". Held in an
|
|
675
|
+
// object because the only write happens inside the `onRefuse` callback.
|
|
676
|
+
const dispatchVerdict: { refusal: { code: string; message: string } | null } = { refusal: null };
|
|
661
677
|
|
|
662
678
|
// What the delivery-shaped answer needs, read BEFORE the dispatch: run=turn
|
|
663
679
|
// is the mode in which a send is a DELIVERY, and "would this session take a
|
|
@@ -703,7 +719,12 @@ export function createChatControlService(deps: ChatControlDependencies) {
|
|
|
703
719
|
// A run in progress is `dispatchRun`'s own refusal and it is decided
|
|
704
720
|
// before its first `await`, so the verdict can be handed back on this
|
|
705
721
|
// tick. `ws` is null above, so this is the only channel that reports it.
|
|
706
|
-
|
|
722
|
+
// Kept as well as forwarded, because the result below has to repeat the
|
|
723
|
+
// refusal's own code (a provider switch is not "busy").
|
|
724
|
+
(refusal) => {
|
|
725
|
+
dispatchVerdict.refusal = refusal;
|
|
726
|
+
input.onRefuse?.(refusal);
|
|
727
|
+
},
|
|
707
728
|
// The run's recorded origin. Derived from `caller.via` and passed
|
|
708
729
|
// explicitly because `ws`/connection are both null here: the
|
|
709
730
|
// connection-derived default cannot tell a WebSocket send from an MCP or
|
|
@@ -724,6 +745,18 @@ export function createChatControlService(deps: ChatControlDependencies) {
|
|
|
724
745
|
]);
|
|
725
746
|
|
|
726
747
|
if (!outcome.registered) {
|
|
748
|
+
// The refusal dispatchRun reported, when it is one this result's own
|
|
749
|
+
// vocabulary can state. Anything else (including no refusal at all) keeps
|
|
750
|
+
// the historical answer.
|
|
751
|
+
const refused = dispatchVerdict.refusal;
|
|
752
|
+
if (
|
|
753
|
+
refused !== null
|
|
754
|
+
&& (refused.code === 'RUN_IN_PROGRESS'
|
|
755
|
+
|| refused.code === 'SESSION_PROVIDER_MISMATCH'
|
|
756
|
+
|| refused.code === 'SESSION_PROVIDER_UNKNOWN')
|
|
757
|
+
) {
|
|
758
|
+
return { ok: false, code: refused.code, message: refused.message };
|
|
759
|
+
}
|
|
727
760
|
return {
|
|
728
761
|
ok: false,
|
|
729
762
|
code: 'RUN_IN_PROGRESS',
|
|
@@ -62,7 +62,7 @@ import type {
|
|
|
62
62
|
ProviderRuntimeWriter,
|
|
63
63
|
RealtimeClientConnection,
|
|
64
64
|
} from '@/shared/types.js';
|
|
65
|
-
import { parseIncomingJsonObject, residentRunIsTurn } from '@/shared/utils.js';
|
|
65
|
+
import { AppError, parseIncomingJsonObject, residentRunIsTurn } from '@/shared/utils.js';
|
|
66
66
|
|
|
67
67
|
/**
|
|
68
68
|
* Trust boundary for client-supplied image attachments: chat.send options come
|
|
@@ -861,6 +861,30 @@ export async function dispatchRun(
|
|
|
861
861
|
): Promise<{ started: boolean; error: string | null }> {
|
|
862
862
|
const provider = session.provider as LLMProvider;
|
|
863
863
|
|
|
864
|
+
// A session's upstream provider is part of what the provider started its
|
|
865
|
+
// thread with, and it cannot be moved to another one in place (Codex answers
|
|
866
|
+
// `modelProviderMismatch` on the turn; the thread is already bound). The
|
|
867
|
+
// switch is therefore refused HERE — before the run is reserved — because the
|
|
868
|
+
// recording write below (`setSessionModel`) refuses the same selection and
|
|
869
|
+
// runs after `startRun`: a throw there would leave a `running` run with no
|
|
870
|
+
// process behind it. Every send funnels through this function (`chat.send`
|
|
871
|
+
// and `chat.edit-send` alike), so this is the one admission gate. A session
|
|
872
|
+
// with no recorded binding — every session's first send — passes.
|
|
873
|
+
const requestedModel = (data.options as AnyRecord | undefined)?.model;
|
|
874
|
+
if (typeof requestedModel === 'string' && requestedModel.trim()) {
|
|
875
|
+
try {
|
|
876
|
+
providerModelsService.assertSessionProviderSwitch(provider, sessionId, requestedModel);
|
|
877
|
+
} catch (error) {
|
|
878
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
879
|
+
const code = error instanceof AppError ? error.code : 'SESSION_PROVIDER_MISMATCH';
|
|
880
|
+
if (ws) {
|
|
881
|
+
sendProtocolError(ws, code, message, sessionId);
|
|
882
|
+
}
|
|
883
|
+
onRefuse?.({ code, message });
|
|
884
|
+
return { started: false, error: message };
|
|
885
|
+
}
|
|
886
|
+
}
|
|
887
|
+
|
|
864
888
|
const runIsTurn = residentRunIsTurn();
|
|
865
889
|
// Whether a busy send from this provider would be taken by a process that is
|
|
866
890
|
// already running. Read once, before the probe, because run=turn makes two
|
|
@@ -706,12 +706,22 @@ test('the per-run runtime places backgroundTasks on the live instance and does n
|
|
|
706
706
|
const tempDirectory = await mkdtemp(path.join(os.tmpdir(), 'chat-background-task-per-run-'));
|
|
707
707
|
const savedHome = process.env.HOME;
|
|
708
708
|
const savedConfigDir = process.env.CLAUDE_CONFIG_DIR;
|
|
709
|
+
const savedDatabasePath = process.env.DATABASE_PATH;
|
|
709
710
|
const savedFactory = claudeQueryFactory.current;
|
|
710
711
|
const fixture = createPerRunFixture();
|
|
711
712
|
|
|
712
713
|
try {
|
|
714
|
+
// The run's wind-down reads its session row through the notifications path,
|
|
715
|
+
// so this leg needs a migrated database of its own: the ambient one may
|
|
716
|
+
// predate the latest added column, and a run must not depend on that.
|
|
717
|
+
closeConnection();
|
|
718
|
+
process.env.DATABASE_PATH = path.join(tempDirectory, 'auth.db');
|
|
713
719
|
process.env.HOME = tempDirectory;
|
|
714
720
|
process.env.CLAUDE_CONFIG_DIR = tempDirectory;
|
|
721
|
+
await initializeDatabase();
|
|
722
|
+
// A real user row, so the run's own wind-down can read its notification
|
|
723
|
+
// preferences without an FK failure (the SQLite foreign key is on user_id).
|
|
724
|
+
const user = userDb.createUser('background-task-per-run', 'unused-hash');
|
|
715
725
|
claudeQueryFactory.current = (() => fixture.factory()) as unknown as typeof claudeQueryFactory.current;
|
|
716
726
|
|
|
717
727
|
const appSessionId = PER_RUN_SESSION_ID;
|
|
@@ -720,7 +730,7 @@ test('the per-run runtime places backgroundTasks on the live instance and does n
|
|
|
720
730
|
void queryClaudeSDK(
|
|
721
731
|
'hold',
|
|
722
732
|
{ sessionId: appSessionId },
|
|
723
|
-
|
|
733
|
+
{ send: () => undefined, setSessionId: () => undefined, userId: Number(user.id) },
|
|
724
734
|
RUNTIME_CONTEXT,
|
|
725
735
|
);
|
|
726
736
|
|
|
@@ -758,6 +768,12 @@ test('the per-run runtime places backgroundTasks on the live instance and does n
|
|
|
758
768
|
if (getActiveClaudeSDKSessions().includes(PER_RUN_SESSION_ID)) {
|
|
759
769
|
await abortClaudeSDKSession(PER_RUN_SESSION_ID);
|
|
760
770
|
}
|
|
771
|
+
if (savedDatabasePath === undefined) {
|
|
772
|
+
delete process.env.DATABASE_PATH;
|
|
773
|
+
} else {
|
|
774
|
+
process.env.DATABASE_PATH = savedDatabasePath;
|
|
775
|
+
}
|
|
776
|
+
closeConnection();
|
|
761
777
|
await rm(tempDirectory, { recursive: true, force: true });
|
|
762
778
|
}
|
|
763
779
|
});
|
|
@@ -668,12 +668,22 @@ test('the per-run runtime places stopTask on the live instance and does not end
|
|
|
668
668
|
const tempDirectory = await mkdtemp(path.join(os.tmpdir(), 'chat-stop-task-per-run-'));
|
|
669
669
|
const savedHome = process.env.HOME;
|
|
670
670
|
const savedConfigDir = process.env.CLAUDE_CONFIG_DIR;
|
|
671
|
+
const savedDatabasePath = process.env.DATABASE_PATH;
|
|
671
672
|
const savedFactory = claudeQueryFactory.current;
|
|
672
673
|
const fixture = createPerRunFixture();
|
|
673
674
|
|
|
674
675
|
try {
|
|
676
|
+
// The run's wind-down reads its session row through the notifications path,
|
|
677
|
+
// so this leg needs a migrated database of its own: the ambient one may
|
|
678
|
+
// predate the latest added column, and a run must not depend on that.
|
|
679
|
+
closeConnection();
|
|
680
|
+
process.env.DATABASE_PATH = path.join(tempDirectory, 'auth.db');
|
|
675
681
|
process.env.HOME = tempDirectory;
|
|
676
682
|
process.env.CLAUDE_CONFIG_DIR = tempDirectory;
|
|
683
|
+
await initializeDatabase();
|
|
684
|
+
// A real user row, so the run's own wind-down can read its notification
|
|
685
|
+
// preferences without an FK failure (the SQLite foreign key is on user_id).
|
|
686
|
+
const user = userDb.createUser('stop-task-per-run', 'unused-hash');
|
|
677
687
|
claudeQueryFactory.current = (() => fixture.factory()) as unknown as typeof claudeQueryFactory.current;
|
|
678
688
|
|
|
679
689
|
const appSessionId = PER_RUN_SESSION_ID;
|
|
@@ -682,7 +692,7 @@ test('the per-run runtime places stopTask on the live instance and does not end
|
|
|
682
692
|
void queryClaudeSDK(
|
|
683
693
|
'hold',
|
|
684
694
|
{ sessionId: appSessionId },
|
|
685
|
-
|
|
695
|
+
{ send: () => undefined, setSessionId: () => undefined, userId: Number(user.id) },
|
|
686
696
|
{
|
|
687
697
|
resolveProviderSessionId: () => null,
|
|
688
698
|
resolveResumeModel: async () => undefined,
|
|
@@ -722,6 +732,12 @@ test('the per-run runtime places stopTask on the live instance and does not end
|
|
|
722
732
|
if (getActiveClaudeSDKSessions().includes(PER_RUN_SESSION_ID)) {
|
|
723
733
|
await abortClaudeSDKSession(PER_RUN_SESSION_ID);
|
|
724
734
|
}
|
|
735
|
+
if (savedDatabasePath === undefined) {
|
|
736
|
+
delete process.env.DATABASE_PATH;
|
|
737
|
+
} else {
|
|
738
|
+
process.env.DATABASE_PATH = savedDatabasePath;
|
|
739
|
+
}
|
|
740
|
+
closeConnection();
|
|
725
741
|
await rm(tempDirectory, { recursive: true, force: true });
|
|
726
742
|
}
|
|
727
743
|
});
|
|
@@ -89,7 +89,7 @@ async function readLastCommit(
|
|
|
89
89
|
/**
|
|
90
90
|
* Builds the full Worktrees panel payload for the repository containing
|
|
91
91
|
* `projectPath`: every worktree with dirty count, ahead/behind vs the base
|
|
92
|
-
* branch, last commit info, and the linked
|
|
92
|
+
* branch, last commit info, and the linked Cloudpit project (when registered).
|
|
93
93
|
*/
|
|
94
94
|
export async function listWorktrees(
|
|
95
95
|
input: ListWorktreesInput,
|
|
@@ -26,7 +26,7 @@ function mapRowToProjectView(row: ProjectRepositoryRow): WorktreeProjectView {
|
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
/**
|
|
29
|
-
* Ensures a
|
|
29
|
+
* Ensures a Cloudpit project exists (and is active) for a worktree directory
|
|
30
30
|
* and returns it, so the caller can switch the UI into that worktree.
|
|
31
31
|
*
|
|
32
32
|
* The path is only accepted when it is a registered worktree of the repository
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
15
|
* Removes a linked worktree (never the main one), optionally deletes its
|
|
16
|
-
* branch, and archives the
|
|
16
|
+
* branch, and archives the Cloudpit project registered for the directory so it
|
|
17
17
|
* disappears from the sidebar while its chat history stays recoverable.
|
|
18
18
|
*/
|
|
19
19
|
export async function removeWorktree(
|
package/server/shared/brand.ts
CHANGED
|
@@ -1,24 +1,31 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Brand-owned environment variables, read under the
|
|
3
|
-
* fallback to the legacy CloudCLI names.
|
|
2
|
+
* Brand-owned environment variables, read under the Cloudpit spelling only.
|
|
4
3
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
4
|
+
* v3.0 RETIREMENT. Up to 2.x this reader also accepted the legacy `CLOUDCLI_<NAME>`
|
|
5
|
+
* spelling and emitted one deprecation warning per legacy key. The runtime fallback is
|
|
6
|
+
* gone: a process that exports only `CLOUDCLI_<NAME>` reads as absent, so the caller's
|
|
7
|
+
* shipped default applies. Setting the legacy name is not an error and produces no
|
|
8
|
+
* warning — it is simply not consulted.
|
|
9
|
+
*
|
|
10
|
+
* There is no `warn` dependency any more: every reading is either the canonical key's
|
|
11
|
+
* value or absent, so the reader has nothing to report. Callers that still pass a
|
|
12
|
+
* warning sink would be compiling against the retired API, hence the narrower shape.
|
|
13
|
+
*
|
|
14
|
+
* The production wiring points (Electron main/localServer/serverInstaller, the
|
|
15
|
+
* browser-use service and its MCP entry) all read through this module, and
|
|
16
|
+
* `electron/brandEnv.js` carries the same semantics for the Electron runtime.
|
|
9
17
|
*/
|
|
10
18
|
|
|
11
19
|
/** Which spelling an environment read resolved through. */
|
|
12
|
-
export type BrandEnvSource = 'new' | '
|
|
20
|
+
export type BrandEnvSource = 'new' | 'absent';
|
|
13
21
|
|
|
14
22
|
/**
|
|
15
23
|
* One resolved environment read.
|
|
16
24
|
*
|
|
17
25
|
* `value` is `undefined` only for `source: 'absent'`; an empty string is never
|
|
18
26
|
* returned as a value, because `.env` files routinely carry `NAME=` and that
|
|
19
|
-
* must not read as an enabled setting. `key` is the
|
|
20
|
-
*
|
|
21
|
-
* nothing was set.
|
|
27
|
+
* must not read as an enabled setting. `key` is always the canonical
|
|
28
|
+
* `CLOUDPIT_…` spelling the operator should set.
|
|
22
29
|
*/
|
|
23
30
|
export type BrandEnvReading = {
|
|
24
31
|
value: string | undefined;
|
|
@@ -26,35 +33,25 @@ export type BrandEnvReading = {
|
|
|
26
33
|
key: string;
|
|
27
34
|
};
|
|
28
35
|
|
|
29
|
-
/** Dependencies of {@link createBrandEnvReader};
|
|
36
|
+
/** Dependencies of {@link createBrandEnvReader}; injectable so the reader is testable. */
|
|
30
37
|
export type BrandEnvReaderDeps = {
|
|
31
38
|
/** The environment to read (typically `process.env`). */
|
|
32
39
|
env: Readonly<Record<string, string | undefined>>;
|
|
33
|
-
/** Called once per legacy key that is actually used. */
|
|
34
|
-
warn: (message: string) => void;
|
|
35
40
|
};
|
|
36
41
|
|
|
37
|
-
/** A reader bound to one environment
|
|
42
|
+
/** A reader bound to one environment. */
|
|
38
43
|
export type BrandEnvReader = {
|
|
39
|
-
/**
|
|
40
|
-
* Read `<NAME>`: `CLOUDPIT_<NAME>` wins, then `CLOUDCLI_<NAME>`, then absent.
|
|
41
|
-
*
|
|
42
|
-
* Using the legacy spelling emits one warning for that key on this reader;
|
|
43
|
-
* a second read of the same key stays silent. Separate readers keep separate
|
|
44
|
-
* warning state, so draining one does not silence a sibling.
|
|
45
|
-
*/
|
|
44
|
+
/** Read `CLOUDPIT_<NAME>`; anything else (including `CLOUDCLI_<NAME>`) reads absent. */
|
|
46
45
|
read: (name: string) => BrandEnvReading;
|
|
47
46
|
};
|
|
48
47
|
|
|
49
48
|
/**
|
|
50
49
|
* Build a brand environment reader.
|
|
51
50
|
*
|
|
52
|
-
* The
|
|
53
|
-
*
|
|
51
|
+
* The reader holds no state: the canonical spelling either supplies a non-empty value
|
|
52
|
+
* or the reading is absent. A legacy `CLOUDCLI_<NAME>` is never consulted.
|
|
54
53
|
*/
|
|
55
|
-
export function createBrandEnvReader({ env
|
|
56
|
-
const warnedLegacyKeys = new Set<string>();
|
|
57
|
-
|
|
54
|
+
export function createBrandEnvReader({ env }: BrandEnvReaderDeps): BrandEnvReader {
|
|
58
55
|
return {
|
|
59
56
|
read(name) {
|
|
60
57
|
const canonicalKey = `CLOUDPIT_${name}`;
|
|
@@ -62,18 +59,7 @@ export function createBrandEnvReader({ env, warn }: BrandEnvReaderDeps): BrandEn
|
|
|
62
59
|
if (canonical !== undefined && canonical !== '') {
|
|
63
60
|
return { value: canonical, source: 'new', key: canonicalKey };
|
|
64
61
|
}
|
|
65
|
-
|
|
66
|
-
const legacyKey = `CLOUDCLI_${name}`;
|
|
67
|
-
const legacy = env[legacyKey];
|
|
68
|
-
if (legacy === undefined || legacy === '') {
|
|
69
|
-
return { value: undefined, source: 'absent', key: canonicalKey };
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
if (!warnedLegacyKeys.has(legacyKey)) {
|
|
73
|
-
warnedLegacyKeys.add(legacyKey);
|
|
74
|
-
warn(`${legacyKey} is deprecated; set ${canonicalKey} instead.`);
|
|
75
|
-
}
|
|
76
|
-
return { value: legacy, source: 'legacy', key: legacyKey };
|
|
62
|
+
return { value: undefined, source: 'absent', key: canonicalKey };
|
|
77
63
|
},
|
|
78
64
|
};
|
|
79
65
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Copies a legacy
|
|
2
|
+
* Copies a legacy Cloudpit data root into an explicitly requested Cloudpit data
|
|
3
3
|
* root.
|
|
4
4
|
*
|
|
5
5
|
* WHY THIS FINISHES BEFORE THE MARKER. A half-copied data root must never read
|
|
@@ -7,7 +7,8 @@
|
|
|
7
7
|
* presence is the single fact that means "every earlier step succeeded". The
|
|
8
8
|
* legacy root is only ever read — it is never renamed, unlinked, checkpointed
|
|
9
9
|
* or written to, so a failed attempt (including an occupied SQLite database)
|
|
10
|
-
* leaves it exactly as it was
|
|
10
|
+
* leaves it exactly as it was. v3.0 does NOT fall back to it at runtime: the
|
|
11
|
+
* caller reports the thrown failure instead.
|
|
11
12
|
*
|
|
12
13
|
* ROLLBACK ON FAILURE. Every file and directory this module creates is recorded
|
|
13
14
|
* before it is written and removed in reverse order when any step throws. The
|
|
@@ -1,19 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Resolve where the server's data lives, and migrate a legacy layout when the
|
|
3
|
-
*
|
|
3
|
+
* Cloudpit default (or an explicit root) is selected.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* asks for: with no explicit environment root it selects `<home>/.cloudpit`,
|
|
10
|
-
* copies the legacy layout into it once, and falls back to the legacy root when
|
|
11
|
-
* the copy fails. An explicitly requested root always takes the migration path.
|
|
5
|
+
* v3.0 RETIREMENT. Up to 2.x the resolver had two default modes: `defaultRoot:
|
|
6
|
+
* 'legacy'` kept the historical `~/.cloudcli` layout, and any migration failure
|
|
7
|
+
* fell back to that layout so the server always kept running. Both runtime
|
|
8
|
+
* compatibilities are gone:
|
|
12
9
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
10
|
+
* - there is ONE default root, `<home>/.cloudpit`, selected when neither
|
|
11
|
+
* `CLOUDPIT_HOME` nor an explicit caller root is set;
|
|
12
|
+
* - the one-time migration still runs when a legacy `~/.cloudcli` layout exists
|
|
13
|
+
* (a machine upgrading straight from 1.x is copied into `~/.cloudpit`), but a
|
|
14
|
+
* failed migration is REPORTED, never silently swallowed by reverting to the
|
|
15
|
+
* old root. `resolveDataRoots` returns `reason: 'migration-failed'` and a
|
|
16
|
+
* `migrationError` message; the caller logs it and keeps the Cloudpit root.
|
|
17
|
+
*
|
|
18
|
+
* The legacy root is only ever READ: `data-root-migration.ts` rolls back every
|
|
19
|
+
* file it created, so a failed attempt leaves `~/.cloudcli` byte-identical and
|
|
20
|
+
* never deletes it. An explicitly requested root always takes the migration path.
|
|
17
21
|
*/
|
|
18
22
|
import os from 'node:os';
|
|
19
23
|
import path from 'node:path';
|
|
@@ -24,13 +28,8 @@ import {
|
|
|
24
28
|
type DataRootFs,
|
|
25
29
|
} from './data-root-migration.js';
|
|
26
30
|
|
|
27
|
-
/** Which default root the caller wants when no explicit environment root is set. */
|
|
28
|
-
export type DataRootMode = 'legacy' | 'cloudpit';
|
|
29
|
-
|
|
30
31
|
/** Why {@link resolveDataRoots} selected the root it returned. */
|
|
31
32
|
export type DataRootReason =
|
|
32
|
-
/** No explicit root was requested and the caller asked for the legacy default. */
|
|
33
|
-
| 'default-legacy'
|
|
34
33
|
/** The Cloudpit default was selected and the legacy layout was copied into it. */
|
|
35
34
|
| 'default-migrated'
|
|
36
35
|
/** The Cloudpit default already carries a completion marker. */
|
|
@@ -47,8 +46,8 @@ export type DataRootReason =
|
|
|
47
46
|
| 'explicit-user-root'
|
|
48
47
|
/** The explicit root was requested but there was no legacy layout to copy. */
|
|
49
48
|
| 'explicit-no-legacy'
|
|
50
|
-
/**
|
|
51
|
-
| '
|
|
49
|
+
/** The migration threw; the Cloudpit root stays active and the error is reported. */
|
|
50
|
+
| 'migration-failed';
|
|
52
51
|
|
|
53
52
|
/**
|
|
54
53
|
* The resolved data locations. Every path is derived from `activeRoot` and the
|
|
@@ -67,12 +66,18 @@ export type ResolvedDataRoots = {
|
|
|
67
66
|
replySuggestionsUsagePath: string;
|
|
68
67
|
/** The settings file for the active mode. */
|
|
69
68
|
settingsPath: string;
|
|
70
|
-
/** The legacy settings file,
|
|
69
|
+
/** The legacy settings file, kept as the one-time migration source. */
|
|
71
70
|
legacySettingsPath: string;
|
|
72
71
|
/** Which of the documented cases this resolution took. */
|
|
73
72
|
reason: DataRootReason;
|
|
74
|
-
/** True only when this call copied the legacy layout into the
|
|
73
|
+
/** True only when this call copied the legacy layout into the active root. */
|
|
75
74
|
migrated: boolean;
|
|
75
|
+
/**
|
|
76
|
+
* The migration failure message when `reason` is `'migration-failed'`, else
|
|
77
|
+
* `null`. The caller must surface it (the boot logs it) — v3.0 does not fall
|
|
78
|
+
* back to the legacy root.
|
|
79
|
+
*/
|
|
80
|
+
migrationError: string | null;
|
|
76
81
|
};
|
|
77
82
|
|
|
78
83
|
/** Dependencies of {@link resolveDataRoots}; all injectable so it is testable. */
|
|
@@ -81,11 +86,6 @@ export type ResolveDataRootsOptions = {
|
|
|
81
86
|
env?: Readonly<Record<string, string | undefined>>;
|
|
82
87
|
/** The home `~` expands against; defaults to the process home. */
|
|
83
88
|
homeDir?: string;
|
|
84
|
-
/**
|
|
85
|
-
* Which default root to use when no explicit environment root is set.
|
|
86
|
-
* Defaults to `'legacy'`, so existing callers keep the historical layout.
|
|
87
|
-
*/
|
|
88
|
-
defaultRoot?: DataRootMode;
|
|
89
89
|
/** The filesystem seam; defaults to `node:fs`. */
|
|
90
90
|
fs?: DataRootFs;
|
|
91
91
|
/** The SQLite snapshot seam; defaults to a readonly `VACUUM INTO`. */
|
|
@@ -136,17 +136,29 @@ function expandTildePrefix(value: string, homeDir: string): string {
|
|
|
136
136
|
return value;
|
|
137
137
|
}
|
|
138
138
|
|
|
139
|
-
/**
|
|
139
|
+
/**
|
|
140
|
+
* Format a migration failure without importing `shared/utils.ts`: that module
|
|
141
|
+
* reads environment defaults during evaluation, before `load-env.ts` has loaded
|
|
142
|
+
* `.env`, which is exactly the ordering this bootstrap module must not disturb.
|
|
143
|
+
*/
|
|
144
|
+
function describeFailure(failure: unknown): string {
|
|
145
|
+
return failure instanceof Error ? failure.message : String(failure);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* The explicit-root environment value, with `~` expanded.
|
|
150
|
+
*
|
|
151
|
+
* v3.0: only `CLOUDPIT_HOME` is consulted. The legacy `CLOUDCLI_HOME` spelling no
|
|
152
|
+
* longer selects a root, so a process exporting only that name migrates into the
|
|
153
|
+
* default `~/.cloudpit` instead of writing to the old location.
|
|
154
|
+
*/
|
|
140
155
|
function readExplicitRoot(
|
|
141
156
|
env: Readonly<Record<string, string | undefined>>,
|
|
142
157
|
homeDir: string,
|
|
143
158
|
): string | null {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
if (typeof rawValue === 'string' && rawValue.trim() !== '') {
|
|
148
|
-
return expandTildePrefix(rawValue.trim(), homeDir);
|
|
149
|
-
}
|
|
159
|
+
const rawValue = env.CLOUDPIT_HOME;
|
|
160
|
+
if (typeof rawValue === 'string' && rawValue.trim() !== '') {
|
|
161
|
+
return expandTildePrefix(rawValue.trim(), homeDir);
|
|
150
162
|
}
|
|
151
163
|
return null;
|
|
152
164
|
}
|
|
@@ -158,6 +170,7 @@ function buildResolvedRoots(
|
|
|
158
170
|
legacySettingsPath: string,
|
|
159
171
|
reason: DataRootReason,
|
|
160
172
|
migrated: boolean,
|
|
173
|
+
migrationError: string | null = null,
|
|
161
174
|
): ResolvedDataRoots {
|
|
162
175
|
return {
|
|
163
176
|
activeRoot,
|
|
@@ -169,6 +182,7 @@ function buildResolvedRoots(
|
|
|
169
182
|
legacySettingsPath,
|
|
170
183
|
reason,
|
|
171
184
|
migrated,
|
|
185
|
+
migrationError,
|
|
172
186
|
};
|
|
173
187
|
}
|
|
174
188
|
|
|
@@ -201,18 +215,20 @@ function defaultReason(outcome: ReturnType<typeof migrateLegacyDataRoot>): DataR
|
|
|
201
215
|
}
|
|
202
216
|
|
|
203
217
|
/**
|
|
204
|
-
* Resolve the active data root and
|
|
205
|
-
*
|
|
218
|
+
* Resolve the active data root and migrate the legacy layout into it when it is
|
|
219
|
+
* safe to do so.
|
|
206
220
|
*
|
|
207
|
-
* The
|
|
208
|
-
*
|
|
209
|
-
*
|
|
210
|
-
*
|
|
221
|
+
* The active root is `CLOUDPIT_HOME` when it names one, else `<home>/.cloudpit`.
|
|
222
|
+
* The settings location is always `<home>/.config/cloudpit/server.settings.json`
|
|
223
|
+
* (the legacy settings file is only a migration source).
|
|
224
|
+
*
|
|
225
|
+
* A failed migration does not change the active root: the resolver returns
|
|
226
|
+
* `reason: 'migration-failed'` with the thrown message in `migrationError`. The
|
|
227
|
+
* legacy root is left byte-identical by the migration module's rollback.
|
|
211
228
|
*/
|
|
212
229
|
export function resolveDataRoots(options: ResolveDataRootsOptions = {}): ResolvedDataRoots {
|
|
213
230
|
const env = options.env ?? process.env;
|
|
214
231
|
const homeDir = options.homeDir ?? os.homedir();
|
|
215
|
-
const mode: DataRootMode = options.defaultRoot ?? 'legacy';
|
|
216
232
|
const legacyRoot = path.join(homeDir, LEGACY_ROOT_DIRECTORY_NAME);
|
|
217
233
|
const legacySettingsPath = path.join(
|
|
218
234
|
homeDir,
|
|
@@ -228,43 +244,14 @@ export function resolveDataRoots(options: ResolveDataRootsOptions = {}): Resolve
|
|
|
228
244
|
);
|
|
229
245
|
|
|
230
246
|
const requestedRoot = readExplicitRoot(env, homeDir);
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
// The Cloudpit default: migrate into `<home>/.cloudpit` exactly as an
|
|
237
|
-
// explicitly requested root would, with reasons that name this mode.
|
|
238
|
-
const cloudpitRoot = path.join(homeDir, CLOUDPIT_ROOT_DIRECTORY_NAME);
|
|
239
|
-
try {
|
|
240
|
-
const outcome = migrateLegacyDataRoot({
|
|
241
|
-
legacyRoot,
|
|
242
|
-
newRoot: cloudpitRoot,
|
|
243
|
-
legacySettingsPath,
|
|
244
|
-
newSettingsPath: explicitSettingsPath,
|
|
245
|
-
version: options.version ?? 'unknown',
|
|
246
|
-
fs: options.fs,
|
|
247
|
-
backupDatabase: options.backupDatabase,
|
|
248
|
-
now: options.now,
|
|
249
|
-
});
|
|
250
|
-
return buildResolvedRoots(
|
|
251
|
-
cloudpitRoot,
|
|
252
|
-
explicitSettingsPath,
|
|
253
|
-
legacySettingsPath,
|
|
254
|
-
defaultReason(outcome),
|
|
255
|
-
outcome.migrated,
|
|
256
|
-
);
|
|
257
|
-
} catch {
|
|
258
|
-
// The migration module rolled back everything it created; the legacy root
|
|
259
|
-
// was only ever read, so keeping it active is the safe outcome.
|
|
260
|
-
return buildResolvedRoots(legacyRoot, legacySettingsPath, legacySettingsPath, 'fallback-after-failure', false);
|
|
261
|
-
}
|
|
262
|
-
}
|
|
247
|
+
const explicit = requestedRoot !== null;
|
|
248
|
+
const activeRoot = requestedRoot ?? path.join(homeDir, CLOUDPIT_ROOT_DIRECTORY_NAME);
|
|
249
|
+
const reasonOf = explicit ? explicitReason : defaultReason;
|
|
263
250
|
|
|
264
251
|
try {
|
|
265
252
|
const outcome = migrateLegacyDataRoot({
|
|
266
253
|
legacyRoot,
|
|
267
|
-
newRoot:
|
|
254
|
+
newRoot: activeRoot,
|
|
268
255
|
legacySettingsPath,
|
|
269
256
|
newSettingsPath: explicitSettingsPath,
|
|
270
257
|
version: options.version ?? 'unknown',
|
|
@@ -273,15 +260,22 @@ export function resolveDataRoots(options: ResolveDataRootsOptions = {}): Resolve
|
|
|
273
260
|
now: options.now,
|
|
274
261
|
});
|
|
275
262
|
return buildResolvedRoots(
|
|
276
|
-
|
|
263
|
+
activeRoot,
|
|
277
264
|
explicitSettingsPath,
|
|
278
265
|
legacySettingsPath,
|
|
279
|
-
|
|
266
|
+
reasonOf(outcome),
|
|
280
267
|
outcome.migrated,
|
|
281
268
|
);
|
|
282
|
-
} catch {
|
|
283
|
-
// The migration module
|
|
284
|
-
//
|
|
285
|
-
return buildResolvedRoots(
|
|
269
|
+
} catch (failure) {
|
|
270
|
+
// v3.0: no fallback to the legacy root. The migration module rolled back every
|
|
271
|
+
// file it created, so the Cloudpit root is clean; the caller sees the failure.
|
|
272
|
+
return buildResolvedRoots(
|
|
273
|
+
activeRoot,
|
|
274
|
+
explicitSettingsPath,
|
|
275
|
+
legacySettingsPath,
|
|
276
|
+
'migration-failed',
|
|
277
|
+
false,
|
|
278
|
+
describeFailure(failure),
|
|
279
|
+
);
|
|
286
280
|
}
|
|
287
281
|
}
|
|
@@ -516,7 +516,7 @@ export interface IProviderFork {
|
|
|
516
516
|
/**
|
|
517
517
|
* Model catalog contract for one provider.
|
|
518
518
|
*
|
|
519
|
-
* Implementations supply
|
|
519
|
+
* Implementations supply Cloudpit's curated predefined models and can inspect
|
|
520
520
|
* provider-native session state. The Providers service merges these immutable
|
|
521
521
|
* source-controlled definitions with user-created SQLite rows at read time.
|
|
522
522
|
*/
|