@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":"conversation-service.api.js","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":";;;;;AA6BA,SAAS,EACP,GACwB;CACxB,IAAI,CAAC,GAAc,IAAI,OAAO;CAC9B,IAAM,IAAS,EAA8B,EAAa,EAAE;CAG5D,OAFK,IAEE;EACL,GAAG;EACH,qBACE,EAAa,uBAAuB,EAAO,uBAAuB;EACpE,iBACE,EAAa,mBAAmB,EAAO,mBAAmB;EAC5D,cAAc,EAAa,gBAAgB,EAAO,gBAAgB;EAClE,oBACE,EAAa,sBAAsB,EAAO,sBAAsB;CACpE,IAXoB;AAYtB;AAEA,SAAS,IAAiC;CACxC,IAAM,IAAS,EAAiB,EAAE;CAClC,IAAI,EAAO,SAAS,SAClB,MAAU,MAAM,oDAAoD;CAEtE,OAAO;AACT;AAiBA,SAAgB,IAA4C;CAC1D,IAAM,IAAS,EAAiB,EAAE;CAElC,OADI,EAAO,SAAS,UAAgB,IAElC,EAAsB,EAAE,MACrB,MAAY,EAAQ,SAAS,WAAW,CAAC,CAAC,EAAQ,MACrD,KAAK;AAET;AAOA,eAAsB,EACpB,IAAgB,IAChB,GAC8B;CAC9B,IAAM,IAAU,EAAsB,GAChC,IAAS,IAAI,gBAAgB;CAGnC,AAFA,EAAO,IAAI,SAAS,OAAO,CAAK,CAAC,GAC7B,KAAQ,EAAO,IAAI,WAAW,CAAM,GACxC,EAAO,IAAI,cAAc,iBAAiB;CAE1C,IAAM,IAAO,MAAM,EAGhB;EACD;EACA,QAAQ;EACR,MAAM,oCAAoC,EAAO,SAAS;CAC5D,CAAC;CAED,OAAO;EACL,QAAQ,GAAM,SAAS,CAAC,GAAG,KACxB,MAAS,EAA2B,CAAI,CAC3C;EACA,cAAc,GAAM,gBAAgB;CACtC;AACF;AAMA,eAAsB,EACpB,GACqC;CACrC,IAAI,EAAI,WAAW,GAAG,OAAO,CAAC;CAC9B,IAAM,IAAU,EAAsB,GAChC,IAAS,IAAI,gBAAgB;CACnC,KAAK,IAAM,KAAM,GAAK,EAAO,OAAO,OAAO,CAAE;CAM7C,QAAQ,MALW,EAA2C;EAC5D;EACA,QAAQ;EACR,MAAM,6BAA6B,EAAO,SAAS;CACrD,CAAC,KACe,CAAC,GAAG,IAAI,CAA0B;AACpD;AAkBA,eAAsB,EACpB,GAGA,GACmC;CASnC,OAAO,MAPY,EAAyC;EAC1D,SAFc,KAAmB,EAAsB;EAGvD,QAAQ;EACR,MAAM;EACN,MAAM;EACN,SAAS;CACX,CAAC;AAEH;AASA,eAAsB,EACpB,GACe;CAEf,OAAO,EAAqB;EAC1B,SAFc,EAEd;EACA,QAAQ;EACR,MAAM,6BAA6B,EAAe;EAClD,cAAc;CAChB,CAAC;AACH;AASA,eAAsB,EACpB,GACe;CAEf,MAAM,EAAwB;EAC5B,SAFc,EAEd;EACA,QAAQ;EACR,MAAM,6BAA6B;CACrC,CAAC;AACH;AAQA,eAAsB,EACpB,GACA,GAC0B;CAQ1B,OAAO,MANY,EAAgC;EACjD,SAFc,EAEd;EACA,QAAQ;EACR,MAAM,6BAA6B;EACnC,MAAM,EAAE,QAAQ,EAAS;CAC3B,CAAC;AAEH;AAQA,eAAsB,EAAkB,GAAkC;CAExE,MAAM,EAAwB;EAC5B,SAFc,EAEd;EACA,QAAQ;EACR,MAAM,qBAAqB,EAAU;CACvC,CAAC;AACH;AAWA,eAAsB,EAAmB,GAAkC;CAEzE,MAAM,EAAwB;EAC5B,SAFc,EAEd;EACA,QAAQ;EACR,MAAM,qBAAqB,EAAU;CACvC,CAAC;AACH;AAQA,eAAsB,EACpB,GACA,GACiB;CACjB,IAAM,IAAU,EAAsB,GAChC,IAAS,IAAI,gBAAgB;CAOnC,OANA,EAAO,OAAO,aAAa,CAAQ,GAM5B,MALY,EAAuB;EACxC;EACA,QAAQ;EACR,MAAM,6BAA6B,EAAe,QAAQ,EAAO,SAAS;CAC5E,CAAC,KACc;AACjB;AAUA,eAAsB,EACpB,GACA,GACmB;CACnB,IAAM,IAAU,EAAsB,GAChC,IAAS,IAAI,gBAAgB;CACnC,EAAO,OAAO,QAAQ,CAAI;CAC1B,IAAM,IAAO,MAAM,EAAyB;EAC1C;EACA,QAAQ;EACR,MAAM,6BAA6B,EAAe,SAAS,EAAO,SAAS;CAC7E,CAAC;CACD,OAAO,MAAM,QAAQ,CAAI,IAAI,IAAO,CAAC;AACvC;AAOA,eAAsB,EACpB,GACA,GAC0C;CAC1C,IAAM,IAAU,KAAmB,EAAsB,GACnD,IAAS,IAAI,gBAAgB;CAOnC,OANA,EAAO,IAAI,OAAO,CAAM,IAMjB,MALY,EAAoD;EACrE;EACA,QAAQ;EACR,MAAM,yCAAyC,EAAO,SAAS;CACjE,CAAC,KACa,MAAM;AACtB"}
1
+ {"version":3,"file":"conversation-service.api.js","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":";;;;;AA6BA,SAAS,EACP,GACwB;CACxB,IAAI,CAAC,GAAc,IAAI,OAAO;CAC9B,IAAM,IAAS,EAA8B,EAAa,EAAE;CAG5D,OAFK,IAEE;EACL,GAAG;EACH,qBACE,EAAa,uBAAuB,EAAO,uBAAuB;EACpE,iBACE,EAAa,mBAAmB,EAAO,mBAAmB;EAC5D,cAAc,EAAa,gBAAgB,EAAO,gBAAgB;EAClE,oBACE,EAAa,sBAAsB,EAAO,sBAAsB;CACpE,IAXoB;AAYtB;AAEA,SAAS,IAAiC;CACxC,IAAM,IAAS,EAAiB,EAAE;CAClC,IAAI,EAAO,SAAS,SAClB,MAAU,MAAM,oDAAoD;CAEtE,OAAO;AACT;AAiBA,SAAgB,IAA4C;CAC1D,IAAM,IAAS,EAAiB,EAAE;CAElC,OADI,EAAO,SAAS,UAAgB,IAElC,EAAsB,EAAE,MACrB,MAAY,EAAQ,SAAS,WAAW,CAAC,CAAC,EAAQ,MACrD,KAAK;AAET;AAOA,eAAsB,EACpB,IAAgB,IAChB,GAC8B;CAC9B,IAAM,IAAU,EAAsB,GAChC,IAAS,IAAI,gBAAgB;CAGnC,AAFA,EAAO,IAAI,SAAS,OAAO,CAAK,CAAC,GAC7B,KAAQ,EAAO,IAAI,WAAW,CAAM,GACxC,EAAO,IAAI,cAAc,iBAAiB;CAE1C,IAAM,IAAO,MAAM,EAGhB;EACD;EACA,QAAQ;EACR,MAAM,oCAAoC,EAAO,SAAS;CAC5D,CAAC;CAED,OAAO;EACL,QAAQ,GAAM,SAAS,CAAC,GAAG,KACxB,MAAS,EAA2B,CAAI,CAC3C;EACA,cAAc,GAAM,gBAAgB;CACtC;AACF;AAMA,eAAsB,EACpB,GACqC;CACrC,IAAI,EAAI,WAAW,GAAG,OAAO,CAAC;CAC9B,IAAM,IAAU,EAAsB,GAChC,IAAS,IAAI,gBAAgB;CACnC,KAAK,IAAM,KAAM,GAAK,EAAO,OAAO,OAAO,CAAE;CAM7C,QAAQ,MALW,EAA2C;EAC5D;EACA,QAAQ;EACR,MAAM,6BAA6B,EAAO,SAAS;CACrD,CAAC,KACe,CAAC,GAAG,IAAI,CAA0B;AACpD;AAkBA,eAAsB,EACpB,GAGA,GACmC;CASnC,OAAO,MAPY,EAAyC;EAC1D,SAFc,KAAmB,EAAsB;EAGvD,QAAQ;EACR,MAAM;EACN,MAAM;EACN,SAAS;CACX,CAAC;AAEH;AASA,eAAsB,EACpB,GACe;CAEf,OAAO,EAAqB;EAC1B,SAFc,EAEd;EACA,QAAQ;EACR,MAAM,6BAA6B,EAAe;EAClD,cAAc;CAChB,CAAC;AACH;AASA,eAAsB,EACpB,GACe;CAEf,MAAM,EAAwB;EAC5B,SAFc,EAEd;EACA,QAAQ;EACR,MAAM,6BAA6B;CACrC,CAAC;AACH;AAQA,eAAsB,EACpB,GACA,GAC0B;CAQ1B,OAAO,MANY,EAAgC;EACjD,SAFc,EAEd;EACA,QAAQ;EACR,MAAM,6BAA6B;EACnC,MAAM,EAAE,QAAQ,EAAS;CAC3B,CAAC;AAEH;AAOA,eAAsB,EACpB,GACA,GAC0B;CAE1B,OAAO,EAAgC;EACrC,SAFc,EAEd;EACA,QAAQ;EACR,MAAM,6BAA6B;EACnC,MAAM,EAAE,SAAM;CAChB,CAAC;AACH;AAQA,eAAsB,EAAkB,GAAkC;CAExE,MAAM,EAAwB;EAC5B,SAFc,EAEd;EACA,QAAQ;EACR,MAAM,qBAAqB,EAAU;CACvC,CAAC;AACH;AAWA,eAAsB,EAAmB,GAAkC;CAEzE,MAAM,EAAwB;EAC5B,SAFc,EAEd;EACA,QAAQ;EACR,MAAM,qBAAqB,EAAU;CACvC,CAAC;AACH;AAQA,eAAsB,EACpB,GACA,GACiB;CACjB,IAAM,IAAU,EAAsB,GAChC,IAAS,IAAI,gBAAgB;CAOnC,OANA,EAAO,OAAO,aAAa,CAAQ,GAM5B,MALY,EAAuB;EACxC;EACA,QAAQ;EACR,MAAM,6BAA6B,EAAe,QAAQ,EAAO,SAAS;CAC5E,CAAC,KACc;AACjB;AAUA,eAAsB,EACpB,GACA,GACmB;CACnB,IAAM,IAAU,EAAsB,GAChC,IAAS,IAAI,gBAAgB;CACnC,EAAO,OAAO,QAAQ,CAAI;CAC1B,IAAM,IAAO,MAAM,EAAyB;EAC1C;EACA,QAAQ;EACR,MAAM,6BAA6B,EAAe,SAAS,EAAO,SAAS;CAC7E,CAAC;CACD,OAAO,MAAM,QAAQ,CAAI,IAAI,IAAO,CAAC;AACvC;AAOA,eAAsB,EACpB,GACA,GAC0C;CAC1C,IAAM,IAAU,KAAmB,EAAsB,GACnD,IAAS,IAAI,gBAAgB;CAOnC,OANA,EAAO,IAAI,OAAO,CAAM,IAMjB,MALY,EAAoD;EACrE;EACA,QAAQ;EACR,MAAM,yCAAyC,EAAO,SAAS;CACjE,CAAC,KACa,MAAM;AACtB"}
@@ -0,0 +1,2 @@
1
+ require("../../_virtual/_rolldown/runtime.cjs");const e=require("../backend-registry/active-store.cjs"),t=require("./proxy.cjs");function n(){let{backend:t,orgId:n}=e.getActiveBackend();if(t.kind!==`cloud`)throw Error(`Cloud provider-connections call requires a cloud backend.`);if(!n)throw Error(`Cloud provider connections require an organization-bound backend.`);return{backend:t,base:`/api/organizations/${encodeURIComponent(n)}/provider-connections`}}async function r(){let{backend:e,base:r}=n();return(await t.callCloudProxy({backend:e,method:`GET`,path:r})).connections??[]}async function i(e){let{backend:r,base:i}=n();return t.callCloudProxy({backend:r,method:`POST`,path:i,body:e})}async function a(e,r){let{backend:i,base:a}=n();return t.callCloudProxy({backend:i,method:`PATCH`,path:`${a}/${encodeURIComponent(e)}`,body:r})}async function o(e){let{backend:r,base:i}=n();return t.callCloudProxy({backend:r,method:`DELETE`,path:`${i}/${encodeURIComponent(e)}`})}exports.createCloudProviderConnection=i,exports.deleteCloudProviderConnection=o,exports.fetchCloudProviderConnections=r,exports.updateCloudProviderConnection=a;
2
+ //# sourceMappingURL=provider-connections-service.api.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-connections-service.api.cjs","names":[],"sources":["../../../src/api/cloud/provider-connections-service.api.ts"],"sourcesContent":["import type {\n ProviderConnection,\n CreateProviderConnectionRequest,\n UpdateProviderConnectionRequest,\n} from \"../provider-connections-service/provider-connections-service.api\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport type { Backend } from \"../backend-registry/types\";\nimport { callCloudProxy } from \"./proxy\";\n\n/**\n * Cloud provider-connections service.\n *\n * Provider-connection CRUD is routed to the org-scoped endpoints\n * `/api/organizations/{orgId}/provider-connections`, which enforce\n * `EDIT_ORG_SETTINGS` server-side (listing requires `VIEW_ORG_SETTINGS`) — so a\n * member's mutation is rejected with 403 even on a direct API call, not just\n * hidden in the UI. This mirrors the cloud LLM-profile service.\n *\n * Unlike the local agent-server (which returns a bare array), the org list\n * route wraps results as `{ connections: [...] }`; this service unwraps that so\n * callers see the same `ProviderConnection[]` shape on both backends. Individual\n * mutations return a bare `ProviderConnection` on both backends. Neither route\n * exposes the stored key; each item carries `api_key_set` instead.\n *\n * Cloud has no unbound-org fallback here: provider connections are inherently\n * org-scoped, so an org must be bound. A cloud backend without an org id is a\n * programming error rather than a legacy-key case.\n */\n\ninterface CloudProviderConnectionListResponse {\n connections: ProviderConnection[];\n}\n\n/** Resolve the backend + org-scoped base path for the active cloud backend. */\nfunction cloudProviderConnectionsTarget(): { backend: Backend; base: string } {\n const { backend, orgId } = getActiveBackend();\n if (backend.kind !== \"cloud\") {\n throw new Error(\n \"Cloud provider-connections call requires a cloud backend.\",\n );\n }\n if (!orgId) {\n throw new Error(\n \"Cloud provider connections require an organization-bound backend.\",\n );\n }\n return {\n backend,\n base: `/api/organizations/${encodeURIComponent(orgId)}/provider-connections`,\n };\n}\n\nexport async function fetchCloudProviderConnections(): Promise<\n ProviderConnection[]\n> {\n const { backend, base } = cloudProviderConnectionsTarget();\n const result = await callCloudProxy<CloudProviderConnectionListResponse>({\n backend,\n method: \"GET\",\n path: base,\n });\n return result.connections ?? [];\n}\n\nexport async function createCloudProviderConnection(\n request: CreateProviderConnectionRequest,\n): Promise<ProviderConnection> {\n const { backend, base } = cloudProviderConnectionsTarget();\n return callCloudProxy<ProviderConnection>({\n backend,\n method: \"POST\",\n path: base,\n body: request,\n });\n}\n\nexport async function updateCloudProviderConnection(\n id: string,\n request: UpdateProviderConnectionRequest,\n): Promise<ProviderConnection> {\n const { backend, base } = cloudProviderConnectionsTarget();\n return callCloudProxy<ProviderConnection>({\n backend,\n method: \"PATCH\",\n path: `${base}/${encodeURIComponent(id)}`,\n body: request,\n });\n}\n\nexport async function deleteCloudProviderConnection(\n id: string,\n): Promise<ProviderConnection> {\n const { backend, base } = cloudProviderConnectionsTarget();\n return callCloudProxy<ProviderConnection>({\n backend,\n method: \"DELETE\",\n path: `${base}/${encodeURIComponent(id)}`,\n });\n}\n"],"mappings":"iIAkCA,SAAS,GAAqE,CAC5E,GAAM,CAAE,UAAS,SAAU,EAAA,iBAAiB,EAC5C,GAAI,EAAQ,OAAS,QACnB,MAAU,MACR,2DACF,EAEF,GAAI,CAAC,EACH,MAAU,MACR,mEACF,EAEF,MAAO,CACL,UACA,KAAM,sBAAsB,mBAAmB,CAAK,EAAE,sBACxD,CACF,CAEA,eAAsB,GAEpB,CACA,GAAM,CAAE,UAAS,QAAS,EAA+B,EAMzD,OAAO,MALc,EAAA,eAAoD,CACvE,UACA,OAAQ,MACR,KAAM,CACR,CAAC,GACa,aAAe,CAAC,CAChC,CAEA,eAAsB,EACpB,EAC6B,CAC7B,GAAM,CAAE,UAAS,QAAS,EAA+B,EACzD,OAAO,EAAA,eAAmC,CACxC,UACA,OAAQ,OACR,KAAM,EACN,KAAM,CACR,CAAC,CACH,CAEA,eAAsB,EACpB,EACA,EAC6B,CAC7B,GAAM,CAAE,UAAS,QAAS,EAA+B,EACzD,OAAO,EAAA,eAAmC,CACxC,UACA,OAAQ,QACR,KAAM,GAAG,EAAK,GAAG,mBAAmB,CAAE,IACtC,KAAM,CACR,CAAC,CACH,CAEA,eAAsB,EACpB,EAC6B,CAC7B,GAAM,CAAE,UAAS,QAAS,EAA+B,EACzD,OAAO,EAAA,eAAmC,CACxC,UACA,OAAQ,SACR,KAAM,GAAG,EAAK,GAAG,mBAAmB,CAAE,GACxC,CAAC,CACH"}
@@ -0,0 +1,5 @@
1
+ import type { ProviderConnection, CreateProviderConnectionRequest, UpdateProviderConnectionRequest } from "../provider-connections-service/provider-connections-service.api";
2
+ export declare function fetchCloudProviderConnections(): Promise<ProviderConnection[]>;
3
+ export declare function createCloudProviderConnection(request: CreateProviderConnectionRequest): Promise<ProviderConnection>;
4
+ export declare function updateCloudProviderConnection(id: string, request: UpdateProviderConnectionRequest): Promise<ProviderConnection>;
5
+ export declare function deleteCloudProviderConnection(id: string): Promise<ProviderConnection>;
@@ -0,0 +1,50 @@
1
+ import { getActiveBackend as e } from "../backend-registry/active-store.js";
2
+ import { callCloudProxy as t } from "./proxy.js";
3
+ //#region src/api/cloud/provider-connections-service.api.ts
4
+ function n() {
5
+ let { backend: t, orgId: n } = e();
6
+ if (t.kind !== "cloud") throw Error("Cloud provider-connections call requires a cloud backend.");
7
+ if (!n) throw Error("Cloud provider connections require an organization-bound backend.");
8
+ return {
9
+ backend: t,
10
+ base: `/api/organizations/${encodeURIComponent(n)}/provider-connections`
11
+ };
12
+ }
13
+ async function r() {
14
+ let { backend: e, base: r } = n();
15
+ return (await t({
16
+ backend: e,
17
+ method: "GET",
18
+ path: r
19
+ })).connections ?? [];
20
+ }
21
+ async function i(e) {
22
+ let { backend: r, base: i } = n();
23
+ return t({
24
+ backend: r,
25
+ method: "POST",
26
+ path: i,
27
+ body: e
28
+ });
29
+ }
30
+ async function a(e, r) {
31
+ let { backend: i, base: a } = n();
32
+ return t({
33
+ backend: i,
34
+ method: "PATCH",
35
+ path: `${a}/${encodeURIComponent(e)}`,
36
+ body: r
37
+ });
38
+ }
39
+ async function o(e) {
40
+ let { backend: r, base: i } = n();
41
+ return t({
42
+ backend: r,
43
+ method: "DELETE",
44
+ path: `${i}/${encodeURIComponent(e)}`
45
+ });
46
+ }
47
+ //#endregion
48
+ export { i as createCloudProviderConnection, o as deleteCloudProviderConnection, r as fetchCloudProviderConnections, a as updateCloudProviderConnection };
49
+
50
+ //# sourceMappingURL=provider-connections-service.api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-connections-service.api.js","names":[],"sources":["../../../src/api/cloud/provider-connections-service.api.ts"],"sourcesContent":["import type {\n ProviderConnection,\n CreateProviderConnectionRequest,\n UpdateProviderConnectionRequest,\n} from \"../provider-connections-service/provider-connections-service.api\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport type { Backend } from \"../backend-registry/types\";\nimport { callCloudProxy } from \"./proxy\";\n\n/**\n * Cloud provider-connections service.\n *\n * Provider-connection CRUD is routed to the org-scoped endpoints\n * `/api/organizations/{orgId}/provider-connections`, which enforce\n * `EDIT_ORG_SETTINGS` server-side (listing requires `VIEW_ORG_SETTINGS`) — so a\n * member's mutation is rejected with 403 even on a direct API call, not just\n * hidden in the UI. This mirrors the cloud LLM-profile service.\n *\n * Unlike the local agent-server (which returns a bare array), the org list\n * route wraps results as `{ connections: [...] }`; this service unwraps that so\n * callers see the same `ProviderConnection[]` shape on both backends. Individual\n * mutations return a bare `ProviderConnection` on both backends. Neither route\n * exposes the stored key; each item carries `api_key_set` instead.\n *\n * Cloud has no unbound-org fallback here: provider connections are inherently\n * org-scoped, so an org must be bound. A cloud backend without an org id is a\n * programming error rather than a legacy-key case.\n */\n\ninterface CloudProviderConnectionListResponse {\n connections: ProviderConnection[];\n}\n\n/** Resolve the backend + org-scoped base path for the active cloud backend. */\nfunction cloudProviderConnectionsTarget(): { backend: Backend; base: string } {\n const { backend, orgId } = getActiveBackend();\n if (backend.kind !== \"cloud\") {\n throw new Error(\n \"Cloud provider-connections call requires a cloud backend.\",\n );\n }\n if (!orgId) {\n throw new Error(\n \"Cloud provider connections require an organization-bound backend.\",\n );\n }\n return {\n backend,\n base: `/api/organizations/${encodeURIComponent(orgId)}/provider-connections`,\n };\n}\n\nexport async function fetchCloudProviderConnections(): Promise<\n ProviderConnection[]\n> {\n const { backend, base } = cloudProviderConnectionsTarget();\n const result = await callCloudProxy<CloudProviderConnectionListResponse>({\n backend,\n method: \"GET\",\n path: base,\n });\n return result.connections ?? [];\n}\n\nexport async function createCloudProviderConnection(\n request: CreateProviderConnectionRequest,\n): Promise<ProviderConnection> {\n const { backend, base } = cloudProviderConnectionsTarget();\n return callCloudProxy<ProviderConnection>({\n backend,\n method: \"POST\",\n path: base,\n body: request,\n });\n}\n\nexport async function updateCloudProviderConnection(\n id: string,\n request: UpdateProviderConnectionRequest,\n): Promise<ProviderConnection> {\n const { backend, base } = cloudProviderConnectionsTarget();\n return callCloudProxy<ProviderConnection>({\n backend,\n method: \"PATCH\",\n path: `${base}/${encodeURIComponent(id)}`,\n body: request,\n });\n}\n\nexport async function deleteCloudProviderConnection(\n id: string,\n): Promise<ProviderConnection> {\n const { backend, base } = cloudProviderConnectionsTarget();\n return callCloudProxy<ProviderConnection>({\n backend,\n method: \"DELETE\",\n path: `${base}/${encodeURIComponent(id)}`,\n });\n}\n"],"mappings":";;;AAkCA,SAAS,IAAqE;CAC5E,IAAM,EAAE,YAAS,aAAU,EAAiB;CAC5C,IAAI,EAAQ,SAAS,SACnB,MAAU,MACR,2DACF;CAEF,IAAI,CAAC,GACH,MAAU,MACR,mEACF;CAEF,OAAO;EACL;EACA,MAAM,sBAAsB,mBAAmB,CAAK,EAAE;CACxD;AACF;AAEA,eAAsB,IAEpB;CACA,IAAM,EAAE,YAAS,YAAS,EAA+B;CAMzD,QAAO,MALc,EAAoD;EACvE;EACA,QAAQ;EACR,MAAM;CACR,CAAC,GACa,eAAe,CAAC;AAChC;AAEA,eAAsB,EACpB,GAC6B;CAC7B,IAAM,EAAE,YAAS,YAAS,EAA+B;CACzD,OAAO,EAAmC;EACxC;EACA,QAAQ;EACR,MAAM;EACN,MAAM;CACR,CAAC;AACH;AAEA,eAAsB,EACpB,GACA,GAC6B;CAC7B,IAAM,EAAE,YAAS,YAAS,EAA+B;CACzD,OAAO,EAAmC;EACxC;EACA,QAAQ;EACR,MAAM,GAAG,EAAK,GAAG,mBAAmB,CAAE;EACtC,MAAM;CACR,CAAC;AACH;AAEA,eAAsB,EACpB,GAC6B;CAC7B,IAAM,EAAE,YAAS,YAAS,EAA+B;CACzD,OAAO,EAAmC;EACxC;EACA,QAAQ;EACR,MAAM,GAAG,EAAK,GAAG,mBAAmB,CAAE;CACxC,CAAC;AACH"}
@@ -1,2 +1,2 @@
1
- require("../../_virtual/_rolldown/runtime.cjs");const e=require("../backend-registry/active-store.cjs"),t=require("./proxy.cjs");var n=100;function r(){let t=e.getActiveBackend().backend;if(t.kind!==`cloud`)throw Error(`Cloud skills call requires a cloud backend.`);return t}async function i(){let e=r(),i=[],a=null;do{let r=new URLSearchParams({limit:String(n)});a&&r.set(`page_id`,a);let o=await t.callCloudProxy({backend:e,method:`GET`,path:`/api/v1/skills/search?${r.toString()}`});i.push(...o.items??[]),a=o.next_page_id}while(a);return i}exports.fetchCloudSkills=i;
1
+ require("../../_virtual/_rolldown/runtime.cjs");const e=require("../backend-registry/active-store.cjs"),t=require("./proxy.cjs");var n=100;function r(){let t=e.getActiveBackend().backend;if(t.kind!==`cloud`)throw Error(`Cloud skills call requires a cloud backend.`);return t}async function i(){let e=r(),i=[],a=null;do{let r=new URLSearchParams({limit:String(n)});a&&r.set(`page_id`,a);let o=await t.callCloudProxy({backend:e,method:`GET`,path:`/api/v1/skills/search?${r.toString()}`});i.push(...o.items??[]),a=o.next_page_id}while(a);return i}async function a(e){return((await t.callCloudProxy({backend:r(),method:`GET`,path:`/api/v1/app-conversations/${e}/skills`}))?.skills??[]).map(e=>({...e,source:null}))}exports.fetchCloudConversationSkills=a,exports.fetchCloudSkills=i;
2
2
  //# sourceMappingURL=skills-service.api.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"skills-service.api.cjs","names":[],"sources":["../../../src/api/cloud/skills-service.api.ts"],"sourcesContent":["import type { SkillInfo } from \"#/types/settings\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport type { Backend } from \"../backend-registry/types\";\nimport { callCloudProxy } from \"./proxy\";\n\ninterface CloudSkillsPage {\n items: SkillInfo[];\n next_page_id: string | null;\n}\n\nconst PAGE_LIMIT = 100;\n\nfunction getActiveCloudBackend(): Backend {\n const active = getActiveBackend().backend;\n if (active.kind !== \"cloud\") {\n throw new Error(\"Cloud skills call requires a cloud backend.\");\n }\n return active;\n}\n\n/**\n * Fetch the full list of skills from the cloud backend. The cloud endpoint is\n * paginated (page_id cursor); we walk all pages so the settings UI gets a\n * complete list in one call. The cloud SkillInfo shape\n * (name/type/source/triggers) matches the GUI's SkillInfo type, so items are\n * passed through unchanged.\n */\nexport async function fetchCloudSkills(): Promise<SkillInfo[]> {\n const backend = getActiveCloudBackend();\n\n const skills: SkillInfo[] = [];\n let pageId: string | null = null;\n\n do {\n const query = new URLSearchParams({ limit: String(PAGE_LIMIT) });\n if (pageId) query.set(\"page_id\", pageId);\n\n const page = await callCloudProxy<CloudSkillsPage>({\n backend,\n method: \"GET\",\n path: `/api/v1/skills/search?${query.toString()}`,\n });\n\n skills.push(...(page.items ?? []));\n pageId = page.next_page_id;\n } while (pageId);\n\n return skills;\n}\n"],"mappings":"iIAUA,IAAM,EAAa,IAEnB,SAAS,GAAiC,CACxC,IAAM,EAAS,EAAA,iBAAiB,EAAE,QAClC,GAAI,EAAO,OAAS,QAClB,MAAU,MAAM,6CAA6C,EAE/D,OAAO,CACT,CASA,eAAsB,GAAyC,CAC7D,IAAM,EAAU,EAAsB,EAEhC,EAAsB,CAAC,EACzB,EAAwB,KAE5B,EAAG,CACD,IAAM,EAAQ,IAAI,gBAAgB,CAAE,MAAO,OAAO,CAAU,CAAE,CAAC,EAC3D,GAAQ,EAAM,IAAI,UAAW,CAAM,EAEvC,IAAM,EAAO,MAAM,EAAA,eAAgC,CACjD,UACA,OAAQ,MACR,KAAM,yBAAyB,EAAM,SAAS,GAChD,CAAC,EAED,EAAO,KAAK,GAAI,EAAK,OAAS,CAAC,CAAE,EACjC,EAAS,EAAK,YAChB,OAAS,GAET,OAAO,CACT"}
