@openhands/agent-canvas 1.15.0 → 1.17.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 (1277) hide show
  1. package/README.md +15 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/{acp-providers-BKvmTf82.js → acp-providers-DrjNsPOH.js} +1 -1
  4. package/build/assets/active-backend-context-rZiLJRUc.js +2 -0
  5. package/build/assets/{agent-context-settings-D3PjSTU1.js → agent-context-settings-CJUrcBut.js} +1 -1
  6. package/build/assets/agent-profiles-service.api-Biieml2L.js +1 -0
  7. package/build/assets/agent-profiles-settings-x6RvPsq7.js +1 -0
  8. package/build/assets/agent-server-client-options-BikiNwTa.js +1 -0
  9. package/build/assets/agent-server-conversation-service.api-DYFsNHKf.js +88 -0
  10. package/build/assets/agent-settings-BJyovpJ_.js +1 -0
  11. package/build/assets/agent-settings-CpY3zObk.js +2 -0
  12. package/build/assets/alert-banner-vARz1idS.js +1 -0
  13. package/build/assets/{api-error-message-BJyfWp6p.js → api-error-message-Ve79qDcN.js} +1 -1
  14. package/build/assets/api-key-entry-screen-CsMuBhoP.js +1 -0
  15. package/build/assets/{app-settings-CbHqzQus.js → app-settings-BaJ7nfHt.js} +1 -1
  16. package/build/assets/automation-detail-CVoGDrKq.js +3 -0
  17. package/build/assets/{automation-export-BRopEHMu.js → automation-export-DxY47m3T.js} +1 -1
  18. package/build/assets/automation-git-sync-CRMP9Bbm.js +1 -0
  19. package/build/assets/automation-setup-route-072beLz1.js +3 -0
  20. package/build/assets/{automation-templates-C_0FZgLG.js → automation-templates-4C4PM8K7.js} +1 -1
  21. package/build/assets/automations-list-xuqTSQL4.js +1 -0
  22. package/build/assets/{back-nav-button-Dm9tIjVf.js → back-nav-button-B8tH0BEp.js} +1 -1
  23. package/build/assets/backend-form-modal-0aJmWdsa.js +1 -0
  24. package/build/assets/{backend-synced-settings-badge-3fOwg6Bd.js → backend-synced-settings-badge-B7rKWBir.js} +1 -1
  25. package/build/assets/{badge-D4SqUCsR.js → badge-CcGx2TaV.js} +1 -1
  26. package/build/assets/{base-modal-C7_BDl_U.js → base-modal-DTULovNc.js} +1 -1
  27. package/build/assets/bot-CLMxGFaq.js +1 -0
  28. package/build/assets/{brand-button-Dxv6PDeN.js → brand-button-DxPO4Lf8.js} +1 -1
  29. package/build/assets/browser-C-_qBasq.js +46 -0
  30. package/build/assets/{browser-tab-BAl4ckJE.js → browser-tab-DZanIw5m.js} +1 -1
  31. package/build/assets/canvas-extension-page-o_cWgE9B.js +1 -0
  32. package/build/assets/canvas-extensions-DSgNlCha.js +1 -0
  33. package/build/assets/canvas-extensions-runtime-DdnkgJXV.js +1 -0
  34. package/build/assets/{chat-send-button-DWwR2cgI.js → chat-send-button-B3SFSIg5.js} +1 -1
  35. package/build/assets/check-fDEfgSzj.js +1 -0
  36. package/build/assets/chevron-down-CFrWHqu8.js +1 -0
  37. package/build/assets/chevron-right-C5roOrJu.js +1 -0
  38. package/build/assets/circle-check-ClTzJTdb.js +1 -0
  39. package/build/assets/{circle-plus-check-toggle-CBh_qomE.js → circle-plus-check-toggle-Fr-h-mbL.js} +1 -1
  40. package/build/assets/{cloud-funnel-analytics-287iIERo.js → cloud-funnel-analytics-BQanUEEC.js} +1 -1
  41. package/build/assets/{cog-C4rrw-ZK.js → cog-VBlRo6iw.js} +1 -1
  42. package/build/assets/command-menu-BT3Ia5Ru.js +1 -0
  43. package/build/assets/commits-tab-2jhtaohl.js +1 -0
  44. package/build/assets/{condenser-settings-BcNmYR4s.js → condenser-settings-eVKFMvap.js} +1 -1
  45. package/build/assets/confirmation-modal-gIFHeZt6.js +1 -0
  46. package/build/assets/{context-menu-list-item-lVYETtY5.js → context-menu-list-item-DDROe12Z.js} +1 -1
  47. package/build/assets/conversation-BnjJSFf5.js +93 -0
  48. package/build/assets/conversation-DZ578rOX.js +1 -0
  49. package/build/assets/conversation-panel-DZ578rOX.js +1 -0
  50. package/build/assets/conversation-state-store-D1_G_9I-.js +1 -0
  51. package/build/assets/{conversation-store-Ca3ghXap.js → conversation-store-DVVfkCsk.js} +1 -1
  52. package/build/assets/{conversation-tab-empty-state-HJtkmHZj.js → conversation-tab-empty-state-DKlzAz5c.js} +1 -1
  53. package/build/assets/{copy-to-clipboard-button-Cjkswvnj.js → copy-to-clipboard-button-B3w0X7WH.js} +1 -1
  54. package/build/assets/{device-verify-EZhHhBT7.js → device-verify-BfkCzyFB.js} +1 -1
  55. package/build/assets/{dropdown-classes-DJe-E6MC.js → dropdown-classes-B9kJVDIk.js} +1 -1
  56. package/build/assets/edit-automation-modal-BwhJ39JT.js +1 -0
  57. package/build/assets/empty-state-RZz0OfnY.js +1 -0
  58. package/build/assets/{entry.client-C7Bi2tkU.js → entry.client-Ds8LVp-E.js} +2 -2
  59. package/build/assets/enum-filter-dropdown-C4pW0ORd.js +1 -0
  60. package/build/assets/{environment-switch-overlay-CEKrFiMw.js → environment-switch-overlay-P2ZAuzov.js} +1 -1
  61. package/build/assets/{error-state-BALXiBNy.js → error-state-B_5cgNPJ.js} +1 -1
  62. package/build/assets/extensions-hub-DsaUr4ca.js +1 -0
  63. package/build/assets/extensions-navigation-CRMZd-FE.js +1 -0
  64. package/build/assets/external-link-DQtv7eTh.js +1 -0
  65. package/build/assets/files-tab-CCgAcVdc.js +1 -0
  66. package/build/assets/{form-control-classes-CGw40z5h.js → form-control-classes-B-z85REi.js} +1 -1
  67. package/build/assets/format-model-name-CasAP3nd.js +1 -0
  68. package/build/assets/get-git-path-EHrSDxTM.js +1 -0
  69. package/build/assets/git-repo-dropdown-D2WEQ97X.js +1 -0
  70. package/build/assets/{git-repo-dropdown-ai8qaNkD.js → git-repo-dropdown-DVeCUUXG.js} +1 -1
  71. package/build/assets/{highlighted-source-view-C3sxykQi.js → highlighted-source-view-DjHO3SdW.js} +1 -1
  72. package/build/assets/home-BorS_vdS.js +1 -0
  73. package/build/assets/home-aIMbHw5M.js +1 -0
  74. package/build/assets/home-automation-run-tooltip-CpHNFiFl.js +1 -0
  75. package/build/assets/home-store-DyXz0w6d.js +1 -0
  76. package/build/assets/hooks-service-C6dpRtZM.js +1 -0
  77. package/build/assets/index-home-zKFuKK2B.js +1 -0
  78. package/build/assets/info-CTIdjttz.js +1 -0
  79. package/build/assets/install-server-modal-DUiZMc8u.js +1 -0
  80. package/build/assets/kebab-menu-item-content-mm04SBD3.js +1 -0
  81. package/build/assets/{key-Cn5za3rg.js → key-CfXbJa8w.js} +1 -1
  82. package/build/assets/{launch-C1ieiOGe.js → launch-BSIf9KEg.js} +1 -1
  83. package/build/assets/list-filter-CNpqTWVY.js +1 -0
  84. package/build/assets/{list-todo-Cuu-STFc.js → list-todo-ByXMdY4W.js} +1 -1
  85. package/build/assets/llm-not-configured-banner-z_QRSeV0.js +27 -0
  86. package/build/assets/llm-settings-B-5AHMiX.js +1 -0
  87. package/build/assets/llm-settings-B3SjHDmA.js +1 -0
  88. package/build/assets/llm-subscription-service-aDNBQ7Gq.js +1 -0
  89. package/build/assets/loader-circle-Dex47vVW.js +1 -0
  90. package/build/assets/{loading-spinner-0L3ZTToZ.js → loading-spinner-DfHI77BA.js} +1 -1
  91. package/build/assets/manage-backends-modal-q1NdFisr.js +1 -0
  92. package/build/assets/manifest-8920b615.js +1 -0
  93. package/build/assets/{manifest-subpage-layout-BGhiUQbA.js → manifest-subpage-layout-BQQy5ipR.js} +1 -1
  94. package/build/assets/{map-provider-B9LTm23I.js → map-provider-DXvssjw9.js} +1 -1
  95. package/build/assets/markdown-renderer-rivLvYh-.js +8 -0
  96. package/build/assets/{mcp-CKbR4Vft.js → mcp-CEXDhQWn.js} +1 -1
  97. package/build/assets/{mcp-marketplace-utils-C13fFccR.js → mcp-marketplace-utils-Cn_NIMWM.js} +1 -1
  98. package/build/assets/mcp-page-LGYIICMG.js +9 -0
  99. package/build/assets/messages-DUSeANAh.js +41 -0
  100. package/build/assets/{modal-body-CMOc2tLl.js → modal-body-DJw4xBki.js} +1 -1
  101. package/build/assets/{modal-classes-BAb4Y_BG.js → modal-classes-Dg0ngBPO.js} +1 -1
  102. package/build/assets/{modal-close-button-CkJ0Ktjj.js → modal-close-button-B9j4nasm.js} +1 -1
  103. package/build/assets/{mouse-pointer-click-CsgRs_-r.js → mouse-pointer-click-DEhsSUpu.js} +1 -1
  104. package/build/assets/onboarding-BjFebfs5.js +1 -0
  105. package/build/assets/onboarding-modal-DDTjOpyd.js +1 -0
  106. package/build/assets/organization-service.api-Cyg1Tn03.js +1 -0
  107. package/build/assets/pencil-D5c47kyN.js +1 -0
  108. package/build/assets/pin-C7vMagvf.js +1 -0
  109. package/build/assets/planner-tab-D8f2Y3rn.js +1 -0
  110. package/build/assets/plug-CeaqeF6u.js +1 -0
  111. package/build/assets/plugins-management-service-Bh_pBuf-.js +1 -0
  112. package/build/assets/plus-B3wvU06-.js +1 -0
  113. package/build/assets/profiles-service.api-BbOK0EkF.js +1 -0
  114. package/build/assets/providers-2gIIkz2N.js +1 -0
  115. package/build/assets/proxy-CBgMd2zf.js +1 -0
  116. package/build/assets/{puzzle-A9pGxxai.js → puzzle-DdAqbUrb.js} +1 -1
  117. package/build/assets/recommended-automations-launcher-YLAQTp4s.js +1 -0
  118. package/build/assets/refresh-cw-DEQdPCpH.js +1 -0
  119. package/build/assets/root-Bye_XmEL.js +2 -0
  120. package/build/assets/root-Cnwwzgo0.css +1 -0
  121. package/build/assets/root-layout-CSAwxBGM.js +2 -0
  122. package/build/assets/schema-field-CK0xYNbO.js +1 -0
  123. package/build/assets/scroll-fade-state-Dt_fx2kf.js +1 -0
  124. package/build/assets/sdk-section-page-Da73Rs_o.js +1 -0
  125. package/build/assets/secret-form-CB2VwYYg.js +1 -0
  126. package/build/assets/secrets-service-Cr8g8xuv.js +1 -0
  127. package/build/assets/{secrets-settings-BizaTEr1.js → secrets-settings-Bh0udeKv.js} +1 -1
  128. package/build/assets/settings-CKqk8ZnH.js +1 -0
  129. package/build/assets/settings-DmyIgRxO.js +1 -0
  130. package/build/assets/{settings-dropdown-input-tM0A0ipy.js → settings-dropdown-input-DVpyD87C.js} +1 -1
  131. package/build/assets/settings-index-BSJUFmjE.js +1 -0
  132. package/build/assets/{settings-input-C03KUoSC.js → settings-input-C0dd8Utu.js} +1 -1
  133. package/build/assets/{settings-list-classes-BJ0g8rWj.js → settings-list-classes-Ds4jPBHK.js} +1 -1
  134. package/build/assets/{settings-modal-AzEF1QPP.js → settings-modal-yStgEh2o.js} +1 -1
  135. package/build/assets/settings-service.api-9_xdv_mh.js +1 -0
  136. package/build/assets/{settings-switch-CQE0EGC-.js → settings-switch-B78Khmyz.js} +1 -1
  137. package/build/assets/{settings-utils-ClYOkbbI.js → settings-utils-8GIIgOQL.js} +1 -1
  138. package/build/assets/shared-conversation-DM96X4KV.js +1 -0
  139. package/build/assets/shield-check-DO7wa_eu.js +1 -0
  140. package/build/assets/{sidebar-layout-D3hE08wK.js → sidebar-layout-EPfWxk11.js} +1 -1
  141. package/build/assets/sidebar-mobile-menu-toggle-D5GR5xT9.js +1 -0
  142. package/build/assets/sidebar-nav-link-_t4_Ef-9.js +1 -0
  143. package/build/assets/{sidebar-onboarding-checklist-storage-3qYflszY.js → sidebar-onboarding-checklist-storage-DbDX-Wvj.js} +1 -1
  144. package/build/assets/sidebar-store-CSDFK0W5.js +1 -0
  145. package/build/assets/{skill-card-pill-row-CFxjoqxn.js → skill-card-pill-row-989y15jV.js} +1 -1
  146. package/build/assets/skill-enablement-DXeaImBz.js +1 -0
  147. package/build/assets/skill-filter-BBeZ4JEP.js +2 -0
  148. package/build/assets/{skill-icon-badge-CPQJ6A-I.js → skill-icon-badge-BDhQ-tQ0.js} +1 -1
  149. package/build/assets/skill-scope-Dz3kPH3P.js +1 -0
  150. package/build/assets/skills-plugins-e3CYGdUJ.js +1 -0
  151. package/build/assets/skills-settings-3e-FuHw_.js +1 -0
  152. package/build/assets/styled-tooltip-Pd22BIvr.js +1 -0
  153. package/build/assets/{task-list-tab-04GNQuii.js → task-list-tab-3Jg8ywch.js} +1 -1
  154. package/build/assets/{terminal-Cj0iHIW7.js → terminal-onXx0_Qz.js} +1 -1
  155. package/build/assets/toggle-switch-lwQtxDcm.js +1 -0
  156. package/build/assets/trash-2-ZhKuTLiz.js +1 -0
  157. package/build/assets/trash-B6OIe4yX.js +1 -0
  158. package/build/assets/triangle-alert-BajLPpQg.js +1 -0
  159. package/build/assets/{typography-SgFy466J.js → typography-HLLg_FAn.js} +1 -1
  160. package/build/assets/usage-tab-Cm-9j3UK.js +1 -0
  161. package/build/assets/use-acp-credential-form-BARcvjYE.js +1 -0
  162. package/build/assets/use-activate-agent-profile-BLKML6vQ.js +1 -0
  163. package/build/assets/use-agent-profiles-1P91KSXz.js +1 -0
  164. package/build/assets/{use-automation-health-BxXdzZMP.js → use-automation-health-BZkQNEA8.js} +1 -1
  165. package/build/assets/use-automation-permissions-B_RpvL-s.js +1 -0
  166. package/build/assets/{use-automations-zYb0dUny.js → use-automations-Cg0PDIZr.js} +1 -1
  167. package/build/assets/{use-can-manage-org-profiles-BWMahtUh.js → use-can-manage-org-profiles-BbN6KfDr.js} +1 -1
  168. package/build/assets/use-canvas-extensions-CFUpHat6.js +1 -0
  169. package/build/assets/{use-cloud-current-user-id-CPHMDG-C.js → use-cloud-current-user-id-Dk0rjr63.js} +1 -1
  170. package/build/assets/use-config-DpafU_QP.js +1 -0
  171. package/build/assets/use-create-conversation-1YgmAHt-.js +1 -0
  172. package/build/assets/use-create-secret-D8p9ybQj.js +1 -0
  173. package/build/assets/{use-get-secrets-BT4ihRwj.js → use-get-secrets-CQ4b0qK8.js} +1 -1
  174. package/build/assets/use-is-authed-BRPjCRKM.js +1 -0
  175. package/build/assets/{use-launch-skill-in-chat-BYjYihBP.js → use-launch-skill-in-chat-DeYa1tFM.js} +1 -1
  176. package/build/assets/use-llm-configured-DGm8FiRR.js +1 -0
  177. package/build/assets/use-llm-profiles-BTTtpW4z.js +1 -0
  178. package/build/assets/use-manifest-capabilities-AOWGcu0j.js +1 -0
  179. package/build/assets/use-onboarding-completion-CoINurkm.js +1 -0
  180. package/build/assets/use-pinned-home-route-D6krwXjy.js +1 -0
  181. package/build/assets/use-plugins-marketplace-mLsIDhBv.js +1 -0
  182. package/build/assets/use-save-agent-profile-CxyO9YG-.js +1 -0
  183. package/build/assets/{use-save-settings-CUZW6yXP.js → use-save-settings-3U5K9-8x.js} +1 -1
  184. package/build/assets/use-settings-Dn00UISA.js +1 -0
  185. package/build/assets/use-settings-nav-items-vrjxTqcu.js +16 -0
  186. package/build/assets/use-tracking-B9prBsrq.js +3 -0
  187. package/build/assets/{use-user-conversation-DT0_QCnL.js → use-user-conversation-ZWlXtbZb.js} +1 -1
  188. package/build/assets/{useInfiniteQuery-CgeUQPfs.js → useInfiniteQuery-BzrRqjLg.js} +1 -1
  189. package/build/assets/{useMutation-DFnzkf6f.js → useMutation-CJuK90oc.js} +1 -1
  190. package/build/assets/{useQueries-BhbrGEf1.js → useQueries-CykmpT-a.js} +1 -1
  191. package/build/assets/{useQuery-BXWbZBZl.js → useQuery-S6j94er1.js} +1 -1
  192. package/build/assets/utils-BOco8mxR.js +1 -0
  193. package/build/assets/{vendor~conversation-panel~conversation-CTvDDiXg.js → vendor~conversation-panel~conversation-4eJ0tml3.js} +1 -1
  194. package/build/assets/{vendor~entry.client-BFE7Llz9.js → vendor~entry.client-CoCfUXUF.js} +1 -1
  195. package/build/assets/{vendor~entry.client-BaKt_PIp.js → vendor~entry.client-DA2izTjq.js} +1 -1
  196. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~b0x1wrp2-Z0lly3FE.js +2 -0
  197. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-BfkNGovw.js +185 -0
  198. package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew3u153i-rfV8mQ9m.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-DnDoaYNi.js} +1 -1
  199. package/build/assets/{vendor~index-home~home~conversation-panel~conversation-BTyukeM-.js → vendor~index-home~home~conversation-panel~conversation-CSFLzmTN.js} +1 -1
  200. package/build/assets/vendor~root-layout-n8XCEXG8.js +1 -0
  201. package/build/assets/{vendor~root-layout~conversation-panel~conversation-BYAWJwQX.js → vendor~root-layout~conversation-panel~conversation-3Idg1_U3.js} +1 -1
  202. package/build/assets/{vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-CHaLEBVR.js → vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-DkPlXWl9.js} +1 -1
  203. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation-DgQ564nC.js +1 -0
  204. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-CxhwKuAd.js +1 -0
  205. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-Dtu7BpYk.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~inibp4qe-CnsDDzeE.js} +2 -2
  206. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iyia17eu-CV850oio.js +1 -0
  207. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-DonTKfQD.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-BPjI-atc.js} +125 -15
  208. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~jz4f6vo2-BgxDvUcf.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~jz4f6vo2-C7HiY4Ae.js} +42 -3
  209. package/build/assets/{verification-settings-Bj6bo097.js → verification-settings-u2POabjH.js} +1 -1
  210. package/build/assets/{wrench-hi7Q13dF.js → wrench-CkgI4rxA.js} +1 -1
  211. package/build/assets/x-By6qCmtY.js +1 -0
  212. package/build/index.html +4 -4
  213. package/build/locales/ar/openhands.json +94 -25
  214. package/build/locales/ca/openhands.json +94 -25
  215. package/build/locales/de/openhands.json +94 -25
  216. package/build/locales/en/openhands.json +94 -25
  217. package/build/locales/es/openhands.json +94 -25
  218. package/build/locales/fr/openhands.json +94 -25
  219. package/build/locales/it/openhands.json +94 -25
  220. package/build/locales/ja/openhands.json +94 -25
  221. package/build/locales/ko-KR/openhands.json +94 -25
  222. package/build/locales/no/openhands.json +94 -25
  223. package/build/locales/pt/openhands.json +94 -25
  224. package/build/locales/tr/openhands.json +94 -25
  225. package/build/locales/uk/openhands.json +94 -25
  226. package/build/locales/zh-CN/openhands.json +94 -25
  227. package/build/locales/zh-TW/openhands.json +94 -25
  228. package/config/defaults.json +9 -5
  229. package/dist/api/agent-profiles-service/profile-field-support.d.ts +26 -0
  230. package/dist/api/agent-server-adapter.cjs +3 -3
  231. package/dist/api/agent-server-adapter.cjs.map +1 -1
  232. package/dist/api/agent-server-adapter.d.ts +72 -12
  233. package/dist/api/agent-server-adapter.js +249 -145
  234. package/dist/api/agent-server-adapter.js.map +1 -1
  235. package/dist/api/agent-server-compatibility.cjs +1 -1
  236. package/dist/api/agent-server-compatibility.cjs.map +1 -1
  237. package/dist/api/agent-server-compatibility.d.ts +21 -0
  238. package/dist/api/agent-server-compatibility.js +52 -38
  239. package/dist/api/agent-server-compatibility.js.map +1 -1
  240. package/dist/api/agent-server-config.cjs +1 -1
  241. package/dist/api/agent-server-config.cjs.map +1 -1
  242. package/dist/api/agent-server-config.d.ts +32 -0
  243. package/dist/api/agent-server-config.js +21 -5
  244. package/dist/api/agent-server-config.js.map +1 -1
  245. package/dist/api/automation-service/automation-service.api.cjs +1 -1
  246. package/dist/api/automation-service/automation-service.api.cjs.map +1 -1
  247. package/dist/api/automation-service/automation-service.api.d.ts +2 -2
  248. package/dist/api/automation-service/automation-service.api.js +7 -7
  249. package/dist/api/automation-service/automation-service.api.js.map +1 -1
  250. package/dist/api/canvas-extensions-service.cjs +1 -0
  251. package/dist/api/canvas-extensions-service.d.ts +22 -0
  252. package/dist/api/canvas-extensions-service.js +4 -0
  253. package/dist/api/cloud/conversation-service.api.cjs +1 -1
  254. package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
  255. package/dist/api/cloud/conversation-service.api.d.ts +6 -0
  256. package/dist/api/cloud/conversation-service.api.js +14 -6
  257. package/dist/api/cloud/conversation-service.api.js.map +1 -1
  258. package/dist/api/cloud/provider-connections-service.api.cjs +2 -0
  259. package/dist/api/cloud/provider-connections-service.api.cjs.map +1 -0
  260. package/dist/api/cloud/provider-connections-service.api.d.ts +5 -0
  261. package/dist/api/cloud/provider-connections-service.api.js +50 -0
  262. package/dist/api/cloud/provider-connections-service.api.js.map +1 -0
  263. package/dist/api/cloud/skills-service.api.cjs +1 -1
  264. package/dist/api/cloud/skills-service.api.cjs.map +1 -1
  265. package/dist/api/cloud/skills-service.api.d.ts +10 -0
  266. package/dist/api/cloud/skills-service.api.js +11 -1
  267. package/dist/api/cloud/skills-service.api.js.map +1 -1
  268. package/dist/api/conversation-file-upload.api.cjs +1 -1
  269. package/dist/api/conversation-file-upload.api.js +10 -10
  270. package/dist/api/conversation-metadata-store.cjs +1 -1
  271. package/dist/api/conversation-metadata-store.cjs.map +1 -1
  272. package/dist/api/conversation-metadata-store.d.ts +24 -0
  273. package/dist/api/conversation-metadata-store.js +10 -2
  274. package/dist/api/conversation-metadata-store.js.map +1 -1
  275. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  276. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  277. package/dist/api/conversation-service/agent-server-conversation-service.api.d.ts +31 -0
  278. package/dist/api/conversation-service/agent-server-conversation-service.api.js +188 -128
  279. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  280. package/dist/api/event-service/event-service.api.cjs +1 -1
  281. package/dist/api/event-service/event-service.api.js +12 -12
  282. package/dist/api/git-service/agent-server-git-service.api.cjs +1 -1
  283. package/dist/api/git-service/agent-server-git-service.api.js +8 -8
  284. package/dist/api/hooks-service.cjs +2 -0
  285. package/dist/api/hooks-service.cjs.map +1 -0
  286. package/dist/api/hooks-service.d.ts +13 -0
  287. package/dist/api/hooks-service.js +20 -0
  288. package/dist/api/hooks-service.js.map +1 -0
  289. package/dist/api/provider-connections-service/provider-connections-service.api.cjs +1 -1
  290. package/dist/api/provider-connections-service/provider-connections-service.api.cjs.map +1 -1
  291. package/dist/api/provider-connections-service/provider-connections-service.api.js +25 -16
  292. package/dist/api/provider-connections-service/provider-connections-service.api.js.map +1 -1
  293. package/dist/api/runtime-service/agent-server-runtime-service.cjs +1 -1
  294. package/dist/api/runtime-service/agent-server-runtime-service.js +8 -8
  295. package/dist/api/settings-service/settings-service.api.cjs +1 -1
  296. package/dist/api/settings-service/settings-service.api.cjs.map +1 -1
  297. package/dist/api/settings-service/settings-service.api.d.ts +5 -2
  298. package/dist/api/settings-service/settings-service.api.js +20 -11
  299. package/dist/api/settings-service/settings-service.api.js.map +1 -1
  300. package/dist/api/skills-service.cjs +1 -1
  301. package/dist/api/skills-service.cjs.map +1 -1
  302. package/dist/api/skills-service.d.ts +7 -0
  303. package/dist/api/skills-service.js +11 -8
  304. package/dist/api/skills-service.js.map +1 -1
  305. package/dist/components/conversation-events/chat/event-message-components/critic-result-display.cjs +1 -1
  306. package/dist/components/conversation-events/chat/event-message-components/critic-result-display.js +5 -5
  307. package/dist/components/conversation-events/chat/event-message-components/event-group.cjs +1 -1
  308. package/dist/components/conversation-events/chat/event-message-components/event-group.cjs.map +1 -1
  309. package/dist/components/conversation-events/chat/event-message-components/event-group.js +40 -36
  310. package/dist/components/conversation-events/chat/event-message-components/event-group.js.map +1 -1
  311. package/dist/components/conversation-events/chat/event-message-components/finish-event-message.cjs +1 -1
  312. package/dist/components/conversation-events/chat/event-message-components/finish-event-message.cjs.map +1 -1
  313. package/dist/components/conversation-events/chat/event-message-components/finish-event-message.js +2 -1
  314. package/dist/components/conversation-events/chat/event-message-components/finish-event-message.js.map +1 -1
  315. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs +1 -1
  316. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs.map +1 -1
  317. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.d.ts +1 -1
  318. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js +28 -28
  319. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js.map +1 -1
  320. package/dist/components/conversation-events/chat/event-message-components/thought-event-message.cjs +1 -1
  321. package/dist/components/conversation-events/chat/event-message-components/thought-event-message.cjs.map +1 -1
  322. package/dist/components/conversation-events/chat/event-message-components/thought-event-message.js +2 -1
  323. package/dist/components/conversation-events/chat/event-message-components/thought-event-message.js.map +1 -1
  324. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.cjs +1 -1
  325. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.cjs.map +1 -1
  326. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.d.ts +1 -1
  327. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.js +37 -37
  328. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.js.map +1 -1
  329. package/dist/components/conversation-events/chat/event-message.cjs +2 -2
  330. package/dist/components/conversation-events/chat/event-message.cjs.map +1 -1
  331. package/dist/components/conversation-events/chat/event-message.js +79 -70
  332. package/dist/components/conversation-events/chat/event-message.js.map +1 -1
  333. package/dist/components/conversation-events/chat/messages.cjs +1 -1
  334. package/dist/components/conversation-events/chat/messages.cjs.map +1 -1
  335. package/dist/components/conversation-events/chat/messages.js +28 -27
  336. package/dist/components/conversation-events/chat/messages.js.map +1 -1
  337. package/dist/components/features/automations/automation-card.cjs +1 -1
  338. package/dist/components/features/automations/automation-card.cjs.map +1 -1
  339. package/dist/components/features/automations/automation-card.js +118 -102
  340. package/dist/components/features/automations/automation-card.js.map +1 -1
  341. package/dist/components/features/automations/automation-list-row.cjs +1 -1
  342. package/dist/components/features/automations/automation-list-row.cjs.map +1 -1
  343. package/dist/components/features/automations/automation-list-row.js +88 -77
  344. package/dist/components/features/automations/automation-list-row.js.map +1 -1
  345. package/dist/components/features/automations/detail/detail-header.d.ts +3 -1
  346. package/dist/components/features/automations/detail/run-phase.cjs +2 -0
  347. package/dist/components/features/automations/detail/run-phase.cjs.map +1 -0
  348. package/dist/components/features/automations/detail/run-phase.d.ts +89 -0
  349. package/dist/components/features/automations/detail/run-phase.js +72 -0
  350. package/dist/components/features/automations/detail/run-phase.js.map +1 -0
  351. package/dist/components/features/automations/detail/run-status-badge.cjs +1 -1
  352. package/dist/components/features/automations/detail/run-status-badge.cjs.map +1 -1
  353. package/dist/components/features/automations/detail/run-status-badge.d.ts +2 -2
  354. package/dist/components/features/automations/detail/run-status-badge.js +82 -53
  355. package/dist/components/features/automations/detail/run-status-badge.js.map +1 -1
  356. package/dist/components/features/automations/kebab-menu.cjs +1 -1
  357. package/dist/components/features/automations/kebab-menu.cjs.map +1 -1
  358. package/dist/components/features/automations/kebab-menu.js +9 -5
  359. package/dist/components/features/automations/kebab-menu.js.map +1 -1
  360. package/dist/components/features/automations/recommended-automations-launcher.cjs +1 -1
  361. package/dist/components/features/automations/recommended-automations-launcher.cjs.map +1 -1
  362. package/dist/components/features/automations/recommended-automations-launcher.js +12 -12
  363. package/dist/components/features/automations/recommended-automations-launcher.js.map +1 -1
  364. package/dist/components/features/automations/recommended-automations-section.cjs +1 -1
  365. package/dist/components/features/automations/recommended-automations-section.js +9 -9
  366. package/dist/components/features/backends/backend-form-modal.cjs +1 -1
  367. package/dist/components/features/backends/backend-form-modal.cjs.map +1 -1
  368. package/dist/components/features/backends/backend-form-modal.js +5 -11
  369. package/dist/components/features/backends/backend-form-modal.js.map +1 -1
  370. package/dist/components/features/backends/backend-selector.cjs +1 -1
  371. package/dist/components/features/backends/backend-selector.cjs.map +1 -1
  372. package/dist/components/features/backends/backend-selector.js +133 -122
  373. package/dist/components/features/backends/backend-selector.js.map +1 -1
  374. package/dist/components/features/backends/manage-backends-modal.cjs +1 -1
  375. package/dist/components/features/backends/manage-backends-modal.cjs.map +1 -1
  376. package/dist/components/features/backends/manage-backends-modal.js +29 -29
  377. package/dist/components/features/backends/manage-backends-modal.js.map +1 -1
  378. package/dist/components/features/canvas-extensions/add-canvas-extension-modal.d.ts +6 -0
  379. package/dist/components/features/canvas-extensions/canvas-extension-card.d.ts +9 -0
  380. package/dist/components/features/canvas-extensions/canvas-extensions-runtime.cjs +2 -0
  381. package/dist/components/features/canvas-extensions/canvas-extensions-runtime.cjs.map +1 -0
  382. package/dist/components/features/canvas-extensions/canvas-extensions-runtime.d.ts +23 -0
  383. package/dist/components/features/canvas-extensions/canvas-extensions-runtime.js +19 -0
  384. package/dist/components/features/canvas-extensions/canvas-extensions-runtime.js.map +1 -0
  385. package/dist/components/features/chat/change-agent-button.cjs +1 -1
  386. package/dist/components/features/chat/change-agent-button.js +4 -4
  387. package/dist/components/features/chat/chat-interface.cjs +2 -2
  388. package/dist/components/features/chat/chat-interface.cjs.map +1 -1
  389. package/dist/components/features/chat/chat-interface.js +107 -104
  390. package/dist/components/features/chat/chat-interface.js.map +1 -1
  391. package/dist/components/features/chat/chat-markdown-path-code.cjs +3 -0
  392. package/dist/components/features/chat/chat-markdown-path-code.cjs.map +1 -0
  393. package/dist/components/features/chat/chat-markdown-path-code.d.ts +27 -0
  394. package/dist/components/features/chat/chat-markdown-path-code.js +72 -0
  395. package/dist/components/features/chat/chat-markdown-path-code.js.map +1 -0
  396. package/dist/components/features/chat/chat-message.cjs +1 -1
  397. package/dist/components/features/chat/chat-message.cjs.map +1 -1
  398. package/dist/components/features/chat/chat-message.d.ts +2 -1
  399. package/dist/components/features/chat/chat-message.js +88 -79
  400. package/dist/components/features/chat/chat-message.js.map +1 -1
  401. package/dist/components/features/chat/components/context-window-meter.cjs +1 -1
  402. package/dist/components/features/chat/components/context-window-meter.js +4 -4
  403. package/dist/components/features/chat/confirmation-mode-enabled.cjs +1 -1
  404. package/dist/components/features/chat/confirmation-mode-enabled.js +4 -4
  405. package/dist/components/features/chat/generic-event-message.cjs +1 -1
  406. package/dist/components/features/chat/generic-event-message.cjs.map +1 -1
  407. package/dist/components/features/chat/generic-event-message.d.ts +2 -1
  408. package/dist/components/features/chat/generic-event-message.js +41 -22
  409. package/dist/components/features/chat/generic-event-message.js.map +1 -1
  410. package/dist/components/features/chat/interactive-chat-box.cjs +1 -1
  411. package/dist/components/features/chat/interactive-chat-box.cjs.map +1 -1
  412. package/dist/components/features/chat/interactive-chat-box.js +20 -19
  413. package/dist/components/features/chat/interactive-chat-box.js.map +1 -1
  414. package/dist/components/features/chat/path-component.cjs +1 -1
  415. package/dist/components/features/chat/path-component.cjs.map +1 -1
  416. package/dist/components/features/chat/path-component.d.ts +8 -2
  417. package/dist/components/features/chat/path-component.js +33 -21
  418. package/dist/components/features/chat/path-component.js.map +1 -1
  419. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.cjs +1 -1
  420. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.cjs.map +1 -1
  421. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.js +38 -43
  422. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.js.map +1 -1
  423. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.cjs +1 -1
  424. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.cjs.map +1 -1
  425. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.d.ts +8 -5
  426. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.js +22 -16
  427. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.js.map +1 -1
  428. package/dist/components/features/chat/user-message-body.cjs +1 -1
  429. package/dist/components/features/chat/user-message-body.cjs.map +1 -1
  430. package/dist/components/features/chat/user-message-body.d.ts +4 -0
  431. package/dist/components/features/chat/user-message-body.js +30 -24
  432. package/dist/components/features/chat/user-message-body.js.map +1 -1
  433. package/dist/components/features/conversation/conversation-overview-git-section.cjs +1 -1
  434. package/dist/components/features/conversation/conversation-overview-git-section.js +4 -4
  435. package/dist/components/features/conversation/conversation-overview-skills-panel.cjs +1 -1
  436. package/dist/components/features/conversation/conversation-overview-skills-panel.cjs.map +1 -1
  437. package/dist/components/features/conversation/conversation-overview-skills-panel.js +63 -81
  438. package/dist/components/features/conversation/conversation-overview-skills-panel.js.map +1 -1
  439. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs +1 -1
  440. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs.map +1 -1
  441. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js +77 -78
  442. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js.map +1 -1
  443. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs +1 -1
  444. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs.map +1 -1
  445. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js +96 -96
  446. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js.map +1 -1
  447. package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.cjs +1 -1
  448. package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.cjs.map +1 -1
  449. package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.d.ts +1 -1
  450. package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.js +3 -3
  451. package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.js.map +1 -1
  452. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.cjs +2 -0
  453. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.cjs.map +1 -0
  454. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.d.ts +21 -0
  455. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.js +239 -0
  456. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.js.map +1 -0
  457. package/dist/components/features/conversation-panel/conversation-active-tag-filters.cjs +2 -0
  458. package/dist/components/features/conversation-panel/conversation-active-tag-filters.cjs.map +1 -0
  459. package/dist/components/features/conversation-panel/conversation-active-tag-filters.d.ts +28 -0
  460. package/dist/components/features/conversation-panel/conversation-active-tag-filters.js +69 -0
  461. package/dist/components/features/conversation-panel/conversation-active-tag-filters.js.map +1 -0
  462. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs +1 -1
  463. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs.map +1 -1
  464. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.d.ts +2 -1
  465. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js +19 -18
  466. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js.map +1 -1
  467. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs +1 -1
  468. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs.map +1 -1
  469. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.d.ts +2 -1
  470. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js +91 -80
  471. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js.map +1 -1
  472. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs +1 -1
  473. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs.map +1 -1
  474. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js +1 -1
  475. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js.map +1 -1
  476. package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs +1 -1
  477. package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs.map +1 -1
  478. package/dist/components/features/conversation-panel/conversation-card/conversation-card.d.ts +7 -1
  479. package/dist/components/features/conversation-panel/conversation-card/conversation-card.js +87 -81
  480. package/dist/components/features/conversation-panel/conversation-card/conversation-card.js.map +1 -1
  481. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs +1 -1
  482. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs.map +1 -1
  483. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.d.ts +2 -1
  484. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js +1 -1
  485. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js.map +1 -1
  486. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs +1 -1
  487. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs.map +1 -1
  488. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.d.ts +2 -1
  489. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js +2 -1
  490. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js.map +1 -1
  491. package/dist/components/features/conversation-panel/conversation-layouts-menu.cjs +2 -0
  492. package/dist/components/features/conversation-panel/conversation-layouts-menu.cjs.map +1 -0
  493. package/dist/components/features/conversation-panel/conversation-layouts-menu.d.ts +29 -0
  494. package/dist/components/features/conversation-panel/conversation-layouts-menu.js +177 -0
  495. package/dist/components/features/conversation-panel/conversation-layouts-menu.js.map +1 -0
  496. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs +1 -1
  497. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs.map +1 -1
  498. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.d.ts +37 -0
  499. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js +85 -45
  500. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js.map +1 -1
  501. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  502. package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
  503. package/dist/components/features/conversation-panel/conversation-panel.js +296 -290
  504. package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
  505. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.cjs +2 -0
  506. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.cjs.map +1 -0
  507. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.d.ts +22 -0
  508. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.js +153 -0
  509. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.js.map +1 -0
  510. package/dist/components/features/conversation-panel/hide-older-conversations-row.cjs +2 -0
  511. package/dist/components/features/conversation-panel/hide-older-conversations-row.cjs.map +1 -0
  512. package/dist/components/features/conversation-panel/hide-older-conversations-row.d.ts +6 -0
  513. package/dist/components/features/conversation-panel/hide-older-conversations-row.js +65 -0
  514. package/dist/components/features/conversation-panel/hide-older-conversations-row.js.map +1 -0
  515. package/dist/components/features/conversation-panel/menu-row.cjs +1 -1
  516. package/dist/components/features/conversation-panel/menu-row.cjs.map +1 -1
  517. package/dist/components/features/conversation-panel/menu-row.d.ts +11 -1
  518. package/dist/components/features/conversation-panel/menu-row.js +27 -16
  519. package/dist/components/features/conversation-panel/menu-row.js.map +1 -1
  520. package/dist/components/features/conversation-panel/skills-modal.cjs +1 -1
  521. package/dist/components/features/conversation-panel/skills-modal.cjs.map +1 -1
  522. package/dist/components/features/conversation-panel/skills-modal.js +29 -28
  523. package/dist/components/features/conversation-panel/skills-modal.js.map +1 -1
  524. package/dist/components/features/files-tab/file-content-viewer.cjs +1 -1
  525. package/dist/components/features/files-tab/file-content-viewer.js +5 -5
  526. package/dist/components/features/home/featured-automations/automation-health-indicator.cjs +1 -1
  527. package/dist/components/features/home/featured-automations/automation-health-indicator.cjs.map +1 -1
  528. package/dist/components/features/home/featured-automations/automation-health-indicator.js +1 -1
  529. package/dist/components/features/home/featured-automations/automation-health-indicator.js.map +1 -1
  530. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.cjs +1 -1
  531. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.cjs.map +1 -1
  532. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.d.ts +4 -3
  533. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.js +22 -25
  534. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.js.map +1 -1
  535. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.cjs +1 -1
  536. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.cjs.map +1 -1
  537. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.d.ts +1 -1
  538. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.js +15 -15
  539. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.js.map +1 -1
  540. package/dist/components/features/home/featured-automations/automation-run-health.cjs +1 -1
  541. package/dist/components/features/home/featured-automations/automation-run-health.cjs.map +1 -1
  542. package/dist/components/features/home/featured-automations/automation-run-health.d.ts +5 -3
  543. package/dist/components/features/home/featured-automations/automation-run-health.js +30 -23
  544. package/dist/components/features/home/featured-automations/automation-run-health.js.map +1 -1
  545. package/dist/components/features/home/featured-automations/home-automation-activity.d.ts +3 -2
  546. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs +1 -1
  547. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs.map +1 -1
  548. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.d.ts +1 -1
  549. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js +59 -37
  550. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js.map +1 -1
  551. package/dist/components/features/manifest/manifest-form-field.d.ts +3 -1
  552. package/dist/components/features/manifest/manifest-review-step.d.ts +3 -1
  553. package/dist/components/features/onboarding/onboarding-host.d.ts +3 -4
  554. package/dist/components/features/onboarding/steps/setup-llm-step.d.ts +5 -9
  555. package/dist/components/features/settings/acp-auth-status-banner.d.ts +23 -6
  556. package/dist/components/features/settings/cloud-settings-link.cjs +1 -1
  557. package/dist/components/features/settings/cloud-settings-link.cjs.map +1 -1
  558. package/dist/components/features/settings/cloud-settings-link.js +5 -3
  559. package/dist/components/features/settings/cloud-settings-link.js.map +1 -1
  560. package/dist/components/features/settings/integrations-settings-link.cjs +1 -1
  561. package/dist/components/features/settings/integrations-settings-link.cjs.map +1 -1
  562. package/dist/components/features/settings/integrations-settings-link.d.ts +3 -1
  563. package/dist/components/features/settings/integrations-settings-link.js +20 -17
  564. package/dist/components/features/settings/integrations-settings-link.js.map +1 -1
  565. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.cjs +1 -1
  566. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.js +2 -1
  567. package/dist/components/features/settings/llm-profiles/profiles-body.d.ts +2 -2
  568. package/dist/components/features/settings/llm-profiles/provider-connection-modal.cjs +1 -1
  569. package/dist/components/features/settings/llm-profiles/provider-connection-modal.js +3 -0
  570. package/dist/components/features/settings/sdk-settings/field-help.cjs +1 -1
  571. package/dist/components/features/settings/sdk-settings/field-help.cjs.map +1 -1
  572. package/dist/components/features/settings/sdk-settings/field-help.d.ts +1 -1
  573. package/dist/components/features/settings/sdk-settings/field-help.js +1 -1
  574. package/dist/components/features/settings/sdk-settings/field-help.js.map +1 -1
  575. package/dist/components/features/settings/sdk-settings/sdk-section-page.cjs +1 -1
  576. package/dist/components/features/settings/sdk-settings/sdk-section-page.cjs.map +1 -1
  577. package/dist/components/features/settings/sdk-settings/sdk-section-page.d.ts +8 -7
  578. package/dist/components/features/settings/sdk-settings/sdk-section-page.js +172 -142
  579. package/dist/components/features/settings/sdk-settings/sdk-section-page.js.map +1 -1
  580. package/dist/components/features/settings/secrets-settings/secret-form.cjs +1 -1
  581. package/dist/components/features/settings/secrets-settings/secret-form.cjs.map +1 -1
  582. package/dist/components/features/settings/secrets-settings/secret-form.js +38 -25
  583. package/dist/components/features/settings/secrets-settings/secret-form.js.map +1 -1
  584. package/dist/components/features/settings/settings-dropdown-input.cjs +1 -1
  585. package/dist/components/features/settings/settings-dropdown-input.js +6 -6
  586. package/dist/components/features/sidebar/sidebar-nav-link.cjs +1 -1
  587. package/dist/components/features/sidebar/sidebar-nav-link.cjs.map +1 -1
  588. package/dist/components/features/sidebar/sidebar-nav-link.d.ts +10 -1
  589. package/dist/components/features/sidebar/sidebar-nav-link.js +54 -36
  590. package/dist/components/features/sidebar/sidebar-nav-link.js.map +1 -1
  591. package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
  592. package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
  593. package/dist/components/features/sidebar/sidebar-rail-body.d.ts +3 -1
  594. package/dist/components/features/sidebar/sidebar-rail-body.js +98 -58
  595. package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
  596. package/dist/components/features/sidebar/sidebar.cjs +1 -1
  597. package/dist/components/features/sidebar/sidebar.cjs.map +1 -1
  598. package/dist/components/features/sidebar/sidebar.js +44 -43
  599. package/dist/components/features/sidebar/sidebar.js.map +1 -1
  600. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.cjs +1 -1
  601. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.js +3 -3
  602. package/dist/components/features/skills/build-skill-pills.cjs +1 -1
  603. package/dist/components/features/skills/build-skill-pills.cjs.map +1 -1
  604. package/dist/components/features/skills/build-skill-pills.js +60 -52
  605. package/dist/components/features/skills/build-skill-pills.js.map +1 -1
  606. package/dist/components/features/skills/extensions-navigation.cjs +1 -1
  607. package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
  608. package/dist/components/features/skills/extensions-navigation.js +54 -43
  609. package/dist/components/features/skills/extensions-navigation.js.map +1 -1
  610. package/dist/components/features/skills/skill-filter.cjs +1 -1
  611. package/dist/components/features/skills/skill-filter.cjs.map +1 -1
  612. package/dist/components/features/skills/skill-filter.d.ts +8 -3
  613. package/dist/components/features/skills/skill-filter.js +69 -52
  614. package/dist/components/features/skills/skill-filter.js.map +1 -1
  615. package/dist/components/shared/buttons/styled-tooltip.cjs +1 -1
  616. package/dist/components/shared/buttons/styled-tooltip.cjs.map +1 -1
  617. package/dist/components/shared/buttons/styled-tooltip.d.ts +2 -1
  618. package/dist/components/shared/buttons/styled-tooltip.js +2 -1
  619. package/dist/components/shared/buttons/styled-tooltip.js.map +1 -1
  620. package/dist/components/shared/filters/enum-filter-dropdown.cjs +1 -1
  621. package/dist/components/shared/filters/enum-filter-dropdown.cjs.map +1 -1
  622. package/dist/components/shared/filters/enum-filter-dropdown.d.ts +5 -1
  623. package/dist/components/shared/filters/enum-filter-dropdown.js +14 -14
  624. package/dist/components/shared/filters/enum-filter-dropdown.js.map +1 -1
  625. package/dist/components/shared/modals/confirmation-modal.cjs +1 -1
  626. package/dist/components/shared/modals/confirmation-modal.cjs.map +1 -1
  627. package/dist/components/shared/modals/confirmation-modal.d.ts +2 -1
  628. package/dist/components/shared/modals/confirmation-modal.js +8 -8
  629. package/dist/components/shared/modals/confirmation-modal.js.map +1 -1
  630. package/dist/components/shared/modals/settings/model-selector.cjs +1 -1
  631. package/dist/components/shared/modals/settings/model-selector.js +27 -27
  632. package/dist/components/shared/modals/settings/settings-form.cjs +1 -1
  633. package/dist/components/shared/modals/settings/settings-form.js +8 -8
  634. package/dist/config/defaults.cjs +1 -1
  635. package/dist/config/defaults.cjs.map +1 -1
  636. package/dist/config/defaults.js +9 -5
  637. package/dist/config/defaults.js.map +1 -1
  638. package/dist/constants/settings-nav.d.ts +8 -0
  639. package/dist/contexts/conversation-websocket-context.cjs +3 -3
  640. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  641. package/dist/contexts/conversation-websocket-context.d.ts +5 -0
  642. package/dist/contexts/conversation-websocket-context.js +194 -198
  643. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  644. package/dist/contexts/websocket-provider-wrapper.cjs +1 -1
  645. package/dist/contexts/websocket-provider-wrapper.cjs.map +1 -1
  646. package/dist/contexts/websocket-provider-wrapper.js +31 -15
  647. package/dist/contexts/websocket-provider-wrapper.js.map +1 -1
  648. package/dist/extensions/canvas-extension-module-loader.d.ts +11 -0
  649. package/dist/hooks/chat/record-model-switch-message.cjs +1 -1
  650. package/dist/hooks/chat/record-model-switch-message.cjs.map +1 -1
  651. package/dist/hooks/chat/record-model-switch-message.d.ts +31 -0
  652. package/dist/hooks/chat/record-model-switch-message.js +25 -12
  653. package/dist/hooks/chat/record-model-switch-message.js.map +1 -1
  654. package/dist/hooks/chat/use-plan-mode-interceptor.cjs +2 -0
  655. package/dist/hooks/chat/use-plan-mode-interceptor.cjs.map +1 -0
  656. package/dist/hooks/chat/use-plan-mode-interceptor.d.ts +16 -0
  657. package/dist/hooks/chat/use-plan-mode-interceptor.js +43 -0
  658. package/dist/hooks/chat/use-plan-mode-interceptor.js.map +1 -0
  659. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  660. package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
  661. package/dist/hooks/mutation/use-create-conversation.js +5 -1
  662. package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
  663. package/dist/hooks/mutation/use-manage-canvas-extensions.d.ts +12 -0
  664. package/dist/hooks/mutation/use-read-conversation-file.cjs +1 -1
  665. package/dist/hooks/mutation/use-read-conversation-file.cjs.map +1 -1
  666. package/dist/hooks/mutation/use-read-conversation-file.js +11 -4
  667. package/dist/hooks/mutation/use-read-conversation-file.js.map +1 -1
  668. package/dist/hooks/mutation/use-save-settings.cjs +1 -1
  669. package/dist/hooks/mutation/use-save-settings.js +3 -3
  670. package/dist/hooks/mutation/use-switch-llm-profile.cjs +1 -1
  671. package/dist/hooks/mutation/use-switch-llm-profile.cjs.map +1 -1
  672. package/dist/hooks/mutation/use-switch-llm-profile.js +13 -25
  673. package/dist/hooks/mutation/use-switch-llm-profile.js.map +1 -1
  674. package/dist/hooks/mutation/use-update-conversation-tags.cjs +2 -0
  675. package/dist/hooks/mutation/use-update-conversation-tags.cjs.map +1 -0
  676. package/dist/hooks/mutation/use-update-conversation-tags.d.ts +8 -0
  677. package/dist/hooks/mutation/use-update-conversation-tags.js +45 -0
  678. package/dist/hooks/mutation/use-update-conversation-tags.js.map +1 -0
  679. package/dist/hooks/query/concurrency-limiter.cjs +2 -0
  680. package/dist/hooks/query/concurrency-limiter.cjs.map +1 -0
  681. package/dist/hooks/query/concurrency-limiter.d.ts +22 -0
  682. package/dist/hooks/query/concurrency-limiter.js +29 -0
  683. package/dist/hooks/query/concurrency-limiter.js.map +1 -0
  684. package/dist/hooks/query/query-keys.cjs +1 -1
  685. package/dist/hooks/query/query-keys.cjs.map +1 -1
  686. package/dist/hooks/query/query-keys.d.ts +10 -0
  687. package/dist/hooks/query/query-keys.js +2 -2
  688. package/dist/hooks/query/query-keys.js.map +1 -1
  689. package/dist/hooks/query/use-active-conversation.cjs +1 -1
  690. package/dist/hooks/query/use-active-conversation.js +4 -4
  691. package/dist/hooks/query/use-automation-sdk-version.cjs +1 -1
  692. package/dist/hooks/query/use-automation-sdk-version.cjs.map +1 -1
  693. package/dist/hooks/query/use-automation-sdk-version.d.ts +0 -1
  694. package/dist/hooks/query/use-automation-sdk-version.js +30 -55
  695. package/dist/hooks/query/use-automation-sdk-version.js.map +1 -1
  696. package/dist/hooks/query/use-automations.cjs.map +1 -1
  697. package/dist/hooks/query/use-automations.js.map +1 -1
  698. package/dist/hooks/query/use-backends-health.cjs +1 -1
  699. package/dist/hooks/query/use-backends-health.cjs.map +1 -1
  700. package/dist/hooks/query/use-backends-health.d.ts +1 -1
  701. package/dist/hooks/query/use-backends-health.js +50 -64
  702. package/dist/hooks/query/use-backends-health.js.map +1 -1
  703. package/dist/hooks/query/use-canvas-extensions.cjs +1 -0
  704. package/dist/hooks/query/use-canvas-extensions.d.ts +5 -0
  705. package/dist/hooks/query/use-canvas-extensions.js +3 -0
  706. package/dist/hooks/query/use-commit-changes.cjs +1 -1
  707. package/dist/hooks/query/use-commit-changes.js +4 -4
  708. package/dist/hooks/query/use-conversation-skills.cjs +1 -1
  709. package/dist/hooks/query/use-conversation-skills.cjs.map +1 -1
  710. package/dist/hooks/query/use-conversation-skills.d.ts +14 -5
  711. package/dist/hooks/query/use-conversation-skills.js +20 -4
  712. package/dist/hooks/query/use-conversation-skills.js.map +1 -1
  713. package/dist/hooks/query/use-latest-automation-runs.cjs +1 -1
  714. package/dist/hooks/query/use-latest-automation-runs.js +1 -0
  715. package/dist/hooks/query/use-paginated-conversations.cjs +1 -1
  716. package/dist/hooks/query/use-paginated-conversations.cjs.map +1 -1
  717. package/dist/hooks/query/use-paginated-conversations.js +19 -16
  718. package/dist/hooks/query/use-paginated-conversations.js.map +1 -1
  719. package/dist/hooks/query/use-provider-connections.cjs +1 -1
  720. package/dist/hooks/query/use-provider-connections.cjs.map +1 -1
  721. package/dist/hooks/query/use-provider-connections.d.ts +6 -3
  722. package/dist/hooks/query/use-provider-connections.js +7 -3
  723. package/dist/hooks/query/use-provider-connections.js.map +1 -1
  724. package/dist/hooks/query/use-search-providers.cjs +1 -1
  725. package/dist/hooks/query/use-search-providers.cjs.map +1 -1
  726. package/dist/hooks/query/use-search-providers.js +17 -10
  727. package/dist/hooks/query/use-search-providers.js.map +1 -1
  728. package/dist/hooks/query/use-sub-conversations.cjs +1 -1
  729. package/dist/hooks/query/use-sub-conversations.cjs.map +1 -1
  730. package/dist/hooks/query/use-sub-conversations.js +16 -16
  731. package/dist/hooks/query/use-sub-conversations.js.map +1 -1
  732. package/dist/hooks/query/use-unified-get-git-changes.cjs +1 -1
  733. package/dist/hooks/query/use-unified-get-git-changes.js +4 -4
  734. package/dist/hooks/query/use-unified-git-commits.cjs +1 -1
  735. package/dist/hooks/query/use-unified-git-commits.js +4 -4
  736. package/dist/hooks/query/use-unified-git-diff.cjs +1 -1
  737. package/dist/hooks/query/use-unified-git-diff.js +4 -4
  738. package/dist/hooks/query/use-unified-vscode-url.cjs +1 -1
  739. package/dist/hooks/query/use-unified-vscode-url.cjs.map +1 -1
  740. package/dist/hooks/query/use-unified-vscode-url.d.ts +1 -0
  741. package/dist/hooks/query/use-unified-vscode-url.js +40 -26
  742. package/dist/hooks/query/use-unified-vscode-url.js.map +1 -1
  743. package/dist/hooks/query/use-workspace-file-content.cjs +1 -1
  744. package/dist/hooks/query/use-workspace-file-content.js +5 -5
  745. package/dist/hooks/query/use-workspace-files.cjs +1 -1
  746. package/dist/hooks/query/use-workspace-files.js +6 -6
  747. package/dist/hooks/use-acp-credential-form.d.ts +6 -0
  748. package/dist/hooks/use-acp-model-context.cjs +1 -1
  749. package/dist/hooks/use-acp-model-context.js +3 -3
  750. package/dist/hooks/use-agent-state.cjs +1 -1
  751. package/dist/hooks/use-agent-state.cjs.map +1 -1
  752. package/dist/hooks/use-agent-state.d.ts +17 -1
  753. package/dist/hooks/use-agent-state.js +19 -9
  754. package/dist/hooks/use-agent-state.js.map +1 -1
  755. package/dist/hooks/use-automation-permissions.cjs +2 -0
  756. package/dist/hooks/use-automation-permissions.cjs.map +1 -0
  757. package/dist/hooks/use-automation-permissions.d.ts +43 -0
  758. package/dist/hooks/use-automation-permissions.js +52 -0
  759. package/dist/hooks/use-automation-permissions.js.map +1 -0
  760. package/dist/hooks/use-chat-input-model-state.cjs +1 -1
  761. package/dist/hooks/use-chat-input-model-state.js +3 -3
  762. package/dist/hooks/use-conversation-overview-git-diff-stats.cjs +1 -1
  763. package/dist/hooks/use-conversation-overview-git-diff-stats.js +4 -4
  764. package/dist/hooks/use-handle-plan-click.cjs +1 -1
  765. package/dist/hooks/use-handle-plan-click.cjs.map +1 -1
  766. package/dist/hooks/use-handle-plan-click.d.ts +3 -1
  767. package/dist/hooks/use-handle-plan-click.js +85 -26
  768. package/dist/hooks/use-handle-plan-click.js.map +1 -1
  769. package/dist/hooks/use-home-automation-actions.cjs +1 -1
  770. package/dist/hooks/use-home-automation-actions.cjs.map +1 -1
  771. package/dist/hooks/use-home-automation-actions.js +1 -0
  772. package/dist/hooks/use-home-automation-actions.js.map +1 -1
  773. package/dist/hooks/use-llm-configured.cjs +1 -1
  774. package/dist/hooks/use-llm-configured.js +3 -3
  775. package/dist/hooks/use-manifest-preflight.d.ts +1 -1
  776. package/dist/hooks/use-pinned-home-route.cjs +2 -0
  777. package/dist/hooks/use-pinned-home-route.cjs.map +1 -0
  778. package/dist/hooks/use-pinned-home-route.d.ts +33 -0
  779. package/dist/hooks/use-pinned-home-route.js +34 -0
  780. package/dist/hooks/use-pinned-home-route.js.map +1 -0
  781. package/dist/hooks/use-skill-enablement.cjs +2 -0
  782. package/dist/hooks/use-skill-enablement.cjs.map +1 -0
  783. package/dist/hooks/use-skill-enablement.d.ts +14 -0
  784. package/dist/hooks/use-skill-enablement.js +80 -0
  785. package/dist/hooks/use-skill-enablement.js.map +1 -0
  786. package/dist/hooks/use-unified-websocket-status.cjs +1 -1
  787. package/dist/hooks/use-unified-websocket-status.cjs.map +1 -1
  788. package/dist/hooks/use-unified-websocket-status.d.ts +7 -0
  789. package/dist/hooks/use-unified-websocket-status.js +5 -1
  790. package/dist/hooks/use-unified-websocket-status.js.map +1 -1
  791. package/dist/i18n/declaration.cjs +1 -1
  792. package/dist/i18n/declaration.cjs.map +1 -1
  793. package/dist/i18n/declaration.d.ts +83 -14
  794. package/dist/i18n/declaration.js +1 -1
  795. package/dist/i18n/declaration.js.map +1 -1
  796. package/dist/i18n/translation.cjs +3 -3
  797. package/dist/i18n/translation.cjs.map +1 -1
  798. package/dist/i18n/translation.js +1575 -402
  799. package/dist/i18n/translation.js.map +1 -1
  800. package/dist/index.cjs +1 -1
  801. package/dist/index.js +15 -14
  802. package/dist/lib/index.cjs +1 -1
  803. package/dist/lib/index.d.ts +1 -0
  804. package/dist/lib/index.js +1 -0
  805. package/dist/locales/ar/openhands.json +94 -25
  806. package/dist/locales/ca/openhands.json +94 -25
  807. package/dist/locales/de/openhands.json +94 -25
  808. package/dist/locales/en/openhands.json +94 -25
  809. package/dist/locales/es/openhands.json +94 -25
  810. package/dist/locales/fr/openhands.json +94 -25
  811. package/dist/locales/it/openhands.json +94 -25
  812. package/dist/locales/ja/openhands.json +94 -25
  813. package/dist/locales/ko-KR/openhands.json +94 -25
  814. package/dist/locales/no/openhands.json +94 -25
  815. package/dist/locales/pt/openhands.json +94 -25
  816. package/dist/locales/tr/openhands.json +94 -25
  817. package/dist/locales/uk/openhands.json +94 -25
  818. package/dist/locales/zh-CN/openhands.json +94 -25
  819. package/dist/locales/zh-TW/openhands.json +94 -25
  820. package/dist/manifests/automation-insights.cjs.map +1 -1
  821. package/dist/manifests/automation-insights.d.ts +10 -2
  822. package/dist/manifests/automation-insights.js.map +1 -1
  823. package/dist/manifests/automation-interface.cjs +1 -1
  824. package/dist/manifests/automation-interface.cjs.map +1 -1
  825. package/dist/manifests/automation-interface.d.ts +6 -0
  826. package/dist/manifests/automation-interface.js +11 -8
  827. package/dist/manifests/automation-interface.js.map +1 -1
  828. package/dist/manifests/automation-setup.cjs +1 -1
  829. package/dist/manifests/automation-setup.cjs.map +1 -1
  830. package/dist/manifests/automation-setup.d.ts +9 -16
  831. package/dist/manifests/automation-setup.js +17 -7
  832. package/dist/manifests/automation-setup.js.map +1 -1
  833. package/dist/manifests/manifest-actions.d.ts +1 -1
  834. package/dist/manifests/manifest-capabilities.d.ts +3 -1
  835. package/dist/manifests/manifest-local-validation.cjs +2 -0
  836. package/dist/manifests/manifest-local-validation.cjs.map +1 -0
  837. package/dist/manifests/manifest-local-validation.d.ts +15 -11
  838. package/dist/manifests/manifest-local-validation.js +8 -0
  839. package/dist/manifests/manifest-local-validation.js.map +1 -0
  840. package/dist/manifests/manifest-template.cjs +2 -0
  841. package/dist/manifests/manifest-template.cjs.map +1 -0
  842. package/dist/manifests/manifest-template.d.ts +4 -4
  843. package/dist/manifests/manifest-template.js +12 -0
  844. package/dist/manifests/manifest-template.js.map +1 -0
  845. package/dist/manifests/manifest-validation.cjs +1 -1
  846. package/dist/manifests/manifest-validation.cjs.map +1 -1
  847. package/dist/manifests/manifest-validation.js +106 -28
  848. package/dist/manifests/manifest-validation.js.map +1 -1
  849. package/dist/manifests/types.cjs.map +1 -1
  850. package/dist/manifests/types.d.ts +39 -4
  851. package/dist/manifests/types.js.map +1 -1
  852. package/dist/node_modules/@openhands/extensions/automations/bundle-index.cjs +45 -4
  853. package/dist/node_modules/@openhands/extensions/automations/bundle-index.cjs.map +1 -1
  854. package/dist/node_modules/@openhands/extensions/automations/bundle-index.js +1 -1
  855. package/dist/node_modules/@openhands/extensions/automations/bundle-index.js.map +1 -1
  856. package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.cjs +8 -0
  857. package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.cjs.map +1 -0
  858. package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.js +221 -0
  859. package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.js.map +1 -0
  860. package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.cjs +1 -1
  861. package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.cjs.map +1 -1
  862. package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.js +5 -0
  863. package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.js.map +1 -1
  864. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs +2 -2
  865. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs.map +1 -1
  866. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js +6 -1
  867. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js.map +1 -1
  868. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs +2 -2
  869. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs.map +1 -1
  870. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js +6 -1
  871. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js.map +1 -1
  872. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.cjs +1 -1
  873. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.cjs.map +1 -1
  874. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.js +5 -0
  875. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.js.map +1 -1
  876. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-bitbucket-pr/manifest.cjs +9 -0
  877. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-bitbucket-pr/manifest.cjs.map +1 -0
  878. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-bitbucket-pr/manifest.js +21 -0
  879. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-bitbucket-pr/manifest.js.map +1 -0
  880. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-gitlab-mr/manifest.cjs +9 -0
  881. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-gitlab-mr/manifest.cjs.map +1 -0
  882. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-gitlab-mr/manifest.js +21 -0
  883. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-gitlab-mr/manifest.js.map +1 -0
  884. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-bitbucket-pr/manifest.cjs +9 -0
  885. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-bitbucket-pr/manifest.cjs.map +1 -0
  886. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-bitbucket-pr/manifest.js +21 -0
  887. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-bitbucket-pr/manifest.js.map +1 -0
  888. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-github-pr/manifest.cjs +9 -0
  889. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-github-pr/manifest.cjs.map +1 -0
  890. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-github-pr/manifest.js +21 -0
  891. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-github-pr/manifest.js.map +1 -0
  892. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-gitlab-mr/manifest.cjs +9 -0
  893. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-gitlab-mr/manifest.cjs.map +1 -0
  894. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-gitlab-mr/manifest.js +21 -0
  895. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-gitlab-mr/manifest.js.map +1 -0
  896. package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.cjs +1 -1
  897. package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.cjs.map +1 -1
  898. package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.js +5 -0
  899. package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.js.map +1 -1
  900. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.cjs +30 -0
  901. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.cjs.map +1 -0
  902. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.js +65 -0
  903. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.js.map +1 -0
  904. package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs +1 -1
  905. package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs.map +1 -1
  906. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js +28 -14
  907. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js.map +1 -1
  908. package/dist/node_modules/@openhands/extensions/automations/interface.cjs +1 -1
  909. package/dist/node_modules/@openhands/extensions/automations/interface.cjs.map +1 -1
  910. package/dist/node_modules/@openhands/extensions/automations/interface.js +2 -1
  911. package/dist/node_modules/@openhands/extensions/automations/interface.js.map +1 -1
  912. package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.cjs +1 -1
  913. package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.cjs.map +1 -1
  914. package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.js +2 -2
  915. package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.js.map +1 -1
  916. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs +2 -0
  917. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs.map +1 -0
  918. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js +59 -0
  919. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js.map +1 -0
  920. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.cjs +1 -1
  921. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.cjs.map +1 -1
  922. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.js +1 -1
  923. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.js.map +1 -1
  924. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs +1 -1
  925. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs.map +1 -1
  926. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js +74 -72
  927. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js.map +1 -1
  928. package/dist/node_modules/@openhands/extensions/skills/index.cjs +42 -3
  929. package/dist/node_modules/@openhands/extensions/skills/index.cjs.map +1 -1
  930. package/dist/node_modules/@openhands/extensions/skills/index.js +22 -3
  931. package/dist/node_modules/@openhands/extensions/skills/index.js.map +1 -1
  932. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-conversation.cjs +1 -1
  933. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-conversation.js +1 -1
  934. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.cjs +1 -1
  935. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.cjs.map +1 -1
  936. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.js +8 -7
  937. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.js.map +1 -1
  938. package/dist/node_modules/@openhands/typescript-client/dist/index.cjs +1 -1
  939. package/dist/node_modules/@openhands/typescript-client/dist/index.js +2 -2
  940. package/dist/node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs +1 -1
  941. package/dist/node_modules/@tanstack/react-query/build/modern/QueryClientProvider.js +1 -1
  942. package/dist/node_modules/lucide-react/dist/esm/icons/blocks.cjs +2 -0
  943. package/dist/node_modules/lucide-react/dist/esm/icons/blocks.cjs.map +1 -0
  944. package/dist/node_modules/lucide-react/dist/esm/icons/blocks.js +16 -0
  945. package/dist/node_modules/lucide-react/dist/esm/icons/blocks.js.map +1 -0
  946. package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.cjs +2 -0
  947. package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.cjs.map +1 -0
  948. package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.js +21 -0
  949. package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.js.map +1 -0
  950. package/dist/node_modules/lucide-react/dist/esm/icons/panels-top-left.cjs +2 -0
  951. package/dist/node_modules/lucide-react/dist/esm/icons/panels-top-left.cjs.map +1 -0
  952. package/dist/node_modules/lucide-react/dist/esm/icons/panels-top-left.js +23 -0
  953. package/dist/node_modules/lucide-react/dist/esm/icons/panels-top-left.js.map +1 -0
  954. package/dist/node_modules/lucide-react/dist/esm/icons/shrink.cjs +2 -0
  955. package/dist/node_modules/lucide-react/dist/esm/icons/shrink.cjs.map +1 -0
  956. package/dist/node_modules/lucide-react/dist/esm/icons/shrink.js +23 -0
  957. package/dist/node_modules/lucide-react/dist/esm/icons/shrink.js.map +1 -0
  958. package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.cjs +2 -0
  959. package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.cjs.map +1 -0
  960. package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.js +43 -0
  961. package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.js.map +1 -0
  962. package/dist/node_modules/lucide-react/dist/esm/icons/tags.cjs +2 -0
  963. package/dist/node_modules/lucide-react/dist/esm/icons/tags.cjs.map +1 -0
  964. package/dist/node_modules/lucide-react/dist/esm/icons/tags.js +22 -0
  965. package/dist/node_modules/lucide-react/dist/esm/icons/tags.js.map +1 -0
  966. package/dist/package.cjs +1 -1
  967. package/dist/package.cjs.map +1 -1
  968. package/dist/package.js +5 -5
  969. package/dist/package.js.map +1 -1
  970. package/dist/routes/agent-settings.d.ts +12 -0
  971. package/dist/routes/app-settings.cjs +1 -1
  972. package/dist/routes/app-settings.cjs.map +1 -1
  973. package/dist/routes/app-settings.js +11 -11
  974. package/dist/routes/files-tab.cjs +1 -1
  975. package/dist/routes/files-tab.cjs.map +1 -1
  976. package/dist/routes/files-tab.js +14 -14
  977. package/dist/routes/files-tab.js.map +1 -1
  978. package/dist/routes/llm-settings.cjs +1 -1
  979. package/dist/routes/llm-settings.cjs.map +1 -1
  980. package/dist/routes/llm-settings.d.ts +3 -1
  981. package/dist/routes/llm-settings.js +100 -91
  982. package/dist/routes/llm-settings.js.map +1 -1
  983. package/dist/routes/planner-tab.cjs +1 -1
  984. package/dist/routes/planner-tab.cjs.map +1 -1
  985. package/dist/routes/planner-tab.js +44 -28
  986. package/dist/routes/planner-tab.js.map +1 -1
  987. package/dist/services/canvas-ui.cjs +1 -1
  988. package/dist/services/canvas-ui.cjs.map +1 -1
  989. package/dist/services/canvas-ui.d.ts +5 -0
  990. package/dist/services/canvas-ui.js +24 -10
  991. package/dist/services/canvas-ui.js.map +1 -1
  992. package/dist/services/settings.cjs +1 -1
  993. package/dist/services/settings.cjs.map +1 -1
  994. package/dist/services/settings.js +3 -2
  995. package/dist/services/settings.js.map +1 -1
  996. package/dist/services/telemetry.cjs +1 -1
  997. package/dist/services/telemetry.cjs.map +1 -1
  998. package/dist/services/telemetry.d.ts +5 -0
  999. package/dist/services/telemetry.js +122 -115
  1000. package/dist/services/telemetry.js.map +1 -1
  1001. package/dist/stores/conversation-panel-preferences-store.cjs +1 -1
  1002. package/dist/stores/conversation-panel-preferences-store.cjs.map +1 -1
  1003. package/dist/stores/conversation-panel-preferences-store.d.ts +32 -5
  1004. package/dist/stores/conversation-panel-preferences-store.js +29 -12
  1005. package/dist/stores/conversation-panel-preferences-store.js.map +1 -1
  1006. package/dist/stores/conversation-state-store.cjs +1 -1
  1007. package/dist/stores/conversation-state-store.cjs.map +1 -1
  1008. package/dist/stores/conversation-state-store.d.ts +9 -3
  1009. package/dist/stores/conversation-state-store.js +6 -3
  1010. package/dist/stores/conversation-state-store.js.map +1 -1
  1011. package/dist/stores/conversation-store.cjs +1 -1
  1012. package/dist/stores/conversation-store.cjs.map +1 -1
  1013. package/dist/stores/conversation-store.d.ts +2 -0
  1014. package/dist/stores/conversation-store.js +3 -0
  1015. package/dist/stores/conversation-store.js.map +1 -1
  1016. package/dist/stores/model-store.cjs +1 -1
  1017. package/dist/stores/model-store.cjs.map +1 -1
  1018. package/dist/stores/model-store.d.ts +7 -0
  1019. package/dist/stores/model-store.js +4 -0
  1020. package/dist/stores/model-store.js.map +1 -1
  1021. package/dist/types/automation.cjs.map +1 -1
  1022. package/dist/types/automation.d.ts +66 -1
  1023. package/dist/types/automation.js.map +1 -1
  1024. package/dist/types/canvas-extension.cjs +2 -0
  1025. package/dist/types/canvas-extension.cjs.map +1 -0
  1026. package/dist/types/canvas-extension.d.ts +77 -0
  1027. package/dist/types/canvas-extension.js +6 -0
  1028. package/dist/types/canvas-extension.js.map +1 -0
  1029. package/dist/types/settings.d.ts +7 -0
  1030. package/dist/ui/context-menu.d.ts +1 -1
  1031. package/dist/ui/help-link.cjs +1 -1
  1032. package/dist/ui/help-link.cjs.map +1 -1
  1033. package/dist/ui/help-link.d.ts +6 -1
  1034. package/dist/ui/help-link.js +32 -18
  1035. package/dist/ui/help-link.js.map +1 -1
  1036. package/dist/ui/toggle-switch.cjs +1 -1
  1037. package/dist/ui/toggle-switch.cjs.map +1 -1
  1038. package/dist/ui/toggle-switch.d.ts +4 -1
  1039. package/dist/ui/toggle-switch.js +4 -3
  1040. package/dist/ui/toggle-switch.js.map +1 -1
  1041. package/dist/utils/acp-auth-display.d.ts +35 -0
  1042. package/dist/utils/automation-catalog.cjs +1 -1
  1043. package/dist/utils/automation-catalog.cjs.map +1 -1
  1044. package/dist/utils/automation-catalog.d.ts +12 -1
  1045. package/dist/utils/automation-catalog.js +42 -12
  1046. package/dist/utils/automation-catalog.js.map +1 -1
  1047. package/dist/utils/automation-run-display.cjs +2 -0
  1048. package/dist/utils/automation-run-display.cjs.map +1 -0
  1049. package/dist/utils/automation-run-display.d.ts +20 -0
  1050. package/dist/utils/automation-run-display.js +85 -0
  1051. package/dist/utils/automation-run-display.js.map +1 -0
  1052. package/dist/utils/automation-schedule.cjs +1 -1
  1053. package/dist/utils/automation-schedule.cjs.map +1 -1
  1054. package/dist/utils/automation-schedule.d.ts +16 -0
  1055. package/dist/utils/automation-schedule.js +2 -0
  1056. package/dist/utils/automation-schedule.js.map +1 -1
  1057. package/dist/utils/cache-utils.cjs +1 -1
  1058. package/dist/utils/cache-utils.js +5 -5
  1059. package/dist/utils/constants.cjs +1 -1
  1060. package/dist/utils/constants.cjs.map +1 -1
  1061. package/dist/utils/constants.d.ts +4 -0
  1062. package/dist/utils/constants.js +23 -3
  1063. package/dist/utils/constants.js.map +1 -1
  1064. package/dist/utils/format-event-timestamp.cjs +2 -0
  1065. package/dist/utils/format-event-timestamp.cjs.map +1 -0
  1066. package/dist/utils/format-event-timestamp.d.ts +1 -0
  1067. package/dist/utils/format-event-timestamp.js +13 -0
  1068. package/dist/utils/format-event-timestamp.js.map +1 -0
  1069. package/dist/utils/format-model-name.cjs +1 -1
  1070. package/dist/utils/format-model-name.cjs.map +1 -1
  1071. package/dist/utils/format-model-name.d.ts +7 -3
  1072. package/dist/utils/format-model-name.js +6 -11
  1073. package/dist/utils/format-model-name.js.map +1 -1
  1074. package/dist/utils/format-relative-time.cjs +1 -1
  1075. package/dist/utils/format-relative-time.cjs.map +1 -1
  1076. package/dist/utils/format-relative-time.d.ts +7 -0
  1077. package/dist/utils/format-relative-time.js +7 -2
  1078. package/dist/utils/format-relative-time.js.map +1 -1
  1079. package/dist/utils/git-diff-stats.cjs +2 -2
  1080. package/dist/utils/git-diff-stats.cjs.map +1 -1
  1081. package/dist/utils/git-diff-stats.d.ts +4 -0
  1082. package/dist/utils/git-diff-stats.js +12 -2
  1083. package/dist/utils/git-diff-stats.js.map +1 -1
  1084. package/dist/utils/path-utils.cjs +1 -1
  1085. package/dist/utils/path-utils.cjs.map +1 -1
  1086. package/dist/utils/path-utils.d.ts +15 -3
  1087. package/dist/utils/path-utils.js +29 -3
  1088. package/dist/utils/path-utils.js.map +1 -1
  1089. package/dist/utils/plan-file.cjs +4 -0
  1090. package/dist/utils/plan-file.cjs.map +1 -0
  1091. package/dist/utils/plan-file.d.ts +18 -0
  1092. package/dist/utils/plan-file.js +58 -0
  1093. package/dist/utils/plan-file.js.map +1 -0
  1094. package/dist/utils/recommended-automation-rail.cjs +1 -1
  1095. package/dist/utils/recommended-automation-rail.cjs.map +1 -1
  1096. package/dist/utils/recommended-automation-rail.js +1 -0
  1097. package/dist/utils/recommended-automation-rail.js.map +1 -1
  1098. package/dist/utils/scroll-fade-state.cjs +1 -1
  1099. package/dist/utils/scroll-fade-state.cjs.map +1 -1
  1100. package/dist/utils/scroll-fade-state.d.ts +6 -0
  1101. package/dist/utils/scroll-fade-state.js +8 -1
  1102. package/dist/utils/scroll-fade-state.js.map +1 -1
  1103. package/dist/utils/sdk-settings-schema.cjs +1 -1
  1104. package/dist/utils/sdk-settings-schema.cjs.map +1 -1
  1105. package/dist/utils/sdk-settings-schema.d.ts +1 -0
  1106. package/dist/utils/sdk-settings-schema.js +25 -22
  1107. package/dist/utils/sdk-settings-schema.js.map +1 -1
  1108. package/dist/utils/skill-enablement.cjs +2 -0
  1109. package/dist/utils/skill-enablement.cjs.map +1 -0
  1110. package/dist/utils/skill-enablement.d.ts +51 -0
  1111. package/dist/utils/skill-enablement.js +31 -0
  1112. package/dist/utils/skill-enablement.js.map +1 -0
  1113. package/dist/utils/utils.cjs +1 -1
  1114. package/dist/utils/utils.cjs.map +1 -1
  1115. package/dist/utils/utils.js +11 -11
  1116. package/dist/utils/utils.js.map +1 -1
  1117. package/dist/utils/vscode-origin.cjs +2 -0
  1118. package/dist/utils/vscode-origin.cjs.map +1 -0
  1119. package/dist/utils/vscode-origin.d.ts +55 -0
  1120. package/dist/utils/vscode-origin.js +27 -0
  1121. package/dist/utils/vscode-origin.js.map +1 -0
  1122. package/dist/utils/workspace-mode.d.ts +4 -0
  1123. package/package.json +5 -5
  1124. package/scripts/check-sdk-version-sync.mjs +6 -6
  1125. package/scripts/check-translation-completeness.cjs +1 -0
  1126. package/scripts/dev-extra-backend.mjs +28 -9
  1127. package/scripts/dev-safe.mjs +81 -8
  1128. package/scripts/dev-static.mjs +35 -37
  1129. package/scripts/dev-with-automation.mjs +83 -2
  1130. package/scripts/ingress.mjs +27 -1
  1131. package/scripts/static-server.mjs +107 -2
  1132. package/tools/canvas_ui_tool.py +19 -0
  1133. package/build/assets/active-backend-context-DKFSMbn3.js +0 -2
  1134. package/build/assets/agent-profiles-settings-D4cY5U2T.js +0 -1
  1135. package/build/assets/agent-server-conversation-service.api-DozDKIW_.js +0 -86
  1136. package/build/assets/agent-settings-351vXWc9.js +0 -2
  1137. package/build/assets/agent-settings-Ce7BDZ6I.js +0 -1
  1138. package/build/assets/alert-banner-Kyy1YWZU.js +0 -1
  1139. package/build/assets/api-key-entry-screen-INIxqAMs.js +0 -1
  1140. package/build/assets/automation-detail-DXDhUwPq.js +0 -3
  1141. package/build/assets/automation-git-sync-CzyS4cn1.js +0 -1
  1142. package/build/assets/automation-setup-route-FRr05f_g.js +0 -1
  1143. package/build/assets/automations-list-CERuQWE6.js +0 -1
  1144. package/build/assets/backend-form-modal-DK78-jn1.js +0 -1
  1145. package/build/assets/bot-C-0Wu7vQ.js +0 -1
  1146. package/build/assets/browser-11etCQ04.js +0 -7
  1147. package/build/assets/check-Cf2YoT90.js +0 -1
  1148. package/build/assets/chevron-down-C3OQ-ehx.js +0 -1
  1149. package/build/assets/chevron-right-CN1uUiJ1.js +0 -1
  1150. package/build/assets/circle-check-g5yeGMd-.js +0 -1
  1151. package/build/assets/command-menu-BZQ8S3Ke.js +0 -1
  1152. package/build/assets/commits-tab-DZtJgaDM.js +0 -1
  1153. package/build/assets/confirmation-modal-Bk4JRcCM.js +0 -1
  1154. package/build/assets/conversation-CchMzpGl.js +0 -1
  1155. package/build/assets/conversation-Dpzftz57.js +0 -93
  1156. package/build/assets/conversation-panel-CchMzpGl.js +0 -1
  1157. package/build/assets/conversation-state-store-a9d2fxRc.js +0 -1
  1158. package/build/assets/edit-automation-modal-D-urtv8n.js +0 -1
  1159. package/build/assets/empty-state-CvaVahVr.js +0 -1
  1160. package/build/assets/enum-filter-dropdown-DliX_Lo0.js +0 -1
  1161. package/build/assets/extensions-hub-CFduxBnk.js +0 -1
  1162. package/build/assets/extensions-navigation-BeC224yX.js +0 -1
  1163. package/build/assets/external-link-DFpYunfj.js +0 -1
  1164. package/build/assets/files-tab-CL3J9b3p.js +0 -1
  1165. package/build/assets/format-model-name-BNPKVsIq.js +0 -1
  1166. package/build/assets/get-git-path-DlAJa_i6.js +0 -1
  1167. package/build/assets/git-repo-dropdown-DGMEhz7d.js +0 -1
  1168. package/build/assets/home-BCGlNJCA.js +0 -1
  1169. package/build/assets/home-DB1pRqTC.js +0 -1
  1170. package/build/assets/home-automation-run-tooltip-CooFQRIG.js +0 -1
  1171. package/build/assets/home-store-Dl1dPE58.js +0 -1
  1172. package/build/assets/index-home-DB1pRqTC.js +0 -1
  1173. package/build/assets/info-uYSVzX86.js +0 -1
  1174. package/build/assets/install-server-modal-BbJdhzet.js +0 -1
  1175. package/build/assets/kebab-menu-item-content-BYokkRHi.js +0 -1
  1176. package/build/assets/list-filter-OFkpRrmi.js +0 -1
  1177. package/build/assets/llm-not-configured-banner-BqqYnJ1t.js +0 -27
  1178. package/build/assets/llm-settings-CnDbbmVW.js +0 -1
  1179. package/build/assets/llm-settings-S8Yjg__1.js +0 -1
  1180. package/build/assets/llm-subscription-service-BpPfzW4x.js +0 -1
  1181. package/build/assets/loader-circle-nvrwthvj.js +0 -1
  1182. package/build/assets/manage-backends-modal-BCUPswyl.js +0 -1
  1183. package/build/assets/manifest-58597dde.js +0 -1
  1184. package/build/assets/markdown-renderer-Cb2sBWtV.js +0 -8
  1185. package/build/assets/mcp-page-Bm4K2NQq.js +0 -9
  1186. package/build/assets/messages-BTN5thLe.js +0 -40
  1187. package/build/assets/onboarding-Cx_kaiD1.js +0 -1
  1188. package/build/assets/onboarding-modal-vMwn7ihv.js +0 -1
  1189. package/build/assets/organization-service.api-C8XpQ0pM.js +0 -1
  1190. package/build/assets/pencil-Clh1Wjvh.js +0 -1
  1191. package/build/assets/planner-tab-DQvDU3ap.js +0 -1
  1192. package/build/assets/plug-BuQhHSSG.js +0 -1
  1193. package/build/assets/plugins-management-service-BjYeF0b0.js +0 -1
  1194. package/build/assets/plus-CEKne-Yp.js +0 -1
  1195. package/build/assets/profiles-service.api-QB-T_u-g.js +0 -1
  1196. package/build/assets/providers-FfSZ5TXP.js +0 -1
  1197. package/build/assets/proxy-tcFL2yTQ.js +0 -1
  1198. package/build/assets/recommended-automations-launcher-Bw8uC4V6.js +0 -1
  1199. package/build/assets/refresh-cw-Bh69DyYO.js +0 -1
  1200. package/build/assets/root-BLeQfBEq.css +0 -1
  1201. package/build/assets/root-ZKKYPR1Z.js +0 -2
  1202. package/build/assets/root-layout-luJoE9IG.js +0 -2
  1203. package/build/assets/schema-field-Csw5fhtN.js +0 -1
  1204. package/build/assets/scroll-fade-state-Dw-i4SGq.js +0 -1
  1205. package/build/assets/sdk-section-page-HTffvm7Q.js +0 -1
  1206. package/build/assets/secret-form-HTUbYw5o.js +0 -1
  1207. package/build/assets/secrets-service-BTor9uAU.js +0 -1
  1208. package/build/assets/settings-BlmrkwRi.js +0 -1
  1209. package/build/assets/settings-DcNPxz0v.js +0 -1
  1210. package/build/assets/settings-index-CKq0b0Vg.js +0 -1
  1211. package/build/assets/settings-service.api-B2agVfjL.js +0 -1
  1212. package/build/assets/shared-conversation-B55pCyBG.js +0 -1
  1213. package/build/assets/shield-check-CFDViW82.js +0 -1
  1214. package/build/assets/sidebar-mobile-menu-toggle-BOtyJHwE.js +0 -1
  1215. package/build/assets/sidebar-nav-link-CPzhyHQg.js +0 -1
  1216. package/build/assets/sidebar-store-DtpU7zaI.js +0 -1
  1217. package/build/assets/skill-filter-CWZ5kjcg.js +0 -2
  1218. package/build/assets/skill-scope-CV1dkAbW.js +0 -1
  1219. package/build/assets/skills-plugins-DGHULTq6.js +0 -1
  1220. package/build/assets/skills-settings-CM1lFv3e.js +0 -1
  1221. package/build/assets/styled-tooltip-Dl06rkpY.js +0 -1
  1222. package/build/assets/toggle-switch-Fd_QGz0r.js +0 -1
  1223. package/build/assets/trash-2-Dl8_RGz0.js +0 -1
  1224. package/build/assets/trash-_RMt7Ayc.js +0 -1
  1225. package/build/assets/triangle-alert-SM-q4NU_.js +0 -1
  1226. package/build/assets/usage-tab-BcfWV6db.js +0 -1
  1227. package/build/assets/use-acp-credential-form-BsSW5NHG.js +0 -1
  1228. package/build/assets/use-activate-agent-profile-B2NS8nA5.js +0 -1
  1229. package/build/assets/use-agent-profiles-DWBPC0Si.js +0 -1
  1230. package/build/assets/use-config-Bft35DOK.js +0 -1
  1231. package/build/assets/use-create-conversation-DwN5vv2f.js +0 -1
  1232. package/build/assets/use-create-secret-BSxJMxHp.js +0 -1
  1233. package/build/assets/use-has-permission-B3C8rQmR.js +0 -1
  1234. package/build/assets/use-is-authed-CFGkY3-Z.js +0 -1
  1235. package/build/assets/use-llm-configured-BI6obxsc.js +0 -1
  1236. package/build/assets/use-llm-profiles-djGAhTWL.js +0 -1
  1237. package/build/assets/use-manifest-capabilities-3z0-1G59.js +0 -1
  1238. package/build/assets/use-onboarding-completion-BXpyUSsJ.js +0 -1
  1239. package/build/assets/use-plugins-marketplace-DI4_pK56.js +0 -1
  1240. package/build/assets/use-save-agent-profile-DdBSTdpN.js +0 -1
  1241. package/build/assets/use-settings-C5VhGpqd.js +0 -1
  1242. package/build/assets/use-settings-nav-items-DHaUu1Dg.js +0 -16
  1243. package/build/assets/use-tracking-D5t9otIF.js +0 -3
  1244. package/build/assets/utils-DaCIEEQP.js +0 -1
  1245. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kepq2zme-ZixYGy6E.js +0 -186
  1246. package/build/assets/vendor~index-home~home~conversation-panel~conversation~alert-banner-B3qC_oj8.js +0 -1
  1247. package/build/assets/vendor~root-layout-BlUaZ18v.js +0 -1
  1248. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-B2OLKL7N.js +0 -1
  1249. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iw7io29p-Dz-MAyNb.js +0 -1
  1250. package/build/assets/x-DkgltWa0.js +0 -1
  1251. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +0 -2
  1252. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +0 -1
  1253. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.d.ts +0 -35
  1254. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +0 -247
  1255. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +0 -1
  1256. package/dist/components/features/tips/random-tip.d.ts +0 -2
  1257. package/dist/hooks/query/use-skills.cjs +0 -2
  1258. package/dist/hooks/query/use-skills.cjs.map +0 -1
  1259. package/dist/hooks/query/use-skills.d.ts +0 -7
  1260. package/dist/hooks/query/use-skills.js +0 -13
  1261. package/dist/hooks/query/use-skills.js.map +0 -1
  1262. package/dist/hooks/use-has-permission.cjs +0 -2
  1263. package/dist/hooks/use-has-permission.cjs.map +0 -1
  1264. package/dist/hooks/use-has-permission.d.ts +0 -1
  1265. package/dist/hooks/use-has-permission.js +0 -8
  1266. package/dist/hooks/use-has-permission.js.map +0 -1
  1267. package/dist/node_modules/lucide-react/dist/esm/icons/eye.cjs +0 -2
  1268. package/dist/node_modules/lucide-react/dist/esm/icons/eye.cjs.map +0 -1
  1269. package/dist/node_modules/lucide-react/dist/esm/icons/eye.js +0 -14
  1270. package/dist/node_modules/lucide-react/dist/esm/icons/eye.js.map +0 -1
  1271. package/dist/utils/tips.d.ts +0 -7
  1272. package/dist/utils/workspace-relative-path.cjs +0 -2
  1273. package/dist/utils/workspace-relative-path.cjs.map +0 -1
  1274. package/dist/utils/workspace-relative-path.d.ts +0 -10
  1275. package/dist/utils/workspace-relative-path.js +0 -22
  1276. package/dist/utils/workspace-relative-path.js.map +0 -1
  1277. /package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ox0jfsa0-cHFhpUBq.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~i58xkef6-cHFhpUBq.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"automation-service.api.cjs","names":[],"sources":["../../../src/api/automation-service/automation-service.api.ts"],"sourcesContent":["import axios from \"axios\";\nimport {\n clearPendingLocalTelemetryRevocation,\n getTelemetryConsent,\n getTelemetryDistinctId,\n getTelemetryDistinctIdForConsentSync,\n type TelemetryConsent,\n} from \"#/services/telemetry\";\nimport type {\n Automation,\n AutomationRun,\n AutomationSpec,\n AutomationTrigger,\n AutomationsResponse,\n AutomationRunsResponse,\n} from \"#/types/automation\";\nimport type {\n GitSyncCheckResponse,\n GitSyncConfigUpdateRequest,\n GitSyncStatus,\n GitSyncTriggerResponse,\n} from \"#/types/git-sync\";\nimport {\n automationCreateEndpoint,\n automationUploadEndpoint,\n} from \"#/manifests/automation-setup\";\nimport {\n getAutomationEndpoint,\n getAutomationIdEndpoint,\n getImportExportSpec,\n} from \"#/manifests/automation-interface\";\nimport type {\n DeploymentCapabilities,\n SetupEntry,\n SetupRequestBody,\n ValidateDraftResponse,\n} from \"#/manifests/types\";\nimport type { Backend, ResolvedActiveBackend } from \"../backend-registry/types\";\nimport {\n getActiveBackend,\n getEffectiveLocalBackend,\n} from \"../backend-registry/active-store\";\nimport { NoBackendAvailableError } from \"../agent-server-client-options\";\nimport { callCloudProxy } from \"../cloud/proxy\";\nimport {\n AGENT_CANVAS_CLIENT_HEADERS,\n OPENHANDS_TELEMETRY_DISTINCT_ID_HEADER,\n} from \"../client-source\";\n\nconst AUTOMATION_BASE_PATH = \"/api/automation\";\n\nexport interface AutomationHealthResponse {\n status: \"ok\" | \"error\";\n message?: string;\n}\n\ntype AutomationSdkVersionResponse =\n | string\n | {\n sdk_version?: unknown;\n version?: unknown;\n };\n\n// Local automation calls go to the automation sidecar that\n// `scripts/dev-with-automation.mjs` mounts behind the local agent-server.\n// Both backends use the same session API key and the same `X-Session-API-Key`\n// header for consistency.\nconst localAutomationAxios = axios.create();\n\nasync function buildAutomationRequestHeaders(\n extraHeaders: Record<string, string> = {},\n): Promise<Record<string, string>> {\n const telemetryDistinctId = await getTelemetryDistinctId();\n return {\n ...AGENT_CANVAS_CLIENT_HEADERS,\n ...(telemetryDistinctId\n ? { [OPENHANDS_TELEMETRY_DISTINCT_ID_HEADER]: telemetryDistinctId }\n : {}),\n ...extraHeaders,\n };\n}\n\nlocalAutomationAxios.interceptors.request.use(async (config) => {\n const requestHeaders = await buildAutomationRequestHeaders();\n Object.entries(requestHeaders).forEach(([name, value]) => {\n config.headers.set(name, value);\n });\n\n // Import uses an explicit baseURL/header pair so its POST, PATCH, and\n // cleanup stay pinned to the backend selected when the mutation started.\n if (config.baseURL) return config;\n\n // Resolve the local backend on every call so it tracks the\n // currently-active local backend (and any host/key edits made via the\n // manage-backends UI), rather than freezing whatever value the\n // agent-server-config produced at module load time.\n // Using the backend registry (rather than the build-time VITE_SESSION_API_KEY\n // env var) ensures the published npm package picks up the runtime-injected\n // session key that scripts/static-server.mjs seeds into localStorage, fixing\n // the 401 errors reported in issue #829.\n const backend = getEffectiveLocalBackend();\n if (!backend) throw new NoBackendAvailableError();\n // eslint-disable-next-line no-param-reassign\n config.baseURL = backend.host;\n\n const apiKey = backend.apiKey?.trim();\n if (apiKey) {\n config.headers.set(\"X-Session-API-Key\", apiKey);\n }\n return config;\n});\n\nfunction normalizeAutomationSdkVersion(version: unknown): string | null {\n if (typeof version !== \"string\") return null;\n const trimmed = version.trim();\n return trimmed || null;\n}\n\nfunction getAutomationSdkVersionFromResponse(\n response: AutomationSdkVersionResponse,\n): string | null {\n if (typeof response === \"string\") {\n return normalizeAutomationSdkVersion(response);\n }\n return (\n normalizeAutomationSdkVersion(response.sdk_version) ??\n normalizeAutomationSdkVersion(response.version)\n );\n}\n\nfunction buildPaginationQuery(limit: number, offset: number): string {\n const params = new URLSearchParams();\n params.set(\"limit\", String(limit));\n params.set(\"offset\", String(offset));\n return params.toString();\n}\n\nfunction buildImportedTrigger(spec: AutomationSpec): AutomationTrigger {\n if (spec.trigger.type === \"event\") {\n return {\n type: \"event\",\n source: spec.trigger.source,\n on: spec.trigger.on,\n ...(spec.trigger.filter && { filter: spec.trigger.filter }),\n };\n }\n\n return {\n type: \"cron\",\n schedule: spec.trigger.schedule,\n timezone: spec.timezone ?? spec.trigger.timezone ?? \"UTC\",\n };\n}\n\nfunction generatePendingImportEvent(): string {\n if (\n typeof crypto !== \"undefined\" &&\n typeof crypto.randomUUID === \"function\"\n ) {\n return `pending.${crypto.randomUUID()}`;\n }\n return `pending.${Date.now()}.${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction buildCreateAutomationRequest(spec: AutomationSpec) {\n if (!spec.prompt) {\n throw new Error(\"An automation prompt is required for import.\");\n }\n\n const { importDefaults } = getImportExportSpec();\n const repos = spec.repository\n ? [\n {\n url: spec.repository,\n ...(spec.branch && { ref: spec.branch }),\n ...(!spec.repository.includes(\"://\") &&\n !spec.repository.startsWith(\"git@\") && {\n provider: importDefaults.repoProvider,\n }),\n },\n ]\n : undefined;\n\n return {\n path: `${AUTOMATION_BASE_PATH}${getAutomationEndpoint(\n spec.plugins?.length ? \"createPlugin\" : \"createPrompt\",\n )}`,\n body: {\n name: spec.name,\n prompt: spec.prompt,\n // Preset creation defaults to enabled. A unique event trigger keeps the\n // new record inert until the real trigger and disabled state are applied\n // together in the follow-up PATCH.\n trigger: {\n type: \"event\",\n source: importDefaults.placeholderEventSource,\n on: generatePendingImportEvent(),\n },\n ...(spec.model && { model: spec.model }),\n ...(repos && { repos }),\n ...(spec.plugins?.length && {\n plugins: spec.plugins.map((source) => ({ source })),\n }),\n ...(spec.timeout != null && { timeout: spec.timeout }),\n },\n };\n}\n\nasync function buildPinnedLocalConfig(backend: Backend) {\n const apiKey = backend.apiKey.trim();\n return {\n baseURL: backend.host,\n headers: await buildAutomationRequestHeaders(\n apiKey ? { \"X-Session-API-Key\": apiKey } : {},\n ),\n };\n}\n\nasync function buildPinnedCloudHeaders(active: ResolvedActiveBackend) {\n return buildAutomationRequestHeaders(\n active.orgId ? { \"X-Org-Id\": active.orgId } : {},\n );\n}\n\nclass AutomationService {\n static async syncTelemetryConsent(\n consent: TelemetryConsent = getTelemetryConsent(),\n ): Promise<void> {\n const active = getActiveBackend();\n if (active.backend.kind !== \"local\") return;\n\n const frontendDistinctId = await getTelemetryDistinctIdForConsentSync();\n await localAutomationAxios.post(\n `${AUTOMATION_BASE_PATH}/v1/telemetry/consent`,\n {\n consent_granted: consent === \"granted\",\n frontend_distinct_id: frontendDistinctId,\n },\n { timeout: 5000 },\n );\n if (consent !== \"granted\" && frontendDistinctId) {\n clearPendingLocalTelemetryRevocation(frontendDistinctId);\n }\n }\n\n static async getSdkVersion(): Promise<string | null> {\n const active = getActiveBackend();\n const path = `${AUTOMATION_BASE_PATH}/sdk-version`;\n\n try {\n let response: AutomationSdkVersionResponse;\n if (active.backend.kind === \"cloud\") {\n response = await callCloudProxy<AutomationSdkVersionResponse>({\n backend: active.backend,\n method: \"GET\",\n path,\n headers: await buildPinnedCloudHeaders(active),\n timeoutSeconds: 5,\n });\n } else {\n const { data } =\n await localAutomationAxios.get<AutomationSdkVersionResponse>(path, {\n timeout: 5000,\n });\n response = data;\n }\n\n return getAutomationSdkVersionFromResponse(response);\n } catch {\n return null;\n }\n }\n\n static async listAutomations(\n params: { limit?: number; offset?: number } = {},\n ): Promise<AutomationsResponse> {\n const { limit = 50, offset = 0 } = params;\n const active = getActiveBackend().backend;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<AutomationsResponse>({\n backend: active,\n method: \"GET\",\n path: `${AUTOMATION_BASE_PATH}${getAutomationEndpoint(\"list\")}?${buildPaginationQuery(limit, offset)}`,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.get<AutomationsResponse>(\n `${AUTOMATION_BASE_PATH}${getAutomationEndpoint(\"list\")}`,\n { params: { limit, offset } },\n );\n return data;\n }\n\n static async getAutomations(\n limit = 50,\n offset = 0,\n ): Promise<AutomationsResponse> {\n return AutomationService.listAutomations({ limit, offset });\n }\n\n static async getAutomation(id: string): Promise<Automation> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"detail\", id)}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<Automation>({\n backend: active,\n method: \"GET\",\n path,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.get<Automation>(path);\n return data;\n }\n\n static async createAutomation(spec: AutomationSpec): Promise<Automation> {\n const active = getActiveBackend();\n const { path, body } = buildCreateAutomationRequest(spec);\n\n let created: Automation;\n if (active.backend.kind === \"cloud\") {\n created = await callCloudProxy<Automation>({\n backend: active.backend,\n method: \"POST\",\n path,\n body,\n headers: await buildPinnedCloudHeaders(active),\n });\n } else {\n const { data } = await localAutomationAxios.post<Automation>(\n path,\n body,\n await buildPinnedLocalConfig(active.backend),\n );\n created = data;\n }\n\n const updatePath = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"detail\", created.id)}`;\n const updateBody: Partial<Automation> = {\n trigger: buildImportedTrigger(spec),\n enabled: false,\n };\n\n try {\n if (active.backend.kind === \"cloud\") {\n return await callCloudProxy<Automation>({\n backend: active.backend,\n method: \"PATCH\",\n path: updatePath,\n body: updateBody,\n headers: await buildPinnedCloudHeaders(active),\n });\n }\n\n const { data } = await localAutomationAxios.patch<Automation>(\n updatePath,\n updateBody,\n await buildPinnedLocalConfig(active.backend),\n );\n return data;\n } catch (updateError) {\n try {\n if (active.backend.kind === \"cloud\") {\n await callCloudProxy<unknown>({\n backend: active.backend,\n method: \"DELETE\",\n path: updatePath,\n headers: await buildPinnedCloudHeaders(active),\n });\n } else {\n await localAutomationAxios.delete(\n updatePath,\n await buildPinnedLocalConfig(active.backend),\n );\n }\n } catch (cleanupError) {\n throw new AggregateError(\n [updateError, cleanupError],\n \"Failed to disable the imported automation and clean it up.\",\n );\n }\n throw updateError;\n }\n }\n\n static async updateAutomation(\n id: string,\n body: Partial<Automation>,\n ): Promise<Automation> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"detail\", id)}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<Automation>({\n backend: active,\n method: \"PATCH\",\n path,\n body: body as Record<string, unknown>,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.patch<Automation>(path, body);\n return data;\n }\n\n static async deleteAutomation(id: string): Promise<void> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"detail\", id)}`;\n\n if (active.kind === \"cloud\") {\n await callCloudProxy<unknown>({\n backend: active,\n method: \"DELETE\",\n path,\n headers: await buildAutomationRequestHeaders(),\n });\n return;\n }\n\n await localAutomationAxios.delete(path);\n }\n\n static async dispatchAutomation(id: string): Promise<AutomationRun> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"dispatch\", id)}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<AutomationRun>({\n backend: active,\n method: \"POST\",\n path,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.post<AutomationRun>(path);\n return data;\n }\n\n /**\n * Cancel a pending or running automation run.\n * Backend: POST /api/automation/v1/runs/{run_id}/cancel\n */\n static async cancelAutomationRun(runId: string): Promise<AutomationRun> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}/v1/runs/${encodeURIComponent(runId)}/cancel`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<AutomationRun>({\n backend: active,\n method: \"POST\",\n path,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.post<AutomationRun>(path);\n return data;\n }\n\n static async listAutomationRuns(\n id: string,\n params: { limit?: number; offset?: number } = {},\n ): Promise<AutomationRunsResponse> {\n const { limit = 50, offset = 0 } = params;\n const active = getActiveBackend().backend;\n const basePath = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"runs\", id)}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<AutomationRunsResponse>({\n backend: active,\n method: \"GET\",\n path: `${basePath}?${buildPaginationQuery(limit, offset)}`,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.get<AutomationRunsResponse>(\n basePath,\n { params: { limit, offset } },\n );\n return data;\n }\n\n static async getAutomationRuns(\n id: string,\n limit = 50,\n offset = 0,\n ): Promise<AutomationRunsResponse> {\n return AutomationService.listAutomationRuns(id, { limit, offset });\n }\n\n static async toggleAutomation(\n id: string,\n enabled: boolean,\n ): Promise<Automation> {\n return AutomationService.updateAutomation(id, { enabled });\n }\n\n static async downloadTarball(id: string, name: string): Promise<void> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"tarball\", id)}`;\n\n let blob: Blob;\n if (active.kind === \"cloud\") {\n blob = await callCloudProxy<Blob>({\n backend: active,\n method: \"GET\",\n path,\n responseType: \"blob\",\n headers: await buildAutomationRequestHeaders(),\n });\n } else {\n const { data } = await localAutomationAxios.get<Blob>(path, {\n responseType: \"blob\",\n });\n blob = data;\n }\n\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `${name}.tar`;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n /**\n * Ask what this deployment supports, before a setup form renders.\n *\n * The setup endpoints answer a contract authored in `OpenHands/extensions`,\n * so their bodies are camelCase where the rest of this service is snake_case.\n */\n static async getCapabilities(): Promise<DeploymentCapabilities> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationEndpoint(\"capabilities\")}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<DeploymentCapabilities>({\n backend: active,\n method: \"GET\",\n path,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } =\n await localAutomationAxios.get<DeploymentCapabilities>(path);\n return data;\n }\n\n /**\n * Validate a draft without creating it. An invalid draft is a 200 carrying\n * field-addressed errors; only a malformed envelope is a 4xx.\n */\n static async validateDraft(\n body: SetupRequestBody,\n ): Promise<ValidateDraftResponse> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationEndpoint(\"validate\")}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<ValidateDraftResponse>({\n backend: active,\n method: \"POST\",\n path,\n body,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.post<ValidateDraftResponse>(\n path,\n body,\n );\n return data;\n }\n\n /**\n * Create from a draft a setup form derived. Unlike {@link\n * AutomationService.createAutomation}, which exists for import and has to\n * park the record on a placeholder trigger, this sends the finished record in\n * one request.\n */\n static async createAutomationDraft(\n body: SetupRequestBody,\n /** The entry the draft came from, which decides the create endpoint. */\n entry?: SetupEntry,\n ): Promise<Record<string, unknown>> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${automationCreateEndpoint(entry)}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<Record<string, unknown>>({\n backend: active,\n method: \"POST\",\n path,\n body,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.post<Record<string, unknown>>(\n path,\n body,\n );\n return data;\n }\n\n /**\n * Upload a packed bundle, and return the `oh-internal://` path the create\n * call references.\n *\n * The body is the archive itself rather than a multipart form - the service\n * streams it and takes its metadata from the query string, so it never has\n * to buffer the whole file to start writing.\n */\n static async uploadAutomationTarball(\n name: string,\n archive: Uint8Array,\n ): Promise<string> {\n const active = getActiveBackend().backend;\n const path =\n `${AUTOMATION_BASE_PATH}${automationUploadEndpoint()}` +\n `?name=${encodeURIComponent(name)}`;\n const headers = { \"Content-Type\": \"application/gzip\" };\n\n let upload: Record<string, unknown>;\n if (active.kind === \"cloud\") {\n // Post the archive straight to the cloud host rather than through the\n // cloud client: that client JSON-serializes any non-FormData body, which\n // would turn the gzip `Uint8Array` into `{\"0\":31,...}` even though the\n // header says `application/gzip`. Axios preserves the raw bytes (its\n // `transformRequest` sends the underlying buffer), so the service still\n // receives the archive as the stream it expects, with metadata in the\n // query string. This upload sets no host override, so a direct call\n // matches the cloud client's own direct-to-host path -- we just add the\n // two headers that path would (`Bearer` auth and `X-Org-Id`).\n const { orgId } = getActiveBackend();\n upload = (\n await axios.post<Record<string, unknown>>(\n `${active.host.replace(/\\/+$/, \"\")}${path}`,\n archive,\n {\n headers: {\n ...(await buildAutomationRequestHeaders()),\n ...headers,\n ...(active.apiKey\n ? { Authorization: `Bearer ${active.apiKey}` }\n : {}),\n ...(orgId ? { \"X-Org-Id\": orgId } : {}),\n },\n },\n )\n ).data;\n } else {\n upload = (\n await localAutomationAxios.post<Record<string, unknown>>(\n path,\n archive,\n { headers },\n )\n ).data;\n }\n\n const tarballPath = upload.tarball_path;\n if (typeof tarballPath !== \"string\" || !tarballPath) {\n throw new Error(\"The upload returned no tarball path.\");\n }\n return tarballPath;\n }\n\n // Git sync paths are literal rather than routed through\n // `getAutomationEndpoint`. That manifest describes the automation surface a\n // host may remap, and `InterfaceEndpoints` requires every key it declares --\n // adding these would break existing manifests. Git sync is a local-mode\n // operator feature outside that surface.\n static async getGitSyncStatus(): Promise<GitSyncStatus> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}/v1/git-sync/status`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<GitSyncStatus>({\n backend: active,\n method: \"GET\",\n path,\n });\n }\n\n const { data } = await localAutomationAxios.get<GitSyncStatus>(path);\n return data;\n }\n\n static async updateGitSyncConfig(\n body: GitSyncConfigUpdateRequest,\n ): Promise<GitSyncStatus> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}/v1/git-sync/config`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<GitSyncStatus>({\n backend: active,\n method: \"PUT\",\n path,\n body: body as Record<string, unknown>,\n });\n }\n\n const { data } = await localAutomationAxios.put<GitSyncStatus>(path, body);\n return data;\n }\n\n /**\n * Ask whether a configuration can reach its repo, without saving it. Takes\n * the same body as `updateGitSyncConfig` and answers for the settings that\n * body would leave in place.\n */\n static async checkGitSyncConfig(\n body: GitSyncConfigUpdateRequest,\n ): Promise<GitSyncCheckResponse> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}/v1/git-sync/check`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<GitSyncCheckResponse>({\n backend: active,\n method: \"POST\",\n path,\n body: body as Record<string, unknown>,\n });\n }\n\n const { data } = await localAutomationAxios.post<GitSyncCheckResponse>(\n path,\n body,\n );\n return data;\n }\n\n static async triggerGitSync(): Promise<GitSyncTriggerResponse> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}/v1/git-sync/sync`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<GitSyncTriggerResponse>({\n backend: active,\n method: \"POST\",\n path,\n });\n }\n\n const { data } =\n await localAutomationAxios.post<GitSyncTriggerResponse>(path);\n return data;\n }\n\n static async checkHealth(): Promise<AutomationHealthResponse> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationEndpoint(\"health\")}`;\n\n try {\n if (active.kind === \"cloud\") {\n const response = await callCloudProxy<AutomationHealthResponse>({\n backend: active,\n method: \"GET\",\n path,\n // Fail fast, matching the local branch's 5s timeout below.\n timeoutSeconds: 5,\n headers: await buildAutomationRequestHeaders(),\n });\n return response;\n }\n\n const { data } = await localAutomationAxios.get<AutomationHealthResponse>(\n path,\n { timeout: 5000 },\n );\n return data;\n } catch {\n return { status: \"error\" };\n }\n }\n}\n\nexport default AutomationService;\n"],"mappings":"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"}
