@openhands/agent-canvas 1.0.0-alpha.4 → 1.0.0-alpha.5

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 (204) hide show
  1. package/build/assets/acp-providers-SCPK1BIU.js +1 -0
  2. package/build/assets/{acp-route-guard-CY4Kktrm.js → acp-route-guard-IWlFmS6x.js} +1 -1
  3. package/build/assets/active-backend-context-CkP3ZEJs.js +1 -0
  4. package/build/assets/{add-backend-modal-MoeYcSlW.js → add-backend-modal-CqjNjGqY.js} +1 -1
  5. package/build/assets/{agent-server-compatibility-DnXbX5aL.js → agent-server-compatibility-DvKtnXHw.js} +1 -1
  6. package/build/assets/agent-server-conversation-service.api-BdEre_71.js +5 -0
  7. package/build/assets/{agent-settings-D9CvPVkc.js → agent-settings-DdisD2Xx.js} +1 -1
  8. package/build/assets/{alert-banner-BopWFWDK.js → alert-banner-CvTYN73l.js} +1 -1
  9. package/build/assets/{analytics-consent-form-modal-FvOoRQJt.js → analytics-consent-form-modal-BKgT9i2w.js} +1 -1
  10. package/build/assets/{app-settings-Dh9WIVcy.js → app-settings-DcYXtxGP.js} +1 -1
  11. package/build/assets/{automation-detail-B1toFzbL.js → automation-detail-ZQs6D2d3.js} +1 -1
  12. package/build/assets/{automations-list-lQ_f_eVe.js → automations-list-CqHXGwSw.js} +1 -1
  13. package/build/assets/backend-form-modal-KudhWUX8.js +1 -0
  14. package/build/assets/{backend-synced-settings-badge-f7SIwZJJ.js → backend-synced-settings-badge-BFy2HylT.js} +1 -1
  15. package/build/assets/{base-modal-D0AZIorb.js → base-modal-B4HvlFHE.js} +1 -1
  16. package/build/assets/{browser-store-CYpN823z.js → browser-store-C3AqxAO7.js} +1 -1
  17. package/build/assets/{browser-tab-Cy5h30Rj.js → browser-tab-DTM6RyoV.js} +1 -1
  18. package/build/assets/{browser-CqONu_f3.js → browser-vYpdU3CR.js} +1 -1
  19. package/build/assets/{circle-plus-check-toggle-BLCVOBAz.js → circle-plus-check-toggle-DRvuu-RD.js} +1 -1
  20. package/build/assets/{color-themes-VfRROuOB.js → color-themes-DSaoIL6A.js} +1 -1
  21. package/build/assets/{command-store-BUJOHJw0.js → command-store-DFN_17p1.js} +1 -1
  22. package/build/assets/{condenser-settings-tU2QpcvW.js → condenser-settings-DduLQcpV.js} +1 -1
  23. package/build/assets/{confirmation-modal-C9X6T5NM.js → confirmation-modal-B-DOYMUH.js} +1 -1
  24. package/build/assets/{context-menu-list-item-CdiNsCXt.js → context-menu-list-item-DzjPB8aC.js} +1 -1
  25. package/build/assets/conversation-CeGMBOyB.js +1 -0
  26. package/build/assets/conversation-D8scXOe7.js +17 -0
  27. package/build/assets/conversation-panel-DMz46ji-.js +1 -0
  28. package/build/assets/{conversation-service.api-bFeuJPps.js → conversation-service.api-YTGTw0pz.js} +1 -1
  29. package/build/assets/conversation-state-store-Bc0slAjL.js +1 -0
  30. package/build/assets/{conversation-store-CAtSuhbI.js → conversation-store-Z5iMCRpc.js} +1 -1
  31. package/build/assets/conversation-websocket-context-B0Gd3yiT.js +3 -0
  32. package/build/assets/{device-verify-B3pEa6X6.js → device-verify-CTbXX9CQ.js} +1 -1
  33. package/build/assets/dist-yMQV8IUk.js +1 -0
  34. package/build/assets/{edit-automation-modal-CoJon94X.js → edit-automation-modal-DgW0Q8vr.js} +1 -1
  35. package/build/assets/{ellipsis-button-BMXoWChN.js → ellipsis-button-BoU2-xlG.js} +1 -1
  36. package/build/assets/{entry.client-DH09zdmW.js → entry.client-DU7-q4ZU.js} +2 -2
  37. package/build/assets/{environment-switch-overlay-akifSJ7a.js → environment-switch-overlay-DQ1n6Iu6.js} +1 -1
  38. package/build/assets/{extensions-hub-BTPY21Mo.js → extensions-hub-BW1FAKFJ.js} +1 -1
  39. package/build/assets/{extensions-navigation-Bw61uJe9.js → extensions-navigation-CbPMhSML.js} +1 -1
  40. package/build/assets/{files-tab-CsZQRSpv.js → files-tab-CbJ4s7Ik.js} +1 -1
  41. package/build/assets/files-tab-store-CDyVTXNT.js +1 -0
  42. package/build/assets/git-control-bar-branch-button-DhpPgadK.js +27 -0
  43. package/build/assets/git-provider-icon-D8RE4unY.js +1 -0
  44. package/build/assets/health-store-BDC2rM-X.js +1 -0
  45. package/build/assets/{home-7IR9W24e.js → home-D9fJfhQA.js} +1 -1
  46. package/build/assets/{install-server-modal-BL4pprnN.js → install-server-modal-VB5hOBpW.js} +1 -1
  47. package/build/assets/{launch-Bd5avLyw.js → launch-DKCU9uJH.js} +1 -1
  48. package/build/assets/{llm-client-BvUU4If8.js → llm-client-BpIfxETv.js} +1 -1
  49. package/build/assets/{llm-settings-yIFf1UoE.js → llm-settings-BOJC4vD-.js} +1 -1
  50. package/build/assets/llm-settings-CIdxmimN.js +1 -0
  51. package/build/assets/{manage-backends-modal-buYNliLv.js → manage-backends-modal-DqpzcxdI.js} +1 -1
  52. package/build/assets/{manage-workspaces-modal-BiTj6Z4W.js → manage-workspaces-modal-eG6XgAvw.js} +1 -1
  53. package/build/assets/manifest-f141dc70.js +1 -0
  54. package/build/assets/{markdown-renderer-CeCYDWvz.js → markdown-renderer-wZnLDbA1.js} +1 -1
  55. package/build/assets/{mcp-DSzTA9H1.js → mcp-BdfyCW1l.js} +1 -1
  56. package/build/assets/{messages-x5kGl-bQ.js → messages-BfaEAG2q.js} +1 -1
  57. package/build/assets/{model-selector-CED-tBXx.js → model-selector-7id-Uirf.js} +1 -1
  58. package/build/assets/{navigation-link-C_YVC2i-.js → navigation-link-DFQ7YcWq.js} +1 -1
  59. package/build/assets/{option-service.api-Bqy363N2.js → option-service.api-DN0ZcGjw.js} +1 -1
  60. package/build/assets/{organization-service.api-BAwDUJoL.js → organization-service.api-Ct2dZF8M.js} +1 -1
  61. package/build/assets/{path-utils-3ccf0YXA.js → path-utils-D1ZtqFC7.js} +1 -1
  62. package/build/assets/{planner-tab-b0Q_JZvr.js → planner-tab-yubfN-6U.js} +1 -1
  63. package/build/assets/{profiles-client-Cj9KHwuq.js → profiles-client-D4twHRVf.js} +1 -1
  64. package/build/assets/{providers-CdDNvcEb.js → providers-C2T07PM3.js} +1 -1
  65. package/build/assets/{proxy-3uQm0NJ9.js → proxy-BMZyC45G.js} +1 -1
  66. package/build/assets/query-client-config-CiK0GJJO.js +1 -0
  67. package/build/assets/{recommended-automations-launcher--puKMsm-.js → recommended-automations-launcher-Cx7svuGE.js} +17 -3
  68. package/build/assets/root-layout-DvYGxAnr.js +2 -0
  69. package/build/assets/root-luPHQiBx.js +2 -0
  70. package/build/assets/{sdk-section-page-Dgmjx3Nh.js → sdk-section-page-03k88tIR.js} +1 -1
  71. package/build/assets/{sdk-settings-schema-QrDJfOon.js → sdk-settings-schema-BY8dOy3a.js} +1 -1
  72. package/build/assets/{secrets-service-Dy7jaVk0.js → secrets-service-Z3qtRb_G.js} +1 -1
  73. package/build/assets/{secrets-settings-9X_bB7-j.js → secrets-settings-BnlByuMZ.js} +1 -1
  74. package/build/assets/{server-client-BvA-DepM.js → server-client-CG1zHqph.js} +1 -1
  75. package/build/assets/{settings-CLfgxw_Q.js → settings-DyzGLF_d.js} +1 -1
  76. package/build/assets/{settings-client-DjnapAI3.js → settings-client-CkXDJwIY.js} +1 -1
  77. package/build/assets/{settings-dropdown-input-1bMoP5ld.js → settings-dropdown-input-CAQWQgx-.js} +1 -1
  78. package/build/assets/{settings-index-QV1myqj-.js → settings-index-KtTw49xL.js} +1 -1
  79. package/build/assets/{settings-input-Bz9QClNU.js → settings-input-BWCZt9g2.js} +1 -1
  80. package/build/assets/{settings-list-classes-vFnNAdFx.js → settings-list-classes-xMleGkTC.js} +1 -1
  81. package/build/assets/{settings-modal-CmsyiNtY.js → settings-modal-Cv2YWSUY.js} +1 -1
  82. package/build/assets/{settings-service.api-DfJwVvYA.js → settings-service.api-Z6x0l0GU.js} +1 -1
  83. package/build/assets/{shared-conversation-CsGvti_a.js → shared-conversation-BfZNCsvo.js} +1 -1
  84. package/build/assets/{sidebar-mobile-menu-toggle-CRQrI0ED.js → sidebar-mobile-menu-toggle-DXplko7u.js} +1 -1
  85. package/build/assets/{sidebar-nav-link-qrRmYl8T.js → sidebar-nav-link-B4h8naZ7.js} +1 -1
  86. package/build/assets/{sidebar-store-CUm9qCi_.js → sidebar-store-cOeaKmIm.js} +1 -1
  87. package/build/assets/{skill-card-pill-row-DdaVfIxC.js → skill-card-pill-row-D0oTWx-a.js} +1 -1
  88. package/build/assets/{skills-plugins-BX5zDQC6.js → skills-plugins-BTnp7QcQ.js} +1 -1
  89. package/build/assets/{skills-settings-CuoWDnTN.js → skills-settings-CbOQvzkR.js} +1 -1
  90. package/build/assets/{styled-tooltip-C7QOGK28.js → styled-tooltip-Awq4HMw3.js} +1 -1
  91. package/build/assets/{task-list-tab-Bz7_oCIo.js → task-list-tab-B45ktzHM.js} +1 -1
  92. package/build/assets/{terminal-CRX7ZSEA.js → terminal-D5pzR9Ru.js} +1 -1
  93. package/build/assets/{typography-BqlA_dVV.js → typography-BbaUAC4V.js} +1 -1
  94. package/build/assets/{use-active-conversation-DOLpeZZ5.js → use-active-conversation-Bu5J9iLy.js} +1 -1
  95. package/build/assets/{use-agent-settings-schema-D90oKLgR.js → use-agent-settings-schema-BbtOsR7P.js} +1 -1
  96. package/build/assets/{use-agent-state-BqaILzms.js → use-agent-state-DN9Nc5pP.js} +1 -1
  97. package/build/assets/{use-cloud-current-user-id-Dy9b3ahi.js → use-cloud-current-user-id-B_rMUiu8.js} +1 -1
  98. package/build/assets/{use-config-BD9X1AvI.js → use-config-Bcz2JL2t.js} +1 -1
  99. package/build/assets/{use-conversation-id-DPRiMh48.js → use-conversation-id-BOaaZahn.js} +1 -1
  100. package/build/assets/{use-create-conversation-B4M_yYz3.js → use-create-conversation-BWFA_FId.js} +1 -1
  101. package/build/assets/{use-event-store-DDhcATXi.js → use-event-store-CQZCcVz-.js} +1 -1
  102. package/build/assets/{use-handle-plan-click-Dno7Yfm3.js → use-handle-plan-click-CgrCGmT1.js} +1 -1
  103. package/build/assets/{use-is-creating-conversation-CVum0xhv.js → use-is-creating-conversation-DhoM7UAB.js} +1 -1
  104. package/build/assets/{use-launch-skill-in-chat-sASpuCpy.js → use-launch-skill-in-chat-DOyQsXFO.js} +1 -1
  105. package/build/assets/{use-llm-profiles-DHxXPcrl.js → use-llm-profiles-CAIzHJDX.js} +1 -1
  106. package/build/assets/{use-runtime-is-ready-C-dZi-ZU.js → use-runtime-is-ready-BQWLEyqa.js} +1 -1
  107. package/build/assets/{use-save-settings-pkHKHB31.js → use-save-settings-5m3w89Ph.js} +1 -1
  108. package/build/assets/{use-settings-ClRWXa6p.js → use-settings-DzG0C3vO.js} +1 -1
  109. package/build/assets/{use-settings-nav-items-CDy22kOR.js → use-settings-nav-items-BIsKeX52.js} +1 -1
  110. package/build/assets/use-skills-Cn-78xP1.js +1 -0
  111. package/build/assets/{use-task-list-BwJGWML_.js → use-task-list-Bs90uF2N.js} +1 -1
  112. package/build/assets/{use-unified-vscode-url-DU7On_6w.js → use-unified-vscode-url-C5iI-Z5A.js} +1 -1
  113. package/build/assets/{use-user-conversation-DdUU6uqz.js → use-user-conversation-BCYpbPT1.js} +1 -1
  114. package/build/assets/{vendor~conversation-panel~conversation-CJfSHdwC.js → vendor~conversation-panel~conversation-CbjvWBSu.js} +1 -1
  115. package/build/assets/{vendor~conversation-panel~conversation~index-DZ7eKFW3.js → vendor~conversation-panel~conversation~index-C23ZXO4R.js} +1 -1
  116. package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~jfc6hidu-ksomn5Bg.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~jfc6hidu-VnmIZrq3.js} +1 -1
  117. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CM_1dibO.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-B92czPCF.js} +1 -1
  118. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-B-s2ZXN7.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-BbFOrAjI.js} +1 -1
  119. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-bTqZAHqW.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-By5W2oHN.js} +1 -1
  120. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-8cYFyeHR.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-CofhIDpd.js} +1 -1
  121. package/build/assets/{vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-uK_SqCPd.js → vendor~home~conversation-panel~conversation~shared-conversation~planner-tab~files-tab-DpAdkv8m.js} +1 -1
  122. package/build/assets/{vendor~home~mcp~automations-list-a--VL9Np.js → vendor~home~mcp~automations-list-DRfWZRnF.js} +1 -1
  123. package/build/assets/{vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-WuKCleb6.js → vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-BQPOygpY.js} +2 -2
  124. package/build/assets/{vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-BG3to4e4.js → vendor~home~mcp~llm-settings~agent-settings~condenser-settings~verification-settings~app-se~ocm3mykx-CyYIBiBk.js} +1 -1
  125. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation-DL8iX8eY.js → vendor~root-layout~home~conversation-panel~conversation-DjAjXS5J.js} +1 -1
  126. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-8l0SYWBt.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-CFpDeb9o.js} +1 -1
  127. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-CrBN5IsU.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-CuGq_cxH.js} +1 -1
  128. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~k776hupu-DHbj3Bsh.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~k776hupu-C1p8-pMr.js} +2 -2
  129. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~dp08i1qy-BJm2mGIp.js +48 -0
  130. package/build/assets/{verification-settings-CiaMSkli.js → verification-settings-DbziMp4K.js} +1 -1
  131. package/build/assets/{vscode-tab-DkUK-4Xb.js → vscode-tab-BVhQR2rt.js} +1 -1
  132. package/build/index.html +4 -4
  133. package/dist/constants/acp-providers.cjs +1 -1
  134. package/dist/constants/acp-providers.cjs.map +1 -1
  135. package/dist/constants/acp-providers.d.ts +10 -18
  136. package/dist/constants/acp-providers.js +42 -209
  137. package/dist/constants/acp-providers.js.map +1 -1
  138. package/dist/hooks/query/use-paginated-conversations.cjs +1 -1
  139. package/dist/hooks/query/use-paginated-conversations.cjs.map +1 -1
  140. package/dist/hooks/query/use-paginated-conversations.js +2 -1
  141. package/dist/hooks/query/use-paginated-conversations.js.map +1 -1
  142. package/dist/node_modules/@openhands/typescript-client/dist/index.cjs +1 -1
  143. package/dist/node_modules/@openhands/typescript-client/dist/index.js +1 -0
  144. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs +2 -0
  145. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.cjs.map +1 -0
  146. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js +213 -0
  147. package/dist/node_modules/@openhands/typescript-client/dist/models/acp-providers.js.map +1 -0
  148. package/dist/node_modules/@openhands/typescript-client/dist/models/acp.cjs +2 -0
  149. package/dist/node_modules/@openhands/typescript-client/dist/models/acp.cjs.map +1 -0
  150. package/dist/node_modules/@openhands/typescript-client/dist/models/acp.js +10 -0
  151. package/dist/node_modules/@openhands/typescript-client/dist/models/acp.js.map +1 -0
  152. package/dist/package.cjs +1 -1
  153. package/dist/package.cjs.map +1 -1
  154. package/dist/package.js +3 -3
  155. package/dist/package.js.map +1 -1
  156. package/dist/query-client-config.cjs +1 -1
  157. package/dist/query-client-config.cjs.map +1 -1
  158. package/dist/query-client-config.js +30 -23
  159. package/dist/query-client-config.js.map +1 -1
  160. package/package.json +3 -3
  161. package/scripts/check-sdk-version-sync.mjs +6 -6
  162. package/scripts/dev-safe.mjs +1 -1
  163. package/build/assets/acp-providers-BhOEPsud.js +0 -1
  164. package/build/assets/active-backend-context-jthDtMCD.js +0 -1
  165. package/build/assets/agent-server-conversation-service.api-CA7hOJAy.js +0 -5
  166. package/build/assets/backend-form-modal-DbriBS-v.js +0 -1
  167. package/build/assets/conversation-CDHXbtHw.js +0 -17
  168. package/build/assets/conversation-Dd7NkKCq.js +0 -1
  169. package/build/assets/conversation-panel-BZ1-fw2m.js +0 -1
  170. package/build/assets/conversation-state-store-Dpa4x70O.js +0 -1
  171. package/build/assets/conversation-websocket-context-BEeh-jIG.js +0 -3
  172. package/build/assets/dist-dxViYC8L.js +0 -1
  173. package/build/assets/files-tab-store-ymnFnIBO.js +0 -1
  174. package/build/assets/git-control-bar-branch-button-BzqhhzW4.js +0 -27
  175. package/build/assets/git-provider-icon-Cf-vdwYZ.js +0 -1
  176. package/build/assets/llm-settings-BwVWlOyB.js +0 -1
  177. package/build/assets/manifest-e27751af.js +0 -1
  178. package/build/assets/query-client-config-BtB8Yvpf.js +0 -1
  179. package/build/assets/root-Xt6cd1J6.js +0 -2
  180. package/build/assets/root-layout-Bp7iQEOJ.js +0 -2
  181. package/build/assets/skills-client-DOeT6HEj.js +0 -1
  182. package/build/assets/use-skills-C2S3iOtJ.js +0 -1
  183. package/build/assets/vendor~root-layout~home~conversation-panel~conversation~launch~automations-list~automation-~f57mv2f3-D6ItaxF-.js +0 -48
  184. package/scripts/check-acp-providers-sync.mjs +0 -560
  185. /package/build/assets/{agent-server-client-options-BvlH7qGM.js → agent-server-client-options-8OJSXbm8.js} +0 -0
  186. /package/build/assets/{agent-server-ui-style-scope-DWLieFHA.js → agent-server-ui-style-scope-BwIZYdC1.js} +0 -0
  187. /package/build/assets/{brand-button-BYloqbQ3.js → brand-button-8fVVei4i.js} +0 -0
  188. /package/build/assets/{combobox-caret-C7rVhI_V.js → combobox-caret-BMsz5mQX.js} +0 -0
  189. /package/build/assets/{conversation-local-storage-BQSptoYo.js → conversation-local-storage-UYl-SX-r.js} +0 -0
  190. /package/build/assets/{dist-3eF0ujsw.js → dist-DZHSA2e6.js} +0 -0
  191. /package/build/assets/{environment-switch-store-CBXkf5bS.js → environment-switch-store-C4ulFJKp.js} +0 -0
  192. /package/build/assets/{loading-spinner-D-ea2dZq.js → loading-spinner-91b5FiMQ.js} +0 -0
  193. /package/build/assets/{middleware-iK-zKVe0.js → middleware-BC9EwbB9.js} +0 -0
  194. /package/build/assets/{modal-backdrop-DML21GPD.js → modal-backdrop-B04pVYAD.js} +0 -0
  195. /package/build/assets/{modal-body-RpEv_U1i.js → modal-body-CgUoFQA1.js} +0 -0
  196. /package/build/assets/{modal-close-button-SKLwT3A4.js → modal-close-button-SM_WXzDY.js} +0 -0
  197. /package/build/assets/{navigation-context-DtjWNE3F.js → navigation-context-BFjstyH6.js} +0 -0
  198. /package/build/assets/{objectWithoutPropertiesLoose-SGdQSpMZ.js → objectWithoutPropertiesLoose-Du6eBn-V.js} +0 -0
  199. /package/build/assets/{openhands-logo-BRKD7Ir9.js → openhands-logo-DkDp75rC.js} +0 -0
  200. /package/build/assets/{query-keys-D5xWPArX.js → query-keys-tAsQcc_9.js} +0 -0
  201. /package/build/assets/{react-DMUxGBRt.js → react-Do0CT17Y.js} +0 -0
  202. /package/build/assets/{vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~zm51vy4j-Csgp2p8o.js → vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~zm51vy4j-iOsylxCS.js} +0 -0
  203. /package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~i4kjfqhl-BdNVgtVT.js → vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~i4kjfqhl-BebWhFNT.js} +0 -0
  204. /package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~pfbaerbd-DFFy3NX_.js → vendor~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-settin~pfbaerbd-zhv9fooy.js} +0 -0
