@openhands/agent-canvas 1.9.0 → 1.11.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 (1386) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/{acp-providers-C921BlYB.js → acp-providers-BkL3HWa3.js} +1 -1
  4. package/build/assets/active-backend-context-BBvP-bI2.js +2 -0
  5. package/build/assets/agent-context-settings-Bno1nwPL.js +1 -0
  6. package/build/assets/{agent-profiles-settings-BymJf3EP.js → agent-profiles-settings-DqoS7RL3.js} +1 -1
  7. package/build/assets/agent-server-conversation-service.api-0RztSdJJ.js +86 -0
  8. package/build/assets/agent-settings-BJHryp65.js +1 -0
  9. package/build/assets/{agent-settings-WzqXk6B4.js → agent-settings-h8hQz-IU.js} +2 -2
  10. package/build/assets/alert-banner-lrK-2_0Y.js +1 -0
  11. package/build/assets/{api-key-entry-screen-DI0I04O3.js → api-key-entry-screen-Qsb83VX1.js} +1 -1
  12. package/build/assets/{app-settings-DGistSFV.js → app-settings-r1RUbgGi.js} +1 -1
  13. package/build/assets/automation-detail-7LkL91j9.js +3 -0
  14. package/build/assets/automation-export-U2QNyNy6.js +2 -0
  15. package/build/assets/automation-setup-route-Bel9_Lue.js +1 -0
  16. package/build/assets/automation-templates-CRLDssaI.js +1 -0
  17. package/build/assets/automations-list-B2iV3ZKW.js +1 -0
  18. package/build/assets/{back-nav-button-D4ngzpSh.js → back-nav-button-B3pYwmUJ.js} +1 -1
  19. package/build/assets/backend-form-modal-OroTqnAv.js +1 -0
  20. package/build/assets/{backend-synced-settings-badge-BnzI8Ysj.js → backend-synced-settings-badge-DB4717Iu.js} +1 -1
  21. package/build/assets/{badge-1Mf1iPcX.js → badge-yR53enbU.js} +1 -1
  22. package/build/assets/{base-modal-BBuy0WQQ.js → base-modal-3NmIOKDm.js} +1 -1
  23. package/build/assets/bot-DuN83i3p.js +1 -0
  24. package/build/assets/{brand-button-DGN6Y9o6.js → brand-button-CJcwjnfb.js} +1 -1
  25. package/build/assets/{browser-D_ekTlTS.js → browser--eoQOo4M.js} +2 -2
  26. package/build/assets/{browser-tab-D4a4Ou_w.js → browser-tab-A94o33Vn.js} +1 -1
  27. package/build/assets/{chat-send-button-CgbcjD97.js → chat-send-button-B8n6-DQA.js} +1 -1
  28. package/build/assets/check-DLOKoFU9.js +1 -0
  29. package/build/assets/{checkmark-CxdXtM3b.js → checkmark-XZyokq_Y.js} +1 -1
  30. package/build/assets/chevron-down-CnIbtM6i.js +1 -0
  31. package/build/assets/circle-check-CxCYJrpZ.js +1 -0
  32. package/build/assets/{circle-plus-check-toggle-yTAS-nX3.js → circle-plus-check-toggle-BVzv5EkZ.js} +1 -1
  33. package/build/assets/{close-CDAVqnTn.js → close-ScPlnwyq.js} +1 -1
  34. package/build/assets/{cloud-funnel-analytics-CEOl5Gxr.js → cloud-funnel-analytics-CBQdPZl_.js} +1 -1
  35. package/build/assets/{combobox-caret-Bd2yySnF.js → combobox-caret-BlmRwiM8.js} +1 -1
  36. package/build/assets/command-menu-PsRXVBz2.js +1 -0
  37. package/build/assets/condenser-settings-w7L3EFvm.js +1 -0
  38. package/build/assets/{confirmation-modal-NCUPr2-O.js → confirmation-modal-DAH0XtOp.js} +1 -1
  39. package/build/assets/context-menu-list-item-BQhmFVEK.js +1 -0
  40. package/build/assets/{conversation-CUJ0Vo8g.js → conversation-BUzBZAc-.js} +7 -7
  41. package/build/assets/conversation-panel-pzAKsSDb.js +1 -0
  42. package/build/assets/conversation-pzAKsSDb.js +1 -0
  43. package/build/assets/{conversation-state-store-F62HvuI1.js → conversation-state-store-Bs8gA263.js} +1 -1
  44. package/build/assets/{conversation-store-C6hSXHw0.js → conversation-store-B8Eahyeg.js} +1 -1
  45. package/build/assets/{conversation-tab-empty-state-BCZ7rUMH.js → conversation-tab-empty-state-C9sfDOlt.js} +1 -1
  46. package/build/assets/{copy-z7idLzWO.js → copy-Drmhc2jD.js} +1 -1
  47. package/build/assets/{copy-to-clipboard-button-D_Lp6-Fl.js → copy-to-clipboard-button-DatoElj8.js} +1 -1
  48. package/build/assets/{device-verify-DLmolX8Q.js → device-verify-BIjXeW9N.js} +1 -1
  49. package/build/assets/{dist-hOnv1nn2.js → dist-Bl64nBZL.js} +1 -1
  50. package/build/assets/{dropdown-classes-BB8rzqXL.js → dropdown-classes-zFW7qPSK.js} +1 -1
  51. package/build/assets/entry.client-DzbDyLkV.js +2 -0
  52. package/build/assets/enum-filter-dropdown-CctILg5t.js +1 -0
  53. package/build/assets/{environment-switch-overlay-BepBBX66.js → environment-switch-overlay-Cvmo6clk.js} +1 -1
  54. package/build/assets/{extensions-hub-R3KNv-5V.js → extensions-hub-DOmHPGTA.js} +1 -1
  55. package/build/assets/{extensions-navigation-CfWFmI1I.js → extensions-navigation-6zU5M1pa.js} +1 -1
  56. package/build/assets/{external-link-BdBSg8rk.js → external-link-zWbg5KXS.js} +1 -1
  57. package/build/assets/file-text-RecuaId_.js +1 -0
  58. package/build/assets/files-tab-BzofBmF4.js +1 -0
  59. package/build/assets/{folder-C86qXV7M.js → folder-C1ou4_DT.js} +1 -1
  60. package/build/assets/{form-control-classes-DAfsCJTe.js → form-control-classes-DLN3Qgub.js} +1 -1
  61. package/build/assets/format-relative-time-DGPQlPx0.js +1 -0
  62. package/build/assets/format-time-delta-BIR5Os7T.js +1 -0
  63. package/build/assets/{git-provider-icon-BZqqUPlm.js → git-provider-icon-BLMlwy02.js} +1 -1
  64. package/build/assets/{git-repo-dropdown-DEpOwUez.js → git-repo-dropdown-B7RvO70z.js} +1 -1
  65. package/build/assets/git-repo-dropdown-B_PTq4ol.js +1 -0
  66. package/build/assets/{highlighted-source-view-CX9oIoVT.js → highlighted-source-view-CgJfD5VT.js} +1 -1
  67. package/build/assets/home-DEZaZqYv.js +1 -0
  68. package/build/assets/home-r89Vj2td.js +1 -0
  69. package/build/assets/{home-store-Ch1ErdBc.js → home-store-D7CjMN_-.js} +1 -1
  70. package/build/assets/{iconBase-B2rQun3J.js → iconBase-C2sR-uAp.js} +1 -1
  71. package/build/assets/index-home-r89Vj2td.js +1 -0
  72. package/build/assets/install-server-modal-BTwK5lbi.js +1 -0
  73. package/build/assets/kebab-menu-item-content-C4CkeiJO.js +1 -0
  74. package/build/assets/{launch-B1POpHuP.js → launch-DVlx4v9o.js} +1 -1
  75. package/build/assets/{link-external-BDBCz-_z.js → link-external-BNZzCM1I.js} +1 -1
  76. package/build/assets/{list-todo-DtiL3lTp.js → list-todo-CheUtB7F.js} +1 -1
  77. package/build/assets/llm-not-configured-banner-CwKu8C6g.js +27 -0
  78. package/build/assets/llm-settings-BJotLQND.js +1 -0
  79. package/build/assets/llm-settings-CDM-5H2A.js +1 -0
  80. package/build/assets/{llm-subscription-service-DBJbfd8Z.js → llm-subscription-service-7eVfDIE1.js} +1 -1
  81. package/build/assets/loader-circle-C5AnEN8r.js +1 -0
  82. package/build/assets/{loading-spinner-DfZ_bhV7.js → loading-spinner-CN3riY7k.js} +1 -1
  83. package/build/assets/{manage-backends-modal-CwyWsiag.js → manage-backends-modal-HNWKLYhq.js} +1 -1
  84. package/build/assets/manifest-2a36a8f8.js +1 -0
  85. package/build/assets/manifest-subpage-layout-D-m-h8_t.js +1 -0
  86. package/build/assets/map-provider-7Bp2aih5.js +1 -0
  87. package/build/assets/markdown-renderer-BiiiIznl.js +8 -0
  88. package/build/assets/mcp-gLgPP7AS.js +9 -0
  89. package/build/assets/mcp-marketplace-utils-Dr_HG_ol.js +1 -0
  90. package/build/assets/messages-D1cbVhRK.js +40 -0
  91. package/build/assets/{modal-backdrop-X-vKo61e.js → modal-backdrop-BSzNhM4r.js} +1 -1
  92. package/build/assets/{modal-body-CMsDpalT.js → modal-body-duRaxj_K.js} +1 -1
  93. package/build/assets/{modal-classes-B6PDrxXo.js → modal-classes-CLEXO6dj.js} +1 -1
  94. package/build/assets/{modal-close-button-DyxBZaAb.js → modal-close-button-D0aT02hs.js} +1 -1
  95. package/build/assets/mouse-pointer-click-Px-dXWcS.js +1 -0
  96. package/build/assets/{navigation-context-BOGzIng3.js → navigation-context-CQZwH_tC.js} +1 -1
  97. package/build/assets/navigation-link-Bxo3-4vo.js +1 -0
  98. package/build/assets/npm-DRzJF5Zn.js +1 -0
  99. package/build/assets/onboarding-DSr8hOpk.js +1 -0
  100. package/build/assets/onboarding-modal-C6Euf7N4.js +1 -0
  101. package/build/assets/{openhands-logo-CmYvJXBa.js → openhands-logo-BS-Epajy.js} +1 -1
  102. package/build/assets/{organization-service.api-UDy63-oC.js → organization-service.api-C4GYWwj9.js} +1 -1
  103. package/build/assets/{pencil-BjgtZmWp.js → pencil-Bl3GWhgq.js} +1 -1
  104. package/build/assets/{planner-tab-BWk8885v.js → planner-tab-CZcguxTK.js} +1 -1
  105. package/build/assets/{plugins-management-service-CjkgF2dd.js → plugins-management-service-BmDzOQsd.js} +1 -1
  106. package/build/assets/plus-CtzlyAoF.js +1 -0
  107. package/build/assets/{profiles-service.api-CukSFLzz.js → profiles-service.api-CoLTwjc1.js} +1 -1
  108. package/build/assets/{providers-CqUWC85T.js → providers-tBzTpz1w.js} +1 -1
  109. package/build/assets/{proxy-BBUG3sd2.js → proxy-DCI9S-LA.js} +1 -1
  110. package/build/assets/{puzzle-BoNc6zZ8.js → puzzle-B3v361yY.js} +1 -1
  111. package/build/assets/recommended-automations-launcher-BbJAJVED.js +1 -0
  112. package/build/assets/{refresh-cw-BrM5ZAZD.js → refresh-cw-B9GhC3QC.js} +1 -1
  113. package/build/assets/root-BfM_kC_d.css +1 -0
  114. package/build/assets/root-gstBEjty.js +2 -0
  115. package/build/assets/root-layout-BIAFLP9p.js +2 -0
  116. package/build/assets/{schema-field-nImDoY6-.js → schema-field-zhsVDllR.js} +1 -1
  117. package/build/assets/{sdk-section-page-BxMrtUNV.js → sdk-section-page-CS4GWn0y.js} +1 -1
  118. package/build/assets/{search-7DRiGm4Z.js → search-BatSpWed.js} +1 -1
  119. package/build/assets/search-CYaiKHRp.js +1 -0
  120. package/build/assets/{secrets-service-Dhjh3HhH.js → secrets-service-DjgGduXk.js} +1 -1
  121. package/build/assets/{secrets-settings-CPdxceT_.js → secrets-settings-f-qahfbi.js} +1 -1
  122. package/build/assets/{segmented-toggle-Do6oyepX.js → segmented-toggle-SmvsR3jW.js} +1 -1
  123. package/build/assets/settings-CWFxymAf.js +1 -0
  124. package/build/assets/settings-DQd0xLEw.js +1 -0
  125. package/build/assets/{settings-dropdown-input-DYCULKpp.js → settings-dropdown-input-TWIeiG02.js} +1 -1
  126. package/build/assets/{settings-gear-TYXnELES.js → settings-gear-DaJj6Pde.js} +1 -1
  127. package/build/assets/{settings-index-C9o2NBO0.js → settings-index-BVwy9JEp.js} +1 -1
  128. package/build/assets/{settings-input-B-q2gkVy.js → settings-input-D61Vzp9e.js} +1 -1
  129. package/build/assets/settings-like-page-layout-classes-Cw4Yzv_P.js +1 -0
  130. package/build/assets/{settings-list-classes-WpQi0q1L.js → settings-list-classes-sE0ASr1s.js} +1 -1
  131. package/build/assets/{settings-modal-CEK0AIx6.js → settings-modal-D6D5ngET.js} +1 -1
  132. package/build/assets/{settings-section-header-context-CnIIQAUn.js → settings-section-header-context-BOJ_Fbak.js} +1 -1
  133. package/build/assets/settings-service.api-DZp7E7A9.js +1 -0
  134. package/build/assets/{settings-switch-LqKdGxHL.js → settings-switch-Drt-rF5s.js} +1 -1
  135. package/build/assets/{settings-utils-BL_Z9uIe.js → settings-utils-gw2ppAvw.js} +1 -1
  136. package/build/assets/{shared-conversation-Bu-dQlgp.js → shared-conversation-DIxZjElr.js} +1 -1
  137. package/build/assets/shield-check-D2cpEpv3.js +1 -0
  138. package/build/assets/{sidebar-layout-oHBGQmLh.js → sidebar-layout-Dxg6zc2K.js} +1 -1
  139. package/build/assets/sidebar-mobile-menu-toggle-OoZBHxaT.js +1 -0
  140. package/build/assets/{sidebar-nav-link-CrujNA09.js → sidebar-nav-link-CxLoG-dG.js} +1 -1
  141. package/build/assets/sidebar-store-BJeYY-E9.js +1 -0
  142. package/build/assets/{skill-card-pill-row-CZBI7OqH.js → skill-card-pill-row-B_BYBONu.js} +1 -1
  143. package/build/assets/{skill-icon-badge-BOov_phZ.js → skill-icon-badge-CN41Hy9l.js} +1 -1
  144. package/build/assets/skill-scope-B1Per5XI.js +1 -0
  145. package/build/assets/{skills-CYFLsN5U.js → skills-B0IliMxw.js} +1 -1
  146. package/build/assets/{skills-plugins-D0PiHWAD.js → skills-plugins-B3AO6sMz.js} +1 -1
  147. package/build/assets/skills-settings-DmmgJ6CT.js +2 -0
  148. package/build/assets/sparkles-g7y3r-Ut.js +1 -0
  149. package/build/assets/{styled-tooltip-C7grwnOX.js → styled-tooltip-C5C07RQC.js} +1 -1
  150. package/build/assets/{switch-skeleton-BQoOhQTB.js → switch-skeleton-DwOoCqaL.js} +1 -1
  151. package/build/assets/{syntax-highlighter-B92AFGMy.js → syntax-highlighter-BGDg_7w9.js} +1 -1
  152. package/build/assets/{task-list-tab-R3ac6m7O.js → task-list-tab-C19Q_JNf.js} +1 -1
  153. package/build/assets/{terminal-cMS3RgVE.js → terminal-BUpID2wS.js} +1 -1
  154. package/build/assets/{terminal-yqkNdEAx.js → terminal-CbuMRYal.js} +1 -1
  155. package/build/assets/{toggle-switch-BeSrbgCg.js → toggle-switch-CIioisto.js} +1 -1
  156. package/build/assets/{trash-2-wW5TWcdN.js → trash-2-CzDVN-Iw.js} +1 -1
  157. package/build/assets/{typography-iYhzLlHO.js → typography-D9tiHct7.js} +1 -1
  158. package/build/assets/{u-check-circle-DBEvndTS.js → u-check-circle-BKn1spCL.js} +1 -1
  159. package/build/assets/{u-edit-809W9D9T.js → u-edit-DAkcF52u.js} +1 -1
  160. package/build/assets/{u-robot-CJtSzy5X.js → u-robot-BvAOA2ZD.js} +1 -1
  161. package/build/assets/{use-acp-credential-form-DUxbxmbq.js → use-acp-credential-form-DJmmJKMo.js} +1 -1
  162. package/build/assets/{use-activate-agent-profile-CDHA52tC.js → use-activate-agent-profile-CeFfYwu_.js} +1 -1
  163. package/build/assets/{use-agent-profiles-TsOdIyw5.js → use-agent-profiles-BHLkLbRR.js} +1 -1
  164. package/build/assets/{use-breakpoint-DA7JqsRN.js → use-breakpoint-DWtihr9g.js} +1 -1
  165. package/build/assets/{use-can-manage-org-profiles-Bt1M71u5.js → use-can-manage-org-profiles-Bu4y8gSx.js} +1 -1
  166. package/build/assets/{use-click-outside-element-DKqpqEEm.js → use-click-outside-element-W6Os4Nlb.js} +1 -1
  167. package/build/assets/{use-cloud-current-user-id-DWt7HCgf.js → use-cloud-current-user-id-QD9x3ySO.js} +1 -1
  168. package/build/assets/{use-config-CxlEdf_v.js → use-config-CPwqciXN.js} +1 -1
  169. package/build/assets/{use-create-conversation-nOJ6Um5h.js → use-create-conversation-DWaSVUOB.js} +1 -1
  170. package/build/assets/{use-create-secret-Dj5ang9x.js → use-create-secret-BsOfOLvg.js} +1 -1
  171. package/build/assets/use-is-authed-Bka89Xmm.js +1 -0
  172. package/build/assets/{use-is-creating-conversation-CAggrM75.js → use-is-creating-conversation-CVefC9Ns.js} +1 -1
  173. package/build/assets/{use-launch-skill-in-chat-DKzCTMt0.js → use-launch-skill-in-chat-BcKNjxxd.js} +1 -1
  174. package/build/assets/use-llm-profiles-CU8ah1pz.js +1 -0
  175. package/build/assets/use-manifest-capabilities-DBYPjyV6.js +1 -0
  176. package/build/assets/{use-onboarding-completion-gxQlcEy2.js → use-onboarding-completion-CtNJxkXG.js} +1 -1
  177. package/build/assets/{use-plugins-marketplace-CVO7sXYR.js → use-plugins-marketplace-ZEA-gyM9.js} +1 -1
  178. package/build/assets/use-save-agent-profile-DgI_Uz9a.js +1 -0
  179. package/build/assets/{use-save-settings-L3aMaDeS.js → use-save-settings-pSjRhD_m.js} +1 -1
  180. package/build/assets/{use-settings-8nt3DGxW.js → use-settings-BHWsOcIG.js} +1 -1
  181. package/build/assets/use-settings-nav-items-CQgkxUbV.js +16 -0
  182. package/build/assets/use-tracking-CGCsBWhg.js +3 -0
  183. package/build/assets/{use-user-conversation-BIIpGUgM.js → use-user-conversation-DRfEU8x0.js} +1 -1
  184. package/build/assets/{useInfiniteQuery-BLRVmVPU.js → useInfiniteQuery-DbCv0Jzd.js} +1 -1
  185. package/build/assets/{useMutation-CaSHLnX0.js → useMutation-ChpkYxI5.js} +1 -1
  186. package/build/assets/{useQueries--d_WWAzc.js → useQueries-Cjv3E8_1.js} +1 -1
  187. package/build/assets/useQuery-BCnzy4LX.js +1 -0
  188. package/build/assets/utils-DPQfkd-7.js +1 -0
  189. package/build/assets/{vendor-markdown-BML7QbqS.js → vendor-markdown-j0kYzV48.js} +1 -1
  190. package/build/assets/{vendor-styling-Bcgpimp9.js → vendor-styling-Ck5D_A2Q.js} +6 -6
  191. package/build/assets/{vendor~browser-jaN4ilxM.js → vendor~browser-C6uXH-dw.js} +2 -2
  192. package/build/assets/vendor~browser-DJ1pl_wn.js +47 -0
  193. package/build/assets/{vendor~browser-tab-_-VCXq8n.js → vendor~browser-tab-C5uuAxZX.js} +1 -1
  194. package/build/assets/vendor~entry.client-CgNUwtQL.js +1 -0
  195. package/build/assets/{vendor~entry.client-BcYIVQvB.js → vendor~entry.client-zSIea5EO.js} +2 -2
  196. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~cy4jtuc2-rfV8mQ9m.js +1 -0
  197. package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~b0bpqexo-CbTboogo.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kv3pap4j-oGvLV0dO.js} +4 -4
  198. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~lq5hicxx-cHFhpUBq.js +26 -0
  199. package/build/assets/{vendor~files-tab-C7RmQJwN.js → vendor~files-tab-C87pjSpi.js} +1 -1
  200. package/build/assets/{vendor~index-home~home~conversation-panel~conversation-Bqp1ZqJM.js → vendor~index-home~home~conversation-panel~conversation-DiXf0dkj.js} +1 -1
  201. package/build/assets/{vendor~conversation-panel~conversation~alert-banner-BNzz5FuZ.js → vendor~index-home~home~conversation-panel~conversation~alert-banner-B3qC_oj8.js} +1 -1
  202. package/build/assets/{vendor~launch-ChXCOGw8.js → vendor~launch-CHwEQG6e.js} +1 -1
  203. package/build/assets/vendor~module-DyG7x7JT.js +2 -0
  204. package/build/assets/{vendor~root-layout~conversation-panel~conversation-BCn8lzeG.js → vendor~root-layout~conversation-panel~conversation-DEzjR4K7.js} +1 -1
  205. package/build/assets/{vendor~root-layout~conversation-panel~conversation~shared-conversation-DRblkyXD.js → vendor~root-layout~conversation-panel~conversation~shared-conversation-DOuig0C0.js} +1 -1
  206. package/build/assets/vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-U-xdsAEx.js +1 -0
  207. package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation~automation-setup-route-B_L-gcOG.js → vendor~root-layout~index-home~home~conversation-panel~conversation~automation-setup-route-CjECvSl5.js} +1 -1
  208. package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-sjx0x5ac.js → vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-CQR5Sa0H.js} +1 -1
  209. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~gy8zbn65-CGt6bWRT.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~gxu4j2ea-Cwhh3zLe.js} +1 -1
  210. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~dfc8ddxy-tTyxnjXT.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-CuQhkiS7.js} +1 -1
  211. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~9pstowjp-BOVIFA_g.js +73 -0
  212. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~dufan6ng-Dtdw8H0q.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~ht43enc2-C0JXQb_q.js} +162 -54
  213. package/build/assets/{verification-settings-DBsnSXC3.js → verification-settings-BItwt998.js} +1 -1
  214. package/build/assets/wrench-B1_H-tL1.js +1 -0
  215. package/build/assets/x-RYDBg-e2.js +1 -0
  216. package/build/assets/{x-mark-jcTkPiOB.js → x-mark-BopmFoBq.js} +1 -1
  217. package/build/assets/zap-tbKDzCe3.js +1 -0
  218. package/build/index.html +4 -4
  219. package/build/locales/ar/openhands.json +108 -5
  220. package/build/locales/ca/openhands.json +108 -5
  221. package/build/locales/de/openhands.json +108 -5
  222. package/build/locales/en/openhands.json +108 -5
  223. package/build/locales/es/openhands.json +108 -5
  224. package/build/locales/fr/openhands.json +108 -5
  225. package/build/locales/it/openhands.json +108 -5
  226. package/build/locales/ja/openhands.json +108 -5
  227. package/build/locales/ko-KR/openhands.json +108 -5
  228. package/build/locales/no/openhands.json +108 -5
  229. package/build/locales/pt/openhands.json +108 -5
  230. package/build/locales/tr/openhands.json +108 -5
  231. package/build/locales/uk/openhands.json +108 -5
  232. package/build/locales/zh-CN/openhands.json +108 -5
  233. package/build/locales/zh-TW/openhands.json +108 -5
  234. package/build/mockServiceWorker.js +21 -9
  235. package/config/defaults.json +3 -3
  236. package/dist/api/agent-server-adapter.cjs +3 -3
  237. package/dist/api/agent-server-adapter.cjs.map +1 -1
  238. package/dist/api/agent-server-adapter.d.ts +32 -5
  239. package/dist/api/agent-server-adapter.js +120 -91
  240. package/dist/api/agent-server-adapter.js.map +1 -1
  241. package/dist/api/automation-service/automation-service.api.cjs +1 -1
  242. package/dist/api/automation-service/automation-service.api.cjs.map +1 -1
  243. package/dist/api/automation-service/automation-service.api.d.ts +5 -0
  244. package/dist/api/automation-service/automation-service.api.js +11 -0
  245. package/dist/api/automation-service/automation-service.api.js.map +1 -1
  246. package/dist/api/backend-registry/active-store.cjs +1 -1
  247. package/dist/api/backend-registry/active-store.cjs.map +1 -1
  248. package/dist/api/backend-registry/active-store.js +36 -31
  249. package/dist/api/backend-registry/active-store.js.map +1 -1
  250. package/dist/api/backend-registry/url-selection.cjs +2 -0
  251. package/dist/api/backend-registry/url-selection.cjs.map +1 -0
  252. package/dist/api/backend-registry/url-selection.d.ts +31 -0
  253. package/dist/api/backend-registry/url-selection.js +29 -0
  254. package/dist/api/backend-registry/url-selection.js.map +1 -0
  255. package/dist/api/cloud/conversation-service.api.cjs +1 -1
  256. package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
  257. package/dist/api/cloud/conversation-service.api.d.ts +19 -2
  258. package/dist/api/cloud/conversation-service.api.js +51 -47
  259. package/dist/api/cloud/conversation-service.api.js.map +1 -1
  260. package/dist/api/conversation-file-upload.api.cjs +1 -1
  261. package/dist/api/conversation-file-upload.api.js +10 -10
  262. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  263. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  264. package/dist/api/conversation-service/agent-server-conversation-service.api.js +55 -61
  265. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  266. package/dist/api/event-service/event-service.api.cjs +1 -1
  267. package/dist/api/event-service/event-service.api.js +12 -12
  268. package/dist/api/launch-child-conversation-client-tool.cjs +47 -0
  269. package/dist/api/launch-child-conversation-client-tool.cjs.map +1 -0
  270. package/dist/api/launch-child-conversation-client-tool.d.ts +3 -0
  271. package/dist/api/launch-child-conversation-client-tool.js +93 -0
  272. package/dist/api/launch-child-conversation-client-tool.js.map +1 -0
  273. package/dist/api/mcp-service/mcp-redacted-credentials.cjs +1 -1
  274. package/dist/api/mcp-service/mcp-redacted-credentials.cjs.map +1 -1
  275. package/dist/api/mcp-service/mcp-redacted-credentials.d.ts +3 -2
  276. package/dist/api/mcp-service/mcp-redacted-credentials.js +32 -27
  277. package/dist/api/mcp-service/mcp-redacted-credentials.js.map +1 -1
  278. package/dist/api/mcp-service/mcp-service.api.cjs +1 -1
  279. package/dist/api/mcp-service/mcp-service.api.cjs.map +1 -1
  280. package/dist/api/mcp-service/mcp-service.api.js +19 -19
  281. package/dist/api/mcp-service/mcp-service.api.js.map +1 -1
  282. package/dist/api/open-hands.types.d.ts +1 -1
  283. package/dist/api/settings-service/settings-service.api.cjs +1 -1
  284. package/dist/api/settings-service/settings-service.api.cjs.map +1 -1
  285. package/dist/api/settings-service/settings-service.api.d.ts +10 -0
  286. package/dist/api/settings-service/settings-service.api.js +90 -100
  287. package/dist/api/settings-service/settings-service.api.js.map +1 -1
  288. package/dist/api/skills-service.cjs +1 -1
  289. package/dist/api/skills-service.cjs.map +1 -1
  290. package/dist/api/skills-service.js +1 -0
  291. package/dist/api/skills-service.js.map +1 -1
  292. package/dist/api/workspace-upload-path.cjs +1 -1
  293. package/dist/api/workspace-upload-path.js +8 -8
  294. package/dist/assets/chevron-left.d.ts +1 -1
  295. package/dist/assets/chevron-right.d.ts +1 -1
  296. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.cjs +1 -1
  297. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.cjs.map +1 -1
  298. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.js +24 -18
  299. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.js.map +1 -1
  300. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs +1 -1
  301. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map +1 -1
  302. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js +5 -0
  303. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
  304. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs +2 -2
  305. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs.map +1 -1
  306. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js +11 -7
  307. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js.map +1 -1
  308. package/dist/components/conversation-events/chat/event-message-components/collapsible-thinking.d.ts +2 -1
  309. package/dist/components/conversation-events/chat/event-message-components/critic-result-display.d.ts +2 -1
  310. package/dist/components/conversation-events/chat/event-message-components/error-event-message.d.ts +2 -1
  311. package/dist/components/conversation-events/chat/event-message-components/event-group.d.ts +1 -1
  312. package/dist/components/conversation-events/chat/event-message-components/finish-event-message.d.ts +1 -1
  313. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.d.ts +1 -1
  314. package/dist/components/conversation-events/chat/event-message-components/observation-pair-event-message.d.ts +2 -1
  315. package/dist/components/conversation-events/chat/event-message-components/skill-item-expanded.d.ts +1 -1
  316. package/dist/components/conversation-events/chat/event-message-components/skill-ready-content-list.d.ts +2 -1
  317. package/dist/components/conversation-events/chat/event-message-components/thought-event-message.d.ts +1 -1
  318. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.d.ts +2 -1
  319. package/dist/components/conversation-events/chat/event-message.d.ts +2 -1
  320. package/dist/components/conversation-events/chat/task-tracking/task-item.d.ts +1 -1
  321. package/dist/components/conversation-events/chat/task-tracking/task-list-section.d.ts +1 -1
  322. package/dist/components/features/alerts/alert-banner.d.ts +1 -1
  323. package/dist/components/features/analytics/telemetry-consent-banner.d.ts +2 -1
  324. package/dist/components/features/automations/add-automation-modal.d.ts +1 -1
  325. package/dist/components/features/automations/automation-card-skeleton.d.ts +1 -1
  326. package/dist/components/features/automations/automation-card.d.ts +9 -1
  327. package/dist/components/features/automations/automation-group.d.ts +9 -1
  328. package/dist/components/features/automations/automation-health-badge.d.ts +8 -0
  329. package/dist/components/features/automations/automation-list-row.d.ts +3 -1
  330. package/dist/components/features/automations/automation-run-insights.d.ts +17 -0
  331. package/dist/components/features/automations/automation-view-toggle.d.ts +1 -1
  332. package/dist/components/features/automations/backend-not-configured.d.ts +1 -1
  333. package/dist/components/features/automations/create-instructions.d.ts +2 -2
  334. package/dist/components/features/automations/dashboard/automations-dashboard-controls.d.ts +18 -0
  335. package/dist/components/features/automations/dashboard/automations-filtered-empty-state.d.ts +9 -0
  336. package/dist/components/features/automations/dashboard/use-automation-sub-page-nav.d.ts +12 -0
  337. package/dist/components/features/automations/delete-confirmation-modal.d.ts +1 -1
  338. package/dist/components/features/automations/detail/active-status-badge.d.ts +1 -1
  339. package/dist/components/features/automations/detail/activity-log-item.d.ts +1 -1
  340. package/dist/components/features/automations/detail/activity-log-section.d.ts +3 -1
  341. package/dist/components/features/automations/detail/activity-section.d.ts +1 -1
  342. package/dist/components/features/automations/detail/back-link.d.ts +1 -1
  343. package/dist/components/features/automations/detail/branch-badge.d.ts +1 -1
  344. package/dist/components/features/automations/detail/config-field.d.ts +1 -1
  345. package/dist/components/features/automations/detail/configuration-section.d.ts +1 -1
  346. package/dist/components/features/automations/detail/debug-automation-button.d.ts +1 -1
  347. package/dist/components/features/automations/detail/detail-header.d.ts +1 -1
  348. package/dist/components/features/automations/detail/detail-skeleton.d.ts +1 -1
  349. package/dist/components/features/automations/detail/edit-automation-modal.d.ts +1 -1
  350. package/dist/components/features/automations/detail/not-found-state.d.ts +1 -1
  351. package/dist/components/features/automations/detail/plugin-chip.d.ts +1 -1
  352. package/dist/components/features/automations/detail/plugins-section.d.ts +1 -1
  353. package/dist/components/features/automations/detail/prompt-section.d.ts +2 -1
  354. package/dist/components/features/automations/detail/run-logs-modal.d.ts +1 -1
  355. package/dist/components/features/automations/detail/run-status-badge.d.ts +10 -1
  356. package/dist/components/features/automations/detail/section-card.d.ts +1 -1
  357. package/dist/components/features/automations/empty-state.d.ts +1 -1
  358. package/dist/components/features/automations/error-state.d.ts +1 -1
  359. package/dist/components/features/automations/import-automation-modal.d.ts +1 -1
  360. package/dist/components/features/automations/kebab-menu-item-content.d.ts +1 -1
  361. package/dist/components/features/automations/kebab-menu.d.ts +1 -1
  362. package/dist/components/features/automations/metadata-chip.d.ts +1 -1
  363. package/dist/components/features/automations/recommended-automations-launcher.d.ts +1 -1
  364. package/dist/components/features/automations/recommended-automations-section.d.ts +1 -1
  365. package/dist/components/features/automations/responder-deployment-modal.d.ts +1 -1
  366. package/dist/components/features/automations/search-input.d.ts +1 -1
  367. package/dist/components/features/automations/status-badge.d.ts +1 -1
  368. package/dist/components/features/automations/turn-off-confirmation-modal.d.ts +8 -0
  369. package/dist/components/features/automations/view-menu-item-content.d.ts +1 -1
  370. package/dist/components/features/backends/add-backend-modal.d.ts +1 -1
  371. package/dist/components/features/backends/api-key-entry-screen.d.ts +2 -1
  372. package/dist/components/features/backends/backend-form-modal.d.ts +3 -3
  373. package/dist/components/features/backends/backend-row.d.ts +1 -1
  374. package/dist/components/features/backends/backend-selector.d.ts +2 -1
  375. package/dist/components/features/backends/backend-status-dot.d.ts +2 -1
  376. package/dist/components/features/backends/backend-version.d.ts +1 -1
  377. package/dist/components/features/backends/device-flow-auth.d.ts +1 -1
  378. package/dist/components/features/backends/manage-backends-modal.d.ts +2 -1
  379. package/dist/components/features/browser/browser-chrome-bar.d.ts +1 -1
  380. package/dist/components/features/browser/browser-snapshot.d.ts +1 -1
  381. package/dist/components/features/browser/browser.d.ts +1 -1
  382. package/dist/components/features/browser/empty-browser-message.d.ts +1 -1
  383. package/dist/components/features/chat/btw-messages.d.ts +1 -1
  384. package/dist/components/features/chat/change-agent-button.d.ts +2 -1
  385. package/dist/components/features/chat/change-agent-context-menu.d.ts +1 -1
  386. package/dist/components/features/chat/chat-action-tooltip.d.ts +1 -1
  387. package/dist/components/features/chat/chat-add-file-button.d.ts +2 -1
  388. package/dist/components/features/chat/chat-interface.d.ts +2 -1
  389. package/dist/components/features/chat/chat-message.d.ts +1 -1
  390. package/dist/components/features/chat/chat-messages-skeleton.d.ts +2 -1
  391. package/dist/components/features/chat/chat-play-button.d.ts +1 -1
  392. package/dist/components/features/chat/chat-send-button.d.ts +1 -1
  393. package/dist/components/features/chat/chat-status-indicator.d.ts +1 -1
  394. package/dist/components/features/chat/chat-stop-button.d.ts +1 -1
  395. package/dist/components/features/chat/chat-suggestions.d.ts +1 -1
  396. package/dist/components/features/chat/components/chat-input-actions.d.ts +2 -1
  397. package/dist/components/features/chat/components/chat-input-container.d.ts +1 -1
  398. package/dist/components/features/chat/components/chat-input-field.d.ts +1 -1
  399. package/dist/components/features/chat/components/chat-input-grip.d.ts +1 -1
  400. package/dist/components/features/chat/components/chat-input-llm-profile-picker.d.ts +3 -2
  401. package/dist/components/features/chat/components/chat-input-model.d.ts +3 -2
  402. package/dist/components/features/chat/components/chat-input-profile-picker.d.ts +1 -1
  403. package/dist/components/features/chat/components/chat-input-row.d.ts +1 -1
  404. package/dist/components/features/chat/components/hidden-file-input.d.ts +1 -1
  405. package/dist/components/features/chat/components/slash-command-menu.d.ts +2 -1
  406. package/dist/components/features/chat/confirmation-mode-enabled.d.ts +1 -1
  407. package/dist/components/features/chat/custom-chat-input.d.ts +1 -1
  408. package/dist/components/features/chat/drag-over.d.ts +1 -1
  409. package/dist/components/features/chat/error-message-banner.d.ts +2 -1
  410. package/dist/components/features/chat/error-message.d.ts +2 -1
  411. package/dist/components/features/chat/generic-event-message.d.ts +1 -1
  412. package/dist/components/features/chat/git-control-bar-branch-button.d.ts +1 -1
  413. package/dist/components/features/chat/git-control-bar-pr-button.d.ts +1 -1
  414. package/dist/components/features/chat/git-control-bar-pull-button.d.ts +1 -1
  415. package/dist/components/features/chat/git-control-bar-push-button.d.ts +1 -1
  416. package/dist/components/features/chat/git-control-bar-repo-button.d.ts +1 -1
  417. package/dist/components/features/chat/git-control-bar-tooltip-wrapper.d.ts +1 -1
  418. package/dist/components/features/chat/git-control-bar.d.ts +1 -1
  419. package/dist/components/features/chat/git-external-link-icon.d.ts +1 -1
  420. package/dist/components/features/chat/goal-status-banner.d.ts +1 -1
  421. package/dist/components/features/chat/goal-status-content.d.ts +1 -1
  422. package/dist/components/features/chat/got-it-button.d.ts +1 -1
  423. package/dist/components/features/chat/interactive-chat-box.d.ts +1 -1
  424. package/dist/components/features/chat/model-messages.d.ts +2 -1
  425. package/dist/components/features/chat/mono-component.d.ts +1 -1
  426. package/dist/components/features/chat/open-repository-modal.d.ts +2 -1
  427. package/dist/components/features/chat/pasted-image-upload-as-file-button.d.ts +1 -1
  428. package/dist/components/features/chat/path-component.d.ts +1 -1
  429. package/dist/components/features/chat/pending-stop-icon.d.ts +1 -1
  430. package/dist/components/features/chat/pending-user-messages.d.ts +2 -1
  431. package/dist/components/features/chat/plan-preview.d.ts +1 -1
  432. package/dist/components/features/chat/remove-file-button.d.ts +1 -1
  433. package/dist/components/features/chat/skill-install-restart-banner.d.ts +1 -1
  434. package/dist/components/features/chat/success-indicator.d.ts +1 -1
  435. package/dist/components/features/chat/task-tracking/status-badge.d.ts +1 -1
  436. package/dist/components/features/chat/task-tracking/status-icon.d.ts +1 -1
  437. package/dist/components/features/chat/task-tracking/task-item.d.ts +1 -1
  438. package/dist/components/features/chat/task-tracking/task-list-section.d.ts +1 -1
  439. package/dist/components/features/chat/tool-visualizers/primitives/code-block.d.ts +2 -1
  440. package/dist/components/features/chat/tool-visualizers/primitives/diff-view.d.ts +2 -1
  441. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.d.ts +2 -1
  442. package/dist/components/features/chat/tool-visualizers/primitives/key-value-grid.d.ts +1 -1
  443. package/dist/components/features/chat/tool-visualizers/primitives/output-pane.d.ts +2 -1
  444. package/dist/components/features/chat/typing-indicator.d.ts +1 -1
  445. package/dist/components/features/chat/uploaded-file.d.ts +1 -1
  446. package/dist/components/features/chat/uploaded-files.d.ts +1 -1
  447. package/dist/components/features/chat/uploaded-image.d.ts +2 -1
  448. package/dist/components/features/chat/user-message-body.d.ts +2 -2
  449. package/dist/components/features/chat/waiting-for-runtime-message.d.ts +1 -1
  450. package/dist/components/features/chat/workspace-mode-icon.d.ts +1 -1
  451. package/dist/components/features/chat/workspace-mode-selector.d.ts +1 -1
  452. package/dist/components/features/command-menu/command-menu-trigger.d.ts +2 -1
  453. package/dist/components/features/context-menu/archived-disabled-tooltip.d.ts +1 -1
  454. package/dist/components/features/context-menu/context-menu-icon-text-with-description.d.ts +1 -1
  455. package/dist/components/features/context-menu/context-menu-icon-text.d.ts +1 -1
  456. package/dist/components/features/context-menu/context-menu-list-item.cjs +1 -1
  457. package/dist/components/features/context-menu/context-menu-list-item.cjs.map +1 -1
  458. package/dist/components/features/context-menu/context-menu-list-item.d.ts +2 -1
  459. package/dist/components/features/context-menu/context-menu-list-item.js +2 -1
  460. package/dist/components/features/context-menu/context-menu-list-item.js.map +1 -1
  461. package/dist/components/features/controls/agent-loading.d.ts +1 -1
  462. package/dist/components/features/controls/agent-status.d.ts +1 -1
  463. package/dist/components/features/controls/git-tools-submenu.d.ts +1 -1
  464. package/dist/components/features/controls/macros-submenu.d.ts +1 -1
  465. package/dist/components/features/controls/server-status-context-menu-icon-text.d.ts +1 -1
  466. package/dist/components/features/controls/server-status-context-menu.d.ts +1 -1
  467. package/dist/components/features/controls/server-status.d.ts +1 -1
  468. package/dist/components/features/controls/tools-context-menu-icon-text.d.ts +1 -1
  469. package/dist/components/features/controls/tools-context-menu.d.ts +1 -1
  470. package/dist/components/features/controls/tools.d.ts +2 -1
  471. package/dist/components/features/conversation/conversation-loading.d.ts +1 -1
  472. package/dist/components/features/conversation/conversation-main/chat-interface-wrapper.d.ts +1 -1
  473. package/dist/components/features/conversation/conversation-main/conversation-main.d.ts +1 -1
  474. package/dist/components/features/conversation/conversation-main/conversation-mobile-panel-page.d.ts +2 -1
  475. package/dist/components/features/conversation/conversation-name-context-menu-icon-text.d.ts +1 -1
  476. package/dist/components/features/conversation/conversation-name-context-menu.d.ts +1 -1
  477. package/dist/components/features/conversation/conversation-name-with-status.d.ts +2 -1
  478. package/dist/components/features/conversation/conversation-name.d.ts +2 -1
  479. package/dist/components/features/conversation/conversation-tab-empty-state.d.ts +1 -1
  480. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content-crossfade.d.ts +1 -1
  481. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/conversation-tab-content.d.ts +1 -1
  482. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/suspense-pending-fallback.d.ts +1 -1
  483. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/tab-container.d.ts +1 -1
  484. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/tab-content-area.d.ts +1 -1
  485. package/dist/components/features/conversation/conversation-tabs/conversation-tab-content/tab-wrapper.d.ts +1 -1
  486. package/dist/components/features/conversation/conversation-tabs/conversation-tab-nav.d.ts +1 -1
  487. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.d.ts +1 -1
  488. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.d.ts +1 -1
  489. package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.d.ts +1 -1
  490. package/dist/components/features/conversation/metrics-modal/context-window-section.d.ts +1 -1
  491. package/dist/components/features/conversation/metrics-modal/cost-section.d.ts +1 -1
  492. package/dist/components/features/conversation/metrics-modal/empty-state.d.ts +1 -1
  493. package/dist/components/features/conversation/metrics-modal/metric-row.d.ts +1 -1
  494. package/dist/components/features/conversation/metrics-modal/metrics-modal-header.d.ts +1 -1
  495. package/dist/components/features/conversation/metrics-modal/metrics-modal.d.ts +1 -1
  496. package/dist/components/features/conversation/metrics-modal/usage-section.d.ts +1 -1
  497. package/dist/components/features/conversation/right-panel-toggle.d.ts +1 -1
  498. package/dist/components/features/conversation/transcript-export-modal.d.ts +2 -1
  499. package/dist/components/features/conversation-panel/budget-display.d.ts +2 -1
  500. package/dist/components/features/conversation-panel/budget-progress-bar.d.ts +1 -1
  501. package/dist/components/features/conversation-panel/budget-usage-text.d.ts +2 -1
  502. package/dist/components/features/conversation-panel/cloud-new-conversation-menu.d.ts +1 -1
  503. package/dist/components/features/conversation-panel/compact-conversation-row.cjs +1 -1
  504. package/dist/components/features/conversation-panel/compact-conversation-row.cjs.map +1 -1
  505. package/dist/components/features/conversation-panel/compact-conversation-row.d.ts +2 -1
  506. package/dist/components/features/conversation-panel/compact-conversation-row.js +38 -37
  507. package/dist/components/features/conversation-panel/compact-conversation-row.js.map +1 -1
  508. package/dist/components/features/conversation-panel/confirm-delete-modal.d.ts +1 -1
  509. package/dist/components/features/conversation-panel/confirm-stop-modal.d.ts +1 -1
  510. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.d.ts +1 -1
  511. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.d.ts +1 -1
  512. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs +1 -2
  513. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs.map +1 -1
  514. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.d.ts +3 -9
  515. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js +48 -51
  516. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js.map +1 -1
  517. package/dist/components/features/conversation-panel/conversation-card/conversation-card-header.d.ts +1 -1
  518. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.cjs +2 -0
  519. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.cjs.map +1 -0
  520. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.d.ts +12 -0
  521. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.js +6 -0
  522. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.js.map +1 -0
  523. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs +1 -1
  524. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs.map +1 -1
  525. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.d.ts +16 -1
  526. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js +95 -78
  527. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js.map +1 -1
  528. package/dist/components/features/conversation-panel/conversation-card/conversation-card-skeleton.d.ts +1 -1
  529. package/dist/components/features/conversation-panel/conversation-card/conversation-card-title.d.ts +1 -1
  530. package/dist/components/features/conversation-panel/conversation-card/conversation-card.d.ts +2 -1
  531. package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.cjs +1 -1
  532. package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.cjs.map +1 -1
  533. package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.d.ts +1 -1
  534. package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.js +40 -38
  535. package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.js.map +1 -1
  536. package/dist/components/features/conversation-panel/conversation-card/conversation-status-badges.d.ts +1 -1
  537. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs +2 -0
  538. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs.map +1 -0
  539. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.d.ts +14 -0
  540. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js +167 -0
  541. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js.map +1 -0
  542. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs +2 -0
  543. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs.map +1 -0
  544. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.d.ts +63 -0
  545. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js +66 -0
  546. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js.map +1 -0
  547. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.cjs +2 -0
  548. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.cjs.map +1 -0
  549. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.d.ts +15 -0
  550. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.js +117 -0
  551. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.js.map +1 -0
  552. package/dist/components/features/conversation-panel/conversation-card/no-repository.cjs +1 -1
  553. package/dist/components/features/conversation-panel/conversation-card/no-repository.cjs.map +1 -1
  554. package/dist/components/features/conversation-panel/conversation-card/no-repository.d.ts +1 -1
  555. package/dist/components/features/conversation-panel/conversation-card/no-repository.js +30 -19
  556. package/dist/components/features/conversation-panel/conversation-card/no-repository.js.map +1 -1
  557. package/dist/components/features/conversation-panel/conversation-group-folder-list.d.ts +1 -1
  558. package/dist/components/features/conversation-panel/conversation-group-folder-row.d.ts +1 -1
  559. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +1 -1
  560. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +1 -1
  561. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.d.ts +7 -2
  562. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +146 -104
  563. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +1 -1
  564. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs +1 -1
  565. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs.map +1 -1
  566. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.d.ts +20 -0
  567. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js +53 -27
  568. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js.map +1 -1
  569. package/dist/components/features/conversation-panel/conversation-panel-new-thread-picker.d.ts +1 -1
  570. package/dist/components/features/conversation-panel/conversation-panel-pinned-section.d.ts +1 -1
  571. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  572. package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
  573. package/dist/components/features/conversation-panel/conversation-panel.d.ts +2 -1
  574. package/dist/components/features/conversation-panel/conversation-panel.js +169 -155
  575. package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
  576. package/dist/components/features/conversation-panel/conversation-status-dot.d.ts +1 -1
  577. package/dist/components/features/conversation-panel/exit-conversation-modal.d.ts +1 -1
  578. package/dist/components/features/conversation-panel/hook-event-item.d.ts +1 -1
  579. package/dist/components/features/conversation-panel/hook-matcher-content.d.ts +1 -1
  580. package/dist/components/features/conversation-panel/hooks-empty-state.d.ts +1 -1
  581. package/dist/components/features/conversation-panel/hooks-loading-state.d.ts +1 -1
  582. package/dist/components/features/conversation-panel/hooks-modal-header.d.ts +1 -1
  583. package/dist/components/features/conversation-panel/hooks-modal.d.ts +1 -1
  584. package/dist/components/features/conversation-panel/local-new-conversation-menu.d.ts +1 -1
  585. package/dist/components/features/conversation-panel/menu-heading.d.ts +1 -1
  586. package/dist/components/features/conversation-panel/menu-row.d.ts +1 -1
  587. package/dist/components/features/conversation-panel/menu-separator.d.ts +1 -1
  588. package/dist/components/features/conversation-panel/new-conversation-button.d.ts +2 -1
  589. package/dist/components/features/conversation-panel/plugins-modal.d.ts +1 -1
  590. package/dist/components/features/conversation-panel/runtime-waiting-state.d.ts +1 -1
  591. package/dist/components/features/conversation-panel/skill-content.d.ts +1 -1
  592. package/dist/components/features/conversation-panel/skill-item.d.ts +1 -1
  593. package/dist/components/features/conversation-panel/skill-triggers.d.ts +1 -1
  594. package/dist/components/features/conversation-panel/skills-empty-state.d.ts +1 -1
  595. package/dist/components/features/conversation-panel/skills-loading-state.d.ts +1 -1
  596. package/dist/components/features/conversation-panel/skills-modal-header.d.ts +1 -1
  597. package/dist/components/features/conversation-panel/skills-modal-section.d.ts +1 -1
  598. package/dist/components/features/conversation-panel/skills-modal.d.ts +1 -1
  599. package/dist/components/features/conversation-panel/start-task-card/start-task-card-footer.d.ts +1 -1
  600. package/dist/components/features/conversation-panel/start-task-card/start-task-card-header.d.ts +1 -1
  601. package/dist/components/features/conversation-panel/start-task-card/start-task-card.d.ts +1 -1
  602. package/dist/components/features/conversation-panel/start-task-card/start-task-status-badge.d.ts +1 -1
  603. package/dist/components/features/conversation-panel/start-task-card/start-task-status-indicator.d.ts +1 -1
  604. package/dist/components/features/conversation-panel/system-message-modal/empty-tools-state.d.ts +1 -1
  605. package/dist/components/features/conversation-panel/system-message-modal/system-message-content.d.ts +1 -1
  606. package/dist/components/features/conversation-panel/system-message-modal/system-message-header.d.ts +1 -1
  607. package/dist/components/features/conversation-panel/system-message-modal/tab-button.d.ts +1 -1
  608. package/dist/components/features/conversation-panel/system-message-modal/tab-content.d.ts +1 -1
  609. package/dist/components/features/conversation-panel/system-message-modal/tab-navigation.d.ts +1 -1
  610. package/dist/components/features/conversation-panel/system-message-modal/toggle-button.d.ts +1 -1
  611. package/dist/components/features/conversation-panel/system-message-modal/tool-item.d.ts +1 -1
  612. package/dist/components/features/conversation-panel/system-message-modal/tool-parameters.d.ts +1 -1
  613. package/dist/components/features/conversation-panel/system-message-modal/tools-list.d.ts +1 -1
  614. package/dist/components/features/conversation-panel/system-message-modal.d.ts +1 -1
  615. package/dist/components/features/diff-viewer/commit-list.d.ts +2 -1
  616. package/dist/components/features/diff-viewer/commit-row.d.ts +2 -1
  617. package/dist/components/features/diff-viewer/diff-drawer-icon.d.ts +1 -1
  618. package/dist/components/features/diff-viewer/editor-container.d.ts +1 -1
  619. package/dist/components/features/diff-viewer/empty-changes-message.d.ts +1 -1
  620. package/dist/components/features/diff-viewer/file-diff-viewer.d.ts +2 -1
  621. package/dist/components/features/diff-viewer/loading-spinner.d.ts +1 -1
  622. package/dist/components/features/files/file-item.d.ts +1 -1
  623. package/dist/components/features/files/file-list.d.ts +2 -1
  624. package/dist/components/features/files-tab/file-content-viewer.d.ts +1 -1
  625. package/dist/components/features/files-tab/file-quick-row.d.ts +1 -1
  626. package/dist/components/features/files-tab/file-tree-view.d.ts +1 -1
  627. package/dist/components/features/files-tab/highlighted-source-view.d.ts +1 -1
  628. package/dist/components/features/files-tab/no-file-selected-message.d.ts +1 -1
  629. package/dist/components/features/files-tab/segmented-toggle.d.ts +1 -1
  630. package/dist/components/features/files-tab/tree-node.d.ts +1 -1
  631. package/dist/components/features/home/featured-automations/automation-health-indicator.d.ts +11 -0
  632. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.d.ts +18 -0
  633. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.d.ts +14 -0
  634. package/dist/components/features/home/featured-automations/automation-run-health.d.ts +25 -0
  635. package/dist/components/features/home/featured-automations/build-home-automation-menu-items.d.ts +39 -0
  636. package/dist/components/features/home/featured-automations/build-pinned-automation-menu-items.d.ts +22 -0
  637. package/dist/components/features/home/featured-automations/home-automation-activity.d.ts +23 -0
  638. package/dist/components/features/home/featured-automations/home-automation-menu.d.ts +13 -0
  639. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.d.ts +12 -0
  640. package/dist/components/features/home/featured-automations/pinned-automation-card.d.ts +21 -0
  641. package/dist/components/features/home/featured-automations/pinned-automations-dashboard.d.ts +6 -0
  642. package/dist/components/features/home/featured-automations/running-automations-list.d.ts +6 -0
  643. package/dist/components/features/home/git-branch-dropdown/branch-dropdown-menu.d.ts +1 -1
  644. package/dist/components/features/home/git-branch-dropdown/git-branch-dropdown.d.ts +2 -1
  645. package/dist/components/features/home/git-provider-dropdown/git-provider-dropdown.d.ts +2 -1
  646. package/dist/components/features/home/git-repo-dropdown/git-repo-dropdown.d.ts +2 -1
  647. package/dist/components/features/home/home-chat-launcher.d.ts +1 -1
  648. package/dist/components/features/home/home-git-control-bar-preview.d.ts +1 -1
  649. package/dist/components/features/home/home-header/guide-message.d.ts +1 -1
  650. package/dist/components/features/home/home-header/home-header-title.d.ts +1 -1
  651. package/dist/components/features/home/home-header/home-header.d.ts +1 -1
  652. package/dist/components/features/home/llm-not-configured-banner.d.ts +1 -1
  653. package/dist/components/features/home/new-conversation/create-conversation-button.d.ts +1 -1
  654. package/dist/components/features/home/new-conversation/new-conversation.d.ts +1 -1
  655. package/dist/components/features/home/new-conversation.d.ts +1 -1
  656. package/dist/components/features/home/open-launcher-button.d.ts +1 -1
  657. package/dist/components/features/home/open-repository-dialog.d.ts +1 -1
  658. package/dist/components/features/home/open-workspace-dialog.d.ts +1 -1
  659. package/dist/components/features/home/repo-selection-form.d.ts +2 -1
  660. package/dist/components/features/home/shared/clear-button.d.ts +2 -1
  661. package/dist/components/features/home/shared/dropdown-item.d.ts +1 -1
  662. package/dist/components/features/home/shared/empty-state.d.ts +2 -1
  663. package/dist/components/features/home/shared/error-message.d.ts +2 -1
  664. package/dist/components/features/home/shared/generic-dropdown-menu.d.ts +1 -1
  665. package/dist/components/features/home/shared/loading-spinner.d.ts +2 -1
  666. package/dist/components/features/home/shared/toggle-button.d.ts +1 -1
  667. package/dist/components/features/home/tasks/task-card.d.ts +1 -1
  668. package/dist/components/features/home/tasks/task-group.d.ts +1 -1
  669. package/dist/components/features/home/tasks/task-issue-number.d.ts +1 -1
  670. package/dist/components/features/home/tasks/task-item-title.d.ts +1 -1
  671. package/dist/components/features/home/tasks/task-suggestions-skeleton.d.ts +1 -1
  672. package/dist/components/features/home/tasks/task-suggestions.d.ts +1 -1
  673. package/dist/components/features/home/workspace-dropdown/folder-browser-modal.d.ts +2 -1
  674. package/dist/components/features/home/workspace-dropdown/manage-workspaces-modal.d.ts +2 -1
  675. package/dist/components/features/home/workspace-dropdown/workspace-dropdown.d.ts +2 -1
  676. package/dist/components/features/home/workspace-selection-form.d.ts +2 -1
  677. package/dist/components/features/images/image-carousel.d.ts +2 -1
  678. package/dist/components/features/images/image-preview.d.ts +1 -1
  679. package/dist/components/features/images/thumbnail.d.ts +1 -1
  680. package/dist/components/features/launch/plugin-launch-modal.d.ts +2 -1
  681. package/dist/components/features/launch/plugin-launch-parameter-input.d.ts +1 -1
  682. package/dist/components/features/launch/plugin-launch-plugin-section.d.ts +1 -1
  683. package/dist/components/features/manifest/manifest-form-field.d.ts +1 -1
  684. package/dist/components/features/manifest/manifest-icons.d.ts +13 -0
  685. package/dist/components/features/manifest/manifest-overview-tiles.d.ts +19 -0
  686. package/dist/components/features/manifest/manifest-prerequisites-step.d.ts +1 -1
  687. package/dist/components/features/manifest/manifest-review-step.d.ts +1 -1
  688. package/dist/components/features/manifest/manifest-setup-dialog.d.ts +1 -1
  689. package/dist/components/features/manifest/manifest-subpage-layout.d.ts +23 -0
  690. package/dist/components/features/markdown/anchor.d.ts +1 -1
  691. package/dist/components/features/markdown/blockquote.d.ts +1 -1
  692. package/dist/components/features/markdown/code.d.ts +1 -1
  693. package/dist/components/features/markdown/headings.d.ts +6 -6
  694. package/dist/components/features/markdown/horizontal-rule.d.ts +1 -1
  695. package/dist/components/features/markdown/list.d.ts +3 -3
  696. package/dist/components/features/markdown/markdown-renderer.d.ts +1 -1
  697. package/dist/components/features/markdown/markdown-table-scroll.d.ts +1 -1
  698. package/dist/components/features/markdown/paragraph.d.ts +1 -1
  699. package/dist/components/features/markdown/plan-components.d.ts +36 -36
  700. package/dist/components/features/markdown/table.d.ts +3 -3
  701. package/dist/components/features/mcp-logo-badge.d.ts +1 -1
  702. package/dist/components/features/mcp-page/custom-server-editor.cjs +1 -1
  703. package/dist/components/features/mcp-page/custom-server-editor.cjs.map +1 -1
  704. package/dist/components/features/mcp-page/custom-server-editor.d.ts +2 -1
  705. package/dist/components/features/mcp-page/custom-server-editor.js +5 -0
  706. package/dist/components/features/mcp-page/custom-server-editor.js.map +1 -1
  707. package/dist/components/features/mcp-page/install-server-modal.cjs +1 -1
  708. package/dist/components/features/mcp-page/install-server-modal.cjs.map +1 -1
  709. package/dist/components/features/mcp-page/install-server-modal.d.ts +2 -1
  710. package/dist/components/features/mcp-page/install-server-modal.js +117 -118
  711. package/dist/components/features/mcp-page/install-server-modal.js.map +1 -1
  712. package/dist/components/features/mcp-page/installed-server-card.d.ts +2 -1
  713. package/dist/components/features/mcp-page/installed-servers-section.d.ts +1 -1
  714. package/dist/components/features/mcp-page/marketplace-card.d.ts +1 -1
  715. package/dist/components/features/mcp-page/marketplace-section.d.ts +1 -1
  716. package/dist/components/features/mcp-page/mcp-logo-stack-badge.d.ts +1 -1
  717. package/dist/components/features/mcp-page/mcp-section-filter-dropdown.d.ts +1 -1
  718. package/dist/components/features/mcp-page/mcp-server-health.d.ts +2 -1
  719. package/dist/components/features/mcp-page/mcp-toolbar.d.ts +1 -1
  720. package/dist/components/features/mcp-page/save-as-secret-toggle.d.ts +1 -1
  721. package/dist/components/features/onboarding/onboarding-host.d.ts +1 -1
  722. package/dist/components/features/onboarding/onboarding-modal.d.ts +2 -1
  723. package/dist/components/features/onboarding/onboarding-progress-bar.d.ts +1 -1
  724. package/dist/components/features/onboarding/steps/check-backend-step.d.ts +2 -1
  725. package/dist/components/features/onboarding/steps/choose-agent-step.d.ts +3 -2
  726. package/dist/components/features/onboarding/steps/say-hello-step.d.ts +2 -1
  727. package/dist/components/features/onboarding/steps/setup-acp-secrets-step.d.ts +2 -1
  728. package/dist/components/features/onboarding/steps/setup-llm-step.d.ts +2 -1
  729. package/dist/components/features/plugins/add-plugin-modal.d.ts +2 -1
  730. package/dist/components/features/plugins/plugin-card.d.ts +2 -1
  731. package/dist/components/features/plugins/plugin-detail-modal.d.ts +1 -1
  732. package/dist/components/features/plugins/plugin-files-section.d.ts +2 -1
  733. package/dist/components/features/plugins/plugin-picker-card.d.ts +1 -1
  734. package/dist/components/features/plugins/plugin-picker-modal.d.ts +1 -1
  735. package/dist/components/features/plugins/plugin-picker-trigger.d.ts +1 -1
  736. package/dist/components/features/plugins/plugin-picker.d.ts +1 -1
  737. package/dist/components/features/plugins/plugins-toolbar.d.ts +1 -1
  738. package/dist/components/features/settings/acp-auth-status-banner.d.ts +1 -1
  739. package/dist/components/features/settings/acp-conflict-warnings.d.ts +2 -1
  740. package/dist/components/features/settings/acp-credentials-section.d.ts +1 -1
  741. package/dist/components/features/settings/acp-secret-field.d.ts +2 -1
  742. package/dist/components/features/settings/agent-canvas-update-card.cjs +1 -1
  743. package/dist/components/features/settings/agent-canvas-update-card.cjs.map +1 -1
  744. package/dist/components/features/settings/agent-canvas-update-card.d.ts +10 -5
  745. package/dist/components/features/settings/agent-canvas-update-card.js +223 -149
  746. package/dist/components/features/settings/agent-canvas-update-card.js.map +1 -1
  747. package/dist/components/features/settings/agent-canvas-version-modal.cjs +2 -0
  748. package/dist/components/features/settings/agent-canvas-version-modal.cjs.map +1 -0
  749. package/dist/components/features/settings/agent-canvas-version-modal.d.ts +11 -0
  750. package/dist/components/features/settings/agent-canvas-version-modal.js +166 -0
  751. package/dist/components/features/settings/agent-canvas-version-modal.js.map +1 -0
  752. package/dist/components/features/settings/agent-canvas-version-tile.cjs +2 -0
  753. package/dist/components/features/settings/agent-canvas-version-tile.cjs.map +1 -0
  754. package/dist/components/features/settings/agent-canvas-version-tile.d.ts +13 -0
  755. package/dist/components/features/settings/agent-canvas-version-tile.js +60 -0
  756. package/dist/components/features/settings/agent-canvas-version-tile.js.map +1 -0
  757. package/dist/components/features/settings/agent-profiles/agent-profile-actions-menu.d.ts +1 -1
  758. package/dist/components/features/settings/agent-profiles/agent-profile-row.d.ts +1 -1
  759. package/dist/components/features/settings/agent-profiles/agent-profiles-body.d.ts +1 -1
  760. package/dist/components/features/settings/agent-profiles/agent-profiles-local-view.d.ts +1 -1
  761. package/dist/components/features/settings/agent-profiles/agent-profiles-manager.d.ts +1 -1
  762. package/dist/components/features/settings/agent-profiles/delete-agent-profile-modal.d.ts +1 -1
  763. package/dist/components/features/settings/agent-server-onboarding.d.ts +2 -1
  764. package/dist/components/features/settings/api-key-modal-base.d.ts +1 -1
  765. package/dist/components/features/settings/app-settings/app-settings-inputs-skeleton.d.ts +1 -1
  766. package/dist/components/features/settings/app-settings/language-input.d.ts +1 -1
  767. package/dist/components/features/settings/app-settings/theme-input.d.ts +2 -1
  768. package/dist/components/features/settings/backend-synced-settings-badge.d.ts +1 -1
  769. package/dist/components/features/settings/banner-message.d.ts +1 -1
  770. package/dist/components/features/settings/cloud-settings-link.d.ts +1 -1
  771. package/dist/components/features/settings/input-skeleton.d.ts +1 -1
  772. package/dist/components/features/settings/integrations-settings-link.d.ts +1 -1
  773. package/dist/components/features/settings/key-status-icon.d.ts +1 -1
  774. package/dist/components/features/settings/llm-profiles/delete-profile-modal.d.ts +1 -1
  775. package/dist/components/features/settings/llm-profiles/llm-profiles-manager.d.ts +1 -1
  776. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.d.ts +2 -1
  777. package/dist/components/features/settings/llm-profiles/profile-actions-menu-item.d.ts +1 -1
  778. package/dist/components/features/settings/llm-profiles/profile-actions-menu.d.ts +1 -1
  779. package/dist/components/features/settings/llm-profiles/profile-row.d.ts +1 -1
  780. package/dist/components/features/settings/llm-profiles/profiles-body.d.ts +1 -1
  781. package/dist/components/features/settings/llm-profiles/rename-profile-modal.d.ts +1 -1
  782. package/dist/components/features/settings/llm-settings/llm-settings-inputs-skeleton.d.ts +1 -1
  783. package/dist/components/features/settings/llm-settings/openai-subscription-auth-card.d.ts +2 -1
  784. package/dist/components/features/settings/mcp-settings/mcp-server-form.cjs +1 -1
  785. package/dist/components/features/settings/mcp-settings/mcp-server-form.cjs.map +1 -1
  786. package/dist/components/features/settings/mcp-settings/mcp-server-form.d.ts +2 -1
  787. package/dist/components/features/settings/mcp-settings/mcp-server-form.js +2 -1
  788. package/dist/components/features/settings/mcp-settings/mcp-server-form.js.map +1 -1
  789. package/dist/components/features/settings/mcp-settings/mcp-server-list-item.d.ts +1 -1
  790. package/dist/components/features/settings/mcp-settings/mcp-server-list.d.ts +1 -1
  791. package/dist/components/features/settings/mobile-header.d.ts +1 -1
  792. package/dist/components/features/settings/optional-tag.d.ts +1 -1
  793. package/dist/components/features/settings/sdk-settings/field-help.d.ts +1 -1
  794. package/dist/components/features/settings/sdk-settings/schema-field.d.ts +2 -1
  795. package/dist/components/features/settings/sdk-settings/sdk-section-page.d.ts +1 -1
  796. package/dist/components/features/settings/sdk-settings/view-toggle.d.ts +1 -1
  797. package/dist/components/features/settings/secrets-settings/secret-form.d.ts +2 -1
  798. package/dist/components/features/settings/secrets-settings/secret-list-item.d.ts +2 -2
  799. package/dist/components/features/settings/settings-desktop-sidebar.cjs +1 -1
  800. package/dist/components/features/settings/settings-desktop-sidebar.cjs.map +1 -1
  801. package/dist/components/features/settings/settings-desktop-sidebar.d.ts +1 -1
  802. package/dist/components/features/settings/settings-desktop-sidebar.js +1 -1
  803. package/dist/components/features/settings/settings-desktop-sidebar.js.map +1 -1
  804. package/dist/components/features/settings/settings-dropdown-input.d.ts +1 -1
  805. package/dist/components/features/settings/settings-layout.d.ts +1 -1
  806. package/dist/components/features/settings/settings-mobile-drawer.cjs +1 -1
  807. package/dist/components/features/settings/settings-mobile-drawer.cjs.map +1 -1
  808. package/dist/components/features/settings/settings-mobile-drawer.d.ts +1 -1
  809. package/dist/components/features/settings/settings-mobile-drawer.js +1 -1
  810. package/dist/components/features/settings/settings-mobile-drawer.js.map +1 -1
  811. package/dist/components/features/settings/settings-mobile-hub.d.ts +1 -1
  812. package/dist/components/features/settings/settings-nav-divider.d.ts +1 -1
  813. package/dist/components/features/settings/settings-nav-header.d.ts +1 -1
  814. package/dist/components/features/settings/settings-nav-link.d.ts +1 -1
  815. package/dist/components/features/settings/settings-navigation.d.ts +1 -1
  816. package/dist/components/features/settings/settings-switch.d.ts +1 -1
  817. package/dist/components/features/settings/subtext-skeleton.d.ts +1 -1
  818. package/dist/components/features/settings/switch-skeleton.d.ts +1 -1
  819. package/dist/components/features/settings/upgrade-banner.d.ts +1 -1
  820. package/dist/components/features/settings/upgrade-button.d.ts +1 -1
  821. package/dist/components/features/sidebar/avatar.d.ts +1 -1
  822. package/dist/components/features/sidebar/sidebar-collapsed-icon-slot.d.ts +1 -1
  823. package/dist/components/features/sidebar/sidebar-conversation-list.d.ts +1 -1
  824. package/dist/components/features/sidebar/sidebar-mobile-menu-bar.d.ts +1 -1
  825. package/dist/components/features/sidebar/sidebar-mobile-menu-toggle.d.ts +1 -1
  826. package/dist/components/features/sidebar/sidebar-mobile-nav-context.d.ts +1 -1
  827. package/dist/components/features/sidebar/sidebar-nav-link.d.ts +1 -1
  828. package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
  829. package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
  830. package/dist/components/features/sidebar/sidebar-rail-body.d.ts +1 -1
  831. package/dist/components/features/sidebar/sidebar-rail-body.js +109 -108
  832. package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
  833. package/dist/components/features/sidebar/sidebar.d.ts +2 -1
  834. package/dist/components/features/sidebar/user-avatar.d.ts +1 -1
  835. package/dist/components/features/skills/add-skill-modal.d.ts +2 -1
  836. package/dist/components/features/skills/extensions-mobile-hub.d.ts +1 -1
  837. package/dist/components/features/skills/extensions-navigation.cjs +1 -1
  838. package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
  839. package/dist/components/features/skills/extensions-navigation.d.ts +1 -1
  840. package/dist/components/features/skills/extensions-navigation.js +9 -9
  841. package/dist/components/features/skills/extensions-navigation.js.map +1 -1
  842. package/dist/components/features/skills/skill-card-pill-row.d.ts +1 -1
  843. package/dist/components/features/skills/skill-card.d.ts +2 -1
  844. package/dist/components/features/skills/skill-detail-modal.d.ts +2 -1
  845. package/dist/components/features/skills/skill-facet-rail.d.ts +8 -0
  846. package/dist/components/features/skills/skill-facet-row.d.ts +13 -0
  847. package/dist/components/features/skills/skill-filter.d.ts +34 -0
  848. package/dist/components/features/skills/skill-filters-modal.d.ts +10 -0
  849. package/dist/components/features/skills/skill-icon-badge.d.ts +1 -1
  850. package/dist/components/features/skills/skill-type-badge.d.ts +1 -1
  851. package/dist/components/features/skills/skills-toolbar.d.ts +3 -4
  852. package/dist/components/features/suggestions/suggestion-item.d.ts +1 -1
  853. package/dist/components/features/suggestions/suggestions.d.ts +1 -1
  854. package/dist/components/features/terminal/empty-terminal-message.d.ts +1 -1
  855. package/dist/components/features/terminal/terminal.d.ts +1 -1
  856. package/dist/components/features/tips/random-tip.d.ts +2 -1
  857. package/dist/components/providers/agent-server-ui-providers.d.ts +1 -1
  858. package/dist/components/providers/agent-server-ui-root.d.ts +1 -1
  859. package/dist/components/providers/telemetry-provider.d.ts +1 -1
  860. package/dist/components/shared/action-tooltip.d.ts +1 -1
  861. package/dist/components/shared/agent-brand-icon.d.ts +1 -1
  862. package/dist/components/shared/badge.d.ts +1 -1
  863. package/dist/components/shared/buttons/back-nav-button-content.d.ts +1 -1
  864. package/dist/components/shared/buttons/circle-plus-check-toggle.d.ts +3 -2
  865. package/dist/components/shared/buttons/conversation-confirmation-buttons.d.ts +1 -1
  866. package/dist/components/shared/buttons/copy-to-clipboard-button.d.ts +1 -1
  867. package/dist/components/shared/buttons/copyable-content-wrapper.d.ts +1 -1
  868. package/dist/components/shared/buttons/modal-button.d.ts +1 -1
  869. package/dist/components/shared/buttons/openhands-logo-button.d.ts +1 -1
  870. package/dist/components/shared/buttons/remove-button.d.ts +1 -1
  871. package/dist/components/shared/buttons/scroll-to-bottom-button.d.ts +1 -1
  872. package/dist/components/shared/buttons/styled-tooltip.d.ts +1 -1
  873. package/dist/components/shared/filters/enum-filter-dropdown.cjs +1 -1
  874. package/dist/components/shared/filters/enum-filter-dropdown.cjs.map +1 -1
  875. package/dist/components/shared/filters/enum-filter-dropdown.d.ts +6 -2
  876. package/dist/components/shared/filters/enum-filter-dropdown.js +13 -13
  877. package/dist/components/shared/filters/enum-filter-dropdown.js.map +1 -1
  878. package/dist/components/shared/git-provider-icon.d.ts +1 -1
  879. package/dist/components/shared/hook-execution-event-message.d.ts +2 -1
  880. package/dist/components/shared/loading-spinner.d.ts +1 -1
  881. package/dist/components/shared/modals/confirmation-modal.d.ts +1 -1
  882. package/dist/components/shared/modals/confirmation-modals/base-modal.d.ts +3 -3
  883. package/dist/components/shared/modals/confirmation-modals/danger-modal.d.ts +1 -1
  884. package/dist/components/shared/modals/modal-body.d.ts +1 -1
  885. package/dist/components/shared/modals/modal-close-button.d.ts +1 -1
  886. package/dist/components/shared/modals/settings/model-selector.d.ts +2 -1
  887. package/dist/components/shared/modals/settings/settings-form.d.ts +2 -1
  888. package/dist/components/shared/modals/settings/settings-modal.d.ts +1 -1
  889. package/dist/components/shared/navigation-link.cjs +1 -1
  890. package/dist/components/shared/navigation-link.cjs.map +1 -1
  891. package/dist/components/shared/navigation-link.js +11 -7
  892. package/dist/components/shared/navigation-link.js.map +1 -1
  893. package/dist/components/shared/risk-alert.d.ts +1 -1
  894. package/dist/components/shared/text-shimmer.d.ts +1 -1
  895. package/dist/components/ui/resize-handle.d.ts +1 -1
  896. package/dist/config/defaults.cjs +1 -1
  897. package/dist/config/defaults.cjs.map +1 -1
  898. package/dist/config/defaults.js +3 -3
  899. package/dist/config/defaults.js.map +1 -1
  900. package/dist/constants/child-conversation.cjs +2 -0
  901. package/dist/constants/child-conversation.cjs.map +1 -0
  902. package/dist/constants/child-conversation.d.ts +29 -0
  903. package/dist/constants/child-conversation.js +6 -0
  904. package/dist/constants/child-conversation.js.map +1 -0
  905. package/dist/context/navigation-context.d.ts +1 -1
  906. package/dist/context/scroll-context.d.ts +1 -1
  907. package/dist/contexts/active-backend-context.d.ts +1 -1
  908. package/dist/contexts/conversation-websocket-context.cjs +3 -3
  909. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  910. package/dist/contexts/conversation-websocket-context.d.ts +1 -1
  911. package/dist/contexts/conversation-websocket-context.js +189 -188
  912. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  913. package/dist/contexts/settings-section-header-context.d.ts +1 -1
  914. package/dist/contexts/websocket-provider-wrapper.d.ts +1 -1
  915. package/dist/fixtures/home-automations-demo.d.ts +19 -0
  916. package/dist/hooks/chat/use-model-interceptor.cjs +1 -1
  917. package/dist/hooks/chat/use-model-interceptor.js +6 -6
  918. package/dist/hooks/mutation/use-add-mcp-server.cjs +1 -1
  919. package/dist/hooks/mutation/use-add-mcp-server.cjs.map +1 -1
  920. package/dist/hooks/mutation/use-add-mcp-server.js +10 -14
  921. package/dist/hooks/mutation/use-add-mcp-server.js.map +1 -1
  922. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  923. package/dist/hooks/mutation/use-create-conversation.js +6 -6
  924. package/dist/hooks/mutation/use-delete-mcp-server.cjs +1 -1
  925. package/dist/hooks/mutation/use-delete-mcp-server.cjs.map +1 -1
  926. package/dist/hooks/mutation/use-delete-mcp-server.d.ts +2 -7
  927. package/dist/hooks/mutation/use-delete-mcp-server.js +8 -34
  928. package/dist/hooks/mutation/use-delete-mcp-server.js.map +1 -1
  929. package/dist/hooks/mutation/use-save-settings.cjs +1 -1
  930. package/dist/hooks/mutation/use-save-settings.cjs.map +1 -1
  931. package/dist/hooks/mutation/use-save-settings.js +8 -4
  932. package/dist/hooks/mutation/use-save-settings.js.map +1 -1
  933. package/dist/hooks/mutation/use-update-mcp-server.cjs +1 -1
  934. package/dist/hooks/mutation/use-update-mcp-server.cjs.map +1 -1
  935. package/dist/hooks/mutation/use-update-mcp-server.d.ts +1 -1
  936. package/dist/hooks/mutation/use-update-mcp-server.js +31 -16
  937. package/dist/hooks/mutation/use-update-mcp-server.js.map +1 -1
  938. package/dist/hooks/query/use-active-conversation.d.ts +1 -1
  939. package/dist/hooks/query/use-agent-profiles.d.ts +1 -1
  940. package/dist/hooks/query/use-app-installations.d.ts +1 -1
  941. package/dist/hooks/query/use-automation-detail.d.ts +2 -2
  942. package/dist/hooks/query/use-automation-health.d.ts +2 -0
  943. package/dist/hooks/query/use-automations.d.ts +5 -1
  944. package/dist/hooks/query/use-bash-command-logs.d.ts +1 -1
  945. package/dist/hooks/query/use-cloud-sandbox.d.ts +1 -1
  946. package/dist/hooks/query/use-commit-changes.d.ts +1 -1
  947. package/dist/hooks/query/use-config.d.ts +1 -1
  948. package/dist/hooks/query/use-conversation-history.d.ts +1 -1
  949. package/dist/hooks/query/use-conversation-hooks.d.ts +1 -1
  950. package/dist/hooks/query/use-conversation-skills.d.ts +1 -1
  951. package/dist/hooks/query/use-get-secrets.d.ts +1 -1
  952. package/dist/hooks/query/use-home-automations.d.ts +20 -0
  953. package/dist/hooks/query/use-latest-automation-runs.d.ts +19 -0
  954. package/dist/hooks/query/use-llm-profiles.d.ts +1 -1
  955. package/dist/hooks/query/use-llm-subscription-models.d.ts +1 -1
  956. package/dist/hooks/query/use-llm-subscription-status.d.ts +1 -1
  957. package/dist/hooks/query/use-local-git-info.d.ts +1 -1
  958. package/dist/hooks/query/use-local-workspaces.d.ts +1 -1
  959. package/dist/hooks/query/use-manifest-capabilities.d.ts +2 -0
  960. package/dist/hooks/query/use-plugin-file-content.d.ts +1 -1
  961. package/dist/hooks/query/use-plugins-marketplace.d.ts +1 -1
  962. package/dist/hooks/query/use-provider-models.d.ts +1 -1
  963. package/dist/hooks/query/use-search-branches.d.ts +1 -1
  964. package/dist/hooks/query/use-search-providers.d.ts +1 -1
  965. package/dist/hooks/query/use-search-repositories.d.ts +1 -1
  966. package/dist/hooks/query/use-search-subdirs.d.ts +2 -2
  967. package/dist/hooks/query/use-settings.d.ts +2 -2
  968. package/dist/hooks/query/use-skills.d.ts +1 -1
  969. package/dist/hooks/query/use-start-tasks.d.ts +1 -1
  970. package/dist/hooks/query/use-sub-conversation-task-polling.d.ts +1 -1
  971. package/dist/hooks/query/use-sub-conversations.d.ts +1 -1
  972. package/dist/hooks/query/use-suggested-tasks.d.ts +1 -1
  973. package/dist/hooks/query/use-task-polling.d.ts +2 -2
  974. package/dist/hooks/query/use-unified-get-git-changes.d.ts +1 -1
  975. package/dist/hooks/query/use-unified-git-diff.d.ts +1 -1
  976. package/dist/hooks/query/use-user-conversation.d.ts +1 -1
  977. package/dist/hooks/query/use-workspace-file-content.d.ts +1 -1
  978. package/dist/hooks/use-backend-scoped-path.cjs +2 -0
  979. package/dist/hooks/use-backend-scoped-path.cjs.map +1 -0
  980. package/dist/hooks/use-backend-scoped-path.d.ts +10 -0
  981. package/dist/hooks/use-backend-scoped-path.js +13 -0
  982. package/dist/hooks/use-backend-scoped-path.js.map +1 -0
  983. package/dist/hooks/use-home-automation-actions.d.ts +23 -0
  984. package/dist/hooks/use-home-pinned-automations.d.ts +26 -0
  985. package/dist/hooks/use-tracking.cjs +1 -1
  986. package/dist/hooks/use-tracking.cjs.map +1 -1
  987. package/dist/hooks/use-tracking.d.ts +4 -0
  988. package/dist/hooks/use-tracking.js +6 -0
  989. package/dist/hooks/use-tracking.js.map +1 -1
  990. package/dist/i18n/declaration.cjs +1 -1
  991. package/dist/i18n/declaration.cjs.map +1 -1
  992. package/dist/i18n/declaration.d.ts +105 -2
  993. package/dist/i18n/declaration.js +1 -1
  994. package/dist/i18n/declaration.js.map +1 -1
  995. package/dist/i18n/translation.cjs +2 -2
  996. package/dist/i18n/translation.cjs.map +1 -1
  997. package/dist/i18n/translation.js +1813 -62
  998. package/dist/i18n/translation.js.map +1 -1
  999. package/dist/icons/code-pill.d.ts +1 -1
  1000. package/dist/icons/docker.cjs +2 -0
  1001. package/dist/icons/docker.cjs.map +1 -0
  1002. package/dist/icons/docker.js +19 -0
  1003. package/dist/icons/docker.js.map +1 -0
  1004. package/dist/icons/npm.cjs +2 -0
  1005. package/dist/icons/npm.cjs.map +1 -0
  1006. package/dist/icons/npm.js +19 -0
  1007. package/dist/icons/npm.js.map +1 -0
  1008. package/dist/locales/ar/openhands.json +108 -5
  1009. package/dist/locales/ca/openhands.json +108 -5
  1010. package/dist/locales/de/openhands.json +108 -5
  1011. package/dist/locales/en/openhands.json +108 -5
  1012. package/dist/locales/es/openhands.json +108 -5
  1013. package/dist/locales/fr/openhands.json +108 -5
  1014. package/dist/locales/it/openhands.json +108 -5
  1015. package/dist/locales/ja/openhands.json +108 -5
  1016. package/dist/locales/ko-KR/openhands.json +108 -5
  1017. package/dist/locales/no/openhands.json +108 -5
  1018. package/dist/locales/pt/openhands.json +108 -5
  1019. package/dist/locales/tr/openhands.json +108 -5
  1020. package/dist/locales/uk/openhands.json +108 -5
  1021. package/dist/locales/zh-CN/openhands.json +108 -5
  1022. package/dist/locales/zh-TW/openhands.json +108 -5
  1023. package/dist/manifests/automation-insights.d.ts +64 -0
  1024. package/dist/manifests/automation-interface.cjs +1 -1
  1025. package/dist/manifests/automation-interface.cjs.map +1 -1
  1026. package/dist/manifests/automation-interface.d.ts +33 -1
  1027. package/dist/manifests/automation-interface.js +2 -1
  1028. package/dist/manifests/automation-interface.js.map +1 -1
  1029. package/dist/manifests/interface-validation.cjs +1 -1
  1030. package/dist/manifests/interface-validation.cjs.map +1 -1
  1031. package/dist/manifests/interface-validation.js +228 -50
  1032. package/dist/manifests/interface-validation.js.map +1 -1
  1033. package/dist/manifests/manifest-template.d.ts +2 -0
  1034. package/dist/manifests/manifest-validation.cjs.map +1 -1
  1035. package/dist/manifests/manifest-validation.js.map +1 -1
  1036. package/dist/manifests/types.cjs +1 -1
  1037. package/dist/manifests/types.cjs.map +1 -1
  1038. package/dist/manifests/types.d.ts +128 -0
  1039. package/dist/manifests/types.js +35 -2
  1040. package/dist/manifests/types.js.map +1 -1
  1041. package/dist/mockServiceWorker.js +21 -9
  1042. package/dist/node_modules/@openhands/extensions/automations/catalog/upstream-fork-sync/manifest.cjs +9 -0
  1043. package/dist/node_modules/@openhands/extensions/automations/catalog/upstream-fork-sync/manifest.cjs.map +1 -0
  1044. package/dist/node_modules/@openhands/extensions/automations/catalog/upstream-fork-sync/manifest.js +74 -0
  1045. package/dist/node_modules/@openhands/extensions/automations/catalog/upstream-fork-sync/manifest.js.map +1 -0
  1046. package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs +1 -1
  1047. package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs.map +1 -1
  1048. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js +6 -4
  1049. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js.map +1 -1
  1050. package/dist/node_modules/@openhands/extensions/automations/interface.cjs +1 -1
  1051. package/dist/node_modules/@openhands/extensions/automations/interface.cjs.map +1 -1
  1052. package/dist/node_modules/@openhands/extensions/automations/interface.js +126 -5
  1053. package/dist/node_modules/@openhands/extensions/automations/interface.js.map +1 -1
  1054. package/dist/node_modules/@openhands/extensions/skills/index.cjs +161 -53
  1055. package/dist/node_modules/@openhands/extensions/skills/index.cjs.map +1 -1
  1056. package/dist/node_modules/@openhands/extensions/skills/index.js +112 -50
  1057. package/dist/node_modules/@openhands/extensions/skills/index.js.map +1 -1
  1058. package/dist/node_modules/@openhands/typescript-client/dist/index.cjs +1 -1
  1059. package/dist/node_modules/@openhands/typescript-client/dist/index.js +1 -1
  1060. package/dist/node_modules/@tanstack/query-core/build/modern/utils.cjs +1 -1
  1061. package/dist/node_modules/@tanstack/query-core/build/modern/utils.cjs.map +1 -1
  1062. package/dist/node_modules/@tanstack/query-core/build/modern/utils.js +12 -1
  1063. package/dist/node_modules/@tanstack/query-core/build/modern/utils.js.map +1 -1
  1064. package/dist/node_modules/@tanstack/react-query/build/modern/useBaseQuery.cjs +1 -1
  1065. package/dist/node_modules/@tanstack/react-query/build/modern/useBaseQuery.cjs.map +1 -1
  1066. package/dist/node_modules/@tanstack/react-query/build/modern/useBaseQuery.js +14 -12
  1067. package/dist/node_modules/@tanstack/react-query/build/modern/useBaseQuery.js.map +1 -1
  1068. package/dist/node_modules/html-parse-stringify/dist/esm/html-parse-stringify.cjs +2 -0
  1069. package/dist/node_modules/html-parse-stringify/dist/esm/html-parse-stringify.cjs.map +1 -0
  1070. package/dist/node_modules/html-parse-stringify/dist/esm/html-parse-stringify.js +177 -0
  1071. package/dist/node_modules/html-parse-stringify/dist/esm/html-parse-stringify.js.map +1 -0
  1072. package/dist/node_modules/i18next/dist/esm/i18next.cjs +1 -1
  1073. package/dist/node_modules/i18next/dist/esm/i18next.cjs.map +1 -1
  1074. package/dist/node_modules/i18next/dist/esm/i18next.js +31 -24
  1075. package/dist/node_modules/i18next/dist/esm/i18next.js.map +1 -1
  1076. package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.cjs +2 -0
  1077. package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.cjs.map +1 -0
  1078. package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.js +16 -0
  1079. package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.js.map +1 -0
  1080. package/dist/node_modules/lucide-react/dist/esm/icons/building-2.cjs +2 -0
  1081. package/dist/node_modules/lucide-react/dist/esm/icons/building-2.cjs.map +1 -0
  1082. package/dist/node_modules/lucide-react/dist/esm/icons/building-2.js +27 -0
  1083. package/dist/node_modules/lucide-react/dist/esm/icons/building-2.js.map +1 -0
  1084. package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.cjs +2 -0
  1085. package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.cjs.map +1 -0
  1086. package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.js +21 -0
  1087. package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.js.map +1 -0
  1088. package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.cjs +2 -0
  1089. package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.cjs.map +1 -0
  1090. package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.js +23 -0
  1091. package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.js.map +1 -0
  1092. package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.cjs +2 -0
  1093. package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.cjs.map +1 -0
  1094. package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.js +43 -0
  1095. package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.js.map +1 -0
  1096. package/dist/node_modules/lucide-react/dist/esm/icons/earth.cjs +2 -0
  1097. package/dist/node_modules/lucide-react/dist/esm/icons/earth.cjs.map +1 -0
  1098. package/dist/node_modules/lucide-react/dist/esm/icons/earth.js +25 -0
  1099. package/dist/node_modules/lucide-react/dist/esm/icons/earth.js.map +1 -0
  1100. package/dist/node_modules/lucide-react/dist/esm/icons/flag.cjs +2 -0
  1101. package/dist/node_modules/lucide-react/dist/esm/icons/flag.cjs.map +1 -0
  1102. package/dist/node_modules/lucide-react/dist/esm/icons/flag.js +9 -0
  1103. package/dist/node_modules/lucide-react/dist/esm/icons/flag.js.map +1 -0
  1104. package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.cjs +2 -0
  1105. package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.cjs.map +1 -0
  1106. package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.js +27 -0
  1107. package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.js.map +1 -0
  1108. package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.cjs +2 -0
  1109. package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.cjs.map +1 -0
  1110. package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.js +25 -0
  1111. package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.js.map +1 -0
  1112. package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.cjs +2 -0
  1113. package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.cjs.map +1 -0
  1114. package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.js +30 -0
  1115. package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.js.map +1 -0
  1116. package/dist/node_modules/lucide-react/dist/esm/icons/hash.cjs +2 -0
  1117. package/dist/node_modules/lucide-react/dist/esm/icons/hash.cjs.map +1 -0
  1118. package/dist/node_modules/lucide-react/dist/esm/icons/hash.js +35 -0
  1119. package/dist/node_modules/lucide-react/dist/esm/icons/hash.js.map +1 -0
  1120. package/dist/node_modules/lucide-react/dist/esm/icons/house.cjs +2 -0
  1121. package/dist/node_modules/lucide-react/dist/esm/icons/house.cjs.map +1 -0
  1122. package/dist/node_modules/lucide-react/dist/esm/icons/house.js +12 -0
  1123. package/dist/node_modules/lucide-react/dist/esm/icons/house.js.map +1 -0
  1124. package/dist/node_modules/lucide-react/dist/esm/icons/id-card.cjs +2 -0
  1125. package/dist/node_modules/lucide-react/dist/esm/icons/id-card.cjs.map +1 -0
  1126. package/dist/node_modules/lucide-react/dist/esm/icons/id-card.js +33 -0
  1127. package/dist/node_modules/lucide-react/dist/esm/icons/id-card.js.map +1 -0
  1128. package/dist/node_modules/lucide-react/dist/esm/icons/key-round.cjs +2 -0
  1129. package/dist/node_modules/lucide-react/dist/esm/icons/key-round.cjs.map +1 -0
  1130. package/dist/node_modules/lucide-react/dist/esm/icons/key-round.js +15 -0
  1131. package/dist/node_modules/lucide-react/dist/esm/icons/key-round.js.map +1 -0
  1132. package/dist/node_modules/lucide-react/dist/esm/icons/layers.cjs +2 -0
  1133. package/dist/node_modules/lucide-react/dist/esm/icons/layers.cjs.map +1 -0
  1134. package/dist/node_modules/lucide-react/dist/esm/icons/layers.js +19 -0
  1135. package/dist/node_modules/lucide-react/dist/esm/icons/layers.js.map +1 -0
  1136. package/dist/node_modules/lucide-react/dist/esm/icons/link-2.cjs +2 -0
  1137. package/dist/node_modules/lucide-react/dist/esm/icons/link-2.cjs.map +1 -0
  1138. package/dist/node_modules/lucide-react/dist/esm/icons/link-2.js +22 -0
  1139. package/dist/node_modules/lucide-react/dist/esm/icons/link-2.js.map +1 -0
  1140. package/dist/node_modules/lucide-react/dist/esm/icons/mails.cjs +2 -0
  1141. package/dist/node_modules/lucide-react/dist/esm/icons/mails.cjs.map +1 -0
  1142. package/dist/node_modules/lucide-react/dist/esm/icons/mails.js +23 -0
  1143. package/dist/node_modules/lucide-react/dist/esm/icons/mails.js.map +1 -0
  1144. package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.cjs +2 -0
  1145. package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.cjs.map +1 -0
  1146. package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.js +12 -0
  1147. package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.js.map +1 -0
  1148. package/dist/node_modules/lucide-react/dist/esm/icons/plug.cjs +2 -0
  1149. package/dist/node_modules/lucide-react/dist/esm/icons/plug.cjs.map +1 -0
  1150. package/dist/node_modules/lucide-react/dist/esm/icons/plug.js +23 -0
  1151. package/dist/node_modules/lucide-react/dist/esm/icons/plug.js.map +1 -0
  1152. package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.cjs +2 -0
  1153. package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.cjs.map +1 -0
  1154. package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.js +27 -0
  1155. package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.js.map +1 -0
  1156. package/dist/node_modules/lucide-react/dist/esm/icons/ticket.cjs +2 -0
  1157. package/dist/node_modules/lucide-react/dist/esm/icons/ticket.cjs.map +1 -0
  1158. package/dist/node_modules/lucide-react/dist/esm/icons/ticket.js +23 -0
  1159. package/dist/node_modules/lucide-react/dist/esm/icons/ticket.js.map +1 -0
  1160. package/dist/node_modules/lucide-react/dist/esm/icons/users-round.cjs +2 -0
  1161. package/dist/node_modules/lucide-react/dist/esm/icons/users-round.cjs.map +1 -0
  1162. package/dist/node_modules/lucide-react/dist/esm/icons/users-round.js +21 -0
  1163. package/dist/node_modules/lucide-react/dist/esm/icons/users-round.js.map +1 -0
  1164. package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.cjs +2 -0
  1165. package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.cjs.map +1 -0
  1166. package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.js +43 -0
  1167. package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.js.map +1 -0
  1168. package/dist/node_modules/lucide-react/dist/esm/icons/webhook.cjs +2 -0
  1169. package/dist/node_modules/lucide-react/dist/esm/icons/webhook.cjs.map +1 -0
  1170. package/dist/node_modules/lucide-react/dist/esm/icons/webhook.js +19 -0
  1171. package/dist/node_modules/lucide-react/dist/esm/icons/webhook.js.map +1 -0
  1172. package/dist/node_modules/lucide-react/dist/esm/icons/workflow.cjs +2 -0
  1173. package/dist/node_modules/lucide-react/dist/esm/icons/workflow.cjs.map +1 -0
  1174. package/dist/node_modules/lucide-react/dist/esm/icons/workflow.js +27 -0
  1175. package/dist/node_modules/lucide-react/dist/esm/icons/workflow.js.map +1 -0
  1176. package/dist/node_modules/lucide-react/dist/esm/icons/wrench.cjs +2 -0
  1177. package/dist/node_modules/lucide-react/dist/esm/icons/wrench.cjs.map +1 -0
  1178. package/dist/node_modules/lucide-react/dist/esm/icons/wrench.js +9 -0
  1179. package/dist/node_modules/lucide-react/dist/esm/icons/wrench.js.map +1 -0
  1180. package/dist/node_modules/lucide-react/dist/esm/icons/zap.cjs +2 -0
  1181. package/dist/node_modules/lucide-react/dist/esm/icons/zap.cjs.map +1 -0
  1182. package/dist/node_modules/lucide-react/dist/esm/icons/zap.js +9 -0
  1183. package/dist/node_modules/lucide-react/dist/esm/icons/zap.js.map +1 -0
  1184. package/dist/node_modules/posthog-js/dist/module.cjs +2 -2
  1185. package/dist/node_modules/posthog-js/dist/module.cjs.map +1 -1
  1186. package/dist/node_modules/posthog-js/dist/module.js +2055 -1929
  1187. package/dist/node_modules/posthog-js/dist/module.js.map +1 -1
  1188. package/dist/node_modules/react-i18next/dist/es/TransWithoutContext.cjs +1 -1
  1189. package/dist/node_modules/react-i18next/dist/es/TransWithoutContext.cjs.map +1 -1
  1190. package/dist/node_modules/react-i18next/dist/es/TransWithoutContext.js +43 -62
  1191. package/dist/node_modules/react-i18next/dist/es/TransWithoutContext.js.map +1 -1
  1192. package/dist/node_modules/react-i18next/dist/es/useTranslation.cjs +1 -1
  1193. package/dist/node_modules/react-i18next/dist/es/useTranslation.cjs.map +1 -1
  1194. package/dist/node_modules/react-i18next/dist/es/useTranslation.js +12 -6
  1195. package/dist/node_modules/react-i18next/dist/es/useTranslation.js.map +1 -1
  1196. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.cjs +1 -1
  1197. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.cjs.map +1 -1
  1198. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +352 -310
  1199. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -1
  1200. package/dist/package.cjs +1 -1
  1201. package/dist/package.cjs.map +1 -1
  1202. package/dist/package.js +39 -35
  1203. package/dist/package.js.map +1 -1
  1204. package/dist/routes/agent-settings.d.ts +3 -2
  1205. package/dist/routes/app-settings.d.ts +2 -1
  1206. package/dist/routes/browser-tab.d.ts +1 -1
  1207. package/dist/routes/changes-tab.d.ts +2 -1
  1208. package/dist/routes/commits-tab.d.ts +1 -1
  1209. package/dist/routes/conversation.d.ts +2 -1
  1210. package/dist/routes/files-tab.d.ts +1 -1
  1211. package/dist/routes/llm-settings.d.ts +3 -2
  1212. package/dist/routes/mcp.cjs +1 -1
  1213. package/dist/routes/mcp.cjs.map +1 -1
  1214. package/dist/routes/mcp.d.ts +2 -1
  1215. package/dist/routes/mcp.js +1 -1
  1216. package/dist/routes/mcp.js.map +1 -1
  1217. package/dist/routes/planner-tab.d.ts +2 -1
  1218. package/dist/routes/secrets-settings.d.ts +2 -1
  1219. package/dist/routes/task-list-tab.d.ts +1 -1
  1220. package/dist/services/child-conversation-launch.cjs +2 -0
  1221. package/dist/services/child-conversation-launch.cjs.map +1 -0
  1222. package/dist/services/child-conversation-launch.d.ts +41 -0
  1223. package/dist/services/child-conversation-launch.js +182 -0
  1224. package/dist/services/child-conversation-launch.js.map +1 -0
  1225. package/dist/services/settings.cjs +1 -1
  1226. package/dist/services/settings.cjs.map +1 -1
  1227. package/dist/services/settings.js +3 -7
  1228. package/dist/services/settings.js.map +1 -1
  1229. package/dist/stores/conversation-panel-preferences-store.cjs +1 -1
  1230. package/dist/stores/conversation-panel-preferences-store.cjs.map +1 -1
  1231. package/dist/stores/conversation-panel-preferences-store.d.ts +5 -1
  1232. package/dist/stores/conversation-panel-preferences-store.js +8 -2
  1233. package/dist/stores/conversation-panel-preferences-store.js.map +1 -1
  1234. package/dist/types/agent-server/core/base/action.d.ts +17 -1
  1235. package/dist/types/agent-server/core/base/base.d.ts +2 -1
  1236. package/dist/types/agent-server/type-guards.cjs +1 -1
  1237. package/dist/types/agent-server/type-guards.cjs.map +1 -1
  1238. package/dist/types/agent-server/type-guards.d.ts +8 -1
  1239. package/dist/types/agent-server/type-guards.js +4 -3
  1240. package/dist/types/agent-server/type-guards.js.map +1 -1
  1241. package/dist/types/automation.d.ts +30 -1
  1242. package/dist/types/mcp-auth.cjs.map +1 -1
  1243. package/dist/types/mcp-auth.d.ts +5 -41
  1244. package/dist/types/mcp-auth.js.map +1 -1
  1245. package/dist/types/mcp-server.d.ts +17 -32
  1246. package/dist/types/settings.d.ts +8 -28
  1247. package/dist/ui/card-title.d.ts +1 -1
  1248. package/dist/ui/card.d.ts +1 -1
  1249. package/dist/ui/combobox-caret.d.ts +3 -3
  1250. package/dist/ui/context-menu.cjs +1 -1
  1251. package/dist/ui/context-menu.cjs.map +1 -1
  1252. package/dist/ui/context-menu.d.ts +3 -2
  1253. package/dist/ui/context-menu.js +10 -9
  1254. package/dist/ui/context-menu.js.map +1 -1
  1255. package/dist/ui/divider.d.ts +1 -1
  1256. package/dist/ui/dropdown/clear-button.d.ts +1 -1
  1257. package/dist/ui/dropdown/dropdown-input.d.ts +1 -1
  1258. package/dist/ui/dropdown/dropdown-menu.d.ts +1 -1
  1259. package/dist/ui/dropdown/dropdown.d.ts +1 -1
  1260. package/dist/ui/dropdown/loading-spinner.d.ts +1 -1
  1261. package/dist/ui/dropdown/toggle-button.d.ts +1 -1
  1262. package/dist/ui/help-link.d.ts +1 -1
  1263. package/dist/ui/pre.d.ts +1 -1
  1264. package/dist/ui/toggle-switch.d.ts +2 -2
  1265. package/dist/ui/typography.d.ts +7 -7
  1266. package/dist/utils/automation-activity-log-export.d.ts +17 -0
  1267. package/dist/utils/automation-timeout.d.ts +4 -6
  1268. package/dist/utils/custom-toast-handlers.cjs +1 -1
  1269. package/dist/utils/custom-toast-handlers.cjs.map +1 -1
  1270. package/dist/utils/custom-toast-handlers.d.ts +2 -2
  1271. package/dist/utils/custom-toast-handlers.js +18 -1
  1272. package/dist/utils/custom-toast-handlers.js.map +1 -1
  1273. package/dist/utils/format-relative-time.d.ts +3 -0
  1274. package/dist/utils/mcp-config.cjs +1 -1
  1275. package/dist/utils/mcp-config.cjs.map +1 -1
  1276. package/dist/utils/mcp-config.d.ts +12 -29
  1277. package/dist/utils/mcp-config.js +161 -143
  1278. package/dist/utils/mcp-config.js.map +1 -1
  1279. package/dist/utils/mcp-installed-servers.cjs +1 -1
  1280. package/dist/utils/mcp-installed-servers.cjs.map +1 -1
  1281. package/dist/utils/mcp-installed-servers.d.ts +2 -2
  1282. package/dist/utils/mcp-installed-servers.js +21 -32
  1283. package/dist/utils/mcp-installed-servers.js.map +1 -1
  1284. package/dist/utils/mcp-server-health-key.cjs.map +1 -1
  1285. package/dist/utils/mcp-server-health-key.d.ts +2 -4
  1286. package/dist/utils/mcp-server-health-key.js.map +1 -1
  1287. package/dist/utils/settings-like-page-layout-classes.cjs +1 -1
  1288. package/dist/utils/settings-like-page-layout-classes.cjs.map +1 -1
  1289. package/dist/utils/settings-like-page-layout-classes.d.ts +6 -2
  1290. package/dist/utils/settings-like-page-layout-classes.js +1 -1
  1291. package/dist/utils/settings-like-page-layout-classes.js.map +1 -1
  1292. package/dist/utils/skill-category.d.ts +12 -0
  1293. package/package.json +41 -35
  1294. package/scripts/brand-dev-electron.mjs +244 -0
  1295. package/scripts/check-sdk-version-sync.mjs +6 -6
  1296. package/scripts/check-translation-completeness.cjs +4 -0
  1297. package/scripts/dev-safe.mjs +2 -2
  1298. package/scripts/dev-with-automation.mjs +3 -2
  1299. package/scripts/generate-icons.mjs +109 -0
  1300. package/build/assets/Trans-Bwpzk1wT.js +0 -1
  1301. package/build/assets/active-backend-context-BiwzkzDy.js +0 -2
  1302. package/build/assets/agent-context-settings-DXNT_dcw.js +0 -1
  1303. package/build/assets/agent-server-conversation-service.api-CYSWw-2g.js +0 -41
  1304. package/build/assets/agent-settings-BjgQQe-_.js +0 -1
  1305. package/build/assets/alert-banner-DR8EVyZM.js +0 -1
  1306. package/build/assets/api-error-message-e16L1kwH.js +0 -1
  1307. package/build/assets/automation-detail-DY6x2FW1.js +0 -2
  1308. package/build/assets/automation-export-C09f-Lua.js +0 -2
  1309. package/build/assets/automation-setup-route-CqKp0717.js +0 -1
  1310. package/build/assets/automations-list-CqWJ7qXW.js +0 -1
  1311. package/build/assets/backend-form-modal-B8D5hBzK.js +0 -1
  1312. package/build/assets/check-CPLXgluF.js +0 -1
  1313. package/build/assets/chevron-down-CP4QHvyc.js +0 -1
  1314. package/build/assets/circle-check-Dpy2_xSI.js +0 -1
  1315. package/build/assets/command-menu-Bj6X4ckE.js +0 -1
  1316. package/build/assets/condenser-settings-EAXQNR2E.js +0 -1
  1317. package/build/assets/context-menu-list-item-CrCrYuPF.js +0 -1
  1318. package/build/assets/conversation-BzyIcSwr.js +0 -1
  1319. package/build/assets/conversation-panel-BzyIcSwr.js +0 -1
  1320. package/build/assets/copy-DCmZtz6n.js +0 -1
  1321. package/build/assets/entry.client-BbIYOsIg.js +0 -2
  1322. package/build/assets/enum-filter-dropdown-C08-srev.js +0 -1
  1323. package/build/assets/files-tab-DEq8MbHu.js +0 -1
  1324. package/build/assets/format-time-delta-CxfPJpzC.js +0 -1
  1325. package/build/assets/git-repo-dropdown-9WKINV6J.js +0 -1
  1326. package/build/assets/home-CY0JaxiY.js +0 -1
  1327. package/build/assets/home-CaNWlVvB.js +0 -1
  1328. package/build/assets/index-home-CaNWlVvB.js +0 -1
  1329. package/build/assets/info-CmWQXtRQ.js +0 -1
  1330. package/build/assets/install-server-modal-BWrudmZU.js +0 -1
  1331. package/build/assets/llm-not-configured-banner-3tMsM4K6.js +0 -27
  1332. package/build/assets/llm-settings-CXo8iPNW.js +0 -1
  1333. package/build/assets/llm-settings-D0W8mJDk.js +0 -1
  1334. package/build/assets/loader-circle-B4QDBARx.js +0 -1
  1335. package/build/assets/manifest-39f4789d.js +0 -1
  1336. package/build/assets/map-provider-CXU6issd.js +0 -1
  1337. package/build/assets/markdown-renderer-DgiLLhW6.js +0 -8
  1338. package/build/assets/mcp-DXG9LWrI.js +0 -9
  1339. package/build/assets/mcp-marketplace-utils-DFmhKc5s.js +0 -1
  1340. package/build/assets/messages-kBjKaAeA.js +0 -40
  1341. package/build/assets/navigation-link-Bxmn-pCs.js +0 -1
  1342. package/build/assets/onboarding-47hh2IHA.js +0 -1
  1343. package/build/assets/onboarding-modal-9BuvvROo.js +0 -1
  1344. package/build/assets/plus-DrKuuvMe.js +0 -1
  1345. package/build/assets/recommended-automations-launcher-ejxy1P27.js +0 -1
  1346. package/build/assets/root-5S-M8SYa.js +0 -2
  1347. package/build/assets/root-DZ39lS5f.css +0 -1
  1348. package/build/assets/root-layout-BPqoa0gv.js +0 -3
  1349. package/build/assets/search-Dc2qR4O2.js +0 -1
  1350. package/build/assets/settings-BRbnfKEm.js +0 -1
  1351. package/build/assets/settings-Chfn5xTD.js +0 -1
  1352. package/build/assets/settings-like-page-layout-classes-DyxyJ0k4.js +0 -1
  1353. package/build/assets/settings-service.api-CZiPD8__.js +0 -1
  1354. package/build/assets/sidebar-mobile-menu-toggle-ND-hgygu.js +0 -1
  1355. package/build/assets/sidebar-store-Bui-WNEr.js +0 -1
  1356. package/build/assets/skills-settings-B43KArIz.js +0 -2
  1357. package/build/assets/use-is-authed-BT7Iud4U.js +0 -1
  1358. package/build/assets/use-llm-profiles-2Wc2db8u.js +0 -1
  1359. package/build/assets/use-save-agent-profile-D0wC5ExW.js +0 -1
  1360. package/build/assets/use-settings-nav-items-DHAAD-zk.js +0 -16
  1361. package/build/assets/use-skills-CE6miQ3r.js +0 -1
  1362. package/build/assets/use-tracking-BGboadaZ.js +0 -68
  1363. package/build/assets/useQuery-DiPh8LRJ.js +0 -1
  1364. package/build/assets/utils-BgGG1znF.js +0 -1
  1365. package/build/assets/v4-DDdyfk2q.js +0 -1
  1366. package/build/assets/vendor~browser-IVYgIgG1.js +0 -47
  1367. package/build/assets/vendor~entry.client-CXM9oiAk.js +0 -1
  1368. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~d4by102p-C2f0ZhS-.js +0 -26
  1369. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~emdr2jt4-BrmgjeOw.js +0 -1
  1370. package/build/assets/vendor~module-BZXjBMvd.js +0 -2
  1371. package/build/assets/x-omAzpXkl.js +0 -1
  1372. package/dist/components/features/skills/skill-type-filter.d.ts +0 -3
  1373. package/dist/components/features/skills/skills-type-filter-dropdown.d.ts +0 -7
  1374. package/dist/node_modules/html-parse-stringify/dist/html-parse-stringify.module.cjs +0 -2
  1375. package/dist/node_modules/html-parse-stringify/dist/html-parse-stringify.module.cjs.map +0 -1
  1376. package/dist/node_modules/html-parse-stringify/dist/html-parse-stringify.module.js +0 -81
  1377. package/dist/node_modules/html-parse-stringify/dist/html-parse-stringify.module.js.map +0 -1
  1378. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.cjs +0 -2
  1379. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.cjs.map +0 -1
  1380. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.js +0 -9
  1381. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.js.map +0 -1
  1382. package/dist/node_modules/void-elements/index.cjs +0 -2
  1383. package/dist/node_modules/void-elements/index.cjs.map +0 -1
  1384. package/dist/node_modules/void-elements/index.js +0 -25
  1385. package/dist/node_modules/void-elements/index.js.map +0 -1
  1386. /package/build/assets/{vendor~root-layout~index-home~home~mcp~automations-list~automation-setup-route~onboarding-modal-D7IDevqN.js → vendor~root-layout~index-home~home~mcp~automations-list~automation-templates~automation-set~bxsimjx0-D7IDevqN.js} +0 -0
