@openhands/agent-canvas 1.16.0 → 1.18.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 (1093) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/{acp-providers-CX3Lh9gj.js → acp-providers-DcY_mKYa.js} +1 -1
  4. package/build/assets/active-backend-context-BnH4-L8h.js +2 -0
  5. package/build/assets/{agent-context-settings-DSZlXrLj.js → agent-context-settings-D3peZkjX.js} +1 -1
  6. package/build/assets/agent-profiles-service.api-DkeZaqIl.js +1 -0
  7. package/build/assets/agent-profiles-settings-7yMWYjGF.js +1 -0
  8. package/build/assets/agent-server-client-options-EHB23gyx.js +1 -0
  9. package/build/assets/agent-server-config-C_x8Otd9.js +1 -0
  10. package/build/assets/agent-server-conversation-service.api-jiCopc2E.js +88 -0
  11. package/build/assets/agent-settings-BF8hM6wb.js +2 -0
  12. package/build/assets/agent-settings-YPutBAeR.js +1 -0
  13. package/build/assets/alert-banner-eYyqvHL3.js +1 -0
  14. package/build/assets/{api-error-message-B-XdSk3b.js → api-error-message-BXo0lCI5.js} +1 -1
  15. package/build/assets/api-key-entry-screen-CCBvBD8u.js +1 -0
  16. package/build/assets/app-settings-BtYDs-Be.js +1 -0
  17. package/build/assets/automation-detail-BxXhb_m2.js +3 -0
  18. package/build/assets/{automation-export-D3a3of4G.js → automation-export-BJsfi7n2.js} +1 -1
  19. package/build/assets/automation-git-sync-B7o_Nbl-.js +1 -0
  20. package/build/assets/automation-setup-route-qaJ6lLCf.js +3 -0
  21. package/build/assets/{automation-templates-BRppNh99.js → automation-templates-Bb98r-kx.js} +1 -1
  22. package/build/assets/automations-list-DEPVNud3.js +1 -0
  23. package/build/assets/{back-nav-button-Cjl_hoxq.js → back-nav-button-B2yBiVMB.js} +1 -1
  24. package/build/assets/backend-form-modal-DxisQV_6.js +1 -0
  25. package/build/assets/backend-synced-settings-badge-DLEp6cq7.js +1 -0
  26. package/build/assets/badge-ehL-kgeO.js +1 -0
  27. package/build/assets/{base-modal-D_L0oEbG.js → base-modal-C1a0TsSx.js} +1 -1
  28. package/build/assets/bot-ByolqPEr.js +1 -0
  29. package/build/assets/{brand-button-BAfk4wGP.js → brand-button-CUMfjb99.js} +1 -1
  30. package/build/assets/browser-SE24Tk8g.js +46 -0
  31. package/build/assets/browser-tab-HjJxHA0V.js +1 -0
  32. package/build/assets/canvas-extension-page-BsUGBb1T.js +1 -0
  33. package/build/assets/canvas-extensions-C9Tm6s_E.js +1 -0
  34. package/build/assets/{canvas-extensions-runtime-2_x5Ezmi.js → canvas-extensions-runtime-B8kxM4rO.js} +1 -1
  35. package/build/assets/{chat-send-button-MUQqCZCS.js → chat-send-button-CGvc2wpE.js} +1 -1
  36. package/build/assets/check-Bo8s5Ylg.js +1 -0
  37. package/build/assets/chevron-down-Cr6Fn_wS.js +1 -0
  38. package/build/assets/chevron-right-CfdfRn-8.js +1 -0
  39. package/build/assets/circle-check-5pH3qCji.js +1 -0
  40. package/build/assets/circle-plus-check-toggle-BDX_ctNs.js +1 -0
  41. package/build/assets/{cloud-funnel-analytics-CztBCCPp.js → cloud-funnel-analytics-D5uJ_4JE.js} +1 -1
  42. package/build/assets/{cog-D-MPQW6G.js → cog-CAEugqtV.js} +1 -1
  43. package/build/assets/command-menu-CQxs4mtX.js +1 -0
  44. package/build/assets/commits-tab-D0xgjipP.js +1 -0
  45. package/build/assets/{condenser-settings-DmEOje-7.js → condenser-settings-D63NJRBT.js} +1 -1
  46. package/build/assets/confirmation-modal-78sd9Vny.js +1 -0
  47. package/build/assets/{context-menu-list-item-I86vKcmM.js → context-menu-list-item-Cm7-7Y-7.js} +1 -1
  48. package/build/assets/conversation-B_nweu5p.js +93 -0
  49. package/build/assets/conversation-edjzrv5w.js +1 -0
  50. package/build/assets/conversation-panel-edjzrv5w.js +1 -0
  51. package/build/assets/conversation-state-store-9D_3P7q4.js +1 -0
  52. package/build/assets/conversation-store-DC-JlJuq.js +6 -0
  53. package/build/assets/{conversation-tab-empty-state-FIbh_lc8.js → conversation-tab-empty-state-B3dpJXX0.js} +1 -1
  54. package/build/assets/copy-to-clipboard-button-B1ljgNxO.js +1 -0
  55. package/build/assets/device-verify-D5QRIS_x.js +1 -0
  56. package/build/assets/{dropdown-classes-Bc1djN0-.js → dropdown-classes-BGvOvW2_.js} +1 -1
  57. package/build/assets/edit-automation-modal-D_JWSmxT.js +1 -0
  58. package/build/assets/empty-state-FK_s1B60.js +1 -0
  59. package/build/assets/{entry.client-CqyPPjOq.js → entry.client-BMafTpjO.js} +2 -2
  60. package/build/assets/enum-filter-dropdown-UNaom12H.js +1 -0
  61. package/build/assets/environment-switch-overlay-COibRUA-.js +1 -0
  62. package/build/assets/error-state-Cf8LRuuY.js +1 -0
  63. package/build/assets/extensions-hub-C_6ahIua.js +1 -0
  64. package/build/assets/extensions-navigation-C5GfpzFe.js +1 -0
  65. package/build/assets/external-link-Bd7Tga-1.js +1 -0
  66. package/build/assets/files-tab-D5PPIWI1.js +1 -0
  67. package/build/assets/{form-control-classes-Bkh5FGrD.js → form-control-classes-Dbq-7YP_.js} +1 -1
  68. package/build/assets/format-model-name-Dfh9Udrx.js +1 -0
  69. package/build/assets/get-git-path-jU2zjqIB.js +1 -0
  70. package/build/assets/git-repo-dropdown-BoDDWXfX.js +1 -0
  71. package/build/assets/git-repo-dropdown-uxlFw2gn.js +1 -0
  72. package/build/assets/highlighted-source-view-C7pAXrT0.js +1 -0
  73. package/build/assets/home-BM5_Wz_R.js +1 -0
  74. package/build/assets/home-Ivfm7KC4.js +1 -0
  75. package/build/assets/home-automation-run-tooltip-B1N2uO9p.js +1 -0
  76. package/build/assets/home-store-DCbei3DX.js +1 -0
  77. package/build/assets/hooks-service-Dnmhqc0Z.js +1 -0
  78. package/build/assets/index-home-td9BN2T3.js +1 -0
  79. package/build/assets/info-BcajzHn1.js +1 -0
  80. package/build/assets/install-server-modal-B81I-5OE.js +1 -0
  81. package/build/assets/kebab-menu-item-content-SCJBwZnp.js +1 -0
  82. package/build/assets/{key-BmVyxs-2.js → key-O84CMFHb.js} +1 -1
  83. package/build/assets/launch-ZLxI4opd.js +1 -0
  84. package/build/assets/list-filter-B8PQk3RA.js +1 -0
  85. package/build/assets/{list-todo-apgLVjMw.js → list-todo-Caa8E1X_.js} +1 -1
  86. package/build/assets/llm-not-configured-banner-Dh_ajcM8.js +27 -0
  87. package/build/assets/llm-settings-CODhjQzy.js +1 -0
  88. package/build/assets/llm-settings-CZaXYgtw.js +1 -0
  89. package/build/assets/llm-subscription-service-CgIDc38n.js +1 -0
  90. package/build/assets/loader-circle-BxJgk73D.js +1 -0
  91. package/build/assets/{loading-spinner-BY9N3pOe.js → loading-spinner-BeLV0IXf.js} +1 -1
  92. package/build/assets/manage-backends-modal-cMXqCb-B.js +1 -0
  93. package/build/assets/manifest-bfeccb98.js +1 -0
  94. package/build/assets/manifest-subpage-layout-CVZgVKoY.js +1 -0
  95. package/build/assets/{map-provider-Cu3Zgumb.js → map-provider-iRs80q_6.js} +1 -1
  96. package/build/assets/markdown-renderer-DyFl9-mL.js +8 -0
  97. package/build/assets/mcp-CraxoXQv.js +1 -0
  98. package/build/assets/{mcp-marketplace-utils-AIBzzHTO.js → mcp-marketplace-utils-C7PYr293.js} +1 -1
  99. package/build/assets/mcp-page-CteH_K0N.js +9 -0
  100. package/build/assets/messages-Bk1xhbU2.js +41 -0
  101. package/build/assets/{modal-body-BxZjsju9.js → modal-body-C24WsdFb.js} +1 -1
  102. package/build/assets/{modal-classes-C8eycCwG.js → modal-classes-B0b9eiL8.js} +1 -1
  103. package/build/assets/modal-close-button-DfqfB2Nj.js +1 -0
  104. package/build/assets/{mouse-pointer-click-Co2uyaPA.js → mouse-pointer-click-BXlRN92t.js} +1 -1
  105. package/build/assets/onboarding-DXFBRqEy.js +1 -0
  106. package/build/assets/onboarding-modal-BT3Gx_sZ.js +1 -0
  107. package/build/assets/organization-service.api-B5CvmnYQ.js +1 -0
  108. package/build/assets/pencil-q-ihqDYv.js +1 -0
  109. package/build/assets/pin-BdroVQdN.js +1 -0
  110. package/build/assets/planner-tab-CstoOlAB.js +1 -0
  111. package/build/assets/plug-7ACOEbMs.js +1 -0
  112. package/build/assets/plugins-management-service-5rqVPEGN.js +1 -0
  113. package/build/assets/plus-C2e21TFC.js +1 -0
  114. package/build/assets/profiles-service.api-D1XKMgr0.js +1 -0
  115. package/build/assets/providers-XmZ9HM4Q.js +1 -0
  116. package/build/assets/proxy-XP6U1Dhv.js +1 -0
  117. package/build/assets/{puzzle-JM_QaRm0.js → puzzle-LJYnuxKe.js} +1 -1
  118. package/build/assets/react-BX7IV650.js +1 -0
  119. package/build/assets/recommended-automations-launcher-DEHRKIAg.js +1 -0
  120. package/build/assets/refresh-cw-BtdC3T8P.js +1 -0
  121. package/build/assets/root-CM6IZHlg.css +1 -0
  122. package/build/assets/root-DdFkodKW.js +2 -0
  123. package/build/assets/root-layout-DUquNZTU.js +2 -0
  124. package/build/assets/schema-field-Y3F8JvXd.js +1 -0
  125. package/build/assets/scroll-fade-state-Dt_fx2kf.js +1 -0
  126. package/build/assets/sdk-section-page-CNZTLwH9.js +1 -0
  127. package/build/assets/secret-form-9-BoGA40.js +1 -0
  128. package/build/assets/secrets-service-BOIsfD9j.js +1 -0
  129. package/build/assets/secrets-settings-CBJgFr42.js +1 -0
  130. package/build/assets/settings-D4hdToD4.js +1 -0
  131. package/build/assets/settings-dropdown-input-DBvsZ7-Q.js +1 -0
  132. package/build/assets/settings-index-DeQphyBK.js +1 -0
  133. package/build/assets/settings-input-dVuzapBA.js +1 -0
  134. package/build/assets/{settings-list-classes-BzeSZbF2.js → settings-list-classes-DhAPuXm6.js} +1 -1
  135. package/build/assets/settings-modal-tHiJ8iYV.js +1 -0
  136. package/build/assets/settings-nav-GAQjW1a-.js +16 -0
  137. package/build/assets/settings-service.api-C1vZH9Vh.js +1 -0
  138. package/build/assets/settings-switch-DDd1cQ8t.js +1 -0
  139. package/build/assets/{settings-utils-UYpEdPuD.js → settings-utils-BTaaRhLZ.js} +1 -1
  140. package/build/assets/shared-conversation-Cyg7m7ns.js +1 -0
  141. package/build/assets/shield-check-C3Rl0NF8.js +1 -0
  142. package/build/assets/{sidebar-layout-D6fS8-Gl.js → sidebar-layout-DH0E-5KW.js} +1 -1
  143. package/build/assets/sidebar-mobile-menu-toggle-CQ4iky__.js +1 -0
  144. package/build/assets/{sidebar-nav-link-DQQcMf1A.js → sidebar-nav-link-oLQiKUBu.js} +1 -1
  145. package/build/assets/{sidebar-onboarding-checklist-storage-BBkeI6Bp.js → sidebar-onboarding-checklist-storage-TfvNNnnr.js} +1 -1
  146. package/build/assets/sidebar-store-DAZVH-DR.js +1 -0
  147. package/build/assets/skill-card-pill-row-DfjIfj0K.js +1 -0
  148. package/build/assets/{skill-filter-w__3UCEE.js → skill-filter-DsNLmn76.js} +2 -2
  149. package/build/assets/{skill-icon-badge-RQkq8wvl.js → skill-icon-badge-0MK_68Nc.js} +1 -1
  150. package/build/assets/skill-scope-BE-H9TSZ.js +1 -0
  151. package/build/assets/skills-plugins-vzSdxSk_.js +1 -0
  152. package/build/assets/skills-settings-BiPOH9H9.js +1 -0
  153. package/build/assets/styled-tooltip-CejG0rqv.js +1 -0
  154. package/build/assets/task-list-tab-OkZSqnTp.js +1 -0
  155. package/build/assets/{terminal-CNElN42a.js → terminal-Dph60VFZ.js} +2 -2
  156. package/build/assets/toggle-switch-B2uXaAUS.js +1 -0
  157. package/build/assets/trash-2-Bb40zQzs.js +1 -0
  158. package/build/assets/trash-Ckh7yCaB.js +1 -0
  159. package/build/assets/triangle-alert-DEdu-b_L.js +1 -0
  160. package/build/assets/{typography-v1KN0tzi.js → typography-DgcLGdHk.js} +1 -1
  161. package/build/assets/usage-tab-MCmNRAnR.js +1 -0
  162. package/build/assets/use-acp-credential-form-ychoGqjC.js +1 -0
  163. package/build/assets/use-activate-agent-profile-8L8Xdghy.js +1 -0
  164. package/build/assets/use-agent-profiles-Bi8hSkze.js +1 -0
  165. package/build/assets/{use-automation-health-E6NZi9rb.js → use-automation-health-U99vvHxx.js} +1 -1
  166. package/build/assets/use-automation-permissions-Buus0R6h.js +1 -0
  167. package/build/assets/{use-automations-xijQKIl9.js → use-automations-Bq5hVuv0.js} +1 -1
  168. package/build/assets/{use-can-manage-org-profiles-CrJP5262.js → use-can-manage-org-profiles-MzIeEV8F.js} +1 -1
  169. package/build/assets/use-canvas-extensions-Ca9KoVEm.js +1 -0
  170. package/build/assets/{use-cloud-current-user-id-CDfAHpPX.js → use-cloud-current-user-id-B4ZLUZSa.js} +1 -1
  171. package/build/assets/use-config-l5tkDHyD.js +1 -0
  172. package/build/assets/use-create-conversation-i_PdFdIs.js +1 -0
  173. package/build/assets/use-create-secret-CjWq0J4O.js +1 -0
  174. package/build/assets/use-free-models-gCsJ5BV0.js +1 -0
  175. package/build/assets/{use-get-secrets-K3jmk-LH.js → use-get-secrets-CMTuWEp_.js} +1 -1
  176. package/build/assets/use-is-authed-A2Yinlt0.js +1 -0
  177. package/build/assets/{use-launch-skill-in-chat-BYjYihBP.js → use-launch-skill-in-chat-QbXDhiHr.js} +1 -1
  178. package/build/assets/use-llm-configured-Dl4zg8ht.js +1 -0
  179. package/build/assets/use-llm-profiles-SWsuFmFu.js +1 -0
  180. package/build/assets/use-manifest-capabilities-CdqYfUAC.js +1 -0
  181. package/build/assets/use-onboarding-completion-Xl63ZvzQ.js +1 -0
  182. package/build/assets/use-pinned-home-route-BXDIUaxQ.js +1 -0
  183. package/build/assets/use-plugins-marketplace-BIIaPiaB.js +1 -0
  184. package/build/assets/use-save-agent-profile-D-ZHHE94.js +1 -0
  185. package/build/assets/{use-save-settings-DYqkKv7T.js → use-save-settings-Dapkf4cC.js} +1 -1
  186. package/build/assets/use-settings-C2KKQKVC.js +1 -0
  187. package/build/assets/use-settings-nav-items-TOc0Rsfd.js +1 -0
  188. package/build/assets/use-tracking-j4uo9VEW.js +3 -0
  189. package/build/assets/{use-user-conversation-B9Gebw_g.js → use-user-conversation-5UFqMoO4.js} +1 -1
  190. package/build/assets/{useInfiniteQuery-C926xzY4.js → useInfiniteQuery-CtSRG7uW.js} +1 -1
  191. package/build/assets/{useMutation-B-qc391N.js → useMutation-Cszf8mKy.js} +1 -1
  192. package/build/assets/useQueries-pUohFMSP.js +1 -0
  193. package/build/assets/useQuery-DAAacS7O.js +1 -0
  194. package/build/assets/useTranslation-CCgUjPJF.js +1 -0
  195. package/build/assets/utils-BgLSZdyy.js +1 -0
  196. package/build/assets/{vendor~conversation-panel~conversation-C8Fn4XOf.js → vendor~conversation-panel~conversation-C22sJuWZ.js} +1 -1
  197. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~b0x1wrp2-Z0lly3FE.js +2 -0
  198. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-BXXGJNDU.js +185 -0
  199. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-40UR63Gt.js +1 -0
  200. package/build/assets/{vendor~index-home~home~conversation-panel~conversation-hWywRBaR.js → vendor~index-home~home~conversation-panel~conversation-UTl7gUo9.js} +1 -1
  201. package/build/assets/vendor~root-layout-CcdIqs-C.js +1 -0
  202. package/build/assets/{vendor~root-layout~conversation-panel~conversation-BMbMgaGu.js → vendor~root-layout~conversation-panel~conversation-C3EBV3kp.js} +1 -1
  203. package/build/assets/vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-BCe0JJVy.js +1 -0
  204. package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation-j5MFqfSy.js → vendor~root-layout~index-home~home~conversation-panel~conversation-BGGbPcYh.js} +1 -1
  205. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-CxhwKuAd.js +1 -0
  206. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~nj1hli3r-DP9wmsjo.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~inibp4qe-CnsDDzeE.js} +1 -1
  207. package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-CUmIwQCN.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-3eJ4ExtV.js} +12 -6
  208. package/build/assets/{verification-settings-gw_q6vkL.js → verification-settings-DdBpaVPz.js} +1 -1
  209. package/build/assets/{wrench-CUEI1krB.js → wrench-B8Wg_nbp.js} +1 -1
  210. package/build/assets/x-CX8lVGwm.js +1 -0
  211. package/build/index.html +4 -4
  212. package/build/locales/ar/openhands.json +79 -22
  213. package/build/locales/ca/openhands.json +79 -22
  214. package/build/locales/de/openhands.json +79 -22
  215. package/build/locales/en/openhands.json +79 -22
  216. package/build/locales/es/openhands.json +79 -22
  217. package/build/locales/fr/openhands.json +79 -22
  218. package/build/locales/it/openhands.json +79 -22
  219. package/build/locales/ja/openhands.json +79 -22
  220. package/build/locales/ko-KR/openhands.json +79 -22
  221. package/build/locales/no/openhands.json +79 -22
  222. package/build/locales/pt/openhands.json +79 -22
  223. package/build/locales/tr/openhands.json +79 -22
  224. package/build/locales/uk/openhands.json +79 -22
  225. package/build/locales/zh-CN/openhands.json +79 -22
  226. package/build/locales/zh-TW/openhands.json +79 -22
  227. package/config/defaults.json +3 -3
  228. package/dist/api/agent-server-adapter.cjs +3 -3
  229. package/dist/api/agent-server-adapter.cjs.map +1 -1
  230. package/dist/api/agent-server-adapter.d.ts +72 -12
  231. package/dist/api/agent-server-adapter.js +234 -132
  232. package/dist/api/agent-server-adapter.js.map +1 -1
  233. package/dist/api/agent-server-config.cjs +1 -1
  234. package/dist/api/agent-server-config.cjs.map +1 -1
  235. package/dist/api/agent-server-config.d.ts +6 -0
  236. package/dist/api/agent-server-config.js +6 -3
  237. package/dist/api/agent-server-config.js.map +1 -1
  238. package/dist/api/automation-service/automation-service.api.cjs +1 -1
  239. package/dist/api/automation-service/automation-service.api.cjs.map +1 -1
  240. package/dist/api/automation-service/automation-service.api.d.ts +2 -2
  241. package/dist/api/automation-service/automation-service.api.js +7 -7
  242. package/dist/api/automation-service/automation-service.api.js.map +1 -1
  243. package/dist/api/cloud/organization-service.api.cjs.map +1 -1
  244. package/dist/api/cloud/organization-service.api.d.ts +9 -1
  245. package/dist/api/cloud/organization-service.api.js.map +1 -1
  246. package/dist/api/cloud/provider-connections-service.api.cjs +2 -0
  247. package/dist/api/cloud/provider-connections-service.api.cjs.map +1 -0
  248. package/dist/api/cloud/provider-connections-service.api.d.ts +5 -0
  249. package/dist/api/cloud/provider-connections-service.api.js +50 -0
  250. package/dist/api/cloud/provider-connections-service.api.js.map +1 -0
  251. package/dist/api/cloud/skills-service.api.cjs +1 -1
  252. package/dist/api/cloud/skills-service.api.cjs.map +1 -1
  253. package/dist/api/cloud/skills-service.api.d.ts +10 -0
  254. package/dist/api/cloud/skills-service.api.js +11 -1
  255. package/dist/api/cloud/skills-service.api.js.map +1 -1
  256. package/dist/api/config-service/config-service.api.cjs +1 -1
  257. package/dist/api/config-service/config-service.api.cjs.map +1 -1
  258. package/dist/api/config-service/config-service.api.js +6 -2
  259. package/dist/api/config-service/config-service.api.js.map +1 -1
  260. package/dist/api/config-service/config-service.types.d.ts +13 -0
  261. package/dist/api/conversation-metadata-store.cjs +1 -1
  262. package/dist/api/conversation-metadata-store.cjs.map +1 -1
  263. package/dist/api/conversation-metadata-store.d.ts +24 -0
  264. package/dist/api/conversation-metadata-store.js +10 -2
  265. package/dist/api/conversation-metadata-store.js.map +1 -1
  266. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  267. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  268. package/dist/api/conversation-service/agent-server-conversation-service.api.d.ts +20 -0
  269. package/dist/api/conversation-service/agent-server-conversation-service.api.js +126 -77
  270. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  271. package/dist/api/hooks-service.cjs +2 -0
  272. package/dist/api/hooks-service.cjs.map +1 -0
  273. package/dist/api/hooks-service.d.ts +13 -0
  274. package/dist/api/hooks-service.js +20 -0
  275. package/dist/api/hooks-service.js.map +1 -0
  276. package/dist/api/provider-connections-service/provider-connections-service.api.cjs +1 -1
  277. package/dist/api/provider-connections-service/provider-connections-service.api.cjs.map +1 -1
  278. package/dist/api/provider-connections-service/provider-connections-service.api.js +25 -16
  279. package/dist/api/provider-connections-service/provider-connections-service.api.js.map +1 -1
  280. package/dist/api/settings-service/settings-service.api.cjs +1 -1
  281. package/dist/api/settings-service/settings-service.api.cjs.map +1 -1
  282. package/dist/api/settings-service/settings-service.api.d.ts +2 -0
  283. package/dist/api/settings-service/settings-service.api.js +18 -10
  284. package/dist/api/settings-service/settings-service.api.js.map +1 -1
  285. package/dist/api/skills-service.cjs +1 -1
  286. package/dist/api/skills-service.cjs.map +1 -1
  287. package/dist/api/skills-service.d.ts +7 -0
  288. package/dist/api/skills-service.js +11 -8
  289. package/dist/api/skills-service.js.map +1 -1
  290. package/dist/components/conversation-events/chat/event-message-components/critic-result-display.cjs +1 -1
  291. package/dist/components/conversation-events/chat/event-message-components/critic-result-display.js +5 -5
  292. package/dist/components/conversation-events/chat/event-message-components/finish-event-message.cjs +1 -1
  293. package/dist/components/conversation-events/chat/event-message-components/finish-event-message.cjs.map +1 -1
  294. package/dist/components/conversation-events/chat/event-message-components/finish-event-message.js +2 -1
  295. package/dist/components/conversation-events/chat/event-message-components/finish-event-message.js.map +1 -1
  296. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs +1 -1
  297. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs.map +1 -1
  298. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.d.ts +1 -1
  299. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js +28 -28
  300. package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js.map +1 -1
  301. package/dist/components/conversation-events/chat/event-message-components/thought-event-message.cjs +1 -1
  302. package/dist/components/conversation-events/chat/event-message-components/thought-event-message.cjs.map +1 -1
  303. package/dist/components/conversation-events/chat/event-message-components/thought-event-message.js +2 -1
  304. package/dist/components/conversation-events/chat/event-message-components/thought-event-message.js.map +1 -1
  305. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.cjs +1 -1
  306. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.cjs.map +1 -1
  307. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.d.ts +1 -1
  308. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.js +37 -37
  309. package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.js.map +1 -1
  310. package/dist/components/conversation-events/chat/event-message.cjs +2 -2
  311. package/dist/components/conversation-events/chat/event-message.cjs.map +1 -1
  312. package/dist/components/conversation-events/chat/event-message.js +79 -70
  313. package/dist/components/conversation-events/chat/event-message.js.map +1 -1
  314. package/dist/components/conversation-events/chat/messages.cjs +1 -1
  315. package/dist/components/conversation-events/chat/messages.cjs.map +1 -1
  316. package/dist/components/conversation-events/chat/messages.js +28 -27
  317. package/dist/components/conversation-events/chat/messages.js.map +1 -1
  318. package/dist/components/features/automations/automation-card.cjs +1 -1
  319. package/dist/components/features/automations/automation-card.cjs.map +1 -1
  320. package/dist/components/features/automations/automation-card.js +104 -97
  321. package/dist/components/features/automations/automation-card.js.map +1 -1
  322. package/dist/components/features/automations/automation-list-row.cjs +1 -1
  323. package/dist/components/features/automations/automation-list-row.cjs.map +1 -1
  324. package/dist/components/features/automations/automation-list-row.js +89 -77
  325. package/dist/components/features/automations/automation-list-row.js.map +1 -1
  326. package/dist/components/features/automations/build-automation-menu-items.cjs +1 -1
  327. package/dist/components/features/automations/build-automation-menu-items.cjs.map +1 -1
  328. package/dist/components/features/automations/build-automation-menu-items.d.ts +3 -1
  329. package/dist/components/features/automations/build-automation-menu-items.js +12 -11
  330. package/dist/components/features/automations/build-automation-menu-items.js.map +1 -1
  331. package/dist/components/features/automations/detail/configuration-section.d.ts +7 -1
  332. package/dist/components/features/automations/detail/detail-header.d.ts +10 -5
  333. package/dist/components/features/automations/detail/run-status-badge.cjs +1 -1
  334. package/dist/components/features/automations/detail/run-status-badge.cjs.map +1 -1
  335. package/dist/components/features/automations/detail/run-status-badge.d.ts +2 -2
  336. package/dist/components/features/automations/detail/run-status-badge.js +82 -53
  337. package/dist/components/features/automations/detail/run-status-badge.js.map +1 -1
  338. package/dist/components/features/automations/kebab-menu.cjs +1 -1
  339. package/dist/components/features/automations/kebab-menu.cjs.map +1 -1
  340. package/dist/components/features/automations/kebab-menu.js +9 -5
  341. package/dist/components/features/automations/kebab-menu.js.map +1 -1
  342. package/dist/components/features/automations/recommended-automations-launcher.cjs +1 -1
  343. package/dist/components/features/automations/recommended-automations-launcher.cjs.map +1 -1
  344. package/dist/components/features/automations/recommended-automations-launcher.js +12 -12
  345. package/dist/components/features/automations/recommended-automations-launcher.js.map +1 -1
  346. package/dist/components/features/automations/recommended-automations-section.cjs +1 -1
  347. package/dist/components/features/automations/recommended-automations-section.js +9 -9
  348. package/dist/components/features/backends/backend-selector.cjs +1 -1
  349. package/dist/components/features/backends/backend-selector.cjs.map +1 -1
  350. package/dist/components/features/backends/backend-selector.js +123 -112
  351. package/dist/components/features/backends/backend-selector.js.map +1 -1
  352. package/dist/components/features/backends/manage-backends-modal.cjs +1 -1
  353. package/dist/components/features/backends/manage-backends-modal.cjs.map +1 -1
  354. package/dist/components/features/backends/manage-backends-modal.js +29 -29
  355. package/dist/components/features/backends/manage-backends-modal.js.map +1 -1
  356. package/dist/components/features/chat/change-agent-button.cjs +1 -1
  357. package/dist/components/features/chat/change-agent-button.js +4 -4
  358. package/dist/components/features/chat/chat-interface.cjs +2 -2
  359. package/dist/components/features/chat/chat-interface.cjs.map +1 -1
  360. package/dist/components/features/chat/chat-interface.js +137 -137
  361. package/dist/components/features/chat/chat-interface.js.map +1 -1
  362. package/dist/components/features/chat/chat-message.cjs +1 -1
  363. package/dist/components/features/chat/chat-message.cjs.map +1 -1
  364. package/dist/components/features/chat/chat-message.d.ts +2 -1
  365. package/dist/components/features/chat/chat-message.js +88 -79
  366. package/dist/components/features/chat/chat-message.js.map +1 -1
  367. package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs +1 -1
  368. package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs.map +1 -1
  369. package/dist/components/features/chat/components/chat-input-llm-profile-picker.js +62 -61
  370. package/dist/components/features/chat/components/chat-input-llm-profile-picker.js.map +1 -1
  371. package/dist/components/features/chat/components/context-window-meter.cjs +1 -1
  372. package/dist/components/features/chat/components/context-window-meter.js +4 -4
  373. package/dist/components/features/chat/confirmation-mode-enabled.cjs +1 -1
  374. package/dist/components/features/chat/confirmation-mode-enabled.js +4 -4
  375. package/dist/components/features/chat/generic-event-message.cjs +1 -1
  376. package/dist/components/features/chat/generic-event-message.cjs.map +1 -1
  377. package/dist/components/features/chat/generic-event-message.d.ts +2 -1
  378. package/dist/components/features/chat/generic-event-message.js +41 -22
  379. package/dist/components/features/chat/generic-event-message.js.map +1 -1
  380. package/dist/components/features/chat/interactive-chat-box.cjs +1 -1
  381. package/dist/components/features/chat/interactive-chat-box.cjs.map +1 -1
  382. package/dist/components/features/chat/interactive-chat-box.js +20 -19
  383. package/dist/components/features/chat/interactive-chat-box.js.map +1 -1
  384. package/dist/components/features/chat/model-messages.cjs +1 -1
  385. package/dist/components/features/chat/model-messages.cjs.map +1 -1
  386. package/dist/components/features/chat/model-messages.js +27 -26
  387. package/dist/components/features/chat/model-messages.js.map +1 -1
  388. package/dist/components/features/conversation/conversation-overview-git-section.cjs +1 -1
  389. package/dist/components/features/conversation/conversation-overview-git-section.js +4 -4
  390. package/dist/components/features/conversation/conversation-overview-skills-panel.cjs +1 -1
  391. package/dist/components/features/conversation/conversation-overview-skills-panel.js +4 -4
  392. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs +1 -1
  393. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs.map +1 -1
  394. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js +77 -78
  395. package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js.map +1 -1
  396. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs +1 -1
  397. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs.map +1 -1
  398. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js +88 -88
  399. package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js.map +1 -1
  400. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.cjs +2 -0
  401. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.cjs.map +1 -0
  402. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.d.ts +21 -0
  403. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.js +239 -0
  404. package/dist/components/features/conversation-panel/advanced-conversation-options-modal.js.map +1 -0
  405. package/dist/components/features/conversation-panel/budget-display.cjs +1 -1
  406. package/dist/components/features/conversation-panel/budget-display.cjs.map +1 -1
  407. package/dist/components/features/conversation-panel/budget-display.d.ts +1 -2
  408. package/dist/components/features/conversation-panel/budget-display.js +12 -19
  409. package/dist/components/features/conversation-panel/budget-display.js.map +1 -1
  410. package/dist/components/features/conversation-panel/conversation-active-tag-filters.cjs +2 -0
  411. package/dist/components/features/conversation-panel/conversation-active-tag-filters.cjs.map +1 -0
  412. package/dist/components/features/conversation-panel/conversation-active-tag-filters.d.ts +28 -0
  413. package/dist/components/features/conversation-panel/conversation-active-tag-filters.js +69 -0
  414. package/dist/components/features/conversation-panel/conversation-active-tag-filters.js.map +1 -0
  415. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs +1 -1
  416. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs.map +1 -1
  417. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.d.ts +2 -1
  418. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js +19 -18
  419. package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js.map +1 -1
  420. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs +1 -1
  421. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs.map +1 -1
  422. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.d.ts +2 -1
  423. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js +91 -80
  424. package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js.map +1 -1
  425. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs +1 -1
  426. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs.map +1 -1
  427. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js +45 -44
  428. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js.map +1 -1
  429. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs +1 -1
  430. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs.map +1 -1
  431. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js +1 -1
  432. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js.map +1 -1
  433. package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs +1 -1
  434. package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs.map +1 -1
  435. package/dist/components/features/conversation-panel/conversation-card/conversation-card.d.ts +7 -1
  436. package/dist/components/features/conversation-panel/conversation-card/conversation-card.js +87 -81
  437. package/dist/components/features/conversation-panel/conversation-card/conversation-card.js.map +1 -1
  438. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs +1 -1
  439. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs.map +1 -1
  440. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.d.ts +2 -1
  441. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js +1 -1
  442. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js.map +1 -1
  443. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs +1 -1
  444. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs.map +1 -1
  445. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.d.ts +2 -1
  446. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js +2 -1
  447. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js.map +1 -1
  448. package/dist/components/features/conversation-panel/conversation-layouts-menu.cjs +2 -0
  449. package/dist/components/features/conversation-panel/conversation-layouts-menu.cjs.map +1 -0
  450. package/dist/components/features/conversation-panel/conversation-layouts-menu.d.ts +29 -0
  451. package/dist/components/features/conversation-panel/conversation-layouts-menu.js +177 -0
  452. package/dist/components/features/conversation-panel/conversation-layouts-menu.js.map +1 -0
  453. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs +1 -1
  454. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs.map +1 -1
  455. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.d.ts +37 -0
  456. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js +85 -45
  457. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js.map +1 -1
  458. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  459. package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
  460. package/dist/components/features/conversation-panel/conversation-panel.js +296 -290
  461. package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
  462. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.cjs +2 -0
  463. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.cjs.map +1 -0
  464. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.d.ts +22 -0
  465. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.js +153 -0
  466. package/dist/components/features/conversation-panel/edit-conversation-tags-modal.js.map +1 -0
  467. package/dist/components/features/conversation-panel/hide-older-conversations-row.cjs +2 -0
  468. package/dist/components/features/conversation-panel/hide-older-conversations-row.cjs.map +1 -0
  469. package/dist/components/features/conversation-panel/hide-older-conversations-row.d.ts +6 -0
  470. package/dist/components/features/conversation-panel/hide-older-conversations-row.js +65 -0
  471. package/dist/components/features/conversation-panel/hide-older-conversations-row.js.map +1 -0
  472. package/dist/components/features/conversation-panel/menu-row.cjs +1 -1
  473. package/dist/components/features/conversation-panel/menu-row.cjs.map +1 -1
  474. package/dist/components/features/conversation-panel/menu-row.d.ts +11 -1
  475. package/dist/components/features/conversation-panel/menu-row.js +27 -16
  476. package/dist/components/features/conversation-panel/menu-row.js.map +1 -1
  477. package/dist/components/features/home/featured-automations/automation-health-indicator.cjs +1 -1
  478. package/dist/components/features/home/featured-automations/automation-health-indicator.cjs.map +1 -1
  479. package/dist/components/features/home/featured-automations/automation-health-indicator.js +1 -1
  480. package/dist/components/features/home/featured-automations/automation-health-indicator.js.map +1 -1
  481. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.cjs +1 -1
  482. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.cjs.map +1 -1
  483. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.d.ts +4 -3
  484. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.js +22 -25
  485. package/dist/components/features/home/featured-automations/automation-run-activity-metrics.js.map +1 -1
  486. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.cjs +1 -1
  487. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.cjs.map +1 -1
  488. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.d.ts +1 -1
  489. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.js +15 -15
  490. package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.js.map +1 -1
  491. package/dist/components/features/home/featured-automations/automation-run-health.cjs +1 -1
  492. package/dist/components/features/home/featured-automations/automation-run-health.cjs.map +1 -1
  493. package/dist/components/features/home/featured-automations/automation-run-health.d.ts +5 -3
  494. package/dist/components/features/home/featured-automations/automation-run-health.js +30 -23
  495. package/dist/components/features/home/featured-automations/automation-run-health.js.map +1 -1
  496. package/dist/components/features/home/featured-automations/build-home-automation-menu-items.d.ts +1 -2
  497. package/dist/components/features/home/featured-automations/build-pinned-automation-menu-items.d.ts +0 -1
  498. package/dist/components/features/home/featured-automations/home-automation-activity.d.ts +3 -2
  499. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs +1 -1
  500. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs.map +1 -1
  501. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.d.ts +1 -1
  502. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js +42 -42
  503. package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js.map +1 -1
  504. package/dist/components/features/images/image-lightbox.cjs +2 -0
  505. package/dist/components/features/images/image-lightbox.cjs.map +1 -0
  506. package/dist/components/features/images/image-lightbox.d.ts +11 -0
  507. package/dist/components/features/images/image-lightbox.js +37 -0
  508. package/dist/components/features/images/image-lightbox.js.map +1 -0
  509. package/dist/components/features/images/image-preview.cjs +1 -1
  510. package/dist/components/features/images/image-preview.cjs.map +1 -1
  511. package/dist/components/features/images/image-preview.d.ts +2 -1
  512. package/dist/components/features/images/image-preview.js +33 -13
  513. package/dist/components/features/images/image-preview.js.map +1 -1
  514. package/dist/components/features/manifest/manifest-form-field.d.ts +3 -1
  515. package/dist/components/features/manifest/manifest-review-step.d.ts +3 -1
  516. package/dist/components/features/onboarding/steps/setup-llm-step.d.ts +3 -4
  517. package/dist/components/features/settings/cloud-settings-link.cjs +1 -1
  518. package/dist/components/features/settings/cloud-settings-link.cjs.map +1 -1
  519. package/dist/components/features/settings/cloud-settings-link.d.ts +3 -1
  520. package/dist/components/features/settings/cloud-settings-link.js +22 -19
  521. package/dist/components/features/settings/cloud-settings-link.js.map +1 -1
  522. package/dist/components/features/settings/integrations-settings-link.cjs +1 -1
  523. package/dist/components/features/settings/integrations-settings-link.cjs.map +1 -1
  524. package/dist/components/features/settings/integrations-settings-link.d.ts +3 -1
  525. package/dist/components/features/settings/integrations-settings-link.js +20 -17
  526. package/dist/components/features/settings/integrations-settings-link.js.map +1 -1
  527. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.cjs +1 -1
  528. package/dist/components/features/settings/llm-profiles/llm-settings-local-view.js +3 -2
  529. package/dist/components/features/settings/llm-profiles/profile-row.cjs +1 -1
  530. package/dist/components/features/settings/llm-profiles/profile-row.js +1 -1
  531. package/dist/components/features/settings/llm-profiles/profiles-body.d.ts +2 -2
  532. package/dist/components/features/settings/sdk-settings/sdk-section-page.cjs +1 -1
  533. package/dist/components/features/settings/sdk-settings/sdk-section-page.cjs.map +1 -1
  534. package/dist/components/features/settings/sdk-settings/sdk-section-page.d.ts +8 -7
  535. package/dist/components/features/settings/sdk-settings/sdk-section-page.js +172 -142
  536. package/dist/components/features/settings/sdk-settings/sdk-section-page.js.map +1 -1
  537. package/dist/components/features/settings/secrets-settings/secret-form.cjs +1 -1
  538. package/dist/components/features/settings/secrets-settings/secret-form.cjs.map +1 -1
  539. package/dist/components/features/settings/secrets-settings/secret-form.js +38 -25
  540. package/dist/components/features/settings/secrets-settings/secret-form.js.map +1 -1
  541. package/dist/components/features/settings/settings-dropdown-input.cjs +1 -1
  542. package/dist/components/features/settings/settings-dropdown-input.js +6 -6
  543. package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
  544. package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
  545. package/dist/components/features/sidebar/sidebar-rail-body.d.ts +4 -1
  546. package/dist/components/features/sidebar/sidebar-rail-body.js +157 -139
  547. package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
  548. package/dist/components/features/sidebar/sidebar.cjs +1 -1
  549. package/dist/components/features/sidebar/sidebar.cjs.map +1 -1
  550. package/dist/components/features/sidebar/sidebar.js +28 -26
  551. package/dist/components/features/sidebar/sidebar.js.map +1 -1
  552. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.cjs +1 -1
  553. package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.js +3 -3
  554. package/dist/components/features/skills/extensions-navigation.cjs +1 -1
  555. package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
  556. package/dist/components/features/skills/extensions-navigation.js +3 -3
  557. package/dist/components/features/skills/extensions-navigation.js.map +1 -1
  558. package/dist/components/providers/agent-server-ui-providers.cjs +1 -1
  559. package/dist/components/providers/agent-server-ui-providers.cjs.map +1 -1
  560. package/dist/components/providers/agent-server-ui-providers.js +33 -29
  561. package/dist/components/providers/agent-server-ui-providers.js.map +1 -1
  562. package/dist/components/shared/buttons/remove-button.cjs +1 -1
  563. package/dist/components/shared/buttons/remove-button.cjs.map +1 -1
  564. package/dist/components/shared/buttons/remove-button.d.ts +2 -1
  565. package/dist/components/shared/buttons/remove-button.js +2 -1
  566. package/dist/components/shared/buttons/remove-button.js.map +1 -1
  567. package/dist/components/shared/buttons/styled-tooltip.cjs +1 -1
  568. package/dist/components/shared/buttons/styled-tooltip.cjs.map +1 -1
  569. package/dist/components/shared/buttons/styled-tooltip.d.ts +2 -1
  570. package/dist/components/shared/buttons/styled-tooltip.js +2 -1
  571. package/dist/components/shared/buttons/styled-tooltip.js.map +1 -1
  572. package/dist/components/shared/filters/enum-filter-dropdown.cjs +1 -1
  573. package/dist/components/shared/filters/enum-filter-dropdown.cjs.map +1 -1
  574. package/dist/components/shared/filters/enum-filter-dropdown.d.ts +5 -1
  575. package/dist/components/shared/filters/enum-filter-dropdown.js +14 -14
  576. package/dist/components/shared/filters/enum-filter-dropdown.js.map +1 -1
  577. package/dist/components/shared/free-models-note.cjs +2 -0
  578. package/dist/components/shared/free-models-note.cjs.map +1 -0
  579. package/dist/components/shared/free-models-note.d.ts +3 -0
  580. package/dist/components/shared/free-models-note.js +20 -0
  581. package/dist/components/shared/free-models-note.js.map +1 -0
  582. package/dist/components/shared/modals/confirmation-modal.cjs +1 -1
  583. package/dist/components/shared/modals/confirmation-modal.cjs.map +1 -1
  584. package/dist/components/shared/modals/confirmation-modal.d.ts +2 -1
  585. package/dist/components/shared/modals/confirmation-modal.js +8 -8
  586. package/dist/components/shared/modals/confirmation-modal.js.map +1 -1
  587. package/dist/components/shared/modals/settings/model-selector.cjs +1 -1
  588. package/dist/components/shared/modals/settings/model-selector.cjs.map +1 -1
  589. package/dist/components/shared/modals/settings/model-selector.js +102 -112
  590. package/dist/components/shared/modals/settings/model-selector.js.map +1 -1
  591. package/dist/config/defaults.cjs +1 -1
  592. package/dist/config/defaults.cjs.map +1 -1
  593. package/dist/config/defaults.js +3 -3
  594. package/dist/config/defaults.js.map +1 -1
  595. package/dist/constants/acp-providers.cjs.map +1 -1
  596. package/dist/constants/acp-providers.d.ts +12 -0
  597. package/dist/constants/acp-providers.js.map +1 -1
  598. package/dist/constants/settings-nav.d.ts +8 -0
  599. package/dist/contexts/conversation-websocket-context.cjs +3 -3
  600. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  601. package/dist/contexts/conversation-websocket-context.d.ts +5 -0
  602. package/dist/contexts/conversation-websocket-context.js +194 -198
  603. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  604. package/dist/contexts/websocket-provider-wrapper.cjs +1 -1
  605. package/dist/contexts/websocket-provider-wrapper.cjs.map +1 -1
  606. package/dist/contexts/websocket-provider-wrapper.js +31 -15
  607. package/dist/contexts/websocket-provider-wrapper.js.map +1 -1
  608. package/dist/hooks/chat/record-model-switch-message.cjs +1 -1
  609. package/dist/hooks/chat/record-model-switch-message.cjs.map +1 -1
  610. package/dist/hooks/chat/record-model-switch-message.d.ts +31 -0
  611. package/dist/hooks/chat/record-model-switch-message.js +25 -12
  612. package/dist/hooks/chat/record-model-switch-message.js.map +1 -1
  613. package/dist/hooks/chat/use-plan-mode-interceptor.cjs +2 -0
  614. package/dist/hooks/chat/use-plan-mode-interceptor.cjs.map +1 -0
  615. package/dist/hooks/chat/use-plan-mode-interceptor.d.ts +16 -0
  616. package/dist/hooks/chat/use-plan-mode-interceptor.js +43 -0
  617. package/dist/hooks/chat/use-plan-mode-interceptor.js.map +1 -0
  618. package/dist/hooks/chat/use-slash-command.cjs +1 -1
  619. package/dist/hooks/chat/use-slash-command.cjs.map +1 -1
  620. package/dist/hooks/chat/use-slash-command.js +63 -62
  621. package/dist/hooks/chat/use-slash-command.js.map +1 -1
  622. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  623. package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
  624. package/dist/hooks/mutation/use-create-conversation.js +5 -1
  625. package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
  626. package/dist/hooks/mutation/use-read-conversation-file.cjs +1 -1
  627. package/dist/hooks/mutation/use-read-conversation-file.cjs.map +1 -1
  628. package/dist/hooks/mutation/use-read-conversation-file.js +11 -4
  629. package/dist/hooks/mutation/use-read-conversation-file.js.map +1 -1
  630. package/dist/hooks/mutation/use-save-settings.cjs +1 -1
  631. package/dist/hooks/mutation/use-save-settings.js +3 -3
  632. package/dist/hooks/mutation/use-switch-llm-profile.cjs +1 -1
  633. package/dist/hooks/mutation/use-switch-llm-profile.cjs.map +1 -1
  634. package/dist/hooks/mutation/use-switch-llm-profile.js +13 -25
  635. package/dist/hooks/mutation/use-switch-llm-profile.js.map +1 -1
  636. package/dist/hooks/mutation/use-update-conversation-tags.cjs +2 -0
  637. package/dist/hooks/mutation/use-update-conversation-tags.cjs.map +1 -0
  638. package/dist/hooks/mutation/use-update-conversation-tags.d.ts +8 -0
  639. package/dist/hooks/mutation/use-update-conversation-tags.js +45 -0
  640. package/dist/hooks/mutation/use-update-conversation-tags.js.map +1 -0
  641. package/dist/hooks/query/query-keys.cjs +1 -1
  642. package/dist/hooks/query/query-keys.cjs.map +1 -1
  643. package/dist/hooks/query/query-keys.d.ts +6 -0
  644. package/dist/hooks/query/query-keys.js +2 -2
  645. package/dist/hooks/query/query-keys.js.map +1 -1
  646. package/dist/hooks/query/use-automation-sdk-version.cjs +1 -1
  647. package/dist/hooks/query/use-automation-sdk-version.cjs.map +1 -1
  648. package/dist/hooks/query/use-automation-sdk-version.d.ts +0 -1
  649. package/dist/hooks/query/use-automation-sdk-version.js +30 -55
  650. package/dist/hooks/query/use-automation-sdk-version.js.map +1 -1
  651. package/dist/hooks/query/use-conversation-skills.cjs +1 -1
  652. package/dist/hooks/query/use-conversation-skills.cjs.map +1 -1
  653. package/dist/hooks/query/use-conversation-skills.d.ts +14 -5
  654. package/dist/hooks/query/use-conversation-skills.js +20 -4
  655. package/dist/hooks/query/use-conversation-skills.js.map +1 -1
  656. package/dist/hooks/query/use-free-models.cjs +2 -0
  657. package/dist/hooks/query/use-free-models.cjs.map +1 -0
  658. package/dist/hooks/query/use-free-models.d.ts +23 -0
  659. package/dist/hooks/query/use-free-models.js +67 -0
  660. package/dist/hooks/query/use-free-models.js.map +1 -0
  661. package/dist/hooks/query/use-local-git-info.cjs.map +1 -1
  662. package/dist/hooks/query/use-local-git-info.js.map +1 -1
  663. package/dist/hooks/query/use-provider-connections.cjs +1 -1
  664. package/dist/hooks/query/use-provider-connections.cjs.map +1 -1
  665. package/dist/hooks/query/use-provider-connections.d.ts +6 -3
  666. package/dist/hooks/query/use-provider-connections.js +7 -3
  667. package/dist/hooks/query/use-provider-connections.js.map +1 -1
  668. package/dist/hooks/query/use-provider-models.cjs +1 -1
  669. package/dist/hooks/query/use-provider-models.cjs.map +1 -1
  670. package/dist/hooks/query/use-provider-models.js +34 -25
  671. package/dist/hooks/query/use-provider-models.js.map +1 -1
  672. package/dist/hooks/query/use-search-providers.cjs +1 -1
  673. package/dist/hooks/query/use-search-providers.cjs.map +1 -1
  674. package/dist/hooks/query/use-search-providers.js +31 -19
  675. package/dist/hooks/query/use-search-providers.js.map +1 -1
  676. package/dist/hooks/query/use-sub-conversations.cjs +1 -1
  677. package/dist/hooks/query/use-sub-conversations.cjs.map +1 -1
  678. package/dist/hooks/query/use-sub-conversations.js +16 -16
  679. package/dist/hooks/query/use-sub-conversations.js.map +1 -1
  680. package/dist/hooks/use-acp-model-context.cjs +1 -1
  681. package/dist/hooks/use-acp-model-context.js +3 -3
  682. package/dist/hooks/use-agent-state.cjs +1 -1
  683. package/dist/hooks/use-agent-state.cjs.map +1 -1
  684. package/dist/hooks/use-agent-state.d.ts +17 -1
  685. package/dist/hooks/use-agent-state.js +19 -9
  686. package/dist/hooks/use-agent-state.js.map +1 -1
  687. package/dist/hooks/use-automation-permissions.cjs +2 -0
  688. package/dist/hooks/use-automation-permissions.cjs.map +1 -0
  689. package/dist/hooks/use-automation-permissions.d.ts +43 -0
  690. package/dist/hooks/use-automation-permissions.js +52 -0
  691. package/dist/hooks/use-automation-permissions.js.map +1 -0
  692. package/dist/hooks/use-chat-input-model-state.cjs +1 -1
  693. package/dist/hooks/use-chat-input-model-state.js +3 -3
  694. package/dist/hooks/use-handle-plan-click.cjs +1 -1
  695. package/dist/hooks/use-handle-plan-click.cjs.map +1 -1
  696. package/dist/hooks/use-handle-plan-click.d.ts +3 -1
  697. package/dist/hooks/use-handle-plan-click.js +85 -26
  698. package/dist/hooks/use-handle-plan-click.js.map +1 -1
  699. package/dist/hooks/use-home-automation-actions.cjs +1 -1
  700. package/dist/hooks/use-home-automation-actions.cjs.map +1 -1
  701. package/dist/hooks/use-home-automation-actions.d.ts +1 -2
  702. package/dist/hooks/use-home-automation-actions.js +1 -1
  703. package/dist/hooks/use-home-automation-actions.js.map +1 -1
  704. package/dist/hooks/use-llm-configured.cjs +1 -1
  705. package/dist/hooks/use-llm-configured.js +3 -3
  706. package/dist/hooks/use-manifest-preflight.d.ts +1 -1
  707. package/dist/hooks/use-unified-websocket-status.cjs +1 -1
  708. package/dist/hooks/use-unified-websocket-status.cjs.map +1 -1
  709. package/dist/hooks/use-unified-websocket-status.d.ts +7 -0
  710. package/dist/hooks/use-unified-websocket-status.js +5 -1
  711. package/dist/hooks/use-unified-websocket-status.js.map +1 -1
  712. package/dist/i18n/declaration.cjs +1 -1
  713. package/dist/i18n/declaration.cjs.map +1 -1
  714. package/dist/i18n/declaration.d.ts +71 -14
  715. package/dist/i18n/declaration.js +1 -1
  716. package/dist/i18n/declaration.js.map +1 -1
  717. package/dist/i18n/translation.cjs +2 -2
  718. package/dist/i18n/translation.cjs.map +1 -1
  719. package/dist/i18n/translation.js +1281 -312
  720. package/dist/i18n/translation.js.map +1 -1
  721. package/dist/locales/ar/openhands.json +79 -22
  722. package/dist/locales/ca/openhands.json +79 -22
  723. package/dist/locales/de/openhands.json +79 -22
  724. package/dist/locales/en/openhands.json +79 -22
  725. package/dist/locales/es/openhands.json +79 -22
  726. package/dist/locales/fr/openhands.json +79 -22
  727. package/dist/locales/it/openhands.json +79 -22
  728. package/dist/locales/ja/openhands.json +79 -22
  729. package/dist/locales/ko-KR/openhands.json +79 -22
  730. package/dist/locales/no/openhands.json +79 -22
  731. package/dist/locales/pt/openhands.json +79 -22
  732. package/dist/locales/tr/openhands.json +79 -22
  733. package/dist/locales/uk/openhands.json +79 -22
  734. package/dist/locales/zh-CN/openhands.json +79 -22
  735. package/dist/locales/zh-TW/openhands.json +79 -22
  736. package/dist/manifests/automation-insights.cjs.map +1 -1
  737. package/dist/manifests/automation-insights.d.ts +10 -2
  738. package/dist/manifests/automation-insights.js.map +1 -1
  739. package/dist/manifests/automation-setup.cjs +1 -1
  740. package/dist/manifests/automation-setup.cjs.map +1 -1
  741. package/dist/manifests/automation-setup.d.ts +9 -16
  742. package/dist/manifests/automation-setup.js +17 -7
  743. package/dist/manifests/automation-setup.js.map +1 -1
  744. package/dist/manifests/manifest-actions.d.ts +1 -1
  745. package/dist/manifests/manifest-capabilities.d.ts +3 -1
  746. package/dist/manifests/manifest-local-validation.cjs +2 -0
  747. package/dist/manifests/manifest-local-validation.cjs.map +1 -0
  748. package/dist/manifests/manifest-local-validation.d.ts +15 -11
  749. package/dist/manifests/manifest-local-validation.js +8 -0
  750. package/dist/manifests/manifest-local-validation.js.map +1 -0
  751. package/dist/manifests/manifest-template.cjs +2 -0
  752. package/dist/manifests/manifest-template.cjs.map +1 -0
  753. package/dist/manifests/manifest-template.d.ts +4 -4
  754. package/dist/manifests/manifest-template.js +12 -0
  755. package/dist/manifests/manifest-template.js.map +1 -0
  756. package/dist/manifests/manifest-validation.cjs +1 -1
  757. package/dist/manifests/manifest-validation.cjs.map +1 -1
  758. package/dist/manifests/manifest-validation.js +106 -28
  759. package/dist/manifests/manifest-validation.js.map +1 -1
  760. package/dist/manifests/types.cjs.map +1 -1
  761. package/dist/manifests/types.d.ts +39 -4
  762. package/dist/manifests/types.js.map +1 -1
  763. package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.cjs +8 -0
  764. package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.cjs.map +1 -0
  765. package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.js +221 -0
  766. package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.js.map +1 -0
  767. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs +1 -1
  768. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs.map +1 -1
  769. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js +1 -1
  770. package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js.map +1 -1
  771. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs +1 -1
  772. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs.map +1 -1
  773. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js +1 -1
  774. package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js.map +1 -1
  775. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.cjs +1 -1
  776. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.cjs.map +1 -1
  777. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.js +1 -1
  778. package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.js.map +1 -1
  779. package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs +1 -1
  780. package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs.map +1 -1
  781. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js +22 -20
  782. package/dist/node_modules/@openhands/extensions/automations/catalog-index.js.map +1 -1
  783. package/dist/node_modules/@openhands/extensions/automations/interface.cjs +1 -1
  784. package/dist/node_modules/@openhands/extensions/automations/interface.cjs.map +1 -1
  785. package/dist/node_modules/@openhands/extensions/automations/interface.js +2 -1
  786. package/dist/node_modules/@openhands/extensions/automations/interface.js.map +1 -1
  787. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs +1 -1
  788. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs.map +1 -1
  789. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js +24 -5
  790. package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js.map +1 -1
  791. package/dist/node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs +1 -1
  792. package/dist/node_modules/@tanstack/react-query/build/modern/QueryClientProvider.js +1 -1
  793. package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.cjs +2 -0
  794. package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.cjs.map +1 -0
  795. package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.js +21 -0
  796. package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.js.map +1 -0
  797. package/dist/node_modules/lucide-react/dist/esm/icons/shrink.cjs +2 -0
  798. package/dist/node_modules/lucide-react/dist/esm/icons/shrink.cjs.map +1 -0
  799. package/dist/node_modules/lucide-react/dist/esm/icons/shrink.js +23 -0
  800. package/dist/node_modules/lucide-react/dist/esm/icons/shrink.js.map +1 -0
  801. package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.cjs +2 -0
  802. package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.cjs.map +1 -0
  803. package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.js +43 -0
  804. package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.js.map +1 -0
  805. package/dist/node_modules/lucide-react/dist/esm/icons/tags.cjs +2 -0
  806. package/dist/node_modules/lucide-react/dist/esm/icons/tags.cjs.map +1 -0
  807. package/dist/node_modules/lucide-react/dist/esm/icons/tags.js +22 -0
  808. package/dist/node_modules/lucide-react/dist/esm/icons/tags.js.map +1 -0
  809. package/dist/package.cjs +1 -1
  810. package/dist/package.cjs.map +1 -1
  811. package/dist/package.js +4 -4
  812. package/dist/package.js.map +1 -1
  813. package/dist/routes/agent-settings.d.ts +2 -0
  814. package/dist/routes/app-settings.cjs +1 -1
  815. package/dist/routes/app-settings.cjs.map +1 -1
  816. package/dist/routes/app-settings.js +53 -48
  817. package/dist/routes/app-settings.js.map +1 -1
  818. package/dist/routes/llm-settings.cjs +1 -1
  819. package/dist/routes/llm-settings.cjs.map +1 -1
  820. package/dist/routes/llm-settings.d.ts +3 -1
  821. package/dist/routes/llm-settings.js +120 -127
  822. package/dist/routes/llm-settings.js.map +1 -1
  823. package/dist/routes/planner-tab.cjs +1 -1
  824. package/dist/routes/planner-tab.cjs.map +1 -1
  825. package/dist/routes/planner-tab.js +44 -28
  826. package/dist/routes/planner-tab.js.map +1 -1
  827. package/dist/services/telemetry.cjs +1 -1
  828. package/dist/services/telemetry.cjs.map +1 -1
  829. package/dist/services/telemetry.d.ts +5 -0
  830. package/dist/services/telemetry.js +122 -115
  831. package/dist/services/telemetry.js.map +1 -1
  832. package/dist/stores/conversation-panel-preferences-store.cjs +1 -1
  833. package/dist/stores/conversation-panel-preferences-store.cjs.map +1 -1
  834. package/dist/stores/conversation-panel-preferences-store.d.ts +32 -5
  835. package/dist/stores/conversation-panel-preferences-store.js +29 -12
  836. package/dist/stores/conversation-panel-preferences-store.js.map +1 -1
  837. package/dist/stores/conversation-state-store.cjs +1 -1
  838. package/dist/stores/conversation-state-store.cjs.map +1 -1
  839. package/dist/stores/conversation-state-store.d.ts +9 -3
  840. package/dist/stores/conversation-state-store.js +6 -3
  841. package/dist/stores/conversation-state-store.js.map +1 -1
  842. package/dist/stores/conversation-store.cjs +1 -1
  843. package/dist/stores/conversation-store.cjs.map +1 -1
  844. package/dist/stores/conversation-store.d.ts +2 -0
  845. package/dist/stores/conversation-store.js +3 -0
  846. package/dist/stores/conversation-store.js.map +1 -1
  847. package/dist/stores/free-models-store.cjs +2 -0
  848. package/dist/stores/free-models-store.cjs.map +1 -0
  849. package/dist/stores/free-models-store.d.ts +30 -0
  850. package/dist/stores/free-models-store.js +22 -0
  851. package/dist/stores/free-models-store.js.map +1 -0
  852. package/dist/stores/model-store.cjs +1 -1
  853. package/dist/stores/model-store.cjs.map +1 -1
  854. package/dist/stores/model-store.d.ts +7 -0
  855. package/dist/stores/model-store.js +4 -0
  856. package/dist/stores/model-store.js.map +1 -1
  857. package/dist/types/automation.cjs.map +1 -1
  858. package/dist/types/automation.d.ts +46 -1
  859. package/dist/types/automation.js.map +1 -1
  860. package/dist/ui/context-menu.d.ts +1 -1
  861. package/dist/ui/toggle-switch.cjs +1 -1
  862. package/dist/ui/toggle-switch.cjs.map +1 -1
  863. package/dist/ui/toggle-switch.d.ts +4 -1
  864. package/dist/ui/toggle-switch.js +4 -3
  865. package/dist/ui/toggle-switch.js.map +1 -1
  866. package/dist/utils/automation-catalog.cjs +1 -1
  867. package/dist/utils/automation-catalog.cjs.map +1 -1
  868. package/dist/utils/automation-catalog.d.ts +12 -1
  869. package/dist/utils/automation-catalog.js +42 -12
  870. package/dist/utils/automation-catalog.js.map +1 -1
  871. package/dist/utils/automation-run-display.cjs +2 -0
  872. package/dist/utils/automation-run-display.cjs.map +1 -0
  873. package/dist/utils/automation-run-display.d.ts +20 -0
  874. package/dist/utils/automation-run-display.js +85 -0
  875. package/dist/utils/automation-run-display.js.map +1 -0
  876. package/dist/utils/automation-schedule.cjs +1 -1
  877. package/dist/utils/automation-schedule.cjs.map +1 -1
  878. package/dist/utils/automation-schedule.d.ts +16 -0
  879. package/dist/utils/automation-schedule.js +2 -0
  880. package/dist/utils/automation-schedule.js.map +1 -1
  881. package/dist/utils/constants.cjs +1 -1
  882. package/dist/utils/constants.cjs.map +1 -1
  883. package/dist/utils/constants.d.ts +4 -0
  884. package/dist/utils/constants.js +23 -3
  885. package/dist/utils/constants.js.map +1 -1
  886. package/dist/utils/format-event-timestamp.cjs +2 -0
  887. package/dist/utils/format-event-timestamp.cjs.map +1 -0
  888. package/dist/utils/format-event-timestamp.d.ts +1 -0
  889. package/dist/utils/format-event-timestamp.js +13 -0
  890. package/dist/utils/format-event-timestamp.js.map +1 -0
  891. package/dist/utils/format-model-name.cjs +1 -1
  892. package/dist/utils/format-model-name.cjs.map +1 -1
  893. package/dist/utils/format-model-name.d.ts +27 -6
  894. package/dist/utils/format-model-name.js +14 -6
  895. package/dist/utils/format-model-name.js.map +1 -1
  896. package/dist/utils/git-diff-stats.cjs +2 -2
  897. package/dist/utils/git-diff-stats.cjs.map +1 -1
  898. package/dist/utils/git-diff-stats.d.ts +4 -0
  899. package/dist/utils/git-diff-stats.js +12 -2
  900. package/dist/utils/git-diff-stats.js.map +1 -1
  901. package/dist/utils/plan-file.cjs +4 -0
  902. package/dist/utils/plan-file.cjs.map +1 -0
  903. package/dist/utils/plan-file.d.ts +18 -0
  904. package/dist/utils/plan-file.js +58 -0
  905. package/dist/utils/plan-file.js.map +1 -0
  906. package/dist/utils/recommended-automation-rail.cjs +1 -1
  907. package/dist/utils/recommended-automation-rail.cjs.map +1 -1
  908. package/dist/utils/recommended-automation-rail.js +1 -0
  909. package/dist/utils/recommended-automation-rail.js.map +1 -1
  910. package/dist/utils/scroll-fade-state.cjs +1 -1
  911. package/dist/utils/scroll-fade-state.cjs.map +1 -1
  912. package/dist/utils/scroll-fade-state.d.ts +6 -0
  913. package/dist/utils/scroll-fade-state.js +8 -1
  914. package/dist/utils/scroll-fade-state.js.map +1 -1
  915. package/dist/utils/sdk-settings-schema.cjs +1 -1
  916. package/dist/utils/sdk-settings-schema.cjs.map +1 -1
  917. package/dist/utils/sdk-settings-schema.d.ts +1 -0
  918. package/dist/utils/sdk-settings-schema.js +25 -22
  919. package/dist/utils/sdk-settings-schema.js.map +1 -1
  920. package/dist/utils/utils.cjs +1 -1
  921. package/dist/utils/utils.cjs.map +1 -1
  922. package/dist/utils/utils.js +11 -11
  923. package/dist/utils/utils.js.map +1 -1
  924. package/package.json +4 -4
  925. package/scripts/check-sdk-version-sync.mjs +6 -6
  926. package/scripts/dev-safe.mjs +1 -1
  927. package/scripts/dev-with-automation.mjs +1 -1
  928. package/scripts/static-server.mjs +33 -1
  929. package/build/assets/active-backend-context-CrHTlgvN.js +0 -2
  930. package/build/assets/agent-profiles-settings-Dzgb7G9z.js +0 -1
  931. package/build/assets/agent-server-conversation-service.api-tnqNjbpE.js +0 -86
  932. package/build/assets/agent-settings-DLtsqaOs.js +0 -2
  933. package/build/assets/agent-settings-fFvR-XC2.js +0 -1
  934. package/build/assets/alert-banner-HP6mX-Vr.js +0 -1
  935. package/build/assets/api-key-entry-screen-qTzrmJcr.js +0 -1
  936. package/build/assets/app-settings-dbnneVaV.js +0 -1
  937. package/build/assets/automation-detail-BmwlCUAB.js +0 -3
  938. package/build/assets/automation-git-sync-CprN5DcU.js +0 -1
  939. package/build/assets/automation-setup-route-C40kXjMY.js +0 -1
  940. package/build/assets/automations-list-DuNcRawl.js +0 -1
  941. package/build/assets/backend-form-modal-lhGwzXFI.js +0 -1
  942. package/build/assets/backend-synced-settings-badge-DPkz30BE.js +0 -1
  943. package/build/assets/badge-BU3S0VtE.js +0 -1
  944. package/build/assets/bot-dMYHVfYM.js +0 -1
  945. package/build/assets/browser-DSAo0tz1.js +0 -46
  946. package/build/assets/browser-tab-C9vy56R5.js +0 -1
  947. package/build/assets/canvas-extension-page-dx1gFrfW.js +0 -1
  948. package/build/assets/canvas-extensions-8A-XhpgP.js +0 -1
  949. package/build/assets/check-CS0vmpQQ.js +0 -1
  950. package/build/assets/chevron-down-e1QBpjVy.js +0 -1
  951. package/build/assets/chevron-right-ZG4R5G4Q.js +0 -1
  952. package/build/assets/circle-check-DzWLNsbE.js +0 -1
  953. package/build/assets/circle-plus-check-toggle-BO_kFZt3.js +0 -1
  954. package/build/assets/command-menu--UIlGL72.js +0 -1
  955. package/build/assets/commits-tab-AnZwLvh-.js +0 -1
  956. package/build/assets/confirmation-modal-Dv1ktp8K.js +0 -1
  957. package/build/assets/conversation-BbGrAO4Z.js +0 -93
  958. package/build/assets/conversation-mYT6NAoj.js +0 -1
  959. package/build/assets/conversation-panel-mYT6NAoj.js +0 -1
  960. package/build/assets/conversation-state-store-B0ImPLHO.js +0 -1
  961. package/build/assets/conversation-store-Ca3ghXap.js +0 -6
  962. package/build/assets/copy-to-clipboard-button-Ca8iSkkA.js +0 -1
  963. package/build/assets/device-verify-Bhn2e_Ye.js +0 -1
  964. package/build/assets/edit-automation-modal-DadGbJ2u.js +0 -1
  965. package/build/assets/empty-state-BoGVDecT.js +0 -1
  966. package/build/assets/enum-filter-dropdown-Bgca129f.js +0 -1
  967. package/build/assets/environment-switch-overlay-BmBRT7gv.js +0 -1
  968. package/build/assets/error-state-Body8Ngd.js +0 -1
  969. package/build/assets/extensions-hub-CcDqq_vR.js +0 -1
  970. package/build/assets/extensions-navigation-Cr4yzYk4.js +0 -1
  971. package/build/assets/external-link-DKUlnCQV.js +0 -1
  972. package/build/assets/files-tab-D4o2VyE_.js +0 -1
  973. package/build/assets/format-model-name-CasAP3nd.js +0 -1
  974. package/build/assets/get-git-path-ChKDVHZp.js +0 -1
  975. package/build/assets/git-repo-dropdown-4ROKl2cB.js +0 -1
  976. package/build/assets/git-repo-dropdown-BkqzkMmM.js +0 -1
  977. package/build/assets/highlighted-source-view-BFRxGT_Q.js +0 -1
  978. package/build/assets/home-ChpSuepX.js +0 -1
  979. package/build/assets/home-DIsB440S.js +0 -1
  980. package/build/assets/home-automation-run-tooltip-BVNDWjAH.js +0 -1
  981. package/build/assets/home-store-CY9Ej0ux.js +0 -1
  982. package/build/assets/index-home-BdlrFIif.js +0 -1
  983. package/build/assets/info-B6RQawoW.js +0 -1
  984. package/build/assets/install-server-modal-Dpy89p4g.js +0 -1
  985. package/build/assets/kebab-menu-item-content-D8hSNGmm.js +0 -1
  986. package/build/assets/launch-IrTDEFCs.js +0 -1
  987. package/build/assets/list-filter-DsEK7NFC.js +0 -1
  988. package/build/assets/llm-not-configured-banner-CIFABh3K.js +0 -27
  989. package/build/assets/llm-settings-B9juXhIa.js +0 -1
  990. package/build/assets/llm-settings-De1d5dfr.js +0 -1
  991. package/build/assets/llm-subscription-service-BpJ0ouQo.js +0 -1
  992. package/build/assets/loader-circle-CC1au6hc.js +0 -1
  993. package/build/assets/manage-backends-modal-BrPV3oB-.js +0 -1
  994. package/build/assets/manifest-80fb1c29.js +0 -1
  995. package/build/assets/manifest-subpage-layout-CAOYzrYp.js +0 -1
  996. package/build/assets/markdown-renderer-BzTlxI8x.js +0 -8
  997. package/build/assets/mcp-BTs_SXfZ.js +0 -1
  998. package/build/assets/mcp-page-BEBYqH_K.js +0 -9
  999. package/build/assets/messages-DKV9cRc2.js +0 -41
  1000. package/build/assets/modal-close-button-DDzdRvCs.js +0 -1
  1001. package/build/assets/onboarding-DV_OXoeP.js +0 -1
  1002. package/build/assets/onboarding-modal-rkyBYkeQ.js +0 -1
  1003. package/build/assets/organization-service.api-DrYNkEN_.js +0 -1
  1004. package/build/assets/pencil-47jAZH_V.js +0 -1
  1005. package/build/assets/pin-By41Vl5J.js +0 -1
  1006. package/build/assets/planner-tab-C9uZmhme.js +0 -1
  1007. package/build/assets/plug-CG5HFcNG.js +0 -1
  1008. package/build/assets/plugins-management-service-BMJgC3Ga.js +0 -1
  1009. package/build/assets/plus-C7Slq-0I.js +0 -1
  1010. package/build/assets/profiles-service.api-ChoKrL0l.js +0 -1
  1011. package/build/assets/providers-BhMcY5nv.js +0 -1
  1012. package/build/assets/proxy-9Fe1v5na.js +0 -1
  1013. package/build/assets/recommended-automations-launcher-6ABrI9Cy.js +0 -1
  1014. package/build/assets/refresh-cw-3q3Frrii.js +0 -1
  1015. package/build/assets/root-Dc8YmC9F.js +0 -2
  1016. package/build/assets/root-VDaypvK4.css +0 -1
  1017. package/build/assets/root-layout-CXkhSPYh.js +0 -2
  1018. package/build/assets/schema-field-D-y9-LDb.js +0 -1
  1019. package/build/assets/scroll-fade-state-Dw-i4SGq.js +0 -1
  1020. package/build/assets/sdk-section-page-BlFiizlG.js +0 -1
  1021. package/build/assets/secret-form-BB7the8W.js +0 -1
  1022. package/build/assets/secrets-service-ByZVENbp.js +0 -1
  1023. package/build/assets/secrets-settings-B_GpxKW2.js +0 -1
  1024. package/build/assets/settings-C0EWuBtA.js +0 -1
  1025. package/build/assets/settings-dropdown-input-BcwylHs2.js +0 -1
  1026. package/build/assets/settings-index-5w5UW2K3.js +0 -1
  1027. package/build/assets/settings-input-Db-1g8Ql.js +0 -1
  1028. package/build/assets/settings-modal-DfJ3tcJQ.js +0 -1
  1029. package/build/assets/settings-service.api-DJ1r62Zr.js +0 -1
  1030. package/build/assets/settings-switch-CS-dJDmA.js +0 -1
  1031. package/build/assets/shared-conversation-CA5ISEDy.js +0 -1
  1032. package/build/assets/shield-check-D2aCRd16.js +0 -1
  1033. package/build/assets/sidebar-mobile-menu-toggle-C_fb0Jki.js +0 -1
  1034. package/build/assets/sidebar-store-DGqHkVLw.js +0 -1
  1035. package/build/assets/skill-card-pill-row-B27-xyig.js +0 -1
  1036. package/build/assets/skill-scope-B42H-XOc.js +0 -1
  1037. package/build/assets/skills-plugins-tgF8EiXC.js +0 -1
  1038. package/build/assets/skills-settings-BgJ9PaOe.js +0 -1
  1039. package/build/assets/styled-tooltip-C4jf5Fv9.js +0 -1
  1040. package/build/assets/task-list-tab-C5zcaktH.js +0 -1
  1041. package/build/assets/toggle-switch-ChOLXv2n.js +0 -1
  1042. package/build/assets/trash-2-D7K26eDO.js +0 -1
  1043. package/build/assets/trash-D-HYiVYM.js +0 -1
  1044. package/build/assets/triangle-alert-CtdXWHUI.js +0 -1
  1045. package/build/assets/usage-tab-CVDffLPt.js +0 -1
  1046. package/build/assets/use-acp-credential-form-XIQmpX6M.js +0 -1
  1047. package/build/assets/use-activate-agent-profile-BLfmvDiG.js +0 -1
  1048. package/build/assets/use-agent-profiles-Bd9Bvvp1.js +0 -1
  1049. package/build/assets/use-canvas-extensions-Bi693ujJ.js +0 -1
  1050. package/build/assets/use-config-A9QovgXO.js +0 -1
  1051. package/build/assets/use-create-conversation-Dx3l7mFZ.js +0 -1
  1052. package/build/assets/use-create-secret-B9cUFWRG.js +0 -1
  1053. package/build/assets/use-has-permission-B3C8rQmR.js +0 -1
  1054. package/build/assets/use-is-authed-nTBcM7dE.js +0 -1
  1055. package/build/assets/use-llm-configured-BV9nZ1_j.js +0 -1
  1056. package/build/assets/use-llm-profiles-BO-P4Oyo.js +0 -1
  1057. package/build/assets/use-manifest-capabilities-Cw_flwEz.js +0 -1
  1058. package/build/assets/use-onboarding-completion-D8U7k4Qb.js +0 -1
  1059. package/build/assets/use-pinned-home-route-CckOZrmb.js +0 -1
  1060. package/build/assets/use-plugins-marketplace-7i94Zu3Z.js +0 -1
  1061. package/build/assets/use-save-agent-profile-BUjSsDXK.js +0 -1
  1062. package/build/assets/use-settings-DSXLbvBl.js +0 -1
  1063. package/build/assets/use-settings-nav-items-CwRw-CmX.js +0 -16
  1064. package/build/assets/use-tracking-D53y3TH9.js +0 -3
  1065. package/build/assets/useQueries-DlbhlH9I.js +0 -1
  1066. package/build/assets/useQuery-BSTgq1rl.js +0 -1
  1067. package/build/assets/utils-CN5ZfZy1.js +0 -1
  1068. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-DqZDXfg2.js +0 -186
  1069. package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-rfV8mQ9m.js +0 -1
  1070. package/build/assets/vendor~root-layout-C9Ju9DQg.js +0 -1
  1071. package/build/assets/vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-BWir3rJs.js +0 -1
  1072. package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-cDuKr-WD.js +0 -1
  1073. package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iyia17eu-Chf7vmKB.js +0 -1
  1074. package/build/assets/x-DJdhbdmt.js +0 -1
  1075. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +0 -2
  1076. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +0 -1
  1077. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.d.ts +0 -35
  1078. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +0 -247
  1079. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +0 -1
  1080. package/dist/hooks/query/use-skills.cjs +0 -2
  1081. package/dist/hooks/query/use-skills.cjs.map +0 -1
  1082. package/dist/hooks/query/use-skills.d.ts +0 -7
  1083. package/dist/hooks/query/use-skills.js +0 -13
  1084. package/dist/hooks/query/use-skills.js.map +0 -1
  1085. package/dist/hooks/use-has-permission.cjs +0 -2
  1086. package/dist/hooks/use-has-permission.cjs.map +0 -1
  1087. package/dist/hooks/use-has-permission.d.ts +0 -1
  1088. package/dist/hooks/use-has-permission.js +0 -8
  1089. package/dist/hooks/use-has-permission.js.map +0 -1
  1090. package/dist/node_modules/lucide-react/dist/esm/icons/eye.cjs +0 -2
  1091. package/dist/node_modules/lucide-react/dist/esm/icons/eye.cjs.map +0 -1
  1092. package/dist/node_modules/lucide-react/dist/esm/icons/eye.js +0 -14
  1093. package/dist/node_modules/lucide-react/dist/esm/icons/eye.js.map +0 -1
