@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
|
@@ -40,6 +40,8 @@ const createSessionStore = (
|
|
|
40
40
|
model,
|
|
41
41
|
effort: efforts[sessionId] ?? null,
|
|
42
42
|
permission_mode: permissionModes[sessionId] ?? null,
|
|
43
|
+
// The upstream provider a session is bound to; NULL until recorded.
|
|
44
|
+
model_provider_id: null as string | null,
|
|
43
45
|
},
|
|
44
46
|
]));
|
|
45
47
|
return {
|
|
@@ -52,6 +54,15 @@ const createSessionStore = (
|
|
|
52
54
|
session.model = model;
|
|
53
55
|
}
|
|
54
56
|
},
|
|
57
|
+
// Write-once, like the column: a second call cannot move the binding.
|
|
58
|
+
setSessionModelProviderId: (sessionId: string, modelProviderId: string) => {
|
|
59
|
+
const session = sessions.get(sessionId);
|
|
60
|
+
if (!session || session.model_provider_id) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
session.model_provider_id = modelProviderId;
|
|
64
|
+
return true;
|
|
65
|
+
},
|
|
55
66
|
setSessionEffort: (sessionId: string, effort: string) => {
|
|
56
67
|
const session = sessions.get(sessionId);
|
|
57
68
|
if (session) {
|
|
@@ -396,6 +407,10 @@ test('setSessionModel records the model on the session row', () => {
|
|
|
396
407
|
model: 'opus',
|
|
397
408
|
effort: null,
|
|
398
409
|
permissionMode: null,
|
|
410
|
+
// The fixture installs no provider registry and binds no model entry, so
|
|
411
|
+
// no upstream provider is recorded and there is nothing to mark.
|
|
412
|
+
modelProviderId: null,
|
|
413
|
+
modelProviderProblem: null,
|
|
399
414
|
source: 'session',
|
|
400
415
|
});
|
|
401
416
|
assert.equal(sessions.sessions.get('session-1')?.model, 'opus');
|
|
@@ -55,7 +55,7 @@ async function withProviderServer(
|
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
-
test('session creation route names a
|
|
58
|
+
test('session creation route names a Cloudpit session from the initial message', async () => {
|
|
59
59
|
await withProviderServer(async (baseUrl, workspacePath) => {
|
|
60
60
|
const response = await fetch(`${baseUrl}/api/providers/sessions`, {
|
|
61
61
|
method: 'POST',
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
// load-on-demand path the `quay_snapshot` tool's explicit refresh uses.
|
|
8
8
|
// quayFleetRegistry: the fleet's per-project 「对人接口会话」 pin, read/written by the cockpit
|
|
9
9
|
// hub's target resolver (injected at the composition root, so the cockpit module itself stays
|
|
10
|
-
// a leaf). It maps a
|
|
10
|
+
// a leaf). It maps a Cloudpit project id to the fleet registry id and answers failures as
|
|
11
11
|
// values rather than throwing.
|
|
12
12
|
// quayCapabilities / quayDispatchCarrier / quayTaskEvents: the event-driven refresh's three
|
|
13
13
|
// composed pieces. `quayCapabilities` answers whether a project's pinned quay has `task log`;
|
|
@@ -48,7 +48,7 @@ export type QuayDispatchSet =
|
|
|
48
48
|
|
|
49
49
|
/** The injectable boundaries of the dispatch carrier reader. */
|
|
50
50
|
export type QuayDispatchCarrierDependencies = {
|
|
51
|
-
/**
|
|
51
|
+
/** Cloudpit project id → the project root the carrier path is joined under. */
|
|
52
52
|
resolveProjectPathById(projectId: string): string | null;
|
|
53
53
|
/** The service's read-only filesystem boundary (stat size + whole-file UTF-8 read). */
|
|
54
54
|
readFile: QuayFileReader;
|
|
@@ -118,7 +118,7 @@ export function parseFleetJsonObject(text: string): Record<string, unknown> | nu
|
|
|
118
118
|
/**
|
|
119
119
|
* A path canonicalized for root comparison: symlinks resolved, trailing separators dropped.
|
|
120
120
|
* Consumers: the project-id join and the registry, both matching a registered root against a
|
|
121
|
-
*
|
|
121
|
+
* Cloudpit project path. An unresolvable path falls back to a lexical absolute form so a
|
|
122
122
|
* project that has been moved still compares as itself.
|
|
123
123
|
*/
|
|
124
124
|
export function canonicalFleetPath(filePath: string): string {
|
|
@@ -40,10 +40,10 @@ import {
|
|
|
40
40
|
* because every consumer is a server surface that must keep answering when the fleet is absent.
|
|
41
41
|
*/
|
|
42
42
|
|
|
43
|
-
/** The environment variable an operator uses to point
|
|
43
|
+
/** The environment variable an operator uses to point Cloudpit at one exact binary. */
|
|
44
44
|
export const QUAY_FLEET_BIN_ENV = 'QUAY_FLEET_BIN';
|
|
45
45
|
|
|
46
|
-
/** The contract versions THIS build of
|
|
46
|
+
/** The contract versions THIS build of Cloudpit speaks. */
|
|
47
47
|
export const QUAY_FLEET_SUPPORTED_CONTRACTS = {
|
|
48
48
|
wallUri: 'v0',
|
|
49
49
|
registry: 1,
|
|
@@ -14,19 +14,19 @@ import {
|
|
|
14
14
|
} from './quay-fleet-locator.js';
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
|
-
* The
|
|
17
|
+
* The Cloudpit project id → quay-fleet registry id mapping.
|
|
18
18
|
*
|
|
19
19
|
* WHY THIS EXISTS. A `quay://` reference's project segment is spoken out loud and dereferenced
|
|
20
20
|
* by quay-fleet, so it must be the fleet's own stable identity (`projects[].id` in
|
|
21
|
-
* `~/.quay-fleet/registry.json`, e.g. `claudecodeui`), never
|
|
22
|
-
* The fleet registers projects by their ROOT path;
|
|
23
|
-
* This module is the single place that joins the two: the
|
|
21
|
+
* `~/.quay-fleet/registry.json`, e.g. `claudecodeui`), never Cloudpit's internal project UUID.
|
|
22
|
+
* The fleet registers projects by their ROOT path; Cloudpit addresses them by a database id.
|
|
23
|
+
* This module is the single place that joins the two: the Cloudpit project's path (canonicalized,
|
|
24
24
|
* so a trailing separator or a symlinked checkout still matches) is looked up in the registry's
|
|
25
25
|
* project rows, and the registry id found there is the only project segment the wall may mint.
|
|
26
26
|
*
|
|
27
27
|
* The same join answers the other direction: given a registry id from an incoming reference,
|
|
28
|
-
* it names the registered root (quay-fleet's `--root`) and, when
|
|
29
|
-
*
|
|
28
|
+
* it names the registered root (quay-fleet's `--root`) and, when Cloudpit knows that root, the
|
|
29
|
+
* Cloudpit project whose snapshot can answer the read.
|
|
30
30
|
*
|
|
31
31
|
* A FLEET THAT CANNOT ANSWER IS AN ANSWER. No binary, a non-zero exit, malformed output — every
|
|
32
32
|
* failure reads `null`, never throws. `null` is the honest "this project is not registered"
|
|
@@ -60,9 +60,9 @@ export type QuayFleetRegisteredProject = {
|
|
|
60
60
|
};
|
|
61
61
|
|
|
62
62
|
/**
|
|
63
|
-
* One registry id joined to the
|
|
63
|
+
* One registry id joined to the Cloudpit project it names.
|
|
64
64
|
*
|
|
65
|
-
* `projectId` is `null` when
|
|
65
|
+
* `projectId` is `null` when Cloudpit does not know the registered root (an archived project,
|
|
66
66
|
* or a fleet host whose registry lists a checkout this instance never added). The root is
|
|
67
67
|
* still authoritative for the fleet read port; only the snapshot fallback needs `projectId`.
|
|
68
68
|
*/
|
|
@@ -90,9 +90,9 @@ export type QuayFleetAvailability = QuayFleetCliReading;
|
|
|
90
90
|
* Both methods return `null` for "no such project" and never throw.
|
|
91
91
|
*/
|
|
92
92
|
export type QuayFleetProjectIdResolver = {
|
|
93
|
-
/**
|
|
93
|
+
/** Cloudpit project id → fleet registry id, or `null` when its root is not registered. */
|
|
94
94
|
resolveFleetProjectId(projectId: string): Promise<string | null>;
|
|
95
|
-
/** Fleet registry id → registered root + the
|
|
95
|
+
/** Fleet registry id → registered root + the Cloudpit project at that root. */
|
|
96
96
|
resolveFleetProject(projectSegment: string): Promise<QuayFleetProjectMatch | null>;
|
|
97
97
|
/**
|
|
98
98
|
* Whether the fleet CLI answered at all, and why not when it did not.
|
|
@@ -106,11 +106,11 @@ export type QuayFleetProjectIdResolver = {
|
|
|
106
106
|
|
|
107
107
|
/** The seams the mapper reads through; every one of them is replaceable in a test. */
|
|
108
108
|
export type QuayFleetProjectIdDependencies = {
|
|
109
|
-
/**
|
|
109
|
+
/** Cloudpit project id → absolute project path; `null`/absent for an unknown project. */
|
|
110
110
|
resolveProjectPathById: (projectId: string) => string | null | undefined;
|
|
111
111
|
/**
|
|
112
|
-
* Every project this
|
|
113
|
-
* (registry id →
|
|
112
|
+
* Every project this Cloudpit instance knows, used only for the reverse join
|
|
113
|
+
* (registry id → Cloudpit project). Absent leaves `projectId: null` on every match, which
|
|
114
114
|
* still resolves references through the fleet read port but has no snapshot fallback.
|
|
115
115
|
*/
|
|
116
116
|
listProjects?: () => readonly { projectId: string; projectPath: string }[];
|
|
@@ -152,7 +152,7 @@ function readProjectRow(value: unknown): { id: string; root: string } | null {
|
|
|
152
152
|
* Builds the mapping service.
|
|
153
153
|
*
|
|
154
154
|
* The binary is resolved per call rather than captured at boot so an operator can install the
|
|
155
|
-
* fleet CLI (or point `QUAY_FLEET_BIN` at a checkout) without restarting
|
|
155
|
+
* fleet CLI (or point `QUAY_FLEET_BIN` at a checkout) without restarting Cloudpit; a missing
|
|
156
156
|
* binary is the ordinary "nothing is registered here" answer, not a boot failure.
|
|
157
157
|
*/
|
|
158
158
|
export function createQuayFleetProjectIdResolver(
|
|
@@ -10,12 +10,12 @@ import { locateQuayFleetCli } from './quay-fleet-locator.js';
|
|
|
10
10
|
/**
|
|
11
11
|
* The fleet registry's per-project 「对人接口会话」, as the cockpit reads and writes it.
|
|
12
12
|
*
|
|
13
|
-
* THE FLEET IS THE AUTHORITY, and this module is the
|
|
13
|
+
* THE FLEET IS THE AUTHORITY, and this module is the Cloudpit side of that contract. The registry
|
|
14
14
|
* keeps the field as `projects[].interfaceSessionId` and exposes it through
|
|
15
15
|
* `quay-fleet registry interface-session get|set|clear <project> --json`; the browser cannot spawn
|
|
16
16
|
* that CLI, so the server is where the two calls live. Nothing here invents a project identity:
|
|
17
|
-
* the
|
|
18
|
-
* ROOT with the project's path, because a
|
|
17
|
+
* the Cloudpit project id is mapped to the fleet's own registry id by comparing the registered
|
|
18
|
+
* ROOT with the project's path, because a Cloudpit UUID is not a fleet handle.
|
|
19
19
|
*
|
|
20
20
|
* A FLEET THAT CANNOT ANSWER IS AN ANSWER. Every failure — no binary, a non-zero exit, malformed
|
|
21
21
|
* output — is reported as `{ok:false, reason}`, never thrown: the cockpit falls back to the
|
|
@@ -33,7 +33,7 @@ export type QuayFleetInterfaceSessionWrite =
|
|
|
33
33
|
| { ok: true; project: string; interfaceSessionId: string | null }
|
|
34
34
|
| { ok: false; reason: string; detail?: string };
|
|
35
35
|
|
|
36
|
-
/** The two operations the cockpit needs, both addressed by the
|
|
36
|
+
/** The two operations the cockpit needs, both addressed by the Cloudpit project id. */
|
|
37
37
|
export type QuayFleetRegistryService = {
|
|
38
38
|
/** Reads the project's pinned target conversation; `interfaceSessionId: null` means none. */
|
|
39
39
|
readInterfaceSession(projectId: string): Promise<QuayFleetInterfaceSessionReading>;
|
|
@@ -45,7 +45,7 @@ export type QuayFleetRegistryService = {
|
|
|
45
45
|
};
|
|
46
46
|
|
|
47
47
|
export type QuayFleetRegistryDependencies = {
|
|
48
|
-
/**
|
|
48
|
+
/** Cloudpit project id → absolute project path; `null` for an unknown project. */
|
|
49
49
|
resolveProjectPathById: (projectId: string) => string | null | undefined;
|
|
50
50
|
/** The fleet CLI to spawn. Defaults to the shared locator, which owns the lookup order. */
|
|
51
51
|
binPath?: string;
|
|
@@ -69,7 +69,7 @@ function isProjectRow(value: unknown): value is { id: string; root: string } {
|
|
|
69
69
|
* Builds the fleet-registry service.
|
|
70
70
|
*
|
|
71
71
|
* The binary is resolved per call rather than captured at boot so an operator can install the
|
|
72
|
-
* fleet CLI (or point `QUAY_FLEET_BIN` at a checkout) without restarting
|
|
72
|
+
* fleet CLI (or point `QUAY_FLEET_BIN` at a checkout) without restarting Cloudpit; a missing
|
|
73
73
|
* binary is the ordinary `fleet-cli-unavailable` answer, not a boot failure.
|
|
74
74
|
*/
|
|
75
75
|
export function createQuayFleetRegistry(
|
|
@@ -91,10 +91,10 @@ export function createQuayFleetRegistry(
|
|
|
91
91
|
const run = createQuayFleetRunner({ resolveBinPath, exec: dependencies.exec });
|
|
92
92
|
|
|
93
93
|
/**
|
|
94
|
-
* Resolves the
|
|
94
|
+
* Resolves the Cloudpit project to the fleet's own registry id.
|
|
95
95
|
*
|
|
96
96
|
* The path comes from the database, never from the request, and the fleet id is matched by root
|
|
97
|
-
* so a project
|
|
97
|
+
* so a project Cloudpit knows but the fleet does not register is `unknown-project` rather than
|
|
98
98
|
* being guessed from the display name.
|
|
99
99
|
*/
|
|
100
100
|
const resolveFleetProject = async (
|
|
@@ -11,7 +11,7 @@ import { readNullableNumber, readNullableString } from '@/shared/utils.js';
|
|
|
11
11
|
/**
|
|
12
12
|
* The Tests and Fan-in readings, taken through quay's own read-only verbs.
|
|
13
13
|
*
|
|
14
|
-
*
|
|
14
|
+
* Cloudpit used to parse three `.quay/` carrier files itself (`full-suite-state.json`,
|
|
15
15
|
* `verification-round.jsonl`, `worker-outcome.jsonl`) — including a ~100 MB tail scan of the
|
|
16
16
|
* rounds ledger. quay 0.24.0 publishes both readings as bounded JSON instead:
|
|
17
17
|
*
|
|
@@ -20,7 +20,7 @@ import { locateQuayFleetCli } from './quay-fleet-locator.js';
|
|
|
20
20
|
* `wall summary` to it VERBATIM — the same project-scoped address
|
|
21
21
|
* (`quay://<project>/…`) the wall mints, because that is the only form the fleet parses.
|
|
22
22
|
* When that read port is unavailable, a TASK reference
|
|
23
|
-
* falls back to the snapshot
|
|
23
|
+
* falls back to the snapshot Cloudpit already reads for the Quay panel, which is honest
|
|
24
24
|
* stored data — never a summary generated on the spot. `wall resolve` never consults the
|
|
25
25
|
* registry, so the fleet's `project-not-registered` refusal can only arrive from
|
|
26
26
|
* `wall summary`; it is read as its own fallback reason rather than as a broken reader.
|
|
@@ -78,7 +78,7 @@ function reject(reason: QuayUriRejection): QuayUriParseResult {
|
|
|
78
78
|
* Parses one `quay://` reference into its L1 shape, or names why it is not one.
|
|
79
79
|
*
|
|
80
80
|
* The project segment is a quay-fleet REGISTRY ID (`claudecodeui`, `quay-fleet`), never
|
|
81
|
-
*
|
|
81
|
+
* Cloudpit's internal project UUID — see `quay-fleet-project-id.ts` for the join.
|
|
82
82
|
*
|
|
83
83
|
* Accepted forms (project segment mandatory):
|
|
84
84
|
* quay://<fleet-project-id>/task/<id>
|
|
@@ -512,7 +512,7 @@ export type QuayUriSummaryResult = QuayUriSummarySuccess | QuayUriFailure;
|
|
|
512
512
|
* `root` is the registered workspace root the segment joins to. It is passed to `wall
|
|
513
513
|
* summary` as its OPTIONAL `--root` consistency override; a blank root means the segment
|
|
514
514
|
* alone selects the workspace. `projectId`
|
|
515
|
-
* is the
|
|
515
|
+
* is the Cloudpit project at that root, when this instance knows one; the snapshot fallback
|
|
516
516
|
* reads that project, and `null` means there is no snapshot to fall back to.
|
|
517
517
|
*/
|
|
518
518
|
export type QuayUriFleetProject = {
|
|
@@ -526,7 +526,7 @@ export type QuayUriResolveDependencies = {
|
|
|
526
526
|
fleetWallReader: QuayFleetWallReader | null;
|
|
527
527
|
/**
|
|
528
528
|
* Resolves a reference's project segment — a quay-fleet REGISTRY ID (`claudecodeui`), never
|
|
529
|
-
* a
|
|
529
|
+
* a Cloudpit project id — to the registered root and the Cloudpit project at it. `null` when
|
|
530
530
|
* the registry does not know the segment.
|
|
531
531
|
*/
|
|
532
532
|
resolveFleetProject(projectSegment: string): Promise<QuayUriFleetProject | null>;
|
|
@@ -591,7 +591,7 @@ export function createQuayUriResolver(dependencies: QuayUriResolveDependencies):
|
|
|
591
591
|
* The optional `--root` consistency override for a summary read.
|
|
592
592
|
*
|
|
593
593
|
* The URI's PROJECT SEGMENT is authoritative: the fleet resolves it to a workspace root
|
|
594
|
-
* through its own registry.
|
|
594
|
+
* through its own registry. Cloudpit knows a root only through that same registry join
|
|
595
595
|
* ({@link QuayUriResolveDependencies.resolveFleetProject}), so the root passed here is by
|
|
596
596
|
* construction the segment's own root — a consistency override, never a competing one. A
|
|
597
597
|
* join without a root therefore sends no override (the segment alone selects the
|
|
@@ -625,7 +625,7 @@ export function createQuayUriResolver(dependencies: QuayUriResolveDependencies):
|
|
|
625
625
|
* port answered (a summary miss keeps its type/actions/fragment); it is absent when the
|
|
626
626
|
* port could not be read, in which case no action set is forwarded.
|
|
627
627
|
*
|
|
628
|
-
* A registered fleet project
|
|
628
|
+
* A registered fleet project Cloudpit has no project for still has an L1 reading; only the
|
|
629
629
|
* fallback's CONTENT is missing, which is reported as `snapshot-unavailable`.
|
|
630
630
|
*/
|
|
631
631
|
const resolveFromSnapshot = async (
|
|
@@ -639,7 +639,7 @@ export function createQuayUriResolver(dependencies: QuayUriResolveDependencies):
|
|
|
639
639
|
return reference === undefined
|
|
640
640
|
? failure(
|
|
641
641
|
'snapshot-unavailable',
|
|
642
|
-
`fleet project '${address.project}' is registered but no
|
|
642
|
+
`fleet project '${address.project}' is registered but no Cloudpit project is open at '${project.root}'`,
|
|
643
643
|
)
|
|
644
644
|
: fleetAnswer(address, uri, reference);
|
|
645
645
|
}
|
|
@@ -677,7 +677,7 @@ export function createQuayUriResolver(dependencies: QuayUriResolveDependencies):
|
|
|
677
677
|
const { address } = parsed;
|
|
678
678
|
const canonical = formatQuayAddress(address);
|
|
679
679
|
|
|
680
|
-
// The project segment is a fleet REGISTRY ID. An unresolvable segment (a
|
|
680
|
+
// The project segment is a fleet REGISTRY ID. An unresolvable segment (a Cloudpit UUID is
|
|
681
681
|
// the usual shape) is named as such before any read is attempted.
|
|
682
682
|
const project = await dependencies.resolveFleetProject(address.project);
|
|
683
683
|
if (project === null) {
|
|
@@ -94,9 +94,9 @@ const probeWebService = async (host: string, port: number): Promise<boolean> =>
|
|
|
94
94
|
};
|
|
95
95
|
|
|
96
96
|
/**
|
|
97
|
-
* The
|
|
97
|
+
* The Cloudpit project id → quay-fleet registry id join behind every `quay://` project segment.
|
|
98
98
|
* The fleet is the authority for project identity: a reference must say `quay://claudecodeui/…`,
|
|
99
|
-
* never the
|
|
99
|
+
* never the Cloudpit UUID, so the registry id is looked up per registered root and cached for a
|
|
100
100
|
* short TTL. A host without the fleet CLI reads every project as unregistered instead of failing.
|
|
101
101
|
*/
|
|
102
102
|
export const quayFleetProjectIds = createQuayFleetProjectIdResolver({
|
|
@@ -294,7 +294,7 @@ taskIndexReadListener.current = quayTaskEvents.noteProjectRead;
|
|
|
294
294
|
|
|
295
295
|
/**
|
|
296
296
|
* The fleet registry seam the cockpit's pinned-target read/write goes through. It maps a
|
|
297
|
-
*
|
|
297
|
+
* Cloudpit project id to the fleet's own registry id by comparing registered roots, and every
|
|
298
298
|
* failure is an answer (`{ok:false, reason}`) rather than a thrown error — a host without the
|
|
299
299
|
* fleet CLI still renders and routes, falling back to the last-opened session.
|
|
300
300
|
*/
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* QUAY DISPLAY ROUTES
|
|
3
3
|
* ===================
|
|
4
4
|
*
|
|
5
|
-
* Endpoints that expose a project's quay state to the
|
|
5
|
+
* Endpoints that expose a project's quay state to the Cloudpit UI:
|
|
6
6
|
* - `GET /api/quay/fleet-summary` — the eager cross-project reading.
|
|
7
7
|
* - `GET /api/quay/resolve` — dereference one `quay://` reference.
|
|
8
8
|
* - `GET /api/quay/summary` — a reference's summary reading.
|
|
@@ -343,7 +343,7 @@ export type QuayFleetProjectSummary = {
|
|
|
343
343
|
/**
|
|
344
344
|
* The project's quay-fleet REGISTRY id — the only project segment a `quay://` reference may
|
|
345
345
|
* mint. `null` means the root is not registered in the fleet, so this project declares no
|
|
346
|
-
* addressable objects (falling back to the
|
|
346
|
+
* addressable objects (falling back to the Cloudpit UUID would mint a reference the fleet
|
|
347
347
|
* cannot dereference).
|
|
348
348
|
*/
|
|
349
349
|
fleetProjectId: string | null;
|
|
@@ -611,7 +611,7 @@ export const QUAY_READ_ONLY_COMMANDS: readonly (readonly string[])[] = [
|
|
|
611
611
|
['goal', 'list', '--json'],
|
|
612
612
|
['adr', 'list', '--json'],
|
|
613
613
|
// The Tests and Fan-in cards' readings. quay 0.24.0 publishes both as bounded JSON from its
|
|
614
|
-
// own readers, so
|
|
614
|
+
// own readers, so Cloudpit no longer parses `.quay/` carrier files itself. Exact-match entries
|
|
615
615
|
// (no prefix rule): the window is part of the reading, and any other flag combination is
|
|
616
616
|
// refused before a child is spawned.
|
|
617
617
|
QUAY_SUITE_READ_COMMAND,
|
|
@@ -1109,7 +1109,7 @@ type QuayServiceDependencies = {
|
|
|
1109
1109
|
*/
|
|
1110
1110
|
fleetWallReader?: QuayFleetWallReader | null;
|
|
1111
1111
|
/**
|
|
1112
|
-
* The
|
|
1112
|
+
* The Cloudpit project id → quay-fleet registry id join (`quay-fleet-project-id.ts`), behind
|
|
1113
1113
|
* the wall's project segment and the per-project `fleetProjectId` reading. OPTIONAL so a
|
|
1114
1114
|
* composition that does not run a fleet still works: absent means every project is
|
|
1115
1115
|
* unregistered (`fleetProjectId: null`), which the UI renders as 「未登记到 quay-fleet」
|
|
@@ -1936,7 +1936,7 @@ export function createQuayService(dependencies: QuayServiceDependencies) {
|
|
|
1936
1936
|
};
|
|
1937
1937
|
|
|
1938
1938
|
/**
|
|
1939
|
-
* The
|
|
1939
|
+
* The Cloudpit project id → fleet registry id join. A composition without a fleet answers
|
|
1940
1940
|
* `null` for every project — the honest "nothing is registered here" reading that makes the
|
|
1941
1941
|
* UI render 「未登记到 quay-fleet」 instead of minting a UUID reference the fleet cannot read.
|
|
1942
1942
|
*/
|
|
@@ -2655,7 +2655,7 @@ export function createQuayService(dependencies: QuayServiceDependencies) {
|
|
|
2655
2655
|
* The Tier-2 snapshot as `GET /api/quay/:projectId/snapshot` answers it: the stored reading
|
|
2656
2656
|
* plus the project's `fleetProjectId`. The join is stamped here, on every branch, because it
|
|
2657
2657
|
* is what the wall mints its project segment from — a cached snapshot body carrying a stale
|
|
2658
|
-
* (or absent) join would let the renderer fall back to the
|
|
2658
|
+
* (or absent) join would let the renderer fall back to the Cloudpit id.
|
|
2659
2659
|
*/
|
|
2660
2660
|
const getQuaySnapshot = async (
|
|
2661
2661
|
projectId: string,
|
|
@@ -2933,7 +2933,7 @@ export function createQuayService(dependencies: QuayServiceDependencies) {
|
|
|
2933
2933
|
const quayUriResolver = createQuayUriResolver({
|
|
2934
2934
|
fleetWallReader,
|
|
2935
2935
|
// The project segment is a quay-fleet REGISTRY ID. The join names the registered root the
|
|
2936
|
-
// fleet read port is called with, and the
|
|
2936
|
+
// fleet read port is called with, and the Cloudpit project (if any) whose snapshot can
|
|
2937
2937
|
// supplement a task reference.
|
|
2938
2938
|
resolveFleetProject: (projectSegment) => fleetProjectIds.resolveFleetProject(projectSegment),
|
|
2939
2939
|
// Cached first, so dereferencing a URI the panel just rendered spawns nothing. A cold
|
|
@@ -107,7 +107,7 @@ export type SessionTaskStoreRecord = {
|
|
|
107
107
|
* production classification with stubs and no filesystem, git or deployment state.
|
|
108
108
|
*/
|
|
109
109
|
export type SessionTaskChainDependencies = {
|
|
110
|
-
/** The
|
|
110
|
+
/** The Cloudpit project path for a project id, or `null` when the project is unknown. */
|
|
111
111
|
resolveProjectPath(projectId: string): string | null;
|
|
112
112
|
/** The session's transcript (JSONL) path, or `null` when it has none yet. */
|
|
113
113
|
resolveTranscriptPath(input: { projectId: string; sessionId: string }): string | null;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Cross-repository contract tests:
|
|
2
|
+
* Cross-repository contract tests: Cloudpit against the INSTALLED quay-fleet.
|
|
3
3
|
*
|
|
4
|
-
* WHAT THIS FILE PROVES. Every `quay-fleet` invocation
|
|
4
|
+
* WHAT THIS FILE PROVES. Every `quay-fleet` invocation Cloudpit consumes is run against the real
|
|
5
5
|
* binary on this host, and its JSON answer is checked against the declaration in `shapes.ts`.
|
|
6
6
|
* The handshake goes first: if the fleet declares a contract this build does not speak, the run
|
|
7
7
|
* reds and names the contract instead of exercising verbs whose output may have moved under us.
|
|
@@ -475,7 +475,7 @@ if (binPath === null) {
|
|
|
475
475
|
);
|
|
476
476
|
assertShape(contract.id, document, contract.shape);
|
|
477
477
|
|
|
478
|
-
// `wall resolve` was asked for the `#ac-<n>` form; validate the branch
|
|
478
|
+
// `wall resolve` was asked for the `#ac-<n>` form; validate the branch Cloudpit renders,
|
|
479
479
|
// not merely its presence (the shape declaration already pins kind/index).
|
|
480
480
|
if (contract.id === 'wall-resolve') {
|
|
481
481
|
const fragment = document?.fragment as { kind?: unknown; index?: unknown } | undefined;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The JSON shape declarations for every `quay-fleet` CLI contract
|
|
2
|
+
* The JSON shape declarations for every `quay-fleet` CLI contract Cloudpit consumes.
|
|
3
3
|
*
|
|
4
|
-
* WHY THIS FILE EXISTS.
|
|
4
|
+
* WHY THIS FILE EXISTS. Cloudpit talks to a separately versioned program — the installed
|
|
5
5
|
* `quay-fleet` — through plain JSON on stdout. Until this file, every consumer parsed that JSON
|
|
6
6
|
* with its own hand-written reader and no test ever compared the READER against the REAL CLI:
|
|
7
7
|
* the two sides were validated independently, so a rename in the fleet's output was discovered
|
|
@@ -9,19 +9,19 @@
|
|
|
9
9
|
* project-segment disagreement (`quay://task/<id>` vs `quay://<project>/task/<id>`): each side's
|
|
10
10
|
* own tests were green, and the breakage only appeared when the two real programs met.
|
|
11
11
|
*
|
|
12
|
-
* A contract here is therefore (a) the exact argv
|
|
12
|
+
* A contract here is therefore (a) the exact argv Cloudpit runs and (b) a declared shape for the
|
|
13
13
|
* JSON it must answer with. `fleet-cli-contracts.test.ts` invokes the INSTALLED fleet and checks
|
|
14
14
|
* every answer against these declarations, so an incompatible change on either side reds before
|
|
15
15
|
* merge instead of in production.
|
|
16
16
|
*
|
|
17
17
|
* THE LYING RISK THIS FILE MUST NOT HAVE. A shape that accepts everything protects nothing. The
|
|
18
|
-
* declarations below therefore name the fields
|
|
18
|
+
* declarations below therefore name the fields Cloudpit actually reads as REQUIRED, pin the
|
|
19
19
|
* closed-vocabulary ones to their legal values (the trivalent readings the fleet uses throughout:
|
|
20
20
|
* `ok` / `absent` / `invalid`, and `string | null`), and let UNDECLARED fields through on purpose
|
|
21
21
|
* — a fleet that ADDS a field stays compatible, which is exactly the forward-compatibility rule
|
|
22
22
|
* the contract must encode.
|
|
23
23
|
*
|
|
24
|
-
* ADDING A CONSUMER. Whenever
|
|
24
|
+
* ADDING A CONSUMER. Whenever Cloudpit starts invoking a new `quay-fleet` verb (or starts reading
|
|
25
25
|
* a new field from an existing one), add the invocation and its shape here AND a case to
|
|
26
26
|
* `fleet-cli-contracts.test.ts`. The rule and its rationale are repeated in `README.md`, which is
|
|
27
27
|
* where a human adding a consumer is expected to look first.
|
|
@@ -250,7 +250,7 @@ export type FleetCliContractContext = {
|
|
|
250
250
|
export type FleetCliContract = {
|
|
251
251
|
/** Stable id printed in every failure and per-contract report line. */
|
|
252
252
|
id: string;
|
|
253
|
-
/** The
|
|
253
|
+
/** The Cloudpit reader that consumes this invocation. */
|
|
254
254
|
consumer: string;
|
|
255
255
|
/** True when the verb mutates the fleet home (must run against a temporary home). */
|
|
256
256
|
writes: boolean;
|
|
@@ -293,7 +293,7 @@ export const HANDSHAKE_SHAPE: Shape = {
|
|
|
293
293
|
* `quay-fleet wall resolve <uri> --json` — the L1 reference.
|
|
294
294
|
*
|
|
295
295
|
* The test always asks for the fragment form (`#ac-<n>`), so `fragment` is REQUIRED here rather
|
|
296
|
-
* than optional: dropping it would silently stop exercising the branch
|
|
296
|
+
* than optional: dropping it would silently stop exercising the branch Cloudpit renders.
|
|
297
297
|
*/
|
|
298
298
|
export const WALL_RESOLVE_SHAPE: Shape = {
|
|
299
299
|
type: 'object',
|
|
@@ -318,7 +318,7 @@ export const WALL_RESOLVE_SHAPE: Shape = {
|
|
|
318
318
|
* `quay-fleet wall summary <uri> --root <dir> --json` — the L2 reading.
|
|
319
319
|
*
|
|
320
320
|
* Three-valued on purpose: `ok` carries the stored summary, `absent` is an honest reading of the
|
|
321
|
-
* write path (no row stored yet), and `invalid` means the URI itself was rejected.
|
|
321
|
+
* write path (no row stored yet), and `invalid` means the URI itself was rejected. Cloudpit's
|
|
322
322
|
* `readFleetL2` treats `ok`/`absent` as readings and everything else as unreadable, so the three
|
|
323
323
|
* states must stay distinguishable here.
|
|
324
324
|
*/
|
|
@@ -595,7 +595,7 @@ export const LIVENESS_SHAPE: Shape = {
|
|
|
595
595
|
},
|
|
596
596
|
};
|
|
597
597
|
|
|
598
|
-
// The fleet's `status` document is the largest contract, but
|
|
598
|
+
// The fleet's `status` document is the largest contract, but Cloudpit consumes it section by
|
|
599
599
|
// section. Every field below is one a reader or the cockpit displays; nested extras (the outbox's
|
|
600
600
|
// per-class attribution detail, for example) are deliberately not declared — they may grow.
|
|
601
601
|
const DRIVER_READ_SHAPE: Shape = {
|
|
@@ -784,7 +784,7 @@ export const STATUS_SHAPE: Shape = {
|
|
|
784
784
|
};
|
|
785
785
|
|
|
786
786
|
/**
|
|
787
|
-
* Every contract
|
|
787
|
+
* Every contract Cloudpit consumes. Order is the report order; the handshake is first because a
|
|
788
788
|
* listener reading the output needs the negotiated version before the verb results.
|
|
789
789
|
*/
|
|
790
790
|
export const FLEET_CLI_CONTRACTS: readonly FleetCliContract[] = [
|
|
@@ -28,7 +28,7 @@ import {
|
|
|
28
28
|
* include is `src/**` and would find no tests here.
|
|
29
29
|
*/
|
|
30
30
|
|
|
31
|
-
/** The handshake this
|
|
31
|
+
/** The handshake this Cloudpit build speaks. */
|
|
32
32
|
const SUPPORTED = { wallUri: 'v0', registry: 1, interfaceSession: 'v0' } as const;
|
|
33
33
|
|
|
34
34
|
/** A `quay-fleet --version --json` document. */
|
|
@@ -12,10 +12,10 @@ import {
|
|
|
12
12
|
import { createQuayService } from '../quay.service.js';
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
|
-
* The
|
|
15
|
+
* The Cloudpit project id → quay-fleet registry id join (quay-fleet-project-id).
|
|
16
16
|
*
|
|
17
17
|
* THE MATCH IS BY ROOT, NOT BY NAME. The fleet registry is the authority for project identity,
|
|
18
|
-
* and it registers a project by its root path;
|
|
18
|
+
* and it registers a project by its root path; Cloudpit knows projects by a database id. The
|
|
19
19
|
* join therefore canonicalizes BOTH sides — a trailing separator and a symlinked checkout are
|
|
20
20
|
* the same project — and only an exact (canonical) root match yields a registry id.
|
|
21
21
|
*
|
|
@@ -60,7 +60,7 @@ function staticExec(stdout: string, calls: ExecCall[] = []): QuayFleetProjectIdD
|
|
|
60
60
|
|
|
61
61
|
/**
|
|
62
62
|
* A temp workspace: `real/` is the checkout, `link/` a symlink to it. The registry registers
|
|
63
|
-
* `real/` (with a trailing slash) while
|
|
63
|
+
* `real/` (with a trailing slash) while Cloudpit addresses the project through `link/` — the
|
|
64
64
|
* two spellings must still join.
|
|
65
65
|
*/
|
|
66
66
|
function createWorkspace(): {
|
|
@@ -86,7 +86,7 @@ test('AC3: a registered root matches through a trailing separator and a symlink'
|
|
|
86
86
|
const resolver = createQuayFleetProjectIdResolver({
|
|
87
87
|
resolveProjectPathById: (projectId) =>
|
|
88
88
|
projectId === 'cloud-project'
|
|
89
|
-
//
|
|
89
|
+
// Cloudpit stored the SYMLINKED path, with a trailing separator of its own.
|
|
90
90
|
? `${workspace.link}${path.sep}`
|
|
91
91
|
: null,
|
|
92
92
|
listProjects: () => [{ projectId: 'cloud-project', projectPath: workspace.link }],
|
|
@@ -127,9 +127,9 @@ test('AC3: an unregistered root and an unregistered segment are null, never a gu
|
|
|
127
127
|
});
|
|
128
128
|
|
|
129
129
|
assert.equal(await resolver.resolveFleetProjectId('elsewhere'), null);
|
|
130
|
-
// An unknown
|
|
130
|
+
// An unknown Cloudpit project is null without even reading the registry.
|
|
131
131
|
assert.equal(await resolver.resolveFleetProjectId('no-such-project'), null);
|
|
132
|
-
// A registry id nobody registered is null;
|
|
132
|
+
// A registry id nobody registered is null; Cloudpit ids are never accepted as segments.
|
|
133
133
|
assert.equal(await resolver.resolveFleetProject('cloud-uuid'), null);
|
|
134
134
|
} finally {
|
|
135
135
|
fs.rmSync(workspace.directory, { recursive: true, force: true });
|
|
@@ -31,10 +31,10 @@ import { createQuayService } from '../quay.service.js';
|
|
|
31
31
|
* of it. The fleet side is a stub whose payloads use quay-fleet's v0 enum
|
|
32
32
|
* (`config/object-uri.types.v0.json`) verbatim.
|
|
33
33
|
*
|
|
34
|
-
* THE TWO IDENTITIES ARE DELIBERATELY DIFFERENT. `CLOUD_PROJECT_ID` is what
|
|
34
|
+
* THE TWO IDENTITIES ARE DELIBERATELY DIFFERENT. `CLOUD_PROJECT_ID` is what Cloudpit's database
|
|
35
35
|
* keys the project by; `FLEET_PROJECT_ID` is the registry id a `quay://` reference carries. A
|
|
36
36
|
* UUID-shaped project segment must NOT resolve (it is the shape this task removed), and the
|
|
37
|
-
* snapshot fallback must still be read through the
|
|
37
|
+
* snapshot fallback must still be read through the Cloudpit id — the join is what proves both.
|
|
38
38
|
*
|
|
39
39
|
* RUNNER NOTE: this is a server test, so it runs under the repository's canonical server
|
|
40
40
|
* runner (`tsx --test`, `scripts/test.sh`), not vitest — vitest's `include` is `src/**` only
|
|
@@ -48,7 +48,7 @@ const AC_URI = `quay://${FLEET_PROJECT_ID}/task/T-42#ac-3`;
|
|
|
48
48
|
const GOAL_URI = `quay://${FLEET_PROJECT_ID}/goal/G-1`;
|
|
49
49
|
const PROJECT_ROOT = '/workspace/claudecodeui';
|
|
50
50
|
|
|
51
|
-
/** A project segment in the shape the removed mapping used to accept:
|
|
51
|
+
/** A project segment in the shape the removed mapping used to accept: Cloudpit's own UUID. */
|
|
52
52
|
const UUID_URI = `quay://${CLOUD_PROJECT_ID}/task/T-42`;
|
|
53
53
|
|
|
54
54
|
/** quay-fleet's v0 action enum, copied from its `config/object-uri.types.v0.json` fixture. */
|
|
@@ -146,9 +146,9 @@ function createStubFleet(available = true, calls: string[] = []): QuayFleetWallR
|
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
/**
|
|
149
|
-
* Resolves the one fixture fleet project to its registered root and
|
|
149
|
+
* Resolves the one fixture fleet project to its registered root and Cloudpit project.
|
|
150
150
|
*
|
|
151
|
-
* Only the fleet REGISTRY id resolves; the
|
|
151
|
+
* Only the fleet REGISTRY id resolves; the Cloudpit project id (a UUID) is deliberately absent,
|
|
152
152
|
* which is what makes a UUID-shaped project segment an `unknown-project`.
|
|
153
153
|
*/
|
|
154
154
|
function resolveFleetProject(
|
|
@@ -162,8 +162,8 @@ function resolveFleetProject(
|
|
|
162
162
|
}
|
|
163
163
|
|
|
164
164
|
/**
|
|
165
|
-
* The project-id seam the service composes: the
|
|
166
|
-
* only through the registry, and the fleet id joins back to this fixture's root +
|
|
165
|
+
* The project-id seam the service composes: the Cloudpit id joins to the fleet registry id
|
|
166
|
+
* only through the registry, and the fleet id joins back to this fixture's root + Cloudpit id.
|
|
167
167
|
*/
|
|
168
168
|
const fleetProjectIdResolver: QuayFleetProjectIdResolver = {
|
|
169
169
|
async resolveFleetProjectId(projectId) {
|
|
@@ -610,7 +610,7 @@ test('AC4: the project segment is a fleet registry id, and a UUID segment is unk
|
|
|
610
610
|
assert.equal(resolved.uri, TASK_URI);
|
|
611
611
|
assert.deepEqual(roots, [PROJECT_ROOT], 'the fleet summary must be called with the registered root');
|
|
612
612
|
|
|
613
|
-
// The removed shape: a
|
|
613
|
+
// The removed shape: a Cloudpit UUID as the project segment. The registry does not know it,
|
|
614
614
|
// so the reference is named `unknown-project` and no fleet read is attempted for it.
|
|
615
615
|
const before = roots.length;
|
|
616
616
|
for (const result of [await resolver.resolve(UUID_URI), await resolver.summary(UUID_URI)]) {
|
|
@@ -668,7 +668,7 @@ test('AC3: the routes answer invalid references with 4xx and no read port with 5
|
|
|
668
668
|
const unavailableBody = (await unavailable.json()) as { error: { code: string } };
|
|
669
669
|
assert.equal(unavailableBody.error.code, 'fleet-unavailable');
|
|
670
670
|
|
|
671
|
-
// A project segment the fleet does not register (
|
|
671
|
+
// A project segment the fleet does not register (Cloudpit's UUID, the removed shape) is
|
|
672
672
|
// a 404 naming `unknown-project` — never a UUID-addressed read.
|
|
673
673
|
const unknown = await fetch(`${base}/resolve?uri=${encodeURIComponent(UUID_URI)}`);
|
|
674
674
|
assert.equal(unknown.status, 404);
|
|
@@ -709,7 +709,7 @@ test('AC1: the service composes the injected fleet reader into its dereference m
|
|
|
709
709
|
assert.equal(resolved.source, 'fleet');
|
|
710
710
|
|
|
711
711
|
// The Tier-2 snapshot carries the same join: its project segment is the registry id, never
|
|
712
|
-
// the
|
|
712
|
+
// the Cloudpit id the request was keyed by.
|
|
713
713
|
const snapshot = await service.getQuaySnapshot(CLOUD_PROJECT_ID);
|
|
714
714
|
assert.equal(snapshot?.projectId, CLOUD_PROJECT_ID);
|
|
715
715
|
assert.equal(snapshot?.fleetProjectId, FLEET_PROJECT_ID);
|
|
@@ -129,7 +129,7 @@ const SCOPE_TIMEOUT_MS = 15_000;
|
|
|
129
129
|
*
|
|
130
130
|
* It used to be a bare 60_000, which the three boots alone (75_000) already
|
|
131
131
|
* exceeded: on 2026-10-02 a run whose servers had each reached
|
|
132
|
-
* `
|
|
132
|
+
* `Cloudpit Server - Ready` was killed at the 60s boundary with `exit=3` because
|
|
133
133
|
* the budget, not the boot, was too small — and a process-level kill names no
|
|
134
134
|
* `node:test` case, which is why that red could not be attributed.
|
|
135
135
|
*
|