@openhands/agent-canvas 1.10.0 → 1.11.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 (500) hide show
  1. package/README.md +1 -1
  2. package/README.windows.md +2 -2
  3. package/build/assets/{acp-providers-DLe_gVDY.js → acp-providers-BkL3HWa3.js} +1 -1
  4. package/build/assets/{active-backend-context-B0wI7OzM.js → active-backend-context-BBvP-bI2.js} +1 -1
  5. package/build/assets/{agent-context-settings-CaQtdNA-.js → agent-context-settings-Bno1nwPL.js} +1 -1
  6. package/build/assets/{agent-profiles-settings-CvuErjp6.js → agent-profiles-settings-DqoS7RL3.js} +1 -1
  7. package/build/assets/agent-server-conversation-service.api-0RztSdJJ.js +86 -0
  8. package/build/assets/agent-settings-BJHryp65.js +1 -0
  9. package/build/assets/{agent-settings-UE-U4Xii.js → agent-settings-h8hQz-IU.js} +1 -1
  10. package/build/assets/{alert-banner-BMaOtTCG.js → alert-banner-lrK-2_0Y.js} +1 -1
  11. package/build/assets/{api-key-entry-screen-Cy66vT4D.js → api-key-entry-screen-Qsb83VX1.js} +1 -1
  12. package/build/assets/{app-settings-9ok42bV6.js → app-settings-r1RUbgGi.js} +1 -1
  13. package/build/assets/{automation-detail-fuITm6i3.js → automation-detail-7LkL91j9.js} +3 -3
  14. package/build/assets/{automation-export-CRq40mux.js → automation-export-U2QNyNy6.js} +1 -1
  15. package/build/assets/{automation-setup-route-EXDazOHW.js → automation-setup-route-Bel9_Lue.js} +1 -1
  16. package/build/assets/{automation-templates-BArZsaxP.js → automation-templates-CRLDssaI.js} +1 -1
  17. package/build/assets/{automations-list-CG4HKOTn.js → automations-list-B2iV3ZKW.js} +1 -1
  18. package/build/assets/{back-nav-button-BZB6H7xz.js → back-nav-button-B3pYwmUJ.js} +1 -1
  19. package/build/assets/backend-form-modal-OroTqnAv.js +1 -0
  20. package/build/assets/{backend-synced-settings-badge-B_NXJ3u1.js → backend-synced-settings-badge-DB4717Iu.js} +1 -1
  21. package/build/assets/{badge-C64c-7PO.js → badge-yR53enbU.js} +1 -1
  22. package/build/assets/{base-modal-C0RQPug5.js → base-modal-3NmIOKDm.js} +1 -1
  23. package/build/assets/{brand-button-DJmFCyMK.js → brand-button-CJcwjnfb.js} +1 -1
  24. package/build/assets/{browser-D3gd2n83.js → browser--eoQOo4M.js} +1 -1
  25. package/build/assets/{browser-tab-BicAWuJ1.js → browser-tab-A94o33Vn.js} +1 -1
  26. package/build/assets/{chat-send-button-CCrH1E8u.js → chat-send-button-B8n6-DQA.js} +1 -1
  27. package/build/assets/{circle-plus-check-toggle-CB_sNERY.js → circle-plus-check-toggle-BVzv5EkZ.js} +1 -1
  28. package/build/assets/{cloud-funnel-analytics-XynamQGU.js → cloud-funnel-analytics-CBQdPZl_.js} +1 -1
  29. package/build/assets/{combobox-caret-Bwiifgjs.js → combobox-caret-BlmRwiM8.js} +1 -1
  30. package/build/assets/command-menu-PsRXVBz2.js +1 -0
  31. package/build/assets/{condenser-settings-cNGy75gq.js → condenser-settings-w7L3EFvm.js} +1 -1
  32. package/build/assets/{confirmation-modal-BATFmFyP.js → confirmation-modal-DAH0XtOp.js} +1 -1
  33. package/build/assets/{context-menu-list-item-DhJCcBA0.js → context-menu-list-item-BQhmFVEK.js} +1 -1
  34. package/build/assets/{conversation-Csdxh9Xt.js → conversation-BUzBZAc-.js} +4 -4
  35. package/build/assets/conversation-panel-pzAKsSDb.js +1 -0
  36. package/build/assets/conversation-pzAKsSDb.js +1 -0
  37. package/build/assets/{conversation-state-store-C2QzhPaK.js → conversation-state-store-Bs8gA263.js} +1 -1
  38. package/build/assets/{conversation-tab-empty-state-D3fb5xIA.js → conversation-tab-empty-state-C9sfDOlt.js} +1 -1
  39. package/build/assets/{copy-to-clipboard-button-c4MQwKGj.js → copy-to-clipboard-button-DatoElj8.js} +1 -1
  40. package/build/assets/{device-verify-oFpQoLgm.js → device-verify-BIjXeW9N.js} +1 -1
  41. package/build/assets/{dropdown-classes-f91ARMV1.js → dropdown-classes-zFW7qPSK.js} +1 -1
  42. package/build/assets/{entry.client-BCzY2Bf3.js → entry.client-DzbDyLkV.js} +2 -2
  43. package/build/assets/{enum-filter-dropdown-HG3q3rkV.js → enum-filter-dropdown-CctILg5t.js} +1 -1
  44. package/build/assets/{environment-switch-overlay-CquZXolz.js → environment-switch-overlay-Cvmo6clk.js} +1 -1
  45. package/build/assets/{extensions-hub-BeweE0PW.js → extensions-hub-DOmHPGTA.js} +1 -1
  46. package/build/assets/{extensions-navigation-Dd58NlUF.js → extensions-navigation-6zU5M1pa.js} +1 -1
  47. package/build/assets/{files-tab-CLLG55-q.js → files-tab-BzofBmF4.js} +1 -1
  48. package/build/assets/{form-control-classes-pHtZUI6K.js → form-control-classes-DLN3Qgub.js} +1 -1
  49. package/build/assets/{format-relative-time-6-3uvOXe.js → format-relative-time-DGPQlPx0.js} +1 -1
  50. package/build/assets/{git-provider-icon-wg7ShB98.js → git-provider-icon-BLMlwy02.js} +1 -1
  51. package/build/assets/{git-repo-dropdown-CWnaUyxL.js → git-repo-dropdown-B7RvO70z.js} +1 -1
  52. package/build/assets/git-repo-dropdown-B_PTq4ol.js +1 -0
  53. package/build/assets/{highlighted-source-view-DBtI3por.js → highlighted-source-view-CgJfD5VT.js} +1 -1
  54. package/build/assets/{home-BpZQkDWM.js → home-DEZaZqYv.js} +1 -1
  55. package/build/assets/home-r89Vj2td.js +1 -0
  56. package/build/assets/{home-store-DM4qw1lF.js → home-store-D7CjMN_-.js} +1 -1
  57. package/build/assets/index-home-r89Vj2td.js +1 -0
  58. package/build/assets/install-server-modal-BTwK5lbi.js +1 -0
  59. package/build/assets/{kebab-menu-item-content-By16Tm_0.js → kebab-menu-item-content-C4CkeiJO.js} +1 -1
  60. package/build/assets/{launch-C9uijypN.js → launch-DVlx4v9o.js} +1 -1
  61. package/build/assets/{llm-not-configured-banner-DrBrhfN0.js → llm-not-configured-banner-CwKu8C6g.js} +2 -2
  62. package/build/assets/llm-settings-BJotLQND.js +1 -0
  63. package/build/assets/llm-settings-CDM-5H2A.js +1 -0
  64. package/build/assets/{llm-subscription-service-DwjJ8-_X.js → llm-subscription-service-7eVfDIE1.js} +1 -1
  65. package/build/assets/{loading-spinner-6Yj-YyoS.js → loading-spinner-CN3riY7k.js} +1 -1
  66. package/build/assets/{manage-backends-modal-DrwErS0N.js → manage-backends-modal-HNWKLYhq.js} +1 -1
  67. package/build/assets/manifest-2a36a8f8.js +1 -0
  68. package/build/assets/{manifest-subpage-layout-CtqVwIvJ.js → manifest-subpage-layout-D-m-h8_t.js} +1 -1
  69. package/build/assets/map-provider-7Bp2aih5.js +1 -0
  70. package/build/assets/markdown-renderer-BiiiIznl.js +8 -0
  71. package/build/assets/mcp-gLgPP7AS.js +9 -0
  72. package/build/assets/{mcp-marketplace-utils-BMnYz0Gc.js → mcp-marketplace-utils-Dr_HG_ol.js} +1 -1
  73. package/build/assets/messages-D1cbVhRK.js +40 -0
  74. package/build/assets/{modal-body-BHGCSAtj.js → modal-body-duRaxj_K.js} +1 -1
  75. package/build/assets/{modal-classes-DSTLuxkA.js → modal-classes-CLEXO6dj.js} +1 -1
  76. package/build/assets/{modal-close-button-dheWZ2ys.js → modal-close-button-D0aT02hs.js} +1 -1
  77. package/build/assets/npm-DRzJF5Zn.js +1 -0
  78. package/build/assets/{onboarding-5CZvRBbh.js → onboarding-DSr8hOpk.js} +1 -1
  79. package/build/assets/{onboarding-modal-CD2ehuxt.js → onboarding-modal-C6Euf7N4.js} +1 -1
  80. package/build/assets/{organization-service.api-Dsuoep0g.js → organization-service.api-C4GYWwj9.js} +1 -1
  81. package/build/assets/{planner-tab-DeO7Thb0.js → planner-tab-CZcguxTK.js} +1 -1
  82. package/build/assets/{plugins-management-service-C9f75R6X.js → plugins-management-service-BmDzOQsd.js} +1 -1
  83. package/build/assets/{profiles-service.api-Dl20_2IM.js → profiles-service.api-CoLTwjc1.js} +1 -1
  84. package/build/assets/{providers-CeuhK46N.js → providers-tBzTpz1w.js} +1 -1
  85. package/build/assets/{proxy-CIGI9zQC.js → proxy-DCI9S-LA.js} +1 -1
  86. package/build/assets/recommended-automations-launcher-BbJAJVED.js +1 -0
  87. package/build/assets/root-BfM_kC_d.css +1 -0
  88. package/build/assets/root-gstBEjty.js +2 -0
  89. package/build/assets/root-layout-BIAFLP9p.js +2 -0
  90. package/build/assets/{schema-field-z2vSLuLo.js → schema-field-zhsVDllR.js} +1 -1
  91. package/build/assets/{sdk-section-page-BnCXAytf.js → sdk-section-page-CS4GWn0y.js} +1 -1
  92. package/build/assets/{secrets-service-DGUNlwQd.js → secrets-service-DjgGduXk.js} +1 -1
  93. package/build/assets/{secrets-settings-DUmML_dK.js → secrets-settings-f-qahfbi.js} +1 -1
  94. package/build/assets/{segmented-toggle-eSofF7gn.js → segmented-toggle-SmvsR3jW.js} +1 -1
  95. package/build/assets/settings-DQd0xLEw.js +1 -0
  96. package/build/assets/{settings-dropdown-input-Cx4g7Xfl.js → settings-dropdown-input-TWIeiG02.js} +1 -1
  97. package/build/assets/{settings-index-BECdgecg.js → settings-index-BVwy9JEp.js} +1 -1
  98. package/build/assets/{settings-input-BQY115xH.js → settings-input-D61Vzp9e.js} +1 -1
  99. package/build/assets/{settings-list-classes-C9cLrrcc.js → settings-list-classes-sE0ASr1s.js} +1 -1
  100. package/build/assets/{settings-modal-ChBJNTdd.js → settings-modal-D6D5ngET.js} +1 -1
  101. package/build/assets/{settings-service.api-Dz9cZyvx.js → settings-service.api-DZp7E7A9.js} +1 -1
  102. package/build/assets/{settings-switch-BIodMVz9.js → settings-switch-Drt-rF5s.js} +1 -1
  103. package/build/assets/{settings-utils-BL_Z9uIe.js → settings-utils-gw2ppAvw.js} +1 -1
  104. package/build/assets/{shared-conversation-CSF0aTuE.js → shared-conversation-DIxZjElr.js} +1 -1
  105. package/build/assets/{wrench-DRitTfwe.js → shield-check-D2cpEpv3.js} +1 -1
  106. package/build/assets/{sidebar-layout-DEycoFd_.js → sidebar-layout-Dxg6zc2K.js} +1 -1
  107. package/build/assets/{sidebar-mobile-menu-toggle-DeRvTupV.js → sidebar-mobile-menu-toggle-OoZBHxaT.js} +1 -1
  108. package/build/assets/{sidebar-nav-link-BjpQ-NVc.js → sidebar-nav-link-CxLoG-dG.js} +1 -1
  109. package/build/assets/sidebar-store-BJeYY-E9.js +1 -0
  110. package/build/assets/{skill-card-pill-row-BH6fPGba.js → skill-card-pill-row-B_BYBONu.js} +1 -1
  111. package/build/assets/{skill-icon-badge-D4uznfjU.js → skill-icon-badge-CN41Hy9l.js} +1 -1
  112. package/build/assets/{skill-scope-DH_AUUUP.js → skill-scope-B1Per5XI.js} +1 -1
  113. package/build/assets/{skills-plugins-vfvOk34h.js → skills-plugins-B3AO6sMz.js} +1 -1
  114. package/build/assets/skills-settings-DmmgJ6CT.js +2 -0
  115. package/build/assets/{styled-tooltip-CQ9JEFiO.js → styled-tooltip-C5C07RQC.js} +1 -1
  116. package/build/assets/{task-list-tab-DeF_uXdw.js → task-list-tab-C19Q_JNf.js} +1 -1
  117. package/build/assets/{terminal-DRc4rup7.js → terminal-CbuMRYal.js} +1 -1
  118. package/build/assets/{toggle-switch--8n8NeV_.js → toggle-switch-CIioisto.js} +1 -1
  119. package/build/assets/{typography-BSbUhJPn.js → typography-D9tiHct7.js} +1 -1
  120. package/build/assets/{use-acp-credential-form-BGKFi1VL.js → use-acp-credential-form-DJmmJKMo.js} +1 -1
  121. package/build/assets/{use-activate-agent-profile-2nvALjC-.js → use-activate-agent-profile-CeFfYwu_.js} +1 -1
  122. package/build/assets/{use-agent-profiles-BlQA67MW.js → use-agent-profiles-BHLkLbRR.js} +1 -1
  123. package/build/assets/{use-can-manage-org-profiles-Clw5Dh1s.js → use-can-manage-org-profiles-Bu4y8gSx.js} +1 -1
  124. package/build/assets/{use-cloud-current-user-id-B8AQSQFM.js → use-cloud-current-user-id-QD9x3ySO.js} +1 -1
  125. package/build/assets/{use-config-C3zGuUQI.js → use-config-CPwqciXN.js} +1 -1
  126. package/build/assets/{use-create-conversation-FaP0kUpg.js → use-create-conversation-DWaSVUOB.js} +1 -1
  127. package/build/assets/{use-create-secret-CgQ3pXd6.js → use-create-secret-BsOfOLvg.js} +1 -1
  128. package/build/assets/{use-llm-profiles-C-tDO6UB.js → use-llm-profiles-CU8ah1pz.js} +1 -1
  129. package/build/assets/{use-manifest-capabilities-DLP5wCxp.js → use-manifest-capabilities-DBYPjyV6.js} +1 -1
  130. package/build/assets/{use-onboarding-completion-BiCdXvlU.js → use-onboarding-completion-CtNJxkXG.js} +1 -1
  131. package/build/assets/{use-plugins-marketplace-DRFNLBlr.js → use-plugins-marketplace-ZEA-gyM9.js} +1 -1
  132. package/build/assets/{use-save-agent-profile-CaGVAudI.js → use-save-agent-profile-DgI_Uz9a.js} +1 -1
  133. package/build/assets/{use-save-settings-C9B8Y-h3.js → use-save-settings-pSjRhD_m.js} +1 -1
  134. package/build/assets/{use-settings-3RcgdUuZ.js → use-settings-BHWsOcIG.js} +1 -1
  135. package/build/assets/use-settings-nav-items-CQgkxUbV.js +16 -0
  136. package/build/assets/{use-tracking-CTtkLAmx.js → use-tracking-CGCsBWhg.js} +1 -1
  137. package/build/assets/{use-user-conversation-Bei82QsZ.js → use-user-conversation-DRfEU8x0.js} +1 -1
  138. package/build/assets/utils-DPQfkd-7.js +1 -0
  139. package/build/assets/{verification-settings-nD61Ijph.js → verification-settings-BItwt998.js} +1 -1
  140. package/build/assets/wrench-B1_H-tL1.js +1 -0
  141. package/build/index.html +4 -4
  142. package/build/locales/ar/openhands.json +39 -2
  143. package/build/locales/ca/openhands.json +39 -2
  144. package/build/locales/de/openhands.json +39 -2
  145. package/build/locales/en/openhands.json +39 -2
  146. package/build/locales/es/openhands.json +39 -2
  147. package/build/locales/fr/openhands.json +39 -2
  148. package/build/locales/it/openhands.json +39 -2
  149. package/build/locales/ja/openhands.json +39 -2
  150. package/build/locales/ko-KR/openhands.json +39 -2
  151. package/build/locales/no/openhands.json +39 -2
  152. package/build/locales/pt/openhands.json +39 -2
  153. package/build/locales/tr/openhands.json +39 -2
  154. package/build/locales/uk/openhands.json +39 -2
  155. package/build/locales/zh-CN/openhands.json +39 -2
  156. package/build/locales/zh-TW/openhands.json +39 -2
  157. package/config/defaults.json +1 -1
  158. package/dist/api/agent-server-adapter.cjs +3 -3
  159. package/dist/api/agent-server-adapter.cjs.map +1 -1
  160. package/dist/api/agent-server-adapter.d.ts +32 -5
  161. package/dist/api/agent-server-adapter.js +120 -91
  162. package/dist/api/agent-server-adapter.js.map +1 -1
  163. package/dist/api/cloud/conversation-service.api.cjs +1 -1
  164. package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
  165. package/dist/api/cloud/conversation-service.api.d.ts +19 -2
  166. package/dist/api/cloud/conversation-service.api.js +51 -47
  167. package/dist/api/cloud/conversation-service.api.js.map +1 -1
  168. package/dist/api/conversation-file-upload.api.cjs +1 -1
  169. package/dist/api/conversation-file-upload.api.js +10 -10
  170. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
  171. package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
  172. package/dist/api/conversation-service/agent-server-conversation-service.api.js +55 -61
  173. package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
  174. package/dist/api/event-service/event-service.api.cjs +1 -1
  175. package/dist/api/event-service/event-service.api.js +12 -12
  176. package/dist/api/launch-child-conversation-client-tool.cjs +47 -0
  177. package/dist/api/launch-child-conversation-client-tool.cjs.map +1 -0
  178. package/dist/api/launch-child-conversation-client-tool.d.ts +3 -0
  179. package/dist/api/launch-child-conversation-client-tool.js +93 -0
  180. package/dist/api/launch-child-conversation-client-tool.js.map +1 -0
  181. package/dist/api/open-hands.types.d.ts +1 -1
  182. package/dist/api/workspace-upload-path.cjs +1 -1
  183. package/dist/api/workspace-upload-path.js +8 -8
  184. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.cjs +1 -1
  185. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.cjs.map +1 -1
  186. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.js +24 -18
  187. package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.js.map +1 -1
  188. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs +1 -1
  189. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map +1 -1
  190. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js +5 -0
  191. package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
  192. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs +2 -2
  193. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs.map +1 -1
  194. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js +11 -7
  195. package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js.map +1 -1
  196. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs +1 -2
  197. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs.map +1 -1
  198. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.d.ts +2 -8
  199. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js +48 -51
  200. package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js.map +1 -1
  201. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.cjs +2 -0
  202. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.cjs.map +1 -0
  203. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.d.ts +12 -0
  204. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.js +6 -0
  205. package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.js.map +1 -0
  206. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs +1 -1
  207. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs.map +1 -1
  208. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.d.ts +16 -1
  209. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js +95 -78
  210. package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js.map +1 -1
  211. package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.cjs +1 -1
  212. package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.cjs.map +1 -1
  213. package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.js +40 -38
  214. package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.js.map +1 -1
  215. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs +2 -0
  216. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs.map +1 -0
  217. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.d.ts +14 -0
  218. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js +167 -0
  219. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js.map +1 -0
  220. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs +2 -0
  221. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs.map +1 -0
  222. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.d.ts +63 -0
  223. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js +66 -0
  224. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js.map +1 -0
  225. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.cjs +2 -0
  226. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.cjs.map +1 -0
  227. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.d.ts +15 -0
  228. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.js +117 -0
  229. package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.js.map +1 -0
  230. package/dist/components/features/conversation-panel/conversation-card/no-repository.cjs +1 -1
  231. package/dist/components/features/conversation-panel/conversation-card/no-repository.cjs.map +1 -1
  232. package/dist/components/features/conversation-panel/conversation-card/no-repository.js +30 -19
  233. package/dist/components/features/conversation-panel/conversation-card/no-repository.js.map +1 -1
  234. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +1 -1
  235. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +1 -1
  236. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.d.ts +7 -2
  237. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +146 -104
  238. package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +1 -1
  239. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs +1 -1
  240. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs.map +1 -1
  241. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.d.ts +20 -0
  242. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js +53 -27
  243. package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js.map +1 -1
  244. package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
  245. package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
  246. package/dist/components/features/conversation-panel/conversation-panel.js +226 -213
  247. package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
  248. package/dist/components/features/settings/agent-canvas-update-card.cjs +1 -1
  249. package/dist/components/features/settings/agent-canvas-update-card.cjs.map +1 -1
  250. package/dist/components/features/settings/agent-canvas-update-card.d.ts +10 -5
  251. package/dist/components/features/settings/agent-canvas-update-card.js +223 -149
  252. package/dist/components/features/settings/agent-canvas-update-card.js.map +1 -1
  253. package/dist/components/features/settings/agent-canvas-version-modal.cjs +2 -0
  254. package/dist/components/features/settings/agent-canvas-version-modal.cjs.map +1 -0
  255. package/dist/components/features/settings/agent-canvas-version-modal.d.ts +11 -0
  256. package/dist/components/features/settings/agent-canvas-version-modal.js +166 -0
  257. package/dist/components/features/settings/agent-canvas-version-modal.js.map +1 -0
  258. package/dist/components/features/settings/agent-canvas-version-tile.cjs +2 -0
  259. package/dist/components/features/settings/agent-canvas-version-tile.cjs.map +1 -0
  260. package/dist/components/features/settings/agent-canvas-version-tile.d.ts +13 -0
  261. package/dist/components/features/settings/agent-canvas-version-tile.js +60 -0
  262. package/dist/components/features/settings/agent-canvas-version-tile.js.map +1 -0
  263. package/dist/components/features/settings/settings-desktop-sidebar.cjs +1 -1
  264. package/dist/components/features/settings/settings-desktop-sidebar.cjs.map +1 -1
  265. package/dist/components/features/settings/settings-desktop-sidebar.js +1 -1
  266. package/dist/components/features/settings/settings-desktop-sidebar.js.map +1 -1
  267. package/dist/components/features/settings/settings-mobile-drawer.cjs +1 -1
  268. package/dist/components/features/settings/settings-mobile-drawer.cjs.map +1 -1
  269. package/dist/components/features/settings/settings-mobile-drawer.js +1 -1
  270. package/dist/components/features/settings/settings-mobile-drawer.js.map +1 -1
  271. package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
  272. package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
  273. package/dist/components/features/sidebar/sidebar-rail-body.js +109 -108
  274. package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
  275. package/dist/components/features/skills/extensions-navigation.cjs +1 -1
  276. package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
  277. package/dist/components/features/skills/extensions-navigation.js +9 -9
  278. package/dist/components/features/skills/extensions-navigation.js.map +1 -1
  279. package/dist/config/defaults.cjs +1 -1
  280. package/dist/config/defaults.cjs.map +1 -1
  281. package/dist/config/defaults.js +1 -1
  282. package/dist/config/defaults.js.map +1 -1
  283. package/dist/constants/child-conversation.cjs +2 -0
  284. package/dist/constants/child-conversation.cjs.map +1 -0
  285. package/dist/constants/child-conversation.d.ts +29 -0
  286. package/dist/constants/child-conversation.js +6 -0
  287. package/dist/constants/child-conversation.js.map +1 -0
  288. package/dist/contexts/conversation-websocket-context.cjs +3 -3
  289. package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
  290. package/dist/contexts/conversation-websocket-context.js +189 -188
  291. package/dist/contexts/conversation-websocket-context.js.map +1 -1
  292. package/dist/hooks/chat/use-model-interceptor.cjs +1 -1
  293. package/dist/hooks/chat/use-model-interceptor.js +6 -6
  294. package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
  295. package/dist/hooks/mutation/use-create-conversation.js +6 -6
  296. package/dist/i18n/declaration.cjs +1 -1
  297. package/dist/i18n/declaration.cjs.map +1 -1
  298. package/dist/i18n/declaration.d.ts +38 -1
  299. package/dist/i18n/declaration.js +1 -1
  300. package/dist/i18n/declaration.js.map +1 -1
  301. package/dist/i18n/translation.cjs +2 -2
  302. package/dist/i18n/translation.cjs.map +1 -1
  303. package/dist/i18n/translation.js +644 -15
  304. package/dist/i18n/translation.js.map +1 -1
  305. package/dist/icons/docker.cjs +2 -0
  306. package/dist/icons/docker.cjs.map +1 -0
  307. package/dist/icons/docker.js +19 -0
  308. package/dist/icons/docker.js.map +1 -0
  309. package/dist/icons/npm.cjs +2 -0
  310. package/dist/icons/npm.cjs.map +1 -0
  311. package/dist/icons/npm.js +19 -0
  312. package/dist/icons/npm.js.map +1 -0
  313. package/dist/locales/ar/openhands.json +39 -2
  314. package/dist/locales/ca/openhands.json +39 -2
  315. package/dist/locales/de/openhands.json +39 -2
  316. package/dist/locales/en/openhands.json +39 -2
  317. package/dist/locales/es/openhands.json +39 -2
  318. package/dist/locales/fr/openhands.json +39 -2
  319. package/dist/locales/it/openhands.json +39 -2
  320. package/dist/locales/ja/openhands.json +39 -2
  321. package/dist/locales/ko-KR/openhands.json +39 -2
  322. package/dist/locales/no/openhands.json +39 -2
  323. package/dist/locales/pt/openhands.json +39 -2
  324. package/dist/locales/tr/openhands.json +39 -2
  325. package/dist/locales/uk/openhands.json +39 -2
  326. package/dist/locales/zh-CN/openhands.json +39 -2
  327. package/dist/locales/zh-TW/openhands.json +39 -2
  328. package/dist/node_modules/@openhands/typescript-client/dist/index.cjs +1 -1
  329. package/dist/node_modules/@openhands/typescript-client/dist/index.js +1 -1
  330. package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.cjs +2 -0
  331. package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.cjs.map +1 -0
  332. package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.js +16 -0
  333. package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.js.map +1 -0
  334. package/dist/node_modules/lucide-react/dist/esm/icons/building-2.cjs +2 -0
  335. package/dist/node_modules/lucide-react/dist/esm/icons/building-2.cjs.map +1 -0
  336. package/dist/node_modules/lucide-react/dist/esm/icons/building-2.js +27 -0
  337. package/dist/node_modules/lucide-react/dist/esm/icons/building-2.js.map +1 -0
  338. package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.cjs +2 -0
  339. package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.cjs.map +1 -0
  340. package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.js +21 -0
  341. package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.js.map +1 -0
  342. package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.cjs +2 -0
  343. package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.cjs.map +1 -0
  344. package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.js +23 -0
  345. package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.js.map +1 -0
  346. package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.cjs +2 -0
  347. package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.cjs.map +1 -0
  348. package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.js +43 -0
  349. package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.js.map +1 -0
  350. package/dist/node_modules/lucide-react/dist/esm/icons/earth.cjs +2 -0
  351. package/dist/node_modules/lucide-react/dist/esm/icons/earth.cjs.map +1 -0
  352. package/dist/node_modules/lucide-react/dist/esm/icons/earth.js +25 -0
  353. package/dist/node_modules/lucide-react/dist/esm/icons/earth.js.map +1 -0
  354. package/dist/node_modules/lucide-react/dist/esm/icons/flag.cjs +2 -0
  355. package/dist/node_modules/lucide-react/dist/esm/icons/flag.cjs.map +1 -0
  356. package/dist/node_modules/lucide-react/dist/esm/icons/flag.js +9 -0
  357. package/dist/node_modules/lucide-react/dist/esm/icons/flag.js.map +1 -0
  358. package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.cjs +2 -0
  359. package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.cjs.map +1 -0
  360. package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.js +27 -0
  361. package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.js.map +1 -0
  362. package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.cjs +2 -0
  363. package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.cjs.map +1 -0
  364. package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.js +25 -0
  365. package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.js.map +1 -0
  366. package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.cjs +2 -0
  367. package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.cjs.map +1 -0
  368. package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.js +30 -0
  369. package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.js.map +1 -0
  370. package/dist/node_modules/lucide-react/dist/esm/icons/hash.cjs +2 -0
  371. package/dist/node_modules/lucide-react/dist/esm/icons/hash.cjs.map +1 -0
  372. package/dist/node_modules/lucide-react/dist/esm/icons/hash.js +35 -0
  373. package/dist/node_modules/lucide-react/dist/esm/icons/hash.js.map +1 -0
  374. package/dist/node_modules/lucide-react/dist/esm/icons/house.cjs +2 -0
  375. package/dist/node_modules/lucide-react/dist/esm/icons/house.cjs.map +1 -0
  376. package/dist/node_modules/lucide-react/dist/esm/icons/house.js +12 -0
  377. package/dist/node_modules/lucide-react/dist/esm/icons/house.js.map +1 -0
  378. package/dist/node_modules/lucide-react/dist/esm/icons/id-card.cjs +2 -0
  379. package/dist/node_modules/lucide-react/dist/esm/icons/id-card.cjs.map +1 -0
  380. package/dist/node_modules/lucide-react/dist/esm/icons/id-card.js +33 -0
  381. package/dist/node_modules/lucide-react/dist/esm/icons/id-card.js.map +1 -0
  382. package/dist/node_modules/lucide-react/dist/esm/icons/key-round.cjs +2 -0
  383. package/dist/node_modules/lucide-react/dist/esm/icons/key-round.cjs.map +1 -0
  384. package/dist/node_modules/lucide-react/dist/esm/icons/key-round.js +15 -0
  385. package/dist/node_modules/lucide-react/dist/esm/icons/key-round.js.map +1 -0
  386. package/dist/node_modules/lucide-react/dist/esm/icons/layers.cjs +2 -0
  387. package/dist/node_modules/lucide-react/dist/esm/icons/layers.cjs.map +1 -0
  388. package/dist/node_modules/lucide-react/dist/esm/icons/layers.js +19 -0
  389. package/dist/node_modules/lucide-react/dist/esm/icons/layers.js.map +1 -0
  390. package/dist/node_modules/lucide-react/dist/esm/icons/link-2.cjs +2 -0
  391. package/dist/node_modules/lucide-react/dist/esm/icons/link-2.cjs.map +1 -0
  392. package/dist/node_modules/lucide-react/dist/esm/icons/link-2.js +22 -0
  393. package/dist/node_modules/lucide-react/dist/esm/icons/link-2.js.map +1 -0
  394. package/dist/node_modules/lucide-react/dist/esm/icons/mails.cjs +2 -0
  395. package/dist/node_modules/lucide-react/dist/esm/icons/mails.cjs.map +1 -0
  396. package/dist/node_modules/lucide-react/dist/esm/icons/mails.js +23 -0
  397. package/dist/node_modules/lucide-react/dist/esm/icons/mails.js.map +1 -0
  398. package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.cjs +2 -0
  399. package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.cjs.map +1 -0
  400. package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.js +12 -0
  401. package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.js.map +1 -0
  402. package/dist/node_modules/lucide-react/dist/esm/icons/plug.cjs +2 -0
  403. package/dist/node_modules/lucide-react/dist/esm/icons/plug.cjs.map +1 -0
  404. package/dist/node_modules/lucide-react/dist/esm/icons/plug.js +23 -0
  405. package/dist/node_modules/lucide-react/dist/esm/icons/plug.js.map +1 -0
  406. package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.cjs +2 -0
  407. package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.cjs.map +1 -0
  408. package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.js +27 -0
  409. package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.js.map +1 -0
  410. package/dist/node_modules/lucide-react/dist/esm/icons/ticket.cjs +2 -0
  411. package/dist/node_modules/lucide-react/dist/esm/icons/ticket.cjs.map +1 -0
  412. package/dist/node_modules/lucide-react/dist/esm/icons/ticket.js +23 -0
  413. package/dist/node_modules/lucide-react/dist/esm/icons/ticket.js.map +1 -0
  414. package/dist/node_modules/lucide-react/dist/esm/icons/users-round.cjs +2 -0
  415. package/dist/node_modules/lucide-react/dist/esm/icons/users-round.cjs.map +1 -0
  416. package/dist/node_modules/lucide-react/dist/esm/icons/users-round.js +21 -0
  417. package/dist/node_modules/lucide-react/dist/esm/icons/users-round.js.map +1 -0
  418. package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.cjs +2 -0
  419. package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.cjs.map +1 -0
  420. package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.js +43 -0
  421. package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.js.map +1 -0
  422. package/dist/node_modules/lucide-react/dist/esm/icons/webhook.cjs +2 -0
  423. package/dist/node_modules/lucide-react/dist/esm/icons/webhook.cjs.map +1 -0
  424. package/dist/node_modules/lucide-react/dist/esm/icons/webhook.js +19 -0
  425. package/dist/node_modules/lucide-react/dist/esm/icons/webhook.js.map +1 -0
  426. package/dist/node_modules/lucide-react/dist/esm/icons/workflow.cjs +2 -0
  427. package/dist/node_modules/lucide-react/dist/esm/icons/workflow.cjs.map +1 -0
  428. package/dist/node_modules/lucide-react/dist/esm/icons/workflow.js +27 -0
  429. package/dist/node_modules/lucide-react/dist/esm/icons/workflow.js.map +1 -0
  430. package/dist/node_modules/lucide-react/dist/esm/icons/wrench.cjs +2 -0
  431. package/dist/node_modules/lucide-react/dist/esm/icons/wrench.cjs.map +1 -0
  432. package/dist/node_modules/lucide-react/dist/esm/icons/wrench.js +9 -0
  433. package/dist/node_modules/lucide-react/dist/esm/icons/wrench.js.map +1 -0
  434. package/dist/node_modules/lucide-react/dist/esm/icons/zap.cjs +2 -0
  435. package/dist/node_modules/lucide-react/dist/esm/icons/zap.cjs.map +1 -0
  436. package/dist/node_modules/lucide-react/dist/esm/icons/zap.js +9 -0
  437. package/dist/node_modules/lucide-react/dist/esm/icons/zap.js.map +1 -0
  438. package/dist/package.cjs +1 -1
  439. package/dist/package.cjs.map +1 -1
  440. package/dist/package.js +6 -3
  441. package/dist/package.js.map +1 -1
  442. package/dist/services/child-conversation-launch.cjs +2 -0
  443. package/dist/services/child-conversation-launch.cjs.map +1 -0
  444. package/dist/services/child-conversation-launch.d.ts +41 -0
  445. package/dist/services/child-conversation-launch.js +182 -0
  446. package/dist/services/child-conversation-launch.js.map +1 -0
  447. package/dist/stores/conversation-panel-preferences-store.cjs +1 -1
  448. package/dist/stores/conversation-panel-preferences-store.cjs.map +1 -1
  449. package/dist/stores/conversation-panel-preferences-store.d.ts +5 -1
  450. package/dist/stores/conversation-panel-preferences-store.js +8 -2
  451. package/dist/stores/conversation-panel-preferences-store.js.map +1 -1
  452. package/dist/types/agent-server/core/base/action.d.ts +17 -1
  453. package/dist/types/agent-server/core/base/base.d.ts +2 -1
  454. package/dist/types/agent-server/type-guards.cjs +1 -1
  455. package/dist/types/agent-server/type-guards.cjs.map +1 -1
  456. package/dist/types/agent-server/type-guards.d.ts +8 -1
  457. package/dist/types/agent-server/type-guards.js +4 -3
  458. package/dist/types/agent-server/type-guards.js.map +1 -1
  459. package/dist/types/automation.d.ts +14 -0
  460. package/dist/utils/custom-toast-handlers.cjs +1 -1
  461. package/dist/utils/custom-toast-handlers.cjs.map +1 -1
  462. package/dist/utils/custom-toast-handlers.js +18 -1
  463. package/dist/utils/custom-toast-handlers.js.map +1 -1
  464. package/package.json +6 -3
  465. package/scripts/brand-dev-electron.mjs +244 -0
  466. package/scripts/check-translation-completeness.cjs +4 -0
  467. package/scripts/generate-icons.mjs +109 -0
  468. package/build/assets/agent-server-conversation-service.api-km_8sOVf.js +0 -41
  469. package/build/assets/agent-settings-nmO-KSXr.js +0 -1
  470. package/build/assets/backend-form-modal-B_lXjOGa.js +0 -1
  471. package/build/assets/command-menu-CA3IjGNc.js +0 -1
  472. package/build/assets/conversation-B6t6EiVp.js +0 -1
  473. package/build/assets/conversation-panel-B6t6EiVp.js +0 -1
  474. package/build/assets/copy-DaHuDtG4.js +0 -1
  475. package/build/assets/git-repo-dropdown-TzOuG5Ef.js +0 -1
  476. package/build/assets/home-OEx0XtfP.js +0 -1
  477. package/build/assets/index-home-OEx0XtfP.js +0 -1
  478. package/build/assets/info-C9lpK5pw.js +0 -1
  479. package/build/assets/install-server-modal-DnjZrJUy.js +0 -1
  480. package/build/assets/list-filter-C86CBRDE.js +0 -1
  481. package/build/assets/llm-settings-CRsLqxgu.js +0 -1
  482. package/build/assets/llm-settings-RBm_3kNm.js +0 -1
  483. package/build/assets/manifest-c352d453.js +0 -1
  484. package/build/assets/map-provider-CXU6issd.js +0 -1
  485. package/build/assets/markdown-renderer-lsvsp7jn.js +0 -8
  486. package/build/assets/mcp-DD4hPTRE.js +0 -9
  487. package/build/assets/messages-Dt77e0qi.js +0 -40
  488. package/build/assets/recommended-automations-launcher-6xmbf7lh.js +0 -1
  489. package/build/assets/root-BQPNqNvD.js +0 -2
  490. package/build/assets/root-BeuHFY2s.css +0 -1
  491. package/build/assets/root-layout-Dl_2CDoq.js +0 -3
  492. package/build/assets/settings-Co-M5bK9.js +0 -1
  493. package/build/assets/sidebar-store-B04sX8aP.js +0 -1
  494. package/build/assets/skills-settings-DnbIu2eO.js +0 -2
  495. package/build/assets/use-settings-nav-items-y-Oyc93G.js +0 -16
  496. package/build/assets/utils-BX9XJ0IE.js +0 -1
  497. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.cjs +0 -2
  498. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.cjs.map +0 -1
  499. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.js +0 -9
  500. package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"package.cjs","names":[],"sources":["../package.json"],"sourcesContent":["{\n \"name\": \"@openhands/agent-canvas\",\n \"version\": \"1.10.0\",\n \"description\": \"Agent Canvas UI for OpenHands - run AI coding agents with a visual interface\",\n \"license\": \"MIT\",\n \"private\": false,\n \"type\": \"module\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/OpenHands/OpenHands\"\n },\n \"homepage\": \"https://github.com/OpenHands/OpenHands#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/OpenHands/OpenHands/issues\"\n },\n \"bin\": {\n \"agent-canvas\": \"bin/agent-canvas.mjs\"\n },\n \"engines\": {\n \"node\": \">=22.12.0\"\n },\n \"dependencies\": {\n \"@heroui/react\": \"2.8.10\",\n \"@microlink/react-json-view\": \"1.31.20\",\n \"@monaco-editor/react\": \"4.7.0\",\n \"@openhands/extensions\": \"0.16.0\",\n \"@openhands/typescript-client\": \"1.36.1\",\n \"@react-router/node\": \"7.18.2\",\n \"@react-router/serve\": \"7.18.2\",\n \"@tailwindcss/vite\": \"4.3.3\",\n \"@tanstack/react-query\": \"5.101.4\",\n \"@types/shell-quote\": \"1.7.5\",\n \"@uidotdev/usehooks\": \"2.4.1\",\n \"@xterm/addon-fit\": \"0.11.0\",\n \"@xterm/xterm\": \"6.0.0\",\n \"axios\": \"1.18.0\",\n \"class-variance-authority\": \"0.7.1\",\n \"clsx\": \"2.1.1\",\n \"downshift\": \"9.3.2\",\n \"framer-motion\": \"12.38.0\",\n \"httpxy\": \"0.5.3\",\n \"i18next\": \"26.3.6\",\n \"i18next-browser-languagedetector\": \"8.2.1\",\n \"i18next-http-backend\": \"4.0.0\",\n \"isbot\": \"5.1.39\",\n \"lucide-react\": \"1.25.0\",\n \"monaco-editor\": \"0.56.0\",\n \"posthog-js\": \"1.380.0\",\n \"react\": \"19.2.8\",\n \"react-dom\": \"19.2.8\",\n \"react-hot-toast\": \"2.6.0\",\n \"react-i18next\": \"17.0.11\",\n \"react-icons\": \"5.6.0\",\n \"react-markdown\": \"10.1.0\",\n \"react-router\": \"7.18.2\",\n \"react-syntax-highlighter\": \"16.1.1\",\n \"rehype-raw\": \"7.0.0\",\n \"rehype-sanitize\": \"6.0.0\",\n \"remark-breaks\": \"4.0.0\",\n \"remark-gfm\": \"4.0.1\",\n \"shell-quote\": \"1.9.0\",\n \"sirv\": \"3.0.2\",\n \"sirv-cli\": \"3.0.1\",\n \"socket.io-client\": \"4.8.3\",\n \"tailwind-merge\": \"3.6.0\",\n \"tailwind-scrollbar\": \"4.0.2\",\n \"unist-util-visit\": \"5.1.0\",\n \"uuid\": \"14.0.0\",\n \"vite\": \"8.0.16\",\n \"winston\": \"3.19.0\",\n \"winston-daily-rotate-file\": \"5.0.0\",\n \"zustand\": \"5.0.12\"\n },\n \"scripts\": {\n \"dev\": \"node --env-file-if-exists=.env scripts/dev-with-automation.mjs\",\n \"dev:static\": \"node --env-file-if-exists=.env scripts/dev-static.mjs\",\n \"dev:extra-backend\": \"node --env-file-if-exists=.env scripts/dev-extra-backend.mjs\",\n \"dev:minimal\": \"node --env-file-if-exists=.env scripts/dev-safe.mjs\",\n \"dev:frontend\": \"npm run make-i18n && cross-env VITE_MOCK_API=false react-router dev\",\n \"dev:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router dev\",\n \"build\": \"npm run build:app\",\n \"build:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router build\",\n \"start\": \"npx sirv-cli build/ --single\",\n \"test\": \"npm run make-i18n && vitest run\",\n \"test:e2e\": \"playwright test --pass-with-no-tests\",\n \"test:e2e:live\": \"node --env-file-if-exists=.env tests/e2e/live/scripts/run-live-e2e.mjs\",\n \"test:e2e:mock-llm\": \"playwright test --config=playwright.mock-llm.config.ts\",\n \"test:e2e:mock-llm:docker\": \"playwright test --config=playwright.mock-llm-docker.config.ts\",\n \"test:coverage\": \"npm run make-i18n && vitest run --coverage\",\n \"test:mutation\": \"npm run make-i18n && stryker run\",\n \"test:mutation:diff\": \"npm run make-i18n && node scripts/stryker-diff.mjs\",\n \"test:mutation:incremental\": \"npm run make-i18n && stryker run --incremental\",\n \"dev_wsl\": \"VITE_WATCH_USE_POLLING=true vite\",\n \"preview\": \"vite preview\",\n \"make-i18n\": \"node scripts/make-i18n-translations.cjs\",\n \"prelint\": \"npm run make-i18n\",\n \"lint\": \"npm run typecheck && eslint src && prettier --check src/**/*.{ts,tsx}\",\n \"lint:fix\": \"eslint src --fix && prettier --write src/**/*.{ts,tsx}\",\n \"prepare\": \"husky\",\n \"typecheck\": \"react-router typegen && tsc\",\n \"typecheck:staged\": \"react-router typegen && npx tsc --noEmit --skipLibCheck\",\n \"check-translation-completeness\": \"node scripts/check-translation-completeness.cjs\",\n \"build:app\": \"npm run make-i18n && react-router build\",\n \"build:lib\": \"npm run make-i18n && react-router typegen && cross-env BUILD_LIB=true vite build && tsc -p tsconfig.lib.json\",\n \"build:docker\": \"node scripts/docker-build.mjs\",\n \"example:acp-docker:env\": \"node scripts/gen-acp-docker-env.mjs\",\n \"desktop\": \"npm run build:app && electron electron/main.mjs\",\n \"build:desktop\": \"npm run build:app && node scripts/download-uv.mjs && node scripts/download-node.mjs && electron-builder --config electron-builder.config.mjs --publish never\",\n \"build:desktop:universal\": \"npm run build:app && node scripts/download-uv.mjs && node scripts/download-node.mjs && cross-env ELECTRON_ARCH=universal electron-builder --config electron-builder.config.mjs --publish never\",\n \"download-uv\": \"node scripts/download-uv.mjs\",\n \"download-node\": \"node scripts/download-node.mjs\"\n },\n \"lint-staged\": {\n \"src/**/*.{ts,tsx,js}\": [\n \"eslint --fix\",\n \"prettier --write\"\n ],\n \"src/**/*.{ts,tsx}\": [\n \"node scripts/run-staged-typecheck.mjs\"\n ],\n \"src/**/*\": [\n \"npm run check-translation-completeness\"\n ]\n },\n \"devDependencies\": {\n \"@eslint/eslintrc\": \"3.3.1\",\n \"@eslint/js\": \"9.39.4\",\n \"@mswjs/socket.io-binding\": \"0.2.0\",\n \"@playwright/test\": \"1.62.0\",\n \"@react-router/dev\": \"7.18.2\",\n \"@stryker-mutator/core\": \"9.6.1\",\n \"@stryker-mutator/vitest-runner\": \"9.6.1\",\n \"@tailwindcss/typography\": \"0.5.20\",\n \"@tanstack/eslint-plugin-query\": \"5.101.4\",\n \"@testing-library/dom\": \"10.4.1\",\n \"@testing-library/jest-dom\": \"7.0.0\",\n \"@testing-library/react\": \"16.3.2\",\n \"@testing-library/user-event\": \"14.6.1\",\n \"@types/mdast\": \"4.0.4\",\n \"@types/node\": \"26.1.2\",\n \"@types/react\": \"19.2.17\",\n \"@types/react-dom\": \"19.2.3\",\n \"@types/react-syntax-highlighter\": \"15.5.13\",\n \"@typescript-eslint/eslint-plugin\": \"8.59.2\",\n \"@typescript-eslint/parser\": \"8.59.2\",\n \"@vercel/react-router\": \"1.3.0\",\n \"@vitest/coverage-v8\": \"4.1.10\",\n \"cross-env\": \"10.1.0\",\n \"electron\": \"42.3.3\",\n \"electron-builder\": \"26.15.3\",\n \"eslint\": \"9.39.4\",\n \"eslint-config-prettier\": \"10.1.8\",\n \"eslint-import-resolver-typescript\": \"4.4.5\",\n \"eslint-plugin-i18next\": \"6.1.5\",\n \"eslint-plugin-import-x\": \"4.16.2\",\n \"eslint-plugin-jsx-a11y\": \"6.10.2\",\n \"eslint-plugin-prettier\": \"5.5.5\",\n \"eslint-plugin-react\": \"7.37.5\",\n \"eslint-plugin-react-hooks\": \"7.1.1\",\n \"eslint-plugin-unused-imports\": \"4.4.1\",\n \"globals\": \"16.5.0\",\n \"husky\": \"9.1.7\",\n \"jsdom\": \"30.0.0\",\n \"lint-staged\": \"16.4.0\",\n \"msw\": \"2.15.0\",\n \"postcss-prefix-selector\": \"2.1.1\",\n \"prettier\": \"3.8.3\",\n \"tailwindcss\": \"4.3.3\",\n \"typescript\": \"6.0.3\",\n \"vite-plugin-svgr\": \"5.2.0\",\n \"vitest\": \"4.1.10\"\n },\n \"packageManager\": \"npm@10.5.0\",\n \"volta\": {\n \"node\": \"22.12.0\"\n },\n \"msw\": {\n \"workerDirectory\": [\n \"public\"\n ]\n },\n \"overrides\": {\n \"@vercel/static-config\": {\n \"ajv\": \"8.20.0\"\n },\n \"dompurify\": \"3.4.12\",\n \"typed-rest-client\": {\n \"qs\": \"6.15.3\"\n }\n },\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"files\": [\n \"dist\",\n \"bin\",\n \"build\",\n \"config\",\n \"scripts\",\n \"tools\"\n ],\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./browser\": {\n \"types\": \"./dist/components/browser/index.d.ts\",\n \"import\": \"./dist/components/browser/index.js\",\n \"require\": \"./dist/components/browser/index.cjs\"\n },\n \"./conversation\": {\n \"types\": \"./dist/components/conversation/index.d.ts\",\n \"import\": \"./dist/components/conversation/index.js\",\n \"require\": \"./dist/components/conversation/index.cjs\"\n },\n \"./files\": {\n \"types\": \"./dist/components/files/index.d.ts\",\n \"import\": \"./dist/components/files/index.js\",\n \"require\": \"./dist/components/files/index.cjs\"\n },\n \"./settings\": {\n \"types\": \"./dist/components/settings/index.d.ts\",\n \"import\": \"./dist/components/settings/index.js\",\n \"require\": \"./dist/components/settings/index.cjs\"\n },\n \"./sidebar\": {\n \"types\": \"./dist/components/sidebar/index.d.ts\",\n \"import\": \"./dist/components/sidebar/index.js\",\n \"require\": \"./dist/components/sidebar/index.cjs\"\n },\n \"./terminal\": {\n \"types\": \"./dist/components/terminal/index.d.ts\",\n \"import\": \"./dist/components/terminal/index.js\",\n \"require\": \"./dist/components/terminal/index.cjs\"\n },\n \"./i18n\": {\n \"types\": \"./dist/i18n/index.d.ts\",\n \"import\": \"./dist/i18n/index.js\",\n \"require\": \"./dist/i18n/index.cjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"peerDependencies\": {\n \"react\": \"19.2.8\",\n \"react-dom\": \"19.2.8\",\n \"react-router\": \"7.18.2\"\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"package.cjs","names":[],"sources":["../package.json"],"sourcesContent":["{\n \"name\": \"@openhands/agent-canvas\",\n \"version\": \"1.11.0\",\n \"description\": \"Agent Canvas UI for OpenHands - run AI coding agents with a visual interface\",\n \"license\": \"MIT\",\n \"private\": false,\n \"type\": \"module\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/OpenHands/OpenHands\"\n },\n \"homepage\": \"https://github.com/OpenHands/OpenHands#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/OpenHands/OpenHands/issues\"\n },\n \"bin\": {\n \"agent-canvas\": \"bin/agent-canvas.mjs\"\n },\n \"engines\": {\n \"node\": \">=22.12.0\"\n },\n \"dependencies\": {\n \"@heroui/react\": \"2.8.10\",\n \"@microlink/react-json-view\": \"1.31.20\",\n \"@monaco-editor/react\": \"4.7.0\",\n \"@openhands/extensions\": \"0.16.0\",\n \"@openhands/typescript-client\": \"1.36.1\",\n \"@react-router/node\": \"7.18.2\",\n \"@react-router/serve\": \"7.18.2\",\n \"@tailwindcss/vite\": \"4.3.3\",\n \"@tanstack/react-query\": \"5.101.4\",\n \"@types/shell-quote\": \"1.7.5\",\n \"@uidotdev/usehooks\": \"2.4.1\",\n \"@xterm/addon-fit\": \"0.11.0\",\n \"@xterm/xterm\": \"6.0.0\",\n \"axios\": \"1.18.0\",\n \"class-variance-authority\": \"0.7.1\",\n \"clsx\": \"2.1.1\",\n \"downshift\": \"9.3.2\",\n \"framer-motion\": \"12.38.0\",\n \"httpxy\": \"0.5.3\",\n \"i18next\": \"26.3.6\",\n \"i18next-browser-languagedetector\": \"8.2.1\",\n \"i18next-http-backend\": \"4.0.0\",\n \"isbot\": \"5.1.39\",\n \"lucide-react\": \"1.25.0\",\n \"monaco-editor\": \"0.56.0\",\n \"posthog-js\": \"1.380.0\",\n \"react\": \"19.2.8\",\n \"react-dom\": \"19.2.8\",\n \"react-hot-toast\": \"2.6.0\",\n \"react-i18next\": \"17.0.11\",\n \"react-icons\": \"5.6.0\",\n \"react-markdown\": \"10.1.0\",\n \"react-router\": \"7.18.2\",\n \"react-syntax-highlighter\": \"16.1.1\",\n \"rehype-raw\": \"7.0.0\",\n \"rehype-sanitize\": \"6.0.0\",\n \"remark-breaks\": \"4.0.0\",\n \"remark-gfm\": \"4.0.1\",\n \"shell-quote\": \"1.9.0\",\n \"sirv\": \"3.0.2\",\n \"sirv-cli\": \"3.0.1\",\n \"socket.io-client\": \"4.8.3\",\n \"tailwind-merge\": \"3.6.0\",\n \"tailwind-scrollbar\": \"4.0.2\",\n \"unist-util-visit\": \"5.1.0\",\n \"uuid\": \"14.0.0\",\n \"vite\": \"8.0.16\",\n \"winston\": \"3.19.0\",\n \"winston-daily-rotate-file\": \"5.0.0\",\n \"zustand\": \"5.0.12\"\n },\n \"scripts\": {\n \"dev\": \"node --env-file-if-exists=.env scripts/dev-with-automation.mjs\",\n \"dev:static\": \"node --env-file-if-exists=.env scripts/dev-static.mjs\",\n \"dev:extra-backend\": \"node --env-file-if-exists=.env scripts/dev-extra-backend.mjs\",\n \"dev:minimal\": \"node --env-file-if-exists=.env scripts/dev-safe.mjs\",\n \"dev:frontend\": \"npm run make-i18n && cross-env VITE_MOCK_API=false react-router dev\",\n \"dev:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router dev\",\n \"build\": \"npm run build:app\",\n \"build:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router build\",\n \"start\": \"npx sirv-cli build/ --single\",\n \"test\": \"npm run make-i18n && vitest run\",\n \"test:e2e\": \"playwright test --pass-with-no-tests\",\n \"test:e2e:live\": \"node --env-file-if-exists=.env tests/e2e/live/scripts/run-live-e2e.mjs\",\n \"test:e2e:mock-llm\": \"playwright test --config=playwright.mock-llm.config.ts\",\n \"test:e2e:mock-llm:docker\": \"playwright test --config=playwright.mock-llm-docker.config.ts\",\n \"test:coverage\": \"npm run make-i18n && vitest run --coverage\",\n \"test:mutation\": \"npm run make-i18n && stryker run\",\n \"test:mutation:diff\": \"npm run make-i18n && node scripts/stryker-diff.mjs\",\n \"test:mutation:incremental\": \"npm run make-i18n && stryker run --incremental\",\n \"dev_wsl\": \"VITE_WATCH_USE_POLLING=true vite\",\n \"preview\": \"vite preview\",\n \"make-i18n\": \"node scripts/make-i18n-translations.cjs\",\n \"prelint\": \"npm run make-i18n\",\n \"lint\": \"npm run typecheck && eslint src && prettier --check src/**/*.{ts,tsx}\",\n \"lint:fix\": \"eslint src --fix && prettier --write src/**/*.{ts,tsx}\",\n \"prepare\": \"husky\",\n \"typecheck\": \"react-router typegen && tsc\",\n \"typecheck:staged\": \"react-router typegen && npx tsc --noEmit --skipLibCheck\",\n \"check-translation-completeness\": \"node scripts/check-translation-completeness.cjs\",\n \"build:app\": \"npm run make-i18n && react-router build\",\n \"build:lib\": \"npm run make-i18n && react-router typegen && cross-env BUILD_LIB=true vite build && tsc -p tsconfig.lib.json\",\n \"build:docker\": \"node scripts/docker-build.mjs\",\n \"example:acp-docker:env\": \"node scripts/gen-acp-docker-env.mjs\",\n \"predesktop\": \"node scripts/brand-dev-electron.mjs\",\n \"desktop\": \"npm run build:app && electron electron\",\n \"build:desktop\": \"npm run build:app && node scripts/download-uv.mjs && node scripts/download-node.mjs && electron-builder --config electron-builder.config.mjs --publish never\",\n \"build:desktop:universal\": \"npm run build:app && node scripts/download-uv.mjs && node scripts/download-node.mjs && cross-env ELECTRON_ARCH=universal electron-builder --config electron-builder.config.mjs --publish never\",\n \"download-uv\": \"node scripts/download-uv.mjs\",\n \"download-node\": \"node scripts/download-node.mjs\",\n \"generate-icons\": \"node scripts/generate-icons.mjs\"\n },\n \"lint-staged\": {\n \"src/**/*.{ts,tsx,js}\": [\n \"eslint --fix\",\n \"prettier --write\"\n ],\n \"src/**/*.{ts,tsx}\": [\n \"node scripts/run-staged-typecheck.mjs\"\n ],\n \"src/**/*\": [\n \"npm run check-translation-completeness\"\n ]\n },\n \"devDependencies\": {\n \"@eslint/eslintrc\": \"3.3.1\",\n \"@eslint/js\": \"9.39.4\",\n \"@mswjs/socket.io-binding\": \"0.2.0\",\n \"@playwright/test\": \"1.62.0\",\n \"@react-router/dev\": \"7.18.2\",\n \"@stryker-mutator/core\": \"9.6.1\",\n \"@stryker-mutator/vitest-runner\": \"9.6.1\",\n \"@tailwindcss/typography\": \"0.5.20\",\n \"@tanstack/eslint-plugin-query\": \"5.101.4\",\n \"@testing-library/dom\": \"10.4.1\",\n \"@testing-library/jest-dom\": \"7.0.0\",\n \"@testing-library/react\": \"16.3.2\",\n \"@testing-library/user-event\": \"14.6.1\",\n \"@types/mdast\": \"4.0.4\",\n \"@types/node\": \"26.1.2\",\n \"@types/react\": \"19.2.17\",\n \"@types/react-dom\": \"19.2.3\",\n \"@types/react-syntax-highlighter\": \"15.5.13\",\n \"@typescript-eslint/eslint-plugin\": \"8.59.2\",\n \"@typescript-eslint/parser\": \"8.59.2\",\n \"@vercel/react-router\": \"1.3.0\",\n \"@vitest/coverage-v8\": \"4.1.10\",\n \"cross-env\": \"10.1.0\",\n \"electron\": \"42.3.3\",\n \"electron-builder\": \"26.15.3\",\n \"eslint\": \"9.39.4\",\n \"eslint-config-prettier\": \"10.1.8\",\n \"eslint-import-resolver-typescript\": \"4.4.5\",\n \"eslint-plugin-i18next\": \"6.1.5\",\n \"eslint-plugin-import-x\": \"4.16.2\",\n \"eslint-plugin-jsx-a11y\": \"6.10.2\",\n \"eslint-plugin-prettier\": \"5.5.5\",\n \"eslint-plugin-react\": \"7.37.5\",\n \"eslint-plugin-react-hooks\": \"7.1.1\",\n \"eslint-plugin-unused-imports\": \"4.4.1\",\n \"globals\": \"16.5.0\",\n \"husky\": \"9.1.7\",\n \"jsdom\": \"30.0.0\",\n \"lint-staged\": \"16.4.0\",\n \"msw\": \"2.15.0\",\n \"png2icons\": \"2.0.1\",\n \"postcss-prefix-selector\": \"2.1.1\",\n \"prettier\": \"3.8.3\",\n \"tailwindcss\": \"4.3.3\",\n \"typescript\": \"6.0.3\",\n \"vite-plugin-svgr\": \"5.2.0\",\n \"vitest\": \"4.1.10\"\n },\n \"packageManager\": \"npm@10.5.0\",\n \"volta\": {\n \"node\": \"22.12.0\"\n },\n \"msw\": {\n \"workerDirectory\": [\n \"public\"\n ]\n },\n \"overrides\": {\n \"@vercel/static-config\": {\n \"ajv\": \"8.20.0\"\n },\n \"dompurify\": \"3.4.12\",\n \"typed-rest-client\": {\n \"qs\": \"6.15.3\"\n }\n },\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"files\": [\n \"dist\",\n \"bin\",\n \"build\",\n \"config\",\n \"scripts\",\n \"tools\"\n ],\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./browser\": {\n \"types\": \"./dist/components/browser/index.d.ts\",\n \"import\": \"./dist/components/browser/index.js\",\n \"require\": \"./dist/components/browser/index.cjs\"\n },\n \"./conversation\": {\n \"types\": \"./dist/components/conversation/index.d.ts\",\n \"import\": \"./dist/components/conversation/index.js\",\n \"require\": \"./dist/components/conversation/index.cjs\"\n },\n \"./files\": {\n \"types\": \"./dist/components/files/index.d.ts\",\n \"import\": \"./dist/components/files/index.js\",\n \"require\": \"./dist/components/files/index.cjs\"\n },\n \"./settings\": {\n \"types\": \"./dist/components/settings/index.d.ts\",\n \"import\": \"./dist/components/settings/index.js\",\n \"require\": \"./dist/components/settings/index.cjs\"\n },\n \"./sidebar\": {\n \"types\": \"./dist/components/sidebar/index.d.ts\",\n \"import\": \"./dist/components/sidebar/index.js\",\n \"require\": \"./dist/components/sidebar/index.cjs\"\n },\n \"./terminal\": {\n \"types\": \"./dist/components/terminal/index.d.ts\",\n \"import\": \"./dist/components/terminal/index.js\",\n \"require\": \"./dist/components/terminal/index.cjs\"\n },\n \"./i18n\": {\n \"types\": \"./dist/i18n/index.d.ts\",\n \"import\": \"./dist/i18n/index.js\",\n \"require\": \"./dist/i18n/index.cjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"peerDependencies\": {\n \"react\": \"19.2.8\",\n \"react-dom\": \"19.2.8\",\n \"react-router\": \"7.18.2\"\n }\n}\n"],"mappings":""}