@@ -0,0 +1,85 @@
1
+ import { I18nKey as e } from "../i18n/declaration.js";
2
+ import { AutomationRunStatus as t } from "../types/automation.js";
3
+ //#region src/utils/automation-run-display.ts
4
+ var n = [
5
+ "success",
6
+ "partial_success",
7
+ "blocked",
8
+ "failed",
9
+ "unknown"
10
+ ];
11
+ function r(e) {
12
+ return typeof e == "object" && !!e && !Array.isArray(e);
13
+ }
14
+ function i(e) {
15
+ return typeof e == "string" && n.includes(e);
16
+ }
17
+ function a(e) {
18
+ return typeof e == "string" && e.trim() || null;
19
+ }
20
+ var o = new Set(["status", "outcome_summary"]);
21
+ function s(e) {
22
+ return e.run_metadata?.finish_tool_response ?? null;
23
+ }
24
+ function c(e) {
25
+ let t = a(e);
26
+ if (t) return t;
27
+ if (typeof e == "number" || typeof e == "boolean") return String(e);
28
+ if (e == null) return null;
29
+ try {
30
+ return JSON.stringify(e, null, 2);
31
+ } catch {
32
+ return String(e);
33
+ }
34
+ }
35
+ function l(e) {
36
+ if (e == null) return null;
37
+ if (!r(e)) return e;
38
+ let t = Object.entries(e).filter(([e]) => !o.has(e));
39
+ return t.length > 0 ? Object.fromEntries(t) : "status" in e && !i(e.status) ? { status: e.status } : null;
40
+ }
41
+ function u(e) {
42
+ let t = s(e);
43
+ if (!r(t)) return null;
44
+ let n = a(t.outcome_summary);
45
+ return typeof t.status != "string" && !n ? null : {
46
+ status: i(t.status) ? t.status : "unknown",
47
+ outcomeSummary: n
48
+ };
49
+ }
50
+ function d(e) {
51
+ let n = s(e), r = l(n), i = c(r), o = u(e), d = a(e.error_detail);
52
+ return e.status === t.COMPLETED ? {
53
+ badgeStatus: o?.status ?? (n === null ? "success" : "unknown"),
54
+ summary: o?.outcomeSummary ?? null,
55
+ taskOutcome: o,
56
+ customTaskMetadata: r,
57
+ customTaskMetadataText: i
58
+ } : {
59
+ badgeStatus: e.status,
60
+ summary: d,
61
+ taskOutcome: o,
62
+ customTaskMetadata: r,
63
+ customTaskMetadataText: i
64
+ };
65
+ }
66
+ function f(n) {
67
+ switch (n) {
68
+ case t.COMPLETED:
69
+ case "success": return e.AUTOMATIONS$DETAIL$SUCCESSFUL;
70
+ case t.FAILED:
71
+ case "failed": return e.AUTOMATIONS$DETAIL$FAILED;
72
+ case t.PENDING: return e.AUTOMATIONS$DETAIL$PENDING;
73
+ case t.RUNNING: return e.AUTOMATIONS$DETAIL$RUNNING;
74
+ case t.CANCELLED: return e.AUTOMATIONS$DETAIL$CANCELLED;
75
+ case t.SKIPPED: return e.AUTOMATIONS$DETAIL$SKIPPED;
76
+ case "blocked": return e.AUTOMATIONS$DETAIL$BLOCKED;
77
+ case "partial_success": return e.AUTOMATIONS$DETAIL$PARTIAL;
78
+ case "unknown": return e.AUTOMATIONS$DETAIL$NEEDS_REVIEW;
79
+ default: return e.FEATURED_AUTOMATIONS$STATUS_UNKNOWN;
80
+ }
81
+ }
82
+ //#endregion
83
+ export { f as getAutomationRunBadgeLabelKey, d as getAutomationRunDisplay };
84
+
85
+ //# sourceMappingURL=automation-run-display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automation-run-display.js","names":[],"sources":["../../src/utils/automation-run-display.ts"],"sourcesContent":["import { I18nKey } from \"#/i18n/declaration\";\nimport {\n AutomationRunStatus,\n type AutomationRun,\n type AutomationTaskOutcomeStatus,\n} from \"#/types/automation\";\n\nexport type AutomationRunBadgeStatus =\n | AutomationRunStatus\n | AutomationTaskOutcomeStatus;\n\nexport interface AutomationRunTaskOutcome {\n status: AutomationTaskOutcomeStatus;\n outcomeSummary: string | null;\n}\n\nexport interface AutomationRunDisplay {\n badgeStatus: AutomationRunBadgeStatus;\n summary: string | null;\n taskOutcome: AutomationRunTaskOutcome | null;\n customTaskMetadata: unknown | null;\n customTaskMetadataText: string | null;\n}\n\nconst TASK_OUTCOME_STATUSES: readonly AutomationTaskOutcomeStatus[] = [\n \"success\",\n \"partial_success\",\n \"blocked\",\n \"failed\",\n \"unknown\",\n];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nexport function isTaskOutcomeStatus(\n value: unknown,\n): value is AutomationTaskOutcomeStatus {\n return (\n typeof value === \"string\" &&\n TASK_OUTCOME_STATUSES.includes(value as AutomationTaskOutcomeStatus)\n );\n}\n\nfunction trimString(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n return value.trim() || null;\n}\n\nconst DEFAULT_FINISH_TOOL_RESPONSE_KEYS = new Set([\n \"status\",\n \"outcome_summary\",\n]);\n\nexport function getAutomationRunFinishToolResponse(\n run: AutomationRun,\n): unknown | null {\n const response = run.run_metadata?.finish_tool_response;\n return response === undefined || response === null ? null : response;\n}\n\nexport function formatAutomationRunTaskMetadata(\n metadata: unknown,\n): string | null {\n const trimmed = trimString(metadata);\n if (trimmed) return trimmed;\n if (typeof metadata === \"number\" || typeof metadata === \"boolean\") {\n return String(metadata);\n }\n if (metadata === null || metadata === undefined) return null;\n\n try {\n return JSON.stringify(metadata, null, 2);\n } catch {\n return String(metadata);\n }\n}\n\nfunction getCustomFinishToolMetadata(response: unknown): unknown | null {\n if (response === null || response === undefined) return null;\n if (!isRecord(response)) return response;\n\n const customEntries = Object.entries(response).filter(\n ([key]) => !DEFAULT_FINISH_TOOL_RESPONSE_KEYS.has(key),\n );\n if (customEntries.length > 0) return Object.fromEntries(customEntries);\n\n if (\"status\" in response && !isTaskOutcomeStatus(response.status)) {\n return { status: response.status };\n }\n\n return null;\n}\n\nexport function getAutomationRunTaskOutcome(\n run: AutomationRun,\n): AutomationRunTaskOutcome | null {\n const response = getAutomationRunFinishToolResponse(run);\n if (!isRecord(response)) return null;\n\n const outcomeSummary = trimString(response.outcome_summary);\n const hasStatus = typeof response.status === \"string\";\n if (!hasStatus && !outcomeSummary) return null;\n\n return {\n status: isTaskOutcomeStatus(response.status) ? response.status : \"unknown\",\n outcomeSummary,\n };\n}\n\nexport function getAutomationRunDisplay(\n run: AutomationRun,\n): AutomationRunDisplay {\n const finishToolResponse = getAutomationRunFinishToolResponse(run);\n const customTaskMetadata = getCustomFinishToolMetadata(finishToolResponse);\n const customTaskMetadataText =\n formatAutomationRunTaskMetadata(customTaskMetadata);\n const taskOutcome = getAutomationRunTaskOutcome(run);\n const systemSummary = trimString(run.error_detail);\n\n if (run.status === AutomationRunStatus.COMPLETED) {\n return {\n badgeStatus:\n taskOutcome?.status ??\n (finishToolResponse !== null ? \"unknown\" : \"success\"),\n summary: taskOutcome?.outcomeSummary ?? null,\n taskOutcome,\n customTaskMetadata,\n customTaskMetadataText,\n };\n }\n\n return {\n badgeStatus: run.status,\n summary: systemSummary,\n taskOutcome,\n customTaskMetadata,\n customTaskMetadataText,\n };\n}\n\nexport function getAutomationRunBadgeLabelKey(\n status: AutomationRunBadgeStatus | string,\n): I18nKey {\n switch (status) {\n case AutomationRunStatus.COMPLETED:\n case \"success\":\n return I18nKey.AUTOMATIONS$DETAIL$SUCCESSFUL;\n case AutomationRunStatus.FAILED:\n case \"failed\":\n return I18nKey.AUTOMATIONS$DETAIL$FAILED;\n case AutomationRunStatus.PENDING:\n return I18nKey.AUTOMATIONS$DETAIL$PENDING;\n case AutomationRunStatus.RUNNING:\n return I18nKey.AUTOMATIONS$DETAIL$RUNNING;\n case AutomationRunStatus.CANCELLED:\n return I18nKey.AUTOMATIONS$DETAIL$CANCELLED;\n case AutomationRunStatus.SKIPPED:\n return I18nKey.AUTOMATIONS$DETAIL$SKIPPED;\n case \"blocked\":\n return I18nKey.AUTOMATIONS$DETAIL$BLOCKED;\n case \"partial_success\":\n return I18nKey.AUTOMATIONS$DETAIL$PARTIAL;\n case \"unknown\":\n return I18nKey.AUTOMATIONS$DETAIL$NEEDS_REVIEW;\n default:\n return I18nKey.FEATURED_AUTOMATIONS$STATUS_UNKNOWN;\n }\n}\n"],"mappings":";;;AAwBA,IAAM,IAAgE;CACpE;CACA;CACA;CACA;CACA;AACF;AAEA,SAAS,EAAS,GAAkD;CAClE,OAAO,OAAO,KAAU,cAAY,KAAkB,CAAC,MAAM,QAAQ,CAAK;AAC5E;AAEA,SAAgB,EACd,GACsC;CACtC,OACE,OAAO,KAAU,YACjB,EAAsB,SAAS,CAAoC;AAEvE;AAEA,SAAS,EAAW,GAA+B;CAEjD,OADI,OAAO,KAAU,YACd,EAAM,KAAK,KADoB;AAExC;AAEA,IAAM,IAAoC,IAAI,IAAI,CAChD,UACA,iBACF,CAAC;AAED,SAAgB,EACd,GACgB;CAEhB,OADiB,EAAI,cAAc,wBACkB;AACvD;AAEA,SAAgB,EACd,GACe;CACf,IAAM,IAAU,EAAW,CAAQ;CACnC,IAAI,GAAS,OAAO;CACpB,IAAI,OAAO,KAAa,YAAY,OAAO,KAAa,WACtD,OAAO,OAAO,CAAQ;CAExB,IAAI,KAAa,MAAgC,OAAO;CAExD,IAAI;EACF,OAAO,KAAK,UAAU,GAAU,MAAM,CAAC;CACzC,QAAQ;EACN,OAAO,OAAO,CAAQ;CACxB;AACF;AAEA,SAAS,EAA4B,GAAmC;CACtE,IAAI,KAAa,MAAgC,OAAO;CACxD,IAAI,CAAC,EAAS,CAAQ,GAAG,OAAO;CAEhC,IAAM,IAAgB,OAAO,QAAQ,CAAQ,EAAE,QAC5C,CAAC,OAAS,CAAC,EAAkC,IAAI,CAAG,CACvD;CAOA,OANI,EAAc,SAAS,IAAU,OAAO,YAAY,CAAa,IAEjE,YAAY,KAAY,CAAC,EAAoB,EAAS,MAAM,IACvD,EAAE,QAAQ,EAAS,OAAO,IAG5B;AACT;AAEA,SAAgB,EACd,GACiC;CACjC,IAAM,IAAW,EAAmC,CAAG;CACvD,IAAI,CAAC,EAAS,CAAQ,GAAG,OAAO;CAEhC,IAAM,IAAiB,EAAW,EAAS,eAAe;CAI1D,OAHkB,OAAO,EAAS,UAAW,YAC3B,CAAC,IAAuB,OAEnC;EACL,QAAQ,EAAoB,EAAS,MAAM,IAAI,EAAS,SAAS;EACjE;CACF;AACF;AAEA,SAAgB,EACd,GACsB;CACtB,IAAM,IAAqB,EAAmC,CAAG,GAC3D,IAAqB,EAA4B,CAAkB,GACnE,IACJ,EAAgC,CAAkB,GAC9C,IAAc,EAA4B,CAAG,GAC7C,IAAgB,EAAW,EAAI,YAAY;CAcjD,OAZI,EAAI,WAAW,EAAoB,YAC9B;EACL,aACE,GAAa,WACZ,MAAuB,OAAmB,YAAZ;EACjC,SAAS,GAAa,kBAAkB;EACxC;EACA;EACA;CACF,IAGK;EACL,aAAa,EAAI;EACjB,SAAS;EACT;EACA;EACA;CACF;AACF;AAEA,SAAgB,EACd,GACS;CACT,QAAQ,GAAR;EACE,KAAK,EAAoB;EACzB,KAAK,WACH,OAAO,EAAQ;EACjB,KAAK,EAAoB;EACzB,KAAK,UACH,OAAO,EAAQ;EACjB,KAAK,EAAoB,SACvB,OAAO,EAAQ;EACjB,KAAK,EAAoB,SACvB,OAAO,EAAQ;EACjB,KAAK,EAAoB,WACvB,OAAO,EAAQ;EACjB,KAAK,EAAoB,SACvB,OAAO,EAAQ;EACjB,KAAK,WACH,OAAO,EAAQ;EACjB,KAAK,mBACH,OAAO,EAAQ;EACjB,KAAK,WACH,OAAO,EAAQ;EACjB,SACE,OAAO,EAAQ;CACnB;AACF"}
@@ -1,2 +1,2 @@
1
- require("../_virtual/_rolldown/runtime.cjs");function e(e){return e?Array.isArray(e)?e.join(`, `):e:`—`}exports.formatEventOn=e;
1
+ require("../_virtual/_rolldown/runtime.cjs");function e(e){return e?Array.isArray(e)?e.join(`, `):e:`—`}var t=`JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC`,n=`SUN|MON|TUE|WED|THU|FRI|SAT`;RegExp(`^(?:${t})(?:-(?:${t}))?(?:/\\d+)?$`,`i`),RegExp(`^(?:(?:${n}|\\d+)(?:-(?:${n}|\\d+))?(?:/\\d+)?(?:#\\d+)?|\\?)$`,`i`),exports.formatEventOn=e;
2
2
  //# sourceMappingURL=automation-schedule.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"automation-schedule.cjs","names":[],"sources":["../../src/utils/automation-schedule.ts"],"sourcesContent":["export type SchedulePresetKind = \"daily\" | \"weekdays\" | \"weekly\";\n\nexport interface PresetSchedule {\n kind: SchedulePresetKind;\n hour: number;\n minute: number;\n weekday?: number;\n}\n\nexport interface CustomSchedule {\n kind: \"custom\";\n raw: string;\n hour?: number;\n minute?: number;\n}\n\nexport type ParsedSchedule = PresetSchedule | CustomSchedule;\n\nconst SINGLE_INT = /^(\\d+)$/;\n\nfunction parseSingleInt(\n field: string,\n min: number,\n max: number,\n): number | null {\n const match = field.match(SINGLE_INT);\n if (!match) return null;\n const value = Number(match[1]);\n if (Number.isNaN(value) || value < min || value > max) return null;\n return value;\n}\n\nexport function parseCronSchedule(\n cron: string | undefined | null,\n): ParsedSchedule {\n const raw = (cron ?? \"\").trim();\n if (!raw) return { kind: \"custom\", raw: \"\" };\n\n const fields = raw.split(/\\s+/);\n if (fields.length !== 5) return { kind: \"custom\", raw };\n\n const [minuteField, hourField, domField, monthField, dowField] = fields;\n\n const minute = parseSingleInt(minuteField, 0, 59);\n const hour = parseSingleInt(hourField, 0, 23);\n\n if (minute === null || hour === null) {\n return { kind: \"custom\", raw };\n }\n if (domField !== \"*\" || monthField !== \"*\") {\n return { kind: \"custom\", raw, hour, minute };\n }\n\n if (dowField === \"*\" || dowField === \"0-6\") {\n return { kind: \"daily\", hour, minute };\n }\n if (dowField === \"1-5\") {\n return { kind: \"weekdays\", hour, minute };\n }\n const weekday = parseSingleInt(dowField, 0, 6);\n if (weekday !== null) {\n return { kind: \"weekly\", hour, minute, weekday };\n }\n return { kind: \"custom\", raw, hour, minute };\n}\n\nexport function buildCronSchedule(input: PresetSchedule): string {\n const { kind, hour, minute, weekday } = input;\n switch (kind) {\n case \"daily\":\n return `${minute} ${hour} * * *`;\n case \"weekdays\":\n return `${minute} ${hour} * * 1-5`;\n case \"weekly\":\n return `${minute} ${hour} * * ${weekday ?? 1}`;\n default: {\n const _exhaustive: never = kind;\n return _exhaustive;\n }\n }\n}\n\nexport function formatTimeOfDay(hour: number, minute: number): string {\n const hh = String(hour).padStart(2, \"0\");\n const mm = String(minute).padStart(2, \"0\");\n return `${hh}:${mm}`;\n}\n\nexport function parseTimeOfDay(\n value: string,\n): { hour: number; minute: number } | null {\n const match = value.match(/^(\\d{1,2}):(\\d{2})$/);\n if (!match) return null;\n const hour = Number(match[1]);\n const minute = Number(match[2]);\n if (\n Number.isNaN(hour) ||\n Number.isNaN(minute) ||\n hour < 0 ||\n hour > 23 ||\n minute < 0 ||\n minute > 59\n ) {\n return null;\n }\n return { hour, minute };\n}\n\nexport function formatEventOn(on: string | string[] | undefined): string {\n if (!on) return \"—\";\n if (Array.isArray(on)) return on.join(\", \");\n return on;\n}\n"],"mappings":"6CA4GA,SAAgB,EAAc,EAA2C,CAGvE,OAFK,EACD,MAAM,QAAQ,CAAE,EAAU,EAAG,KAAK,IAAI,EACnC,EAFS,GAGlB"}
