@openhands/agent-canvas 1.7.2 → 1.9.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 (599) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/{Trans-DP5rcauH.js → Trans-Bwpzk1wT.js} +1 -1
  4. package/build/assets/{acp-providers-BHKZvEm5.js → acp-providers-C921BlYB.js} +1 -1
  5. package/build/assets/active-backend-context-BiwzkzDy.js +2 -0
  6. package/build/assets/agent-context-settings-DXNT_dcw.js +1 -0
  7. package/build/assets/agent-profiles-settings-BymJf3EP.js +1 -0
  8. package/build/assets/agent-server-conversation-service.api-CYSWw-2g.js +41 -0
  9. package/build/assets/agent-settings-BjgQQe-_.js +1 -0
  10. package/build/assets/{agent-settings-BIOsUglV.js → agent-settings-WzqXk6B4.js} +2 -2
  11. package/build/assets/{alert-banner-C1nzoXBC.js → alert-banner-DR8EVyZM.js} +1 -1
  12. package/build/assets/api-error-message-e16L1kwH.js +1 -0
  13. package/build/assets/api-key-entry-screen-DI0I04O3.js +1 -0
  14. package/build/assets/app-settings-DGistSFV.js +1 -0
  15. package/build/assets/automation-C_eCrGyP.js +1 -0
  16. package/build/assets/automation-detail-DY6x2FW1.js +2 -0
  17. package/build/assets/automation-export-C09f-Lua.js +2 -0
  18. package/build/assets/automation-setup-route-CqKp0717.js +1 -0
  19. package/build/assets/automations-list-CqWJ7qXW.js +1 -0
  20. package/build/assets/{back-nav-button-Be_L157B.js → back-nav-button-D4ngzpSh.js} +1 -1
  21. package/build/assets/backend-form-modal-B8D5hBzK.js +1 -0
  22. package/build/assets/{backend-synced-settings-badge-BNpEylNP.js → backend-synced-settings-badge-BnzI8Ysj.js} +1 -1
  23. package/build/assets/{badge-DwgrwohM.js → badge-1Mf1iPcX.js} +1 -1
  24. package/build/assets/{base-modal-CSHhJTSr.js → base-modal-BBuy0WQQ.js} +1 -1
  25. package/build/assets/{brand-button-CQO8oqVo.js → brand-button-DGN6Y9o6.js} +1 -1
  26. package/build/assets/browser-D_ekTlTS.js +6 -0
  27. package/build/assets/{browser-tab-CEApjoEV.js → browser-tab-D4a4Ou_w.js} +1 -1
  28. package/build/assets/{chat-send-button-D4614wUz.js → chat-send-button-CgbcjD97.js} +1 -1
  29. package/build/assets/check-CPLXgluF.js +1 -0
  30. package/build/assets/chevron-down-CP4QHvyc.js +1 -0
  31. package/build/assets/circle-check-Dpy2_xSI.js +1 -0
  32. package/build/assets/{circle-plus-check-toggle-E3Ecb_gg.js → circle-plus-check-toggle-yTAS-nX3.js} +1 -1
  33. package/build/assets/cloud-funnel-analytics-CEOl5Gxr.js +1 -0
  34. package/build/assets/{combobox-caret-C8_eGdp2.js → combobox-caret-Bd2yySnF.js} +1 -1
  35. package/build/assets/command-menu-Bj6X4ckE.js +1 -0
  36. package/build/assets/condenser-settings-EAXQNR2E.js +1 -0
  37. package/build/assets/{confirmation-modal-gZtbojCm.js → confirmation-modal-NCUPr2-O.js} +1 -1
  38. package/build/assets/{context-menu-list-item-BTHGFhIx.js → context-menu-list-item-CrCrYuPF.js} +1 -1
  39. package/build/assets/conversation-BzyIcSwr.js +1 -0
  40. package/build/assets/conversation-CUJ0Vo8g.js +90 -0
  41. package/build/assets/conversation-panel-BzyIcSwr.js +1 -0
  42. package/build/assets/conversation-state-store-F62HvuI1.js +1 -0
  43. package/build/assets/{conversation-tab-empty-state-BCMHkGQk.js → conversation-tab-empty-state-BCZ7rUMH.js} +1 -1
  44. package/build/assets/{copy-B8Y5ufoR.js → copy-DCmZtz6n.js} +1 -1
  45. package/build/assets/{copy-to-clipboard-button-C4l3CMSd.js → copy-to-clipboard-button-D_Lp6-Fl.js} +1 -1
  46. package/build/assets/{device-verify-C_M7Z8xs.js → device-verify-DLmolX8Q.js} +1 -1
  47. package/build/assets/{dropdown-classes-DQlj-MpS.js → dropdown-classes-BB8rzqXL.js} +1 -1
  48. package/build/assets/{entry.client-DETaouwO.js → entry.client-BbIYOsIg.js} +2 -2
  49. package/build/assets/{enum-filter-dropdown-paB-lFSP.js → enum-filter-dropdown-C08-srev.js} +1 -1
  50. package/build/assets/{environment-switch-overlay-D0FgCMqs.js → environment-switch-overlay-BepBBX66.js} +1 -1
  51. package/build/assets/extensions-hub-R3KNv-5V.js +1 -0
  52. package/build/assets/extensions-navigation-CfWFmI1I.js +1 -0
  53. package/build/assets/{external-link-Cnnd6ikC.js → external-link-BdBSg8rk.js} +1 -1
  54. package/build/assets/files-tab-DEq8MbHu.js +1 -0
  55. package/build/assets/{form-control-classes-CSPevi7c.js → form-control-classes-DAfsCJTe.js} +1 -1
  56. package/build/assets/{format-time-delta-DuhE50B-.js → format-time-delta-CxfPJpzC.js} +1 -1
  57. package/build/assets/git-provider-icon-BZqqUPlm.js +1 -0
  58. package/build/assets/git-repo-dropdown-9WKINV6J.js +1 -0
  59. package/build/assets/git-repo-dropdown-DEpOwUez.js +1 -0
  60. package/build/assets/{highlighted-source-view-suUKd5if.js → highlighted-source-view-CX9oIoVT.js} +1 -1
  61. package/build/assets/home-CY0JaxiY.js +1 -0
  62. package/build/assets/home-CaNWlVvB.js +1 -0
  63. package/build/assets/home-store-Ch1ErdBc.js +1 -0
  64. package/build/assets/index-home-CaNWlVvB.js +1 -0
  65. package/build/assets/info-CmWQXtRQ.js +1 -0
  66. package/build/assets/install-server-modal-BWrudmZU.js +1 -0
  67. package/build/assets/{launch-Ccnhte5b.js → launch-B1POpHuP.js} +1 -1
  68. package/build/assets/{list-todo-_BXQzOiB.js → list-todo-DtiL3lTp.js} +1 -1
  69. package/build/assets/llm-not-configured-banner-3tMsM4K6.js +27 -0
  70. package/build/assets/llm-settings-CXo8iPNW.js +1 -0
  71. package/build/assets/llm-settings-D0W8mJDk.js +1 -0
  72. package/build/assets/{llm-subscription-service-W5BprsNA.js → llm-subscription-service-DBJbfd8Z.js} +1 -1
  73. package/build/assets/loader-circle-B4QDBARx.js +1 -0
  74. package/build/assets/{loading-spinner-CcpnCr_d.js → loading-spinner-DfZ_bhV7.js} +1 -1
  75. package/build/assets/manage-backends-modal-CwyWsiag.js +1 -0
  76. package/build/assets/manifest-39f4789d.js +1 -0
  77. package/build/assets/{markdown-renderer-CvOO0YIr.js → markdown-renderer-DgiLLhW6.js} +6 -6
  78. package/build/assets/mcp-DXG9LWrI.js +9 -0
  79. package/build/assets/mcp-marketplace-utils-DFmhKc5s.js +1 -0
  80. package/build/assets/messages-kBjKaAeA.js +40 -0
  81. package/build/assets/{modal-body-DQhiw-AR.js → modal-body-CMsDpalT.js} +1 -1
  82. package/build/assets/{modal-classes-YaEEa5eZ.js → modal-classes-B6PDrxXo.js} +1 -1
  83. package/build/assets/{modal-close-button-turIYn0t.js → modal-close-button-DyxBZaAb.js} +1 -1
  84. package/build/assets/{onboarding-BegDrOKn.js → onboarding-47hh2IHA.js} +1 -1
  85. package/build/assets/onboarding-modal-9BuvvROo.js +1 -0
  86. package/build/assets/organization-service.api-UDy63-oC.js +1 -0
  87. package/build/assets/{pencil-8_lvWDoZ.js → pencil-BjgtZmWp.js} +1 -1
  88. package/build/assets/{planner-tab-w6HT0N_A.js → planner-tab-BWk8885v.js} +1 -1
  89. package/build/assets/plugins-management-service-CjkgF2dd.js +1 -0
  90. package/build/assets/plus-DrKuuvMe.js +1 -0
  91. package/build/assets/profiles-service.api-CukSFLzz.js +1 -0
  92. package/build/assets/providers-CqUWC85T.js +1 -0
  93. package/build/assets/proxy-BBUG3sd2.js +1 -0
  94. package/build/assets/{puzzle-DXWdfaa7.js → puzzle-BoNc6zZ8.js} +1 -1
  95. package/build/assets/recommended-automations-launcher-ejxy1P27.js +1 -0
  96. package/build/assets/{refresh-cw-D7CYLy-d.js → refresh-cw-BrM5ZAZD.js} +1 -1
  97. package/build/assets/root-5S-M8SYa.js +2 -0
  98. package/build/assets/root-DZ39lS5f.css +1 -0
  99. package/build/assets/root-layout-BPqoa0gv.js +3 -0
  100. package/build/assets/schema-field-nImDoY6-.js +1 -0
  101. package/build/assets/{sdk-section-page-BW-i45yr.js → sdk-section-page-BxMrtUNV.js} +1 -1
  102. package/build/assets/search-Dc2qR4O2.js +1 -0
  103. package/build/assets/secrets-service-Dhjh3HhH.js +1 -0
  104. package/build/assets/{secrets-settings-D7U1ErCH.js → secrets-settings-CPdxceT_.js} +1 -1
  105. package/build/assets/segmented-toggle-Do6oyepX.js +1 -0
  106. package/build/assets/settings-BRbnfKEm.js +1 -0
  107. package/build/assets/{settings-dropdown-input-Dx6vlkgf.js → settings-dropdown-input-DYCULKpp.js} +1 -1
  108. package/build/assets/{settings-index-COAdxm2Q.js → settings-index-C9o2NBO0.js} +1 -1
  109. package/build/assets/settings-input-B-q2gkVy.js +1 -0
  110. package/build/assets/{settings-list-classes-gQdBahdt.js → settings-list-classes-WpQi0q1L.js} +1 -1
  111. package/build/assets/{settings-modal-CFnbQ8_4.js → settings-modal-CEK0AIx6.js} +1 -1
  112. package/build/assets/settings-service.api-CZiPD8__.js +1 -0
  113. package/build/assets/{settings-switch-UNSf8K8I.js → settings-switch-LqKdGxHL.js} +1 -1
  114. package/build/assets/shared-conversation-Bu-dQlgp.js +1 -0
  115. package/build/assets/{sidebar-layout-DXHtbEj1.js → sidebar-layout-oHBGQmLh.js} +1 -1
  116. package/build/assets/{sidebar-mobile-menu-toggle-U78hQRJ1.js → sidebar-mobile-menu-toggle-ND-hgygu.js} +1 -1
  117. package/build/assets/{sidebar-nav-link-pvUivfK2.js → sidebar-nav-link-CrujNA09.js} +1 -1
  118. package/build/assets/{sidebar-store-DwrYKwYr.js → sidebar-store-Bui-WNEr.js} +1 -1
  119. package/build/assets/{skill-card-pill-row-D7XCz5uk.js → skill-card-pill-row-CZBI7OqH.js} +1 -1
  120. package/build/assets/{skill-icon-badge-HqBWZ2Eq.js → skill-icon-badge-BOov_phZ.js} +1 -1
  121. package/build/assets/{skills-plugins-BPhaNpfx.js → skills-plugins-D0PiHWAD.js} +1 -1
  122. package/build/assets/{skills-settings-CcwMtnnJ.js → skills-settings-B43KArIz.js} +2 -2
  123. package/build/assets/{styled-tooltip-DsjDnR_W.js → styled-tooltip-C7grwnOX.js} +1 -1
  124. package/build/assets/{task-list-tab-BmaTwjaS.js → task-list-tab-R3ac6m7O.js} +1 -1
  125. package/build/assets/{terminal-BRcoba5B.js → terminal-yqkNdEAx.js} +1 -1
  126. package/build/assets/{toggle-switch-BptY3XRG.js → toggle-switch-BeSrbgCg.js} +1 -1
  127. package/build/assets/{trash-2-Bq4lHbTB.js → trash-2-wW5TWcdN.js} +1 -1
  128. package/build/assets/{typography-C6fuRTTT.js → typography-iYhzLlHO.js} +1 -1
  129. package/build/assets/{use-acp-credential-form-B0_pZ_uS.js → use-acp-credential-form-DUxbxmbq.js} +1 -1
  130. package/build/assets/use-activate-agent-profile-CDHA52tC.js +1 -0
  131. package/build/assets/use-agent-profiles-TsOdIyw5.js +1 -0
  132. package/build/assets/{use-can-manage-org-profiles-CrG1km7R.js → use-can-manage-org-profiles-Bt1M71u5.js} +1 -1
  133. package/build/assets/use-cloud-current-user-id-DWt7HCgf.js +1 -0
  134. package/build/assets/{use-config-Csy8EAP9.js → use-config-CxlEdf_v.js} +1 -1
  135. package/build/assets/{use-create-conversation-Dsa4nzU9.js → use-create-conversation-nOJ6Um5h.js} +1 -1
  136. package/build/assets/{use-create-secret-BnxuAjDt.js → use-create-secret-Dj5ang9x.js} +1 -1
  137. package/build/assets/use-is-authed-BT7Iud4U.js +1 -0
  138. package/build/assets/{use-is-creating-conversation-CIAcnd8M.js → use-is-creating-conversation-CAggrM75.js} +1 -1
  139. package/build/assets/use-llm-profiles-2Wc2db8u.js +1 -0
  140. package/build/assets/use-onboarding-completion-gxQlcEy2.js +1 -0
  141. package/build/assets/use-plugins-marketplace-CVO7sXYR.js +1 -0
  142. package/build/assets/use-save-agent-profile-D0wC5ExW.js +1 -0
  143. package/build/assets/{use-save-settings-BRh9p_fv.js → use-save-settings-L3aMaDeS.js} +1 -1
  144. package/build/assets/use-settings-8nt3DGxW.js +1 -0
  145. package/build/assets/use-settings-nav-items-DHAAD-zk.js +16 -0
  146. package/build/assets/use-skills-CE6miQ3r.js +1 -0
  147. package/build/assets/use-tracking-BGboadaZ.js +68 -0
  148. package/build/assets/{use-user-conversation-GnGhs_Ob.js → use-user-conversation-BIIpGUgM.js} +1 -1
  149. package/build/assets/useInfiniteQuery-BLRVmVPU.js +1 -0
  150. package/build/assets/{useMutation-DyQXZFEF.js → useMutation-CaSHLnX0.js} +1 -1
  151. package/build/assets/{useQueries-B3T1a7qt.js → useQueries--d_WWAzc.js} +1 -1
  152. package/build/assets/{useQuery-B38jBavx.js → useQuery-DiPh8LRJ.js} +1 -1
  153. package/build/assets/utils-BgGG1znF.js +1 -0
  154. package/build/assets/{vendor~browser-CIoZCqGs.js → vendor~browser-IVYgIgG1.js} +1 -1
  155. package/build/assets/{vendor~entry.client-Di4qO77Y.js → vendor~entry.client-BcYIVQvB.js} +1 -1
  156. package/build/assets/{vendor~entry.client-BfviqoVc.js → vendor~entry.client-CXM9oiAk.js} +1 -1
  157. package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~g4xrpilz-CJ7amdtQ.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~b0bpqexo-CbTboogo.js} +2 -2
  158. package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~f9xdmd0z-DLMP7bZx.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~d4by102p-C2f0ZhS-.js} +1 -1
  159. package/build/assets/{vendor~files-tab-vm3f67Pz.js → vendor~files-tab-C7RmQJwN.js} +1 -1
  160. package/build/assets/{vendor~index-home~home~conversation-panel~conversation-kX4LrGQC.js → vendor~index-home~home~conversation-panel~conversation-Bqp1ZqJM.js} +1 -1
  161. package/build/assets/{vendor~root-layout~conversation-panel~conversation-DpA6fir3.js → vendor~root-layout~conversation-panel~conversation-BCn8lzeG.js} +1 -1
  162. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~automation-setup-route-B_L-gcOG.js +1 -0
  163. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-sjx0x5ac.js +1 -0
  164. package/build/assets/vendor~root-layout~index-home~home~mcp~automations-list~automation-setup-route~onboarding-modal-D7IDevqN.js +1 -0
  165. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~bi2r7bko-Bw4AuHN1.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~dfc8ddxy-tTyxnjXT.js} +1 -1
  166. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hakxo2tj-ClV0p9g3.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~gy8zbn65-CGt6bWRT.js} +1 -1
  167. package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation~launch~skills-settings~a~eywn6ulz-BKxxr74w.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~dufan6ng-Dtdw8H0q.js} +17 -4
  168. package/build/assets/{verification-settings-CaCzojbc.js → verification-settings-DBsnSXC3.js} +1 -1
  169. package/build/assets/x-omAzpXkl.js +1 -0
  170. package/build/favicon-16x16.png +0 -0
  171. package/build/favicon-32x32.png +0 -0
  172. package/build/favicon.ico +0 -0
  173. package/build/index.html +4 -4
  174. package/build/locales/ar/openhands.json +39 -2
  175. package/build/locales/ca/openhands.json +39 -2
  176. package/build/locales/de/openhands.json +39 -2
  177. package/build/locales/en/openhands.json +40 -3
  178. package/build/locales/es/openhands.json +39 -2
  179. package/build/locales/fr/openhands.json +39 -2
  180. package/build/locales/it/openhands.json +39 -2
  181. package/build/locales/ja/openhands.json +39 -2
  182. package/build/locales/ko-KR/openhands.json +39 -2
  183. package/build/locales/no/openhands.json +39 -2
  184. package/build/locales/pt/openhands.json +39 -2
  185. package/build/locales/tr/openhands.json +39 -2
  186. package/build/locales/uk/openhands.json +39 -2
  187. package/build/locales/zh-CN/openhands.json +39 -2
  188. package/build/locales/zh-TW/openhands.json +39 -2
  189. package/config/defaults.json +4 -4
  190. package/dist/api/agent-server-adapter.cjs +3 -3
  191. package/dist/api/agent-server-adapter.cjs.map +1 -1
  192. package/dist/api/agent-server-adapter.d.ts +46 -6
  193. package/dist/api/agent-server-adapter.js +187 -168
  194. package/dist/api/agent-server-adapter.js.map +1 -1
  195. package/dist/api/agent-server-compatibility.cjs +1 -1
  196. package/dist/api/agent-server-compatibility.cjs.map +1 -1
  197. package/dist/api/agent-server-compatibility.d.ts +4 -0
  198. package/dist/api/agent-server-compatibility.js +41 -38
  199. package/dist/api/agent-server-compatibility.js.map +1 -1
  200. package/dist/api/automation-service/automation-service.api.cjs +1 -1
  201. package/dist/api/automation-service/automation-service.api.cjs.map +1 -1
  202. package/dist/api/automation-service/automation-service.api.d.ts +20 -0
  203. package/dist/api/automation-service/automation-service.api.js +136 -99
  204. package/dist/api/automation-service/automation-service.api.js.map +1 -1
  205. package/dist/api/backend-registry/storage.cjs +1 -1
  206. package/dist/api/backend-registry/storage.cjs.map +1 -1
  207. package/dist/api/backend-registry/storage.js +1 -1
  208. package/dist/api/backend-registry/storage.js.map +1 -1
  209. package/dist/api/backend-registry/types.d.ts +2 -0
  210. package/dist/api/cloud/conversation-service.api.cjs +1 -1
  211. package/dist/api/cloud/conversation-service.api.js +22 -22
  212. package/dist/api/mcp-service/mcp-service.api.cjs +1 -1
  213. package/dist/api/mcp-service/mcp-service.api.cjs.map +1 -1
  214. package/dist/api/mcp-service/mcp-service.api.js +19 -19
  215. package/dist/api/mcp-service/mcp-service.api.js.map +1 -1
  216. package/dist/api/settings-service/settings-service.api.cjs +1 -1
  217. package/dist/api/settings-service/settings-service.api.cjs.map +1 -1
  218. package/dist/api/settings-service/settings-service.api.js +26 -12
  219. package/dist/api/settings-service/settings-service.api.js.map +1 -1
  220. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.cjs +2 -0
  221. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.cjs.map +1 -0
  222. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.d.ts +12 -0
  223. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.js +94 -0
  224. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.js.map +1 -0
  225. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs +1 -1
  226. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map +1 -1
  227. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js +31 -90
  228. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
  229. package/dist/components/features/automations/recommended-automations-launcher.d.ts +0 -7
  230. package/dist/components/features/automations/recommended-automations-section.d.ts +0 -6
  231. package/dist/components/features/backends/backend-form-modal.cjs +1 -1
  232. package/dist/components/features/backends/backend-form-modal.cjs.map +1 -1
  233. package/dist/components/features/backends/backend-form-modal.js +568 -358
  234. package/dist/components/features/backends/backend-form-modal.js.map +1 -1
  235. package/dist/components/features/backends/device-flow-auth.cjs +1 -1
  236. package/dist/components/features/backends/device-flow-auth.cjs.map +1 -1
  237. package/dist/components/features/backends/device-flow-auth.d.ts +9 -1
  238. package/dist/components/features/backends/device-flow-auth.js +56 -55
  239. package/dist/components/features/backends/device-flow-auth.js.map +1 -1
  240. package/dist/components/features/backends/manage-backends-modal.cjs +1 -1
  241. package/dist/components/features/backends/manage-backends-modal.cjs.map +1 -1
  242. package/dist/components/features/backends/manage-backends-modal.js +1 -1
  243. package/dist/components/features/backends/manage-backends-modal.js.map +1 -1
  244. package/dist/components/features/chat/chat-interface.cjs +1 -1
  245. package/dist/components/features/chat/chat-interface.cjs.map +1 -1
  246. package/dist/components/features/chat/chat-interface.js +105 -105
  247. package/dist/components/features/chat/chat-interface.js.map +1 -1
  248. package/dist/components/features/chat/chat-message.cjs +1 -1
  249. package/dist/components/features/chat/chat-message.cjs.map +1 -1
  250. package/dist/components/features/chat/chat-message.d.ts +2 -1
  251. package/dist/components/features/chat/chat-message.js +59 -49
  252. package/dist/components/features/chat/chat-message.js.map +1 -1
  253. package/dist/components/features/chat/pending-user-messages.cjs +1 -1
  254. package/dist/components/features/chat/pending-user-messages.cjs.map +1 -1
  255. package/dist/components/features/chat/pending-user-messages.js +4 -1
  256. package/dist/components/features/chat/pending-user-messages.js.map +1 -1
  257. package/dist/components/features/chat/typing-indicator.cjs +1 -1
  258. package/dist/components/features/chat/typing-indicator.cjs.map +1 -1
  259. package/dist/components/features/chat/typing-indicator.d.ts +8 -1
  260. package/dist/components/features/chat/typing-indicator.js +94 -10
  261. package/dist/components/features/chat/typing-indicator.js.map +1 -1
  262. package/dist/components/features/command-menu/command-menu-items.d.ts +5 -1
  263. package/dist/components/features/files-tab/segmented-toggle.cjs +1 -1
  264. package/dist/components/features/files-tab/segmented-toggle.cjs.map +1 -1
  265. package/dist/components/features/files-tab/segmented-toggle.d.ts +2 -0
  266. package/dist/components/features/files-tab/segmented-toggle.js +17 -14
  267. package/dist/components/features/files-tab/segmented-toggle.js.map +1 -1
  268. package/dist/components/features/manifest/manifest-form-field.d.ts +27 -0
  269. package/dist/components/features/manifest/manifest-prerequisites-step.d.ts +11 -0
  270. package/dist/components/features/manifest/manifest-review-step.d.ts +14 -0
  271. package/dist/components/features/manifest/manifest-setup-dialog.d.ts +14 -0
  272. package/dist/components/features/mcp-page/custom-server-editor.cjs +1 -1
  273. package/dist/components/features/mcp-page/custom-server-editor.js +16 -16
  274. package/dist/components/features/mcp-page/installed-server-card.cjs +1 -1
  275. package/dist/components/features/mcp-page/installed-server-card.cjs.map +1 -1
  276. package/dist/components/features/mcp-page/installed-server-card.d.ts +2 -2
  277. package/dist/components/features/mcp-page/installed-server-card.js +6 -7
  278. package/dist/components/features/mcp-page/installed-server-card.js.map +1 -1
  279. package/dist/components/features/mcp-page/installed-servers-section.cjs +1 -1
  280. package/dist/components/features/mcp-page/installed-servers-section.cjs.map +1 -1
  281. package/dist/components/features/mcp-page/installed-servers-section.d.ts +2 -2
  282. package/dist/components/features/mcp-page/installed-servers-section.js +2 -2
  283. package/dist/components/features/mcp-page/installed-servers-section.js.map +1 -1
  284. package/dist/components/features/mcp-page/mcp-server-health.cjs +1 -1
  285. package/dist/components/features/mcp-page/mcp-server-health.js +4 -4
  286. package/dist/components/features/settings/mcp-settings/mcp-server-form.cjs +1 -1
  287. package/dist/components/features/settings/mcp-settings/mcp-server-form.cjs.map +1 -1
  288. package/dist/components/features/settings/mcp-settings/mcp-server-form.js +2 -1
  289. package/dist/components/features/settings/mcp-settings/mcp-server-form.js.map +1 -1
  290. package/dist/components/features/settings/settings-input.cjs +1 -1
  291. package/dist/components/features/settings/settings-input.cjs.map +1 -1
  292. package/dist/components/features/settings/settings-input.d.ts +6 -0
  293. package/dist/components/features/settings/settings-input.js +13 -8
  294. package/dist/components/features/settings/settings-input.js.map +1 -1
  295. package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
  296. package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
  297. package/dist/components/features/sidebar/sidebar-rail-body.js +124 -123
  298. package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
  299. package/dist/config/defaults.cjs +1 -1
  300. package/dist/config/defaults.cjs.map +1 -1
  301. package/dist/config/defaults.js +3 -3
  302. package/dist/config/defaults.js.map +1 -1
  303. package/dist/contexts/active-backend-context.cjs +1 -1
  304. package/dist/contexts/active-backend-context.cjs.map +1 -1
  305. package/dist/contexts/active-backend-context.d.ts +3 -2
  306. package/dist/contexts/active-backend-context.js +55 -42
  307. package/dist/contexts/active-backend-context.js.map +1 -1
  308. package/dist/favicon-16x16.png +0 -0
  309. package/dist/favicon-32x32.png +0 -0
  310. package/dist/favicon.ico +0 -0
  311. package/dist/hooks/mutation/use-update-mcp-server.cjs +1 -1
  312. package/dist/hooks/mutation/use-update-mcp-server.js +5 -5
  313. package/dist/hooks/query/query-keys.cjs.map +1 -1
  314. package/dist/hooks/query/query-keys.d.ts +4 -0
  315. package/dist/hooks/query/query-keys.js.map +1 -1
  316. package/dist/hooks/query/use-cloud-current-user-id.cjs +1 -1
  317. package/dist/hooks/query/use-cloud-current-user-id.cjs.map +1 -1
  318. package/dist/hooks/query/use-cloud-current-user-id.js +7 -5
  319. package/dist/hooks/query/use-cloud-current-user-id.js.map +1 -1
  320. package/dist/hooks/query/use-cloud-organizations.cjs +1 -1
  321. package/dist/hooks/query/use-cloud-organizations.cjs.map +1 -1
  322. package/dist/hooks/query/use-cloud-organizations.js +5 -1
  323. package/dist/hooks/query/use-cloud-organizations.js.map +1 -1
  324. package/dist/hooks/query/use-manifest-capabilities.d.ts +21 -0
  325. package/dist/hooks/query/use-manifest-prerequisites.d.ts +24 -0
  326. package/dist/hooks/use-can-manage-org-profiles.cjs +1 -1
  327. package/dist/hooks/use-can-manage-org-profiles.cjs.map +1 -1
  328. package/dist/hooks/use-can-manage-org-profiles.js +2 -1
  329. package/dist/hooks/use-can-manage-org-profiles.js.map +1 -1
  330. package/dist/hooks/use-llm-configured.cjs +1 -1
  331. package/dist/hooks/use-llm-configured.cjs.map +1 -1
  332. package/dist/hooks/use-llm-configured.js +2 -1
  333. package/dist/hooks/use-llm-configured.js.map +1 -1
  334. package/dist/hooks/use-manifest-preflight.d.ts +18 -0
  335. package/dist/hooks/use-tracking.cjs +1 -1
  336. package/dist/hooks/use-tracking.cjs.map +1 -1
  337. package/dist/hooks/use-tracking.d.ts +14 -0
  338. package/dist/hooks/use-tracking.js +28 -10
  339. package/dist/hooks/use-tracking.js.map +1 -1
  340. package/dist/i18n/declaration.cjs +1 -1
  341. package/dist/i18n/declaration.cjs.map +1 -1
  342. package/dist/i18n/declaration.d.ts +38 -1
  343. package/dist/i18n/declaration.js +1 -1
  344. package/dist/i18n/declaration.js.map +1 -1
  345. package/dist/i18n/translation.cjs +2 -2
  346. package/dist/i18n/translation.cjs.map +1 -1
  347. package/dist/i18n/translation.js +645 -16
  348. package/dist/i18n/translation.js.map +1 -1
  349. package/dist/icons/external-link.cjs +2 -0
  350. package/dist/icons/external-link.cjs.map +1 -0
  351. package/dist/icons/external-link.js +22 -0
  352. package/dist/icons/external-link.js.map +1 -0
  353. package/dist/icons/server.cjs +2 -0
  354. package/dist/icons/server.cjs.map +1 -0
  355. package/dist/icons/server.js +17 -0
  356. package/dist/icons/server.js.map +1 -0
  357. package/dist/locales/ar/openhands.json +39 -2
  358. package/dist/locales/ca/openhands.json +39 -2
  359. package/dist/locales/de/openhands.json +39 -2
  360. package/dist/locales/en/openhands.json +40 -3
  361. package/dist/locales/es/openhands.json +39 -2
  362. package/dist/locales/fr/openhands.json +39 -2
  363. package/dist/locales/it/openhands.json +39 -2
  364. package/dist/locales/ja/openhands.json +39 -2
  365. package/dist/locales/ko-KR/openhands.json +39 -2
  366. package/dist/locales/no/openhands.json +39 -2
  367. package/dist/locales/pt/openhands.json +39 -2
  368. package/dist/locales/tr/openhands.json +39 -2
  369. package/dist/locales/uk/openhands.json +39 -2
  370. package/dist/locales/zh-CN/openhands.json +39 -2
  371. package/dist/locales/zh-TW/openhands.json +39 -2
  372. package/dist/manifests/automation-interface.cjs +2 -0
  373. package/dist/manifests/automation-interface.cjs.map +1 -0
  374. package/dist/manifests/automation-interface.d.ts +44 -0
  375. package/dist/manifests/automation-interface.js +81 -0
  376. package/dist/manifests/automation-interface.js.map +1 -0
  377. package/dist/manifests/automation-setup.cjs +2 -0
  378. package/dist/manifests/automation-setup.cjs.map +1 -0
  379. package/dist/manifests/automation-setup.d.ts +52 -0
  380. package/dist/manifests/automation-setup.js +8 -0
  381. package/dist/manifests/automation-setup.js.map +1 -0
  382. package/dist/manifests/interface-validation.cjs +2 -0
  383. package/dist/manifests/interface-validation.cjs.map +1 -0
  384. package/dist/manifests/interface-validation.d.ts +27 -0
  385. package/dist/manifests/interface-validation.js +182 -0
  386. package/dist/manifests/interface-validation.js.map +1 -0
  387. package/dist/manifests/manifest-actions.d.ts +15 -0
  388. package/dist/manifests/manifest-capabilities.d.ts +25 -0
  389. package/dist/manifests/manifest-error-map.d.ts +40 -0
  390. package/dist/manifests/manifest-local-validation.d.ts +56 -0
  391. package/dist/manifests/manifest-registry.cjs +2 -0
  392. package/dist/manifests/manifest-registry.cjs.map +1 -0
  393. package/dist/manifests/manifest-registry.d.ts +15 -0
  394. package/dist/manifests/manifest-registry.js +26 -0
  395. package/dist/manifests/manifest-registry.js.map +1 -0
  396. package/dist/manifests/manifest-sources.cjs +2 -0
  397. package/dist/manifests/manifest-sources.cjs.map +1 -0
  398. package/dist/manifests/manifest-sources.d.ts +15 -0
  399. package/dist/manifests/manifest-sources.js +8 -0
  400. package/dist/manifests/manifest-sources.js.map +1 -0
  401. package/dist/manifests/manifest-template.d.ts +18 -0
  402. package/dist/manifests/manifest-validation.cjs +2 -0
  403. package/dist/manifests/manifest-validation.cjs.map +1 -0
  404. package/dist/manifests/manifest-validation.d.ts +30 -0
  405. package/dist/manifests/manifest-validation.js +145 -0
  406. package/dist/manifests/manifest-validation.js.map +1 -0
  407. package/dist/manifests/types.cjs +2 -0
  408. package/dist/manifests/types.cjs.map +1 -0
  409. package/dist/manifests/types.d.ts +227 -0
  410. package/dist/manifests/types.js +6 -0
  411. package/dist/manifests/types.js.map +1 -0
  412. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs +9 -0
  413. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs.map +1 -0
  414. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js +75 -0
  415. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js.map +1 -0
  416. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.cjs +9 -0
  417. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.cjs.map +1 -0
  418. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.js +78 -0
  419. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.js.map +1 -0
  420. package/dist/node_modules/@openhands/extensions/automations/catalog/incident-retrospective-drafter/manifest.cjs +17 -0
  421. package/dist/node_modules/@openhands/extensions/automations/catalog/incident-retrospective-drafter/manifest.cjs.map +1 -0
  422. package/dist/node_modules/@openhands/extensions/automations/catalog/incident-retrospective-drafter/manifest.js +89 -0
  423. package/dist/node_modules/@openhands/extensions/automations/catalog/incident-retrospective-drafter/manifest.js.map +1 -0
  424. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.cjs +10 -0
  425. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.cjs.map +1 -0
  426. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.js +17 -0
  427. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.js.map +1 -0
  428. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-triage-assistant/manifest.cjs +9 -0
  429. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-triage-assistant/manifest.cjs.map +1 -0
  430. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-triage-assistant/manifest.js +15 -0
  431. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-triage-assistant/manifest.js.map +1 -0
  432. package/dist/node_modules/@openhands/extensions/automations/catalog/research-brief-writer/manifest.cjs +9 -0
  433. package/dist/node_modules/@openhands/extensions/automations/catalog/research-brief-writer/manifest.cjs.map +1 -0
  434. package/dist/node_modules/@openhands/extensions/automations/catalog/research-brief-writer/manifest.js +18 -0
  435. package/dist/node_modules/@openhands/extensions/automations/catalog/research-brief-writer/manifest.js.map +1 -0
  436. package/dist/node_modules/@openhands/extensions/automations/catalog/slack-channel-monitor/manifest.cjs +9 -0
  437. package/dist/node_modules/@openhands/extensions/automations/catalog/slack-channel-monitor/manifest.cjs.map +1 -0
  438. package/dist/node_modules/@openhands/extensions/automations/catalog/slack-channel-monitor/manifest.js +14 -0
  439. package/dist/node_modules/@openhands/extensions/automations/catalog/slack-channel-monitor/manifest.js.map +1 -0
  440. package/dist/node_modules/@openhands/extensions/automations/catalog/slack-standup-digest/manifest.cjs +9 -0
  441. package/dist/node_modules/@openhands/extensions/automations/catalog/slack-standup-digest/manifest.cjs.map +1 -0
  442. package/dist/node_modules/@openhands/extensions/automations/catalog/slack-standup-digest/manifest.js +14 -0
  443. package/dist/node_modules/@openhands/extensions/automations/catalog/slack-standup-digest/manifest.js.map +1 -0
  444. package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs +2 -0
  445. package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs.map +1 -0
  446. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js +23 -0
  447. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js.map +1 -0
  448. package/dist/node_modules/@openhands/extensions/automations/index.cjs +2 -0
  449. package/dist/node_modules/@openhands/extensions/automations/index.cjs.map +1 -0
  450. package/dist/node_modules/@openhands/extensions/automations/index.js +18 -0
  451. package/dist/node_modules/@openhands/extensions/automations/index.js.map +1 -0
  452. package/dist/node_modules/@openhands/extensions/automations/interface.cjs +2 -0
  453. package/dist/node_modules/@openhands/extensions/automations/interface.cjs.map +1 -0
  454. package/dist/node_modules/@openhands/extensions/automations/interface.js +89 -0
  455. package/dist/node_modules/@openhands/extensions/automations/interface.js.map +1 -0
  456. package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.cjs +1 -1
  457. package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.cjs.map +1 -1
  458. package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.js +3 -3
  459. package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.js.map +1 -1
  460. package/dist/node_modules/@openhands/extensions/skills/index.cjs +17 -4
  461. package/dist/node_modules/@openhands/extensions/skills/index.cjs.map +1 -1
  462. package/dist/node_modules/@openhands/extensions/skills/index.js +5 -5
  463. package/dist/node_modules/@openhands/extensions/skills/index.js.map +1 -1
  464. package/dist/node_modules/@openhands/typescript-client/dist/client/settings-client.cjs +1 -1
  465. package/dist/node_modules/@openhands/typescript-client/dist/client/settings-client.cjs.map +1 -1
  466. package/dist/node_modules/@openhands/typescript-client/dist/client/settings-client.js +9 -0
  467. package/dist/node_modules/@openhands/typescript-client/dist/client/settings-client.js.map +1 -1
  468. package/dist/node_modules/lucide-react/dist/esm/icons/monitor.cjs +2 -0
  469. package/dist/node_modules/lucide-react/dist/esm/icons/monitor.cjs.map +1 -0
  470. package/dist/node_modules/lucide-react/dist/esm/icons/monitor.js +29 -0
  471. package/dist/node_modules/lucide-react/dist/esm/icons/monitor.js.map +1 -0
  472. package/dist/package.cjs +1 -1
  473. package/dist/package.cjs.map +1 -1
  474. package/dist/package.js +3 -3
  475. package/dist/package.js.map +1 -1
  476. package/dist/routes/app-settings.cjs +1 -1
  477. package/dist/routes/app-settings.js +5 -5
  478. package/dist/routes/mcp.cjs +1 -1
  479. package/dist/routes/mcp.cjs.map +1 -1
  480. package/dist/routes/mcp.js +73 -82
  481. package/dist/routes/mcp.js.map +1 -1
  482. package/dist/services/telemetry.cjs +1 -1
  483. package/dist/services/telemetry.cjs.map +1 -1
  484. package/dist/services/telemetry.d.ts +8 -0
  485. package/dist/services/telemetry.js +163 -116
  486. package/dist/services/telemetry.js.map +1 -1
  487. package/dist/types/agent-server/core/events/conversation-state-event.d.ts +2 -19
  488. package/dist/types/agent-server/core/events/observation-event.d.ts +2 -18
  489. package/dist/types/automation.d.ts +7 -3
  490. package/dist/types/mcp-server.d.ts +5 -0
  491. package/dist/types/settings.d.ts +3 -0
  492. package/dist/utils/api-error-message.d.ts +6 -2
  493. package/dist/utils/automation-catalog.cjs +2 -0
  494. package/dist/utils/automation-catalog.cjs.map +1 -0
  495. package/dist/utils/automation-catalog.d.ts +28 -0
  496. package/dist/utils/automation-catalog.js +5 -0
  497. package/dist/utils/automation-catalog.js.map +1 -0
  498. package/dist/utils/automation-timeout.d.ts +3 -2
  499. package/dist/utils/mcp-config.cjs +1 -1
  500. package/dist/utils/mcp-config.cjs.map +1 -1
  501. package/dist/utils/mcp-config.d.ts +8 -0
  502. package/dist/utils/mcp-config.js +25 -20
  503. package/dist/utils/mcp-config.js.map +1 -1
  504. package/dist/utils/mcp-installed-servers.cjs +1 -1
  505. package/dist/utils/mcp-installed-servers.cjs.map +1 -1
  506. package/dist/utils/mcp-installed-servers.js +6 -3
  507. package/dist/utils/mcp-installed-servers.js.map +1 -1
  508. package/dist/utils/responder-deployment.d.ts +5 -1
  509. package/dist/utils/transcript-export/index.cjs +5 -5
  510. package/dist/utils/transcript-export/index.js +12 -12
  511. package/package.json +3 -3
  512. package/scripts/check-sdk-version-sync.mjs +6 -6
  513. package/scripts/check-translation-completeness.cjs +1 -0
  514. package/scripts/dev-safe.mjs +17 -12
  515. package/scripts/dev-static.mjs +17 -0
  516. package/scripts/dev-with-automation.mjs +12 -14
  517. package/scripts/ingress.mjs +22 -0
  518. package/scripts/proxy-utils.mjs +157 -2
  519. package/scripts/runtime-services-info.mjs +6 -6
  520. package/scripts/static-build.mjs +0 -7
  521. package/scripts/static-server.mjs +10 -0
  522. package/build/assets/active-backend-context-BlZPzZNU.js +0 -1
  523. package/build/assets/agent-context-settings-CTaN-Iw9.js +0 -1
  524. package/build/assets/agent-profiles-settings-CR4VTqv_.js +0 -1
  525. package/build/assets/agent-server-conversation-service.api-Btmi4q6d.js +0 -41
  526. package/build/assets/agent-settings-KQs-occT.js +0 -1
  527. package/build/assets/api-key-entry-screen-BhR24gkM.js +0 -1
  528. package/build/assets/app-settings-Bs4sY8WP.js +0 -1
  529. package/build/assets/automation-BGP_I1RR.js +0 -1
  530. package/build/assets/automation-detail-CwDnJbYR.js +0 -2
  531. package/build/assets/automation-export-Bu-r-EzL.js +0 -2
  532. package/build/assets/automations-list-CYw7_6FR.js +0 -1
  533. package/build/assets/backend-form-modal-Ce-KRHOJ.js +0 -1
  534. package/build/assets/browser-BUDJnBg4.js +0 -6
  535. package/build/assets/check-BMOG005H.js +0 -1
  536. package/build/assets/chevron-down-CV1zZP_K.js +0 -1
  537. package/build/assets/circle-check-lvN_jFN5.js +0 -1
  538. package/build/assets/client-source-1v-kWLNU.js +0 -1
  539. package/build/assets/cloud-funnel-analytics-CasMM7EO.js +0 -1
  540. package/build/assets/command-menu-N_BriUy8.js +0 -1
  541. package/build/assets/condenser-settings-Czi8cKxV.js +0 -1
  542. package/build/assets/conversation-C25pc2dT.js +0 -1
  543. package/build/assets/conversation-CObLYSJd.js +0 -90
  544. package/build/assets/conversation-panel-C25pc2dT.js +0 -1
  545. package/build/assets/conversation-state-store-DTq4hFoP.js +0 -1
  546. package/build/assets/extensions-hub-BKftOQ-X.js +0 -1
  547. package/build/assets/extensions-navigation-DF24q1H1.js +0 -1
  548. package/build/assets/files-tab-SAiFCnS5.js +0 -1
  549. package/build/assets/git-provider-icon-BREx-yUX.js +0 -1
  550. package/build/assets/home-EPNFgzUh.js +0 -1
  551. package/build/assets/home-sN90Xcxp.js +0 -1
  552. package/build/assets/index-home-EPNFgzUh.js +0 -1
  553. package/build/assets/install-server-modal-BI8yUfmr.js +0 -1
  554. package/build/assets/llm-not-configured-banner-DTWzISnk.js +0 -27
  555. package/build/assets/llm-settings-BXk5_Pac.js +0 -1
  556. package/build/assets/llm-settings-C1vpgWam.js +0 -1
  557. package/build/assets/loader-circle-6zlEYCJw.js +0 -1
  558. package/build/assets/manage-backends-modal-DhflyGTf.js +0 -1
  559. package/build/assets/manifest-8082e879.js +0 -1
  560. package/build/assets/mcp-CxLPda-W.js +0 -9
  561. package/build/assets/messages-DINDkPNK.js +0 -40
  562. package/build/assets/onboarding-modal-DdvE6rzw.js +0 -1
  563. package/build/assets/organization-service.api-CT2OQlLz.js +0 -1
  564. package/build/assets/plugins-management-service-DVkoM3eA.js +0 -1
  565. package/build/assets/plus-vIbGD459.js +0 -1
  566. package/build/assets/profiles-service.api-CBafmAPO.js +0 -1
  567. package/build/assets/providers-9UzRB9mT.js +0 -1
  568. package/build/assets/proxy-C79PCMjo.js +0 -1
  569. package/build/assets/recommended-automations-launcher-BF2mtAKw.js +0 -58
  570. package/build/assets/root-B5JXKp1P.css +0 -1
  571. package/build/assets/root-Sj7W28yE.js +0 -2
  572. package/build/assets/root-layout-DbhKVoc7.js +0 -3
  573. package/build/assets/schema-field-CV6bFnoL.js +0 -1
  574. package/build/assets/search-sKuYKllf.js +0 -1
  575. package/build/assets/secrets-service-BjK-bPN2.js +0 -1
  576. package/build/assets/segmented-toggle-DbbD3Tve.js +0 -1
  577. package/build/assets/settings-Bj5Oo45A.js +0 -1
  578. package/build/assets/settings-input-BjW_zyTN.js +0 -1
  579. package/build/assets/settings-service.api-DryhKdSr.js +0 -1
  580. package/build/assets/shared-conversation-CnMxy7p_.js +0 -1
  581. package/build/assets/telemetry-cmCL3o6Z.js +0 -2
  582. package/build/assets/use-activate-agent-profile-DH33MvVj.js +0 -1
  583. package/build/assets/use-agent-profiles-Dmd_4H8q.js +0 -1
  584. package/build/assets/use-cloud-current-user-id-B6DP3s47.js +0 -1
  585. package/build/assets/use-is-authed-BsS4XwSL.js +0 -1
  586. package/build/assets/use-llm-profiles-BMQoc612.js +0 -1
  587. package/build/assets/use-onboarding-completion-B-2BTS-y.js +0 -1
  588. package/build/assets/use-plugins-marketplace-PBc_XNz_.js +0 -1
  589. package/build/assets/use-save-agent-profile-2Mk9ZX37.js +0 -1
  590. package/build/assets/use-settings-DBI44RnH.js +0 -1
  591. package/build/assets/use-settings-nav-items-Cva28C-c.js +0 -16
  592. package/build/assets/use-skills-RQsCtdzN.js +0 -1
  593. package/build/assets/use-tracking-CN1nIMnY.js +0 -1
  594. package/build/assets/utils-qjs_KuS4.js +0 -1
  595. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation-EShpjxey.js +0 -1
  596. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-DD_UNO02.js +0 -1
  597. package/build/assets/vendor~root-layout~index-home~home~mcp~automations-list~onboarding-modal-Be63Q2Ln.js +0 -1
  598. package/build/assets/x-EjvKGawc.js +0 -1
  599. /package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~f1hl7voa-BrmgjeOw.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~emdr2jt4-BrmgjeOw.js} +0 -0