@@ -773,6 +773,8 @@
773
773
  "AUTOMATIONS$CREATE_AUTOMATION_PROMPT": "建立一個自動化",
774
774
  "AUTOMATIONS$EMPTY_LEARN_MORE": "在文件中了解更多",
775
775
  "AUTOMATIONS$SEARCH_PLACEHOLDER": "搜尋自動化...",
776
+ "AUTOMATIONS$NO_FILTER_MATCHES": "沒有符合這些篩選條件的自動化",
777
+ "AUTOMATIONS$CLEAR_FILTERS": "清除篩選條件",
776
778
  "AUTOMATIONS$VIEW_MODE": "檢視模式",
777
779
  "AUTOMATIONS$VIEW_GRID": "網格檢視",
778
780
  "AUTOMATIONS$VIEW_LIST": "列表檢視",
@@ -813,7 +815,7 @@
813
815
  "AUTOMATIONS$TIMEOUT_HINT": "單次執行的最長時間。留空則使用預設值600秒(10分鐘);最大1800秒(30分鐘)。",
814
816
  "AUTOMATIONS$ERROR_TIMEOUT_INVALID_NUMBER": "超時必須是有效數字",
815
817
  "AUTOMATIONS$ERROR_TIMEOUT_POSITIVE": "超時必須為正數",