1
+ {"version":3,"file":"automation-schedule.cjs","names":[],"sources":["../../src/utils/automation-schedule.ts"],"sourcesContent":["import { I18nKey } from \"#/i18n/declaration\";\n\nexport type SchedulePresetKind = \"daily\" | \"weekdays\" | \"weekly\";\n\nexport interface PresetSchedule {\n kind: SchedulePresetKind;\n hour: number;\n minute: number;\n weekday?: number;\n}\n\nexport interface CustomSchedule {\n kind: \"custom\";\n raw: string;\n hour?: number;\n minute?: number;\n}\n\nexport type ParsedSchedule = PresetSchedule | CustomSchedule;\n\nconst SINGLE_INT = /^(\\d+)$/;\n\nfunction parseSingleInt(\n field: string,\n min: number,\n max: number,\n): number | null {\n const match = field.match(SINGLE_INT);\n if (!match) return null;\n const value = Number(match[1]);\n if (Number.isNaN(value) || value < min || value > max) return null;\n return value;\n}\n\nexport function parseCronSchedule(\n cron: string | undefined | null,\n): ParsedSchedule {\n const raw = (cron ?? \"\").trim();\n if (!raw) return { kind: \"custom\", raw: \"\" };\n\n const fields = raw.split(/\\s+/);\n if (fields.length !== 5) return { kind: \"custom\", raw };\n\n const [minuteField, hourField, domField, monthField, dowField] = fields;\n\n const minute = parseSingleInt(minuteField, 0, 59);\n const hour = parseSingleInt(hourField, 0, 23);\n\n if (minute === null || hour === null) {\n return { kind: \"custom\", raw };\n }\n if (domField !== \"*\" || monthField !== \"*\") {\n return { kind: \"custom\", raw, hour, minute };\n }\n\n if (dowField === \"*\" || dowField === \"0-6\") {\n return { kind: \"daily\", hour, minute };\n }\n if (dowField === \"1-5\") {\n return { kind: \"weekdays\", hour, minute };\n }\n const weekday = parseSingleInt(dowField, 0, 6);\n if (weekday !== null) {\n return { kind: \"weekly\", hour, minute, weekday };\n }\n return { kind: \"custom\", raw, hour, minute };\n}\n\nexport function buildCronSchedule(input: PresetSchedule): string {\n const { kind, hour, minute, weekday } = input;\n switch (kind) {\n case \"daily\":\n return `${minute} ${hour} * * *`;\n case \"weekdays\":\n return `${minute} ${hour} * * 1-5`;\n case \"weekly\":\n return `${minute} ${hour} * * ${weekday ?? 1}`;\n default: {\n const _exhaustive: never = kind;\n return _exhaustive;\n }\n }\n}\n\nexport function formatTimeOfDay(hour: number, minute: number): string {\n const hh = String(hour).padStart(2, \"0\");\n const mm = String(minute).padStart(2, \"0\");\n return `${hh}:${mm}`;\n}\n\nexport function parseTimeOfDay(\n value: string,\n): { hour: number; minute: number } | null {\n const match = value.match(/^(\\d{1,2}):(\\d{2})$/);\n if (!match) return null;\n const hour = Number(match[1]);\n const minute = Number(match[2]);\n if (\n Number.isNaN(hour) ||\n Number.isNaN(minute) ||\n hour < 0 ||\n hour > 23 ||\n minute < 0 ||\n minute > 59\n ) {\n return null;\n }\n return { hour, minute };\n}\n\nexport function formatEventOn(on: string | string[] | undefined): string {\n if (!on) return \"—\";\n if (Array.isArray(on)) return on.join(\", \");\n return on;\n}\n\n/** Example expression shown when the cron field is empty. */\nexport const CRON_EXPRESSION_EXAMPLE = \"*/10 * * * *\";\n\n// The service validates with croniter, so this must accept everything croniter\n// does: five fields, optionally plus seconds and then year, or an alias.\nconst CRON_ALIASES = new Set([\n \"@yearly\",\n \"@annually\",\n \"@monthly\",\n \"@weekly\",\n \"@daily\",\n \"@midnight\",\n \"@hourly\",\n]);\n\nconst CRON_MIN_FIELDS = 5;\nconst CRON_MAX_FIELDS = 7;\n\n// Seconds and year are appended after these, so the positions always hold.\nconst CRON_FIELD_BOUNDS: readonly (readonly [number, number])[] = [\n [0, 59], // minute\n [0, 23], // hour\n [1, 31], // day of month\n [1, 12], // month\n [0, 7], // day of week — croniter spells Sunday 0 and 7\n];\n\nconst DAY_OF_MONTH_INDEX = 2;\nconst MONTH_INDEX = 3;\n\n// Indexed from 1. February is 29: the 29th does fire, in leap years.\nconst MAX_DAYS_IN_MONTH = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\nconst MONTH_NAMES = \"JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC\";\nconst DAY_NAMES = \"SUN|MON|TUE|WED|THU|FRI|SAT\";\n\n// croniter does not bound the step: `*/90` is accepted.\nconst NUMERIC_TERM = /^(\\*|\\d+(?:-\\d+)?)(?:\\/(\\d+))?$/;\n\n/** Vocabulary beyond plain numbers, matched but not expanded. */\nconst EXTRA_TERM_PATTERNS: readonly (RegExp | null)[] = [\n null, // minute\n null, // hour\n /^(?:\\?|L|\\d+W)$/i, // `?`, `L`, `15W`\n new RegExp(`^(?:${MONTH_NAMES})(?:-(?:${MONTH_NAMES}))?(?:/\\\\d+)?$`, \"i\"),\n // `SUN`, `MON-FRI#2`, `5#3`, `?` — but no `L`, which croniter rejects here.\n new RegExp(\n `^(?:(?:${DAY_NAMES}|\\\\d+)(?:-(?:${DAY_NAMES}|\\\\d+))?(?:/\\\\d+)?(?:#\\\\d+)?|\\\\?)$`,\n \"i\",\n ),\n];\n\ntype CronFieldParse =\n | { kind: \"invalid\" }\n /** Well-formed, but not expanded, so it constrains nothing. */\n | { kind: \"unmodelled\" }\n | { kind: \"values\"; values: number[] };\n\nfunction parseCronField(\n field: string,\n [min, max]: readonly [number, number],\n extraPattern: RegExp | null,\n): CronFieldParse {\n const values = new Set<number>();\n\n for (const term of field.split(\",\")) {\n const match = term.match(NUMERIC_TERM);\n if (!match) {\n if (extraPattern?.test(term)) return { kind: \"unmodelled\" };\n return { kind: \"invalid\" };\n }\n\n const [, rangePart, stepPart] = match;\n const step = stepPart === undefined ? 1 : Number(stepPart);\n if (step < 1) return { kind: \"invalid\" };\n\n if (rangePart === \"*\") {\n for (let value = min; value <= max; value += step) values.add(value);\n continue;\n }\n\n const [startPart, endPart] = rangePart.split(\"-\");\n const start = parseSingleInt(startPart, min, max);\n if (start === null) return { kind: \"invalid\" };\n if (endPart === undefined) {\n values.add(start);\n continue;\n }\n const end = parseSingleInt(endPart, min, max);\n if (end === null) return { kind: \"invalid\" };\n // croniter wraps a reversed range like `5-1`; that wrap is not modelled.\n if (end < start) return { kind: \"unmodelled\" };\n for (let value = start; value <= end; value += step) values.add(value);\n }\n\n return { kind: \"values\", values: [...values] };\n}\n\nexport type CronScheduleValidation =\n | { schedule: string }\n | { errorKey: I18nKey };\n\n/**\n * Validate a raw cron expression from the edit form — `parseCronSchedule` only\n * classifies against the presets, reporting arbitrary text as `custom`.\n *\n * One-sided by design: rejects only what croniter certainly rejects, and defers\n * on anything it does not model.\n */\nexport function validateCronSchedule(raw: string): CronScheduleValidation {\n const schedule = raw.trim();\n if (!schedule) return { errorKey: I18nKey.AUTOMATIONS$ERROR_CRON_INVALID };\n\n if (schedule.startsWith(\"@\")) {\n return CRON_ALIASES.has(schedule.toLowerCase())\n ? { schedule }\n : { errorKey: I18nKey.AUTOMATIONS$ERROR_CRON_INVALID };\n }\n\n const fields = schedule.split(/\\s+/);\n if (fields.length < CRON_MIN_FIELDS || fields.length > CRON_MAX_FIELDS) {\n return { errorKey: I18nKey.AUTOMATIONS$ERROR_CRON_INVALID };\n }\n\n const parsed = CRON_FIELD_BOUNDS.map((bounds, index) =>\n parseCronField(fields[index], bounds, EXTRA_TERM_PATTERNS[index]),\n );\n if (parsed.some((field) => field.kind === \"invalid\")) {\n return { errorKey: I18nKey.AUTOMATIONS$ERROR_CRON_INVALID };\n }\n\n // croniter parses `0 0 31 2 *` and then finds no fire time for it.\n const days = parsed[DAY_OF_MONTH_INDEX];\n const months = parsed[MONTH_INDEX];\n if (\n days.kind === \"values\" &&\n months.kind === \"values\" &&\n !months.values.some((month) =>\n days.values.some((day) => day <= MAX_DAYS_IN_MONTH[month]),\n )\n ) {\n return { errorKey: I18nKey.AUTOMATIONS$ERROR_CRON_UNREACHABLE };\n }\n\n return { schedule };\n}\n"],"mappings":"6CA8GA,SAAgB,EAAc,EAA2C,CAGvE,OAFK,EACD,MAAM,QAAQ,CAAE,EAAU,EAAG,KAAK,IAAI,EACnC,EAFS,GAGlB,CAmCA,IAAM,EAAc,kDACd,EAAY,8BAUZ,OAAO,OAAO,EAAY,UAAU,EAAY,gBAAiB,GAAG,EAEpE,OACF,UAAU,EAAU,eAAe,EAAU,oCAC7C,GACF"}
@@ -1,3 +1,4 @@
1
+ import { I18nKey } from "#/i18n/declaration";
1
2
  export type SchedulePresetKind = "daily" | "weekdays" | "weekly";