@@ -1,2 +1,2 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/dist-dxViYC8L.js","assets/vendor~conversation-panel~conversation~index-DZ7eKFW3.js","assets/rolldown-runtime-BFRubm34.js","assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~i4kjfqhl-BdNVgtVT.js","assets/react-CM_dJw1Z.js"])))=>i.map(i=>d[i]);
2
- import{a as e}from"./rolldown-runtime-BFRubm34.js";import{t}from"./react-CM_dJw1Z.js";import{t as n}from"./preload-helper-CT1Z6Pdu.js";import{t as r}from"./react-dom-hVBnwgwZ.js";import{o as i}from"./declaration-C9nuq2Dj.js";import{A as a,D as o,N as s,O as c,P as l,_ as u,a as d,b as f,g as p,h as m,n as h,o as g,p as _,r as v,s as y,t as b,w as x}from"./vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-CrBN5IsU.js";import{C as S,D as C,O as w,X as T,Y as E,d as D,g as O,i as k,l as A,m as j,st as M,t as ee,ut as te,x as ne}from"./vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-8l0SYWBt.js";function re(e,t){if(e!=null){if(o(e)){e(t);return}try{e.current=t}catch{throw Error(`Cannot assign value '${t}' to ref '${e}'`)}}}function ie(...e){return t=>{e.forEach(e=>re(e,t))}}var N=e(t(),1),P=e(r(),1),F=N.createContext(null);function I(e){let{children:t}=e,n=(0,N.useContext)(F),[r,i]=(0,N.useState)(0),a=(0,N.useMemo)(()=>({parent:n,modalCount:r,addModal(){i(e=>e+1),n&&n.addModal()},removeModal(){i(e=>e-1),n&&n.removeModal()}}),[n,r]);return N.createElement(F.Provider,{value:a},t)}function L(){let e=(0,N.useContext)(F);return{modalProviderProps:{"aria-hidden":e&&e.modalCount>0?!0:void 0}}}function R(e){let{modalProviderProps:t}=L();return N.createElement(`div`,{"data-overlay-container":!0,...e,...t})}function z(e){return N.createElement(I,null,N.createElement(R,e))}function B(e){let t=te(),{portalContainer:n=t?null:document.body,...r}=e,{getContainer:i}=k();if(!e.portalContainer&&i&&(n=i()),N.useEffect(()=>{if(n?.closest(`[data-overlay-container]`))throw Error(`An OverlayContainer must not be inside another container. Please change the portalContainer prop.`)},[n]),!n)return null;let a=N.createElement(z,r);return P.createPortal(a,n)}var V=1500,H=500,U={},W=0,G=!1,K=null,q=null;function ae(e={}){let{delay:t=V,closeDelay:n=H}=e,{isOpen:r,open:i,close:a}=ee(e),o=(0,N.useMemo)(()=>`${++W}`,[]),s=(0,N.useRef)(null),c=(0,N.useRef)(a),l=()=>{U[o]=f},u=()=>{for(let e in U)e!==o&&(U[e](!0),delete U[e])},d=()=>{s.current&&clearTimeout(s.current),s.current=null,u(),l(),G=!0,i(),K&&=(clearTimeout(K),null),q&&=(clearTimeout(q),null)},f=e=>{e||n<=0?(s.current&&clearTimeout(s.current),s.current=null,c.current()):s.current||=setTimeout(()=>{s.current=null,c.current()},n),K&&=(clearTimeout(K),null),G&&(q&&clearTimeout(q),q=setTimeout(()=>{delete U[o],q=null,G=!1},Math.max(H,n)))},p=()=>{u(),l(),!r&&!G?(K&&clearTimeout(K),K=setTimeout(()=>{K=null,G=!0,d()},t)):r||d()};return(0,N.useEffect)(()=>{c.current=a},[a]),(0,N.useEffect)(()=>()=>{s.current&&clearTimeout(s.current),U[o]&&delete U[o]},[o]),{isOpen:r,open:e=>{!e&&t>0&&!s.current?p():d()},close:f}}function oe(e,t){let n=E(e,{labelable:!0}),{hoverProps:r}=A({onHoverStart:()=>t?.open(!0),onHoverEnd:()=>t?.close()});return{tooltipProps:T(n,r,{role:`tooltip`})}}function se(e,t,n){let{isDisabled:r,trigger:i,shouldCloseOnPress:a=!0}=e,o=M(),s=(0,N.useRef)(!1),c=(0,N.useRef)(!1),l=()=>{(s.current||c.current)&&t.open(c.current)},u=e=>{!s.current&&!c.current&&t.close(e)};(0,N.useEffect)(()=>{let e=e=>{n&&n.current&&e.key===`Escape`&&(e.stopPropagation(),t.close(!0))};if(t.isOpen)return document.addEventListener(`keydown`,e,!0),()=>{document.removeEventListener(`keydown`,e,!0)}},[n,t]);let d=()=>{i!==`focus`&&(j()===`pointer`?s.current=!0:s.current=!1,l())},f=()=>{i!==`focus`&&(c.current=!1,s.current=!1,u())},p=()=>{a&&(c.current=!1,s.current=!1,u(!0))},m=()=>{O()&&(c.current=!0,l())},h=()=>{c.current=!1,s.current=!1,u(!0)},{hoverProps:g}=A({isDisabled:r,onHoverStart:d,onHoverEnd:f}),{focusableProps:_}=D({isDisabled:r,onFocus:m,onBlur:h},n);return{triggerProps:{"aria-describedby":t.isOpen?o:void 0,...T(_,g,{onPointerDown:p,onKeyDown:p}),tabIndex:void 0},tooltipProps:{id:o}}}function J(e){let t=f(),[n,r]=u(e,_.variantKeys),{ref:i,as:o,isOpen:s,content:d,children:p,defaultOpen:y,onOpenChange:S,isDisabled:C,trigger:w,shouldFlip:T=!0,containerPadding:E=12,placement:D=`top`,delay:O=0,closeDelay:k=500,showArrow:A=!1,offset:j=7,crossOffset:M=0,isDismissable:ee,shouldCloseOnBlur:te=!0,portalContainer:re,isKeyboardDismissDisabled:P=!1,updatePositionDeps:F=[],shouldCloseOnInteractOutside:I,className:L,onClose:R,motionProps:z,classNames:B,...V}=n,H=o||`div`,U=e?.disableAnimation??t?.disableAnimation??!1,W=ae({delay:O,closeDelay:k,isDisabled:C,defaultOpen:y,isOpen:s,onOpenChange:e=>{S?.(e),e||R?.()}}),G=(0,N.useRef)(null),K=(0,N.useRef)(null),q=(0,N.useId)(),J=W.isOpen&&!C;(0,N.useImperativeHandle)(i,()=>l(K));let{triggerProps:Y,tooltipProps:ce}=se({isDisabled:C,trigger:w},W,G),{tooltipProps:X}=oe({isOpen:J,...c(n,ce)},W),{overlayProps:Z,placement:Q,updatePosition:le}=ne({isOpen:J,targetRef:G,placement:g(D),overlayRef:K,offset:A?j+3:j,crossOffset:M,shouldFlip:T,containerPadding:E});h(()=>{F.length&&le()},F);let{overlayProps:ue}=b({isOpen:J,onClose:W.close,isDismissable:ee,shouldCloseOnBlur:te,isKeyboardDismissDisabled:P,shouldCloseOnInteractOutside:I},K),$=(0,N.useMemo)(()=>_({...r,disableAnimation:U,radius:e?.radius??`md`,size:e?.size??`md`,shadow:e?.shadow??`sm`}),[a(r),U,e?.radius,e?.size,e?.shadow]),de=(0,N.useCallback)((e={},t=null)=>({...c(Y,e),ref:ie(t,G),"aria-describedby":J?q:void 0}),[Y,J,q,W]),fe=(0,N.useCallback)(()=>({ref:K,"data-slot":`base`,"data-open":x(J),"data-arrow":x(A),"data-disabled":x(C),"data-placement":v(Q||`top`,D),...c(X,ue,V),style:c(Z.style,V.style,n.style),className:$.base({class:B?.base}),id:q}),[$,J,A,C,Q,D,X,ue,V,Z,n,q]);return{Component:H,content:d,children:p,isOpen:J,triggerRef:G,showArrow:A,portalContainer:re,placement:D,disableAnimation:U,isDisabled:C,motionProps:z,getTooltipContentProps:(0,N.useCallback)(()=>({"data-slot":`content`,"data-open":x(J),"data-arrow":x(A),"data-disabled":x(C),"data-placement":v(Q||`top`,D),className:$.content({class:m(B?.content,L)})}),[$,J,A,C,Q,D,B]),getTriggerProps:de,getTooltipProps:fe}}var Y=i(),ce=()=>n(()=>import(`./dist-dxViYC8L.js`).then(e=>e.default),__vite__mapDeps([0,1,2,3,4])),X=p((e,t)=>{let{Component:n,children:r,content:i,isOpen:a,portalContainer:o,placement:l,disableAnimation:u,motionProps:f,getTriggerProps:p,getTooltipProps:m,getTooltipContentProps:h}=J({...e,ref:t}),g;try{if(N.Children.count(r)!==1)throw Error();if(!(0,N.isValidElement)(r))g=(0,Y.jsx)(`p`,{...p(),children:r});else{let e=r,t=e.props.ref??e.ref;g=(0,N.cloneElement)(e,p(e.props,t))}}catch{g=(0,Y.jsx)(`span`,{}),s(`Tooltip must have only one child node. Please, check your code.`)}let{ref:_,id:v,style:b,...x}=m(),T=(0,Y.jsx)(`div`,{ref:_,id:v,style:b,children:(0,Y.jsx)(S.div,{animate:`enter`,exit:`exit`,initial:`exit`,variants:y.scaleSpring,...c(f,x),style:{...d(l)},children:(0,Y.jsx)(n,{...h(),children:i})},`${v}-tooltip-inner`)},`${v}-tooltip-content`);return(0,Y.jsxs)(Y.Fragment,{children:[g,u?a&&(0,Y.jsx)(B,{portalContainer:o,children:(0,Y.jsx)(`div`,{ref:_,id:v,style:b,...x,children:(0,Y.jsx)(n,{...h(),children:i})})}):(0,Y.jsx)(C,{features:ce,children:(0,Y.jsx)(w,{children:a&&(0,Y.jsx)(B,{portalContainer:o,children:T})})})]})});X.displayName=`HeroUI.Tooltip`;var Z=X;export{Z as t};
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/dist-yMQV8IUk.js","assets/vendor~conversation-panel~conversation~index-C23ZXO4R.js","assets/rolldown-runtime-BFRubm34.js","assets/vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~i4kjfqhl-BebWhFNT.js","assets/react-CM_dJw1Z.js"])))=>i.map(i=>d[i]);
2
+ import{a as e}from"./rolldown-runtime-BFRubm34.js";import{t}from"./react-CM_dJw1Z.js";import{t as n}from"./preload-helper-CT1Z6Pdu.js";import{t as r}from"./react-dom-hVBnwgwZ.js";import{o as i}from"./declaration-C9nuq2Dj.js";import{A as a,D as o,N as s,O as c,P as l,_ as u,a as d,b as f,g as p,h as m,n as h,o as g,p as _,r as v,s as y,t as b,w as x}from"./vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-CuGq_cxH.js";import{C as S,D as C,O as w,X as T,Y as E,d as D,g as O,i as k,l as A,m as j,st as M,t as ee,ut as te,x as ne}from"./vendor~root-layout~home~conversation-panel~conversation~extensions-hub~skills-settings~skil~iguv7bgw-CFpDeb9o.js";function re(e,t){if(e!=null){if(o(e)){e(t);return}try{e.current=t}catch{throw Error(`Cannot assign value '${t}' to ref '${e}'`)}}}function ie(...e){return t=>{e.forEach(e=>re(e,t))}}var N=e(t(),1),P=e(r(),1),F=N.createContext(null);function I(e){let{children:t}=e,n=(0,N.useContext)(F),[r,i]=(0,N.useState)(0),a=(0,N.useMemo)(()=>({parent:n,modalCount:r,addModal(){i(e=>e+1),n&&n.addModal()},removeModal(){i(e=>e-1),n&&n.removeModal()}}),[n,r]);return N.createElement(F.Provider,{value:a},t)}function L(){let e=(0,N.useContext)(F);return{modalProviderProps:{"aria-hidden":e&&e.modalCount>0?!0:void 0}}}function R(e){let{modalProviderProps:t}=L();return N.createElement(`div`,{"data-overlay-container":!0,...e,...t})}function z(e){return N.createElement(I,null,N.createElement(R,e))}function B(e){let t=te(),{portalContainer:n=t?null:document.body,...r}=e,{getContainer:i}=k();if(!e.portalContainer&&i&&(n=i()),N.useEffect(()=>{if(n?.closest(`[data-overlay-container]`))throw Error(`An OverlayContainer must not be inside another container. Please change the portalContainer prop.`)},[n]),!n)return null;let a=N.createElement(z,r);return P.createPortal(a,n)}var V=1500,H=500,U={},W=0,G=!1,K=null,q=null;function ae(e={}){let{delay:t=V,closeDelay:n=H}=e,{isOpen:r,open:i,close:a}=ee(e),o=(0,N.useMemo)(()=>`${++W}`,[]),s=(0,N.useRef)(null),c=(0,N.useRef)(a),l=()=>{U[o]=f},u=()=>{for(let e in U)e!==o&&(U[e](!0),delete U[e])},d=()=>{s.current&&clearTimeout(s.current),s.current=null,u(),l(),G=!0,i(),K&&=(clearTimeout(K),null),q&&=(clearTimeout(q),null)},f=e=>{e||n<=0?(s.current&&clearTimeout(s.current),s.current=null,c.current()):s.current||=setTimeout(()=>{s.current=null,c.current()},n),K&&=(clearTimeout(K),null),G&&(q&&clearTimeout(q),q=setTimeout(()=>{delete U[o],q=null,G=!1},Math.max(H,n)))},p=()=>{u(),l(),!r&&!G?(K&&clearTimeout(K),K=setTimeout(()=>{K=null,G=!0,d()},t)):r||d()};return(0,N.useEffect)(()=>{c.current=a},[a]),(0,N.useEffect)(()=>()=>{s.current&&clearTimeout(s.current),U[o]&&delete U[o]},[o]),{isOpen:r,open:e=>{!e&&t>0&&!s.current?p():d()},close:f}}function oe(e,t){let n=E(e,{labelable:!0}),{hoverProps:r}=A({onHoverStart:()=>t?.open(!0),onHoverEnd:()=>t?.close()});return{tooltipProps:T(n,r,{role:`tooltip`})}}function se(e,t,n){let{isDisabled:r,trigger:i,shouldCloseOnPress:a=!0}=e,o=M(),s=(0,N.useRef)(!1),c=(0,N.useRef)(!1),l=()=>{(s.current||c.current)&&t.open(c.current)},u=e=>{!s.current&&!c.current&&t.close(e)};(0,N.useEffect)(()=>{let e=e=>{n&&n.current&&e.key===`Escape`&&(e.stopPropagation(),t.close(!0))};if(t.isOpen)return document.addEventListener(`keydown`,e,!0),()=>{document.removeEventListener(`keydown`,e,!0)}},[n,t]);let d=()=>{i!==`focus`&&(j()===`pointer`?s.current=!0:s.current=!1,l())},f=()=>{i!==`focus`&&(c.current=!1,s.current=!1,u())},p=()=>{a&&(c.current=!1,s.current=!1,u(!0))},m=()=>{O()&&(c.current=!0,l())},h=()=>{c.current=!1,s.current=!1,u(!0)},{hoverProps:g}=A({isDisabled:r,onHoverStart:d,onHoverEnd:f}),{focusableProps:_}=D({isDisabled:r,onFocus:m,onBlur:h},n);return{triggerProps:{"aria-describedby":t.isOpen?o:void 0,...T(_,g,{onPointerDown:p,onKeyDown:p}),tabIndex:void 0},tooltipProps:{id:o}}}function J(e){let t=f(),[n,r]=u(e,_.variantKeys),{ref:i,as:o,isOpen:s,content:d,children:p,defaultOpen:y,onOpenChange:S,isDisabled:C,trigger:w,shouldFlip:T=!0,containerPadding:E=12,placement:D=`top`,delay:O=0,closeDelay:k=500,showArrow:A=!1,offset:j=7,crossOffset:M=0,isDismissable:ee,shouldCloseOnBlur:te=!0,portalContainer:re,isKeyboardDismissDisabled:P=!1,updatePositionDeps:F=[],shouldCloseOnInteractOutside:I,className:L,onClose:R,motionProps:z,classNames:B,...V}=n,H=o||`div`,U=e?.disableAnimation??t?.disableAnimation??!1,W=ae({delay:O,closeDelay:k,isDisabled:C,defaultOpen:y,isOpen:s,onOpenChange:e=>{S?.(e),e||R?.()}}),G=(0,N.useRef)(null),K=(0,N.useRef)(null),q=(0,N.useId)(),J=W.isOpen&&!C;(0,N.useImperativeHandle)(i,()=>l(K));let{triggerProps:Y,tooltipProps:ce}=se({isDisabled:C,trigger:w},W,G),{tooltipProps:X}=oe({isOpen:J,...c(n,ce)},W),{overlayProps:Z,placement:Q,updatePosition:le}=ne({isOpen:J,targetRef:G,placement:g(D),overlayRef:K,offset:A?j+3:j,crossOffset:M,shouldFlip:T,containerPadding:E});h(()=>{F.length&&le()},F);let{overlayProps:ue}=b({isOpen:J,onClose:W.close,isDismissable:ee,shouldCloseOnBlur:te,isKeyboardDismissDisabled:P,shouldCloseOnInteractOutside:I},K),$=(0,N.useMemo)(()=>_({...r,disableAnimation:U,radius:e?.radius??`md`,size:e?.size??`md`,shadow:e?.shadow??`sm`}),[a(r),U,e?.radius,e?.size,e?.shadow]),de=(0,N.useCallback)((e={},t=null)=>({...c(Y,e),ref:ie(t,G),"aria-describedby":J?q:void 0}),[Y,J,q,W]),fe=(0,N.useCallback)(()=>({ref:K,"data-slot":`base`,"data-open":x(J),"data-arrow":x(A),"data-disabled":x(C),"data-placement":v(Q||`top`,D),...c(X,ue,V),style:c(Z.style,V.style,n.style),className:$.base({class:B?.base}),id:q}),[$,J,A,C,Q,D,X,ue,V,Z,n,q]);return{Component:H,content:d,children:p,isOpen:J,triggerRef:G,showArrow:A,portalContainer:re,placement:D,disableAnimation:U,isDisabled:C,motionProps:z,getTooltipContentProps:(0,N.useCallback)(()=>({"data-slot":`content`,"data-open":x(J),"data-arrow":x(A),"data-disabled":x(C),"data-placement":v(Q||`top`,D),className:$.content({class:m(B?.content,L)})}),[$,J,A,C,Q,D,B]),getTriggerProps:de,getTooltipProps:fe}}var Y=i(),ce=()=>n(()=>import(`./dist-yMQV8IUk.js`).then(e=>e.default),__vite__mapDeps([0,1,2,3,4])),X=p((e,t)=>{let{Component:n,children:r,content:i,isOpen:a,portalContainer:o,placement:l,disableAnimation:u,motionProps:f,getTriggerProps:p,getTooltipProps:m,getTooltipContentProps:h}=J({...e,ref:t}),g;try{if(N.Children.count(r)!==1)throw Error();if(!(0,N.isValidElement)(r))g=(0,Y.jsx)(`p`,{...p(),children:r});else{let e=r,t=e.props.ref??e.ref;g=(0,N.cloneElement)(e,p(e.props,t))}}catch{g=(0,Y.jsx)(`span`,{}),s(`Tooltip must have only one child node. Please, check your code.`)}let{ref:_,id:v,style:b,...x}=m(),T=(0,Y.jsx)(`div`,{ref:_,id:v,style:b,children:(0,Y.jsx)(S.div,{animate:`enter`,exit:`exit`,initial:`exit`,variants:y.scaleSpring,...c(f,x),style:{...d(l)},children:(0,Y.jsx)(n,{...h(),children:i})},`${v}-tooltip-inner`)},`${v}-tooltip-content`);return(0,Y.jsxs)(Y.Fragment,{children:[g,u?a&&(0,Y.jsx)(B,{portalContainer:o,children:(0,Y.jsx)(`div`,{ref:_,id:v,style:b,...x,children:(0,Y.jsx)(n,{...h(),children:i})})}):(0,Y.jsx)(C,{features:ce,children:(0,Y.jsx)(w,{children:a&&(0,Y.jsx)(B,{portalContainer:o,children:T})})})]})});X.displayName=`HeroUI.Tooltip`;var Z=X;export{Z as t};
@@ -0,0 +1,48 @@
1
+ import{t as e}from"./rolldown-runtime-BFRubm34.js";import{o as t,s as n}from"./agent-server-client-options-8OJSXbm8.js";var r=class{constructor(e){this.host=e.host.replace(/\/$/,``),this.apiKey=e.apiKey,this.client=new t({baseUrl:this.host,apiKey:this.apiKey,timeout:e.timeout||6e4})}async searchEvents(e={}){return(await this.client.get(`/api/bash/bash_events/search`,{params:e})).data}async getEvent(e){return(await this.client.get(`/api/bash/bash_events/${e}`)).data}async getEvents(e){return Promise.all(e.map(async e=>{try{return await this.getEvent(e)}catch(e){if(e instanceof n&&e.status===404)return null;throw e}}))}async startCommand(e,t,n){let r=this.normalizeRequest(e,t,n);return(await this.client.post(`/api/bash/start_bash_command`,r)).data}async executeCommand(e,t,n){let r=this.normalizeRequest(e,t,n);return(await this.client.post(`/api/bash/execute_bash_command`,r,{timeout:((r.timeout||30)+10)*1e3})).data}async clearEvents(){return(await this.client.delete(`/api/bash/bash_events`)).data}close(){this.client.close()}normalizeRequest(e,t,n){return typeof e==`string`?{command:e,...t?{cwd:t}:{},...n===void 0?{}:{timeout:Math.floor(n)}}:{...e,...e.timeout===void 0?{}:{timeout:Math.floor(e.timeout)}}}},i=`AGENT_SERVER_VERSION_TOO_OLD`,a={workspaces:{feature:`workspaces`,displayName:`Workspaces`,minVersion:`1.23.0`},hooks:{feature:`hooks`,displayName:`Hooks API`,minVersion:`1.23.0`},mcpTest:{feature:`mcp-test`,displayName:`MCP test API`,minVersion:`1.23.0`},cloudProxy:{feature:`cloud-proxy`,displayName:`Cloud proxy`,minVersion:`1.23.0`}},o=class e extends Error{constructor({requirement:t,actualVersion:n}){super(`${t.displayName} requires agent-server ${t.minVersion} or newer; this backend is running ${n}. Please upgrade your agent-server backend.`),this.code=i,this.name=`AgentServerVersionError`,this.feature=t.feature,this.displayName=t.displayName,this.requiredVersion=t.minVersion,this.actualVersion=n,Object.setPrototypeOf(this,e.prototype)}},s=new WeakMap;function c(e){return e instanceof o||typeof e==`object`&&!!e&&`code`in e&&e.code===`AGENT_SERVER_VERSION_TOO_OLD`}async function l(e){let t=s.get(e);if(t)return t;let n=e.get(`/server_info`).then(e=>e.data);return s.set(e,n),n}async function u(e,t){let n=await l(e),r=typeof n.version==`string`&&n.version.trim()?n.version.trim():`unknown`,i=d(r,t.minVersion);if(i===null||i<0)throw new o({requirement:t,actualVersion:r});return n}function d(e,t){let n=f(e),r=f(t);if(!n||!r)return null;for(let e of[`major`,`minor`,`patch`]){if(n[e]>r[e])return 1;if(n[e]<r[e])return-1}return n.prerelease&&!r.prerelease?-1:!n.prerelease&&r.prerelease?1:n.prerelease&&r.prerelease?n.prerelease.localeCompare(r.prerelease):0}function f(e){let[t]=e.trim().replace(/^v/,``).split(`+`),[n,r]=t.split(`-`,2),i=n.split(`.`);if(i.length!==3)return null;let[a,o,s]=i.map(e=>Number(e));return[a,o,s].every(e=>Number.isInteger(e)&&e>=0)?{major:a,minor:o,patch:s,prerelease:r}:null}var p=class{constructor(e){this.host=e.host.replace(/\/$/,``),this.apiKey=e.apiKey,this.client=new t({baseUrl:this.host,apiKey:this.apiKey,timeout:e.timeout||6e4})}async searchSubdirectories(e,t={}){return(await this.client.get(`/api/file/search_subdirs`,{params:{path:e,page_id:t.pageId,limit:t.limit}})).data}async getHome(){return(await this.client.get(`/api/file/home`)).data}async downloadFile(e){return(await this.client.get(`/api/file/download`,{params:{path:e},responseType:`arrayBuffer`})).data}async downloadTextFile(e){return new TextDecoder().decode(await this.downloadFile(e))}async uploadFile(e,t,n){let r=new FormData,i=typeof File>`u`?void 0:File;return i&&e instanceof i?r.append(`file`,e,n||e.name):e instanceof Blob?r.append(`file`,e,n||`blob-file`):r.append(`file`,new Blob([e],{type:`text/plain`}),n||`text-file.txt`),(await this.client.post(`/api/file/upload`,r,{params:{path:t}})).data}async uploadTextFile(e,t,n){return this.uploadFile(e,t,n)}async downloadTrajectory(e){return(await this.client.get(`/api/file/download-trajectory/${encodeURIComponent(e)}`,{responseType:`blob`})).data}close(){this.client.close()}},m=class{constructor(e){this.host=e.host.replace(/\/$/,``),this.apiKey=e.apiKey,this.client=new t({baseUrl:this.host,apiKey:this.apiKey,timeout:e.timeout||6e4})}async getSkills(e={}){return(await this.client.post(`/api/skills`,e)).data}async syncSkills(){return(await this.client.post(`/api/skills/sync`,{})).data}async installSkill(e){return(await this.client.post(`/api/skills/install`,e)).data}async listInstalledSkills(){return(await this.client.get(`/api/skills/installed`)).data}async getInstalledSkill(e){return(await this.client.get(`/api/skills/installed/${encodeURIComponent(e)}`)).data}async toggleSkill(e,t){return(await this.client.patch(`/api/skills/installed/${encodeURIComponent(e)}`,{enabled:t})).data}async uninstallSkill(e){return(await this.client.delete(`/api/skills/installed/${encodeURIComponent(e)}`)).data}async refreshSkill(e){return(await this.client.post(`/api/skills/installed/${encodeURIComponent(e)}/update`)).data}async getMarketplace(){return(await this.client.get(`/api/skills/marketplace`)).data}close(){this.client.close()}},h=class{constructor(e){this.host=e.host.replace(/\/$/,``),this.apiKey=e.apiKey,this.client=new t({baseUrl:this.host,apiKey:this.apiKey,timeout:e.timeout||6e4})}async getUrl(e={}){return(await this.client.get(`/api/vscode/url`,{params:{...e.baseUrl?{base_url:e.baseUrl}:{},...e.workspaceDir?{workspace_dir:e.workspaceDir}:{}}})).data.url}async getStatus(){return(await this.client.get(`/api/vscode/status`)).data}close(){this.client.close()}},g=class{constructor(e){this.host=e.host.replace(/\/$/,``),this.apiKey=e.apiKey,this.client=new t({baseUrl:this.host,apiKey:this.apiKey,timeout:e.timeout||6e4})}async getSharedConversations(e){return(await this.client.get(`/api/shared-conversations`,{params:{ids:e}})).data}async getSharedConversation(e){return(await this.getSharedConversations([e]))[0]??null}async searchSharedEvents(e){return(await this.client.get(`/api/shared-events/search`,{params:{conversation_id:e.conversationId,limit:e.limit,page_id:e.pageId}})).data}close(){this.client.close()}},_=class{constructor(e){this.host=e.host.replace(/\/$/,``),this.apiKey=e.apiKey,this.client=new t({baseUrl:this.host,apiKey:this.apiKey,timeout:e.timeout||6e4})}async listWorkspaces(){return await this.ensureWorkspacesSupported(),(await this.client.get(`/api/workspaces`)).data}async addWorkspaces(e){return await this.ensureWorkspacesSupported(),(await this.client.post(`/api/workspaces`,{workspaces:e})).data}async deleteWorkspace(e){return await this.ensureWorkspacesSupported(),(await this.client.delete(`/api/workspaces`,{params:{path:e}})).data}async addWorkspaceParents(e){return await this.ensureWorkspacesSupported(),(await this.client.post(`/api/workspaces/parents`,{parents:e})).data}async deleteWorkspaceParent(e){return await this.ensureWorkspacesSupported(),(await this.client.delete(`/api/workspaces/parents`,{params:{path:e}})).data}close(){this.client.close()}async ensureWorkspacesSupported(){await u(this.client,a.workspaces)}},v=e(((e,t)=>{t.exports=function(){throw Error(`ws does not work in the browser. Browser clients must use the native WebSocket object`)}}));if(typeof window<`u`&&window.WebSocket)window.WebSocket;else try{v()}catch{}var y=class{constructor(e,n){this.cachedEvents=[],this.cachedEventIds=new Set,this.client=e instanceof t?e:new t(e),this.conversationId=n}async search(e={}){let t={limit:e.limit??100};return e.page_id&&(t.page_id=e.page_id),e.kind&&(t.kind=e.kind),e.source&&(t.source=e.source),e.body&&(t.body=e.body),e.sort_order&&(t.sort_order=e.sort_order),e.timestamp__gte&&(t.timestamp__gte=e.timestamp__gte),e.timestamp__lt&&(t.timestamp__lt=e.timestamp__lt),(await this.client.get(`/api/conversations/${this.conversationId}/events/search`,{params:t})).data}async count(e={}){let t={};return e.kind&&(t.kind=e.kind),e.source&&(t.source=e.source),e.body&&(t.body=e.body),e.timestamp__gte&&(t.timestamp__gte=e.timestamp__gte),e.timestamp__lt&&(t.timestamp__lt=e.timestamp__lt),(await this.client.get(`/api/conversations/${this.conversationId}/events/count`,{params:t})).data}async getEventById(e){return(await this.client.get(`/api/conversations/${this.conversationId}/events/${e}`)).data}async getEventsById(e){return Promise.all(e.map(async e=>{try{return await this.getEventById(e)}catch(e){if(e instanceof n&&e.status===404)return null;throw e}}))}async addEvent(e){this.cachedEventIds.has(e.id)||(this.cachedEvents.push(e),this.cachedEventIds.add(e.id))}async append(e){await this.addEvent(e)}createDefaultCallback(e){return t=>{this.addEvent(t).catch(t=>{e&&e(t instanceof Error?t:Error(`Error adding event to cache: ${t}`))})}}async length(){return this.cachedEvents.length}async getEvent(e){return this.cachedEvents[e]}async getEvents(e,t){let n=[],r;for(;;){let e={limit:100};r&&(e.page_id=r);let t=(await this.client.get(`/api/conversations/${this.conversationId}/events/search`,{params:e})).data;if(n.push(...t.items),!t.next_page_id)break;r=t.next_page_id}let i=new Set(n.map(e=>e.id)),a=[...n,...this.cachedEvents.filter(e=>!i.has(e.id))];return e===void 0&&t===void 0?a:a.slice(e,t)}async*[Symbol.asyncIterator](){let e=await this.getEvents();for(let t of e)yield t}},b=`__full_state__`,x=class e{constructor(e,t){this.cachedState=null,this.cachedAt=0,this.lock=new S,this.client=e,this.conversationId=t,this._events=new y(e,t)}async getConversationInfo(){return await this.lock.acquire(async()=>{if(this.cachedState!==null&&Date.now()-this.cachedAt<e.CACHE_TTL_MS)return this.cachedState;let t=await this.client.get(`/api/conversations/${this.conversationId}`),n;return n=t.data.full_state?t.data.full_state:t.data,this.cachedState=n,this.cachedAt=Date.now(),n})}async refresh(){return this.cachedState=null,this.getConversationInfo()}async updateStateFromEvent(e){await this.lock.acquire(async()=>{if(e.key===b){this.cachedState===null&&(this.cachedState={});let t=e.value?.full_state??e.value;Object.assign(this.cachedState,t)}else this.cachedState===null&&(this.cachedState={}),this.cachedState[e.key]=e.value;this.cachedAt=Date.now()})}createStateUpdateCallback(e){return t=>{t.kind===`ConversationStateUpdateEvent`&&this.updateStateFromEvent(t).catch(t=>{e&&e(t instanceof Error?t:Error(`Error updating state from event: ${t}`))})}}get events(){return this._events}get id(){return this.conversationId}unwrapState(e){return e.full_state??e}async getExecutionStatus(){let e=await this.getConversationInfo(),t=this.unwrapState(e),n=t.execution_status??t.agent_status;if(n==null)throw Error(`execution_status missing in conversation info: ${JSON.stringify(e)}`);return n}async getAgentStatus(){return this.getExecutionStatus()}async setAgentStatus(e){throw Error(`Setting execution_status on RemoteState has no effect. Remote execution status is managed server-side. Attempted to set: ${e}`)}async getConfirmationPolicy(){let e=await this.getConversationInfo(),t=this.unwrapState(e).confirmation_policy;if(t==null)throw Error(`confirmation_policy missing in conversation info: ${JSON.stringify(e)}`);return t}async getActivatedKnowledgeSkills(){let e=await this.getConversationInfo();return this.unwrapState(e).activated_knowledge_skills||[]}async getAgent(){let e=await this.getConversationInfo(),t=this.unwrapState(e).agent;if(t==null)throw Error(`agent missing in conversation info: ${JSON.stringify(e)}`);return t}async getWorkspace(){let e=await this.getConversationInfo(),t=this.unwrapState(e).workspace;if(t==null)throw Error(`workspace missing in conversation info: ${JSON.stringify(e)}`);return t}async getPersistenceDir(){let e=await this.getConversationInfo(),t=this.unwrapState(e).persistence_dir;if(t==null)throw Error(`persistence_dir missing in conversation info: ${JSON.stringify(e)}`);return t}async modelDump(){let e=await this.getConversationInfo();return this.unwrapState(e)}async modelDumpJson(){let e=await this.modelDump();return JSON.stringify(e)}};x.CACHE_TTL_MS=2e3;var S=class{constructor(){this.locked=!1,this.queue=[]}async acquire(e){return new Promise((t,n)=>{let r=async()=>{try{t(await e())}catch(e){n(e)}finally{this.locked=!1;let e=this.queue.shift();e&&e()}};this.locked?this.queue.push(r):(this.locked=!0,r())})}},C=class{constructor(e){this.host=e.host.replace(/\/$/,``),this.workingDir=e.workingDir,this.apiKey=e.apiKey,this.client=new t({baseUrl:this.host,apiKey:this.apiKey,timeout:6e4}),this.bash=new r({host:this.host,...this.apiKey?{apiKey:this.apiKey}:{}})}async startWorkspaceSession(e){return await this.client.post(`/api/auth/workspace-session`,void 0,{credentials:`include`}),`${this.host}/api/conversations/${e}/workspace/`}async deleteWorkspaceSession(){await this.client.delete(`/api/auth/workspace-session`,{credentials:`include`,acceptableStatusCodes:new Set([204])})}async executeCommand(e,t,n=30){let r={command:e,timeout:Math.floor(n)};t&&(r.cwd=t);let i=(await this.client.post(`/api/bash/execute_bash_command`,r,{timeout:(n+10)*1e3})).data;return{command:e,exit_code:i.exit_code??0,stdout:i.stdout||``,stderr:i.stderr||``,timeout_occurred:!1}}async fileUpload(e,t,n){let r=new FormData,i,a;e instanceof File?(i=e,a=n||e.name):e instanceof Blob?(i=e,a=n||`blob-file`):(i=new Blob([e],{type:`text/plain`}),a=n||`text-file.txt`),r.append(`file`,i,a);let o=(await this.client.request({method:`POST`,url:`/api/file/upload`,params:{path:t},data:r,timeout:6e4})).data;return{success:o.success??!0,source_path:a,destination_path:t,file_size:o.file_size,error:o.error}}async fileDownload(e){let t=await this.client.get(`/api/file/download`,{params:{path:e},timeout:6e4}),n,r;if(typeof t.data==`string`)n=t.data,r=new Blob([t.data]).size;else if(t.data instanceof ArrayBuffer)n=new Blob([t.data]),r=t.data.byteLength;else if(t.data instanceof Blob)n=t.data,r=t.data.size;else{let e=JSON.stringify(t.data);n=e,r=new Blob([e]).size}return{success:!0,source_path:e,content:n,file_size:r}}async gitChanges(e,t={}){let n={path:e};t.ref!==void 0&&(n.ref=t.ref);try{return(await this.client.get(`/api/git/changes`,{params:n})).data}catch(e){throw Error(`Failed to get git changes: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async gitDiff(e,t={}){let n={path:e};t.ref!==void 0&&(n.ref=t.ref);try{return(await this.client.get(`/api/git/diff`,{params:n})).data}catch(e){throw Error(`Failed to get git diff: ${e instanceof Error?e.message:String(e)}`,{cause:e})}}async uploadText(e,t,n){return this.fileUpload(e,t,n)}async uploadFileObject(e,t){return this.fileUpload(e,t)}async downloadAsText(e){let t=await this.fileDownload(e);if(!t.success)throw Error(t.error||`Download failed`);return typeof t.content==`string`?t.content:t.content instanceof Blob?await t.content.text():``}async downloadAsBlob(e){let t=await this.fileDownload(e);if(!t.success)throw Error(t.error||`Download failed`);return t.content instanceof Blob?t.content:typeof t.content==`string`?new Blob([t.content],{type:`text/plain`}):new Blob}async downloadAndSave(e,t){let n=await this.downloadAsBlob(e),r=URL.createObjectURL(n),i=document.createElement(`a`);i.href=r,i.download=t||e.split(`/`).pop()||`download`,document.body.appendChild(i),i.click(),document.body.removeChild(i),URL.revokeObjectURL(r)}close(){this.bash.close(),this.client.close()}},w={execute_command:`Execute a bash command in the terminal within a persistent shell session.
2
+
3
+ ### Command Execution
4
+ * One command at a time: You can only execute one bash command at a time. If you need to run multiple commands sequentially, use \`&&\` or \`;\` to chain them together.
5
+ * Persistent session: Commands execute in a persistent shell session where environment variables, virtual environments, and working directory persist between commands.
6
+
7
+ ### Best Practices
8
+ * Directory verification: Before creating new directories or files, first verify the parent directory exists and is the correct location.
9
+ * Directory management: Try to maintain working directory by using absolute paths and avoiding excessive use of \`cd\`.
10
+
11
+ ### Output Handling
12
+ * Output truncation: If the output exceeds a maximum length, it will be truncated before being returned.`,read_file:`Read the contents of a file from the workspace.
13
+
14
+ Custom editing tool for viewing, creating and editing files in plain-text format.
15
+ * If \`path\` is a text file, returns the file contents with line numbers
16
+ * If \`path\` is a directory, lists non-hidden files and directories up to 2 levels deep
17
+
18
+ Best practices:
19
+ * Use this tool to understand the file's contents and context before making edits
20
+ * Verify the directory path is correct when working with files`,write_file:`Write content to a file in the workspace. Creates the file if it does not exist.
21
+
22
+ When making edits:
23
+ * Ensure the edit results in idiomatic, correct code
24
+ * Do not leave the code in a broken state
25
+ * Always use absolute file paths (starting with /)
26
+
27
+ CRITICAL REQUIREMENTS:
28
+ * The content should be the complete file content, not a diff or patch
29
+ * Ensure proper formatting and indentation`,think:`Use the tool to think about something. It will not obtain new information or make any changes to the repository, but just log the thought. Use it when complex reasoning or brainstorming is needed.
30
+
31
+ Common use cases:
32
+ 1. When exploring a repository and discovering the source of a bug, call this tool to brainstorm several unique ways of fixing the bug, and assess which change(s) are likely to be simplest and most effective.
33
+ 2. After receiving test results, use this tool to brainstorm ways to fix failing tests.
34
+ 3. When planning a complex refactoring, use this tool to outline different approaches and their tradeoffs.
35
+ 4. When designing a new feature, use this tool to think through architecture decisions and implementation details.
36
+ 5. When debugging a complex issue, use this tool to organize your thoughts and hypotheses.
37
+
38
+ The tool simply logs your thought process for better transparency and does not execute any code or make changes.`,finish:`Signals the completion of the current task or conversation.
39
+
40
+ Use this tool when:
41
+ - You have successfully completed the user's requested task
42
+ - You cannot proceed further due to technical limitations or missing information
43
+
44
+ The message should include:
45
+ - A clear summary of actions taken and their results
46
+ - Any next steps for the user
47
+ - Explanation if you're unable to complete the task
48
+ - Any follow-up questions if more information is needed`};w.execute_command,w.read_file,w.write_file,w.think,w.finish;var T;(function(e){e.PRE_TOOL_USE=`PreToolUse`,e.POST_TOOL_USE=`PostToolUse`,e.USER_PROMPT_SUBMIT=`UserPromptSubmit`,e.SESSION_START=`SessionStart`,e.SESSION_END=`SessionEnd`,e.STOP=`Stop`})(T||={});var E;(function(e){e.COMMAND=`command`,e.PROMPT=`prompt`})(E||={});var D;if((function(e){e.ALLOW=`allow`,e.DENY=`deny`})(D||={}),new Set(`|.*+?[]()^$\\`.split(``)),typeof window<`u`&&window.WebSocket)window.WebSocket;else try{v()}catch{}var O;(function(e){e.TIMESTAMP=`TIMESTAMP`,e.TIMESTAMP_DESC=`TIMESTAMP_DESC`})(O||={}),(function(e){e.REVERSE_TIMESTAMP=`TIMESTAMP_DESC`})(O||={});var k;(function(e){e.IDLE=`idle`,e.RUNNING=`running`,e.PAUSED=`paused`,e.WAITING_FOR_CONFIRMATION=`waiting_for_confirmation`,e.FINISHED=`finished`,e.ERROR=`error`,e.STUCK=`stuck`,e.DELETING=`deleting`})(k||={});var A;(function(e){e.CREATED_AT=`CREATED_AT`,e.UPDATED_AT=`UPDATED_AT`,e.CREATED_AT_DESC=`CREATED_AT_DESC`,e.UPDATED_AT_DESC=`UPDATED_AT_DESC`})(A||={});var j={"claude-code":{key:`claude-code`,display_name:`Claude Code`,default_command:[`npx`,`-y`,`@agentclientprotocol/claude-agent-acp`],api_key_env_var:`ANTHROPIC_API_KEY`,base_url_env_var:`ANTHROPIC_BASE_URL`,default_session_mode:`bypassPermissions`,agent_name_patterns:[`claude-agent`],supports_set_session_model:!1,session_meta_key:`claudeCode`,available_models:[{id:`claude-opus-4-7`,label:`Claude Opus 4.7`},{id:`claude-opus-4-6`,label:`Claude Opus 4.6`},{id:`opus[1m]`,label:`Claude Opus (1M)`},{id:`claude-opus-4-5`,label:`Claude Opus 4.5`},{id:`claude-opus-4-1-20250805`,label:`Claude Opus 4.1`},{id:`claude-sonnet-4-6`,label:`Claude Sonnet 4.6`},{id:`sonnet[1m]`,label:`Claude Sonnet (1M)`},{id:`claude-sonnet-4-5`,label:`Claude Sonnet 4.5`},{id:`claude-haiku-4-5`,label:`Claude Haiku 4.5`},{id:`opusplan`,label:`Opus (plan) + Sonnet (execute)`}],default_model:`claude-opus-4-7`},codex:{key:`codex`,display_name:`Codex`,default_command:[`npx`,`-y`,`@zed-industries/codex-acp`],api_key_env_var:`OPENAI_API_KEY`,base_url_env_var:`OPENAI_BASE_URL`,default_session_mode:`full-access`,agent_name_patterns:[`codex-acp`],supports_set_session_model:!0,session_meta_key:null,available_models:[{id:`gpt-5.5/low`,label:`GPT-5.5 (low)`},{id:`gpt-5.5/medium`,label:`GPT-5.5 (medium)`},{id:`gpt-5.5/high`,label:`GPT-5.5 (high)`},{id:`gpt-5.5/xhigh`,label:`GPT-5.5 (xhigh)`},{id:`gpt-5.4/low`,label:`GPT-5.4 (low)`},{id:`gpt-5.4/medium`,label:`GPT-5.4 (medium)`},{id:`gpt-5.4/high`,label:`GPT-5.4 (high)`},{id:`gpt-5.4/xhigh`,label:`GPT-5.4 (xhigh)`},{id:`gpt-5.4-mini/low`,label:`GPT-5.4 Mini (low)`},{id:`gpt-5.4-mini/medium`,label:`GPT-5.4 Mini (medium)`},{id:`gpt-5.4-mini/high`,label:`GPT-5.4 Mini (high)`},{id:`gpt-5.4-mini/xhigh`,label:`GPT-5.4 Mini (xhigh)`},{id:`gpt-5.3-codex/low`,label:`GPT-5.3 Codex (low)`},{id:`gpt-5.3-codex/medium`,label:`GPT-5.3 Codex (medium)`},{id:`gpt-5.3-codex/high`,label:`GPT-5.3 Codex (high)`},{id:`gpt-5.3-codex/xhigh`,label:`GPT-5.3 Codex (xhigh)`},{id:`gpt-5.2/low`,label:`GPT-5.2 (low)`},{id:`gpt-5.2/medium`,label:`GPT-5.2 (medium)`},{id:`gpt-5.2/high`,label:`GPT-5.2 (high)`},{id:`gpt-5.2/xhigh`,label:`GPT-5.2 (xhigh)`}],default_model:`gpt-5.5/medium`},"gemini-cli":{key:`gemini-cli`,display_name:`Gemini CLI`,default_command:[`npx`,`-y`,`@google/gemini-cli`,`--acp`],api_key_env_var:`GEMINI_API_KEY`,base_url_env_var:`GEMINI_BASE_URL`,default_session_mode:`yolo`,agent_name_patterns:[`gemini-cli`],supports_set_session_model:!0,session_meta_key:null,available_models:[{id:`auto-gemini-3`,label:`Auto (Gemini 3)`},{id:`auto-gemini-2.5`,label:`Auto (Gemini 2.5)`},{id:`gemini-3.1-pro-preview`,label:`Gemini 3.1 Pro (preview)`},{id:`gemini-3-flash-preview`,label:`Gemini 3 Flash (preview)`},{id:`gemini-3.1-flash-lite-preview`,label:`Gemini 3.1 Flash Lite (preview)`},{id:`gemini-2.5-pro`,label:`Gemini 2.5 Pro`},{id:`gemini-2.5-flash`,label:`Gemini 2.5 Flash`},{id:`gemini-2.5-flash-lite`,label:`Gemini 2.5 Flash Lite`}],default_model:`auto-gemini-2.5`}};function M(e){return e?j[e]??null:null}export{_ as a,m as c,r as d,y as i,p as l,A as n,g as o,C as r,h as s,M as t,c as u};
@@ -1 +1 @@
1
- import{a as e}from"./rolldown-runtime-BFRubm34.js";import{t}from"./react-CM_dJw1Z.js";import{L as n}from"./vendor~entry.client~root~root-layout~index-redirect~home~conversation-panel~conversation~la~cnj3raoq-DTEXlLSB.js";import{o as r,t as i}from"./declaration-C9nuq2Dj.js";import{t as a}from"./useTranslation-01pF7z10.js";import{t as o}from"./utils-Czcl6buL.js";import{u as s}from"./brand-button-BYloqbQ3.js";import{t as c}from"./settings-D5am1n6X.js";import{r as l}from"./use-settings-ClRWXa6p.js";import{t as u}from"./sdk-section-page-Dgmjx3Nh.js";import{t as d}from"./settings-dropdown-input-1bMoP5ld.js";import{t as f}from"./settings-switch-CGap2LtG.js";var p=e(t(),1),m=r(),h=new Set([`confirmation_mode`,`security_analyzer`]);function g({confirmationMode:e,securityAnalyzer:t,isConversationSettingsDisabled:n,onConfirmationModeChange:r,onSecurityAnalyzerChange:c,renderTopContent:l}){let{t:u}=a(`openhands`),h=p.useMemo(()=>[{key:`llm`,label:u(i.SETTINGS$SECURITY_ANALYZER_LLM_DEFAULT)},{key:`none`,label:u(i.SETTINGS$SECURITY_ANALYZER_NONE)}],[u]),g=e;return(0,m.jsxs)(`div`,{className:`flex flex-col gap-6`,children:[l?.(),(0,m.jsxs)(`div`,{className:`flex flex-col gap-6`,children:[(0,m.jsxs)(`div`,{className:`flex flex-col gap-1.5`,children:[(0,m.jsx)(f,{testId:`confirmation-mode-toggle`,isToggled:e,onToggle:r,isDisabled:n,children:u(i.SETTINGS_FORM$ENABLE_CONFIRMATION_MODE_LABEL)}),(0,m.jsx)(`p`,{className:o(s,`text-tertiary-alt text-xs leading-5`),children:u(i.SETTINGS$CONFIRMATION_MODE_TOOLTIP)})]}),g?(0,m.jsxs)(`div`,{className:`flex flex-col gap-1.5`,children:[(0,m.jsx)(d,{testId:`security-analyzer-input`,name:`security_analyzer`,label:u(i.SETTINGS_FORM$SECURITY_ANALYZER_LABEL),items:h,selectedKey:t??void 0,placeholder:u(i.SETTINGS$SECURITY_ANALYZER_PLACEHOLDER),isDisabled:n,onSelectionChange:e=>c(e?String(e):null)}),(0,m.jsx)(`p`,{className:`text-tertiary-alt text-xs leading-5`,children:u(i.SETTINGS$SECURITY_ANALYZER_DESCRIPTION)})]}):null]})]})}function _({scope:e=`personal`,renderTopContent:t,testId:n=`verification-settings-screen`}){let{data:r}=l(e),[i,a]=p.useState(c.confirmation_mode),[o,s]=p.useState(c.security_analyzer),[d,f]=p.useState(!1),[_,v]=p.useState(!1);p.useEffect(()=>{a(r?.confirmation_mode??c.confirmation_mode),s(r?.security_analyzer??c.security_analyzer),f(!1),v(!1)},[r?.confirmation_mode,r?.security_analyzer]);let y=p.useCallback(({isDisabled:e})=>(0,m.jsx)(g,{confirmationMode:i,securityAnalyzer:o,isConversationSettingsDisabled:e,onConfirmationModeChange:e=>{a(e),f(!0)},onSecurityAnalyzerChange:e=>{s(e),v(!0)},renderTopContent:t}),[i,t,o]),b=p.useCallback(e=>{let t={...e};return d&&(t.confirmation_mode=i),(_||i&&r?.security_analyzer!==o)&&(t.security_analyzer=o),{conversation_settings_diff:t}},[i,d,o,_,r?.security_analyzer]);return(0,m.jsx)(u,{scope:e,settingsSource:`conversation_settings`,sectionKeys:[`verification`],excludeKeys:h,header:y,extraDirty:d||_,buildPayload:b,onSaveSuccess:()=>{f(!1),v(!1)},testId:n})}var v=n(_);export{v as default};
1
+ import{a as e}from"./rolldown-runtime-BFRubm34.js";import{t}from"./react-CM_dJw1Z.js";import{L as n}from"./vendor~entry.client~root~root-layout~index-redirect~home~conversation-panel~conversation~la~cnj3raoq-DTEXlLSB.js";import{o as r,t as i}from"./declaration-C9nuq2Dj.js";import{t as a}from"./useTranslation-01pF7z10.js";import{t as o}from"./utils-Czcl6buL.js";import{u as s}from"./brand-button-8fVVei4i.js";import{t as c}from"./settings-D5am1n6X.js";import{r as l}from"./use-settings-DzG0C3vO.js";import{t as u}from"./sdk-section-page-03k88tIR.js";import{t as d}from"./settings-dropdown-input-CAQWQgx-.js";import{t as f}from"./settings-switch-CGap2LtG.js";var p=e(t(),1),m=r(),h=new Set([`confirmation_mode`,`security_analyzer`]);function g({confirmationMode:e,securityAnalyzer:t,isConversationSettingsDisabled:n,onConfirmationModeChange:r,onSecurityAnalyzerChange:c,renderTopContent:l}){let{t:u}=a(`openhands`),h=p.useMemo(()=>[{key:`llm`,label:u(i.SETTINGS$SECURITY_ANALYZER_LLM_DEFAULT)},{key:`none`,label:u(i.SETTINGS$SECURITY_ANALYZER_NONE)}],[u]),g=e;return(0,m.jsxs)(`div`,{className:`flex flex-col gap-6`,children:[l?.(),(0,m.jsxs)(`div`,{className:`flex flex-col gap-6`,children:[(0,m.jsxs)(`div`,{className:`flex flex-col gap-1.5`,children:[(0,m.jsx)(f,{testId:`confirmation-mode-toggle`,isToggled:e,onToggle:r,isDisabled:n,children:u(i.SETTINGS_FORM$ENABLE_CONFIRMATION_MODE_LABEL)}),(0,m.jsx)(`p`,{className:o(s,`text-tertiary-alt text-xs leading-5`),children:u(i.SETTINGS$CONFIRMATION_MODE_TOOLTIP)})]}),g?(0,m.jsxs)(`div`,{className:`flex flex-col gap-1.5`,children:[(0,m.jsx)(d,{testId:`security-analyzer-input`,name:`security_analyzer`,label:u(i.SETTINGS_FORM$SECURITY_ANALYZER_LABEL),items:h,selectedKey:t??void 0,placeholder:u(i.SETTINGS$SECURITY_ANALYZER_PLACEHOLDER),isDisabled:n,onSelectionChange:e=>c(e?String(e):null)}),(0,m.jsx)(`p`,{className:`text-tertiary-alt text-xs leading-5`,children:u(i.SETTINGS$SECURITY_ANALYZER_DESCRIPTION)})]}):null]})]})}function _({scope:e=`personal`,renderTopContent:t,testId:n=`verification-settings-screen`}){let{data:r}=l(e),[i,a]=p.useState(c.confirmation_mode),[o,s]=p.useState(c.security_analyzer),[d,f]=p.useState(!1),[_,v]=p.useState(!1);p.useEffect(()=>{a(r?.confirmation_mode??c.confirmation_mode),s(r?.security_analyzer??c.security_analyzer),f(!1),v(!1)},[r?.confirmation_mode,r?.security_analyzer]);let y=p.useCallback(({isDisabled:e})=>(0,m.jsx)(g,{confirmationMode:i,securityAnalyzer:o,isConversationSettingsDisabled:e,onConfirmationModeChange:e=>{a(e),f(!0)},onSecurityAnalyzerChange:e=>{s(e),v(!0)},renderTopContent:t}),[i,t,o]),b=p.useCallback(e=>{let t={...e};return d&&(t.confirmation_mode=i),(_||i&&r?.security_analyzer!==o)&&(t.security_analyzer=o),{conversation_settings_diff:t}},[i,d,o,_,r?.security_analyzer]);return(0,m.jsx)(u,{scope:e,settingsSource:`conversation_settings`,sectionKeys:[`verification`],excludeKeys:h,header:y,extraDirty:d||_,buildPayload:b,onSaveSuccess:()=>{f(!1),v(!1)},testId:n})}var v=n(_);export{v as default};
@@ -1 +1 @@
1
- import{a as e}from"./rolldown-runtime-BFRubm34.js";import{t}from"./react-CM_dJw1Z.js";import{o as n,t as r}from"./declaration-C9nuq2Dj.js";import{t as i}from"./useTranslation-01pF7z10.js";import{y as a}from"./utils-Czcl6buL.js";import{t as o}from"./brand-button-BYloqbQ3.js";import{t as s}from"./use-agent-state-BqaILzms.js";import{n as c,t as l}from"./use-unified-vscode-url-DU7On_6w.js";import{t as u}from"./waiting-for-runtime-message-JotSOBdC.js";import{t as d}from"./conversation-tab-empty-state-BtFDbyTe.js";var f=e(t(),1);function p(e,t=!1){try{let n=localStorage.getItem(`FEATURE_${e}`)||t.toString();return!!JSON.parse(n)}catch{return t}}var m=()=>p(`VSCODE_IN_NEW_TAB`),h=n();function g(){let{t:e}=i(`openhands`),{data:t,isLoading:n,error:p}=l(),{curAgentState:g}=s(),_=a.includes(g),v=f.useRef(null),[y,b]=(0,f.useState)(!1),[x,S]=(0,f.useState)(null);return(0,f.useEffect)(()=>{if(t?.url)try{let e=new URL(t.url).protocol,n=window.location.protocol;b(m()||e!==n)}catch{S(e(`VSCODE$URL_PARSE_ERROR`))}},[t?.url]),_?(0,h.jsx)(u,{}):n?(0,h.jsx)(`div`,{className:`w-full h-full flex items-center text-center justify-center text-2xl text-tertiary-light`,children:e(r.VSCODE$LOADING)}):p||t?.error||!t?.url||x?(0,h.jsx)(`div`,{className:`w-full h-full flex items-center text-center justify-center text-2xl text-tertiary-light`,children:x||t?.error||String(p)||e(r.VSCODE$URL_NOT_AVAILABLE)}):y?(0,h.jsx)(d,{icon:(0,h.jsx)(c,{}),action:(0,h.jsx)(o,{type:`button`,variant:`secondary`,onClick:()=>{t?.url&&window.open(t.url,`_blank`,`noopener,noreferrer`)},className:`min-w-40 justify-center px-6`,children:e(`VSCODE$OPEN_IN_NEW_TAB`)}),children:e(`VSCODE$CROSS_ORIGIN_WARNING`)}):(0,h.jsx)(`div`,{className:`h-full w-full`,children:(0,h.jsx)(`iframe`,{ref:v,title:e(r.VSCODE$TITLE),src:t.url,className:`w-full h-full border-0`,allow:`clipboard-read; clipboard-write`})})}export{g as default};
1
+ import{a as e}from"./rolldown-runtime-BFRubm34.js";import{t}from"./react-CM_dJw1Z.js";import{o as n,t as r}from"./declaration-C9nuq2Dj.js";import{t as i}from"./useTranslation-01pF7z10.js";import{y as a}from"./utils-Czcl6buL.js";import{t as o}from"./brand-button-8fVVei4i.js";import{t as s}from"./use-agent-state-DN9Nc5pP.js";import{n as c,t as l}from"./use-unified-vscode-url-C5iI-Z5A.js";import{t as u}from"./waiting-for-runtime-message-JotSOBdC.js";import{t as d}from"./conversation-tab-empty-state-BtFDbyTe.js";var f=e(t(),1);function p(e,t=!1){try{let n=localStorage.getItem(`FEATURE_${e}`)||t.toString();return!!JSON.parse(n)}catch{return t}}var m=()=>p(`VSCODE_IN_NEW_TAB`),h=n();function g(){let{t:e}=i(`openhands`),{data:t,isLoading:n,error:p}=l(),{curAgentState:g}=s(),_=a.includes(g),v=f.useRef(null),[y,b]=(0,f.useState)(!1),[x,S]=(0,f.useState)(null);return(0,f.useEffect)(()=>{if(t?.url)try{let e=new URL(t.url).protocol,n=window.location.protocol;b(m()||e!==n)}catch{S(e(`VSCODE$URL_PARSE_ERROR`))}},[t?.url]),_?(0,h.jsx)(u,{}):n?(0,h.jsx)(`div`,{className:`w-full h-full flex items-center text-center justify-center text-2xl text-tertiary-light`,children:e(r.VSCODE$LOADING)}):p||t?.error||!t?.url||x?(0,h.jsx)(`div`,{className:`w-full h-full flex items-center text-center justify-center text-2xl text-tertiary-light`,children:x||t?.error||String(p)||e(r.VSCODE$URL_NOT_AVAILABLE)}):y?(0,h.jsx)(d,{icon:(0,h.jsx)(c,{}),action:(0,h.jsx)(o,{type:`button`,variant:`secondary`,onClick:()=>{t?.url&&window.open(t.url,`_blank`,`noopener,noreferrer`)},className:`min-w-40 justify-center px-6`,children:e(`VSCODE$OPEN_IN_NEW_TAB`)}),children:e(`VSCODE$CROSS_ORIGIN_WARNING`)}):(0,h.jsx)(`div`,{className:`h-full w-full`,children:(0,h.jsx)(`iframe`,{ref:v,title:e(r.VSCODE$TITLE),src:t.url,className:`w-full h-full border-0`,allow:`clipboard-read; clipboard-write`})})}export{g as default};
package/build/index.html CHANGED
@@ -1,13 +1,13 @@
1
- <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>OpenHands</title><meta name="description" content="Let&#x27;s Start Building!"/><link rel="modulepreload" href="/assets/manifest-e27751af.js"/><link rel="modulepreload" href="/assets/entry.client-DH09zdmW.js"/><link rel="modulepreload" href="/assets/rolldown-runtime-BFRubm34.js"/><link rel="modulepreload" href="/assets/preload-helper-CT1Z6Pdu.js"/><link rel="modulepreload" href="/assets/vendor~entry.client-CySJvEhK.js"/><link rel="modulepreload" href="/assets/providers-CdDNvcEb.js"/><link rel="modulepreload" href="/assets/declaration-C9nuq2Dj.js"/><link rel="modulepreload" href="/assets/vendor~entry.client-Du9GpFmX.js"/><link rel="modulepreload" href="/assets/react-CM_dJw1Z.js"/><link rel="modulepreload" href="/assets/i18n-DkYgs32x.js"/><link rel="modulepreload" href="/assets/react-dom-hVBnwgwZ.js"/><link rel="modulepreload" href="/assets/vendor~entry.client~root~root-layout~index-redirect~home~conversation-panel~conversation~la~cnj3raoq-DTEXlLSB.js"/><link rel="modulepreload" href="/assets/query-client-config-BtB8Yvpf.js"/><link rel="modulepreload" href="/assets/QueryClientProvider-DITRCGAK.js"/><link rel="modulepreload" href="/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~jfc6hidu-ksomn5Bg.js"/><link rel="modulepreload" href="/assets/context-CEQZwATj.js"/><link rel="modulepreload" href="/assets/active-backend-context-jthDtMCD.js"/><link rel="modulepreload" href="/assets/option-service.api-Bqy363N2.js"/><link rel="modulepreload" href="/assets/utils-Czcl6buL.js"/><link rel="modulepreload" href="/assets/query-keys-D5xWPArX.js"/><link rel="modulepreload" href="/assets/agent-server-ui-style-scope-DWLieFHA.js"/><link rel="modulepreload" href="/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~b4cctr4k-B7YVdv1X.js"/><link rel="modulepreload" href="/assets/mutation-Cz7N4XAo.js"/><link rel="modulepreload" href="/assets/custom-toast-handlers-BYxhSr3t.js"/><link rel="modulepreload" href="/assets/retrieve-axios-error-message-BY-yIkIq.js"/><link rel="modulepreload" href="/assets/createLucideIcon-Ddu8jDOQ.js"/><link rel="modulepreload" href="/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~i9dbt75i-CI82Did1.js"/><link rel="modulepreload" href="/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~skills-settings~m~o9nrx3fm-D44TR8hL.js"/><link rel="modulepreload" href="/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~zm51vy4j-Csgp2p8o.js"/><link rel="modulepreload" href="/assets/agent-server-client-options-BvlH7qGM.js"/><link rel="modulepreload" href="/assets/llm-client-BvUU4If8.js"/><link rel="modulepreload" href="/assets/agent-server-compatibility-DnXbX5aL.js"/><link rel="modulepreload" href="/assets/server-client-BvA-DepM.js"/><link rel="modulepreload" href="/assets/root-Xt6cd1J6.js"/><link rel="modulepreload" href="/assets/useTranslation-01pF7z10.js"/><link rel="modulepreload" href="/assets/brand-button-BYloqbQ3.js"/><link rel="modulepreload" href="/assets/base-modal-D0AZIorb.js"/><link rel="modulepreload" href="/assets/loading-spinner-D-ea2dZq.js"/><link rel="modulepreload" href="/assets/modal-backdrop-DML21GPD.js"/><link rel="modulepreload" href="/assets/modal-body-RpEv_U1i.js"/><link rel="modulepreload" href="/assets/use-config-BD9X1AvI.js"/><link rel="modulepreload" href="/assets/color-themes-VfRROuOB.js"/><link rel="modulepreload" href="/assets/vendor~root~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-s~kyz9p27j-DlKA6SoO.js"/><link rel="stylesheet" href="/assets/root-DEotKI6b.css"/></head><body data-agent-server-ui="" class="m-0"><div data-agent-server-ui="" style="--oh-color-logo:#cfb755;--oh-color-base:var(--cool-grey-950);--oh-color-base-secondary:var(--cool-grey-925);--oh-color-danger:#e76a5e;--oh-color-success:#a5e75e;--oh-color-basic:var(--cool-grey-400);--oh-color-tertiary:var(--cool-grey-800);--oh-color-tertiary-light:var(--cool-grey-300);--oh-color-content:var(--cool-grey-100);--oh-color-content-2:var(--cool-grey-50);--oh-background:var(--cool-grey-950);--oh-foreground:var(--cool-grey-100);--oh-surface:var(--cool-grey-925);--oh-surface-foreground:var(--cool-grey-100);--oh-surface-raised:var(--cool-grey-900);--oh-surface-deep:var(--cool-grey-975);--oh-overlay:var(--cool-grey-925);--oh-overlay-foreground:var(--cool-grey-100);--oh-muted:var(--cool-grey-400);--oh-text-secondary:var(--cool-grey-300);--oh-text-tertiary:var(--cool-grey-200);--oh-text-dim:var(--cool-grey-500);--oh-text-subtle:var(--cool-grey-600);--oh-interactive-hover:var(--cool-grey-700);--oh-interactive-hover-low:var(--cool-grey-900);--oh-interactive-active:var(--cool-grey-800);--oh-interactive-selected:var(--cool-grey-600);--oh-scrollbar:color-mix(in srgb, var(--cool-grey-400) 30%, transparent);--oh-scrollbar-hover:color-mix(in srgb, var(--cool-grey-400) 50%, transparent);--oh-default:var(--cool-grey-800);--oh-default-foreground:var(--cool-grey-100);--oh-accent-foreground:var(--cool-grey-950);--oh-success:#a5e75e;--oh-success-foreground:var(--cool-grey-950);--oh-warning-foreground:var(--cool-grey-950);--oh-danger:#e76a5e;--oh-danger-foreground:var(--cool-grey-50);--oh-segment:var(--cool-grey-925);--oh-segment-foreground:var(--cool-grey-100);--oh-border-width:1px;--oh-field-border-width:1px;--oh-border:var(--cool-grey-700);--oh-border-input:var(--cool-grey-600);--oh-border-subtle:var(--cool-grey-800);--oh-separator:rgba(113, 120, 136, 0.5);--oh-focus:#ffffff;--oh-status-success:#1FBD53;--oh-status-error:#FF684E;--oh-link:var(--cool-grey-100);--oh-radius:8px;--oh-field-radius:8px;--oh-surface-shadow:none;--oh-overlay-shadow:none;--oh-field-shadow:none;--oh-bg-dark:var(--cool-grey-950);--oh-bg-light:var(--cool-grey-900);--oh-bg-input:var(--cool-grey-800);--oh-bg-workspace:var(--cool-grey-925);--oh-text-editor-base:var(--cool-grey-400);--oh-text-editor-active:var(--cool-grey-300);--oh-bg-editor-sidebar:var(--cool-grey-925);--oh-bg-editor-active:var(--cool-grey-900);--oh-border-editor-sidebar:var(--cool-grey-800);--oh-bg-neutral-muted:color-mix(in srgb, var(--cool-grey-300) 20%, transparent)"><div class="dark min-h-screen text-foreground" data-theme="dark"><script>
1
+ <!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>OpenHands</title><meta name="description" content="Let&#x27;s Start Building!"/><link rel="modulepreload" href="/assets/manifest-f141dc70.js"/><link rel="modulepreload" href="/assets/entry.client-DU7-q4ZU.js"/><link rel="modulepreload" href="/assets/rolldown-runtime-BFRubm34.js"/><link rel="modulepreload" href="/assets/preload-helper-CT1Z6Pdu.js"/><link rel="modulepreload" href="/assets/vendor~entry.client-CySJvEhK.js"/><link rel="modulepreload" href="/assets/providers-C2T07PM3.js"/><link rel="modulepreload" href="/assets/declaration-C9nuq2Dj.js"/><link rel="modulepreload" href="/assets/vendor~entry.client-Du9GpFmX.js"/><link rel="modulepreload" href="/assets/react-CM_dJw1Z.js"/><link rel="modulepreload" href="/assets/i18n-DkYgs32x.js"/><link rel="modulepreload" href="/assets/react-dom-hVBnwgwZ.js"/><link rel="modulepreload" href="/assets/vendor~entry.client~root~root-layout~index-redirect~home~conversation-panel~conversation~la~cnj3raoq-DTEXlLSB.js"/><link rel="modulepreload" href="/assets/query-client-config-CiK0GJJO.js"/><link rel="modulepreload" href="/assets/QueryClientProvider-DITRCGAK.js"/><link rel="modulepreload" href="/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~jfc6hidu-VnmIZrq3.js"/><link rel="modulepreload" href="/assets/context-CEQZwATj.js"/><link rel="modulepreload" href="/assets/option-service.api-DN0ZcGjw.js"/><link rel="modulepreload" href="/assets/utils-Czcl6buL.js"/><link rel="modulepreload" href="/assets/active-backend-context-CkP3ZEJs.js"/><link rel="modulepreload" href="/assets/query-keys-tAsQcc_9.js"/><link rel="modulepreload" href="/assets/agent-server-ui-style-scope-BwIZYdC1.js"/><link rel="modulepreload" href="/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~b4cctr4k-B7YVdv1X.js"/><link rel="modulepreload" href="/assets/mutation-Cz7N4XAo.js"/><link rel="modulepreload" href="/assets/custom-toast-handlers-BYxhSr3t.js"/><link rel="modulepreload" href="/assets/health-store-BDC2rM-X.js"/><link rel="modulepreload" href="/assets/retrieve-axios-error-message-BY-yIkIq.js"/><link rel="modulepreload" href="/assets/createLucideIcon-Ddu8jDOQ.js"/><link rel="modulepreload" href="/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~extensions~i9dbt75i-CI82Did1.js"/><link rel="modulepreload" href="/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~skills-settings~m~o9nrx3fm-D44TR8hL.js"/><link rel="modulepreload" href="/assets/vendor~entry.client~root~root-layout~home~conversation-panel~conversation~launch~skills-set~zm51vy4j-iOsylxCS.js"/><link rel="modulepreload" href="/assets/agent-server-client-options-8OJSXbm8.js"/><link rel="modulepreload" href="/assets/llm-client-BpIfxETv.js"/><link rel="modulepreload" href="/assets/agent-server-compatibility-DvKtnXHw.js"/><link rel="modulepreload" href="/assets/server-client-CG1zHqph.js"/><link rel="modulepreload" href="/assets/root-luPHQiBx.js"/><link rel="modulepreload" href="/assets/useTranslation-01pF7z10.js"/><link rel="modulepreload" href="/assets/brand-button-8fVVei4i.js"/><link rel="modulepreload" href="/assets/base-modal-B4HvlFHE.js"/><link rel="modulepreload" href="/assets/loading-spinner-91b5FiMQ.js"/><link rel="modulepreload" href="/assets/modal-backdrop-B04pVYAD.js"/><link rel="modulepreload" href="/assets/modal-body-CgUoFQA1.js"/><link rel="modulepreload" href="/assets/use-config-Bcz2JL2t.js"/><link rel="modulepreload" href="/assets/color-themes-DSaoIL6A.js"/><link rel="modulepreload" href="/assets/vendor~root~root-layout~home~conversation-panel~conversation~launch~extensions-hub~skills-s~kyz9p27j-DlKA6SoO.js"/><link rel="stylesheet" href="/assets/root-DEotKI6b.css"/></head><body data-agent-server-ui="" class="m-0"><div data-agent-server-ui="" style="--oh-color-logo:#cfb755;--oh-color-base:var(--cool-grey-950);--oh-color-base-secondary:var(--cool-grey-925);--oh-color-danger:#e76a5e;--oh-color-success:#a5e75e;--oh-color-basic:var(--cool-grey-400);--oh-color-tertiary:var(--cool-grey-800);--oh-color-tertiary-light:var(--cool-grey-300);--oh-color-content:var(--cool-grey-100);--oh-color-content-2:var(--cool-grey-50);--oh-background:var(--cool-grey-950);--oh-foreground:var(--cool-grey-100);--oh-surface:var(--cool-grey-925);--oh-surface-foreground:var(--cool-grey-100);--oh-surface-raised:var(--cool-grey-900);--oh-surface-deep:var(--cool-grey-975);--oh-overlay:var(--cool-grey-925);--oh-overlay-foreground:var(--cool-grey-100);--oh-muted:var(--cool-grey-400);--oh-text-secondary:var(--cool-grey-300);--oh-text-tertiary:var(--cool-grey-200);--oh-text-dim:var(--cool-grey-500);--oh-text-subtle:var(--cool-grey-600);--oh-interactive-hover:var(--cool-grey-700);--oh-interactive-hover-low:var(--cool-grey-900);--oh-interactive-active:var(--cool-grey-800);--oh-interactive-selected:var(--cool-grey-600);--oh-scrollbar:color-mix(in srgb, var(--cool-grey-400) 30%, transparent);--oh-scrollbar-hover:color-mix(in srgb, var(--cool-grey-400) 50%, transparent);--oh-default:var(--cool-grey-800);--oh-default-foreground:var(--cool-grey-100);--oh-accent-foreground:var(--cool-grey-950);--oh-success:#a5e75e;--oh-success-foreground:var(--cool-grey-950);--oh-warning-foreground:var(--cool-grey-950);--oh-danger:#e76a5e;--oh-danger-foreground:var(--cool-grey-50);--oh-segment:var(--cool-grey-925);--oh-segment-foreground:var(--cool-grey-100);--oh-border-width:1px;--oh-field-border-width:1px;--oh-border:var(--cool-grey-700);--oh-border-input:var(--cool-grey-600);--oh-border-subtle:var(--cool-grey-800);--oh-separator:rgba(113, 120, 136, 0.5);--oh-focus:#ffffff;--oh-status-success:#1FBD53;--oh-status-error:#FF684E;--oh-link:var(--cool-grey-100);--oh-radius:8px;--oh-field-radius:8px;--oh-surface-shadow:none;--oh-overlay-shadow:none;--oh-field-shadow:none;--oh-bg-dark:var(--cool-grey-950);--oh-bg-light:var(--cool-grey-900);--oh-bg-input:var(--cool-grey-800);--oh-bg-workspace:var(--cool-grey-925);--oh-text-editor-base:var(--cool-grey-400);--oh-text-editor-active:var(--cool-grey-300);--oh-bg-editor-sidebar:var(--cool-grey-925);--oh-bg-editor-active:var(--cool-grey-900);--oh-border-editor-sidebar:var(--cool-grey-800);--oh-bg-neutral-muted:color-mix(in srgb, var(--cool-grey-300) 20%, transparent)"><div class="dark min-h-screen text-foreground" data-theme="dark"><script>
2
2
  console.log(
3
3
  "💿 Hey developer 👋. You can provide a way better UX than this " +
4
4
  "when your app is loading JS modules and/or running `clientLoader` " +
5
5
  "functions. Check out https://reactrouter.com/start/framework/route-module#hydratefallback " +
6
6
  "for more information."
7
7
  );
8
- </script><div data-rht-toaster="" style="position:fixed;z-index:9999;top:16px;left:16px;right:16px;bottom:16px;pointer-events:none"></div><div id="modal-portal-exit"></div></div></div><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_passThroughRequests":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"unstable_previewServerPrerendering":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":true};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamController = controller;}}).pipeThrough(new TextEncoderStream());</script><script type="module" async="">import "/assets/manifest-e27751af.js";
9
- import * as route0 from "/assets/root-Xt6cd1J6.js";
8
+ </script><div data-rht-toaster="" style="position:fixed;z-index:9999;top:16px;left:16px;right:16px;bottom:16px;pointer-events:none"></div><div id="modal-portal-exit"></div></div></div><script>window.__reactRouterContext = {"basename":"/","future":{"unstable_optimizeDeps":false,"unstable_passThroughRequests":false,"unstable_subResourceIntegrity":false,"unstable_trailingSlashAwareDataRequests":false,"unstable_previewServerPrerendering":false,"v8_middleware":false,"v8_splitRouteModules":false,"v8_viteEnvironmentApi":false},"routeDiscovery":{"mode":"initial"},"ssr":false,"isSpaMode":true};window.__reactRouterContext.stream = new ReadableStream({start(controller){window.__reactRouterContext.streamController = controller;}}).pipeThrough(new TextEncoderStream());</script><script type="module" async="">import "/assets/manifest-f141dc70.js";
9
+ import * as route0 from "/assets/root-luPHQiBx.js";
10
10
 