1
+ {"version":3,"file":"skills-service.api.cjs","names":[],"sources":["../../../src/api/cloud/skills-service.api.ts"],"sourcesContent":["import type { SkillInfo } from \"#/types/settings\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport type { Backend } from \"../backend-registry/types\";\nimport { callCloudProxy } from \"./proxy\";\n\ninterface CloudSkillsPage {\n items: SkillInfo[];\n next_page_id: string | null;\n}\n\nconst PAGE_LIMIT = 100;\n\nfunction getActiveCloudBackend(): Backend {\n const active = getActiveBackend().backend;\n if (active.kind !== \"cloud\") {\n throw new Error(\"Cloud skills call requires a cloud backend.\");\n }\n return active;\n}\n\n/**\n * Fetch the full list of skills from the cloud backend. The cloud endpoint is\n * paginated (page_id cursor); we walk all pages so the settings UI gets a\n * complete list in one call. The cloud SkillInfo shape\n * (name/type/source/triggers) matches the GUI's SkillInfo type, so items are\n * passed through unchanged.\n */\nexport async function fetchCloudSkills(): Promise<SkillInfo[]> {\n const backend = getActiveCloudBackend();\n\n const skills: SkillInfo[] = [];\n let pageId: string | null = null;\n\n do {\n const query = new URLSearchParams({ limit: String(PAGE_LIMIT) });\n if (pageId) query.set(\"page_id\", pageId);\n\n const page = await callCloudProxy<CloudSkillsPage>({\n backend,\n method: \"GET\",\n path: `/api/v1/skills/search?${query.toString()}`,\n });\n\n skills.push(...(page.items ?? []));\n pageId = page.next_page_id;\n } while (pageId);\n\n return skills;\n}\n\ninterface CloudConversationSkill {\n name: string;\n type: SkillInfo[\"type\"];\n content: string;\n triggers: string[];\n}\n\ninterface CloudConversationSkillsResponse {\n skills: CloudConversationSkill[];\n}\n\n/**\n * Fetch the skills loaded into a running cloud conversation from the\n * per-conversation route (the one the OpenHands web UI's own \"Show Available\n * Skills\" modal uses). Unlike `/api/v1/skills/search`, which only scans the\n * API host's built-in skills directory, this resolves the conversation's\n * sandbox and asks its agent-server for the merged set: public catalog,\n * user/org repos, project skills and auto-loaded marketplace plugins. The\n * route reports no `source`, so it is `null`.\n */\nexport async function fetchCloudConversationSkills(\n conversationId: string,\n): Promise<SkillInfo[]> {\n const backend = getActiveCloudBackend();\n\n const data = await callCloudProxy<CloudConversationSkillsResponse>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/skills`,\n });\n\n return (data?.skills ?? []).map((skill) => ({ ...skill, source: null }));\n}\n"],"mappings":"iIAUA,IAAM,EAAa,IAEnB,SAAS,GAAiC,CACxC,IAAM,EAAS,EAAA,iBAAiB,EAAE,QAClC,GAAI,EAAO,OAAS,QAClB,MAAU,MAAM,6CAA6C,EAE/D,OAAO,CACT,CASA,eAAsB,GAAyC,CAC7D,IAAM,EAAU,EAAsB,EAEhC,EAAsB,CAAC,EACzB,EAAwB,KAE5B,EAAG,CACD,IAAM,EAAQ,IAAI,gBAAgB,CAAE,MAAO,OAAO,CAAU,CAAE,CAAC,EAC3D,GAAQ,EAAM,IAAI,UAAW,CAAM,EAEvC,IAAM,EAAO,MAAM,EAAA,eAAgC,CACjD,UACA,OAAQ,MACR,KAAM,yBAAyB,EAAM,SAAS,GAChD,CAAC,EAED,EAAO,KAAK,GAAI,EAAK,OAAS,CAAC,CAAE,EACjC,EAAS,EAAK,YAChB,OAAS,GAET,OAAO,CACT,CAsBA,eAAsB,EACpB,EACsB,CAStB,QAAQ,MANW,EAAA,eAAgD,CACjE,QAHc,EAGd,EACA,OAAQ,MACR,KAAM,6BAA6B,EAAe,QACpD,CAAC,IAEa,QAAU,CAAC,GAAG,IAAK,IAAW,CAAE,GAAG,EAAO,OAAQ,IAAK,EAAE,CACzE"}
@@ -7,3 +7,13 @@ import type { SkillInfo } from "#/types/settings";
7
7
  * passed through unchanged.