2
3
  export interface PresetSchedule {
3
4
  kind: SchedulePresetKind;
@@ -20,3 +21,18 @@ export declare function parseTimeOfDay(value: string): {
20
21
  minute: number;
21
22
  } | null;
22
23
  export declare function formatEventOn(on: string | string[] | undefined): string;
24
+ /** Example expression shown when the cron field is empty. */
25
+ export declare const CRON_EXPRESSION_EXAMPLE = "*/10 * * * *";
26
+ export type CronScheduleValidation = {
27
+ schedule: string;
28
+ } | {
29
+ errorKey: I18nKey;
30
+ };
31
+ /**
32
+ * Validate a raw cron expression from the edit form — `parseCronSchedule` only
33
+ * classifies against the presets, reporting arbitrary text as `custom`.
34
+ *
35
+ * One-sided by design: rejects only what croniter certainly rejects, and defers
36
+ * on anything it does not model.
37
+ */
38
+ export declare function validateCronSchedule(raw: string): CronScheduleValidation;
@@ -2,6 +2,8 @@
2
2
  function e(e) {
3
3
  return e ? Array.isArray(e) ? e.join(", ") : e : "—";
4
4
  }
5
+ var t = "JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC", n = "SUN|MON|TUE|WED|THU|FRI|SAT";
6
+ RegExp(`^(?:${t})(?:-(?:${t}))?(?:/\\d+)?$`, "i"), RegExp(`^(?:(?:${n}|\\d+)(?:-(?:${n}|\\d+))?(?:/\\d+)?(?:#\\d+)?|\\?)$`, "i");
5
7
  //#endregion
6
8
  export { e as formatEventOn };
7
9
 
@@ -1 +1 @@
1
- {"version":3,"file":"automation-schedule.js","names":[],"sources":["../../src/utils/automation-schedule.ts"],"sourcesContent":["export type SchedulePresetKind = \"daily\" | \"weekdays\" | \"weekly\";\n\nexport interface PresetSchedule {\n kind: SchedulePresetKind;\n hour: number;\n minute: number;\n weekday?: number;\n}\n\nexport interface CustomSchedule {\n kind: \"custom\";\n raw: string;\n hour?: number;\n minute?: number;\n}\n\nexport type ParsedSchedule = PresetSchedule | CustomSchedule;\n\nconst SINGLE_INT = /^(\\d+)$/;\n\nfunction parseSingleInt(\n field: string,\n min: number,\n max: number,\n): number | null {\n const match = field.match(SINGLE_INT);\n if (!match) return null;\n const value = Number(match[1]);\n if (Number.isNaN(value) || value < min || value > max) return null;\n return value;\n}\n\nexport function parseCronSchedule(\n cron: string | undefined | null,\n): ParsedSchedule {\n const raw = (cron ?? \"\").trim();\n if (!raw) return { kind: \"custom\", raw: \"\" };\n\n const fields = raw.split(/\\s+/);\n if (fields.length !== 5) return { kind: \"custom\", raw };\n\n const [minuteField, hourField, domField, monthField, dowField] = fields;\n\n const minute = parseSingleInt(minuteField, 0, 59);\n const hour = parseSingleInt(hourField, 0, 23);\n\n if (minute === null || hour === null) {\n return { kind: \"custom\", raw };\n }\n if (domField !== \"*\" || monthField !== \"*\") {\n return { kind: \"custom\", raw, hour, minute };\n }\n\n if (dowField === \"*\" || dowField === \"0-6\") {\n return { kind: \"daily\", hour, minute };\n }\n if (dowField === \"1-5\") {\n return { kind: \"weekdays\", hour, minute };\n }\n const weekday = parseSingleInt(dowField, 0, 6);\n if (weekday !== null) {\n return { kind: \"weekly\", hour, minute, weekday };\n }\n return { kind: \"custom\", raw, hour, minute };\n}\n\nexport function buildCronSchedule(input: PresetSchedule): string {\n const { kind, hour, minute, weekday } = input;\n switch (kind) {\n case \"daily\":\n return `${minute} ${hour} * * *`;\n case \"weekdays\":\n return `${minute} ${hour} * * 1-5`;\n case \"weekly\":\n return `${minute} ${hour} * * ${weekday ?? 1}`;\n default: {\n const _exhaustive: never = kind;\n return _exhaustive;\n }\n }\n}\n\nexport function formatTimeOfDay(hour: number, minute: number): string {\n const hh = String(hour).padStart(2, \"0\");\n const mm = String(minute).padStart(2, \"0\");\n return `${hh}:${mm}`;\n}\n\nexport function parseTimeOfDay(\n value: string,\n): { hour: number; minute: number } | null {\n const match = value.match(/^(\\d{1,2}):(\\d{2})$/);\n if (!match) return null;\n const hour = Number(match[1]);\n const minute = Number(match[2]);\n if (\n Number.isNaN(hour) ||\n Number.isNaN(minute) ||\n hour < 0 ||\n hour > 23 ||\n minute < 0 ||\n minute > 59\n ) {\n return null;\n }\n return { hour, minute };\n}\n\nexport function formatEventOn(on: string | string[] | undefined): string {\n if (!on) return \"—\";\n if (Array.isArray(on)) return on.join(\", \");\n return on;\n}\n"],"mappings":";AA4GA,SAAgB,EAAc,GAA2C;CAGvE,OAFK,IACD,MAAM,QAAQ,CAAE,IAAU,EAAG,KAAK,IAAI,IACnC,IAFS;AAGlB"}
1
+ {"version":3,"file":"automation-schedule.js","names":[],"sources":["../../src/utils/automation-schedule.ts"],"sourcesContent":["import { I18nKey } from \"#/i18n/declaration\";\n\nexport type SchedulePresetKind = \"daily\" | \"weekdays\" | \"weekly\";\n\nexport interface PresetSchedule {\n kind: SchedulePresetKind;\n hour: number;\n minute: number;\n weekday?: number;\n}\n\nexport interface CustomSchedule {\n kind: \"custom\";\n raw: string;\n hour?: number;\n minute?: number;\n}\n\nexport type ParsedSchedule = PresetSchedule | CustomSchedule;\n\nconst SINGLE_INT = /^(\\d+)$/;\n\nfunction parseSingleInt(\n field: string,\n min: number,\n max: number,\n): number | null {\n const match = field.match(SINGLE_INT);\n if (!match) return null;\n const value = Number(match[1]);\n if (Number.isNaN(value) || value < min || value > max) return null;\n return value;\n}\n\nexport function parseCronSchedule(\n cron: string | undefined | null,\n): ParsedSchedule {\n const raw = (cron ?? \"\").trim();\n if (!raw) return { kind: \"custom\", raw: \"\" };\n\n const fields = raw.split(/\\s+/);\n if (fields.length !== 5) return { kind: \"custom\", raw };\n\n const [minuteField, hourField, domField, monthField, dowField] = fields;\n\n const minute = parseSingleInt(minuteField, 0, 59);\n const hour = parseSingleInt(hourField, 0, 23);\n\n if (minute === null || hour === null) {\n return { kind: \"custom\", raw };\n }\n if (domField !== \"*\" || monthField !== \"*\") {\n return { kind: \"custom\", raw, hour, minute };\n }\n\n if (dowField === \"*\" || dowField === \"0-6\") {\n return { kind: \"daily\", hour, minute };\n }\n if (dowField === \"1-5\") {\n return { kind: \"weekdays\", hour, minute };\n }\n const weekday = parseSingleInt(dowField, 0, 6);\n if (weekday !== null) {\n return { kind: \"weekly\", hour, minute, weekday };\n }\n return { kind: \"custom\", raw, hour, minute };\n}\n\nexport function buildCronSchedule(input: PresetSchedule): string {\n const { kind, hour, minute, weekday } = input;\n switch (kind) {\n case \"daily\":\n return `${minute} ${hour} * * *`;\n case \"weekdays\":\n return `${minute} ${hour} * * 1-5`;\n case \"weekly\":\n return `${minute} ${hour} * * ${weekday ?? 1}`;\n default: {\n const _exhaustive: never = kind;\n return _exhaustive;\n }\n }\n}\n\nexport function formatTimeOfDay(hour: number, minute: number): string {\n const hh = String(hour).padStart(2, \"0\");\n const mm = String(minute).padStart(2, \"0\");\n return `${hh}:${mm}`;\n}\n\nexport function parseTimeOfDay(\n value: string,\n): { hour: number; minute: number } | null {\n const match = value.match(/^(\\d{1,2}):(\\d{2})$/);\n if (!match) return null;\n const hour = Number(match[1]);\n const minute = Number(match[2]);\n if (\n Number.isNaN(hour) ||\n Number.isNaN(minute) ||\n hour < 0 ||\n hour > 23 ||\n minute < 0 ||\n minute > 59\n ) {\n return null;\n }\n return { hour, minute };\n}\n\nexport function formatEventOn(on: string | string[] | undefined): string {\n if (!on) return \"—\";\n if (Array.isArray(on)) return on.join(\", \");\n return on;\n}\n\n/** Example expression shown when the cron field is empty. */\nexport const CRON_EXPRESSION_EXAMPLE = \"*/10 * * * *\";\n\n// The service validates with croniter, so this must accept everything croniter\n// does: five fields, optionally plus seconds and then year, or an alias.\nconst CRON_ALIASES = new Set([\n \"@yearly\",\n \"@annually\",\n \"@monthly\",\n \"@weekly\",\n \"@daily\",\n \"@midnight\",\n \"@hourly\",\n]);\n\nconst CRON_MIN_FIELDS = 5;\nconst CRON_MAX_FIELDS = 7;\n\n// Seconds and year are appended after these, so the positions always hold.\nconst CRON_FIELD_BOUNDS: readonly (readonly [number, number])[] = [\n [0, 59], // minute\n [0, 23], // hour\n [1, 31], // day of month\n [1, 12], // month\n [0, 7], // day of week — croniter spells Sunday 0 and 7\n];\n\nconst DAY_OF_MONTH_INDEX = 2;\nconst MONTH_INDEX = 3;\n\n// Indexed from 1. February is 29: the 29th does fire, in leap years.\nconst MAX_DAYS_IN_MONTH = [0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\nconst MONTH_NAMES = \"JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC\";\nconst DAY_NAMES = \"SUN|MON|TUE|WED|THU|FRI|SAT\";\n\n// croniter does not bound the step: `*/90` is accepted.\nconst NUMERIC_TERM = /^(\\*|\\d+(?:-\\d+)?)(?:\\/(\\d+))?$/;\n\n/** Vocabulary beyond plain numbers, matched but not expanded. */\nconst EXTRA_TERM_PATTERNS: readonly (RegExp | null)[] = [\n null, // minute\n null, // hour\n /^(?:\\?|L|\\d+W)$/i, // `?`, `L`, `15W`\n new RegExp(`^(?:${MONTH_NAMES})(?:-(?:${MONTH_NAMES}))?(?:/\\\\d+)?$`, \"i\"),\n // `SUN`, `MON-FRI#2`, `5#3`, `?` — but no `L`, which croniter rejects here.\n new RegExp(\n `^(?:(?:${DAY_NAMES}|\\\\d+)(?:-(?:${DAY_NAMES}|\\\\d+))?(?:/\\\\d+)?(?:#\\\\d+)?|\\\\?)$`,\n \"i\",\n ),\n];\n\ntype CronFieldParse =\n | { kind: \"invalid\" }\n /** Well-formed, but not expanded, so it constrains nothing. */\n | { kind: \"unmodelled\" }\n | { kind: \"values\"; values: number[] };\n\nfunction parseCronField(\n field: string,\n [min, max]: readonly [number, number],\n extraPattern: RegExp | null,\n): CronFieldParse {\n const values = new Set<number>();\n\n for (const term of field.split(\",\")) {\n const match = term.match(NUMERIC_TERM);\n if (!match) {\n if (extraPattern?.test(term)) return { kind: \"unmodelled\" };\n return { kind: \"invalid\" };\n }\n\n const [, rangePart, stepPart] = match;\n const step = stepPart === undefined ? 1 : Number(stepPart);\n if (step < 1) return { kind: \"invalid\" };\n\n if (rangePart === \"*\") {\n for (let value = min; value <= max; value += step) values.add(value);\n continue;\n }\n\n const [startPart, endPart] = rangePart.split(\"-\");\n const start = parseSingleInt(startPart, min, max);\n if (start === null) return { kind: \"invalid\" };\n if (endPart === undefined) {\n values.add(start);\n continue;\n }\n const end = parseSingleInt(endPart, min, max);\n if (end === null) return { kind: \"invalid\" };\n // croniter wraps a reversed range like `5-1`; that wrap is not modelled.\n if (end < start) return { kind: \"unmodelled\" };\n for (let value = start; value <= end; value += step) values.add(value);\n }\n\n return { kind: \"values\", values: [...values] };\n}\n\nexport type CronScheduleValidation =\n | { schedule: string }\n | { errorKey: I18nKey };\n\n/**\n * Validate a raw cron expression from the edit form — `parseCronSchedule` only\n * classifies against the presets, reporting arbitrary text as `custom`.\n *\n * One-sided by design: rejects only what croniter certainly rejects, and defers\n * on anything it does not model.\n */\nexport function validateCronSchedule(raw: string): CronScheduleValidation {\n const schedule = raw.trim();\n if (!schedule) return { errorKey: I18nKey.AUTOMATIONS$ERROR_CRON_INVALID };\n\n if (schedule.startsWith(\"@\")) {\n return CRON_ALIASES.has(schedule.toLowerCase())\n ? { schedule }\n : { errorKey: I18nKey.AUTOMATIONS$ERROR_CRON_INVALID };\n }\n\n const fields = schedule.split(/\\s+/);\n if (fields.length < CRON_MIN_FIELDS || fields.length > CRON_MAX_FIELDS) {\n return { errorKey: I18nKey.AUTOMATIONS$ERROR_CRON_INVALID };\n }\n\n const parsed = CRON_FIELD_BOUNDS.map((bounds, index) =>\n parseCronField(fields[index], bounds, EXTRA_TERM_PATTERNS[index]),\n );\n if (parsed.some((field) => field.kind === \"invalid\")) {\n return { errorKey: I18nKey.AUTOMATIONS$ERROR_CRON_INVALID };\n }\n\n // croniter parses `0 0 31 2 *` and then finds no fire time for it.\n const days = parsed[DAY_OF_MONTH_INDEX];\n const months = parsed[MONTH_INDEX];\n if (\n days.kind === \"values\" &&\n months.kind === \"values\" &&\n !months.values.some((month) =>\n days.values.some((day) => day <= MAX_DAYS_IN_MONTH[month]),\n )\n ) {\n return { errorKey: I18nKey.AUTOMATIONS$ERROR_CRON_UNREACHABLE };\n }\n\n return { schedule };\n}\n"],"mappings":";AA8GA,SAAgB,EAAc,GAA2C;CAGvE,OAFK,IACD,MAAM,QAAQ,CAAE,IAAU,EAAG,KAAK,IAAI,IACnC,IAFS;AAGlB;AAmCA,IAAM,IAAc,mDACd,IAAY;AAUZ,OAAO,OAAO,EAAY,UAAU,EAAY,iBAAiB,GAAG,GAEpE,OACF,UAAU,EAAU,eAAe,EAAU,qCAC7C,GACF"}
@@ -1,2 +1,2 @@
1
- require("../_virtual/_rolldown/runtime.cjs");var e={base00:`transparent`,base01:`var(--cool-grey-900)`,base02:`var(--cool-grey-700)`,base03:`var(--cool-grey-600)`,base04:`var(--cool-grey-500)`,base05:`var(--cool-grey-200)`,base06:`var(--cool-grey-100)`,base07:`#ffffff`,base08:`#ff5370`,base09:`#f78c6c`,base0A:`#ffcb6b`,base0B:`#c3e88d`,base0C:`#89ddff`,base0D:`#82aaff`,base0E:`#c792ea`,base0F:`#ff5370`},t={PRODUCTION:`https://app.all-hands.dev`},n={LABEL_CLASSNAME:`text-[11px] font-medium leading-4 tracking-[0.11px]`},r={HEIGHT_THRESHOLD:100},i=1.5,a=`/btw`,o=`/model`,s=`/goal`,c=[{skill:{name:`new`,type:`agentskills`,source:null,content:`Creates a new conversation using the same runtime`,triggers:[`/new`]},command:`/new`},{skill:{name:`btw`,type:`agentskills`,source:null,content:`Ask the agent a side question without derailing the main task`,triggers:[a]},command:a},{skill:{name:`model`,type:`agentskills`,source:null,content:`List saved LLM profiles, or switch the conversation LLM profile with /model <name>`,triggers:[o]},command:o},{skill:{name:`goal`,type:`agentskills`,source:null,content:`Drive the agent toward an objective until a judge says it's done — /goal <objective> or /goal --max <n> <objective>`,triggers:[s]},command:s}],l=[`The following information has been included`,`It may or may not be relevant`,`Skill location:`,`(Use this path to resolve`];exports.BTW_COMMAND=a,exports.BUILT_IN_COMMANDS=c,exports.CHAT_INPUT=r,exports.EPS=i,exports.GOAL_COMMAND=s,exports.JSON_VIEW_THEME=e,exports.METADATA_PREFIXES=l,exports.MODEL_COMMAND=o,exports.PRODUCT_URL=t,exports.SETTINGS_FORM=n;
1
+ require("../_virtual/_rolldown/runtime.cjs");var e={base00:`transparent`,base01:`var(--cool-grey-900)`,base02:`var(--cool-grey-700)`,base03:`var(--cool-grey-600)`,base04:`var(--cool-grey-500)`,base05:`var(--cool-grey-200)`,base06:`var(--cool-grey-100)`,base07:`#ffffff`,base08:`#ff5370`,base09:`#f78c6c`,base0A:`#ffcb6b`,base0B:`#c3e88d`,base0C:`#89ddff`,base0D:`#82aaff`,base0E:`#c792ea`,base0F:`#ff5370`},t={PRODUCTION:`https://app.all-hands.dev`},n={LABEL_CLASSNAME:`text-[11px] font-medium leading-4 tracking-[0.11px]`},r={HEIGHT_THRESHOLD:100},i=1.5,a=`/btw`,o=`/model`,s=`/goal`,c=`/plan`,l=`/code`,u=[{skill:{name:`new`,type:`agentskills`,source:null,content:`Creates a new conversation using the same runtime`,triggers:[`/new`]},command:`/new`},{skill:{name:`btw`,type:`agentskills`,source:null,content:`Ask the agent a side question without derailing the main task`,triggers:[a]},command:a},{skill:{name:`model`,type:`agentskills`,source:null,content:`List saved LLM profiles, or switch the conversation LLM profile with /model <name>`,triggers:[o]},command:o},{skill:{name:`goal`,type:`agentskills`,source:null,content:`Drive the agent toward an objective until a judge says it's done — /goal <objective> or /goal --max <n> <objective>`,triggers:[s]},command:s},{skill:{name:`plan`,type:`agentskills`,source:null,content:`Switch the conversation into Plan mode, or start planning immediately with /plan <task>`,triggers:[c]},command:c},{skill:{name:`code`,type:`agentskills`,source:null,content:`Switch the conversation back to Code mode, or resume immediately with /code <task>`,triggers:[l]},command:l}],d=[`The following information has been included`,`It may or may not be relevant`,`Skill location:`,`(Use this path to resolve`];exports.BTW_COMMAND=a,exports.BUILT_IN_COMMANDS=u,exports.CHAT_INPUT=r,exports.CODE_COMMAND=l,exports.EPS=i,exports.GOAL_COMMAND=s,exports.JSON_VIEW_THEME=e,exports.METADATA_PREFIXES=d,exports.MODEL_COMMAND=o,exports.PLAN_COMMAND=c,exports.PRODUCT_URL=t,exports.SETTINGS_FORM=n;
2
2
  //# sourceMappingURL=constants.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.cjs","names":[],"sources":["../../src/utils/constants.ts"],"sourcesContent":["import { SlashCommandItem } from \"#/hooks/chat/use-slash-command\";\n\nexport const JSON_VIEW_THEME = {\n base00: \"transparent\", // background\n base01: \"var(--cool-grey-900)\", // lighter background\n base02: \"var(--cool-grey-700)\", // selection background\n base03: \"var(--cool-grey-600)\", // comments, invisibles\n base04: \"var(--cool-grey-500)\", // dark foreground\n base05: \"var(--cool-grey-200)\", // default foreground\n base06: \"var(--cool-grey-100)\", // light foreground\n base07: \"#ffffff\", // light background\n base08: \"#ff5370\", // variables, red\n base09: \"#f78c6c\", // integers, orange\n base0A: \"#ffcb6b\", // booleans, yellow\n base0B: \"#c3e88d\", // strings, green\n base0C: \"#89ddff\", // support, cyan\n base0D: \"#82aaff\", // functions, blue\n base0E: \"#c792ea\", // keywords, purple\n base0F: \"#ff5370\", // deprecated, red\n};\n\nexport const PRODUCT_URL = {\n PRODUCTION: \"https://app.all-hands.dev\",\n};\n\nexport const SETTINGS_FORM = {\n LABEL_CLASSNAME: \"text-[11px] font-medium leading-4 tracking-[0.11px]\",\n};\n\n// Chat input constants\nexport const CHAT_INPUT = {\n HEIGHT_THRESHOLD: 100, // Height in pixels when suggestions should be hidden\n};\n\n// UI tolerance constants\nexport const EPS = 1.5; // px tolerance for \"near min\" height comparisons\n\n/** The /btw slash command — asks a side question via the ask_agent endpoint. */\nexport const BTW_COMMAND = \"/btw\";\n\n/** The /model slash command — lists or switches the conversation's LLM profile. */\nexport const MODEL_COMMAND = \"/model\";\n\n/** The /goal slash command — drives the agent toward an objective, judging completion each round. */\nexport const GOAL_COMMAND = \"/goal\";\n\n/** Built-in slash commands surfaced in the menu for V1 conversations. */\nexport const BUILT_IN_COMMANDS: SlashCommandItem[] = [\n {\n skill: {\n name: \"new\",\n type: \"agentskills\",\n source: null,\n content: \"Creates a new conversation using the same runtime\",\n triggers: [\"/new\"],\n },\n command: \"/new\",\n },\n {\n skill: {\n name: \"btw\",\n type: \"agentskills\",\n source: null,\n content: \"Ask the agent a side question without derailing the main task\",\n triggers: [BTW_COMMAND],\n },\n command: BTW_COMMAND,\n },\n {\n skill: {\n name: \"model\",\n type: \"agentskills\",\n source: null,\n content:\n \"List saved LLM profiles, or switch the conversation LLM profile with /model <name>\",\n triggers: [MODEL_COMMAND],\n },\n command: MODEL_COMMAND,\n },\n {\n skill: {\n name: \"goal\",\n type: \"agentskills\",\n source: null,\n content:\n \"Drive the agent toward an objective until a judge says it's done — /goal <objective> or /goal --max <n> <objective>\",\n triggers: [GOAL_COMMAND],\n },\n command: GOAL_COMMAND,\n },\n];\n\n// Skill content metadata prefixes\nexport const METADATA_PREFIXES: readonly string[] = [\n \"The following information has been included\",\n \"It may or may not be relevant\",\n \"Skill location:\",\n \"(Use this path to resolve\",\n];\n"],"mappings":"6CAEA,IAAa,EAAkB,CAC7B,OAAQ,cACR,OAAQ,uBACR,OAAQ,uBACR,OAAQ,uBACR,OAAQ,uBACR,OAAQ,uBACR,OAAQ,uBACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,SACV,EAEa,EAAc,CACzB,WAAY,2BACd,EAEa,EAAgB,CAC3B,gBAAiB,qDACnB,EAGa,EAAa,CACxB,iBAAkB,GACpB,EAGa,EAAM,IAGN,EAAc,OAGd,EAAgB,SAGhB,EAAe,QAGf,EAAwC,CACnD,CACE,MAAO,CACL,KAAM,MACN,KAAM,cACN,OAAQ,KACR,QAAS,oDACT,SAAU,CAAC,MAAM,CACnB,EACA,QAAS,MACX,EACA,CACE,MAAO,CACL,KAAM,MACN,KAAM,cACN,OAAQ,KACR,QAAS,gEACT,SAAU,CAAC,CAAW,CACxB,EACA,QAAS,CACX,EACA,CACE,MAAO,CACL,KAAM,QACN,KAAM,cACN,OAAQ,KACR,QACE,qFACF,SAAU,CAAC,CAAa,CAC1B,EACA,QAAS,CACX,EACA,CACE,MAAO,CACL,KAAM,OACN,KAAM,cACN,OAAQ,KACR,QACE,sHACF,SAAU,CAAC,CAAY,CACzB,EACA,QAAS,CACX,CACF,EAGa,EAAuC,CAClD,8CACA,gCACA,kBACA,2BACF"}
1
+ {"version":3,"file":"constants.cjs","names":[],"sources":["../../src/utils/constants.ts"],"sourcesContent":["import { SlashCommandItem } from \"#/hooks/chat/use-slash-command\";\n\nexport const JSON_VIEW_THEME = {\n base00: \"transparent\", // background\n base01: \"var(--cool-grey-900)\", // lighter background\n base02: \"var(--cool-grey-700)\", // selection background\n base03: \"var(--cool-grey-600)\", // comments, invisibles\n base04: \"var(--cool-grey-500)\", // dark foreground\n base05: \"var(--cool-grey-200)\", // default foreground\n base06: \"var(--cool-grey-100)\", // light foreground\n base07: \"#ffffff\", // light background\n base08: \"#ff5370\", // variables, red\n base09: \"#f78c6c\", // integers, orange\n base0A: \"#ffcb6b\", // booleans, yellow\n base0B: \"#c3e88d\", // strings, green\n base0C: \"#89ddff\", // support, cyan\n base0D: \"#82aaff\", // functions, blue\n base0E: \"#c792ea\", // keywords, purple\n base0F: \"#ff5370\", // deprecated, red\n};\n\nexport const PRODUCT_URL = {\n PRODUCTION: \"https://app.all-hands.dev\",\n};\n\nexport const SETTINGS_FORM = {\n LABEL_CLASSNAME: \"text-[11px] font-medium leading-4 tracking-[0.11px]\",\n};\n\n// Chat input constants\nexport const CHAT_INPUT = {\n HEIGHT_THRESHOLD: 100, // Height in pixels when suggestions should be hidden\n};\n\n// UI tolerance constants\nexport const EPS = 1.5; // px tolerance for \"near min\" height comparisons\n\n/** The /btw slash command — asks a side question via the ask_agent endpoint. */\nexport const BTW_COMMAND = \"/btw\";\n\n/** The /model slash command — lists or switches the conversation's LLM profile. */\nexport const MODEL_COMMAND = \"/model\";\n\n/** The /goal slash command — drives the agent toward an objective, judging completion each round. */\nexport const GOAL_COMMAND = \"/goal\";\n\n/** The /plan slash command — switches the conversation into Plan mode. */\nexport const PLAN_COMMAND = \"/plan\";\n\n/** The /code slash command — switches the conversation back to Code mode. */\nexport const CODE_COMMAND = \"/code\";\n\n/** Built-in slash commands surfaced in the menu for V1 conversations. */\nexport const BUILT_IN_COMMANDS: SlashCommandItem[] = [\n {\n skill: {\n name: \"new\",\n type: \"agentskills\",\n source: null,\n content: \"Creates a new conversation using the same runtime\",\n triggers: [\"/new\"],\n },\n command: \"/new\",\n },\n {\n skill: {\n name: \"btw\",\n type: \"agentskills\",\n source: null,\n content: \"Ask the agent a side question without derailing the main task\",\n triggers: [BTW_COMMAND],\n },\n command: BTW_COMMAND,\n },\n {\n skill: {\n name: \"model\",\n type: \"agentskills\",\n source: null,\n content:\n \"List saved LLM profiles, or switch the conversation LLM profile with /model <name>\",\n triggers: [MODEL_COMMAND],\n },\n command: MODEL_COMMAND,\n },\n {\n skill: {\n name: \"goal\",\n type: \"agentskills\",\n source: null,\n content:\n \"Drive the agent toward an objective until a judge says it's done — /goal <objective> or /goal --max <n> <objective>\",\n triggers: [GOAL_COMMAND],\n },\n command: GOAL_COMMAND,\n },\n {\n skill: {\n name: \"plan\",\n type: \"agentskills\",\n source: null,\n content:\n \"Switch the conversation into Plan mode, or start planning immediately with /plan <task>\",\n triggers: [PLAN_COMMAND],\n },\n command: PLAN_COMMAND,\n },\n {\n skill: {\n name: \"code\",\n type: \"agentskills\",\n source: null,\n content:\n \"Switch the conversation back to Code mode, or resume immediately with /code <task>\",\n triggers: [CODE_COMMAND],\n },\n command: CODE_COMMAND,\n },\n];\n\n// Skill content metadata prefixes\nexport const METADATA_PREFIXES: readonly string[] = [\n \"The following information has been included\",\n \"It may or may not be relevant\",\n \"Skill location:\",\n \"(Use this path to resolve\",\n];\n"],"mappings":"6CAEA,IAAa,EAAkB,CAC7B,OAAQ,cACR,OAAQ,uBACR,OAAQ,uBACR,OAAQ,uBACR,OAAQ,uBACR,OAAQ,uBACR,OAAQ,uBACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,UACR,OAAQ,SACV,EAEa,EAAc,CACzB,WAAY,2BACd,EAEa,EAAgB,CAC3B,gBAAiB,qDACnB,EAGa,EAAa,CACxB,iBAAkB,GACpB,EAGa,EAAM,IAGN,EAAc,OAGd,EAAgB,SAGhB,EAAe,QAGf,EAAe,QAGf,EAAe,QAGf,EAAwC,CACnD,CACE,MAAO,CACL,KAAM,MACN,KAAM,cACN,OAAQ,KACR,QAAS,oDACT,SAAU,CAAC,MAAM,CACnB,EACA,QAAS,MACX,EACA,CACE,MAAO,CACL,KAAM,MACN,KAAM,cACN,OAAQ,KACR,QAAS,gEACT,SAAU,CAAC,CAAW,CACxB,EACA,QAAS,CACX,EACA,CACE,MAAO,CACL,KAAM,QACN,KAAM,cACN,OAAQ,KACR,QACE,qFACF,SAAU,CAAC,CAAa,CAC1B,EACA,QAAS,CACX,EACA,CACE,MAAO,CACL,KAAM,OACN,KAAM,cACN,OAAQ,KACR,QACE,sHACF,SAAU,CAAC,CAAY,CACzB,EACA,QAAS,CACX,EACA,CACE,MAAO,CACL,KAAM,OACN,KAAM,cACN,OAAQ,KACR,QACE,0FACF,SAAU,CAAC,CAAY,CACzB,EACA,QAAS,CACX,EACA,CACE,MAAO,CACL,KAAM,OACN,KAAM,cACN,OAAQ,KACR,QACE,qFACF,SAAU,CAAC,CAAY,CACzB,EACA,QAAS,CACX,CACF,EAGa,EAAuC,CAClD,8CACA,gCACA,kBACA,2BACF"}
@@ -33,6 +33,10 @@ export declare const BTW_COMMAND = "/btw";
33
33
  export declare const MODEL_COMMAND = "/model";
34
34
  /** The /goal slash command — drives the agent toward an objective, judging completion each round. */
35
35
  export declare const GOAL_COMMAND = "/goal";
36
+ /** The /plan slash command — switches the conversation into Plan mode. */
37
+ export declare const PLAN_COMMAND = "/plan";
38
+ /** The /code slash command — switches the conversation back to Code mode. */
39
+ export declare const CODE_COMMAND = "/code";
36
40
  /** Built-in slash commands surfaced in the menu for V1 conversations. */
37
41
  export declare const BUILT_IN_COMMANDS: SlashCommandItem[];
38
42
  export declare const METADATA_PREFIXES: readonly string[];
@@ -16,7 +16,7 @@ var e = {
16
16
  base0D: "#82aaff",
17
17
  base0E: "#c792ea",
18
18
  base0F: "#ff5370"
19
- }, t = { PRODUCTION: "https://app.all-hands.dev" }, n = { LABEL_CLASSNAME: "text-[11px] font-medium leading-4 tracking-[0.11px]" }, r = { HEIGHT_THRESHOLD: 100 }, i = 1.5, a = "/btw", o = "/model", s = "/goal", c = [
19
+ }, t = { PRODUCTION: "https://app.all-hands.dev" }, n = { LABEL_CLASSNAME: "text-[11px] font-medium leading-4 tracking-[0.11px]" }, r = { HEIGHT_THRESHOLD: 100 }, i = 1.5, a = "/btw", o = "/model", s = "/goal", c = "/plan", l = "/code", u = [
20
20
  {
21
21
  skill: {
22
22
  name: "new",
@@ -56,14 +56,34 @@ var e = {
56
56
  triggers: [s]
57
57
  },
58
58
  command: s
59
+ },
60
+ {
61
+ skill: {
62
+ name: "plan",
63
+ type: "agentskills",
64
+ source: null,
65
+ content: "Switch the conversation into Plan mode, or start planning immediately with /plan <task>",
66
+ triggers: [c]
67
+ },
68
+ command: c
69
+ },
70
+ {
71
+ skill: {
72
+ name: "code",
73
+ type: "agentskills",
74
+ source: null,
75
+ content: "Switch the conversation back to Code mode, or resume immediately with /code <task>",
76
+ triggers: [l]
77
+ },
78
+ command: l
59
79
  }
60
- ], l = [
80
+ ], d = [
61
81
  "The following information has been included",
62
82
  "It may or may not be relevant",
63
83
  "Skill location:",
64
84
  "(Use this path to resolve"
65
85
  ];
66
86
  //#endregion
67
- export { a as BTW_COMMAND, c as BUILT_IN_COMMANDS, r as CHAT_INPUT, i as EPS, s as GOAL_COMMAND, e as JSON_VIEW_THEME, l as METADATA_PREFIXES, o as MODEL_COMMAND, t as PRODUCT_URL, n as SETTINGS_FORM };
87
+ export { a as BTW_COMMAND, u as BUILT_IN_COMMANDS, r as CHAT_INPUT, l as CODE_COMMAND, i as EPS, s as GOAL_COMMAND, e as JSON_VIEW_THEME, d as METADATA_PREFIXES, o as MODEL_COMMAND, c as PLAN_COMMAND, t as PRODUCT_URL, n as SETTINGS_FORM };
68
88
 
69
89
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","names":[],"sources":["../../src/utils/constants.ts"],"sourcesContent":["import { SlashCommandItem } from \"#/hooks/chat/use-slash-command\";\n\nexport const JSON_VIEW_THEME = {\n base00: \"transparent\", // background\n base01: \"var(--cool-grey-900)\", // lighter background\n base02: \"var(--cool-grey-700)\", // selection background\n base03: \"var(--cool-grey-600)\", // comments, invisibles\n base04: \"var(--cool-grey-500)\", // dark foreground\n base05: \"var(--cool-grey-200)\", // default foreground\n base06: \"var(--cool-grey-100)\", // light foreground\n base07: \"#ffffff\", // light background\n base08: \"#ff5370\", // variables, red\n base09: \"#f78c6c\", // integers, orange\n base0A: \"#ffcb6b\", // booleans, yellow\n base0B: \"#c3e88d\", // strings, green\n base0C: \"#89ddff\", // support, cyan\n base0D: \"#82aaff\", // functions, blue\n base0E: \"#c792ea\", // keywords, purple\n base0F: \"#ff5370\", // deprecated, red\n};\n\nexport const PRODUCT_URL = {\n PRODUCTION: \"https://app.all-hands.dev\",\n};\n\nexport const SETTINGS_FORM = {\n LABEL_CLASSNAME: \"text-[11px] font-medium leading-4 tracking-[0.11px]\",\n};\n\n// Chat input constants\nexport const CHAT_INPUT = {\n HEIGHT_THRESHOLD: 100, // Height in pixels when suggestions should be hidden\n};\n\n// UI tolerance constants\nexport const EPS = 1.5; // px tolerance for \"near min\" height comparisons\n\n/** The /btw slash command — asks a side question via the ask_agent endpoint. */\nexport const BTW_COMMAND = \"/btw\";\n\n/** The /model slash command — lists or switches the conversation's LLM profile. */\nexport const MODEL_COMMAND = \"/model\";\n\n/** The /goal slash command — drives the agent toward an objective, judging completion each round. */\nexport const GOAL_COMMAND = \"/goal\";\n\n/** Built-in slash commands surfaced in the menu for V1 conversations. */\nexport const BUILT_IN_COMMANDS: SlashCommandItem[] = [\n {\n skill: {\n name: \"new\",\n type: \"agentskills\",\n source: null,\n content: \"Creates a new conversation using the same runtime\",\n triggers: [\"/new\"],\n },\n command: \"/new\",\n },\n {\n skill: {\n name: \"btw\",\n type: \"agentskills\",\n source: null,\n content: \"Ask the agent a side question without derailing the main task\",\n triggers: [BTW_COMMAND],\n },\n command: BTW_COMMAND,\n },\n {\n skill: {\n name: \"model\",\n type: \"agentskills\",\n source: null,\n content:\n \"List saved LLM profiles, or switch the conversation LLM profile with /model <name>\",\n triggers: [MODEL_COMMAND],\n },\n command: MODEL_COMMAND,\n },\n {\n skill: {\n name: \"goal\",\n type: \"agentskills\",\n source: null,\n content:\n \"Drive the agent toward an objective until a judge says it's done — /goal <objective> or /goal --max <n> <objective>\",\n triggers: [GOAL_COMMAND],\n },\n command: GOAL_COMMAND,\n },\n];\n\n// Skill content metadata prefixes\nexport const METADATA_PREFIXES: readonly string[] = [\n \"The following information has been included\",\n \"It may or may not be relevant\",\n \"Skill location:\",\n \"(Use this path to resolve\",\n];\n"],"mappings":";AAEA,IAAa,IAAkB;CAC7B,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;AACV,GAEa,IAAc,EACzB,YAAY,4BACd,GAEa,IAAgB,EAC3B,iBAAiB,sDACnB,GAGa,IAAa,EACxB,kBAAkB,IACpB,GAGa,IAAM,KAGN,IAAc,QAGd,IAAgB,UAGhB,IAAe,SAGf,IAAwC;CACnD;EACE,OAAO;GACL,MAAM;GACN,MAAM;GACN,QAAQ;GACR,SAAS;GACT,UAAU,CAAC,MAAM;EACnB;EACA,SAAS;CACX;CACA;EACE,OAAO;GACL,MAAM;GACN,MAAM;GACN,QAAQ;GACR,SAAS;GACT,UAAU,CAAC,CAAW;EACxB;EACA,SAAS;CACX;CACA;EACE,OAAO;GACL,MAAM;GACN,MAAM;GACN,QAAQ;GACR,SACE;GACF,UAAU,CAAC,CAAa;EAC1B;EACA,SAAS;CACX;CACA;EACE,OAAO;GACL,MAAM;GACN,MAAM;GACN,QAAQ;GACR,SACE;GACF,UAAU,CAAC,CAAY;EACzB;EACA,SAAS;CACX;AACF,GAGa,IAAuC;CAClD;CACA;CACA;CACA;AACF"}
1
+ {"version":3,"file":"constants.js","names":[],"sources":["../../src/utils/constants.ts"],"sourcesContent":["import { SlashCommandItem } from \"#/hooks/chat/use-slash-command\";\n\nexport const JSON_VIEW_THEME = {\n base00: \"transparent\", // background\n base01: \"var(--cool-grey-900)\", // lighter background\n base02: \"var(--cool-grey-700)\", // selection background\n base03: \"var(--cool-grey-600)\", // comments, invisibles\n base04: \"var(--cool-grey-500)\", // dark foreground\n base05: \"var(--cool-grey-200)\", // default foreground\n base06: \"var(--cool-grey-100)\", // light foreground\n base07: \"#ffffff\", // light background\n base08: \"#ff5370\", // variables, red\n base09: \"#f78c6c\", // integers, orange\n base0A: \"#ffcb6b\", // booleans, yellow\n base0B: \"#c3e88d\", // strings, green\n base0C: \"#89ddff\", // support, cyan\n base0D: \"#82aaff\", // functions, blue\n base0E: \"#c792ea\", // keywords, purple\n base0F: \"#ff5370\", // deprecated, red\n};\n\nexport const PRODUCT_URL = {\n PRODUCTION: \"https://app.all-hands.dev\",\n};\n\nexport const SETTINGS_FORM = {\n LABEL_CLASSNAME: \"text-[11px] font-medium leading-4 tracking-[0.11px]\",\n};\n\n// Chat input constants\nexport const CHAT_INPUT = {\n HEIGHT_THRESHOLD: 100, // Height in pixels when suggestions should be hidden\n};\n\n// UI tolerance constants\nexport const EPS = 1.5; // px tolerance for \"near min\" height comparisons\n\n/** The /btw slash command — asks a side question via the ask_agent endpoint. */\nexport const BTW_COMMAND = \"/btw\";\n\n/** The /model slash command — lists or switches the conversation's LLM profile. */\nexport const MODEL_COMMAND = \"/model\";\n\n/** The /goal slash command — drives the agent toward an objective, judging completion each round. */\nexport const GOAL_COMMAND = \"/goal\";\n\n/** The /plan slash command — switches the conversation into Plan mode. */\nexport const PLAN_COMMAND = \"/plan\";\n\n/** The /code slash command — switches the conversation back to Code mode. */\nexport const CODE_COMMAND = \"/code\";\n\n/** Built-in slash commands surfaced in the menu for V1 conversations. */\nexport const BUILT_IN_COMMANDS: SlashCommandItem[] = [\n {\n skill: {\n name: \"new\",\n type: \"agentskills\",\n source: null,\n content: \"Creates a new conversation using the same runtime\",\n triggers: [\"/new\"],\n },\n command: \"/new\",\n },\n {\n skill: {\n name: \"btw\",\n type: \"agentskills\",\n source: null,\n content: \"Ask the agent a side question without derailing the main task\",\n triggers: [BTW_COMMAND],\n },\n command: BTW_COMMAND,\n },\n {\n skill: {\n name: \"model\",\n type: \"agentskills\",\n source: null,\n content:\n \"List saved LLM profiles, or switch the conversation LLM profile with /model <name>\",\n triggers: [MODEL_COMMAND],\n },\n command: MODEL_COMMAND,\n },\n {\n skill: {\n name: \"goal\",\n type: \"agentskills\",\n source: null,\n content:\n \"Drive the agent toward an objective until a judge says it's done — /goal <objective> or /goal --max <n> <objective>\",\n triggers: [GOAL_COMMAND],\n },\n command: GOAL_COMMAND,\n },\n {\n skill: {\n name: \"plan\",\n type: \"agentskills\",\n source: null,\n content:\n \"Switch the conversation into Plan mode, or start planning immediately with /plan <task>\",\n triggers: [PLAN_COMMAND],\n },\n command: PLAN_COMMAND,\n },\n {\n skill: {\n name: \"code\",\n type: \"agentskills\",\n source: null,\n content:\n \"Switch the conversation back to Code mode, or resume immediately with /code <task>\",\n triggers: [CODE_COMMAND],\n },\n command: CODE_COMMAND,\n },\n];\n\n// Skill content metadata prefixes\nexport const METADATA_PREFIXES: readonly string[] = [\n \"The following information has been included\",\n \"It may or may not be relevant\",\n \"Skill location:\",\n \"(Use this path to resolve\",\n];\n"],"mappings":";AAEA,IAAa,IAAkB;CAC7B,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;AACV,GAEa,IAAc,EACzB,YAAY,4BACd,GAEa,IAAgB,EAC3B,iBAAiB,sDACnB,GAGa,IAAa,EACxB,kBAAkB,IACpB,GAGa,IAAM,KAGN,IAAc,QAGd,IAAgB,UAGhB,IAAe,SAGf,IAAe,SAGf,IAAe,SAGf,IAAwC;CACnD;EACE,OAAO;GACL,MAAM;GACN,MAAM;GACN,QAAQ;GACR,SAAS;GACT,UAAU,CAAC,MAAM;EACnB;EACA,SAAS;CACX;CACA;EACE,OAAO;GACL,MAAM;GACN,MAAM;GACN,QAAQ;GACR,SAAS;GACT,UAAU,CAAC,CAAW;EACxB;EACA,SAAS;CACX;CACA;EACE,OAAO;GACL,MAAM;GACN,MAAM;GACN,QAAQ;GACR,SACE;GACF,UAAU,CAAC,CAAa;EAC1B;EACA,SAAS;CACX;CACA;EACE,OAAO;GACL,MAAM;GACN,MAAM;GACN,QAAQ;GACR,SACE;GACF,UAAU,CAAC,CAAY;EACzB;EACA,SAAS;CACX;CACA;EACE,OAAO;GACL,MAAM;GACN,MAAM;GACN,QAAQ;GACR,SACE;GACF,UAAU,CAAC,CAAY;EACzB;EACA,SAAS;CACX;CACA;EACE,OAAO;GACL,MAAM;GACN,MAAM;GACN,QAAQ;GACR,SACE;GACF,UAAU,CAAC,CAAY;EACzB;EACA,SAAS;CACX;AACF,GAGa,IAAuC;CAClD;CACA;CACA;CACA;AACF"}
@@ -0,0 +1,2 @@
1
+ require("../_virtual/_rolldown/runtime.cjs");function e(e,t){if(!e)return null;let n=/(?:Z|[+-]\d{2}:?\d{2})$/i.test(e)?e:`${e}Z`,r=new Date(n);return Number.isNaN(r.getTime())?null:r.toLocaleString(t,{dateStyle:`medium`,timeStyle:`short`})}exports.formatEventTimestamp=e;
2
+ //# sourceMappingURL=format-event-timestamp.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-event-timestamp.cjs","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":"6CAAA,SAAgB,EACd,EACA,EACe,CACf,GAAI,CAAC,EAAW,OAAO,KAKvB,IAAM,EAAM,2BAA2B,KAAK,CAAS,EACjD,EACA,GAAG,EAAU,GACX,EAAO,IAAI,KAAK,CAAG,EAGzB,OAFI,OAAO,MAAM,EAAK,QAAQ,CAAC,EAAU,KAElC,EAAK,eAAe,EAAQ,CACjC,UAAW,SACX,UAAW,OACb,CAAC,CACH"}
@@ -0,0 +1 @@
1
+ export declare function formatEventTimestamp(timestamp?: string, locale?: string): string | null;
@@ -0,0 +1,13 @@
1
+ //#region src/utils/format-event-timestamp.ts
2
+ function e(e, t) {
3
+ if (!e) return null;
4
+ let n = /(?:Z|[+-]\d{2}:?\d{2})$/i.test(e) ? e : `${e}Z`, r = new Date(n);
5
+ return Number.isNaN(r.getTime()) ? null : r.toLocaleString(t, {
6
+ dateStyle: "medium",
7
+ timeStyle: "short"
8
+ });
9
+ }
10
+ //#endregion
11
+ export { e as formatEventTimestamp };
12
+
13
+ //# sourceMappingURL=format-event-timestamp.js.map
@@ -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/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;
1
+ require("../_virtual/_rolldown/runtime.cjs");var e=`Free`,t=` (free)`,n={"openhands/deepseek-v4-flash":`OpenHands DeepSeek V4 Flash`},r=new Set,i=e=>!!e?.startsWith(`openhands/`),a=(e,t=r)=>!!(e&&t.has(e));function o(e,n){return n?`${e}${t}`:e}function s(e,t=r){return e?o(e,a(e,t)):null}function c(e,t=r){if(!e)return null;let n=a(e,t);return o(e.split(`/`).pop()||e,n)}function l(e,t=r){return e?o(e in n?n[e]:e,a(e,t)):null}exports.FREE_MODEL_BADGE_LABEL=e,exports.formatModelNameForDisplay=s,exports.formatModelPillLabel=l,exports.formatNativeModelName=c,exports.isFreeOpenHandsModel=a,exports.isOpenHandsProviderModel=i;
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/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
+ {"version":3,"file":"format-model-name.cjs","names":[],"sources":["../../src/utils/format-model-name.ts"],"sourcesContent":["export const FREE_MODEL_BADGE_LABEL = \"Free\";\n\n/** Suffix appended to a display name for a DB-flagged free OpenHands model. */\nexport const FREE_MODEL_SUFFIX = \" (free)\";\n\n/**\n * Static pretty-print labels for OpenHands models known at build time. Free\n * status still comes only from the backend-provided `freeModels` set.\n */\nexport const FREE_OPENHANDS_MODELS = {\n \"openhands/deepseek-v4-flash\": \"OpenHands DeepSeek V4 Flash\",\n} as const;\n\nexport const FREE_OPENHANDS_MODEL_IDS = Object.keys(FREE_OPENHANDS_MODELS);\n\n/**\n * Set of free ``provider/model`` ids. The frontend no longer hardcodes which\n * OpenHands models are free — the set is sourced from the backend model list\n * (DB-driven), the same channel that carries `verified`. See\n * {@link useFreeModels}. Callers that lack the set treat every model as paid.\n */\nexport type FreeModelSet = ReadonlySet<string>;\n\nconst EMPTY_FREE_MODELS: FreeModelSet = new Set<string>();\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 isFreeOpenHandsModel = (\n model: string | null | undefined,\n freeModels: FreeModelSet = EMPTY_FREE_MODELS,\n): boolean => Boolean(model && freeModels.has(model));\n\nfunction appendFreeSuffix(display: string, isFree: boolean): string {\n return isFree ? `${display}${FREE_MODEL_SUFFIX}` : display;\n}\n\nexport function formatModelNameForDisplay(\n model: string | null | undefined,\n freeModels: FreeModelSet = EMPTY_FREE_MODELS,\n): string | null {\n if (!model) return null;\n return appendFreeSuffix(model, isFreeOpenHandsModel(model, freeModels));\n}\n\nexport function formatProviderModelNameForDisplay(\n provider: string | null | undefined,\n model: string | null | undefined,\n freeModels: FreeModelSet = EMPTY_FREE_MODELS,\n): string | null {\n if (!model) return null;\n const fullModel = provider ? `${provider}/${model}` : model;\n return appendFreeSuffix(model, isFreeOpenHandsModel(fullModel, freeModels));\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 * A DB-flagged free model (matched against ``freeModels`` on its full id) keeps\n * the free suffix so the chip still signals it is free.\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 freeModels: FreeModelSet = EMPTY_FREE_MODELS,\n): string | null {\n if (!model) return null;\n const isFree = isFreeOpenHandsModel(model, freeModels);\n const lastSegment = model.split(\"/\").pop();\n return appendFreeSuffix(lastSegment || model, isFree);\n}\n\n/**\n * Display label used by the LLM-profile picker sub-line. Looks up the model in\n * the static label table for a prettier name, but appends `(free)` only when the\n * backend-provided `freeModels` set marks the concrete model free.\n */\nexport function formatModelPillLabel(\n model: string | null | undefined,\n freeModels: FreeModelSet = EMPTY_FREE_MODELS,\n): string | null {\n if (!model) return null;\n const display =\n model in FREE_OPENHANDS_MODELS\n ? FREE_OPENHANDS_MODELS[model as keyof typeof FREE_OPENHANDS_MODELS]\n : model;\n return appendFreeSuffix(display, isFreeOpenHandsModel(model, freeModels));\n}\n"],"mappings":"6CAAA,IAAa,EAAyB,OAGzB,EAAoB,UAMpB,EAAwB,CACnC,8BAA+B,6BACjC,EAYM,EAAkC,IAAI,IAQ/B,EACX,GACY,EAAQ,GAAO,WAAW,YAAY,EAEvC,GACX,EACA,EAA2B,IACf,GAAQ,GAAS,EAAW,IAAI,CAAK,GAEnD,SAAS,EAAiB,EAAiB,EAAyB,CAClE,OAAO,EAAS,GAAG,IAAU,IAAsB,CACrD,CAEA,SAAgB,EACd,EACA,EAA2B,EACZ,CAEf,OADK,EACE,EAAiB,EAAO,EAAqB,EAAO,CAAU,CAAC,EADnD,IAErB,CA6BA,SAAgB,EACd,EACA,EAA2B,EACZ,CACf,GAAI,CAAC,EAAO,OAAO,KACnB,IAAM,EAAS,EAAqB,EAAO,CAAU,EAErD,OAAO,EADa,EAAM,MAAM,GAAG,EAAE,IACb,GAAe,EAAO,CAAM,CACtD,CAOA,SAAgB,EACd,EACA,EAA2B,EACZ,CAMf,OALK,EAKE,EAHL,KAAS,EACL,EAAsB,GACtB,EAC2B,EAAqB,EAAO,CAAU,CAAC,EALrD,IAMrB"}
@@ -1,8 +1,21 @@
1
1
  export declare const FREE_MODEL_BADGE_LABEL = "Free";
