@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,18 +3,18 @@
|
|
|
3
3
|
*
|
|
4
4
|
* The mechanism this file implements is small on purpose: given an initiative and a target
|
|
5
5
|
* project, ask the fleet registry which session is that pair's LIAISON session, and hand the
|
|
6
|
-
* message to
|
|
6
|
+
* message to Cloudpit's existing session send service — or, when nobody is there to take it,
|
|
7
7
|
* queue it in the initiative's inbox until the session comes back.
|
|
8
8
|
*
|
|
9
9
|
* ## Why the resolution is a REGISTRY READ and never a name
|
|
10
10
|
*
|
|
11
11
|
* `fleet-liaison-stable-addressing-probe` (2026-10-24) measured what is stable across a
|
|
12
|
-
* restart: the
|
|
12
|
+
* restart: the Cloudpit session id is the only identity a registry row can hold that survives
|
|
13
13
|
* the process, while `pid` changes every launch (and can be reused) and `name` is not an
|
|
14
14
|
* address at all — three live sessions shared one name on the observed host. So this service
|
|
15
15
|
* never looks a peer up by name: it reads the (initiative, project) two-key mapping
|
|
16
16
|
* (`registry.json`'s `liaisonSessions`, written by `registry sessions add --role liaison`),
|
|
17
|
-
* and the registry's `sessionId` is the
|
|
17
|
+
* and the registry's `sessionId` is the Cloudpit session id. Liveness is then the ONE
|
|
18
18
|
* question the host registry answers (`liveHostForSession`), which is authoritative in this
|
|
19
19
|
* process in a way a local `~/.claude/sessions/<pid>.json` cross-check is not.
|
|
20
20
|
*
|
|
@@ -299,7 +299,7 @@ export type LiaisonRecoveryOutcome = {
|
|
|
299
299
|
export type LiaisonDeliverDeps = {
|
|
300
300
|
/** The fleet CLI seam (production: a real `quay-fleet` child). */
|
|
301
301
|
runFleet: LiaisonFleetRun;
|
|
302
|
-
/** Whether
|
|
302
|
+
/** Whether Cloudpit is currently serving this session (production: the host registry). */
|
|
303
303
|
isSessionLive: (sessionId: string) => boolean;
|
|
304
304
|
/** The existing session send service. */
|
|
305
305
|
sendMessage: LiaisonSendMessage;
|
|
@@ -94,7 +94,7 @@ export type LiaisonModule = {
|
|
|
94
94
|
* The real `quay-fleet` runner.
|
|
95
95
|
*
|
|
96
96
|
* The binary is looked up per call rather than captured at boot, so an operator can install
|
|
97
|
-
* (or re-point `QUAY_FLEET_BIN` at) a fleet without restarting
|
|
97
|
+
* (or re-point `QUAY_FLEET_BIN` at) a fleet without restarting Cloudpit. A missing binary is
|
|
98
98
|
* the ordinary unavailable answer; the caller turns it into the explicit registry error AC2
|
|
99
99
|
* requires rather than a silent drop.
|
|
100
100
|
*/
|
|
@@ -167,8 +167,9 @@ function resolvePrincipal(
|
|
|
167
167
|
userId: verified.userId,
|
|
168
168
|
tokenId: verified.tokenId,
|
|
169
169
|
clientId: null,
|
|
170
|
-
//
|
|
171
|
-
//
|
|
170
|
+
// 3.0 issues only `cloudpit:*`, but every consumer compares the canonical
|
|
171
|
+
// `requiredScopes` literals, so the principal carries canonical names. An old
|
|
172
|
+
// token whose row holds the legacy spelling passes through unchanged.
|
|
172
173
|
scopes: verified.scopes.map(canonicalScope),
|
|
173
174
|
};
|
|
174
175
|
}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* The MCP gateway's self-referential guard (AC-252; SPEC
|
|
3
3
|
* `docs/proposals/mcp-gateway-SPEC.md` v3.1 §290–§300).
|
|
4
4
|
*
|
|
5
|
-
* A gateway client can itself be a
|
|
6
|
-
* "a Claude Code session opened inside
|
|
5
|
+
* A gateway client can itself be a Cloudpit session — the canonical nesting is
|
|
6
|
+
* "a Claude Code session opened inside Cloudpit calling Cloudpit's own MCP
|
|
7
7
|
* server". When that session calls a WRITE tool against ITSELF it does not just
|
|
8
8
|
* act on a stranger: `session_send` queues a message behind the round that is
|
|
9
9
|
* waiting for this very tool result, and `session_interrupt` / `session_close`
|
|
@@ -95,12 +95,24 @@ import type { McpRunGetDeps, RunGetPayload } from './mcp-run-get.js';
|
|
|
95
95
|
*/
|
|
96
96
|
export type { McpControlCaller };
|
|
97
97
|
|
|
98
|
-
/**
|
|
98
|
+
/**
|
|
99
|
+
* The refusals `session_send` translates. The vocabulary is the control
|
|
100
|
+
* service's own.
|
|
101
|
+
*
|
|
102
|
+
* The last two are the session's upstream-provider guard (AC-462): a model that
|
|
103
|
+
* would move the session to another provider, or one bound to a provider that
|
|
104
|
+
* no longer exists. The adapter does not pass them through verbatim — it maps
|
|
105
|
+
* both to the gateway's own `INVALID_ARGUMENT` so every tool keeps emitting a
|
|
106
|
+
* canonical `MCP_ERROR_CODES` value — but the seam has to state them, because
|
|
107
|
+
* the control service's result now carries them.
|
|
108
|
+
*/
|
|
99
109
|
export type McpControlRefusalCode =
|
|
100
110
|
| 'SESSION_NOT_FOUND'
|
|
101
111
|
| 'UNSUPPORTED_PROVIDER'
|
|
102
112
|
| 'RUN_IN_PROGRESS'
|
|
103
|
-
| 'FORBIDDEN'
|
|
113
|
+
| 'FORBIDDEN'
|
|
114
|
+
| 'SESSION_PROVIDER_MISMATCH'
|
|
115
|
+
| 'SESSION_PROVIDER_UNKNOWN';
|
|
104
116
|
|
|
105
117
|
/**
|
|
106
118
|
* The control service result `session_send` reads, declared structurally.
|
|
@@ -595,6 +607,13 @@ export async function buildSessionSend(
|
|
|
595
607
|
hint: RUN_IN_PROGRESS_HINT,
|
|
596
608
|
});
|
|
597
609
|
}
|
|
610
|
+
if (result.code === 'SESSION_PROVIDER_MISMATCH' || result.code === 'SESSION_PROVIDER_UNKNOWN') {
|
|
611
|
+
// The selection is unusable for THIS session (its thread is bound to the
|
|
612
|
+
// provider it started under, or the bound provider is gone). The message
|
|
613
|
+
// already names the fork/new-session action, so the envelope only has to
|
|
614
|
+
// state the class in the gateway's own vocabulary.
|
|
615
|
+
throw new McpToolError(MCP_ERROR_CODES.INVALID_ARGUMENT, result.message, true);
|
|
616
|
+
}
|
|
598
617
|
throw new McpToolError(result.code, result.message, true);
|
|
599
618
|
}
|
|
600
619
|
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
* behaviour; otherwise left false (the spec default).
|
|
28
28
|
* - `openWorldHint` (spec default `true`): true when the tool's effect is
|
|
29
29
|
* delivered OUTSIDE this server's own store — it drives, starts, stops or
|
|
30
|
-
* authorizes a provider agent/process. False for tools confined to
|
|
30
|
+
* authorizes a provider agent/process. False for tools confined to Cloudpit's
|
|
31
31
|
* stored state (its database, its lease table, its queue, its cached
|
|
32
32
|
* snapshot).
|
|
33
33
|
*
|
|
@@ -163,18 +163,18 @@ export const MCP_TOOL_ANNOTATIONS: Record<McpGatewayToolName, ToolAnnotations> =
|
|
|
163
163
|
// asks the connected browsers what they are showing and reads their answers:
|
|
164
164
|
// nothing is stored, and a repeat with no browser state change reads the same
|
|
165
165
|
// fact. The question reaches the browsers, but it drives no provider agent and
|
|
166
|
-
// mutates no
|
|
166
|
+
// mutates no Cloudpit state, so the world stays closed.
|
|
167
167
|
ui_visible_context: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
168
168
|
// lists the connected browsers and status, reading their answers to one
|
|
169
169
|
// round-trip question: nothing is stored, and a repeat with no browser state
|
|
170
170
|
// change reads the same roster. The question reaches the browsers, but it
|
|
171
|
-
// drives no provider agent and mutates no
|
|
171
|
+
// drives no provider agent and mutates no Cloudpit state, so the world stays
|
|
172
172
|
// closed — the same reading `ui_visible_context` above carries.
|
|
173
173
|
ui_clients_list: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
174
174
|
// scans the stored provider transcripts and titles and reads nothing else:
|
|
175
175
|
// nothing is stored, and a repeat over an unchanged store reads the same
|
|
176
176
|
// matches. The scan touches files on disk, but it drives no provider agent and
|
|
177
|
-
// mutates no
|
|
177
|
+
// mutates no Cloudpit state, so the world stays closed.
|
|
178
178
|
session_search: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
179
179
|
// reads the user's transcript SELECTION through the same browser round trip as
|
|
180
180
|
// `ui_visible_context`: nothing is stored, and a repeat with no browser state
|
|
@@ -22,10 +22,7 @@
|
|
|
22
22
|
* objects in one process, and a process-lifetime cache would collapse them.
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
|
-
import {
|
|
26
|
-
ACCESS_TOKEN_SCOPES,
|
|
27
|
-
CLOUDPIT_ACCESS_TOKEN_SCOPES,
|
|
28
|
-
} from '@/shared/mcp-contract/index.js';
|
|
25
|
+
import { CLOUDPIT_ACCESS_TOKEN_SCOPES } from '@/shared/mcp-contract/index.js';
|
|
29
26
|
|
|
30
27
|
import { readMcpOauthEnabled } from './mcp-gateway.loopback.js';
|
|
31
28
|
|
|
@@ -183,7 +180,9 @@ export function buildAuthorizationServerMetadata(options: {
|
|
|
183
180
|
code_challenge_methods_supported: ['S256'],
|
|
184
181
|
grant_types_supported: ['authorization_code', 'refresh_token'],
|
|
185
182
|
token_endpoint_auth_methods_supported: ['client_secret_post', 'none'],
|
|
186
|
-
|
|
183
|
+
// 3.0 advertises exactly the one wire vocabulary. The canonical `cloudcli:*` names are
|
|
184
|
+
// internal (stored grants and `requiredScopes`), never an accepted request spelling.
|
|
185
|
+
scopes_supported: [...CLOUDPIT_ACCESS_TOKEN_SCOPES],
|
|
187
186
|
};
|
|
188
187
|
|
|
189
188
|
if (dcrMode !== 'off') {
|
|
@@ -284,7 +284,7 @@ async function withHarness(arms: Arms, run: HarnessRun): Promise<void> {
|
|
|
284
284
|
const readToken = tokens.issueToken({
|
|
285
285
|
userId: USER_ONE,
|
|
286
286
|
name: 'knowledge-effective-config-proof',
|
|
287
|
-
scopes: ['
|
|
287
|
+
scopes: ['cloudpit:read'],
|
|
288
288
|
expiresInDays: 30,
|
|
289
289
|
});
|
|
290
290
|
if (!readToken.ok) throw new Error('the harness must mint a read token');
|
|
@@ -157,8 +157,8 @@ const CORRELATION = 'corr-peer-ask-1';
|
|
|
157
157
|
const DELIVERY_ID = 'delivery-peer-ask-1';
|
|
158
158
|
const REPLY_UUID = 'reply-assistant-1';
|
|
159
159
|
const ASK_MESSAGE_ID = 'assistant-ask-1';
|
|
160
|
-
const READ_SCOPE = '
|
|
161
|
-
const SEND_SCOPE = '
|
|
160
|
+
const READ_SCOPE = 'cloudpit:read';
|
|
161
|
+
const SEND_SCOPE = 'cloudpit:session:send';
|
|
162
162
|
|
|
163
163
|
function idsOf(tag: string) {
|
|
164
164
|
return {
|
|
@@ -86,6 +86,7 @@ type AnyRecord = Record<string, unknown>;
|
|
|
86
86
|
// --------------------------- fixture identities ---------------------------
|
|
87
87
|
|
|
88
88
|
const USER_ONE = 1;
|
|
89
|
+
const wire = (scopes: string[]) => scopes.map((scope) => scope.replace('cloudcli:', 'cloudpit:'));
|
|
89
90
|
const READ_SCOPE = 'cloudcli:read';
|
|
90
91
|
const APPROVE_SCOPE = 'cloudcli:approve';
|
|
91
92
|
/** The pinned "now" so `waitedMs` is exactly assertable. */
|
|
@@ -310,13 +311,13 @@ async function withHarness(options: HarnessOptions, run: (harness: Harness) => P
|
|
|
310
311
|
const readToken = tokens.issueToken({
|
|
311
312
|
userId: USER_ONE,
|
|
312
313
|
name: 'ac274-read',
|
|
313
|
-
scopes: [READ_SCOPE],
|
|
314
|
+
scopes: wire([READ_SCOPE]),
|
|
314
315
|
expiresInDays: 30,
|
|
315
316
|
});
|
|
316
317
|
const approveToken = tokens.issueToken({
|
|
317
318
|
userId: USER_ONE,
|
|
318
319
|
name: 'ac274-approve',
|
|
319
|
-
scopes: [READ_SCOPE, APPROVE_SCOPE],
|
|
320
|
+
scopes: wire([READ_SCOPE, APPROVE_SCOPE]),
|
|
320
321
|
expiresInDays: 30,
|
|
321
322
|
});
|
|
322
323
|
if (!readToken.ok || !approveToken.ok) {
|
|
@@ -214,7 +214,7 @@ async function withAuditServer(run: (harness: Harness) => Promise<void>): Promis
|
|
|
214
214
|
const address = server.address() as AddressInfo;
|
|
215
215
|
|
|
216
216
|
const issue = (userId: number, name: string): { id: number; token: string } => {
|
|
217
|
-
const issued = tokens.issueToken({ userId, name, scopes: ['
|
|
217
|
+
const issued = tokens.issueToken({ userId, name, scopes: ['cloudpit:read'], expiresInDays: 30 });
|
|
218
218
|
if (!issued.ok) {
|
|
219
219
|
throw new Error('the harness issued a token with a lifetime the service rejects');
|
|
220
220
|
}
|
|
@@ -293,8 +293,8 @@ function assertIdentity(row: ReturnType<typeof lastRow>, tokenId: number): void
|
|
|
293
293
|
|
|
294
294
|
test('(a) every tool call writes exactly one row, for ok, denied and error', async () => {
|
|
295
295
|
await withAuditServer(async (server) => {
|
|
296
|
-
const full = server.issue(['
|
|
297
|
-
const readOnly = server.issue(['
|
|
296
|
+
const full = server.issue(['cloudpit:read', 'cloudpit:session:send']);
|
|
297
|
+
const readOnly = server.issue(['cloudpit:read']);
|
|
298
298
|
const authorization = `Bearer ${full.token}`;
|
|
299
299
|
|
|
300
300
|
const readings: string[] = [];
|
|
@@ -383,7 +383,7 @@ test('(a) every tool call writes exactly one row, for ok, denied and error', asy
|
|
|
383
383
|
|
|
384
384
|
test('(b) the digest keeps ids verbatim and reduces free text to length + 40 chars', async () => {
|
|
385
385
|
await withAuditServer(async (server) => {
|
|
386
|
-
const full = server.issue(['
|
|
386
|
+
const full = server.issue(['cloudpit:session:send']);
|
|
387
387
|
const message = 'A'.repeat(500);
|
|
388
388
|
const sessionId = 'sess-id-123';
|
|
389
389
|
const projectId = 'proj-id-456';
|
|
@@ -421,7 +421,7 @@ test('(b) the digest keeps ids verbatim and reduces free text to length + 40 cha
|
|
|
421
421
|
|
|
422
422
|
test('(c) unauthenticated calls answer 401, write no row, and leave the server alive', async () => {
|
|
423
423
|
await withAuditServer(async (server) => {
|
|
424
|
-
const valid = server.issue(['
|
|
424
|
+
const valid = server.issue(['cloudpit:read']);
|
|
425
425
|
const before = mcpAuditLogDb.count();
|
|
426
426
|
|
|
427
427
|
const cases: { label: string; authorization?: string }[] = [
|
|
@@ -55,6 +55,8 @@ const MCP_ACCEPT = 'application/json, text/event-stream';
|
|
|
55
55
|
const USER_ONE = 1;
|
|
56
56
|
const START = new Date('2026-01-01T00:00:00.000Z');
|
|
57
57
|
const MS_PER_DAY = 24 * 60 * 60 * 1000;
|
|
58
|
+
// The canonical spelling a stored token row and the principal carry; the harness
|
|
59
|
+
// mints its wire equivalent (`cloudpit:read`) through the real issue path.
|
|
58
60
|
const VALID_SCOPES = ['cloudcli:read'];
|
|
59
61
|
|
|
60
62
|
// --------------------------- HTTP ---------------------------
|
|
@@ -245,7 +247,7 @@ async function withMcpAuthServer(run: (harness: Harness) => Promise<void>): Prom
|
|
|
245
247
|
const address = server.address() as AddressInfo;
|
|
246
248
|
|
|
247
249
|
const issue = (expiresInDays: number): IssuedAccessToken => {
|
|
248
|
-
const issued = tokens.issueToken({ userId: USER_ONE, name: 'mcp', scopes: VALID_SCOPES, expiresInDays });
|
|
250
|
+
const issued = tokens.issueToken({ userId: USER_ONE, name: 'mcp', scopes: VALID_SCOPES.map((scope) => scope.replace('cloudcli:', 'cloudpit:')), expiresInDays });
|
|
249
251
|
if (!issued.ok) {
|
|
250
252
|
throw new Error('the harness issued a token with a lifetime the service rejects');
|
|
251
253
|
}
|
|
@@ -130,6 +130,7 @@ type RuntimeService = ReturnType<typeof createProviderRuntimeService>;
|
|
|
130
130
|
|
|
131
131
|
const USER_ONE = 1;
|
|
132
132
|
const DEBUG_PROVIDER = DEBUG_AGENT_PROVIDER_ID as LLMProvider;
|
|
133
|
+
const wire = (scopes: string[]) => scopes.map((scope) => scope.replace('cloudcli:', 'cloudpit:'));
|
|
133
134
|
const READ_SCOPE = 'cloudcli:read';
|
|
134
135
|
const SESSION_SEND_SCOPE = 'cloudcli:session:send';
|
|
135
136
|
const SESSION_CONTROL_SCOPE = 'cloudcli:session:control';
|
|
@@ -410,13 +411,13 @@ async function withHarness(arm: ArmOptions, run: (harness: Harness) => Promise<v
|
|
|
410
411
|
const mainToken = tokens.issueToken({
|
|
411
412
|
userId: USER_ONE,
|
|
412
413
|
name: 'ac271-main',
|
|
413
|
-
scopes: [READ_SCOPE, SESSION_SEND_SCOPE, SESSION_CONTROL_SCOPE],
|
|
414
|
+
scopes: wire([READ_SCOPE, SESSION_SEND_SCOPE, SESSION_CONTROL_SCOPE]),
|
|
414
415
|
expiresInDays: 30,
|
|
415
416
|
});
|
|
416
417
|
const sendOnlyToken = tokens.issueToken({
|
|
417
418
|
userId: USER_ONE,
|
|
418
419
|
name: 'ac271-send-only',
|
|
419
|
-
scopes: [READ_SCOPE, SESSION_SEND_SCOPE],
|
|
420
|
+
scopes: wire([READ_SCOPE, SESSION_SEND_SCOPE]),
|
|
420
421
|
expiresInDays: 30,
|
|
421
422
|
});
|
|
422
423
|
if (!mainToken.ok || !sendOnlyToken.ok) {
|
|
@@ -291,9 +291,13 @@ async function withArm(run: (arm: Arm) => Promise<void>): Promise<void> {
|
|
|
291
291
|
|
|
292
292
|
const tokens = createAccessTokensService({ now: () => new Date() });
|
|
293
293
|
const issued = {
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
294
|
+
// 3.0 issues the wire spelling; the tool declarations stay canonical `cloudcli:*`.
|
|
295
|
+
read: issue(tokens, 'cockpit-read', [MCP_COCKPIT_READ_SCOPE.replace('cloudcli:', 'cloudpit:')]),
|
|
296
|
+
act: issue(tokens, 'cockpit-act', [
|
|
297
|
+
MCP_COCKPIT_READ_SCOPE.replace('cloudcli:', 'cloudpit:'),
|
|
298
|
+
MCP_COCKPIT_ACT_SCOPE.replace('cloudcli:', 'cloudpit:'),
|
|
299
|
+
]),
|
|
300
|
+
navigate: issue(tokens, 'cockpit-navigate', ['cloudpit:navigate']),
|
|
297
301
|
};
|
|
298
302
|
|
|
299
303
|
const app = express();
|
|
@@ -94,11 +94,11 @@ const SESSION_ROWS = [
|
|
|
94
94
|
];
|
|
95
95
|
|
|
96
96
|
/** The scope each probed tool requires, from the one `ACCESS_TOKEN_SCOPES` vocabulary. */
|
|
97
|
-
const SEND_SCOPES = ['
|
|
98
|
-
const CREATE_SCOPES = ['
|
|
99
|
-
const READ_SCOPES = ['
|
|
100
|
-
const APPROVE_SCOPES = ['
|
|
101
|
-
const NAVIGATE_SCOPES = ['
|
|
97
|
+
const SEND_SCOPES = ['cloudpit:session:send'];
|
|
98
|
+
const CREATE_SCOPES = ['cloudpit:session:create'];
|
|
99
|
+
const READ_SCOPES = ['cloudpit:read'];
|
|
100
|
+
const APPROVE_SCOPES = ['cloudpit:approve'];
|
|
101
|
+
const NAVIGATE_SCOPES = ['cloudpit:navigate'];
|
|
102
102
|
|
|
103
103
|
type Registry = ReturnType<typeof createChatRunRegistry>;
|
|
104
104
|
|
|
@@ -567,7 +567,7 @@ test('(b2) a labelled session_create stamps the run its first message opened', {
|
|
|
567
567
|
|
|
568
568
|
test('(c) sessions_list narrows to the sessions whose live run carries the label', { concurrency: false }, async () => {
|
|
569
569
|
await withHarness(async (harness) => {
|
|
570
|
-
const token = harness.issue(['
|
|
570
|
+
const token = harness.issue(['cloudpit:read', 'cloudpit:session:send']).token;
|
|
571
571
|
await labelSession(harness, token, 'sess-a', LABEL);
|
|
572
572
|
await labelSession(harness, token, 'sess-b', LABEL);
|
|
573
573
|
// A third running session under the OTHER label proves the filter is an
|
|
@@ -611,7 +611,7 @@ test('(c) sessions_list narrows to the sessions whose live run carries the label
|
|
|
611
611
|
|
|
612
612
|
test('(c2) mcp_usage_stats aggregates exactly the audit rows carrying the label', { concurrency: false }, async () => {
|
|
613
613
|
await withHarness(async (harness) => {
|
|
614
|
-
const token = harness.issue(['
|
|
614
|
+
const token = harness.issue(['cloudpit:read', 'cloudpit:session:send']).token;
|
|
615
615
|
await labelSession(harness, token, 'sess-a', LABEL);
|
|
616
616
|
await labelSession(harness, token, 'sess-b', LABEL);
|
|
617
617
|
await labelSession(harness, token, 'sess-c', OTHER_LABEL);
|
|
@@ -646,7 +646,7 @@ test('(c2) mcp_usage_stats aggregates exactly the audit rows carrying the label'
|
|
|
646
646
|
|
|
647
647
|
test('(d) a labelled call opens no extra run, writes only its own row and changes no state', { concurrency: false }, async () => {
|
|
648
648
|
await withHarness(async (harness) => {
|
|
649
|
-
const token = harness.issue(['
|
|
649
|
+
const token = harness.issue(['cloudpit:read', 'cloudpit:session:send']).token;
|
|
650
650
|
|
|
651
651
|
const runsBefore = harness.registry.listRecentRuns().length;
|
|
652
652
|
const rowsBefore = mcpAuditLogDb.count();
|
|
@@ -109,6 +109,7 @@ type ChatControlService = ReturnType<typeof createChatControlService>;
|
|
|
109
109
|
const USER_ONE = 1;
|
|
110
110
|
const DEBUG_PROVIDER = DEBUG_AGENT_PROVIDER_ID as LLMProvider;
|
|
111
111
|
const SESSION_SEND_SCOPE = 'cloudcli:session:send';
|
|
112
|
+
const wire = (scopes: string[]) => scopes.map((scope) => scope.replace('cloudcli:', 'cloudpit:'));
|
|
112
113
|
const READ_SCOPE = 'cloudcli:read';
|
|
113
114
|
|
|
114
115
|
/** The seed turn the scenario opens with. Not what the draft tools submit. */
|
|
@@ -298,13 +299,13 @@ async function withHarness(options: HarnessOptions, run: (harness: Harness) => P
|
|
|
298
299
|
const mainToken = tokens.issueToken({
|
|
299
300
|
userId: USER_ONE,
|
|
300
301
|
name: 'gap-mcp-draft-main',
|
|
301
|
-
scopes: [READ_SCOPE, SESSION_SEND_SCOPE],
|
|
302
|
+
scopes: wire([READ_SCOPE, SESSION_SEND_SCOPE]),
|
|
302
303
|
expiresInDays: 30,
|
|
303
304
|
});
|
|
304
305
|
const readToken = tokens.issueToken({
|
|
305
306
|
userId: USER_ONE,
|
|
306
307
|
name: 'gap-mcp-draft-read',
|
|
307
|
-
scopes: [READ_SCOPE],
|
|
308
|
+
scopes: wire([READ_SCOPE]),
|
|
308
309
|
expiresInDays: 30,
|
|
309
310
|
});
|
|
310
311
|
if (!mainToken.ok || !readToken.ok) {
|
|
@@ -1167,7 +1167,7 @@ function extractStringLiterals(source: string): SourceLiteral[] {
|
|
|
1167
1167
|
* router renders).
|
|
1168
1168
|
*
|
|
1169
1169
|
* `mcp-write-notification.ts` is DELIBERATELY excluded: it composes the
|
|
1170
|
-
* notification a write call raises for the
|
|
1170
|
+
* notification a write call raises for the Cloudpit USER (title / body of an
|
|
1171
1171
|
* in-app notification), not copy sent to the MCP caller, and it is outside
|
|
1172
1172
|
* AC-289's field list. Translating it would change user-facing product copy in
|
|
1173
1173
|
* a task that is about the caller-facing contract. `mcp-client-name.ts` carries
|
|
@@ -616,8 +616,8 @@ test('(b) the three barrels export the GOAL-020 symbols and the gateway consumes
|
|
|
616
616
|
|
|
617
617
|
const USER_ONE = 1;
|
|
618
618
|
const DEBUG_PROVIDER = DEBUG_AGENT_PROVIDER_ID as LLMProvider;
|
|
619
|
-
const WRITE_SCOPE = '
|
|
620
|
-
const READ_SCOPE = '
|
|
619
|
+
const WRITE_SCOPE = 'cloudpit:session:send';
|
|
620
|
+
const READ_SCOPE = 'cloudpit:read';
|
|
621
621
|
const RUN_ALIVE_MS = 1_200;
|
|
622
622
|
|
|
623
623
|
type SpyCaller = { userId: string | number | null; via: string };
|
|
@@ -406,7 +406,7 @@ async function withGateway(run: (harness: Harness) => Promise<void>): Promise<vo
|
|
|
406
406
|
const clients = new Set<Client>();
|
|
407
407
|
|
|
408
408
|
const issue = (scopes: string[]): { id: number; token: string } => {
|
|
409
|
-
const issued = tokens.issueToken({ userId: USER_ONE, name: 'ac286', scopes, expiresInDays: 30 });
|
|
409
|
+
const issued = tokens.issueToken({ userId: USER_ONE, name: 'ac286', scopes: scopes.map((scope) => scope.replace('cloudcli:', 'cloudpit:')), expiresInDays: 30 });
|
|
410
410
|
if (!issued.ok) {
|
|
411
411
|
throw new Error('the harness issued a token with a lifetime the service rejects');
|
|
412
412
|
}
|
|
@@ -302,7 +302,7 @@ async function withKnowledgeFactsHarness(run: HarnessRun, options: HarnessOption
|
|
|
302
302
|
const readToken = tokens.issueToken({
|
|
303
303
|
userId: USER_ONE,
|
|
304
304
|
name: 'mcp-knowledge-facts',
|
|
305
|
-
scopes: ['
|
|
305
|
+
scopes: ['cloudpit:read'],
|
|
306
306
|
expiresInDays: 30,
|
|
307
307
|
});
|
|
308
308
|
if (!readToken.ok) throw new Error('the harness must mint a read token');
|
|
@@ -525,7 +525,7 @@ async function withHarness(run: (harness: Harness) => Promise<void>): Promise<vo
|
|
|
525
525
|
const issued = tokens.issueToken({
|
|
526
526
|
userId: USER_ONE,
|
|
527
527
|
name: 'ac287-criterion',
|
|
528
|
-
scopes: ALL_SCOPES,
|
|
528
|
+
scopes: ALL_SCOPES.map((scope) => scope.replace('cloudcli:', 'cloudpit:')),
|
|
529
529
|
expiresInDays: 30,
|
|
530
530
|
});
|
|
531
531
|
if (!issued.ok) {
|
|
@@ -398,7 +398,8 @@ test('(b) a valid PAT and a valid OAuth token are both admitted and the audit ro
|
|
|
398
398
|
await withOauthChallengeServer(async (h) => {
|
|
399
399
|
h.env.MCP_OAUTH_ENABLED = 'true';
|
|
400
400
|
|
|
401
|
-
|
|
401
|
+
// 3.0 mints the wire spelling; the probe tool's declaration stays canonical.
|
|
402
|
+
const pat = h.issuePat(['cloudpit:read']);
|
|
402
403
|
const oauthToken = h.issueOAuthToken([PROBE_SCOPE]);
|
|
403
404
|
|
|
404
405
|
const before = mcpAuditLogDb.count();
|
|
@@ -477,7 +478,7 @@ test('(e) an OAuth token missing the tool scope is denied with one denied audit
|
|
|
477
478
|
await withOauthChallengeServer(async (h) => {
|
|
478
479
|
h.env.MCP_OAUTH_ENABLED = 'true';
|
|
479
480
|
|
|
480
|
-
const sendOnly = h.issueOAuthToken(['
|
|
481
|
+
const sendOnly = h.issueOAuthToken(['cloudpit:session:send']);
|
|
481
482
|
const readOk = h.issueOAuthToken([PROBE_SCOPE]);
|
|
482
483
|
|
|
483
484
|
const before = mcpAuditLogDb.count();
|
|
@@ -474,7 +474,7 @@ async function withOverviewHarness(
|
|
|
474
474
|
|
|
475
475
|
// ---- the tokens ----
|
|
476
476
|
const tokens = createAccessTokensService({ now: () => new Date(HOST_NOW_MS) });
|
|
477
|
-
const readToken = tokens.issueToken({ userId: USER_ONE, name: 'mcp-overview', scopes: ['
|
|
477
|
+
const readToken = tokens.issueToken({ userId: USER_ONE, name: 'mcp-overview', scopes: ['cloudpit:read'], expiresInDays: 30 });
|
|
478
478
|
if (!readToken.ok) {
|
|
479
479
|
throw new Error('the harness must mint a read token');
|
|
480
480
|
}
|
|
@@ -752,7 +752,7 @@ test('(f) quay_snapshot carries the in-flight reading and overview deliberately
|
|
|
752
752
|
assert.equal(refreshed.isError, false, 'the refreshing read must not error');
|
|
753
753
|
const snapshot = (refreshed.payload as AnyRecord).snapshot as AnyRecord;
|
|
754
754
|
console.log(`[f] quay_snapshot.inFlight = ${JSON.stringify(snapshot.inFlight)}`);
|
|
755
|
-
// The in-flight task reaches the
|
|
755
|
+
// The in-flight task reaches the Cloudpit client verbatim, through the real mount.
|
|
756
756
|
assert.deepEqual(snapshot.inFlight, IN_FLIGHT_READING, 'the in-flight reading must round-trip verbatim');
|
|
757
757
|
|
|
758
758
|
// Scope guard: `overview`'s per-project summary is AC-247's and this task must not
|
|
@@ -111,8 +111,8 @@ type AnyRecord = Record<string, unknown>;
|
|
|
111
111
|
// --------------------------- fixture identities ---------------------------
|
|
112
112
|
|
|
113
113
|
const USER_ONE = 1;
|
|
114
|
-
const READ_SCOPE = '
|
|
115
|
-
const APPROVE_SCOPE = '
|
|
114
|
+
const READ_SCOPE = 'cloudpit:read';
|
|
115
|
+
const APPROVE_SCOPE = 'cloudpit:approve';
|
|
116
116
|
/** The deadline leg (b) asserts was INJECTED, not the 55000 default. */
|
|
117
117
|
const INJECTED_TIMEOUT_MS = 4321;
|
|
118
118
|
/** The instant every relative reading is measured against. */
|
|
@@ -450,9 +450,9 @@ async function withMcpReadTools(
|
|
|
450
450
|
|
|
451
451
|
// ---- the tokens ----
|
|
452
452
|
const tokens = createAccessTokensService({ now: () => new Date(NOW_MS) });
|
|
453
|
-
const readToken = tokens.issueToken({ userId: USER_ONE, name: 'mcp-read', scopes: ['
|
|
453
|
+
const readToken = tokens.issueToken({ userId: USER_ONE, name: 'mcp-read', scopes: ['cloudpit:read'], expiresInDays: 30 });
|
|
454
454
|
const scopedToken = tokens.issueToken({
|
|
455
|
-
userId: USER_ONE, name: 'mcp-other', scopes: ['
|
|
455
|
+
userId: USER_ONE, name: 'mcp-other', scopes: ['cloudpit:session:send'], expiresInDays: 30,
|
|
456
456
|
});
|
|
457
457
|
if (!readToken.ok || !scopedToken.ok) {
|
|
458
458
|
throw new Error('the harness must mint both tokens');
|
|
@@ -580,7 +580,7 @@ test('(a) tools/list is exactly the stage-3 read tools, none of them a write too
|
|
|
580
580
|
}
|
|
581
581
|
|
|
582
582
|
for (const tool of MCP_STAGE3_READ_TOOLS) {
|
|
583
|
-
assert.equal(tool.requiredScope, 'cloudcli:read', `${tool.name} must require
|
|
583
|
+
assert.equal(tool.requiredScope, 'cloudcli:read', `${tool.name} must require the canonical read scope`);
|
|
584
584
|
}
|
|
585
585
|
for (const tool of listed.tools) {
|
|
586
586
|
assert.ok(tool.description && tool.description.length > 0, `${tool.name} must carry a description`);
|
|
@@ -321,7 +321,7 @@ async function withRunGetHarness(run: (harness: Harness) => Promise<void>): Prom
|
|
|
321
321
|
}
|
|
322
322
|
|
|
323
323
|
const tokens = createAccessTokensService({ now: () => new Date(BASE_MS) });
|
|
324
|
-
const readToken = tokens.issueToken({ userId: USER_ONE, name: 'mcp-run-get', scopes: ['
|
|
324
|
+
const readToken = tokens.issueToken({ userId: USER_ONE, name: 'mcp-run-get', scopes: ['cloudpit:read'], expiresInDays: 30 });
|
|
325
325
|
if (!readToken.ok) {
|
|
326
326
|
throw new Error('the harness must mint a read token');
|
|
327
327
|
}
|
|
@@ -341,7 +341,7 @@ async function withHarness(run: (harness: Harness) => Promise<void>): Promise<vo
|
|
|
341
341
|
const issued = tokens.issueToken({
|
|
342
342
|
userId: USER_ONE,
|
|
343
343
|
name: 'ac252-criterion',
|
|
344
|
-
scopes: [READ_SCOPE, SEND_SCOPE, CONTROL_SCOPE],
|
|
344
|
+
scopes: [READ_SCOPE, SEND_SCOPE, CONTROL_SCOPE].map((scope) => scope.replace('cloudcli:', 'cloudpit:')),
|
|
345
345
|
expiresInDays: 30,
|
|
346
346
|
});
|
|
347
347
|
if (!issued.ok) {
|
|
@@ -353,13 +353,13 @@ async function withHarness(options: HarnessOptions, run: (harness: Harness) => P
|
|
|
353
353
|
const readToken = tokens.issueToken({
|
|
354
354
|
userId: USER_ONE,
|
|
355
355
|
name: 'ac273-read',
|
|
356
|
-
scopes: [READ_SCOPE],
|
|
356
|
+
scopes: [READ_SCOPE].map((scope) => scope.replace('cloudcli:', 'cloudpit:')),
|
|
357
357
|
expiresInDays: 30,
|
|
358
358
|
});
|
|
359
359
|
const controlToken = tokens.issueToken({
|
|
360
360
|
userId: USER_ONE,
|
|
361
361
|
name: 'ac273-control',
|
|
362
|
-
scopes: [READ_SCOPE, SESSION_CONTROL_SCOPE],
|
|
362
|
+
scopes: [READ_SCOPE, SESSION_CONTROL_SCOPE].map((scope) => scope.replace('cloudcli:', 'cloudpit:')),
|
|
363
363
|
expiresInDays: 30,
|
|
364
364
|
});
|
|
365
365
|
if (!readToken.ok || !controlToken.ok) {
|
|
@@ -376,7 +376,7 @@ async function withHarness(run: (harness: Harness) => Promise<void>): Promise<vo
|
|
|
376
376
|
|
|
377
377
|
const tokens = createAccessTokensService({ now: () => new Date() });
|
|
378
378
|
const mint = (name: string, scopes: string[]): string => {
|
|
379
|
-
const issued = tokens.issueToken({ userId: USER_ONE, name, scopes, expiresInDays: 30 });
|
|
379
|
+
const issued = tokens.issueToken({ userId: USER_ONE, name, scopes: scopes.map((scope) => scope.replace('cloudcli:', 'cloudpit:')), expiresInDays: 30 });
|
|
380
380
|
if (!issued.ok) {
|
|
381
381
|
throw new Error(`the harness must mint the ${name} token`);
|
|
382
382
|
}
|
|
@@ -629,7 +629,7 @@ async function withHarness(options: HarnessOptions, run: (harness: Harness) => P
|
|
|
629
629
|
|
|
630
630
|
const tokens = createAccessTokensService({ now: () => new Date() });
|
|
631
631
|
const mint = (name: string, scopes: string[]): string => {
|
|
632
|
-
const issued = tokens.issueToken({ userId: USER_ONE, name, scopes, expiresInDays: 30 });
|
|
632
|
+
const issued = tokens.issueToken({ userId: USER_ONE, name, scopes: scopes.map((scope) => scope.replace('cloudcli:', 'cloudpit:')), expiresInDays: 30 });
|
|
633
633
|
if (!issued.ok) {
|
|
634
634
|
throw new Error(`the harness must mint the ${name} token`);
|
|
635
635
|
}
|
|
@@ -434,13 +434,13 @@ async function withHarness(options: HarnessOptions, run: (harness: Harness) => P
|
|
|
434
434
|
const mainToken = tokens.issueToken({
|
|
435
435
|
userId: USER_ONE,
|
|
436
436
|
name: 'ac272-main',
|
|
437
|
-
scopes: [READ_SCOPE, SESSION_SEND_SCOPE, SESSION_CONTROL_SCOPE],
|
|
437
|
+
scopes: [READ_SCOPE, SESSION_SEND_SCOPE, SESSION_CONTROL_SCOPE].map((scope) => scope.replace('cloudcli:', 'cloudpit:')),
|
|
438
438
|
expiresInDays: 30,
|
|
439
439
|
});
|
|
440
440
|
const sendOnlyToken = tokens.issueToken({
|
|
441
441
|
userId: USER_ONE,
|
|
442
442
|
name: 'ac272-send-only',
|
|
443
|
-
scopes: [READ_SCOPE, SESSION_SEND_SCOPE],
|
|
443
|
+
scopes: [READ_SCOPE, SESSION_SEND_SCOPE].map((scope) => scope.replace('cloudcli:', 'cloudpit:')),
|
|
444
444
|
expiresInDays: 30,
|
|
445
445
|
});
|
|
446
446
|
if (!mainToken.ok || !sendOnlyToken.ok) {
|
|
@@ -278,7 +278,7 @@ async function withPruningSearch(run: (harness: Harness, fixture: Fixture) => Pr
|
|
|
278
278
|
assert.ok(projectId, 'the fixture project must be registered');
|
|
279
279
|
|
|
280
280
|
const tokens = createAccessTokensService({ now: () => new Date(NOW_MS) });
|
|
281
|
-
const readToken = tokens.issueToken({ userId: USER_ONE, name: 'mcp-search-pruning', scopes: ['
|
|
281
|
+
const readToken = tokens.issueToken({ userId: USER_ONE, name: 'mcp-search-pruning', scopes: ['cloudpit:read'], expiresInDays: 30 });
|
|
282
282
|
if (!readToken.ok) {
|
|
283
283
|
throw new Error('the harness must mint a cloudcli:read token');
|
|
284
284
|
}
|
|
@@ -363,7 +363,7 @@ async function withSessionSearch(
|
|
|
363
363
|
|
|
364
364
|
// ---- the tokens ----
|
|
365
365
|
const tokens = createAccessTokensService({ now: () => new Date(NOW_MS) });
|
|
366
|
-
const readToken = tokens.issueToken({ userId: USER_ONE, name: 'mcp-search', scopes: ['
|
|
366
|
+
const readToken = tokens.issueToken({ userId: USER_ONE, name: 'mcp-search', scopes: ['cloudpit:read'], expiresInDays: 30 });
|
|
367
367
|
if (!readToken.ok) {
|
|
368
368
|
throw new Error('the harness must mint a cloudcli:read token');
|
|
369
369
|
}
|
|
@@ -427,13 +427,13 @@ async function withHarness(options: HarnessOptions, run: (harness: Harness) => P
|
|
|
427
427
|
const mainToken = tokens.issueToken({
|
|
428
428
|
userId: USER_ONE,
|
|
429
429
|
name: 'ac249-main',
|
|
430
|
-
scopes: [READ_SCOPE, SESSION_SEND_SCOPE, APPROVE_SCOPE],
|
|
430
|
+
scopes: [READ_SCOPE, SESSION_SEND_SCOPE, APPROVE_SCOPE].map((scope) => scope.replace('cloudcli:', 'cloudpit:')),
|
|
431
431
|
expiresInDays: 30,
|
|
432
432
|
});
|
|
433
433
|
const readToken = tokens.issueToken({
|
|
434
434
|
userId: USER_ONE,
|
|
435
435
|
name: 'ac249-read',
|
|
436
|
-
scopes: [READ_SCOPE],
|
|
436
|
+
scopes: [READ_SCOPE].map((scope) => scope.replace('cloudcli:', 'cloudpit:')),
|
|
437
437
|
expiresInDays: 30,
|
|
438
438
|
});
|
|
439
439
|
if (!mainToken.ok || !readToken.ok) {
|