@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
|
@@ -168,9 +168,14 @@ function blockText(block: UnknownRecord): string {
|
|
|
168
168
|
* again" after every background task: it opens a new turn span and, for the ask ledger, answers
|
|
169
169
|
* a pending question nobody answered. The other tags are the same kind of row — slash-command
|
|
170
170
|
* and bash-escape bookkeeping, and the metadata blocks the CLI appends.
|
|
171
|
+
*
|
|
172
|
+
* `cross-session-message` is another Claude session's SendMessage. It arrives as a `user` row
|
|
173
|
+
* because it enters this session as a turn, but the person did not type it; counting it as a
|
|
174
|
+
* prompt answered a pending ask the human had not answered yet.
|
|
171
175
|
*/
|
|
172
176
|
const SYNTHETIC_USER_TURN_TAGS = [
|
|
173
177
|
'task-notification',
|
|
178
|
+
'cross-session-message',
|
|
174
179
|
'system-reminder',
|
|
175
180
|
'local-command-stdout',
|
|
176
181
|
'local-command-stderr',
|
|
@@ -182,9 +187,22 @@ const SYNTHETIC_USER_TURN_TAGS = [
|
|
|
182
187
|
'bash-stderr',
|
|
183
188
|
] as const;
|
|
184
189
|
|
|
185
|
-
/**
|
|
190
|
+
/**
|
|
191
|
+
* The fixed lead-in the CLI puts before a peer-session envelope. It is harness prose, not the
|
|
192
|
+
* person's words, so it strips together with the envelope; older rows that carry no
|
|
193
|
+
* `origin.kind` marker are still recognised by their text alone.
|
|
194
|
+
*/
|
|
195
|
+
const SYNTHETIC_USER_TURN_LEAD_IN = /^\s*Another Claude session sent a message:\s*/;
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* One leading synthetic envelope; matched repeatedly so stacked blocks still strip fully.
|
|
199
|
+
*
|
|
200
|
+
* The opening tag may carry attributes (`<cross-session-message from="…" from-name="…">`), so
|
|
201
|
+
* the name is followed by an optional attribute run. Matching only the bare form left those
|
|
202
|
+
* envelopes in place and made the whole row read as a prompt.
|
|
203
|
+
*/
|
|
186
204
|
const SYNTHETIC_USER_TURN_ENVELOPE = new RegExp(
|
|
187
|
-
`^\\s*<(${SYNTHETIC_USER_TURN_TAGS.join('|')})
|
|
205
|
+
`^\\s*<(${SYNTHETIC_USER_TURN_TAGS.join('|')})(?:\\s[^>]*)?>[\\s\\S]*?<\\/\\1>`,
|
|
188
206
|
);
|
|
189
207
|
|
|
190
208
|
/**
|
|
@@ -195,7 +213,7 @@ const SYNTHETIC_USER_TURN_ENVELOPE = new RegExp(
|
|
|
195
213
|
* prompt — the whole block must strip to emptiness to stop being one.
|
|
196
214
|
*/
|
|
197
215
|
function isSyntheticUserText(text: string): boolean {
|
|
198
|
-
let remainder = text;
|
|
216
|
+
let remainder = text.replace(SYNTHETIC_USER_TURN_LEAD_IN, '');
|
|
199
217
|
for (;;) {
|
|
200
218
|
const match = SYNTHETIC_USER_TURN_ENVELOPE.exec(remainder);
|
|
201
219
|
if (match === null) break;
|
|
@@ -204,17 +222,33 @@ function isSyntheticUserText(text: string): boolean {
|
|
|
204
222
|
return remainder.trim() === '';
|
|
205
223
|
}
|
|
206
224
|
|
|
225
|
+
/**
|
|
226
|
+
* Whether this row is a message another Claude session injected, not the person speaking.
|
|
227
|
+
*
|
|
228
|
+
* The CLI writes such a row as `isMeta: true` with `origin.kind === 'peer'` and
|
|
229
|
+
* `turnOrigin === 'peer'`. Checking the origin first is what makes the rule independent of the
|
|
230
|
+
* envelope's prose and attributes; the text fallback in {@link isSyntheticUserText} covers
|
|
231
|
+
* older rows that predate the origin fields.
|
|
232
|
+
*/
|
|
233
|
+
function isPeerInjectedRow(row: UnknownRecord): boolean {
|
|
234
|
+
const origin = row.origin;
|
|
235
|
+
if (isRecord(origin) && origin.kind === 'peer') return true;
|
|
236
|
+
return row.turnOrigin === 'peer';
|
|
237
|
+
}
|
|
238
|
+
|
|
207
239
|
/**
|
|
208
240
|
* Whether one row is a real prompt — a person's message, not a tool result and not a
|
|
209
241
|
* harness-injected synthetic turn.
|
|
210
242
|
*
|
|
211
243
|
* Claude records tool results as `user` rows. Treating those as turn boundaries would split a
|
|
212
244
|
* single turn at every tool call, so the boundary is a row that carries non-empty text. A
|
|
213
|
-
* `<task-notification>` row also carries non-empty text, but nobody
|
|
214
|
-
* prompt makes a pending ask look answered and shifts the digest's
|
|
245
|
+
* `<task-notification>` or cross-session `user` row also carries non-empty text, but nobody
|
|
246
|
+
* typed it: counting it as a prompt makes a pending ask look answered and shifts the digest's
|
|
247
|
+
* turn boundary.
|
|
215
248
|
*/
|
|
216
249
|
export function isUserPromptRow(row: UnknownRecord): boolean {
|
|
217
250
|
if (transcriptRowRole(row) !== 'user') return false;
|
|
251
|
+
if (isPeerInjectedRow(row)) return false;
|
|
218
252
|
const texts = rowContentBlocks(row)
|
|
219
253
|
.filter((block) => block.type === 'text')
|
|
220
254
|
.map(blockText)
|
|
@@ -311,7 +311,7 @@ test('AC1: the producer writes the snapshot and diff, and throttles a second tri
|
|
|
311
311
|
const target = {
|
|
312
312
|
projectId: CLOUD_PROJECT_ID,
|
|
313
313
|
fleetProjectId: FLEET_PROJECT_ID,
|
|
314
|
-
title: '
|
|
314
|
+
title: 'Cloudpit',
|
|
315
315
|
sessionId: 'session-42',
|
|
316
316
|
};
|
|
317
317
|
|
|
@@ -202,6 +202,19 @@ test('AC3: an invalid URI or revision is a 400, not a stored object', async () =
|
|
|
202
202
|
});
|
|
203
203
|
assert.equal(badSeenUri.status, 400);
|
|
204
204
|
|
|
205
|
+
// The retired 2.x spelling is not a valid address any more, even in its well-formed shape.
|
|
206
|
+
const retiredSpelling = await fetch(`${baseUrl}/api/observation/seen`, {
|
|
207
|
+
method: 'POST',
|
|
208
|
+
headers: { 'content-type': 'application/json' },
|
|
209
|
+
body: JSON.stringify({ uri: 'cloudcli://session/retired', revision: 1 }),
|
|
210
|
+
});
|
|
211
|
+
assert.equal(retiredSpelling.status, 400);
|
|
212
|
+
const retiredWatch = await fetch(
|
|
213
|
+
`${baseUrl}/api/observation/watch/${encodeURIComponent('cloudcli://session/retired')}`,
|
|
214
|
+
{ method: 'PUT' },
|
|
215
|
+
);
|
|
216
|
+
assert.equal(retiredWatch.status, 400);
|
|
217
|
+
|
|
205
218
|
const badRevision = await fetch(`${baseUrl}/api/observation/seen`, {
|
|
206
219
|
method: 'POST',
|
|
207
220
|
headers: { 'content-type': 'application/json' },
|
|
@@ -229,3 +229,61 @@ test('AC2: past the cap the wall sorts red > attention > ok by recent revision a
|
|
|
229
229
|
'attention entries are newest-first, so the last SHOWN one is the second-oldest',
|
|
230
230
|
);
|
|
231
231
|
});
|
|
232
|
+
|
|
233
|
+
// ---------------------------------------------------------------------------
|
|
234
|
+
// 3.0 — one spelling: the legacy cloudcli:// read and storage fallback are gone
|
|
235
|
+
// ---------------------------------------------------------------------------
|
|
236
|
+
|
|
237
|
+
const LEGACY_AT = 3_000_000;
|
|
238
|
+
|
|
239
|
+
/** Seeds a row exactly as the 2.0 writer would have left it: the storage key is `cloudcli://`. */
|
|
240
|
+
function seedLegacyObject(uri: string, kind: 'session' | 'architecture', revision: number): void {
|
|
241
|
+
const db = getConnection();
|
|
242
|
+
db.prepare(
|
|
243
|
+
`INSERT INTO observed_objects (
|
|
244
|
+
uri, kind, title, status_state, status_reason, digest_json, revision, updated_at,
|
|
245
|
+
provenance_producer, provenance_tier, provenance_evaluated_at
|
|
246
|
+
) VALUES (?, ?, ?, 'attention', 'waiting', '{}', ?, ?, 'legacy-producer', 'deterministic', ?)`,
|
|
247
|
+
).run(uri, kind, `${kind} fixture`, revision, LEGACY_AT, LEGACY_AT);
|
|
248
|
+
db.prepare(
|
|
249
|
+
'INSERT INTO observed_revisions (uri, revision, at, delta_items_json) VALUES (?, ?, ?, ?)',
|
|
250
|
+
).run(uri, revision, LEGACY_AT, JSON.stringify([`legacy-${uri}`]));
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
test('3.0: a legacy cloudcli:// read is refused and never falls back to a legacy storage row', () => {
|
|
254
|
+
// A 2.0-era row, seeded under the legacy key exactly as the 2.0 writer left it.
|
|
255
|
+
seedLegacyObject('cloudcli://session/a', 'session', 2);
|
|
256
|
+
seedLegacyObject('cloudcli://architecture/b', 'architecture', 4);
|
|
257
|
+
|
|
258
|
+
assert.equal(store.getObject('cloudcli://session/a'), null, 'the retired spelling no longer parses');
|
|
259
|
+
assert.equal(store.getObject('cloudpit://session/a'), null, 'the store no longer reads the legacy key');
|
|
260
|
+
assert.equal(store.getObject('cloudcli://architecture/b'), null);
|
|
261
|
+
assert.equal(store.getObject('cloudpit://architecture/b'), null);
|
|
262
|
+
|
|
263
|
+
assert.throws(
|
|
264
|
+
() => store.listRevisions('cloudcli://session/a', 0),
|
|
265
|
+
/must be one of cloudpit:\/\/session\/<id>/,
|
|
266
|
+
'the retired spelling is not a valid address for a read',
|
|
267
|
+
);
|
|
268
|
+
assert.deepEqual(store.getWall(USER_ID).entries, [], 'a legacy-key row does not surface on the wall');
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
test('3.0: a write addresses only the canonical key; a legacy row is not continued', () => {
|
|
272
|
+
seedLegacyObject('cloudcli://session/chain', 'session', 2);
|
|
273
|
+
|
|
274
|
+
const written = store.writeRevision({
|
|
275
|
+
uri: 'cloudpit://session/chain',
|
|
276
|
+
kind: 'session',
|
|
277
|
+
title: 'Fresh canonical chain',
|
|
278
|
+
status: { state: 'ok' },
|
|
279
|
+
provenance: { producer: PRODUCER, tier: 'deterministic' },
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
assert.equal(written.uri, 'cloudpit://session/chain', 'the reading is canonical');
|
|
283
|
+
assert.equal(written.revision, 1, 'the legacy row is not the canonical chain');
|
|
284
|
+
assert.equal(store.getObject('cloudpit://session/chain')?.revision, 1);
|
|
285
|
+
assert.deepEqual(
|
|
286
|
+
store.listRevisions('cloudpit://session/chain', 0).map((revision) => revision.revision),
|
|
287
|
+
[1],
|
|
288
|
+
);
|
|
289
|
+
});
|
|
@@ -87,7 +87,7 @@ function makeProject(overrides: Partial<ProjectTruthProjectRef> = {}): ProjectTr
|
|
|
87
87
|
return {
|
|
88
88
|
projectId: CLOUD_PROJECT_ID,
|
|
89
89
|
projectPath: '/data/home/yale/work/claudecodeui',
|
|
90
|
-
title: '
|
|
90
|
+
title: 'Cloudpit',
|
|
91
91
|
fleetProjectId: FLEET_PROJECT_ID,
|
|
92
92
|
deploy: { healthUrl: 'http://127.0.0.1:3001', ref: 'HEAD' },
|
|
93
93
|
...overrides,
|
|
@@ -237,7 +237,7 @@ test('AC1: a snapshot fixture yields all five layers, each from its own source',
|
|
|
237
237
|
assert.ok(!reading.deltaItems.includes('落地 landed earlier'));
|
|
238
238
|
});
|
|
239
239
|
|
|
240
|
-
test('AC1: a non-
|
|
240
|
+
test('AC1: a non-Cloudpit project reads deploy as not-applicable, is not green and is not reddened by the reader', () => {
|
|
241
241
|
const reading = build({
|
|
242
242
|
project: makeProject({ fleetProjectId: 'plantuml-js', deploy: null }),
|
|
243
243
|
// Deliberately a failing reader: a project with no deployment concept must not be turned
|
|
@@ -1574,6 +1574,81 @@ test('option identity: the model-provided id is NEVER written into the decision'
|
|
|
1574
1574
|
}
|
|
1575
1575
|
});
|
|
1576
1576
|
|
|
1577
|
+
// ---------------------------------------------------------------------------------------------
|
|
1578
|
+
// Multi-subdecision bundling: the prompt asks for 3–5 composite options, and the pipeline keeps them
|
|
1579
|
+
//
|
|
1580
|
+
// When one assistant message asks three INDEPENDENT design points (each A-or-B), flattening them
|
|
1581
|
+
// into 6 half-direction options breaks the cockpit's single-select UI: a person can pick only one
|
|
1582
|
+
// of six. The model is therefore asked to bundle them into 3–5 self-consistent combinations. This
|
|
1583
|
+
// case pins that the parser/summary pipeline accepts that shape unchanged (the parser imposes no
|
|
1584
|
+
// option-count ceiling) and that stable ids still derive from the labels.
|
|
1585
|
+
// ---------------------------------------------------------------------------------------------
|
|
1586
|
+
|
|
1587
|
+
/** The model answer for the multi-subdecision fixture: three composite options, whole coverage. */
|
|
1588
|
+
const COMPOSITE_ANSWER = {
|
|
1589
|
+
ask: '三个设计点(①是否拆包、②是否改接口、③是否补迁移)各选 A 还是 B,请一次定下组合。',
|
|
1590
|
+
situation: '助手一次问了三个相互独立的子决定,每个都要在 A 还是 B 之间选。',
|
|
1591
|
+
incomplete: false,
|
|
1592
|
+
recommendedOptionId: null,
|
|
1593
|
+
judgeOptionId: null,
|
|
1594
|
+
judgeReason: null,
|
|
1595
|
+
options: [
|
|
1596
|
+
{
|
|
1597
|
+
id: 'bundle-all-a',
|
|
1598
|
+
label: '①A+②A+③A',
|
|
1599
|
+
does: '①保持单包;②接口不变;③现在补迁移。',
|
|
1600
|
+
tags: [{ kind: 'consequence', text: '全部保持现状' }],
|
|
1601
|
+
source: 'assistant',
|
|
1602
|
+
},
|
|
1603
|
+
{
|
|
1604
|
+
id: 'bundle-all-b',
|
|
1605
|
+
label: '①B+②B+③B',
|
|
1606
|
+
does: '①拆包;②改接口;③不补迁移。',
|
|
1607
|
+
tags: [{ kind: 'risk', text: '改动最大' }],
|
|
1608
|
+
source: 'assistant',
|
|
1609
|
+
},
|
|
1610
|
+
{
|
|
1611
|
+
id: 'bundle-mixed',
|
|
1612
|
+
label: '①A+②B+③A',
|
|
1613
|
+
does: '①保持单包;②改接口;③现在补迁移。',
|
|
1614
|
+
tags: [{ kind: 'benefit', text: '接口与迁移先落地' }],
|
|
1615
|
+
source: 'assistant',
|
|
1616
|
+
},
|
|
1617
|
+
],
|
|
1618
|
+
};
|
|
1619
|
+
|
|
1620
|
+
test('multi-subdecision: three composite options survive the digest verbatim, ids derived from labels', async () => {
|
|
1621
|
+
const summariser = createSessionAskDecisionDigest({
|
|
1622
|
+
readSettings: () => STUB_SETTINGS,
|
|
1623
|
+
complete: async () => completion(JSON.stringify(COMPOSITE_ANSWER)),
|
|
1624
|
+
});
|
|
1625
|
+
|
|
1626
|
+
const reading = await summariser.summarize({
|
|
1627
|
+
sessionId: SESSION_ID,
|
|
1628
|
+
sessionTitle: '会话',
|
|
1629
|
+
askId: `${SESSION_ID}:a1`,
|
|
1630
|
+
revision: 1,
|
|
1631
|
+
assistantText:
|
|
1632
|
+
'三个设计点,每个都要选 A 还是 B:\n①是否拆包?A 保持单包,B 拆包。\n②是否改接口?A 不变,B 改。\n③是否补迁移?A 现在补,B 不补。\n请一次定下组合。',
|
|
1633
|
+
context:
|
|
1634
|
+
'[助手] 三个设计点,每个都要选 A 还是 B:\n①是否拆包?A 保持单包,B 拆包。\n②是否改接口?A 不变,B 改。\n③是否补迁移?A 现在补,B 不补。\n请一次定下组合。',
|
|
1635
|
+
});
|
|
1636
|
+
|
|
1637
|
+
assert.equal(reading.state, 'evaluated', 'the pipeline accepts the bundled shape');
|
|
1638
|
+
if (reading.state !== 'evaluated') return;
|
|
1639
|
+
assert.equal(reading.options.length, 3, 'three bundled options are kept, not flattened into six');
|
|
1640
|
+
assert.deepEqual(
|
|
1641
|
+
reading.options.map((option) => option.label),
|
|
1642
|
+
COMPOSITE_ANSWER.options.map((option) => option.label),
|
|
1643
|
+
'the labels keep the declared order, verbatim',
|
|
1644
|
+
);
|
|
1645
|
+
assert.deepEqual(
|
|
1646
|
+
reading.options.map((option) => option.id),
|
|
1647
|
+
COMPOSITE_ANSWER.options.map((option) => stableOptionId(option.label)),
|
|
1648
|
+
'bundling does not change identity: each id is still derived from the label',
|
|
1649
|
+
);
|
|
1650
|
+
});
|
|
1651
|
+
|
|
1577
1652
|
// ---------------------------------------------------------------------------------------------
|
|
1578
1653
|
// Reliable session.answered: every answered ask, across rounds and across restarts, exactly once
|
|
1579
1654
|
// ---------------------------------------------------------------------------------------------
|
|
@@ -2217,6 +2292,120 @@ test('AC3: turn-end states no session.answered for a <task-notification> row', a
|
|
|
2217
2292
|
assert.deepEqual(ledger.pending, [{ askId: `${SESSION_ID}:a1`, messageId: 'a1' }], 'the ask stays open');
|
|
2218
2293
|
});
|
|
2219
2294
|
|
|
2295
|
+
// ---------------------------------------------------------------------------------------------
|
|
2296
|
+
// A cross-session message is not a user prompt either: it must not answer a pending ask
|
|
2297
|
+
// ---------------------------------------------------------------------------------------------
|
|
2298
|
+
|
|
2299
|
+
/**
|
|
2300
|
+
* One peer row exactly as the CLI persists another session's SendMessage: a fixed lead-in, an
|
|
2301
|
+
* attribute-bearing envelope, and the row markers that say a machine injected it.
|
|
2302
|
+
*/
|
|
2303
|
+
function crossSessionRow(id: string): string {
|
|
2304
|
+
return JSON.stringify({
|
|
2305
|
+
type: 'user',
|
|
2306
|
+
uuid: id,
|
|
2307
|
+
isMeta: true,
|
|
2308
|
+
promptSource: 'system',
|
|
2309
|
+
turnOrigin: 'peer',
|
|
2310
|
+
origin: { kind: 'peer', from: 'uds:/tmp/peer.sock', name: 'peer' },
|
|
2311
|
+
message: {
|
|
2312
|
+
role: 'user',
|
|
2313
|
+
content:
|
|
2314
|
+
'Another Claude session sent a message:\n'
|
|
2315
|
+
+ '<cross-session-message from="uds:/tmp/peer.sock" from-name="peer" from-mode="bypass">\n'
|
|
2316
|
+
+ '选 2\n'
|
|
2317
|
+
+ '</cross-session-message>',
|
|
2318
|
+
},
|
|
2319
|
+
});
|
|
2320
|
+
}
|
|
2321
|
+
|
|
2322
|
+
/** The transcript up to a question, then another session's message — no answer from the person. */
|
|
2323
|
+
function askThenCrossSession(): string {
|
|
2324
|
+
return `${[
|
|
2325
|
+
stringContentRow('user', 'u1', '开始'),
|
|
2326
|
+
stringContentRow('assistant', 'a1', '先补测试还是先改实现?'),
|
|
2327
|
+
crossSessionRow('p1'),
|
|
2328
|
+
].join('\n')}\n`;
|
|
2329
|
+
}
|
|
2330
|
+
|
|
2331
|
+
test('a cross-session-message row after a pending ask leaves it current, not settled', () => {
|
|
2332
|
+
const scan = readSessionAsks(askThenCrossSession(), SESSION_ID);
|
|
2333
|
+
|
|
2334
|
+
assert.deepEqual(scan.settled, [], 'another session speaking is not the person answering');
|
|
2335
|
+
assert.equal(scan.current?.askId, `${SESSION_ID}:a1`, 'the ask is still the open question');
|
|
2336
|
+
assert.equal(scan.current?.revision, 1);
|
|
2337
|
+
});
|
|
2338
|
+
|
|
2339
|
+
test('a real user message still settles the ask, even after a cross-session-message row', () => {
|
|
2340
|
+
const raw = `${[
|
|
2341
|
+
stringContentRow('user', 'u1', '开始'),
|
|
2342
|
+
stringContentRow('assistant', 'a1', '先补测试还是先改实现?'),
|
|
2343
|
+
crossSessionRow('p1'),
|
|
2344
|
+
stringContentRow('user', 'u2', '先补测试'),
|
|
2345
|
+
stringContentRow('assistant', 'a2', '补完了,还要先跑一遍吗?'),
|
|
2346
|
+
].join('\n')}\n`;
|
|
2347
|
+
const scan = readSessionAsks(raw, SESSION_ID);
|
|
2348
|
+
|
|
2349
|
+
assert.deepEqual(
|
|
2350
|
+
scan.settled,
|
|
2351
|
+
[{ askId: `${SESSION_ID}:a1`, answerMessageId: 'u2' }],
|
|
2352
|
+
'the answer is the person\'s row, never the peer row',
|
|
2353
|
+
);
|
|
2354
|
+
assert.equal(scan.current?.askId, `${SESSION_ID}:a2`, 'the tail ask is the newer question');
|
|
2355
|
+
});
|
|
2356
|
+
|
|
2357
|
+
test('turn-end states no session.answered for a cross-session-message row', async () => {
|
|
2358
|
+
const objects = new Map<string, ObservedObject>();
|
|
2359
|
+
objects.set(formatSessionUri(SESSION_ID), {
|
|
2360
|
+
uri: formatSessionUri(SESSION_ID),
|
|
2361
|
+
kind: 'session',
|
|
2362
|
+
title: '会话:选中方案',
|
|
2363
|
+
status: { state: 'attention' },
|
|
2364
|
+
digest: {
|
|
2365
|
+
activity: 'waiting',
|
|
2366
|
+
askEvents: {
|
|
2367
|
+
answered: [],
|
|
2368
|
+
asking: [`${SESSION_ID}:a1:1`],
|
|
2369
|
+
pending: [{ askId: `${SESSION_ID}:a1`, messageId: 'a1' }],
|
|
2370
|
+
},
|
|
2371
|
+
},
|
|
2372
|
+
blindSpots: [],
|
|
2373
|
+
revision: 1,
|
|
2374
|
+
updatedAt: CLOCK,
|
|
2375
|
+
provenance: { producer: 'session-digest', tier: 'deterministic', evaluatedAt: CLOCK },
|
|
2376
|
+
});
|
|
2377
|
+
const harness = createHarness(JSON.stringify(RECOMMENDED_ANSWER), { objects });
|
|
2378
|
+
harness.setTranscript(askThenCrossSession());
|
|
2379
|
+
|
|
2380
|
+
await harness.turnEnd();
|
|
2381
|
+
|
|
2382
|
+
assert.deepEqual(
|
|
2383
|
+
harness.events.filter((event) => event.kind === 'session.answered'),
|
|
2384
|
+
[],
|
|
2385
|
+
'no answer is stated when only another session spoke',
|
|
2386
|
+
);
|
|
2387
|
+
const ledger = readSessionAskEventLedger(objects.get(formatSessionUri(SESSION_ID))?.digest);
|
|
2388
|
+
assert.deepEqual(ledger.pending, [{ askId: `${SESSION_ID}:a1`, messageId: 'a1' }], 'the ask stays open');
|
|
2389
|
+
|
|
2390
|
+
// The person's own reply still settles it exactly once, with the person's message id. The
|
|
2391
|
+
// assistant turn after it is what a real stop hook sees; without it the transcript ends on a
|
|
2392
|
+
// user row and the digest is unevaluated for a different reason.
|
|
2393
|
+
const secondRaw = `${askThenCrossSession()}${stringContentRow('user', 'u2', '先补测试')}\n${stringContentRow('assistant', 'a2', '好的,先补测试。')}\n`;
|
|
2394
|
+
harness.setTranscript(secondRaw);
|
|
2395
|
+
await harness.turnEnd();
|
|
2396
|
+
const answered = harness.events.filter((event) => event.kind === 'session.answered');
|
|
2397
|
+
assert.equal(answered.length, 1);
|
|
2398
|
+
assert.deepEqual((answered[0]?.data as { messageId?: string } | undefined)?.messageId, 'u2');
|
|
2399
|
+
|
|
2400
|
+
// A replay of the same transcript must not state the answer twice.
|
|
2401
|
+
await harness.turnEnd();
|
|
2402
|
+
assert.equal(
|
|
2403
|
+
harness.events.filter((event) => event.kind === 'session.answered').length,
|
|
2404
|
+
1,
|
|
2405
|
+
'the stated answer survives a turn-end replay',
|
|
2406
|
+
);
|
|
2407
|
+
});
|
|
2408
|
+
|
|
2220
2409
|
// ---------------------------------------------------------------------------------------------
|
|
2221
2410
|
// The ask digest's JSON contract: its own output ceiling, fences, and a loud truncation
|
|
2222
2411
|
// ---------------------------------------------------------------------------------------------
|
|
@@ -42,6 +42,7 @@ import {
|
|
|
42
42
|
analyzeAsking,
|
|
43
43
|
analyzeAssistantAsk,
|
|
44
44
|
buildSessionDigest,
|
|
45
|
+
isUserPromptRow,
|
|
45
46
|
parseTestOutput,
|
|
46
47
|
SESSION_DIGEST_CONCLUSION_CHARS,
|
|
47
48
|
} from '../session-digest.js';
|
|
@@ -1204,3 +1205,45 @@ test('AC7: the live 62d959c0 fixture is a real question — no retraction, and t
|
|
|
1204
1205
|
assert.equal(answered.length, 1, 'the live gap was a missing session.answered');
|
|
1205
1206
|
assert.deepEqual(answered[0]?.data, { askId, messageId: 'u2' });
|
|
1206
1207
|
});
|
|
1208
|
+
|
|
1209
|
+
test('a cross-session peer row is not a user prompt, in either the marker or the text shape', () => {
|
|
1210
|
+
const envelope = 'Another Claude session sent a message:\n'
|
|
1211
|
+
+ '<cross-session-message from="uds:/tmp/peer.sock" from-name="peer" from-mode="bypass">\n'
|
|
1212
|
+
+ '选 2\n'
|
|
1213
|
+
+ '</cross-session-message>';
|
|
1214
|
+
|
|
1215
|
+
// The live shape: the CLI marks the row as machine-injected and names the peer origin.
|
|
1216
|
+
assert.equal(
|
|
1217
|
+
isUserPromptRow({
|
|
1218
|
+
type: 'user',
|
|
1219
|
+
isMeta: true,
|
|
1220
|
+
promptSource: 'system',
|
|
1221
|
+
turnOrigin: 'peer',
|
|
1222
|
+
origin: { kind: 'peer', from: 'uds:/tmp/peer.sock' },
|
|
1223
|
+
message: { role: 'user', content: envelope },
|
|
1224
|
+
}),
|
|
1225
|
+
false,
|
|
1226
|
+
'the person did not type the other session\'s message',
|
|
1227
|
+
);
|
|
1228
|
+
|
|
1229
|
+
// An older row without the origin marker still reads as synthetic from its text alone.
|
|
1230
|
+
assert.equal(
|
|
1231
|
+
isUserPromptRow({ type: 'user', message: { role: 'user', content: envelope } }),
|
|
1232
|
+
false,
|
|
1233
|
+
'the envelope and its fixed lead-in strip to emptiness',
|
|
1234
|
+
);
|
|
1235
|
+
|
|
1236
|
+
// A person's own words stay a prompt, including when they sit beside a metadata block.
|
|
1237
|
+
assert.equal(
|
|
1238
|
+
isUserPromptRow({ type: 'user', message: { role: 'user', content: '选 1,立任务' } }),
|
|
1239
|
+
true,
|
|
1240
|
+
);
|
|
1241
|
+
assert.equal(
|
|
1242
|
+
isUserPromptRow({
|
|
1243
|
+
type: 'user',
|
|
1244
|
+
message: { role: 'user', content: '<system-reminder>note</system-reminder>\n选 1,立任务' },
|
|
1245
|
+
}),
|
|
1246
|
+
true,
|
|
1247
|
+
'a real block beside an injected one still means the person spoke',
|
|
1248
|
+
);
|
|
1249
|
+
});
|
|
@@ -2,6 +2,19 @@ export { sessionSynchronizerService } from './services/session-synchronizer.serv
|
|
|
2
2
|
export { providerSkillsService } from './services/skills.service.js';
|
|
3
3
|
export { providerMcpService } from './services/mcp.service.js';
|
|
4
4
|
export { providerRuntimeService, createProviderRuntimeService } from './services/provider-runtime.service.js';
|
|
5
|
+
// The Codex upstream-provider adapter and its two injection compilers. They are
|
|
6
|
+
// public because the Settings module's AC-467 criterion drives the end-to-end
|
|
7
|
+
// path across a module boundary (where the boundaries lint requires this
|
|
8
|
+
// barrel), and because a settings surface that renders the same advanced fields
|
|
9
|
+
// needs one compiler rather than a second copy. `codexRuntime` is the per-run
|
|
10
|
+
// entry the registry composes, re-exported for the same criterion.
|
|
11
|
+
export { codexRuntime } from './list/codex/codex-runtime.provider.js';
|
|
12
|
+
export { CodexProviderModels, CODEX_PREDEFINED_MODELS } from './list/codex/codex-models.provider.js';
|
|
13
|
+
export {
|
|
14
|
+
codexOptionsForProvider,
|
|
15
|
+
codexProviderSpawnArgs,
|
|
16
|
+
type CodexModelLimits,
|
|
17
|
+
} from './list/codex/codex-provider-injection.js';
|
|
5
18
|
// ControlStopTaskOutcome: the answer the runtime gateway's stop-task verb gives
|
|
6
19
|
// (`requested` / `unsupported` / `timeout` / `error`). Exported so the websocket
|
|
7
20
|
// control handler types its pass-through against the one union rather than
|
|
@@ -1087,7 +1087,7 @@ export function deriveBackgroundWorkTrigger(
|
|
|
1087
1087
|
// The address a resident process answers to used to be *computed* here and
|
|
1088
1088
|
// handed to the CLI as `--name`. That is gone: in the CLI's ladder a launch name
|
|
1089
1089
|
// is both the session's `agent-name` and its `custom-title`, so writing one
|
|
1090
|
-
// pinned the session's name at launch, let a
|
|
1090
|
+
// pinned the session's name at launch, let a Cloudpit-invented address outrank
|
|
1091
1091
|
// an `ai-title` the session had earned, and grew another `-<id6>` on every
|
|
1092
1092
|
// restart. The app no longer names anything; it reads the name the CLI derived
|
|
1093
1093
|
// for the process, in `readCliSessionRegistration` below.
|
|
@@ -58,7 +58,21 @@ export type CodexModelDescriptor = {
|
|
|
58
58
|
hidden?: boolean;
|
|
59
59
|
isDefault?: boolean;
|
|
60
60
|
defaultReasoningEffort?: string;
|
|
61
|
-
supportedReasoningEfforts?: Array<{ reasoningEffort?: string }>;
|
|
61
|
+
supportedReasoningEfforts?: Array<{ reasoningEffort?: string; description?: string }>;
|
|
62
|
+
/**
|
|
63
|
+
* A custom catalog (`model_catalog_url`) may declare the model's window and
|
|
64
|
+
* auto-compaction threshold per entry. Codex 0.166's own `model/list` reply
|
|
65
|
+
* does not carry them, so they stay optional and are read from either the
|
|
66
|
+
* Codex-native snake_case or the app's camelCase spelling.
|
|
67
|
+
*/
|
|
68
|
+
modelContextWindow?: number;
|
|
69
|
+
modelAutoCompactTokenLimit?: number;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
/** Reads a positive integer quantity a catalog entry may report; anything else is absent. */
|
|
73
|
+
const readPositiveModelQuantity = (value: unknown): number | undefined => {
|
|
74
|
+
const parsed = typeof value === 'number' ? value : Number(value);
|
|
75
|
+
return Number.isInteger(parsed) && parsed > 0 ? parsed : undefined;
|
|
62
76
|
};
|
|
63
77
|
|
|
64
78
|
const readModelDescriptor = (value: unknown): CodexModelDescriptor | null => {
|
|
@@ -72,11 +86,25 @@ const readModelDescriptor = (value: unknown): CodexModelDescriptor | null => {
|
|
|
72
86
|
|
|
73
87
|
const efforts = Array.isArray(record.supportedReasoningEfforts)
|
|
74
88
|
? record.supportedReasoningEfforts
|
|
75
|
-
.map((entry) =>
|
|
76
|
-
|
|
77
|
-
|
|
89
|
+
.map((entry) => {
|
|
90
|
+
const effort = readOptionalString(readObjectRecord(entry)?.reasoningEffort);
|
|
91
|
+
if (effort === undefined) return undefined;
|
|
92
|
+
const description = readOptionalString(readObjectRecord(entry)?.description);
|
|
93
|
+
return {
|
|
94
|
+
reasoningEffort: effort,
|
|
95
|
+
...(description === undefined ? {} : { description }),
|
|
96
|
+
};
|
|
97
|
+
})
|
|
98
|
+
.filter((effort): effort is { reasoningEffort: string; description?: string } => effort !== undefined)
|
|
78
99
|
: undefined;
|
|
79
100
|
|
|
101
|
+
const contextWindow = readPositiveModelQuantity(
|
|
102
|
+
record.model_context_window ?? record.modelContextWindow,
|
|
103
|
+
);
|
|
104
|
+
const autoCompactTokenLimit = readPositiveModelQuantity(
|
|
105
|
+
record.model_auto_compact_token_limit ?? record.modelAutoCompactTokenLimit,
|
|
106
|
+
);
|
|
107
|
+
|
|
80
108
|
return {
|
|
81
109
|
id,
|
|
82
110
|
displayName: readOptionalString(record.displayName),
|
|
@@ -85,6 +113,10 @@ const readModelDescriptor = (value: unknown): CodexModelDescriptor | null => {
|
|
|
85
113
|
isDefault: typeof record.isDefault === 'boolean' ? record.isDefault : undefined,
|
|
86
114
|
defaultReasoningEffort: readOptionalString(record.defaultReasoningEffort),
|
|
87
115
|
supportedReasoningEfforts: efforts,
|
|
116
|
+
...(contextWindow === undefined ? {} : { modelContextWindow: contextWindow }),
|
|
117
|
+
...(autoCompactTokenLimit === undefined
|
|
118
|
+
? {}
|
|
119
|
+
: { modelAutoCompactTokenLimit: autoCompactTokenLimit }),
|
|
88
120
|
};
|
|
89
121
|
};
|
|
90
122
|
|
|
@@ -278,7 +310,7 @@ async function withAppServer<T>(
|
|
|
278
310
|
// in the stable protocol; only `beforeTurnId` and the turn-listing methods
|
|
279
311
|
// are gated behind `experimentalApi`, and neither is needed here.
|
|
280
312
|
await call('initialize', {
|
|
281
|
-
clientInfo: { name: '
|
|
313
|
+
clientInfo: { name: 'cloudpit', title: 'Cloudpit', version: '1' },
|
|
282
314
|
capabilities: {},
|
|
283
315
|
});
|
|
284
316
|
child.stdin?.write(`${JSON.stringify({ jsonrpc: '2.0', method: 'initialized', params: {} })}\n`);
|
|
@@ -213,7 +213,7 @@ export class CodexAppServerConnection {
|
|
|
213
213
|
? { experimentalApi: true }
|
|
214
214
|
: {};
|
|
215
215
|
await this.request('initialize', {
|
|
216
|
-
clientInfo: { name: '
|
|
216
|
+
clientInfo: { name: 'cloudpit', title: 'Cloudpit', version: '1' },
|
|
217
217
|
capabilities,
|
|
218
218
|
});
|
|
219
219
|
this.experimentalApiDeclaredFlag = capabilities.experimentalApi === true;
|
|
@@ -123,6 +123,13 @@ export type ResidentSession = {
|
|
|
123
123
|
export type PendingResidentLaunch = {
|
|
124
124
|
providerSessionId: string | null;
|
|
125
125
|
threadDefaults: CodexThreadDefaults;
|
|
126
|
+
/**
|
|
127
|
+
* The process launch this session's host must be spawned with, or null for
|
|
128
|
+
* the driver-wide launch. Compiled by `codex-resident-provider-launch.ts`:
|
|
129
|
+
* Codex 0.166 checks the process-global provider on every turn and again on
|
|
130
|
+
* resume, so a bound session needs `-c model_provider` at spawn time.
|
|
131
|
+
*/
|
|
132
|
+
launch: CodexAppServerLaunch | null;
|
|
126
133
|
};
|
|
127
134
|
|
|
128
135
|
/** Reads `{ thread: { id } }` from a thread start/resume result. */
|
|
@@ -176,7 +183,7 @@ export function residentThreadDefaults(options: AnyRecord): CodexThreadDefaults
|
|
|
176
183
|
}
|
|
177
184
|
|
|
178
185
|
/**
|
|
179
|
-
* The `thread/start` fields a
|
|
186
|
+
* The `thread/start` fields a Cloudpit permission mode asks for.
|
|
180
187
|
*
|
|
181
188
|
* `thread/start` takes a `sandbox` *string* (`workspace-write`,
|
|
182
189
|
* `danger-full-access`), while live settings take an object `sandboxPolicy`
|
|
@@ -239,11 +246,13 @@ export function threadDefaultsFromLaunchOptions(options: AnyRecord): CodexThread
|
|
|
239
246
|
/**
|
|
240
247
|
* The MCP server name this server's gateway is injected under.
|
|
241
248
|
*
|
|
242
|
-
* `
|
|
243
|
-
* (`claude mcp add --transport http
|
|
249
|
+
* `cloudpit` is the name the settings page tells a Claude user to connect
|
|
250
|
+
* (`claude mcp add --transport http cloudpit …`), so a Codex session and a Claude
|
|
244
251
|
* session name the same backend the same way; nothing in the driver reads it.
|
|
252
|
+
* An existing `claude mcp add … cloudcli` entry keeps working: the server name is
|
|
253
|
+
* a client-local key and authentication comes from the URL plus the PAT.
|
|
245
254
|
*/
|
|
246
|
-
export const CODEX_MCP_GATEWAY_SERVER_NAME = '
|
|
255
|
+
export const CODEX_MCP_GATEWAY_SERVER_NAME = 'cloudpit';
|
|
247
256
|
|
|
248
257
|
/**
|
|
249
258
|
* The child environment variable that carries the gateway credential.
|
|
@@ -253,7 +262,7 @@ export const CODEX_MCP_GATEWAY_SERVER_NAME = 'cloudcli';
|
|
|
253
262
|
* never appears in the process arguments — an argv token is visible to every
|
|
254
263
|
* `ps` on the machine and to the app-server's own logs.
|
|
255
264
|
*/
|
|
256
|
-
export const CODEX_MCP_GATEWAY_TOKEN_ENV = '
|
|
265
|
+
export const CODEX_MCP_GATEWAY_TOKEN_ENV = 'CLOUDPIT_MCP_GATEWAY_TOKEN';
|
|
257
266
|
|
|
258
267
|
/** One `-c key=value` config override, with the value written as a TOML basic string. */
|
|
259
268
|
function codexConfigArg(key: string, value: string): string[] {
|
|
@@ -274,8 +283,8 @@ function tomlBasicString(value: string): string {
|
|
|
274
283
|
*
|
|
275
284
|
* When a target is present the child is told about one extra HTTP MCP server:
|
|
276
285
|
*
|
|
277
|
-
* -c mcp_servers.
|
|
278
|
-
* -c mcp_servers.
|
|
286
|
+
* -c mcp_servers.cloudpit.url="http://127.0.0.1:<port>/mcp"
|
|
287
|
+
* -c mcp_servers.cloudpit.bearer_token_env_var="CLOUDPIT_MCP_GATEWAY_TOKEN"
|
|
279
288
|
*
|
|
280
289
|
* and the token is placed in the child's environment. That is the same config
|
|
281
290
|
* shape `codex.mcp` writes to `config.toml` (`url` + `bearer_token_env_var`), so
|
|
@@ -349,7 +358,7 @@ export function threadParams(
|
|
|
349
358
|
* app-server, copied from its own refusal: "Supported values are: 'none',
|
|
350
359
|
* 'minimal', 'low', 'medium', 'high', 'xhigh', and 'max'."
|
|
351
360
|
*
|
|
352
|
-
*
|
|
361
|
+
* Cloudpit's vocabulary is wider than this: `default` is its "use the model's
|
|
353
362
|
* default" sentinel (`DEFAULT_EFFORT_VALUE` in `src/shared/constants.ts`) and
|
|
354
363
|
* `ultracode` is a Claude-only pseudo-level. Neither is a codex effort, and the
|
|
355
364
|
* server rejects the whole `turn/start` with a 400 for one unknown value, so a
|
|
@@ -365,7 +374,7 @@ const CODEX_EFFORT_VALUES: Readonly<Record<string, true>> = {
|
|
|
365
374
|
max: true,
|
|
366
375
|
};
|
|
367
376
|
|
|
368
|
-
/** The codex `effort` for one
|
|
377
|
+
/** The codex `effort` for one Cloudpit effort, or undefined to leave the field off. */
|
|
369
378
|
function codexTurnEffort(effort: unknown): string | undefined {
|
|
370
379
|
return typeof effort === 'string' && CODEX_EFFORT_VALUES[effort] === true ? effort : undefined;
|
|
371
380
|
}
|