2
+ /** Suffix appended to a display name for a DB-flagged free OpenHands model. */
3
+ export declare const FREE_MODEL_SUFFIX = " (free)";
4
+ /**
5
+ * Static pretty-print labels for OpenHands models known at build time. Free
6
+ * status still comes only from the backend-provided `freeModels` set.
7
+ */
2
8
  export declare const FREE_OPENHANDS_MODELS: {
3
- readonly "openhands/deepseek-v4-flash": "OpenHands DeepSeek V4 Flash (free)";
9
+ readonly "openhands/deepseek-v4-flash": "OpenHands DeepSeek V4 Flash";
4
10
  };
5
11
  export declare const FREE_OPENHANDS_MODEL_IDS: string[];
12
+ /**
13
+ * Set of free ``provider/model`` ids. The frontend no longer hardcodes which
14
+ * OpenHands models are free — the set is sourced from the backend model list
15
+ * (DB-driven), the same channel that carries `verified`. See
16
+ * {@link useFreeModels}. Callers that lack the set treat every model as paid.
17
+ */
18
+ export type FreeModelSet = ReadonlySet<string>;
6
19
  /**
7
20
  * Whether a model id routes through the OpenHands provider (the `openhands/`
8
21
  * prefix). On cloud the OpenHands provider is backed by a server-minted LLM
@@ -10,10 +23,9 @@ export declare const FREE_OPENHANDS_MODEL_IDS: string[];
10
23
  * API key / base URL inputs and strip those fields from the save payload.
11
24
  */
