@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.
Files changed (690) hide show
  1. package/README.md +1 -1
  2. package/dist/api-docs.html +3 -3
  3. package/dist/assets/{abnfDiagram-N423BO3Z-D5yLnMt9.js → abnfDiagram-N423BO3Z-D7Xt05gV.js} +1 -1
  4. package/dist/assets/{abnfDiagram-N423BO3Z-bTHtQIhR.js → abnfDiagram-N423BO3Z-dmPRRPEm.js} +1 -1
  5. package/dist/assets/{arc-1DmrBEyG.js → arc-B7W3R5qH.js} +1 -1
  6. package/dist/assets/{arc-BlGK--01.js → arc-BHMlIcaQ.js} +1 -1
  7. package/dist/assets/{architectureDiagram-T3A2C74G--lzbKBn9.js → architectureDiagram-T3A2C74G-CUUpAoN0.js} +1 -1
  8. package/dist/assets/{architectureDiagram-T3A2C74G-7lKNAbUU.js → architectureDiagram-T3A2C74G-DpXhbHxu.js} +1 -1
  9. package/dist/assets/{blockDiagram-VBNYF7ZC-17cdO9zs.js → blockDiagram-VBNYF7ZC-Bf0yfNxj.js} +1 -1
  10. package/dist/assets/{blockDiagram-VBNYF7ZC-BPavJfDj.js → blockDiagram-VBNYF7ZC-Cki9AOhc.js} +1 -1
  11. package/dist/assets/{c4Diagram-5PPSVZJV-Bm1-2w3b.js → c4Diagram-5PPSVZJV-DK2RqNDO.js} +1 -1
  12. package/dist/assets/{c4Diagram-5PPSVZJV-aHvFL3Wb.js → c4Diagram-5PPSVZJV-DyhTF0e5.js} +1 -1
  13. package/dist/assets/channel-DTLMNzbH.js +1 -0
  14. package/dist/assets/channel-DiqxUuPf.js +1 -0
  15. package/dist/assets/{chunk-2GRJ4B5K-D7WqZewM.js → chunk-2GRJ4B5K-BYtByJbf.js} +1 -1
  16. package/dist/assets/{chunk-2GRJ4B5K-DbwzBiPF.js → chunk-2GRJ4B5K-CksFgocc.js} +1 -1
  17. package/dist/assets/{chunk-2Q5K7J3B-DdCr89uy.js → chunk-2Q5K7J3B-D2kQa5TZ.js} +1 -1
  18. package/dist/assets/{chunk-2Q5K7J3B-TFd0ECKO.js → chunk-2Q5K7J3B-NSSX86FA.js} +1 -1
  19. package/dist/assets/{chunk-5RXB4S5H-BdhRBpEi.js → chunk-5RXB4S5H-DNNYC8_t.js} +1 -1
  20. package/dist/assets/{chunk-5RXB4S5H-D0SQ3nIe.js → chunk-5RXB4S5H-Rx0YaqNI.js} +1 -1
  21. package/dist/assets/{chunk-5VM5RSS4-B9Lv3cWR.js → chunk-5VM5RSS4-B1k4I4CX.js} +1 -1
  22. package/dist/assets/{chunk-5VM5RSS4-DioqTIvB.js → chunk-5VM5RSS4-CsvQj3QC.js} +1 -1
  23. package/dist/assets/{chunk-6Q2QTUOP-09bwlcIv.js → chunk-6Q2QTUOP-48-dEgAs.js} +1 -1
  24. package/dist/assets/{chunk-6Q2QTUOP-JuhPJZZL.js → chunk-6Q2QTUOP-DCMSW5_0.js} +1 -1
  25. package/dist/assets/{chunk-GF5L2VYU-C6f2SgCw.js → chunk-GF5L2VYU-CGyvOsdN.js} +1 -1
  26. package/dist/assets/{chunk-GF5L2VYU-DzD9aOyp.js → chunk-GF5L2VYU-YXe113hp.js} +1 -1
  27. package/dist/assets/{chunk-JWPE2WC7-BggnWNZv.js → chunk-JWPE2WC7-BT7vCW4x.js} +1 -1
  28. package/dist/assets/{chunk-JWPE2WC7-Dte_Ax9K.js → chunk-JWPE2WC7-D2K1Oywq.js} +1 -1
  29. package/dist/assets/{chunk-KBJHAD2P-9TCQV92m.js → chunk-KBJHAD2P-CQZWamtE.js} +1 -1
  30. package/dist/assets/{chunk-KBJHAD2P-DDnJp7kJ.js → chunk-KBJHAD2P-gpEwZrNy.js} +1 -1
  31. package/dist/assets/{chunk-RYQCIY6F-CE2Y4D_h.js → chunk-RYQCIY6F-BI0fMtjY.js} +1 -1
  32. package/dist/assets/{chunk-RYQCIY6F-DsgFSTNw.js → chunk-RYQCIY6F-vguRdb4F.js} +1 -1
  33. package/dist/assets/{chunk-XXDRQBXY-B1FIfsqq.js → chunk-XXDRQBXY-B99qH1_w.js} +1 -1
  34. package/dist/assets/{chunk-XXDRQBXY-B4YfaqTO.js → chunk-XXDRQBXY-DZLJnbBB.js} +1 -1
  35. package/dist/assets/classDiagram-JCYQIIEL-BaV-s6x8.js +1 -0
  36. package/dist/assets/classDiagram-JCYQIIEL-D4M03B4L.js +1 -0
  37. package/dist/assets/classDiagram-v2-OCEON4UE-BaV-s6x8.js +1 -0
  38. package/dist/assets/classDiagram-v2-OCEON4UE-D4M03B4L.js +1 -0
  39. package/dist/assets/{cose-bilkent-JH36ORCC-C1AG5Pib.js → cose-bilkent-JH36ORCC-EsVnz-E6.js} +1 -1
  40. package/dist/assets/{cose-bilkent-JH36ORCC-lMwWDibI.js → cose-bilkent-JH36ORCC-VI2OjCIx.js} +1 -1
  41. package/dist/assets/{cynefin-VYW2F7L2-BlabniRL.js → cynefin-VYW2F7L2-BVYg0ixs.js} +1 -1
  42. package/dist/assets/{cynefin-VYW2F7L2-W-c-z4IW.js → cynefin-VYW2F7L2-BnHmA5I2.js} +1 -1
  43. package/dist/assets/{cynefinDiagram-MW4NZA55-BtTep_pq.js → cynefinDiagram-MW4NZA55-B-OCRLIw.js} +1 -1
  44. package/dist/assets/{cynefinDiagram-MW4NZA55-Due6EIPh.js → cynefinDiagram-MW4NZA55-ItLlzjDR.js} +1 -1
  45. package/dist/assets/{dagre-VZM6K2ZE-CWLaFfdt.js → dagre-VZM6K2ZE-DkVDkAWJ.js} +1 -1
  46. package/dist/assets/{dagre-VZM6K2ZE-DZldvqiQ.js → dagre-VZM6K2ZE-bYR4z8-Z.js} +1 -1
  47. package/dist/assets/{diagram-7IWD3JNH-RnmUHYwN.js → diagram-7IWD3JNH-DjXMue67.js} +1 -1
  48. package/dist/assets/{diagram-7IWD3JNH-Di-7-nSA.js → diagram-7IWD3JNH-FNEXlm5k.js} +1 -1
  49. package/dist/assets/{diagram-B4RE2ZJO-Wybyn8fw.js → diagram-B4RE2ZJO-73NYiO_P.js} +1 -1
  50. package/dist/assets/{diagram-B4RE2ZJO-mrK79C2E.js → diagram-B4RE2ZJO-dB4QHq0D.js} +1 -1
  51. package/dist/assets/{diagram-LBJQPF4R-JY6FqSFu.js → diagram-LBJQPF4R-DyKT610O.js} +1 -1
  52. package/dist/assets/{diagram-LBJQPF4R-sWhu2VLy.js → diagram-LBJQPF4R-rMgmnjvd.js} +1 -1
  53. package/dist/assets/{diagram-Q27KOJAE-BJ4T0WGp.js → diagram-Q27KOJAE-BvsfmmQt.js} +1 -1
  54. package/dist/assets/{diagram-Q27KOJAE-DyGT9KhB.js → diagram-Q27KOJAE-c6DEjLQX.js} +1 -1
  55. package/dist/assets/{diagram-UB23O5K3-oXFJAndB.js → diagram-UB23O5K3-BMo2VXVb.js} +1 -1
  56. package/dist/assets/{diagram-UB23O5K3-tTd8qwEM.js → diagram-UB23O5K3-DRMKefnZ.js} +1 -1
  57. package/dist/assets/{ebnfDiagram-BXEA7PRR-DV67cBe6.js → ebnfDiagram-BXEA7PRR-BrOAekWh.js} +1 -1
  58. package/dist/assets/{ebnfDiagram-BXEA7PRR-OQGm8tPs.js → ebnfDiagram-BXEA7PRR-YmQkylwV.js} +1 -1
  59. package/dist/assets/{elk-BRx4gEGg.js → elk-Hz3WRESK.js} +1 -1
  60. package/dist/assets/{elk-CdAQJ-NA.js → elk-tPSZwRVB.js} +1 -1
  61. package/dist/assets/{erDiagram-JOGREHBK-BhD2xZ2I.js → erDiagram-JOGREHBK-BlaZnoQi.js} +1 -1
  62. package/dist/assets/{erDiagram-JOGREHBK-BqP8DqqW.js → erDiagram-JOGREHBK-CRCfRUXt.js} +1 -1
  63. package/dist/assets/{flowDiagram-UKHOOZJN-B4AjZxPJ.js → flowDiagram-UKHOOZJN-DQ1gbjxo.js} +1 -1
  64. package/dist/assets/{flowDiagram-UKHOOZJN-CP_1WsW4.js → flowDiagram-UKHOOZJN-Dinlbmds.js} +1 -1
  65. package/dist/assets/{ganttDiagram-PKOTCBZU-BMk6nngr.js → ganttDiagram-PKOTCBZU-CMGpcBZO.js} +1 -1
  66. package/dist/assets/{ganttDiagram-PKOTCBZU-B_ce39Ld.js → ganttDiagram-PKOTCBZU-Eh94zuPI.js} +1 -1
  67. package/dist/assets/{gitGraphDiagram-DS77QQ5N-CnZA42iA.js → gitGraphDiagram-DS77QQ5N-Bp8xIZbk.js} +1 -1
  68. package/dist/assets/{gitGraphDiagram-DS77QQ5N-DqEz_iTn.js → gitGraphDiagram-DS77QQ5N-Cu-b4YNw.js} +1 -1
  69. package/dist/assets/index-51e8fagd.css +32 -0
  70. package/dist/assets/{index-D5nLH7qP.js → index-CQE9C6k6.js} +356 -356
  71. package/dist/assets/{index-CqyOGerp.js → index-S8ow0XfK.js} +356 -356
  72. package/dist/assets/{infoDiagram-6WML65LV-BQf7m4X4.js → infoDiagram-6WML65LV-CClEEtTq.js} +1 -1
  73. package/dist/assets/{infoDiagram-6WML65LV-Dntf4YFM.js → infoDiagram-6WML65LV-QmHeojgl.js} +1 -1
  74. package/dist/assets/{ishikawaDiagram-WSZJBQD7-BDjsldAI.js → ishikawaDiagram-WSZJBQD7-BemSj9lN.js} +1 -1
  75. package/dist/assets/{ishikawaDiagram-WSZJBQD7-BqXpJeoL.js → ishikawaDiagram-WSZJBQD7-nw48g1vr.js} +1 -1
  76. package/dist/assets/{journeyDiagram-NVQOT4AX-CBcFzP2M.js → journeyDiagram-NVQOT4AX-DeNtO6OU.js} +1 -1
  77. package/dist/assets/{journeyDiagram-NVQOT4AX-DoWKjgKd.js → journeyDiagram-NVQOT4AX-q1lCfOYn.js} +1 -1
  78. package/dist/assets/{kanban-definition-27J2QSJJ-9bspl7j-.js → kanban-definition-27J2QSJJ-Bzhu6hql.js} +1 -1
  79. package/dist/assets/{kanban-definition-27J2QSJJ-Cjxa-Fbb.js → kanban-definition-27J2QSJJ-VfvD33YG.js} +1 -1
  80. package/dist/assets/{linear-YogAXmU_.js → linear-C0Kwu3Yp.js} +1 -1
  81. package/dist/assets/{linear-lIhI5Y8l.js → linear-CbM_4-fP.js} +1 -1
  82. package/dist/assets/{mermaid.core-2Spxcrg7.js → mermaid.core-G2huIsXn.js} +5 -5
  83. package/dist/assets/{mermaid.core-BxxInCBm.js → mermaid.core-fvTQFUX1.js} +5 -5
  84. package/dist/assets/{mindmap-definition-FAOFIHXS-DblO5EG4.js → mindmap-definition-FAOFIHXS-BONvuyvz.js} +1 -1
  85. package/dist/assets/{mindmap-definition-FAOFIHXS-_nlvJ9VK.js → mindmap-definition-FAOFIHXS-BzYawGKQ.js} +1 -1
  86. package/dist/assets/{pegDiagram-VL7TDLO6-BBJFPAZG.js → pegDiagram-VL7TDLO6-Df2HAKGH.js} +1 -1
  87. package/dist/assets/{pegDiagram-VL7TDLO6-DhRH7YRf.js → pegDiagram-VL7TDLO6-DnMwBHn_.js} +1 -1
  88. package/dist/assets/{pieDiagram-7S7Q4E2Y-4Qy7Nk4U.js → pieDiagram-7S7Q4E2Y-Cd3-a-dM.js} +1 -1
  89. package/dist/assets/{pieDiagram-7S7Q4E2Y-BUtdeYBT.js → pieDiagram-7S7Q4E2Y-LV6TOhOD.js} +1 -1
  90. package/dist/assets/{quadrantDiagram-CIZ2JOQS-BUoIDY1r.js → quadrantDiagram-CIZ2JOQS-8VOnA3FV.js} +1 -1
  91. package/dist/assets/{quadrantDiagram-CIZ2JOQS-D90kdHA1.js → quadrantDiagram-CIZ2JOQS-CnwxFPxh.js} +1 -1
  92. package/dist/assets/{railroadDiagram-AXF67PYL-CJf9--tj.js → railroadDiagram-AXF67PYL-CXBFj3Iu.js} +1 -1
  93. package/dist/assets/{railroadDiagram-AXF67PYL-D3S1oliC.js → railroadDiagram-AXF67PYL-DLoAPcsb.js} +1 -1
  94. package/dist/assets/{requirementDiagram-LRYGKXZP-C04jhjS6.js → requirementDiagram-LRYGKXZP-LrVlZXSz.js} +1 -1
  95. package/dist/assets/{requirementDiagram-LRYGKXZP-cQaGai5h.js → requirementDiagram-LRYGKXZP-pakITowN.js} +1 -1
  96. package/dist/assets/{sankeyDiagram-W5VNT64P-AT4cTVbY.js → sankeyDiagram-W5VNT64P-BIQQ8A1I.js} +1 -1
  97. package/dist/assets/{sankeyDiagram-W5VNT64P-DfFUdqYO.js → sankeyDiagram-W5VNT64P-C6QWOxNM.js} +1 -1
  98. package/dist/assets/{sequenceDiagram-SI44F4Z6-DbjhG030.js → sequenceDiagram-SI44F4Z6-CpHBe2CG.js} +1 -1
  99. package/dist/assets/{sequenceDiagram-SI44F4Z6-DKjdupix.js → sequenceDiagram-SI44F4Z6-cnLxaxcV.js} +1 -1
  100. package/dist/assets/{sizeCapture-X5ZJPWSS-CCcKLP8m.js → sizeCapture-X5ZJPWSS-3g-1onHD.js} +1 -1
  101. package/dist/assets/{sizeCapture-X5ZJPWSS-DGxRWxeo.js → sizeCapture-X5ZJPWSS-4U6b3PSL.js} +1 -1
  102. package/dist/assets/{stateDiagram-OKZ733FA-D7wGCNb7.js → stateDiagram-OKZ733FA-CFwVDdlY.js} +1 -1
  103. package/dist/assets/{stateDiagram-OKZ733FA-qdMAailp.js → stateDiagram-OKZ733FA-CKVGJcM2.js} +1 -1
  104. package/dist/assets/{stateDiagram-v2-UEYNNEHI-BbmmtA9w.js → stateDiagram-v2-UEYNNEHI-Dnbk8ftm.js} +1 -1
  105. package/dist/assets/{stateDiagram-v2-UEYNNEHI-Diz_hFvh.js → stateDiagram-v2-UEYNNEHI-rlA-woxH.js} +1 -1
  106. package/dist/assets/{swimlanes-SLNWSIFB-CZgIPz6I.js → swimlanes-SLNWSIFB-DCwz8-mf.js} +2 -2
  107. package/dist/assets/{swimlanes-SLNWSIFB-B16H-6OU.js → swimlanes-SLNWSIFB-M9Oumwnl.js} +2 -2
  108. package/dist/assets/swimlanesDiagram-ULZ7WXOC-CTtTyW6-.js +8 -0
  109. package/dist/assets/swimlanesDiagram-ULZ7WXOC-Caohx6WZ.js +8 -0
  110. package/dist/assets/{timeline-definition-Z64GVDOM-7r7OVlrT.js → timeline-definition-Z64GVDOM-BVmfjoWH.js} +1 -1
  111. package/dist/assets/{timeline-definition-Z64GVDOM-nhnkS_wy.js → timeline-definition-Z64GVDOM-DyXvto1l.js} +1 -1
  112. package/dist/assets/{vennDiagram-T6HMQDX7-B1piFYrz.js → vennDiagram-T6HMQDX7-CNe6zorb.js} +1 -1
  113. package/dist/assets/{vennDiagram-T6HMQDX7-x8SJTFhK.js → vennDiagram-T6HMQDX7-DyzOWKx3.js} +1 -1
  114. package/dist/assets/{wardleyDiagram-T6FBY63Y-BdD4GExj.js → wardleyDiagram-T6FBY63Y-D5YvMVwa.js} +1 -1
  115. package/dist/assets/{wardleyDiagram-T6FBY63Y-C90xqNVS.js → wardleyDiagram-T6FBY63Y-DXo8BCrA.js} +1 -1
  116. package/dist/assets/{xychartDiagram-ELKLHX3M--Ndoz0Cq.js → xychartDiagram-ELKLHX3M-CIBffVxC.js} +1 -1
  117. package/dist/assets/{xychartDiagram-ELKLHX3M-BAKns-7o.js → xychartDiagram-ELKLHX3M-XlsWelDb.js} +1 -1
  118. package/dist/build-info.json +2 -2
  119. package/dist/convert-icons.md +10 -46
  120. package/dist/favicon.png +0 -0
  121. package/dist/favicon.svg +1 -9
  122. package/dist/generate-icons.js +67 -47
  123. package/dist/icons/icon-128x128.png +0 -0
  124. package/dist/icons/icon-144x144.png +0 -0
  125. package/dist/icons/icon-152x152.png +0 -0
  126. package/dist/icons/icon-192x192.png +0 -0
  127. package/dist/icons/icon-384x384.png +0 -0
  128. package/dist/icons/icon-512x512.png +0 -0
  129. package/dist/icons/icon-72x72.png +0 -0
  130. package/dist/icons/icon-96x96.png +0 -0
  131. package/dist/index.html +2 -2
  132. package/dist/logo-128.png +0 -0
  133. package/dist/logo-256.png +0 -0
  134. package/dist/logo-32.png +0 -0
  135. package/dist/logo-512.png +0 -0
  136. package/dist/logo-64.png +0 -0
  137. package/dist/logo-source.png +0 -0
  138. package/dist/logo.svg +1 -17
  139. package/dist/sw.js +7 -9
  140. package/dist-server/build-info.json +2 -2
  141. package/dist-server/server/load-env.js +12 -4
  142. package/dist-server/server/load-env.js.map +1 -1
  143. package/dist-server/server/modules/browser-use/browser-use.service.js +33 -11
  144. package/dist-server/server/modules/browser-use/browser-use.service.js.map +1 -1
  145. package/dist-server/server/modules/browser-use/index.js +4 -4
  146. package/dist-server/server/modules/browser-use/index.js.map +1 -1
  147. package/dist-server/server/modules/browser-use/mcp-server-names.js +6 -4
  148. package/dist-server/server/modules/browser-use/mcp-server-names.js.map +1 -1
  149. package/dist-server/server/modules/browser-use/tests/browser-use.service.test.js +49 -1
  150. package/dist-server/server/modules/browser-use/tests/browser-use.service.test.js.map +1 -1
  151. package/dist-server/server/modules/cli/asset-migration-files.js +74 -0
  152. package/dist-server/server/modules/cli/asset-migration-files.js.map +1 -0
  153. package/dist-server/server/modules/cli/asset-migration-report.js +80 -0
  154. package/dist-server/server/modules/cli/asset-migration-report.js.map +1 -0
  155. package/dist-server/server/modules/cli/asset-migration-store.js +153 -0
  156. package/dist-server/server/modules/cli/asset-migration-store.js.map +1 -0
  157. package/dist-server/server/modules/cli/asset-migration.service.js +161 -0
  158. package/dist-server/server/modules/cli/asset-migration.service.js.map +1 -0
  159. package/dist-server/server/modules/cli/browser-use-mcp.js +9 -4
  160. package/dist-server/server/modules/cli/browser-use-mcp.js.map +1 -1
  161. package/dist-server/server/modules/cli/cli.module.js +21 -1
  162. package/dist-server/server/modules/cli/cli.module.js.map +1 -1
  163. package/dist-server/server/modules/cli/cli.service.js +6 -1
  164. package/dist-server/server/modules/cli/cli.service.js.map +1 -1
  165. package/dist-server/server/modules/cli/tests/asset-migration.service.test.js +275 -0
  166. package/dist-server/server/modules/cli/tests/asset-migration.service.test.js.map +1 -0
  167. package/dist-server/server/modules/cli/tests/browser-use-mcp-entry.test.js +157 -0
  168. package/dist-server/server/modules/cli/tests/browser-use-mcp-entry.test.js.map +1 -1
  169. package/dist-server/server/modules/cli/tests/cli-environment-bootstrap.test.js +1 -0
  170. package/dist-server/server/modules/cli/tests/cli-environment-bootstrap.test.js.map +1 -1
  171. package/dist-server/server/modules/cli/tests/cli.service.test.js +6 -1
  172. package/dist-server/server/modules/cli/tests/cli.service.test.js.map +1 -1
  173. package/dist-server/server/modules/cockpit/cockpit-brief-prompt.js +1 -1
  174. package/dist-server/server/modules/cockpit/cockpit-card-actions.js +19 -3
  175. package/dist-server/server/modules/cockpit/cockpit-card-actions.js.map +1 -1
  176. package/dist-server/server/modules/cockpit/cockpit-card-feedback-store.js +94 -9
  177. package/dist-server/server/modules/cockpit/cockpit-card-feedback-store.js.map +1 -1
  178. package/dist-server/server/modules/cockpit/cockpit-card-registry.js +1 -1
  179. package/dist-server/server/modules/cockpit/cockpit-fleet-card-projection.js +3 -0
  180. package/dist-server/server/modules/cockpit/cockpit-fleet-card-projection.js.map +1 -1
  181. package/dist-server/server/modules/cockpit/cockpit-knowledge-reading.js +16 -0
  182. package/dist-server/server/modules/cockpit/cockpit-knowledge-reading.js.map +1 -1
  183. package/dist-server/server/modules/cockpit/cockpit.module.js +1 -1
  184. package/dist-server/server/modules/cockpit/tests/cockpit-card-feedback.test.js +96 -1
  185. package/dist-server/server/modules/cockpit/tests/cockpit-card-feedback.test.js.map +1 -1
  186. package/dist-server/server/modules/cockpit/tests/cockpit-fleet-card-provider.test.js +2 -2
  187. package/dist-server/server/modules/cockpit/tests/cockpit-knowledge-decision-handoff.test.js +169 -3
  188. package/dist-server/server/modules/cockpit/tests/cockpit-knowledge-decision-handoff.test.js.map +1 -1
  189. package/dist-server/server/modules/context-events/context-event-writer.js +5 -5
  190. package/dist-server/server/modules/context-events/context-events.module.js +2 -2
  191. package/dist-server/server/modules/context-events/session-ask-stream-reader.js +1 -1
  192. package/dist-server/server/modules/context-events/session-blocked-events.js +3 -3
  193. package/dist-server/server/modules/context-events/tests/session-ask-event-writer.test.js +1 -1
  194. package/dist-server/server/modules/context-events/tests/session-blocked-events.test.js +3 -3
  195. package/dist-server/server/modules/context-events/tests/session-run-events.test.js +1 -1
  196. package/dist-server/server/modules/database/migrations.js +23 -1
  197. package/dist-server/server/modules/database/migrations.js.map +1 -1
  198. package/dist-server/server/modules/database/repositories/sessions.db.js +25 -4
  199. package/dist-server/server/modules/database/repositories/sessions.db.js.map +1 -1
  200. package/dist-server/server/modules/database/repositories/voice-user-identifiers.db.js +1 -1
  201. package/dist-server/server/modules/database/schema.js +16 -2
  202. package/dist-server/server/modules/database/schema.js.map +1 -1
  203. package/dist-server/server/modules/database/tests/migrations-ensure-columns.test.js +2 -0
  204. package/dist-server/server/modules/database/tests/migrations-ensure-columns.test.js.map +1 -1
  205. package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js +2 -2
  206. package/dist-server/server/modules/debug-agent/tests/debug-agent-permission-popup.test.js +2 -2
  207. package/dist-server/server/modules/liaison/liaison-deliver.service.js +3 -3
  208. package/dist-server/server/modules/liaison/liaison.module.js +1 -1
  209. package/dist-server/server/modules/mcp-gateway/mcp-gateway.auth.js +3 -2
  210. package/dist-server/server/modules/mcp-gateway/mcp-gateway.auth.js.map +1 -1
  211. package/dist-server/server/modules/mcp-gateway/mcp-self-target.js +2 -2
  212. package/dist-server/server/modules/mcp-gateway/mcp-session-send.js +7 -0
  213. package/dist-server/server/modules/mcp-gateway/mcp-session-send.js.map +1 -1
  214. package/dist-server/server/modules/mcp-gateway/mcp-tool-annotations.js +4 -4
  215. package/dist-server/server/modules/mcp-gateway/oauth-metadata.gate.js +4 -2
  216. package/dist-server/server/modules/mcp-gateway/oauth-metadata.gate.js.map +1 -1
  217. package/dist-server/server/modules/mcp-gateway/tests/knowledge-effective-config-proof.test.js +1 -1
  218. package/dist-server/server/modules/mcp-gateway/tests/knowledge-peer-correlation-proof.test.js +2 -2
  219. package/dist-server/server/modules/mcp-gateway/tests/mcp-approvals.test.js +3 -2
  220. package/dist-server/server/modules/mcp-gateway/tests/mcp-approvals.test.js.map +1 -1
  221. package/dist-server/server/modules/mcp-gateway/tests/mcp-audit-route.test.js +1 -1
  222. package/dist-server/server/modules/mcp-gateway/tests/mcp-audit.test.js +4 -4
  223. package/dist-server/server/modules/mcp-gateway/tests/mcp-auth.test.js +3 -1
  224. package/dist-server/server/modules/mcp-gateway/tests/mcp-auth.test.js.map +1 -1
  225. package/dist-server/server/modules/mcp-gateway/tests/mcp-cancel-queued.test.js +3 -2
  226. package/dist-server/server/modules/mcp-gateway/tests/mcp-cancel-queued.test.js.map +1 -1
  227. package/dist-server/server/modules/mcp-gateway/tests/mcp-cockpit-tools.test.js +7 -3
  228. package/dist-server/server/modules/mcp-gateway/tests/mcp-cockpit-tools.test.js.map +1 -1
  229. package/dist-server/server/modules/mcp-gateway/tests/mcp-correlation-id.test.js +8 -8
  230. package/dist-server/server/modules/mcp-gateway/tests/mcp-draft.test.js +3 -2
  231. package/dist-server/server/modules/mcp-gateway/tests/mcp-draft.test.js.map +1 -1
  232. package/dist-server/server/modules/mcp-gateway/tests/mcp-english-only.test.js +1 -1
  233. package/dist-server/server/modules/mcp-gateway/tests/mcp-gateway-wiring.test.js +2 -2
  234. package/dist-server/server/modules/mcp-gateway/tests/mcp-insufficient-scope.test.js +1 -1
  235. package/dist-server/server/modules/mcp-gateway/tests/mcp-insufficient-scope.test.js.map +1 -1
  236. package/dist-server/server/modules/mcp-gateway/tests/mcp-knowledge-facts.test.js +1 -1
  237. package/dist-server/server/modules/mcp-gateway/tests/mcp-not-found-semantics.test.js +1 -1
  238. package/dist-server/server/modules/mcp-gateway/tests/mcp-not-found-semantics.test.js.map +1 -1
  239. package/dist-server/server/modules/mcp-gateway/tests/mcp-oauth-challenge.test.js +3 -2
  240. package/dist-server/server/modules/mcp-gateway/tests/mcp-oauth-challenge.test.js.map +1 -1
  241. package/dist-server/server/modules/mcp-gateway/tests/mcp-overview.test.js +2 -2
  242. package/dist-server/server/modules/mcp-gateway/tests/mcp-pending-interaction.test.js +2 -2
  243. package/dist-server/server/modules/mcp-gateway/tests/mcp-read-tools.test.js +3 -3
  244. package/dist-server/server/modules/mcp-gateway/tests/mcp-read-tools.test.js.map +1 -1
  245. package/dist-server/server/modules/mcp-gateway/tests/mcp-run-get.test.js +1 -1
  246. package/dist-server/server/modules/mcp-gateway/tests/mcp-self-target.test.js +1 -1
  247. package/dist-server/server/modules/mcp-gateway/tests/mcp-self-target.test.js.map +1 -1
  248. package/dist-server/server/modules/mcp-gateway/tests/mcp-session-background.test.js +2 -2
  249. package/dist-server/server/modules/mcp-gateway/tests/mcp-session-background.test.js.map +1 -1
  250. package/dist-server/server/modules/mcp-gateway/tests/mcp-session-host-control.test.js +1 -1
  251. package/dist-server/server/modules/mcp-gateway/tests/mcp-session-host-control.test.js.map +1 -1
  252. package/dist-server/server/modules/mcp-gateway/tests/mcp-session-lifecycle.test.js +1 -1
  253. package/dist-server/server/modules/mcp-gateway/tests/mcp-session-lifecycle.test.js.map +1 -1
  254. package/dist-server/server/modules/mcp-gateway/tests/mcp-session-reconfigure.test.js +2 -2
  255. package/dist-server/server/modules/mcp-gateway/tests/mcp-session-reconfigure.test.js.map +1 -1
  256. package/dist-server/server/modules/mcp-gateway/tests/mcp-session-search-pruning.test.js +1 -1
  257. package/dist-server/server/modules/mcp-gateway/tests/mcp-session-search.test.js +1 -1
  258. package/dist-server/server/modules/mcp-gateway/tests/mcp-session-send.test.js +2 -2
  259. package/dist-server/server/modules/mcp-gateway/tests/mcp-session-send.test.js.map +1 -1
  260. package/dist-server/server/modules/mcp-gateway/tests/mcp-ui-last-opened.test.js +1 -1
  261. package/dist-server/server/modules/mcp-gateway/tests/mcp-usage-stats.test.js +1 -1
  262. package/dist-server/server/modules/mcp-gateway/tests/mcp-usage-stats.test.js.map +1 -1
  263. package/dist-server/server/modules/mcp-gateway/tests/mcp-write-notification.test.js +2 -2
  264. package/dist-server/server/modules/mcp-gateway/tests/mcp-write-notification.test.js.map +1 -1
  265. package/dist-server/server/modules/mcp-gateway/tests/oauth-flow.e2e.test.js +3 -3
  266. package/dist-server/server/modules/notifications/services/notification-orchestrator.service.js +1 -1
  267. package/dist-server/server/modules/oauth/access-tokens.service.js +8 -8
  268. package/dist-server/server/modules/oauth/oauth-consent.service.js +20 -15
  269. package/dist-server/server/modules/oauth/oauth-consent.service.js.map +1 -1
  270. package/dist-server/server/modules/oauth/tests/access-token-scopes.test.js +54 -34
  271. package/dist-server/server/modules/oauth/tests/access-token-scopes.test.js.map +1 -1
  272. package/dist-server/server/modules/oauth/tests/access-tokens.service.test.js +35 -14
  273. package/dist-server/server/modules/oauth/tests/access-tokens.service.test.js.map +1 -1
  274. package/dist-server/server/modules/oauth/tests/oauth-consent-page.test.js +27 -22
  275. package/dist-server/server/modules/oauth/tests/oauth-consent-page.test.js.map +1 -1
  276. package/dist-server/server/modules/oauth/tests/oauth-consent-ratelimit.test.js +2 -2
  277. package/dist-server/server/modules/oauth/tests/token-info.routes.test.js +2 -2
  278. package/dist-server/server/modules/oauth/tests/token-info.routes.test.js.map +1 -1
  279. package/dist-server/server/modules/observation/blind-spots.js +1 -1
  280. package/dist-server/server/modules/observation/observation-store.js +50 -17
  281. package/dist-server/server/modules/observation/observation-store.js.map +1 -1
  282. package/dist-server/server/modules/observation/observation-uri.js +31 -19
  283. package/dist-server/server/modules/observation/observation-uri.js.map +1 -1
  284. package/dist-server/server/modules/observation/observation.routes.js +1 -1
  285. package/dist-server/server/modules/observation/project-truth.js +1 -1
  286. package/dist-server/server/modules/observation/session-ask-decision-answer.js +2 -1
  287. package/dist-server/server/modules/observation/session-ask-decision-answer.js.map +1 -1
  288. package/dist-server/server/modules/observation/session-digest-llm.js +7 -1
  289. package/dist-server/server/modules/observation/session-digest-llm.js.map +1 -1
  290. package/dist-server/server/modules/observation/session-digest.js +39 -5
  291. package/dist-server/server/modules/observation/session-digest.js.map +1 -1
  292. package/dist-server/server/modules/observation/tests/architecture-delta.test.js +1 -1
  293. package/dist-server/server/modules/observation/tests/observation-routes.test.js +9 -0
  294. package/dist-server/server/modules/observation/tests/observation-routes.test.js.map +1 -1
  295. package/dist-server/server/modules/observation/tests/observation-store.test.js +38 -0
  296. package/dist-server/server/modules/observation/tests/observation-store.test.js.map +1 -1
  297. package/dist-server/server/modules/observation/tests/project-truth.test.js +2 -2
  298. package/dist-server/server/modules/observation/tests/session-ask-decision-digest.test.js +150 -0
  299. package/dist-server/server/modules/observation/tests/session-ask-decision-digest.test.js.map +1 -1
  300. package/dist-server/server/modules/observation/tests/session-digest.test.js +24 -1
  301. package/dist-server/server/modules/observation/tests/session-digest.test.js.map +1 -1
  302. package/dist-server/server/modules/providers/index.js +9 -0
  303. package/dist-server/server/modules/providers/index.js.map +1 -1
  304. package/dist-server/server/modules/providers/list/claude/claude-host-driver.provider.js +1 -1
  305. package/dist-server/server/modules/providers/list/codex/codex-app-server.client.js +22 -3
  306. package/dist-server/server/modules/providers/list/codex/codex-app-server.client.js.map +1 -1
  307. package/dist-server/server/modules/providers/list/codex/codex-app-server.connection.js +1 -1
  308. package/dist-server/server/modules/providers/list/codex/codex-host-driver.contract.js +11 -9
  309. package/dist-server/server/modules/providers/list/codex/codex-host-driver.contract.js.map +1 -1
  310. package/dist-server/server/modules/providers/list/codex/codex-host-driver.provider.js +15 -1
  311. package/dist-server/server/modules/providers/list/codex/codex-host-driver.provider.js.map +1 -1
  312. package/dist-server/server/modules/providers/list/codex/codex-models.provider.js +14 -3
  313. package/dist-server/server/modules/providers/list/codex/codex-models.provider.js.map +1 -1
  314. package/dist-server/server/modules/providers/list/codex/codex-provider-injection.js +248 -0
  315. package/dist-server/server/modules/providers/list/codex/codex-provider-injection.js.map +1 -0
  316. package/dist-server/server/modules/providers/list/codex/codex-resident-provider-launch.js +37 -0
  317. package/dist-server/server/modules/providers/list/codex/codex-resident-provider-launch.js.map +1 -0
  318. package/dist-server/server/modules/providers/list/codex/codex-runtime.provider.js +19 -1
  319. package/dist-server/server/modules/providers/list/codex/codex-runtime.provider.js.map +1 -1
  320. package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js +1 -1
  321. package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js +1 -1
  322. package/dist-server/server/modules/providers/provider.routes.js +23 -2
  323. package/dist-server/server/modules/providers/provider.routes.js.map +1 -1
  324. package/dist-server/server/modules/providers/services/provider-models.service.js +136 -106
  325. package/dist-server/server/modules/providers/services/provider-models.service.js.map +1 -1
  326. package/dist-server/server/modules/providers/services/provider-runtime.service.js +3 -0
  327. package/dist-server/server/modules/providers/services/provider-runtime.service.js.map +1 -1
  328. package/dist-server/server/modules/providers/services/session-model-resolver.js +106 -0
  329. package/dist-server/server/modules/providers/services/session-model-resolver.js.map +1 -0
  330. package/dist-server/server/modules/providers/services/session-provider-binding.js +89 -0
  331. package/dist-server/server/modules/providers/services/session-provider-binding.js.map +1 -0
  332. package/dist-server/server/modules/providers/services/sessions.service.js +5 -1
  333. package/dist-server/server/modules/providers/services/sessions.service.js.map +1 -1
  334. package/dist-server/server/modules/providers/tests/claude-resident-addressable.test.js +2 -2
  335. package/dist-server/server/modules/providers/tests/claude-session-name-authority.test.js +4 -4
  336. package/dist-server/server/modules/providers/tests/codex-app-server-protocol.test.js +1 -1
  337. package/dist-server/server/modules/providers/tests/codex-host-driver-persistent.test.js +2 -2
  338. package/dist-server/server/modules/providers/tests/codex-provider-model-binding.test.js +270 -0
  339. package/dist-server/server/modules/providers/tests/codex-provider-model-binding.test.js.map +1 -0
  340. package/dist-server/server/modules/providers/tests/codex-resident-provider-injection.test.js +484 -0
  341. package/dist-server/server/modules/providers/tests/codex-resident-provider-injection.test.js.map +1 -0
  342. package/dist-server/server/modules/providers/tests/codex-runtime-provider-injection.test.js +228 -0
  343. package/dist-server/server/modules/providers/tests/codex-runtime-provider-injection.test.js.map +1 -0
  344. package/dist-server/server/modules/providers/tests/codex-session-provider-binding.test.js +306 -0
  345. package/dist-server/server/modules/providers/tests/codex-session-provider-binding.test.js.map +1 -0
  346. package/dist-server/server/modules/providers/tests/codex-sessions.test.js +1 -1
  347. package/dist-server/server/modules/providers/tests/opencode-sessions.test.js +2 -2
  348. package/dist-server/server/modules/providers/tests/provider-models.service.test.js +15 -0
  349. package/dist-server/server/modules/providers/tests/provider-models.service.test.js.map +1 -1
  350. package/dist-server/server/modules/providers/tests/provider.routes.test.js +1 -1
  351. package/dist-server/server/modules/quay/index.js +1 -1
  352. package/dist-server/server/modules/quay/quay-fleet-cli.js +1 -1
  353. package/dist-server/server/modules/quay/quay-fleet-locator.js +2 -2
  354. package/dist-server/server/modules/quay/quay-fleet-project-id.js +7 -7
  355. package/dist-server/server/modules/quay/quay-fleet-registry.js +3 -3
  356. package/dist-server/server/modules/quay/quay-suite-fanin-reader.js +1 -1
  357. package/dist-server/server/modules/quay/quay-uri-resolve.js +6 -6
  358. package/dist-server/server/modules/quay/quay.module.js +3 -3
  359. package/dist-server/server/modules/quay/quay.routes.js +1 -1
  360. package/dist-server/server/modules/quay/quay.service.js +4 -4
  361. package/dist-server/server/modules/quay/tests/contracts/fleet-cli-contracts.test.js +3 -3
  362. package/dist-server/server/modules/quay/tests/contracts/shapes.js +9 -9
  363. package/dist-server/server/modules/quay/tests/quay-fleet-locator.test.js +1 -1
  364. package/dist-server/server/modules/quay/tests/quay-fleet-project-id.test.js +4 -4
  365. package/dist-server/server/modules/quay/tests/quay-uri-resolve.test.js +10 -10
  366. package/dist-server/server/modules/session-hosts/tests/resident-server-restart.test.js +1 -1
  367. package/dist-server/server/modules/settings/codex-mcp-gateway.settings.js +1 -1
  368. package/dist-server/server/modules/settings/codex-model-providers.schema.js +349 -0
  369. package/dist-server/server/modules/settings/codex-model-providers.schema.js.map +1 -0
  370. package/dist-server/server/modules/settings/codex-model-providers.service.js +199 -0
  371. package/dist-server/server/modules/settings/codex-model-providers.service.js.map +1 -0
  372. package/dist-server/server/modules/settings/codex-model-providers.settings.js +547 -0
  373. package/dist-server/server/modules/settings/codex-model-providers.settings.js.map +1 -0
  374. package/dist-server/server/modules/settings/codex-model-providers.store.js +200 -0
  375. package/dist-server/server/modules/settings/codex-model-providers.store.js.map +1 -0
  376. package/dist-server/server/modules/settings/index.js +10 -0
  377. package/dist-server/server/modules/settings/index.js.map +1 -1
  378. package/dist-server/server/modules/settings/server-settings-file.js +28 -32
  379. package/dist-server/server/modules/settings/server-settings-file.js.map +1 -1
  380. package/dist-server/server/modules/settings/server-settings.js +2 -2
  381. package/dist-server/server/modules/settings/server-settings.js.map +1 -1
  382. package/dist-server/server/modules/settings/settings.module.js +35 -0
  383. package/dist-server/server/modules/settings/settings.module.js.map +1 -1
  384. package/dist-server/server/modules/settings/settings.routes.js +42 -0
  385. package/dist-server/server/modules/settings/settings.routes.js.map +1 -1
  386. package/dist-server/server/modules/settings/settings.service.js +8 -21
  387. package/dist-server/server/modules/settings/settings.service.js.map +1 -1
  388. package/dist-server/server/modules/settings/tests/cockpit-session-start-settings.routes.test.js +1 -0
  389. package/dist-server/server/modules/settings/tests/cockpit-session-start-settings.routes.test.js.map +1 -1
  390. package/dist-server/server/modules/settings/tests/codex-model-providers-settings.test.js +336 -0
  391. package/dist-server/server/modules/settings/tests/codex-model-providers-settings.test.js.map +1 -0
  392. package/dist-server/server/modules/settings/tests/codex-provider-advanced.test.js +466 -0
  393. package/dist-server/server/modules/settings/tests/codex-provider-advanced.test.js.map +1 -0
  394. package/dist-server/server/modules/settings/tests/codex-provider-import.test.js +475 -0
  395. package/dist-server/server/modules/settings/tests/codex-provider-import.test.js.map +1 -0
  396. package/dist-server/server/modules/voice/tests/voice-lexicon.test.js +9 -9
  397. package/dist-server/server/modules/voice/tests/voice-lexicon.test.js.map +1 -1
  398. package/dist-server/server/modules/voice/voice-lexicon.js +1 -1
  399. package/dist-server/server/modules/websocket/services/chat-control.service.js +21 -1
  400. package/dist-server/server/modules/websocket/services/chat-control.service.js.map +1 -1
  401. package/dist-server/server/modules/websocket/services/chat-websocket.service.js +25 -1
  402. package/dist-server/server/modules/websocket/services/chat-websocket.service.js.map +1 -1
  403. package/dist-server/server/modules/websocket/tests/chat-background-task.test.js +18 -1
  404. package/dist-server/server/modules/websocket/tests/chat-background-task.test.js.map +1 -1
  405. package/dist-server/server/modules/websocket/tests/chat-stop-task.test.js +18 -1
  406. package/dist-server/server/modules/websocket/tests/chat-stop-task.test.js.map +1 -1
  407. package/dist-server/server/modules/worktrees/services/worktree-list.service.js +1 -1
  408. package/dist-server/server/modules/worktrees/services/worktree-open.service.js +1 -1
  409. package/dist-server/server/modules/worktrees/services/worktree-remove.service.js +1 -1
  410. package/dist-server/server/shared/brand.js +18 -20
  411. package/dist-server/server/shared/brand.js.map +1 -1
  412. package/dist-server/server/shared/data-root-migration.js +3 -2
  413. package/dist-server/server/shared/data-root-migration.js.map +1 -1
  414. package/dist-server/server/shared/data-root.js +54 -59
  415. package/dist-server/server/shared/data-root.js.map +1 -1
  416. package/dist-server/server/shared/mcp-contract/types.js +20 -15
  417. package/dist-server/server/shared/mcp-contract/types.js.map +1 -1
  418. package/dist-server/server/shared/ports/codex-provider-registry.port.js +66 -0
  419. package/dist-server/server/shared/ports/codex-provider-registry.port.js.map +1 -0
  420. package/dist-server/server/shared/settings-file.js +120 -6
  421. package/dist-server/server/shared/settings-file.js.map +1 -1
  422. package/dist-server/server/shared/tests/cloudpit-brand-env.test.js +76 -34
  423. package/dist-server/server/shared/tests/cloudpit-brand-env.test.js.map +1 -1
  424. package/dist-server/server/shared/tests/cloudpit-data-root.test.js +35 -18
  425. package/dist-server/server/shared/tests/cloudpit-data-root.test.js.map +1 -1
  426. package/dist-server/server/shared/tests/cloudpit-goal-exit-gate.test.js +153 -17
  427. package/dist-server/server/shared/tests/cloudpit-goal-exit-gate.test.js.map +1 -1
  428. package/dist-server/server/shared/tests/cloudpit-runtime-flip.test.js +116 -114
  429. package/dist-server/server/shared/tests/cloudpit-runtime-flip.test.js.map +1 -1
  430. package/dist-server/server/shared/tests/frontend-import-cycle-budget.test.js +9 -1
  431. package/dist-server/server/shared/tests/frontend-import-cycle-budget.test.js.map +1 -1
  432. package/dist-server/server/shared/tests/quay-test-script.test.js +40 -6
  433. package/dist-server/server/shared/tests/quay-test-script.test.js.map +1 -1
  434. package/dist-server/server/shared/tests/settings-file.test.js +58 -2
  435. package/dist-server/server/shared/tests/settings-file.test.js.map +1 -1
  436. package/dist-server/server/shared/types.js.map +1 -1
  437. package/dist-server/server/shared/utils.js +1 -1
  438. package/electron/appIdMigration.js +467 -0
  439. package/electron/assets/logo-macos.icns +0 -0
  440. package/electron/assets/logo-macos.png +0 -0
  441. package/electron/assets/logo-windows.ico +0 -0
  442. package/electron/brandEnv.js +64 -0
  443. package/electron/cloud.js +3 -3
  444. package/electron/desktopNotifications.js +1 -1
  445. package/electron/launcher/index.html +1 -1
  446. package/electron/localServer.js +41 -7
  447. package/electron/main.js +33 -15
  448. package/electron/scripts/generate-macos-icon.js +34 -28
  449. package/electron/scripts/generate-windows-icon.js +66 -0
  450. package/electron/serverInstaller.js +20 -11
  451. package/electron/tests/cloudpit-appid-migration.test.mjs +514 -0
  452. package/electron/tests/cloudpit-brand-env-wiring.test.mjs +324 -0
  453. package/electron/tests/cloudpit-desktop-identity.test.mjs +42 -19
  454. package/electron/tests/cloudpit-runtime-identity-surfaces.test.mjs +10 -4
  455. package/electron/tests/cloudpit-userdata-migration.test.mjs +18 -5
  456. package/electron/userDataMigration.js +3 -0
  457. package/package.json +7 -6
  458. package/public/api-docs.html +3 -3
  459. package/scripts/brand-allowlist-check.mjs +233 -12
  460. package/scripts/brand-allowlist-check.test.mjs +270 -1
  461. package/scripts/cloudpit-distribution-check.mjs +57 -23
  462. package/scripts/cloudpit-distribution-check.test.mjs +42 -9
  463. package/scripts/codex-protocol-smoke.mjs +1 -1
  464. package/scripts/isolated-instance.sh +1 -1
  465. package/scripts/mcp-smoke.mjs +2 -2
  466. package/scripts/release/tests/fork-release-workflows.test.mjs +45 -0
  467. package/scripts/release/tests/server-installer-bundle-url.test.mjs +57 -9
  468. package/scripts/restart-when-idle.sh +1 -1
  469. package/scripts/shadow-prediction-report.mjs +1 -1
  470. package/scripts/suite-duration-baseline.tsv +45 -0
  471. package/scripts/ui-scenario.mjs +195 -0
  472. package/scripts/ui-scenarios/codex-provider-import.json +63 -0
  473. package/scripts/ui-scenarios/codex-provider-settings.json +77 -0
  474. package/scripts/voice-capture-process-check.false-forms.test.mjs +1 -1
  475. package/scripts/voice-phase0-report.test.mjs +1 -1
  476. package/server/load-env.ts +15 -4
  477. package/server/modules/browser-use/browser-use.service.ts +45 -14
  478. package/server/modules/browser-use/index.ts +3 -4
  479. package/server/modules/browser-use/mcp-server-names.ts +6 -5
  480. package/server/modules/browser-use/tests/browser-use.service.test.ts +63 -1
  481. package/server/modules/cli/asset-migration-files.ts +96 -0
  482. package/server/modules/cli/asset-migration-report.ts +123 -0
  483. package/server/modules/cli/asset-migration-store.ts +228 -0
  484. package/server/modules/cli/asset-migration.service.ts +236 -0
  485. package/server/modules/cli/browser-use-mcp.ts +9 -4
  486. package/server/modules/cli/cli.module.ts +21 -1
  487. package/server/modules/cli/cli.service.ts +14 -1
  488. package/server/modules/cli/tests/asset-migration.service.test.ts +349 -0
  489. package/server/modules/cli/tests/browser-use-mcp-entry.test.ts +202 -0
  490. package/server/modules/cli/tests/cli-environment-bootstrap.test.ts +1 -0
  491. package/server/modules/cli/tests/cli.service.test.ts +6 -1
  492. package/server/modules/cockpit/cockpit-brief-prompt.ts +1 -1
  493. package/server/modules/cockpit/cockpit-card-actions.ts +20 -3
  494. package/server/modules/cockpit/cockpit-card-feedback-store.ts +104 -9
  495. package/server/modules/cockpit/cockpit-card-registry.ts +2 -2
  496. package/server/modules/cockpit/cockpit-fleet-card-projection.ts +3 -0
  497. package/server/modules/cockpit/cockpit-fleet-executor.ts +1 -1
  498. package/server/modules/cockpit/cockpit-knowledge-reading.ts +17 -0
  499. package/server/modules/cockpit/cockpit.module.ts +2 -2
  500. package/server/modules/cockpit/cockpit.reducer.ts +1 -1
  501. package/server/modules/cockpit/tests/cockpit-card-feedback.test.ts +116 -1
  502. package/server/modules/cockpit/tests/cockpit-fleet-card-provider.test.ts +2 -2
  503. package/server/modules/cockpit/tests/cockpit-knowledge-decision-handoff.test.ts +205 -3
  504. package/server/modules/context-events/context-event-writer.ts +6 -6
  505. package/server/modules/context-events/context-events.module.ts +2 -2
  506. package/server/modules/context-events/session-ask-stream-reader.ts +1 -1
  507. package/server/modules/context-events/session-blocked-events.ts +3 -3
  508. package/server/modules/context-events/tests/session-ask-event-writer.test.ts +1 -1
  509. package/server/modules/context-events/tests/session-blocked-events.test.ts +3 -3
  510. package/server/modules/context-events/tests/session-run-events.test.ts +1 -1
  511. package/server/modules/database/migrations.ts +24 -1
  512. package/server/modules/database/repositories/sessions.db.ts +41 -4
  513. package/server/modules/database/repositories/voice-user-identifiers.db.ts +1 -1
  514. package/server/modules/database/schema.ts +16 -2
  515. package/server/modules/database/tests/migrations-ensure-columns.test.ts +2 -0
  516. package/server/modules/database/tests/sessions-provider-mapping.test.ts +2 -2
  517. package/server/modules/debug-agent/tests/debug-agent-permission-popup.test.ts +2 -2
  518. package/server/modules/liaison/liaison-deliver.service.ts +4 -4
  519. package/server/modules/liaison/liaison.module.ts +1 -1
  520. package/server/modules/mcp-gateway/mcp-gateway.auth.ts +3 -2
  521. package/server/modules/mcp-gateway/mcp-self-target.ts +2 -2
  522. package/server/modules/mcp-gateway/mcp-session-send.ts +21 -2
  523. package/server/modules/mcp-gateway/mcp-tool-annotations.ts +4 -4
  524. package/server/modules/mcp-gateway/oauth-metadata.gate.ts +4 -5
  525. package/server/modules/mcp-gateway/tests/knowledge-effective-config-proof.test.ts +1 -1
  526. package/server/modules/mcp-gateway/tests/knowledge-peer-correlation-proof.test.ts +2 -2
  527. package/server/modules/mcp-gateway/tests/mcp-approvals.test.ts +3 -2
  528. package/server/modules/mcp-gateway/tests/mcp-audit-route.test.ts +1 -1
  529. package/server/modules/mcp-gateway/tests/mcp-audit.test.ts +4 -4
  530. package/server/modules/mcp-gateway/tests/mcp-auth.test.ts +3 -1
  531. package/server/modules/mcp-gateway/tests/mcp-cancel-queued.test.ts +3 -2
  532. package/server/modules/mcp-gateway/tests/mcp-cockpit-tools.test.ts +7 -3
  533. package/server/modules/mcp-gateway/tests/mcp-correlation-id.test.ts +8 -8
  534. package/server/modules/mcp-gateway/tests/mcp-draft.test.ts +3 -2
  535. package/server/modules/mcp-gateway/tests/mcp-english-only.test.ts +1 -1
  536. package/server/modules/mcp-gateway/tests/mcp-gateway-wiring.test.ts +2 -2
  537. package/server/modules/mcp-gateway/tests/mcp-insufficient-scope.test.ts +1 -1
  538. package/server/modules/mcp-gateway/tests/mcp-knowledge-facts.test.ts +1 -1
  539. package/server/modules/mcp-gateway/tests/mcp-not-found-semantics.test.ts +1 -1
  540. package/server/modules/mcp-gateway/tests/mcp-oauth-challenge.test.ts +3 -2
  541. package/server/modules/mcp-gateway/tests/mcp-overview.test.ts +2 -2
  542. package/server/modules/mcp-gateway/tests/mcp-pending-interaction.test.ts +2 -2
  543. package/server/modules/mcp-gateway/tests/mcp-read-tools.test.ts +3 -3
  544. package/server/modules/mcp-gateway/tests/mcp-run-get.test.ts +1 -1
  545. package/server/modules/mcp-gateway/tests/mcp-self-target.test.ts +1 -1
  546. package/server/modules/mcp-gateway/tests/mcp-session-background.test.ts +2 -2
  547. package/server/modules/mcp-gateway/tests/mcp-session-host-control.test.ts +1 -1
  548. package/server/modules/mcp-gateway/tests/mcp-session-lifecycle.test.ts +1 -1
  549. package/server/modules/mcp-gateway/tests/mcp-session-reconfigure.test.ts +2 -2
  550. package/server/modules/mcp-gateway/tests/mcp-session-search-pruning.test.ts +1 -1
  551. package/server/modules/mcp-gateway/tests/mcp-session-search.test.ts +1 -1
  552. package/server/modules/mcp-gateway/tests/mcp-session-send.test.ts +2 -2
  553. package/server/modules/mcp-gateway/tests/mcp-ui-last-opened.test.ts +1 -1
  554. package/server/modules/mcp-gateway/tests/mcp-usage-stats.test.ts +1 -1
  555. package/server/modules/mcp-gateway/tests/mcp-write-notification.test.ts +2 -2
  556. package/server/modules/mcp-gateway/tests/oauth-flow.e2e.test.ts +3 -3
  557. package/server/modules/notifications/services/notification-orchestrator.service.js +1 -1
  558. package/server/modules/oauth/access-tokens.service.ts +8 -8
  559. package/server/modules/oauth/oauth-consent.service.ts +20 -15
  560. package/server/modules/oauth/tests/access-token-scopes.test.ts +55 -34
  561. package/server/modules/oauth/tests/access-tokens.service.test.ts +50 -14
  562. package/server/modules/oauth/tests/oauth-consent-page.test.ts +29 -21
  563. package/server/modules/oauth/tests/oauth-consent-ratelimit.test.ts +2 -2
  564. package/server/modules/oauth/tests/token-info.routes.test.ts +2 -2
  565. package/server/modules/observation/architecture-delta.producer.ts +1 -1
  566. package/server/modules/observation/blind-spots.ts +1 -1
  567. package/server/modules/observation/observation-store.ts +54 -16
  568. package/server/modules/observation/observation-uri.ts +34 -21
  569. package/server/modules/observation/observation.routes.ts +1 -1
  570. package/server/modules/observation/project-truth.ts +3 -3
  571. package/server/modules/observation/session-ask-decision-answer.ts +2 -1
  572. package/server/modules/observation/session-digest-llm.ts +7 -1
  573. package/server/modules/observation/session-digest.ts +39 -5
  574. package/server/modules/observation/tests/architecture-delta.test.ts +1 -1
  575. package/server/modules/observation/tests/observation-routes.test.ts +13 -0
  576. package/server/modules/observation/tests/observation-store.test.ts +58 -0
  577. package/server/modules/observation/tests/project-truth.test.ts +2 -2
  578. package/server/modules/observation/tests/session-ask-decision-digest.test.ts +189 -0
  579. package/server/modules/observation/tests/session-digest.test.ts +43 -0
  580. package/server/modules/providers/index.ts +13 -0
  581. package/server/modules/providers/list/claude/claude-host-driver.provider.ts +1 -1
  582. package/server/modules/providers/list/codex/codex-app-server.client.ts +37 -5
  583. package/server/modules/providers/list/codex/codex-app-server.connection.ts +1 -1
  584. package/server/modules/providers/list/codex/codex-host-driver.contract.ts +18 -9
  585. package/server/modules/providers/list/codex/codex-host-driver.provider.ts +15 -1
  586. package/server/modules/providers/list/codex/codex-models.provider.ts +16 -3
  587. package/server/modules/providers/list/codex/codex-provider-injection.ts +323 -0
  588. package/server/modules/providers/list/codex/codex-resident-provider-launch.ts +71 -0
  589. package/server/modules/providers/list/codex/codex-runtime.provider.ts +20 -1
  590. package/server/modules/providers/list/cursor/cursor-models.provider.ts +1 -1
  591. package/server/modules/providers/list/opencode/opencode-models.provider.ts +1 -1
  592. package/server/modules/providers/provider.routes.ts +23 -2
  593. package/server/modules/providers/services/provider-models.service.ts +187 -124
  594. package/server/modules/providers/services/provider-runtime.service.ts +3 -0
  595. package/server/modules/providers/services/session-model-resolver.ts +180 -0
  596. package/server/modules/providers/services/session-provider-binding.ts +176 -0
  597. package/server/modules/providers/services/sessions.service.ts +5 -1
  598. package/server/modules/providers/tests/claude-resident-addressable.test.ts +2 -2
  599. package/server/modules/providers/tests/claude-session-name-authority.test.ts +4 -4
  600. package/server/modules/providers/tests/codex-app-server-protocol.test.ts +1 -1
  601. package/server/modules/providers/tests/codex-host-driver-persistent.test.ts +2 -2
  602. package/server/modules/providers/tests/codex-provider-model-binding.test.ts +345 -0
  603. package/server/modules/providers/tests/codex-resident-provider-injection.test.ts +561 -0
  604. package/server/modules/providers/tests/codex-runtime-provider-injection.test.ts +269 -0
  605. package/server/modules/providers/tests/codex-session-provider-binding.test.ts +386 -0
  606. package/server/modules/providers/tests/codex-sessions.test.ts +1 -1
  607. package/server/modules/providers/tests/opencode-sessions.test.ts +2 -2
  608. package/server/modules/providers/tests/provider-models.service.test.ts +15 -0
  609. package/server/modules/providers/tests/provider.routes.test.ts +1 -1
  610. package/server/modules/quay/index.ts +1 -1
  611. package/server/modules/quay/quay-dispatch-carrier.ts +1 -1
  612. package/server/modules/quay/quay-fleet-cli.ts +1 -1
  613. package/server/modules/quay/quay-fleet-locator.ts +2 -2
  614. package/server/modules/quay/quay-fleet-project-id.ts +14 -14
  615. package/server/modules/quay/quay-fleet-registry.ts +8 -8
  616. package/server/modules/quay/quay-suite-fanin-reader.ts +1 -1
  617. package/server/modules/quay/quay-uri-resolve.ts +8 -8
  618. package/server/modules/quay/quay.module.ts +3 -3
  619. package/server/modules/quay/quay.routes.ts +1 -1
  620. package/server/modules/quay/quay.service.ts +6 -6
  621. package/server/modules/quay/session-task-chain.service.ts +1 -1
  622. package/server/modules/quay/tests/contracts/fleet-cli-contracts.test.ts +3 -3
  623. package/server/modules/quay/tests/contracts/shapes.ts +10 -10
  624. package/server/modules/quay/tests/quay-fleet-locator.test.ts +1 -1
  625. package/server/modules/quay/tests/quay-fleet-project-id.test.ts +6 -6
  626. package/server/modules/quay/tests/quay-uri-resolve.test.ts +10 -10
  627. package/server/modules/session-hosts/tests/resident-server-restart.test.ts +1 -1
  628. package/server/modules/settings/codex-mcp-gateway.settings.ts +1 -1
  629. package/server/modules/settings/codex-model-providers.schema.ts +460 -0
  630. package/server/modules/settings/codex-model-providers.service.ts +235 -0
  631. package/server/modules/settings/codex-model-providers.settings.ts +713 -0
  632. package/server/modules/settings/codex-model-providers.store.ts +244 -0
  633. package/server/modules/settings/index.ts +18 -0
  634. package/server/modules/settings/server-settings-file.ts +29 -41
  635. package/server/modules/settings/server-settings.ts +2 -3
  636. package/server/modules/settings/settings.module.ts +41 -0
  637. package/server/modules/settings/settings.routes.ts +37 -0
  638. package/server/modules/settings/settings.service.ts +21 -26
  639. package/server/modules/settings/tests/cockpit-session-start-settings.routes.test.ts +1 -0
  640. package/server/modules/settings/tests/codex-model-providers-settings.test.ts +413 -0
  641. package/server/modules/settings/tests/codex-provider-advanced.test.ts +540 -0
  642. package/server/modules/settings/tests/codex-provider-import.test.ts +621 -0
  643. package/server/modules/voice/tests/voice-lexicon.test.ts +10 -10
  644. package/server/modules/voice/voice-lexicon.ts +1 -1
  645. package/server/modules/websocket/services/chat-control.service.ts +35 -2
  646. package/server/modules/websocket/services/chat-websocket.service.ts +25 -1
  647. package/server/modules/websocket/tests/chat-background-task.test.ts +17 -1
  648. package/server/modules/websocket/tests/chat-stop-task.test.ts +17 -1
  649. package/server/modules/worktrees/services/worktree-list.service.ts +1 -1
  650. package/server/modules/worktrees/services/worktree-open.service.ts +1 -1
  651. package/server/modules/worktrees/services/worktree-remove.service.ts +1 -1
  652. package/server/shared/brand.ts +24 -38
  653. package/server/shared/data-root-migration.ts +3 -2
  654. package/server/shared/data-root.ts +73 -79
  655. package/server/shared/interfaces.ts +1 -1
  656. package/server/shared/mcp-contract/types.ts +20 -15
  657. package/server/shared/ports/codex-provider-registry.port.ts +133 -0
  658. package/server/shared/ports/session-blocked-events.port.ts +1 -1
  659. package/server/shared/ports/session-run-events.port.ts +2 -2
  660. package/server/shared/settings-file.ts +167 -6
  661. package/server/shared/tests/architecture-ratchet.baseline.json +15 -15
  662. package/server/shared/tests/cloudpit-brand-env.test.ts +106 -36
  663. package/server/shared/tests/cloudpit-data-root.test.ts +42 -18
  664. package/server/shared/tests/cloudpit-goal-exit-gate.baseline.json +6 -2
  665. package/server/shared/tests/cloudpit-goal-exit-gate.test.ts +179 -17
  666. package/server/shared/tests/cloudpit-runtime-flip.test.ts +162 -123
  667. package/server/shared/tests/frontend-import-cycle-budget.baseline.json +8 -6
  668. package/server/shared/tests/frontend-import-cycle-budget.test.ts +9 -1
  669. package/server/shared/tests/quay-test-script.test.ts +40 -6
  670. package/server/shared/tests/settings-file.test.ts +83 -1
  671. package/server/shared/types.ts +121 -8
  672. package/server/shared/utils.ts +1 -1
  673. package/dist/assets/channel-D7XqNTJC.js +0 -1
  674. package/dist/assets/channel-sbQyI1an.js +0 -1
  675. package/dist/assets/classDiagram-JCYQIIEL-DHudi-zH.js +0 -1
  676. package/dist/assets/classDiagram-JCYQIIEL-DV7ybJJG.js +0 -1
  677. package/dist/assets/classDiagram-v2-OCEON4UE-DHudi-zH.js +0 -1
  678. package/dist/assets/classDiagram-v2-OCEON4UE-DV7ybJJG.js +0 -1
  679. package/dist/assets/index-BsACp0s2.css +0 -32
  680. package/dist/assets/swimlanesDiagram-ULZ7WXOC-CNMNp6YA.js +0 -8
  681. package/dist/assets/swimlanesDiagram-ULZ7WXOC-DOjtDEUW.js +0 -8
  682. package/dist/icons/icon-128x128.svg +0 -12
  683. package/dist/icons/icon-144x144.svg +0 -12
  684. package/dist/icons/icon-152x152.svg +0 -12
  685. package/dist/icons/icon-192x192.svg +0 -12
  686. package/dist/icons/icon-384x384.svg +0 -12
  687. package/dist/icons/icon-512x512.svg +0 -12
  688. package/dist/icons/icon-72x72.svg +0 -12
  689. package/dist/icons/icon-96x96.svg +0 -12
  690. package/dist/icons/icon-template.svg +0 -12