8
8
  */
9
9
  export declare function fetchCloudSkills(): Promise<SkillInfo[]>;
10
+ /**
11
+ * Fetch the skills loaded into a running cloud conversation from the
12
+ * per-conversation route (the one the OpenHands web UI's own "Show Available
13
+ * Skills" modal uses). Unlike `/api/v1/skills/search`, which only scans the
14
+ * API host's built-in skills directory, this resolves the conversation's
15
+ * sandbox and asks its agent-server for the merged set: public catalog,
16
+ * user/org repos, project skills and auto-loaded marketplace plugins. The
17
+ * route reports no `source`, so it is `null`.
18
+ */
19
+ export declare function fetchCloudConversationSkills(conversationId: string): Promise<SkillInfo[]>;
@@ -21,7 +21,17 @@ async function i() {
21
21
  } while (a);
22
22
  return i;
23
23
  }
24
+ async function a(e) {
25
+ return ((await t({
26
+ backend: r(),
27
+ method: "GET",
28
+ path: `/api/v1/app-conversations/${e}/skills`
29
+ }))?.skills ?? []).map((e) => ({
30
+ ...e,
31
+ source: null
32
+ }));
33
+ }
24
34
  //#endregion
25
- export { i as fetchCloudSkills };
35
+ export { a as fetchCloudConversationSkills, i as fetchCloudSkills };
26
36
 
27
37
  //# sourceMappingURL=skills-service.api.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"skills-service.api.js","names":[],"sources":["../../../src/api/cloud/skills-service.api.ts"],"sourcesContent":["import type { SkillInfo } from \"#/types/settings\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport type { Backend } from \"../backend-registry/types\";\nimport { callCloudProxy } from \"./proxy\";\n\ninterface CloudSkillsPage {\n items: SkillInfo[];\n next_page_id: string | null;\n}\n\nconst PAGE_LIMIT = 100;\n\nfunction getActiveCloudBackend(): Backend {\n const active = getActiveBackend().backend;\n if (active.kind !== \"cloud\") {\n throw new Error(\"Cloud skills call requires a cloud backend.\");\n }\n return active;\n}\n\n/**\n * Fetch the full list of skills from the cloud backend. The cloud endpoint is\n * paginated (page_id cursor); we walk all pages so the settings UI gets a\n * complete list in one call. The cloud SkillInfo shape\n * (name/type/source/triggers) matches the GUI's SkillInfo type, so items are\n * passed through unchanged.\n */\nexport async function fetchCloudSkills(): Promise<SkillInfo[]> {\n const backend = getActiveCloudBackend();\n\n const skills: SkillInfo[] = [];\n let pageId: string | null = null;\n\n do {\n const query = new URLSearchParams({ limit: String(PAGE_LIMIT) });\n if (pageId) query.set(\"page_id\", pageId);\n\n const page = await callCloudProxy<CloudSkillsPage>({\n backend,\n method: \"GET\",\n path: `/api/v1/skills/search?${query.toString()}`,\n });\n\n skills.push(...(page.items ?? []));\n pageId = page.next_page_id;\n } while (pageId);\n\n return skills;\n}\n"],"mappings":";;;AAUA,IAAM,IAAa;AAEnB,SAAS,IAAiC;CACxC,IAAM,IAAS,EAAiB,EAAE;CAClC,IAAI,EAAO,SAAS,SAClB,MAAU,MAAM,6CAA6C;CAE/D,OAAO;AACT;AASA,eAAsB,IAAyC;CAC7D,IAAM,IAAU,EAAsB,GAEhC,IAAsB,CAAC,GACzB,IAAwB;CAE5B,GAAG;EACD,IAAM,IAAQ,IAAI,gBAAgB,EAAE,OAAO,OAAO,CAAU,EAAE,CAAC;EAC/D,AAAI,KAAQ,EAAM,IAAI,WAAW,CAAM;EAEvC,IAAM,IAAO,MAAM,EAAgC;GACjD;GACA,QAAQ;GACR,MAAM,yBAAyB,EAAM,SAAS;EAChD,CAAC;EAGD,AADA,EAAO,KAAK,GAAI,EAAK,SAAS,CAAC,CAAE,GACjC,IAAS,EAAK;CAChB,SAAS;CAET,OAAO;AACT"}