12
25
  export declare const isOpenHandsProviderModel: (model: string | null | undefined) => boolean;
13
- export declare const FREE_OPENHANDS_MODEL_NOTE: string;
14
- export declare const isFreeOpenHandsModel: (model: string | null | undefined) => model is keyof typeof FREE_OPENHANDS_MODELS;
15
- export declare function formatModelNameForDisplay(model: string | null | undefined): string | null;
16
- export declare function formatProviderModelNameForDisplay(provider: string | null | undefined, model: string | null | undefined): string | null;
26
+ export declare const isFreeOpenHandsModel: (model: string | null | undefined, freeModels?: FreeModelSet) => boolean;
27
+ export declare function formatModelNameForDisplay(model: string | null | undefined, freeModels?: FreeModelSet): string | null;
28
+ export declare function formatProviderModelNameForDisplay(provider: string | null | undefined, model: string | null | undefined, freeModels?: FreeModelSet): string | null;
17
29
  /**
18
30
  * Format a native (OpenHands-kind) routing model string for display, stripping
19
31
  * the provider route prefix (e.g. ``"anthropic/claude-sonnet-4-5-20250929"`` →
@@ -25,7 +37,16 @@ export declare function formatProviderModelNameForDisplay(provider: string | nul
25
37
  * string when stripping the prefix would leave nothing (e.g. a trailing slash)
26
38
  * — never an empty string, which would collapse the chip text.
27
39
  *
40
+ * A DB-flagged free model (matched against ``freeModels`` on its full id) keeps
41
+ * the free suffix so the chip still signals it is free.
42
+ *
28
43
  * Display-only: unlike {@link deriveProfileNameFromModel} this does not sanitize
29
44
  * to an identifier, so it keeps the real model id intact for the chip.
30
45
  */
