@openhands/agent-canvas 1.2.0 → 1.3.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 (327) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/{Trans-De9RwQhA.js → Trans-DY6toRDu.js} +1 -1
  4. package/build/assets/{acp-providers-D_D8VUpP.js → acp-providers-Djl6vNn-.js} +1 -1
  5. package/build/assets/active-backend-context-B3umL5R-.js +1 -0
  6. package/build/assets/{add-backend-modal-DzuB9zlG.js → add-backend-modal-DljoP9lc.js} +1 -1
  7. package/build/assets/{agent-profiles-settings-BfAwTshW.js → agent-profiles-settings-BJMmTZgv.js} +1 -1
  8. package/build/assets/{agent-server-conversation-service.api-DfH2k6Sx.js → agent-server-conversation-service.api-D_ZvtJjG.js} +3 -3
  9. package/build/assets/agent-settings-BVVFzBWS.js +1 -0
  10. package/build/assets/{agent-settings-DjVlKgaP.js → agent-settings-lUknCeaF.js} +1 -1
  11. package/build/assets/{alert-banner-BW0wRYw6.js → alert-banner-Bpf2NQJq.js} +1 -1
  12. package/build/assets/{api-key-entry-screen-O8gS-fnF.js → api-key-entry-screen-CWEHcPJA.js} +1 -1
  13. package/build/assets/{app-settings-SlZvaXlk.js → app-settings-Dj90qosy.js} +1 -1
  14. package/build/assets/automation-detail-CXJU0_gF.js +2 -0
  15. package/build/assets/automation-export-FWY9LPsG.js +2 -0
  16. package/build/assets/automations-list-DDGBkWLC.js +1 -0
  17. package/build/assets/{back-nav-button-BYmxFxGt.js → back-nav-button-CUS2mi-U.js} +1 -1
  18. package/build/assets/{backend-form-modal-D2EDGVAc.js → backend-form-modal-DSbrafX2.js} +1 -1
  19. package/build/assets/{backend-synced-settings-badge-6OCwIuLY.js → backend-synced-settings-badge-CanzmG12.js} +1 -1
  20. package/build/assets/{base-modal-CC5Pp8CF.js → base-modal-BuF2f0YL.js} +1 -1
  21. package/build/assets/{brand-button-DKPMEKcW.js → brand-button-vMVuyDXu.js} +1 -1
  22. package/build/assets/{browser-B39N74jU.js → browser-BifzWIBd.js} +1 -1
  23. package/build/assets/{browser-tab-aiDg7aEn.js → browser-tab-CkkqJnqw.js} +1 -1
  24. package/build/assets/{chat-send-button-DxuZIoW8.js → chat-send-button-B_jc5z5C.js} +1 -1
  25. package/build/assets/{circle-plus-check-toggle-T3eAIuPQ.js → circle-plus-check-toggle-C5YxjxvI.js} +1 -1
  26. package/build/assets/{color-themes-Dd1sO5U6.js → color-themes-DPBzNtVg.js} +3 -3
  27. package/build/assets/{combobox-caret-CLGvOs32.js → combobox-caret-DoObzqf4.js} +1 -1
  28. package/build/assets/{command-menu-DKrLCRla.js → command-menu-D-JV3Wqm.js} +1 -1
  29. package/build/assets/{condenser-settings-BhxvlfoY.js → condenser-settings-30cX9SK6.js} +1 -1
  30. package/build/assets/{confirmation-modal-BK1F0A68.js → confirmation-modal-BGLu6XJN.js} +1 -1
  31. package/build/assets/{context-menu-list-item-DBFzplWW.js → context-menu-list-item-BD5_EaKN.js} +1 -1
  32. package/build/assets/conversation-BltULtFA.js +89 -0
  33. package/build/assets/conversation-e0a0_X4S.js +1 -0
  34. package/build/assets/conversation-panel-Cr9_ZGI-.js +1 -0
  35. package/build/assets/{conversation-service.api-Ch9kR9aE.js → conversation-service.api-DQaKzIRj.js} +1 -1
  36. package/build/assets/{conversation-tab-empty-state-m8IUkfMj.js → conversation-tab-empty-state-B2dDYEwf.js} +1 -1
  37. package/build/assets/{copy-to-clipboard-button-Aj9wFmt2.js → copy-to-clipboard-button-CaR52OnA.js} +1 -1
  38. package/build/assets/declaration-gq8V5eTU.js +1 -0
  39. package/build/assets/{device-verify-B5YCrvSu.js → device-verify-BsznkV-a.js} +1 -1
  40. package/build/assets/{dropdown-classes-CgQ45JmQ.js → dropdown-classes-DJSXeLqc.js} +1 -1
  41. package/build/assets/{ellipsis-button-1BV9Sga8.js → ellipsis-button-C5Z-tPFp.js} +1 -1
  42. package/build/assets/{entry.client-BgWj9jL_.js → entry.client-JixNvFrr.js} +2 -2
  43. package/build/assets/{enum-filter-dropdown-DCITiYVi.js → enum-filter-dropdown-DXbVwiNZ.js} +1 -1
  44. package/build/assets/{environment-switch-overlay-DUnKILNH.js → environment-switch-overlay-DZQfRGTx.js} +1 -1
  45. package/build/assets/{extensions-hub-MtC8lK3A.js → extensions-hub-DfvgqzTc.js} +1 -1
  46. package/build/assets/{extensions-navigation-BtV14oQL.js → extensions-navigation-D9i0DL62.js} +1 -1
  47. package/build/assets/files-tab-DDtEJcGE.js +1 -0
  48. package/build/assets/{form-control-classes-9rkU4usZ.js → form-control-classes-ChpNBe9n.js} +1 -1
  49. package/build/assets/{git-provider-icon-CGU7_KiU.js → git-provider-icon-BjkecAuV.js} +1 -1
  50. package/build/assets/home-BCKWpKpf.js +1 -0
  51. package/build/assets/{install-server-modal-J_eQ6lhG.js → install-server-modal-BIugLhVB.js} +1 -1
  52. package/build/assets/{launch-DamfAY5L.js → launch-BgIlZLSX.js} +1 -1
  53. package/build/assets/lesson-plan-DgpP80mJ.js +4 -0
  54. package/build/assets/{llm-not-configured-banner-DTrLsVr_.js → llm-not-configured-banner-BlX8NifC.js} +4 -4
  55. package/build/assets/llm-settings-DJmbryaE.js +1 -0
  56. package/build/assets/{llm-settings-BgSFkbHC.js → llm-settings-kU5v0H1Z.js} +1 -1
  57. package/build/assets/{loading-spinner-DHAIPZkP.js → loading-spinner-BLdswi6q.js} +1 -1
  58. package/build/assets/{manage-backends-modal-BUzj5_Lq.js → manage-backends-modal-C8FJQIZR.js} +1 -1
  59. package/build/assets/manifest-56d40d7c.js +1 -0
  60. package/build/assets/{markdown-renderer-D8mayGjI.js → markdown-renderer-DMT7Zkpd.js} +1 -1
  61. package/build/assets/{mcp-DvqJYDbz.js → mcp-CHkklDMv.js} +1 -1
  62. package/build/assets/{messages-C4KEFkPk.js → messages-B3RugH7P.js} +11 -11
  63. package/build/assets/{modal-body-Dcu5McCa.js → modal-body-DouOE5KH.js} +1 -1
  64. package/build/assets/{modal-classes-DPqxSyuP.js → modal-classes-Cf-4tbHz.js} +1 -1
  65. package/build/assets/{modal-close-button-CTCX4nCH.js → modal-close-button-B6CfxxJj.js} +1 -1
  66. package/build/assets/{model-selector-VDHBytb6.js → model-selector-BOj1wBlq.js} +1 -1
  67. package/build/assets/onboarding-DYhDxmI9.js +1 -0
  68. package/build/assets/{onboarding-modal-CGHPoMp7.js → onboarding-modal-CP_WxDC9.js} +1 -1
  69. package/build/assets/{option-service.api-Dz7Eomnx.js → option-service.api-C0tYT4-r.js} +1 -1
  70. package/build/assets/{path-utils-CBaRYg35.js → path-utils-DWcgCGen.js} +1 -1
  71. package/build/assets/{plan-components-j9X4AxYM.js → plan-components-CcCBmCzW.js} +1 -1
  72. package/build/assets/{planner-tab-G4j36bJk.js → planner-tab-CCqdXxkL.js} +1 -1
  73. package/build/assets/providers-BxCuC9bZ.js +1 -0
  74. package/build/assets/recommended-automations-launcher-CVEF_1pc.js +58 -0
  75. package/build/assets/root-V8fkplMy.css +1 -0
  76. package/build/assets/root-layout-CttG_lQi.js +2 -0
  77. package/build/assets/{root-S6CfVoNm.js → root-uJ2t9rCQ.js} +2 -2
  78. package/build/assets/{runtime-waiting-state-DkzLgvMn.js → runtime-waiting-state-BsXLElvN.js} +1 -1
  79. package/build/assets/{schema-field-DwUzlw6b.js → schema-field-xUr6rDd6.js} +1 -1
  80. package/build/assets/{sdk-section-page-BUXONTx6.js → sdk-section-page-CbLrVUa3.js} +1 -1
  81. package/build/assets/{sdk-settings-schema-BjBkMHzZ.js → sdk-settings-schema-Cv7M9eSe.js} +1 -1
  82. package/build/assets/{secrets-settings-ZxyfRBgx.js → secrets-settings-DxTx9HgU.js} +1 -1
  83. package/build/assets/{segmented-toggle-Cen5AMUc.js → segmented-toggle-DyQqPhoD.js} +1 -1
  84. package/build/assets/{settings-Bx6vn-g8.js → settings-DnlfS09K.js} +1 -1
  85. package/build/assets/{settings-dropdown-input-xzoZwgUe.js → settings-dropdown-input-BjunGXJb.js} +1 -1
  86. package/build/assets/{settings-index-D4SM26d5.js → settings-index-BjeuYFFa.js} +1 -1
  87. package/build/assets/{settings-input-DYs7t3oK.js → settings-input-bD6npsDm.js} +1 -1
  88. package/build/assets/{settings-list-classes-DvQr5jVS.js → settings-list-classes-Dp_OgzN0.js} +1 -1
  89. package/build/assets/{settings-modal-BoC8oMlg.js → settings-modal-DfTcL-mV.js} +1 -1
  90. package/build/assets/settings-service.api-K4ncGlBv.js +1 -0
  91. package/build/assets/{settings-switch-C2N2xqEb.js → settings-switch-5cuxl8Dc.js} +1 -1
  92. package/build/assets/{shared-conversation-DMiaQFsj.js → shared-conversation-DWtBkJv7.js} +1 -1
  93. package/build/assets/{sidebar-layout-BtpUSN3j.js → sidebar-layout-DuzJMMw-.js} +1 -1
  94. package/build/assets/{sidebar-mobile-menu-toggle-CaV3tQFF.js → sidebar-mobile-menu-toggle-CMmAYkh8.js} +1 -1
  95. package/build/assets/{sidebar-nav-link-CIB3NBRW.js → sidebar-nav-link-5AlTT5-j.js} +1 -1
  96. package/build/assets/{skill-card-pill-row-D2bUe2kB.js → skill-card-pill-row-eTIkE4nz.js} +1 -1
  97. package/build/assets/{skills-plugins-D2WkrXkr.js → skills-plugins-BJ040luO.js} +1 -1
  98. package/build/assets/{skills-settings-CZGVOp_t.js → skills-settings-BYn4-AQQ.js} +1 -1
  99. package/build/assets/{styled-tooltip-DsKsFjuq.js → styled-tooltip-CgX2oRaK.js} +1 -1
  100. package/build/assets/{task-list-tab-BAThr9Ex.js → task-list-tab-0k9PhuqO.js} +1 -1
  101. package/build/assets/{terminal-B0aL_iDZ.js → terminal-BsGcSpRS.js} +1 -1
  102. package/build/assets/{toggle-switch-DBlOOzBr.js → toggle-switch-2j5wwR85.js} +1 -1
  103. package/build/assets/{typography-YGPBGzOG.js → typography-D8mHDeNG.js} +1 -1
  104. package/build/assets/{use-acp-credential-form-rzaqkJ1n.js → use-acp-credential-form-EtnbtYt0.js} +1 -1
  105. package/build/assets/{use-activate-agent-profile-DY0txItX.js → use-activate-agent-profile-WaAZYz4E.js} +1 -1
  106. package/build/assets/{use-active-agent-profile-Cp5AFONR.js → use-active-agent-profile-CYY3vGar.js} +1 -1
  107. package/build/assets/{use-active-conversation-DvcFBqFe.js → use-active-conversation-D-r929nx.js} +1 -1
  108. package/build/assets/{use-agent-profiles-DnH16_Vm.js → use-agent-profiles-DEAMFp-W.js} +1 -1
  109. package/build/assets/{use-agent-state-BvRcEzY4.js → use-agent-state-DijdVAQ0.js} +1 -1
  110. package/build/assets/{use-backends-health-e-Ull4wz.js → use-backends-health-DkC7tKkC.js} +1 -1
  111. package/build/assets/{use-can-manage-org-profiles-OIhplvQ0.js → use-can-manage-org-profiles-BEo0peGn.js} +1 -1
  112. package/build/assets/{use-cloud-current-user-id-ekU7UXDT.js → use-cloud-current-user-id-Dm99wXp2.js} +1 -1
  113. package/build/assets/{use-config-Dwf5gla-.js → use-config-CHzNIHpv.js} +1 -1
  114. package/build/assets/{use-create-conversation-CvAXfA3T.js → use-create-conversation-CTsvZ96U.js} +1 -1
  115. package/build/assets/{use-create-secret-BKeXCo__.js → use-create-secret-D5O5qdWC.js} +1 -1
  116. package/build/assets/{use-event-store-YSOxy9FC.js → use-event-store-DjgU4wfO.js} +1 -1
  117. package/build/assets/{use-handle-plan-click-cAXS-Hft.js → use-handle-plan-click-Mn_SNTCh.js} +1 -1
  118. package/build/assets/{use-llm-profiles-BcLibtGb.js → use-llm-profiles-BMhPDlwQ.js} +1 -1
  119. package/build/assets/use-runtime-is-ready-CC-KrLKe.js +1 -0
  120. package/build/assets/{use-save-agent-profile-DFjxHhNx.js → use-save-agent-profile-CLMmbx_X.js} +1 -1
  121. package/build/assets/{use-save-settings-5xPYpSQM.js → use-save-settings-D1HoCDbn.js} +1 -1
  122. package/build/assets/{use-settings-B07msZ2Z.js → use-settings-BReAMxCG.js} +1 -1
  123. package/build/assets/{use-settings-nav-items-CswsOEyw.js → use-settings-nav-items-xe1YgLnE.js} +1 -1
  124. package/build/assets/{use-skills-Aoaoq_ei.js → use-skills-Dqo-pDDx.js} +1 -1
  125. package/build/assets/{use-task-list-CmWGElgb.js → use-task-list-AVBLbbcR.js} +1 -1
  126. package/build/assets/{use-tracking-CqODdfO4.js → use-tracking-2ZwQwpg_.js} +1 -1
  127. package/build/assets/{use-user-conversation-BPHQ-dm-.js → use-user-conversation-OAfenBRG.js} +1 -1
  128. package/build/assets/{useTranslation-Cgy4JA_g.js → useTranslation-CDRCKC9-.js} +1 -1
  129. package/build/assets/{utils-CE0lDWtb.js → utils-D3U3rlqr.js} +1 -1
  130. package/build/assets/{vendor~root-layout~home~conversation-panel~conversation~launch~skills-settings~automations-~ki5qnp0d-DJHl5b-B.js → vendor~root-layout~home~conversation-panel~conversation~launch~skills-settings~automations-~ki5qnp0d-rV6d1Iv_.js} +267 -27
  131. package/build/assets/vendor~root-layout~home~mcp~automations-list~onboarding-modal-CXyYYvYh.js +1 -0
  132. package/build/assets/{verification-settings-DZQ-JvKH.js → verification-settings-DnXS6VWv.js} +1 -1
  133. package/build/index.html +4 -4
  134. package/build/locales/ar/openhands.json +24 -0
  135. package/build/locales/ca/openhands.json +24 -0
  136. package/build/locales/de/openhands.json +24 -0
  137. package/build/locales/en/openhands.json +24 -0
  138. package/build/locales/es/openhands.json +24 -0
  139. package/build/locales/fr/openhands.json +24 -0
  140. package/build/locales/it/openhands.json +24 -0
  141. package/build/locales/ja/openhands.json +24 -0
  142. package/build/locales/ko-KR/openhands.json +24 -0
  143. package/build/locales/no/openhands.json +24 -0
  144. package/build/locales/pt/openhands.json +24 -0
  145. package/build/locales/tr/openhands.json +24 -0
  146. package/build/locales/uk/openhands.json +24 -0
  147. package/build/locales/zh-CN/openhands.json +24 -0
  148. package/build/locales/zh-TW/openhands.json +24 -0
  149. package/config/defaults.json +4 -4
  150. package/dist/api/automation-service/automation-service.api.d.ts +2 -1
  151. package/dist/api/event-service/event-service.api.cjs +1 -1
  152. package/dist/api/event-service/event-service.api.cjs.map +1 -1
  153. package/dist/api/event-service/event-service.api.js +1 -1
  154. package/dist/api/event-service/event-service.api.js.map +1 -1
  155. package/dist/api/event-service/event-service.types.d.ts +6 -0
  156. package/dist/api/git-service/agent-server-git-service.api.cjs +1 -1
  157. package/dist/api/git-service/agent-server-git-service.api.cjs.map +1 -1
  158. package/dist/api/git-service/agent-server-git-service.api.js +2 -2
  159. package/dist/api/git-service/agent-server-git-service.api.js.map +1 -1
  160. package/dist/api/git-service/git-service.api.cjs +1 -1
  161. package/dist/api/git-service/git-service.api.cjs.map +1 -1
  162. package/dist/api/git-service/git-service.api.js +2 -2
  163. package/dist/api/git-service/git-service.api.js.map +1 -1
  164. package/dist/components/conversation-events/chat/event-thought-helpers.cjs +1 -1
  165. package/dist/components/conversation-events/chat/event-thought-helpers.js +1 -1
  166. package/dist/components/features/automations/automation-card.d.ts +2 -1
  167. package/dist/components/features/automations/automation-group.d.ts +2 -1
  168. package/dist/components/features/automations/automation-list-row.d.ts +2 -1
  169. package/dist/components/features/automations/build-automation-menu-items.d.ts +2 -1
  170. package/dist/components/features/automations/detail/detail-header.d.ts +3 -1
  171. package/dist/components/features/automations/import-automation-modal.d.ts +10 -0
  172. package/dist/components/features/conversation/conversation-name-context-menu.cjs +1 -1
  173. package/dist/components/features/conversation/conversation-name-context-menu.cjs.map +1 -1
  174. package/dist/components/features/conversation/conversation-name-context-menu.d.ts +2 -1
  175. package/dist/components/features/conversation/conversation-name-context-menu.js +74 -63
  176. package/dist/components/features/conversation/conversation-name-context-menu.js.map +1 -1
  177. package/dist/components/features/conversation/conversation-name.cjs +1 -1
  178. package/dist/components/features/conversation/conversation-name.cjs.map +1 -1
  179. package/dist/components/features/conversation/conversation-name.js +73 -61
  180. package/dist/components/features/conversation/conversation-name.js.map +1 -1
  181. package/dist/components/features/conversation/transcript-export-modal.cjs +2 -0
  182. package/dist/components/features/conversation/transcript-export-modal.cjs.map +1 -0
  183. package/dist/components/features/conversation/transcript-export-modal.d.ts +10 -0
  184. package/dist/components/features/conversation/transcript-export-modal.js +140 -0
  185. package/dist/components/features/conversation/transcript-export-modal.js.map +1 -0
  186. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs +1 -1
  187. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs.map +1 -1
  188. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js +1 -1
  189. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js.map +1 -1
  190. package/dist/components/features/home/shared/dropdown-item.cjs +1 -1
  191. package/dist/components/features/home/shared/dropdown-item.cjs.map +1 -1
  192. package/dist/components/features/home/shared/dropdown-item.d.ts +7 -1
  193. package/dist/components/features/home/shared/dropdown-item.js +2 -1
  194. package/dist/components/features/home/shared/dropdown-item.js.map +1 -1
  195. package/dist/components/features/home/shared/generic-dropdown-menu.cjs +1 -1
  196. package/dist/components/features/home/shared/generic-dropdown-menu.cjs.map +1 -1
  197. package/dist/components/features/home/shared/generic-dropdown-menu.d.ts +8 -1
  198. package/dist/components/features/home/shared/generic-dropdown-menu.js +18 -10
  199. package/dist/components/features/home/shared/generic-dropdown-menu.js.map +1 -1
  200. package/dist/components/features/home/workspace-dropdown/workspace-dropdown.d.ts +11 -2
  201. package/dist/config/defaults.cjs +1 -1
  202. package/dist/config/defaults.cjs.map +1 -1
  203. package/dist/config/defaults.js +4 -4
  204. package/dist/config/defaults.js.map +1 -1
  205. package/dist/hooks/query/use-automations.d.ts +2 -1
  206. package/dist/hooks/query/use-resolved-workspaces.cjs +1 -1
  207. package/dist/hooks/query/use-resolved-workspaces.cjs.map +1 -1
  208. package/dist/hooks/query/use-resolved-workspaces.d.ts +9 -1
  209. package/dist/hooks/query/use-resolved-workspaces.js +1 -0
  210. package/dist/hooks/query/use-resolved-workspaces.js.map +1 -1
  211. package/dist/hooks/query/use-workspace-file-content.cjs +1 -1
  212. package/dist/hooks/query/use-workspace-file-content.cjs.map +1 -1
  213. package/dist/hooks/query/use-workspace-file-content.js +61 -55
  214. package/dist/hooks/query/use-workspace-file-content.js.map +1 -1
  215. package/dist/hooks/query/use-workspace-files.cjs +1 -1
  216. package/dist/hooks/query/use-workspace-files.cjs.map +1 -1
  217. package/dist/hooks/query/use-workspace-files.d.ts +11 -4
  218. package/dist/hooks/query/use-workspace-files.js +39 -18
  219. package/dist/hooks/query/use-workspace-files.js.map +1 -1
  220. package/dist/hooks/use-auto-refresh-files-on-edit.cjs +1 -1
  221. package/dist/hooks/use-auto-refresh-files-on-edit.cjs.map +1 -1
  222. package/dist/hooks/use-auto-refresh-files-on-edit.d.ts +9 -0
  223. package/dist/hooks/use-auto-refresh-files-on-edit.js +15 -11
  224. package/dist/hooks/use-auto-refresh-files-on-edit.js.map +1 -1
  225. package/dist/hooks/use-tracking.cjs +1 -1
  226. package/dist/hooks/use-tracking.cjs.map +1 -1
  227. package/dist/hooks/use-tracking.d.ts +7 -0
  228. package/dist/hooks/use-tracking.js +9 -0
  229. package/dist/hooks/use-tracking.js.map +1 -1
  230. package/dist/i18n/declaration.cjs +1 -1
  231. package/dist/i18n/declaration.cjs.map +1 -1
  232. package/dist/i18n/declaration.d.ts +24 -0
  233. package/dist/i18n/declaration.js +1 -1
  234. package/dist/i18n/declaration.js.map +1 -1
  235. package/dist/i18n/translation.cjs +1 -1
  236. package/dist/i18n/translation.cjs.map +1 -1
  237. package/dist/i18n/translation.js +408 -0
  238. package/dist/i18n/translation.js.map +1 -1
  239. package/dist/locales/ar/openhands.json +24 -0
  240. package/dist/locales/ca/openhands.json +24 -0
  241. package/dist/locales/de/openhands.json +24 -0
  242. package/dist/locales/en/openhands.json +24 -0
  243. package/dist/locales/es/openhands.json +24 -0
  244. package/dist/locales/fr/openhands.json +24 -0
  245. package/dist/locales/it/openhands.json +24 -0
  246. package/dist/locales/ja/openhands.json +24 -0
  247. package/dist/locales/ko-KR/openhands.json +24 -0
  248. package/dist/locales/no/openhands.json +24 -0
  249. package/dist/locales/pt/openhands.json +24 -0
  250. package/dist/locales/tr/openhands.json +24 -0
  251. package/dist/locales/uk/openhands.json +24 -0
  252. package/dist/locales/zh-CN/openhands.json +24 -0
  253. package/dist/locales/zh-TW/openhands.json +24 -0
  254. package/dist/node_modules/@openhands/extensions/integrations/catalog/atlassian.cjs +1 -1
  255. package/dist/node_modules/@openhands/extensions/integrations/catalog/atlassian.cjs.map +1 -1
  256. package/dist/node_modules/@openhands/extensions/integrations/catalog/atlassian.js +70 -3
  257. package/dist/node_modules/@openhands/extensions/integrations/catalog/atlassian.js.map +1 -1
  258. package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.cjs +1 -1
  259. package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.cjs.map +1 -1
  260. package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.js +27 -2
  261. package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.js.map +1 -1
  262. package/dist/node_modules/@openhands/extensions/integrations/catalog/superhuman-mail.cjs +2 -0
  263. package/dist/node_modules/@openhands/extensions/integrations/catalog/superhuman-mail.cjs.map +1 -0
  264. package/dist/node_modules/@openhands/extensions/integrations/catalog/superhuman-mail.js +33 -0
  265. package/dist/node_modules/@openhands/extensions/integrations/catalog/superhuman-mail.js.map +1 -0
  266. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs +1 -1
  267. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs.map +1 -1
  268. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js +48 -46
  269. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js.map +1 -1
  270. package/dist/node_modules/@openhands/extensions/skills/index.cjs +267 -27
  271. package/dist/node_modules/@openhands/extensions/skills/index.cjs.map +1 -1
  272. package/dist/node_modules/@openhands/extensions/skills/index.js +36 -30
  273. package/dist/node_modules/@openhands/extensions/skills/index.js.map +1 -1
  274. package/dist/package.cjs +1 -1
  275. package/dist/package.cjs.map +1 -1
  276. package/dist/package.js +2 -2
  277. package/dist/package.js.map +1 -1
  278. package/dist/routes/files-tab.cjs +1 -1
  279. package/dist/routes/files-tab.js +10 -10
  280. package/dist/themes/color-themes.cjs +3 -3
  281. package/dist/themes/color-themes.cjs.map +1 -1
  282. package/dist/themes/color-themes.d.ts +13 -2
  283. package/dist/themes/color-themes.js +2 -2
  284. package/dist/themes/color-themes.js.map +1 -1
  285. package/dist/types/automation.d.ts +8 -0
  286. package/dist/utils/custom-toast-handlers.cjs.map +1 -1
  287. package/dist/utils/custom-toast-handlers.d.ts +1 -0
  288. package/dist/utils/custom-toast-handlers.js.map +1 -1
  289. package/dist/utils/mcp-server-name.cjs +1 -1
  290. package/dist/utils/mcp-server-name.cjs.map +1 -1
  291. package/dist/utils/mcp-server-name.js +2 -2
  292. package/dist/utils/mcp-server-name.js.map +1 -1
  293. package/dist/utils/transcript-export/index.cjs +72 -0
  294. package/dist/utils/transcript-export/index.cjs.map +1 -0
  295. package/dist/utils/transcript-export/index.d.ts +10 -0
  296. package/dist/utils/transcript-export/index.js +302 -0
  297. package/dist/utils/transcript-export/index.js.map +1 -0
  298. package/dist/utils/transcript-export/load-complete-events.cjs +2 -0
  299. package/dist/utils/transcript-export/load-complete-events.cjs.map +1 -0
  300. package/dist/utils/transcript-export/load-complete-events.d.ts +22 -0
  301. package/dist/utils/transcript-export/load-complete-events.js +39 -0
  302. package/dist/utils/transcript-export/load-complete-events.js.map +1 -0
  303. package/package.json +2 -2
  304. package/scripts/check-sdk-version-sync.mjs +6 -6
  305. package/scripts/dev-safe.mjs +2 -2
  306. package/build/assets/active-backend-context-DRFevVIj.js +0 -1
  307. package/build/assets/agent-settings-CMMms-0q.js +0 -1
  308. package/build/assets/automation-detail-CwsNJ9AM.js +0 -2
  309. package/build/assets/automations-list-B9cPtugh.js +0 -1
  310. package/build/assets/conversation-B8prFAZF.js +0 -19
  311. package/build/assets/conversation-DGVDwGn8.js +0 -1
  312. package/build/assets/conversation-panel-C7DC4Cxx.js +0 -1
  313. package/build/assets/declaration-B9kpCaYl.js +0 -1
  314. package/build/assets/edit-automation-modal-BoibW8cd.js +0 -1
  315. package/build/assets/files-tab-DHqtsKLy.js +0 -1
  316. package/build/assets/home-BgjWP_UN.js +0 -1
  317. package/build/assets/lesson-plan-HD886V64.js +0 -4
  318. package/build/assets/llm-settings-Bkc8C5Bi.js +0 -1
  319. package/build/assets/manifest-4d6a1552.js +0 -1
  320. package/build/assets/onboarding-gGIqoxvA.js +0 -1
  321. package/build/assets/providers-CPoq0VXm.js +0 -1
  322. package/build/assets/recommended-automations-launcher-CXaEK1rW.js +0 -50
  323. package/build/assets/root-CxWZUXTQ.css +0 -1
  324. package/build/assets/root-layout-CvxdHJ6j.js +0 -2
  325. package/build/assets/settings-service.api-DldkFI1x.js +0 -1
  326. package/build/assets/use-runtime-is-ready-CBFe69Ew.js +0 -1
  327. package/build/assets/vendor~root-layout~home~mcp~automations-list~onboarding-modal-L2sdihTY.js +0 -1