816
- "AUTOMATIONS$ERROR_TIMEOUT_MAX_EXCEEDED": "超時不能超過1800秒(30分鐘)",
818
+ "AUTOMATIONS$ERROR_TIMEOUT_MAX_EXCEEDED": "超時不能超過{{max}}秒",
817
819
  "AUTOMATIONS$CUSTOM_SCHEDULE_HINT": "此自動化使用自訂排程。已停用頻率編輯以避免破壞它。",
818
820
  "AUTOMATIONS$EDIT_SUCCESS": "自動化已更新",
819
821
  "AUTOMATIONS$EDIT_ERROR": "無法更新自動化",
@@ -826,6 +828,7 @@
826
828
  "AUTOMATIONS$DETAIL$ACTIVE": "作用中",
827
829
  "AUTOMATIONS$DETAIL$ACTIVITY": "活動",
828
830
  "AUTOMATIONS$DETAIL$ACTIVITY_LOG": "活動記錄",
831
+ "AUTOMATIONS$DETAIL$RUN_COST": "成本",
829
832
  "AUTOMATIONS$DETAIL$BACK_TO_LIST": "返回自動化",
830
833
  "AUTOMATIONS$DETAIL$CONFIGURATION": "設定",
831
834
  "AUTOMATIONS$DETAIL$CREATED": "已建立",