31
- export declare function formatNativeModelName(model: string | null | undefined): string | null;
46
+ export declare function formatNativeModelName(model: string | null | undefined, freeModels?: FreeModelSet): string | null;
47
+ /**
48
+ * Display label used by the LLM-profile picker sub-line. Looks up the model in
49
+ * the static label table for a prettier name, but appends `(free)` only when the
50
+ * backend-provided `freeModels` set marks the concrete model free.
51
+ */
52
+ export declare function formatModelPillLabel(model: string | null | undefined, freeModels?: FreeModelSet): string | null;
@@ -1,12 +1,20 @@
1
1
  //#region src/utils/format-model-name.ts
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;
2
+ var e = "Free", t = " (free)", n = { "openhands/deepseek-v4-flash": "OpenHands DeepSeek V4 Flash" }, r = /* @__PURE__ */ new Set(), i = (e) => !!e?.startsWith("openhands/"), a = (e, t = r) => !!(e && t.has(e));
3
+ function o(e, n) {
4
+ return n ? `${e}${t}` : e;
5
5
  }
6
- function s(e) {
7
- return e ? a(e) ? t[e] : e.split("/").pop() || e : null;
6
+ function s(e, t = r) {
7
+ return e ? o(e, a(e, t)) : null;
8
+ }
9
+ function c(e, t = r) {
10
+ if (!e) return null;
11
+ let n = a(e, t);
12
+ return o(e.split("/").pop() || e, n);
13
+ }
14
+ function l(e, t = r) {
15
+ return e ? o(e in n ? n[e] : e, a(e, t)) : null;
8
16
  }
9
17
  //#endregion
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 };
18
+ export { e as FREE_MODEL_BADGE_LABEL, s as formatModelNameForDisplay, l as formatModelPillLabel, c as formatNativeModelName, a as isFreeOpenHandsModel, i as isOpenHandsProviderModel };
11
19
 
