@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
@@ -3,10 +3,17 @@
3
3
  *
4
4
  * GOAL-053 left the Cloudpit pipeline DARK: the resolver, the settings fallback, the dual asset
5
5
  * roots and the scope alias table existed, but every runtime default still pointed at the legacy
6
- * layout. This file drives the flip — default `~/.cloudpit`, settings read-legacy/write-new,
7
- * uploads to the new asset root, both observation URI spellings, the new MCP server name, the two
8
- * scope vocabularies and the two service-worker cache prefixes — against temp homes and fakes, so
9
- * it never reads or writes the developer's real `~`.
6
+ * layout. This file drives the flip — default `~/.cloudpit`, one-time settings migration, uploads
7
+ * to the new asset root, both observation URI spellings, the new MCP server name, the two scope
8
+ * vocabularies and the two service-worker cache prefixes — against temp homes and fakes, so it
9
+ * never reads or writes the developer's real `~`.
10
+ *
11
+ * v3.0 retired the runtime fallbacks: `defaultRoot: 'legacy'`, the failed-migration fallback to
12
+ * `~/.cloudcli`, the legacy settings read fallback and the `CLOUDCLI_*` environment spellings are
13
+ * all gone. This batch also retires the identity contracts: the cloudcli deep link and observation
14
+ * URI spelling, the two legacy MCP names, the `cloudcli:*` OAuth scope spelling and the
15
+ * `claude-ui-*` service-worker cache family. The arms below assert the one-time migrations still
16
+ * work and that the retired paths are ignored.
10
17
  *
11
18
  * Run directly:
12
19
  * npx tsx --tsconfig server/tsconfig.json --test server/shared/tests/cloudpit-runtime-flip.test.ts
@@ -29,7 +36,6 @@ import {
29
36
  readMcpPrincipal,
30
37
  } from '@/modules/mcp-gateway/index.js';
31
38
  import {
32
- LEGACY_MCP_SERVER_NAMES,
33
39
  MCP_SERVER_NAME,
34
40
  mcpServerNamesToRemove,
35
41
  } from '@/modules/browser-use/index.js';
