@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
|
@@ -14,14 +14,36 @@ import type {
|
|
|
14
14
|
ProviderModelsDefinition,
|
|
15
15
|
ProviderSessionModel,
|
|
16
16
|
} from '@/shared/types.js';
|
|
17
|
+
import {
|
|
18
|
+
readCodexProviderRegistryPort,
|
|
19
|
+
type CodexProviderRegistryReading,
|
|
20
|
+
} from '@/shared/ports/codex-provider-registry.port.js';
|
|
17
21
|
import { AppError } from '@/shared/utils.js';
|
|
18
22
|
|
|
23
|
+
import {
|
|
24
|
+
createSessionModelResolver,
|
|
25
|
+
type RecordedSessionSelection,
|
|
26
|
+
} from './session-model-resolver.js';
|
|
27
|
+
import {
|
|
28
|
+
assertProviderAvailable,
|
|
29
|
+
assertProviderSwitchAllowed,
|
|
30
|
+
readRecordedProviderBinding,
|
|
31
|
+
resolveModelProviderId,
|
|
32
|
+
} from './session-provider-binding.js';
|
|
33
|
+
|
|
19
34
|
/** Session-row access the service needs, narrowed so tests can stub it. */
|
|
20
35
|
type ProviderModelsSessionStore = {
|
|
21
36
|
getSessionById(
|
|
22
37
|
sessionId: string,
|
|
23
|
-
): {
|
|
38
|
+
): {
|
|
39
|
+
model: string | null;
|
|
40
|
+
effort: string | null;
|
|
41
|
+
permission_mode: string | null;
|
|
42
|
+
model_provider_id?: string | null;
|
|
43
|
+
} | null;
|
|
24
44
|
setSessionModel(sessionId: string, model: string): void;
|
|
45
|
+
/** Returns false when the row already carries a binding (the column is write-once). */
|
|
46
|
+
setSessionModelProviderId(sessionId: string, modelProviderId: string): boolean;
|
|
25
47
|
setSessionEffort(sessionId: string, effort: string): void;
|
|
26
48
|
/** Returns false when no session row matched. */
|
|
27
49
|
setSessionPermissionMode(sessionId: string, permissionMode: string): boolean;
|
|
@@ -38,10 +60,21 @@ type ProviderModelsCatalogStore = Pick<
|
|
|
38
60
|
| 'deleteCustomProviderModel'
|
|
39
61
|
>;
|
|
40
62
|
|
|
63
|
+
/**
|
|
64
|
+
* The Codex provider registry reading a model write validates against.
|
|
65
|
+
*
|
|
66
|
+
* `null` means no registry is wired (a focused criterion that injected no fake);
|
|
67
|
+
* the service then refuses a declared `codexProviderId` instead of guessing.
|
|
68
|
+
*/
|
|
69
|
+
type ProviderModelsCodexProviders = {
|
|
70
|
+
read(): CodexProviderRegistryReading | null;
|
|
71
|
+
};
|
|
72
|
+
|
|
41
73
|
type ProviderModelsServiceDependencies = {
|
|
42
74
|
resolveProvider?: (provider: LLMProvider) => Pick<IProvider, 'models'>;
|
|
43
75
|
catalog?: ProviderModelsCatalogStore;
|
|
44
76
|
sessions?: ProviderModelsSessionStore;
|
|
77
|
+
codexProviders?: ProviderModelsCodexProviders;
|
|
45
78
|
};
|
|
46
79
|
|
|
47
80
|
/**
|
|
@@ -52,6 +85,7 @@ const toPublicConfig = (config: ProviderModelConfig | null): ProviderModelPublic
|
|
|
52
85
|
config === null
|
|
53
86
|
? null
|
|
54
87
|
: {
|
|
88
|
+
...(config.codexProviderId === undefined ? {} : { codexProviderId: config.codexProviderId }),
|
|
55
89
|
env: config.env.map((row) => {
|
|
56
90
|
if (row.kind === 'secret') {
|
|
57
91
|
return { key: row.key, kind: 'secret' as const, isSet: true as const };
|
|
@@ -64,15 +98,26 @@ const toPublicConfig = (config: ProviderModelConfig | null): ProviderModelPublic
|
|
|
64
98
|
}
|
|
65
99
|
);
|
|
66
100
|
|
|
101
|
+
/**
|
|
102
|
+
* The picker row for one custom model.
|
|
103
|
+
*
|
|
104
|
+
* A model bound to a project Codex provider carries the provider id in its label
|
|
105
|
+
* (`model · provider`) so two entries with the same display name — one bound to
|
|
106
|
+
* each endpoint — stay distinguishable in the merged catalog. An entry with no
|
|
107
|
+
* binding keeps its bare name: it inherits the Codex global default.
|
|
108
|
+
*/
|
|
67
109
|
const toCustomProviderModelOption = (
|
|
68
110
|
record: CustomProviderModelRecord,
|
|
69
|
-
): ProviderModelOption =>
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
111
|
+
): ProviderModelOption => {
|
|
112
|
+
const providerId = record.config?.codexProviderId;
|
|
113
|
+
return {
|
|
114
|
+
value: record.modelId,
|
|
115
|
+
label: providerId === undefined ? record.model : `${record.model} · ${providerId}`,
|
|
116
|
+
recordId: record.recordId,
|
|
117
|
+
isCustom: true,
|
|
118
|
+
config: toPublicConfig(record.config),
|
|
119
|
+
};
|
|
120
|
+
};
|
|
76
121
|
|
|
77
122
|
const mergeProviderModels = (
|
|
78
123
|
predefined: ProviderModelsDefinition,
|
|
@@ -120,15 +165,42 @@ const resolveSecretRows = (
|
|
|
120
165
|
}
|
|
121
166
|
env.push({ key: row.key, kind: 'secret', value: kept.value });
|
|
122
167
|
}
|
|
123
|
-
return {
|
|
168
|
+
return {
|
|
169
|
+
...(config.codexProviderId === undefined ? {} : { codexProviderId: config.codexProviderId }),
|
|
170
|
+
env,
|
|
171
|
+
};
|
|
124
172
|
};
|
|
125
173
|
|
|
126
174
|
/**
|
|
127
|
-
*
|
|
128
|
-
*
|
|
129
|
-
*
|
|
175
|
+
* Reads the Codex provider registry once for the write that is about to happen.
|
|
176
|
+
*
|
|
177
|
+
* The thunk is only invoked when a config actually declares `codexProviderId`,
|
|
178
|
+
* so an ordinary Claude/Codex row that inherits the Codex default never touches
|
|
179
|
+
* the settings file.
|
|
180
|
+
*/
|
|
181
|
+
const readInstalledCodexProviders = (): CodexProviderRegistryReading | null =>
|
|
182
|
+
readCodexProviderRegistryPort()?.read() ?? null;
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Semantic validation of a model's env rows and its upstream-provider binding.
|
|
186
|
+
*
|
|
187
|
+
* Env rows: allowlisted keys (the same function launch profiles use), one row
|
|
188
|
+
* per key, and `value` present exactly when the kind carries one.
|
|
189
|
+
*
|
|
190
|
+
* `codexProviderId`: a declared id must name a provider the project registry
|
|
191
|
+
* defines (or one Codex reserves for its built-ins). A missing registry, an
|
|
192
|
+
* unknown id, or an id that was deleted since the entry was written is refused
|
|
193
|
+
* with a readable 409 carrying the id; nothing is persisted. An undeclared id
|
|
194
|
+
* is left out entirely, which is the "inherit the Codex global default" path
|
|
195
|
+
* every pre-existing row takes.
|
|
196
|
+
*
|
|
197
|
+
* Rejected config is never persisted: every caller validates before it touches
|
|
198
|
+
* the catalog.
|
|
130
199
|
*/
|
|
131
|
-
const validateModelConfig = (
|
|
200
|
+
const validateModelConfig = (
|
|
201
|
+
config: ProviderModelConfig,
|
|
202
|
+
readRegistry: () => CodexProviderRegistryReading | null,
|
|
203
|
+
): ProviderModelConfig => {
|
|
132
204
|
const seen = new Set<string>();
|
|
133
205
|
for (const row of config.env) {
|
|
134
206
|
if (!isAllowedLaunchEnvKey(row.key)) {
|
|
@@ -142,12 +214,37 @@ const validateModelConfig = (config: ProviderModelConfig): ProviderModelConfig =
|
|
|
142
214
|
throw invalidConfig(`Environment variable ${row.key} has an invalid value for kind ${row.kind}.`);
|
|
143
215
|
}
|
|
144
216
|
}
|
|
145
|
-
|
|
217
|
+
|
|
218
|
+
if (config.codexProviderId === undefined) {
|
|
219
|
+
return config;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
const codexProviderId = config.codexProviderId.trim();
|
|
223
|
+
if (!codexProviderId) {
|
|
224
|
+
throw invalidConfig('codexProviderId must name a provider.');
|
|
225
|
+
}
|
|
226
|
+
const registry = readRegistry();
|
|
227
|
+
const known = registry !== null && (
|
|
228
|
+
registry.reservedIds.includes(codexProviderId)
|
|
229
|
+
|| registry.providers.some((provider) => provider.id === codexProviderId)
|
|
230
|
+
);
|
|
231
|
+
if (!known) {
|
|
232
|
+
throw new AppError(
|
|
233
|
+
`Codex provider "${codexProviderId}" does not exist; save it in the Codex provider settings or omit codexProviderId to inherit the Codex default.`,
|
|
234
|
+
{
|
|
235
|
+
code: 'CODEX_PROVIDER_UNKNOWN',
|
|
236
|
+
statusCode: 409,
|
|
237
|
+
details: { codexProviderId },
|
|
238
|
+
},
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
return { ...config, codexProviderId };
|
|
146
242
|
};
|
|
147
243
|
|
|
148
244
|
const normalizeCustomModelInput = (
|
|
149
245
|
input: CustomProviderModelInput,
|
|
150
246
|
stored: ProviderModelConfig | null = null,
|
|
247
|
+
readRegistry: () => CodexProviderRegistryReading | null = () => null,
|
|
151
248
|
): CustomProviderModelInput => ({
|
|
152
249
|
id: input.id.trim(),
|
|
153
250
|
model: input.model.trim(),
|
|
@@ -156,7 +253,7 @@ const normalizeCustomModelInput = (
|
|
|
156
253
|
: {
|
|
157
254
|
config: input.config === null
|
|
158
255
|
? null
|
|
159
|
-
: validateModelConfig(resolveSecretRows(input.config, stored)),
|
|
256
|
+
: validateModelConfig(resolveSecretRows(input.config, stored), readRegistry),
|
|
160
257
|
}),
|
|
161
258
|
});
|
|
162
259
|
|
|
@@ -179,7 +276,15 @@ const withSourceConfig = (
|
|
|
179
276
|
sourceConfig: ProviderModelConfig | null,
|
|
180
277
|
): CustomProviderModelInput => (
|
|
181
278
|
input.config === undefined && sourceConfig !== null
|
|
182
|
-
? {
|
|
279
|
+
? {
|
|
280
|
+
...input,
|
|
281
|
+
config: {
|
|
282
|
+
...(sourceConfig.codexProviderId === undefined
|
|
283
|
+
? {}
|
|
284
|
+
: { codexProviderId: sourceConfig.codexProviderId }),
|
|
285
|
+
env: sourceConfig.env.map((row) => ({ ...row })),
|
|
286
|
+
},
|
|
287
|
+
}
|
|
183
288
|
: input
|
|
184
289
|
);
|
|
185
290
|
|
|
@@ -213,6 +318,10 @@ export const createProviderModelsService = (dependencies: ProviderModelsServiceD
|
|
|
213
318
|
const resolveProvider = dependencies.resolveProvider ?? providerRegistry.resolveProvider;
|
|
214
319
|
const catalog = dependencies.catalog ?? providerModelsDb;
|
|
215
320
|
const sessions = dependencies.sessions ?? sessionsDb;
|
|
321
|
+
// Read lazily: the registry port is installed by the settings module at boot, which may
|
|
322
|
+
// evaluate after this module, so capturing its reading here would freeze a null.
|
|
323
|
+
const codexProviders = dependencies.codexProviders ?? { read: readInstalledCodexProviders };
|
|
324
|
+
const readCodexRegistry = (): CodexProviderRegistryReading | null => codexProviders.read();
|
|
216
325
|
|
|
217
326
|
const getProviderModels = async (provider: LLMProvider): Promise<ProviderModelsDefinition> => {
|
|
218
327
|
const predefined = await resolveProvider(provider).models.getSupportedModels();
|
|
@@ -319,7 +428,7 @@ export const createProviderModelsService = (dependencies: ProviderModelsServiceD
|
|
|
319
428
|
stored: ProviderModelConfig | null = null,
|
|
320
429
|
): Promise<{ model: ProviderModelOption; models: ProviderModelsDefinition }> => {
|
|
321
430
|
const predefined = await resolveProvider(provider).models.getSupportedModels();
|
|
322
|
-
const normalized = normalizeCustomModelInput(input, stored);
|
|
431
|
+
const normalized = normalizeCustomModelInput(input, stored, readCodexRegistry);
|
|
323
432
|
assertModelIdAvailable(provider, predefined, normalized.id);
|
|
324
433
|
|
|
325
434
|
try {
|
|
@@ -369,7 +478,7 @@ export const createProviderModelsService = (dependencies: ProviderModelsServiceD
|
|
|
369
478
|
): Promise<{ model: ProviderModelOption; models: ProviderModelsDefinition }> => {
|
|
370
479
|
const predefined = await resolveProvider(provider).models.getSupportedModels();
|
|
371
480
|
const existing = readCustomModel(provider, recordId);
|
|
372
|
-
const normalized = normalizeCustomModelInput(input, existing.config);
|
|
481
|
+
const normalized = normalizeCustomModelInput(input, existing.config, readCodexRegistry);
|
|
373
482
|
assertModelIdAvailable(provider, predefined, normalized.id, recordId);
|
|
374
483
|
|
|
375
484
|
try {
|
|
@@ -416,9 +525,7 @@ export const createProviderModelsService = (dependencies: ProviderModelsServiceD
|
|
|
416
525
|
};
|
|
417
526
|
};
|
|
418
527
|
|
|
419
|
-
const readRecordedSessionSelection = (
|
|
420
|
-
sessionId: string,
|
|
421
|
-
): { model: string | null; effort: string | null; permissionMode: string | null } | null => {
|
|
528
|
+
const readRecordedSessionSelection = (sessionId: string): RecordedSessionSelection | null => {
|
|
422
529
|
const session = sessions.getSessionById(sessionId);
|
|
423
530
|
if (!session) {
|
|
424
531
|
return null;
|
|
@@ -428,9 +535,20 @@ export const createProviderModelsService = (dependencies: ProviderModelsServiceD
|
|
|
428
535
|
model: session.model?.trim() || null,
|
|
429
536
|
effort: session.effort?.trim() || null,
|
|
430
537
|
permissionMode: session.permission_mode?.trim() || null,
|
|
538
|
+
modelProviderId: session.model_provider_id?.trim() || null,
|
|
431
539
|
};
|
|
432
540
|
};
|
|
433
541
|
|
|
542
|
+
// The display/resume half of the service: which model a session is on, and
|
|
543
|
+
// which model a resume should launch. Composed here because it reads the same
|
|
544
|
+
// catalog and row access this service owns.
|
|
545
|
+
const { resolveSessionModel, resolveResumeModel } = createSessionModelResolver({
|
|
546
|
+
readRecordedSelection: readRecordedSessionSelection,
|
|
547
|
+
readCodexRegistry,
|
|
548
|
+
getProviderModels,
|
|
549
|
+
getCurrentActiveModel,
|
|
550
|
+
});
|
|
551
|
+
|
|
434
552
|
/**
|
|
435
553
|
* Records the model one session runs with.
|
|
436
554
|
*
|
|
@@ -439,6 +557,14 @@ export const createProviderModelsService = (dependencies: ProviderModelsServiceD
|
|
|
439
557
|
* ran with. Sessions the app has not created yet (no row) are ignored rather
|
|
440
558
|
* than treated as an error: the client keeps its own pending selection and
|
|
441
559
|
* the value lands on the row with the first send.
|
|
560
|
+
*
|
|
561
|
+
* The session's upstream provider is recorded here too, on the first write
|
|
562
|
+
* that names a model bound to one (`model_provider_id`). This is the send
|
|
563
|
+
* funnel, so it is the one place every first turn passes through. A later
|
|
564
|
+
* selection that would run under a DIFFERENT provider is refused — with the
|
|
565
|
+
* fork/new-session action in the message — because the provider runtime
|
|
566
|
+
* cannot switch it in place; the same selection on the same provider is an
|
|
567
|
+
* ordinary model change.
|
|
442
568
|
*/
|
|
443
569
|
const setSessionModel = (
|
|
444
570
|
provider: LLMProvider,
|
|
@@ -456,17 +582,56 @@ export const createProviderModelsService = (dependencies: ProviderModelsServiceD
|
|
|
456
582
|
return null;
|
|
457
583
|
}
|
|
458
584
|
|
|
585
|
+
const registry = readCodexRegistry();
|
|
586
|
+
const requestedProviderId = resolveModelProviderId(catalog, provider, normalizedModel);
|
|
587
|
+
assertProviderSwitchAllowed(recordedSelection.modelProviderId, requestedProviderId, normalizedModel);
|
|
588
|
+
assertProviderAvailable(registry, requestedProviderId, normalizedModel);
|
|
589
|
+
|
|
459
590
|
sessions.setSessionModel(normalizedSessionId, normalizedModel);
|
|
591
|
+
if (requestedProviderId && !recordedSelection.modelProviderId) {
|
|
592
|
+
sessions.setSessionModelProviderId(normalizedSessionId, requestedProviderId);
|
|
593
|
+
}
|
|
460
594
|
return {
|
|
461
595
|
provider,
|
|
462
596
|
sessionId: normalizedSessionId,
|
|
463
597
|
model: normalizedModel,
|
|
464
598
|
effort: recordedSelection.effort,
|
|
465
599
|
permissionMode: recordedSelection.permissionMode,
|
|
600
|
+
...readRecordedProviderBinding(registry, recordedSelection.modelProviderId ?? requestedProviderId),
|
|
466
601
|
source: 'session',
|
|
467
602
|
};
|
|
468
603
|
};
|
|
469
604
|
|
|
605
|
+
/**
|
|
606
|
+
* Answers whether a send may name this model for this session, throwing the
|
|
607
|
+
* same readable refusal the record path throws.
|
|
608
|
+
*
|
|
609
|
+
* `chat-websocket.service.ts` calls this BEFORE the session's run is admitted.
|
|
610
|
+
* The record path (`setSessionModel`) would refuse the equal case, but it runs
|
|
611
|
+
* after the run is reserved — and a throw there would leave a `running` run
|
|
612
|
+
* with no process behind it. A missing row, or a session with no recorded
|
|
613
|
+
* binding, is not a refusal: the first send of a session is exactly where a
|
|
614
|
+
* binding is allowed to be established.
|
|
615
|
+
*/
|
|
616
|
+
const assertSessionProviderSwitch = (
|
|
617
|
+
provider: LLMProvider,
|
|
618
|
+
sessionId: string,
|
|
619
|
+
model: string,
|
|
620
|
+
): void => {
|
|
621
|
+
const normalizedSessionId = sessionId.trim();
|
|
622
|
+
const normalizedModel = model.trim();
|
|
623
|
+
if (!normalizedSessionId || !normalizedModel) {
|
|
624
|
+
return;
|
|
625
|
+
}
|
|
626
|
+
const recordedSelection = readRecordedSessionSelection(normalizedSessionId);
|
|
627
|
+
if (!recordedSelection) {
|
|
628
|
+
return;
|
|
629
|
+
}
|
|
630
|
+
const requestedProviderId = resolveModelProviderId(catalog, provider, normalizedModel);
|
|
631
|
+
assertProviderSwitchAllowed(recordedSelection.modelProviderId, requestedProviderId, normalizedModel);
|
|
632
|
+
assertProviderAvailable(readCodexRegistry(), requestedProviderId, normalizedModel);
|
|
633
|
+
};
|
|
634
|
+
|
|
470
635
|
/**
|
|
471
636
|
* Records the reasoning effort one session runs with.
|
|
472
637
|
*
|
|
@@ -541,109 +706,6 @@ export const createProviderModelsService = (dependencies: ProviderModelsServiceD
|
|
|
541
706
|
};
|
|
542
707
|
};
|
|
543
708
|
|
|
544
|
-
/**
|
|
545
|
-
* Answers "which model is this session using?" for every display surface.
|
|
546
|
-
*
|
|
547
|
-
* Precedence, highest first:
|
|
548
|
-
* 1. the model recorded on the session row;
|
|
549
|
-
* 2. the provider's own session state for externally-created sessions;
|
|
550
|
-
* 3. `requestedModel`, the client's current default;
|
|
551
|
-
* 4. the source-controlled provider catalog default.
|
|
552
|
-
*
|
|
553
|
-
* The permission mode rides along unchanged: it has no provider-side source
|
|
554
|
-
* and no client-supplied fallback (the client is not allowed to persist one),
|
|
555
|
-
* so the only two answers are the recorded mode or NULL for "never sent one".
|
|
556
|
-
*/
|
|
557
|
-
const resolveSessionModel = async (
|
|
558
|
-
provider: LLMProvider,
|
|
559
|
-
options: { sessionId?: string | null; requestedModel?: string | null } = {},
|
|
560
|
-
): Promise<ProviderSessionModel> => {
|
|
561
|
-
const normalizedSessionId = typeof options.sessionId === 'string' ? options.sessionId.trim() : '';
|
|
562
|
-
const normalizedRequestedModel = typeof options.requestedModel === 'string'
|
|
563
|
-
? options.requestedModel.trim()
|
|
564
|
-
: '';
|
|
565
|
-
|
|
566
|
-
if (normalizedSessionId) {
|
|
567
|
-
const recordedSelection = readRecordedSessionSelection(normalizedSessionId);
|
|
568
|
-
if (recordedSelection?.model) {
|
|
569
|
-
return {
|
|
570
|
-
provider,
|
|
571
|
-
sessionId: normalizedSessionId,
|
|
572
|
-
model: recordedSelection.model,
|
|
573
|
-
effort: recordedSelection.effort,
|
|
574
|
-
permissionMode: recordedSelection.permissionMode,
|
|
575
|
-
source: 'session',
|
|
576
|
-
};
|
|
577
|
-
}
|
|
578
|
-
|
|
579
|
-
const providerCatalog = await getProviderModels(provider);
|
|
580
|
-
const providerModel = await getCurrentActiveModel(provider, normalizedSessionId);
|
|
581
|
-
const resolvedProviderModel = providerModel.model?.trim();
|
|
582
|
-
if (resolvedProviderModel && resolvedProviderModel !== providerCatalog.DEFAULT) {
|
|
583
|
-
return {
|
|
584
|
-
provider,
|
|
585
|
-
sessionId: normalizedSessionId,
|
|
586
|
-
model: resolvedProviderModel,
|
|
587
|
-
effort: recordedSelection?.effort ?? null,
|
|
588
|
-
permissionMode: recordedSelection?.permissionMode ?? null,
|
|
589
|
-
source: 'provider',
|
|
590
|
-
};
|
|
591
|
-
}
|
|
592
|
-
|
|
593
|
-
return {
|
|
594
|
-
provider,
|
|
595
|
-
sessionId: normalizedSessionId,
|
|
596
|
-
model: normalizedRequestedModel || providerCatalog.DEFAULT,
|
|
597
|
-
effort: recordedSelection?.effort ?? null,
|
|
598
|
-
permissionMode: recordedSelection?.permissionMode ?? null,
|
|
599
|
-
source: normalizedRequestedModel ? 'session' : 'default',
|
|
600
|
-
};
|
|
601
|
-
}
|
|
602
|
-
|
|
603
|
-
if (normalizedRequestedModel) {
|
|
604
|
-
return {
|
|
605
|
-
provider,
|
|
606
|
-
sessionId: null,
|
|
607
|
-
model: normalizedRequestedModel,
|
|
608
|
-
effort: null,
|
|
609
|
-
permissionMode: null,
|
|
610
|
-
source: 'session',
|
|
611
|
-
};
|
|
612
|
-
}
|
|
613
|
-
|
|
614
|
-
const providerCatalog = await getProviderModels(provider);
|
|
615
|
-
return {
|
|
616
|
-
provider,
|
|
617
|
-
sessionId: null,
|
|
618
|
-
model: providerCatalog.DEFAULT,
|
|
619
|
-
effort: null,
|
|
620
|
-
permissionMode: null,
|
|
621
|
-
source: 'default',
|
|
622
|
-
};
|
|
623
|
-
};
|
|
624
|
-
|
|
625
|
-
/**
|
|
626
|
-
* Picks the model one resumed provider run should use.
|
|
627
|
-
*
|
|
628
|
-
* Provider-global state is deliberately ignored because it must never
|
|
629
|
-
* override the model explicitly selected in the composer.
|
|
630
|
-
*/
|
|
631
|
-
const resolveResumeModel = async (
|
|
632
|
-
provider: LLMProvider,
|
|
633
|
-
sessionId: string | undefined,
|
|
634
|
-
requestedModel?: string | null,
|
|
635
|
-
): Promise<string | undefined> => {
|
|
636
|
-
void provider;
|
|
637
|
-
const normalizedRequestedModel = typeof requestedModel === 'string' ? requestedModel.trim() : '';
|
|
638
|
-
const normalizedSessionId = sessionId?.trim();
|
|
639
|
-
if (!normalizedSessionId) {
|
|
640
|
-
return normalizedRequestedModel || undefined;
|
|
641
|
-
}
|
|
642
|
-
|
|
643
|
-
const recordedModel = readRecordedSessionSelection(normalizedSessionId)?.model;
|
|
644
|
-
return recordedModel || normalizedRequestedModel || undefined;
|
|
645
|
-
};
|
|
646
|
-
|
|
647
709
|
/**
|
|
648
710
|
* SERVER-INTERNAL ONLY: returns the stored config including secret values
|
|
649
711
|
* for the launch compiler. Never mount this on a route or return its result
|
|
@@ -662,6 +724,7 @@ export const createProviderModelsService = (dependencies: ProviderModelsServiceD
|
|
|
662
724
|
updateCustomModel,
|
|
663
725
|
deleteCustomModel,
|
|
664
726
|
setSessionModel,
|
|
727
|
+
assertSessionProviderSwitch,
|
|
665
728
|
setSessionEffort,
|
|
666
729
|
setSessionPermissionMode,
|
|
667
730
|
resolveSessionModel,
|
|
@@ -321,6 +321,9 @@ async function defaultResidentLaunchOptions(
|
|
|
321
321
|
model: selection.model,
|
|
322
322
|
effort: selection.effort ?? undefined,
|
|
323
323
|
permissionMode: selection.permissionMode ?? undefined,
|
|
324
|
+
// The upstream provider the session's model was bound to (row
|
|
325
|
+
// `model_provider_id`); the resident driver compiles it into `-c` spawn args.
|
|
326
|
+
...(selection.modelProviderId ? { modelProviderId: selection.modelProviderId } : {}),
|
|
324
327
|
};
|
|
325
328
|
}
|
|
326
329
|
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which model — and which upstream provider binding — one session runs with.
|
|
3
|
+
*
|
|
4
|
+
* WHY IT IS ITS OWN FILE. The answer has four sources of truth in a fixed
|
|
5
|
+
* precedence (the recorded row, the provider's own session state, the client's
|
|
6
|
+
* requested default, the provider catalog default), and it must agree across
|
|
7
|
+
* the `/models` picker, `/cost`, `/status`, the active-model route and both
|
|
8
|
+
* runtimes. Keeping it beside the catalog CRUD made `provider-models.service.ts`
|
|
9
|
+
* the module's every-concern file; this is the display/resume half, with the
|
|
10
|
+
* catalog and row access injected so the service stays the composition root.
|
|
11
|
+
*
|
|
12
|
+
* THE UPSTREAM PROVIDER RIDES ALONG. A session may record the upstream
|
|
13
|
+
* provider its model was bound to (`model_provider_id`). A reader gets that id
|
|
14
|
+
* back unchanged, plus the explicit mark when the registry no longer defines it
|
|
15
|
+
* — the model is never re-resolved from the catalog default because a provider
|
|
16
|
+
* disappeared. See `session-provider-binding.ts`.
|
|
17
|
+
*
|
|
18
|
+
* Consumers: `provider-models.service.ts` only. Every other module reaches
|
|
19
|
+
* these answers through `providerModelsService`, which composes this factory.
|
|
20
|
+
*/
|
|
21
|
+
import type { CodexProviderRegistryReading } from '@/shared/ports/codex-provider-registry.port.js';
|
|
22
|
+
import type {
|
|
23
|
+
LLMProvider,
|
|
24
|
+
ProviderCurrentActiveModel,
|
|
25
|
+
ProviderModelsDefinition,
|
|
26
|
+
ProviderSessionModel,
|
|
27
|
+
} from '@/shared/types.js';
|
|
28
|
+
|
|
29
|
+
import { readRecordedProviderBinding } from './session-provider-binding.js';
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* The selection recorded on one session row, as the resolver reads it.
|
|
33
|
+
*
|
|
34
|
+
* NULL in any member means "not recorded", which is a real answer for each:
|
|
35
|
+
* the model falls through to the provider's own state, the effort and
|
|
36
|
+
* permission mode have no provider-side source, and the provider id means no
|
|
37
|
+
* binding was ever established for this conversation.
|
|
38
|
+
*/
|
|
39
|
+
export type RecordedSessionSelection = {
|
|
40
|
+
model: string | null;
|
|
41
|
+
effort: string | null;
|
|
42
|
+
permissionMode: string | null;
|
|
43
|
+
modelProviderId: string | null;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/** The reads a model resolution needs, injected by the composition root. */
|
|
47
|
+
export type SessionModelResolverDependencies = {
|
|
48
|
+
/** The session row's recorded selection, or null when no row has that id. */
|
|
49
|
+
readRecordedSelection(sessionId: string): RecordedSessionSelection | null;
|
|
50
|
+
/** The installed upstream-provider registry, or null when none is wired. */
|
|
51
|
+
readCodexRegistry(): CodexProviderRegistryReading | null;
|
|
52
|
+
/** The provider's catalog merged with its custom model rows. */
|
|
53
|
+
getProviderModels(provider: LLMProvider): Promise<ProviderModelsDefinition>;
|
|
54
|
+
/** The model the provider itself reports for one of its session ids. */
|
|
55
|
+
getCurrentActiveModel(provider: LLMProvider, sessionId?: string): Promise<ProviderCurrentActiveModel>;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export function createSessionModelResolver(dependencies: SessionModelResolverDependencies) {
|
|
59
|
+
const { readRecordedSelection, readCodexRegistry, getProviderModels, getCurrentActiveModel } = dependencies;
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Answers "which model is this session using?" for every display surface.
|
|
63
|
+
*
|
|
64
|
+
* Precedence, highest first:
|
|
65
|
+
* 1. the model recorded on the session row;
|
|
66
|
+
* 2. the provider's own session state for externally-created sessions;
|
|
67
|
+
* 3. `requestedModel`, the client's current default;
|
|
68
|
+
* 4. the source-controlled provider catalog default.
|
|
69
|
+
*
|
|
70
|
+
* The permission mode rides along unchanged: it has no provider-side source
|
|
71
|
+
* and no client-supplied fallback (the client is not allowed to persist one),
|
|
72
|
+
* so the only two answers are the recorded mode or NULL for "never sent one".
|
|
73
|
+
*
|
|
74
|
+
* The upstream provider id and its problem mark come from the session row
|
|
75
|
+
* alone (see the file header): no branch below ever rewrites the model
|
|
76
|
+
* because the provider it was bound to is gone.
|
|
77
|
+
*/
|
|
78
|
+
const resolveSessionModel = async (
|
|
79
|
+
provider: LLMProvider,
|
|
80
|
+
options: { sessionId?: string | null; requestedModel?: string | null } = {},
|
|
81
|
+
): Promise<ProviderSessionModel> => {
|
|
82
|
+
const normalizedSessionId = typeof options.sessionId === 'string' ? options.sessionId.trim() : '';
|
|
83
|
+
const normalizedRequestedModel = typeof options.requestedModel === 'string'
|
|
84
|
+
? options.requestedModel.trim()
|
|
85
|
+
: '';
|
|
86
|
+
|
|
87
|
+
if (normalizedSessionId) {
|
|
88
|
+
const recordedSelection = readRecordedSelection(normalizedSessionId);
|
|
89
|
+
const binding = readRecordedProviderBinding(
|
|
90
|
+
readCodexRegistry(),
|
|
91
|
+
recordedSelection?.modelProviderId ?? null,
|
|
92
|
+
);
|
|
93
|
+
if (recordedSelection?.model) {
|
|
94
|
+
return {
|
|
95
|
+
provider,
|
|
96
|
+
sessionId: normalizedSessionId,
|
|
97
|
+
model: recordedSelection.model,
|
|
98
|
+
effort: recordedSelection.effort,
|
|
99
|
+
permissionMode: recordedSelection.permissionMode,
|
|
100
|
+
...binding,
|
|
101
|
+
source: 'session',
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const providerCatalog = await getProviderModels(provider);
|
|
106
|
+
const providerModel = await getCurrentActiveModel(provider, normalizedSessionId);
|
|
107
|
+
const resolvedProviderModel = providerModel.model?.trim();
|
|
108
|
+
if (resolvedProviderModel && resolvedProviderModel !== providerCatalog.DEFAULT) {
|
|
109
|
+
return {
|
|
110
|
+
provider,
|
|
111
|
+
sessionId: normalizedSessionId,
|
|
112
|
+
model: resolvedProviderModel,
|
|
113
|
+
effort: recordedSelection?.effort ?? null,
|
|
114
|
+
permissionMode: recordedSelection?.permissionMode ?? null,
|
|
115
|
+
...binding,
|
|
116
|
+
source: 'provider',
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return {
|
|
121
|
+
provider,
|
|
122
|
+
sessionId: normalizedSessionId,
|
|
123
|
+
model: normalizedRequestedModel || providerCatalog.DEFAULT,
|
|
124
|
+
effort: recordedSelection?.effort ?? null,
|
|
125
|
+
permissionMode: recordedSelection?.permissionMode ?? null,
|
|
126
|
+
...binding,
|
|
127
|
+
source: normalizedRequestedModel ? 'session' : 'default',
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (normalizedRequestedModel) {
|
|
132
|
+
return {
|
|
133
|
+
provider,
|
|
134
|
+
sessionId: null,
|
|
135
|
+
model: normalizedRequestedModel,
|
|
136
|
+
effort: null,
|
|
137
|
+
permissionMode: null,
|
|
138
|
+
modelProviderId: null,
|
|
139
|
+
modelProviderProblem: null,
|
|
140
|
+
source: 'session',
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const providerCatalog = await getProviderModels(provider);
|
|
145
|
+
return {
|
|
146
|
+
provider,
|
|
147
|
+
sessionId: null,
|
|
148
|
+
model: providerCatalog.DEFAULT,
|
|
149
|
+
effort: null,
|
|
150
|
+
permissionMode: null,
|
|
151
|
+
modelProviderId: null,
|
|
152
|
+
modelProviderProblem: null,
|
|
153
|
+
source: 'default',
|
|
154
|
+
};
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Picks the model one resumed provider run should use.
|
|
159
|
+
*
|
|
160
|
+
* Provider-global state is deliberately ignored because it must never
|
|
161
|
+
* override the model explicitly selected in the composer.
|
|
162
|
+
*/
|
|
163
|
+
const resolveResumeModel = async (
|
|
164
|
+
provider: LLMProvider,
|
|
165
|
+
sessionId: string | undefined,
|
|
166
|
+
requestedModel?: string | null,
|
|
167
|
+
): Promise<string | undefined> => {
|
|
168
|
+
void provider;
|
|
169
|
+
const normalizedRequestedModel = typeof requestedModel === 'string' ? requestedModel.trim() : '';
|
|
170
|
+
const normalizedSessionId = sessionId?.trim();
|
|
171
|
+
if (!normalizedSessionId) {
|
|
172
|
+
return normalizedRequestedModel || undefined;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const recordedModel = readRecordedSelection(normalizedSessionId)?.model;
|
|
176
|
+
return recordedModel || normalizedRequestedModel || undefined;
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
return { resolveSessionModel, resolveResumeModel };
|
|
180
|
+
}
|