1
+ {"version":3,"file":"automation-service.api.cjs","names":[],"sources":["../../../src/api/automation-service/automation-service.api.ts"],"sourcesContent":["import axios from \"axios\";\nimport {\n clearPendingLocalTelemetryRevocation,\n getTelemetryConsent,\n getTelemetryDistinctId,\n getTelemetryDistinctIdForConsentSync,\n type TelemetryConsent,\n} from \"#/services/telemetry\";\nimport type {\n Automation,\n AutomationRun,\n AutomationSpec,\n AutomationTrigger,\n AutomationsResponse,\n AutomationRunsResponse,\n} from \"#/types/automation\";\nimport type {\n GitSyncCheckResponse,\n GitSyncConfigUpdateRequest,\n GitSyncStatus,\n GitSyncTriggerResponse,\n} from \"#/types/git-sync\";\nimport {\n automationCreateEndpoint,\n automationUploadEndpoint,\n} from \"#/manifests/automation-setup\";\nimport {\n getAutomationEndpoint,\n getAutomationIdEndpoint,\n getImportExportSpec,\n} from \"#/manifests/automation-interface\";\nimport type {\n DeploymentCapabilities,\n SetupEntry,\n SetupRequestBody,\n ValidateDraftResponse,\n} from \"#/manifests/types\";\nimport type { Backend, ResolvedActiveBackend } from \"../backend-registry/types\";\nimport {\n getActiveBackend,\n getEffectiveLocalBackend,\n} from \"../backend-registry/active-store\";\nimport { NoBackendAvailableError } from \"../agent-server-client-options\";\nimport { callCloudProxy } from \"../cloud/proxy\";\nimport {\n AGENT_CANVAS_CLIENT_HEADERS,\n OPENHANDS_TELEMETRY_DISTINCT_ID_HEADER,\n} from \"../client-source\";\n\nconst AUTOMATION_BASE_PATH = \"/api/automation\";\n\nexport interface AutomationHealthResponse {\n status: \"ok\" | \"error\";\n message?: string;\n}\n\ntype AutomationSdkVersionResponse =\n | string\n | {\n sdk_version?: unknown;\n version?: unknown;\n };\n\n// Local automation calls go to the automation sidecar that\n// `scripts/dev-with-automation.mjs` mounts behind the local agent-server.\n// Both backends use the same session API key and the same `X-Session-API-Key`\n// header for consistency.\nconst localAutomationAxios = axios.create();\n\nasync function buildAutomationRequestHeaders(\n extraHeaders: Record<string, string> = {},\n): Promise<Record<string, string>> {\n const telemetryDistinctId = await getTelemetryDistinctId();\n return {\n ...AGENT_CANVAS_CLIENT_HEADERS,\n ...(telemetryDistinctId\n ? { [OPENHANDS_TELEMETRY_DISTINCT_ID_HEADER]: telemetryDistinctId }\n : {}),\n ...extraHeaders,\n };\n}\n\nlocalAutomationAxios.interceptors.request.use(async (config) => {\n const requestHeaders = await buildAutomationRequestHeaders();\n Object.entries(requestHeaders).forEach(([name, value]) => {\n config.headers.set(name, value);\n });\n\n // Import uses an explicit baseURL/header pair so its POST, PATCH, and\n // cleanup stay pinned to the backend selected when the mutation started.\n if (config.baseURL) return config;\n\n // Resolve the local backend on every call so it tracks the\n // currently-active local backend (and any host/key edits made via the\n // manage-backends UI), rather than freezing whatever value the\n // agent-server-config produced at module load time.\n // Using the backend registry (rather than the build-time VITE_SESSION_API_KEY\n // env var) ensures the published npm package picks up the runtime-injected\n // session key that scripts/static-server.mjs seeds into localStorage, fixing\n // the 401 errors reported in issue #829.\n const backend = getEffectiveLocalBackend();\n if (!backend) throw new NoBackendAvailableError();\n // eslint-disable-next-line no-param-reassign\n config.baseURL = backend.host;\n\n const apiKey = backend.apiKey?.trim();\n if (apiKey) {\n config.headers.set(\"X-Session-API-Key\", apiKey);\n }\n return config;\n});\n\nfunction normalizeAutomationSdkVersion(version: unknown): string | null {\n if (typeof version !== \"string\") return null;\n const trimmed = version.trim();\n return trimmed || null;\n}\n\nfunction getAutomationSdkVersionFromResponse(\n response: AutomationSdkVersionResponse,\n): string | null {\n if (typeof response === \"string\") {\n return normalizeAutomationSdkVersion(response);\n }\n return (\n normalizeAutomationSdkVersion(response.sdk_version) ??\n normalizeAutomationSdkVersion(response.version)\n );\n}\n\nfunction buildPaginationQuery(limit: number, offset: number): string {\n const params = new URLSearchParams();\n params.set(\"limit\", String(limit));\n params.set(\"offset\", String(offset));\n return params.toString();\n}\n\nfunction buildImportedTrigger(spec: AutomationSpec): AutomationTrigger {\n if (spec.trigger.type === \"event\") {\n return {\n type: \"event\",\n source: spec.trigger.source,\n on: spec.trigger.on,\n ...(spec.trigger.filter && { filter: spec.trigger.filter }),\n };\n }\n\n return {\n type: \"cron\",\n schedule: spec.trigger.schedule,\n timezone: spec.timezone ?? spec.trigger.timezone ?? \"UTC\",\n };\n}\n\nfunction generatePendingImportEvent(): string {\n if (\n typeof crypto !== \"undefined\" &&\n typeof crypto.randomUUID === \"function\"\n ) {\n return `pending.${crypto.randomUUID()}`;\n }\n return `pending.${Date.now()}.${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction buildCreateAutomationRequest(spec: AutomationSpec) {\n if (!spec.prompt) {\n throw new Error(\"An automation prompt is required for import.\");\n }\n\n const { importDefaults } = getImportExportSpec();\n const repos = spec.repository\n ? [\n {\n url: spec.repository,\n ...(spec.branch && { ref: spec.branch }),\n ...(!spec.repository.includes(\"://\") &&\n !spec.repository.startsWith(\"git@\") && {\n provider: importDefaults.repoProvider,\n }),\n },\n ]\n : undefined;\n\n return {\n path: `${AUTOMATION_BASE_PATH}${getAutomationEndpoint(\n spec.plugins?.length ? \"createPlugin\" : \"createPrompt\",\n )}`,\n body: {\n name: spec.name,\n prompt: spec.prompt,\n // Preset creation defaults to enabled. A unique event trigger keeps the\n // new record inert until the real trigger and disabled state are applied\n // together in the follow-up PATCH.\n trigger: {\n type: \"event\",\n source: importDefaults.placeholderEventSource,\n on: generatePendingImportEvent(),\n },\n ...(spec.model && { model: spec.model }),\n ...(repos && { repos }),\n ...(spec.plugins?.length && {\n plugins: spec.plugins.map((source) => ({ source })),\n }),\n ...(spec.timeout != null && { timeout: spec.timeout }),\n },\n };\n}\n\nasync function buildPinnedLocalConfig(backend: Backend) {\n const apiKey = backend.apiKey.trim();\n return {\n baseURL: backend.host,\n headers: await buildAutomationRequestHeaders(\n apiKey ? { \"X-Session-API-Key\": apiKey } : {},\n ),\n };\n}\n\nasync function buildPinnedCloudHeaders(active: ResolvedActiveBackend) {\n return buildAutomationRequestHeaders(\n active.orgId ? { \"X-Org-Id\": active.orgId } : {},\n );\n}\n\nclass AutomationService {\n static async syncTelemetryConsent(\n consent: TelemetryConsent = getTelemetryConsent(),\n ): Promise<void> {\n const active = getActiveBackend();\n if (active.backend.kind !== \"local\") return;\n\n const frontendDistinctId = await getTelemetryDistinctIdForConsentSync();\n await localAutomationAxios.post(\n `${AUTOMATION_BASE_PATH}/v1/telemetry/consent`,\n {\n consent_granted: consent === \"granted\",\n frontend_distinct_id: frontendDistinctId,\n },\n { timeout: 5000 },\n );\n if (consent !== \"granted\" && frontendDistinctId) {\n clearPendingLocalTelemetryRevocation(frontendDistinctId);\n }\n }\n\n static async getSdkVersion(): Promise<string | null> {\n const active = getActiveBackend();\n const path = `${AUTOMATION_BASE_PATH}/sdk-version`;\n\n try {\n let response: AutomationSdkVersionResponse;\n if (active.backend.kind === \"cloud\") {\n response = await callCloudProxy<AutomationSdkVersionResponse>({\n backend: active.backend,\n method: \"GET\",\n path,\n headers: await buildPinnedCloudHeaders(active),\n timeoutSeconds: 5,\n });\n } else {\n const { data } =\n await localAutomationAxios.get<AutomationSdkVersionResponse>(path, {\n timeout: 5000,\n });\n response = data;\n }\n\n return getAutomationSdkVersionFromResponse(response);\n } catch {\n return null;\n }\n }\n\n static async listAutomations(\n params: { limit?: number; offset?: number } = {},\n ): Promise<AutomationsResponse> {\n const { limit = 50, offset = 0 } = params;\n const active = getActiveBackend().backend;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<AutomationsResponse>({\n backend: active,\n method: \"GET\",\n path: `${AUTOMATION_BASE_PATH}${getAutomationEndpoint(\"list\")}?${buildPaginationQuery(limit, offset)}`,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.get<AutomationsResponse>(\n `${AUTOMATION_BASE_PATH}${getAutomationEndpoint(\"list\")}`,\n { params: { limit, offset } },\n );\n return data;\n }\n\n static async getAutomations(\n limit = 50,\n offset = 0,\n ): Promise<AutomationsResponse> {\n return AutomationService.listAutomations({ limit, offset });\n }\n\n static async getAutomation(id: string): Promise<Automation> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"detail\", id)}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<Automation>({\n backend: active,\n method: \"GET\",\n path,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.get<Automation>(path);\n return data;\n }\n\n static async createAutomation(spec: AutomationSpec): Promise<Automation> {\n const active = getActiveBackend();\n const { path, body } = buildCreateAutomationRequest(spec);\n\n let created: Automation;\n if (active.backend.kind === \"cloud\") {\n created = await callCloudProxy<Automation>({\n backend: active.backend,\n method: \"POST\",\n path,\n body,\n headers: await buildPinnedCloudHeaders(active),\n });\n } else {\n const { data } = await localAutomationAxios.post<Automation>(\n path,\n body,\n await buildPinnedLocalConfig(active.backend),\n );\n created = data;\n }\n\n const updatePath = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"detail\", created.id)}`;\n const updateBody: Partial<Automation> = {\n trigger: buildImportedTrigger(spec),\n enabled: false,\n };\n\n try {\n if (active.backend.kind === \"cloud\") {\n return await callCloudProxy<Automation>({\n backend: active.backend,\n method: \"PATCH\",\n path: updatePath,\n body: updateBody,\n headers: await buildPinnedCloudHeaders(active),\n });\n }\n\n const { data } = await localAutomationAxios.patch<Automation>(\n updatePath,\n updateBody,\n await buildPinnedLocalConfig(active.backend),\n );\n return data;\n } catch (updateError) {\n try {\n if (active.backend.kind === \"cloud\") {\n await callCloudProxy<unknown>({\n backend: active.backend,\n method: \"DELETE\",\n path: updatePath,\n headers: await buildPinnedCloudHeaders(active),\n });\n } else {\n await localAutomationAxios.delete(\n updatePath,\n await buildPinnedLocalConfig(active.backend),\n );\n }\n } catch (cleanupError) {\n throw new AggregateError(\n [updateError, cleanupError],\n \"Failed to disable the imported automation and clean it up.\",\n );\n }\n throw updateError;\n }\n }\n\n static async updateAutomation(\n id: string,\n body: Partial<Automation>,\n ): Promise<Automation> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"detail\", id)}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<Automation>({\n backend: active,\n method: \"PATCH\",\n path,\n body: body as Record<string, unknown>,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.patch<Automation>(path, body);\n return data;\n }\n\n static async deleteAutomation(id: string): Promise<void> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"detail\", id)}`;\n\n if (active.kind === \"cloud\") {\n await callCloudProxy<unknown>({\n backend: active,\n method: \"DELETE\",\n path,\n headers: await buildAutomationRequestHeaders(),\n });\n return;\n }\n\n await localAutomationAxios.delete(path);\n }\n\n static async dispatchAutomation(id: string): Promise<AutomationRun> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"dispatch\", id)}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<AutomationRun>({\n backend: active,\n method: \"POST\",\n path,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.post<AutomationRun>(path);\n return data;\n }\n\n /**\n * Cancel a pending or running automation run.\n * Backend: POST /api/automation/v1/runs/{run_id}/cancel\n */\n static async cancelAutomationRun(runId: string): Promise<AutomationRun> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}/v1/runs/${encodeURIComponent(runId)}/cancel`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<AutomationRun>({\n backend: active,\n method: \"POST\",\n path,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.post<AutomationRun>(path);\n return data;\n }\n\n static async listAutomationRuns(\n id: string,\n params: { limit?: number; offset?: number } = {},\n ): Promise<AutomationRunsResponse> {\n const { limit = 50, offset = 0 } = params;\n const active = getActiveBackend().backend;\n const basePath = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"runs\", id)}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<AutomationRunsResponse>({\n backend: active,\n method: \"GET\",\n path: `${basePath}?${buildPaginationQuery(limit, offset)}`,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.get<AutomationRunsResponse>(\n basePath,\n { params: { limit, offset } },\n );\n return data;\n }\n\n static async getAutomationRuns(\n id: string,\n limit = 50,\n offset = 0,\n ): Promise<AutomationRunsResponse> {\n return AutomationService.listAutomationRuns(id, { limit, offset });\n }\n\n static async toggleAutomation(\n id: string,\n enabled: boolean,\n ): Promise<Automation> {\n return AutomationService.updateAutomation(id, { enabled });\n }\n\n static async downloadTarball(id: string, name: string): Promise<void> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"tarball\", id)}`;\n\n let blob: Blob;\n if (active.kind === \"cloud\") {\n blob = await callCloudProxy<Blob>({\n backend: active,\n method: \"GET\",\n path,\n responseType: \"blob\",\n headers: await buildAutomationRequestHeaders(),\n });\n } else {\n const { data } = await localAutomationAxios.get<Blob>(path, {\n responseType: \"blob\",\n });\n blob = data;\n }\n\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `${name}.tar`;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n /**\n * Ask what this deployment supports, before a setup form renders.\n *\n * The setup endpoints answer a contract authored in `OpenHands/extensions`,\n * so their bodies are camelCase where the rest of this service is snake_case.\n */\n static async getCapabilities(): Promise<DeploymentCapabilities> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationEndpoint(\"capabilities\")}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<DeploymentCapabilities>({\n backend: active,\n method: \"GET\",\n path,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } =\n await localAutomationAxios.get<DeploymentCapabilities>(path);\n return data;\n }\n\n /**\n * Validate a draft without creating it. An invalid draft is a 200 carrying\n * field-addressed errors; only a malformed envelope is a 4xx.\n */\n static async validateDraft(\n body: SetupRequestBody,\n ): Promise<ValidateDraftResponse> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationEndpoint(\"validate\")}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<ValidateDraftResponse>({\n backend: active,\n method: \"POST\",\n path,\n body,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.post<ValidateDraftResponse>(\n path,\n body,\n );\n return data;\n }\n\n /**\n * Create from a draft a setup form derived. Unlike {@link\n * AutomationService.createAutomation}, which exists for import and has to\n * park the record on a placeholder trigger, this sends the finished record in\n * one request.\n */\n static async createAutomationDraft(\n body: SetupRequestBody,\n /** The entry and selected action decide the create endpoint. */\n entry?: SetupEntry,\n selectedAction?: string | null,\n ): Promise<Record<string, unknown>> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${automationCreateEndpoint(\n entry,\n selectedAction,\n )}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<Record<string, unknown>>({\n backend: active,\n method: \"POST\",\n path,\n body,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.post<Record<string, unknown>>(\n path,\n body,\n );\n return data;\n }\n\n /**\n * Upload a packed bundle, and return the `oh-internal://` path the create\n * call references.\n *\n * The body is the archive itself rather than a multipart form - the service\n * streams it and takes its metadata from the query string, so it never has\n * to buffer the whole file to start writing.\n */\n static async uploadAutomationTarball(\n name: string,\n archive: Uint8Array,\n ): Promise<string> {\n const active = getActiveBackend().backend;\n const path =\n `${AUTOMATION_BASE_PATH}${automationUploadEndpoint()}` +\n `?name=${encodeURIComponent(name)}`;\n const headers = { \"Content-Type\": \"application/gzip\" };\n\n let upload: Record<string, unknown>;\n if (active.kind === \"cloud\") {\n // Post the archive straight to the cloud host rather than through the\n // cloud client: that client JSON-serializes any non-FormData body, which\n // would turn the gzip `Uint8Array` into `{\"0\":31,...}` even though the\n // header says `application/gzip`. Axios preserves the raw bytes (its\n // `transformRequest` sends the underlying buffer), so the service still\n // receives the archive as the stream it expects, with metadata in the\n // query string. This upload sets no host override, so a direct call\n // matches the cloud client's own direct-to-host path -- we just add the\n // two headers that path would (`Bearer` auth and `X-Org-Id`).\n const { orgId } = getActiveBackend();\n upload = (\n await axios.post<Record<string, unknown>>(\n `${active.host.replace(/\\/+$/, \"\")}${path}`,\n archive,\n {\n headers: {\n ...(await buildAutomationRequestHeaders()),\n ...headers,\n ...(active.apiKey\n ? { Authorization: `Bearer ${active.apiKey}` }\n : {}),\n ...(orgId ? { \"X-Org-Id\": orgId } : {}),\n },\n },\n )\n ).data;\n } else {\n upload = (\n await localAutomationAxios.post<Record<string, unknown>>(\n path,\n archive,\n { headers },\n )\n ).data;\n }\n\n const tarballPath = upload.tarball_path;\n if (typeof tarballPath !== \"string\" || !tarballPath) {\n throw new Error(\"The upload returned no tarball path.\");\n }\n return tarballPath;\n }\n\n // Git sync paths are literal rather than routed through\n // `getAutomationEndpoint`. That manifest describes the automation surface a\n // host may remap, and `InterfaceEndpoints` requires every key it declares --\n // adding these would break existing manifests. Git sync is a local-mode\n // operator feature outside that surface.\n static async getGitSyncStatus(): Promise<GitSyncStatus> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}/v1/git-sync/status`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<GitSyncStatus>({\n backend: active,\n method: \"GET\",\n path,\n });\n }\n\n const { data } = await localAutomationAxios.get<GitSyncStatus>(path);\n return data;\n }\n\n static async updateGitSyncConfig(\n body: GitSyncConfigUpdateRequest,\n ): Promise<GitSyncStatus> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}/v1/git-sync/config`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<GitSyncStatus>({\n backend: active,\n method: \"PUT\",\n path,\n body: body as Record<string, unknown>,\n });\n }\n\n const { data } = await localAutomationAxios.put<GitSyncStatus>(path, body);\n return data;\n }\n\n /**\n * Ask whether a configuration can reach its repo, without saving it. Takes\n * the same body as `updateGitSyncConfig` and answers for the settings that\n * body would leave in place.\n */\n static async checkGitSyncConfig(\n body: GitSyncConfigUpdateRequest,\n ): Promise<GitSyncCheckResponse> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}/v1/git-sync/check`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<GitSyncCheckResponse>({\n backend: active,\n method: \"POST\",\n path,\n body: body as Record<string, unknown>,\n });\n }\n\n const { data } = await localAutomationAxios.post<GitSyncCheckResponse>(\n path,\n body,\n );\n return data;\n }\n\n static async triggerGitSync(): Promise<GitSyncTriggerResponse> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}/v1/git-sync/sync`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<GitSyncTriggerResponse>({\n backend: active,\n method: \"POST\",\n path,\n });\n }\n\n const { data } =\n await localAutomationAxios.post<GitSyncTriggerResponse>(path);\n return data;\n }\n\n static async checkHealth(): Promise<AutomationHealthResponse> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationEndpoint(\"health\")}`;\n\n try {\n if (active.kind === \"cloud\") {\n const response = await callCloudProxy<AutomationHealthResponse>({\n backend: active,\n method: \"GET\",\n path,\n // Fail fast, matching the local branch's 5s timeout below.\n timeoutSeconds: 5,\n headers: await buildAutomationRequestHeaders(),\n });\n return response;\n }\n\n const { data } = await localAutomationAxios.get<AutomationHealthResponse>(\n path,\n { timeout: 5000 },\n );\n return data;\n } catch {\n return { status: \"error\" };\n }\n }\n}\n\nexport default AutomationService;\n"],"mappings":"gaAiDA,IAAM,EAAuB,kBAkBvB,EAAuB,EAAA,QAAM,OAAO,EAE1C,eAAe,EACb,EAAuC,CAAC,EACP,CACjC,IAAM,EAAsB,MAAM,EAAA,uBAAuB,EACzD,MAAO,CACL,GAAG,EAAA,4BACH,GAAI,EACA,EAAG,EAAA,wCAAyC,CAAoB,EAChE,CAAC,EACL,GAAG,CACL,CACF,CAEA,EAAqB,aAAa,QAAQ,IAAI,KAAO,IAAW,CAC9D,IAAM,EAAiB,MAAM,EAA8B,EAO3D,GANA,OAAO,QAAQ,CAAc,EAAE,SAAS,CAAC,EAAM,KAAW,CACxD,EAAO,QAAQ,IAAI,EAAM,CAAK,CAChC,CAAC,EAIG,EAAO,QAAS,OAAO,EAU3B,IAAM,EAAU,EAAA,yBAAyB,EACzC,GAAI,CAAC,EAAS,MAAM,IAAI,EAAA,wBAExB,EAAO,QAAU,EAAQ,KAEzB,IAAM,EAAS,EAAQ,QAAQ,KAAK,EAIpC,OAHI,GACF,EAAO,QAAQ,IAAI,oBAAqB,CAAM,EAEzC,CACT,CAAC,EAED,SAAS,EAA8B,EAAiC,CAGtE,OAFI,OAAO,GAAY,UACP,EAAQ,KACjB,GAFiC,IAG1C,CAEA,SAAS,EACP,EACe,CAIf,OAHI,OAAO,GAAa,SACf,EAA8B,CAAQ,EAG7C,EAA8B,EAAS,WAAW,GAClD,EAA8B,EAAS,OAAO,CAElD,CAEA,SAAS,EAAqB,EAAe,EAAwB,CACnE,IAAM,EAAS,IAAI,gBAGnB,OAFA,EAAO,IAAI,QAAS,OAAO,CAAK,CAAC,EACjC,EAAO,IAAI,SAAU,OAAO,CAAM,CAAC,EAC5B,EAAO,SAAS,CACzB,CAEA,SAAS,EAAqB,EAAyC,CAUrE,OATI,EAAK,QAAQ,OAAS,QACjB,CACL,KAAM,QACN,OAAQ,EAAK,QAAQ,OACrB,GAAI,EAAK,QAAQ,GACjB,GAAI,EAAK,QAAQ,QAAU,CAAE,OAAQ,EAAK,QAAQ,MAAO,CAC3D,EAGK,CACL,KAAM,OACN,SAAU,EAAK,QAAQ,SACvB,SAAU,EAAK,UAAY,EAAK,QAAQ,UAAY,KACtD,CACF,CAEA,SAAS,GAAqC,CAO5C,OALE,OAAO,OAAW,KAClB,OAAO,OAAO,YAAe,WAEtB,WAAW,OAAO,WAAW,IAE/B,WAAW,KAAK,IAAI,EAAE,GAAG,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,EAAG,EAAE,GACxE,CAEA,SAAS,EAA6B,EAAsB,CAC1D,GAAI,CAAC,EAAK,OACR,MAAU,MAAM,8CAA8C,EAGhE,GAAM,CAAE,kBAAmB,EAAA,oBAAoB,EACzC,EAAQ,EAAK,WACf,CACE,CACE,IAAK,EAAK,WACV,GAAI,EAAK,QAAU,CAAE,IAAK,EAAK,MAAO,EACtC,GAAI,CAAC,EAAK,WAAW,SAAS,KAAK,GACjC,CAAC,EAAK,WAAW,WAAW,MAAM,GAAK,CACrC,SAAU,EAAe,YAC3B,CACJ,CACF,EACA,IAAA,GAEJ,MAAO,CACL,KAAM,GAAG,IAAuB,EAAA,sBAC9B,EAAK,SAAS,OAAS,eAAiB,cAC1C,IACA,KAAM,CACJ,KAAM,EAAK,KACX,OAAQ,EAAK,OAIb,QAAS,CACP,KAAM,QACN,OAAQ,EAAe,uBACvB,GAAI,EAA2B,CACjC,EACA,GAAI,EAAK,OAAS,CAAE,MAAO,EAAK,KAAM,EACtC,GAAI,GAAS,CAAE,OAAM,EACrB,GAAI,EAAK,SAAS,QAAU,CAC1B,QAAS,EAAK,QAAQ,IAAK,IAAY,CAAE,QAAO,EAAE,CACpD,EACA,GAAI,EAAK,SAAW,MAAQ,CAAE,QAAS,EAAK,OAAQ,CACtD,CACF,CACF,CAEA,eAAe,EAAuB,EAAkB,CACtD,IAAM,EAAS,EAAQ,OAAO,KAAK,EACnC,MAAO,CACL,QAAS,EAAQ,KACjB,QAAS,MAAM,EACb,EAAS,CAAE,oBAAqB,CAAO,EAAI,CAAC,CAC9C,CACF,CACF,CAEA,eAAe,EAAwB,EAA+B,CACpE,OAAO,EACL,EAAO,MAAQ,CAAE,WAAY,EAAO,KAAM,EAAI,CAAC,CACjD,CACF,CAEA,IAAM,EAAN,MAAM,CAAkB,CACtB,aAAa,qBACX,EAA4B,EAAA,oBAAoB,EACjC,CAEf,GADe,EAAA,iBACX,EAAO,QAAQ,OAAS,QAAS,OAErC,IAAM,EAAqB,MAAM,EAAA,qCAAqC,EACtE,MAAM,EAAqB,KACzB,GAAG,EAAqB,uBACxB,CACE,gBAAiB,IAAY,UAC7B,qBAAsB,CACxB,EACA,CAAE,QAAS,GAAK,CAClB,EACI,IAAY,WAAa,GAC3B,EAAA,qCAAqC,CAAkB,CAE3D,CAEA,aAAa,eAAwC,CACnD,IAAM,EAAS,EAAA,iBAAiB,EAC1B,EAAO,GAAG,EAAqB,cAErC,GAAI,CACF,IAAI,EACJ,GAAI,EAAO,QAAQ,OAAS,QAC1B,EAAW,MAAM,EAAA,eAA6C,CAC5D,QAAS,EAAO,QAChB,OAAQ,MACR,OACA,QAAS,MAAM,EAAwB,CAAM,EAC7C,eAAgB,CAClB,CAAC,MACI,CACL,GAAM,CAAE,QACN,MAAM,EAAqB,IAAkC,EAAM,CACjE,QAAS,GACX,CAAC,EACH,EAAW,CACb,CAEA,OAAO,EAAoC,CAAQ,CACrD,MAAQ,CACN,OAAO,IACT,CACF,CAEA,aAAa,gBACX,EAA8C,CAAC,EACjB,CAC9B,GAAM,CAAE,QAAQ,GAAI,SAAS,GAAM,EAC7B,EAAS,EAAA,iBAAiB,EAAE,QAElC,GAAI,EAAO,OAAS,QAClB,OAAO,EAAA,eAAoC,CACzC,QAAS,EACT,OAAQ,MACR,KAAM,GAAG,IAAuB,EAAA,sBAAsB,MAAM,EAAE,GAAG,EAAqB,EAAO,CAAM,IACnG,QAAS,MAAM,EAA8B,CAC/C,CAAC,EAGH,GAAM,CAAE,QAAS,MAAM,EAAqB,IAC1C,GAAG,IAAuB,EAAA,sBAAsB,MAAM,IACtD,CAAE,OAAQ,CAAE,QAAO,QAAO,CAAE,CAC9B,EACA,OAAO,CACT,CAEA,aAAa,eACX,EAAQ,GACR,EAAS,EACqB,CAC9B,OAAO,EAAkB,gBAAgB,CAAE,QAAO,QAAO,CAAC,CAC5D,CAEA,aAAa,cAAc,EAAiC,CAC1D,IAAM,EAAS,EAAA,iBAAiB,EAAE,QAC5B,EAAO,GAAG,IAAuB,EAAA,wBAAwB,SAAU,CAAE,IAE3E,GAAI,EAAO,OAAS,QAClB,OAAO,EAAA,eAA2B,CAChC,QAAS,EACT,OAAQ,MACR,OACA,QAAS,MAAM,EAA8B,CAC/C,CAAC,EAGH,GAAM,CAAE,QAAS,MAAM,EAAqB,IAAgB,CAAI,EAChE,OAAO,CACT,CAEA,aAAa,iBAAiB,EAA2C,CACvE,IAAM,EAAS,EAAA,iBAAiB,EAC1B,CAAE,OAAM,QAAS,EAA6B,CAAI,EAEpD,EACJ,GAAI,EAAO,QAAQ,OAAS,QAC1B,EAAU,MAAM,EAAA,eAA2B,CACzC,QAAS,EAAO,QAChB,OAAQ,OACR,OACA,OACA,QAAS,MAAM,EAAwB,CAAM,CAC/C,CAAC,MACI,CACL,GAAM,CAAE,QAAS,MAAM,EAAqB,KAC1C,EACA,EACA,MAAM,EAAuB,EAAO,OAAO,CAC7C,EACA,EAAU,CACZ,CAEA,IAAM,EAAa,GAAG,IAAuB,EAAA,wBAAwB,SAAU,EAAQ,EAAE,IACnF,EAAkC,CACtC,QAAS,EAAqB,CAAI,EAClC,QAAS,EACX,EAEA,GAAI,CACF,GAAI,EAAO,QAAQ,OAAS,QAC1B,OAAO,MAAM,EAAA,eAA2B,CACtC,QAAS,EAAO,QAChB,OAAQ,QACR,KAAM,EACN,KAAM,EACN,QAAS,MAAM,EAAwB,CAAM,CAC/C,CAAC,EAGH,GAAM,CAAE,QAAS,MAAM,EAAqB,MAC1C,EACA,EACA,MAAM,EAAuB,EAAO,OAAO,CAC7C,EACA,OAAO,CACT,OAAS,EAAa,CACpB,GAAI,CACE,EAAO,QAAQ,OAAS,QAC1B,MAAM,EAAA,eAAwB,CAC5B,QAAS,EAAO,QAChB,OAAQ,SACR,KAAM,EACN,QAAS,MAAM,EAAwB,CAAM,CAC/C,CAAC,EAED,MAAM,EAAqB,OACzB,EACA,MAAM,EAAuB,EAAO,OAAO,CAC7C,CAEJ,OAAS,EAAc,CACrB,MAAU,eACR,CAAC,EAAa,CAAY,EAC1B,4DACF,CACF,CACA,MAAM,CACR,CACF,CAEA,aAAa,iBACX,EACA,EACqB,CACrB,IAAM,EAAS,EAAA,iBAAiB,EAAE,QAC5B,EAAO,GAAG,IAAuB,EAAA,wBAAwB,SAAU,CAAE,IAE3E,GAAI,EAAO,OAAS,QAClB,OAAO,EAAA,eAA2B,CAChC,QAAS,EACT,OAAQ,QACR,OACM,OACN,QAAS,MAAM,EAA8B,CAC/C,CAAC,EAGH,GAAM,CAAE,QAAS,MAAM,EAAqB,MAAkB,EAAM,CAAI,EACxE,OAAO,CACT,CAEA,aAAa,iBAAiB,EAA2B,CACvD,IAAM,EAAS,EAAA,iBAAiB,EAAE,QAC5B,EAAO,GAAG,IAAuB,EAAA,wBAAwB,SAAU,CAAE,IAE3E,GAAI,EAAO,OAAS,QAAS,CAC3B,MAAM,EAAA,eAAwB,CAC5B,QAAS,EACT,OAAQ,SACR,OACA,QAAS,MAAM,EAA8B,CAC/C,CAAC,EACD,MACF,CAEA,MAAM,EAAqB,OAAO,CAAI,CACxC,CAEA,aAAa,mBAAmB,EAAoC,CAClE,IAAM,EAAS,EAAA,iBAAiB,EAAE,QAC5B,EAAO,GAAG,IAAuB,EAAA,wBAAwB,WAAY,CAAE,IAE7E,GAAI,EAAO,OAAS,QAClB,OAAO,EAAA,eAA8B,CACnC,QAAS,EACT,OAAQ,OACR,OACA,QAAS,MAAM,EAA8B,CAC/C,CAAC,EAGH,GAAM,CAAE,QAAS,MAAM,EAAqB,KAAoB,CAAI,EACpE,OAAO,CACT,CAMA,aAAa,oBAAoB,EAAuC,CACtE,IAAM,EAAS,EAAA,iBAAiB,EAAE,QAC5B,EAAO,GAAG,EAAqB,WAAW,mBAAmB,CAAK,EAAE,SAE1E,GAAI,EAAO,OAAS,QAClB,OAAO,EAAA,eAA8B,CACnC,QAAS,EACT,OAAQ,OACR,OACA,QAAS,MAAM,EAA8B,CAC/C,CAAC,EAGH,GAAM,CAAE,QAAS,MAAM,EAAqB,KAAoB,CAAI,EACpE,OAAO,CACT,CAEA,aAAa,mBACX,EACA,EAA8C,CAAC,EACd,CACjC,GAAM,CAAE,QAAQ,GAAI,SAAS,GAAM,EAC7B,EAAS,EAAA,iBAAiB,EAAE,QAC5B,EAAW,GAAG,IAAuB,EAAA,wBAAwB,OAAQ,CAAE,IAE7E,GAAI,EAAO,OAAS,QAClB,OAAO,EAAA,eAAuC,CAC5C,QAAS,EACT,OAAQ,MACR,KAAM,GAAG,EAAS,GAAG,EAAqB,EAAO,CAAM,IACvD,QAAS,MAAM,EAA8B,CAC/C,CAAC,EAGH,GAAM,CAAE,QAAS,MAAM,EAAqB,IAC1C,EACA,CAAE,OAAQ,CAAE,QAAO,QAAO,CAAE,CAC9B,EACA,OAAO,CACT,CAEA,aAAa,kBACX,EACA,EAAQ,GACR,EAAS,EACwB,CACjC,OAAO,EAAkB,mBAAmB,EAAI,CAAE,QAAO,QAAO,CAAC,CACnE,CAEA,aAAa,iBACX,EACA,EACqB,CACrB,OAAO,EAAkB,iBAAiB,EAAI,CAAE,SAAQ,CAAC,CAC3D,CAEA,aAAa,gBAAgB,EAAY,EAA6B,CACpE,IAAM,EAAS,EAAA,iBAAiB,EAAE,QAC5B,EAAO,GAAG,IAAuB,EAAA,wBAAwB,UAAW,CAAE,IAExE,EACJ,GAAI,EAAO,OAAS,QAClB,EAAO,MAAM,EAAA,eAAqB,CAChC,QAAS,EACT,OAAQ,MACR,OACA,aAAc,OACd,QAAS,MAAM,EAA8B,CAC/C,CAAC,MACI,CACL,GAAM,CAAE,QAAS,MAAM,EAAqB,IAAU,EAAM,CAC1D,aAAc,MAChB,CAAC,EACD,EAAO,CACT,CAEA,IAAM,EAAM,IAAI,gBAAgB,CAAI,EAC9B,EAAI,SAAS,cAAc,GAAG,EACpC,EAAE,KAAO,EACT,EAAE,SAAW,GAAG,EAAK,MACrB,EAAE,MAAM,EACR,IAAI,gBAAgB,CAAG,CACzB,CAQA,aAAa,iBAAmD,CAC9D,IAAM,EAAS,EAAA,iBAAiB,EAAE,QAC5B,EAAO,GAAG,IAAuB,EAAA,sBAAsB,cAAc,IAE3E,GAAI,EAAO,OAAS,QAClB,OAAO,EAAA,eAAuC,CAC5C,QAAS,EACT,OAAQ,MACR,OACA,QAAS,MAAM,EAA8B,CAC/C,CAAC,EAGH,GAAM,CAAE,QACN,MAAM,EAAqB,IAA4B,CAAI,EAC7D,OAAO,CACT,CAMA,aAAa,cACX,EACgC,CAChC,IAAM,EAAS,EAAA,iBAAiB,EAAE,QAC5B,EAAO,GAAG,IAAuB,EAAA,sBAAsB,UAAU,IAEvE,GAAI,EAAO,OAAS,QAClB,OAAO,EAAA,eAAsC,CAC3C,QAAS,EACT,OAAQ,OACR,OACA,OACA,QAAS,MAAM,EAA8B,CAC/C,CAAC,EAGH,GAAM,CAAE,QAAS,MAAM,EAAqB,KAC1C,EACA,CACF,EACA,OAAO,CACT,CAQA,aAAa,sBACX,EAEA,EACA,EACkC,CAClC,IAAM,EAAS,EAAA,iBAAiB,EAAE,QAC5B,EAAO,GAAG,IAAuB,EAAA,yBACrC,EACA,CACF,IAEA,GAAI,EAAO,OAAS,QAClB,OAAO,EAAA,eAAwC,CAC7C,QAAS,EACT,OAAQ,OACR,OACA,OACA,QAAS,MAAM,EAA8B,CAC/C,CAAC,EAGH,GAAM,CAAE,QAAS,MAAM,EAAqB,KAC1C,EACA,CACF,EACA,OAAO,CACT,CAUA,aAAa,wBACX,EACA,EACiB,CACjB,IAAM,EAAS,EAAA,iBAAiB,EAAE,QAC5B,EACJ,GAAG,IAAuB,EAAA,yBAAyB,EAAA,QAC1C,mBAAmB,CAAI,IAC5B,EAAU,CAAE,eAAgB,kBAAmB,EAEjD,EACJ,GAAI,EAAO,OAAS,QAAS,CAU3B,GAAM,CAAE,SAAU,EAAA,iBAAiB,EACnC,GACE,MAAM,EAAA,QAAM,KACV,GAAG,EAAO,KAAK,QAAQ,OAAQ,EAAE,IAAI,IACrC,EACA,CACE,QAAS,CACP,GAAI,MAAM,EAA8B,EACxC,GAAG,EACH,GAAI,EAAO,OACP,CAAE,cAAe,UAAU,EAAO,QAAS,EAC3C,CAAC,EACL,GAAI,EAAQ,CAAE,WAAY,CAAM,EAAI,CAAC,CACvC,CACF,CACF,GACA,IACJ,MACE,GACE,MAAM,EAAqB,KACzB,EACA,EACA,CAAE,SAAQ,CACZ,GACA,KAGJ,IAAM,EAAc,EAAO,aAC3B,GAAI,OAAO,GAAgB,UAAY,CAAC,EACtC,MAAU,MAAM,sCAAsC,EAExD,OAAO,CACT,CAOA,aAAa,kBAA2C,CACtD,IAAM,EAAS,EAAA,iBAAiB,EAAE,QAC5B,EAAO,GAAG,EAAqB,qBAErC,GAAI,EAAO,OAAS,QAClB,OAAO,EAAA,eAA8B,CACnC,QAAS,EACT,OAAQ,MACR,MACF,CAAC,EAGH,GAAM,CAAE,QAAS,MAAM,EAAqB,IAAmB,CAAI,EACnE,OAAO,CACT,CAEA,aAAa,oBACX,EACwB,CACxB,IAAM,EAAS,EAAA,iBAAiB,EAAE,QAC5B,EAAO,GAAG,EAAqB,qBAErC,GAAI,EAAO,OAAS,QAClB,OAAO,EAAA,eAA8B,CACnC,QAAS,EACT,OAAQ,MACR,OACM,MACR,CAAC,EAGH,GAAM,CAAE,QAAS,MAAM,EAAqB,IAAmB,EAAM,CAAI,EACzE,OAAO,CACT,CAOA,aAAa,mBACX,EAC+B,CAC/B,IAAM,EAAS,EAAA,iBAAiB,EAAE,QAC5B,EAAO,GAAG,EAAqB,oBAErC,GAAI,EAAO,OAAS,QAClB,OAAO,EAAA,eAAqC,CAC1C,QAAS,EACT,OAAQ,OACR,OACM,MACR,CAAC,EAGH,GAAM,CAAE,QAAS,MAAM,EAAqB,KAC1C,EACA,CACF,EACA,OAAO,CACT,CAEA,aAAa,gBAAkD,CAC7D,IAAM,EAAS,EAAA,iBAAiB,EAAE,QAC5B,EAAO,GAAG,EAAqB,mBAErC,GAAI,EAAO,OAAS,QAClB,OAAO,EAAA,eAAuC,CAC5C,QAAS,EACT,OAAQ,OACR,MACF,CAAC,EAGH,GAAM,CAAE,QACN,MAAM,EAAqB,KAA6B,CAAI,EAC9D,OAAO,CACT,CAEA,aAAa,aAAiD,CAC5D,IAAM,EAAS,EAAA,iBAAiB,EAAE,QAC5B,EAAO,GAAG,IAAuB,EAAA,sBAAsB,QAAQ,IAErE,GAAI,CACF,GAAI,EAAO,OAAS,QASlB,OAAO,MARgB,EAAA,eAAyC,CAC9D,QAAS,EACT,OAAQ,MACR,OAEA,eAAgB,EAChB,QAAS,MAAM,EAA8B,CAC/C,CAAC,EAIH,GAAM,CAAE,QAAS,MAAM,EAAqB,IAC1C,EACA,CAAE,QAAS,GAAK,CAClB,EACA,OAAO,CACT,MAAQ,CACN,MAAO,CAAE,OAAQ,OAAQ,CAC3B,CACF,CACF"}
@@ -50,8 +50,8 @@ declare class AutomationService {
50
50
  * one request.
51
51
  */
52
52
  static createAutomationDraft(body: SetupRequestBody,
53
- /** The entry the draft came from, which decides the create endpoint. */
54
- entry?: SetupEntry): Promise<Record<string, unknown>>;
53
+ /** The entry and selected action decide the create endpoint. */
54
+ entry?: SetupEntry, selectedAction?: string | null): Promise<Record<string, unknown>>;
55
55
  /**
56
56
  * Upload a packed bundle, and return the `oh-internal://` path the create
57
57
  * call references.
@@ -296,17 +296,17 @@ var D = class t {
296
296
  let { data: i } = await _.post(r, t);
297
297
  return i;
298
298
  }
299
- static async createAutomationDraft(t, n) {
300
- let r = e().backend, i = `${g}${m(n)}`;
301
- if (r.kind === "cloud") return u({
302
- backend: r,
299
+ static async createAutomationDraft(t, n, r) {
300
+ let i = e().backend, a = `${g}${m(n, r)}`;
301
+ if (i.kind === "cloud") return u({
302
+ backend: i,
303
303
  method: "POST",
304
- path: i,
304
+ path: a,
305
305
  body: t,
306
306
  headers: await v()
307
307
  });
308
- let { data: a } = await _.post(i, t);
309
- return a;
308
+ let { data: o } = await _.post(a, t);
309
+ return o;
310
310
  }
311
311
  static async uploadAutomationTarball(t, n) {
312
312
  let i = e().backend, a = `${g}${h()}?name=${encodeURIComponent(t)}`, o = { "Content-Type": "application/gzip" }, s;
@@ -1 +1 @@
1
- {"version":3,"file":"automation-service.api.js","names":[],"sources":["../../../src/api/automation-service/automation-service.api.ts"],"sourcesContent":["import axios from \"axios\";\nimport {\n clearPendingLocalTelemetryRevocation,\n getTelemetryConsent,\n getTelemetryDistinctId,\n getTelemetryDistinctIdForConsentSync,\n type TelemetryConsent,\n} from \"#/services/telemetry\";\nimport type {\n Automation,\n AutomationRun,\n AutomationSpec,\n AutomationTrigger,\n AutomationsResponse,\n AutomationRunsResponse,\n} from \"#/types/automation\";\nimport type {\n GitSyncCheckResponse,\n GitSyncConfigUpdateRequest,\n GitSyncStatus,\n GitSyncTriggerResponse,\n} from \"#/types/git-sync\";\nimport {\n automationCreateEndpoint,\n automationUploadEndpoint,\n} from \"#/manifests/automation-setup\";\nimport {\n getAutomationEndpoint,\n getAutomationIdEndpoint,\n getImportExportSpec,\n} from \"#/manifests/automation-interface\";\nimport type {\n DeploymentCapabilities,\n SetupEntry,\n SetupRequestBody,\n ValidateDraftResponse,\n} from \"#/manifests/types\";\nimport type { Backend, ResolvedActiveBackend } from \"../backend-registry/types\";\nimport {\n getActiveBackend,\n getEffectiveLocalBackend,\n} from \"../backend-registry/active-store\";\nimport { NoBackendAvailableError } from \"../agent-server-client-options\";\nimport { callCloudProxy } from \"../cloud/proxy\";\nimport {\n AGENT_CANVAS_CLIENT_HEADERS,\n OPENHANDS_TELEMETRY_DISTINCT_ID_HEADER,\n} from \"../client-source\";\n\nconst AUTOMATION_BASE_PATH = \"/api/automation\";\n\nexport interface AutomationHealthResponse {\n status: \"ok\" | \"error\";\n message?: string;\n}\n\ntype AutomationSdkVersionResponse =\n | string\n | {\n sdk_version?: unknown;\n version?: unknown;\n };\n\n// Local automation calls go to the automation sidecar that\n// `scripts/dev-with-automation.mjs` mounts behind the local agent-server.\n// Both backends use the same session API key and the same `X-Session-API-Key`\n// header for consistency.\nconst localAutomationAxios = axios.create();\n\nasync function buildAutomationRequestHeaders(\n extraHeaders: Record<string, string> = {},\n): Promise<Record<string, string>> {\n const telemetryDistinctId = await getTelemetryDistinctId();\n return {\n ...AGENT_CANVAS_CLIENT_HEADERS,\n ...(telemetryDistinctId\n ? { [OPENHANDS_TELEMETRY_DISTINCT_ID_HEADER]: telemetryDistinctId }\n : {}),\n ...extraHeaders,\n };\n}\n\nlocalAutomationAxios.interceptors.request.use(async (config) => {\n const requestHeaders = await buildAutomationRequestHeaders();\n Object.entries(requestHeaders).forEach(([name, value]) => {\n config.headers.set(name, value);\n });\n\n // Import uses an explicit baseURL/header pair so its POST, PATCH, and\n // cleanup stay pinned to the backend selected when the mutation started.\n if (config.baseURL) return config;\n\n // Resolve the local backend on every call so it tracks the\n // currently-active local backend (and any host/key edits made via the\n // manage-backends UI), rather than freezing whatever value the\n // agent-server-config produced at module load time.\n // Using the backend registry (rather than the build-time VITE_SESSION_API_KEY\n // env var) ensures the published npm package picks up the runtime-injected\n // session key that scripts/static-server.mjs seeds into localStorage, fixing\n // the 401 errors reported in issue #829.\n const backend = getEffectiveLocalBackend();\n if (!backend) throw new NoBackendAvailableError();\n // eslint-disable-next-line no-param-reassign\n config.baseURL = backend.host;\n\n const apiKey = backend.apiKey?.trim();\n if (apiKey) {\n config.headers.set(\"X-Session-API-Key\", apiKey);\n }\n return config;\n});\n\nfunction normalizeAutomationSdkVersion(version: unknown): string | null {\n if (typeof version !== \"string\") return null;\n const trimmed = version.trim();\n return trimmed || null;\n}\n\nfunction getAutomationSdkVersionFromResponse(\n response: AutomationSdkVersionResponse,\n): string | null {\n if (typeof response === \"string\") {\n return normalizeAutomationSdkVersion(response);\n }\n return (\n normalizeAutomationSdkVersion(response.sdk_version) ??\n normalizeAutomationSdkVersion(response.version)\n );\n}\n\nfunction buildPaginationQuery(limit: number, offset: number): string {\n const params = new URLSearchParams();\n params.set(\"limit\", String(limit));\n params.set(\"offset\", String(offset));\n return params.toString();\n}\n\nfunction buildImportedTrigger(spec: AutomationSpec): AutomationTrigger {\n if (spec.trigger.type === \"event\") {\n return {\n type: \"event\",\n source: spec.trigger.source,\n on: spec.trigger.on,\n ...(spec.trigger.filter && { filter: spec.trigger.filter }),\n };\n }\n\n return {\n type: \"cron\",\n schedule: spec.trigger.schedule,\n timezone: spec.timezone ?? spec.trigger.timezone ?? \"UTC\",\n };\n}\n\nfunction generatePendingImportEvent(): string {\n if (\n typeof crypto !== \"undefined\" &&\n typeof crypto.randomUUID === \"function\"\n ) {\n return `pending.${crypto.randomUUID()}`;\n }\n return `pending.${Date.now()}.${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction buildCreateAutomationRequest(spec: AutomationSpec) {\n if (!spec.prompt) {\n throw new Error(\"An automation prompt is required for import.\");\n }\n\n const { importDefaults } = getImportExportSpec();\n const repos = spec.repository\n ? [\n {\n url: spec.repository,\n ...(spec.branch && { ref: spec.branch }),\n ...(!spec.repository.includes(\"://\") &&\n !spec.repository.startsWith(\"git@\") && {\n provider: importDefaults.repoProvider,\n }),\n },\n ]\n : undefined;\n\n return {\n path: `${AUTOMATION_BASE_PATH}${getAutomationEndpoint(\n spec.plugins?.length ? \"createPlugin\" : \"createPrompt\",\n )}`,\n body: {\n name: spec.name,\n prompt: spec.prompt,\n // Preset creation defaults to enabled. A unique event trigger keeps the\n // new record inert until the real trigger and disabled state are applied\n // together in the follow-up PATCH.\n trigger: {\n type: \"event\",\n source: importDefaults.placeholderEventSource,\n on: generatePendingImportEvent(),\n },\n ...(spec.model && { model: spec.model }),\n ...(repos && { repos }),\n ...(spec.plugins?.length && {\n plugins: spec.plugins.map((source) => ({ source })),\n }),\n ...(spec.timeout != null && { timeout: spec.timeout }),\n },\n };\n}\n\nasync function buildPinnedLocalConfig(backend: Backend) {\n const apiKey = backend.apiKey.trim();\n return {\n baseURL: backend.host,\n headers: await buildAutomationRequestHeaders(\n apiKey ? { \"X-Session-API-Key\": apiKey } : {},\n ),\n };\n}\n\nasync function buildPinnedCloudHeaders(active: ResolvedActiveBackend) {\n return buildAutomationRequestHeaders(\n active.orgId ? { \"X-Org-Id\": active.orgId } : {},\n );\n}\n\nclass AutomationService {\n static async syncTelemetryConsent(\n consent: TelemetryConsent = getTelemetryConsent(),\n ): Promise<void> {\n const active = getActiveBackend();\n if (active.backend.kind !== \"local\") return;\n\n const frontendDistinctId = await getTelemetryDistinctIdForConsentSync();\n await localAutomationAxios.post(\n `${AUTOMATION_BASE_PATH}/v1/telemetry/consent`,\n {\n consent_granted: consent === \"granted\",\n frontend_distinct_id: frontendDistinctId,\n },\n { timeout: 5000 },\n );\n if (consent !== \"granted\" && frontendDistinctId) {\n clearPendingLocalTelemetryRevocation(frontendDistinctId);\n }\n }\n\n static async getSdkVersion(): Promise<string | null> {\n const active = getActiveBackend();\n const path = `${AUTOMATION_BASE_PATH}/sdk-version`;\n\n try {\n let response: AutomationSdkVersionResponse;\n if (active.backend.kind === \"cloud\") {\n response = await callCloudProxy<AutomationSdkVersionResponse>({\n backend: active.backend,\n method: \"GET\",\n path,\n headers: await buildPinnedCloudHeaders(active),\n timeoutSeconds: 5,\n });\n } else {\n const { data } =\n await localAutomationAxios.get<AutomationSdkVersionResponse>(path, {\n timeout: 5000,\n });\n response = data;\n }\n\n return getAutomationSdkVersionFromResponse(response);\n } catch {\n return null;\n }\n }\n\n static async listAutomations(\n params: { limit?: number; offset?: number } = {},\n ): Promise<AutomationsResponse> {\n const { limit = 50, offset = 0 } = params;\n const active = getActiveBackend().backend;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<AutomationsResponse>({\n backend: active,\n method: \"GET\",\n path: `${AUTOMATION_BASE_PATH}${getAutomationEndpoint(\"list\")}?${buildPaginationQuery(limit, offset)}`,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.get<AutomationsResponse>(\n `${AUTOMATION_BASE_PATH}${getAutomationEndpoint(\"list\")}`,\n { params: { limit, offset } },\n );\n return data;\n }\n\n static async getAutomations(\n limit = 50,\n offset = 0,\n ): Promise<AutomationsResponse> {\n return AutomationService.listAutomations({ limit, offset });\n }\n\n static async getAutomation(id: string): Promise<Automation> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"detail\", id)}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<Automation>({\n backend: active,\n method: \"GET\",\n path,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.get<Automation>(path);\n return data;\n }\n\n static async createAutomation(spec: AutomationSpec): Promise<Automation> {\n const active = getActiveBackend();\n const { path, body } = buildCreateAutomationRequest(spec);\n\n let created: Automation;\n if (active.backend.kind === \"cloud\") {\n created = await callCloudProxy<Automation>({\n backend: active.backend,\n method: \"POST\",\n path,\n body,\n headers: await buildPinnedCloudHeaders(active),\n });\n } else {\n const { data } = await localAutomationAxios.post<Automation>(\n path,\n body,\n await buildPinnedLocalConfig(active.backend),\n );\n created = data;\n }\n\n const updatePath = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"detail\", created.id)}`;\n const updateBody: Partial<Automation> = {\n trigger: buildImportedTrigger(spec),\n enabled: false,\n };\n\n try {\n if (active.backend.kind === \"cloud\") {\n return await callCloudProxy<Automation>({\n backend: active.backend,\n method: \"PATCH\",\n path: updatePath,\n body: updateBody,\n headers: await buildPinnedCloudHeaders(active),\n });\n }\n\n const { data } = await localAutomationAxios.patch<Automation>(\n updatePath,\n updateBody,\n await buildPinnedLocalConfig(active.backend),\n );\n return data;\n } catch (updateError) {\n try {\n if (active.backend.kind === \"cloud\") {\n await callCloudProxy<unknown>({\n backend: active.backend,\n method: \"DELETE\",\n path: updatePath,\n headers: await buildPinnedCloudHeaders(active),\n });\n } else {\n await localAutomationAxios.delete(\n updatePath,\n await buildPinnedLocalConfig(active.backend),\n );\n }\n } catch (cleanupError) {\n throw new AggregateError(\n [updateError, cleanupError],\n \"Failed to disable the imported automation and clean it up.\",\n );\n }\n throw updateError;\n }\n }\n\n static async updateAutomation(\n id: string,\n body: Partial<Automation>,\n ): Promise<Automation> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"detail\", id)}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<Automation>({\n backend: active,\n method: \"PATCH\",\n path,\n body: body as Record<string, unknown>,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.patch<Automation>(path, body);\n return data;\n }\n\n static async deleteAutomation(id: string): Promise<void> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"detail\", id)}`;\n\n if (active.kind === \"cloud\") {\n await callCloudProxy<unknown>({\n backend: active,\n method: \"DELETE\",\n path,\n headers: await buildAutomationRequestHeaders(),\n });\n return;\n }\n\n await localAutomationAxios.delete(path);\n }\n\n static async dispatchAutomation(id: string): Promise<AutomationRun> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"dispatch\", id)}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<AutomationRun>({\n backend: active,\n method: \"POST\",\n path,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.post<AutomationRun>(path);\n return data;\n }\n\n /**\n * Cancel a pending or running automation run.\n * Backend: POST /api/automation/v1/runs/{run_id}/cancel\n */\n static async cancelAutomationRun(runId: string): Promise<AutomationRun> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}/v1/runs/${encodeURIComponent(runId)}/cancel`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<AutomationRun>({\n backend: active,\n method: \"POST\",\n path,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.post<AutomationRun>(path);\n return data;\n }\n\n static async listAutomationRuns(\n id: string,\n params: { limit?: number; offset?: number } = {},\n ): Promise<AutomationRunsResponse> {\n const { limit = 50, offset = 0 } = params;\n const active = getActiveBackend().backend;\n const basePath = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"runs\", id)}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<AutomationRunsResponse>({\n backend: active,\n method: \"GET\",\n path: `${basePath}?${buildPaginationQuery(limit, offset)}`,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.get<AutomationRunsResponse>(\n basePath,\n { params: { limit, offset } },\n );\n return data;\n }\n\n static async getAutomationRuns(\n id: string,\n limit = 50,\n offset = 0,\n ): Promise<AutomationRunsResponse> {\n return AutomationService.listAutomationRuns(id, { limit, offset });\n }\n\n static async toggleAutomation(\n id: string,\n enabled: boolean,\n ): Promise<Automation> {\n return AutomationService.updateAutomation(id, { enabled });\n }\n\n static async downloadTarball(id: string, name: string): Promise<void> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"tarball\", id)}`;\n\n let blob: Blob;\n if (active.kind === \"cloud\") {\n blob = await callCloudProxy<Blob>({\n backend: active,\n method: \"GET\",\n path,\n responseType: \"blob\",\n headers: await buildAutomationRequestHeaders(),\n });\n } else {\n const { data } = await localAutomationAxios.get<Blob>(path, {\n responseType: \"blob\",\n });\n blob = data;\n }\n\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `${name}.tar`;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n /**\n * Ask what this deployment supports, before a setup form renders.\n *\n * The setup endpoints answer a contract authored in `OpenHands/extensions`,\n * so their bodies are camelCase where the rest of this service is snake_case.\n */\n static async getCapabilities(): Promise<DeploymentCapabilities> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationEndpoint(\"capabilities\")}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<DeploymentCapabilities>({\n backend: active,\n method: \"GET\",\n path,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } =\n await localAutomationAxios.get<DeploymentCapabilities>(path);\n return data;\n }\n\n /**\n * Validate a draft without creating it. An invalid draft is a 200 carrying\n * field-addressed errors; only a malformed envelope is a 4xx.\n */\n static async validateDraft(\n body: SetupRequestBody,\n ): Promise<ValidateDraftResponse> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationEndpoint(\"validate\")}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<ValidateDraftResponse>({\n backend: active,\n method: \"POST\",\n path,\n body,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.post<ValidateDraftResponse>(\n path,\n body,\n );\n return data;\n }\n\n /**\n * Create from a draft a setup form derived. Unlike {@link\n * AutomationService.createAutomation}, which exists for import and has to\n * park the record on a placeholder trigger, this sends the finished record in\n * one request.\n */\n static async createAutomationDraft(\n body: SetupRequestBody,\n /** The entry the draft came from, which decides the create endpoint. */\n entry?: SetupEntry,\n ): Promise<Record<string, unknown>> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${automationCreateEndpoint(entry)}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<Record<string, unknown>>({\n backend: active,\n method: \"POST\",\n path,\n body,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.post<Record<string, unknown>>(\n path,\n body,\n );\n return data;\n }\n\n /**\n * Upload a packed bundle, and return the `oh-internal://` path the create\n * call references.\n *\n * The body is the archive itself rather than a multipart form - the service\n * streams it and takes its metadata from the query string, so it never has\n * to buffer the whole file to start writing.\n */\n static async uploadAutomationTarball(\n name: string,\n archive: Uint8Array,\n ): Promise<string> {\n const active = getActiveBackend().backend;\n const path =\n `${AUTOMATION_BASE_PATH}${automationUploadEndpoint()}` +\n `?name=${encodeURIComponent(name)}`;\n const headers = { \"Content-Type\": \"application/gzip\" };\n\n let upload: Record<string, unknown>;\n if (active.kind === \"cloud\") {\n // Post the archive straight to the cloud host rather than through the\n // cloud client: that client JSON-serializes any non-FormData body, which\n // would turn the gzip `Uint8Array` into `{\"0\":31,...}` even though the\n // header says `application/gzip`. Axios preserves the raw bytes (its\n // `transformRequest` sends the underlying buffer), so the service still\n // receives the archive as the stream it expects, with metadata in the\n // query string. This upload sets no host override, so a direct call\n // matches the cloud client's own direct-to-host path -- we just add the\n // two headers that path would (`Bearer` auth and `X-Org-Id`).\n const { orgId } = getActiveBackend();\n upload = (\n await axios.post<Record<string, unknown>>(\n `${active.host.replace(/\\/+$/, \"\")}${path}`,\n archive,\n {\n headers: {\n ...(await buildAutomationRequestHeaders()),\n ...headers,\n ...(active.apiKey\n ? { Authorization: `Bearer ${active.apiKey}` }\n : {}),\n ...(orgId ? { \"X-Org-Id\": orgId } : {}),\n },\n },\n )\n ).data;\n } else {\n upload = (\n await localAutomationAxios.post<Record<string, unknown>>(\n path,\n archive,\n { headers },\n )\n ).data;\n }\n\n const tarballPath = upload.tarball_path;\n if (typeof tarballPath !== \"string\" || !tarballPath) {\n throw new Error(\"The upload returned no tarball path.\");\n }\n return tarballPath;\n }\n\n // Git sync paths are literal rather than routed through\n // `getAutomationEndpoint`. That manifest describes the automation surface a\n // host may remap, and `InterfaceEndpoints` requires every key it declares --\n // adding these would break existing manifests. Git sync is a local-mode\n // operator feature outside that surface.\n static async getGitSyncStatus(): Promise<GitSyncStatus> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}/v1/git-sync/status`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<GitSyncStatus>({\n backend: active,\n method: \"GET\",\n path,\n });\n }\n\n const { data } = await localAutomationAxios.get<GitSyncStatus>(path);\n return data;\n }\n\n static async updateGitSyncConfig(\n body: GitSyncConfigUpdateRequest,\n ): Promise<GitSyncStatus> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}/v1/git-sync/config`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<GitSyncStatus>({\n backend: active,\n method: \"PUT\",\n path,\n body: body as Record<string, unknown>,\n });\n }\n\n const { data } = await localAutomationAxios.put<GitSyncStatus>(path, body);\n return data;\n }\n\n /**\n * Ask whether a configuration can reach its repo, without saving it. Takes\n * the same body as `updateGitSyncConfig` and answers for the settings that\n * body would leave in place.\n */\n static async checkGitSyncConfig(\n body: GitSyncConfigUpdateRequest,\n ): Promise<GitSyncCheckResponse> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}/v1/git-sync/check`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<GitSyncCheckResponse>({\n backend: active,\n method: \"POST\",\n path,\n body: body as Record<string, unknown>,\n });\n }\n\n const { data } = await localAutomationAxios.post<GitSyncCheckResponse>(\n path,\n body,\n );\n return data;\n }\n\n static async triggerGitSync(): Promise<GitSyncTriggerResponse> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}/v1/git-sync/sync`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<GitSyncTriggerResponse>({\n backend: active,\n method: \"POST\",\n path,\n });\n }\n\n const { data } =\n await localAutomationAxios.post<GitSyncTriggerResponse>(path);\n return data;\n }\n\n static async checkHealth(): Promise<AutomationHealthResponse> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationEndpoint(\"health\")}`;\n\n try {\n if (active.kind === \"cloud\") {\n const response = await callCloudProxy<AutomationHealthResponse>({\n backend: active,\n method: \"GET\",\n path,\n // Fail fast, matching the local branch's 5s timeout below.\n timeoutSeconds: 5,\n headers: await buildAutomationRequestHeaders(),\n });\n return response;\n }\n\n const { data } = await localAutomationAxios.get<AutomationHealthResponse>(\n path,\n { timeout: 5000 },\n );\n return data;\n } catch {\n return { status: \"error\" };\n }\n }\n}\n\nexport default AutomationService;\n"],"mappings":"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"}
1
+ {"version":3,"file":"automation-service.api.js","names":[],"sources":["../../../src/api/automation-service/automation-service.api.ts"],"sourcesContent":["import axios from \"axios\";\nimport {\n clearPendingLocalTelemetryRevocation,\n getTelemetryConsent,\n getTelemetryDistinctId,\n getTelemetryDistinctIdForConsentSync,\n type TelemetryConsent,\n} from \"#/services/telemetry\";\nimport type {\n Automation,\n AutomationRun,\n AutomationSpec,\n AutomationTrigger,\n AutomationsResponse,\n AutomationRunsResponse,\n} from \"#/types/automation\";\nimport type {\n GitSyncCheckResponse,\n GitSyncConfigUpdateRequest,\n GitSyncStatus,\n GitSyncTriggerResponse,\n} from \"#/types/git-sync\";\nimport {\n automationCreateEndpoint,\n automationUploadEndpoint,\n} from \"#/manifests/automation-setup\";\nimport {\n getAutomationEndpoint,\n getAutomationIdEndpoint,\n getImportExportSpec,\n} from \"#/manifests/automation-interface\";\nimport type {\n DeploymentCapabilities,\n SetupEntry,\n SetupRequestBody,\n ValidateDraftResponse,\n} from \"#/manifests/types\";\nimport type { Backend, ResolvedActiveBackend } from \"../backend-registry/types\";\nimport {\n getActiveBackend,\n getEffectiveLocalBackend,\n} from \"../backend-registry/active-store\";\nimport { NoBackendAvailableError } from \"../agent-server-client-options\";\nimport { callCloudProxy } from \"../cloud/proxy\";\nimport {\n AGENT_CANVAS_CLIENT_HEADERS,\n OPENHANDS_TELEMETRY_DISTINCT_ID_HEADER,\n} from \"../client-source\";\n\nconst AUTOMATION_BASE_PATH = \"/api/automation\";\n\nexport interface AutomationHealthResponse {\n status: \"ok\" | \"error\";\n message?: string;\n}\n\ntype AutomationSdkVersionResponse =\n | string\n | {\n sdk_version?: unknown;\n version?: unknown;\n };\n\n// Local automation calls go to the automation sidecar that\n// `scripts/dev-with-automation.mjs` mounts behind the local agent-server.\n// Both backends use the same session API key and the same `X-Session-API-Key`\n// header for consistency.\nconst localAutomationAxios = axios.create();\n\nasync function buildAutomationRequestHeaders(\n extraHeaders: Record<string, string> = {},\n): Promise<Record<string, string>> {\n const telemetryDistinctId = await getTelemetryDistinctId();\n return {\n ...AGENT_CANVAS_CLIENT_HEADERS,\n ...(telemetryDistinctId\n ? { [OPENHANDS_TELEMETRY_DISTINCT_ID_HEADER]: telemetryDistinctId }\n : {}),\n ...extraHeaders,\n };\n}\n\nlocalAutomationAxios.interceptors.request.use(async (config) => {\n const requestHeaders = await buildAutomationRequestHeaders();\n Object.entries(requestHeaders).forEach(([name, value]) => {\n config.headers.set(name, value);\n });\n\n // Import uses an explicit baseURL/header pair so its POST, PATCH, and\n // cleanup stay pinned to the backend selected when the mutation started.\n if (config.baseURL) return config;\n\n // Resolve the local backend on every call so it tracks the\n // currently-active local backend (and any host/key edits made via the\n // manage-backends UI), rather than freezing whatever value the\n // agent-server-config produced at module load time.\n // Using the backend registry (rather than the build-time VITE_SESSION_API_KEY\n // env var) ensures the published npm package picks up the runtime-injected\n // session key that scripts/static-server.mjs seeds into localStorage, fixing\n // the 401 errors reported in issue #829.\n const backend = getEffectiveLocalBackend();\n if (!backend) throw new NoBackendAvailableError();\n // eslint-disable-next-line no-param-reassign\n config.baseURL = backend.host;\n\n const apiKey = backend.apiKey?.trim();\n if (apiKey) {\n config.headers.set(\"X-Session-API-Key\", apiKey);\n }\n return config;\n});\n\nfunction normalizeAutomationSdkVersion(version: unknown): string | null {\n if (typeof version !== \"string\") return null;\n const trimmed = version.trim();\n return trimmed || null;\n}\n\nfunction getAutomationSdkVersionFromResponse(\n response: AutomationSdkVersionResponse,\n): string | null {\n if (typeof response === \"string\") {\n return normalizeAutomationSdkVersion(response);\n }\n return (\n normalizeAutomationSdkVersion(response.sdk_version) ??\n normalizeAutomationSdkVersion(response.version)\n );\n}\n\nfunction buildPaginationQuery(limit: number, offset: number): string {\n const params = new URLSearchParams();\n params.set(\"limit\", String(limit));\n params.set(\"offset\", String(offset));\n return params.toString();\n}\n\nfunction buildImportedTrigger(spec: AutomationSpec): AutomationTrigger {\n if (spec.trigger.type === \"event\") {\n return {\n type: \"event\",\n source: spec.trigger.source,\n on: spec.trigger.on,\n ...(spec.trigger.filter && { filter: spec.trigger.filter }),\n };\n }\n\n return {\n type: \"cron\",\n schedule: spec.trigger.schedule,\n timezone: spec.timezone ?? spec.trigger.timezone ?? \"UTC\",\n };\n}\n\nfunction generatePendingImportEvent(): string {\n if (\n typeof crypto !== \"undefined\" &&\n typeof crypto.randomUUID === \"function\"\n ) {\n return `pending.${crypto.randomUUID()}`;\n }\n return `pending.${Date.now()}.${Math.random().toString(36).slice(2, 10)}`;\n}\n\nfunction buildCreateAutomationRequest(spec: AutomationSpec) {\n if (!spec.prompt) {\n throw new Error(\"An automation prompt is required for import.\");\n }\n\n const { importDefaults } = getImportExportSpec();\n const repos = spec.repository\n ? [\n {\n url: spec.repository,\n ...(spec.branch && { ref: spec.branch }),\n ...(!spec.repository.includes(\"://\") &&\n !spec.repository.startsWith(\"git@\") && {\n provider: importDefaults.repoProvider,\n }),\n },\n ]\n : undefined;\n\n return {\n path: `${AUTOMATION_BASE_PATH}${getAutomationEndpoint(\n spec.plugins?.length ? \"createPlugin\" : \"createPrompt\",\n )}`,\n body: {\n name: spec.name,\n prompt: spec.prompt,\n // Preset creation defaults to enabled. A unique event trigger keeps the\n // new record inert until the real trigger and disabled state are applied\n // together in the follow-up PATCH.\n trigger: {\n type: \"event\",\n source: importDefaults.placeholderEventSource,\n on: generatePendingImportEvent(),\n },\n ...(spec.model && { model: spec.model }),\n ...(repos && { repos }),\n ...(spec.plugins?.length && {\n plugins: spec.plugins.map((source) => ({ source })),\n }),\n ...(spec.timeout != null && { timeout: spec.timeout }),\n },\n };\n}\n\nasync function buildPinnedLocalConfig(backend: Backend) {\n const apiKey = backend.apiKey.trim();\n return {\n baseURL: backend.host,\n headers: await buildAutomationRequestHeaders(\n apiKey ? { \"X-Session-API-Key\": apiKey } : {},\n ),\n };\n}\n\nasync function buildPinnedCloudHeaders(active: ResolvedActiveBackend) {\n return buildAutomationRequestHeaders(\n active.orgId ? { \"X-Org-Id\": active.orgId } : {},\n );\n}\n\nclass AutomationService {\n static async syncTelemetryConsent(\n consent: TelemetryConsent = getTelemetryConsent(),\n ): Promise<void> {\n const active = getActiveBackend();\n if (active.backend.kind !== \"local\") return;\n\n const frontendDistinctId = await getTelemetryDistinctIdForConsentSync();\n await localAutomationAxios.post(\n `${AUTOMATION_BASE_PATH}/v1/telemetry/consent`,\n {\n consent_granted: consent === \"granted\",\n frontend_distinct_id: frontendDistinctId,\n },\n { timeout: 5000 },\n );\n if (consent !== \"granted\" && frontendDistinctId) {\n clearPendingLocalTelemetryRevocation(frontendDistinctId);\n }\n }\n\n static async getSdkVersion(): Promise<string | null> {\n const active = getActiveBackend();\n const path = `${AUTOMATION_BASE_PATH}/sdk-version`;\n\n try {\n let response: AutomationSdkVersionResponse;\n if (active.backend.kind === \"cloud\") {\n response = await callCloudProxy<AutomationSdkVersionResponse>({\n backend: active.backend,\n method: \"GET\",\n path,\n headers: await buildPinnedCloudHeaders(active),\n timeoutSeconds: 5,\n });\n } else {\n const { data } =\n await localAutomationAxios.get<AutomationSdkVersionResponse>(path, {\n timeout: 5000,\n });\n response = data;\n }\n\n return getAutomationSdkVersionFromResponse(response);\n } catch {\n return null;\n }\n }\n\n static async listAutomations(\n params: { limit?: number; offset?: number } = {},\n ): Promise<AutomationsResponse> {\n const { limit = 50, offset = 0 } = params;\n const active = getActiveBackend().backend;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<AutomationsResponse>({\n backend: active,\n method: \"GET\",\n path: `${AUTOMATION_BASE_PATH}${getAutomationEndpoint(\"list\")}?${buildPaginationQuery(limit, offset)}`,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.get<AutomationsResponse>(\n `${AUTOMATION_BASE_PATH}${getAutomationEndpoint(\"list\")}`,\n { params: { limit, offset } },\n );\n return data;\n }\n\n static async getAutomations(\n limit = 50,\n offset = 0,\n ): Promise<AutomationsResponse> {\n return AutomationService.listAutomations({ limit, offset });\n }\n\n static async getAutomation(id: string): Promise<Automation> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"detail\", id)}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<Automation>({\n backend: active,\n method: \"GET\",\n path,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.get<Automation>(path);\n return data;\n }\n\n static async createAutomation(spec: AutomationSpec): Promise<Automation> {\n const active = getActiveBackend();\n const { path, body } = buildCreateAutomationRequest(spec);\n\n let created: Automation;\n if (active.backend.kind === \"cloud\") {\n created = await callCloudProxy<Automation>({\n backend: active.backend,\n method: \"POST\",\n path,\n body,\n headers: await buildPinnedCloudHeaders(active),\n });\n } else {\n const { data } = await localAutomationAxios.post<Automation>(\n path,\n body,\n await buildPinnedLocalConfig(active.backend),\n );\n created = data;\n }\n\n const updatePath = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"detail\", created.id)}`;\n const updateBody: Partial<Automation> = {\n trigger: buildImportedTrigger(spec),\n enabled: false,\n };\n\n try {\n if (active.backend.kind === \"cloud\") {\n return await callCloudProxy<Automation>({\n backend: active.backend,\n method: \"PATCH\",\n path: updatePath,\n body: updateBody,\n headers: await buildPinnedCloudHeaders(active),\n });\n }\n\n const { data } = await localAutomationAxios.patch<Automation>(\n updatePath,\n updateBody,\n await buildPinnedLocalConfig(active.backend),\n );\n return data;\n } catch (updateError) {\n try {\n if (active.backend.kind === \"cloud\") {\n await callCloudProxy<unknown>({\n backend: active.backend,\n method: \"DELETE\",\n path: updatePath,\n headers: await buildPinnedCloudHeaders(active),\n });\n } else {\n await localAutomationAxios.delete(\n updatePath,\n await buildPinnedLocalConfig(active.backend),\n );\n }\n } catch (cleanupError) {\n throw new AggregateError(\n [updateError, cleanupError],\n \"Failed to disable the imported automation and clean it up.\",\n );\n }\n throw updateError;\n }\n }\n\n static async updateAutomation(\n id: string,\n body: Partial<Automation>,\n ): Promise<Automation> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"detail\", id)}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<Automation>({\n backend: active,\n method: \"PATCH\",\n path,\n body: body as Record<string, unknown>,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.patch<Automation>(path, body);\n return data;\n }\n\n static async deleteAutomation(id: string): Promise<void> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"detail\", id)}`;\n\n if (active.kind === \"cloud\") {\n await callCloudProxy<unknown>({\n backend: active,\n method: \"DELETE\",\n path,\n headers: await buildAutomationRequestHeaders(),\n });\n return;\n }\n\n await localAutomationAxios.delete(path);\n }\n\n static async dispatchAutomation(id: string): Promise<AutomationRun> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"dispatch\", id)}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<AutomationRun>({\n backend: active,\n method: \"POST\",\n path,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.post<AutomationRun>(path);\n return data;\n }\n\n /**\n * Cancel a pending or running automation run.\n * Backend: POST /api/automation/v1/runs/{run_id}/cancel\n */\n static async cancelAutomationRun(runId: string): Promise<AutomationRun> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}/v1/runs/${encodeURIComponent(runId)}/cancel`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<AutomationRun>({\n backend: active,\n method: \"POST\",\n path,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.post<AutomationRun>(path);\n return data;\n }\n\n static async listAutomationRuns(\n id: string,\n params: { limit?: number; offset?: number } = {},\n ): Promise<AutomationRunsResponse> {\n const { limit = 50, offset = 0 } = params;\n const active = getActiveBackend().backend;\n const basePath = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"runs\", id)}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<AutomationRunsResponse>({\n backend: active,\n method: \"GET\",\n path: `${basePath}?${buildPaginationQuery(limit, offset)}`,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.get<AutomationRunsResponse>(\n basePath,\n { params: { limit, offset } },\n );\n return data;\n }\n\n static async getAutomationRuns(\n id: string,\n limit = 50,\n offset = 0,\n ): Promise<AutomationRunsResponse> {\n return AutomationService.listAutomationRuns(id, { limit, offset });\n }\n\n static async toggleAutomation(\n id: string,\n enabled: boolean,\n ): Promise<Automation> {\n return AutomationService.updateAutomation(id, { enabled });\n }\n\n static async downloadTarball(id: string, name: string): Promise<void> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationIdEndpoint(\"tarball\", id)}`;\n\n let blob: Blob;\n if (active.kind === \"cloud\") {\n blob = await callCloudProxy<Blob>({\n backend: active,\n method: \"GET\",\n path,\n responseType: \"blob\",\n headers: await buildAutomationRequestHeaders(),\n });\n } else {\n const { data } = await localAutomationAxios.get<Blob>(path, {\n responseType: \"blob\",\n });\n blob = data;\n }\n\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `${name}.tar`;\n a.click();\n URL.revokeObjectURL(url);\n }\n\n /**\n * Ask what this deployment supports, before a setup form renders.\n *\n * The setup endpoints answer a contract authored in `OpenHands/extensions`,\n * so their bodies are camelCase where the rest of this service is snake_case.\n */\n static async getCapabilities(): Promise<DeploymentCapabilities> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationEndpoint(\"capabilities\")}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<DeploymentCapabilities>({\n backend: active,\n method: \"GET\",\n path,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } =\n await localAutomationAxios.get<DeploymentCapabilities>(path);\n return data;\n }\n\n /**\n * Validate a draft without creating it. An invalid draft is a 200 carrying\n * field-addressed errors; only a malformed envelope is a 4xx.\n */\n static async validateDraft(\n body: SetupRequestBody,\n ): Promise<ValidateDraftResponse> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationEndpoint(\"validate\")}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<ValidateDraftResponse>({\n backend: active,\n method: \"POST\",\n path,\n body,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.post<ValidateDraftResponse>(\n path,\n body,\n );\n return data;\n }\n\n /**\n * Create from a draft a setup form derived. Unlike {@link\n * AutomationService.createAutomation}, which exists for import and has to\n * park the record on a placeholder trigger, this sends the finished record in\n * one request.\n */\n static async createAutomationDraft(\n body: SetupRequestBody,\n /** The entry and selected action decide the create endpoint. */\n entry?: SetupEntry,\n selectedAction?: string | null,\n ): Promise<Record<string, unknown>> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${automationCreateEndpoint(\n entry,\n selectedAction,\n )}`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<Record<string, unknown>>({\n backend: active,\n method: \"POST\",\n path,\n body,\n headers: await buildAutomationRequestHeaders(),\n });\n }\n\n const { data } = await localAutomationAxios.post<Record<string, unknown>>(\n path,\n body,\n );\n return data;\n }\n\n /**\n * Upload a packed bundle, and return the `oh-internal://` path the create\n * call references.\n *\n * The body is the archive itself rather than a multipart form - the service\n * streams it and takes its metadata from the query string, so it never has\n * to buffer the whole file to start writing.\n */\n static async uploadAutomationTarball(\n name: string,\n archive: Uint8Array,\n ): Promise<string> {\n const active = getActiveBackend().backend;\n const path =\n `${AUTOMATION_BASE_PATH}${automationUploadEndpoint()}` +\n `?name=${encodeURIComponent(name)}`;\n const headers = { \"Content-Type\": \"application/gzip\" };\n\n let upload: Record<string, unknown>;\n if (active.kind === \"cloud\") {\n // Post the archive straight to the cloud host rather than through the\n // cloud client: that client JSON-serializes any non-FormData body, which\n // would turn the gzip `Uint8Array` into `{\"0\":31,...}` even though the\n // header says `application/gzip`. Axios preserves the raw bytes (its\n // `transformRequest` sends the underlying buffer), so the service still\n // receives the archive as the stream it expects, with metadata in the\n // query string. This upload sets no host override, so a direct call\n // matches the cloud client's own direct-to-host path -- we just add the\n // two headers that path would (`Bearer` auth and `X-Org-Id`).\n const { orgId } = getActiveBackend();\n upload = (\n await axios.post<Record<string, unknown>>(\n `${active.host.replace(/\\/+$/, \"\")}${path}`,\n archive,\n {\n headers: {\n ...(await buildAutomationRequestHeaders()),\n ...headers,\n ...(active.apiKey\n ? { Authorization: `Bearer ${active.apiKey}` }\n : {}),\n ...(orgId ? { \"X-Org-Id\": orgId } : {}),\n },\n },\n )\n ).data;\n } else {\n upload = (\n await localAutomationAxios.post<Record<string, unknown>>(\n path,\n archive,\n { headers },\n )\n ).data;\n }\n\n const tarballPath = upload.tarball_path;\n if (typeof tarballPath !== \"string\" || !tarballPath) {\n throw new Error(\"The upload returned no tarball path.\");\n }\n return tarballPath;\n }\n\n // Git sync paths are literal rather than routed through\n // `getAutomationEndpoint`. That manifest describes the automation surface a\n // host may remap, and `InterfaceEndpoints` requires every key it declares --\n // adding these would break existing manifests. Git sync is a local-mode\n // operator feature outside that surface.\n static async getGitSyncStatus(): Promise<GitSyncStatus> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}/v1/git-sync/status`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<GitSyncStatus>({\n backend: active,\n method: \"GET\",\n path,\n });\n }\n\n const { data } = await localAutomationAxios.get<GitSyncStatus>(path);\n return data;\n }\n\n static async updateGitSyncConfig(\n body: GitSyncConfigUpdateRequest,\n ): Promise<GitSyncStatus> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}/v1/git-sync/config`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<GitSyncStatus>({\n backend: active,\n method: \"PUT\",\n path,\n body: body as Record<string, unknown>,\n });\n }\n\n const { data } = await localAutomationAxios.put<GitSyncStatus>(path, body);\n return data;\n }\n\n /**\n * Ask whether a configuration can reach its repo, without saving it. Takes\n * the same body as `updateGitSyncConfig` and answers for the settings that\n * body would leave in place.\n */\n static async checkGitSyncConfig(\n body: GitSyncConfigUpdateRequest,\n ): Promise<GitSyncCheckResponse> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}/v1/git-sync/check`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<GitSyncCheckResponse>({\n backend: active,\n method: \"POST\",\n path,\n body: body as Record<string, unknown>,\n });\n }\n\n const { data } = await localAutomationAxios.post<GitSyncCheckResponse>(\n path,\n body,\n );\n return data;\n }\n\n static async triggerGitSync(): Promise<GitSyncTriggerResponse> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}/v1/git-sync/sync`;\n\n if (active.kind === \"cloud\") {\n return callCloudProxy<GitSyncTriggerResponse>({\n backend: active,\n method: \"POST\",\n path,\n });\n }\n\n const { data } =\n await localAutomationAxios.post<GitSyncTriggerResponse>(path);\n return data;\n }\n\n static async checkHealth(): Promise<AutomationHealthResponse> {\n const active = getActiveBackend().backend;\n const path = `${AUTOMATION_BASE_PATH}${getAutomationEndpoint(\"health\")}`;\n\n try {\n if (active.kind === \"cloud\") {\n const response = await callCloudProxy<AutomationHealthResponse>({\n backend: active,\n method: \"GET\",\n path,\n // Fail fast, matching the local branch's 5s timeout below.\n timeoutSeconds: 5,\n headers: await buildAutomationRequestHeaders(),\n });\n return response;\n }\n\n const { data } = await localAutomationAxios.get<AutomationHealthResponse>(\n path,\n { timeout: 5000 },\n );\n return data;\n } catch {\n return { status: \"error\" };\n }\n }\n}\n\nexport default AutomationService;\n"],"mappings":";;;;;;;;;AAiDA,IAAM,IAAuB,mBAkBvB,IAAuB,EAAM,OAAO;AAE1C,eAAe,EACb,IAAuC,CAAC,GACP;CACjC,IAAM,IAAsB,MAAM,EAAuB;CACzD,OAAO;EACL,GAAG;EACH,GAAI,IACA,GAAG,IAAyC,EAAoB,IAChE,CAAC;EACL,GAAG;CACL;AACF;AAEA,EAAqB,aAAa,QAAQ,IAAI,OAAO,MAAW;CAC9D,IAAM,IAAiB,MAAM,EAA8B;CAO3D,IANA,OAAO,QAAQ,CAAc,EAAE,SAAS,CAAC,GAAM,OAAW;EACxD,EAAO,QAAQ,IAAI,GAAM,CAAK;CAChC,CAAC,GAIG,EAAO,SAAS,OAAO;CAU3B,IAAM,IAAU,EAAyB;CACzC,IAAI,CAAC,GAAS,MAAM,IAAI,EAAwB;CAEhD,EAAO,UAAU,EAAQ;CAEzB,IAAM,IAAS,EAAQ,QAAQ,KAAK;CAIpC,OAHI,KACF,EAAO,QAAQ,IAAI,qBAAqB,CAAM,GAEzC;AACT,CAAC;AAED,SAAS,EAA8B,GAAiC;CAGtE,OAFI,OAAO,KAAY,YACP,EAAQ,KACjB,KAFiC;AAG1C;AAEA,SAAS,EACP,GACe;CAIf,OAHI,OAAO,KAAa,WACf,EAA8B,CAAQ,IAG7C,EAA8B,EAAS,WAAW,KAClD,EAA8B,EAAS,OAAO;AAElD;AAEA,SAAS,EAAqB,GAAe,GAAwB;CACnE,IAAM,IAAS,IAAI,gBAAgB;CAGnC,OAFA,EAAO,IAAI,SAAS,OAAO,CAAK,CAAC,GACjC,EAAO,IAAI,UAAU,OAAO,CAAM,CAAC,GAC5B,EAAO,SAAS;AACzB;AAEA,SAAS,EAAqB,GAAyC;CAUrE,OATI,EAAK,QAAQ,SAAS,UACjB;EACL,MAAM;EACN,QAAQ,EAAK,QAAQ;EACrB,IAAI,EAAK,QAAQ;EACjB,GAAI,EAAK,QAAQ,UAAU,EAAE,QAAQ,EAAK,QAAQ,OAAO;CAC3D,IAGK;EACL,MAAM;EACN,UAAU,EAAK,QAAQ;EACvB,UAAU,EAAK,YAAY,EAAK,QAAQ,YAAY;CACtD;AACF;AAEA,SAAS,IAAqC;CAO5C,OALE,OAAO,SAAW,OAClB,OAAO,OAAO,cAAe,aAEtB,WAAW,OAAO,WAAW,MAE/B,WAAW,KAAK,IAAI,EAAE,GAAG,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE;AACxE;AAEA,SAAS,EAA6B,GAAsB;CAC1D,IAAI,CAAC,EAAK,QACR,MAAU,MAAM,8CAA8C;CAGhE,IAAM,EAAE,sBAAmB,EAAoB,GACzC,IAAQ,EAAK,aACf,CACE;EACE,KAAK,EAAK;EACV,GAAI,EAAK,UAAU,EAAE,KAAK,EAAK,OAAO;EACtC,GAAI,CAAC,EAAK,WAAW,SAAS,KAAK,KACjC,CAAC,EAAK,WAAW,WAAW,MAAM,KAAK,EACrC,UAAU,EAAe,aAC3B;CACJ,CACF,IACA,KAAA;CAEJ,OAAO;EACL,MAAM,GAAG,IAAuB,EAC9B,EAAK,SAAS,SAAS,iBAAiB,cAC1C;EACA,MAAM;GACJ,MAAM,EAAK;GACX,QAAQ,EAAK;GAIb,SAAS;IACP,MAAM;IACN,QAAQ,EAAe;IACvB,IAAI,EAA2B;GACjC;GACA,GAAI,EAAK,SAAS,EAAE,OAAO,EAAK,MAAM;GACtC,GAAI,KAAS,EAAE,SAAM;GACrB,GAAI,EAAK,SAAS,UAAU,EAC1B,SAAS,EAAK,QAAQ,KAAK,OAAY,EAAE,UAAO,EAAE,EACpD;GACA,GAAI,EAAK,WAAW,QAAQ,EAAE,SAAS,EAAK,QAAQ;EACtD;CACF;AACF;AAEA,eAAe,EAAuB,GAAkB;CACtD,IAAM,IAAS,EAAQ,OAAO,KAAK;CACnC,OAAO;EACL,SAAS,EAAQ;EACjB,SAAS,MAAM,EACb,IAAS,EAAE,qBAAqB,EAAO,IAAI,CAAC,CAC9C;CACF;AACF;AAEA,eAAe,EAAwB,GAA+B;CACpE,OAAO,EACL,EAAO,QAAQ,EAAE,YAAY,EAAO,MAAM,IAAI,CAAC,CACjD;AACF;AAEA,IAAM,IAAN,MAAM,EAAkB;CACtB,aAAa,qBACX,IAA4B,EAAoB,GACjC;EAEf,IADe,EACX,EAAO,QAAQ,SAAS,SAAS;EAErC,IAAM,IAAqB,MAAM,EAAqC;EAStE,AARA,MAAM,EAAqB,KACzB,GAAG,EAAqB,wBACxB;GACE,iBAAiB,MAAY;GAC7B,sBAAsB;EACxB,GACA,EAAE,SAAS,IAAK,CAClB,GACI,MAAY,aAAa,KAC3B,EAAqC,CAAkB;CAE3D;CAEA,aAAa,gBAAwC;EACnD,IAAM,IAAS,EAAiB,GAC1B,IAAO,GAAG,EAAqB;EAErC,IAAI;GACF,IAAI;GACJ,IAAI,EAAO,QAAQ,SAAS,SAC1B,IAAW,MAAM,EAA6C;IAC5D,SAAS,EAAO;IAChB,QAAQ;IACR;IACA,SAAS,MAAM,EAAwB,CAAM;IAC7C,gBAAgB;GAClB,CAAC;QACI;IACL,IAAM,EAAE,YACN,MAAM,EAAqB,IAAkC,GAAM,EACjE,SAAS,IACX,CAAC;IACH,IAAW;GACb;GAEA,OAAO,EAAoC,CAAQ;EACrD,QAAQ;GACN,OAAO;EACT;CACF;CAEA,aAAa,gBACX,IAA8C,CAAC,GACjB;EAC9B,IAAM,EAAE,WAAQ,IAAI,YAAS,MAAM,GAC7B,IAAS,EAAiB,EAAE;EAElC,IAAI,EAAO,SAAS,SAClB,OAAO,EAAoC;GACzC,SAAS;GACT,QAAQ;GACR,MAAM,GAAG,IAAuB,EAAsB,MAAM,EAAE,GAAG,EAAqB,GAAO,CAAM;GACnG,SAAS,MAAM,EAA8B;EAC/C,CAAC;EAGH,IAAM,EAAE,YAAS,MAAM,EAAqB,IAC1C,GAAG,IAAuB,EAAsB,MAAM,KACtD,EAAE,QAAQ;GAAE;GAAO;EAAO,EAAE,CAC9B;EACA,OAAO;CACT;CAEA,aAAa,eACX,IAAQ,IACR,IAAS,GACqB;EAC9B,OAAO,EAAkB,gBAAgB;GAAE;GAAO;EAAO,CAAC;CAC5D;CAEA,aAAa,cAAc,GAAiC;EAC1D,IAAM,IAAS,EAAiB,EAAE,SAC5B,IAAO,GAAG,IAAuB,EAAwB,UAAU,CAAE;EAE3E,IAAI,EAAO,SAAS,SAClB,OAAO,EAA2B;GAChC,SAAS;GACT,QAAQ;GACR;GACA,SAAS,MAAM,EAA8B;EAC/C,CAAC;EAGH,IAAM,EAAE,YAAS,MAAM,EAAqB,IAAgB,CAAI;EAChE,OAAO;CACT;CAEA,aAAa,iBAAiB,GAA2C;EACvE,IAAM,IAAS,EAAiB,GAC1B,EAAE,SAAM,YAAS,EAA6B,CAAI,GAEpD;EACJ,IAAI,EAAO,QAAQ,SAAS,SAC1B,IAAU,MAAM,EAA2B;GACzC,SAAS,EAAO;GAChB,QAAQ;GACR;GACA;GACA,SAAS,MAAM,EAAwB,CAAM;EAC/C,CAAC;OACI;GACL,IAAM,EAAE,YAAS,MAAM,EAAqB,KAC1C,GACA,GACA,MAAM,EAAuB,EAAO,OAAO,CAC7C;GACA,IAAU;EACZ;EAEA,IAAM,IAAa,GAAG,IAAuB,EAAwB,UAAU,EAAQ,EAAE,KACnF,IAAkC;GACtC,SAAS,EAAqB,CAAI;GAClC,SAAS;EACX;EAEA,IAAI;GACF,IAAI,EAAO,QAAQ,SAAS,SAC1B,OAAO,MAAM,EAA2B;IACtC,SAAS,EAAO;IAChB,QAAQ;IACR,MAAM;IACN,MAAM;IACN,SAAS,MAAM,EAAwB,CAAM;GAC/C,CAAC;GAGH,IAAM,EAAE,YAAS,MAAM,EAAqB,MAC1C,GACA,GACA,MAAM,EAAuB,EAAO,OAAO,CAC7C;GACA,OAAO;EACT,SAAS,GAAa;GACpB,IAAI;IACF,AAAI,EAAO,QAAQ,SAAS,UAC1B,MAAM,EAAwB;KAC5B,SAAS,EAAO;KAChB,QAAQ;KACR,MAAM;KACN,SAAS,MAAM,EAAwB,CAAM;IAC/C,CAAC,IAED,MAAM,EAAqB,OACzB,GACA,MAAM,EAAuB,EAAO,OAAO,CAC7C;GAEJ,SAAS,GAAc;IACrB,MAAU,eACR,CAAC,GAAa,CAAY,GAC1B,4DACF;GACF;GACA,MAAM;EACR;CACF;CAEA,aAAa,iBACX,GACA,GACqB;EACrB,IAAM,IAAS,EAAiB,EAAE,SAC5B,IAAO,GAAG,IAAuB,EAAwB,UAAU,CAAE;EAE3E,IAAI,EAAO,SAAS,SAClB,OAAO,EAA2B;GAChC,SAAS;GACT,QAAQ;GACR;GACM;GACN,SAAS,MAAM,EAA8B;EAC/C,CAAC;EAGH,IAAM,EAAE,YAAS,MAAM,EAAqB,MAAkB,GAAM,CAAI;EACxE,OAAO;CACT;CAEA,aAAa,iBAAiB,GAA2B;EACvD,IAAM,IAAS,EAAiB,EAAE,SAC5B,IAAO,GAAG,IAAuB,EAAwB,UAAU,CAAE;EAE3E,IAAI,EAAO,SAAS,SAAS;GAC3B,MAAM,EAAwB;IAC5B,SAAS;IACT,QAAQ;IACR;IACA,SAAS,MAAM,EAA8B;GAC/C,CAAC;GACD;EACF;EAEA,MAAM,EAAqB,OAAO,CAAI;CACxC;CAEA,aAAa,mBAAmB,GAAoC;EAClE,IAAM,IAAS,EAAiB,EAAE,SAC5B,IAAO,GAAG,IAAuB,EAAwB,YAAY,CAAE;EAE7E,IAAI,EAAO,SAAS,SAClB,OAAO,EAA8B;GACnC,SAAS;GACT,QAAQ;GACR;GACA,SAAS,MAAM,EAA8B;EAC/C,CAAC;EAGH,IAAM,EAAE,YAAS,MAAM,EAAqB,KAAoB,CAAI;EACpE,OAAO;CACT;CAMA,aAAa,oBAAoB,GAAuC;EACtE,IAAM,IAAS,EAAiB,EAAE,SAC5B,IAAO,GAAG,EAAqB,WAAW,mBAAmB,CAAK,EAAE;EAE1E,IAAI,EAAO,SAAS,SAClB,OAAO,EAA8B;GACnC,SAAS;GACT,QAAQ;GACR;GACA,SAAS,MAAM,EAA8B;EAC/C,CAAC;EAGH,IAAM,EAAE,YAAS,MAAM,EAAqB,KAAoB,CAAI;EACpE,OAAO;CACT;CAEA,aAAa,mBACX,GACA,IAA8C,CAAC,GACd;EACjC,IAAM,EAAE,WAAQ,IAAI,YAAS,MAAM,GAC7B,IAAS,EAAiB,EAAE,SAC5B,IAAW,GAAG,IAAuB,EAAwB,QAAQ,CAAE;EAE7E,IAAI,EAAO,SAAS,SAClB,OAAO,EAAuC;GAC5C,SAAS;GACT,QAAQ;GACR,MAAM,GAAG,EAAS,GAAG,EAAqB,GAAO,CAAM;GACvD,SAAS,MAAM,EAA8B;EAC/C,CAAC;EAGH,IAAM,EAAE,YAAS,MAAM,EAAqB,IAC1C,GACA,EAAE,QAAQ;GAAE;GAAO;EAAO,EAAE,CAC9B;EACA,OAAO;CACT;CAEA,aAAa,kBACX,GACA,IAAQ,IACR,IAAS,GACwB;EACjC,OAAO,EAAkB,mBAAmB,GAAI;GAAE;GAAO;EAAO,CAAC;CACnE;CAEA,aAAa,iBACX,GACA,GACqB;EACrB,OAAO,EAAkB,iBAAiB,GAAI,EAAE,WAAQ,CAAC;CAC3D;CAEA,aAAa,gBAAgB,GAAY,GAA6B;EACpE,IAAM,IAAS,EAAiB,EAAE,SAC5B,IAAO,GAAG,IAAuB,EAAwB,WAAW,CAAE,KAExE;EACJ,IAAI,EAAO,SAAS,SAClB,IAAO,MAAM,EAAqB;GAChC,SAAS;GACT,QAAQ;GACR;GACA,cAAc;GACd,SAAS,MAAM,EAA8B;EAC/C,CAAC;OACI;GACL,IAAM,EAAE,YAAS,MAAM,EAAqB,IAAU,GAAM,EAC1D,cAAc,OAChB,CAAC;GACD,IAAO;EACT;EAEA,IAAM,IAAM,IAAI,gBAAgB,CAAI,GAC9B,IAAI,SAAS,cAAc,GAAG;EAIpC,AAHA,EAAE,OAAO,GACT,EAAE,WAAW,GAAG,EAAK,OACrB,EAAE,MAAM,GACR,IAAI,gBAAgB,CAAG;CACzB;CAQA,aAAa,kBAAmD;EAC9D,IAAM,IAAS,EAAiB,EAAE,SAC5B,IAAO,GAAG,IAAuB,EAAsB,cAAc;EAE3E,IAAI,EAAO,SAAS,SAClB,OAAO,EAAuC;GAC5C,SAAS;GACT,QAAQ;GACR;GACA,SAAS,MAAM,EAA8B;EAC/C,CAAC;EAGH,IAAM,EAAE,YACN,MAAM,EAAqB,IAA4B,CAAI;EAC7D,OAAO;CACT;CAMA,aAAa,cACX,GACgC;EAChC,IAAM,IAAS,EAAiB,EAAE,SAC5B,IAAO,GAAG,IAAuB,EAAsB,UAAU;EAEvE,IAAI,EAAO,SAAS,SAClB,OAAO,EAAsC;GAC3C,SAAS;GACT,QAAQ;GACR;GACA;GACA,SAAS,MAAM,EAA8B;EAC/C,CAAC;EAGH,IAAM,EAAE,YAAS,MAAM,EAAqB,KAC1C,GACA,CACF;EACA,OAAO;CACT;CAQA,aAAa,sBACX,GAEA,GACA,GACkC;EAClC,IAAM,IAAS,EAAiB,EAAE,SAC5B,IAAO,GAAG,IAAuB,EACrC,GACA,CACF;EAEA,IAAI,EAAO,SAAS,SAClB,OAAO,EAAwC;GAC7C,SAAS;GACT,QAAQ;GACR;GACA;GACA,SAAS,MAAM,EAA8B;EAC/C,CAAC;EAGH,IAAM,EAAE,YAAS,MAAM,EAAqB,KAC1C,GACA,CACF;EACA,OAAO;CACT;CAUA,aAAa,wBACX,GACA,GACiB;EACjB,IAAM,IAAS,EAAiB,EAAE,SAC5B,IACJ,GAAG,IAAuB,EAAyB,EAAA,QAC1C,mBAAmB,CAAI,KAC5B,IAAU,EAAE,gBAAgB,mBAAmB,GAEjD;EACJ,IAAI,EAAO,SAAS,SAAS;GAU3B,IAAM,EAAE,aAAU,EAAiB;GACnC,KACE,MAAM,EAAM,KACV,GAAG,EAAO,KAAK,QAAQ,QAAQ,EAAE,IAAI,KACrC,GACA,EACE,SAAS;IACP,GAAI,MAAM,EAA8B;IACxC,GAAG;IACH,GAAI,EAAO,SACP,EAAE,eAAe,UAAU,EAAO,SAAS,IAC3C,CAAC;IACL,GAAI,IAAQ,EAAE,YAAY,EAAM,IAAI,CAAC;GACvC,EACF,CACF,GACA;EACJ,OACE,KACE,MAAM,EAAqB,KACzB,GACA,GACA,EAAE,WAAQ,CACZ,GACA;EAGJ,IAAM,IAAc,EAAO;EAC3B,IAAI,OAAO,KAAgB,YAAY,CAAC,GACtC,MAAU,MAAM,sCAAsC;EAExD,OAAO;CACT;CAOA,aAAa,mBAA2C;EACtD,IAAM,IAAS,EAAiB,EAAE,SAC5B,IAAO,GAAG,EAAqB;EAErC,IAAI,EAAO,SAAS,SAClB,OAAO,EAA8B;GACnC,SAAS;GACT,QAAQ;GACR;EACF,CAAC;EAGH,IAAM,EAAE,YAAS,MAAM,EAAqB,IAAmB,CAAI;EACnE,OAAO;CACT;CAEA,aAAa,oBACX,GACwB;EACxB,IAAM,IAAS,EAAiB,EAAE,SAC5B,IAAO,GAAG,EAAqB;EAErC,IAAI,EAAO,SAAS,SAClB,OAAO,EAA8B;GACnC,SAAS;GACT,QAAQ;GACR;GACM;EACR,CAAC;EAGH,IAAM,EAAE,YAAS,MAAM,EAAqB,IAAmB,GAAM,CAAI;EACzE,OAAO;CACT;CAOA,aAAa,mBACX,GAC+B;EAC/B,IAAM,IAAS,EAAiB,EAAE,SAC5B,IAAO,GAAG,EAAqB;EAErC,IAAI,EAAO,SAAS,SAClB,OAAO,EAAqC;GAC1C,SAAS;GACT,QAAQ;GACR;GACM;EACR,CAAC;EAGH,IAAM,EAAE,YAAS,MAAM,EAAqB,KAC1C,GACA,CACF;EACA,OAAO;CACT;CAEA,aAAa,iBAAkD;EAC7D,IAAM,IAAS,EAAiB,EAAE,SAC5B,IAAO,GAAG,EAAqB;EAErC,IAAI,EAAO,SAAS,SAClB,OAAO,EAAuC;GAC5C,SAAS;GACT,QAAQ;GACR;EACF,CAAC;EAGH,IAAM,EAAE,YACN,MAAM,EAAqB,KAA6B,CAAI;EAC9D,OAAO;CACT;CAEA,aAAa,cAAiD;EAC5D,IAAM,IAAS,EAAiB,EAAE,SAC5B,IAAO,GAAG,IAAuB,EAAsB,QAAQ;EAErE,IAAI;GACF,IAAI,EAAO,SAAS,SASlB,OAAO,MARgB,EAAyC;IAC9D,SAAS;IACT,QAAQ;IACR;IAEA,gBAAgB;IAChB,SAAS,MAAM,EAA8B;GAC/C,CAAC;GAIH,IAAM,EAAE,YAAS,MAAM,EAAqB,IAC1C,GACA,EAAE,SAAS,IAAK,CAClB;GACA,OAAO;EACT,QAAQ;GACN,OAAO,EAAE,QAAQ,QAAQ;EAC3B;CACF;AACF"}
@@ -0,0 +1 @@
1
+ require("../_virtual/_rolldown/runtime.cjs"),require("../node_modules/@openhands/typescript-client/dist/clients.cjs"),require("./backend-registry/active-store.cjs"),require("./agent-server-client-options.cjs"),require("./agent-server-compatibility.cjs");
@@ -0,0 +1,22 @@
1
+ import type { Backend } from "#/api/backend-registry/types";
2
+ import type { CanvasExtensionAgentServerRequest, InstallCanvasExtensionRequest, InstalledCanvasExtensionInfo } from "#/types/canvas-extension";
3
+ export type CanvasExtensionsUnsupportedReason = "no-backend" | "cloud-backend" | "missing-api";
4
+ export declare class CanvasExtensionsUnsupportedError extends Error {
5
+ readonly reason: CanvasExtensionsUnsupportedReason;
6
+ constructor(reason: CanvasExtensionsUnsupportedReason);
7
+ }
8
+ export declare function isCanvasExtensionsUnsupportedError(error: unknown): error is CanvasExtensionsUnsupportedError;
9
+ declare class CanvasExtensionsService {
10
+ static listInstalled(): Promise<InstalledCanvasExtensionInfo[]>;
11
+ static install(request: InstallCanvasExtensionRequest): Promise<InstalledCanvasExtensionInfo>;
12
+ static setEnabled(name: string, enabled: boolean): Promise<{
13
+ name: string;
14
+ enabled: boolean;
15
+ }>;
16
+ static uninstall(name: string): Promise<{
17
+ message: string;
18
+ }>;
19
+ static fetchBundle(name: string, backend?: Backend): Promise<string>;
20
+ static requestAgentServer<T = unknown>(request: CanvasExtensionAgentServerRequest, backend?: Backend): Promise<T>;
21
+ }
22
+ export default CanvasExtensionsService;
@@ -0,0 +1,4 @@
1
+ import "../node_modules/@openhands/typescript-client/dist/clients.js";
2
+ import "./backend-registry/active-store.js";
3
+ import "./agent-server-client-options.js";
4
+ import "./agent-server-compatibility.js";
@@ -1,2 +1,2 @@
1
- require("../../_virtual/_rolldown/runtime.cjs");const e=require("../backend-registry/active-store.cjs"),t=require("../client-source.cjs"),n=require("../conversation-metadata-store.cjs"),r=require("./proxy.cjs");function i(e){if(!e?.id)return e;let t=n.getStoredConversationMetadata(e.id);return t?{...e,selected_repository:e.selected_repository??t.selected_repository??null,selected_branch:e.selected_branch??t.selected_branch??null,git_provider:e.git_provider??t.git_provider??null,selected_workspace:e.selected_workspace??t.selected_workspace??null}:e}function a(){let t=e.getActiveBackend().backend;if(t.kind!==`cloud`)throw Error(`Cloud conversations call requires a cloud backend.`);return t}function o(){let t=e.getActiveBackend().backend;return t.kind===`cloud`?t:e.getRegisteredBackends().find(e=>e.kind===`cloud`&&!!e.apiKey)??null}async function s(e=20,t){let n=a(),o=new URLSearchParams;o.set(`limit`,String(e)),t&&o.set(`page_id`,t),o.set(`sort_order`,`UPDATED_AT_DESC`);let s=await r.callCloudProxy({backend:n,method:`GET`,path:`/api/v1/app-conversations/search?${o.toString()}`});return{items:(s?.items??[]).map(e=>i(e)),next_page_id:s?.next_page_id??null}}async function c(e){if(e.length===0)return[];let t=a(),n=new URLSearchParams;for(let t of e)n.append(`ids`,t);return(await r.callCloudProxy({backend:t,method:`GET`,path:`/api/v1/app-conversations?${n.toString()}`})??[]).map(i)}async function l(e,n){return await r.callCloudProxy({backend:n??a(),method:`POST`,path:`/api/v1/app-conversations`,body:e,headers:t.AGENT_CANVAS_CLIENT_HEADERS})}async function u(e){return r.callCloudProxy({backend:a(),method:`GET`,path:`/api/v1/app-conversations/${e}/download`,responseType:`blob`})}async function d(e){await r.callCloudProxy({backend:a(),method:`DELETE`,path:`/api/v1/app-conversations/${e}`})}async function f(e,t){return await r.callCloudProxy({backend:a(),method:`PATCH`,path:`/api/v1/app-conversations/${e}`,body:{public:t}})}async function p(e){await r.callCloudProxy({backend:a(),method:`POST`,path:`/api/v1/sandboxes/${e}/pause`})}async function m(e){await r.callCloudProxy({backend:a(),method:`POST`,path:`/api/v1/sandboxes/${e}/resume`})}async function h(e,t){let n=a(),i=new URLSearchParams;return i.append(`file_path`,t),await r.callCloudProxy({backend:n,method:`GET`,path:`/api/v1/app-conversations/${e}/file?${i.toString()}`})??``}async function g(e,t){let n=a(),i=new URLSearchParams;i.append(`path`,t);let o=await r.callCloudProxy({backend:n,method:`GET`,path:`/api/v1/app-conversations/${e}/files?${i.toString()}`});return Array.isArray(o)?o:[]}async function _(e,t){let n=t??a(),i=new URLSearchParams;return i.set(`ids`,e),(await r.callCloudProxy({backend:n,method:`GET`,path:`/api/v1/app-conversations/start-tasks?${i.toString()}`}))?.[0]??null}exports.batchGetCloudConversations=c,exports.createCloudAppConversation=l,exports.deleteCloudConversation=d,exports.downloadCloudConversation=u,exports.getCloudAppConversationStartTask=_,exports.listCloudConversationFiles=g,exports.pauseCloudSandbox=p,exports.pickCloudBackendForLaunch=o,exports.readCloudConversationFile=h,exports.resumeCloudSandbox=m,exports.searchCloudConversations=s,exports.updateCloudConversationPublicFlag=f;
1
+ require("../../_virtual/_rolldown/runtime.cjs");const e=require("../backend-registry/active-store.cjs"),t=require("../client-source.cjs"),n=require("../conversation-metadata-store.cjs"),r=require("./proxy.cjs");function i(e){if(!e?.id)return e;let t=n.getStoredConversationMetadata(e.id);return t?{...e,selected_repository:e.selected_repository??t.selected_repository??null,selected_branch:e.selected_branch??t.selected_branch??null,git_provider:e.git_provider??t.git_provider??null,selected_workspace:e.selected_workspace??t.selected_workspace??null}:e}function a(){let t=e.getActiveBackend().backend;if(t.kind!==`cloud`)throw Error(`Cloud conversations call requires a cloud backend.`);return t}function o(){let t=e.getActiveBackend().backend;return t.kind===`cloud`?t:e.getRegisteredBackends().find(e=>e.kind===`cloud`&&!!e.apiKey)??null}async function s(e=20,t){let n=a(),o=new URLSearchParams;o.set(`limit`,String(e)),t&&o.set(`page_id`,t),o.set(`sort_order`,`UPDATED_AT_DESC`);let s=await r.callCloudProxy({backend:n,method:`GET`,path:`/api/v1/app-conversations/search?${o.toString()}`});return{items:(s?.items??[]).map(e=>i(e)),next_page_id:s?.next_page_id??null}}async function c(e){if(e.length===0)return[];let t=a(),n=new URLSearchParams;for(let t of e)n.append(`ids`,t);return(await r.callCloudProxy({backend:t,method:`GET`,path:`/api/v1/app-conversations?${n.toString()}`})??[]).map(i)}async function l(e,n){return await r.callCloudProxy({backend:n??a(),method:`POST`,path:`/api/v1/app-conversations`,body:e,headers:t.AGENT_CANVAS_CLIENT_HEADERS})}async function u(e){return r.callCloudProxy({backend:a(),method:`GET`,path:`/api/v1/app-conversations/${e}/download`,responseType:`blob`})}async function d(e){await r.callCloudProxy({backend:a(),method:`DELETE`,path:`/api/v1/app-conversations/${e}`})}async function f(e,t){return await r.callCloudProxy({backend:a(),method:`PATCH`,path:`/api/v1/app-conversations/${e}`,body:{public:t}})}async function p(e,t){return r.callCloudProxy({backend:a(),method:`PATCH`,path:`/api/v1/app-conversations/${e}`,body:{title:t}})}async function m(e){await r.callCloudProxy({backend:a(),method:`POST`,path:`/api/v1/sandboxes/${e}/pause`})}async function h(e){await r.callCloudProxy({backend:a(),method:`POST`,path:`/api/v1/sandboxes/${e}/resume`})}async function g(e,t){let n=a(),i=new URLSearchParams;return i.append(`file_path`,t),await r.callCloudProxy({backend:n,method:`GET`,path:`/api/v1/app-conversations/${e}/file?${i.toString()}`})??``}async function _(e,t){let n=a(),i=new URLSearchParams;i.append(`path`,t);let o=await r.callCloudProxy({backend:n,method:`GET`,path:`/api/v1/app-conversations/${e}/files?${i.toString()}`});return Array.isArray(o)?o:[]}async function v(e,t){let n=t??a(),i=new URLSearchParams;return i.set(`ids`,e),(await r.callCloudProxy({backend:n,method:`GET`,path:`/api/v1/app-conversations/start-tasks?${i.toString()}`}))?.[0]??null}exports.batchGetCloudConversations=c,exports.createCloudAppConversation=l,exports.deleteCloudConversation=d,exports.downloadCloudConversation=u,exports.getCloudAppConversationStartTask=v,exports.listCloudConversationFiles=_,exports.pauseCloudSandbox=m,exports.pickCloudBackendForLaunch=o,exports.readCloudConversationFile=g,exports.resumeCloudSandbox=h,exports.searchCloudConversations=s,exports.updateCloudConversationPublicFlag=f,exports.updateCloudConversationTitle=p;
2
2
  //# sourceMappingURL=conversation-service.api.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-service.api.cjs","names":[],"sources":["../../../src/api/cloud/conversation-service.api.ts"],"sourcesContent":["import {\n getActiveBackend,\n getRegisteredBackends,\n} from \"../backend-registry/active-store\";\nimport type { Backend } from \"../backend-registry/types\";\nimport { getStoredConversationMetadata } from \"../conversation-metadata-store\";\nimport type {\n AppConversation,\n AppConversationPage,\n AppConversationStartRequest,\n AppConversationStartTask,\n} from \"../conversation-service/agent-server-conversation-service.types\";\nimport { AGENT_CANVAS_CLIENT_HEADERS } from \"../client-source\";\nimport { callCloudProxy } from \"./proxy\";\n\n/**\n * The cloud backend does not always echo `selected_repository` /\n * `selected_branch` / `git_provider` back from\n * `GET /api/v1/app-conversations` until its own background hydration\n * completes. We persist the selection to local storage at connect time\n * (see `AgentServerConversationService.updateConversationRepository`)\n * and overlay it here so the chat-page git control bar reflects the\n * connection immediately, instead of snapping back to the empty\n * \"Connect Repo\" state on every refetch.\n *\n * Server values take precedence whenever they're populated; the\n * local-storage fallback only fills in fields the server returned as\n * `null`/`undefined`.\n */\nfunction overlayStoredRepoSelection(\n conversation: AppConversation | null,\n): AppConversation | null {\n if (!conversation?.id) return conversation;\n const stored = getStoredConversationMetadata(conversation.id);\n if (!stored) return conversation;\n\n return {\n ...conversation,\n selected_repository:\n conversation.selected_repository ?? stored.selected_repository ?? null,\n selected_branch:\n conversation.selected_branch ?? stored.selected_branch ?? null,\n git_provider: conversation.git_provider ?? stored.git_provider ?? null,\n selected_workspace:\n conversation.selected_workspace ?? stored.selected_workspace ?? null,\n };\n}\n\nfunction getActiveCloudBackend(): Backend {\n const active = getActiveBackend().backend;\n if (active.kind !== \"cloud\") {\n throw new Error(\"Cloud conversations call requires a cloud backend.\");\n }\n return active;\n}\n\n/**\n * Resolve the cloud backend a Cloud conversation should be launched against\n * when the active backend may not be a cloud one. Cloud conversations cannot\n * register client tools, so the typed launch action always runs from a local\n * parent and has to reach a registered-but-inactive cloud backend.\n *\n * Prefers the active backend when it is already cloud, then the first\n * registered cloud backend that carries credentials. Returns `null` when the\n * user has no cloud backend connected, so callers can give the agent\n * corrective guidance instead of failing opaquely.\n *\n * Note: `createCloudClient` only sends `X-Org-Id` for the *active* backend, so\n * a conversation launched against an inactive backend lands in the API key's\n * own organization.\n */\nexport function pickCloudBackendForLaunch(): Backend | null {\n const active = getActiveBackend().backend;\n if (active.kind === \"cloud\") return active;\n return (\n getRegisteredBackends().find(\n (backend) => backend.kind === \"cloud\" && !!backend.apiKey,\n ) ?? null\n );\n}\n\n/**\n * Search the cloud app-conversations list. Mirrors the local\n * `AgentServerConversationService.searchConversations` interface but calls\n * the cloud endpoint `/api/v1/app-conversations/search`.\n */\nexport async function searchCloudConversations(\n limit: number = 20,\n pageId?: string,\n): Promise<AppConversationPage> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.set(\"limit\", String(limit));\n if (pageId) params.set(\"page_id\", pageId);\n params.set(\"sort_order\", \"UPDATED_AT_DESC\");\n\n const data = await callCloudProxy<{\n items: AppConversation[];\n next_page_id: string | null;\n }>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/search?${params.toString()}`,\n });\n\n return {\n items: (data?.items ?? []).map(\n (item) => overlayStoredRepoSelection(item) as AppConversation,\n ),\n next_page_id: data?.next_page_id ?? null,\n };\n}\n\n/**\n * Batch-fetch cloud app-conversations by id. Mirrors the local\n * `AgentServerConversationService.batchGetAppConversations` interface.\n */\nexport async function batchGetCloudConversations(\n ids: string[],\n): Promise<(AppConversation | null)[]> {\n if (ids.length === 0) return [];\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n for (const id of ids) params.append(\"ids\", id);\n const data = await callCloudProxy<(AppConversation | null)[]>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations?${params.toString()}`,\n });\n return (data ?? []).map(overlayStoredRepoSelection);\n}\n\n/**\n * Create a v1 app-conversation on the cloud backend.\n *\n * Mirrors OpenHands' cloud flow: POST /api/v1/app-conversations with the\n * `AppConversationStartRequest` payload, returning a\n * `AppConversationStartTask`. The task is initially WORKING; the caller\n * polls `getCloudAppConversationStartTask` (3s cadence per OpenHands)\n * until status is READY (then `app_conversation_id`, `agent_server_url`,\n * and `session_api_key` are populated) or ERROR.\n *\n * This path does NOT use encrypted-settings round-tripping. Secrets stay\n * server-side on the cloud backend — the only auth carried is the cloud bearer\n * token, and the conversation runtime is\n * provisioned with its own ephemeral session_api_key returned in the\n * task.\n */\nexport async function createCloudAppConversation(\n request: AppConversationStartRequest,\n // Defaults to the active backend. The typed launch action passes an explicit\n // backend because it always runs from a *local* parent conversation.\n backendOverride?: Backend,\n): Promise<AppConversationStartTask> {\n const backend = backendOverride ?? getActiveCloudBackend();\n const data = await callCloudProxy<AppConversationStartTask>({\n backend,\n method: \"POST\",\n path: \"/api/v1/app-conversations\",\n body: request as unknown as Record<string, unknown>,\n headers: AGENT_CANVAS_CLIENT_HEADERS,\n });\n return data;\n}\n\n/**\n * Download a v1 app-conversation as a ZIP from the cloud backend. Mirrors\n * the local `AgentServerConversationService.downloadConversation` interface but\n * calls\n * `GET /api/v1/app-conversations/{id}/download`, which returns\n * `application/zip` with `Content-Disposition` set by the cloud backend.\n */\nexport async function downloadCloudConversation(\n conversationId: string,\n): Promise<Blob> {\n const backend = getActiveCloudBackend();\n return callCloudProxy<Blob>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/download`,\n responseType: \"blob\",\n });\n}\n\n/**\n * Delete a v1 app-conversation on the cloud backend. Mirrors the local\n * `AgentServerConversationService.deleteConversation` interface but calls\n * `DELETE /api/v1/app-conversations/{id}`, which returns a JSON\n * `Success` envelope (discarded here — the caller only needs to know\n * the request didn't error).\n */\nexport async function deleteCloudConversation(\n conversationId: string,\n): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"DELETE\",\n path: `/api/v1/app-conversations/${conversationId}`,\n });\n}\n\n/**\n * Toggle the public-sharing flag on a cloud v1 app-conversation. Mirrors\n * OpenHands' `AgentServerConversationService.updateConversationPublicFlag`:\n * `PATCH /api/v1/app-conversations/{id}` with `{ public }`, returning\n * the updated conversation.\n */\nexport async function updateCloudConversationPublicFlag(\n conversationId: string,\n isPublic: boolean,\n): Promise<AppConversation> {\n const backend = getActiveCloudBackend();\n const data = await callCloudProxy<AppConversation>({\n backend,\n method: \"PATCH\",\n path: `/api/v1/app-conversations/${conversationId}`,\n body: { public: isPublic },\n });\n return data;\n}\n\n/**\n * Pause the cloud sandbox backing a v1 app-conversation. Mirrors\n * OpenHands' `SandboxService.pauseSandbox`:\n * `POST /api/v1/sandboxes/{sandboxId}/pause` on the cloud backend, which stops\n * the runtime owning the conversation.\n */\nexport async function pauseCloudSandbox(sandboxId: string): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"POST\",\n path: `/api/v1/sandboxes/${sandboxId}/pause`,\n });\n}\n\n/**\n * Resume a paused cloud sandbox. Mirrors OpenHands' `SandboxService.resumeSandbox`\n * by calling `POST /api/v1/sandboxes/{sandboxId}/resume` on the SaaS.\n *\n * This is the correct endpoint for waking a PAUSED sandbox. It is a\n * lightweight unpause — NOT the same as creating a new start task via\n * `POST /api/v1/app-conversations`, which provisions a fresh conversation\n * and is subject to the 120-second sandbox-start timeout.\n */\nexport async function resumeCloudSandbox(sandboxId: string): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"POST\",\n path: `/api/v1/sandboxes/${sandboxId}/resume`,\n });\n}\n\n/**\n * Read a file from a cloud conversation's sandbox workspace. Mirrors\n * OpenHands' `AgentServerConversationService.readConversationFile` — hits\n * `GET /api/v1/app-conversations/{id}/file?file_path=...` on the cloud backend\n * and returns the file content as a string.\n */\nexport async function readCloudConversationFile(\n conversationId: string,\n filePath: string,\n): Promise<string> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.append(\"file_path\", filePath);\n const data = await callCloudProxy<string>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/file?${params.toString()}`,\n });\n return data ?? \"\";\n}\n\n/**\n * List every file in a cloud conversation's sandbox workspace. Hits\n * `GET /api/v1/app-conversations/{id}/files?path=...` on the cloud backend,\n * which resolves the conversation's runtime and runs a bounded `find`\n * server-side (see enterprise `list_conversation_files`). Unlike the\n * git-changes source, this returns the full tree so the Files tab matches the\n * local-backend experience. Paths come back relative to `path`.\n */\nexport async function listCloudConversationFiles(\n conversationId: string,\n path: string,\n): Promise<string[]> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.append(\"path\", path);\n const data = await callCloudProxy<string[]>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/files?${params.toString()}`,\n });\n return Array.isArray(data) ? data : [];\n}\n\n/**\n * Fetch a single v1 app-conversation start task. Mirrors OpenHands'\n * `AgentServerConversationService.getStartTask` — uses the batch search endpoint\n * with a single id and unwraps the first result.\n */\nexport async function getCloudAppConversationStartTask(\n taskId: string,\n backendOverride?: Backend,\n): Promise<AppConversationStartTask | null> {\n const backend = backendOverride ?? getActiveCloudBackend();\n const params = new URLSearchParams();\n params.set(\"ids\", taskId);\n const data = await callCloudProxy<(AppConversationStartTask | null)[]>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/start-tasks?${params.toString()}`,\n });\n return data?.[0] ?? null;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"conversation-service.api.cjs","names":[],"sources":["../../../src/api/cloud/conversation-service.api.ts"],"sourcesContent":["import {\n getActiveBackend,\n getRegisteredBackends,\n} from \"../backend-registry/active-store\";\nimport type { Backend } from \"../backend-registry/types\";\nimport { getStoredConversationMetadata } from \"../conversation-metadata-store\";\nimport type {\n AppConversation,\n AppConversationPage,\n AppConversationStartRequest,\n AppConversationStartTask,\n} from \"../conversation-service/agent-server-conversation-service.types\";\nimport { AGENT_CANVAS_CLIENT_HEADERS } from \"../client-source\";\nimport { callCloudProxy } from \"./proxy\";\n\n/**\n * The cloud backend does not always echo `selected_repository` /\n * `selected_branch` / `git_provider` back from\n * `GET /api/v1/app-conversations` until its own background hydration\n * completes. We persist the selection to local storage at connect time\n * (see `AgentServerConversationService.updateConversationRepository`)\n * and overlay it here so the chat-page git control bar reflects the\n * connection immediately, instead of snapping back to the empty\n * \"Connect Repo\" state on every refetch.\n *\n * Server values take precedence whenever they're populated; the\n * local-storage fallback only fills in fields the server returned as\n * `null`/`undefined`.\n */\nfunction overlayStoredRepoSelection(\n conversation: AppConversation | null,\n): AppConversation | null {\n if (!conversation?.id) return conversation;\n const stored = getStoredConversationMetadata(conversation.id);\n if (!stored) return conversation;\n\n return {\n ...conversation,\n selected_repository:\n conversation.selected_repository ?? stored.selected_repository ?? null,\n selected_branch:\n conversation.selected_branch ?? stored.selected_branch ?? null,\n git_provider: conversation.git_provider ?? stored.git_provider ?? null,\n selected_workspace:\n conversation.selected_workspace ?? stored.selected_workspace ?? null,\n };\n}\n\nfunction getActiveCloudBackend(): Backend {\n const active = getActiveBackend().backend;\n if (active.kind !== \"cloud\") {\n throw new Error(\"Cloud conversations call requires a cloud backend.\");\n }\n return active;\n}\n\n/**\n * Resolve the cloud backend a Cloud conversation should be launched against\n * when the active backend may not be a cloud one. Cloud conversations cannot\n * register client tools, so the typed launch action always runs from a local\n * parent and has to reach a registered-but-inactive cloud backend.\n *\n * Prefers the active backend when it is already cloud, then the first\n * registered cloud backend that carries credentials. Returns `null` when the\n * user has no cloud backend connected, so callers can give the agent\n * corrective guidance instead of failing opaquely.\n *\n * Note: `createCloudClient` only sends `X-Org-Id` for the *active* backend, so\n * a conversation launched against an inactive backend lands in the API key's\n * own organization.\n */\nexport function pickCloudBackendForLaunch(): Backend | null {\n const active = getActiveBackend().backend;\n if (active.kind === \"cloud\") return active;\n return (\n getRegisteredBackends().find(\n (backend) => backend.kind === \"cloud\" && !!backend.apiKey,\n ) ?? null\n );\n}\n\n/**\n * Search the cloud app-conversations list. Mirrors the local\n * `AgentServerConversationService.searchConversations` interface but calls\n * the cloud endpoint `/api/v1/app-conversations/search`.\n */\nexport async function searchCloudConversations(\n limit: number = 20,\n pageId?: string,\n): Promise<AppConversationPage> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.set(\"limit\", String(limit));\n if (pageId) params.set(\"page_id\", pageId);\n params.set(\"sort_order\", \"UPDATED_AT_DESC\");\n\n const data = await callCloudProxy<{\n items: AppConversation[];\n next_page_id: string | null;\n }>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/search?${params.toString()}`,\n });\n\n return {\n items: (data?.items ?? []).map(\n (item) => overlayStoredRepoSelection(item) as AppConversation,\n ),\n next_page_id: data?.next_page_id ?? null,\n };\n}\n\n/**\n * Batch-fetch cloud app-conversations by id. Mirrors the local\n * `AgentServerConversationService.batchGetAppConversations` interface.\n */\nexport async function batchGetCloudConversations(\n ids: string[],\n): Promise<(AppConversation | null)[]> {\n if (ids.length === 0) return [];\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n for (const id of ids) params.append(\"ids\", id);\n const data = await callCloudProxy<(AppConversation | null)[]>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations?${params.toString()}`,\n });\n return (data ?? []).map(overlayStoredRepoSelection);\n}\n\n/**\n * Create a v1 app-conversation on the cloud backend.\n *\n * Mirrors OpenHands' cloud flow: POST /api/v1/app-conversations with the\n * `AppConversationStartRequest` payload, returning a\n * `AppConversationStartTask`. The task is initially WORKING; the caller\n * polls `getCloudAppConversationStartTask` (3s cadence per OpenHands)\n * until status is READY (then `app_conversation_id`, `agent_server_url`,\n * and `session_api_key` are populated) or ERROR.\n *\n * This path does NOT use encrypted-settings round-tripping. Secrets stay\n * server-side on the cloud backend — the only auth carried is the cloud bearer\n * token, and the conversation runtime is\n * provisioned with its own ephemeral session_api_key returned in the\n * task.\n */\nexport async function createCloudAppConversation(\n request: AppConversationStartRequest,\n // Defaults to the active backend. The typed launch action passes an explicit\n // backend because it always runs from a *local* parent conversation.\n backendOverride?: Backend,\n): Promise<AppConversationStartTask> {\n const backend = backendOverride ?? getActiveCloudBackend();\n const data = await callCloudProxy<AppConversationStartTask>({\n backend,\n method: \"POST\",\n path: \"/api/v1/app-conversations\",\n body: request as unknown as Record<string, unknown>,\n headers: AGENT_CANVAS_CLIENT_HEADERS,\n });\n return data;\n}\n\n/**\n * Download a v1 app-conversation as a ZIP from the cloud backend. Mirrors\n * the local `AgentServerConversationService.downloadConversation` interface but\n * calls\n * `GET /api/v1/app-conversations/{id}/download`, which returns\n * `application/zip` with `Content-Disposition` set by the cloud backend.\n */\nexport async function downloadCloudConversation(\n conversationId: string,\n): Promise<Blob> {\n const backend = getActiveCloudBackend();\n return callCloudProxy<Blob>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/download`,\n responseType: \"blob\",\n });\n}\n\n/**\n * Delete a v1 app-conversation on the cloud backend. Mirrors the local\n * `AgentServerConversationService.deleteConversation` interface but calls\n * `DELETE /api/v1/app-conversations/{id}`, which returns a JSON\n * `Success` envelope (discarded here — the caller only needs to know\n * the request didn't error).\n */\nexport async function deleteCloudConversation(\n conversationId: string,\n): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"DELETE\",\n path: `/api/v1/app-conversations/${conversationId}`,\n });\n}\n\n/**\n * Toggle the public-sharing flag on a cloud v1 app-conversation. Mirrors\n * OpenHands' `AgentServerConversationService.updateConversationPublicFlag`:\n * `PATCH /api/v1/app-conversations/{id}` with `{ public }`, returning\n * the updated conversation.\n */\nexport async function updateCloudConversationPublicFlag(\n conversationId: string,\n isPublic: boolean,\n): Promise<AppConversation> {\n const backend = getActiveCloudBackend();\n const data = await callCloudProxy<AppConversation>({\n backend,\n method: \"PATCH\",\n path: `/api/v1/app-conversations/${conversationId}`,\n body: { public: isPublic },\n });\n return data;\n}\n\n/**\n * Rename a cloud v1 app-conversation. The title belongs to the Cloud\n * app-conversation resource, so updating a runtime Agent Server would not\n * persist it in the Cloud conversation list.\n */\nexport async function updateCloudConversationTitle(\n conversationId: string,\n title: string,\n): Promise<AppConversation> {\n const backend = getActiveCloudBackend();\n return callCloudProxy<AppConversation>({\n backend,\n method: \"PATCH\",\n path: `/api/v1/app-conversations/${conversationId}`,\n body: { title },\n });\n}\n\n/**\n * Pause the cloud sandbox backing a v1 app-conversation. Mirrors\n * OpenHands' `SandboxService.pauseSandbox`:\n * `POST /api/v1/sandboxes/{sandboxId}/pause` on the cloud backend, which stops\n * the runtime owning the conversation.\n */\nexport async function pauseCloudSandbox(sandboxId: string): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"POST\",\n path: `/api/v1/sandboxes/${sandboxId}/pause`,\n });\n}\n\n/**\n * Resume a paused cloud sandbox. Mirrors OpenHands' `SandboxService.resumeSandbox`\n * by calling `POST /api/v1/sandboxes/{sandboxId}/resume` on the SaaS.\n *\n * This is the correct endpoint for waking a PAUSED sandbox. It is a\n * lightweight unpause — NOT the same as creating a new start task via\n * `POST /api/v1/app-conversations`, which provisions a fresh conversation\n * and is subject to the 120-second sandbox-start timeout.\n */\nexport async function resumeCloudSandbox(sandboxId: string): Promise<void> {\n const backend = getActiveCloudBackend();\n await callCloudProxy<unknown>({\n backend,\n method: \"POST\",\n path: `/api/v1/sandboxes/${sandboxId}/resume`,\n });\n}\n\n/**\n * Read a file from a cloud conversation's sandbox workspace. Mirrors\n * OpenHands' `AgentServerConversationService.readConversationFile` — hits\n * `GET /api/v1/app-conversations/{id}/file?file_path=...` on the cloud backend\n * and returns the file content as a string.\n */\nexport async function readCloudConversationFile(\n conversationId: string,\n filePath: string,\n): Promise<string> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.append(\"file_path\", filePath);\n const data = await callCloudProxy<string>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/file?${params.toString()}`,\n });\n return data ?? \"\";\n}\n\n/**\n * List every file in a cloud conversation's sandbox workspace. Hits\n * `GET /api/v1/app-conversations/{id}/files?path=...` on the cloud backend,\n * which resolves the conversation's runtime and runs a bounded `find`\n * server-side (see enterprise `list_conversation_files`). Unlike the\n * git-changes source, this returns the full tree so the Files tab matches the\n * local-backend experience. Paths come back relative to `path`.\n */\nexport async function listCloudConversationFiles(\n conversationId: string,\n path: string,\n): Promise<string[]> {\n const backend = getActiveCloudBackend();\n const params = new URLSearchParams();\n params.append(\"path\", path);\n const data = await callCloudProxy<string[]>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/files?${params.toString()}`,\n });\n return Array.isArray(data) ? data : [];\n}\n\n/**\n * Fetch a single v1 app-conversation start task. Mirrors OpenHands'\n * `AgentServerConversationService.getStartTask` — uses the batch search endpoint\n * with a single id and unwraps the first result.\n */\nexport async function getCloudAppConversationStartTask(\n taskId: string,\n backendOverride?: Backend,\n): Promise<AppConversationStartTask | null> {\n const backend = backendOverride ?? getActiveCloudBackend();\n const params = new URLSearchParams();\n params.set(\"ids\", taskId);\n const data = await callCloudProxy<(AppConversationStartTask | null)[]>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/start-tasks?${params.toString()}`,\n });\n return data?.[0] ?? null;\n}\n"],"mappings":"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"}
