@openhands/agent-canvas 1.15.0 → 1.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (739) hide show
  1. package/README.md +15 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/{acp-providers-BKvmTf82.js → acp-providers-CX3Lh9gj.js} +1 -1
  4. package/build/assets/active-backend-context-CrHTlgvN.js +2 -0
  5. package/build/assets/{agent-context-settings-D3PjSTU1.js → agent-context-settings-DSZlXrLj.js} +1 -1
  6. package/build/assets/{agent-profiles-settings-D4cY5U2T.js → agent-profiles-settings-Dzgb7G9z.js} +1 -1
  7. package/build/assets/agent-server-conversation-service.api-tnqNjbpE.js +86 -0
  8. package/build/assets/agent-settings-DLtsqaOs.js +2 -0
  9. package/build/assets/agent-settings-fFvR-XC2.js +1 -0
  10. package/build/assets/alert-banner-HP6mX-Vr.js +1 -0
  11. package/build/assets/{api-error-message-BJyfWp6p.js → api-error-message-B-XdSk3b.js} +1 -1
  12. package/build/assets/api-key-entry-screen-qTzrmJcr.js +1 -0
  13. package/build/assets/{app-settings-CbHqzQus.js → app-settings-dbnneVaV.js} +1 -1
  14. package/build/assets/automation-detail-BmwlCUAB.js +3 -0
  15. package/build/assets/{automation-export-BRopEHMu.js → automation-export-D3a3of4G.js} +1 -1
  16. package/build/assets/{automation-git-sync-CzyS4cn1.js → automation-git-sync-CprN5DcU.js} +1 -1
  17. package/build/assets/automation-setup-route-C40kXjMY.js +1 -0
  18. package/build/assets/{automation-templates-C_0FZgLG.js → automation-templates-BRppNh99.js} +1 -1
  19. package/build/assets/automations-list-DuNcRawl.js +1 -0
  20. package/build/assets/{back-nav-button-Dm9tIjVf.js → back-nav-button-Cjl_hoxq.js} +1 -1
  21. package/build/assets/backend-form-modal-lhGwzXFI.js +1 -0
  22. package/build/assets/{backend-synced-settings-badge-3fOwg6Bd.js → backend-synced-settings-badge-DPkz30BE.js} +1 -1
  23. package/build/assets/{badge-D4SqUCsR.js → badge-BU3S0VtE.js} +1 -1
  24. package/build/assets/{base-modal-C7_BDl_U.js → base-modal-D_L0oEbG.js} +1 -1
  25. package/build/assets/{bot-C-0Wu7vQ.js → bot-dMYHVfYM.js} +1 -1
  26. package/build/assets/{brand-button-Dxv6PDeN.js → brand-button-BAfk4wGP.js} +1 -1
  27. package/build/assets/browser-DSAo0tz1.js +46 -0
  28. package/build/assets/{browser-tab-BAl4ckJE.js → browser-tab-C9vy56R5.js} +1 -1
  29. package/build/assets/canvas-extension-page-dx1gFrfW.js +1 -0
  30. package/build/assets/canvas-extensions-8A-XhpgP.js +1 -0
  31. package/build/assets/canvas-extensions-runtime-2_x5Ezmi.js +1 -0
  32. package/build/assets/{chat-send-button-DWwR2cgI.js → chat-send-button-MUQqCZCS.js} +1 -1
  33. package/build/assets/check-CS0vmpQQ.js +1 -0
  34. package/build/assets/chevron-down-e1QBpjVy.js +1 -0
  35. package/build/assets/chevron-right-ZG4R5G4Q.js +1 -0
  36. package/build/assets/circle-check-DzWLNsbE.js +1 -0
  37. package/build/assets/{circle-plus-check-toggle-CBh_qomE.js → circle-plus-check-toggle-BO_kFZt3.js} +1 -1
  38. package/build/assets/{cloud-funnel-analytics-287iIERo.js → cloud-funnel-analytics-CztBCCPp.js} +1 -1
  39. package/build/assets/{cog-C4rrw-ZK.js → cog-D-MPQW6G.js} +1 -1
  40. package/build/assets/command-menu--UIlGL72.js +1 -0
  41. package/build/assets/{commits-tab-DZtJgaDM.js → commits-tab-AnZwLvh-.js} +1 -1
  42. package/build/assets/{condenser-settings-BcNmYR4s.js → condenser-settings-DmEOje-7.js} +1 -1
  43. package/build/assets/{confirmation-modal-Bk4JRcCM.js → confirmation-modal-Dv1ktp8K.js} +1 -1
  44. package/build/assets/{context-menu-list-item-lVYETtY5.js → context-menu-list-item-I86vKcmM.js} +1 -1
  45. package/build/assets/conversation-BbGrAO4Z.js +93 -0
  46. package/build/assets/conversation-mYT6NAoj.js +1 -0
  47. package/build/assets/conversation-panel-mYT6NAoj.js +1 -0
  48. package/build/assets/conversation-state-store-B0ImPLHO.js +1 -0
  49. package/build/assets/{conversation-tab-empty-state-HJtkmHZj.js → conversation-tab-empty-state-FIbh_lc8.js} +1 -1
  50. package/build/assets/{copy-to-clipboard-button-Cjkswvnj.js → copy-to-clipboard-button-Ca8iSkkA.js} +1 -1
  51. package/build/assets/{device-verify-EZhHhBT7.js → device-verify-Bhn2e_Ye.js} +1 -1
  52. package/build/assets/{dropdown-classes-DJe-E6MC.js → dropdown-classes-Bc1djN0-.js} +1 -1
  53. package/build/assets/{edit-automation-modal-D-urtv8n.js → edit-automation-modal-DadGbJ2u.js} +1 -1
  54. package/build/assets/empty-state-BoGVDecT.js +1 -0
  55. package/build/assets/{entry.client-C7Bi2tkU.js → entry.client-CqyPPjOq.js} +2 -2
  56. package/build/assets/{enum-filter-dropdown-DliX_Lo0.js → enum-filter-dropdown-Bgca129f.js} +1 -1
  57. package/build/assets/{environment-switch-overlay-CEKrFiMw.js → environment-switch-overlay-BmBRT7gv.js} +1 -1
  58. package/build/assets/{error-state-BALXiBNy.js → error-state-Body8Ngd.js} +1 -1
  59. package/build/assets/extensions-hub-CcDqq_vR.js +1 -0
  60. package/build/assets/extensions-navigation-Cr4yzYk4.js +1 -0
  61. package/build/assets/{external-link-DFpYunfj.js → external-link-DKUlnCQV.js} +1 -1
  62. package/build/assets/files-tab-D4o2VyE_.js +1 -0
  63. package/build/assets/{form-control-classes-CGw40z5h.js → form-control-classes-Bkh5FGrD.js} +1 -1
  64. package/build/assets/format-model-name-CasAP3nd.js +1 -0
  65. package/build/assets/get-git-path-ChKDVHZp.js +1 -0
  66. package/build/assets/{git-repo-dropdown-ai8qaNkD.js → git-repo-dropdown-4ROKl2cB.js} +1 -1
  67. package/build/assets/git-repo-dropdown-BkqzkMmM.js +1 -0
  68. package/build/assets/{highlighted-source-view-C3sxykQi.js → highlighted-source-view-BFRxGT_Q.js} +1 -1
  69. package/build/assets/home-ChpSuepX.js +1 -0
  70. package/build/assets/home-DIsB440S.js +1 -0
  71. package/build/assets/home-automation-run-tooltip-BVNDWjAH.js +1 -0
  72. package/build/assets/home-store-CY9Ej0ux.js +1 -0
  73. package/build/assets/index-home-BdlrFIif.js +1 -0
  74. package/build/assets/info-B6RQawoW.js +1 -0
  75. package/build/assets/install-server-modal-Dpy89p4g.js +1 -0
  76. package/build/assets/kebab-menu-item-content-D8hSNGmm.js +1 -0
  77. package/build/assets/{key-Cn5za3rg.js → key-BmVyxs-2.js} +1 -1
  78. package/build/assets/{launch-C1ieiOGe.js → launch-IrTDEFCs.js} +1 -1
  79. package/build/assets/list-filter-DsEK7NFC.js +1 -0
  80. package/build/assets/{list-todo-Cuu-STFc.js → list-todo-apgLVjMw.js} +1 -1
  81. package/build/assets/llm-not-configured-banner-CIFABh3K.js +27 -0
  82. package/build/assets/llm-settings-B9juXhIa.js +1 -0
  83. package/build/assets/llm-settings-De1d5dfr.js +1 -0
  84. package/build/assets/llm-subscription-service-BpJ0ouQo.js +1 -0
  85. package/build/assets/loader-circle-CC1au6hc.js +1 -0
  86. package/build/assets/{loading-spinner-0L3ZTToZ.js → loading-spinner-BY9N3pOe.js} +1 -1
  87. package/build/assets/manage-backends-modal-BrPV3oB-.js +1 -0
  88. package/build/assets/manifest-80fb1c29.js +1 -0
  89. package/build/assets/{manifest-subpage-layout-BGhiUQbA.js → manifest-subpage-layout-CAOYzrYp.js} +1 -1
  90. package/build/assets/{map-provider-B9LTm23I.js → map-provider-Cu3Zgumb.js} +1 -1
  91. package/build/assets/markdown-renderer-BzTlxI8x.js +8 -0
  92. package/build/assets/{mcp-CKbR4Vft.js → mcp-BTs_SXfZ.js} +1 -1
  93. package/build/assets/{mcp-marketplace-utils-C13fFccR.js → mcp-marketplace-utils-AIBzzHTO.js} +1 -1
  94. package/build/assets/{mcp-page-Bm4K2NQq.js → mcp-page-BEBYqH_K.js} +2 -2
  95. package/build/assets/messages-DKV9cRc2.js +41 -0
  96. package/build/assets/{modal-body-CMOc2tLl.js → modal-body-BxZjsju9.js} +1 -1
  97. package/build/assets/{modal-classes-BAb4Y_BG.js → modal-classes-C8eycCwG.js} +1 -1
  98. package/build/assets/{modal-close-button-CkJ0Ktjj.js → modal-close-button-DDzdRvCs.js} +1 -1
  99. package/build/assets/{mouse-pointer-click-CsgRs_-r.js → mouse-pointer-click-Co2uyaPA.js} +1 -1
  100. package/build/assets/onboarding-DV_OXoeP.js +1 -0
  101. package/build/assets/onboarding-modal-rkyBYkeQ.js +1 -0
  102. package/build/assets/{organization-service.api-C8XpQ0pM.js → organization-service.api-DrYNkEN_.js} +1 -1
  103. package/build/assets/{pencil-Clh1Wjvh.js → pencil-47jAZH_V.js} +1 -1
  104. package/build/assets/pin-By41Vl5J.js +1 -0
  105. package/build/assets/{planner-tab-DQvDU3ap.js → planner-tab-C9uZmhme.js} +1 -1
  106. package/build/assets/{plug-BuQhHSSG.js → plug-CG5HFcNG.js} +1 -1
  107. package/build/assets/plugins-management-service-BMJgC3Ga.js +1 -0
  108. package/build/assets/plus-C7Slq-0I.js +1 -0
  109. package/build/assets/profiles-service.api-ChoKrL0l.js +1 -0
  110. package/build/assets/providers-BhMcY5nv.js +1 -0
  111. package/build/assets/proxy-9Fe1v5na.js +1 -0
  112. package/build/assets/{puzzle-A9pGxxai.js → puzzle-JM_QaRm0.js} +1 -1
  113. package/build/assets/recommended-automations-launcher-6ABrI9Cy.js +1 -0
  114. package/build/assets/{refresh-cw-Bh69DyYO.js → refresh-cw-3q3Frrii.js} +1 -1
  115. package/build/assets/root-Dc8YmC9F.js +2 -0
  116. package/build/assets/root-VDaypvK4.css +1 -0
  117. package/build/assets/root-layout-CXkhSPYh.js +2 -0
  118. package/build/assets/schema-field-D-y9-LDb.js +1 -0
  119. package/build/assets/{sdk-section-page-HTffvm7Q.js → sdk-section-page-BlFiizlG.js} +1 -1
  120. package/build/assets/{secret-form-HTUbYw5o.js → secret-form-BB7the8W.js} +1 -1
  121. package/build/assets/secrets-service-ByZVENbp.js +1 -0
  122. package/build/assets/{secrets-settings-BizaTEr1.js → secrets-settings-B_GpxKW2.js} +1 -1
  123. package/build/assets/{settings-BlmrkwRi.js → settings-C0EWuBtA.js} +1 -1
  124. package/build/assets/settings-CKqk8ZnH.js +1 -0
  125. package/build/assets/{settings-dropdown-input-tM0A0ipy.js → settings-dropdown-input-BcwylHs2.js} +1 -1
  126. package/build/assets/{settings-index-CKq0b0Vg.js → settings-index-5w5UW2K3.js} +1 -1
  127. package/build/assets/{settings-input-C03KUoSC.js → settings-input-Db-1g8Ql.js} +1 -1
  128. package/build/assets/{settings-list-classes-BJ0g8rWj.js → settings-list-classes-BzeSZbF2.js} +1 -1
  129. package/build/assets/{settings-modal-AzEF1QPP.js → settings-modal-DfJ3tcJQ.js} +1 -1
  130. package/build/assets/settings-service.api-DJ1r62Zr.js +1 -0
  131. package/build/assets/{settings-switch-CQE0EGC-.js → settings-switch-CS-dJDmA.js} +1 -1
  132. package/build/assets/{settings-utils-ClYOkbbI.js → settings-utils-UYpEdPuD.js} +1 -1
  133. package/build/assets/shared-conversation-CA5ISEDy.js +1 -0
  134. package/build/assets/{shield-check-CFDViW82.js → shield-check-D2aCRd16.js} +1 -1
  135. package/build/assets/{sidebar-layout-D3hE08wK.js → sidebar-layout-D6fS8-Gl.js} +1 -1
  136. package/build/assets/{sidebar-mobile-menu-toggle-BOtyJHwE.js → sidebar-mobile-menu-toggle-C_fb0Jki.js} +1 -1
  137. package/build/assets/sidebar-nav-link-DQQcMf1A.js +1 -0
  138. package/build/assets/{sidebar-onboarding-checklist-storage-3qYflszY.js → sidebar-onboarding-checklist-storage-BBkeI6Bp.js} +1 -1
  139. package/build/assets/sidebar-store-DGqHkVLw.js +1 -0
  140. package/build/assets/{skill-card-pill-row-CFxjoqxn.js → skill-card-pill-row-B27-xyig.js} +1 -1
  141. package/build/assets/skill-enablement-DXeaImBz.js +1 -0
  142. package/build/assets/skill-filter-w__3UCEE.js +2 -0
  143. package/build/assets/{skill-icon-badge-CPQJ6A-I.js → skill-icon-badge-RQkq8wvl.js} +1 -1
  144. package/build/assets/skill-scope-B42H-XOc.js +1 -0
  145. package/build/assets/skills-plugins-tgF8EiXC.js +1 -0
  146. package/build/assets/skills-settings-BgJ9PaOe.js +1 -0
  147. package/build/assets/{styled-tooltip-Dl06rkpY.js → styled-tooltip-C4jf5Fv9.js} +1 -1
  148. package/build/assets/{task-list-tab-04GNQuii.js → task-list-tab-C5zcaktH.js} +1 -1
  149. package/build/assets/{terminal-Cj0iHIW7.js → terminal-CNElN42a.js} +2 -2
  150. package/build/assets/{toggle-switch-Fd_QGz0r.js → toggle-switch-ChOLXv2n.js} +1 -1
  151. package/build/assets/{trash-2-Dl8_RGz0.js → trash-2-D7K26eDO.js} +1 -1
  152. package/build/assets/{trash-_RMt7Ayc.js → trash-D-HYiVYM.js} +1 -1
  153. package/build/assets/{triangle-alert-SM-q4NU_.js → triangle-alert-CtdXWHUI.js} +1 -1
  154. package/build/assets/{typography-SgFy466J.js → typography-v1KN0tzi.js} +1 -1
  155. package/build/assets/usage-tab-CVDffLPt.js +1 -0
  156. package/build/assets/use-acp-credential-form-XIQmpX6M.js +1 -0
  157. package/build/assets/{use-activate-agent-profile-B2NS8nA5.js → use-activate-agent-profile-BLfmvDiG.js} +1 -1
  158. package/build/assets/use-agent-profiles-Bd9Bvvp1.js +1 -0
  159. package/build/assets/{use-automation-health-BxXdzZMP.js → use-automation-health-E6NZi9rb.js} +1 -1
  160. package/build/assets/{use-automations-zYb0dUny.js → use-automations-xijQKIl9.js} +1 -1
  161. package/build/assets/{use-can-manage-org-profiles-BWMahtUh.js → use-can-manage-org-profiles-CrJP5262.js} +1 -1
  162. package/build/assets/use-canvas-extensions-Bi693ujJ.js +1 -0
  163. package/build/assets/{use-cloud-current-user-id-CPHMDG-C.js → use-cloud-current-user-id-CDfAHpPX.js} +1 -1
  164. package/build/assets/use-config-A9QovgXO.js +1 -0
  165. package/build/assets/{use-create-conversation-DwN5vv2f.js → use-create-conversation-Dx3l7mFZ.js} +1 -1
  166. package/build/assets/use-create-secret-B9cUFWRG.js +1 -0
  167. package/build/assets/{use-get-secrets-BT4ihRwj.js → use-get-secrets-K3jmk-LH.js} +1 -1
  168. package/build/assets/use-is-authed-nTBcM7dE.js +1 -0
  169. package/build/assets/use-llm-configured-BV9nZ1_j.js +1 -0
  170. package/build/assets/use-llm-profiles-BO-P4Oyo.js +1 -0
  171. package/build/assets/use-manifest-capabilities-Cw_flwEz.js +1 -0
  172. package/build/assets/use-onboarding-completion-D8U7k4Qb.js +1 -0
  173. package/build/assets/use-pinned-home-route-CckOZrmb.js +1 -0
  174. package/build/assets/use-plugins-marketplace-7i94Zu3Z.js +1 -0
  175. package/build/assets/use-save-agent-profile-BUjSsDXK.js +1 -0
  176. package/build/assets/{use-save-settings-CUZW6yXP.js → use-save-settings-DYqkKv7T.js} +1 -1
  177. package/build/assets/{use-settings-C5VhGpqd.js → use-settings-DSXLbvBl.js} +1 -1
  178. package/build/assets/{use-settings-nav-items-DHaUu1Dg.js → use-settings-nav-items-CwRw-CmX.js} +1 -1
  179. package/build/assets/use-tracking-D53y3TH9.js +3 -0
  180. package/build/assets/{use-user-conversation-DT0_QCnL.js → use-user-conversation-B9Gebw_g.js} +1 -1
  181. package/build/assets/{useInfiniteQuery-CgeUQPfs.js → useInfiniteQuery-C926xzY4.js} +1 -1
  182. package/build/assets/{useMutation-DFnzkf6f.js → useMutation-B-qc391N.js} +1 -1
  183. package/build/assets/{useQueries-BhbrGEf1.js → useQueries-DlbhlH9I.js} +1 -1
  184. package/build/assets/{useQuery-BXWbZBZl.js → useQuery-BSTgq1rl.js} +1 -1
  185. package/build/assets/utils-CN5ZfZy1.js +1 -0
  186. package/build/assets/{vendor~conversation-panel~conversation-CTvDDiXg.js → vendor~conversation-panel~conversation-C8Fn4XOf.js} +1 -1
  187. package/build/assets/{vendor~entry.client-BFE7Llz9.js → vendor~entry.client-CoCfUXUF.js} +1 -1
  188. package/build/assets/{vendor~entry.client-BaKt_PIp.js → vendor~entry.client-DA2izTjq.js} +1 -1
  189. package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kepq2zme-ZixYGy6E.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-DqZDXfg2.js} +1 -1
  190. package/build/assets/{vendor~index-home~home~conversation-panel~conversation-BTyukeM-.js → vendor~index-home~home~conversation-panel~conversation-hWywRBaR.js} +1 -1
  191. package/build/assets/{vendor~root-layout-BlUaZ18v.js → vendor~root-layout-C9Ju9DQg.js} +1 -1
  192. package/build/assets/{vendor~root-layout~conversation-panel~conversation-BYAWJwQX.js → vendor~root-layout~conversation-panel~conversation-BMbMgaGu.js} +1 -1
  193. package/build/assets/{vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-CHaLEBVR.js → vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-BWir3rJs.js} +1 -1
  194. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation-j5MFqfSy.js +1 -0
  195. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-cDuKr-WD.js +1 -0
  196. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iw7io29p-Dz-MAyNb.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iyia17eu-Chf7vmKB.js} +1 -1
  197. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-Dtu7BpYk.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~nj1hli3r-DP9wmsjo.js} +2 -2
  198. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-DonTKfQD.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-CUmIwQCN.js} +117 -13
  199. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~jz4f6vo2-BgxDvUcf.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~jz4f6vo2-C7HiY4Ae.js} +42 -3
  200. package/build/assets/{verification-settings-Bj6bo097.js → verification-settings-gw_q6vkL.js} +1 -1
  201. package/build/assets/{wrench-hi7Q13dF.js → wrench-CUEI1krB.js} +1 -1
  202. package/build/assets/{x-DkgltWa0.js → x-DJdhbdmt.js} +1 -1
  203. package/build/index.html +4 -4
  204. package/build/locales/ar/openhands.json +32 -16
  205. package/build/locales/ca/openhands.json +32 -16
  206. package/build/locales/de/openhands.json +32 -16
  207. package/build/locales/en/openhands.json +32 -16
  208. package/build/locales/es/openhands.json +32 -16
  209. package/build/locales/fr/openhands.json +32 -16
  210. package/build/locales/it/openhands.json +32 -16
  211. package/build/locales/ja/openhands.json +32 -16
  212. package/build/locales/ko-KR/openhands.json +32 -16
  213. package/build/locales/no/openhands.json +32 -16
  214. package/build/locales/pt/openhands.json +32 -16
  215. package/build/locales/tr/openhands.json +32 -16
  216. package/build/locales/uk/openhands.json +32 -16
  217. package/build/locales/zh-CN/openhands.json +32 -16
  218. package/build/locales/zh-TW/openhands.json +32 -16
  219. package/config/defaults.json +9 -5
  220. package/dist/api/agent-profiles-service/profile-field-support.d.ts +26 -0
  221. package/dist/api/agent-server-adapter.cjs +3 -3
  222. package/dist/api/agent-server-adapter.cjs.map +1 -1
  223. package/dist/api/agent-server-adapter.js +118 -116
  224. package/dist/api/agent-server-adapter.js.map +1 -1
  225. package/dist/api/agent-server-compatibility.cjs +1 -1
  226. package/dist/api/agent-server-compatibility.cjs.map +1 -1
  227. package/dist/api/agent-server-compatibility.d.ts +21 -0
  228. package/dist/api/agent-server-compatibility.js +52 -38
  229. package/dist/api/agent-server-compatibility.js.map +1 -1
  230. package/dist/api/agent-server-config.cjs +1 -1
  231. package/dist/api/agent-server-config.cjs.map +1 -1
  232. package/dist/api/agent-server-config.d.ts +26 -0
  233. package/dist/api/agent-server-config.js +18 -5
  234. package/dist/api/agent-server-config.js.map +1 -1
  235. package/dist/api/canvas-extensions-service.cjs +1 -0
  236. package/dist/api/canvas-extensions-service.d.ts +22 -0
  237. package/dist/api/canvas-extensions-service.js +4 -0
  238. package/dist/api/cloud/conversation-service.api.cjs +1 -1
  239. package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
  240. package/dist/api/cloud/conversation-service.api.d.ts +6 -0
  241. package/dist/api/cloud/conversation-service.api.js +14 -6
  242. package/dist/api/cloud/conversation-service.api.js.map +1 -1
  243. package/dist/api/conversation-file-upload.api.cjs +1 -1
  244. package/dist/api/conversation-file-upload.api.js +10 -10
  245. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  246. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  247. package/dist/api/conversation-service/agent-server-conversation-service.api.d.ts +11 -0
  248. package/dist/api/conversation-service/agent-server-conversation-service.api.js +129 -118
  249. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  250. package/dist/api/event-service/event-service.api.cjs +1 -1
  251. package/dist/api/event-service/event-service.api.js +12 -12
  252. package/dist/api/git-service/agent-server-git-service.api.cjs +1 -1
  253. package/dist/api/git-service/agent-server-git-service.api.js +8 -8
  254. package/dist/api/runtime-service/agent-server-runtime-service.cjs +1 -1
  255. package/dist/api/runtime-service/agent-server-runtime-service.js +8 -8
  256. package/dist/api/settings-service/settings-service.api.cjs +1 -1
  257. package/dist/api/settings-service/settings-service.api.cjs.map +1 -1
  258. package/dist/api/settings-service/settings-service.api.d.ts +3 -2
  259. package/dist/api/settings-service/settings-service.api.js +2 -1
  260. package/dist/api/settings-service/settings-service.api.js.map +1 -1
  261. package/dist/components/conversation-events/chat/event-message-components/event-group.cjs +1 -1
  262. package/dist/components/conversation-events/chat/event-message-components/event-group.cjs.map +1 -1
  263. package/dist/components/conversation-events/chat/event-message-components/event-group.js +40 -36
  264. package/dist/components/conversation-events/chat/event-message-components/event-group.js.map +1 -1
  265. package/dist/components/features/automations/automation-card.cjs +1 -1
  266. package/dist/components/features/automations/automation-card.cjs.map +1 -1
  267. package/dist/components/features/automations/automation-card.js +114 -104
  268. package/dist/components/features/automations/automation-card.js.map +1 -1
  269. package/dist/components/features/automations/detail/run-phase.cjs +2 -0
  270. package/dist/components/features/automations/detail/run-phase.cjs.map +1 -0
  271. package/dist/components/features/automations/detail/run-phase.d.ts +89 -0
  272. package/dist/components/features/automations/detail/run-phase.js +72 -0
  273. package/dist/components/features/automations/detail/run-phase.js.map +1 -0
  274. package/dist/components/features/backends/backend-form-modal.cjs +1 -1
  275. package/dist/components/features/backends/backend-form-modal.cjs.map +1 -1
  276. package/dist/components/features/backends/backend-form-modal.js +5 -11
  277. package/dist/components/features/backends/backend-form-modal.js.map +1 -1
  278. package/dist/components/features/canvas-extensions/add-canvas-extension-modal.d.ts +6 -0
  279. package/dist/components/features/canvas-extensions/canvas-extension-card.d.ts +9 -0
  280. package/dist/components/features/canvas-extensions/canvas-extensions-runtime.cjs +2 -0
  281. package/dist/components/features/canvas-extensions/canvas-extensions-runtime.cjs.map +1 -0
  282. package/dist/components/features/canvas-extensions/canvas-extensions-runtime.d.ts +23 -0
  283. package/dist/components/features/canvas-extensions/canvas-extensions-runtime.js +19 -0
  284. package/dist/components/features/canvas-extensions/canvas-extensions-runtime.js.map +1 -0
  285. package/dist/components/features/chat/chat-interface.cjs +2 -2
  286. package/dist/components/features/chat/chat-interface.cjs.map +1 -1
  287. package/dist/components/features/chat/chat-interface.js +171 -168
  288. package/dist/components/features/chat/chat-interface.js.map +1 -1
  289. package/dist/components/features/chat/chat-markdown-path-code.cjs +3 -0
  290. package/dist/components/features/chat/chat-markdown-path-code.cjs.map +1 -0
  291. package/dist/components/features/chat/chat-markdown-path-code.d.ts +27 -0
  292. package/dist/components/features/chat/chat-markdown-path-code.js +72 -0
  293. package/dist/components/features/chat/chat-markdown-path-code.js.map +1 -0
  294. package/dist/components/features/chat/path-component.cjs +1 -1
  295. package/dist/components/features/chat/path-component.cjs.map +1 -1
  296. package/dist/components/features/chat/path-component.d.ts +8 -2
  297. package/dist/components/features/chat/path-component.js +33 -21
  298. package/dist/components/features/chat/path-component.js.map +1 -1
  299. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.cjs +1 -1
  300. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.cjs.map +1 -1
  301. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.js +38 -43
  302. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.js.map +1 -1
  303. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.cjs +1 -1
  304. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.cjs.map +1 -1
  305. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.d.ts +8 -5
  306. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.js +22 -16
  307. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.js.map +1 -1
  308. package/dist/components/features/chat/user-message-body.cjs +1 -1
  309. package/dist/components/features/chat/user-message-body.cjs.map +1 -1
  310. package/dist/components/features/chat/user-message-body.d.ts +4 -0
  311. package/dist/components/features/chat/user-message-body.js +30 -24
  312. package/dist/components/features/chat/user-message-body.js.map +1 -1
  313. package/dist/components/features/conversation/conversation-overview-skills-panel.cjs +1 -1
  314. package/dist/components/features/conversation/conversation-overview-skills-panel.cjs.map +1 -1
  315. package/dist/components/features/conversation/conversation-overview-skills-panel.js +63 -81
  316. package/dist/components/features/conversation/conversation-overview-skills-panel.js.map +1 -1
  317. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs +1 -1
  318. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs.map +1 -1
  319. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js +50 -50
  320. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js.map +1 -1
  321. package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.cjs +1 -1
  322. package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.cjs.map +1 -1
  323. package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.d.ts +1 -1
  324. package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.js +3 -3
  325. package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.js.map +1 -1
  326. package/dist/components/features/conversation-panel/skills-modal.cjs +1 -1
  327. package/dist/components/features/conversation-panel/skills-modal.cjs.map +1 -1
  328. package/dist/components/features/conversation-panel/skills-modal.js +29 -28
  329. package/dist/components/features/conversation-panel/skills-modal.js.map +1 -1
  330. package/dist/components/features/files-tab/file-content-viewer.cjs +1 -1
  331. package/dist/components/features/files-tab/file-content-viewer.js +5 -5
  332. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs +1 -1
  333. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs.map +1 -1
  334. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js +51 -29
  335. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js.map +1 -1
  336. package/dist/components/features/onboarding/onboarding-host.d.ts +3 -4
  337. package/dist/components/features/onboarding/steps/setup-llm-step.d.ts +5 -9
  338. package/dist/components/features/settings/acp-auth-status-banner.d.ts +23 -6
  339. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.cjs +1 -1
  340. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.js +1 -0
  341. package/dist/components/features/settings/llm-profiles/provider-connection-modal.cjs +1 -1
  342. package/dist/components/features/settings/llm-profiles/provider-connection-modal.js +3 -0
  343. package/dist/components/features/settings/sdk-settings/field-help.cjs +1 -1
  344. package/dist/components/features/settings/sdk-settings/field-help.cjs.map +1 -1
  345. package/dist/components/features/settings/sdk-settings/field-help.d.ts +1 -1
  346. package/dist/components/features/settings/sdk-settings/field-help.js +1 -1
  347. package/dist/components/features/settings/sdk-settings/field-help.js.map +1 -1
  348. package/dist/components/features/settings/sdk-settings/sdk-section-page.cjs +1 -1
  349. package/dist/components/features/settings/sdk-settings/sdk-section-page.js +6 -6
  350. package/dist/components/features/settings/sdk-settings/sdk-section-page.js.map +1 -1
  351. package/dist/components/features/sidebar/sidebar-nav-link.cjs +1 -1
  352. package/dist/components/features/sidebar/sidebar-nav-link.cjs.map +1 -1
  353. package/dist/components/features/sidebar/sidebar-nav-link.d.ts +10 -1
  354. package/dist/components/features/sidebar/sidebar-nav-link.js +54 -36
  355. package/dist/components/features/sidebar/sidebar-nav-link.js.map +1 -1
  356. package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
  357. package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
  358. package/dist/components/features/sidebar/sidebar-rail-body.js +143 -120
  359. package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
  360. package/dist/components/features/sidebar/sidebar.cjs +1 -1
  361. package/dist/components/features/sidebar/sidebar.cjs.map +1 -1
  362. package/dist/components/features/sidebar/sidebar.js +1 -1
  363. package/dist/components/features/sidebar/sidebar.js.map +1 -1
  364. package/dist/components/features/skills/build-skill-pills.cjs +1 -1
  365. package/dist/components/features/skills/build-skill-pills.cjs.map +1 -1
  366. package/dist/components/features/skills/build-skill-pills.js +60 -52
  367. package/dist/components/features/skills/build-skill-pills.js.map +1 -1
  368. package/dist/components/features/skills/extensions-navigation.cjs +1 -1
  369. package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
  370. package/dist/components/features/skills/extensions-navigation.js +54 -43
  371. package/dist/components/features/skills/extensions-navigation.js.map +1 -1
  372. package/dist/components/features/skills/skill-filter.cjs +1 -1
  373. package/dist/components/features/skills/skill-filter.cjs.map +1 -1
  374. package/dist/components/features/skills/skill-filter.d.ts +8 -3
  375. package/dist/components/features/skills/skill-filter.js +69 -52
  376. package/dist/components/features/skills/skill-filter.js.map +1 -1
  377. package/dist/components/shared/modals/settings/settings-form.cjs +1 -1
  378. package/dist/components/shared/modals/settings/settings-form.js +8 -8
  379. package/dist/config/defaults.cjs +1 -1
  380. package/dist/config/defaults.cjs.map +1 -1
  381. package/dist/config/defaults.js +9 -5
  382. package/dist/config/defaults.js.map +1 -1
  383. package/dist/contexts/conversation-websocket-context.cjs +3 -3
  384. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  385. package/dist/contexts/conversation-websocket-context.js +5 -5
  386. package/dist/extensions/canvas-extension-module-loader.d.ts +11 -0
  387. package/dist/hooks/mutation/use-manage-canvas-extensions.d.ts +12 -0
  388. package/dist/hooks/query/concurrency-limiter.cjs +2 -0
  389. package/dist/hooks/query/concurrency-limiter.cjs.map +1 -0
  390. package/dist/hooks/query/concurrency-limiter.d.ts +22 -0
  391. package/dist/hooks/query/concurrency-limiter.js +29 -0
  392. package/dist/hooks/query/concurrency-limiter.js.map +1 -0
  393. package/dist/hooks/query/query-keys.cjs.map +1 -1
  394. package/dist/hooks/query/query-keys.d.ts +4 -0
  395. package/dist/hooks/query/query-keys.js.map +1 -1
  396. package/dist/hooks/query/use-active-conversation.cjs +1 -1
  397. package/dist/hooks/query/use-active-conversation.js +4 -4
  398. package/dist/hooks/query/use-automations.cjs.map +1 -1
  399. package/dist/hooks/query/use-automations.js.map +1 -1
  400. package/dist/hooks/query/use-backends-health.cjs +1 -1
  401. package/dist/hooks/query/use-backends-health.cjs.map +1 -1
  402. package/dist/hooks/query/use-backends-health.d.ts +1 -1
  403. package/dist/hooks/query/use-backends-health.js +50 -64
  404. package/dist/hooks/query/use-backends-health.js.map +1 -1
  405. package/dist/hooks/query/use-canvas-extensions.cjs +1 -0
  406. package/dist/hooks/query/use-canvas-extensions.d.ts +5 -0
  407. package/dist/hooks/query/use-canvas-extensions.js +3 -0
  408. package/dist/hooks/query/use-commit-changes.cjs +1 -1
  409. package/dist/hooks/query/use-commit-changes.js +4 -4
  410. package/dist/hooks/query/use-latest-automation-runs.cjs +1 -1
  411. package/dist/hooks/query/use-latest-automation-runs.js +1 -0
  412. package/dist/hooks/query/use-paginated-conversations.cjs +1 -1
  413. package/dist/hooks/query/use-paginated-conversations.cjs.map +1 -1
  414. package/dist/hooks/query/use-paginated-conversations.js +19 -16
  415. package/dist/hooks/query/use-paginated-conversations.js.map +1 -1
  416. package/dist/hooks/query/use-search-providers.cjs +1 -1
  417. package/dist/hooks/query/use-search-providers.cjs.map +1 -1
  418. package/dist/hooks/query/use-search-providers.js +17 -10
  419. package/dist/hooks/query/use-search-providers.js.map +1 -1
  420. package/dist/hooks/query/use-unified-get-git-changes.cjs +1 -1
  421. package/dist/hooks/query/use-unified-get-git-changes.js +4 -4
  422. package/dist/hooks/query/use-unified-git-commits.cjs +1 -1
  423. package/dist/hooks/query/use-unified-git-commits.js +4 -4
  424. package/dist/hooks/query/use-unified-git-diff.cjs +1 -1
  425. package/dist/hooks/query/use-unified-git-diff.js +4 -4
  426. package/dist/hooks/query/use-unified-vscode-url.cjs +1 -1
  427. package/dist/hooks/query/use-unified-vscode-url.cjs.map +1 -1
  428. package/dist/hooks/query/use-unified-vscode-url.d.ts +1 -0
  429. package/dist/hooks/query/use-unified-vscode-url.js +40 -26
  430. package/dist/hooks/query/use-unified-vscode-url.js.map +1 -1
  431. package/dist/hooks/query/use-workspace-file-content.cjs +1 -1
  432. package/dist/hooks/query/use-workspace-file-content.js +5 -5
  433. package/dist/hooks/query/use-workspace-files.cjs +1 -1
  434. package/dist/hooks/query/use-workspace-files.js +6 -6
  435. package/dist/hooks/use-acp-credential-form.d.ts +6 -0
  436. package/dist/hooks/use-conversation-overview-git-diff-stats.cjs +1 -1
  437. package/dist/hooks/use-conversation-overview-git-diff-stats.js +4 -4
  438. package/dist/hooks/use-pinned-home-route.cjs +2 -0
  439. package/dist/hooks/use-pinned-home-route.cjs.map +1 -0
  440. package/dist/hooks/use-pinned-home-route.d.ts +33 -0
  441. package/dist/hooks/use-pinned-home-route.js +34 -0
  442. package/dist/hooks/use-pinned-home-route.js.map +1 -0
  443. package/dist/hooks/use-skill-enablement.cjs +2 -0
  444. package/dist/hooks/use-skill-enablement.cjs.map +1 -0
  445. package/dist/hooks/use-skill-enablement.d.ts +14 -0
  446. package/dist/hooks/use-skill-enablement.js +80 -0
  447. package/dist/hooks/use-skill-enablement.js.map +1 -0
  448. package/dist/i18n/declaration.cjs +1 -1
  449. package/dist/i18n/declaration.cjs.map +1 -1
  450. package/dist/i18n/declaration.d.ts +29 -13
  451. package/dist/i18n/declaration.js +1 -1
  452. package/dist/i18n/declaration.js.map +1 -1
  453. package/dist/i18n/translation.cjs +3 -3
  454. package/dist/i18n/translation.cjs.map +1 -1
  455. package/dist/i18n/translation.js +538 -266
  456. package/dist/i18n/translation.js.map +1 -1
  457. package/dist/index.cjs +1 -1
  458. package/dist/index.js +15 -14
  459. package/dist/lib/index.cjs +1 -1
  460. package/dist/lib/index.d.ts +1 -0
  461. package/dist/lib/index.js +1 -0
  462. package/dist/locales/ar/openhands.json +32 -16
  463. package/dist/locales/ca/openhands.json +32 -16
  464. package/dist/locales/de/openhands.json +32 -16
  465. package/dist/locales/en/openhands.json +32 -16
  466. package/dist/locales/es/openhands.json +32 -16
  467. package/dist/locales/fr/openhands.json +32 -16
  468. package/dist/locales/it/openhands.json +32 -16
  469. package/dist/locales/ja/openhands.json +32 -16
  470. package/dist/locales/ko-KR/openhands.json +32 -16
  471. package/dist/locales/no/openhands.json +32 -16
  472. package/dist/locales/pt/openhands.json +32 -16
  473. package/dist/locales/tr/openhands.json +32 -16
  474. package/dist/locales/uk/openhands.json +32 -16
  475. package/dist/locales/zh-CN/openhands.json +32 -16
  476. package/dist/locales/zh-TW/openhands.json +32 -16
  477. package/dist/manifests/automation-interface.cjs +1 -1
  478. package/dist/manifests/automation-interface.cjs.map +1 -1
  479. package/dist/manifests/automation-interface.d.ts +6 -0
  480. package/dist/manifests/automation-interface.js +11 -8
  481. package/dist/manifests/automation-interface.js.map +1 -1
  482. package/dist/node_modules/@openhands/extensions/automations/bundle-index.cjs +45 -4
  483. package/dist/node_modules/@openhands/extensions/automations/bundle-index.cjs.map +1 -1
  484. package/dist/node_modules/@openhands/extensions/automations/bundle-index.js +1 -1
  485. package/dist/node_modules/@openhands/extensions/automations/bundle-index.js.map +1 -1
  486. package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.cjs +1 -1
  487. package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.cjs.map +1 -1
  488. package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.js +5 -0
  489. package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.js.map +1 -1
  490. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs +1 -1
  491. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs.map +1 -1
  492. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js +5 -0
  493. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js.map +1 -1
  494. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs +1 -1
  495. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs.map +1 -1
  496. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js +5 -0
  497. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js.map +1 -1
  498. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.cjs +1 -1
  499. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.cjs.map +1 -1
  500. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.js +5 -0
  501. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.js.map +1 -1
  502. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-bitbucket-pr/manifest.cjs +9 -0
  503. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-bitbucket-pr/manifest.cjs.map +1 -0
  504. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-bitbucket-pr/manifest.js +21 -0
  505. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-bitbucket-pr/manifest.js.map +1 -0
  506. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-gitlab-mr/manifest.cjs +9 -0
  507. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-gitlab-mr/manifest.cjs.map +1 -0
  508. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-gitlab-mr/manifest.js +21 -0
  509. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-gitlab-mr/manifest.js.map +1 -0
  510. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-bitbucket-pr/manifest.cjs +9 -0
  511. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-bitbucket-pr/manifest.cjs.map +1 -0
  512. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-bitbucket-pr/manifest.js +21 -0
  513. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-bitbucket-pr/manifest.js.map +1 -0
  514. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-github-pr/manifest.cjs +9 -0
  515. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-github-pr/manifest.cjs.map +1 -0
  516. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-github-pr/manifest.js +21 -0
  517. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-github-pr/manifest.js.map +1 -0
  518. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-gitlab-mr/manifest.cjs +9 -0
  519. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-gitlab-mr/manifest.cjs.map +1 -0
  520. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-gitlab-mr/manifest.js +21 -0
  521. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-gitlab-mr/manifest.js.map +1 -0
  522. package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.cjs +1 -1
  523. package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.cjs.map +1 -1
  524. package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.js +5 -0
  525. package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.js.map +1 -1
  526. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.cjs +30 -0
  527. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.cjs.map +1 -0
  528. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.js +65 -0
  529. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.js.map +1 -0
  530. package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs +1 -1
  531. package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs.map +1 -1
  532. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js +21 -9
  533. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js.map +1 -1
  534. package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.cjs +1 -1
  535. package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.cjs.map +1 -1
  536. package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.js +2 -2
  537. package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.js.map +1 -1
  538. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs +2 -0
  539. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs.map +1 -0
  540. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js +40 -0
  541. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js.map +1 -0
  542. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.cjs +1 -1
  543. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.cjs.map +1 -1
  544. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.js +1 -1
  545. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.js.map +1 -1
  546. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs +1 -1
  547. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs.map +1 -1
  548. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js +74 -72
  549. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js.map +1 -1
  550. package/dist/node_modules/@openhands/extensions/skills/index.cjs +42 -3
  551. package/dist/node_modules/@openhands/extensions/skills/index.cjs.map +1 -1
  552. package/dist/node_modules/@openhands/extensions/skills/index.js +22 -3
  553. package/dist/node_modules/@openhands/extensions/skills/index.js.map +1 -1
  554. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-conversation.cjs +1 -1
  555. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-conversation.js +1 -1
  556. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.cjs +1 -1
  557. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.cjs.map +1 -1
  558. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.js +8 -7
  559. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.js.map +1 -1
  560. package/dist/node_modules/@openhands/typescript-client/dist/index.cjs +1 -1
  561. package/dist/node_modules/@openhands/typescript-client/dist/index.js +2 -2
  562. package/dist/node_modules/lucide-react/dist/esm/icons/blocks.cjs +2 -0
  563. package/dist/node_modules/lucide-react/dist/esm/icons/blocks.cjs.map +1 -0
  564. package/dist/node_modules/lucide-react/dist/esm/icons/blocks.js +16 -0
  565. package/dist/node_modules/lucide-react/dist/esm/icons/blocks.js.map +1 -0
  566. package/dist/node_modules/lucide-react/dist/esm/icons/panels-top-left.cjs +2 -0
  567. package/dist/node_modules/lucide-react/dist/esm/icons/panels-top-left.cjs.map +1 -0
  568. package/dist/node_modules/lucide-react/dist/esm/icons/panels-top-left.js +23 -0
  569. package/dist/node_modules/lucide-react/dist/esm/icons/panels-top-left.js.map +1 -0
  570. package/dist/package.cjs +1 -1
  571. package/dist/package.cjs.map +1 -1
  572. package/dist/package.js +3 -3
  573. package/dist/package.js.map +1 -1
  574. package/dist/routes/agent-settings.d.ts +10 -0
  575. package/dist/routes/app-settings.cjs +1 -1
  576. package/dist/routes/app-settings.cjs.map +1 -1
  577. package/dist/routes/app-settings.js +7 -7
  578. package/dist/routes/files-tab.cjs +1 -1
  579. package/dist/routes/files-tab.cjs.map +1 -1
  580. package/dist/routes/files-tab.js +14 -14
  581. package/dist/routes/files-tab.js.map +1 -1
  582. package/dist/routes/llm-settings.cjs +1 -1
  583. package/dist/routes/llm-settings.cjs.map +1 -1
  584. package/dist/routes/llm-settings.js +122 -114
  585. package/dist/routes/llm-settings.js.map +1 -1
  586. package/dist/services/canvas-ui.cjs +1 -1
  587. package/dist/services/canvas-ui.cjs.map +1 -1
  588. package/dist/services/canvas-ui.d.ts +5 -0
  589. package/dist/services/canvas-ui.js +24 -10
  590. package/dist/services/canvas-ui.js.map +1 -1
  591. package/dist/services/settings.cjs +1 -1
  592. package/dist/services/settings.cjs.map +1 -1
  593. package/dist/services/settings.js +3 -2
  594. package/dist/services/settings.js.map +1 -1
  595. package/dist/types/automation.cjs.map +1 -1
  596. package/dist/types/automation.d.ts +20 -0
  597. package/dist/types/automation.js.map +1 -1
  598. package/dist/types/canvas-extension.cjs +2 -0
  599. package/dist/types/canvas-extension.cjs.map +1 -0
  600. package/dist/types/canvas-extension.d.ts +77 -0
  601. package/dist/types/canvas-extension.js +6 -0
  602. package/dist/types/canvas-extension.js.map +1 -0
  603. package/dist/types/settings.d.ts +7 -0
  604. package/dist/ui/help-link.cjs +1 -1
  605. package/dist/ui/help-link.cjs.map +1 -1
  606. package/dist/ui/help-link.d.ts +6 -1
  607. package/dist/ui/help-link.js +32 -18
  608. package/dist/ui/help-link.js.map +1 -1
  609. package/dist/utils/acp-auth-display.d.ts +35 -0
  610. package/dist/utils/cache-utils.cjs +1 -1
  611. package/dist/utils/cache-utils.js +5 -5
  612. package/dist/utils/format-model-name.cjs +1 -1
  613. package/dist/utils/format-model-name.cjs.map +1 -1
  614. package/dist/utils/format-model-name.d.ts +7 -3
  615. package/dist/utils/format-model-name.js +6 -11
  616. package/dist/utils/format-model-name.js.map +1 -1
  617. package/dist/utils/format-relative-time.cjs +1 -1
  618. package/dist/utils/format-relative-time.cjs.map +1 -1
  619. package/dist/utils/format-relative-time.d.ts +7 -0
  620. package/dist/utils/format-relative-time.js +7 -2
  621. package/dist/utils/format-relative-time.js.map +1 -1
  622. package/dist/utils/path-utils.cjs +1 -1
  623. package/dist/utils/path-utils.cjs.map +1 -1
  624. package/dist/utils/path-utils.d.ts +15 -3
  625. package/dist/utils/path-utils.js +29 -3
  626. package/dist/utils/path-utils.js.map +1 -1
  627. package/dist/utils/skill-enablement.cjs +2 -0
  628. package/dist/utils/skill-enablement.cjs.map +1 -0
  629. package/dist/utils/skill-enablement.d.ts +51 -0
  630. package/dist/utils/skill-enablement.js +31 -0
  631. package/dist/utils/skill-enablement.js.map +1 -0
  632. package/dist/utils/vscode-origin.cjs +2 -0
  633. package/dist/utils/vscode-origin.cjs.map +1 -0
  634. package/dist/utils/vscode-origin.d.ts +55 -0
  635. package/dist/utils/vscode-origin.js +27 -0
  636. package/dist/utils/vscode-origin.js.map +1 -0
  637. package/dist/utils/workspace-mode.d.ts +4 -0
  638. package/package.json +3 -3
  639. package/scripts/check-sdk-version-sync.mjs +6 -6
  640. package/scripts/check-translation-completeness.cjs +1 -0
  641. package/scripts/dev-extra-backend.mjs +28 -9
  642. package/scripts/dev-safe.mjs +81 -8
  643. package/scripts/dev-static.mjs +35 -37
  644. package/scripts/dev-with-automation.mjs +82 -1
  645. package/scripts/ingress.mjs +27 -1
  646. package/scripts/static-server.mjs +74 -1
  647. package/tools/canvas_ui_tool.py +19 -0
  648. package/build/assets/active-backend-context-DKFSMbn3.js +0 -2
  649. package/build/assets/agent-server-conversation-service.api-DozDKIW_.js +0 -86
  650. package/build/assets/agent-settings-351vXWc9.js +0 -2
  651. package/build/assets/agent-settings-Ce7BDZ6I.js +0 -1
  652. package/build/assets/alert-banner-Kyy1YWZU.js +0 -1
  653. package/build/assets/api-key-entry-screen-INIxqAMs.js +0 -1
  654. package/build/assets/automation-detail-DXDhUwPq.js +0 -3
  655. package/build/assets/automation-setup-route-FRr05f_g.js +0 -1
  656. package/build/assets/automations-list-CERuQWE6.js +0 -1
  657. package/build/assets/backend-form-modal-DK78-jn1.js +0 -1
  658. package/build/assets/browser-11etCQ04.js +0 -7
  659. package/build/assets/check-Cf2YoT90.js +0 -1
  660. package/build/assets/chevron-down-C3OQ-ehx.js +0 -1
  661. package/build/assets/chevron-right-CN1uUiJ1.js +0 -1
  662. package/build/assets/circle-check-g5yeGMd-.js +0 -1
  663. package/build/assets/command-menu-BZQ8S3Ke.js +0 -1
  664. package/build/assets/conversation-CchMzpGl.js +0 -1
  665. package/build/assets/conversation-Dpzftz57.js +0 -93
  666. package/build/assets/conversation-panel-CchMzpGl.js +0 -1
  667. package/build/assets/conversation-state-store-a9d2fxRc.js +0 -1
  668. package/build/assets/empty-state-CvaVahVr.js +0 -1
  669. package/build/assets/extensions-hub-CFduxBnk.js +0 -1
  670. package/build/assets/extensions-navigation-BeC224yX.js +0 -1
  671. package/build/assets/files-tab-CL3J9b3p.js +0 -1
  672. package/build/assets/format-model-name-BNPKVsIq.js +0 -1
  673. package/build/assets/get-git-path-DlAJa_i6.js +0 -1
  674. package/build/assets/git-repo-dropdown-DGMEhz7d.js +0 -1
  675. package/build/assets/home-BCGlNJCA.js +0 -1
  676. package/build/assets/home-DB1pRqTC.js +0 -1
  677. package/build/assets/home-automation-run-tooltip-CooFQRIG.js +0 -1
  678. package/build/assets/home-store-Dl1dPE58.js +0 -1
  679. package/build/assets/index-home-DB1pRqTC.js +0 -1
  680. package/build/assets/info-uYSVzX86.js +0 -1
  681. package/build/assets/install-server-modal-BbJdhzet.js +0 -1
  682. package/build/assets/kebab-menu-item-content-BYokkRHi.js +0 -1
  683. package/build/assets/list-filter-OFkpRrmi.js +0 -1
  684. package/build/assets/llm-not-configured-banner-BqqYnJ1t.js +0 -27
  685. package/build/assets/llm-settings-CnDbbmVW.js +0 -1
  686. package/build/assets/llm-settings-S8Yjg__1.js +0 -1
  687. package/build/assets/llm-subscription-service-BpPfzW4x.js +0 -1
  688. package/build/assets/loader-circle-nvrwthvj.js +0 -1
  689. package/build/assets/manage-backends-modal-BCUPswyl.js +0 -1
  690. package/build/assets/manifest-58597dde.js +0 -1
  691. package/build/assets/markdown-renderer-Cb2sBWtV.js +0 -8
  692. package/build/assets/messages-BTN5thLe.js +0 -40
  693. package/build/assets/onboarding-Cx_kaiD1.js +0 -1
  694. package/build/assets/onboarding-modal-vMwn7ihv.js +0 -1
  695. package/build/assets/plugins-management-service-BjYeF0b0.js +0 -1
  696. package/build/assets/plus-CEKne-Yp.js +0 -1
  697. package/build/assets/profiles-service.api-QB-T_u-g.js +0 -1
  698. package/build/assets/providers-FfSZ5TXP.js +0 -1
  699. package/build/assets/proxy-tcFL2yTQ.js +0 -1
  700. package/build/assets/recommended-automations-launcher-Bw8uC4V6.js +0 -1
  701. package/build/assets/root-BLeQfBEq.css +0 -1
  702. package/build/assets/root-ZKKYPR1Z.js +0 -2
  703. package/build/assets/root-layout-luJoE9IG.js +0 -2
  704. package/build/assets/schema-field-Csw5fhtN.js +0 -1
  705. package/build/assets/secrets-service-BTor9uAU.js +0 -1
  706. package/build/assets/settings-DcNPxz0v.js +0 -1
  707. package/build/assets/settings-service.api-B2agVfjL.js +0 -1
  708. package/build/assets/shared-conversation-B55pCyBG.js +0 -1
  709. package/build/assets/sidebar-nav-link-CPzhyHQg.js +0 -1
  710. package/build/assets/sidebar-store-DtpU7zaI.js +0 -1
  711. package/build/assets/skill-filter-CWZ5kjcg.js +0 -2
  712. package/build/assets/skill-scope-CV1dkAbW.js +0 -1
  713. package/build/assets/skills-plugins-DGHULTq6.js +0 -1
  714. package/build/assets/skills-settings-CM1lFv3e.js +0 -1
  715. package/build/assets/usage-tab-BcfWV6db.js +0 -1
  716. package/build/assets/use-acp-credential-form-BsSW5NHG.js +0 -1
  717. package/build/assets/use-agent-profiles-DWBPC0Si.js +0 -1
  718. package/build/assets/use-config-Bft35DOK.js +0 -1
  719. package/build/assets/use-create-secret-BSxJMxHp.js +0 -1
  720. package/build/assets/use-is-authed-CFGkY3-Z.js +0 -1
  721. package/build/assets/use-llm-configured-BI6obxsc.js +0 -1
  722. package/build/assets/use-llm-profiles-djGAhTWL.js +0 -1
  723. package/build/assets/use-manifest-capabilities-3z0-1G59.js +0 -1
  724. package/build/assets/use-onboarding-completion-BXpyUSsJ.js +0 -1
  725. package/build/assets/use-plugins-marketplace-DI4_pK56.js +0 -1
  726. package/build/assets/use-save-agent-profile-DdBSTdpN.js +0 -1
  727. package/build/assets/use-tracking-D5t9otIF.js +0 -3
  728. package/build/assets/utils-DaCIEEQP.js +0 -1
  729. package/build/assets/vendor~index-home~home~conversation-panel~conversation~alert-banner-B3qC_oj8.js +0 -1
  730. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-B2OLKL7N.js +0 -1
  731. package/dist/components/features/tips/random-tip.d.ts +0 -2
  732. package/dist/utils/tips.d.ts +0 -7
  733. package/dist/utils/workspace-relative-path.cjs +0 -2
  734. package/dist/utils/workspace-relative-path.cjs.map +0 -1
  735. package/dist/utils/workspace-relative-path.d.ts +0 -10
  736. package/dist/utils/workspace-relative-path.js +0 -22
  737. package/dist/utils/workspace-relative-path.js.map +0 -1
  738. /package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew3u153i-rfV8mQ9m.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-rfV8mQ9m.js} +0 -0
  739. /package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ox0jfsa0-cHFhpUBq.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~i58xkef6-cHFhpUBq.js} +0 -0