12
20
  //# 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/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
+ {"version":3,"file":"format-model-name.js","names":[],"sources":["../../src/utils/format-model-name.ts"],"sourcesContent":["export const FREE_MODEL_BADGE_LABEL = \"Free\";\n\n/** Suffix appended to a display name for a DB-flagged free OpenHands model. */\nexport const FREE_MODEL_SUFFIX = \" (free)\";\n\n/**\n * Static pretty-print labels for OpenHands models known at build time. Free\n * status still comes only from the backend-provided `freeModels` set.\n */\nexport const FREE_OPENHANDS_MODELS = {\n \"openhands/deepseek-v4-flash\": \"OpenHands DeepSeek V4 Flash\",\n} as const;\n\nexport const FREE_OPENHANDS_MODEL_IDS = Object.keys(FREE_OPENHANDS_MODELS);\n\n/**\n * Set of free ``provider/model`` ids. The frontend no longer hardcodes which\n * OpenHands models are free — the set is sourced from the backend model list\n * (DB-driven), the same channel that carries `verified`. See\n * {@link useFreeModels}. Callers that lack the set treat every model as paid.\n */\nexport type FreeModelSet = ReadonlySet<string>;\n\nconst EMPTY_FREE_MODELS: FreeModelSet = new Set<string>();\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 isFreeOpenHandsModel = (\n model: string | null | undefined,\n freeModels: FreeModelSet = EMPTY_FREE_MODELS,\n): boolean => Boolean(model && freeModels.has(model));\n\nfunction appendFreeSuffix(display: string, isFree: boolean): string {\n return isFree ? `${display}${FREE_MODEL_SUFFIX}` : display;\n}\n\nexport function formatModelNameForDisplay(\n model: string | null | undefined,\n freeModels: FreeModelSet = EMPTY_FREE_MODELS,\n): string | null {\n if (!model) return null;\n return appendFreeSuffix(model, isFreeOpenHandsModel(model, freeModels));\n}\n\nexport function formatProviderModelNameForDisplay(\n provider: string | null | undefined,\n model: string | null | undefined,\n freeModels: FreeModelSet = EMPTY_FREE_MODELS,\n): string | null {\n if (!model) return null;\n const fullModel = provider ? `${provider}/${model}` : model;\n return appendFreeSuffix(model, isFreeOpenHandsModel(fullModel, freeModels));\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 * A DB-flagged free model (matched against ``freeModels`` on its full id) keeps\n * the free suffix so the chip still signals it is free.\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 freeModels: FreeModelSet = EMPTY_FREE_MODELS,\n): string | null {\n if (!model) return null;\n const isFree = isFreeOpenHandsModel(model, freeModels);\n const lastSegment = model.split(\"/\").pop();\n return appendFreeSuffix(lastSegment || model, isFree);\n}\n\n/**\n * Display label used by the LLM-profile picker sub-line. Looks up the model in\n * the static label table for a prettier name, but appends `(free)` only when the\n * backend-provided `freeModels` set marks the concrete model free.\n */\nexport function formatModelPillLabel(\n model: string | null | undefined,\n freeModels: FreeModelSet = EMPTY_FREE_MODELS,\n): string | null {\n if (!model) return null;\n const display =\n model in FREE_OPENHANDS_MODELS\n ? FREE_OPENHANDS_MODELS[model as keyof typeof FREE_OPENHANDS_MODELS]\n : model;\n return appendFreeSuffix(display, isFreeOpenHandsModel(model, freeModels));\n}\n"],"mappings":";AAAA,IAAa,IAAyB,QAGzB,IAAoB,WAMpB,IAAwB,EACnC,+BAA+B,8BACjC,GAYM,oBAAkC,IAAI,IAAY,GAQ3C,KACX,MACY,EAAQ,GAAO,WAAW,YAAY,GAEvC,KACX,GACA,IAA2B,MACf,GAAQ,KAAS,EAAW,IAAI,CAAK;AAEnD,SAAS,EAAiB,GAAiB,GAAyB;CAClE,OAAO,IAAS,GAAG,IAAU,MAAsB;AACrD;AAEA,SAAgB,EACd,GACA,IAA2B,GACZ;CAEf,OADK,IACE,EAAiB,GAAO,EAAqB,GAAO,CAAU,CAAC,IADnD;AAErB;AA6BA,SAAgB,EACd,GACA,IAA2B,GACZ;CACf,IAAI,CAAC,GAAO,OAAO;CACnB,IAAM,IAAS,EAAqB,GAAO,CAAU;CAErD,OAAO,EADa,EAAM,MAAM,GAAG,EAAE,IACb,KAAe,GAAO,CAAM;AACtD;AAOA,SAAgB,EACd,GACA,IAA2B,GACZ;CAMf,OALK,IAKE,EAHL,KAAS,IACL,EAAsB,KACtB,GAC2B,EAAqB,GAAO,CAAU,CAAC,IALrD;AAMrB"}
@@ -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