agim-cli 1.2.70 → 1.2.72

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 (163) hide show
  1. package/CHANGELOG.md +62 -0
  2. package/dist/web/public/assets/{a2a-CzOCrC9J.js → a2a-BbtW9q1L.js} +2 -2
  3. package/dist/web/public/assets/{a2a-CzOCrC9J.js.map → a2a-BbtW9q1L.js.map} +1 -1
  4. package/dist/web/public/assets/{activity-BlasCFZq.js → activity-CJmQLZ6_.js} +2 -2
  5. package/dist/web/public/assets/{activity-BlasCFZq.js.map → activity-CJmQLZ6_.js.map} +1 -1
  6. package/dist/web/public/assets/{admins-CQOShfRl.js → admins-BJP9koxS.js} +2 -2
  7. package/dist/web/public/assets/{admins-CQOShfRl.js.map → admins-BJP9koxS.js.map} +1 -1
  8. package/dist/web/public/assets/{agents-UstP4DoK.js → agents-DC0XFC6e.js} +2 -2
  9. package/dist/web/public/assets/{agents-UstP4DoK.js.map → agents-DC0XFC6e.js.map} +1 -1
  10. package/dist/web/public/assets/{approvals-BvfcdYLU.js → approvals-DiPkpPN4.js} +2 -2
  11. package/dist/web/public/assets/{approvals-BvfcdYLU.js.map → approvals-DiPkpPN4.js.map} +1 -1
  12. package/dist/web/public/assets/{asks-DAJ1edZu.js → asks-CG9chQgT.js} +2 -2
  13. package/dist/web/public/assets/{asks-DAJ1edZu.js.map → asks-CG9chQgT.js.map} +1 -1
  14. package/dist/web/public/assets/{audit-CAOadRDl.js → audit-B40mxlW1.js} +2 -2
  15. package/dist/web/public/assets/{audit-CAOadRDl.js.map → audit-B40mxlW1.js.map} +1 -1
  16. package/dist/web/public/assets/{bell-BuZoWBMK.js → bell-BC8Jqt9f.js} +2 -2
  17. package/dist/web/public/assets/{bell-BuZoWBMK.js.map → bell-BC8Jqt9f.js.map} +1 -1
  18. package/dist/web/public/assets/{bgjobs-C5jF3BWG.js → bgjobs-ClrQ2jzx.js} +2 -2
  19. package/dist/web/public/assets/{bgjobs-C5jF3BWG.js.map → bgjobs-ClrQ2jzx.js.map} +1 -1
  20. package/dist/web/public/assets/{brain-DaFGi4GZ.js → brain-BBx7RF2j.js} +2 -2
  21. package/dist/web/public/assets/{brain-DaFGi4GZ.js.map → brain-BBx7RF2j.js.map} +1 -1
  22. package/dist/web/public/assets/{briefcase-BXKiYFAz.js → briefcase-TihsRkSy.js} +2 -2
  23. package/dist/web/public/assets/{briefcase-BXKiYFAz.js.map → briefcase-TihsRkSy.js.map} +1 -1
  24. package/dist/web/public/assets/{chevron-right-Bi2RmsHt.js → chevron-right-DTLZLXDP.js} +2 -2
  25. package/dist/web/public/assets/{chevron-right-Bi2RmsHt.js.map → chevron-right-DTLZLXDP.js.map} +1 -1
  26. package/dist/web/public/assets/{circle-check-NYJSuZMK.js → circle-check-EHM2OMD5.js} +2 -2
  27. package/dist/web/public/assets/{circle-check-NYJSuZMK.js.map → circle-check-EHM2OMD5.js.map} +1 -1
  28. package/dist/web/public/assets/{circle-check-big-wxQV9Apf.js → circle-check-big-DJXNAZ3u.js} +2 -2
  29. package/dist/web/public/assets/{circle-check-big-wxQV9Apf.js.map → circle-check-big-DJXNAZ3u.js.map} +1 -1
  30. package/dist/web/public/assets/{circle-x-D7EpTdJQ.js → circle-x-DsaHSb_C.js} +2 -2
  31. package/dist/web/public/assets/{circle-x-D7EpTdJQ.js.map → circle-x-DsaHSb_C.js.map} +1 -1
  32. package/dist/web/public/assets/{confirm-dialog-BecM1NAT.js → confirm-dialog-DezSK6wB.js} +2 -2
  33. package/dist/web/public/assets/{confirm-dialog-BecM1NAT.js.map → confirm-dialog-DezSK6wB.js.map} +1 -1
  34. package/dist/web/public/assets/{data-table-Bh5TFhXw.js → data-table-DdSnbgyt.js} +2 -2
  35. package/dist/web/public/assets/{data-table-Bh5TFhXw.js.map → data-table-DdSnbgyt.js.map} +1 -1
  36. package/dist/web/public/assets/{dialog-8m5Uihhi.js → dialog-45x-p0sR.js} +2 -2
  37. package/dist/web/public/assets/{dialog-8m5Uihhi.js.map → dialog-45x-p0sR.js.map} +1 -1
  38. package/dist/web/public/assets/{download-DWvNllY2.js → download-BL4jeu4M.js} +2 -2
  39. package/dist/web/public/assets/{download-DWvNllY2.js.map → download-BL4jeu4M.js.map} +1 -1
  40. package/dist/web/public/assets/{email-Cr1x3fdt.js → email-BGUO-gme.js} +2 -2
  41. package/dist/web/public/assets/{email-Cr1x3fdt.js.map → email-BGUO-gme.js.map} +1 -1
  42. package/dist/web/public/assets/{empty-state-BESUGVnV.js → empty-state-n-LfHo6N.js} +2 -2
  43. package/dist/web/public/assets/{empty-state-BESUGVnV.js.map → empty-state-n-LfHo6N.js.map} +1 -1
  44. package/dist/web/public/assets/{external-link-BwscsXby.js → external-link-CZd6ma6Y.js} +2 -2
  45. package/dist/web/public/assets/{external-link-BwscsXby.js.map → external-link-CZd6ma6Y.js.map} +1 -1
  46. package/dist/web/public/assets/{eye-C7gaSIZv.js → eye-LsErAgqh.js} +2 -2
  47. package/dist/web/public/assets/{eye-C7gaSIZv.js.map → eye-LsErAgqh.js.map} +1 -1
  48. package/dist/web/public/assets/{facts-B9hm9627.js → facts-CxZ3L_7a.js} +2 -2
  49. package/dist/web/public/assets/{facts-B9hm9627.js.map → facts-CxZ3L_7a.js.map} +1 -1
  50. package/dist/web/public/assets/{goals-D3f1Dw2M.js → goals-BjzgqVnW.js} +2 -2
  51. package/dist/web/public/assets/{goals-D3f1Dw2M.js.map → goals-BjzgqVnW.js.map} +1 -1
  52. package/dist/web/public/assets/{health-BLwrXebg.js → health-BYX5IK98.js} +2 -2
  53. package/dist/web/public/assets/{health-BLwrXebg.js.map → health-BYX5IK98.js.map} +1 -1
  54. package/dist/web/public/assets/{heart-pulse-BtioxtCU.js → heart-pulse-D_xUK9r0.js} +2 -2
  55. package/dist/web/public/assets/{heart-pulse-BtioxtCU.js.map → heart-pulse-D_xUK9r0.js.map} +1 -1
  56. package/dist/web/public/assets/{heartbeat-BHPx1z33.js → heartbeat-DnSegIYS.js} +2 -2
  57. package/dist/web/public/assets/{heartbeat-BHPx1z33.js.map → heartbeat-DnSegIYS.js.map} +1 -1
  58. package/dist/web/public/assets/{hot-CuaGMYzV.js → hot-C5TxCTVL.js} +2 -2
  59. package/dist/web/public/assets/{hot-CuaGMYzV.js.map → hot-C5TxCTVL.js.map} +1 -1
  60. package/dist/web/public/assets/{index-Cc8hxJWT.js → index-CbWhcThC.js} +3 -3
  61. package/dist/web/public/assets/{index-Cc8hxJWT.js.map → index-CbWhcThC.js.map} +1 -1
  62. package/dist/web/public/assets/{installed-D_BoGzel.js → installed-D_Hjs7uj.js} +2 -2
  63. package/dist/web/public/assets/{installed-D_BoGzel.js.map → installed-D_Hjs7uj.js.map} +1 -1
  64. package/dist/web/public/assets/{jobs-D0eeD9ye.js → jobs-DWtjJIAD.js} +2 -2
  65. package/dist/web/public/assets/{jobs-D0eeD9ye.js.map → jobs-DWtjJIAD.js.map} +1 -1
  66. package/dist/web/public/assets/{layout-DPxfAgBW.js → layout-54-PzplU.js} +2 -2
  67. package/dist/web/public/assets/{layout-DPxfAgBW.js.map → layout-54-PzplU.js.map} +1 -1
  68. package/dist/web/public/assets/{layout-bRkGiGF-.js → layout-BLK9XuQB.js} +2 -2
  69. package/dist/web/public/assets/{layout-bRkGiGF-.js.map → layout-BLK9XuQB.js.map} +1 -1
  70. package/dist/web/public/assets/{layout-CvRW3Bn_.js → layout-CTyy2kgf.js} +2 -2
  71. package/dist/web/public/assets/{layout-CvRW3Bn_.js.map → layout-CTyy2kgf.js.map} +1 -1
  72. package/dist/web/public/assets/{layout-Wl7Pr1-s.js → layout-CvvZcaiO.js} +2 -2
  73. package/dist/web/public/assets/{layout-Wl7Pr1-s.js.map → layout-CvvZcaiO.js.map} +1 -1
  74. package/dist/web/public/assets/{layout-CQe9ncYF.js → layout-D1-LnIA_.js} +2 -2
  75. package/dist/web/public/assets/{layout-CQe9ncYF.js.map → layout-D1-LnIA_.js.map} +1 -1
  76. package/dist/web/public/assets/{llm-CJGxq9Ru.js → llm-D59Tv6ne.js} +2 -2
  77. package/dist/web/public/assets/{llm-CJGxq9Ru.js.map → llm-D59Tv6ne.js.map} +1 -1
  78. package/dist/web/public/assets/{loader-circle-D4WrM89N.js → loader-circle-U64eR4W2.js} +2 -2
  79. package/dist/web/public/assets/{loader-circle-D4WrM89N.js.map → loader-circle-U64eR4W2.js.map} +1 -1
  80. package/dist/web/public/assets/{map-pin-DGSzw_UH.js → map-pin-D08YlPs3.js} +2 -2
  81. package/dist/web/public/assets/{map-pin-DGSzw_UH.js.map → map-pin-D08YlPs3.js.map} +1 -1
  82. package/dist/web/public/assets/{mcp-DYp7QbX8.js → mcp-Br9fBIWu.js} +2 -2
  83. package/dist/web/public/assets/{mcp-DYp7QbX8.js.map → mcp-Br9fBIWu.js.map} +1 -1
  84. package/dist/web/public/assets/{memos-Dz0jD4R5.js → memos-nZKV3SLq.js} +2 -2
  85. package/dist/web/public/assets/{memos-Dz0jD4R5.js.map → memos-nZKV3SLq.js.map} +1 -1
  86. package/dist/web/public/assets/messengers-C8ss4WVx.js +7 -0
  87. package/dist/web/public/assets/messengers-C8ss4WVx.js.map +1 -0
  88. package/dist/web/public/assets/{native-agent-ChgK3ceB.js → native-agent-BiiYK91m.js} +2 -2
  89. package/dist/web/public/assets/{native-agent-ChgK3ceB.js.map → native-agent-BiiYK91m.js.map} +1 -1
  90. package/dist/web/public/assets/{network-D8uD8vuE.js → network-D9rhTHz5.js} +2 -2
  91. package/dist/web/public/assets/{network-D8uD8vuE.js.map → network-D9rhTHz5.js.map} +1 -1
  92. package/dist/web/public/assets/{outbox-CRcmD2P1.js → outbox-BS_gla4W.js} +2 -2
  93. package/dist/web/public/assets/{outbox-CRcmD2P1.js.map → outbox-BS_gla4W.js.map} +1 -1
  94. package/dist/web/public/assets/{pagination-BK8pXuOn.js → pagination-CSuYj-hv.js} +2 -2
  95. package/dist/web/public/assets/{pagination-BK8pXuOn.js.map → pagination-CSuYj-hv.js.map} +1 -1
  96. package/dist/web/public/assets/{persona-Dk4Y24TF.js → persona-BByKd8Zd.js} +2 -2
  97. package/dist/web/public/assets/{persona-Dk4Y24TF.js.map → persona-BByKd8Zd.js.map} +1 -1
  98. package/dist/web/public/assets/{play-BAwY0kZY.js → play-B_11jKz_.js} +2 -2
  99. package/dist/web/public/assets/{play-BAwY0kZY.js.map → play-B_11jKz_.js.map} +1 -1
  100. package/dist/web/public/assets/{plus-Qg7H_hBC.js → plus-BxhCliGV.js} +2 -2
  101. package/dist/web/public/assets/{plus-Qg7H_hBC.js.map → plus-BxhCliGV.js.map} +1 -1
  102. package/dist/web/public/assets/{policy-bd1_X4KT.js → policy-CHbUM0MU.js} +2 -2
  103. package/dist/web/public/assets/{policy-bd1_X4KT.js.map → policy-CHbUM0MU.js.map} +1 -1
  104. package/dist/web/public/assets/{refresh-ccw-DjeeSzbz.js → refresh-ccw-BKw5Agez.js} +2 -2
  105. package/dist/web/public/assets/{refresh-ccw-DjeeSzbz.js.map → refresh-ccw-BKw5Agez.js.map} +1 -1
  106. package/dist/web/public/assets/{reminders-CyNYrPCo.js → reminders-_MsAKlS7.js} +2 -2
  107. package/dist/web/public/assets/{reminders-CyNYrPCo.js.map → reminders-_MsAKlS7.js.map} +1 -1
  108. package/dist/web/public/assets/{save-B6_ssx8c.js → save-DznSJZGN.js} +2 -2
  109. package/dist/web/public/assets/{save-B6_ssx8c.js.map → save-DznSJZGN.js.map} +1 -1
  110. package/dist/web/public/assets/{schedules-DVxENvba.js → schedules-CiRZXonB.js} +2 -2
  111. package/dist/web/public/assets/{schedules-DVxENvba.js.map → schedules-CiRZXonB.js.map} +1 -1
  112. package/dist/web/public/assets/{search-BJwBDf0Q.js → search-CXr_r7L8.js} +2 -2
  113. package/dist/web/public/assets/{search-BJwBDf0Q.js.map → search-CXr_r7L8.js.map} +1 -1
  114. package/dist/web/public/assets/{security-Co1823U6.js → security-CjySIq-k.js} +2 -2
  115. package/dist/web/public/assets/{security-Co1823U6.js.map → security-CjySIq-k.js.map} +1 -1
  116. package/dist/web/public/assets/{service-BJ2kE446.js → service-LXlgJooI.js} +2 -2
  117. package/dist/web/public/assets/{service-BJ2kE446.js.map → service-LXlgJooI.js.map} +1 -1
  118. package/dist/web/public/assets/{status-badge-3nnQTZXz.js → status-badge-BsPU9NHK.js} +2 -2
  119. package/dist/web/public/assets/{status-badge-3nnQTZXz.js.map → status-badge-BsPU9NHK.js.map} +1 -1
  120. package/dist/web/public/assets/{subtasks-BgHm-5dB.js → subtasks-DM8tJkC7.js} +2 -2
  121. package/dist/web/public/assets/{subtasks-BgHm-5dB.js.map → subtasks-DM8tJkC7.js.map} +1 -1
  122. package/dist/web/public/assets/{table-CNXI0HD-.js → table-CQbO75bn.js} +2 -2
  123. package/dist/web/public/assets/{table-CNXI0HD-.js.map → table-CQbO75bn.js.map} +1 -1
  124. package/dist/web/public/assets/{topn-C1PyG8Ns.js → topn-CaCYQ1NI.js} +2 -2
  125. package/dist/web/public/assets/{topn-C1PyG8Ns.js.map → topn-CaCYQ1NI.js.map} +1 -1
  126. package/dist/web/public/assets/{trash-2-CjkttCxU.js → trash-2-CdgBbY1Z.js} +2 -2
  127. package/dist/web/public/assets/{trash-2-CjkttCxU.js.map → trash-2-CdgBbY1Z.js.map} +1 -1
  128. package/dist/web/public/assets/{use-background-tasks-CLf78_yn.js → use-background-tasks-DUDxcbbl.js} +2 -2
  129. package/dist/web/public/assets/{use-background-tasks-CLf78_yn.js.map → use-background-tasks-DUDxcbbl.js.map} +1 -1
  130. package/dist/web/public/assets/{use-llm-admin-CzL0zcIi.js → use-llm-admin-Bpy7nDu-.js} +2 -2
  131. package/dist/web/public/assets/{use-llm-admin-CzL0zcIi.js.map → use-llm-admin-Bpy7nDu-.js.map} +1 -1
  132. package/dist/web/public/assets/{use-memory-DrJjdPYo.js → use-memory-B00AYXi0.js} +2 -2
  133. package/dist/web/public/assets/{use-memory-DrJjdPYo.js.map → use-memory-B00AYXi0.js.map} +1 -1
  134. package/dist/web/public/assets/{use-observability-1j7-vMy5.js → use-observability-7ETfQyEP.js} +2 -2
  135. package/dist/web/public/assets/{use-observability-1j7-vMy5.js.map → use-observability-7ETfQyEP.js.map} +1 -1
  136. package/dist/web/public/assets/{use-settings-BLcy2mrv.js → use-settings-tzqyzhw3.js} +2 -2
  137. package/dist/web/public/assets/{use-settings-BLcy2mrv.js.map → use-settings-tzqyzhw3.js.map} +1 -1
  138. package/dist/web/public/assets/{use-workspace-BLXvLTDF.js → use-workspace-B5gbK4s5.js} +2 -2
  139. package/dist/web/public/assets/{use-workspace-BLXvLTDF.js.map → use-workspace-B5gbK4s5.js.map} +1 -1
  140. package/dist/web/public/assets/{useQuery-xB5dCeu-.js → useQuery-wnQifGeZ.js} +2 -2
  141. package/dist/web/public/assets/{useQuery-xB5dCeu-.js.map → useQuery-wnQifGeZ.js.map} +1 -1
  142. package/dist/web/public/assets/{vector-EOjQsr7r.js → vector-or1-MfRX.js} +2 -2
  143. package/dist/web/public/assets/{vector-EOjQsr7r.js.map → vector-or1-MfRX.js.map} +1 -1
  144. package/dist/web/public/assets/{viewer-D_I2ikzf.js → viewer-C0f5b5eT.js} +2 -2
  145. package/dist/web/public/assets/{viewer-D_I2ikzf.js.map → viewer-C0f5b5eT.js.map} +1 -1
  146. package/dist/web/public/assets/{workspace-lMCzYJAB.js → workspace-CGE46-O2.js} +2 -2
  147. package/dist/web/public/assets/{workspace-lMCzYJAB.js.map → workspace-CGE46-O2.js.map} +1 -1
  148. package/dist/web/public/assets/{workspaces-Ciyjiowm.js → workspaces-CqDIcIXo.js} +2 -2
  149. package/dist/web/public/assets/{workspaces-Ciyjiowm.js.map → workspaces-CqDIcIXo.js.map} +1 -1
  150. package/dist/web/public/assets/{x-DP0VnoG9.js → x-DBZPbfu3.js} +2 -2
  151. package/dist/web/public/assets/{x-DP0VnoG9.js.map → x-DBZPbfu3.js.map} +1 -1
  152. package/dist/web/public/index.html +1 -1
  153. package/dist/web/server.d.ts.map +1 -1
  154. package/dist/web/server.js +21 -41
  155. package/dist/web/server.js.map +1 -1
  156. package/package.json +1 -1
  157. package/dist/web/public/_app.js +0 -248
  158. package/dist/web/public/assets/messengers-Bewhby2_.js +0 -7
  159. package/dist/web/public/assets/messengers-Bewhby2_.js.map +0 -1
  160. package/dist/web/public/memos.html +0 -352
  161. package/dist/web/public/reminders.html +0 -332
  162. package/dist/web/public/settings.html +0 -2488
  163. package/dist/web/public/tasks.html +0 -3724