@@ -1,4 +1,4 @@
1
- import{t as e}from"./rolldown-runtime-Cyuzqnbw.js";import{C as t,S as n,y as r}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kepq2zme-ZixYGy6E.js";var i=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{i()}catch{}var a=class{constructor(e,t){this.cachedEvents=[],this.cachedEventIds=new Set,this.client=e instanceof n?e:new n(e),this.conversationId=t}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 t&&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}},o=`__full_state__`,s=class e{constructor(e,t){this.cachedState=null,this.cachedAt=0,this.lock=new c,this.client=e,this.conversationId=t,this._events=new a(e,t)}async getConversationInfo(){return await this.lock.acquire(async()=>{if(this.cachedState!==null&&Date.now()-this.cachedAt<e.CACHE_TTL_MS)return this.normalizeFullState(this.cachedState);let t=await this.client.get(`/api/conversations/${this.conversationId}`),n=this.normalizeFullState(t.data);return this.cachedState=n,this.cachedAt=Date.now(),n})}normalizeFullState(e){return e.full_state??e}async refresh(){return this.cachedState=null,this.getConversationInfo()}async updateStateFromEvent(e){await this.lock.acquire(async()=>{if(e.key===o){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}async getExecutionStatus(){let e=await this.getConversationInfo(),t=e.execution_status??e.agent_status;if(t==null)throw Error(`execution_status missing in conversation info: ${JSON.stringify(e)}`);return t}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=e.confirmation_policy;if(t==null)throw Error(`confirmation_policy missing in conversation info: ${JSON.stringify(e)}`);return t}async getActivatedKnowledgeSkills(){return(await this.getConversationInfo()).activated_knowledge_skills||[]}async getAgent(){let e=await this.getConversationInfo(),t=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=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=e.persistence_dir;if(t==null)throw Error(`persistence_dir missing in conversation info: ${JSON.stringify(e)}`);return t}async modelDump(){return await this.getConversationInfo()}async modelDumpJson(){let e=await this.modelDump();return JSON.stringify(e)}};s.CACHE_TTL_MS=2e3;var c=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())})}},l=class{constructor(e){this.host=e.host.replace(/\/$/,``),this.workingDir=e.workingDir,this.apiKey=e.apiKey,this.client=new n({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()}},u={execute_command:`Execute a bash command in the terminal within a persistent shell session.
1
+ import{t as e}from"./rolldown-runtime-Cyuzqnbw.js";import{C as t,S as n,y as r}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-DqZDXfg2.js";var i=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{i()}catch{}var a=class{constructor(e,t){this.cachedEvents=[],this.cachedEventIds=new Set,this.client=e instanceof n?e:new n(e),this.conversationId=t}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 t&&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}},o=`__full_state__`,s=e=>typeof e==`object`&&!!e&&!Array.isArray(e),c=class e{constructor(e,t){this.cachedState=null,this.cachedAt=0,this.lock=new l,this.client=e,this.conversationId=t,this._events=new a(e,t)}async getConversationInfo(){return await this.lock.acquire(async()=>{if(this.cachedState!==null&&Date.now()-this.cachedAt<e.CACHE_TTL_MS)return this.normalizeFullState(this.cachedState);let t=await this.client.get(`/api/conversations/${this.conversationId}`),n=this.normalizeFullState(t.data);return this.cachedState=n,this.cachedAt=Date.now(),n})}normalizeFullState(e){return e.full_state??e}async refresh(){return this.cachedState=null,this.getConversationInfo()}async updateStateFromEvent(e){await this.lock.acquire(async()=>{if(e.key===o){this.cachedState===null&&(this.cachedState={});let t=s(e.value)&&s(e.value.full_state)?e.value.full_state:e.value;if(!s(t))throw Error(`Full conversation state update must contain an object 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}async getExecutionStatus(){let e=await this.getConversationInfo(),t=e.execution_status??e.agent_status;if(t==null)throw Error(`execution_status missing in conversation info: ${JSON.stringify(e)}`);return t}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=e.confirmation_policy;if(t==null)throw Error(`confirmation_policy missing in conversation info: ${JSON.stringify(e)}`);return t}async getActivatedKnowledgeSkills(){return(await this.getConversationInfo()).activated_knowledge_skills||[]}async getAgent(){let e=await this.getConversationInfo(),t=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=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=e.persistence_dir;if(t==null)throw Error(`persistence_dir missing in conversation info: ${JSON.stringify(e)}`);return t}async modelDump(){return await this.getConversationInfo()}async modelDumpJson(){let e=await this.modelDump();return JSON.stringify(e)}};c.CACHE_TTL_MS=2e3;var l=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())})}},u=class{constructor(e){this.host=e.host.replace(/\/$/,``),this.workingDir=e.workingDir,this.apiKey=e.apiKey,this.client=new n({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()}},d={execute_command:`Execute a bash command in the terminal within a persistent shell session.
2
2
 
