@openhands/agent-canvas 1.2.1 → 1.3.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/{Trans-De9RwQhA.js → Trans-DY6toRDu.js} +1 -1
- package/build/assets/{acp-providers-D_D8VUpP.js → acp-providers-Djl6vNn-.js} +1 -1
- package/build/assets/active-backend-context-B3umL5R-.js +1 -0
- package/build/assets/{add-backend-modal-DIEyAkA4.js → add-backend-modal-DljoP9lc.js} +1 -1
- package/build/assets/{agent-profiles-settings-BovdV4N8.js → agent-profiles-settings-BJMmTZgv.js} +1 -1
- package/build/assets/{agent-server-conversation-service.api-BP73yONA.js → agent-server-conversation-service.api-D_ZvtJjG.js} +3 -3
- package/build/assets/agent-settings-BVVFzBWS.js +1 -0
- package/build/assets/{agent-settings-Ofbh6UTD.js → agent-settings-lUknCeaF.js} +1 -1
- package/build/assets/{alert-banner-BW0wRYw6.js → alert-banner-Bpf2NQJq.js} +1 -1
- package/build/assets/{api-key-entry-screen-CZIdRmUJ.js → api-key-entry-screen-CWEHcPJA.js} +1 -1
- package/build/assets/{app-settings-BHJ9nKti.js → app-settings-Dj90qosy.js} +1 -1
- package/build/assets/automation-detail-CXJU0_gF.js +2 -0
- package/build/assets/automation-export-FWY9LPsG.js +2 -0
- package/build/assets/automations-list-DDGBkWLC.js +1 -0
- package/build/assets/{back-nav-button-BYmxFxGt.js → back-nav-button-CUS2mi-U.js} +1 -1
- package/build/assets/{backend-form-modal-BiaOB2C4.js → backend-form-modal-DSbrafX2.js} +1 -1
- package/build/assets/{backend-synced-settings-badge-Bs3FSXsS.js → backend-synced-settings-badge-CanzmG12.js} +1 -1
- package/build/assets/{base-modal-CC5Pp8CF.js → base-modal-BuF2f0YL.js} +1 -1
- package/build/assets/{brand-button-DKPMEKcW.js → brand-button-vMVuyDXu.js} +1 -1
- package/build/assets/{browser-B39N74jU.js → browser-BifzWIBd.js} +1 -1
- package/build/assets/{browser-tab-aiDg7aEn.js → browser-tab-CkkqJnqw.js} +1 -1
- package/build/assets/{chat-send-button-DxuZIoW8.js → chat-send-button-B_jc5z5C.js} +1 -1
- package/build/assets/{circle-plus-check-toggle-T3eAIuPQ.js → circle-plus-check-toggle-C5YxjxvI.js} +1 -1
- package/build/assets/{combobox-caret-CLGvOs32.js → combobox-caret-DoObzqf4.js} +1 -1
- package/build/assets/{command-menu-DKrLCRla.js → command-menu-D-JV3Wqm.js} +1 -1
- package/build/assets/{condenser-settings-D_5vY4m3.js → condenser-settings-30cX9SK6.js} +1 -1
- package/build/assets/{confirmation-modal-BK1F0A68.js → confirmation-modal-BGLu6XJN.js} +1 -1
- package/build/assets/{context-menu-list-item-DBFzplWW.js → context-menu-list-item-BD5_EaKN.js} +1 -1
- package/build/assets/conversation-BltULtFA.js +89 -0
- package/build/assets/conversation-e0a0_X4S.js +1 -0
- package/build/assets/conversation-panel-Cr9_ZGI-.js +1 -0
- package/build/assets/{conversation-service.api-CqZcHr1c.js → conversation-service.api-DQaKzIRj.js} +1 -1
- package/build/assets/{conversation-tab-empty-state-m8IUkfMj.js → conversation-tab-empty-state-B2dDYEwf.js} +1 -1
- package/build/assets/{copy-to-clipboard-button-Aj9wFmt2.js → copy-to-clipboard-button-CaR52OnA.js} +1 -1
- package/build/assets/declaration-gq8V5eTU.js +1 -0
- package/build/assets/{device-verify-B5YCrvSu.js → device-verify-BsznkV-a.js} +1 -1
- package/build/assets/{dropdown-classes-CgQ45JmQ.js → dropdown-classes-DJSXeLqc.js} +1 -1
- package/build/assets/{ellipsis-button-1BV9Sga8.js → ellipsis-button-C5Z-tPFp.js} +1 -1
- package/build/assets/{entry.client-Dy--3GeA.js → entry.client-JixNvFrr.js} +2 -2
- package/build/assets/{enum-filter-dropdown-DCITiYVi.js → enum-filter-dropdown-DXbVwiNZ.js} +1 -1
- package/build/assets/{environment-switch-overlay-DUnKILNH.js → environment-switch-overlay-DZQfRGTx.js} +1 -1
- package/build/assets/{extensions-hub-CksKNpP9.js → extensions-hub-DfvgqzTc.js} +1 -1
- package/build/assets/{extensions-navigation-Di9rJ-b5.js → extensions-navigation-D9i0DL62.js} +1 -1
- package/build/assets/files-tab-DDtEJcGE.js +1 -0
- package/build/assets/{form-control-classes-9rkU4usZ.js → form-control-classes-ChpNBe9n.js} +1 -1
- package/build/assets/{git-provider-icon-aQRcUVI-.js → git-provider-icon-BjkecAuV.js} +1 -1
- package/build/assets/home-BCKWpKpf.js +1 -0
- package/build/assets/{install-server-modal-BRab9inF.js → install-server-modal-BIugLhVB.js} +1 -1
- package/build/assets/{launch-1TJRKkkX.js → launch-BgIlZLSX.js} +1 -1
- package/build/assets/lesson-plan-DgpP80mJ.js +4 -0
- package/build/assets/{llm-not-configured-banner-BrU5uHto.js → llm-not-configured-banner-BlX8NifC.js} +4 -4
- package/build/assets/llm-settings-DJmbryaE.js +1 -0
- package/build/assets/{llm-settings-BpdU51Jo.js → llm-settings-kU5v0H1Z.js} +1 -1
- package/build/assets/{loading-spinner-DHAIPZkP.js → loading-spinner-BLdswi6q.js} +1 -1
- package/build/assets/{manage-backends-modal-BREySP-J.js → manage-backends-modal-C8FJQIZR.js} +1 -1
- package/build/assets/manifest-56d40d7c.js +1 -0
- package/build/assets/{markdown-renderer-D8mayGjI.js → markdown-renderer-DMT7Zkpd.js} +1 -1
- package/build/assets/{mcp-XXf8k6mb.js → mcp-CHkklDMv.js} +1 -1
- package/build/assets/{messages-D2oZb47Z.js → messages-B3RugH7P.js} +11 -11
- package/build/assets/{modal-body-Dcu5McCa.js → modal-body-DouOE5KH.js} +1 -1
- package/build/assets/{modal-classes-DPqxSyuP.js → modal-classes-Cf-4tbHz.js} +1 -1
- package/build/assets/{modal-close-button-CTCX4nCH.js → modal-close-button-B6CfxxJj.js} +1 -1
- package/build/assets/{model-selector-VDHBytb6.js → model-selector-BOj1wBlq.js} +1 -1
- package/build/assets/onboarding-DYhDxmI9.js +1 -0
- package/build/assets/{onboarding-modal-C084vkv7.js → onboarding-modal-CP_WxDC9.js} +1 -1
- package/build/assets/{option-service.api-Cl5VLGyw.js → option-service.api-C0tYT4-r.js} +1 -1
- package/build/assets/{path-utils-BeOmjIcE.js → path-utils-DWcgCGen.js} +1 -1
- package/build/assets/{plan-components-j9X4AxYM.js → plan-components-CcCBmCzW.js} +1 -1
- package/build/assets/{planner-tab-AZMjJx31.js → planner-tab-CCqdXxkL.js} +1 -1
- package/build/assets/providers-BxCuC9bZ.js +1 -0
- package/build/assets/{recommended-automations-launcher-Bk8tQ-Cn.js → recommended-automations-launcher-CVEF_1pc.js} +1 -1
- package/build/assets/root-V8fkplMy.css +1 -0
- package/build/assets/root-layout-CttG_lQi.js +2 -0
- package/build/assets/{root-tuEPDx-i.js → root-uJ2t9rCQ.js} +2 -2
- package/build/assets/{runtime-waiting-state-DkzLgvMn.js → runtime-waiting-state-BsXLElvN.js} +1 -1
- package/build/assets/{schema-field-nvq_Juo2.js → schema-field-xUr6rDd6.js} +1 -1
- package/build/assets/{sdk-section-page-CgT70FaZ.js → sdk-section-page-CbLrVUa3.js} +1 -1
- package/build/assets/{sdk-settings-schema-BjBkMHzZ.js → sdk-settings-schema-Cv7M9eSe.js} +1 -1
- package/build/assets/{secrets-settings-BCxk9p9s.js → secrets-settings-DxTx9HgU.js} +1 -1
- package/build/assets/{segmented-toggle-Cen5AMUc.js → segmented-toggle-DyQqPhoD.js} +1 -1
- package/build/assets/{settings-CedTdtb5.js → settings-DnlfS09K.js} +1 -1
- package/build/assets/{settings-dropdown-input-xzoZwgUe.js → settings-dropdown-input-BjunGXJb.js} +1 -1
- package/build/assets/{settings-index-Cct3PJSP.js → settings-index-BjeuYFFa.js} +1 -1
- package/build/assets/{settings-input-DYs7t3oK.js → settings-input-bD6npsDm.js} +1 -1
- package/build/assets/{settings-list-classes-DvQr5jVS.js → settings-list-classes-Dp_OgzN0.js} +1 -1
- package/build/assets/{settings-modal-DwLybV_O.js → settings-modal-DfTcL-mV.js} +1 -1
- package/build/assets/settings-service.api-K4ncGlBv.js +1 -0
- package/build/assets/{settings-switch-C2N2xqEb.js → settings-switch-5cuxl8Dc.js} +1 -1
- package/build/assets/{shared-conversation-DnDwfLgg.js → shared-conversation-DWtBkJv7.js} +1 -1
- package/build/assets/{sidebar-layout-BtpUSN3j.js → sidebar-layout-DuzJMMw-.js} +1 -1
- package/build/assets/{sidebar-mobile-menu-toggle-B8k3qu84.js → sidebar-mobile-menu-toggle-CMmAYkh8.js} +1 -1
- package/build/assets/{sidebar-nav-link-CIB3NBRW.js → sidebar-nav-link-5AlTT5-j.js} +1 -1
- package/build/assets/{skill-card-pill-row-D2bUe2kB.js → skill-card-pill-row-eTIkE4nz.js} +1 -1
- package/build/assets/{skills-plugins-B68ay6Pu.js → skills-plugins-BJ040luO.js} +1 -1
- package/build/assets/{skills-settings-A6sUy0T7.js → skills-settings-BYn4-AQQ.js} +1 -1
- package/build/assets/{styled-tooltip-DsKsFjuq.js → styled-tooltip-CgX2oRaK.js} +1 -1
- package/build/assets/{task-list-tab-BAThr9Ex.js → task-list-tab-0k9PhuqO.js} +1 -1
- package/build/assets/{terminal-BmT0_gIH.js → terminal-BsGcSpRS.js} +1 -1
- package/build/assets/{toggle-switch-DBlOOzBr.js → toggle-switch-2j5wwR85.js} +1 -1
- package/build/assets/{typography-YGPBGzOG.js → typography-D8mHDeNG.js} +1 -1
- package/build/assets/{use-acp-credential-form-Bs6s0DTU.js → use-acp-credential-form-EtnbtYt0.js} +1 -1
- package/build/assets/{use-activate-agent-profile-CKtTToSx.js → use-activate-agent-profile-WaAZYz4E.js} +1 -1
- package/build/assets/{use-active-agent-profile-CWLPpOtK.js → use-active-agent-profile-CYY3vGar.js} +1 -1
- package/build/assets/{use-active-conversation-DI5S5M1w.js → use-active-conversation-D-r929nx.js} +1 -1
- package/build/assets/{use-agent-profiles-DPcaYLpm.js → use-agent-profiles-DEAMFp-W.js} +1 -1
- package/build/assets/{use-agent-state-Buh3bQDh.js → use-agent-state-DijdVAQ0.js} +1 -1
- package/build/assets/{use-backends-health-CxkvJy2N.js → use-backends-health-DkC7tKkC.js} +1 -1
- package/build/assets/{use-can-manage-org-profiles-DeX2Mfje.js → use-can-manage-org-profiles-BEo0peGn.js} +1 -1
- package/build/assets/{use-cloud-current-user-id-D_PQGfmT.js → use-cloud-current-user-id-Dm99wXp2.js} +1 -1
- package/build/assets/{use-config-ur0RbjCP.js → use-config-CHzNIHpv.js} +1 -1
- package/build/assets/{use-create-conversation-D9OWYcte.js → use-create-conversation-CTsvZ96U.js} +1 -1
- package/build/assets/{use-create-secret-CVFSlhlR.js → use-create-secret-D5O5qdWC.js} +1 -1
- package/build/assets/{use-event-store-YSOxy9FC.js → use-event-store-DjgU4wfO.js} +1 -1
- package/build/assets/{use-handle-plan-click-Dug8egQl.js → use-handle-plan-click-Mn_SNTCh.js} +1 -1
- package/build/assets/{use-llm-profiles-DjackuP1.js → use-llm-profiles-BMhPDlwQ.js} +1 -1
- package/build/assets/use-runtime-is-ready-CC-KrLKe.js +1 -0
- package/build/assets/{use-save-agent-profile-aKKLqDJM.js → use-save-agent-profile-CLMmbx_X.js} +1 -1
- package/build/assets/{use-save-settings-CChDyjOB.js → use-save-settings-D1HoCDbn.js} +1 -1
- package/build/assets/{use-settings-dX4fKUPF.js → use-settings-BReAMxCG.js} +1 -1
- package/build/assets/{use-settings-nav-items-D6pHnvxg.js → use-settings-nav-items-xe1YgLnE.js} +1 -1
- package/build/assets/{use-task-list-CmWGElgb.js → use-task-list-AVBLbbcR.js} +1 -1
- package/build/assets/{use-tracking-GtXCHmTv.js → use-tracking-2ZwQwpg_.js} +1 -1
- package/build/assets/{use-user-conversation-6uOXFP95.js → use-user-conversation-OAfenBRG.js} +1 -1
- package/build/assets/{useTranslation-Cgy4JA_g.js → useTranslation-CDRCKC9-.js} +1 -1
- package/build/assets/{utils-CE0lDWtb.js → utils-D3U3rlqr.js} +1 -1
- package/build/assets/{verification-settings-D_zsNB_c.js → verification-settings-DnXS6VWv.js} +1 -1
- package/build/index.html +4 -4
- package/build/locales/ar/openhands.json +24 -0
- package/build/locales/ca/openhands.json +24 -0
- package/build/locales/de/openhands.json +24 -0
- package/build/locales/en/openhands.json +24 -0
- package/build/locales/es/openhands.json +24 -0
- package/build/locales/fr/openhands.json +24 -0
- package/build/locales/it/openhands.json +24 -0
- package/build/locales/ja/openhands.json +24 -0
- package/build/locales/ko-KR/openhands.json +24 -0
- package/build/locales/no/openhands.json +24 -0
- package/build/locales/pt/openhands.json +24 -0
- package/build/locales/tr/openhands.json +24 -0
- package/build/locales/uk/openhands.json +24 -0
- package/build/locales/zh-CN/openhands.json +24 -0
- package/build/locales/zh-TW/openhands.json +24 -0
- package/config/defaults.json +4 -4
- package/dist/api/automation-service/automation-service.api.d.ts +2 -1
- package/dist/api/event-service/event-service.api.cjs +1 -1
- package/dist/api/event-service/event-service.api.cjs.map +1 -1
- package/dist/api/event-service/event-service.api.js +1 -1
- package/dist/api/event-service/event-service.api.js.map +1 -1
- package/dist/api/event-service/event-service.types.d.ts +6 -0
- package/dist/api/git-service/agent-server-git-service.api.cjs +1 -1
- package/dist/api/git-service/agent-server-git-service.api.cjs.map +1 -1
- package/dist/api/git-service/agent-server-git-service.api.js +2 -2
- package/dist/api/git-service/agent-server-git-service.api.js.map +1 -1
- package/dist/api/git-service/git-service.api.cjs +1 -1
- package/dist/api/git-service/git-service.api.cjs.map +1 -1
- package/dist/api/git-service/git-service.api.js +2 -2
- package/dist/api/git-service/git-service.api.js.map +1 -1
- package/dist/components/conversation-events/chat/event-thought-helpers.cjs +1 -1
- package/dist/components/conversation-events/chat/event-thought-helpers.js +1 -1
- package/dist/components/features/automations/automation-card.d.ts +2 -1
- package/dist/components/features/automations/automation-group.d.ts +2 -1
- package/dist/components/features/automations/automation-list-row.d.ts +2 -1
- package/dist/components/features/automations/build-automation-menu-items.d.ts +2 -1
- package/dist/components/features/automations/detail/detail-header.d.ts +3 -1
- package/dist/components/features/automations/import-automation-modal.d.ts +10 -0
- package/dist/components/features/conversation/conversation-name-context-menu.cjs +1 -1
- package/dist/components/features/conversation/conversation-name-context-menu.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-name-context-menu.d.ts +2 -1
- package/dist/components/features/conversation/conversation-name-context-menu.js +74 -63
- package/dist/components/features/conversation/conversation-name-context-menu.js.map +1 -1
- package/dist/components/features/conversation/conversation-name.cjs +1 -1
- package/dist/components/features/conversation/conversation-name.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-name.js +73 -61
- package/dist/components/features/conversation/conversation-name.js.map +1 -1
- package/dist/components/features/conversation/transcript-export-modal.cjs +2 -0
- package/dist/components/features/conversation/transcript-export-modal.cjs.map +1 -0
- package/dist/components/features/conversation/transcript-export-modal.d.ts +10 -0
- package/dist/components/features/conversation/transcript-export-modal.js +140 -0
- package/dist/components/features/conversation/transcript-export-modal.js.map +1 -0
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js.map +1 -1
- package/dist/components/features/home/shared/dropdown-item.cjs +1 -1
- package/dist/components/features/home/shared/dropdown-item.cjs.map +1 -1
- package/dist/components/features/home/shared/dropdown-item.d.ts +7 -1
- package/dist/components/features/home/shared/dropdown-item.js +2 -1
- package/dist/components/features/home/shared/dropdown-item.js.map +1 -1
- package/dist/components/features/home/shared/generic-dropdown-menu.cjs +1 -1
- package/dist/components/features/home/shared/generic-dropdown-menu.cjs.map +1 -1
- package/dist/components/features/home/shared/generic-dropdown-menu.d.ts +8 -1
- package/dist/components/features/home/shared/generic-dropdown-menu.js +18 -10
- package/dist/components/features/home/shared/generic-dropdown-menu.js.map +1 -1
- package/dist/components/features/home/workspace-dropdown/workspace-dropdown.d.ts +11 -2
- package/dist/config/defaults.cjs +1 -1
- package/dist/config/defaults.cjs.map +1 -1
- package/dist/config/defaults.js +4 -4
- package/dist/config/defaults.js.map +1 -1
- package/dist/hooks/query/use-automations.d.ts +2 -1
- package/dist/hooks/query/use-resolved-workspaces.cjs +1 -1
- package/dist/hooks/query/use-resolved-workspaces.cjs.map +1 -1
- package/dist/hooks/query/use-resolved-workspaces.d.ts +9 -1
- package/dist/hooks/query/use-resolved-workspaces.js +1 -0
- package/dist/hooks/query/use-resolved-workspaces.js.map +1 -1
- package/dist/hooks/query/use-workspace-file-content.cjs +1 -1
- package/dist/hooks/query/use-workspace-file-content.cjs.map +1 -1
- package/dist/hooks/query/use-workspace-file-content.js +61 -55
- package/dist/hooks/query/use-workspace-file-content.js.map +1 -1
- package/dist/hooks/query/use-workspace-files.cjs +1 -1
- package/dist/hooks/query/use-workspace-files.cjs.map +1 -1
- package/dist/hooks/query/use-workspace-files.d.ts +11 -4
- package/dist/hooks/query/use-workspace-files.js +39 -18
- package/dist/hooks/query/use-workspace-files.js.map +1 -1
- package/dist/hooks/use-auto-refresh-files-on-edit.cjs +1 -1
- package/dist/hooks/use-auto-refresh-files-on-edit.cjs.map +1 -1
- package/dist/hooks/use-auto-refresh-files-on-edit.d.ts +9 -0
- package/dist/hooks/use-auto-refresh-files-on-edit.js +15 -11
- package/dist/hooks/use-auto-refresh-files-on-edit.js.map +1 -1
- package/dist/hooks/use-tracking.cjs +1 -1
- package/dist/hooks/use-tracking.cjs.map +1 -1
- package/dist/hooks/use-tracking.d.ts +7 -0
- package/dist/hooks/use-tracking.js +9 -0
- package/dist/hooks/use-tracking.js.map +1 -1
- package/dist/i18n/declaration.cjs +1 -1
- package/dist/i18n/declaration.cjs.map +1 -1
- package/dist/i18n/declaration.d.ts +24 -0
- package/dist/i18n/declaration.js +1 -1
- package/dist/i18n/declaration.js.map +1 -1
- package/dist/i18n/translation.cjs +1 -1
- package/dist/i18n/translation.cjs.map +1 -1
- package/dist/i18n/translation.js +408 -0
- package/dist/i18n/translation.js.map +1 -1
- package/dist/locales/ar/openhands.json +24 -0
- package/dist/locales/ca/openhands.json +24 -0
- package/dist/locales/de/openhands.json +24 -0
- package/dist/locales/en/openhands.json +24 -0
- package/dist/locales/es/openhands.json +24 -0
- package/dist/locales/fr/openhands.json +24 -0
- package/dist/locales/it/openhands.json +24 -0
- package/dist/locales/ja/openhands.json +24 -0
- package/dist/locales/ko-KR/openhands.json +24 -0
- package/dist/locales/no/openhands.json +24 -0
- package/dist/locales/pt/openhands.json +24 -0
- package/dist/locales/tr/openhands.json +24 -0
- package/dist/locales/uk/openhands.json +24 -0
- package/dist/locales/zh-CN/openhands.json +24 -0
- package/dist/locales/zh-TW/openhands.json +24 -0
- package/dist/package.cjs +1 -1
- package/dist/package.cjs.map +1 -1
- package/dist/package.js +1 -1
- package/dist/package.js.map +1 -1
- package/dist/routes/files-tab.cjs +1 -1
- package/dist/routes/files-tab.js +10 -10
- package/dist/types/automation.d.ts +8 -0
- package/dist/utils/custom-toast-handlers.cjs.map +1 -1
- package/dist/utils/custom-toast-handlers.d.ts +1 -0
- package/dist/utils/custom-toast-handlers.js.map +1 -1
- package/dist/utils/mcp-server-name.cjs +1 -1
- package/dist/utils/mcp-server-name.cjs.map +1 -1
- package/dist/utils/mcp-server-name.js +2 -2
- package/dist/utils/mcp-server-name.js.map +1 -1
- package/dist/utils/transcript-export/index.cjs +72 -0
- package/dist/utils/transcript-export/index.cjs.map +1 -0
- package/dist/utils/transcript-export/index.d.ts +10 -0
- package/dist/utils/transcript-export/index.js +302 -0
- package/dist/utils/transcript-export/index.js.map +1 -0
- package/dist/utils/transcript-export/load-complete-events.cjs +2 -0
- package/dist/utils/transcript-export/load-complete-events.cjs.map +1 -0
- package/dist/utils/transcript-export/load-complete-events.d.ts +22 -0
- package/dist/utils/transcript-export/load-complete-events.js +39 -0
- package/dist/utils/transcript-export/load-complete-events.js.map +1 -0
- package/package.json +1 -1
- package/scripts/check-sdk-version-sync.mjs +6 -6
- package/scripts/dev-safe.mjs +2 -2
- package/build/assets/active-backend-context-u2tdYRgH.js +0 -1
- package/build/assets/agent-settings-FGL3Yvkp.js +0 -1
- package/build/assets/automation-detail-DwYGzLkp.js +0 -2
- package/build/assets/automations-list-CuAfJmMW.js +0 -1
- package/build/assets/conversation-DnVC6vRV.js +0 -1
- package/build/assets/conversation-panel-ZEz-z3az.js +0 -1
- package/build/assets/conversation-xkBS3AHC.js +0 -19
- package/build/assets/declaration-B9kpCaYl.js +0 -1
- package/build/assets/edit-automation-modal-B6U96gVV.js +0 -1
- package/build/assets/files-tab-61Vaihc6.js +0 -1
- package/build/assets/home-5gOtUe-n.js +0 -1
- package/build/assets/lesson-plan-BtrZUCuj.js +0 -4
- package/build/assets/llm-settings-DsInf6yD.js +0 -1
- package/build/assets/manifest-a5bb7568.js +0 -1
- package/build/assets/onboarding-D32kiGME.js +0 -1
- package/build/assets/providers-vX9jk9Vy.js +0 -1
- package/build/assets/root-CxWZUXTQ.css +0 -1
- package/build/assets/root-layout-CoWw4kpz.js +0 -2
- package/build/assets/settings-service.api-DldkFI1x.js +0 -1
- package/build/assets/use-runtime-is-ready-Diiq65Q-.js +0 -1
|
@@ -737,6 +737,14 @@
|
|
|
737
737
|
"AUTOMATIONS$TITLE": "自动化",
|
|
738
738
|
"AUTOMATIONS$SUBTITLE": "查看活动和非活动的自动化,按元数据搜索,并检查只读详情。",
|
|
739
739
|
"AUTOMATIONS$ADD_AUTOMATION": "添加自动化",
|
|
740
|
+
"AUTOMATIONS$IMPORT": "导入自动化",
|
|
741
|
+
"AUTOMATIONS$EXPORT": "导出",
|
|
742
|
+
"AUTOMATIONS$IMPORT_PREVIEW_DESCRIPTION": "请在导入前检查自动化详情。",
|
|
743
|
+
"AUTOMATIONS$IMPORT_DISABLED_NOTICE": "导入的自动化将保持禁用,直到您检查并启用它。",
|
|
744
|
+
"AUTOMATIONS$IMPORTING": "正在导入...",
|
|
745
|
+
"AUTOMATIONS$IMPORT_SUCCESS": "已导入“{{name}}”,当前为禁用状态。",
|
|
746
|
+
"AUTOMATIONS$IMPORT_VIEW": "查看自动化",
|
|
747
|
+
"AUTOMATIONS$IMPORT_INVALID_JSON": "所选文件不是有效的 JSON。",
|
|
740
748
|
"AUTOMATIONS$EMPTY": "未配置自动化",
|
|
741
749
|
"AUTOMATIONS$EMPTY_HINT": "从下方的推荐中选择一个开始使用。",
|
|
742
750
|
"AUTOMATIONS$EMPTY_HOW_TO_CREATE_TITLE": "如何创建自动化",
|
|
@@ -1042,6 +1050,21 @@
|
|
|
1042
1050
|
"BUTTON$MARK_HELPFUL": "标记此解决方案有帮助",
|
|
1043
1051
|
"BUTTON$MARK_NOT_HELPFUL": "标记此解决方案没有帮助",
|
|
1044
1052
|
"BUTTON$EXPORT_CONVERSATION": "导出对话",
|
|
1053
|
+
"BUTTON$EXPORT_TRANSCRIPT": "导出…",
|
|
1054
|
+
"BUTTON$DOWNLOAD_CONVERSATION_DATA": "下载对话数据",
|
|
1055
|
+
"TRANSCRIPT_EXPORT$TITLE": "导出对话",
|
|
1056
|
+
"TRANSCRIPT_EXPORT$DESCRIPTION": "在不向外部发送对话数据的情况下下载可共享的记录。",
|
|
1057
|
+
"TRANSCRIPT_EXPORT$FORMAT": "格式",
|
|
1058
|
+
"TRANSCRIPT_EXPORT$MARKDOWN": "Markdown 文档(.md)",
|
|
1059
|
+
"TRANSCRIPT_EXPORT$HTML": "独立网页(.html)",
|
|
1060
|
+
"TRANSCRIPT_EXPORT$INCLUDE_TOOL_DETAILS": "包含工具调用详情",
|
|
1061
|
+
"TRANSCRIPT_EXPORT$INCLUDE_TIMESTAMPS": "包含时间戳",
|
|
1062
|
+
"TRANSCRIPT_EXPORT$DEFAULT_TITLE": "对话记录",
|
|
1063
|
+
"TRANSCRIPT_EXPORT$MODEL": "模型",
|
|
1064
|
+
"TRANSCRIPT_EXPORT$REASON": "原因",
|
|
1065
|
+
"TRANSCRIPT_EXPORT$USER": "用户",
|
|
1066
|
+
"TRANSCRIPT_EXPORT$TOOL": "工具",
|
|
1067
|
+
"TRANSCRIPT_EXPORT$HOOK": "钩子: {{command}}",
|
|
1045
1068
|
"WAITLIST$IF_NOT_JOINED": "如果您尚未加入等待名单,请加入以获取访问权限。",
|
|
1046
1069
|
"WAITLIST$PATIENCE_MESSAGE": "感谢您的耐心等待。我们正在努力尽快为您提供访问权限。",
|
|
1047
1070
|
"WAITLIST$ALMOST_THERE": "即将完成!",
|
|
@@ -1196,6 +1219,7 @@
|
|
|
1196
1219
|
"HOME$OPEN_WORKSPACE": "打开工作区",
|
|
1197
1220
|
"HOME$CREATING_CONVERSATION": "正在创建会话…",
|
|
1198
1221
|
"HOME$ADD_WORKSPACES": "+ 添加工作区",
|
|
1222
|
+
"HOME$WORKSPACE_GROUP_OTHER": "其他",
|
|
1199
1223
|
"HOME$MANAGE_WORKSPACES": "管理工作区",
|
|
1200
1224
|
"HOME$MANAGE_WORKSPACES_EMPTY": "您还没有任何工作区。",
|
|
1201
1225
|
"HOME$REMOVE_WORKSPACE": "移除",
|
|
@@ -737,6 +737,14 @@
|
|
|
737
737
|
"AUTOMATIONS$TITLE": "自動化",
|
|
738
738
|
"AUTOMATIONS$SUBTITLE": "檢視作用中與非作用中的自動化,依中繼資料搜尋,並檢查唯讀詳情。",
|
|
739
739
|
"AUTOMATIONS$ADD_AUTOMATION": "新增自動化",
|
|
740
|
+
"AUTOMATIONS$IMPORT": "匯入自動化",
|
|
741
|
+
"AUTOMATIONS$EXPORT": "匯出",
|
|
742
|
+
"AUTOMATIONS$IMPORT_PREVIEW_DESCRIPTION": "請在匯入前檢查自動化詳細資料。",
|
|
743
|
+
"AUTOMATIONS$IMPORT_DISABLED_NOTICE": "匯入的自動化將保持停用,直到您檢查並啟用它。",
|
|
744
|
+
"AUTOMATIONS$IMPORTING": "正在匯入...",
|
|
745
|
+
"AUTOMATIONS$IMPORT_SUCCESS": "已匯入「{{name}}」,目前為停用狀態。",
|
|
746
|
+
"AUTOMATIONS$IMPORT_VIEW": "檢視自動化",
|
|
747
|
+
"AUTOMATIONS$IMPORT_INVALID_JSON": "所選檔案不是有效的 JSON。",
|
|
740
748
|
"AUTOMATIONS$EMPTY": "未設定自動化",
|
|
741
749
|
"AUTOMATIONS$EMPTY_HINT": "從下方的推薦中選擇一個開始使用。",
|
|
742
750
|
"AUTOMATIONS$EMPTY_HOW_TO_CREATE_TITLE": "如何建立自動化",
|
|
@@ -1042,6 +1050,21 @@
|
|
|
1042
1050
|
"BUTTON$MARK_HELPFUL": "標記此解決方案有幫助",
|
|
1043
1051
|
"BUTTON$MARK_NOT_HELPFUL": "標記此解決方案沒有幫助",
|
|
1044
1052
|
"BUTTON$EXPORT_CONVERSATION": "導出對話",
|
|
1053
|
+
"BUTTON$EXPORT_TRANSCRIPT": "匯出…",
|
|
1054
|
+
"BUTTON$DOWNLOAD_CONVERSATION_DATA": "下載對話資料",
|
|
1055
|
+
"TRANSCRIPT_EXPORT$TITLE": "匯出對話",
|
|
1056
|
+
"TRANSCRIPT_EXPORT$DESCRIPTION": "在不向外部傳送對話資料的情況下下載可分享的記錄。",
|
|
1057
|
+
"TRANSCRIPT_EXPORT$FORMAT": "格式",
|
|
1058
|
+
"TRANSCRIPT_EXPORT$MARKDOWN": "Markdown 文件(.md)",
|
|
1059
|
+
"TRANSCRIPT_EXPORT$HTML": "獨立網頁(.html)",
|
|
1060
|
+
"TRANSCRIPT_EXPORT$INCLUDE_TOOL_DETAILS": "包含工具呼叫詳細資料",
|
|
1061
|
+
"TRANSCRIPT_EXPORT$INCLUDE_TIMESTAMPS": "包含時間戳記",
|
|
1062
|
+
"TRANSCRIPT_EXPORT$DEFAULT_TITLE": "對話記錄",
|
|
1063
|
+
"TRANSCRIPT_EXPORT$MODEL": "模型",
|
|
1064
|
+
"TRANSCRIPT_EXPORT$REASON": "原因",
|
|
1065
|
+
"TRANSCRIPT_EXPORT$USER": "使用者",
|
|
1066
|
+
"TRANSCRIPT_EXPORT$TOOL": "工具",
|
|
1067
|
+
"TRANSCRIPT_EXPORT$HOOK": "掛鉤: {{command}}",
|
|
1045
1068
|
"WAITLIST$IF_NOT_JOINED": "如果您尚未加入等待名單,請加入以獲取訪問權限。",
|
|
1046
1069
|
"WAITLIST$PATIENCE_MESSAGE": "感謝您的耐心等待。我們正在努力盡快為您提供訪問權限。",
|
|
1047
1070
|
"WAITLIST$ALMOST_THERE": "即將完成!",
|
|
@@ -1196,6 +1219,7 @@
|
|
|
1196
1219
|
"HOME$OPEN_WORKSPACE": "打開工作區",
|
|
1197
1220
|
"HOME$CREATING_CONVERSATION": "正在建立會話…",
|
|
1198
1221
|
"HOME$ADD_WORKSPACES": "+ 新增工作區",
|
|
1222
|
+
"HOME$WORKSPACE_GROUP_OTHER": "其他",
|
|
1199
1223
|
"HOME$MANAGE_WORKSPACES": "管理工作區",
|
|
1200
1224
|
"HOME$MANAGE_WORKSPACES_EMPTY": "您尚無任何工作區。",
|
|
1201
1225
|
"HOME$REMOVE_WORKSPACE": "移除",
|
package/dist/package.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require(`./_virtual/_rolldown/runtime.cjs`);var e={name:`@openhands/agent-canvas`,version:`1.
|
|
1
|
+
require(`./_virtual/_rolldown/runtime.cjs`);var e={name:`@openhands/agent-canvas`,version:`1.3.0`,description:`Agent Canvas UI for OpenHands - run AI coding agents with a visual interface`,license:`MIT`,private:!1,type:`module`,repository:{type:`git`,url:`https://github.com/OpenHands/agent-canvas`},homepage:`https://github.com/OpenHands/agent-canvas#readme`,bugs:{url:`https://github.com/OpenHands/agent-canvas/issues`},bin:{"agent-canvas":`bin/agent-canvas.mjs`},engines:{node:`>=22.12.0`},dependencies:{"@heroui/react":`2.8.10`,"@microlink/react-json-view":`1.31.20`,"@monaco-editor/react":`4.7.0`,"@openhands/extensions":`0.9.0`,"@openhands/typescript-client":`1.32.1`,"@react-router/node":`7.17.0`,"@react-router/serve":`7.17.0`,"@tailwindcss/vite":`4.2.4`,"@tanstack/react-query":`5.100.9`,"@types/shell-quote":`1.7.5`,"@uidotdev/usehooks":`2.4.1`,"@xterm/addon-fit":`0.11.0`,"@xterm/xterm":`6.0.0`,axios:`1.16.0`,"class-variance-authority":`0.7.1`,clsx:`2.1.1`,downshift:`9.3.2`,"framer-motion":`12.38.0`,httpxy:`0.5.3`,i18next:`26.0.8`,"i18next-browser-languagedetector":`8.2.1`,"i18next-http-backend":`4.0.0`,isbot:`5.1.39`,"lucide-react":`1.14.0`,"monaco-editor":`0.55.1`,"posthog-js":`1.372.6`,react:`19.2.5`,"react-dom":`19.2.5`,"react-hot-toast":`2.6.0`,"react-i18next":`17.0.6`,"react-icons":`5.6.0`,"react-markdown":`10.1.0`,"react-router":`7.17.0`,"react-syntax-highlighter":`16.1.1`,"rehype-raw":`7.0.0`,"rehype-sanitize":`6.0.0`,"remark-breaks":`4.0.0`,"remark-gfm":`4.0.1`,"shell-quote":`1.8.4`,sirv:`3.0.2`,"sirv-cli":`3.0.1`,"socket.io-client":`4.8.3`,"tailwind-merge":`3.5.0`,"tailwind-scrollbar":`4.0.2`,"unist-util-visit":`5.1.0`,uuid:`14.0.0`,vite:`8.0.10`,winston:`3.19.0`,"winston-daily-rotate-file":`5.0.0`,zustand:`5.0.12`},scripts:{dev:`node --env-file-if-exists=.env scripts/dev-with-automation.mjs`,"dev:static":`node --env-file-if-exists=.env scripts/dev-static.mjs`,"dev:extra-backend":`node --env-file-if-exists=.env scripts/dev-extra-backend.mjs`,"dev:minimal":`node --env-file-if-exists=.env scripts/dev-safe.mjs`,"dev:frontend":`npm run make-i18n && cross-env VITE_MOCK_API=false react-router dev`,"dev:mock":`npm run make-i18n && cross-env VITE_MOCK_API=true react-router dev`,build:`npm run build:app`,"build:mock":`npm run make-i18n && cross-env VITE_MOCK_API=true react-router build`,start:`npx sirv-cli build/ --single`,test:`npm run make-i18n && vitest run`,"test:e2e":`playwright test --pass-with-no-tests`,"test:e2e:live":`node --env-file-if-exists=.env tests/e2e/live/scripts/run-live-e2e.mjs`,"test:e2e:mock-llm":`playwright test --config=playwright.mock-llm.config.ts`,"test:e2e:mock-llm:docker":`playwright test --config=playwright.mock-llm-docker.config.ts`,"test:coverage":`npm run make-i18n && vitest run --coverage`,dev_wsl:`VITE_WATCH_USE_POLLING=true vite`,preview:`vite preview`,"make-i18n":`node scripts/make-i18n-translations.cjs`,prelint:`npm run make-i18n`,lint:`npm run typecheck && eslint src && prettier --check src/**/*.{ts,tsx}`,"lint:fix":`eslint src --fix && prettier --write src/**/*.{ts,tsx}`,prepare:`husky`,typecheck:`react-router typegen && tsc`,"typecheck:staged":`react-router typegen && npx tsc --noEmit --skipLibCheck`,"check-translation-completeness":`node scripts/check-translation-completeness.cjs`,"build:app":`npm run make-i18n && react-router build`,"build:lib":`npm run make-i18n && react-router typegen && cross-env BUILD_LIB=true VITE_APP_ENV=production vite build && tsc -p tsconfig.lib.json`,"build:docker":`node scripts/docker-build.mjs`,"example:acp-docker:env":`node scripts/gen-acp-docker-env.mjs`},"lint-staged":{"src/**/*.{ts,tsx,js}":[`eslint --fix`,`prettier --write`],"src/**/*.{ts,tsx}":[`node scripts/run-staged-typecheck.mjs`],"src/**/*":[`npm run check-translation-completeness`]},devDependencies:{"@eslint/eslintrc":`3.3.1`,"@eslint/js":`9.39.4`,"@mswjs/socket.io-binding":`0.2.0`,"@playwright/test":`1.59.1`,"@react-router/dev":`7.17.0`,"@tailwindcss/typography":`0.5.19`,"@tanstack/eslint-plugin-query":`5.100.9`,"@testing-library/dom":`10.4.1`,"@testing-library/jest-dom":`6.9.1`,"@testing-library/react":`16.3.2`,"@testing-library/user-event":`14.6.1`,"@types/mdast":`4.0.4`,"@types/node":`25.6.0`,"@types/react":`19.2.14`,"@types/react-dom":`19.2.3`,"@types/react-syntax-highlighter":`15.5.13`,"@typescript-eslint/eslint-plugin":`8.59.2`,"@typescript-eslint/parser":`8.59.2`,"@vercel/react-router":`1.3.0`,"@vitest/coverage-v8":`4.1.5`,"cross-env":`10.1.0`,eslint:`9.39.4`,"eslint-config-prettier":`10.1.8`,"eslint-import-resolver-typescript":`4.4.4`,"eslint-plugin-i18next":`6.1.4`,"eslint-plugin-import-x":`4.16.2`,"eslint-plugin-jsx-a11y":`6.10.2`,"eslint-plugin-prettier":`5.5.5`,"eslint-plugin-react":`7.37.5`,"eslint-plugin-react-hooks":`7.1.1`,"eslint-plugin-unused-imports":`4.4.1`,globals:`16.5.0`,husky:`9.1.7`,jsdom:`29.1.1`,"lint-staged":`16.4.0`,msw:`2.14.2`,"postcss-prefix-selector":`2.1.1`,prettier:`3.8.3`,tailwindcss:`4.2.4`,typescript:`6.0.3`,"vite-plugin-svgr":`5.2.0`,vitest:`4.1.5`},packageManager:`npm@10.5.0`,volta:{node:`22.12.0`},msw:{workerDirectory:[`public`]},overrides:{"@vercel/static-config":{ajv:`8.20.0`},dompurify:`3.4.7`},main:`./dist/index.cjs`,module:`./dist/index.js`,types:`./dist/index.d.ts`,files:[`dist`,`bin`,`build`,`config`,`scripts`,`tools`],exports:{".":{types:`./dist/index.d.ts`,import:`./dist/index.js`,require:`./dist/index.cjs`},"./browser":{types:`./dist/components/browser/index.d.ts`,import:`./dist/components/browser/index.js`,require:`./dist/components/browser/index.cjs`},"./conversation":{types:`./dist/components/conversation/index.d.ts`,import:`./dist/components/conversation/index.js`,require:`./dist/components/conversation/index.cjs`},"./files":{types:`./dist/components/files/index.d.ts`,import:`./dist/components/files/index.js`,require:`./dist/components/files/index.cjs`},"./settings":{types:`./dist/components/settings/index.d.ts`,import:`./dist/components/settings/index.js`,require:`./dist/components/settings/index.cjs`},"./sidebar":{types:`./dist/components/sidebar/index.d.ts`,import:`./dist/components/sidebar/index.js`,require:`./dist/components/sidebar/index.cjs`},"./terminal":{types:`./dist/components/terminal/index.d.ts`,import:`./dist/components/terminal/index.js`,require:`./dist/components/terminal/index.cjs`},"./i18n":{types:`./dist/i18n/index.d.ts`,import:`./dist/i18n/index.js`,require:`./dist/i18n/index.cjs`},"./package.json":`./package.json`},peerDependencies:{react:`19.2.5`,"react-dom":`19.2.5`,"react-router":`7.17.0`}};exports.default=e;
|
|
2
2
|
//# sourceMappingURL=package.cjs.map
|
package/dist/package.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package.cjs","names":[],"sources":["../package.json"],"sourcesContent":["{\n \"name\": \"@openhands/agent-canvas\",\n \"version\": \"1.
|
|
1
|
+
{"version":3,"file":"package.cjs","names":[],"sources":["../package.json"],"sourcesContent":["{\n \"name\": \"@openhands/agent-canvas\",\n \"version\": \"1.3.0\",\n \"description\": \"Agent Canvas UI for OpenHands - run AI coding agents with a visual interface\",\n \"license\": \"MIT\",\n \"private\": false,\n \"type\": \"module\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/OpenHands/agent-canvas\"\n },\n \"homepage\": \"https://github.com/OpenHands/agent-canvas#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/OpenHands/agent-canvas/issues\"\n },\n \"bin\": {\n \"agent-canvas\": \"bin/agent-canvas.mjs\"\n },\n \"engines\": {\n \"node\": \">=22.12.0\"\n },\n \"dependencies\": {\n \"@heroui/react\": \"2.8.10\",\n \"@microlink/react-json-view\": \"1.31.20\",\n \"@monaco-editor/react\": \"4.7.0\",\n \"@openhands/extensions\": \"0.9.0\",\n \"@openhands/typescript-client\": \"1.32.1\",\n \"@react-router/node\": \"7.17.0\",\n \"@react-router/serve\": \"7.17.0\",\n \"@tailwindcss/vite\": \"4.2.4\",\n \"@tanstack/react-query\": \"5.100.9\",\n \"@types/shell-quote\": \"1.7.5\",\n \"@uidotdev/usehooks\": \"2.4.1\",\n \"@xterm/addon-fit\": \"0.11.0\",\n \"@xterm/xterm\": \"6.0.0\",\n \"axios\": \"1.16.0\",\n \"class-variance-authority\": \"0.7.1\",\n \"clsx\": \"2.1.1\",\n \"downshift\": \"9.3.2\",\n \"framer-motion\": \"12.38.0\",\n \"httpxy\": \"0.5.3\",\n \"i18next\": \"26.0.8\",\n \"i18next-browser-languagedetector\": \"8.2.1\",\n \"i18next-http-backend\": \"4.0.0\",\n \"isbot\": \"5.1.39\",\n \"lucide-react\": \"1.14.0\",\n \"monaco-editor\": \"0.55.1\",\n \"posthog-js\": \"1.372.6\",\n \"react\": \"19.2.5\",\n \"react-dom\": \"19.2.5\",\n \"react-hot-toast\": \"2.6.0\",\n \"react-i18next\": \"17.0.6\",\n \"react-icons\": \"5.6.0\",\n \"react-markdown\": \"10.1.0\",\n \"react-router\": \"7.17.0\",\n \"react-syntax-highlighter\": \"16.1.1\",\n \"rehype-raw\": \"7.0.0\",\n \"rehype-sanitize\": \"6.0.0\",\n \"remark-breaks\": \"4.0.0\",\n \"remark-gfm\": \"4.0.1\",\n \"shell-quote\": \"1.8.4\",\n \"sirv\": \"3.0.2\",\n \"sirv-cli\": \"3.0.1\",\n \"socket.io-client\": \"4.8.3\",\n \"tailwind-merge\": \"3.5.0\",\n \"tailwind-scrollbar\": \"4.0.2\",\n \"unist-util-visit\": \"5.1.0\",\n \"uuid\": \"14.0.0\",\n \"vite\": \"8.0.10\",\n \"winston\": \"3.19.0\",\n \"winston-daily-rotate-file\": \"5.0.0\",\n \"zustand\": \"5.0.12\"\n },\n \"scripts\": {\n \"dev\": \"node --env-file-if-exists=.env scripts/dev-with-automation.mjs\",\n \"dev:static\": \"node --env-file-if-exists=.env scripts/dev-static.mjs\",\n \"dev:extra-backend\": \"node --env-file-if-exists=.env scripts/dev-extra-backend.mjs\",\n \"dev:minimal\": \"node --env-file-if-exists=.env scripts/dev-safe.mjs\",\n \"dev:frontend\": \"npm run make-i18n && cross-env VITE_MOCK_API=false react-router dev\",\n \"dev:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router dev\",\n \"build\": \"npm run build:app\",\n \"build:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router build\",\n \"start\": \"npx sirv-cli build/ --single\",\n \"test\": \"npm run make-i18n && vitest run\",\n \"test:e2e\": \"playwright test --pass-with-no-tests\",\n \"test:e2e:live\": \"node --env-file-if-exists=.env tests/e2e/live/scripts/run-live-e2e.mjs\",\n \"test:e2e:mock-llm\": \"playwright test --config=playwright.mock-llm.config.ts\",\n \"test:e2e:mock-llm:docker\": \"playwright test --config=playwright.mock-llm-docker.config.ts\",\n \"test:coverage\": \"npm run make-i18n && vitest run --coverage\",\n \"dev_wsl\": \"VITE_WATCH_USE_POLLING=true vite\",\n \"preview\": \"vite preview\",\n \"make-i18n\": \"node scripts/make-i18n-translations.cjs\",\n \"prelint\": \"npm run make-i18n\",\n \"lint\": \"npm run typecheck && eslint src && prettier --check src/**/*.{ts,tsx}\",\n \"lint:fix\": \"eslint src --fix && prettier --write src/**/*.{ts,tsx}\",\n \"prepare\": \"husky\",\n \"typecheck\": \"react-router typegen && tsc\",\n \"typecheck:staged\": \"react-router typegen && npx tsc --noEmit --skipLibCheck\",\n \"check-translation-completeness\": \"node scripts/check-translation-completeness.cjs\",\n \"build:app\": \"npm run make-i18n && react-router build\",\n \"build:lib\": \"npm run make-i18n && react-router typegen && cross-env BUILD_LIB=true VITE_APP_ENV=production vite build && tsc -p tsconfig.lib.json\",\n \"build:docker\": \"node scripts/docker-build.mjs\",\n \"example:acp-docker:env\": \"node scripts/gen-acp-docker-env.mjs\"\n },\n \"lint-staged\": {\n \"src/**/*.{ts,tsx,js}\": [\n \"eslint --fix\",\n \"prettier --write\"\n ],\n \"src/**/*.{ts,tsx}\": [\n \"node scripts/run-staged-typecheck.mjs\"\n ],\n \"src/**/*\": [\n \"npm run check-translation-completeness\"\n ]\n },\n \"devDependencies\": {\n \"@eslint/eslintrc\": \"3.3.1\",\n \"@eslint/js\": \"9.39.4\",\n \"@mswjs/socket.io-binding\": \"0.2.0\",\n \"@playwright/test\": \"1.59.1\",\n \"@react-router/dev\": \"7.17.0\",\n \"@tailwindcss/typography\": \"0.5.19\",\n \"@tanstack/eslint-plugin-query\": \"5.100.9\",\n \"@testing-library/dom\": \"10.4.1\",\n \"@testing-library/jest-dom\": \"6.9.1\",\n \"@testing-library/react\": \"16.3.2\",\n \"@testing-library/user-event\": \"14.6.1\",\n \"@types/mdast\": \"4.0.4\",\n \"@types/node\": \"25.6.0\",\n \"@types/react\": \"19.2.14\",\n \"@types/react-dom\": \"19.2.3\",\n \"@types/react-syntax-highlighter\": \"15.5.13\",\n \"@typescript-eslint/eslint-plugin\": \"8.59.2\",\n \"@typescript-eslint/parser\": \"8.59.2\",\n \"@vercel/react-router\": \"1.3.0\",\n \"@vitest/coverage-v8\": \"4.1.5\",\n \"cross-env\": \"10.1.0\",\n \"eslint\": \"9.39.4\",\n \"eslint-config-prettier\": \"10.1.8\",\n \"eslint-import-resolver-typescript\": \"4.4.4\",\n \"eslint-plugin-i18next\": \"6.1.4\",\n \"eslint-plugin-import-x\": \"4.16.2\",\n \"eslint-plugin-jsx-a11y\": \"6.10.2\",\n \"eslint-plugin-prettier\": \"5.5.5\",\n \"eslint-plugin-react\": \"7.37.5\",\n \"eslint-plugin-react-hooks\": \"7.1.1\",\n \"eslint-plugin-unused-imports\": \"4.4.1\",\n \"globals\": \"16.5.0\",\n \"husky\": \"9.1.7\",\n \"jsdom\": \"29.1.1\",\n \"lint-staged\": \"16.4.0\",\n \"msw\": \"2.14.2\",\n \"postcss-prefix-selector\": \"2.1.1\",\n \"prettier\": \"3.8.3\",\n \"tailwindcss\": \"4.2.4\",\n \"typescript\": \"6.0.3\",\n \"vite-plugin-svgr\": \"5.2.0\",\n \"vitest\": \"4.1.5\"\n },\n \"packageManager\": \"npm@10.5.0\",\n \"volta\": {\n \"node\": \"22.12.0\"\n },\n \"msw\": {\n \"workerDirectory\": [\n \"public\"\n ]\n },\n \"overrides\": {\n \"@vercel/static-config\": {\n \"ajv\": \"8.20.0\"\n },\n \"dompurify\": \"3.4.7\"\n },\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"files\": [\n \"dist\",\n \"bin\",\n \"build\",\n \"config\",\n \"scripts\",\n \"tools\"\n ],\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./browser\": {\n \"types\": \"./dist/components/browser/index.d.ts\",\n \"import\": \"./dist/components/browser/index.js\",\n \"require\": \"./dist/components/browser/index.cjs\"\n },\n \"./conversation\": {\n \"types\": \"./dist/components/conversation/index.d.ts\",\n \"import\": \"./dist/components/conversation/index.js\",\n \"require\": \"./dist/components/conversation/index.cjs\"\n },\n \"./files\": {\n \"types\": \"./dist/components/files/index.d.ts\",\n \"import\": \"./dist/components/files/index.js\",\n \"require\": \"./dist/components/files/index.cjs\"\n },\n \"./settings\": {\n \"types\": \"./dist/components/settings/index.d.ts\",\n \"import\": \"./dist/components/settings/index.js\",\n \"require\": \"./dist/components/settings/index.cjs\"\n },\n \"./sidebar\": {\n \"types\": \"./dist/components/sidebar/index.d.ts\",\n \"import\": \"./dist/components/sidebar/index.js\",\n \"require\": \"./dist/components/sidebar/index.cjs\"\n },\n \"./terminal\": {\n \"types\": \"./dist/components/terminal/index.d.ts\",\n \"import\": \"./dist/components/terminal/index.js\",\n \"require\": \"./dist/components/terminal/index.cjs\"\n },\n \"./i18n\": {\n \"types\": \"./dist/i18n/index.d.ts\",\n \"import\": \"./dist/i18n/index.js\",\n \"require\": \"./dist/i18n/index.cjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"peerDependencies\": {\n \"react\": \"19.2.5\",\n \"react-dom\": \"19.2.5\",\n \"react-router\": \"7.17.0\"\n }\n}\n"],"mappings":""}
|
package/dist/package.js
CHANGED
package/dist/package.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package.js","names":[],"sources":["../package.json"],"sourcesContent":["{\n \"name\": \"@openhands/agent-canvas\",\n \"version\": \"1.
|
|
1
|
+
{"version":3,"file":"package.js","names":[],"sources":["../package.json"],"sourcesContent":["{\n \"name\": \"@openhands/agent-canvas\",\n \"version\": \"1.3.0\",\n \"description\": \"Agent Canvas UI for OpenHands - run AI coding agents with a visual interface\",\n \"license\": \"MIT\",\n \"private\": false,\n \"type\": \"module\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/OpenHands/agent-canvas\"\n },\n \"homepage\": \"https://github.com/OpenHands/agent-canvas#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/OpenHands/agent-canvas/issues\"\n },\n \"bin\": {\n \"agent-canvas\": \"bin/agent-canvas.mjs\"\n },\n \"engines\": {\n \"node\": \">=22.12.0\"\n },\n \"dependencies\": {\n \"@heroui/react\": \"2.8.10\",\n \"@microlink/react-json-view\": \"1.31.20\",\n \"@monaco-editor/react\": \"4.7.0\",\n \"@openhands/extensions\": \"0.9.0\",\n \"@openhands/typescript-client\": \"1.32.1\",\n \"@react-router/node\": \"7.17.0\",\n \"@react-router/serve\": \"7.17.0\",\n \"@tailwindcss/vite\": \"4.2.4\",\n \"@tanstack/react-query\": \"5.100.9\",\n \"@types/shell-quote\": \"1.7.5\",\n \"@uidotdev/usehooks\": \"2.4.1\",\n \"@xterm/addon-fit\": \"0.11.0\",\n \"@xterm/xterm\": \"6.0.0\",\n \"axios\": \"1.16.0\",\n \"class-variance-authority\": \"0.7.1\",\n \"clsx\": \"2.1.1\",\n \"downshift\": \"9.3.2\",\n \"framer-motion\": \"12.38.0\",\n \"httpxy\": \"0.5.3\",\n \"i18next\": \"26.0.8\",\n \"i18next-browser-languagedetector\": \"8.2.1\",\n \"i18next-http-backend\": \"4.0.0\",\n \"isbot\": \"5.1.39\",\n \"lucide-react\": \"1.14.0\",\n \"monaco-editor\": \"0.55.1\",\n \"posthog-js\": \"1.372.6\",\n \"react\": \"19.2.5\",\n \"react-dom\": \"19.2.5\",\n \"react-hot-toast\": \"2.6.0\",\n \"react-i18next\": \"17.0.6\",\n \"react-icons\": \"5.6.0\",\n \"react-markdown\": \"10.1.0\",\n \"react-router\": \"7.17.0\",\n \"react-syntax-highlighter\": \"16.1.1\",\n \"rehype-raw\": \"7.0.0\",\n \"rehype-sanitize\": \"6.0.0\",\n \"remark-breaks\": \"4.0.0\",\n \"remark-gfm\": \"4.0.1\",\n \"shell-quote\": \"1.8.4\",\n \"sirv\": \"3.0.2\",\n \"sirv-cli\": \"3.0.1\",\n \"socket.io-client\": \"4.8.3\",\n \"tailwind-merge\": \"3.5.0\",\n \"tailwind-scrollbar\": \"4.0.2\",\n \"unist-util-visit\": \"5.1.0\",\n \"uuid\": \"14.0.0\",\n \"vite\": \"8.0.10\",\n \"winston\": \"3.19.0\",\n \"winston-daily-rotate-file\": \"5.0.0\",\n \"zustand\": \"5.0.12\"\n },\n \"scripts\": {\n \"dev\": \"node --env-file-if-exists=.env scripts/dev-with-automation.mjs\",\n \"dev:static\": \"node --env-file-if-exists=.env scripts/dev-static.mjs\",\n \"dev:extra-backend\": \"node --env-file-if-exists=.env scripts/dev-extra-backend.mjs\",\n \"dev:minimal\": \"node --env-file-if-exists=.env scripts/dev-safe.mjs\",\n \"dev:frontend\": \"npm run make-i18n && cross-env VITE_MOCK_API=false react-router dev\",\n \"dev:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router dev\",\n \"build\": \"npm run build:app\",\n \"build:mock\": \"npm run make-i18n && cross-env VITE_MOCK_API=true react-router build\",\n \"start\": \"npx sirv-cli build/ --single\",\n \"test\": \"npm run make-i18n && vitest run\",\n \"test:e2e\": \"playwright test --pass-with-no-tests\",\n \"test:e2e:live\": \"node --env-file-if-exists=.env tests/e2e/live/scripts/run-live-e2e.mjs\",\n \"test:e2e:mock-llm\": \"playwright test --config=playwright.mock-llm.config.ts\",\n \"test:e2e:mock-llm:docker\": \"playwright test --config=playwright.mock-llm-docker.config.ts\",\n \"test:coverage\": \"npm run make-i18n && vitest run --coverage\",\n \"dev_wsl\": \"VITE_WATCH_USE_POLLING=true vite\",\n \"preview\": \"vite preview\",\n \"make-i18n\": \"node scripts/make-i18n-translations.cjs\",\n \"prelint\": \"npm run make-i18n\",\n \"lint\": \"npm run typecheck && eslint src && prettier --check src/**/*.{ts,tsx}\",\n \"lint:fix\": \"eslint src --fix && prettier --write src/**/*.{ts,tsx}\",\n \"prepare\": \"husky\",\n \"typecheck\": \"react-router typegen && tsc\",\n \"typecheck:staged\": \"react-router typegen && npx tsc --noEmit --skipLibCheck\",\n \"check-translation-completeness\": \"node scripts/check-translation-completeness.cjs\",\n \"build:app\": \"npm run make-i18n && react-router build\",\n \"build:lib\": \"npm run make-i18n && react-router typegen && cross-env BUILD_LIB=true VITE_APP_ENV=production vite build && tsc -p tsconfig.lib.json\",\n \"build:docker\": \"node scripts/docker-build.mjs\",\n \"example:acp-docker:env\": \"node scripts/gen-acp-docker-env.mjs\"\n },\n \"lint-staged\": {\n \"src/**/*.{ts,tsx,js}\": [\n \"eslint --fix\",\n \"prettier --write\"\n ],\n \"src/**/*.{ts,tsx}\": [\n \"node scripts/run-staged-typecheck.mjs\"\n ],\n \"src/**/*\": [\n \"npm run check-translation-completeness\"\n ]\n },\n \"devDependencies\": {\n \"@eslint/eslintrc\": \"3.3.1\",\n \"@eslint/js\": \"9.39.4\",\n \"@mswjs/socket.io-binding\": \"0.2.0\",\n \"@playwright/test\": \"1.59.1\",\n \"@react-router/dev\": \"7.17.0\",\n \"@tailwindcss/typography\": \"0.5.19\",\n \"@tanstack/eslint-plugin-query\": \"5.100.9\",\n \"@testing-library/dom\": \"10.4.1\",\n \"@testing-library/jest-dom\": \"6.9.1\",\n \"@testing-library/react\": \"16.3.2\",\n \"@testing-library/user-event\": \"14.6.1\",\n \"@types/mdast\": \"4.0.4\",\n \"@types/node\": \"25.6.0\",\n \"@types/react\": \"19.2.14\",\n \"@types/react-dom\": \"19.2.3\",\n \"@types/react-syntax-highlighter\": \"15.5.13\",\n \"@typescript-eslint/eslint-plugin\": \"8.59.2\",\n \"@typescript-eslint/parser\": \"8.59.2\",\n \"@vercel/react-router\": \"1.3.0\",\n \"@vitest/coverage-v8\": \"4.1.5\",\n \"cross-env\": \"10.1.0\",\n \"eslint\": \"9.39.4\",\n \"eslint-config-prettier\": \"10.1.8\",\n \"eslint-import-resolver-typescript\": \"4.4.4\",\n \"eslint-plugin-i18next\": \"6.1.4\",\n \"eslint-plugin-import-x\": \"4.16.2\",\n \"eslint-plugin-jsx-a11y\": \"6.10.2\",\n \"eslint-plugin-prettier\": \"5.5.5\",\n \"eslint-plugin-react\": \"7.37.5\",\n \"eslint-plugin-react-hooks\": \"7.1.1\",\n \"eslint-plugin-unused-imports\": \"4.4.1\",\n \"globals\": \"16.5.0\",\n \"husky\": \"9.1.7\",\n \"jsdom\": \"29.1.1\",\n \"lint-staged\": \"16.4.0\",\n \"msw\": \"2.14.2\",\n \"postcss-prefix-selector\": \"2.1.1\",\n \"prettier\": \"3.8.3\",\n \"tailwindcss\": \"4.2.4\",\n \"typescript\": \"6.0.3\",\n \"vite-plugin-svgr\": \"5.2.0\",\n \"vitest\": \"4.1.5\"\n },\n \"packageManager\": \"npm@10.5.0\",\n \"volta\": {\n \"node\": \"22.12.0\"\n },\n \"msw\": {\n \"workerDirectory\": [\n \"public\"\n ]\n },\n \"overrides\": {\n \"@vercel/static-config\": {\n \"ajv\": \"8.20.0\"\n },\n \"dompurify\": \"3.4.7\"\n },\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"files\": [\n \"dist\",\n \"bin\",\n \"build\",\n \"config\",\n \"scripts\",\n \"tools\"\n ],\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"require\": \"./dist/index.cjs\"\n },\n \"./browser\": {\n \"types\": \"./dist/components/browser/index.d.ts\",\n \"import\": \"./dist/components/browser/index.js\",\n \"require\": \"./dist/components/browser/index.cjs\"\n },\n \"./conversation\": {\n \"types\": \"./dist/components/conversation/index.d.ts\",\n \"import\": \"./dist/components/conversation/index.js\",\n \"require\": \"./dist/components/conversation/index.cjs\"\n },\n \"./files\": {\n \"types\": \"./dist/components/files/index.d.ts\",\n \"import\": \"./dist/components/files/index.js\",\n \"require\": \"./dist/components/files/index.cjs\"\n },\n \"./settings\": {\n \"types\": \"./dist/components/settings/index.d.ts\",\n \"import\": \"./dist/components/settings/index.js\",\n \"require\": \"./dist/components/settings/index.cjs\"\n },\n \"./sidebar\": {\n \"types\": \"./dist/components/sidebar/index.d.ts\",\n \"import\": \"./dist/components/sidebar/index.js\",\n \"require\": \"./dist/components/sidebar/index.cjs\"\n },\n \"./terminal\": {\n \"types\": \"./dist/components/terminal/index.d.ts\",\n \"import\": \"./dist/components/terminal/index.js\",\n \"require\": \"./dist/components/terminal/index.cjs\"\n },\n \"./i18n\": {\n \"types\": \"./dist/i18n/index.d.ts\",\n \"import\": \"./dist/i18n/index.js\",\n \"require\": \"./dist/i18n/index.cjs\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"peerDependencies\": {\n \"react\": \"19.2.5\",\n \"react-dom\": \"19.2.5\",\n \"react-router\": \"7.17.0\"\n }\n}\n"],"mappings":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../node_modules/react-i18next/dist/es/useTranslation.cjs`),t=require(`../i18n/declaration.cjs`),n=require(`../hooks/use-conversation-id.cjs`),r=require(`../utils/conversation-local-storage.cjs`),i=require(`../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs`),a=require(`../stores/files-tab-store.cjs`),o=require(`../icons/link-external.cjs`),s=require(`../components/features/files-tab/segmented-toggle.cjs`),c=require(`../components/features/files-tab/no-file-selected-message.cjs`),l=require(`../hooks/query/use-workspace-files.cjs`),
|
|
1
|
+
require(`../_virtual/_rolldown/runtime.cjs`);const e=require(`../node_modules/react-i18next/dist/es/useTranslation.cjs`),t=require(`../i18n/declaration.cjs`),n=require(`../hooks/use-conversation-id.cjs`),r=require(`../utils/conversation-local-storage.cjs`),i=require(`../node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs`),a=require(`../stores/files-tab-store.cjs`),o=require(`../icons/link-external.cjs`),s=require(`../components/features/files-tab/segmented-toggle.cjs`),c=require(`../components/features/files-tab/no-file-selected-message.cjs`),l=require(`../hooks/query/use-unified-get-git-changes.cjs`),u=require(`../hooks/query/use-workspace-files.cjs`),d=require(`../stores/use-workspace-mutation-counter.cjs`),f=require(`../hooks/query/use-workspace-file-content.cjs`),p=require(`../hooks/use-has-attached-source.cjs`),m=require(`../hooks/query/use-has-git-commits.cjs`),h=require(`../hooks/use-auto-refresh-files-on-edit.cjs`),g=require(`../utils/file-priority.cjs`),_=require(`../components/features/files-tab/file-quick-row.cjs`),v=require(`../components/features/files-tab/file-tree-view.cjs`),y=require(`../components/features/files-tab/file-content-viewer.cjs`),b=require(`../icons/u-refresh.cjs`),x=require(`./changes-tab.cjs`);let S=require(`react`),C=require(`react/jsx-runtime`);function w(){let{t:w}=e.useTranslation(`openhands`);h.useAutoRefreshFilesOnEdit();let{hasAttachedSource:T,isLoading:E}=p.useHasAttachedSource(),{hasCommits:D}=m.useHasGitCommits({enabled:T}),{conversationId:O}=n.useOptionalConversationId(),{state:k,setFilesTabDiffView:A,setFilesTabContentViewMode:j}=r.useConversationLocalStorageState(O??``),M=(T||E)&&D!==!1,N=k.filesTabDiffView??M,P=k.filesTabContentViewMode,[F,I]=(0,S.useState)(!1),L=u.useWorkspaceFiles(),R=(0,S.useMemo)(()=>L.data??[],[L.data]),z=a.useFilesTabStore(e=>e.selectedPath),B=a.useFilesTabStore(e=>e.selectedConversationId),V=a.useFilesTabStore(e=>e.setSelectedPath),H=B===O?z:null,U=(0,S.useCallback)(e=>V(e,O),[O,V]),W=f.useWorkspaceFileContent(H),G=d.useWorkspaceMutationCounter(e=>e.count),K=d.withWorkspaceCacheBuster(W.data?.staticUrl??null,G);(0,S.useEffect)(()=>{B!==O&&V(null,O)},[B,O,V]),(0,S.useEffect)(()=>{if(H||R.length===0)return;let[e]=g.sortFilesByPriority(R);e&&V(e,O)},[R,H,O,V]);let q=i.useQueryClient(),{refetch:J,isFetching:Y}=l.useUnifiedGetGitChanges();return(0,C.jsxs)(`main`,{className:`h-full w-full flex flex-col items-stretch`,"data-testid":`files-tab`,children:[(0,C.jsxs)(`div`,{className:`flex items-center gap-3 px-3 py-1.5 border-b border-[var(--oh-border)]`,children:[(0,C.jsx)(s.SegmentedToggle,{ariaLabel:w(t.I18nKey.FILES$DIFF_VIEW),testId:`files-tab-diff-toggle`,value:N?`on`:`off`,options:[{value:`on`,label:w(t.I18nKey.FILES$DIFF_VIEW)},{value:`off`,label:w(t.I18nKey.COMMON$FILES)}],onChange:e=>A(e===`on`)}),!N&&(0,C.jsx)(s.SegmentedToggle,{ariaLabel:w(t.I18nKey.FILES$RICH),testId:`files-tab-content-mode-toggle`,value:P,options:[{value:`rich`,label:w(t.I18nKey.FILES$RICH)},{value:`plain`,label:w(t.I18nKey.FILES$PLAIN)}],onChange:j}),(0,C.jsxs)(`div`,{className:`ml-auto flex items-center gap-1`,children:[!N&&K&&(0,C.jsx)(`a`,{href:K,target:`_blank`,rel:`noopener noreferrer`,"aria-label":w(t.I18nKey.FILES$OPEN_IN_NEW_WINDOW),title:w(t.I18nKey.FILES$OPEN_IN_NEW_WINDOW),"data-testid":`files-tab-open-in-new-window`,className:`flex items-center justify-center w-[26px] py-1 rounded-[7px] hover:bg-[var(--oh-interactive-hover)] cursor-pointer text-white`,children:(0,C.jsx)(o.default,{width:14,height:14})}),(0,C.jsx)(`button`,{type:`button`,onClick:()=>{J(),q.invalidateQueries({queryKey:[`workspace-files`]}),q.invalidateQueries({queryKey:[`workspace-file-content`]})},disabled:Y,"aria-label":w(t.I18nKey.FILES$REFRESH),title:w(t.I18nKey.FILES$REFRESH),"data-testid":`files-tab-refresh`,className:`flex items-center justify-center w-[26px] py-1 rounded-[7px] hover:enabled:bg-[var(--oh-interactive-hover)] cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed`,children:(0,C.jsx)(b.default,{width:12.75,height:15,color:`#ffffff`,className:Y?`animate-spin`:``})})]})]}),N?(0,C.jsx)(`div`,{className:`flex-1 min-h-0`,children:(0,C.jsx)(x.default,{})}):(0,C.jsx)(`div`,{className:`flex flex-1 flex-col min-h-0`,children:L.isLoading?(0,C.jsx)(`div`,{className:`flex flex-1 items-center justify-center text-sm text-[var(--oh-muted)]`,children:w(t.I18nKey.FILES$LOADING_FILES)}):(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)(_.FileQuickRow,{paths:R,selectedPath:H,onSelectFile:U,isTreeVisible:F,onToggleTree:()=>I(e=>!e)}),(0,C.jsxs)(`div`,{className:`flex h-full min-h-0 flex-1`,children:[F&&(0,C.jsx)(`aside`,{className:`w-56 shrink-0 border-r border-[var(--oh-border)] overflow-y-auto custom-scrollbar-always`,"data-testid":`files-tab-tree`,children:(0,C.jsx)(v.FileTreeView,{paths:R,selectedPath:H,onSelectFile:U})}),(0,C.jsx)(`section`,{className:`flex h-full min-h-0 min-w-0 flex-1 flex-col`,"data-testid":`files-tab-content`,children:H?(0,C.jsx)(y.FileContentViewer,{path:H,viewMode:P}):(0,C.jsx)(c.NoFileSelectedMessage,{})})]})]})})]})}exports.default=w;
|
|
2
2
|
//# sourceMappingURL=files-tab.cjs.map
|
package/dist/routes/files-tab.js
CHANGED
|
@@ -7,13 +7,13 @@ import { useFilesTabStore as a } from "../stores/files-tab-store.js";
|
|
|
7
7
|
import o from "../icons/link-external.js";
|
|
8
8
|
import { SegmentedToggle as s } from "../components/features/files-tab/segmented-toggle.js";
|
|
9
9
|
import { NoFileSelectedMessage as c } from "../components/features/files-tab/no-file-selected-message.js";
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
10
|
+
import { useUnifiedGetGitChanges as l } from "../hooks/query/use-unified-get-git-changes.js";
|
|
11
|
+
import { useWorkspaceFiles as u } from "../hooks/query/use-workspace-files.js";
|
|
12
|
+
import { useWorkspaceMutationCounter as d, withWorkspaceCacheBuster as f } from "../stores/use-workspace-mutation-counter.js";
|
|
13
|
+
import { useWorkspaceFileContent as p } from "../hooks/query/use-workspace-file-content.js";
|
|
14
|
+
import { useHasAttachedSource as m } from "../hooks/use-has-attached-source.js";
|
|
15
|
+
import { useHasGitCommits as h } from "../hooks/query/use-has-git-commits.js";
|
|
16
|
+
import { useAutoRefreshFilesOnEdit as g } from "../hooks/use-auto-refresh-files-on-edit.js";
|
|
17
17
|
import { sortFilesByPriority as _ } from "../utils/file-priority.js";
|
|
18
18
|
import { FileQuickRow as v } from "../components/features/files-tab/file-quick-row.js";
|
|
19
19
|
import { FileTreeView as y } from "../components/features/files-tab/file-tree-view.js";
|
|
@@ -25,8 +25,8 @@ import { Fragment as E, jsx as D, jsxs as O } from "react/jsx-runtime";
|
|
|
25
25
|
//#region src/routes/files-tab.tsx
|
|
26
26
|
function k() {
|
|
27
27
|
let { t: k } = e("openhands");
|
|
28
|
-
|
|
29
|
-
let { hasAttachedSource: A, isLoading: j } =
|
|
28
|
+
g();
|
|
29
|
+
let { hasAttachedSource: A, isLoading: j } = m(), { hasCommits: M } = h({ enabled: A }), { conversationId: N } = n(), { state: P, setFilesTabDiffView: F, setFilesTabContentViewMode: I } = r(N ?? ""), L = (A || j) && M !== !1, R = P.filesTabDiffView ?? L, z = P.filesTabContentViewMode, [B, V] = T(!1), H = u(), U = w(() => H.data ?? [], [H.data]), W = a((e) => e.selectedPath), G = a((e) => e.selectedConversationId), K = a((e) => e.setSelectedPath), q = G === N ? W : null, J = ee((e) => K(e, N), [N, K]), Y = p(q), X = d((e) => e.count), Z = f(Y.data?.staticUrl ?? null, X);
|
|
30
30
|
C(() => {
|
|
31
31
|
G !== N && K(null, N);
|
|
32
32
|
}, [
|
|
@@ -43,7 +43,7 @@ function k() {
|
|
|
43
43
|
N,
|
|
44
44
|
K
|
|
45
45
|
]);
|
|
46
|
-
let Q = i(), { refetch: te, isFetching: $ } =
|
|
46
|
+
let Q = i(), { refetch: te, isFetching: $ } = l();
|
|
47
47
|
return /* @__PURE__ */ O("main", {
|
|
48
48
|
className: "h-full w-full flex flex-col items-stretch",
|
|
49
49
|
"data-testid": "files-tab",
|
|
@@ -11,6 +11,8 @@ export interface AutomationTrigger {
|
|
|
11
11
|
schedule?: string;
|
|
12
12
|
/** Human-readable schedule description (schedule triggers only). */
|
|
13
13
|
schedule_human?: string;
|
|
14
|
+
/** IANA timezone name (schedule triggers only). */
|
|
15
|
+
timezone?: string;
|
|
14
16
|
/** Event source, e.g. "github" (event triggers only). */
|
|
15
17
|
source?: string;
|
|
16
18
|
/** Event key pattern(s) to match, e.g. "pull_request.opened" or ["push", "release.*"]. */
|
|
@@ -35,6 +37,12 @@ export interface Automation {
|
|
|
35
37
|
timezone?: string;
|
|
36
38
|
last_triggered_at?: string | null;
|
|
37
39
|
}
|
|
40
|
+
export type AutomationSpec = Omit<Automation, "id" | "created_at" | "updated_at" | "last_triggered_at">;
|
|
41
|
+
export interface AutomationExportFile {
|
|
42
|
+
version: 1;
|
|
43
|
+
kind: "automation";
|
|
44
|
+
spec: AutomationSpec;
|
|
45
|
+
}
|
|
38
46
|
export interface AutomationsResponse {
|
|
39
47
|
automations: Automation[];
|
|
40
48
|
total: number;
|
|
@@ -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\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,WACb,CAEY,EAA8B,CACzC,SAAU,YACV,MAAO,EACR,CAEK,EAAmC,CACvC,GAAG,EACH,MAAO,kBACR,CAGD,SAAgB,EAAkB,CAAE,WAAmC,CACrE,IAAM,EAAa,EAAA,QAAM,OAAwB,KAAK,CAChD,CAAC,EAAa,GAAkB,EAAA,QAAM,SAAS,GAAM,CA4B3D,OA1BA,EAAA,QAAM,oBAAsB,CAC1B,IAAM,EAAU,EAAW,QAC3B,GAAI,CAAC,EACH,OAGF,IAAM,MAA0B,CAC9B,IAAM,EAAa,OAAO,WACxB,iBAAiB,EAAQ,CAAC,WAC3B,CACD,GAAI,CAAC,OAAO,SAAS,EAAW,EAAI,GAAc,EAAG,CACnD,EAAe,GAAM,CACrB,OAGF,EAAe,EAAQ,uBAAuB,CAAC,OAAS,EAAa,IAAI,EAG3E,GAAmB,CAEnB,IAAM,EAAW,IAAI,eAAe,EAAkB,CAGtD,OAFA,EAAS,QAAQ,EAAQ,KAEZ,EAAS,YAAY,EACjC,CAAC,EAAQ,CAAC,EAGX,EAAA,EAAA,MAAC,MAAD,CACE,UAAW,EAAA,GACT,qBACA,EAAc,cAAgB,eAC/B,UAJH,EAME,EAAA,EAAA,KAAC,EAAA,QAAD,CACE,cAAA,GACA,UAAU,mBACV,YAAa,EACb,MAAO,CAAE,MAAO,EAAA,sBAAuB,CACvC,CAAA,EACF,EAAA,EAAA,KAAC,OAAD,CACE,IAAK,EACL,UAAU,6FAET,EACI,CAAA,CACH,GAIV,IAAa,EAAoC,CAC/C,GAAG,EACH,KAAM,KACN,MAAO,EACR,CAEY,EAAqB,GAAqC,CACrE,IAAI,EAAe,GAAS,EAAA,QAAK,EAAE,EAAA,QAAQ,aAAa,CACpD,EAAA,4BAA4B,EAAa,CAC3C,EAAe,EAAA,QAAK,EAAE,EAAA,QAAQ,sBAAsB,CAC3C,EAAA,+BAA+B,EAAa,GACrD,EAAe,EAAA,QAAK,EAAE,EAAA,QAAQ,8BAA8B,EAE9D,IAAM,EAAW,EAAA,uBAAuB,EAAc,IAAK,CAC3D,EAAA,IAAM,EAAA,EAAA,KAAC,EAAD,CAAmB,QAAS,EAAgB,CAAA,CAAE,CAClD,GAAG,EACH,WACD,CAAC,EAGS,EAAuB,GAAoB,CACtD,IAAM,EAAW,EAAA,uBAAuB,EAAS,IAAK,CACtD,EAAA,GAAM,SACJ,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,4DACb,EACI,CAAA,CACP,CAAE,GAAG,EAAe,WAAU,CAC/B"}
|
|
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,WACb,CAEY,EAA8B,CACzC,SAAU,YACV,MAAO,EACR,CAEK,EAAmC,CACvC,GAAG,EACH,MAAO,kBACR,CAGD,SAAgB,EAAkB,CAAE,WAAmC,CACrE,IAAM,EAAa,EAAA,QAAM,OAAwB,KAAK,CAChD,CAAC,EAAa,GAAkB,EAAA,QAAM,SAAS,GAAM,CA4B3D,OA1BA,EAAA,QAAM,oBAAsB,CAC1B,IAAM,EAAU,EAAW,QAC3B,GAAI,CAAC,EACH,OAGF,IAAM,MAA0B,CAC9B,IAAM,EAAa,OAAO,WACxB,iBAAiB,EAAQ,CAAC,WAC3B,CACD,GAAI,CAAC,OAAO,SAAS,EAAW,EAAI,GAAc,EAAG,CACnD,EAAe,GAAM,CACrB,OAGF,EAAe,EAAQ,uBAAuB,CAAC,OAAS,EAAa,IAAI,EAG3E,GAAmB,CAEnB,IAAM,EAAW,IAAI,eAAe,EAAkB,CAGtD,OAFA,EAAS,QAAQ,EAAQ,KAEZ,EAAS,YAAY,EACjC,CAAC,EAAQ,CAAC,EAGX,EAAA,EAAA,MAAC,MAAD,CACE,UAAW,EAAA,GACT,qBACA,EAAc,cAAgB,eAC/B,UAJH,EAME,EAAA,EAAA,KAAC,EAAA,QAAD,CACE,cAAA,GACA,UAAU,mBACV,YAAa,EACb,MAAO,CAAE,MAAO,EAAA,sBAAuB,CACvC,CAAA,EACF,EAAA,EAAA,KAAC,OAAD,CACE,IAAK,EACL,UAAU,6FAET,EACI,CAAA,CACH,GAIV,IAAa,EAAoC,CAC/C,GAAG,EACH,KAAM,KACN,MAAO,EACR,CAEY,EAAqB,GAAqC,CACrE,IAAI,EAAe,GAAS,EAAA,QAAK,EAAE,EAAA,QAAQ,aAAa,CACpD,EAAA,4BAA4B,EAAa,CAC3C,EAAe,EAAA,QAAK,EAAE,EAAA,QAAQ,sBAAsB,CAC3C,EAAA,+BAA+B,EAAa,GACrD,EAAe,EAAA,QAAK,EAAE,EAAA,QAAQ,8BAA8B,EAE9D,IAAM,EAAW,EAAA,uBAAuB,EAAc,IAAK,CAC3D,EAAA,IAAM,EAAA,EAAA,KAAC,EAAD,CAAmB,QAAS,EAAgB,CAAA,CAAE,CAClD,GAAG,EACH,WACD,CAAC,EAGS,EAAuB,GAAoB,CACtD,IAAM,EAAW,EAAA,uBAAuB,EAAS,IAAK,CACtD,EAAA,GAAM,SACJ,EAAA,EAAA,KAAC,OAAD,CAAM,UAAU,4DACb,EACI,CAAA,CACP,CAAE,GAAG,EAAe,WAAU,CAC/B"}
|
|
@@ -8,6 +8,7 @@ export declare function ErrorToastContent({ message }: {
|
|
|
8
8
|
export declare const ERROR_TOAST_OPTIONS: ToastOptions;
|
|
9
9
|
export declare const displayErrorToast: (error: string | null | undefined) => void;
|
|
10
10
|
export declare const displaySuccessToast: (message: string) => void;
|
|
11
|
+
export declare const displaySuccessToastWithLink: (message: string, linkLabel: string, href: string) => void;
|
|
11
12
|
/**
|
|
12
13
|
* Neutral, non-success notice — used when an action completed but the outcome
|
|
13
14
|
* is qualified (e.g. a secret was saved but the active backend can't consume it
|
|
@@ -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\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;CACb,EAEY,IAA8B;CACzC,UAAU;CACV,OAAO;CACR,EAEK,IAAmC;CACvC,GAAG;CACH,OAAO;CACR;AAGD,SAAgB,EAAkB,EAAE,cAAmC;CACrE,IAAM,IAAa,EAAM,OAAwB,KAAK,EAChD,CAAC,GAAa,KAAkB,EAAM,SAAS,GAAM;AA4B3D,QA1BA,EAAM,sBAAsB;EAC1B,IAAM,IAAU,EAAW;AAC3B,MAAI,CAAC,EACH;EAGF,IAAM,UAA0B;GAC9B,IAAM,IAAa,OAAO,WACxB,iBAAiB,EAAQ,CAAC,WAC3B;AACD,OAAI,CAAC,OAAO,SAAS,EAAW,IAAI,KAAc,GAAG;AACnD,MAAe,GAAM;AACrB;;AAGF,KAAe,EAAQ,uBAAuB,CAAC,SAAS,IAAa,IAAI;;AAG3E,KAAmB;EAEnB,IAAM,IAAW,IAAI,eAAe,EAAkB;AAGtD,SAFA,EAAS,QAAQ,EAAQ,QAEZ,EAAS,YAAY;IACjC,CAAC,EAAQ,CAAC,EAGX,kBAAC,OAAD;EACE,WAAW,EACT,sBACA,IAAc,gBAAgB,eAC/B;YAJH,CAME,kBAAC,GAAD;GACE,eAAA;GACA,WAAU;GACV,aAAa;GACb,OAAO,EAAE,OAAO,GAAuB;GACvC,CAAA,EACF,kBAAC,QAAD;GACE,KAAK;GACL,WAAU;aAET;GACI,CAAA,CACH;;;AAIV,IAAa,IAAoC;CAC/C,GAAG;CACH,MAAM;CACN,OAAO;CACR,EAEY,KAAqB,MAAqC;CACrE,IAAI,IAAe,KAAS,EAAK,EAAE,EAAQ,aAAa;AACxD,CAAI,EAA4B,EAAa,GAC3C,IAAe,EAAK,EAAE,EAAQ,sBAAsB,GAC3C,EAA+B,EAAa,KACrD,IAAe,EAAK,EAAE,EAAQ,8BAA8B;CAE9D,IAAM,IAAW,EAAuB,GAAc,IAAK;AAC3D,GAAM,kBAAC,GAAD,EAAmB,SAAS,GAAgB,CAAA,EAAE;EAClD,GAAG;EACH;EACD,CAAC;GAGS,KAAuB,MAAoB;CACtD,IAAM,IAAW,EAAuB,GAAS,IAAK;AACtD,GAAM,QACJ,kBAAC,QAAD;EAAM,WAAU;YACb;EACI,CAAA,EACP;EAAE,GAAG;EAAe;EAAU,CAC/B"}
|
|
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;CACb,EAEY,IAA8B;CACzC,UAAU;CACV,OAAO;CACR,EAEK,IAAmC;CACvC,GAAG;CACH,OAAO;CACR;AAGD,SAAgB,EAAkB,EAAE,cAAmC;CACrE,IAAM,IAAa,EAAM,OAAwB,KAAK,EAChD,CAAC,GAAa,KAAkB,EAAM,SAAS,GAAM;AA4B3D,QA1BA,EAAM,sBAAsB;EAC1B,IAAM,IAAU,EAAW;AAC3B,MAAI,CAAC,EACH;EAGF,IAAM,UAA0B;GAC9B,IAAM,IAAa,OAAO,WACxB,iBAAiB,EAAQ,CAAC,WAC3B;AACD,OAAI,CAAC,OAAO,SAAS,EAAW,IAAI,KAAc,GAAG;AACnD,MAAe,GAAM;AACrB;;AAGF,KAAe,EAAQ,uBAAuB,CAAC,SAAS,IAAa,IAAI;;AAG3E,KAAmB;EAEnB,IAAM,IAAW,IAAI,eAAe,EAAkB;AAGtD,SAFA,EAAS,QAAQ,EAAQ,QAEZ,EAAS,YAAY;IACjC,CAAC,EAAQ,CAAC,EAGX,kBAAC,OAAD;EACE,WAAW,EACT,sBACA,IAAc,gBAAgB,eAC/B;YAJH,CAME,kBAAC,GAAD;GACE,eAAA;GACA,WAAU;GACV,aAAa;GACb,OAAO,EAAE,OAAO,GAAuB;GACvC,CAAA,EACF,kBAAC,QAAD;GACE,KAAK;GACL,WAAU;aAET;GACI,CAAA,CACH;;;AAIV,IAAa,IAAoC;CAC/C,GAAG;CACH,MAAM;CACN,OAAO;CACR,EAEY,KAAqB,MAAqC;CACrE,IAAI,IAAe,KAAS,EAAK,EAAE,EAAQ,aAAa;AACxD,CAAI,EAA4B,EAAa,GAC3C,IAAe,EAAK,EAAE,EAAQ,sBAAsB,GAC3C,EAA+B,EAAa,KACrD,IAAe,EAAK,EAAE,EAAQ,8BAA8B;CAE9D,IAAM,IAAW,EAAuB,GAAc,IAAK;AAC3D,GAAM,kBAAC,GAAD,EAAmB,SAAS,GAAgB,CAAA,EAAE;EAClD,GAAG;EACH;EACD,CAAC;GAGS,KAAuB,MAAoB;CACtD,IAAM,IAAW,EAAuB,GAAS,IAAK;AACtD,GAAM,QACJ,kBAAC,QAAD;EAAM,WAAU;YACb;EACI,CAAA,EACP;EAAE,GAAG;EAAe;EAAU,CAC/B"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require(`../_virtual/_rolldown/runtime.cjs`);var e=/^[a-zA-Z0-9_]+$/;function t(t){return e.test(t)}function n(e,t=`mcp`){return e.trim().replace(/[^a-zA-Z0-9_]+/g,`_`).replace(/_+/g,`_`).replace(/^_+|_+$/g,``)||t}exports.MCP_SERVER_NAME_PATTERN=e,exports.isValidMcpServerName=t,exports.toMcpServerName=n;
|
|
1
|
+
require(`../_virtual/_rolldown/runtime.cjs`);var e=/^[a-zA-Z0-9_-]+$/;function t(t){return e.test(t)}function n(e,t=`mcp`){return e.trim().replace(/[^a-zA-Z0-9_-]+/g,`_`).replace(/_+/g,`_`).replace(/^_+|_+$/g,``)||t}exports.MCP_SERVER_NAME_PATTERN=e,exports.isValidMcpServerName=t,exports.toMcpServerName=n;
|
|
2
2
|
//# sourceMappingURL=mcp-server-name.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server-name.cjs","names":[],"sources":["../../src/utils/mcp-server-name.ts"],"sourcesContent":["export const MCP_SERVER_NAME_PATTERN = /^[a-zA-Z0-9_]+$/;\n\nexport function isValidMcpServerName(name: string): boolean {\n return MCP_SERVER_NAME_PATTERN.test(name);\n}\n\nexport function toMcpServerName(value: string, fallback = \"mcp\"): string {\n const normalized = value\n .trim()\n .replace(/[^a-zA-Z0-9_]+/g, \"_\")\n .replace(/_+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n\n return normalized || fallback;\n}\n"],"mappings":"6CAAA,IAAa,EAA0B,
|
|
1
|
+
{"version":3,"file":"mcp-server-name.cjs","names":[],"sources":["../../src/utils/mcp-server-name.ts"],"sourcesContent":["export const MCP_SERVER_NAME_PATTERN = /^[a-zA-Z0-9_-]+$/;\n\nexport function isValidMcpServerName(name: string): boolean {\n return MCP_SERVER_NAME_PATTERN.test(name);\n}\n\nexport function toMcpServerName(value: string, fallback = \"mcp\"): string {\n const normalized = value\n .trim()\n .replace(/[^a-zA-Z0-9_-]+/g, \"_\")\n .replace(/_+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n\n return normalized || fallback;\n}\n"],"mappings":"6CAAA,IAAa,EAA0B,mBAEvC,SAAgB,EAAqB,EAAuB,CAC1D,OAAO,EAAwB,KAAK,EAAK,CAG3C,SAAgB,EAAgB,EAAe,EAAW,MAAe,CAOvE,OANmB,EAChB,MAAM,CACN,QAAQ,mBAAoB,IAAI,CAChC,QAAQ,MAAO,IAAI,CACnB,QAAQ,WAAY,GAEhB,EAAc"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
//#region src/utils/mcp-server-name.ts
|
|
2
|
-
var e = /^[a-zA-Z0-9_]+$/;
|
|
2
|
+
var e = /^[a-zA-Z0-9_-]+$/;
|
|
3
3
|
function t(t) {
|
|
4
4
|
return e.test(t);
|
|
5
5
|
}
|
|
6
6
|
function n(e, t = "mcp") {
|
|
7
|
-
return e.trim().replace(/[^a-zA-Z0-9_]+/g, "_").replace(/_+/g, "_").replace(/^_+|_+$/g, "") || t;
|
|
7
|
+
return e.trim().replace(/[^a-zA-Z0-9_-]+/g, "_").replace(/_+/g, "_").replace(/^_+|_+$/g, "") || t;
|
|
8
8
|
}
|
|
9
9
|
//#endregion
|
|
10
10
|
export { e as MCP_SERVER_NAME_PATTERN, t as isValidMcpServerName, n as toMcpServerName };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server-name.js","names":[],"sources":["../../src/utils/mcp-server-name.ts"],"sourcesContent":["export const MCP_SERVER_NAME_PATTERN = /^[a-zA-Z0-9_]+$/;\n\nexport function isValidMcpServerName(name: string): boolean {\n return MCP_SERVER_NAME_PATTERN.test(name);\n}\n\nexport function toMcpServerName(value: string, fallback = \"mcp\"): string {\n const normalized = value\n .trim()\n .replace(/[^a-zA-Z0-9_]+/g, \"_\")\n .replace(/_+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n\n return normalized || fallback;\n}\n"],"mappings":";AAAA,IAAa,IAA0B;AAEvC,SAAgB,EAAqB,GAAuB;AAC1D,QAAO,EAAwB,KAAK,EAAK;;AAG3C,SAAgB,EAAgB,GAAe,IAAW,OAAe;AAOvE,QANmB,EAChB,MAAM,CACN,QAAQ,
|
|
1
|
+
{"version":3,"file":"mcp-server-name.js","names":[],"sources":["../../src/utils/mcp-server-name.ts"],"sourcesContent":["export const MCP_SERVER_NAME_PATTERN = /^[a-zA-Z0-9_-]+$/;\n\nexport function isValidMcpServerName(name: string): boolean {\n return MCP_SERVER_NAME_PATTERN.test(name);\n}\n\nexport function toMcpServerName(value: string, fallback = \"mcp\"): string {\n const normalized = value\n .trim()\n .replace(/[^a-zA-Z0-9_-]+/g, \"_\")\n .replace(/_+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n\n return normalized || fallback;\n}\n"],"mappings":";AAAA,IAAa,IAA0B;AAEvC,SAAgB,EAAqB,GAAuB;AAC1D,QAAO,EAAwB,KAAK,EAAK;;AAG3C,SAAgB,EAAgB,GAAe,IAAW,OAAe;AAOvE,QANmB,EAChB,MAAM,CACN,QAAQ,oBAAoB,IAAI,CAChC,QAAQ,OAAO,IAAI,CACnB,QAAQ,YAAY,GAEhB,IAAc"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
require(`../../_virtual/_rolldown/runtime.cjs`);const e=require(`../../i18n/declaration.cjs`),t=require(`../../i18n/index.cjs`),n=require(`../../types/agent-server/type-guards.cjs`),r=require(`../../components/conversation-events/chat/event-thought-helpers.cjs`),i=require(`../handle-event-for-ui.cjs`),a=require(`../../components/conversation-events/chat/event-content-helpers/should-render-event.cjs`),o=require(`../../components/conversation-events/chat/event-content-helpers/parse-message-from-event.cjs`),s=require(`../../components/conversation-events/chat/event-content-helpers/get-action-content.cjs`),c=require(`../../components/conversation-events/chat/event-content-helpers/get-observation-content.cjs`),l=require(`../../components/conversation-events/chat/event-content-helpers/get-acp-tool-call-content.cjs`),u=require(`../../components/conversation-events/chat/group-events.cjs`);var d=new Set([`BrowserClickAction`,`BrowserCloseTabAction`,`BrowserGetContentAction`,`BrowserGetStateAction`,`BrowserGoBackAction`,`BrowserListTabsAction`,`BrowserNavigateAction`,`BrowserScrollAction`,`BrowserSwitchTabAction`,`BrowserTypeAction`,`ExecuteBashAction`,`FileEditorAction`,`GlobAction`,`GrepAction`,`InvokeSkillAction`,`MCPToolAction`,`StrReplaceEditorAction`,`TaskAction`,`TaskTrackerAction`,`TerminalAction`,`ThinkAction`]),f=new Set([`BrowserObservation`,`CanvasUIObservation`,`ExecuteBashObservation`,`FileEditorObservation`,`GlobObservation`,`GrepObservation`,`InvokeSkillObservation`,`MCPToolObservation`,`StrReplaceEditorObservation`,`SwitchLLMObservation`,`TaskTrackerObservation`,`TaskObservation`,`TerminalObservation`]),p=e=>e.replace(/[\r\n]+/g,` `).replace(/\s+/g,` `).trim(),m=(e,t=100)=>e.length>t?`${e.slice(0,t)}…`:e,h=e=>{let t=new Date(e);return Number.isNaN(t.getTime())?e:t.toISOString()},g=e=>e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`).replaceAll(`"`,`"`).replaceAll(`'`,`'`),_=e=>e.replaceAll(`&`,`&`).replaceAll(`<`,`<`).replaceAll(`>`,`>`).replace(/(!?)\[([^\]]*)\]\(\s*((?:javascript|data|vbscript):[^)]*)\)/gi,`$1\\[$2\\]($3)`).replace(/^(\s{0,3})\[([^\]]+)\]:(\s*<?(?:javascript|data|vbscript):)/gim,`$1\\[$2\\]:$3`),v=n=>p(n||t.default.t(e.I18nKey.TRANSCRIPT_EXPORT$DEFAULT_TITLE))||t.default.t(e.I18nKey.TRANSCRIPT_EXPORT$DEFAULT_TITLE),y=(e,n)=>p(t.default.t(e,n).replace(/<\/?(?:cmd|path)>/g,``)),b=e=>/^[a-z][a-z0-9_]*\s*:\s*[[{]/i.test(e),x=e=>e.replace(/(?:Action|Observation)$/,``).replace(/([a-z])([A-Z])/g,`$1 $2`).trim(),S=e=>{let t=p(e.summary||``);return t&&!b(t)?t:p(e.tool_name)||x(e.action.kind)},C=(e,t)=>t?S(t):p(e.tool_name)||x(e.observation.kind),w=e=>e.filter(e=>e.type===`text`&&typeof e.text==`string`).map(e=>e.text).join(`
|
|
2
|
+
`),T=n=>[`${t.default.t(e.I18nKey.TASK$SUBAGENT)}: ${n.subagent_type}`,`${t.default.t(e.I18nKey.TASK$QUERY)}:\n${n.prompt}`].join(`
|
|
3
|
+
|
|
4
|
+
`),E=(n,r)=>{let i=r?.action.kind===`TaskAction`?r.action:void 0;return[`${t.default.t(e.I18nKey.TASK$SUBAGENT)}: ${n.subagent}`,`${t.default.t(e.I18nKey.TASK$TASK_ID)}: ${n.task_id}`,i?`${t.default.t(e.I18nKey.TASK$QUERY)}:\n${i.prompt}`:``,`${t.default.t(e.I18nKey.TASK$RESULT)}:\n${w(n.content)}`].filter(Boolean).join(`
|
|
5
|
+
|
|
6
|
+
`)},D=e=>e.action.kind===`TaskAction`?T(e.action):d.has(e.action.kind)?s.getActionContent(e):``,O=(e,t)=>e.observation.kind===`TaskObservation`?E(e.observation,t):f.has(e.observation.kind)?c.getObservationContent(e):``,k=e=>n.isHookExecutionEvent(e)?[e.reason,e.error,e.stdout,e.stderr].filter(e=>!!e?.trim()).join(`
|
|
7
|
+
|
|
8
|
+
`):``,A=e=>[r.getReasoningContent(e),r.getActionThoughtText(e)].map(e=>e.trim()).filter(Boolean).join(`
|
|
9
|
+
|
|
10
|
+
`),j=e=>![`FinishAction`,`SwitchLLMAction`,`ThinkAction`].includes(e.action.kind),M=(s,c)=>{let d=s.reduce((e,t)=>{try{return i.handleEventForUI(t,e)}catch{return e}},[]),f=new Map(s.filter(n.isActionEvent).map(e=>[e.id,e])),h=[],g=new Set,_=u.groupEvents(d.filter(e=>n.isSwitchLLMObservationEvent(e)&&!e.observation.is_error||a.shouldRenderEvent(e)),2**53-1,s),v=e=>{if(g.has(e.id)||!j(e))return;g.add(e.id);let t=A(e);t&&h.push({kind:`message`,author:`assistant`,content:t,timestamp:e.timestamp})};for(let i of _){if(i.kind===`group`)continue;if(i.kind===`thought`){v(i.action);continue}let{event:a}=i;try{let i=n.isActionEvent(a)?a:n.isObservationEvent(a)?f.get(a.action_id):void 0;if(i&&v(i),n.isSwitchLLMObservationEvent(a)&&!a.observation.is_error){h.push({kind:`note`,summary:y(e.I18nKey.MODEL$SWITCHED_TO_PROFILE,{name:a.observation.profile_name}),content:[a.observation.active_model?`${t.default.t(e.I18nKey.TRANSCRIPT_EXPORT$MODEL)}: ${a.observation.active_model}`:``,a.observation.reason?`${t.default.t(e.I18nKey.TRANSCRIPT_EXPORT$REASON)}: ${a.observation.reason}`:``].filter(Boolean).join(`
|
|
11
|
+
`),timestamp:a.timestamp});continue}if(n.isMessageEvent(a)){let e=o.parseMessageFromEvent(a).trim();if(a.source===`agent`){let{reasoning:t,message:n}=r.splitInlineThink(e);[t,n].filter(Boolean).forEach(e=>{h.push({kind:`message`,author:`assistant`,content:e,timestamp:a.timestamp})})}else e&&h.push({kind:`message`,author:`user`,content:e,timestamp:a.timestamp});continue}if(n.isStreamingDeltaEvent(a)){let{reasoning:e,message:t}=r.splitInlineThink(a.content??``,{streaming:!0}),n=[a.reasoning_content?.trim()||``,e].filter(Boolean).join(`
|
|
12
|
+
|
|
13
|
+
`);n&&h.push({kind:`message`,author:`assistant`,content:n,timestamp:a.timestamp}),t.trim()&&h.push({kind:`message`,author:`assistant`,content:t.trim(),timestamp:a.timestamp});continue}if(n.isAgentErrorEvent(a)){h.push({kind:`error`,content:a.error,timestamp:a.timestamp});continue}if(n.isActionEvent(a)){if(a.action.kind===`FinishAction`){let e=a.action.message.trim();e&&h.push({kind:`message`,author:`assistant`,content:e,timestamp:a.timestamp})}else h.push({kind:`tool`,summary:S(a),details:c?D(a):``,timestamp:a.timestamp});continue}if(n.isObservationEvent(a)){let e=f.get(a.action_id);h.push({kind:`tool`,summary:C(a,e),details:c?O(a,e):``,timestamp:a.timestamp});continue}if(n.isACPToolCallEvent(a)){h.push({kind:`tool`,summary:l.stripRedundantTitlePrefix(a)||t.default.t(e.I18nKey.ACTION_MESSAGE$ACP_TOOL),details:c?l.getACPToolCallContent(a):``,timestamp:a.timestamp});continue}if(n.isHookExecutionEvent(a)){h.push({kind:`tool`,summary:t.default.t(e.I18nKey.TRANSCRIPT_EXPORT$HOOK,{command:m(p(a.hook_command),100)}),details:c?k(a):``,timestamp:a.timestamp});continue}n.isConversationStateUpdateEvent(a)&&n.isGoalConversationStateUpdateEvent(a)&&h.push({kind:`note`,summary:`${t.default.t(e.I18nKey.GOAL$PREFIX)} ${t.default.t({running:e.I18nKey.GOAL$STATUS_RUNNING,complete:e.I18nKey.GOAL$STATUS_COMPLETE,capped:e.I18nKey.GOAL$STATUS_CAPPED,interrupted:e.I18nKey.GOAL$STATUS_INTERRUPTED}[a.value.status])}`,content:[a.value.objective,a.value.verdict?.missing||``].filter(Boolean).join(`
|
|
14
|
+
|
|
15
|
+
`),timestamp:a.timestamp})}catch{}}return h},N=(e,t)=>t.includeTimestamps?`<sub>${g(h(e.timestamp))}</sub>\n\n`:``,P=e=>{let t=Math.max(0,...Array.from(e.matchAll(/`+/g),e=>e[0].length)),n="`".repeat(Math.max(3,t+1));return`${n}text\n${e}\n${n}`},F=(n,r)=>{let i=[`# ${_(v(r.title))}`,``];r.model&&i.push(`**${t.default.t(e.I18nKey.TRANSCRIPT_EXPORT$MODEL)}:** ${_(p(r.model))}`,``);for(let a of M(n,r.includeToolDetails)){let n=N(a,r);if(a.kind===`message`){let r=a.author===`user`?t.default.t(e.I18nKey.TRANSCRIPT_EXPORT$USER):t.default.t(e.I18nKey.CHAT_INTERFACE$ASSISTANT);i.push(`## ${r}`,``,n+_(a.content),``)}else if(a.kind===`error`){let r=a.content.split(`
|
|
16
|
+
`).map(e=>`> ${_(e)}`).join(`
|
|
17
|
+
`);i.push(`## ${t.default.t(e.I18nKey.COMMON$ERROR)}`,``,n+r,``)}else if(a.kind===`note`)i.push(`> **${g(a.summary)}**`,``,n+_(a.content),``);else if(r.includeToolDetails&&a.details)i.push(`<details>`,`<summary><strong>${g(t.default.t(e.I18nKey.TRANSCRIPT_EXPORT$TOOL))}:</strong> ${g(a.summary)}</summary>`,``,n+P(a.details),``,`</details>`,``);else{let r=n?`<br>${n.trimEnd()}`:``;i.push(`<p><strong>${g(t.default.t(e.I18nKey.TRANSCRIPT_EXPORT$TOOL))}:</strong> ${g(a.summary)}${r}</p>`,``)}}return`${i.join(`
|
|
18
|
+
`).trim()}\n`},I=(e,t)=>{if(!t.includeTimestamps)return``;let n=h(e.timestamp);return`<time datetime="${g(n)}">${g(n)}</time>`},L=(n,r)=>{let i=v(r.title),a=M(n,r.includeToolDetails).map(n=>{let i=I(n,r);if(n.kind===`message`){let r=n.author===`user`?t.default.t(e.I18nKey.TRANSCRIPT_EXPORT$USER):t.default.t(e.I18nKey.CHAT_INTERFACE$ASSISTANT);return`<section class="message ${n.author.toLowerCase()}">
|
|
19
|
+
<header><h2>${g(r)}</h2>${i}</header>
|
|
20
|
+
<div class="content">${g(n.content)}</div>
|
|
21
|
+
</section>`}return n.kind===`error`?`<section class="message error">
|
|
22
|
+
<header><h2>${g(t.default.t(e.I18nKey.COMMON$ERROR))}</h2>${i}</header>
|
|
23
|
+
<div class="content">${g(n.content)}</div>
|
|
24
|
+
</section>`:n.kind===`note`?`<aside class="note">
|
|
25
|
+
<header><strong>${g(n.summary)}</strong>${i}</header>
|
|
26
|
+
${n.content?`<div class="content">${g(n.content)}</div>`:``}
|
|
27
|
+
</aside>`:r.includeToolDetails&&n.details?`<details>
|
|
28
|
+
<summary><strong>${g(t.default.t(e.I18nKey.TRANSCRIPT_EXPORT$TOOL))}:</strong> ${g(n.summary)}${i}</summary>
|
|
29
|
+
<pre>${g(n.details)}</pre>
|
|
30
|
+
</details>`:`<div class="tool-summary"><strong>${g(t.default.t(e.I18nKey.TRANSCRIPT_EXPORT$TOOL))}:</strong> ${g(n.summary)}${i}</div>`}).join(`
|
|
31
|
+
`),o=r.model?`<p class="model"><strong>${g(t.default.t(e.I18nKey.TRANSCRIPT_EXPORT$MODEL))}:</strong> ${g(p(r.model))}</p>`:``;return`<!doctype html>
|
|
32
|
+
<html lang="${g(t.default.resolvedLanguage||t.default.language||`en`)}">
|
|
33
|
+
<head>
|
|
34
|
+
<meta charset="utf-8">
|
|
35
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
36
|
+
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; style-src 'unsafe-inline'; img-src data:">
|
|
37
|
+
<title>${g(i)}</title>
|
|
38
|
+
<style>
|
|
39
|
+
:root { color-scheme: light dark; font-family: ui-sans-serif, system-ui, sans-serif; }
|
|
40
|
+
body { margin: 0; background: #111827; color: #e5e7eb; line-height: 1.55; }
|
|
41
|
+
main { box-sizing: border-box; width: min(860px, 100%); margin: 0 auto; padding: 48px 24px 80px; }
|
|
42
|
+
h1 { margin: 0; font-size: 2rem; }
|
|
43
|
+
h2 { margin: 0; font-size: 1rem; }
|
|
44
|
+
.model { margin: 8px 0 32px; color: #9ca3af; }
|
|
45
|
+
.message, details, .tool-summary, .note { margin: 16px 0; border: 1px solid #374151; border-radius: 10px; padding: 16px; background: #1f2937; }
|
|
46
|
+
.user { border-left: 4px solid #60a5fa; }
|
|
47
|
+
.assistant { border-left: 4px solid #34d399; }
|
|
48
|
+
.error { border-left: 4px solid #f87171; }
|
|
49
|
+
.note { border-left: 4px solid #a78bfa; }
|
|
50
|
+
header, summary, .tool-summary { display: flex; align-items: baseline; justify-content: space-between; gap: 16px; }
|
|
51
|
+
summary { cursor: pointer; }
|
|
52
|
+
time { flex: none; color: #9ca3af; font-size: .75rem; font-weight: 400; }
|
|
53
|
+
.content { margin-top: 10px; white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
54
|
+
pre { margin: 14px 0 0; padding: 14px; overflow-x: auto; border-radius: 7px; background: #111827; color: #d1d5db; white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
55
|
+
@media (prefers-color-scheme: light) {
|
|
56
|
+
body { background: #f9fafb; color: #111827; }
|
|
57
|
+
.message, details, .tool-summary, .note { border-color: #d1d5db; background: #fff; }
|
|
58
|
+
pre { background: #f3f4f6; color: #1f2937; }
|
|
59
|
+
.model, time { color: #6b7280; }
|
|
60
|
+
}
|
|
61
|
+
</style>
|
|
62
|
+
</head>
|
|
63
|
+
<body>
|
|
64
|
+
<main>
|
|
65
|
+
<h1>${g(i)}</h1>
|
|
66
|
+
${o}
|
|
67
|
+
${a}
|
|
68
|
+
</main>
|
|
69
|
+
</body>
|
|
70
|
+
</html>
|
|
71
|
+
`};exports.eventsToHtml=L,exports.eventsToMarkdown=F;
|
|
72
|
+
//# sourceMappingURL=index.cjs.map
|