@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
@@ -1 +1 @@
1
- {"version":3,"file":"model-store.cjs","names":[],"sources":["../../src/stores/model-store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { devtools } from \"zustand/middleware\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport type { ProfileInfo } from \"#/api/profiles-service/profiles-service.api\";\n\nexport interface ModelListEntry {\n id: string;\n /**\n * Id of the chat event after which this entry should render, or `null` to\n * pin it to the top of the chat history (no rendered events at the time\n * of /model).\n */\n anchorEventId: string | null;\n profiles: ProfileInfo[];\n switchedTo?: string;\n}\n\n/**\n * A historical switch to seed via `seedSwitches`. `id` must be stable across\n * reloads (derived from the source observation event id) so re-seeding the\n * same loaded history is idempotent.\n */\nexport interface SeededSwitch {\n id: string;\n anchorEventId: string | null;\n profileName: string;\n}\n\ninterface ModelState {\n entriesByConversation: Record<string, ModelListEntry[]>;\n /**\n * Most-recently-switched profile name per conversation. Updated by\n * `recordSwitch` so the UI (button label, popover check mark) reflects the\n * new selection instantly, before the conversation refetch from the agent\n * server lands.\n */\n activeProfileByConversation: Record<string, string>;\n}\n\ninterface ModelActions {\n show: (\n conversationId: string,\n anchorEventId: string | null,\n profiles: ProfileInfo[],\n ) => void;\n recordSwitch: (\n conversationId: string,\n anchorEventId: string | null,\n profileName: string,\n ) => void;\n /**\n * Seeds \"Switched to\" entries reconstructed from loaded history. Skips any\n * whose `id` is already present, so it can run on every history (re)load\n * without duplicating, and it preserves live-recorded entries.\n */\n seedSwitches: (conversationId: string, switches: SeededSwitch[]) => void;\n /** Drops only the optimistic active-profile entry for a conversation. */\n clearActiveProfile: (conversationId: string) => void;\n clear: (conversationId: string) => void;\n clearAll: () => void;\n}\n\ntype ModelStore = ModelState & ModelActions;\n\nconst appendEntry = (\n state: ModelState,\n conversationId: string,\n entry: ModelListEntry,\n): Pick<ModelState, \"entriesByConversation\"> => ({\n entriesByConversation: {\n ...state.entriesByConversation,\n [conversationId]: [\n ...(state.entriesByConversation[conversationId] ?? []),\n entry,\n ],\n },\n});\n\nexport const useModelStore = create<ModelStore>()(\n devtools(\n (set) => ({\n entriesByConversation: {},\n activeProfileByConversation: {},\n show: (conversationId, anchorEventId, profiles) =>\n set((s) =>\n appendEntry(s, conversationId, {\n id: uuidv4(),\n anchorEventId,\n profiles,\n }),\n ),\n recordSwitch: (conversationId, anchorEventId, profileName) =>\n set((s) => ({\n ...appendEntry(s, conversationId, {\n id: uuidv4(),\n anchorEventId,\n profiles: [],\n switchedTo: profileName,\n }),\n activeProfileByConversation: {\n ...s.activeProfileByConversation,\n [conversationId]: profileName,\n },\n })),\n seedSwitches: (conversationId, switches) =>\n set((s) => {\n const existing = s.entriesByConversation[conversationId] ?? [];\n const existingIds = new Set(existing.map((e) => e.id));\n const additions = switches\n .filter((sw) => !existingIds.has(sw.id))\n .map(\n (sw): ModelListEntry => ({\n id: sw.id,\n anchorEventId: sw.anchorEventId,\n profiles: [],\n switchedTo: sw.profileName,\n }),\n );\n if (additions.length === 0) return s;\n return {\n entriesByConversation: {\n ...s.entriesByConversation,\n [conversationId]: [...existing, ...additions],\n },\n };\n }),\n clearActiveProfile: (conversationId) =>\n set((s) => {\n if (!(conversationId in s.activeProfileByConversation)) return s;\n const activeProfileByConversation = {\n ...s.activeProfileByConversation,\n };\n delete activeProfileByConversation[conversationId];\n return { activeProfileByConversation };\n }),\n clear: (conversationId) =>\n set((s) => {\n const entriesByConversation = { ...s.entriesByConversation };\n delete entriesByConversation[conversationId];\n const activeProfileByConversation = {\n ...s.activeProfileByConversation,\n };\n delete activeProfileByConversation[conversationId];\n return { entriesByConversation, activeProfileByConversation };\n }),\n clearAll: () =>\n set({ entriesByConversation: {}, activeProfileByConversation: {} }),\n }),\n { name: \"ModelStore\" },\n ),\n);\n"],"mappings":"4MAgEA,IAAM,GACJ,EACA,EACA,KAC+C,CAC/C,sBAAuB,CACrB,GAAG,EAAM,uBACR,GAAiB,CAChB,GAAI,EAAM,sBAAsB,IAAmB,CAAC,EACpD,CACF,CACF,CACF,GAEa,EAAgB,EAAA,OAAmB,EAC9C,EAAA,SACG,IAAS,CACR,sBAAuB,CAAC,EACxB,4BAA6B,CAAC,EAC9B,MAAO,EAAgB,EAAe,IACpC,EAAK,GACH,EAAY,EAAG,EAAgB,CAC7B,GAAI,EAAA,QAAO,EACX,gBACA,UACF,CAAC,CACH,EACF,cAAe,EAAgB,EAAe,IAC5C,EAAK,IAAO,CACV,GAAG,EAAY,EAAG,EAAgB,CAChC,GAAI,EAAA,QAAO,EACX,gBACA,SAAU,CAAC,EACX,WAAY,CACd,CAAC,EACD,4BAA6B,CAC3B,GAAG,EAAE,6BACJ,GAAiB,CACpB,CACF,EAAE,EACJ,cAAe,EAAgB,IAC7B,EAAK,GAAM,CACT,IAAM,EAAW,EAAE,sBAAsB,IAAmB,CAAC,EACvD,EAAc,IAAI,IAAI,EAAS,IAAK,GAAM,EAAE,EAAE,CAAC,EAC/C,EAAY,EACf,OAAQ,GAAO,CAAC,EAAY,IAAI,EAAG,EAAE,CAAC,EACtC,IACE,IAAwB,CACvB,GAAI,EAAG,GACP,cAAe,EAAG,cAClB,SAAU,CAAC,EACX,WAAY,EAAG,WACjB,EACF,EAEF,OADI,EAAU,SAAW,EAAU,EAC5B,CACL,sBAAuB,CACrB,GAAG,EAAE,uBACJ,GAAiB,CAAC,GAAG,EAAU,GAAG,CAAS,CAC9C,CACF,CACF,CAAC,EACH,mBAAqB,GACnB,EAAK,GAAM,CACT,GAAI,EAAE,KAAkB,EAAE,6BAA8B,OAAO,EAC/D,IAAM,EAA8B,CAClC,GAAG,EAAE,2BACP,EAEA,OADA,OAAO,EAA4B,GAC5B,CAAE,6BAA4B,CACvC,CAAC,EACH,MAAQ,GACN,EAAK,GAAM,CACT,IAAM,EAAwB,CAAE,GAAG,EAAE,qBAAsB,EAC3D,OAAO,EAAsB,GAC7B,IAAM,EAA8B,CAClC,GAAG,EAAE,2BACP,EAEA,OADA,OAAO,EAA4B,GAC5B,CAAE,wBAAuB,6BAA4B,CAC9D,CAAC,EACH,aACE,EAAI,CAAE,sBAAuB,CAAC,EAAG,4BAA6B,CAAC,CAAE,CAAC,CACtE,GACA,CAAE,KAAM,YAAa,CACvB,CACF"}
1
+ {"version":3,"file":"model-store.cjs","names":[],"sources":["../../src/stores/model-store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { devtools } from \"zustand/middleware\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport type { ProfileInfo } from \"#/api/profiles-service/profiles-service.api\";\n\nexport interface ModelListEntry {\n id: string;\n /**\n * Id of the chat event after which this entry should render, or `null` to\n * pin it to the top of the chat history (no rendered events at the time\n * of /model).\n */\n anchorEventId: string | null;\n profiles: ProfileInfo[];\n switchedTo?: string;\n}\n\n/**\n * A historical switch to seed via `seedSwitches`. `id` must be stable across\n * reloads (derived from the source observation event id) so re-seeding the\n * same loaded history is idempotent.\n */\nexport interface SeededSwitch {\n id: string;\n anchorEventId: string | null;\n profileName: string;\n}\n\ninterface ModelState {\n entriesByConversation: Record<string, ModelListEntry[]>;\n /**\n * Most-recently-switched profile name per conversation. Updated by\n * `recordSwitch` so the UI (button label, popover check mark) reflects the\n * new selection instantly, before the conversation refetch from the agent\n * server lands.\n */\n activeProfileByConversation: Record<string, string>;\n}\n\ninterface ModelActions {\n show: (\n conversationId: string,\n anchorEventId: string | null,\n profiles: ProfileInfo[],\n ) => void;\n recordSwitch: (\n conversationId: string,\n anchorEventId: string | null,\n profileName: string,\n ) => void;\n /**\n * Seeds \"Switched to\" entries reconstructed from loaded history. Skips any\n * whose `id` is already present, so it can run on every history (re)load\n * without duplicating, and it preserves live-recorded entries.\n */\n seedSwitches: (conversationId: string, switches: SeededSwitch[]) => void;\n /**\n * Sets the optimistic active-profile entry for a conversation without\n * appending a chat entry — the reload/history path re-derives the stamp\n * from past SwitchLLM observations, which seed their chat entries through\n * `seedSwitches` instead of `recordSwitch`.\n */\n setActiveProfile: (conversationId: string, profileName: string) => void;\n /** Drops only the optimistic active-profile entry for a conversation. */\n clearActiveProfile: (conversationId: string) => void;\n clear: (conversationId: string) => void;\n clearAll: () => void;\n}\n\ntype ModelStore = ModelState & ModelActions;\n\nconst appendEntry = (\n state: ModelState,\n conversationId: string,\n entry: ModelListEntry,\n): Pick<ModelState, \"entriesByConversation\"> => ({\n entriesByConversation: {\n ...state.entriesByConversation,\n [conversationId]: [\n ...(state.entriesByConversation[conversationId] ?? []),\n entry,\n ],\n },\n});\n\nexport const useModelStore = create<ModelStore>()(\n devtools(\n (set) => ({\n entriesByConversation: {},\n activeProfileByConversation: {},\n show: (conversationId, anchorEventId, profiles) =>\n set((s) =>\n appendEntry(s, conversationId, {\n id: uuidv4(),\n anchorEventId,\n profiles,\n }),\n ),\n recordSwitch: (conversationId, anchorEventId, profileName) =>\n set((s) => ({\n ...appendEntry(s, conversationId, {\n id: uuidv4(),\n anchorEventId,\n profiles: [],\n switchedTo: profileName,\n }),\n activeProfileByConversation: {\n ...s.activeProfileByConversation,\n [conversationId]: profileName,\n },\n })),\n seedSwitches: (conversationId, switches) =>\n set((s) => {\n const existing = s.entriesByConversation[conversationId] ?? [];\n const existingIds = new Set(existing.map((e) => e.id));\n const additions = switches\n .filter((sw) => !existingIds.has(sw.id))\n .map(\n (sw): ModelListEntry => ({\n id: sw.id,\n anchorEventId: sw.anchorEventId,\n profiles: [],\n switchedTo: sw.profileName,\n }),\n );\n if (additions.length === 0) return s;\n return {\n entriesByConversation: {\n ...s.entriesByConversation,\n [conversationId]: [...existing, ...additions],\n },\n };\n }),\n setActiveProfile: (conversationId, profileName) =>\n set((s) => ({\n activeProfileByConversation: {\n ...s.activeProfileByConversation,\n [conversationId]: profileName,\n },\n })),\n clearActiveProfile: (conversationId) =>\n set((s) => {\n if (!(conversationId in s.activeProfileByConversation)) return s;\n const activeProfileByConversation = {\n ...s.activeProfileByConversation,\n };\n delete activeProfileByConversation[conversationId];\n return { activeProfileByConversation };\n }),\n clear: (conversationId) =>\n set((s) => {\n const entriesByConversation = { ...s.entriesByConversation };\n delete entriesByConversation[conversationId];\n const activeProfileByConversation = {\n ...s.activeProfileByConversation,\n };\n delete activeProfileByConversation[conversationId];\n return { entriesByConversation, activeProfileByConversation };\n }),\n clearAll: () =>\n set({ entriesByConversation: {}, activeProfileByConversation: {} }),\n }),\n { name: \"ModelStore\" },\n ),\n);\n"],"mappings":"4MAuEA,IAAM,GACJ,EACA,EACA,KAC+C,CAC/C,sBAAuB,CACrB,GAAG,EAAM,uBACR,GAAiB,CAChB,GAAI,EAAM,sBAAsB,IAAmB,CAAC,EACpD,CACF,CACF,CACF,GAEa,EAAgB,EAAA,OAAmB,EAC9C,EAAA,SACG,IAAS,CACR,sBAAuB,CAAC,EACxB,4BAA6B,CAAC,EAC9B,MAAO,EAAgB,EAAe,IACpC,EAAK,GACH,EAAY,EAAG,EAAgB,CAC7B,GAAI,EAAA,QAAO,EACX,gBACA,UACF,CAAC,CACH,EACF,cAAe,EAAgB,EAAe,IAC5C,EAAK,IAAO,CACV,GAAG,EAAY,EAAG,EAAgB,CAChC,GAAI,EAAA,QAAO,EACX,gBACA,SAAU,CAAC,EACX,WAAY,CACd,CAAC,EACD,4BAA6B,CAC3B,GAAG,EAAE,6BACJ,GAAiB,CACpB,CACF,EAAE,EACJ,cAAe,EAAgB,IAC7B,EAAK,GAAM,CACT,IAAM,EAAW,EAAE,sBAAsB,IAAmB,CAAC,EACvD,EAAc,IAAI,IAAI,EAAS,IAAK,GAAM,EAAE,EAAE,CAAC,EAC/C,EAAY,EACf,OAAQ,GAAO,CAAC,EAAY,IAAI,EAAG,EAAE,CAAC,EACtC,IACE,IAAwB,CACvB,GAAI,EAAG,GACP,cAAe,EAAG,cAClB,SAAU,CAAC,EACX,WAAY,EAAG,WACjB,EACF,EAEF,OADI,EAAU,SAAW,EAAU,EAC5B,CACL,sBAAuB,CACrB,GAAG,EAAE,uBACJ,GAAiB,CAAC,GAAG,EAAU,GAAG,CAAS,CAC9C,CACF,CACF,CAAC,EACH,kBAAmB,EAAgB,IACjC,EAAK,IAAO,CACV,4BAA6B,CAC3B,GAAG,EAAE,6BACJ,GAAiB,CACpB,CACF,EAAE,EACJ,mBAAqB,GACnB,EAAK,GAAM,CACT,GAAI,EAAE,KAAkB,EAAE,6BAA8B,OAAO,EAC/D,IAAM,EAA8B,CAClC,GAAG,EAAE,2BACP,EAEA,OADA,OAAO,EAA4B,GAC5B,CAAE,6BAA4B,CACvC,CAAC,EACH,MAAQ,GACN,EAAK,GAAM,CACT,IAAM,EAAwB,CAAE,GAAG,EAAE,qBAAsB,EAC3D,OAAO,EAAsB,GAC7B,IAAM,EAA8B,CAClC,GAAG,EAAE,2BACP,EAEA,OADA,OAAO,EAA4B,GAC5B,CAAE,wBAAuB,6BAA4B,CAC9D,CAAC,EACH,aACE,EAAI,CAAE,sBAAuB,CAAC,EAAG,4BAA6B,CAAC,CAAE,CAAC,CACtE,GACA,CAAE,KAAM,YAAa,CACvB,CACF"}
@@ -39,6 +39,13 @@ interface ModelActions {
39
39
  * without duplicating, and it preserves live-recorded entries.
40
40
  */
41
41
  seedSwitches: (conversationId: string, switches: SeededSwitch[]) => void;
42
+ /**
43
+ * Sets the optimistic active-profile entry for a conversation without
44
+ * appending a chat entry — the reload/history path re-derives the stamp
45
+ * from past SwitchLLM observations, which seed their chat entries through
46
+ * `seedSwitches` instead of `recordSwitch`.
47
+ */
48
+ setActiveProfile: (conversationId: string, profileName: string) => void;
42
49
  /** Drops only the optimistic active-profile entry for a conversation. */
43
50
  clearActiveProfile: (conversationId: string) => void;
44
51
  clear: (conversationId: string) => void;
@@ -37,6 +37,10 @@ var r = (e, t, n) => ({ entriesByConversation: {
37
37
  [t]: [...r, ...a]
38
38
  } };
39
39
  }),