3
3
  ### Command Execution
4
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.
@@ -45,4 +45,4 @@ The message should include:
45
45
  - A clear summary of actions taken and their results
46
46
  - Any next steps for the user
47
47
  - Explanation if you're unable to complete the task
48
- - Any follow-up questions if more information is needed`};u.execute_command,u.read_file,u.write_file,u.think,u.finish;var d;(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`})(d||={});var f;(function(e){e.COMMAND=`command`,e.PROMPT=`prompt`})(f||={});var p;if((function(e){e.ALLOW=`allow`,e.DENY=`deny`})(p||={}),new Set(`|.*+?[]()^$\\`.split(``)),typeof window<`u`&&window.WebSocket)window.WebSocket;else try{i()}catch{}var m;(function(e){e.TIMESTAMP=`TIMESTAMP`,e.TIMESTAMP_DESC=`TIMESTAMP_DESC`})(m||={}),(function(e){e.REVERSE_TIMESTAMP=`TIMESTAMP_DESC`})(m||={});var h;(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`})(h||={});var g;(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`})(g||={});var _={"claude-code":{key:`claude-code`,display_name:`Claude Code`,default_command:[`npx`,`-y`,`@agentclientprotocol/claude-agent-acp@0.63.0`],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:!0,session_meta_key:`claudeCode`,available_models:[{id:`default`,label:`Default (recommended)`},{id:`opus[1m]`,label:`Claude Opus (1M)`},{id:`claude-opus-5`,label:`Claude Opus 5`},{id:`sonnet`,label:`Claude Sonnet`},{id:`haiku`,label:`Claude Haiku`}],default_model:`opus[1m]`,supports_runtime_model_switch:!0,file_secrets:[],binary_name:`claude-agent-acp`,data_dir_env_var:`CLAUDE_CONFIG_DIR`},codex:{key:`codex`,display_name:`Codex`,default_command:[`npx`,`-y`,`@agentclientprotocol/codex-acp@1.1.7`],api_key_env_var:`OPENAI_API_KEY`,base_url_env_var:`OPENAI_BASE_URL`,default_session_mode:`agent-full-access`,agent_name_patterns:[`codex-acp`],supports_set_session_model:!0,session_meta_key:null,available_models:[{id:`gpt-5.6`,label:`GPT-5.6`},{id:`gpt-5.6-sol`,label:`GPT-5.6 Sol`},{id:`gpt-5.6-terra`,label:`GPT-5.6 Terra`},{id:`gpt-5.6-luna`,label:`GPT-5.6 Luna`},{id:`gpt-5.5`,label:`GPT-5.5`},{id:`gpt-5.4`,label:`GPT-5.4`},{id:`gpt-5.4-mini`,label:`GPT-5.4 Mini`}],default_model:`gpt-5.5`,supports_runtime_model_switch:!0,file_secrets:[{secret_name:`CODEX_AUTH_JSON`,filename:`auth.json`,env_var:`CODEX_HOME`,subdir:`codex`,env_points_to:`dir`,warn_if_unset:[]}],binary_name:`codex-acp`,data_dir_env_var:`CODEX_HOME`},"gemini-cli":{key:`gemini-cli`,display_name:`Gemini CLI`,default_command:[`npx`,`-y`,`@google/gemini-cli@0.46.0`,`--acp`],api_key_env_var:`GEMINI_API_KEY`,base_url_env_var:`GEMINI_BASE_URL`,default_session_mode:`default`,agent_name_patterns:[`gemini-cli`],supports_set_session_model:!0,session_meta_key:null,available_models:[{id:`auto`,label:`Auto`},{id:`gemini-3.1-pro-preview`,label:`Gemini 3.1 Pro (preview)`},{id:`gemini-3-pro-preview`,label:`Gemini 3 Pro (preview)`},{id:`gemini-3-flash-preview`,label:`Gemini 3 Flash (preview)`},{id:`gemini-3.1-flash-lite`,label:`Gemini 3.1 Flash Lite`},{id:`gemini-2.5-pro`,label:`Gemini 2.5 Pro`},{id:`gemini-2.5-flash`,label:`Gemini 2.5 Flash`}],default_model:`auto`,supports_runtime_model_switch:!0,file_secrets:[{secret_name:`GOOGLE_APPLICATION_CREDENTIALS_JSON`,filename:`gcloud-credentials.json`,env_var:`GOOGLE_APPLICATION_CREDENTIALS`,subdir:`gemini-cli`,env_points_to:`file`,warn_if_unset:[`GOOGLE_CLOUD_PROJECT`,`GOOGLE_CLOUD_LOCATION`]}],binary_name:`gemini`,data_dir_env_var:`HOME`}};function v(e){return e?_[e]??null:null}var y=[`acp_command`,`acp_args`,`acp_env`,`acp_model`,`acp_session_mode`,`acp_prompt_timeout`,`acp_server`];export{a,l as i,v as n,g as r,y as t};
48
+ - Any follow-up questions if more information is needed`};d.execute_command,d.read_file,d.write_file,d.think,d.finish;var f;(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`})(f||={});var p;(function(e){e.COMMAND=`command`,e.PROMPT=`prompt`})(p||={});var m;if((function(e){e.ALLOW=`allow`,e.DENY=`deny`})(m||={}),new Set(`|.*+?[]()^$\\`.split(``)),typeof window<`u`&&window.WebSocket)window.WebSocket;else try{i()}catch{}var h;(function(e){e.TIMESTAMP=`TIMESTAMP`,e.TIMESTAMP_DESC=`TIMESTAMP_DESC`})(h||={}),(function(e){e.REVERSE_TIMESTAMP=`TIMESTAMP_DESC`})(h||={});var g;(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`})(g||={});var _;(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`})(_||={});var v={"claude-code":{key:`claude-code`,display_name:`Claude Code`,default_command:[`npx`,`-y`,`@agentclientprotocol/claude-agent-acp@0.63.0`],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:!0,session_meta_key:`claudeCode`,available_models:[{id:`default`,label:`Default (recommended)`},{id:`opus[1m]`,label:`Claude Opus (1M)`},{id:`claude-opus-5`,label:`Claude Opus 5`},{id:`sonnet`,label:`Claude Sonnet`},{id:`haiku`,label:`Claude Haiku`}],default_model:`opus[1m]`,supports_runtime_model_switch:!0,file_secrets:[],binary_name:`claude-agent-acp`,data_dir_env_var:`CLAUDE_CONFIG_DIR`},codex:{key:`codex`,display_name:`Codex`,default_command:[`npx`,`-y`,`@agentclientprotocol/codex-acp@1.1.7`],api_key_env_var:`OPENAI_API_KEY`,base_url_env_var:`OPENAI_BASE_URL`,default_session_mode:`agent-full-access`,agent_name_patterns:[`codex-acp`],supports_set_session_model:!0,session_meta_key:null,available_models:[{id:`gpt-5.6`,label:`GPT-5.6`},{id:`gpt-5.6-sol`,label:`GPT-5.6 Sol`},{id:`gpt-5.6-terra`,label:`GPT-5.6 Terra`},{id:`gpt-5.6-luna`,label:`GPT-5.6 Luna`},{id:`gpt-5.5`,label:`GPT-5.5`},{id:`gpt-5.4`,label:`GPT-5.4`},{id:`gpt-5.4-mini`,label:`GPT-5.4 Mini`}],default_model:`gpt-5.5`,supports_runtime_model_switch:!0,file_secrets:[{secret_name:`CODEX_AUTH_JSON`,filename:`auth.json`,env_var:`CODEX_HOME`,subdir:`codex`,env_points_to:`dir`,warn_if_unset:[]}],binary_name:`codex-acp`,data_dir_env_var:`CODEX_HOME`},"gemini-cli":{key:`gemini-cli`,display_name:`Gemini CLI`,default_command:[`npx`,`-y`,`@google/gemini-cli@0.46.0`,`--acp`],api_key_env_var:`GEMINI_API_KEY`,base_url_env_var:`GEMINI_BASE_URL`,default_session_mode:`default`,agent_name_patterns:[`gemini-cli`],supports_set_session_model:!0,session_meta_key:null,available_models:[{id:`auto`,label:`Auto`},{id:`gemini-3.1-pro-preview`,label:`Gemini 3.1 Pro (preview)`},{id:`gemini-3-pro-preview`,label:`Gemini 3 Pro (preview)`},{id:`gemini-3-flash-preview`,label:`Gemini 3 Flash (preview)`},{id:`gemini-3.1-flash-lite`,label:`Gemini 3.1 Flash Lite`},{id:`gemini-2.5-pro`,label:`Gemini 2.5 Pro`},{id:`gemini-2.5-flash`,label:`Gemini 2.5 Flash`}],default_model:`auto`,supports_runtime_model_switch:!0,file_secrets:[{secret_name:`GOOGLE_APPLICATION_CREDENTIALS_JSON`,filename:`gcloud-credentials.json`,env_var:`GOOGLE_APPLICATION_CREDENTIALS`,subdir:`gemini-cli`,env_points_to:`file`,warn_if_unset:[`GOOGLE_CLOUD_PROJECT`,`GOOGLE_CLOUD_LOCATION`]}],binary_name:`gemini`,data_dir_env_var:`HOME`}};function y(e){return e?v[e]??null:null}var b=[`acp_command`,`acp_args`,`acp_env`,`acp_model`,`acp_session_mode`,`acp_prompt_timeout`,`acp_server`];export{a,u as i,y as n,_ as r,b as t};
@@ -1,4 +1,4 @@
1
- import{r as e}from"./rolldown-runtime-Cyuzqnbw.js";import{D as t}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kepq2zme-ZixYGy6E.js";var n=t(`activity`,[[`path`,{d:`M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2`,key:`169zse`}]]),r=t(`circle-alert`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`line`,{x1:`12`,x2:`12`,y1:`8`,y2:`12`,key:`1pkeuh`}],[`line`,{x1:`12`,x2:`12.01`,y1:`16`,y2:`16`,key:`4dfq90`}]]),i=t(`layout-dashboard`,[[`rect`,{width:`7`,height:`9`,x:`3`,y:`3`,rx:`1`,key:`10lvy0`}],[`rect`,{width:`7`,height:`5`,x:`14`,y:`3`,rx:`1`,key:`16une8`}],[`rect`,{width:`7`,height:`9`,x:`14`,y:`12`,rx:`1`,key:`1hutg5`}],[`rect`,{width:`7`,height:`5`,x:`3`,y:`16`,rx:`1`,key:`ldoo1y`}]]),a=t(`library`,[[`path`,{d:`m16 6 4 14`,key:`ji33uf`}],[`path`,{d:`M12 6v14`,key:`1n7gus`}],[`path`,{d:`M8 8v12`,key:`1gg7y9`}],[`path`,{d:`M4 4v16`,key:`6qkkli`}]]),o=t(`sparkles`,[[`path`,{d:`M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z`,key:`1s2grr`}],[`path`,{d:`M20 2v4`,key:`1rf3ol`}],[`path`,{d:`M22 4h-4`,key:`gwowj6`}],[`circle`,{cx:`4`,cy:`20`,r:`2`,key:`6kqj1y`}]]),s=t(`timer`,[[`line`,{x1:`10`,x2:`14`,y1:`2`,y2:`2`,key:`14vaq8`}],[`line`,{x1:`12`,x2:`15`,y1:`14`,y2:`11`,key:`17fdiu`}],[`circle`,{cx:`12`,cy:`14`,r:`8`,key:`1e1u0o`}]]),c={"github-pr-reviewer":{"main.py":`"""
1
+ import{r as e}from"./rolldown-runtime-Cyuzqnbw.js";import{D as t}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-DqZDXfg2.js";var n=t(`activity`,[[`path`,{d:`M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2`,key:`169zse`}]]),r=t(`circle-alert`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`line`,{x1:`12`,x2:`12`,y1:`8`,y2:`12`,key:`1pkeuh`}],[`line`,{x1:`12`,x2:`12.01`,y1:`16`,y2:`16`,key:`4dfq90`}]]),i=t(`layout-dashboard`,[[`rect`,{width:`7`,height:`9`,x:`3`,y:`3`,rx:`1`,key:`10lvy0`}],[`rect`,{width:`7`,height:`5`,x:`14`,y:`3`,rx:`1`,key:`16une8`}],[`rect`,{width:`7`,height:`9`,x:`14`,y:`12`,rx:`1`,key:`1hutg5`}],[`rect`,{width:`7`,height:`5`,x:`3`,y:`16`,rx:`1`,key:`ldoo1y`}]]),a=t(`library`,[[`path`,{d:`m16 6 4 14`,key:`ji33uf`}],[`path`,{d:`M12 6v14`,key:`1n7gus`}],[`path`,{d:`M8 8v12`,key:`1gg7y9`}],[`path`,{d:`M4 4v16`,key:`6qkkli`}]]),o=t(`sparkles`,[[`path`,{d:`M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z`,key:`1s2grr`}],[`path`,{d:`M20 2v4`,key:`1rf3ol`}],[`path`,{d:`M22 4h-4`,key:`gwowj6`}],[`circle`,{cx:`4`,cy:`20`,r:`2`,key:`6kqj1y`}]]),s=t(`timer`,[[`line`,{x1:`10`,x2:`14`,y1:`2`,y2:`2`,key:`14vaq8`}],[`line`,{x1:`12`,x2:`15`,y1:`14`,y2:`11`,key:`17fdiu`}],[`circle`,{cx:`12`,cy:`14`,r:`8`,key:`1e1u0o`}]]),c={"github-pr-reviewer":{"main.py":`"""
2
2
  GitHub PR Reviewer - OpenHands Automation Script
