@openhands/agent-canvas 1.8.0 → 1.9.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 (492) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/{Trans-B7lYw4uD.js → Trans-Bwpzk1wT.js} +1 -1
  4. package/build/assets/{acp-providers-WUD4tfSq.js → acp-providers-C921BlYB.js} +1 -1
  5. package/build/assets/active-backend-context-BiwzkzDy.js +2 -0
  6. package/build/assets/agent-context-settings-DXNT_dcw.js +1 -0
  7. package/build/assets/agent-profiles-settings-BymJf3EP.js +1 -0
  8. package/build/assets/agent-server-conversation-service.api-CYSWw-2g.js +41 -0
  9. package/build/assets/agent-settings-BjgQQe-_.js +1 -0
  10. package/build/assets/{agent-settings-BGTyoT6X.js → agent-settings-WzqXk6B4.js} +2 -2
  11. package/build/assets/{alert-banner-eRyIwDyU.js → alert-banner-DR8EVyZM.js} +1 -1
  12. package/build/assets/api-error-message-e16L1kwH.js +1 -0
  13. package/build/assets/{api-key-entry-screen-JOx3SH1-.js → api-key-entry-screen-DI0I04O3.js} +1 -1
  14. package/build/assets/{app-settings-D53QZy5p.js → app-settings-DGistSFV.js} +1 -1
  15. package/build/assets/automation-C_eCrGyP.js +1 -0
  16. package/build/assets/automation-detail-DY6x2FW1.js +2 -0
  17. package/build/assets/automation-export-C09f-Lua.js +2 -0
  18. package/build/assets/automation-setup-route-CqKp0717.js +1 -0
  19. package/build/assets/automations-list-CqWJ7qXW.js +1 -0
  20. package/build/assets/{back-nav-button-C02hGa8t.js → back-nav-button-D4ngzpSh.js} +1 -1
  21. package/build/assets/backend-form-modal-B8D5hBzK.js +1 -0
  22. package/build/assets/{backend-synced-settings-badge-CQ9xtNWm.js → backend-synced-settings-badge-BnzI8Ysj.js} +1 -1
  23. package/build/assets/{badge-CzXbf7tR.js → badge-1Mf1iPcX.js} +1 -1
  24. package/build/assets/{base-modal-DkVyzFMt.js → base-modal-BBuy0WQQ.js} +1 -1
  25. package/build/assets/{brand-button-BUlDL-mz.js → brand-button-DGN6Y9o6.js} +1 -1
  26. package/build/assets/browser-D_ekTlTS.js +6 -0
  27. package/build/assets/{browser-tab-BijpUbdt.js → browser-tab-D4a4Ou_w.js} +1 -1
  28. package/build/assets/{chat-send-button-BKsVjhtA.js → chat-send-button-CgbcjD97.js} +1 -1
  29. package/build/assets/check-CPLXgluF.js +1 -0
  30. package/build/assets/chevron-down-CP4QHvyc.js +1 -0
  31. package/build/assets/circle-check-Dpy2_xSI.js +1 -0
  32. package/build/assets/{circle-plus-check-toggle-DdjUiOo1.js → circle-plus-check-toggle-yTAS-nX3.js} +1 -1
  33. package/build/assets/cloud-funnel-analytics-CEOl5Gxr.js +1 -0
  34. package/build/assets/{combobox-caret-Dl9UtvD6.js → combobox-caret-Bd2yySnF.js} +1 -1
  35. package/build/assets/command-menu-Bj6X4ckE.js +1 -0
  36. package/build/assets/condenser-settings-EAXQNR2E.js +1 -0
  37. package/build/assets/{confirmation-modal-CRBJSllP.js → confirmation-modal-NCUPr2-O.js} +1 -1
  38. package/build/assets/{context-menu-list-item-FGaafXGh.js → context-menu-list-item-CrCrYuPF.js} +1 -1
  39. package/build/assets/conversation-BzyIcSwr.js +1 -0
  40. package/build/assets/conversation-CUJ0Vo8g.js +90 -0
  41. package/build/assets/conversation-panel-BzyIcSwr.js +1 -0
  42. package/build/assets/conversation-state-store-F62HvuI1.js +1 -0
  43. package/build/assets/{conversation-tab-empty-state-CDjvNgpG.js → conversation-tab-empty-state-BCZ7rUMH.js} +1 -1
  44. package/build/assets/{copy-Drwu97Gx.js → copy-DCmZtz6n.js} +1 -1
  45. package/build/assets/{copy-to-clipboard-button-NbN1clVr.js → copy-to-clipboard-button-D_Lp6-Fl.js} +1 -1
  46. package/build/assets/{device-verify-CDm_WrVu.js → device-verify-DLmolX8Q.js} +1 -1
  47. package/build/assets/{dropdown-classes-CqA2BTCL.js → dropdown-classes-BB8rzqXL.js} +1 -1
  48. package/build/assets/{entry.client-BO2KQj0y.js → entry.client-BbIYOsIg.js} +2 -2
  49. package/build/assets/{enum-filter-dropdown-DSqPZnsD.js → enum-filter-dropdown-C08-srev.js} +1 -1
  50. package/build/assets/{environment-switch-overlay-mGl2pqqx.js → environment-switch-overlay-BepBBX66.js} +1 -1
  51. package/build/assets/{extensions-hub-Br3Lgynp.js → extensions-hub-R3KNv-5V.js} +1 -1
  52. package/build/assets/{extensions-navigation-BQmstKDZ.js → extensions-navigation-CfWFmI1I.js} +1 -1
  53. package/build/assets/{external-link-D9B2QMPf.js → external-link-BdBSg8rk.js} +1 -1
  54. package/build/assets/files-tab-DEq8MbHu.js +1 -0
  55. package/build/assets/{form-control-classes-CtVAktAy.js → form-control-classes-DAfsCJTe.js} +1 -1
  56. package/build/assets/{format-time-delta-DICE64sz.js → format-time-delta-CxfPJpzC.js} +1 -1
  57. package/build/assets/git-provider-icon-BZqqUPlm.js +1 -0
  58. package/build/assets/git-repo-dropdown-9WKINV6J.js +1 -0
  59. package/build/assets/git-repo-dropdown-DEpOwUez.js +1 -0
  60. package/build/assets/{highlighted-source-view-KMsA9c4a.js → highlighted-source-view-CX9oIoVT.js} +1 -1
  61. package/build/assets/home-CY0JaxiY.js +1 -0
  62. package/build/assets/home-CaNWlVvB.js +1 -0
  63. package/build/assets/home-store-Ch1ErdBc.js +1 -0
  64. package/build/assets/index-home-CaNWlVvB.js +1 -0
  65. package/build/assets/info-CmWQXtRQ.js +1 -0
  66. package/build/assets/install-server-modal-BWrudmZU.js +1 -0
  67. package/build/assets/{launch-DjkKw55l.js → launch-B1POpHuP.js} +1 -1
  68. package/build/assets/{list-todo-BpAf7aOT.js → list-todo-DtiL3lTp.js} +1 -1
  69. package/build/assets/llm-not-configured-banner-3tMsM4K6.js +27 -0
  70. package/build/assets/{llm-settings-D8zNkIlP.js → llm-settings-CXo8iPNW.js} +1 -1
  71. package/build/assets/llm-settings-D0W8mJDk.js +1 -0
  72. package/build/assets/{llm-subscription-service-COTgZc1C.js → llm-subscription-service-DBJbfd8Z.js} +1 -1
  73. package/build/assets/loader-circle-B4QDBARx.js +1 -0
  74. package/build/assets/{loading-spinner-DRFyh6Iy.js → loading-spinner-DfZ_bhV7.js} +1 -1
  75. package/build/assets/{manage-backends-modal-DiRWE3tJ.js → manage-backends-modal-CwyWsiag.js} +1 -1
  76. package/build/assets/manifest-39f4789d.js +1 -0
  77. package/build/assets/markdown-renderer-DgiLLhW6.js +8 -0
  78. package/build/assets/mcp-DXG9LWrI.js +9 -0
  79. package/build/assets/mcp-marketplace-utils-DFmhKc5s.js +1 -0
  80. package/build/assets/messages-kBjKaAeA.js +40 -0
  81. package/build/assets/{modal-body-C3bGicn4.js → modal-body-CMsDpalT.js} +1 -1
  82. package/build/assets/{modal-classes-DFFO6BMU.js → modal-classes-B6PDrxXo.js} +1 -1
  83. package/build/assets/{modal-close-button-vxkAIRyZ.js → modal-close-button-DyxBZaAb.js} +1 -1
  84. package/build/assets/{onboarding-DWuFieEA.js → onboarding-47hh2IHA.js} +1 -1
  85. package/build/assets/{onboarding-modal-C8m72Dpb.js → onboarding-modal-9BuvvROo.js} +1 -1
  86. package/build/assets/{organization-service.api-CQ73CB-S.js → organization-service.api-UDy63-oC.js} +1 -1
  87. package/build/assets/{pencil-DzW2GB2M.js → pencil-BjgtZmWp.js} +1 -1
  88. package/build/assets/{planner-tab-YG0bGxDY.js → planner-tab-BWk8885v.js} +1 -1
  89. package/build/assets/{plugins-management-service-ijhH8OSh.js → plugins-management-service-CjkgF2dd.js} +1 -1
  90. package/build/assets/plus-DrKuuvMe.js +1 -0
  91. package/build/assets/{profiles-service.api-C32pPm70.js → profiles-service.api-CukSFLzz.js} +1 -1
  92. package/build/assets/{providers-DuSn9s2i.js → providers-CqUWC85T.js} +1 -1
  93. package/build/assets/{proxy-BiyDhMBd.js → proxy-BBUG3sd2.js} +1 -1
  94. package/build/assets/{puzzle-DlqT0yvr.js → puzzle-BoNc6zZ8.js} +1 -1
  95. package/build/assets/recommended-automations-launcher-ejxy1P27.js +1 -0
  96. package/build/assets/{refresh-cw-Br5254f4.js → refresh-cw-BrM5ZAZD.js} +1 -1
  97. package/build/assets/root-5S-M8SYa.js +2 -0
  98. package/build/assets/root-DZ39lS5f.css +1 -0
  99. package/build/assets/root-layout-BPqoa0gv.js +3 -0
  100. package/build/assets/{schema-field-htfNouTG.js → schema-field-nImDoY6-.js} +1 -1
  101. package/build/assets/{sdk-section-page-D0K1dBQY.js → sdk-section-page-BxMrtUNV.js} +1 -1
  102. package/build/assets/search-Dc2qR4O2.js +1 -0
  103. package/build/assets/{secrets-service-Dbv5Zb8G.js → secrets-service-Dhjh3HhH.js} +1 -1
  104. package/build/assets/{secrets-settings-Da4SSaX9.js → secrets-settings-CPdxceT_.js} +1 -1
  105. package/build/assets/segmented-toggle-Do6oyepX.js +1 -0
  106. package/build/assets/{settings-F4a09IxY.js → settings-BRbnfKEm.js} +1 -1
  107. package/build/assets/{settings-dropdown-input-jOiv5Yrk.js → settings-dropdown-input-DYCULKpp.js} +1 -1
  108. package/build/assets/{settings-index-CyJBf5NA.js → settings-index-C9o2NBO0.js} +1 -1
  109. package/build/assets/settings-input-B-q2gkVy.js +1 -0
  110. package/build/assets/{settings-list-classes-VqMzkYYt.js → settings-list-classes-WpQi0q1L.js} +1 -1
  111. package/build/assets/{settings-modal-C-S1NpbC.js → settings-modal-CEK0AIx6.js} +1 -1
  112. package/build/assets/{settings-service.api-CTJRrvMu.js → settings-service.api-CZiPD8__.js} +1 -1
  113. package/build/assets/{settings-switch-B405oU_v.js → settings-switch-LqKdGxHL.js} +1 -1
  114. package/build/assets/shared-conversation-Bu-dQlgp.js +1 -0
  115. package/build/assets/{sidebar-layout-BGMuyC86.js → sidebar-layout-oHBGQmLh.js} +1 -1
  116. package/build/assets/{sidebar-mobile-menu-toggle-xiKoUfGa.js → sidebar-mobile-menu-toggle-ND-hgygu.js} +1 -1
  117. package/build/assets/{sidebar-nav-link-DA4_ct9G.js → sidebar-nav-link-CrujNA09.js} +1 -1
  118. package/build/assets/{sidebar-store-FRJ3rADB.js → sidebar-store-Bui-WNEr.js} +1 -1
  119. package/build/assets/{skill-card-pill-row-BMdhr_sd.js → skill-card-pill-row-CZBI7OqH.js} +1 -1
  120. package/build/assets/{skill-icon-badge-CGUkgcVH.js → skill-icon-badge-BOov_phZ.js} +1 -1
  121. package/build/assets/{skills-plugins-C5eJnyft.js → skills-plugins-D0PiHWAD.js} +1 -1
  122. package/build/assets/{skills-settings-pUxMr6WZ.js → skills-settings-B43KArIz.js} +2 -2
  123. package/build/assets/{styled-tooltip-B3kIdVyH.js → styled-tooltip-C7grwnOX.js} +1 -1
  124. package/build/assets/{task-list-tab-B3k4W1cK.js → task-list-tab-R3ac6m7O.js} +1 -1
  125. package/build/assets/{terminal-CBI_41Zc.js → terminal-yqkNdEAx.js} +1 -1
  126. package/build/assets/{toggle-switch-DYRr9CAR.js → toggle-switch-BeSrbgCg.js} +1 -1
  127. package/build/assets/{trash-2-gZPlx23R.js → trash-2-wW5TWcdN.js} +1 -1
  128. package/build/assets/{typography-B1UxuuEC.js → typography-iYhzLlHO.js} +1 -1
  129. package/build/assets/{use-acp-credential-form-CjSvKWFH.js → use-acp-credential-form-DUxbxmbq.js} +1 -1
  130. package/build/assets/{use-activate-agent-profile-DCRf47e-.js → use-activate-agent-profile-CDHA52tC.js} +1 -1
  131. package/build/assets/use-agent-profiles-TsOdIyw5.js +1 -0
  132. package/build/assets/{use-can-manage-org-profiles-vBiP7rHF.js → use-can-manage-org-profiles-Bt1M71u5.js} +1 -1
  133. package/build/assets/{use-cloud-current-user-id-BMq9gw93.js → use-cloud-current-user-id-DWt7HCgf.js} +1 -1
  134. package/build/assets/use-config-CxlEdf_v.js +1 -0
  135. package/build/assets/{use-create-conversation-CakhLF0X.js → use-create-conversation-nOJ6Um5h.js} +1 -1
  136. package/build/assets/{use-create-secret-RT4QtSS9.js → use-create-secret-Dj5ang9x.js} +1 -1
  137. package/build/assets/use-is-authed-BT7Iud4U.js +1 -0
  138. package/build/assets/{use-is-creating-conversation-CIAcnd8M.js → use-is-creating-conversation-CAggrM75.js} +1 -1
  139. package/build/assets/use-llm-profiles-2Wc2db8u.js +1 -0
  140. package/build/assets/{use-onboarding-completion-CJU4MNAY.js → use-onboarding-completion-gxQlcEy2.js} +1 -1
  141. package/build/assets/{use-plugins-marketplace-D-93nqtJ.js → use-plugins-marketplace-CVO7sXYR.js} +1 -1
  142. package/build/assets/use-save-agent-profile-D0wC5ExW.js +1 -0
  143. package/build/assets/{use-save-settings--C6LZXfI.js → use-save-settings-L3aMaDeS.js} +1 -1
  144. package/build/assets/{use-settings-DIAo5KFk.js → use-settings-8nt3DGxW.js} +1 -1
  145. package/build/assets/use-settings-nav-items-DHAAD-zk.js +16 -0
  146. package/build/assets/{use-skills-D_mLhYNa.js → use-skills-CE6miQ3r.js} +1 -1
  147. package/build/assets/use-tracking-BGboadaZ.js +68 -0
  148. package/build/assets/{use-user-conversation-DhcAEyJX.js → use-user-conversation-BIIpGUgM.js} +1 -1
  149. package/build/assets/useInfiniteQuery-BLRVmVPU.js +1 -0
  150. package/build/assets/{useMutation-DHLpZ6J0.js → useMutation-CaSHLnX0.js} +1 -1
  151. package/build/assets/{useQueries-B3T1a7qt.js → useQueries--d_WWAzc.js} +1 -1
  152. package/build/assets/{useQuery-B38jBavx.js → useQuery-DiPh8LRJ.js} +1 -1
  153. package/build/assets/utils-BgGG1znF.js +1 -0
  154. package/build/assets/{vendor~browser-CIoZCqGs.js → vendor~browser-IVYgIgG1.js} +1 -1
  155. package/build/assets/{vendor~entry.client-Di4qO77Y.js → vendor~entry.client-BcYIVQvB.js} +1 -1
  156. package/build/assets/{vendor~entry.client-BfviqoVc.js → vendor~entry.client-CXM9oiAk.js} +1 -1
  157. package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~g4xrpilz-CYPMCkX1.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~b0bpqexo-CbTboogo.js} +1 -1
  158. package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~f9xdmd0z-DLMP7bZx.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~d4by102p-C2f0ZhS-.js} +1 -1
  159. package/build/assets/{vendor~files-tab-atebg0iG.js → vendor~files-tab-C7RmQJwN.js} +1 -1
  160. package/build/assets/{vendor~index-home~home~conversation-panel~conversation-G9DMrR7m.js → vendor~index-home~home~conversation-panel~conversation-Bqp1ZqJM.js} +1 -1
  161. package/build/assets/{vendor~root-layout~conversation-panel~conversation-DEhW1h3I.js → vendor~root-layout~conversation-panel~conversation-BCn8lzeG.js} +1 -1
  162. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~automation-setup-route-B_L-gcOG.js +1 -0
  163. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-sjx0x5ac.js +1 -0
  164. package/build/assets/vendor~root-layout~index-home~home~mcp~automations-list~automation-setup-route~onboarding-modal-D7IDevqN.js +1 -0
  165. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~bi2r7bko-VFnwct3q.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~dfc8ddxy-tTyxnjXT.js} +1 -1
  166. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hakxo2tj-ClV0p9g3.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~gy8zbn65-CGt6bWRT.js} +1 -1
  167. package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation~launch~skills-settings~a~eywn6ulz-BKxxr74w.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~dufan6ng-Dtdw8H0q.js} +17 -4
  168. package/build/assets/{verification-settings-Vr5cN4md.js → verification-settings-DBsnSXC3.js} +1 -1
  169. package/build/assets/x-omAzpXkl.js +1 -0
  170. package/build/index.html +4 -4
  171. package/build/locales/ar/openhands.json +37 -2
  172. package/build/locales/ca/openhands.json +37 -2
  173. package/build/locales/de/openhands.json +37 -2
  174. package/build/locales/en/openhands.json +38 -3
  175. package/build/locales/es/openhands.json +37 -2
  176. package/build/locales/fr/openhands.json +37 -2
  177. package/build/locales/it/openhands.json +37 -2
  178. package/build/locales/ja/openhands.json +37 -2
  179. package/build/locales/ko-KR/openhands.json +37 -2
  180. package/build/locales/no/openhands.json +37 -2
  181. package/build/locales/pt/openhands.json +37 -2
  182. package/build/locales/tr/openhands.json +37 -2
  183. package/build/locales/uk/openhands.json +37 -2
  184. package/build/locales/zh-CN/openhands.json +37 -2
  185. package/build/locales/zh-TW/openhands.json +37 -2
  186. package/config/defaults.json +1 -1
  187. package/dist/api/agent-server-adapter.cjs +3 -3
  188. package/dist/api/agent-server-adapter.cjs.map +1 -1
  189. package/dist/api/agent-server-adapter.d.ts +46 -6
  190. package/dist/api/agent-server-adapter.js +187 -168
  191. package/dist/api/agent-server-adapter.js.map +1 -1
  192. package/dist/api/agent-server-compatibility.cjs +1 -1
  193. package/dist/api/agent-server-compatibility.cjs.map +1 -1
  194. package/dist/api/agent-server-compatibility.d.ts +4 -0
  195. package/dist/api/agent-server-compatibility.js +41 -38
  196. package/dist/api/agent-server-compatibility.js.map +1 -1
  197. package/dist/api/automation-service/automation-service.api.cjs +1 -1
  198. package/dist/api/automation-service/automation-service.api.cjs.map +1 -1
  199. package/dist/api/automation-service/automation-service.api.d.ts +20 -0
  200. package/dist/api/automation-service/automation-service.api.js +99 -62
  201. package/dist/api/automation-service/automation-service.api.js.map +1 -1
  202. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.cjs +2 -0
  203. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.cjs.map +1 -0
  204. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.d.ts +12 -0
  205. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.js +94 -0
  206. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.js.map +1 -0
  207. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs +1 -1
  208. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map +1 -1
  209. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js +31 -90
  210. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
  211. package/dist/components/features/automations/recommended-automations-launcher.d.ts +0 -7
  212. package/dist/components/features/automations/recommended-automations-section.d.ts +0 -6
  213. package/dist/components/features/backends/backend-form-modal.cjs +1 -1
  214. package/dist/components/features/backends/backend-form-modal.cjs.map +1 -1
  215. package/dist/components/features/backends/backend-form-modal.js +568 -358
  216. package/dist/components/features/backends/backend-form-modal.js.map +1 -1
  217. package/dist/components/features/backends/device-flow-auth.cjs +1 -1
  218. package/dist/components/features/backends/device-flow-auth.cjs.map +1 -1
  219. package/dist/components/features/backends/device-flow-auth.d.ts +9 -1
  220. package/dist/components/features/backends/device-flow-auth.js +56 -55
  221. package/dist/components/features/backends/device-flow-auth.js.map +1 -1
  222. package/dist/components/features/backends/manage-backends-modal.cjs +1 -1
  223. package/dist/components/features/backends/manage-backends-modal.cjs.map +1 -1
  224. package/dist/components/features/backends/manage-backends-modal.js +1 -1
  225. package/dist/components/features/backends/manage-backends-modal.js.map +1 -1
  226. package/dist/components/features/chat/chat-interface.cjs +1 -1
  227. package/dist/components/features/chat/chat-interface.cjs.map +1 -1
  228. package/dist/components/features/chat/chat-interface.js +105 -105
  229. package/dist/components/features/chat/chat-interface.js.map +1 -1
  230. package/dist/components/features/chat/chat-message.cjs +1 -1
  231. package/dist/components/features/chat/chat-message.cjs.map +1 -1
  232. package/dist/components/features/chat/chat-message.d.ts +2 -1
  233. package/dist/components/features/chat/chat-message.js +59 -49
  234. package/dist/components/features/chat/chat-message.js.map +1 -1
  235. package/dist/components/features/chat/pending-user-messages.cjs +1 -1
  236. package/dist/components/features/chat/pending-user-messages.cjs.map +1 -1
  237. package/dist/components/features/chat/pending-user-messages.js +4 -1
  238. package/dist/components/features/chat/pending-user-messages.js.map +1 -1
  239. package/dist/components/features/chat/typing-indicator.cjs +1 -1
  240. package/dist/components/features/chat/typing-indicator.cjs.map +1 -1
  241. package/dist/components/features/chat/typing-indicator.d.ts +8 -1
  242. package/dist/components/features/chat/typing-indicator.js +94 -10
  243. package/dist/components/features/chat/typing-indicator.js.map +1 -1
  244. package/dist/components/features/command-menu/command-menu-items.d.ts +5 -1
  245. package/dist/components/features/files-tab/segmented-toggle.cjs +1 -1
  246. package/dist/components/features/files-tab/segmented-toggle.cjs.map +1 -1
  247. package/dist/components/features/files-tab/segmented-toggle.d.ts +2 -0
  248. package/dist/components/features/files-tab/segmented-toggle.js +17 -14
  249. package/dist/components/features/files-tab/segmented-toggle.js.map +1 -1
  250. package/dist/components/features/manifest/manifest-form-field.d.ts +27 -0
  251. package/dist/components/features/manifest/manifest-prerequisites-step.d.ts +11 -0
  252. package/dist/components/features/manifest/manifest-review-step.d.ts +14 -0
  253. package/dist/components/features/manifest/manifest-setup-dialog.d.ts +14 -0
  254. package/dist/components/features/settings/settings-input.cjs +1 -1
  255. package/dist/components/features/settings/settings-input.cjs.map +1 -1
  256. package/dist/components/features/settings/settings-input.d.ts +6 -0
  257. package/dist/components/features/settings/settings-input.js +13 -8
  258. package/dist/components/features/settings/settings-input.js.map +1 -1
  259. package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
  260. package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
  261. package/dist/components/features/sidebar/sidebar-rail-body.js +124 -123
  262. package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
  263. package/dist/config/defaults.cjs +1 -1
  264. package/dist/config/defaults.cjs.map +1 -1
  265. package/dist/config/defaults.js +1 -1
  266. package/dist/config/defaults.js.map +1 -1
  267. package/dist/hooks/query/query-keys.cjs.map +1 -1
  268. package/dist/hooks/query/query-keys.d.ts +4 -0
  269. package/dist/hooks/query/query-keys.js.map +1 -1
  270. package/dist/hooks/query/use-manifest-capabilities.d.ts +21 -0
  271. package/dist/hooks/query/use-manifest-prerequisites.d.ts +24 -0
  272. package/dist/hooks/use-llm-configured.cjs +1 -1
  273. package/dist/hooks/use-llm-configured.cjs.map +1 -1
  274. package/dist/hooks/use-llm-configured.js +2 -1
  275. package/dist/hooks/use-llm-configured.js.map +1 -1
  276. package/dist/hooks/use-manifest-preflight.d.ts +18 -0
  277. package/dist/hooks/use-tracking.cjs +1 -1
  278. package/dist/hooks/use-tracking.cjs.map +1 -1
  279. package/dist/hooks/use-tracking.d.ts +14 -0
  280. package/dist/hooks/use-tracking.js +19 -1
  281. package/dist/hooks/use-tracking.js.map +1 -1
  282. package/dist/i18n/declaration.cjs +1 -1
  283. package/dist/i18n/declaration.cjs.map +1 -1
  284. package/dist/i18n/declaration.d.ts +36 -1
  285. package/dist/i18n/declaration.js +1 -1
  286. package/dist/i18n/declaration.js.map +1 -1
  287. package/dist/i18n/translation.cjs +2 -2
  288. package/dist/i18n/translation.cjs.map +1 -1
  289. package/dist/i18n/translation.js +611 -16
  290. package/dist/i18n/translation.js.map +1 -1
  291. package/dist/icons/external-link.cjs +2 -0
  292. package/dist/icons/external-link.cjs.map +1 -0
  293. package/dist/icons/external-link.js +22 -0
  294. package/dist/icons/external-link.js.map +1 -0
  295. package/dist/icons/server.cjs +2 -0
  296. package/dist/icons/server.cjs.map +1 -0
  297. package/dist/icons/server.js +17 -0
  298. package/dist/icons/server.js.map +1 -0
  299. package/dist/locales/ar/openhands.json +37 -2
  300. package/dist/locales/ca/openhands.json +37 -2
  301. package/dist/locales/de/openhands.json +37 -2
  302. package/dist/locales/en/openhands.json +38 -3
  303. package/dist/locales/es/openhands.json +37 -2
  304. package/dist/locales/fr/openhands.json +37 -2
  305. package/dist/locales/it/openhands.json +37 -2
  306. package/dist/locales/ja/openhands.json +37 -2
  307. package/dist/locales/ko-KR/openhands.json +37 -2
  308. package/dist/locales/no/openhands.json +37 -2
  309. package/dist/locales/pt/openhands.json +37 -2
  310. package/dist/locales/tr/openhands.json +37 -2
  311. package/dist/locales/uk/openhands.json +37 -2
  312. package/dist/locales/zh-CN/openhands.json +37 -2
  313. package/dist/locales/zh-TW/openhands.json +37 -2
  314. package/dist/manifests/automation-interface.cjs +2 -0
  315. package/dist/manifests/automation-interface.cjs.map +1 -0
  316. package/dist/manifests/automation-interface.d.ts +44 -0
  317. package/dist/manifests/automation-interface.js +81 -0
  318. package/dist/manifests/automation-interface.js.map +1 -0
  319. package/dist/manifests/automation-setup.cjs +2 -0
  320. package/dist/manifests/automation-setup.cjs.map +1 -0
  321. package/dist/manifests/automation-setup.d.ts +52 -0
  322. package/dist/manifests/automation-setup.js +8 -0
  323. package/dist/manifests/automation-setup.js.map +1 -0
  324. package/dist/manifests/interface-validation.cjs +2 -0
  325. package/dist/manifests/interface-validation.cjs.map +1 -0
  326. package/dist/manifests/interface-validation.d.ts +27 -0
  327. package/dist/manifests/interface-validation.js +182 -0
  328. package/dist/manifests/interface-validation.js.map +1 -0
  329. package/dist/manifests/manifest-actions.d.ts +15 -0
  330. package/dist/manifests/manifest-capabilities.d.ts +25 -0
  331. package/dist/manifests/manifest-error-map.d.ts +40 -0
  332. package/dist/manifests/manifest-local-validation.d.ts +56 -0
  333. package/dist/manifests/manifest-registry.cjs +2 -0
  334. package/dist/manifests/manifest-registry.cjs.map +1 -0
  335. package/dist/manifests/manifest-registry.d.ts +15 -0
  336. package/dist/manifests/manifest-registry.js +26 -0
  337. package/dist/manifests/manifest-registry.js.map +1 -0
  338. package/dist/manifests/manifest-sources.cjs +2 -0
  339. package/dist/manifests/manifest-sources.cjs.map +1 -0
  340. package/dist/manifests/manifest-sources.d.ts +15 -0
  341. package/dist/manifests/manifest-sources.js +8 -0
  342. package/dist/manifests/manifest-sources.js.map +1 -0
  343. package/dist/manifests/manifest-template.d.ts +18 -0
  344. package/dist/manifests/manifest-validation.cjs +2 -0
  345. package/dist/manifests/manifest-validation.cjs.map +1 -0
  346. package/dist/manifests/manifest-validation.d.ts +30 -0
  347. package/dist/manifests/manifest-validation.js +145 -0
  348. package/dist/manifests/manifest-validation.js.map +1 -0
  349. package/dist/manifests/types.cjs +2 -0
  350. package/dist/manifests/types.cjs.map +1 -0
  351. package/dist/manifests/types.d.ts +227 -0
  352. package/dist/manifests/types.js +6 -0
  353. package/dist/manifests/types.js.map +1 -0
  354. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs +9 -0
  355. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs.map +1 -0
  356. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js +75 -0
  357. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js.map +1 -0
  358. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.cjs +9 -0
  359. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.cjs.map +1 -0
  360. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.js +78 -0
  361. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.js.map +1 -0
  362. package/dist/node_modules/@openhands/extensions/automations/catalog/incident-retrospective-drafter/manifest.cjs +17 -0
  363. package/dist/node_modules/@openhands/extensions/automations/catalog/incident-retrospective-drafter/manifest.cjs.map +1 -0
  364. package/dist/node_modules/@openhands/extensions/automations/catalog/incident-retrospective-drafter/manifest.js +89 -0
  365. package/dist/node_modules/@openhands/extensions/automations/catalog/incident-retrospective-drafter/manifest.js.map +1 -0
  366. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.cjs +10 -0
  367. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.cjs.map +1 -0
  368. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.js +17 -0
  369. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-pr/manifest.js.map +1 -0
  370. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-triage-assistant/manifest.cjs +9 -0
  371. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-triage-assistant/manifest.cjs.map +1 -0
  372. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-triage-assistant/manifest.js +15 -0
  373. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-triage-assistant/manifest.js.map +1 -0
  374. package/dist/node_modules/@openhands/extensions/automations/catalog/research-brief-writer/manifest.cjs +9 -0
  375. package/dist/node_modules/@openhands/extensions/automations/catalog/research-brief-writer/manifest.cjs.map +1 -0
  376. package/dist/node_modules/@openhands/extensions/automations/catalog/research-brief-writer/manifest.js +18 -0
  377. package/dist/node_modules/@openhands/extensions/automations/catalog/research-brief-writer/manifest.js.map +1 -0
  378. package/dist/node_modules/@openhands/extensions/automations/catalog/slack-channel-monitor/manifest.cjs +9 -0
  379. package/dist/node_modules/@openhands/extensions/automations/catalog/slack-channel-monitor/manifest.cjs.map +1 -0
  380. package/dist/node_modules/@openhands/extensions/automations/catalog/slack-channel-monitor/manifest.js +14 -0
  381. package/dist/node_modules/@openhands/extensions/automations/catalog/slack-channel-monitor/manifest.js.map +1 -0
  382. package/dist/node_modules/@openhands/extensions/automations/catalog/slack-standup-digest/manifest.cjs +9 -0
  383. package/dist/node_modules/@openhands/extensions/automations/catalog/slack-standup-digest/manifest.cjs.map +1 -0
  384. package/dist/node_modules/@openhands/extensions/automations/catalog/slack-standup-digest/manifest.js +14 -0
  385. package/dist/node_modules/@openhands/extensions/automations/catalog/slack-standup-digest/manifest.js.map +1 -0
  386. package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs +2 -0
  387. package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs.map +1 -0
  388. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js +23 -0
  389. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js.map +1 -0
  390. package/dist/node_modules/@openhands/extensions/automations/index.cjs +2 -0
  391. package/dist/node_modules/@openhands/extensions/automations/index.cjs.map +1 -0
  392. package/dist/node_modules/@openhands/extensions/automations/index.js +18 -0
  393. package/dist/node_modules/@openhands/extensions/automations/index.js.map +1 -0
  394. package/dist/node_modules/@openhands/extensions/automations/interface.cjs +2 -0
  395. package/dist/node_modules/@openhands/extensions/automations/interface.cjs.map +1 -0
  396. package/dist/node_modules/@openhands/extensions/automations/interface.js +89 -0
  397. package/dist/node_modules/@openhands/extensions/automations/interface.js.map +1 -0
  398. package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.cjs +1 -1
  399. package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.cjs.map +1 -1
  400. package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.js +3 -3
  401. package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.js.map +1 -1
  402. package/dist/node_modules/@openhands/extensions/skills/index.cjs +17 -4
  403. package/dist/node_modules/@openhands/extensions/skills/index.cjs.map +1 -1
  404. package/dist/node_modules/@openhands/extensions/skills/index.js +5 -5
  405. package/dist/node_modules/@openhands/extensions/skills/index.js.map +1 -1
  406. package/dist/node_modules/lucide-react/dist/esm/icons/monitor.cjs +2 -0
  407. package/dist/node_modules/lucide-react/dist/esm/icons/monitor.cjs.map +1 -0
  408. package/dist/node_modules/lucide-react/dist/esm/icons/monitor.js +29 -0
  409. package/dist/node_modules/lucide-react/dist/esm/icons/monitor.js.map +1 -0
  410. package/dist/package.cjs +1 -1
  411. package/dist/package.cjs.map +1 -1
  412. package/dist/package.js +2 -2
  413. package/dist/package.js.map +1 -1
  414. package/dist/types/agent-server/core/events/conversation-state-event.d.ts +2 -19
  415. package/dist/types/agent-server/core/events/observation-event.d.ts +2 -18
  416. package/dist/types/automation.d.ts +7 -3
  417. package/dist/utils/api-error-message.d.ts +6 -2
  418. package/dist/utils/automation-catalog.cjs +2 -0
  419. package/dist/utils/automation-catalog.cjs.map +1 -0
  420. package/dist/utils/automation-catalog.d.ts +28 -0
  421. package/dist/utils/automation-catalog.js +5 -0
  422. package/dist/utils/automation-catalog.js.map +1 -0
  423. package/dist/utils/automation-timeout.d.ts +3 -2
  424. package/dist/utils/responder-deployment.d.ts +5 -1
  425. package/dist/utils/transcript-export/index.cjs +5 -5
  426. package/dist/utils/transcript-export/index.js +12 -12
  427. package/package.json +2 -2
  428. package/scripts/check-translation-completeness.cjs +1 -0
  429. package/scripts/dev-safe.mjs +15 -10
  430. package/scripts/dev-static.mjs +17 -0
  431. package/scripts/dev-with-automation.mjs +12 -14
  432. package/scripts/ingress.mjs +22 -0
  433. package/scripts/proxy-utils.mjs +157 -2
  434. package/scripts/runtime-services-info.mjs +6 -6
  435. package/scripts/static-build.mjs +0 -7
  436. package/scripts/static-server.mjs +10 -0
  437. package/build/assets/active-backend-context-mY7Gff5c.js +0 -2
  438. package/build/assets/agent-context-settings-BTUmWEzL.js +0 -1
  439. package/build/assets/agent-profiles-settings-Ilqid_R5.js +0 -1
  440. package/build/assets/agent-server-conversation-service.api-C_7YnjzP.js +0 -41
  441. package/build/assets/agent-settings-CxfT4ksO.js +0 -1
  442. package/build/assets/automation-BGP_I1RR.js +0 -1
  443. package/build/assets/automation-detail-nEflClmc.js +0 -2
  444. package/build/assets/automation-export-BO_kfqC8.js +0 -2
  445. package/build/assets/automations-list-BYncC7gv.js +0 -1
  446. package/build/assets/backend-form-modal-CKrBF80P.js +0 -1
  447. package/build/assets/browser-3QjrEr1D.js +0 -6
  448. package/build/assets/check-CrxQfJZ2.js +0 -1
  449. package/build/assets/chevron-down-D_LsyTA7.js +0 -1
  450. package/build/assets/circle-check-DZn9HkLE.js +0 -1
  451. package/build/assets/cloud-funnel-analytics-NlmDoeo2.js +0 -1
  452. package/build/assets/command-menu-CvLPs7dg.js +0 -1
  453. package/build/assets/condenser-settings-C4Y9CzQV.js +0 -1
  454. package/build/assets/conversation-D_ORtpKC.js +0 -1
  455. package/build/assets/conversation-Dpc5nmGi.js +0 -90
  456. package/build/assets/conversation-panel-D_ORtpKC.js +0 -1
  457. package/build/assets/conversation-state-store-CGRQemtx.js +0 -1
  458. package/build/assets/files-tab-4c9HFSLo.js +0 -1
  459. package/build/assets/git-provider-icon-0PqmIS_S.js +0 -1
  460. package/build/assets/home-D9JsyEmE.js +0 -1
  461. package/build/assets/home-TFhnmZLx.js +0 -1
  462. package/build/assets/index-home-D9JsyEmE.js +0 -1
  463. package/build/assets/install-server-modal-BgGRnqA0.js +0 -1
  464. package/build/assets/llm-not-configured-banner-Y4W9-sar.js +0 -27
  465. package/build/assets/llm-settings-nPwv7hKu.js +0 -1
  466. package/build/assets/loader-circle-CGD6-Vak.js +0 -1
  467. package/build/assets/manifest-1cf33a7b.js +0 -1
  468. package/build/assets/markdown-renderer-U40HF0Ak.js +0 -8
  469. package/build/assets/mcp-xDMaHzOw.js +0 -9
  470. package/build/assets/messages-CdNfZPgd.js +0 -40
  471. package/build/assets/plus-CTGLo3aa.js +0 -1
  472. package/build/assets/recommended-automations-launcher-Dru1yN46.js +0 -58
  473. package/build/assets/root-B5JXKp1P.css +0 -1
  474. package/build/assets/root-DOLLQteU.js +0 -2
  475. package/build/assets/root-layout-xmylWoew.js +0 -3
  476. package/build/assets/search-BrpWXWUi.js +0 -1
  477. package/build/assets/segmented-toggle-CZKOdIly.js +0 -1
  478. package/build/assets/settings-input-BEaTCem1.js +0 -1
  479. package/build/assets/shared-conversation-BvWtTwES.js +0 -1
  480. package/build/assets/use-agent-profiles-DmT9zxAN.js +0 -1
  481. package/build/assets/use-config-C959QcRC.js +0 -1
  482. package/build/assets/use-is-authed-BsS4XwSL.js +0 -1
  483. package/build/assets/use-llm-profiles-CdaxVpyY.js +0 -1
  484. package/build/assets/use-save-agent-profile-DGJ3-u0M.js +0 -1
  485. package/build/assets/use-settings-nav-items-DPK5sxvR.js +0 -16
  486. package/build/assets/use-tracking-COqZLobY.js +0 -1
  487. package/build/assets/utils-DsWhWn2F.js +0 -1
  488. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation-Acmf1sKj.js +0 -1
  489. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~shared-conversation-CmzCY1BT.js +0 -1
  490. package/build/assets/vendor~root-layout~index-home~home~mcp~automations-list~onboarding-modal-C7Yh77RT.js +0 -1
  491. package/build/assets/x-Dx_JbpHA.js +0 -1
  492. /package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~f1hl7voa-BrmgjeOw.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~emdr2jt4-BrmgjeOw.js} +0 -0
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Host-owned shape of an extension-authored setup experience.
3
+ *
4
+ * A catalog entry is declarative data published by `@openhands/extensions`. Its
5
+ * optional `setup` block says what to ask a user for; everything derivable from
6
+ * that — the request to send, the route, the review screen, the analytics — is
7
+ * this host's to generate, so none of it appears here.
8
+ *
9
+ * The names mirror `@openhands/extensions/automations`' own declarations, so an
10
+ * entry from the published package assigns without an adapter.
11
+ */
12
+ export declare const SETUP_VERSION = "1.0";
13
+ export type SetupMode = "direct" | "assisted";
14
+ export type SetupFieldType = "text" | "textarea" | "select" | "cron" | "timezone" | "repo-picker";
15
+ export type SetupGitProvider = "github" | "gitlab" | "bitbucket";
16
+ export type SetupTriggerKind = "cron" | "event";
17
+ /** Placeholder namespaces a setup block may reference inside `{{...}}`. */
18
+ export declare const SETUP_PLACEHOLDER_NAMESPACES: readonly ["form", "automation"];
19
+ export interface SetupFieldOption {
20
+ value: string;
21
+ label: string;
22
+ }
23
+ export interface SetupFieldConstraints {
24
+ minLength?: number;
25
+ maxLength?: number;
26
+ /**
27
+ * A host-implemented check named from a closed set. Entries supply no regex
28
+ * of their own, so they cannot hand the host a pathological pattern.
29
+ */
30
+ format?: "safeExpressionLiteral";
31
+ }
32
+ export interface SetupFormField {
33
+ type: SetupFieldType;
34
+ label: string;
35
+ help: string;
36
+ placeholder?: string;
37
+ default?: string;
38
+ required: boolean;
39
+ provider?: SetupGitProvider;
40
+ options?: SetupFieldOption[];
41
+ constraints?: SetupFieldConstraints;
42
+ }
43
+ /** Keyed by field name, which is what `{{form.<name>}}` resolves against. */
44
+ export type SetupFormFields = Record<string, SetupFormField>;
45
+ export interface SetupForm {
46
+ note?: string;
47
+ /** Inputs that decide when the automation runs, keyed by trigger kind. */
48
+ triggers?: Partial<Record<SetupTriggerKind, SetupFormFields>>;
49
+ /** Every other input: the arguments to the automation itself. */
50
+ args: SetupFormFields;
51
+ }
52
+ export interface SetupBlock {
53
+ version: typeof SETUP_VERSION;
54
+ mode: SetupMode;
55
+ form: SetupForm;
56
+ /** direct only. What the automation is told to do. */
57
+ prompt?: string;
58
+ /** direct only, event trigger only. Which delivered events belong to it. */
59
+ filter?: string;
60
+ /**
61
+ * Setup context for the conversation that finishes setup. Required for
62
+ * assisted mode. Optional for direct mode, where it seeds the fallback
63
+ * conversation offered when the deployment cannot run the direct path.
64
+ */
65
+ message?: string;
66
+ }
67
+ export interface SetupIntegrationRequirement {
68
+ /** Why this entry needs the integration. */
69
+ message: string;
70
+ /** Defaults to true. `false` lets setup continue while it is unconnected. */
71
+ required?: false;
72
+ }
73
+ export interface SetupPrerequisites {
74
+ /** Keyed by integration catalog id. */
75
+ integrations: Record<string, SetupIntegrationRequirement>;
76
+ /** Deployment capabilities this entry cannot run without. */
77
+ features?: string[];
78
+ }
79
+ /**
80
+ * The part of a catalog entry this host reads. An admitted entry always has a
81
+ * `setup` block; entries without one are simply not setup entries.
82
+ */
83
+ export interface SetupEntry {
84
+ id: string;
85
+ name: string;
86
+ description: string;
87
+ requires: SetupPrerequisites;
88
+ /** The skill that owns the launch command. Defaults to `id`. */
89
+ skill?: string;
90
+ setup: SetupBlock;
91
+ }
92
+ export type SetupPayloadValue = string | number | boolean | null | SetupPayloadValue[] | {
93
+ [key: string]: SetupPayloadValue;
94
+ };
95
+ export interface SetupRequestBody {
96
+ [key: string]: SetupPayloadValue;
97
+ }
98
+ /** Form values are collected as strings; the payload mapping shapes them. */
99
+ export type SetupFormValues = Record<string, string>;
100
+ /** `GET /v1/capabilities` — what this deployment supports. */
101
+ export interface DeploymentCapabilities {
102
+ ready: boolean;
103
+ triggerKinds: string[];
104
+ eventSources: string[];
105
+ eventTypes: string[];
106
+ triggers: {
107
+ cron?: {
108
+ minIntervalSeconds: number;
109
+ timezones: string[];
110
+ };
111
+ event?: {
112
+ filterLanguage: string;
113
+ filterFunctions: string[];
114
+ };
115
+ };
116
+ features: string[];
117
+ }
118
+ /** A single problem with a draft, addressed to the field that caused it. */
119
+ export interface DraftValidationError {
120
+ /** Dotted path into the draft. Null when the problem spans the whole draft. */
121
+ field: string | null;
122
+ code: string;
123
+ message: string;
124
+ }
125
+ /** `POST /v1/validate` — an invalid draft is still a 200. */
126
+ export interface ValidateDraftResponse {
127
+ valid: boolean;
128
+ errors: DraftValidationError[];
129
+ sampleEventMatched?: boolean | null;
130
+ }
131
+ /**
132
+ * Host-owned shape of the production Automation interface manifest, published
133
+ * by `@openhands/extensions/automations` as `AUTOMATION_INTERFACE`.
134
+ *
135
+ * The catalog states what varies per automation; this states the domain-level
136
+ * facts of the interface itself. As with setup entries, the published data is
137
+ * validated at admission rather than trusted, and a package that predates the
138
+ * manifest simply leaves the host on its own defaults.
139
+ */
140
+ export declare const INTERFACE_VERSION = "1.0";
141
+ /** The closed set of runtime-model properties a client may offer for setting. */
142
+ export type AutomationAttributeName = "name" | "prompt" | "model" | "timeout" | "schedule";
143
+ export type InterfaceAttributeType = "text" | "textarea" | "number" | "llm-profile" | "schedule";
144
+ /** How one settable attribute of an existing Automation is offered. */
145
+ export interface InterfaceAttribute {
146
+ type: InterfaceAttributeType;
147
+ label: string;
148
+ help?: string;
149
+ required: boolean;
150
+ /** Only a `number` attribute carries constraints. */
151
+ constraints?: {
152
+ min?: number;
153
+ max?: number;
154
+ };
155
+ }
156
+ export interface InterfaceRoutes {
157
+ list: string;
158
+ /** Carries the `:automationId` segment the host substitutes. */
159
+ setup: string;
160
+ /** Carries the `:automationId` segment the host substitutes. */
161
+ detail: string;
162
+ }
163
+ /**
164
+ * Service-relative paths the host calls. The base path, methods, headers, and
165
+ * auth remain the host's. `{id}` marks where the automation id is substituted.
166
+ */
167
+ export interface InterfaceEndpoints {
168
+ list: string;
169
+ detail: string;
170
+ dispatch: string;
171
+ runs: string;
172
+ tarball: string;
173
+ health: string;
174
+ capabilities: string;
175
+ validate: string;
176
+ createPrompt: string;
177
+ createPlugin: string;
178
+ }
179
+ export type InterfaceEndpointName = keyof InterfaceEndpoints;
180
+ export interface InterfaceImportExport {
181
+ fileKind: string;
182
+ fileVersion: number;
183
+ filenameSuffix: string;
184
+ importDefaults: {
185
+ /** Provider inferred for short owner/repo repository URLs on import. */
186
+ repoProvider: SetupGitProvider;
187
+ /** Event source of the placeholder trigger that keeps an import inert. */
188
+ placeholderEventSource: string;
189
+ };
190
+ }
191
+ export interface InterfaceManifest {
192
+ version: typeof INTERFACE_VERSION;
193
+ routes: InterfaceRoutes;
194
+ navigation: {
195
+ sidebar: {
196
+ label: string;
197
+ };
198
+ commandMenu: {
199
+ title: string;
200
+ description: string;
201
+ keywords: string;
202
+ };
203
+ };
204
+ pages: {
205
+ list: {
206
+ title: string;
207
+ subtitle: string;
208
+ };
209
+ detail: {
210
+ backLabel: string;
211
+ };
212
+ edit: {
213
+ title: string;
214
+ };
215
+ };
216
+ docsUrl: string;
217
+ /**
218
+ * The input surface of an existing Automation, keyed by the runtime-model
219
+ * property the host sends. Rendering it as an edit dialog is this host's
220
+ * choice, not stated here.
221
+ */
222
+ attributes: Partial<Record<AutomationAttributeName, InterfaceAttribute>>;
223
+ importExport: InterfaceImportExport;
224
+ endpoints: InterfaceEndpoints;
225
+ featuredAutomationIds: string[];
226
+ responderIntegrationIds: string[];
227
+ }
@@ -0,0 +1,6 @@
1
+ //#region src/manifests/types.ts
2
+ var e = ["form", "automation"];
3
+ //#endregion
4
+ export { e as SETUP_PLACEHOLDER_NAMESPACES };
5
+
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../src/manifests/types.ts"],"sourcesContent":["/**\n * Host-owned shape of an extension-authored setup experience.\n *\n * A catalog entry is declarative data published by `@openhands/extensions`. Its\n * optional `setup` block says what to ask a user for; everything derivable from\n * that — the request to send, the route, the review screen, the analytics — is\n * this host's to generate, so none of it appears here.\n *\n * The names mirror `@openhands/extensions/automations`' own declarations, so an\n * entry from the published package assigns without an adapter.\n */\n\nexport const SETUP_VERSION = \"1.0\";\n\nexport type SetupMode = \"direct\" | \"assisted\";\n\nexport type SetupFieldType =\n | \"text\"\n | \"textarea\"\n | \"select\"\n | \"cron\"\n | \"timezone\"\n | \"repo-picker\";\n\nexport type SetupGitProvider = \"github\" | \"gitlab\" | \"bitbucket\";\n\nexport type SetupTriggerKind = \"cron\" | \"event\";\n\n/** Placeholder namespaces a setup block may reference inside `{{...}}`. */\nexport const SETUP_PLACEHOLDER_NAMESPACES = [\"form\", \"automation\"] as const;\n\nexport interface SetupFieldOption {\n value: string;\n label: string;\n}\n\nexport interface SetupFieldConstraints {\n minLength?: number;\n maxLength?: number;\n /**\n * A host-implemented check named from a closed set. Entries supply no regex\n * of their own, so they cannot hand the host a pathological pattern.\n */\n format?: \"safeExpressionLiteral\";\n}\n\nexport interface SetupFormField {\n type: SetupFieldType;\n label: string;\n help: string;\n placeholder?: string;\n default?: string;\n required: boolean;\n provider?: SetupGitProvider;\n options?: SetupFieldOption[];\n constraints?: SetupFieldConstraints;\n}\n\n/** Keyed by field name, which is what `{{form.<name>}}` resolves against. */\nexport type SetupFormFields = Record<string, SetupFormField>;\n\nexport interface SetupForm {\n note?: string;\n /** Inputs that decide when the automation runs, keyed by trigger kind. */\n triggers?: Partial<Record<SetupTriggerKind, SetupFormFields>>;\n /** Every other input: the arguments to the automation itself. */\n args: SetupFormFields;\n}\n\nexport interface SetupBlock {\n version: typeof SETUP_VERSION;\n mode: SetupMode;\n form: SetupForm;\n /** direct only. What the automation is told to do. */\n prompt?: string;\n /** direct only, event trigger only. Which delivered events belong to it. */\n filter?: string;\n /**\n * Setup context for the conversation that finishes setup. Required for\n * assisted mode. Optional for direct mode, where it seeds the fallback\n * conversation offered when the deployment cannot run the direct path.\n */\n message?: string;\n}\n\nexport interface SetupIntegrationRequirement {\n /** Why this entry needs the integration. */\n message: string;\n /** Defaults to true. `false` lets setup continue while it is unconnected. */\n required?: false;\n}\n\nexport interface SetupPrerequisites {\n /** Keyed by integration catalog id. */\n integrations: Record<string, SetupIntegrationRequirement>;\n /** Deployment capabilities this entry cannot run without. */\n features?: string[];\n}\n\n/**\n * The part of a catalog entry this host reads. An admitted entry always has a\n * `setup` block; entries without one are simply not setup entries.\n */\nexport interface SetupEntry {\n id: string;\n name: string;\n description: string;\n requires: SetupPrerequisites;\n /** The skill that owns the launch command. Defaults to `id`. */\n skill?: string;\n setup: SetupBlock;\n}\n\nexport type SetupPayloadValue =\n | string\n | number\n | boolean\n | null\n | SetupPayloadValue[]\n | { [key: string]: SetupPayloadValue };\n\nexport interface SetupRequestBody {\n [key: string]: SetupPayloadValue;\n}\n\n/** Form values are collected as strings; the payload mapping shapes them. */\nexport type SetupFormValues = Record<string, string>;\n\n/** `GET /v1/capabilities` — what this deployment supports. */\nexport interface DeploymentCapabilities {\n ready: boolean;\n triggerKinds: string[];\n eventSources: string[];\n eventTypes: string[];\n triggers: {\n cron?: { minIntervalSeconds: number; timezones: string[] };\n event?: { filterLanguage: string; filterFunctions: string[] };\n };\n features: string[];\n}\n\n/** A single problem with a draft, addressed to the field that caused it. */\nexport interface DraftValidationError {\n /** Dotted path into the draft. Null when the problem spans the whole draft. */\n field: string | null;\n code: string;\n message: string;\n}\n\n/** `POST /v1/validate` — an invalid draft is still a 200. */\nexport interface ValidateDraftResponse {\n valid: boolean;\n errors: DraftValidationError[];\n sampleEventMatched?: boolean | null;\n}\n\n/**\n * Host-owned shape of the production Automation interface manifest, published\n * by `@openhands/extensions/automations` as `AUTOMATION_INTERFACE`.\n *\n * The catalog states what varies per automation; this states the domain-level\n * facts of the interface itself. As with setup entries, the published data is\n * validated at admission rather than trusted, and a package that predates the\n * manifest simply leaves the host on its own defaults.\n */\n\nexport const INTERFACE_VERSION = \"1.0\";\n\n/** The closed set of runtime-model properties a client may offer for setting. */\nexport type AutomationAttributeName =\n | \"name\"\n | \"prompt\"\n | \"model\"\n | \"timeout\"\n | \"schedule\";\n\nexport type InterfaceAttributeType =\n | \"text\"\n | \"textarea\"\n | \"number\"\n | \"llm-profile\"\n | \"schedule\";\n\n/** How one settable attribute of an existing Automation is offered. */\nexport interface InterfaceAttribute {\n type: InterfaceAttributeType;\n label: string;\n help?: string;\n required: boolean;\n /** Only a `number` attribute carries constraints. */\n constraints?: { min?: number; max?: number };\n}\n\nexport interface InterfaceRoutes {\n list: string;\n /** Carries the `:automationId` segment the host substitutes. */\n setup: string;\n /** Carries the `:automationId` segment the host substitutes. */\n detail: string;\n}\n\n/**\n * Service-relative paths the host calls. The base path, methods, headers, and\n * auth remain the host's. `{id}` marks where the automation id is substituted.\n */\nexport interface InterfaceEndpoints {\n list: string;\n detail: string;\n dispatch: string;\n runs: string;\n tarball: string;\n health: string;\n capabilities: string;\n validate: string;\n createPrompt: string;\n createPlugin: string;\n}\n\nexport type InterfaceEndpointName = keyof InterfaceEndpoints;\n\nexport interface InterfaceImportExport {\n fileKind: string;\n fileVersion: number;\n filenameSuffix: string;\n importDefaults: {\n /** Provider inferred for short owner/repo repository URLs on import. */\n repoProvider: SetupGitProvider;\n /** Event source of the placeholder trigger that keeps an import inert. */\n placeholderEventSource: string;\n };\n}\n\nexport interface InterfaceManifest {\n version: typeof INTERFACE_VERSION;\n routes: InterfaceRoutes;\n navigation: {\n sidebar: { label: string };\n commandMenu: { title: string; description: string; keywords: string };\n };\n pages: {\n list: { title: string; subtitle: string };\n detail: { backLabel: string };\n edit: { title: string };\n };\n docsUrl: string;\n /**\n * The input surface of an existing Automation, keyed by the runtime-model\n * property the host sends. Rendering it as an edit dialog is this host's\n * choice, not stated here.\n */\n attributes: Partial<Record<AutomationAttributeName, InterfaceAttribute>>;\n importExport: InterfaceImportExport;\n endpoints: InterfaceEndpoints;\n featuredAutomationIds: string[];\n responderIntegrationIds: string[];\n}\n"],"mappings":";AA6BA,IAAa,IAA+B,CAAC,QAAQ,YAAY"}
@@ -0,0 +1,9 @@
1
+ require("../../../../../../_virtual/_rolldown/runtime.cjs");var e={id:`github-pr-reviewer`,name:`GitHub Code Review Agent`,category:`Code review`,description:`Watch for a configurable label on GitHub pull requests, inspect full PR and repository context, and post an AI review comment once per label event.`,requires:{integrations:{github:{message:`Used to read pull requests and post review comments.`}},features:[`repoClone`,`presetPrompt`]},popularityRank:100,estimatedSetupMinutes:4,exampleImplementation:`Trigger: cron polling for open GitHub PRs with a configured label such as openhands-review
2
+ Required secret: GITHUB_PERSONAL_ACCESS_TOKEN
3
+
4
+ 1. Read repository, trigger label, review tone, and polling schedule from setup.
5
+ 2. List open PRs and find the latest matching GitHub labeled issue event for each labeled PR.
6
+ 3. Deduplicate on the label event ID so every label application queues exactly one review.
7
+ 4. Start an OpenHands conversation that clones the repo, checks out the exact PR head SHA, and inspects PR discussion, review comments, changed files, diff, and surrounding code.
8
+ 5. Post an acknowledgement with the conversation link, then post the final AI review comment only if the PR is still open and the head SHA has not changed.`,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:{repository:{type:`repo-picker`,label:`Repository`,help:`The repository whose pull requests will be reviewed.`,provider:`github`,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`}]}}},prompt:`Review pull requests labeled '{{form.triggerLabel}}' in {{form.repository}}. 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.`}};exports.default=e;
9
+ //# sourceMappingURL=manifest.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.cjs","names":[],"sources":["../../../../../../../node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.json"],"sourcesContent":["{\n \"id\": \"github-pr-reviewer\",\n \"name\": \"GitHub Code Review Agent\",\n \"category\": \"Code review\",\n \"description\": \"Watch for a configurable label on GitHub pull requests, inspect full PR and repository context, and post an AI review comment once per label event.\",\n \"requires\": {\n \"integrations\": {\n \"github\": {\n \"message\": \"Used to read pull requests and post review comments.\"\n }\n },\n \"features\": [\n \"repoClone\",\n \"presetPrompt\"\n ]\n },\n \"popularityRank\": 100,\n \"estimatedSetupMinutes\": 4,\n \"exampleImplementation\": \"Trigger: cron polling for open GitHub PRs with a configured label such as openhands-review\\nRequired secret: GITHUB_PERSONAL_ACCESS_TOKEN\\n\\n1. Read repository, trigger label, review tone, and polling schedule from setup.\\n2. List open PRs and find the latest matching GitHub labeled issue event for each labeled PR.\\n3. Deduplicate on the label event ID so every label application queues exactly one review.\\n4. Start an OpenHands conversation that clones the repo, checks out the exact PR head SHA, and inspects PR discussion, review comments, changed files, diff, and surrounding code.\\n5. Post an acknowledgement with the conversation link, then post the final AI review comment only if the PR is still open and the head SHA has not changed.\",\n \"setup\": {\n \"version\": \"1.0\",\n \"mode\": \"direct\",\n \"form\": {\n \"triggers\": {\n \"cron\": {\n \"schedule\": {\n \"type\": \"cron\",\n \"label\": \"Check frequency\",\n \"help\": \"How often to look for newly labelled pull requests.\",\n \"default\": \"*/15 * * * *\",\n \"required\": true\n },\n \"timezone\": {\n \"type\": \"timezone\",\n \"label\": \"Timezone\",\n \"help\": \"Timezone the schedule is interpreted in.\",\n \"default\": \"UTC\",\n \"required\": true\n }\n }\n },\n \"args\": {\n \"repository\": {\n \"type\": \"repo-picker\",\n \"label\": \"Repository\",\n \"help\": \"The repository whose pull requests will be reviewed.\",\n \"provider\": \"github\",\n \"required\": true\n },\n \"triggerLabel\": {\n \"type\": \"text\",\n \"label\": \"Trigger label\",\n \"help\": \"Only pull requests carrying this label are reviewed.\",\n \"default\": \"openhands-review\",\n \"required\": true,\n \"constraints\": {\n \"minLength\": 1,\n \"maxLength\": 50\n }\n },\n \"reviewTone\": {\n \"type\": \"select\",\n \"label\": \"Review tone\",\n \"help\": \"How detailed the review comments should be.\",\n \"default\": \"concise\",\n \"required\": true,\n \"options\": [\n {\n \"value\": \"concise\",\n \"label\": \"Concise\"\n },\n {\n \"value\": \"thorough\",\n \"label\": \"Thorough\"\n }\n ]\n }\n }\n },\n \"prompt\": \"Review pull requests labeled '{{form.triggerLabel}}' in {{form.repository}}. Review tone: {{form.reviewTone}}.\",\n \"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.\"\n }\n}\n"],"x_google_ignoreList":[0],"mappings":""}
@@ -0,0 +1,75 @@
1
+ var e = {
2
+ id: "github-pr-reviewer",
3
+ name: "GitHub Code Review Agent",
4
+ category: "Code review",
5
+ description: "Watch for a configurable label on GitHub pull requests, inspect full PR and repository context, and post an AI review comment once per label event.",
6
+ requires: {
7
+ integrations: { github: { message: "Used to read pull requests and post review comments." } },
8
+ features: ["repoClone", "presetPrompt"]
9
+ },
10
+ popularityRank: 100,
11
+ estimatedSetupMinutes: 4,
12
+ exampleImplementation: "Trigger: cron polling for open GitHub PRs with a configured label such as openhands-review\nRequired secret: GITHUB_PERSONAL_ACCESS_TOKEN\n\n1. Read repository, trigger label, review tone, and polling schedule from setup.\n2. List open PRs and find the latest matching GitHub labeled issue event for each labeled PR.\n3. Deduplicate on the label event ID so every label application queues exactly one review.\n4. Start an OpenHands conversation that clones the repo, checks out the exact PR head SHA, and inspects PR discussion, review comments, changed files, diff, and surrounding code.\n5. Post an acknowledgement with the conversation link, then post the final AI review comment only if the PR is still open and the head SHA has not changed.",
13
+ setup: {
14
+ version: "1.0",
15
+ mode: "direct",
16
+ form: {
17
+ triggers: { cron: {
18
+ schedule: {
19
+ type: "cron",
20
+ label: "Check frequency",
21
+ help: "How often to look for newly labelled pull requests.",
22
+ default: "*/15 * * * *",
23
+ required: !0
24
+ },
25
+ timezone: {
26
+ type: "timezone",
27
+ label: "Timezone",
28
+ help: "Timezone the schedule is interpreted in.",
29
+ default: "UTC",
30
+ required: !0
31
+ }
32
+ } },
33
+ args: {
34
+ repository: {
35
+ type: "repo-picker",
36
+ label: "Repository",
37
+ help: "The repository whose pull requests will be reviewed.",
38
+ provider: "github",
39
+ required: !0
40
+ },
41
+ triggerLabel: {
42
+ type: "text",
43
+ label: "Trigger label",
44
+ help: "Only pull requests carrying this label are reviewed.",
45
+ default: "openhands-review",
46
+ required: !0,
47
+ constraints: {
48
+ minLength: 1,
49
+ maxLength: 50
50
+ }
51
+ },
52
+ reviewTone: {
53
+ type: "select",
54
+ label: "Review tone",
55
+ help: "How detailed the review comments should be.",
56
+ default: "concise",
57
+ required: !0,
58
+ options: [{
59
+ value: "concise",
60
+ label: "Concise"
61
+ }, {
62
+ value: "thorough",
63
+ label: "Thorough"
64
+ }]
65
+ }
66
+ }
67
+ },
68
+ prompt: "Review pull requests labeled '{{form.triggerLabel}}' in {{form.repository}}. Review tone: {{form.reviewTone}}.",
69
+ 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."
70
+ }
71
+ };
72
+ //#endregion
73
+ export { e as default };
74
+
75
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","names":[],"sources":["../../../../../../../node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.json"],"sourcesContent":["{\n \"id\": \"github-pr-reviewer\",\n \"name\": \"GitHub Code Review Agent\",\n \"category\": \"Code review\",\n \"description\": \"Watch for a configurable label on GitHub pull requests, inspect full PR and repository context, and post an AI review comment once per label event.\",\n \"requires\": {\n \"integrations\": {\n \"github\": {\n \"message\": \"Used to read pull requests and post review comments.\"\n }\n },\n \"features\": [\n \"repoClone\",\n \"presetPrompt\"\n ]\n },\n \"popularityRank\": 100,\n \"estimatedSetupMinutes\": 4,\n \"exampleImplementation\": \"Trigger: cron polling for open GitHub PRs with a configured label such as openhands-review\\nRequired secret: GITHUB_PERSONAL_ACCESS_TOKEN\\n\\n1. Read repository, trigger label, review tone, and polling schedule from setup.\\n2. List open PRs and find the latest matching GitHub labeled issue event for each labeled PR.\\n3. Deduplicate on the label event ID so every label application queues exactly one review.\\n4. Start an OpenHands conversation that clones the repo, checks out the exact PR head SHA, and inspects PR discussion, review comments, changed files, diff, and surrounding code.\\n5. Post an acknowledgement with the conversation link, then post the final AI review comment only if the PR is still open and the head SHA has not changed.\",\n \"setup\": {\n \"version\": \"1.0\",\n \"mode\": \"direct\",\n \"form\": {\n \"triggers\": {\n \"cron\": {\n \"schedule\": {\n \"type\": \"cron\",\n \"label\": \"Check frequency\",\n \"help\": \"How often to look for newly labelled pull requests.\",\n \"default\": \"*/15 * * * *\",\n \"required\": true\n },\n \"timezone\": {\n \"type\": \"timezone\",\n \"label\": \"Timezone\",\n \"help\": \"Timezone the schedule is interpreted in.\",\n \"default\": \"UTC\",\n \"required\": true\n }\n }\n },\n \"args\": {\n \"repository\": {\n \"type\": \"repo-picker\",\n \"label\": \"Repository\",\n \"help\": \"The repository whose pull requests will be reviewed.\",\n \"provider\": \"github\",\n \"required\": true\n },\n \"triggerLabel\": {\n \"type\": \"text\",\n \"label\": \"Trigger label\",\n \"help\": \"Only pull requests carrying this label are reviewed.\",\n \"default\": \"openhands-review\",\n \"required\": true,\n \"constraints\": {\n \"minLength\": 1,\n \"maxLength\": 50\n }\n },\n \"reviewTone\": {\n \"type\": \"select\",\n \"label\": \"Review tone\",\n \"help\": \"How detailed the review comments should be.\",\n \"default\": \"concise\",\n \"required\": true,\n \"options\": [\n {\n \"value\": \"concise\",\n \"label\": \"Concise\"\n },\n {\n \"value\": \"thorough\",\n \"label\": \"Thorough\"\n }\n ]\n }\n }\n },\n \"prompt\": \"Review pull requests labeled '{{form.triggerLabel}}' in {{form.repository}}. Review tone: {{form.reviewTone}}.\",\n \"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.\"\n }\n}\n"],"x_google_ignoreList":[0],"mappings":""}
@@ -0,0 +1,9 @@
1
+ require("../../../../../../_virtual/_rolldown/runtime.cjs");var e={id:`github-repo-monitor`,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`,`webhookDelivery`]},popularityRank:98,estimatedSetupMinutes:5,exampleImplementation:`Trigger: cron, every minute (configurable)
2
+ Required secret: GITHUB_PERSONAL_ACCESS_TOKEN
3
+
4
+ 1. Poll GitHub for new issue and PR comments since the last run.
5
+ 2. Match comments containing the trigger phrase (case-insensitive, default: @OpenHands).
6
+ 3. Post an acknowledgment comment with a link to the new OpenHands conversation.
7
+ 4. Forward follow-up replies in the same thread to the running conversation.
8
+ 5. Post the agent's final response back to GitHub when the conversation completes.`,setup:{version:`1.0`,mode:`direct`,form:{triggers:{event:{on:{type:`select`,label:`Respond to`,help:`Which GitHub comment event starts a conversation.`,default:`issue_comment.created`,required:!0,options:[{value:`issue_comment.created`,label:`Comments on issues and pull requests`},{value:`pull_request_review_comment.created`,label:`Pull request review comments only`}]},triggerPhrase:{type:`text`,label:`Trigger phrase`,help:`Only comments containing this phrase start a conversation. Matched case-insensitively. Quotes and backslashes are not allowed, because the phrase becomes part of the event filter expression.`,default:`@openhands`,required:!0,constraints:{minLength:2,maxLength:50,format:`safeExpressionLiteral`}}}},args:{repository:{type:`repo-picker`,label:`Repository`,help:`The repository or repositories to watch for mentions.`,provider:`github`,required:!0},ref:{type:`text`,label:`Base branch`,help:`Branch checked out when the agent responds.`,default:`main`,required:!0,constraints:{minLength:1,maxLength:255}}}},prompt:`A comment in {{form.repository}} mentions '{{form.triggerPhrase}}'. Read the surrounding issue or pull request context from the event payload, then post a helpful reply as a comment on the same thread.`,filter:`icontains(comment.body, '{{form.triggerPhrase}}') && glob(repository.full_name, '{{form.repository}}')`,message:`This deployment cannot run the webhook-driven monitor directly. Set it up in this conversation instead: confirm the repository to watch, the comment event, and the trigger phrase, then create the automation. If webhook delivery is unavailable here, build the polling variant this skill supports.`}};exports.default=e;
9
+ //# sourceMappingURL=manifest.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.cjs","names":[],"sources":["../../../../../../../node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.json"],"sourcesContent":["{\n \"id\": \"github-repo-monitor\",\n \"name\": \"GitHub repository monitor\",\n \"category\": \"Developer tools\",\n \"description\": \"Watch a repository for @OpenHands mentions in issues and PR comments, start a conversation, and post the agent's reply back to GitHub.\",\n \"requires\": {\n \"integrations\": {\n \"github\": {\n \"message\": \"Used to read issue and pull request comments and post replies.\"\n }\n },\n \"features\": [\n \"repoClone\",\n \"presetPrompt\",\n \"webhookDelivery\"\n ]\n },\n \"popularityRank\": 98,\n \"estimatedSetupMinutes\": 5,\n \"exampleImplementation\": \"Trigger: cron, every minute (configurable)\\nRequired secret: GITHUB_PERSONAL_ACCESS_TOKEN\\n\\n1. Poll GitHub for new issue and PR comments since the last run.\\n2. Match comments containing the trigger phrase (case-insensitive, default: @OpenHands).\\n3. Post an acknowledgment comment with a link to the new OpenHands conversation.\\n4. Forward follow-up replies in the same thread to the running conversation.\\n5. Post the agent's final response back to GitHub when the conversation completes.\",\n \"setup\": {\n \"version\": \"1.0\",\n \"mode\": \"direct\",\n \"form\": {\n \"triggers\": {\n \"event\": {\n \"on\": {\n \"type\": \"select\",\n \"label\": \"Respond to\",\n \"help\": \"Which GitHub comment event starts a conversation.\",\n \"default\": \"issue_comment.created\",\n \"required\": true,\n \"options\": [\n {\n \"value\": \"issue_comment.created\",\n \"label\": \"Comments on issues and pull requests\"\n },\n {\n \"value\": \"pull_request_review_comment.created\",\n \"label\": \"Pull request review comments only\"\n }\n ]\n },\n \"triggerPhrase\": {\n \"type\": \"text\",\n \"label\": \"Trigger phrase\",\n \"help\": \"Only comments containing this phrase start a conversation. Matched case-insensitively. Quotes and backslashes are not allowed, because the phrase becomes part of the event filter expression.\",\n \"default\": \"@openhands\",\n \"required\": true,\n \"constraints\": {\n \"minLength\": 2,\n \"maxLength\": 50,\n \"format\": \"safeExpressionLiteral\"\n }\n }\n }\n },\n \"args\": {\n \"repository\": {\n \"type\": \"repo-picker\",\n \"label\": \"Repository\",\n \"help\": \"The repository or repositories to watch for mentions.\",\n \"provider\": \"github\",\n \"required\": true\n },\n \"ref\": {\n \"type\": \"text\",\n \"label\": \"Base branch\",\n \"help\": \"Branch checked out when the agent responds.\",\n \"default\": \"main\",\n \"required\": true,\n \"constraints\": {\n \"minLength\": 1,\n \"maxLength\": 255\n }\n }\n }\n },\n \"prompt\": \"A comment in {{form.repository}} mentions '{{form.triggerPhrase}}'. Read the surrounding issue or pull request context from the event payload, then post a helpful reply as a comment on the same thread.\",\n \"filter\": \"icontains(comment.body, '{{form.triggerPhrase}}') && glob(repository.full_name, '{{form.repository}}')\",\n \"message\": \"This deployment cannot run the webhook-driven monitor directly. Set it up in this conversation instead: confirm the repository to watch, the comment event, and the trigger phrase, then create the automation. If webhook delivery is unavailable here, build the polling variant this skill supports.\"\n }\n}\n"],"x_google_ignoreList":[0],"mappings":""}
@@ -0,0 +1,78 @@
1
+ var e = {
2
+ id: "github-repo-monitor",
3
+ name: "GitHub repository monitor",
4
+ category: "Developer tools",
5
+ description: "Watch a repository for @OpenHands mentions in issues and PR comments, start a conversation, and post the agent's reply back to GitHub.",
6
+ requires: {
7
+ integrations: { github: { message: "Used to read issue and pull request comments and post replies." } },
8
+ features: [
9
+ "repoClone",
10
+ "presetPrompt",
11
+ "webhookDelivery"
12
+ ]
13
+ },
14
+ popularityRank: 98,
15
+ estimatedSetupMinutes: 5,
16
+ exampleImplementation: "Trigger: cron, every minute (configurable)\nRequired secret: GITHUB_PERSONAL_ACCESS_TOKEN\n\n1. Poll GitHub for new issue and PR comments since the last run.\n2. Match comments containing the trigger phrase (case-insensitive, default: @OpenHands).\n3. Post an acknowledgment comment with a link to the new OpenHands conversation.\n4. Forward follow-up replies in the same thread to the running conversation.\n5. Post the agent's final response back to GitHub when the conversation completes.",
17
+ setup: {
18
+ version: "1.0",
19
+ mode: "direct",
20
+ form: {
21
+ triggers: { event: {
22
+ on: {
23
+ type: "select",
24
+ label: "Respond to",
25
+ help: "Which GitHub comment event starts a conversation.",
26
+ default: "issue_comment.created",
27
+ required: !0,
28
+ options: [{
29
+ value: "issue_comment.created",
30
+ label: "Comments on issues and pull requests"
31
+ }, {
32
+ value: "pull_request_review_comment.created",
33
+ label: "Pull request review comments only"
34
+ }]
35
+ },
36
+ triggerPhrase: {
37
+ type: "text",
38
+ label: "Trigger phrase",
39
+ help: "Only comments containing this phrase start a conversation. Matched case-insensitively. Quotes and backslashes are not allowed, because the phrase becomes part of the event filter expression.",
40
+ default: "@openhands",
41
+ required: !0,
42
+ constraints: {
43
+ minLength: 2,
44
+ maxLength: 50,
45
+ format: "safeExpressionLiteral"
46
+ }
47
+ }
48
+ } },
49
+ args: {
50
+ repository: {
51
+ type: "repo-picker",
52
+ label: "Repository",
53
+ help: "The repository or repositories to watch for mentions.",
54
+ provider: "github",
55
+ required: !0
56
+ },
57
+ ref: {
58
+ type: "text",
59
+ label: "Base branch",
60
+ help: "Branch checked out when the agent responds.",
61
+ default: "main",
62
+ required: !0,
63
+ constraints: {
64
+ minLength: 1,
65
+ maxLength: 255
66
+ }
67
+ }
68
+ }
69
+ },
70
+ prompt: "A comment in {{form.repository}} mentions '{{form.triggerPhrase}}'. Read the surrounding issue or pull request context from the event payload, then post a helpful reply as a comment on the same thread.",
71
+ filter: "icontains(comment.body, '{{form.triggerPhrase}}') && glob(repository.full_name, '{{form.repository}}')",
72
+ message: "This deployment cannot run the webhook-driven monitor directly. Set it up in this conversation instead: confirm the repository to watch, the comment event, and the trigger phrase, then create the automation. If webhook delivery is unavailable here, build the polling variant this skill supports."
73
+ }
74
+ };
75
+ //#endregion
76
+ export { e as default };
77
+
78
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","names":[],"sources":["../../../../../../../node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.json"],"sourcesContent":["{\n \"id\": \"github-repo-monitor\",\n \"name\": \"GitHub repository monitor\",\n \"category\": \"Developer tools\",\n \"description\": \"Watch a repository for @OpenHands mentions in issues and PR comments, start a conversation, and post the agent's reply back to GitHub.\",\n \"requires\": {\n \"integrations\": {\n \"github\": {\n \"message\": \"Used to read issue and pull request comments and post replies.\"\n }\n },\n \"features\": [\n \"repoClone\",\n \"presetPrompt\",\n \"webhookDelivery\"\n ]\n },\n \"popularityRank\": 98,\n \"estimatedSetupMinutes\": 5,\n \"exampleImplementation\": \"Trigger: cron, every minute (configurable)\\nRequired secret: GITHUB_PERSONAL_ACCESS_TOKEN\\n\\n1. Poll GitHub for new issue and PR comments since the last run.\\n2. Match comments containing the trigger phrase (case-insensitive, default: @OpenHands).\\n3. Post an acknowledgment comment with a link to the new OpenHands conversation.\\n4. Forward follow-up replies in the same thread to the running conversation.\\n5. Post the agent's final response back to GitHub when the conversation completes.\",\n \"setup\": {\n \"version\": \"1.0\",\n \"mode\": \"direct\",\n \"form\": {\n \"triggers\": {\n \"event\": {\n \"on\": {\n \"type\": \"select\",\n \"label\": \"Respond to\",\n \"help\": \"Which GitHub comment event starts a conversation.\",\n \"default\": \"issue_comment.created\",\n \"required\": true,\n \"options\": [\n {\n \"value\": \"issue_comment.created\",\n \"label\": \"Comments on issues and pull requests\"\n },\n {\n \"value\": \"pull_request_review_comment.created\",\n \"label\": \"Pull request review comments only\"\n }\n ]\n },\n \"triggerPhrase\": {\n \"type\": \"text\",\n \"label\": \"Trigger phrase\",\n \"help\": \"Only comments containing this phrase start a conversation. Matched case-insensitively. Quotes and backslashes are not allowed, because the phrase becomes part of the event filter expression.\",\n \"default\": \"@openhands\",\n \"required\": true,\n \"constraints\": {\n \"minLength\": 2,\n \"maxLength\": 50,\n \"format\": \"safeExpressionLiteral\"\n }\n }\n }\n },\n \"args\": {\n \"repository\": {\n \"type\": \"repo-picker\",\n \"label\": \"Repository\",\n \"help\": \"The repository or repositories to watch for mentions.\",\n \"provider\": \"github\",\n \"required\": true\n },\n \"ref\": {\n \"type\": \"text\",\n \"label\": \"Base branch\",\n \"help\": \"Branch checked out when the agent responds.\",\n \"default\": \"main\",\n \"required\": true,\n \"constraints\": {\n \"minLength\": 1,\n \"maxLength\": 255\n }\n }\n }\n },\n \"prompt\": \"A comment in {{form.repository}} mentions '{{form.triggerPhrase}}'. Read the surrounding issue or pull request context from the event payload, then post a helpful reply as a comment on the same thread.\",\n \"filter\": \"icontains(comment.body, '{{form.triggerPhrase}}') && glob(repository.full_name, '{{form.repository}}')\",\n \"message\": \"This deployment cannot run the webhook-driven monitor directly. Set it up in this conversation instead: confirm the repository to watch, the comment event, and the trigger phrase, then create the automation. If webhook delivery is unavailable here, build the polling variant this skill supports.\"\n }\n}\n"],"x_google_ignoreList":[0],"mappings":""}
@@ -0,0 +1,17 @@
1
+ require("../../../../../../_virtual/_rolldown/runtime.cjs");var e={id:`incident-retrospective-drafter`,name:`Incident retrospective drafter`,category:`Reliability`,description:`Collect incident chatter and issue updates, then draft a timeline and follow-up checklist.`,requires:{integrations:{slack:{message:`Reads incident discussion and timestamps.`},linear:{message:`Reads follow-up tickets, owners, and status.`},notion:{message:`Publishes the drafted retrospective. Can be connected later during setup.`,required:!1}},features:[`mcpTools`,`conversationDispatch`]},popularityRank:78,estimatedSetupMinutes:8,skill:`incident-retrospective`,exampleImplementation:`Trigger: manual, cron, or incident label added
2
+ Required MCPs: Slack, Linear, Notion
3
+
4
+ 1. Gather incident messages, timestamps, and linked issue references.
5
+ 2. Pull Linear follow-up tickets, owners, and status.
6
+ 3. TODO: define the incident identifier format and approved Notion template.
7
+ 4. Build a timeline, impact summary, root-cause hypotheses, and action items.
8
+ 5. Publish a draft retrospective and notify the incident owner.`,setup:{version:`1.0`,mode:`assisted`,form:{note:`These answers start the conversation. Anything left blank is something the agent will ask about.`,args:{incidentChannel:{type:`text`,label:`Incident channel`,help:`The Slack channel where incidents are discussed.`,placeholder:`#incidents`,required:!1,constraints:{maxLength:100}},linearTeam:{type:`text`,label:`Linear team`,help:`The team whose follow-up tickets belong in the retrospective.`,required:!1,constraints:{maxLength:100}},notionDestination:{type:`text`,label:`Notion destination`,help:`Page or database where drafts should be published. Leave blank to decide during setup.`,required:!1,constraints:{maxLength:200}},triggerPreference:{type:`select`,label:`How should it run?`,help:`A starting preference only. The agent confirms the exact trigger before creating anything.`,default:`undecided`,required:!1,options:[{value:`undecided`,label:`Let the agent recommend one`},{value:`scheduled`,label:`On a schedule`},{value:`onIncidentLabel`,label:`When an incident is labelled`},{value:`manual`,label:`Only when I run it`}]},notes:{type:`textarea`,label:`Anything else the agent should know?`,help:`Incident naming conventions, an existing retro template, who should be notified.`,required:!1,constraints:{maxLength:2e3}}}},message:`The user supplied these starting points. Confirm each one, ask about anything left blank, then create the automation.
9
+
10
+ - Incident channel: {{form.incidentChannel}}
11
+ - Linear team: {{form.linearTeam}}
12
+ - Notion destination: {{form.notionDestination}}
13
+ - Preferred trigger: {{form.triggerPreference}}
14
+ - Notes: {{form.notes}}
15
+
16
+ Still undecided and required before creation: the incident identifier format and the approved Notion retrospective template.`}};exports.default=e;
17
+ //# sourceMappingURL=manifest.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.cjs","names":[],"sources":["../../../../../../../node_modules/@openhands/extensions/automations/catalog/incident-retrospective-drafter/manifest.json"],"sourcesContent":["{\n \"id\": \"incident-retrospective-drafter\",\n \"name\": \"Incident retrospective drafter\",\n \"category\": \"Reliability\",\n \"description\": \"Collect incident chatter and issue updates, then draft a timeline and follow-up checklist.\",\n \"requires\": {\n \"integrations\": {\n \"slack\": {\n \"message\": \"Reads incident discussion and timestamps.\"\n },\n \"linear\": {\n \"message\": \"Reads follow-up tickets, owners, and status.\"\n },\n \"notion\": {\n \"message\": \"Publishes the drafted retrospective. Can be connected later during setup.\",\n \"required\": false\n }\n },\n \"features\": [\n \"mcpTools\",\n \"conversationDispatch\"\n ]\n },\n \"popularityRank\": 78,\n \"estimatedSetupMinutes\": 8,\n \"skill\": \"incident-retrospective\",\n \"exampleImplementation\": \"Trigger: manual, cron, or incident label added\\nRequired MCPs: Slack, Linear, Notion\\n\\n1. Gather incident messages, timestamps, and linked issue references.\\n2. Pull Linear follow-up tickets, owners, and status.\\n3. TODO: define the incident identifier format and approved Notion template.\\n4. Build a timeline, impact summary, root-cause hypotheses, and action items.\\n5. Publish a draft retrospective and notify the incident owner.\",\n \"setup\": {\n \"version\": \"1.0\",\n \"mode\": \"assisted\",\n \"form\": {\n \"note\": \"These answers start the conversation. Anything left blank is something the agent will ask about.\",\n \"args\": {\n \"incidentChannel\": {\n \"type\": \"text\",\n \"label\": \"Incident channel\",\n \"help\": \"The Slack channel where incidents are discussed.\",\n \"placeholder\": \"#incidents\",\n \"required\": false,\n \"constraints\": {\n \"maxLength\": 100\n }\n },\n \"linearTeam\": {\n \"type\": \"text\",\n \"label\": \"Linear team\",\n \"help\": \"The team whose follow-up tickets belong in the retrospective.\",\n \"required\": false,\n \"constraints\": {\n \"maxLength\": 100\n }\n },\n \"notionDestination\": {\n \"type\": \"text\",\n \"label\": \"Notion destination\",\n \"help\": \"Page or database where drafts should be published. Leave blank to decide during setup.\",\n \"required\": false,\n \"constraints\": {\n \"maxLength\": 200\n }\n },\n \"triggerPreference\": {\n \"type\": \"select\",\n \"label\": \"How should it run?\",\n \"help\": \"A starting preference only. The agent confirms the exact trigger before creating anything.\",\n \"default\": \"undecided\",\n \"required\": false,\n \"options\": [\n {\n \"value\": \"undecided\",\n \"label\": \"Let the agent recommend one\"\n },\n {\n \"value\": \"scheduled\",\n \"label\": \"On a schedule\"\n },\n {\n \"value\": \"onIncidentLabel\",\n \"label\": \"When an incident is labelled\"\n },\n {\n \"value\": \"manual\",\n \"label\": \"Only when I run it\"\n }\n ]\n },\n \"notes\": {\n \"type\": \"textarea\",\n \"label\": \"Anything else the agent should know?\",\n \"help\": \"Incident naming conventions, an existing retro template, who should be notified.\",\n \"required\": false,\n \"constraints\": {\n \"maxLength\": 2000\n }\n }\n }\n },\n \"message\": \"The user supplied these starting points. Confirm each one, ask about anything left blank, then create the automation.\\n\\n- Incident channel: {{form.incidentChannel}}\\n- Linear team: {{form.linearTeam}}\\n- Notion destination: {{form.notionDestination}}\\n- Preferred trigger: {{form.triggerPreference}}\\n- Notes: {{form.notes}}\\n\\nStill undecided and required before creation: the incident identifier format and the approved Notion retrospective template.\"\n }\n}\n"],"x_google_ignoreList":[0],"mappings":""}
@@ -0,0 +1,89 @@
1
+ var e = {
2
+ id: "incident-retrospective-drafter",
3
+ name: "Incident retrospective drafter",
4
+ category: "Reliability",
5
+ description: "Collect incident chatter and issue updates, then draft a timeline and follow-up checklist.",
6
+ requires: {
7
+ integrations: {
8
+ slack: { message: "Reads incident discussion and timestamps." },
9
+ linear: { message: "Reads follow-up tickets, owners, and status." },
10
+ notion: {
11
+ message: "Publishes the drafted retrospective. Can be connected later during setup.",
12
+ required: !1
13
+ }
14
+ },
15
+ features: ["mcpTools", "conversationDispatch"]
16
+ },
17
+ popularityRank: 78,
18
+ estimatedSetupMinutes: 8,
19
+ skill: "incident-retrospective",
20
+ exampleImplementation: "Trigger: manual, cron, or incident label added\nRequired MCPs: Slack, Linear, Notion\n\n1. Gather incident messages, timestamps, and linked issue references.\n2. Pull Linear follow-up tickets, owners, and status.\n3. TODO: define the incident identifier format and approved Notion template.\n4. Build a timeline, impact summary, root-cause hypotheses, and action items.\n5. Publish a draft retrospective and notify the incident owner.",
21
+ setup: {
22
+ version: "1.0",
23
+ mode: "assisted",
24
+ form: {
25
+ note: "These answers start the conversation. Anything left blank is something the agent will ask about.",
26
+ args: {
27
+ incidentChannel: {
28
+ type: "text",
29
+ label: "Incident channel",
30
+ help: "The Slack channel where incidents are discussed.",
31
+ placeholder: "#incidents",
32
+ required: !1,
33
+ constraints: { maxLength: 100 }
34
+ },
35
+ linearTeam: {
36
+ type: "text",
37
+ label: "Linear team",
38
+ help: "The team whose follow-up tickets belong in the retrospective.",
39
+ required: !1,
40
+ constraints: { maxLength: 100 }
41
+ },
42
+ notionDestination: {
43
+ type: "text",
44
+ label: "Notion destination",
45
+ help: "Page or database where drafts should be published. Leave blank to decide during setup.",
46
+ required: !1,
47
+ constraints: { maxLength: 200 }
48
+ },
49
+ triggerPreference: {
50
+ type: "select",
51
+ label: "How should it run?",
52
+ help: "A starting preference only. The agent confirms the exact trigger before creating anything.",
53
+ default: "undecided",
54
+ required: !1,
55
+ options: [
56
+ {
57
+ value: "undecided",
58
+ label: "Let the agent recommend one"
59
+ },
60
+ {
61
+ value: "scheduled",
62
+ label: "On a schedule"
63
+ },
64
+ {
65
+ value: "onIncidentLabel",
66
+ label: "When an incident is labelled"
67
+ },
68
+ {
69
+ value: "manual",
70
+ label: "Only when I run it"
71
+ }
72
+ ]
73
+ },
74
+ notes: {
75
+ type: "textarea",
76
+ label: "Anything else the agent should know?",
77
+ help: "Incident naming conventions, an existing retro template, who should be notified.",
78
+ required: !1,
79
+ constraints: { maxLength: 2e3 }
80
+ }
81
+ }
82
+ },
83
+ message: "The user supplied these starting points. Confirm each one, ask about anything left blank, then create the automation.\n\n- Incident channel: {{form.incidentChannel}}\n- Linear team: {{form.linearTeam}}\n- Notion destination: {{form.notionDestination}}\n- Preferred trigger: {{form.triggerPreference}}\n- Notes: {{form.notes}}\n\nStill undecided and required before creation: the incident identifier format and the approved Notion retrospective template."
84
+ }
85
+ };
86
+ //#endregion
87
+ export { e as default };
88
+
89
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","names":[],"sources":["../../../../../../../node_modules/@openhands/extensions/automations/catalog/incident-retrospective-drafter/manifest.json"],"sourcesContent":["{\n \"id\": \"incident-retrospective-drafter\",\n \"name\": \"Incident retrospective drafter\",\n \"category\": \"Reliability\",\n \"description\": \"Collect incident chatter and issue updates, then draft a timeline and follow-up checklist.\",\n \"requires\": {\n \"integrations\": {\n \"slack\": {\n \"message\": \"Reads incident discussion and timestamps.\"\n },\n \"linear\": {\n \"message\": \"Reads follow-up tickets, owners, and status.\"\n },\n \"notion\": {\n \"message\": \"Publishes the drafted retrospective. Can be connected later during setup.\",\n \"required\": false\n }\n },\n \"features\": [\n \"mcpTools\",\n \"conversationDispatch\"\n ]\n },\n \"popularityRank\": 78,\n \"estimatedSetupMinutes\": 8,\n \"skill\": \"incident-retrospective\",\n \"exampleImplementation\": \"Trigger: manual, cron, or incident label added\\nRequired MCPs: Slack, Linear, Notion\\n\\n1. Gather incident messages, timestamps, and linked issue references.\\n2. Pull Linear follow-up tickets, owners, and status.\\n3. TODO: define the incident identifier format and approved Notion template.\\n4. Build a timeline, impact summary, root-cause hypotheses, and action items.\\n5. Publish a draft retrospective and notify the incident owner.\",\n \"setup\": {\n \"version\": \"1.0\",\n \"mode\": \"assisted\",\n \"form\": {\n \"note\": \"These answers start the conversation. Anything left blank is something the agent will ask about.\",\n \"args\": {\n \"incidentChannel\": {\n \"type\": \"text\",\n \"label\": \"Incident channel\",\n \"help\": \"The Slack channel where incidents are discussed.\",\n \"placeholder\": \"#incidents\",\n \"required\": false,\n \"constraints\": {\n \"maxLength\": 100\n }\n },\n \"linearTeam\": {\n \"type\": \"text\",\n \"label\": \"Linear team\",\n \"help\": \"The team whose follow-up tickets belong in the retrospective.\",\n \"required\": false,\n \"constraints\": {\n \"maxLength\": 100\n }\n },\n \"notionDestination\": {\n \"type\": \"text\",\n \"label\": \"Notion destination\",\n \"help\": \"Page or database where drafts should be published. Leave blank to decide during setup.\",\n \"required\": false,\n \"constraints\": {\n \"maxLength\": 200\n }\n },\n \"triggerPreference\": {\n \"type\": \"select\",\n \"label\": \"How should it run?\",\n \"help\": \"A starting preference only. The agent confirms the exact trigger before creating anything.\",\n \"default\": \"undecided\",\n \"required\": false,\n \"options\": [\n {\n \"value\": \"undecided\",\n \"label\": \"Let the agent recommend one\"\n },\n {\n \"value\": \"scheduled\",\n \"label\": \"On a schedule\"\n },\n {\n \"value\": \"onIncidentLabel\",\n \"label\": \"When an incident is labelled\"\n },\n {\n \"value\": \"manual\",\n \"label\": \"Only when I run it\"\n }\n ]\n },\n \"notes\": {\n \"type\": \"textarea\",\n \"label\": \"Anything else the agent should know?\",\n \"help\": \"Incident naming conventions, an existing retro template, who should be notified.\",\n \"required\": false,\n \"constraints\": {\n \"maxLength\": 2000\n }\n }\n }\n },\n \"message\": \"The user supplied these starting points. Confirm each one, ask about anything left blank, then create the automation.\\n\\n- Incident channel: {{form.incidentChannel}}\\n- Linear team: {{form.linearTeam}}\\n- Notion destination: {{form.notionDestination}}\\n- Preferred trigger: {{form.triggerPreference}}\\n- Notes: {{form.notes}}\\n\\nStill undecided and required before creation: the incident identifier format and the approved Notion retrospective template.\"\n }\n}\n"],"x_google_ignoreList":[0],"mappings":""}
@@ -0,0 +1,10 @@
1
+ require("../../../../../../_virtual/_rolldown/runtime.cjs");var e={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:{jira:{message:`Reads the project for issues carrying the trigger label.`},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)
2
+ Required secrets: Jira API token, GitHub personal access token (repo + workflow scope)
3
+
4
+ 1. Collect 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.
5
+ 2. Poll POST /rest/api/3/search/jql on the Jira Cloud instance to find open issues carrying the configured label.
6
+ 3. Deduplicate against a KV-store-backed set of already-processed issue keys so re-runs never create duplicate PRs.
7
+ 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.
8
+ 5. Immediately after the conversation is created, post a Jira comment on the issue: 'I'm on it: <conversation URL>'.
9
+ 6. Persist the processed issue key immediately after dispatching so the next poll skips it.`};exports.default=e;
10
+ //# sourceMappingURL=manifest.cjs.map