@@ -837,9 +840,12 @@
837
840
  "AUTOMATIONS$DETAIL$INACTIVE": "非作用中",
838
841
  "AUTOMATIONS$DETAIL$LAST_RUN": "上次執行",
839
842
  "AUTOMATIONS$DETAIL$LOAD_MORE_RUNS": "載入更多",
843
+ "AUTOMATIONS$DETAIL$EXPORT_JSON": "匯出 JSON",
844
+ "AUTOMATIONS$DETAIL$EXPORT_CSV": "匯出 CSV",
845
+ "AUTOMATIONS$DETAIL$EXPORT_ACTIVITY_LOG_ERROR": "匯出活動紀錄失敗",
840
846
  "AUTOMATIONS$DETAIL$MODEL": "模型",
841
847
  "AUTOMATIONS$DETAIL$NO_RUNS": "尚無活動",
842
- "AUTOMATIONS$DETAIL$NO_CONVERSATION": "對話未建立",
848
+ "AUTOMATIONS$DETAIL$NO_CONVERSATION": "無對話",
843
849
  "AUTOMATIONS$DETAIL$LOGS_VIEW": "查看 {{timestamp}} 的執行日誌",
844
850
  "AUTOMATIONS$DETAIL$LOGS_VIEW_SHORT": "查看日誌",
845
851
  "AUTOMATIONS$DETAIL$DEBUG_WITH_OPENHANDS": "使用 OpenHands 偵錯",
@@ -1054,6 +1060,12 @@
1054
1060
  "CONVERSATION_PANEL$LLM_MODEL": "代理 / 模型",
1055
1061
  "CONVERSATION_PANEL$REPO_BRANCH": "存放庫與分支",
1056
1062
  "CONVERSATION_PANEL$TAGS": "標籤",
1063
+ "CONVERSATION_PANEL$AUTOMATIONS": "自動化",
1064
+ "CONVERSATION_PANEL$AUTOMATIONS_ALL": "所有對話",
1065
+ "CONVERSATION_PANEL$AUTOMATIONS_HIDE": "隱藏自動化執行",
1066
+ "CONVERSATION_PANEL$AUTOMATIONS_ONLY": "僅自動化執行",
1067
+ "CONVERSATION_PANEL$AUTOMATION_UNNAMED": "未命名自動化",
1068
+ "CONVERSATION_PANEL$NO_AUTOMATION_MATCHES": "沒有對話符合自動化篩選條件",
1057
1069
  "CONVERSATION_PANEL$HOVER_METADATA": "懸停中繼資料",
1058
1070
  "CONVERSATION_PANEL$NO_WORKSPACE": "無工作區",
1059
1071
  "CONVERSATION_PANEL$NO_REPOSITORY": "無存放庫",
@@ -1598,7 +1610,6 @@
1598
1610
  "SETTINGS$SKILLS_NO_SKILLS": "找不到技能。",
1599
1611
  "SETTINGS$SKILLS_TRIGGERS": "觸發器: {{triggers}}",
1600
1612
  "SETTINGS$SKILLS_SEARCH_PLACEHOLDER": "依名稱、描述或觸發器搜尋技能",
1601
- "SETTINGS$SKILLS_TYPE_ALL": "全部",
1602
1613
  "SETTINGS$SKILLS_TYPE_AGENTSKILLS": "自動探索",
1603
1614
  "SETTINGS$SKILLS_TYPE_KNOWLEDGE": "基於觸發",
1604
1615
  "SETTINGS$SKILLS_TYPE_REPO": "永遠啟用",
@@ -1945,6 +1956,26 @@
1945
1956
  "SETTINGS$SKILLS_ADD_MODAL_STORAGE_BODY": "透過 <cmd>/add-skill</cmd> 新增的技能會儲存到目前工作區的 <path>.agents/skills/</path>。您也可以手動將技能資料夾複製到該位置。",
1946
1957
  "SETTINGS$SKILLS_ADD_MODAL_PRIVATE_REPOS": "對於私有 GitHub 儲存庫,請在使用 <cmd>/add-skill</cmd> 之前設定 <env>GITHUB_TOKEN</env> 環境變數。",
1947
1958
  "SETTINGS$SKILLS_ADD_MODAL_VIEW_DOCS": "閱讀完整的新增技能指南 →",
1959
+ "SETTINGS$SKILLS_CATEGORY_AUTOMATIONS": "自動化方案",
1960
+ "SETTINGS$SKILLS_CATEGORY_ENVIRONMENT": "環境與工具",
1961
+ "SETTINGS$SKILLS_CATEGORY_CODE_HOSTING": "程式碼託管與 CI",
1962
+ "SETTINGS$SKILLS_CATEGORY_AGENT_AUTHORING": "代理程式創作",
1963
+ "SETTINGS$SKILLS_CATEGORY_CODE_QUALITY": "程式碼品質與審查",
1964
+ "SETTINGS$SKILLS_CATEGORY_INTEGRATIONS": "服務整合",
1965
+ "SETTINGS$SKILLS_CATEGORY_WRITING": "寫作與文件",
1966
+ "SETTINGS$SKILLS_CATEGORY_DESIGN": "設計與前端",
1967
+ "SETTINGS$SKILLS_CATEGORY_OTHER": "未分類",
1968
+ "SETTINGS$SKILLS_FACET_STATE": "狀態",
1969
+ "SETTINGS$SKILLS_FACET_SOURCE": "來源",
1970
+ "SETTINGS$SKILLS_FACET_CATEGORY": "類別",
1971
+ "SETTINGS$SKILLS_FACET_TYPE": "類型",
1972
+ "SETTINGS$SKILLS_SOURCE_PROJECT": "此專案",
1973
+ "SETTINGS$SKILLS_SOURCE_PERSONAL": "個人",
1974
+ "SETTINGS$SKILLS_SOURCE_PUBLIC": "內建",
1975
+ "SETTINGS$SKILLS_FILTERS_BUTTON": "篩選",
1976
+ "SETTINGS$SKILLS_CLEAR_FILTERS": "清除篩選",
1977
+ "SETTINGS$SKILLS_FILTERS_MODAL_TITLE": "篩選技能",
1978
+ "SETTINGS$SKILLS_RESULT_COUNT": "{{count}} 個結果",
1948
1979
  "RECOMMENDED_AUTOMATIONS$SECTION_LABEL": "推薦的自動化",
1949
1980
  "RECOMMENDED_AUTOMATIONS$SECTION_TITLE": "從經過驗證的工作流程開始",
1950
1981
  "RECOMMENDED_AUTOMATIONS$SECTION_DESCRIPTION": "每個範本都包含代理提示、實作草圖,以及讓它發揮作用所需的 MCP。選擇一個即可開啟預先填好的對話,並與代理一起完成細節。",
@@ -2057,6 +2088,35 @@
2057
2088
  "BUTTON$EXPAND": "展開",
2058
2089
  "COMMON$ACTIVE_PROFILE": "使用中的設定檔",
2059
2090
  "AUTOMATIONS$STARTING": "正在啟動…",
2091
+ "FEATURED_AUTOMATIONS$SECTION_TITLE": "自動化",
2092
+ "FEATURED_AUTOMATIONS$CHIP_GROUP_LABEL": "已啟用的自動化",
2093
+ "FEATURED_AUTOMATIONS$FEATURED_HEADING": "精選",
2094
+ "FEATURED_AUTOMATIONS$MANAGE": "新增或管理自動化",
2095
+ "FEATURED_AUTOMATIONS$VIEW_CONVERSATION": "開啟最近的對話",
2096
+ "FEATURED_AUTOMATIONS$VIEW_DETAILS": "檢視自動化詳細資訊",
2097
+ "FEATURED_AUTOMATIONS$LAST_RUN_SUCCEEDED": "上次執行成功",
2098
+ "FEATURED_AUTOMATIONS$LAST_RUN_FAILED": "上次執行失敗",
2099
+ "FEATURED_AUTOMATIONS$RUN_IN_PROGRESS": "執行中",
2100
+ "FEATURED_AUTOMATIONS$STATUS_UNKNOWN": "最近執行狀態未知",
2101
+ "FEATURED_AUTOMATIONS$STATUS_UNAVAILABLE": "狀態無法使用",
2102
+ "FEATURED_AUTOMATIONS$TOASTER_TITLE": "自動化重複工作",
2103
+ "FEATURED_AUTOMATIONS$TOASTER_MESSAGE": "設定依排程或事件觸發的自動化。",
2104
+ "FEATURED_AUTOMATIONS$TOASTER_START": "開始",
2105
+ "FEATURED_AUTOMATIONS$TOASTER_DISMISS": "關閉",
2106
+ "FEATURED_AUTOMATIONS$SUGGESTED_TITLE": "建議的自動化",
2107
+ "FEATURED_AUTOMATIONS$RUNNING_TITLE": "執行中",
2108
+ "FEATURED_AUTOMATIONS$RUNNING_GROUP_LABEL": "目前正在執行的自動化",
2109
+ "FEATURED_AUTOMATIONS$RECENT_TITLE": "最近的自動化活動",
2110
+ "FEATURED_AUTOMATIONS$RECENT_GROUP_LABEL": "執行中與最近完成的自動化",
2111
+ "FEATURED_AUTOMATIONS$VIEW_ALL": "查看全部",
2112
+ "FEATURED_AUTOMATIONS$EMPTY_HINT": "尚未有自動化。新增一個以自動化重複性工作。",
2113
+ "FEATURED_AUTOMATIONS$RUN_ACTIVITY_LABEL": "{{count}} 次最近執行",
2114
+ "FEATURED_AUTOMATIONS$RUN_DURATION": "時長",
2115
+ "FEATURED_AUTOMATIONS$RECOMMENDED_GROUP_LABEL": "建議的自動化",
2116
+ "FEATURED_AUTOMATIONS$RECOMMENDED_PR_REVIEW": "審查拉取請求並發布 AI 回饋",
2117
+ "FEATURED_AUTOMATIONS$RECOMMENDED_GITHUB_MENTIONS": "回覆 GitHub 上的 @OpenHands 提及",
2118
+ "FEATURED_AUTOMATIONS$RECOMMENDED_SLACK_STANDUP": "將 Slack 活動整理成每日站會",
2119
+ "FEATURED_AUTOMATIONS$RECOMMENDED_LINEAR_TRIAGE": "在新 Linear 議題到達時進行分診",
2060
2120
  "CHAT_INTERFACE$LOADING_CONVERSATION": "正在載入對話",