3
3
 
4
4
  Cron-polls one or more GitHub repositories for open pull requests carrying the
@@ -42,6 +42,12 @@ REPOS = ["owner/repo"]
42
42
  TRIGGER_LABEL = "openhands-review"
43
43
  REVIEW_TONE = "thorough"
44
44
  REVIEW_STYLE_INSTRUCTIONS = ""
45
+ # Path within the checked-out repository to a repo-specific review guide
46
+ # (e.g. the repo's own code-review skill). When the file exists at this path
47
+ # relative to the repo root, its contents are read and injected verbatim into
48
+ # the review prompt so the guide is always applied deterministically, rather
49
+ # than relying on the spawned agent's skill activation. Set to "" to disable.
50
+ REPO_REVIEW_GUIDE_PATH = ".agents/skills/custom-codereview-guide.md"
45
51
  DEFAULT_OPENHANDS_URL = "http://localhost:8000"
46
52
 
47
53
  CONFIG_FILENAME = "config.json"
@@ -54,6 +60,7 @@ _CONFIG_TYPES: dict[str, type] = {
54
60
  "trigger_label": str,
55
61
  "review_tone": str,
56
62
  "review_style_instructions": str,
63
+ "repo_review_guide_path": str,
57
64
  "openhands_url": str,
58
65
  }