1
+ {"version":3,"file":"skills-service.api.js","names":[],"sources":["../../../src/api/cloud/skills-service.api.ts"],"sourcesContent":["import type { SkillInfo } from \"#/types/settings\";\nimport { getActiveBackend } from \"../backend-registry/active-store\";\nimport type { Backend } from \"../backend-registry/types\";\nimport { callCloudProxy } from \"./proxy\";\n\ninterface CloudSkillsPage {\n items: SkillInfo[];\n next_page_id: string | null;\n}\n\nconst PAGE_LIMIT = 100;\n\nfunction getActiveCloudBackend(): Backend {\n const active = getActiveBackend().backend;\n if (active.kind !== \"cloud\") {\n throw new Error(\"Cloud skills call requires a cloud backend.\");\n }\n return active;\n}\n\n/**\n * Fetch the full list of skills from the cloud backend. The cloud endpoint is\n * paginated (page_id cursor); we walk all pages so the settings UI gets a\n * complete list in one call. The cloud SkillInfo shape\n * (name/type/source/triggers) matches the GUI's SkillInfo type, so items are\n * passed through unchanged.\n */\nexport async function fetchCloudSkills(): Promise<SkillInfo[]> {\n const backend = getActiveCloudBackend();\n\n const skills: SkillInfo[] = [];\n let pageId: string | null = null;\n\n do {\n const query = new URLSearchParams({ limit: String(PAGE_LIMIT) });\n if (pageId) query.set(\"page_id\", pageId);\n\n const page = await callCloudProxy<CloudSkillsPage>({\n backend,\n method: \"GET\",\n path: `/api/v1/skills/search?${query.toString()}`,\n });\n\n skills.push(...(page.items ?? []));\n pageId = page.next_page_id;\n } while (pageId);\n\n return skills;\n}\n\ninterface CloudConversationSkill {\n name: string;\n type: SkillInfo[\"type\"];\n content: string;\n triggers: string[];\n}\n\ninterface CloudConversationSkillsResponse {\n skills: CloudConversationSkill[];\n}\n\n/**\n * Fetch the skills loaded into a running cloud conversation from the\n * per-conversation route (the one the OpenHands web UI's own \"Show Available\n * Skills\" modal uses). Unlike `/api/v1/skills/search`, which only scans the\n * API host's built-in skills directory, this resolves the conversation's\n * sandbox and asks its agent-server for the merged set: public catalog,\n * user/org repos, project skills and auto-loaded marketplace plugins. The\n * route reports no `source`, so it is `null`.\n */\nexport async function fetchCloudConversationSkills(\n conversationId: string,\n): Promise<SkillInfo[]> {\n const backend = getActiveCloudBackend();\n\n const data = await callCloudProxy<CloudConversationSkillsResponse>({\n backend,\n method: \"GET\",\n path: `/api/v1/app-conversations/${conversationId}/skills`,\n });\n\n return (data?.skills ?? []).map((skill) => ({ ...skill, source: null }));\n}\n"],"mappings":";;;AAUA,IAAM,IAAa;AAEnB,SAAS,IAAiC;CACxC,IAAM,IAAS,EAAiB,EAAE;CAClC,IAAI,EAAO,SAAS,SAClB,MAAU,MAAM,6CAA6C;CAE/D,OAAO;AACT;AASA,eAAsB,IAAyC;CAC7D,IAAM,IAAU,EAAsB,GAEhC,IAAsB,CAAC,GACzB,IAAwB;CAE5B,GAAG;EACD,IAAM,IAAQ,IAAI,gBAAgB,EAAE,OAAO,OAAO,CAAU,EAAE,CAAC;EAC/D,AAAI,KAAQ,EAAM,IAAI,WAAW,CAAM;EAEvC,IAAM,IAAO,MAAM,EAAgC;GACjD;GACA,QAAQ;GACR,MAAM,yBAAyB,EAAM,SAAS;EAChD,CAAC;EAGD,AADA,EAAO,KAAK,GAAI,EAAK,SAAS,CAAC,CAAE,GACjC,IAAS,EAAK;CAChB,SAAS;CAET,OAAO;AACT;AAsBA,eAAsB,EACpB,GACsB;CAStB,SAAQ,MANW,EAAgD;EACjE,SAHc,EAGd;EACA,QAAQ;EACR,MAAM,6BAA6B,EAAe;CACpD,CAAC,IAEa,UAAU,CAAC,GAAG,KAAK,OAAW;EAAE,GAAG;EAAO,QAAQ;CAAK,EAAE;AACzE"}
@@ -1,2 +1,2 @@
1
- require("../_virtual/_rolldown/runtime.cjs");const e=require("./backend-registry/active-store.cjs"),t=require("./agent-server-client-options.cjs"),n=require("./cloud/conversation-service.api.cjs"),r=require("../node_modules/@openhands/typescript-client/dist/workspace/remote-workspace.cjs"),i=require("./workspace-upload-path.cjs");var a=5;async function o(t,r){if(r?.id===t&&r.conversation_url?.trim()&&r.session_api_key?.trim())return{conversationUrl:r.conversation_url.trim(),sessionApiKey:r.session_api_key.trim()};if(e.getActiveBackend().backend.kind===`cloud`){let[e]=await n.batchGetCloudConversations([t]);return{conversationUrl:e?.conversation_url?.trim()??null,sessionApiKey:e?.session_api_key?.trim()??null}}return{conversationUrl:null,sessionApiKey:null}}function s(e){if(!e.conversationUrl||!e.sessionApiKey)throw Error(`Conversation sandbox is still starting. Wait for it to finish, then try again.`);return{conversationUrl:e.conversationUrl,sessionApiKey:e.sessionApiKey}}async function c(t,n,r){let a=await i.resolveConversationUploadWorkingDir(t,r),c=await o(t,r),u=e.getActiveBackend().backend.kind===`cloud`,d=r?.id===t?r.session_api_key??c.sessionApiKey:c.sessionApiKey,f=r?.id===t?r.conversation_url??c.conversationUrl:c.conversationUrl;if(u){let e=s({conversationUrl:f,sessionApiKey:d});return l({files:n,workingDir:a,conversationUrl:e.conversationUrl,sessionApiKey:e.sessionApiKey})}return l({files:n,workingDir:a,conversationUrl:f,sessionApiKey:d})}async function l(e){let{files:n,workingDir:o,conversationUrl:s,sessionApiKey:c}=e,l=new r.RemoteWorkspace(t.getAgentServerClientOptions({conversationUrl:s,sessionApiKey:c,workingDir:o})),u=async e=>{try{let t=i.getSafeUploadFileName(e.name),n=await i.buildWorkspaceUploadPath(e.name,o,{conversationUrl:s,sessionApiKey:c});return await l.fileUpload(e,n),{uploadedFile:t,skippedFile:null}}catch(t){return{uploadedFile:null,skippedFile:{name:e.name,reason:t instanceof Error?t.message:`Upload failed`}}}},d=[];for(let e=0;e<n.length;e+=a){let t=n.slice(e,e+a);d.push(...await Promise.all(t.map(u)))}return{uploaded_files:d.flatMap(e=>e.uploadedFile?[e.uploadedFile]:[]),skipped_files:d.flatMap(e=>e.skippedFile?[e.skippedFile]:[])}}exports.resolveConversationRuntime=o,exports.uploadFilesToConversation=c;
1
+ require("../_virtual/_rolldown/runtime.cjs");const e=require("./backend-registry/active-store.cjs"),t=require("./agent-server-client-options.cjs"),n=require("../node_modules/@openhands/typescript-client/dist/workspace/remote-workspace.cjs"),r=require("./cloud/conversation-service.api.cjs"),i=require("./workspace-upload-path.cjs");var a=5;async function o(t,n){if(n?.id===t&&n.conversation_url?.trim()&&n.session_api_key?.trim())return{conversationUrl:n.conversation_url.trim(),sessionApiKey:n.session_api_key.trim()};if(e.getActiveBackend().backend.kind===`cloud`){let[e]=await r.batchGetCloudConversations([t]);return{conversationUrl:e?.conversation_url?.trim()??null,sessionApiKey:e?.session_api_key?.trim()??null}}return{conversationUrl:null,sessionApiKey:null}}function s(e){if(!e.conversationUrl||!e.sessionApiKey)throw Error(`Conversation sandbox is still starting. Wait for it to finish, then try again.`);return{conversationUrl:e.conversationUrl,sessionApiKey:e.sessionApiKey}}async function c(t,n,r){let a=await i.resolveConversationUploadWorkingDir(t,r),c=await o(t,r),u=e.getActiveBackend().backend.kind===`cloud`,d=r?.id===t?r.session_api_key??c.sessionApiKey:c.sessionApiKey,f=r?.id===t?r.conversation_url??c.conversationUrl:c.conversationUrl;if(u){let e=s({conversationUrl:f,sessionApiKey:d});return l({files:n,workingDir:a,conversationUrl:e.conversationUrl,sessionApiKey:e.sessionApiKey})}return l({files:n,workingDir:a,conversationUrl:f,sessionApiKey:d})}async function l(e){let{files:r,workingDir:o,conversationUrl:s,sessionApiKey:c}=e,l=new n.RemoteWorkspace(t.getAgentServerClientOptions({conversationUrl:s,sessionApiKey:c,workingDir:o})),u=async e=>{try{let t=i.getSafeUploadFileName(e.name),n=await i.buildWorkspaceUploadPath(e.name,o,{conversationUrl:s,sessionApiKey:c});return await l.fileUpload(e,n),{uploadedFile:t,skippedFile:null}}catch(t){return{uploadedFile:null,skippedFile:{name:e.name,reason:t instanceof Error?t.message:`Upload failed`}}}},d=[];for(let e=0;e<r.length;e+=a){let t=r.slice(e,e+a);d.push(...await Promise.all(t.map(u)))}return{uploaded_files:d.flatMap(e=>e.uploadedFile?[e.uploadedFile]:[]),skipped_files:d.flatMap(e=>e.skippedFile?[e.skippedFile]:[])}}exports.resolveConversationRuntime=o,exports.uploadFilesToConversation=c;
2
2
  //# sourceMappingURL=conversation-file-upload.api.cjs.map
@@ -1,17 +1,17 @@
1
1
  import { getActiveBackend as e } from "./backend-registry/active-store.js";
2
2
  import { getAgentServerClientOptions as t } from "./agent-server-client-options.js";
3
- import { batchGetCloudConversations as n } from "./cloud/conversation-service.api.js";
4
- import { RemoteWorkspace as r } from "../node_modules/@openhands/typescript-client/dist/workspace/remote-workspace.js";
3
+ import { RemoteWorkspace as n } from "../node_modules/@openhands/typescript-client/dist/workspace/remote-workspace.js";
4
+ import { batchGetCloudConversations as r } from "./cloud/conversation-service.api.js";
5
5
  import { buildWorkspaceUploadPath as i, getSafeUploadFileName as a, resolveConversationUploadWorkingDir as o } from "./workspace-upload-path.js";
6
6
  //#region src/api/conversation-file-upload.api.ts
7
7
  var s = 5;