11
11
  window.__reactRouterRouteModules = {"root":route0};
12
12
 
13
- import("/assets/entry.client-DH09zdmW.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_3\":-5,\"_4\":-5},\"loaderData\",{},\"actionData\",\"errors\"]\n");</script><!--$--><script>window.__reactRouterContext.streamController.close();</script><!--/$--><!--/$--></body></html>
13
+ import("/assets/entry.client-DU7-q4ZU.js");</script><!--$--><script>window.__reactRouterContext.streamController.enqueue("[{\"_1\":2,\"_3\":-5,\"_4\":-5},\"loaderData\",{},\"actionData\",\"errors\"]\n");</script><!--$--><script>window.__reactRouterContext.streamController.close();</script><!--/$--><!--/$--></body></html>
@@ -1,2 +1,2 @@
1
- require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../i18n/declaration.cjs`);var t=new Set([`default`,`default (recommended)`]);function n(e){if(typeof e!=`string`)return null;let n=e.trim();return!n||t.has(n.toLowerCase())||n===`acp-managed`?null:n}function r(e){for(let t of[e.runtimeName,e.runtimeId,e.configured,e.sdkLlm]){let e=n(t);if(e)return e}return e.providerDefault??null}var i=[{key:`claude-code`,display_name:`Claude Code`,default_command:[`npx`,`-y`,`@agentclientprotocol/claude-agent-acp`],available_models:[{id:`claude-opus-4-7`,label:`Claude Opus 4.7`},{id:`claude-opus-4-6`,label:`Claude Opus 4.6`},{id:`opus[1m]`,label:`Claude Opus (1M)`},{id:`claude-opus-4-5`,label:`Claude Opus 4.5`},{id:`claude-opus-4-1-20250805`,label:`Claude Opus 4.1`},{id:`claude-sonnet-4-6`,label:`Claude Sonnet 4.6`},{id:`sonnet[1m]`,label:`Claude Sonnet (1M)`},{id:`claude-sonnet-4-5`,label:`Claude Sonnet 4.5`},{id:`claude-haiku-4-5`,label:`Claude Haiku 4.5`},{id:`opusplan`,label:`Opus (plan) + Sonnet (execute)`}],default_model:`claude-opus-4-7`,description_key:e.I18nKey.ONBOARDING$AGENT_CLAUDE_CODE_DESCRIPTION,icon:`claude-code`},{key:`codex`,display_name:`Codex`,default_command:[`npx`,`-y`,`@zed-industries/codex-acp`],available_models:[{id:`gpt-5.5/low`,label:`GPT-5.5 (low)`},{id:`gpt-5.5/medium`,label:`GPT-5.5 (medium)`},{id:`gpt-5.5/high`,label:`GPT-5.5 (high)`},{id:`gpt-5.5/xhigh`,label:`GPT-5.5 (xhigh)`},{id:`gpt-5.4/low`,label:`GPT-5.4 (low)`},{id:`gpt-5.4/medium`,label:`GPT-5.4 (medium)`},{id:`gpt-5.4/high`,label:`GPT-5.4 (high)`},{id:`gpt-5.4/xhigh`,label:`GPT-5.4 (xhigh)`},{id:`gpt-5.4-mini/low`,label:`GPT-5.4 Mini (low)`},{id:`gpt-5.4-mini/medium`,label:`GPT-5.4 Mini (medium)`},{id:`gpt-5.4-mini/high`,label:`GPT-5.4 Mini (high)`},{id:`gpt-5.4-mini/xhigh`,label:`GPT-5.4 Mini (xhigh)`},{id:`gpt-5.3-codex/low`,label:`GPT-5.3 Codex (low)`},{id:`gpt-5.3-codex/medium`,label:`GPT-5.3 Codex (medium)`},{id:`gpt-5.3-codex/high`,label:`GPT-5.3 Codex (high)`},{id:`gpt-5.3-codex/xhigh`,label:`GPT-5.3 Codex (xhigh)`},{id:`gpt-5.2/low`,label:`GPT-5.2 (low)`},{id:`gpt-5.2/medium`,label:`GPT-5.2 (medium)`},{id:`gpt-5.2/high`,label:`GPT-5.2 (high)`},{id:`gpt-5.2/xhigh`,label:`GPT-5.2 (xhigh)`}],default_model:`gpt-5.5/medium`,description_key:e.I18nKey.ONBOARDING$AGENT_CODEX_DESCRIPTION,icon:`codex`},{key:`gemini-cli`,display_name:`Gemini CLI`,default_command:[`npx`,`-y`,`@google/gemini-cli`,`--acp`],available_models:[{id:`auto-gemini-3`,label:`Auto (Gemini 3)`},{id:`auto-gemini-2.5`,label:`Auto (Gemini 2.5)`},{id:`gemini-3.1-pro-preview`,label:`Gemini 3.1 Pro (preview)`},{id:`gemini-3-flash-preview`,label:`Gemini 3 Flash (preview)`},{id:`gemini-3.1-flash-lite-preview`,label:`Gemini 3.1 Flash Lite (preview)`},{id:`gemini-2.5-pro`,label:`Gemini 2.5 Pro`},{id:`gemini-2.5-flash`,label:`Gemini 2.5 Flash`},{id:`gemini-2.5-flash-lite`,label:`Gemini 2.5 Flash Lite`}],default_model:`gemini-2.5-pro`,description_key:e.I18nKey.ONBOARDING$AGENT_GEMINI_CLI_DESCRIPTION,icon:`gemini`}];function a(e){if(e)return i.find(t=>t.key===e)}function o(e){let t=a(e);return t?t.display_name:null}function s(e){return a(e)?.icon??`cli-generic`}function c(e,t){return t?a(e)?.available_models?.find(e=>e.id===t)?.label??t:null}exports.ACP_PROVIDERS=i,exports.getAcpProvider=a,exports.getAcpProviderDisplayName=o,exports.labelForAcpModel=c,exports.resolveAcpProviderIcon=s,exports.resolveEffectiveAcpModel=r;
1
+ require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../i18n/declaration.cjs`),t=require(`../node_modules/@openhands/typescript-client/dist/models/acp.cjs`);require(`../node_modules/@openhands/typescript-client/dist/index.cjs`);var n=new Set([`default`,`default (recommended)`]);function r(e){if(typeof e!=`string`)return null;let t=e.trim();return!t||n.has(t.toLowerCase())||t===`acp-managed`?null:t}function i(e){for(let t of[e.runtimeName,e.runtimeId,e.configured,e.sdkLlm]){let e=r(t);if(e)return e}return e.providerDefault??null}var a={"claude-code":{icon:`claude-code`,description_key:e.I18nKey.ONBOARDING$AGENT_CLAUDE_CODE_DESCRIPTION},codex:{icon:`codex`,description_key:e.I18nKey.ONBOARDING$AGENT_CODEX_DESCRIPTION},"gemini-cli":{icon:`gemini`,description_key:e.I18nKey.ONBOARDING$AGENT_GEMINI_CLI_DESCRIPTION}},o=Object.entries(a).map(([e,n])=>{let r=t.getAcpProvider(e);return{key:e,display_name:r?.display_name??e,default_command:r?[...r.default_command]:[],available_models:r?.available_models?.map(e=>({id:e.id,label:e.label})),default_model:r?.default_model??void 0,description_key:n.description_key,icon:n.icon}});function s(e){if(e)return o.find(t=>t.key===e)}function c(e){let t=s(e);return t?t.display_name:null}function l(e){return s(e)?.icon??`cli-generic`}function u(e,t){return t?s(e)?.available_models?.find(e=>e.id===t)?.label??t:null}exports.ACP_PROVIDERS=o,exports.getAcpProvider=s,exports.getAcpProviderDisplayName=c,exports.labelForAcpModel=u,exports.resolveAcpProviderIcon=l,exports.resolveEffectiveAcpModel=i;
2
2
  //# sourceMappingURL=acp-providers.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"acp-providers.cjs","names":[],"sources":["../../src/constants/acp-providers.ts"],"sourcesContent":["import { I18nKey } from \"#/i18n/declaration\";\n\nexport type ACPProviderIcon =\n | \"claude-code\"\n | \"codex\"\n | \"gemini\"\n | \"cli-generic\";\n\nexport const ACP_PROVIDER_FALLBACK_ICON: ACPProviderIcon = \"cli-generic\";\n\n// SDK placeholder strings the ACP wrapper returns before the user has\n// chosen a real model — surfacing either would lie about what's running.\nexport const ACP_DEFAULT_PLACEHOLDERS = new Set([\n \"default\",\n \"default (recommended)\",\n]);\n\n// Sentinel ``agent.llm.model`` returned by older SDKs for ACP conversations\n// in lieu of a real model. Suppressed at every consumer that resolves a\n// display string.\nexport const ACP_MANAGED_SENTINEL = \"acp-managed\";\n\n/**\n * Filter for \"real\" ACP model strings — non-empty, not the SDK's \"default\"\n * placeholder, not the legacy ``acp-managed`` sentinel. Returns the trimmed\n * value on success, ``null`` otherwise.\n */\nfunction realAcpModel(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n if (!trimmed) return null;\n if (ACP_DEFAULT_PLACEHOLDERS.has(trimmed.toLowerCase())) return null;\n if (trimmed === ACP_MANAGED_SENTINEL) return null;\n return trimmed;\n}\n\n/**\n * Single source of truth for resolving the model string to surface for an\n * ACP conversation/settings context. Consumed by the conversation adapter\n * (chip text), the conversation-creation path (concrete ``acp_model``\n * payload), the Settings → Agent form (initial value), and the chat-input\n * model label.\n *\n * Precedence: SDK runtime fields → user-configured ``acp_model`` →\n * legacy ``agent.llm.model`` → provider default (when ``providerDefault``\n * is passed). Pass ``providerDefault`` only on surfaces that should\n * silently substitute the registry default; omit it for the conversation\n * chip, which must distinguish \"no concrete model\" from \"default\".\n */\nexport function resolveEffectiveAcpModel(inputs: {\n runtimeName?: string | null;\n runtimeId?: string | null;\n configured?: string | null;\n sdkLlm?: string | null;\n providerDefault?: string | null;\n}): string | null {\n for (const candidate of [\n inputs.runtimeName,\n inputs.runtimeId,\n inputs.configured,\n inputs.sdkLlm,\n ]) {\n const value = realAcpModel(candidate);\n if (value) return value;\n }\n return inputs.providerDefault ?? null;\n}\n\n/**\n * Built-in ACP (Agent Client Protocol) provider registry.\n *\n * **Source of truth:** ``openhands.sdk.settings.acp_providers.ACP_PROVIDERS``\n * in https://github.com/OpenHands/software-agent-sdk. This file is a\n * hand-kept TypeScript mirror — keep keys + commands in sync with the\n * Python source. The {@link OnboardingAgentId} and the\n * ``ACPAgentSettings.acp_server`` discriminator\n * (``\"claude-code\" | \"codex\" | \"gemini-cli\" | \"custom\"``) come from the\n * same Python module.\n *\n * Drift risk is tracked in agent-canvas#587. The richer SDK record\n * (api-key env var, session mode, set-session-model protocol, etc.)\n * is intentionally not mirrored here — canvas only renders this\n * registry in the Settings → Agent and onboarding UIs, so it only\n * needs the fields below.\n */\nexport interface ACPProviderConfig {\n /** Stable registry key, also stored on conversations as ``tags.acpserver``. */\n key: string;\n /** Human-readable name shown in dropdowns and conversation chips. */\n display_name: string;\n /**\n * Tokens passed to the agent-server as ``acp_command`` when this preset\n * is picked. Each entry must be a real ACP-protocol stdio server — the\n * SDK validates this against the {@link ACPProviderConfig.key}.\n *\n * NB: ``npx -y @openai/codex acp`` looks plausible but is **not** an\n * ACP server — the codex CLI has no ``acp`` subcommand and exits with\n * ``Error: stdin is not a terminal`` when spawned without a TTY, which\n * silently deadlocks the agent-server's ACP handshake. Use\n * ``@zed-industries/codex-acp`` (the Zed-shipped wrapper) instead.\n */\n default_command: string[];\n /**\n * Canvas-local suggested ACP model IDs. These mirror the current runtime\n * picker values for the built-in harnesses, but are not authoritative access\n * checks; users can still enter a custom override in Settings -> Agent.\n */\n available_models?: ACPModelOption[];\n /** Model ID preselected for built-in providers so Canvas never saves blank. */\n default_model?: string;\n /**\n * i18n key for the one-line provider description rendered under the\n * onboarding tile. Stored on the registry so adding a new ACP\n * provider only requires editing this file (not the onboarding tile\n * list separately).\n */\n description_key: I18nKey;\n /**\n * Serializable icon key used by UI surfaces that render provider\n * choices. Kept as a string so the SDK mirror check can continue to\n * parse this registry without importing React components.\n */\n icon?: ACPProviderIcon;\n}\n\nexport interface ACPModelOption {\n /** Exact model ID sent as ``acp_model``. */\n id: string;\n /** Human-readable label shown in Settings -> Agent. */\n label: string;\n}\n\n// Canonical model IDs the Claude Code CLI binary's model registry recognises\n// (verified by string-scanning v2.1.146 of the bundled ``claude`` native\n// binary). ``[1m]`` is the SDK-documented 1M-context suffix; we use the\n// version-agnostic alias so the option auto-tracks the newest 1M-capable\n// model. ``opusplan`` routes planning to Opus and execution to Sonnet.\n// Availability for any of these ultimately depends on the user's Anthropic\n// plan tier — surfacing them here matches what the CLI *accepts*, not what\n// every account can actually invoke.\nconst CLAUDE_MODELS: ACPModelOption[] = [\n { id: \"claude-opus-4-7\", label: \"Claude Opus 4.7\" },\n { id: \"claude-opus-4-6\", label: \"Claude Opus 4.6\" },\n // The 1M-context entries use the version-agnostic ``[1m]`` aliases, so the\n // label must stay version-less too — pinning a number here (e.g. \"4.6\")\n // would lie the moment the alias resolves to a newer model.\n { id: \"opus[1m]\", label: \"Claude Opus (1M)\" },\n { id: \"claude-opus-4-5\", label: \"Claude Opus 4.5\" },\n { id: \"claude-opus-4-1-20250805\", label: \"Claude Opus 4.1\" },\n { id: \"claude-sonnet-4-6\", label: \"Claude Sonnet 4.6\" },\n { id: \"sonnet[1m]\", label: \"Claude Sonnet (1M)\" },\n { id: \"claude-sonnet-4-5\", label: \"Claude Sonnet 4.5\" },\n { id: \"claude-haiku-4-5\", label: \"Claude Haiku 4.5\" },\n { id: \"opusplan\", label: \"Opus (plan) + Sonnet (execute)\" },\n];\n\n// Model IDs accepted by the ``@zed-industries/codex-acp`` wrapper, mirroring\n// the Codex CLI's own ``/model`` picker. Format is ``<base-model>/<effort>``\n// where the trailing tier (``low``/``medium``/``high``/``xhigh``) hints the\n// reasoning effort for that turn. Sourced from the Codex CLI's documented\n// runtime options as of 2026-05-22 — see ``acp_model`` registry tracker\n// in agent-canvas#740 for the long-term plan.\nconst CODEX_MODELS: ACPModelOption[] = [\n { id: \"gpt-5.5/low\", label: \"GPT-5.5 (low)\" },\n { id: \"gpt-5.5/medium\", label: \"GPT-5.5 (medium)\" },\n { id: \"gpt-5.5/high\", label: \"GPT-5.5 (high)\" },\n { id: \"gpt-5.5/xhigh\", label: \"GPT-5.5 (xhigh)\" },\n { id: \"gpt-5.4/low\", label: \"GPT-5.4 (low)\" },\n { id: \"gpt-5.4/medium\", label: \"GPT-5.4 (medium)\" },\n { id: \"gpt-5.4/high\", label: \"GPT-5.4 (high)\" },\n { id: \"gpt-5.4/xhigh\", label: \"GPT-5.4 (xhigh)\" },\n { id: \"gpt-5.4-mini/low\", label: \"GPT-5.4 Mini (low)\" },\n { id: \"gpt-5.4-mini/medium\", label: \"GPT-5.4 Mini (medium)\" },\n { id: \"gpt-5.4-mini/high\", label: \"GPT-5.4 Mini (high)\" },\n { id: \"gpt-5.4-mini/xhigh\", label: \"GPT-5.4 Mini (xhigh)\" },\n { id: \"gpt-5.3-codex/low\", label: \"GPT-5.3 Codex (low)\" },\n { id: \"gpt-5.3-codex/medium\", label: \"GPT-5.3 Codex (medium)\" },\n { id: \"gpt-5.3-codex/high\", label: \"GPT-5.3 Codex (high)\" },\n { id: \"gpt-5.3-codex/xhigh\", label: \"GPT-5.3 Codex (xhigh)\" },\n { id: \"gpt-5.2/low\", label: \"GPT-5.2 (low)\" },\n { id: \"gpt-5.2/medium\", label: \"GPT-5.2 (medium)\" },\n { id: \"gpt-5.2/high\", label: \"GPT-5.2 (high)\" },\n { id: \"gpt-5.2/xhigh\", label: \"GPT-5.2 (xhigh)\" },\n];\n\n// Model IDs accepted by ``@google/gemini-cli --acp``. The ``auto-gemini-*``\n// entries delegate version selection to the CLI's router; the explicit\n// ``gemini-3.1-*`` / ``gemini-2.5-*`` entries pin to a specific snapshot.\n// Sourced from the Gemini CLI's documented model list as of 2026-05-22 —\n// see agent-canvas#740 for the long-term plan to move this registry\n// upstream.\nconst GEMINI_MODELS: ACPModelOption[] = [\n { id: \"auto-gemini-3\", label: \"Auto (Gemini 3)\" },\n { id: \"auto-gemini-2.5\", label: \"Auto (Gemini 2.5)\" },\n { id: \"gemini-3.1-pro-preview\", label: \"Gemini 3.1 Pro (preview)\" },\n { id: \"gemini-3-flash-preview\", label: \"Gemini 3 Flash (preview)\" },\n {\n id: \"gemini-3.1-flash-lite-preview\",\n label: \"Gemini 3.1 Flash Lite (preview)\",\n },\n { id: \"gemini-2.5-pro\", label: \"Gemini 2.5 Pro\" },\n { id: \"gemini-2.5-flash\", label: \"Gemini 2.5 Flash\" },\n { id: \"gemini-2.5-flash-lite\", label: \"Gemini 2.5 Flash Lite\" },\n];\n\n// Each entry's ``default_command`` is the published-package npx\n// invocation that speaks the ACP JSON-RPC protocol on stdio. Verified\n// against the upstream npm registry on the date noted below — if a\n// package is renamed/unpublished, the agent-server spawn fails fast\n// with ``ENOENT`` and the user can switch to the \"Custom\" preset.\nexport const ACP_PROVIDERS: ACPProviderConfig[] = [\n {\n key: \"claude-code\",\n display_name: \"Claude Code\",\n // https://www.npmjs.com/package/@agentclientprotocol/claude-agent-acp\n // Verified 2026-05-19. Official Anthropic-maintained ACP wrapper\n // around the Claude Code CLI.\n default_command: [\"npx\", \"-y\", \"@agentclientprotocol/claude-agent-acp\"],\n available_models: CLAUDE_MODELS,\n default_model: \"claude-opus-4-7\",\n description_key: I18nKey.ONBOARDING$AGENT_CLAUDE_CODE_DESCRIPTION,\n icon: \"claude-code\",\n },\n {\n key: \"codex\",\n display_name: \"Codex\",\n // https://www.npmjs.com/package/@zed-industries/codex-acp\n // Verified 2026-05-19. Zed-maintained ACP wrapper around the\n // OpenAI Codex CLI — NOT ``@openai/codex acp`` (no ``acp``\n // subcommand on that package).\n default_command: [\"npx\", \"-y\", \"@zed-industries/codex-acp\"],\n available_models: CODEX_MODELS,\n default_model: \"gpt-5.5/medium\",\n description_key: I18nKey.ONBOARDING$AGENT_CODEX_DESCRIPTION,\n icon: \"codex\",\n },\n {\n key: \"gemini-cli\",\n display_name: \"Gemini CLI\",\n // https://www.npmjs.com/package/@google/gemini-cli\n // Verified 2026-05-19. Official Google CLI; ``--acp`` switches it\n // into ACP server mode on stdio.\n default_command: [\"npx\", \"-y\", \"@google/gemini-cli\", \"--acp\"],\n available_models: GEMINI_MODELS,\n default_model: \"gemini-2.5-pro\",\n description_key: I18nKey.ONBOARDING$AGENT_GEMINI_CLI_DESCRIPTION,\n icon: \"gemini\",\n },\n];\n\nexport const ACP_CUSTOM_PRESET_KEY = \"custom\";\n\n/**\n * Look up a built-in ACP provider config by its registry key.\n *\n * Returns ``undefined`` for an empty / null key, for the ``\"custom\"`` preset\n * (which has no registry entry), and for any forward-compatible key Canvas's\n * registry doesn't know about yet. Centralizes the ``ACP_PROVIDERS.find(...)``\n * lookup shared by the resolvers below and by the adapter / settings surfaces\n * so the key-comparison shape lives in one place.\n */\nexport function getAcpProvider(\n key: string | null | undefined,\n): ACPProviderConfig | undefined {\n if (!key) return undefined;\n return ACP_PROVIDERS.find((provider) => provider.key === key);\n}\n\n/**\n * Resolve an ACP provider registry key (the value stored under\n * ``tags.acpserver`` on a conversation) to a human display name for the\n * sidebar chip.\n *\n * Returns ``null`` for an empty / null key and for keys not in\n * {@link ACP_PROVIDERS} — most notably ``\"custom\"`` (the user-supplied\n * command preset has no canonical brand name) and any forward-compatible\n * value Canvas's registry doesn't know about yet. Callers should fall\n * back to a generic ``\"ACP\"`` label in that case so the chip still\n * communicates \"this is an ACP conversation\".\n *\n * Kept separate from {@link buildAcpAgentSettingsDiff}'s lookup so the\n * conversation-card render path can resolve display names without\n * importing the settings-payload builder.\n */\nexport function getAcpProviderDisplayName(\n key: string | null | undefined,\n): string | null {\n const found = getAcpProvider(key);\n return found ? found.display_name : null;\n}\n\n/**\n * Resolve an ACP provider registry key to the icon discriminator the\n * conversation chip should render alongside the model text.\n *\n * Falls back to {@link ACP_PROVIDER_FALLBACK_ICON} for ``\"custom\"``,\n * unknown keys, or a missing key — the chip then shows a neutral\n * terminal glyph that still communicates \"this is an ACP conversation\"\n * without claiming a brand identity we don't know.\n */\nexport function resolveAcpProviderIcon(\n key: string | null | undefined,\n): ACPProviderIcon {\n return getAcpProvider(key)?.icon ?? ACP_PROVIDER_FALLBACK_ICON;\n}\n\n/**\n * Resolve a raw ``acp_model`` ID to the human-readable label the provider's\n * picker shows for it (e.g. ``\"claude-opus-4-7\"`` → ``\"Claude Opus 4.7\"``).\n *\n * Falls back to the raw ID when the provider is unknown or the ID isn't one\n * of its registered {@link ACPModelOption}s — so a user's custom override\n * still renders something meaningful rather than nothing. Returns ``null``\n * only when there is no model to show, letting the conversation chip decide\n * to display the provider name instead.\n */\nexport function labelForAcpModel(\n serverKey: string | null | undefined,\n modelId: string | null | undefined,\n): string | null {\n if (!modelId) return null;\n const provider = getAcpProvider(serverKey);\n const match = provider?.available_models?.find((m) => m.id === modelId);\n return match?.label ?? modelId;\n}\n\n/**\n * Build the ``agent_settings_diff`` payload PATCH /api/settings expects\n * for the agent-kind/provider choice the user just made.\n *\n * Used by both the Settings → Agent page and the onboarding \"choose\n * agent\" step — keeping the shape in one helper means a future change\n * (e.g. always seeding ``acp_command`` from the registry instead of\n * sending ``[]``, or adding new ``acp_*`` reset fields) lands in both\n * surfaces atomically.\n *\n * Returns ``null`` for an unknown ACP provider key by default — the\n * caller can skip the save (the UI shouldn't surface unknown options,\n * but the defensive path keeps a buggy preset list from corrupting\n * settings).\n *\n * Pass ``allowUnknownServer: true`` to opt into pass-through for keys\n * that aren't in {@link ACP_PROVIDERS} or ``ACP_CUSTOM_PRESET_KEY``.\n * The Settings → Agent page uses this when the user opens settings\n * that already carry an ``acp_server`` value canvas's registry\n * doesn't know about (e.g. set out-of-band via the API for a provider\n * we haven't mirrored yet) and saves without changing the command —\n * otherwise the original key would be silently demoted to ``\"custom\"``.\n */\nexport function buildAcpAgentSettingsDiff(\n providerKey: string,\n options: {\n command?: string[];\n model?: string | null;\n allowUnknownServer?: boolean;\n } = {},\n): Record<string, unknown> | null {\n if (providerKey === \"openhands\") {\n // Switching back to OpenHands. The agent-server's ``Settings.update``\n // applies a fresh ``{'agent_kind': ...}`` base whenever the kind\n // flips, so any ``acp_*`` fields would be discarded before\n // validation. Send the kind alone.\n return { agent_kind: \"openhands\" };\n }\n\n const isCustom = providerKey === ACP_CUSTOM_PRESET_KEY;\n const provider = isCustom ? undefined : getAcpProvider(providerKey);\n if (!isCustom && !provider && !options.allowUnknownServer) {\n return null;\n }\n\n const model =\n options.model === undefined\n ? (provider?.default_model ?? null)\n : options.model;\n\n // ``acp_args: []`` resets any API-set ``acp_args`` that would\n // otherwise survive and concatenate to ``acp_command`` at spawn time\n // (the agent-server merges the two before exec). Callers building the\n // payload from a textarea that already shows the merged command\n // (Settings → Agent) round-trip correctly — the merged tokens land in\n // ``acp_command`` here, so no args are lost.\n return {\n agent_kind: \"acp\",\n acp_server: providerKey,\n acp_command: options.command ?? [],\n acp_args: [],\n acp_model: model ?? null,\n };\n}\n"],"mappings":"wFAYA,IAAa,EAA2B,IAAI,IAAI,CAC9C,UACA,wBACD,CAAC,CAYF,SAAS,EAAa,EAA+B,CACnD,GAAI,OAAO,GAAU,SAAU,OAAO,KACtC,IAAM,EAAU,EAAM,MAAM,CAI5B,MAHI,CAAC,GACD,EAAyB,IAAI,EAAQ,aAAa,CAAC,EACnD,IAAA,cAAyC,KACtC,EAgBT,SAAgB,EAAyB,EAMvB,CAChB,IAAK,IAAM,IAAa,CACtB,EAAO,YACP,EAAO,UACP,EAAO,WACP,EAAO,OACR,CAAE,CACD,IAAM,EAAQ,EAAa,EAAU,CACrC,GAAI,EAAO,OAAO,EAEpB,OAAO,EAAO,iBAAmB,KAiJnC,IAAa,EAAqC,CAChD,CACE,IAAK,cACL,aAAc,cAId,gBAAiB,CAAC,MAAO,KAAM,wCAAwC,CACvE,iBAAkB,CA7EpB,CAAE,GAAI,kBAAmB,MAAO,kBAAmB,CACnD,CAAE,GAAI,kBAAmB,MAAO,kBAAmB,CAInD,CAAE,GAAI,WAAY,MAAO,mBAAoB,CAC7C,CAAE,GAAI,kBAAmB,MAAO,kBAAmB,CACnD,CAAE,GAAI,2BAA4B,MAAO,kBAAmB,CAC5D,CAAE,GAAI,oBAAqB,MAAO,oBAAqB,CACvD,CAAE,GAAI,aAAc,MAAO,qBAAsB,CACjD,CAAE,GAAI,oBAAqB,MAAO,oBAAqB,CACvD,CAAE,GAAI,mBAAoB,MAAO,mBAAoB,CACrD,CAAE,GAAI,WAAY,MAAO,iCAAkC,CAiEvC,CAClB,cAAe,kBACf,gBAAiB,EAAA,QAAQ,yCACzB,KAAM,cACP,CACD,CACE,IAAK,QACL,aAAc,QAKd,gBAAiB,CAAC,MAAO,KAAM,4BAA4B,CAC3D,iBAAkB,CApEpB,CAAE,GAAI,cAAe,MAAO,gBAAiB,CAC7C,CAAE,GAAI,iBAAkB,MAAO,mBAAoB,CACnD,CAAE,GAAI,eAAgB,MAAO,iBAAkB,CAC/C,CAAE,GAAI,gBAAiB,MAAO,kBAAmB,CACjD,CAAE,GAAI,cAAe,MAAO,gBAAiB,CAC7C,CAAE,GAAI,iBAAkB,MAAO,mBAAoB,CACnD,CAAE,GAAI,eAAgB,MAAO,iBAAkB,CAC/C,CAAE,GAAI,gBAAiB,MAAO,kBAAmB,CACjD,CAAE,GAAI,mBAAoB,MAAO,qBAAsB,CACvD,CAAE,GAAI,sBAAuB,MAAO,wBAAyB,CAC7D,CAAE,GAAI,oBAAqB,MAAO,sBAAuB,CACzD,CAAE,GAAI,qBAAsB,MAAO,uBAAwB,CAC3D,CAAE,GAAI,oBAAqB,MAAO,sBAAuB,CACzD,CAAE,GAAI,uBAAwB,MAAO,yBAA0B,CAC/D,CAAE,GAAI,qBAAsB,MAAO,uBAAwB,CAC3D,CAAE,GAAI,sBAAuB,MAAO,wBAAyB,CAC7D,CAAE,GAAI,cAAe,MAAO,gBAAiB,CAC7C,CAAE,GAAI,iBAAkB,MAAO,mBAAoB,CACnD,CAAE,GAAI,eAAgB,MAAO,iBAAkB,CAC/C,CAAE,GAAI,gBAAiB,MAAO,kBAAmB,CAiD7B,CAClB,cAAe,iBACf,gBAAiB,EAAA,QAAQ,mCACzB,KAAM,QACP,CACD,CACE,IAAK,aACL,aAAc,aAId,gBAAiB,CAAC,MAAO,KAAM,qBAAsB,QAAQ,CAC7D,iBAAkB,CAnDpB,CAAE,GAAI,gBAAiB,MAAO,kBAAmB,CACjD,CAAE,GAAI,kBAAmB,MAAO,oBAAqB,CACrD,CAAE,GAAI,yBAA0B,MAAO,2BAA4B,CACnE,CAAE,GAAI,yBAA0B,MAAO,2BAA4B,CACnE,CACE,GAAI,gCACJ,MAAO,kCACR,CACD,CAAE,GAAI,iBAAkB,MAAO,iBAAkB,CACjD,CAAE,GAAI,mBAAoB,MAAO,mBAAoB,CACrD,CAAE,GAAI,wBAAyB,MAAO,wBAAyB,CAyC3C,CAClB,cAAe,iBACf,gBAAiB,EAAA,QAAQ,wCACzB,KAAM,SACP,CACF,CAaD,SAAgB,EACd,EAC+B,CAC1B,KACL,OAAO,EAAc,KAAM,GAAa,EAAS,MAAQ,EAAI,CAmB/D,SAAgB,EACd,EACe,CACf,IAAM,EAAQ,EAAe,EAAI,CACjC,OAAO,EAAQ,EAAM,aAAe,KAYtC,SAAgB,EACd,EACiB,CACjB,OAAO,EAAe,EAAI,EAAE,MAAA,cAa9B,SAAgB,EACd,EACA,EACe,CAIf,OAHK,EACY,EAAe,EAClB,EAAU,kBAAkB,KAAM,GAAM,EAAE,KAAO,EAAQ,EACzD,OAAS,EAHF"}