@@ -40,7 +40,6 @@ const PUBLIC_EXACT_PATHS = new Set([
40
40
  '/login', '/login.html',
41
41
  '/api/auth/login',
42
42
  '/api/health',
43
- '/_app.js',
44
43
  '/loc', '/loc.html',
45
44
  // POST /api/loc (the bare path, no trailing slash) is the H5 page's
46
45
  // "submit my coordinates" endpoint. It's authenticated by the single-use
@@ -361,28 +360,27 @@ export async function startWebServer(options) {
361
360
  // Loopback peers + the public paths below bypass.
362
361
  if (!checkAuth(req, res, url))
363
362
  return;
364
- // v2 SPA fallback default ON since 1.2.21 (the v2 SPA shell is now
365
- // the only `index.html` we ship; the v1 monolithic HTML was retired
366
- // during M1 / R10). This branch serves the SPA chunks under
367
- // `/assets/*.js`, the favicon / manifest, and falls back to
368
- // index.html for any client-side route. Without this branch a fresh
369
- // install hits a white screen `<script src="/assets/…js">` 404s
370
- // because no other handler claims that path.
363
+ // v1.2.72 — v2 SPA is the only web admin. The legacy v1 monolithic
364
+ // HTML pages (settings.html / tasks.html / reminders.html /
365
+ // memos.html / _app.js) have been removed; the `IMHUB_WEB_V2` env
366
+ // gate is gone there is no v1 fallback anymore. Operators who
367
+ // were on the legacy layout flipped over automatically when they
368
+ // upgraded past 1.2.21 (default switch); the env knob remained as
369
+ // a back-out hatch through 1.2.71 and is retired here.
371
370
  //
372
- // Operators on a deeply-customised v1 layout can opt out with
373
- // `IMHUB_WEB_V2=0`; that drops back into the v1 handler block below,
374
- // which still serves the legacy `tasks.html` / `reminders.html` /
375
- // `memos.html` / `settings.html` directly. The default-off shape
376
- // shipped through 1.2.20.
377
- if (process.env.IMHUB_WEB_V2 !== '0' && req.method === 'GET') {
371
+ // This branch serves the SPA chunks under `/assets/*.js`, the
372
+ // favicon / manifest, and falls back to `index.html` for any
373
+ // client-side route. Without it a fresh install hits a white
374
+ // screen because `<script src="/assets/…js">` 404s no other
375
+ // handler claims that path.
376
+ if (req.method === 'GET') {
378
377
  const p = url.pathname;
379
378
  const isApi = p.startsWith('/api/');
380
379
  const isWs = p.startsWith('/ws');
381
380
  const isSse = p === '/events';
382
381
  const isVendor = p.startsWith('/vendor/');
383
- const isLegacyShared = p === '/_app.js' || p === '/_shell.css';
384
382
  const isPublicSsr = p === '/loc' || p === '/loc.html' || p.startsWith('/l/') || p.startsWith('/v/');
385
- if (!isApi && !isWs && !isSse && !isVendor && !isLegacyShared && !isPublicSsr) {
383
+ if (!isApi && !isWs && !isSse && !isVendor && !isPublicSsr) {
386
384
  // SPA static asset (assets/index-xxx.js, /manifest.webmanifest,
387
385
  // /favicon.svg) → return the file if it exists in PUBLIC_DIR.
388
386
  // Otherwise fall back to /index.html so the router handles it.
@@ -403,22 +401,6 @@ export async function startWebServer(options) {
403
401
  }
404
402
  // Falls through to API / WS / SSR-page handlers below.
405
403
  }
406
- // Static pages — direct serve, no auth gate. This is the v1
407
- // routing path; v2 takes precedence when IMHUB_WEB_V2=1 (above).
408
- if (url.pathname === '/' || url.pathname === '/index.html' ||
409
- url.pathname === '/settings' || url.pathname === '/settings.html' ||
410
- url.pathname === '/tasks' || url.pathname === '/tasks.html' ||
411
- url.pathname === '/reminders' || url.pathname === '/reminders.html' ||
412
- url.pathname === '/memos' || url.pathname === '/memos.html') {
413
- const fileMap = {
414
- '/': 'index.html', '/index.html': 'index.html',
415
- '/settings': 'settings.html', '/settings.html': 'settings.html',
416
- '/tasks': 'tasks.html', '/tasks.html': 'tasks.html',
417
- '/reminders': 'reminders.html', '/reminders.html': 'reminders.html',
418
- '/memos': 'memos.html', '/memos.html': 'memos.html',
419
- };
420
- return servePageHtml(res, join(PUBLIC_DIR, fileMap[url.pathname]));
421
- }
422
404
  // M4: /api/health is intentionally public (k8s liveness probe friendly)
423
405
  // — declare it BEFORE the /api/* token gate so callers don't need to
424
406
  // know the web token. Returns only operational status, not config.
@@ -436,13 +418,6 @@ export async function startWebServer(options) {
436
418
  if (url.pathname === '/login' && req.method === 'GET') {
437
419
  return serveStatic(res, join(PUBLIC_DIR, 'login.html'), 'text/html; charset=utf-8');
438
420
  }
439
- // Shared web-console utilities (theme manager + i18n + error boundary
440
- // + auth-aware fetch). Loaded synchronously by every static page in
441
- // <head> so the theme can apply before first paint. No secrets — safe
442
- // to serve un-authenticated.
443
- if (url.pathname === '/_app.js' && req.method === 'GET') {
444
- return serveStatic(res, join(PUBLIC_DIR, '_app.js'), 'application/javascript; charset=utf-8');
445
- }
446
421
  // v1.2.3 — vendored third-party assets (Chart.js etc). Whitelist by
447
422
  // filename pattern to keep the static surface tight. Public on
448
423
  // purpose — no auth gate (third-party libs aren't secrets).
@@ -1579,6 +1554,11 @@ async function handleGetConfig(_req, res) {
1579
1554
  features: {
1580
1555
  globalIm: showGlobalIm,
1581
1556
  remoteAgent: showRemoteAgent,
1557
+ // v1.2.71 — surface the live blacklist set so the SPA can hide
1558
+ // PlatformCards for blacklisted platforms. Without this the
1559
+ // backend filter on `messengers` / `telegram` / `feishu` etc.
1560
+ // only emptied the data but the hardcoded cards still rendered.
1561
+ blacklistedPlatforms: (await import('../core/registry.js')).getPlatformBlacklist(),
1582
1562
  },
1583
1563
  webPort: config.webPort,
1584
1564
  // R15 — acpPort travels only when remote-agent feature is on.
@@ -1788,8 +1768,8 @@ function validateWorkspacePayload(raw, expectedId) {
1788
1768
  }
1789
1769
  /**
1790
1770
  * Persist the workspaces array back to ~/.agim/config.json so changes
1791
- * survive a restart. We do not touch other config fields — settings.html
1792
- * has its own /api/config PUT for that. Best-effort: a write failure is
1771
+ * survive a restart. We do not touch other config fields — the SPA
1772
+ * settings page has its own /api/config PUT for that. Best-effort: a write failure is
1793
1773
  * logged but the in-memory registry has already been updated, so the
1794
1774
  * change is live until the next process boot.
1795
1775
  */