@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.
- package/README.md +1 -1
- package/README.windows.md +2 -2
- package/build/assets/{acp-providers-DLe_gVDY.js → acp-providers-BkL3HWa3.js} +1 -1
- package/build/assets/{active-backend-context-B0wI7OzM.js → active-backend-context-BBvP-bI2.js} +1 -1
- package/build/assets/{agent-context-settings-CaQtdNA-.js → agent-context-settings-Bno1nwPL.js} +1 -1
- package/build/assets/{agent-profiles-settings-CvuErjp6.js → agent-profiles-settings-DqoS7RL3.js} +1 -1
- package/build/assets/agent-server-conversation-service.api-0RztSdJJ.js +86 -0
- package/build/assets/agent-settings-BJHryp65.js +1 -0
- package/build/assets/{agent-settings-UE-U4Xii.js → agent-settings-h8hQz-IU.js} +1 -1
- package/build/assets/{alert-banner-BMaOtTCG.js → alert-banner-lrK-2_0Y.js} +1 -1
- package/build/assets/{api-key-entry-screen-Cy66vT4D.js → api-key-entry-screen-Qsb83VX1.js} +1 -1
- package/build/assets/{app-settings-9ok42bV6.js → app-settings-r1RUbgGi.js} +1 -1
- package/build/assets/{automation-detail-fuITm6i3.js → automation-detail-7LkL91j9.js} +3 -3
- package/build/assets/{automation-export-CRq40mux.js → automation-export-U2QNyNy6.js} +1 -1
- package/build/assets/{automation-setup-route-EXDazOHW.js → automation-setup-route-Bel9_Lue.js} +1 -1
- package/build/assets/{automation-templates-BArZsaxP.js → automation-templates-CRLDssaI.js} +1 -1
- package/build/assets/{automations-list-CG4HKOTn.js → automations-list-B2iV3ZKW.js} +1 -1
- package/build/assets/{back-nav-button-BZB6H7xz.js → back-nav-button-B3pYwmUJ.js} +1 -1
- package/build/assets/backend-form-modal-OroTqnAv.js +1 -0
- package/build/assets/{backend-synced-settings-badge-B_NXJ3u1.js → backend-synced-settings-badge-DB4717Iu.js} +1 -1
- package/build/assets/{badge-C64c-7PO.js → badge-yR53enbU.js} +1 -1
- package/build/assets/{base-modal-C0RQPug5.js → base-modal-3NmIOKDm.js} +1 -1
- package/build/assets/{brand-button-DJmFCyMK.js → brand-button-CJcwjnfb.js} +1 -1
- package/build/assets/{browser-D3gd2n83.js → browser--eoQOo4M.js} +1 -1
- package/build/assets/{browser-tab-BicAWuJ1.js → browser-tab-A94o33Vn.js} +1 -1
- package/build/assets/{chat-send-button-CCrH1E8u.js → chat-send-button-B8n6-DQA.js} +1 -1
- package/build/assets/{circle-plus-check-toggle-CB_sNERY.js → circle-plus-check-toggle-BVzv5EkZ.js} +1 -1
- package/build/assets/{cloud-funnel-analytics-XynamQGU.js → cloud-funnel-analytics-CBQdPZl_.js} +1 -1
- package/build/assets/{combobox-caret-Bwiifgjs.js → combobox-caret-BlmRwiM8.js} +1 -1
- package/build/assets/command-menu-PsRXVBz2.js +1 -0
- package/build/assets/{condenser-settings-cNGy75gq.js → condenser-settings-w7L3EFvm.js} +1 -1
- package/build/assets/{confirmation-modal-BATFmFyP.js → confirmation-modal-DAH0XtOp.js} +1 -1
- package/build/assets/{context-menu-list-item-DhJCcBA0.js → context-menu-list-item-BQhmFVEK.js} +1 -1
- package/build/assets/{conversation-Csdxh9Xt.js → conversation-BUzBZAc-.js} +4 -4
- package/build/assets/conversation-panel-pzAKsSDb.js +1 -0
- package/build/assets/conversation-pzAKsSDb.js +1 -0
- package/build/assets/{conversation-state-store-C2QzhPaK.js → conversation-state-store-Bs8gA263.js} +1 -1
- package/build/assets/{conversation-tab-empty-state-D3fb5xIA.js → conversation-tab-empty-state-C9sfDOlt.js} +1 -1
- package/build/assets/{copy-to-clipboard-button-c4MQwKGj.js → copy-to-clipboard-button-DatoElj8.js} +1 -1
- package/build/assets/{device-verify-oFpQoLgm.js → device-verify-BIjXeW9N.js} +1 -1
- package/build/assets/{dropdown-classes-f91ARMV1.js → dropdown-classes-zFW7qPSK.js} +1 -1
- package/build/assets/{entry.client-BCzY2Bf3.js → entry.client-DzbDyLkV.js} +2 -2
- package/build/assets/{enum-filter-dropdown-HG3q3rkV.js → enum-filter-dropdown-CctILg5t.js} +1 -1
- package/build/assets/{environment-switch-overlay-CquZXolz.js → environment-switch-overlay-Cvmo6clk.js} +1 -1
- package/build/assets/{extensions-hub-BeweE0PW.js → extensions-hub-DOmHPGTA.js} +1 -1
- package/build/assets/{extensions-navigation-Dd58NlUF.js → extensions-navigation-6zU5M1pa.js} +1 -1
- package/build/assets/{files-tab-CLLG55-q.js → files-tab-BzofBmF4.js} +1 -1
- package/build/assets/{form-control-classes-pHtZUI6K.js → form-control-classes-DLN3Qgub.js} +1 -1
- package/build/assets/{format-relative-time-6-3uvOXe.js → format-relative-time-DGPQlPx0.js} +1 -1
- package/build/assets/{git-provider-icon-wg7ShB98.js → git-provider-icon-BLMlwy02.js} +1 -1
- package/build/assets/{git-repo-dropdown-CWnaUyxL.js → git-repo-dropdown-B7RvO70z.js} +1 -1
- package/build/assets/git-repo-dropdown-B_PTq4ol.js +1 -0
- package/build/assets/{highlighted-source-view-DBtI3por.js → highlighted-source-view-CgJfD5VT.js} +1 -1
- package/build/assets/{home-BpZQkDWM.js → home-DEZaZqYv.js} +1 -1
- package/build/assets/home-r89Vj2td.js +1 -0
- package/build/assets/{home-store-DM4qw1lF.js → home-store-D7CjMN_-.js} +1 -1
- package/build/assets/index-home-r89Vj2td.js +1 -0
- package/build/assets/install-server-modal-BTwK5lbi.js +1 -0
- package/build/assets/{kebab-menu-item-content-By16Tm_0.js → kebab-menu-item-content-C4CkeiJO.js} +1 -1
- package/build/assets/{launch-C9uijypN.js → launch-DVlx4v9o.js} +1 -1
- package/build/assets/{llm-not-configured-banner-DrBrhfN0.js → llm-not-configured-banner-CwKu8C6g.js} +2 -2
- package/build/assets/llm-settings-BJotLQND.js +1 -0
- package/build/assets/llm-settings-CDM-5H2A.js +1 -0
- package/build/assets/{llm-subscription-service-DwjJ8-_X.js → llm-subscription-service-7eVfDIE1.js} +1 -1
- package/build/assets/{loading-spinner-6Yj-YyoS.js → loading-spinner-CN3riY7k.js} +1 -1
- package/build/assets/{manage-backends-modal-DrwErS0N.js → manage-backends-modal-HNWKLYhq.js} +1 -1
- package/build/assets/manifest-2a36a8f8.js +1 -0
- package/build/assets/{manifest-subpage-layout-CtqVwIvJ.js → manifest-subpage-layout-D-m-h8_t.js} +1 -1
- package/build/assets/map-provider-7Bp2aih5.js +1 -0
- package/build/assets/markdown-renderer-BiiiIznl.js +8 -0
- package/build/assets/mcp-gLgPP7AS.js +9 -0
- package/build/assets/{mcp-marketplace-utils-BMnYz0Gc.js → mcp-marketplace-utils-Dr_HG_ol.js} +1 -1
- package/build/assets/messages-D1cbVhRK.js +40 -0
- package/build/assets/{modal-body-BHGCSAtj.js → modal-body-duRaxj_K.js} +1 -1
- package/build/assets/{modal-classes-DSTLuxkA.js → modal-classes-CLEXO6dj.js} +1 -1
- package/build/assets/{modal-close-button-dheWZ2ys.js → modal-close-button-D0aT02hs.js} +1 -1
- package/build/assets/npm-DRzJF5Zn.js +1 -0
- package/build/assets/{onboarding-5CZvRBbh.js → onboarding-DSr8hOpk.js} +1 -1
- package/build/assets/{onboarding-modal-CD2ehuxt.js → onboarding-modal-C6Euf7N4.js} +1 -1
- package/build/assets/{organization-service.api-Dsuoep0g.js → organization-service.api-C4GYWwj9.js} +1 -1
- package/build/assets/{planner-tab-DeO7Thb0.js → planner-tab-CZcguxTK.js} +1 -1
- package/build/assets/{plugins-management-service-C9f75R6X.js → plugins-management-service-BmDzOQsd.js} +1 -1
- package/build/assets/{profiles-service.api-Dl20_2IM.js → profiles-service.api-CoLTwjc1.js} +1 -1
- package/build/assets/{providers-CeuhK46N.js → providers-tBzTpz1w.js} +1 -1
- package/build/assets/{proxy-CIGI9zQC.js → proxy-DCI9S-LA.js} +1 -1
- package/build/assets/recommended-automations-launcher-BbJAJVED.js +1 -0
- package/build/assets/root-BfM_kC_d.css +1 -0
- package/build/assets/root-gstBEjty.js +2 -0
- package/build/assets/root-layout-BIAFLP9p.js +2 -0
- package/build/assets/{schema-field-z2vSLuLo.js → schema-field-zhsVDllR.js} +1 -1
- package/build/assets/{sdk-section-page-BnCXAytf.js → sdk-section-page-CS4GWn0y.js} +1 -1
- package/build/assets/{secrets-service-DGUNlwQd.js → secrets-service-DjgGduXk.js} +1 -1
- package/build/assets/{secrets-settings-DUmML_dK.js → secrets-settings-f-qahfbi.js} +1 -1
- package/build/assets/{segmented-toggle-eSofF7gn.js → segmented-toggle-SmvsR3jW.js} +1 -1
- package/build/assets/settings-DQd0xLEw.js +1 -0
- package/build/assets/{settings-dropdown-input-Cx4g7Xfl.js → settings-dropdown-input-TWIeiG02.js} +1 -1
- package/build/assets/{settings-index-BECdgecg.js → settings-index-BVwy9JEp.js} +1 -1
- package/build/assets/{settings-input-BQY115xH.js → settings-input-D61Vzp9e.js} +1 -1
- package/build/assets/{settings-list-classes-C9cLrrcc.js → settings-list-classes-sE0ASr1s.js} +1 -1
- package/build/assets/{settings-modal-ChBJNTdd.js → settings-modal-D6D5ngET.js} +1 -1
- package/build/assets/{settings-service.api-Dz9cZyvx.js → settings-service.api-DZp7E7A9.js} +1 -1
- package/build/assets/{settings-switch-BIodMVz9.js → settings-switch-Drt-rF5s.js} +1 -1
- package/build/assets/{settings-utils-BL_Z9uIe.js → settings-utils-gw2ppAvw.js} +1 -1
- package/build/assets/{shared-conversation-CSF0aTuE.js → shared-conversation-DIxZjElr.js} +1 -1
- package/build/assets/{wrench-DRitTfwe.js → shield-check-D2cpEpv3.js} +1 -1
- package/build/assets/{sidebar-layout-DEycoFd_.js → sidebar-layout-Dxg6zc2K.js} +1 -1
- package/build/assets/{sidebar-mobile-menu-toggle-DeRvTupV.js → sidebar-mobile-menu-toggle-OoZBHxaT.js} +1 -1
- package/build/assets/{sidebar-nav-link-BjpQ-NVc.js → sidebar-nav-link-CxLoG-dG.js} +1 -1
- package/build/assets/sidebar-store-BJeYY-E9.js +1 -0
- package/build/assets/{skill-card-pill-row-BH6fPGba.js → skill-card-pill-row-B_BYBONu.js} +1 -1
- package/build/assets/{skill-icon-badge-D4uznfjU.js → skill-icon-badge-CN41Hy9l.js} +1 -1
- package/build/assets/{skill-scope-DH_AUUUP.js → skill-scope-B1Per5XI.js} +1 -1
- package/build/assets/{skills-plugins-vfvOk34h.js → skills-plugins-B3AO6sMz.js} +1 -1
- package/build/assets/skills-settings-DmmgJ6CT.js +2 -0
- package/build/assets/{styled-tooltip-CQ9JEFiO.js → styled-tooltip-C5C07RQC.js} +1 -1
- package/build/assets/{task-list-tab-DeF_uXdw.js → task-list-tab-C19Q_JNf.js} +1 -1
- package/build/assets/{terminal-DRc4rup7.js → terminal-CbuMRYal.js} +1 -1
- package/build/assets/{toggle-switch--8n8NeV_.js → toggle-switch-CIioisto.js} +1 -1
- package/build/assets/{typography-BSbUhJPn.js → typography-D9tiHct7.js} +1 -1
- package/build/assets/{use-acp-credential-form-BGKFi1VL.js → use-acp-credential-form-DJmmJKMo.js} +1 -1
- package/build/assets/{use-activate-agent-profile-2nvALjC-.js → use-activate-agent-profile-CeFfYwu_.js} +1 -1
- package/build/assets/{use-agent-profiles-BlQA67MW.js → use-agent-profiles-BHLkLbRR.js} +1 -1
- package/build/assets/{use-can-manage-org-profiles-Clw5Dh1s.js → use-can-manage-org-profiles-Bu4y8gSx.js} +1 -1
- package/build/assets/{use-cloud-current-user-id-B8AQSQFM.js → use-cloud-current-user-id-QD9x3ySO.js} +1 -1
- package/build/assets/{use-config-C3zGuUQI.js → use-config-CPwqciXN.js} +1 -1
- package/build/assets/{use-create-conversation-FaP0kUpg.js → use-create-conversation-DWaSVUOB.js} +1 -1
- package/build/assets/{use-create-secret-CgQ3pXd6.js → use-create-secret-BsOfOLvg.js} +1 -1
- package/build/assets/{use-llm-profiles-C-tDO6UB.js → use-llm-profiles-CU8ah1pz.js} +1 -1
- package/build/assets/{use-manifest-capabilities-DLP5wCxp.js → use-manifest-capabilities-DBYPjyV6.js} +1 -1
- package/build/assets/{use-onboarding-completion-BiCdXvlU.js → use-onboarding-completion-CtNJxkXG.js} +1 -1
- package/build/assets/{use-plugins-marketplace-DRFNLBlr.js → use-plugins-marketplace-ZEA-gyM9.js} +1 -1
- package/build/assets/{use-save-agent-profile-CaGVAudI.js → use-save-agent-profile-DgI_Uz9a.js} +1 -1
- package/build/assets/{use-save-settings-C9B8Y-h3.js → use-save-settings-pSjRhD_m.js} +1 -1
- package/build/assets/{use-settings-3RcgdUuZ.js → use-settings-BHWsOcIG.js} +1 -1
- package/build/assets/use-settings-nav-items-CQgkxUbV.js +16 -0
- package/build/assets/{use-tracking-CTtkLAmx.js → use-tracking-CGCsBWhg.js} +1 -1
- package/build/assets/{use-user-conversation-Bei82QsZ.js → use-user-conversation-DRfEU8x0.js} +1 -1
- package/build/assets/utils-DPQfkd-7.js +1 -0
- package/build/assets/{verification-settings-nD61Ijph.js → verification-settings-BItwt998.js} +1 -1
- package/build/assets/wrench-B1_H-tL1.js +1 -0
- package/build/index.html +4 -4
- package/build/locales/ar/openhands.json +39 -2
- package/build/locales/ca/openhands.json +39 -2
- package/build/locales/de/openhands.json +39 -2
- package/build/locales/en/openhands.json +39 -2
- package/build/locales/es/openhands.json +39 -2
- package/build/locales/fr/openhands.json +39 -2
- package/build/locales/it/openhands.json +39 -2
- package/build/locales/ja/openhands.json +39 -2
- package/build/locales/ko-KR/openhands.json +39 -2
- package/build/locales/no/openhands.json +39 -2
- package/build/locales/pt/openhands.json +39 -2
- package/build/locales/tr/openhands.json +39 -2
- package/build/locales/uk/openhands.json +39 -2
- package/build/locales/zh-CN/openhands.json +39 -2
- package/build/locales/zh-TW/openhands.json +39 -2
- package/config/defaults.json +1 -1
- package/dist/api/agent-server-adapter.cjs +3 -3
- package/dist/api/agent-server-adapter.cjs.map +1 -1
- package/dist/api/agent-server-adapter.d.ts +32 -5
- package/dist/api/agent-server-adapter.js +120 -91
- package/dist/api/agent-server-adapter.js.map +1 -1
- package/dist/api/cloud/conversation-service.api.cjs +1 -1
- package/dist/api/cloud/conversation-service.api.cjs.map +1 -1
- package/dist/api/cloud/conversation-service.api.d.ts +19 -2
- package/dist/api/cloud/conversation-service.api.js +51 -47
- package/dist/api/cloud/conversation-service.api.js.map +1 -1
- package/dist/api/conversation-file-upload.api.cjs +1 -1
- package/dist/api/conversation-file-upload.api.js +10 -10
- package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.js +55 -61
- package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
- package/dist/api/event-service/event-service.api.cjs +1 -1
- package/dist/api/event-service/event-service.api.js +12 -12
- package/dist/api/launch-child-conversation-client-tool.cjs +47 -0
- package/dist/api/launch-child-conversation-client-tool.cjs.map +1 -0
- package/dist/api/launch-child-conversation-client-tool.d.ts +3 -0
- package/dist/api/launch-child-conversation-client-tool.js +93 -0
- package/dist/api/launch-child-conversation-client-tool.js.map +1 -0
- package/dist/api/open-hands.types.d.ts +1 -1
- package/dist/api/workspace-upload-path.cjs +1 -1
- package/dist/api/workspace-upload-path.js +8 -8
- package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.cjs +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.js +24 -18
- package/dist/components/conversation-events/chat/event-content-helpers/get-action-event-title.js.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js +5 -0
- package/dist/components/conversation-events/chat/event-content-helpers/get-event-content.js.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs +2 -2
- package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js +11 -7
- package/dist/components/conversation-events/chat/event-content-helpers/should-render-event.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs +1 -2
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.d.ts +2 -8
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js +48 -51
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.cjs +2 -0
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.cjs.map +1 -0
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.d.ts +12 -0
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.js +6 -0
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-meta-chip.js.map +1 -0
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.d.ts +16 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js +95 -78
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.js +40 -38
- package/dist/components/features/conversation-panel/conversation-card/conversation-repo-link.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs +2 -0
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs.map +1 -0
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.d.ts +14 -0
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js +167 -0
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js.map +1 -0
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs +2 -0
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs.map +1 -0
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.d.ts +63 -0
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js +66 -0
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js.map +1 -0
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.cjs +2 -0
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.cjs.map +1 -0
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.d.ts +15 -0
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.js +117 -0
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-icons.js.map +1 -0
- package/dist/components/features/conversation-panel/conversation-card/no-repository.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/no-repository.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/no-repository.js +30 -19
- package/dist/components/features/conversation-panel/conversation-card/no-repository.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.d.ts +7 -2
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +146 -104
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.d.ts +20 -0
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js +53 -27
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel.js +226 -213
- package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
- package/dist/components/features/settings/agent-canvas-update-card.cjs +1 -1
- package/dist/components/features/settings/agent-canvas-update-card.cjs.map +1 -1
- package/dist/components/features/settings/agent-canvas-update-card.d.ts +10 -5
- package/dist/components/features/settings/agent-canvas-update-card.js +223 -149
- package/dist/components/features/settings/agent-canvas-update-card.js.map +1 -1
- package/dist/components/features/settings/agent-canvas-version-modal.cjs +2 -0
- package/dist/components/features/settings/agent-canvas-version-modal.cjs.map +1 -0
- package/dist/components/features/settings/agent-canvas-version-modal.d.ts +11 -0
- package/dist/components/features/settings/agent-canvas-version-modal.js +166 -0
- package/dist/components/features/settings/agent-canvas-version-modal.js.map +1 -0
- package/dist/components/features/settings/agent-canvas-version-tile.cjs +2 -0
- package/dist/components/features/settings/agent-canvas-version-tile.cjs.map +1 -0
- package/dist/components/features/settings/agent-canvas-version-tile.d.ts +13 -0
- package/dist/components/features/settings/agent-canvas-version-tile.js +60 -0
- package/dist/components/features/settings/agent-canvas-version-tile.js.map +1 -0
- package/dist/components/features/settings/settings-desktop-sidebar.cjs +1 -1
- package/dist/components/features/settings/settings-desktop-sidebar.cjs.map +1 -1
- package/dist/components/features/settings/settings-desktop-sidebar.js +1 -1
- package/dist/components/features/settings/settings-desktop-sidebar.js.map +1 -1
- package/dist/components/features/settings/settings-mobile-drawer.cjs +1 -1
- package/dist/components/features/settings/settings-mobile-drawer.cjs.map +1 -1
- package/dist/components/features/settings/settings-mobile-drawer.js +1 -1
- package/dist/components/features/settings/settings-mobile-drawer.js.map +1 -1
- package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
- package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
- package/dist/components/features/sidebar/sidebar-rail-body.js +109 -108
- package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
- package/dist/components/features/skills/extensions-navigation.cjs +1 -1
- package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
- package/dist/components/features/skills/extensions-navigation.js +9 -9
- package/dist/components/features/skills/extensions-navigation.js.map +1 -1
- package/dist/config/defaults.cjs +1 -1
- package/dist/config/defaults.cjs.map +1 -1
- package/dist/config/defaults.js +1 -1
- package/dist/config/defaults.js.map +1 -1
- package/dist/constants/child-conversation.cjs +2 -0
- package/dist/constants/child-conversation.cjs.map +1 -0
- package/dist/constants/child-conversation.d.ts +29 -0
- package/dist/constants/child-conversation.js +6 -0
- package/dist/constants/child-conversation.js.map +1 -0
- package/dist/contexts/conversation-websocket-context.cjs +3 -3
- package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
- package/dist/contexts/conversation-websocket-context.js +189 -188
- package/dist/contexts/conversation-websocket-context.js.map +1 -1
- package/dist/hooks/chat/use-model-interceptor.cjs +1 -1
- package/dist/hooks/chat/use-model-interceptor.js +6 -6
- package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
- package/dist/hooks/mutation/use-create-conversation.js +6 -6
- package/dist/i18n/declaration.cjs +1 -1
- package/dist/i18n/declaration.cjs.map +1 -1
- package/dist/i18n/declaration.d.ts +38 -1
- package/dist/i18n/declaration.js +1 -1
- package/dist/i18n/declaration.js.map +1 -1
- package/dist/i18n/translation.cjs +2 -2
- package/dist/i18n/translation.cjs.map +1 -1
- package/dist/i18n/translation.js +644 -15
- package/dist/i18n/translation.js.map +1 -1
- package/dist/icons/docker.cjs +2 -0
- package/dist/icons/docker.cjs.map +1 -0
- package/dist/icons/docker.js +19 -0
- package/dist/icons/docker.js.map +1 -0
- package/dist/icons/npm.cjs +2 -0
- package/dist/icons/npm.cjs.map +1 -0
- package/dist/icons/npm.js +19 -0
- package/dist/icons/npm.js.map +1 -0
- package/dist/locales/ar/openhands.json +39 -2
- package/dist/locales/ca/openhands.json +39 -2
- package/dist/locales/de/openhands.json +39 -2
- package/dist/locales/en/openhands.json +39 -2
- package/dist/locales/es/openhands.json +39 -2
- package/dist/locales/fr/openhands.json +39 -2
- package/dist/locales/it/openhands.json +39 -2
- package/dist/locales/ja/openhands.json +39 -2
- package/dist/locales/ko-KR/openhands.json +39 -2
- package/dist/locales/no/openhands.json +39 -2
- package/dist/locales/pt/openhands.json +39 -2
- package/dist/locales/tr/openhands.json +39 -2
- package/dist/locales/uk/openhands.json +39 -2
- package/dist/locales/zh-CN/openhands.json +39 -2
- package/dist/locales/zh-TW/openhands.json +39 -2
- package/dist/node_modules/@openhands/typescript-client/dist/index.cjs +1 -1
- package/dist/node_modules/@openhands/typescript-client/dist/index.js +1 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.js +16 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/building-2.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/building-2.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/building-2.js +27 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/building-2.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.js +21 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-arrow-up.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.js +23 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-user-round.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.js +43 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/cloud-cog.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/earth.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/earth.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/earth.js +25 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/earth.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/flag.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/flag.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/flag.js +9 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/flag.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.js +27 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/folder-git-2.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.js +25 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/folder-key.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.js +30 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/git-pull-request.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/hash.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/hash.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/hash.js +35 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/hash.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/house.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/house.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/house.js +12 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/house.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/id-card.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/id-card.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/id-card.js +33 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/id-card.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/key-round.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/key-round.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/key-round.js +15 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/key-round.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/layers.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/layers.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/layers.js +19 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/layers.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/link-2.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/link-2.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/link-2.js +22 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/link-2.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/mails.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/mails.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/mails.js +23 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/mails.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.js +12 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/messages-square.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/plug.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/plug.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/plug.js +23 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/plug.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.js +27 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/square-kanban.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/ticket.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/ticket.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/ticket.js +23 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/ticket.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/users-round.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/users-round.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/users-round.js +21 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/users-round.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.js +43 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/waypoints.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/webhook.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/webhook.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/webhook.js +19 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/webhook.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/workflow.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/workflow.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/workflow.js +27 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/workflow.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/wrench.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/wrench.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/wrench.js +9 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/wrench.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/zap.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/zap.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/zap.js +9 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/zap.js.map +1 -0
- package/dist/package.cjs +1 -1
- package/dist/package.cjs.map +1 -1
- package/dist/package.js +6 -3
- package/dist/package.js.map +1 -1
- package/dist/services/child-conversation-launch.cjs +2 -0
- package/dist/services/child-conversation-launch.cjs.map +1 -0
- package/dist/services/child-conversation-launch.d.ts +41 -0
- package/dist/services/child-conversation-launch.js +182 -0
- package/dist/services/child-conversation-launch.js.map +1 -0
- package/dist/stores/conversation-panel-preferences-store.cjs +1 -1
- package/dist/stores/conversation-panel-preferences-store.cjs.map +1 -1
- package/dist/stores/conversation-panel-preferences-store.d.ts +5 -1
- package/dist/stores/conversation-panel-preferences-store.js +8 -2
- package/dist/stores/conversation-panel-preferences-store.js.map +1 -1
- package/dist/types/agent-server/core/base/action.d.ts +17 -1
- package/dist/types/agent-server/core/base/base.d.ts +2 -1
- package/dist/types/agent-server/type-guards.cjs +1 -1
- package/dist/types/agent-server/type-guards.cjs.map +1 -1
- package/dist/types/agent-server/type-guards.d.ts +8 -1
- package/dist/types/agent-server/type-guards.js +4 -3
- package/dist/types/agent-server/type-guards.js.map +1 -1
- package/dist/types/automation.d.ts +14 -0
- package/dist/utils/custom-toast-handlers.cjs +1 -1
- package/dist/utils/custom-toast-handlers.cjs.map +1 -1
- package/dist/utils/custom-toast-handlers.js +18 -1
- package/dist/utils/custom-toast-handlers.js.map +1 -1
- package/package.json +6 -3
- package/scripts/brand-dev-electron.mjs +244 -0
- package/scripts/check-translation-completeness.cjs +4 -0
- package/scripts/generate-icons.mjs +109 -0
- package/build/assets/agent-server-conversation-service.api-km_8sOVf.js +0 -41
- package/build/assets/agent-settings-nmO-KSXr.js +0 -1
- package/build/assets/backend-form-modal-B_lXjOGa.js +0 -1
- package/build/assets/command-menu-CA3IjGNc.js +0 -1
- package/build/assets/conversation-B6t6EiVp.js +0 -1
- package/build/assets/conversation-panel-B6t6EiVp.js +0 -1
- package/build/assets/copy-DaHuDtG4.js +0 -1
- package/build/assets/git-repo-dropdown-TzOuG5Ef.js +0 -1
- package/build/assets/home-OEx0XtfP.js +0 -1
- package/build/assets/index-home-OEx0XtfP.js +0 -1
- package/build/assets/info-C9lpK5pw.js +0 -1
- package/build/assets/install-server-modal-DnjZrJUy.js +0 -1
- package/build/assets/list-filter-C86CBRDE.js +0 -1
- package/build/assets/llm-settings-CRsLqxgu.js +0 -1
- package/build/assets/llm-settings-RBm_3kNm.js +0 -1
- package/build/assets/manifest-c352d453.js +0 -1
- package/build/assets/map-provider-CXU6issd.js +0 -1
- package/build/assets/markdown-renderer-lsvsp7jn.js +0 -8
- package/build/assets/mcp-DD4hPTRE.js +0 -9
- package/build/assets/messages-Dt77e0qi.js +0 -40
- package/build/assets/recommended-automations-launcher-6xmbf7lh.js +0 -1
- package/build/assets/root-BQPNqNvD.js +0 -2
- package/build/assets/root-BeuHFY2s.css +0 -1
- package/build/assets/root-layout-Dl_2CDoq.js +0 -3
- package/build/assets/settings-Co-M5bK9.js +0 -1
- package/build/assets/sidebar-store-B04sX8aP.js +0 -1
- package/build/assets/skills-settings-DnbIu2eO.js +0 -2
- package/build/assets/use-settings-nav-items-y-Oyc93G.js +0 -16
- package/build/assets/utils-BX9XJ0IE.js +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.cjs +0 -2
- package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.cjs.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.js +0 -9
- package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type ConversationSortField, type OrganizeMode, type ThreadScope } from "#/components/features/conversation-panel/conversation-panel-list-helpers";
|
|
1
|
+
import { type AutomationFilterMode, type ConversationSortField, type OrganizeMode, type ThreadScope } from "#/components/features/conversation-panel/conversation-panel-list-helpers";
|
|
2
2
|
/**
|
|
3
3
|
* User-toggleable display preferences for the sidebar conversation list
|
|
4
4
|
* filter menu. These are intentionally persisted to localStorage (via the
|
|
@@ -21,6 +21,8 @@ interface ConversationPanelPreferencesState {
|
|
|
21
21
|
organizeMode: OrganizeMode;
|
|
22
22
|
conversationSort: ConversationSortField;
|
|
23
23
|
threadScope: ThreadScope;
|
|
24
|
+
automationFilterMode: AutomationFilterMode;
|
|
25
|
+
selectedAutomationNames: string[];
|
|
24
26
|
groupFolderOrder: string[];
|
|
25
27
|
}
|
|
26
28
|
interface ConversationPanelPreferencesActions {
|
|
@@ -37,6 +39,8 @@ interface ConversationPanelPreferencesActions {
|
|
|
37
39
|
setOrganizeMode: (value: OrganizeMode) => void;
|
|
38
40
|
setConversationSort: (value: ConversationSortField) => void;
|
|
39
41
|
setThreadScope: (value: ThreadScope) => void;
|
|
42
|
+
setAutomationFilterMode: (value: AutomationFilterMode) => void;
|
|
43
|
+
toggleAutomationName: (name: string) => void;
|
|
40
44
|
setGroupFolderOrder: (order: readonly string[]) => void;
|
|
41
45
|
}
|
|
42
46
|
type ConversationPanelPreferencesStore = ConversationPanelPreferencesState & ConversationPanelPreferencesActions;
|
|
@@ -4,12 +4,14 @@ import { createJSONStorage as t, persist as n } from "../node_modules/zustand/es
|
|
|
4
4
|
var r = {
|
|
5
5
|
showOlderConversations: !0,
|
|
6
6
|
showRepoBranchMetadata: !1,
|
|
7
|
-
showLlmProfiles: !
|
|
8
|
-
showTagsMetadata: !
|
|
7
|
+
showLlmProfiles: !1,
|
|
8
|
+
showTagsMetadata: !1,
|
|
9
9
|
showHoverMetadata: !0,
|
|
10
10
|
organizeMode: "chronological",
|
|
11
11
|
conversationSort: "updated",
|
|
12
12
|
threadScope: "all",
|
|
13
|
+
automationFilterMode: "all",
|
|
14
|
+
selectedAutomationNames: [],
|
|
13
15
|
groupFolderOrder: []
|
|
14
16
|
}, i = e()(n((e) => ({
|
|
15
17
|
...r,
|
|
@@ -26,6 +28,8 @@ var r = {
|
|
|
26
28
|
setOrganizeMode: (t) => e(() => ({ organizeMode: t })),
|
|
27
29
|
setConversationSort: (t) => e(() => ({ conversationSort: t })),
|
|
28
30
|
setThreadScope: (t) => e(() => ({ threadScope: t })),
|
|
31
|
+
setAutomationFilterMode: (t) => e(() => ({ automationFilterMode: t })),
|
|
32
|
+
toggleAutomationName: (t) => e((e) => ({ selectedAutomationNames: e.selectedAutomationNames.includes(t) ? e.selectedAutomationNames.filter((e) => e !== t) : [...e.selectedAutomationNames, t] })),
|
|
29
33
|
setGroupFolderOrder: (t) => e(() => ({ groupFolderOrder: [...t] }))
|
|
30
34
|
}), {
|
|
31
35
|
name: "conversation-panel-preferences",
|
|
@@ -39,6 +43,8 @@ var r = {
|
|
|
39
43
|
organizeMode: e.organizeMode,
|
|
40
44
|
conversationSort: e.conversationSort,
|
|
41
45
|
threadScope: e.threadScope,
|
|
46
|
+
automationFilterMode: e.automationFilterMode,
|
|
47
|
+
selectedAutomationNames: e.selectedAutomationNames,
|
|
42
48
|
groupFolderOrder: e.groupFolderOrder
|
|
43
49
|
})
|
|
44
50
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-panel-preferences-store.js","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:
|
|
1
|
+
{"version":3,"file":"conversation-panel-preferences-store.js","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":";;;AA0DA,IAAM,IAAkD;CACtD,wBAAwB;CACxB,wBAAwB;CACxB,iBAAiB;CACjB,kBAAkB;CAClB,mBAAmB;CACnB,cAAc;CACd,kBAAkB;CAClB,aAAa;CACb,sBAAsB;CACtB,yBAAyB,CAAC;CAC1B,kBAAkB,CAAC;AACrB,GAEa,IACX,EAA0C,EACxC,GACG,OAAS;CACR,GAAG;CAEH,4BAA4B,MAC1B,SAAW,EAAE,wBAAwB,EAAM,EAAE;CAC/C,oCACE,GAAK,OAAW,EACd,wBAAwB,CAAC,EAAM,uBACjC,EAAE;CAEJ,4BAA4B,MAC1B,SAAW,EAAE,wBAAwB,EAAM,EAAE;CAC/C,oCACE,GAAK,OAAW,EACd,wBAAwB,CAAC,EAAM,uBACjC,EAAE;CAEJ,qBAAqB,MAAU,SAAW,EAAE,iBAAiB,EAAM,EAAE;CACrE,6BACE,GAAK,OAAW,EACd,iBAAiB,CAAC,EAAM,gBAC1B,EAAE;CAEJ,sBAAsB,MACpB,SAAW,EAAE,kBAAkB,EAAM,EAAE;CACzC,8BACE,GAAK,OAAW,EACd,kBAAkB,CAAC,EAAM,iBAC3B,EAAE;CAEJ,uBAAuB,MACrB,SAAW,EAAE,mBAAmB,EAAM,EAAE;CAC1C,+BACE,GAAK,OAAW,EACd,mBAAmB,CAAC,EAAM,kBAC5B,EAAE;CAEJ,kBAAkB,MAAU,SAAW,EAAE,cAAc,EAAM,EAAE;CAC/D,sBAAsB,MACpB,SAAW,EAAE,kBAAkB,EAAM,EAAE;CACzC,iBAAiB,MAAU,SAAW,EAAE,aAAa,EAAM,EAAE;CAC7D,0BAA0B,MACxB,SAAW,EAAE,sBAAsB,EAAM,EAAE;CAC7C,uBAAuB,MACrB,GAAK,OAAW,EACd,yBAAyB,EAAM,wBAAwB,SACrD,CACF,IACI,EAAM,wBAAwB,QAC3B,MAAa,MAAa,CAC7B,IACA,CAAC,GAAG,EAAM,yBAAyB,CAAI,EAC7C,EAAE;CACJ,sBAAsB,MACpB,SAAW,EAAE,kBAAkB,CAAC,GAAG,CAAK,EAAE,EAAE;AAChD,IACA;CACE,MAAM;CACN,SAAS,QAAwB,YAAY;CAE7C,aAAa,OAA8C;EACzD,wBAAwB,EAAM;EAC9B,wBAAwB,EAAM;EAC9B,iBAAiB,EAAM;EACvB,kBAAkB,EAAM;EACxB,mBAAmB,EAAM;EACzB,cAAc,EAAM;EACpB,kBAAkB,EAAM;EACxB,aAAa,EAAM;EACnB,sBAAsB,EAAM;EAC5B,yBAAyB,EAAM;EAC/B,kBAAkB,EAAM;CAC1B;AACF,CACF,CACF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { CANVAS_UI_CLIENT_ACTION_KIND } from "#/constants/canvas-ui";
|
|
2
|
+
import { LAUNCH_CHILD_CONVERSATION_ACTION_KIND } from "#/constants/child-conversation";
|
|
2
3
|
import { ActionBase } from "./base";
|
|
3
4
|
import { TaskItem } from "./common";
|
|
4
5
|
export interface MCPToolAction extends ActionBase<"MCPToolAction"> {
|
|
@@ -291,4 +292,19 @@ export interface CanvasUIAction extends ActionBase<"CanvasUIAction" | typeof CAN
|
|
|
291
292
|
path?: string | null;
|
|
292
293
|
tab?: string | null;
|
|
293
294
|
}
|
|
294
|
-
|
|
295
|
+
/**
|
|
296
|
+
* Request to launch a child conversation, emitted over the existing WebSocket
|
|
297
|
+
* and intercepted by handleLaunchChildConversationAction. The agent-server
|
|
298
|
+
* validates the parameter *names* and types against the tool schema but not
|
|
299
|
+
* `enum` values, so the fields stay loosely typed here and the dispatcher
|
|
300
|
+
* narrows them (returning corrective guidance on a mismatch).
|
|
301
|
+
*/
|
|
302
|
+
export interface LaunchChildConversationAction extends ActionBase<typeof LAUNCH_CHILD_CONVERSATION_ACTION_KIND> {
|
|
303
|
+
target: string;
|
|
304
|
+
task: string;
|
|
305
|
+
title?: string | null;
|
|
306
|
+
repository?: string | null;
|
|
307
|
+
branch?: string | null;
|
|
308
|
+
isolation?: string | null;
|
|
309
|
+
}
|
|
310
|
+
export type Action = MCPToolAction | FinishAction | ThinkAction | ExecuteBashAction | TerminalAction | FileEditorAction | StrReplaceEditorAction | TaskTrackerAction | PlanningFileEditorAction | BrowserNavigateAction | BrowserClickAction | BrowserTypeAction | BrowserGetStateAction | BrowserGetContentAction | BrowserScrollAction | BrowserGoBackAction | BrowserListTabsAction | BrowserSwitchTabAction | BrowserCloseTabAction | GlobAction | GrepAction | InvokeSkillAction | TaskAction | SwitchLLMAction | CanvasUIAction | LaunchChildConversationAction;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { CANVAS_UI_CLIENT_ACTION_KIND } from "#/constants/canvas-ui";
|
|
2
|
+
import { LAUNCH_CHILD_CONVERSATION_ACTION_KIND } from "#/constants/child-conversation";
|
|
2
3
|
type EventType = "MCPTool" | "Finish" | "Think" | "ExecuteBash" | "Terminal" | "FileEditor" | "StrReplaceEditor" | "TaskTracker" | "PlanningFileEditor" | "InvokeSkill" | "SwitchLLM";
|
|
3
4
|
type ActionOnlyType = "BrowserNavigate" | "BrowserClick" | "BrowserType" | "BrowserGetState" | "BrowserGetContent" | "BrowserScroll" | "BrowserGoBack" | "BrowserListTabs" | "BrowserSwitchTab" | "BrowserCloseTab" | "CanvasUI";
|
|
4
5
|
type ObservationOnlyType = "Browser";
|
|
5
|
-
type ActionEventType = `${ActionOnlyType}Action` | `${EventType}Action` | "GlobAction" | "GrepAction" | "TaskAction" | typeof CANVAS_UI_CLIENT_ACTION_KIND;
|
|
6
|
+
type ActionEventType = `${ActionOnlyType}Action` | `${EventType}Action` | "GlobAction" | "GrepAction" | "TaskAction" | typeof CANVAS_UI_CLIENT_ACTION_KIND | typeof LAUNCH_CHILD_CONVERSATION_ACTION_KIND;
|
|
6
7
|
type ObservationEventType = `${ObservationOnlyType}Observation` | `${EventType}Observation` | "TerminalObservation" | "GlobObservation" | "GrepObservation" | "TaskObservation" | "CanvasUIObservation" | "ClientToolObservation";
|
|
7
8
|
export interface ActionBase<T extends ActionEventType = ActionEventType> {
|
|
8
9
|
kind: T;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("../../_virtual/_rolldown/runtime.cjs"),require("../../constants/canvas-ui.cjs");function e(e){return typeof e==`object`&&!!e&&`id`in e&&`timestamp`in e&&`source`in e&&typeof e.id==`string`&&e.id.length>0&&typeof e.timestamp==`string`&&e.timestamp.length>0&&typeof e.source==`string`&&(e.source===`agent`||e.source===`user`||e.source===`environment`||e.source===`hook`)}var t=e=>e.source===`environment`&&`action_id`in e&&`observation`in e&&e.observation!==null&&typeof e.observation==`object`&&`kind`in e.observation,n=e=>e.source===`agent`&&`tool_name`in e&&`tool_call_id`in e&&`error`in e&&typeof e.tool_name==`string`&&typeof e.tool_call_id==`string`&&typeof e.error==`string`,r=e=>`llm_message`in e&&typeof e.llm_message==`object`&&e.llm_message!==null&&`role`in e.llm_message&&`content`in e.llm_message,i=e=>r(e)&&e.llm_message.role===`user`,a=e=>e.source===`agent`&&`action`in e&&e.action!==null&&typeof e.action==`object`&&`kind`in e.action&&`tool_name`in e&&`tool_call_id`in e&&typeof e.tool_name==`string`&&typeof e.tool_call_id==`string`,o=e=>a(e)&&(e.action.kind===`ExecuteBashAction`||e.action.kind===`TerminalAction`),s=e=>t(e)&&(e.observation.kind===`ExecuteBashObservation`||e.observation.kind===`TerminalObservation`),c=e=>t(e)&&e.observation.kind===`PlanningFileEditorObservation`,l=e=>t(e)&&e.observation.kind===`BrowserObservation`,u=e=>t(e)&&e.observation.kind===`SwitchLLMObservation`,d=e=>a(e)&&e.action.kind===`BrowserNavigateAction`,f=e=>a(e)&&(e.tool_name===`canvas_ui`||e.tool_name===`canvas_ui_control`),p=e=>e.source===`agent`&&`system_prompt`in e&&`tools`in e&&typeof e.system_prompt==`object`&&Array.isArray(e.tools),
|
|
1
|
+
require("../../_virtual/_rolldown/runtime.cjs"),require("../../constants/canvas-ui.cjs"),require("../../constants/child-conversation.cjs");function e(e){return typeof e==`object`&&!!e&&`id`in e&&`timestamp`in e&&`source`in e&&typeof e.id==`string`&&e.id.length>0&&typeof e.timestamp==`string`&&e.timestamp.length>0&&typeof e.source==`string`&&(e.source===`agent`||e.source===`user`||e.source===`environment`||e.source===`hook`)}var t=e=>e.source===`environment`&&`action_id`in e&&`observation`in e&&e.observation!==null&&typeof e.observation==`object`&&`kind`in e.observation,n=e=>e.source===`agent`&&`tool_name`in e&&`tool_call_id`in e&&`error`in e&&typeof e.tool_name==`string`&&typeof e.tool_call_id==`string`&&typeof e.error==`string`,r=e=>`llm_message`in e&&typeof e.llm_message==`object`&&e.llm_message!==null&&`role`in e.llm_message&&`content`in e.llm_message,i=e=>r(e)&&e.llm_message.role===`user`,a=e=>e.source===`agent`&&`action`in e&&e.action!==null&&typeof e.action==`object`&&`kind`in e.action&&`tool_name`in e&&`tool_call_id`in e&&typeof e.tool_name==`string`&&typeof e.tool_call_id==`string`,o=e=>a(e)&&(e.action.kind===`ExecuteBashAction`||e.action.kind===`TerminalAction`),s=e=>t(e)&&(e.observation.kind===`ExecuteBashObservation`||e.observation.kind===`TerminalObservation`),c=e=>t(e)&&e.observation.kind===`PlanningFileEditorObservation`,l=e=>t(e)&&e.observation.kind===`BrowserObservation`,u=e=>t(e)&&e.observation.kind===`SwitchLLMObservation`,d=e=>a(e)&&e.action.kind===`BrowserNavigateAction`,f=e=>a(e)&&(e.tool_name===`canvas_ui`||e.tool_name===`canvas_ui_control`),p=e=>a(e)&&e.tool_name===`launch_child_conversation`,m=e=>e.source===`agent`&&`system_prompt`in e&&`tools`in e&&typeof e.system_prompt==`object`&&Array.isArray(e.tools),h=e=>`kind`in e&&e.kind===`ConversationStateUpdateEvent`,g=e=>e.key===`full_state`,_=e=>e.key===`execution_status`,v=e=>e.key===`stats`,y=e=>e.key===`goal`,b=e=>`kind`in e&&e.kind===`ConversationErrorEvent`,x=e=>`kind`in e&&e.kind===`ServerErrorEvent`,S=e=>b(e)||x(e),C=e=>`kind`in e&&e.kind===`HookExecutionEvent`,w=e=>`kind`in e&&e.kind===`ACPToolCallEvent`,T=e=>`kind`in e&&e.kind===`StreamingDeltaEvent`;function E(t){return e(t)}exports.isACPToolCallEvent=w,exports.isActionEvent=a,exports.isAgentErrorEvent=n,exports.isAgentServerEvent=E,exports.isAgentStatusConversationStateUpdateEvent=_,exports.isBrowserNavigateActionEvent=d,exports.isBrowserObservationEvent=l,exports.isCanvasUIActionEvent=f,exports.isConversationStateUpdateEvent=h,exports.isDisplayableErrorEvent=S,exports.isExecuteBashActionEvent=o,exports.isExecuteBashObservationEvent=s,exports.isFullStateConversationStateUpdateEvent=g,exports.isGoalConversationStateUpdateEvent=y,exports.isHookExecutionEvent=C,exports.isLaunchChildConversationActionEvent=p,exports.isMessageEvent=r,exports.isObservationEvent=t,exports.isPlanningFileEditorObservationEvent=c,exports.isStatsConversationStateUpdateEvent=v,exports.isStreamingDeltaEvent=T,exports.isSwitchLLMObservationEvent=u,exports.isSystemPromptEvent=m,exports.isUserMessageEvent=i;
|
|
2
2
|
//# sourceMappingURL=type-guards.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type-guards.cjs","names":[],"sources":["../../../src/types/agent-server/type-guards.ts"],"sourcesContent":["import {\n CANVAS_UI_CLIENT_TOOL_NAME,\n LEGACY_CANVAS_UI_TOOL_NAME,\n} from \"#/constants/canvas-ui\";\n\nimport {\n OpenHandsEvent,\n ObservationEvent,\n BaseEvent,\n ExecuteBashAction,\n TerminalAction,\n ExecuteBashObservation,\n PlanningFileEditorObservation,\n TerminalObservation,\n BrowserObservation,\n BrowserNavigateAction,\n SwitchLLMObservation,\n CanvasUIAction,\n} from \"./core\";\nimport { AgentErrorEvent } from \"./core/events/observation-event\";\nimport { MessageEvent } from \"./core/events/message-event\";\nimport { ActionEvent } from \"./core/events/action-event\";\nimport {\n ConversationStateUpdateEvent,\n ConversationStateUpdateEventAgentStatus,\n ConversationStateUpdateEventFullState,\n ConversationStateUpdateEventStats,\n ConversationStateUpdateEventGoal,\n ConversationErrorEvent,\n ServerErrorEvent,\n} from \"./core/events/conversation-state-event\";\nimport { HookExecutionEvent } from \"./core/events/hook-execution-event\";\nimport { ACPToolCallEvent } from \"./core/events/acp-tool-call-event\";\nimport { StreamingDeltaEvent } from \"./core/events/streaming-delta-event\";\nimport { SystemPromptEvent } from \"./core/events/system-event\";\n\n/**\n * Type guard to check if an unknown value is a valid BaseEvent\n * @param value - The value to check\n * @returns true if the value is a valid BaseEvent\n */\nexport function isBaseEvent(value: unknown): value is BaseEvent {\n return (\n value !== null &&\n typeof value === \"object\" &&\n \"id\" in value &&\n \"timestamp\" in value &&\n \"source\" in value &&\n typeof value.id === \"string\" &&\n value.id.length > 0 &&\n typeof value.timestamp === \"string\" &&\n value.timestamp.length > 0 &&\n typeof value.source === \"string\" &&\n (value.source === \"agent\" ||\n value.source === \"user\" ||\n value.source === \"environment\" ||\n value.source === \"hook\")\n );\n}\n\n/**\n * Type guard function to check if an event is an observation event\n */\nexport const isObservationEvent = (\n event: OpenHandsEvent,\n): event is ObservationEvent =>\n event.source === \"environment\" &&\n \"action_id\" in event &&\n \"observation\" in event &&\n event.observation !== null &&\n typeof event.observation === \"object\" &&\n \"kind\" in event.observation;\n\n/**\n * Type guard function to check if an event is an agent error event\n */\nexport const isAgentErrorEvent = (\n event: OpenHandsEvent,\n): event is AgentErrorEvent =>\n event.source === \"agent\" &&\n \"tool_name\" in event &&\n \"tool_call_id\" in event &&\n \"error\" in event &&\n typeof event.tool_name === \"string\" &&\n typeof event.tool_call_id === \"string\" &&\n typeof event.error === \"string\";\n\n/**\n * Type guard function to check if an event is a message event (user or assistant)\n */\nexport const isMessageEvent = (event: OpenHandsEvent): event is MessageEvent =>\n \"llm_message\" in event &&\n typeof event.llm_message === \"object\" &&\n event.llm_message !== null &&\n \"role\" in event.llm_message &&\n \"content\" in event.llm_message;\n\n/**\n * Type guard function to check if an event is a user message event\n */\nexport const isUserMessageEvent = (\n event: OpenHandsEvent,\n): event is MessageEvent =>\n isMessageEvent(event) && event.llm_message.role === \"user\";\n\n/**\n * Type guard function to check if an event is an action event\n */\nexport const isActionEvent = (event: OpenHandsEvent): event is ActionEvent =>\n event.source === \"agent\" &&\n \"action\" in event &&\n event.action !== null &&\n typeof event.action === \"object\" &&\n \"kind\" in event.action &&\n \"tool_name\" in event &&\n \"tool_call_id\" in event &&\n typeof event.tool_name === \"string\" &&\n typeof event.tool_call_id === \"string\";\n\n/**\n * Type guard function to check if an action event is an ExecuteBashAction\n */\nexport const isExecuteBashActionEvent = (\n event: OpenHandsEvent,\n): event is ActionEvent<ExecuteBashAction | TerminalAction> =>\n isActionEvent(event) &&\n (event.action.kind === \"ExecuteBashAction\" ||\n event.action.kind === \"TerminalAction\");\n\n/**\n * Type guard function to check if an observation event contains terminal output\n */\nexport const isExecuteBashObservationEvent = (\n event: OpenHandsEvent,\n): event is ObservationEvent<ExecuteBashObservation | TerminalObservation> =>\n isObservationEvent(event) &&\n (event.observation.kind === \"ExecuteBashObservation\" ||\n event.observation.kind === \"TerminalObservation\");\n\n/**\n * Type guard function to check if an observation event is a PlanningFileEditorObservation\n */\nexport const isPlanningFileEditorObservationEvent = (\n event: OpenHandsEvent,\n): event is ObservationEvent<PlanningFileEditorObservation> =>\n isObservationEvent(event) &&\n event.observation.kind === \"PlanningFileEditorObservation\";\n\n/**\n * Type guard function to check if an observation event is a BrowserObservation\n */\nexport const isBrowserObservationEvent = (\n event: OpenHandsEvent,\n): event is ObservationEvent<BrowserObservation> =>\n isObservationEvent(event) && event.observation.kind === \"BrowserObservation\";\n\n/**\n * Type guard function to check if an observation event is a SwitchLLMObservation\n */\nexport const isSwitchLLMObservationEvent = (\n event: OpenHandsEvent,\n): event is ObservationEvent<SwitchLLMObservation> =>\n isObservationEvent(event) &&\n event.observation.kind === \"SwitchLLMObservation\";\n\n/**\n * Type guard function to check if an action event is a BrowserNavigateAction\n */\nexport const isBrowserNavigateActionEvent = (\n event: OpenHandsEvent,\n): event is ActionEvent<BrowserNavigateAction> =>\n isActionEvent(event) && event.action.kind === \"BrowserNavigateAction\";\n\n/**\n * Type guard for Canvas UI tool ActionEvents.\n *\n * Discriminating on tool_name supports legacy CanvasUIAction events and the\n * SDK-generated action kind without leaking that generated name here.\n */\nexport const isCanvasUIActionEvent = (\n event: OpenHandsEvent,\n): event is ActionEvent<CanvasUIAction> =>\n isActionEvent(event) &&\n (event.tool_name === LEGACY_CANVAS_UI_TOOL_NAME ||\n event.tool_name === CANVAS_UI_CLIENT_TOOL_NAME);\n\n/**\n * Type guard function to check if an event is a system prompt event\n */\nexport const isSystemPromptEvent = (\n event: OpenHandsEvent,\n): event is SystemPromptEvent =>\n event.source === \"agent\" &&\n \"system_prompt\" in event &&\n \"tools\" in event &&\n typeof event.system_prompt === \"object\" &&\n Array.isArray(event.tools);\n\n/**\n * Type guard function to check if an event is a conversation state update event\n */\nexport const isConversationStateUpdateEvent = (\n event: OpenHandsEvent,\n): event is ConversationStateUpdateEvent =>\n \"kind\" in event && event.kind === \"ConversationStateUpdateEvent\";\n\nexport const isFullStateConversationStateUpdateEvent = (\n event: ConversationStateUpdateEvent,\n): event is ConversationStateUpdateEventFullState => event.key === \"full_state\";\n\nexport const isAgentStatusConversationStateUpdateEvent = (\n event: ConversationStateUpdateEvent,\n): event is ConversationStateUpdateEventAgentStatus =>\n event.key === \"execution_status\";\n\nexport const isStatsConversationStateUpdateEvent = (\n event: ConversationStateUpdateEvent,\n): event is ConversationStateUpdateEventStats => event.key === \"stats\";\n\nexport const isGoalConversationStateUpdateEvent = (\n event: ConversationStateUpdateEvent,\n): event is ConversationStateUpdateEventGoal => event.key === \"goal\";\n\n/**\n * Type guard function to check if an event is a conversation error event\n */\nexport const isConversationErrorEvent = (\n event: OpenHandsEvent,\n): event is ConversationErrorEvent =>\n \"kind\" in event && event.kind === \"ConversationErrorEvent\";\n\n/**\n * Type guard function to check if an event is a server error event\n */\nexport const isServerErrorEvent = (\n event: OpenHandsEvent,\n): event is ServerErrorEvent =>\n \"kind\" in event && event.kind === \"ServerErrorEvent\";\n\n/**\n * Type guard function to check if an event is a displayable error event\n * (ConversationErrorEvent or ServerErrorEvent) - both should show as error banners\n */\nexport const isDisplayableErrorEvent = (event: OpenHandsEvent): boolean =>\n isConversationErrorEvent(event) || isServerErrorEvent(event);\n\n/**\n * Type guard function to check if an event is a hook execution event\n */\nexport const isHookExecutionEvent = (\n event: OpenHandsEvent,\n): event is HookExecutionEvent =>\n \"kind\" in event && event.kind === \"HookExecutionEvent\";\n\n/**\n * Type guard function to check if an event is an ACP tool call event\n */\nexport const isACPToolCallEvent = (\n event: OpenHandsEvent,\n): event is ACPToolCallEvent =>\n \"kind\" in event && event.kind === \"ACPToolCallEvent\";\n\nexport const isStreamingDeltaEvent = (\n event: OpenHandsEvent,\n): event is StreamingDeltaEvent =>\n \"kind\" in event && event.kind === \"StreamingDeltaEvent\";\n\n// =============================================================================\n// COMPATIBILITY TYPE GUARDS\n// =============================================================================\n\n/**\n * Type guard to check if an event is an agent-server OpenHandsEvent.\n * Uses isBaseEvent to validate the complete event structure.\n */\nexport function isAgentServerEvent(event: unknown): event is OpenHandsEvent {\n return isBaseEvent(event);\n}\n"],"mappings":"yFAyCA,SAAgB,EAAY,EAAoC,CAC9D,OAEE,OAAO,GAAU,YADjB,GAEA,OAAQ,GACR,cAAe,GACf,WAAY,GACZ,OAAO,EAAM,IAAO,UACpB,EAAM,GAAG,OAAS,GAClB,OAAO,EAAM,WAAc,UAC3B,EAAM,UAAU,OAAS,GACzB,OAAO,EAAM,QAAW,WACvB,EAAM,SAAW,SAChB,EAAM,SAAW,QACjB,EAAM,SAAW,eACjB,EAAM,SAAW,OAEvB,CAKA,IAAa,EACX,GAEA,EAAM,SAAW,eACjB,cAAe,GACf,gBAAiB,GACjB,EAAM,cAAgB,MACtB,OAAO,EAAM,aAAgB,UAC7B,SAAU,EAAM,YAKL,EACX,GAEA,EAAM,SAAW,SACjB,cAAe,GACf,iBAAkB,GAClB,UAAW,GACX,OAAO,EAAM,WAAc,UAC3B,OAAO,EAAM,cAAiB,UAC9B,OAAO,EAAM,OAAU,SAKZ,EAAkB,GAC7B,gBAAiB,GACjB,OAAO,EAAM,aAAgB,UAC7B,EAAM,cAAgB,MACtB,SAAU,EAAM,aAChB,YAAa,EAAM,YAKR,EACX,GAEA,EAAe,CAAK,GAAK,EAAM,YAAY,OAAS,OAKzC,EAAiB,GAC5B,EAAM,SAAW,SACjB,WAAY,GACZ,EAAM,SAAW,MACjB,OAAO,EAAM,QAAW,UACxB,SAAU,EAAM,QAChB,cAAe,GACf,iBAAkB,GAClB,OAAO,EAAM,WAAc,UAC3B,OAAO,EAAM,cAAiB,SAKnB,EACX,GAEA,EAAc,CAAK,IAClB,EAAM,OAAO,OAAS,qBACrB,EAAM,OAAO,OAAS,kBAKb,EACX,GAEA,EAAmB,CAAK,IACvB,EAAM,YAAY,OAAS,0BAC1B,EAAM,YAAY,OAAS,uBAKlB,EACX,GAEA,EAAmB,CAAK,GACxB,EAAM,YAAY,OAAS,gCAKhB,EACX,GAEA,EAAmB,CAAK,GAAK,EAAM,YAAY,OAAS,qBAK7C,EACX,GAEA,EAAmB,CAAK,GACxB,EAAM,YAAY,OAAS,uBAKhB,EACX,GAEA,EAAc,CAAK,GAAK,EAAM,OAAO,OAAS,wBAQnC,EACX,GAEA,EAAc,CAAK,IAClB,EAAM,YAAA,aACL,EAAM,YAAA,qBAKG,EACX,GAEA,EAAM,SAAW,SACjB,kBAAmB,GACnB,UAAW,GACX,OAAO,EAAM,eAAkB,UAC/B,MAAM,QAAQ,EAAM,KAAK,EAKd,EACX,GAEA,SAAU,GAAS,EAAM,OAAS,+BAEvB,EACX,GACmD,EAAM,MAAQ,aAEtD,EACX,GAEA,EAAM,MAAQ,mBAEH,EACX,GAC+C,EAAM,MAAQ,QAElD,EACX,GAC8C,EAAM,MAAQ,OAKjD,EACX,GAEA,SAAU,GAAS,EAAM,OAAS,yBAKvB,EACX,GAEA,SAAU,GAAS,EAAM,OAAS,mBAMvB,EAA2B,GACtC,EAAyB,CAAK,GAAK,EAAmB,CAAK,EAKhD,EACX,GAEA,SAAU,GAAS,EAAM,OAAS,qBAKvB,EACX,GAEA,SAAU,GAAS,EAAM,OAAS,mBAEvB,EACX,GAEA,SAAU,GAAS,EAAM,OAAS,sBAUpC,SAAgB,EAAmB,EAAyC,CAC1E,OAAO,EAAY,CAAK,CAC1B"}
|
|
1
|
+
{"version":3,"file":"type-guards.cjs","names":[],"sources":["../../../src/types/agent-server/type-guards.ts"],"sourcesContent":["import {\n CANVAS_UI_CLIENT_TOOL_NAME,\n LEGACY_CANVAS_UI_TOOL_NAME,\n} from \"#/constants/canvas-ui\";\nimport { LAUNCH_CHILD_CONVERSATION_TOOL_NAME } from \"#/constants/child-conversation\";\n\nimport {\n OpenHandsEvent,\n ObservationEvent,\n BaseEvent,\n ExecuteBashAction,\n TerminalAction,\n ExecuteBashObservation,\n PlanningFileEditorObservation,\n TerminalObservation,\n BrowserObservation,\n BrowserNavigateAction,\n SwitchLLMObservation,\n CanvasUIAction,\n LaunchChildConversationAction,\n} from \"./core\";\nimport { AgentErrorEvent } from \"./core/events/observation-event\";\nimport { MessageEvent } from \"./core/events/message-event\";\nimport { ActionEvent } from \"./core/events/action-event\";\nimport {\n ConversationStateUpdateEvent,\n ConversationStateUpdateEventAgentStatus,\n ConversationStateUpdateEventFullState,\n ConversationStateUpdateEventStats,\n ConversationStateUpdateEventGoal,\n ConversationErrorEvent,\n ServerErrorEvent,\n} from \"./core/events/conversation-state-event\";\nimport { HookExecutionEvent } from \"./core/events/hook-execution-event\";\nimport { ACPToolCallEvent } from \"./core/events/acp-tool-call-event\";\nimport { StreamingDeltaEvent } from \"./core/events/streaming-delta-event\";\nimport { SystemPromptEvent } from \"./core/events/system-event\";\n\n/**\n * Type guard to check if an unknown value is a valid BaseEvent\n * @param value - The value to check\n * @returns true if the value is a valid BaseEvent\n */\nexport function isBaseEvent(value: unknown): value is BaseEvent {\n return (\n value !== null &&\n typeof value === \"object\" &&\n \"id\" in value &&\n \"timestamp\" in value &&\n \"source\" in value &&\n typeof value.id === \"string\" &&\n value.id.length > 0 &&\n typeof value.timestamp === \"string\" &&\n value.timestamp.length > 0 &&\n typeof value.source === \"string\" &&\n (value.source === \"agent\" ||\n value.source === \"user\" ||\n value.source === \"environment\" ||\n value.source === \"hook\")\n );\n}\n\n/**\n * Type guard function to check if an event is an observation event\n */\nexport const isObservationEvent = (\n event: OpenHandsEvent,\n): event is ObservationEvent =>\n event.source === \"environment\" &&\n \"action_id\" in event &&\n \"observation\" in event &&\n event.observation !== null &&\n typeof event.observation === \"object\" &&\n \"kind\" in event.observation;\n\n/**\n * Type guard function to check if an event is an agent error event\n */\nexport const isAgentErrorEvent = (\n event: OpenHandsEvent,\n): event is AgentErrorEvent =>\n event.source === \"agent\" &&\n \"tool_name\" in event &&\n \"tool_call_id\" in event &&\n \"error\" in event &&\n typeof event.tool_name === \"string\" &&\n typeof event.tool_call_id === \"string\" &&\n typeof event.error === \"string\";\n\n/**\n * Type guard function to check if an event is a message event (user or assistant)\n */\nexport const isMessageEvent = (event: OpenHandsEvent): event is MessageEvent =>\n \"llm_message\" in event &&\n typeof event.llm_message === \"object\" &&\n event.llm_message !== null &&\n \"role\" in event.llm_message &&\n \"content\" in event.llm_message;\n\n/**\n * Type guard function to check if an event is a user message event\n */\nexport const isUserMessageEvent = (\n event: OpenHandsEvent,\n): event is MessageEvent =>\n isMessageEvent(event) && event.llm_message.role === \"user\";\n\n/**\n * Type guard function to check if an event is an action event\n */\nexport const isActionEvent = (event: OpenHandsEvent): event is ActionEvent =>\n event.source === \"agent\" &&\n \"action\" in event &&\n event.action !== null &&\n typeof event.action === \"object\" &&\n \"kind\" in event.action &&\n \"tool_name\" in event &&\n \"tool_call_id\" in event &&\n typeof event.tool_name === \"string\" &&\n typeof event.tool_call_id === \"string\";\n\n/**\n * Type guard function to check if an action event is an ExecuteBashAction\n */\nexport const isExecuteBashActionEvent = (\n event: OpenHandsEvent,\n): event is ActionEvent<ExecuteBashAction | TerminalAction> =>\n isActionEvent(event) &&\n (event.action.kind === \"ExecuteBashAction\" ||\n event.action.kind === \"TerminalAction\");\n\n/**\n * Type guard function to check if an observation event contains terminal output\n */\nexport const isExecuteBashObservationEvent = (\n event: OpenHandsEvent,\n): event is ObservationEvent<ExecuteBashObservation | TerminalObservation> =>\n isObservationEvent(event) &&\n (event.observation.kind === \"ExecuteBashObservation\" ||\n event.observation.kind === \"TerminalObservation\");\n\n/**\n * Type guard function to check if an observation event is a PlanningFileEditorObservation\n */\nexport const isPlanningFileEditorObservationEvent = (\n event: OpenHandsEvent,\n): event is ObservationEvent<PlanningFileEditorObservation> =>\n isObservationEvent(event) &&\n event.observation.kind === \"PlanningFileEditorObservation\";\n\n/**\n * Type guard function to check if an observation event is a BrowserObservation\n */\nexport const isBrowserObservationEvent = (\n event: OpenHandsEvent,\n): event is ObservationEvent<BrowserObservation> =>\n isObservationEvent(event) && event.observation.kind === \"BrowserObservation\";\n\n/**\n * Type guard function to check if an observation event is a SwitchLLMObservation\n */\nexport const isSwitchLLMObservationEvent = (\n event: OpenHandsEvent,\n): event is ObservationEvent<SwitchLLMObservation> =>\n isObservationEvent(event) &&\n event.observation.kind === \"SwitchLLMObservation\";\n\n/**\n * Type guard function to check if an action event is a BrowserNavigateAction\n */\nexport const isBrowserNavigateActionEvent = (\n event: OpenHandsEvent,\n): event is ActionEvent<BrowserNavigateAction> =>\n isActionEvent(event) && event.action.kind === \"BrowserNavigateAction\";\n\n/**\n * Type guard for Canvas UI tool ActionEvents.\n *\n * Discriminating on tool_name supports legacy CanvasUIAction events and the\n * SDK-generated action kind without leaking that generated name here.\n */\nexport const isCanvasUIActionEvent = (\n event: OpenHandsEvent,\n): event is ActionEvent<CanvasUIAction> =>\n isActionEvent(event) &&\n (event.tool_name === LEGACY_CANVAS_UI_TOOL_NAME ||\n event.tool_name === CANVAS_UI_CLIENT_TOOL_NAME);\n\n/**\n * Type guard for launch-child-conversation tool ActionEvents.\n *\n * Discriminates on tool_name, like `isCanvasUIActionEvent`, so the\n * SDK-generated action kind stays contained in the constants module.\n */\nexport const isLaunchChildConversationActionEvent = (\n event: OpenHandsEvent,\n): event is ActionEvent<LaunchChildConversationAction> =>\n isActionEvent(event) &&\n event.tool_name === LAUNCH_CHILD_CONVERSATION_TOOL_NAME;\n\n/**\n * Type guard function to check if an event is a system prompt event\n */\nexport const isSystemPromptEvent = (\n event: OpenHandsEvent,\n): event is SystemPromptEvent =>\n event.source === \"agent\" &&\n \"system_prompt\" in event &&\n \"tools\" in event &&\n typeof event.system_prompt === \"object\" &&\n Array.isArray(event.tools);\n\n/**\n * Type guard function to check if an event is a conversation state update event\n */\nexport const isConversationStateUpdateEvent = (\n event: OpenHandsEvent,\n): event is ConversationStateUpdateEvent =>\n \"kind\" in event && event.kind === \"ConversationStateUpdateEvent\";\n\nexport const isFullStateConversationStateUpdateEvent = (\n event: ConversationStateUpdateEvent,\n): event is ConversationStateUpdateEventFullState => event.key === \"full_state\";\n\nexport const isAgentStatusConversationStateUpdateEvent = (\n event: ConversationStateUpdateEvent,\n): event is ConversationStateUpdateEventAgentStatus =>\n event.key === \"execution_status\";\n\nexport const isStatsConversationStateUpdateEvent = (\n event: ConversationStateUpdateEvent,\n): event is ConversationStateUpdateEventStats => event.key === \"stats\";\n\nexport const isGoalConversationStateUpdateEvent = (\n event: ConversationStateUpdateEvent,\n): event is ConversationStateUpdateEventGoal => event.key === \"goal\";\n\n/**\n * Type guard function to check if an event is a conversation error event\n */\nexport const isConversationErrorEvent = (\n event: OpenHandsEvent,\n): event is ConversationErrorEvent =>\n \"kind\" in event && event.kind === \"ConversationErrorEvent\";\n\n/**\n * Type guard function to check if an event is a server error event\n */\nexport const isServerErrorEvent = (\n event: OpenHandsEvent,\n): event is ServerErrorEvent =>\n \"kind\" in event && event.kind === \"ServerErrorEvent\";\n\n/**\n * Type guard function to check if an event is a displayable error event\n * (ConversationErrorEvent or ServerErrorEvent) - both should show as error banners\n */\nexport const isDisplayableErrorEvent = (event: OpenHandsEvent): boolean =>\n isConversationErrorEvent(event) || isServerErrorEvent(event);\n\n/**\n * Type guard function to check if an event is a hook execution event\n */\nexport const isHookExecutionEvent = (\n event: OpenHandsEvent,\n): event is HookExecutionEvent =>\n \"kind\" in event && event.kind === \"HookExecutionEvent\";\n\n/**\n * Type guard function to check if an event is an ACP tool call event\n */\nexport const isACPToolCallEvent = (\n event: OpenHandsEvent,\n): event is ACPToolCallEvent =>\n \"kind\" in event && event.kind === \"ACPToolCallEvent\";\n\nexport const isStreamingDeltaEvent = (\n event: OpenHandsEvent,\n): event is StreamingDeltaEvent =>\n \"kind\" in event && event.kind === \"StreamingDeltaEvent\";\n\n// =============================================================================\n// COMPATIBILITY TYPE GUARDS\n// =============================================================================\n\n/**\n * Type guard to check if an event is an agent-server OpenHandsEvent.\n * Uses isBaseEvent to validate the complete event structure.\n */\nexport function isAgentServerEvent(event: unknown): event is OpenHandsEvent {\n return isBaseEvent(event);\n}\n"],"mappings":"2IA2CA,SAAgB,EAAY,EAAoC,CAC9D,OAEE,OAAO,GAAU,YADjB,GAEA,OAAQ,GACR,cAAe,GACf,WAAY,GACZ,OAAO,EAAM,IAAO,UACpB,EAAM,GAAG,OAAS,GAClB,OAAO,EAAM,WAAc,UAC3B,EAAM,UAAU,OAAS,GACzB,OAAO,EAAM,QAAW,WACvB,EAAM,SAAW,SAChB,EAAM,SAAW,QACjB,EAAM,SAAW,eACjB,EAAM,SAAW,OAEvB,CAKA,IAAa,EACX,GAEA,EAAM,SAAW,eACjB,cAAe,GACf,gBAAiB,GACjB,EAAM,cAAgB,MACtB,OAAO,EAAM,aAAgB,UAC7B,SAAU,EAAM,YAKL,EACX,GAEA,EAAM,SAAW,SACjB,cAAe,GACf,iBAAkB,GAClB,UAAW,GACX,OAAO,EAAM,WAAc,UAC3B,OAAO,EAAM,cAAiB,UAC9B,OAAO,EAAM,OAAU,SAKZ,EAAkB,GAC7B,gBAAiB,GACjB,OAAO,EAAM,aAAgB,UAC7B,EAAM,cAAgB,MACtB,SAAU,EAAM,aAChB,YAAa,EAAM,YAKR,EACX,GAEA,EAAe,CAAK,GAAK,EAAM,YAAY,OAAS,OAKzC,EAAiB,GAC5B,EAAM,SAAW,SACjB,WAAY,GACZ,EAAM,SAAW,MACjB,OAAO,EAAM,QAAW,UACxB,SAAU,EAAM,QAChB,cAAe,GACf,iBAAkB,GAClB,OAAO,EAAM,WAAc,UAC3B,OAAO,EAAM,cAAiB,SAKnB,EACX,GAEA,EAAc,CAAK,IAClB,EAAM,OAAO,OAAS,qBACrB,EAAM,OAAO,OAAS,kBAKb,EACX,GAEA,EAAmB,CAAK,IACvB,EAAM,YAAY,OAAS,0BAC1B,EAAM,YAAY,OAAS,uBAKlB,EACX,GAEA,EAAmB,CAAK,GACxB,EAAM,YAAY,OAAS,gCAKhB,EACX,GAEA,EAAmB,CAAK,GAAK,EAAM,YAAY,OAAS,qBAK7C,EACX,GAEA,EAAmB,CAAK,GACxB,EAAM,YAAY,OAAS,uBAKhB,EACX,GAEA,EAAc,CAAK,GAAK,EAAM,OAAO,OAAS,wBAQnC,EACX,GAEA,EAAc,CAAK,IAClB,EAAM,YAAA,aACL,EAAM,YAAA,qBAQG,EACX,GAEA,EAAc,CAAK,GACnB,EAAM,YAAA,4BAKK,EACX,GAEA,EAAM,SAAW,SACjB,kBAAmB,GACnB,UAAW,GACX,OAAO,EAAM,eAAkB,UAC/B,MAAM,QAAQ,EAAM,KAAK,EAKd,EACX,GAEA,SAAU,GAAS,EAAM,OAAS,+BAEvB,EACX,GACmD,EAAM,MAAQ,aAEtD,EACX,GAEA,EAAM,MAAQ,mBAEH,EACX,GAC+C,EAAM,MAAQ,QAElD,EACX,GAC8C,EAAM,MAAQ,OAKjD,EACX,GAEA,SAAU,GAAS,EAAM,OAAS,yBAKvB,EACX,GAEA,SAAU,GAAS,EAAM,OAAS,mBAMvB,EAA2B,GACtC,EAAyB,CAAK,GAAK,EAAmB,CAAK,EAKhD,EACX,GAEA,SAAU,GAAS,EAAM,OAAS,qBAKvB,EACX,GAEA,SAAU,GAAS,EAAM,OAAS,mBAEvB,EACX,GAEA,SAAU,GAAS,EAAM,OAAS,sBAUpC,SAAgB,EAAmB,EAAyC,CAC1E,OAAO,EAAY,CAAK,CAC1B"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { OpenHandsEvent, ObservationEvent, BaseEvent, ExecuteBashAction, TerminalAction, ExecuteBashObservation, PlanningFileEditorObservation, TerminalObservation, BrowserObservation, BrowserNavigateAction, SwitchLLMObservation, CanvasUIAction } from "./core";
|
|
1
|
+
import { OpenHandsEvent, ObservationEvent, BaseEvent, ExecuteBashAction, TerminalAction, ExecuteBashObservation, PlanningFileEditorObservation, TerminalObservation, BrowserObservation, BrowserNavigateAction, SwitchLLMObservation, CanvasUIAction, LaunchChildConversationAction } from "./core";
|
|
2
2
|
import { AgentErrorEvent } from "./core/events/observation-event";
|
|
3
3
|
import { MessageEvent } from "./core/events/message-event";
|
|
4
4
|
import { ActionEvent } from "./core/events/action-event";
|
|
@@ -64,6 +64,13 @@ export declare const isBrowserNavigateActionEvent: (event: OpenHandsEvent) => ev
|
|
|
64
64
|
* SDK-generated action kind without leaking that generated name here.
|
|
65
65
|
*/
|
|
66
66
|
export declare const isCanvasUIActionEvent: (event: OpenHandsEvent) => event is ActionEvent<CanvasUIAction>;
|
|
67
|
+
/**
|
|
68
|
+
* Type guard for launch-child-conversation tool ActionEvents.
|
|
69
|
+
*
|
|
70
|
+
* Discriminates on tool_name, like `isCanvasUIActionEvent`, so the
|
|
71
|
+
* SDK-generated action kind stays contained in the constants module.
|
|
72
|
+
*/
|
|
73
|
+
export declare const isLaunchChildConversationActionEvent: (event: OpenHandsEvent) => event is ActionEvent<LaunchChildConversationAction>;
|
|
67
74
|
/**
|
|
68
75
|
* Type guard function to check if an event is a system prompt event
|
|
69
76
|
*/
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import "../../constants/canvas-ui.js";
|
|
2
|
+
import "../../constants/child-conversation.js";
|
|
2
3
|
//#region src/types/agent-server/type-guards.ts
|
|
3
4
|
function e(e) {
|
|
4
5
|
return typeof e == "object" && !!e && "id" in e && "timestamp" in e && "source" in e && typeof e.id == "string" && e.id.length > 0 && typeof e.timestamp == "string" && e.timestamp.length > 0 && typeof e.source == "string" && (e.source === "agent" || e.source === "user" || e.source === "environment" || e.source === "hook");
|
|
5
6
|
}
|
|
6
|
-
var t = (e) => e.source === "environment" && "action_id" in e && "observation" in e && e.observation !== null && typeof e.observation == "object" && "kind" in e.observation, n = (e) => e.source === "agent" && "tool_name" in e && "tool_call_id" in e && "error" in e && typeof e.tool_name == "string" && typeof e.tool_call_id == "string" && typeof e.error == "string", r = (e) => "llm_message" in e && typeof e.llm_message == "object" && e.llm_message !== null && "role" in e.llm_message && "content" in e.llm_message, i = (e) => r(e) && e.llm_message.role === "user", a = (e) => e.source === "agent" && "action" in e && e.action !== null && typeof e.action == "object" && "kind" in e.action && "tool_name" in e && "tool_call_id" in e && typeof e.tool_name == "string" && typeof e.tool_call_id == "string", o = (e) => a(e) && (e.action.kind === "ExecuteBashAction" || e.action.kind === "TerminalAction"), s = (e) => t(e) && (e.observation.kind === "ExecuteBashObservation" || e.observation.kind === "TerminalObservation"), c = (e) => t(e) && e.observation.kind === "PlanningFileEditorObservation", l = (e) => t(e) && e.observation.kind === "BrowserObservation", u = (e) => t(e) && e.observation.kind === "SwitchLLMObservation", d = (e) => a(e) && e.action.kind === "BrowserNavigateAction", f = (e) => a(e) && (e.tool_name === "canvas_ui" || e.tool_name === "canvas_ui_control"), p = (e) => e.source === "agent" && "system_prompt" in e && "tools" in e && typeof e.system_prompt == "object" && Array.isArray(e.tools),
|
|
7
|
-
function
|
|
7
|
+
var t = (e) => e.source === "environment" && "action_id" in e && "observation" in e && e.observation !== null && typeof e.observation == "object" && "kind" in e.observation, n = (e) => e.source === "agent" && "tool_name" in e && "tool_call_id" in e && "error" in e && typeof e.tool_name == "string" && typeof e.tool_call_id == "string" && typeof e.error == "string", r = (e) => "llm_message" in e && typeof e.llm_message == "object" && e.llm_message !== null && "role" in e.llm_message && "content" in e.llm_message, i = (e) => r(e) && e.llm_message.role === "user", a = (e) => e.source === "agent" && "action" in e && e.action !== null && typeof e.action == "object" && "kind" in e.action && "tool_name" in e && "tool_call_id" in e && typeof e.tool_name == "string" && typeof e.tool_call_id == "string", o = (e) => a(e) && (e.action.kind === "ExecuteBashAction" || e.action.kind === "TerminalAction"), s = (e) => t(e) && (e.observation.kind === "ExecuteBashObservation" || e.observation.kind === "TerminalObservation"), c = (e) => t(e) && e.observation.kind === "PlanningFileEditorObservation", l = (e) => t(e) && e.observation.kind === "BrowserObservation", u = (e) => t(e) && e.observation.kind === "SwitchLLMObservation", d = (e) => a(e) && e.action.kind === "BrowserNavigateAction", f = (e) => a(e) && (e.tool_name === "canvas_ui" || e.tool_name === "canvas_ui_control"), p = (e) => a(e) && e.tool_name === "launch_child_conversation", m = (e) => e.source === "agent" && "system_prompt" in e && "tools" in e && typeof e.system_prompt == "object" && Array.isArray(e.tools), h = (e) => "kind" in e && e.kind === "ConversationStateUpdateEvent", g = (e) => e.key === "full_state", _ = (e) => e.key === "execution_status", v = (e) => e.key === "stats", y = (e) => e.key === "goal", b = (e) => "kind" in e && e.kind === "ConversationErrorEvent", x = (e) => "kind" in e && e.kind === "ServerErrorEvent", S = (e) => b(e) || x(e), C = (e) => "kind" in e && e.kind === "HookExecutionEvent", w = (e) => "kind" in e && e.kind === "ACPToolCallEvent", T = (e) => "kind" in e && e.kind === "StreamingDeltaEvent";
|
|
8
|
+
function E(t) {
|
|
8
9
|
return e(t);
|
|
9
10
|
}
|
|
10
11
|
//#endregion
|
|
11
|
-
export {
|
|
12
|
+
export { w as isACPToolCallEvent, a as isActionEvent, n as isAgentErrorEvent, E as isAgentServerEvent, _ as isAgentStatusConversationStateUpdateEvent, d as isBrowserNavigateActionEvent, l as isBrowserObservationEvent, f as isCanvasUIActionEvent, h as isConversationStateUpdateEvent, S as isDisplayableErrorEvent, o as isExecuteBashActionEvent, s as isExecuteBashObservationEvent, g as isFullStateConversationStateUpdateEvent, y as isGoalConversationStateUpdateEvent, C as isHookExecutionEvent, p as isLaunchChildConversationActionEvent, r as isMessageEvent, t as isObservationEvent, c as isPlanningFileEditorObservationEvent, v as isStatsConversationStateUpdateEvent, T as isStreamingDeltaEvent, u as isSwitchLLMObservationEvent, m as isSystemPromptEvent, i as isUserMessageEvent };
|
|
12
13
|
|
|
13
14
|
//# sourceMappingURL=type-guards.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type-guards.js","names":[],"sources":["../../../src/types/agent-server/type-guards.ts"],"sourcesContent":["import {\n CANVAS_UI_CLIENT_TOOL_NAME,\n LEGACY_CANVAS_UI_TOOL_NAME,\n} from \"#/constants/canvas-ui\";\n\nimport {\n OpenHandsEvent,\n ObservationEvent,\n BaseEvent,\n ExecuteBashAction,\n TerminalAction,\n ExecuteBashObservation,\n PlanningFileEditorObservation,\n TerminalObservation,\n BrowserObservation,\n BrowserNavigateAction,\n SwitchLLMObservation,\n CanvasUIAction,\n} from \"./core\";\nimport { AgentErrorEvent } from \"./core/events/observation-event\";\nimport { MessageEvent } from \"./core/events/message-event\";\nimport { ActionEvent } from \"./core/events/action-event\";\nimport {\n ConversationStateUpdateEvent,\n ConversationStateUpdateEventAgentStatus,\n ConversationStateUpdateEventFullState,\n ConversationStateUpdateEventStats,\n ConversationStateUpdateEventGoal,\n ConversationErrorEvent,\n ServerErrorEvent,\n} from \"./core/events/conversation-state-event\";\nimport { HookExecutionEvent } from \"./core/events/hook-execution-event\";\nimport { ACPToolCallEvent } from \"./core/events/acp-tool-call-event\";\nimport { StreamingDeltaEvent } from \"./core/events/streaming-delta-event\";\nimport { SystemPromptEvent } from \"./core/events/system-event\";\n\n/**\n * Type guard to check if an unknown value is a valid BaseEvent\n * @param value - The value to check\n * @returns true if the value is a valid BaseEvent\n */\nexport function isBaseEvent(value: unknown): value is BaseEvent {\n return (\n value !== null &&\n typeof value === \"object\" &&\n \"id\" in value &&\n \"timestamp\" in value &&\n \"source\" in value &&\n typeof value.id === \"string\" &&\n value.id.length > 0 &&\n typeof value.timestamp === \"string\" &&\n value.timestamp.length > 0 &&\n typeof value.source === \"string\" &&\n (value.source === \"agent\" ||\n value.source === \"user\" ||\n value.source === \"environment\" ||\n value.source === \"hook\")\n );\n}\n\n/**\n * Type guard function to check if an event is an observation event\n */\nexport const isObservationEvent = (\n event: OpenHandsEvent,\n): event is ObservationEvent =>\n event.source === \"environment\" &&\n \"action_id\" in event &&\n \"observation\" in event &&\n event.observation !== null &&\n typeof event.observation === \"object\" &&\n \"kind\" in event.observation;\n\n/**\n * Type guard function to check if an event is an agent error event\n */\nexport const isAgentErrorEvent = (\n event: OpenHandsEvent,\n): event is AgentErrorEvent =>\n event.source === \"agent\" &&\n \"tool_name\" in event &&\n \"tool_call_id\" in event &&\n \"error\" in event &&\n typeof event.tool_name === \"string\" &&\n typeof event.tool_call_id === \"string\" &&\n typeof event.error === \"string\";\n\n/**\n * Type guard function to check if an event is a message event (user or assistant)\n */\nexport const isMessageEvent = (event: OpenHandsEvent): event is MessageEvent =>\n \"llm_message\" in event &&\n typeof event.llm_message === \"object\" &&\n event.llm_message !== null &&\n \"role\" in event.llm_message &&\n \"content\" in event.llm_message;\n\n/**\n * Type guard function to check if an event is a user message event\n */\nexport const isUserMessageEvent = (\n event: OpenHandsEvent,\n): event is MessageEvent =>\n isMessageEvent(event) && event.llm_message.role === \"user\";\n\n/**\n * Type guard function to check if an event is an action event\n */\nexport const isActionEvent = (event: OpenHandsEvent): event is ActionEvent =>\n event.source === \"agent\" &&\n \"action\" in event &&\n event.action !== null &&\n typeof event.action === \"object\" &&\n \"kind\" in event.action &&\n \"tool_name\" in event &&\n \"tool_call_id\" in event &&\n typeof event.tool_name === \"string\" &&\n typeof event.tool_call_id === \"string\";\n\n/**\n * Type guard function to check if an action event is an ExecuteBashAction\n */\nexport const isExecuteBashActionEvent = (\n event: OpenHandsEvent,\n): event is ActionEvent<ExecuteBashAction | TerminalAction> =>\n isActionEvent(event) &&\n (event.action.kind === \"ExecuteBashAction\" ||\n event.action.kind === \"TerminalAction\");\n\n/**\n * Type guard function to check if an observation event contains terminal output\n */\nexport const isExecuteBashObservationEvent = (\n event: OpenHandsEvent,\n): event is ObservationEvent<ExecuteBashObservation | TerminalObservation> =>\n isObservationEvent(event) &&\n (event.observation.kind === \"ExecuteBashObservation\" ||\n event.observation.kind === \"TerminalObservation\");\n\n/**\n * Type guard function to check if an observation event is a PlanningFileEditorObservation\n */\nexport const isPlanningFileEditorObservationEvent = (\n event: OpenHandsEvent,\n): event is ObservationEvent<PlanningFileEditorObservation> =>\n isObservationEvent(event) &&\n event.observation.kind === \"PlanningFileEditorObservation\";\n\n/**\n * Type guard function to check if an observation event is a BrowserObservation\n */\nexport const isBrowserObservationEvent = (\n event: OpenHandsEvent,\n): event is ObservationEvent<BrowserObservation> =>\n isObservationEvent(event) && event.observation.kind === \"BrowserObservation\";\n\n/**\n * Type guard function to check if an observation event is a SwitchLLMObservation\n */\nexport const isSwitchLLMObservationEvent = (\n event: OpenHandsEvent,\n): event is ObservationEvent<SwitchLLMObservation> =>\n isObservationEvent(event) &&\n event.observation.kind === \"SwitchLLMObservation\";\n\n/**\n * Type guard function to check if an action event is a BrowserNavigateAction\n */\nexport const isBrowserNavigateActionEvent = (\n event: OpenHandsEvent,\n): event is ActionEvent<BrowserNavigateAction> =>\n isActionEvent(event) && event.action.kind === \"BrowserNavigateAction\";\n\n/**\n * Type guard for Canvas UI tool ActionEvents.\n *\n * Discriminating on tool_name supports legacy CanvasUIAction events and the\n * SDK-generated action kind without leaking that generated name here.\n */\nexport const isCanvasUIActionEvent = (\n event: OpenHandsEvent,\n): event is ActionEvent<CanvasUIAction> =>\n isActionEvent(event) &&\n (event.tool_name === LEGACY_CANVAS_UI_TOOL_NAME ||\n event.tool_name === CANVAS_UI_CLIENT_TOOL_NAME);\n\n/**\n * Type guard function to check if an event is a system prompt event\n */\nexport const isSystemPromptEvent = (\n event: OpenHandsEvent,\n): event is SystemPromptEvent =>\n event.source === \"agent\" &&\n \"system_prompt\" in event &&\n \"tools\" in event &&\n typeof event.system_prompt === \"object\" &&\n Array.isArray(event.tools);\n\n/**\n * Type guard function to check if an event is a conversation state update event\n */\nexport const isConversationStateUpdateEvent = (\n event: OpenHandsEvent,\n): event is ConversationStateUpdateEvent =>\n \"kind\" in event && event.kind === \"ConversationStateUpdateEvent\";\n\nexport const isFullStateConversationStateUpdateEvent = (\n event: ConversationStateUpdateEvent,\n): event is ConversationStateUpdateEventFullState => event.key === \"full_state\";\n\nexport const isAgentStatusConversationStateUpdateEvent = (\n event: ConversationStateUpdateEvent,\n): event is ConversationStateUpdateEventAgentStatus =>\n event.key === \"execution_status\";\n\nexport const isStatsConversationStateUpdateEvent = (\n event: ConversationStateUpdateEvent,\n): event is ConversationStateUpdateEventStats => event.key === \"stats\";\n\nexport const isGoalConversationStateUpdateEvent = (\n event: ConversationStateUpdateEvent,\n): event is ConversationStateUpdateEventGoal => event.key === \"goal\";\n\n/**\n * Type guard function to check if an event is a conversation error event\n */\nexport const isConversationErrorEvent = (\n event: OpenHandsEvent,\n): event is ConversationErrorEvent =>\n \"kind\" in event && event.kind === \"ConversationErrorEvent\";\n\n/**\n * Type guard function to check if an event is a server error event\n */\nexport const isServerErrorEvent = (\n event: OpenHandsEvent,\n): event is ServerErrorEvent =>\n \"kind\" in event && event.kind === \"ServerErrorEvent\";\n\n/**\n * Type guard function to check if an event is a displayable error event\n * (ConversationErrorEvent or ServerErrorEvent) - both should show as error banners\n */\nexport const isDisplayableErrorEvent = (event: OpenHandsEvent): boolean =>\n isConversationErrorEvent(event) || isServerErrorEvent(event);\n\n/**\n * Type guard function to check if an event is a hook execution event\n */\nexport const isHookExecutionEvent = (\n event: OpenHandsEvent,\n): event is HookExecutionEvent =>\n \"kind\" in event && event.kind === \"HookExecutionEvent\";\n\n/**\n * Type guard function to check if an event is an ACP tool call event\n */\nexport const isACPToolCallEvent = (\n event: OpenHandsEvent,\n): event is ACPToolCallEvent =>\n \"kind\" in event && event.kind === \"ACPToolCallEvent\";\n\nexport const isStreamingDeltaEvent = (\n event: OpenHandsEvent,\n): event is StreamingDeltaEvent =>\n \"kind\" in event && event.kind === \"StreamingDeltaEvent\";\n\n// =============================================================================\n// COMPATIBILITY TYPE GUARDS\n// =============================================================================\n\n/**\n * Type guard to check if an event is an agent-server OpenHandsEvent.\n * Uses isBaseEvent to validate the complete event structure.\n */\nexport function isAgentServerEvent(event: unknown): event is OpenHandsEvent {\n return isBaseEvent(event);\n}\n"],"mappings":";;AAyCA,SAAgB,EAAY,GAAoC;CAC9D,OAEE,OAAO,KAAU,cADjB,KAEA,QAAQ,KACR,eAAe,KACf,YAAY,KACZ,OAAO,EAAM,MAAO,YACpB,EAAM,GAAG,SAAS,KAClB,OAAO,EAAM,aAAc,YAC3B,EAAM,UAAU,SAAS,KACzB,OAAO,EAAM,UAAW,aACvB,EAAM,WAAW,WAChB,EAAM,WAAW,UACjB,EAAM,WAAW,iBACjB,EAAM,WAAW;AAEvB;AAKA,IAAa,KACX,MAEA,EAAM,WAAW,iBACjB,eAAe,KACf,iBAAiB,KACjB,EAAM,gBAAgB,QACtB,OAAO,EAAM,eAAgB,YAC7B,UAAU,EAAM,aAKL,KACX,MAEA,EAAM,WAAW,WACjB,eAAe,KACf,kBAAkB,KAClB,WAAW,KACX,OAAO,EAAM,aAAc,YAC3B,OAAO,EAAM,gBAAiB,YAC9B,OAAO,EAAM,SAAU,UAKZ,KAAkB,MAC7B,iBAAiB,KACjB,OAAO,EAAM,eAAgB,YAC7B,EAAM,gBAAgB,QACtB,UAAU,EAAM,eAChB,aAAa,EAAM,aAKR,KACX,MAEA,EAAe,CAAK,KAAK,EAAM,YAAY,SAAS,QAKzC,KAAiB,MAC5B,EAAM,WAAW,WACjB,YAAY,KACZ,EAAM,WAAW,QACjB,OAAO,EAAM,UAAW,YACxB,UAAU,EAAM,UAChB,eAAe,KACf,kBAAkB,KAClB,OAAO,EAAM,aAAc,YAC3B,OAAO,EAAM,gBAAiB,UAKnB,KACX,MAEA,EAAc,CAAK,MAClB,EAAM,OAAO,SAAS,uBACrB,EAAM,OAAO,SAAS,mBAKb,KACX,MAEA,EAAmB,CAAK,MACvB,EAAM,YAAY,SAAS,4BAC1B,EAAM,YAAY,SAAS,wBAKlB,KACX,MAEA,EAAmB,CAAK,KACxB,EAAM,YAAY,SAAS,iCAKhB,KACX,MAEA,EAAmB,CAAK,KAAK,EAAM,YAAY,SAAS,sBAK7C,KACX,MAEA,EAAmB,CAAK,KACxB,EAAM,YAAY,SAAS,wBAKhB,KACX,MAEA,EAAc,CAAK,KAAK,EAAM,OAAO,SAAS,yBAQnC,KACX,MAEA,EAAc,CAAK,MAClB,EAAM,cAAA,eACL,EAAM,cAAA,sBAKG,KACX,MAEA,EAAM,WAAW,WACjB,mBAAmB,KACnB,WAAW,KACX,OAAO,EAAM,iBAAkB,YAC/B,MAAM,QAAQ,EAAM,KAAK,GAKd,KACX,MAEA,UAAU,KAAS,EAAM,SAAS,gCAEvB,KACX,MACmD,EAAM,QAAQ,cAEtD,KACX,MAEA,EAAM,QAAQ,oBAEH,KACX,MAC+C,EAAM,QAAQ,SAElD,KACX,MAC8C,EAAM,QAAQ,QAKjD,KACX,MAEA,UAAU,KAAS,EAAM,SAAS,0BAKvB,KACX,MAEA,UAAU,KAAS,EAAM,SAAS,oBAMvB,KAA2B,MACtC,EAAyB,CAAK,KAAK,EAAmB,CAAK,GAKhD,KACX,MAEA,UAAU,KAAS,EAAM,SAAS,sBAKvB,KACX,MAEA,UAAU,KAAS,EAAM,SAAS,oBAEvB,KACX,MAEA,UAAU,KAAS,EAAM,SAAS;AAUpC,SAAgB,EAAmB,GAAyC;CAC1E,OAAO,EAAY,CAAK;AAC1B"}
|
|
1
|
+
{"version":3,"file":"type-guards.js","names":[],"sources":["../../../src/types/agent-server/type-guards.ts"],"sourcesContent":["import {\n CANVAS_UI_CLIENT_TOOL_NAME,\n LEGACY_CANVAS_UI_TOOL_NAME,\n} from \"#/constants/canvas-ui\";\nimport { LAUNCH_CHILD_CONVERSATION_TOOL_NAME } from \"#/constants/child-conversation\";\n\nimport {\n OpenHandsEvent,\n ObservationEvent,\n BaseEvent,\n ExecuteBashAction,\n TerminalAction,\n ExecuteBashObservation,\n PlanningFileEditorObservation,\n TerminalObservation,\n BrowserObservation,\n BrowserNavigateAction,\n SwitchLLMObservation,\n CanvasUIAction,\n LaunchChildConversationAction,\n} from \"./core\";\nimport { AgentErrorEvent } from \"./core/events/observation-event\";\nimport { MessageEvent } from \"./core/events/message-event\";\nimport { ActionEvent } from \"./core/events/action-event\";\nimport {\n ConversationStateUpdateEvent,\n ConversationStateUpdateEventAgentStatus,\n ConversationStateUpdateEventFullState,\n ConversationStateUpdateEventStats,\n ConversationStateUpdateEventGoal,\n ConversationErrorEvent,\n ServerErrorEvent,\n} from \"./core/events/conversation-state-event\";\nimport { HookExecutionEvent } from \"./core/events/hook-execution-event\";\nimport { ACPToolCallEvent } from \"./core/events/acp-tool-call-event\";\nimport { StreamingDeltaEvent } from \"./core/events/streaming-delta-event\";\nimport { SystemPromptEvent } from \"./core/events/system-event\";\n\n/**\n * Type guard to check if an unknown value is a valid BaseEvent\n * @param value - The value to check\n * @returns true if the value is a valid BaseEvent\n */\nexport function isBaseEvent(value: unknown): value is BaseEvent {\n return (\n value !== null &&\n typeof value === \"object\" &&\n \"id\" in value &&\n \"timestamp\" in value &&\n \"source\" in value &&\n typeof value.id === \"string\" &&\n value.id.length > 0 &&\n typeof value.timestamp === \"string\" &&\n value.timestamp.length > 0 &&\n typeof value.source === \"string\" &&\n (value.source === \"agent\" ||\n value.source === \"user\" ||\n value.source === \"environment\" ||\n value.source === \"hook\")\n );\n}\n\n/**\n * Type guard function to check if an event is an observation event\n */\nexport const isObservationEvent = (\n event: OpenHandsEvent,\n): event is ObservationEvent =>\n event.source === \"environment\" &&\n \"action_id\" in event &&\n \"observation\" in event &&\n event.observation !== null &&\n typeof event.observation === \"object\" &&\n \"kind\" in event.observation;\n\n/**\n * Type guard function to check if an event is an agent error event\n */\nexport const isAgentErrorEvent = (\n event: OpenHandsEvent,\n): event is AgentErrorEvent =>\n event.source === \"agent\" &&\n \"tool_name\" in event &&\n \"tool_call_id\" in event &&\n \"error\" in event &&\n typeof event.tool_name === \"string\" &&\n typeof event.tool_call_id === \"string\" &&\n typeof event.error === \"string\";\n\n/**\n * Type guard function to check if an event is a message event (user or assistant)\n */\nexport const isMessageEvent = (event: OpenHandsEvent): event is MessageEvent =>\n \"llm_message\" in event &&\n typeof event.llm_message === \"object\" &&\n event.llm_message !== null &&\n \"role\" in event.llm_message &&\n \"content\" in event.llm_message;\n\n/**\n * Type guard function to check if an event is a user message event\n */\nexport const isUserMessageEvent = (\n event: OpenHandsEvent,\n): event is MessageEvent =>\n isMessageEvent(event) && event.llm_message.role === \"user\";\n\n/**\n * Type guard function to check if an event is an action event\n */\nexport const isActionEvent = (event: OpenHandsEvent): event is ActionEvent =>\n event.source === \"agent\" &&\n \"action\" in event &&\n event.action !== null &&\n typeof event.action === \"object\" &&\n \"kind\" in event.action &&\n \"tool_name\" in event &&\n \"tool_call_id\" in event &&\n typeof event.tool_name === \"string\" &&\n typeof event.tool_call_id === \"string\";\n\n/**\n * Type guard function to check if an action event is an ExecuteBashAction\n */\nexport const isExecuteBashActionEvent = (\n event: OpenHandsEvent,\n): event is ActionEvent<ExecuteBashAction | TerminalAction> =>\n isActionEvent(event) &&\n (event.action.kind === \"ExecuteBashAction\" ||\n event.action.kind === \"TerminalAction\");\n\n/**\n * Type guard function to check if an observation event contains terminal output\n */\nexport const isExecuteBashObservationEvent = (\n event: OpenHandsEvent,\n): event is ObservationEvent<ExecuteBashObservation | TerminalObservation> =>\n isObservationEvent(event) &&\n (event.observation.kind === \"ExecuteBashObservation\" ||\n event.observation.kind === \"TerminalObservation\");\n\n/**\n * Type guard function to check if an observation event is a PlanningFileEditorObservation\n */\nexport const isPlanningFileEditorObservationEvent = (\n event: OpenHandsEvent,\n): event is ObservationEvent<PlanningFileEditorObservation> =>\n isObservationEvent(event) &&\n event.observation.kind === \"PlanningFileEditorObservation\";\n\n/**\n * Type guard function to check if an observation event is a BrowserObservation\n */\nexport const isBrowserObservationEvent = (\n event: OpenHandsEvent,\n): event is ObservationEvent<BrowserObservation> =>\n isObservationEvent(event) && event.observation.kind === \"BrowserObservation\";\n\n/**\n * Type guard function to check if an observation event is a SwitchLLMObservation\n */\nexport const isSwitchLLMObservationEvent = (\n event: OpenHandsEvent,\n): event is ObservationEvent<SwitchLLMObservation> =>\n isObservationEvent(event) &&\n event.observation.kind === \"SwitchLLMObservation\";\n\n/**\n * Type guard function to check if an action event is a BrowserNavigateAction\n */\nexport const isBrowserNavigateActionEvent = (\n event: OpenHandsEvent,\n): event is ActionEvent<BrowserNavigateAction> =>\n isActionEvent(event) && event.action.kind === \"BrowserNavigateAction\";\n\n/**\n * Type guard for Canvas UI tool ActionEvents.\n *\n * Discriminating on tool_name supports legacy CanvasUIAction events and the\n * SDK-generated action kind without leaking that generated name here.\n */\nexport const isCanvasUIActionEvent = (\n event: OpenHandsEvent,\n): event is ActionEvent<CanvasUIAction> =>\n isActionEvent(event) &&\n (event.tool_name === LEGACY_CANVAS_UI_TOOL_NAME ||\n event.tool_name === CANVAS_UI_CLIENT_TOOL_NAME);\n\n/**\n * Type guard for launch-child-conversation tool ActionEvents.\n *\n * Discriminates on tool_name, like `isCanvasUIActionEvent`, so the\n * SDK-generated action kind stays contained in the constants module.\n */\nexport const isLaunchChildConversationActionEvent = (\n event: OpenHandsEvent,\n): event is ActionEvent<LaunchChildConversationAction> =>\n isActionEvent(event) &&\n event.tool_name === LAUNCH_CHILD_CONVERSATION_TOOL_NAME;\n\n/**\n * Type guard function to check if an event is a system prompt event\n */\nexport const isSystemPromptEvent = (\n event: OpenHandsEvent,\n): event is SystemPromptEvent =>\n event.source === \"agent\" &&\n \"system_prompt\" in event &&\n \"tools\" in event &&\n typeof event.system_prompt === \"object\" &&\n Array.isArray(event.tools);\n\n/**\n * Type guard function to check if an event is a conversation state update event\n */\nexport const isConversationStateUpdateEvent = (\n event: OpenHandsEvent,\n): event is ConversationStateUpdateEvent =>\n \"kind\" in event && event.kind === \"ConversationStateUpdateEvent\";\n\nexport const isFullStateConversationStateUpdateEvent = (\n event: ConversationStateUpdateEvent,\n): event is ConversationStateUpdateEventFullState => event.key === \"full_state\";\n\nexport const isAgentStatusConversationStateUpdateEvent = (\n event: ConversationStateUpdateEvent,\n): event is ConversationStateUpdateEventAgentStatus =>\n event.key === \"execution_status\";\n\nexport const isStatsConversationStateUpdateEvent = (\n event: ConversationStateUpdateEvent,\n): event is ConversationStateUpdateEventStats => event.key === \"stats\";\n\nexport const isGoalConversationStateUpdateEvent = (\n event: ConversationStateUpdateEvent,\n): event is ConversationStateUpdateEventGoal => event.key === \"goal\";\n\n/**\n * Type guard function to check if an event is a conversation error event\n */\nexport const isConversationErrorEvent = (\n event: OpenHandsEvent,\n): event is ConversationErrorEvent =>\n \"kind\" in event && event.kind === \"ConversationErrorEvent\";\n\n/**\n * Type guard function to check if an event is a server error event\n */\nexport const isServerErrorEvent = (\n event: OpenHandsEvent,\n): event is ServerErrorEvent =>\n \"kind\" in event && event.kind === \"ServerErrorEvent\";\n\n/**\n * Type guard function to check if an event is a displayable error event\n * (ConversationErrorEvent or ServerErrorEvent) - both should show as error banners\n */\nexport const isDisplayableErrorEvent = (event: OpenHandsEvent): boolean =>\n isConversationErrorEvent(event) || isServerErrorEvent(event);\n\n/**\n * Type guard function to check if an event is a hook execution event\n */\nexport const isHookExecutionEvent = (\n event: OpenHandsEvent,\n): event is HookExecutionEvent =>\n \"kind\" in event && event.kind === \"HookExecutionEvent\";\n\n/**\n * Type guard function to check if an event is an ACP tool call event\n */\nexport const isACPToolCallEvent = (\n event: OpenHandsEvent,\n): event is ACPToolCallEvent =>\n \"kind\" in event && event.kind === \"ACPToolCallEvent\";\n\nexport const isStreamingDeltaEvent = (\n event: OpenHandsEvent,\n): event is StreamingDeltaEvent =>\n \"kind\" in event && event.kind === \"StreamingDeltaEvent\";\n\n// =============================================================================\n// COMPATIBILITY TYPE GUARDS\n// =============================================================================\n\n/**\n * Type guard to check if an event is an agent-server OpenHandsEvent.\n * Uses isBaseEvent to validate the complete event structure.\n */\nexport function isAgentServerEvent(event: unknown): event is OpenHandsEvent {\n return isBaseEvent(event);\n}\n"],"mappings":";;;AA2CA,SAAgB,EAAY,GAAoC;CAC9D,OAEE,OAAO,KAAU,cADjB,KAEA,QAAQ,KACR,eAAe,KACf,YAAY,KACZ,OAAO,EAAM,MAAO,YACpB,EAAM,GAAG,SAAS,KAClB,OAAO,EAAM,aAAc,YAC3B,EAAM,UAAU,SAAS,KACzB,OAAO,EAAM,UAAW,aACvB,EAAM,WAAW,WAChB,EAAM,WAAW,UACjB,EAAM,WAAW,iBACjB,EAAM,WAAW;AAEvB;AAKA,IAAa,KACX,MAEA,EAAM,WAAW,iBACjB,eAAe,KACf,iBAAiB,KACjB,EAAM,gBAAgB,QACtB,OAAO,EAAM,eAAgB,YAC7B,UAAU,EAAM,aAKL,KACX,MAEA,EAAM,WAAW,WACjB,eAAe,KACf,kBAAkB,KAClB,WAAW,KACX,OAAO,EAAM,aAAc,YAC3B,OAAO,EAAM,gBAAiB,YAC9B,OAAO,EAAM,SAAU,UAKZ,KAAkB,MAC7B,iBAAiB,KACjB,OAAO,EAAM,eAAgB,YAC7B,EAAM,gBAAgB,QACtB,UAAU,EAAM,eAChB,aAAa,EAAM,aAKR,KACX,MAEA,EAAe,CAAK,KAAK,EAAM,YAAY,SAAS,QAKzC,KAAiB,MAC5B,EAAM,WAAW,WACjB,YAAY,KACZ,EAAM,WAAW,QACjB,OAAO,EAAM,UAAW,YACxB,UAAU,EAAM,UAChB,eAAe,KACf,kBAAkB,KAClB,OAAO,EAAM,aAAc,YAC3B,OAAO,EAAM,gBAAiB,UAKnB,KACX,MAEA,EAAc,CAAK,MAClB,EAAM,OAAO,SAAS,uBACrB,EAAM,OAAO,SAAS,mBAKb,KACX,MAEA,EAAmB,CAAK,MACvB,EAAM,YAAY,SAAS,4BAC1B,EAAM,YAAY,SAAS,wBAKlB,KACX,MAEA,EAAmB,CAAK,KACxB,EAAM,YAAY,SAAS,iCAKhB,KACX,MAEA,EAAmB,CAAK,KAAK,EAAM,YAAY,SAAS,sBAK7C,KACX,MAEA,EAAmB,CAAK,KACxB,EAAM,YAAY,SAAS,wBAKhB,KACX,MAEA,EAAc,CAAK,KAAK,EAAM,OAAO,SAAS,yBAQnC,KACX,MAEA,EAAc,CAAK,MAClB,EAAM,cAAA,eACL,EAAM,cAAA,sBAQG,KACX,MAEA,EAAc,CAAK,KACnB,EAAM,cAAA,6BAKK,KACX,MAEA,EAAM,WAAW,WACjB,mBAAmB,KACnB,WAAW,KACX,OAAO,EAAM,iBAAkB,YAC/B,MAAM,QAAQ,EAAM,KAAK,GAKd,KACX,MAEA,UAAU,KAAS,EAAM,SAAS,gCAEvB,KACX,MACmD,EAAM,QAAQ,cAEtD,KACX,MAEA,EAAM,QAAQ,oBAEH,KACX,MAC+C,EAAM,QAAQ,SAElD,KACX,MAC8C,EAAM,QAAQ,QAKjD,KACX,MAEA,UAAU,KAAS,EAAM,SAAS,0BAKvB,KACX,MAEA,UAAU,KAAS,EAAM,SAAS,oBAMvB,KAA2B,MACtC,EAAyB,CAAK,KAAK,EAAmB,CAAK,GAKhD,KACX,MAEA,UAAU,KAAS,EAAM,SAAS,sBAKvB,KACX,MAEA,UAAU,KAAS,EAAM,SAAS,oBAEvB,KACX,MAEA,UAAU,KAAS,EAAM,SAAS;AAUpC,SAAgB,EAAmB,GAAyC;CAC1E,OAAO,EAAY,CAAK;AAC1B"}
|
|
@@ -75,6 +75,14 @@ export interface AutomationRun {
|
|
|
75
75
|
*/
|
|
76
76
|
bash_command_id: string | null;
|
|
77
77
|
error_detail: string | null;
|
|
78
|
+
/**
|
|
79
|
+
* Accumulated LLM cost of the run in USD, reported by the SDK in the
|
|
80
|
+
* completion callback. `null` means unknown — the run predates cost
|
|
81
|
+
* tracking, or ended without a callback (cancelled, watchdog timeout).
|
|
82
|
+
* Absent entirely when the automation service is older than the release
|
|
83
|
+
* that added the field, hence optional.
|
|
84
|
+
*/
|
|
85
|
+
cost?: number | null;
|
|
78
86
|
started_at: string;
|
|
79
87
|
completed_at: string | null;
|
|
80
88
|
}
|
|
@@ -96,4 +104,10 @@ export interface AutomationRunExportRow {
|
|
|
96
104
|
conversation_id: string | null;
|
|
97
105
|
conversation_url: string | null;
|
|
98
106
|
error: string | null;
|
|
107
|
+
/**
|
|
108
|
+
* Accumulated LLM cost in USD, or null when unknown. Unlike
|
|
109
|
+
* `AutomationRun["cost"]` this is always present: the row normalizes a
|
|
110
|
+
* missing field to null so every exported record has the same shape.
|
|
111
|
+
*/
|
|
112
|
+
cost: number | null;
|
|
99
113
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("../i18n/declaration.cjs"),n=require("../node_modules/lucide-react/dist/esm/icons/circle-x.cjs"),r=require("../constants/status-colors.cjs"),i=require("./utils.cjs"),a=require("./user-facing-error.cjs"),o=require("../i18n/index.cjs"),s=require("../node_modules/react-hot-toast/dist/index.cjs"),c=require("./toast-duration.cjs");let l=require("react");l=e.__toESM(l,1);let u=require("react/jsx-runtime");var d={background:`var(--oh-color-tertiary)`,border:`1px solid var(--oh-border-input)`,color:`#fff`,borderRadius:`var(--oh-radius)`,maxWidth:`400px`,wordBreak:`break-word`,overflowWrap:`anywhere`,whiteSpace:`pre-wrap`},f={position:`top-right`,style:d},p={...d,color:`var(--oh-muted)`};function m({message:e}){let t=l.default.useRef(null),[a,o]=l.default.useState(!1);return l.default.useLayoutEffect(()=>{let e=t.current;if(!e)return;let n=()=>{let t=Number.parseFloat(getComputedStyle(e).lineHeight);if(!Number.isFinite(t)||t<=0){o(!1);return}o(e.getBoundingClientRect().height>t*1.5)};n();let r=new ResizeObserver(n);return r.observe(e),()=>r.disconnect()},[e]),(0,u.jsxs)(`div`,{className:i.cn(`flex min-w-0 gap-2`,a?`items-start`:`items-center`),children:[(0,u.jsx)(n.CircleX,{"aria-hidden":!0,className:`h-4 w-4 shrink-0`,strokeWidth:2,style:{color:r.OH_STATUS_ERROR_COLOR}}),(0,u.jsx)(`span`,{ref:t,className:`min-w-0 flex-1 text-sm leading-5 [word-break:break-word] [overflow-wrap:anywhere]`,children:e})]})}var h={...f,icon:null,style:p},g=e=>{let n=e||o.default.t(t.I18nKey.STATUS$ERROR);a.isCorsOrNetworkErrorMessage(n)?n=o.default.t(t.I18nKey.ERROR$CORS_OR_NETWORK):a.isBackendRequestTimeoutMessage(n)&&(n=o.default.t(t.I18nKey.ERROR$BACKEND_REQUEST_TIMEOUT));let r=c.calculateToastDuration(n,4e3);s.zt((0,u.jsx)(m,{message:n}),{...h,duration:r})},_=e=>{let t=c.calculateToastDuration(e,5e3);s.zt.success((0,u.jsx)(`span`,{className:`[word-break:break-word] [overflow-wrap:anywhere]`,children:e}),{...f,duration:t})};exports.TOAST_OPTIONS=f,exports.displayErrorToast=g,exports.displaySuccessToast=_;
|
|
1
|
+
const e=require("../_virtual/_rolldown/runtime.cjs"),t=require("../i18n/declaration.cjs"),n=require("../node_modules/lucide-react/dist/esm/icons/circle-x.cjs"),r=require("../constants/status-colors.cjs"),i=require("./utils.cjs"),a=require("./user-facing-error.cjs"),o=require("../i18n/index.cjs"),s=require("../node_modules/react-hot-toast/dist/index.cjs"),c=require("./toast-duration.cjs");let l=require("react");l=e.__toESM(l,1);let u=require("react/jsx-runtime");var d={background:`var(--oh-color-tertiary)`,border:`1px solid var(--oh-border-input)`,color:`#fff`,borderRadius:`var(--oh-radius)`,maxWidth:`400px`,wordBreak:`break-word`,overflowWrap:`anywhere`,whiteSpace:`pre-wrap`},f={position:`top-right`,style:d},p={...d,color:`var(--oh-muted)`};function m({message:e}){let t=l.default.useRef(null),[a,o]=l.default.useState(!1);return l.default.useLayoutEffect(()=>{let e=t.current;if(!e)return;let n=()=>{let t=Number.parseFloat(getComputedStyle(e).lineHeight);if(!Number.isFinite(t)||t<=0){o(!1);return}o(e.getBoundingClientRect().height>t*1.5)};n();let r=new ResizeObserver(n);return r.observe(e),()=>r.disconnect()},[e]),(0,u.jsxs)(`div`,{className:i.cn(`flex min-w-0 gap-2`,a?`items-start`:`items-center`),children:[(0,u.jsx)(n.CircleX,{"aria-hidden":!0,className:`h-4 w-4 shrink-0`,strokeWidth:2,style:{color:r.OH_STATUS_ERROR_COLOR}}),(0,u.jsx)(`span`,{ref:t,className:`min-w-0 flex-1 text-sm leading-5 [word-break:break-word] [overflow-wrap:anywhere]`,children:e})]})}var h={...f,icon:null,style:p},g=e=>{let n=e||o.default.t(t.I18nKey.STATUS$ERROR);a.isCorsOrNetworkErrorMessage(n)?n=o.default.t(t.I18nKey.ERROR$CORS_OR_NETWORK):a.isBackendRequestTimeoutMessage(n)&&(n=o.default.t(t.I18nKey.ERROR$BACKEND_REQUEST_TIMEOUT));let r=c.calculateToastDuration(n,4e3);s.zt((0,u.jsx)(m,{message:n}),{...h,duration:r})},_=e=>{let t=c.calculateToastDuration(e,5e3);s.zt.success((0,u.jsx)(`span`,{className:`[word-break:break-word] [overflow-wrap:anywhere]`,children:e}),{...f,duration:t})},v=(e,t,n)=>{let r=c.calculateToastDuration(`${e} ${t}`,5e3);s.zt.success((0,u.jsxs)(`span`,{className:`[word-break:break-word] [overflow-wrap:anywhere]`,children:[e,` `,(0,u.jsx)(`a`,{className:`underline hover:no-underline`,href:n,children:t})]}),{...f,duration:r})};exports.TOAST_OPTIONS=f,exports.displayErrorToast=g,exports.displaySuccessToast=_,exports.displaySuccessToastWithLink=v;
|
|
2
2
|
//# sourceMappingURL=custom-toast-handlers.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-toast-handlers.cjs","names":[],"sources":["../../src/utils/custom-toast-handlers.tsx"],"sourcesContent":["import React, { CSSProperties, ReactNode } from \"react\";\nimport { CircleX } from \"lucide-react\";\nimport toast, { ToastOptions } from \"react-hot-toast\";\nimport { OH_STATUS_ERROR_COLOR } from \"#/constants/status-colors\";\nimport { calculateToastDuration } from \"./toast-duration\";\nimport { cn } from \"#/utils/utils\";\nimport i18n from \"#/i18n\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport {\n isBackendRequestTimeoutMessage,\n isCorsOrNetworkErrorMessage,\n} from \"./user-facing-error\";\n\n// react-hot-toast accepts only CSSProperties via the style option — cannot use className\nconst TOAST_STYLE: CSSProperties = {\n background: \"var(--oh-color-tertiary)\",\n border: \"1px solid var(--oh-border-input)\",\n color: \"#fff\",\n borderRadius: \"var(--oh-radius)\",\n maxWidth: \"400px\",\n wordBreak: \"break-word\",\n overflowWrap: \"anywhere\",\n whiteSpace: \"pre-wrap\",\n};\n\nexport const TOAST_OPTIONS: ToastOptions = {\n position: \"top-right\",\n style: TOAST_STYLE,\n};\n\nconst ERROR_TOAST_STYLE: CSSProperties = {\n ...TOAST_STYLE,\n color: \"var(--oh-muted)\",\n};\n\n/** Icon + message row; center icon for single-line text, top-align when wrapped. */\nexport function ErrorToastContent({ message }: { message: ReactNode }) {\n const contentRef = React.useRef<HTMLSpanElement>(null);\n const [isMultiLine, setIsMultiLine] = React.useState(false);\n\n React.useLayoutEffect(() => {\n const content = contentRef.current;\n if (!content) {\n return undefined;\n }\n\n const updateIsMultiLine = () => {\n const lineHeight = Number.parseFloat(\n getComputedStyle(content).lineHeight,\n );\n if (!Number.isFinite(lineHeight) || lineHeight <= 0) {\n setIsMultiLine(false);\n return;\n }\n\n setIsMultiLine(content.getBoundingClientRect().height > lineHeight * 1.5);\n };\n\n updateIsMultiLine();\n\n const observer = new ResizeObserver(updateIsMultiLine);\n observer.observe(content);\n\n return () => observer.disconnect();\n }, [message]);\n\n return (\n <div\n className={cn(\n \"flex min-w-0 gap-2\",\n isMultiLine ? \"items-start\" : \"items-center\",\n )}\n >\n <CircleX\n aria-hidden\n className=\"h-4 w-4 shrink-0\"\n strokeWidth={2}\n style={{ color: OH_STATUS_ERROR_COLOR }}\n />\n <span\n ref={contentRef}\n className=\"min-w-0 flex-1 text-sm leading-5 [word-break:break-word] [overflow-wrap:anywhere]\"\n >\n {message}\n </span>\n </div>\n );\n}\n\nexport const ERROR_TOAST_OPTIONS: ToastOptions = {\n ...TOAST_OPTIONS,\n icon: null,\n style: ERROR_TOAST_STYLE,\n};\n\nexport const displayErrorToast = (error: string | null | undefined) => {\n let errorMessage = error || i18n.t(I18nKey.STATUS$ERROR);\n if (isCorsOrNetworkErrorMessage(errorMessage)) {\n errorMessage = i18n.t(I18nKey.ERROR$CORS_OR_NETWORK);\n } else if (isBackendRequestTimeoutMessage(errorMessage)) {\n errorMessage = i18n.t(I18nKey.ERROR$BACKEND_REQUEST_TIMEOUT);\n }\n const duration = calculateToastDuration(errorMessage, 4000);\n toast(<ErrorToastContent message={errorMessage} />, {\n ...ERROR_TOAST_OPTIONS,\n duration,\n });\n};\n\nexport const displaySuccessToast = (message: string) => {\n const duration = calculateToastDuration(message, 5000);\n toast.success(\n <span className=\"[word-break:break-word] [overflow-wrap:anywhere]\">\n {message}\n </span>,\n { ...TOAST_OPTIONS, duration },\n );\n};\n\nexport const displaySuccessToastWithLink = (\n message: string,\n linkLabel: string,\n href: string,\n) => {\n const duration = calculateToastDuration(`${message} ${linkLabel}`, 5000);\n toast.success(\n <span className=\"[word-break:break-word] [overflow-wrap:anywhere]\">\n {message}{\" \"}\n <a className=\"underline hover:no-underline\" href={href}>\n {linkLabel}\n </a>\n </span>,\n { ...TOAST_OPTIONS, duration },\n );\n};\n\n/**\n * Neutral, non-success notice — used when an action completed but the outcome\n * is qualified (e.g. a secret was saved but the active backend can't consume it\n * yet). Renders without the success checkmark so it doesn't read as \"all good\".\n */\nexport const displayWarningToast = (message: string) => {\n const duration = calculateToastDuration(message, 6000);\n toast(\n <span className=\"[word-break:break-word] [overflow-wrap:anywhere]\">\n {message}\n </span>,\n { ...TOAST_OPTIONS, icon: \"⚠️\", duration },\n );\n};\n"],"mappings":"kdAcA,IAAM,EAA6B,CACjC,WAAY,2BACZ,OAAQ,mCACR,MAAO,OACP,aAAc,mBACd,SAAU,QACV,UAAW,aACX,aAAc,WACd,WAAY,UACd,EAEa,EAA8B,CACzC,SAAU,YACV,MAAO,CACT,EAEM,EAAmC,CACvC,GAAG,EACH,MAAO,iBACT,EAGA,SAAgB,EAAkB,CAAE,WAAmC,CACrE,IAAM,EAAa,EAAA,QAAM,OAAwB,IAAI,EAC/C,CAAC,EAAa,GAAkB,EAAA,QAAM,SAAS,EAAK,EA4B1D,OA1BA,EAAA,QAAM,oBAAsB,CAC1B,IAAM,EAAU,EAAW,QAC3B,GAAI,CAAC,EACH,OAGF,IAAM,MAA0B,CAC9B,IAAM,EAAa,OAAO,WACxB,iBAAiB,CAAO,EAAE,UAC5B,EACA,GAAI,CAAC,OAAO,SAAS,CAAU,GAAK,GAAc,EAAG,CACnD,EAAe,EAAK,EACpB,MACF,CAEA,EAAe,EAAQ,sBAAsB,EAAE,OAAS,EAAa,GAAG,CAC1E,EAEA,EAAkB,EAElB,IAAM,EAAW,IAAI,eAAe,CAAiB,EAGrD,OAFA,EAAS,QAAQ,CAAO,MAEX,EAAS,WAAW,CACnC,EAAG,CAAC,CAAO,CAAC,GAGV,EAAA,EAAA,MAAC,MAAD,CACE,UAAW,EAAA,GACT,qBACA,EAAc,cAAgB,cAChC,WAJF,EAME,EAAA,EAAA,KAAC,EAAA,QAAD,CACE,cAAA,GACA,UAAU,mBACV,YAAa,EACb,MAAO,CAAE,MAAO,EAAA,qBAAsB,CACvC,CAAA,GACD,EAAA,EAAA,KAAC,OAAD,CACE,IAAK,EACL,UAAU,6FAET,CACG,CAAA,CACH,GAET,CAEA,IAAa,EAAoC,CAC/C,GAAG,EACH,KAAM,KACN,MAAO,CACT,EAEa,EAAqB,GAAqC,CACrE,IAAI,EAAe,GAAS,EAAA,QAAK,EAAE,EAAA,QAAQ,YAAY,EACnD,EAAA,4BAA4B,CAAY,EAC1C,EAAe,EAAA,QAAK,EAAE,EAAA,QAAQ,qBAAqB,EAC1C,EAAA,+BAA+B,CAAY,IACpD,EAAe,EAAA,QAAK,EAAE,EAAA,QAAQ,6BAA6B,GAE7D,IAAM,EAAW,EAAA,uBAAuB,EAAc,GAAI,EAC1D,EAAA,IAAM,EAAA,EAAA,KAAC,EAAD,CAAmB,QAAS,CAAe,CAAA,EAAG,CAClD,GAAG,EACH,UACF,CAAC,CACH,EAEa,EAAuB,GAAoB,CACtD,IAAM,EAAW,EAAA,uBAAuB,EAAS,GAAI,EACrD,EAAA,GAAM,SACJ,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,4DACb,CACG,CAAA,EACN,CAAE,GAAG,EAAe,UAAS,CAC/B,CACF"}
|
|
1
|
+
{"version":3,"file":"custom-toast-handlers.cjs","names":[],"sources":["../../src/utils/custom-toast-handlers.tsx"],"sourcesContent":["import React, { CSSProperties, ReactNode } from \"react\";\nimport { CircleX } from \"lucide-react\";\nimport toast, { ToastOptions } from \"react-hot-toast\";\nimport { OH_STATUS_ERROR_COLOR } from \"#/constants/status-colors\";\nimport { calculateToastDuration } from \"./toast-duration\";\nimport { cn } from \"#/utils/utils\";\nimport i18n from \"#/i18n\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport {\n isBackendRequestTimeoutMessage,\n isCorsOrNetworkErrorMessage,\n} from \"./user-facing-error\";\n\n// react-hot-toast accepts only CSSProperties via the style option — cannot use className\nconst TOAST_STYLE: CSSProperties = {\n background: \"var(--oh-color-tertiary)\",\n border: \"1px solid var(--oh-border-input)\",\n color: \"#fff\",\n borderRadius: \"var(--oh-radius)\",\n maxWidth: \"400px\",\n wordBreak: \"break-word\",\n overflowWrap: \"anywhere\",\n whiteSpace: \"pre-wrap\",\n};\n\nexport const TOAST_OPTIONS: ToastOptions = {\n position: \"top-right\",\n style: TOAST_STYLE,\n};\n\nconst ERROR_TOAST_STYLE: CSSProperties = {\n ...TOAST_STYLE,\n color: \"var(--oh-muted)\",\n};\n\n/** Icon + message row; center icon for single-line text, top-align when wrapped. */\nexport function ErrorToastContent({ message }: { message: ReactNode }) {\n const contentRef = React.useRef<HTMLSpanElement>(null);\n const [isMultiLine, setIsMultiLine] = React.useState(false);\n\n React.useLayoutEffect(() => {\n const content = contentRef.current;\n if (!content) {\n return undefined;\n }\n\n const updateIsMultiLine = () => {\n const lineHeight = Number.parseFloat(\n getComputedStyle(content).lineHeight,\n );\n if (!Number.isFinite(lineHeight) || lineHeight <= 0) {\n setIsMultiLine(false);\n return;\n }\n\n setIsMultiLine(content.getBoundingClientRect().height > lineHeight * 1.5);\n };\n\n updateIsMultiLine();\n\n const observer = new ResizeObserver(updateIsMultiLine);\n observer.observe(content);\n\n return () => observer.disconnect();\n }, [message]);\n\n return (\n <div\n className={cn(\n \"flex min-w-0 gap-2\",\n isMultiLine ? \"items-start\" : \"items-center\",\n )}\n >\n <CircleX\n aria-hidden\n className=\"h-4 w-4 shrink-0\"\n strokeWidth={2}\n style={{ color: OH_STATUS_ERROR_COLOR }}\n />\n <span\n ref={contentRef}\n className=\"min-w-0 flex-1 text-sm leading-5 [word-break:break-word] [overflow-wrap:anywhere]\"\n >\n {message}\n </span>\n </div>\n );\n}\n\nexport const ERROR_TOAST_OPTIONS: ToastOptions = {\n ...TOAST_OPTIONS,\n icon: null,\n style: ERROR_TOAST_STYLE,\n};\n\nexport const displayErrorToast = (error: string | null | undefined) => {\n let errorMessage = error || i18n.t(I18nKey.STATUS$ERROR);\n if (isCorsOrNetworkErrorMessage(errorMessage)) {\n errorMessage = i18n.t(I18nKey.ERROR$CORS_OR_NETWORK);\n } else if (isBackendRequestTimeoutMessage(errorMessage)) {\n errorMessage = i18n.t(I18nKey.ERROR$BACKEND_REQUEST_TIMEOUT);\n }\n const duration = calculateToastDuration(errorMessage, 4000);\n toast(<ErrorToastContent message={errorMessage} />, {\n ...ERROR_TOAST_OPTIONS,\n duration,\n });\n};\n\nexport const displaySuccessToast = (message: string) => {\n const duration = calculateToastDuration(message, 5000);\n toast.success(\n <span className=\"[word-break:break-word] [overflow-wrap:anywhere]\">\n {message}\n </span>,\n { ...TOAST_OPTIONS, duration },\n );\n};\n\nexport const displaySuccessToastWithLink = (\n message: string,\n linkLabel: string,\n href: string,\n) => {\n const duration = calculateToastDuration(`${message} ${linkLabel}`, 5000);\n toast.success(\n <span className=\"[word-break:break-word] [overflow-wrap:anywhere]\">\n {message}{\" \"}\n <a className=\"underline hover:no-underline\" href={href}>\n {linkLabel}\n </a>\n </span>,\n { ...TOAST_OPTIONS, duration },\n );\n};\n\n/**\n * Neutral, non-success notice — used when an action completed but the outcome\n * is qualified (e.g. a secret was saved but the active backend can't consume it\n * yet). Renders without the success checkmark so it doesn't read as \"all good\".\n */\nexport const displayWarningToast = (message: string) => {\n const duration = calculateToastDuration(message, 6000);\n toast(\n <span className=\"[word-break:break-word] [overflow-wrap:anywhere]\">\n {message}\n </span>,\n { ...TOAST_OPTIONS, icon: \"⚠️\", duration },\n );\n};\n"],"mappings":"kdAcA,IAAM,EAA6B,CACjC,WAAY,2BACZ,OAAQ,mCACR,MAAO,OACP,aAAc,mBACd,SAAU,QACV,UAAW,aACX,aAAc,WACd,WAAY,UACd,EAEa,EAA8B,CACzC,SAAU,YACV,MAAO,CACT,EAEM,EAAmC,CACvC,GAAG,EACH,MAAO,iBACT,EAGA,SAAgB,EAAkB,CAAE,WAAmC,CACrE,IAAM,EAAa,EAAA,QAAM,OAAwB,IAAI,EAC/C,CAAC,EAAa,GAAkB,EAAA,QAAM,SAAS,EAAK,EA4B1D,OA1BA,EAAA,QAAM,oBAAsB,CAC1B,IAAM,EAAU,EAAW,QAC3B,GAAI,CAAC,EACH,OAGF,IAAM,MAA0B,CAC9B,IAAM,EAAa,OAAO,WACxB,iBAAiB,CAAO,EAAE,UAC5B,EACA,GAAI,CAAC,OAAO,SAAS,CAAU,GAAK,GAAc,EAAG,CACnD,EAAe,EAAK,EACpB,MACF,CAEA,EAAe,EAAQ,sBAAsB,EAAE,OAAS,EAAa,GAAG,CAC1E,EAEA,EAAkB,EAElB,IAAM,EAAW,IAAI,eAAe,CAAiB,EAGrD,OAFA,EAAS,QAAQ,CAAO,MAEX,EAAS,WAAW,CACnC,EAAG,CAAC,CAAO,CAAC,GAGV,EAAA,EAAA,MAAC,MAAD,CACE,UAAW,EAAA,GACT,qBACA,EAAc,cAAgB,cAChC,WAJF,EAME,EAAA,EAAA,KAAC,EAAA,QAAD,CACE,cAAA,GACA,UAAU,mBACV,YAAa,EACb,MAAO,CAAE,MAAO,EAAA,qBAAsB,CACvC,CAAA,GACD,EAAA,EAAA,KAAC,OAAD,CACE,IAAK,EACL,UAAU,6FAET,CACG,CAAA,CACH,GAET,CAEA,IAAa,EAAoC,CAC/C,GAAG,EACH,KAAM,KACN,MAAO,CACT,EAEa,EAAqB,GAAqC,CACrE,IAAI,EAAe,GAAS,EAAA,QAAK,EAAE,EAAA,QAAQ,YAAY,EACnD,EAAA,4BAA4B,CAAY,EAC1C,EAAe,EAAA,QAAK,EAAE,EAAA,QAAQ,qBAAqB,EAC1C,EAAA,+BAA+B,CAAY,IACpD,EAAe,EAAA,QAAK,EAAE,EAAA,QAAQ,6BAA6B,GAE7D,IAAM,EAAW,EAAA,uBAAuB,EAAc,GAAI,EAC1D,EAAA,IAAM,EAAA,EAAA,KAAC,EAAD,CAAmB,QAAS,CAAe,CAAA,EAAG,CAClD,GAAG,EACH,UACF,CAAC,CACH,EAEa,EAAuB,GAAoB,CACtD,IAAM,EAAW,EAAA,uBAAuB,EAAS,GAAI,EACrD,EAAA,GAAM,SACJ,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,4DACb,CACG,CAAA,EACN,CAAE,GAAG,EAAe,UAAS,CAC/B,CACF,EAEa,GACX,EACA,EACA,IACG,CACH,IAAM,EAAW,EAAA,uBAAuB,GAAG,EAAQ,GAAG,IAAa,GAAI,EACvE,EAAA,GAAM,SACJ,EAAA,EAAA,MAAC,OAAD,CAAM,UAAU,4DAAhB,CACG,EAAS,KACV,EAAA,EAAA,KAAC,IAAD,CAAG,UAAU,+BAAqC,gBAC/C,CACA,CAAA,CACC,IACN,CAAE,GAAG,EAAe,UAAS,CAC/B,CACF"}
|
|
@@ -76,8 +76,25 @@ var g = {
|
|
|
76
76
|
...p,
|
|
77
77
|
duration: t
|
|
78
78
|
});
|
|
79
|
+
}, y = (e, t, n) => {
|
|
80
|
+
let r = c(`${e} ${t}`, 5e3);
|
|
81
|
+
s.success(/* @__PURE__ */ d("span", {
|
|
82
|
+
className: "[word-break:break-word] [overflow-wrap:anywhere]",
|
|
83
|
+
children: [
|
|
84
|
+
e,
|
|
85
|
+
" ",
|
|
86
|
+
/* @__PURE__ */ u("a", {
|
|
87
|
+
className: "underline hover:no-underline",
|
|
88
|
+
href: n,
|
|
89
|
+
children: t
|
|
90
|
+
})
|
|
91
|
+
]
|
|
92
|
+
}), {
|
|
93
|
+
...p,
|
|
94
|
+
duration: r
|
|
95
|
+
});
|
|
79
96
|
};
|
|
80
97
|
//#endregion
|
|
81
|
-
export { p as TOAST_OPTIONS, _ as displayErrorToast, v as displaySuccessToast };
|
|
98
|
+
export { p as TOAST_OPTIONS, _ as displayErrorToast, v as displaySuccessToast, y as displaySuccessToastWithLink };
|
|
82
99
|
|
|
83
100
|
//# sourceMappingURL=custom-toast-handlers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-toast-handlers.js","names":[],"sources":["../../src/utils/custom-toast-handlers.tsx"],"sourcesContent":["import React, { CSSProperties, ReactNode } from \"react\";\nimport { CircleX } from \"lucide-react\";\nimport toast, { ToastOptions } from \"react-hot-toast\";\nimport { OH_STATUS_ERROR_COLOR } from \"#/constants/status-colors\";\nimport { calculateToastDuration } from \"./toast-duration\";\nimport { cn } from \"#/utils/utils\";\nimport i18n from \"#/i18n\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport {\n isBackendRequestTimeoutMessage,\n isCorsOrNetworkErrorMessage,\n} from \"./user-facing-error\";\n\n// react-hot-toast accepts only CSSProperties via the style option — cannot use className\nconst TOAST_STYLE: CSSProperties = {\n background: \"var(--oh-color-tertiary)\",\n border: \"1px solid var(--oh-border-input)\",\n color: \"#fff\",\n borderRadius: \"var(--oh-radius)\",\n maxWidth: \"400px\",\n wordBreak: \"break-word\",\n overflowWrap: \"anywhere\",\n whiteSpace: \"pre-wrap\",\n};\n\nexport const TOAST_OPTIONS: ToastOptions = {\n position: \"top-right\",\n style: TOAST_STYLE,\n};\n\nconst ERROR_TOAST_STYLE: CSSProperties = {\n ...TOAST_STYLE,\n color: \"var(--oh-muted)\",\n};\n\n/** Icon + message row; center icon for single-line text, top-align when wrapped. */\nexport function ErrorToastContent({ message }: { message: ReactNode }) {\n const contentRef = React.useRef<HTMLSpanElement>(null);\n const [isMultiLine, setIsMultiLine] = React.useState(false);\n\n React.useLayoutEffect(() => {\n const content = contentRef.current;\n if (!content) {\n return undefined;\n }\n\n const updateIsMultiLine = () => {\n const lineHeight = Number.parseFloat(\n getComputedStyle(content).lineHeight,\n );\n if (!Number.isFinite(lineHeight) || lineHeight <= 0) {\n setIsMultiLine(false);\n return;\n }\n\n setIsMultiLine(content.getBoundingClientRect().height > lineHeight * 1.5);\n };\n\n updateIsMultiLine();\n\n const observer = new ResizeObserver(updateIsMultiLine);\n observer.observe(content);\n\n return () => observer.disconnect();\n }, [message]);\n\n return (\n <div\n className={cn(\n \"flex min-w-0 gap-2\",\n isMultiLine ? \"items-start\" : \"items-center\",\n )}\n >\n <CircleX\n aria-hidden\n className=\"h-4 w-4 shrink-0\"\n strokeWidth={2}\n style={{ color: OH_STATUS_ERROR_COLOR }}\n />\n <span\n ref={contentRef}\n className=\"min-w-0 flex-1 text-sm leading-5 [word-break:break-word] [overflow-wrap:anywhere]\"\n >\n {message}\n </span>\n </div>\n );\n}\n\nexport const ERROR_TOAST_OPTIONS: ToastOptions = {\n ...TOAST_OPTIONS,\n icon: null,\n style: ERROR_TOAST_STYLE,\n};\n\nexport const displayErrorToast = (error: string | null | undefined) => {\n let errorMessage = error || i18n.t(I18nKey.STATUS$ERROR);\n if (isCorsOrNetworkErrorMessage(errorMessage)) {\n errorMessage = i18n.t(I18nKey.ERROR$CORS_OR_NETWORK);\n } else if (isBackendRequestTimeoutMessage(errorMessage)) {\n errorMessage = i18n.t(I18nKey.ERROR$BACKEND_REQUEST_TIMEOUT);\n }\n const duration = calculateToastDuration(errorMessage, 4000);\n toast(<ErrorToastContent message={errorMessage} />, {\n ...ERROR_TOAST_OPTIONS,\n duration,\n });\n};\n\nexport const displaySuccessToast = (message: string) => {\n const duration = calculateToastDuration(message, 5000);\n toast.success(\n <span className=\"[word-break:break-word] [overflow-wrap:anywhere]\">\n {message}\n </span>,\n { ...TOAST_OPTIONS, duration },\n );\n};\n\nexport const displaySuccessToastWithLink = (\n message: string,\n linkLabel: string,\n href: string,\n) => {\n const duration = calculateToastDuration(`${message} ${linkLabel}`, 5000);\n toast.success(\n <span className=\"[word-break:break-word] [overflow-wrap:anywhere]\">\n {message}{\" \"}\n <a className=\"underline hover:no-underline\" href={href}>\n {linkLabel}\n </a>\n </span>,\n { ...TOAST_OPTIONS, duration },\n );\n};\n\n/**\n * Neutral, non-success notice — used when an action completed but the outcome\n * is qualified (e.g. a secret was saved but the active backend can't consume it\n * yet). Renders without the success checkmark so it doesn't read as \"all good\".\n */\nexport const displayWarningToast = (message: string) => {\n const duration = calculateToastDuration(message, 6000);\n toast(\n <span className=\"[word-break:break-word] [overflow-wrap:anywhere]\">\n {message}\n </span>,\n { ...TOAST_OPTIONS, icon: \"⚠️\", duration },\n );\n};\n"],"mappings":";;;;;;;;;;;AAcA,IAAM,IAA6B;CACjC,YAAY;CACZ,QAAQ;CACR,OAAO;CACP,cAAc;CACd,UAAU;CACV,WAAW;CACX,cAAc;CACd,YAAY;AACd,GAEa,IAA8B;CACzC,UAAU;CACV,OAAO;AACT,GAEM,IAAmC;CACvC,GAAG;CACH,OAAO;AACT;AAGA,SAAgB,EAAkB,EAAE,cAAmC;CACrE,IAAM,IAAa,EAAM,OAAwB,IAAI,GAC/C,CAAC,GAAa,KAAkB,EAAM,SAAS,EAAK;CA4B1D,OA1BA,EAAM,sBAAsB;EAC1B,IAAM,IAAU,EAAW;EAC3B,IAAI,CAAC,GACH;EAGF,IAAM,UAA0B;GAC9B,IAAM,IAAa,OAAO,WACxB,iBAAiB,CAAO,EAAE,UAC5B;GACA,IAAI,CAAC,OAAO,SAAS,CAAU,KAAK,KAAc,GAAG;IACnD,EAAe,EAAK;IACpB;GACF;GAEA,EAAe,EAAQ,sBAAsB,EAAE,SAAS,IAAa,GAAG;EAC1E;EAEA,EAAkB;EAElB,IAAM,IAAW,IAAI,eAAe,CAAiB;EAGrD,OAFA,EAAS,QAAQ,CAAO,SAEX,EAAS,WAAW;CACnC,GAAG,CAAC,CAAO,CAAC,GAGV,kBAAC,OAAD;EACE,WAAW,EACT,sBACA,IAAc,gBAAgB,cAChC;YAJF,CAME,kBAAC,GAAD;GACE,eAAA;GACA,WAAU;GACV,aAAa;GACb,OAAO,EAAE,OAAO,EAAsB;EACvC,CAAA,GACD,kBAAC,QAAD;GACE,KAAK;GACL,WAAU;aAET;EACG,CAAA,CACH;;AAET;AAEA,IAAa,IAAoC;CAC/C,GAAG;CACH,MAAM;CACN,OAAO;AACT,GAEa,KAAqB,MAAqC;CACrE,IAAI,IAAe,KAAS,EAAK,EAAE,EAAQ,YAAY;CACvD,AAAI,EAA4B,CAAY,IAC1C,IAAe,EAAK,EAAE,EAAQ,qBAAqB,IAC1C,EAA+B,CAAY,MACpD,IAAe,EAAK,EAAE,EAAQ,6BAA6B;CAE7D,IAAM,IAAW,EAAuB,GAAc,GAAI;CAC1D,EAAM,kBAAC,GAAD,EAAmB,SAAS,EAAe,CAAA,GAAG;EAClD,GAAG;EACH;CACF,CAAC;AACH,GAEa,KAAuB,MAAoB;CACtD,IAAM,IAAW,EAAuB,GAAS,GAAI;CACrD,EAAM,QACJ,kBAAC,QAAD;EAAM,WAAU;YACb;CACG,CAAA,GACN;EAAE,GAAG;EAAe;CAAS,CAC/B;AACF"}
|
|
1
|
+
{"version":3,"file":"custom-toast-handlers.js","names":[],"sources":["../../src/utils/custom-toast-handlers.tsx"],"sourcesContent":["import React, { CSSProperties, ReactNode } from \"react\";\nimport { CircleX } from \"lucide-react\";\nimport toast, { ToastOptions } from \"react-hot-toast\";\nimport { OH_STATUS_ERROR_COLOR } from \"#/constants/status-colors\";\nimport { calculateToastDuration } from \"./toast-duration\";\nimport { cn } from \"#/utils/utils\";\nimport i18n from \"#/i18n\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport {\n isBackendRequestTimeoutMessage,\n isCorsOrNetworkErrorMessage,\n} from \"./user-facing-error\";\n\n// react-hot-toast accepts only CSSProperties via the style option — cannot use className\nconst TOAST_STYLE: CSSProperties = {\n background: \"var(--oh-color-tertiary)\",\n border: \"1px solid var(--oh-border-input)\",\n color: \"#fff\",\n borderRadius: \"var(--oh-radius)\",\n maxWidth: \"400px\",\n wordBreak: \"break-word\",\n overflowWrap: \"anywhere\",\n whiteSpace: \"pre-wrap\",\n};\n\nexport const TOAST_OPTIONS: ToastOptions = {\n position: \"top-right\",\n style: TOAST_STYLE,\n};\n\nconst ERROR_TOAST_STYLE: CSSProperties = {\n ...TOAST_STYLE,\n color: \"var(--oh-muted)\",\n};\n\n/** Icon + message row; center icon for single-line text, top-align when wrapped. */\nexport function ErrorToastContent({ message }: { message: ReactNode }) {\n const contentRef = React.useRef<HTMLSpanElement>(null);\n const [isMultiLine, setIsMultiLine] = React.useState(false);\n\n React.useLayoutEffect(() => {\n const content = contentRef.current;\n if (!content) {\n return undefined;\n }\n\n const updateIsMultiLine = () => {\n const lineHeight = Number.parseFloat(\n getComputedStyle(content).lineHeight,\n );\n if (!Number.isFinite(lineHeight) || lineHeight <= 0) {\n setIsMultiLine(false);\n return;\n }\n\n setIsMultiLine(content.getBoundingClientRect().height > lineHeight * 1.5);\n };\n\n updateIsMultiLine();\n\n const observer = new ResizeObserver(updateIsMultiLine);\n observer.observe(content);\n\n return () => observer.disconnect();\n }, [message]);\n\n return (\n <div\n className={cn(\n \"flex min-w-0 gap-2\",\n isMultiLine ? \"items-start\" : \"items-center\",\n )}\n >\n <CircleX\n aria-hidden\n className=\"h-4 w-4 shrink-0\"\n strokeWidth={2}\n style={{ color: OH_STATUS_ERROR_COLOR }}\n />\n <span\n ref={contentRef}\n className=\"min-w-0 flex-1 text-sm leading-5 [word-break:break-word] [overflow-wrap:anywhere]\"\n >\n {message}\n </span>\n </div>\n );\n}\n\nexport const ERROR_TOAST_OPTIONS: ToastOptions = {\n ...TOAST_OPTIONS,\n icon: null,\n style: ERROR_TOAST_STYLE,\n};\n\nexport const displayErrorToast = (error: string | null | undefined) => {\n let errorMessage = error || i18n.t(I18nKey.STATUS$ERROR);\n if (isCorsOrNetworkErrorMessage(errorMessage)) {\n errorMessage = i18n.t(I18nKey.ERROR$CORS_OR_NETWORK);\n } else if (isBackendRequestTimeoutMessage(errorMessage)) {\n errorMessage = i18n.t(I18nKey.ERROR$BACKEND_REQUEST_TIMEOUT);\n }\n const duration = calculateToastDuration(errorMessage, 4000);\n toast(<ErrorToastContent message={errorMessage} />, {\n ...ERROR_TOAST_OPTIONS,\n duration,\n });\n};\n\nexport const displaySuccessToast = (message: string) => {\n const duration = calculateToastDuration(message, 5000);\n toast.success(\n <span className=\"[word-break:break-word] [overflow-wrap:anywhere]\">\n {message}\n </span>,\n { ...TOAST_OPTIONS, duration },\n );\n};\n\nexport const displaySuccessToastWithLink = (\n message: string,\n linkLabel: string,\n href: string,\n) => {\n const duration = calculateToastDuration(`${message} ${linkLabel}`, 5000);\n toast.success(\n <span className=\"[word-break:break-word] [overflow-wrap:anywhere]\">\n {message}{\" \"}\n <a className=\"underline hover:no-underline\" href={href}>\n {linkLabel}\n </a>\n </span>,\n { ...TOAST_OPTIONS, duration },\n );\n};\n\n/**\n * Neutral, non-success notice — used when an action completed but the outcome\n * is qualified (e.g. a secret was saved but the active backend can't consume it\n * yet). Renders without the success checkmark so it doesn't read as \"all good\".\n */\nexport const displayWarningToast = (message: string) => {\n const duration = calculateToastDuration(message, 6000);\n toast(\n <span className=\"[word-break:break-word] [overflow-wrap:anywhere]\">\n {message}\n </span>,\n { ...TOAST_OPTIONS, icon: \"⚠️\", duration },\n );\n};\n"],"mappings":";;;;;;;;;;;AAcA,IAAM,IAA6B;CACjC,YAAY;CACZ,QAAQ;CACR,OAAO;CACP,cAAc;CACd,UAAU;CACV,WAAW;CACX,cAAc;CACd,YAAY;AACd,GAEa,IAA8B;CACzC,UAAU;CACV,OAAO;AACT,GAEM,IAAmC;CACvC,GAAG;CACH,OAAO;AACT;AAGA,SAAgB,EAAkB,EAAE,cAAmC;CACrE,IAAM,IAAa,EAAM,OAAwB,IAAI,GAC/C,CAAC,GAAa,KAAkB,EAAM,SAAS,EAAK;CA4B1D,OA1BA,EAAM,sBAAsB;EAC1B,IAAM,IAAU,EAAW;EAC3B,IAAI,CAAC,GACH;EAGF,IAAM,UAA0B;GAC9B,IAAM,IAAa,OAAO,WACxB,iBAAiB,CAAO,EAAE,UAC5B;GACA,IAAI,CAAC,OAAO,SAAS,CAAU,KAAK,KAAc,GAAG;IACnD,EAAe,EAAK;IACpB;GACF;GAEA,EAAe,EAAQ,sBAAsB,EAAE,SAAS,IAAa,GAAG;EAC1E;EAEA,EAAkB;EAElB,IAAM,IAAW,IAAI,eAAe,CAAiB;EAGrD,OAFA,EAAS,QAAQ,CAAO,SAEX,EAAS,WAAW;CACnC,GAAG,CAAC,CAAO,CAAC,GAGV,kBAAC,OAAD;EACE,WAAW,EACT,sBACA,IAAc,gBAAgB,cAChC;YAJF,CAME,kBAAC,GAAD;GACE,eAAA;GACA,WAAU;GACV,aAAa;GACb,OAAO,EAAE,OAAO,EAAsB;EACvC,CAAA,GACD,kBAAC,QAAD;GACE,KAAK;GACL,WAAU;aAET;EACG,CAAA,CACH;;AAET;AAEA,IAAa,IAAoC;CAC/C,GAAG;CACH,MAAM;CACN,OAAO;AACT,GAEa,KAAqB,MAAqC;CACrE,IAAI,IAAe,KAAS,EAAK,EAAE,EAAQ,YAAY;CACvD,AAAI,EAA4B,CAAY,IAC1C,IAAe,EAAK,EAAE,EAAQ,qBAAqB,IAC1C,EAA+B,CAAY,MACpD,IAAe,EAAK,EAAE,EAAQ,6BAA6B;CAE7D,IAAM,IAAW,EAAuB,GAAc,GAAI;CAC1D,EAAM,kBAAC,GAAD,EAAmB,SAAS,EAAe,CAAA,GAAG;EAClD,GAAG;EACH;CACF,CAAC;AACH,GAEa,KAAuB,MAAoB;CACtD,IAAM,IAAW,EAAuB,GAAS,GAAI;CACrD,EAAM,QACJ,kBAAC,QAAD;EAAM,WAAU;YACb;CACG,CAAA,GACN;EAAE,GAAG;EAAe;CAAS,CAC/B;AACF,GAEa,KACX,GACA,GACA,MACG;CACH,IAAM,IAAW,EAAuB,GAAG,EAAQ,GAAG,KAAa,GAAI;CACvE,EAAM,QACJ,kBAAC,QAAD;EAAM,WAAU;YAAhB;GACG;GAAS;GACV,kBAAC,KAAD;IAAG,WAAU;IAAqC;cAC/C;GACA,CAAA;EACC;KACN;EAAE,GAAG;EAAe;CAAS,CAC/B;AACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openhands/agent-canvas",
|
|
3
|
-
"version": "1.
|
|
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": false,
|
|
@@ -104,11 +104,13 @@
|
|
|
104
104
|
"build:lib": "npm run make-i18n && react-router typegen && cross-env BUILD_LIB=true vite build && tsc -p tsconfig.lib.json",
|
|
105
105
|
"build:docker": "node scripts/docker-build.mjs",
|
|
106
106
|
"example:acp-docker:env": "node scripts/gen-acp-docker-env.mjs",
|
|
107
|
-
"
|
|
107
|
+
"predesktop": "node scripts/brand-dev-electron.mjs",
|
|
108
|
+
"desktop": "npm run build:app && electron electron",
|
|
108
109
|
"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",
|
|
109
110
|
"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",
|
|
110
111
|
"download-uv": "node scripts/download-uv.mjs",
|
|
111
|
-
"download-node": "node scripts/download-node.mjs"
|
|
112
|
+
"download-node": "node scripts/download-node.mjs",
|
|
113
|
+
"generate-icons": "node scripts/generate-icons.mjs"
|
|
112
114
|
},
|
|
113
115
|
"lint-staged": {
|
|
114
116
|
"src/**/*.{ts,tsx,js}": [
|
|
@@ -163,6 +165,7 @@
|
|
|
163
165
|
"jsdom": "30.0.0",
|
|
164
166
|
"lint-staged": "16.4.0",
|
|
165
167
|
"msw": "2.15.0",
|
|
168
|
+
"png2icons": "2.0.1",
|
|
166
169
|
"postcss-prefix-selector": "2.1.1",
|
|
167
170
|
"prettier": "3.8.3",
|
|
168
171
|
"tailwindcss": "4.3.3",
|