59
66
 
@@ -134,6 +141,7 @@ REPOS = _CONFIG.get("repos", REPOS)
134
141
  TRIGGER_LABEL = _CONFIG.get("trigger_label", TRIGGER_LABEL)
135
142
  REVIEW_TONE = _CONFIG.get("review_tone", REVIEW_TONE)
136
143
  REVIEW_STYLE_INSTRUCTIONS = _CONFIG.get("review_style_instructions", REVIEW_STYLE_INSTRUCTIONS)
144
+ REPO_REVIEW_GUIDE_PATH = _CONFIG.get("repo_review_guide_path", REPO_REVIEW_GUIDE_PATH)
137
145
  DEFAULT_OPENHANDS_URL = _CONFIG.get("openhands_url", DEFAULT_OPENHANDS_URL)
138
146
 
139
147
  DONE_DEBOUNCE = 15
@@ -741,7 +749,28 @@ def _with_ai_disclosure(body: str) -> str:
741
749
  return f"{body}\\n\\n{disclosure}" if body else disclosure
742
750
 
743
751
 
744
- def _build_review_prompt(repo: str, pr: dict, head_sha: str, label_event: dict) -> str:
752
+ def _load_repo_review_guide(workspace_dir: Path) -> str | None:
753
+ """Read the repo-specific review guide from the checked-out repository.
754
+
755
+ The path is taken from \`\`REPO_REVIEW_GUIDE_PATH\`\`. An empty path disables
756
+ the feature. Returns the file contents, or None if the file is absent or
757
+ unreadable — a missing guide is never fatal, the review simply proceeds
758
+ without it.
759
+ """
760
+ if not REPO_REVIEW_GUIDE_PATH:
761
+ return None
762
+ candidate = workspace_dir / REPO_REVIEW_GUIDE_PATH
763
+ try:
764
+ if candidate.is_file():
765
+ text = candidate.read_text(encoding="utf-8", errors="replace").strip()
766
+ if text:
767
+ return text
768
+ except Exception as exc:
769
+ print(f" Warning: could not read repo review guide {candidate}: {exc}")
770
+ return None
771
+
772
+
773
+ def _build_review_prompt(repo: str, pr: dict, head_sha: str, label_event: dict, repo_review_guide: str | None = None) -> str:
745
774
  number = pr.get("number", "?")
746
775
  title = pr.get("title", "(no title)")
747
776
  body = (pr.get("body") or "").strip() or "(no description)"
@@ -757,6 +786,10 @@ def _build_review_prompt(repo: str, pr: dict, head_sha: str, label_event: dict)
757
786
  deletions = pr.get("deletions", "?")
758
787
  tone = _TONE_INSTRUCTIONS.get(REVIEW_TONE, _TONE_INSTRUCTIONS["thorough"])
759
788
  extra = f"\\n\\nAdditional style instructions:\\n{REVIEW_STYLE_INSTRUCTIONS}" if REVIEW_STYLE_INSTRUCTIONS.strip() else ""
789
+ guide_section = (
790
+ f"\\n\\nRepo-specific review guide (from {REPO_REVIEW_GUIDE_PATH}):\\n---\\n{repo_review_guide}\\n---\\n"
791
+ if repo_review_guide else ""
792
+ )
760
793
 