1
+ {"version":3,"file":"acp-providers.cjs","names":[],"sources":["../../src/constants/acp-providers.ts"],"sourcesContent":["import { getAcpProvider as getClientAcpProvider } from \"@openhands/typescript-client\";\nimport { I18nKey } from \"#/i18n/declaration\";\n\nexport type ACPProviderIcon =\n | \"claude-code\"\n | \"codex\"\n | \"gemini\"\n | \"cli-generic\";\n\nexport const ACP_PROVIDER_FALLBACK_ICON: ACPProviderIcon = \"cli-generic\";\n\n// SDK placeholder strings the ACP wrapper returns before the user has\n// chosen a real model — surfacing either would lie about what's running.\nexport const ACP_DEFAULT_PLACEHOLDERS = new Set([\n \"default\",\n \"default (recommended)\",\n]);\n\n// Sentinel ``agent.llm.model`` returned by older SDKs for ACP conversations\n// in lieu of a real model. Suppressed at every consumer that resolves a\n// display string.\nexport const ACP_MANAGED_SENTINEL = \"acp-managed\";\n\n/**\n * Filter for \"real\" ACP model strings — non-empty, not the SDK's \"default\"\n * placeholder, not the legacy ``acp-managed`` sentinel. Returns the trimmed\n * value on success, ``null`` otherwise.\n */\nfunction realAcpModel(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n if (!trimmed) return null;\n if (ACP_DEFAULT_PLACEHOLDERS.has(trimmed.toLowerCase())) return null;\n if (trimmed === ACP_MANAGED_SENTINEL) return null;\n return trimmed;\n}\n\n/**\n * Single source of truth for resolving the model string to surface for an\n * ACP conversation/settings context. Consumed by the conversation adapter\n * (chip text), the conversation-creation path (concrete ``acp_model``\n * payload), the Settings → Agent form (initial value), and the chat-input\n * model label.\n *\n * Precedence: SDK runtime fields → user-configured ``acp_model`` →\n * legacy ``agent.llm.model`` → provider default (when ``providerDefault``\n * is passed). Pass ``providerDefault`` only on surfaces that should\n * silently substitute the registry default; omit it for the conversation\n * chip, which must distinguish \"no concrete model\" from \"default\".\n */\nexport function resolveEffectiveAcpModel(inputs: {\n runtimeName?: string | null;\n runtimeId?: string | null;\n configured?: string | null;\n sdkLlm?: string | null;\n providerDefault?: string | null;\n}): string | null {\n for (const candidate of [\n inputs.runtimeName,\n inputs.runtimeId,\n inputs.configured,\n inputs.sdkLlm,\n ]) {\n const value = realAcpModel(candidate);\n if (value) return value;\n }\n return inputs.providerDefault ?? null;\n}\n\n/**\n * Shape of a built-in ACP (Agent Client Protocol) provider as Canvas consumes\n * it. The data fields (display name, launch command, model picker + default)\n * are sourced at module load from ``@openhands/typescript-client``'s ACP\n * registry — the generated mirror of the Python source of truth\n * ``openhands.sdk.settings.acp_providers``. This config only adds the\n * Canvas-specific UI fields ({@link ACPProviderConfig.icon} +\n * {@link ACPProviderConfig.description_key}); see {@link ACP_PROVIDER_UI}.\n */\nexport interface ACPProviderConfig {\n /** Stable registry key, also stored on conversations as ``tags.acpserver``. */\n key: string;\n /** Human-readable name shown in dropdowns and conversation chips. */\n display_name: string;\n /**\n * Tokens passed to the agent-server as ``acp_command`` when this preset\n * is picked. Each entry must be a real ACP-protocol stdio server — the\n * SDK validates this against the {@link ACPProviderConfig.key}.\n *\n * NB: ``npx -y @openai/codex acp`` looks plausible but is **not** an\n * ACP server — the codex CLI has no ``acp`` subcommand and exits with\n * ``Error: stdin is not a terminal`` when spawned without a TTY, which\n * silently deadlocks the agent-server's ACP handshake. Use\n * ``@zed-industries/codex-acp`` (the Zed-shipped wrapper) instead.\n */\n default_command: string[];\n /**\n * Suggested ACP model IDs for the provider's picker, sourced from the\n * typescript-client registry. Not authoritative access checks; users can\n * still enter a custom override in Settings -> Agent.\n */\n available_models?: ACPModelOption[];\n /** Model ID preselected for built-in providers so Canvas never saves blank. */\n default_model?: string;\n /**\n * i18n key for the one-line provider description rendered under the\n * onboarding tile. Stored on the registry so adding a new ACP\n * provider only requires editing this file (not the onboarding tile\n * list separately).\n */\n description_key: I18nKey;\n /**\n * Serializable icon key used by UI surfaces that render provider\n * choices. Kept as a string so the SDK mirror check can continue to\n * parse this registry without importing React components.\n */\n icon?: ACPProviderIcon;\n}\n\nexport interface ACPModelOption {\n /** Exact model ID sent as ``acp_model``. */\n id: string;\n /** Human-readable label shown in Settings -> Agent. */\n label: string;\n}\n\n// Canvas-only UI metadata per built-in provider, keyed by the ACP registry\n// key. Everything else — display name, launch command, model picker list and\n// default — comes from the typescript-client registry below. Adding a model\n// or a provider happens upstream in the SDK; Canvas only owns the brand icon\n// and the onboarding-tile description here. A provider with no entry here is\n// intentionally not surfaced in the UI.\nconst ACP_PROVIDER_UI: Record<\n string,\n { icon: ACPProviderIcon; description_key: I18nKey }\n> = {\n \"claude-code\": {\n icon: \"claude-code\",\n description_key: I18nKey.ONBOARDING$AGENT_CLAUDE_CODE_DESCRIPTION,\n },\n codex: {\n icon: \"codex\",\n description_key: I18nKey.ONBOARDING$AGENT_CODEX_DESCRIPTION,\n },\n \"gemini-cli\": {\n icon: \"gemini\",\n description_key: I18nKey.ONBOARDING$AGENT_GEMINI_CLI_DESCRIPTION,\n },\n};\n\n// Built-in ACP providers Canvas surfaces, built by enriching each upstream\n// registry record (``@openhands/typescript-client`` → Python SDK) with the\n// Canvas UI metadata above. Model lists + defaults are no longer hand-kept\n// here (closes agent-canvas#740) — they track the SDK via the pinned client.\nexport const ACP_PROVIDERS: ACPProviderConfig[] = Object.entries(\n ACP_PROVIDER_UI,\n).map(([key, ui]) => {\n const info = getClientAcpProvider(key);\n return {\n key,\n display_name: info?.display_name ?? key,\n default_command: info ? [...info.default_command] : [],\n available_models: info?.available_models?.map((model) => ({\n id: model.id,\n label: model.label,\n })),\n default_model: info?.default_model ?? undefined,\n description_key: ui.description_key,\n icon: ui.icon,\n };\n});\n\nexport const ACP_CUSTOM_PRESET_KEY = \"custom\";\n\n/**\n * Look up a built-in ACP provider config by its registry key.\n *\n * Returns ``undefined`` for an empty / null key, for the ``\"custom\"`` preset\n * (which has no registry entry), and for any forward-compatible key Canvas's\n * registry doesn't know about yet. Centralizes the ``ACP_PROVIDERS.find(...)``\n * lookup shared by the resolvers below and by the adapter / settings surfaces\n * so the key-comparison shape lives in one place.\n */\nexport function getAcpProvider(\n key: string | null | undefined,\n): ACPProviderConfig | undefined {\n if (!key) return undefined;\n return ACP_PROVIDERS.find((provider) => provider.key === key);\n}\n\n/**\n * Resolve an ACP provider registry key (the value stored under\n * ``tags.acpserver`` on a conversation) to a human display name for the\n * sidebar chip.\n *\n * Returns ``null`` for an empty / null key and for keys not in\n * {@link ACP_PROVIDERS} — most notably ``\"custom\"`` (the user-supplied\n * command preset has no canonical brand name) and any forward-compatible\n * value Canvas's registry doesn't know about yet. Callers should fall\n * back to a generic ``\"ACP\"`` label in that case so the chip still\n * communicates \"this is an ACP conversation\".\n *\n * Kept separate from {@link buildAcpAgentSettingsDiff}'s lookup so the\n * conversation-card render path can resolve display names without\n * importing the settings-payload builder.\n */\nexport function getAcpProviderDisplayName(\n key: string | null | undefined,\n): string | null {\n const found = getAcpProvider(key);\n return found ? found.display_name : null;\n}\n\n/**\n * Resolve an ACP provider registry key to the icon discriminator the\n * conversation chip should render alongside the model text.\n *\n * Falls back to {@link ACP_PROVIDER_FALLBACK_ICON} for ``\"custom\"``,\n * unknown keys, or a missing key — the chip then shows a neutral\n * terminal glyph that still communicates \"this is an ACP conversation\"\n * without claiming a brand identity we don't know.\n */\nexport function resolveAcpProviderIcon(\n key: string | null | undefined,\n): ACPProviderIcon {\n return getAcpProvider(key)?.icon ?? ACP_PROVIDER_FALLBACK_ICON;\n}\n\n/**\n * Resolve a raw ``acp_model`` ID to the human-readable label the provider's\n * picker shows for it (e.g. ``\"claude-opus-4-7\"`` → ``\"Claude Opus 4.7\"``).\n *\n * Falls back to the raw ID when the provider is unknown or the ID isn't one\n * of its registered {@link ACPModelOption}s — so a user's custom override\n * still renders something meaningful rather than nothing. Returns ``null``\n * only when there is no model to show, letting the conversation chip decide\n * to display the provider name instead.\n */\nexport function labelForAcpModel(\n serverKey: string | null | undefined,\n modelId: string | null | undefined,\n): string | null {\n if (!modelId) return null;\n const provider = getAcpProvider(serverKey);\n const match = provider?.available_models?.find((m) => m.id === modelId);\n return match?.label ?? modelId;\n}\n\n/**\n * Build the ``agent_settings_diff`` payload PATCH /api/settings expects\n * for the agent-kind/provider choice the user just made.\n *\n * Used by both the Settings → Agent page and the onboarding \"choose\n * agent\" step — keeping the shape in one helper means a future change\n * (e.g. always seeding ``acp_command`` from the registry instead of\n * sending ``[]``, or adding new ``acp_*`` reset fields) lands in both\n * surfaces atomically.\n *\n * Returns ``null`` for an unknown ACP provider key by default — the\n * caller can skip the save (the UI shouldn't surface unknown options,\n * but the defensive path keeps a buggy preset list from corrupting\n * settings).\n *\n * Pass ``allowUnknownServer: true`` to opt into pass-through for keys\n * that aren't in {@link ACP_PROVIDERS} or ``ACP_CUSTOM_PRESET_KEY``.\n * The Settings → Agent page uses this when the user opens settings\n * that already carry an ``acp_server`` value canvas's registry\n * doesn't know about (e.g. set out-of-band via the API for a provider\n * we haven't mirrored yet) and saves without changing the command —\n * otherwise the original key would be silently demoted to ``\"custom\"``.\n */\nexport function buildAcpAgentSettingsDiff(\n providerKey: string,\n options: {\n command?: string[];\n model?: string | null;\n allowUnknownServer?: boolean;\n } = {},\n): Record<string, unknown> | null {\n if (providerKey === \"openhands\") {\n // Switching back to OpenHands. The agent-server's ``Settings.update``\n // applies a fresh ``{'agent_kind': ...}`` base whenever the kind\n // flips, so any ``acp_*`` fields would be discarded before\n // validation. Send the kind alone.\n return { agent_kind: \"openhands\" };\n }\n\n const isCustom = providerKey === ACP_CUSTOM_PRESET_KEY;\n const provider = isCustom ? undefined : getAcpProvider(providerKey);\n if (!isCustom && !provider && !options.allowUnknownServer) {\n return null;\n }\n\n const model =\n options.model === undefined\n ? (provider?.default_model ?? null)\n : options.model;\n\n // ``acp_args: []`` resets any API-set ``acp_args`` that would\n // otherwise survive and concatenate to ``acp_command`` at spawn time\n // (the agent-server merges the two before exec). Callers building the\n // payload from a textarea that already shows the merged command\n // (Settings → Agent) round-trip correctly — the merged tokens land in\n // ``acp_command`` here, so no args are lost.\n return {\n agent_kind: \"acp\",\n acp_server: providerKey,\n acp_command: options.command ?? [],\n acp_args: [],\n acp_model: model ?? null,\n };\n}\n"],"mappings":"6OAaA,IAAa,EAA2B,IAAI,IAAI,CAC9C,UACA,wBACD,CAAC,CAYF,SAAS,EAAa,EAA+B,CACnD,GAAI,OAAO,GAAU,SAAU,OAAO,KACtC,IAAM,EAAU,EAAM,MAAM,CAI5B,MAHI,CAAC,GACD,EAAyB,IAAI,EAAQ,aAAa,CAAC,EACnD,IAAA,cAAyC,KACtC,EAgBT,SAAgB,EAAyB,EAMvB,CAChB,IAAK,IAAM,IAAa,CACtB,EAAO,YACP,EAAO,UACP,EAAO,WACP,EAAO,OACR,CAAE,CACD,IAAM,EAAQ,EAAa,EAAU,CACrC,GAAI,EAAO,OAAO,EAEpB,OAAO,EAAO,iBAAmB,KAiEnC,IAAM,EAGF,CACF,cAAe,CACb,KAAM,cACN,gBAAiB,EAAA,QAAQ,yCAC1B,CACD,MAAO,CACL,KAAM,QACN,gBAAiB,EAAA,QAAQ,mCAC1B,CACD,aAAc,CACZ,KAAM,SACN,gBAAiB,EAAA,QAAQ,wCAC1B,CACF,CAMY,EAAqC,OAAO,QACvD,EACD,CAAC,KAAK,CAAC,EAAK,KAAQ,CACnB,IAAM,EAAO,EAAA,eAAqB,EAAI,CACtC,MAAO,CACL,MACA,aAAc,GAAM,cAAgB,EACpC,gBAAiB,EAAO,CAAC,GAAG,EAAK,gBAAgB,CAAG,EAAE,CACtD,iBAAkB,GAAM,kBAAkB,IAAK,IAAW,CACxD,GAAI,EAAM,GACV,MAAO,EAAM,MACd,EAAE,CACH,cAAe,GAAM,eAAiB,IAAA,GACtC,gBAAiB,EAAG,gBACpB,KAAM,EAAG,KACV,EACD,CAaF,SAAgB,EACd,EAC+B,CAC1B,KACL,OAAO,EAAc,KAAM,GAAa,EAAS,MAAQ,EAAI,CAmB/D,SAAgB,EACd,EACe,CACf,IAAM,EAAQ,EAAe,EAAI,CACjC,OAAO,EAAQ,EAAM,aAAe,KAYtC,SAAgB,EACd,EACiB,CACjB,OAAO,EAAe,EAAI,EAAE,MAAA,cAa9B,SAAgB,EACd,EACA,EACe,CAIf,OAHK,EACY,EAAe,EAClB,EAAU,kBAAkB,KAAM,GAAM,EAAE,KAAO,EAAQ,EACzD,OAAS,EAHF"}
@@ -24,21 +24,13 @@ export declare function resolveEffectiveAcpModel(inputs: {
24
24
  providerDefault?: string | null;
25
25
  }): string | null;