40
+ setActiveProfile: (t, n) => e((e) => ({ activeProfileByConversation: {
41
+ ...e.activeProfileByConversation,
42
+ [t]: n
43
+ } })),
40
44
  clearActiveProfile: (t) => e((e) => {
41
45
  if (!(t in e.activeProfileByConversation)) return e;
42
46
  let n = { ...e.activeProfileByConversation };
@@ -1 +1 @@
1
- {"version":3,"file":"model-store.js","names":[],"sources":["../../src/stores/model-store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { devtools } from \"zustand/middleware\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport type { ProfileInfo } from \"#/api/profiles-service/profiles-service.api\";\n\nexport interface ModelListEntry {\n id: string;\n /**\n * Id of the chat event after which this entry should render, or `null` to\n * pin it to the top of the chat history (no rendered events at the time\n * of /model).\n */\n anchorEventId: string | null;\n profiles: ProfileInfo[];\n switchedTo?: string;\n}\n\n/**\n * A historical switch to seed via `seedSwitches`. `id` must be stable across\n * reloads (derived from the source observation event id) so re-seeding the\n * same loaded history is idempotent.\n */\nexport interface SeededSwitch {\n id: string;\n anchorEventId: string | null;\n profileName: string;\n}\n\ninterface ModelState {\n entriesByConversation: Record<string, ModelListEntry[]>;\n /**\n * Most-recently-switched profile name per conversation. Updated by\n * `recordSwitch` so the UI (button label, popover check mark) reflects the\n * new selection instantly, before the conversation refetch from the agent\n * server lands.\n */\n activeProfileByConversation: Record<string, string>;\n}\n\ninterface ModelActions {\n show: (\n conversationId: string,\n anchorEventId: string | null,\n profiles: ProfileInfo[],\n ) => void;\n recordSwitch: (\n conversationId: string,\n anchorEventId: string | null,\n profileName: string,\n ) => void;\n /**\n * Seeds \"Switched to\" entries reconstructed from loaded history. Skips any\n * whose `id` is already present, so it can run on every history (re)load\n * without duplicating, and it preserves live-recorded entries.\n */\n seedSwitches: (conversationId: string, switches: SeededSwitch[]) => void;\n /** Drops only the optimistic active-profile entry for a conversation. */\n clearActiveProfile: (conversationId: string) => void;\n clear: (conversationId: string) => void;\n clearAll: () => void;\n}\n\ntype ModelStore = ModelState & ModelActions;\n\nconst appendEntry = (\n state: ModelState,\n conversationId: string,\n entry: ModelListEntry,\n): Pick<ModelState, \"entriesByConversation\"> => ({\n entriesByConversation: {\n ...state.entriesByConversation,\n [conversationId]: [\n ...(state.entriesByConversation[conversationId] ?? []),\n entry,\n ],\n },\n});\n\nexport const useModelStore = create<ModelStore>()(\n devtools(\n (set) => ({\n entriesByConversation: {},\n activeProfileByConversation: {},\n show: (conversationId, anchorEventId, profiles) =>\n set((s) =>\n appendEntry(s, conversationId, {\n id: uuidv4(),\n anchorEventId,\n profiles,\n }),\n ),\n recordSwitch: (conversationId, anchorEventId, profileName) =>\n set((s) => ({\n ...appendEntry(s, conversationId, {\n id: uuidv4(),\n anchorEventId,\n profiles: [],\n switchedTo: profileName,\n }),\n activeProfileByConversation: {\n ...s.activeProfileByConversation,\n [conversationId]: profileName,\n },\n })),\n seedSwitches: (conversationId, switches) =>\n set((s) => {\n const existing = s.entriesByConversation[conversationId] ?? [];\n const existingIds = new Set(existing.map((e) => e.id));\n const additions = switches\n .filter((sw) => !existingIds.has(sw.id))\n .map(\n (sw): ModelListEntry => ({\n id: sw.id,\n anchorEventId: sw.anchorEventId,\n profiles: [],\n switchedTo: sw.profileName,\n }),\n );\n if (additions.length === 0) return s;\n return {\n entriesByConversation: {\n ...s.entriesByConversation,\n [conversationId]: [...existing, ...additions],\n },\n };\n }),\n clearActiveProfile: (conversationId) =>\n set((s) => {\n if (!(conversationId in s.activeProfileByConversation)) return s;\n const activeProfileByConversation = {\n ...s.activeProfileByConversation,\n };\n delete activeProfileByConversation[conversationId];\n return { activeProfileByConversation };\n }),\n clear: (conversationId) =>\n set((s) => {\n const entriesByConversation = { ...s.entriesByConversation };\n delete entriesByConversation[conversationId];\n const activeProfileByConversation = {\n ...s.activeProfileByConversation,\n };\n delete activeProfileByConversation[conversationId];\n return { entriesByConversation, activeProfileByConversation };\n }),\n clearAll: () =>\n set({ entriesByConversation: {}, activeProfileByConversation: {} }),\n }),\n { name: \"ModelStore\" },\n ),\n);\n"],"mappings":";;;;AAgEA,IAAM,KACJ,GACA,GACA,OAC+C,EAC/C,uBAAuB;CACrB,GAAG,EAAM;EACR,IAAiB,CAChB,GAAI,EAAM,sBAAsB,MAAmB,CAAC,GACpD,CACF;AACF,EACF,IAEa,IAAgB,EAAmB,EAC9C,GACG,OAAS;CACR,uBAAuB,CAAC;CACxB,6BAA6B,CAAC;CAC9B,OAAO,GAAgB,GAAe,MACpC,GAAK,MACH,EAAY,GAAG,GAAgB;EAC7B,IAAI,EAAO;EACX;EACA;CACF,CAAC,CACH;CACF,eAAe,GAAgB,GAAe,MAC5C,GAAK,OAAO;EACV,GAAG,EAAY,GAAG,GAAgB;GAChC,IAAI,EAAO;GACX;GACA,UAAU,CAAC;GACX,YAAY;EACd,CAAC;EACD,6BAA6B;GAC3B,GAAG,EAAE;IACJ,IAAiB;EACpB;CACF,EAAE;CACJ,eAAe,GAAgB,MAC7B,GAAK,MAAM;EACT,IAAM,IAAW,EAAE,sBAAsB,MAAmB,CAAC,GACvD,IAAc,IAAI,IAAI,EAAS,KAAK,MAAM,EAAE,EAAE,CAAC,GAC/C,IAAY,EACf,QAAQ,MAAO,CAAC,EAAY,IAAI,EAAG,EAAE,CAAC,EACtC,KACE,OAAwB;GACvB,IAAI,EAAG;GACP,eAAe,EAAG;GAClB,UAAU,CAAC;GACX,YAAY,EAAG;EACjB,EACF;EAEF,OADI,EAAU,WAAW,IAAU,IAC5B,EACL,uBAAuB;GACrB,GAAG,EAAE;IACJ,IAAiB,CAAC,GAAG,GAAU,GAAG,CAAS;EAC9C,EACF;CACF,CAAC;CACH,qBAAqB,MACnB,GAAK,MAAM;EACT,IAAI,EAAE,KAAkB,EAAE,8BAA8B,OAAO;EAC/D,IAAM,IAA8B,EAClC,GAAG,EAAE,4BACP;EAEA,OADA,OAAO,EAA4B,IAC5B,EAAE,+BAA4B;CACvC,CAAC;CACH,QAAQ,MACN,GAAK,MAAM;EACT,IAAM,IAAwB,EAAE,GAAG,EAAE,sBAAsB;EAC3D,OAAO,EAAsB;EAC7B,IAAM,IAA8B,EAClC,GAAG,EAAE,4BACP;EAEA,OADA,OAAO,EAA4B,IAC5B;GAAE;GAAuB;EAA4B;CAC9D,CAAC;CACH,gBACE,EAAI;EAAE,uBAAuB,CAAC;EAAG,6BAA6B,CAAC;CAAE,CAAC;AACtE,IACA,EAAE,MAAM,aAAa,CACvB,CACF"}
1
+ {"version":3,"file":"model-store.js","names":[],"sources":["../../src/stores/model-store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { devtools } from \"zustand/middleware\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport type { ProfileInfo } from \"#/api/profiles-service/profiles-service.api\";\n\nexport interface ModelListEntry {\n id: string;\n /**\n * Id of the chat event after which this entry should render, or `null` to\n * pin it to the top of the chat history (no rendered events at the time\n * of /model).\n */\n anchorEventId: string | null;\n profiles: ProfileInfo[];\n switchedTo?: string;\n}\n\n/**\n * A historical switch to seed via `seedSwitches`. `id` must be stable across\n * reloads (derived from the source observation event id) so re-seeding the\n * same loaded history is idempotent.\n */\nexport interface SeededSwitch {\n id: string;\n anchorEventId: string | null;\n profileName: string;\n}\n\ninterface ModelState {\n entriesByConversation: Record<string, ModelListEntry[]>;\n /**\n * Most-recently-switched profile name per conversation. Updated by\n * `recordSwitch` so the UI (button label, popover check mark) reflects the\n * new selection instantly, before the conversation refetch from the agent\n * server lands.\n */\n activeProfileByConversation: Record<string, string>;\n}\n\ninterface ModelActions {\n show: (\n conversationId: string,\n anchorEventId: string | null,\n profiles: ProfileInfo[],\n ) => void;\n recordSwitch: (\n conversationId: string,\n anchorEventId: string | null,\n profileName: string,\n ) => void;\n /**\n * Seeds \"Switched to\" entries reconstructed from loaded history. Skips any\n * whose `id` is already present, so it can run on every history (re)load\n * without duplicating, and it preserves live-recorded entries.\n */\n seedSwitches: (conversationId: string, switches: SeededSwitch[]) => void;\n /**\n * Sets the optimistic active-profile entry for a conversation without\n * appending a chat entry — the reload/history path re-derives the stamp\n * from past SwitchLLM observations, which seed their chat entries through\n * `seedSwitches` instead of `recordSwitch`.\n */\n setActiveProfile: (conversationId: string, profileName: string) => void;\n /** Drops only the optimistic active-profile entry for a conversation. */\n clearActiveProfile: (conversationId: string) => void;\n clear: (conversationId: string) => void;\n clearAll: () => void;\n}\n\ntype ModelStore = ModelState & ModelActions;\n\nconst appendEntry = (\n state: ModelState,\n conversationId: string,\n entry: ModelListEntry,\n): Pick<ModelState, \"entriesByConversation\"> => ({\n entriesByConversation: {\n ...state.entriesByConversation,\n [conversationId]: [\n ...(state.entriesByConversation[conversationId] ?? []),\n entry,\n ],\n },\n});\n\nexport const useModelStore = create<ModelStore>()(\n devtools(\n (set) => ({\n entriesByConversation: {},\n activeProfileByConversation: {},\n show: (conversationId, anchorEventId, profiles) =>\n set((s) =>\n appendEntry(s, conversationId, {\n id: uuidv4(),\n anchorEventId,\n profiles,\n }),\n ),\n recordSwitch: (conversationId, anchorEventId, profileName) =>\n set((s) => ({\n ...appendEntry(s, conversationId, {\n id: uuidv4(),\n anchorEventId,\n profiles: [],\n switchedTo: profileName,\n }),\n activeProfileByConversation: {\n ...s.activeProfileByConversation,\n [conversationId]: profileName,\n },\n })),\n seedSwitches: (conversationId, switches) =>\n set((s) => {\n const existing = s.entriesByConversation[conversationId] ?? [];\n const existingIds = new Set(existing.map((e) => e.id));\n const additions = switches\n .filter((sw) => !existingIds.has(sw.id))\n .map(\n (sw): ModelListEntry => ({\n id: sw.id,\n anchorEventId: sw.anchorEventId,\n profiles: [],\n switchedTo: sw.profileName,\n }),\n );\n if (additions.length === 0) return s;\n return {\n entriesByConversation: {\n ...s.entriesByConversation,\n [conversationId]: [...existing, ...additions],\n },\n };\n }),\n setActiveProfile: (conversationId, profileName) =>\n set((s) => ({\n activeProfileByConversation: {\n ...s.activeProfileByConversation,\n [conversationId]: profileName,\n },\n })),\n clearActiveProfile: (conversationId) =>\n set((s) => {\n if (!(conversationId in s.activeProfileByConversation)) return s;\n const activeProfileByConversation = {\n ...s.activeProfileByConversation,\n };\n delete activeProfileByConversation[conversationId];\n return { activeProfileByConversation };\n }),\n clear: (conversationId) =>\n set((s) => {\n const entriesByConversation = { ...s.entriesByConversation };\n delete entriesByConversation[conversationId];\n const activeProfileByConversation = {\n ...s.activeProfileByConversation,\n };\n delete activeProfileByConversation[conversationId];\n return { entriesByConversation, activeProfileByConversation };\n }),\n clearAll: () =>\n set({ entriesByConversation: {}, activeProfileByConversation: {} }),\n }),\n { name: \"ModelStore\" },\n ),\n);\n"],"mappings":";;;;AAuEA,IAAM,KACJ,GACA,GACA,OAC+C,EAC/C,uBAAuB;CACrB,GAAG,EAAM;EACR,IAAiB,CAChB,GAAI,EAAM,sBAAsB,MAAmB,CAAC,GACpD,CACF;AACF,EACF,IAEa,IAAgB,EAAmB,EAC9C,GACG,OAAS;CACR,uBAAuB,CAAC;CACxB,6BAA6B,CAAC;CAC9B,OAAO,GAAgB,GAAe,MACpC,GAAK,MACH,EAAY,GAAG,GAAgB;EAC7B,IAAI,EAAO;EACX;EACA;CACF,CAAC,CACH;CACF,eAAe,GAAgB,GAAe,MAC5C,GAAK,OAAO;EACV,GAAG,EAAY,GAAG,GAAgB;GAChC,IAAI,EAAO;GACX;GACA,UAAU,CAAC;GACX,YAAY;EACd,CAAC;EACD,6BAA6B;GAC3B,GAAG,EAAE;IACJ,IAAiB;EACpB;CACF,EAAE;CACJ,eAAe,GAAgB,MAC7B,GAAK,MAAM;EACT,IAAM,IAAW,EAAE,sBAAsB,MAAmB,CAAC,GACvD,IAAc,IAAI,IAAI,EAAS,KAAK,MAAM,EAAE,EAAE,CAAC,GAC/C,IAAY,EACf,QAAQ,MAAO,CAAC,EAAY,IAAI,EAAG,EAAE,CAAC,EACtC,KACE,OAAwB;GACvB,IAAI,EAAG;GACP,eAAe,EAAG;GAClB,UAAU,CAAC;GACX,YAAY,EAAG;EACjB,EACF;EAEF,OADI,EAAU,WAAW,IAAU,IAC5B,EACL,uBAAuB;GACrB,GAAG,EAAE;IACJ,IAAiB,CAAC,GAAG,GAAU,GAAG,CAAS;EAC9C,EACF;CACF,CAAC;CACH,mBAAmB,GAAgB,MACjC,GAAK,OAAO,EACV,6BAA6B;EAC3B,GAAG,EAAE;GACJ,IAAiB;CACpB,EACF,EAAE;CACJ,qBAAqB,MACnB,GAAK,MAAM;EACT,IAAI,EAAE,KAAkB,EAAE,8BAA8B,OAAO;EAC/D,IAAM,IAA8B,EAClC,GAAG,EAAE,4BACP;EAEA,OADA,OAAO,EAA4B,IAC5B,EAAE,+BAA4B;CACvC,CAAC;CACH,QAAQ,MACN,GAAK,MAAM;EACT,IAAM,IAAwB,EAAE,GAAG,EAAE,sBAAsB;EAC3D,OAAO,EAAsB;EAC7B,IAAM,IAA8B,EAClC,GAAG,EAAE,4BACP;EAEA,OADA,OAAO,EAA4B,IAC5B;GAAE;GAAuB;EAA4B;CAC9D,CAAC;CACH,gBACE,EAAI;EAAE,uBAAuB,CAAC;EAAG,6BAA6B,CAAC;CAAE,CAAC;AACtE,IACA,EAAE,MAAM,aAAa,CACvB,CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"automation.cjs","names":[],"sources":["../../src/types/automation.ts"],"sourcesContent":["export interface AutomationTrigger {\n /**\n * Trigger kind. Known values are the schedule aliases \"cron\" / \"schedule\"\n * (time-based) and \"event\" (webhook/event-driven). Kept as `string` rather\n * than a closed union on purpose: the backend emits more than one\n * scheduled-trigger alias and may introduce new kinds, so UI code branches\n * on `type === \"event\"` and treats every other value as a schedule.\n */\n type: string;\n /** Cron expression (schedule triggers only). */\n schedule?: string;\n /** Human-readable schedule description (schedule triggers only). */\n schedule_human?: string;\n /** IANA timezone name (schedule triggers only). */\n timezone?: string;\n /** Event source, e.g. \"github\" (event triggers only). */\n source?: string;\n /** Event key pattern(s) to match, e.g. \"pull_request.opened\" or [\"push\", \"release.*\"]. */\n on?: string | string[];\n /** JMESPath filter expression evaluated against the raw webhook payload. */\n filter?: string;\n}\n\nexport interface Automation {\n id: string;\n name: string;\n trigger: AutomationTrigger;\n enabled: boolean;\n repository?: string;\n /** LLM/model profile name used for automation runs. */\n model?: string | null;\n /**\n * Maximum run time in seconds. `null`/omitted uses the server default\n * (600s, 10 min); the deployment reports the maximum it accepts.\n */\n timeout?: number | null;\n\n created_at: string;\n updated_at: string;\n prompt: string | null;\n branch?: string;\n plugins?: string[];\n notification?: string;\n timezone?: string;\n last_triggered_at?: string | null;\n}\n\nexport type AutomationSpec = Omit<\n Automation,\n \"id\" | \"created_at\" | \"updated_at\" | \"last_triggered_at\"\n>;\n\n/** The envelope constants come from the interface manifest's import/export spec. */\nexport interface AutomationExportFile {\n version: number;\n kind: string;\n spec: AutomationSpec;\n}\n\nexport interface AutomationsResponse {\n automations: Automation[];\n total: number;\n}\n\n/** Mirrors `RunStatus` in the automation service's OpenAPI schema. */\nexport enum AutomationRunStatus {\n PENDING = \"PENDING\",\n RUNNING = \"RUNNING\",\n COMPLETED = \"COMPLETED\",\n FAILED = \"FAILED\",\n CANCELLED = \"CANCELLED\",\n SKIPPED = \"SKIPPED\",\n}\n\nexport interface AutomationRun {\n id: string;\n status: AutomationRunStatus;\n conversation_id: string | null;\n /**\n * ID of the bash command that ran the automation inside the agent-server\n * sandbox. Used to fetch run logs from\n * `/api/bash/bash_events/{bash_command_id}` and the matching\n * `BashOutput` events. Null when the run failed before a command was\n * dispatched (e.g. sandbox provisioning errors).\n */\n bash_command_id: string | null;\n error_detail: string | null;\n /**\n * Accumulated LLM cost of the run in USD, reported by the SDK in the\n * completion callback. `null` means unknown — the run predates cost\n * tracking, or ended without a callback (cancelled, watchdog timeout).\n * Absent entirely when the automation service is older than the release\n * that added the field, hence optional.\n */\n cost?: number | null;\n /**\n * Machine-readable code for the run's current or last-known phase (e.g.\n * \"sandbox_provisioning\"). `null` means nothing has reported one; absent\n * entirely against an automation service that predates phase reporting.\n * Code and label are one value, always written together.\n */\n phase_code?: string | null;\n /**\n * Author-supplied description of the phase (at most 200 characters, no\n * control or separator characters, emoji and non-Latin text allowed).\n * Data, not translatable interface copy.\n */\n phase_label?: string | null;\n /** UTC datetime the phase was last written. Same nullability as `phase_code`. */\n phase_updated_at?: string | null;\n started_at: string;\n completed_at: string | null;\n}\n\nexport interface AutomationRunsResponse {\n runs: AutomationRun[];\n total: number;\n}\n\nexport type ActivityLogExportFormat = \"json\" | \"csv\";\n\n/** Client-built Activity Log export row (from list runs + automation detail). */\nexport interface AutomationRunExportRow {\n run_id: string;\n automation_id: string;\n automation_name: string;\n trigger: AutomationTrigger | Record<string, unknown>;\n start_time: string | null;\n end_time: string | null;\n duration_seconds: number | null;\n status: AutomationRunStatus;\n conversation_id: string | null;\n conversation_url: string | null;\n error: string | null;\n /**\n * Accumulated LLM cost in USD, or null when unknown. Unlike\n * `AutomationRun[\"cost\"]` this is always present: the row normalizes a\n * missing field to null so every exported record has the same shape.\n */\n cost: number | null;\n /**\n * The raw `phase_code`, like `status`, falling back to `phase_label` for a\n * phase reported without a code. Null only when the run has no phase.\n */\n phase: string | null;\n}\n"],"mappings":"6CAiEA,IAAY,EAAL,SAAA,EAAA,OACL,GAAA,QAAA,UACA,EAAA,QAAA,UACA,EAAA,UAAA,YACA,EAAA,OAAA,SACA,EAAA,UAAA,YACA,EAAA,QAAA,WACF,EAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"automation.cjs","names":[],"sources":["../../src/types/automation.ts"],"sourcesContent":["export interface AutomationTrigger {\n /**\n * Trigger kind. Known values are the schedule aliases \"cron\" / \"schedule\"\n * (time-based) and \"event\" (webhook/event-driven). Kept as `string` rather\n * than a closed union on purpose: the backend emits more than one\n * scheduled-trigger alias and may introduce new kinds, so UI code branches\n * on `type === \"event\"` and treats every other value as a schedule.\n */\n type: string;\n /** Cron expression (schedule triggers only). */\n schedule?: string;\n /** Human-readable schedule description (schedule triggers only). */\n schedule_human?: string;\n /** IANA timezone name (schedule triggers only). */\n timezone?: string;\n /** Event source, e.g. \"github\" (event triggers only). */\n source?: string;\n /** Event key pattern(s) to match, e.g. \"pull_request.opened\" or [\"push\", \"release.*\"]. */\n on?: string | string[];\n /** JMESPath filter expression evaluated against the raw webhook payload. */\n filter?: string;\n}\n\nexport interface Automation {\n id: string;\n name: string;\n trigger: AutomationTrigger;\n enabled: boolean;\n /**\n * UUID of the user who created this automation. The backend returns it in\n * `AutomationResponse.user_id`; the frontend uses it to implement the\n * \"creator escape hatch\" — a member (view-only) may still edit their own\n * automations even without `manage_automations`.\n */\n user_id?: string;\n repository?: string;\n /** LLM/model profile name used for automation runs. */\n model?: string | null;\n /**\n * Maximum run time in seconds. `null`/omitted uses the server default\n * (600s, 10 min); the deployment reports the maximum it accepts.\n */\n timeout?: number | null;\n\n created_at: string;\n updated_at: string;\n prompt: string | null;\n branch?: string;\n plugins?: string[];\n notification?: string;\n timezone?: string;\n last_triggered_at?: string | null;\n /**\n * Service-owned preset state, returned verbatim. The GUI reads only the\n * `template` provenance block inside it ({id, version, config}, written at\n * setup time), and only through the guarded helper in\n * `#/utils/automation-catalog`.\n */\n preset_metadata?: Record<string, unknown> | null;\n}\n\nexport type AutomationSpec = Omit<\n Automation,\n \"id\" | \"created_at\" | \"updated_at\" | \"last_triggered_at\" | \"preset_metadata\"\n>;\n\n/** The envelope constants come from the interface manifest's import/export spec. */\nexport interface AutomationExportFile {\n version: number;\n kind: string;\n spec: AutomationSpec;\n}\n\nexport interface AutomationsResponse {\n automations: Automation[];\n total: number;\n}\n\n/** Mirrors `RunStatus` in the automation service's OpenAPI schema. */\nexport enum AutomationRunStatus {\n PENDING = \"PENDING\",\n RUNNING = \"RUNNING\",\n COMPLETED = \"COMPLETED\",\n FAILED = \"FAILED\",\n CANCELLED = \"CANCELLED\",\n SKIPPED = \"SKIPPED\",\n}\n\nexport type AutomationTaskOutcomeStatus =\n | \"success\"\n | \"partial_success\"\n | \"blocked\"\n | \"failed\"\n | \"unknown\";\n\nexport interface AutomationFinishToolResponse {\n status?: AutomationTaskOutcomeStatus | string;\n outcome_summary?: string;\n [key: string]: unknown;\n}\n\nexport interface AutomationRunMetadata {\n finish_tool_response?: AutomationFinishToolResponse | string | null;\n [key: string]: unknown;\n}\n\nexport interface AutomationRunStatusDetail {\n phase?: string;\n kind?: string;\n detail?: string;\n formatted_detail?: string;\n transient?: boolean;\n source?: string;\n operation?: string;\n code?: string;\n status_code?: number;\n [key: string]: unknown;\n}\n\nexport interface AutomationRun {\n id: string;\n status: AutomationRunStatus;\n conversation_id: string | null;\n /**\n * ID of the bash command that ran the automation inside the agent-server\n * sandbox. Used to fetch run logs from\n * `/api/bash/bash_events/{bash_command_id}` and the matching\n * `BashOutput` events. Null when the run failed before a command was\n * dispatched (e.g. sandbox provisioning errors).\n */\n bash_command_id: string | null;\n error_detail: string | null;\n status_detail?: AutomationRunStatusDetail | null;\n run_metadata?: AutomationRunMetadata | null;\n /**\n * Accumulated LLM cost of the run in USD, reported by the SDK in the\n * completion callback. `null` means unknown — the run predates cost\n * tracking, or ended without a callback (cancelled, watchdog timeout).\n * Absent entirely when the automation service is older than the release\n * that added the field, hence optional.\n */\n cost?: number | null;\n /**\n * Machine-readable code for the run's current or last-known phase (e.g.\n * \"sandbox_provisioning\"). `null` means nothing has reported one; absent\n * entirely against an automation service that predates phase reporting.\n * Code and label are one value, always written together.\n */\n phase_code?: string | null;\n /**\n * Author-supplied description of the phase (at most 200 characters, no\n * control or separator characters, emoji and non-Latin text allowed).\n * Data, not translatable interface copy.\n */\n phase_label?: string | null;\n /** UTC datetime the phase was last written. Same nullability as `phase_code`. */\n phase_updated_at?: string | null;\n started_at: string;\n completed_at: string | null;\n}\n\nexport interface AutomationRunsResponse {\n runs: AutomationRun[];\n total: number;\n /**\n * Lifetime run counts by status, unaffected by pagination. Sparse — a\n * status with no runs has no key, so when the field is present a missing\n * key means zero. Absent entirely when the automation service is older\n * than the release that added it.\n */\n status_counts?: Partial<Record<AutomationRunStatus, number>>;\n}\n\nexport type ActivityLogExportFormat = \"json\" | \"csv\";\n\n/** Client-built Activity Log export row (from list runs + automation detail). */\nexport interface AutomationRunExportRow {\n run_id: string;\n automation_id: string;\n automation_name: string;\n trigger: AutomationTrigger | Record<string, unknown>;\n start_time: string | null;\n end_time: string | null;\n duration_seconds: number | null;\n status: AutomationRunStatus;\n conversation_id: string | null;\n conversation_url: string | null;\n error: string | null;\n /**\n * Accumulated LLM cost in USD, or null when unknown. Unlike\n * `AutomationRun[\"cost\"]` this is always present: the row normalizes a\n * missing field to null so every exported record has the same shape.\n */\n cost: number | null;\n /**\n * The raw `phase_code`, like `status`, falling back to `phase_label` for a\n * phase reported without a code. Null only when the run has no phase.\n */\n phase: string | null;\n}\n"],"mappings":"6CA+EA,IAAY,EAAL,SAAA,EAAA,OACL,GAAA,QAAA,UACA,EAAA,QAAA,UACA,EAAA,UAAA,YACA,EAAA,OAAA,SACA,EAAA,UAAA,YACA,EAAA,QAAA,WACF,EAAA,CAAA,CAAA"}
@@ -25,6 +25,13 @@ export interface Automation {
25
25
  name: string;
26
26
  trigger: AutomationTrigger;
27
27
  enabled: boolean;
28
+ /**
29
+ * UUID of the user who created this automation. The backend returns it in
30
+ * `AutomationResponse.user_id`; the frontend uses it to implement the
31
+ * "creator escape hatch" — a member (view-only) may still edit their own
32
+ * automations even without `manage_automations`.
33
+ */
34
+ user_id?: string;
28
35
  repository?: string;
29
36
  /** LLM/model profile name used for automation runs. */
30
37
  model?: string | null;
@@ -41,8 +48,15 @@ export interface Automation {
41
48
  notification?: string;
42
49
  timezone?: string;
43
50
  last_triggered_at?: string | null;
51
+ /**
52
+ * Service-owned preset state, returned verbatim. The GUI reads only the
53
+ * `template` provenance block inside it ({id, version, config}, written at
54
+ * setup time), and only through the guarded helper in
55
+ * `#/utils/automation-catalog`.
56
+ */
57
+ preset_metadata?: Record<string, unknown> | null;
44
58
  }
45
- export type AutomationSpec = Omit<Automation, "id" | "created_at" | "updated_at" | "last_triggered_at">;
59
+ export type AutomationSpec = Omit<Automation, "id" | "created_at" | "updated_at" | "last_triggered_at" | "preset_metadata">;
46
60
  /** The envelope constants come from the interface manifest's import/export spec. */
47
61
  export interface AutomationExportFile {
48
62
  version: number;
@@ -62,6 +76,28 @@ export declare enum AutomationRunStatus {
62
76
  CANCELLED = "CANCELLED",
63
77
  SKIPPED = "SKIPPED"
64
78
  }
79
+ export type AutomationTaskOutcomeStatus = "success" | "partial_success" | "blocked" | "failed" | "unknown";
80
+ export interface AutomationFinishToolResponse {
81
+ status?: AutomationTaskOutcomeStatus | string;
82
+ outcome_summary?: string;
83
+ [key: string]: unknown;
84
+ }
85
+ export interface AutomationRunMetadata {
86
+ finish_tool_response?: AutomationFinishToolResponse | string | null;
87
+ [key: string]: unknown;
88
+ }
89
+ export interface AutomationRunStatusDetail {
90
+ phase?: string;
91
+ kind?: string;
92
+ detail?: string;
93
+ formatted_detail?: string;
94
+ transient?: boolean;
95
+ source?: string;
96
+ operation?: string;
97
+ code?: string;
98
+ status_code?: number;
99
+ [key: string]: unknown;
100
+ }
65
101
  export interface AutomationRun {
66
102
  id: string;
67
103
  status: AutomationRunStatus;
@@ -75,6 +111,8 @@ export interface AutomationRun {
75
111
  */
76
112
  bash_command_id: string | null;
77
113
  error_detail: string | null;
114
+ status_detail?: AutomationRunStatusDetail | null;
115
+ run_metadata?: AutomationRunMetadata | null;
78
116
  /**
79
117
  * Accumulated LLM cost of the run in USD, reported by the SDK in the
80
118
  * completion callback. `null` means unknown — the run predates cost
@@ -104,6 +142,13 @@ export interface AutomationRun {
104
142
  export interface AutomationRunsResponse {
105
143
  runs: AutomationRun[];
106
144
  total: number;
145
+ /**
146
+ * Lifetime run counts by status, unaffected by pagination. Sparse — a
147
+ * status with no runs has no key, so when the field is present a missing
148
+ * key means zero. Absent entirely when the automation service is older
149
+ * than the release that added it.
150
+ */
151
+ status_counts?: Partial<Record<AutomationRunStatus, number>>;
107
152
  }
108
153
  export type ActivityLogExportFormat = "json" | "csv";
109
154
  /** Client-built Activity Log export row (from list runs + automation detail). */
@@ -1 +1 @@
1
- {"version":3,"file":"automation.js","names":[],"sources":["../../src/types/automation.ts"],"sourcesContent":["export interface AutomationTrigger {\n /**\n * Trigger kind. Known values are the schedule aliases \"cron\" / \"schedule\"\n * (time-based) and \"event\" (webhook/event-driven). Kept as `string` rather\n * than a closed union on purpose: the backend emits more than one\n * scheduled-trigger alias and may introduce new kinds, so UI code branches\n * on `type === \"event\"` and treats every other value as a schedule.\n */\n type: string;\n /** Cron expression (schedule triggers only). */\n schedule?: string;\n /** Human-readable schedule description (schedule triggers only). */\n schedule_human?: string;\n /** IANA timezone name (schedule triggers only). */\n timezone?: string;\n /** Event source, e.g. \"github\" (event triggers only). */\n source?: string;\n /** Event key pattern(s) to match, e.g. \"pull_request.opened\" or [\"push\", \"release.*\"]. */\n on?: string | string[];\n /** JMESPath filter expression evaluated against the raw webhook payload. */\n filter?: string;\n}\n\nexport interface Automation {\n id: string;\n name: string;\n trigger: AutomationTrigger;\n enabled: boolean;\n repository?: string;\n /** LLM/model profile name used for automation runs. */\n model?: string | null;\n /**\n * Maximum run time in seconds. `null`/omitted uses the server default\n * (600s, 10 min); the deployment reports the maximum it accepts.\n */\n timeout?: number | null;\n\n created_at: string;\n updated_at: string;\n prompt: string | null;\n branch?: string;\n plugins?: string[];\n notification?: string;\n timezone?: string;\n last_triggered_at?: string | null;\n}\n\nexport type AutomationSpec = Omit<\n Automation,\n \"id\" | \"created_at\" | \"updated_at\" | \"last_triggered_at\"\n>;\n\n/** The envelope constants come from the interface manifest's import/export spec. */\nexport interface AutomationExportFile {\n version: number;\n kind: string;\n spec: AutomationSpec;\n}\n\nexport interface AutomationsResponse {\n automations: Automation[];\n total: number;\n}\n\n/** Mirrors `RunStatus` in the automation service's OpenAPI schema. */\nexport enum AutomationRunStatus {\n PENDING = \"PENDING\",\n RUNNING = \"RUNNING\",\n COMPLETED = \"COMPLETED\",\n FAILED = \"FAILED\",\n CANCELLED = \"CANCELLED\",\n SKIPPED = \"SKIPPED\",\n}\n\nexport interface AutomationRun {\n id: string;\n status: AutomationRunStatus;\n conversation_id: string | null;\n /**\n * ID of the bash command that ran the automation inside the agent-server\n * sandbox. Used to fetch run logs from\n * `/api/bash/bash_events/{bash_command_id}` and the matching\n * `BashOutput` events. Null when the run failed before a command was\n * dispatched (e.g. sandbox provisioning errors).\n */\n bash_command_id: string | null;\n error_detail: string | null;\n /**\n * Accumulated LLM cost of the run in USD, reported by the SDK in the\n * completion callback. `null` means unknown — the run predates cost\n * tracking, or ended without a callback (cancelled, watchdog timeout).\n * Absent entirely when the automation service is older than the release\n * that added the field, hence optional.\n */\n cost?: number | null;\n /**\n * Machine-readable code for the run's current or last-known phase (e.g.\n * \"sandbox_provisioning\"). `null` means nothing has reported one; absent\n * entirely against an automation service that predates phase reporting.\n * Code and label are one value, always written together.\n */\n phase_code?: string | null;\n /**\n * Author-supplied description of the phase (at most 200 characters, no\n * control or separator characters, emoji and non-Latin text allowed).\n * Data, not translatable interface copy.\n */\n phase_label?: string | null;\n /** UTC datetime the phase was last written. Same nullability as `phase_code`. */\n phase_updated_at?: string | null;\n started_at: string;\n completed_at: string | null;\n}\n\nexport interface AutomationRunsResponse {\n runs: AutomationRun[];\n total: number;\n}\n\nexport type ActivityLogExportFormat = \"json\" | \"csv\";\n\n/** Client-built Activity Log export row (from list runs + automation detail). */\nexport interface AutomationRunExportRow {\n run_id: string;\n automation_id: string;\n automation_name: string;\n trigger: AutomationTrigger | Record<string, unknown>;\n start_time: string | null;\n end_time: string | null;\n duration_seconds: number | null;\n status: AutomationRunStatus;\n conversation_id: string | null;\n conversation_url: string | null;\n error: string | null;\n /**\n * Accumulated LLM cost in USD, or null when unknown. Unlike\n * `AutomationRun[\"cost\"]` this is always present: the row normalizes a\n * missing field to null so every exported record has the same shape.\n */\n cost: number | null;\n /**\n * The raw `phase_code`, like `status`, falling back to `phase_label` for a\n * phase reported without a code. Null only when the run has no phase.\n */\n phase: string | null;\n}\n"],"mappings":";AAiEA,IAAY,IAAL,yBAAA,GAAA;QACL,EAAA,UAAA,WACA,EAAA,UAAA,WACA,EAAA,YAAA,aACA,EAAA,SAAA,UACA,EAAA,YAAA,aACA,EAAA,UAAA;AACF,EAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"automation.js","names":[],"sources":["../../src/types/automation.ts"],"sourcesContent":["export interface AutomationTrigger {\n /**\n * Trigger kind. Known values are the schedule aliases \"cron\" / \"schedule\"\n * (time-based) and \"event\" (webhook/event-driven). Kept as `string` rather\n * than a closed union on purpose: the backend emits more than one\n * scheduled-trigger alias and may introduce new kinds, so UI code branches\n * on `type === \"event\"` and treats every other value as a schedule.\n */\n type: string;\n /** Cron expression (schedule triggers only). */\n schedule?: string;\n /** Human-readable schedule description (schedule triggers only). */\n schedule_human?: string;\n /** IANA timezone name (schedule triggers only). */\n timezone?: string;\n /** Event source, e.g. \"github\" (event triggers only). */\n source?: string;\n /** Event key pattern(s) to match, e.g. \"pull_request.opened\" or [\"push\", \"release.*\"]. */\n on?: string | string[];\n /** JMESPath filter expression evaluated against the raw webhook payload. */\n filter?: string;\n}\n\nexport interface Automation {\n id: string;\n name: string;\n trigger: AutomationTrigger;\n enabled: boolean;\n /**\n * UUID of the user who created this automation. The backend returns it in\n * `AutomationResponse.user_id`; the frontend uses it to implement the\n * \"creator escape hatch\" — a member (view-only) may still edit their own\n * automations even without `manage_automations`.\n */\n user_id?: string;\n repository?: string;\n /** LLM/model profile name used for automation runs. */\n model?: string | null;\n /**\n * Maximum run time in seconds. `null`/omitted uses the server default\n * (600s, 10 min); the deployment reports the maximum it accepts.\n */\n timeout?: number | null;\n\n created_at: string;\n updated_at: string;\n prompt: string | null;\n branch?: string;\n plugins?: string[];\n notification?: string;\n timezone?: string;\n last_triggered_at?: string | null;\n /**\n * Service-owned preset state, returned verbatim. The GUI reads only the\n * `template` provenance block inside it ({id, version, config}, written at\n * setup time), and only through the guarded helper in\n * `#/utils/automation-catalog`.\n */\n preset_metadata?: Record<string, unknown> | null;\n}\n\nexport type AutomationSpec = Omit<\n Automation,\n \"id\" | \"created_at\" | \"updated_at\" | \"last_triggered_at\" | \"preset_metadata\"\n>;\n\n/** The envelope constants come from the interface manifest's import/export spec. */\nexport interface AutomationExportFile {\n version: number;\n kind: string;\n spec: AutomationSpec;\n}\n\nexport interface AutomationsResponse {\n automations: Automation[];\n total: number;\n}\n\n/** Mirrors `RunStatus` in the automation service's OpenAPI schema. */\nexport enum AutomationRunStatus {\n PENDING = \"PENDING\",\n RUNNING = \"RUNNING\",\n COMPLETED = \"COMPLETED\",\n FAILED = \"FAILED\",\n CANCELLED = \"CANCELLED\",\n SKIPPED = \"SKIPPED\",\n}\n\nexport type AutomationTaskOutcomeStatus =\n | \"success\"\n | \"partial_success\"\n | \"blocked\"\n | \"failed\"\n | \"unknown\";\n\nexport interface AutomationFinishToolResponse {\n status?: AutomationTaskOutcomeStatus | string;\n outcome_summary?: string;\n [key: string]: unknown;\n}\n\nexport interface AutomationRunMetadata {\n finish_tool_response?: AutomationFinishToolResponse | string | null;\n [key: string]: unknown;\n}\n\nexport interface AutomationRunStatusDetail {\n phase?: string;\n kind?: string;\n detail?: string;\n formatted_detail?: string;\n transient?: boolean;\n source?: string;\n operation?: string;\n code?: string;\n status_code?: number;\n [key: string]: unknown;\n}\n\nexport interface AutomationRun {\n id: string;\n status: AutomationRunStatus;\n conversation_id: string | null;\n /**\n * ID of the bash command that ran the automation inside the agent-server\n * sandbox. Used to fetch run logs from\n * `/api/bash/bash_events/{bash_command_id}` and the matching\n * `BashOutput` events. Null when the run failed before a command was\n * dispatched (e.g. sandbox provisioning errors).\n */\n bash_command_id: string | null;\n error_detail: string | null;\n status_detail?: AutomationRunStatusDetail | null;\n run_metadata?: AutomationRunMetadata | null;\n /**\n * Accumulated LLM cost of the run in USD, reported by the SDK in the\n * completion callback. `null` means unknown — the run predates cost\n * tracking, or ended without a callback (cancelled, watchdog timeout).\n * Absent entirely when the automation service is older than the release\n * that added the field, hence optional.\n */\n cost?: number | null;\n /**\n * Machine-readable code for the run's current or last-known phase (e.g.\n * \"sandbox_provisioning\"). `null` means nothing has reported one; absent\n * entirely against an automation service that predates phase reporting.\n * Code and label are one value, always written together.\n */\n phase_code?: string | null;\n /**\n * Author-supplied description of the phase (at most 200 characters, no\n * control or separator characters, emoji and non-Latin text allowed).\n * Data, not translatable interface copy.\n */\n phase_label?: string | null;\n /** UTC datetime the phase was last written. Same nullability as `phase_code`. */\n phase_updated_at?: string | null;\n started_at: string;\n completed_at: string | null;\n}\n\nexport interface AutomationRunsResponse {\n runs: AutomationRun[];\n total: number;\n /**\n * Lifetime run counts by status, unaffected by pagination. Sparse — a\n * status with no runs has no key, so when the field is present a missing\n * key means zero. Absent entirely when the automation service is older\n * than the release that added it.\n */\n status_counts?: Partial<Record<AutomationRunStatus, number>>;\n}\n\nexport type ActivityLogExportFormat = \"json\" | \"csv\";\n\n/** Client-built Activity Log export row (from list runs + automation detail). */\nexport interface AutomationRunExportRow {\n run_id: string;\n automation_id: string;\n automation_name: string;\n trigger: AutomationTrigger | Record<string, unknown>;\n start_time: string | null;\n end_time: string | null;\n duration_seconds: number | null;\n status: AutomationRunStatus;\n conversation_id: string | null;\n conversation_url: string | null;\n error: string | null;\n /**\n * Accumulated LLM cost in USD, or null when unknown. Unlike\n * `AutomationRun[\"cost\"]` this is always present: the row normalizes a\n * missing field to null so every exported record has the same shape.\n */\n cost: number | null;\n /**\n * The raw `phase_code`, like `status`, falling back to `phase_label` for a\n * phase reported without a code. Null only when the run has no phase.\n */\n phase: string | null;\n}\n"],"mappings":";AA+EA,IAAY,IAAL,yBAAA,GAAA;QACL,EAAA,UAAA,WACA,EAAA,UAAA,WACA,EAAA,YAAA,aACA,EAAA,SAAA,UACA,EAAA,YAAA,aACA,EAAA,UAAA;AACF,EAAA,CAAA,CAAA"}
@@ -5,7 +5,7 @@ declare const contextMenuVariants: (props?: ({
5
5
  size?: "default" | "compact" | null | undefined;
6
6
  layout?: "vertical" | null | undefined;
7
7
  position?: "none" | "bottom" | "top" | null | undefined;
8
- spacing?: "default" | "none" | null | undefined;
8
+ spacing?: "none" | "default" | null | undefined;
9
9
  alignment?: "none" | "left" | "right" | null | undefined;
10
10
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
11
11
  interface ContextMenuProps {
@@ -1,2 +1,2 @@
1
- require("../_virtual/_rolldown/runtime.cjs");const e=require("../utils/utils.cjs");let t=require("react/jsx-runtime");function n({enabled:n,className:r}){return(0,t.jsx)(`span`,{"aria-hidden":`true`,className:e.cn(`relative inline-flex h-[22px] w-[40px] shrink-0 items-center rounded-full border`,`transition-colors duration-200 ease-in-out motion-reduce:transition-none`,n?`border-white bg-white`:`border-[var(--oh-border)] bg-surface-raised`,r),children:(0,t.jsx)(`span`,{className:e.cn(`inline-block size-4 rounded-full`,`transition-transform duration-200 ease-in-out motion-reduce:transition-none`,n?`translate-x-[21px] bg-base-secondary`:`translate-x-[2px] bg-[var(--oh-muted)]`)})})}exports.ToggleSwitchVisual=n;
1
+ require("../_virtual/_rolldown/runtime.cjs");const e=require("../utils/utils.cjs");let t=require("react/jsx-runtime");function n({enabled:n,size:r=`md`,className:i}){let a=r===`sm`;return(0,t.jsx)(`span`,{"aria-hidden":`true`,className:e.cn(`relative inline-flex shrink-0 items-center rounded-full`,`transition-colors duration-200 ease-in-out motion-reduce:transition-none`,a?`h-3.5 w-6 p-[3px]`:`h-[22px] w-[40px] border`,n?a?`bg-white`:`border-white bg-white`:a?`bg-[var(--oh-border)]`:`border-[var(--oh-border)] bg-surface-raised`,i),children:(0,t.jsx)(`span`,{className:e.cn(`inline-block rounded-full`,`transition-transform duration-200 ease-in-out motion-reduce:transition-none`,a?`size-2`:`size-4`,n?a?`translate-x-[10px] bg-base-secondary`:`translate-x-[21px] bg-base-secondary`:a?`translate-x-0 bg-[var(--oh-muted)]`:`translate-x-[2px] bg-[var(--oh-muted)]`)})})}exports.ToggleSwitchVisual=n;
2
2
  //# sourceMappingURL=toggle-switch.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"toggle-switch.cjs","names":[],"sources":["../../src/ui/toggle-switch.tsx"],"sourcesContent":["import { cn } from \"#/utils/utils\";\n\ninterface ToggleSwitchVisualProps {\n enabled: boolean;\n className?: string;\n}\n\n/** Shared toggle track + thumb used by settings labels and automation controls. */\nexport function ToggleSwitchVisual({\n enabled,\n className,\n}: ToggleSwitchVisualProps) {\n return (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"relative inline-flex h-[22px] w-[40px] shrink-0 items-center rounded-full border\",\n \"transition-colors duration-200 ease-in-out motion-reduce:transition-none\",\n enabled\n ? \"border-white bg-white\"\n : \"border-[var(--oh-border)] bg-surface-raised\",\n className,\n )}\n >\n <span\n className={cn(\n \"inline-block size-4 rounded-full\",\n \"transition-transform duration-200 ease-in-out motion-reduce:transition-none\",\n enabled\n ? \"translate-x-[21px] bg-base-secondary\"\n : \"translate-x-[2px] bg-[var(--oh-muted)]\",\n )}\n />\n </span>\n );\n}\n\ninterface ToggleSwitchProps {\n enabled: boolean;\n label: string;\n onToggle: () => void;\n className?: string;\n}\n\nexport function ToggleSwitch({\n enabled,\n label,\n onToggle,\n className,\n}: ToggleSwitchProps) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={enabled}\n aria-label={label}\n onClick={(e) => {\n e.stopPropagation();\n onToggle();\n }}\n className={cn(\"cursor-pointer\", className)}\n >\n <ToggleSwitchVisual enabled={enabled} />\n </button>\n );\n}\n"],"mappings":"sHAQA,SAAgB,EAAmB,CACjC,UACA,aAC0B,CAC1B,OACE,EAAA,EAAA,KAAC,OAAD,CACE,cAAY,OACZ,UAAW,EAAA,GACT,mFACA,2EACA,EACI,wBACA,8CACJ,CACF,YAEA,EAAA,EAAA,KAAC,OAAD,CACE,UAAW,EAAA,GACT,mCACA,8EACA,EACI,uCACA,wCACN,CACD,CAAA,CACG,CAAA,CAEV"}
1
+ {"version":3,"file":"toggle-switch.cjs","names":[],"sources":["../../src/ui/toggle-switch.tsx"],"sourcesContent":["import { cn } from \"#/utils/utils\";\n\nexport type ToggleSwitchSize = \"md\" | \"sm\";\n\ninterface ToggleSwitchVisualProps {\n enabled: boolean;\n /** `sm` is the compact menu-row pill; `md` is the settings/automation switch. */\n size?: ToggleSwitchSize;\n className?: string;\n}\n\n/** Shared toggle track + thumb used by settings labels and automation controls. */\nexport function ToggleSwitchVisual({\n enabled,\n size = \"md\",\n className,\n}: ToggleSwitchVisualProps) {\n const compact = size === \"sm\";\n return (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"relative inline-flex shrink-0 items-center rounded-full\",\n \"transition-colors duration-200 ease-in-out motion-reduce:transition-none\",\n compact ? \"h-3.5 w-6 p-[3px]\" : \"h-[22px] w-[40px] border\",\n enabled\n ? compact\n ? \"bg-white\"\n : \"border-white bg-white\"\n : compact\n ? \"bg-[var(--oh-border)]\"\n : \"border-[var(--oh-border)] bg-surface-raised\",\n className,\n )}\n >\n <span\n className={cn(\n \"inline-block rounded-full\",\n \"transition-transform duration-200 ease-in-out motion-reduce:transition-none\",\n compact ? \"size-2\" : \"size-4\",\n enabled\n ? compact\n ? \"translate-x-[10px] bg-base-secondary\"\n : \"translate-x-[21px] bg-base-secondary\"\n : compact\n ? \"translate-x-0 bg-[var(--oh-muted)]\"\n : \"translate-x-[2px] bg-[var(--oh-muted)]\",\n )}\n />\n </span>\n );\n}\n\ninterface ToggleSwitchProps {\n enabled: boolean;\n label: string;\n onToggle: () => void;\n className?: string;\n}\n\nexport function ToggleSwitch({\n enabled,\n label,\n onToggle,\n className,\n}: ToggleSwitchProps) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={enabled}\n aria-label={label}\n onClick={(e) => {\n e.stopPropagation();\n onToggle();\n }}\n className={cn(\"cursor-pointer\", className)}\n >\n <ToggleSwitchVisual enabled={enabled} />\n </button>\n );\n}\n"],"mappings":"sHAYA,SAAgB,EAAmB,CACjC,UACA,OAAO,KACP,aAC0B,CAC1B,IAAM,EAAU,IAAS,KACzB,OACE,EAAA,EAAA,KAAC,OAAD,CACE,cAAY,OACZ,UAAW,EAAA,GACT,0DACA,2EACA,EAAU,oBAAsB,2BAChC,EACI,EACE,WACA,wBACF,EACE,wBACA,8CACN,CACF,YAEA,EAAA,EAAA,KAAC,OAAD,CACE,UAAW,EAAA,GACT,4BACA,8EACA,EAAU,SAAW,SACrB,EACI,EACE,uCACA,uCACF,EACE,qCACA,wCACR,CACD,CAAA,CACG,CAAA,CAEV"}
@@ -1,9 +1,12 @@
1
+ export type ToggleSwitchSize = "md" | "sm";
1
2
  interface ToggleSwitchVisualProps {
2
3
  enabled: boolean;
4
+ /** `sm` is the compact menu-row pill; `md` is the settings/automation switch. */
5
+ size?: ToggleSwitchSize;
3
6
  className?: string;
4
7
  }
5
8
  /** Shared toggle track + thumb used by settings labels and automation controls. */
6
- export declare function ToggleSwitchVisual({ enabled, className, }: ToggleSwitchVisualProps): import("react").JSX.Element;
9
+ export declare function ToggleSwitchVisual({ enabled, size, className, }: ToggleSwitchVisualProps): import("react").JSX.Element;
7
10
  interface ToggleSwitchProps {
8
11
  enabled: boolean;
9
12
  label: string;
@@ -1,11 +1,12 @@
1
1
  import { cn as e } from "../utils/utils.js";
2
2
  import { jsx as t } from "react/jsx-runtime";
3
3
  //#region src/ui/toggle-switch.tsx
4
- function n({ enabled: n, className: r }) {
4
+ function n({ enabled: n, size: r = "md", className: i }) {
5
+ let a = r === "sm";
5
6
  return /* @__PURE__ */ t("span", {
6
7
  "aria-hidden": "true",
7
- className: e("relative inline-flex h-[22px] w-[40px] shrink-0 items-center rounded-full border", "transition-colors duration-200 ease-in-out motion-reduce:transition-none", n ? "border-white bg-white" : "border-[var(--oh-border)] bg-surface-raised", r),
8
- children: /* @__PURE__ */ t("span", { className: e("inline-block size-4 rounded-full", "transition-transform duration-200 ease-in-out motion-reduce:transition-none", n ? "translate-x-[21px] bg-base-secondary" : "translate-x-[2px] bg-[var(--oh-muted)]") })
8
+ className: e("relative inline-flex shrink-0 items-center rounded-full", "transition-colors duration-200 ease-in-out motion-reduce:transition-none", a ? "h-3.5 w-6 p-[3px]" : "h-[22px] w-[40px] border", n ? a ? "bg-white" : "border-white bg-white" : a ? "bg-[var(--oh-border)]" : "border-[var(--oh-border)] bg-surface-raised", i),
9
+ children: /* @__PURE__ */ t("span", { className: e("inline-block rounded-full", "transition-transform duration-200 ease-in-out motion-reduce:transition-none", a ? "size-2" : "size-4", n ? a ? "translate-x-[10px] bg-base-secondary" : "translate-x-[21px] bg-base-secondary" : a ? "translate-x-0 bg-[var(--oh-muted)]" : "translate-x-[2px] bg-[var(--oh-muted)]") })
9
10
  });
10
11
  }
11
12
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"toggle-switch.js","names":[],"sources":["../../src/ui/toggle-switch.tsx"],"sourcesContent":["import { cn } from \"#/utils/utils\";\n\ninterface ToggleSwitchVisualProps {\n enabled: boolean;\n className?: string;\n}\n\n/** Shared toggle track + thumb used by settings labels and automation controls. */\nexport function ToggleSwitchVisual({\n enabled,\n className,\n}: ToggleSwitchVisualProps) {\n return (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"relative inline-flex h-[22px] w-[40px] shrink-0 items-center rounded-full border\",\n \"transition-colors duration-200 ease-in-out motion-reduce:transition-none\",\n enabled\n ? \"border-white bg-white\"\n : \"border-[var(--oh-border)] bg-surface-raised\",\n className,\n )}\n >\n <span\n className={cn(\n \"inline-block size-4 rounded-full\",\n \"transition-transform duration-200 ease-in-out motion-reduce:transition-none\",\n enabled\n ? \"translate-x-[21px] bg-base-secondary\"\n : \"translate-x-[2px] bg-[var(--oh-muted)]\",\n )}\n />\n </span>\n );\n}\n\ninterface ToggleSwitchProps {\n enabled: boolean;\n label: string;\n onToggle: () => void;\n className?: string;\n}\n\nexport function ToggleSwitch({\n enabled,\n label,\n onToggle,\n className,\n}: ToggleSwitchProps) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={enabled}\n aria-label={label}\n onClick={(e) => {\n e.stopPropagation();\n onToggle();\n }}\n className={cn(\"cursor-pointer\", className)}\n >\n <ToggleSwitchVisual enabled={enabled} />\n </button>\n );\n}\n"],"mappings":";;;AAQA,SAAgB,EAAmB,EACjC,YACA,gBAC0B;CAC1B,OACE,kBAAC,QAAD;EACE,eAAY;EACZ,WAAW,EACT,oFACA,4EACA,IACI,0BACA,+CACJ,CACF;YAEA,kBAAC,QAAD,EACE,WAAW,EACT,oCACA,+EACA,IACI,yCACA,wCACN,EACD,CAAA;CACG,CAAA;AAEV"}
1
+ {"version":3,"file":"toggle-switch.js","names":[],"sources":["../../src/ui/toggle-switch.tsx"],"sourcesContent":["import { cn } from \"#/utils/utils\";\n\nexport type ToggleSwitchSize = \"md\" | \"sm\";\n\ninterface ToggleSwitchVisualProps {\n enabled: boolean;\n /** `sm` is the compact menu-row pill; `md` is the settings/automation switch. */\n size?: ToggleSwitchSize;\n className?: string;\n}\n\n/** Shared toggle track + thumb used by settings labels and automation controls. */\nexport function ToggleSwitchVisual({\n enabled,\n size = \"md\",\n className,\n}: ToggleSwitchVisualProps) {\n const compact = size === \"sm\";\n return (\n <span\n aria-hidden=\"true\"\n className={cn(\n \"relative inline-flex shrink-0 items-center rounded-full\",\n \"transition-colors duration-200 ease-in-out motion-reduce:transition-none\",\n compact ? \"h-3.5 w-6 p-[3px]\" : \"h-[22px] w-[40px] border\",\n enabled\n ? compact\n ? \"bg-white\"\n : \"border-white bg-white\"\n : compact\n ? \"bg-[var(--oh-border)]\"\n : \"border-[var(--oh-border)] bg-surface-raised\",\n className,\n )}\n >\n <span\n className={cn(\n \"inline-block rounded-full\",\n \"transition-transform duration-200 ease-in-out motion-reduce:transition-none\",\n compact ? \"size-2\" : \"size-4\",\n enabled\n ? compact\n ? \"translate-x-[10px] bg-base-secondary\"\n : \"translate-x-[21px] bg-base-secondary\"\n : compact\n ? \"translate-x-0 bg-[var(--oh-muted)]\"\n : \"translate-x-[2px] bg-[var(--oh-muted)]\",\n )}\n />\n </span>\n );\n}\n\ninterface ToggleSwitchProps {\n enabled: boolean;\n label: string;\n onToggle: () => void;\n className?: string;\n}\n\nexport function ToggleSwitch({\n enabled,\n label,\n onToggle,\n className,\n}: ToggleSwitchProps) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={enabled}\n aria-label={label}\n onClick={(e) => {\n e.stopPropagation();\n onToggle();\n }}\n className={cn(\"cursor-pointer\", className)}\n >\n <ToggleSwitchVisual enabled={enabled} />\n </button>\n );\n}\n"],"mappings":";;;AAYA,SAAgB,EAAmB,EACjC,YACA,UAAO,MACP,gBAC0B;CAC1B,IAAM,IAAU,MAAS;CACzB,OACE,kBAAC,QAAD;EACE,eAAY;EACZ,WAAW,EACT,2DACA,4EACA,IAAU,sBAAsB,4BAChC,IACI,IACE,aACA,0BACF,IACE,0BACA,+CACN,CACF;YAEA,kBAAC,QAAD,EACE,WAAW,EACT,6BACA,+EACA,IAAU,WAAW,UACrB,IACI,IACE,yCACA,yCACF,IACE,uCACA,wCACR,EACD,CAAA;CACG,CAAA;AAEV"}
@@ -1,2 +1,2 @@
1
- require("../_virtual/_rolldown/runtime.cjs");const e=require("../node_modules/@openhands/extensions/skills/index.cjs"),t=require("../components/features/manifest/manifest-icons.cjs");var n=new Map(e.default.map(e=>[e.name,e]));function r(e){let n=e.icon;return n?t.MANIFEST_ICON_BY_SLUG[n]??null:null}function i(e){return Object.keys(e.requires.integrations)}function a(e){return Object.entries(e.requires.integrations).filter(([,e])=>e.required!==!1).map(([e])=>e)}function o(e){return n.get(e.skill??e.id)?.triggers[0]??null}function s(e){return o(e)??`Set up the ${e.name} automation`}exports.getAutomationIcon=r,exports.getAutomationLaunchPrompt=s,exports.getIntegrationIds=i,exports.getRequiredIntegrationIds=a;
1
+ require("../_virtual/_rolldown/runtime.cjs");const e=require("../node_modules/@openhands/extensions/skills/index.cjs"),t=require("../node_modules/@openhands/extensions/automations/index.cjs"),n=require("../components/features/manifest/manifest-icons.cjs"),r=require("../manifests/manifest-template.cjs");var i=new Map(e.default.map(e=>[e.name,e]));function a(e){let t=e.icon;return t?n.MANIFEST_ICON_BY_SLUG[t]??null:null}function o(e){return Object.keys(e.requires.integrations)}function s(e){return Object.entries(e.requires.integrations).filter(([,e])=>e.required!==!1).map(([e])=>e)}function c(e){return i.get(e.skill??e.id)?.triggers[0]??null}function l(e){return c(e)??`Set up the ${e.name} automation`}var u=new Map(t.default.map(e=>[e.id,e])),d=/<[A-Za-z/!]/,f=/\{\{(?!count\}\})/,p=`{{count}}`;function m(e){return typeof e==`string`&&e.length>0&&!d.test(e)&&!f.test(e)}function h(e){let{impact:t}=e;if(typeof t!=`object`||!t)return null;let{basis:n,one:r,other:i}=t;return n!==`completed-runs`||!m(r)||!m(i)||!i.includes(p)?null:{one:r,other:i}}function g(e){let t=e.preset_metadata;if(typeof t!=`object`||!t)return null;let{template:n}=t;if(typeof n!=`object`||!n)return null;let{id:r}=n;return typeof r!=`string`||r.length===0?null:u.get(r)??null}function _(e,t){if(t===null||t<1)return null;let n=g(e);if(!n)return null;let i=h(n);return i?r.interpolateValues(t===1?i.one:i.other,{count:t.toLocaleString()}):null}exports.getAutomationIcon=a,exports.getAutomationLaunchPrompt=l,exports.getIntegrationIds=o,exports.getRequiredIntegrationIds=s,exports.resolveAutomationImpactStatement=_;
2
2
  //# sourceMappingURL=automation-catalog.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"automation-catalog.cjs","names":[],"sources":["../../src/utils/automation-catalog.ts"],"sourcesContent":["import type { RecommendedAutomation } from \"@openhands/extensions/automations\";\nimport {\n SKILLS_CATALOG,\n type SkillCatalogEntry,\n} from \"@openhands/extensions/skills\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { MANIFEST_ICON_BY_SLUG } from \"#/components/features/manifest/manifest-icons\";\n\n/**\n * Reading a published automation catalog entry.\n *\n * The catalog states each thing once and leaves the rest to be derived, so an\n * entry no longer carries its own launch command or a flat list of required\n * integration ids. This module is the single place that performs those\n * derivations, so the components consuming the catalog stay unaware of how it\n * is shaped.\n */\n\nconst SKILL_BY_NAME = new Map<string, SkillCatalogEntry>(\n SKILLS_CATALOG.map((skill) => [skill.name, skill]),\n);\n\n/**\n * The glyph a card shows in place of its integration logos, or null when it\n * has none to show and the logos speak for it.\n *\n * An entry naming the service it talks to is recognised by that service's\n * logo; one whose identity is the work itself declares a slug instead. The\n * lookup is a guard as much as a mapping — the catalog is published elsewhere,\n * so a slug this host has no artwork for falls back rather than rendering\n * nothing.\n */\nexport function getAutomationIcon(\n automation: RecommendedAutomation,\n): LucideIcon | null {\n const slug = automation.icon;\n if (!slug) return null;\n return (\n (MANIFEST_ICON_BY_SLUG as Record<string, LucideIcon | undefined>)[slug] ??\n null\n );\n}\n\n/** Every integration the entry declares, in declaration order. */\nexport function getIntegrationIds(automation: RecommendedAutomation): string[] {\n return Object.keys(automation.requires.integrations);\n}\n\n/**\n * The integrations that gate this automation. One marked `required: false` can\n * be connected later, during setup, so it is still worth showing on the card\n * but must never stand between the user and a launch.\n */\nexport function getRequiredIntegrationIds(\n automation: RecommendedAutomation,\n): string[] {\n return Object.entries(automation.requires.integrations)\n .filter(([, requirement]) => requirement.required !== false)\n .map(([id]) => id);\n}\n\n/**\n * The command that invokes this automation's skill, or null when that skill is\n * invoked by description instead.\n *\n * The command is declared once, in the owning skill's own `triggers`; the\n * catalog names that skill only where it differs from the entry id.\n */\nexport function findAutomationCommand(\n automation: Pick<RecommendedAutomation, \"id\" | \"skill\">,\n): string | null {\n const skill = SKILL_BY_NAME.get(automation.skill ?? automation.id);\n return skill?.triggers[0] ?? null;\n}\n\n/**\n * What launching an automation card hands to the agent.\n *\n * The resolved command is passed through as-is: API routing (host, auth) is\n * discovered by the agent at runtime from `<RUNTIME_SERVICES>` in the system\n * prompt, and the skills themselves carry the instructions for reading that\n * block. An automation whose skill declares no command has the request spelled\n * out instead. Both are instructions to the agent rather than user-facing UI\n * copy, so they are intentionally in English and not localized.\n */\nexport function getAutomationLaunchPrompt(\n automation: RecommendedAutomation,\n): string {\n return (\n findAutomationCommand(automation) ??\n `Set up the ${automation.name} automation`\n );\n}\n"],"mappings":"uLAkBA,IAAM,EAAgB,IAAI,IACxB,EAAA,QAAe,IAAK,GAAU,CAAC,EAAM,KAAM,CAAK,CAAC,CACnD,EAYA,SAAgB,EACd,EACmB,CACnB,IAAM,EAAO,EAAW,KAExB,OADK,EAEF,EAAA,sBAAiE,IAClE,KAHgB,IAKpB,CAGA,SAAgB,EAAkB,EAA6C,CAC7E,OAAO,OAAO,KAAK,EAAW,SAAS,YAAY,CACrD,CAOA,SAAgB,EACd,EACU,CACV,OAAO,OAAO,QAAQ,EAAW,SAAS,YAAY,EACnD,QAAQ,EAAG,KAAiB,EAAY,WAAa,EAAK,EAC1D,KAAK,CAAC,KAAQ,CAAE,CACrB,CASA,SAAgB,EACd,EACe,CAEf,OADc,EAAc,IAAI,EAAW,OAAS,EAAW,EACxD,GAAO,SAAS,IAAM,IAC/B,CAYA,SAAgB,EACd,EACQ,CACR,OACE,EAAsB,CAAU,GAChC,cAAc,EAAW,KAAK,YAElC"}
1
+ {"version":3,"file":"automation-catalog.cjs","names":[],"sources":["../../src/utils/automation-catalog.ts"],"sourcesContent":["import {\n AUTOMATION_CATALOG,\n type RecommendedAutomation,\n} from \"@openhands/extensions/automations\";\nimport {\n SKILLS_CATALOG,\n type SkillCatalogEntry,\n} from \"@openhands/extensions/skills\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { MANIFEST_ICON_BY_SLUG } from \"#/components/features/manifest/manifest-icons\";\nimport { interpolateValues } from \"#/manifests/manifest-template\";\nimport type { Automation } from \"#/types/automation\";\n\n/**\n * Reading a published automation catalog entry.\n *\n * The catalog states each thing once and leaves the rest to be derived, so an\n * entry no longer carries its own launch command or a flat list of required\n * integration ids. This module is the single place that performs those\n * derivations, so the components consuming the catalog stay unaware of how it\n * is shaped.\n */\n\nconst SKILL_BY_NAME = new Map<string, SkillCatalogEntry>(\n SKILLS_CATALOG.map((skill) => [skill.name, skill]),\n);\n\n/**\n * The glyph a card shows in place of its integration logos, or null when it\n * has none to show and the logos speak for it.\n *\n * An entry naming the service it talks to is recognised by that service's\n * logo; one whose identity is the work itself declares a slug instead. The\n * lookup is a guard as much as a mapping — the catalog is published elsewhere,\n * so a slug this host has no artwork for falls back rather than rendering\n * nothing.\n */\nexport function getAutomationIcon(\n automation: RecommendedAutomation,\n): LucideIcon | null {\n const slug = automation.icon;\n if (!slug) return null;\n return (\n (MANIFEST_ICON_BY_SLUG as Record<string, LucideIcon | undefined>)[slug] ??\n null\n );\n}\n\n/** Every integration the entry declares, in declaration order. */\nexport function getIntegrationIds(automation: RecommendedAutomation): string[] {\n return Object.keys(automation.requires.integrations);\n}\n\n/**\n * The integrations that gate this automation. One marked `required: false` can\n * be connected later, during setup, so it is still worth showing on the card\n * but must never stand between the user and a launch.\n */\nexport function getRequiredIntegrationIds(\n automation: RecommendedAutomation,\n): string[] {\n return Object.entries(automation.requires.integrations)\n .filter(([, requirement]) => requirement.required !== false)\n .map(([id]) => id);\n}\n\n/**\n * The command that invokes this automation's skill, or null when that skill is\n * invoked by description instead.\n *\n * The command is declared once, in the owning skill's own `triggers`; the\n * catalog names that skill only where it differs from the entry id.\n */\nexport function findAutomationCommand(\n automation: Pick<RecommendedAutomation, \"id\" | \"skill\">,\n): string | null {\n const skill = SKILL_BY_NAME.get(automation.skill ?? automation.id);\n return skill?.triggers[0] ?? null;\n}\n\n/**\n * What launching an automation card hands to the agent.\n *\n * The resolved command is passed through as-is: API routing (host, auth) is\n * discovered by the agent at runtime from `<RUNTIME_SERVICES>` in the system\n * prompt, and the skills themselves carry the instructions for reading that\n * block. An automation whose skill declares no command has the request spelled\n * out instead. Both are instructions to the agent rather than user-facing UI\n * copy, so they are intentionally in English and not localized.\n */\nexport function getAutomationLaunchPrompt(\n automation: RecommendedAutomation,\n): string {\n return (\n findAutomationCommand(automation) ??\n `Set up the ${automation.name} automation`\n );\n}\n\nconst CATALOG_ENTRY_BY_ID = new Map<string, RecommendedAutomation>(\n AUTOMATION_CATALOG.map((entry) => [entry.id, entry]),\n);\n\n/** Rejects markup the same way the catalog schema's copy rule does. */\nconst MARKUP_PATTERN = /<[A-Za-z/!]/;\n\n/** Every `{{` an impact phrase opens must be the count placeholder. */\nconst FOREIGN_PLACEHOLDER_PATTERN = /\\{\\{(?!count\\}\\})/;\n\nconst COUNT_PLACEHOLDER = \"{{count}}\";\n\ninterface AutomationImpactCopy {\n one: string;\n other: string;\n}\n\nfunction isImpactPhrase(value: unknown): value is string {\n return (\n typeof value === \"string\" &&\n value.length > 0 &&\n !MARKUP_PATTERN.test(value) &&\n !FOREIGN_PLACEHOLDER_PATTERN.test(value)\n );\n}\n\n/**\n * The entry's `impact` value statement, or null when it declares none this\n * host can honor. The catalog is published elsewhere, so the field is read\n * off the raw entry and validated here rather than trusted from the package\n * types — which also keeps this module compiling against a pinned package\n * that predates the field. A basis other than `completed-runs` is a counter\n * this host does not know how to compute, so it renders nothing rather than\n * a number the phrase was not written for.\n */\nfunction readImpactCopy(\n entry: RecommendedAutomation,\n): AutomationImpactCopy | null {\n const { impact } = entry as unknown as Record<string, unknown>;\n if (typeof impact !== \"object\" || impact === null) return null;\n const { basis, one, other } = impact as Record<string, unknown>;\n if (basis !== \"completed-runs\") return null;\n if (!isImpactPhrase(one) || !isImpactPhrase(other)) return null;\n if (!other.includes(COUNT_PLACEHOLDER)) return null;\n return { one, other };\n}\n\n/**\n * The catalog entry an installed automation was created from, via the\n * `template` provenance its setup stored — the only join back to the catalog.\n * Null for automations without provenance: imports, agent-built ones, and\n * entries whose setup publishes no version.\n */\nfunction getAutomationTemplateEntry(\n automation: Automation,\n): RecommendedAutomation | null {\n const metadata = automation.preset_metadata;\n if (typeof metadata !== \"object\" || metadata === null) return null;\n const { template } = metadata as Record<string, unknown>;\n if (typeof template !== \"object\" || template === null) return null;\n const { id } = template as Record<string, unknown>;\n if (typeof id !== \"string\" || id.length === 0) return null;\n return CATALOG_ENTRY_BY_ID.get(id) ?? null;\n}\n\n/**\n * The value statement an automation card shows for its completed runs, or\n * null when there is nothing defensible to say: no template provenance, no\n * honored `impact` declaration, an unknown count (older service with more\n * history than the sample), or a count of zero — absence, never a zero-value\n * claim. Provenance persists across prompt edits, so a reworked automation\n * keeps its template's phrase; the phrases are run-shaped, which keeps them\n * true for as long as the automation runs at all.\n */\nexport function resolveAutomationImpactStatement(\n automation: Automation,\n completedTotal: number | null,\n): string | null {\n if (completedTotal === null || completedTotal < 1) return null;\n const entry = getAutomationTemplateEntry(automation);\n if (!entry) return null;\n const copy = readImpactCopy(entry);\n if (!copy) return null;\n const phrase = completedTotal === 1 ? copy.one : copy.other;\n return interpolateValues(phrase, { count: completedTotal.toLocaleString() });\n}\n"],"mappings":"gTAuBA,IAAM,EAAgB,IAAI,IACxB,EAAA,QAAe,IAAK,GAAU,CAAC,EAAM,KAAM,CAAK,CAAC,CACnD,EAYA,SAAgB,EACd,EACmB,CACnB,IAAM,EAAO,EAAW,KAExB,OADK,EAEF,EAAA,sBAAiE,IAClE,KAHgB,IAKpB,CAGA,SAAgB,EAAkB,EAA6C,CAC7E,OAAO,OAAO,KAAK,EAAW,SAAS,YAAY,CACrD,CAOA,SAAgB,EACd,EACU,CACV,OAAO,OAAO,QAAQ,EAAW,SAAS,YAAY,EACnD,QAAQ,EAAG,KAAiB,EAAY,WAAa,EAAK,EAC1D,KAAK,CAAC,KAAQ,CAAE,CACrB,CASA,SAAgB,EACd,EACe,CAEf,OADc,EAAc,IAAI,EAAW,OAAS,EAAW,EACxD,GAAO,SAAS,IAAM,IAC/B,CAYA,SAAgB,EACd,EACQ,CACR,OACE,EAAsB,CAAU,GAChC,cAAc,EAAW,KAAK,YAElC,CAEA,IAAM,EAAsB,IAAI,IAC9B,EAAA,QAAmB,IAAK,GAAU,CAAC,EAAM,GAAI,CAAK,CAAC,CACrD,EAGM,EAAiB,cAGjB,EAA8B,oBAE9B,EAAoB,YAO1B,SAAS,EAAe,EAAiC,CACvD,OACE,OAAO,GAAU,UACjB,EAAM,OAAS,GACf,CAAC,EAAe,KAAK,CAAK,GAC1B,CAAC,EAA4B,KAAK,CAAK,CAE3C,CAWA,SAAS,EACP,EAC6B,CAC7B,GAAM,CAAE,UAAW,EACnB,GAAI,OAAO,GAAW,WAAY,EAAiB,OAAO,KAC1D,GAAM,CAAE,QAAO,MAAK,SAAU,EAI9B,OAHI,IAAU,kBACV,CAAC,EAAe,CAAG,GAAK,CAAC,EAAe,CAAK,GAC7C,CAAC,EAAM,SAAS,CAAiB,EAAU,KACxC,CAAE,MAAK,OAAM,CACtB,CAQA,SAAS,EACP,EAC8B,CAC9B,IAAM,EAAW,EAAW,gBAC5B,GAAI,OAAO,GAAa,WAAY,EAAmB,OAAO,KAC9D,GAAM,CAAE,YAAa,EACrB,GAAI,OAAO,GAAa,WAAY,EAAmB,OAAO,KAC9D,GAAM,CAAE,MAAO,EAEf,OADI,OAAO,GAAO,UAAY,EAAG,SAAW,EAAU,KAC/C,EAAoB,IAAI,CAAE,GAAK,IACxC,CAWA,SAAgB,EACd,EACA,EACe,CACf,GAAI,IAAmB,MAAQ,EAAiB,EAAG,OAAO,KAC1D,IAAM,EAAQ,EAA2B,CAAU,EACnD,GAAI,CAAC,EAAO,OAAO,KACnB,IAAM,EAAO,EAAe,CAAK,EAGjC,OAFK,EAEE,EAAA,kBADQ,IAAmB,EAAI,EAAK,IAAM,EAAK,MACrB,CAAE,MAAO,EAAe,eAAe,CAAE,CAAC,EAFzD,IAGpB"}
@@ -1,5 +1,6 @@
1
- import type { RecommendedAutomation } from "@openhands/extensions/automations";
1
+ import { type RecommendedAutomation } from "@openhands/extensions/automations";
2
2
  import type { LucideIcon } from "lucide-react";
3
+ import type { Automation } from "#/types/automation";
3
4
  /**
4
5
  * The glyph a card shows in place of its integration logos, or null when it
5
6
  * has none to show and the logos speak for it.
@@ -38,3 +39,13 @@ export declare function findAutomationCommand(automation: Pick<RecommendedAutoma
38
39
  * copy, so they are intentionally in English and not localized.
39
40
  */
40
41
  export declare function getAutomationLaunchPrompt(automation: RecommendedAutomation): string;
42
+ /**
43
+ * The value statement an automation card shows for its completed runs, or
44
+ * null when there is nothing defensible to say: no template provenance, no
45
+ * honored `impact` declaration, an unknown count (older service with more
46
+ * history than the sample), or a count of zero — absence, never a zero-value
47
+ * claim. Provenance persists across prompt edits, so a reworked automation
48
+ * keeps its template's phrase; the phrases are run-shaped, which keeps them
49
+ * true for as long as the automation runs at all.
50
+ */
51
+ export declare function resolveAutomationImpactStatement(automation: Automation, completedTotal: number | null): string | null;
@@ -1,24 +1,54 @@
1
1
  import e from "../node_modules/@openhands/extensions/skills/index.js";
2
- import { MANIFEST_ICON_BY_SLUG as t } from "../components/features/manifest/manifest-icons.js";
2
+ import t from "../node_modules/@openhands/extensions/automations/index.js";
3
+ import { MANIFEST_ICON_BY_SLUG as n } from "../components/features/manifest/manifest-icons.js";
4
+ import { interpolateValues as r } from "../manifests/manifest-template.js";
3
5
  //#region src/utils/automation-catalog.ts
4
- var n = new Map(e.map((e) => [e.name, e]));
5
- function r(e) {
6
- let n = e.icon;
7
- return n ? t[n] ?? null : null;
6
+ var i = new Map(e.map((e) => [e.name, e]));
7
+ function a(e) {
8
+ let t = e.icon;
9
+ return t ? n[t] ?? null : null;
8
10
  }
9
- function i(e) {
11
+ function o(e) {
10
12
  return Object.keys(e.requires.integrations);
11
13
  }
12
- function a(e) {
14
+ function s(e) {
13
15
  return Object.entries(e.requires.integrations).filter(([, e]) => e.required !== !1).map(([e]) => e);
14
16
  }
15
- function o(e) {
16
- return n.get(e.skill ?? e.id)?.triggers[0] ?? null;
17
+ function c(e) {
18
+ return i.get(e.skill ?? e.id)?.triggers[0] ?? null;
17
19
  }
18
- function s(e) {
19
- return o(e) ?? `Set up the ${e.name} automation`;
20
+ function l(e) {
21
+ return c(e) ?? `Set up the ${e.name} automation`;
22
+ }
23
+ var u = new Map(t.map((e) => [e.id, e])), d = /<[A-Za-z/!]/, f = /\{\{(?!count\}\})/, p = "{{count}}";
24
+ function m(e) {
25
+ return typeof e == "string" && e.length > 0 && !d.test(e) && !f.test(e);
26
+ }
27
+ function h(e) {
28
+ let { impact: t } = e;
29
+ if (typeof t != "object" || !t) return null;
30
+ let { basis: n, one: r, other: i } = t;
31
+ return n !== "completed-runs" || !m(r) || !m(i) || !i.includes(p) ? null : {
32
+ one: r,
33
+ other: i
34
+ };
35
+ }
36
+ function g(e) {
37
+ let t = e.preset_metadata;
38
+ if (typeof t != "object" || !t) return null;
39
+ let { template: n } = t;
40
+ if (typeof n != "object" || !n) return null;
41
+ let { id: r } = n;
42
+ return typeof r != "string" || r.length === 0 ? null : u.get(r) ?? null;
43
+ }
44
+ function _(e, t) {
45
+ if (t === null || t < 1) return null;
46
+ let n = g(e);
47
+ if (!n) return null;
48
+ let i = h(n);
49
+ return i ? r(t === 1 ? i.one : i.other, { count: t.toLocaleString() }) : null;
20
50
  }
21
51
  //#endregion
22
- export { r as getAutomationIcon, s as getAutomationLaunchPrompt, i as getIntegrationIds, a as getRequiredIntegrationIds };
52
+ export { a as getAutomationIcon, l as getAutomationLaunchPrompt, o as getIntegrationIds, s as getRequiredIntegrationIds, _ as resolveAutomationImpactStatement };
23
53
 
24
54
  //# sourceMappingURL=automation-catalog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"automation-catalog.js","names":[],"sources":["../../src/utils/automation-catalog.ts"],"sourcesContent":["import type { RecommendedAutomation } from \"@openhands/extensions/automations\";\nimport {\n SKILLS_CATALOG,\n type SkillCatalogEntry,\n} from \"@openhands/extensions/skills\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { MANIFEST_ICON_BY_SLUG } from \"#/components/features/manifest/manifest-icons\";\n\n/**\n * Reading a published automation catalog entry.\n *\n * The catalog states each thing once and leaves the rest to be derived, so an\n * entry no longer carries its own launch command or a flat list of required\n * integration ids. This module is the single place that performs those\n * derivations, so the components consuming the catalog stay unaware of how it\n * is shaped.\n */\n\nconst SKILL_BY_NAME = new Map<string, SkillCatalogEntry>(\n SKILLS_CATALOG.map((skill) => [skill.name, skill]),\n);\n\n/**\n * The glyph a card shows in place of its integration logos, or null when it\n * has none to show and the logos speak for it.\n *\n * An entry naming the service it talks to is recognised by that service's\n * logo; one whose identity is the work itself declares a slug instead. The\n * lookup is a guard as much as a mapping — the catalog is published elsewhere,\n * so a slug this host has no artwork for falls back rather than rendering\n * nothing.\n */\nexport function getAutomationIcon(\n automation: RecommendedAutomation,\n): LucideIcon | null {\n const slug = automation.icon;\n if (!slug) return null;\n return (\n (MANIFEST_ICON_BY_SLUG as Record<string, LucideIcon | undefined>)[slug] ??\n null\n );\n}\n\n/** Every integration the entry declares, in declaration order. */\nexport function getIntegrationIds(automation: RecommendedAutomation): string[] {\n return Object.keys(automation.requires.integrations);\n}\n\n/**\n * The integrations that gate this automation. One marked `required: false` can\n * be connected later, during setup, so it is still worth showing on the card\n * but must never stand between the user and a launch.\n */\nexport function getRequiredIntegrationIds(\n automation: RecommendedAutomation,\n): string[] {\n return Object.entries(automation.requires.integrations)\n .filter(([, requirement]) => requirement.required !== false)\n .map(([id]) => id);\n}\n\n/**\n * The command that invokes this automation's skill, or null when that skill is\n * invoked by description instead.\n *\n * The command is declared once, in the owning skill's own `triggers`; the\n * catalog names that skill only where it differs from the entry id.\n */\nexport function findAutomationCommand(\n automation: Pick<RecommendedAutomation, \"id\" | \"skill\">,\n): string | null {\n const skill = SKILL_BY_NAME.get(automation.skill ?? automation.id);\n return skill?.triggers[0] ?? null;\n}\n\n/**\n * What launching an automation card hands to the agent.\n *\n * The resolved command is passed through as-is: API routing (host, auth) is\n * discovered by the agent at runtime from `<RUNTIME_SERVICES>` in the system\n * prompt, and the skills themselves carry the instructions for reading that\n * block. An automation whose skill declares no command has the request spelled\n * out instead. Both are instructions to the agent rather than user-facing UI\n * copy, so they are intentionally in English and not localized.\n */\nexport function getAutomationLaunchPrompt(\n automation: RecommendedAutomation,\n): string {\n return (\n findAutomationCommand(automation) ??\n `Set up the ${automation.name} automation`\n );\n}\n"],"mappings":";;;AAkBA,IAAM,IAAgB,IAAI,IACxB,EAAe,KAAK,MAAU,CAAC,EAAM,MAAM,CAAK,CAAC,CACnD;AAYA,SAAgB,EACd,GACmB;CACnB,IAAM,IAAO,EAAW;CAExB,OADK,IAEF,EAAiE,MAClE,OAHgB;AAKpB;AAGA,SAAgB,EAAkB,GAA6C;CAC7E,OAAO,OAAO,KAAK,EAAW,SAAS,YAAY;AACrD;AAOA,SAAgB,EACd,GACU;CACV,OAAO,OAAO,QAAQ,EAAW,SAAS,YAAY,EACnD,QAAQ,GAAG,OAAiB,EAAY,aAAa,EAAK,EAC1D,KAAK,CAAC,OAAQ,CAAE;AACrB;AASA,SAAgB,EACd,GACe;CAEf,OADc,EAAc,IAAI,EAAW,SAAS,EAAW,EACxD,GAAO,SAAS,MAAM;AAC/B;AAYA,SAAgB,EACd,GACQ;CACR,OACE,EAAsB,CAAU,KAChC,cAAc,EAAW,KAAK;AAElC"}
1
+ {"version":3,"file":"automation-catalog.js","names":[],"sources":["../../src/utils/automation-catalog.ts"],"sourcesContent":["import {\n AUTOMATION_CATALOG,\n type RecommendedAutomation,\n} from \"@openhands/extensions/automations\";\nimport {\n SKILLS_CATALOG,\n type SkillCatalogEntry,\n} from \"@openhands/extensions/skills\";\nimport type { LucideIcon } from \"lucide-react\";\nimport { MANIFEST_ICON_BY_SLUG } from \"#/components/features/manifest/manifest-icons\";\nimport { interpolateValues } from \"#/manifests/manifest-template\";\nimport type { Automation } from \"#/types/automation\";\n\n/**\n * Reading a published automation catalog entry.\n *\n * The catalog states each thing once and leaves the rest to be derived, so an\n * entry no longer carries its own launch command or a flat list of required\n * integration ids. This module is the single place that performs those\n * derivations, so the components consuming the catalog stay unaware of how it\n * is shaped.\n */\n\nconst SKILL_BY_NAME = new Map<string, SkillCatalogEntry>(\n SKILLS_CATALOG.map((skill) => [skill.name, skill]),\n);\n\n/**\n * The glyph a card shows in place of its integration logos, or null when it\n * has none to show and the logos speak for it.\n *\n * An entry naming the service it talks to is recognised by that service's\n * logo; one whose identity is the work itself declares a slug instead. The\n * lookup is a guard as much as a mapping — the catalog is published elsewhere,\n * so a slug this host has no artwork for falls back rather than rendering\n * nothing.\n */\nexport function getAutomationIcon(\n automation: RecommendedAutomation,\n): LucideIcon | null {\n const slug = automation.icon;\n if (!slug) return null;\n return (\n (MANIFEST_ICON_BY_SLUG as Record<string, LucideIcon | undefined>)[slug] ??\n null\n );\n}\n\n/** Every integration the entry declares, in declaration order. */\nexport function getIntegrationIds(automation: RecommendedAutomation): string[] {\n return Object.keys(automation.requires.integrations);\n}\n\n/**\n * The integrations that gate this automation. One marked `required: false` can\n * be connected later, during setup, so it is still worth showing on the card\n * but must never stand between the user and a launch.\n */\nexport function getRequiredIntegrationIds(\n automation: RecommendedAutomation,\n): string[] {\n return Object.entries(automation.requires.integrations)\n .filter(([, requirement]) => requirement.required !== false)\n .map(([id]) => id);\n}\n\n/**\n * The command that invokes this automation's skill, or null when that skill is\n * invoked by description instead.\n *\n * The command is declared once, in the owning skill's own `triggers`; the\n * catalog names that skill only where it differs from the entry id.\n */\nexport function findAutomationCommand(\n automation: Pick<RecommendedAutomation, \"id\" | \"skill\">,\n): string | null {\n const skill = SKILL_BY_NAME.get(automation.skill ?? automation.id);\n return skill?.triggers[0] ?? null;\n}\n\n/**\n * What launching an automation card hands to the agent.\n *\n * The resolved command is passed through as-is: API routing (host, auth) is\n * discovered by the agent at runtime from `<RUNTIME_SERVICES>` in the system\n * prompt, and the skills themselves carry the instructions for reading that\n * block. An automation whose skill declares no command has the request spelled\n * out instead. Both are instructions to the agent rather than user-facing UI\n * copy, so they are intentionally in English and not localized.\n */\nexport function getAutomationLaunchPrompt(\n automation: RecommendedAutomation,\n): string {\n return (\n findAutomationCommand(automation) ??\n `Set up the ${automation.name} automation`\n );\n}\n\nconst CATALOG_ENTRY_BY_ID = new Map<string, RecommendedAutomation>(\n AUTOMATION_CATALOG.map((entry) => [entry.id, entry]),\n);\n\n/** Rejects markup the same way the catalog schema's copy rule does. */\nconst MARKUP_PATTERN = /<[A-Za-z/!]/;\n\n/** Every `{{` an impact phrase opens must be the count placeholder. */\nconst FOREIGN_PLACEHOLDER_PATTERN = /\\{\\{(?!count\\}\\})/;\n\nconst COUNT_PLACEHOLDER = \"{{count}}\";\n\ninterface AutomationImpactCopy {\n one: string;\n other: string;\n}\n\nfunction isImpactPhrase(value: unknown): value is string {\n return (\n typeof value === \"string\" &&\n value.length > 0 &&\n !MARKUP_PATTERN.test(value) &&\n !FOREIGN_PLACEHOLDER_PATTERN.test(value)\n );\n}\n\n/**\n * The entry's `impact` value statement, or null when it declares none this\n * host can honor. The catalog is published elsewhere, so the field is read\n * off the raw entry and validated here rather than trusted from the package\n * types — which also keeps this module compiling against a pinned package\n * that predates the field. A basis other than `completed-runs` is a counter\n * this host does not know how to compute, so it renders nothing rather than\n * a number the phrase was not written for.\n */\nfunction readImpactCopy(\n entry: RecommendedAutomation,\n): AutomationImpactCopy | null {\n const { impact } = entry as unknown as Record<string, unknown>;\n if (typeof impact !== \"object\" || impact === null) return null;\n const { basis, one, other } = impact as Record<string, unknown>;\n if (basis !== \"completed-runs\") return null;\n if (!isImpactPhrase(one) || !isImpactPhrase(other)) return null;\n if (!other.includes(COUNT_PLACEHOLDER)) return null;\n return { one, other };\n}\n\n/**\n * The catalog entry an installed automation was created from, via the\n * `template` provenance its setup stored — the only join back to the catalog.\n * Null for automations without provenance: imports, agent-built ones, and\n * entries whose setup publishes no version.\n */\nfunction getAutomationTemplateEntry(\n automation: Automation,\n): RecommendedAutomation | null {\n const metadata = automation.preset_metadata;\n if (typeof metadata !== \"object\" || metadata === null) return null;\n const { template } = metadata as Record<string, unknown>;\n if (typeof template !== \"object\" || template === null) return null;\n const { id } = template as Record<string, unknown>;\n if (typeof id !== \"string\" || id.length === 0) return null;\n return CATALOG_ENTRY_BY_ID.get(id) ?? null;\n}\n\n/**\n * The value statement an automation card shows for its completed runs, or\n * null when there is nothing defensible to say: no template provenance, no\n * honored `impact` declaration, an unknown count (older service with more\n * history than the sample), or a count of zero — absence, never a zero-value\n * claim. Provenance persists across prompt edits, so a reworked automation\n * keeps its template's phrase; the phrases are run-shaped, which keeps them\n * true for as long as the automation runs at all.\n */\nexport function resolveAutomationImpactStatement(\n automation: Automation,\n completedTotal: number | null,\n): string | null {\n if (completedTotal === null || completedTotal < 1) return null;\n const entry = getAutomationTemplateEntry(automation);\n if (!entry) return null;\n const copy = readImpactCopy(entry);\n if (!copy) return null;\n const phrase = completedTotal === 1 ? copy.one : copy.other;\n return interpolateValues(phrase, { count: completedTotal.toLocaleString() });\n}\n"],"mappings":";;;;;AAuBA,IAAM,IAAgB,IAAI,IACxB,EAAe,KAAK,MAAU,CAAC,EAAM,MAAM,CAAK,CAAC,CACnD;AAYA,SAAgB,EACd,GACmB;CACnB,IAAM,IAAO,EAAW;CAExB,OADK,IAEF,EAAiE,MAClE,OAHgB;AAKpB;AAGA,SAAgB,EAAkB,GAA6C;CAC7E,OAAO,OAAO,KAAK,EAAW,SAAS,YAAY;AACrD;AAOA,SAAgB,EACd,GACU;CACV,OAAO,OAAO,QAAQ,EAAW,SAAS,YAAY,EACnD,QAAQ,GAAG,OAAiB,EAAY,aAAa,EAAK,EAC1D,KAAK,CAAC,OAAQ,CAAE;AACrB;AASA,SAAgB,EACd,GACe;CAEf,OADc,EAAc,IAAI,EAAW,SAAS,EAAW,EACxD,GAAO,SAAS,MAAM;AAC/B;AAYA,SAAgB,EACd,GACQ;CACR,OACE,EAAsB,CAAU,KAChC,cAAc,EAAW,KAAK;AAElC;AAEA,IAAM,IAAsB,IAAI,IAC9B,EAAmB,KAAK,MAAU,CAAC,EAAM,IAAI,CAAK,CAAC,CACrD,GAGM,IAAiB,eAGjB,IAA8B,qBAE9B,IAAoB;AAO1B,SAAS,EAAe,GAAiC;CACvD,OACE,OAAO,KAAU,YACjB,EAAM,SAAS,KACf,CAAC,EAAe,KAAK,CAAK,KAC1B,CAAC,EAA4B,KAAK,CAAK;AAE3C;AAWA,SAAS,EACP,GAC6B;CAC7B,IAAM,EAAE,cAAW;CACnB,IAAI,OAAO,KAAW,aAAY,GAAiB,OAAO;CAC1D,IAAM,EAAE,UAAO,QAAK,aAAU;CAI9B,OAHI,MAAU,oBACV,CAAC,EAAe,CAAG,KAAK,CAAC,EAAe,CAAK,KAC7C,CAAC,EAAM,SAAS,CAAiB,IAAU,OACxC;EAAE;EAAK;CAAM;AACtB;AAQA,SAAS,EACP,GAC8B;CAC9B,IAAM,IAAW,EAAW;CAC5B,IAAI,OAAO,KAAa,aAAY,GAAmB,OAAO;CAC9D,IAAM,EAAE,gBAAa;CACrB,IAAI,OAAO,KAAa,aAAY,GAAmB,OAAO;CAC9D,IAAM,EAAE,UAAO;CAEf,OADI,OAAO,KAAO,YAAY,EAAG,WAAW,IAAU,OAC/C,EAAoB,IAAI,CAAE,KAAK;AACxC;AAWA,SAAgB,EACd,GACA,GACe;CACf,IAAI,MAAmB,QAAQ,IAAiB,GAAG,OAAO;CAC1D,IAAM,IAAQ,EAA2B,CAAU;CACnD,IAAI,CAAC,GAAO,OAAO;CACnB,IAAM,IAAO,EAAe,CAAK;CAGjC,OAFK,IAEE,EADQ,MAAmB,IAAI,EAAK,MAAM,EAAK,OACrB,EAAE,OAAO,EAAe,eAAe,EAAE,CAAC,IAFzD;AAGpB"}
@@ -0,0 +1,2 @@
1
+ require("../_virtual/_rolldown/runtime.cjs");const e=require("../i18n/declaration.cjs"),t=require("../types/automation.cjs");var n=[`success`,`partial_success`,`blocked`,`failed`,`unknown`];function r(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function i(e){return typeof e==`string`&&n.includes(e)}function a(e){return typeof e==`string`&&e.trim()||null}var o=new Set([`status`,`outcome_summary`]);function s(e){return e.run_metadata?.finish_tool_response??null}function c(e){let t=a(e);if(t)return t;if(typeof e==`number`||typeof e==`boolean`)return String(e);if(e==null)return null;try{return JSON.stringify(e,null,2)}catch{return String(e)}}function l(e){if(e==null)return null;if(!r(e))return e;let t=Object.entries(e).filter(([e])=>!o.has(e));return t.length>0?Object.fromEntries(t):`status`in e&&!i(e.status)?{status:e.status}:null}function u(e){let t=s(e);if(!r(t))return null;let n=a(t.outcome_summary);return typeof t.status!=`string`&&!n?null:{status:i(t.status)?t.status:`unknown`,outcomeSummary:n}}function d(e){let n=s(e),r=l(n),i=c(r),o=u(e),d=a(e.error_detail);return e.status===t.AutomationRunStatus.COMPLETED?{badgeStatus:o?.status??(n===null?`success`:`unknown`),summary:o?.outcomeSummary??null,taskOutcome:o,customTaskMetadata:r,customTaskMetadataText:i}:{badgeStatus:e.status,summary:d,taskOutcome:o,customTaskMetadata:r,customTaskMetadataText:i}}function f(n){switch(n){case t.AutomationRunStatus.COMPLETED:case`success`:return e.I18nKey.AUTOMATIONS$DETAIL$SUCCESSFUL;case t.AutomationRunStatus.FAILED:case`failed`:return e.I18nKey.AUTOMATIONS$DETAIL$FAILED;case t.AutomationRunStatus.PENDING:return e.I18nKey.AUTOMATIONS$DETAIL$PENDING;case t.AutomationRunStatus.RUNNING:return e.I18nKey.AUTOMATIONS$DETAIL$RUNNING;case t.AutomationRunStatus.CANCELLED:return e.I18nKey.AUTOMATIONS$DETAIL$CANCELLED;case t.AutomationRunStatus.SKIPPED:return e.I18nKey.AUTOMATIONS$DETAIL$SKIPPED;case`blocked`:return e.I18nKey.AUTOMATIONS$DETAIL$BLOCKED;case`partial_success`:return e.I18nKey.AUTOMATIONS$DETAIL$PARTIAL;case`unknown`:return e.I18nKey.AUTOMATIONS$DETAIL$NEEDS_REVIEW;default:return e.I18nKey.FEATURED_AUTOMATIONS$STATUS_UNKNOWN}}exports.getAutomationRunBadgeLabelKey=f,exports.getAutomationRunDisplay=d;
2
+ //# sourceMappingURL=automation-run-display.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automation-run-display.cjs","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":"6HAwBA,IAAM,EAAgE,CACpE,UACA,kBACA,UACA,SACA,SACF,EAEA,SAAS,EAAS,EAAkD,CAClE,OAAO,OAAO,GAAU,YAAY,GAAkB,CAAC,MAAM,QAAQ,CAAK,CAC5E,CAEA,SAAgB,EACd,EACsC,CACtC,OACE,OAAO,GAAU,UACjB,EAAsB,SAAS,CAAoC,CAEvE,CAEA,SAAS,EAAW,EAA+B,CAEjD,OADI,OAAO,GAAU,UACd,EAAM,KAAK,GADoB,IAExC,CAEA,IAAM,EAAoC,IAAI,IAAI,CAChD,SACA,iBACF,CAAC,EAED,SAAgB,EACd,EACgB,CAEhB,OADiB,EAAI,cAAc,sBACkB,IACvD,CAEA,SAAgB,EACd,EACe,CACf,IAAM,EAAU,EAAW,CAAQ,EACnC,GAAI,EAAS,OAAO,EACpB,GAAI,OAAO,GAAa,UAAY,OAAO,GAAa,UACtD,OAAO,OAAO,CAAQ,EAExB,GAAI,GAAa,KAAgC,OAAO,KAExD,GAAI,CACF,OAAO,KAAK,UAAU,EAAU,KAAM,CAAC,CACzC,MAAQ,CACN,OAAO,OAAO,CAAQ,CACxB,CACF,CAEA,SAAS,EAA4B,EAAmC,CACtE,GAAI,GAAa,KAAgC,OAAO,KACxD,GAAI,CAAC,EAAS,CAAQ,EAAG,OAAO,EAEhC,IAAM,EAAgB,OAAO,QAAQ,CAAQ,EAAE,QAC5C,CAAC,KAAS,CAAC,EAAkC,IAAI,CAAG,CACvD,EAOA,OANI,EAAc,OAAS,EAAU,OAAO,YAAY,CAAa,EAEjE,WAAY,GAAY,CAAC,EAAoB,EAAS,MAAM,EACvD,CAAE,OAAQ,EAAS,MAAO,EAG5B,IACT,CAEA,SAAgB,EACd,EACiC,CACjC,IAAM,EAAW,EAAmC,CAAG,EACvD,GAAI,CAAC,EAAS,CAAQ,EAAG,OAAO,KAEhC,IAAM,EAAiB,EAAW,EAAS,eAAe,EAI1D,OAHkB,OAAO,EAAS,QAAW,UAC3B,CAAC,EAAuB,KAEnC,CACL,OAAQ,EAAoB,EAAS,MAAM,EAAI,EAAS,OAAS,UACjE,gBACF,CACF,CAEA,SAAgB,EACd,EACsB,CACtB,IAAM,EAAqB,EAAmC,CAAG,EAC3D,EAAqB,EAA4B,CAAkB,EACnE,EACJ,EAAgC,CAAkB,EAC9C,EAAc,EAA4B,CAAG,EAC7C,EAAgB,EAAW,EAAI,YAAY,EAcjD,OAZI,EAAI,SAAW,EAAA,oBAAoB,UAC9B,CACL,YACE,GAAa,SACZ,IAAuB,KAAmB,UAAZ,WACjC,QAAS,GAAa,gBAAkB,KACxC,cACA,qBACA,wBACF,EAGK,CACL,YAAa,EAAI,OACjB,QAAS,EACT,cACA,qBACA,wBACF,CACF,CAEA,SAAgB,EACd,EACS,CACT,OAAQ,EAAR,CACE,KAAK,EAAA,oBAAoB,UACzB,IAAK,UACH,OAAO,EAAA,QAAQ,8BACjB,KAAK,EAAA,oBAAoB,OACzB,IAAK,SACH,OAAO,EAAA,QAAQ,0BACjB,KAAK,EAAA,oBAAoB,QACvB,OAAO,EAAA,QAAQ,2BACjB,KAAK,EAAA,oBAAoB,QACvB,OAAO,EAAA,QAAQ,2BACjB,KAAK,EAAA,oBAAoB,UACvB,OAAO,EAAA,QAAQ,6BACjB,KAAK,EAAA,oBAAoB,QACvB,OAAO,EAAA,QAAQ,2BACjB,IAAK,UACH,OAAO,EAAA,QAAQ,2BACjB,IAAK,kBACH,OAAO,EAAA,QAAQ,2BACjB,IAAK,UACH,OAAO,EAAA,QAAQ,gCACjB,QACE,OAAO,EAAA,QAAQ,mCACnB,CACF"}
@@ -0,0 +1,20 @@
1
+ import { I18nKey } from "#/i18n/declaration";
2
+ import { AutomationRunStatus, type AutomationRun, type AutomationTaskOutcomeStatus } from "#/types/automation";
3
+ export type AutomationRunBadgeStatus = AutomationRunStatus | AutomationTaskOutcomeStatus;
4
+ export interface AutomationRunTaskOutcome {
5
+ status: AutomationTaskOutcomeStatus;
6
+ outcomeSummary: string | null;
7
+ }
8
+ export interface AutomationRunDisplay {
9
+ badgeStatus: AutomationRunBadgeStatus;
10
+ summary: string | null;
11
+ taskOutcome: AutomationRunTaskOutcome | null;
12
+ customTaskMetadata: unknown | null;
13
+ customTaskMetadataText: string | null;
14
+ }
15
+ export declare function isTaskOutcomeStatus(value: unknown): value is AutomationTaskOutcomeStatus;
16
+ export declare function getAutomationRunFinishToolResponse(run: AutomationRun): unknown | null;
17
+ export declare function formatAutomationRunTaskMetadata(metadata: unknown): string | null;
18
+ export declare function getAutomationRunTaskOutcome(run: AutomationRun): AutomationRunTaskOutcome | null;
19
+ export declare function getAutomationRunDisplay(run: AutomationRun): AutomationRunDisplay;
20
+ export declare function getAutomationRunBadgeLabelKey(status: AutomationRunBadgeStatus | string): I18nKey;