@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
@@ -0,0 +1,349 @@
1
+ /**
2
+ * `cloudpit migrate-assets` criterion file.
3
+ *
4
+ * Five arms drive the real command service against temp-home fixtures:
5
+ * dry-run writes nothing, rewrite is idempotent, conflicts are never
6
+ * overwritten, a failed path write rolls back to the pre-run bytes, and
7
+ * provider transcript references are reported as unrewritable.
8
+ *
9
+ * Run directly:
10
+ * npx tsx --tsconfig server/tsconfig.json --test server/modules/cli/tests/asset-migration.service.test.ts
11
+ */
12
+ import assert from 'node:assert/strict';
13
+ import { createHash } from 'node:crypto';
14
+ import {
15
+ existsSync,
16
+ mkdirSync,
17
+ mkdtempSync,
18
+ readdirSync,
19
+ readFileSync,
20
+ rmSync,
21
+ statSync,
22
+ writeFileSync,
23
+ } from 'node:fs';
24
+ import os from 'node:os';
25
+ import path from 'node:path';
26
+ import test from 'node:test';
27
+
28
+ import Database from 'better-sqlite3';
29
+
30
+ import {
31
+ createNodeAssetMigrationFileSystem,
32
+ } from '../asset-migration-files.js';
33
+ import {
34
+ createAssetMigrationService,
35
+ } from '../asset-migration.service.js';
36
+ import type { AssetMigrationReport } from '../asset-migration-report.js';
37
+ import {
38
+ createAppAssetPathStore,
39
+ type AssetPathStore,
40
+ } from '../asset-migration-store.js';
41
+
42
+ type TestContext = { after(callback: () => void): void };
43
+
44
+ type Fixture = {
45
+ root: string;
46
+ homeDir: string;
47
+ legacyRoot: string;
48
+ newRoot: string;
49
+ databasePath: string;
50
+ settingsPath: string;
51
+ };
52
+
53
+ function createFixture(t: TestContext): Fixture {
54
+ const root = mkdtempSync(path.join(os.tmpdir(), 'cloudpit-migrate-assets-'));
55
+ t.after(() => rmSync(root, { recursive: true, force: true }));
56
+ const homeDir = path.join(root, 'home');
57
+ const legacyRoot = path.join(homeDir, '.cloudcli', 'assets');
58
+ const newRoot = path.join(homeDir, '.cloudpit', 'assets');
59
+ mkdirSync(legacyRoot, { recursive: true });
60
+ return {
61
+ root,
62
+ homeDir,
63
+ legacyRoot,
64
+ newRoot,
65
+ databasePath: path.join(homeDir, '.cloudpit', 'auth.db'),
66
+ settingsPath: path.join(homeDir, '.config', 'cloudpit', 'server.settings.json'),
67
+ };
68
+ }
69
+
70
+ function writeFileWithDirectories(filePath: string, content: string): void {
71
+ mkdirSync(path.dirname(filePath), { recursive: true });
72
+ writeFileSync(filePath, content, 'utf8');
73
+ }
74
+
75
+ /** Every path under `root` with directories marked and files hashed. */
76
+ function snapshotTree(root: string): Record<string, string> {
77
+ const snapshot: Record<string, string> = {};
78
+ const walk = (directoryPath: string): void => {
79
+ if (!existsSync(directoryPath)) return;
80
+ for (const entryName of readdirSync(directoryPath)) {
81
+ const entryPath = path.join(directoryPath, entryName);
82
+ const relativePath = path.relative(root, entryPath).split(path.sep).join('/');
83
+ if (statSync(entryPath).isDirectory()) {
84
+ snapshot[`${relativePath}/`] = 'directory';
85
+ walk(entryPath);
86
+ } else {
87
+ snapshot[relativePath] = createHash('sha256')
88
+ .update(readFileSync(entryPath))
89
+ .digest('hex');
90
+ }
91
+ }
92
+ };
93
+ walk(root);
94
+ return snapshot;
95
+ }
96
+
97
+ function createOutput(): {
98
+ output: { log(message?: string): void; error(message?: string): void };
99
+ logMessages: string[];
100
+ errorMessages: string[];
101
+ } {
102
+ const logMessages: string[] = [];
103
+ const errorMessages: string[] = [];
104
+ return {
105
+ output: {
106
+ log: (message = '') => logMessages.push(message),
107
+ error: (message = '') => errorMessages.push(message),
108
+ },
109
+ logMessages,
110
+ errorMessages,
111
+ };
112
+ }
113
+
114
+ function readJsonReport(logMessages: string[]): AssetMigrationReport {
115
+ const rawReport = logMessages.find((message) => message.trimStart().startsWith('{'));
116
+ assert.ok(rawReport, `no JSON report in output: ${logMessages.join('\n')}`);
117
+ return JSON.parse(rawReport) as AssetMigrationReport;
118
+ }
119
+
120
+ function createStore(fixture: Fixture): AssetPathStore {
121
+ return createAppAssetPathStore({
122
+ databasePath: fixture.databasePath,
123
+ jsonFilePaths: [fixture.settingsPath],
124
+ now: () => new Date(2026, 10, 3, 12, 0, 0),
125
+ });
126
+ }
127
+
128
+ function createService(
129
+ fixture: Fixture,
130
+ pathStore: AssetPathStore,
131
+ capture = createOutput(),
132
+ ) {
133
+ return {
134
+ capture,
135
+ service: createAssetMigrationService({
136
+ environment: {},
137
+ homeDirectory: fixture.homeDir,
138
+ fileSystem: createNodeAssetMigrationFileSystem(),
139
+ pathStore,
140
+ output: capture.output,
141
+ }),
142
+ };
143
+ }
144
+
145
+ /** Seeds one SQLite row and one JSON document that both embed `legacyRoot`. */
146
+ function seedPersistedPaths(fixture: Fixture): { imagePath: string } {
147
+ const imagePath = path.join(fixture.legacyRoot, 'photo.png');
148
+ mkdirSync(path.dirname(fixture.databasePath), { recursive: true });
149
+ const database = new Database(fixture.databasePath);
150
+ try {
151
+ database.exec(`
152
+ CREATE TABLE IF NOT EXISTS scheduled_messages (
153
+ id TEXT PRIMARY KEY,
154
+ user_id INTEGER NOT NULL,
155
+ session_id TEXT NOT NULL,
156
+ content TEXT NOT NULL,
157
+ options TEXT NOT NULL DEFAULT '{}'
158
+ )
159
+ `);
160
+ database
161
+ .prepare('INSERT INTO scheduled_messages (id, user_id, session_id, content, options) VALUES (?, ?, ?, ?, ?)')
162
+ .run('scheduled-1', 1, 'session-1', 'hello', JSON.stringify({
163
+ attachments: [{ path: imagePath }],
164
+ }));
165
+ } finally {
166
+ database.close();
167
+ }
168
+ writeFileWithDirectories(
169
+ fixture.settingsPath,
170
+ `${JSON.stringify({ avatarPath: imagePath }, null, 2)}\n`,
171
+ );
172
+ return { imagePath };
173
+ }
174
+
175
+ function readScheduledOptions(databasePath: string): string {
176
+ const database = new Database(databasePath, { readonly: true });
177
+ try {
178
+ const row = database
179
+ .prepare('SELECT options FROM scheduled_messages WHERE id = ?')
180
+ .get('scheduled-1') as { options: string };
181
+ return row.options;
182
+ } finally {
183
+ database.close();
184
+ }
185
+ }
186
+
187
+ test('dry-run scans the legacy tree and persisted documents without writing anything', async (t) => {
188
+ const fixture = createFixture(t);
189
+ writeFileWithDirectories(path.join(fixture.legacyRoot, 'one.png'), 'one');
190
+ writeFileWithDirectories(path.join(fixture.legacyRoot, 'nested', 'two.pdf'), 'two');
191
+ const { imagePath } = seedPersistedPaths(fixture);
192
+ const before = snapshotTree(fixture.homeDir);
193
+ const { service, capture } = createService(fixture, createStore(fixture));
194
+
195
+ const exitCode = await service.execute(['--dry-run', '--json']);
196
+
197
+ assert.equal(exitCode, 0);
198
+ assert.deepEqual(snapshotTree(fixture.homeDir), before, 'a dry run must not create or modify a file');
199
+ const report = readJsonReport(capture.logMessages);
200
+ assert.equal(report.copied, 2);
201
+ assert.equal(report.skipped, 0);
202
+ assert.equal(report.rewritten, 2);
203
+ assert.deepEqual(report.conflicts, []);
204
+ assert.deepEqual(report.backupPaths, []);
205
+ assert.deepEqual(report.errors, []);
206
+ assert.equal(existsSync(path.join(fixture.newRoot, 'one.png')), false);
207
+ assert.match(readFileSync(fixture.settingsPath, 'utf8'), new RegExp(`"avatarPath": ${JSON.stringify(imagePath)}`));
208
+ });
209
+
210
+ test('--help and the bare command both print usage', async (t) => {
211
+ const fixture = createFixture(t);
212
+ const { service, capture } = createService(fixture, createStore(fixture));
213
+
214
+ assert.equal(await service.execute(['--help']), 0);
215
+ assert.match(capture.logMessages.join('\n'), /migrate-assets --dry-run/);
216
+ assert.match(capture.logMessages.join('\n'), /migrate-assets --rewrite/);
217
+
218
+ capture.logMessages.length = 0;
219
+ assert.equal(await service.execute([]), 1);
220
+ assert.match(capture.logMessages.join('\n'), /Usage:/);
221
+ });
222
+
223
+ test('--rewrite copies into the new root, keeps the legacy files, and is idempotent', async (t) => {
224
+ const fixture = createFixture(t);
225
+ writeFileWithDirectories(path.join(fixture.legacyRoot, 'one.png'), 'one');
226
+ writeFileWithDirectories(path.join(fixture.legacyRoot, 'two.pdf'), 'two');
227
+ const { service, capture } = createService(fixture, createStore(fixture));
228
+
229
+ assert.equal(await service.execute(['--rewrite', '--json']), 0);
230
+ const firstReport = readJsonReport(capture.logMessages);
231
+ assert.equal(firstReport.copied, 2);
232
+ assert.equal(firstReport.skipped, 0);
233
+ assert.equal(readFileSync(path.join(fixture.newRoot, 'one.png'), 'utf8'), 'one');
234
+ assert.equal(readFileSync(path.join(fixture.newRoot, 'two.pdf'), 'utf8'), 'two');
235
+ assert.equal(readFileSync(path.join(fixture.legacyRoot, 'one.png'), 'utf8'), 'one');
236
+ assert.equal(readFileSync(path.join(fixture.legacyRoot, 'two.pdf'), 'utf8'), 'two');
237
+
238
+ capture.logMessages.length = 0;
239
+ assert.equal(await service.execute(['--rewrite', '--json']), 0);
240
+ const secondReport = readJsonReport(capture.logMessages);
241
+ assert.equal(secondReport.copied, 0);
242
+ assert.equal(secondReport.skipped, 2, 'every file is skipped on the second run');
243
+ assert.deepEqual(secondReport.conflicts, []);
244
+ });
245
+
246
+ test('a conflicting target is never overwritten and is reported', async (t) => {
247
+ const fixture = createFixture(t);
248
+ writeFileWithDirectories(path.join(fixture.legacyRoot, 'photo.png'), 'legacy bytes');
249
+ writeFileWithDirectories(path.join(fixture.newRoot, 'photo.png'), 'newer bytes');
250
+ const { service, capture } = createService(fixture, createStore(fixture));
251
+
252
+ const exitCode = await service.execute(['--rewrite', '--json']);
253
+
254
+ assert.equal(exitCode, 0);
255
+ const report = readJsonReport(capture.logMessages);
256
+ assert.equal(report.copied, 0);
257
+ assert.deepEqual(report.conflicts, ['photo.png']);
258
+ assert.equal(readFileSync(path.join(fixture.newRoot, 'photo.png'), 'utf8'), 'newer bytes');
259
+ assert.equal(readFileSync(path.join(fixture.legacyRoot, 'photo.png'), 'utf8'), 'legacy bytes');
260
+ });
261
+
262
+ test('--rewrite rewrites app DB and JSON paths after taking a backup', async (t) => {
263
+ const fixture = createFixture(t);
264
+ const { imagePath } = seedPersistedPaths(fixture);
265
+ const beforeSettings = readFileSync(fixture.settingsPath, 'utf8');
266
+ const { service, capture } = createService(fixture, createStore(fixture));
267
+
268
+ const exitCode = await service.execute(['--rewrite', '--json']);
269
+
270
+ assert.equal(exitCode, 0);
271
+ const report = readJsonReport(capture.logMessages);
272
+ assert.equal(report.rewritten, 2);
273
+ assert.equal(report.backupPaths.length, 2, 'the database and the JSON state are both backed up');
274
+ for (const backupPath of report.backupPaths) {
275
+ assert.equal(existsSync(backupPath), true, `missing backup ${backupPath}`);
276
+ }
277
+
278
+ const expectedNewPath = path.join(fixture.newRoot, 'photo.png');
279
+ assert.equal(readFileSync(fixture.settingsPath, 'utf8'), beforeSettings.replace(imagePath, expectedNewPath));
280
+ assert.match(readScheduledOptions(fixture.databasePath), new RegExp(expectedNewPath.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')));
281
+
282
+ const settingsBackup = report.backupPaths.find((backupPath) => backupPath.includes('server.settings.json'));
283
+ assert.ok(settingsBackup);
284
+ assert.equal(readFileSync(settingsBackup, 'utf8'), beforeSettings, 'the backup keeps the pre-rewrite bytes');
285
+
286
+ capture.logMessages.length = 0;
287
+ assert.equal(await service.execute(['--rewrite', '--json']), 0);
288
+ assert.equal(readJsonReport(capture.logMessages).rewritten, 0, 'a second run has nothing left to rewrite');
289
+ });
290
+
291
+ test('an injected write failure keeps the original files and creates no half-rewritten state', async (t) => {
292
+ const fixture = createFixture(t);
293
+ const { imagePath } = seedPersistedPaths(fixture);
294
+ const beforeSettings = readFileSync(fixture.settingsPath, 'utf8');
295
+ const beforeOptions = readScheduledOptions(fixture.databasePath);
296
+ const backingStore = createStore(fixture);
297
+ const failingStore: AssetPathStore = {
298
+ readDocuments: () => backingStore.readDocuments(),
299
+ backup: () => backingStore.backup(),
300
+ restore: (backupPaths) => backingStore.restore(backupPaths),
301
+ writeDocuments: (updates) => {
302
+ // Write the JSON half first so the failure happens mid-batch: a command
303
+ // that only reported the error would leave the settings file rewritten
304
+ // while the database row still held the legacy path.
305
+ backingStore.writeDocuments(
306
+ updates.filter((update) => update.document.handle.kind === 'json-file'),
307
+ );
308
+ throw new Error('injected write failure');
309
+ },
310
+ };
311
+ const { service, capture } = createService(fixture, failingStore);
312
+
313
+ const exitCode = await service.execute(['--rewrite', '--json']);
314
+
315
+ assert.equal(exitCode, 1);
316
+ const report = readJsonReport(capture.logMessages);
317
+ assert.equal(report.rewritten, 0);
318
+ assert.match(report.errors.join('\n'), /injected write failure/);
319
+ assert.ok(report.backupPaths.length > 0, 'backups are taken before the failing write');
320
+ assert.equal(readFileSync(fixture.settingsPath, 'utf8'), beforeSettings);
321
+ assert.equal(readScheduledOptions(fixture.databasePath), beforeOptions);
322
+ assert.match(capture.errorMessages.join('\n'), /injected write failure/);
323
+ assert.match(beforeSettings, new RegExp(imagePath.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')));
324
+ });
325
+
326
+ test('provider transcript references are listed as unrewritable and the command warns', async (t) => {
327
+ const fixture = createFixture(t);
328
+ writeFileWithDirectories(path.join(fixture.legacyRoot, 'one.png'), 'one');
329
+ const transcriptPath = path.join(fixture.homeDir, '.claude', 'projects', 'project-a', 'session.jsonl');
330
+ const legacyReference = path.join(fixture.legacyRoot, 'one.png');
331
+ writeFileWithDirectories(
332
+ transcriptPath,
333
+ [
334
+ JSON.stringify({ type: 'user', text: 'unrelated' }),
335
+ JSON.stringify({ type: 'user', text: `look at ${legacyReference}` }),
336
+ ].join('\n'),
337
+ );
338
+ const beforeTranscript = readFileSync(transcriptPath, 'utf8');
339
+ const { service, capture } = createService(fixture, createStore(fixture));
340
+
341
+ const exitCode = await service.execute(['--rewrite', '--json']);
342
+
343
+ assert.equal(exitCode, 3, 'unrewritable references must not look like success');
344
+ const report = readJsonReport(capture.logMessages);
345
+ assert.deepEqual(report.unrewritable, [`${transcriptPath}:2`]);
346
+ assert.match(capture.errorMessages.join('\n'), /unrewritable|not rewritten/);
347
+ assert.equal(readFileSync(transcriptPath, 'utf8'), beforeTranscript, 'transcripts are never rewritten');
348
+ assert.equal(existsSync(path.join(fixture.newRoot, 'one.png')), true, 'the copy half still runs');
349
+ });
@@ -22,6 +22,7 @@
22
22
  */
23
23
  import assert from 'node:assert/strict';
24
24
  import { spawn } from 'node:child_process';
25
+ import http from 'node:http';
25
26
  import { mkdtemp, rm, writeFile } from 'node:fs/promises';
26
27
  import os from 'node:os';
27
28
  import path from 'node:path';
@@ -193,6 +194,147 @@ async function readBootstrapEnvironment(): Promise<{ databasePath: string | null
193
194
  }
194
195
  }
195
196
 
197
+ // ── brand-env wiring legs (gap-cloudpit-brand-env-reader-wiring) ───────────
198
+
199
+ /** One HTTP request the MCP entry forwarded to the Browser API. */
200
+ type CapturedApiRequest = {
201
+ path: string;
202
+ authorization: string | undefined;
203
+ };
204
+
205
+ /**
206
+ * Start a fake Browser API that records what the entry forwards.
207
+ *
208
+ * `browser_list_sessions` needs no arguments and reaches the API immediately,
209
+ * so an authorize/path reading here is a direct observation of the
210
+ * `apiUrl`/`apiToken` the entry resolved on start-up.
211
+ */
212
+ async function startBrowserApiCapture(): Promise<{
213
+ baseUrl: string;
214
+ requests: CapturedApiRequest[];
215
+ close: () => Promise<void>;
216
+ }> {
217
+ const requests: CapturedApiRequest[] = [];
218
+ const server = http.createServer((request, response) => {
219
+ let body = '';
220
+ request.setEncoding('utf8');
221
+ request.on('data', (chunk: string) => {
222
+ body += chunk;
223
+ });
224
+ request.on('end', () => {
225
+ requests.push({ path: request.url || '', authorization: request.headers.authorization });
226
+ response.writeHead(200, { 'Content-Type': 'application/json' });
227
+ response.end(JSON.stringify({ success: true, data: [] }));
228
+ });
229
+ });
230
+
231
+ await new Promise<void>((resolve, reject) => {
232
+ server.once('error', reject);
233
+ server.listen(0, '127.0.0.1', () => resolve());
234
+ });
235
+
236
+ const address = server.address();
237
+ if (!address || typeof address === 'string') {
238
+ await new Promise<void>((resolve) => server.close(() => resolve()));
239
+ throw new Error('the fake Browser API did not bind to a TCP port');
240
+ }
241
+
242
+ return {
243
+ baseUrl: `http://127.0.0.1:${address.port}`,
244
+ requests,
245
+ close: () => new Promise<void>((resolve) => server.close(() => resolve())),
246
+ };
247
+ }
248
+
249
+ /** Every browser-use brand variable this criterion controls. */
250
+ const BROWSER_USE_BRAND_ENV_KEYS = [
251
+ 'CLOUDPIT_BROWSER_USE_API_URL',
252
+ 'CLOUDCLI_BROWSER_USE_API_URL',
253
+ 'CLOUDPIT_BROWSER_USE_MCP_TOKEN',
254
+ 'CLOUDCLI_BROWSER_USE_MCP_TOKEN',
255
+ 'CLOUDPIT_BROWSER_USE_API_TIMEOUT_MS',
256
+ 'CLOUDCLI_BROWSER_USE_API_TIMEOUT_MS',
257
+ ];
258
+ /** A child environment with every browser-use brand variable cleared, then `overrides`. */
259
+ function browserUseEnvironment(
260
+ overrides: Record<string, string>,
261
+ homeDirectory: string,
262
+ ): NodeJS.ProcessEnv {
263
+ const environment = environmentWithoutDatabasePath(homeDirectory);
264
+ for (const key of BROWSER_USE_BRAND_ENV_KEYS) {
265
+ delete environment[key];
266
+ }
267
+ return { ...environment, ...overrides };
268
+ }
269
+
270
+ /** Call `browser_list_sessions` through the entry and return the child's output. */
271
+ function requestBrowserListSessions(
272
+ environment: NodeJS.ProcessEnv,
273
+ timeoutMs = 60_000,
274
+ ): Promise<{ stdout: string; stderr: string }> {
275
+ return new Promise((resolve, reject) => {
276
+ const child = spawnWithTsx(ENTRY_PATH, environment);
277
+ let stdout = '';
278
+ let stderr = '';
279
+ let settled = false;
280
+
281
+ const finish = (error: Error | null) => {
282
+ if (settled) return;
283
+ settled = true;
284
+ clearTimeout(timer);
285
+ child.kill('SIGKILL');
286
+ if (error) reject(error);
287
+ else resolve({ stdout, stderr });
288
+ };
289
+
290
+ const timer = setTimeout(() => {
291
+ finish(new Error(`the MCP entry did not answer tools/call within ${timeoutMs}ms\nstdout:\n${stdout}\nstderr:\n${stderr}`));
292
+ }, timeoutMs);
293
+
294
+ child.stdout.setEncoding('utf8');
295
+ child.stdout.on('data', (chunk: string) => {
296
+ stdout += chunk;
297
+ for (const line of stdout.split('\n')) {
298
+ if (!line.trim()) continue;
299
+ let parsed: unknown;
300
+ try {
301
+ parsed = JSON.parse(line);
302
+ } catch {
303
+ continue; // Not a JSON-RPC frame; keep reading.
304
+ }
305
+ const frame = parsed as { id?: unknown };
306
+ if (frame.id === 2) finish(null);
307
+ }
308
+ });
309
+ child.stderr.setEncoding('utf8');
310
+ child.stderr.on('data', (chunk: string) => {
311
+ stderr += chunk;
312
+ });
313
+ child.on('error', (error) => finish(error instanceof Error ? error : new Error(String(error))));
314
+ child.on('exit', (code) => {
315
+ finish(new Error(`the MCP entry exited (code ${String(code)}) before answering tools/call\nstdout:\n${stdout}\nstderr:\n${stderr}`));
316
+ });
317
+
318
+ child.stdin.write(`${JSON.stringify({
319
+ jsonrpc: '2.0',
320
+ id: 1,
321
+ method: 'initialize',
322
+ params: {},
323
+ })}\n`);
324
+ child.stdin.write(`${JSON.stringify({
325
+ jsonrpc: '2.0',
326
+ id: 2,
327
+ method: 'tools/call',
328
+ params: { name: 'browser_list_sessions', arguments: {} },
329
+ })}\n`);
330
+ });
331
+ }
332
+
333
+ /** Count non-overlapping occurrences of `needle` in `haystack`. */
334
+ function countOccurrences(haystack: string, needle: string): number {
335
+ return haystack.split(needle).length - 1;
336
+ }
337
+
196
338
  test('the relocated MCP entry answers initialize as cloudpit-browser', async () => {
197
339
  const reply = await requestInitialize();
198
340
  console.log(`(d) initialize reply: ${reply.rawLine}`);
@@ -201,6 +343,8 @@ test('the relocated MCP entry answers initialize as cloudpit-browser', async ()
201
343
  assert.ok(serverInfo && typeof serverInfo === 'object', `the initialize result must carry serverInfo: ${reply.rawLine}`);
202
344
  assert.equal(serverInfo.name, EXPECTED_SERVER_NAME, `serverInfo.name must stay ${EXPECTED_SERVER_NAME}: ${reply.rawLine}`);
203
345
  assert.equal(reply.result.protocolVersion, '2024-11-05', 'the MCP protocol version must stay pinned');
346
+ // 3.0 retired the legacy registrations: the wire identity never names one.
347
+ assert.equal(reply.rawLine.includes('cloudcli-browser'), false, 'no legacy MCP name may reach the client');
204
348
  });
205
349
 
206
350
  test('the relocated MCP entry still installs the root environment bootstrap', async () => {
@@ -218,3 +362,61 @@ test('the relocated MCP entry still installs the root environment bootstrap', as
218
362
  'importing the entry must run server/load-env.ts, which installs the user-level default DATABASE_PATH',
219
363
  );
220
364
  });
365
+
366
+ test('AC5: CLOUDPIT_* supplies the MCP entry API URL and token', async () => {
367
+ const capture = await startBrowserApiCapture();
368
+ const homeDirectory = await mkdtemp(path.join(os.tmpdir(), 'cloudpit-mcp-brand-env-'));
369
+ try {
370
+ const output = await requestBrowserListSessions(browserUseEnvironment({
371
+ CLOUDPIT_BROWSER_USE_API_URL: `${capture.baseUrl}/api/new`,
372
+ CLOUDPIT_BROWSER_USE_MCP_TOKEN: 'new-token',
373
+ CLOUDCLI_BROWSER_USE_API_URL: `${capture.baseUrl}/api/old`,
374
+ CLOUDCLI_BROWSER_USE_MCP_TOKEN: 'old-token',
375
+ }, homeDirectory));
376
+
377
+ assert.equal(
378
+ capture.requests.length,
379
+ 1,
380
+ `the entry must reach the fake API exactly once\nstdout:\n${output.stdout}\nstderr:\n${output.stderr}`,
381
+ );
382
+ assert.equal(
383
+ capture.requests[0].path,
384
+ '/api/new/tools/browser_list_sessions',
385
+ 'the CLOUDPIT_BROWSER_USE_API_URL spelling must win',
386
+ );
387
+ assert.equal(capture.requests[0].authorization, 'Bearer new-token');
388
+ } finally {
389
+ await capture.close();
390
+ await rm(homeDirectory, { recursive: true, force: true });
391
+ }
392
+ });
393
+
394
+ test('AC5 (v3.0): the legacy spelling is ignored, so the entry refuses without a token', async () => {
395
+ const capture = await startBrowserApiCapture();
396
+ const homeDirectory = await mkdtemp(path.join(os.tmpdir(), 'cloudpit-mcp-brand-env-'));
397
+ try {
398
+ const output = await requestBrowserListSessions(browserUseEnvironment({
399
+ CLOUDCLI_BROWSER_USE_API_URL: `${capture.baseUrl}/api/legacy`,
400
+ CLOUDCLI_BROWSER_USE_MCP_TOKEN: 'legacy-token',
401
+ }, homeDirectory));
402
+
403
+ assert.equal(
404
+ capture.requests.length,
405
+ 0,
406
+ `the retired spelling must not reach the fake API\nstdout:\n${output.stdout}\nstderr:\n${output.stderr}`,
407
+ );
408
+ assert.match(
409
+ output.stdout,
410
+ /CLOUDPIT_BROWSER_USE_MCP_TOKEN is not configured\./,
411
+ `the entry must report the missing canonical token\nstdout:\n${output.stdout}`,
412
+ );
413
+ assert.equal(
414
+ countOccurrences(output.stderr, 'is deprecated'),
415
+ 0,
416
+ 'the retired spelling must not emit a deprecation warning',
417
+ );
418
+ } finally {
419
+ await capture.close();
420
+ await rm(homeDirectory, { recursive: true, force: true });
421
+ }
422
+ });
@@ -103,6 +103,7 @@ export function createCliApplication() {
103
103
  },
104
104
  output: { log: () => undefined, error: () => undefined },
105
105
  sandboxService: { execute: async () => 0 },
106
+ assetMigrationService: { execute: async () => 0 },
106
107
  getLatestPackageVersion: async () => '1.0.0',
107
108
  updateGlobalPackage: () => undefined,
108
109
  startServer: async () => undefined,
@@ -38,6 +38,9 @@ function createHarness(
38
38
  return 7;
39
39
  },
40
40
  },
41
+ assetMigrationService: {
42
+ execute: async () => 0,
43
+ },
41
44
  getLatestPackageVersion: async () => '1.2.3',
42
45
  updateGlobalPackage: () => undefined,
43
46
  startServer: async () => {
@@ -91,12 +94,14 @@ test('returns a failure code for an unknown command without exiting the process'
91
94
 
92
95
  test('help text falls back to the fork repository when package metadata is missing', async () => {
93
96
  // No homepage/bugsUrl: the help text must use its own fallbacks, not the upstream repository.
97
+ // The fork's distribution identity is yaleh/cloudpit (a7942b0f9) — pin the shipped fallback, not
98
+ // the pre-rename repository name.
94
99
  const harness = createHarness({ version: '1.2.3' });
95
100
 
96
101
  const exitCode = await harness.service.run(['help']);
97
102
 
98
103
  assert.equal(exitCode, 0);
99
104
  const helpText = harness.logMessages.join('\n');
100
- assert.match(helpText, /yaleh\/claudecodeui/, 'the missing-metadata fallback must name the fork repository');
105
+ assert.match(helpText, /yaleh\/cloudpit/, 'the missing-metadata fallback must name the fork repository');
101
106
  assert.doesNotMatch(helpText, /siteboon/, 'the missing-metadata fallback must not name upstream siteboon');
102
107
  });
@@ -104,7 +104,7 @@ const EXAMPLE = `{
104
104
 
105
105
  /** The fixed instructions; the same text is sent every round. */
106
106
  export const BRIEF_SYSTEM_PROMPT = [
107
- '你是 CloudCLI 驾驶舱的简报生成器。为一张等待用户决定的卡片写一份 BriefSpec v0 JSON。',
107
+ '你是 Cloudpit 驾驶舱的简报生成器。为一张等待用户决定的卡片写一份 BriefSpec v0 JSON。',
108
108
  '',
109
109
  '只输出 JSON 对象本身:不要代码围栏,不要解释,不要前后缀文字。',
110
110
  '',
@@ -18,7 +18,8 @@
18
18
  * An option's declared `params` are passed to the executor VERBATIM (the
19
19
  * criterion compares them with `deepEqual`). A free-text reply has no declared
20
20
  * params of its own for the text, so the text joins `ownReply.params` under
21
- * `reply` — that is the one field the channel adds.
21
+ * `reply`. A knowledge decision routed to `fleet.apply` is the one addition:
22
+ * its server-verified `confirmation` is injected before the executor runs.
22
23
  *
23
24
  * Errors are `AppError`s, so the thin route just forwards them to the server's
24
25
  * existing error middleware and a caller reads a status + a stable code.
@@ -120,6 +121,9 @@ export const NO_FEEDBACK_EXECUTOR_REASON =
120
121
  export const FEEDBACK_EXECUTOR_GONE_REASON =
121
122
  '该提供方已不再声明原来的反馈执行器,无法重发';
122
123
 
124
+ /** The fleet executor that consumes a trusted knowledge decision's `confirmation`. */
125
+ const KNOWLEDGE_DECISION_EXECUTOR_ID = 'fleet.apply';
126
+
123
127
  type ParsedConfirmRequest = {
124
128
  cardId: string;
125
129
  revision: number;
@@ -556,9 +560,22 @@ export function createCockpitCardActions(deps: {
556
560
  }
557
561
 
558
562
  accepted.add(key);
563
+ // A knowledge decision routed to `fleet.apply` carries the server-verified confirmation the
564
+ // fleet validates; every other executor keeps its declared params byte-for-byte.
565
+ const params = { ...action.params };
566
+ if (knowledge !== undefined && action.executor === KNOWLEDGE_DECISION_EXECUTOR_ID) {
567
+ const binding: Record<string, unknown> = { ...knowledge.feedback };
568
+ delete binding.confirmationRef;
569
+ params.confirmation = {
570
+ actorKind: 'human',
571
+ decisionRef: knowledge.ref,
572
+ at: now().toISOString(),
573
+ binding,
574
+ };
575
+ }
559
576
  let result: unknown;
560
577
  try {
561
- result = await executor.execute(action.params);
578
+ result = await executor.execute(params);
562
579
  } catch (failure) {
563
580
  // The action did not happen, so the revision stays confirmable.
564
581
  accepted.delete(key);
@@ -596,7 +613,7 @@ export function createCockpitCardActions(deps: {
596
613
  ok: true,
597
614
  cardId: card.id,
598
615
  executor: action.executor,
599
- params: action.params,
616
+ params,
600
617
  result,
601
618
  };
602
619
  };