@openhands/agent-canvas 1.15.0 → 1.17.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 (1277) hide show
  1. package/README.md +15 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/{acp-providers-BKvmTf82.js → acp-providers-DrjNsPOH.js} +1 -1
  4. package/build/assets/active-backend-context-rZiLJRUc.js +2 -0
  5. package/build/assets/{agent-context-settings-D3PjSTU1.js → agent-context-settings-CJUrcBut.js} +1 -1
  6. package/build/assets/agent-profiles-service.api-Biieml2L.js +1 -0
  7. package/build/assets/agent-profiles-settings-x6RvPsq7.js +1 -0
  8. package/build/assets/agent-server-client-options-BikiNwTa.js +1 -0
  9. package/build/assets/agent-server-conversation-service.api-DYFsNHKf.js +88 -0
  10. package/build/assets/agent-settings-BJyovpJ_.js +1 -0
  11. package/build/assets/agent-settings-CpY3zObk.js +2 -0
  12. package/build/assets/alert-banner-vARz1idS.js +1 -0
  13. package/build/assets/{api-error-message-BJyfWp6p.js → api-error-message-Ve79qDcN.js} +1 -1
  14. package/build/assets/api-key-entry-screen-CsMuBhoP.js +1 -0
  15. package/build/assets/{app-settings-CbHqzQus.js → app-settings-BaJ7nfHt.js} +1 -1
  16. package/build/assets/automation-detail-CVoGDrKq.js +3 -0
  17. package/build/assets/{automation-export-BRopEHMu.js → automation-export-DxY47m3T.js} +1 -1
  18. package/build/assets/automation-git-sync-CRMP9Bbm.js +1 -0
  19. package/build/assets/automation-setup-route-072beLz1.js +3 -0
  20. package/build/assets/{automation-templates-C_0FZgLG.js → automation-templates-4C4PM8K7.js} +1 -1
  21. package/build/assets/automations-list-xuqTSQL4.js +1 -0
  22. package/build/assets/{back-nav-button-Dm9tIjVf.js → back-nav-button-B8tH0BEp.js} +1 -1
  23. package/build/assets/backend-form-modal-0aJmWdsa.js +1 -0
  24. package/build/assets/{backend-synced-settings-badge-3fOwg6Bd.js → backend-synced-settings-badge-B7rKWBir.js} +1 -1
  25. package/build/assets/{badge-D4SqUCsR.js → badge-CcGx2TaV.js} +1 -1
  26. package/build/assets/{base-modal-C7_BDl_U.js → base-modal-DTULovNc.js} +1 -1
  27. package/build/assets/bot-CLMxGFaq.js +1 -0
  28. package/build/assets/{brand-button-Dxv6PDeN.js → brand-button-DxPO4Lf8.js} +1 -1
  29. package/build/assets/browser-C-_qBasq.js +46 -0
  30. package/build/assets/{browser-tab-BAl4ckJE.js → browser-tab-DZanIw5m.js} +1 -1
  31. package/build/assets/canvas-extension-page-o_cWgE9B.js +1 -0
  32. package/build/assets/canvas-extensions-DSgNlCha.js +1 -0
  33. package/build/assets/canvas-extensions-runtime-DdnkgJXV.js +1 -0
  34. package/build/assets/{chat-send-button-DWwR2cgI.js → chat-send-button-B3SFSIg5.js} +1 -1
  35. package/build/assets/check-fDEfgSzj.js +1 -0
  36. package/build/assets/chevron-down-CFrWHqu8.js +1 -0
  37. package/build/assets/chevron-right-C5roOrJu.js +1 -0
  38. package/build/assets/circle-check-ClTzJTdb.js +1 -0
  39. package/build/assets/{circle-plus-check-toggle-CBh_qomE.js → circle-plus-check-toggle-Fr-h-mbL.js} +1 -1
  40. package/build/assets/{cloud-funnel-analytics-287iIERo.js → cloud-funnel-analytics-BQanUEEC.js} +1 -1
  41. package/build/assets/{cog-C4rrw-ZK.js → cog-VBlRo6iw.js} +1 -1
  42. package/build/assets/command-menu-BT3Ia5Ru.js +1 -0
  43. package/build/assets/commits-tab-2jhtaohl.js +1 -0
  44. package/build/assets/{condenser-settings-BcNmYR4s.js → condenser-settings-eVKFMvap.js} +1 -1
  45. package/build/assets/confirmation-modal-gIFHeZt6.js +1 -0
  46. package/build/assets/{context-menu-list-item-lVYETtY5.js → context-menu-list-item-DDROe12Z.js} +1 -1
  47. package/build/assets/conversation-BnjJSFf5.js +93 -0
  48. package/build/assets/conversation-DZ578rOX.js +1 -0
  49. package/build/assets/conversation-panel-DZ578rOX.js +1 -0
  50. package/build/assets/conversation-state-store-D1_G_9I-.js +1 -0
  51. package/build/assets/{conversation-store-Ca3ghXap.js → conversation-store-DVVfkCsk.js} +1 -1
  52. package/build/assets/{conversation-tab-empty-state-HJtkmHZj.js → conversation-tab-empty-state-DKlzAz5c.js} +1 -1
  53. package/build/assets/{copy-to-clipboard-button-Cjkswvnj.js → copy-to-clipboard-button-B3w0X7WH.js} +1 -1
  54. package/build/assets/{device-verify-EZhHhBT7.js → device-verify-BfkCzyFB.js} +1 -1
  55. package/build/assets/{dropdown-classes-DJe-E6MC.js → dropdown-classes-B9kJVDIk.js} +1 -1
  56. package/build/assets/edit-automation-modal-BwhJ39JT.js +1 -0
  57. package/build/assets/empty-state-RZz0OfnY.js +1 -0
  58. package/build/assets/{entry.client-C7Bi2tkU.js → entry.client-Ds8LVp-E.js} +2 -2
  59. package/build/assets/enum-filter-dropdown-C4pW0ORd.js +1 -0
  60. package/build/assets/{environment-switch-overlay-CEKrFiMw.js → environment-switch-overlay-P2ZAuzov.js} +1 -1
  61. package/build/assets/{error-state-BALXiBNy.js → error-state-B_5cgNPJ.js} +1 -1
  62. package/build/assets/extensions-hub-DsaUr4ca.js +1 -0
  63. package/build/assets/extensions-navigation-CRMZd-FE.js +1 -0
  64. package/build/assets/external-link-DQtv7eTh.js +1 -0
  65. package/build/assets/files-tab-CCgAcVdc.js +1 -0
  66. package/build/assets/{form-control-classes-CGw40z5h.js → form-control-classes-B-z85REi.js} +1 -1
  67. package/build/assets/format-model-name-CasAP3nd.js +1 -0
  68. package/build/assets/get-git-path-EHrSDxTM.js +1 -0
  69. package/build/assets/git-repo-dropdown-D2WEQ97X.js +1 -0
  70. package/build/assets/{git-repo-dropdown-ai8qaNkD.js → git-repo-dropdown-DVeCUUXG.js} +1 -1
  71. package/build/assets/{highlighted-source-view-C3sxykQi.js → highlighted-source-view-DjHO3SdW.js} +1 -1
  72. package/build/assets/home-BorS_vdS.js +1 -0
  73. package/build/assets/home-aIMbHw5M.js +1 -0
  74. package/build/assets/home-automation-run-tooltip-CpHNFiFl.js +1 -0
  75. package/build/assets/home-store-DyXz0w6d.js +1 -0
  76. package/build/assets/hooks-service-C6dpRtZM.js +1 -0
  77. package/build/assets/index-home-zKFuKK2B.js +1 -0
  78. package/build/assets/info-CTIdjttz.js +1 -0
  79. package/build/assets/install-server-modal-DUiZMc8u.js +1 -0
  80. package/build/assets/kebab-menu-item-content-mm04SBD3.js +1 -0
  81. package/build/assets/{key-Cn5za3rg.js → key-CfXbJa8w.js} +1 -1
  82. package/build/assets/{launch-C1ieiOGe.js → launch-BSIf9KEg.js} +1 -1
  83. package/build/assets/list-filter-CNpqTWVY.js +1 -0
  84. package/build/assets/{list-todo-Cuu-STFc.js → list-todo-ByXMdY4W.js} +1 -1
  85. package/build/assets/llm-not-configured-banner-z_QRSeV0.js +27 -0
  86. package/build/assets/llm-settings-B-5AHMiX.js +1 -0
  87. package/build/assets/llm-settings-B3SjHDmA.js +1 -0
  88. package/build/assets/llm-subscription-service-aDNBQ7Gq.js +1 -0
  89. package/build/assets/loader-circle-Dex47vVW.js +1 -0
  90. package/build/assets/{loading-spinner-0L3ZTToZ.js → loading-spinner-DfHI77BA.js} +1 -1
  91. package/build/assets/manage-backends-modal-q1NdFisr.js +1 -0
  92. package/build/assets/manifest-8920b615.js +1 -0
  93. package/build/assets/{manifest-subpage-layout-BGhiUQbA.js → manifest-subpage-layout-BQQy5ipR.js} +1 -1
  94. package/build/assets/{map-provider-B9LTm23I.js → map-provider-DXvssjw9.js} +1 -1
  95. package/build/assets/markdown-renderer-rivLvYh-.js +8 -0
  96. package/build/assets/{mcp-CKbR4Vft.js → mcp-CEXDhQWn.js} +1 -1
  97. package/build/assets/{mcp-marketplace-utils-C13fFccR.js → mcp-marketplace-utils-Cn_NIMWM.js} +1 -1
  98. package/build/assets/mcp-page-LGYIICMG.js +9 -0
  99. package/build/assets/messages-DUSeANAh.js +41 -0
  100. package/build/assets/{modal-body-CMOc2tLl.js → modal-body-DJw4xBki.js} +1 -1
  101. package/build/assets/{modal-classes-BAb4Y_BG.js → modal-classes-Dg0ngBPO.js} +1 -1
  102. package/build/assets/{modal-close-button-CkJ0Ktjj.js → modal-close-button-B9j4nasm.js} +1 -1
  103. package/build/assets/{mouse-pointer-click-CsgRs_-r.js → mouse-pointer-click-DEhsSUpu.js} +1 -1
  104. package/build/assets/onboarding-BjFebfs5.js +1 -0
  105. package/build/assets/onboarding-modal-DDTjOpyd.js +1 -0
  106. package/build/assets/organization-service.api-Cyg1Tn03.js +1 -0
  107. package/build/assets/pencil-D5c47kyN.js +1 -0
  108. package/build/assets/pin-C7vMagvf.js +1 -0
  109. package/build/assets/planner-tab-D8f2Y3rn.js +1 -0
  110. package/build/assets/plug-CeaqeF6u.js +1 -0
  111. package/build/assets/plugins-management-service-Bh_pBuf-.js +1 -0
  112. package/build/assets/plus-B3wvU06-.js +1 -0
  113. package/build/assets/profiles-service.api-BbOK0EkF.js +1 -0
  114. package/build/assets/providers-2gIIkz2N.js +1 -0
  115. package/build/assets/proxy-CBgMd2zf.js +1 -0
  116. package/build/assets/{puzzle-A9pGxxai.js → puzzle-DdAqbUrb.js} +1 -1
  117. package/build/assets/recommended-automations-launcher-YLAQTp4s.js +1 -0
  118. package/build/assets/refresh-cw-DEQdPCpH.js +1 -0
  119. package/build/assets/root-Bye_XmEL.js +2 -0
  120. package/build/assets/root-Cnwwzgo0.css +1 -0
  121. package/build/assets/root-layout-CSAwxBGM.js +2 -0
  122. package/build/assets/schema-field-CK0xYNbO.js +1 -0
  123. package/build/assets/scroll-fade-state-Dt_fx2kf.js +1 -0
  124. package/build/assets/sdk-section-page-Da73Rs_o.js +1 -0
  125. package/build/assets/secret-form-CB2VwYYg.js +1 -0
  126. package/build/assets/secrets-service-Cr8g8xuv.js +1 -0
  127. package/build/assets/{secrets-settings-BizaTEr1.js → secrets-settings-Bh0udeKv.js} +1 -1
  128. package/build/assets/settings-CKqk8ZnH.js +1 -0
  129. package/build/assets/settings-DmyIgRxO.js +1 -0
  130. package/build/assets/{settings-dropdown-input-tM0A0ipy.js → settings-dropdown-input-DVpyD87C.js} +1 -1
  131. package/build/assets/settings-index-BSJUFmjE.js +1 -0
  132. package/build/assets/{settings-input-C03KUoSC.js → settings-input-C0dd8Utu.js} +1 -1
  133. package/build/assets/{settings-list-classes-BJ0g8rWj.js → settings-list-classes-Ds4jPBHK.js} +1 -1
  134. package/build/assets/{settings-modal-AzEF1QPP.js → settings-modal-yStgEh2o.js} +1 -1
  135. package/build/assets/settings-service.api-9_xdv_mh.js +1 -0
  136. package/build/assets/{settings-switch-CQE0EGC-.js → settings-switch-B78Khmyz.js} +1 -1
  137. package/build/assets/{settings-utils-ClYOkbbI.js → settings-utils-8GIIgOQL.js} +1 -1
  138. package/build/assets/shared-conversation-DM96X4KV.js +1 -0
  139. package/build/assets/shield-check-DO7wa_eu.js +1 -0
  140. package/build/assets/{sidebar-layout-D3hE08wK.js → sidebar-layout-EPfWxk11.js} +1 -1
  141. package/build/assets/sidebar-mobile-menu-toggle-D5GR5xT9.js +1 -0
  142. package/build/assets/sidebar-nav-link-_t4_Ef-9.js +1 -0
  143. package/build/assets/{sidebar-onboarding-checklist-storage-3qYflszY.js → sidebar-onboarding-checklist-storage-DbDX-Wvj.js} +1 -1
  144. package/build/assets/sidebar-store-CSDFK0W5.js +1 -0
  145. package/build/assets/{skill-card-pill-row-CFxjoqxn.js → skill-card-pill-row-989y15jV.js} +1 -1
  146. package/build/assets/skill-enablement-DXeaImBz.js +1 -0
  147. package/build/assets/skill-filter-BBeZ4JEP.js +2 -0
  148. package/build/assets/{skill-icon-badge-CPQJ6A-I.js → skill-icon-badge-BDhQ-tQ0.js} +1 -1
  149. package/build/assets/skill-scope-Dz3kPH3P.js +1 -0
  150. package/build/assets/skills-plugins-e3CYGdUJ.js +1 -0
  151. package/build/assets/skills-settings-3e-FuHw_.js +1 -0
  152. package/build/assets/styled-tooltip-Pd22BIvr.js +1 -0
  153. package/build/assets/{task-list-tab-04GNQuii.js → task-list-tab-3Jg8ywch.js} +1 -1
  154. package/build/assets/{terminal-Cj0iHIW7.js → terminal-onXx0_Qz.js} +1 -1
  155. package/build/assets/toggle-switch-lwQtxDcm.js +1 -0
  156. package/build/assets/trash-2-ZhKuTLiz.js +1 -0
  157. package/build/assets/trash-B6OIe4yX.js +1 -0
  158. package/build/assets/triangle-alert-BajLPpQg.js +1 -0
  159. package/build/assets/{typography-SgFy466J.js → typography-HLLg_FAn.js} +1 -1
  160. package/build/assets/usage-tab-Cm-9j3UK.js +1 -0
  161. package/build/assets/use-acp-credential-form-BARcvjYE.js +1 -0
  162. package/build/assets/use-activate-agent-profile-BLKML6vQ.js +1 -0
  163. package/build/assets/use-agent-profiles-1P91KSXz.js +1 -0
  164. package/build/assets/{use-automation-health-BxXdzZMP.js → use-automation-health-BZkQNEA8.js} +1 -1
  165. package/build/assets/use-automation-permissions-B_RpvL-s.js +1 -0
  166. package/build/assets/{use-automations-zYb0dUny.js → use-automations-Cg0PDIZr.js} +1 -1
  167. package/build/assets/{use-can-manage-org-profiles-BWMahtUh.js → use-can-manage-org-profiles-BbN6KfDr.js} +1 -1
  168. package/build/assets/use-canvas-extensions-CFUpHat6.js +1 -0
  169. package/build/assets/{use-cloud-current-user-id-CPHMDG-C.js → use-cloud-current-user-id-Dk0rjr63.js} +1 -1
  170. package/build/assets/use-config-DpafU_QP.js +1 -0
  171. package/build/assets/use-create-conversation-1YgmAHt-.js +1 -0
  172. package/build/assets/use-create-secret-D8p9ybQj.js +1 -0
  173. package/build/assets/{use-get-secrets-BT4ihRwj.js → use-get-secrets-CQ4b0qK8.js} +1 -1
  174. package/build/assets/use-is-authed-BRPjCRKM.js +1 -0
  175. package/build/assets/{use-launch-skill-in-chat-BYjYihBP.js → use-launch-skill-in-chat-DeYa1tFM.js} +1 -1
  176. package/build/assets/use-llm-configured-DGm8FiRR.js +1 -0
  177. package/build/assets/use-llm-profiles-BTTtpW4z.js +1 -0
  178. package/build/assets/use-manifest-capabilities-AOWGcu0j.js +1 -0
  179. package/build/assets/use-onboarding-completion-CoINurkm.js +1 -0
  180. package/build/assets/use-pinned-home-route-D6krwXjy.js +1 -0
  181. package/build/assets/use-plugins-marketplace-mLsIDhBv.js +1 -0
  182. package/build/assets/use-save-agent-profile-CxyO9YG-.js +1 -0
  183. package/build/assets/{use-save-settings-CUZW6yXP.js → use-save-settings-3U5K9-8x.js} +1 -1
  184. package/build/assets/use-settings-Dn00UISA.js +1 -0
  185. package/build/assets/use-settings-nav-items-vrjxTqcu.js +16 -0
  186. package/build/assets/use-tracking-B9prBsrq.js +3 -0
  187. package/build/assets/{use-user-conversation-DT0_QCnL.js → use-user-conversation-ZWlXtbZb.js} +1 -1
  188. package/build/assets/{useInfiniteQuery-CgeUQPfs.js → useInfiniteQuery-BzrRqjLg.js} +1 -1
  189. package/build/assets/{useMutation-DFnzkf6f.js → useMutation-CJuK90oc.js} +1 -1
  190. package/build/assets/{useQueries-BhbrGEf1.js → useQueries-CykmpT-a.js} +1 -1
  191. package/build/assets/{useQuery-BXWbZBZl.js → useQuery-S6j94er1.js} +1 -1
  192. package/build/assets/utils-BOco8mxR.js +1 -0
  193. package/build/assets/{vendor~conversation-panel~conversation-CTvDDiXg.js → vendor~conversation-panel~conversation-4eJ0tml3.js} +1 -1
  194. package/build/assets/{vendor~entry.client-BFE7Llz9.js → vendor~entry.client-CoCfUXUF.js} +1 -1
  195. package/build/assets/{vendor~entry.client-BaKt_PIp.js → vendor~entry.client-DA2izTjq.js} +1 -1
  196. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~b0x1wrp2-Z0lly3FE.js +2 -0
  197. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-BfkNGovw.js +185 -0
  198. package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew3u153i-rfV8mQ9m.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-DnDoaYNi.js} +1 -1
  199. package/build/assets/{vendor~index-home~home~conversation-panel~conversation-BTyukeM-.js → vendor~index-home~home~conversation-panel~conversation-CSFLzmTN.js} +1 -1
  200. package/build/assets/vendor~root-layout-n8XCEXG8.js +1 -0
  201. package/build/assets/{vendor~root-layout~conversation-panel~conversation-BYAWJwQX.js → vendor~root-layout~conversation-panel~conversation-3Idg1_U3.js} +1 -1
  202. package/build/assets/{vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-CHaLEBVR.js → vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-DkPlXWl9.js} +1 -1
  203. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation-DgQ564nC.js +1 -0
  204. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-CxhwKuAd.js +1 -0
  205. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~hjcjabwg-Dtu7BpYk.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~inibp4qe-CnsDDzeE.js} +2 -2
  206. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iyia17eu-CV850oio.js +1 -0
  207. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-DonTKfQD.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-BPjI-atc.js} +125 -15
  208. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~jz4f6vo2-BgxDvUcf.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~jz4f6vo2-C7HiY4Ae.js} +42 -3
  209. package/build/assets/{verification-settings-Bj6bo097.js → verification-settings-u2POabjH.js} +1 -1
  210. package/build/assets/{wrench-hi7Q13dF.js → wrench-CkgI4rxA.js} +1 -1
  211. package/build/assets/x-By6qCmtY.js +1 -0
  212. package/build/index.html +4 -4
  213. package/build/locales/ar/openhands.json +94 -25
  214. package/build/locales/ca/openhands.json +94 -25
  215. package/build/locales/de/openhands.json +94 -25
  216. package/build/locales/en/openhands.json +94 -25
  217. package/build/locales/es/openhands.json +94 -25
  218. package/build/locales/fr/openhands.json +94 -25
  219. package/build/locales/it/openhands.json +94 -25
  220. package/build/locales/ja/openhands.json +94 -25
  221. package/build/locales/ko-KR/openhands.json +94 -25
  222. package/build/locales/no/openhands.json +94 -25
  223. package/build/locales/pt/openhands.json +94 -25
  224. package/build/locales/tr/openhands.json +94 -25
  225. package/build/locales/uk/openhands.json +94 -25
  226. package/build/locales/zh-CN/openhands.json +94 -25
  227. package/build/locales/zh-TW/openhands.json +94 -25
  228. package/config/defaults.json +9 -5
  229. package/dist/api/agent-profiles-service/profile-field-support.d.ts +26 -0
  230. package/dist/api/agent-server-adapter.cjs +3 -3
  231. package/dist/api/agent-server-adapter.cjs.map +1 -1
  232. package/dist/api/agent-server-adapter.d.ts +72 -12
  233. package/dist/api/agent-server-adapter.js +249 -145
  234. package/dist/api/agent-server-adapter.js.map +1 -1
  235. package/dist/api/agent-server-compatibility.cjs +1 -1
  236. package/dist/api/agent-server-compatibility.cjs.map +1 -1
  237. package/dist/api/agent-server-compatibility.d.ts +21 -0
  238. package/dist/api/agent-server-compatibility.js +52 -38
  239. package/dist/api/agent-server-compatibility.js.map +1 -1
  240. package/dist/api/agent-server-config.cjs +1 -1
  241. package/dist/api/agent-server-config.cjs.map +1 -1
  242. package/dist/api/agent-server-config.d.ts +32 -0
  243. package/dist/api/agent-server-config.js +21 -5
  244. package/dist/api/agent-server-config.js.map +1 -1
  245. package/dist/api/automation-service/automation-service.api.cjs +1 -1
  246. package/dist/api/automation-service/automation-service.api.cjs.map +1 -1
  247. package/dist/api/automation-service/automation-service.api.d.ts +2 -2
  248. package/dist/api/automation-service/automation-service.api.js +7 -7
  249. package/dist/api/automation-service/automation-service.api.js.map +1 -1
  250. package/dist/api/canvas-extensions-service.cjs +1 -0
  251. package/dist/api/canvas-extensions-service.d.ts +22 -0
  252. package/dist/api/canvas-extensions-service.js +4 -0
  253. package/dist/api/cloud/conversation-service.api.cjs +1 -1
  254. package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
  255. package/dist/api/cloud/conversation-service.api.d.ts +6 -0
  256. package/dist/api/cloud/conversation-service.api.js +14 -6
  257. package/dist/api/cloud/conversation-service.api.js.map +1 -1
  258. package/dist/api/cloud/provider-connections-service.api.cjs +2 -0
  259. package/dist/api/cloud/provider-connections-service.api.cjs.map +1 -0
  260. package/dist/api/cloud/provider-connections-service.api.d.ts +5 -0
  261. package/dist/api/cloud/provider-connections-service.api.js +50 -0
  262. package/dist/api/cloud/provider-connections-service.api.js.map +1 -0
  263. package/dist/api/cloud/skills-service.api.cjs +1 -1
  264. package/dist/api/cloud/skills-service.api.cjs.map +1 -1
  265. package/dist/api/cloud/skills-service.api.d.ts +10 -0
  266. package/dist/api/cloud/skills-service.api.js +11 -1
  267. package/dist/api/cloud/skills-service.api.js.map +1 -1
  268. package/dist/api/conversation-file-upload.api.cjs +1 -1
  269. package/dist/api/conversation-file-upload.api.js +10 -10
  270. package/dist/api/conversation-metadata-store.cjs +1 -1
  271. package/dist/api/conversation-metadata-store.cjs.map +1 -1
  272. package/dist/api/conversation-metadata-store.d.ts +24 -0
  273. package/dist/api/conversation-metadata-store.js +10 -2
  274. package/dist/api/conversation-metadata-store.js.map +1 -1
  275. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  276. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  277. package/dist/api/conversation-service/agent-server-conversation-service.api.d.ts +31 -0
  278. package/dist/api/conversation-service/agent-server-conversation-service.api.js +188 -128
  279. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  280. package/dist/api/event-service/event-service.api.cjs +1 -1
  281. package/dist/api/event-service/event-service.api.js +12 -12
  282. package/dist/api/git-service/agent-server-git-service.api.cjs +1 -1
  283. package/dist/api/git-service/agent-server-git-service.api.js +8 -8
  284. package/dist/api/hooks-service.cjs +2 -0
  285. package/dist/api/hooks-service.cjs.map +1 -0
  286. package/dist/api/hooks-service.d.ts +13 -0
  287. package/dist/api/hooks-service.js +20 -0
  288. package/dist/api/hooks-service.js.map +1 -0
  289. package/dist/api/provider-connections-service/provider-connections-service.api.cjs +1 -1
  290. package/dist/api/provider-connections-service/provider-connections-service.api.cjs.map +1 -1
  291. package/dist/api/provider-connections-service/provider-connections-service.api.js +25 -16
  292. package/dist/api/provider-connections-service/provider-connections-service.api.js.map +1 -1
  293. package/dist/api/runtime-service/agent-server-runtime-service.cjs +1 -1
  294. package/dist/api/runtime-service/agent-server-runtime-service.js +8 -8
  295. package/dist/api/settings-service/settings-service.api.cjs +1 -1
  296. package/dist/api/settings-service/settings-service.api.cjs.map +1 -1
  297. package/dist/api/settings-service/settings-service.api.d.ts +5 -2
  298. package/dist/api/settings-service/settings-service.api.js +20 -11
  299. package/dist/api/settings-service/settings-service.api.js.map +1 -1
  300. package/dist/api/skills-service.cjs +1 -1
  301. package/dist/api/skills-service.cjs.map +1 -1
  302. package/dist/api/skills-service.d.ts +7 -0
  303. package/dist/api/skills-service.js +11 -8
  304. package/dist/api/skills-service.js.map +1 -1
  305. package/dist/components/conversation-events/chat/event-message-components/critic-result-display.cjs +1 -1
  306. package/dist/components/conversation-events/chat/event-message-components/critic-result-display.js +5 -5
  307. package/dist/components/conversation-events/chat/event-message-components/event-group.cjs +1 -1
  308. package/dist/components/conversation-events/chat/event-message-components/event-group.cjs.map +1 -1
  309. package/dist/components/conversation-events/chat/event-message-components/event-group.js +40 -36
  310. package/dist/components/conversation-events/chat/event-message-components/event-group.js.map +1 -1
  311. package/dist/components/conversation-events/chat/event-message-components/finish-event-message.cjs +1 -1
  312. package/dist/components/conversation-events/chat/event-message-components/finish-event-message.cjs.map +1 -1
  313. package/dist/components/conversation-events/chat/event-message-components/finish-event-message.js +2 -1
  314. package/dist/components/conversation-events/chat/event-message-components/finish-event-message.js.map +1 -1
  315. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs +1 -1
  316. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs.map +1 -1
  317. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.d.ts +1 -1
  318. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js +28 -28
  319. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js.map +1 -1
  320. package/dist/components/conversation-events/chat/event-message-components/thought-event-message.cjs +1 -1
  321. package/dist/components/conversation-events/chat/event-message-components/thought-event-message.cjs.map +1 -1
  322. package/dist/components/conversation-events/chat/event-message-components/thought-event-message.js +2 -1
  323. package/dist/components/conversation-events/chat/event-message-components/thought-event-message.js.map +1 -1
  324. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.cjs +1 -1
  325. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.cjs.map +1 -1
  326. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.d.ts +1 -1
  327. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.js +37 -37
  328. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.js.map +1 -1
  329. package/dist/components/conversation-events/chat/event-message.cjs +2 -2
  330. package/dist/components/conversation-events/chat/event-message.cjs.map +1 -1
  331. package/dist/components/conversation-events/chat/event-message.js +79 -70
  332. package/dist/components/conversation-events/chat/event-message.js.map +1 -1
  333. package/dist/components/conversation-events/chat/messages.cjs +1 -1
  334. package/dist/components/conversation-events/chat/messages.cjs.map +1 -1
  335. package/dist/components/conversation-events/chat/messages.js +28 -27
  336. package/dist/components/conversation-events/chat/messages.js.map +1 -1
  337. package/dist/components/features/automations/automation-card.cjs +1 -1
  338. package/dist/components/features/automations/automation-card.cjs.map +1 -1
  339. package/dist/components/features/automations/automation-card.js +118 -102
  340. package/dist/components/features/automations/automation-card.js.map +1 -1
  341. package/dist/components/features/automations/automation-list-row.cjs +1 -1
  342. package/dist/components/features/automations/automation-list-row.cjs.map +1 -1
  343. package/dist/components/features/automations/automation-list-row.js +88 -77
  344. package/dist/components/features/automations/automation-list-row.js.map +1 -1
  345. package/dist/components/features/automations/detail/detail-header.d.ts +3 -1
  346. package/dist/components/features/automations/detail/run-phase.cjs +2 -0
  347. package/dist/components/features/automations/detail/run-phase.cjs.map +1 -0
  348. package/dist/components/features/automations/detail/run-phase.d.ts +89 -0
  349. package/dist/components/features/automations/detail/run-phase.js +72 -0
  350. package/dist/components/features/automations/detail/run-phase.js.map +1 -0
  351. package/dist/components/features/automations/detail/run-status-badge.cjs +1 -1
  352. package/dist/components/features/automations/detail/run-status-badge.cjs.map +1 -1
  353. package/dist/components/features/automations/detail/run-status-badge.d.ts +2 -2
  354. package/dist/components/features/automations/detail/run-status-badge.js +82 -53
  355. package/dist/components/features/automations/detail/run-status-badge.js.map +1 -1
  356. package/dist/components/features/automations/kebab-menu.cjs +1 -1
  357. package/dist/components/features/automations/kebab-menu.cjs.map +1 -1
  358. package/dist/components/features/automations/kebab-menu.js +9 -5
  359. package/dist/components/features/automations/kebab-menu.js.map +1 -1
  360. package/dist/components/features/automations/recommended-automations-launcher.cjs +1 -1
  361. package/dist/components/features/automations/recommended-automations-launcher.cjs.map +1 -1
  362. package/dist/components/features/automations/recommended-automations-launcher.js +12 -12
  363. package/dist/components/features/automations/recommended-automations-launcher.js.map +1 -1
  364. package/dist/components/features/automations/recommended-automations-section.cjs +1 -1
  365. package/dist/components/features/automations/recommended-automations-section.js +9 -9
  366. package/dist/components/features/backends/backend-form-modal.cjs +1 -1
  367. package/dist/components/features/backends/backend-form-modal.cjs.map +1 -1
  368. package/dist/components/features/backends/backend-form-modal.js +5 -11
  369. package/dist/components/features/backends/backend-form-modal.js.map +1 -1
  370. package/dist/components/features/backends/backend-selector.cjs +1 -1
  371. package/dist/components/features/backends/backend-selector.cjs.map +1 -1
  372. package/dist/components/features/backends/backend-selector.js +133 -122
  373. package/dist/components/features/backends/backend-selector.js.map +1 -1
  374. package/dist/components/features/backends/manage-backends-modal.cjs +1 -1
  375. package/dist/components/features/backends/manage-backends-modal.cjs.map +1 -1
  376. package/dist/components/features/backends/manage-backends-modal.js +29 -29
  377. package/dist/components/features/backends/manage-backends-modal.js.map +1 -1
  378. package/dist/components/features/canvas-extensions/add-canvas-extension-modal.d.ts +6 -0
  379. package/dist/components/features/canvas-extensions/canvas-extension-card.d.ts +9 -0
  380. package/dist/components/features/canvas-extensions/canvas-extensions-runtime.cjs +2 -0
  381. package/dist/components/features/canvas-extensions/canvas-extensions-runtime.cjs.map +1 -0
  382. package/dist/components/features/canvas-extensions/canvas-extensions-runtime.d.ts +23 -0
  383. package/dist/components/features/canvas-extensions/canvas-extensions-runtime.js +19 -0
  384. package/dist/components/features/canvas-extensions/canvas-extensions-runtime.js.map +1 -0
  385. package/dist/components/features/chat/change-agent-button.cjs +1 -1
  386. package/dist/components/features/chat/change-agent-button.js +4 -4
  387. package/dist/components/features/chat/chat-interface.cjs +2 -2
  388. package/dist/components/features/chat/chat-interface.cjs.map +1 -1
  389. package/dist/components/features/chat/chat-interface.js +107 -104
  390. package/dist/components/features/chat/chat-interface.js.map +1 -1
  391. package/dist/components/features/chat/chat-markdown-path-code.cjs +3 -0
  392. package/dist/components/features/chat/chat-markdown-path-code.cjs.map +1 -0
  393. package/dist/components/features/chat/chat-markdown-path-code.d.ts +27 -0
  394. package/dist/components/features/chat/chat-markdown-path-code.js +72 -0
  395. package/dist/components/features/chat/chat-markdown-path-code.js.map +1 -0
  396. package/dist/components/features/chat/chat-message.cjs +1 -1
  397. package/dist/components/features/chat/chat-message.cjs.map +1 -1
  398. package/dist/components/features/chat/chat-message.d.ts +2 -1
  399. package/dist/components/features/chat/chat-message.js +88 -79
  400. package/dist/components/features/chat/chat-message.js.map +1 -1
  401. package/dist/components/features/chat/components/context-window-meter.cjs +1 -1
  402. package/dist/components/features/chat/components/context-window-meter.js +4 -4
  403. package/dist/components/features/chat/confirmation-mode-enabled.cjs +1 -1
  404. package/dist/components/features/chat/confirmation-mode-enabled.js +4 -4
  405. package/dist/components/features/chat/generic-event-message.cjs +1 -1
  406. package/dist/components/features/chat/generic-event-message.cjs.map +1 -1
  407. package/dist/components/features/chat/generic-event-message.d.ts +2 -1
  408. package/dist/components/features/chat/generic-event-message.js +41 -22
  409. package/dist/components/features/chat/generic-event-message.js.map +1 -1
  410. package/dist/components/features/chat/interactive-chat-box.cjs +1 -1
  411. package/dist/components/features/chat/interactive-chat-box.cjs.map +1 -1
  412. package/dist/components/features/chat/interactive-chat-box.js +20 -19
  413. package/dist/components/features/chat/interactive-chat-box.js.map +1 -1
  414. package/dist/components/features/chat/path-component.cjs +1 -1
  415. package/dist/components/features/chat/path-component.cjs.map +1 -1
  416. package/dist/components/features/chat/path-component.d.ts +8 -2
  417. package/dist/components/features/chat/path-component.js +33 -21
  418. package/dist/components/features/chat/path-component.js.map +1 -1
  419. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.cjs +1 -1
  420. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.cjs.map +1 -1
  421. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.js +38 -43
  422. package/dist/components/features/chat/tool-visualizers/file-editor/file-editor.js.map +1 -1
  423. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.cjs +1 -1
  424. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.cjs.map +1 -1
  425. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.d.ts +8 -5
  426. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.js +22 -16
  427. package/dist/components/features/chat/tool-visualizers/primitives/file-path-chip.js.map +1 -1
  428. package/dist/components/features/chat/user-message-body.cjs +1 -1
  429. package/dist/components/features/chat/user-message-body.cjs.map +1 -1
  430. package/dist/components/features/chat/user-message-body.d.ts +4 -0
  431. package/dist/components/features/chat/user-message-body.js +30 -24
  432. package/dist/components/features/chat/user-message-body.js.map +1 -1
  433. package/dist/components/features/conversation/conversation-overview-git-section.cjs +1 -1
  434. package/dist/components/features/conversation/conversation-overview-git-section.js +4 -4
  435. package/dist/components/features/conversation/conversation-overview-skills-panel.cjs +1 -1
  436. package/dist/components/features/conversation/conversation-overview-skills-panel.cjs.map +1 -1
  437. package/dist/components/features/conversation/conversation-overview-skills-panel.js +63 -81
  438. package/dist/components/features/conversation/conversation-overview-skills-panel.js.map +1 -1
  439. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs +1 -1
  440. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs.map +1 -1
  441. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js +77 -78
  442. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js.map +1 -1
  443. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs +1 -1
  444. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs.map +1 -1
  445. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js +96 -96
  446. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js.map +1 -1
  447. package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.cjs +1 -1
  448. package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.cjs.map +1 -1
  449. package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.d.ts +1 -1
  450. package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.js +3 -3
  451. package/dist/components/features/conversation/conversation-tabs/drawer-vscode-link.js.map +1 -1
  452. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.cjs +2 -0
  453. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.cjs.map +1 -0
  454. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.d.ts +21 -0
  455. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.js +239 -0
  456. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.js.map +1 -0
  457. package/dist/components/features/conversation-panel/conversation-active-tag-filters.cjs +2 -0
  458. package/dist/components/features/conversation-panel/conversation-active-tag-filters.cjs.map +1 -0
  459. package/dist/components/features/conversation-panel/conversation-active-tag-filters.d.ts +28 -0
  460. package/dist/components/features/conversation-panel/conversation-active-tag-filters.js +69 -0
  461. package/dist/components/features/conversation-panel/conversation-active-tag-filters.js.map +1 -0
  462. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs +1 -1
  463. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs.map +1 -1
  464. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.d.ts +2 -1
  465. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js +19 -18
  466. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js.map +1 -1
  467. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs +1 -1
  468. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs.map +1 -1
  469. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.d.ts +2 -1
  470. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js +91 -80
  471. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js.map +1 -1
  472. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs +1 -1
  473. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs.map +1 -1
  474. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js +1 -1
  475. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js.map +1 -1
  476. package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs +1 -1
  477. package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs.map +1 -1
  478. package/dist/components/features/conversation-panel/conversation-card/conversation-card.d.ts +7 -1
  479. package/dist/components/features/conversation-panel/conversation-card/conversation-card.js +87 -81
  480. package/dist/components/features/conversation-panel/conversation-card/conversation-card.js.map +1 -1
  481. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs +1 -1
  482. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs.map +1 -1
  483. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.d.ts +2 -1
  484. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js +1 -1
  485. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js.map +1 -1
  486. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs +1 -1
  487. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs.map +1 -1
  488. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.d.ts +2 -1
  489. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js +2 -1
  490. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js.map +1 -1
  491. package/dist/components/features/conversation-panel/conversation-layouts-menu.cjs +2 -0
  492. package/dist/components/features/conversation-panel/conversation-layouts-menu.cjs.map +1 -0
  493. package/dist/components/features/conversation-panel/conversation-layouts-menu.d.ts +29 -0
  494. package/dist/components/features/conversation-panel/conversation-layouts-menu.js +177 -0
  495. package/dist/components/features/conversation-panel/conversation-layouts-menu.js.map +1 -0
  496. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs +1 -1
  497. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs.map +1 -1
  498. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.d.ts +37 -0
  499. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js +85 -45
  500. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js.map +1 -1
  501. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  502. package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
  503. package/dist/components/features/conversation-panel/conversation-panel.js +296 -290
  504. package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
  505. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.cjs +2 -0
  506. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.cjs.map +1 -0
  507. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.d.ts +22 -0
  508. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.js +153 -0
  509. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.js.map +1 -0
  510. package/dist/components/features/conversation-panel/hide-older-conversations-row.cjs +2 -0
  511. package/dist/components/features/conversation-panel/hide-older-conversations-row.cjs.map +1 -0
  512. package/dist/components/features/conversation-panel/hide-older-conversations-row.d.ts +6 -0
  513. package/dist/components/features/conversation-panel/hide-older-conversations-row.js +65 -0
  514. package/dist/components/features/conversation-panel/hide-older-conversations-row.js.map +1 -0
  515. package/dist/components/features/conversation-panel/menu-row.cjs +1 -1
  516. package/dist/components/features/conversation-panel/menu-row.cjs.map +1 -1
  517. package/dist/components/features/conversation-panel/menu-row.d.ts +11 -1
  518. package/dist/components/features/conversation-panel/menu-row.js +27 -16
  519. package/dist/components/features/conversation-panel/menu-row.js.map +1 -1
  520. package/dist/components/features/conversation-panel/skills-modal.cjs +1 -1
  521. package/dist/components/features/conversation-panel/skills-modal.cjs.map +1 -1
  522. package/dist/components/features/conversation-panel/skills-modal.js +29 -28
  523. package/dist/components/features/conversation-panel/skills-modal.js.map +1 -1
  524. package/dist/components/features/files-tab/file-content-viewer.cjs +1 -1
  525. package/dist/components/features/files-tab/file-content-viewer.js +5 -5
  526. package/dist/components/features/home/featured-automations/automation-health-indicator.cjs +1 -1
  527. package/dist/components/features/home/featured-automations/automation-health-indicator.cjs.map +1 -1
  528. package/dist/components/features/home/featured-automations/automation-health-indicator.js +1 -1
  529. package/dist/components/features/home/featured-automations/automation-health-indicator.js.map +1 -1
  530. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.cjs +1 -1
  531. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.cjs.map +1 -1
  532. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.d.ts +4 -3
  533. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.js +22 -25
  534. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.js.map +1 -1
  535. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.cjs +1 -1
  536. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.cjs.map +1 -1
  537. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.d.ts +1 -1
  538. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.js +15 -15
  539. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.js.map +1 -1
  540. package/dist/components/features/home/featured-automations/automation-run-health.cjs +1 -1
  541. package/dist/components/features/home/featured-automations/automation-run-health.cjs.map +1 -1
  542. package/dist/components/features/home/featured-automations/automation-run-health.d.ts +5 -3
  543. package/dist/components/features/home/featured-automations/automation-run-health.js +30 -23
  544. package/dist/components/features/home/featured-automations/automation-run-health.js.map +1 -1
  545. package/dist/components/features/home/featured-automations/home-automation-activity.d.ts +3 -2
  546. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs +1 -1
  547. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs.map +1 -1
  548. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.d.ts +1 -1
  549. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js +59 -37
  550. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js.map +1 -1
  551. package/dist/components/features/manifest/manifest-form-field.d.ts +3 -1
  552. package/dist/components/features/manifest/manifest-review-step.d.ts +3 -1
  553. package/dist/components/features/onboarding/onboarding-host.d.ts +3 -4
  554. package/dist/components/features/onboarding/steps/setup-llm-step.d.ts +5 -9
  555. package/dist/components/features/settings/acp-auth-status-banner.d.ts +23 -6
  556. package/dist/components/features/settings/cloud-settings-link.cjs +1 -1
  557. package/dist/components/features/settings/cloud-settings-link.cjs.map +1 -1
  558. package/dist/components/features/settings/cloud-settings-link.js +5 -3
  559. package/dist/components/features/settings/cloud-settings-link.js.map +1 -1
  560. package/dist/components/features/settings/integrations-settings-link.cjs +1 -1
  561. package/dist/components/features/settings/integrations-settings-link.cjs.map +1 -1
  562. package/dist/components/features/settings/integrations-settings-link.d.ts +3 -1
  563. package/dist/components/features/settings/integrations-settings-link.js +20 -17
  564. package/dist/components/features/settings/integrations-settings-link.js.map +1 -1
  565. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.cjs +1 -1
  566. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.js +2 -1
  567. package/dist/components/features/settings/llm-profiles/profiles-body.d.ts +2 -2
  568. package/dist/components/features/settings/llm-profiles/provider-connection-modal.cjs +1 -1
  569. package/dist/components/features/settings/llm-profiles/provider-connection-modal.js +3 -0
  570. package/dist/components/features/settings/sdk-settings/field-help.cjs +1 -1
  571. package/dist/components/features/settings/sdk-settings/field-help.cjs.map +1 -1
  572. package/dist/components/features/settings/sdk-settings/field-help.d.ts +1 -1
  573. package/dist/components/features/settings/sdk-settings/field-help.js +1 -1
  574. package/dist/components/features/settings/sdk-settings/field-help.js.map +1 -1
  575. package/dist/components/features/settings/sdk-settings/sdk-section-page.cjs +1 -1
  576. package/dist/components/features/settings/sdk-settings/sdk-section-page.cjs.map +1 -1
  577. package/dist/components/features/settings/sdk-settings/sdk-section-page.d.ts +8 -7
  578. package/dist/components/features/settings/sdk-settings/sdk-section-page.js +172 -142
  579. package/dist/components/features/settings/sdk-settings/sdk-section-page.js.map +1 -1
  580. package/dist/components/features/settings/secrets-settings/secret-form.cjs +1 -1
  581. package/dist/components/features/settings/secrets-settings/secret-form.cjs.map +1 -1
  582. package/dist/components/features/settings/secrets-settings/secret-form.js +38 -25
  583. package/dist/components/features/settings/secrets-settings/secret-form.js.map +1 -1
  584. package/dist/components/features/settings/settings-dropdown-input.cjs +1 -1
  585. package/dist/components/features/settings/settings-dropdown-input.js +6 -6
  586. package/dist/components/features/sidebar/sidebar-nav-link.cjs +1 -1
  587. package/dist/components/features/sidebar/sidebar-nav-link.cjs.map +1 -1
  588. package/dist/components/features/sidebar/sidebar-nav-link.d.ts +10 -1
  589. package/dist/components/features/sidebar/sidebar-nav-link.js +54 -36
  590. package/dist/components/features/sidebar/sidebar-nav-link.js.map +1 -1
  591. package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
  592. package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
  593. package/dist/components/features/sidebar/sidebar-rail-body.d.ts +3 -1
  594. package/dist/components/features/sidebar/sidebar-rail-body.js +98 -58
  595. package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
  596. package/dist/components/features/sidebar/sidebar.cjs +1 -1
  597. package/dist/components/features/sidebar/sidebar.cjs.map +1 -1
  598. package/dist/components/features/sidebar/sidebar.js +44 -43
  599. package/dist/components/features/sidebar/sidebar.js.map +1 -1
  600. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.cjs +1 -1
  601. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.js +3 -3
  602. package/dist/components/features/skills/build-skill-pills.cjs +1 -1
  603. package/dist/components/features/skills/build-skill-pills.cjs.map +1 -1
  604. package/dist/components/features/skills/build-skill-pills.js +60 -52
  605. package/dist/components/features/skills/build-skill-pills.js.map +1 -1
  606. package/dist/components/features/skills/extensions-navigation.cjs +1 -1
  607. package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
  608. package/dist/components/features/skills/extensions-navigation.js +54 -43
  609. package/dist/components/features/skills/extensions-navigation.js.map +1 -1
  610. package/dist/components/features/skills/skill-filter.cjs +1 -1
  611. package/dist/components/features/skills/skill-filter.cjs.map +1 -1
  612. package/dist/components/features/skills/skill-filter.d.ts +8 -3
  613. package/dist/components/features/skills/skill-filter.js +69 -52
  614. package/dist/components/features/skills/skill-filter.js.map +1 -1
  615. package/dist/components/shared/buttons/styled-tooltip.cjs +1 -1
  616. package/dist/components/shared/buttons/styled-tooltip.cjs.map +1 -1
  617. package/dist/components/shared/buttons/styled-tooltip.d.ts +2 -1
  618. package/dist/components/shared/buttons/styled-tooltip.js +2 -1
  619. package/dist/components/shared/buttons/styled-tooltip.js.map +1 -1
  620. package/dist/components/shared/filters/enum-filter-dropdown.cjs +1 -1
  621. package/dist/components/shared/filters/enum-filter-dropdown.cjs.map +1 -1
  622. package/dist/components/shared/filters/enum-filter-dropdown.d.ts +5 -1
  623. package/dist/components/shared/filters/enum-filter-dropdown.js +14 -14
  624. package/dist/components/shared/filters/enum-filter-dropdown.js.map +1 -1
  625. package/dist/components/shared/modals/confirmation-modal.cjs +1 -1
  626. package/dist/components/shared/modals/confirmation-modal.cjs.map +1 -1
  627. package/dist/components/shared/modals/confirmation-modal.d.ts +2 -1
  628. package/dist/components/shared/modals/confirmation-modal.js +8 -8
  629. package/dist/components/shared/modals/confirmation-modal.js.map +1 -1
  630. package/dist/components/shared/modals/settings/model-selector.cjs +1 -1
  631. package/dist/components/shared/modals/settings/model-selector.js +27 -27
  632. package/dist/components/shared/modals/settings/settings-form.cjs +1 -1
  633. package/dist/components/shared/modals/settings/settings-form.js +8 -8
  634. package/dist/config/defaults.cjs +1 -1
  635. package/dist/config/defaults.cjs.map +1 -1
  636. package/dist/config/defaults.js +9 -5
  637. package/dist/config/defaults.js.map +1 -1
  638. package/dist/constants/settings-nav.d.ts +8 -0
  639. package/dist/contexts/conversation-websocket-context.cjs +3 -3
  640. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  641. package/dist/contexts/conversation-websocket-context.d.ts +5 -0
  642. package/dist/contexts/conversation-websocket-context.js +194 -198
  643. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  644. package/dist/contexts/websocket-provider-wrapper.cjs +1 -1
  645. package/dist/contexts/websocket-provider-wrapper.cjs.map +1 -1
  646. package/dist/contexts/websocket-provider-wrapper.js +31 -15
  647. package/dist/contexts/websocket-provider-wrapper.js.map +1 -1
  648. package/dist/extensions/canvas-extension-module-loader.d.ts +11 -0
  649. package/dist/hooks/chat/record-model-switch-message.cjs +1 -1
  650. package/dist/hooks/chat/record-model-switch-message.cjs.map +1 -1
  651. package/dist/hooks/chat/record-model-switch-message.d.ts +31 -0
  652. package/dist/hooks/chat/record-model-switch-message.js +25 -12
  653. package/dist/hooks/chat/record-model-switch-message.js.map +1 -1
  654. package/dist/hooks/chat/use-plan-mode-interceptor.cjs +2 -0
  655. package/dist/hooks/chat/use-plan-mode-interceptor.cjs.map +1 -0
  656. package/dist/hooks/chat/use-plan-mode-interceptor.d.ts +16 -0
  657. package/dist/hooks/chat/use-plan-mode-interceptor.js +43 -0
  658. package/dist/hooks/chat/use-plan-mode-interceptor.js.map +1 -0
  659. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  660. package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
  661. package/dist/hooks/mutation/use-create-conversation.js +5 -1
  662. package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
  663. package/dist/hooks/mutation/use-manage-canvas-extensions.d.ts +12 -0
  664. package/dist/hooks/mutation/use-read-conversation-file.cjs +1 -1
  665. package/dist/hooks/mutation/use-read-conversation-file.cjs.map +1 -1
  666. package/dist/hooks/mutation/use-read-conversation-file.js +11 -4
  667. package/dist/hooks/mutation/use-read-conversation-file.js.map +1 -1
  668. package/dist/hooks/mutation/use-save-settings.cjs +1 -1
  669. package/dist/hooks/mutation/use-save-settings.js +3 -3
  670. package/dist/hooks/mutation/use-switch-llm-profile.cjs +1 -1
  671. package/dist/hooks/mutation/use-switch-llm-profile.cjs.map +1 -1
  672. package/dist/hooks/mutation/use-switch-llm-profile.js +13 -25
  673. package/dist/hooks/mutation/use-switch-llm-profile.js.map +1 -1
  674. package/dist/hooks/mutation/use-update-conversation-tags.cjs +2 -0
  675. package/dist/hooks/mutation/use-update-conversation-tags.cjs.map +1 -0
  676. package/dist/hooks/mutation/use-update-conversation-tags.d.ts +8 -0
  677. package/dist/hooks/mutation/use-update-conversation-tags.js +45 -0
  678. package/dist/hooks/mutation/use-update-conversation-tags.js.map +1 -0
  679. package/dist/hooks/query/concurrency-limiter.cjs +2 -0
  680. package/dist/hooks/query/concurrency-limiter.cjs.map +1 -0
  681. package/dist/hooks/query/concurrency-limiter.d.ts +22 -0
  682. package/dist/hooks/query/concurrency-limiter.js +29 -0
  683. package/dist/hooks/query/concurrency-limiter.js.map +1 -0
  684. package/dist/hooks/query/query-keys.cjs +1 -1
  685. package/dist/hooks/query/query-keys.cjs.map +1 -1
  686. package/dist/hooks/query/query-keys.d.ts +10 -0
  687. package/dist/hooks/query/query-keys.js +2 -2
  688. package/dist/hooks/query/query-keys.js.map +1 -1
  689. package/dist/hooks/query/use-active-conversation.cjs +1 -1
  690. package/dist/hooks/query/use-active-conversation.js +4 -4
  691. package/dist/hooks/query/use-automation-sdk-version.cjs +1 -1
  692. package/dist/hooks/query/use-automation-sdk-version.cjs.map +1 -1
  693. package/dist/hooks/query/use-automation-sdk-version.d.ts +0 -1
  694. package/dist/hooks/query/use-automation-sdk-version.js +30 -55
  695. package/dist/hooks/query/use-automation-sdk-version.js.map +1 -1
  696. package/dist/hooks/query/use-automations.cjs.map +1 -1
  697. package/dist/hooks/query/use-automations.js.map +1 -1
  698. package/dist/hooks/query/use-backends-health.cjs +1 -1
  699. package/dist/hooks/query/use-backends-health.cjs.map +1 -1
  700. package/dist/hooks/query/use-backends-health.d.ts +1 -1
  701. package/dist/hooks/query/use-backends-health.js +50 -64
  702. package/dist/hooks/query/use-backends-health.js.map +1 -1
  703. package/dist/hooks/query/use-canvas-extensions.cjs +1 -0
  704. package/dist/hooks/query/use-canvas-extensions.d.ts +5 -0
  705. package/dist/hooks/query/use-canvas-extensions.js +3 -0
  706. package/dist/hooks/query/use-commit-changes.cjs +1 -1
  707. package/dist/hooks/query/use-commit-changes.js +4 -4
  708. package/dist/hooks/query/use-conversation-skills.cjs +1 -1
  709. package/dist/hooks/query/use-conversation-skills.cjs.map +1 -1
  710. package/dist/hooks/query/use-conversation-skills.d.ts +14 -5
  711. package/dist/hooks/query/use-conversation-skills.js +20 -4
  712. package/dist/hooks/query/use-conversation-skills.js.map +1 -1
  713. package/dist/hooks/query/use-latest-automation-runs.cjs +1 -1
  714. package/dist/hooks/query/use-latest-automation-runs.js +1 -0
  715. package/dist/hooks/query/use-paginated-conversations.cjs +1 -1
  716. package/dist/hooks/query/use-paginated-conversations.cjs.map +1 -1
  717. package/dist/hooks/query/use-paginated-conversations.js +19 -16
  718. package/dist/hooks/query/use-paginated-conversations.js.map +1 -1
  719. package/dist/hooks/query/use-provider-connections.cjs +1 -1
  720. package/dist/hooks/query/use-provider-connections.cjs.map +1 -1
  721. package/dist/hooks/query/use-provider-connections.d.ts +6 -3
  722. package/dist/hooks/query/use-provider-connections.js +7 -3
  723. package/dist/hooks/query/use-provider-connections.js.map +1 -1
  724. package/dist/hooks/query/use-search-providers.cjs +1 -1
  725. package/dist/hooks/query/use-search-providers.cjs.map +1 -1
  726. package/dist/hooks/query/use-search-providers.js +17 -10
  727. package/dist/hooks/query/use-search-providers.js.map +1 -1
  728. package/dist/hooks/query/use-sub-conversations.cjs +1 -1
  729. package/dist/hooks/query/use-sub-conversations.cjs.map +1 -1
  730. package/dist/hooks/query/use-sub-conversations.js +16 -16
  731. package/dist/hooks/query/use-sub-conversations.js.map +1 -1
  732. package/dist/hooks/query/use-unified-get-git-changes.cjs +1 -1
  733. package/dist/hooks/query/use-unified-get-git-changes.js +4 -4
  734. package/dist/hooks/query/use-unified-git-commits.cjs +1 -1
  735. package/dist/hooks/query/use-unified-git-commits.js +4 -4
  736. package/dist/hooks/query/use-unified-git-diff.cjs +1 -1
  737. package/dist/hooks/query/use-unified-git-diff.js +4 -4
  738. package/dist/hooks/query/use-unified-vscode-url.cjs +1 -1
  739. package/dist/hooks/query/use-unified-vscode-url.cjs.map +1 -1
  740. package/dist/hooks/query/use-unified-vscode-url.d.ts +1 -0
  741. package/dist/hooks/query/use-unified-vscode-url.js +40 -26
  742. package/dist/hooks/query/use-unified-vscode-url.js.map +1 -1
  743. package/dist/hooks/query/use-workspace-file-content.cjs +1 -1
  744. package/dist/hooks/query/use-workspace-file-content.js +5 -5
  745. package/dist/hooks/query/use-workspace-files.cjs +1 -1
  746. package/dist/hooks/query/use-workspace-files.js +6 -6
  747. package/dist/hooks/use-acp-credential-form.d.ts +6 -0
  748. package/dist/hooks/use-acp-model-context.cjs +1 -1
  749. package/dist/hooks/use-acp-model-context.js +3 -3
  750. package/dist/hooks/use-agent-state.cjs +1 -1
  751. package/dist/hooks/use-agent-state.cjs.map +1 -1
  752. package/dist/hooks/use-agent-state.d.ts +17 -1
  753. package/dist/hooks/use-agent-state.js +19 -9
  754. package/dist/hooks/use-agent-state.js.map +1 -1
  755. package/dist/hooks/use-automation-permissions.cjs +2 -0
  756. package/dist/hooks/use-automation-permissions.cjs.map +1 -0
  757. package/dist/hooks/use-automation-permissions.d.ts +43 -0
  758. package/dist/hooks/use-automation-permissions.js +52 -0
  759. package/dist/hooks/use-automation-permissions.js.map +1 -0
  760. package/dist/hooks/use-chat-input-model-state.cjs +1 -1
  761. package/dist/hooks/use-chat-input-model-state.js +3 -3
  762. package/dist/hooks/use-conversation-overview-git-diff-stats.cjs +1 -1
  763. package/dist/hooks/use-conversation-overview-git-diff-stats.js +4 -4
  764. package/dist/hooks/use-handle-plan-click.cjs +1 -1
  765. package/dist/hooks/use-handle-plan-click.cjs.map +1 -1
  766. package/dist/hooks/use-handle-plan-click.d.ts +3 -1
  767. package/dist/hooks/use-handle-plan-click.js +85 -26
  768. package/dist/hooks/use-handle-plan-click.js.map +1 -1
  769. package/dist/hooks/use-home-automation-actions.cjs +1 -1
  770. package/dist/hooks/use-home-automation-actions.cjs.map +1 -1
  771. package/dist/hooks/use-home-automation-actions.js +1 -0
  772. package/dist/hooks/use-home-automation-actions.js.map +1 -1
  773. package/dist/hooks/use-llm-configured.cjs +1 -1
  774. package/dist/hooks/use-llm-configured.js +3 -3
  775. package/dist/hooks/use-manifest-preflight.d.ts +1 -1
  776. package/dist/hooks/use-pinned-home-route.cjs +2 -0
  777. package/dist/hooks/use-pinned-home-route.cjs.map +1 -0
  778. package/dist/hooks/use-pinned-home-route.d.ts +33 -0
  779. package/dist/hooks/use-pinned-home-route.js +34 -0
  780. package/dist/hooks/use-pinned-home-route.js.map +1 -0
  781. package/dist/hooks/use-skill-enablement.cjs +2 -0
  782. package/dist/hooks/use-skill-enablement.cjs.map +1 -0
  783. package/dist/hooks/use-skill-enablement.d.ts +14 -0
  784. package/dist/hooks/use-skill-enablement.js +80 -0
  785. package/dist/hooks/use-skill-enablement.js.map +1 -0
  786. package/dist/hooks/use-unified-websocket-status.cjs +1 -1
  787. package/dist/hooks/use-unified-websocket-status.cjs.map +1 -1
  788. package/dist/hooks/use-unified-websocket-status.d.ts +7 -0
  789. package/dist/hooks/use-unified-websocket-status.js +5 -1
  790. package/dist/hooks/use-unified-websocket-status.js.map +1 -1
  791. package/dist/i18n/declaration.cjs +1 -1
  792. package/dist/i18n/declaration.cjs.map +1 -1
  793. package/dist/i18n/declaration.d.ts +83 -14
  794. package/dist/i18n/declaration.js +1 -1
  795. package/dist/i18n/declaration.js.map +1 -1
  796. package/dist/i18n/translation.cjs +3 -3
  797. package/dist/i18n/translation.cjs.map +1 -1
  798. package/dist/i18n/translation.js +1575 -402
  799. package/dist/i18n/translation.js.map +1 -1
  800. package/dist/index.cjs +1 -1
  801. package/dist/index.js +15 -14
  802. package/dist/lib/index.cjs +1 -1
  803. package/dist/lib/index.d.ts +1 -0
  804. package/dist/lib/index.js +1 -0
  805. package/dist/locales/ar/openhands.json +94 -25
  806. package/dist/locales/ca/openhands.json +94 -25
  807. package/dist/locales/de/openhands.json +94 -25
  808. package/dist/locales/en/openhands.json +94 -25
  809. package/dist/locales/es/openhands.json +94 -25
  810. package/dist/locales/fr/openhands.json +94 -25
  811. package/dist/locales/it/openhands.json +94 -25
  812. package/dist/locales/ja/openhands.json +94 -25
  813. package/dist/locales/ko-KR/openhands.json +94 -25
  814. package/dist/locales/no/openhands.json +94 -25
  815. package/dist/locales/pt/openhands.json +94 -25
  816. package/dist/locales/tr/openhands.json +94 -25
  817. package/dist/locales/uk/openhands.json +94 -25
  818. package/dist/locales/zh-CN/openhands.json +94 -25
  819. package/dist/locales/zh-TW/openhands.json +94 -25
  820. package/dist/manifests/automation-insights.cjs.map +1 -1
  821. package/dist/manifests/automation-insights.d.ts +10 -2
  822. package/dist/manifests/automation-insights.js.map +1 -1
  823. package/dist/manifests/automation-interface.cjs +1 -1
  824. package/dist/manifests/automation-interface.cjs.map +1 -1
  825. package/dist/manifests/automation-interface.d.ts +6 -0
  826. package/dist/manifests/automation-interface.js +11 -8
  827. package/dist/manifests/automation-interface.js.map +1 -1
  828. package/dist/manifests/automation-setup.cjs +1 -1
  829. package/dist/manifests/automation-setup.cjs.map +1 -1
  830. package/dist/manifests/automation-setup.d.ts +9 -16
  831. package/dist/manifests/automation-setup.js +17 -7
  832. package/dist/manifests/automation-setup.js.map +1 -1
  833. package/dist/manifests/manifest-actions.d.ts +1 -1
  834. package/dist/manifests/manifest-capabilities.d.ts +3 -1
  835. package/dist/manifests/manifest-local-validation.cjs +2 -0
  836. package/dist/manifests/manifest-local-validation.cjs.map +1 -0
  837. package/dist/manifests/manifest-local-validation.d.ts +15 -11
  838. package/dist/manifests/manifest-local-validation.js +8 -0
  839. package/dist/manifests/manifest-local-validation.js.map +1 -0
  840. package/dist/manifests/manifest-template.cjs +2 -0
  841. package/dist/manifests/manifest-template.cjs.map +1 -0
  842. package/dist/manifests/manifest-template.d.ts +4 -4
  843. package/dist/manifests/manifest-template.js +12 -0
  844. package/dist/manifests/manifest-template.js.map +1 -0
  845. package/dist/manifests/manifest-validation.cjs +1 -1
  846. package/dist/manifests/manifest-validation.cjs.map +1 -1
  847. package/dist/manifests/manifest-validation.js +106 -28
  848. package/dist/manifests/manifest-validation.js.map +1 -1
  849. package/dist/manifests/types.cjs.map +1 -1
  850. package/dist/manifests/types.d.ts +39 -4
  851. package/dist/manifests/types.js.map +1 -1
  852. package/dist/node_modules/@openhands/extensions/automations/bundle-index.cjs +45 -4
  853. package/dist/node_modules/@openhands/extensions/automations/bundle-index.cjs.map +1 -1
  854. package/dist/node_modules/@openhands/extensions/automations/bundle-index.js +1 -1
  855. package/dist/node_modules/@openhands/extensions/automations/bundle-index.js.map +1 -1
  856. package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.cjs +8 -0
  857. package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.cjs.map +1 -0
  858. package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.js +221 -0
  859. package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.js.map +1 -0
  860. package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.cjs +1 -1
  861. package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.cjs.map +1 -1
  862. package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.js +5 -0
  863. package/dist/node_modules/@openhands/extensions/automations/catalog/github-agents-md-maintainer/manifest.js.map +1 -1
  864. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs +2 -2
  865. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs.map +1 -1
  866. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js +6 -1
  867. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js.map +1 -1
  868. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs +2 -2
  869. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs.map +1 -1
  870. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js +6 -1
  871. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js.map +1 -1
  872. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.cjs +1 -1
  873. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.cjs.map +1 -1
  874. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.js +5 -0
  875. package/dist/node_modules/@openhands/extensions/automations/catalog/github-repo-monitor/manifest.js.map +1 -1
  876. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-bitbucket-pr/manifest.cjs +9 -0
  877. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-bitbucket-pr/manifest.cjs.map +1 -0
  878. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-bitbucket-pr/manifest.js +21 -0
  879. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-bitbucket-pr/manifest.js.map +1 -0
  880. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-gitlab-mr/manifest.cjs +9 -0
  881. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-gitlab-mr/manifest.cjs.map +1 -0
  882. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-gitlab-mr/manifest.js +21 -0
  883. package/dist/node_modules/@openhands/extensions/automations/catalog/jira-issue-to-gitlab-mr/manifest.js.map +1 -0
  884. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-bitbucket-pr/manifest.cjs +9 -0
  885. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-bitbucket-pr/manifest.cjs.map +1 -0
  886. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-bitbucket-pr/manifest.js +21 -0
  887. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-bitbucket-pr/manifest.js.map +1 -0
  888. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-github-pr/manifest.cjs +9 -0
  889. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-github-pr/manifest.cjs.map +1 -0
  890. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-github-pr/manifest.js +21 -0
  891. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-github-pr/manifest.js.map +1 -0
  892. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-gitlab-mr/manifest.cjs +9 -0
  893. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-gitlab-mr/manifest.cjs.map +1 -0
  894. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-gitlab-mr/manifest.js +21 -0
  895. package/dist/node_modules/@openhands/extensions/automations/catalog/linear-issue-to-gitlab-mr/manifest.js.map +1 -0
  896. package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.cjs +1 -1
  897. package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.cjs.map +1 -1
  898. package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.js +5 -0
  899. package/dist/node_modules/@openhands/extensions/automations/catalog/news-digest/manifest.js.map +1 -1
  900. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.cjs +30 -0
  901. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.cjs.map +1 -0
  902. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.js +65 -0
  903. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.js.map +1 -0
  904. package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs +1 -1
  905. package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs.map +1 -1
  906. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js +28 -14
  907. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js.map +1 -1
  908. package/dist/node_modules/@openhands/extensions/automations/interface.cjs +1 -1
  909. package/dist/node_modules/@openhands/extensions/automations/interface.cjs.map +1 -1
  910. package/dist/node_modules/@openhands/extensions/automations/interface.js +2 -1
  911. package/dist/node_modules/@openhands/extensions/automations/interface.js.map +1 -1
  912. package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.cjs +1 -1
  913. package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.cjs.map +1 -1
  914. package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.js +2 -2
  915. package/dist/node_modules/@openhands/extensions/integrations/catalog/datadog.js.map +1 -1
  916. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs +2 -0
  917. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs.map +1 -0
  918. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js +59 -0
  919. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js.map +1 -0
  920. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.cjs +1 -1
  921. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.cjs.map +1 -1
  922. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.js +1 -1
  923. package/dist/node_modules/@openhands/extensions/integrations/catalog/notion.js.map +1 -1
  924. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs +1 -1
  925. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.cjs.map +1 -1
  926. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js +74 -72
  927. package/dist/node_modules/@openhands/extensions/integrations/catalog-index.js.map +1 -1
  928. package/dist/node_modules/@openhands/extensions/skills/index.cjs +42 -3
  929. package/dist/node_modules/@openhands/extensions/skills/index.cjs.map +1 -1
  930. package/dist/node_modules/@openhands/extensions/skills/index.js +22 -3
  931. package/dist/node_modules/@openhands/extensions/skills/index.js.map +1 -1
  932. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-conversation.cjs +1 -1
  933. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-conversation.js +1 -1
  934. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.cjs +1 -1
  935. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.cjs.map +1 -1
  936. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.js +8 -7
  937. package/dist/node_modules/@openhands/typescript-client/dist/conversation/remote-state.js.map +1 -1
  938. package/dist/node_modules/@openhands/typescript-client/dist/index.cjs +1 -1
  939. package/dist/node_modules/@openhands/typescript-client/dist/index.js +2 -2
  940. package/dist/node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs +1 -1
  941. package/dist/node_modules/@tanstack/react-query/build/modern/QueryClientProvider.js +1 -1
  942. package/dist/node_modules/lucide-react/dist/esm/icons/blocks.cjs +2 -0
  943. package/dist/node_modules/lucide-react/dist/esm/icons/blocks.cjs.map +1 -0
  944. package/dist/node_modules/lucide-react/dist/esm/icons/blocks.js +16 -0
  945. package/dist/node_modules/lucide-react/dist/esm/icons/blocks.js.map +1 -0
  946. package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.cjs +2 -0
  947. package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.cjs.map +1 -0
  948. package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.js +21 -0
  949. package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.js.map +1 -0
  950. package/dist/node_modules/lucide-react/dist/esm/icons/panels-top-left.cjs +2 -0
  951. package/dist/node_modules/lucide-react/dist/esm/icons/panels-top-left.cjs.map +1 -0
  952. package/dist/node_modules/lucide-react/dist/esm/icons/panels-top-left.js +23 -0
  953. package/dist/node_modules/lucide-react/dist/esm/icons/panels-top-left.js.map +1 -0
  954. package/dist/node_modules/lucide-react/dist/esm/icons/shrink.cjs +2 -0
  955. package/dist/node_modules/lucide-react/dist/esm/icons/shrink.cjs.map +1 -0
  956. package/dist/node_modules/lucide-react/dist/esm/icons/shrink.js +23 -0
  957. package/dist/node_modules/lucide-react/dist/esm/icons/shrink.js.map +1 -0
  958. package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.cjs +2 -0
  959. package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.cjs.map +1 -0
  960. package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.js +43 -0
  961. package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.js.map +1 -0
  962. package/dist/node_modules/lucide-react/dist/esm/icons/tags.cjs +2 -0
  963. package/dist/node_modules/lucide-react/dist/esm/icons/tags.cjs.map +1 -0
  964. package/dist/node_modules/lucide-react/dist/esm/icons/tags.js +22 -0
  965. package/dist/node_modules/lucide-react/dist/esm/icons/tags.js.map +1 -0
  966. package/dist/package.cjs +1 -1
  967. package/dist/package.cjs.map +1 -1
  968. package/dist/package.js +5 -5
  969. package/dist/package.js.map +1 -1
  970. package/dist/routes/agent-settings.d.ts +12 -0
  971. package/dist/routes/app-settings.cjs +1 -1
  972. package/dist/routes/app-settings.cjs.map +1 -1
  973. package/dist/routes/app-settings.js +11 -11
  974. package/dist/routes/files-tab.cjs +1 -1
  975. package/dist/routes/files-tab.cjs.map +1 -1
  976. package/dist/routes/files-tab.js +14 -14
  977. package/dist/routes/files-tab.js.map +1 -1
  978. package/dist/routes/llm-settings.cjs +1 -1
  979. package/dist/routes/llm-settings.cjs.map +1 -1
  980. package/dist/routes/llm-settings.d.ts +3 -1
  981. package/dist/routes/llm-settings.js +100 -91
  982. package/dist/routes/llm-settings.js.map +1 -1
  983. package/dist/routes/planner-tab.cjs +1 -1
  984. package/dist/routes/planner-tab.cjs.map +1 -1
  985. package/dist/routes/planner-tab.js +44 -28
  986. package/dist/routes/planner-tab.js.map +1 -1
  987. package/dist/services/canvas-ui.cjs +1 -1
  988. package/dist/services/canvas-ui.cjs.map +1 -1
  989. package/dist/services/canvas-ui.d.ts +5 -0
  990. package/dist/services/canvas-ui.js +24 -10
  991. package/dist/services/canvas-ui.js.map +1 -1
  992. package/dist/services/settings.cjs +1 -1
  993. package/dist/services/settings.cjs.map +1 -1
  994. package/dist/services/settings.js +3 -2
  995. package/dist/services/settings.js.map +1 -1
  996. package/dist/services/telemetry.cjs +1 -1
  997. package/dist/services/telemetry.cjs.map +1 -1
  998. package/dist/services/telemetry.d.ts +5 -0
  999. package/dist/services/telemetry.js +122 -115
  1000. package/dist/services/telemetry.js.map +1 -1
  1001. package/dist/stores/conversation-panel-preferences-store.cjs +1 -1
  1002. package/dist/stores/conversation-panel-preferences-store.cjs.map +1 -1
  1003. package/dist/stores/conversation-panel-preferences-store.d.ts +32 -5
  1004. package/dist/stores/conversation-panel-preferences-store.js +29 -12
  1005. package/dist/stores/conversation-panel-preferences-store.js.map +1 -1
  1006. package/dist/stores/conversation-state-store.cjs +1 -1
  1007. package/dist/stores/conversation-state-store.cjs.map +1 -1
  1008. package/dist/stores/conversation-state-store.d.ts +9 -3
  1009. package/dist/stores/conversation-state-store.js +6 -3
  1010. package/dist/stores/conversation-state-store.js.map +1 -1
  1011. package/dist/stores/conversation-store.cjs +1 -1
  1012. package/dist/stores/conversation-store.cjs.map +1 -1
  1013. package/dist/stores/conversation-store.d.ts +2 -0
  1014. package/dist/stores/conversation-store.js +3 -0
  1015. package/dist/stores/conversation-store.js.map +1 -1
  1016. package/dist/stores/model-store.cjs +1 -1
  1017. package/dist/stores/model-store.cjs.map +1 -1
  1018. package/dist/stores/model-store.d.ts +7 -0
  1019. package/dist/stores/model-store.js +4 -0
  1020. package/dist/stores/model-store.js.map +1 -1
  1021. package/dist/types/automation.cjs.map +1 -1
  1022. package/dist/types/automation.d.ts +66 -1
  1023. package/dist/types/automation.js.map +1 -1
  1024. package/dist/types/canvas-extension.cjs +2 -0
  1025. package/dist/types/canvas-extension.cjs.map +1 -0
  1026. package/dist/types/canvas-extension.d.ts +77 -0
  1027. package/dist/types/canvas-extension.js +6 -0
  1028. package/dist/types/canvas-extension.js.map +1 -0
  1029. package/dist/types/settings.d.ts +7 -0
  1030. package/dist/ui/context-menu.d.ts +1 -1
  1031. package/dist/ui/help-link.cjs +1 -1
  1032. package/dist/ui/help-link.cjs.map +1 -1
  1033. package/dist/ui/help-link.d.ts +6 -1
  1034. package/dist/ui/help-link.js +32 -18
  1035. package/dist/ui/help-link.js.map +1 -1
  1036. package/dist/ui/toggle-switch.cjs +1 -1
  1037. package/dist/ui/toggle-switch.cjs.map +1 -1
  1038. package/dist/ui/toggle-switch.d.ts +4 -1
  1039. package/dist/ui/toggle-switch.js +4 -3
  1040. package/dist/ui/toggle-switch.js.map +1 -1
  1041. package/dist/utils/acp-auth-display.d.ts +35 -0
  1042. package/dist/utils/automation-catalog.cjs +1 -1
  1043. package/dist/utils/automation-catalog.cjs.map +1 -1
  1044. package/dist/utils/automation-catalog.d.ts +12 -1
  1045. package/dist/utils/automation-catalog.js +42 -12
  1046. package/dist/utils/automation-catalog.js.map +1 -1
  1047. package/dist/utils/automation-run-display.cjs +2 -0
  1048. package/dist/utils/automation-run-display.cjs.map +1 -0
  1049. package/dist/utils/automation-run-display.d.ts +20 -0
  1050. package/dist/utils/automation-run-display.js +85 -0
  1051. package/dist/utils/automation-run-display.js.map +1 -0
  1052. package/dist/utils/automation-schedule.cjs +1 -1
  1053. package/dist/utils/automation-schedule.cjs.map +1 -1
  1054. package/dist/utils/automation-schedule.d.ts +16 -0
  1055. package/dist/utils/automation-schedule.js +2 -0
  1056. package/dist/utils/automation-schedule.js.map +1 -1
  1057. package/dist/utils/cache-utils.cjs +1 -1
  1058. package/dist/utils/cache-utils.js +5 -5
  1059. package/dist/utils/constants.cjs +1 -1
  1060. package/dist/utils/constants.cjs.map +1 -1
  1061. package/dist/utils/constants.d.ts +4 -0
  1062. package/dist/utils/constants.js +23 -3
  1063. package/dist/utils/constants.js.map +1 -1
  1064. package/dist/utils/format-event-timestamp.cjs +2 -0
  1065. package/dist/utils/format-event-timestamp.cjs.map +1 -0
  1066. package/dist/utils/format-event-timestamp.d.ts +1 -0
  1067. package/dist/utils/format-event-timestamp.js +13 -0
  1068. package/dist/utils/format-event-timestamp.js.map +1 -0
  1069. package/dist/utils/format-model-name.cjs +1 -1
  1070. package/dist/utils/format-model-name.cjs.map +1 -1
  1071. package/dist/utils/format-model-name.d.ts +7 -3
  1072. package/dist/utils/format-model-name.js +6 -11
  1073. package/dist/utils/format-model-name.js.map +1 -1
  1074. package/dist/utils/format-relative-time.cjs +1 -1
  1075. package/dist/utils/format-relative-time.cjs.map +1 -1
  1076. package/dist/utils/format-relative-time.d.ts +7 -0
  1077. package/dist/utils/format-relative-time.js +7 -2
  1078. package/dist/utils/format-relative-time.js.map +1 -1
  1079. package/dist/utils/git-diff-stats.cjs +2 -2
  1080. package/dist/utils/git-diff-stats.cjs.map +1 -1
  1081. package/dist/utils/git-diff-stats.d.ts +4 -0
  1082. package/dist/utils/git-diff-stats.js +12 -2
  1083. package/dist/utils/git-diff-stats.js.map +1 -1
  1084. package/dist/utils/path-utils.cjs +1 -1
  1085. package/dist/utils/path-utils.cjs.map +1 -1
  1086. package/dist/utils/path-utils.d.ts +15 -3
  1087. package/dist/utils/path-utils.js +29 -3
  1088. package/dist/utils/path-utils.js.map +1 -1
  1089. package/dist/utils/plan-file.cjs +4 -0
  1090. package/dist/utils/plan-file.cjs.map +1 -0
  1091. package/dist/utils/plan-file.d.ts +18 -0
  1092. package/dist/utils/plan-file.js +58 -0
  1093. package/dist/utils/plan-file.js.map +1 -0
  1094. package/dist/utils/recommended-automation-rail.cjs +1 -1
  1095. package/dist/utils/recommended-automation-rail.cjs.map +1 -1
  1096. package/dist/utils/recommended-automation-rail.js +1 -0
  1097. package/dist/utils/recommended-automation-rail.js.map +1 -1
  1098. package/dist/utils/scroll-fade-state.cjs +1 -1
  1099. package/dist/utils/scroll-fade-state.cjs.map +1 -1
  1100. package/dist/utils/scroll-fade-state.d.ts +6 -0
  1101. package/dist/utils/scroll-fade-state.js +8 -1
  1102. package/dist/utils/scroll-fade-state.js.map +1 -1
  1103. package/dist/utils/sdk-settings-schema.cjs +1 -1
  1104. package/dist/utils/sdk-settings-schema.cjs.map +1 -1
  1105. package/dist/utils/sdk-settings-schema.d.ts +1 -0
  1106. package/dist/utils/sdk-settings-schema.js +25 -22
  1107. package/dist/utils/sdk-settings-schema.js.map +1 -1
  1108. package/dist/utils/skill-enablement.cjs +2 -0
  1109. package/dist/utils/skill-enablement.cjs.map +1 -0
  1110. package/dist/utils/skill-enablement.d.ts +51 -0
  1111. package/dist/utils/skill-enablement.js +31 -0
  1112. package/dist/utils/skill-enablement.js.map +1 -0
  1113. package/dist/utils/utils.cjs +1 -1
  1114. package/dist/utils/utils.cjs.map +1 -1
  1115. package/dist/utils/utils.js +11 -11
  1116. package/dist/utils/utils.js.map +1 -1
  1117. package/dist/utils/vscode-origin.cjs +2 -0
  1118. package/dist/utils/vscode-origin.cjs.map +1 -0
  1119. package/dist/utils/vscode-origin.d.ts +55 -0
  1120. package/dist/utils/vscode-origin.js +27 -0
  1121. package/dist/utils/vscode-origin.js.map +1 -0
  1122. package/dist/utils/workspace-mode.d.ts +4 -0
  1123. package/package.json +5 -5
  1124. package/scripts/check-sdk-version-sync.mjs +6 -6
  1125. package/scripts/check-translation-completeness.cjs +1 -0
  1126. package/scripts/dev-extra-backend.mjs +28 -9
  1127. package/scripts/dev-safe.mjs +81 -8
  1128. package/scripts/dev-static.mjs +35 -37
  1129. package/scripts/dev-with-automation.mjs +83 -2
  1130. package/scripts/ingress.mjs +27 -1
  1131. package/scripts/static-server.mjs +107 -2
  1132. package/tools/canvas_ui_tool.py +19 -0
  1133. package/build/assets/active-backend-context-DKFSMbn3.js +0 -2
  1134. package/build/assets/agent-profiles-settings-D4cY5U2T.js +0 -1
  1135. package/build/assets/agent-server-conversation-service.api-DozDKIW_.js +0 -86
  1136. package/build/assets/agent-settings-351vXWc9.js +0 -2
  1137. package/build/assets/agent-settings-Ce7BDZ6I.js +0 -1
  1138. package/build/assets/alert-banner-Kyy1YWZU.js +0 -1
  1139. package/build/assets/api-key-entry-screen-INIxqAMs.js +0 -1
  1140. package/build/assets/automation-detail-DXDhUwPq.js +0 -3
  1141. package/build/assets/automation-git-sync-CzyS4cn1.js +0 -1
  1142. package/build/assets/automation-setup-route-FRr05f_g.js +0 -1
  1143. package/build/assets/automations-list-CERuQWE6.js +0 -1
  1144. package/build/assets/backend-form-modal-DK78-jn1.js +0 -1
  1145. package/build/assets/bot-C-0Wu7vQ.js +0 -1
  1146. package/build/assets/browser-11etCQ04.js +0 -7
  1147. package/build/assets/check-Cf2YoT90.js +0 -1
  1148. package/build/assets/chevron-down-C3OQ-ehx.js +0 -1
  1149. package/build/assets/chevron-right-CN1uUiJ1.js +0 -1
  1150. package/build/assets/circle-check-g5yeGMd-.js +0 -1
  1151. package/build/assets/command-menu-BZQ8S3Ke.js +0 -1
  1152. package/build/assets/commits-tab-DZtJgaDM.js +0 -1
  1153. package/build/assets/confirmation-modal-Bk4JRcCM.js +0 -1
  1154. package/build/assets/conversation-CchMzpGl.js +0 -1
  1155. package/build/assets/conversation-Dpzftz57.js +0 -93
  1156. package/build/assets/conversation-panel-CchMzpGl.js +0 -1
  1157. package/build/assets/conversation-state-store-a9d2fxRc.js +0 -1
  1158. package/build/assets/edit-automation-modal-D-urtv8n.js +0 -1
  1159. package/build/assets/empty-state-CvaVahVr.js +0 -1
  1160. package/build/assets/enum-filter-dropdown-DliX_Lo0.js +0 -1
  1161. package/build/assets/extensions-hub-CFduxBnk.js +0 -1
  1162. package/build/assets/extensions-navigation-BeC224yX.js +0 -1
  1163. package/build/assets/external-link-DFpYunfj.js +0 -1
  1164. package/build/assets/files-tab-CL3J9b3p.js +0 -1
  1165. package/build/assets/format-model-name-BNPKVsIq.js +0 -1
  1166. package/build/assets/get-git-path-DlAJa_i6.js +0 -1
  1167. package/build/assets/git-repo-dropdown-DGMEhz7d.js +0 -1
  1168. package/build/assets/home-BCGlNJCA.js +0 -1
  1169. package/build/assets/home-DB1pRqTC.js +0 -1
  1170. package/build/assets/home-automation-run-tooltip-CooFQRIG.js +0 -1
  1171. package/build/assets/home-store-Dl1dPE58.js +0 -1
  1172. package/build/assets/index-home-DB1pRqTC.js +0 -1
  1173. package/build/assets/info-uYSVzX86.js +0 -1
  1174. package/build/assets/install-server-modal-BbJdhzet.js +0 -1
  1175. package/build/assets/kebab-menu-item-content-BYokkRHi.js +0 -1
  1176. package/build/assets/list-filter-OFkpRrmi.js +0 -1
  1177. package/build/assets/llm-not-configured-banner-BqqYnJ1t.js +0 -27
  1178. package/build/assets/llm-settings-CnDbbmVW.js +0 -1
  1179. package/build/assets/llm-settings-S8Yjg__1.js +0 -1
  1180. package/build/assets/llm-subscription-service-BpPfzW4x.js +0 -1
  1181. package/build/assets/loader-circle-nvrwthvj.js +0 -1
  1182. package/build/assets/manage-backends-modal-BCUPswyl.js +0 -1
  1183. package/build/assets/manifest-58597dde.js +0 -1
  1184. package/build/assets/markdown-renderer-Cb2sBWtV.js +0 -8
  1185. package/build/assets/mcp-page-Bm4K2NQq.js +0 -9
  1186. package/build/assets/messages-BTN5thLe.js +0 -40
  1187. package/build/assets/onboarding-Cx_kaiD1.js +0 -1
  1188. package/build/assets/onboarding-modal-vMwn7ihv.js +0 -1
  1189. package/build/assets/organization-service.api-C8XpQ0pM.js +0 -1
  1190. package/build/assets/pencil-Clh1Wjvh.js +0 -1
  1191. package/build/assets/planner-tab-DQvDU3ap.js +0 -1
  1192. package/build/assets/plug-BuQhHSSG.js +0 -1
  1193. package/build/assets/plugins-management-service-BjYeF0b0.js +0 -1
  1194. package/build/assets/plus-CEKne-Yp.js +0 -1
  1195. package/build/assets/profiles-service.api-QB-T_u-g.js +0 -1
  1196. package/build/assets/providers-FfSZ5TXP.js +0 -1
  1197. package/build/assets/proxy-tcFL2yTQ.js +0 -1
  1198. package/build/assets/recommended-automations-launcher-Bw8uC4V6.js +0 -1
  1199. package/build/assets/refresh-cw-Bh69DyYO.js +0 -1
  1200. package/build/assets/root-BLeQfBEq.css +0 -1
  1201. package/build/assets/root-ZKKYPR1Z.js +0 -2
  1202. package/build/assets/root-layout-luJoE9IG.js +0 -2
  1203. package/build/assets/schema-field-Csw5fhtN.js +0 -1
  1204. package/build/assets/scroll-fade-state-Dw-i4SGq.js +0 -1
  1205. package/build/assets/sdk-section-page-HTffvm7Q.js +0 -1
  1206. package/build/assets/secret-form-HTUbYw5o.js +0 -1
  1207. package/build/assets/secrets-service-BTor9uAU.js +0 -1
  1208. package/build/assets/settings-BlmrkwRi.js +0 -1
  1209. package/build/assets/settings-DcNPxz0v.js +0 -1
  1210. package/build/assets/settings-index-CKq0b0Vg.js +0 -1
  1211. package/build/assets/settings-service.api-B2agVfjL.js +0 -1
  1212. package/build/assets/shared-conversation-B55pCyBG.js +0 -1
  1213. package/build/assets/shield-check-CFDViW82.js +0 -1
  1214. package/build/assets/sidebar-mobile-menu-toggle-BOtyJHwE.js +0 -1
  1215. package/build/assets/sidebar-nav-link-CPzhyHQg.js +0 -1
  1216. package/build/assets/sidebar-store-DtpU7zaI.js +0 -1
  1217. package/build/assets/skill-filter-CWZ5kjcg.js +0 -2
  1218. package/build/assets/skill-scope-CV1dkAbW.js +0 -1
  1219. package/build/assets/skills-plugins-DGHULTq6.js +0 -1
  1220. package/build/assets/skills-settings-CM1lFv3e.js +0 -1
  1221. package/build/assets/styled-tooltip-Dl06rkpY.js +0 -1
  1222. package/build/assets/toggle-switch-Fd_QGz0r.js +0 -1
  1223. package/build/assets/trash-2-Dl8_RGz0.js +0 -1
  1224. package/build/assets/trash-_RMt7Ayc.js +0 -1
  1225. package/build/assets/triangle-alert-SM-q4NU_.js +0 -1
  1226. package/build/assets/usage-tab-BcfWV6db.js +0 -1
  1227. package/build/assets/use-acp-credential-form-BsSW5NHG.js +0 -1
  1228. package/build/assets/use-activate-agent-profile-B2NS8nA5.js +0 -1
  1229. package/build/assets/use-agent-profiles-DWBPC0Si.js +0 -1
  1230. package/build/assets/use-config-Bft35DOK.js +0 -1
  1231. package/build/assets/use-create-conversation-DwN5vv2f.js +0 -1
  1232. package/build/assets/use-create-secret-BSxJMxHp.js +0 -1
  1233. package/build/assets/use-has-permission-B3C8rQmR.js +0 -1
  1234. package/build/assets/use-is-authed-CFGkY3-Z.js +0 -1
  1235. package/build/assets/use-llm-configured-BI6obxsc.js +0 -1
  1236. package/build/assets/use-llm-profiles-djGAhTWL.js +0 -1
  1237. package/build/assets/use-manifest-capabilities-3z0-1G59.js +0 -1
  1238. package/build/assets/use-onboarding-completion-BXpyUSsJ.js +0 -1
  1239. package/build/assets/use-plugins-marketplace-DI4_pK56.js +0 -1
  1240. package/build/assets/use-save-agent-profile-DdBSTdpN.js +0 -1
  1241. package/build/assets/use-settings-C5VhGpqd.js +0 -1
  1242. package/build/assets/use-settings-nav-items-DHaUu1Dg.js +0 -16
  1243. package/build/assets/use-tracking-D5t9otIF.js +0 -3
  1244. package/build/assets/utils-DaCIEEQP.js +0 -1
  1245. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~kepq2zme-ZixYGy6E.js +0 -186
  1246. package/build/assets/vendor~index-home~home~conversation-panel~conversation~alert-banner-B3qC_oj8.js +0 -1
  1247. package/build/assets/vendor~root-layout-BlUaZ18v.js +0 -1
  1248. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-B2OLKL7N.js +0 -1
  1249. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iw7io29p-Dz-MAyNb.js +0 -1
  1250. package/build/assets/x-DkgltWa0.js +0 -1
  1251. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +0 -2
  1252. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +0 -1
  1253. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.d.ts +0 -35
  1254. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +0 -247
  1255. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +0 -1
  1256. package/dist/components/features/tips/random-tip.d.ts +0 -2
  1257. package/dist/hooks/query/use-skills.cjs +0 -2
  1258. package/dist/hooks/query/use-skills.cjs.map +0 -1
  1259. package/dist/hooks/query/use-skills.d.ts +0 -7
  1260. package/dist/hooks/query/use-skills.js +0 -13
  1261. package/dist/hooks/query/use-skills.js.map +0 -1
  1262. package/dist/hooks/use-has-permission.cjs +0 -2
  1263. package/dist/hooks/use-has-permission.cjs.map +0 -1
  1264. package/dist/hooks/use-has-permission.d.ts +0 -1
  1265. package/dist/hooks/use-has-permission.js +0 -8
  1266. package/dist/hooks/use-has-permission.js.map +0 -1
  1267. package/dist/node_modules/lucide-react/dist/esm/icons/eye.cjs +0 -2
  1268. package/dist/node_modules/lucide-react/dist/esm/icons/eye.cjs.map +0 -1
  1269. package/dist/node_modules/lucide-react/dist/esm/icons/eye.js +0 -14
  1270. package/dist/node_modules/lucide-react/dist/esm/icons/eye.js.map +0 -1
  1271. package/dist/utils/tips.d.ts +0 -7
  1272. package/dist/utils/workspace-relative-path.cjs +0 -2
  1273. package/dist/utils/workspace-relative-path.cjs.map +0 -1
  1274. package/dist/utils/workspace-relative-path.d.ts +0 -10
  1275. package/dist/utils/workspace-relative-path.js +0 -22
  1276. package/dist/utils/workspace-relative-path.js.map +0 -1
  1277. /package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ox0jfsa0-cHFhpUBq.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~i58xkef6-cHFhpUBq.js} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-event-timestamp.js","names":[],"sources":["../../src/utils/format-event-timestamp.ts"],"sourcesContent":["export function formatEventTimestamp(\n timestamp?: string,\n locale?: string,\n): string | null {\n if (!timestamp) return null;\n\n // Agent-server events carry datetime.now().isoformat(), which has no offset.\n // Left alone the browser reads that wall-clock as its own local time, so an\n // event recorded in a UTC sandbox renders hours off for anyone outside UTC.\n const utc = /(?:Z|[+-]\\d{2}:?\\d{2})$/i.test(timestamp)\n ? timestamp\n : `${timestamp}Z`;\n const date = new Date(utc);\n if (Number.isNaN(date.getTime())) return null;\n\n return date.toLocaleString(locale, {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n });\n}\n"],"mappings":";AAAA,SAAgB,EACd,GACA,GACe;CACf,IAAI,CAAC,GAAW,OAAO;CAKvB,IAAM,IAAM,2BAA2B,KAAK,CAAS,IACjD,IACA,GAAG,EAAU,IACX,IAAO,IAAI,KAAK,CAAG;CAGzB,OAFI,OAAO,MAAM,EAAK,QAAQ,CAAC,IAAU,OAElC,EAAK,eAAe,GAAQ;EACjC,WAAW;EACX,WAAW;CACb,CAAC;AACH"}
@@ -1,2 +1,2 @@
1
- require("../_virtual/_rolldown/runtime.cjs");var e=`Free`,t={"openhands/kimi-k3":`OpenHands Kimi K3 (free)`,"openhands/glm-5.2":`OpenHands GLM-5.2 (free)`,"openhands/deepseek-v4-flash":`OpenHands DeepSeek V4 Flash (free)`,"openhands/minimax-m2.7":`OpenHands MiniMax M2.7 (free)`},n=`Free OpenHands models: ${Object.keys(t).join(`, `)}. Other provider endpoints with similar model names may require separate billing.`,r=e=>!!(e&&e in t);function i(e){return e?r(e)?t[e]:e:null}function a(e){return e?r(e)?t[e]:e.split(`/`).pop()||e:null}exports.FREE_MODEL_BADGE_LABEL=e,exports.FREE_OPENHANDS_MODEL_NOTE=n,exports.formatModelNameForDisplay=i,exports.formatNativeModelName=a,exports.isFreeOpenHandsModel=r;
1
+ require("../_virtual/_rolldown/runtime.cjs");var e=`Free`,t={"openhands/deepseek-v4-flash":`OpenHands DeepSeek V4 Flash (free)`},n=Object.keys(t),r=e=>!!e?.startsWith(`openhands/`),i=`Free OpenHands models: ${n.join(`, `)}. Other provider endpoints with similar model names may require separate billing.`,a=e=>!!(e&&e in t);function o(e){return e?a(e)?t[e]:e:null}function s(e){return e?a(e)?t[e]:e.split(`/`).pop()||e:null}exports.FREE_MODEL_BADGE_LABEL=e,exports.FREE_OPENHANDS_MODEL_NOTE=i,exports.formatModelNameForDisplay=o,exports.formatNativeModelName=s,exports.isFreeOpenHandsModel=a,exports.isOpenHandsProviderModel=r;
2
2
  //# sourceMappingURL=format-model-name.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"format-model-name.cjs","names":[],"sources":["../../src/utils/format-model-name.ts"],"sourcesContent":["export const FREE_MODEL_BADGE_LABEL = \"Free\";\n\nexport const FREE_OPENHANDS_MODELS = {\n \"openhands/kimi-k3\": \"OpenHands Kimi K3 (free)\",\n \"openhands/glm-5.2\": \"OpenHands GLM-5.2 (free)\",\n \"openhands/deepseek-v4-flash\": \"OpenHands DeepSeek V4 Flash (free)\",\n \"openhands/minimax-m2.7\": \"OpenHands MiniMax M2.7 (free)\",\n} as const;\n\nexport const FREE_OPENHANDS_MODEL_IDS = Object.keys(FREE_OPENHANDS_MODELS);\nexport const FREE_OPENHANDS_MODEL_NOTE = `Free OpenHands models: ${FREE_OPENHANDS_MODEL_IDS.join(\n \", \",\n)}. Other provider endpoints with similar model names may require separate billing.`;\n\nexport const isFreeOpenHandsModel = (\n model: string | null | undefined,\n): model is keyof typeof FREE_OPENHANDS_MODELS =>\n Boolean(model && model in FREE_OPENHANDS_MODELS);\n\nexport function formatModelNameForDisplay(\n model: string | null | undefined,\n): string | null {\n if (!model) return null;\n return isFreeOpenHandsModel(model) ? FREE_OPENHANDS_MODELS[model] : model;\n}\n\nexport function formatProviderModelNameForDisplay(\n provider: string | null | undefined,\n model: string | null | undefined,\n): string | null {\n if (!model) return null;\n const fullModel = provider ? `${provider}/${model}` : model;\n return isFreeOpenHandsModel(fullModel)\n ? FREE_OPENHANDS_MODELS[fullModel]\n : model;\n}\n\n/**\n * Format a native (OpenHands-kind) routing model string for display, stripping\n * the provider route prefix (e.g. ``\"anthropic/claude-sonnet-4-5-20250929\"`` →\n * ``\"claude-sonnet-4-5-20250929\"``, ``\"litellm_proxy/openai/gpt-4o\"`` →\n * ``\"gpt-4o\"``) so a conversation chip shows a meaningful model name rather than\n * the full routing path.\n *\n * Returns ``null`` for an empty/nullish input, and falls back to the original\n * string when stripping the prefix would leave nothing (e.g. a trailing slash)\n * — never an empty string, which would collapse the chip text.\n *\n * Display-only: unlike {@link deriveProfileNameFromModel} this does not sanitize\n * to an identifier, so it keeps the real model id intact for the chip.\n */\nexport function formatNativeModelName(\n model: string | null | undefined,\n): string | null {\n if (!model) return null;\n if (isFreeOpenHandsModel(model)) return FREE_OPENHANDS_MODELS[model];\n const lastSegment = model.split(\"/\").pop();\n return lastSegment || model;\n}\n"],"mappings":"6CAAA,IAAa,EAAyB,OAEzB,EAAwB,CACnC,oBAAqB,2BACrB,oBAAqB,2BACrB,8BAA+B,qCAC/B,yBAA0B,+BAC5B,EAGa,EAA4B,0BADD,OAAO,KAAK,CACe,EAAyB,KAC1F,IACF,EAAE,mFAEW,EACX,GAEA,GAAQ,GAAS,KAAS,GAE5B,SAAgB,EACd,EACe,CAEf,OADK,EACE,EAAqB,CAAK,EAAI,EAAsB,GAAS,EADjD,IAErB,CA2BA,SAAgB,EACd,EACe,CAIf,OAHK,EACD,EAAqB,CAAK,EAAU,EAAsB,GAC1C,EAAM,MAAM,GAAG,EAAE,IAC9B,GAAe,EAHH,IAIrB"}
1
+ {"version":3,"file":"format-model-name.cjs","names":[],"sources":["../../src/utils/format-model-name.ts"],"sourcesContent":["export const FREE_MODEL_BADGE_LABEL = \"Free\";\n\nexport const FREE_OPENHANDS_MODELS = {\n \"openhands/deepseek-v4-flash\": \"OpenHands DeepSeek V4 Flash (free)\",\n} as const;\n\nexport const FREE_OPENHANDS_MODEL_IDS = Object.keys(FREE_OPENHANDS_MODELS);\n\n/**\n * Whether a model id routes through the OpenHands provider (the `openhands/`\n * prefix). On cloud the OpenHands provider is backed by a server-minted LLM\n * key rather than a user-supplied one, so callers use this to hide the inline\n * API key / base URL inputs and strip those fields from the save payload.\n */\nexport const isOpenHandsProviderModel = (\n model: string | null | undefined,\n): boolean => Boolean(model?.startsWith(\"openhands/\"));\n\nexport const FREE_OPENHANDS_MODEL_NOTE = `Free OpenHands models: ${FREE_OPENHANDS_MODEL_IDS.join(\n \", \",\n)}. Other provider endpoints with similar model names may require separate billing.`;\n\nexport const isFreeOpenHandsModel = (\n model: string | null | undefined,\n): model is keyof typeof FREE_OPENHANDS_MODELS =>\n Boolean(model && model in FREE_OPENHANDS_MODELS);\n\nexport function formatModelNameForDisplay(\n model: string | null | undefined,\n): string | null {\n if (!model) return null;\n return isFreeOpenHandsModel(model) ? FREE_OPENHANDS_MODELS[model] : model;\n}\n\nexport function formatProviderModelNameForDisplay(\n provider: string | null | undefined,\n model: string | null | undefined,\n): string | null {\n if (!model) return null;\n const fullModel = provider ? `${provider}/${model}` : model;\n return isFreeOpenHandsModel(fullModel)\n ? FREE_OPENHANDS_MODELS[fullModel]\n : model;\n}\n\n/**\n * Format a native (OpenHands-kind) routing model string for display, stripping\n * the provider route prefix (e.g. ``\"anthropic/claude-sonnet-4-5-20250929\"`` →\n * ``\"claude-sonnet-4-5-20250929\"``, ``\"litellm_proxy/openai/gpt-4o\"`` →\n * ``\"gpt-4o\"``) so a conversation chip shows a meaningful model name rather than\n * the full routing path.\n *\n * Returns ``null`` for an empty/nullish input, and falls back to the original\n * string when stripping the prefix would leave nothing (e.g. a trailing slash)\n * — never an empty string, which would collapse the chip text.\n *\n * Display-only: unlike {@link deriveProfileNameFromModel} this does not sanitize\n * to an identifier, so it keeps the real model id intact for the chip.\n */\nexport function formatNativeModelName(\n model: string | null | undefined,\n): string | null {\n if (!model) return null;\n if (isFreeOpenHandsModel(model)) return FREE_OPENHANDS_MODELS[model];\n const lastSegment = model.split(\"/\").pop();\n return lastSegment || model;\n}\n"],"mappings":"6CAAA,IAAa,EAAyB,OAEzB,EAAwB,CACnC,8BAA+B,oCACjC,EAEa,EAA2B,OAAO,KAAK,CAAqB,EAQ5D,EACX,GACY,EAAQ,GAAO,WAAW,YAAY,EAEvC,EAA4B,0BAA0B,EAAyB,KAC1F,IACF,EAAE,mFAEW,EACX,GAEA,GAAQ,GAAS,KAAS,GAE5B,SAAgB,EACd,EACe,CAEf,OADK,EACE,EAAqB,CAAK,EAAI,EAAsB,GAAS,EADjD,IAErB,CA2BA,SAAgB,EACd,EACe,CAIf,OAHK,EACD,EAAqB,CAAK,EAAU,EAAsB,GAC1C,EAAM,MAAM,GAAG,EAAE,IAC9B,GAAe,EAHH,IAIrB"}
@@ -1,11 +1,15 @@
1
1
  export declare const FREE_MODEL_BADGE_LABEL = "Free";
2
2
  export declare const FREE_OPENHANDS_MODELS: {
3
- readonly "openhands/kimi-k3": "OpenHands Kimi K3 (free)";
4
- readonly "openhands/glm-5.2": "OpenHands GLM-5.2 (free)";
5
3
  readonly "openhands/deepseek-v4-flash": "OpenHands DeepSeek V4 Flash (free)";
6
- readonly "openhands/minimax-m2.7": "OpenHands MiniMax M2.7 (free)";
7
4
  };
8
5
  export declare const FREE_OPENHANDS_MODEL_IDS: string[];
6
+ /**
7
+ * Whether a model id routes through the OpenHands provider (the `openhands/`
8
+ * prefix). On cloud the OpenHands provider is backed by a server-minted LLM
9
+ * key rather than a user-supplied one, so callers use this to hide the inline
10
+ * API key / base URL inputs and strip those fields from the save payload.
11
+ */
12
+ export declare const isOpenHandsProviderModel: (model: string | null | undefined) => boolean;
9
13
  export declare const FREE_OPENHANDS_MODEL_NOTE: string;
10
14
  export declare const isFreeOpenHandsModel: (model: string | null | undefined) => model is keyof typeof FREE_OPENHANDS_MODELS;
11
15
  export declare function formatModelNameForDisplay(model: string | null | undefined): string | null;
@@ -1,17 +1,12 @@
1
1
  //#region src/utils/format-model-name.ts
2
- var e = "Free", t = {
3
- "openhands/kimi-k3": "OpenHands Kimi K3 (free)",
4
- "openhands/glm-5.2": "OpenHands GLM-5.2 (free)",
5
- "openhands/deepseek-v4-flash": "OpenHands DeepSeek V4 Flash (free)",
6
- "openhands/minimax-m2.7": "OpenHands MiniMax M2.7 (free)"
7
- }, n = `Free OpenHands models: ${Object.keys(t).join(", ")}. Other provider endpoints with similar model names may require separate billing.`, r = (e) => !!(e && e in t);
8
- function i(e) {
9
- return e ? r(e) ? t[e] : e : null;
2
+ var e = "Free", t = { "openhands/deepseek-v4-flash": "OpenHands DeepSeek V4 Flash (free)" }, n = Object.keys(t), r = (e) => !!e?.startsWith("openhands/"), i = `Free OpenHands models: ${n.join(", ")}. Other provider endpoints with similar model names may require separate billing.`, a = (e) => !!(e && e in t);
3
+ function o(e) {
4
+ return e ? a(e) ? t[e] : e : null;
10
5
  }
11
- function a(e) {
12
- return e ? r(e) ? t[e] : e.split("/").pop() || e : null;
6
+ function s(e) {
7
+ return e ? a(e) ? t[e] : e.split("/").pop() || e : null;
13
8
  }
14
9
  //#endregion
15
- export { e as FREE_MODEL_BADGE_LABEL, n as FREE_OPENHANDS_MODEL_NOTE, i as formatModelNameForDisplay, a as formatNativeModelName, r as isFreeOpenHandsModel };
10
+ export { e as FREE_MODEL_BADGE_LABEL, i as FREE_OPENHANDS_MODEL_NOTE, o as formatModelNameForDisplay, s as formatNativeModelName, a as isFreeOpenHandsModel, r as isOpenHandsProviderModel };
16
11
 
17
12
  //# sourceMappingURL=format-model-name.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"format-model-name.js","names":[],"sources":["../../src/utils/format-model-name.ts"],"sourcesContent":["export const FREE_MODEL_BADGE_LABEL = \"Free\";\n\nexport const FREE_OPENHANDS_MODELS = {\n \"openhands/kimi-k3\": \"OpenHands Kimi K3 (free)\",\n \"openhands/glm-5.2\": \"OpenHands GLM-5.2 (free)\",\n \"openhands/deepseek-v4-flash\": \"OpenHands DeepSeek V4 Flash (free)\",\n \"openhands/minimax-m2.7\": \"OpenHands MiniMax M2.7 (free)\",\n} as const;\n\nexport const FREE_OPENHANDS_MODEL_IDS = Object.keys(FREE_OPENHANDS_MODELS);\nexport const FREE_OPENHANDS_MODEL_NOTE = `Free OpenHands models: ${FREE_OPENHANDS_MODEL_IDS.join(\n \", \",\n)}. Other provider endpoints with similar model names may require separate billing.`;\n\nexport const isFreeOpenHandsModel = (\n model: string | null | undefined,\n): model is keyof typeof FREE_OPENHANDS_MODELS =>\n Boolean(model && model in FREE_OPENHANDS_MODELS);\n\nexport function formatModelNameForDisplay(\n model: string | null | undefined,\n): string | null {\n if (!model) return null;\n return isFreeOpenHandsModel(model) ? FREE_OPENHANDS_MODELS[model] : model;\n}\n\nexport function formatProviderModelNameForDisplay(\n provider: string | null | undefined,\n model: string | null | undefined,\n): string | null {\n if (!model) return null;\n const fullModel = provider ? `${provider}/${model}` : model;\n return isFreeOpenHandsModel(fullModel)\n ? FREE_OPENHANDS_MODELS[fullModel]\n : model;\n}\n\n/**\n * Format a native (OpenHands-kind) routing model string for display, stripping\n * the provider route prefix (e.g. ``\"anthropic/claude-sonnet-4-5-20250929\"`` →\n * ``\"claude-sonnet-4-5-20250929\"``, ``\"litellm_proxy/openai/gpt-4o\"`` →\n * ``\"gpt-4o\"``) so a conversation chip shows a meaningful model name rather than\n * the full routing path.\n *\n * Returns ``null`` for an empty/nullish input, and falls back to the original\n * string when stripping the prefix would leave nothing (e.g. a trailing slash)\n * — never an empty string, which would collapse the chip text.\n *\n * Display-only: unlike {@link deriveProfileNameFromModel} this does not sanitize\n * to an identifier, so it keeps the real model id intact for the chip.\n */\nexport function formatNativeModelName(\n model: string | null | undefined,\n): string | null {\n if (!model) return null;\n if (isFreeOpenHandsModel(model)) return FREE_OPENHANDS_MODELS[model];\n const lastSegment = model.split(\"/\").pop();\n return lastSegment || model;\n}\n"],"mappings":";AAAA,IAAa,IAAyB,QAEzB,IAAwB;CACnC,qBAAqB;CACrB,qBAAqB;CACrB,+BAA+B;CAC/B,0BAA0B;AAC5B,GAGa,IAA4B,0BADD,OAAO,KAAK,CACe,EAAyB,KAC1F,IACF,EAAE,oFAEW,KACX,MAEA,GAAQ,KAAS,KAAS;AAE5B,SAAgB,EACd,GACe;CAEf,OADK,IACE,EAAqB,CAAK,IAAI,EAAsB,KAAS,IADjD;AAErB;AA2BA,SAAgB,EACd,GACe;CAIf,OAHK,IACD,EAAqB,CAAK,IAAU,EAAsB,KAC1C,EAAM,MAAM,GAAG,EAAE,IAC9B,KAAe,IAHH;AAIrB"}
1
+ {"version":3,"file":"format-model-name.js","names":[],"sources":["../../src/utils/format-model-name.ts"],"sourcesContent":["export const FREE_MODEL_BADGE_LABEL = \"Free\";\n\nexport const FREE_OPENHANDS_MODELS = {\n \"openhands/deepseek-v4-flash\": \"OpenHands DeepSeek V4 Flash (free)\",\n} as const;\n\nexport const FREE_OPENHANDS_MODEL_IDS = Object.keys(FREE_OPENHANDS_MODELS);\n\n/**\n * Whether a model id routes through the OpenHands provider (the `openhands/`\n * prefix). On cloud the OpenHands provider is backed by a server-minted LLM\n * key rather than a user-supplied one, so callers use this to hide the inline\n * API key / base URL inputs and strip those fields from the save payload.\n */\nexport const isOpenHandsProviderModel = (\n model: string | null | undefined,\n): boolean => Boolean(model?.startsWith(\"openhands/\"));\n\nexport const FREE_OPENHANDS_MODEL_NOTE = `Free OpenHands models: ${FREE_OPENHANDS_MODEL_IDS.join(\n \", \",\n)}. Other provider endpoints with similar model names may require separate billing.`;\n\nexport const isFreeOpenHandsModel = (\n model: string | null | undefined,\n): model is keyof typeof FREE_OPENHANDS_MODELS =>\n Boolean(model && model in FREE_OPENHANDS_MODELS);\n\nexport function formatModelNameForDisplay(\n model: string | null | undefined,\n): string | null {\n if (!model) return null;\n return isFreeOpenHandsModel(model) ? FREE_OPENHANDS_MODELS[model] : model;\n}\n\nexport function formatProviderModelNameForDisplay(\n provider: string | null | undefined,\n model: string | null | undefined,\n): string | null {\n if (!model) return null;\n const fullModel = provider ? `${provider}/${model}` : model;\n return isFreeOpenHandsModel(fullModel)\n ? FREE_OPENHANDS_MODELS[fullModel]\n : model;\n}\n\n/**\n * Format a native (OpenHands-kind) routing model string for display, stripping\n * the provider route prefix (e.g. ``\"anthropic/claude-sonnet-4-5-20250929\"`` →\n * ``\"claude-sonnet-4-5-20250929\"``, ``\"litellm_proxy/openai/gpt-4o\"`` →\n * ``\"gpt-4o\"``) so a conversation chip shows a meaningful model name rather than\n * the full routing path.\n *\n * Returns ``null`` for an empty/nullish input, and falls back to the original\n * string when stripping the prefix would leave nothing (e.g. a trailing slash)\n * — never an empty string, which would collapse the chip text.\n *\n * Display-only: unlike {@link deriveProfileNameFromModel} this does not sanitize\n * to an identifier, so it keeps the real model id intact for the chip.\n */\nexport function formatNativeModelName(\n model: string | null | undefined,\n): string | null {\n if (!model) return null;\n if (isFreeOpenHandsModel(model)) return FREE_OPENHANDS_MODELS[model];\n const lastSegment = model.split(\"/\").pop();\n return lastSegment || model;\n}\n"],"mappings":";AAAA,IAAa,IAAyB,QAEzB,IAAwB,EACnC,+BAA+B,qCACjC,GAEa,IAA2B,OAAO,KAAK,CAAqB,GAQ5D,KACX,MACY,EAAQ,GAAO,WAAW,YAAY,GAEvC,IAA4B,0BAA0B,EAAyB,KAC1F,IACF,EAAE,oFAEW,KACX,MAEA,GAAQ,KAAS,KAAS;AAE5B,SAAgB,EACd,GACe;CAEf,OADK,IACE,EAAqB,CAAK,IAAI,EAAsB,KAAS,IADjD;AAErB;AA2BA,SAAgB,EACd,GACe;CAIf,OAHK,IACD,EAAqB,CAAK,IAAU,EAAsB,KAC1C,EAAM,MAAM,GAAG,EAAE,IAC9B,KAAe,IAHH;AAIrB"}
@@ -1,2 +1,2 @@
1
- require("../_virtual/_rolldown/runtime.cjs");const e=require("../i18n/declaration.cjs");function t(e,t){return new Date(e).toLocaleDateString(t,{year:`numeric`,month:`short`,day:`numeric`})}function n(n,r,i){let a=Date.now()-new Date(n).getTime(),o=Math.floor(a/6e4),s=Math.floor(a/36e5),c=Math.floor(a/864e5);return o<1?i(e.I18nKey.AUTOMATIONS$DETAIL$TIME_JUST_NOW):o<60?i(e.I18nKey.AUTOMATIONS$DETAIL$TIME_MINUTES_AGO,{count:o}):s<24?i(e.I18nKey.AUTOMATIONS$DETAIL$TIME_HOURS_AGO,{count:s}):c===1?i(e.I18nKey.AUTOMATIONS$DETAIL$TIME_YESTERDAY):c<7?i(e.I18nKey.AUTOMATIONS$DETAIL$TIME_DAYS_AGO,{count:c}):t(n,r)}exports.formatRelativeTime=n;
1
+ require("../_virtual/_rolldown/runtime.cjs");const e=require("../i18n/declaration.cjs");function t(e,t){return new Date(e).toLocaleDateString(t,{year:`numeric`,month:`short`,day:`numeric`})}function n(e){if(!e)return!0;let t=new Date(e).getTime();return Number.isNaN(t)||t===0}function r(n,r,i){let a=Date.now()-new Date(n).getTime(),o=Math.floor(a/6e4),s=Math.floor(a/36e5),c=Math.floor(a/864e5);return o<1?i(e.I18nKey.AUTOMATIONS$DETAIL$TIME_JUST_NOW):o<60?i(e.I18nKey.AUTOMATIONS$DETAIL$TIME_MINUTES_AGO,{count:o}):s<24?i(e.I18nKey.AUTOMATIONS$DETAIL$TIME_HOURS_AGO,{count:s}):c===1?i(e.I18nKey.AUTOMATIONS$DETAIL$TIME_YESTERDAY):c<7?i(e.I18nKey.AUTOMATIONS$DETAIL$TIME_DAYS_AGO,{count:c}):t(n,r)}exports.formatRelativeTime=r,exports.isInvalidTimestamp=n;
2
2
  //# sourceMappingURL=format-relative-time.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"format-relative-time.cjs","names":[],"sources":["../../src/utils/format-relative-time.ts"],"sourcesContent":["import { I18nKey } from \"#/i18n/declaration\";\n\nexport function formatDate(dateStr: string, locale: string): string {\n const date = new Date(dateStr);\n return date.toLocaleDateString(locale, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n}\n\nexport function formatRelativeTime(\n dateStr: string,\n locale: string,\n t: (key: I18nKey, options?: Record<string, unknown>) => string,\n): string {\n const now = Date.now();\n const then = new Date(dateStr).getTime();\n const diffMs = now - then;\n const diffMins = Math.floor(diffMs / 60_000);\n const diffHours = Math.floor(diffMs / 3_600_000);\n const diffDays = Math.floor(diffMs / 86_400_000);\n\n if (diffMins < 1) return t(I18nKey.AUTOMATIONS$DETAIL$TIME_JUST_NOW);\n if (diffMins < 60)\n return t(I18nKey.AUTOMATIONS$DETAIL$TIME_MINUTES_AGO, { count: diffMins });\n if (diffHours < 24)\n return t(I18nKey.AUTOMATIONS$DETAIL$TIME_HOURS_AGO, { count: diffHours });\n if (diffDays === 1) return t(I18nKey.AUTOMATIONS$DETAIL$TIME_YESTERDAY);\n if (diffDays < 7)\n return t(I18nKey.AUTOMATIONS$DETAIL$TIME_DAYS_AGO, { count: diffDays });\n return formatDate(dateStr, locale);\n}\n"],"mappings":"wFAEA,SAAgB,EAAW,EAAiB,EAAwB,CAElE,OAAO,IADU,KAAK,CACf,EAAK,mBAAmB,EAAQ,CACrC,KAAM,UACN,MAAO,QACP,IAAK,SACP,CAAC,CACH,CAEA,SAAgB,EACd,EACA,EACA,EACQ,CAGR,IAAM,EAFM,KAAK,IAEF,EADF,IAAI,KAAK,CAAO,EAAE,QACV,EACf,EAAW,KAAK,MAAM,EAAS,GAAM,EACrC,EAAY,KAAK,MAAM,EAAS,IAAS,EACzC,EAAW,KAAK,MAAM,EAAS,KAAU,EAU/C,OARI,EAAW,EAAU,EAAE,EAAA,QAAQ,gCAAgC,EAC/D,EAAW,GACN,EAAE,EAAA,QAAQ,oCAAqC,CAAE,MAAO,CAAS,CAAC,EACvE,EAAY,GACP,EAAE,EAAA,QAAQ,kCAAmC,CAAE,MAAO,CAAU,CAAC,EACtE,IAAa,EAAU,EAAE,EAAA,QAAQ,iCAAiC,EAClE,EAAW,EACN,EAAE,EAAA,QAAQ,iCAAkC,CAAE,MAAO,CAAS,CAAC,EACjE,EAAW,EAAS,CAAM,CACnC"}
1
+ {"version":3,"file":"format-relative-time.cjs","names":[],"sources":["../../src/utils/format-relative-time.ts"],"sourcesContent":["import { I18nKey } from \"#/i18n/declaration\";\n\nexport function formatDate(dateStr: string, locale: string): string {\n const date = new Date(dateStr);\n return date.toLocaleDateString(locale, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n}\n\n/**\n * Whether a timestamp is one nothing can be computed from. Besides an\n * unparseable string, that includes the epoch: the backend leaves unset\n * datetimes at zero, and formatting one produces \"Jan 1, 1970\" rather than\n * an honest \"unknown\".\n */\nexport function isInvalidTimestamp(\n dateStr: string | null | undefined,\n): boolean {\n if (!dateStr) return true;\n const parsed = new Date(dateStr).getTime();\n return Number.isNaN(parsed) || parsed === 0;\n}\n\nexport function formatRelativeTime(\n dateStr: string,\n locale: string,\n t: (key: I18nKey, options?: Record<string, unknown>) => string,\n): string {\n const now = Date.now();\n const then = new Date(dateStr).getTime();\n const diffMs = now - then;\n const diffMins = Math.floor(diffMs / 60_000);\n const diffHours = Math.floor(diffMs / 3_600_000);\n const diffDays = Math.floor(diffMs / 86_400_000);\n\n if (diffMins < 1) return t(I18nKey.AUTOMATIONS$DETAIL$TIME_JUST_NOW);\n if (diffMins < 60)\n return t(I18nKey.AUTOMATIONS$DETAIL$TIME_MINUTES_AGO, { count: diffMins });\n if (diffHours < 24)\n return t(I18nKey.AUTOMATIONS$DETAIL$TIME_HOURS_AGO, { count: diffHours });\n if (diffDays === 1) return t(I18nKey.AUTOMATIONS$DETAIL$TIME_YESTERDAY);\n if (diffDays < 7)\n return t(I18nKey.AUTOMATIONS$DETAIL$TIME_DAYS_AGO, { count: diffDays });\n return formatDate(dateStr, locale);\n}\n"],"mappings":"wFAEA,SAAgB,EAAW,EAAiB,EAAwB,CAElE,OAAO,IADU,KAAK,CACf,EAAK,mBAAmB,EAAQ,CACrC,KAAM,UACN,MAAO,QACP,IAAK,SACP,CAAC,CACH,CAQA,SAAgB,EACd,EACS,CACT,GAAI,CAAC,EAAS,MAAO,GACrB,IAAM,EAAS,IAAI,KAAK,CAAO,EAAE,QAAQ,EACzC,OAAO,OAAO,MAAM,CAAM,GAAK,IAAW,CAC5C,CAEA,SAAgB,EACd,EACA,EACA,EACQ,CAGR,IAAM,EAFM,KAAK,IAEF,EADF,IAAI,KAAK,CAAO,EAAE,QACV,EACf,EAAW,KAAK,MAAM,EAAS,GAAM,EACrC,EAAY,KAAK,MAAM,EAAS,IAAS,EACzC,EAAW,KAAK,MAAM,EAAS,KAAU,EAU/C,OARI,EAAW,EAAU,EAAE,EAAA,QAAQ,gCAAgC,EAC/D,EAAW,GACN,EAAE,EAAA,QAAQ,oCAAqC,CAAE,MAAO,CAAS,CAAC,EACvE,EAAY,GACP,EAAE,EAAA,QAAQ,kCAAmC,CAAE,MAAO,CAAU,CAAC,EACtE,IAAa,EAAU,EAAE,EAAA,QAAQ,iCAAiC,EAClE,EAAW,EACN,EAAE,EAAA,QAAQ,iCAAkC,CAAE,MAAO,CAAS,CAAC,EACjE,EAAW,EAAS,CAAM,CACnC"}
@@ -1,3 +1,10 @@
1
1
  import { I18nKey } from "#/i18n/declaration";
2
2
  export declare function formatDate(dateStr: string, locale: string): string;
3
+ /**
4
+ * Whether a timestamp is one nothing can be computed from. Besides an
5
+ * unparseable string, that includes the epoch: the backend leaves unset
6
+ * datetimes at zero, and formatting one produces "Jan 1, 1970" rather than
7
+ * an honest "unknown".
8
+ */
9
+ export declare function isInvalidTimestamp(dateStr: string | null | undefined): boolean;
3
10
  export declare function formatRelativeTime(dateStr: string, locale: string, t: (key: I18nKey, options?: Record<string, unknown>) => string): string;
@@ -7,11 +7,16 @@ function t(e, t) {
7
7
  day: "numeric"
8
8
  });
9
9
  }
10
- function n(n, r, i) {
10
+ function n(e) {
11
+ if (!e) return !0;
12
+ let t = new Date(e).getTime();
13
+ return Number.isNaN(t) || t === 0;
14
+ }
15
+ function r(n, r, i) {
11
16
  let a = Date.now() - new Date(n).getTime(), o = Math.floor(a / 6e4), s = Math.floor(a / 36e5), c = Math.floor(a / 864e5);
12
17
  return o < 1 ? i(e.AUTOMATIONS$DETAIL$TIME_JUST_NOW) : o < 60 ? i(e.AUTOMATIONS$DETAIL$TIME_MINUTES_AGO, { count: o }) : s < 24 ? i(e.AUTOMATIONS$DETAIL$TIME_HOURS_AGO, { count: s }) : c === 1 ? i(e.AUTOMATIONS$DETAIL$TIME_YESTERDAY) : c < 7 ? i(e.AUTOMATIONS$DETAIL$TIME_DAYS_AGO, { count: c }) : t(n, r);
13
18
  }
14
19
  //#endregion
15
- export { n as formatRelativeTime };
20
+ export { r as formatRelativeTime, n as isInvalidTimestamp };
16
21
 
17
22
  //# sourceMappingURL=format-relative-time.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"format-relative-time.js","names":[],"sources":["../../src/utils/format-relative-time.ts"],"sourcesContent":["import { I18nKey } from \"#/i18n/declaration\";\n\nexport function formatDate(dateStr: string, locale: string): string {\n const date = new Date(dateStr);\n return date.toLocaleDateString(locale, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n}\n\nexport function formatRelativeTime(\n dateStr: string,\n locale: string,\n t: (key: I18nKey, options?: Record<string, unknown>) => string,\n): string {\n const now = Date.now();\n const then = new Date(dateStr).getTime();\n const diffMs = now - then;\n const diffMins = Math.floor(diffMs / 60_000);\n const diffHours = Math.floor(diffMs / 3_600_000);\n const diffDays = Math.floor(diffMs / 86_400_000);\n\n if (diffMins < 1) return t(I18nKey.AUTOMATIONS$DETAIL$TIME_JUST_NOW);\n if (diffMins < 60)\n return t(I18nKey.AUTOMATIONS$DETAIL$TIME_MINUTES_AGO, { count: diffMins });\n if (diffHours < 24)\n return t(I18nKey.AUTOMATIONS$DETAIL$TIME_HOURS_AGO, { count: diffHours });\n if (diffDays === 1) return t(I18nKey.AUTOMATIONS$DETAIL$TIME_YESTERDAY);\n if (diffDays < 7)\n return t(I18nKey.AUTOMATIONS$DETAIL$TIME_DAYS_AGO, { count: diffDays });\n return formatDate(dateStr, locale);\n}\n"],"mappings":";;AAEA,SAAgB,EAAW,GAAiB,GAAwB;CAElE,OAAO,IADU,KAAK,CACf,EAAK,mBAAmB,GAAQ;EACrC,MAAM;EACN,OAAO;EACP,KAAK;CACP,CAAC;AACH;AAEA,SAAgB,EACd,GACA,GACA,GACQ;CAGR,IAAM,IAFM,KAAK,IAEF,IADF,IAAI,KAAK,CAAO,EAAE,QACV,GACf,IAAW,KAAK,MAAM,IAAS,GAAM,GACrC,IAAY,KAAK,MAAM,IAAS,IAAS,GACzC,IAAW,KAAK,MAAM,IAAS,KAAU;CAU/C,OARI,IAAW,IAAU,EAAE,EAAQ,gCAAgC,IAC/D,IAAW,KACN,EAAE,EAAQ,qCAAqC,EAAE,OAAO,EAAS,CAAC,IACvE,IAAY,KACP,EAAE,EAAQ,mCAAmC,EAAE,OAAO,EAAU,CAAC,IACtE,MAAa,IAAU,EAAE,EAAQ,iCAAiC,IAClE,IAAW,IACN,EAAE,EAAQ,kCAAkC,EAAE,OAAO,EAAS,CAAC,IACjE,EAAW,GAAS,CAAM;AACnC"}
1
+ {"version":3,"file":"format-relative-time.js","names":[],"sources":["../../src/utils/format-relative-time.ts"],"sourcesContent":["import { I18nKey } from \"#/i18n/declaration\";\n\nexport function formatDate(dateStr: string, locale: string): string {\n const date = new Date(dateStr);\n return date.toLocaleDateString(locale, {\n year: \"numeric\",\n month: \"short\",\n day: \"numeric\",\n });\n}\n\n/**\n * Whether a timestamp is one nothing can be computed from. Besides an\n * unparseable string, that includes the epoch: the backend leaves unset\n * datetimes at zero, and formatting one produces \"Jan 1, 1970\" rather than\n * an honest \"unknown\".\n */\nexport function isInvalidTimestamp(\n dateStr: string | null | undefined,\n): boolean {\n if (!dateStr) return true;\n const parsed = new Date(dateStr).getTime();\n return Number.isNaN(parsed) || parsed === 0;\n}\n\nexport function formatRelativeTime(\n dateStr: string,\n locale: string,\n t: (key: I18nKey, options?: Record<string, unknown>) => string,\n): string {\n const now = Date.now();\n const then = new Date(dateStr).getTime();\n const diffMs = now - then;\n const diffMins = Math.floor(diffMs / 60_000);\n const diffHours = Math.floor(diffMs / 3_600_000);\n const diffDays = Math.floor(diffMs / 86_400_000);\n\n if (diffMins < 1) return t(I18nKey.AUTOMATIONS$DETAIL$TIME_JUST_NOW);\n if (diffMins < 60)\n return t(I18nKey.AUTOMATIONS$DETAIL$TIME_MINUTES_AGO, { count: diffMins });\n if (diffHours < 24)\n return t(I18nKey.AUTOMATIONS$DETAIL$TIME_HOURS_AGO, { count: diffHours });\n if (diffDays === 1) return t(I18nKey.AUTOMATIONS$DETAIL$TIME_YESTERDAY);\n if (diffDays < 7)\n return t(I18nKey.AUTOMATIONS$DETAIL$TIME_DAYS_AGO, { count: diffDays });\n return formatDate(dateStr, locale);\n}\n"],"mappings":";;AAEA,SAAgB,EAAW,GAAiB,GAAwB;CAElE,OAAO,IADU,KAAK,CACf,EAAK,mBAAmB,GAAQ;EACrC,MAAM;EACN,OAAO;EACP,KAAK;CACP,CAAC;AACH;AAQA,SAAgB,EACd,GACS;CACT,IAAI,CAAC,GAAS,OAAO;CACrB,IAAM,IAAS,IAAI,KAAK,CAAO,EAAE,QAAQ;CACzC,OAAO,OAAO,MAAM,CAAM,KAAK,MAAW;AAC5C;AAEA,SAAgB,EACd,GACA,GACA,GACQ;CAGR,IAAM,IAFM,KAAK,IAEF,IADF,IAAI,KAAK,CAAO,EAAE,QACV,GACf,IAAW,KAAK,MAAM,IAAS,GAAM,GACrC,IAAY,KAAK,MAAM,IAAS,IAAS,GACzC,IAAW,KAAK,MAAM,IAAS,KAAU;CAU/C,OARI,IAAW,IAAU,EAAE,EAAQ,gCAAgC,IAC/D,IAAW,KACN,EAAE,EAAQ,qCAAqC,EAAE,OAAO,EAAS,CAAC,IACvE,IAAY,KACP,EAAE,EAAQ,mCAAmC,EAAE,OAAO,EAAU,CAAC,IACtE,MAAa,IAAU,EAAE,EAAQ,iCAAiC,IAClE,IAAW,IACN,EAAE,EAAQ,kCAAkC,EAAE,OAAO,EAAS,CAAC,IACjE,EAAW,GAAS,CAAM;AACnC"}
@@ -1,5 +1,5 @@
1
- require("../_virtual/_rolldown/runtime.cjs");function e(e){let t=0,n=0;for(let r of e.split(`
2
- `))r.startsWith(`+++`)||r.startsWith(`---`)||r.startsWith(`@@`)||(r.startsWith(`+`)?t+=1:r.startsWith(`-`)&&(n+=1));return{additions:t,deletions:n}}function t(e,t){let n=e.length===0?[]:e.split(`
1
+ require("../_virtual/_rolldown/runtime.cjs");function e(e){let t=0,n=0,r=!1;for(let i of e.split(`
2
+ `)){if(i.startsWith(`diff --git`)||i.startsWith(`index `)){r=!1;continue}if(i.startsWith(`@@`)){r=!0;continue}!r&&(i.startsWith(`---`)||i.startsWith(`+++`))||r&&(i.startsWith(`+`)?t+=1:i.startsWith(`-`)&&(n+=1))}return{additions:t,deletions:n}}function t(e,t){let n=e.length===0?[]:e.split(`
3
3
  `),r=t.length===0?[]:t.split(`
4
4
  `);if(n.length===0)return{additions:r.length,deletions:0};if(r.length===0)return{additions:0,deletions:n.length};let i=0,a=0,o=0,s=0;for(;o<n.length||s<r.length;){let e=n[o],t=r[s];if(o<n.length&&s<r.length&&e===t){o+=1,s+=1;continue}if(s<r.length&&(o>=n.length||!n.slice(o).includes(t))){i+=1,s+=1;continue}o<n.length&&(a+=1,o+=1)}return{additions:i,deletions:a}}function n(n){return typeof n.diff==`string`&&n.diff.length>0?e(n.diff):t(n.original??``,n.modified??``)}function r(e){return e.reduce((e,t)=>({additions:e.additions+t.additions,deletions:e.deletions+t.deletions}),{additions:0,deletions:0})}exports.countGitChangeDiffStats=n,exports.sumGitDiffLineStats=r;
5
5
  //# sourceMappingURL=git-diff-stats.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"git-diff-stats.cjs","names":[],"sources":["../../src/utils/git-diff-stats.ts"],"sourcesContent":["import type { GitChangeDiff } from \"#/api/open-hands.types\";\n\nexport interface GitDiffLineStats {\n additions: number;\n deletions: number;\n}\n\nfunction countUnifiedDiffStats(diff: string): GitDiffLineStats {\n let additions = 0;\n let deletions = 0;\n\n for (const line of diff.split(\"\\n\")) {\n if (\n line.startsWith(\"+++\") ||\n line.startsWith(\"---\") ||\n line.startsWith(\"@@\")\n ) {\n continue;\n }\n if (line.startsWith(\"+\")) {\n additions += 1;\n } else if (line.startsWith(\"-\")) {\n deletions += 1;\n }\n }\n\n return { additions, deletions };\n}\n\nfunction countTextDiffStats(\n original: string,\n modified: string,\n): GitDiffLineStats {\n const originalLines = original.length === 0 ? [] : original.split(\"\\n\");\n const modifiedLines = modified.length === 0 ? [] : modified.split(\"\\n\");\n\n if (originalLines.length === 0) {\n return { additions: modifiedLines.length, deletions: 0 };\n }\n\n if (modifiedLines.length === 0) {\n return { additions: 0, deletions: originalLines.length };\n }\n\n let additions = 0;\n let deletions = 0;\n let originalIndex = 0;\n let modifiedIndex = 0;\n\n while (\n originalIndex < originalLines.length ||\n modifiedIndex < modifiedLines.length\n ) {\n const originalLine = originalLines[originalIndex];\n const modifiedLine = modifiedLines[modifiedIndex];\n\n if (\n originalIndex < originalLines.length &&\n modifiedIndex < modifiedLines.length &&\n originalLine === modifiedLine\n ) {\n originalIndex += 1;\n modifiedIndex += 1;\n continue;\n }\n\n if (\n modifiedIndex < modifiedLines.length &&\n (originalIndex >= originalLines.length ||\n !originalLines.slice(originalIndex).includes(modifiedLine))\n ) {\n additions += 1;\n modifiedIndex += 1;\n continue;\n }\n\n if (originalIndex < originalLines.length) {\n deletions += 1;\n originalIndex += 1;\n }\n }\n\n return { additions, deletions };\n}\n\nexport function countGitChangeDiffStats(\n diff: GitChangeDiff & { diff?: string },\n): GitDiffLineStats {\n if (typeof diff.diff === \"string\" && diff.diff.length > 0) {\n return countUnifiedDiffStats(diff.diff);\n }\n\n return countTextDiffStats(diff.original ?? \"\", diff.modified ?? \"\");\n}\n\nexport function sumGitDiffLineStats(\n stats: GitDiffLineStats[],\n): GitDiffLineStats {\n return stats.reduce(\n (totals, stat) => ({\n additions: totals.additions + stat.additions,\n deletions: totals.deletions + stat.deletions,\n }),\n { additions: 0, deletions: 0 },\n );\n}\n"],"mappings":"6CAOA,SAAS,EAAsB,EAAgC,CAC7D,IAAI,EAAY,EACZ,EAAY,EAEhB,IAAK,IAAM,KAAQ,EAAK,MAAM;CAAI,EAE9B,EAAK,WAAW,KAAK,GACrB,EAAK,WAAW,KAAK,GACrB,EAAK,WAAW,IAAI,IAIlB,EAAK,WAAW,GAAG,EACrB,GAAa,EACJ,EAAK,WAAW,GAAG,IAC5B,GAAa,IAIjB,MAAO,CAAE,YAAW,WAAU,CAChC,CAEA,SAAS,EACP,EACA,EACkB,CAClB,IAAM,EAAgB,EAAS,SAAW,EAAI,CAAC,EAAI,EAAS,MAAM;CAAI,EAChE,EAAgB,EAAS,SAAW,EAAI,CAAC,EAAI,EAAS,MAAM;CAAI,EAEtE,GAAI,EAAc,SAAW,EAC3B,MAAO,CAAE,UAAW,EAAc,OAAQ,UAAW,CAAE,EAGzD,GAAI,EAAc,SAAW,EAC3B,MAAO,CAAE,UAAW,EAAG,UAAW,EAAc,MAAO,EAGzD,IAAI,EAAY,EACZ,EAAY,EACZ,EAAgB,EAChB,EAAgB,EAEpB,KACE,EAAgB,EAAc,QAC9B,EAAgB,EAAc,QAC9B,CACA,IAAM,EAAe,EAAc,GAC7B,EAAe,EAAc,GAEnC,GACE,EAAgB,EAAc,QAC9B,EAAgB,EAAc,QAC9B,IAAiB,EACjB,CACA,GAAiB,EACjB,GAAiB,EACjB,QACF,CAEA,GACE,EAAgB,EAAc,SAC7B,GAAiB,EAAc,QAC9B,CAAC,EAAc,MAAM,CAAa,EAAE,SAAS,CAAY,GAC3D,CACA,GAAa,EACb,GAAiB,EACjB,QACF,CAEI,EAAgB,EAAc,SAChC,GAAa,EACb,GAAiB,EAErB,CAEA,MAAO,CAAE,YAAW,WAAU,CAChC,CAEA,SAAgB,EACd,EACkB,CAKlB,OAJI,OAAO,EAAK,MAAS,UAAY,EAAK,KAAK,OAAS,EAC/C,EAAsB,EAAK,IAAI,EAGjC,EAAmB,EAAK,UAAY,GAAI,EAAK,UAAY,EAAE,CACpE,CAEA,SAAgB,EACd,EACkB,CAClB,OAAO,EAAM,QACV,EAAQ,KAAU,CACjB,UAAW,EAAO,UAAY,EAAK,UACnC,UAAW,EAAO,UAAY,EAAK,SACrC,GACA,CAAE,UAAW,EAAG,UAAW,CAAE,CAC/B,CACF"}
1
+ {"version":3,"file":"git-diff-stats.cjs","names":[],"sources":["../../src/utils/git-diff-stats.ts"],"sourcesContent":["import type { GitChangeDiff } from \"#/api/open-hands.types\";\n\nexport interface GitDiffLineStats {\n additions: number;\n deletions: number;\n}\n\nexport function countUnifiedDiffStats(diff: string): {\n additions: number;\n deletions: number;\n} {\n let additions = 0;\n let deletions = 0;\n let inHunk = false;\n\n for (const line of diff.split(\"\\n\")) {\n if (line.startsWith(\"diff --git\") || line.startsWith(\"index \")) {\n inHunk = false;\n continue;\n }\n\n if (line.startsWith(\"@@\")) {\n inHunk = true;\n continue;\n }\n\n if (!inHunk) {\n if (line.startsWith(\"---\") || line.startsWith(\"+++\")) {\n continue;\n }\n }\n\n if (inHunk) {\n if (line.startsWith(\"+\")) {\n additions += 1;\n } else if (line.startsWith(\"-\")) {\n deletions += 1;\n }\n }\n }\n\n return { additions, deletions };\n}\n\nfunction countTextDiffStats(\n original: string,\n modified: string,\n): GitDiffLineStats {\n const originalLines = original.length === 0 ? [] : original.split(\"\\n\");\n const modifiedLines = modified.length === 0 ? [] : modified.split(\"\\n\");\n\n if (originalLines.length === 0) {\n return { additions: modifiedLines.length, deletions: 0 };\n }\n\n if (modifiedLines.length === 0) {\n return { additions: 0, deletions: originalLines.length };\n }\n\n let additions = 0;\n let deletions = 0;\n let originalIndex = 0;\n let modifiedIndex = 0;\n\n while (\n originalIndex < originalLines.length ||\n modifiedIndex < modifiedLines.length\n ) {\n const originalLine = originalLines[originalIndex];\n const modifiedLine = modifiedLines[modifiedIndex];\n\n if (\n originalIndex < originalLines.length &&\n modifiedIndex < modifiedLines.length &&\n originalLine === modifiedLine\n ) {\n originalIndex += 1;\n modifiedIndex += 1;\n continue;\n }\n\n if (\n modifiedIndex < modifiedLines.length &&\n (originalIndex >= originalLines.length ||\n !originalLines.slice(originalIndex).includes(modifiedLine))\n ) {\n additions += 1;\n modifiedIndex += 1;\n continue;\n }\n\n if (originalIndex < originalLines.length) {\n deletions += 1;\n originalIndex += 1;\n }\n }\n\n return { additions, deletions };\n}\n\nexport function countGitChangeDiffStats(\n diff: GitChangeDiff & { diff?: string },\n): GitDiffLineStats {\n if (typeof diff.diff === \"string\" && diff.diff.length > 0) {\n return countUnifiedDiffStats(diff.diff);\n }\n\n return countTextDiffStats(diff.original ?? \"\", diff.modified ?? \"\");\n}\n\nexport function sumGitDiffLineStats(\n stats: GitDiffLineStats[],\n): GitDiffLineStats {\n return stats.reduce(\n (totals, stat) => ({\n additions: totals.additions + stat.additions,\n deletions: totals.deletions + stat.deletions,\n }),\n { additions: 0, deletions: 0 },\n );\n}\n"],"mappings":"6CAOA,SAAgB,EAAsB,EAGpC,CACA,IAAI,EAAY,EACZ,EAAY,EACZ,EAAS,GAEb,IAAK,IAAM,KAAQ,EAAK,MAAM;CAAI,EAAG,CACnC,GAAI,EAAK,WAAW,YAAY,GAAK,EAAK,WAAW,QAAQ,EAAG,CAC9D,EAAS,GACT,QACF,CAEA,GAAI,EAAK,WAAW,IAAI,EAAG,CACzB,EAAS,GACT,QACF,CAEI,CAAC,IACC,EAAK,WAAW,KAAK,GAAK,EAAK,WAAW,KAAK,IAKjD,IACE,EAAK,WAAW,GAAG,EACrB,GAAa,EACJ,EAAK,WAAW,GAAG,IAC5B,GAAa,GAGnB,CAEA,MAAO,CAAE,YAAW,WAAU,CAChC,CAEA,SAAS,EACP,EACA,EACkB,CAClB,IAAM,EAAgB,EAAS,SAAW,EAAI,CAAC,EAAI,EAAS,MAAM;CAAI,EAChE,EAAgB,EAAS,SAAW,EAAI,CAAC,EAAI,EAAS,MAAM;CAAI,EAEtE,GAAI,EAAc,SAAW,EAC3B,MAAO,CAAE,UAAW,EAAc,OAAQ,UAAW,CAAE,EAGzD,GAAI,EAAc,SAAW,EAC3B,MAAO,CAAE,UAAW,EAAG,UAAW,EAAc,MAAO,EAGzD,IAAI,EAAY,EACZ,EAAY,EACZ,EAAgB,EAChB,EAAgB,EAEpB,KACE,EAAgB,EAAc,QAC9B,EAAgB,EAAc,QAC9B,CACA,IAAM,EAAe,EAAc,GAC7B,EAAe,EAAc,GAEnC,GACE,EAAgB,EAAc,QAC9B,EAAgB,EAAc,QAC9B,IAAiB,EACjB,CACA,GAAiB,EACjB,GAAiB,EACjB,QACF,CAEA,GACE,EAAgB,EAAc,SAC7B,GAAiB,EAAc,QAC9B,CAAC,EAAc,MAAM,CAAa,EAAE,SAAS,CAAY,GAC3D,CACA,GAAa,EACb,GAAiB,EACjB,QACF,CAEI,EAAgB,EAAc,SAChC,GAAa,EACb,GAAiB,EAErB,CAEA,MAAO,CAAE,YAAW,WAAU,CAChC,CAEA,SAAgB,EACd,EACkB,CAKlB,OAJI,OAAO,EAAK,MAAS,UAAY,EAAK,KAAK,OAAS,EAC/C,EAAsB,EAAK,IAAI,EAGjC,EAAmB,EAAK,UAAY,GAAI,EAAK,UAAY,EAAE,CACpE,CAEA,SAAgB,EACd,EACkB,CAClB,OAAO,EAAM,QACV,EAAQ,KAAU,CACjB,UAAW,EAAO,UAAY,EAAK,UACnC,UAAW,EAAO,UAAY,EAAK,SACrC,GACA,CAAE,UAAW,EAAG,UAAW,CAAE,CAC/B,CACF"}
@@ -3,6 +3,10 @@ export interface GitDiffLineStats {
3
3
  additions: number;
4
4
  deletions: number;
5
5
  }
6
+ export declare function countUnifiedDiffStats(diff: string): {
7
+ additions: number;
8
+ deletions: number;
9
+ };
6
10
  export declare function countGitChangeDiffStats(diff: GitChangeDiff & {
7
11
  diff?: string;
8
12
  }): GitDiffLineStats;
@@ -1,7 +1,17 @@
1
1
  //#region src/utils/git-diff-stats.ts
2
2
  function e(e) {
3
- let t = 0, n = 0;
4
- for (let r of e.split("\n")) r.startsWith("+++") || r.startsWith("---") || r.startsWith("@@") || (r.startsWith("+") ? t += 1 : r.startsWith("-") && (n += 1));
3
+ let t = 0, n = 0, r = !1;
4
+ for (let i of e.split("\n")) {
5
+ if (i.startsWith("diff --git") || i.startsWith("index ")) {
6
+ r = !1;
7
+ continue;
8
+ }
9
+ if (i.startsWith("@@")) {
10
+ r = !0;
11
+ continue;
12
+ }
13
+ !r && (i.startsWith("---") || i.startsWith("+++")) || r && (i.startsWith("+") ? t += 1 : i.startsWith("-") && (n += 1));
14
+ }
5
15
  return {
6
16
  additions: t,
7
17
  deletions: n
@@ -1 +1 @@
1
- {"version":3,"file":"git-diff-stats.js","names":[],"sources":["../../src/utils/git-diff-stats.ts"],"sourcesContent":["import type { GitChangeDiff } from \"#/api/open-hands.types\";\n\nexport interface GitDiffLineStats {\n additions: number;\n deletions: number;\n}\n\nfunction countUnifiedDiffStats(diff: string): GitDiffLineStats {\n let additions = 0;\n let deletions = 0;\n\n for (const line of diff.split(\"\\n\")) {\n if (\n line.startsWith(\"+++\") ||\n line.startsWith(\"---\") ||\n line.startsWith(\"@@\")\n ) {\n continue;\n }\n if (line.startsWith(\"+\")) {\n additions += 1;\n } else if (line.startsWith(\"-\")) {\n deletions += 1;\n }\n }\n\n return { additions, deletions };\n}\n\nfunction countTextDiffStats(\n original: string,\n modified: string,\n): GitDiffLineStats {\n const originalLines = original.length === 0 ? [] : original.split(\"\\n\");\n const modifiedLines = modified.length === 0 ? [] : modified.split(\"\\n\");\n\n if (originalLines.length === 0) {\n return { additions: modifiedLines.length, deletions: 0 };\n }\n\n if (modifiedLines.length === 0) {\n return { additions: 0, deletions: originalLines.length };\n }\n\n let additions = 0;\n let deletions = 0;\n let originalIndex = 0;\n let modifiedIndex = 0;\n\n while (\n originalIndex < originalLines.length ||\n modifiedIndex < modifiedLines.length\n ) {\n const originalLine = originalLines[originalIndex];\n const modifiedLine = modifiedLines[modifiedIndex];\n\n if (\n originalIndex < originalLines.length &&\n modifiedIndex < modifiedLines.length &&\n originalLine === modifiedLine\n ) {\n originalIndex += 1;\n modifiedIndex += 1;\n continue;\n }\n\n if (\n modifiedIndex < modifiedLines.length &&\n (originalIndex >= originalLines.length ||\n !originalLines.slice(originalIndex).includes(modifiedLine))\n ) {\n additions += 1;\n modifiedIndex += 1;\n continue;\n }\n\n if (originalIndex < originalLines.length) {\n deletions += 1;\n originalIndex += 1;\n }\n }\n\n return { additions, deletions };\n}\n\nexport function countGitChangeDiffStats(\n diff: GitChangeDiff & { diff?: string },\n): GitDiffLineStats {\n if (typeof diff.diff === \"string\" && diff.diff.length > 0) {\n return countUnifiedDiffStats(diff.diff);\n }\n\n return countTextDiffStats(diff.original ?? \"\", diff.modified ?? \"\");\n}\n\nexport function sumGitDiffLineStats(\n stats: GitDiffLineStats[],\n): GitDiffLineStats {\n return stats.reduce(\n (totals, stat) => ({\n additions: totals.additions + stat.additions,\n deletions: totals.deletions + stat.deletions,\n }),\n { additions: 0, deletions: 0 },\n );\n}\n"],"mappings":";AAOA,SAAS,EAAsB,GAAgC;CAC7D,IAAI,IAAY,GACZ,IAAY;CAEhB,KAAK,IAAM,KAAQ,EAAK,MAAM,IAAI,GAE9B,EAAK,WAAW,KAAK,KACrB,EAAK,WAAW,KAAK,KACrB,EAAK,WAAW,IAAI,MAIlB,EAAK,WAAW,GAAG,IACrB,KAAa,IACJ,EAAK,WAAW,GAAG,MAC5B,KAAa;CAIjB,OAAO;EAAE;EAAW;CAAU;AAChC;AAEA,SAAS,EACP,GACA,GACkB;CAClB,IAAM,IAAgB,EAAS,WAAW,IAAI,CAAC,IAAI,EAAS,MAAM,IAAI,GAChE,IAAgB,EAAS,WAAW,IAAI,CAAC,IAAI,EAAS,MAAM,IAAI;CAEtE,IAAI,EAAc,WAAW,GAC3B,OAAO;EAAE,WAAW,EAAc;EAAQ,WAAW;CAAE;CAGzD,IAAI,EAAc,WAAW,GAC3B,OAAO;EAAE,WAAW;EAAG,WAAW,EAAc;CAAO;CAGzD,IAAI,IAAY,GACZ,IAAY,GACZ,IAAgB,GAChB,IAAgB;CAEpB,OACE,IAAgB,EAAc,UAC9B,IAAgB,EAAc,SAC9B;EACA,IAAM,IAAe,EAAc,IAC7B,IAAe,EAAc;EAEnC,IACE,IAAgB,EAAc,UAC9B,IAAgB,EAAc,UAC9B,MAAiB,GACjB;GAEA,AADA,KAAiB,GACjB,KAAiB;GACjB;EACF;EAEA,IACE,IAAgB,EAAc,WAC7B,KAAiB,EAAc,UAC9B,CAAC,EAAc,MAAM,CAAa,EAAE,SAAS,CAAY,IAC3D;GAEA,AADA,KAAa,GACb,KAAiB;GACjB;EACF;EAEA,AAAI,IAAgB,EAAc,WAChC,KAAa,GACb,KAAiB;CAErB;CAEA,OAAO;EAAE;EAAW;CAAU;AAChC;AAEA,SAAgB,EACd,GACkB;CAKlB,OAJI,OAAO,EAAK,QAAS,YAAY,EAAK,KAAK,SAAS,IAC/C,EAAsB,EAAK,IAAI,IAGjC,EAAmB,EAAK,YAAY,IAAI,EAAK,YAAY,EAAE;AACpE;AAEA,SAAgB,EACd,GACkB;CAClB,OAAO,EAAM,QACV,GAAQ,OAAU;EACjB,WAAW,EAAO,YAAY,EAAK;EACnC,WAAW,EAAO,YAAY,EAAK;CACrC,IACA;EAAE,WAAW;EAAG,WAAW;CAAE,CAC/B;AACF"}
1
+ {"version":3,"file":"git-diff-stats.js","names":[],"sources":["../../src/utils/git-diff-stats.ts"],"sourcesContent":["import type { GitChangeDiff } from \"#/api/open-hands.types\";\n\nexport interface GitDiffLineStats {\n additions: number;\n deletions: number;\n}\n\nexport function countUnifiedDiffStats(diff: string): {\n additions: number;\n deletions: number;\n} {\n let additions = 0;\n let deletions = 0;\n let inHunk = false;\n\n for (const line of diff.split(\"\\n\")) {\n if (line.startsWith(\"diff --git\") || line.startsWith(\"index \")) {\n inHunk = false;\n continue;\n }\n\n if (line.startsWith(\"@@\")) {\n inHunk = true;\n continue;\n }\n\n if (!inHunk) {\n if (line.startsWith(\"---\") || line.startsWith(\"+++\")) {\n continue;\n }\n }\n\n if (inHunk) {\n if (line.startsWith(\"+\")) {\n additions += 1;\n } else if (line.startsWith(\"-\")) {\n deletions += 1;\n }\n }\n }\n\n return { additions, deletions };\n}\n\nfunction countTextDiffStats(\n original: string,\n modified: string,\n): GitDiffLineStats {\n const originalLines = original.length === 0 ? [] : original.split(\"\\n\");\n const modifiedLines = modified.length === 0 ? [] : modified.split(\"\\n\");\n\n if (originalLines.length === 0) {\n return { additions: modifiedLines.length, deletions: 0 };\n }\n\n if (modifiedLines.length === 0) {\n return { additions: 0, deletions: originalLines.length };\n }\n\n let additions = 0;\n let deletions = 0;\n let originalIndex = 0;\n let modifiedIndex = 0;\n\n while (\n originalIndex < originalLines.length ||\n modifiedIndex < modifiedLines.length\n ) {\n const originalLine = originalLines[originalIndex];\n const modifiedLine = modifiedLines[modifiedIndex];\n\n if (\n originalIndex < originalLines.length &&\n modifiedIndex < modifiedLines.length &&\n originalLine === modifiedLine\n ) {\n originalIndex += 1;\n modifiedIndex += 1;\n continue;\n }\n\n if (\n modifiedIndex < modifiedLines.length &&\n (originalIndex >= originalLines.length ||\n !originalLines.slice(originalIndex).includes(modifiedLine))\n ) {\n additions += 1;\n modifiedIndex += 1;\n continue;\n }\n\n if (originalIndex < originalLines.length) {\n deletions += 1;\n originalIndex += 1;\n }\n }\n\n return { additions, deletions };\n}\n\nexport function countGitChangeDiffStats(\n diff: GitChangeDiff & { diff?: string },\n): GitDiffLineStats {\n if (typeof diff.diff === \"string\" && diff.diff.length > 0) {\n return countUnifiedDiffStats(diff.diff);\n }\n\n return countTextDiffStats(diff.original ?? \"\", diff.modified ?? \"\");\n}\n\nexport function sumGitDiffLineStats(\n stats: GitDiffLineStats[],\n): GitDiffLineStats {\n return stats.reduce(\n (totals, stat) => ({\n additions: totals.additions + stat.additions,\n deletions: totals.deletions + stat.deletions,\n }),\n { additions: 0, deletions: 0 },\n );\n}\n"],"mappings":";AAOA,SAAgB,EAAsB,GAGpC;CACA,IAAI,IAAY,GACZ,IAAY,GACZ,IAAS;CAEb,KAAK,IAAM,KAAQ,EAAK,MAAM,IAAI,GAAG;EACnC,IAAI,EAAK,WAAW,YAAY,KAAK,EAAK,WAAW,QAAQ,GAAG;GAC9D,IAAS;GACT;EACF;EAEA,IAAI,EAAK,WAAW,IAAI,GAAG;GACzB,IAAS;GACT;EACF;EAEI,CAAC,MACC,EAAK,WAAW,KAAK,KAAK,EAAK,WAAW,KAAK,MAKjD,MACE,EAAK,WAAW,GAAG,IACrB,KAAa,IACJ,EAAK,WAAW,GAAG,MAC5B,KAAa;CAGnB;CAEA,OAAO;EAAE;EAAW;CAAU;AAChC;AAEA,SAAS,EACP,GACA,GACkB;CAClB,IAAM,IAAgB,EAAS,WAAW,IAAI,CAAC,IAAI,EAAS,MAAM,IAAI,GAChE,IAAgB,EAAS,WAAW,IAAI,CAAC,IAAI,EAAS,MAAM,IAAI;CAEtE,IAAI,EAAc,WAAW,GAC3B,OAAO;EAAE,WAAW,EAAc;EAAQ,WAAW;CAAE;CAGzD,IAAI,EAAc,WAAW,GAC3B,OAAO;EAAE,WAAW;EAAG,WAAW,EAAc;CAAO;CAGzD,IAAI,IAAY,GACZ,IAAY,GACZ,IAAgB,GAChB,IAAgB;CAEpB,OACE,IAAgB,EAAc,UAC9B,IAAgB,EAAc,SAC9B;EACA,IAAM,IAAe,EAAc,IAC7B,IAAe,EAAc;EAEnC,IACE,IAAgB,EAAc,UAC9B,IAAgB,EAAc,UAC9B,MAAiB,GACjB;GAEA,AADA,KAAiB,GACjB,KAAiB;GACjB;EACF;EAEA,IACE,IAAgB,EAAc,WAC7B,KAAiB,EAAc,UAC9B,CAAC,EAAc,MAAM,CAAa,EAAE,SAAS,CAAY,IAC3D;GAEA,AADA,KAAa,GACb,KAAiB;GACjB;EACF;EAEA,AAAI,IAAgB,EAAc,WAChC,KAAa,GACb,KAAiB;CAErB;CAEA,OAAO;EAAE;EAAW;CAAU;AAChC;AAEA,SAAgB,EACd,GACkB;CAKlB,OAJI,OAAO,EAAK,QAAS,YAAY,EAAK,KAAK,SAAS,IAC/C,EAAsB,EAAK,IAAI,IAGjC,EAAmB,EAAK,YAAY,IAAI,EAAK,YAAY,EAAE;AACpE;AAEA,SAAgB,EACd,GACkB;CAClB,OAAO,EAAM,QACV,GAAQ,OAAU;EACjB,WAAW,EAAO,YAAY,EAAK;EACnC,WAAW,EAAO,YAAY,EAAK;CACrC,IACA;EAAE,WAAW;EAAG,WAAW;CAAE,CAC/B;AACF"}
@@ -1,2 +1,2 @@
1
- require("../_virtual/_rolldown/runtime.cjs");var e=e=>{let t=e.match(/^\/workspace\/[^/]+\/(.*)$/);return t?t[1]:e},t=e=>{let t=e.trim();if(!t)return``;let n=t.replace(/[\\/]+$/,``);if(!n||/^[A-Za-z]:$/.test(n))return``;let r=Math.max(n.lastIndexOf(`/`),n.lastIndexOf(`\\`));return r>=0?n.slice(r+1):n};exports.getPathBasename=t,exports.stripWorkspacePrefix=e;
1
+ require("../_virtual/_rolldown/runtime.cjs");const e=require("../api/agent-server-config.cjs");var t=e=>{let t=e.match(/^\/workspace\/[^/]+\/(.*)$/);return t?t[1]:e};function n(e){let t=e.trim().replace(/\\/g,`/`).replace(/\/+$/,``);return t?t.startsWith(`/`)||/^[A-Za-z]:(\/|$)/.test(t)?t:`/${t}`:``}var r=(r,i)=>{let a=r.trim().replace(/\\/g,`/`);if(!a)return``;a=a.replace(/:(\d+)(-\d+)?$/,``);let o=[i,e.DEFAULT_WORKING_DIR].filter(e=>!!e?.trim());for(let e of o){let t=n(e);if(t){if(a===t)return``;if(a.startsWith(`${t}/`))return a.slice(t.length+1)}}return a.startsWith(`/`)?t(a).replace(/^\.\//,``):a.replace(/^\.\//,``)},i=/\.(md|txt|ts|tsx|js|jsx|mjs|cjs|py|json|html?|css|scss|ya?ml|toml|rs|go|java|kt|swift|c|cc|cpp|h|hpp|sh|bash|zsh|sql|xml|svg|pdf|env|rb|php|vue|svelte|lock|ini|cfg|docx?|xlsx?|pptx?|odt|rtf)$/i,a=e=>{let t=e.trim();if(!t||/\s/.test(t)||/^https?:\/\//i.test(t))return!1;let n=t.replace(/\\/g,`/`).replace(/^\.\//,``);if(n=n.replace(/:(\d+)(-\d+)?$/,``),/^(application|audio|image|text|video|font|multipart|message|model)\/[\w.+-]+$/i.test(n)||/^v?\d+(\.\d+){1,3}([-+][\w.]+)?$/i.test(n))return!1;let r=n.includes(`/`)?n.split(`/`).pop()??``:n;return i.test(r)},o=e=>{let t=e.trim();if(!t)return``;let n=t.replace(/[\\/]+$/,``);if(!n||/^[A-Za-z]:$/.test(n))return``;let r=Math.max(n.lastIndexOf(`/`),n.lastIndexOf(`\\`));return r>=0?n.slice(r+1):n};exports.getPathBasename=o,exports.looksLikeWorkspaceFilePath=a,exports.stripWorkspacePrefix=t,exports.toFilesTabPath=r;
2
2
  //# sourceMappingURL=path-utils.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"path-utils.cjs","names":[],"sources":["../../src/utils/path-utils.ts"],"sourcesContent":["/**\n * Path manipulation utilities\n */\n\n/**\n * Strip workspace prefix from file paths\n * Removes /workspace/ and the next directory level from paths\n *\n * @param path - The file path to process\n * @returns The path with workspace prefix removed\n *\n * @example\n * stripWorkspacePrefix(\"/workspace/repo/src/file.py\") // returns \"src/file.py\"\n * stripWorkspacePrefix(\"/workspace/my-project/components/Button.tsx\") // returns \"components/Button.tsx\"\n */\nexport const stripWorkspacePrefix = (path: string): string => {\n // Strip /workspace/ and the next directory level\n const workspaceMatch = path.match(/^\\/workspace\\/[^/]+\\/(.*)$/);\n return workspaceMatch ? workspaceMatch[1] : path;\n};\n\n/**\n * Returns the basename (top-level folder/file name) from a path string,\n * tolerating POSIX and Windows separators and trailing slashes.\n */\nexport const getPathBasename = (path: string): string => {\n const trimmed = path.trim();\n if (!trimmed) return \"\";\n\n const normalized = trimmed.replace(/[\\\\/]+$/, \"\");\n if (!normalized || /^[A-Za-z]:$/.test(normalized)) return \"\";\n\n const idx = Math.max(\n normalized.lastIndexOf(\"/\"),\n normalized.lastIndexOf(\"\\\\\"),\n );\n return idx >= 0 ? normalized.slice(idx + 1) : normalized;\n};\n"],"mappings":"6CAeA,IAAa,EAAwB,GAAyB,CAE5D,IAAM,EAAiB,EAAK,MAAM,4BAA4B,EAC9D,OAAO,EAAiB,EAAe,GAAK,CAC9C,EAMa,EAAmB,GAAyB,CACvD,IAAM,EAAU,EAAK,KAAK,EAC1B,GAAI,CAAC,EAAS,MAAO,GAErB,IAAM,EAAa,EAAQ,QAAQ,UAAW,EAAE,EAChD,GAAI,CAAC,GAAc,cAAc,KAAK,CAAU,EAAG,MAAO,GAE1D,IAAM,EAAM,KAAK,IACf,EAAW,YAAY,GAAG,EAC1B,EAAW,YAAY,IAAI,CAC7B,EACA,OAAO,GAAO,EAAI,EAAW,MAAM,EAAM,CAAC,EAAI,CAChD"}
1
+ {"version":3,"file":"path-utils.cjs","names":[],"sources":["../../src/utils/path-utils.ts"],"sourcesContent":["/**\n * Path manipulation utilities\n */\nimport { DEFAULT_WORKING_DIR } from \"#/api/agent-server-config\";\n\n/**\n * Strip workspace prefix from file paths\n * Removes /workspace/ and the next directory level from paths\n *\n * @param path - The file path to process\n * @returns The path with workspace prefix removed\n *\n * @example\n * stripWorkspacePrefix(\"/workspace/repo/src/file.py\") // returns \"src/file.py\"\n * stripWorkspacePrefix(\"/workspace/my-project/components/Button.tsx\") // returns \"components/Button.tsx\"\n */\nexport const stripWorkspacePrefix = (path: string): string => {\n // Strip /workspace/ and the next directory level\n const workspaceMatch = path.match(/^\\/workspace\\/[^/]+\\/(.*)$/);\n return workspaceMatch ? workspaceMatch[1] : path;\n};\n\nfunction normalizeWorkspaceRoot(root: string): string {\n const trimmed = root.trim().replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n if (!trimmed) return \"\";\n // Keep Windows drive roots (`C:` / `C:/repo`) and POSIX absolutes as-is.\n if (trimmed.startsWith(\"/\") || /^[A-Za-z]:(\\/|$)/.test(trimmed)) {\n return trimmed;\n }\n return `/${trimmed}`;\n}\n\n/**\n * Convert an agent/chat file path into a workspace-relative path for the Files\n * drawer / workspace file APIs.\n *\n * Strips editor `:line` / `:start-end` suffixes, then removes the conversation\n * working directory (or `DEFAULT_WORKING_DIR`) when present as a prefix.\n * Nested roots must match `workingDir` first — the generic `/workspace/<name>/`\n * heuristic is only a fallback when no root matches.\n */\nexport const toFilesTabPath = (\n path: string,\n workingDir?: string | null,\n): string => {\n let result = path.trim().replace(/\\\\/g, \"/\");\n if (!result) return \"\";\n\n // Strip editor `:12` / `:12-40` suffixes. Safe on Windows paths too —\n // the drive colon is at the start (`C:`), never at the end.\n result = result.replace(/:(\\d+)(-\\d+)?$/, \"\");\n\n const roots = [workingDir, DEFAULT_WORKING_DIR].filter(\n (value): value is string => Boolean(value?.trim()),\n );\n\n for (const root of roots) {\n const normalizedRoot = normalizeWorkspaceRoot(root);\n if (!normalizedRoot) continue;\n if (result === normalizedRoot) {\n return \"\";\n }\n if (result.startsWith(`${normalizedRoot}/`)) {\n return result.slice(normalizedRoot.length + 1);\n }\n }\n\n if (!result.startsWith(\"/\")) {\n return result.replace(/^\\.\\//, \"\");\n }\n\n return stripWorkspacePrefix(result).replace(/^\\.\\//, \"\");\n};\n\nconst WORKSPACE_FILE_EXTENSION =\n /\\.(md|txt|ts|tsx|js|jsx|mjs|cjs|py|json|html?|css|scss|ya?ml|toml|rs|go|java|kt|swift|c|cc|cpp|h|hpp|sh|bash|zsh|sql|xml|svg|pdf|env|rb|php|vue|svelte|lock|ini|cfg|docx?|xlsx?|pptx?|odt|rtf)$/i;\n\n/**\n * Conservative check for inline chat tokens that should open in Files.\n * Rejects URLs, MIME types, versions, and dotted identifiers like `console.log`.\n */\nexport const looksLikeWorkspaceFilePath = (text: string): boolean => {\n const trimmed = text.trim();\n if (!trimmed || /\\s/.test(trimmed) || /^https?:\\/\\//i.test(trimmed)) {\n return false;\n }\n\n let path = trimmed.replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\");\n path = path.replace(/:(\\d+)(-\\d+)?$/, \"\");\n\n if (\n /^(application|audio|image|text|video|font|multipart|message|model)\\/[\\w.+-]+$/i.test(\n path,\n )\n ) {\n return false;\n }\n if (/^v?\\d+(\\.\\d+){1,3}([-+][\\w.]+)?$/i.test(path)) {\n return false;\n }\n\n const lastSegment = path.includes(\"/\") ? (path.split(\"/\").pop() ?? \"\") : path;\n return WORKSPACE_FILE_EXTENSION.test(lastSegment);\n};\n\n/**\n * Returns the basename (top-level folder/file name) from a path string,\n * tolerating POSIX and Windows separators and trailing slashes.\n */\nexport const getPathBasename = (path: string): string => {\n const trimmed = path.trim();\n if (!trimmed) return \"\";\n\n const normalized = trimmed.replace(/[\\\\/]+$/, \"\");\n if (!normalized || /^[A-Za-z]:$/.test(normalized)) return \"\";\n\n const idx = Math.max(\n normalized.lastIndexOf(\"/\"),\n normalized.lastIndexOf(\"\\\\\"),\n );\n return idx >= 0 ? normalized.slice(idx + 1) : normalized;\n};\n"],"mappings":"+FAgBA,IAAa,EAAwB,GAAyB,CAE5D,IAAM,EAAiB,EAAK,MAAM,4BAA4B,EAC9D,OAAO,EAAiB,EAAe,GAAK,CAC9C,EAEA,SAAS,EAAuB,EAAsB,CACpD,IAAM,EAAU,EAAK,KAAK,EAAE,QAAQ,MAAO,GAAG,EAAE,QAAQ,OAAQ,EAAE,EAMlE,OALK,EAED,EAAQ,WAAW,GAAG,GAAK,mBAAmB,KAAK,CAAO,EACrD,EAEF,IAAI,IALU,EAMvB,CAWA,IAAa,GACX,EACA,IACW,CACX,IAAI,EAAS,EAAK,KAAK,EAAE,QAAQ,MAAO,GAAG,EAC3C,GAAI,CAAC,EAAQ,MAAO,GAIpB,EAAS,EAAO,QAAQ,iBAAkB,EAAE,EAE5C,IAAM,EAAQ,CAAC,EAAY,EAAA,mBAAmB,EAAE,OAC7C,GAA2B,EAAQ,GAAO,KAAK,CAClD,EAEA,IAAK,IAAM,KAAQ,EAAO,CACxB,IAAM,EAAiB,EAAuB,CAAI,EAC7C,KACL,IAAI,IAAW,EACb,MAAO,GAET,GAAI,EAAO,WAAW,GAAG,EAAe,EAAE,EACxC,OAAO,EAAO,MAAM,EAAe,OAAS,CAAC,CAHtC,CAKX,CAMA,OAJK,EAAO,WAAW,GAAG,EAInB,EAAqB,CAAM,EAAE,QAAQ,QAAS,EAAE,EAH9C,EAAO,QAAQ,QAAS,EAAE,CAIrC,EAEM,EACJ,mMAMW,EAA8B,GAA0B,CACnE,IAAM,EAAU,EAAK,KAAK,EAC1B,GAAI,CAAC,GAAW,KAAK,KAAK,CAAO,GAAK,gBAAgB,KAAK,CAAO,EAChE,MAAO,GAGT,IAAI,EAAO,EAAQ,QAAQ,MAAO,GAAG,EAAE,QAAQ,QAAS,EAAE,EAU1D,GATA,EAAO,EAAK,QAAQ,iBAAkB,EAAE,EAGtC,iFAAiF,KAC/E,CACF,GAIE,oCAAoC,KAAK,CAAI,EAC/C,MAAO,GAGT,IAAM,EAAc,EAAK,SAAS,GAAG,EAAK,EAAK,MAAM,GAAG,EAAE,IAAI,GAAK,GAAM,EACzE,OAAO,EAAyB,KAAK,CAAW,CAClD,EAMa,EAAmB,GAAyB,CACvD,IAAM,EAAU,EAAK,KAAK,EAC1B,GAAI,CAAC,EAAS,MAAO,GAErB,IAAM,EAAa,EAAQ,QAAQ,UAAW,EAAE,EAChD,GAAI,CAAC,GAAc,cAAc,KAAK,CAAU,EAAG,MAAO,GAE1D,IAAM,EAAM,KAAK,IACf,EAAW,YAAY,GAAG,EAC1B,EAAW,YAAY,IAAI,CAC7B,EACA,OAAO,GAAO,EAAI,EAAW,MAAM,EAAM,CAAC,EAAI,CAChD"}
@@ -1,6 +1,3 @@
1
- /**
2
- * Path manipulation utilities
3
- */
4
1
  /**
5
2
  * Strip workspace prefix from file paths
6
3
  * Removes /workspace/ and the next directory level from paths
@@ -13,6 +10,21 @@
13
10
  * stripWorkspacePrefix("/workspace/my-project/components/Button.tsx") // returns "components/Button.tsx"
14
11
  */
15
12
  export declare const stripWorkspacePrefix: (path: string) => string;
13
+ /**
14
+ * Convert an agent/chat file path into a workspace-relative path for the Files
15
+ * drawer / workspace file APIs.
16
+ *
17
+ * Strips editor `:line` / `:start-end` suffixes, then removes the conversation
18
+ * working directory (or `DEFAULT_WORKING_DIR`) when present as a prefix.
19
+ * Nested roots must match `workingDir` first — the generic `/workspace/<name>/`
20
+ * heuristic is only a fallback when no root matches.
21
+ */
22
+ export declare const toFilesTabPath: (path: string, workingDir?: string | null) => string;
23
+ /**
24
+ * Conservative check for inline chat tokens that should open in Files.
25
+ * Rejects URLs, MIME types, versions, and dotted identifiers like `console.log`.
26
+ */
27
+ export declare const looksLikeWorkspaceFilePath: (text: string) => boolean;
16
28
  /**
17
29
  * Returns the basename (top-level folder/file name) from a path string,
18
30
  * tolerating POSIX and Windows separators and trailing slashes.
@@ -1,8 +1,34 @@
1
+ import { DEFAULT_WORKING_DIR as e } from "../api/agent-server-config.js";
1
2
  //#region src/utils/path-utils.ts
2
- var e = (e) => {
3
+ var t = (e) => {
3
4
  let t = e.match(/^\/workspace\/[^/]+\/(.*)$/);
4
5
  return t ? t[1] : e;
5
- }, t = (e) => {
6
+ };
7
+ function n(e) {
8
+ let t = e.trim().replace(/\\/g, "/").replace(/\/+$/, "");
9
+ return t ? t.startsWith("/") || /^[A-Za-z]:(\/|$)/.test(t) ? t : `/${t}` : "";
10
+ }
11
+ var r = (r, i) => {
12
+ let a = r.trim().replace(/\\/g, "/");
13
+ if (!a) return "";
14
+ a = a.replace(/:(\d+)(-\d+)?$/, "");
15
+ let o = [i, e].filter((e) => !!e?.trim());
16
+ for (let e of o) {
17
+ let t = n(e);
18
+ if (t) {
19
+ if (a === t) return "";
20
+ if (a.startsWith(`${t}/`)) return a.slice(t.length + 1);
21
+ }
22
+ }
23
+ return a.startsWith("/") ? t(a).replace(/^\.\//, "") : a.replace(/^\.\//, "");
24
+ }, i = /\.(md|txt|ts|tsx|js|jsx|mjs|cjs|py|json|html?|css|scss|ya?ml|toml|rs|go|java|kt|swift|c|cc|cpp|h|hpp|sh|bash|zsh|sql|xml|svg|pdf|env|rb|php|vue|svelte|lock|ini|cfg|docx?|xlsx?|pptx?|odt|rtf)$/i, a = (e) => {
25
+ let t = e.trim();
26
+ if (!t || /\s/.test(t) || /^https?:\/\//i.test(t)) return !1;
27
+ let n = t.replace(/\\/g, "/").replace(/^\.\//, "");
28
+ if (n = n.replace(/:(\d+)(-\d+)?$/, ""), /^(application|audio|image|text|video|font|multipart|message|model)\/[\w.+-]+$/i.test(n) || /^v?\d+(\.\d+){1,3}([-+][\w.]+)?$/i.test(n)) return !1;
29
+ let r = n.includes("/") ? n.split("/").pop() ?? "" : n;
30
+ return i.test(r);
31
+ }, o = (e) => {
6
32
  let t = e.trim();
7
33
  if (!t) return "";
8
34
  let n = t.replace(/[\\/]+$/, "");
@@ -11,6 +37,6 @@ var e = (e) => {
11
37
  return r >= 0 ? n.slice(r + 1) : n;
12
38
  };
13
39
  //#endregion
14
- export { t as getPathBasename, e as stripWorkspacePrefix };
40
+ export { o as getPathBasename, a as looksLikeWorkspaceFilePath, t as stripWorkspacePrefix, r as toFilesTabPath };
15
41
 
16
42
  //# sourceMappingURL=path-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"path-utils.js","names":[],"sources":["../../src/utils/path-utils.ts"],"sourcesContent":["/**\n * Path manipulation utilities\n */\n\n/**\n * Strip workspace prefix from file paths\n * Removes /workspace/ and the next directory level from paths\n *\n * @param path - The file path to process\n * @returns The path with workspace prefix removed\n *\n * @example\n * stripWorkspacePrefix(\"/workspace/repo/src/file.py\") // returns \"src/file.py\"\n * stripWorkspacePrefix(\"/workspace/my-project/components/Button.tsx\") // returns \"components/Button.tsx\"\n */\nexport const stripWorkspacePrefix = (path: string): string => {\n // Strip /workspace/ and the next directory level\n const workspaceMatch = path.match(/^\\/workspace\\/[^/]+\\/(.*)$/);\n return workspaceMatch ? workspaceMatch[1] : path;\n};\n\n/**\n * Returns the basename (top-level folder/file name) from a path string,\n * tolerating POSIX and Windows separators and trailing slashes.\n */\nexport const getPathBasename = (path: string): string => {\n const trimmed = path.trim();\n if (!trimmed) return \"\";\n\n const normalized = trimmed.replace(/[\\\\/]+$/, \"\");\n if (!normalized || /^[A-Za-z]:$/.test(normalized)) return \"\";\n\n const idx = Math.max(\n normalized.lastIndexOf(\"/\"),\n normalized.lastIndexOf(\"\\\\\"),\n );\n return idx >= 0 ? normalized.slice(idx + 1) : normalized;\n};\n"],"mappings":";AAeA,IAAa,KAAwB,MAAyB;CAE5D,IAAM,IAAiB,EAAK,MAAM,4BAA4B;CAC9D,OAAO,IAAiB,EAAe,KAAK;AAC9C,GAMa,KAAmB,MAAyB;CACvD,IAAM,IAAU,EAAK,KAAK;CAC1B,IAAI,CAAC,GAAS,OAAO;CAErB,IAAM,IAAa,EAAQ,QAAQ,WAAW,EAAE;CAChD,IAAI,CAAC,KAAc,cAAc,KAAK,CAAU,GAAG,OAAO;CAE1D,IAAM,IAAM,KAAK,IACf,EAAW,YAAY,GAAG,GAC1B,EAAW,YAAY,IAAI,CAC7B;CACA,OAAO,KAAO,IAAI,EAAW,MAAM,IAAM,CAAC,IAAI;AAChD"}
1
+ {"version":3,"file":"path-utils.js","names":[],"sources":["../../src/utils/path-utils.ts"],"sourcesContent":["/**\n * Path manipulation utilities\n */\nimport { DEFAULT_WORKING_DIR } from \"#/api/agent-server-config\";\n\n/**\n * Strip workspace prefix from file paths\n * Removes /workspace/ and the next directory level from paths\n *\n * @param path - The file path to process\n * @returns The path with workspace prefix removed\n *\n * @example\n * stripWorkspacePrefix(\"/workspace/repo/src/file.py\") // returns \"src/file.py\"\n * stripWorkspacePrefix(\"/workspace/my-project/components/Button.tsx\") // returns \"components/Button.tsx\"\n */\nexport const stripWorkspacePrefix = (path: string): string => {\n // Strip /workspace/ and the next directory level\n const workspaceMatch = path.match(/^\\/workspace\\/[^/]+\\/(.*)$/);\n return workspaceMatch ? workspaceMatch[1] : path;\n};\n\nfunction normalizeWorkspaceRoot(root: string): string {\n const trimmed = root.trim().replace(/\\\\/g, \"/\").replace(/\\/+$/, \"\");\n if (!trimmed) return \"\";\n // Keep Windows drive roots (`C:` / `C:/repo`) and POSIX absolutes as-is.\n if (trimmed.startsWith(\"/\") || /^[A-Za-z]:(\\/|$)/.test(trimmed)) {\n return trimmed;\n }\n return `/${trimmed}`;\n}\n\n/**\n * Convert an agent/chat file path into a workspace-relative path for the Files\n * drawer / workspace file APIs.\n *\n * Strips editor `:line` / `:start-end` suffixes, then removes the conversation\n * working directory (or `DEFAULT_WORKING_DIR`) when present as a prefix.\n * Nested roots must match `workingDir` first — the generic `/workspace/<name>/`\n * heuristic is only a fallback when no root matches.\n */\nexport const toFilesTabPath = (\n path: string,\n workingDir?: string | null,\n): string => {\n let result = path.trim().replace(/\\\\/g, \"/\");\n if (!result) return \"\";\n\n // Strip editor `:12` / `:12-40` suffixes. Safe on Windows paths too —\n // the drive colon is at the start (`C:`), never at the end.\n result = result.replace(/:(\\d+)(-\\d+)?$/, \"\");\n\n const roots = [workingDir, DEFAULT_WORKING_DIR].filter(\n (value): value is string => Boolean(value?.trim()),\n );\n\n for (const root of roots) {\n const normalizedRoot = normalizeWorkspaceRoot(root);\n if (!normalizedRoot) continue;\n if (result === normalizedRoot) {\n return \"\";\n }\n if (result.startsWith(`${normalizedRoot}/`)) {\n return result.slice(normalizedRoot.length + 1);\n }\n }\n\n if (!result.startsWith(\"/\")) {\n return result.replace(/^\\.\\//, \"\");\n }\n\n return stripWorkspacePrefix(result).replace(/^\\.\\//, \"\");\n};\n\nconst WORKSPACE_FILE_EXTENSION =\n /\\.(md|txt|ts|tsx|js|jsx|mjs|cjs|py|json|html?|css|scss|ya?ml|toml|rs|go|java|kt|swift|c|cc|cpp|h|hpp|sh|bash|zsh|sql|xml|svg|pdf|env|rb|php|vue|svelte|lock|ini|cfg|docx?|xlsx?|pptx?|odt|rtf)$/i;\n\n/**\n * Conservative check for inline chat tokens that should open in Files.\n * Rejects URLs, MIME types, versions, and dotted identifiers like `console.log`.\n */\nexport const looksLikeWorkspaceFilePath = (text: string): boolean => {\n const trimmed = text.trim();\n if (!trimmed || /\\s/.test(trimmed) || /^https?:\\/\\//i.test(trimmed)) {\n return false;\n }\n\n let path = trimmed.replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\");\n path = path.replace(/:(\\d+)(-\\d+)?$/, \"\");\n\n if (\n /^(application|audio|image|text|video|font|multipart|message|model)\\/[\\w.+-]+$/i.test(\n path,\n )\n ) {\n return false;\n }\n if (/^v?\\d+(\\.\\d+){1,3}([-+][\\w.]+)?$/i.test(path)) {\n return false;\n }\n\n const lastSegment = path.includes(\"/\") ? (path.split(\"/\").pop() ?? \"\") : path;\n return WORKSPACE_FILE_EXTENSION.test(lastSegment);\n};\n\n/**\n * Returns the basename (top-level folder/file name) from a path string,\n * tolerating POSIX and Windows separators and trailing slashes.\n */\nexport const getPathBasename = (path: string): string => {\n const trimmed = path.trim();\n if (!trimmed) return \"\";\n\n const normalized = trimmed.replace(/[\\\\/]+$/, \"\");\n if (!normalized || /^[A-Za-z]:$/.test(normalized)) return \"\";\n\n const idx = Math.max(\n normalized.lastIndexOf(\"/\"),\n normalized.lastIndexOf(\"\\\\\"),\n );\n return idx >= 0 ? normalized.slice(idx + 1) : normalized;\n};\n"],"mappings":";;AAgBA,IAAa,KAAwB,MAAyB;CAE5D,IAAM,IAAiB,EAAK,MAAM,4BAA4B;CAC9D,OAAO,IAAiB,EAAe,KAAK;AAC9C;AAEA,SAAS,EAAuB,GAAsB;CACpD,IAAM,IAAU,EAAK,KAAK,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,QAAQ,EAAE;CAMlE,OALK,IAED,EAAQ,WAAW,GAAG,KAAK,mBAAmB,KAAK,CAAO,IACrD,IAEF,IAAI,MALU;AAMvB;AAWA,IAAa,KACX,GACA,MACW;CACX,IAAI,IAAS,EAAK,KAAK,EAAE,QAAQ,OAAO,GAAG;CAC3C,IAAI,CAAC,GAAQ,OAAO;CAIpB,IAAS,EAAO,QAAQ,kBAAkB,EAAE;CAE5C,IAAM,IAAQ,CAAC,GAAY,CAAmB,EAAE,QAC7C,MAA2B,EAAQ,GAAO,KAAK,CAClD;CAEA,KAAK,IAAM,KAAQ,GAAO;EACxB,IAAM,IAAiB,EAAuB,CAAI;EAC7C,OACL;OAAI,MAAW,GACb,OAAO;GAET,IAAI,EAAO,WAAW,GAAG,EAAe,EAAE,GACxC,OAAO,EAAO,MAAM,EAAe,SAAS,CAAC;EAHtC;CAKX;CAMA,OAJK,EAAO,WAAW,GAAG,IAInB,EAAqB,CAAM,EAAE,QAAQ,SAAS,EAAE,IAH9C,EAAO,QAAQ,SAAS,EAAE;AAIrC,GAEM,IACJ,oMAMW,KAA8B,MAA0B;CACnE,IAAM,IAAU,EAAK,KAAK;CAC1B,IAAI,CAAC,KAAW,KAAK,KAAK,CAAO,KAAK,gBAAgB,KAAK,CAAO,GAChE,OAAO;CAGT,IAAI,IAAO,EAAQ,QAAQ,OAAO,GAAG,EAAE,QAAQ,SAAS,EAAE;CAU1D,IATA,IAAO,EAAK,QAAQ,kBAAkB,EAAE,GAGtC,iFAAiF,KAC/E,CACF,KAIE,oCAAoC,KAAK,CAAI,GAC/C,OAAO;CAGT,IAAM,IAAc,EAAK,SAAS,GAAG,IAAK,EAAK,MAAM,GAAG,EAAE,IAAI,KAAK,KAAM;CACzE,OAAO,EAAyB,KAAK,CAAW;AAClD,GAMa,KAAmB,MAAyB;CACvD,IAAM,IAAU,EAAK,KAAK;CAC1B,IAAI,CAAC,GAAS,OAAO;CAErB,IAAM,IAAa,EAAQ,QAAQ,WAAW,EAAE;CAChD,IAAI,CAAC,KAAc,cAAc,KAAK,CAAU,GAAG,OAAO;CAE1D,IAAM,IAAM,KAAK,IACf,EAAW,YAAY,GAAG,GAC1B,EAAW,YAAY,IAAI,CAC7B;CACA,OAAO,KAAO,IAAI,EAAW,MAAM,IAAM,CAAC,IAAI;AAChD"}
@@ -0,0 +1,4 @@
1
+ require("../_virtual/_rolldown/runtime.cjs");var e=`.agents_tmp/PLAN.md`,t=`system_prompt_planning.j2`,n=`planning_file_editor`,r=`plannerparent`,i=`PLAN.MD`,a=[`The plan must follow this structure exactly:`,``,`1. OBJECTIVE`,` * Summarize the goal of the plan in one or two sentences.`,` * Restate the problem in clear operational terms.`,``,`2. CONTEXT SUMMARY`,` * Briefly describe the relevant system components, files, or data involved.`,` * Mention any dependencies or constraints (technical, organizational, or external).`,``,`3. APPROACH OVERVIEW`,` * Outline the chosen approach at a high level.`,` * Mention why it was selected (short rationale) if alternatives were considered.`,``,`4. IMPLEMENTATION STEPS`,` * Provide a step-by-step plan for execution.`,` * Each step should include:`,` - a **goal** (what this step accomplishes),`,` - a **method** (how to do it, briefly),`,` - and optionally a **reference** (file, module, or function impacted).`,``,`5. TESTING AND VALIDATION`,` * Describe how the implementation can be verified or validated.`,` * This section should describe what success looks like — expected outputs, behaviors, or conditions.`].join(`
2
+ `),o=[`<IMPORTANT_PLANNING_BOUNDARIES>`,`You are a Planning Agent that can ONLY create plans - you CANNOT execute code or make changes.`,``,`Create or update the plan for the current task in the configured PLAN.md file.`,``,`After you finalize the plan in PLAN.md:`,`- Do NOT ask "Ready to proceed?" or offer to execute the plan`,`- Do NOT attempt to run any implementation commands`,`- Instead, tell the user they can click the **Build** button below the plan preview to switch to the code agent and execute the plan.`,``,`Your role ends when the plan is finalized. Implementation is handled by the code agent.`,`</IMPORTANT_PLANNING_BOUNDARIES>`].join(`
3
+ `);function s(t){return`${t.replace(/\/+$/,``)}/${e}`}function c(e){if(!e)return!1;let t=e.replace(/\\/g,`/`).toUpperCase();return t===i||t.endsWith(`/${i}`)}function l(e,t){return e?.tags?.[r]===t}function u(e,t){return t?e?.find(e=>l(e,t))?.id??null:null}exports.LOCAL_PLANNER_PARENT_TAG_KEY=r,exports.PLANNING_AGENT_INSTRUCTION=o,exports.PLANNING_FILE_EDITOR_TOOL_NAME=n,exports.PLANNING_SYSTEM_PROMPT_FILENAME=t,exports.PLAN_STRUCTURE_TEXT=a,exports.buildPlanPath=s,exports.findPlannerConversationId=u,exports.isPlanFilePath=c,exports.isPlannerConversationOf=l;
4
+ //# sourceMappingURL=plan-file.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-file.cjs","names":[],"sources":["../../src/utils/plan-file.ts"],"sourcesContent":["import type { AppConversation } from \"#/api/conversation-service/agent-server-conversation-service.types\";\n\nexport const PLAN_RELATIVE_PATH = \".agents_tmp/PLAN.md\";\nexport const PLANNING_SYSTEM_PROMPT_FILENAME = \"system_prompt_planning.j2\";\nexport const PLANNING_FILE_EDITOR_TOOL_NAME = \"planning_file_editor\";\nexport const LOCAL_PLANNER_PARENT_TAG_KEY = \"plannerparent\";\n\nconst PLAN_FILENAME_UPPER = \"PLAN.MD\";\n\n// Mirrors the SDK planning preset's `format_plan_structure()` output\n// (software-agent-sdk openhands-tools/openhands/tools/preset/planning.py,\n// `PLAN_STRUCTURE`). The planning agent loads `system_prompt_planning.j2` with\n// this injected as `{{plan_structure}}`; keep it byte-identical to that SDK\n// output so the local planner matches the canonical planning agent.\nexport const PLAN_STRUCTURE_TEXT = [\n \"The plan must follow this structure exactly:\",\n \"\",\n \"1. OBJECTIVE\",\n \" * Summarize the goal of the plan in one or two sentences.\",\n \" * Restate the problem in clear operational terms.\",\n \"\",\n \"2. CONTEXT SUMMARY\",\n \" * Briefly describe the relevant system components, files, or data involved.\",\n \" * Mention any dependencies or constraints (technical, organizational, or external).\",\n \"\",\n \"3. APPROACH OVERVIEW\",\n \" * Outline the chosen approach at a high level.\",\n \" * Mention why it was selected (short rationale) if alternatives were considered.\",\n \"\",\n \"4. IMPLEMENTATION STEPS\",\n \" * Provide a step-by-step plan for execution.\",\n \" * Each step should include:\",\n \" - a **goal** (what this step accomplishes),\",\n \" - a **method** (how to do it, briefly),\",\n \" - and optionally a **reference** (file, module, or function impacted).\",\n \"\",\n \"5. TESTING AND VALIDATION\",\n \" * Describe how the implementation can be verified or validated.\",\n \" * This section should describe what success looks like — expected outputs, behaviors, or conditions.\",\n].join(\"\\n\");\n\n// System-prompt suffix for the local planning agent (mirrors the OpenHands\n// app-server's PLANNING_AGENT_INSTRUCTION). The planner's directive + boundaries\n// live in the system prompt; the planning conversation is created idle, so the\n// user types the first message themselves and nothing is injected into the chat.\nexport const PLANNING_AGENT_INSTRUCTION = [\n \"<IMPORTANT_PLANNING_BOUNDARIES>\",\n \"You are a Planning Agent that can ONLY create plans - you CANNOT execute code or make changes.\",\n \"\",\n \"Create or update the plan for the current task in the configured PLAN.md file.\",\n \"\",\n \"After you finalize the plan in PLAN.md:\",\n '- Do NOT ask \"Ready to proceed?\" or offer to execute the plan',\n \"- Do NOT attempt to run any implementation commands\",\n \"- Instead, tell the user they can click the **Build** button below the plan preview to switch to the code agent and execute the plan.\",\n \"\",\n \"Your role ends when the plan is finalized. Implementation is handled by the code agent.\",\n \"</IMPORTANT_PLANNING_BOUNDARIES>\",\n].join(\"\\n\");\n\nexport function buildPlanPath(workingDir: string): string {\n const normalized = workingDir.replace(/\\/+$/, \"\");\n return `${normalized}/${PLAN_RELATIVE_PATH}`;\n}\n\nexport function isPlanFilePath(path: string | null | undefined): boolean {\n if (!path) return false;\n const normalized = path.replace(/\\\\/g, \"/\").toUpperCase();\n return (\n normalized === PLAN_FILENAME_UPPER ||\n normalized.endsWith(`/${PLAN_FILENAME_UPPER}`)\n );\n}\n\n/**\n * Whether `conversation` is the local planner helper for `parentConversationId`\n * — identity comes from the `plannerparent` tag `createLocalPlanningConversation`\n * stamps on creation, never from list position (`sub_conversation_ids` is the\n * generic, untyped child list).\n */\nexport function isPlannerConversationOf(\n conversation: Pick<AppConversation, \"tags\"> | null | undefined,\n parentConversationId: string,\n): boolean {\n return (\n conversation?.tags?.[LOCAL_PLANNER_PARENT_TAG_KEY] === parentConversationId\n );\n}\n\n/** Finds the planner helper among a conversation's fetched sub-conversations. */\nexport function findPlannerConversationId(\n subConversations: (AppConversation | null)[] | null | undefined,\n parentConversationId: string | null | undefined,\n): string | null {\n if (!parentConversationId) return null;\n return (\n subConversations?.find((sub) =>\n isPlannerConversationOf(sub, parentConversationId),\n )?.id ?? null\n );\n}\n"],"mappings":"6CAEA,IAAa,EAAqB,sBACrB,EAAkC,4BAClC,EAAiC,uBACjC,EAA+B,gBAEtC,EAAsB,UAOf,EAAsB,CACjC,+CACA,GACA,eACA,+DACA,uDACA,GACA,qBACA,iFACA,yFACA,GACA,uBACA,oDACA,sFACA,GACA,0BACA,kDACA,iCACA,mDACA,+CACA,8EACA,GACA,4BACA,qEACA,yGACF,EAAE,KAAK;CAAI,EAME,EAA6B,CACxC,kCACA,iGACA,GACA,iFACA,GACA,0CACA,gEACA,sDACA,wIACA,GACA,0FACA,kCACF,EAAE,KAAK;CAAI,EAEX,SAAgB,EAAc,EAA4B,CAExD,MAAO,GADY,EAAW,QAAQ,OAAQ,EACpC,EAAW,GAAG,GAC1B,CAEA,SAAgB,EAAe,EAA0C,CACvE,GAAI,CAAC,EAAM,MAAO,GAClB,IAAM,EAAa,EAAK,QAAQ,MAAO,GAAG,EAAE,YAAY,EACxD,OACE,IAAe,GACf,EAAW,SAAS,IAAI,GAAqB,CAEjD,CAQA,SAAgB,EACd,EACA,EACS,CACT,OACE,GAAc,OAAO,KAAkC,CAE3D,CAGA,SAAgB,EACd,EACA,EACe,CAEf,OADK,EAEH,GAAkB,KAAM,GACtB,EAAwB,EAAK,CAAoB,CACnD,GAAG,IAAM,KAJuB,IAMpC"}
@@ -0,0 +1,18 @@
1
+ import type { AppConversation } from "#/api/conversation-service/agent-server-conversation-service.types";
2
+ export declare const PLAN_RELATIVE_PATH = ".agents_tmp/PLAN.md";
3
+ export declare const PLANNING_SYSTEM_PROMPT_FILENAME = "system_prompt_planning.j2";
4
+ export declare const PLANNING_FILE_EDITOR_TOOL_NAME = "planning_file_editor";
5
+ export declare const LOCAL_PLANNER_PARENT_TAG_KEY = "plannerparent";
6
+ export declare const PLAN_STRUCTURE_TEXT: string;
7
+ export declare const PLANNING_AGENT_INSTRUCTION: string;
8
+ export declare function buildPlanPath(workingDir: string): string;
9
+ export declare function isPlanFilePath(path: string | null | undefined): boolean;
10
+ /**
11
+ * Whether `conversation` is the local planner helper for `parentConversationId`
12
+ * — identity comes from the `plannerparent` tag `createLocalPlanningConversation`
13
+ * stamps on creation, never from list position (`sub_conversation_ids` is the
14
+ * generic, untyped child list).
15
+ */
16
+ export declare function isPlannerConversationOf(conversation: Pick<AppConversation, "tags"> | null | undefined, parentConversationId: string): boolean;
17
+ /** Finds the planner helper among a conversation's fetched sub-conversations. */
18
+ export declare function findPlannerConversationId(subConversations: (AppConversation | null)[] | null | undefined, parentConversationId: string | null | undefined): string | null;
@@ -0,0 +1,58 @@
1
+ //#region src/utils/plan-file.ts
2
+ var e = ".agents_tmp/PLAN.md", t = "system_prompt_planning.j2", n = "planning_file_editor", r = "plannerparent", i = "PLAN.MD", a = [
3
+ "The plan must follow this structure exactly:",
4
+ "",
5
+ "1. OBJECTIVE",
6
+ " * Summarize the goal of the plan in one or two sentences.",
7
+ " * Restate the problem in clear operational terms.",
8
+ "",
9
+ "2. CONTEXT SUMMARY",
10
+ " * Briefly describe the relevant system components, files, or data involved.",
11
+ " * Mention any dependencies or constraints (technical, organizational, or external).",
12
+ "",
13
+ "3. APPROACH OVERVIEW",
14
+ " * Outline the chosen approach at a high level.",
15
+ " * Mention why it was selected (short rationale) if alternatives were considered.",
16
+ "",
17
+ "4. IMPLEMENTATION STEPS",
18
+ " * Provide a step-by-step plan for execution.",
19
+ " * Each step should include:",
20
+ " - a **goal** (what this step accomplishes),",
21
+ " - a **method** (how to do it, briefly),",
22
+ " - and optionally a **reference** (file, module, or function impacted).",
23
+ "",
24
+ "5. TESTING AND VALIDATION",
25
+ " * Describe how the implementation can be verified or validated.",
26
+ " * This section should describe what success looks like — expected outputs, behaviors, or conditions."
27
+ ].join("\n"), o = [
28
+ "<IMPORTANT_PLANNING_BOUNDARIES>",
29
+ "You are a Planning Agent that can ONLY create plans - you CANNOT execute code or make changes.",
30
+ "",
31
+ "Create or update the plan for the current task in the configured PLAN.md file.",
32
+ "",
33
+ "After you finalize the plan in PLAN.md:",
34
+ "- Do NOT ask \"Ready to proceed?\" or offer to execute the plan",
35
+ "- Do NOT attempt to run any implementation commands",
36
+ "- Instead, tell the user they can click the **Build** button below the plan preview to switch to the code agent and execute the plan.",
37
+ "",
38
+ "Your role ends when the plan is finalized. Implementation is handled by the code agent.",
39
+ "</IMPORTANT_PLANNING_BOUNDARIES>"
40
+ ].join("\n");
41
+ function s(t) {
42
+ return `${t.replace(/\/+$/, "")}/${e}`;
43
+ }
44
+ function c(e) {
45
+ if (!e) return !1;
46
+ let t = e.replace(/\\/g, "/").toUpperCase();
47
+ return t === i || t.endsWith(`/${i}`);
48
+ }
49
+ function l(e, t) {
50
+ return e?.tags?.[r] === t;
51
+ }
52
+ function u(e, t) {
53
+ return t ? e?.find((e) => l(e, t))?.id ?? null : null;
54
+ }
55
+ //#endregion
56
+ export { r as LOCAL_PLANNER_PARENT_TAG_KEY, o as PLANNING_AGENT_INSTRUCTION, n as PLANNING_FILE_EDITOR_TOOL_NAME, t as PLANNING_SYSTEM_PROMPT_FILENAME, a as PLAN_STRUCTURE_TEXT, s as buildPlanPath, u as findPlannerConversationId, c as isPlanFilePath, l as isPlannerConversationOf };
57
+
58
+ //# sourceMappingURL=plan-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-file.js","names":[],"sources":["../../src/utils/plan-file.ts"],"sourcesContent":["import type { AppConversation } from \"#/api/conversation-service/agent-server-conversation-service.types\";\n\nexport const PLAN_RELATIVE_PATH = \".agents_tmp/PLAN.md\";\nexport const PLANNING_SYSTEM_PROMPT_FILENAME = \"system_prompt_planning.j2\";\nexport const PLANNING_FILE_EDITOR_TOOL_NAME = \"planning_file_editor\";\nexport const LOCAL_PLANNER_PARENT_TAG_KEY = \"plannerparent\";\n\nconst PLAN_FILENAME_UPPER = \"PLAN.MD\";\n\n// Mirrors the SDK planning preset's `format_plan_structure()` output\n// (software-agent-sdk openhands-tools/openhands/tools/preset/planning.py,\n// `PLAN_STRUCTURE`). The planning agent loads `system_prompt_planning.j2` with\n// this injected as `{{plan_structure}}`; keep it byte-identical to that SDK\n// output so the local planner matches the canonical planning agent.\nexport const PLAN_STRUCTURE_TEXT = [\n \"The plan must follow this structure exactly:\",\n \"\",\n \"1. OBJECTIVE\",\n \" * Summarize the goal of the plan in one or two sentences.\",\n \" * Restate the problem in clear operational terms.\",\n \"\",\n \"2. CONTEXT SUMMARY\",\n \" * Briefly describe the relevant system components, files, or data involved.\",\n \" * Mention any dependencies or constraints (technical, organizational, or external).\",\n \"\",\n \"3. APPROACH OVERVIEW\",\n \" * Outline the chosen approach at a high level.\",\n \" * Mention why it was selected (short rationale) if alternatives were considered.\",\n \"\",\n \"4. IMPLEMENTATION STEPS\",\n \" * Provide a step-by-step plan for execution.\",\n \" * Each step should include:\",\n \" - a **goal** (what this step accomplishes),\",\n \" - a **method** (how to do it, briefly),\",\n \" - and optionally a **reference** (file, module, or function impacted).\",\n \"\",\n \"5. TESTING AND VALIDATION\",\n \" * Describe how the implementation can be verified or validated.\",\n \" * This section should describe what success looks like — expected outputs, behaviors, or conditions.\",\n].join(\"\\n\");\n\n// System-prompt suffix for the local planning agent (mirrors the OpenHands\n// app-server's PLANNING_AGENT_INSTRUCTION). The planner's directive + boundaries\n// live in the system prompt; the planning conversation is created idle, so the\n// user types the first message themselves and nothing is injected into the chat.\nexport const PLANNING_AGENT_INSTRUCTION = [\n \"<IMPORTANT_PLANNING_BOUNDARIES>\",\n \"You are a Planning Agent that can ONLY create plans - you CANNOT execute code or make changes.\",\n \"\",\n \"Create or update the plan for the current task in the configured PLAN.md file.\",\n \"\",\n \"After you finalize the plan in PLAN.md:\",\n '- Do NOT ask \"Ready to proceed?\" or offer to execute the plan',\n \"- Do NOT attempt to run any implementation commands\",\n \"- Instead, tell the user they can click the **Build** button below the plan preview to switch to the code agent and execute the plan.\",\n \"\",\n \"Your role ends when the plan is finalized. Implementation is handled by the code agent.\",\n \"</IMPORTANT_PLANNING_BOUNDARIES>\",\n].join(\"\\n\");\n\nexport function buildPlanPath(workingDir: string): string {\n const normalized = workingDir.replace(/\\/+$/, \"\");\n return `${normalized}/${PLAN_RELATIVE_PATH}`;\n}\n\nexport function isPlanFilePath(path: string | null | undefined): boolean {\n if (!path) return false;\n const normalized = path.replace(/\\\\/g, \"/\").toUpperCase();\n return (\n normalized === PLAN_FILENAME_UPPER ||\n normalized.endsWith(`/${PLAN_FILENAME_UPPER}`)\n );\n}\n\n/**\n * Whether `conversation` is the local planner helper for `parentConversationId`\n * — identity comes from the `plannerparent` tag `createLocalPlanningConversation`\n * stamps on creation, never from list position (`sub_conversation_ids` is the\n * generic, untyped child list).\n */\nexport function isPlannerConversationOf(\n conversation: Pick<AppConversation, \"tags\"> | null | undefined,\n parentConversationId: string,\n): boolean {\n return (\n conversation?.tags?.[LOCAL_PLANNER_PARENT_TAG_KEY] === parentConversationId\n );\n}\n\n/** Finds the planner helper among a conversation's fetched sub-conversations. */\nexport function findPlannerConversationId(\n subConversations: (AppConversation | null)[] | null | undefined,\n parentConversationId: string | null | undefined,\n): string | null {\n if (!parentConversationId) return null;\n return (\n subConversations?.find((sub) =>\n isPlannerConversationOf(sub, parentConversationId),\n )?.id ?? null\n );\n}\n"],"mappings":";AAEA,IAAa,IAAqB,uBACrB,IAAkC,6BAClC,IAAiC,wBACjC,IAA+B,iBAEtC,IAAsB,WAOf,IAAsB;CACjC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,EAAE,KAAK,IAAI,GAME,IAA6B;CACxC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,EAAE,KAAK,IAAI;AAEX,SAAgB,EAAc,GAA4B;CAExD,OAAO,GADY,EAAW,QAAQ,QAAQ,EACpC,EAAW,GAAG;AAC1B;AAEA,SAAgB,EAAe,GAA0C;CACvE,IAAI,CAAC,GAAM,OAAO;CAClB,IAAM,IAAa,EAAK,QAAQ,OAAO,GAAG,EAAE,YAAY;CACxD,OACE,MAAe,KACf,EAAW,SAAS,IAAI,GAAqB;AAEjD;AAQA,SAAgB,EACd,GACA,GACS;CACT,OACE,GAAc,OAAO,OAAkC;AAE3D;AAGA,SAAgB,EACd,GACA,GACe;CAEf,OADK,IAEH,GAAkB,MAAM,MACtB,EAAwB,GAAK,CAAoB,CACnD,GAAG,MAAM,OAJuB;AAMpC"}
@@ -1,2 +1,2 @@
1
- require("../_virtual/_rolldown/runtime.cjs");const e=require("../node_modules/@openhands/extensions/automations/index.cjs"),t=require("../manifests/manifest-sources.cjs"),n=require("../manifests/automation-interface.cjs");function r(e){return e.map((e,t)=>({automation:e,index:t})).sort((e,t)=>(t.automation.popularityRank??0)-(e.automation.popularityRank??0)||e.index-t.index).map(({automation:e})=>e)}function i(e){return e.trim().toLowerCase().replace(/&/g,`and`).replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``)}function a(e){return[e.id,e.name,e.skill].filter(e=>!!e).map(i)}function o(e,t){let n=new Set(t.map(e=>i(e.name)));return a(e).some(e=>n.has(e))}function s(e){return n.getFeaturedAutomationIds().includes(e.id)}function c(e){return t.SETUP_REGISTRY.findById(e.id)==null}function l(t){let n=r(e.default).filter(e=>!o(e,t));return{proven:n.filter(s),conversation:n.filter(e=>!s(e)&&c(e))}}function u(e){return[...e.proven,...e.conversation]}exports.flattenRecommendedRailGroups=u,exports.getAutomationsByPopularity=r,exports.getRecommendedRailGroups=l;
1
+ require("../_virtual/_rolldown/runtime.cjs");const e=require("../node_modules/@openhands/extensions/automations/index.cjs"),t=require("../manifests/manifest-sources.cjs"),n=require("../manifests/automation-interface.cjs");function r(e){return e.map((e,t)=>({automation:e,index:t})).sort((e,t)=>(t.automation.popularityRank??0)-(e.automation.popularityRank??0)||e.index-t.index).map(({automation:e})=>e)}function i(e){return e.trim().toLowerCase().replace(/&/g,`and`).replace(/[^a-z0-9]+/g,`-`).replace(/^-+|-+$/g,``)}function a(e){return[e.id,e.name,e.name?`${e.name} Agent`:void 0,e.skill].filter(e=>!!e).map(i)}function o(e,t){let n=new Set(t.map(e=>i(e.name)));return a(e).some(e=>n.has(e))}function s(e){return n.getFeaturedAutomationIds().includes(e.id)}function c(e){return t.SETUP_REGISTRY.findById(e.id)==null}function l(t){let n=r(e.default).filter(e=>!o(e,t));return{proven:n.filter(s),conversation:n.filter(e=>!s(e)&&c(e))}}function u(e){return[...e.proven,...e.conversation]}exports.flattenRecommendedRailGroups=u,exports.getAutomationsByPopularity=r,exports.getRecommendedRailGroups=l;
2
2
  //# sourceMappingURL=recommended-automation-rail.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"recommended-automation-rail.cjs","names":[],"sources":["../../src/utils/recommended-automation-rail.ts"],"sourcesContent":["import {\n AUTOMATION_CATALOG,\n type RecommendedAutomation,\n} from \"@openhands/extensions/automations\";\nimport { getFeaturedAutomationIds } from \"#/manifests/automation-interface\";\nimport { SETUP_REGISTRY } from \"#/manifests/manifest-sources\";\nimport type { Automation } from \"#/types/automation\";\n\nexport function getAutomationsByPopularity(\n catalog: RecommendedAutomation[],\n): RecommendedAutomation[] {\n return catalog\n .map((automation, index) => ({ automation, index }))\n .sort((a, b) => {\n const byPopularity =\n (b.automation.popularityRank ?? 0) - (a.automation.popularityRank ?? 0);\n return byPopularity || a.index - b.index;\n })\n .map(({ automation }) => automation);\n}\n\n/**\n * Slug used to match a catalog entry against an installed automation name.\n * Catalog ids are already kebab-case; installed names are human titles.\n */\nexport function normalizeAutomationKey(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/&/g, \"and\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\nfunction catalogMatchKeys(entry: RecommendedAutomation): string[] {\n return [entry.id, entry.name, entry.skill]\n .filter((value): value is string => Boolean(value))\n .map(normalizeAutomationKey);\n}\n\nexport function isCatalogAutomationAdded(\n entry: RecommendedAutomation,\n installed: readonly Pick<Automation, \"name\">[],\n): boolean {\n const installedKeys = new Set(\n installed.map((automation) => normalizeAutomationKey(automation.name)),\n );\n return catalogMatchKeys(entry).some((key) => installedKeys.has(key));\n}\n\nfunction isProvenAutomation(entry: RecommendedAutomation): boolean {\n return getFeaturedAutomationIds().includes(entry.id);\n}\n\n/** Catalog cards that launch a conversation instead of a host setup form. */\nexport function isConversationLaunchAutomation(\n entry: RecommendedAutomation,\n): boolean {\n return SETUP_REGISTRY.findById(entry.id) == null;\n}\n\nexport interface RecommendedRailGroups {\n proven: RecommendedAutomation[];\n conversation: RecommendedAutomation[];\n}\n\n/**\n * Home / dashboard rail: remaining proven workflows, then other useful\n * automations that open in a new conversation. Already-created automations\n * are dropped from both groups.\n */\nexport function getRecommendedRailGroups(\n installed: readonly Pick<Automation, \"name\">[],\n): RecommendedRailGroups {\n // Every catalog entry is offerable: one that declares no integration needs\n // nothing connected, and one that names an integration this host cannot\n // resolve stays visible so the drift is actionable rather than hidden.\n const available = getAutomationsByPopularity(AUTOMATION_CATALOG).filter(\n (entry) => !isCatalogAutomationAdded(entry, installed),\n );\n\n return {\n proven: available.filter(isProvenAutomation),\n conversation: available.filter(\n (entry) =>\n !isProvenAutomation(entry) && isConversationLaunchAutomation(entry),\n ),\n };\n}\n\nexport function flattenRecommendedRailGroups(\n groups: RecommendedRailGroups,\n): RecommendedAutomation[] {\n return [...groups.proven, ...groups.conversation];\n}\n"],"mappings":"8NAQA,SAAgB,EACd,EACyB,CACzB,OAAO,EACJ,KAAK,EAAY,KAAW,CAAE,aAAY,OAAM,EAAE,EAClD,MAAM,EAAG,KAEL,EAAE,WAAW,gBAAkB,IAAM,EAAE,WAAW,gBAAkB,IAChD,EAAE,MAAQ,EAAE,KACpC,EACA,KAAK,CAAE,gBAAiB,CAAU,CACvC,CAMA,SAAgB,EAAuB,EAAuB,CAC5D,OAAO,EACJ,KAAK,EACL,YAAY,EACZ,QAAQ,KAAM,KAAK,EACnB,QAAQ,cAAe,GAAG,EAC1B,QAAQ,WAAY,EAAE,CAC3B,CAEA,SAAS,EAAiB,EAAwC,CAChE,MAAO,CAAC,EAAM,GAAI,EAAM,KAAM,EAAM,KAAK,EACtC,OAAQ,GAA2B,EAAQ,CAAM,EACjD,IAAI,CAAsB,CAC/B,CAEA,SAAgB,EACd,EACA,EACS,CACT,IAAM,EAAgB,IAAI,IACxB,EAAU,IAAK,GAAe,EAAuB,EAAW,IAAI,CAAC,CACvE,EACA,OAAO,EAAiB,CAAK,EAAE,KAAM,GAAQ,EAAc,IAAI,CAAG,CAAC,CACrE,CAEA,SAAS,EAAmB,EAAuC,CACjE,OAAO,EAAA,yBAAyB,EAAE,SAAS,EAAM,EAAE,CACrD,CAGA,SAAgB,EACd,EACS,CACT,OAAO,EAAA,eAAe,SAAS,EAAM,EAAE,GAAK,IAC9C,CAYA,SAAgB,EACd,EACuB,CAIvB,IAAM,EAAY,EAA2B,EAAA,OAAkB,EAAE,OAC9D,GAAU,CAAC,EAAyB,EAAO,CAAS,CACvD,EAEA,MAAO,CACL,OAAQ,EAAU,OAAO,CAAkB,EAC3C,aAAc,EAAU,OACrB,GACC,CAAC,EAAmB,CAAK,GAAK,EAA+B,CAAK,CACtE,CACF,CACF,CAEA,SAAgB,EACd,EACyB,CACzB,MAAO,CAAC,GAAG,EAAO,OAAQ,GAAG,EAAO,YAAY,CAClD"}
1
+ {"version":3,"file":"recommended-automation-rail.cjs","names":[],"sources":["../../src/utils/recommended-automation-rail.ts"],"sourcesContent":["import {\n AUTOMATION_CATALOG,\n type RecommendedAutomation,\n} from \"@openhands/extensions/automations\";\nimport { getFeaturedAutomationIds } from \"#/manifests/automation-interface\";\nimport { SETUP_REGISTRY } from \"#/manifests/manifest-sources\";\nimport type { Automation } from \"#/types/automation\";\n\nexport function getAutomationsByPopularity(\n catalog: RecommendedAutomation[],\n): RecommendedAutomation[] {\n return catalog\n .map((automation, index) => ({ automation, index }))\n .sort((a, b) => {\n const byPopularity =\n (b.automation.popularityRank ?? 0) - (a.automation.popularityRank ?? 0);\n return byPopularity || a.index - b.index;\n })\n .map(({ automation }) => automation);\n}\n\n/**\n * Slug used to match a catalog entry against an installed automation name.\n * Catalog ids are already kebab-case; installed names are human titles.\n */\nexport function normalizeAutomationKey(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/&/g, \"and\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\nfunction catalogMatchKeys(entry: RecommendedAutomation): string[] {\n return [\n entry.id,\n entry.name,\n entry.name ? `${entry.name} Agent` : undefined,\n entry.skill,\n ]\n .filter((value): value is string => Boolean(value))\n .map(normalizeAutomationKey);\n}\n\nexport function isCatalogAutomationAdded(\n entry: RecommendedAutomation,\n installed: readonly Pick<Automation, \"name\">[],\n): boolean {\n const installedKeys = new Set(\n installed.map((automation) => normalizeAutomationKey(automation.name)),\n );\n return catalogMatchKeys(entry).some((key) => installedKeys.has(key));\n}\n\nfunction isProvenAutomation(entry: RecommendedAutomation): boolean {\n return getFeaturedAutomationIds().includes(entry.id);\n}\n\n/** Catalog cards that launch a conversation instead of a host setup form. */\nexport function isConversationLaunchAutomation(\n entry: RecommendedAutomation,\n): boolean {\n return SETUP_REGISTRY.findById(entry.id) == null;\n}\n\nexport interface RecommendedRailGroups {\n proven: RecommendedAutomation[];\n conversation: RecommendedAutomation[];\n}\n\n/**\n * Home / dashboard rail: remaining proven workflows, then other useful\n * automations that open in a new conversation. Already-created automations\n * are dropped from both groups.\n */\nexport function getRecommendedRailGroups(\n installed: readonly Pick<Automation, \"name\">[],\n): RecommendedRailGroups {\n // Every catalog entry is offerable: one that declares no integration needs\n // nothing connected, and one that names an integration this host cannot\n // resolve stays visible so the drift is actionable rather than hidden.\n const available = getAutomationsByPopularity(AUTOMATION_CATALOG).filter(\n (entry) => !isCatalogAutomationAdded(entry, installed),\n );\n\n return {\n proven: available.filter(isProvenAutomation),\n conversation: available.filter(\n (entry) =>\n !isProvenAutomation(entry) && isConversationLaunchAutomation(entry),\n ),\n };\n}\n\nexport function flattenRecommendedRailGroups(\n groups: RecommendedRailGroups,\n): RecommendedAutomation[] {\n return [...groups.proven, ...groups.conversation];\n}\n"],"mappings":"8NAQA,SAAgB,EACd,EACyB,CACzB,OAAO,EACJ,KAAK,EAAY,KAAW,CAAE,aAAY,OAAM,EAAE,EAClD,MAAM,EAAG,KAEL,EAAE,WAAW,gBAAkB,IAAM,EAAE,WAAW,gBAAkB,IAChD,EAAE,MAAQ,EAAE,KACpC,EACA,KAAK,CAAE,gBAAiB,CAAU,CACvC,CAMA,SAAgB,EAAuB,EAAuB,CAC5D,OAAO,EACJ,KAAK,EACL,YAAY,EACZ,QAAQ,KAAM,KAAK,EACnB,QAAQ,cAAe,GAAG,EAC1B,QAAQ,WAAY,EAAE,CAC3B,CAEA,SAAS,EAAiB,EAAwC,CAChE,MAAO,CACL,EAAM,GACN,EAAM,KACN,EAAM,KAAO,GAAG,EAAM,KAAK,QAAU,IAAA,GACrC,EAAM,KACR,EACG,OAAQ,GAA2B,EAAQ,CAAM,EACjD,IAAI,CAAsB,CAC/B,CAEA,SAAgB,EACd,EACA,EACS,CACT,IAAM,EAAgB,IAAI,IACxB,EAAU,IAAK,GAAe,EAAuB,EAAW,IAAI,CAAC,CACvE,EACA,OAAO,EAAiB,CAAK,EAAE,KAAM,GAAQ,EAAc,IAAI,CAAG,CAAC,CACrE,CAEA,SAAS,EAAmB,EAAuC,CACjE,OAAO,EAAA,yBAAyB,EAAE,SAAS,EAAM,EAAE,CACrD,CAGA,SAAgB,EACd,EACS,CACT,OAAO,EAAA,eAAe,SAAS,EAAM,EAAE,GAAK,IAC9C,CAYA,SAAgB,EACd,EACuB,CAIvB,IAAM,EAAY,EAA2B,EAAA,OAAkB,EAAE,OAC9D,GAAU,CAAC,EAAyB,EAAO,CAAS,CACvD,EAEA,MAAO,CACL,OAAQ,EAAU,OAAO,CAAkB,EAC3C,aAAc,EAAU,OACrB,GACC,CAAC,EAAmB,CAAK,GAAK,EAA+B,CAAK,CACtE,CACF,CACF,CAEA,SAAgB,EACd,EACyB,CACzB,MAAO,CAAC,GAAG,EAAO,OAAQ,GAAG,EAAO,YAAY,CAClD"}
@@ -15,6 +15,7 @@ function a(e) {
15
15
  return [
16
16
  e.id,
17
17
  e.name,
18
+ e.name ? `${e.name} Agent` : void 0,
18
19
  e.skill
19
20
  ].filter((e) => !!e).map(i);
20
21
  }
@@ -1 +1 @@
1
- {"version":3,"file":"recommended-automation-rail.js","names":[],"sources":["../../src/utils/recommended-automation-rail.ts"],"sourcesContent":["import {\n AUTOMATION_CATALOG,\n type RecommendedAutomation,\n} from \"@openhands/extensions/automations\";\nimport { getFeaturedAutomationIds } from \"#/manifests/automation-interface\";\nimport { SETUP_REGISTRY } from \"#/manifests/manifest-sources\";\nimport type { Automation } from \"#/types/automation\";\n\nexport function getAutomationsByPopularity(\n catalog: RecommendedAutomation[],\n): RecommendedAutomation[] {\n return catalog\n .map((automation, index) => ({ automation, index }))\n .sort((a, b) => {\n const byPopularity =\n (b.automation.popularityRank ?? 0) - (a.automation.popularityRank ?? 0);\n return byPopularity || a.index - b.index;\n })\n .map(({ automation }) => automation);\n}\n\n/**\n * Slug used to match a catalog entry against an installed automation name.\n * Catalog ids are already kebab-case; installed names are human titles.\n */\nexport function normalizeAutomationKey(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/&/g, \"and\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\nfunction catalogMatchKeys(entry: RecommendedAutomation): string[] {\n return [entry.id, entry.name, entry.skill]\n .filter((value): value is string => Boolean(value))\n .map(normalizeAutomationKey);\n}\n\nexport function isCatalogAutomationAdded(\n entry: RecommendedAutomation,\n installed: readonly Pick<Automation, \"name\">[],\n): boolean {\n const installedKeys = new Set(\n installed.map((automation) => normalizeAutomationKey(automation.name)),\n );\n return catalogMatchKeys(entry).some((key) => installedKeys.has(key));\n}\n\nfunction isProvenAutomation(entry: RecommendedAutomation): boolean {\n return getFeaturedAutomationIds().includes(entry.id);\n}\n\n/** Catalog cards that launch a conversation instead of a host setup form. */\nexport function isConversationLaunchAutomation(\n entry: RecommendedAutomation,\n): boolean {\n return SETUP_REGISTRY.findById(entry.id) == null;\n}\n\nexport interface RecommendedRailGroups {\n proven: RecommendedAutomation[];\n conversation: RecommendedAutomation[];\n}\n\n/**\n * Home / dashboard rail: remaining proven workflows, then other useful\n * automations that open in a new conversation. Already-created automations\n * are dropped from both groups.\n */\nexport function getRecommendedRailGroups(\n installed: readonly Pick<Automation, \"name\">[],\n): RecommendedRailGroups {\n // Every catalog entry is offerable: one that declares no integration needs\n // nothing connected, and one that names an integration this host cannot\n // resolve stays visible so the drift is actionable rather than hidden.\n const available = getAutomationsByPopularity(AUTOMATION_CATALOG).filter(\n (entry) => !isCatalogAutomationAdded(entry, installed),\n );\n\n return {\n proven: available.filter(isProvenAutomation),\n conversation: available.filter(\n (entry) =>\n !isProvenAutomation(entry) && isConversationLaunchAutomation(entry),\n ),\n };\n}\n\nexport function flattenRecommendedRailGroups(\n groups: RecommendedRailGroups,\n): RecommendedAutomation[] {\n return [...groups.proven, ...groups.conversation];\n}\n"],"mappings":";;;;AAQA,SAAgB,EACd,GACyB;CACzB,OAAO,EACJ,KAAK,GAAY,OAAW;EAAE;EAAY;CAAM,EAAE,EAClD,MAAM,GAAG,OAEL,EAAE,WAAW,kBAAkB,MAAM,EAAE,WAAW,kBAAkB,MAChD,EAAE,QAAQ,EAAE,KACpC,EACA,KAAK,EAAE,oBAAiB,CAAU;AACvC;AAMA,SAAgB,EAAuB,GAAuB;CAC5D,OAAO,EACJ,KAAK,EACL,YAAY,EACZ,QAAQ,MAAM,KAAK,EACnB,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE;AAC3B;AAEA,SAAS,EAAiB,GAAwC;CAChE,OAAO;EAAC,EAAM;EAAI,EAAM;EAAM,EAAM;CAAK,EACtC,QAAQ,MAA2B,EAAQ,CAAM,EACjD,IAAI,CAAsB;AAC/B;AAEA,SAAgB,EACd,GACA,GACS;CACT,IAAM,IAAgB,IAAI,IACxB,EAAU,KAAK,MAAe,EAAuB,EAAW,IAAI,CAAC,CACvE;CACA,OAAO,EAAiB,CAAK,EAAE,MAAM,MAAQ,EAAc,IAAI,CAAG,CAAC;AACrE;AAEA,SAAS,EAAmB,GAAuC;CACjE,OAAO,EAAyB,EAAE,SAAS,EAAM,EAAE;AACrD;AAGA,SAAgB,EACd,GACS;CACT,OAAO,EAAe,SAAS,EAAM,EAAE,KAAK;AAC9C;AAYA,SAAgB,EACd,GACuB;CAIvB,IAAM,IAAY,EAA2B,CAAkB,EAAE,QAC9D,MAAU,CAAC,EAAyB,GAAO,CAAS,CACvD;CAEA,OAAO;EACL,QAAQ,EAAU,OAAO,CAAkB;EAC3C,cAAc,EAAU,QACrB,MACC,CAAC,EAAmB,CAAK,KAAK,EAA+B,CAAK,CACtE;CACF;AACF;AAEA,SAAgB,EACd,GACyB;CACzB,OAAO,CAAC,GAAG,EAAO,QAAQ,GAAG,EAAO,YAAY;AAClD"}
1
+ {"version":3,"file":"recommended-automation-rail.js","names":[],"sources":["../../src/utils/recommended-automation-rail.ts"],"sourcesContent":["import {\n AUTOMATION_CATALOG,\n type RecommendedAutomation,\n} from \"@openhands/extensions/automations\";\nimport { getFeaturedAutomationIds } from \"#/manifests/automation-interface\";\nimport { SETUP_REGISTRY } from \"#/manifests/manifest-sources\";\nimport type { Automation } from \"#/types/automation\";\n\nexport function getAutomationsByPopularity(\n catalog: RecommendedAutomation[],\n): RecommendedAutomation[] {\n return catalog\n .map((automation, index) => ({ automation, index }))\n .sort((a, b) => {\n const byPopularity =\n (b.automation.popularityRank ?? 0) - (a.automation.popularityRank ?? 0);\n return byPopularity || a.index - b.index;\n })\n .map(({ automation }) => automation);\n}\n\n/**\n * Slug used to match a catalog entry against an installed automation name.\n * Catalog ids are already kebab-case; installed names are human titles.\n */\nexport function normalizeAutomationKey(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/&/g, \"and\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n}\n\nfunction catalogMatchKeys(entry: RecommendedAutomation): string[] {\n return [\n entry.id,\n entry.name,\n entry.name ? `${entry.name} Agent` : undefined,\n entry.skill,\n ]\n .filter((value): value is string => Boolean(value))\n .map(normalizeAutomationKey);\n}\n\nexport function isCatalogAutomationAdded(\n entry: RecommendedAutomation,\n installed: readonly Pick<Automation, \"name\">[],\n): boolean {\n const installedKeys = new Set(\n installed.map((automation) => normalizeAutomationKey(automation.name)),\n );\n return catalogMatchKeys(entry).some((key) => installedKeys.has(key));\n}\n\nfunction isProvenAutomation(entry: RecommendedAutomation): boolean {\n return getFeaturedAutomationIds().includes(entry.id);\n}\n\n/** Catalog cards that launch a conversation instead of a host setup form. */\nexport function isConversationLaunchAutomation(\n entry: RecommendedAutomation,\n): boolean {\n return SETUP_REGISTRY.findById(entry.id) == null;\n}\n\nexport interface RecommendedRailGroups {\n proven: RecommendedAutomation[];\n conversation: RecommendedAutomation[];\n}\n\n/**\n * Home / dashboard rail: remaining proven workflows, then other useful\n * automations that open in a new conversation. Already-created automations\n * are dropped from both groups.\n */\nexport function getRecommendedRailGroups(\n installed: readonly Pick<Automation, \"name\">[],\n): RecommendedRailGroups {\n // Every catalog entry is offerable: one that declares no integration needs\n // nothing connected, and one that names an integration this host cannot\n // resolve stays visible so the drift is actionable rather than hidden.\n const available = getAutomationsByPopularity(AUTOMATION_CATALOG).filter(\n (entry) => !isCatalogAutomationAdded(entry, installed),\n );\n\n return {\n proven: available.filter(isProvenAutomation),\n conversation: available.filter(\n (entry) =>\n !isProvenAutomation(entry) && isConversationLaunchAutomation(entry),\n ),\n };\n}\n\nexport function flattenRecommendedRailGroups(\n groups: RecommendedRailGroups,\n): RecommendedAutomation[] {\n return [...groups.proven, ...groups.conversation];\n}\n"],"mappings":";;;;AAQA,SAAgB,EACd,GACyB;CACzB,OAAO,EACJ,KAAK,GAAY,OAAW;EAAE;EAAY;CAAM,EAAE,EAClD,MAAM,GAAG,OAEL,EAAE,WAAW,kBAAkB,MAAM,EAAE,WAAW,kBAAkB,MAChD,EAAE,QAAQ,EAAE,KACpC,EACA,KAAK,EAAE,oBAAiB,CAAU;AACvC;AAMA,SAAgB,EAAuB,GAAuB;CAC5D,OAAO,EACJ,KAAK,EACL,YAAY,EACZ,QAAQ,MAAM,KAAK,EACnB,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE;AAC3B;AAEA,SAAS,EAAiB,GAAwC;CAChE,OAAO;EACL,EAAM;EACN,EAAM;EACN,EAAM,OAAO,GAAG,EAAM,KAAK,UAAU,KAAA;EACrC,EAAM;CACR,EACG,QAAQ,MAA2B,EAAQ,CAAM,EACjD,IAAI,CAAsB;AAC/B;AAEA,SAAgB,EACd,GACA,GACS;CACT,IAAM,IAAgB,IAAI,IACxB,EAAU,KAAK,MAAe,EAAuB,EAAW,IAAI,CAAC,CACvE;CACA,OAAO,EAAiB,CAAK,EAAE,MAAM,MAAQ,EAAc,IAAI,CAAG,CAAC;AACrE;AAEA,SAAS,EAAmB,GAAuC;CACjE,OAAO,EAAyB,EAAE,SAAS,EAAM,EAAE;AACrD;AAGA,SAAgB,EACd,GACS;CACT,OAAO,EAAe,SAAS,EAAM,EAAE,KAAK;AAC9C;AAYA,SAAgB,EACd,GACuB;CAIvB,IAAM,IAAY,EAA2B,CAAkB,EAAE,QAC9D,MAAU,CAAC,EAAyB,GAAO,CAAS,CACvD;CAEA,OAAO;EACL,QAAQ,EAAU,OAAO,CAAkB;EAC3C,cAAc,EAAU,QACrB,MACC,CAAC,EAAmB,CAAK,KAAK,EAA+B,CAAK,CACtE;CACF;AACF;AAEA,SAAgB,EACd,GACyB;CACzB,OAAO,CAAC,GAAG,EAAO,QAAQ,GAAG,EAAO,YAAY;AAClD"}
@@ -1,2 +1,2 @@
1
- require("../_virtual/_rolldown/runtime.cjs");var e=1;function t(t){let{scrollLeft:n,scrollWidth:r,clientWidth:i}=t,a=r-i,o=a>e;return{left:o&&n>e,right:o&&n<a-e}}exports.readScrollFadeState=t;
1
+ require("../_virtual/_rolldown/runtime.cjs");var e=1;function t(t){let{scrollLeft:n,scrollWidth:r,clientWidth:i}=t,a=r-i,o=a>e;return{left:o&&n>e,right:o&&n<a-e}}function n(t){let{scrollTop:n,scrollHeight:r,clientHeight:i}=t,a=r-i,o=a>e;return{top:o&&n>e,bottom:o&&n<a-e}}exports.readScrollFadeState=t,exports.readVerticalScrollEdgeState=n;
2
2
  //# sourceMappingURL=scroll-fade-state.cjs.map