package/dist/package.js CHANGED
@@ -1,6 +1,6 @@
1
1
  var e = {
2
2
  name: "@openhands/agent-canvas",
3
- version: "1.10.0",
3
+ version: "1.11.0",
4
4
  description: "Agent Canvas UI for OpenHands - run AI coding agents with a visual interface",
5
5
  license: "MIT",
6
6
  private: !1,
@@ -98,11 +98,13 @@ var e = {
98
98
  "build:lib": "npm run make-i18n && react-router typegen && cross-env BUILD_LIB=true vite build && tsc -p tsconfig.lib.json",
99
99
  "build:docker": "node scripts/docker-build.mjs",
100
100
  "example:acp-docker:env": "node scripts/gen-acp-docker-env.mjs",
101
- desktop: "npm run build:app && electron electron/main.mjs",
101
+ predesktop: "node scripts/brand-dev-electron.mjs",
102
+ desktop: "npm run build:app && electron electron",
102
103
  "build:desktop": "npm run build:app && node scripts/download-uv.mjs && node scripts/download-node.mjs && electron-builder --config electron-builder.config.mjs --publish never",
103
104
  "build:desktop:universal": "npm run build:app && node scripts/download-uv.mjs && node scripts/download-node.mjs && cross-env ELECTRON_ARCH=universal electron-builder --config electron-builder.config.mjs --publish never",
104
105
  "download-uv": "node scripts/download-uv.mjs",
105
- "download-node": "node scripts/download-node.mjs"
106
+ "download-node": "node scripts/download-node.mjs",
107
+ "generate-icons": "node scripts/generate-icons.mjs"
106
108
  },
107
109
  "lint-staged": {
108
110
  "src/**/*.{ts,tsx,js}": ["eslint --fix", "prettier --write"],
@@ -150,6 +152,7 @@ var e = {
150
152
  jsdom: "30.0.0",
151
153
  "lint-staged": "16.4.0",
152
154
  msw: "2.15.0",
155
+ png2icons: "2.0.1",
153
156
  "postcss-prefix-selector": "2.1.1",
154
157
  prettier: "3.8.3",
155
158
  tailwindcss: "4.3.3",
@@ -1 +1 @@
1
- {"version":3,"file":"package.js","names":[],"sources":["../package.json"],"sourcesContent":["{\n \"name\": \"@openhands/agent-canvas\",\n \"version\": \"1.10.0\",\n \"description\": \"Agent Canvas UI for OpenHands - run AI coding agents with a visual interface\",\n \"license\": \"MIT\",\n \"private\": false,\n \"type\": \"module\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/OpenHands/OpenHands\"\n },\n \"homepage\": \"https://github.com/OpenHands/OpenHands#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/OpenHands/OpenHands/issues\"\n },\n \"bin\": {\n \"agent-canvas\": \"bin/agent-canvas.mjs\"\n },\n \"engines\": {\n \"node\": \">=22.12.0\"\n },\n \"dependencies\": {\n \"@heroui/react\": \"2.8.10\",\n \"@microlink/react-json-view\": \"1.31.20\",\n \"@monaco-editor/react\": \"4.7.0\",\n \"@openhands/extensions\": \"0.16.0\",\n \"@openhands/typescript-client\": \"1.36.1\",\n \"@react-router/node\": \"7.18.2\",\n \"@react-router/serve\": \"7.18.2\",\n \"@tailwindcss/vite\": \"4.3.3\",\n \"@tanstack/react-query\": \"5.101.4\",\n \"@types/shell-quote\": \"1.7.5\",\n \"@uidotdev/usehooks\": \"2.4.1\",\n \"@xterm/addon-fit\": \"0.11.0\",\n \"@xterm/xterm\": \"6.0.0\",\n \"axios\": \"1.18.0\",\n \"class-variance-authority\": \"0.7.1\",\n \"clsx\": \"2.1.1\",\n \"downshift\": \"9.3.2\",\n \"framer-motion\": \"12.38.0\",\n \"httpxy\": \"0.5.3\",\n \"i18next\": \"26.3.6\",\n \"i18next-browser-languagedetector\": \"8.2.1\",\n \"i18next-http-backend\": \"4.0.0\",\n \"isbot\": \"5.1.39\",\n \"lucide-react\": \"1.25.0\",\n \"monaco-editor\": \"0.56.0\",\n \"posthog-js\": \"1.380.0\",\n \"react\": \"19.2.8\",\n \"react-dom\": \"19.2.8\",\n \"react-hot-toast\": \"2.6.0\",\n \"react-i18next\": \"17.0.11\",\n \"react-icons\": \"5.6.0\",\n \"react-markdown\": \"10.1.0\",\n \"react-router\": \"7.18.2\",\n \"react-syntax-highlighter\": \"16.1.1\",\n \"rehype-raw\": \"7.0.0\",\n \"rehype-sanitize\": \"6.0.0\",\n \"remark-breaks\": \"4.0.0\",\n \"remark-gfm\": \"4.0.1\",\n \"shell-quote\": \"1.9.0\",\n \"sirv\": \"3.0.2\",\n \"sirv-cli\": \"3.0.1\",\n \"socket.io-client\": \"4.8.3\",\n \"tailwind-merge\": \"3.6.0\",\n \"tailwind-scrollbar\": \"4.0.2\",\n \"unist-util-visit\": \"5.1.0\",\n \"uuid\": \"14.0.0\",\n \"vite\": \"8.0.16\",\n \"winston\": \"3.19.0\",\n \"winston-daily-rotate-file\": \"5.0.0\",\n \"zustand\": \"5.0.12\"\n },\n \"scripts\": {\n \"dev\": \"node --env-file-if-exists=.env scripts/dev-with-automation.mjs\",\n \"dev:static\": \"node --env-file-if-exists=.env scripts/dev-static.mjs\",\n \"dev:extra-backend\": \"node --env-file-if-exists=.env scripts/dev-extra-backend.mjs\",\n \"dev:minimal\": \"node --env-file-if-exists=.env scripts/dev-safe.mjs\",\n \"dev:frontend\": \"npm run make-i18n && cross-env VITE_MOCK_API=false react-router dev\",\n \"dev:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router dev\",\n \"build\": \"npm run build:app\",\n \"build:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router build\",\n \"start\": \"npx sirv-cli build/ --single\",\n \"test\": \"npm run make-i18n && vitest run\",\n \"test:e2e\": \"playwright test --pass-with-no-tests\",\n \"test:e2e:live\": \"node --env-file-if-exists=.env tests/e2e/live/scripts/run-live-e2e.mjs\",\n \"test:e2e:mock-llm\": \"playwright test --config=playwright.mock-llm.config.ts\",\n \"test:e2e:mock-llm:docker\": \"playwright test --config=playwright.mock-llm-docker.config.ts\",\n \"test:coverage\": \"npm run make-i18n && vitest run --coverage\",\n \"test:mutation\": \"npm run make-i18n && stryker run\",\n \"test:mutation:diff\": \"npm run make-i18n && node scripts/stryker-diff.mjs\",\n \"test:mutation:incremental\": \"npm run make-i18n && stryker run --incremental\",\n \"dev_wsl\": \"VITE_WATCH_USE_POLLING=true vite\",\n \"preview\": \"vite preview\",\n \"make-i18n\": \"node scripts/make-i18n-translations.cjs\",\n \"prelint\": \"npm run make-i18n\",\n \"lint\": \"npm run typecheck && eslint src && prettier --check src/**/*.{ts,tsx}\",\n \"lint:fix\": \"eslint src --fix && prettier --write src/**/*.{ts,tsx}\",\n \"prepare\": \"husky\",\n \"typecheck\": \"react-router typegen && tsc\",\n \"typecheck:staged\": \"react-router typegen && npx tsc --noEmit --skipLibCheck\",\n \"check-translation-completeness\": \"node scripts/check-translation-completeness.cjs\",\n \"build:app\": \"npm run make-i18n && react-router build\",\n \"build:lib\": \"npm run make-i18n && react-router typegen && cross-env BUILD_LIB=true vite build && tsc -p tsconfig.lib.json\",\n \"build:docker\": \"node scripts/docker-build.mjs\",\n \"example:acp-docker:env\": \"node scripts/gen-acp-docker-env.mjs\",\n \"desktop\": \"npm run build:app && electron electron/main.mjs\",\n \"build:desktop\": \"npm run build:app && node scripts/download-uv.mjs && node scripts/download-node.mjs && electron-builder --config electron-builder.config.mjs --publish never\",\n \"build:desktop:universal\": \"npm run build:app && node scripts/download-uv.mjs && node scripts/download-node.mjs && cross-env ELECTRON_ARCH=universal electron-builder --config electron-builder.config.mjs --publish never\",\n \"download-uv\": \"node scripts/download-uv.mjs\",\n \"download-node\": \"node scripts/download-node.mjs\"\n },\n \"lint-staged\": {\n \"src/**/*.{ts,tsx,js}\": [\n \"eslint --fix\",\n \"prettier --write\"\n ],\n \"src/**/*.{ts,tsx}\": [\n \"node scripts/run-staged-typecheck.mjs\"\n ],\n \"src/**/*\": [\n \"npm run check-translation-completeness\"\n ]\n },\n \"devDependencies\": {\n \"@eslint/eslintrc\": \"3.3.1\",\n \"@eslint/js\": \"9.39.4\",\n \"@mswjs/socket.io-binding\": \"0.2.0\",\n \"@playwright/test\": \"1.62.0\",\n \"@react-router/dev\": \"7.18.2\",\n \"@stryker-mutator/core\": \"9.6.1\",\n \"@stryker-mutator/vitest-runner\": \"9.6.1\",\n \"@tailwindcss/typography\": \"0.5.20\",\n \"@tanstack/eslint-plugin-query\": \"5.101.4\",\n \"@testing-library/dom\": \"10.4.1\",\n \"@testing-library/jest-dom\": \"7.0.0\",\n \"@testing-library/react\": \"16.3.2\",\n \"@testing-library/user-event\": \"14.6.1\",\n \"@types/mdast\": \"4.0.4\",\n \"@types/node\": \"26.1.2\",\n \"@types/react\": \"19.2.17\",\n \"@types/react-dom\": \"19.2.3\",\n \"@types/react-syntax-highlighter\": \"15.5.13\",\n \"@typescript-eslint/eslint-plugin\": \"8.59.2\",\n \"@typescript-eslint/parser\": \"8.59.2\",\n \"@vercel/react-router\": \"1.3.0\",\n \"@vitest/coverage-v8\": \"4.1.10\",\n \"cross-env\": \"10.1.0\",\n \"electron\": \"42.3.3\",\n \"electron-builder\": \"26.15.3\",\n \"eslint\": \"9.39.4\",\n \"eslint-config-prettier\": \"10.1.8\",\n \"eslint-import-resolver-typescript\": \"4.4.5\",\n \"eslint-plugin-i18next\": \"6.1.5\",\n \"eslint-plugin-import-x\": \"4.16.2\",\n \"eslint-plugin-jsx-a11y\": \"6.10.2\",\n \"eslint-plugin-prettier\": \"5.5.5\",\n \"eslint-plugin-react\": \"7.37.5\",\n \"eslint-plugin-react-hooks\": \"7.1.1\",\n \"eslint-plugin-unused-imports\": \"4.4.1\",\n \"globals\": \"16.5.0\",\n \"husky\": \"9.1.7\",\n \"jsdom\": \"30.0.0\",\n \"lint-staged\": \"16.4.0\",\n \"msw\": \"2.15.0\",\n \"postcss-prefix-selector\": \"2.1.1\",\n \"prettier\": \"3.8.3\",\n \"tailwindcss\": \"4.3.3\",\n \"typescript\": \"6.0.3\",\n \"vite-plugin-svgr\": \"5.2.0\",\n \"vitest\": \"4.1.10\"\n },\n \"packageManager\": \"npm@10.5.0\",\n \"volta\": {\n \"node\": \"22.12.0\"\n },\n \"msw\": {\n \"workerDirectory\": [\n \"public\"\n ]\n },\n \"overrides\": {\n \"@vercel/static-config\": {\n \"ajv\": \"8.20.0\"\n },\n \"dompurify\": \"3.4.12\",\n \"typed-rest-client\": {\n \"qs\": \"6.15.3\"\n }\n },\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"files\": [\n \"dist\",\n \"bin\",\n \"build\",\n \"config\",\n \"scripts\",\n \"tools\"\n ],\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./browser\": {\n \"types\": \"./dist/components/browser/index.d.ts\",\n \"import\": \"./dist/components/browser/index.js\",\n \"require\": \"./dist/components/browser/index.cjs\"\n },\n \"./conversation\": {\n \"types\": \"./dist/components/conversation/index.d.ts\",\n \"import\": \"./dist/components/conversation/index.js\",\n \"require\": \"./dist/components/conversation/index.cjs\"\n },\n \"./files\": {\n \"types\": \"./dist/components/files/index.d.ts\",\n \"import\": \"./dist/components/files/index.js\",\n \"require\": \"./dist/components/files/index.cjs\"\n },\n \"./settings\": {\n \"types\": \"./dist/components/settings/index.d.ts\",\n \"import\": \"./dist/components/settings/index.js\",\n \"require\": \"./dist/components/settings/index.cjs\"\n },\n \"./sidebar\": {\n \"types\": \"./dist/components/sidebar/index.d.ts\",\n \"import\": \"./dist/components/sidebar/index.js\",\n \"require\": \"./dist/components/sidebar/index.cjs\"\n },\n \"./terminal\": {\n \"types\": \"./dist/components/terminal/index.d.ts\",\n \"import\": \"./dist/components/terminal/index.js\",\n \"require\": \"./dist/components/terminal/index.cjs\"\n },\n \"./i18n\": {\n \"types\": \"./dist/i18n/index.d.ts\",\n \"import\": \"./dist/i18n/index.js\",\n \"require\": \"./dist/i18n/index.cjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"peerDependencies\": {\n \"react\": \"19.2.8\",\n \"react-dom\": \"19.2.8\",\n \"react-router\": \"7.18.2\"\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"package.js","names":[],"sources":["../package.json"],"sourcesContent":["{\n \"name\": \"@openhands/agent-canvas\",\n \"version\": \"1.11.0\",\n \"description\": \"Agent Canvas UI for OpenHands - run AI coding agents with a visual interface\",\n \"license\": \"MIT\",\n \"private\": false,\n \"type\": \"module\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/OpenHands/OpenHands\"\n },\n \"homepage\": \"https://github.com/OpenHands/OpenHands#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/OpenHands/OpenHands/issues\"\n },\n \"bin\": {\n \"agent-canvas\": \"bin/agent-canvas.mjs\"\n },\n \"engines\": {\n \"node\": \">=22.12.0\"\n },\n \"dependencies\": {\n \"@heroui/react\": \"2.8.10\",\n \"@microlink/react-json-view\": \"1.31.20\",\n \"@monaco-editor/react\": \"4.7.0\",\n \"@openhands/extensions\": \"0.16.0\",\n \"@openhands/typescript-client\": \"1.36.1\",\n \"@react-router/node\": \"7.18.2\",\n \"@react-router/serve\": \"7.18.2\",\n \"@tailwindcss/vite\": \"4.3.3\",\n \"@tanstack/react-query\": \"5.101.4\",\n \"@types/shell-quote\": \"1.7.5\",\n \"@uidotdev/usehooks\": \"2.4.1\",\n \"@xterm/addon-fit\": \"0.11.0\",\n \"@xterm/xterm\": \"6.0.0\",\n \"axios\": \"1.18.0\",\n \"class-variance-authority\": \"0.7.1\",\n \"clsx\": \"2.1.1\",\n \"downshift\": \"9.3.2\",\n \"framer-motion\": \"12.38.0\",\n \"httpxy\": \"0.5.3\",\n \"i18next\": \"26.3.6\",\n \"i18next-browser-languagedetector\": \"8.2.1\",\n \"i18next-http-backend\": \"4.0.0\",\n \"isbot\": \"5.1.39\",\n \"lucide-react\": \"1.25.0\",\n \"monaco-editor\": \"0.56.0\",\n \"posthog-js\": \"1.380.0\",\n \"react\": \"19.2.8\",\n \"react-dom\": \"19.2.8\",\n \"react-hot-toast\": \"2.6.0\",\n \"react-i18next\": \"17.0.11\",\n \"react-icons\": \"5.6.0\",\n \"react-markdown\": \"10.1.0\",\n \"react-router\": \"7.18.2\",\n \"react-syntax-highlighter\": \"16.1.1\",\n \"rehype-raw\": \"7.0.0\",\n \"rehype-sanitize\": \"6.0.0\",\n \"remark-breaks\": \"4.0.0\",\n \"remark-gfm\": \"4.0.1\",\n \"shell-quote\": \"1.9.0\",\n \"sirv\": \"3.0.2\",\n \"sirv-cli\": \"3.0.1\",\n \"socket.io-client\": \"4.8.3\",\n \"tailwind-merge\": \"3.6.0\",\n \"tailwind-scrollbar\": \"4.0.2\",\n \"unist-util-visit\": \"5.1.0\",\n \"uuid\": \"14.0.0\",\n \"vite\": \"8.0.16\",\n \"winston\": \"3.19.0\",\n \"winston-daily-rotate-file\": \"5.0.0\",\n \"zustand\": \"5.0.12\"\n },\n \"scripts\": {\n \"dev\": \"node --env-file-if-exists=.env scripts/dev-with-automation.mjs\",\n \"dev:static\": \"node --env-file-if-exists=.env scripts/dev-static.mjs\",\n \"dev:extra-backend\": \"node --env-file-if-exists=.env scripts/dev-extra-backend.mjs\",\n \"dev:minimal\": \"node --env-file-if-exists=.env scripts/dev-safe.mjs\",\n \"dev:frontend\": \"npm run make-i18n && cross-env VITE_MOCK_API=false react-router dev\",\n \"dev:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router dev\",\n \"build\": \"npm run build:app\",\n \"build:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router build\",\n \"start\": \"npx sirv-cli build/ --single\",\n \"test\": \"npm run make-i18n && vitest run\",\n \"test:e2e\": \"playwright test --pass-with-no-tests\",\n \"test:e2e:live\": \"node --env-file-if-exists=.env tests/e2e/live/scripts/run-live-e2e.mjs\",\n \"test:e2e:mock-llm\": \"playwright test --config=playwright.mock-llm.config.ts\",\n \"test:e2e:mock-llm:docker\": \"playwright test --config=playwright.mock-llm-docker.config.ts\",\n \"test:coverage\": \"npm run make-i18n && vitest run --coverage\",\n \"test:mutation\": \"npm run make-i18n && stryker run\",\n \"test:mutation:diff\": \"npm run make-i18n && node scripts/stryker-diff.mjs\",\n \"test:mutation:incremental\": \"npm run make-i18n && stryker run --incremental\",\n \"dev_wsl\": \"VITE_WATCH_USE_POLLING=true vite\",\n \"preview\": \"vite preview\",\n \"make-i18n\": \"node scripts/make-i18n-translations.cjs\",\n \"prelint\": \"npm run make-i18n\",\n \"lint\": \"npm run typecheck && eslint src && prettier --check src/**/*.{ts,tsx}\",\n \"lint:fix\": \"eslint src --fix && prettier --write src/**/*.{ts,tsx}\",\n \"prepare\": \"husky\",\n \"typecheck\": \"react-router typegen && tsc\",\n \"typecheck:staged\": \"react-router typegen && npx tsc --noEmit --skipLibCheck\",\n \"check-translation-completeness\": \"node scripts/check-translation-completeness.cjs\",\n \"build:app\": \"npm run make-i18n && react-router build\",\n \"build:lib\": \"npm run make-i18n && react-router typegen && cross-env BUILD_LIB=true vite build && tsc -p tsconfig.lib.json\",\n \"build:docker\": \"node scripts/docker-build.mjs\",\n \"example:acp-docker:env\": \"node scripts/gen-acp-docker-env.mjs\",\n \"predesktop\": \"node scripts/brand-dev-electron.mjs\",\n \"desktop\": \"npm run build:app && electron electron\",\n \"build:desktop\": \"npm run build:app && node scripts/download-uv.mjs && node scripts/download-node.mjs && electron-builder --config electron-builder.config.mjs --publish never\",\n \"build:desktop:universal\": \"npm run build:app && node scripts/download-uv.mjs && node scripts/download-node.mjs && cross-env ELECTRON_ARCH=universal electron-builder --config electron-builder.config.mjs --publish never\",\n \"download-uv\": \"node scripts/download-uv.mjs\",\n \"download-node\": \"node scripts/download-node.mjs\",\n \"generate-icons\": \"node scripts/generate-icons.mjs\"\n },\n \"lint-staged\": {\n \"src/**/*.{ts,tsx,js}\": [\n \"eslint --fix\",\n \"prettier --write\"\n ],\n \"src/**/*.{ts,tsx}\": [\n \"node scripts/run-staged-typecheck.mjs\"\n ],\n \"src/**/*\": [\n \"npm run check-translation-completeness\"\n ]\n },\n \"devDependencies\": {\n \"@eslint/eslintrc\": \"3.3.1\",\n \"@eslint/js\": \"9.39.4\",\n \"@mswjs/socket.io-binding\": \"0.2.0\",\n \"@playwright/test\": \"1.62.0\",\n \"@react-router/dev\": \"7.18.2\",\n \"@stryker-mutator/core\": \"9.6.1\",\n \"@stryker-mutator/vitest-runner\": \"9.6.1\",\n \"@tailwindcss/typography\": \"0.5.20\",\n \"@tanstack/eslint-plugin-query\": \"5.101.4\",\n \"@testing-library/dom\": \"10.4.1\",\n \"@testing-library/jest-dom\": \"7.0.0\",\n \"@testing-library/react\": \"16.3.2\",\n \"@testing-library/user-event\": \"14.6.1\",\n \"@types/mdast\": \"4.0.4\",\n \"@types/node\": \"26.1.2\",\n \"@types/react\": \"19.2.17\",\n \"@types/react-dom\": \"19.2.3\",\n \"@types/react-syntax-highlighter\": \"15.5.13\",\n \"@typescript-eslint/eslint-plugin\": \"8.59.2\",\n \"@typescript-eslint/parser\": \"8.59.2\",\n \"@vercel/react-router\": \"1.3.0\",\n \"@vitest/coverage-v8\": \"4.1.10\",\n \"cross-env\": \"10.1.0\",\n \"electron\": \"42.3.3\",\n \"electron-builder\": \"26.15.3\",\n \"eslint\": \"9.39.4\",\n \"eslint-config-prettier\": \"10.1.8\",\n \"eslint-import-resolver-typescript\": \"4.4.5\",\n \"eslint-plugin-i18next\": \"6.1.5\",\n \"eslint-plugin-import-x\": \"4.16.2\",\n \"eslint-plugin-jsx-a11y\": \"6.10.2\",\n \"eslint-plugin-prettier\": \"5.5.5\",\n \"eslint-plugin-react\": \"7.37.5\",\n \"eslint-plugin-react-hooks\": \"7.1.1\",\n \"eslint-plugin-unused-imports\": \"4.4.1\",\n \"globals\": \"16.5.0\",\n \"husky\": \"9.1.7\",\n \"jsdom\": \"30.0.0\",\n \"lint-staged\": \"16.4.0\",\n \"msw\": \"2.15.0\",\n \"png2icons\": \"2.0.1\",\n \"postcss-prefix-selector\": \"2.1.1\",\n \"prettier\": \"3.8.3\",\n \"tailwindcss\": \"4.3.3\",\n \"typescript\": \"6.0.3\",\n \"vite-plugin-svgr\": \"5.2.0\",\n \"vitest\": \"4.1.10\"\n },\n \"packageManager\": \"npm@10.5.0\",\n \"volta\": {\n \"node\": \"22.12.0\"\n },\n \"msw\": {\n \"workerDirectory\": [\n \"public\"\n ]\n },\n \"overrides\": {\n \"@vercel/static-config\": {\n \"ajv\": \"8.20.0\"\n },\n \"dompurify\": \"3.4.12\",\n \"typed-rest-client\": {\n \"qs\": \"6.15.3\"\n }\n },\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"files\": [\n \"dist\",\n \"bin\",\n \"build\",\n \"config\",\n \"scripts\",\n \"tools\"\n ],\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./browser\": {\n \"types\": \"./dist/components/browser/index.d.ts\",\n \"import\": \"./dist/components/browser/index.js\",\n \"require\": \"./dist/components/browser/index.cjs\"\n },\n \"./conversation\": {\n \"types\": \"./dist/components/conversation/index.d.ts\",\n \"import\": \"./dist/components/conversation/index.js\",\n \"require\": \"./dist/components/conversation/index.cjs\"\n },\n \"./files\": {\n \"types\": \"./dist/components/files/index.d.ts\",\n \"import\": \"./dist/components/files/index.js\",\n \"require\": \"./dist/components/files/index.cjs\"\n },\n \"./settings\": {\n \"types\": \"./dist/components/settings/index.d.ts\",\n \"import\": \"./dist/components/settings/index.js\",\n \"require\": \"./dist/components/settings/index.cjs\"\n },\n \"./sidebar\": {\n \"types\": \"./dist/components/sidebar/index.d.ts\",\n \"import\": \"./dist/components/sidebar/index.js\",\n \"require\": \"./dist/components/sidebar/index.cjs\"\n },\n \"./terminal\": {\n \"types\": \"./dist/components/terminal/index.d.ts\",\n \"import\": \"./dist/components/terminal/index.js\",\n \"require\": \"./dist/components/terminal/index.cjs\"\n },\n \"./i18n\": {\n \"types\": \"./dist/i18n/index.d.ts\",\n \"import\": \"./dist/i18n/index.js\",\n \"require\": \"./dist/i18n/index.cjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"peerDependencies\": {\n \"react\": \"19.2.8\",\n \"react-dom\": \"19.2.8\",\n \"react-router\": \"7.18.2\"\n }\n}\n"],"mappings":""}
@@ -0,0 +1,2 @@
1
+ require("../_virtual/_rolldown/runtime.cjs");const e=require("../i18n/declaration.cjs"),t=require("../api/agent-server-compatibility.cjs"),n=require("../utils/base-path.cjs"),r=require("../i18n/index.cjs"),i=require("../utils/custom-toast-handlers.cjs"),a=require("../constants/child-conversation.cjs"),o=require("../stores/goal-store.cjs"),s=require("../api/conversation-metadata-store.cjs"),c=require("../api/cloud/conversation-service.api.cjs"),l=require("../api/conversation-service/agent-server-conversation-service.api.cjs");var u=3e3,d=18e4,f=`openhands-child-conversation-launches:`,p=(e,t)=>({status:`error`,error:e,guidance:t}),m=e=>e.map(e=>`"${e}"`).join(` or `),h=e=>e?.trim()||null;function g(e){let t=e.target;if(!a.CHILD_CONVERSATION_TARGETS.includes(t))return{ok:!1,failure:p(`Unknown target ${JSON.stringify(e.target)}.`,`\`target\` must be exactly ${m(a.CHILD_CONVERSATION_TARGETS)}. Nothing was launched — call ${a.LAUNCH_CHILD_CONVERSATION_TOOL_NAME} again with a valid target.`)};let n=h(e.task);if(!n)return{ok:!1,failure:p("`task` is empty.","`task` must be a self-contained brief: the child conversation cannot see this one, so state the goal, constraints and expected output.")};let r=h(e.repository),i=h(e.branch),o=h(e.isolation);return t===`local`&&(r||i)?{ok:!1,failure:p('`repository`/`branch` were passed with target="local".','A local child always runs in this conversation\'s workspace. Drop `repository` and `branch`, or use target="cloud" to run against a repository in a Cloud sandbox.')}:t===`cloud`&&o?{ok:!1,failure:p('`isolation` was passed with target="cloud".','Cloud children always run in their own isolated sandbox. Drop `isolation`, or use target="local" to choose between "worktree" and "shared".')}:i&&!r?{ok:!1,failure:p("`branch` was passed without `repository`.",'Pass `repository` as "owner/repo" alongside `branch`, or drop `branch` to use the repository\'s default branch.')}:o&&!a.CHILD_CONVERSATION_ISOLATIONS.includes(o)?{ok:!1,failure:p(`Unknown isolation ${JSON.stringify(e.isolation)}.`,`\`isolation\` must be exactly ${m(a.CHILD_CONVERSATION_ISOLATIONS)}. Nothing was launched — call ${a.LAUNCH_CHILD_CONVERSATION_TOOL_NAME} again with a valid isolation.`)}:{ok:!0,params:{target:t,task:n,title:h(e.title),repository:r,branch:i,isolation:o??`worktree`}}}function _(e,t){let n=`${f}${e}`,r=[];try{let e=window.localStorage.getItem(n),t=e?JSON.parse(e):null;Array.isArray(t)&&(r=t.filter(e=>typeof e==`string`))}catch{}if(r.includes(t))return!1;try{window.localStorage.setItem(n,JSON.stringify([...r,t]))}catch{}return!0}function v(e){let t=n.buildAgentCanvasPath(e);return typeof window>`u`?t:new URL(t,window.location.origin).toString()}function y(){let e=t.getCachedAgentServerVersion();if(!e)return null;let n=t.compareAgentServerVersions(e,a.MIN_AGENT_SERVER_VERSION_FOR_PARENT_LINK);return n===null||n>=0?null:`Agent server ${e} does not persist parent/child conversation links (needs ${a.MIN_AGENT_SERVER_VERSION_FOR_PARENT_LINK}); the child was created but is not linked to this conversation.`}var b=e=>!!(e?.selected_repository||e?.selected_workspace),x=`The child was launched in this conversation's directory instead, so it can see work in progress here and the two agents may conflict over the same files.`;async function S(e,t){let n=await l.default.resolveConversationWorkingDir(t),r=s.getStoredConversationMetadata(t),i=i=>l.default.createConversation(e.task,void 0,void 0,r?{selected_repository:r.selected_repository,selected_branch:r.selected_branch,git_provider:r.git_provider}:null,n,i===`shared`?`local_repo`:`new_worktree`,t),a=e.isolation,o=null;a===`worktree`&&!b(r)&&(a=`shared`,o=`This conversation's workspace is a scratch directory with no commits, which git cannot cut a worktree from. ${x}`);let c;try{c=await i(a)}catch(e){if(a!==`worktree`)throw e;try{c=await i(`shared`)}catch{throw e}a=`shared`,o=`Creating a git worktree in this conversation's workspace failed (${e instanceof Error?e.message:String(e)}). ${x}`}let u=c.app_conversation_id??c.id;e.title&&await l.default.updateConversationTitle(u,e.title).catch(()=>void 0);let d=y();return{status:`launched`,target:`local`,conversation_id:u,url:v(`/conversations/${u}`),initial_status:c.status,title:e.title,workspace:n,isolation:a,...o?{isolation_note:o}:{},parent_link:!d,...d?{parent_link_note:d}:{}}}var C=e=>new Promise(t=>{setTimeout(t,e)});async function w(e,t){let n=Date.now()+d,r=e;for(;!r.app_conversation_id&&r.status!==`ERROR`&&!(Date.now()>=n);){await C(u);let e=await c.getCloudAppConversationStartTask(r.id,t).catch(()=>null);if(!e)break;r=e}return r}async function T(e,t){let n=c.pickCloudBackendForLaunch();if(!n)return p(`No OpenHands Cloud backend is connected in Agent Canvas.`,`Ask the user to connect OpenHands Cloud from the backend picker, then call this tool again — or relaunch now with target="local".`);let r=s.getStoredConversationMetadata(t),i=await w(await c.createCloudAppConversation({initial_message:{role:`user`,content:[{type:`text`,text:e.task}]},title:e.title,selected_repository:e.repository??r?.selected_repository??null,selected_branch:e.branch??null,git_provider:e.repository?null:r?.git_provider??null,parent_conversation_id:null},n),n);if(i.status===`ERROR`)return p(i.detail||`The Cloud conversation failed to start.`,`The Cloud sandbox could not be provisioned. Report this to the user; you can retry, or fall back to target="local".`);let a=i.app_conversation_id;return{status:`launched`,target:`cloud`,conversation_id:a,url:a?`${n.host.replace(/\/$/,``)}/conversations/${a}`:null,initial_status:i.status,title:e.title,start_task_id:i.id,backend:n.name,parent_link:!1,parent_link_note:`This conversation runs on the local agent server, so OpenHands Cloud has no parent to link the child to.`}}async function E(t,n){n.status===`error`?i.displayErrorToast(r.default.t(e.I18nKey.CHILD_CONVERSATION$LAUNCH_FAILED,{error:n.error})):n.url&&i.displaySuccessToastWithLink(r.default.t(n.target===`cloud`?e.I18nKey.CHILD_CONVERSATION$LAUNCHED_CLOUD:e.I18nKey.CHILD_CONVERSATION$LAUNCHED_LOCAL),r.default.t(e.I18nKey.CHILD_CONVERSATION$OPEN),n.url),!o.useGoalStore.getState().statusByConversation[t]?.active&&await l.default.sendMessage(t,{role:`user`,content:[{type:`text`,text:`${a.CHILD_CONVERSATION_RESULT_PREFIX}${JSON.stringify(n)}`}]})}async function D(e,t,n){if(!_(t,n))return;let r=g(e),i;if(!r.ok)i=r.failure;else try{i=r.params.target===`cloud`?await T(r.params,t):await S(r.params,t)}catch(e){i=p(e instanceof Error?e.message:String(e),`The launch request failed. Report the error to the user; retry only if the cause looks transient.`)}await E(t,i).catch(e=>{console.warn(`[${a.LAUNCH_CHILD_CONVERSATION_TOOL_NAME}] Failed to report the launch result:`,e)})}exports.handleLaunchChildConversationAction=D;
2
+ //# sourceMappingURL=child-conversation-launch.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"child-conversation-launch.cjs","names":[],"sources":["../../src/services/child-conversation-launch.ts"],"sourcesContent":["import i18n from \"#/i18n\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport {\n compareAgentServerVersions,\n getCachedAgentServerVersion,\n} from \"#/api/agent-server-compatibility\";\nimport {\n createCloudAppConversation,\n getCloudAppConversationStartTask,\n pickCloudBackendForLaunch,\n} from \"#/api/cloud/conversation-service.api\";\nimport type { Backend } from \"#/api/backend-registry/types\";\nimport {\n getStoredConversationMetadata,\n type ConversationMetadata,\n} from \"#/api/conversation-metadata-store\";\nimport AgentServerConversationService from \"#/api/conversation-service/agent-server-conversation-service.api\";\nimport type { AppConversationStartTask } from \"#/api/conversation-service/agent-server-conversation-service.types\";\nimport {\n CHILD_CONVERSATION_ISOLATIONS,\n CHILD_CONVERSATION_RESULT_PREFIX,\n CHILD_CONVERSATION_TARGETS,\n LAUNCH_CHILD_CONVERSATION_TOOL_NAME,\n MIN_AGENT_SERVER_VERSION_FOR_PARENT_LINK,\n type ChildConversationIsolation,\n type ChildConversationTarget,\n} from \"#/constants/child-conversation\";\nimport { useGoalStore } from \"#/stores/goal-store\";\nimport type { LaunchChildConversationAction } from \"#/types/agent-server/core\";\nimport { buildAgentCanvasPath } from \"#/utils/base-path\";\nimport {\n displayErrorToast,\n displaySuccessToastWithLink,\n} from \"#/utils/custom-toast-handlers\";\n\n/** Cadence and ceiling for waiting on a Cloud sandbox to expose its id. */\nconst CLOUD_START_POLL_INTERVAL_MS = 3_000;\nconst CLOUD_START_POLL_TIMEOUT_MS = 180_000;\n\nconst LEDGER_STORAGE_KEY_PREFIX = \"openhands-child-conversation-launches:\";\n\ninterface LaunchSuccess {\n status: \"launched\";\n target: ChildConversationTarget;\n conversation_id: string | null;\n url: string | null;\n initial_status: string;\n title: string | null;\n /** Local only: the directory the child inherited from this conversation. */\n workspace?: string;\n /** Local only: which isolation mode was actually applied. */\n isolation?: ChildConversationIsolation;\n /**\n * Present when the applied isolation is not the one that was asked for,\n * explaining why and what it means for the child.\n */\n isolation_note?: string;\n /** Cloud only: poll this if `conversation_id` is still null. */\n start_task_id?: string;\n /** Cloud only: which connected Cloud backend the child was launched on. */\n backend?: string;\n /** Whether the parent/child link was persisted server-side. */\n parent_link: boolean;\n /** Present when `parent_link` is false, explaining why. */\n parent_link_note?: string;\n}\n\ninterface LaunchFailure {\n status: \"error\";\n error: string;\n guidance: string;\n}\n\nexport type LaunchChildConversationResult = LaunchSuccess | LaunchFailure;\n\ninterface ValidatedParams {\n target: ChildConversationTarget;\n task: string;\n title: string | null;\n repository: string | null;\n branch: string | null;\n isolation: ChildConversationIsolation;\n}\n\nconst failure = (error: string, guidance: string): LaunchFailure => ({\n status: \"error\",\n error,\n guidance,\n});\n\nconst quoted = (values: readonly string[]) =>\n values.map((value) => `\"${value}\"`).join(\" or \");\n\nconst blankToNull = (value: string | null | undefined) => {\n const trimmed = value?.trim();\n return trimmed ? trimmed : null;\n};\n\n/**\n * Validate what the agent-server cannot.\n *\n * The tool's JSON Schema is turned into a pydantic model with `extra=\"forbid\"`,\n * so unknown/misspelled parameter names, missing required parameters and wrong\n * types already fail server-side with a corrective message. `enum` is the gap:\n * the SDK advertises it to the LLM but drops it when building the model, so a\n * misspelled `target` reaches us intact and must be rejected here. The\n * cross-target rules (cloud-only / local-only parameters) are ours to enforce\n * too, since a schema cannot express them.\n */\nfunction validateLaunchParams(\n action: LaunchChildConversationAction,\n):\n | { ok: true; params: ValidatedParams }\n | { ok: false; failure: LaunchFailure } {\n const target = action.target as ChildConversationTarget;\n if (!CHILD_CONVERSATION_TARGETS.includes(target)) {\n return {\n ok: false,\n failure: failure(\n `Unknown target ${JSON.stringify(action.target)}.`,\n `\\`target\\` must be exactly ${quoted(CHILD_CONVERSATION_TARGETS)}. Nothing was launched — call ${LAUNCH_CHILD_CONVERSATION_TOOL_NAME} again with a valid target.`,\n ),\n };\n }\n\n const task = blankToNull(action.task);\n if (!task) {\n return {\n ok: false,\n failure: failure(\n \"`task` is empty.\",\n \"`task` must be a self-contained brief: the child conversation cannot see this one, so state the goal, constraints and expected output.\",\n ),\n };\n }\n\n const repository = blankToNull(action.repository);\n const branch = blankToNull(action.branch);\n const isolation = blankToNull(\n action.isolation,\n ) as ChildConversationIsolation | null;\n\n if (target === \"local\" && (repository || branch)) {\n return {\n ok: false,\n failure: failure(\n '`repository`/`branch` were passed with target=\"local\".',\n 'A local child always runs in this conversation\\'s workspace. Drop `repository` and `branch`, or use target=\"cloud\" to run against a repository in a Cloud sandbox.',\n ),\n };\n }\n\n if (target === \"cloud\" && isolation) {\n return {\n ok: false,\n failure: failure(\n '`isolation` was passed with target=\"cloud\".',\n 'Cloud children always run in their own isolated sandbox. Drop `isolation`, or use target=\"local\" to choose between \"worktree\" and \"shared\".',\n ),\n };\n }\n\n if (branch && !repository) {\n return {\n ok: false,\n failure: failure(\n \"`branch` was passed without `repository`.\",\n 'Pass `repository` as \"owner/repo\" alongside `branch`, or drop `branch` to use the repository\\'s default branch.',\n ),\n };\n }\n\n if (isolation && !CHILD_CONVERSATION_ISOLATIONS.includes(isolation)) {\n return {\n ok: false,\n failure: failure(\n `Unknown isolation ${JSON.stringify(action.isolation)}.`,\n `\\`isolation\\` must be exactly ${quoted(CHILD_CONVERSATION_ISOLATIONS)}. Nothing was launched — call ${LAUNCH_CHILD_CONVERSATION_TOOL_NAME} again with a valid isolation.`,\n ),\n };\n }\n\n return {\n ok: true,\n params: {\n target,\n task,\n title: blankToNull(action.title),\n repository,\n branch,\n isolation: isolation ?? \"worktree\",\n },\n };\n}\n\n/**\n * Remember which tool calls have already been acted on.\n *\n * Unlike the Canvas UI tool, a launch is not idempotent: replaying its\n * ActionEvent (a socket reconnect that falls back to `resend_mode: \"all\"`, or a\n * REST/WebSocket race after a reload) would start a second — on Cloud, billable\n * — conversation. Claim the tool call before any network work so a replay that\n * arrives mid-flight is dropped too.\n */\nfunction claimToolCall(parentConversationId: string, toolCallId: string) {\n const key = `${LEDGER_STORAGE_KEY_PREFIX}${parentConversationId}`;\n let handled: string[] = [];\n try {\n const raw = window.localStorage.getItem(key);\n const parsed: unknown = raw ? JSON.parse(raw) : null;\n if (Array.isArray(parsed)) {\n handled = parsed.filter((id): id is string => typeof id === \"string\");\n }\n } catch {\n // A corrupt ledger must not block the launch; start a fresh one.\n }\n\n if (handled.includes(toolCallId)) return false;\n\n try {\n window.localStorage.setItem(key, JSON.stringify([...handled, toolCallId]));\n } catch {\n // Storage full or unavailable — proceed, accepting replay risk over never\n // launching at all.\n }\n return true;\n}\n\nfunction absoluteCanvasUrl(path: string) {\n const canvasPath = buildAgentCanvasPath(path);\n if (typeof window === \"undefined\") return canvasPath;\n return new URL(canvasPath, window.location.origin).toString();\n}\n\n/**\n * `parent_conversation_id` on the local start request landed in agent-server\n * 1.37.1. Older servers ignore unknown fields, so the child is created without\n * the link — report that rather than letting the agent assume a relationship\n * that does not exist.\n */\nfunction localParentLinkNote(): string | null {\n const version = getCachedAgentServerVersion();\n if (!version) return null;\n const comparison = compareAgentServerVersions(\n version,\n MIN_AGENT_SERVER_VERSION_FOR_PARENT_LINK,\n );\n if (comparison === null || comparison >= 0) return null;\n return `Agent server ${version} does not persist parent/child conversation links (needs ${MIN_AGENT_SERVER_VERSION_FOR_PARENT_LINK}); the child was created but is not linked to this conversation.`;\n}\n\n/**\n * Whether the parent's workspace can host a git worktree.\n *\n * A conversation started without a repository or an attached workspace runs in\n * a scratch directory that is `git init`-ed but never committed to. `git\n * worktree add` cannot branch from an unborn HEAD, and the agent-server raises\n * the resulting error straight out of its start-conversation handler as a 500,\n * so asking for a worktree there fails the whole launch. Conversation metadata\n * is only persisted when a repository or an explicit workspace was chosen (see\n * `createConversation`), so its absence pinpoints exactly those scratch\n * workspaces. Anything else is attempted and falls back on failure, because the\n * frontend cannot inspect the workspace's git state directly.\n */\nconst parentSupportsWorktree = (\n metadata: ConversationMetadata | null,\n): boolean => !!(metadata?.selected_repository || metadata?.selected_workspace);\n\nconst SHARED_FALLBACK_CONSEQUENCE =\n \"The child was launched in this conversation's directory instead, so it can see work in progress here and the two agents may conflict over the same files.\";\n\nasync function launchLocalChild(\n params: ValidatedParams,\n parentConversationId: string,\n): Promise<LaunchChildConversationResult> {\n // The agent-server rejects a parent whose workspace differs from the child's,\n // so the child requests the parent's own directory. `worktree` then carves an\n // isolated worktree out of it, which is what keeps siblings from colliding.\n const workspace =\n await AgentServerConversationService.resolveConversationWorkingDir(\n parentConversationId,\n );\n const parentMetadata = getStoredConversationMetadata(parentConversationId);\n\n const createChild = (isolation: ChildConversationIsolation) =>\n AgentServerConversationService.createConversation(\n params.task,\n undefined,\n undefined,\n parentMetadata\n ? {\n selected_repository: parentMetadata.selected_repository,\n selected_branch: parentMetadata.selected_branch,\n git_provider: parentMetadata.git_provider,\n }\n : null,\n workspace,\n isolation === \"shared\" ? \"local_repo\" : \"new_worktree\",\n parentConversationId,\n );\n\n let isolation = params.isolation;\n let isolationNote: string | null = null;\n\n if (isolation === \"worktree\" && !parentSupportsWorktree(parentMetadata)) {\n isolation = \"shared\";\n isolationNote = `This conversation's workspace is a scratch directory with no commits, which git cannot cut a worktree from. ${SHARED_FALLBACK_CONSEQUENCE}`;\n }\n\n let startTask;\n try {\n startTask = await createChild(isolation);\n } catch (worktreeError) {\n if (isolation !== \"worktree\") throw worktreeError;\n // Creating the worktree is the one part of a local launch that can fail on\n // an otherwise healthy workspace, so retry without it rather than losing\n // the launch. Anything else fails both attempts and is reported as-is.\n try {\n startTask = await createChild(\"shared\");\n } catch {\n throw worktreeError;\n }\n isolation = \"shared\";\n isolationNote = `Creating a git worktree in this conversation's workspace failed (${worktreeError instanceof Error ? worktreeError.message : String(worktreeError)}). ${SHARED_FALLBACK_CONSEQUENCE}`;\n }\n\n const conversationId = startTask.app_conversation_id ?? startTask.id;\n\n if (params.title) {\n // Local start requests carry no title — only `autotitle`. Best effort: a\n // failed rename must not fail the launch.\n await AgentServerConversationService.updateConversationTitle(\n conversationId,\n params.title,\n ).catch(() => undefined);\n }\n\n const parentLinkNote = localParentLinkNote();\n return {\n status: \"launched\",\n target: \"local\",\n conversation_id: conversationId,\n url: absoluteCanvasUrl(`/conversations/${conversationId}`),\n initial_status: startTask.status,\n title: params.title,\n workspace,\n isolation,\n ...(isolationNote ? { isolation_note: isolationNote } : {}),\n parent_link: !parentLinkNote,\n ...(parentLinkNote ? { parent_link_note: parentLinkNote } : {}),\n };\n}\n\nconst delay = (ms: number) =>\n new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n\n/**\n * Wait for the Cloud start task to expose its conversation id.\n *\n * The Cloud API provisions a sandbox asynchronously and only fills in\n * `app_conversation_id` once the task reaches READY, so without this the agent\n * would get a result with no conversation to open. Bounded: on timeout the\n * caller reports the still-provisioning task instead of hanging.\n */\nasync function waitForCloudConversationId(\n task: AppConversationStartTask,\n backend: Backend,\n): Promise<AppConversationStartTask> {\n const deadline = Date.now() + CLOUD_START_POLL_TIMEOUT_MS;\n let latest = task;\n while (!latest.app_conversation_id && latest.status !== \"ERROR\") {\n if (Date.now() >= deadline) break;\n\n await delay(CLOUD_START_POLL_INTERVAL_MS);\n\n const next = await getCloudAppConversationStartTask(\n latest.id,\n backend,\n ).catch(() => null);\n if (!next) break;\n latest = next;\n }\n return latest;\n}\n\nasync function launchCloudChild(\n params: ValidatedParams,\n parentConversationId: string,\n): Promise<LaunchChildConversationResult> {\n const backend = pickCloudBackendForLaunch();\n if (!backend) {\n return failure(\n \"No OpenHands Cloud backend is connected in Agent Canvas.\",\n 'Ask the user to connect OpenHands Cloud from the backend picker, then call this tool again — or relaunch now with target=\"local\".',\n );\n }\n\n const parentMetadata = getStoredConversationMetadata(parentConversationId);\n const startTask = await createCloudAppConversation(\n {\n initial_message: {\n role: \"user\",\n content: [{ type: \"text\", text: params.task }],\n },\n title: params.title,\n // Fall back to this conversation's repository so a bare `target: \"cloud\"`\n // call still lands the child on the code the user is working on. The\n // provider only travels with the inherited repository — it may not apply\n // to one the agent named itself.\n selected_repository:\n params.repository ?? parentMetadata?.selected_repository ?? null,\n selected_branch: params.branch ?? null,\n git_provider: params.repository\n ? null\n : (parentMetadata?.git_provider ?? null),\n // The parent runs on the local agent-server, so its id means nothing to\n // Cloud. Sending it would only hide the child from the Cloud\n // conversation list, which filters out anything with a parent.\n parent_conversation_id: null,\n },\n backend,\n );\n\n const settled = await waitForCloudConversationId(startTask, backend);\n if (settled.status === \"ERROR\") {\n return failure(\n settled.detail || \"The Cloud conversation failed to start.\",\n 'The Cloud sandbox could not be provisioned. Report this to the user; you can retry, or fall back to target=\"local\".',\n );\n }\n\n const conversationId = settled.app_conversation_id;\n return {\n status: \"launched\",\n target: \"cloud\",\n conversation_id: conversationId,\n url: conversationId\n ? `${backend.host.replace(/\\/$/, \"\")}/conversations/${conversationId}`\n : null,\n initial_status: settled.status,\n title: params.title,\n start_task_id: settled.id,\n backend: backend.name,\n // Cloud children of a local parent carry no server-side link; see above.\n parent_link: false,\n parent_link_note:\n \"This conversation runs on the local agent server, so OpenHands Cloud has no parent to link the child to.\",\n };\n}\n\n/**\n * Hand the outcome back to the agent and the user.\n *\n * Client tools are acknowledged by the agent-server before the browser does any\n * work, so a message is the only way to give the agent the child's id or tell\n * it how to fix a malformed call. `sendMessage` runs the agent, which is what\n * makes it relay the result to the user in its next turn.\n */\nasync function reportLaunchResult(\n parentConversationId: string,\n result: LaunchChildConversationResult,\n) {\n if (result.status === \"error\") {\n displayErrorToast(\n i18n.t(I18nKey.CHILD_CONVERSATION$LAUNCH_FAILED, {\n error: result.error,\n }),\n );\n } else if (result.url) {\n displaySuccessToastWithLink(\n i18n.t(\n result.target === \"cloud\"\n ? I18nKey.CHILD_CONVERSATION$LAUNCHED_CLOUD\n : I18nKey.CHILD_CONVERSATION$LAUNCHED_LOCAL,\n ),\n i18n.t(I18nKey.CHILD_CONVERSATION$OPEN),\n result.url,\n );\n }\n\n // The agent-server cancels an active `/goal` loop on any inbound message, so\n // a launch must not silently end one. The toast above still tells the user\n // what happened.\n const goalStatus =\n useGoalStore.getState().statusByConversation[parentConversationId];\n if (goalStatus?.active) return;\n\n await AgentServerConversationService.sendMessage(parentConversationId, {\n role: \"user\",\n content: [\n {\n type: \"text\",\n text: `${CHILD_CONVERSATION_RESULT_PREFIX}${JSON.stringify(result)}`,\n },\n ],\n });\n}\n\n/**\n * Execute a `launch_child_conversation` tool call.\n *\n * Never rejects: every failure is turned into corrective guidance for the\n * agent, because the agent-server has already told it the call succeeded.\n */\nexport async function handleLaunchChildConversationAction(\n action: LaunchChildConversationAction,\n parentConversationId: string,\n toolCallId: string,\n): Promise<void> {\n if (!claimToolCall(parentConversationId, toolCallId)) return;\n\n const validation = validateLaunchParams(action);\n let result: LaunchChildConversationResult;\n if (!validation.ok) {\n result = validation.failure;\n } else {\n try {\n result =\n validation.params.target === \"cloud\"\n ? await launchCloudChild(validation.params, parentConversationId)\n : await launchLocalChild(validation.params, parentConversationId);\n } catch (error) {\n result = failure(\n error instanceof Error ? error.message : String(error),\n \"The launch request failed. Report the error to the user; retry only if the cause looks transient.\",\n );\n }\n }\n\n await reportLaunchResult(parentConversationId, result).catch((error) => {\n console.warn(\n `[${LAUNCH_CHILD_CONVERSATION_TOOL_NAME}] Failed to report the launch result:`,\n error,\n );\n });\n}\n"],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { type ChildConversationIsolation, type ChildConversationTarget } from "#/constants/child-conversation";
2
+ import type { LaunchChildConversationAction } from "#/types/agent-server/core";
3
+ interface LaunchSuccess {
4
+ status: "launched";
5
+ target: ChildConversationTarget;
6
+ conversation_id: string | null;
7
+ url: string | null;
8
+ initial_status: string;
9
+ title: string | null;
10
+ /** Local only: the directory the child inherited from this conversation. */
11
+ workspace?: string;
12
+ /** Local only: which isolation mode was actually applied. */
13
+ isolation?: ChildConversationIsolation;
14
+ /**
15
+ * Present when the applied isolation is not the one that was asked for,
16
+ * explaining why and what it means for the child.
17
+ */
18
+ isolation_note?: string;
19
+ /** Cloud only: poll this if `conversation_id` is still null. */
20
+ start_task_id?: string;
21
+ /** Cloud only: which connected Cloud backend the child was launched on. */
22
+ backend?: string;
23
+ /** Whether the parent/child link was persisted server-side. */
24
+ parent_link: boolean;
25
+ /** Present when `parent_link` is false, explaining why. */
26
+ parent_link_note?: string;
27
+ }
28
+ interface LaunchFailure {
29
+ status: "error";
30
+ error: string;
31
+ guidance: string;
32
+ }
33
+ export type LaunchChildConversationResult = LaunchSuccess | LaunchFailure;
34
+ /**
35
+ * Execute a `launch_child_conversation` tool call.
36
+ *
37
+ * Never rejects: every failure is turned into corrective guidance for the
38
+ * agent, because the agent-server has already told it the call succeeded.
39
+ */
40
+ export declare function handleLaunchChildConversationAction(action: LaunchChildConversationAction, parentConversationId: string, toolCallId: string): Promise<void>;
41
+ export {};
@@ -0,0 +1,182 @@
1
+ import { I18nKey as e } from "../i18n/declaration.js";
2
+ import { compareAgentServerVersions as t, getCachedAgentServerVersion as n } from "../api/agent-server-compatibility.js";
3
+ import { buildAgentCanvasPath as r } from "../utils/base-path.js";
4
+ import i from "../i18n/index.js";
5
+ import { displayErrorToast as a, displaySuccessToastWithLink as o } from "../utils/custom-toast-handlers.js";
6
+ import { CHILD_CONVERSATION_ISOLATIONS as s, CHILD_CONVERSATION_RESULT_PREFIX as c, CHILD_CONVERSATION_TARGETS as l, LAUNCH_CHILD_CONVERSATION_TOOL_NAME as u, MIN_AGENT_SERVER_VERSION_FOR_PARENT_LINK as d } from "../constants/child-conversation.js";
7
+ import { useGoalStore as f } from "../stores/goal-store.js";
8
+ import { getStoredConversationMetadata as p } from "../api/conversation-metadata-store.js";
9
+ import { createCloudAppConversation as m, getCloudAppConversationStartTask as h, pickCloudBackendForLaunch as g } from "../api/cloud/conversation-service.api.js";
10
+ import _ from "../api/conversation-service/agent-server-conversation-service.api.js";
11
+ //#region src/services/child-conversation-launch.ts
12
+ var v = 3e3, y = 18e4, b = "openhands-child-conversation-launches:", x = (e, t) => ({
13
+ status: "error",
14
+ error: e,
15
+ guidance: t
16
+ }), S = (e) => e.map((e) => `"${e}"`).join(" or "), C = (e) => e?.trim() || null;
17
+ function w(e) {
18
+ let t = e.target;
19
+ if (!l.includes(t)) return {
20
+ ok: !1,
21
+ failure: x(`Unknown target ${JSON.stringify(e.target)}.`, `\`target\` must be exactly ${S(l)}. Nothing was launched — call ${u} again with a valid target.`)
22
+ };
23
+ let n = C(e.task);
24
+ if (!n) return {
25
+ ok: !1,
26
+ failure: x("`task` is empty.", "`task` must be a self-contained brief: the child conversation cannot see this one, so state the goal, constraints and expected output.")
27
+ };
28
+ let r = C(e.repository), i = C(e.branch), a = C(e.isolation);
29
+ return t === "local" && (r || i) ? {
30
+ ok: !1,
31
+ failure: x("`repository`/`branch` were passed with target=\"local\".", "A local child always runs in this conversation's workspace. Drop `repository` and `branch`, or use target=\"cloud\" to run against a repository in a Cloud sandbox.")
32
+ } : t === "cloud" && a ? {
33
+ ok: !1,
34
+ failure: x("`isolation` was passed with target=\"cloud\".", "Cloud children always run in their own isolated sandbox. Drop `isolation`, or use target=\"local\" to choose between \"worktree\" and \"shared\".")
35
+ } : i && !r ? {
36
+ ok: !1,
37
+ failure: x("`branch` was passed without `repository`.", "Pass `repository` as \"owner/repo\" alongside `branch`, or drop `branch` to use the repository's default branch.")
38
+ } : a && !s.includes(a) ? {
39
+ ok: !1,
40
+ failure: x(`Unknown isolation ${JSON.stringify(e.isolation)}.`, `\`isolation\` must be exactly ${S(s)}. Nothing was launched — call ${u} again with a valid isolation.`)
41
+ } : {
42
+ ok: !0,
43
+ params: {
44
+ target: t,
45
+ task: n,
46
+ title: C(e.title),
47
+ repository: r,
48
+ branch: i,
49
+ isolation: a ?? "worktree"
50
+ }
51
+ };
52
+ }
53
+ function T(e, t) {
54
+ let n = `${b}${e}`, r = [];
55
+ try {
56
+ let e = window.localStorage.getItem(n), t = e ? JSON.parse(e) : null;
57
+ Array.isArray(t) && (r = t.filter((e) => typeof e == "string"));
58
+ } catch {}
59
+ if (r.includes(t)) return !1;
60
+ try {
61
+ window.localStorage.setItem(n, JSON.stringify([...r, t]));
62
+ } catch {}
63
+ return !0;
64
+ }
65
+ function E(e) {
66
+ let t = r(e);
67
+ return typeof window > "u" ? t : new URL(t, window.location.origin).toString();
68
+ }
69
+ function D() {
70
+ let e = n();
71
+ if (!e) return null;
72
+ let r = t(e, d);
73
+ return r === null || r >= 0 ? null : `Agent server ${e} does not persist parent/child conversation links (needs ${d}); the child was created but is not linked to this conversation.`;
74
+ }
75
+ var O = (e) => !!(e?.selected_repository || e?.selected_workspace), k = "The child was launched in this conversation's directory instead, so it can see work in progress here and the two agents may conflict over the same files.";
76
+ async function A(e, t) {
77
+ let n = await _.resolveConversationWorkingDir(t), r = p(t), i = (i) => _.createConversation(e.task, void 0, void 0, r ? {
78
+ selected_repository: r.selected_repository,
79
+ selected_branch: r.selected_branch,
80
+ git_provider: r.git_provider
81
+ } : null, n, i === "shared" ? "local_repo" : "new_worktree", t), a = e.isolation, o = null;
82
+ a === "worktree" && !O(r) && (a = "shared", o = `This conversation's workspace is a scratch directory with no commits, which git cannot cut a worktree from. ${k}`);
83
+ let s;
84
+ try {
85
+ s = await i(a);
86
+ } catch (e) {
87
+ if (a !== "worktree") throw e;
88
+ try {
89
+ s = await i("shared");
90
+ } catch {
91
+ throw e;
92
+ }
93
+ a = "shared", o = `Creating a git worktree in this conversation's workspace failed (${e instanceof Error ? e.message : String(e)}). ${k}`;
94
+ }
95
+ let c = s.app_conversation_id ?? s.id;
96
+ e.title && await _.updateConversationTitle(c, e.title).catch(() => void 0);
97
+ let l = D();
98
+ return {
99
+ status: "launched",
100
+ target: "local",
101
+ conversation_id: c,
102
+ url: E(`/conversations/${c}`),
103
+ initial_status: s.status,
104
+ title: e.title,
105
+ workspace: n,
106
+ isolation: a,
107
+ ...o ? { isolation_note: o } : {},
108
+ parent_link: !l,
109
+ ...l ? { parent_link_note: l } : {}
110
+ };
111
+ }
112
+ var j = (e) => new Promise((t) => {
113
+ setTimeout(t, e);
114
+ });
115
+ async function M(e, t) {
116
+ let n = Date.now() + y, r = e;
117
+ for (; !r.app_conversation_id && r.status !== "ERROR" && !(Date.now() >= n);) {
118
+ await j(v);
119
+ let e = await h(r.id, t).catch(() => null);
120
+ if (!e) break;
121
+ r = e;
122
+ }
123
+ return r;
124
+ }
125
+ async function N(e, t) {
126
+ let n = g();
127
+ if (!n) return x("No OpenHands Cloud backend is connected in Agent Canvas.", "Ask the user to connect OpenHands Cloud from the backend picker, then call this tool again — or relaunch now with target=\"local\".");
128
+ let r = p(t), i = await M(await m({
129
+ initial_message: {
130
+ role: "user",
131
+ content: [{
132
+ type: "text",
133
+ text: e.task
134
+ }]
135
+ },
136
+ title: e.title,
137
+ selected_repository: e.repository ?? r?.selected_repository ?? null,
138
+ selected_branch: e.branch ?? null,
139
+ git_provider: e.repository ? null : r?.git_provider ?? null,
140
+ parent_conversation_id: null
141
+ }, n), n);
142
+ if (i.status === "ERROR") return x(i.detail || "The Cloud conversation failed to start.", "The Cloud sandbox could not be provisioned. Report this to the user; you can retry, or fall back to target=\"local\".");
143
+ let a = i.app_conversation_id;
144
+ return {
145
+ status: "launched",
146
+ target: "cloud",
147
+ conversation_id: a,
148
+ url: a ? `${n.host.replace(/\/$/, "")}/conversations/${a}` : null,
149
+ initial_status: i.status,
150
+ title: e.title,
151
+ start_task_id: i.id,
152
+ backend: n.name,
153
+ parent_link: !1,
154
+ parent_link_note: "This conversation runs on the local agent server, so OpenHands Cloud has no parent to link the child to."
155
+ };
156
+ }
157
+ async function P(t, n) {
158
+ n.status === "error" ? a(i.t(e.CHILD_CONVERSATION$LAUNCH_FAILED, { error: n.error })) : n.url && o(i.t(n.target === "cloud" ? e.CHILD_CONVERSATION$LAUNCHED_CLOUD : e.CHILD_CONVERSATION$LAUNCHED_LOCAL), i.t(e.CHILD_CONVERSATION$OPEN), n.url), !f.getState().statusByConversation[t]?.active && await _.sendMessage(t, {
159
+ role: "user",
160
+ content: [{
161
+ type: "text",
162
+ text: `${c}${JSON.stringify(n)}`
163
+ }]
164
+ });
165
+ }
166
+ async function F(e, t, n) {
167
+ if (!T(t, n)) return;
168
+ let r = w(e), i;
169
+ if (!r.ok) i = r.failure;
170
+ else try {
171
+ i = r.params.target === "cloud" ? await N(r.params, t) : await A(r.params, t);
172
+ } catch (e) {
173
+ i = x(e instanceof Error ? e.message : String(e), "The launch request failed. Report the error to the user; retry only if the cause looks transient.");
174
+ }
175
+ await P(t, i).catch((e) => {
176
+ console.warn(`[${u}] Failed to report the launch result:`, e);
177
+ });
178
+ }
179
+ //#endregion
180
+ export { F as handleLaunchChildConversationAction };
181
+
182
+ //# sourceMappingURL=child-conversation-launch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"child-conversation-launch.js","names":[],"sources":["../../src/services/child-conversation-launch.ts"],"sourcesContent":["import i18n from \"#/i18n\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport {\n compareAgentServerVersions,\n getCachedAgentServerVersion,\n} from \"#/api/agent-server-compatibility\";\nimport {\n createCloudAppConversation,\n getCloudAppConversationStartTask,\n pickCloudBackendForLaunch,\n} from \"#/api/cloud/conversation-service.api\";\nimport type { Backend } from \"#/api/backend-registry/types\";\nimport {\n getStoredConversationMetadata,\n type ConversationMetadata,\n} from \"#/api/conversation-metadata-store\";\nimport AgentServerConversationService from \"#/api/conversation-service/agent-server-conversation-service.api\";\nimport type { AppConversationStartTask } from \"#/api/conversation-service/agent-server-conversation-service.types\";\nimport {\n CHILD_CONVERSATION_ISOLATIONS,\n CHILD_CONVERSATION_RESULT_PREFIX,\n CHILD_CONVERSATION_TARGETS,\n LAUNCH_CHILD_CONVERSATION_TOOL_NAME,\n MIN_AGENT_SERVER_VERSION_FOR_PARENT_LINK,\n type ChildConversationIsolation,\n type ChildConversationTarget,\n} from \"#/constants/child-conversation\";\nimport { useGoalStore } from \"#/stores/goal-store\";\nimport type { LaunchChildConversationAction } from \"#/types/agent-server/core\";\nimport { buildAgentCanvasPath } from \"#/utils/base-path\";\nimport {\n displayErrorToast,\n displaySuccessToastWithLink,\n} from \"#/utils/custom-toast-handlers\";\n\n/** Cadence and ceiling for waiting on a Cloud sandbox to expose its id. */\nconst CLOUD_START_POLL_INTERVAL_MS = 3_000;\nconst CLOUD_START_POLL_TIMEOUT_MS = 180_000;\n\nconst LEDGER_STORAGE_KEY_PREFIX = \"openhands-child-conversation-launches:\";\n\ninterface LaunchSuccess {\n status: \"launched\";\n target: ChildConversationTarget;\n conversation_id: string | null;\n url: string | null;\n initial_status: string;\n title: string | null;\n /** Local only: the directory the child inherited from this conversation. */\n workspace?: string;\n /** Local only: which isolation mode was actually applied. */\n isolation?: ChildConversationIsolation;\n /**\n * Present when the applied isolation is not the one that was asked for,\n * explaining why and what it means for the child.\n */\n isolation_note?: string;\n /** Cloud only: poll this if `conversation_id` is still null. */\n start_task_id?: string;\n /** Cloud only: which connected Cloud backend the child was launched on. */\n backend?: string;\n /** Whether the parent/child link was persisted server-side. */\n parent_link: boolean;\n /** Present when `parent_link` is false, explaining why. */\n parent_link_note?: string;\n}\n\ninterface LaunchFailure {\n status: \"error\";\n error: string;\n guidance: string;\n}\n\nexport type LaunchChildConversationResult = LaunchSuccess | LaunchFailure;\n\ninterface ValidatedParams {\n target: ChildConversationTarget;\n task: string;\n title: string | null;\n repository: string | null;\n branch: string | null;\n isolation: ChildConversationIsolation;\n}\n\nconst failure = (error: string, guidance: string): LaunchFailure => ({\n status: \"error\",\n error,\n guidance,\n});\n\nconst quoted = (values: readonly string[]) =>\n values.map((value) => `\"${value}\"`).join(\" or \");\n\nconst blankToNull = (value: string | null | undefined) => {\n const trimmed = value?.trim();\n return trimmed ? trimmed : null;\n};\n\n/**\n * Validate what the agent-server cannot.\n *\n * The tool's JSON Schema is turned into a pydantic model with `extra=\"forbid\"`,\n * so unknown/misspelled parameter names, missing required parameters and wrong\n * types already fail server-side with a corrective message. `enum` is the gap:\n * the SDK advertises it to the LLM but drops it when building the model, so a\n * misspelled `target` reaches us intact and must be rejected here. The\n * cross-target rules (cloud-only / local-only parameters) are ours to enforce\n * too, since a schema cannot express them.\n */\nfunction validateLaunchParams(\n action: LaunchChildConversationAction,\n):\n | { ok: true; params: ValidatedParams }\n | { ok: false; failure: LaunchFailure } {\n const target = action.target as ChildConversationTarget;\n if (!CHILD_CONVERSATION_TARGETS.includes(target)) {\n return {\n ok: false,\n failure: failure(\n `Unknown target ${JSON.stringify(action.target)}.`,\n `\\`target\\` must be exactly ${quoted(CHILD_CONVERSATION_TARGETS)}. Nothing was launched — call ${LAUNCH_CHILD_CONVERSATION_TOOL_NAME} again with a valid target.`,\n ),\n };\n }\n\n const task = blankToNull(action.task);\n if (!task) {\n return {\n ok: false,\n failure: failure(\n \"`task` is empty.\",\n \"`task` must be a self-contained brief: the child conversation cannot see this one, so state the goal, constraints and expected output.\",\n ),\n };\n }\n\n const repository = blankToNull(action.repository);\n const branch = blankToNull(action.branch);\n const isolation = blankToNull(\n action.isolation,\n ) as ChildConversationIsolation | null;\n\n if (target === \"local\" && (repository || branch)) {\n return {\n ok: false,\n failure: failure(\n '`repository`/`branch` were passed with target=\"local\".',\n 'A local child always runs in this conversation\\'s workspace. Drop `repository` and `branch`, or use target=\"cloud\" to run against a repository in a Cloud sandbox.',\n ),\n };\n }\n\n if (target === \"cloud\" && isolation) {\n return {\n ok: false,\n failure: failure(\n '`isolation` was passed with target=\"cloud\".',\n 'Cloud children always run in their own isolated sandbox. Drop `isolation`, or use target=\"local\" to choose between \"worktree\" and \"shared\".',\n ),\n };\n }\n\n if (branch && !repository) {\n return {\n ok: false,\n failure: failure(\n \"`branch` was passed without `repository`.\",\n 'Pass `repository` as \"owner/repo\" alongside `branch`, or drop `branch` to use the repository\\'s default branch.',\n ),\n };\n }\n\n if (isolation && !CHILD_CONVERSATION_ISOLATIONS.includes(isolation)) {\n return {\n ok: false,\n failure: failure(\n `Unknown isolation ${JSON.stringify(action.isolation)}.`,\n `\\`isolation\\` must be exactly ${quoted(CHILD_CONVERSATION_ISOLATIONS)}. Nothing was launched — call ${LAUNCH_CHILD_CONVERSATION_TOOL_NAME} again with a valid isolation.`,\n ),\n };\n }\n\n return {\n ok: true,\n params: {\n target,\n task,\n title: blankToNull(action.title),\n repository,\n branch,\n isolation: isolation ?? \"worktree\",\n },\n };\n}\n\n/**\n * Remember which tool calls have already been acted on.\n *\n * Unlike the Canvas UI tool, a launch is not idempotent: replaying its\n * ActionEvent (a socket reconnect that falls back to `resend_mode: \"all\"`, or a\n * REST/WebSocket race after a reload) would start a second — on Cloud, billable\n * — conversation. Claim the tool call before any network work so a replay that\n * arrives mid-flight is dropped too.\n */\nfunction claimToolCall(parentConversationId: string, toolCallId: string) {\n const key = `${LEDGER_STORAGE_KEY_PREFIX}${parentConversationId}`;\n let handled: string[] = [];\n try {\n const raw = window.localStorage.getItem(key);\n const parsed: unknown = raw ? JSON.parse(raw) : null;\n if (Array.isArray(parsed)) {\n handled = parsed.filter((id): id is string => typeof id === \"string\");\n }\n } catch {\n // A corrupt ledger must not block the launch; start a fresh one.\n }\n\n if (handled.includes(toolCallId)) return false;\n\n try {\n window.localStorage.setItem(key, JSON.stringify([...handled, toolCallId]));\n } catch {\n // Storage full or unavailable — proceed, accepting replay risk over never\n // launching at all.\n }\n return true;\n}\n\nfunction absoluteCanvasUrl(path: string) {\n const canvasPath = buildAgentCanvasPath(path);\n if (typeof window === \"undefined\") return canvasPath;\n return new URL(canvasPath, window.location.origin).toString();\n}\n\n/**\n * `parent_conversation_id` on the local start request landed in agent-server\n * 1.37.1. Older servers ignore unknown fields, so the child is created without\n * the link — report that rather than letting the agent assume a relationship\n * that does not exist.\n */\nfunction localParentLinkNote(): string | null {\n const version = getCachedAgentServerVersion();\n if (!version) return null;\n const comparison = compareAgentServerVersions(\n version,\n MIN_AGENT_SERVER_VERSION_FOR_PARENT_LINK,\n );\n if (comparison === null || comparison >= 0) return null;\n return `Agent server ${version} does not persist parent/child conversation links (needs ${MIN_AGENT_SERVER_VERSION_FOR_PARENT_LINK}); the child was created but is not linked to this conversation.`;\n}\n\n/**\n * Whether the parent's workspace can host a git worktree.\n *\n * A conversation started without a repository or an attached workspace runs in\n * a scratch directory that is `git init`-ed but never committed to. `git\n * worktree add` cannot branch from an unborn HEAD, and the agent-server raises\n * the resulting error straight out of its start-conversation handler as a 500,\n * so asking for a worktree there fails the whole launch. Conversation metadata\n * is only persisted when a repository or an explicit workspace was chosen (see\n * `createConversation`), so its absence pinpoints exactly those scratch\n * workspaces. Anything else is attempted and falls back on failure, because the\n * frontend cannot inspect the workspace's git state directly.\n */\nconst parentSupportsWorktree = (\n metadata: ConversationMetadata | null,\n): boolean => !!(metadata?.selected_repository || metadata?.selected_workspace);\n\nconst SHARED_FALLBACK_CONSEQUENCE =\n \"The child was launched in this conversation's directory instead, so it can see work in progress here and the two agents may conflict over the same files.\";\n\nasync function launchLocalChild(\n params: ValidatedParams,\n parentConversationId: string,\n): Promise<LaunchChildConversationResult> {\n // The agent-server rejects a parent whose workspace differs from the child's,\n // so the child requests the parent's own directory. `worktree` then carves an\n // isolated worktree out of it, which is what keeps siblings from colliding.\n const workspace =\n await AgentServerConversationService.resolveConversationWorkingDir(\n parentConversationId,\n );\n const parentMetadata = getStoredConversationMetadata(parentConversationId);\n\n const createChild = (isolation: ChildConversationIsolation) =>\n AgentServerConversationService.createConversation(\n params.task,\n undefined,\n undefined,\n parentMetadata\n ? {\n selected_repository: parentMetadata.selected_repository,\n selected_branch: parentMetadata.selected_branch,\n git_provider: parentMetadata.git_provider,\n }\n : null,\n workspace,\n isolation === \"shared\" ? \"local_repo\" : \"new_worktree\",\n parentConversationId,\n );\n\n let isolation = params.isolation;\n let isolationNote: string | null = null;\n\n if (isolation === \"worktree\" && !parentSupportsWorktree(parentMetadata)) {\n isolation = \"shared\";\n isolationNote = `This conversation's workspace is a scratch directory with no commits, which git cannot cut a worktree from. ${SHARED_FALLBACK_CONSEQUENCE}`;\n }\n\n let startTask;\n try {\n startTask = await createChild(isolation);\n } catch (worktreeError) {\n if (isolation !== \"worktree\") throw worktreeError;\n // Creating the worktree is the one part of a local launch that can fail on\n // an otherwise healthy workspace, so retry without it rather than losing\n // the launch. Anything else fails both attempts and is reported as-is.\n try {\n startTask = await createChild(\"shared\");\n } catch {\n throw worktreeError;\n }\n isolation = \"shared\";\n isolationNote = `Creating a git worktree in this conversation's workspace failed (${worktreeError instanceof Error ? worktreeError.message : String(worktreeError)}). ${SHARED_FALLBACK_CONSEQUENCE}`;\n }\n\n const conversationId = startTask.app_conversation_id ?? startTask.id;\n\n if (params.title) {\n // Local start requests carry no title — only `autotitle`. Best effort: a\n // failed rename must not fail the launch.\n await AgentServerConversationService.updateConversationTitle(\n conversationId,\n params.title,\n ).catch(() => undefined);\n }\n\n const parentLinkNote = localParentLinkNote();\n return {\n status: \"launched\",\n target: \"local\",\n conversation_id: conversationId,\n url: absoluteCanvasUrl(`/conversations/${conversationId}`),\n initial_status: startTask.status,\n title: params.title,\n workspace,\n isolation,\n ...(isolationNote ? { isolation_note: isolationNote } : {}),\n parent_link: !parentLinkNote,\n ...(parentLinkNote ? { parent_link_note: parentLinkNote } : {}),\n };\n}\n\nconst delay = (ms: number) =>\n new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n\n/**\n * Wait for the Cloud start task to expose its conversation id.\n *\n * The Cloud API provisions a sandbox asynchronously and only fills in\n * `app_conversation_id` once the task reaches READY, so without this the agent\n * would get a result with no conversation to open. Bounded: on timeout the\n * caller reports the still-provisioning task instead of hanging.\n */\nasync function waitForCloudConversationId(\n task: AppConversationStartTask,\n backend: Backend,\n): Promise<AppConversationStartTask> {\n const deadline = Date.now() + CLOUD_START_POLL_TIMEOUT_MS;\n let latest = task;\n while (!latest.app_conversation_id && latest.status !== \"ERROR\") {\n if (Date.now() >= deadline) break;\n\n await delay(CLOUD_START_POLL_INTERVAL_MS);\n\n const next = await getCloudAppConversationStartTask(\n latest.id,\n backend,\n ).catch(() => null);\n if (!next) break;\n latest = next;\n }\n return latest;\n}\n\nasync function launchCloudChild(\n params: ValidatedParams,\n parentConversationId: string,\n): Promise<LaunchChildConversationResult> {\n const backend = pickCloudBackendForLaunch();\n if (!backend) {\n return failure(\n \"No OpenHands Cloud backend is connected in Agent Canvas.\",\n 'Ask the user to connect OpenHands Cloud from the backend picker, then call this tool again — or relaunch now with target=\"local\".',\n );\n }\n\n const parentMetadata = getStoredConversationMetadata(parentConversationId);\n const startTask = await createCloudAppConversation(\n {\n initial_message: {\n role: \"user\",\n content: [{ type: \"text\", text: params.task }],\n },\n title: params.title,\n // Fall back to this conversation's repository so a bare `target: \"cloud\"`\n // call still lands the child on the code the user is working on. The\n // provider only travels with the inherited repository — it may not apply\n // to one the agent named itself.\n selected_repository:\n params.repository ?? parentMetadata?.selected_repository ?? null,\n selected_branch: params.branch ?? null,\n git_provider: params.repository\n ? null\n : (parentMetadata?.git_provider ?? null),\n // The parent runs on the local agent-server, so its id means nothing to\n // Cloud. Sending it would only hide the child from the Cloud\n // conversation list, which filters out anything with a parent.\n parent_conversation_id: null,\n },\n backend,\n );\n\n const settled = await waitForCloudConversationId(startTask, backend);\n if (settled.status === \"ERROR\") {\n return failure(\n settled.detail || \"The Cloud conversation failed to start.\",\n 'The Cloud sandbox could not be provisioned. Report this to the user; you can retry, or fall back to target=\"local\".',\n );\n }\n\n const conversationId = settled.app_conversation_id;\n return {\n status: \"launched\",\n target: \"cloud\",\n conversation_id: conversationId,\n url: conversationId\n ? `${backend.host.replace(/\\/$/, \"\")}/conversations/${conversationId}`\n : null,\n initial_status: settled.status,\n title: params.title,\n start_task_id: settled.id,\n backend: backend.name,\n // Cloud children of a local parent carry no server-side link; see above.\n parent_link: false,\n parent_link_note:\n \"This conversation runs on the local agent server, so OpenHands Cloud has no parent to link the child to.\",\n };\n}\n\n/**\n * Hand the outcome back to the agent and the user.\n *\n * Client tools are acknowledged by the agent-server before the browser does any\n * work, so a message is the only way to give the agent the child's id or tell\n * it how to fix a malformed call. `sendMessage` runs the agent, which is what\n * makes it relay the result to the user in its next turn.\n */\nasync function reportLaunchResult(\n parentConversationId: string,\n result: LaunchChildConversationResult,\n) {\n if (result.status === \"error\") {\n displayErrorToast(\n i18n.t(I18nKey.CHILD_CONVERSATION$LAUNCH_FAILED, {\n error: result.error,\n }),\n );\n } else if (result.url) {\n displaySuccessToastWithLink(\n i18n.t(\n result.target === \"cloud\"\n ? I18nKey.CHILD_CONVERSATION$LAUNCHED_CLOUD\n : I18nKey.CHILD_CONVERSATION$LAUNCHED_LOCAL,\n ),\n i18n.t(I18nKey.CHILD_CONVERSATION$OPEN),\n result.url,\n );\n }\n\n // The agent-server cancels an active `/goal` loop on any inbound message, so\n // a launch must not silently end one. The toast above still tells the user\n // what happened.\n const goalStatus =\n useGoalStore.getState().statusByConversation[parentConversationId];\n if (goalStatus?.active) return;\n\n await AgentServerConversationService.sendMessage(parentConversationId, {\n role: \"user\",\n content: [\n {\n type: \"text\",\n text: `${CHILD_CONVERSATION_RESULT_PREFIX}${JSON.stringify(result)}`,\n },\n ],\n });\n}\n\n/**\n * Execute a `launch_child_conversation` tool call.\n *\n * Never rejects: every failure is turned into corrective guidance for the\n * agent, because the agent-server has already told it the call succeeded.\n */\nexport async function handleLaunchChildConversationAction(\n action: LaunchChildConversationAction,\n parentConversationId: string,\n toolCallId: string,\n): Promise<void> {\n if (!claimToolCall(parentConversationId, toolCallId)) return;\n\n const validation = validateLaunchParams(action);\n let result: LaunchChildConversationResult;\n if (!validation.ok) {\n result = validation.failure;\n } else {\n try {\n result =\n validation.params.target === \"cloud\"\n ? await launchCloudChild(validation.params, parentConversationId)\n : await launchLocalChild(validation.params, parentConversationId);\n } catch (error) {\n result = failure(\n error instanceof Error ? error.message : String(error),\n \"The launch request failed. Report the error to the user; retry only if the cause looks transient.\",\n );\n }\n }\n\n await reportLaunchResult(parentConversationId, result).catch((error) => {\n console.warn(\n `[${LAUNCH_CHILD_CONVERSATION_TOOL_NAME}] Failed to report the launch result:`,\n error,\n );\n });\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- require("../_virtual/_rolldown/runtime.cjs");const e=require("../node_modules/zustand/esm/react.cjs"),t=require("../node_modules/zustand/esm/middleware.cjs");var n={showOlderConversations:!0,showRepoBranchMetadata:!1,showLlmProfiles:!0,showTagsMetadata:!0,showHoverMetadata:!0,organizeMode:`chronological`,conversationSort:`updated`,threadScope:`all`,groupFolderOrder:[]},r=e.create()(t.persist(e=>({...n,setShowOlderConversations:t=>e(()=>({showOlderConversations:t})),toggleShowOlderConversations:()=>e(e=>({showOlderConversations:!e.showOlderConversations})),setShowRepoBranchMetadata:t=>e(()=>({showRepoBranchMetadata:t})),toggleShowRepoBranchMetadata:()=>e(e=>({showRepoBranchMetadata:!e.showRepoBranchMetadata})),setShowLlmProfiles:t=>e(()=>({showLlmProfiles:t})),toggleShowLlmProfiles:()=>e(e=>({showLlmProfiles:!e.showLlmProfiles})),setShowTagsMetadata:t=>e(()=>({showTagsMetadata:t})),toggleShowTagsMetadata:()=>e(e=>({showTagsMetadata:!e.showTagsMetadata})),setShowHoverMetadata:t=>e(()=>({showHoverMetadata:t})),toggleShowHoverMetadata:()=>e(e=>({showHoverMetadata:!e.showHoverMetadata})),setOrganizeMode:t=>e(()=>({organizeMode:t})),setConversationSort:t=>e(()=>({conversationSort:t})),setThreadScope:t=>e(()=>({threadScope:t})),setGroupFolderOrder:t=>e(()=>({groupFolderOrder:[...t]}))}),{name:`conversation-panel-preferences`,storage:t.createJSONStorage(()=>localStorage),partialize:e=>({showOlderConversations:e.showOlderConversations,showRepoBranchMetadata:e.showRepoBranchMetadata,showLlmProfiles:e.showLlmProfiles,showTagsMetadata:e.showTagsMetadata,showHoverMetadata:e.showHoverMetadata,organizeMode:e.organizeMode,conversationSort:e.conversationSort,threadScope:e.threadScope,groupFolderOrder:e.groupFolderOrder})}));exports.useConversationPanelPreferencesStore=r;
1
+ require("../_virtual/_rolldown/runtime.cjs");const e=require("../node_modules/zustand/esm/react.cjs"),t=require("../node_modules/zustand/esm/middleware.cjs");var n={showOlderConversations:!0,showRepoBranchMetadata:!1,showLlmProfiles:!1,showTagsMetadata:!1,showHoverMetadata:!0,organizeMode:`chronological`,conversationSort:`updated`,threadScope:`all`,automationFilterMode:`all`,selectedAutomationNames:[],groupFolderOrder:[]},r=e.create()(t.persist(e=>({...n,setShowOlderConversations:t=>e(()=>({showOlderConversations:t})),toggleShowOlderConversations:()=>e(e=>({showOlderConversations:!e.showOlderConversations})),setShowRepoBranchMetadata:t=>e(()=>({showRepoBranchMetadata:t})),toggleShowRepoBranchMetadata:()=>e(e=>({showRepoBranchMetadata:!e.showRepoBranchMetadata})),setShowLlmProfiles:t=>e(()=>({showLlmProfiles:t})),toggleShowLlmProfiles:()=>e(e=>({showLlmProfiles:!e.showLlmProfiles})),setShowTagsMetadata:t=>e(()=>({showTagsMetadata:t})),toggleShowTagsMetadata:()=>e(e=>({showTagsMetadata:!e.showTagsMetadata})),setShowHoverMetadata:t=>e(()=>({showHoverMetadata:t})),toggleShowHoverMetadata:()=>e(e=>({showHoverMetadata:!e.showHoverMetadata})),setOrganizeMode:t=>e(()=>({organizeMode:t})),setConversationSort:t=>e(()=>({conversationSort:t})),setThreadScope:t=>e(()=>({threadScope:t})),setAutomationFilterMode:t=>e(()=>({automationFilterMode:t})),toggleAutomationName:t=>e(e=>({selectedAutomationNames:e.selectedAutomationNames.includes(t)?e.selectedAutomationNames.filter(e=>e!==t):[...e.selectedAutomationNames,t]})),setGroupFolderOrder:t=>e(()=>({groupFolderOrder:[...t]}))}),{name:`conversation-panel-preferences`,storage:t.createJSONStorage(()=>localStorage),partialize:e=>({showOlderConversations:e.showOlderConversations,showRepoBranchMetadata:e.showRepoBranchMetadata,showLlmProfiles:e.showLlmProfiles,showTagsMetadata:e.showTagsMetadata,showHoverMetadata:e.showHoverMetadata,organizeMode:e.organizeMode,conversationSort:e.conversationSort,threadScope:e.threadScope,automationFilterMode:e.automationFilterMode,selectedAutomationNames:e.selectedAutomationNames,groupFolderOrder:e.groupFolderOrder})}));exports.useConversationPanelPreferencesStore=r;
2
2
  //# sourceMappingURL=conversation-panel-preferences-store.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-panel-preferences-store.cjs","names":[],"sources":["../../src/stores/conversation-panel-preferences-store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { persist, createJSONStorage } from \"zustand/middleware\";\nimport {\n type ConversationSortField,\n type OrganizeMode,\n type ThreadScope,\n} from \"#/components/features/conversation-panel/conversation-panel-list-helpers\";\n\n/**\n * User-toggleable display preferences for the sidebar conversation list\n * filter menu. These are intentionally persisted to localStorage (via the\n * same `zustand/persist` pattern used by `home-store` and `workspaces-store`)\n * so the menu state survives full reloads.\n *\n * To add a new preference exposed by the filter menu:\n * 1. Add a field here with a sensible default in `initialState`.\n * 2. Add matching `setX`/`toggleX` actions below.\n * 3. Read/write through the store in `conversation-panel.tsx`.\n * No additional plumbing (storage keys, sanitization, etc.) is required —\n * `persist` handles migration of unknown fields gracefully.\n */\ninterface ConversationPanelPreferencesState {\n showOlderConversations: boolean;\n showRepoBranchMetadata: boolean;\n showLlmProfiles: boolean;\n showTagsMetadata: boolean;\n showHoverMetadata: boolean;\n organizeMode: OrganizeMode;\n conversationSort: ConversationSortField;\n threadScope: ThreadScope;\n groupFolderOrder: string[];\n}\n\ninterface ConversationPanelPreferencesActions {\n setShowOlderConversations: (value: boolean) => void;\n toggleShowOlderConversations: () => void;\n setShowRepoBranchMetadata: (value: boolean) => void;\n toggleShowRepoBranchMetadata: () => void;\n setShowLlmProfiles: (value: boolean) => void;\n toggleShowLlmProfiles: () => void;\n setShowTagsMetadata: (value: boolean) => void;\n toggleShowTagsMetadata: () => void;\n setShowHoverMetadata: (value: boolean) => void;\n toggleShowHoverMetadata: () => void;\n setOrganizeMode: (value: OrganizeMode) => void;\n setConversationSort: (value: ConversationSortField) => void;\n setThreadScope: (value: ThreadScope) => void;\n setGroupFolderOrder: (order: readonly string[]) => void;\n}\n\ntype ConversationPanelPreferencesStore = ConversationPanelPreferencesState &\n ConversationPanelPreferencesActions;\n\nconst initialState: ConversationPanelPreferencesState = {\n showOlderConversations: true,\n showRepoBranchMetadata: false,\n showLlmProfiles: true,\n showTagsMetadata: true,\n showHoverMetadata: true,\n organizeMode: \"chronological\",\n conversationSort: \"updated\",\n threadScope: \"all\",\n groupFolderOrder: [],\n};\n\nexport const useConversationPanelPreferencesStore =\n create<ConversationPanelPreferencesStore>()(\n persist(\n (set) => ({\n ...initialState,\n\n setShowOlderConversations: (value) =>\n set(() => ({ showOlderConversations: value })),\n toggleShowOlderConversations: () =>\n set((state) => ({\n showOlderConversations: !state.showOlderConversations,\n })),\n\n setShowRepoBranchMetadata: (value) =>\n set(() => ({ showRepoBranchMetadata: value })),\n toggleShowRepoBranchMetadata: () =>\n set((state) => ({\n showRepoBranchMetadata: !state.showRepoBranchMetadata,\n })),\n\n setShowLlmProfiles: (value) => set(() => ({ showLlmProfiles: value })),\n toggleShowLlmProfiles: () =>\n set((state) => ({\n showLlmProfiles: !state.showLlmProfiles,\n })),\n\n setShowTagsMetadata: (value) =>\n set(() => ({ showTagsMetadata: value })),\n toggleShowTagsMetadata: () =>\n set((state) => ({\n showTagsMetadata: !state.showTagsMetadata,\n })),\n\n setShowHoverMetadata: (value) =>\n set(() => ({ showHoverMetadata: value })),\n toggleShowHoverMetadata: () =>\n set((state) => ({\n showHoverMetadata: !state.showHoverMetadata,\n })),\n\n setOrganizeMode: (value) => set(() => ({ organizeMode: value })),\n setConversationSort: (value) =>\n set(() => ({ conversationSort: value })),\n setThreadScope: (value) => set(() => ({ threadScope: value })),\n setGroupFolderOrder: (order) =>\n set(() => ({ groupFolderOrder: [...order] })),\n }),\n {\n name: \"conversation-panel-preferences\",\n storage: createJSONStorage(() => localStorage),\n // Only persist the data fields — actions are recreated on each load.\n partialize: (state): ConversationPanelPreferencesState => ({\n showOlderConversations: state.showOlderConversations,\n showRepoBranchMetadata: state.showRepoBranchMetadata,\n showLlmProfiles: state.showLlmProfiles,\n showTagsMetadata: state.showTagsMetadata,\n showHoverMetadata: state.showHoverMetadata,\n organizeMode: state.organizeMode,\n conversationSort: state.conversationSort,\n threadScope: state.threadScope,\n groupFolderOrder: state.groupFolderOrder,\n }),\n },\n ),\n );\n"],"mappings":"8JAqDA,IAAM,EAAkD,CACtD,uBAAwB,GACxB,uBAAwB,GACxB,gBAAiB,GACjB,iBAAkB,GAClB,kBAAmB,GACnB,aAAc,gBACd,iBAAkB,UAClB,YAAa,MACb,iBAAkB,CAAC,CACrB,EAEa,EACX,EAAA,OAA0C,EACxC,EAAA,QACG,IAAS,CACR,GAAG,EAEH,0BAA4B,GAC1B,OAAW,CAAE,uBAAwB,CAAM,EAAE,EAC/C,iCACE,EAAK,IAAW,CACd,uBAAwB,CAAC,EAAM,sBACjC,EAAE,EAEJ,0BAA4B,GAC1B,OAAW,CAAE,uBAAwB,CAAM,EAAE,EAC/C,iCACE,EAAK,IAAW,CACd,uBAAwB,CAAC,EAAM,sBACjC,EAAE,EAEJ,mBAAqB,GAAU,OAAW,CAAE,gBAAiB,CAAM,EAAE,EACrE,0BACE,EAAK,IAAW,CACd,gBAAiB,CAAC,EAAM,eAC1B,EAAE,EAEJ,oBAAsB,GACpB,OAAW,CAAE,iBAAkB,CAAM,EAAE,EACzC,2BACE,EAAK,IAAW,CACd,iBAAkB,CAAC,EAAM,gBAC3B,EAAE,EAEJ,qBAAuB,GACrB,OAAW,CAAE,kBAAmB,CAAM,EAAE,EAC1C,4BACE,EAAK,IAAW,CACd,kBAAmB,CAAC,EAAM,iBAC5B,EAAE,EAEJ,gBAAkB,GAAU,OAAW,CAAE,aAAc,CAAM,EAAE,EAC/D,oBAAsB,GACpB,OAAW,CAAE,iBAAkB,CAAM,EAAE,EACzC,eAAiB,GAAU,OAAW,CAAE,YAAa,CAAM,EAAE,EAC7D,oBAAsB,GACpB,OAAW,CAAE,iBAAkB,CAAC,GAAG,CAAK,CAAE,EAAE,CAChD,GACA,CACE,KAAM,iCACN,QAAS,EAAA,sBAAwB,YAAY,EAE7C,WAAa,IAA8C,CACzD,uBAAwB,EAAM,uBAC9B,uBAAwB,EAAM,uBAC9B,gBAAiB,EAAM,gBACvB,iBAAkB,EAAM,iBACxB,kBAAmB,EAAM,kBACzB,aAAc,EAAM,aACpB,iBAAkB,EAAM,iBACxB,YAAa,EAAM,YACnB,iBAAkB,EAAM,gBAC1B,EACF,CACF,CACF"}
1
+ {"version":3,"file":"conversation-panel-preferences-store.cjs","names":[],"sources":["../../src/stores/conversation-panel-preferences-store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { persist, createJSONStorage } from \"zustand/middleware\";\nimport {\n type AutomationFilterMode,\n type ConversationSortField,\n type OrganizeMode,\n type ThreadScope,\n} from \"#/components/features/conversation-panel/conversation-panel-list-helpers\";\n\n/**\n * User-toggleable display preferences for the sidebar conversation list\n * filter menu. These are intentionally persisted to localStorage (via the\n * same `zustand/persist` pattern used by `home-store` and `workspaces-store`)\n * so the menu state survives full reloads.\n *\n * To add a new preference exposed by the filter menu:\n * 1. Add a field here with a sensible default in `initialState`.\n * 2. Add matching `setX`/`toggleX` actions below.\n * 3. Read/write through the store in `conversation-panel.tsx`.\n * No additional plumbing (storage keys, sanitization, etc.) is required —\n * `persist` handles migration of unknown fields gracefully.\n */\ninterface ConversationPanelPreferencesState {\n showOlderConversations: boolean;\n showRepoBranchMetadata: boolean;\n showLlmProfiles: boolean;\n showTagsMetadata: boolean;\n showHoverMetadata: boolean;\n organizeMode: OrganizeMode;\n conversationSort: ConversationSortField;\n threadScope: ThreadScope;\n automationFilterMode: AutomationFilterMode;\n selectedAutomationNames: string[];\n groupFolderOrder: string[];\n}\n\ninterface ConversationPanelPreferencesActions {\n setShowOlderConversations: (value: boolean) => void;\n toggleShowOlderConversations: () => void;\n setShowRepoBranchMetadata: (value: boolean) => void;\n toggleShowRepoBranchMetadata: () => void;\n setShowLlmProfiles: (value: boolean) => void;\n toggleShowLlmProfiles: () => void;\n setShowTagsMetadata: (value: boolean) => void;\n toggleShowTagsMetadata: () => void;\n setShowHoverMetadata: (value: boolean) => void;\n toggleShowHoverMetadata: () => void;\n setOrganizeMode: (value: OrganizeMode) => void;\n setConversationSort: (value: ConversationSortField) => void;\n setThreadScope: (value: ThreadScope) => void;\n setAutomationFilterMode: (value: AutomationFilterMode) => void;\n toggleAutomationName: (name: string) => void;\n setGroupFolderOrder: (order: readonly string[]) => void;\n}\n\ntype ConversationPanelPreferencesStore = ConversationPanelPreferencesState &\n ConversationPanelPreferencesActions;\n\nconst initialState: ConversationPanelPreferencesState = {\n showOlderConversations: true,\n showRepoBranchMetadata: false,\n showLlmProfiles: false,\n showTagsMetadata: false,\n showHoverMetadata: true,\n organizeMode: \"chronological\",\n conversationSort: \"updated\",\n threadScope: \"all\",\n automationFilterMode: \"all\",\n selectedAutomationNames: [],\n groupFolderOrder: [],\n};\n\nexport const useConversationPanelPreferencesStore =\n create<ConversationPanelPreferencesStore>()(\n persist(\n (set) => ({\n ...initialState,\n\n setShowOlderConversations: (value) =>\n set(() => ({ showOlderConversations: value })),\n toggleShowOlderConversations: () =>\n set((state) => ({\n showOlderConversations: !state.showOlderConversations,\n })),\n\n setShowRepoBranchMetadata: (value) =>\n set(() => ({ showRepoBranchMetadata: value })),\n toggleShowRepoBranchMetadata: () =>\n set((state) => ({\n showRepoBranchMetadata: !state.showRepoBranchMetadata,\n })),\n\n setShowLlmProfiles: (value) => set(() => ({ showLlmProfiles: value })),\n toggleShowLlmProfiles: () =>\n set((state) => ({\n showLlmProfiles: !state.showLlmProfiles,\n })),\n\n setShowTagsMetadata: (value) =>\n set(() => ({ showTagsMetadata: value })),\n toggleShowTagsMetadata: () =>\n set((state) => ({\n showTagsMetadata: !state.showTagsMetadata,\n })),\n\n setShowHoverMetadata: (value) =>\n set(() => ({ showHoverMetadata: value })),\n toggleShowHoverMetadata: () =>\n set((state) => ({\n showHoverMetadata: !state.showHoverMetadata,\n })),\n\n setOrganizeMode: (value) => set(() => ({ organizeMode: value })),\n setConversationSort: (value) =>\n set(() => ({ conversationSort: value })),\n setThreadScope: (value) => set(() => ({ threadScope: value })),\n setAutomationFilterMode: (value) =>\n set(() => ({ automationFilterMode: value })),\n toggleAutomationName: (name) =>\n set((state) => ({\n selectedAutomationNames: state.selectedAutomationNames.includes(\n name,\n )\n ? state.selectedAutomationNames.filter(\n (existing) => existing !== name,\n )\n : [...state.selectedAutomationNames, name],\n })),\n setGroupFolderOrder: (order) =>\n set(() => ({ groupFolderOrder: [...order] })),\n }),\n {\n name: \"conversation-panel-preferences\",\n storage: createJSONStorage(() => localStorage),\n // Only persist the data fields — actions are recreated on each load.\n partialize: (state): ConversationPanelPreferencesState => ({\n showOlderConversations: state.showOlderConversations,\n showRepoBranchMetadata: state.showRepoBranchMetadata,\n showLlmProfiles: state.showLlmProfiles,\n showTagsMetadata: state.showTagsMetadata,\n showHoverMetadata: state.showHoverMetadata,\n organizeMode: state.organizeMode,\n conversationSort: state.conversationSort,\n threadScope: state.threadScope,\n automationFilterMode: state.automationFilterMode,\n selectedAutomationNames: state.selectedAutomationNames,\n groupFolderOrder: state.groupFolderOrder,\n }),\n },\n ),\n );\n"],"mappings":"8JA0DA,IAAM,EAAkD,CACtD,uBAAwB,GACxB,uBAAwB,GACxB,gBAAiB,GACjB,iBAAkB,GAClB,kBAAmB,GACnB,aAAc,gBACd,iBAAkB,UAClB,YAAa,MACb,qBAAsB,MACtB,wBAAyB,CAAC,EAC1B,iBAAkB,CAAC,CACrB,EAEa,EACX,EAAA,OAA0C,EACxC,EAAA,QACG,IAAS,CACR,GAAG,EAEH,0BAA4B,GAC1B,OAAW,CAAE,uBAAwB,CAAM,EAAE,EAC/C,iCACE,EAAK,IAAW,CACd,uBAAwB,CAAC,EAAM,sBACjC,EAAE,EAEJ,0BAA4B,GAC1B,OAAW,CAAE,uBAAwB,CAAM,EAAE,EAC/C,iCACE,EAAK,IAAW,CACd,uBAAwB,CAAC,EAAM,sBACjC,EAAE,EAEJ,mBAAqB,GAAU,OAAW,CAAE,gBAAiB,CAAM,EAAE,EACrE,0BACE,EAAK,IAAW,CACd,gBAAiB,CAAC,EAAM,eAC1B,EAAE,EAEJ,oBAAsB,GACpB,OAAW,CAAE,iBAAkB,CAAM,EAAE,EACzC,2BACE,EAAK,IAAW,CACd,iBAAkB,CAAC,EAAM,gBAC3B,EAAE,EAEJ,qBAAuB,GACrB,OAAW,CAAE,kBAAmB,CAAM,EAAE,EAC1C,4BACE,EAAK,IAAW,CACd,kBAAmB,CAAC,EAAM,iBAC5B,EAAE,EAEJ,gBAAkB,GAAU,OAAW,CAAE,aAAc,CAAM,EAAE,EAC/D,oBAAsB,GACpB,OAAW,CAAE,iBAAkB,CAAM,EAAE,EACzC,eAAiB,GAAU,OAAW,CAAE,YAAa,CAAM,EAAE,EAC7D,wBAA0B,GACxB,OAAW,CAAE,qBAAsB,CAAM,EAAE,EAC7C,qBAAuB,GACrB,EAAK,IAAW,CACd,wBAAyB,EAAM,wBAAwB,SACrD,CACF,EACI,EAAM,wBAAwB,OAC3B,GAAa,IAAa,CAC7B,EACA,CAAC,GAAG,EAAM,wBAAyB,CAAI,CAC7C,EAAE,EACJ,oBAAsB,GACpB,OAAW,CAAE,iBAAkB,CAAC,GAAG,CAAK,CAAE,EAAE,CAChD,GACA,CACE,KAAM,iCACN,QAAS,EAAA,sBAAwB,YAAY,EAE7C,WAAa,IAA8C,CACzD,uBAAwB,EAAM,uBAC9B,uBAAwB,EAAM,uBAC9B,gBAAiB,EAAM,gBACvB,iBAAkB,EAAM,iBACxB,kBAAmB,EAAM,kBACzB,aAAc,EAAM,aACpB,iBAAkB,EAAM,iBACxB,YAAa,EAAM,YACnB,qBAAsB,EAAM,qBAC5B,wBAAyB,EAAM,wBAC/B,iBAAkB,EAAM,gBAC1B,EACF,CACF,CACF"}