@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
|
@@ -30,6 +30,7 @@ import { createCockpitCardFeedbackStore } from '@/modules/cockpit/cockpit-card-f
|
|
|
30
30
|
import { createCockpitCardRegistry } from '@/modules/cockpit/cockpit-card-registry.js';
|
|
31
31
|
import { createCockpitFleetProjection } from '@/modules/cockpit/cockpit-fleet-card-projection.js';
|
|
32
32
|
import { createCockpitKnowledgeAuthority } from '@/modules/cockpit/cockpit-knowledge-decision.js';
|
|
33
|
+
import { readKnowledgeCase } from '@/modules/cockpit/cockpit-knowledge-reading.js';
|
|
33
34
|
import type { ICockpitActionExecutor, ICockpitCardProvider } from '@/shared/interfaces.js';
|
|
34
35
|
import type {
|
|
35
36
|
CockpitCard,
|
|
@@ -97,6 +98,18 @@ function knowledgeCard(overrides: Partial<CockpitCard> = {}): CockpitCard {
|
|
|
97
98
|
};
|
|
98
99
|
}
|
|
99
100
|
|
|
101
|
+
/** The same card with its apply option routed to another declared executor. */
|
|
102
|
+
function withApplyExecutor(card: CockpitCard, executor: string): CockpitCard {
|
|
103
|
+
return {
|
|
104
|
+
...card,
|
|
105
|
+
options: card.options.map((option) =>
|
|
106
|
+
option.id === 'apply'
|
|
107
|
+
? { ...option, action: { executor, params: { caseId: 'case-1' } } }
|
|
108
|
+
: option,
|
|
109
|
+
),
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
100
113
|
/** A provider over a mutable card list, with a refresh counter. */
|
|
101
114
|
class MutableProvider implements ICockpitCardProvider {
|
|
102
115
|
readonly id = 'test';
|
|
@@ -112,7 +125,15 @@ class MutableProvider implements ICockpitCardProvider {
|
|
|
112
125
|
}
|
|
113
126
|
|
|
114
127
|
declaredExecutors(): readonly string[] {
|
|
115
|
-
return [
|
|
128
|
+
return [
|
|
129
|
+
'test.apply',
|
|
130
|
+
'test.modify',
|
|
131
|
+
'test.defer',
|
|
132
|
+
'test.not-applicable',
|
|
133
|
+
'test.feedback',
|
|
134
|
+
'fleet.apply',
|
|
135
|
+
'session.send',
|
|
136
|
+
];
|
|
116
137
|
}
|
|
117
138
|
|
|
118
139
|
feedbackExecutor(): string | null {
|
|
@@ -145,6 +166,8 @@ function setup(cards: readonly CockpitCard[]) {
|
|
|
145
166
|
const actionExecutors = ['apply', 'modify', 'defer', 'not-applicable'].map((id) =>
|
|
146
167
|
countingExecutor(`test.${id}`),
|
|
147
168
|
);
|
|
169
|
+
const fleetApply = countingExecutor('fleet.apply');
|
|
170
|
+
const sessionSend = countingExecutor('session.send');
|
|
148
171
|
const feedback = countingExecutor('test.feedback');
|
|
149
172
|
feedback.execute = (params) => {
|
|
150
173
|
feedback.calls.push(structuredClone(params));
|
|
@@ -158,13 +181,23 @@ function setup(cards: readonly CockpitCard[]) {
|
|
|
158
181
|
const store = createCockpitCardFeedbackStore();
|
|
159
182
|
const actions = createCockpitCardActions({
|
|
160
183
|
registry,
|
|
161
|
-
executors: [...actionExecutors, feedback],
|
|
184
|
+
executors: [...actionExecutors, fleetApply, sessionSend, feedback],
|
|
162
185
|
feedbackStore: store,
|
|
163
186
|
knowledge,
|
|
164
187
|
refreshCards: () => provider.refreshCards(),
|
|
165
188
|
now: () => new Date(AT),
|
|
166
189
|
});
|
|
167
|
-
return {
|
|
190
|
+
return {
|
|
191
|
+
provider,
|
|
192
|
+
registry,
|
|
193
|
+
knowledge,
|
|
194
|
+
actions,
|
|
195
|
+
store,
|
|
196
|
+
feedback,
|
|
197
|
+
fleetApply,
|
|
198
|
+
sessionSend,
|
|
199
|
+
actionExecutors,
|
|
200
|
+
};
|
|
168
201
|
}
|
|
169
202
|
|
|
170
203
|
/** The reference the card list route would mint for this card. */
|
|
@@ -249,6 +282,76 @@ test('the projection carries a knowledge card’s case, plan and per-option deci
|
|
|
249
282
|
assert.equal(card.options[1]?.plan, undefined, 'a deferred decision carries no plan');
|
|
250
283
|
});
|
|
251
284
|
|
|
285
|
+
test('a knowledge block’s title and statement are read verbatim, and omitted when unstated', () => {
|
|
286
|
+
// The type accepts the two display fields (compile-time part of this criterion).
|
|
287
|
+
const typed: CockpitKnowledgeCase = {
|
|
288
|
+
caseId: 'case-text',
|
|
289
|
+
knowledgeRevision: 1,
|
|
290
|
+
proposalRevision: 1,
|
|
291
|
+
state: 'pending',
|
|
292
|
+
title: '卡面显示知识标题',
|
|
293
|
+
statement: '正文第一段。\n\n- 要点',
|
|
294
|
+
};
|
|
295
|
+
|
|
296
|
+
const stated = readKnowledgeCase({ ...typed });
|
|
297
|
+
assert.equal(stated?.title, '卡面显示知识标题');
|
|
298
|
+
assert.equal(stated?.statement, '正文第一段。\n\n- 要点');
|
|
299
|
+
|
|
300
|
+
const bare = readKnowledgeCase({ caseId: 'case-bare', knowledgeRevision: 1, proposalRevision: 1 });
|
|
301
|
+
assert.ok(bare !== null);
|
|
302
|
+
assert.equal('title' in bare, false, 'an unstated title leaves NO key on the block');
|
|
303
|
+
assert.equal('statement' in bare, false, 'an unstated statement leaves NO key on the block');
|
|
304
|
+
|
|
305
|
+
const blank = readKnowledgeCase({
|
|
306
|
+
caseId: 'case-blank',
|
|
307
|
+
knowledgeRevision: 1,
|
|
308
|
+
proposalRevision: 1,
|
|
309
|
+
title: ' ',
|
|
310
|
+
statement: '\n\t ',
|
|
311
|
+
});
|
|
312
|
+
assert.ok(blank !== null);
|
|
313
|
+
assert.equal('title' in blank, false, 'a whitespace-only title is unstated');
|
|
314
|
+
assert.equal('statement' in blank, false, 'a whitespace-only statement is unstated');
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
test('the projection passes a knowledge entry’s title and statement through verbatim', () => {
|
|
318
|
+
const projection = createCockpitFleetProjection({ readSessionAsk: () => null });
|
|
319
|
+
const card = (knowledge: Record<string, unknown>) =>
|
|
320
|
+
JSON.stringify({
|
|
321
|
+
id: 'fleet-text',
|
|
322
|
+
revision: 2,
|
|
323
|
+
kind: 'knowledge',
|
|
324
|
+
group: 'ruling',
|
|
325
|
+
rank: 0,
|
|
326
|
+
state: 'open',
|
|
327
|
+
waitingSince: '2026-10-27T00:00:00.000Z',
|
|
328
|
+
surfacedAt: '2026-10-27T00:00:01.000Z',
|
|
329
|
+
subject: { uri: 'quay://knowledge/k-text' },
|
|
330
|
+
facts: [],
|
|
331
|
+
options: [],
|
|
332
|
+
knowledge: {
|
|
333
|
+
caseId: 'case-text',
|
|
334
|
+
knowledgeRevision: 6,
|
|
335
|
+
proposalRevision: 2,
|
|
336
|
+
state: 'pending',
|
|
337
|
+
...knowledge,
|
|
338
|
+
},
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
const stated = projection.project(
|
|
342
|
+
card({ title: '卡面显示知识标题', statement: '正文第一段。\n\n- 要点' }),
|
|
343
|
+
);
|
|
344
|
+
assert.equal(stated.skippedLines, 0);
|
|
345
|
+
assert.equal(stated.cards[0]?.knowledge?.title, '卡面显示知识标题');
|
|
346
|
+
assert.equal(stated.cards[0]?.knowledge?.statement, '正文第一段。\n\n- 要点');
|
|
347
|
+
|
|
348
|
+
const bare = projection.project(card({}));
|
|
349
|
+
const knowledge = bare.cards[0]?.knowledge;
|
|
350
|
+
assert.ok(knowledge !== undefined);
|
|
351
|
+
assert.equal('title' in knowledge, false);
|
|
352
|
+
assert.equal('statement' in knowledge, false);
|
|
353
|
+
});
|
|
354
|
+
|
|
252
355
|
test('an informational card keeps its own group and is never shown as a rescue card', () => {
|
|
253
356
|
const projection = createCockpitFleetProjection({ readSessionAsk: () => null });
|
|
254
357
|
const line = JSON.stringify({
|
|
@@ -323,6 +426,11 @@ test('a complete apply decision delivers the plan under a derived feedback id',
|
|
|
323
426
|
assert.equal(answer.executor, 'test.apply');
|
|
324
427
|
const action = actionExecutors[0];
|
|
325
428
|
assert.equal(action?.calls.length, 1, 'the action runs exactly once');
|
|
429
|
+
assert.equal(
|
|
430
|
+
'confirmation' in ((action?.calls[0] ?? {}) as Record<string, unknown>),
|
|
431
|
+
false,
|
|
432
|
+
'a non-fleet.apply executor gains no confirmation field',
|
|
433
|
+
);
|
|
326
434
|
assert.equal(feedback.calls.length, 1, 'the feedback call is made exactly once');
|
|
327
435
|
|
|
328
436
|
const params = feedback.calls[0] as Record<string, unknown>;
|
|
@@ -343,6 +451,100 @@ test('a complete apply decision delivers the plan under a derived feedback id',
|
|
|
343
451
|
assert.equal(stored.feedbackId, params.feedbackId);
|
|
344
452
|
});
|
|
345
453
|
|
|
454
|
+
test('a knowledge apply decision injects the trusted confirmation into fleet.apply params', async () => {
|
|
455
|
+
const card = withApplyExecutor(knowledgeCard(), 'fleet.apply');
|
|
456
|
+
const ref = issuedRef(card);
|
|
457
|
+
const { actions, fleetApply, feedback } = setup([card]);
|
|
458
|
+
|
|
459
|
+
const answer = await actions.confirm({
|
|
460
|
+
cardId: card.id,
|
|
461
|
+
revision: card.revision,
|
|
462
|
+
optionId: 'apply',
|
|
463
|
+
confirmationRef: ref,
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
assert.equal(answer.executor, 'fleet.apply');
|
|
467
|
+
assert.equal(fleetApply.calls.length, 1);
|
|
468
|
+
const params = fleetApply.calls[0] as Record<string, unknown>;
|
|
469
|
+
assert.equal(params.caseId, 'case-1', 'the option’s declared params are kept');
|
|
470
|
+
|
|
471
|
+
const confirmation = params.confirmation as Record<string, unknown>;
|
|
472
|
+
assert.ok(confirmation, 'fleet.apply receives a confirmation');
|
|
473
|
+
assert.equal(confirmation.actorKind, 'human');
|
|
474
|
+
assert.equal(typeof confirmation.decisionRef, 'string');
|
|
475
|
+
assert.equal(confirmation.decisionRef, ref);
|
|
476
|
+
assert.notEqual(confirmation.decisionRef, '');
|
|
477
|
+
|
|
478
|
+
const at = confirmation.at as string;
|
|
479
|
+
assert.equal(Number.isNaN(Date.parse(at)), false, '`at` parses as a date');
|
|
480
|
+
assert.equal(new Date(at).toISOString(), at, '`at` is an ISO-8601 UTC instant');
|
|
481
|
+
|
|
482
|
+
// `binding` is the case evidence the confirmation authority verified, minus its token, and
|
|
483
|
+
// every field fleet's `confirmationShapeRefusals` requires is present.
|
|
484
|
+
assert.deepEqual(confirmation.binding, {
|
|
485
|
+
caseId: 'case-1',
|
|
486
|
+
knowledgeRevision: 4,
|
|
487
|
+
proposalRevision: 2,
|
|
488
|
+
decision: 'apply',
|
|
489
|
+
factsFingerprint: 'fingerprint-a',
|
|
490
|
+
plan: PLAN,
|
|
491
|
+
});
|
|
492
|
+
assert.deepEqual(answer.params.confirmation, confirmation, 'the answer states what ran');
|
|
493
|
+
|
|
494
|
+
// The feedback receipt is still the SECOND call, and its params did not gain a confirmation.
|
|
495
|
+
assert.equal(feedback.calls.length, 1);
|
|
496
|
+
assert.equal(feedback.calls[0]?.confirmation, undefined);
|
|
497
|
+
});
|
|
498
|
+
|
|
499
|
+
test('a knowledge decision routed to another executor gains no confirmation', async () => {
|
|
500
|
+
const card = withApplyExecutor(knowledgeCard(), 'session.send');
|
|
501
|
+
const ref = issuedRef(card);
|
|
502
|
+
const { actions, sessionSend } = setup([card]);
|
|
503
|
+
|
|
504
|
+
await actions.confirm({
|
|
505
|
+
cardId: card.id,
|
|
506
|
+
revision: card.revision,
|
|
507
|
+
optionId: 'apply',
|
|
508
|
+
confirmationRef: ref,
|
|
509
|
+
});
|
|
510
|
+
|
|
511
|
+
assert.deepEqual(sessionSend.calls[0], { caseId: 'case-1' });
|
|
512
|
+
assert.equal(
|
|
513
|
+
'confirmation' in (sessionSend.calls[0] as Record<string, unknown>),
|
|
514
|
+
false,
|
|
515
|
+
);
|
|
516
|
+
});
|
|
517
|
+
|
|
518
|
+
test('a non-knowledge confirmation passes its declared params unchanged', async () => {
|
|
519
|
+
const card: CockpitCard = {
|
|
520
|
+
...knowledgeCard({ kind: 'ask', knowledge: undefined }),
|
|
521
|
+
options: [
|
|
522
|
+
{
|
|
523
|
+
id: 'send',
|
|
524
|
+
label: 'send',
|
|
525
|
+
does: 'send the reply',
|
|
526
|
+
suggested: false,
|
|
527
|
+
source: 'provider',
|
|
528
|
+
action: { executor: 'session.send', params: { sessionId: 'session-1', text: 'go' } },
|
|
529
|
+
},
|
|
530
|
+
],
|
|
531
|
+
};
|
|
532
|
+
const { actions, sessionSend } = setup([card]);
|
|
533
|
+
|
|
534
|
+
const answer = await actions.confirm({
|
|
535
|
+
cardId: card.id,
|
|
536
|
+
revision: card.revision,
|
|
537
|
+
optionId: 'send',
|
|
538
|
+
});
|
|
539
|
+
|
|
540
|
+
assert.equal(answer.executor, 'session.send');
|
|
541
|
+
assert.deepEqual(sessionSend.calls[0], { sessionId: 'session-1', text: 'go' });
|
|
542
|
+
assert.equal(
|
|
543
|
+
'confirmation' in (sessionSend.calls[0] as Record<string, unknown>),
|
|
544
|
+
false,
|
|
545
|
+
);
|
|
546
|
+
});
|
|
547
|
+
|
|
346
548
|
test('the trusted chain is readable back on the next card read', async () => {
|
|
347
549
|
const card = knowledgeCard();
|
|
348
550
|
const ref = issuedRef(card);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The host-level context event writer — the
|
|
2
|
+
* The host-level context event writer — the Cloudpit side of the shared
|
|
3
3
|
* `~/.quay-fleet/context/events/<YYYY-MM-DD>.jsonl` stream.
|
|
4
4
|
*
|
|
5
5
|
* WHAT THIS OWNS. One append-only file per UTC day, one JSON object per line, and
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
* `write(2)` on a handle opened `O_APPEND`. Two writers in two processes can
|
|
25
25
|
* interleave whole lines but never halves of one. There is no per-event fsync:
|
|
26
26
|
* the stream is evidence, not a write-ahead log, and the fleet's retention job
|
|
27
|
-
* owns rotation and cleanup —
|
|
27
|
+
* owns rotation and cleanup — Cloudpit never deletes a context event.
|
|
28
28
|
*
|
|
29
29
|
* BOUND. One line is at most {@link CONTEXT_EVENT_MAX_LINE_BYTES} (16 KB). An
|
|
30
30
|
* over-long text field is truncated (and `data.truncated` set) rather than
|
|
@@ -52,14 +52,14 @@ import path from 'node:path';
|
|
|
52
52
|
import type { ISessionAskEventWriter } from '@/shared/interfaces.js';
|
|
53
53
|
import type { SessionAskEvent } from '@/shared/types.js';
|
|
54
54
|
|
|
55
|
-
/** The only `source` this writer may mint: this process is the
|
|
55
|
+
/** The only `source` this writer may mint: this process is the Cloudpit producer. */
|
|
56
56
|
export const CONTEXT_EVENT_SOURCE = 'cloudcli';
|
|
57
57
|
|
|
58
58
|
/** One line's ceiling, in UTF-8 bytes, exactly as the task's write discipline states. */
|
|
59
59
|
export const CONTEXT_EVENT_MAX_LINE_BYTES = 16 * 1024;
|
|
60
60
|
|
|
61
61
|
/**
|
|
62
|
-
* Every kind
|
|
62
|
+
* Every kind Cloudpit may produce. A kind outside this list is a programming
|
|
63
63
|
* error in a producer, and the writer rejects it even before the schema is read,
|
|
64
64
|
* so a typo cannot enter the stream while the fleet release is absent.
|
|
65
65
|
*/
|
|
@@ -112,7 +112,7 @@ export type ContextEventDraft = {
|
|
|
112
112
|
* The `data` payload of a `session.asking` row, as quay-fleet's v1 schema states it.
|
|
113
113
|
*
|
|
114
114
|
* `askId` is `<sessionId>:<assistantMessageId>` — the identity the fleet dedups on — and
|
|
115
|
-
* `contentRef` names the
|
|
115
|
+
* `contentRef` names the Cloudpit resolver a fleet consumer can call to read the question.
|
|
116
116
|
*/
|
|
117
117
|
export type SessionAskingEventData = {
|
|
118
118
|
askId: string;
|
|
@@ -733,7 +733,7 @@ export function createContextEventWriter(options: ContextEventWriterOptions = {}
|
|
|
733
733
|
const append = async (draft: ContextEventDraft): Promise<AppendContextEventResult> => {
|
|
734
734
|
if (!(CLOUDCLI_CONTEXT_EVENT_KINDS as readonly string[]).includes(draft.kind)) {
|
|
735
735
|
rejected += 1;
|
|
736
|
-
return { ok: false, reason: 'invalid-kind', detail: `"${draft.kind}" is not a
|
|
736
|
+
return { ok: false, reason: 'invalid-kind', detail: `"${draft.kind}" is not a Cloudpit-produced kind` };
|
|
737
737
|
}
|
|
738
738
|
const document = loadSchema();
|
|
739
739
|
if (document === null) {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The context event stream — the
|
|
2
|
+
* The context event stream — the Cloudpit side of the host-level interaction
|
|
3
3
|
* ledger, plus the shadow predictor that runs on top of it.
|
|
4
4
|
*
|
|
5
5
|
* TWO JOBS, ONE SEAM.
|
|
6
6
|
*
|
|
7
|
-
* 1. Append
|
|
7
|
+
* 1. Append Cloudpit-produced events (an utterance, a chip, a cockpit focus or
|
|
8
8
|
* send, later a build/restart) to `~/.quay-fleet/context/events`.
|
|
9
9
|
* 2. For every utterance, classify it, score the previous prediction, and mint
|
|
10
10
|
* the next `shadow.prediction`. Predictions go to the same file and to
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Reads BACK the two session-ask kinds from the context-event stream.
|
|
3
3
|
*
|
|
4
|
-
* The writer beside this file is the
|
|
4
|
+
* The writer beside this file is the Cloudpit producer's only route into
|
|
5
5
|
* `~/.quay-fleet/context/events/<day>.jsonl`. This reader is the boot-time consumer: it answers
|
|
6
6
|
* which asks this host stated as `session.asking` and never followed with `session.answered`.
|
|
7
7
|
*
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
* declares `fixtureHome` — an isolated fleet home, checked against the real `~/.quay-fleet` (and
|
|
24
24
|
* an operator's `QUAY_FLEET_HOME`) and refused when it resolves to the real one. This is the same
|
|
25
25
|
* discipline as ADR-003's "fixture HOME 隔离与清理": the fixture root is declared, never defaulted
|
|
26
|
-
* to the real home. Real
|
|
26
|
+
* to the real home. Real Cloudpit session ids are unaffected. The failure that motivated the guard
|
|
27
27
|
* was a DoD run writing `dod-codex-blocked-*` rows through the production adapter into the real
|
|
28
28
|
* `~/.quay-fleet/context/events/`, where the fleet upgraded them into ghost cards.
|
|
29
29
|
*
|
|
@@ -99,13 +99,13 @@ export function toSessionBlockedEventDraft(event: SessionBlockedEventRecord): Co
|
|
|
99
99
|
|
|
100
100
|
/**
|
|
101
101
|
* The marker a fixture/DoD scenario puts on a session id it synthesised, as opposed to a real
|
|
102
|
-
*
|
|
102
|
+
* Cloudpit session (a UUID or ULID). The repository's DoD scenarios name their sessions `dod-*`
|
|
103
103
|
* (`dod-codex-session`, `dod-codex-blocked-<epoch>`); `fixture-*` and `synthetic-*` are the same
|
|
104
104
|
* declaration under other spellings.
|
|
105
105
|
*/
|
|
106
106
|
const FIXTURE_SESSION_ID = /(^|[-_.])(dod|fixture|synthetic)([-_.]|$)/i;
|
|
107
107
|
|
|
108
|
-
/** True when the session id declares itself a fixture rather than a real
|
|
108
|
+
/** True when the session id declares itself a fixture rather than a real Cloudpit session. */
|
|
109
109
|
function isFixtureSession(session: string | null | undefined): boolean {
|
|
110
110
|
return typeof session === 'string' && FIXTURE_SESSION_ID.test(session);
|
|
111
111
|
}
|
|
@@ -99,7 +99,7 @@ function descriptiveSchema(version: number, kinds: Record<string, unknown>): Rec
|
|
|
99
99
|
source: 'the writer: cloudcli | fleet',
|
|
100
100
|
kind: 'one of `kinds` below',
|
|
101
101
|
project: 'optional Quay project id',
|
|
102
|
-
session: 'optional
|
|
102
|
+
session: 'optional Cloudpit session id',
|
|
103
103
|
refs: 'optional array of references',
|
|
104
104
|
data: 'kind-specific payload (a JSON object)',
|
|
105
105
|
},
|
|
@@ -68,7 +68,7 @@ const SCHEMA = {
|
|
|
68
68
|
source: 'the writer: cloudcli | fleet',
|
|
69
69
|
kind: 'one of `kinds` below',
|
|
70
70
|
project: 'optional Quay project id',
|
|
71
|
-
session: 'optional
|
|
71
|
+
session: 'optional Cloudpit session id',
|
|
72
72
|
refs: 'optional array of references',
|
|
73
73
|
data: 'kind-specific payload (a JSON object)',
|
|
74
74
|
},
|
|
@@ -144,7 +144,7 @@ const APPROVAL_BLOCK: SessionBlockedEvent = {
|
|
|
144
144
|
toolName: 'commandExecution',
|
|
145
145
|
};
|
|
146
146
|
|
|
147
|
-
/** The synthetic session a DoD/fixture scenario mints; never a real
|
|
147
|
+
/** The synthetic session a DoD/fixture scenario mints; never a real Cloudpit session id. */
|
|
148
148
|
const FIXTURE_SESSION = 'dod-codex-blocked-1793458130445';
|
|
149
149
|
const FIXTURE_BLOCK: SessionBlockedEvent = {
|
|
150
150
|
kind: 'session.blocked',
|
|
@@ -360,7 +360,7 @@ test('a fixture session is refused before the record seam: production wiring, an
|
|
|
360
360
|
});
|
|
361
361
|
|
|
362
362
|
test('the same production adapter still writes a real session id (AC2 regression arm)', async () => {
|
|
363
|
-
// The guard must be discriminating, not a blanket refusal: a real
|
|
363
|
+
// The guard must be discriminating, not a blanket refusal: a real Cloudpit session id goes
|
|
364
364
|
// through the production-wired adapter untouched, in the same run that refused the fixture.
|
|
365
365
|
const reached: ContextEventDraft[] = [];
|
|
366
366
|
const adapter = createSessionBlockedEventWriter({
|
|
@@ -63,7 +63,7 @@ const SCHEMA = {
|
|
|
63
63
|
source: 'the writer: cloudcli | fleet',
|
|
64
64
|
kind: 'one of `kinds` below',
|
|
65
65
|
project: 'optional Quay project id',
|
|
66
|
-
session: 'optional
|
|
66
|
+
session: 'optional Cloudpit session id',
|
|
67
67
|
refs: 'optional array of references',
|
|
68
68
|
data: 'kind-specific payload (a JSON object)',
|
|
69
69
|
},
|
|
@@ -786,7 +786,7 @@ const reclassifySelfAssignedSessionNames = (db: Database): void => {
|
|
|
786
786
|
}
|
|
787
787
|
if (readings.length + overrides.length > 0) {
|
|
788
788
|
console.log(
|
|
789
|
-
`Running migration: Re-filing ${readings.length + overrides.length} session(s) named after a
|
|
789
|
+
`Running migration: Re-filing ${readings.length + overrides.length} session(s) named after a legacy resident address`
|
|
790
790
|
);
|
|
791
791
|
}
|
|
792
792
|
};
|
|
@@ -825,6 +825,26 @@ const addSessionPermissionModeColumn = (db: Database): void => {
|
|
|
825
825
|
ensureColumns(db, 'sessions', [['permission_mode', 'TEXT']]);
|
|
826
826
|
};
|
|
827
827
|
|
|
828
|
+
/**
|
|
829
|
+
* Adds the `model_provider_id` column: the upstream provider a session's model
|
|
830
|
+
* is bound to, recorded by the first send after the row exists.
|
|
831
|
+
*
|
|
832
|
+
* Existing rows stay NULL on purpose. A session that has already run under a
|
|
833
|
+
* bound provider is the only case where a backfill could be right, and it
|
|
834
|
+
* cannot be told apart from one that ran under the provider default without
|
|
835
|
+
* re-reading every model entry's config — a guess written into the column would
|
|
836
|
+
* then be enforced as if the session had really recorded it. NULL keeps its
|
|
837
|
+
* documented meaning ("no binding recorded"), and the switch guard only ever
|
|
838
|
+
* refuses a session that RECORDED a different provider.
|
|
839
|
+
*
|
|
840
|
+
* Runs after every sessions-table rebuild: `dropLaunchProfileStructures` copies
|
|
841
|
+
* an explicit column list, so a column added before it would be dropped with
|
|
842
|
+
* the old table.
|
|
843
|
+
*/
|
|
844
|
+
const addSessionModelProviderIdColumn = (db: Database): void => {
|
|
845
|
+
ensureColumns(db, 'sessions', [['model_provider_id', 'TEXT']]);
|
|
846
|
+
};
|
|
847
|
+
|
|
828
848
|
/**
|
|
829
849
|
* Adds the `lifecycle_mode` column: how long a session's process is meant to
|
|
830
850
|
* live ('per-run' or 'resident').
|
|
@@ -1083,6 +1103,9 @@ export const runMigrations = (db: Database) => {
|
|
|
1083
1103
|
// lifecycle_mode added before it would be dropped along with the old table
|
|
1084
1104
|
// and every existing session would come back with the column missing.
|
|
1085
1105
|
addSessionLifecycleModeColumn(db);
|
|
1106
|
+
// After every rebuild for the same reason: this column is appended, so a
|
|
1107
|
+
// rebuild that copies an explicit column list would drop it.
|
|
1108
|
+
addSessionModelProviderIdColumn(db);
|
|
1086
1109
|
ensureProjectsForSessionPaths(db);
|
|
1087
1110
|
db.exec(SCHEDULED_MESSAGES_TABLE_SCHEMA_SQL);
|
|
1088
1111
|
// OAuth storage (mcp-gateway-SPEC stage 5, AC-258). Order matters: the
|
|
@@ -75,6 +75,16 @@ type SessionRow = {
|
|
|
75
75
|
model: string | null;
|
|
76
76
|
/** Reasoning effort this session runs with; NULL until the app records one. */
|
|
77
77
|
effort: string | null;
|
|
78
|
+
/**
|
|
79
|
+
* The upstream provider the session's model is bound to; NULL when no binding
|
|
80
|
+
* has been recorded. Written once, by the session's first send.
|
|
81
|
+
*
|
|
82
|
+
* Optional in the type the way `transcript_name` is — a hand-built row (a
|
|
83
|
+
* test stub or an in-memory lookup) written before the column existed stays a
|
|
84
|
+
* valid `SessionRow` — but never absent from one this repository read out of
|
|
85
|
+
* the database.
|
|
86
|
+
*/
|
|
87
|
+
model_provider_id?: string | null;
|
|
78
88
|
/**
|
|
79
89
|
* Permission mode the session last sent a message with; NULL until a send
|
|
80
90
|
* records one. NULL is a real answer, not "unknown": it means no message has
|
|
@@ -221,7 +231,8 @@ function sessionRowColumns(prefix = ''): string {
|
|
|
221
231
|
${displayNameSql(prefix)} AS custom_name,
|
|
222
232
|
${displayNameSourceSql(prefix)} AS name_source,
|
|
223
233
|
${prefix}transcript_name, ${prefix}transcript_name_source,
|
|
224
|
-
${prefix}model, ${prefix}effort, ${prefix}
|
|
234
|
+
${prefix}model, ${prefix}effort, ${prefix}model_provider_id, ${prefix}permission_mode,
|
|
235
|
+
${prefix}lifecycle_mode,
|
|
225
236
|
${prefix}forked_from_session_id, ${prefix}isArchived, ${prefix}created_at, ${prefix}updated_at`;
|
|
226
237
|
}
|
|
227
238
|
|
|
@@ -522,7 +533,7 @@ export const sessionsDb = {
|
|
|
522
533
|
* `session_id` is the stable app-facing id, while `provider_session_id`
|
|
523
534
|
* stays NULL until the provider runtime announces its own id and
|
|
524
535
|
* `assignProviderSessionId` records the mapping. `customName` is derived
|
|
525
|
-
* from the first visible
|
|
536
|
+
* from the first visible Cloudpit message by the sessions service.
|
|
526
537
|
*
|
|
527
538
|
* `selection` is the model/effort/permission-mode the session is being created
|
|
528
539
|
* WITH, written in the same statement that mints the row. It is a parameter
|
|
@@ -594,6 +605,8 @@ export const sessionsDb = {
|
|
|
594
605
|
forkedFromSessionId: string;
|
|
595
606
|
model: string | null;
|
|
596
607
|
effort: string | null;
|
|
608
|
+
/** The source's upstream-provider binding; copied so the branch resumes it. */
|
|
609
|
+
modelProviderId?: string | null;
|
|
597
610
|
permissionMode: string | null;
|
|
598
611
|
lifecycleMode: HostMode;
|
|
599
612
|
}): string {
|
|
@@ -609,8 +622,8 @@ export const sessionsDb = {
|
|
|
609
622
|
db.prepare('DELETE FROM sessions WHERE session_id = ? AND session_id <> ?')
|
|
610
623
|
.run(input.providerSessionId, input.sessionId);
|
|
611
624
|
db.prepare(
|
|
612
|
-
`INSERT INTO sessions (session_id, provider, provider_session_id, custom_name, project_path, jsonl_path, model, effort, permission_mode, lifecycle_mode, forked_from_session_id, isArchived, created_at, updated_at)
|
|
613
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)`
|
|
625
|
+
`INSERT INTO sessions (session_id, provider, provider_session_id, custom_name, project_path, jsonl_path, model, effort, model_provider_id, permission_mode, lifecycle_mode, forked_from_session_id, isArchived, created_at, updated_at)
|
|
626
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 0, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)`
|
|
614
627
|
).run(
|
|
615
628
|
input.sessionId,
|
|
616
629
|
input.provider,
|
|
@@ -620,6 +633,7 @@ export const sessionsDb = {
|
|
|
620
633
|
input.jsonlPath,
|
|
621
634
|
input.model,
|
|
622
635
|
input.effort,
|
|
636
|
+
input.modelProviderId ?? null,
|
|
623
637
|
input.permissionMode,
|
|
624
638
|
input.lifecycleMode,
|
|
625
639
|
input.forkedFromSessionId,
|
|
@@ -746,6 +760,29 @@ export const sessionsDb = {
|
|
|
746
760
|
).run(model, sessionId);
|
|
747
761
|
},
|
|
748
762
|
|
|
763
|
+
/**
|
|
764
|
+
* Records the upstream provider a session's model is bound to.
|
|
765
|
+
*
|
|
766
|
+
* Write-once by construction, not by convention: the UPDATE only matches a
|
|
767
|
+
* row whose binding is still NULL or blank, so a second call cannot move a
|
|
768
|
+
* conversation to another provider behind the switch guard's back. Returns
|
|
769
|
+
* whether the binding was actually written.
|
|
770
|
+
*
|
|
771
|
+
* The service is the one that decides WHEN a binding exists
|
|
772
|
+
* (`providerModelsService.setSessionModel`), so this stays an ordinary row
|
|
773
|
+
* write with no provider knowledge of its own.
|
|
774
|
+
*/
|
|
775
|
+
setSessionModelProviderId(sessionId: string, modelProviderId: string): boolean {
|
|
776
|
+
const db = getConnection();
|
|
777
|
+
const result = db.prepare(
|
|
778
|
+
`UPDATE sessions
|
|
779
|
+
SET model_provider_id = ?
|
|
780
|
+
WHERE session_id = ?
|
|
781
|
+
AND (model_provider_id IS NULL OR trim(model_provider_id) = '')`
|
|
782
|
+
).run(modelProviderId, sessionId);
|
|
783
|
+
return result.changes > 0;
|
|
784
|
+
},
|
|
785
|
+
|
|
749
786
|
/**
|
|
750
787
|
* Records the reasoning effort one session runs with.
|
|
751
788
|
*
|
|
@@ -26,7 +26,7 @@ export const voiceUserIdentifiersDb = {
|
|
|
26
26
|
* frequency that no single message explains. The `canonical` spelling is kept
|
|
27
27
|
* from the FIRST sighting (the conflict branch deliberately does not overwrite
|
|
28
28
|
* it), so a later message that spells `cloudcli` does not rename a token the
|
|
29
|
-
* listing already showed as `
|
|
29
|
+
* listing already showed as `Cloudpit`.
|
|
30
30
|
*/
|
|
31
31
|
incrementTokens(entries: VoiceIdentifierIncrement[]): void {
|
|
32
32
|
if (entries.length === 0) {
|
|
@@ -163,7 +163,7 @@ CREATE TABLE IF NOT EXISTS sessions (
|
|
|
163
163
|
-- \`name_source\`: 'manual' there means the user renamed it *in this app*,
|
|
164
164
|
-- a claim the transcript cannot make.
|
|
165
165
|
--
|
|
166
|
-
-- 'self-assigned' is the app's own rung: the address
|
|
166
|
+
-- 'self-assigned' is the app's own rung: the address Cloudpit handed the CLI
|
|
167
167
|
-- as \`--name\`, which the CLI writes back into the transcript as both
|
|
168
168
|
-- \`agent-name\` and \`custom-title\`. It is a name the app invented rather
|
|
169
169
|
-- than one the session earned, so it ranks below 'ai' and above 'derived' —
|
|
@@ -176,6 +176,20 @@ CREATE TABLE IF NOT EXISTS sessions (
|
|
|
176
176
|
-- restores its exact runtime configuration instead of provider defaults.
|
|
177
177
|
model TEXT,
|
|
178
178
|
effort TEXT,
|
|
179
|
+
-- The upstream provider this session's model is bound to, written once by
|
|
180
|
+
-- the session's first send (a custom model entry may name one through its
|
|
181
|
+
-- \`codexProviderId\`, AC-461). It is a property of the SESSION because a
|
|
182
|
+
-- provider runtime records it inside the conversation it starts and checks
|
|
183
|
+
-- it again on every resume: switching the model to one from another
|
|
184
|
+
-- provider would not switch providers, it would break the thread.
|
|
185
|
+
--
|
|
186
|
+
-- NULL means no binding has been recorded: the selection ran under the
|
|
187
|
+
-- provider's own default, or the session predates this column. NULL is not
|
|
188
|
+
-- "the default provider", so a later selection may still establish a
|
|
189
|
+
-- binding; once a value is recorded it never changes in place (see the
|
|
190
|
+
-- session-provider-binding.ts switch guard) — a fork or a new session is
|
|
191
|
+
-- how a conversation moves to another upstream provider.
|
|
192
|
+
model_provider_id TEXT,
|
|
179
193
|
-- Permission mode this session last sent a message with (one of the
|
|
180
194
|
-- modes the provider's capabilities declare: default, auto, acceptEdits,
|
|
181
195
|
-- bypassPermissions, plan). Unlike model and effort there is no picker
|
|
@@ -316,7 +330,7 @@ CREATE TABLE IF NOT EXISTS user_voice_settings (
|
|
|
316
330
|
* two rows, which is what lets a future per-project view exist without a
|
|
317
331
|
* migration, while `listTop` sums across them for the one global list the API
|
|
318
332
|
* returns today. `token_lower` is the lookup key and `canonical` keeps the
|
|
319
|
-
* spelling first seen, so `
|
|
333
|
+
* spelling first seen, so `Cloudpit` and `cloudcli` count as one token and the
|
|
320
334
|
* listing still shows a real casing.
|
|
321
335
|
*
|
|
322
336
|
* `first_seen_at` / `last_seen_at` are epoch milliseconds written by the
|
|
@@ -60,6 +60,7 @@ const EXPECTED_SHAPE: Record<string, ColumnShape[]> = {
|
|
|
60
60
|
['jsonl_path', 'TEXT', 0, null, 0],
|
|
61
61
|
['model', 'TEXT', 0, null, 0],
|
|
62
62
|
['effort', 'TEXT', 0, null, 0],
|
|
63
|
+
['model_provider_id', 'TEXT', 0, null, 0],
|
|
63
64
|
['permission_mode', 'TEXT', 0, null, 0],
|
|
64
65
|
['lifecycle_mode', 'TEXT', 0, "'per-run'", 0],
|
|
65
66
|
['forked_from_session_id', 'TEXT', 0, null, 0],
|
|
@@ -130,6 +131,7 @@ const DROPPED_COLUMNS: Record<string, string[]> = {
|
|
|
130
131
|
'jsonl_path',
|
|
131
132
|
'model',
|
|
132
133
|
'effort',
|
|
134
|
+
'model_provider_id',
|
|
133
135
|
'permission_mode',
|
|
134
136
|
'lifecycle_mode',
|
|
135
137
|
],
|
|
@@ -45,7 +45,7 @@ test('disk-discovered sessions are keyed by the provider id for both columns', a
|
|
|
45
45
|
|
|
46
46
|
test('app sessions get the provider id assigned without creating a duplicate row', async () => {
|
|
47
47
|
await withIsolatedDatabase(() => {
|
|
48
|
-
sessionsDb.createAppSession('app-id-1', 'claude', '/workspace/demo', 'Initial
|
|
48
|
+
sessionsDb.createAppSession('app-id-1', 'claude', '/workspace/demo', 'Initial Cloudpit message');
|
|
49
49
|
sessionsDb.assignProviderSessionId('app-id-1', 'provider-xyz');
|
|
50
50
|
|
|
51
51
|
// A later synchronizer pass that discovers the transcript on disk must
|
|
@@ -66,7 +66,7 @@ test('app sessions get the provider id assigned without creating a duplicate row
|
|
|
66
66
|
const row = sessionsDb.getSessionById('app-id-1');
|
|
67
67
|
assert.equal(row?.provider_session_id, 'provider-xyz');
|
|
68
68
|
assert.equal(row?.jsonl_path, '/fake/path/provider-xyz.jsonl');
|
|
69
|
-
assert.equal(row?.custom_name, 'Initial
|
|
69
|
+
assert.equal(row?.custom_name, 'Initial Cloudpit message');
|
|
70
70
|
});
|
|
71
71
|
});
|
|
72
72
|
|
|
@@ -119,8 +119,8 @@ type AnyRecord = Record<string, unknown>;
|
|
|
119
119
|
// --------------------------- fixture identities ---------------------------
|
|
120
120
|
|
|
121
121
|
const USER_ONE = 1;
|
|
122
|
-
const READ_SCOPE = '
|
|
123
|
-
const APPROVE_SCOPE = '
|
|
122
|
+
const READ_SCOPE = 'cloudpit:read';
|
|
123
|
+
const APPROVE_SCOPE = 'cloudpit:approve';
|
|
124
124
|
/** The instant every relative reading is measured against. */
|
|
125
125
|
const NOW = Date.now();
|
|
126
126
|
/** How long a leg waits for the walk to park before it reds. */
|