@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
|
@@ -3,10 +3,17 @@
|
|
|
3
3
|
*
|
|
4
4
|
* GOAL-053 left the Cloudpit pipeline DARK: the resolver, the settings fallback, the dual asset
|
|
5
5
|
* roots and the scope alias table existed, but every runtime default still pointed at the legacy
|
|
6
|
-
* layout. This file drives the flip — default `~/.cloudpit`, settings
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
* layout. This file drives the flip — default `~/.cloudpit`, one-time settings migration, uploads
|
|
7
|
+
* to the new asset root, both observation URI spellings, the new MCP server name, the two scope
|
|
8
|
+
* vocabularies and the two service-worker cache prefixes — against temp homes and fakes, so it
|
|
9
|
+
* never reads or writes the developer's real `~`.
|
|
10
|
+
*
|
|
11
|
+
* v3.0 retired the runtime fallbacks: `defaultRoot: 'legacy'`, the failed-migration fallback to
|
|
12
|
+
* `~/.cloudcli`, the legacy settings read fallback and the `CLOUDCLI_*` environment spellings are
|
|
13
|
+
* all gone. This batch also retires the identity contracts: the cloudcli deep link and observation
|
|
14
|
+
* URI spelling, the two legacy MCP names, the `cloudcli:*` OAuth scope spelling and the
|
|
15
|
+
* `claude-ui-*` service-worker cache family. The arms below assert the one-time migrations still
|
|
16
|
+
* work and that the retired paths are ignored.
|
|
10
17
|
*
|
|
11
18
|
* Run directly:
|
|
12
19
|
* npx tsx --tsconfig server/tsconfig.json --test server/shared/tests/cloudpit-runtime-flip.test.ts
|
|
@@ -29,7 +36,6 @@ import {
|
|
|
29
36
|
readMcpPrincipal,
|
|
30
37
|
} from '@/modules/mcp-gateway/index.js';
|
|
31
38
|
import {
|
|
32
|
-
LEGACY_MCP_SERVER_NAMES,
|
|
33
39
|
MCP_SERVER_NAME,
|
|
34
40
|
mcpServerNamesToRemove,
|
|
35
41
|
} from '@/modules/browser-use/index.js';
|
|
@@ -47,7 +53,11 @@ import {
|
|
|
47
53
|
import { createBrandEnvReader } from '@/shared/brand.js';
|
|
48
54
|
import { resolveDataRoots } from '@/shared/data-root.js';
|
|
49
55
|
import { getImageAssetsReadDirs, getImageAssetsWriteDir } from '@/shared/image-attachments.js';
|
|
50
|
-
import {
|
|
56
|
+
import {
|
|
57
|
+
ACCEPTED_ACCESS_TOKEN_SCOPES,
|
|
58
|
+
ACCESS_TOKEN_SCOPES,
|
|
59
|
+
CLOUDPIT_ACCESS_TOKEN_SCOPES,
|
|
60
|
+
} from '@/shared/mcp-contract/index.js';
|
|
51
61
|
import { defaultServerSettingsPath } from '@/shared/settings-file.js';
|
|
52
62
|
|
|
53
63
|
const APPLICATION_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..', '..');
|
|
@@ -62,7 +72,7 @@ function temporaryHome(prefix: string): string {
|
|
|
62
72
|
return mkdtempSync(path.join(os.tmpdir(), prefix));
|
|
63
73
|
}
|
|
64
74
|
|
|
65
|
-
test('AC2/AC11: the Cloudpit default root migrates a legacy layout
|
|
75
|
+
test('AC2/AC11 (v3.0): the Cloudpit default root migrates a legacy layout; no legacy mode is selectable', () => {
|
|
66
76
|
const homeDir = temporaryHome('cloudpit-runtime-root-');
|
|
67
77
|
try {
|
|
68
78
|
const legacyRoot = path.join(homeDir, '.cloudcli');
|
|
@@ -71,7 +81,6 @@ test('AC2/AC11: the Cloudpit default root migrates a legacy layout, and the lega
|
|
|
71
81
|
writeFileSync(path.join(legacyRoot, 'cockpit-card-feedback.json'), '{"kept":true}\n');
|
|
72
82
|
|
|
73
83
|
const plan = resolveDataRoots({
|
|
74
|
-
defaultRoot: 'cloudpit',
|
|
75
84
|
env: {},
|
|
76
85
|
homeDir,
|
|
77
86
|
version: 'criterion',
|
|
@@ -99,11 +108,16 @@ test('AC2/AC11: the Cloudpit default root migrates a legacy layout, and the lega
|
|
|
99
108
|
// The legacy root is only ever READ.
|
|
100
109
|
assert.equal(readFileSync(path.join(legacyRoot, 'auth.db'), 'utf8'), 'legacy-database');
|
|
101
110
|
|
|
102
|
-
// AC11's negative control: the
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
111
|
+
// AC11's negative control: the retired `defaultRoot: 'legacy'` option no longer moves the
|
|
112
|
+
// default back to the old root — it is not part of the resolver's public shape, so a caller
|
|
113
|
+
// that still passes it keeps the Cloudpit root.
|
|
114
|
+
const ignoredMode = resolveDataRoots({
|
|
115
|
+
defaultRoot: 'legacy',
|
|
116
|
+
env: {},
|
|
117
|
+
homeDir,
|
|
118
|
+
} as unknown as Parameters<typeof resolveDataRoots>[0]);
|
|
119
|
+
assert.equal(ignoredMode.activeRoot, path.join(homeDir, '.cloudpit'));
|
|
120
|
+
assert.equal(ignoredMode.reason, 'default-already-migrated');
|
|
107
121
|
} finally {
|
|
108
122
|
rmSync(homeDir, { recursive: true, force: true });
|
|
109
123
|
}
|
|
@@ -114,8 +128,7 @@ test('AC2/AC11: the Cloudpit default root migrates a legacy layout, and the lega
|
|
|
114
128
|
mkdirSync(failingLegacyRoot, { recursive: true });
|
|
115
129
|
writeFileSync(path.join(failingLegacyRoot, 'auth.db'), 'legacy-database');
|
|
116
130
|
|
|
117
|
-
const
|
|
118
|
-
defaultRoot: 'cloudpit',
|
|
131
|
+
const failure = resolveDataRoots({
|
|
119
132
|
env: {},
|
|
120
133
|
homeDir: failingHome,
|
|
121
134
|
backupDatabase: () => {
|
|
@@ -123,9 +136,10 @@ test('AC2/AC11: the Cloudpit default root migrates a legacy layout, and the lega
|
|
|
123
136
|
},
|
|
124
137
|
});
|
|
125
138
|
|
|
126
|
-
assert.equal(
|
|
127
|
-
assert.equal(
|
|
128
|
-
assert.equal(
|
|
139
|
+
assert.equal(failure.activeRoot, path.join(failingHome, '.cloudpit'), 'no fallback to ~/.cloudcli');
|
|
140
|
+
assert.equal(failure.reason, 'migration-failed');
|
|
141
|
+
assert.equal(failure.migrated, false);
|
|
142
|
+
assert.match(failure.migrationError ?? '', /SQLITE_BUSY/);
|
|
129
143
|
assert.equal(
|
|
130
144
|
existsSync(path.join(failingHome, '.cloudpit')),
|
|
131
145
|
false,
|
|
@@ -142,8 +156,8 @@ test('AC3: the bootstrap and the CLI derive the default database from the resolv
|
|
|
142
156
|
const indexSource = readApplicationFile('server/index.ts');
|
|
143
157
|
|
|
144
158
|
assert.ok(
|
|
145
|
-
loadEnvSource.includes(
|
|
146
|
-
'load-env.ts must resolve the Cloudpit default',
|
|
159
|
+
loadEnvSource.includes('resolveDataRoots()'),
|
|
160
|
+
'load-env.ts must resolve the one Cloudpit default',
|
|
147
161
|
);
|
|
148
162
|
assert.ok(
|
|
149
163
|
loadEnvSource.includes('process.env.DATABASE_PATH = DATA_ROOTS.authDatabasePath'),
|
|
@@ -155,7 +169,7 @@ test('AC3: the bootstrap and the CLI derive the default database from the resolv
|
|
|
155
169
|
);
|
|
156
170
|
|
|
157
171
|
assert.ok(
|
|
158
|
-
cliModuleSource.includes(
|
|
172
|
+
cliModuleSource.includes('resolveDataRoots({ homeDir: homeDirectory })'),
|
|
159
173
|
'cli.module.ts must derive its default database path from the resolver',
|
|
160
174
|
);
|
|
161
175
|
assert.ok(
|
|
@@ -179,7 +193,7 @@ test('AC3: the bootstrap and the CLI derive the default database from the resolv
|
|
|
179
193
|
);
|
|
180
194
|
});
|
|
181
195
|
|
|
182
|
-
test('AC4/AC11:
|
|
196
|
+
test('AC4/AC11 (v3.0): the legacy settings file is copied once, then only the Cloudpit file is read', () => {
|
|
183
197
|
const homeDir = temporaryHome('cloudpit-runtime-settings-');
|
|
184
198
|
try {
|
|
185
199
|
const newDefault = path.join(homeDir, '.config', 'cloudpit', 'server.settings.json');
|
|
@@ -191,21 +205,40 @@ test('AC4/AC11: settings read the legacy file but always write the Cloudpit path
|
|
|
191
205
|
legacyDefault,
|
|
192
206
|
`${JSON.stringify({ cockpit: { sessionStart: { model: 'legacy-model', effort: 'high' } } }, null, 2)}\n`,
|
|
193
207
|
);
|
|
208
|
+
assert.equal(existsSync(newDefault), false, 'the Cloudpit file does not exist before the first boot');
|
|
194
209
|
|
|
210
|
+
// The first boot copies the legacy file to the Cloudpit path and reads the new one.
|
|
195
211
|
const settings = loadServerSettings({ homeDir, env: {} });
|
|
196
212
|
assert.equal(settings.cockpit.sessionStart.model, 'legacy-model');
|
|
197
213
|
assert.equal(settings.cockpit.sessionStart.effort, 'high');
|
|
198
|
-
assert.deepEqual(settings.problems, []
|
|
214
|
+
assert.deepEqual(settings.problems, []);
|
|
215
|
+
assert.equal(existsSync(newDefault), true, 'the first boot must create the Cloudpit settings file');
|
|
216
|
+
assert.deepEqual(
|
|
217
|
+
readFileSync(newDefault),
|
|
218
|
+
readFileSync(legacyDefault),
|
|
219
|
+
'the one-time migration copies the legacy document verbatim',
|
|
220
|
+
);
|
|
199
221
|
|
|
200
222
|
const boot = readCockpitSessionStartBoot();
|
|
201
223
|
assert.ok(boot, 'the boot loader must record its reading');
|
|
202
|
-
assert.equal(boot.path,
|
|
203
|
-
assert.equal(boot.writePath, newDefault, 'a save
|
|
224
|
+
assert.equal(boot.path, newDefault, 'the effective values come from the Cloudpit file');
|
|
225
|
+
assert.equal(boot.writePath, newDefault, 'a save lands in the same Cloudpit file');
|
|
204
226
|
|
|
205
227
|
const target = resolveServerSettingsFileTarget({ homeDir, env: {} });
|
|
206
|
-
assert.
|
|
207
|
-
|
|
208
|
-
|
|
228
|
+
assert.deepEqual(target, { path: newDefault, writePath: newDefault, explicit: false });
|
|
229
|
+
|
|
230
|
+
// Editing the legacy file afterwards has no effect: only the Cloudpit file is read.
|
|
231
|
+
writeFileSync(
|
|
232
|
+
legacyDefault,
|
|
233
|
+
`${JSON.stringify({ cockpit: { sessionStart: { model: 'edited-legacy', effort: 'low' } } })}\n`,
|
|
234
|
+
);
|
|
235
|
+
assert.equal(loadServerSettings({ homeDir, env: {} }).cockpit.sessionStart.model, 'legacy-model');
|
|
236
|
+
|
|
237
|
+
// A save made after the copy is never clobbered by a later resolution (idempotent migration).
|
|
238
|
+
const savedDocument = `${JSON.stringify({ cockpit: { sessionStart: { model: 'saved-cloudpit' } } }, null, 2)}\n`;
|
|
239
|
+
writeFileSync(newDefault, savedDocument);
|
|
240
|
+
resolveServerSettingsFileTarget({ homeDir, env: {} });
|
|
241
|
+
assert.equal(readFileSync(newDefault, 'utf8'), savedDocument, 'the second run must not overwrite the user file');
|
|
209
242
|
|
|
210
243
|
// Explicit overrides are unchanged: the named file is both read and written.
|
|
211
244
|
const explicitPath = path.join(homeDir, 'operator', 'custom.settings.json');
|
|
@@ -216,11 +249,6 @@ test('AC4/AC11: settings read the legacy file but always write the Cloudpit path
|
|
|
216
249
|
env: { SERVER_SETTINGS_PATH: explicitPath },
|
|
217
250
|
});
|
|
218
251
|
assert.deepEqual(byEnvironment, { path: explicitPath, writePath: explicitPath, explicit: true });
|
|
219
|
-
|
|
220
|
-
// With both files present the Cloudpit default wins.
|
|
221
|
-
mkdirSync(path.dirname(newDefault), { recursive: true });
|
|
222
|
-
writeFileSync(newDefault, `${JSON.stringify({ cockpit: { sessionStart: { model: 'new-model' } } })}\n`);
|
|
223
|
-
assert.equal(loadServerSettings({ homeDir, env: {} }).cockpit.sessionStart.model, 'new-model');
|
|
224
252
|
} finally {
|
|
225
253
|
rmSync(homeDir, { recursive: true, force: true });
|
|
226
254
|
}
|
|
@@ -258,7 +286,7 @@ test('AC5/AC11: uploads write the Cloudpit root, the legacy root stays readable'
|
|
|
258
286
|
}
|
|
259
287
|
});
|
|
260
288
|
|
|
261
|
-
test('AC6:
|
|
289
|
+
test('AC6 (v3.0): cloudpit is the only deep link and the only observation URI spelling', () => {
|
|
262
290
|
const packageJson = JSON.parse(readApplicationFile('package.json')) as {
|
|
263
291
|
build: {
|
|
264
292
|
protocols: Array<{ name: string; schemes: string[] }>;
|
|
@@ -266,7 +294,9 @@ test('AC6: both protocols are declared/registered and both observation URI spell
|
|
|
266
294
|
};
|
|
267
295
|
};
|
|
268
296
|
const protocolSchemes = packageJson.build.protocols.flatMap((entry) => entry.schemes);
|
|
269
|
-
|
|
297
|
+
// The cloudcli scheme stays DECLARED for the third-party `cloudcli://auth/callback`; it is
|
|
298
|
+
// no longer a deep link this build registers at runtime.
|
|
299
|
+
assert.ok(protocolSchemes.includes('cloudcli'), 'the auth-callback scheme must stay declared');
|
|
270
300
|
assert.ok(protocolSchemes.includes('cloudpit'), 'the Cloudpit scheme must be declared');
|
|
271
301
|
const macSchemes = packageJson.build.mac.extendInfo.CFBundleURLTypes.flatMap(
|
|
272
302
|
(entry) => entry.CFBundleURLSchemes,
|
|
@@ -274,32 +304,34 @@ test('AC6: both protocols are declared/registered and both observation URI spell
|
|
|
274
304
|
assert.ok(macSchemes.includes('cloudcli') && macSchemes.includes('cloudpit'));
|
|
275
305
|
|
|
276
306
|
const electronSource = readApplicationFile('electron/main.js');
|
|
277
|
-
//
|
|
278
|
-
|
|
279
|
-
assert.match(electronSource, /const
|
|
307
|
+
// 3.0 registers exactly one deep-link scheme; the callback protocol is parsed separately.
|
|
308
|
+
assert.match(electronSource, /const DEEP_LINK_SCHEMES = \['cloudpit'\];/);
|
|
309
|
+
assert.match(electronSource, /const CALLBACK_PROTOCOL = 'cloudcli';/);
|
|
280
310
|
const registerSource = electronSource.slice(
|
|
281
311
|
electronSource.indexOf('function registerProtocolHandler'),
|
|
282
312
|
);
|
|
283
313
|
assert.ok(registerSource.includes('for (const scheme of DEEP_LINK_SCHEMES)'));
|
|
284
|
-
assert.ok(
|
|
285
|
-
registerSource.includes('app.setAsDefaultProtocolClient(scheme'),
|
|
286
|
-
'both schemes must reach setAsDefaultProtocolClient',
|
|
287
|
-
);
|
|
314
|
+
assert.ok(registerSource.includes('app.setAsDefaultProtocolClient(scheme'));
|
|
288
315
|
|
|
289
|
-
|
|
316
|
+
// 3.0 owns one observation spelling. The canonical one still parses; the retired 2.x read
|
|
317
|
+
// spelling is a null, not a normalization.
|
|
290
318
|
const cloudpitParsed = parseObservationUri('cloudpit://session/x');
|
|
291
|
-
assert.ok(
|
|
292
|
-
assert.
|
|
293
|
-
assert.equal(cloudpitParsed.
|
|
294
|
-
assert.equal(
|
|
295
|
-
assert.equal(
|
|
296
|
-
|
|
297
|
-
|
|
319
|
+
assert.ok(cloudpitParsed);
|
|
320
|
+
assert.equal(cloudpitParsed.uri, 'cloudpit://session/x');
|
|
321
|
+
assert.equal(cloudpitParsed.scheme, 'cloudpit');
|
|
322
|
+
assert.equal(parseObservationUri('cloudcli://session/x'), null, 'the 2.x session spelling is retired');
|
|
323
|
+
assert.equal(
|
|
324
|
+
parseObservationUri('cloudcli://architecture/project-1'),
|
|
325
|
+
null,
|
|
326
|
+
'the 2.x architecture spelling is retired',
|
|
327
|
+
);
|
|
328
|
+
assert.equal(formatSessionUri('x'), 'cloudpit://session/x');
|
|
329
|
+
assert.equal(formatArchitectureUri('project-1'), 'cloudpit://architecture/project-1');
|
|
298
330
|
|
|
299
331
|
// The two compilers carry separate copies of the grammar; the accepted-scheme line must be
|
|
300
332
|
// textually identical so a later edit cannot widen one side only.
|
|
301
333
|
const regexLineOf = (source: string): string => {
|
|
302
|
-
const line = source.split('\n').find((entry) => entry.includes('const
|
|
334
|
+
const line = source.split('\n').find((entry) => entry.includes('const CLOUDPIT_URI = new RegExp('));
|
|
303
335
|
assert.ok(line, 'the URI grammar line must exist');
|
|
304
336
|
return line.trim();
|
|
305
337
|
};
|
|
@@ -309,21 +341,41 @@ test('AC6: both protocols are declared/registered and both observation URI spell
|
|
|
309
341
|
);
|
|
310
342
|
|
|
311
343
|
const storeSource = readApplicationFile('server/modules/observation/observation-store.ts');
|
|
312
|
-
assert.ok(storeSource.includes('cloudpit://session/<id>'), 'the INVALID_URI message names
|
|
344
|
+
assert.ok(storeSource.includes('cloudpit://session/<id>'), 'the INVALID_URI message names the grammar');
|
|
345
|
+
assert.equal(
|
|
346
|
+
storeSource.includes('cloudcli://session/<id>'),
|
|
347
|
+
false,
|
|
348
|
+
'the INVALID_URI message no longer offers the retired spelling',
|
|
349
|
+
);
|
|
313
350
|
});
|
|
314
351
|
|
|
315
|
-
test('
|
|
352
|
+
test('AC6b (v3.0): the R14 itemRef formatters keep the legacy spelling, outside the observation grammar', () => {
|
|
353
|
+
// R14 is an item-addressing contract persisted on messages/cards, NOT the observation URI
|
|
354
|
+
// grammar retired above. A blanket `cloudcli://` deletion must not reach these two files.
|
|
355
|
+
const briefFormatter = readApplicationFile('server/modules/cockpit/cockpit-brief-result.ts');
|
|
356
|
+
assert.ok(
|
|
357
|
+
briefFormatter.includes('`cloudcli://session/${input.sessionId}`'),
|
|
358
|
+
'the brief itemRef formatter must keep writing cloudcli://session/<id>',
|
|
359
|
+
);
|
|
360
|
+
const replyFormatter = readApplicationFile(
|
|
361
|
+
'src/modules/chat-transcript/utils/transcript/replyItems.ts',
|
|
362
|
+
);
|
|
363
|
+
assert.ok(
|
|
364
|
+
replyFormatter.includes('`cloudcli://session/${address.sessionId}/msg/${address.messageId}#item-${address.ordinal}`'),
|
|
365
|
+
'the reply-item formatter must keep writing cloudcli://session/<id>/msg/<messageId>#item-<n>',
|
|
366
|
+
);
|
|
367
|
+
// The retired observation grammar rejects the same prefix: the two contracts stay separate.
|
|
368
|
+
assert.equal(parseObservationUri('cloudcli://session/x'), null);
|
|
369
|
+
});
|
|
370
|
+
|
|
371
|
+
test('AC7 (v3.0): MCP registers and cleans exactly the Cloudpit name', () => {
|
|
316
372
|
assert.equal(MCP_SERVER_NAME, 'cloudpit-browser');
|
|
317
|
-
assert.deepEqual(
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
'cloudcli-browser',
|
|
321
|
-
'cloudcli-browser-use',
|
|
322
|
-
]);
|
|
323
|
-
|
|
324
|
-
// Negative control: a name outside the current + legacy set is never a cleanup target.
|
|
373
|
+
assert.deepEqual(mcpServerNamesToRemove(), ['cloudpit-browser']);
|
|
374
|
+
|
|
375
|
+
// Negative control: neither a third-party name nor a retired spelling is a cleanup target.
|
|
325
376
|
assert.equal(mcpServerNamesToRemove().includes('experimental-browser'), false);
|
|
326
|
-
assert.equal(
|
|
377
|
+
assert.equal(mcpServerNamesToRemove().includes('cloudcli-browser'), false);
|
|
378
|
+
assert.equal(mcpServerNamesToRemove().includes('cloudcli-browser-use'), false);
|
|
327
379
|
|
|
328
380
|
const entrySource = readApplicationFile('server/modules/cli/browser-use-mcp.ts');
|
|
329
381
|
assert.match(
|
|
@@ -363,30 +415,35 @@ function principalForScopes(scopes: string[]) {
|
|
|
363
415
|
return readMcpPrincipal(response);
|
|
364
416
|
}
|
|
365
417
|
|
|
366
|
-
test('AC8
|
|
418
|
+
test('AC8 (v3.0): the advertised and accepted vocabulary is the eight Cloudpit scopes only', () => {
|
|
367
419
|
const metadata = buildAuthorizationServerMetadata({
|
|
368
420
|
baseUrl: 'https://cloudpit.example.test',
|
|
369
421
|
dcrMode: 'off',
|
|
370
422
|
});
|
|
371
423
|
assert.equal(CLOUDPIT_ACCESS_TOKEN_SCOPES.length, 8);
|
|
372
|
-
assert.equal(ACCESS_TOKEN_SCOPES.length, 8);
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
424
|
+
assert.equal(ACCESS_TOKEN_SCOPES.length, 8, 'the canonical table keeps its eight names');
|
|
425
|
+
assert.deepEqual(
|
|
426
|
+
[...metadata.scopes_supported],
|
|
427
|
+
[...CLOUDPIT_ACCESS_TOKEN_SCOPES],
|
|
428
|
+
'AS metadata advertises the wire vocabulary, once',
|
|
429
|
+
);
|
|
430
|
+
assert.equal(metadata.scopes_supported.length, 8);
|
|
431
|
+
for (const scope of metadata.scopes_supported) {
|
|
432
|
+
assert.ok(scope.startsWith('cloudpit:'), `AS metadata must advertise a cloudpit scope (saw ${scope})`);
|
|
378
433
|
}
|
|
379
|
-
assert.equal(metadata.scopes_supported.length, 16);
|
|
380
434
|
|
|
381
|
-
//
|
|
382
|
-
assert.deepEqual(
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
assert.deepEqual(normalizeAccessTokenScopes(['cloudpit:read', '
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
435
|
+
// ACCEPTED is the one wire spelling: the canonical names are internal, never a request.
|
|
436
|
+
assert.deepEqual([...ACCEPTED_ACCESS_TOKEN_SCOPES], [...CLOUDPIT_ACCESS_TOKEN_SCOPES]);
|
|
437
|
+
assert.equal(ACCEPTED_ACCESS_TOKEN_SCOPES.includes('cloudcli:read'), false);
|
|
438
|
+
|
|
439
|
+
// New spelling issues; the retired 2.x spelling is refused at the boundary.
|
|
440
|
+
assert.deepEqual(normalizeAccessTokenScopes(['cloudpit:read']), { ok: true, scopes: ['cloudpit:read'] });
|
|
441
|
+
assert.deepEqual(normalizeAccessTokenScopes(['cloudcli:read']), { ok: false });
|
|
442
|
+
assert.deepEqual(
|
|
443
|
+
normalizeAccessTokenScopes(['cloudcli:read', 'cloudcli:session:send']),
|
|
444
|
+
{ ok: false },
|
|
445
|
+
'a request naming any retired spelling is refused',
|
|
446
|
+
);
|
|
390
447
|
assert.deepEqual(normalizeAccessTokenScopes(['cloudpit:read', 'cloudpit:session:send']), {
|
|
391
448
|
ok: true,
|
|
392
449
|
scopes: ['cloudpit:read', 'cloudpit:session:send'],
|
|
@@ -394,25 +451,22 @@ test('AC8/AC11: both scope vocabularies are issued and judged; unknown scopes st
|
|
|
394
451
|
assert.deepEqual(normalizeAccessTokenScopes(['cloudcli:admin']), { ok: false });
|
|
395
452
|
assert.deepEqual(normalizeAccessTokenScopes(['cloudpit:unknown']), { ok: false });
|
|
396
453
|
|
|
397
|
-
//
|
|
398
|
-
// required scope. The principal is built from the minted scope list, so dropping the old
|
|
399
|
-
// spelling from the accepted table would refuse the mint here.
|
|
400
|
-
const legacyMinted = normalizeAccessTokenScopes(['cloudcli:read']);
|
|
401
|
-
assert.deepEqual(legacyMinted, { ok: true, scopes: ['cloudcli:read'] });
|
|
402
|
-
const legacyPrincipal = principalForScopes(legacyMinted.ok ? legacyMinted.scopes : []);
|
|
403
|
-
assert.ok(legacyPrincipal);
|
|
404
|
-
assert.ok(legacyPrincipal.scopes.includes('cloudcli:read'));
|
|
405
|
-
|
|
406
|
-
// A token minted with the Cloudpit spelling is judged by the same old literal.
|
|
454
|
+
// A token minted with the new spelling is judged by the canonical `requiredScopes` literals.
|
|
407
455
|
const cloudpitMinted = normalizeAccessTokenScopes(['cloudpit:read', 'cloudpit:session:send']);
|
|
408
456
|
assert.deepEqual(cloudpitMinted, { ok: true, scopes: ['cloudpit:read', 'cloudpit:session:send'] });
|
|
409
457
|
const cloudpitPrincipal = principalForScopes(cloudpitMinted.ok ? cloudpitMinted.scopes : []);
|
|
410
458
|
assert.ok(cloudpitPrincipal);
|
|
411
459
|
assert.deepEqual(cloudpitPrincipal.scopes, ['cloudcli:read', 'cloudcli:session:send']);
|
|
412
460
|
assert.ok(cloudpitPrincipal.scopes.includes('cloudcli:read'));
|
|
461
|
+
|
|
462
|
+
// The old-token arm: a token row minted before 3.0 still carries the canonical spelling and
|
|
463
|
+
// still authenticates and satisfies the required scope (no forced invalidation).
|
|
464
|
+
const legacyPrincipal = principalForScopes(['cloudcli:read']);
|
|
465
|
+
assert.ok(legacyPrincipal);
|
|
466
|
+
assert.ok(legacyPrincipal.scopes.includes('cloudcli:read'));
|
|
413
467
|
});
|
|
414
468
|
|
|
415
|
-
test('AC9: activation deletes
|
|
469
|
+
test('AC9 (v3.0): activation deletes only the cloudpit- family and keeps unrelated caches', async () => {
|
|
416
470
|
const cacheNames = [
|
|
417
471
|
'cloudpit-v1',
|
|
418
472
|
'cloudpit-old',
|
|
@@ -457,64 +511,49 @@ test('AC9: activation deletes both cache families and keeps unrelated caches', a
|
|
|
457
511
|
activate({ waitUntil: (promise) => { pending = promise; } });
|
|
458
512
|
await pending;
|
|
459
513
|
|
|
460
|
-
assert.deepEqual([...deleted].sort(), ['
|
|
461
|
-
assert.equal(deleted.includes('cloudpit-v1'), false);
|
|
514
|
+
assert.deepEqual([...deleted].sort(), ['cloudpit-old'], 'only this worker\'s own prefix is purged');
|
|
515
|
+
assert.equal(deleted.includes('cloudpit-v1'), false, 'the current cache is never deleted');
|
|
516
|
+
assert.equal(deleted.includes('claude-ui-v3'), false, 'the retired 1.x family is no longer cleaned');
|
|
517
|
+
assert.equal(deleted.includes('claude-ui-legacy'), false);
|
|
462
518
|
assert.equal(deleted.includes('voice-client-asr-model-v1'), false);
|
|
463
519
|
assert.equal(deleted.includes('other'), false);
|
|
464
520
|
assert.equal(claimed, true);
|
|
465
521
|
});
|
|
466
522
|
|
|
467
|
-
test('AC10/AC11: CLOUDPIT_* is the
|
|
468
|
-
// New name only:
|
|
469
|
-
const newOnlyWarnings: string[] = [];
|
|
523
|
+
test('AC10/AC11 (v3.0): CLOUDPIT_* is the only environment spelling read', () => {
|
|
524
|
+
// New name only: the reading names the canonical key.
|
|
470
525
|
const newOnly = createBrandEnvReader({
|
|
471
526
|
env: { CLOUDPIT_HOME: '/new/home' },
|
|
472
|
-
warn: (message) => newOnlyWarnings.push(message),
|
|
473
527
|
}).read('HOME');
|
|
474
528
|
assert.deepEqual(newOnly, { value: '/new/home', source: 'new', key: 'CLOUDPIT_HOME' });
|
|
475
|
-
assert.deepEqual(newOnlyWarnings, [], 'the canonical spelling must not warn');
|
|
476
529
|
|
|
477
|
-
// Both set: the Cloudpit spelling wins and the legacy one is not
|
|
478
|
-
const bothWarnings: string[] = [];
|
|
530
|
+
// Both set: the Cloudpit spelling wins and the legacy one is not read.
|
|
479
531
|
const both = createBrandEnvReader({
|
|
480
532
|
env: { CLOUDPIT_HOME: '/new/home', CLOUDCLI_HOME: '/legacy/home' },
|
|
481
|
-
warn: (message) => bothWarnings.push(message),
|
|
482
533
|
}).read('HOME');
|
|
483
534
|
assert.deepEqual(both, { value: '/new/home', source: 'new', key: 'CLOUDPIT_HOME' });
|
|
484
|
-
assert.deepEqual(bothWarnings, [], 'a legacy value shadowed by the new spelling must not warn');
|
|
485
535
|
|
|
486
|
-
// Legacy name only:
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
});
|
|
492
|
-
assert.deepEqual(legacyReader.read('HOME'), {
|
|
493
|
-
value: '/legacy/home',
|
|
494
|
-
source: 'legacy',
|
|
495
|
-
key: 'CLOUDCLI_HOME',
|
|
496
|
-
});
|
|
497
|
-
assert.equal(legacyWarnings.length, 1, 'using the legacy spelling warns once');
|
|
498
|
-
assert.match(legacyWarnings[0], /CLOUDCLI_HOME is deprecated; set CLOUDPIT_HOME instead\./);
|
|
499
|
-
legacyReader.read('HOME');
|
|
500
|
-
assert.equal(legacyWarnings.length, 1, 'a second read of the same key stays silent');
|
|
536
|
+
// Legacy name only: no fallback any more — the read is absent (the shipped default applies).
|
|
537
|
+
assert.deepEqual(
|
|
538
|
+
createBrandEnvReader({ env: { CLOUDCLI_HOME: '/legacy/home' } }).read('HOME'),
|
|
539
|
+
{ value: undefined, source: 'absent', key: 'CLOUDPIT_HOME' },
|
|
540
|
+
);
|
|
501
541
|
|
|
502
542
|
// Absent: the reading still names the canonical key the operator should set.
|
|
503
|
-
assert.deepEqual(createBrandEnvReader({ env: {}
|
|
543
|
+
assert.deepEqual(createBrandEnvReader({ env: {} }).read('HOME'), {
|
|
504
544
|
value: undefined,
|
|
505
545
|
source: 'absent',
|
|
506
546
|
key: 'CLOUDPIT_HOME',
|
|
507
547
|
});
|
|
508
548
|
|
|
509
|
-
// The production resolver
|
|
510
|
-
//
|
|
549
|
+
// The production resolver reads the same one spelling: CLOUDPIT_HOME wins, and a
|
|
550
|
+
// CLOUDCLI_HOME-only environment selects the default `~/.cloudpit` root instead.
|
|
511
551
|
const homeDir = temporaryHome('cloudpit-runtime-env-');
|
|
512
552
|
try {
|
|
513
553
|
const newRoot = path.join(homeDir, 'explicit-new');
|
|
514
554
|
const legacyRoot = path.join(homeDir, 'explicit-legacy');
|
|
515
555
|
assert.equal(
|
|
516
556
|
resolveDataRoots({
|
|
517
|
-
defaultRoot: 'cloudpit',
|
|
518
557
|
env: { CLOUDPIT_HOME: newRoot, CLOUDCLI_HOME: legacyRoot },
|
|
519
558
|
homeDir,
|
|
520
559
|
}).activeRoot,
|
|
@@ -522,9 +561,9 @@ test('AC10/AC11: CLOUDPIT_* is the canonical environment spelling, CLOUDCLI_* st
|
|
|
522
561
|
'CLOUDPIT_HOME must win over CLOUDCLI_HOME',
|
|
523
562
|
);
|
|
524
563
|
assert.equal(
|
|
525
|
-
resolveDataRoots({
|
|
526
|
-
|
|
527
|
-
'CLOUDCLI_HOME must
|
|
564
|
+
resolveDataRoots({ env: { CLOUDCLI_HOME: legacyRoot }, homeDir }).activeRoot,
|
|
565
|
+
path.join(homeDir, '.cloudpit'),
|
|
566
|
+
'CLOUDCLI_HOME must no longer select a root',
|
|
528
567
|
);
|
|
529
568
|
} finally {
|
|
530
569
|
rmSync(homeDir, { recursive: true, force: true });
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
|
-
"measuredAt": "2026-
|
|
2
|
+
"measuredAt": "2026-11-02",
|
|
3
3
|
"scope": "every non-test .ts/.tsx under src/ (tests/ directories pruned, *.test.*/*.spec.* dropped), paths relative to src/",
|
|
4
|
-
"note": "Committed baseline for the frontend import-cycle ratchets (tasks/gap-routine-architecture-analysis-src-import-cycles-unpinned.md, tasks/gap-routine-architecture-analysis-src-module-scc-cockpit-hub.md). A RATCHET: cycleGroups and moduleSccGroups may only SHRINK. A group closed by a refactor is lowered explicitly here and in the matching in-file pin in the same commit; never raise or add a group to accommodate a red reading. `cycleGroups` is the DIRECTORY reading; `moduleSccGroups` is the MODULE reading (`modules/<name>` nodes collapsed from the same walk). `readings` records the tree the pin was measured on (same walk, resolver and Tarjan scanner as AC-394's server budget, with src/ as the scan root so @/ resolves to src/); the counts are provenance, not a gate, because a new acyclic import is ordinary feature work.",
|
|
4
|
+
"note": "Committed baseline for the frontend import-cycle ratchets (tasks/gap-routine-architecture-analysis-src-import-cycles-unpinned.md, tasks/gap-routine-architecture-analysis-src-module-scc-cockpit-hub.md). A RATCHET: cycleGroups and moduleSccGroups may only SHRINK. A group closed by a refactor is lowered explicitly here and in the matching in-file pin in the same commit; never raise or add a group to accommodate a red reading. `cycleGroups` is the DIRECTORY reading; `moduleSccGroups` is the MODULE reading (`modules/<name>` nodes collapsed from the same walk). `readings` records the tree the pin was measured on (same walk, resolver and Tarjan scanner as AC-394's server budget, with src/ as the scan root so @/ resolves to src/); the counts are provenance, not a gate, because a new acyclic import is ordinary feature work. RE-READ 2026-11-02 (task gap-routine-architecture-analysis-god-package-src-cockpit): the cockpit god-package split moved the card and workspace files into src/modules/cockpit/cards and src/modules/cockpit/workspace; because those files already imported each other and the root barrel, the one cockpit dependency web now spans four cockpit directories plus project-workspace. cycleGroups was re-measured and re-pinned member-for-member (not dropped); the module-level SCC is unchanged. The readings below were re-measured on the same tree.",
|
|
5
5
|
"readings": {
|
|
6
|
-
"files":
|
|
7
|
-
"staticFileEdges":
|
|
8
|
-
"dynamicFileEdges":
|
|
9
|
-
"nodeCount":
|
|
6
|
+
"files": 703,
|
|
7
|
+
"staticFileEdges": 2467,
|
|
8
|
+
"dynamicFileEdges": 0,
|
|
9
|
+
"nodeCount": 122,
|
|
10
10
|
"unresolvedInternal": 100,
|
|
11
11
|
"nonLiteralDynamic": 2
|
|
12
12
|
},
|
|
@@ -24,7 +24,9 @@
|
|
|
24
24
|
],
|
|
25
25
|
[
|
|
26
26
|
"modules/cockpit",
|
|
27
|
+
"modules/cockpit/cards",
|
|
27
28
|
"modules/cockpit/hooks",
|
|
29
|
+
"modules/cockpit/workspace",
|
|
28
30
|
"modules/project-workspace"
|
|
29
31
|
],
|
|
30
32
|
[
|
|
@@ -6,6 +6,12 @@
|
|
|
6
6
|
* 2026-10-30): chat/tools ↔ chat/tools/ContentRenderers ↔ chat/transcript;
|
|
7
7
|
* cockpit ↔ cockpit/hooks ↔ project-workspace; git-panel ↔ git-panel/changes ↔
|
|
8
8
|
* git-panel/history; architecture ↔ architecture/hooks; settings/hooks ↔ settings/tabs.
|
|
9
|
+
* RE-READ 2026-11-02 (task gap-routine-architecture-analysis-god-package-src-cockpit): the
|
|
10
|
+
* cockpit god-package split moved its card and workspace files into `cockpit/cards` and
|
|
11
|
+
* `cockpit/workspace`. Those files already imported each other, so the same dependency web is
|
|
12
|
+
* now read across four cockpit directories plus project-workspace; the group was re-measured and
|
|
13
|
+
* re-pinned member-for-member rather than dropped. This is the mandated re-read for a structural
|
|
14
|
+
* split, not a widened dependency: the module-level SCC below is unchanged.
|
|
9
15
|
* The backend already had AC-394's directory budget, but `src` had no cycle criterion and
|
|
10
16
|
* `.oxlintrc.json` enables no `import/no-cycle`, so those five could widen unmeasured.
|
|
11
17
|
*
|
|
@@ -58,7 +64,9 @@ const BASELINE_PATH = path.join(TEST_DIR, 'frontend-import-cycle-budget.baseline
|
|
|
58
64
|
*/
|
|
59
65
|
const CYCLE_GROUPS: readonly string[][] = [
|
|
60
66
|
['modules/chat/tools', 'modules/chat/tools/ContentRenderers', 'modules/chat/transcript'],
|
|
61
|
-
|
|
67
|
+
// Re-read after the cockpit god-package split (2026-11-02): the card, workspace and hooks
|
|
68
|
+
// directories share one dependency web with the root barrel and project-workspace.
|
|
69
|
+
['modules/cockpit', 'modules/cockpit/cards', 'modules/cockpit/hooks', 'modules/cockpit/workspace', 'modules/project-workspace'],
|
|
62
70
|
['modules/git-panel', 'modules/git-panel/changes', 'modules/git-panel/history'],
|
|
63
71
|
['modules/architecture', 'modules/architecture/hooks'],
|
|
64
72
|
['modules/settings/hooks', 'modules/settings/tabs'],
|
|
@@ -483,8 +483,26 @@ test('AC2: a valid baseline dispatches known files longest-first, keeps the rest
|
|
|
483
483
|
// (496 + 1 = 497 collected server test files). The goal branch's
|
|
484
484
|
// gap-cloudpit-runtime-default-flip adds its criterion
|
|
485
485
|
// server/shared/tests/cloudpit-runtime-flip.test.ts (497 + 1 = 498 collected server test
|
|
486
|
-
// files)
|
|
487
|
-
|
|
486
|
+
// files), then codex-provider-config-surface added its criterion
|
|
487
|
+
// server/modules/settings/tests/codex-model-providers-settings.test.ts
|
|
488
|
+
// (498 + 1 = 499 collected server test files). Then
|
|
489
|
+
// gap-cloudpit-migrate-assets-rewrite added its criterion
|
|
490
|
+
// server/modules/cli/tests/asset-migration.service.test.ts
|
|
491
|
+
// (499 + 1 = 500 collected server test files). Then codex-model-entry-provider-binding
|
|
492
|
+
// added its criterion server/modules/providers/tests/codex-provider-model-binding.test.ts
|
|
493
|
+
// (500 + 1 = 501 collected server test files). Then codex-perrun-provider-injection
|
|
494
|
+
// added its criterion server/modules/providers/tests/codex-runtime-provider-injection.test.ts
|
|
495
|
+
// (501 + 1 = 502 collected server test files), then codex-session-provider-id-binding
|
|
496
|
+
// added its criterion server/modules/providers/tests/codex-session-provider-binding.test.ts
|
|
497
|
+
// (502 + 1 = 503 collected server test files), then codex-resident-provider-injection
|
|
498
|
+
// added its criterion server/modules/providers/tests/codex-resident-provider-injection.test.ts
|
|
499
|
+
// (503 + 1 = 504 collected server test files). Then codex-provider-import-user-profile added
|
|
500
|
+
// its criterion server/modules/settings/tests/codex-provider-import.test.ts
|
|
501
|
+
// (504 + 1 = 505 collected server test files), then codex-provider-advanced-capabilities
|
|
502
|
+
// added its criterion server/modules/settings/tests/codex-provider-advanced.test.ts
|
|
503
|
+
// (505 + 1 = 506 collected server test files). This fixture names 3 known files, so
|
|
504
|
+
// 506 - 3 = 503.
|
|
505
|
+
assert.match(lines[0], /^test\.sh: server dispatch order=longest-first source=.* known=3 unknown=503$/);
|
|
488
506
|
} finally {
|
|
489
507
|
rmSync(dir, { recursive: true, force: true });
|
|
490
508
|
}
|
|
@@ -625,10 +643,26 @@ test('AC3: a broken baseline fails open to alphabetical order byte-for-byte, and
|
|
|
625
643
|
// gap-effective-config-proc-request-layer added its criterion
|
|
626
644
|
// server/modules/mcp-gateway/tests/knowledge-effective-config-launch-request.test.ts (496 + 1 = 497),
|
|
627
645
|
// then the goal branch's gap-cloudpit-runtime-default-flip added
|
|
628
|
-
// server/shared/tests/cloudpit-runtime-flip.test.ts (497 + 1 = 498)
|
|
629
|
-
//
|
|
630
|
-
//
|
|
631
|
-
|
|
646
|
+
// server/shared/tests/cloudpit-runtime-flip.test.ts (497 + 1 = 498), then
|
|
647
|
+
// codex-provider-config-surface added
|
|
648
|
+
// server/modules/settings/tests/codex-model-providers-settings.test.ts (498 + 1 = 499), then
|
|
649
|
+
// gap-cloudpit-migrate-assets-rewrite added its criterion
|
|
650
|
+
// server/modules/cli/tests/asset-migration.service.test.ts (499 + 1 = 500), then
|
|
651
|
+
// codex-model-entry-provider-binding added
|
|
652
|
+
// server/modules/providers/tests/codex-provider-model-binding.test.ts (500 + 1 = 501), then
|
|
653
|
+
// codex-perrun-provider-injection added
|
|
654
|
+
// server/modules/providers/tests/codex-runtime-provider-injection.test.ts (501 + 1 = 502),
|
|
655
|
+
// then codex-session-provider-id-binding added
|
|
656
|
+
// server/modules/providers/tests/codex-session-provider-id-binding.test.ts (502 + 1 = 503),
|
|
657
|
+
// then codex-resident-provider-injection added
|
|
658
|
+
// server/modules/providers/tests/codex-resident-provider-injection.test.ts (503 + 1 = 504),
|
|
659
|
+
// then codex-provider-import-user-profile added
|
|
660
|
+
// server/modules/settings/tests/codex-provider-import.test.ts (504 + 1 = 505), then
|
|
661
|
+
// codex-provider-advanced-capabilities added
|
|
662
|
+
// server/modules/settings/tests/codex-provider-advanced.test.ts (505 + 1 = 506)
|
|
663
|
+
// — but this fixture names ONE known file, so 506 - 1 = 505 (AC2 reads 503 because its
|
|
664
|
+
// fixture names 3; the 506 is the number the tree collects with these criteria).
|
|
665
|
+
assert.match(vl[0], /^test\.sh: server dispatch order=longest-first source=.* known=1 unknown=505$/);
|
|
632
666
|
} finally {
|
|
633
667
|
rmSync(dir, { recursive: true, force: true });
|
|
634
668
|
}
|