8
- async function c(t, r) {
9
- if (r?.id === t && r.conversation_url?.trim() && r.session_api_key?.trim()) return {
10
- conversationUrl: r.conversation_url.trim(),
11
- sessionApiKey: r.session_api_key.trim()
8
+ async function c(t, n) {
9
+ if (n?.id === t && n.conversation_url?.trim() && n.session_api_key?.trim()) return {
10
+ conversationUrl: n.conversation_url.trim(),
11
+ sessionApiKey: n.session_api_key.trim()
12
12
  };
13
13
  if (e().backend.kind === "cloud") {
14
- let [e] = await n([t]);
14
+ let [e] = await r([t]);
15
15
  return {
16
16
  conversationUrl: e?.conversation_url?.trim() ?? null,
17
17
  sessionApiKey: e?.session_api_key?.trim() ?? null
@@ -51,7 +51,7 @@ async function u(t, n, r) {
51
51
  });
52
52
  }
53
53
  async function d(e) {
54
- let { files: n, workingDir: o, conversationUrl: c, sessionApiKey: l } = e, u = new r(t({
54
+ let { files: r, workingDir: o, conversationUrl: c, sessionApiKey: l } = e, u = new n(t({
55
55
  conversationUrl: c,
56
56
  sessionApiKey: l,
57
57
  workingDir: o
@@ -75,8 +75,8 @@ async function d(e) {
75
75
  };
76
76
  }
77
77
  }, f = [];
78
- for (let e = 0; e < n.length; e += s) {
79
- let t = n.slice(e, e + s);
78
+ for (let e = 0; e < r.length; e += s) {
79
+ let t = r.slice(e, e + s);
80
80
  f.push(...await Promise.all(t.map(d)));
81
81
  }
82
82
  return {
@@ -1,2 +1,2 @@
1
- require("../_virtual/_rolldown/runtime.cjs");var e=`openhands-agent-server-conversation-metadata`,t=e=>({source:e.source,ref:e.ref??null,repo_path:e.repo_path??null}),n=()=>{if(typeof window>`u`)return{};try{let t=window.localStorage.getItem(e);if(!t)return{};let n=JSON.parse(t);return!n||typeof n!=`object`?{}:n}catch{return{}}},r=t=>{if(!(typeof window>`u`)){if(Object.keys(t).length===0){window.localStorage.removeItem(e);return}window.localStorage.setItem(e,JSON.stringify(t))}},i=e=>n()[e]??null,a=(e,t)=>{let i=n();i[e]=t,r(i)},o=e=>{let t=n();e in t&&(delete t[e],r(t))};exports.getStoredConversationMetadata=i,exports.removeStoredConversationMetadata=o,exports.setStoredConversationMetadata=a,exports.toPluginCoordinates=t;
1
+ require("../_virtual/_rolldown/runtime.cjs");var e=`openhands-agent-server-conversation-metadata`,t=e=>({source:e.source,ref:e.ref??null,repo_path:e.repo_path??null}),n=()=>{if(typeof window>`u`)return{};try{let t=window.localStorage.getItem(e);if(!t)return{};let n=JSON.parse(t);return!n||typeof n!=`object`?{}:n}catch{return{}}},r=t=>{if(!(typeof window>`u`)){if(Object.keys(t).length===0){window.localStorage.removeItem(e);return}window.localStorage.setItem(e,JSON.stringify(t))}},i=e=>n()[e]??null,a=(e,t)=>{let i=n();i[e]=t,r(i)},o=(e,t)=>{a(e,{selected_repository:null,selected_branch:null,git_provider:null,...i(e)??{},...t})},s=e=>{let t=n();e in t&&(delete t[e],r(t))};exports.getStoredConversationMetadata=i,exports.mergeStoredConversationMetadata=o,exports.removeStoredConversationMetadata=s,exports.setStoredConversationMetadata=a,exports.toPluginCoordinates=t;
2
2
  //# sourceMappingURL=conversation-metadata-store.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-metadata-store.cjs","names":[],"sources":["../../src/api/conversation-metadata-store.ts"],"sourcesContent":["import { Provider } from \"#/types/settings\";\nimport type { PluginSpec } from \"#/api/conversation-service/agent-server-conversation-service.types\";\n\nconst STORAGE_KEY = \"openhands-agent-server-conversation-metadata\";\n\nexport type WorkspaceMode = \"local_repo\" | \"new_worktree\";\n\nexport interface ConversationMetadata {\n selected_repository: string | null;\n selected_branch: string | null;\n git_provider: Provider | null;\n /**\n * The local workspace path the user explicitly attached at conversation\n * creation time. Distinct from `selected_repository` (which is set by\n * the repo picker on the home page). Used by the Files tab to decide\n * whether to default to diff view: if the user attached *anything*\n * (repo or local workspace), we lean diff-first because there's a real\n * git baseline to compare against.\n */\n selected_workspace?: string | null;\n /**\n * How the conversation should use `selected_workspace`.\n *\n * `local_repo` means the runtime should operate directly in the selected\n * folder, even when it is not a git checkout. `new_worktree` preserves the\n * historical agent-server behavior for conversations that should start in a\n * generated per-conversation worktree.\n */\n workspace_mode?: WorkspaceMode | null;\n /**\n * The LLM profile the conversation was created with (or last switched to).\n * Client-side only. Lets the chat-header switcher show the exact profile\n * name even when several profiles share the same underlying model — the\n * agent-server only round-trips the model string, so matching on it alone\n * is ambiguous (issue #1082).\n */\n active_profile?: string | null;\n /** Store plugin coordinates only; parameters may contain secrets. */\n plugins?: PluginSpec[] | null;\n}\n\nexport const toPluginCoordinates = (plugin: PluginSpec): PluginSpec => ({\n source: plugin.source,\n ref: plugin.ref ?? null,\n repo_path: plugin.repo_path ?? null,\n});\n\ntype StoredMetadata = Record<string, ConversationMetadata>;\n\nconst readAll = (): StoredMetadata => {\n if (typeof window === \"undefined\") return {};\n try {\n const raw = window.localStorage.getItem(STORAGE_KEY);\n if (!raw) return {};\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== \"object\") return {};\n return parsed as StoredMetadata;\n } catch {\n return {};\n }\n};\n\nconst writeAll = (next: StoredMetadata): void => {\n if (typeof window === \"undefined\") return;\n if (Object.keys(next).length === 0) {\n window.localStorage.removeItem(STORAGE_KEY);\n return;\n }\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(next));\n};\n\nexport const getStoredConversationMetadata = (\n conversationId: string,\n): ConversationMetadata | null => readAll()[conversationId] ?? null;\n\nexport const setStoredConversationMetadata = (\n conversationId: string,\n metadata: ConversationMetadata,\n): void => {\n const all = readAll();\n all[conversationId] = metadata;\n writeAll(all);\n};\n\nexport const removeStoredConversationMetadata = (\n conversationId: string,\n): void => {\n const all = readAll();\n if (!(conversationId in all)) return;\n delete all[conversationId];\n writeAll(all);\n};\n"],"mappings":"6CAGA,IAAM,EAAc,+CAsCP,EAAuB,IAAoC,CACtE,OAAQ,EAAO,OACf,IAAK,EAAO,KAAO,KACnB,UAAW,EAAO,WAAa,IACjC,GAIM,MAAgC,CACpC,GAAI,OAAO,OAAW,IAAa,MAAO,CAAC,EAC3C,GAAI,CACF,IAAM,EAAM,OAAO,aAAa,QAAQ,CAAW,EACnD,GAAI,CAAC,EAAK,MAAO,CAAC,EAClB,IAAM,EAAS,KAAK,MAAM,CAAG,EAE7B,MADI,CAAC,GAAU,OAAO,GAAW,SAAiB,CAAC,EAC5C,CACT,MAAQ,CACN,MAAO,CAAC,CACV,CACF,EAEM,EAAY,GAA+B,CAC3C,YAAO,OAAW,KACtB,IAAI,OAAO,KAAK,CAAI,EAAE,SAAW,EAAG,CAClC,OAAO,aAAa,WAAW,CAAW,EAC1C,MACF,CACA,OAAO,aAAa,QAAQ,EAAa,KAAK,UAAU,CAAI,CAAC,CAD7D,CAEF,EAEa,EACX,GACgC,EAAQ,EAAE,IAAmB,KAElD,GACX,EACA,IACS,CACT,IAAM,EAAM,EAAQ,EACpB,EAAI,GAAkB,EACtB,EAAS,CAAG,CACd,EAEa,EACX,GACS,CACT,IAAM,EAAM,EAAQ,EACd,KAAkB,IACxB,OAAO,EAAI,GACX,EAAS,CAAG,EACd"}
1
+ {"version":3,"file":"conversation-metadata-store.cjs","names":[],"sources":["../../src/api/conversation-metadata-store.ts"],"sourcesContent":["import { Provider } from \"#/types/settings\";\nimport type { PluginSpec } from \"#/api/conversation-service/agent-server-conversation-service.types\";\n\nconst STORAGE_KEY = \"openhands-agent-server-conversation-metadata\";\n\nexport type WorkspaceMode = \"local_repo\" | \"new_worktree\";\n\nexport interface ConversationMetadata {\n selected_repository: string | null;\n selected_branch: string | null;\n git_provider: Provider | null;\n /**\n * The local workspace path the user explicitly attached at conversation\n * creation time. Distinct from `selected_repository` (which is set by\n * the repo picker on the home page). Used by the Files tab to decide\n * whether to default to diff view: if the user attached *anything*\n * (repo or local workspace), we lean diff-first because there's a real\n * git baseline to compare against.\n */\n selected_workspace?: string | null;\n /**\n * How the conversation should use `selected_workspace`.\n *\n * `local_repo` means the runtime should operate directly in the selected\n * folder, even when it is not a git checkout. `new_worktree` preserves the\n * historical agent-server behavior for conversations that should start in a\n * generated per-conversation worktree.\n */\n workspace_mode?: WorkspaceMode | null;\n /**\n * The LLM profile the conversation was created with (or last switched to).\n * Client-side only. Lets the chat-header switcher show the exact profile\n * name even when several profiles share the same underlying model — the\n * agent-server only round-trips the model string, so matching on it alone\n * is ambiguous (issue #1082).\n */\n active_profile?: string | null;\n /**\n * When `active_profile` was stamped (ISO string). Written by the live\n * WebSocket handler (the observation's server timestamp) and the user\n * `/model` mutation (client clock). The history seed compares the latest\n * SwitchLLM observation's timestamp against this so a reload can repair a\n * missed agent switch without rolling back a newer manual switch — manual\n * `/model` switches go through REST and leave no observation in history.\n * Absent on stamps written before this field existed; treated as older\n * than any observation so the seed can still repair them.\n */\n stamped_at?: string | null;\n /** Store plugin coordinates only; parameters may contain secrets. */\n plugins?: PluginSpec[] | null;\n /**\n * Local-only client-managed planning conversation id. Cloud backends expose\n * real sub-conversations through `sub_conversation_ids`; local agent-server\n * backends do not, so Canvas stores the relationship here.\n */\n local_planning_conversation_id?: string | null;\n}\n\nexport const toPluginCoordinates = (plugin: PluginSpec): PluginSpec => ({\n source: plugin.source,\n ref: plugin.ref ?? null,\n repo_path: plugin.repo_path ?? null,\n});\n\ntype StoredMetadata = Record<string, ConversationMetadata>;\n\nconst readAll = (): StoredMetadata => {\n if (typeof window === \"undefined\") return {};\n try {\n const raw = window.localStorage.getItem(STORAGE_KEY);\n if (!raw) return {};\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== \"object\") return {};\n return parsed as StoredMetadata;\n } catch {\n return {};\n }\n};\n\nconst writeAll = (next: StoredMetadata): void => {\n if (typeof window === \"undefined\") return;\n if (Object.keys(next).length === 0) {\n window.localStorage.removeItem(STORAGE_KEY);\n return;\n }\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(next));\n};\n\nexport const getStoredConversationMetadata = (\n conversationId: string,\n): ConversationMetadata | null => readAll()[conversationId] ?? null;\n\nexport const setStoredConversationMetadata = (\n conversationId: string,\n metadata: ConversationMetadata,\n): void => {\n const all = readAll();\n all[conversationId] = metadata;\n writeAll(all);\n};\n\n/**\n * Merge `patch` into a conversation's stored metadata, preserving every\n * existing field — `setStoredConversationMetadata` does a full-object\n * replace, which would otherwise silently drop fields the caller doesn't\n * enumerate (e.g. `plugins`).\n */\nexport const mergeStoredConversationMetadata = (\n conversationId: string,\n patch: Partial<ConversationMetadata>,\n): void => {\n setStoredConversationMetadata(conversationId, {\n selected_repository: null,\n selected_branch: null,\n git_provider: null,\n ...(getStoredConversationMetadata(conversationId) ?? {}),\n ...patch,\n });\n};\n\nexport const removeStoredConversationMetadata = (\n conversationId: string,\n): void => {\n const all = readAll();\n if (!(conversationId in all)) return;\n delete all[conversationId];\n writeAll(all);\n};\n"],"mappings":"6CAGA,IAAM,EAAc,+CAuDP,EAAuB,IAAoC,CACtE,OAAQ,EAAO,OACf,IAAK,EAAO,KAAO,KACnB,UAAW,EAAO,WAAa,IACjC,GAIM,MAAgC,CACpC,GAAI,OAAO,OAAW,IAAa,MAAO,CAAC,EAC3C,GAAI,CACF,IAAM,EAAM,OAAO,aAAa,QAAQ,CAAW,EACnD,GAAI,CAAC,EAAK,MAAO,CAAC,EAClB,IAAM,EAAS,KAAK,MAAM,CAAG,EAE7B,MADI,CAAC,GAAU,OAAO,GAAW,SAAiB,CAAC,EAC5C,CACT,MAAQ,CACN,MAAO,CAAC,CACV,CACF,EAEM,EAAY,GAA+B,CAC3C,YAAO,OAAW,KACtB,IAAI,OAAO,KAAK,CAAI,EAAE,SAAW,EAAG,CAClC,OAAO,aAAa,WAAW,CAAW,EAC1C,MACF,CACA,OAAO,aAAa,QAAQ,EAAa,KAAK,UAAU,CAAI,CAAC,CAD7D,CAEF,EAEa,EACX,GACgC,EAAQ,EAAE,IAAmB,KAElD,GACX,EACA,IACS,CACT,IAAM,EAAM,EAAQ,EACpB,EAAI,GAAkB,EACtB,EAAS,CAAG,CACd,EAQa,GACX,EACA,IACS,CACT,EAA8B,EAAgB,CAC5C,oBAAqB,KACrB,gBAAiB,KACjB,aAAc,KACd,GAAI,EAA8B,CAAc,GAAK,CAAC,EACtD,GAAG,CACL,CAAC,CACH,EAEa,EACX,GACS,CACT,IAAM,EAAM,EAAQ,EACd,KAAkB,IACxB,OAAO,EAAI,GACX,EAAS,CAAG,EACd"}
@@ -31,10 +31,34 @@ export interface ConversationMetadata {
31
31
  * is ambiguous (issue #1082).
32
32
  */
33
33
  active_profile?: string | null;
34
+ /**
35
+ * When `active_profile` was stamped (ISO string). Written by the live
36
+ * WebSocket handler (the observation's server timestamp) and the user
37
+ * `/model` mutation (client clock). The history seed compares the latest
38
+ * SwitchLLM observation's timestamp against this so a reload can repair a
39
+ * missed agent switch without rolling back a newer manual switch — manual
40
+ * `/model` switches go through REST and leave no observation in history.
41
+ * Absent on stamps written before this field existed; treated as older
42
+ * than any observation so the seed can still repair them.
43
+ */
44
+ stamped_at?: string | null;
34
45
  /** Store plugin coordinates only; parameters may contain secrets. */
35
46
  plugins?: PluginSpec[] | null;
47
+ /**
48
+ * Local-only client-managed planning conversation id. Cloud backends expose
49
+ * real sub-conversations through `sub_conversation_ids`; local agent-server
50
+ * backends do not, so Canvas stores the relationship here.
51
+ */
52
+ local_planning_conversation_id?: string | null;
36
53
  }
37
54
  export declare const toPluginCoordinates: (plugin: PluginSpec) => PluginSpec;
38
55
  export declare const getStoredConversationMetadata: (conversationId: string) => ConversationMetadata | null;
39
56
  export declare const setStoredConversationMetadata: (conversationId: string, metadata: ConversationMetadata) => void;
57
+ /**
58
+ * Merge `patch` into a conversation's stored metadata, preserving every
59
+ * existing field — `setStoredConversationMetadata` does a full-object
60
+ * replace, which would otherwise silently drop fields the caller doesn't
61
+ * enumerate (e.g. `plugins`).
62
+ */
63
+ export declare const mergeStoredConversationMetadata: (conversationId: string, patch: Partial<ConversationMetadata>) => void;
40
64
  export declare const removeStoredConversationMetadata: (conversationId: string) => void;
@@ -24,11 +24,19 @@ var e = "openhands-agent-server-conversation-metadata", t = (e) => ({
24
24
  }, i = (e) => n()[e] ?? null, a = (e, t) => {
25
25
  let i = n();
26
26
  i[e] = t, r(i);
27
- }, o = (e) => {
27
+ }, o = (e, t) => {
28
+ a(e, {
29
+ selected_repository: null,
30
+ selected_branch: null,
31
+ git_provider: null,
32
+ ...i(e) ?? {},
33
+ ...t
34
+ });
35
+ }, s = (e) => {
28
36
  let t = n();
29
37
  e in t && (delete t[e], r(t));
30
38
  };
31
39
  //#endregion
32
- export { i as getStoredConversationMetadata, o as removeStoredConversationMetadata, a as setStoredConversationMetadata, t as toPluginCoordinates };
40
+ export { i as getStoredConversationMetadata, o as mergeStoredConversationMetadata, s as removeStoredConversationMetadata, a as setStoredConversationMetadata, t as toPluginCoordinates };
33
41
 
34
42
  //# sourceMappingURL=conversation-metadata-store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-metadata-store.js","names":[],"sources":["../../src/api/conversation-metadata-store.ts"],"sourcesContent":["import { Provider } from \"#/types/settings\";\nimport type { PluginSpec } from \"#/api/conversation-service/agent-server-conversation-service.types\";\n\nconst STORAGE_KEY = \"openhands-agent-server-conversation-metadata\";\n\nexport type WorkspaceMode = \"local_repo\" | \"new_worktree\";\n\nexport interface ConversationMetadata {\n selected_repository: string | null;\n selected_branch: string | null;\n git_provider: Provider | null;\n /**\n * The local workspace path the user explicitly attached at conversation\n * creation time. Distinct from `selected_repository` (which is set by\n * the repo picker on the home page). Used by the Files tab to decide\n * whether to default to diff view: if the user attached *anything*\n * (repo or local workspace), we lean diff-first because there's a real\n * git baseline to compare against.\n */\n selected_workspace?: string | null;\n /**\n * How the conversation should use `selected_workspace`.\n *\n * `local_repo` means the runtime should operate directly in the selected\n * folder, even when it is not a git checkout. `new_worktree` preserves the\n * historical agent-server behavior for conversations that should start in a\n * generated per-conversation worktree.\n */\n workspace_mode?: WorkspaceMode | null;\n /**\n * The LLM profile the conversation was created with (or last switched to).\n * Client-side only. Lets the chat-header switcher show the exact profile\n * name even when several profiles share the same underlying model — the\n * agent-server only round-trips the model string, so matching on it alone\n * is ambiguous (issue #1082).\n */\n active_profile?: string | null;\n /** Store plugin coordinates only; parameters may contain secrets. */\n plugins?: PluginSpec[] | null;\n}\n\nexport const toPluginCoordinates = (plugin: PluginSpec): PluginSpec => ({\n source: plugin.source,\n ref: plugin.ref ?? null,\n repo_path: plugin.repo_path ?? null,\n});\n\ntype StoredMetadata = Record<string, ConversationMetadata>;\n\nconst readAll = (): StoredMetadata => {\n if (typeof window === \"undefined\") return {};\n try {\n const raw = window.localStorage.getItem(STORAGE_KEY);\n if (!raw) return {};\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== \"object\") return {};\n return parsed as StoredMetadata;\n } catch {\n return {};\n }\n};\n\nconst writeAll = (next: StoredMetadata): void => {\n if (typeof window === \"undefined\") return;\n if (Object.keys(next).length === 0) {\n window.localStorage.removeItem(STORAGE_KEY);\n return;\n }\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(next));\n};\n\nexport const getStoredConversationMetadata = (\n conversationId: string,\n): ConversationMetadata | null => readAll()[conversationId] ?? null;\n\nexport const setStoredConversationMetadata = (\n conversationId: string,\n metadata: ConversationMetadata,\n): void => {\n const all = readAll();\n all[conversationId] = metadata;\n writeAll(all);\n};\n\nexport const removeStoredConversationMetadata = (\n conversationId: string,\n): void => {\n const all = readAll();\n if (!(conversationId in all)) return;\n delete all[conversationId];\n writeAll(all);\n};\n"],"mappings":";AAGA,IAAM,IAAc,gDAsCP,KAAuB,OAAoC;CACtE,QAAQ,EAAO;CACf,KAAK,EAAO,OAAO;CACnB,WAAW,EAAO,aAAa;AACjC,IAIM,UAAgC;CACpC,IAAI,OAAO,SAAW,KAAa,OAAO,CAAC;CAC3C,IAAI;EACF,IAAM,IAAM,OAAO,aAAa,QAAQ,CAAW;EACnD,IAAI,CAAC,GAAK,OAAO,CAAC;EAClB,IAAM,IAAS,KAAK,MAAM,CAAG;EAE7B,OADI,CAAC,KAAU,OAAO,KAAW,WAAiB,CAAC,IAC5C;CACT,QAAQ;EACN,OAAO,CAAC;CACV;AACF,GAEM,KAAY,MAA+B;CAC3C,aAAO,SAAW,MACtB;MAAI,OAAO,KAAK,CAAI,EAAE,WAAW,GAAG;GAClC,OAAO,aAAa,WAAW,CAAW;GAC1C;EACF;EACA,OAAO,aAAa,QAAQ,GAAa,KAAK,UAAU,CAAI,CAAC;CAD7D;AAEF,GAEa,KACX,MACgC,EAAQ,EAAE,MAAmB,MAElD,KACX,GACA,MACS;CACT,IAAM,IAAM,EAAQ;CAEpB,AADA,EAAI,KAAkB,GACtB,EAAS,CAAG;AACd,GAEa,KACX,MACS;CACT,IAAM,IAAM,EAAQ;CACd,KAAkB,MACxB,OAAO,EAAI,IACX,EAAS,CAAG;AACd"}
1
+ {"version":3,"file":"conversation-metadata-store.js","names":[],"sources":["../../src/api/conversation-metadata-store.ts"],"sourcesContent":["import { Provider } from \"#/types/settings\";\nimport type { PluginSpec } from \"#/api/conversation-service/agent-server-conversation-service.types\";\n\nconst STORAGE_KEY = \"openhands-agent-server-conversation-metadata\";\n\nexport type WorkspaceMode = \"local_repo\" | \"new_worktree\";\n\nexport interface ConversationMetadata {\n selected_repository: string | null;\n selected_branch: string | null;\n git_provider: Provider | null;\n /**\n * The local workspace path the user explicitly attached at conversation\n * creation time. Distinct from `selected_repository` (which is set by\n * the repo picker on the home page). Used by the Files tab to decide\n * whether to default to diff view: if the user attached *anything*\n * (repo or local workspace), we lean diff-first because there's a real\n * git baseline to compare against.\n */\n selected_workspace?: string | null;\n /**\n * How the conversation should use `selected_workspace`.\n *\n * `local_repo` means the runtime should operate directly in the selected\n * folder, even when it is not a git checkout. `new_worktree` preserves the\n * historical agent-server behavior for conversations that should start in a\n * generated per-conversation worktree.\n */\n workspace_mode?: WorkspaceMode | null;\n /**\n * The LLM profile the conversation was created with (or last switched to).\n * Client-side only. Lets the chat-header switcher show the exact profile\n * name even when several profiles share the same underlying model — the\n * agent-server only round-trips the model string, so matching on it alone\n * is ambiguous (issue #1082).\n */\n active_profile?: string | null;\n /**\n * When `active_profile` was stamped (ISO string). Written by the live\n * WebSocket handler (the observation's server timestamp) and the user\n * `/model` mutation (client clock). The history seed compares the latest\n * SwitchLLM observation's timestamp against this so a reload can repair a\n * missed agent switch without rolling back a newer manual switch — manual\n * `/model` switches go through REST and leave no observation in history.\n * Absent on stamps written before this field existed; treated as older\n * than any observation so the seed can still repair them.\n */\n stamped_at?: string | null;\n /** Store plugin coordinates only; parameters may contain secrets. */\n plugins?: PluginSpec[] | null;\n /**\n * Local-only client-managed planning conversation id. Cloud backends expose\n * real sub-conversations through `sub_conversation_ids`; local agent-server\n * backends do not, so Canvas stores the relationship here.\n */\n local_planning_conversation_id?: string | null;\n}\n\nexport const toPluginCoordinates = (plugin: PluginSpec): PluginSpec => ({\n source: plugin.source,\n ref: plugin.ref ?? null,\n repo_path: plugin.repo_path ?? null,\n});\n\ntype StoredMetadata = Record<string, ConversationMetadata>;\n\nconst readAll = (): StoredMetadata => {\n if (typeof window === \"undefined\") return {};\n try {\n const raw = window.localStorage.getItem(STORAGE_KEY);\n if (!raw) return {};\n const parsed = JSON.parse(raw) as unknown;\n if (!parsed || typeof parsed !== \"object\") return {};\n return parsed as StoredMetadata;\n } catch {\n return {};\n }\n};\n\nconst writeAll = (next: StoredMetadata): void => {\n if (typeof window === \"undefined\") return;\n if (Object.keys(next).length === 0) {\n window.localStorage.removeItem(STORAGE_KEY);\n return;\n }\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(next));\n};\n\nexport const getStoredConversationMetadata = (\n conversationId: string,\n): ConversationMetadata | null => readAll()[conversationId] ?? null;\n\nexport const setStoredConversationMetadata = (\n conversationId: string,\n metadata: ConversationMetadata,\n): void => {\n const all = readAll();\n all[conversationId] = metadata;\n writeAll(all);\n};\n\n/**\n * Merge `patch` into a conversation's stored metadata, preserving every\n * existing field — `setStoredConversationMetadata` does a full-object\n * replace, which would otherwise silently drop fields the caller doesn't\n * enumerate (e.g. `plugins`).\n */\nexport const mergeStoredConversationMetadata = (\n conversationId: string,\n patch: Partial<ConversationMetadata>,\n): void => {\n setStoredConversationMetadata(conversationId, {\n selected_repository: null,\n selected_branch: null,\n git_provider: null,\n ...(getStoredConversationMetadata(conversationId) ?? {}),\n ...patch,\n });\n};\n\nexport const removeStoredConversationMetadata = (\n conversationId: string,\n): void => {\n const all = readAll();\n if (!(conversationId in all)) return;\n delete all[conversationId];\n writeAll(all);\n};\n"],"mappings":";AAGA,IAAM,IAAc,gDAuDP,KAAuB,OAAoC;CACtE,QAAQ,EAAO;CACf,KAAK,EAAO,OAAO;CACnB,WAAW,EAAO,aAAa;AACjC,IAIM,UAAgC;CACpC,IAAI,OAAO,SAAW,KAAa,OAAO,CAAC;CAC3C,IAAI;EACF,IAAM,IAAM,OAAO,aAAa,QAAQ,CAAW;EACnD,IAAI,CAAC,GAAK,OAAO,CAAC;EAClB,IAAM,IAAS,KAAK,MAAM,CAAG;EAE7B,OADI,CAAC,KAAU,OAAO,KAAW,WAAiB,CAAC,IAC5C;CACT,QAAQ;EACN,OAAO,CAAC;CACV;AACF,GAEM,KAAY,MAA+B;CAC3C,aAAO,SAAW,MACtB;MAAI,OAAO,KAAK,CAAI,EAAE,WAAW,GAAG;GAClC,OAAO,aAAa,WAAW,CAAW;GAC1C;EACF;EACA,OAAO,aAAa,QAAQ,GAAa,KAAK,UAAU,CAAI,CAAC;CAD7D;AAEF,GAEa,KACX,MACgC,EAAQ,EAAE,MAAmB,MAElD,KACX,GACA,MACS;CACT,IAAM,IAAM,EAAQ;CAEpB,AADA,EAAI,KAAkB,GACtB,EAAS,CAAG;AACd,GAQa,KACX,GACA,MACS;CACT,EAA8B,GAAgB;EAC5C,qBAAqB;EACrB,iBAAiB;EACjB,cAAc;EACd,GAAI,EAA8B,CAAc,KAAK,CAAC;EACtD,GAAG;CACL,CAAC;AACH,GAEa,KACX,MACS;CACT,IAAM,IAAM,EAAQ;CACd,KAAkB,MACxB,OAAO,EAAI,IACX,EAAS,CAAG;AACd"}
@@ -1,2 +1,2 @@
1
- require("../../_virtual/_rolldown/runtime.cjs");const e=require("../../node_modules/@openhands/typescript-client/dist/client/conversation-client.cjs"),t=require("../../node_modules/@openhands/typescript-client/dist/client/file-client.cjs"),n=require("../../node_modules/@openhands/typescript-client/dist/client/profiles-client.cjs"),r=require("../../node_modules/@openhands/typescript-client/dist/client/vscode-client.cjs");require("../../node_modules/@openhands/typescript-client/dist/clients.cjs");const i=require("../../utils/websocket-url.cjs"),a=require("../agent-server-config.cjs"),o=require("../backend-registry/active-store.cjs"),s=require("../agent-server-client-options.cjs"),c=require("../conversation-metadata-store.cjs"),l=require("../cloud/proxy.cjs"),u=require("../cloud/conversation-service.api.cjs"),d=require("../../node_modules/@openhands/typescript-client/dist/models/conversation.cjs");require("../../node_modules/@openhands/typescript-client/dist/index.cjs");const f=require("../../node_modules/uuid/dist/v4.cjs"),p=require("../agent-server-home.cjs"),m=require("../profiles-service/profiles-service.api.cjs"),h=require("../settings-service/settings-service.api.cjs"),g=require("../agent-server-adapter.cjs"),_=require("../../utils/title-llm-profile.cjs");var v=`1970-01-01T00:00:00.000Z`,y=300*1e3,b=`Unable to load conversations because the selected agent server returned data this UI does not understand. Check the backend URL/session key and update the agent server if needed.`;function x(){return Error(b)}function S(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function C(e){return typeof e==`number`?e:null}function w(e){return typeof e==`number`?e:0}function T(e){return typeof e==`string`?e:null}function E(e,t,n){let r=e[t]??e[n];return typeof r==`string`&&r.trim()?r:v}function D(e){return S(e)?{prompt_tokens:w(e.prompt_tokens),completion_tokens:w(e.completion_tokens),cache_read_tokens:w(e.cache_read_tokens),cache_write_tokens:w(e.cache_write_tokens),context_window:w(e.context_window),per_turn_token:w(e.per_turn_token)}:null}function O(e){return S(e)?{accumulated_cost:C(e.accumulated_cost),max_budget_per_task:C(e.max_budget_per_task),accumulated_token_usage:D(e.accumulated_token_usage)}:null}function k(e){return S(e)?e:null}function A(e){if(!S(e))return null;let t=S(e.llm)?{model:T(e.llm.model)}:null;return{kind:T(e.kind),acp_server:T(e.acp_server),acp_model:T(e.acp_model),llm:t}}function j(e){return S(e)?{working_dir:T(e.working_dir)}:null}function M(e){if(!S(e))return null;let t={};for(let[n,r]of Object.entries(e))typeof r==`string`&&(t[n]=r);return t}function N(e){if(!S(e))return null;let{agent_profile_id:t,revision:n}=e;return typeof t!=`string`||typeof n!=`number`?null:{agent_profile_id:t,revision:n}}function P(e){if(!e.startsWith(`/`))return null;let t=[];for(let n of e.split(`/`))if(n&&n!==`.`)if(n===`..`){if(!t.length)return null;t.pop()}else t.push(n);return`/${t.join(`/`)}`}function F(e,t){let n=P(e),r=P(t);if(!n||!r||n!==r&&!n.startsWith(`${r}/`))throw Error(`Conversation file path must stay inside the workspace`);return n}function I(e){if(!S(e)||typeof e.id!=`string`||!e.id.trim())throw x();return{id:e.id.trim(),title:T(e.title),created_at:E(e,`created_at`,`createdAt`),updated_at:E(e,`updated_at`,`updatedAt`),execution_status:T(e.execution_status),sandbox_status:T(e.sandbox_status),metrics:O(e.metrics),stats:k(e.stats),agent:A(e.agent),workspace:j(e.workspace),tags:M(e.tags),launched_agent_profile:N(e.launched_agent_profile),current_model_id:T(e.current_model_id),current_model_name:T(e.current_model_name)}}function L(e){if(!Array.isArray(e))throw x();return e.map(I)}function R(e){if(Array.isArray(e))return{items:L(e),next_page_id:null};if(!S(e))throw x();return{items:L(e.items),next_page_id:typeof e.next_page_id==`string`?e.next_page_id:null}}var z=new Set([`idle`,`running`,`paused`,`waiting_for_confirmation`,`finished`,`error`,`stuck`]);function B(e){let t=e??`idle`;return z.has(t)?t:`idle`}function V(e,t){if(!e)throw Error(`Conversation ${t} was not found`);return e}var H=class{static async sendMessage(t,n,r){let a=o.getActiveBackend().backend,c=r?.conversationUrl??null,d=r?.sessionApiKey??null;if(a.kind===`cloud`){if(!c||!d){let[e]=await u.batchGetCloudConversations([t]);c=e?.conversation_url?.trim()??null,d=e?.session_api_key?.trim()??null}if(!c||!d)throw Error(`Conversation sandbox is still starting. Wait for it to finish, then try again.`);return await l.callCloudProxy({backend:a,method:`POST`,hostOverride:i.buildHttpBaseUrl(c),path:`/api/conversations/${t}/events`,body:{...n,run:!0},authMode:`session-api-key`,sessionApiKey:d}),n}return await new e.ConversationClient(s.getAgentServerClientOptions({conversationUrl:c,sessionApiKey:d})).sendEvent(t,n,{run:!0}),n}static async createConversation(t={}){let{initialUserMsg:n,conversationInstructions:r,plugins:i,metadata:l,workingDirOverride:d,workspaceMode:v,parentConversationId:b,agentType:x,sandboxId:S,agentProfileId:C,agentProfileKind:w}=t;if(o.getActiveBackend().backend.kind===`cloud`)return u.createCloudAppConversation({initial_message:n?{role:`user`,content:[{type:`text`,text:n}]}:null,title:r??null,selected_repository:l?.selected_repository??null,selected_branch:l?.selected_branch??null,git_provider:l?.git_provider??null,plugins:i??null,parent_conversation_id:b??null,agent_type:x,sandbox_id:S??null,agent_profile_id:C??null,trigger:`gui`});let[T,E]=await Promise.all([h.default.getSettings(),m.default.listProfiles().catch(()=>void 0)]),D=_.resolveTitleLlmProfile(T.title_llm_profile,E),O=f.default(),k=await p.resolveAbsoluteAgentServerPath(d??a.buildConversationWorkingDir(O)),A=v??(d?`local_repo`:`new_worktree`),j=await g.buildStartConversationRequestWithEncryptedSettings({settings:T,query:n,conversationInstructions:r,plugins:i,conversationId:O,parentConversationId:b,workingDir:k,worktree:A===`new_worktree`,agentProfileId:C,agentProfileKind:w,titleLlmProfile:D}),M=await new e.ConversationClient(s.getAgentServerClientOptions({timeout:y})).createConversation(j),N=o.getEffectiveLocalBackend();if(!N)throw new s.NoBackendAvailableError;return(l?.selected_repository||d)&&c.setStoredConversationMetadata(M.id,{selected_repository:l?.selected_repository??null,selected_branch:l?.selected_branch??null,git_provider:l?.git_provider??null,selected_workspace:d??null,workspace_mode:A}),{id:M.id,created_by_user_id:null,status:`READY`,detail:null,app_conversation_id:M.id,agent_server_url:N.host,request:{initial_message:j.initial_message,plugins:i??null},created_at:M.created_at,updated_at:M.updated_at}}static async getStartTask(e){return o.getActiveBackend().backend.kind===`cloud`?u.getCloudAppConversationStartTask(e):null}static async getVSCodeUrl(e,t,n){let i=await this.resolveConversationWorkingDir(e);return{vscode_url:await new r.VSCodeClient(s.getAgentServerClientOptions({conversationUrl:t,sessionApiKey:n})).getUrl({baseUrl:typeof window<`u`?window.location.origin:void 0,workspaceDir:i})}}static async resolveConversationWorkingDir(e){let[t]=await this.batchGetAppConversations([e]);return t?.workspace?.working_dir??a.getAgentServerWorkingDir()}static async batchGetAppConversations(t){return t.length===0?[]:o.getActiveBackend().backend.kind===`cloud`?u.batchGetCloudConversations(t):L(await new e.ConversationClient(s.getAgentServerClientOptions()).getConversations(t)).map(e=>g.toAppConversation(e))}static async updateConversationPublicFlag(e,t){if(o.getActiveBackend().backend.kind!==`cloud`)throw Error(`Public sharing requires a cloud backend.`);return u.updateCloudConversationPublicFlag(e,t)}static async updateConversationRepository(e,t,n,r){t?c.setStoredConversationMetadata(e,{...c.getStoredConversationMetadata(e)??{},selected_repository:t,selected_branch:n??null,git_provider:r??null}):c.removeStoredConversationMetadata(e);let[i]=await this.batchGetAppConversations([e]);return V(i,e)}static async readConversationFile(e,n){if(o.getActiveBackend().backend.kind===`cloud`)return u.readCloudConversationFile(e,F(n??`/workspace/project/.agents_tmp/PLAN.md`,`/workspace/project`));let r=await this.resolveConversationWorkingDir(e),i=F(n??`${r}/.agents_tmp/PLAN.md`,r);return new t.FileClient(s.getAgentServerClientOptions()).downloadTextFile(i)}static async downloadConversation(e){return o.getActiveBackend().backend.kind===`cloud`?u.downloadCloudConversation(e):new t.FileClient(s.getAgentServerClientOptions()).downloadTrajectory(e)}static async getHooks(e){return g.emptyHooksResponse()}static async getRuntimeConversation(t,n,r){let i=I(await new e.ConversationClient(s.getAgentServerClientOptions({conversationUrl:n,sessionApiKey:r})).getConversation(t));return{id:i.id,title:i.title?.trim()?i.title:g.getDefaultConversationTitle(i.id),metrics:O(i.metrics),created_at:i.created_at,updated_at:i.updated_at,status:B(i.execution_status),stats:i.stats??{usage_to_metrics:{}}}}static async condenseConversation(t,n,r){let a=o.getActiveBackend().backend;if(a.kind===`cloud`&&n){await l.callCloudProxy({backend:a,method:`POST`,hostOverride:i.buildHttpBaseUrl(n),path:`/api/conversations/${t}/condense`,authMode:`session-api-key`,sessionApiKey:r});return}await new e.ConversationClient(s.getAgentServerClientOptions({conversationUrl:n,sessionApiKey:r})).condenseConversation(t)}static async searchConversations(t=20,n){return o.getActiveBackend().backend.kind===`cloud`?u.searchCloudConversations(t,n):g.toConversationPage(R(await new e.ConversationClient(s.getAgentServerClientOptions()).searchConversations({limit:t,page_id:n,sort_order:d.ConversationSortOrder.UPDATED_AT_DESC})))}static async deleteConversation(t){o.getActiveBackend().backend.kind===`cloud`?await u.deleteCloudConversation(t):await new e.ConversationClient(s.getAgentServerClientOptions()).deleteConversation(t),c.removeStoredConversationMetadata(t)}static async updateConversationTitle(t,n){await new e.ConversationClient(s.getAgentServerClientOptions()).updateConversation(t,{title:n});let[r]=await this.batchGetAppConversations([t]);return V(r,t)}static async forkConversation(t,n,r){if(o.getActiveBackend().backend.kind===`cloud`)throw Error(`Branching a conversation isn't supported on the cloud backend yet.`);let i=await new e.ConversationClient(s.getAgentServerClientOptions()).forkConversation(t,{from_event_id:n,...r?{title:r}:{}}),a=c.getStoredConversationMetadata(t);return a&&c.setStoredConversationMetadata(i.id,a),i}static async getEventParentId(t,n){return(await new e.ConversationClient(s.getAgentServerClientOptions()).getEvent(t,n)).parent_id??void 0}static async switchProfile(t,r){let{backend:i}=o.getActiveBackend();if(i.kind===`cloud`){if(!t){await m.default.activateProfile(r);return}await l.callCloudProxy({backend:i,method:`POST`,path:`/api/v1/app-conversations/${t}/switch_profile`,body:{profile_name:r}});return}if(!t){await new n.ProfilesClient(s.getAgentServerClientOptions()).activateProfile(r);return}let a=s.getAgentServerClientOptions(),c=new e.ConversationClient(a),u=await new n.ProfilesClient(a).getProfile(r,{exposeSecrets:`encrypted`}),d=typeof u.config.model==`string`?u.config.model:``;if(!d)throw Error(`Profile '${r}' has no model.`);await g.assertSubscriptionAuthReady({llm:u.config}),await c.switchLLM(t,{...u.config,model:d,stream:!0,usage_id:`profile:${r}:${f.default()}`})}static async switchAcpModel(t,n){let{backend:r}=o.getActiveBackend();if(r.kind===`cloud`){await l.callCloudProxy({backend:r,method:`POST`,path:`/api/v1/app-conversations/${t}/switch_acp_model`,body:{model:n}});return}await new e.ConversationClient(s.getAgentServerClientOptions()).switchAcpModel(t,n)}};exports.default=H;
1
+ require("../../_virtual/_rolldown/runtime.cjs");const e=require("../../node_modules/@openhands/typescript-client/dist/client/conversation-client.cjs"),t=require("../../node_modules/@openhands/typescript-client/dist/client/file-client.cjs"),n=require("../../node_modules/@openhands/typescript-client/dist/client/profiles-client.cjs"),r=require("../../node_modules/@openhands/typescript-client/dist/client/vscode-client.cjs");require("../../node_modules/@openhands/typescript-client/dist/clients.cjs");const i=require("../../utils/websocket-url.cjs"),a=require("../agent-server-config.cjs"),o=require("../backend-registry/active-store.cjs"),s=require("../agent-server-client-options.cjs"),c=require("../../services/telemetry.cjs"),l=require("../conversation-metadata-store.cjs"),u=require("../cloud/proxy.cjs"),d=require("../cloud/conversation-service.api.cjs"),f=require("../../node_modules/@openhands/typescript-client/dist/models/conversation.cjs");require("../../node_modules/@openhands/typescript-client/dist/index.cjs");const p=require("../../node_modules/uuid/dist/v4.cjs"),m=require("../agent-server-home.cjs"),h=require("../profiles-service/profiles-service.api.cjs"),g=require("../settings-service/settings-service.api.cjs"),_=require("../../utils/plan-file.cjs"),v=require("../agent-server-adapter.cjs"),y=require("../../utils/title-llm-profile.cjs");var b=`1970-01-01T00:00:00.000Z`,x=300*1e3,S=`Unable to load conversations because the selected agent server returned data this UI does not understand. Check the backend URL/session key and update the agent server if needed.`;function C(){return Error(S)}function w(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function T(e){return typeof e==`number`?e:null}function E(e){return typeof e==`number`?e:0}function D(e){return typeof e==`string`?e:null}function O(e,t,n){let r=e[t]??e[n];return typeof r==`string`&&r.trim()?r:b}function k(e){return w(e)?{prompt_tokens:E(e.prompt_tokens),completion_tokens:E(e.completion_tokens),cache_read_tokens:E(e.cache_read_tokens),cache_write_tokens:E(e.cache_write_tokens),context_window:E(e.context_window),per_turn_token:E(e.per_turn_token)}:null}function A(e){return w(e)?{accumulated_cost:T(e.accumulated_cost),max_budget_per_task:T(e.max_budget_per_task),accumulated_token_usage:k(e.accumulated_token_usage)}:null}function j(e){return w(e)?e:null}function M(e){if(!w(e))return null;let t=w(e.llm)?{model:D(e.llm.model)}:null;return{kind:D(e.kind),acp_server:D(e.acp_server),acp_model:D(e.acp_model),llm:t}}function N(e){return w(e)?{working_dir:D(e.working_dir)}:null}function P(e){if(!w(e))return null;let t={};for(let[n,r]of Object.entries(e))typeof r==`string`&&(t[n]=r);return t}function F(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`):null}function I(e){if(!w(e))return null;let{agent_profile_id:t,revision:n}=e;return typeof t!=`string`||typeof n!=`number`?null:{agent_profile_id:t,revision:n}}function L(e){if(!e.startsWith(`/`))return null;let t=[];for(let n of e.split(`/`))if(n&&n!==`.`)if(n===`..`){if(!t.length)return null;t.pop()}else t.push(n);return`/${t.join(`/`)}`}function R(e,t){let n=L(e),r=L(t);if(!n||!r||n!==r&&!n.startsWith(`${r}/`))throw Error(`Conversation file path must stay inside the workspace`);return n}function z(e){if(!w(e)||typeof e.id!=`string`||!e.id.trim())throw C();return{id:e.id.trim(),title:D(e.title),created_at:O(e,`created_at`,`createdAt`),updated_at:O(e,`updated_at`,`updatedAt`),execution_status:D(e.execution_status),sandbox_status:D(e.sandbox_status),metrics:A(e.metrics),stats:j(e.stats),agent:M(e.agent),workspace:N(e.workspace),tags:P(e.tags),launched_agent_profile:I(e.launched_agent_profile),sub_conversation_ids:F(e.sub_conversation_ids),current_model_id:D(e.current_model_id),current_model_name:D(e.current_model_name)}}function B(e){if(!Array.isArray(e))throw C();return e.map(z)}function V(e){if(Array.isArray(e))return{items:B(e),next_page_id:null};if(!w(e))throw C();return{items:B(e.items),next_page_id:typeof e.next_page_id==`string`?e.next_page_id:null}}var H=new Set([`idle`,`running`,`paused`,`waiting_for_confirmation`,`finished`,`error`,`stuck`]);function U(e){let t=e??`idle`;return H.has(t)?t:`idle`}function W(e,t){if(!e)throw Error(`Conversation ${t} was not found`);return e}var G=class{static async sendMessage(t,n,r){let a=o.getActiveBackend().backend,c=r?.conversationUrl??null,l=r?.sessionApiKey??null;if(a.kind===`cloud`){if(!c||!l){let[e]=await d.batchGetCloudConversations([t]);c=e?.conversation_url?.trim()??null,l=e?.session_api_key?.trim()??null}if(!c||!l)throw Error(`Conversation sandbox is still starting. Wait for it to finish, then try again.`);return await u.callCloudProxy({backend:a,method:`POST`,hostOverride:i.buildHttpBaseUrl(c),path:`/api/conversations/${t}/events`,body:{...n,run:!0},authMode:`session-api-key`,sessionApiKey:l}),n}return await new e.ConversationClient(s.getAgentServerClientOptions({conversationUrl:c,sessionApiKey:l})).sendEvent(t,n,{run:!0}),n}static async createConversation(t={}){let{initialUserMsg:n,conversationInstructions:r,plugins:i,metadata:u,workingDirOverride:f,workspaceMode:_,parentConversationId:b,agentType:S,sandboxId:C,agentProfileId:w,agentProfileKind:T}=t;if(o.getActiveBackend().backend.kind===`cloud`)return d.createCloudAppConversation({initial_message:n?{role:`user`,content:[{type:`text`,text:n}]}:null,title:r??null,selected_repository:u?.selected_repository??null,selected_branch:u?.selected_branch??null,git_provider:u?.git_provider??null,plugins:i??null,parent_conversation_id:b??null,agent_type:S,sandbox_id:C??null,agent_profile_id:w??null,trigger:`gui`});let[E,D]=await Promise.all([g.default.getSettings(),h.default.listProfiles().catch(()=>void 0)]),O=y.resolveTitleLlmProfile(E.title_llm_profile,D),k=p.default(),A=o.getActiveBackend().backend.host,j=await m.resolveAbsoluteAgentServerPath(f??a.buildConversationWorkingDirForBackend(k,A)),M=f?j:await m.resolveAbsoluteAgentServerPath(a.getWorkspaceRootForBackend(A)),N=_??(f?`local_repo`:`new_worktree`),P=await v.buildStartConversationRequestWithEncryptedSettings({settings:E,query:n,conversationInstructions:r,plugins:i,conversationId:k,parentConversationId:b,workingDir:j,hooksProjectDir:M,worktree:N===`new_worktree`,agentProfileId:w,agentProfileKind:T,titleLlmProfile:O}),F=await c.getTelemetryDistinctId(),I=await new e.ConversationClient(s.getAgentServerClientOptions({timeout:x})).createConversation({...P,...F?{user_id:F}:{}}),L=o.getEffectiveLocalBackend();if(!L)throw new s.NoBackendAvailableError;return(u?.selected_repository||f)&&l.setStoredConversationMetadata(I.id,{selected_repository:u?.selected_repository??null,selected_branch:u?.selected_branch??null,git_provider:u?.git_provider??null,selected_workspace:f??null,workspace_mode:N}),{id:I.id,created_by_user_id:null,status:`READY`,detail:null,app_conversation_id:I.id,agent_server_url:L.host,request:{initial_message:P.initial_message,plugins:i??null},created_at:I.created_at,updated_at:I.updated_at}}static async createLocalPlanningConversation(t,n){if(o.getActiveBackend().backend.kind===`cloud`)throw Error(`Local planning conversations require a local backend.`);let[r]=await this.batchGetAppConversations([t]),i=await v.buildStartPlanningConversationRequestWithEncryptedSettings({workingDir:r?.workspace?.working_dir??a.getAgentServerWorkingDir(),parentConversationId:t,parentActiveProfileName:r?.agent_kind===`openhands`?r?.active_profile??null:null,parentAgentProfileId:r?.launched_agent_profile?.agent_profile_id??null,initialMessage:n}),c=await new e.ConversationClient(s.getAgentServerClientOptions()).createConversation(i);return l.mergeStoredConversationMetadata(t,{local_planning_conversation_id:c.id}),v.toAppConversation(c)}static async getLocalPlanningConversationIds(e){if(o.getActiveBackend().backend.kind===`cloud`)return[];let t=new Set;try{let[n]=await this.batchGetAppConversations([e]),r=n?.sub_conversation_ids??[];if(r.length>0){let n=await this.batchGetAppConversations(r);for(let r of n)r&&_.isPlannerConversationOf(r,e)&&t.add(r.id)}}catch(t){console.warn(`Failed to read sub-conversations of ${e}`,t)}let n=l.getStoredConversationMetadata(e)?.local_planning_conversation_id;return n&&t.add(n),[...t]}static async getStartTask(e){return o.getActiveBackend().backend.kind===`cloud`?d.getCloudAppConversationStartTask(e):null}static async getVSCodeUrl(e,t,n){let i=await this.resolveConversationWorkingDir(e);return{vscode_url:await new r.VSCodeClient(s.getAgentServerClientOptions({conversationUrl:t,sessionApiKey:n})).getUrl({baseUrl:typeof window<`u`?window.location.origin:void 0,workspaceDir:i})}}static async getVSCodeStatus(e,t){return new r.VSCodeClient(s.getAgentServerClientOptions({conversationUrl:e,sessionApiKey:t})).getStatus()}static async resolveConversationWorkingDir(e){let[t]=await this.batchGetAppConversations([e]);return t?.workspace?.working_dir??a.getAgentServerWorkingDir()}static async batchGetAppConversations(t){return t.length===0?[]:o.getActiveBackend().backend.kind===`cloud`?d.batchGetCloudConversations(t):B(await new e.ConversationClient(s.getAgentServerClientOptions()).getConversations(t)).map(e=>v.toAppConversation(e))}static async updateConversationPublicFlag(e,t){if(o.getActiveBackend().backend.kind!==`cloud`)throw Error(`Public sharing requires a cloud backend.`);return d.updateCloudConversationPublicFlag(e,t)}static async updateConversationRepository(e,t,n,r){t?l.setStoredConversationMetadata(e,{...l.getStoredConversationMetadata(e)??{},selected_repository:t,selected_branch:n??null,git_provider:r??null}):l.removeStoredConversationMetadata(e);let[i]=await this.batchGetAppConversations([e]);return W(i,e)}static async readConversationFile(e,n){if(o.getActiveBackend().backend.kind===`cloud`)return d.readCloudConversationFile(e,R(n??`/workspace/project/.agents_tmp/PLAN.md`,`/workspace/project`));let r=await this.resolveConversationWorkingDir(e),i=R(n??`${r}/.agents_tmp/PLAN.md`,r);return new t.FileClient(s.getAgentServerClientOptions()).downloadTextFile(i)}static async downloadConversation(e){return o.getActiveBackend().backend.kind===`cloud`?d.downloadCloudConversation(e):new t.FileClient(s.getAgentServerClientOptions()).downloadTrajectory(e)}static async getHooks(e){return v.emptyHooksResponse()}static async getRuntimeConversation(t,n,r){let i=z(await new e.ConversationClient(s.getAgentServerClientOptions({conversationUrl:n,sessionApiKey:r})).getConversation(t));return{id:i.id,title:i.title?.trim()?i.title:v.getDefaultConversationTitle(i.id),metrics:A(i.metrics),created_at:i.created_at,updated_at:i.updated_at,status:U(i.execution_status),stats:i.stats??{usage_to_metrics:{}}}}static async condenseConversation(t,n,r){let a=o.getActiveBackend().backend;if(a.kind===`cloud`&&n){await u.callCloudProxy({backend:a,method:`POST`,hostOverride:i.buildHttpBaseUrl(n),path:`/api/conversations/${t}/condense`,authMode:`session-api-key`,sessionApiKey:r});return}await new e.ConversationClient(s.getAgentServerClientOptions({conversationUrl:n,sessionApiKey:r})).condenseConversation(t)}static async searchConversations(t=20,n){return o.getActiveBackend().backend.kind===`cloud`?d.searchCloudConversations(t,n):v.toConversationPage(V(await new e.ConversationClient(s.getAgentServerClientOptions()).searchConversations({limit:t,page_id:n,sort_order:f.ConversationSortOrder.UPDATED_AT_DESC})))}static async deleteConversation(t){if(o.getActiveBackend().backend.kind===`cloud`){await d.deleteCloudConversation(t),l.removeStoredConversationMetadata(t);return}let n=await this.getLocalPlanningConversationIds(t),r=new e.ConversationClient(s.getAgentServerClientOptions());await Promise.all(n.map(async e=>{try{await r.deleteConversation(e)}catch(t){console.warn(`Failed to delete planning conversation ${e}`,t)}l.removeStoredConversationMetadata(e)})),await r.deleteConversation(t),l.removeStoredConversationMetadata(t)}static async updateConversationTitle(t,n){if(o.getActiveBackend().backend.kind===`cloud`)return d.updateCloudConversationTitle(t,n);await new e.ConversationClient(s.getAgentServerClientOptions()).updateConversation(t,{title:n});let[r]=await this.batchGetAppConversations([t]);return W(r,t)}static async updateConversationTags(t,n){await new e.ConversationClient(s.getAgentServerClientOptions()).updateConversation(t,{tags:n});let[r]=await this.batchGetAppConversations([t]);return W(r,t)}static async forkConversation(t,n,r){if(o.getActiveBackend().backend.kind===`cloud`)throw Error(`Branching a conversation isn't supported on the cloud backend yet.`);let i=await new e.ConversationClient(s.getAgentServerClientOptions()).forkConversation(t,{from_event_id:n,...r?{title:r}:{}}),a=l.getStoredConversationMetadata(t);return a&&l.setStoredConversationMetadata(i.id,a),i}static async getEventParentId(t,n){return(await new e.ConversationClient(s.getAgentServerClientOptions()).getEvent(t,n)).parent_id??void 0}static async switchProfile(t,r){let{backend:i}=o.getActiveBackend();if(i.kind===`cloud`){if(!t){await h.default.activateProfile(r);return}await u.callCloudProxy({backend:i,method:`POST`,path:`/api/v1/app-conversations/${t}/switch_profile`,body:{profile_name:r}});return}if(!t){await new n.ProfilesClient(s.getAgentServerClientOptions()).activateProfile(r);return}let a=s.getAgentServerClientOptions(),c=new e.ConversationClient(a),l=await new n.ProfilesClient(a).getProfile(r,{exposeSecrets:`encrypted`}),d=typeof l.config.model==`string`?l.config.model:``;if(!d)throw Error(`Profile '${r}' has no model.`);await v.assertSubscriptionAuthReady({llm:l.config}),await c.switchLLM(t,{...l.config,model:d,stream:!0,usage_id:`profile:${r}:${p.default()}`})}static async switchAcpModel(t,n){let{backend:r}=o.getActiveBackend();if(r.kind===`cloud`){await u.callCloudProxy({backend:r,method:`POST`,path:`/api/v1/app-conversations/${t}/switch_acp_model`,body:{model:n}});return}await new e.ConversationClient(s.getAgentServerClientOptions()).switchAcpModel(t,n)}};exports.default=G;
2
2
  //# sourceMappingURL=agent-server-conversation-service.api.cjs.map