@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
@@ -168,9 +168,14 @@ function blockText(block: UnknownRecord): string {
168
168
  * again" after every background task: it opens a new turn span and, for the ask ledger, answers
169
169
  * a pending question nobody answered. The other tags are the same kind of row — slash-command
170
170
  * and bash-escape bookkeeping, and the metadata blocks the CLI appends.
171
+ *
172
+ * `cross-session-message` is another Claude session's SendMessage. It arrives as a `user` row
173
+ * because it enters this session as a turn, but the person did not type it; counting it as a
174
+ * prompt answered a pending ask the human had not answered yet.
171
175
  */
172
176
  const SYNTHETIC_USER_TURN_TAGS = [
173
177
  'task-notification',
178
+ 'cross-session-message',
174
179
  'system-reminder',
175
180
  'local-command-stdout',
176
181
  'local-command-stderr',
@@ -182,9 +187,22 @@ const SYNTHETIC_USER_TURN_TAGS = [
182
187
  'bash-stderr',
183
188
  ] as const;
184
189
 
185
- /** One leading synthetic envelope; matched repeatedly so stacked blocks still strip fully. */
190
+ /**
191
+ * The fixed lead-in the CLI puts before a peer-session envelope. It is harness prose, not the
192
+ * person's words, so it strips together with the envelope; older rows that carry no
193
+ * `origin.kind` marker are still recognised by their text alone.
194
+ */
195
+ const SYNTHETIC_USER_TURN_LEAD_IN = /^\s*Another Claude session sent a message:\s*/;
196
+
197
+ /**
198
+ * One leading synthetic envelope; matched repeatedly so stacked blocks still strip fully.
199
+ *
200
+ * The opening tag may carry attributes (`<cross-session-message from="…" from-name="…">`), so
201
+ * the name is followed by an optional attribute run. Matching only the bare form left those
202
+ * envelopes in place and made the whole row read as a prompt.
203
+ */
186
204
  const SYNTHETIC_USER_TURN_ENVELOPE = new RegExp(
187
- `^\\s*<(${SYNTHETIC_USER_TURN_TAGS.join('|')})>[\\s\\S]*?<\\/\\1>`,
205
+ `^\\s*<(${SYNTHETIC_USER_TURN_TAGS.join('|')})(?:\\s[^>]*)?>[\\s\\S]*?<\\/\\1>`,
188
206
  );
189
207
 
190
208
  /**
@@ -195,7 +213,7 @@ const SYNTHETIC_USER_TURN_ENVELOPE = new RegExp(
195
213
  * prompt — the whole block must strip to emptiness to stop being one.
196
214
  */
197
215
  function isSyntheticUserText(text: string): boolean {
198
- let remainder = text;
216
+ let remainder = text.replace(SYNTHETIC_USER_TURN_LEAD_IN, '');
199
217
  for (;;) {
200
218
  const match = SYNTHETIC_USER_TURN_ENVELOPE.exec(remainder);
201
219
  if (match === null) break;
@@ -204,17 +222,33 @@ function isSyntheticUserText(text: string): boolean {
204
222
  return remainder.trim() === '';
205
223
  }
206
224
 
225
+ /**
226
+ * Whether this row is a message another Claude session injected, not the person speaking.
227
+ *
228
+ * The CLI writes such a row as `isMeta: true` with `origin.kind === 'peer'` and
229
+ * `turnOrigin === 'peer'`. Checking the origin first is what makes the rule independent of the
230
+ * envelope's prose and attributes; the text fallback in {@link isSyntheticUserText} covers
231
+ * older rows that predate the origin fields.
232
+ */
233
+ function isPeerInjectedRow(row: UnknownRecord): boolean {
234
+ const origin = row.origin;
235
+ if (isRecord(origin) && origin.kind === 'peer') return true;
236
+ return row.turnOrigin === 'peer';
237
+ }
238
+
207
239
  /**
208
240
  * Whether one row is a real prompt — a person's message, not a tool result and not a
209
241
  * harness-injected synthetic turn.
210
242
  *
211
243
  * Claude records tool results as `user` rows. Treating those as turn boundaries would split a
212
244
  * single turn at every tool call, so the boundary is a row that carries non-empty text. A
213
- * `<task-notification>` row also carries non-empty text, but nobody typed it: counting it as a
214
- * prompt makes a pending ask look answered and shifts the digest's turn boundary.
245
+ * `<task-notification>` or cross-session `user` row also carries non-empty text, but nobody
246
+ * typed it: counting it as a prompt makes a pending ask look answered and shifts the digest's
247
+ * turn boundary.
215
248
  */
216
249
  export function isUserPromptRow(row: UnknownRecord): boolean {
217
250
  if (transcriptRowRole(row) !== 'user') return false;
251
+ if (isPeerInjectedRow(row)) return false;
218
252
  const texts = rowContentBlocks(row)
219
253
  .filter((block) => block.type === 'text')
220
254
  .map(blockText)
@@ -311,7 +311,7 @@ test('AC1: the producer writes the snapshot and diff, and throttles a second tri
311
311
  const target = {
312
312
  projectId: CLOUD_PROJECT_ID,
313
313
  fleetProjectId: FLEET_PROJECT_ID,
314
- title: 'CloudCLI',
314
+ title: 'Cloudpit',
315
315
  sessionId: 'session-42',
316
316
  };
317
317
 
@@ -202,6 +202,19 @@ test('AC3: an invalid URI or revision is a 400, not a stored object', async () =
202
202
  });
203
203
  assert.equal(badSeenUri.status, 400);
204
204
 
205
+ // The retired 2.x spelling is not a valid address any more, even in its well-formed shape.
206
+ const retiredSpelling = await fetch(`${baseUrl}/api/observation/seen`, {
207
+ method: 'POST',
208
+ headers: { 'content-type': 'application/json' },
209
+ body: JSON.stringify({ uri: 'cloudcli://session/retired', revision: 1 }),
210
+ });
211
+ assert.equal(retiredSpelling.status, 400);
212
+ const retiredWatch = await fetch(
213
+ `${baseUrl}/api/observation/watch/${encodeURIComponent('cloudcli://session/retired')}`,
214
+ { method: 'PUT' },
215
+ );
216
+ assert.equal(retiredWatch.status, 400);
217
+
205
218
  const badRevision = await fetch(`${baseUrl}/api/observation/seen`, {
206
219
  method: 'POST',
207
220
  headers: { 'content-type': 'application/json' },
@@ -229,3 +229,61 @@ test('AC2: past the cap the wall sorts red > attention > ok by recent revision a
229
229
  'attention entries are newest-first, so the last SHOWN one is the second-oldest',
230
230
  );
231
231
  });
232
+
233
+ // ---------------------------------------------------------------------------
234
+ // 3.0 — one spelling: the legacy cloudcli:// read and storage fallback are gone
235
+ // ---------------------------------------------------------------------------
236
+
237
+ const LEGACY_AT = 3_000_000;
238
+
239
+ /** Seeds a row exactly as the 2.0 writer would have left it: the storage key is `cloudcli://`. */
240
+ function seedLegacyObject(uri: string, kind: 'session' | 'architecture', revision: number): void {
241
+ const db = getConnection();
242
+ db.prepare(
243
+ `INSERT INTO observed_objects (
244
+ uri, kind, title, status_state, status_reason, digest_json, revision, updated_at,
245
+ provenance_producer, provenance_tier, provenance_evaluated_at
246
+ ) VALUES (?, ?, ?, 'attention', 'waiting', '{}', ?, ?, 'legacy-producer', 'deterministic', ?)`,
247
+ ).run(uri, kind, `${kind} fixture`, revision, LEGACY_AT, LEGACY_AT);
248
+ db.prepare(
249
+ 'INSERT INTO observed_revisions (uri, revision, at, delta_items_json) VALUES (?, ?, ?, ?)',
250
+ ).run(uri, revision, LEGACY_AT, JSON.stringify([`legacy-${uri}`]));
251
+ }
252
+
253
+ test('3.0: a legacy cloudcli:// read is refused and never falls back to a legacy storage row', () => {
254
+ // A 2.0-era row, seeded under the legacy key exactly as the 2.0 writer left it.
255
+ seedLegacyObject('cloudcli://session/a', 'session', 2);
256
+ seedLegacyObject('cloudcli://architecture/b', 'architecture', 4);
257
+
258
+ assert.equal(store.getObject('cloudcli://session/a'), null, 'the retired spelling no longer parses');
259
+ assert.equal(store.getObject('cloudpit://session/a'), null, 'the store no longer reads the legacy key');
260
+ assert.equal(store.getObject('cloudcli://architecture/b'), null);
261
+ assert.equal(store.getObject('cloudpit://architecture/b'), null);
262
+
263
+ assert.throws(
264
+ () => store.listRevisions('cloudcli://session/a', 0),
265
+ /must be one of cloudpit:\/\/session\/<id>/,
266
+ 'the retired spelling is not a valid address for a read',
267
+ );
268
+ assert.deepEqual(store.getWall(USER_ID).entries, [], 'a legacy-key row does not surface on the wall');
269
+ });
270
+
271
+ test('3.0: a write addresses only the canonical key; a legacy row is not continued', () => {
272
+ seedLegacyObject('cloudcli://session/chain', 'session', 2);
273
+
274
+ const written = store.writeRevision({
275
+ uri: 'cloudpit://session/chain',
276
+ kind: 'session',
277
+ title: 'Fresh canonical chain',
278
+ status: { state: 'ok' },
279
+ provenance: { producer: PRODUCER, tier: 'deterministic' },
280
+ });
281
+
282
+ assert.equal(written.uri, 'cloudpit://session/chain', 'the reading is canonical');
283
+ assert.equal(written.revision, 1, 'the legacy row is not the canonical chain');
284
+ assert.equal(store.getObject('cloudpit://session/chain')?.revision, 1);
285
+ assert.deepEqual(
286
+ store.listRevisions('cloudpit://session/chain', 0).map((revision) => revision.revision),
287
+ [1],
288
+ );
289
+ });
@@ -87,7 +87,7 @@ function makeProject(overrides: Partial<ProjectTruthProjectRef> = {}): ProjectTr
87
87
  return {
88
88
  projectId: CLOUD_PROJECT_ID,
89
89
  projectPath: '/data/home/yale/work/claudecodeui',
90
- title: 'CloudCLI',
90
+ title: 'Cloudpit',
91
91
  fleetProjectId: FLEET_PROJECT_ID,
92
92
  deploy: { healthUrl: 'http://127.0.0.1:3001', ref: 'HEAD' },
93
93
  ...overrides,
@@ -237,7 +237,7 @@ test('AC1: a snapshot fixture yields all five layers, each from its own source',
237
237
  assert.ok(!reading.deltaItems.includes('落地 landed earlier'));
238
238
  });
239
239
 
240
- test('AC1: a non-CloudCLI project reads deploy as not-applicable, is not green and is not reddened by the reader', () => {
240
+ test('AC1: a non-Cloudpit project reads deploy as not-applicable, is not green and is not reddened by the reader', () => {
241
241
  const reading = build({
242
242
  project: makeProject({ fleetProjectId: 'plantuml-js', deploy: null }),
243
243
  // Deliberately a failing reader: a project with no deployment concept must not be turned
@@ -1574,6 +1574,81 @@ test('option identity: the model-provided id is NEVER written into the decision'
1574
1574
  }
1575
1575
  });
1576
1576
 
1577
+ // ---------------------------------------------------------------------------------------------
1578
+ // Multi-subdecision bundling: the prompt asks for 3–5 composite options, and the pipeline keeps them
1579
+ //
1580
+ // When one assistant message asks three INDEPENDENT design points (each A-or-B), flattening them
1581
+ // into 6 half-direction options breaks the cockpit's single-select UI: a person can pick only one
1582
+ // of six. The model is therefore asked to bundle them into 3–5 self-consistent combinations. This
1583
+ // case pins that the parser/summary pipeline accepts that shape unchanged (the parser imposes no
1584
+ // option-count ceiling) and that stable ids still derive from the labels.
1585
+ // ---------------------------------------------------------------------------------------------
1586
+
1587
+ /** The model answer for the multi-subdecision fixture: three composite options, whole coverage. */
1588
+ const COMPOSITE_ANSWER = {
1589
+ ask: '三个设计点(①是否拆包、②是否改接口、③是否补迁移)各选 A 还是 B,请一次定下组合。',
1590
+ situation: '助手一次问了三个相互独立的子决定,每个都要在 A 还是 B 之间选。',
1591
+ incomplete: false,
1592
+ recommendedOptionId: null,
1593
+ judgeOptionId: null,
1594
+ judgeReason: null,
1595
+ options: [
1596
+ {
1597
+ id: 'bundle-all-a',
1598
+ label: '①A+②A+③A',
1599
+ does: '①保持单包;②接口不变;③现在补迁移。',
1600
+ tags: [{ kind: 'consequence', text: '全部保持现状' }],
1601
+ source: 'assistant',
1602
+ },
1603
+ {
1604
+ id: 'bundle-all-b',
1605
+ label: '①B+②B+③B',
1606
+ does: '①拆包;②改接口;③不补迁移。',
1607
+ tags: [{ kind: 'risk', text: '改动最大' }],
1608
+ source: 'assistant',
1609
+ },
1610
+ {
1611
+ id: 'bundle-mixed',
1612
+ label: '①A+②B+③A',
1613
+ does: '①保持单包;②改接口;③现在补迁移。',
1614
+ tags: [{ kind: 'benefit', text: '接口与迁移先落地' }],
1615
+ source: 'assistant',
1616
+ },
1617
+ ],
1618
+ };
1619
+
1620
+ test('multi-subdecision: three composite options survive the digest verbatim, ids derived from labels', async () => {
1621
+ const summariser = createSessionAskDecisionDigest({
1622
+ readSettings: () => STUB_SETTINGS,
1623
+ complete: async () => completion(JSON.stringify(COMPOSITE_ANSWER)),
1624
+ });
1625
+
1626
+ const reading = await summariser.summarize({
1627
+ sessionId: SESSION_ID,
1628
+ sessionTitle: '会话',
1629
+ askId: `${SESSION_ID}:a1`,
1630
+ revision: 1,
1631
+ assistantText:
1632
+ '三个设计点,每个都要选 A 还是 B:\n①是否拆包?A 保持单包,B 拆包。\n②是否改接口?A 不变,B 改。\n③是否补迁移?A 现在补,B 不补。\n请一次定下组合。',
1633
+ context:
1634
+ '[助手] 三个设计点,每个都要选 A 还是 B:\n①是否拆包?A 保持单包,B 拆包。\n②是否改接口?A 不变,B 改。\n③是否补迁移?A 现在补,B 不补。\n请一次定下组合。',
1635
+ });
1636
+
1637
+ assert.equal(reading.state, 'evaluated', 'the pipeline accepts the bundled shape');
1638
+ if (reading.state !== 'evaluated') return;
1639
+ assert.equal(reading.options.length, 3, 'three bundled options are kept, not flattened into six');
1640
+ assert.deepEqual(
1641
+ reading.options.map((option) => option.label),
1642
+ COMPOSITE_ANSWER.options.map((option) => option.label),
1643
+ 'the labels keep the declared order, verbatim',
1644
+ );
1645
+ assert.deepEqual(
1646
+ reading.options.map((option) => option.id),
1647
+ COMPOSITE_ANSWER.options.map((option) => stableOptionId(option.label)),
1648
+ 'bundling does not change identity: each id is still derived from the label',
1649
+ );
1650
+ });
1651
+
1577
1652
  // ---------------------------------------------------------------------------------------------
1578
1653
  // Reliable session.answered: every answered ask, across rounds and across restarts, exactly once
1579
1654
  // ---------------------------------------------------------------------------------------------
@@ -2217,6 +2292,120 @@ test('AC3: turn-end states no session.answered for a <task-notification> row', a
2217
2292
  assert.deepEqual(ledger.pending, [{ askId: `${SESSION_ID}:a1`, messageId: 'a1' }], 'the ask stays open');
2218
2293
  });
2219
2294
 
2295
+ // ---------------------------------------------------------------------------------------------
2296
+ // A cross-session message is not a user prompt either: it must not answer a pending ask
2297
+ // ---------------------------------------------------------------------------------------------
2298
+
2299
+ /**
2300
+ * One peer row exactly as the CLI persists another session's SendMessage: a fixed lead-in, an
2301
+ * attribute-bearing envelope, and the row markers that say a machine injected it.
2302
+ */
2303
+ function crossSessionRow(id: string): string {
2304
+ return JSON.stringify({
2305
+ type: 'user',
2306
+ uuid: id,
2307
+ isMeta: true,
2308
+ promptSource: 'system',
2309
+ turnOrigin: 'peer',
2310
+ origin: { kind: 'peer', from: 'uds:/tmp/peer.sock', name: 'peer' },
2311
+ message: {
2312
+ role: 'user',
2313
+ content:
2314
+ 'Another Claude session sent a message:\n'
2315
+ + '<cross-session-message from="uds:/tmp/peer.sock" from-name="peer" from-mode="bypass">\n'
2316
+ + '选 2\n'
2317
+ + '</cross-session-message>',
2318
+ },
2319
+ });
2320
+ }
2321
+
2322
+ /** The transcript up to a question, then another session's message — no answer from the person. */
2323
+ function askThenCrossSession(): string {
2324
+ return `${[
2325
+ stringContentRow('user', 'u1', '开始'),
2326
+ stringContentRow('assistant', 'a1', '先补测试还是先改实现?'),
2327
+ crossSessionRow('p1'),
2328
+ ].join('\n')}\n`;
2329
+ }
2330
+
2331
+ test('a cross-session-message row after a pending ask leaves it current, not settled', () => {
2332
+ const scan = readSessionAsks(askThenCrossSession(), SESSION_ID);
2333
+
2334
+ assert.deepEqual(scan.settled, [], 'another session speaking is not the person answering');
2335
+ assert.equal(scan.current?.askId, `${SESSION_ID}:a1`, 'the ask is still the open question');
2336
+ assert.equal(scan.current?.revision, 1);
2337
+ });
2338
+
2339
+ test('a real user message still settles the ask, even after a cross-session-message row', () => {
2340
+ const raw = `${[
2341
+ stringContentRow('user', 'u1', '开始'),
2342
+ stringContentRow('assistant', 'a1', '先补测试还是先改实现?'),
2343
+ crossSessionRow('p1'),
2344
+ stringContentRow('user', 'u2', '先补测试'),
2345
+ stringContentRow('assistant', 'a2', '补完了,还要先跑一遍吗?'),
2346
+ ].join('\n')}\n`;
2347
+ const scan = readSessionAsks(raw, SESSION_ID);
2348
+
2349
+ assert.deepEqual(
2350
+ scan.settled,
2351
+ [{ askId: `${SESSION_ID}:a1`, answerMessageId: 'u2' }],
2352
+ 'the answer is the person\'s row, never the peer row',
2353
+ );
2354
+ assert.equal(scan.current?.askId, `${SESSION_ID}:a2`, 'the tail ask is the newer question');
2355
+ });
2356
+
2357
+ test('turn-end states no session.answered for a cross-session-message row', async () => {
2358
+ const objects = new Map<string, ObservedObject>();
2359
+ objects.set(formatSessionUri(SESSION_ID), {
2360
+ uri: formatSessionUri(SESSION_ID),
2361
+ kind: 'session',
2362
+ title: '会话:选中方案',
2363
+ status: { state: 'attention' },
2364
+ digest: {
2365
+ activity: 'waiting',
2366
+ askEvents: {
2367
+ answered: [],
2368
+ asking: [`${SESSION_ID}:a1:1`],
2369
+ pending: [{ askId: `${SESSION_ID}:a1`, messageId: 'a1' }],
2370
+ },
2371
+ },
2372
+ blindSpots: [],
2373
+ revision: 1,
2374
+ updatedAt: CLOCK,
2375
+ provenance: { producer: 'session-digest', tier: 'deterministic', evaluatedAt: CLOCK },
2376
+ });
2377
+ const harness = createHarness(JSON.stringify(RECOMMENDED_ANSWER), { objects });
2378
+ harness.setTranscript(askThenCrossSession());
2379
+
2380
+ await harness.turnEnd();
2381
+
2382
+ assert.deepEqual(
2383
+ harness.events.filter((event) => event.kind === 'session.answered'),
2384
+ [],
2385
+ 'no answer is stated when only another session spoke',
2386
+ );
2387
+ const ledger = readSessionAskEventLedger(objects.get(formatSessionUri(SESSION_ID))?.digest);
2388
+ assert.deepEqual(ledger.pending, [{ askId: `${SESSION_ID}:a1`, messageId: 'a1' }], 'the ask stays open');
2389
+
2390
+ // The person's own reply still settles it exactly once, with the person's message id. The
2391
+ // assistant turn after it is what a real stop hook sees; without it the transcript ends on a
2392
+ // user row and the digest is unevaluated for a different reason.
2393
+ const secondRaw = `${askThenCrossSession()}${stringContentRow('user', 'u2', '先补测试')}\n${stringContentRow('assistant', 'a2', '好的,先补测试。')}\n`;
2394
+ harness.setTranscript(secondRaw);
2395
+ await harness.turnEnd();
2396
+ const answered = harness.events.filter((event) => event.kind === 'session.answered');
2397
+ assert.equal(answered.length, 1);
2398
+ assert.deepEqual((answered[0]?.data as { messageId?: string } | undefined)?.messageId, 'u2');
2399
+
2400
+ // A replay of the same transcript must not state the answer twice.
2401
+ await harness.turnEnd();
2402
+ assert.equal(
2403
+ harness.events.filter((event) => event.kind === 'session.answered').length,
2404
+ 1,
2405
+ 'the stated answer survives a turn-end replay',
2406
+ );
2407
+ });
2408
+
2220
2409
  // ---------------------------------------------------------------------------------------------
2221
2410
  // The ask digest's JSON contract: its own output ceiling, fences, and a loud truncation
2222
2411
  // ---------------------------------------------------------------------------------------------
@@ -42,6 +42,7 @@ import {
42
42
  analyzeAsking,
43
43
  analyzeAssistantAsk,
44
44
  buildSessionDigest,
45
+ isUserPromptRow,
45
46
  parseTestOutput,
46
47
  SESSION_DIGEST_CONCLUSION_CHARS,
47
48
  } from '../session-digest.js';
@@ -1204,3 +1205,45 @@ test('AC7: the live 62d959c0 fixture is a real question — no retraction, and t
1204
1205
  assert.equal(answered.length, 1, 'the live gap was a missing session.answered');
1205
1206
  assert.deepEqual(answered[0]?.data, { askId, messageId: 'u2' });
1206
1207
  });
1208
+
1209
+ test('a cross-session peer row is not a user prompt, in either the marker or the text shape', () => {
1210
+ const envelope = 'Another Claude session sent a message:\n'
1211
+ + '<cross-session-message from="uds:/tmp/peer.sock" from-name="peer" from-mode="bypass">\n'
1212
+ + '选 2\n'
1213
+ + '</cross-session-message>';
1214
+
1215
+ // The live shape: the CLI marks the row as machine-injected and names the peer origin.
1216
+ assert.equal(
1217
+ isUserPromptRow({
1218
+ type: 'user',
1219
+ isMeta: true,
1220
+ promptSource: 'system',
1221
+ turnOrigin: 'peer',
1222
+ origin: { kind: 'peer', from: 'uds:/tmp/peer.sock' },
1223
+ message: { role: 'user', content: envelope },
1224
+ }),
1225
+ false,
1226
+ 'the person did not type the other session\'s message',
1227
+ );
1228
+
1229
+ // An older row without the origin marker still reads as synthetic from its text alone.
1230
+ assert.equal(
1231
+ isUserPromptRow({ type: 'user', message: { role: 'user', content: envelope } }),
1232
+ false,
1233
+ 'the envelope and its fixed lead-in strip to emptiness',
1234
+ );
1235
+
1236
+ // A person's own words stay a prompt, including when they sit beside a metadata block.
1237
+ assert.equal(
1238
+ isUserPromptRow({ type: 'user', message: { role: 'user', content: '选 1,立任务' } }),
1239
+ true,
1240
+ );
1241
+ assert.equal(
1242
+ isUserPromptRow({
1243
+ type: 'user',
1244
+ message: { role: 'user', content: '<system-reminder>note</system-reminder>\n选 1,立任务' },
1245
+ }),
1246
+ true,
1247
+ 'a real block beside an injected one still means the person spoke',
1248
+ );
1249
+ });
@@ -2,6 +2,19 @@ export { sessionSynchronizerService } from './services/session-synchronizer.serv
2
2
  export { providerSkillsService } from './services/skills.service.js';
3
3
  export { providerMcpService } from './services/mcp.service.js';
4
4
  export { providerRuntimeService, createProviderRuntimeService } from './services/provider-runtime.service.js';
5
+ // The Codex upstream-provider adapter and its two injection compilers. They are
6
+ // public because the Settings module's AC-467 criterion drives the end-to-end
7
+ // path across a module boundary (where the boundaries lint requires this
8
+ // barrel), and because a settings surface that renders the same advanced fields
9
+ // needs one compiler rather than a second copy. `codexRuntime` is the per-run
10
+ // entry the registry composes, re-exported for the same criterion.
11
+ export { codexRuntime } from './list/codex/codex-runtime.provider.js';
12
+ export { CodexProviderModels, CODEX_PREDEFINED_MODELS } from './list/codex/codex-models.provider.js';
13
+ export {
14
+ codexOptionsForProvider,
15
+ codexProviderSpawnArgs,
16
+ type CodexModelLimits,
17
+ } from './list/codex/codex-provider-injection.js';
5
18
  // ControlStopTaskOutcome: the answer the runtime gateway's stop-task verb gives
6
19
  // (`requested` / `unsupported` / `timeout` / `error`). Exported so the websocket
7
20
  // control handler types its pass-through against the one union rather than
@@ -1087,7 +1087,7 @@ export function deriveBackgroundWorkTrigger(
1087
1087
  // The address a resident process answers to used to be *computed* here and
1088
1088
  // handed to the CLI as `--name`. That is gone: in the CLI's ladder a launch name
1089
1089
  // is both the session's `agent-name` and its `custom-title`, so writing one
1090
- // pinned the session's name at launch, let a CloudCLI-invented address outrank
1090
+ // pinned the session's name at launch, let a Cloudpit-invented address outrank
1091
1091
  // an `ai-title` the session had earned, and grew another `-<id6>` on every
1092
1092
  // restart. The app no longer names anything; it reads the name the CLI derived
1093
1093
  // for the process, in `readCliSessionRegistration` below.
@@ -58,7 +58,21 @@ export type CodexModelDescriptor = {
58
58
  hidden?: boolean;
59
59
  isDefault?: boolean;
60
60
  defaultReasoningEffort?: string;
61
- supportedReasoningEfforts?: Array<{ reasoningEffort?: string }>;
61
+ supportedReasoningEfforts?: Array<{ reasoningEffort?: string; description?: string }>;
62
+ /**
63
+ * A custom catalog (`model_catalog_url`) may declare the model's window and
64
+ * auto-compaction threshold per entry. Codex 0.166's own `model/list` reply
65
+ * does not carry them, so they stay optional and are read from either the
66
+ * Codex-native snake_case or the app's camelCase spelling.
67
+ */
68
+ modelContextWindow?: number;
69
+ modelAutoCompactTokenLimit?: number;
70
+ };
71
+
72
+ /** Reads a positive integer quantity a catalog entry may report; anything else is absent. */
73
+ const readPositiveModelQuantity = (value: unknown): number | undefined => {
74
+ const parsed = typeof value === 'number' ? value : Number(value);
75
+ return Number.isInteger(parsed) && parsed > 0 ? parsed : undefined;
62
76
  };
63
77
 
64
78
  const readModelDescriptor = (value: unknown): CodexModelDescriptor | null => {
@@ -72,11 +86,25 @@ const readModelDescriptor = (value: unknown): CodexModelDescriptor | null => {
72
86
 
73
87
  const efforts = Array.isArray(record.supportedReasoningEfforts)
74
88
  ? record.supportedReasoningEfforts
75
- .map((entry) => readOptionalString(readObjectRecord(entry)?.reasoningEffort))
76
- .filter((effort): effort is string => effort !== undefined)
77
- .map((reasoningEffort) => ({ reasoningEffort }))
89
+ .map((entry) => {
90
+ const effort = readOptionalString(readObjectRecord(entry)?.reasoningEffort);
91
+ if (effort === undefined) return undefined;
92
+ const description = readOptionalString(readObjectRecord(entry)?.description);
93
+ return {
94
+ reasoningEffort: effort,
95
+ ...(description === undefined ? {} : { description }),
96
+ };
97
+ })
98
+ .filter((effort): effort is { reasoningEffort: string; description?: string } => effort !== undefined)
78
99
  : undefined;
79
100
 
101
+ const contextWindow = readPositiveModelQuantity(
102
+ record.model_context_window ?? record.modelContextWindow,
103
+ );
104
+ const autoCompactTokenLimit = readPositiveModelQuantity(
105
+ record.model_auto_compact_token_limit ?? record.modelAutoCompactTokenLimit,
106
+ );
107
+
80
108
  return {
81
109
  id,
82
110
  displayName: readOptionalString(record.displayName),
@@ -85,6 +113,10 @@ const readModelDescriptor = (value: unknown): CodexModelDescriptor | null => {
85
113
  isDefault: typeof record.isDefault === 'boolean' ? record.isDefault : undefined,
86
114
  defaultReasoningEffort: readOptionalString(record.defaultReasoningEffort),
87
115
  supportedReasoningEfforts: efforts,
116
+ ...(contextWindow === undefined ? {} : { modelContextWindow: contextWindow }),
117
+ ...(autoCompactTokenLimit === undefined
118
+ ? {}
119
+ : { modelAutoCompactTokenLimit: autoCompactTokenLimit }),
88
120
  };
89
121
  };
90
122
 
@@ -278,7 +310,7 @@ async function withAppServer<T>(
278
310
  // in the stable protocol; only `beforeTurnId` and the turn-listing methods
279
311
  // are gated behind `experimentalApi`, and neither is needed here.
280
312
  await call('initialize', {
281
- clientInfo: { name: 'cloudcli', title: 'CloudCLI', version: '1' },
313
+ clientInfo: { name: 'cloudpit', title: 'Cloudpit', version: '1' },
282
314
  capabilities: {},
283
315
  });
284
316
  child.stdin?.write(`${JSON.stringify({ jsonrpc: '2.0', method: 'initialized', params: {} })}\n`);
@@ -213,7 +213,7 @@ export class CodexAppServerConnection {
213
213
  ? { experimentalApi: true }
214
214
  : {};
215
215
  await this.request('initialize', {
216
- clientInfo: { name: 'cloudcli', title: 'CloudCLI', version: '1' },
216
+ clientInfo: { name: 'cloudpit', title: 'Cloudpit', version: '1' },
217
217
  capabilities,
218
218
  });
219
219
  this.experimentalApiDeclaredFlag = capabilities.experimentalApi === true;
@@ -123,6 +123,13 @@ export type ResidentSession = {
123
123
  export type PendingResidentLaunch = {
124
124
  providerSessionId: string | null;
125
125
  threadDefaults: CodexThreadDefaults;
126
+ /**
127
+ * The process launch this session's host must be spawned with, or null for
128
+ * the driver-wide launch. Compiled by `codex-resident-provider-launch.ts`:
129
+ * Codex 0.166 checks the process-global provider on every turn and again on
130
+ * resume, so a bound session needs `-c model_provider` at spawn time.
131
+ */
132
+ launch: CodexAppServerLaunch | null;
126
133
  };
127
134
 
128
135
  /** Reads `{ thread: { id } }` from a thread start/resume result. */
@@ -176,7 +183,7 @@ export function residentThreadDefaults(options: AnyRecord): CodexThreadDefaults
176
183
  }
177
184
 
178
185
  /**
179
- * The `thread/start` fields a CloudCLI permission mode asks for.
186
+ * The `thread/start` fields a Cloudpit permission mode asks for.
180
187
  *
181
188
  * `thread/start` takes a `sandbox` *string* (`workspace-write`,
182
189
  * `danger-full-access`), while live settings take an object `sandboxPolicy`
@@ -239,11 +246,13 @@ export function threadDefaultsFromLaunchOptions(options: AnyRecord): CodexThread
239
246
  /**
240
247
  * The MCP server name this server's gateway is injected under.
241
248
  *
242
- * `cloudcli` is the name the settings page tells a Claude user to connect
243
- * (`claude mcp add --transport http cloudcli …`), so a Codex session and a Claude
249
+ * `cloudpit` is the name the settings page tells a Claude user to connect
250
+ * (`claude mcp add --transport http cloudpit …`), so a Codex session and a Claude
244
251
  * session name the same backend the same way; nothing in the driver reads it.
252
+ * An existing `claude mcp add … cloudcli` entry keeps working: the server name is
253
+ * a client-local key and authentication comes from the URL plus the PAT.
245
254
  */
246
- export const CODEX_MCP_GATEWAY_SERVER_NAME = 'cloudcli';
255
+ export const CODEX_MCP_GATEWAY_SERVER_NAME = 'cloudpit';
247
256
 
248
257
  /**
249
258
  * The child environment variable that carries the gateway credential.
@@ -253,7 +262,7 @@ export const CODEX_MCP_GATEWAY_SERVER_NAME = 'cloudcli';
253
262
  * never appears in the process arguments — an argv token is visible to every
254
263
  * `ps` on the machine and to the app-server's own logs.
255
264
  */
256
- export const CODEX_MCP_GATEWAY_TOKEN_ENV = 'CLOUDCLI_MCP_GATEWAY_TOKEN';
265
+ export const CODEX_MCP_GATEWAY_TOKEN_ENV = 'CLOUDPIT_MCP_GATEWAY_TOKEN';
257
266
 
258
267
  /** One `-c key=value` config override, with the value written as a TOML basic string. */
259
268
  function codexConfigArg(key: string, value: string): string[] {
@@ -274,8 +283,8 @@ function tomlBasicString(value: string): string {
274
283
  *
275
284
  * When a target is present the child is told about one extra HTTP MCP server:
276
285
  *
277
- * -c mcp_servers.cloudcli.url="http://127.0.0.1:<port>/mcp"
278
- * -c mcp_servers.cloudcli.bearer_token_env_var="CLOUDCLI_MCP_GATEWAY_TOKEN"
286
+ * -c mcp_servers.cloudpit.url="http://127.0.0.1:<port>/mcp"
287
+ * -c mcp_servers.cloudpit.bearer_token_env_var="CLOUDPIT_MCP_GATEWAY_TOKEN"
279
288
  *
280
289
  * and the token is placed in the child's environment. That is the same config
281
290
  * shape `codex.mcp` writes to `config.toml` (`url` + `bearer_token_env_var`), so
@@ -349,7 +358,7 @@ export function threadParams(
349
358
  * app-server, copied from its own refusal: "Supported values are: 'none',
350
359
  * 'minimal', 'low', 'medium', 'high', 'xhigh', and 'max'."
351
360
  *
352
- * CloudCLI's vocabulary is wider than this: `default` is its "use the model's
361
+ * Cloudpit's vocabulary is wider than this: `default` is its "use the model's
353
362
  * default" sentinel (`DEFAULT_EFFORT_VALUE` in `src/shared/constants.ts`) and
354
363
  * `ultracode` is a Claude-only pseudo-level. Neither is a codex effort, and the
355
364
  * server rejects the whole `turn/start` with a 400 for one unknown value, so a
@@ -365,7 +374,7 @@ const CODEX_EFFORT_VALUES: Readonly<Record<string, true>> = {
365
374
  max: true,
366
375
  };
367
376
 
368
- /** The codex `effort` for one CloudCLI effort, or undefined to leave the field off. */
377
+ /** The codex `effort` for one Cloudpit effort, or undefined to leave the field off. */
369
378
  function codexTurnEffort(effort: unknown): string | undefined {
370
379
  return typeof effort === 'string' && CODEX_EFFORT_VALUES[effort] === true ? effort : undefined;
371
380
  }