@@ -67,6 +67,12 @@ export declare function deleteCloudConversation(conversationId: string): Promise
67
67
  * the updated conversation.
68
68
  */
69
69
  export declare function updateCloudConversationPublicFlag(conversationId: string, isPublic: boolean): Promise<AppConversation>;
70
+ /**
71
+ * Rename a cloud v1 app-conversation. The title belongs to the Cloud
72
+ * app-conversation resource, so updating a runtime Agent Server would not
73
+ * persist it in the Cloud conversation list.
74
+ */
75
+ export declare function updateCloudConversationTitle(conversationId: string, title: string): Promise<AppConversation>;
70
76
  /**
71
77
  * Pause the cloud sandbox backing a v1 app-conversation. Mirrors
72
78
  * OpenHands' `SandboxService.pauseSandbox`:
@@ -78,21 +78,29 @@ async function p(e, t) {
78
78
  body: { public: t }
79
79
  });
80
80
  }
81
- async function m(e) {
81
+ async function m(e, t) {
82
+ return i({
83
+ backend: o(),
84
+ method: "PATCH",
85
+ path: `/api/v1/app-conversations/${e}`,
86
+ body: { title: t }
87
+ });
88
+ }
89
+ async function h(e) {
82
90
  await i({
83
91
  backend: o(),
84
92
  method: "POST",
85
93
  path: `/api/v1/sandboxes/${e}/pause`
86
94
  });
87
95
  }
88
- async function h(e) {
96
+ async function g(e) {
89
97
  await i({
90
98
  backend: o(),
91
99
  method: "POST",
92
100
  path: `/api/v1/sandboxes/${e}/resume`
93
101
  });
94
102
  }
95
- async function g(e, t) {
103
+ async function _(e, t) {
96
104
  let n = o(), r = new URLSearchParams();
97
105
  return r.append("file_path", t), await i({
98
106
  backend: n,
@@ -100,7 +108,7 @@ async function g(e, t) {
100
108
  path: `/api/v1/app-conversations/${e}/file?${r.toString()}`
101
109
  }) ?? "";
102
110
  }
103
- async function _(e, t) {
111
+ async function v(e, t) {
104
112
  let n = o(), r = new URLSearchParams();
105
113
  r.append("path", t);
106
114
  let a = await i({
@@ -110,7 +118,7 @@ async function _(e, t) {
110
118
  });
111
119
  return Array.isArray(a) ? a : [];
112
120
  }
113
- async function v(e, t) {
121
+ async function y(e, t) {
114
122
  let n = t ?? o(), r = new URLSearchParams();
115
123
  return r.set("ids", e), (await i({
116
124
  backend: n,
@@ -119,6 +127,6 @@ async function v(e, t) {
119
127
  }))?.[0] ?? null;
120
128
  }
121
129
  //#endregion
122
- export { l as batchGetCloudConversations, u as createCloudAppConversation, f as deleteCloudConversation, d as downloadCloudConversation, v as getCloudAppConversationStartTask, _ as listCloudConversationFiles, m as pauseCloudSandbox, s as pickCloudBackendForLaunch, g as readCloudConversationFile, h as resumeCloudSandbox, c as searchCloudConversations, p as updateCloudConversationPublicFlag };
130
+ export { l as batchGetCloudConversations, u as createCloudAppConversation, f as deleteCloudConversation, d as downloadCloudConversation, y as getCloudAppConversationStartTask, v as listCloudConversationFiles, h as pauseCloudSandbox, s as pickCloudBackendForLaunch, _ as readCloudConversationFile, g as resumeCloudSandbox, c as searchCloudConversations, p as updateCloudConversationPublicFlag, m as updateCloudConversationTitle };
123
131
 
124
132
  //# sourceMappingURL=conversation-service.api.js.map