@@ -56,6 +56,8 @@ python3 scripts/fetch_skill.py "https://github.com/OpenHands/extensions/tree/mai
56
56
  ls /path/to/workspace/.agents/skills/codereview/SKILL.md
57
57
  \`\`\`
58
58
 
59
+ On Windows, use \`python\` if \`python3\` is not available and verify with PowerShell, for example: \`Test-Path C:\\path\\to\\workspace\\.agents\\skills\\codereview\\SKILL.md\`.
60
+
59
61
  Response: "✅ Added \`codereview\` to your workspace. The skill is now available."
60
62
 
61
63
  ## Notes
@@ -500,6 +502,8 @@ git remote -v && git branch # to find the current org, repo and branch
500
502
  git checkout -b create-widget && git add . && git commit -m "Create widget" && git push -u origin create-widget
501
503
  \`\`\`
502
504
 
505
+ On Windows PowerShell, run those \`git\` commands as separate commands if \`&&\` is not supported by the installed shell.
506
+
503
507
  ## Azure DevOps API Usage
504
508
 
505
509
  When working with Azure DevOps API, you need to use Basic authentication with your Personal Access Token (PAT). The username is ignored (empty string), and the password is the PAT.
@@ -513,6 +517,15 @@ AUTH=$(echo -n ":$AZURE_DEVOPS_TOKEN" | base64)
513
517
  curl -H "Authorization: Basic $AUTH" -H "Content-Type: application/json" https://dev.azure.com/{organization}/{project}/_apis/git/repositories?api-version=7.1
514
518
  \`\`\`
515
519
 
520
+ PowerShell equivalent for the PAT header:
521
+
522
+ \`\`\`powershell
523
+ $auth = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$env:AZURE_DEVOPS_TOKEN"))
524
+ Invoke-RestMethod \`
525
+ -Headers @{ Authorization = "Basic $auth"; "Content-Type" = "application/json" } \`
526
+ -Uri "https://dev.azure.com/{organization}/{project}/_apis/git/repositories?api-version=7.1"
527
+ \`\`\`
528
+
516
529
  Common API endpoints:
517
530
  - List repositories: \`https://dev.azure.com/{organization}/{project}/_apis/git/repositories?api-version=7.1\`
518
531
  - Get repository details: \`https://dev.azure.com/{organization}/{project}/_apis/git/repositories/{repositoryId}?api-version=7.1\`
@@ -565,7 +578,7 @@ Bitbucket API (not a web browser) and always use the listed PR tool to open a pu
565
578
  | Host | \`bitbucket.org\` | self-hosted domain |
566
579
  | REST API base | \`https://api.bitbucket.org/2.0\` | \`https://<host>/rest/api/1.0\` |
567
580
  | Repository identifier | \`workspace/repo_slug\` | \`PROJECT/repo_slug\` (project key) |
568
- | Pull request tool | \`create_bitbucket_pr\` | \`create_bitbucket_data_center_pr\` |`},{name:`bitbucket-cloud`,description:`Bitbucket Cloud (bitbucket.org) specifics — authenticate with BITBUCKET_TOKEN, use the REST API v2, workspace/repo_slug repositories, and the create_bitbucket_pr tool. Loaded on demand by the bitbucket skill once a Cloud environment is detected.`,triggers:[],content:'You are working with **Bitbucket Cloud** (`bitbucket.org`). You have access to an\nenvironment variable, `BITBUCKET_TOKEN`, which allows you to interact with the Bitbucket\nCloud API.\n\n- REST API base URL: `https://api.bitbucket.org/2.0`\n- Repository identifier format: `workspace/repo_slug`\n\n<IMPORTANT>\nYou can use `curl` with the `BITBUCKET_TOKEN` to interact with Bitbucket\'s API.\nALWAYS use the Bitbucket API for operations instead of a web browser.\nALWAYS use the `create_bitbucket_pr` tool to open a pull request\n</IMPORTANT>\n\nOnly rewrite the Bitbucket remote if a push actually fails with authentication errors and the user has asked you to push. Do not proactively rewrite `origin`. OpenHands OSS commonly stores `BITBUCKET_TOKEN` in the same unencoded `user:token` form used by commands such as `curl --user "$BITBUCKET_TOKEN" ...`, so keep it in that form unless you truly need to embed it in a Git remote URL.\n\nIf you need a non-interactive HTTPS remote URL, split `BITBUCKET_TOKEN` on the first `:` and URL-encode each part before calling `git remote set-url`. This avoids breaking usernames or emails that contain reserved URL characters such as `@`:\n\n```bash\nBB_USER="${BITBUCKET_TOKEN%%:*}" && \\\nBB_PASS="${BITBUCKET_TOKEN#*:}" && \\\nENCODED_USER=$(python3 -c \'import sys, urllib.parse; print(urllib.parse.quote(sys.argv[1], safe=""))\' "$BB_USER") && \\\nENCODED_PASS=$(python3 -c \'import sys, urllib.parse; print(urllib.parse.quote(sys.argv[1], safe=""))\' "$BB_PASS") && \\\ngit remote set-url origin "https://${ENCODED_USER}:${ENCODED_PASS}@bitbucket.org/username/repo.git"\n```\n\nAtlassian\'s Bitbucket Cloud docs recommend avoiding long-lived credentials in the remote URL when possible. Their API token examples use either `https://{bitbucket_username}:{api_token}@...` or `https://x-bitbucket-api-token-auth:{api_token}@...`; OpenHands users should only construct those URLs on demand, with proper URL encoding.\n\nHere are some instructions for pushing, but ONLY do this if the user asks you to:\n* NEVER push directly to the `main` or `master` branch\n* Git config (username and email) is pre-set. Do not modify.\n* You may already be on a branch starting with `openhands-workspace`. Create a new branch with a better name before pushing.\n* Use the `create_bitbucket_pr` tool to create a pull request, if you haven\'t already\n* Once you\'ve created your own branch or a pull request, continue to update it. Do NOT create a new one unless you are explicitly asked to. Update the PR title and description as necessary, but don\'t change the branch name.\n* Use the main branch as the base branch, unless the user requests otherwise\n* After opening or updating a pull request, send the user a short message with a link to the pull request.\n* Do NOT mark a pull request as ready to review unless the user explicitly says so\n* Do all of the above in as few steps as possible. E.g. you could push changes with one step by running the following bash commands:\n```bash\ngit remote -v && git branch # to find the current org, repo and branch\ngit checkout -b create-widget && git add . && git commit -m "Create widget" && git push -u origin create-widget\n```'},{name:`bitbucket-data-center`,description:`Bitbucket Data Center (self-hosted Bitbucket Server) specifics — authenticate with BITBUCKET_DATA_CENTER_TOKEN, use the REST API 1.0, PROJECT/repo_slug repositories, scm/ git remotes, and the create_bitbucket_data_center_pr tool. Loaded on demand by the bitbucket skill once a Data Center environment is detected.`,triggers:[],content:`You are working with **Bitbucket Data Center** (self-hosted Bitbucket Server). You have
581
+ | Pull request tool | \`create_bitbucket_pr\` | \`create_bitbucket_data_center_pr\` |`},{name:`bitbucket-cloud`,description:`Bitbucket Cloud (bitbucket.org) specifics — authenticate with BITBUCKET_TOKEN, use the REST API v2, workspace/repo_slug repositories, and the create_bitbucket_pr tool. Loaded on demand by the bitbucket skill once a Cloud environment is detected.`,triggers:[],content:'You are working with **Bitbucket Cloud** (`bitbucket.org`). You have access to an\nenvironment variable, `BITBUCKET_TOKEN`, which allows you to interact with the Bitbucket\nCloud API.\n\n- REST API base URL: `https://api.bitbucket.org/2.0`\n- Repository identifier format: `workspace/repo_slug`\n\n<IMPORTANT>\nYou can use `curl` with the `BITBUCKET_TOKEN` to interact with Bitbucket\'s API.\nALWAYS use the Bitbucket API for operations instead of a web browser.\nALWAYS use the `create_bitbucket_pr` tool to open a pull request\n</IMPORTANT>\n\nOnly rewrite the Bitbucket remote if a push actually fails with authentication errors and the user has asked you to push. Do not proactively rewrite `origin`. OpenHands OSS commonly stores `BITBUCKET_TOKEN` in the same unencoded `user:token` form used by commands such as `curl --user "$BITBUCKET_TOKEN" ...`, so keep it in that form unless you truly need to embed it in a Git remote URL.\n\nIf you need a non-interactive HTTPS remote URL, split `BITBUCKET_TOKEN` on the first `:` and URL-encode each part before calling `git remote set-url`. This avoids breaking usernames or emails that contain reserved URL characters such as `@`:\n\n```bash\nBB_USER="${BITBUCKET_TOKEN%%:*}" && \\\nBB_PASS="${BITBUCKET_TOKEN#*:}" && \\\nENCODED_USER=$(python3 -c \'import sys, urllib.parse; print(urllib.parse.quote(sys.argv[1], safe=""))\' "$BB_USER") && \\\nENCODED_PASS=$(python3 -c \'import sys, urllib.parse; print(urllib.parse.quote(sys.argv[1], safe=""))\' "$BB_PASS") && \\\ngit remote set-url origin "https://${ENCODED_USER}:${ENCODED_PASS}@bitbucket.org/username/repo.git"\n```\n\nPowerShell equivalent for the remote URL encoding:\n\n```powershell\n$parts = $env:BITBUCKET_TOKEN -split ":", 2\n$encodedUser = [Uri]::EscapeDataString($parts[0])\n$encodedPass = [Uri]::EscapeDataString($parts[1])\ngit remote set-url origin "https://${encodedUser}:${encodedPass}@bitbucket.org/username/repo.git"\n```\n\nAtlassian\'s Bitbucket Cloud docs recommend avoiding long-lived credentials in the remote URL when possible. Their API token examples use either `https://{bitbucket_username}:{api_token}@...` or `https://x-bitbucket-api-token-auth:{api_token}@...`; OpenHands users should only construct those URLs on demand, with proper URL encoding.\n\nHere are some instructions for pushing, but ONLY do this if the user asks you to:\n* NEVER push directly to the `main` or `master` branch\n* Git config (username and email) is pre-set. Do not modify.\n* You may already be on a branch starting with `openhands-workspace`. Create a new branch with a better name before pushing.\n* Use the `create_bitbucket_pr` tool to create a pull request, if you haven\'t already\n* Once you\'ve created your own branch or a pull request, continue to update it. Do NOT create a new one unless you are explicitly asked to. Update the PR title and description as necessary, but don\'t change the branch name.\n* Use the main branch as the base branch, unless the user requests otherwise\n* After opening or updating a pull request, send the user a short message with a link to the pull request.\n* Do NOT mark a pull request as ready to review unless the user explicitly says so\n* Do all of the above in as few steps as possible. E.g. you could push changes with one step by running the following bash commands:\n```bash\ngit remote -v && git branch # to find the current org, repo and branch\ngit checkout -b create-widget && git add . && git commit -m "Create widget" && git push -u origin create-widget\n```\n\nOn Windows PowerShell, run those `git` commands as separate commands if `&&` is not supported by the installed shell.'},{name:`bitbucket-data-center`,description:`Bitbucket Data Center (self-hosted Bitbucket Server) specifics — authenticate with BITBUCKET_DATA_CENTER_TOKEN, use the REST API 1.0, PROJECT/repo_slug repositories, scm/ git remotes, and the create_bitbucket_data_center_pr tool. Loaded on demand by the bitbucket skill once a Data Center environment is detected.`,triggers:[],content:`You are working with **Bitbucket Data Center** (self-hosted Bitbucket Server). You have
569
582
  access to an environment variable, \`BITBUCKET_DATA_CENTER_TOKEN\`, which contains a basic
570
583
  auth token in the format \`username:your-token\` that allows you to interact with the git
571
584
  repository and the REST API.
@@ -641,6 +654,7 @@ The prompt includes a **Files Changed** manifest listing every file in the PR, f
641
654
  3. Only after both checks come up empty should you flag something as missing. Even then, prefer "I could not locate X" over "X is missing" — the file may be in a path you haven't searched.
642
655
 
643
656
  Before posting an **inline review comment that names a specific line number**, verify the line maps to what you think it does (\`sed -n 'X,Yp' <file>\` or \`view\`). Line numbers derived by counting \`+\`/\`-\`/context lines from a \`@@\` hunk header are not reliable; ground them against the file.
657
+ On Windows PowerShell, use \`Get-Content\`, \`Select-String\`, or \`(Get-Content <file>)[($start - 1)..($end - 1)]\` for the same file and line checks.
644
658
 
645
659
  CODE REVIEW SCENARIOS:
646
660
 
@@ -896,6 +910,8 @@ When a review aspect has no findings, include it with an explicit "no issues fou
896
910
  - **\`references/code-quality-review.md\`** - Detailed criteria for naming, complexity, error handling, and project standards compliance
897
911
  - **\`references/efficiency-review.md\`** - Detailed criteria for algorithmic complexity, unnecessary work, resource usage, and I/O patterns`},{name:`datadog`,description:`Query and analyze Datadog logs, metrics, APM traces, and monitors using the Datadog API. Use when debugging production issues, monitoring application performance, or investigating alerts.`,triggers:[`datadog`],content:`# Datadog
898
912
 
913
+ Windows PowerShell equivalents for the Datadog \`curl\`, environment-variable, timestamp, and JSON formatting snippets are in \`references/windows.md\`.
914
+
899
915
  <IMPORTANT>
900
916
  Before performing any Datadog operations, first check if the required environment variables are set:
901
917
 
@@ -1108,6 +1124,8 @@ Use this skill when implementing or automating Discord integrations.
1108
1124
 
1109
1125
  ## Quick recipes
1110
1126
 
1127
+ The shell snippets below use POSIX-style environment variables and line continuations. On Windows PowerShell, use \`curl.exe\` for the shown flags and \`$env:DISCORD_WEBHOOK_URL\` / \`$env:DISCORD_BOT_TOKEN\` for environment variables, or translate the request to \`Invoke-RestMethod\`.
1128
+
1111
1129
  ### Post a message via an incoming webhook (recommended)
1112
1130
 
1113
1131
  Discord requires at least one of \`content\`, \`embeds\`, \`components\`, \`file\`, or \`poll\`.
@@ -1179,13 +1197,17 @@ sudo dockerd > /tmp/docker.log 2>&1 &
1179
1197
  sleep 5
1180
1198
  \`\`\`
1181
1199
 
1200
+ On Windows, start Docker Desktop or the Docker service instead of running \`sudo dockerd\`; then run Docker commands from PowerShell without \`sudo\`.
1201
+
1182
1202
  ## Verifying Docker Installation
1183
1203
 
1184
1204
  To verify Docker is working correctly, run the hello-world container:
1185
1205
 
1186
1206
  \`\`\`bash
1187
1207
  sudo docker run hello-world
1188
- \`\`\``},{name:`evidence-based-citations`,description:`Back factual claims and field values with official, verifiable sources. Use when the user asks to fill fields, answer questions, or make claims that must be supported by an exact quote and an official link.`,triggers:[`evidence-based`,`cite source`,`cite sources`,`official source`,`official link`,`official links`,`official docs`,`official documentation`,`verifiable source`],content:`The user wants every field value or factual claim you produce in the current response to be backed by an official, verifiable source. Apply this skill to the response that triggered it; do not assume it stays active for the rest of the conversation unless the user clearly asks for it to.
1208
+ \`\`\`
1209
+
1210
+ PowerShell equivalent after Docker Desktop is running: \`docker run hello-world\`.`},{name:`evidence-based-citations`,description:`Back factual claims and field values with official, verifiable sources. Use when the user asks to fill fields, answer questions, or make claims that must be supported by an exact quote and an official link.`,triggers:[`evidence-based`,`cite source`,`cite sources`,`official source`,`official link`,`official links`,`official docs`,`official documentation`,`verifiable source`],content:`The user wants every field value or factual claim you produce in the current response to be backed by an official, verifiable source. Apply this skill to the response that triggered it; do not assume it stays active for the rest of the conversation unless the user clearly asks for it to.
1189
1211
 
1190
1212
  ## Output format
1191
1213
 
@@ -1277,6 +1299,8 @@ Examples:
1277
1299
  - \`gh pr checks 200 --watch --interval 10\` to check until completed.
1278
1300
  </IMPORTANT>
1279
1301
 
1302
+ Windows PowerShell equivalents for the multi-line shell snippets below are in \`references/windows.md\`.
1303
+
1280
1304
  If you encounter authentication issues when pushing to GitHub (such as password prompts or permission errors), the old token may have expired. In such case, update the remote URL to include the current token: \`git remote set-url origin https://\${GITHUB_TOKEN}@github.com/username/repo.git\`
1281
1305
 
1282
1306
  Here are some instructions for pushing, but ONLY do this if the user asks you to:
@@ -1396,6 +1420,7 @@ See [README.md](README.md) for the full debugging workflow, \`gh\` commands, and
1396
1420
  4. **Artifacts for job-to-job data** - Files don't persist between jobs without \`upload-artifact\`/\`download-artifact\``},{name:`github-pr-review`,description:`Post PR review comments using the GitHub API with inline comments, suggestions, and priority labels.`,triggers:[`/github-pr-review`],content:`# GitHub PR Review
1397
1421
 
1398
1422
  Post structured code review feedback using the GitHub API with inline comments on specific lines.
1423
+ Windows PowerShell equivalents for JSON file creation, temp paths, line lookup, and fallback \`curl\` are in \`references/windows.md\`.
1399
1424
 
1400
1425
  ## Key Rule: One API Call
1401
1426
 
@@ -1576,6 +1601,7 @@ curl -X POST \\
1576
1601
  Create a cron automation that watches a GitHub repository for pull requests
1577
1602
  with a review trigger label, starts an OpenHands review conversation once per
1578
1603
  label event, and posts the AI review as a GitHub comment.
1604
+ Windows PowerShell equivalents for the setup, packaging, upload, and API-check shell snippets are in \`references/windows.md\`.
1579
1605
 
1580
1606
  The automation script is deterministic: PR discovery, label-event tracking,
1581
1607
  state persistence, stale-result suppression, and GitHub comment posting are
@@ -1814,6 +1840,7 @@ Each cron run executes \`main.py\`, which:
1814
1840
 
1815
1841
  Create a cron automation that polls a single GitHub repository on a
1816
1842
  configurable schedule (default: every minute).
1843
+ Windows PowerShell equivalents for the setup, packaging, upload, and API-check shell snippets are in \`references/windows.md\`.
1817
1844
 
1818
1845
  When a comment on an issue or PR contains the **trigger phrase**
1819
1846
  (default: \`@OpenHands\`) it:
@@ -2111,30 +2138,7 @@ Each cron run executes \`main.py\`, which:
2111
2138
  | Comments posted but no conversation created | Agent server URL wrong | Check \`OPENHANDS_URL\` secret and \`AGENT_SERVER_URL\` env var |
2112
2139
  | Same comment processed twice | \`processed_comment_ids\` cleared | State file was deleted; harmless but duplicate comment may appear |
2113
2140
  | Summary never posted | Conversation stuck in \`running\` | Open the conversation in the OpenHands UI; agent may need input |
2114
- | No events detected after first run | \`last_poll\` in the future | Delete the state file to reset; it will be recreated on next run |`},{name:`gitlab`,description:`Interact with GitLab repositories, merge requests, and APIs using the GITLAB_TOKEN environment variable. Use when working with code hosted on GitLab or managing GitLab resources.`,triggers:[`gitlab`,`git`],content:`You have access to an environment variable, \`GITLAB_TOKEN\`, which allows you to interact with
2115
- the GitLab API.
2116
-
2117
- <IMPORTANT>
2118
- You can use \`curl\` with the \`GITLAB_TOKEN\` to interact with GitLab's API.
2119
- ALWAYS use the GitLab API for operations instead of a web browser.
2120
- ALWAYS use the \`create_mr\` tool to open a merge request
2121
- </IMPORTANT>
2122
-
2123
- If you encounter authentication issues when pushing to GitLab (such as password prompts or permission errors), the old token may have expired. In such case, update the remote URL to include the current token: \`git remote set-url origin https://oauth2:\${GITLAB_TOKEN}@gitlab.com/username/repo.git\`
2124
-
2125
- Here are some instructions for pushing, but ONLY do this if the user asks you to:
2126
- * NEVER push directly to the \`main\` or \`master\` branch
2127
- * Git config (username and email) is pre-set. Do not modify.
2128
- * You may already be on a branch starting with \`openhands-workspace\`. Create a new branch with a better name before pushing.
2129
- * Use the \`create_mr\` tool to create a merge request, if you haven't already
2130
- * Once you've created your own branch or a merge request, continue to update it. Do NOT create a new one unless you are explicitly asked to. Update the PR title and description as necessary, but don't change the branch name.
2131
- * Use the main branch as the base branch, unless the user requests otherwise
2132
- * After opening or updating a merge request, send the user a short message with a link to the merge request.
2133
- * Do all of the above in as few steps as possible. E.g. you could push changes with one step by running the following bash commands:
2134
- \`\`\`bash
2135
- git remote -v && git branch # to find the current org, repo and branch
2136
- git checkout -b create-widget && git add . && git commit -m "Create widget" && git push -u origin create-widget
2137
- \`\`\``},{name:`incident-retrospective`,description:`Create an automation that drafts incident retrospectives. Gathers incident-channel messages from Slack, collects linked tickets and follow-ups from Linear, and publishes a retrospective draft to Notion with a timeline, impact summary, root-cause hypotheses, and action items.`,triggers:[`/incident-retro:setup`],content:`# Incident Retrospective Drafter Automation
2141
+ | No events detected after first run | \`last_poll\` in the future | Delete the state file to reset; it will be recreated on next run |`},{name:`gitlab`,description:`Interact with GitLab repositories, merge requests, and APIs using the GITLAB_TOKEN environment variable. Use when working with code hosted on GitLab or managing GitLab resources.`,triggers:[`gitlab`,`git`],content:"You have access to an environment variable, `GITLAB_TOKEN`, which allows you to interact with\nthe GitLab API.\n\n<IMPORTANT>\nYou can use `curl` with the `GITLAB_TOKEN` to interact with GitLab's API.\nALWAYS use the GitLab API for operations instead of a web browser.\nALWAYS use the `create_mr` tool to open a merge request\n</IMPORTANT>\n\nIf you encounter authentication issues when pushing to GitLab (such as password prompts or permission errors), the old token may have expired. In such case, update the remote URL to include the current token: `git remote set-url origin https://oauth2:${GITLAB_TOKEN}@gitlab.com/username/repo.git`\n\nHere are some instructions for pushing, but ONLY do this if the user asks you to:\n* NEVER push directly to the `main` or `master` branch\n* Git config (username and email) is pre-set. Do not modify.\n* You may already be on a branch starting with `openhands-workspace`. Create a new branch with a better name before pushing.\n* Use the `create_mr` tool to create a merge request, if you haven't already\n* Once you've created your own branch or a merge request, continue to update it. Do NOT create a new one unless you are explicitly asked to. Update the PR title and description as necessary, but don't change the branch name.\n* Use the main branch as the base branch, unless the user requests otherwise\n* After opening or updating a merge request, send the user a short message with a link to the merge request.\n* Do all of the above in as few steps as possible. E.g. you could push changes with one step by running the following bash commands:\n```bash\ngit remote -v && git branch # to find the current org, repo and branch\ngit checkout -b create-widget && git add . && git commit -m \"Create widget\" && git push -u origin create-widget\n```\n\nOn Windows PowerShell, use `$env:GITLAB_TOKEN` in remote URLs and run the `git` commands as separate commands if `&&` is not supported by the installed shell."},{name:`incident-retrospective`,description:`Create an automation that drafts incident retrospectives. Gathers incident-channel messages from Slack, collects linked tickets and follow-ups from Linear, and publishes a retrospective draft to Notion with a timeline, impact summary, root-cause hypotheses, and action items.`,triggers:[`/incident-retro:setup`],content:`# Incident Retrospective Drafter Automation
2138
2142
 
2139
2143
  Set up an automation that drafts incident retrospectives by pulling data from
2140
2144
  Slack, Linear, and Notion.
@@ -2210,6 +2214,8 @@ curl -s -X POST "\${OPENHANDS_HOST}/api/automation/v1/preset/prompt" \\
2210
2214
  }'
2211
2215
  \`\`\`
2212
2216
 
2217
+ PowerShell note: use \`curl.exe\` for this exact flag syntax, and replace \`\${OPENHANDS_HOST}\` / \`$OPENHANDS_AUTOMATION_API_KEY\` with \`$env:OPENHANDS_HOST\` / \`$env:OPENHANDS_AUTOMATION_API_KEY\` if running it natively.
2218
+
2213
2219
  ### Step 5 — Confirm
2214
2220
 
2215
2221
  Tell the user:
@@ -2230,6 +2236,7 @@ No scripts — you are the orchestration loop. Uses only standard \`gh\` CLI
2230
2236
  commands that work on any GitHub repo.
2231
2237
 
2232
2238
  Requires: \`gh\` CLI authenticated with repo access, a PR branch.
2239
+ Windows PowerShell equivalents for Bash-only assignment, redirection, and quoting patterns in this skill are in \`references/windows.md\`.
2233
2240
 
2234
2241
  ## Discover what the repo has
2235
2242
 
@@ -2605,7 +2612,209 @@ Final summary should include:
2605
2612
  ## References
2606
2613
 
2607
2614
  - Verification stack (layers, signals, retriggering): \`references/verification.md\`
2608
- - CI/review heuristics and decision tree: \`references/heuristics.md\``},{name:`jupyter`,description:`Read, modify, execute, and convert Jupyter notebooks programmatically. Use when working with .ipynb files for data science workflows, including editing cells, clearing outputs, or converting to other formats.`,triggers:[`ipynb`,`jupyter`],content:`# Jupyter Notebook Guide
2615
+ - CI/review heuristics and decision tree: \`references/heuristics.md\``},{name:`jira-issue-to-pr`,description:`This skill should be used when the user asks to "set up a Jira automation to create pull requests", "poll Jira for create-pr issues", "automatically create GitHub PRs from Jira tickets", "deploy a Jira issue-to-PR automation", "create a Jira to GitHub PR workflow", or mentions automating GitHub PR creation from a Jira label. Deploys a cron-based OpenHands automation that watches a Jira Cloud project for issues labeled with a configurable label (default: "create-pr") and spawns an agent conversation to create a GitHub pull request for each new issue found. The target GitHub repository is read from the body of the Jira ticket - no repo parameter is required at deploy time.`,triggers:[],content:`# Jira GitHub PR Automation
2616
+
2617
+ Deploys a cron automation that polls a Jira Cloud instance for open issues carrying a
2618
+ configurable label and, for each new issue, starts an OpenHands agent conversation that
2619
+ clones the GitHub repository specified in the ticket body, creates a branch, implements
2620
+ or placeholders the requested change, and opens a pull request. Once the conversation
2621
+ starts, it also posts a comment on the Jira ticket: "I'm on it: &lt;conversation URL&gt;".
2622
+
2623
+ ## How It Works
2624
+
2625
+ 1. **Poll** - every N minutes, \`POST /rest/api/3/search/jql\` on the Jira Cloud instance
2626
+ to find open issues with the configured label.
2627
+ 2. **Deduplicate** - on the very first run the script records a \`first_run_at\` baseline
2628
+ timestamp in the KV store; any issue whose \`updated\` timestamp predates that baseline
2629
+ is skipped (no backfill blast on first deploy). Using \`updated\` rather than \`created\`
2630
+ means an old issue that has its label added after the automation is deployed will still
2631
+ be picked up. Subsequent runs filter by both \`first_run_at\` and a KV-backed set of
2632
+ already-processed issue keys. A \`max_new_per_run\` cap (default 5) limits conversations
2633
+ started per cron firing as additional defense-in-depth.
2634
+ 3. **Dispatch** - for each new issue, call \`POST /api/conversations\` on the agent server
2635
+ to start an independent agent conversation with a PR-creation prompt. The prompt
2636
+ instructs the agent to extract the target GitHub repository (\`owner/repo\`) from the
2637
+ ticket body.
2638
+ 4. **Comment** - immediately after the conversation is created, post a Jira comment on the
2639
+ issue: \`I'm on it: <conversation URL>\`.
2640
+ 5. **Persist** - record the processed issue key so re-runs never duplicate work.
2641
+
2642
+ The polling run is lightweight (stdlib only, no SDK install); LLM costs are incurred only
2643
+ when new issues are actually found.
2644
+
2645
+ ## Prerequisites
2646
+
2647
+ Before deploying, ensure the following are in place:
2648
+
2649
+ | Requirement | Details |
2650
+ |---|---|
2651
+ | **Jira API token** | Stored as an OpenHands secret (see [Jira API token setup](#jira-api-token)) |
2652
+ | **GitHub token** | Must be stored as an OpenHands secret with \`repo\` + \`workflow\` scope so the spawned conversation can push branches and open PRs |
2653
+ | **Jira label** | The label to watch for (default: \`create-pr\`) must exist in the Jira project |
2654
+ | **GitHub repo** | The target repository must exist and the GitHub token must have write access |
2655
+
2656
+ ## Deploying the Automation
2657
+
2658
+ ### Step 1 - Collect parameters
2659
+
2660
+ Gather the following from the user before proceeding:
2661
+
2662
+ | Parameter | Example | Notes |
2663
+ |---|---|---|
2664
+ | \`jira_base_url\` | \`https://acme.atlassian.net\` | No trailing slash |
2665
+ | \`jira_email\` | \`alice@acme.com\` | Atlassian account email for Basic auth |
2666
+ | \`jira_token_secret\` | \`JIRA_CLOUD_KEY\` | Name of the OpenHands secret holding the API token |
2667
+ | \`jira_label\` | \`create-pr\` | Label to watch for (optional, defaults to \`create-pr\`) |
2668
+ | \`max_new_per_run\` | \`5\` | Max conversations dispatched per cron firing (optional, defaults to \`5\`) |
2669
+ | \`cron_schedule\` | \`*/5 * * * *\` | Polling frequency in cron syntax |
2670
+
2671
+ > **Note**: The GitHub repository is not configured here. Each Jira ticket body must include
2672
+ > a reference to the target GitHub repo in \`owner/repo\` format (e.g. \`acme-org/backend\`).
2673
+ > The spawned agent extracts it from the ticket text.
2674
+
2675
+ ### Step 2 - Create config.json
2676
+
2677
+ Create \`config.json\` next to \`scripts/main.py\` when packaging:
2678
+
2679
+ \`\`\`json
2680
+ {
2681
+ "jira_base_url": "https://acme.atlassian.net",
2682
+ "jira_email": "alice@acme.com",
2683
+ "jira_token_secret": "JIRA_CLOUD_KEY",
2684
+ "jira_label": "create-pr",
2685
+ "max_new_per_run": 5
2686
+ }
2687
+ \`\`\`
2688
+
2689
+ ### Step 3 - Package the tarball
2690
+
2691
+ Copy \`scripts/main.py\` from this skill and package it with the \`config.json\`:
2692
+
2693
+ \`\`\`bash
2694
+ WORK=$(mktemp -d)
2695
+ cp <skill-dir>/scripts/main.py "$WORK/main.py"
2696
+ # write config.json into $WORK/config.json (see Step 2)
2697
+ tar -czf /tmp/jira-issue-to-pr.tar.gz -C "$WORK" .
2698
+ python3 -m py_compile "$WORK/main.py" # validate syntax before uploading
2699
+ \`\`\`
2700
+
2701
+ ### Step 4 - Upload the tarball
2702
+
2703
+ \`\`\`bash
2704
+ TARBALL_PATH=$(curl -s -X POST \\
2705
+ "http://localhost:8000/api/automation/v1/uploads?name=jira-issue-to-pr" \\
2706
+ -H "X-Session-API-Key: $OPENHANDS_AUTOMATION_API_KEY" \\
2707
+ -H "Content-Type: application/gzip" \\
2708
+ --data-binary @/tmp/jira-issue-to-pr.tar.gz \\
2709
+ | python3 -c "import sys,json; print(json.load(sys.stdin)['tarball_path'])")
2710
+ \`\`\`
2711
+
2712
+ ### Step 5 - Create the automation
2713
+
2714
+ \`\`\`bash
2715
+ curl -s -X POST "http://localhost:8000/api/automation/v1" \\
2716
+ -H "X-Session-API-Key: $OPENHANDS_AUTOMATION_API_KEY" \\
2717
+ -H "Content-Type: application/json" \\
2718
+ -d "{
2719
+ \\"name\\": \\"Jira issue-to-PR Poller\\",
2720
+ \\"trigger\\": {
2721
+ \\"type\\": \\"cron\\",
2722
+ \\"schedule\\": \\"*/5 * * * *\\",
2723
+ \\"timezone\\": \\"UTC\\"
2724
+ },
2725
+ \\"tarball_path\\": \\"$TARBALL_PATH\\",
2726
+ \\"entrypoint\\": \\"python3 main.py\\",
2727
+ \\"timeout\\": 540
2728
+ }" | python3 -m json.tool
2729
+ \`\`\`
2730
+
2731
+ Save the returned \`id\` - use it for updates and monitoring.
2732
+
2733
+ ### Step 6 - Verify with a test dispatch
2734
+
2735
+ \`\`\`bash
2736
+ curl -s -X POST \\
2737
+ "http://localhost:8000/api/automation/v1/<AUTOMATION_ID>/dispatch" \\
2738
+ -H "X-Session-API-Key: $OPENHANDS_AUTOMATION_API_KEY" | python3 -m json.tool
2739
+
2740
+ # After ~30 seconds, check the run status:
2741
+ curl -s "http://localhost:8000/api/automation/v1/<AUTOMATION_ID>/runs?limit=1" \\
2742
+ -H "X-Session-API-Key: $OPENHANDS_AUTOMATION_API_KEY" \\
2743
+ | python3 -c "import sys,json; r=json.load(sys.stdin)['runs'][0]; print(r['status'], r.get('error_detail'))"
2744
+ \`\`\`
2745
+
2746
+ ## Updating an Existing Deployment
2747
+
2748
+ To change configuration or update the script:
2749
+
2750
+ 1. Edit \`config.json\` with new values.
2751
+ 2. Repackage and upload a new tarball (Steps 3-4 above).
2752
+ 3. PATCH the existing automation with the new \`tarball_path\`:
2753
+
2754
+ \`\`\`bash
2755
+ curl -s -X PATCH \\
2756
+ "http://localhost:8000/api/automation/v1/<AUTOMATION_ID>" \\
2757
+ -H "X-Session-API-Key: $OPENHANDS_AUTOMATION_API_KEY" \\
2758
+ -H "Content-Type: application/json" \\
2759
+ -d "{\\"tarball_path\\": \\"<NEW_TARBALL_PATH>\\"}"
2760
+ \`\`\`
2761
+
2762
+ ## Resetting Processed State
2763
+
2764
+ To reprocess issues that were already handled (e.g., after testing), clear the KV store:
2765
+
2766
+ \`\`\`bash
2767
+ curl -s -X DELETE \\
2768
+ "http://localhost:8000/api/automation/v1/<KV_BASE>/v1/kv/state" \\
2769
+ -H "Authorization: Bearer $AUTOMATION_KV_TOKEN"
2770
+ \`\`\`
2771
+
2772
+ Or delete and recreate the automation to start with a clean state.
2773
+
2774
+ ## Script Reference
2775
+
2776
+ The automation script lives at \`scripts/main.py\`. Key behaviors:
2777
+
2778
+ - **No SDK dependencies** - pure Python stdlib; no \`setup.sh\` or \`uv\` install needed.
2779
+ - **Config file** - reads all parameters from \`config.json\` co-located with the script.
2780
+ - **First-run baseline** - on the very first execution the script writes \`first_run_at\` (UTC timestamp) into the KV store and exits without dispatching; issues whose \`updated\` timestamp predates that baseline are skipped on all subsequent runs. Using \`updated\` (not \`created\`) means an old issue that has its label applied after deployment is correctly treated as new.
2781
+ - **Per-run cap** - \`max_new_per_run\` (default 5) limits how many conversations are started per cron firing; any remaining new issues are dispatched on the next run.
2782
+ - **KV store** - persists \`{"processed_keys": [...], "first_run_at": "..."}\` between runs; falls back to a local file in dev environments where \`AUTOMATION_KV_TOKEN\` is absent.
2783
+ - **Jira API** - uses \`POST /rest/api/3/search/jql\` (the current non-deprecated endpoint).
2784
+ - **Conversation dispatch** - calls \`POST /api/conversations\` on the agent server with the current user's LLM/agent settings forwarded to the new conversation.
2785
+ - **Error transparency** - captures Jira HTTP response bodies in error messages for fast diagnosis.
2786
+
2787
+ ## Known Limitations
2788
+
2789
+ ### Pre-existing issues updated after deployment
2790
+
2791
+ The deduplication filter compares each issue's \`fields.updated\` timestamp against
2792
+ \`first_run_at\`. \`updated\` is Jira's last-modified timestamp for the issue as a whole —
2793
+ it advances whenever **any** field changes (comments, priority, description, status, etc.),
2794
+ not only when the \`create-pr\` label is applied.
2795
+
2796
+ This means a pre-existing issue that already carried the label at deployment time can
2797
+ slip through the filter if it is later updated for an unrelated reason (e.g. someone adds
2798
+ a comment), because its \`updated\` timestamp will have advanced past \`first_run_at\` while
2799
+ its key is not yet in \`processed_keys\`.
2800
+
2801
+ **Workaround:** The only fully reliable way to detect exactly when a label was applied
2802
+ is the Jira changelog API (\`GET /rest/api/3/issue/{key}/changelog\`), which requires an
2803
+ extra HTTP call per issue. To avoid that overhead, keep the automation's scope narrow:
2804
+ use a label that is exclusively added as a PR-creation signal and is not already present
2805
+ on issues at the time of deployment.
2806
+
2807
+ Once an issue is successfully dispatched its key is written to \`processed_keys\` in the
2808
+ KV store and is **permanently skipped on every future run** — regardless of subsequent
2809
+ label changes, comments, or any other updates to the issue. The only way to re-trigger a
2810
+ previously processed issue is to manually clear the KV store or delete and recreate the
2811
+ automation. This means the risk window described above is finite: as soon as the
2812
+ automation processes a pre-existing issue (even accidentally), it will never dispatch
2813
+ that issue again.
2814
+
2815
+ ## Additional Resources
2816
+
2817
+ - **\`references/setup.md\`** - Jira API token creation, GitHub token scopes, cron schedule reference, and troubleshooting guide.`},{name:`jupyter`,description:`Read, modify, execute, and convert Jupyter notebooks programmatically. Use when working with .ipynb files for data science workflows, including editing cells, clearing outputs, or converting to other formats.`,triggers:[`ipynb`,`jupyter`],content:`# Jupyter Notebook Guide
2609
2818
 
2610
2819
  Notebooks are JSON files. Cells are in \`nb['cells']\`, each has \`source\` (list of strings) and \`cell_type\` ('code', 'markdown', or 'raw').
2611
2820
 
@@ -2632,6 +2841,12 @@ jupyter nbconvert --to markdown notebook.ipynb # Convert to Markdown
2632
2841
  grep -n "search_term" notebook.ipynb
2633
2842
  \`\`\`
2634
2843
 
2844
+ PowerShell equivalent:
2845
+
2846
+ \`\`\`powershell
2847
+ Select-String -Path notebook.ipynb -Pattern "search_term"
2848
+ \`\`\`
2849
+
2635
2850
  ## Cell Structure
2636
2851
  \`\`\`python
2637
2852
  # Code cell
@@ -2653,6 +2868,7 @@ for cell in nb['cells']:
2653
2868
  KIND (Kubernetes IN Docker) is a tool for running local Kubernetes clusters using Docker containers as nodes. It's designed for testing Kubernetes applications locally.
2654
2869
 
2655
2870
  IMPORTANT: Before you proceed with installation, make sure you have docker installed locally.
2871
+ Windows PowerShell equivalents for installing KIND and kubectl are in \`references/windows.md\`.
2656
2872
 
2657
2873
  ### Installation
2658
2874
 
@@ -2862,6 +3078,8 @@ Handle these common edge cases gracefully:
2862
3078
  For posting structured code reviews, see the \`github-pr-review\` skill.
2863
3079
  For creating new skills, see the \`skill-creator\` skill.`},{name:`linear`,description:`Interact with Linear project management - query issues, update status, create tickets, and manage workflows using the Linear GraphQL API. Use when working with Linear tickets, sprints, or project tracking.`,triggers:[`linear`,`ticket`,`issue tracking`],content:`# Linear
2864
3080
 
3081
+ Windows PowerShell equivalents for the repeated Linear GraphQL \`curl\` and environment-variable snippets are in \`references/windows.md\`.
3082
+
2865
3083
  <IMPORTANT>
2866
3084
  Before performing any Linear operations, check if the required environment variable is set:
2867
3085
 
@@ -3134,6 +3352,8 @@ curl -s -X POST "\${OPENHANDS_HOST}/api/automation/v1/preset/prompt" \\
3134
3352
  }'
3135
3353
  \`\`\`
3136
3354
 
3355
+ PowerShell note: use \`curl.exe\` for this exact flag syntax, and replace \`\${OPENHANDS_HOST}\` / \`$OPENHANDS_AUTOMATION_API_KEY\` with \`$env:OPENHANDS_HOST\` / \`$env:OPENHANDS_AUTOMATION_API_KEY\` if running it natively.
3356
+
3137
3357
  ### Step 5 — Confirm
3138
3358
 
3139
3359
  Tell the user:
@@ -3144,6 +3364,8 @@ Tell the user:
3144
3364
  > - Mode: \`{auto-apply or suggest}\`
3145
3365
  > - Trigger: \`{trigger description}\``},{name:`notion`,description:`Create, search, and update Notion pages/databases using the Notion API. Use for documenting work, generating runbooks, and automating knowledge base updates.`,triggers:[`notion`],content:`# Notion
3146
3366
 
3367
+ Windows PowerShell equivalents for the repeated Notion REST \`curl\`, environment-variable, and JSON-body snippets are in \`references/windows.md\`.
3368
+
3147
3369
  <IMPORTANT>
3148
3370
  If authenticated Notion MCP tools are available in the environment, use them first. MCP tools do not require passing \`NOTION_INTEGRATION_KEY\` as a tool argument; authentication is handled by the configured MCP integration.
3149
3371
 
@@ -3245,6 +3467,7 @@ curl -s -X PATCH "https://api.notion.com/v1/blocks/\${PAGE_ID}/children" \\
3245
3467
  - Create a page: https://developers.notion.com/reference/post-page
3246
3468
  - Append block children: https://developers.notion.com/reference/patch-block-children`},{name:`npm`,description:`Handle npm package installation in non-interactive environments by piping confirmations. Use when installing Node.js packages that require user confirmation prompts.`,triggers:[`npm`],content:`When using npm to install packages, you will not be able to use an interactive shell, and it may be hard to confirm your actions.
3247
3469
  As an alternative, you can pipe in the output of the unix "yes" command to confirm your actions.`},{name:`openhands-api`,description:`Reference skill for the OpenHands Cloud REST API (V1) and agent-server APIs, including how to start additional cloud or local backend conversations for fresh-context or delegated work.`,triggers:[`openhands-api`,`openhands-api-v1`,`openhands-cloud`,`openhands-cloud-api-v1`,`oh-api-v1`,`oh-cloud-api-v1`],content:`This skill documents the **OpenHands Cloud API** (V1), commonly used **agent-server APIs**, and small, easy-to-copy clients.
3470
+ Windows PowerShell equivalents for the shell examples in this skill are in \`references/windows.md\`.
3248
3471
 
3249
3472
  It is intentionally focused on common OpenHands API workflows:
3250
3473
 
@@ -3702,6 +3925,7 @@ This skill is aligned against the current OpenHands API docs and implementation:
3702
3925
  - \`OpenHands/OpenHands/openhands/app_server/app_conversation/app_conversation_models.py\``},{name:`openhands-automation`,description:`This skill should be used when the user asks to "create an automation", "schedule a task", "set up a cron job", "webhook integration", "event-triggered automation", or mentions automations, scheduled tasks, cron scheduling, or webhook events in OpenHands Cloud.`,triggers:[`automation`,`automations`,`scheduled task`,`cron job`,`cron schedule`,`webhook`,`webhooks`,`event trigger`,`github event`,`pull request automation`,`issue automation`,`/automation:create`],content:`# OpenHands Automations
3703
3926
 
3704
3927
  Create and manage automations that run inside an OpenHands agent server — triggered by cron schedules or webhook events (GitHub, custom services).
3928
+ Windows PowerShell equivalents for the automation API \`curl\` examples and shell-variable conventions are in \`references/windows.md\`.
3705
3929
 
3706
3930
  ## Automation Creation Process
3707
3931
  The agent must follow these steps when creating an automation:
@@ -4786,6 +5010,8 @@ Source: [\`examples/\`](https://github.com/OpenHands/software-agent-sdk/tree/mai
4786
5010
  apt-get install texlive-latex-base
4787
5011
  \`\`\`
4788
5012
 
5013
+ On Windows, install MiKTeX or TeX Live with the native installer or a package manager such as \`winget\`. The \`apt-get\` commands only work in Linux or WSL.
5014
+
4789
5015
  * Also install the recommended and extra fonts to avoid running into errors, when trying to use pdflatex on latex files with more fonts.
4790
5016
 
4791
5017
  \`\`\`
@@ -5403,6 +5629,8 @@ curl -s -X POST "\${OPENHANDS_HOST}/api/automation/v1/preset/prompt" \\
5403
5629
  }'
5404
5630
  \`\`\`
5405
5631
 
5632
+ PowerShell note: use \`curl.exe\` for this exact flag syntax, and replace \`\${OPENHANDS_HOST}\` / \`$OPENHANDS_AUTOMATION_API_KEY\` with \`$env:OPENHANDS_HOST\` / \`$env:OPENHANDS_AUTOMATION_API_KEY\` if running it natively.
5633
+
5406
5634
  ### Step 5 — Confirm
5407
5635
 
5408
5636
  Tell the user:
@@ -5436,6 +5664,7 @@ You should always complete the task requested. If there are security concerns pl
5436
5664
  - Use secure error reporting mechanisms`},{name:`skill-creator`,description:`This skill should be used when the user wants to "create a skill", "write a new skill", "improve skill description", "organize skill content", or needs guidance on skill structure, progressive disclosure, or skill development best practices.`,triggers:[],content:`# Skill Creator
5437
5665
 
5438
5666
  This skill provides guidance for creating effective skills.
5667
+ Windows PowerShell equivalents for the Unix shell commands used in examples are in \`references/windows.md\`.
5439
5668
 
5440
5669
  ## About Skills
5441
5670
 
@@ -5975,6 +6204,7 @@ To create a skill:
5975
6204
  Focus on strong trigger descriptions, progressive disclosure, and imperative writing style for effective skills that load when needed and provide targeted guidance.`},{name:`slack-channel-monitor`,description:`This skill should be used when the user asks to "monitor a Slack channel", "watch Slack for messages", "create a Slack bot that responds to mentions", "set up an OpenHands Slack integration", "trigger OpenHands from Slack", "respond to @openhands in Slack", or "poll Slack channels for a trigger phrase". Guides the user through creating a cron automation that watches up to 10 Slack channels and starts an OpenHands conversation whenever a configurable trigger phrase is detected.`,triggers:[`/slack-monitor:poll`],content:`# Slack Channel Monitor
5976
6205
 
5977
6206
  Create a cron automation that polls up to 10 Slack channels every minute.
6207
+ Windows PowerShell equivalents for the setup, packaging, upload, and API-check shell snippets are in \`references/windows.md\`.
5978
6208
  When a message containing the **trigger phrase** (default: \`@openhands\`) is
5979
6209
  detected it:
5980
6210
 
@@ -6332,6 +6562,8 @@ curl -s -X POST "\${OPENHANDS_HOST}/api/automation/v1/preset/prompt" \\
6332
6562
  }'
6333
6563
  \`\`\`
6334
6564
 
6565
+ PowerShell note: use \`curl.exe\` for this exact flag syntax, and replace \`\${OPENHANDS_HOST}\` / \`$OPENHANDS_AUTOMATION_API_KEY\` with \`$env:OPENHANDS_HOST\` / \`$env:OPENHANDS_AUTOMATION_API_KEY\` if running it natively.
6566
+
6335
6567
  ### Step 5 — Confirm
6336
6568
 
6337
6569
  Tell the user:
@@ -6372,6 +6604,7 @@ https://spark.apache.org/docs/latest/migration-guide.html
6372
6604
  - [ ] Identify target Spark version
6373
6605
  - [ ] Search for deprecated APIs: \`grep -rn 'import org.apache.spark' --include='*.scala' --include='*.java' --include='*.py'\`
6374
6606
  - [ ] List all Spark config properties: \`grep -rn 'spark\\.' --include='*.conf' --include='*.properties' --include='*.scala' --include='*.java' --include='*.py' | grep -v 'test'\`
6607
+ - [ ] On Windows PowerShell, use \`Get-ChildItem -Recurse -Include *.scala,*.java,*.py | Select-String 'import org.apache.spark'\` and adjust the extensions/pattern for config searches.
6375
6608
  - [ ] Check for custom \`SparkSession\` or \`SparkContext\` extensions
6376
6609
  - [ ] Identify connector dependencies (Hive, Kafka, Cassandra, Delta, Iceberg)
6377
6610
  - [ ] Document findings in \`spark_upgrade_impact.md\`
@@ -6561,6 +6794,7 @@ Spark SQL behavior changes between versions can silently alter query results.
6561
6794
  ✓ Upgrade impact documented in \`spark_upgrade_impact.md\``,license:`MIT`,compatibility:`Requires Java 8+/11+/17+, Scala 2.12/2.13, Maven/Gradle/SBT, Apache Spark`},{name:`ssh`,description:`Establish and manage SSH connections to remote machines, including key generation, configuration, and file transfers. Use when connecting to remote servers, executing remote commands, or transferring files via SCP.`,triggers:[`ssh`,`remote server`,`remote machine`,`remote host`,`remote connection`,`secure shell`,`ssh keys`],content:`# SSH Skill
6562
6795
 
6563
6796
  This skill provides capabilities for establishing and managing SSH connections to remote machines.
6797
+ Windows PowerShell equivalents for SSH config creation, key paths, ssh-agent, and permissions are in \`references/windows.md\`.
6564
6798
 
6565
6799
  ## Capabilities
6566
6800
 
@@ -6684,6 +6918,7 @@ chmod 700 ~/.ssh
6684
6918
  This document provides instructions for installing Swift on Debian 12 (Bookworm).
6685
6919
 
6686
6920
  > This setup is intended for non-UI development tasks on Swift on Linux.
6921
+ > On Windows, run these Debian commands inside WSL2 or a Linux container. For native Windows Swift, use the Windows toolchain from Swift.org instead.
6687
6922
 
6688
6923
  ## Prerequisites
6689
6924
 
@@ -6921,6 +7156,11 @@ To allow agents and automated systems to access protected deployments, users nee
6921
7156
  \`\`\`bash
6922
7157
  curl -H "x-vercel-protection-bypass: <secret>" https://your-preview-url.vercel.app
6923
7158
  \`\`\`
7159
+
7160
+ PowerShell equivalent:
7161
+ \`\`\`powershell
7162
+ Invoke-WebRequest -Headers @{ "x-vercel-protection-bypass" = "<secret>" } -Uri https://your-preview-url.vercel.app
7163
+ \`\`\`
6924
7164
 
6925
7165
  **As a Query Parameter:**
6926
7166
  \`\`\`