26
26
  /**
27
- * Built-in ACP (Agent Client Protocol) provider registry.
28
- *
29
- * **Source of truth:** ``openhands.sdk.settings.acp_providers.ACP_PROVIDERS``
30
- * in https://github.com/OpenHands/software-agent-sdk. This file is a
31
- * hand-kept TypeScript mirror keep keys + commands in sync with the
32
- * Python source. The {@link OnboardingAgentId} and the
33
- * ``ACPAgentSettings.acp_server`` discriminator
34
- * (``"claude-code" | "codex" | "gemini-cli" | "custom"``) come from the
35
- * same Python module.
36
- *
37
- * Drift risk is tracked in agent-canvas#587. The richer SDK record
38
- * (api-key env var, session mode, set-session-model protocol, etc.)
39
- * is intentionally not mirrored here — canvas only renders this
40
- * registry in the Settings → Agent and onboarding UIs, so it only
41
- * needs the fields below.
27
+ * Shape of a built-in ACP (Agent Client Protocol) provider as Canvas consumes
28
+ * it. The data fields (display name, launch command, model picker + default)
29
+ * are sourced at module load from ``@openhands/typescript-client``'s ACP
30
+ * registry the generated mirror of the Python source of truth
31
+ * ``openhands.sdk.settings.acp_providers``. This config only adds the
32
+ * Canvas-specific UI fields ({@link ACPProviderConfig.icon} +
33
+ * {@link ACPProviderConfig.description_key}); see {@link ACP_PROVIDER_UI}.
42
34
  */
43
35
  export interface ACPProviderConfig {
44
36
  /** Stable registry key, also stored on conversations as ``tags.acpserver``. */
@@ -58,9 +50,9 @@ export interface ACPProviderConfig {
58
50
  */
59
51
  default_command: string[];
60
52
  /**
61
- * Canvas-local suggested ACP model IDs. These mirror the current runtime
62
- * picker values for the built-in harnesses, but are not authoritative access
63
- * checks; users can still enter a custom override in Settings -> Agent.
53
+ * Suggested ACP model IDs for the provider's picker, sourced from the
54
+ * typescript-client registry. Not authoritative access checks; users can
55
+ * still enter a custom override in Settings -> Agent.
64
56
  */
65
57
  available_models?: ACPModelOption[];
66
58
  /** Model ID preselected for built-in providers so Canvas never saves blank. */