@@ -47,7 +53,11 @@ import {
47
53
  import { createBrandEnvReader } from '@/shared/brand.js';
48
54
  import { resolveDataRoots } from '@/shared/data-root.js';
49
55
  import { getImageAssetsReadDirs, getImageAssetsWriteDir } from '@/shared/image-attachments.js';
50
- import { ACCESS_TOKEN_SCOPES, CLOUDPIT_ACCESS_TOKEN_SCOPES } from '@/shared/mcp-contract/index.js';
56
+ import {
57
+ ACCEPTED_ACCESS_TOKEN_SCOPES,
58
+ ACCESS_TOKEN_SCOPES,
59
+ CLOUDPIT_ACCESS_TOKEN_SCOPES,
60
+ } from '@/shared/mcp-contract/index.js';
51
61
  import { defaultServerSettingsPath } from '@/shared/settings-file.js';
52
62
 
53
63
  const APPLICATION_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..', '..', '..');
@@ -62,7 +72,7 @@ function temporaryHome(prefix: string): string {
62
72
  return mkdtempSync(path.join(os.tmpdir(), prefix));
63
73
  }
64
74
 
65
- test('AC2/AC11: the Cloudpit default root migrates a legacy layout, and the legacy mode stays', () => {
75
+ test('AC2/AC11 (v3.0): the Cloudpit default root migrates a legacy layout; no legacy mode is selectable', () => {
66
76
  const homeDir = temporaryHome('cloudpit-runtime-root-');
67
77
  try {
68
78
  const legacyRoot = path.join(homeDir, '.cloudcli');
@@ -71,7 +81,6 @@ test('AC2/AC11: the Cloudpit default root migrates a legacy layout, and the lega
71
81
  writeFileSync(path.join(legacyRoot, 'cockpit-card-feedback.json'), '{"kept":true}\n');
72
82
 
73
83
  const plan = resolveDataRoots({
74
- defaultRoot: 'cloudpit',
75
84
  env: {},
76
85
  homeDir,
77
86
  version: 'criterion',
@@ -99,11 +108,16 @@ test('AC2/AC11: the Cloudpit default root migrates a legacy layout, and the lega
99
108
  // The legacy root is only ever READ.
100
109
  assert.equal(readFileSync(path.join(legacyRoot, 'auth.db'), 'utf8'), 'legacy-database');
101
110
 
102
- // AC11's negative control: the legacy mode is still selectable and is unchanged.
103
- const legacyPlan = resolveDataRoots({ defaultRoot: 'legacy', env: {}, homeDir });
104
- assert.equal(legacyPlan.activeRoot, legacyRoot);
105
- assert.equal(legacyPlan.reason, 'default-legacy');
106
- assert.equal(legacyPlan.migrated, false);
111
+ // AC11's negative control: the retired `defaultRoot: 'legacy'` option no longer moves the
112
+ // default back to the old root — it is not part of the resolver's public shape, so a caller
113
+ // that still passes it keeps the Cloudpit root.
114
+ const ignoredMode = resolveDataRoots({
115
+ defaultRoot: 'legacy',
116
+ env: {},
117
+ homeDir,
118
+ } as unknown as Parameters<typeof resolveDataRoots>[0]);
119
+ assert.equal(ignoredMode.activeRoot, path.join(homeDir, '.cloudpit'));
120
+ assert.equal(ignoredMode.reason, 'default-already-migrated');
107
121
  } finally {
108
122
  rmSync(homeDir, { recursive: true, force: true });
109
123
  }
@@ -114,8 +128,7 @@ test('AC2/AC11: the Cloudpit default root migrates a legacy layout, and the lega
114
128
  mkdirSync(failingLegacyRoot, { recursive: true });
115
129
  writeFileSync(path.join(failingLegacyRoot, 'auth.db'), 'legacy-database');
116
130
 
117
- const fallback = resolveDataRoots({
118
- defaultRoot: 'cloudpit',
131
+ const failure = resolveDataRoots({
119
132
  env: {},
120
133
  homeDir: failingHome,
121
134
  backupDatabase: () => {
@@ -123,9 +136,10 @@ test('AC2/AC11: the Cloudpit default root migrates a legacy layout, and the lega
123
136
  },
124
137
  });
125
138
 
126
- assert.equal(fallback.activeRoot, failingLegacyRoot);
127
- assert.equal(fallback.reason, 'fallback-after-failure');
128
- assert.equal(fallback.migrated, false);
139
+ assert.equal(failure.activeRoot, path.join(failingHome, '.cloudpit'), 'no fallback to ~/.cloudcli');
140
+ assert.equal(failure.reason, 'migration-failed');
141
+ assert.equal(failure.migrated, false);
142
+ assert.match(failure.migrationError ?? '', /SQLITE_BUSY/);
129
143
  assert.equal(
130
144
  existsSync(path.join(failingHome, '.cloudpit')),
131
145
  false,
@@ -142,8 +156,8 @@ test('AC3: the bootstrap and the CLI derive the default database from the resolv
142
156
  const indexSource = readApplicationFile('server/index.ts');
143
157
 
144
158
  assert.ok(
145
- loadEnvSource.includes("resolveDataRoots({ defaultRoot: 'cloudpit' })"),
146
- 'load-env.ts must resolve the Cloudpit default',
159
+ loadEnvSource.includes('resolveDataRoots()'),
160
+ 'load-env.ts must resolve the one Cloudpit default',
147
161
  );
148
162
  assert.ok(
149
163
  loadEnvSource.includes('process.env.DATABASE_PATH = DATA_ROOTS.authDatabasePath'),
@@ -155,7 +169,7 @@ test('AC3: the bootstrap and the CLI derive the default database from the resolv
155
169
  );
156
170
 
157
171
  assert.ok(
158
- cliModuleSource.includes("resolveDataRoots({ defaultRoot: 'cloudpit', homeDir: homeDirectory })"),
172
+ cliModuleSource.includes('resolveDataRoots({ homeDir: homeDirectory })'),
159
173
  'cli.module.ts must derive its default database path from the resolver',
160
174
  );
161
175
  assert.ok(
@@ -179,7 +193,7 @@ test('AC3: the bootstrap and the CLI derive the default database from the resolv
179
193
  );
180
194
  });
181
195
 
182
- test('AC4/AC11: settings read the legacy file but always write the Cloudpit path', () => {
196
+ test('AC4/AC11 (v3.0): the legacy settings file is copied once, then only the Cloudpit file is read', () => {
183
197
  const homeDir = temporaryHome('cloudpit-runtime-settings-');
184
198
  try {
185
199
  const newDefault = path.join(homeDir, '.config', 'cloudpit', 'server.settings.json');
@@ -191,21 +205,40 @@ test('AC4/AC11: settings read the legacy file but always write the Cloudpit path
191
205
  legacyDefault,
192
206
  `${JSON.stringify({ cockpit: { sessionStart: { model: 'legacy-model', effort: 'high' } } }, null, 2)}\n`,
193
207
  );
208
+ assert.equal(existsSync(newDefault), false, 'the Cloudpit file does not exist before the first boot');
194
209
 
210
+ // The first boot copies the legacy file to the Cloudpit path and reads the new one.
195
211
  const settings = loadServerSettings({ homeDir, env: {} });
196
212
  assert.equal(settings.cockpit.sessionStart.model, 'legacy-model');
197
213
  assert.equal(settings.cockpit.sessionStart.effort, 'high');
198
- assert.deepEqual(settings.problems, [], 'a legacy fallback is not a configuration problem');
214
+ assert.deepEqual(settings.problems, []);
215
+ assert.equal(existsSync(newDefault), true, 'the first boot must create the Cloudpit settings file');
216
+ assert.deepEqual(
217
+ readFileSync(newDefault),
218
+ readFileSync(legacyDefault),
219
+ 'the one-time migration copies the legacy document verbatim',
220
+ );
199
221
 
200
222
  const boot = readCockpitSessionStartBoot();
201
223
  assert.ok(boot, 'the boot loader must record its reading');
202
- assert.equal(boot.path, legacyDefault, 'the effective values come from the legacy file');
203
- assert.equal(boot.writePath, newDefault, 'a save must land in the Cloudpit default');
224
+ assert.equal(boot.path, newDefault, 'the effective values come from the Cloudpit file');
225
+ assert.equal(boot.writePath, newDefault, 'a save lands in the same Cloudpit file');
204
226
 
205
227
  const target = resolveServerSettingsFileTarget({ homeDir, env: {} });
206
- assert.equal(target.path, legacyDefault);
207
- assert.equal(target.writePath, newDefault);
208
- assert.equal(target.explicit, false);
228
+ assert.deepEqual(target, { path: newDefault, writePath: newDefault, explicit: false });
229
+
230
+ // Editing the legacy file afterwards has no effect: only the Cloudpit file is read.
231
+ writeFileSync(
232
+ legacyDefault,
233
+ `${JSON.stringify({ cockpit: { sessionStart: { model: 'edited-legacy', effort: 'low' } } })}\n`,
234
+ );
235
+ assert.equal(loadServerSettings({ homeDir, env: {} }).cockpit.sessionStart.model, 'legacy-model');
236
+
237
+ // A save made after the copy is never clobbered by a later resolution (idempotent migration).
238
+ const savedDocument = `${JSON.stringify({ cockpit: { sessionStart: { model: 'saved-cloudpit' } } }, null, 2)}\n`;
239
+ writeFileSync(newDefault, savedDocument);
240
+ resolveServerSettingsFileTarget({ homeDir, env: {} });
241
+ assert.equal(readFileSync(newDefault, 'utf8'), savedDocument, 'the second run must not overwrite the user file');
209
242
 
210
243
  // Explicit overrides are unchanged: the named file is both read and written.
211
244
  const explicitPath = path.join(homeDir, 'operator', 'custom.settings.json');
@@ -216,11 +249,6 @@ test('AC4/AC11: settings read the legacy file but always write the Cloudpit path
216
249
  env: { SERVER_SETTINGS_PATH: explicitPath },
217
250
  });
218
251
  assert.deepEqual(byEnvironment, { path: explicitPath, writePath: explicitPath, explicit: true });
219
-
220
- // With both files present the Cloudpit default wins.
221
- mkdirSync(path.dirname(newDefault), { recursive: true });
222
- writeFileSync(newDefault, `${JSON.stringify({ cockpit: { sessionStart: { model: 'new-model' } } })}\n`);
223
- assert.equal(loadServerSettings({ homeDir, env: {} }).cockpit.sessionStart.model, 'new-model');
224
252
  } finally {
225
253
  rmSync(homeDir, { recursive: true, force: true });
226
254
  }
@@ -258,7 +286,7 @@ test('AC5/AC11: uploads write the Cloudpit root, the legacy root stays readable'
258
286
  }
259
287
  });
260
288
 
261
- test('AC6: both protocols are declared/registered and both observation URI spellings parse', () => {
289
+ test('AC6 (v3.0): cloudpit is the only deep link and the only observation URI spelling', () => {
262
290
  const packageJson = JSON.parse(readApplicationFile('package.json')) as {
263
291
  build: {
264
292
  protocols: Array<{ name: string; schemes: string[] }>;
@@ -266,7 +294,9 @@ test('AC6: both protocols are declared/registered and both observation URI spell
266
294
  };
267
295
  };
268
296
  const protocolSchemes = packageJson.build.protocols.flatMap((entry) => entry.schemes);
269
- assert.ok(protocolSchemes.includes('cloudcli'), 'the CloudCLI scheme must stay declared');
297
+ // The cloudcli scheme stays DECLARED for the third-party `cloudcli://auth/callback`; it is
298
+ // no longer a deep link this build registers at runtime.
299
+ assert.ok(protocolSchemes.includes('cloudcli'), 'the auth-callback scheme must stay declared');
270
300
  assert.ok(protocolSchemes.includes('cloudpit'), 'the Cloudpit scheme must be declared');
271
301
  const macSchemes = packageJson.build.mac.extendInfo.CFBundleURLTypes.flatMap(
272
302
  (entry) => entry.CFBundleURLSchemes,
@@ -274,32 +304,34 @@ test('AC6: both protocols are declared/registered and both observation URI spell
274
304
  assert.ok(macSchemes.includes('cloudcli') && macSchemes.includes('cloudpit'));
275
305
 
276
306
  const electronSource = readApplicationFile('electron/main.js');
277
- // Both schemes must live in the single registered-scheme list, and the loop must push every
278
- // entry through setAsDefaultProtocolClient (packaged and dev branches alike).
279
- assert.match(electronSource, /const DEEP_LINK_SCHEMES = \['cloudcli', 'cloudpit'\];/);
307
+ // 3.0 registers exactly one deep-link scheme; the callback protocol is parsed separately.
308
+ assert.match(electronSource, /const DEEP_LINK_SCHEMES = \['cloudpit'\];/);
309
+ assert.match(electronSource, /const CALLBACK_PROTOCOL = 'cloudcli';/);
280
310
  const registerSource = electronSource.slice(
281
311
  electronSource.indexOf('function registerProtocolHandler'),
282
312
  );
283
313
  assert.ok(registerSource.includes('for (const scheme of DEEP_LINK_SCHEMES)'));
284
- assert.ok(
285
- registerSource.includes('app.setAsDefaultProtocolClient(scheme'),
286
- 'both schemes must reach setAsDefaultProtocolClient',
287
- );
314
+ assert.ok(registerSource.includes('app.setAsDefaultProtocolClient(scheme'));
288
315
 
289
- const legacyParsed = parseObservationUri('cloudcli://session/x');
316
+ // 3.0 owns one observation spelling. The canonical one still parses; the retired 2.x read
317
+ // spelling is a null, not a normalization.
290
318
  const cloudpitParsed = parseObservationUri('cloudpit://session/x');
291
- assert.ok(legacyParsed && cloudpitParsed);
292
- assert.deepEqual(cloudpitParsed, legacyParsed);
293
- assert.equal(cloudpitParsed.uri, 'cloudcli://session/x', 'the canonical spelling stays legacy');
294
- assert.equal(cloudpitParsed.scheme, 'cloudcli');
295
- assert.equal(formatSessionUri('x'), 'cloudcli://session/x');
296
- assert.equal(formatArchitectureUri('project-1'), 'cloudcli://architecture/project-1');
297
- assert.equal(parseObservationUri('cloudpit://architecture/project-1')?.uri, 'cloudcli://architecture/project-1');
319
+ assert.ok(cloudpitParsed);
320
+ assert.equal(cloudpitParsed.uri, 'cloudpit://session/x');
321
+ assert.equal(cloudpitParsed.scheme, 'cloudpit');
322
+ assert.equal(parseObservationUri('cloudcli://session/x'), null, 'the 2.x session spelling is retired');
323
+ assert.equal(
324
+ parseObservationUri('cloudcli://architecture/project-1'),
325
+ null,
326
+ 'the 2.x architecture spelling is retired',
327
+ );
328
+ assert.equal(formatSessionUri('x'), 'cloudpit://session/x');
329
+ assert.equal(formatArchitectureUri('project-1'), 'cloudpit://architecture/project-1');
298
330
 
299
331
  // The two compilers carry separate copies of the grammar; the accepted-scheme line must be
300
332
  // textually identical so a later edit cannot widen one side only.
301
333
  const regexLineOf = (source: string): string => {
302
- const line = source.split('\n').find((entry) => entry.includes('const CLOUDCLI_URI = new RegExp('));
334
+ const line = source.split('\n').find((entry) => entry.includes('const CLOUDPIT_URI = new RegExp('));
303
335
  assert.ok(line, 'the URI grammar line must exist');
304
336
  return line.trim();
305
337
  };
@@ -309,21 +341,41 @@ test('AC6: both protocols are declared/registered and both observation URI spell
309
341
  );
310
342
 
311
343
  const storeSource = readApplicationFile('server/modules/observation/observation-store.ts');
312
- assert.ok(storeSource.includes('cloudpit://session/<id>'), 'the INVALID_URI message names both spellings');
344
+ assert.ok(storeSource.includes('cloudpit://session/<id>'), 'the INVALID_URI message names the grammar');
345
+ assert.equal(
346
+ storeSource.includes('cloudcli://session/<id>'),
347
+ false,
348
+ 'the INVALID_URI message no longer offers the retired spelling',
349
+ );
313
350
  });
314
351
 
315
- test('AC7/AC11: MCP registers the Cloudpit name and still cleans both legacy names', () => {
352
+ test('AC6b (v3.0): the R14 itemRef formatters keep the legacy spelling, outside the observation grammar', () => {
353
+ // R14 is an item-addressing contract persisted on messages/cards, NOT the observation URI
354
+ // grammar retired above. A blanket `cloudcli://` deletion must not reach these two files.
355
+ const briefFormatter = readApplicationFile('server/modules/cockpit/cockpit-brief-result.ts');
356
+ assert.ok(
357
+ briefFormatter.includes('`cloudcli://session/${input.sessionId}`'),
358
+ 'the brief itemRef formatter must keep writing cloudcli://session/<id>',
359
+ );
360
+ const replyFormatter = readApplicationFile(
361
+ 'src/modules/chat-transcript/utils/transcript/replyItems.ts',
362
+ );
363
+ assert.ok(
364
+ replyFormatter.includes('`cloudcli://session/${address.sessionId}/msg/${address.messageId}#item-${address.ordinal}`'),
365
+ 'the reply-item formatter must keep writing cloudcli://session/<id>/msg/<messageId>#item-<n>',
366
+ );
367
+ // The retired observation grammar rejects the same prefix: the two contracts stay separate.
368
+ assert.equal(parseObservationUri('cloudcli://session/x'), null);
369
+ });
370
+
371
+ test('AC7 (v3.0): MCP registers and cleans exactly the Cloudpit name', () => {
316
372
  assert.equal(MCP_SERVER_NAME, 'cloudpit-browser');
317
- assert.deepEqual([...LEGACY_MCP_SERVER_NAMES], ['cloudcli-browser', 'cloudcli-browser-use']);
318
- assert.deepEqual(mcpServerNamesToRemove(), [
319
- 'cloudpit-browser',
320
- 'cloudcli-browser',
321
- 'cloudcli-browser-use',
322
- ]);
323
-
324
- // Negative control: a name outside the current + legacy set is never a cleanup target.
373
+ assert.deepEqual(mcpServerNamesToRemove(), ['cloudpit-browser']);
374
+
375
+ // Negative control: neither a third-party name nor a retired spelling is a cleanup target.
325
376
  assert.equal(mcpServerNamesToRemove().includes('experimental-browser'), false);
326
- assert.equal(LEGACY_MCP_SERVER_NAMES.includes('experimental-browser'), false);
377
+ assert.equal(mcpServerNamesToRemove().includes('cloudcli-browser'), false);
378
+ assert.equal(mcpServerNamesToRemove().includes('cloudcli-browser-use'), false);
327
379
 
328
380
  const entrySource = readApplicationFile('server/modules/cli/browser-use-mcp.ts');
329
381
  assert.match(
@@ -363,30 +415,35 @@ function principalForScopes(scopes: string[]) {
363
415
  return readMcpPrincipal(response);
364
416
  }
365
417
 
366
- test('AC8/AC11: both scope vocabularies are issued and judged; unknown scopes stay refused', () => {
418
+ test('AC8 (v3.0): the advertised and accepted vocabulary is the eight Cloudpit scopes only', () => {
367
419
  const metadata = buildAuthorizationServerMetadata({
368
420
  baseUrl: 'https://cloudpit.example.test',
369
421
  dcrMode: 'off',
370
422
  });
371
423
  assert.equal(CLOUDPIT_ACCESS_TOKEN_SCOPES.length, 8);
372
- assert.equal(ACCESS_TOKEN_SCOPES.length, 8);
373
- for (const scope of ACCESS_TOKEN_SCOPES) {
374
- assert.ok(metadata.scopes_supported.includes(scope), `AS metadata must advertise ${scope}`);
375
- }
376
- for (const scope of CLOUDPIT_ACCESS_TOKEN_SCOPES) {
377
- assert.ok(metadata.scopes_supported.includes(scope), `AS metadata must advertise ${scope}`);
424
+ assert.equal(ACCESS_TOKEN_SCOPES.length, 8, 'the canonical table keeps its eight names');
425
+ assert.deepEqual(
426
+ [...metadata.scopes_supported],
427
+ [...CLOUDPIT_ACCESS_TOKEN_SCOPES],
428
+ 'AS metadata advertises the wire vocabulary, once',
429
+ );
430
+ assert.equal(metadata.scopes_supported.length, 8);
431
+ for (const scope of metadata.scopes_supported) {
432
+ assert.ok(scope.startsWith('cloudpit:'), `AS metadata must advertise a cloudpit scope (saw ${scope})`);
378
433
  }
379
- assert.equal(metadata.scopes_supported.length, 16);
380
434
 
381
- // Dedupe on the canonical name, store the spelling the caller asked for.
382
- assert.deepEqual(normalizeAccessTokenScopes(['cloudcli:read', 'cloudpit:read']), {
383
- ok: true,
384
- scopes: ['cloudcli:read'],
385
- });
386
- assert.deepEqual(normalizeAccessTokenScopes(['cloudpit:read', 'cloudcli:read']), {
387
- ok: true,
388
- scopes: ['cloudpit:read'],
389
- });
435
+ // ACCEPTED is the one wire spelling: the canonical names are internal, never a request.
436
+ assert.deepEqual([...ACCEPTED_ACCESS_TOKEN_SCOPES], [...CLOUDPIT_ACCESS_TOKEN_SCOPES]);
437
+ assert.equal(ACCEPTED_ACCESS_TOKEN_SCOPES.includes('cloudcli:read'), false);
438
+
439
+ // New spelling issues; the retired 2.x spelling is refused at the boundary.
440
+ assert.deepEqual(normalizeAccessTokenScopes(['cloudpit:read']), { ok: true, scopes: ['cloudpit:read'] });
441
+ assert.deepEqual(normalizeAccessTokenScopes(['cloudcli:read']), { ok: false });
442
+ assert.deepEqual(
443
+ normalizeAccessTokenScopes(['cloudcli:read', 'cloudcli:session:send']),
444
+ { ok: false },
445
+ 'a request naming any retired spelling is refused',
446
+ );
390
447
  assert.deepEqual(normalizeAccessTokenScopes(['cloudpit:read', 'cloudpit:session:send']), {
391
448
  ok: true,
392
449
  scopes: ['cloudpit:read', 'cloudpit:session:send'],
@@ -394,25 +451,22 @@ test('AC8/AC11: both scope vocabularies are issued and judged; unknown scopes st
394
451
  assert.deepEqual(normalizeAccessTokenScopes(['cloudcli:admin']), { ok: false });
395
452
  assert.deepEqual(normalizeAccessTokenScopes(['cloudpit:unknown']), { ok: false });
396
453
 
397
- // AC11's old-token arm: the legacy spelling is still accepted and still satisfies the legacy
398
- // required scope. The principal is built from the minted scope list, so dropping the old
399
- // spelling from the accepted table would refuse the mint here.
400
- const legacyMinted = normalizeAccessTokenScopes(['cloudcli:read']);
401
- assert.deepEqual(legacyMinted, { ok: true, scopes: ['cloudcli:read'] });
402
- const legacyPrincipal = principalForScopes(legacyMinted.ok ? legacyMinted.scopes : []);
403
- assert.ok(legacyPrincipal);
404
- assert.ok(legacyPrincipal.scopes.includes('cloudcli:read'));
405
-
406
- // A token minted with the Cloudpit spelling is judged by the same old literal.
454
+ // A token minted with the new spelling is judged by the canonical `requiredScopes` literals.
407
455
  const cloudpitMinted = normalizeAccessTokenScopes(['cloudpit:read', 'cloudpit:session:send']);
408
456
  assert.deepEqual(cloudpitMinted, { ok: true, scopes: ['cloudpit:read', 'cloudpit:session:send'] });
409
457
  const cloudpitPrincipal = principalForScopes(cloudpitMinted.ok ? cloudpitMinted.scopes : []);
410
458
  assert.ok(cloudpitPrincipal);
411
459
  assert.deepEqual(cloudpitPrincipal.scopes, ['cloudcli:read', 'cloudcli:session:send']);
412
460
  assert.ok(cloudpitPrincipal.scopes.includes('cloudcli:read'));
461
+
462
+ // The old-token arm: a token row minted before 3.0 still carries the canonical spelling and
463
+ // still authenticates and satisfies the required scope (no forced invalidation).
464
+ const legacyPrincipal = principalForScopes(['cloudcli:read']);
465
+ assert.ok(legacyPrincipal);
466
+ assert.ok(legacyPrincipal.scopes.includes('cloudcli:read'));
413
467
  });
414
468
 
415
- test('AC9: activation deletes both cache families and keeps unrelated caches', async () => {
469
+ test('AC9 (v3.0): activation deletes only the cloudpit- family and keeps unrelated caches', async () => {
416
470
  const cacheNames = [
417
471
  'cloudpit-v1',
418
472
  'cloudpit-old',
@@ -457,64 +511,49 @@ test('AC9: activation deletes both cache families and keeps unrelated caches', a
457
511
  activate({ waitUntil: (promise) => { pending = promise; } });
458
512
  await pending;
459
513
 
460
- assert.deepEqual([...deleted].sort(), ['claude-ui-legacy', 'claude-ui-v3', 'cloudpit-old']);
461
- assert.equal(deleted.includes('cloudpit-v1'), false);
514
+ assert.deepEqual([...deleted].sort(), ['cloudpit-old'], 'only this worker\'s own prefix is purged');
515
+ assert.equal(deleted.includes('cloudpit-v1'), false, 'the current cache is never deleted');
516
+ assert.equal(deleted.includes('claude-ui-v3'), false, 'the retired 1.x family is no longer cleaned');
517
+ assert.equal(deleted.includes('claude-ui-legacy'), false);
462
518
  assert.equal(deleted.includes('voice-client-asr-model-v1'), false);
463
519
  assert.equal(deleted.includes('other'), false);
464
520
  assert.equal(claimed, true);
465
521
  });
466
522
 
467
- test('AC10/AC11: CLOUDPIT_* is the canonical environment spelling, CLOUDCLI_* stays compatible', () => {
468
- // New name only: no warning, and the reading names the canonical key.
469
- const newOnlyWarnings: string[] = [];
523
+ test('AC10/AC11 (v3.0): CLOUDPIT_* is the only environment spelling read', () => {
524
+ // New name only: the reading names the canonical key.
470
525
  const newOnly = createBrandEnvReader({
471
526
  env: { CLOUDPIT_HOME: '/new/home' },
472
- warn: (message) => newOnlyWarnings.push(message),
473
527
  }).read('HOME');
474
528
  assert.deepEqual(newOnly, { value: '/new/home', source: 'new', key: 'CLOUDPIT_HOME' });
475
- assert.deepEqual(newOnlyWarnings, [], 'the canonical spelling must not warn');
476
529
 
477
- // Both set: the Cloudpit spelling wins and the legacy one is not even read.
478
- const bothWarnings: string[] = [];
530
+ // Both set: the Cloudpit spelling wins and the legacy one is not read.
479
531
  const both = createBrandEnvReader({
480
532
  env: { CLOUDPIT_HOME: '/new/home', CLOUDCLI_HOME: '/legacy/home' },
481
- warn: (message) => bothWarnings.push(message),
482
533
  }).read('HOME');
483
534
  assert.deepEqual(both, { value: '/new/home', source: 'new', key: 'CLOUDPIT_HOME' });
484
- assert.deepEqual(bothWarnings, [], 'a legacy value shadowed by the new spelling must not warn');
485
535
 
486
- // Legacy name only: still honoured, marked as legacy, warned exactly once per key.
487
- const legacyWarnings: string[] = [];
488
- const legacyReader = createBrandEnvReader({
489
- env: { CLOUDCLI_HOME: '/legacy/home' },
490
- warn: (message) => legacyWarnings.push(message),
491
- });
492
- assert.deepEqual(legacyReader.read('HOME'), {
493
- value: '/legacy/home',
494
- source: 'legacy',
495
- key: 'CLOUDCLI_HOME',
496
- });
497
- assert.equal(legacyWarnings.length, 1, 'using the legacy spelling warns once');
498
- assert.match(legacyWarnings[0], /CLOUDCLI_HOME is deprecated; set CLOUDPIT_HOME instead\./);
499
- legacyReader.read('HOME');
500
- assert.equal(legacyWarnings.length, 1, 'a second read of the same key stays silent');
536
+ // Legacy name only: no fallback any more — the read is absent (the shipped default applies).
537
+ assert.deepEqual(
538
+ createBrandEnvReader({ env: { CLOUDCLI_HOME: '/legacy/home' } }).read('HOME'),
539
+ { value: undefined, source: 'absent', key: 'CLOUDPIT_HOME' },
540
+ );
501
541
 
502
542
  // Absent: the reading still names the canonical key the operator should set.
503
- assert.deepEqual(createBrandEnvReader({ env: {}, warn: () => {} }).read('HOME'), {
543
+ assert.deepEqual(createBrandEnvReader({ env: {} }).read('HOME'), {
504
544
  value: undefined,
505
545
  source: 'absent',
506
546
  key: 'CLOUDPIT_HOME',
507
547
  });
508
548
 
509
- // The production resolver wires the same precedence: the Cloudpit variable wins, the legacy
510
- // one is the fallback. This is the arm the CLI/bootstrap actually consume.
549
+ // The production resolver reads the same one spelling: CLOUDPIT_HOME wins, and a
550
+ // CLOUDCLI_HOME-only environment selects the default `~/.cloudpit` root instead.
511
551
  const homeDir = temporaryHome('cloudpit-runtime-env-');
512
552
  try {
513
553
  const newRoot = path.join(homeDir, 'explicit-new');
514
554
  const legacyRoot = path.join(homeDir, 'explicit-legacy');
515
555
  assert.equal(
516
556
  resolveDataRoots({
517
- defaultRoot: 'cloudpit',
518
557
  env: { CLOUDPIT_HOME: newRoot, CLOUDCLI_HOME: legacyRoot },
519
558
  homeDir,
520
559
  }).activeRoot,
@@ -522,9 +561,9 @@ test('AC10/AC11: CLOUDPIT_* is the canonical environment spelling, CLOUDCLI_* st
522
561
  'CLOUDPIT_HOME must win over CLOUDCLI_HOME',
523
562
  );
524
563
  assert.equal(
525
- resolveDataRoots({ defaultRoot: 'cloudpit', env: { CLOUDCLI_HOME: legacyRoot }, homeDir }).activeRoot,
526
- legacyRoot,
527
- 'CLOUDCLI_HOME must stay a compatible fallback',
564
+ resolveDataRoots({ env: { CLOUDCLI_HOME: legacyRoot }, homeDir }).activeRoot,
565
+ path.join(homeDir, '.cloudpit'),
566
+ 'CLOUDCLI_HOME must no longer select a root',
528
567
  );
529
568
  } finally {
530
569
  rmSync(homeDir, { recursive: true, force: true });
@@ -1,12 +1,12 @@
1
1
  {
2
- "measuredAt": "2026-10-31",
2
+ "measuredAt": "2026-11-02",
3
3
  "scope": "every non-test .ts/.tsx under src/ (tests/ directories pruned, *.test.*/*.spec.* dropped), paths relative to src/",
4
- "note": "Committed baseline for the frontend import-cycle ratchets (tasks/gap-routine-architecture-analysis-src-import-cycles-unpinned.md, tasks/gap-routine-architecture-analysis-src-module-scc-cockpit-hub.md). A RATCHET: cycleGroups and moduleSccGroups may only SHRINK. A group closed by a refactor is lowered explicitly here and in the matching in-file pin in the same commit; never raise or add a group to accommodate a red reading. `cycleGroups` is the DIRECTORY reading; `moduleSccGroups` is the MODULE reading (`modules/<name>` nodes collapsed from the same walk). `readings` records the tree the pin was measured on (same walk, resolver and Tarjan scanner as AC-394's server budget, with src/ as the scan root so @/ resolves to src/); the counts are provenance, not a gate, because a new acyclic import is ordinary feature work.",
4
+ "note": "Committed baseline for the frontend import-cycle ratchets (tasks/gap-routine-architecture-analysis-src-import-cycles-unpinned.md, tasks/gap-routine-architecture-analysis-src-module-scc-cockpit-hub.md). A RATCHET: cycleGroups and moduleSccGroups may only SHRINK. A group closed by a refactor is lowered explicitly here and in the matching in-file pin in the same commit; never raise or add a group to accommodate a red reading. `cycleGroups` is the DIRECTORY reading; `moduleSccGroups` is the MODULE reading (`modules/<name>` nodes collapsed from the same walk). `readings` records the tree the pin was measured on (same walk, resolver and Tarjan scanner as AC-394's server budget, with src/ as the scan root so @/ resolves to src/); the counts are provenance, not a gate, because a new acyclic import is ordinary feature work. RE-READ 2026-11-02 (task gap-routine-architecture-analysis-god-package-src-cockpit): the cockpit god-package split moved the card and workspace files into src/modules/cockpit/cards and src/modules/cockpit/workspace; because those files already imported each other and the root barrel, the one cockpit dependency web now spans four cockpit directories plus project-workspace. cycleGroups was re-measured and re-pinned member-for-member (not dropped); the module-level SCC is unchanged. The readings below were re-measured on the same tree.",
5
5
  "readings": {
6
- "files": 688,
7
- "staticFileEdges": 2144,
8
- "dynamicFileEdges": 3,
9
- "nodeCount": 108,
6
+ "files": 703,
7
+ "staticFileEdges": 2467,
8
+ "dynamicFileEdges": 0,
9
+ "nodeCount": 122,
10
10
  "unresolvedInternal": 100,
11
11
  "nonLiteralDynamic": 2
12
12
  },
@@ -24,7 +24,9 @@
24
24
  ],
25
25
  [
26
26
  "modules/cockpit",
27
+ "modules/cockpit/cards",
27
28
  "modules/cockpit/hooks",
29
+ "modules/cockpit/workspace",
28
30
  "modules/project-workspace"
29
31
  ],
30
32
  [
@@ -6,6 +6,12 @@
6
6
  * 2026-10-30): chat/tools ↔ chat/tools/ContentRenderers ↔ chat/transcript;
7
7
  * cockpit ↔ cockpit/hooks ↔ project-workspace; git-panel ↔ git-panel/changes ↔
8
8
  * git-panel/history; architecture ↔ architecture/hooks; settings/hooks ↔ settings/tabs.
9
+ * RE-READ 2026-11-02 (task gap-routine-architecture-analysis-god-package-src-cockpit): the
10
+ * cockpit god-package split moved its card and workspace files into `cockpit/cards` and
11
+ * `cockpit/workspace`. Those files already imported each other, so the same dependency web is
12
+ * now read across four cockpit directories plus project-workspace; the group was re-measured and
13
+ * re-pinned member-for-member rather than dropped. This is the mandated re-read for a structural
14
+ * split, not a widened dependency: the module-level SCC below is unchanged.
9
15
  * The backend already had AC-394's directory budget, but `src` had no cycle criterion and
10
16
  * `.oxlintrc.json` enables no `import/no-cycle`, so those five could widen unmeasured.
11
17
  *
@@ -58,7 +64,9 @@ const BASELINE_PATH = path.join(TEST_DIR, 'frontend-import-cycle-budget.baseline
58
64
  */
59
65
  const CYCLE_GROUPS: readonly string[][] = [
60
66
  ['modules/chat/tools', 'modules/chat/tools/ContentRenderers', 'modules/chat/transcript'],
61
- ['modules/cockpit', 'modules/cockpit/hooks', 'modules/project-workspace'],
67
+ // Re-read after the cockpit god-package split (2026-11-02): the card, workspace and hooks
68
+ // directories share one dependency web with the root barrel and project-workspace.
69
+ ['modules/cockpit', 'modules/cockpit/cards', 'modules/cockpit/hooks', 'modules/cockpit/workspace', 'modules/project-workspace'],
62
70
  ['modules/git-panel', 'modules/git-panel/changes', 'modules/git-panel/history'],
63
71
  ['modules/architecture', 'modules/architecture/hooks'],
64
72
  ['modules/settings/hooks', 'modules/settings/tabs'],
@@ -483,8 +483,26 @@ test('AC2: a valid baseline dispatches known files longest-first, keeps the rest
483
483
  // (496 + 1 = 497 collected server test files). The goal branch's
484
484
  // gap-cloudpit-runtime-default-flip adds its criterion
485
485
  // server/shared/tests/cloudpit-runtime-flip.test.ts (497 + 1 = 498 collected server test
486
- // files). This fixture names 3 known files, so 498 - 3 = 495.
487
- assert.match(lines[0], /^test\.sh: server dispatch order=longest-first source=.* known=3 unknown=495$/);
486
+ // files), then codex-provider-config-surface added its criterion
487
+ // server/modules/settings/tests/codex-model-providers-settings.test.ts
488
+ // (498 + 1 = 499 collected server test files). Then
489
+ // gap-cloudpit-migrate-assets-rewrite added its criterion
490
+ // server/modules/cli/tests/asset-migration.service.test.ts
491
+ // (499 + 1 = 500 collected server test files). Then codex-model-entry-provider-binding
492
+ // added its criterion server/modules/providers/tests/codex-provider-model-binding.test.ts
493
+ // (500 + 1 = 501 collected server test files). Then codex-perrun-provider-injection
494
+ // added its criterion server/modules/providers/tests/codex-runtime-provider-injection.test.ts
495
+ // (501 + 1 = 502 collected server test files), then codex-session-provider-id-binding
496
+ // added its criterion server/modules/providers/tests/codex-session-provider-binding.test.ts
497
+ // (502 + 1 = 503 collected server test files), then codex-resident-provider-injection
498
+ // added its criterion server/modules/providers/tests/codex-resident-provider-injection.test.ts
499
+ // (503 + 1 = 504 collected server test files). Then codex-provider-import-user-profile added
500
+ // its criterion server/modules/settings/tests/codex-provider-import.test.ts
501
+ // (504 + 1 = 505 collected server test files), then codex-provider-advanced-capabilities
502
+ // added its criterion server/modules/settings/tests/codex-provider-advanced.test.ts
503
+ // (505 + 1 = 506 collected server test files). This fixture names 3 known files, so
504
+ // 506 - 3 = 503.
505
+ assert.match(lines[0], /^test\.sh: server dispatch order=longest-first source=.* known=3 unknown=503$/);
488
506
  } finally {
489
507
  rmSync(dir, { recursive: true, force: true });
490
508
  }
@@ -625,10 +643,26 @@ test('AC3: a broken baseline fails open to alphabetical order byte-for-byte, and
625
643
  // gap-effective-config-proc-request-layer added its criterion
626
644
  // server/modules/mcp-gateway/tests/knowledge-effective-config-launch-request.test.ts (496 + 1 = 497),
627
645
  // then the goal branch's gap-cloudpit-runtime-default-flip added
628
- // server/shared/tests/cloudpit-runtime-flip.test.ts (497 + 1 = 498)
629
- // — but this fixture names ONE known file, so 498 - 1 = 497 (AC2 reads 495 because its
630
- // fixture names 3; the 498 is the number the tree collects with these criteria).
631
- assert.match(vl[0], /^test\.sh: server dispatch order=longest-first source=.* known=1 unknown=497$/);
646
+ // server/shared/tests/cloudpit-runtime-flip.test.ts (497 + 1 = 498), then
647
+ // codex-provider-config-surface added
648
+ // server/modules/settings/tests/codex-model-providers-settings.test.ts (498 + 1 = 499), then
649
+ // gap-cloudpit-migrate-assets-rewrite added its criterion
650
+ // server/modules/cli/tests/asset-migration.service.test.ts (499 + 1 = 500), then
651
+ // codex-model-entry-provider-binding added
652
+ // server/modules/providers/tests/codex-provider-model-binding.test.ts (500 + 1 = 501), then
653
+ // codex-perrun-provider-injection added
654
+ // server/modules/providers/tests/codex-runtime-provider-injection.test.ts (501 + 1 = 502),
655
+ // then codex-session-provider-id-binding added
656
+ // server/modules/providers/tests/codex-session-provider-id-binding.test.ts (502 + 1 = 503),
657
+ // then codex-resident-provider-injection added
658
+ // server/modules/providers/tests/codex-resident-provider-injection.test.ts (503 + 1 = 504),
659
+ // then codex-provider-import-user-profile added
660
+ // server/modules/settings/tests/codex-provider-import.test.ts (504 + 1 = 505), then
661
+ // codex-provider-advanced-capabilities added
662
+ // server/modules/settings/tests/codex-provider-advanced.test.ts (505 + 1 = 506)
663
+ // — but this fixture names ONE known file, so 506 - 1 = 505 (AC2 reads 503 because its
664
+ // fixture names 3; the 506 is the number the tree collects with these criteria).
665
+ assert.match(vl[0], /^test\.sh: server dispatch order=longest-first source=.* known=1 unknown=505$/);
632
666
  } finally {
633
667
  rmSync(dir, { recursive: true, force: true });
634
668
  }