agim-cli 1.2.66 → 1.2.68

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 (159) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/dist/web/public/assets/{a2a-DNxqMtla.js → a2a-D5jnlU3x.js} +2 -2
  3. package/dist/web/public/assets/{a2a-DNxqMtla.js.map → a2a-D5jnlU3x.js.map} +1 -1
  4. package/dist/web/public/assets/{activity-C5_-rLe6.js → activity-Ch5O6khO.js} +2 -2
  5. package/dist/web/public/assets/{activity-C5_-rLe6.js.map → activity-Ch5O6khO.js.map} +1 -1
  6. package/dist/web/public/assets/{admins-DSOax_hH.js → admins-_M1ylhz4.js} +2 -2
  7. package/dist/web/public/assets/{admins-DSOax_hH.js.map → admins-_M1ylhz4.js.map} +1 -1
  8. package/dist/web/public/assets/{agents-T687l0rN.js → agents-ixbQiOsI.js} +2 -2
  9. package/dist/web/public/assets/{agents-T687l0rN.js.map → agents-ixbQiOsI.js.map} +1 -1
  10. package/dist/web/public/assets/{approvals-CWorM8Vw.js → approvals-BrAHLmtR.js} +2 -2
  11. package/dist/web/public/assets/{approvals-CWorM8Vw.js.map → approvals-BrAHLmtR.js.map} +1 -1
  12. package/dist/web/public/assets/{asks-PiqKpXZ1.js → asks-DSSkZWYd.js} +2 -2
  13. package/dist/web/public/assets/{asks-PiqKpXZ1.js.map → asks-DSSkZWYd.js.map} +1 -1
  14. package/dist/web/public/assets/{audit-C2Ox35e1.js → audit-CgOnCOYX.js} +2 -2
  15. package/dist/web/public/assets/{audit-C2Ox35e1.js.map → audit-CgOnCOYX.js.map} +1 -1
  16. package/dist/web/public/assets/{bell-Cj5Dt_yv.js → bell-DAEjZGtn.js} +2 -2
  17. package/dist/web/public/assets/{bell-Cj5Dt_yv.js.map → bell-DAEjZGtn.js.map} +1 -1
  18. package/dist/web/public/assets/{bgjobs-DxEVHpLB.js → bgjobs-B9KPxiJl.js} +2 -2
  19. package/dist/web/public/assets/{bgjobs-DxEVHpLB.js.map → bgjobs-B9KPxiJl.js.map} +1 -1
  20. package/dist/web/public/assets/{brain-LvSyYmLT.js → brain-D7iZGtff.js} +2 -2
  21. package/dist/web/public/assets/{brain-LvSyYmLT.js.map → brain-D7iZGtff.js.map} +1 -1
  22. package/dist/web/public/assets/{briefcase-CJMKdAPu.js → briefcase-DVifKdtB.js} +2 -2
  23. package/dist/web/public/assets/{briefcase-CJMKdAPu.js.map → briefcase-DVifKdtB.js.map} +1 -1
  24. package/dist/web/public/assets/{chevron-right-BUOV_Xg8.js → chevron-right-ES5OLdHR.js} +2 -2
  25. package/dist/web/public/assets/{chevron-right-BUOV_Xg8.js.map → chevron-right-ES5OLdHR.js.map} +1 -1
  26. package/dist/web/public/assets/{circle-check-BYLlUkXj.js → circle-check-B56tPP-z.js} +2 -2
  27. package/dist/web/public/assets/{circle-check-BYLlUkXj.js.map → circle-check-B56tPP-z.js.map} +1 -1
  28. package/dist/web/public/assets/{circle-check-big-KNa00WXm.js → circle-check-big-krrxgPiD.js} +2 -2
  29. package/dist/web/public/assets/{circle-check-big-KNa00WXm.js.map → circle-check-big-krrxgPiD.js.map} +1 -1
  30. package/dist/web/public/assets/{circle-x-CGLLbBL-.js → circle-x-D6zUfmKm.js} +2 -2
  31. package/dist/web/public/assets/{circle-x-CGLLbBL-.js.map → circle-x-D6zUfmKm.js.map} +1 -1
  32. package/dist/web/public/assets/{confirm-dialog-CLfYzx-a.js → confirm-dialog-Dw9H-rCY.js} +2 -2
  33. package/dist/web/public/assets/{confirm-dialog-CLfYzx-a.js.map → confirm-dialog-Dw9H-rCY.js.map} +1 -1
  34. package/dist/web/public/assets/{data-table-ZySeRfEP.js → data-table-CTpyjb3w.js} +2 -2
  35. package/dist/web/public/assets/{data-table-ZySeRfEP.js.map → data-table-CTpyjb3w.js.map} +1 -1
  36. package/dist/web/public/assets/{dialog-DS0Dk6GL.js → dialog-C65YjHki.js} +2 -2
  37. package/dist/web/public/assets/{dialog-DS0Dk6GL.js.map → dialog-C65YjHki.js.map} +1 -1
  38. package/dist/web/public/assets/{download-1aUlz7_D.js → download-DsbMB1e1.js} +2 -2
  39. package/dist/web/public/assets/{download-1aUlz7_D.js.map → download-DsbMB1e1.js.map} +1 -1
  40. package/dist/web/public/assets/{email-BkAvhVxU.js → email-CUJkdRDB.js} +2 -2
  41. package/dist/web/public/assets/{email-BkAvhVxU.js.map → email-CUJkdRDB.js.map} +1 -1
  42. package/dist/web/public/assets/{empty-state-BclIaHPD.js → empty-state-Cm17gTVv.js} +2 -2
  43. package/dist/web/public/assets/{empty-state-BclIaHPD.js.map → empty-state-Cm17gTVv.js.map} +1 -1
  44. package/dist/web/public/assets/{external-link-Ckz2th0a.js → external-link-e4jSLO58.js} +2 -2
  45. package/dist/web/public/assets/{external-link-Ckz2th0a.js.map → external-link-e4jSLO58.js.map} +1 -1
  46. package/dist/web/public/assets/{eye-DGRzJ5lb.js → eye-CooHmujZ.js} +2 -2
  47. package/dist/web/public/assets/{eye-DGRzJ5lb.js.map → eye-CooHmujZ.js.map} +1 -1
  48. package/dist/web/public/assets/{facts-CUY-brWq.js → facts-DynPEPya.js} +2 -2
  49. package/dist/web/public/assets/{facts-CUY-brWq.js.map → facts-DynPEPya.js.map} +1 -1
  50. package/dist/web/public/assets/{goals-5uN3gp8c.js → goals-t0vB4Tfm.js} +2 -2
  51. package/dist/web/public/assets/{goals-5uN3gp8c.js.map → goals-t0vB4Tfm.js.map} +1 -1
  52. package/dist/web/public/assets/{health-bp5Qgneq.js → health-B6Nf5nrQ.js} +2 -2
  53. package/dist/web/public/assets/{health-bp5Qgneq.js.map → health-B6Nf5nrQ.js.map} +1 -1
  54. package/dist/web/public/assets/{heart-pulse-BnB8Mahi.js → heart-pulse-D167fJJk.js} +2 -2
  55. package/dist/web/public/assets/{heart-pulse-BnB8Mahi.js.map → heart-pulse-D167fJJk.js.map} +1 -1
  56. package/dist/web/public/assets/{heartbeat-ClNB_aaM.js → heartbeat-mUU1PBDP.js} +2 -2
  57. package/dist/web/public/assets/{heartbeat-ClNB_aaM.js.map → heartbeat-mUU1PBDP.js.map} +1 -1
  58. package/dist/web/public/assets/{hot-CXFYYRzt.js → hot-BSPUd7sX.js} +2 -2
  59. package/dist/web/public/assets/{hot-CXFYYRzt.js.map → hot-BSPUd7sX.js.map} +1 -1
  60. package/dist/web/public/assets/{index-B_MJTcDz.js → index-DG_LHVpy.js} +12 -12
  61. package/dist/web/public/assets/index-DG_LHVpy.js.map +1 -0
  62. package/dist/web/public/assets/{installed-BRhOTT0w.js → installed-BsoeXLFx.js} +2 -2
  63. package/dist/web/public/assets/{installed-BRhOTT0w.js.map → installed-BsoeXLFx.js.map} +1 -1
  64. package/dist/web/public/assets/{jobs-SGgiVMdm.js → jobs-HxUYTICT.js} +2 -2
  65. package/dist/web/public/assets/{jobs-SGgiVMdm.js.map → jobs-HxUYTICT.js.map} +1 -1
  66. package/dist/web/public/assets/{layout-CNhFryQ_.js → layout-7GnGj0lA.js} +2 -2
  67. package/dist/web/public/assets/{layout-CNhFryQ_.js.map → layout-7GnGj0lA.js.map} +1 -1
  68. package/dist/web/public/assets/{layout-C0BXTGdU.js → layout-C_hnc_UF.js} +2 -2
  69. package/dist/web/public/assets/{layout-C0BXTGdU.js.map → layout-C_hnc_UF.js.map} +1 -1
  70. package/dist/web/public/assets/layout-Cgu_PEw0.js +2 -0
  71. package/dist/web/public/assets/layout-Cgu_PEw0.js.map +1 -0
  72. package/dist/web/public/assets/{layout-CxIivtIC.js → layout-CvOpVhvp.js} +2 -2
  73. package/dist/web/public/assets/{layout-CxIivtIC.js.map → layout-CvOpVhvp.js.map} +1 -1
  74. package/dist/web/public/assets/{layout-BMehqBaD.js → layout-IkZ1uemn.js} +2 -2
  75. package/dist/web/public/assets/{layout-BMehqBaD.js.map → layout-IkZ1uemn.js.map} +1 -1
  76. package/dist/web/public/assets/{llm-BuvGS_vU.js → llm-B2y8oyog.js} +2 -2
  77. package/dist/web/public/assets/{llm-BuvGS_vU.js.map → llm-B2y8oyog.js.map} +1 -1
  78. package/dist/web/public/assets/{loader-circle-CWYFBw93.js → loader-circle-DPuvakPP.js} +2 -2
  79. package/dist/web/public/assets/{loader-circle-CWYFBw93.js.map → loader-circle-DPuvakPP.js.map} +1 -1
  80. package/dist/web/public/assets/{map-pin-CHW2BahT.js → map-pin-DzrzVdfp.js} +2 -2
  81. package/dist/web/public/assets/{map-pin-CHW2BahT.js.map → map-pin-DzrzVdfp.js.map} +1 -1
  82. package/dist/web/public/assets/{mcp-Bs02bxka.js → mcp-BvjO6Qxb.js} +2 -2
  83. package/dist/web/public/assets/{mcp-Bs02bxka.js.map → mcp-BvjO6Qxb.js.map} +1 -1
  84. package/dist/web/public/assets/{memos-DHGW-Qni.js → memos-bmjNc9qk.js} +2 -2
  85. package/dist/web/public/assets/{memos-DHGW-Qni.js.map → memos-bmjNc9qk.js.map} +1 -1
  86. package/dist/web/public/assets/{messengers-DrKKVSEA.js → messengers-B5GHoXqI.js} +2 -2
  87. package/dist/web/public/assets/{messengers-DrKKVSEA.js.map → messengers-B5GHoXqI.js.map} +1 -1
  88. package/dist/web/public/assets/{native-agent-D2cbs5yG.js → native-agent-yRX-IBe1.js} +2 -2
  89. package/dist/web/public/assets/{native-agent-D2cbs5yG.js.map → native-agent-yRX-IBe1.js.map} +1 -1
  90. package/dist/web/public/assets/{network-BlGBHSOz.js → network-Dac8A7p-.js} +2 -2
  91. package/dist/web/public/assets/{network-BlGBHSOz.js.map → network-Dac8A7p-.js.map} +1 -1
  92. package/dist/web/public/assets/{outbox-BNiVF52F.js → outbox-Dx_FvKMP.js} +2 -2
  93. package/dist/web/public/assets/{outbox-BNiVF52F.js.map → outbox-Dx_FvKMP.js.map} +1 -1
  94. package/dist/web/public/assets/{pagination-B5Cwu4pq.js → pagination-D9B2d2q0.js} +2 -2
  95. package/dist/web/public/assets/{pagination-B5Cwu4pq.js.map → pagination-D9B2d2q0.js.map} +1 -1
  96. package/dist/web/public/assets/{persona-D7TRqgsy.js → persona-BXKRIYXm.js} +2 -2
  97. package/dist/web/public/assets/{persona-D7TRqgsy.js.map → persona-BXKRIYXm.js.map} +1 -1
  98. package/dist/web/public/assets/{play-CmTdWGab.js → play-BUdq9hBS.js} +2 -2
  99. package/dist/web/public/assets/{play-CmTdWGab.js.map → play-BUdq9hBS.js.map} +1 -1
  100. package/dist/web/public/assets/{plus-BYmkO51v.js → plus-CuVC2G0S.js} +2 -2
  101. package/dist/web/public/assets/{plus-BYmkO51v.js.map → plus-CuVC2G0S.js.map} +1 -1
  102. package/dist/web/public/assets/{policy-CrFIBtzs.js → policy-D3lhzoun.js} +2 -2
  103. package/dist/web/public/assets/{policy-CrFIBtzs.js.map → policy-D3lhzoun.js.map} +1 -1
  104. package/dist/web/public/assets/{refresh-ccw-DgHgDBFU.js → refresh-ccw-KVbKtjsH.js} +2 -2
  105. package/dist/web/public/assets/{refresh-ccw-DgHgDBFU.js.map → refresh-ccw-KVbKtjsH.js.map} +1 -1
  106. package/dist/web/public/assets/{reminders-Dh2VXBAt.js → reminders-CGyUyQBl.js} +2 -2
  107. package/dist/web/public/assets/{reminders-Dh2VXBAt.js.map → reminders-CGyUyQBl.js.map} +1 -1
  108. package/dist/web/public/assets/{save-BTdbl1sB.js → save-CXEX7AiY.js} +2 -2
  109. package/dist/web/public/assets/{save-BTdbl1sB.js.map → save-CXEX7AiY.js.map} +1 -1
  110. package/dist/web/public/assets/{schedules-C98Syrst.js → schedules-lWx5lIO-.js} +2 -2
  111. package/dist/web/public/assets/{schedules-C98Syrst.js.map → schedules-lWx5lIO-.js.map} +1 -1
  112. package/dist/web/public/assets/{search-CgUr_Tjy.js → search-BxQJVSx8.js} +2 -2
  113. package/dist/web/public/assets/{search-CgUr_Tjy.js.map → search-BxQJVSx8.js.map} +1 -1
  114. package/dist/web/public/assets/security-DBfcNVw-.js +7 -0
  115. package/dist/web/public/assets/security-DBfcNVw-.js.map +1 -0
  116. package/dist/web/public/assets/{service-Dlw--ni7.js → service-B5Xmuldn.js} +2 -2
  117. package/dist/web/public/assets/{service-Dlw--ni7.js.map → service-B5Xmuldn.js.map} +1 -1
  118. package/dist/web/public/assets/{status-badge-rlmqIgUK.js → status-badge-MM6M-eFF.js} +2 -2
  119. package/dist/web/public/assets/{status-badge-rlmqIgUK.js.map → status-badge-MM6M-eFF.js.map} +1 -1
  120. package/dist/web/public/assets/{subtasks-BHJXEg1-.js → subtasks-B6MyfzRw.js} +2 -2
  121. package/dist/web/public/assets/{subtasks-BHJXEg1-.js.map → subtasks-B6MyfzRw.js.map} +1 -1
  122. package/dist/web/public/assets/{table-CyYHo50D.js → table-DCYYH-Yk.js} +2 -2
  123. package/dist/web/public/assets/{table-CyYHo50D.js.map → table-DCYYH-Yk.js.map} +1 -1
  124. package/dist/web/public/assets/{topn-CQjlFpTX.js → topn-CaRu8cFq.js} +2 -2
  125. package/dist/web/public/assets/{topn-CQjlFpTX.js.map → topn-CaRu8cFq.js.map} +1 -1
  126. package/dist/web/public/assets/{trash-2-C7RhXr5v.js → trash-2-BC232qKU.js} +2 -2
  127. package/dist/web/public/assets/{trash-2-C7RhXr5v.js.map → trash-2-BC232qKU.js.map} +1 -1
  128. package/dist/web/public/assets/{use-background-tasks-Xk52LztT.js → use-background-tasks-B8Glf2JM.js} +2 -2
  129. package/dist/web/public/assets/{use-background-tasks-Xk52LztT.js.map → use-background-tasks-B8Glf2JM.js.map} +1 -1
  130. package/dist/web/public/assets/{use-llm-admin-xgIdH9Kw.js → use-llm-admin-DM34gUYq.js} +2 -2
  131. package/dist/web/public/assets/{use-llm-admin-xgIdH9Kw.js.map → use-llm-admin-DM34gUYq.js.map} +1 -1
  132. package/dist/web/public/assets/{use-memory-DtZHF20y.js → use-memory-BDlIEEfk.js} +2 -2
  133. package/dist/web/public/assets/{use-memory-DtZHF20y.js.map → use-memory-BDlIEEfk.js.map} +1 -1
  134. package/dist/web/public/assets/{use-observability-nUGyBvW4.js → use-observability-D7ePifSS.js} +2 -2
  135. package/dist/web/public/assets/{use-observability-nUGyBvW4.js.map → use-observability-D7ePifSS.js.map} +1 -1
  136. package/dist/web/public/assets/{use-settings-BjibxUyB.js → use-settings-D6y3lscb.js} +2 -2
  137. package/dist/web/public/assets/{use-settings-BjibxUyB.js.map → use-settings-D6y3lscb.js.map} +1 -1
  138. package/dist/web/public/assets/{use-workspace-DzyMsk0c.js → use-workspace-C9WiGclY.js} +2 -2
  139. package/dist/web/public/assets/{use-workspace-DzyMsk0c.js.map → use-workspace-C9WiGclY.js.map} +1 -1
  140. package/dist/web/public/assets/{useQuery-DI6dxASQ.js → useQuery-D6icKl-l.js} +2 -2
  141. package/dist/web/public/assets/{useQuery-DI6dxASQ.js.map → useQuery-D6icKl-l.js.map} +1 -1
  142. package/dist/web/public/assets/{vector-Bu_EzONh.js → vector-DgyB8_1O.js} +2 -2
  143. package/dist/web/public/assets/{vector-Bu_EzONh.js.map → vector-DgyB8_1O.js.map} +1 -1
  144. package/dist/web/public/assets/{viewer-DbJxZOmC.js → viewer-D6Lc51GN.js} +2 -2
  145. package/dist/web/public/assets/{viewer-DbJxZOmC.js.map → viewer-D6Lc51GN.js.map} +1 -1
  146. package/dist/web/public/assets/{workspace-DAYMQHog.js → workspace-BB3GxkMv.js} +2 -2
  147. package/dist/web/public/assets/{workspace-DAYMQHog.js.map → workspace-BB3GxkMv.js.map} +1 -1
  148. package/dist/web/public/assets/{workspaces-DGRs1EZm.js → workspaces-DeZZzq6K.js} +2 -2
  149. package/dist/web/public/assets/{workspaces-DGRs1EZm.js.map → workspaces-DeZZzq6K.js.map} +1 -1
  150. package/dist/web/public/assets/{x-DEBwh51E.js → x-CwtxXdNl.js} +2 -2
  151. package/dist/web/public/assets/{x-DEBwh51E.js.map → x-CwtxXdNl.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 +78 -0
  155. package/dist/web/server.js.map +1 -1
  156. package/package.json +1 -1
  157. package/dist/web/public/assets/index-B_MJTcDz.js.map +0 -1
  158. package/dist/web/public/assets/layout-Czg1K2be.js +0 -2
  159. package/dist/web/public/assets/layout-Czg1K2be.js.map +0 -1
@@ -722,6 +722,14 @@ export async function startWebServer(options) {
722
722
  return;
723
723
  return handlePutEnv(req, res);
724
724
  }
725
+ // v1.2.67 — Security diagnostics. Surfaces boot-time observations the
726
+ // Security UI page renders as read-only badges (uid, env file perms,
727
+ // bwrap availability, IMHUB_ALLOWED_USERS configured? …).
728
+ if (url.pathname === '/api/security/diagnostics' && req.method === 'GET') {
729
+ if (!requireAdmin(req, res))
730
+ return;
731
+ return handleSecurityDiagnostics(req, res);
732
+ }
725
733
  if (url.pathname === '/api/messengers/email/test' && req.method === 'POST') {
726
734
  if (!requireAdmin(req, res))
727
735
  return;
@@ -2661,10 +2669,80 @@ const ENV_EDITABLE_KEYS = [
2661
2669
  'IMHUB_MEMORY_VECTOR_OPENAI_API_KEY',
2662
2670
  'IMHUB_MEMORY_VECTOR_BATCH_SIZE',
2663
2671
  'IMHUB_MEMORY_VECTOR_HYBRID_WEIGHT',
2672
+ // v1.2.67 — Security page surfaces these (added in v1.2.58–v1.2.66).
2673
+ // Sender allowlist — who can talk to the bot at all.
2674
+ 'IMHUB_ALLOWED_USERS',
2675
+ // Native fs tools — workspace restriction + per-tool timeout.
2676
+ 'IMHUB_NATIVE_FS_RESTRICT',
2677
+ 'IMHUB_NATIVE_FS_TIMEOUT_MS',
2678
+ // Native web tools — SSRF guards.
2679
+ 'IMHUB_NATIVE_WEB_ALLOW_PRIVATE',
2680
+ 'IMHUB_NATIVE_WEB_SSRF_WHITELIST',
2681
+ 'IMHUB_NATIVE_WEB_TIMEOUT_MS',
2682
+ // Native exec tool — bwrap sandbox + sub-knobs.
2683
+ 'IMHUB_EXEC_SANDBOX',
2684
+ 'IMHUB_EXEC_SANDBOX_NET',
2685
+ 'IMHUB_EXEC_TIMEOUT_MS',
2686
+ 'IMHUB_EXEC_MAX_OUTPUT',
2687
+ // Native call_agent per-turn cap.
2688
+ 'IMHUB_NATIVE_CALL_AGENT_MAX_PER_TURN',
2664
2689
  ];
2665
2690
  const SECRET_KEYS = new Set(['IMHUB_SMTP_PASS', 'IMHUB_BAIDU_MAP_AK', 'IMHUB_MEMORY_VECTOR_OPENAI_API_KEY']);
2666
2691
  // maskSecret moved to ./env-mask.ts (imported at the top of this file
2667
2692
  // alongside isMasked).
2693
+ /** v1.2.67 — Security diagnostics endpoint. Returns the boot-time
2694
+ * safety observations the Security UI page renders as badges. None
2695
+ * of the values are secret; the endpoint is admin-gated only to
2696
+ * prevent reconnaissance via an open UI. */
2697
+ async function handleSecurityDiagnostics(_req, res) {
2698
+ try {
2699
+ const { ENV_FILE } = await import('../cli-ui/env-file.js');
2700
+ const { statSync, existsSync } = await import('node:fs');
2701
+ const getUid = process.getuid;
2702
+ const runningAsRoot = typeof getUid === 'function' ? getUid() === 0 : null;
2703
+ let envFile = {
2704
+ exists: false, mode: null, tooPermissive: false,
2705
+ };
2706
+ try {
2707
+ if (existsSync(ENV_FILE)) {
2708
+ const st = statSync(ENV_FILE);
2709
+ const mode = st.mode & 0o777;
2710
+ envFile = {
2711
+ exists: true,
2712
+ mode: mode.toString(8).padStart(3, '0'),
2713
+ tooPermissive: (mode & 0o077) !== 0,
2714
+ };
2715
+ }
2716
+ }
2717
+ catch { /* leave defaults */ }
2718
+ const bwrapAvailable = existsSync('/usr/bin/bwrap');
2719
+ const { isSenderAllowlistConfigured } = await import('../core/sender-allowlist.js');
2720
+ const senderAllowlistConfigured = isSenderAllowlistConfigured();
2721
+ const { isAllowlistConfigured: isAdminConfigured } = await import('../core/admin-allowlist.js');
2722
+ const adminAllowlistConfigured = isAdminConfigured();
2723
+ sendJson(res, 200, {
2724
+ diagnostics: {
2725
+ runningAsRoot,
2726
+ envFile,
2727
+ bwrapAvailable,
2728
+ senderAllowlistConfigured,
2729
+ adminAllowlistConfigured,
2730
+ // Live env values so the UI can show what's effectively in force
2731
+ // (process.env, which is what runtime sees) without round-tripping
2732
+ // through the env file.
2733
+ liveEnv: {
2734
+ IMHUB_EXEC_SANDBOX: process.env.IMHUB_EXEC_SANDBOX ?? null,
2735
+ IMHUB_NATIVE_FS_RESTRICT: process.env.IMHUB_NATIVE_FS_RESTRICT ?? null,
2736
+ IMHUB_TIMEOUT_DEFAULT: process.env.IMHUB_TIMEOUT_DEFAULT ?? null,
2737
+ IMHUB_DANGEROUSLY_SKIP_PERMISSIONS: process.env.IMHUB_DANGEROUSLY_SKIP_PERMISSIONS ?? null,
2738
+ },
2739
+ },
2740
+ });
2741
+ }
2742
+ catch (err) {
2743
+ sendJson(res, 500, { error: err instanceof Error ? err.message : String(err) });
2744
+ }
2745
+ }
2668
2746
  async function handleGetEnv(_req, res, url) {
2669
2747
  try {
2670
2748
  const { readEnvFile } = await import('../cli-ui/env-file.js');