761
794
  return (
762
795
  "You are an AI code reviewer. Review the GitHub pull request below and publish "
@@ -775,7 +808,12 @@ def _build_review_prompt(repo: str, pr: dict, head_sha: str, label_event: dict)
775
808
  "Required workflow:\\n"
776
809
  "1. The workspace is already the repository root at the exact Head SHA above. "
777
810
  "Do not clone, fetch, check out, or delete the repository.\\n"
778
- "2. Inspect the PR discussion, existing review comments, changed files, and the diff, "
811
+ "2. Before reviewing, you MUST read the repository's own guidance to understand the repo first.\\n"
812
+ " Read \`AGENTS.md\` at the repository root (and any nested \`AGENTS.md\` covering the "
813
+ "changed files), plus other relevant docs when present - e.g. \`CONTRIBUTING.md\`, "
814
+ "\`CLAUDE.md\`, \`.cursorrules\`, and any review or coding-guideline docs. Apply that "
815
+ "guidance to your review.\\n"
816
+ " Then inspect the PR discussion, existing review comments, changed files, and the diff, "
779
817
  "together with the surrounding code in the workspace.\\n"
780
818
  " Use \`gh\` or GitHub REST API calls with \`GITHUB_PERSONAL_ACCESS_TOKEN\`; never print secret values.\\n"
781
819
  "3. Ground every finding in the workspace code. Before using an inline location, verify that "
@@ -793,7 +831,7 @@ def _build_review_prompt(repo: str, pr: dict, head_sha: str, label_event: dict)
793
831
  "or \`🔄 CHANGES REQUESTED\`.\\n"
794
832
  "8. If there are no material issues, still publish a review saying so, with the "
795
833
  "disclosure and the verdict.\\n"
796
- f"\\nReview instructions:\\n{tone}{extra}\\n\\n"
834
+ f"\\nReview instructions:\\n{tone}{extra}{guide_section}\\n\\n"
797
835
  "After GitHub accepts the review, output exactly \`GITHUB_REVIEW_POSTED\`. "
798
836
  "If publishing still fails after the fallback in step 5, output the complete review text "
799
837
  "so it can be posted as a comment instead."
@@ -841,7 +879,10 @@ def _process_review_request(
841
879
  workspace_dir = None
842
880
  try:
843
881
  workspace_dir = _prepare_repository(github_token, repo, number, head_sha)
844
- prompt = _build_review_prompt(repo, pr, head_sha, label_event)
882
+ repo_review_guide = _load_repo_review_guide(workspace_dir)
883
+ if repo_review_guide:
884
+ print(f" Injected repo review guide for PR #{number}")
885
+ prompt = _build_review_prompt(repo, pr, head_sha, label_event, repo_review_guide)
845
886
  conv_id = create_conversation(agent_url, api_key, prompt, workspace_dir)
846
887
  except Exception as exc:
847
888
  # The claim is dropped so the next poll retries this label event. The
@@ -4848,14 +4889,14 @@ Required secret: GITHUB_PERSONAL_ACCESS_TOKEN, with permission to write pull req
4848
4889
  4. Deduplicate on the label event ID so every label application queues exactly one review.
4849
4890
  5. Extract the PR head commit into a directory of its own and start an OpenHands conversation with that directory as its workspace, so the agent reviews the exact commit without cloning anything.
4850
4891
  6. Post an acknowledgement with the conversation link, then confirm on GitHub that the review was published for that head SHA, falling back to posting the agent's text as a comment.
4851
- 7. Remove the checkout once the conversation has stopped, so nothing accumulates between runs.`,setup:{version:`1.0`,mode:`direct`,form:{triggers:{cron:{schedule:{type:`cron`,label:`Check frequency`,help:`How often to look for newly labelled pull requests.`,default:`*/15 * * * *`,required:!0},timezone:{type:`timezone`,label:`Timezone`,help:`Timezone the schedule is interpreted in.`,default:`UTC`,required:!0}}},args:{repositories:{type:`repo-picker`,label:`Repositories`,help:`The repositories whose pull requests will be reviewed. Each is polled independently and keeps its own state, so pull request numbers never collide between them.`,provider:`github`,multiple:!0,required:!0},triggerLabel:{type:`text`,label:`Trigger label`,help:`Only pull requests carrying this label are reviewed.`,default:`openhands-review`,required:!0,constraints:{minLength:1,maxLength:50}},reviewTone:{type:`select`,label:`Review tone`,help:`How detailed the review comments should be.`,default:`concise`,required:!0,options:[{value:`concise`,label:`Concise`},{value:`thorough`,label:`Thorough`},{value:`friendly`,label:`Friendly`}]}}},bundle:{version:`1.0.0`,entrypoint:`python3 main.py`,timeout:600,files:{"main.py":`skills/github-pr-reviewer/scripts/main.py`},config:{repos:`{{form.repositories}}`,trigger_label:`{{form.triggerLabel}}`,review_tone:`{{form.reviewTone}}`}},message:`This deployment cannot run the scheduled review automation directly. Set it up in this conversation instead: confirm the repository to review, the trigger label, the review tone, and the polling schedule, then create the automation.`}},{id:`github-repo-monitor`,version:`1.0.0`,name:`GitHub repository monitor`,category:`Developer tools`,description:`Watch a repository for @OpenHands mentions in issues and PR comments, start a conversation, and post the agent's reply back to GitHub.`,requires:{integrations:{github:{message:`Used to read issue and pull request comments and post replies.`}},features:[`repoClone`,`presetPrompt`]},popularityRank:98,estimatedSetupMinutes:5,exampleImplementation:`Trigger: cron polling (e.g. every 15 minutes, configurable)
4892
+ 7. Remove the checkout once the conversation has stopped, so nothing accumulates between runs.`,impact:{basis:`completed-runs`,one:`1 PR review sweep completed`,other:`{{count}} PR review sweeps completed`},setup:{version:`1.0`,mode:`direct`,form:{triggers:{cron:{schedule:{type:`cron`,label:`Check frequency`,help:`How often to look for newly labelled pull requests.`,default:`*/15 * * * *`,required:!0},timezone:{type:`timezone`,label:`Timezone`,help:`Timezone the schedule is interpreted in.`,default:`UTC`,required:!0}}},args:{repositories:{type:`repo-picker`,label:`Repositories`,help:`The repositories whose pull requests will be reviewed. Each is polled independently and keeps its own state, so pull request numbers never collide between them.`,provider:`github`,multiple:!0,required:!0},triggerLabel:{type:`text`,label:`Trigger label`,help:`Only pull requests carrying this label are reviewed.`,default:`openhands-review`,required:!0,constraints:{minLength:1,maxLength:50}},reviewTone:{type:`select`,label:`Review tone`,help:`How detailed the review comments should be.`,default:`concise`,required:!0,options:[{value:`concise`,label:`Concise`},{value:`thorough`,label:`Thorough`},{value:`friendly`,label:`Friendly`}]}}},bundle:{version:`1.0.0`,entrypoint:`python3 main.py`,timeout:600,files:{"main.py":`skills/github-pr-reviewer/scripts/main.py`},config:{repos:`{{form.repositories}}`,trigger_label:`{{form.triggerLabel}}`,review_tone:`{{form.reviewTone}}`}},message:`This deployment cannot run the scheduled review automation directly. Set it up in this conversation instead: confirm the repository to review, the trigger label, the review tone, and the polling schedule, then create the automation.`}},{id:`github-repo-monitor`,version:`1.0.0`,name:`GitHub repository monitor`,category:`Developer tools`,description:`Watch a repository for @OpenHands mentions in issues and PR comments, start a conversation, and post the agent's reply back to GitHub.`,requires:{integrations:{github:{message:`Used to read issue and pull request comments and post replies.`}},features:[`repoClone`,`presetPrompt`]},popularityRank:98,estimatedSetupMinutes:5,exampleImplementation:`Trigger: cron polling (e.g. every 15 minutes, configurable)
4852
4893
  Required secret: GITHUB_PERSONAL_ACCESS_TOKEN
4853
4894
 
4854
4895
  1. Poll GitHub for new issue and PR comments since the last run.
4855
4896
  2. Match comments containing the trigger phrase (case-insensitive, default: @OpenHands).
4856
4897
  3. Post an acknowledgment comment with a link to the new OpenHands conversation.
4857
4898
  4. Forward follow-up replies in the same thread to the running conversation.
4858
- 5. Post the agent's final response back to GitHub when the conversation completes.`,setup:{version:`1.0`,mode:`direct`,form:{triggers:{cron:{schedule:{type:`cron`,label:`Check frequency`,help:`How often to look for new comments to respond to.`,default:`*/15 * * * *`,required:!0},timezone:{type:`timezone`,label:`Timezone`,help:`Timezone the schedule is interpreted in.`,default:`UTC`,required:!0}}},args:{repository:{type:`repo-picker`,label:`Repository`,help:`The repository or repositories to watch for mentions.`,provider:`github`,required:!0},triggerPhrase:{type:`text`,label:`Trigger phrase`,help:`Only comments containing this phrase start a conversation. Matched case-insensitively.`,default:`@openhands`,required:!0,constraints:{minLength:2,maxLength:50}},ref:{type:`text`,label:`Base branch`,help:`Branch checked out when the agent responds.`,default:`main`,required:!0,constraints:{minLength:1,maxLength:255}}}},prompt:`Poll {{form.repository}} for any new issue or pull request comments since the last run. For every comment mentioning '{{form.triggerPhrase}}', read the surrounding issue or pull request context and post a helpful reply as a comment on the same thread.`,message:`This deployment cannot run the scheduled monitor directly. Set it up in this conversation instead: confirm the repository to watch, the trigger phrase, and the polling schedule, then create the automation.`}},{id:`github-issue-to-pr`,name:`GitHub Issue to PR Agent`,category:`Software development`,description:`Watch for a configurable label on GitHub issues, implement the issue in a clone of the default branch, and open a pull request for each label event.`,requires:{integrations:{github:{message:`Used to read labelled issues, push the branch, and open the pull request.`}},features:[`customTarball`]},popularityRank:95,estimatedSetupMinutes:4,exampleImplementation:`Trigger: cron polling for open GitHub issues with a configured label such as openhands
4899
+ 5. Post the agent's final response back to GitHub when the conversation completes.`,impact:{basis:`completed-runs`,one:`1 repo scan completed`,other:`{{count}} repo scans completed`},setup:{version:`1.0`,mode:`direct`,form:{triggers:{cron:{schedule:{type:`cron`,label:`Check frequency`,help:`How often to look for new comments to respond to.`,default:`*/15 * * * *`,required:!0},timezone:{type:`timezone`,label:`Timezone`,help:`Timezone the schedule is interpreted in.`,default:`UTC`,required:!0}}},args:{repository:{type:`repo-picker`,label:`Repository`,help:`The repository or repositories to watch for mentions.`,provider:`github`,required:!0},triggerPhrase:{type:`text`,label:`Trigger phrase`,help:`Only comments containing this phrase start a conversation. Matched case-insensitively.`,default:`@openhands`,required:!0,constraints:{minLength:2,maxLength:50}},ref:{type:`text`,label:`Base branch`,help:`Branch checked out when the agent responds.`,default:`main`,required:!0,constraints:{minLength:1,maxLength:255}}}},prompt:`Poll {{form.repository}} for any new issue or pull request comments since the last run. For every comment mentioning '{{form.triggerPhrase}}', read the surrounding issue or pull request context and post a helpful reply as a comment on the same thread.`,message:`This deployment cannot run the scheduled monitor directly. Set it up in this conversation instead: confirm the repository to watch, the trigger phrase, and the polling schedule, then create the automation.`}},{id:`github-issue-to-pr`,name:`GitHub Issue to PR Agent`,category:`Software development`,description:`Watch for a configurable label on GitHub issues, implement the issue in a clone of the default branch, and open a pull request for each label event.`,requires:{integrations:{github:{message:`Used to read labelled issues, push the branch, and open the pull request.`}},features:[`customTarball`]},popularityRank:95,estimatedSetupMinutes:4,exampleImplementation:`Trigger: cron polling for open GitHub issues with a configured label such as openhands
4859
4900
  Required secret: GITHUB_PERSONAL_ACCESS_TOKEN, with permission to write contents, issues, and pull requests
4860
4901
 
4861
4902
  1. Read the repositories, trigger label, branch prefix, draft mode, and polling schedule from setup.
@@ -4865,7 +4906,7 @@ Required secret: GITHUB_PERSONAL_ACCESS_TOKEN, with permission to write contents
4865
4906
  5. Clone the default branch into a directory of its own, create the working branch, and start an OpenHands conversation with that directory as its workspace. The clone carries no credential and the agent is handed no secrets, because the prompt is built from an issue body that anyone can write.
4866
4907
  6. Comment on the issue with the branch and the conversation link.
4867
4908
  7. Once the conversation has stopped, commit whatever the agent left, push the branch, open a draft pull request titled after the issue, and comment the link on the issue. An agent that made no changes gets its answer posted instead.
4868
- 8. Remove the clone once the conversation has stopped, so nothing accumulates between runs.`,setup:{version:`1.0`,mode:`direct`,form:{triggers:{cron:{schedule:{type:`cron`,label:`Check frequency`,help:`How often to look for newly labelled issues.`,default:`*/15 * * * *`,required:!0},timezone:{type:`timezone`,label:`Timezone`,help:`Timezone the schedule is interpreted in.`,default:`UTC`,required:!0}}},args:{repositories:{type:`repo-picker`,label:`Repositories`,help:`The repositories whose labelled issues are implemented. Each is polled independently and keeps its own state, so issue numbers never collide between them.`,provider:`github`,multiple:!0,required:!0},triggerLabel:{type:`text`,label:`Trigger label`,help:`Only issues carrying this label are worked on.`,default:`openhands`,required:!0,constraints:{minLength:1,maxLength:50}},branchPrefix:{type:`text`,label:`Branch prefix`,help:`Branches are named after this prefix and the issue number, such as openhands/issue-42.`,default:`openhands/issue`,required:!0,constraints:{minLength:1,maxLength:50}},pullRequestMode:{type:`select`,label:`Pull request mode`,help:`Whether the pull request is opened as a draft or ready for review.`,default:`draft`,required:!0,options:[{value:`draft`,label:`Draft`},{value:`ready`,label:`Ready for review`}]}}},bundle:{version:`1.0.0`,entrypoint:`python3 main.py`,timeout:900,files:{"main.py":`skills/github-issue-to-pr/scripts/main.py`},config:{repos:`{{form.repositories}}`,trigger_label:`{{form.triggerLabel}}`,branch_prefix:`{{form.branchPrefix}}`,pull_request_mode:`{{form.pullRequestMode}}`}},message:`This deployment cannot run the scheduled issue-to-PR automation directly. Set it up in this conversation instead: confirm the repositories to watch, the trigger label, the branch prefix, whether pull requests open as drafts, and the polling schedule, then create the automation.`}},{id:`slack-standup-digest`,name:`Slack standup digest`,category:`Team updates`,description:`Summarize yesterday’s Slack activity into an async standup note with blockers, decisions, and owners.`,requires:{integrations:{slack:{message:`Reads recent channel activity and posts the digest.`}}},popularityRank:94,estimatedSetupMinutes:5,exampleImplementation:`Trigger: cron, weekday mornings
4909
+ 8. Remove the clone once the conversation has stopped, so nothing accumulates between runs.`,impact:{basis:`completed-runs`,one:`1 issue sweep completed`,other:`{{count}} issue sweeps completed`},setup:{version:`1.0`,mode:`direct`,form:{triggers:{cron:{schedule:{type:`cron`,label:`Check frequency`,help:`How often to look for newly labelled issues.`,default:`*/15 * * * *`,required:!0},timezone:{type:`timezone`,label:`Timezone`,help:`Timezone the schedule is interpreted in.`,default:`UTC`,required:!0}}},args:{repositories:{type:`repo-picker`,label:`Repositories`,help:`The repositories whose labelled issues are implemented. Each is polled independently and keeps its own state, so issue numbers never collide between them.`,provider:`github`,multiple:!0,required:!0},triggerLabel:{type:`text`,label:`Trigger label`,help:`Only issues carrying this label are worked on.`,default:`openhands`,required:!0,constraints:{minLength:1,maxLength:50}},branchPrefix:{type:`text`,label:`Branch prefix`,help:`Branches are named after this prefix and the issue number, such as openhands/issue-42.`,default:`openhands/issue`,required:!0,constraints:{minLength:1,maxLength:50}},pullRequestMode:{type:`select`,label:`Pull request mode`,help:`Whether the pull request is opened as a draft or ready for review.`,default:`draft`,required:!0,options:[{value:`draft`,label:`Draft`},{value:`ready`,label:`Ready for review`}]}}},bundle:{version:`1.0.0`,entrypoint:`python3 main.py`,timeout:900,files:{"main.py":`skills/github-issue-to-pr/scripts/main.py`},config:{repos:`{{form.repositories}}`,trigger_label:`{{form.triggerLabel}}`,branch_prefix:`{{form.branchPrefix}}`,pull_request_mode:`{{form.pullRequestMode}}`}},message:`This deployment cannot run the scheduled issue-to-PR automation directly. Set it up in this conversation instead: confirm the repositories to watch, the trigger label, the branch prefix, whether pull requests open as drafts, and the polling schedule, then create the automation.`}},{id:`slack-standup-digest`,name:`Slack standup digest`,category:`Team updates`,description:`Summarize yesterday’s Slack activity into an async standup note with blockers, decisions, and owners.`,requires:{integrations:{slack:{message:`Reads recent channel activity and posts the digest.`}}},popularityRank:94,estimatedSetupMinutes:5,exampleImplementation:`Trigger: cron, weekday mornings
4869
4910
  Required MCP: Slack
4870
4911
 
4871
4912
  1. Search configured channels for messages since the last digest window.
@@ -4886,7 +4927,28 @@ Required MCP: Linear
4886
4927
  2. Score priority and classify the request as bug, feature, support, or chore.
4887
4928
  3. TODO: map local team labels and priority conventions.
4888
4929
  4. Add a triage comment with rationale and suggested next actions.
4889
- 5. Optionally update labels, priority, and assignee.`},{id:`jira-issue-to-pr`,name:`Jira issue to GitHub PR`,category:`Project management`,description:`Watch a Jira Cloud project for issues with a configurable label and automatically open a GitHub pull request for each new issue found. The target GitHub repo is read from the ticket body - no repo parameter required at deploy time.`,requires:{integrations:{"atlassian-rovo":{message:`Provides the Atlassian Rovo MCP connection used to access Jira data.`},github:{message:`Opens a pull request on the repository named in the ticket.`}}},popularityRank:85,estimatedSetupMinutes:5,exampleImplementation:`Trigger: cron polling (e.g. every 5 minutes)
4930
+ 5. Optionally update labels, priority, and assignee.`},{id:`linear-issue-to-github-pr`,name:`Linear issue to GitHub PR`,category:`Project management`,description:`Watch Linear for implementation-ready issues, start an agent to make the requested code change, and open a GitHub pull request.`,requires:{integrations:{linear:{message:`Reads implementation-ready issues and posts progress back to Linear.`},github:{message:`Clones the target repository, pushes a branch, and opens the pull request.`}},features:[`conversationDispatch`]},popularityRank:89,estimatedSetupMinutes:6,skill:`ticket-to-code-change`,exampleImplementation:`Trigger: Linear issue marked implementation-ready
4931
+ Required integrations: Linear, GitHub
4932
+
4933
+ 1. Watch the selected Linear team or project for issues carrying a configurable implementation-ready label or state.
4934
+ 2. Deduplicate issue IDs so each transition dispatches once.
4935
+ 3. Read the issue, linked dependencies, acceptance criteria, and target repository.
4936
+ 4. Start an independent OpenHands conversation that clones the GitHub repository, creates an issue-keyed branch, implements and tests the change, and opens a pull request.
4937
+ 5. Post the conversation and pull request links back to the Linear issue and update its status according to the team's workflow.`},{id:`linear-issue-to-gitlab-mr`,name:`Linear issue to GitLab MR`,category:`Project management`,description:`Watch Linear for implementation-ready issues, start an agent to make the requested code change, and open a GitLab merge request.`,requires:{integrations:{linear:{message:`Reads implementation-ready issues and posts progress back to Linear.`},gitlab:{message:`Clones the target repository, pushes a branch, and opens the merge request.`}},features:[`conversationDispatch`]},popularityRank:88,estimatedSetupMinutes:6,skill:`ticket-to-code-change`,exampleImplementation:`Trigger: Linear issue marked implementation-ready
4938
+ Required integrations: Linear, GitLab
4939
+
4940
+ 1. Watch the selected Linear team or project for issues carrying a configurable implementation-ready label or state.
4941
+ 2. Deduplicate issue IDs so each transition dispatches once.
4942
+ 3. Read the issue, linked dependencies, acceptance criteria, and target repository.
4943
+ 4. Start an independent OpenHands conversation that clones the GitLab repository, creates an issue-keyed branch, implements and tests the change, and opens a merge request.
4944
+ 5. Post the conversation and merge request links back to the Linear issue and update its status according to the team's workflow.`},{id:`linear-issue-to-bitbucket-pr`,name:`Linear issue to Bitbucket PR`,category:`Project management`,description:`Watch Linear for implementation-ready issues, start an agent to make the requested code change, and open a Bitbucket pull request.`,requires:{integrations:{linear:{message:`Reads implementation-ready issues and posts progress back to Linear.`},bitbucket:{message:`Clones the target repository, pushes a branch, and opens the pull request.`}},features:[`conversationDispatch`]},popularityRank:87,estimatedSetupMinutes:6,skill:`ticket-to-code-change`,exampleImplementation:`Trigger: Linear issue marked implementation-ready
4945
+ Required integrations: Linear, Bitbucket
4946
+
4947
+ 1. Watch the selected Linear team or project for issues carrying a configurable implementation-ready label or state.
4948
+ 2. Deduplicate issue IDs so each transition dispatches once.
4949
+ 3. Read the issue, linked dependencies, acceptance criteria, and target repository.
4950
+ 4. Start an independent OpenHands conversation that clones the Bitbucket repository, creates an issue-keyed branch, implements and tests the change, and opens a pull request.
4951
+ 5. Post the conversation and pull request links back to the Linear issue and update its status according to the team's workflow.`},{id:`jira-issue-to-pr`,name:`Jira issue to GitHub PR`,category:`Project management`,description:`Watch a Jira Cloud project for issues with a configurable label and automatically open a GitHub pull request for each new issue found. The target GitHub repo is read from the ticket body - no repo parameter required at deploy time.`,requires:{integrations:{"atlassian-rovo":{message:`Provides the Atlassian Rovo MCP connection used to access Jira data.`},github:{message:`Opens a pull request on the repository named in the ticket.`}}},popularityRank:85,estimatedSetupMinutes:5,exampleImplementation:`Trigger: cron polling (e.g. every 5 minutes)
4890
4952
  Required integrations: Atlassian Rovo MCP for Jira access and a GitHub MCP connection. The poller also needs a Jira API token and a GitHub personal access token (repo + workflow scope) as secrets for its direct API calls.
4891
4953
 
4892
4954
  1. Connect Atlassian Rovo MCP and GitHub, then collect the Jira base URL, email, API token secret name, label to watch, and cron schedule from the user. No GitHub repo is needed at deploy time - each ticket must include the target repo (owner/repo) in its body.
@@ -4894,14 +4956,56 @@ Required integrations: Atlassian Rovo MCP for Jira access and a GitHub MCP conne
4894
4956
  3. Deduplicate against a KV-store-backed set of already-processed issue keys so re-runs never create duplicate PRs.
4895
4957
  4. For each new issue, start an independent OpenHands agent conversation that extracts the GitHub repo from the ticket body, clones it, creates a branch named after the Jira key, implements or scaffolds the requested change, and opens a pull request.
4896
4958
  5. Immediately after the conversation is created, post a Jira comment on the issue: 'I'm on it: <conversation URL>'.
4897
- 6. Persist the processed issue key immediately after dispatching so the next poll skips it.`},{id:`research-brief-writer`,name:`Research brief writer`,category:`Research`,description:`Monitor a topic, gather sources from the web, and publish a short brief for your team.`,requires:{integrations:{tavily:{message:`Searches the web for sources on the topic.`},notion:{message:`Publishes the finished brief.`}}},popularityRank:84,estimatedSetupMinutes:7,skill:`research-brief`,exampleImplementation:`Trigger: cron, weekly or daily
4959
+ 6. Persist the processed issue key immediately after dispatching so the next poll skips it.`},{id:`qa-changes`,name:`QA Changes Agent`,category:`Code review`,description:`When a pull request is opened for review, run the QA changes methodology — set up the environment, exercise the changed behavior as a real user would, and post the outcome by editing the PR description with a QA Agent section.`,requires:{integrations:{github:{message:`Used to read the pull request, check the author's commit history, and edit the PR description.`}},features:[`repoClone`,`presetPrompt`,`webhookDelivery`]},popularityRank:85,estimatedSetupMinutes:5,skill:`qa-changes`,exampleImplementation:`Trigger: GitHub pull_request.opened and pull_request.ready_for_review events
4960
+ Required secret: GITHUB_TOKEN
4961
+
4962
+ 1. Receive a GitHub pull_request event (opened or ready_for_review).
4963
+ 2. Filter: the PR must not be a draft (draft == false), the PR description must not already contain a QA Agent section, and the PR author must have more than 3 commits already in main.
4964
+ 3. Start an OpenHands conversation that clones the repo, checks out the PR head, and runs the /qa-changes methodology: understand the change, set up the environment, exercise the changed behavior as a real user would.
4965
+ 4. Instead of posting a review comment, edit the PR description to append a horizontal rule followed by a QA Agent section containing the structured QA report.`,setup:{version:`1.0`,mode:`direct`,form:{triggers:{event:{on:{type:`select`,label:`Trigger on`,help:`Which GitHub pull request event starts a QA run. Opened fires when a non-draft PR is created; Ready for review fires when a draft PR is marked ready.`,default:`pull_request.opened`,required:!0,options:[{value:`pull_request.opened`,label:`Pull request opened`},{value:`pull_request.ready_for_review`,label:`Pull request ready for review`}]}}},args:{repository:{type:`repo-picker`,label:`Repository`,help:`The repository whose pull requests will be QA'd.`,provider:`github`,required:!0},ref:{type:`text`,label:`Base branch`,help:`Branch checked out when the agent runs QA.`,default:`main`,required:!0,constraints:{minLength:1,maxLength:255}}}},prompt:`A pull request was opened or marked ready for review in {{form.repository}}. Before doing any QA work, run these gate checks and stop immediately (making no changes) if any fails:
4966
+
4967
+ 1. The PR must not be a draft — it must be open for review. If the PR is a draft, stop.
4968
+ 2. The PR author (the human who opened it) must have more than 3 commits already merged into the {{form.ref}} branch. Use the GitHub API to count the author's commits in {{form.ref}}. If the count is 3 or fewer, stop without making any changes.
4969
+ 3. The PR description must not already contain a section named QA Agent (i.e., a header like ## QA Agent or ### QA Agent). If that section already exists, stop without making any changes or starting a conversation.
4970
+
4971
+ If all gate checks pass, proceed with the QA validation using the /qa-changes skill methodology:
4972
+
4973
+ - Phase 1: Understand the change. Read the PR diff, title, and description. Identify the goal of the PR. Classify every changed file. Form a hypothesis about what the PR should achieve.
4974
+ - Phase 2: Set up the environment. Read the repo's bootstrap instructions, install dependencies, and build if needed. Note CI status but do not re-run tests.
4975
+ - Phase 3: Exercise the changed behavior. Actually run the software the way a real user would — start servers, run CLI commands, make HTTP requests, open browsers. Do NOT run the test suite, linters, or code analysis. For bug fixes, reproduce the bug before and after the fix. Show before/after evidence.
4976
+ - Phase 4: Report results.
4977
+
4978
+ IMPORTANT — how to post your report:
4979
+ Do NOT post a new comment, review, or inline review comment. Instead, EDIT the PR description (the pull request body) to append your QA report at the very end, after a horizontal rule (---), under a new section titled QA Agent. Use the GitHub API (PATCH /repos/{owner}/{repo}/pulls/{pr_number} with a body field) to update the PR description. Append the following structure to the existing PR body:
4980
+
4981
+ ---
4982
+
4983
+ ## QA Agent
4984
+
4985
+ {Your full QA report following the /qa-changes skill report format: verdict, summary, Does this PR achieve its stated goal? section, status table, collapsible evidence in details blocks, and issues found.}
4986
+
4987
+ Do not make any other changes to the PR description — only append the QA Agent section at the end. Do not post any comments or reviews.`,filter:`!pull_request.draft && !icontains(pull_request.body, 'QA Agent') && glob(repository.full_name, '{{form.repository}}')`,message:`This deployment cannot run the webhook-driven QA automation directly. Set it up in this conversation instead: confirm the repository to QA, the base branch, and the PR event to trigger on, then create the automation.`}},{id:`jira-issue-to-gitlab-mr`,name:`Jira issue to GitLab MR`,category:`Project management`,description:`Watch Jira for implementation-ready issues, start an agent to make the requested code change, and open a GitLab merge request.`,requires:{integrations:{jira:{message:`Reads implementation-ready issues and posts progress back to Jira.`},gitlab:{message:`Clones the target repository, pushes a branch, and opens the merge request.`}},features:[`conversationDispatch`]},popularityRank:84,estimatedSetupMinutes:6,skill:`ticket-to-code-change`,exampleImplementation:`Trigger: Jira issue marked implementation-ready
4988
+ Required integrations: Jira, GitLab
4989
+
4990
+ 1. Watch the selected Jira team or project for issues carrying a configurable implementation-ready label or state.
4991
+ 2. Deduplicate issue IDs so each transition dispatches once.
4992
+ 3. Read the issue, linked dependencies, acceptance criteria, and target repository.
4993
+ 4. Start an independent OpenHands conversation that clones the GitLab repository, creates an issue-keyed branch, implements and tests the change, and opens a merge request.
4994
+ 5. Post the conversation and merge request links back to the Jira issue and update its status according to the team's workflow.`},{id:`research-brief-writer`,name:`Research brief writer`,category:`Research`,description:`Monitor a topic, gather sources from the web, and publish a short brief for your team.`,requires:{integrations:{tavily:{message:`Searches the web for sources on the topic.`},notion:{message:`Publishes the finished brief.`}}},popularityRank:84,estimatedSetupMinutes:7,skill:`research-brief`,exampleImplementation:`Trigger: cron, weekly or daily
4898
4995
  Required MCPs: Tavily, Notion
4899
4996
 
4900
4997
  1. Run focused Tavily searches for configured topics and competitors.
4901
4998
  2. Deduplicate sources and rank them by freshness and authority.
4902
4999
  3. TODO: confirm citation format and destination Notion database schema.
4903
5000
  4. Write an executive summary, implications, and recommended actions.
4904
- 5. Create or update a Notion page with citations and source links.`},{id:`github-agents-md-maintainer`,name:`AGENTS.md Maintainer`,category:`Documentation`,icon:`bot`,description:`Keep AGENTS.md current in your repositories. On a schedule, an agent reads the repository, creates or updates AGENTS.md, and opens a pull request - and stays quiet while one of its pull requests is still open.`,requires:{integrations:{github:{message:`Used to read the repository, push the branch, and open the pull request.`}},features:[`customTarball`]},popularityRank:80,estimatedSetupMinutes:3,exampleImplementation:`Trigger: cron, weekly by default (0 9 * * 1)
5001
+ 5. Create or update a Notion page with citations and source links.`},{id:`jira-issue-to-bitbucket-pr`,name:`Jira issue to Bitbucket PR`,category:`Project management`,description:`Watch Jira for implementation-ready issues, start an agent to make the requested code change, and open a Bitbucket pull request.`,requires:{integrations:{jira:{message:`Reads implementation-ready issues and posts progress back to Jira.`},bitbucket:{message:`Clones the target repository, pushes a branch, and opens the pull request.`}},features:[`conversationDispatch`]},popularityRank:83,estimatedSetupMinutes:6,skill:`ticket-to-code-change`,exampleImplementation:`Trigger: Jira issue marked implementation-ready
5002
+ Required integrations: Jira, Bitbucket
5003
+
5004
+ 1. Watch the selected Jira team or project for issues carrying a configurable implementation-ready label or state.
5005
+ 2. Deduplicate issue IDs so each transition dispatches once.
5006
+ 3. Read the issue, linked dependencies, acceptance criteria, and target repository.
5007
+ 4. Start an independent OpenHands conversation that clones the Bitbucket repository, creates an issue-keyed branch, implements and tests the change, and opens a pull request.
5008
+ 5. Post the conversation and pull request links back to the Jira issue and update its status according to the team's workflow.`},{id:`github-agents-md-maintainer`,name:`AGENTS.md Maintainer`,category:`Documentation`,icon:`bot`,description:`Keep AGENTS.md current in your repositories. On a schedule, an agent reads the repository, creates or updates AGENTS.md, and opens a pull request - and stays quiet while one of its pull requests is still open.`,requires:{integrations:{github:{message:`Used to read the repository, push the branch, and open the pull request.`}},features:[`customTarball`]},popularityRank:80,estimatedSetupMinutes:3,exampleImplementation:`Trigger: cron, weekly by default (0 9 * * 1)
4905
5009
  Required secret: GITHUB_PERSONAL_ACCESS_TOKEN, with permission to write contents and pull requests
4906
5010
 
4907
5011
  1. Read the repositories, branch prefix, pull request mode, and schedule from setup.
@@ -4912,7 +5016,7 @@ Required secret: GITHUB_PERSONAL_ACCESS_TOKEN, with permission to write contents
4912
5016
  6. Clone the default branch into a directory of its own, create the working branch, and start an OpenHands conversation with that directory as its workspace.
4913
5017
  7. The agent reads the repository, edits AGENTS.md, commits, pushes, and opens the pull request; the script verifies that on GitHub and opens it itself when the agent did not.
4914
5018
  8. Record no-changes when AGENTS.md is already accurate, which is the expected result most weeks.
4915
- 9. Remove the clone once the conversation has stopped.`,setup:{version:`1.0`,mode:`direct`,form:{triggers:{cron:{schedule:{type:`cron`,label:`Check frequency`,help:`How often to review AGENTS.md. Work is keyed by ISO week, so a schedule more frequent than weekly only polls.`,default:`0 9 * * 1`,required:!0},timezone:{type:`timezone`,label:`Timezone`,help:`Timezone the schedule is interpreted in.`,default:`UTC`,required:!0}}},args:{repositories:{type:`repo-picker`,label:`Repositories`,help:`The repositories whose AGENTS.md is maintained. Each keeps its own state and its own weekly claim.`,provider:`github`,multiple:!0,required:!0},branchPrefix:{type:`text`,label:`Branch prefix`,help:`Branches are named after this prefix and the ISO week, such as openhands/agents-md-2026-W34. It is also how the automation recognises its own open pull requests.`,default:`openhands/agents-md`,required:!0,constraints:{minLength:1,maxLength:50}},pullRequestMode:{type:`select`,label:`Pull request mode`,help:`Whether the pull request is opened as a draft or ready for review.`,default:`draft`,required:!0,options:[{value:`draft`,label:`Draft`},{value:`ready`,label:`Ready for review`}]}}},bundle:{version:`1.0.0`,entrypoint:`python3 main.py`,timeout:900,files:{"main.py":`skills/github-agents-md-maintainer/scripts/main.py`},config:{repos:`{{form.repositories}}`,branch_prefix:`{{form.branchPrefix}}`,pull_request_mode:`{{form.pullRequestMode}}`}},message:`This deployment cannot run the scheduled AGENTS.md automation directly. Set it up in this conversation instead: confirm the repositories to maintain, the branch prefix, whether pull requests open as drafts, and the schedule, then create the automation.`}},{id:`upstream-fork-sync`,name:`Upstream fork sync`,category:`Developer tools`,description:`Keep a long-lived fork current with its upstream by re-running a nightly job that fetches upstream changes, rebases local customizations on top, verifies the software still works, and replaces the running version when it does.`,requires:{integrations:{github:{message:`Used to fetch upstream changes and push the rebased fork.`}},features:[`repoClone`,`presetPrompt`]},popularityRank:80,estimatedSetupMinutes:4,exampleImplementation:`Trigger: cron, nightly (configurable)
5019
+ 9. Remove the clone once the conversation has stopped.`,impact:{basis:`completed-runs`,one:`1 maintenance pass completed`,other:`{{count}} maintenance passes completed`},setup:{version:`1.0`,mode:`direct`,form:{triggers:{cron:{schedule:{type:`cron`,label:`Check frequency`,help:`How often to review AGENTS.md. Work is keyed by ISO week, so a schedule more frequent than weekly only polls.`,default:`0 9 * * 1`,required:!0},timezone:{type:`timezone`,label:`Timezone`,help:`Timezone the schedule is interpreted in.`,default:`UTC`,required:!0}}},args:{repositories:{type:`repo-picker`,label:`Repositories`,help:`The repositories whose AGENTS.md is maintained. Each keeps its own state and its own weekly claim.`,provider:`github`,multiple:!0,required:!0},branchPrefix:{type:`text`,label:`Branch prefix`,help:`Branches are named after this prefix and the ISO week, such as openhands/agents-md-2026-W34. It is also how the automation recognises its own open pull requests.`,default:`openhands/agents-md`,required:!0,constraints:{minLength:1,maxLength:50}},pullRequestMode:{type:`select`,label:`Pull request mode`,help:`Whether the pull request is opened as a draft or ready for review.`,default:`draft`,required:!0,options:[{value:`draft`,label:`Draft`},{value:`ready`,label:`Ready for review`}]}}},bundle:{version:`1.0.0`,entrypoint:`python3 main.py`,timeout:900,files:{"main.py":`skills/github-agents-md-maintainer/scripts/main.py`},config:{repos:`{{form.repositories}}`,branch_prefix:`{{form.branchPrefix}}`,pull_request_mode:`{{form.pullRequestMode}}`}},message:`This deployment cannot run the scheduled AGENTS.md automation directly. Set it up in this conversation instead: confirm the repositories to maintain, the branch prefix, whether pull requests open as drafts, and the schedule, then create the automation.`}},{id:`upstream-fork-sync`,name:`Upstream fork sync`,category:`Developer tools`,description:`Keep a long-lived fork current with its upstream by re-running a nightly job that fetches upstream changes, rebases local customizations on top, verifies the software still works, and replaces the running version when it does.`,requires:{integrations:{github:{message:`Used to fetch upstream changes and push the rebased fork.`}},features:[`repoClone`,`presetPrompt`]},popularityRank:80,estimatedSetupMinutes:4,exampleImplementation:`Trigger: cron, nightly (configurable)
4916
5020
  Required secret: GITHUB_PERSONAL_ACCESS_TOKEN
4917
5021
 
4918
5022
  1. Clone the fork repository and fetch the latest from its upstream remote.
@@ -4944,6 +5048,6 @@ Required secret: none. The feeds are public URLs and the conversation is started
4944
5048
  5. Start no conversation at all when nothing new was published, and leave the day open for a later run. A quiet day costs no tokens.
4945
5049
  6. Otherwise start an OpenHands conversation with the newest stories and the topics in the prompt, and let it decide which are relevant, group them, merge duplicate coverage, and write the digest.
4946
5050
  7. Deliver it three ways that need no credentials: it stays in the conversation, it is printed into the run log, and its opening is kept in state.
4947
- 8. Remember the reported stories only once a digest exists, so a failed run is recovered by the next one rather than lost.`,setup:{version:`1.0`,mode:`direct`,form:{triggers:{cron:{schedule:{type:`cron`,label:`Digest time`,help:`When the digest is written. Work is keyed by UTC date, so a schedule more frequent than daily only polls until there is something new.`,default:`0 8 * * *`,required:!0},timezone:{type:`timezone`,label:`Timezone`,help:`Timezone the schedule is interpreted in.`,default:`UTC`,required:!0}}},args:{feeds:{type:`textarea`,label:`Feeds`,help:`One RSS or Atom feed URL per line. They must be public: this automation signs in to nothing, so a feed behind a login will simply fail and be skipped.`,default:`https://news.ycombinator.com/rss
5051
+ 8. Remember the reported stories only once a digest exists, so a failed run is recovered by the next one rather than lost.`,impact:{basis:`completed-runs`,one:`1 feed check completed`,other:`{{count}} feed checks completed`},setup:{version:`1.0`,mode:`direct`,form:{triggers:{cron:{schedule:{type:`cron`,label:`Digest time`,help:`When the digest is written. Work is keyed by UTC date, so a schedule more frequent than daily only polls until there is something new.`,default:`0 8 * * *`,required:!0},timezone:{type:`timezone`,label:`Timezone`,help:`Timezone the schedule is interpreted in.`,default:`UTC`,required:!0}}},args:{feeds:{type:`textarea`,label:`Feeds`,help:`One RSS or Atom feed URL per line. They must be public: this automation signs in to nothing, so a feed behind a login will simply fail and be skipped.`,default:`https://news.ycombinator.com/rss
4948
5052
  https://feeds.arstechnica.com/arstechnica/index
4949
5053
  https://www.theverge.com/rss/index.xml`,required:!0,constraints:{minLength:8,maxLength:4e3}},topics:{type:`textarea`,label:`Topics of interest`,help:`One topic per line, or separated by commas. The agent reads every new story and decides which ones are about these, so write them the way you would explain your interests to a colleague rather than as search terms. Leave this empty to cover whatever is most significant.`,default:`artificial intelligence, open source, developer tools`,required:!1,constraints:{maxLength:2e3}}}},bundle:{version:`1.0.0`,entrypoint:`python3 main.py`,timeout:900,files:{"main.py":`skills/news-digest/scripts/main.py`},config:{feeds:`{{form.feeds}}`,topics:`{{form.topics}}`}},message:`This deployment cannot run the scheduled news digest directly. Set it up in this conversation instead: confirm the feeds to read, the topics to watch for, and the schedule, then create the automation.`}}],u={version:`1.0`,routes:{list:`/automations`,setup:`/automations/new/:automationId`,detail:`/automations/:automationId`,templates:`/automations/templates`},navigation:{sidebar:{label:`Automate`},commandMenu:{title:`Automations`,description:`Review scheduled and webhook automations.`,keywords:`automate cron schedule webhook jobs`},subPages:[{page:`list`,label:`Dashboard`,icon:`layout-dashboard`},{page:`templates`,label:`Templates`,icon:`sparkles`}]},pages:{list:{title:`Dashboard`,subtitle:`Health, activity, and run performance across your automations.`,overview:{label:`Automation overview`,tiles:[{metric:`automations`,label:`Automations`,detail:`{{active}} active`,icon:`bot`},{metric:`needs-attention`,label:`Needs attention`,detail:`Latest run failed`,zeroDetail:`No latest-run failures`,icon:`circle-alert`},{metric:`total-runs`,label:`Total runs`,detail:`Across loaded automations`,icon:`activity`},{metric:`average-duration`,label:`Average duration`,detail:`Recent completed runs`,icon:`timer`}]},filters:[{id:`status`,label:`Filter by status`,options:[{value:`all`,label:`All statuses`},{value:`active`,label:`Active`},{value:`failing`,label:`Needs attention`},{value:`disabled`,label:`Disabled`}]},{id:`trigger`,label:`Filter by trigger`,options:[{value:`all`,label:`All triggers`},{value:`schedule`,label:`Scheduled`},{value:`event`,label:`Event-driven`}]}],sort:{label:`Sort automations`,default:`last-run`,options:[{value:`last-run`,label:`Latest run`},{value:`runs`,label:`Most runs`},{value:`name`,label:`Name`}]},insights:{health:{healthy:`Healthy`,failing:`Failing`,running:`Running`,disabled:`Disabled`,neverRun:`Never run`,checking:`Checking`},lastRun:{label:`Last run`,never:`Never`,justNow:`Just now`},stats:{runs:`Runs`,recentSuccess:`Recent success`,averageDuration:`Avg. duration`}}},detail:{backLabel:`Back to Automations`},edit:{title:`Edit automation`},templates:{title:`Templates`,description:`Browse proven automations and beta ideas, then launch one into a conversation to tailor it to your work.`}},docsUrl:`https://docs.openhands.dev/openhands/usage/automations/overview`,attributes:{name:{type:`text`,label:`Name`,required:!0},prompt:{type:`textarea`,label:`Prompt`,help:`Edits apply to future runs only.`,required:!1},model:{type:`llm-profile`,label:`LLM profile`,required:!1},timeout:{type:`number`,label:`Timeout (seconds)`,help:`Maximum time a single run may take. Leave empty for the default of 600 seconds (10 minutes); maximum 1800 seconds (30 minutes).`,required:!1,constraints:{min:1,max:1800}},schedule:{type:`schedule`,label:`Frequency`,required:!1}},importExport:{fileKind:`automation`,fileVersion:1,filenameSuffix:`.automation.json`,importDefaults:{repoProvider:`github`,placeholderEventSource:`agent-canvas-import`}},endpoints:{list:`/v1`,detail:`/v1/{id}`,dispatch:`/v1/{id}/dispatch`,runs:`/v1/{id}/runs`,tarball:`/v1/{id}/tarball`,health:`/health`,capabilities:`/v1/capabilities`,validate:`/v1/validate`,createPrompt:`/v1/preset/prompt`,createPlugin:`/v1/preset/plugin`,createBundle:`/v1`,uploads:`/v1/uploads`},featuredAutomationIds:[`github-pr-reviewer`,`github-agents-md-maintainer`,`news-digest`,`github-issue-to-pr`,`slack-channel-monitor`],responderIntegrationIds:[`github`,`slack`]},d=e({AUTOMATION_CATALOG:()=>_,AUTOMATION_INTERFACE:()=>y,default:()=>_,getAutomationBundleFiles:()=>v,getAutomationCatalogEntry:()=>g,listAutomationCatalog:()=>h}),f=e=>JSON.parse(JSON.stringify(e)),p=l,m=new Map(p.map(e=>[e.id,e])),h=()=>f(p),g=e=>{let t=m.get(e);return t?f(t):void 0},_=f(p),v=e=>{let t=c[e];return t?f(t):void 0},y=f(u);export{o as a,r as c,s as i,n as l,d as n,a as o,v as r,i as s,_ as t};
@@ -2346,7 +2346,7 @@ Record as \`CRON_SCHEDULE\`.
2346
2346
 
2347
2347
  ### Step 6 - Generate the automation script
2348
2348
 
2349
- Read \`scripts/main.py\` from this skill's directory. Apply exactly five constant
2349
+ Read \`scripts/main.py\` from this skill's directory. Apply exactly six constant
2350
2350
  substitutions near the top of the file:
2351
2351
 
2352
2352
  > The script also reads a \`config.json\` shipped beside it, if there is one, over
@@ -2361,6 +2361,7 @@ substitutions near the top of the file:
2361
2361
  | \`TRIGGER_LABEL = "openhands-review"\` | \`TRIGGER_LABEL = "{trigger_label}"\` |
2362
2362
  | \`REVIEW_TONE = "thorough"\` | \`REVIEW_TONE = "{review_tone}"\` |
2363
2363
  | \`REVIEW_STYLE_INSTRUCTIONS = ""\` | \`REVIEW_STYLE_INSTRUCTIONS = "{style_instructions}"\` |
2364
+ | \`REPO_REVIEW_GUIDE_PATH = ".agents/skills/custom-codereview-guide.md"\` | leave unchanged to auto-load a repo review guide at this path, or set to \`""\` to disable |
2364
2365
  | \`DEFAULT_OPENHANDS_URL = "http://localhost:8000"\` | leave unchanged unless the user has a preference |
2365
2366
 
2366
2367
  Use a safe string writer such as \`json.dumps(value)\` when inserting user-provided
@@ -5950,6 +5951,7 @@ Source: [\`examples/\`](https://github.com/OpenHands/software-agent-sdk/tree/mai
5950
5951
  - [\`55_persistent_memory.py\`](https://github.com/OpenHands/software-agent-sdk/blob/main/examples/01_standalone_sdk/55_persistent_memory.py)
5951
5952
  - [\`56_structured_output.py\`](https://github.com/OpenHands/software-agent-sdk/blob/main/examples/01_standalone_sdk/56_structured_output.py)
5952
5953
  - [\`57_prompt_hooks\`](https://github.com/OpenHands/software-agent-sdk/tree/main/examples/01_standalone_sdk/57_prompt_hooks)
5954
+ - [\`58_ask_oracle_tool\`](https://github.com/OpenHands/software-agent-sdk/tree/main/examples/01_standalone_sdk/58_ask_oracle_tool)
5953
5955
 
5954
5956
  ### [\`02_remote_agent_server/\`](https://github.com/OpenHands/software-agent-sdk/tree/main/examples/02_remote_agent_server)
5955
5957
 
@@ -8124,7 +8126,44 @@ After a preferred theme is selected:
8124
8126
  4. Maintain the theme's visual identity across all slides
8125
8127
 
8126
8128
  ## Create your Own Theme
8127
- To handle cases where none of the existing themes work for an artifact, create a custom theme. Based on provided inputs, generate a new theme similar to the ones above. Give the theme a similar name describing what the font/color combinations represent. Use any basic description provided to choose appropriate colors/fonts. After generating the theme, show it for review and verification. Following that, apply the theme as described above.`,category:`design`,license:`Complete terms in LICENSE.txt`},{name:`upstream-fork-sync`,description:`This skill should be used when the user asks to "keep a fork in sync", "rebase local changes on upstream", "sync my fork nightly", "long-lived fork", or "automate upstream rebases". Guides the user through creating a cron automation that fetches upstream changes, rebases local customizations on top, verifies the software works, and replaces the running version when the rebase is clean.`,triggers:[`/upstream-fork-sync:setup`],content:`# Upstream Fork Sync Automation
8129
+ To handle cases where none of the existing themes work for an artifact, create a custom theme. Based on provided inputs, generate a new theme similar to the ones above. Give the theme a similar name describing what the font/color combinations represent. Use any basic description provided to choose appropriate colors/fonts. After generating the theme, show it for review and verification. Following that, apply the theme as described above.`,category:`design`,license:`Complete terms in LICENSE.txt`},{name:`ticket-to-code-change`,description:`Set up a ticket-to-code-change automation using Jira or Linear as the issue tracker and GitHub, GitLab, or Bitbucket as the source-control provider. Watches for implementation-ready tickets, starts an OpenHands conversation to implement and test the request, opens a pull or merge request, and links the result back to the ticket.`,triggers:[`/ticket-to-code-change:setup`],content:`# Ticket to code change
8130
+
8131
+ Create an automation that turns implementation-ready tickets into tested pull
8132
+ requests or merge requests.
8133
+
8134
+ ## Information to collect
8135
+
8136
+ Ask the user for:
8137
+
8138
+ 1. The issue tracker: Jira Cloud or Linear.
8139
+ 2. The source-control provider: GitHub, GitLab, or Bitbucket Cloud.
8140
+ 3. The project or team to watch and the label or workflow state that means
8141
+ "implementation ready".
8142
+ 4. How a ticket identifies its target repository and base branch.
8143
+ 5. The polling schedule or issue event to use.
8144
+ 6. The ticket state to set when work starts and when the change request opens.
8145
+ 7. Whether linked dependencies must be completed before dispatch.
8146
+
8147
+ ## Setup workflow
8148
+
8149
+ 1. Verify that both required integrations are connected and can read the
8150
+ selected project and repository.
8151
+ 2. Prefer an issue event trigger when the deployment can receive events;
8152
+ otherwise use cron polling with durable issue-ID deduplication.
8153
+ 3. Limit each run to a small configurable number of new tickets. On initial
8154
+ deployment, establish a baseline instead of dispatching the entire backlog.
8155
+ 4. Build a prompt that includes the full ticket, acceptance criteria,
8156
+ dependency status, repository, base branch, and provider-specific request
8157
+ terminology. Require the agent to run the repository's tests before opening
8158
+ the pull request or merge request.
8159
+ 5. Create the automation through the Automation backend described in
8160
+ \`<RUNTIME_SERVICES>\`. Use its prompt-preset endpoint and authenticate with
8161
+ the runtime-provided automation API key.
8162
+ 6. Configure the automation to post the OpenHands conversation URL immediately
8163
+ and the resulting pull-request or merge-request URL back to the ticket.
8164
+
8165
+ Do not dispatch tickets with unresolved dependencies or without an unambiguous
8166
+ target repository; comment on the ticket with the missing information instead.`,category:`automations`},{name:`upstream-fork-sync`,description:`This skill should be used when the user asks to "keep a fork in sync", "rebase local changes on upstream", "sync my fork nightly", "long-lived fork", or "automate upstream rebases". Guides the user through creating a cron automation that fetches upstream changes, rebases local customizations on top, verifies the software works, and replaces the running version when the rebase is clean.`,triggers:[`/upstream-fork-sync:setup`],content:`# Upstream Fork Sync Automation
8128
8167
 
8129
8168
  Create a cron automation that keeps a long-lived fork current with its
8130
8169
  upstream source. On every run it fetches the latest upstream changes,
@@ -8417,4 +8456,4 @@ vercel logs <deployment-url>
8417
8456
 
8418
8457
  # Pull environment variables locally
8419
8458
  vercel env pull
8420
- \`\`\``,category:`integrations`}];export{e as n,t};
8459
+ \`\`\``,category:`integrations`}],n=[`add-skill`,`agent-canvas-environment`,`agent-memory`,`agent-sdk-builder`,`code-review`,`docker`,`github`,`openhands-api`,`openhands-automation`,`openhands-sdk`,`skill-creator`];export{t as n,e as r,n as t};
@@ -1 +1 @@
1
- import{yt as e}from"./vendor-styling-Ck5D_A2Q.js";import{U as t}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ox0jfsa0-cHFhpUBq.js";import{t as n}from"./sdk-section-page-HTffvm7Q.js";var r=e(),i=new Set([`verification.confirmation_mode`,`verification.security_analyzer`]);function a({scope:e=`personal`,renderTopContent:t,testId:a=`verification-settings-screen`}){return(0,r.jsx)(n,{scope:e,settingsSources:[{settingsSource:`conversation_settings`,sectionKeys:[`verification`]},{settingsSource:`agent_settings`,sectionKeys:[`verification`],excludeKeys:i}],header:t?()=>t():void 0,testId:a})}var o=t(a);export{o as default};
1
+ import{yt as e}from"./vendor-styling-Ck5D_A2Q.js";import{U as t}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~i58xkef6-cHFhpUBq.js";import{t as n}from"./sdk-section-page-BlFiizlG.js";var r=e(),i=new Set([`verification.confirmation_mode`,`verification.security_analyzer`]);function a({scope:e=`personal`,renderTopContent:t,testId:a=`verification-settings-screen`}){return(0,r.jsx)(n,{scope:e,settingsSources:[{settingsSource:`conversation_settings`,sectionKeys:[`verification`]},{settingsSource:`agent_settings`,sectionKeys:[`verification`],excludeKeys:i}],header:t?()=>t():void 0,testId:a})}var o=t(a);export{o as default};
@@ -1 +1 @@
1
- import{D as e}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kepq2zme-ZixYGy6E.js";var t=e(`git-pull-request`,[[`circle`,{cx:`18`,cy:`18`,r:`3`,key:`1xkwt0`}],[`circle`,{cx:`6`,cy:`6`,r:`3`,key:`1lh9wr`}],[`path`,{d:`M13 6h3a2 2 0 0 1 2 2v7`,key:`1yeb86`}],[`line`,{x1:`6`,x2:`6`,y1:`9`,y2:`21`,key:`rroup`}]]),n=e(`workflow`,[[`rect`,{width:`8`,height:`8`,x:`3`,y:`3`,rx:`2`,key:`by2w9f`}],[`path`,{d:`M7 11v4a2 2 0 0 0 2 2h4`,key:`xkn7yn`}],[`rect`,{width:`8`,height:`8`,x:`13`,y:`13`,rx:`2`,key:`1cgmvn`}]]),r=e(`wrench`,[[`path`,{d:`M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z`,key:`1ngwbx`}]]);export{n,t as r,r as t};
1
+ import{D as e}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-DqZDXfg2.js";var t=e(`git-pull-request`,[[`circle`,{cx:`18`,cy:`18`,r:`3`,key:`1xkwt0`}],[`circle`,{cx:`6`,cy:`6`,r:`3`,key:`1lh9wr`}],[`path`,{d:`M13 6h3a2 2 0 0 1 2 2v7`,key:`1yeb86`}],[`line`,{x1:`6`,x2:`6`,y1:`9`,y2:`21`,key:`rroup`}]]),n=e(`workflow`,[[`rect`,{width:`8`,height:`8`,x:`3`,y:`3`,rx:`2`,key:`by2w9f`}],[`path`,{d:`M7 11v4a2 2 0 0 0 2 2h4`,key:`xkn7yn`}],[`rect`,{width:`8`,height:`8`,x:`13`,y:`13`,rx:`2`,key:`1cgmvn`}]]),r=e(`wrench`,[[`path`,{d:`M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.106-3.105c.32-.322.863-.22.983.218a6 6 0 0 1-8.259 7.057l-7.91 7.91a1 1 0 0 1-2.999-3l7.91-7.91a6 6 0 0 1 7.057-8.259c.438.12.54.662.219.984z`,key:`1ngwbx`}]]);export{n,t as r,r as t};
@@ -1 +1 @@
1
- import{D as e}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kepq2zme-ZixYGy6E.js";var t=e(`search`,[[`path`,{d:`m21 21-4.34-4.34`,key:`14j7rj`}],[`circle`,{cx:`11`,cy:`11`,r:`8`,key:`4ej97u`}]]),n=e(`x`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]);export{t as n,n as t};
1
+ import{D as e}from"./vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-DqZDXfg2.js";var t=e(`search`,[[`path`,{d:`m21 21-4.34-4.34`,key:`14j7rj`}],[`circle`,{cx:`11`,cy:`11`,r:`8`,key:`4ej97u`}]]),n=e(`x`,[[`path`,{d:`M18 6 6 18`,key:`1bl5f8`}],[`path`,{d:`m6 6 12 12`,key:`d8bk6v`}]]);export{t as n,n as t};
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="icon" type="image/svg+xml" href="/favicon.svg"/><link rel="modulepreload" href="/assets/manifest-58597dde.js"/><link rel="modulepreload" href="/assets/entry.client-C7Bi2tkU.js"/><link rel="modulepreload" href="/assets/rolldown-runtime-Cyuzqnbw.js"/><link rel="modulepreload" href="/assets/vendor-styling-Ck5D_A2Q.js"/><link rel="modulepreload" href="/assets/active-backend-context-DKFSMbn3.js"/><link rel="modulepreload" href="/assets/vendor~entry.client-BaKt_PIp.js"/><link rel="modulepreload" href="/assets/providers-FfSZ5TXP.js"/><link rel="modulepreload" href="/assets/vendor~entry.client-BFE7Llz9.js"/><link rel="modulepreload" href="/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kepq2zme-ZixYGy6E.js"/><link rel="modulepreload" href="/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ox0jfsa0-cHFhpUBq.js"/><link rel="modulepreload" href="/assets/utils-DaCIEEQP.js"/><link rel="modulepreload" href="/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew3u153i-rfV8mQ9m.js"/><link rel="modulepreload" href="/assets/agent-server-ui-style-scope-DdG0ZAHu.js"/><link rel="modulepreload" href="/assets/root-ZKKYPR1Z.js"/><link rel="modulepreload" href="/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iw7io29p-Dz-MAyNb.js"/><link rel="modulepreload" href="/assets/useQuery-BXWbZBZl.js"/><link rel="modulepreload" href="/assets/use-config-Bft35DOK.js"/><link rel="modulepreload" href="/assets/use-onboarding-completion-BXpyUSsJ.js"/><link rel="modulepreload" href="/assets/brand-button-Dxv6PDeN.js"/><link rel="modulepreload" href="/assets/base-modal-C7_BDl_U.js"/><link rel="modulepreload" href="/assets/loading-spinner-0L3ZTToZ.js"/><link rel="modulepreload" href="/assets/modal-backdrop-BSzNhM4r.js"/><link rel="modulepreload" href="/assets/modal-body-CMOc2tLl.js"/><link rel="modulepreload" href="/assets/navigation-context-CQZwH_tC.js"/><link rel="modulepreload" href="/assets/use-save-settings-CUZW6yXP.js"/><link rel="modulepreload" href="/assets/use-settings-C5VhGpqd.js"/><link rel="modulepreload" href="/assets/color-themes-DTj5Ylbr.js"/><link rel="modulepreload" href="/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-Dtu7BpYk.js"/><link rel="modulepreload" href="/assets/useQueries-BhbrGEf1.js"/><link rel="modulepreload" href="/assets/organization-service.api-C8XpQ0pM.js"/><link rel="modulepreload" href="/assets/proxy-tcFL2yTQ.js"/><link rel="modulepreload" href="/assets/form-control-classes-CGw40z5h.js"/><link rel="modulepreload" href="/assets/modal-classes-BAb4Y_BG.js"/><link rel="modulepreload" href="/assets/useMutation-DFnzkf6f.js"/><link rel="modulepreload" href="/assets/use-tracking-D5t9otIF.js"/><link rel="modulepreload" href="/assets/settings-service.api-B2agVfjL.js"/><link rel="modulepreload" href="/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-DonTKfQD.js"/><link rel="modulepreload" href="/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~jz4f6vo2-BgxDvUcf.js"/><link rel="modulepreload" href="/assets/bot-C-0Wu7vQ.js"/><link rel="modulepreload" href="/assets/settings-DcNPxz0v.js"/><link rel="stylesheet" href="/assets/root-BLeQfBEq.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="icon" type="image/svg+xml" href="/favicon.svg"/><link rel="modulepreload" href="/assets/manifest-80fb1c29.js"/><link rel="modulepreload" href="/assets/entry.client-CqyPPjOq.js"/><link rel="modulepreload" href="/assets/rolldown-runtime-Cyuzqnbw.js"/><link rel="modulepreload" href="/assets/vendor-styling-Ck5D_A2Q.js"/><link rel="modulepreload" href="/assets/active-backend-context-CrHTlgvN.js"/><link rel="modulepreload" href="/assets/vendor~entry.client-DA2izTjq.js"/><link rel="modulepreload" href="/assets/providers-BhMcY5nv.js"/><link rel="modulepreload" href="/assets/vendor~entry.client-CoCfUXUF.js"/><link rel="modulepreload" href="/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-DqZDXfg2.js"/><link rel="modulepreload" href="/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~i58xkef6-cHFhpUBq.js"/><link rel="modulepreload" href="/assets/utils-CN5ZfZy1.js"/><link rel="modulepreload" href="/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-rfV8mQ9m.js"/><link rel="modulepreload" href="/assets/agent-server-ui-style-scope-DdG0ZAHu.js"/><link rel="modulepreload" href="/assets/root-Dc8YmC9F.js"/><link rel="modulepreload" href="/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iyia17eu-Chf7vmKB.js"/><link rel="modulepreload" href="/assets/useQuery-BSTgq1rl.js"/><link rel="modulepreload" href="/assets/use-config-A9QovgXO.js"/><link rel="modulepreload" href="/assets/use-onboarding-completion-D8U7k4Qb.js"/><link rel="modulepreload" href="/assets/brand-button-BAfk4wGP.js"/><link rel="modulepreload" href="/assets/base-modal-D_L0oEbG.js"/><link rel="modulepreload" href="/assets/loading-spinner-BY9N3pOe.js"/><link rel="modulepreload" href="/assets/modal-backdrop-BSzNhM4r.js"/><link rel="modulepreload" href="/assets/modal-body-BxZjsju9.js"/><link rel="modulepreload" href="/assets/navigation-context-CQZwH_tC.js"/><link rel="modulepreload" href="/assets/use-save-settings-DYqkKv7T.js"/><link rel="modulepreload" href="/assets/use-settings-DSXLbvBl.js"/><link rel="modulepreload" href="/assets/color-themes-DTj5Ylbr.js"/><link rel="modulepreload" href="/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~nj1hli3r-DP9wmsjo.js"/><link rel="modulepreload" href="/assets/useQueries-DlbhlH9I.js"/><link rel="modulepreload" href="/assets/organization-service.api-DrYNkEN_.js"/><link rel="modulepreload" href="/assets/proxy-9Fe1v5na.js"/><link rel="modulepreload" href="/assets/form-control-classes-Bkh5FGrD.js"/><link rel="modulepreload" href="/assets/modal-classes-C8eycCwG.js"/><link rel="modulepreload" href="/assets/useMutation-B-qc391N.js"/><link rel="modulepreload" href="/assets/use-tracking-D53y3TH9.js"/><link rel="modulepreload" href="/assets/settings-service.api-DJ1r62Zr.js"/><link rel="modulepreload" href="/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-CUmIwQCN.js"/><link rel="modulepreload" href="/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~jz4f6vo2-C7HiY4Ae.js"/><link rel="modulepreload" href="/assets/bot-dMYHVfYM.js"/><link rel="modulepreload" href="/assets/settings-CKqk8ZnH.js"/><link rel="stylesheet" href="/assets/root-VDaypvK4.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,"v8_passThroughRequests":false,"v8_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-58597dde.js";
9
- import * as route0 from "/assets/root-ZKKYPR1Z.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,"v8_passThroughRequests":false,"v8_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-80fb1c29.js";
9
+ import * as route0 from "/assets/root-Dc8YmC9F.js";
10
10
 
11
11
  window.__reactRouterRouteModules = {"root":route0};
12
12
 
13
- import("/assets/entry.client-C7Bi2tkU.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-CqyPPjOq.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>