@@ -4,10 +4,10 @@ import { isACPToolCallEvent as n, isActionEvent as r, isAgentErrorEvent as i, is
4
4
  import { getActionThoughtText as f, getReasoningContent as p, splitInlineThink as m } from "../../components/conversation-events/chat/event-thought-helpers.js";
5
5
  import { handleEventForUI as h } from "../handle-event-for-ui.js";
6
6
  import { shouldRenderEvent as g } from "../../components/conversation-events/chat/event-content-helpers/should-render-event.js";
7
- import { parseMessageFromEvent as _ } from "../../components/conversation-events/chat/event-content-helpers/parse-message-from-event.js";
8
- import { getActionContent as v } from "../../components/conversation-events/chat/event-content-helpers/get-action-content.js";
9
- import { getObservationContent as y } from "../../components/conversation-events/chat/event-content-helpers/get-observation-content.js";
10
- import { getACPToolCallContent as b, stripRedundantTitlePrefix as x } from "../../components/conversation-events/chat/event-content-helpers/get-acp-tool-call-content.js";
7
+ import { getACPToolCallContent as _, stripRedundantTitlePrefix as v } from "../../components/conversation-events/chat/event-content-helpers/get-acp-tool-call-content.js";
8
+ import { parseMessageFromEvent as y } from "../../components/conversation-events/chat/event-content-helpers/parse-message-from-event.js";
9
+ import { getActionContent as b } from "../../components/conversation-events/chat/event-content-helpers/get-action-content.js";
10
+ import { getObservationContent as x } from "../../components/conversation-events/chat/event-content-helpers/get-observation-content.js";
11
11
  import { groupEvents as S } from "../../components/conversation-events/chat/group-events.js";
12
12
  //#region src/utils/transcript-export/index.ts
13
13
  var C = new Set([
@@ -60,7 +60,7 @@ var C = new Set([
60
60
  i ? `${t.t(e.TASK$QUERY)}:\n${i.prompt}` : "",
61
61
  `${t.t(e.TASK$RESULT)}:\n${I(n.content)}`
62
62
  ].filter(Boolean).join("\n\n");
63
- }, z = (e) => e.action.kind === "TaskAction" ? L(e.action) : C.has(e.action.kind) ? v(e) : "", B = (e, t) => e.observation.kind === "TaskObservation" ? R(e.observation, t) : w.has(e.observation.kind) ? y(e) : "", V = (e) => s(e) ? [
63
+ }, z = (e) => e.action.kind === "TaskAction" ? L(e.action) : C.has(e.action.kind) ? b(e) : "", B = (e, t) => e.observation.kind === "TaskObservation" ? R(e.observation, t) : w.has(e.observation.kind) ? x(e) : "", V = (e) => s(e) ? [
64
64
  e.reason,
65
65
  e.error,
66
66
  e.stdout,
@@ -70,13 +70,13 @@ var C = new Set([
70
70
  "SwitchLLMAction",
71
71
  "ThinkAction"
72
72
  ].includes(e.action.kind), W = (f, p) => {
73
- let v = f.reduce((e, t) => {
73
+ let b = f.reduce((e, t) => {
74
74
  try {
75
75
  return h(t, e);
76
76
  } catch {
77
77
  return e;
78
78
  }
79
- }, []), y = new Map(f.filter(r).map((e) => [e.id, e])), C = [], w = /* @__PURE__ */ new Set(), D = S(v.filter((e) => d(e) && !e.observation.is_error || g(e)), 2 ** 53 - 1, f), O = (e) => {
79
+ }, []), x = new Map(f.filter(r).map((e) => [e.id, e])), C = [], w = /* @__PURE__ */ new Set(), D = S(b.filter((e) => d(e) && !e.observation.is_error || g(e)), 2 ** 53 - 1, f), O = (e) => {
80
80
  if (w.has(e.id) || !U(e)) return;
81
81
  w.add(e.id);
82
82
  let t = H(e);
@@ -95,7 +95,7 @@ var C = new Set([
95
95
  }
96
96
  let { event: h } = f;
97
97
  try {
98
- let f = r(h) ? h : l(h) ? y.get(h.action_id) : void 0;
98
+ let f = r(h) ? h : l(h) ? x.get(h.action_id) : void 0;
99
99
  if (f && O(f), d(h) && !h.observation.is_error) {
100
100
  C.push({
101
101
  kind: "note",
@@ -106,7 +106,7 @@ var C = new Set([
106
106
  continue;
107
107
  }
108
108
  if (c(h)) {
109
- let e = _(h).trim();
109
+ let e = y(h).trim();
110
110
  if (h.source === "agent") {
111
111
  let { reasoning: t, message: n } = m(e);
112
112
  [t, n].filter(Boolean).forEach((e) => {
@@ -166,7 +166,7 @@ var C = new Set([
166
166
  continue;
167
167
  }
168
168
  if (l(h)) {
169
- let e = y.get(h.action_id);
169
+ let e = x.get(h.action_id);
170
170
  C.push({
171
171
  kind: "tool",
172
172
  summary: F(h, e),
@@ -178,8 +178,8 @@ var C = new Set([
178
178
  if (n(h)) {
179
179
  C.push({
180
180
  kind: "tool",
181
- summary: x(h) || t.t(e.ACTION_MESSAGE$ACP_TOOL),
182
- details: p ? b(h) : "",
181
+ summary: v(h) || t.t(e.ACTION_MESSAGE$ACP_TOOL),
182
+ details: p ? _(h) : "",
183
183
  timestamp: h.timestamp
184
184
  });
185
185
  continue;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openhands/agent-canvas",
3
- "version": "1.7.2",
3
+ "version": "1.9.0",
4
4
  "description": "Agent Canvas UI for OpenHands - run AI coding agents with a visual interface",
5
5
  "license": "MIT",
6
6
  "private": false,
@@ -23,8 +23,8 @@
23
23
  "@heroui/react": "2.8.10",
24
24
  "@microlink/react-json-view": "1.31.20",
25
25
  "@monaco-editor/react": "4.7.0",
26
- "@openhands/extensions": "0.11.0",
27
- "@openhands/typescript-client": "1.34.0",
26
+ "@openhands/extensions": "0.13.0",
27
+ "@openhands/typescript-client": "1.36.1",
28
28
  "@react-router/node": "7.17.0",
29
29
  "@react-router/serve": "7.17.0",
30
30
  "@tailwindcss/vite": "4.2.4",
@@ -19,7 +19,7 @@
19
19
  *
20
20
  * Usage:
21
21
  * node scripts/check-sdk-version-sync.mjs
22
- * EXPECTED_SDK_VERSION=1.38.0 node scripts/check-sdk-version-sync.mjs
22
+ * EXPECTED_SDK_VERSION=1.39.1 node scripts/check-sdk-version-sync.mjs
23
23
  * node scripts/check-sdk-version-sync.mjs --check-pypi
24
24
  *
25
25
  * Environment variables:
@@ -78,7 +78,7 @@ Triggering from other repos:
78
78
  -H "Authorization: token \$GITHUB_TOKEN" \\
79
79
  -H "Accept: application/vnd.github.v3+json" \\
80
80
  https://api.github.com/repos/OpenHands/OpenHands/dispatches \\
81
- -d '{"event_type": "sdk-version-check", "client_payload": {"version": "1.38.0"}}'
81
+ -d '{"event_type": "sdk-version-check", "client_payload": {"version": "1.39.1"}}'
82
82
  `);
83
83
  process.exit(0);
84
84
  }
@@ -260,9 +260,9 @@ async function fetchPyPIDependencies(packageName, version) {
260
260
  * Parse PyPI requires_dist array and extract SDK package versions
261
261
  *
262
262
  * PyPI returns dependencies in PEP 508 format like:
263
- * "openhands-sdk>=1.38.0,<2.0.0"
264
- * "openhands-tools==1.38.0"
265
- * "openhands-workspace (>=1.38.0)"
263
+ * "openhands-sdk>=1.39.1,<2.0.0"
264
+ * "openhands-tools==1.39.1"
265
+ * "openhands-workspace (>=1.39.1)"
266
266
  */
267
267
  function parseSdkVersionsFromRequiresDist(requiresDist) {
268
268
  const versions = {};
@@ -276,7 +276,7 @@ function parseSdkVersionsFromRequiresDist(requiresDist) {
276
276
  }
277
277
 
278
278
  // Extract the version number - look for patterns like:
279
- // ">=1.38.0", "==1.38.0", "(>=1.38.0)", "~=1.38.0"
279
+ // ">=1.39.1", "==1.39.1", "(>=1.39.1)", "~=1.39.1"
280
280
  // After the package name and before any comma or closing paren
281
281
  const versionPattern = /[><=~!]+\s*([0-9]+(?:\.[0-9]+)*)/;
282
282
  const match = dep.match(versionPattern);
@@ -53,6 +53,7 @@ const IDENTICAL_VALUE_ALLOWLIST = new Set([
53
53
  'SETTINGS$SKILLS_VERSION',
54
54
  'SETTINGS$SLACK',
55
55
  'SETTINGS$TITLE_GENERATION_PROFILE_OPTION',
56
+ 'SETUP$REPOSITORY_PLACEHOLDER',
56
57
  'VSCODE$TITLE',
57
58
  'WORKSPACE$JUPYTER_TAB_LABEL',
58
59
  ]);
@@ -48,7 +48,7 @@ const LOCAL_AGENT_SERVER_SUBDIRS = [
48
48
  "openhands-workspace",
49
49
  ];
50
50
  const DEFAULT_AGENT_SERVER_VERSION = SHARED_DEFAULTS.versions.agentServer;
51
- // Temporary transitive-dep pin: openhands-sdk 1.38.0 leaves agent-client-protocol
51
+ // Temporary transitive-dep pin: openhands-sdk 1.39.1 leaves agent-client-protocol
52
52
  // unbounded (>=0.10.1), but acp 0.11.0 reordered the ACP prompt() args and breaks
53
53
  // the SDK's ACP client. Hold acp <0.11 until a fixed SDK ships. See config/defaults.json.
54
54
  const AGENT_CLIENT_PROTOCOL_CONSTRAINT =
@@ -264,7 +264,9 @@ export async function assertPortsFree(portConfigs, host = "127.0.0.1") {
264
264
  const busy = results.filter(({ free }) => !free);
265
265
  if (busy.length === 0) return;
266
266
 
267
- const lines = busy.map(({ name, port }) => ` • ${name}: port ${port}`).join("\n");
267
+ const lines = busy
268
+ .map(({ name, port }) => ` • ${name}: port ${port}`)
269
+ .join("\n");
268
270
  throw new Error(
269
271
  `Cannot start: the following ports are already in use:\n\n${lines}\n\n` +
270
272
  `Another agent-canvas instance may already be running.\n` +
@@ -399,7 +401,7 @@ export function validateFrontendDependencies(
399
401
  * edits are picked up without a manual reinstall. The agent-server itself
400
402
  * is rebuilt from local source on each invocation (--reinstall).
401
403
  * - OH_AGENT_SERVER_GIT_REF: Git commit SHA or branch name
402
- * - OH_AGENT_SERVER_VERSION: Specific PyPI version (e.g., "1.38.0")
404
+ * - OH_AGENT_SERVER_VERSION: Specific PyPI version (e.g., "1.39.1")
403
405
  *
404
406
  * If none are set, defaults to the released version specified by
405
407
  * DEFAULT_AGENT_SERVER_VERSION. Set OH_AGENT_SERVER_GIT_REF to use a
@@ -619,8 +621,7 @@ function buildConfigFromPorts(ports, cwd, env) {
619
621
  // ~/.openhands/agent-canvas/secret-key.txt. Persisting ensures dev mode
620
622
  // and Docker mode share the same encryption key when they mount the same
621
623
  // ~/.openhands directory (docker/entrypoint.sh reads/writes the same file).
622
- const secretKeyPath =
623
- env.OH_SECRET_KEY_PATH || DEFAULT_SECRET_KEY_PATH;
624
+ const secretKeyPath = env.OH_SECRET_KEY_PATH || DEFAULT_SECRET_KEY_PATH;
624
625
  const secretKey =
625
626
  env.OH_SECRET_KEY || getOrCreatePersistedApiKey(secretKeyPath, "secret");
626
627
  // Use the user-provided LOCAL_BACKEND_API_KEY or fall back to a key
@@ -958,10 +959,6 @@ async function main() {
958
959
  }
959
960
 
960
961
  const frontendCommand = buildNpmScriptCommand("dev:frontend");
961
- const runtimeServicesInfo = buildRuntimeServicesInfo({
962
- mode: "dev:safe",
963
- agentServerPort: config.backendPort,
964
- });
965
962
  frontend = spawnProcess(frontendCommand.command, frontendCommand.args, {
966
963
  cwd: config.cwd,
967
964
  env: {
@@ -971,9 +968,17 @@ async function main() {
971
968
  VITE_WORKING_DIR: config.workingDir,
972
969
  // Pass session API key so frontend can authenticate with agent-server
973
970
  VITE_SESSION_API_KEY: config.sessionApiKey,
974
- // Inform the frontend (and downstream, the agent's system prompt) about
975
- // which services are available in this dev stack.
976
- VITE_RUNTIME_SERVICES_INFO: JSON.stringify(runtimeServicesInfo),
971
+ // dev:minimal deliberately does NOT supply runtime-services info (the
972
+ // frontend here talks straight to the agent-server over
973
+ // VITE_BACKEND_BASE_URL — there is no ingress or static-server in front
974
+ // of it to append `runtime_services` to `/server_info`, and the
975
+ // frontend's own VITE_RUNTIME_SERVICES_INFO env var is no longer read).
976
+ // It is a bare agent-server + Vite stack with no companion services to
977
+ // advertise, so `fetchBackendRuntimeServicesInfo()` correctly returns
978
+ // null and conversations simply omit the <RUNTIME_SERVICES> block.
979
+ // Stacks with automation/ingress/frontend services should use
980
+ // `npm run dev` / `dev:static`, which pass runtime-services info through
981
+ // ingress/static-server instead.
977
982
  },
978
983
  });
979
984
 
@@ -61,6 +61,7 @@ import {
61
61
  buildAgentServerAutomationEnv,
62
62
  buildAutomationCommand,
63
63
  buildAutomationTelemetryEnv,
64
+ buildAutomationRuntimeServicesInfo,
64
65
  buildConfig,
65
66
  } from "./dev-with-automation.mjs";
66
67
 
@@ -379,6 +380,12 @@ function startStaticServer(config) {
379
380
  // is forwarded to the agent-server instead of falling back to the SPA
380
381
  // shell). Without this, /server_info on :3001 returns index.html.
381
382
  const staticServerScript = join(projectRoot, "scripts", "static-server.mjs");
383
+ const runtimeServicesInfo = JSON.stringify(
384
+ buildAutomationRuntimeServicesInfo({
385
+ ...config,
386
+ frontendKind: "static",
387
+ }),
388
+ );
382
389
  spawnService(
383
390
  "static",
384
391
  "node",
@@ -396,6 +403,8 @@ function startStaticServer(config) {
396
403
  ...(config.sessionApiKey
397
404
  ? ["--session-api-key", config.sessionApiKey]
398
405
  : []),
406
+ "--runtime-services-info",
407
+ runtimeServicesInfo,
399
408
  "--route",
400
409
  `/api/automation=http://localhost:${config.autoBackendPort}`,
401
410
  "--route",
@@ -428,6 +437,12 @@ function startIngress(config) {
428
437
  logService("ingress", `Starting on port ${config.ingressPort}...`, c.yellow);
429
438
 
430
439
  const ingressScript = join(projectRoot, "scripts", "ingress.mjs");
440
+ const runtimeServicesInfo = JSON.stringify(
441
+ buildAutomationRuntimeServicesInfo({
442
+ ...config,
443
+ frontendKind: "static",
444
+ }),
445
+ );
431
446
 
432
447
  spawnService(
433
448
  "ingress",
@@ -436,6 +451,8 @@ function startIngress(config) {
436
451
  ingressScript,
437
452
  "--port",
438
453
  config.ingressPort.toString(),
454
+ "--runtime-services-info",
455
+ runtimeServicesInfo,
439
456
  "--route",
440
457
  `/api/automation=http://localhost:${config.autoBackendPort}`,
441
458
  "--route",
@@ -958,12 +958,16 @@ function shutdown() {
958
958
 
959
959
  process.on("SIGINT", shutdown);
960
960
  process.on("SIGTERM", shutdown);
961
+ process.on("SIGHUP", shutdown);
961
962
 
962
963
  function startIngress(config) {
963
964
  logService("ingress", `Starting on port ${config.ingressPort}...`, c.yellow);
964
965
 
965
966
  const ingressScript = join(projectRoot, "scripts", "ingress.mjs");
966
967
  const frontendBackend = getFrontendBackend(config);
968
+ const runtimeServicesInfo = config.launchAgentServer
969
+ ? JSON.stringify(buildAutomationRuntimeServicesInfo(config))
970
+ : null;
967
971
 
968
972
  spawnService(
969
973
  "ingress",
@@ -972,6 +976,9 @@ function startIngress(config) {
972
976
  ingressScript,
973
977
  "--port",
974
978
  config.ingressPort.toString(),
979
+ ...(runtimeServicesInfo
980
+ ? ["--runtime-services-info", runtimeServicesInfo]
981
+ : []),
975
982
  ...buildRouteArgs(getLocalServiceRoutes(config)),
976
983
  ...(frontendBackend ? ["--default", frontendBackend] : []),
977
984
  ],
@@ -984,8 +991,8 @@ function startIngress(config) {
984
991
 
985
992
  /**
986
993
  * Build the JSON-serializable runtime services info for an automation
987
- * stack. Used by both the Vite dev server (dev mode) and static-build.mjs
988
- * (static mode) so the frontend can populate the agent's
994
+ * stack. Backend-serving processes append this to `/server_info` so any
995
+ * frontend connected to the backend can populate the agent's
989
996
  * `<RUNTIME_SERVICES>` system-prompt block.
990
997
  */
991
998
  export function buildAutomationRuntimeServicesInfo(config) {
@@ -1009,9 +1016,6 @@ function startVite(config) {
1009
1016
  logService("vite", `Starting on port ${config.vitePort}...`, c.magenta);
1010
1017
 
1011
1018
  const frontendCommand = buildNpmScriptCommand("dev:frontend");
1012
- const runtimeServicesInfo = config.launchAgentServer
1013
- ? buildAutomationRuntimeServicesInfo(config)
1014
- : null;
1015
1019
 
1016
1020
  const viteEnv = {
1017
1021
  // Full-stack mode points Vite at this launcher's ingress. Frontend-only
@@ -1023,12 +1027,6 @@ function startVite(config) {
1023
1027
  viteEnv.VITE_WORKING_DIR = config.viteWorkingDir;
1024
1028
  }
1025
1029
 
1026
- if (runtimeServicesInfo) {
1027
- // Inform the frontend (and downstream, the agent's system prompt) about
1028
- // which services are available in this dev stack.
1029
- viteEnv.VITE_RUNTIME_SERVICES_INFO = JSON.stringify(runtimeServicesInfo);
1030
- }
1031
-
1032
1030
  // In local mode, bake the session key into the frontend so the user
1033
1031
  // never has to paste it. In public mode, omit the key and set
1034
1032
  // VITE_AUTH_REQUIRED so the frontend shows the API key entry screen
@@ -1442,9 +1440,9 @@ function startStaticFrontend(config, staticDir) {
1442
1440
  logService("static", `Starting on port ${config.vitePort}...`, c.magenta);
1443
1441
  logService("static", `Serving from: ${staticDir}`, c.dim);
1444
1442
 
1445
- // Build the runtime-services info JSON so the pre-built frontend can
1446
- // populate the agent's <RUNTIME_SERVICES> system-prompt block without
1447
- // VITE_RUNTIME_SERVICES_INFO baked in at build time.
1443
+ // Build the runtime-services info JSON so static-server can append it to
1444
+ // /server_info. The static-server also injects the old window global for
1445
+ // compatibility with previously built frontend bundles.
1448
1446
  const runtimeServicesInfo = config.launchAgentServer
1449
1447
  ? JSON.stringify(buildAutomationRuntimeServicesInfo(config))
1450
1448
  : null;
@@ -13,6 +13,8 @@
13
13
  * INGRESS_PORT - Port to listen on (default: 8000)
14
14
  * INGRESS_ROUTES - JSON object of path prefix -> backend URL
15
15
  * INGRESS_DEFAULT - Default backend for unmatched routes
16
+ * INGRESS_RUNTIME_SERVICES_INFO - Runtime services JSON appended to
17
+ * /server_info
16
18
  *
17
19
  * Route matching:
18
20
  * - Routes are matched by longest prefix first
@@ -27,6 +29,8 @@ import {
27
29
  createProxyHandlers,
28
30
  createRouter,
29
31
  isBenignSocketError,
32
+ isServerInfoRequest,
33
+ proxyServerInfoRequest,
30
34
  } from "./proxy-utils.mjs";
31
35
 
32
36
  // ═══════════════════════════════════════════════════════════════════════════
@@ -39,6 +43,7 @@ function parseArgs() {
39
43
  port: 8000,
40
44
  routes: {},
41
45
  defaultBackend: null,
46
+ runtimeServicesInfo: null,
42
47
  };
43
48
 
44
49
  for (let i = 0; i < args.length; i++) {
@@ -57,6 +62,9 @@ function parseArgs() {
57
62
  case "--default":
58
63
  config.defaultBackend = args[++i];
59
64
  break;
65
+ case "--runtime-services-info":
66
+ config.runtimeServicesInfo = args[++i] || null;
67
+ break;
60
68
  case "-h":
61
69
  case "--help":
62
70
  showHelp();
@@ -80,12 +88,15 @@ OPTIONS:
80
88
  -p, --port <port> Port to listen on (default: 8000)
81
89
  -r, --route <path=url> Add a route (can be repeated)
82
90
  -d, --default <url> Default backend for unmatched routes
91
+ --runtime-services-info Runtime services JSON for /server_info
83
92
  -h, --help Show this help
84
93
 
85
94
  ENVIRONMENT VARIABLES:
86
95
  INGRESS_PORT Port to listen on
87
96
  INGRESS_ROUTES JSON object: {"path": "url", ...}
88
97
  INGRESS_DEFAULT Default backend URL
98
+ INGRESS_RUNTIME_SERVICES_INFO
99
+ Runtime services JSON for /server_info
89
100
 
90
101
  EXAMPLES:
91
102
  # Basic setup with agent server and automation
@@ -125,6 +136,8 @@ function buildConfig(args, env = process.env) {
125
136
  port: args.port || parseInt(env.INGRESS_PORT, 10) || 8000,
126
137
  routes,
127
138
  defaultBackend: args.defaultBackend || env.INGRESS_DEFAULT || null,
139
+ runtimeServicesInfo:
140
+ args.runtimeServicesInfo || env.INGRESS_RUNTIME_SERVICES_INFO || null,
128
141
  };
129
142
  }
130
143
 
@@ -146,6 +159,15 @@ export function startIngress(config) {
146
159
  return;
147
160
  }
148
161
 
162
+ if (
163
+ config.runtimeServicesInfo &&
164
+ isServerInfoRequest(req) &&
165
+ (req.method === "GET" || req.method === "HEAD")
166
+ ) {
167
+ proxyServerInfoRequest(req, res, backend, config.runtimeServicesInfo);
168
+ return;
169
+ }
170
+
149
171
  proxy.proxyHttp(req, res, backend);
150
172
  });
151
173
 
@@ -1,6 +1,9 @@
1
+ import { request as httpRequest } from "node:http";
2
+ import { request as httpsRequest } from "node:https";
1
3
  import { createProxyServer } from "httpxy";
2
4
 
3
5
  const DEFAULT_PROXY_TIMEOUT_MS = 120_000;
6
+ const SERVER_INFO_PATH = "/server_info";
4
7
  const BENIGN_SOCKET_ERRORS = new Set([
5
8
  "ECONNRESET",
6
9
  "EPIPE",
@@ -35,6 +38,152 @@ export function isBenignSocketError(err) {
35
38
  return Boolean(err && BENIGN_SOCKET_ERRORS.has(err.code));
36
39
  }
37
40
 
41
+ function parseBackendUrl(backendUrl) {
42
+ const url = new URL(backendUrl);
43
+ if (url.protocol !== "http:" && url.protocol !== "https:") {
44
+ throw new Error("Invalid backend URL");
45
+ }
46
+ return {
47
+ hostname: url.hostname,
48
+ port: Number.parseInt(url.port, 10) || (url.protocol === "https:" ? 443 : 80),
49
+ protocol: url.protocol,
50
+ };
51
+ }
52
+
53
+ function writeInvalidBackendUrlResponse(req, res) {
54
+ const message = "Invalid backend URL";
55
+ console.error(`Proxy error for ${req.url}: ${message}`);
56
+ if (!res.headersSent) {
57
+ res.writeHead(502, { "Content-Type": "text/plain; charset=utf-8" });
58
+ res.end(`Bad Gateway: ${message}`);
59
+ } else {
60
+ res.destroy();
61
+ }
62
+ }
63
+
64
+ export function isServerInfoRequest(req) {
65
+ const pathname = new URL(req.url ?? "/", "http://localhost").pathname;
66
+ return pathname === SERVER_INFO_PATH;
67
+ }
68
+
69
+ export function proxyServerInfoRequest(
70
+ req,
71
+ res,
72
+ backendUrl,
73
+ runtimeServicesInfo,
74
+ ) {
75
+ let backend;
76
+ try {
77
+ backend = parseBackendUrl(backendUrl);
78
+ } catch {
79
+ writeInvalidBackendUrlResponse(req, res);
80
+ return;
81
+ }
82
+
83
+ const request = backend.protocol === "https:" ? httpsRequest : httpRequest;
84
+ const proxyReq = request(
85
+ {
86
+ hostname: backend.hostname,
87
+ port: backend.port,
88
+ path: req.url,
89
+ method: req.method,
90
+ headers: {
91
+ ...req.headers,
92
+ host: `${backend.hostname}:${backend.port}`,
93
+ },
94
+ },
95
+ (proxyRes) => {
96
+ const chunks = [];
97
+
98
+ proxyRes.on("data", (chunk) => {
99
+ chunks.push(Buffer.from(chunk));
100
+ });
101
+
102
+ proxyRes.on("error", (err) => {
103
+ if (!isBenignSocketError(err)) {
104
+ console.error(`Upstream response error for ${req.url}:`, err.message);
105
+ }
106
+ if (!res.headersSent) {
107
+ res.writeHead(502);
108
+ res.end(`Bad Gateway: ${err.message}`);
109
+ } else {
110
+ res.destroy();
111
+ }
112
+ });
113
+
114
+ proxyRes.on("end", () => {
115
+ const statusCode = proxyRes.statusCode ?? 502;
116
+ const headers = { ...proxyRes.headers };
117
+ const originalBody = Buffer.concat(chunks);
118
+
119
+ if (statusCode < 200 || statusCode >= 300 || req.method === "HEAD") {
120
+ res.writeHead(statusCode, headers);
121
+ res.end(req.method === "HEAD" ? "" : originalBody);
122
+ return;
123
+ }
124
+
125
+ try {
126
+ const serverInfo = JSON.parse(originalBody.toString("utf8"));
127
+ const runtimeServices =
128
+ typeof runtimeServicesInfo === "string"
129
+ ? JSON.parse(runtimeServicesInfo)
130
+ : runtimeServicesInfo;
131
+ const body = Buffer.from(
132
+ JSON.stringify({
133
+ ...serverInfo,
134
+ runtime_services: runtimeServices,
135
+ }),
136
+ "utf8",
137
+ );
138
+
139
+ delete headers["content-length"];
140
+ delete headers["transfer-encoding"];
141
+ headers["content-type"] = "application/json; charset=utf-8";
142
+ headers["cache-control"] = "no-store";
143
+ res.writeHead(statusCode, headers);
144
+ res.end(body);
145
+ } catch (err) {
146
+ console.warn(
147
+ `Could not append runtime_services to ${SERVER_INFO_PATH}: ${
148
+ err instanceof Error ? err.message : String(err)
149
+ }`,
150
+ );
151
+ res.writeHead(statusCode, headers);
152
+ res.end(originalBody);
153
+ }
154
+ });
155
+ },
156
+ );
157
+
158
+ proxyReq.on("error", (err) => {
159
+ if (!isBenignSocketError(err)) {
160
+ console.error(`Proxy error for ${req.url}:`, err.message);
161
+ }
162
+ if (!res.headersSent) {
163
+ res.writeHead(502);
164
+ res.end(`Bad Gateway: ${err.message}`);
165
+ } else {
166
+ res.destroy();
167
+ }
168
+ });
169
+
170
+ req.on("error", (err) => {
171
+ if (!isBenignSocketError(err)) {
172
+ console.error(`Client request error for ${req.url}:`, err.message);
173
+ }
174
+ proxyReq.destroy();
175
+ });
176
+
177
+ res.on("error", (err) => {
178
+ if (!isBenignSocketError(err)) {
179
+ console.error(`Client response error for ${req.url}:`, err.message);
180
+ }
181
+ proxyReq.destroy();
182
+ });
183
+
184
+ req.pipe(proxyReq, { end: true });
185
+ }
186
+
38
187
  function once(fn) {
39
188
  let called = false;
40
189
  return (...args) => {
@@ -97,7 +246,7 @@ export function createProxyHandlers({
97
246
  res.on("finish", finish);
98
247
  res.on("error", finish);
99
248
 
100
- proxy.web(req, res, { target }).catch((err) => {
249
+ const handleProxyError = (err) => {
101
250
  metrics.totalErrors += 1;
102
251
  if (!isBenignSocketError(err)) {
103
252
  console.error(
@@ -107,7 +256,13 @@ export function createProxyHandlers({
107
256
  }
108
257
  writeProxyError(res, err instanceof Error ? err.message : String(err));
109
258
  finish();
110
- });
259
+ };
260
+
261
+ try {
262
+ proxy.web(req, res, { target }).catch(handleProxyError);
263
+ } catch (err) {
264
+ handleProxyError(err);
265
+ }
111
266
  }
112
267
 
113
268
  function proxyWebSocket(req, socket, head, target) {
@@ -2,19 +2,19 @@
2
2
  * Single source of truth for the `<RUNTIME_SERVICES>` block.
3
3
  *
4
4
  * Builds a structured description of the services that are reachable from
5
- * inside the agent's sandbox. The frontend forwards it (verbatim, as a JSON
6
- * string) and renders it into the system prompt via
7
- * `AgentContext.system_message_suffix`, so the agent sees a
5
+ * inside the agent's sandbox. Agent Canvas backend-serving processes attach it
6
+ * to `/server_info.runtime_services`; the frontend renders that backend value
7
+ * into `AgentContext.system_message_suffix`, so the agent sees a
8
8
  * `<RUNTIME_SERVICES>` block listing what's available without having to probe.
9
9
  *
10
10
  * Two callers share this one definition:
11
11
  * - the dev launchers (scripts/dev-*.mjs), which know the stack as a set of
12
- * ports and bake the result into `VITE_RUNTIME_SERVICES_INFO` at build time;
12
+ * ports and pass the result to ingress/static-server for `/server_info`;
13
13
  * - docker/entrypoint.sh, which runs this file as a CLI (see the bottom of
14
14
  * this module) because in a container the URLs are *runtime* config — the
15
15
  * ports and base URLs are overridable at `docker run` and therefore cannot
16
- * be baked into the image at build time. The JSON it prints is injected
17
- * into index.html at serve time by scripts/static-server.mjs.
16
+ * be baked into the image at build time. The JSON it prints is passed to
17
+ * scripts/static-server.mjs and exposed through `/server_info`.
18
18
  *
19
19
  * URLs are written from the *agent's* point of view (i.e. as the agent should
20
20
  * curl/fetch them from inside its sandbox), which is deliberately not the
@@ -3,7 +3,6 @@ import { existsSync } from "node:fs";
3
3
  import { join } from "node:path";
4
4
 
5
5
  import {
6
- buildAutomationRuntimeServicesInfo,
7
6
  c,
8
7
  logError,
9
8
  logService,
@@ -45,12 +44,6 @@ export function buildFrontend(config, args = {}) {
45
44
  // Bake the session API key — used by the frontend for both agent-server
46
45
  // and automation auth via the `X-Session-API-Key` header.
47
46
  VITE_SESSION_API_KEY: config.sessionApiKey,
48
- // Bake a description of the runtime services in this dev stack so the
49
- // frontend can populate the agent's <RUNTIME_SERVICES> system-prompt
50
- // block when creating a conversation.
51
- VITE_RUNTIME_SERVICES_INFO: JSON.stringify(
52
- buildAutomationRuntimeServicesInfo(config),
53
- ),
54
47
  // Intentionally do NOT set VITE_BACKEND_BASE_URL: leaving it unset makes
55
48
  // the runtime fall back to window.location.origin, which keeps the build
56
49
  // portable across localhost, LAN hosts, and tunnels such as ngrok.