@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
|
@@ -23,6 +23,7 @@ import {
|
|
|
23
23
|
type PendingTurn,
|
|
24
24
|
type ResidentSession,
|
|
25
25
|
} from '@/modules/providers/list/codex/codex-host-driver.contract.js';
|
|
26
|
+
import { pendingLaunchForHost, residentLaunchForOptions } from '@/modules/providers/list/codex/codex-resident-provider-launch.js';
|
|
26
27
|
import {
|
|
27
28
|
createCodexLiveSettings,
|
|
28
29
|
type CodexLiveSettings,
|
|
@@ -95,6 +96,8 @@ export class CodexHostDriver implements IProviderHostDriver {
|
|
|
95
96
|
private readonly sessions = new Map<string, ResidentSession>();
|
|
96
97
|
/** Launches carried from `startResidentSession` to the `bind` it causes. */
|
|
97
98
|
private readonly pendingLaunches = new Map<string, PendingResidentLaunch>();
|
|
99
|
+
/** The per-session launch each host was spawned with; absent = the driver-wide launch. */
|
|
100
|
+
private readonly hostLaunches = new Map<string, CodexAppServerLaunch>();
|
|
98
101
|
/** The `process/*` verbs and the `background-task` leases they report. */
|
|
99
102
|
private readonly background: CodexBackgroundProcesses;
|
|
100
103
|
/** Serial for the `turn` lease's `runId`; unique per turn of this instance. */
|
|
@@ -170,6 +173,12 @@ export class CodexHostDriver implements IProviderHostDriver {
|
|
|
170
173
|
this.closedHostIds.delete(host.hostId);
|
|
171
174
|
this.host = host;
|
|
172
175
|
this.sink = sink;
|
|
176
|
+
// The connection (and so the process) is created before `bind` runs, so the
|
|
177
|
+
// pending per-session launch has to move onto the host id first.
|
|
178
|
+
const pendingLaunch = pendingLaunchForHost(host, this.pendingLaunches);
|
|
179
|
+
if (pendingLaunch) {
|
|
180
|
+
this.hostLaunches.set(host.hostId, pendingLaunch);
|
|
181
|
+
}
|
|
173
182
|
const connection = this.connectionFor(host.hostId);
|
|
174
183
|
await connection.initialize();
|
|
175
184
|
host.pid = connection.pid;
|
|
@@ -402,6 +411,7 @@ export class CodexHostDriver implements IProviderHostDriver {
|
|
|
402
411
|
this.pendingLaunches.delete(session.appSessionId);
|
|
403
412
|
}
|
|
404
413
|
this.connections.delete(host.hostId);
|
|
414
|
+
this.hostLaunches.delete(host.hostId);
|
|
405
415
|
if (this.connection === connection) {
|
|
406
416
|
this.connection = null;
|
|
407
417
|
}
|
|
@@ -437,6 +447,10 @@ export class CodexHostDriver implements IProviderHostDriver {
|
|
|
437
447
|
this.pendingLaunches.set(appSessionId, {
|
|
438
448
|
providerSessionId: launch.context.resolveProviderSessionId(appSessionId),
|
|
439
449
|
threadDefaults: residentThreadDefaults(launch.options),
|
|
450
|
+
// Compile BEFORE opening the host: a session bound to a provider the
|
|
451
|
+
// registry no longer defines must fail readably here (no process, no
|
|
452
|
+
// silent fall-back to Codex's `openai`), not on the first turn.
|
|
453
|
+
launch: residentLaunchForOptions(launch.options, this.launch),
|
|
440
454
|
});
|
|
441
455
|
try {
|
|
442
456
|
const host = await hostPort.openHost({
|
|
@@ -797,7 +811,7 @@ export class CodexHostDriver implements IProviderHostDriver {
|
|
|
797
811
|
if (existing) {
|
|
798
812
|
return existing;
|
|
799
813
|
}
|
|
800
|
-
const connection = this.createConnection(this.launch);
|
|
814
|
+
const connection = this.createConnection(this.hostLaunches.get(hostId) ?? this.launch);
|
|
801
815
|
this.connections.set(hostId, connection);
|
|
802
816
|
this.connection = connection;
|
|
803
817
|
connection.onNotification((method, params) => this.handleNotification(method, params));
|
|
@@ -219,9 +219,13 @@ const defaultCatalogCacheKey = (): string => `${resolvePackagedCliVersion()}|${p
|
|
|
219
219
|
|
|
220
220
|
const toCodexModelOption = (model: CodexModelDescriptor): ProviderModelOption => {
|
|
221
221
|
const effortValues = (model.supportedReasoningEfforts ?? [])
|
|
222
|
-
.
|
|
223
|
-
|
|
224
|
-
|
|
222
|
+
.filter((effort): effort is { reasoningEffort: string; description?: string } => (
|
|
223
|
+
typeof effort.reasoningEffort === 'string' && effort.reasoningEffort.length > 0
|
|
224
|
+
))
|
|
225
|
+
.map((effort) => ({
|
|
226
|
+
value: effort.reasoningEffort,
|
|
227
|
+
...(effort.description === undefined ? {} : { description: effort.description }),
|
|
228
|
+
}));
|
|
225
229
|
|
|
226
230
|
return {
|
|
227
231
|
value: model.id,
|
|
@@ -235,6 +239,15 @@ const toCodexModelOption = (model: CodexModelDescriptor): ProviderModelOption =>
|
|
|
235
239
|
values: effortValues,
|
|
236
240
|
},
|
|
237
241
|
}),
|
|
242
|
+
// A catalog entry's own window/threshold is the fact source for the launch
|
|
243
|
+
// when it declares one; the Codex runtime lifts these into
|
|
244
|
+
// `model_context_window` / `model_auto_compact_token_limit` overrides.
|
|
245
|
+
...(model.modelContextWindow === undefined
|
|
246
|
+
? {}
|
|
247
|
+
: { contextWindow: model.modelContextWindow }),
|
|
248
|
+
...(model.modelAutoCompactTokenLimit === undefined
|
|
249
|
+
? {}
|
|
250
|
+
: { autoCompactTokenLimit: model.modelAutoCompactTokenLimit }),
|
|
238
251
|
};
|
|
239
252
|
};
|
|
240
253
|
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds the `CodexOptions` a per-run Codex SDK process needs to talk to a
|
|
3
|
+
* project-owned upstream provider.
|
|
4
|
+
*
|
|
5
|
+
* WHY THIS IS A SEPARATE CAPABILITY. The Codex SDK constructor takes the
|
|
6
|
+
* endpoint as `config.model_provider` + `config.model_providers.<id>` and the
|
|
7
|
+
* credential as an environment variable named by the provider's `env_key`.
|
|
8
|
+
* Passing only `ThreadOptions.modelProvider` is not enough: Codex 0.166 reports
|
|
9
|
+
* `modelProviderMismatch` unless the process itself was launched under the
|
|
10
|
+
* provider, so the options must exist at `new Codex(...)` time. This module is
|
|
11
|
+
* the one place that turns a resolved registry entry into that shape, so the
|
|
12
|
+
* resident injection path can reuse it instead of growing a second compiler.
|
|
13
|
+
*
|
|
14
|
+
* THE SECRET TRAVELS IN ENV, NEVER IN ARGV. The SDK serialises `config` into
|
|
15
|
+
* `--config key=value` arguments; `env_key` is only the variable NAME. The
|
|
16
|
+
* secret is placed in the child environment (`env`), which is also why a host
|
|
17
|
+
* sentinel must not survive: the SDK replaces `process.env` entirely whenever
|
|
18
|
+
* `env` is supplied, so the child sees only the plumbing allowlist plus the one
|
|
19
|
+
* provider credential.
|
|
20
|
+
*
|
|
21
|
+
* Consumed by `codex-runtime.provider.ts` (queryCodex, the per-run SDK path)
|
|
22
|
+
* and `codex-host-driver.provider.ts` (the resident app-server path, which needs
|
|
23
|
+
* `-c` spawn args instead of constructor options). The resolver is read from the
|
|
24
|
+
* shared port at call time; neither consumer imports the settings module (that
|
|
25
|
+
* edge would close the AC-394 providers/settings cycle).
|
|
26
|
+
*/
|
|
27
|
+
import type { CodexOptions } from '@openai/codex-sdk';
|
|
28
|
+
|
|
29
|
+
import type { CodexAppServerLaunch } from '@/modules/providers/list/codex/codex-app-server.connection.js';
|
|
30
|
+
import {
|
|
31
|
+
readCodexProviderRegistryPort,
|
|
32
|
+
type ResolvedCodexUpstreamProvider,
|
|
33
|
+
} from '@/shared/ports/codex-provider-registry.port.js';
|
|
34
|
+
import { AppError } from '@/shared/utils.js';
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Host variables a non-interactive Codex process needs that are plumbing, not
|
|
38
|
+
* credentials. Anything outside this list (API keys, arbitrary operator
|
|
39
|
+
* exports, test sentinels) is deliberately dropped: when the SDK is handed an
|
|
40
|
+
* `env`, it stops inheriting `process.env`, and that is exactly the isolation
|
|
41
|
+
* this injection promises.
|
|
42
|
+
*/
|
|
43
|
+
const CODEX_CHILD_ENV_ALLOWLIST: readonly string[] = [
|
|
44
|
+
'PATH',
|
|
45
|
+
'HOME',
|
|
46
|
+
'TMPDIR',
|
|
47
|
+
'TMP',
|
|
48
|
+
'TEMP',
|
|
49
|
+
'LANG',
|
|
50
|
+
'LC_ALL',
|
|
51
|
+
'LC_CTYPE',
|
|
52
|
+
'TZ',
|
|
53
|
+
'TERM',
|
|
54
|
+
'USER',
|
|
55
|
+
'LOGNAME',
|
|
56
|
+
'SHELL',
|
|
57
|
+
'CODEX_HOME',
|
|
58
|
+
'XDG_CONFIG_HOME',
|
|
59
|
+
'XDG_DATA_HOME',
|
|
60
|
+
'XDG_CACHE_HOME',
|
|
61
|
+
'XDG_STATE_HOME',
|
|
62
|
+
'SSL_CERT_FILE',
|
|
63
|
+
'SSL_CERT_DIR',
|
|
64
|
+
'NODE_EXTRA_CA_CERTS',
|
|
65
|
+
'HTTP_PROXY',
|
|
66
|
+
'HTTPS_PROXY',
|
|
67
|
+
'ALL_PROXY',
|
|
68
|
+
'NO_PROXY',
|
|
69
|
+
'http_proxy',
|
|
70
|
+
'https_proxy',
|
|
71
|
+
'all_proxy',
|
|
72
|
+
'no_proxy',
|
|
73
|
+
];
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* The child environment for one injected provider: the plumbing allowlist plus
|
|
77
|
+
* the token-file secret under the provider's own `env_key`.
|
|
78
|
+
*
|
|
79
|
+
* A host variable that happens to share the provider's `env_key` is overwritten
|
|
80
|
+
* by the resolved secret, so a stale operator credential can never win.
|
|
81
|
+
*/
|
|
82
|
+
export function buildCodexProviderEnv(
|
|
83
|
+
provider: ResolvedCodexUpstreamProvider,
|
|
84
|
+
source: Record<string, string | undefined> = process.env,
|
|
85
|
+
): Record<string, string> {
|
|
86
|
+
const env: Record<string, string> = {};
|
|
87
|
+
for (const key of CODEX_CHILD_ENV_ALLOWLIST) {
|
|
88
|
+
const value = source[key];
|
|
89
|
+
if (typeof value === 'string' && value.length > 0) {
|
|
90
|
+
env[key] = value;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// `env_http_headers` maps a header to the NAME of a variable Codex reads from
|
|
94
|
+
// its own environment. Because this injection replaces the child environment,
|
|
95
|
+
// those variables have to be carried across explicitly or the headers would
|
|
96
|
+
// silently vanish. Only names the entry itself declares are forwarded.
|
|
97
|
+
for (const variable of Object.values(provider.envHttpHeaders ?? {})) {
|
|
98
|
+
const value = source[variable];
|
|
99
|
+
if (typeof value === 'string' && value.length > 0) {
|
|
100
|
+
env[variable] = value;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
env[provider.envKey] = provider.secret;
|
|
104
|
+
return env;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* The `[model_providers.<id>]` advanced settings in Codex's snake_case spelling.
|
|
109
|
+
*
|
|
110
|
+
* Only fields the entry declared are present, so an entry with none produces
|
|
111
|
+
* exactly the config it produced before these settings existed (and the AC-464
|
|
112
|
+
* criterion's strict deep-equal keeps its shape).
|
|
113
|
+
*/
|
|
114
|
+
function providerAdvancedConfig(
|
|
115
|
+
provider: ResolvedCodexUpstreamProvider,
|
|
116
|
+
): Record<string, unknown> {
|
|
117
|
+
return {
|
|
118
|
+
...(provider.httpHeaders === undefined ? {} : { http_headers: provider.httpHeaders }),
|
|
119
|
+
...(provider.envHttpHeaders === undefined ? {} : { env_http_headers: provider.envHttpHeaders }),
|
|
120
|
+
...(provider.queryParams === undefined ? {} : { query_params: provider.queryParams }),
|
|
121
|
+
...(provider.requestMaxRetries === undefined
|
|
122
|
+
? {}
|
|
123
|
+
: { request_max_retries: provider.requestMaxRetries }),
|
|
124
|
+
...(provider.streamMaxRetries === undefined
|
|
125
|
+
? {}
|
|
126
|
+
: { stream_max_retries: provider.streamMaxRetries }),
|
|
127
|
+
...(provider.streamIdleTimeoutMs === undefined
|
|
128
|
+
? {}
|
|
129
|
+
: { stream_idle_timeout_ms: provider.streamIdleTimeoutMs }),
|
|
130
|
+
...(provider.modelCatalogUrl === undefined
|
|
131
|
+
? {}
|
|
132
|
+
: { model_catalog_url: provider.modelCatalogUrl }),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* A selected model entry's own window and auto-compaction threshold, the tier
|
|
138
|
+
* that wins over the provider entry's defaults.
|
|
139
|
+
*/
|
|
140
|
+
export type CodexModelLimits = {
|
|
141
|
+
contextWindow?: number | undefined;
|
|
142
|
+
autoCompactTokenLimit?: number | undefined;
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* The context-window overrides one launch carries.
|
|
147
|
+
*
|
|
148
|
+
* Codex keeps `model_context_window` / `model_auto_compact_token_limit` at the
|
|
149
|
+
* TOP LEVEL of its config, not inside `[model_providers.<id>]`. The selected
|
|
150
|
+
* model entry is the most specific fact source (the same tier Claude's launch
|
|
151
|
+
* profile occupies), then the provider entry's own default.
|
|
152
|
+
*/
|
|
153
|
+
function codexWindowConfig(
|
|
154
|
+
provider: ResolvedCodexUpstreamProvider,
|
|
155
|
+
limits: CodexModelLimits = {},
|
|
156
|
+
): Record<string, number> {
|
|
157
|
+
const contextWindow = limits.contextWindow ?? provider.modelContextWindow;
|
|
158
|
+
const autoCompactTokenLimit = limits.autoCompactTokenLimit ?? provider.modelAutoCompactTokenLimit;
|
|
159
|
+
return {
|
|
160
|
+
...(contextWindow === undefined ? {} : { model_context_window: contextWindow }),
|
|
161
|
+
...(autoCompactTokenLimit === undefined
|
|
162
|
+
? {}
|
|
163
|
+
: { model_auto_compact_token_limit: autoCompactTokenLimit }),
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* The SDK options for one resolved provider.
|
|
169
|
+
*
|
|
170
|
+
* `wire_api` is carried as the schema's literal `responses`: Codex 0.166
|
|
171
|
+
* refuses to load a provider that asks for Chat Completions, and the settings
|
|
172
|
+
* schema already rejects that value at write time.
|
|
173
|
+
*/
|
|
174
|
+
export function codexOptionsForProvider(
|
|
175
|
+
provider: ResolvedCodexUpstreamProvider,
|
|
176
|
+
limits: CodexModelLimits = {},
|
|
177
|
+
): CodexOptions {
|
|
178
|
+
return {
|
|
179
|
+
config: {
|
|
180
|
+
...codexWindowConfig(provider, limits),
|
|
181
|
+
model_provider: provider.id,
|
|
182
|
+
model_providers: {
|
|
183
|
+
[provider.id]: {
|
|
184
|
+
name: provider.name,
|
|
185
|
+
base_url: provider.baseUrl,
|
|
186
|
+
env_key: provider.envKey,
|
|
187
|
+
wire_api: provider.wireApi,
|
|
188
|
+
...providerAdvancedConfig(provider),
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
},
|
|
192
|
+
env: buildCodexProviderEnv(provider),
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Resolves one provider id against the installed project registry.
|
|
198
|
+
*
|
|
199
|
+
* Throws a readable error instead of falling back to Codex's `openai` default:
|
|
200
|
+
* after a user bound a model to a custom endpoint, dialling the default one
|
|
201
|
+
* silently would send the conversation to a different account and endpoint.
|
|
202
|
+
* The `CODEX_PROVIDER_NOT_CONFIGURED` code is what a launch surface maps to the
|
|
203
|
+
* app-server's own `modelProviderNotConfigured` reading; the sentence is the
|
|
204
|
+
* registry's (it names the id and the settings file). An unwired registry is
|
|
205
|
+
* reported the same way — a focused test that never installed the port cannot
|
|
206
|
+
* accidentally "pass" by omitting the injection.
|
|
207
|
+
*/
|
|
208
|
+
export function resolveCodexUpstreamProvider(providerId: string): ResolvedCodexUpstreamProvider {
|
|
209
|
+
const registry = readCodexProviderRegistryPort();
|
|
210
|
+
if (registry === null || typeof registry.resolve !== 'function') {
|
|
211
|
+
throw new AppError(
|
|
212
|
+
`Codex provider "${providerId}" cannot be resolved: the project Codex provider registry is not wired in this process.`,
|
|
213
|
+
{ code: 'CODEX_PROVIDER_NOT_CONFIGURED', statusCode: 409 },
|
|
214
|
+
);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
const resolution = registry.resolve(providerId);
|
|
218
|
+
if (!resolution.ok) {
|
|
219
|
+
throw new AppError(resolution.problem, {
|
|
220
|
+
code: 'CODEX_PROVIDER_NOT_CONFIGURED',
|
|
221
|
+
statusCode: 409,
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
return resolution.provider;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/** A TOML basic string, so a value Codex reads as config cannot break the `-c` line. */
|
|
228
|
+
function tomlBasicString(value: string): string {
|
|
229
|
+
return `"${value.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/** A TOML inline table of string values (`{ "X-Header" = "v" }`). */
|
|
233
|
+
function tomlInlineMap(map: Record<string, string>): string {
|
|
234
|
+
const entries = Object.entries(map)
|
|
235
|
+
.map(([key, value]) => `${tomlBasicString(key)} = ${tomlBasicString(value)}`)
|
|
236
|
+
.join(', ');
|
|
237
|
+
return `{ ${entries} }`;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* The `-c` overrides a resident `codex app-server` is spawned with.
|
|
242
|
+
*
|
|
243
|
+
* Codex 0.166 refuses `turn/start` with `modelProviderMismatch` when the
|
|
244
|
+
* provider is only named on `thread/start`; the process-global provider has to
|
|
245
|
+
* be selected at spawn time. The endpoint table is written as an inline TOML
|
|
246
|
+
* table because that is the same document `~/.codex/config.toml` carries, and
|
|
247
|
+
* the secret is deliberately NOT here: `env_key` only names the child
|
|
248
|
+
* environment variable (see {@link buildCodexProviderEnv}), because an argv
|
|
249
|
+
* value is visible to every `ps` on the machine.
|
|
250
|
+
*
|
|
251
|
+
* Advanced settings are appended INSIDE that same table; a value whose key is
|
|
252
|
+
* not valid in a bare TOML key is quoted. The two context-window keys are
|
|
253
|
+
* top-level in Codex's config, so they get their own `-c` lines.
|
|
254
|
+
*/
|
|
255
|
+
export function codexProviderSpawnArgs(
|
|
256
|
+
provider: ResolvedCodexUpstreamProvider,
|
|
257
|
+
limits: CodexModelLimits = {},
|
|
258
|
+
): string[] {
|
|
259
|
+
const entry = [
|
|
260
|
+
`name = ${tomlBasicString(provider.name)}`,
|
|
261
|
+
`base_url = ${tomlBasicString(provider.baseUrl)}`,
|
|
262
|
+
`env_key = ${tomlBasicString(provider.envKey)}`,
|
|
263
|
+
`wire_api = ${tomlBasicString(provider.wireApi)}`,
|
|
264
|
+
...(provider.httpHeaders === undefined
|
|
265
|
+
? []
|
|
266
|
+
: [`http_headers = ${tomlInlineMap(provider.httpHeaders)}`]),
|
|
267
|
+
...(provider.envHttpHeaders === undefined
|
|
268
|
+
? []
|
|
269
|
+
: [`env_http_headers = ${tomlInlineMap(provider.envHttpHeaders)}`]),
|
|
270
|
+
...(provider.queryParams === undefined
|
|
271
|
+
? []
|
|
272
|
+
: [`query_params = ${tomlInlineMap(provider.queryParams)}`]),
|
|
273
|
+
...(provider.requestMaxRetries === undefined
|
|
274
|
+
? []
|
|
275
|
+
: [`request_max_retries = ${provider.requestMaxRetries}`]),
|
|
276
|
+
...(provider.streamMaxRetries === undefined
|
|
277
|
+
? []
|
|
278
|
+
: [`stream_max_retries = ${provider.streamMaxRetries}`]),
|
|
279
|
+
...(provider.streamIdleTimeoutMs === undefined
|
|
280
|
+
? []
|
|
281
|
+
: [`stream_idle_timeout_ms = ${provider.streamIdleTimeoutMs}`]),
|
|
282
|
+
...(provider.modelCatalogUrl === undefined
|
|
283
|
+
? []
|
|
284
|
+
: [`model_catalog_url = ${tomlBasicString(provider.modelCatalogUrl)}`]),
|
|
285
|
+
].join(', ');
|
|
286
|
+
const windows = codexWindowConfig(provider, limits);
|
|
287
|
+
return [
|
|
288
|
+
'-c', `model_provider=${tomlBasicString(provider.id)}`,
|
|
289
|
+
'-c', `model_providers.${provider.id}={ ${entry} }`,
|
|
290
|
+
...Object.entries(windows).flatMap(([key, value]) => ['-c', `${key}=${value}`]),
|
|
291
|
+
];
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* The launch one resident app-server is spawned with for a bound provider.
|
|
296
|
+
*
|
|
297
|
+
* `base` is the driver-wide transport launch (working directory and the like);
|
|
298
|
+
* the provider overrides are appended to its args. The environment is REPLACED
|
|
299
|
+
* with the plumbing allowlist plus the one provider credential rather than
|
|
300
|
+
* merged with `base.env`: `spawn` treats an explicit env as the whole child
|
|
301
|
+
* environment, and a host sentinel surviving into the child is exactly what the
|
|
302
|
+
* isolation reading forbids. The MCP-gateway wrapper composes its own variable
|
|
303
|
+
* on top of this launch afterwards.
|
|
304
|
+
*/
|
|
305
|
+
export function compileCodexProviderLaunch(
|
|
306
|
+
providerId: string,
|
|
307
|
+
base: CodexAppServerLaunch = {},
|
|
308
|
+
): CodexAppServerLaunch {
|
|
309
|
+
const provider = resolveCodexUpstreamProvider(providerId);
|
|
310
|
+
return {
|
|
311
|
+
...base,
|
|
312
|
+
args: [...(base.args ?? []), ...codexProviderSpawnArgs(provider)],
|
|
313
|
+
env: buildCodexProviderEnv(provider),
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/** Resolves one model's `codexProviderId` and compiles its per-run SDK options. */
|
|
318
|
+
export function compileCodexProviderOptions(
|
|
319
|
+
providerId: string,
|
|
320
|
+
limits: CodexModelLimits = {},
|
|
321
|
+
): CodexOptions {
|
|
322
|
+
return codexOptionsForProvider(resolveCodexUpstreamProvider(providerId), limits);
|
|
323
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How one resident session's provider binding becomes an app-server spawn launch.
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS IS ITS OWN FILE. `CodexHostDriver` keeps the process, the thread and
|
|
5
|
+
* the turn state; the question "which command line does this host start with"
|
|
6
|
+
* is a data transformation that only needs the session's launch bag and the
|
|
7
|
+
* registry credential. Keeping it beside the driver pushed that file over the
|
|
8
|
+
* architecture ratchet's committed line count for no structural gain, so the
|
|
9
|
+
* transformation lives here — the same seam pattern as
|
|
10
|
+
* `codex-resident-steer.ts` and `codex-resident-blocked-events.ts`.
|
|
11
|
+
*
|
|
12
|
+
* TWO CALL POINTS, ONE READING. `startResidentSession` compiles the provider id
|
|
13
|
+
* recorded on the session row; `startHost` has to place the result on the host
|
|
14
|
+
* id because `openHost` starts the process BEFORE it binds the session. Both
|
|
15
|
+
* read the id from the same field (`modelProviderId`), so the two paths cannot
|
|
16
|
+
* disagree about what a "bound session" is.
|
|
17
|
+
*
|
|
18
|
+
* A blank id is "no binding", not a provider named "": the driver then keeps
|
|
19
|
+
* its unbound launch byte-for-byte, which is the negative control for the
|
|
20
|
+
* injection.
|
|
21
|
+
*/
|
|
22
|
+
import type { CodexAppServerLaunch } from '@/modules/providers/list/codex/codex-app-server.connection.js';
|
|
23
|
+
import type {
|
|
24
|
+
PendingResidentLaunch,
|
|
25
|
+
} from '@/modules/providers/list/codex/codex-host-driver.contract.js';
|
|
26
|
+
import { compileCodexProviderLaunch } from '@/modules/providers/list/codex/codex-provider-injection.js';
|
|
27
|
+
import type { AnyRecord, ProcessHost } from '@/shared/types.js';
|
|
28
|
+
|
|
29
|
+
/** The upstream provider id a resident launch bag records, or null. */
|
|
30
|
+
export function residentProviderIdFromLaunchOptions(options: AnyRecord): string | null {
|
|
31
|
+
const value = options.modelProviderId;
|
|
32
|
+
return typeof value === 'string' && value.trim() ? value.trim() : null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* The process launch one resident session's host must be spawned with.
|
|
37
|
+
*
|
|
38
|
+
* Null is the unbound arm (the driver-wide launch, unchanged). A recorded id is
|
|
39
|
+
* compiled into `-c` args plus the child environment's one credential; an id
|
|
40
|
+
* the registry cannot resolve throws the readable
|
|
41
|
+
* `CODEX_PROVIDER_NOT_CONFIGURED` error before any process starts, so a
|
|
42
|
+
* restarted host never silently falls back to Codex's `openai`.
|
|
43
|
+
*/
|
|
44
|
+
export function residentLaunchForOptions(
|
|
45
|
+
options: AnyRecord,
|
|
46
|
+
driverLaunch: CodexAppServerLaunch,
|
|
47
|
+
): CodexAppServerLaunch | null {
|
|
48
|
+
const providerId = residentProviderIdFromLaunchOptions(options);
|
|
49
|
+
return providerId === null ? null : compileCodexProviderLaunch(providerId, driverLaunch);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* The launch this host's first binding carried, if the host was opened on demand.
|
|
54
|
+
*
|
|
55
|
+
* `openHost` registers the binding and then calls `startHost`, so this is the
|
|
56
|
+
* only moment the pending launch is reachable: the request that it belongs to
|
|
57
|
+
* (`bind`) runs afterwards, by which time the process — and its argv — already
|
|
58
|
+
* exist.
|
|
59
|
+
*/
|
|
60
|
+
export function pendingLaunchForHost(
|
|
61
|
+
host: ProcessHost,
|
|
62
|
+
launches: ReadonlyMap<string, PendingResidentLaunch>,
|
|
63
|
+
): CodexAppServerLaunch | null {
|
|
64
|
+
for (const appSessionId of host.bindings.keys()) {
|
|
65
|
+
const launch = launches.get(appSessionId)?.launch;
|
|
66
|
+
if (launch) {
|
|
67
|
+
return launch;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
@@ -22,6 +22,7 @@ import {
|
|
|
22
22
|
createNormalizedMessage,
|
|
23
23
|
} from '@/shared/index.js';
|
|
24
24
|
import { notifyRunFailed, notifyRunStopped } from '@/modules/notifications/index.js';
|
|
25
|
+
import { compileCodexProviderOptions } from '@/modules/providers/list/codex/codex-provider-injection.js';
|
|
25
26
|
import { readCodexSessionTokenUsage } from '@/modules/providers/list/codex/codex-token-usage-files.js';
|
|
26
27
|
import { approvalRequests } from '@/modules/providers/shared/base/approval-requests.service.js';
|
|
27
28
|
import type { AnyRecord, ProviderRuntimeContext, ProviderRuntimeWriter } from '@/shared/index.js';
|
|
@@ -340,6 +341,16 @@ async function queryCodex(
|
|
|
340
341
|
? effort as ModelReasoningEffort
|
|
341
342
|
: undefined;
|
|
342
343
|
|
|
344
|
+
// A model entry bound to a project Codex provider must be launched under that
|
|
345
|
+
// provider: Codex 0.166 rejects a turn whose provider differs from the one the
|
|
346
|
+
// process started with (`modelProviderMismatch`), so the injection has to be on
|
|
347
|
+
// the SDK options, not only on ThreadOptions. An unbound model keeps the exact
|
|
348
|
+
// previous behaviour — `new Codex()` with no options, inheriting Codex's global
|
|
349
|
+
// default. A bound model whose provider cannot be resolved throws inside the try
|
|
350
|
+
// below, which surfaces the readable line instead of silently dialling the
|
|
351
|
+
// default endpoint.
|
|
352
|
+
const codexProviderId = selectedModel?.config?.codexProviderId;
|
|
353
|
+
|
|
343
354
|
let codex: Codex;
|
|
344
355
|
let thread: Thread;
|
|
345
356
|
// Provider-native thread id (starts as the resume id, or is captured from
|
|
@@ -359,7 +370,15 @@ async function queryCodex(
|
|
|
359
370
|
const sessionKey = () => sessionId || capturedSessionId || null;
|
|
360
371
|
|
|
361
372
|
try {
|
|
362
|
-
codex =
|
|
373
|
+
codex = codexProviderId
|
|
374
|
+
? new Codex(compileCodexProviderOptions(codexProviderId, {
|
|
375
|
+
// The selected catalog entry is the most specific context-window fact
|
|
376
|
+
// source (the tier a Claude launch profile occupies), falling back to
|
|
377
|
+
// the provider entry's own default inside the compiler.
|
|
378
|
+
contextWindow: selectedModel?.contextWindow,
|
|
379
|
+
autoCompactTokenLimit: selectedModel?.autoCompactTokenLimit,
|
|
380
|
+
}))
|
|
381
|
+
: new Codex();
|
|
363
382
|
|
|
364
383
|
const threadOptions: ThreadOptions = {
|
|
365
384
|
workingDirectory,
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
sanitizeLeafDirectoryName,
|
|
13
13
|
} from '@/shared/utils.js';
|
|
14
14
|
|
|
15
|
-
/** Curated Cursor catalog shipped as immutable
|
|
15
|
+
/** Curated Cursor catalog shipped as immutable Cloudpit defaults. */
|
|
16
16
|
export const CURSOR_PREDEFINED_MODELS: ProviderModelsDefinition = {
|
|
17
17
|
OPTIONS: [
|
|
18
18
|
{ value: 'auto', label: 'Auto', description: 'Let Cursor choose the model.' },
|
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
} from '@/shared/utils.js';
|
|
19
19
|
|
|
20
20
|
/**
|
|
21
|
-
* Curated OpenCode catalog shipped as immutable
|
|
21
|
+
* Curated OpenCode catalog shipped as immutable Cloudpit defaults.
|
|
22
22
|
*
|
|
23
23
|
* OpenCode routes by `<providerID>/<modelID>`, so this list mirrors the
|
|
24
24
|
* providers `opencode models --verbose` reports: the OpenCode Zen gateway, the
|
|
@@ -537,6 +537,13 @@ const parseModelConfigPayload = (raw: unknown): ProviderModelConfig | null | und
|
|
|
537
537
|
if (typeof raw !== 'object' || !Array.isArray(env)) {
|
|
538
538
|
throw new AppError('config.env must be an array.', { code: 'INVALID_MODEL_CONFIG', statusCode: 400 });
|
|
539
539
|
}
|
|
540
|
+
const codexProviderId = (raw as { codexProviderId?: unknown }).codexProviderId;
|
|
541
|
+
if (codexProviderId !== undefined && typeof codexProviderId !== 'string') {
|
|
542
|
+
throw new AppError('config.codexProviderId must be a string.', {
|
|
543
|
+
code: 'INVALID_MODEL_CONFIG',
|
|
544
|
+
statusCode: 400,
|
|
545
|
+
});
|
|
546
|
+
}
|
|
540
547
|
const rows = env.map((entry): ProviderModelEnvRow => {
|
|
541
548
|
const row = (entry ?? {}) as Record<string, unknown>;
|
|
542
549
|
const kinds = ['value', 'secret', 'envref', 'unset'];
|
|
@@ -554,7 +561,10 @@ const parseModelConfigPayload = (raw: unknown): ProviderModelConfig | null | und
|
|
|
554
561
|
? { key: row.key, kind: row.kind as ProviderModelEnvRow['kind'] }
|
|
555
562
|
: { key: row.key, kind: row.kind as ProviderModelEnvRow['kind'], value: row.value };
|
|
556
563
|
});
|
|
557
|
-
return {
|
|
564
|
+
return {
|
|
565
|
+
...(codexProviderId === undefined ? {} : { codexProviderId }),
|
|
566
|
+
env: rows,
|
|
567
|
+
};
|
|
558
568
|
};
|
|
559
569
|
|
|
560
570
|
const parseCustomProviderModelPayload = (payload: unknown): CustomProviderModelInput => {
|
|
@@ -699,7 +709,18 @@ router.post(
|
|
|
699
709
|
// A session with no row has no recorded permission mode either, so that
|
|
700
710
|
// answer is null rather than a mode the session never sent with.
|
|
701
711
|
res.json(createApiSuccessResponse(
|
|
702
|
-
stored ?? {
|
|
712
|
+
stored ?? {
|
|
713
|
+
provider,
|
|
714
|
+
sessionId,
|
|
715
|
+
model,
|
|
716
|
+
effort: null,
|
|
717
|
+
permissionMode: null,
|
|
718
|
+
// No row yet, so no binding has been recorded either; the first send
|
|
719
|
+
// that reaches a row is what writes one.
|
|
720
|
+
modelProviderId: null,
|
|
721
|
+
modelProviderProblem: null,
|
|
722
|
+
source: 'session' as const,
|
|
723
|
+
},
|
|
703
724
|
));
|
|
704
725
|
}),
|
|
705
726
|
);
|