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