agim-cli 1.2.67 → 1.2.69

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 (164) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/dist/core/onboarding.d.ts.map +1 -1
  3. package/dist/core/onboarding.js +10 -4
  4. package/dist/core/onboarding.js.map +1 -1
  5. package/dist/core/registry.d.ts +10 -0
  6. package/dist/core/registry.d.ts.map +1 -1
  7. package/dist/core/registry.js +58 -0
  8. package/dist/core/registry.js.map +1 -1
  9. package/dist/web/public/assets/{a2a-pV7pUaE_.js → a2a-CzOCrC9J.js} +2 -2
  10. package/dist/web/public/assets/{a2a-pV7pUaE_.js.map → a2a-CzOCrC9J.js.map} +1 -1
  11. package/dist/web/public/assets/{activity-BtEeVbL4.js → activity-BlasCFZq.js} +2 -2
  12. package/dist/web/public/assets/{activity-BtEeVbL4.js.map → activity-BlasCFZq.js.map} +1 -1
  13. package/dist/web/public/assets/{admins-Cb6gyuWs.js → admins-CQOShfRl.js} +2 -2
  14. package/dist/web/public/assets/{admins-Cb6gyuWs.js.map → admins-CQOShfRl.js.map} +1 -1
  15. package/dist/web/public/assets/{agents-Bua9ZDtI.js → agents-UstP4DoK.js} +2 -2
  16. package/dist/web/public/assets/{agents-Bua9ZDtI.js.map → agents-UstP4DoK.js.map} +1 -1
  17. package/dist/web/public/assets/{approvals-DgxxWp1m.js → approvals-BvfcdYLU.js} +2 -2
  18. package/dist/web/public/assets/{approvals-DgxxWp1m.js.map → approvals-BvfcdYLU.js.map} +1 -1
  19. package/dist/web/public/assets/{asks-iON_EhzS.js → asks-DAJ1edZu.js} +2 -2
  20. package/dist/web/public/assets/{asks-iON_EhzS.js.map → asks-DAJ1edZu.js.map} +1 -1
  21. package/dist/web/public/assets/{audit-D1sPdKlD.js → audit-CAOadRDl.js} +2 -2
  22. package/dist/web/public/assets/{audit-D1sPdKlD.js.map → audit-CAOadRDl.js.map} +1 -1
  23. package/dist/web/public/assets/{bell-B5ZjxlmU.js → bell-BuZoWBMK.js} +2 -2
  24. package/dist/web/public/assets/{bell-B5ZjxlmU.js.map → bell-BuZoWBMK.js.map} +1 -1
  25. package/dist/web/public/assets/{bgjobs-DdnrqmC2.js → bgjobs-C5jF3BWG.js} +2 -2
  26. package/dist/web/public/assets/{bgjobs-DdnrqmC2.js.map → bgjobs-C5jF3BWG.js.map} +1 -1
  27. package/dist/web/public/assets/{brain-Bh8Xm53Q.js → brain-DaFGi4GZ.js} +2 -2
  28. package/dist/web/public/assets/{brain-Bh8Xm53Q.js.map → brain-DaFGi4GZ.js.map} +1 -1
  29. package/dist/web/public/assets/{briefcase-Tn3JuAZM.js → briefcase-BXKiYFAz.js} +2 -2
  30. package/dist/web/public/assets/{briefcase-Tn3JuAZM.js.map → briefcase-BXKiYFAz.js.map} +1 -1
  31. package/dist/web/public/assets/{chevron-right-Bu2Wni-B.js → chevron-right-Bi2RmsHt.js} +2 -2
  32. package/dist/web/public/assets/{chevron-right-Bu2Wni-B.js.map → chevron-right-Bi2RmsHt.js.map} +1 -1
  33. package/dist/web/public/assets/{circle-check-Bx222bW4.js → circle-check-NYJSuZMK.js} +2 -2
  34. package/dist/web/public/assets/{circle-check-Bx222bW4.js.map → circle-check-NYJSuZMK.js.map} +1 -1
  35. package/dist/web/public/assets/{circle-check-big-BAGOp63h.js → circle-check-big-wxQV9Apf.js} +2 -2
  36. package/dist/web/public/assets/{circle-check-big-BAGOp63h.js.map → circle-check-big-wxQV9Apf.js.map} +1 -1
  37. package/dist/web/public/assets/{circle-x-DYSUbjfb.js → circle-x-D7EpTdJQ.js} +2 -2
  38. package/dist/web/public/assets/{circle-x-DYSUbjfb.js.map → circle-x-D7EpTdJQ.js.map} +1 -1
  39. package/dist/web/public/assets/{confirm-dialog-BkTngEE8.js → confirm-dialog-BecM1NAT.js} +2 -2
  40. package/dist/web/public/assets/{confirm-dialog-BkTngEE8.js.map → confirm-dialog-BecM1NAT.js.map} +1 -1
  41. package/dist/web/public/assets/{data-table-BlqccxTF.js → data-table-Bh5TFhXw.js} +2 -2
  42. package/dist/web/public/assets/{data-table-BlqccxTF.js.map → data-table-Bh5TFhXw.js.map} +1 -1
  43. package/dist/web/public/assets/{dialog-CMUp72oB.js → dialog-8m5Uihhi.js} +2 -2
  44. package/dist/web/public/assets/{dialog-CMUp72oB.js.map → dialog-8m5Uihhi.js.map} +1 -1
  45. package/dist/web/public/assets/{download-CB0cOUn8.js → download-DWvNllY2.js} +2 -2
  46. package/dist/web/public/assets/{download-CB0cOUn8.js.map → download-DWvNllY2.js.map} +1 -1
  47. package/dist/web/public/assets/{email-BCqfN_b2.js → email-Cr1x3fdt.js} +2 -2
  48. package/dist/web/public/assets/{email-BCqfN_b2.js.map → email-Cr1x3fdt.js.map} +1 -1
  49. package/dist/web/public/assets/{empty-state-DTC7UMRJ.js → empty-state-BESUGVnV.js} +2 -2
  50. package/dist/web/public/assets/{empty-state-DTC7UMRJ.js.map → empty-state-BESUGVnV.js.map} +1 -1
  51. package/dist/web/public/assets/{external-link-D7kkHOqE.js → external-link-BwscsXby.js} +2 -2
  52. package/dist/web/public/assets/{external-link-D7kkHOqE.js.map → external-link-BwscsXby.js.map} +1 -1
  53. package/dist/web/public/assets/{eye-KM8X6N9N.js → eye-C7gaSIZv.js} +2 -2
  54. package/dist/web/public/assets/{eye-KM8X6N9N.js.map → eye-C7gaSIZv.js.map} +1 -1
  55. package/dist/web/public/assets/{facts-mHIefs9t.js → facts-B9hm9627.js} +2 -2
  56. package/dist/web/public/assets/{facts-mHIefs9t.js.map → facts-B9hm9627.js.map} +1 -1
  57. package/dist/web/public/assets/{goals-DkW2jRda.js → goals-D3f1Dw2M.js} +2 -2
  58. package/dist/web/public/assets/{goals-DkW2jRda.js.map → goals-D3f1Dw2M.js.map} +1 -1
  59. package/dist/web/public/assets/{health-DqSq0_p8.js → health-BLwrXebg.js} +2 -2
  60. package/dist/web/public/assets/{health-DqSq0_p8.js.map → health-BLwrXebg.js.map} +1 -1
  61. package/dist/web/public/assets/{heart-pulse-Dw9UThda.js → heart-pulse-BtioxtCU.js} +2 -2
  62. package/dist/web/public/assets/{heart-pulse-Dw9UThda.js.map → heart-pulse-BtioxtCU.js.map} +1 -1
  63. package/dist/web/public/assets/{heartbeat-4Jqvt3ZG.js → heartbeat-BHPx1z33.js} +2 -2
  64. package/dist/web/public/assets/{heartbeat-4Jqvt3ZG.js.map → heartbeat-BHPx1z33.js.map} +1 -1
  65. package/dist/web/public/assets/{hot-DwVVYe_Q.js → hot-CuaGMYzV.js} +2 -2
  66. package/dist/web/public/assets/{hot-DwVVYe_Q.js.map → hot-CuaGMYzV.js.map} +1 -1
  67. package/dist/web/public/assets/{index-Dm4bHM0M.js → index-Cc8hxJWT.js} +4 -4
  68. package/dist/web/public/assets/{index-Dm4bHM0M.js.map → index-Cc8hxJWT.js.map} +1 -1
  69. package/dist/web/public/assets/{installed-CRBbM3d1.js → installed-D_BoGzel.js} +2 -2
  70. package/dist/web/public/assets/{installed-CRBbM3d1.js.map → installed-D_BoGzel.js.map} +1 -1
  71. package/dist/web/public/assets/{jobs-DvVu0NEB.js → jobs-D0eeD9ye.js} +2 -2
  72. package/dist/web/public/assets/{jobs-DvVu0NEB.js.map → jobs-D0eeD9ye.js.map} +1 -1
  73. package/dist/web/public/assets/{layout-N_ipr3nA.js → layout-CQe9ncYF.js} +2 -2
  74. package/dist/web/public/assets/{layout-N_ipr3nA.js.map → layout-CQe9ncYF.js.map} +1 -1
  75. package/dist/web/public/assets/{layout-Cq4zcQuI.js → layout-CvRW3Bn_.js} +2 -2
  76. package/dist/web/public/assets/{layout-Cq4zcQuI.js.map → layout-CvRW3Bn_.js.map} +1 -1
  77. package/dist/web/public/assets/{layout-DCrcKMGj.js → layout-DPxfAgBW.js} +2 -2
  78. package/dist/web/public/assets/{layout-DCrcKMGj.js.map → layout-DPxfAgBW.js.map} +1 -1
  79. package/dist/web/public/assets/{layout-C0Dmdrm6.js → layout-Wl7Pr1-s.js} +2 -2
  80. package/dist/web/public/assets/{layout-C0Dmdrm6.js.map → layout-Wl7Pr1-s.js.map} +1 -1
  81. package/dist/web/public/assets/{layout-CGvFOz3S.js → layout-bRkGiGF-.js} +2 -2
  82. package/dist/web/public/assets/{layout-CGvFOz3S.js.map → layout-bRkGiGF-.js.map} +1 -1
  83. package/dist/web/public/assets/{llm-DKruaUsd.js → llm-CJGxq9Ru.js} +2 -2
  84. package/dist/web/public/assets/{llm-DKruaUsd.js.map → llm-CJGxq9Ru.js.map} +1 -1
  85. package/dist/web/public/assets/{loader-circle-C8YCUz70.js → loader-circle-D4WrM89N.js} +2 -2
  86. package/dist/web/public/assets/{loader-circle-C8YCUz70.js.map → loader-circle-D4WrM89N.js.map} +1 -1
  87. package/dist/web/public/assets/{map-pin-wZRlA_mV.js → map-pin-DGSzw_UH.js} +2 -2
  88. package/dist/web/public/assets/{map-pin-wZRlA_mV.js.map → map-pin-DGSzw_UH.js.map} +1 -1
  89. package/dist/web/public/assets/{mcp-DJN2vM4F.js → mcp-DYp7QbX8.js} +2 -2
  90. package/dist/web/public/assets/{mcp-DJN2vM4F.js.map → mcp-DYp7QbX8.js.map} +1 -1
  91. package/dist/web/public/assets/{memos-zpcFJvTm.js → memos-Dz0jD4R5.js} +2 -2
  92. package/dist/web/public/assets/{memos-zpcFJvTm.js.map → memos-Dz0jD4R5.js.map} +1 -1
  93. package/dist/web/public/assets/{messengers-ClgibwCS.js → messengers-Bewhby2_.js} +2 -2
  94. package/dist/web/public/assets/{messengers-ClgibwCS.js.map → messengers-Bewhby2_.js.map} +1 -1
  95. package/dist/web/public/assets/{native-agent-7mZcks5Q.js → native-agent-ChgK3ceB.js} +2 -2
  96. package/dist/web/public/assets/{native-agent-7mZcks5Q.js.map → native-agent-ChgK3ceB.js.map} +1 -1
  97. package/dist/web/public/assets/{network-BN_4AVjH.js → network-D8uD8vuE.js} +2 -2
  98. package/dist/web/public/assets/{network-BN_4AVjH.js.map → network-D8uD8vuE.js.map} +1 -1
  99. package/dist/web/public/assets/{outbox-CqO2DN9r.js → outbox-CRcmD2P1.js} +2 -2
  100. package/dist/web/public/assets/{outbox-CqO2DN9r.js.map → outbox-CRcmD2P1.js.map} +1 -1
  101. package/dist/web/public/assets/{pagination-BN5IlfM7.js → pagination-BK8pXuOn.js} +2 -2
  102. package/dist/web/public/assets/{pagination-BN5IlfM7.js.map → pagination-BK8pXuOn.js.map} +1 -1
  103. package/dist/web/public/assets/{persona-CwiBUs53.js → persona-Dk4Y24TF.js} +2 -2
  104. package/dist/web/public/assets/{persona-CwiBUs53.js.map → persona-Dk4Y24TF.js.map} +1 -1
  105. package/dist/web/public/assets/{play-DH5aMHyg.js → play-BAwY0kZY.js} +2 -2
  106. package/dist/web/public/assets/{play-DH5aMHyg.js.map → play-BAwY0kZY.js.map} +1 -1
  107. package/dist/web/public/assets/{plus-m81LzTGp.js → plus-Qg7H_hBC.js} +2 -2
  108. package/dist/web/public/assets/{plus-m81LzTGp.js.map → plus-Qg7H_hBC.js.map} +1 -1
  109. package/dist/web/public/assets/{policy-C4LWbsG1.js → policy-bd1_X4KT.js} +2 -2
  110. package/dist/web/public/assets/{policy-C4LWbsG1.js.map → policy-bd1_X4KT.js.map} +1 -1
  111. package/dist/web/public/assets/{refresh-ccw-BVkrjmyW.js → refresh-ccw-DjeeSzbz.js} +2 -2
  112. package/dist/web/public/assets/{refresh-ccw-BVkrjmyW.js.map → refresh-ccw-DjeeSzbz.js.map} +1 -1
  113. package/dist/web/public/assets/{reminders-BSQoGyVb.js → reminders-CyNYrPCo.js} +2 -2
  114. package/dist/web/public/assets/{reminders-BSQoGyVb.js.map → reminders-CyNYrPCo.js.map} +1 -1
  115. package/dist/web/public/assets/{save-CODsafFB.js → save-B6_ssx8c.js} +2 -2
  116. package/dist/web/public/assets/{save-CODsafFB.js.map → save-B6_ssx8c.js.map} +1 -1
  117. package/dist/web/public/assets/{schedules-BBH1Ipyd.js → schedules-DVxENvba.js} +2 -2
  118. package/dist/web/public/assets/{schedules-BBH1Ipyd.js.map → schedules-DVxENvba.js.map} +1 -1
  119. package/dist/web/public/assets/{search-QcBNzBQ7.js → search-BJwBDf0Q.js} +2 -2
  120. package/dist/web/public/assets/{search-QcBNzBQ7.js.map → search-BJwBDf0Q.js.map} +1 -1
  121. package/dist/web/public/assets/security-Co1823U6.js +7 -0
  122. package/dist/web/public/assets/security-Co1823U6.js.map +1 -0
  123. package/dist/web/public/assets/{service-Dg3fHa1F.js → service-BJ2kE446.js} +2 -2
  124. package/dist/web/public/assets/{service-Dg3fHa1F.js.map → service-BJ2kE446.js.map} +1 -1
  125. package/dist/web/public/assets/{status-badge-COrk0PaU.js → status-badge-3nnQTZXz.js} +2 -2
  126. package/dist/web/public/assets/{status-badge-COrk0PaU.js.map → status-badge-3nnQTZXz.js.map} +1 -1
  127. package/dist/web/public/assets/{subtasks-BoKtrF6e.js → subtasks-BgHm-5dB.js} +2 -2
  128. package/dist/web/public/assets/{subtasks-BoKtrF6e.js.map → subtasks-BgHm-5dB.js.map} +1 -1
  129. package/dist/web/public/assets/{table-CO5iRHXX.js → table-CNXI0HD-.js} +2 -2
  130. package/dist/web/public/assets/{table-CO5iRHXX.js.map → table-CNXI0HD-.js.map} +1 -1
  131. package/dist/web/public/assets/{topn-CZpEJB9u.js → topn-C1PyG8Ns.js} +2 -2
  132. package/dist/web/public/assets/{topn-CZpEJB9u.js.map → topn-C1PyG8Ns.js.map} +1 -1
  133. package/dist/web/public/assets/{trash-2-Cb97xDdm.js → trash-2-CjkttCxU.js} +2 -2
  134. package/dist/web/public/assets/{trash-2-Cb97xDdm.js.map → trash-2-CjkttCxU.js.map} +1 -1
  135. package/dist/web/public/assets/{use-background-tasks-CJmddApa.js → use-background-tasks-CLf78_yn.js} +2 -2
  136. package/dist/web/public/assets/{use-background-tasks-CJmddApa.js.map → use-background-tasks-CLf78_yn.js.map} +1 -1
  137. package/dist/web/public/assets/{use-llm-admin-DszocDJN.js → use-llm-admin-CzL0zcIi.js} +2 -2
  138. package/dist/web/public/assets/{use-llm-admin-DszocDJN.js.map → use-llm-admin-CzL0zcIi.js.map} +1 -1
  139. package/dist/web/public/assets/{use-memory-fcO8b_OU.js → use-memory-DrJjdPYo.js} +2 -2
  140. package/dist/web/public/assets/{use-memory-fcO8b_OU.js.map → use-memory-DrJjdPYo.js.map} +1 -1
  141. package/dist/web/public/assets/{use-observability-C9g0QTLd.js → use-observability-1j7-vMy5.js} +2 -2
  142. package/dist/web/public/assets/{use-observability-C9g0QTLd.js.map → use-observability-1j7-vMy5.js.map} +1 -1
  143. package/dist/web/public/assets/{use-settings-Dvc5WX17.js → use-settings-BLcy2mrv.js} +2 -2
  144. package/dist/web/public/assets/{use-settings-Dvc5WX17.js.map → use-settings-BLcy2mrv.js.map} +1 -1
  145. package/dist/web/public/assets/{use-workspace-DoenH-EZ.js → use-workspace-BLXvLTDF.js} +2 -2
  146. package/dist/web/public/assets/{use-workspace-DoenH-EZ.js.map → use-workspace-BLXvLTDF.js.map} +1 -1
  147. package/dist/web/public/assets/{useQuery-CwP843k0.js → useQuery-xB5dCeu-.js} +2 -2
  148. package/dist/web/public/assets/{useQuery-CwP843k0.js.map → useQuery-xB5dCeu-.js.map} +1 -1
  149. package/dist/web/public/assets/{vector-tNx8IrnY.js → vector-EOjQsr7r.js} +2 -2
  150. package/dist/web/public/assets/{vector-tNx8IrnY.js.map → vector-EOjQsr7r.js.map} +1 -1
  151. package/dist/web/public/assets/{viewer-_tE5G30K.js → viewer-D_I2ikzf.js} +2 -2
  152. package/dist/web/public/assets/{viewer-_tE5G30K.js.map → viewer-D_I2ikzf.js.map} +1 -1
  153. package/dist/web/public/assets/{workspace-15Jilg2h.js → workspace-lMCzYJAB.js} +2 -2
  154. package/dist/web/public/assets/{workspace-15Jilg2h.js.map → workspace-lMCzYJAB.js.map} +1 -1
  155. package/dist/web/public/assets/{workspaces-nyFTRkZH.js → workspaces-Ciyjiowm.js} +2 -2
  156. package/dist/web/public/assets/{workspaces-nyFTRkZH.js.map → workspaces-Ciyjiowm.js.map} +1 -1
  157. package/dist/web/public/assets/{x-C7i8kvqL.js → x-DP0VnoG9.js} +2 -2
  158. package/dist/web/public/assets/{x-C7i8kvqL.js.map → x-DP0VnoG9.js.map} +1 -1
  159. package/dist/web/public/index.html +1 -1
  160. package/dist/web/server.js +24 -5
  161. package/dist/web/server.js.map +1 -1
  162. package/package.json +1 -1
  163. package/dist/web/public/assets/security-Cv5Tjnb3.js +0 -7
  164. package/dist/web/public/assets/security-Cv5Tjnb3.js.map +0 -1