@@ -487,7 +487,7 @@ export function upsertSection(filePath, title, body) {
487
487
  */
488
488
  function recordHeader() {
489
489
  return [
490
- '# CloudCLI MCP 网关嵌套冒烟记录(AC-256)',
490
+ '# Cloudpit MCP 网关嵌套冒烟记录(AC-256)',
491
491
  '',
492
492
  '本文件由 `scripts/mcp-smoke.mjs` 写入:八节各含**原始**读数与一行结论。读数来自一次真跑——真服务',
493
493
  '实例(临时 `DATABASE_PATH`、`HOST=127.0.0.1`、端口 `listen(0)` 探得且 ≠ 3001)+ 一个真 PAT +',
@@ -506,7 +506,7 @@ function recordHeader() {
506
506
  */
507
507
  function residentRecordHeader() {
508
508
  return [
509
- '# CloudCLI MCP 网关常驻专有能力冒烟记录(AC-276)',
509
+ '# Cloudpit MCP 网关常驻专有能力冒烟记录(AC-276)',
510
510
  '',
511
511
  '本文件由 `scripts/mcp-smoke.mjs --run-resident` 写入:八节各含**原始**读数与一行结论。读数来自一次',
512
512
  '真跑——真服务实例(临时 `DATABASE_PATH`、`HOST=127.0.0.1`、端口 `listen(0)` 探得且 ≠ 3001)+',
@@ -169,10 +169,34 @@ function scanUpstreamMentions() {
169
169
 
170
170
  const upstreamMentions = scanUpstreamMentions();
171
171
 
172
+ // ── R12: the retired runtime tag / asset prefixes ───────────────────────────
173
+ // 2.0 never double-published the legacy tag aliases; 2.1 stops them for good. The frozen ledgers
174
+ // (docs/, tasks/, goals/, CHANGELOG.md) keep the history, so the scan is the LIVE release surface
175
+ // only: every workflow plus the scripts/package metadata that mint tags and asset names.
176
+ const LEGACY_TAG_PREFIXES = ['cloudcli-local-server-', 'cloudcli-desktop-'];
177
+ const RELEASE_SURFACE = [
178
+ '.github/workflows/release.yml',
179
+ '.github/workflows/desktop-release.yml',
180
+ '.github/workflows/desktop-windows-branch-build.yml',
181
+ '.github/workflows/desktop-macos-branch-build.yml',
182
+ '.github/workflows/docker.yml',
183
+ 'scripts/release/build-server-bundle.js',
184
+ 'scripts/release/prepare-desktop-app.js',
185
+ 'electron/serverInstaller.js',
186
+ 'package.json',
187
+ ];
188
+
189
+ const legacyTagHits = RELEASE_SURFACE.flatMap((rel) =>
190
+ LEGACY_TAG_PREFIXES.flatMap((prefix) =>
191
+ read(rel).includes(prefix) ? [`${rel}:${prefix}`] : [],
192
+ ),
193
+ );
194
+
172
195
  console.log(`pkg.name=${pkg.name}`);
173
196
  console.log(`npm.publish=${npmPublish}`);
174
197
  console.log(`auth.env=${authEnv}`);
175
198
  console.log(`legacy.upgradeCmds=${upstreamMentions.length}`);
199
+ console.log(`legacy.tag_prefixes=${legacyTagHits.length}`);
176
200
  console.log(`requireBranch=${requireBranch}`);
177
201
  console.log(`pushRepo=${pushRepo}`);
178
202
  console.log(`macos.jobs=${macosJobs}`);
@@ -235,6 +259,27 @@ test('no user-facing command points at the upstream package scope', () => {
235
259
  );
236
260
  });
237
261
 
262
+ test('R12: the release surface carries no legacy runtime tag or asset prefix', () => {
263
+ assert.deepEqual(
264
+ legacyTagHits,
265
+ [],
266
+ `a release workflow or asset still mints a retired prefix (${LEGACY_TAG_PREFIXES.join(', ')}): ${legacyTagHits.join(', ')}`,
267
+ );
268
+ });
269
+
270
+ test('R12 control: the legacy-prefix scan would catch a reintroduction', () => {
271
+ // The 3.0 gate only re-confirms the 2.1 removal, so a vacuous green would be invisible. The
272
+ // same predicate must flag a synthetic reintroduction, and every scanned file must be live
273
+ // (non-empty) so "no hits" cannot come from reading nothing.
274
+ /** @param {string} text @returns {string[]} */
275
+ const detect = (text) => LEGACY_TAG_PREFIXES.filter((prefix) => text.includes(prefix));
276
+ assert.deepEqual(detect('cloudpit-local-server-v3.0.0'), [], 'the live prefix is not a hit');
277
+ assert.deepEqual(detect('cloudcli-local-server-v3.0.0'), ['cloudcli-local-server-'], 'a retired prefix is a hit');
278
+ for (const rel of RELEASE_SURFACE) {
279
+ assert.ok(read(rel).length > 0, `${rel} must be a live release-surface file`);
280
+ }
281
+ });
282
+
238
283
  test('desktop-release.yml drops the macOS build', () => {
239
284
  assert.equal(macosJobs, 0, `desktop-release.yml builds a macOS job again (${macosJobs})`);
240
285
  assert.equal(dmgRefs, 0, `desktop-release.yml still references a .dmg (${dmgRefs})`);
@@ -2,16 +2,17 @@
2
2
  /**
3
3
  * Criterion for gap-desktop-local-server-bundle-url-points-at-fork.
4
4
  *
5
- * CloudCLI Desktop downloads its Local runtime bundle from a GitHub Release URL built by
5
+ * Cloudpit Desktop downloads its Local runtime bundle from a GitHub Release URL built by
6
6
  * `electron/serverInstaller.js`. The default base URL named the UPSTREAM repository
7
7
  * (`github.com/siteboon/claudecodeui`) while this fork publishes both the desktop installer and the
8
8
  * `cloudpit-local-server-v<tag>` prerelease under `yaleh/cloudpit` — so a user who picked
9
- * "Local CloudCLI" asked a repository that never had the tag and got a 404.
9
+ * "Local Cloudpit" asked a repository that never had the tag and got a 404.
10
10
  *
11
11
  * This criterion pins the two decisions that fix it, so neither can silently revert:
12
12
  *
13
13
  * 1. the DEFAULT base URL names the fork, and no upstream org reference survives in the source;
14
- * 2. `CLOUDCLI_SERVER_BUNDLE_URL` still overrides it (the escape hatch admins already use).
14
+ * 2. `CLOUDPIT_SERVER_BUNDLE_URL` still overrides it (the escape hatch admins already use);
15
+ * v3.0 retired the legacy `CLOUDCLI_SERVER_BUNDLE_URL` spelling, which is now ignored.
15
16
  *
16
17
  * It also pins the URL *shape* the release pipeline now produces: the release-tag path segment and
17
18
  * the `cloudpit-local-server-v<version>-<platform>-<arch>.tar.gz` filename both carry the `v`
@@ -87,18 +88,38 @@ function installer() {
87
88
 
88
89
  const sourceText = read(SOURCE_REL);
89
90
 
91
+ // R12 (2.1): the retired runtime tag / asset prefixes must not reappear on the release surface.
92
+ const LEGACY_TAG_PREFIXES = ['cloudcli-local-server-', 'cloudcli-desktop-'];
93
+ const RELEASE_SURFACE = [
94
+ SOURCE_REL,
95
+ 'scripts/release/build-server-bundle.js',
96
+ '.github/workflows/desktop-release.yml',
97
+ ];
98
+ const legacyTagHits = RELEASE_SURFACE.flatMap((rel) =>
99
+ LEGACY_TAG_PREFIXES.flatMap((prefix) => (read(rel).includes(prefix) ? [`${rel}:${prefix}`] : [])),
100
+ );
101
+
90
102
  // The default reading must be taken with the override env UNSET: a stray
91
- // CLOUDCLI_SERVER_BUNDLE_URL in the caller's environment would otherwise masquerade as the default.
92
- const savedBundleUrlEnv = process.env.CLOUDCLI_SERVER_BUNDLE_URL;
103
+ // CLOUDPIT_SERVER_BUNDLE_URL in the caller's environment would otherwise masquerade as the default.
104
+ const savedBundleUrlEnv = process.env.CLOUDPIT_SERVER_BUNDLE_URL;
105
+ const savedLegacyBundleUrlEnv = process.env.CLOUDCLI_SERVER_BUNDLE_URL;
106
+ delete process.env.CLOUDPIT_SERVER_BUNDLE_URL;
93
107
  delete process.env.CLOUDCLI_SERVER_BUNDLE_URL;
94
108
  const defaultUrl = installer().getBundleUrl();
95
109
  const defaultBaseUrl = installer().bundleBaseUrl;
96
110
 
97
- process.env.CLOUDCLI_SERVER_BUNDLE_URL = OVERRIDE_BASE;
111
+ process.env.CLOUDPIT_SERVER_BUNDLE_URL = OVERRIDE_BASE;
98
112
  const overrideUrl = installer().getBundleUrl();
99
113
 
100
- if (savedBundleUrlEnv === undefined) delete process.env.CLOUDCLI_SERVER_BUNDLE_URL;
101
- else process.env.CLOUDCLI_SERVER_BUNDLE_URL = savedBundleUrlEnv;
114
+ // v3.0 negative control: the retired legacy spelling must not override anything.
115
+ delete process.env.CLOUDPIT_SERVER_BUNDLE_URL;
116
+ process.env.CLOUDCLI_SERVER_BUNDLE_URL = 'https://legacy.invalid/bundles';
117
+ const legacyOnlyUrl = installer().getBundleUrl();
118
+
119
+ if (savedBundleUrlEnv === undefined) delete process.env.CLOUDPIT_SERVER_BUNDLE_URL;
120
+ else process.env.CLOUDPIT_SERVER_BUNDLE_URL = savedBundleUrlEnv;
121
+ if (savedLegacyBundleUrlEnv === undefined) delete process.env.CLOUDCLI_SERVER_BUNDLE_URL;
122
+ else process.env.CLOUDCLI_SERVER_BUNDLE_URL = savedLegacyBundleUrlEnv;
102
123
 
103
124
  const defaultParsed = new URL(defaultUrl);
104
125
  const defaultRepoPath = defaultParsed.pathname.split('/').filter(Boolean).slice(0, 2).join('/');
@@ -112,6 +133,7 @@ const envOverride = overrideUrl.startsWith(`${OVERRIDE_BASE}/`) ? 'honored' : 'i
112
133
  console.log(`bundle.default.host=${defaultHost}`);
113
134
  console.log(`bundle.default.upstream_refs=${upstreamRefs}`);
114
135
  console.log(`bundle.env_override=${envOverride}`);
136
+ console.log(`legacy.tag_prefixes=${legacyTagHits.length}`);
115
137
 
116
138
  // ── the assertions ───────────────────────────────────────────────────────────
117
139
 
@@ -141,7 +163,7 @@ test('the default bundle address points at the fork, not upstream', () => {
141
163
  );
142
164
  });
143
165
 
144
- test('CLOUDCLI_SERVER_BUNDLE_URL still overrides the default', () => {
166
+ test('CLOUDPIT_SERVER_BUNDLE_URL still overrides the default', () => {
145
167
  assert.equal(envOverride, 'honored', 'the environment override must win over the default base URL');
146
168
  assert.equal(
147
169
  overrideUrl,
@@ -150,6 +172,32 @@ test('CLOUDCLI_SERVER_BUNDLE_URL still overrides the default', () => {
150
172
  );
151
173
  });
152
174
 
175
+ test('v3.0: CLOUDCLI_SERVER_BUNDLE_URL is ignored', () => {
176
+ assert.equal(
177
+ legacyOnlyUrl.startsWith(`${OVERRIDE_BASE}/`),
178
+ false,
179
+ 'the retired legacy spelling must not override the base URL',
180
+ );
181
+ assert.equal(
182
+ legacyOnlyUrl,
183
+ defaultUrl,
184
+ 'a legacy-only environment must resolve the same URL as no environment',
185
+ );
186
+ });
187
+
188
+ test('R12: no legacy runtime tag or asset prefix survives on the release surface', () => {
189
+ assert.deepEqual(
190
+ legacyTagHits,
191
+ [],
192
+ `the installer/workflow/build script still mints a retired prefix: ${legacyTagHits.join(', ')}`,
193
+ );
194
+ // Positive control: the replacement prefix is what the same surface produces.
195
+ assert.ok(
196
+ defaultUrl.includes('cloudpit-local-server-'),
197
+ 'the live release surface must produce the cloudpit-local-server- shape',
198
+ );
199
+ });
200
+
153
201
  test('the bundle URL shape matches the distribution asset prefix', () => {
154
202
  assert.equal(
155
203
  defaultUrl,
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env bash
2
- # Restart the claudecodeui server once NO CloudCLI session is running a turn.
2
+ # Restart the claudecodeui server once NO Cloudpit session is running a turn.
3
3
  #
4
4
  # Why this script exists: restarting the server unit kills every claude process under it, so doing
5
5
  # it while another session is mid-turn loses that turn. It runs as a systemd USER transient unit
@@ -14,7 +14,7 @@
14
14
  * absent, so a damage line cannot quietly look like a hit.
15
15
  *
16
16
  * `--json` prints the same reading as one JSON document. The report is READ-ONLY:
17
- * it never writes the stream (the fleet owns retention and CloudCLI never deletes
17
+ * it never writes the stream (the fleet owns retention and Cloudpit never deletes
18
18
  * an event).
19
19
  *
20
20
  * Consumers: `scripts/shadow-prediction-report.test.mjs` (AC4, which drives the
@@ -973,3 +973,48 @@
973
973
  # (dur=1863ms, its own new criterion; no green round contains it yet — the row keeps the 90%
974
974
  # coverage floor clear: the tree collects 497 server test files and the baseline holds 448 of them).
975
975
  1863 server/modules/mcp-gateway/tests/knowledge-effective-config-launch-request.test.ts
976
+ # and the codex-model-providers-settings row by codex-provider-config-surface,
977
+ # measured once on 2026-11-02 with
978
+ # `npx tsx --tsconfig server/tsconfig.json --test server/modules/settings/tests/codex-model-providers-settings.test.ts`
979
+ # (dur=2206ms, its own new criterion; no green round contains it yet — the row keeps the 90%
980
+ # coverage floor clear: the tree collects 499 server test files and the baseline holds 450 of them).
981
+ 2206 server/modules/settings/tests/codex-model-providers-settings.test.ts
982
+ # and the asset-migration.service row by gap-cloudpit-migrate-assets-rewrite,
983
+ # measured once on 2026-11-03 with
984
+ # `npx tsx --tsconfig server/tsconfig.json --test server/modules/cli/tests/asset-migration.service.test.ts`
985
+ # (dur=1409ms, its own new criterion; no green round contains it yet — the row keeps the 90%
986
+ # coverage floor clear: the tree collects 500 server test files and the baseline holds 451 of them).
987
+ 1409 server/modules/cli/tests/asset-migration.service.test.ts
988
+ # and the codex-provider-model-binding row by codex-model-entry-provider-binding,
989
+ # measured once on 2026-11-03 with
990
+ # `npx tsx --tsconfig server/tsconfig.json --test server/modules/providers/tests/codex-provider-model-binding.test.ts`
991
+ # (dur=4412ms, its own new criterion; no green round contains it yet — the row keeps the 90%
992
+ # coverage floor clear: the tree collects 501 server test files and the baseline holds 452 of them).
993
+ 4412 server/modules/providers/tests/codex-provider-model-binding.test.ts
994
+ # and the codex-perrun-provider-injection row by codex-perrun-provider-injection,
995
+ # measured once on 2026-11-03 with
996
+ # `npx tsx --tsconfig server/tsconfig.json --test server/modules/providers/tests/codex-runtime-provider-injection.test.ts`
997
+ # (dur=6729ms, its own new criterion; no green round contains it yet — the row keeps the 90%
998
+ # coverage floor clear: the tree collects 502 server test files and the baseline holds 453 of them).
999
+ 6729 server/modules/providers/tests/codex-runtime-provider-injection.test.ts
1000
+ # The codex-session-provider-id-binding row: measured once on 2026-11-03 with
1001
+ # `npx tsx --tsconfig server/tsconfig.json --test server/modules/providers/tests/codex-session-provider-binding.test.ts`
1002
+ # (dur=6952ms, its own new criterion; no green round contains it yet — the row keeps the 90%
1003
+ # coverage floor clear: the tree collects 503 server test files and the baseline holds 454 of them).
1004
+ 6952 server/modules/providers/tests/codex-session-provider-binding.test.ts
1005
+ # The codex-resident-provider-injection row: measured once on 2026-11-03 with
1006
+ # `npx tsx --tsconfig server/tsconfig.json --test server/modules/providers/tests/codex-resident-provider-injection.test.ts`
1007
+ # (dur=8469ms, its own new criterion; no green round contains it yet — the row keeps the 90%
1008
+ # coverage floor clear: the tree collects 504 server test files and the baseline holds 455 of them).
1009
+ 8469 server/modules/providers/tests/codex-resident-provider-injection.test.ts
1010
+ # The codex-provider-import-user-profile row: measured once on 2026-11-03 with
1011
+ # `npx tsx --tsconfig server/tsconfig.json --test server/modules/settings/tests/codex-provider-import.test.ts`
1012
+ # (dur=1460ms, its own new criterion; no green round contains it yet — the row keeps the 90%
1013
+ # coverage floor clear: the tree collects 505 server test files and the baseline holds 456 of them).
1014
+ 1460 server/modules/settings/tests/codex-provider-import.test.ts
1015
+ # The codex-provider-advanced-capabilities row: measured once on 2026-11-03 with
1016
+ # `npx tsx --tsconfig server/tsconfig.json --test server/modules/settings/tests/codex-provider-advanced.test.ts`
1017
+ # (dur=12784ms, its own new criterion; no green round contains it yet — the row keeps the 90%
1018
+ # coverage floor clear: the tree collects 506 server test files and the baseline holds 457 of them).
1019
+ # The 12.8s is dominated by the one real bundled-CLI turn and the DNS probe, not by load.
1020
+ 12784 server/modules/settings/tests/codex-provider-advanced.test.ts
@@ -23,6 +23,10 @@
23
23
  * `settings` — the Settings dialog's Cockpit tab, opened from the sidebar's Settings
24
24
  * button; the opener waits until the form's own reading is `ready`/`failed`,
25
25
  * so the first step never catches it mid-load.
26
+ * `settings-agents-codex` — Settings → Agents → Codex → Models: the project provider
27
+ * registry with the bound model library and the user-profile import
28
+ * panel; waits until BOTH the registry's and the import panel's own
29
+ * statuses settle (`ready`/`failed`).
26
30
  * `quay-pulse` — the title-bar Loop pulse popover of the session the page is already on;
27
31
  * the opener presses the trigger and waits for the mention list to settle,
28
32
  * because that list arrives over the network after the popover mounts.
@@ -550,6 +554,151 @@ function expectationFailures(expect, reading) {
550
554
  if (actual !== expected) fail(key, expected, actual);
551
555
  break;
552
556
  }
557
+ case 'codexProvidersOpen': {
558
+ const actual = reading.codexProviders?.open === true;
559
+ if (actual !== expected) fail(key, expected, actual);
560
+ break;
561
+ }
562
+ case 'codexProvidersStatus': {
563
+ const actual = reading.codexProviders?.status ?? null;
564
+ if (actual !== expected) fail(key, expected, actual);
565
+ break;
566
+ }
567
+ case 'codexProvidersError': {
568
+ const actual = reading.codexProviders?.error ?? null;
569
+ if (actual !== expected) fail(key, expected, actual);
570
+ break;
571
+ }
572
+ case 'codexProvidersCount': {
573
+ const actual = reading.codexProviders?.count ?? null;
574
+ if (actual !== expected) fail(key, expected, actual);
575
+ break;
576
+ }
577
+ case 'codexProviderIds': {
578
+ // The registry's ids IN DRAW ORDER: a row that silently disappears is observable.
579
+ const actual = Array.isArray(reading.codexProviders?.ids) ? reading.codexProviders.ids : null;
580
+ if (!Array.isArray(expected) || !sameJson(actual, expected)) fail(key, expected, actual);
581
+ break;
582
+ }
583
+ case 'codexProviderTokenSet': {
584
+ // Per row, whether a secret is stored — never the secret itself.
585
+ const actual = Array.isArray(reading.codexProviders?.tokenSet)
586
+ ? reading.codexProviders.tokenSet
587
+ : null;
588
+ if (!Array.isArray(expected) || !sameJson(actual, expected)) fail(key, expected, actual);
589
+ break;
590
+ }
591
+ case 'codexProviderWarningsInclude': {
592
+ const warnings = Array.isArray(reading.codexProviders?.warnings)
593
+ ? reading.codexProviders.warnings.join('\n')
594
+ : '';
595
+ if (!warnings.includes(String(expected))) fail(key, expected, warnings);
596
+ break;
597
+ }
598
+ case 'codexResponsesOnlyIncludes': {
599
+ const actual = reading.codexProviders?.responsesOnly ?? null;
600
+ if (actual === null || !actual.includes(String(expected))) fail(key, expected, actual);
601
+ break;
602
+ }
603
+ case 'codexModelProvider': {
604
+ const actual = reading.codexProviders?.modelProvider ?? null;
605
+ if (actual !== expected) fail(key, expected, actual);
606
+ break;
607
+ }
608
+ case 'codexModelProviderOptions': {
609
+ const actual = Array.isArray(reading.codexProviders?.modelProviderOptions)
610
+ ? reading.codexProviders.modelProviderOptions
611
+ : null;
612
+ if (!Array.isArray(expected) || !sameJson(actual, expected)) fail(key, expected, actual);
613
+ break;
614
+ }
615
+ case 'codexModelLibraryStatus': {
616
+ const actual = reading.codexProviders?.modelLibraryStatus ?? null;
617
+ if (actual !== expected) fail(key, expected, actual);
618
+ break;
619
+ }
620
+ case 'codexModelLibraryNoticeIncludes': {
621
+ const actual = reading.codexProviders?.modelLibraryNotice ?? null;
622
+ if (actual === null || !actual.includes(String(expected))) fail(key, expected, actual);
623
+ break;
624
+ }
625
+ case 'codexModelIds': {
626
+ const actual = Array.isArray(reading.codexProviders?.modelIds)
627
+ ? reading.codexProviders.modelIds
628
+ : null;
629
+ if (!Array.isArray(expected) || !sameJson(actual, expected)) fail(key, expected, actual);
630
+ break;
631
+ }
632
+ case 'codexModelLabelsInclude': {
633
+ const labels = Array.isArray(reading.codexProviders?.modelLabels)
634
+ ? reading.codexProviders.modelLabels.join('\n')
635
+ : '';
636
+ if (!labels.includes(String(expected))) fail(key, expected, labels);
637
+ break;
638
+ }
639
+ case 'codexImportOpen': {
640
+ const actual = reading.codexProviders?.importOpen === true;
641
+ if (actual !== expected) fail(key, expected, actual);
642
+ break;
643
+ }
644
+ case 'codexImportStatus': {
645
+ const actual = reading.codexProviders?.importStatus ?? null;
646
+ if (actual !== expected) fail(key, expected, actual);
647
+ break;
648
+ }
649
+ case 'codexImportCount': {
650
+ const actual = reading.codexProviders?.importCount ?? null;
651
+ if (actual !== expected) fail(key, expected, actual);
652
+ break;
653
+ }
654
+ case 'codexImportIds': {
655
+ // The user-profile rows IN DRAW ORDER (`config.toml` first, then profiles).
656
+ const actual = Array.isArray(reading.codexProviders?.importIds)
657
+ ? reading.codexProviders.importIds
658
+ : null;
659
+ if (!Array.isArray(expected) || !sameJson(actual, expected)) fail(key, expected, actual);
660
+ break;
661
+ }
662
+ case 'codexImportBindable': {
663
+ // A row this project refuses (reserved id / Chat Completions) reads `false` here.
664
+ const actual = Array.isArray(reading.codexProviders?.importBindable)
665
+ ? reading.codexProviders.importBindable
666
+ : null;
667
+ if (!Array.isArray(expected) || !sameJson(actual, expected)) fail(key, expected, actual);
668
+ break;
669
+ }
670
+ case 'codexImportEnvKeys': {
671
+ // The variable NAMES only; a value would have to be a different string.
672
+ const actual = Array.isArray(reading.codexProviders?.importEnvKeys)
673
+ ? reading.codexProviders.importEnvKeys
674
+ : null;
675
+ if (!Array.isArray(expected) || !sameJson(actual, expected)) fail(key, expected, actual);
676
+ break;
677
+ }
678
+ case 'codexImportBaseUrls': {
679
+ const actual = Array.isArray(reading.codexProviders?.importBaseUrls)
680
+ ? reading.codexProviders.importBaseUrls
681
+ : null;
682
+ if (!Array.isArray(expected) || !sameJson(actual, expected)) fail(key, expected, actual);
683
+ break;
684
+ }
685
+ case 'codexImportWireApis': {
686
+ const actual = Array.isArray(reading.codexProviders?.importWireApis)
687
+ ? reading.codexProviders.importWireApis
688
+ : null;
689
+ if (!Array.isArray(expected) || !sameJson(actual, expected)) fail(key, expected, actual);
690
+ break;
691
+ }
692
+ case 'codexImportDirectoryIncludes': {
693
+ const actual = reading.codexProviders?.importDirectory ?? null;
694
+ if (actual === null || !actual.includes(String(expected))) fail(key, expected, actual);
695
+ break;
696
+ }
697
+ case 'codexImportError': {
698
+ const actual = reading.codexProviders?.importError ?? null;
699
+ if (actual !== expected) fail(key, expected, actual);
700
+ break;
701
+ }
553
702
  case 'cockpitCardDismissNoticeOk': {
554
703
  // The last dismiss answer's outcome, read from the list-level line that outlives the card.
555
704
  // `null` (no dismiss attempted yet) is a real reading, not "skip".
@@ -1043,6 +1192,51 @@ async function openSettingsCockpit(page) {
1043
1192
  );
1044
1193
  }
1045
1194
 
1195
+ /**
1196
+ * Opens Settings → Agents → Codex → Models: the project provider registry with the bound model
1197
+ * library below it.
1198
+ *
1199
+ * The dialog has no route of its own, so the opener presses the same four controls a person
1200
+ * does: the sidebar's Settings button, the Agents tab, the Codex agent pill, and the Models
1201
+ * category tab. It then waits for the registry's own published status to settle (`ready` or
1202
+ * `failed`), because the reading arrives over the network and a scenario's first `expect` must
1203
+ * not catch it in `loading`.
1204
+ *
1205
+ * @param {import('playwright').Page} page
1206
+ */
1207
+ async function openSettingsAgentsCodex(page) {
1208
+ if (!page.url().startsWith('http')) {
1209
+ await page.goto('/');
1210
+ }
1211
+ await waitForSurface(page);
1212
+ const opener = page.locator('[data-testid="open-settings"]:visible').first();
1213
+ await opener.waitFor({ state: 'visible', timeout: BOOT_TIMEOUT_MS });
1214
+ await opener.click();
1215
+ const tab = page.locator('[data-settings-tab="agents"]:visible').first();
1216
+ await tab.waitFor({ state: 'visible', timeout: BOOT_TIMEOUT_MS });
1217
+ await tab.click();
1218
+ const agent = page.locator('[data-settings-agent="codex"]:visible').first();
1219
+ await agent.waitFor({ state: 'visible', timeout: BOOT_TIMEOUT_MS });
1220
+ await agent.click();
1221
+ const category = page.locator('[data-settings-category="models"]:visible').first();
1222
+ await category.waitFor({ state: 'visible', timeout: BOOT_TIMEOUT_MS });
1223
+ await category.click();
1224
+ await page.waitForFunction(
1225
+ () => {
1226
+ const root = /** @type {any} */ (globalThis).document.querySelector('[data-codex-providers]');
1227
+ if (root === null) return false;
1228
+ const status = root.getAttribute('data-codex-providers');
1229
+ // The user-profile import is a second, independent read; a scenario whose first step
1230
+ // asserts it must not catch it mid-load.
1231
+ const importStatus = root.getAttribute('data-codex-import-status');
1232
+ return (status === 'ready' || status === 'failed')
1233
+ && (importStatus === 'ready' || importStatus === 'failed');
1234
+ },
1235
+ undefined,
1236
+ { timeout: PANEL_TIMEOUT_MS },
1237
+ );
1238
+ }
1239
+
1046
1240
  /**
1047
1241
  * Opens the title-bar Loop pulse popover for the session already on screen.
1048
1242
  *
@@ -1282,6 +1476,7 @@ async function runScenario(browser, scenario, options) {
1282
1476
  cockpit: () => openCockpit(page),
1283
1477
  'cockpit-cards': () => openCockpitCards(page),
1284
1478
  settings: () => openSettingsCockpit(page),
1479
+ 'settings-agents-codex': () => openSettingsAgentsCodex(page),
1285
1480
  'quay-pulse': () => openQuayPulse(page),
1286
1481
  'cost-panel': () => openCostPanel(page, target),
1287
1482
  };
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "codex-provider-import",
3
+ "description": "Settings → Agents → Codex: the user-profile import panel lists the operator's own ~/.codex providers (variable NAMES only, never a secret), one Bind writes the selected provider into the PROJECT registry, and the imported provider becomes a selectable binding for a new model. The isolated instance this runs against starts from an empty CODEX_SETTINGS_PATH and a HOME whose .codex/config.toml declares `bob` and whose bob-gpt.config.toml declares `bob-gpt`.",
4
+ "steps": [
5
+ {
6
+ "open": "settings-agents-codex",
7
+ "checkpoint": true,
8
+ "expect": {
9
+ "codexProvidersOpen": true,
10
+ "codexProvidersStatus": "ready",
11
+ "codexProvidersError": null,
12
+ "codexProvidersCount": 0,
13
+ "codexProviderIds": [],
14
+ "codexModelProvider": "",
15
+ "codexModelProviderOptions": [""],
16
+ "codexImportOpen": true,
17
+ "codexImportStatus": "ready",
18
+ "codexImportCount": 2,
19
+ "codexImportIds": ["bob", "bob-gpt"],
20
+ "codexImportBindable": [true, true],
21
+ "codexImportEnvKeys": ["BOB_API_KEY", "BOB_GPT_API_KEY"],
22
+ "codexImportBaseUrls": ["http://127.0.0.1:9/v1", "http://127.0.0.1:9/gpt/v1"],
23
+ "codexImportWireApis": ["responses", "responses"],
24
+ "codexImportDirectoryIncludes": ".codex",
25
+ "codexImportError": null
26
+ }
27
+ },
28
+ {
29
+ "drive": { "codexProvider.import": "bob" },
30
+ "checkpoint": true,
31
+ "expect": {
32
+ "codexProvidersStatus": "ready",
33
+ "codexProvidersError": null,
34
+ "codexProvidersCount": 1,
35
+ "codexProviderIds": ["bob"],
36
+ "codexModelProviderOptions": ["", "bob"],
37
+ "codexImportStatus": "ready",
38
+ "codexImportError": null
39
+ }
40
+ },
41
+ {
42
+ "drive": { "modelLibrary.setField": { "field": "name", "value": "Scenario Imported Model" } }
43
+ },
44
+ {
45
+ "drive": { "modelLibrary.setField": { "field": "id", "value": "scenario-imported-model" } },
46
+ "expect": { "codexModelProviderOptions": ["", "bob"] }
47
+ },
48
+ {
49
+ "drive": { "modelLibrary.selectCodexProvider": "bob" },
50
+ "expect": { "codexModelProvider": "bob" }
51
+ },
52
+ {
53
+ "drive": { "modelLibrary.save": true },
54
+ "checkpoint": true,
55
+ "expect": {
56
+ "codexModelLibraryStatus": "saved",
57
+ "codexModelLibraryNoticeIncludes": "Scenario Imported Model was added.",
58
+ "codexModelIds": ["scenario-imported-model"],
59
+ "codexModelLabelsInclude": "· bob"
60
+ }
61
+ }
62
+ ]
63
+ }
@@ -0,0 +1,77 @@
1
+ {
2
+ "name": "codex-provider-settings",
3
+ "description": "Settings → Agents → Codex → Models: create a project upstream provider (id/baseUrl/envKey/tokenFile + a secret that must be masked), save it, then add a custom Codex model bound to that provider and save it. The instance this runs against starts from an empty CODEX_SETTINGS_PATH, so the first reading has zero providers and the model picker offers only the inherit-default choice.",
4
+ "steps": [
5
+ {
6
+ "open": "settings-agents-codex",
7
+ "checkpoint": true,
8
+ "expect": {
9
+ "codexProvidersOpen": true,
10
+ "codexProvidersStatus": "ready",
11
+ "codexProvidersError": null,
12
+ "codexProvidersCount": 0,
13
+ "codexProviderIds": [],
14
+ "codexProviderTokenSet": [],
15
+ "codexResponsesOnlyIncludes": "responses",
16
+ "codexModelProvider": "",
17
+ "codexModelProviderOptions": [""]
18
+ }
19
+ },
20
+ {
21
+ "drive": { "codexProvider.add": true },
22
+ "expect": { "codexProvidersCount": 1 }
23
+ },
24
+ {
25
+ "drive": { "codexProvider.fill": { "index": 0, "field": "id", "value": "bob" } }
26
+ },
27
+ {
28
+ "drive": { "codexProvider.fill": { "index": 0, "field": "name", "value": "Bob Endpoint" } }
29
+ },
30
+ {
31
+ "drive": { "codexProvider.fill": { "index": 0, "field": "baseUrl", "value": "http://127.0.0.1:9/v1" } }
32
+ },
33
+ {
34
+ "drive": { "codexProvider.fill": { "index": 0, "field": "envKey", "value": "BOB_API_KEY" } }
35
+ },
36
+ {
37
+ "drive": { "codexProvider.fill": { "index": 0, "field": "tokenFile", "value": "/tmp/cloudpit-dod-bob.token" } }
38
+ },
39
+ {
40
+ "drive": { "codexProvider.fill": { "index": 0, "field": "token", "value": "sk-scenario-secret" } },
41
+ "checkpoint": true
42
+ },
43
+ {
44
+ "drive": { "codexProvider.save": true },
45
+ "checkpoint": true,
46
+ "expect": {
47
+ "codexProvidersStatus": "ready",
48
+ "codexProvidersError": null,
49
+ "codexProvidersCount": 1,
50
+ "codexProviderIds": ["bob"],
51
+ "codexProviderTokenSet": [true],
52
+ "codexModelProviderOptions": ["", "bob"]
53
+ }
54
+ },
55
+ {
56
+ "drive": { "modelLibrary.setField": { "field": "name", "value": "Scenario Codex Model" } }
57
+ },
58
+ {
59
+ "drive": { "modelLibrary.setField": { "field": "id", "value": "scenario-codex-model" } },
60
+ "expect": { "codexModelProviderOptions": ["", "bob"] }
61
+ },
62
+ {
63
+ "drive": { "modelLibrary.selectCodexProvider": "bob" },
64
+ "expect": { "codexModelProvider": "bob" }
65
+ },
66
+ {
67
+ "drive": { "modelLibrary.save": true },
68
+ "checkpoint": true,
69
+ "expect": {
70
+ "codexModelLibraryStatus": "saved",
71
+ "codexModelLibraryNoticeIncludes": "Scenario Codex Model was added.",
72
+ "codexModelIds": ["scenario-codex-model"],
73
+ "codexModelLabelsInclude": "· bob"
74
+ }
75
+ }
76
+ ]
77
+ }
@@ -36,7 +36,7 @@
36
36
  *
37
37
  * `startup-line-missing` deletes the one call that announces the mode. It is NOT a bare
38
38
  * deletion: `voiceCapture` is read again eight lines later, so removing the statement outright
39
- * makes the module throw at load, the child never prints `CloudCLI Server - Ready`, and the
39
+ * makes the module throw at load, the child never prints `Cloudpit Server - Ready`, and the
40
40
  * criterion exits 2 with no readings at all — a red that names nothing, which is the failure
41
41
  * shape this AC is written against. The mutation therefore deletes the announcing call and
42
42
  * inlines the single field the rest of the file reads, which is the smallest single-site change
@@ -446,7 +446,7 @@ test('error forms: every class is counted, rewrites are separated from correctio
446
446
  const directory = scratchDir();
447
447
  const pairs = [
448
448
  ['fan in', 'fan-in', 'form'],
449
- ['cloud cli', 'CloudCLI', 'form'],
449
+ ['needs human', 'needs-human', 'form'],
450
450
  ['AC 零零二', 'AC-002', 'spoken-form'],
451
451
  ['GOAL 十三', 'GOAL-13', 'spoken-form'],
452
452
  ['翻译', 'fan-in', 'cjk-rendering'],