2061
2121
  "CHAT_INTERFACE$MORE_INPUT_ACTIONS": "更多輸入動作",
2062
2122
  "CONVERSATION$UNTITLED": "(無標題)",
@@ -2088,7 +2148,7 @@
2088
2148
  "SETTINGS$APP_UPDATE_CARD_TITLE": "Agent Canvas",
2089
2149
  "SETTINGS$APP_UPDATE_VERSION_LABEL": "版本",
2090
2150
  "SETTINGS$APP_UPDATE_BADGE_UP_TO_DATE": "已是最新",
2091
- "SETTINGS$APP_UPDATE_BADGE_UPDATE_AVAILABLE": "有可用更新",
2151
+ "SETTINGS$APP_UPDATE_BADGE_UPDATE_AVAILABLE": "更新",
2092
2152
  "SETTINGS$APP_UPDATE_LATEST_MESSAGE": "您正在執行最新版本。",
2093
2153
  "SETTINGS$APP_UPDATE_AVAILABLE_MESSAGE": "版本 {{version}} 可用。",
2094
2154
  "SETTINGS$APP_UPDATE_CHECKING": "正在檢查更新…",
@@ -2113,5 +2173,48 @@
2113
2173
  "SETUP$FALLBACK_CONVERSATION": "在對話中設定",
2114
2174
  "SETUP$EMPTY_VALUE": "未設定",
2115
2175
  "SETUP$UNSUPPORTED_MESSAGE": "此部署不支援此自動化所需的全部功能。",
2116
- "SETUP$REPOSITORY_PLACEHOLDER": "owner/repo"
2176
+ "SETUP$REPOSITORY_PLACEHOLDER": "owner/repo",
2177
+ "FEATURED_AUTOMATIONS$PIN": "釘選到儀表板",
2178
+ "FEATURED_AUTOMATIONS$UNPIN": "從儀表板取消釘選",
2179
+ "FEATURED_AUTOMATIONS$ROW_MENU_LABEL": "{{name}} 的操作",
2180
+ "FEATURED_AUTOMATIONS$PINNED_TITLE": "已釘選的自動化",
2181
+ "FEATURED_AUTOMATIONS$PINNED_DASHBOARD_LABEL": "已釘選自動化儀表板",
2182
+ "AUTOMATIONS$CANCEL_RUN": "取消執行",
2183
+ "AUTOMATIONS$CANCEL_RUN_SUCCESS": "已取消自動化執行",
2184
+ "AUTOMATIONS$CANCEL_RUN_ERROR": "取消自動化執行失敗",
2185
+ "AUTOMATIONS$TURN_OFF_CONFIRM_TITLE": "關閉自動化",
2186
+ "AUTOMATIONS$TURN_OFF_CONFIRM_MESSAGE": "關閉「{{name}}」?在重新開啟之前,它將不再依排程執行。",
2187
+ "AUTOMATIONS$TURN_OFF_ERROR": "關閉自動化失敗",
2188
+ "FEATURED_AUTOMATIONS$MOVE_UP": "上移",
2189
+ "FEATURED_AUTOMATIONS$MOVE_DOWN": "下移",
2190
+ "FEATURED_AUTOMATIONS$REORDER_HANDLE": "重新排序 {{name}}",
2191
+ "CONVERSATION$TAGS_OVERFLOW_ARIA": "顯示另外 {{count}} 個標籤",
2192
+ "CONVERSATION_PANEL$PREVIEW_GIT": "Git",
2193
+ "CONVERSATION_PANEL$PREVIEW_REPO": "倉庫",
2194
+ "CONVERSATION_PANEL$PREVIEW_BRANCH": "分支",
2195
+ "CONVERSATION_PANEL$PREVIEW_WORKSPACE": "工作區",
2196
+ "CONVERSATION_PANEL$PREVIEW_APP_MODE": "應用模式",
2197
+ "CONVERSATION_PANEL$PREVIEW_WORK_TOOLS": "工作工具",
2198
+ "CONVERSATION_PANEL$PREVIEW_WORK_WSID": "工作區 ID",
2199
+ "SETTINGS$VERSION_NPM_RECOMMENDED": "npm",
2200
+ "SETTINGS$VERSION_DOCKER": "Docker",
2201
+ "SETTINGS$VERSION_COPY_COMMAND": "複製",
2202
+ "SETTINGS$VERSION_RELEASE_NOTES": "更新內容",
2203
+ "SETTINGS$VERSION_PRODUCT_NAME": "Agent Canvas",
2204
+ "SETTINGS$VERSION_TILE_NEW_VERSION": "有新版本可用",
2205
+ "SETTINGS$VERSION_TILE_ARIA_LABEL": "開啟 Agent Canvas 版本詳細資訊",
2206
+ "SETTINGS$VERSION_MODAL_ARIA_LABEL": "Agent Canvas 版本詳細資訊",
2207
+ "SETTINGS$VERSION_UPDATE_AVAILABLE": "有新版本可用",
2208
+ "SETTINGS$VERSION_UP_TO_DATE_TITLE": "已是最新",
2209
+ "SETTINGS$VERSION_INSTALLED": "目前版本:{{version}}",
2210
+ "SETTINGS$VERSION_UPDATE_MESSAGE": "目前版本為 {{installed}}。若要更新到 {{latest}},請複製下方指令,在終端機執行,然後重新啟動 Agent Canvas。",
2211
+ "SETTINGS$VERSION_LATEST_MESSAGE": "你正在執行最新版本。",
2212
+ "SETTINGS$VERSION_CHECK_UNAVAILABLE": "無法檢查更新。",
2213
+ "SETTINGS$VERSION_CHECK_FOR_UPDATES": "檢查更新",
2214
+ "CHILD_CONVERSATION$LAUNCHED_LOCAL": "已啟動本機子對話",
2215
+ "CHILD_CONVERSATION$LAUNCHED_CLOUD": "已啟動雲端子對話",
2216
+ "CHILD_CONVERSATION$OPEN": "開啟",
2217
+ "CHILD_CONVERSATION$LAUNCH_FAILED": "無法啟動子對話:{{error}}",
2218
+ "ACTION_MESSAGE$LAUNCH_CHILD_CONVERSATION": "正在啟動子對話",
2219
+ "OBSERVATION_MESSAGE$LAUNCH_CHILD_CONVERSATION": "已請求子對話"
2117
2220
  }
@@ -7,8 +7,8 @@
7
7
  * - Please do NOT modify this file.
8
8
  */
9
9
 
10
- const PACKAGE_VERSION = '2.14.2'
11
- const INTEGRITY_CHECKSUM = '4db4a41e972cec1b64cc569c66952d82'
10
+ const PACKAGE_VERSION = '2.15.0'
11
+ const INTEGRITY_CHECKSUM = '03cb67ac84128e63d7cd722a6e5b7f1e'
12
12
  const IS_MOCKED_RESPONSE = Symbol('isMockedResponse')
13
13
  const activeClientIds = new Set()
14
14
 
@@ -137,8 +137,18 @@ async function handleRequest(event, requestId, requestInterceptedAt) {
137
137
  if (client && activeClientIds.has(client.id)) {
138
138
  const serializedRequest = await serializeRequest(requestCloneForEvents)
139
139
 
140
+ // Omit the body of server-sent event stream responses.
141
+ // Cloning such responses would prevent client-side stream cancelations
142
+ // from reaching the original stream (a teed stream only cancels its
143
+ // source once both of its branches cancel) and would buffer the
144
+ // entire stream into the unconsumed clone indefinitely.
145
+ const isEventStreamResponse = response.headers
146
+ .get('content-type')
147
+ ?.toLowerCase()
148
+ .startsWith('text/event-stream')
149
+
140
150
  // Clone the response so both the client and the library could consume it.
141
- const responseClone = response.clone()
151
+ const responseClone = isEventStreamResponse ? null : response.clone()
142
152
 
143
153
  sendToClient(
144
154
  client,
@@ -151,15 +161,17 @@ async function handleRequest(event, requestId, requestInterceptedAt) {
151
161
  ...serializedRequest,
152
162
  },
153
163
  response: {
154
- type: responseClone.type,
155
- status: responseClone.status,
156
- statusText: responseClone.statusText,
157
- headers: Object.fromEntries(responseClone.headers.entries()),
158
- body: responseClone.body,
164
+ type: response.type,
165
+ status: response.status,
166
+ statusText: response.statusText,
167
+ headers: Object.fromEntries(response.headers.entries()),
168
+ body: responseClone ? responseClone.body : null,
159
169
  },
160
170
  },
161
171
  },
162
- responseClone.body ? [serializedRequest.body, responseClone.body] : [],
172
+ responseClone && responseClone.body
173
+ ? [serializedRequest.body, responseClone.body]
174
+ : [],
163
175
  )
164
176
  }
165
177
 
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "_comment": "Single source of truth for version pins, ports, paths, and defaults shared across the npm and Docker install paths. Read by scripts/dev-safe.mjs, scripts/dev-with-automation.mjs, docker/entrypoint.sh (via generated defaults.env), and .github/workflows/docker.yml.",
3
3
  "versions": {
4
- "agentServer": "1.39.1",
5
- "agentCanvas": "1.9.0",
6
- "automation": "1.5.0"
4
+ "agentServer": "1.40.1",
5
+ "agentCanvas": "1.11.0",
6
+ "automation": "1.6.0"
7
7
  },