@@ -1509,17 +1509,29 @@ async function handleGetConfig(_req, res) {
1509
1509
  const { isGlobalImEnabled, isRemoteAgentEnabled } = await import('../core/feature-flags.js');
1510
1510
  const showGlobalIm = isGlobalImEnabled();
1511
1511
  const showRemoteAgent = isRemoteAgentEnabled();
1512
+ // v1.2.69 — IM platform blacklist. When an operator sets
1513
+ // IMHUB_PLATFORM_BLACKLIST=telegram,discord (etc.), those platforms
1514
+ // are hidden from the admin SPA entirely — credentials still live
1515
+ // on disk but the UI shows nothing for that platform AND the
1516
+ // registry refuses to register the adapter at boot. Default empty.
1517
+ const { isPlatformBlacklisted: blocked } = await import('../core/registry.js');
1518
+ // v1.2.69 — strip blacklisted entries from the `messengers`
1519
+ // dictionary so the SPA's per-platform toggle row also vanishes
1520
+ // (rendered from this object's keys).
1521
+ const visibleMessengers = config.messengers
1522
+ ? Object.fromEntries(Object.entries(config.messengers).filter(([k]) => !blocked(k)))
1523
+ : config.messengers;
1512
1524
  sendJson(res, 200, {
1513
- messengers: config.messengers,
1525
+ messengers: visibleMessengers,
1514
1526
  agents: config.agents,
1515
1527
  defaultAgent: config.defaultAgent,
1516
- telegram: showGlobalIm && config.telegram
1528
+ telegram: showGlobalIm && config.telegram && !blocked('telegram')
1517
1529
  ? { botToken: mask(config.telegram.botToken), channelId: config.telegram.channelId }
1518
1530
  : undefined,
1519
- feishu: config.feishu
1531
+ feishu: config.feishu && !blocked('feishu')
1520
1532
  ? { appId: config.feishu.appId, appSecret: mask(config.feishu.appSecret) }
1521
1533
  : undefined,
1522
- dingtalk: config.dingtalk
1534
+ dingtalk: config.dingtalk && !blocked('dingtalk')
1523
1535
  ? {
1524
1536
  clientId: config.dingtalk.clientId,
1525
1537
  clientSecret: mask(config.dingtalk.clientSecret),
@@ -1543,7 +1555,7 @@ async function handleGetConfig(_req, res) {
1543
1555
  : undefined,
1544
1556
  }
1545
1557
  : undefined,
1546
- discord: showGlobalIm && config.discord
1558
+ discord: showGlobalIm && config.discord && !blocked('discord')
1547
1559
  ? {
1548
1560
  botToken: mask(config.discord.botToken),
1549
1561
  channelId: config.discord.channelId,
@@ -2686,6 +2698,10 @@ const ENV_EDITABLE_KEYS = [
2686
2698
  'IMHUB_EXEC_MAX_OUTPUT',
2687
2699
  // Native call_agent per-turn cap.
2688
2700
  'IMHUB_NATIVE_CALL_AGENT_MAX_PER_TURN',
2701
+ // v1.2.69 — IM platform blacklist (CSV of platform ids). Default
2702
+ // empty (no blocks); listed platforms vanish from web + CLI + are
2703
+ // refused at registry.registerMessenger.
2704
+ 'IMHUB_PLATFORM_BLACKLIST',
2689
2705
  ];
2690
2706
  const SECRET_KEYS = new Set(['IMHUB_SMTP_PASS', 'IMHUB_BAIDU_MAP_AK', 'IMHUB_MEMORY_VECTOR_OPENAI_API_KEY']);
2691
2707
  // maskSecret moved to ./env-mask.ts (imported at the top of this file
@@ -2720,6 +2736,8 @@ async function handleSecurityDiagnostics(_req, res) {
2720
2736
  const senderAllowlistConfigured = isSenderAllowlistConfigured();
2721
2737
  const { isAllowlistConfigured: isAdminConfigured } = await import('../core/admin-allowlist.js');
2722
2738
  const adminAllowlistConfigured = isAdminConfigured();
2739
+ const { getPlatformBlacklist } = await import('../core/registry.js');
2740
+ const platformBlacklist = getPlatformBlacklist();
2723
2741
  sendJson(res, 200, {
2724
2742
  diagnostics: {
2725
2743
  runningAsRoot,
@@ -2727,6 +2745,7 @@ async function handleSecurityDiagnostics(_req, res) {
2727
2745
  bwrapAvailable,
2728
2746
  senderAllowlistConfigured,
2729
2747
  adminAllowlistConfigured,
2748
+ platformBlacklist,
2730
2749
  // Live env values so the UI can show what's effectively in force
2731
2750
  // (process.env, which is what runtime sees) without round-tripping
2732
2751
  // through the env file.