8
8
  "compatibility": {
9
9
  "minimumAgentServer": "1.28.0"
@@ -1,5 +1,5 @@
1
- require("../_virtual/_rolldown/runtime.cjs");const e=require("../types/agent-server/core/base/common.cjs"),t=require("../node_modules/@openhands/typescript-client/dist/client/server-client.cjs");require("../node_modules/@openhands/typescript-client/dist/clients.cjs");const n=require("./agent-server-config.cjs"),r=require("./backend-registry/active-store.cjs"),i=require("./agent-server-client-options.cjs"),a=require("./agent-server-compatibility.cjs"),o=require("../constants/canvas-ui.cjs"),s=require("../node_modules/@openhands/typescript-client/dist/models/acp.cjs");require("../node_modules/@openhands/typescript-client/dist/index.cjs");const c=require("./conversation-metadata-store.cjs"),l=require("../node_modules/@openhands/extensions/skills/index.cjs"),u=require("../services/settings.cjs"),d=require("../constants/acp-providers.cjs"),f=require("./backend-registry/auth.cjs"),p=require("./settings-service/settings-service.api.cjs"),m=require("../constants/llm-subscription.cjs"),h=require("./llm-subscription-service.cjs"),g=require("./canvas-ui-client-tool.cjs");var _=[`terminal`,`file_editor`,`task_tracker`],v=`browser_tool_set`,y=`task_tool_set`;function b(){return!0}function x(e){if(typeof e==`string`){let t=e.trim();if(!t)return null;try{return x(JSON.parse(t))}catch{return null}}if(!e||typeof e!=`object`||Array.isArray(e))return null;let t=e;return!t.services||typeof t.services!=`object`?null:t}async function S(){let e;try{e=i.getAgentServerClientOptions({timeout:3e3})}catch{return null}let n=x(a.getCachedAgentServerInfo({host:e.host})?.runtime_services);if(n)return n;try{return x((await new t.ServerClient(e).getServerInfo()).runtime_services)}catch{return null}}function C(e){let t=x(e);if(!t?.services)return;let n=[];n.push(`<RUNTIME_SERVICES>`),t.mode?n.push(`You are running inside an agent-canvas dev stack started in '${t.mode}' mode.`):n.push(`You are running inside an agent-canvas dev stack.`),n.push(`The following services are reachable from your sandbox. URLs are written`,`from your point of view (i.e., as you should curl/fetch them).`,``);let{agent_server:r,ingress:i,automation:a}=t.services,{frontend:o}=t.services;r?.url_from_agent&&n.push(`* Agent Server (you): ${r.url_from_agent}`,` ${r.description??`The agent-server hosting your tool calls.`}`),i?.url_from_agent&&n.push(`* Ingress: ${i.url_from_agent}`,` ${i.description??`Unified entry point for browser-facing traffic.`}`),o?.url_from_agent&&n.push(`* Frontend: ${o.url_from_agent}`,` ${o.description??`Frontend dev server.`}`),a?.url_from_agent?(n.push(`* Automation backend: ${a.url_from_agent}`,` ${a.description??`OpenHands Automations service.`}`),a.docs_url&&n.push(` Docs: ${a.docs_url}`),a.openapi_url&&n.push(` OpenAPI: ${a.openapi_url}`),a.auth_env_var&&n.push(` Auth: header 'X-Session-API-Key: $${a.auth_env_var}'`)):n.push(`* Automation backend: not running in this dev mode (skip /api/automation calls).`);let s=r?.url_from_agent;return n.push(``,`Trust this block over guessing: do not assume any other URLs are running.`),s&&n.push(`In particular, ${s} inside your sandbox is the Agent Server`,`you are running inside of — NOT the automation backend.`),n.push(`</RUNTIME_SERVICES>`),n.join(`
2
- `)}function w(e){let{host:t}=i.getAgentServerClientOptions();return`${t}/api/conversations/${e}`}function T(e){return`Conversation ${e.slice(0,5)}`}function E(t){let r=c.getStoredConversationMetadata(t.id),a=t.agent?.kind===`ACPAgent`,o=a?t.tags?.acpserver??t.agent?.acp_server??null:null;return{id:t.id,created_by_user_id:null,selected_repository:r?.selected_repository??null,selected_branch:r?.selected_branch??null,git_provider:r?.git_provider??null,selected_workspace:r?.selected_workspace??null,active_profile:r?.active_profile??null,title:t.title?.trim()?t.title:T(t.id),trigger:null,pr_number:[],agent_kind:a?`acp`:`openhands`,acp_server:o,tags:t.tags??null,launched_agent_profile:t.launched_agent_profile??null,llm_model:a?d.resolveEffectiveAcpModel({runtimeName:t.current_model_name,runtimeId:t.current_model_id,configured:t.agent?.acp_model,sdkLlm:t.agent?.llm?.model}):t.agent?.llm?.model??u.DEFAULT_SETTINGS.llm_model,metrics:t.metrics?{accumulated_cost:t.metrics.accumulated_cost??null,max_budget_per_task:t.metrics.max_budget_per_task??null,accumulated_token_usage:t.metrics.accumulated_token_usage?{prompt_tokens:t.metrics.accumulated_token_usage.prompt_tokens??0,completion_tokens:t.metrics.accumulated_token_usage.completion_tokens??0,cache_read_tokens:t.metrics.accumulated_token_usage.cache_read_tokens??0,cache_write_tokens:t.metrics.accumulated_token_usage.cache_write_tokens??0,context_window:t.metrics.accumulated_token_usage.context_window??0,per_turn_token:t.metrics.accumulated_token_usage.per_turn_token??0}:null}:null,created_at:t.created_at,updated_at:t.updated_at,execution_status:t.execution_status??e.ExecutionStatus.IDLE,sandbox_status:t.sandbox_status??null,conversation_url:w(t.id),session_api_key:i.getAgentServerClientOptions().apiKey??null,sandbox_id:null,workspace:{working_dir:t.workspace?.working_dir??n.getAgentServerWorkingDir()},public:!1,sub_conversation_ids:[]}}function ee(e){return{items:e.items.map(E),next_page_id:e.next_page_id??null}}var D=`acpserver`,O=new Set([D]);function k(e){return e?Object.entries(e).filter(([e])=>!O.has(e)).sort(([e],[t])=>e.localeCompare(t)):[]}var A=`gAAAAA`,j=new Set([`schema_version`,`agent_settings`,`workspace`,`conversation_id`,`initial_message`,`plugins`]);function M(e){return!e||typeof e!=`object`||Array.isArray(e)?{}:structuredClone(e)}function N(e){if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function P(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function F(e){return typeof e==`string`?e.startsWith(A):Array.isArray(e)?e.some(F):P(e)?Object.values(e).some(F):!1}function I(e){return P(e)?Object.values(e).some(F):!1}function L(e){return e.confirmation_mode===!0?e.security_analyzer===`llm`?{kind:`ConfirmRisky`,threshold:`HIGH`,confirm_unknown:!0}:{kind:`AlwaysConfirm`}:{kind:`NeverConfirm`}}function R(e){switch(e.security_analyzer){case`llm`:return{kind:`LLMSecurityAnalyzer`};case`pattern`:return{kind:`PatternSecurityAnalyzer`};case`policy_rail`:return{kind:`PolicyRailSecurityAnalyzer`};default:return}}function z(e){return!!e&&typeof e==`object`&&!Array.isArray(e)&&typeof e.name==`string`}function B(e,t){return e===v?b()&&a.isAgentServerToolAvailable(e):e===y?t.enable_sub_agents===!0&&a.isAgentServerToolAvailable(e):!0}function V(e){let t=new Map;for(let n of _)B(n,e)&&t.set(n,{name:n,params:{}});for(let n of[v,y])B(n,e)&&t.set(n,{name:n,params:{}});let n=e.tools;if(Array.isArray(n)&&n.every(e=>z(e)))for(let r of n)B(r.name,e)&&t.set(r.name,{name:r.name,params:M(r.params)});return Array.from(t.values())}function H(e,t){let n=[e?.trim(),t?.trim()].filter(Boolean);return n.length===0?null:{role:`user`,content:[{type:`text`,text:n.join(`
1
+ require("../_virtual/_rolldown/runtime.cjs");const e=require("../types/agent-server/core/base/common.cjs"),t=require("../node_modules/@openhands/typescript-client/dist/client/server-client.cjs");require("../node_modules/@openhands/typescript-client/dist/clients.cjs");const n=require("./agent-server-config.cjs"),r=require("./backend-registry/active-store.cjs"),i=require("./agent-server-client-options.cjs"),a=require("./agent-server-compatibility.cjs"),o=require("../constants/canvas-ui.cjs"),s=require("../constants/child-conversation.cjs"),c=require("./conversation-metadata-store.cjs"),l=require("../node_modules/@openhands/typescript-client/dist/models/acp.cjs");require("../node_modules/@openhands/typescript-client/dist/index.cjs");const u=require("../node_modules/@openhands/extensions/skills/index.cjs"),d=require("../services/settings.cjs"),f=require("../constants/acp-providers.cjs"),p=require("./backend-registry/auth.cjs"),m=require("./settings-service/settings-service.api.cjs"),h=require("../constants/llm-subscription.cjs"),g=require("./llm-subscription-service.cjs"),_=require("./canvas-ui-client-tool.cjs"),v=require("./launch-child-conversation-client-tool.cjs");var ee=[`terminal`,`file_editor`,`task_tracker`],y=`browser_tool_set`,b=`task_tool_set`;function x(){return!0}function S(e){if(typeof e==`string`){let t=e.trim();if(!t)return null;try{return S(JSON.parse(t))}catch{return null}}if(!e||typeof e!=`object`||Array.isArray(e))return null;let t=e;return!t.services||typeof t.services!=`object`?null:t}async function C(){let e;try{e=i.getAgentServerClientOptions({timeout:3e3})}catch{return null}let n=S(a.getCachedAgentServerInfo({host:e.host})?.runtime_services);if(n)return n;try{return S((await new t.ServerClient(e).getServerInfo()).runtime_services)}catch{return null}}function w(e){let t=S(e);if(!t?.services)return;let n=[];n.push(`<RUNTIME_SERVICES>`),t.mode?n.push(`You are running inside an agent-canvas dev stack started in '${t.mode}' mode.`):n.push(`You are running inside an agent-canvas dev stack.`),n.push(`The following services are reachable from your sandbox. URLs are written`,`from your point of view (i.e., as you should curl/fetch them).`,``);let{agent_server:r,ingress:i,automation:a}=t.services,{frontend:o}=t.services;r?.url_from_agent&&n.push(`* Agent Server (you): ${r.url_from_agent}`,` ${r.description??`The agent-server hosting your tool calls.`}`),i?.url_from_agent&&n.push(`* Ingress: ${i.url_from_agent}`,` ${i.description??`Unified entry point for browser-facing traffic.`}`),o?.url_from_agent&&n.push(`* Frontend: ${o.url_from_agent}`,` ${o.description??`Frontend dev server.`}`),a?.url_from_agent?(n.push(`* Automation backend: ${a.url_from_agent}`,` ${a.description??`OpenHands Automations service.`}`),a.docs_url&&n.push(` Docs: ${a.docs_url}`),a.openapi_url&&n.push(` OpenAPI: ${a.openapi_url}`),a.auth_env_var&&n.push(` Auth: header 'X-Session-API-Key: $${a.auth_env_var}'`)):n.push(`* Automation backend: not running in this dev mode (skip /api/automation calls).`);let s=r?.url_from_agent;return n.push(``,`Trust this block over guessing: do not assume any other URLs are running.`),s&&n.push(`In particular, ${s} inside your sandbox is the Agent Server`,`you are running inside of — NOT the automation backend.`),n.push(`</RUNTIME_SERVICES>`),n.join(`
2
+ `)}function T(e){let{host:t}=i.getAgentServerClientOptions();return`${t}/api/conversations/${e}`}function E(e){return`Conversation ${e.slice(0,5)}`}function D(t){let r=c.getStoredConversationMetadata(t.id),a=t.agent?.kind===`ACPAgent`,o=a?t.tags?.acpserver??t.agent?.acp_server??null:null;return{id:t.id,created_by_user_id:null,selected_repository:r?.selected_repository??null,selected_branch:r?.selected_branch??null,git_provider:r?.git_provider??null,selected_workspace:r?.selected_workspace??null,active_profile:r?.active_profile??null,title:t.title?.trim()?t.title:E(t.id),trigger:null,pr_number:[],agent_kind:a?`acp`:`openhands`,acp_server:o,tags:t.tags??null,launched_agent_profile:t.launched_agent_profile??null,llm_model:a?f.resolveEffectiveAcpModel({runtimeName:t.current_model_name,runtimeId:t.current_model_id,configured:t.agent?.acp_model,sdkLlm:t.agent?.llm?.model}):t.agent?.llm?.model??d.DEFAULT_SETTINGS.llm_model,metrics:t.metrics?{accumulated_cost:t.metrics.accumulated_cost??null,max_budget_per_task:t.metrics.max_budget_per_task??null,accumulated_token_usage:t.metrics.accumulated_token_usage?{prompt_tokens:t.metrics.accumulated_token_usage.prompt_tokens??0,completion_tokens:t.metrics.accumulated_token_usage.completion_tokens??0,cache_read_tokens:t.metrics.accumulated_token_usage.cache_read_tokens??0,cache_write_tokens:t.metrics.accumulated_token_usage.cache_write_tokens??0,context_window:t.metrics.accumulated_token_usage.context_window??0,per_turn_token:t.metrics.accumulated_token_usage.per_turn_token??0}:null}:null,created_at:t.created_at,updated_at:t.updated_at,execution_status:t.execution_status??e.ExecutionStatus.IDLE,sandbox_status:t.sandbox_status??null,conversation_url:T(t.id),session_api_key:i.getAgentServerClientOptions().apiKey??null,sandbox_id:null,workspace:{working_dir:t.workspace?.working_dir??n.getAgentServerWorkingDir()},public:!1,sub_conversation_ids:[]}}function O(e){return{items:e.items.map(D),next_page_id:e.next_page_id??null}}var k=`acpserver`,te=`automationtrigger`,A=`automationid`,j=`automationname`,M=`automationrunid`,N=[te,A,j,M],P=new Set([k,A,M,`title`,`git_provider`,`repo_name`,`repo`,`repository`,`selected_branch`,`branch`,`archiveworkspacepath`,`workspace`,`working_dir`]),F=[`origin`];function I(e){if(!e)return[];let t=e=>{let t=F.indexOf(e.trim().toLowerCase());return t===-1?1/0:t};return Object.entries(e).filter(([e,t])=>!P.has(e.trim().toLowerCase())&&typeof t==`string`&&t.trim().length>0).sort(([e],[n])=>{let r=t(e),i=t(n);return r===i?e.localeCompare(n):r-i})}var L=`gAAAAA`,R=new Set([`schema_version`,`agent_settings`,`workspace`,`conversation_id`,`initial_message`,`plugins`]);function z(e){return!e||typeof e!=`object`||Array.isArray(e)?{}:structuredClone(e)}function B(e){if(typeof e!=`string`)return;let t=e.trim();return t.length>0?t:void 0}function V(e){return!!e&&typeof e==`object`&&!Array.isArray(e)}function H(e){return typeof e==`string`?e.startsWith(L):Array.isArray(e)?e.some(H):V(e)?Object.values(e).some(H):!1}function U(e){return V(e)?Object.values(e).some(H):!1}function W(e){return e.confirmation_mode===!0?e.security_analyzer===`llm`?{kind:`ConfirmRisky`,threshold:`HIGH`,confirm_unknown:!0}:{kind:`AlwaysConfirm`}:{kind:`NeverConfirm`}}function G(e){switch(e.security_analyzer){case`llm`:return{kind:`LLMSecurityAnalyzer`};case`pattern`:return{kind:`PatternSecurityAnalyzer`};case`policy_rail`:return{kind:`PolicyRailSecurityAnalyzer`};default:return}}function ne(e){return!!e&&typeof e==`object`&&!Array.isArray(e)&&typeof e.name==`string`}function K(e,t){return e===y?x()&&a.isAgentServerToolAvailable(e):e===b?t.enable_sub_agents===!0&&a.isAgentServerToolAvailable(e):!0}function q(e){let t=new Map;for(let n of ee)K(n,e)&&t.set(n,{name:n,params:{}});for(let n of[y,b])K(n,e)&&t.set(n,{name:n,params:{}});let n=e.tools;if(Array.isArray(n)&&n.every(e=>ne(e)))for(let r of n)K(r.name,e)&&t.set(r.name,{name:r.name,params:z(r.params)});return Array.from(t.values())}function J(e,t){let n=[e?.trim(),t?.trim()].filter(Boolean);return n.length===0?null:{role:`user`,content:[{type:`text`,text:n.join(`
3
3
 
4
- `)}],run:!0}}function U(){return l.default.map(e=>{let t=e.triggers?.length>0?{type:`keyword`,keywords:e.triggers}:null;return{name:e.name,content:e.content,trigger:t,source:`public`,description:e.description??null,is_agentskills_format:!0,...e.license?{license:e.license}:{},...e.compatibility?{compatibility:e.compatibility}:{}}})}function W(e,t,n=[]){let r=C(t),i=M(e.agent_context),a=Array.isArray(i.skills)?i.skills:[],o=new Set(n),s=[...a,...U()].filter(e=>typeof e.name!=`string`||!o.has(e.name));return{...i,skills:s,load_public_skills:!1,load_user_skills:!0,load_project_skills:!0,...r?{system_message_suffix:r}:{}}}function G(e){return M(e.agent_settings).agent_kind===`acp`}function K(e){let t=M(e.agent_settings).acp_server;return typeof t==`string`&&t.length>0?t:void 0}function q(e){let t=e.acp_command;if(!(Array.isArray(t)&&t.length===0)&&t!==void 0)return t;let n=d.getAcpProvider(typeof e.acp_server==`string`?e.acp_server:void 0);return n?[...n.default_command]:t}function J(e,t){let n=M(e.agent_settings),r={agent_kind:`acp`,agent_context:W(n,t,e.disabled_skills)};for(let e of s.ACP_SETTINGS_KEYS){if(e===`acp_model`||e===`acp_env`)continue;let t=e===`acp_command`?q(n):n[e];t!=null&&(r[e]=t)}let i=M(n.mcp_config);Object.keys(i).length>0&&(r.mcp_config=i);let a=typeof n.acp_server==`string`?n.acp_server:void 0,o=d.resolveEffectiveAcpModel({configured:n.acp_model,providerDefault:d.getAcpPreferredDefaultModel(a)});return o&&(r.acp_model=o),r}function Y(e,t){let n=M(e.agent_settings),r=M(n.llm);r.model=typeof r.model==`string`&&r.model.trim().length>0?r.model:u.DEFAULT_SETTINGS.llm_model,r.stream=!0;let i=N(r.api_key);i?r.api_key=i:delete r.api_key;let a=N(r.base_url);a?r.base_url=a:delete r.base_url,m.isSubscriptionLlmConfig(r)?(r.auth_type=m.LLM_AUTH_TYPE_SUBSCRIPTION,r.subscription_vendor=m.OPENAI_SUBSCRIPTION_VENDOR,delete r.api_key,delete r.base_url):(delete r.auth_type,delete r.subscription_vendor);let o=M(n.mcp_config);Object.keys(o).length===0&&delete n.mcp_config,delete n.acp_server;for(let e of s.ACP_SETTINGS_KEYS)delete n[e];return delete n.acp_env,{...n,llm:r,agent_context:W(n,t,e.disabled_skills),tools:V(n)}}function X(e,t){return G(e)?J(e,t):Y(e,t)}function Z(e){let{settings:t,query:r,conversationInstructions:i,plugins:a,workingDir:o}=e,s=M(t.conversation_settings),c=H(r,i);return j.forEach(e=>delete s[e]),{...s,workspace:{kind:`LocalWorkspace`,working_dir:o??n.getAgentServerWorkingDir()},...c?{initial_message:c}:{},...a?.length?{plugins:a.map(e=>({source:e.source,...e.ref?{ref:e.ref}:{},...e.repo_path?{repo_path:e.repo_path}:{}}))}:{}}}function Q(e){let t=e.encryptedAgentSettings?{...e.settings,agent_settings:e.encryptedAgentSettings}:e.settings,n=G(t),i=e.agentProfileId?e.agentProfileKind:n?`acp`:`openhands`,a=X(t,e.runtimeServicesInfo),s=n?K(t):void 0,c=Z(e.encryptedConversationSettings?{...e,settings:{...e.settings,conversation_settings:e.encryptedConversationSettings}}:e),l={...e.agentProfileId?{agent_profile_id:e.agentProfileId}:{agent_settings:a},workspace:c.workspace,client_tools:i===`openhands`?[g.CANVAS_UI_CLIENT_TOOL]:[],confirmation_policy:L(c),max_iterations:typeof c.max_iterations==`number`?c.max_iterations:500,stuck_detection:!0,autotitle:!0,...e.titleLlmProfile?{title_llm_profile:e.titleLlmProfile}:{},worktree:e.worktree??!0};!e.agentProfileId&&s&&(l.tags={[D]:s}),!e.agentProfileId&&e.secretsEncrypted&&(!n||I(a.mcp_config))&&(l.secrets_encrypted=!0),e.conversationId&&(l.conversation_id=e.conversationId);let u=R(c);u&&(l.security_analyzer=u),c.initial_message&&(l.initial_message=c.initial_message),c.plugins&&(l.plugins=c.plugins),c.hook_config&&(l.hook_config=c.hook_config);let d={...c.tool_module_qualnames??{}};if(delete d[o.LEGACY_CANVAS_UI_TOOL_NAME],delete d[o.CANVAS_UI_CLIENT_TOOL_NAME],Object.keys(d).length>0&&(l.tool_module_qualnames=d),c.agent_definitions&&(l.agent_definitions=c.agent_definitions),e.customSecrets&&e.customSecrets.length>0){let t=r.getEffectiveLocalBackend(),n=t?f.buildAuthHeaders(t):{},i={};for(let t of e.customSecrets){let e={kind:`LookupSecret`,url:`/api/settings/secrets/${encodeURIComponent(t.name)}`,description:t.description};Object.keys(n).length>0&&(e.headers=n),i[t.name]=e}l.secrets=i}return l}var te=`Connect your ChatGPT subscription before starting a conversation with this LLM profile.`;async function $(e){if(m.isSubscriptionLlmConfig(M(e.llm))&&!(await h.default.getOpenAIStatus()).connected)throw Error(te)}async function ne(e){let{SecretsService:t}=await Promise.resolve().then(()=>require("./secrets-service.cjs")),[n,r,i]=await Promise.all([p.default.getSettingsForConversation(),t.getSecrets(),S()]),{agentSettings:a,conversationSettings:o,secretsEncrypted:s}=n;return e.agentProfileId||await $(a),Q({...e,encryptedAgentSettings:a,encryptedConversationSettings:o,secretsEncrypted:s,customSecrets:r,runtimeServicesInfo:i})}function re(){return{hooks:[]}}exports.assertSubscriptionAuthReady=$,exports.buildStartConversationRequestWithEncryptedSettings=ne,exports.emptyHooksResponse=re,exports.getDefaultConversationTitle=T,exports.getDisplayConversationTags=k,exports.toAppConversation=E,exports.toConversationPage=ee;
4
+ `)}],run:!0}}function Y(){return u.default.map(e=>{let t=e.triggers?.length>0?{type:`keyword`,keywords:e.triggers}:null;return{name:e.name,content:e.content,trigger:t,source:`public`,description:e.description??null,is_agentskills_format:!0,...e.license?{license:e.license}:{},...e.compatibility?{compatibility:e.compatibility}:{}}})}function X(e,t,n=[]){let r=w(t),i=z(e.agent_context),a=Array.isArray(i.skills)?i.skills:[],o=new Set(n),s=[...a,...Y()].filter(e=>typeof e.name!=`string`||!o.has(e.name));return{...i,skills:s,load_public_skills:!1,load_user_skills:!0,load_project_skills:!0,...r?{system_message_suffix:r}:{}}}function Z(e){return z(e.agent_settings).agent_kind===`acp`}function re(e){let t=z(e.agent_settings).acp_server;return typeof t==`string`&&t.length>0?t:void 0}function ie(e){let t=e.acp_command;if(!(Array.isArray(t)&&t.length===0)&&t!==void 0)return t;let n=f.getAcpProvider(typeof e.acp_server==`string`?e.acp_server:void 0);return n?[...n.default_command]:t}function ae(e,t){let n=z(e.agent_settings),r={agent_kind:`acp`,agent_context:X(n,t,e.disabled_skills)};for(let e of l.ACP_SETTINGS_KEYS){if(e===`acp_model`||e===`acp_env`)continue;let t=e===`acp_command`?ie(n):n[e];t!=null&&(r[e]=t)}let i=z(n.mcp_config);Object.keys(i).length>0&&(r.mcp_config=i);let a=typeof n.acp_server==`string`?n.acp_server:void 0,o=f.resolveEffectiveAcpModel({configured:n.acp_model,providerDefault:f.getAcpPreferredDefaultModel(a)});return o&&(r.acp_model=o),r}function oe(e,t){let n=z(e.agent_settings),r=z(n.llm);r.model=typeof r.model==`string`&&r.model.trim().length>0?r.model:d.DEFAULT_SETTINGS.llm_model,r.stream=!0;let i=B(r.api_key);i?r.api_key=i:delete r.api_key;let a=B(r.base_url);a?r.base_url=a:delete r.base_url,h.isSubscriptionLlmConfig(r)?(r.auth_type=h.LLM_AUTH_TYPE_SUBSCRIPTION,r.subscription_vendor=h.OPENAI_SUBSCRIPTION_VENDOR,delete r.api_key,delete r.base_url):(delete r.auth_type,delete r.subscription_vendor);let o=z(n.mcp_config);Object.keys(o).length===0&&delete n.mcp_config,delete n.acp_server;for(let e of l.ACP_SETTINGS_KEYS)delete n[e];return delete n.acp_env,{...n,llm:r,agent_context:X(n,t,e.disabled_skills),tools:q(n)}}function se(e,t){return Z(e)?ae(e,t):oe(e,t)}function Q(e){let{settings:t,query:r,conversationInstructions:i,plugins:a,workingDir:o}=e,s=z(t.conversation_settings),c=J(r,i);return R.forEach(e=>delete s[e]),{...s,workspace:{kind:`LocalWorkspace`,working_dir:o??n.getAgentServerWorkingDir()},...c?{initial_message:c}:{},...a?.length?{plugins:a.map(e=>({source:e.source,...e.ref?{ref:e.ref}:{},...e.repo_path?{repo_path:e.repo_path}:{}}))}:{}}}function ce(e){let t=e.encryptedAgentSettings?{...e.settings,agent_settings:e.encryptedAgentSettings}:e.settings,n=Z(t),i=e.agentProfileId?e.agentProfileKind:n?`acp`:`openhands`,a=se(t,e.runtimeServicesInfo),c=n?re(t):void 0,l=Q(e.encryptedConversationSettings?{...e,settings:{...e.settings,conversation_settings:e.encryptedConversationSettings}}:e),u={...e.agentProfileId?{agent_profile_id:e.agentProfileId}:{agent_settings:a},workspace:l.workspace,client_tools:i===`openhands`?[_.CANVAS_UI_CLIENT_TOOL,v.LAUNCH_CHILD_CONVERSATION_CLIENT_TOOL]:[],confirmation_policy:W(l),max_iterations:typeof l.max_iterations==`number`?l.max_iterations:500,stuck_detection:!0,autotitle:!0,...e.titleLlmProfile?{title_llm_profile:e.titleLlmProfile}:{},worktree:e.worktree??!0};!e.agentProfileId&&c&&(u.tags={[k]:c}),!e.agentProfileId&&e.secretsEncrypted&&(!n||U(a.mcp_config))&&(u.secrets_encrypted=!0),e.conversationId&&(u.conversation_id=e.conversationId),e.parentConversationId&&(u.parent_conversation_id=e.parentConversationId);let d=G(l);d&&(u.security_analyzer=d),l.initial_message&&(u.initial_message=l.initial_message),l.plugins&&(u.plugins=l.plugins),l.hook_config&&(u.hook_config=l.hook_config);let f={...l.tool_module_qualnames??{}};if(delete f[o.LEGACY_CANVAS_UI_TOOL_NAME],delete f[o.CANVAS_UI_CLIENT_TOOL_NAME],delete f[s.LAUNCH_CHILD_CONVERSATION_TOOL_NAME],Object.keys(f).length>0&&(u.tool_module_qualnames=f),l.agent_definitions&&(u.agent_definitions=l.agent_definitions),e.customSecrets&&e.customSecrets.length>0){let t=r.getEffectiveLocalBackend(),n=t?p.buildAuthHeaders(t):{},i={};for(let t of e.customSecrets){let e={kind:`LookupSecret`,url:`/api/settings/secrets/${encodeURIComponent(t.name)}`,description:t.description};Object.keys(n).length>0&&(e.headers=n),i[t.name]=e}u.secrets=i}return u}var le=`Connect your ChatGPT subscription before starting a conversation with this LLM profile.`;async function $(e){if(h.isSubscriptionLlmConfig(z(e.llm))&&!(await g.default.getOpenAIStatus()).connected)throw Error(le)}async function ue(e){let{SecretsService:t}=await Promise.resolve().then(()=>require("./secrets-service.cjs")),[n,r,i]=await Promise.all([m.default.getSettingsForConversation(),t.getSecrets(),C()]),{agentSettings:a,conversationSettings:o,secretsEncrypted:s}=n;return e.agentProfileId||await $(a),ce({...e,encryptedAgentSettings:a,encryptedConversationSettings:o,secretsEncrypted:s,customSecrets:r,runtimeServicesInfo:i})}function de(){return{hooks:[]}}exports.AUTOMATION_NAME_TAG_KEY=j,exports.AUTOMATION_TAG_KEYS=N,exports.assertSubscriptionAuthReady=$,exports.buildStartConversationRequestWithEncryptedSettings=ue,exports.emptyHooksResponse=de,exports.getDefaultConversationTitle=E,exports.getDisplayConversationTags=I,exports.toAppConversation=D,exports.toConversationPage=O;
5
5
  //# sourceMappingURL=agent-server-adapter.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent-server-adapter.cjs","names":[],"sources":["../../src/api/agent-server-adapter.ts"],"sourcesContent":["import { ACP_SETTINGS_KEYS } from \"@openhands/typescript-client\";\nimport { ServerClient } from \"@openhands/typescript-client/clients\";\nimport { SKILLS_CATALOG } from \"@openhands/extensions/skills\";\nimport { DEFAULT_SETTINGS } from \"#/services/settings\";\nimport { ExecutionStatus } from \"#/types/agent-server/core\";\nimport { AgentKind, Settings, SettingsValue } from \"#/types/settings\";\nimport {\n getAcpPreferredDefaultModel,\n getAcpProvider,\n resolveEffectiveAcpModel,\n} from \"#/constants/acp-providers\";\nimport { getAgentServerClientOptions } from \"./agent-server-client-options\";\nimport {\n getCachedAgentServerInfo,\n isAgentServerToolAvailable,\n} from \"./agent-server-compatibility\";\nimport { getAgentServerWorkingDir } from \"./agent-server-config\";\nimport { getEffectiveLocalBackend } from \"./backend-registry/active-store\";\nimport { buildAuthHeaders } from \"./backend-registry/auth\";\nimport {\n GetHooksResponse,\n PluginSpec,\n AppConversation,\n AppConversationPage,\n SandboxStatus,\n} from \"./conversation-service/agent-server-conversation-service.types\";\nimport SettingsService from \"./settings-service/settings-service.api\";\nimport { getStoredConversationMetadata } from \"./conversation-metadata-store\";\nimport LLMSubscriptionService from \"./llm-subscription-service\";\nimport {\n LLM_AUTH_TYPE_SUBSCRIPTION,\n OPENAI_SUBSCRIPTION_VENDOR,\n isSubscriptionLlmConfig,\n} from \"#/constants/llm-subscription\";\nimport {\n CANVAS_UI_CLIENT_TOOL,\n CANVAS_UI_CLIENT_TOOL_NAME,\n LEGACY_CANVAS_UI_TOOL_NAME,\n type ClientToolSpec,\n} from \"./canvas-ui-client-tool\";\n\nexport interface DirectConversationInfo {\n id: string;\n title?: string | null;\n created_at: string;\n updated_at: string;\n execution_status?: string | null;\n /** Cloud-only sandbox lifecycle state. Omitted / null for local agent-server conversations. */\n sandbox_status?: string | null;\n metrics?: {\n accumulated_cost?: number | null;\n max_budget_per_task?: number | null;\n accumulated_token_usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n cache_read_tokens?: number;\n cache_write_tokens?: number;\n context_window?: number;\n per_turn_token?: number;\n } | null;\n } | null;\n agent?: {\n /**\n * Pydantic discriminator from the SDK union: ``\"ACPAgent\"`` for ACP CLI\n * subprocesses (model lives on the subprocess via ``acp_model``),\n * ``\"Agent\"`` for direct litellm. Read by {@link toAppConversation}.\n */\n kind?: string | null;\n acp_model?: string | null;\n /**\n * ACP CLI identity (``claude-code`` / ``codex`` / ``gemini-cli``) from the\n * SDK's ``ACPAgent.acp_server`` (#3692). Preferred fallback when the\n * ``acpserver`` tag is absent — e.g. a profile launch doesn't stamp the tag\n * client-side and the server may not repopulate it. Read by {@link toAppConversation}.\n */\n acp_server?: string | null;\n llm?: {\n model?: string | null;\n } | null;\n } | null;\n current_model_id?: string | null;\n current_model_name?: string | null;\n workspace?: {\n working_dir?: string | null;\n } | null;\n /**\n * Arbitrary string-keyed conversation tags surfaced by the agent-server\n * (see ``ConversationInfo.tags``). Canvas only consumes one key today —\n * ``ACP_SERVER_TAG_KEY`` (\"acpserver\") — but the field is typed as a\n * generic record so future readers don't need another wire-shape change.\n * Keys are constrained to ``^[a-z0-9]+$`` by the agent-server validator;\n * values are opaque strings.\n */\n tags?: Record<string, string> | null;\n launched_agent_profile?: {\n agent_profile_id: string;\n revision: number;\n } | null;\n}\n\nconst DEFAULT_TOOL_NAMES = [\"terminal\", \"file_editor\", \"task_tracker\"];\nconst BROWSER_TOOL_SET_NAME = \"browser_tool_set\";\nconst TASK_TOOL_SET_NAME = \"task_tool_set\";\n\nfunction browserToolsEnabled() {\n return import.meta.env.VITE_ENABLE_BROWSER_TOOLS !== \"false\";\n}\n\n/**\n * Shape of the runtime services info served by Agent Canvas backends in\n * `/server_info.runtime_services`. All URLs are written from the agent's point of\n * view, not the browser's. The block is rendered into the agent's system prompt\n * via `AgentContext.system_message_suffix` so the agent knows what's reachable\n * from inside its sandbox without having to probe.\n */\nexport interface RuntimeServicesInfo {\n mode?: string;\n agent_host_alias?: string;\n services?: {\n agent_server?: { description?: string; url_from_agent?: string };\n ingress?: { description?: string; url_from_agent?: string };\n frontend?: {\n kind?: \"vite\" | \"static\";\n description?: string;\n url_from_agent?: string;\n };\n // `vite` is the legacy key name for the frontend entry, accepted for\n // one release while older dev-stack launchers may still emit it.\n vite?: { description?: string; url_from_agent?: string };\n automation?: {\n description?: string;\n url_from_agent?: string;\n api_prefix?: string;\n docs_url?: string;\n openapi_url?: string;\n auth_env_var?: string;\n };\n };\n}\n\nexport function parseRuntimeServicesInfo(\n value: unknown,\n): RuntimeServicesInfo | null {\n if (typeof value === \"string\") {\n const raw = value.trim();\n if (!raw) return null;\n try {\n return parseRuntimeServicesInfo(JSON.parse(raw));\n } catch {\n return null;\n }\n }\n\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return null;\n }\n\n const parsed = value as RuntimeServicesInfo;\n if (!parsed.services || typeof parsed.services !== \"object\") return null;\n return parsed;\n}\n\nexport async function fetchBackendRuntimeServicesInfo(): Promise<RuntimeServicesInfo | null> {\n let clientOptions: ReturnType<typeof getAgentServerClientOptions>;\n try {\n clientOptions = getAgentServerClientOptions({ timeout: 3000 });\n } catch {\n return null;\n }\n\n const cached = parseRuntimeServicesInfo(\n getCachedAgentServerInfo({ host: clientOptions.host })?.runtime_services,\n );\n if (cached) return cached;\n\n try {\n const serverInfo = await new ServerClient(clientOptions).getServerInfo();\n return parseRuntimeServicesInfo(\n (serverInfo as { runtime_services?: unknown }).runtime_services,\n );\n } catch {\n return null;\n }\n}\n\n/**\n * Return the deployment mode from the runtime services info, e.g. \"docker\",\n * \"dev:automation\", etc. Returns `null` when no runtime info is supplied.\n */\nexport function getDeploymentMode(\n runtimeServicesInfo?: RuntimeServicesInfo | null,\n): string | null {\n return runtimeServicesInfo?.mode ?? null;\n}\n\n/**\n * Render the runtime services info into a markdown block suitable for\n * appending to the system prompt via `AgentContext.system_message_suffix`.\n *\n * Returns `undefined` when no runtime info is available, so callers can safely\n * omit the field when the selected backend does not advertise runtime services.\n */\nexport function buildRuntimeServicesSystemSuffix(\n runtimeServicesInfo?: RuntimeServicesInfo | null,\n): string | undefined {\n const info = parseRuntimeServicesInfo(runtimeServicesInfo);\n if (!info?.services) return undefined;\n\n const lines: string[] = [];\n lines.push(\"<RUNTIME_SERVICES>\");\n if (info.mode) {\n lines.push(\n `You are running inside an agent-canvas dev stack started in '${info.mode}' mode.`,\n );\n } else {\n lines.push(\"You are running inside an agent-canvas dev stack.\");\n }\n lines.push(\n \"The following services are reachable from your sandbox. URLs are written\",\n \"from your point of view (i.e., as you should curl/fetch them).\",\n \"\",\n );\n\n const { agent_server, ingress, automation } = info.services;\n const { frontend } = info.services;\n\n if (agent_server?.url_from_agent) {\n lines.push(\n `* Agent Server (you): ${agent_server.url_from_agent}`,\n ` ${agent_server.description ?? \"The agent-server hosting your tool calls.\"}`,\n );\n }\n if (ingress?.url_from_agent) {\n lines.push(\n `* Ingress: ${ingress.url_from_agent}`,\n ` ${ingress.description ?? \"Unified entry point for browser-facing traffic.\"}`,\n );\n }\n if (frontend?.url_from_agent) {\n lines.push(\n `* Frontend: ${frontend.url_from_agent}`,\n ` ${frontend.description ?? \"Frontend dev server.\"}`,\n );\n }\n if (automation?.url_from_agent) {\n lines.push(\n `* Automation backend: ${automation.url_from_agent}`,\n ` ${automation.description ?? \"OpenHands Automations service.\"}`,\n );\n if (automation.docs_url) {\n lines.push(` Docs: ${automation.docs_url}`);\n }\n if (automation.openapi_url) {\n lines.push(` OpenAPI: ${automation.openapi_url}`);\n }\n if (automation.auth_env_var) {\n // X-Session-API-Key is the local convention shared by the agent-server\n // and automation backend (see openhands-automation auth.py).\n lines.push(\n ` Auth: header 'X-Session-API-Key: $${automation.auth_env_var}'`,\n );\n }\n } else {\n lines.push(\n \"* Automation backend: not running in this dev mode (skip /api/automation calls).\",\n );\n }\n\n // Anchor the \"don't guess\" warning to the actual agent-server URL for\n // this stack instead of a hardcoded port. The agent-server listens on\n // different ports across dev modes, and baking the wrong port into the\n // system prompt is exactly the kind of confusion this block is meant to\n // prevent.\n const agentServerUrl = agent_server?.url_from_agent;\n lines.push(\n \"\",\n \"Trust this block over guessing: do not assume any other URLs are running.\",\n );\n if (agentServerUrl) {\n lines.push(\n `In particular, ${agentServerUrl} inside your sandbox is the Agent Server`,\n \"you are running inside of — NOT the automation backend.\",\n );\n }\n lines.push(\"</RUNTIME_SERVICES>\");\n\n return lines.join(\"\\n\");\n}\n\nexport function toConversationUrl(conversationId: string): string {\n // Local-format conversation URL — points at whichever local agent-server\n // is actually serving the conversation (the bundled one when the active\n // selection is cloud).\n const { host } = getAgentServerClientOptions();\n return `${host}/api/conversations/${conversationId}`;\n}\n\n// TODO(i18n): extract \"Conversation\" once we add CONVERSATION$DEFAULT_TITLE\n// with `{{shortId}}` interpolation. Kept as a literal for now to keep the\n// fallback inside this pure adapter rather than fanning out to display sites.\nexport function getDefaultConversationTitle(conversationId: string): string {\n return `Conversation ${conversationId.slice(0, 5)}`;\n}\n\nexport function toAppConversation(\n info: DirectConversationInfo,\n): AppConversation {\n const metadata = getStoredConversationMetadata(info.id);\n // ACPAgent conversations carry a sentinel ``llm`` on older SDKs. Prefer the\n // runtime model fields when available, then the configured ``acp_model`` that\n // Canvas saves for built-in providers. ``agent_kind`` still gates model\n // switching, so surfacing this string is display-only.\n const isAcp = info.agent?.kind === \"ACPAgent\";\n // Only surface ``acp_server`` for ACP conversations even if the wire\n // payload accidentally carries an ``acpserver`` tag on an OpenHands\n // conversation — the chip is identity info for the ACP CLI subprocess,\n // and showing it on a non-ACP conversation would be a lie. Fall back to the\n // agent's own ``acp_server`` (#3692) when the tag is missing — a profile\n // launch doesn't stamp the tag, so tag-only reads would drop the ACP model\n // picker and degrade the chip to a generic \"ACP\" (#1571).\n const acpServer = isAcp\n ? (info.tags?.[ACP_SERVER_TAG_KEY] ?? info.agent?.acp_server ?? null)\n : null;\n return {\n id: info.id,\n created_by_user_id: null,\n selected_repository: metadata?.selected_repository ?? null,\n selected_branch: metadata?.selected_branch ?? null,\n git_provider: metadata?.git_provider ?? null,\n selected_workspace: metadata?.selected_workspace ?? null,\n active_profile: metadata?.active_profile ?? null,\n title: info.title?.trim()\n ? info.title\n : getDefaultConversationTitle(info.id),\n trigger: null,\n pr_number: [],\n agent_kind: isAcp ? \"acp\" : \"openhands\",\n acp_server: acpServer,\n tags: info.tags ?? null,\n launched_agent_profile: info.launched_agent_profile ?? null,\n // Chip path: omit ``providerDefault`` so that when no concrete model\n // resolves, the chip falls back to the provider display name in\n // ConversationCardFooter rather than a registry default the session may\n // not actually be running.\n llm_model: isAcp\n ? resolveEffectiveAcpModel({\n runtimeName: info.current_model_name,\n runtimeId: info.current_model_id,\n configured: info.agent?.acp_model,\n sdkLlm: info.agent?.llm?.model,\n })\n : (info.agent?.llm?.model ?? DEFAULT_SETTINGS.llm_model),\n metrics: info.metrics\n ? {\n accumulated_cost: info.metrics.accumulated_cost ?? null,\n max_budget_per_task: info.metrics.max_budget_per_task ?? null,\n accumulated_token_usage: info.metrics.accumulated_token_usage\n ? {\n prompt_tokens:\n info.metrics.accumulated_token_usage.prompt_tokens ?? 0,\n completion_tokens:\n info.metrics.accumulated_token_usage.completion_tokens ?? 0,\n cache_read_tokens:\n info.metrics.accumulated_token_usage.cache_read_tokens ?? 0,\n cache_write_tokens:\n info.metrics.accumulated_token_usage.cache_write_tokens ?? 0,\n context_window:\n info.metrics.accumulated_token_usage.context_window ?? 0,\n per_turn_token:\n info.metrics.accumulated_token_usage.per_turn_token ?? 0,\n }\n : null,\n }\n : null,\n created_at: info.created_at,\n updated_at: info.updated_at,\n execution_status:\n (info.execution_status as AppConversation[\"execution_status\"]) ??\n ExecutionStatus.IDLE,\n sandbox_status: (info.sandbox_status as SandboxStatus | null) ?? null,\n conversation_url: toConversationUrl(info.id),\n session_api_key: getAgentServerClientOptions().apiKey ?? null,\n sandbox_id: null,\n workspace: {\n working_dir: info.workspace?.working_dir ?? getAgentServerWorkingDir(),\n },\n public: false,\n sub_conversation_ids: [],\n };\n}\n\nexport function toConversationPage(data: {\n items: DirectConversationInfo[];\n next_page_id?: string | null;\n}): AppConversationPage {\n return {\n items: data.items.map(toAppConversation),\n next_page_id: data.next_page_id ?? null,\n };\n}\n\ntype SettingsRecord = Record<string, unknown>;\n\ninterface AgentToolSpec {\n name: string;\n params: SettingsRecord;\n}\n\ntype AgentSettingsPayload = SettingsRecord & {\n llm?: SettingsRecord;\n agent_context: SettingsRecord;\n tools?: AgentToolSpec[];\n};\n\ninterface LocalWorkspacePayload {\n kind: \"LocalWorkspace\";\n working_dir: string;\n}\n\ninterface InitialMessagePayload {\n role: \"user\";\n content: Array<{ type: \"text\"; text: string }>;\n run: true;\n}\n\ntype ConversationSettingsPayload = SettingsRecord & {\n workspace: LocalWorkspacePayload;\n initial_message?: InitialMessagePayload;\n};\n\nexport const ACP_SERVER_TAG_KEY = \"acpserver\";\n\n/**\n * Conversation tag keys Canvas itself stamps/consumes for internal routing.\n * They are already surfaced through dedicated UI (the ACP provider chip), so\n * the generic tag-chip display filters them out.\n */\nexport const RESERVED_CONVERSATION_TAG_KEYS: ReadonlySet<string> = new Set([\n ACP_SERVER_TAG_KEY,\n]);\n\n/**\n * User-facing subset of a conversation's server-side tags: everything except\n * {@link RESERVED_CONVERSATION_TAG_KEYS}, as stable ``[key, value]`` entries\n * sorted by key so chip order doesn't shuffle between refetches.\n */\nexport function getDisplayConversationTags(\n tags: Record<string, string> | null | undefined,\n): Array<[string, string]> {\n if (!tags) {\n return [];\n }\n return Object.entries(tags)\n .filter(([key]) => !RESERVED_CONVERSATION_TAG_KEYS.has(key))\n .sort(([a], [b]) => a.localeCompare(b));\n}\n\nconst FERNET_TOKEN_PREFIX = \"gAAAAA\";\n\nconst CONVERSATION_SETTINGS_METADATA_KEYS = new Set([\n \"schema_version\",\n \"agent_settings\",\n \"workspace\",\n \"conversation_id\",\n \"initial_message\",\n \"plugins\",\n]);\n\nfunction toRecord(value: unknown): SettingsRecord {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return {};\n }\n\n return structuredClone(value as SettingsRecord);\n}\n\nfunction normalizeSecretString(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction hasEncryptedString(value: unknown): boolean {\n if (typeof value === \"string\") {\n return value.startsWith(FERNET_TOKEN_PREFIX);\n }\n if (Array.isArray(value)) {\n return value.some(hasEncryptedString);\n }\n if (isPlainRecord(value)) {\n return Object.values(value).some(hasEncryptedString);\n }\n return false;\n}\n\nfunction hasEncryptedMcpSecrets(mcpConfig: unknown): boolean {\n if (!isPlainRecord(mcpConfig)) {\n return false;\n }\n\n return Object.values(mcpConfig).some(hasEncryptedString);\n}\n\nfunction getConversationConfirmationPolicy(\n conversationSettings: SettingsRecord,\n) {\n if (conversationSettings.confirmation_mode !== true) {\n return { kind: \"NeverConfirm\" };\n }\n\n if (conversationSettings.security_analyzer === \"llm\") {\n return { kind: \"ConfirmRisky\", threshold: \"HIGH\", confirm_unknown: true };\n }\n\n return { kind: \"AlwaysConfirm\" };\n}\n\nfunction getConversationSecurityAnalyzer(conversationSettings: SettingsRecord) {\n switch (conversationSettings.security_analyzer) {\n case \"llm\":\n return { kind: \"LLMSecurityAnalyzer\" };\n case \"pattern\":\n return { kind: \"PatternSecurityAnalyzer\" };\n case \"policy_rail\":\n return { kind: \"PolicyRailSecurityAnalyzer\" };\n default:\n return undefined;\n }\n}\n\nfunction isToolRecord(\n value: unknown,\n): value is { name: string; params?: unknown } {\n return (\n !!value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n typeof (value as { name?: unknown }).name === \"string\"\n );\n}\n\nfunction shouldIncludeTool(name: string, agentSettings: SettingsRecord) {\n if (name === BROWSER_TOOL_SET_NAME) {\n return browserToolsEnabled() && isAgentServerToolAvailable(name);\n }\n\n if (name === TASK_TOOL_SET_NAME) {\n return (\n agentSettings.enable_sub_agents === true &&\n isAgentServerToolAvailable(name)\n );\n }\n\n return true;\n}\n\nfunction getAgentTools(agentSettings: SettingsRecord): AgentToolSpec[] {\n const tools = new Map<string, AgentToolSpec>();\n\n for (const name of DEFAULT_TOOL_NAMES) {\n if (shouldIncludeTool(name, agentSettings)) {\n tools.set(name, { name, params: {} });\n }\n }\n\n for (const name of [BROWSER_TOOL_SET_NAME, TASK_TOOL_SET_NAME]) {\n if (shouldIncludeTool(name, agentSettings)) {\n tools.set(name, { name, params: {} });\n }\n }\n\n const configuredTools = agentSettings.tools;\n if (\n Array.isArray(configuredTools) &&\n configuredTools.every((tool) => isToolRecord(tool))\n ) {\n for (const tool of configuredTools) {\n if (shouldIncludeTool(tool.name, agentSettings)) {\n tools.set(tool.name, {\n name: tool.name,\n params: toRecord(tool.params),\n });\n }\n }\n }\n\n return Array.from(tools.values());\n}\n\nfunction buildInitialMessage(\n query?: string,\n conversationInstructions?: string,\n): InitialMessagePayload | null {\n const parts = [query?.trim(), conversationInstructions?.trim()].filter(\n Boolean,\n );\n if (parts.length === 0) {\n return null;\n }\n\n return {\n role: \"user\",\n content: [{ type: \"text\", text: parts.join(\"\\n\\n\") }],\n run: true,\n };\n}\n\n/**\n * Shape of a bundled skill entry passed to the agent-server SDK via\n * `agent_context.skills`. Mirrors the SDK's `Skill` model fields that\n * the server uses for trigger matching, activation, and system-prompt\n * injection.\n */\ninterface BundledSkill {\n name: string;\n content: string;\n trigger: { type: \"keyword\"; keywords: string[] } | null;\n source: string;\n description: string | null;\n is_agentskills_format: true;\n license?: string;\n compatibility?: string;\n}\n\n/**\n * Convert the bundled `SKILLS_CATALOG` entries into the SDK `Skill` JSON\n * shape so the agent-server can perform trigger matching, skill activation,\n * and system-prompt injection without cloning the extensions repo.\n *\n * The SDK discriminates triggers via `{ type: \"keyword\", keywords: [...] }`.\n * Skills with no triggers get `trigger: null` (always-active / on-demand).\n */\nfunction buildBundledSkills(): BundledSkill[] {\n return SKILLS_CATALOG.map((entry) => {\n const trigger: BundledSkill[\"trigger\"] =\n entry.triggers?.length > 0\n ? { type: \"keyword\", keywords: entry.triggers }\n : null;\n\n // Use the absolute path to the skill's SKILL.md so the Python\n // agent-server can resolve bundled resources (scripts/, references/).\n // Falls back to \"public\" in library builds where the path isn't known.\n const source = __EXTENSIONS_SKILLS_DIR__\n ? `${__EXTENSIONS_SKILLS_DIR__}/${entry.name}/SKILL.md`\n : \"public\";\n\n return {\n name: entry.name,\n content: entry.content,\n trigger,\n source,\n description: entry.description ?? null,\n is_agentskills_format: true as const,\n ...(entry.license ? { license: entry.license } : {}),\n ...(entry.compatibility ? { compatibility: entry.compatibility } : {}),\n };\n });\n}\n\nfunction buildAgentContext(\n agentSettings: SettingsRecord,\n runtimeServicesInfo?: RuntimeServicesInfo | null,\n disabledSkills: string[] = [],\n): SettingsRecord {\n const runtimeServicesSuffix =\n buildRuntimeServicesSystemSuffix(runtimeServicesInfo);\n const existingContext = toRecord(agentSettings.agent_context);\n\n // Merge bundled public skills with any skills already present in the\n // agent context (e.g. user-defined skills set via the settings API).\n const existingSkills = Array.isArray(existingContext.skills)\n ? (existingContext.skills as SettingsRecord[])\n : [];\n const disabledSkillNames = new Set(disabledSkills);\n const mergedSkills = [...existingSkills, ...buildBundledSkills()].filter(\n (skill) =>\n typeof skill.name !== \"string\" || !disabledSkillNames.has(skill.name),\n );\n\n return {\n ...existingContext,\n // Public skills are bundled at build time from the @openhands/extensions\n // npm package and passed directly in agent_context.skills. Setting\n // load_public_skills to false tells the agent-server SDK to skip its own\n // extensions-repo clone — the frontend is the sole source of public\n // skills now.\n //\n // Migration: the former VITE_LOAD_PUBLIC_SKILLS env var was removed\n // because bundled skills have no clone latency. Users who previously set\n // VITE_LOAD_PUBLIC_SKILLS=false to avoid clone delays no longer need it.\n skills: mergedSkills,\n load_public_skills: false,\n load_user_skills: true,\n load_project_skills: true,\n ...(runtimeServicesSuffix\n ? { system_message_suffix: runtimeServicesSuffix }\n : {}),\n };\n}\n\nfunction isAcpAgent(settings: Settings): boolean {\n const agentSettings = toRecord(settings.agent_settings);\n return agentSettings.agent_kind === \"acp\";\n}\n\nfunction getAcpServerTag(settings: Settings): string | undefined {\n const agentSettings = toRecord(settings.agent_settings);\n const value = agentSettings.acp_server;\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction resolveAcpCommand(agentSettings: SettingsRecord): unknown {\n const cmd = agentSettings.acp_command;\n const isEmpty = Array.isArray(cmd) && cmd.length === 0;\n const noCommand = cmd === undefined;\n if (!isEmpty && !noCommand) {\n return cmd;\n }\n\n const serverKey =\n typeof agentSettings.acp_server === \"string\"\n ? agentSettings.acp_server\n : undefined;\n const provider = getAcpProvider(serverKey);\n return provider ? [...provider.default_command] : cmd;\n}\n\nfunction buildConfiguredAcpAgentSettings(\n settings: Settings,\n runtimeServicesInfo?: RuntimeServicesInfo | null,\n): AgentSettingsPayload {\n const agentSettings = toRecord(settings.agent_settings);\n const payload: AgentSettingsPayload = {\n agent_kind: \"acp\",\n agent_context: buildAgentContext(\n agentSettings,\n runtimeServicesInfo,\n settings.disabled_skills,\n ),\n };\n\n // TODO(#1019): set ``acp_isolate_data_dir: true`` here for a containerized\n // backend so concurrent same-provider conversations don't race on a shared\n // HOME. The SDK supports it (software-agent-sdk#3492), but the released\n // ``@openhands/typescript-client`` (1.24.3) doesn't surface it on\n // ``ACPAgentSettings`` yet, so sending it risks a validation error on older\n // servers. Cloud grouping isolation is separate (agent-canvas#1016).\n\n for (const key of ACP_SETTINGS_KEYS) {\n // ``acp_model`` is resolved separately below so a saved ``null`` still\n // falls back to the provider's default rather than being dropped.\n if (key === \"acp_model\") continue;\n // ``acp_env`` is deprecated — provider creds now route via ``request.secrets``.\n if (key === \"acp_env\") continue;\n const value =\n key === \"acp_command\"\n ? resolveAcpCommand(agentSettings)\n : agentSettings[key];\n if (value !== undefined && value !== null) {\n payload[key] = value;\n }\n }\n\n // ``mcp_config`` is a shared field (not in ACP_SETTINGS_KEYS): forward it\n // so the ACP subprocess connects to the configured MCP servers at session\n // creation. Only include it when it actually carries servers — an empty or\n // malformed value is dropped rather than sending ``mcp_config: {}``.\n const mcpConfig = toRecord(agentSettings.mcp_config);\n if (Object.keys(mcpConfig).length > 0) {\n payload.mcp_config = mcpConfig;\n }\n\n // Saved settings may carry ``acp_model: null`` (existing users predating\n // the default-model registry, or saved fields the agent-server stripped).\n // Fall back to the *preferred* default (Vertex-safe for Gemini) so the\n // conversation starts with whatever the Settings → Agent UI shows — without\n // that, the form's displayed default would silently not take effect at\n // runtime until the user re-saved the page.\n const serverKey =\n typeof agentSettings.acp_server === \"string\"\n ? agentSettings.acp_server\n : undefined;\n const effectiveModel = resolveEffectiveAcpModel({\n configured: agentSettings.acp_model as string | null | undefined,\n providerDefault: getAcpPreferredDefaultModel(serverKey),\n });\n if (effectiveModel) {\n payload.acp_model = effectiveModel;\n }\n\n return payload;\n}\n\nfunction buildConfiguredOpenHandsAgentSettings(\n settings: Settings,\n runtimeServicesInfo?: RuntimeServicesInfo | null,\n): AgentSettingsPayload {\n const agentSettings = toRecord(settings.agent_settings);\n const llm = toRecord(agentSettings.llm);\n\n llm.model =\n typeof llm.model === \"string\" && llm.model.trim().length > 0\n ? llm.model\n : DEFAULT_SETTINGS.llm_model;\n\n // Stream assistant tokens (parity with ACP agents). The agent-server only\n // emits StreamingDeltaEvents for SDK LLM agents when an LLM has stream=True.\n llm.stream = true;\n\n const apiKey = normalizeSecretString(llm.api_key);\n if (apiKey) {\n llm.api_key = apiKey;\n } else {\n delete llm.api_key;\n }\n\n const baseUrl = normalizeSecretString(llm.base_url);\n if (baseUrl) {\n llm.base_url = baseUrl;\n } else {\n delete llm.base_url;\n }\n\n if (isSubscriptionLlmConfig(llm)) {\n llm.auth_type = LLM_AUTH_TYPE_SUBSCRIPTION;\n llm.subscription_vendor = OPENAI_SUBSCRIPTION_VENDOR;\n delete llm.api_key;\n delete llm.base_url;\n } else {\n delete llm.auth_type;\n delete llm.subscription_vendor;\n }\n\n const mcpConfig = toRecord(agentSettings.mcp_config);\n if (Object.keys(mcpConfig).length === 0) {\n delete agentSettings.mcp_config;\n }\n\n delete agentSettings.acp_server;\n for (const key of ACP_SETTINGS_KEYS) {\n delete agentSettings[key];\n }\n // ``acp_env`` is no longer a forwarded ACP setting (provider creds ride the\n // Secrets panel), but a legacy value may linger on persisted settings —\n // scrub it so it never leaks onto the OpenHands payload.\n delete agentSettings.acp_env;\n\n return {\n ...agentSettings,\n llm,\n agent_context: buildAgentContext(\n agentSettings,\n runtimeServicesInfo,\n settings.disabled_skills,\n ),\n tools: getAgentTools(agentSettings),\n };\n}\n\nfunction buildConfiguredAgentSettings(\n settings: Settings,\n runtimeServicesInfo?: RuntimeServicesInfo | null,\n): AgentSettingsPayload {\n return isAcpAgent(settings)\n ? buildConfiguredAcpAgentSettings(settings, runtimeServicesInfo)\n : buildConfiguredOpenHandsAgentSettings(settings, runtimeServicesInfo);\n}\n\nfunction buildConfiguredConversationSettings(options: {\n settings: Settings;\n query?: string;\n conversationInstructions?: string;\n plugins?: PluginSpec[];\n workingDir?: string;\n}): ConversationSettingsPayload {\n const { settings, query, conversationInstructions, plugins, workingDir } =\n options;\n const conversationSettings = toRecord(settings.conversation_settings);\n const initialMessage = buildInitialMessage(query, conversationInstructions);\n\n CONVERSATION_SETTINGS_METADATA_KEYS.forEach(\n (key) => delete conversationSettings[key],\n );\n\n const payload: ConversationSettingsPayload = {\n ...conversationSettings,\n workspace: {\n kind: \"LocalWorkspace\",\n working_dir: workingDir ?? getAgentServerWorkingDir(),\n },\n ...(initialMessage ? { initial_message: initialMessage } : {}),\n ...(plugins?.length\n ? {\n plugins: plugins.map((plugin) => ({\n source: plugin.source,\n ...(plugin.ref ? { ref: plugin.ref } : {}),\n ...(plugin.repo_path ? { repo_path: plugin.repo_path } : {}),\n })),\n }\n : {}),\n };\n\n return payload;\n}\n\ninterface LookupSecret {\n kind: \"LookupSecret\";\n url: string;\n headers?: Record<string, string>;\n description?: string;\n}\n\ntype StartConversationPayload = Record<string, unknown> & {\n // Omitted when launching via ``agent_profile_id`` — the two are mutually\n // exclusive agent sources; the server resolves the profile server-side.\n agent_settings?: AgentSettingsPayload;\n agent_profile_id?: string;\n workspace: LocalWorkspacePayload;\n confirmation_policy: SettingsRecord;\n security_analyzer?: SettingsRecord;\n initial_message?: InitialMessagePayload;\n max_iterations: number;\n stuck_detection: true;\n autotitle: true;\n title_llm_profile?: string;\n worktree: boolean;\n secrets_encrypted?: true;\n conversation_id?: string;\n secrets?: Record<string, LookupSecret>;\n tags?: Record<string, string>;\n client_tools: ClientToolSpec[];\n tool_module_qualnames?: Record<string, string>;\n};\n\nexport interface StartConversationOptions {\n settings: Settings;\n query?: string;\n conversationInstructions?: string;\n plugins?: PluginSpec[];\n conversationId?: string;\n workingDir?: string;\n worktree?: boolean;\n encryptedAgentSettings?: Record<string, SettingsValue>;\n encryptedConversationSettings?: Record<string, SettingsValue>;\n secretsEncrypted?: boolean;\n customSecrets?: Array<{ name: string; description?: string }>;\n // When set, the conversation launches from this AgentProfile (resolved\n // server-side) instead of an inline ``agent_settings`` dump (#3727).\n agentProfileId?: string;\n agentProfileKind?: AgentKind;\n titleLlmProfile?: string;\n runtimeServicesInfo?: RuntimeServicesInfo | null;\n}\n\nexport function buildStartConversationRequest(\n options: StartConversationOptions,\n): StartConversationPayload {\n const sourceAgentSettings = options.encryptedAgentSettings\n ? { ...options.settings, agent_settings: options.encryptedAgentSettings }\n : options.settings;\n\n const acpMode = isAcpAgent(sourceAgentSettings);\n const launchAgentKind = options.agentProfileId\n ? options.agentProfileKind\n : acpMode\n ? \"acp\"\n : \"openhands\";\n const agentSettings = buildConfiguredAgentSettings(\n sourceAgentSettings,\n options.runtimeServicesInfo,\n );\n const acpServerTag = acpMode\n ? getAcpServerTag(sourceAgentSettings)\n : undefined;\n\n const sourceConversationOptions = options.encryptedConversationSettings\n ? {\n ...options,\n settings: {\n ...options.settings,\n conversation_settings: options.encryptedConversationSettings,\n },\n }\n : options;\n\n const conversationSettings = buildConfiguredConversationSettings(\n sourceConversationOptions,\n );\n\n const payload: StartConversationPayload = {\n // ``agent_profile_id`` and ``agent_settings`` are mutually exclusive agent\n // sources; the profile path lets the server resolve the profile (#3727).\n //\n // Enrichment boundary: on the profile path the server rebuilds the agent\n // purely from the stored profile fields, so the client-owned enrichments\n // this adapter folds into ``agent_settings`` do NOT apply. The exec toolset\n // (terminal/file_editor/task_tracker) and public-skill loading are the\n // server/SDK's responsibility to restore on the profile path — tracked in\n // software-agent-sdk#3967 (profile resolution must attach the default\n // toolset + public skills, else a profile-launched OpenHands agent has only\n // Finish/Think). The dev ``RUNTIME_SERVICES`` system-message suffix remains\n // agent-settings-only; the Canvas UI tool is a top-level client tool and\n // therefore works on both inline-agent and profile launch paths.\n //\n // Persistent memory is NOT on that boundary: ``load_memory`` is a global\n // user preference, so the agent-server stamps the stored\n // ``agent_settings.agent_context.load_memory`` onto the profile-resolved\n // agent the same way it already applies the global ``mcp_config``. The\n // toggle therefore applies to both launch paths, and the client must not\n // re-send it here (``agent_profile_id`` and ``agent_settings`` are\n // mutually exclusive).\n ...(options.agentProfileId\n ? { agent_profile_id: options.agentProfileId }\n : { agent_settings: agentSettings }),\n workspace: conversationSettings.workspace,\n client_tools:\n launchAgentKind === \"openhands\" ? [CANVAS_UI_CLIENT_TOOL] : [],\n confirmation_policy:\n getConversationConfirmationPolicy(conversationSettings),\n max_iterations:\n typeof conversationSettings.max_iterations === \"number\"\n ? conversationSettings.max_iterations\n : 500,\n stuck_detection: true,\n autotitle: true,\n ...(options.titleLlmProfile\n ? { title_llm_profile: options.titleLlmProfile }\n : {}),\n worktree: options.worktree ?? true,\n };\n\n // A profile launch resolves the ACP server server-side, so don't stamp the\n // tag from current settings (it may not match the launched profile).\n if (!options.agentProfileId && acpServerTag) {\n payload.tags = { [ACP_SERVER_TAG_KEY]: acpServerTag };\n }\n\n // ``secrets_encrypted`` makes the agent-server decrypt request secrets at\n // conversation start. Non-ACP conversations need it for encrypted LLM keys.\n // ACP normally carries provider credentials as LookupSecrets, so avoid\n // forcing a cipher on fresh ACP-only backends. The exception is MCP:\n // encrypted settings round-trip mcp_config secrets as Fernet tokens,\n // and ACP forwards mcp_config directly to the subprocess.\n if (\n !options.agentProfileId &&\n options.secretsEncrypted &&\n (!acpMode || hasEncryptedMcpSecrets(agentSettings.mcp_config))\n ) {\n payload.secrets_encrypted = true;\n }\n\n if (options.conversationId) {\n payload.conversation_id = options.conversationId;\n }\n\n const securityAnalyzer =\n getConversationSecurityAnalyzer(conversationSettings);\n if (securityAnalyzer) {\n payload.security_analyzer = securityAnalyzer;\n }\n\n if (conversationSettings.initial_message) {\n payload.initial_message = conversationSettings.initial_message;\n }\n\n if (conversationSettings.plugins) {\n payload.plugins = conversationSettings.plugins;\n }\n\n if (conversationSettings.hook_config) {\n payload.hook_config = conversationSettings.hook_config;\n }\n\n const toolModuleQualnames = {\n ...((conversationSettings.tool_module_qualnames as\n | Record<string, string>\n | undefined) ?? {}),\n };\n delete toolModuleQualnames[LEGACY_CANVAS_UI_TOOL_NAME];\n delete toolModuleQualnames[CANVAS_UI_CLIENT_TOOL_NAME];\n if (Object.keys(toolModuleQualnames).length > 0) {\n payload.tool_module_qualnames = toolModuleQualnames;\n }\n\n if (conversationSettings.agent_definitions) {\n payload.agent_definitions = conversationSettings.agent_definitions;\n }\n\n // Every saved secret rides as a LookupSecret the agent-server resolves back\n // from its own store at spawn time — ``request.secrets`` is the sole channel,\n // uniform for ACP and non-ACP (agent-canvas#1039). For ACP the resolution\n // runs off the event loop (software-agent-sdk#3510, >=1.25.0), so the loopback\n // fetch can't deadlock.\n if (options.customSecrets && options.customSecrets.length > 0) {\n const backend = getEffectiveLocalBackend();\n const headers = backend ? buildAuthHeaders(backend) : {};\n\n const secrets: Record<string, LookupSecret> = {};\n for (const secret of options.customSecrets) {\n const lookupSecret: LookupSecret = {\n kind: \"LookupSecret\",\n url: `/api/settings/secrets/${encodeURIComponent(secret.name)}`,\n description: secret.description,\n };\n\n if (Object.keys(headers).length > 0) {\n lookupSecret.headers = headers;\n }\n\n secrets[secret.name] = lookupSecret;\n }\n\n payload.secrets = secrets;\n }\n\n return payload;\n}\n\nexport const SUBSCRIPTION_LOGIN_REQUIRED_ERROR =\n \"Connect your ChatGPT subscription before starting a conversation with this LLM profile.\";\n\n/**\n * Throws if a ChatGPT subscription LLM profile is not connected.\n * Called before conversation creation and LLM profile switch only — not on\n * subsequent message sends or conversation resume. The agent-server must handle\n * mid-conversation token expiry gracefully.\n */\nexport async function assertSubscriptionAuthReady(\n agentSettings: Record<string, unknown>,\n): Promise<void> {\n const llm = toRecord(agentSettings.llm);\n if (!isSubscriptionLlmConfig(llm)) return;\n\n const status = await LLMSubscriptionService.getOpenAIStatus();\n if (!status.connected) {\n throw new Error(SUBSCRIPTION_LOGIN_REQUIRED_ERROR);\n }\n}\n\nexport async function buildStartConversationRequestWithEncryptedSettings(options: {\n settings: Settings;\n query?: string;\n conversationInstructions?: string;\n plugins?: PluginSpec[];\n conversationId?: string;\n workingDir?: string;\n worktree?: boolean;\n agentProfileId?: string;\n agentProfileKind?: AgentKind;\n titleLlmProfile?: string;\n}): Promise<Record<string, unknown>> {\n const { SecretsService } = await import(\"./secrets-service\");\n\n const [settingsResult, customSecrets, runtimeServicesInfo] =\n await Promise.all([\n SettingsService.getSettingsForConversation(),\n SecretsService.getSecrets(),\n fetchBackendRuntimeServicesInfo(),\n ]);\n\n const { agentSettings, conversationSettings, secretsEncrypted } =\n settingsResult;\n\n // A profile launch resolves the LLM server-side, so the current-settings\n // subscription check doesn't apply (and can't see the profile's LLM).\n if (!options.agentProfileId) {\n await assertSubscriptionAuthReady(agentSettings);\n }\n\n return buildStartConversationRequest({\n ...options,\n encryptedAgentSettings: agentSettings,\n encryptedConversationSettings: conversationSettings,\n secretsEncrypted,\n customSecrets,\n runtimeServicesInfo,\n });\n}\n\nexport function emptyHooksResponse(): GetHooksResponse {\n return { hooks: [] };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"agent-server-adapter.cjs","names":[],"sources":["../../src/api/agent-server-adapter.ts"],"sourcesContent":["import { ACP_SETTINGS_KEYS } from \"@openhands/typescript-client\";\nimport { ServerClient } from \"@openhands/typescript-client/clients\";\nimport { SKILLS_CATALOG } from \"@openhands/extensions/skills\";\nimport { DEFAULT_SETTINGS } from \"#/services/settings\";\nimport { ExecutionStatus } from \"#/types/agent-server/core\";\nimport { AgentKind, Settings, SettingsValue } from \"#/types/settings\";\nimport {\n getAcpPreferredDefaultModel,\n getAcpProvider,\n resolveEffectiveAcpModel,\n} from \"#/constants/acp-providers\";\nimport { getAgentServerClientOptions } from \"./agent-server-client-options\";\nimport {\n getCachedAgentServerInfo,\n isAgentServerToolAvailable,\n} from \"./agent-server-compatibility\";\nimport { getAgentServerWorkingDir } from \"./agent-server-config\";\nimport { getEffectiveLocalBackend } from \"./backend-registry/active-store\";\nimport { buildAuthHeaders } from \"./backend-registry/auth\";\nimport {\n GetHooksResponse,\n PluginSpec,\n AppConversation,\n AppConversationPage,\n SandboxStatus,\n} from \"./conversation-service/agent-server-conversation-service.types\";\nimport SettingsService from \"./settings-service/settings-service.api\";\nimport { getStoredConversationMetadata } from \"./conversation-metadata-store\";\nimport LLMSubscriptionService from \"./llm-subscription-service\";\nimport {\n LLM_AUTH_TYPE_SUBSCRIPTION,\n OPENAI_SUBSCRIPTION_VENDOR,\n isSubscriptionLlmConfig,\n} from \"#/constants/llm-subscription\";\nimport {\n CANVAS_UI_CLIENT_TOOL,\n CANVAS_UI_CLIENT_TOOL_NAME,\n LEGACY_CANVAS_UI_TOOL_NAME,\n type ClientToolSpec,\n} from \"./canvas-ui-client-tool\";\nimport {\n LAUNCH_CHILD_CONVERSATION_CLIENT_TOOL,\n LAUNCH_CHILD_CONVERSATION_TOOL_NAME,\n} from \"./launch-child-conversation-client-tool\";\n\nexport interface DirectConversationInfo {\n id: string;\n title?: string | null;\n created_at: string;\n updated_at: string;\n execution_status?: string | null;\n /** Cloud-only sandbox lifecycle state. Omitted / null for local agent-server conversations. */\n sandbox_status?: string | null;\n metrics?: {\n accumulated_cost?: number | null;\n max_budget_per_task?: number | null;\n accumulated_token_usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n cache_read_tokens?: number;\n cache_write_tokens?: number;\n context_window?: number;\n per_turn_token?: number;\n } | null;\n } | null;\n agent?: {\n /**\n * Pydantic discriminator from the SDK union: ``\"ACPAgent\"`` for ACP CLI\n * subprocesses (model lives on the subprocess via ``acp_model``),\n * ``\"Agent\"`` for direct litellm. Read by {@link toAppConversation}.\n */\n kind?: string | null;\n acp_model?: string | null;\n /**\n * ACP CLI identity (``claude-code`` / ``codex`` / ``gemini-cli``) from the\n * SDK's ``ACPAgent.acp_server`` (#3692). Preferred fallback when the\n * ``acpserver`` tag is absent — e.g. a profile launch doesn't stamp the tag\n * client-side and the server may not repopulate it. Read by {@link toAppConversation}.\n */\n acp_server?: string | null;\n llm?: {\n model?: string | null;\n } | null;\n } | null;\n current_model_id?: string | null;\n current_model_name?: string | null;\n workspace?: {\n working_dir?: string | null;\n } | null;\n /**\n * Arbitrary string-keyed conversation tags surfaced by the agent-server\n * (see ``ConversationInfo.tags``). Canvas only consumes one key today —\n * ``ACP_SERVER_TAG_KEY`` (\"acpserver\") — but the field is typed as a\n * generic record so future readers don't need another wire-shape change.\n * Keys are constrained to ``^[a-z0-9]+$`` by the agent-server validator;\n * values are opaque strings.\n */\n tags?: Record<string, string> | null;\n launched_agent_profile?: {\n agent_profile_id: string;\n revision: number;\n } | null;\n}\n\nconst DEFAULT_TOOL_NAMES = [\"terminal\", \"file_editor\", \"task_tracker\"];\nconst BROWSER_TOOL_SET_NAME = \"browser_tool_set\";\nconst TASK_TOOL_SET_NAME = \"task_tool_set\";\n\nfunction browserToolsEnabled() {\n return import.meta.env.VITE_ENABLE_BROWSER_TOOLS !== \"false\";\n}\n\n/**\n * Shape of the runtime services info served by Agent Canvas backends in\n * `/server_info.runtime_services`. All URLs are written from the agent's point of\n * view, not the browser's. The block is rendered into the agent's system prompt\n * via `AgentContext.system_message_suffix` so the agent knows what's reachable\n * from inside its sandbox without having to probe.\n */\nexport interface RuntimeServicesInfo {\n mode?: string;\n agent_host_alias?: string;\n services?: {\n agent_server?: { description?: string; url_from_agent?: string };\n ingress?: { description?: string; url_from_agent?: string };\n frontend?: {\n kind?: \"vite\" | \"static\";\n description?: string;\n url_from_agent?: string;\n };\n // `vite` is the legacy key name for the frontend entry, accepted for\n // one release while older dev-stack launchers may still emit it.\n vite?: { description?: string; url_from_agent?: string };\n automation?: {\n description?: string;\n url_from_agent?: string;\n api_prefix?: string;\n docs_url?: string;\n openapi_url?: string;\n auth_env_var?: string;\n };\n };\n}\n\nexport function parseRuntimeServicesInfo(\n value: unknown,\n): RuntimeServicesInfo | null {\n if (typeof value === \"string\") {\n const raw = value.trim();\n if (!raw) return null;\n try {\n return parseRuntimeServicesInfo(JSON.parse(raw));\n } catch {\n return null;\n }\n }\n\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return null;\n }\n\n const parsed = value as RuntimeServicesInfo;\n if (!parsed.services || typeof parsed.services !== \"object\") return null;\n return parsed;\n}\n\nexport async function fetchBackendRuntimeServicesInfo(): Promise<RuntimeServicesInfo | null> {\n let clientOptions: ReturnType<typeof getAgentServerClientOptions>;\n try {\n clientOptions = getAgentServerClientOptions({ timeout: 3000 });\n } catch {\n return null;\n }\n\n const cached = parseRuntimeServicesInfo(\n getCachedAgentServerInfo({ host: clientOptions.host })?.runtime_services,\n );\n if (cached) return cached;\n\n try {\n const serverInfo = await new ServerClient(clientOptions).getServerInfo();\n return parseRuntimeServicesInfo(\n (serverInfo as { runtime_services?: unknown }).runtime_services,\n );\n } catch {\n return null;\n }\n}\n\n/**\n * Return the deployment mode from the runtime services info, e.g. \"docker\",\n * \"dev:automation\", etc. Returns `null` when no runtime info is supplied.\n */\nexport function getDeploymentMode(\n runtimeServicesInfo?: RuntimeServicesInfo | null,\n): string | null {\n return runtimeServicesInfo?.mode ?? null;\n}\n\n/**\n * Render the runtime services info into a markdown block suitable for\n * appending to the system prompt via `AgentContext.system_message_suffix`.\n *\n * Returns `undefined` when no runtime info is available, so callers can safely\n * omit the field when the selected backend does not advertise runtime services.\n */\nexport function buildRuntimeServicesSystemSuffix(\n runtimeServicesInfo?: RuntimeServicesInfo | null,\n): string | undefined {\n const info = parseRuntimeServicesInfo(runtimeServicesInfo);\n if (!info?.services) return undefined;\n\n const lines: string[] = [];\n lines.push(\"<RUNTIME_SERVICES>\");\n if (info.mode) {\n lines.push(\n `You are running inside an agent-canvas dev stack started in '${info.mode}' mode.`,\n );\n } else {\n lines.push(\"You are running inside an agent-canvas dev stack.\");\n }\n lines.push(\n \"The following services are reachable from your sandbox. URLs are written\",\n \"from your point of view (i.e., as you should curl/fetch them).\",\n \"\",\n );\n\n const { agent_server, ingress, automation } = info.services;\n const { frontend } = info.services;\n\n if (agent_server?.url_from_agent) {\n lines.push(\n `* Agent Server (you): ${agent_server.url_from_agent}`,\n ` ${agent_server.description ?? \"The agent-server hosting your tool calls.\"}`,\n );\n }\n if (ingress?.url_from_agent) {\n lines.push(\n `* Ingress: ${ingress.url_from_agent}`,\n ` ${ingress.description ?? \"Unified entry point for browser-facing traffic.\"}`,\n );\n }\n if (frontend?.url_from_agent) {\n lines.push(\n `* Frontend: ${frontend.url_from_agent}`,\n ` ${frontend.description ?? \"Frontend dev server.\"}`,\n );\n }\n if (automation?.url_from_agent) {\n lines.push(\n `* Automation backend: ${automation.url_from_agent}`,\n ` ${automation.description ?? \"OpenHands Automations service.\"}`,\n );\n if (automation.docs_url) {\n lines.push(` Docs: ${automation.docs_url}`);\n }\n if (automation.openapi_url) {\n lines.push(` OpenAPI: ${automation.openapi_url}`);\n }\n if (automation.auth_env_var) {\n // X-Session-API-Key is the local convention shared by the agent-server\n // and automation backend (see openhands-automation auth.py).\n lines.push(\n ` Auth: header 'X-Session-API-Key: $${automation.auth_env_var}'`,\n );\n }\n } else {\n lines.push(\n \"* Automation backend: not running in this dev mode (skip /api/automation calls).\",\n );\n }\n\n // Anchor the \"don't guess\" warning to the actual agent-server URL for\n // this stack instead of a hardcoded port. The agent-server listens on\n // different ports across dev modes, and baking the wrong port into the\n // system prompt is exactly the kind of confusion this block is meant to\n // prevent.\n const agentServerUrl = agent_server?.url_from_agent;\n lines.push(\n \"\",\n \"Trust this block over guessing: do not assume any other URLs are running.\",\n );\n if (agentServerUrl) {\n lines.push(\n `In particular, ${agentServerUrl} inside your sandbox is the Agent Server`,\n \"you are running inside of — NOT the automation backend.\",\n );\n }\n lines.push(\"</RUNTIME_SERVICES>\");\n\n return lines.join(\"\\n\");\n}\n\nexport function toConversationUrl(conversationId: string): string {\n // Local-format conversation URL — points at whichever local agent-server\n // is actually serving the conversation (the bundled one when the active\n // selection is cloud).\n const { host } = getAgentServerClientOptions();\n return `${host}/api/conversations/${conversationId}`;\n}\n\n// TODO(i18n): extract \"Conversation\" once we add CONVERSATION$DEFAULT_TITLE\n// with `{{shortId}}` interpolation. Kept as a literal for now to keep the\n// fallback inside this pure adapter rather than fanning out to display sites.\nexport function getDefaultConversationTitle(conversationId: string): string {\n return `Conversation ${conversationId.slice(0, 5)}`;\n}\n\nexport function toAppConversation(\n info: DirectConversationInfo,\n): AppConversation {\n const metadata = getStoredConversationMetadata(info.id);\n // ACPAgent conversations carry a sentinel ``llm`` on older SDKs. Prefer the\n // runtime model fields when available, then the configured ``acp_model`` that\n // Canvas saves for built-in providers. ``agent_kind`` still gates model\n // switching, so surfacing this string is display-only.\n const isAcp = info.agent?.kind === \"ACPAgent\";\n // Only surface ``acp_server`` for ACP conversations even if the wire\n // payload accidentally carries an ``acpserver`` tag on an OpenHands\n // conversation — the chip is identity info for the ACP CLI subprocess,\n // and showing it on a non-ACP conversation would be a lie. Fall back to the\n // agent's own ``acp_server`` (#3692) when the tag is missing — a profile\n // launch doesn't stamp the tag, so tag-only reads would drop the ACP model\n // picker and degrade the chip to a generic \"ACP\" (#1571).\n const acpServer = isAcp\n ? (info.tags?.[ACP_SERVER_TAG_KEY] ?? info.agent?.acp_server ?? null)\n : null;\n return {\n id: info.id,\n created_by_user_id: null,\n selected_repository: metadata?.selected_repository ?? null,\n selected_branch: metadata?.selected_branch ?? null,\n git_provider: metadata?.git_provider ?? null,\n selected_workspace: metadata?.selected_workspace ?? null,\n active_profile: metadata?.active_profile ?? null,\n title: info.title?.trim()\n ? info.title\n : getDefaultConversationTitle(info.id),\n trigger: null,\n pr_number: [],\n agent_kind: isAcp ? \"acp\" : \"openhands\",\n acp_server: acpServer,\n tags: info.tags ?? null,\n launched_agent_profile: info.launched_agent_profile ?? null,\n // Chip path: omit ``providerDefault`` so that when no concrete model\n // resolves, the chip falls back to the provider display name in\n // ConversationCardFooter rather than a registry default the session may\n // not actually be running.\n llm_model: isAcp\n ? resolveEffectiveAcpModel({\n runtimeName: info.current_model_name,\n runtimeId: info.current_model_id,\n configured: info.agent?.acp_model,\n sdkLlm: info.agent?.llm?.model,\n })\n : (info.agent?.llm?.model ?? DEFAULT_SETTINGS.llm_model),\n metrics: info.metrics\n ? {\n accumulated_cost: info.metrics.accumulated_cost ?? null,\n max_budget_per_task: info.metrics.max_budget_per_task ?? null,\n accumulated_token_usage: info.metrics.accumulated_token_usage\n ? {\n prompt_tokens:\n info.metrics.accumulated_token_usage.prompt_tokens ?? 0,\n completion_tokens:\n info.metrics.accumulated_token_usage.completion_tokens ?? 0,\n cache_read_tokens:\n info.metrics.accumulated_token_usage.cache_read_tokens ?? 0,\n cache_write_tokens:\n info.metrics.accumulated_token_usage.cache_write_tokens ?? 0,\n context_window:\n info.metrics.accumulated_token_usage.context_window ?? 0,\n per_turn_token:\n info.metrics.accumulated_token_usage.per_turn_token ?? 0,\n }\n : null,\n }\n : null,\n created_at: info.created_at,\n updated_at: info.updated_at,\n execution_status:\n (info.execution_status as AppConversation[\"execution_status\"]) ??\n ExecutionStatus.IDLE,\n sandbox_status: (info.sandbox_status as SandboxStatus | null) ?? null,\n conversation_url: toConversationUrl(info.id),\n session_api_key: getAgentServerClientOptions().apiKey ?? null,\n sandbox_id: null,\n workspace: {\n working_dir: info.workspace?.working_dir ?? getAgentServerWorkingDir(),\n },\n public: false,\n sub_conversation_ids: [],\n };\n}\n\nexport function toConversationPage(data: {\n items: DirectConversationInfo[];\n next_page_id?: string | null;\n}): AppConversationPage {\n return {\n items: data.items.map(toAppConversation),\n next_page_id: data.next_page_id ?? null,\n };\n}\n\ntype SettingsRecord = Record<string, unknown>;\n\ninterface AgentToolSpec {\n name: string;\n params: SettingsRecord;\n}\n\ntype AgentSettingsPayload = SettingsRecord & {\n llm?: SettingsRecord;\n agent_context: SettingsRecord;\n tools?: AgentToolSpec[];\n};\n\ninterface LocalWorkspacePayload {\n kind: \"LocalWorkspace\";\n working_dir: string;\n}\n\ninterface InitialMessagePayload {\n role: \"user\";\n content: Array<{ type: \"text\"; text: string }>;\n run: true;\n}\n\ntype ConversationSettingsPayload = SettingsRecord & {\n workspace: LocalWorkspacePayload;\n initial_message?: InitialMessagePayload;\n};\n\nexport const ACP_SERVER_TAG_KEY = \"acpserver\";\n\nexport const AUTOMATION_TRIGGER_TAG_KEY = \"automationtrigger\";\nexport const AUTOMATION_ID_TAG_KEY = \"automationid\";\nexport const AUTOMATION_NAME_TAG_KEY = \"automationname\";\nexport const AUTOMATION_RUN_ID_TAG_KEY = \"automationrunid\";\n\n/**\n * Tag keys stamped on conversations created by automation runs (see the SDK's\n * `RemoteWorkspace.default_conversation_tags`). The presence of any of these\n * marks a conversation as automation-born.\n */\nexport const AUTOMATION_TAG_KEYS: readonly string[] = [\n AUTOMATION_TRIGGER_TAG_KEY,\n AUTOMATION_ID_TAG_KEY,\n AUTOMATION_NAME_TAG_KEY,\n AUTOMATION_RUN_ID_TAG_KEY,\n];\n\n/**\n * Conversation tag keys that must not appear as generic chips / hovercard\n * rows. Each is either already surfaced by a first-class UI source or is\n * internal routing data:\n * - ``acpserver`` → ACP provider chip\n * - ``title`` → conversation card heading\n * - git / repo / branch / workspace stamps → repo-branch metadata + directory\n * footer / hovercard rows (``selected_repository``, ``selected_branch``,\n * ``git_provider``, ``workspace.working_dir``)\n * - ``automationid`` / ``automationrunid`` → raw UUIDs consumed by the\n * conversation panel's automation filter (chip noise), while\n * ``automationname`` / ``automationtrigger`` stay visible\n */\nexport const RESERVED_CONVERSATION_TAG_KEYS: ReadonlySet<string> = new Set([\n ACP_SERVER_TAG_KEY,\n AUTOMATION_ID_TAG_KEY,\n AUTOMATION_RUN_ID_TAG_KEY,\n \"title\",\n \"git_provider\",\n \"repo_name\",\n \"repo\",\n \"repository\",\n \"selected_branch\",\n \"branch\",\n \"archiveworkspacepath\",\n \"workspace\",\n \"working_dir\",\n]);\n\n/**\n * High-signal tag keys shown first in the chip row (before A–Z). Automations\n * often stamp ``origin``; remaining free-form tags sort alphabetically.\n */\nexport const PRIORITY_CONVERSATION_TAG_KEYS: readonly string[] = [\"origin\"];\n\n/**\n * User-facing subset of a conversation's server-side tags: everything except\n * {@link RESERVED_CONVERSATION_TAG_KEYS}, as stable ``[key, value]`` entries.\n * Priority keys come first (in {@link PRIORITY_CONVERSATION_TAG_KEYS} order);\n * the rest sort A–Z so chip order doesn't shuffle between refetches.\n */\nexport function getDisplayConversationTags(\n tags: Record<string, string> | null | undefined,\n): Array<[string, string]> {\n if (!tags) {\n return [];\n }\n // Both the reserved-key check and the priority lookup must see the same\n // normalized key: a cloud backend can stamp ``Origin`` / `` origin``, and\n // ranking those off the raw key would silently drop them out of first place.\n const priorityRank = (key: string): number => {\n const index = PRIORITY_CONVERSATION_TAG_KEYS.indexOf(\n key.trim().toLowerCase(),\n );\n return index === -1 ? Number.POSITIVE_INFINITY : index;\n };\n\n return Object.entries(tags)\n .filter(\n ([key, value]) =>\n !RESERVED_CONVERSATION_TAG_KEYS.has(key.trim().toLowerCase()) &&\n typeof value === \"string\" &&\n value.trim().length > 0,\n )\n .sort(([a], [b]) => {\n const aRank = priorityRank(a);\n const bRank = priorityRank(b);\n if (aRank !== bRank) {\n return aRank - bRank;\n }\n return a.localeCompare(b);\n });\n}\n\nconst FERNET_TOKEN_PREFIX = \"gAAAAA\";\n\nconst CONVERSATION_SETTINGS_METADATA_KEYS = new Set([\n \"schema_version\",\n \"agent_settings\",\n \"workspace\",\n \"conversation_id\",\n \"initial_message\",\n \"plugins\",\n]);\n\nfunction toRecord(value: unknown): SettingsRecord {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return {};\n }\n\n return structuredClone(value as SettingsRecord);\n}\n\nfunction normalizeSecretString(value: unknown): string | undefined {\n if (typeof value !== \"string\") {\n return undefined;\n }\n\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction hasEncryptedString(value: unknown): boolean {\n if (typeof value === \"string\") {\n return value.startsWith(FERNET_TOKEN_PREFIX);\n }\n if (Array.isArray(value)) {\n return value.some(hasEncryptedString);\n }\n if (isPlainRecord(value)) {\n return Object.values(value).some(hasEncryptedString);\n }\n return false;\n}\n\nfunction hasEncryptedMcpSecrets(mcpConfig: unknown): boolean {\n if (!isPlainRecord(mcpConfig)) {\n return false;\n }\n\n return Object.values(mcpConfig).some(hasEncryptedString);\n}\n\nfunction getConversationConfirmationPolicy(\n conversationSettings: SettingsRecord,\n) {\n if (conversationSettings.confirmation_mode !== true) {\n return { kind: \"NeverConfirm\" };\n }\n\n if (conversationSettings.security_analyzer === \"llm\") {\n return { kind: \"ConfirmRisky\", threshold: \"HIGH\", confirm_unknown: true };\n }\n\n return { kind: \"AlwaysConfirm\" };\n}\n\nfunction getConversationSecurityAnalyzer(conversationSettings: SettingsRecord) {\n switch (conversationSettings.security_analyzer) {\n case \"llm\":\n return { kind: \"LLMSecurityAnalyzer\" };\n case \"pattern\":\n return { kind: \"PatternSecurityAnalyzer\" };\n case \"policy_rail\":\n return { kind: \"PolicyRailSecurityAnalyzer\" };\n default:\n return undefined;\n }\n}\n\nfunction isToolRecord(\n value: unknown,\n): value is { name: string; params?: unknown } {\n return (\n !!value &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n typeof (value as { name?: unknown }).name === \"string\"\n );\n}\n\nfunction shouldIncludeTool(name: string, agentSettings: SettingsRecord) {\n if (name === BROWSER_TOOL_SET_NAME) {\n return browserToolsEnabled() && isAgentServerToolAvailable(name);\n }\n\n if (name === TASK_TOOL_SET_NAME) {\n return (\n agentSettings.enable_sub_agents === true &&\n isAgentServerToolAvailable(name)\n );\n }\n\n return true;\n}\n\nfunction getAgentTools(agentSettings: SettingsRecord): AgentToolSpec[] {\n const tools = new Map<string, AgentToolSpec>();\n\n for (const name of DEFAULT_TOOL_NAMES) {\n if (shouldIncludeTool(name, agentSettings)) {\n tools.set(name, { name, params: {} });\n }\n }\n\n for (const name of [BROWSER_TOOL_SET_NAME, TASK_TOOL_SET_NAME]) {\n if (shouldIncludeTool(name, agentSettings)) {\n tools.set(name, { name, params: {} });\n }\n }\n\n const configuredTools = agentSettings.tools;\n if (\n Array.isArray(configuredTools) &&\n configuredTools.every((tool) => isToolRecord(tool))\n ) {\n for (const tool of configuredTools) {\n if (shouldIncludeTool(tool.name, agentSettings)) {\n tools.set(tool.name, {\n name: tool.name,\n params: toRecord(tool.params),\n });\n }\n }\n }\n\n return Array.from(tools.values());\n}\n\nfunction buildInitialMessage(\n query?: string,\n conversationInstructions?: string,\n): InitialMessagePayload | null {\n const parts = [query?.trim(), conversationInstructions?.trim()].filter(\n Boolean,\n );\n if (parts.length === 0) {\n return null;\n }\n\n return {\n role: \"user\",\n content: [{ type: \"text\", text: parts.join(\"\\n\\n\") }],\n run: true,\n };\n}\n\n/**\n * Shape of a bundled skill entry passed to the agent-server SDK via\n * `agent_context.skills`. Mirrors the SDK's `Skill` model fields that\n * the server uses for trigger matching, activation, and system-prompt\n * injection.\n */\ninterface BundledSkill {\n name: string;\n content: string;\n trigger: { type: \"keyword\"; keywords: string[] } | null;\n source: string;\n description: string | null;\n is_agentskills_format: true;\n license?: string;\n compatibility?: string;\n}\n\n/**\n * Convert the bundled `SKILLS_CATALOG` entries into the SDK `Skill` JSON\n * shape so the agent-server can perform trigger matching, skill activation,\n * and system-prompt injection without cloning the extensions repo.\n *\n * The SDK discriminates triggers via `{ type: \"keyword\", keywords: [...] }`.\n * Skills with no triggers get `trigger: null` (always-active / on-demand).\n */\nfunction buildBundledSkills(): BundledSkill[] {\n return SKILLS_CATALOG.map((entry) => {\n const trigger: BundledSkill[\"trigger\"] =\n entry.triggers?.length > 0\n ? { type: \"keyword\", keywords: entry.triggers }\n : null;\n\n // Use the absolute path to the skill's SKILL.md so the Python\n // agent-server can resolve bundled resources (scripts/, references/).\n // Falls back to \"public\" in library builds where the path isn't known.\n const source = __EXTENSIONS_SKILLS_DIR__\n ? `${__EXTENSIONS_SKILLS_DIR__}/${entry.name}/SKILL.md`\n : \"public\";\n\n return {\n name: entry.name,\n content: entry.content,\n trigger,\n source,\n description: entry.description ?? null,\n is_agentskills_format: true as const,\n ...(entry.license ? { license: entry.license } : {}),\n ...(entry.compatibility ? { compatibility: entry.compatibility } : {}),\n };\n });\n}\n\nfunction buildAgentContext(\n agentSettings: SettingsRecord,\n runtimeServicesInfo?: RuntimeServicesInfo | null,\n disabledSkills: string[] = [],\n): SettingsRecord {\n const runtimeServicesSuffix =\n buildRuntimeServicesSystemSuffix(runtimeServicesInfo);\n const existingContext = toRecord(agentSettings.agent_context);\n\n // Merge bundled public skills with any skills already present in the\n // agent context (e.g. user-defined skills set via the settings API).\n const existingSkills = Array.isArray(existingContext.skills)\n ? (existingContext.skills as SettingsRecord[])\n : [];\n const disabledSkillNames = new Set(disabledSkills);\n const mergedSkills = [...existingSkills, ...buildBundledSkills()].filter(\n (skill) =>\n typeof skill.name !== \"string\" || !disabledSkillNames.has(skill.name),\n );\n\n return {\n ...existingContext,\n // Public skills are bundled at build time from the @openhands/extensions\n // npm package and passed directly in agent_context.skills. Setting\n // load_public_skills to false tells the agent-server SDK to skip its own\n // extensions-repo clone — the frontend is the sole source of public\n // skills now.\n //\n // Migration: the former VITE_LOAD_PUBLIC_SKILLS env var was removed\n // because bundled skills have no clone latency. Users who previously set\n // VITE_LOAD_PUBLIC_SKILLS=false to avoid clone delays no longer need it.\n skills: mergedSkills,\n load_public_skills: false,\n load_user_skills: true,\n load_project_skills: true,\n ...(runtimeServicesSuffix\n ? { system_message_suffix: runtimeServicesSuffix }\n : {}),\n };\n}\n\nfunction isAcpAgent(settings: Settings): boolean {\n const agentSettings = toRecord(settings.agent_settings);\n return agentSettings.agent_kind === \"acp\";\n}\n\nfunction getAcpServerTag(settings: Settings): string | undefined {\n const agentSettings = toRecord(settings.agent_settings);\n const value = agentSettings.acp_server;\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction resolveAcpCommand(agentSettings: SettingsRecord): unknown {\n const cmd = agentSettings.acp_command;\n const isEmpty = Array.isArray(cmd) && cmd.length === 0;\n const noCommand = cmd === undefined;\n if (!isEmpty && !noCommand) {\n return cmd;\n }\n\n const serverKey =\n typeof agentSettings.acp_server === \"string\"\n ? agentSettings.acp_server\n : undefined;\n const provider = getAcpProvider(serverKey);\n return provider ? [...provider.default_command] : cmd;\n}\n\nfunction buildConfiguredAcpAgentSettings(\n settings: Settings,\n runtimeServicesInfo?: RuntimeServicesInfo | null,\n): AgentSettingsPayload {\n const agentSettings = toRecord(settings.agent_settings);\n const payload: AgentSettingsPayload = {\n agent_kind: \"acp\",\n agent_context: buildAgentContext(\n agentSettings,\n runtimeServicesInfo,\n settings.disabled_skills,\n ),\n };\n\n // TODO(#1019): set ``acp_isolate_data_dir: true`` here for a containerized\n // backend so concurrent same-provider conversations don't race on a shared\n // HOME. The SDK supports it (software-agent-sdk#3492), but the released\n // ``@openhands/typescript-client`` (1.24.3) doesn't surface it on\n // ``ACPAgentSettings`` yet, so sending it risks a validation error on older\n // servers. Cloud grouping isolation is separate (agent-canvas#1016).\n\n for (const key of ACP_SETTINGS_KEYS) {\n // ``acp_model`` is resolved separately below so a saved ``null`` still\n // falls back to the provider's default rather than being dropped.\n if (key === \"acp_model\") continue;\n // ``acp_env`` is deprecated — provider creds now route via ``request.secrets``.\n if (key === \"acp_env\") continue;\n const value =\n key === \"acp_command\"\n ? resolveAcpCommand(agentSettings)\n : agentSettings[key];\n if (value !== undefined && value !== null) {\n payload[key] = value;\n }\n }\n\n // ``mcp_config`` is a shared field (not in ACP_SETTINGS_KEYS): forward it\n // so the ACP subprocess connects to the configured MCP servers at session\n // creation. Only include it when it actually carries servers — an empty or\n // malformed value is dropped rather than sending ``mcp_config: {}``.\n const mcpConfig = toRecord(agentSettings.mcp_config);\n if (Object.keys(mcpConfig).length > 0) {\n payload.mcp_config = mcpConfig;\n }\n\n // Saved settings may carry ``acp_model: null`` (existing users predating\n // the default-model registry, or saved fields the agent-server stripped).\n // Fall back to the *preferred* default (Vertex-safe for Gemini) so the\n // conversation starts with whatever the Settings → Agent UI shows — without\n // that, the form's displayed default would silently not take effect at\n // runtime until the user re-saved the page.\n const serverKey =\n typeof agentSettings.acp_server === \"string\"\n ? agentSettings.acp_server\n : undefined;\n const effectiveModel = resolveEffectiveAcpModel({\n configured: agentSettings.acp_model as string | null | undefined,\n providerDefault: getAcpPreferredDefaultModel(serverKey),\n });\n if (effectiveModel) {\n payload.acp_model = effectiveModel;\n }\n\n return payload;\n}\n\nfunction buildConfiguredOpenHandsAgentSettings(\n settings: Settings,\n runtimeServicesInfo?: RuntimeServicesInfo | null,\n): AgentSettingsPayload {\n const agentSettings = toRecord(settings.agent_settings);\n const llm = toRecord(agentSettings.llm);\n\n llm.model =\n typeof llm.model === \"string\" && llm.model.trim().length > 0\n ? llm.model\n : DEFAULT_SETTINGS.llm_model;\n\n // Stream assistant tokens (parity with ACP agents). The agent-server only\n // emits StreamingDeltaEvents for SDK LLM agents when an LLM has stream=True.\n llm.stream = true;\n\n const apiKey = normalizeSecretString(llm.api_key);\n if (apiKey) {\n llm.api_key = apiKey;\n } else {\n delete llm.api_key;\n }\n\n const baseUrl = normalizeSecretString(llm.base_url);\n if (baseUrl) {\n llm.base_url = baseUrl;\n } else {\n delete llm.base_url;\n }\n\n if (isSubscriptionLlmConfig(llm)) {\n llm.auth_type = LLM_AUTH_TYPE_SUBSCRIPTION;\n llm.subscription_vendor = OPENAI_SUBSCRIPTION_VENDOR;\n delete llm.api_key;\n delete llm.base_url;\n } else {\n delete llm.auth_type;\n delete llm.subscription_vendor;\n }\n\n const mcpConfig = toRecord(agentSettings.mcp_config);\n if (Object.keys(mcpConfig).length === 0) {\n delete agentSettings.mcp_config;\n }\n\n delete agentSettings.acp_server;\n for (const key of ACP_SETTINGS_KEYS) {\n delete agentSettings[key];\n }\n // ``acp_env`` is no longer a forwarded ACP setting (provider creds ride the\n // Secrets panel), but a legacy value may linger on persisted settings —\n // scrub it so it never leaks onto the OpenHands payload.\n delete agentSettings.acp_env;\n\n return {\n ...agentSettings,\n llm,\n agent_context: buildAgentContext(\n agentSettings,\n runtimeServicesInfo,\n settings.disabled_skills,\n ),\n tools: getAgentTools(agentSettings),\n };\n}\n\nfunction buildConfiguredAgentSettings(\n settings: Settings,\n runtimeServicesInfo?: RuntimeServicesInfo | null,\n): AgentSettingsPayload {\n return isAcpAgent(settings)\n ? buildConfiguredAcpAgentSettings(settings, runtimeServicesInfo)\n : buildConfiguredOpenHandsAgentSettings(settings, runtimeServicesInfo);\n}\n\nfunction buildConfiguredConversationSettings(options: {\n settings: Settings;\n query?: string;\n conversationInstructions?: string;\n plugins?: PluginSpec[];\n workingDir?: string;\n}): ConversationSettingsPayload {\n const { settings, query, conversationInstructions, plugins, workingDir } =\n options;\n const conversationSettings = toRecord(settings.conversation_settings);\n const initialMessage = buildInitialMessage(query, conversationInstructions);\n\n CONVERSATION_SETTINGS_METADATA_KEYS.forEach(\n (key) => delete conversationSettings[key],\n );\n\n const payload: ConversationSettingsPayload = {\n ...conversationSettings,\n workspace: {\n kind: \"LocalWorkspace\",\n working_dir: workingDir ?? getAgentServerWorkingDir(),\n },\n ...(initialMessage ? { initial_message: initialMessage } : {}),\n ...(plugins?.length\n ? {\n plugins: plugins.map((plugin) => ({\n source: plugin.source,\n ...(plugin.ref ? { ref: plugin.ref } : {}),\n ...(plugin.repo_path ? { repo_path: plugin.repo_path } : {}),\n })),\n }\n : {}),\n };\n\n return payload;\n}\n\ninterface LookupSecret {\n kind: \"LookupSecret\";\n url: string;\n headers?: Record<string, string>;\n description?: string;\n}\n\ntype StartConversationPayload = Record<string, unknown> & {\n // Omitted when launching via ``agent_profile_id`` — the two are mutually\n // exclusive agent sources; the server resolves the profile server-side.\n agent_settings?: AgentSettingsPayload;\n agent_profile_id?: string;\n workspace: LocalWorkspacePayload;\n confirmation_policy: SettingsRecord;\n security_analyzer?: SettingsRecord;\n initial_message?: InitialMessagePayload;\n max_iterations: number;\n stuck_detection: true;\n autotitle: true;\n title_llm_profile?: string;\n worktree: boolean;\n secrets_encrypted?: true;\n conversation_id?: string;\n parent_conversation_id?: string;\n secrets?: Record<string, LookupSecret>;\n tags?: Record<string, string>;\n client_tools: ClientToolSpec[];\n tool_module_qualnames?: Record<string, string>;\n};\n\nexport interface StartConversationOptions {\n settings: Settings;\n query?: string;\n conversationInstructions?: string;\n plugins?: PluginSpec[];\n conversationId?: string;\n // Links the new conversation to an existing one as its child. The\n // agent-server requires the parent to exist and to share this\n // conversation's requested `workspace.working_dir` (software-agent-sdk\n // #4188, agent-server >= 1.37.1); older servers ignore the field.\n parentConversationId?: string;\n workingDir?: string;\n worktree?: boolean;\n encryptedAgentSettings?: Record<string, SettingsValue>;\n encryptedConversationSettings?: Record<string, SettingsValue>;\n secretsEncrypted?: boolean;\n customSecrets?: Array<{ name: string; description?: string }>;\n // When set, the conversation launches from this AgentProfile (resolved\n // server-side) instead of an inline ``agent_settings`` dump (#3727).\n agentProfileId?: string;\n agentProfileKind?: AgentKind;\n titleLlmProfile?: string;\n runtimeServicesInfo?: RuntimeServicesInfo | null;\n}\n\nexport function buildStartConversationRequest(\n options: StartConversationOptions,\n): StartConversationPayload {\n const sourceAgentSettings = options.encryptedAgentSettings\n ? { ...options.settings, agent_settings: options.encryptedAgentSettings }\n : options.settings;\n\n const acpMode = isAcpAgent(sourceAgentSettings);\n const launchAgentKind = options.agentProfileId\n ? options.agentProfileKind\n : acpMode\n ? \"acp\"\n : \"openhands\";\n const agentSettings = buildConfiguredAgentSettings(\n sourceAgentSettings,\n options.runtimeServicesInfo,\n );\n const acpServerTag = acpMode\n ? getAcpServerTag(sourceAgentSettings)\n : undefined;\n\n const sourceConversationOptions = options.encryptedConversationSettings\n ? {\n ...options,\n settings: {\n ...options.settings,\n conversation_settings: options.encryptedConversationSettings,\n },\n }\n : options;\n\n const conversationSettings = buildConfiguredConversationSettings(\n sourceConversationOptions,\n );\n\n const payload: StartConversationPayload = {\n // ``agent_profile_id`` and ``agent_settings`` are mutually exclusive agent\n // sources; the profile path lets the server resolve the profile (#3727).\n //\n // Enrichment boundary: on the profile path the server rebuilds the agent\n // purely from the stored profile fields, so the client-owned enrichments\n // this adapter folds into ``agent_settings`` do NOT apply. The exec toolset\n // (terminal/file_editor/task_tracker) and public-skill loading are the\n // server/SDK's responsibility to restore on the profile path — tracked in\n // software-agent-sdk#3967 (profile resolution must attach the default\n // toolset + public skills, else a profile-launched OpenHands agent has only\n // Finish/Think). The dev ``RUNTIME_SERVICES`` system-message suffix remains\n // agent-settings-only; the Canvas UI tool is a top-level client tool and\n // therefore works on both inline-agent and profile launch paths.\n //\n // Persistent memory is NOT on that boundary: ``load_memory`` is a global\n // user preference, so the agent-server stamps the stored\n // ``agent_settings.agent_context.load_memory`` onto the profile-resolved\n // agent the same way it already applies the global ``mcp_config``. The\n // toggle therefore applies to both launch paths, and the client must not\n // re-send it here (``agent_profile_id`` and ``agent_settings`` are\n // mutually exclusive).\n ...(options.agentProfileId\n ? { agent_profile_id: options.agentProfileId }\n : { agent_settings: agentSettings }),\n workspace: conversationSettings.workspace,\n // The agent-server caches each client tool's schema per tool *name* for the\n // life of the process and rejects a re-registration with a different schema\n // (`ClientToolSchemaConflictError`). Editing either schema below therefore\n // requires restarting a long-running dev agent-server before new\n // conversations can start.\n client_tools:\n launchAgentKind === \"openhands\"\n ? [CANVAS_UI_CLIENT_TOOL, LAUNCH_CHILD_CONVERSATION_CLIENT_TOOL]\n : [],\n confirmation_policy:\n getConversationConfirmationPolicy(conversationSettings),\n max_iterations:\n typeof conversationSettings.max_iterations === \"number\"\n ? conversationSettings.max_iterations\n : 500,\n stuck_detection: true,\n autotitle: true,\n ...(options.titleLlmProfile\n ? { title_llm_profile: options.titleLlmProfile }\n : {}),\n worktree: options.worktree ?? true,\n };\n\n // A profile launch resolves the ACP server server-side, so don't stamp the\n // tag from current settings (it may not match the launched profile).\n if (!options.agentProfileId && acpServerTag) {\n payload.tags = { [ACP_SERVER_TAG_KEY]: acpServerTag };\n }\n\n // ``secrets_encrypted`` makes the agent-server decrypt request secrets at\n // conversation start. Non-ACP conversations need it for encrypted LLM keys.\n // ACP normally carries provider credentials as LookupSecrets, so avoid\n // forcing a cipher on fresh ACP-only backends. The exception is MCP:\n // encrypted settings round-trip mcp_config secrets as Fernet tokens,\n // and ACP forwards mcp_config directly to the subprocess.\n if (\n !options.agentProfileId &&\n options.secretsEncrypted &&\n (!acpMode || hasEncryptedMcpSecrets(agentSettings.mcp_config))\n ) {\n payload.secrets_encrypted = true;\n }\n\n if (options.conversationId) {\n payload.conversation_id = options.conversationId;\n }\n\n if (options.parentConversationId) {\n payload.parent_conversation_id = options.parentConversationId;\n }\n\n const securityAnalyzer =\n getConversationSecurityAnalyzer(conversationSettings);\n if (securityAnalyzer) {\n payload.security_analyzer = securityAnalyzer;\n }\n\n if (conversationSettings.initial_message) {\n payload.initial_message = conversationSettings.initial_message;\n }\n\n if (conversationSettings.plugins) {\n payload.plugins = conversationSettings.plugins;\n }\n\n if (conversationSettings.hook_config) {\n payload.hook_config = conversationSettings.hook_config;\n }\n\n const toolModuleQualnames = {\n ...((conversationSettings.tool_module_qualnames as\n | Record<string, string>\n | undefined) ?? {}),\n };\n delete toolModuleQualnames[LEGACY_CANVAS_UI_TOOL_NAME];\n delete toolModuleQualnames[CANVAS_UI_CLIENT_TOOL_NAME];\n delete toolModuleQualnames[LAUNCH_CHILD_CONVERSATION_TOOL_NAME];\n if (Object.keys(toolModuleQualnames).length > 0) {\n payload.tool_module_qualnames = toolModuleQualnames;\n }\n\n if (conversationSettings.agent_definitions) {\n payload.agent_definitions = conversationSettings.agent_definitions;\n }\n\n // Every saved secret rides as a LookupSecret the agent-server resolves back\n // from its own store at spawn time — ``request.secrets`` is the sole channel,\n // uniform for ACP and non-ACP (agent-canvas#1039). For ACP the resolution\n // runs off the event loop (software-agent-sdk#3510, >=1.25.0), so the loopback\n // fetch can't deadlock.\n if (options.customSecrets && options.customSecrets.length > 0) {\n const backend = getEffectiveLocalBackend();\n const headers = backend ? buildAuthHeaders(backend) : {};\n\n const secrets: Record<string, LookupSecret> = {};\n for (const secret of options.customSecrets) {\n const lookupSecret: LookupSecret = {\n kind: \"LookupSecret\",\n url: `/api/settings/secrets/${encodeURIComponent(secret.name)}`,\n description: secret.description,\n };\n\n if (Object.keys(headers).length > 0) {\n lookupSecret.headers = headers;\n }\n\n secrets[secret.name] = lookupSecret;\n }\n\n payload.secrets = secrets;\n }\n\n return payload;\n}\n\nexport const SUBSCRIPTION_LOGIN_REQUIRED_ERROR =\n \"Connect your ChatGPT subscription before starting a conversation with this LLM profile.\";\n\n/**\n * Throws if a ChatGPT subscription LLM profile is not connected.\n * Called before conversation creation and LLM profile switch only — not on\n * subsequent message sends or conversation resume. The agent-server must handle\n * mid-conversation token expiry gracefully.\n */\nexport async function assertSubscriptionAuthReady(\n agentSettings: Record<string, unknown>,\n): Promise<void> {\n const llm = toRecord(agentSettings.llm);\n if (!isSubscriptionLlmConfig(llm)) return;\n\n const status = await LLMSubscriptionService.getOpenAIStatus();\n if (!status.connected) {\n throw new Error(SUBSCRIPTION_LOGIN_REQUIRED_ERROR);\n }\n}\n\nexport async function buildStartConversationRequestWithEncryptedSettings(options: {\n settings: Settings;\n query?: string;\n conversationInstructions?: string;\n plugins?: PluginSpec[];\n conversationId?: string;\n parentConversationId?: string;\n workingDir?: string;\n worktree?: boolean;\n agentProfileId?: string;\n agentProfileKind?: AgentKind;\n titleLlmProfile?: string;\n}): Promise<Record<string, unknown>> {\n const { SecretsService } = await import(\"./secrets-service\");\n\n const [settingsResult, customSecrets, runtimeServicesInfo] =\n await Promise.all([\n SettingsService.getSettingsForConversation(),\n SecretsService.getSecrets(),\n fetchBackendRuntimeServicesInfo(),\n ]);\n\n const { agentSettings, conversationSettings, secretsEncrypted } =\n settingsResult;\n\n // A profile launch resolves the LLM server-side, so the current-settings\n // subscription check doesn't apply (and can't see the profile's LLM).\n if (!options.agentProfileId) {\n await assertSubscriptionAuthReady(agentSettings);\n }\n\n return buildStartConversationRequest({\n ...options,\n encryptedAgentSettings: agentSettings,\n encryptedConversationSettings: conversationSettings,\n secretsEncrypted,\n customSecrets,\n runtimeServicesInfo,\n });\n}\n\nexport function emptyHooksResponse(): GetHooksResponse {\n return { hooks: [] };\n}\n"],"mappings":"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"}