@openhands/agent-canvas 1.16.0 → 1.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/README.windows.md +2 -2
- package/build/assets/{acp-providers-CX3Lh9gj.js → acp-providers-DcY_mKYa.js} +1 -1
- package/build/assets/active-backend-context-BnH4-L8h.js +2 -0
- package/build/assets/{agent-context-settings-DSZlXrLj.js → agent-context-settings-D3peZkjX.js} +1 -1
- package/build/assets/agent-profiles-service.api-DkeZaqIl.js +1 -0
- package/build/assets/agent-profiles-settings-7yMWYjGF.js +1 -0
- package/build/assets/agent-server-client-options-EHB23gyx.js +1 -0
- package/build/assets/agent-server-config-C_x8Otd9.js +1 -0
- package/build/assets/agent-server-conversation-service.api-jiCopc2E.js +88 -0
- package/build/assets/agent-settings-BF8hM6wb.js +2 -0
- package/build/assets/agent-settings-YPutBAeR.js +1 -0
- package/build/assets/alert-banner-eYyqvHL3.js +1 -0
- package/build/assets/{api-error-message-B-XdSk3b.js → api-error-message-BXo0lCI5.js} +1 -1
- package/build/assets/api-key-entry-screen-CCBvBD8u.js +1 -0
- package/build/assets/app-settings-BtYDs-Be.js +1 -0
- package/build/assets/automation-detail-BxXhb_m2.js +3 -0
- package/build/assets/{automation-export-D3a3of4G.js → automation-export-BJsfi7n2.js} +1 -1
- package/build/assets/automation-git-sync-B7o_Nbl-.js +1 -0
- package/build/assets/automation-setup-route-qaJ6lLCf.js +3 -0
- package/build/assets/{automation-templates-BRppNh99.js → automation-templates-Bb98r-kx.js} +1 -1
- package/build/assets/automations-list-DEPVNud3.js +1 -0
- package/build/assets/{back-nav-button-Cjl_hoxq.js → back-nav-button-B2yBiVMB.js} +1 -1
- package/build/assets/backend-form-modal-DxisQV_6.js +1 -0
- package/build/assets/backend-synced-settings-badge-DLEp6cq7.js +1 -0
- package/build/assets/badge-ehL-kgeO.js +1 -0
- package/build/assets/{base-modal-D_L0oEbG.js → base-modal-C1a0TsSx.js} +1 -1
- package/build/assets/bot-ByolqPEr.js +1 -0
- package/build/assets/{brand-button-BAfk4wGP.js → brand-button-CUMfjb99.js} +1 -1
- package/build/assets/browser-SE24Tk8g.js +46 -0
- package/build/assets/browser-tab-HjJxHA0V.js +1 -0
- package/build/assets/canvas-extension-page-BsUGBb1T.js +1 -0
- package/build/assets/canvas-extensions-C9Tm6s_E.js +1 -0
- package/build/assets/{canvas-extensions-runtime-2_x5Ezmi.js → canvas-extensions-runtime-B8kxM4rO.js} +1 -1
- package/build/assets/{chat-send-button-MUQqCZCS.js → chat-send-button-CGvc2wpE.js} +1 -1
- package/build/assets/check-Bo8s5Ylg.js +1 -0
- package/build/assets/chevron-down-Cr6Fn_wS.js +1 -0
- package/build/assets/chevron-right-CfdfRn-8.js +1 -0
- package/build/assets/circle-check-5pH3qCji.js +1 -0
- package/build/assets/circle-plus-check-toggle-BDX_ctNs.js +1 -0
- package/build/assets/{cloud-funnel-analytics-CztBCCPp.js → cloud-funnel-analytics-D5uJ_4JE.js} +1 -1
- package/build/assets/{cog-D-MPQW6G.js → cog-CAEugqtV.js} +1 -1
- package/build/assets/command-menu-CQxs4mtX.js +1 -0
- package/build/assets/commits-tab-D0xgjipP.js +1 -0
- package/build/assets/{condenser-settings-DmEOje-7.js → condenser-settings-D63NJRBT.js} +1 -1
- package/build/assets/confirmation-modal-78sd9Vny.js +1 -0
- package/build/assets/{context-menu-list-item-I86vKcmM.js → context-menu-list-item-Cm7-7Y-7.js} +1 -1
- package/build/assets/conversation-B_nweu5p.js +93 -0
- package/build/assets/conversation-edjzrv5w.js +1 -0
- package/build/assets/conversation-panel-edjzrv5w.js +1 -0
- package/build/assets/conversation-state-store-9D_3P7q4.js +1 -0
- package/build/assets/conversation-store-DC-JlJuq.js +6 -0
- package/build/assets/{conversation-tab-empty-state-FIbh_lc8.js → conversation-tab-empty-state-B3dpJXX0.js} +1 -1
- package/build/assets/copy-to-clipboard-button-B1ljgNxO.js +1 -0
- package/build/assets/device-verify-D5QRIS_x.js +1 -0
- package/build/assets/{dropdown-classes-Bc1djN0-.js → dropdown-classes-BGvOvW2_.js} +1 -1
- package/build/assets/edit-automation-modal-D_JWSmxT.js +1 -0
- package/build/assets/empty-state-FK_s1B60.js +1 -0
- package/build/assets/{entry.client-CqyPPjOq.js → entry.client-BMafTpjO.js} +2 -2
- package/build/assets/enum-filter-dropdown-UNaom12H.js +1 -0
- package/build/assets/environment-switch-overlay-COibRUA-.js +1 -0
- package/build/assets/error-state-Cf8LRuuY.js +1 -0
- package/build/assets/extensions-hub-C_6ahIua.js +1 -0
- package/build/assets/extensions-navigation-C5GfpzFe.js +1 -0
- package/build/assets/external-link-Bd7Tga-1.js +1 -0
- package/build/assets/files-tab-D5PPIWI1.js +1 -0
- package/build/assets/{form-control-classes-Bkh5FGrD.js → form-control-classes-Dbq-7YP_.js} +1 -1
- package/build/assets/format-model-name-Dfh9Udrx.js +1 -0
- package/build/assets/get-git-path-jU2zjqIB.js +1 -0
- package/build/assets/git-repo-dropdown-BoDDWXfX.js +1 -0
- package/build/assets/git-repo-dropdown-uxlFw2gn.js +1 -0
- package/build/assets/highlighted-source-view-C7pAXrT0.js +1 -0
- package/build/assets/home-BM5_Wz_R.js +1 -0
- package/build/assets/home-Ivfm7KC4.js +1 -0
- package/build/assets/home-automation-run-tooltip-B1N2uO9p.js +1 -0
- package/build/assets/home-store-DCbei3DX.js +1 -0
- package/build/assets/hooks-service-Dnmhqc0Z.js +1 -0
- package/build/assets/index-home-td9BN2T3.js +1 -0
- package/build/assets/info-BcajzHn1.js +1 -0
- package/build/assets/install-server-modal-B81I-5OE.js +1 -0
- package/build/assets/kebab-menu-item-content-SCJBwZnp.js +1 -0
- package/build/assets/{key-BmVyxs-2.js → key-O84CMFHb.js} +1 -1
- package/build/assets/launch-ZLxI4opd.js +1 -0
- package/build/assets/list-filter-B8PQk3RA.js +1 -0
- package/build/assets/{list-todo-apgLVjMw.js → list-todo-Caa8E1X_.js} +1 -1
- package/build/assets/llm-not-configured-banner-Dh_ajcM8.js +27 -0
- package/build/assets/llm-settings-CODhjQzy.js +1 -0
- package/build/assets/llm-settings-CZaXYgtw.js +1 -0
- package/build/assets/llm-subscription-service-CgIDc38n.js +1 -0
- package/build/assets/loader-circle-BxJgk73D.js +1 -0
- package/build/assets/{loading-spinner-BY9N3pOe.js → loading-spinner-BeLV0IXf.js} +1 -1
- package/build/assets/manage-backends-modal-cMXqCb-B.js +1 -0
- package/build/assets/manifest-bfeccb98.js +1 -0
- package/build/assets/manifest-subpage-layout-CVZgVKoY.js +1 -0
- package/build/assets/{map-provider-Cu3Zgumb.js → map-provider-iRs80q_6.js} +1 -1
- package/build/assets/markdown-renderer-DyFl9-mL.js +8 -0
- package/build/assets/mcp-CraxoXQv.js +1 -0
- package/build/assets/{mcp-marketplace-utils-AIBzzHTO.js → mcp-marketplace-utils-C7PYr293.js} +1 -1
- package/build/assets/mcp-page-CteH_K0N.js +9 -0
- package/build/assets/messages-Bk1xhbU2.js +41 -0
- package/build/assets/{modal-body-BxZjsju9.js → modal-body-C24WsdFb.js} +1 -1
- package/build/assets/{modal-classes-C8eycCwG.js → modal-classes-B0b9eiL8.js} +1 -1
- package/build/assets/modal-close-button-DfqfB2Nj.js +1 -0
- package/build/assets/{mouse-pointer-click-Co2uyaPA.js → mouse-pointer-click-BXlRN92t.js} +1 -1
- package/build/assets/onboarding-DXFBRqEy.js +1 -0
- package/build/assets/onboarding-modal-BT3Gx_sZ.js +1 -0
- package/build/assets/organization-service.api-B5CvmnYQ.js +1 -0
- package/build/assets/pencil-q-ihqDYv.js +1 -0
- package/build/assets/pin-BdroVQdN.js +1 -0
- package/build/assets/planner-tab-CstoOlAB.js +1 -0
- package/build/assets/plug-7ACOEbMs.js +1 -0
- package/build/assets/plugins-management-service-5rqVPEGN.js +1 -0
- package/build/assets/plus-C2e21TFC.js +1 -0
- package/build/assets/profiles-service.api-D1XKMgr0.js +1 -0
- package/build/assets/providers-XmZ9HM4Q.js +1 -0
- package/build/assets/proxy-XP6U1Dhv.js +1 -0
- package/build/assets/{puzzle-JM_QaRm0.js → puzzle-LJYnuxKe.js} +1 -1
- package/build/assets/react-BX7IV650.js +1 -0
- package/build/assets/recommended-automations-launcher-DEHRKIAg.js +1 -0
- package/build/assets/refresh-cw-BtdC3T8P.js +1 -0
- package/build/assets/root-CM6IZHlg.css +1 -0
- package/build/assets/root-DdFkodKW.js +2 -0
- package/build/assets/root-layout-DUquNZTU.js +2 -0
- package/build/assets/schema-field-Y3F8JvXd.js +1 -0
- package/build/assets/scroll-fade-state-Dt_fx2kf.js +1 -0
- package/build/assets/sdk-section-page-CNZTLwH9.js +1 -0
- package/build/assets/secret-form-9-BoGA40.js +1 -0
- package/build/assets/secrets-service-BOIsfD9j.js +1 -0
- package/build/assets/secrets-settings-CBJgFr42.js +1 -0
- package/build/assets/settings-D4hdToD4.js +1 -0
- package/build/assets/settings-dropdown-input-DBvsZ7-Q.js +1 -0
- package/build/assets/settings-index-DeQphyBK.js +1 -0
- package/build/assets/settings-input-dVuzapBA.js +1 -0
- package/build/assets/{settings-list-classes-BzeSZbF2.js → settings-list-classes-DhAPuXm6.js} +1 -1
- package/build/assets/settings-modal-tHiJ8iYV.js +1 -0
- package/build/assets/settings-nav-GAQjW1a-.js +16 -0
- package/build/assets/settings-service.api-C1vZH9Vh.js +1 -0
- package/build/assets/settings-switch-DDd1cQ8t.js +1 -0
- package/build/assets/{settings-utils-UYpEdPuD.js → settings-utils-BTaaRhLZ.js} +1 -1
- package/build/assets/shared-conversation-Cyg7m7ns.js +1 -0
- package/build/assets/shield-check-C3Rl0NF8.js +1 -0
- package/build/assets/{sidebar-layout-D6fS8-Gl.js → sidebar-layout-DH0E-5KW.js} +1 -1
- package/build/assets/sidebar-mobile-menu-toggle-CQ4iky__.js +1 -0
- package/build/assets/{sidebar-nav-link-DQQcMf1A.js → sidebar-nav-link-oLQiKUBu.js} +1 -1
- package/build/assets/{sidebar-onboarding-checklist-storage-BBkeI6Bp.js → sidebar-onboarding-checklist-storage-TfvNNnnr.js} +1 -1
- package/build/assets/sidebar-store-DAZVH-DR.js +1 -0
- package/build/assets/skill-card-pill-row-DfjIfj0K.js +1 -0
- package/build/assets/{skill-filter-w__3UCEE.js → skill-filter-DsNLmn76.js} +2 -2
- package/build/assets/{skill-icon-badge-RQkq8wvl.js → skill-icon-badge-0MK_68Nc.js} +1 -1
- package/build/assets/skill-scope-BE-H9TSZ.js +1 -0
- package/build/assets/skills-plugins-vzSdxSk_.js +1 -0
- package/build/assets/skills-settings-BiPOH9H9.js +1 -0
- package/build/assets/styled-tooltip-CejG0rqv.js +1 -0
- package/build/assets/task-list-tab-OkZSqnTp.js +1 -0
- package/build/assets/{terminal-CNElN42a.js → terminal-Dph60VFZ.js} +2 -2
- package/build/assets/toggle-switch-B2uXaAUS.js +1 -0
- package/build/assets/trash-2-Bb40zQzs.js +1 -0
- package/build/assets/trash-Ckh7yCaB.js +1 -0
- package/build/assets/triangle-alert-DEdu-b_L.js +1 -0
- package/build/assets/{typography-v1KN0tzi.js → typography-DgcLGdHk.js} +1 -1
- package/build/assets/usage-tab-MCmNRAnR.js +1 -0
- package/build/assets/use-acp-credential-form-ychoGqjC.js +1 -0
- package/build/assets/use-activate-agent-profile-8L8Xdghy.js +1 -0
- package/build/assets/use-agent-profiles-Bi8hSkze.js +1 -0
- package/build/assets/{use-automation-health-E6NZi9rb.js → use-automation-health-U99vvHxx.js} +1 -1
- package/build/assets/use-automation-permissions-Buus0R6h.js +1 -0
- package/build/assets/{use-automations-xijQKIl9.js → use-automations-Bq5hVuv0.js} +1 -1
- package/build/assets/{use-can-manage-org-profiles-CrJP5262.js → use-can-manage-org-profiles-MzIeEV8F.js} +1 -1
- package/build/assets/use-canvas-extensions-Ca9KoVEm.js +1 -0
- package/build/assets/{use-cloud-current-user-id-CDfAHpPX.js → use-cloud-current-user-id-B4ZLUZSa.js} +1 -1
- package/build/assets/use-config-l5tkDHyD.js +1 -0
- package/build/assets/use-create-conversation-i_PdFdIs.js +1 -0
- package/build/assets/use-create-secret-CjWq0J4O.js +1 -0
- package/build/assets/use-free-models-gCsJ5BV0.js +1 -0
- package/build/assets/{use-get-secrets-K3jmk-LH.js → use-get-secrets-CMTuWEp_.js} +1 -1
- package/build/assets/use-is-authed-A2Yinlt0.js +1 -0
- package/build/assets/{use-launch-skill-in-chat-BYjYihBP.js → use-launch-skill-in-chat-QbXDhiHr.js} +1 -1
- package/build/assets/use-llm-configured-Dl4zg8ht.js +1 -0
- package/build/assets/use-llm-profiles-SWsuFmFu.js +1 -0
- package/build/assets/use-manifest-capabilities-CdqYfUAC.js +1 -0
- package/build/assets/use-onboarding-completion-Xl63ZvzQ.js +1 -0
- package/build/assets/use-pinned-home-route-BXDIUaxQ.js +1 -0
- package/build/assets/use-plugins-marketplace-BIIaPiaB.js +1 -0
- package/build/assets/use-save-agent-profile-D-ZHHE94.js +1 -0
- package/build/assets/{use-save-settings-DYqkKv7T.js → use-save-settings-Dapkf4cC.js} +1 -1
- package/build/assets/use-settings-C2KKQKVC.js +1 -0
- package/build/assets/use-settings-nav-items-TOc0Rsfd.js +1 -0
- package/build/assets/use-tracking-j4uo9VEW.js +3 -0
- package/build/assets/{use-user-conversation-B9Gebw_g.js → use-user-conversation-5UFqMoO4.js} +1 -1
- package/build/assets/{useInfiniteQuery-C926xzY4.js → useInfiniteQuery-CtSRG7uW.js} +1 -1
- package/build/assets/{useMutation-B-qc391N.js → useMutation-Cszf8mKy.js} +1 -1
- package/build/assets/useQueries-pUohFMSP.js +1 -0
- package/build/assets/useQuery-DAAacS7O.js +1 -0
- package/build/assets/useTranslation-CCgUjPJF.js +1 -0
- package/build/assets/utils-BgLSZdyy.js +1 -0
- package/build/assets/{vendor~conversation-panel~conversation-C8Fn4XOf.js → vendor~conversation-panel~conversation-C22sJuWZ.js} +1 -1
- package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~b0x1wrp2-Z0lly3FE.js +2 -0
- package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-BXXGJNDU.js +185 -0
- package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-40UR63Gt.js +1 -0
- package/build/assets/{vendor~index-home~home~conversation-panel~conversation-hWywRBaR.js → vendor~index-home~home~conversation-panel~conversation-UTl7gUo9.js} +1 -1
- package/build/assets/vendor~root-layout-CcdIqs-C.js +1 -0
- package/build/assets/{vendor~root-layout~conversation-panel~conversation-BMbMgaGu.js → vendor~root-layout~conversation-panel~conversation-C3EBV3kp.js} +1 -1
- package/build/assets/vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-BCe0JJVy.js +1 -0
- package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation-j5MFqfSy.js → vendor~root-layout~index-home~home~conversation-panel~conversation-BGGbPcYh.js} +1 -1
- package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-CxhwKuAd.js +1 -0
- package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~nj1hli3r-DP9wmsjo.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~inibp4qe-CnsDDzeE.js} +1 -1
- package/build/assets/{vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-CUmIwQCN.js → vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~skills-setti~eo2nf80n-3eJ4ExtV.js} +12 -6
- package/build/assets/{verification-settings-gw_q6vkL.js → verification-settings-DdBpaVPz.js} +1 -1
- package/build/assets/{wrench-CUEI1krB.js → wrench-B8Wg_nbp.js} +1 -1
- package/build/assets/x-CX8lVGwm.js +1 -0
- package/build/index.html +4 -4
- package/build/locales/ar/openhands.json +79 -22
- package/build/locales/ca/openhands.json +79 -22
- package/build/locales/de/openhands.json +79 -22
- package/build/locales/en/openhands.json +79 -22
- package/build/locales/es/openhands.json +79 -22
- package/build/locales/fr/openhands.json +79 -22
- package/build/locales/it/openhands.json +79 -22
- package/build/locales/ja/openhands.json +79 -22
- package/build/locales/ko-KR/openhands.json +79 -22
- package/build/locales/no/openhands.json +79 -22
- package/build/locales/pt/openhands.json +79 -22
- package/build/locales/tr/openhands.json +79 -22
- package/build/locales/uk/openhands.json +79 -22
- package/build/locales/zh-CN/openhands.json +79 -22
- package/build/locales/zh-TW/openhands.json +79 -22
- package/config/defaults.json +3 -3
- package/dist/api/agent-server-adapter.cjs +3 -3
- package/dist/api/agent-server-adapter.cjs.map +1 -1
- package/dist/api/agent-server-adapter.d.ts +72 -12
- package/dist/api/agent-server-adapter.js +234 -132
- package/dist/api/agent-server-adapter.js.map +1 -1
- package/dist/api/agent-server-config.cjs +1 -1
- package/dist/api/agent-server-config.cjs.map +1 -1
- package/dist/api/agent-server-config.d.ts +6 -0
- package/dist/api/agent-server-config.js +6 -3
- package/dist/api/agent-server-config.js.map +1 -1
- package/dist/api/automation-service/automation-service.api.cjs +1 -1
- package/dist/api/automation-service/automation-service.api.cjs.map +1 -1
- package/dist/api/automation-service/automation-service.api.d.ts +2 -2
- package/dist/api/automation-service/automation-service.api.js +7 -7
- package/dist/api/automation-service/automation-service.api.js.map +1 -1
- package/dist/api/cloud/organization-service.api.cjs.map +1 -1
- package/dist/api/cloud/organization-service.api.d.ts +9 -1
- package/dist/api/cloud/organization-service.api.js.map +1 -1
- package/dist/api/cloud/provider-connections-service.api.cjs +2 -0
- package/dist/api/cloud/provider-connections-service.api.cjs.map +1 -0
- package/dist/api/cloud/provider-connections-service.api.d.ts +5 -0
- package/dist/api/cloud/provider-connections-service.api.js +50 -0
- package/dist/api/cloud/provider-connections-service.api.js.map +1 -0
- package/dist/api/cloud/skills-service.api.cjs +1 -1
- package/dist/api/cloud/skills-service.api.cjs.map +1 -1
- package/dist/api/cloud/skills-service.api.d.ts +10 -0
- package/dist/api/cloud/skills-service.api.js +11 -1
- package/dist/api/cloud/skills-service.api.js.map +1 -1
- package/dist/api/config-service/config-service.api.cjs +1 -1
- package/dist/api/config-service/config-service.api.cjs.map +1 -1
- package/dist/api/config-service/config-service.api.js +6 -2
- package/dist/api/config-service/config-service.api.js.map +1 -1
- package/dist/api/config-service/config-service.types.d.ts +13 -0
- package/dist/api/conversation-metadata-store.cjs +1 -1
- package/dist/api/conversation-metadata-store.cjs.map +1 -1
- package/dist/api/conversation-metadata-store.d.ts +24 -0
- package/dist/api/conversation-metadata-store.js +10 -2
- package/dist/api/conversation-metadata-store.js.map +1 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.cjs +1 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.cjs.map +1 -1
- package/dist/api/conversation-service/agent-server-conversation-service.api.d.ts +20 -0
- package/dist/api/conversation-service/agent-server-conversation-service.api.js +126 -77
- package/dist/api/conversation-service/agent-server-conversation-service.api.js.map +1 -1
- package/dist/api/hooks-service.cjs +2 -0
- package/dist/api/hooks-service.cjs.map +1 -0
- package/dist/api/hooks-service.d.ts +13 -0
- package/dist/api/hooks-service.js +20 -0
- package/dist/api/hooks-service.js.map +1 -0
- package/dist/api/provider-connections-service/provider-connections-service.api.cjs +1 -1
- package/dist/api/provider-connections-service/provider-connections-service.api.cjs.map +1 -1
- package/dist/api/provider-connections-service/provider-connections-service.api.js +25 -16
- package/dist/api/provider-connections-service/provider-connections-service.api.js.map +1 -1
- package/dist/api/settings-service/settings-service.api.cjs +1 -1
- package/dist/api/settings-service/settings-service.api.cjs.map +1 -1
- package/dist/api/settings-service/settings-service.api.d.ts +2 -0
- package/dist/api/settings-service/settings-service.api.js +18 -10
- package/dist/api/settings-service/settings-service.api.js.map +1 -1
- package/dist/api/skills-service.cjs +1 -1
- package/dist/api/skills-service.cjs.map +1 -1
- package/dist/api/skills-service.d.ts +7 -0
- package/dist/api/skills-service.js +11 -8
- package/dist/api/skills-service.js.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/critic-result-display.cjs +1 -1
- package/dist/components/conversation-events/chat/event-message-components/critic-result-display.js +5 -5
- package/dist/components/conversation-events/chat/event-message-components/finish-event-message.cjs +1 -1
- package/dist/components/conversation-events/chat/event-message-components/finish-event-message.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/finish-event-message.js +2 -1
- package/dist/components/conversation-events/chat/event-message-components/finish-event-message.js.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs +1 -1
- package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.d.ts +1 -1
- package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js +28 -28
- package/dist/components/conversation-events/chat/event-message-components/generic-event-message-wrapper.js.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/thought-event-message.cjs +1 -1
- package/dist/components/conversation-events/chat/event-message-components/thought-event-message.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/thought-event-message.js +2 -1
- package/dist/components/conversation-events/chat/event-message-components/thought-event-message.js.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.cjs +1 -1
- package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.d.ts +1 -1
- package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.js +37 -37
- package/dist/components/conversation-events/chat/event-message-components/user-assistant-event-message.js.map +1 -1
- package/dist/components/conversation-events/chat/event-message.cjs +2 -2
- package/dist/components/conversation-events/chat/event-message.cjs.map +1 -1
- package/dist/components/conversation-events/chat/event-message.js +79 -70
- package/dist/components/conversation-events/chat/event-message.js.map +1 -1
- package/dist/components/conversation-events/chat/messages.cjs +1 -1
- package/dist/components/conversation-events/chat/messages.cjs.map +1 -1
- package/dist/components/conversation-events/chat/messages.js +28 -27
- package/dist/components/conversation-events/chat/messages.js.map +1 -1
- package/dist/components/features/automations/automation-card.cjs +1 -1
- package/dist/components/features/automations/automation-card.cjs.map +1 -1
- package/dist/components/features/automations/automation-card.js +104 -97
- package/dist/components/features/automations/automation-card.js.map +1 -1
- package/dist/components/features/automations/automation-list-row.cjs +1 -1
- package/dist/components/features/automations/automation-list-row.cjs.map +1 -1
- package/dist/components/features/automations/automation-list-row.js +89 -77
- package/dist/components/features/automations/automation-list-row.js.map +1 -1
- package/dist/components/features/automations/build-automation-menu-items.cjs +1 -1
- package/dist/components/features/automations/build-automation-menu-items.cjs.map +1 -1
- package/dist/components/features/automations/build-automation-menu-items.d.ts +3 -1
- package/dist/components/features/automations/build-automation-menu-items.js +12 -11
- package/dist/components/features/automations/build-automation-menu-items.js.map +1 -1
- package/dist/components/features/automations/detail/configuration-section.d.ts +7 -1
- package/dist/components/features/automations/detail/detail-header.d.ts +10 -5
- package/dist/components/features/automations/detail/run-status-badge.cjs +1 -1
- package/dist/components/features/automations/detail/run-status-badge.cjs.map +1 -1
- package/dist/components/features/automations/detail/run-status-badge.d.ts +2 -2
- package/dist/components/features/automations/detail/run-status-badge.js +82 -53
- package/dist/components/features/automations/detail/run-status-badge.js.map +1 -1
- package/dist/components/features/automations/kebab-menu.cjs +1 -1
- package/dist/components/features/automations/kebab-menu.cjs.map +1 -1
- package/dist/components/features/automations/kebab-menu.js +9 -5
- package/dist/components/features/automations/kebab-menu.js.map +1 -1
- package/dist/components/features/automations/recommended-automations-launcher.cjs +1 -1
- package/dist/components/features/automations/recommended-automations-launcher.cjs.map +1 -1
- package/dist/components/features/automations/recommended-automations-launcher.js +12 -12
- package/dist/components/features/automations/recommended-automations-launcher.js.map +1 -1
- package/dist/components/features/automations/recommended-automations-section.cjs +1 -1
- package/dist/components/features/automations/recommended-automations-section.js +9 -9
- package/dist/components/features/backends/backend-selector.cjs +1 -1
- package/dist/components/features/backends/backend-selector.cjs.map +1 -1
- package/dist/components/features/backends/backend-selector.js +123 -112
- package/dist/components/features/backends/backend-selector.js.map +1 -1
- package/dist/components/features/backends/manage-backends-modal.cjs +1 -1
- package/dist/components/features/backends/manage-backends-modal.cjs.map +1 -1
- package/dist/components/features/backends/manage-backends-modal.js +29 -29
- package/dist/components/features/backends/manage-backends-modal.js.map +1 -1
- package/dist/components/features/chat/change-agent-button.cjs +1 -1
- package/dist/components/features/chat/change-agent-button.js +4 -4
- package/dist/components/features/chat/chat-interface.cjs +2 -2
- package/dist/components/features/chat/chat-interface.cjs.map +1 -1
- package/dist/components/features/chat/chat-interface.js +137 -137
- package/dist/components/features/chat/chat-interface.js.map +1 -1
- package/dist/components/features/chat/chat-message.cjs +1 -1
- package/dist/components/features/chat/chat-message.cjs.map +1 -1
- package/dist/components/features/chat/chat-message.d.ts +2 -1
- package/dist/components/features/chat/chat-message.js +88 -79
- package/dist/components/features/chat/chat-message.js.map +1 -1
- package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs +1 -1
- package/dist/components/features/chat/components/chat-input-llm-profile-picker.cjs.map +1 -1
- package/dist/components/features/chat/components/chat-input-llm-profile-picker.js +62 -61
- package/dist/components/features/chat/components/chat-input-llm-profile-picker.js.map +1 -1
- package/dist/components/features/chat/components/context-window-meter.cjs +1 -1
- package/dist/components/features/chat/components/context-window-meter.js +4 -4
- package/dist/components/features/chat/confirmation-mode-enabled.cjs +1 -1
- package/dist/components/features/chat/confirmation-mode-enabled.js +4 -4
- package/dist/components/features/chat/generic-event-message.cjs +1 -1
- package/dist/components/features/chat/generic-event-message.cjs.map +1 -1
- package/dist/components/features/chat/generic-event-message.d.ts +2 -1
- package/dist/components/features/chat/generic-event-message.js +41 -22
- package/dist/components/features/chat/generic-event-message.js.map +1 -1
- package/dist/components/features/chat/interactive-chat-box.cjs +1 -1
- package/dist/components/features/chat/interactive-chat-box.cjs.map +1 -1
- package/dist/components/features/chat/interactive-chat-box.js +20 -19
- package/dist/components/features/chat/interactive-chat-box.js.map +1 -1
- package/dist/components/features/chat/model-messages.cjs +1 -1
- package/dist/components/features/chat/model-messages.cjs.map +1 -1
- package/dist/components/features/chat/model-messages.js +27 -26
- package/dist/components/features/chat/model-messages.js.map +1 -1
- package/dist/components/features/conversation/conversation-overview-git-section.cjs +1 -1
- package/dist/components/features/conversation/conversation-overview-git-section.js +4 -4
- package/dist/components/features/conversation/conversation-overview-skills-panel.cjs +1 -1
- package/dist/components/features/conversation/conversation-overview-skills-panel.js +4 -4
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js +77 -78
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs-context-menu.js.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs.cjs.map +1 -1
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js +88 -88
- package/dist/components/features/conversation/conversation-tabs/conversation-tabs.js.map +1 -1
- package/dist/components/features/conversation-panel/advanced-conversation-options-modal.cjs +2 -0
- package/dist/components/features/conversation-panel/advanced-conversation-options-modal.cjs.map +1 -0
- package/dist/components/features/conversation-panel/advanced-conversation-options-modal.d.ts +21 -0
- package/dist/components/features/conversation-panel/advanced-conversation-options-modal.js +239 -0
- package/dist/components/features/conversation-panel/advanced-conversation-options-modal.js.map +1 -0
- package/dist/components/features/conversation-panel/budget-display.cjs +1 -1
- package/dist/components/features/conversation-panel/budget-display.cjs.map +1 -1
- package/dist/components/features/conversation-panel/budget-display.d.ts +1 -2
- package/dist/components/features/conversation-panel/budget-display.js +12 -19
- package/dist/components/features/conversation-panel/budget-display.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-active-tag-filters.cjs +2 -0
- package/dist/components/features/conversation-panel/conversation-active-tag-filters.cjs.map +1 -0
- package/dist/components/features/conversation-panel/conversation-active-tag-filters.d.ts +28 -0
- package/dist/components/features/conversation-panel/conversation-active-tag-filters.js +69 -0
- package/dist/components/features/conversation-panel/conversation-active-tag-filters.js.map +1 -0
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.d.ts +2 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js +19 -18
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-actions.js.map +1 -1
- 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.d.ts +2 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js +91 -80
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-context-menu.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js +45 -44
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-footer.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card-preview.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card.d.ts +7 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-card.js +87 -81
- package/dist/components/features/conversation-panel/conversation-card/conversation-card.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.d.ts +2 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-chips.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.d.ts +2 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js +2 -1
- package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-layouts-menu.cjs +2 -0
- package/dist/components/features/conversation-panel/conversation-layouts-menu.cjs.map +1 -0
- package/dist/components/features/conversation-panel/conversation-layouts-menu.d.ts +29 -0
- package/dist/components/features/conversation-panel/conversation-layouts-menu.js +177 -0
- package/dist/components/features/conversation-panel/conversation-layouts-menu.js.map +1 -0
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.d.ts +37 -0
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js +85 -45
- package/dist/components/features/conversation-panel/conversation-panel-list-helpers.js.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel.cjs +1 -1
- package/dist/components/features/conversation-panel/conversation-panel.cjs.map +1 -1
- package/dist/components/features/conversation-panel/conversation-panel.js +296 -290
- package/dist/components/features/conversation-panel/conversation-panel.js.map +1 -1
- package/dist/components/features/conversation-panel/edit-conversation-tags-modal.cjs +2 -0
- package/dist/components/features/conversation-panel/edit-conversation-tags-modal.cjs.map +1 -0
- package/dist/components/features/conversation-panel/edit-conversation-tags-modal.d.ts +22 -0
- package/dist/components/features/conversation-panel/edit-conversation-tags-modal.js +153 -0
- package/dist/components/features/conversation-panel/edit-conversation-tags-modal.js.map +1 -0
- package/dist/components/features/conversation-panel/hide-older-conversations-row.cjs +2 -0
- package/dist/components/features/conversation-panel/hide-older-conversations-row.cjs.map +1 -0
- package/dist/components/features/conversation-panel/hide-older-conversations-row.d.ts +6 -0
- package/dist/components/features/conversation-panel/hide-older-conversations-row.js +65 -0
- package/dist/components/features/conversation-panel/hide-older-conversations-row.js.map +1 -0
- package/dist/components/features/conversation-panel/menu-row.cjs +1 -1
- package/dist/components/features/conversation-panel/menu-row.cjs.map +1 -1
- package/dist/components/features/conversation-panel/menu-row.d.ts +11 -1
- package/dist/components/features/conversation-panel/menu-row.js +27 -16
- package/dist/components/features/conversation-panel/menu-row.js.map +1 -1
- package/dist/components/features/home/featured-automations/automation-health-indicator.cjs +1 -1
- package/dist/components/features/home/featured-automations/automation-health-indicator.cjs.map +1 -1
- package/dist/components/features/home/featured-automations/automation-health-indicator.js +1 -1
- package/dist/components/features/home/featured-automations/automation-health-indicator.js.map +1 -1
- package/dist/components/features/home/featured-automations/automation-run-activity-metrics.cjs +1 -1
- package/dist/components/features/home/featured-automations/automation-run-activity-metrics.cjs.map +1 -1
- package/dist/components/features/home/featured-automations/automation-run-activity-metrics.d.ts +4 -3
- package/dist/components/features/home/featured-automations/automation-run-activity-metrics.js +22 -25
- package/dist/components/features/home/featured-automations/automation-run-activity-metrics.js.map +1 -1
- package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.cjs +1 -1
- package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.cjs.map +1 -1
- package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.d.ts +1 -1
- package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.js +15 -15
- package/dist/components/features/home/featured-automations/automation-run-activity-sparkline.js.map +1 -1
- package/dist/components/features/home/featured-automations/automation-run-health.cjs +1 -1
- package/dist/components/features/home/featured-automations/automation-run-health.cjs.map +1 -1
- package/dist/components/features/home/featured-automations/automation-run-health.d.ts +5 -3
- package/dist/components/features/home/featured-automations/automation-run-health.js +30 -23
- package/dist/components/features/home/featured-automations/automation-run-health.js.map +1 -1
- package/dist/components/features/home/featured-automations/build-home-automation-menu-items.d.ts +1 -2
- package/dist/components/features/home/featured-automations/build-pinned-automation-menu-items.d.ts +0 -1
- package/dist/components/features/home/featured-automations/home-automation-activity.d.ts +3 -2
- package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs +1 -1
- package/dist/components/features/home/featured-automations/home-automation-run-tooltip.cjs.map +1 -1
- package/dist/components/features/home/featured-automations/home-automation-run-tooltip.d.ts +1 -1
- package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js +42 -42
- package/dist/components/features/home/featured-automations/home-automation-run-tooltip.js.map +1 -1
- package/dist/components/features/images/image-lightbox.cjs +2 -0
- package/dist/components/features/images/image-lightbox.cjs.map +1 -0
- package/dist/components/features/images/image-lightbox.d.ts +11 -0
- package/dist/components/features/images/image-lightbox.js +37 -0
- package/dist/components/features/images/image-lightbox.js.map +1 -0
- package/dist/components/features/images/image-preview.cjs +1 -1
- package/dist/components/features/images/image-preview.cjs.map +1 -1
- package/dist/components/features/images/image-preview.d.ts +2 -1
- package/dist/components/features/images/image-preview.js +33 -13
- package/dist/components/features/images/image-preview.js.map +1 -1
- package/dist/components/features/manifest/manifest-form-field.d.ts +3 -1
- package/dist/components/features/manifest/manifest-review-step.d.ts +3 -1
- package/dist/components/features/onboarding/steps/setup-llm-step.d.ts +3 -4
- package/dist/components/features/settings/cloud-settings-link.cjs +1 -1
- package/dist/components/features/settings/cloud-settings-link.cjs.map +1 -1
- package/dist/components/features/settings/cloud-settings-link.d.ts +3 -1
- package/dist/components/features/settings/cloud-settings-link.js +22 -19
- package/dist/components/features/settings/cloud-settings-link.js.map +1 -1
- package/dist/components/features/settings/integrations-settings-link.cjs +1 -1
- package/dist/components/features/settings/integrations-settings-link.cjs.map +1 -1
- package/dist/components/features/settings/integrations-settings-link.d.ts +3 -1
- package/dist/components/features/settings/integrations-settings-link.js +20 -17
- package/dist/components/features/settings/integrations-settings-link.js.map +1 -1
- package/dist/components/features/settings/llm-profiles/llm-settings-local-view.cjs +1 -1
- package/dist/components/features/settings/llm-profiles/llm-settings-local-view.js +3 -2
- package/dist/components/features/settings/llm-profiles/profile-row.cjs +1 -1
- package/dist/components/features/settings/llm-profiles/profile-row.js +1 -1
- package/dist/components/features/settings/llm-profiles/profiles-body.d.ts +2 -2
- package/dist/components/features/settings/sdk-settings/sdk-section-page.cjs +1 -1
- package/dist/components/features/settings/sdk-settings/sdk-section-page.cjs.map +1 -1
- package/dist/components/features/settings/sdk-settings/sdk-section-page.d.ts +8 -7
- package/dist/components/features/settings/sdk-settings/sdk-section-page.js +172 -142
- package/dist/components/features/settings/sdk-settings/sdk-section-page.js.map +1 -1
- package/dist/components/features/settings/secrets-settings/secret-form.cjs +1 -1
- package/dist/components/features/settings/secrets-settings/secret-form.cjs.map +1 -1
- package/dist/components/features/settings/secrets-settings/secret-form.js +38 -25
- package/dist/components/features/settings/secrets-settings/secret-form.js.map +1 -1
- package/dist/components/features/settings/settings-dropdown-input.cjs +1 -1
- package/dist/components/features/settings/settings-dropdown-input.js +6 -6
- package/dist/components/features/sidebar/sidebar-rail-body.cjs +1 -1
- package/dist/components/features/sidebar/sidebar-rail-body.cjs.map +1 -1
- package/dist/components/features/sidebar/sidebar-rail-body.d.ts +4 -1
- package/dist/components/features/sidebar/sidebar-rail-body.js +157 -139
- package/dist/components/features/sidebar/sidebar-rail-body.js.map +1 -1
- package/dist/components/features/sidebar/sidebar.cjs +1 -1
- package/dist/components/features/sidebar/sidebar.cjs.map +1 -1
- package/dist/components/features/sidebar/sidebar.js +28 -26
- package/dist/components/features/sidebar/sidebar.js.map +1 -1
- package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.cjs +1 -1
- package/dist/components/features/sidebar/use-sidebar-onboarding-checklist.js +3 -3
- package/dist/components/features/skills/extensions-navigation.cjs +1 -1
- package/dist/components/features/skills/extensions-navigation.cjs.map +1 -1
- package/dist/components/features/skills/extensions-navigation.js +3 -3
- package/dist/components/features/skills/extensions-navigation.js.map +1 -1
- package/dist/components/providers/agent-server-ui-providers.cjs +1 -1
- package/dist/components/providers/agent-server-ui-providers.cjs.map +1 -1
- package/dist/components/providers/agent-server-ui-providers.js +33 -29
- package/dist/components/providers/agent-server-ui-providers.js.map +1 -1
- package/dist/components/shared/buttons/remove-button.cjs +1 -1
- package/dist/components/shared/buttons/remove-button.cjs.map +1 -1
- package/dist/components/shared/buttons/remove-button.d.ts +2 -1
- package/dist/components/shared/buttons/remove-button.js +2 -1
- package/dist/components/shared/buttons/remove-button.js.map +1 -1
- package/dist/components/shared/buttons/styled-tooltip.cjs +1 -1
- package/dist/components/shared/buttons/styled-tooltip.cjs.map +1 -1
- package/dist/components/shared/buttons/styled-tooltip.d.ts +2 -1
- package/dist/components/shared/buttons/styled-tooltip.js +2 -1
- package/dist/components/shared/buttons/styled-tooltip.js.map +1 -1
- package/dist/components/shared/filters/enum-filter-dropdown.cjs +1 -1
- package/dist/components/shared/filters/enum-filter-dropdown.cjs.map +1 -1
- package/dist/components/shared/filters/enum-filter-dropdown.d.ts +5 -1
- package/dist/components/shared/filters/enum-filter-dropdown.js +14 -14
- package/dist/components/shared/filters/enum-filter-dropdown.js.map +1 -1
- package/dist/components/shared/free-models-note.cjs +2 -0
- package/dist/components/shared/free-models-note.cjs.map +1 -0
- package/dist/components/shared/free-models-note.d.ts +3 -0
- package/dist/components/shared/free-models-note.js +20 -0
- package/dist/components/shared/free-models-note.js.map +1 -0
- package/dist/components/shared/modals/confirmation-modal.cjs +1 -1
- package/dist/components/shared/modals/confirmation-modal.cjs.map +1 -1
- package/dist/components/shared/modals/confirmation-modal.d.ts +2 -1
- package/dist/components/shared/modals/confirmation-modal.js +8 -8
- package/dist/components/shared/modals/confirmation-modal.js.map +1 -1
- package/dist/components/shared/modals/settings/model-selector.cjs +1 -1
- package/dist/components/shared/modals/settings/model-selector.cjs.map +1 -1
- package/dist/components/shared/modals/settings/model-selector.js +102 -112
- package/dist/components/shared/modals/settings/model-selector.js.map +1 -1
- package/dist/config/defaults.cjs +1 -1
- package/dist/config/defaults.cjs.map +1 -1
- package/dist/config/defaults.js +3 -3
- package/dist/config/defaults.js.map +1 -1
- package/dist/constants/acp-providers.cjs.map +1 -1
- package/dist/constants/acp-providers.d.ts +12 -0
- package/dist/constants/acp-providers.js.map +1 -1
- package/dist/constants/settings-nav.d.ts +8 -0
- package/dist/contexts/conversation-websocket-context.cjs +3 -3
- package/dist/contexts/conversation-websocket-context.cjs.map +1 -1
- package/dist/contexts/conversation-websocket-context.d.ts +5 -0
- package/dist/contexts/conversation-websocket-context.js +194 -198
- package/dist/contexts/conversation-websocket-context.js.map +1 -1
- package/dist/contexts/websocket-provider-wrapper.cjs +1 -1
- package/dist/contexts/websocket-provider-wrapper.cjs.map +1 -1
- package/dist/contexts/websocket-provider-wrapper.js +31 -15
- package/dist/contexts/websocket-provider-wrapper.js.map +1 -1
- package/dist/hooks/chat/record-model-switch-message.cjs +1 -1
- package/dist/hooks/chat/record-model-switch-message.cjs.map +1 -1
- package/dist/hooks/chat/record-model-switch-message.d.ts +31 -0
- package/dist/hooks/chat/record-model-switch-message.js +25 -12
- package/dist/hooks/chat/record-model-switch-message.js.map +1 -1
- package/dist/hooks/chat/use-plan-mode-interceptor.cjs +2 -0
- package/dist/hooks/chat/use-plan-mode-interceptor.cjs.map +1 -0
- package/dist/hooks/chat/use-plan-mode-interceptor.d.ts +16 -0
- package/dist/hooks/chat/use-plan-mode-interceptor.js +43 -0
- package/dist/hooks/chat/use-plan-mode-interceptor.js.map +1 -0
- package/dist/hooks/chat/use-slash-command.cjs +1 -1
- package/dist/hooks/chat/use-slash-command.cjs.map +1 -1
- package/dist/hooks/chat/use-slash-command.js +63 -62
- package/dist/hooks/chat/use-slash-command.js.map +1 -1
- package/dist/hooks/mutation/use-create-conversation.cjs +1 -1
- package/dist/hooks/mutation/use-create-conversation.cjs.map +1 -1
- package/dist/hooks/mutation/use-create-conversation.js +5 -1
- package/dist/hooks/mutation/use-create-conversation.js.map +1 -1
- package/dist/hooks/mutation/use-read-conversation-file.cjs +1 -1
- package/dist/hooks/mutation/use-read-conversation-file.cjs.map +1 -1
- package/dist/hooks/mutation/use-read-conversation-file.js +11 -4
- package/dist/hooks/mutation/use-read-conversation-file.js.map +1 -1
- package/dist/hooks/mutation/use-save-settings.cjs +1 -1
- package/dist/hooks/mutation/use-save-settings.js +3 -3
- package/dist/hooks/mutation/use-switch-llm-profile.cjs +1 -1
- package/dist/hooks/mutation/use-switch-llm-profile.cjs.map +1 -1
- package/dist/hooks/mutation/use-switch-llm-profile.js +13 -25
- package/dist/hooks/mutation/use-switch-llm-profile.js.map +1 -1
- package/dist/hooks/mutation/use-update-conversation-tags.cjs +2 -0
- package/dist/hooks/mutation/use-update-conversation-tags.cjs.map +1 -0
- package/dist/hooks/mutation/use-update-conversation-tags.d.ts +8 -0
- package/dist/hooks/mutation/use-update-conversation-tags.js +45 -0
- package/dist/hooks/mutation/use-update-conversation-tags.js.map +1 -0
- package/dist/hooks/query/query-keys.cjs +1 -1
- package/dist/hooks/query/query-keys.cjs.map +1 -1
- package/dist/hooks/query/query-keys.d.ts +6 -0
- package/dist/hooks/query/query-keys.js +2 -2
- package/dist/hooks/query/query-keys.js.map +1 -1
- package/dist/hooks/query/use-automation-sdk-version.cjs +1 -1
- package/dist/hooks/query/use-automation-sdk-version.cjs.map +1 -1
- package/dist/hooks/query/use-automation-sdk-version.d.ts +0 -1
- package/dist/hooks/query/use-automation-sdk-version.js +30 -55
- package/dist/hooks/query/use-automation-sdk-version.js.map +1 -1
- package/dist/hooks/query/use-conversation-skills.cjs +1 -1
- package/dist/hooks/query/use-conversation-skills.cjs.map +1 -1
- package/dist/hooks/query/use-conversation-skills.d.ts +14 -5
- package/dist/hooks/query/use-conversation-skills.js +20 -4
- package/dist/hooks/query/use-conversation-skills.js.map +1 -1
- package/dist/hooks/query/use-free-models.cjs +2 -0
- package/dist/hooks/query/use-free-models.cjs.map +1 -0
- package/dist/hooks/query/use-free-models.d.ts +23 -0
- package/dist/hooks/query/use-free-models.js +67 -0
- package/dist/hooks/query/use-free-models.js.map +1 -0
- package/dist/hooks/query/use-local-git-info.cjs.map +1 -1
- package/dist/hooks/query/use-local-git-info.js.map +1 -1
- package/dist/hooks/query/use-provider-connections.cjs +1 -1
- package/dist/hooks/query/use-provider-connections.cjs.map +1 -1
- package/dist/hooks/query/use-provider-connections.d.ts +6 -3
- package/dist/hooks/query/use-provider-connections.js +7 -3
- package/dist/hooks/query/use-provider-connections.js.map +1 -1
- package/dist/hooks/query/use-provider-models.cjs +1 -1
- package/dist/hooks/query/use-provider-models.cjs.map +1 -1
- package/dist/hooks/query/use-provider-models.js +34 -25
- package/dist/hooks/query/use-provider-models.js.map +1 -1
- package/dist/hooks/query/use-search-providers.cjs +1 -1
- package/dist/hooks/query/use-search-providers.cjs.map +1 -1
- package/dist/hooks/query/use-search-providers.js +31 -19
- package/dist/hooks/query/use-search-providers.js.map +1 -1
- package/dist/hooks/query/use-sub-conversations.cjs +1 -1
- package/dist/hooks/query/use-sub-conversations.cjs.map +1 -1
- package/dist/hooks/query/use-sub-conversations.js +16 -16
- package/dist/hooks/query/use-sub-conversations.js.map +1 -1
- package/dist/hooks/use-acp-model-context.cjs +1 -1
- package/dist/hooks/use-acp-model-context.js +3 -3
- package/dist/hooks/use-agent-state.cjs +1 -1
- package/dist/hooks/use-agent-state.cjs.map +1 -1
- package/dist/hooks/use-agent-state.d.ts +17 -1
- package/dist/hooks/use-agent-state.js +19 -9
- package/dist/hooks/use-agent-state.js.map +1 -1
- package/dist/hooks/use-automation-permissions.cjs +2 -0
- package/dist/hooks/use-automation-permissions.cjs.map +1 -0
- package/dist/hooks/use-automation-permissions.d.ts +43 -0
- package/dist/hooks/use-automation-permissions.js +52 -0
- package/dist/hooks/use-automation-permissions.js.map +1 -0
- package/dist/hooks/use-chat-input-model-state.cjs +1 -1
- package/dist/hooks/use-chat-input-model-state.js +3 -3
- package/dist/hooks/use-handle-plan-click.cjs +1 -1
- package/dist/hooks/use-handle-plan-click.cjs.map +1 -1
- package/dist/hooks/use-handle-plan-click.d.ts +3 -1
- package/dist/hooks/use-handle-plan-click.js +85 -26
- package/dist/hooks/use-handle-plan-click.js.map +1 -1
- package/dist/hooks/use-home-automation-actions.cjs +1 -1
- package/dist/hooks/use-home-automation-actions.cjs.map +1 -1
- package/dist/hooks/use-home-automation-actions.d.ts +1 -2
- package/dist/hooks/use-home-automation-actions.js +1 -1
- package/dist/hooks/use-home-automation-actions.js.map +1 -1
- package/dist/hooks/use-llm-configured.cjs +1 -1
- package/dist/hooks/use-llm-configured.js +3 -3
- package/dist/hooks/use-manifest-preflight.d.ts +1 -1
- package/dist/hooks/use-unified-websocket-status.cjs +1 -1
- package/dist/hooks/use-unified-websocket-status.cjs.map +1 -1
- package/dist/hooks/use-unified-websocket-status.d.ts +7 -0
- package/dist/hooks/use-unified-websocket-status.js +5 -1
- package/dist/hooks/use-unified-websocket-status.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 +71 -14
- package/dist/i18n/declaration.js +1 -1
- package/dist/i18n/declaration.js.map +1 -1
- package/dist/i18n/translation.cjs +2 -2
- package/dist/i18n/translation.cjs.map +1 -1
- package/dist/i18n/translation.js +1281 -312
- package/dist/i18n/translation.js.map +1 -1
- package/dist/locales/ar/openhands.json +79 -22
- package/dist/locales/ca/openhands.json +79 -22
- package/dist/locales/de/openhands.json +79 -22
- package/dist/locales/en/openhands.json +79 -22
- package/dist/locales/es/openhands.json +79 -22
- package/dist/locales/fr/openhands.json +79 -22
- package/dist/locales/it/openhands.json +79 -22
- package/dist/locales/ja/openhands.json +79 -22
- package/dist/locales/ko-KR/openhands.json +79 -22
- package/dist/locales/no/openhands.json +79 -22
- package/dist/locales/pt/openhands.json +79 -22
- package/dist/locales/tr/openhands.json +79 -22
- package/dist/locales/uk/openhands.json +79 -22
- package/dist/locales/zh-CN/openhands.json +79 -22
- package/dist/locales/zh-TW/openhands.json +79 -22
- package/dist/manifests/automation-insights.cjs.map +1 -1
- package/dist/manifests/automation-insights.d.ts +10 -2
- package/dist/manifests/automation-insights.js.map +1 -1
- package/dist/manifests/automation-setup.cjs +1 -1
- package/dist/manifests/automation-setup.cjs.map +1 -1
- package/dist/manifests/automation-setup.d.ts +9 -16
- package/dist/manifests/automation-setup.js +17 -7
- package/dist/manifests/automation-setup.js.map +1 -1
- package/dist/manifests/manifest-actions.d.ts +1 -1
- package/dist/manifests/manifest-capabilities.d.ts +3 -1
- package/dist/manifests/manifest-local-validation.cjs +2 -0
- package/dist/manifests/manifest-local-validation.cjs.map +1 -0
- package/dist/manifests/manifest-local-validation.d.ts +15 -11
- package/dist/manifests/manifest-local-validation.js +8 -0
- package/dist/manifests/manifest-local-validation.js.map +1 -0
- package/dist/manifests/manifest-template.cjs +2 -0
- package/dist/manifests/manifest-template.cjs.map +1 -0
- package/dist/manifests/manifest-template.d.ts +4 -4
- package/dist/manifests/manifest-template.js +12 -0
- package/dist/manifests/manifest-template.js.map +1 -0
- package/dist/manifests/manifest-validation.cjs +1 -1
- package/dist/manifests/manifest-validation.cjs.map +1 -1
- package/dist/manifests/manifest-validation.js +106 -28
- package/dist/manifests/manifest-validation.js.map +1 -1
- package/dist/manifests/types.cjs.map +1 -1
- package/dist/manifests/types.d.ts +39 -4
- package/dist/manifests/types.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.cjs +8 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.cjs.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.js +221 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/custom-automation/manifest.js.map +1 -0
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-issue-to-pr/manifest.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/github-pr-reviewer/manifest.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.js +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog/qa-changes/manifest.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.js +22 -20
- package/dist/node_modules/@openhands/extensions/automations/catalog-index.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/interface.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/automations/interface.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/automations/interface.js +2 -1
- package/dist/node_modules/@openhands/extensions/automations/interface.js.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.cjs.map +1 -1
- package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js +24 -5
- package/dist/node_modules/@openhands/extensions/integrations/catalog/gitlab.js.map +1 -1
- package/dist/node_modules/@tanstack/react-query/build/modern/QueryClientProvider.cjs +1 -1
- package/dist/node_modules/@tanstack/react-query/build/modern/QueryClientProvider.js +1 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.js +21 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/circle-question-mark.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/shrink.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/shrink.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/shrink.js +23 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/shrink.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.js +43 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.js.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/tags.cjs +2 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/tags.cjs.map +1 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/tags.js +22 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/tags.js.map +1 -0
- package/dist/package.cjs +1 -1
- package/dist/package.cjs.map +1 -1
- package/dist/package.js +4 -4
- package/dist/package.js.map +1 -1
- package/dist/routes/agent-settings.d.ts +2 -0
- package/dist/routes/app-settings.cjs +1 -1
- package/dist/routes/app-settings.cjs.map +1 -1
- package/dist/routes/app-settings.js +53 -48
- package/dist/routes/app-settings.js.map +1 -1
- package/dist/routes/llm-settings.cjs +1 -1
- package/dist/routes/llm-settings.cjs.map +1 -1
- package/dist/routes/llm-settings.d.ts +3 -1
- package/dist/routes/llm-settings.js +120 -127
- package/dist/routes/llm-settings.js.map +1 -1
- package/dist/routes/planner-tab.cjs +1 -1
- package/dist/routes/planner-tab.cjs.map +1 -1
- package/dist/routes/planner-tab.js +44 -28
- package/dist/routes/planner-tab.js.map +1 -1
- package/dist/services/telemetry.cjs +1 -1
- package/dist/services/telemetry.cjs.map +1 -1
- package/dist/services/telemetry.d.ts +5 -0
- package/dist/services/telemetry.js +122 -115
- package/dist/services/telemetry.js.map +1 -1
- package/dist/stores/conversation-panel-preferences-store.cjs +1 -1
- package/dist/stores/conversation-panel-preferences-store.cjs.map +1 -1
- package/dist/stores/conversation-panel-preferences-store.d.ts +32 -5
- package/dist/stores/conversation-panel-preferences-store.js +29 -12
- package/dist/stores/conversation-panel-preferences-store.js.map +1 -1
- package/dist/stores/conversation-state-store.cjs +1 -1
- package/dist/stores/conversation-state-store.cjs.map +1 -1
- package/dist/stores/conversation-state-store.d.ts +9 -3
- package/dist/stores/conversation-state-store.js +6 -3
- package/dist/stores/conversation-state-store.js.map +1 -1
- package/dist/stores/conversation-store.cjs +1 -1
- package/dist/stores/conversation-store.cjs.map +1 -1
- package/dist/stores/conversation-store.d.ts +2 -0
- package/dist/stores/conversation-store.js +3 -0
- package/dist/stores/conversation-store.js.map +1 -1
- package/dist/stores/free-models-store.cjs +2 -0
- package/dist/stores/free-models-store.cjs.map +1 -0
- package/dist/stores/free-models-store.d.ts +30 -0
- package/dist/stores/free-models-store.js +22 -0
- package/dist/stores/free-models-store.js.map +1 -0
- package/dist/stores/model-store.cjs +1 -1
- package/dist/stores/model-store.cjs.map +1 -1
- package/dist/stores/model-store.d.ts +7 -0
- package/dist/stores/model-store.js +4 -0
- package/dist/stores/model-store.js.map +1 -1
- package/dist/types/automation.cjs.map +1 -1
- package/dist/types/automation.d.ts +46 -1
- package/dist/types/automation.js.map +1 -1
- package/dist/ui/context-menu.d.ts +1 -1
- package/dist/ui/toggle-switch.cjs +1 -1
- package/dist/ui/toggle-switch.cjs.map +1 -1
- package/dist/ui/toggle-switch.d.ts +4 -1
- package/dist/ui/toggle-switch.js +4 -3
- package/dist/ui/toggle-switch.js.map +1 -1
- package/dist/utils/automation-catalog.cjs +1 -1
- package/dist/utils/automation-catalog.cjs.map +1 -1
- package/dist/utils/automation-catalog.d.ts +12 -1
- package/dist/utils/automation-catalog.js +42 -12
- package/dist/utils/automation-catalog.js.map +1 -1
- package/dist/utils/automation-run-display.cjs +2 -0
- package/dist/utils/automation-run-display.cjs.map +1 -0
- package/dist/utils/automation-run-display.d.ts +20 -0
- package/dist/utils/automation-run-display.js +85 -0
- package/dist/utils/automation-run-display.js.map +1 -0
- package/dist/utils/automation-schedule.cjs +1 -1
- package/dist/utils/automation-schedule.cjs.map +1 -1
- package/dist/utils/automation-schedule.d.ts +16 -0
- package/dist/utils/automation-schedule.js +2 -0
- package/dist/utils/automation-schedule.js.map +1 -1
- package/dist/utils/constants.cjs +1 -1
- package/dist/utils/constants.cjs.map +1 -1
- package/dist/utils/constants.d.ts +4 -0
- package/dist/utils/constants.js +23 -3
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/format-event-timestamp.cjs +2 -0
- package/dist/utils/format-event-timestamp.cjs.map +1 -0
- package/dist/utils/format-event-timestamp.d.ts +1 -0
- package/dist/utils/format-event-timestamp.js +13 -0
- package/dist/utils/format-event-timestamp.js.map +1 -0
- package/dist/utils/format-model-name.cjs +1 -1
- package/dist/utils/format-model-name.cjs.map +1 -1
- package/dist/utils/format-model-name.d.ts +27 -6
- package/dist/utils/format-model-name.js +14 -6
- package/dist/utils/format-model-name.js.map +1 -1
- package/dist/utils/git-diff-stats.cjs +2 -2
- package/dist/utils/git-diff-stats.cjs.map +1 -1
- package/dist/utils/git-diff-stats.d.ts +4 -0
- package/dist/utils/git-diff-stats.js +12 -2
- package/dist/utils/git-diff-stats.js.map +1 -1
- package/dist/utils/plan-file.cjs +4 -0
- package/dist/utils/plan-file.cjs.map +1 -0
- package/dist/utils/plan-file.d.ts +18 -0
- package/dist/utils/plan-file.js +58 -0
- package/dist/utils/plan-file.js.map +1 -0
- package/dist/utils/recommended-automation-rail.cjs +1 -1
- package/dist/utils/recommended-automation-rail.cjs.map +1 -1
- package/dist/utils/recommended-automation-rail.js +1 -0
- package/dist/utils/recommended-automation-rail.js.map +1 -1
- package/dist/utils/scroll-fade-state.cjs +1 -1
- package/dist/utils/scroll-fade-state.cjs.map +1 -1
- package/dist/utils/scroll-fade-state.d.ts +6 -0
- package/dist/utils/scroll-fade-state.js +8 -1
- package/dist/utils/scroll-fade-state.js.map +1 -1
- package/dist/utils/sdk-settings-schema.cjs +1 -1
- package/dist/utils/sdk-settings-schema.cjs.map +1 -1
- package/dist/utils/sdk-settings-schema.d.ts +1 -0
- package/dist/utils/sdk-settings-schema.js +25 -22
- package/dist/utils/sdk-settings-schema.js.map +1 -1
- package/dist/utils/utils.cjs +1 -1
- package/dist/utils/utils.cjs.map +1 -1
- package/dist/utils/utils.js +11 -11
- package/dist/utils/utils.js.map +1 -1
- package/package.json +4 -4
- package/scripts/check-sdk-version-sync.mjs +6 -6
- package/scripts/dev-safe.mjs +1 -1
- package/scripts/dev-with-automation.mjs +1 -1
- package/scripts/static-server.mjs +33 -1
- package/build/assets/active-backend-context-CrHTlgvN.js +0 -2
- package/build/assets/agent-profiles-settings-Dzgb7G9z.js +0 -1
- package/build/assets/agent-server-conversation-service.api-tnqNjbpE.js +0 -86
- package/build/assets/agent-settings-DLtsqaOs.js +0 -2
- package/build/assets/agent-settings-fFvR-XC2.js +0 -1
- package/build/assets/alert-banner-HP6mX-Vr.js +0 -1
- package/build/assets/api-key-entry-screen-qTzrmJcr.js +0 -1
- package/build/assets/app-settings-dbnneVaV.js +0 -1
- package/build/assets/automation-detail-BmwlCUAB.js +0 -3
- package/build/assets/automation-git-sync-CprN5DcU.js +0 -1
- package/build/assets/automation-setup-route-C40kXjMY.js +0 -1
- package/build/assets/automations-list-DuNcRawl.js +0 -1
- package/build/assets/backend-form-modal-lhGwzXFI.js +0 -1
- package/build/assets/backend-synced-settings-badge-DPkz30BE.js +0 -1
- package/build/assets/badge-BU3S0VtE.js +0 -1
- package/build/assets/bot-dMYHVfYM.js +0 -1
- package/build/assets/browser-DSAo0tz1.js +0 -46
- package/build/assets/browser-tab-C9vy56R5.js +0 -1
- package/build/assets/canvas-extension-page-dx1gFrfW.js +0 -1
- package/build/assets/canvas-extensions-8A-XhpgP.js +0 -1
- package/build/assets/check-CS0vmpQQ.js +0 -1
- package/build/assets/chevron-down-e1QBpjVy.js +0 -1
- package/build/assets/chevron-right-ZG4R5G4Q.js +0 -1
- package/build/assets/circle-check-DzWLNsbE.js +0 -1
- package/build/assets/circle-plus-check-toggle-BO_kFZt3.js +0 -1
- package/build/assets/command-menu--UIlGL72.js +0 -1
- package/build/assets/commits-tab-AnZwLvh-.js +0 -1
- package/build/assets/confirmation-modal-Dv1ktp8K.js +0 -1
- package/build/assets/conversation-BbGrAO4Z.js +0 -93
- package/build/assets/conversation-mYT6NAoj.js +0 -1
- package/build/assets/conversation-panel-mYT6NAoj.js +0 -1
- package/build/assets/conversation-state-store-B0ImPLHO.js +0 -1
- package/build/assets/conversation-store-Ca3ghXap.js +0 -6
- package/build/assets/copy-to-clipboard-button-Ca8iSkkA.js +0 -1
- package/build/assets/device-verify-Bhn2e_Ye.js +0 -1
- package/build/assets/edit-automation-modal-DadGbJ2u.js +0 -1
- package/build/assets/empty-state-BoGVDecT.js +0 -1
- package/build/assets/enum-filter-dropdown-Bgca129f.js +0 -1
- package/build/assets/environment-switch-overlay-BmBRT7gv.js +0 -1
- package/build/assets/error-state-Body8Ngd.js +0 -1
- package/build/assets/extensions-hub-CcDqq_vR.js +0 -1
- package/build/assets/extensions-navigation-Cr4yzYk4.js +0 -1
- package/build/assets/external-link-DKUlnCQV.js +0 -1
- package/build/assets/files-tab-D4o2VyE_.js +0 -1
- package/build/assets/format-model-name-CasAP3nd.js +0 -1
- package/build/assets/get-git-path-ChKDVHZp.js +0 -1
- package/build/assets/git-repo-dropdown-4ROKl2cB.js +0 -1
- package/build/assets/git-repo-dropdown-BkqzkMmM.js +0 -1
- package/build/assets/highlighted-source-view-BFRxGT_Q.js +0 -1
- package/build/assets/home-ChpSuepX.js +0 -1
- package/build/assets/home-DIsB440S.js +0 -1
- package/build/assets/home-automation-run-tooltip-BVNDWjAH.js +0 -1
- package/build/assets/home-store-CY9Ej0ux.js +0 -1
- package/build/assets/index-home-BdlrFIif.js +0 -1
- package/build/assets/info-B6RQawoW.js +0 -1
- package/build/assets/install-server-modal-Dpy89p4g.js +0 -1
- package/build/assets/kebab-menu-item-content-D8hSNGmm.js +0 -1
- package/build/assets/launch-IrTDEFCs.js +0 -1
- package/build/assets/list-filter-DsEK7NFC.js +0 -1
- package/build/assets/llm-not-configured-banner-CIFABh3K.js +0 -27
- package/build/assets/llm-settings-B9juXhIa.js +0 -1
- package/build/assets/llm-settings-De1d5dfr.js +0 -1
- package/build/assets/llm-subscription-service-BpJ0ouQo.js +0 -1
- package/build/assets/loader-circle-CC1au6hc.js +0 -1
- package/build/assets/manage-backends-modal-BrPV3oB-.js +0 -1
- package/build/assets/manifest-80fb1c29.js +0 -1
- package/build/assets/manifest-subpage-layout-CAOYzrYp.js +0 -1
- package/build/assets/markdown-renderer-BzTlxI8x.js +0 -8
- package/build/assets/mcp-BTs_SXfZ.js +0 -1
- package/build/assets/mcp-page-BEBYqH_K.js +0 -9
- package/build/assets/messages-DKV9cRc2.js +0 -41
- package/build/assets/modal-close-button-DDzdRvCs.js +0 -1
- package/build/assets/onboarding-DV_OXoeP.js +0 -1
- package/build/assets/onboarding-modal-rkyBYkeQ.js +0 -1
- package/build/assets/organization-service.api-DrYNkEN_.js +0 -1
- package/build/assets/pencil-47jAZH_V.js +0 -1
- package/build/assets/pin-By41Vl5J.js +0 -1
- package/build/assets/planner-tab-C9uZmhme.js +0 -1
- package/build/assets/plug-CG5HFcNG.js +0 -1
- package/build/assets/plugins-management-service-BMJgC3Ga.js +0 -1
- package/build/assets/plus-C7Slq-0I.js +0 -1
- package/build/assets/profiles-service.api-ChoKrL0l.js +0 -1
- package/build/assets/providers-BhMcY5nv.js +0 -1
- package/build/assets/proxy-9Fe1v5na.js +0 -1
- package/build/assets/recommended-automations-launcher-6ABrI9Cy.js +0 -1
- package/build/assets/refresh-cw-3q3Frrii.js +0 -1
- package/build/assets/root-Dc8YmC9F.js +0 -2
- package/build/assets/root-VDaypvK4.css +0 -1
- package/build/assets/root-layout-CXkhSPYh.js +0 -2
- package/build/assets/schema-field-D-y9-LDb.js +0 -1
- package/build/assets/scroll-fade-state-Dw-i4SGq.js +0 -1
- package/build/assets/sdk-section-page-BlFiizlG.js +0 -1
- package/build/assets/secret-form-BB7the8W.js +0 -1
- package/build/assets/secrets-service-ByZVENbp.js +0 -1
- package/build/assets/secrets-settings-B_GpxKW2.js +0 -1
- package/build/assets/settings-C0EWuBtA.js +0 -1
- package/build/assets/settings-dropdown-input-BcwylHs2.js +0 -1
- package/build/assets/settings-index-5w5UW2K3.js +0 -1
- package/build/assets/settings-input-Db-1g8Ql.js +0 -1
- package/build/assets/settings-modal-DfJ3tcJQ.js +0 -1
- package/build/assets/settings-service.api-DJ1r62Zr.js +0 -1
- package/build/assets/settings-switch-CS-dJDmA.js +0 -1
- package/build/assets/shared-conversation-CA5ISEDy.js +0 -1
- package/build/assets/shield-check-D2aCRd16.js +0 -1
- package/build/assets/sidebar-mobile-menu-toggle-C_fb0Jki.js +0 -1
- package/build/assets/sidebar-store-DGqHkVLw.js +0 -1
- package/build/assets/skill-card-pill-row-B27-xyig.js +0 -1
- package/build/assets/skill-scope-B42H-XOc.js +0 -1
- package/build/assets/skills-plugins-tgF8EiXC.js +0 -1
- package/build/assets/skills-settings-BgJ9PaOe.js +0 -1
- package/build/assets/styled-tooltip-C4jf5Fv9.js +0 -1
- package/build/assets/task-list-tab-C5zcaktH.js +0 -1
- package/build/assets/toggle-switch-ChOLXv2n.js +0 -1
- package/build/assets/trash-2-D7K26eDO.js +0 -1
- package/build/assets/trash-D-HYiVYM.js +0 -1
- package/build/assets/triangle-alert-CtdXWHUI.js +0 -1
- package/build/assets/usage-tab-CVDffLPt.js +0 -1
- package/build/assets/use-acp-credential-form-XIQmpX6M.js +0 -1
- package/build/assets/use-activate-agent-profile-BLfmvDiG.js +0 -1
- package/build/assets/use-agent-profiles-Bd9Bvvp1.js +0 -1
- package/build/assets/use-canvas-extensions-Bi693ujJ.js +0 -1
- package/build/assets/use-config-A9QovgXO.js +0 -1
- package/build/assets/use-create-conversation-Dx3l7mFZ.js +0 -1
- package/build/assets/use-create-secret-B9cUFWRG.js +0 -1
- package/build/assets/use-has-permission-B3C8rQmR.js +0 -1
- package/build/assets/use-is-authed-nTBcM7dE.js +0 -1
- package/build/assets/use-llm-configured-BV9nZ1_j.js +0 -1
- package/build/assets/use-llm-profiles-BO-P4Oyo.js +0 -1
- package/build/assets/use-manifest-capabilities-Cw_flwEz.js +0 -1
- package/build/assets/use-onboarding-completion-D8U7k4Qb.js +0 -1
- package/build/assets/use-pinned-home-route-CckOZrmb.js +0 -1
- package/build/assets/use-plugins-marketplace-7i94Zu3Z.js +0 -1
- package/build/assets/use-save-agent-profile-BUjSsDXK.js +0 -1
- package/build/assets/use-settings-DSXLbvBl.js +0 -1
- package/build/assets/use-settings-nav-items-CwRw-CmX.js +0 -16
- package/build/assets/use-tracking-D53y3TH9.js +0 -3
- package/build/assets/useQueries-DlbhlH9I.js +0 -1
- package/build/assets/useQuery-BSTgq1rl.js +0 -1
- package/build/assets/utils-CN5ZfZy1.js +0 -1
- package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~czjee3a3-DqZDXfg2.js +0 -186
- package/build/assets/vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-rfV8mQ9m.js +0 -1
- package/build/assets/vendor~root-layout-C9Ju9DQg.js +0 -1
- package/build/assets/vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-BWir3rJs.js +0 -1
- package/build/assets/vendor~root-layout~index-home~home~conversation-panel~conversation~mcp~automations-list~aut~ibfbmr9f-cDuKr-WD.js +0 -1
- package/build/assets/vendor~root~root-layout~index-home~home~conversation-panel~conversation~launch~extensions-h~iyia17eu-Chf7vmKB.js +0 -1
- package/build/assets/x-DJdhbdmt.js +0 -1
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs +0 -2
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.cjs.map +0 -1
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.d.ts +0 -35
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js +0 -247
- package/dist/components/features/conversation-panel/conversation-panel-filter-menu.js.map +0 -1
- package/dist/hooks/query/use-skills.cjs +0 -2
- package/dist/hooks/query/use-skills.cjs.map +0 -1
- package/dist/hooks/query/use-skills.d.ts +0 -7
- package/dist/hooks/query/use-skills.js +0 -13
- package/dist/hooks/query/use-skills.js.map +0 -1
- package/dist/hooks/use-has-permission.cjs +0 -2
- package/dist/hooks/use-has-permission.cjs.map +0 -1
- package/dist/hooks/use-has-permission.d.ts +0 -1
- package/dist/hooks/use-has-permission.js +0 -8
- package/dist/hooks/use-has-permission.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/eye.cjs +0 -2
- package/dist/node_modules/lucide-react/dist/esm/icons/eye.cjs.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/eye.js +0 -14
- package/dist/node_modules/lucide-react/dist/esm/icons/eye.js.map +0 -1
package/dist/components/features/conversation-panel/conversation-card/conversation-tag-display.d.ts
CHANGED
|
@@ -36,7 +36,8 @@ export declare function humanizeConversationTagKey(key: string): string;
|
|
|
36
36
|
* Known keys use the preview copy; everything else is humanized.
|
|
37
37
|
*/
|
|
38
38
|
export declare function getConversationTagLabel(key: string, t: (key: I18nKey) => string): string;
|
|
39
|
-
/** ``Branch: main`` — used by chip ``title`` tooltips.
|
|
39
|
+
/** ``Branch: main`` — used by chip ``title`` tooltips. Bare tags (empty
|
|
40
|
+
* value) show the label alone, no dangling colon. */
|
|
40
41
|
export declare function formatConversationTagTooltip(key: string, value: string, t: (key: I18nKey) => string): string;
|
|
41
42
|
/**
|
|
42
43
|
* Hard-truncate a tag value for the chip label. The full ``key: value`` string
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-tag-display.js","names":[],"sources":["../../../../../src/components/features/conversation-panel/conversation-card/conversation-tag-display.ts"],"sourcesContent":["/**\n * Display helpers for conversation tag chips. Pure (no React) so fit/truncate\n * behavior can be unit-tested without laying out the sidebar card.\n */\n\nimport { I18nKey } from \"#/i18n/declaration\";\n\n/** Max characters shown on a chip before hard truncation with an ellipsis. */\nexport const TAG_CHIP_VALUE_MAX_LENGTH = 14;\n\n/** Horizontal gap between chips (matches Tailwind ``gap-1`` = 4px). */\nexport const TAG_CHIP_GAP_PX = 4;\n\n/**\n * Reserved width for the ``+N`` overflow control when deciding how many chips\n * fit on one row. Slightly generous so the button never wraps under a chip.\n */\nexport const TAG_CHIP_OVERFLOW_WIDTH_PX = 36;\n\n/** Known tag keys that already have a dedicated hovercard label. */\nexport type ConversationTagLabelKind =\n | \"git\"\n | \"repo\"\n | \"branch\"\n | \"workspace\"\n | \"app_mode\"\n | \"work_tools\"\n | \"work_wsid\"\n | \"other\";\n\n/**\n * Map a server tag key to a hovercard label kind. ``archiveworkspacepath`` is\n * treated as \"workspace\" — the sandbox working directory for the conversation.\n * ACM / Work stamps (``Appmode``, ``Worktools``, ``Workwsid``) get dedicated\n * kinds so chips and hovercards show friendly labels instead of the wire key.\n *\n * ``origin`` / ``source`` deliberately stay \"other\" (humanized to \"Origin\" /\n * \"Source\"): they name where a conversation came from — Slack, an API call, an\n * automation — which is not a git fact. Only ``git_provider`` is \"Git\".\n */\nexport function getConversationTagLabelKind(\n key: string,\n): ConversationTagLabelKind {\n switch (key.trim().toLowerCase()) {\n case \"git_provider\":\n return \"git\";\n case \"repo_name\":\n case \"repo\":\n case \"repository\":\n return \"repo\";\n case \"selected_branch\":\n case \"branch\":\n return \"branch\";\n case \"archiveworkspacepath\":\n case \"workspace\":\n case \"working_dir\":\n return \"workspace\";\n case \"appmode\":\n case \"app_mode\":\n case \"mode\":\n return \"app_mode\";\n case \"worktools\":\n case \"work_tools\":\n case \"tools\":\n return \"work_tools\";\n case \"workwsid\":\n case \"work_wsid\":\n case \"wsid\":\n case \"workspace_id\":\n return \"work_wsid\";\n default:\n return \"other\";\n }\n}\n\n/**\n * Soften unknown snake_case / kebab-case keys for tooltips and overflow rows\n * (``selected_branch`` is mapped above; this covers free-form keys like\n * ``env`` → ``Env``).\n */\nexport function humanizeConversationTagKey(key: string): string {\n const trimmed = key.trim();\n if (!trimmed) {\n return trimmed;\n }\n const words = trimmed.replace(/[_-]+/g, \" \").replace(/\\s+/g, \" \");\n return words.charAt(0).toUpperCase() + words.slice(1);\n}\n\n/**\n * Localized label for a tag key (chip tooltip, overflow popover, hovercard).\n * Known keys use the preview copy; everything else is humanized.\n */\nexport function getConversationTagLabel(\n key: string,\n t: (key: I18nKey) => string,\n): string {\n switch (getConversationTagLabelKind(key)) {\n case \"git\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_GIT);\n case \"repo\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_REPO);\n case \"branch\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_BRANCH);\n case \"workspace\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_WORKSPACE);\n case \"app_mode\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_APP_MODE);\n case \"work_tools\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_WORK_TOOLS);\n case \"work_wsid\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_WORK_WSID);\n default:\n return humanizeConversationTagKey(key);\n }\n}\n\n/** ``Branch: main`` — used by chip ``title`` tooltips. */\nexport function formatConversationTagTooltip(\n key: string,\n value: string,\n t: (key: I18nKey) => string,\n): string {\n
|
|
1
|
+
{"version":3,"file":"conversation-tag-display.js","names":[],"sources":["../../../../../src/components/features/conversation-panel/conversation-card/conversation-tag-display.ts"],"sourcesContent":["/**\n * Display helpers for conversation tag chips. Pure (no React) so fit/truncate\n * behavior can be unit-tested without laying out the sidebar card.\n */\n\nimport { I18nKey } from \"#/i18n/declaration\";\n\n/** Max characters shown on a chip before hard truncation with an ellipsis. */\nexport const TAG_CHIP_VALUE_MAX_LENGTH = 14;\n\n/** Horizontal gap between chips (matches Tailwind ``gap-1`` = 4px). */\nexport const TAG_CHIP_GAP_PX = 4;\n\n/**\n * Reserved width for the ``+N`` overflow control when deciding how many chips\n * fit on one row. Slightly generous so the button never wraps under a chip.\n */\nexport const TAG_CHIP_OVERFLOW_WIDTH_PX = 36;\n\n/** Known tag keys that already have a dedicated hovercard label. */\nexport type ConversationTagLabelKind =\n | \"git\"\n | \"repo\"\n | \"branch\"\n | \"workspace\"\n | \"app_mode\"\n | \"work_tools\"\n | \"work_wsid\"\n | \"other\";\n\n/**\n * Map a server tag key to a hovercard label kind. ``archiveworkspacepath`` is\n * treated as \"workspace\" — the sandbox working directory for the conversation.\n * ACM / Work stamps (``Appmode``, ``Worktools``, ``Workwsid``) get dedicated\n * kinds so chips and hovercards show friendly labels instead of the wire key.\n *\n * ``origin`` / ``source`` deliberately stay \"other\" (humanized to \"Origin\" /\n * \"Source\"): they name where a conversation came from — Slack, an API call, an\n * automation — which is not a git fact. Only ``git_provider`` is \"Git\".\n */\nexport function getConversationTagLabelKind(\n key: string,\n): ConversationTagLabelKind {\n switch (key.trim().toLowerCase()) {\n case \"git_provider\":\n return \"git\";\n case \"repo_name\":\n case \"repo\":\n case \"repository\":\n return \"repo\";\n case \"selected_branch\":\n case \"branch\":\n return \"branch\";\n case \"archiveworkspacepath\":\n case \"workspace\":\n case \"working_dir\":\n return \"workspace\";\n case \"appmode\":\n case \"app_mode\":\n case \"mode\":\n return \"app_mode\";\n case \"worktools\":\n case \"work_tools\":\n case \"tools\":\n return \"work_tools\";\n case \"workwsid\":\n case \"work_wsid\":\n case \"wsid\":\n case \"workspace_id\":\n return \"work_wsid\";\n default:\n return \"other\";\n }\n}\n\n/**\n * Soften unknown snake_case / kebab-case keys for tooltips and overflow rows\n * (``selected_branch`` is mapped above; this covers free-form keys like\n * ``env`` → ``Env``).\n */\nexport function humanizeConversationTagKey(key: string): string {\n const trimmed = key.trim();\n if (!trimmed) {\n return trimmed;\n }\n const words = trimmed.replace(/[_-]+/g, \" \").replace(/\\s+/g, \" \");\n return words.charAt(0).toUpperCase() + words.slice(1);\n}\n\n/**\n * Localized label for a tag key (chip tooltip, overflow popover, hovercard).\n * Known keys use the preview copy; everything else is humanized.\n */\nexport function getConversationTagLabel(\n key: string,\n t: (key: I18nKey) => string,\n): string {\n switch (getConversationTagLabelKind(key)) {\n case \"git\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_GIT);\n case \"repo\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_REPO);\n case \"branch\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_BRANCH);\n case \"workspace\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_WORKSPACE);\n case \"app_mode\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_APP_MODE);\n case \"work_tools\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_WORK_TOOLS);\n case \"work_wsid\":\n return t(I18nKey.CONVERSATION_PANEL$PREVIEW_WORK_WSID);\n default:\n return humanizeConversationTagKey(key);\n }\n}\n\n/** ``Branch: main`` — used by chip ``title`` tooltips. Bare tags (empty\n * value) show the label alone, no dangling colon. */\nexport function formatConversationTagTooltip(\n key: string,\n value: string,\n t: (key: I18nKey) => string,\n): string {\n const label = getConversationTagLabel(key, t);\n return value ? `${label}: ${value}` : label;\n}\n\n/**\n * Hard-truncate a tag value for the chip label. The full ``key: value`` string\n * stays available via tooltip / overflow popover.\n *\n * Measures and slices by code point rather than UTF-16 code unit: values\n * stamped by Slack / Discord automations carry emoji, and cutting between the\n * halves of a surrogate pair leaves a lone surrogate that browsers draw as a\n * replacement glyph.\n */\nexport function truncateTagChipValue(\n value: string,\n maxLength: number = TAG_CHIP_VALUE_MAX_LENGTH,\n): string {\n const characters = Array.from(value);\n if (characters.length <= maxLength) {\n return value;\n }\n if (maxLength <= 1) {\n return \"…\";\n }\n return `${characters.slice(0, maxLength - 1).join(\"\")}…`;\n}\n\n/**\n * How many chips fit in ``containerWidth`` while keeping a single nowrap row\n * and reserving space for a ``+N`` overflow control when any chips would hide.\n *\n * Returns ``widths.length`` when ``containerWidth <= 0`` (not laid out yet /\n * jsdom) so callers can show every chip until a real measurement arrives.\n * Returns ``0`` when the row is too narrow for even one chip + overflow — the\n * UI then shows only the ``+N`` control with the full list in the popover.\n */\nexport function computeVisibleTagChipCount(\n widths: number[],\n containerWidth: number,\n options: {\n gapPx?: number;\n overflowWidthPx?: number;\n } = {},\n): number {\n const gapPx = options.gapPx ?? TAG_CHIP_GAP_PX;\n const overflowWidthPx = options.overflowWidthPx ?? TAG_CHIP_OVERFLOW_WIDTH_PX;\n\n if (widths.length === 0) {\n return 0;\n }\n if (containerWidth <= 0) {\n return widths.length;\n }\n\n let used = 0;\n for (let i = 0; i < widths.length; i += 1) {\n const width = widths[i]!;\n const gap = i > 0 ? gapPx : 0;\n const remaining = widths.length - i - 1;\n const reserve = remaining > 0 ? overflowWidthPx + gapPx : 0;\n if (used + gap + width + reserve > containerWidth) {\n return i;\n }\n used += gap + width;\n }\n return widths.length;\n}\n"],"mappings":";AAwCA,SAAgB,EACd,GAC0B;CAC1B,QAAQ,EAAI,KAAK,EAAE,YAAY,GAA/B;EACE,KAAK,gBACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK,cACH,OAAO;EACT,KAAK;EACL,KAAK,UACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK,eACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK,QACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK,SACH,OAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,gBACH,OAAO;EACT,SACE,OAAO;CACX;AACF;AAOA,SAAgB,EAA2B,GAAqB;CAC9D,IAAM,IAAU,EAAI,KAAK;CACzB,IAAI,CAAC,GACH,OAAO;CAET,IAAM,IAAQ,EAAQ,QAAQ,UAAU,GAAG,EAAE,QAAQ,QAAQ,GAAG;CAChE,OAAO,EAAM,OAAO,CAAC,EAAE,YAAY,IAAI,EAAM,MAAM,CAAC;AACtD;AAMA,SAAgB,EACd,GACA,GACQ;CACR,QAAQ,EAA4B,CAAG,GAAvC;EACE,KAAK,OACH,OAAO,EAAE,EAAQ,8BAA8B;EACjD,KAAK,QACH,OAAO,EAAE,EAAQ,+BAA+B;EAClD,KAAK,UACH,OAAO,EAAE,EAAQ,iCAAiC;EACpD,KAAK,aACH,OAAO,EAAE,EAAQ,oCAAoC;EACvD,KAAK,YACH,OAAO,EAAE,EAAQ,mCAAmC;EACtD,KAAK,cACH,OAAO,EAAE,EAAQ,qCAAqC;EACxD,KAAK,aACH,OAAO,EAAE,EAAQ,oCAAoC;EACvD,SACE,OAAO,EAA2B,CAAG;CACzC;AACF;AAIA,SAAgB,EACd,GACA,GACA,GACQ;CACR,IAAM,IAAQ,EAAwB,GAAK,CAAC;CAC5C,OAAO,IAAQ,GAAG,EAAM,IAAI,MAAU;AACxC;AAWA,SAAgB,EACd,GACA,IAAA,IACQ;CACR,IAAM,IAAa,MAAM,KAAK,CAAK;CAOnC,OANI,EAAW,UAAU,IAChB,IAEL,KAAa,IACR,MAEF,GAAG,EAAW,MAAM,GAAG,IAAY,CAAC,EAAE,KAAK,EAAE,EAAE;AACxD;AAWA,SAAgB,EACd,GACA,GACA,IAGI,CAAC,GACG;CACR,IAAM,IAAQ,EAAQ,SAAA,GAChB,IAAkB,EAAQ,mBAAA;CAEhC,IAAI,EAAO,WAAW,GACpB,OAAO;CAET,IAAI,KAAkB,GACpB,OAAO,EAAO;CAGhB,IAAI,IAAO;CACX,KAAK,IAAI,IAAI,GAAG,IAAI,EAAO,QAAQ,KAAK,GAAG;EACzC,IAAM,IAAQ,EAAO,IACf,IAAM,IAAI,IAAI,IAAQ,GAEtB,IADY,EAAO,SAAS,IAAI,IACV,IAAI,IAAkB,IAAQ;EAC1D,IAAI,IAAO,IAAM,IAAQ,IAAU,GACjC,OAAO;EAET,KAAQ,IAAM;CAChB;CACA,OAAO,EAAO;AAChB"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("../../../_virtual/_rolldown/runtime.cjs"),t=require("../../../node_modules/react-i18next/dist/es/useTranslation.cjs"),n=require("../../../i18n/declaration.cjs"),r=require("../../../node_modules/lucide-react/dist/esm/icons/clock-3.cjs"),i=require("../../../node_modules/lucide-react/dist/esm/icons/folder.cjs"),a=require("../../../node_modules/lucide-react/dist/esm/icons/list-filter.cjs"),o=require("../../../node_modules/lucide-react/dist/esm/icons/shrink.cjs"),s=require("../../../node_modules/lucide-react/dist/esm/icons/sliders-horizontal.cjs"),c=require("../../../node_modules/lucide-react/dist/esm/icons/star.cjs"),l=require("../../../node_modules/lucide-react/dist/esm/icons/tag.cjs"),u=require("../../../node_modules/lucide-react/dist/esm/icons/trash-2.cjs"),d=require("../../../utils/utils.cjs"),f=require("../../../utils/dropdown-classes.cjs"),p=require("./conversation-panel-list-helpers.cjs"),m=require("../../../stores/conversation-panel-preferences-store.cjs"),h=require("./menu-heading.cjs"),g=require("./menu-separator.cjs"),_=require("./menu-row.cjs"),v=require("./advanced-conversation-options-modal.cjs");let y=require("react");y=e.__toESM(y,1);let b=require("react/jsx-runtime");var x=[{id:`by-workspace`,icon:i.Folder,settings:{...m.DEFAULT_LAYOUT_SETTINGS,organizeMode:`grouped`}},{id:`recent-activity`,icon:r.Clock3,labelKey:n.I18nKey.CONVERSATION_PANEL$LAYOUT_RECENT_ACTIVITY,settings:{...m.DEFAULT_LAYOUT_SETTINGS,showOlderConversations:!1}},{id:`focused`,icon:c.Star,labelKey:n.I18nKey.CONVERSATION_PANEL$LAYOUT_FOCUSED,settings:{...m.DEFAULT_LAYOUT_SETTINGS,threadScope:`relevant`,showOlderConversations:!1}},{id:`minimal`,icon:o.Shrink,labelKey:n.I18nKey.CONVERSATION_PANEL$LAYOUT_MINIMAL,settings:{...m.DEFAULT_LAYOUT_SETTINGS,threadScope:`relevant`,showOlderConversations:!1,showRepoBranchMetadata:!1,showLlmProfiles:!1,showTagsMetadata:!1,showHoverMetadata:!1}}];function S(e){return x.find(t=>Object.entries(t.settings).every(([t,n])=>e[t]===n))??null}function C({menuOpen:e,setMenuOpen:r,menuRef:i,backendKind:o,tagFacets:c,automationNameFacets:C,totalConversationsCount:T,onRequestDeleteAll:E}){let{t:D}=t.useTranslation(`openhands`),O=m.useConversationPanelPreferencesStore(),[k,A]=y.default.useState(!1),[j,M]=y.default.useState(!1),N=D(o===`local`?n.I18nKey.CONVERSATION_PANEL$BY_WORKSPACE:n.I18nKey.CONVERSATION_PANEL$BY_REPOSITORY),P=S(O),F=y.default.useRef(null),I=y.default.useRef(null),L=y.default.useRef(e);return y.default.useEffect(()=>{e?(I.current?.querySelector(`[role="menuitem"], [role="menuitemradio"], [role="menuitemcheckbox"]`))?.focus():L.current&&F.current?.focus(),L.current=e},[e]),(0,b.jsxs)(`div`,{ref:i,className:`relative shrink-0 pr-0.5`,children:[(0,b.jsx)(`button`,{ref:F,type:`button`,"data-testid":`conversation-layouts-toggle`,"aria-label":D(n.I18nKey.CONVERSATION_PANEL$LAYOUTS_HEADING),"aria-haspopup":`menu`,"aria-expanded":e,onClick:()=>r(!e),className:d.cn(`relative inline-flex h-7 w-7 items-center justify-center rounded-md text-[var(--oh-muted)] hover:text-white hover:bg-[var(--oh-surface-raised)]`,f.dropdownInstantColorClassName),children:(0,b.jsx)(a.ListFilter,{className:`shrink-0`,size:14,strokeWidth:2,"aria-hidden":!0})}),e?(0,b.jsxs)(`div`,{ref:I,role:`menu`,"aria-orientation":`vertical`,"aria-label":D(n.I18nKey.CONVERSATION_PANEL$LAYOUTS_HEADING),tabIndex:-1,"data-testid":`conversation-layouts-menu`,onKeyDown:e=>{if(e.key===`Escape`){e.preventDefault(),r(!1);return}if(e.key!==`ArrowDown`&&e.key!==`ArrowUp`)return;let t=I.current;if(!t)return;let n=Array.from(t.querySelectorAll(`[role="menuitem"], [role="menuitemradio"], [role="menuitemcheckbox"]`)).filter(e=>!e.disabled);if(n.length===0)return;let i=n.indexOf(document.activeElement),a=e.key===`ArrowDown`?1:-1,o=((i===-1?0:i)+a+n.length)%n.length;e.preventDefault(),n[o]?.focus()},className:d.cn(`absolute right-0 top-full z-50 mt-0 w-64 rounded-md border border-[var(--oh-border-subtle)] bg-tertiary px-1 py-1 text-[var(--oh-foreground)] shadow-lg`,f.dropdownMenuListClassName,f.dropdownMenuViewportScrollClassName),children:[(0,b.jsx)(h.MenuHeading,{children:D(n.I18nKey.CONVERSATION_PANEL$LAYOUTS_HEADING)}),x.map(e=>(0,b.jsx)(_.MenuRow,{icon:e.icon,label:e.labelKey?D(e.labelKey):N,selected:P?.id===e.id,testId:`layout-preset-${e.id}`,onClick:()=>{O.applyLayoutSettings(e.settings),r(!1)}},e.id)),(0,b.jsx)(g.MenuSeparator,{}),(0,b.jsx)(_.MenuRow,{icon:l.Tag,label:D(n.I18nKey.CONVERSATION_PANEL$TAG_FILTERS),testId:`tag-filters-section`,onClick:()=>A(!k)}),k?c.length>0?c.map(e=>(0,b.jsx)(_.MenuRow,{icon:l.Tag,label:p.formatTagFacetLabel(e),selected:O.selectedTagFacets.includes(e),testId:`tag-facet-row-${e}`,onClick:()=>O.toggleTagFacet(e)},e)):(0,b.jsx)(`p`,{"data-testid":`tag-filters-empty`,className:`px-2 py-1 text-[11px] text-[var(--oh-muted)]/70`,children:D(n.I18nKey.CONVERSATION_PANEL$NO_VISIBLE_TAGS)}):null,(0,b.jsx)(g.MenuSeparator,{}),(0,b.jsx)(_.MenuRow,{icon:s.SlidersHorizontal,label:P?D(n.I18nKey.CONVERSATION_PANEL$ADVANCED_OPTIONS):`${D(n.I18nKey.CONVERSATION_PANEL$ADVANCED_OPTIONS)} · ${D(n.I18nKey.CONVERSATION_PANEL$ADVANCED_OPTIONS_CUSTOM)}`,testId:`advanced-options-row`,onClick:()=>{r(!1),M(!0)}}),(0,b.jsx)(g.MenuSeparator,{}),(0,b.jsx)(_.MenuRow,{testId:`delete-all-conversations`,icon:u.Trash2,label:w(D(n.I18nKey.CONVERSATION$DELETE_ALL)),disabled:T===0,destructive:!0,onClick:()=>{T!==0&&(E(),r(!1))}})]}):null,(0,b.jsx)(v.AdvancedConversationOptionsModal,{open:j,onClose:()=>M(!1),backendKind:o,automationNameFacets:C})]})}var w=e=>e.length>0?e.charAt(0).toUpperCase()+e.slice(1):e;exports.ConversationLayoutsMenu=C;
|
|
2
|
+
//# sourceMappingURL=conversation-layouts-menu.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-layouts-menu.cjs","names":[],"sources":["../../../../src/components/features/conversation-panel/conversation-layouts-menu.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport {\n Clock3,\n Folder,\n ListFilter,\n Shrink,\n SlidersHorizontal,\n Star,\n Tag,\n Trash2,\n} from \"lucide-react\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport type { BackendKind } from \"#/api/backend-registry/types\";\nimport { cn } from \"#/utils/utils\";\nimport {\n dropdownInstantColorClassName,\n dropdownMenuListClassName,\n dropdownMenuViewportScrollClassName,\n} from \"#/utils/dropdown-classes\";\nimport {\n DEFAULT_LAYOUT_SETTINGS,\n useConversationPanelPreferencesStore,\n type LayoutSettingsSlice,\n} from \"#/stores/conversation-panel-preferences-store\";\nimport { formatTagFacetLabel } from \"./conversation-panel-list-helpers\";\nimport { MenuHeading } from \"./menu-heading\";\nimport { MenuSeparator } from \"./menu-separator\";\nimport { MenuRow } from \"./menu-row\";\nimport { AdvancedConversationOptionsModal } from \"./advanced-conversation-options-modal\";\n\ninterface LayoutPreset {\n id: string;\n icon: React.ComponentType<{ className?: string; \"aria-hidden\"?: boolean }>;\n /** Omitted for the backend-dependent first preset (workspace vs repo). */\n labelKey?: I18nKey;\n settings: LayoutSettingsSlice;\n}\n\n/**\n * Layout presets are complete preference bundles (design inference from the\n * 2026-08-14 PM walkthrough video; the video names the presets but not their\n * exact bundles). Applying one replaces every layout-controlled field so a\n * previous preset cannot leak into the next one. Any manual deviation reads\n * as \"Custom\".\n */\nconst LAYOUT_PRESETS: LayoutPreset[] = [\n {\n id: \"by-workspace\",\n icon: Folder,\n settings: {\n ...DEFAULT_LAYOUT_SETTINGS,\n organizeMode: \"grouped\",\n },\n },\n {\n id: \"recent-activity\",\n icon: Clock3,\n labelKey: I18nKey.CONVERSATION_PANEL$LAYOUT_RECENT_ACTIVITY,\n settings: {\n ...DEFAULT_LAYOUT_SETTINGS,\n showOlderConversations: false,\n },\n },\n {\n id: \"focused\",\n icon: Star,\n labelKey: I18nKey.CONVERSATION_PANEL$LAYOUT_FOCUSED,\n settings: {\n ...DEFAULT_LAYOUT_SETTINGS,\n threadScope: \"relevant\",\n showOlderConversations: false,\n },\n },\n {\n id: \"minimal\",\n icon: Shrink,\n labelKey: I18nKey.CONVERSATION_PANEL$LAYOUT_MINIMAL,\n settings: {\n ...DEFAULT_LAYOUT_SETTINGS,\n threadScope: \"relevant\",\n showOlderConversations: false,\n showRepoBranchMetadata: false,\n showLlmProfiles: false,\n showTagsMetadata: false,\n showHoverMetadata: false,\n },\n },\n];\n\nexport function getActiveLayoutPreset(\n settings: LayoutSettingsSlice,\n): LayoutPreset | null {\n return (\n LAYOUT_PRESETS.find((preset) =>\n Object.entries(preset.settings).every(\n ([key, value]) => settings[key as keyof LayoutSettingsSlice] === value,\n ),\n ) ?? null\n );\n}\n\nexport interface ConversationLayoutsMenuProps {\n menuOpen: boolean;\n setMenuOpen: (open: boolean) => void;\n menuRef: React.RefObject<HTMLDivElement | null>;\n backendKind: BackendKind;\n /** Distinct user-facing `key=value` facets among the loaded conversations. */\n tagFacets: readonly string[];\n /** Distinct automation names; the advanced modal owns their facet rows. */\n automationNameFacets: readonly string[];\n totalConversationsCount: number;\n onRequestDeleteAll: () => void;\n}\n\nexport function ConversationLayoutsMenu({\n menuOpen,\n setMenuOpen,\n menuRef,\n backendKind,\n tagFacets,\n automationNameFacets,\n totalConversationsCount,\n onRequestDeleteAll,\n}: ConversationLayoutsMenuProps) {\n const { t } = useTranslation(\"openhands\");\n const preferences = useConversationPanelPreferencesStore();\n const [tagSectionExpanded, setTagSectionExpanded] = React.useState(false);\n const [advancedOpen, setAdvancedOpen] = React.useState(false);\n\n const groupedLabel =\n backendKind === \"local\"\n ? t(I18nKey.CONVERSATION_PANEL$BY_WORKSPACE)\n : t(I18nKey.CONVERSATION_PANEL$BY_REPOSITORY);\n\n const activePreset = getActiveLayoutPreset(preferences);\n\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n const menuContentRef = React.useRef<HTMLDivElement>(null);\n\n // Mirror the filter menu's focus management: focus into the menu on open,\n // return focus to the trigger on close.\n const wasOpenRef = React.useRef(menuOpen);\n React.useEffect(() => {\n if (menuOpen) {\n const firstItem =\n menuContentRef.current?.querySelector<HTMLButtonElement>(\n '[role=\"menuitem\"], [role=\"menuitemradio\"], [role=\"menuitemcheckbox\"]',\n );\n firstItem?.focus();\n } else if (wasOpenRef.current) {\n triggerRef.current?.focus();\n }\n wasOpenRef.current = menuOpen;\n }, [menuOpen]);\n\n const handleMenuKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n setMenuOpen(false);\n return;\n }\n if (event.key !== \"ArrowDown\" && event.key !== \"ArrowUp\") return;\n const container = menuContentRef.current;\n if (!container) return;\n const items = Array.from(\n container.querySelectorAll<HTMLButtonElement>(\n '[role=\"menuitem\"], [role=\"menuitemradio\"], [role=\"menuitemcheckbox\"]',\n ),\n ).filter((el) => !el.disabled);\n if (items.length === 0) return;\n const currentIdx = items.indexOf(\n document.activeElement as HTMLButtonElement,\n );\n const delta = event.key === \"ArrowDown\" ? 1 : -1;\n const start = currentIdx === -1 ? 0 : currentIdx;\n const nextIdx = (start + delta + items.length) % items.length;\n event.preventDefault();\n items[nextIdx]?.focus();\n };\n\n return (\n <div ref={menuRef} className=\"relative shrink-0 pr-0.5\">\n <button\n ref={triggerRef}\n type=\"button\"\n data-testid=\"conversation-layouts-toggle\"\n aria-label={t(I18nKey.CONVERSATION_PANEL$LAYOUTS_HEADING)}\n aria-haspopup=\"menu\"\n aria-expanded={menuOpen}\n onClick={() => setMenuOpen(!menuOpen)}\n className={cn(\n \"relative inline-flex h-7 w-7 items-center justify-center rounded-md text-[var(--oh-muted)] hover:text-white hover:bg-[var(--oh-surface-raised)]\",\n dropdownInstantColorClassName,\n )}\n >\n <ListFilter\n className=\"shrink-0\"\n size={14}\n strokeWidth={2}\n aria-hidden\n />\n </button>\n\n {menuOpen ? (\n <div\n ref={menuContentRef}\n role=\"menu\"\n aria-orientation=\"vertical\"\n aria-label={t(I18nKey.CONVERSATION_PANEL$LAYOUTS_HEADING)}\n tabIndex={-1}\n data-testid=\"conversation-layouts-menu\"\n onKeyDown={handleMenuKeyDown}\n className={cn(\n \"absolute right-0 top-full z-50 mt-0 w-64 rounded-md border border-[var(--oh-border-subtle)] bg-tertiary px-1 py-1 text-[var(--oh-foreground)] shadow-lg\",\n dropdownMenuListClassName,\n dropdownMenuViewportScrollClassName,\n )}\n >\n <MenuHeading>\n {t(I18nKey.CONVERSATION_PANEL$LAYOUTS_HEADING)}\n </MenuHeading>\n {LAYOUT_PRESETS.map((preset) => (\n <MenuRow\n key={preset.id}\n icon={preset.icon}\n label={preset.labelKey ? t(preset.labelKey) : groupedLabel}\n selected={activePreset?.id === preset.id}\n testId={`layout-preset-${preset.id}`}\n onClick={() => {\n preferences.applyLayoutSettings(preset.settings);\n setMenuOpen(false);\n }}\n />\n ))}\n\n <MenuSeparator />\n <MenuRow\n icon={Tag}\n label={t(I18nKey.CONVERSATION_PANEL$TAG_FILTERS)}\n testId=\"tag-filters-section\"\n onClick={() => setTagSectionExpanded(!tagSectionExpanded)}\n />\n {tagSectionExpanded ? (\n tagFacets.length > 0 ? (\n tagFacets.map((facet) => (\n <MenuRow\n key={facet}\n icon={Tag}\n label={formatTagFacetLabel(facet)}\n selected={preferences.selectedTagFacets.includes(facet)}\n testId={`tag-facet-row-${facet}`}\n onClick={() => preferences.toggleTagFacet(facet)}\n />\n ))\n ) : (\n <p\n data-testid=\"tag-filters-empty\"\n className=\"px-2 py-1 text-[11px] text-[var(--oh-muted)]/70\"\n >\n {t(I18nKey.CONVERSATION_PANEL$NO_VISIBLE_TAGS)}\n </p>\n )\n ) : null}\n\n <MenuSeparator />\n <MenuRow\n icon={SlidersHorizontal}\n label={\n activePreset\n ? t(I18nKey.CONVERSATION_PANEL$ADVANCED_OPTIONS)\n : `${t(I18nKey.CONVERSATION_PANEL$ADVANCED_OPTIONS)} · ${t(\n I18nKey.CONVERSATION_PANEL$ADVANCED_OPTIONS_CUSTOM,\n )}`\n }\n testId=\"advanced-options-row\"\n onClick={() => {\n setMenuOpen(false);\n setAdvancedOpen(true);\n }}\n />\n\n <MenuSeparator />\n <MenuRow\n testId=\"delete-all-conversations\"\n icon={Trash2}\n label={capitalizeLabel(t(I18nKey.CONVERSATION$DELETE_ALL))}\n disabled={totalConversationsCount === 0}\n destructive\n onClick={() => {\n if (totalConversationsCount === 0) return;\n onRequestDeleteAll();\n setMenuOpen(false);\n }}\n />\n </div>\n ) : null}\n\n <AdvancedConversationOptionsModal\n open={advancedOpen}\n onClose={() => setAdvancedOpen(false)}\n backendKind={backendKind}\n automationNameFacets={automationNameFacets}\n />\n </div>\n );\n}\n\nconst capitalizeLabel = (label: string) =>\n label.length > 0 ? label.charAt(0).toUpperCase() + label.slice(1) : label;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { I18nKey } from "#/i18n/declaration";
|
|
3
|
+
import type { BackendKind } from "#/api/backend-registry/types";
|
|
4
|
+
import { type LayoutSettingsSlice } from "#/stores/conversation-panel-preferences-store";
|
|
5
|
+
interface LayoutPreset {
|
|
6
|
+
id: string;
|
|
7
|
+
icon: React.ComponentType<{
|
|
8
|
+
className?: string;
|
|
9
|
+
"aria-hidden"?: boolean;
|
|
10
|
+
}>;
|
|
11
|
+
/** Omitted for the backend-dependent first preset (workspace vs repo). */
|
|
12
|
+
labelKey?: I18nKey;
|
|
13
|
+
settings: LayoutSettingsSlice;
|
|
14
|
+
}
|
|
15
|
+
export declare function getActiveLayoutPreset(settings: LayoutSettingsSlice): LayoutPreset | null;
|
|
16
|
+
export interface ConversationLayoutsMenuProps {
|
|
17
|
+
menuOpen: boolean;
|
|
18
|
+
setMenuOpen: (open: boolean) => void;
|
|
19
|
+
menuRef: React.RefObject<HTMLDivElement | null>;
|
|
20
|
+
backendKind: BackendKind;
|
|
21
|
+
/** Distinct user-facing `key=value` facets among the loaded conversations. */
|
|
22
|
+
tagFacets: readonly string[];
|
|
23
|
+
/** Distinct automation names; the advanced modal owns their facet rows. */
|
|
24
|
+
automationNameFacets: readonly string[];
|
|
25
|
+
totalConversationsCount: number;
|
|
26
|
+
onRequestDeleteAll: () => void;
|
|
27
|
+
}
|
|
28
|
+
export declare function ConversationLayoutsMenu({ menuOpen, setMenuOpen, menuRef, backendKind, tagFacets, automationNameFacets, totalConversationsCount, onRequestDeleteAll, }: ConversationLayoutsMenuProps): React.JSX.Element;
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { useTranslation as e } from "../../../node_modules/react-i18next/dist/es/useTranslation.js";
|
|
2
|
+
import { I18nKey as t } from "../../../i18n/declaration.js";
|
|
3
|
+
import { Clock3 as n } from "../../../node_modules/lucide-react/dist/esm/icons/clock-3.js";
|
|
4
|
+
import { Folder as r } from "../../../node_modules/lucide-react/dist/esm/icons/folder.js";
|
|
5
|
+
import { ListFilter as i } from "../../../node_modules/lucide-react/dist/esm/icons/list-filter.js";
|
|
6
|
+
import { Shrink as a } from "../../../node_modules/lucide-react/dist/esm/icons/shrink.js";
|
|
7
|
+
import { SlidersHorizontal as o } from "../../../node_modules/lucide-react/dist/esm/icons/sliders-horizontal.js";
|
|
8
|
+
import { Star as s } from "../../../node_modules/lucide-react/dist/esm/icons/star.js";
|
|
9
|
+
import { Tag as c } from "../../../node_modules/lucide-react/dist/esm/icons/tag.js";
|
|
10
|
+
import { Trash2 as l } from "../../../node_modules/lucide-react/dist/esm/icons/trash-2.js";
|
|
11
|
+
import { cn as u } from "../../../utils/utils.js";
|
|
12
|
+
import { dropdownInstantColorClassName as d, dropdownMenuListClassName as f, dropdownMenuViewportScrollClassName as p } from "../../../utils/dropdown-classes.js";
|
|
13
|
+
import { formatTagFacetLabel as m } from "./conversation-panel-list-helpers.js";
|
|
14
|
+
import { DEFAULT_LAYOUT_SETTINGS as h, useConversationPanelPreferencesStore as g } from "../../../stores/conversation-panel-preferences-store.js";
|
|
15
|
+
import { MenuHeading as _ } from "./menu-heading.js";
|
|
16
|
+
import { MenuSeparator as v } from "./menu-separator.js";
|
|
17
|
+
import { MenuRow as y } from "./menu-row.js";
|
|
18
|
+
import { AdvancedConversationOptionsModal as b } from "./advanced-conversation-options-modal.js";
|
|
19
|
+
import x from "react";
|
|
20
|
+
import { jsx as S, jsxs as C } from "react/jsx-runtime";
|
|
21
|
+
//#region src/components/features/conversation-panel/conversation-layouts-menu.tsx
|
|
22
|
+
var w = [
|
|
23
|
+
{
|
|
24
|
+
id: "by-workspace",
|
|
25
|
+
icon: r,
|
|
26
|
+
settings: {
|
|
27
|
+
...h,
|
|
28
|
+
organizeMode: "grouped"
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
id: "recent-activity",
|
|
33
|
+
icon: n,
|
|
34
|
+
labelKey: t.CONVERSATION_PANEL$LAYOUT_RECENT_ACTIVITY,
|
|
35
|
+
settings: {
|
|
36
|
+
...h,
|
|
37
|
+
showOlderConversations: !1
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
id: "focused",
|
|
42
|
+
icon: s,
|
|
43
|
+
labelKey: t.CONVERSATION_PANEL$LAYOUT_FOCUSED,
|
|
44
|
+
settings: {
|
|
45
|
+
...h,
|
|
46
|
+
threadScope: "relevant",
|
|
47
|
+
showOlderConversations: !1
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
id: "minimal",
|
|
52
|
+
icon: a,
|
|
53
|
+
labelKey: t.CONVERSATION_PANEL$LAYOUT_MINIMAL,
|
|
54
|
+
settings: {
|
|
55
|
+
...h,
|
|
56
|
+
threadScope: "relevant",
|
|
57
|
+
showOlderConversations: !1,
|
|
58
|
+
showRepoBranchMetadata: !1,
|
|
59
|
+
showLlmProfiles: !1,
|
|
60
|
+
showTagsMetadata: !1,
|
|
61
|
+
showHoverMetadata: !1
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
];
|
|
65
|
+
function T(e) {
|
|
66
|
+
return w.find((t) => Object.entries(t.settings).every(([t, n]) => e[t] === n)) ?? null;
|
|
67
|
+
}
|
|
68
|
+
function E({ menuOpen: n, setMenuOpen: r, menuRef: a, backendKind: s, tagFacets: h, automationNameFacets: E, totalConversationsCount: O, onRequestDeleteAll: k }) {
|
|
69
|
+
let { t: A } = e("openhands"), j = g(), [M, N] = x.useState(!1), [P, F] = x.useState(!1), I = A(s === "local" ? t.CONVERSATION_PANEL$BY_WORKSPACE : t.CONVERSATION_PANEL$BY_REPOSITORY), L = T(j), R = x.useRef(null), z = x.useRef(null), B = x.useRef(n);
|
|
70
|
+
return x.useEffect(() => {
|
|
71
|
+
n ? (z.current?.querySelector("[role=\"menuitem\"], [role=\"menuitemradio\"], [role=\"menuitemcheckbox\"]"))?.focus() : B.current && R.current?.focus(), B.current = n;
|
|
72
|
+
}, [n]), /* @__PURE__ */ C("div", {
|
|
73
|
+
ref: a,
|
|
74
|
+
className: "relative shrink-0 pr-0.5",
|
|
75
|
+
children: [
|
|
76
|
+
/* @__PURE__ */ S("button", {
|
|
77
|
+
ref: R,
|
|
78
|
+
type: "button",
|
|
79
|
+
"data-testid": "conversation-layouts-toggle",
|
|
80
|
+
"aria-label": A(t.CONVERSATION_PANEL$LAYOUTS_HEADING),
|
|
81
|
+
"aria-haspopup": "menu",
|
|
82
|
+
"aria-expanded": n,
|
|
83
|
+
onClick: () => r(!n),
|
|
84
|
+
className: u("relative inline-flex h-7 w-7 items-center justify-center rounded-md text-[var(--oh-muted)] hover:text-white hover:bg-[var(--oh-surface-raised)]", d),
|
|
85
|
+
children: /* @__PURE__ */ S(i, {
|
|
86
|
+
className: "shrink-0",
|
|
87
|
+
size: 14,
|
|
88
|
+
strokeWidth: 2,
|
|
89
|
+
"aria-hidden": !0
|
|
90
|
+
})
|
|
91
|
+
}),
|
|
92
|
+
n ? /* @__PURE__ */ C("div", {
|
|
93
|
+
ref: z,
|
|
94
|
+
role: "menu",
|
|
95
|
+
"aria-orientation": "vertical",
|
|
96
|
+
"aria-label": A(t.CONVERSATION_PANEL$LAYOUTS_HEADING),
|
|
97
|
+
tabIndex: -1,
|
|
98
|
+
"data-testid": "conversation-layouts-menu",
|
|
99
|
+
onKeyDown: (e) => {
|
|
100
|
+
if (e.key === "Escape") {
|
|
101
|
+
e.preventDefault(), r(!1);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (e.key !== "ArrowDown" && e.key !== "ArrowUp") return;
|
|
105
|
+
let t = z.current;
|
|
106
|
+
if (!t) return;
|
|
107
|
+
let n = Array.from(t.querySelectorAll("[role=\"menuitem\"], [role=\"menuitemradio\"], [role=\"menuitemcheckbox\"]")).filter((e) => !e.disabled);
|
|
108
|
+
if (n.length === 0) return;
|
|
109
|
+
let i = n.indexOf(document.activeElement), a = e.key === "ArrowDown" ? 1 : -1, o = ((i === -1 ? 0 : i) + a + n.length) % n.length;
|
|
110
|
+
e.preventDefault(), n[o]?.focus();
|
|
111
|
+
},
|
|
112
|
+
className: u("absolute right-0 top-full z-50 mt-0 w-64 rounded-md border border-[var(--oh-border-subtle)] bg-tertiary px-1 py-1 text-[var(--oh-foreground)] shadow-lg", f, p),
|
|
113
|
+
children: [
|
|
114
|
+
/* @__PURE__ */ S(_, { children: A(t.CONVERSATION_PANEL$LAYOUTS_HEADING) }),
|
|
115
|
+
w.map((e) => /* @__PURE__ */ S(y, {
|
|
116
|
+
icon: e.icon,
|
|
117
|
+
label: e.labelKey ? A(e.labelKey) : I,
|
|
118
|
+
selected: L?.id === e.id,
|
|
119
|
+
testId: `layout-preset-${e.id}`,
|
|
120
|
+
onClick: () => {
|
|
121
|
+
j.applyLayoutSettings(e.settings), r(!1);
|
|
122
|
+
}
|
|
123
|
+
}, e.id)),
|
|
124
|
+
/* @__PURE__ */ S(v, {}),
|
|
125
|
+
/* @__PURE__ */ S(y, {
|
|
126
|
+
icon: c,
|
|
127
|
+
label: A(t.CONVERSATION_PANEL$TAG_FILTERS),
|
|
128
|
+
testId: "tag-filters-section",
|
|
129
|
+
onClick: () => N(!M)
|
|
130
|
+
}),
|
|
131
|
+
M ? h.length > 0 ? h.map((e) => /* @__PURE__ */ S(y, {
|
|
132
|
+
icon: c,
|
|
133
|
+
label: m(e),
|
|
134
|
+
selected: j.selectedTagFacets.includes(e),
|
|
135
|
+
testId: `tag-facet-row-${e}`,
|
|
136
|
+
onClick: () => j.toggleTagFacet(e)
|
|
137
|
+
}, e)) : /* @__PURE__ */ S("p", {
|
|
138
|
+
"data-testid": "tag-filters-empty",
|
|
139
|
+
className: "px-2 py-1 text-[11px] text-[var(--oh-muted)]/70",
|
|
140
|
+
children: A(t.CONVERSATION_PANEL$NO_VISIBLE_TAGS)
|
|
141
|
+
}) : null,
|
|
142
|
+
/* @__PURE__ */ S(v, {}),
|
|
143
|
+
/* @__PURE__ */ S(y, {
|
|
144
|
+
icon: o,
|
|
145
|
+
label: L ? A(t.CONVERSATION_PANEL$ADVANCED_OPTIONS) : `${A(t.CONVERSATION_PANEL$ADVANCED_OPTIONS)} · ${A(t.CONVERSATION_PANEL$ADVANCED_OPTIONS_CUSTOM)}`,
|
|
146
|
+
testId: "advanced-options-row",
|
|
147
|
+
onClick: () => {
|
|
148
|
+
r(!1), F(!0);
|
|
149
|
+
}
|
|
150
|
+
}),
|
|
151
|
+
/* @__PURE__ */ S(v, {}),
|
|
152
|
+
/* @__PURE__ */ S(y, {
|
|
153
|
+
testId: "delete-all-conversations",
|
|
154
|
+
icon: l,
|
|
155
|
+
label: D(A(t.CONVERSATION$DELETE_ALL)),
|
|
156
|
+
disabled: O === 0,
|
|
157
|
+
destructive: !0,
|
|
158
|
+
onClick: () => {
|
|
159
|
+
O !== 0 && (k(), r(!1));
|
|
160
|
+
}
|
|
161
|
+
})
|
|
162
|
+
]
|
|
163
|
+
}) : null,
|
|
164
|
+
/* @__PURE__ */ S(b, {
|
|
165
|
+
open: P,
|
|
166
|
+
onClose: () => F(!1),
|
|
167
|
+
backendKind: s,
|
|
168
|
+
automationNameFacets: E
|
|
169
|
+
})
|
|
170
|
+
]
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
var D = (e) => e.length > 0 ? e.charAt(0).toUpperCase() + e.slice(1) : e;
|
|
174
|
+
//#endregion
|
|
175
|
+
export { E as ConversationLayoutsMenu };
|
|
176
|
+
|
|
177
|
+
//# sourceMappingURL=conversation-layouts-menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conversation-layouts-menu.js","names":[],"sources":["../../../../src/components/features/conversation-panel/conversation-layouts-menu.tsx"],"sourcesContent":["import React from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport {\n Clock3,\n Folder,\n ListFilter,\n Shrink,\n SlidersHorizontal,\n Star,\n Tag,\n Trash2,\n} from \"lucide-react\";\nimport { I18nKey } from \"#/i18n/declaration\";\nimport type { BackendKind } from \"#/api/backend-registry/types\";\nimport { cn } from \"#/utils/utils\";\nimport {\n dropdownInstantColorClassName,\n dropdownMenuListClassName,\n dropdownMenuViewportScrollClassName,\n} from \"#/utils/dropdown-classes\";\nimport {\n DEFAULT_LAYOUT_SETTINGS,\n useConversationPanelPreferencesStore,\n type LayoutSettingsSlice,\n} from \"#/stores/conversation-panel-preferences-store\";\nimport { formatTagFacetLabel } from \"./conversation-panel-list-helpers\";\nimport { MenuHeading } from \"./menu-heading\";\nimport { MenuSeparator } from \"./menu-separator\";\nimport { MenuRow } from \"./menu-row\";\nimport { AdvancedConversationOptionsModal } from \"./advanced-conversation-options-modal\";\n\ninterface LayoutPreset {\n id: string;\n icon: React.ComponentType<{ className?: string; \"aria-hidden\"?: boolean }>;\n /** Omitted for the backend-dependent first preset (workspace vs repo). */\n labelKey?: I18nKey;\n settings: LayoutSettingsSlice;\n}\n\n/**\n * Layout presets are complete preference bundles (design inference from the\n * 2026-08-14 PM walkthrough video; the video names the presets but not their\n * exact bundles). Applying one replaces every layout-controlled field so a\n * previous preset cannot leak into the next one. Any manual deviation reads\n * as \"Custom\".\n */\nconst LAYOUT_PRESETS: LayoutPreset[] = [\n {\n id: \"by-workspace\",\n icon: Folder,\n settings: {\n ...DEFAULT_LAYOUT_SETTINGS,\n organizeMode: \"grouped\",\n },\n },\n {\n id: \"recent-activity\",\n icon: Clock3,\n labelKey: I18nKey.CONVERSATION_PANEL$LAYOUT_RECENT_ACTIVITY,\n settings: {\n ...DEFAULT_LAYOUT_SETTINGS,\n showOlderConversations: false,\n },\n },\n {\n id: \"focused\",\n icon: Star,\n labelKey: I18nKey.CONVERSATION_PANEL$LAYOUT_FOCUSED,\n settings: {\n ...DEFAULT_LAYOUT_SETTINGS,\n threadScope: \"relevant\",\n showOlderConversations: false,\n },\n },\n {\n id: \"minimal\",\n icon: Shrink,\n labelKey: I18nKey.CONVERSATION_PANEL$LAYOUT_MINIMAL,\n settings: {\n ...DEFAULT_LAYOUT_SETTINGS,\n threadScope: \"relevant\",\n showOlderConversations: false,\n showRepoBranchMetadata: false,\n showLlmProfiles: false,\n showTagsMetadata: false,\n showHoverMetadata: false,\n },\n },\n];\n\nexport function getActiveLayoutPreset(\n settings: LayoutSettingsSlice,\n): LayoutPreset | null {\n return (\n LAYOUT_PRESETS.find((preset) =>\n Object.entries(preset.settings).every(\n ([key, value]) => settings[key as keyof LayoutSettingsSlice] === value,\n ),\n ) ?? null\n );\n}\n\nexport interface ConversationLayoutsMenuProps {\n menuOpen: boolean;\n setMenuOpen: (open: boolean) => void;\n menuRef: React.RefObject<HTMLDivElement | null>;\n backendKind: BackendKind;\n /** Distinct user-facing `key=value` facets among the loaded conversations. */\n tagFacets: readonly string[];\n /** Distinct automation names; the advanced modal owns their facet rows. */\n automationNameFacets: readonly string[];\n totalConversationsCount: number;\n onRequestDeleteAll: () => void;\n}\n\nexport function ConversationLayoutsMenu({\n menuOpen,\n setMenuOpen,\n menuRef,\n backendKind,\n tagFacets,\n automationNameFacets,\n totalConversationsCount,\n onRequestDeleteAll,\n}: ConversationLayoutsMenuProps) {\n const { t } = useTranslation(\"openhands\");\n const preferences = useConversationPanelPreferencesStore();\n const [tagSectionExpanded, setTagSectionExpanded] = React.useState(false);\n const [advancedOpen, setAdvancedOpen] = React.useState(false);\n\n const groupedLabel =\n backendKind === \"local\"\n ? t(I18nKey.CONVERSATION_PANEL$BY_WORKSPACE)\n : t(I18nKey.CONVERSATION_PANEL$BY_REPOSITORY);\n\n const activePreset = getActiveLayoutPreset(preferences);\n\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n const menuContentRef = React.useRef<HTMLDivElement>(null);\n\n // Mirror the filter menu's focus management: focus into the menu on open,\n // return focus to the trigger on close.\n const wasOpenRef = React.useRef(menuOpen);\n React.useEffect(() => {\n if (menuOpen) {\n const firstItem =\n menuContentRef.current?.querySelector<HTMLButtonElement>(\n '[role=\"menuitem\"], [role=\"menuitemradio\"], [role=\"menuitemcheckbox\"]',\n );\n firstItem?.focus();\n } else if (wasOpenRef.current) {\n triggerRef.current?.focus();\n }\n wasOpenRef.current = menuOpen;\n }, [menuOpen]);\n\n const handleMenuKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"Escape\") {\n event.preventDefault();\n setMenuOpen(false);\n return;\n }\n if (event.key !== \"ArrowDown\" && event.key !== \"ArrowUp\") return;\n const container = menuContentRef.current;\n if (!container) return;\n const items = Array.from(\n container.querySelectorAll<HTMLButtonElement>(\n '[role=\"menuitem\"], [role=\"menuitemradio\"], [role=\"menuitemcheckbox\"]',\n ),\n ).filter((el) => !el.disabled);\n if (items.length === 0) return;\n const currentIdx = items.indexOf(\n document.activeElement as HTMLButtonElement,\n );\n const delta = event.key === \"ArrowDown\" ? 1 : -1;\n const start = currentIdx === -1 ? 0 : currentIdx;\n const nextIdx = (start + delta + items.length) % items.length;\n event.preventDefault();\n items[nextIdx]?.focus();\n };\n\n return (\n <div ref={menuRef} className=\"relative shrink-0 pr-0.5\">\n <button\n ref={triggerRef}\n type=\"button\"\n data-testid=\"conversation-layouts-toggle\"\n aria-label={t(I18nKey.CONVERSATION_PANEL$LAYOUTS_HEADING)}\n aria-haspopup=\"menu\"\n aria-expanded={menuOpen}\n onClick={() => setMenuOpen(!menuOpen)}\n className={cn(\n \"relative inline-flex h-7 w-7 items-center justify-center rounded-md text-[var(--oh-muted)] hover:text-white hover:bg-[var(--oh-surface-raised)]\",\n dropdownInstantColorClassName,\n )}\n >\n <ListFilter\n className=\"shrink-0\"\n size={14}\n strokeWidth={2}\n aria-hidden\n />\n </button>\n\n {menuOpen ? (\n <div\n ref={menuContentRef}\n role=\"menu\"\n aria-orientation=\"vertical\"\n aria-label={t(I18nKey.CONVERSATION_PANEL$LAYOUTS_HEADING)}\n tabIndex={-1}\n data-testid=\"conversation-layouts-menu\"\n onKeyDown={handleMenuKeyDown}\n className={cn(\n \"absolute right-0 top-full z-50 mt-0 w-64 rounded-md border border-[var(--oh-border-subtle)] bg-tertiary px-1 py-1 text-[var(--oh-foreground)] shadow-lg\",\n dropdownMenuListClassName,\n dropdownMenuViewportScrollClassName,\n )}\n >\n <MenuHeading>\n {t(I18nKey.CONVERSATION_PANEL$LAYOUTS_HEADING)}\n </MenuHeading>\n {LAYOUT_PRESETS.map((preset) => (\n <MenuRow\n key={preset.id}\n icon={preset.icon}\n label={preset.labelKey ? t(preset.labelKey) : groupedLabel}\n selected={activePreset?.id === preset.id}\n testId={`layout-preset-${preset.id}`}\n onClick={() => {\n preferences.applyLayoutSettings(preset.settings);\n setMenuOpen(false);\n }}\n />\n ))}\n\n <MenuSeparator />\n <MenuRow\n icon={Tag}\n label={t(I18nKey.CONVERSATION_PANEL$TAG_FILTERS)}\n testId=\"tag-filters-section\"\n onClick={() => setTagSectionExpanded(!tagSectionExpanded)}\n />\n {tagSectionExpanded ? (\n tagFacets.length > 0 ? (\n tagFacets.map((facet) => (\n <MenuRow\n key={facet}\n icon={Tag}\n label={formatTagFacetLabel(facet)}\n selected={preferences.selectedTagFacets.includes(facet)}\n testId={`tag-facet-row-${facet}`}\n onClick={() => preferences.toggleTagFacet(facet)}\n />\n ))\n ) : (\n <p\n data-testid=\"tag-filters-empty\"\n className=\"px-2 py-1 text-[11px] text-[var(--oh-muted)]/70\"\n >\n {t(I18nKey.CONVERSATION_PANEL$NO_VISIBLE_TAGS)}\n </p>\n )\n ) : null}\n\n <MenuSeparator />\n <MenuRow\n icon={SlidersHorizontal}\n label={\n activePreset\n ? t(I18nKey.CONVERSATION_PANEL$ADVANCED_OPTIONS)\n : `${t(I18nKey.CONVERSATION_PANEL$ADVANCED_OPTIONS)} · ${t(\n I18nKey.CONVERSATION_PANEL$ADVANCED_OPTIONS_CUSTOM,\n )}`\n }\n testId=\"advanced-options-row\"\n onClick={() => {\n setMenuOpen(false);\n setAdvancedOpen(true);\n }}\n />\n\n <MenuSeparator />\n <MenuRow\n testId=\"delete-all-conversations\"\n icon={Trash2}\n label={capitalizeLabel(t(I18nKey.CONVERSATION$DELETE_ALL))}\n disabled={totalConversationsCount === 0}\n destructive\n onClick={() => {\n if (totalConversationsCount === 0) return;\n onRequestDeleteAll();\n setMenuOpen(false);\n }}\n />\n </div>\n ) : null}\n\n <AdvancedConversationOptionsModal\n open={advancedOpen}\n onClose={() => setAdvancedOpen(false)}\n backendKind={backendKind}\n automationNameFacets={automationNameFacets}\n />\n </div>\n );\n}\n\nconst capitalizeLabel = (label: string) =>\n label.length > 0 ? label.charAt(0).toUpperCase() + label.slice(1) : label;\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../api/agent-server-adapter.cjs");function t(e,t,n){if(!t)return[...e];let r=e.filter(e=>t.has(e.id));if(n!=null&&!r.some(e=>e.id===n)){let t=e.find(e=>e.id===n);t&&r.push(t)}return r}function
|
|
1
|
+
require("../../../_virtual/_rolldown/runtime.cjs");const e=require("../../../api/agent-server-adapter.cjs");var t=[`1h`,`1d`,`7d`,`30d`],n={"1h":3600*1e3,"1d":1440*60*1e3,"7d":10080*60*1e3,"30d":720*60*60*1e3};function r(e){return typeof e==`string`&&t.includes(e)}function i(e,t,n=Date.now()){let r=n-t,i=[],a=[];for(let t of e){let e=t.updated_at?Date.parse(t.updated_at):NaN;Number.isFinite(e)&&e<r?a.push(t):i.push(t)}return{recent:i,older:a}}function a(e,t,n){if(!t)return[...e];let r=e.filter(e=>t.has(e.id));if(n!=null&&!r.some(e=>e.id===n)){let t=e.find(e=>e.id===n);t&&r.push(t)}return r}function o(e,t){let n=t.limit??5,r=a(e,t.discoveryConversationIds,t.activeConversationId),i;if(r.length<=n)i=r;else{let e=t.activeConversationId==null?-1:r.findIndex(e=>e.id===t.activeConversationId);i=e>=n?[...r.slice(0,n-1),r[e]]:r.slice(0,n)}let o=i.length<e.length;return t.expanded?{visibleConversations:[...e],isPreviewTruncated:o,isShowingAll:!0}:{visibleConversations:i,isPreviewTruncated:o,isShowingAll:!o}}function s(e,t){let n=new Map(t.map(e=>[e.id,e]));return e.map(e=>n.get(e)).filter(e=>e!=null)}function c(e,t){if(t.length===0)return[...e];let n=new Set(t);return e.filter(e=>!n.has(e.id))}var l=`__unnamed__`;function u(t){if(t.trigger===`automation`)return!0;let n=t.tags;return n?e.AUTOMATION_TAG_KEYS.some(e=>!!n[e]):!1}function d(e){return e.tags?.automationname?.trim()||`__unnamed__`}function f(e){let t=new Set,n=!1;for(let r of e){if(!u(r))continue;let e=d(r);e===`__unnamed__`?n=!0:t.add(e)}let r=[...t].sort((e,t)=>e.localeCompare(t));return n&&r.push(l),r}function p(e,t,n,r){if(t===`all`)return[...e];if(t===`hide-automations`)return e.filter(e=>!u(e));let i=new Set(r),a=n.filter(e=>i.has(e)),o=a.length>0?new Set(a):null;return e.filter(e=>u(e)?o===null||o.has(d(e)):!1)}function m(t){let n=new Set;for(let r of t)for(let[t,i]of e.getDisplayConversationTags(r.tags))n.add(`${t}=${i}`);return[...n].sort((e,t)=>e.localeCompare(t))}function h(e){return e.endsWith(`=`)?e.slice(0,-1):e}function g(t,n,r){let i=new Set(r),a=n.filter(e=>i.has(e));if(a.length===0)return[...t];let o=new Set(a);return t.filter(t=>e.getDisplayConversationTags(t.tags).some(([e,t])=>o.has(`${e}=${t}`)))}function _(e,t,n){if(t===`local`)return e===`__none_workspace`?{}:e.startsWith(`ws:`)?{workingDir:e.slice(3)}:{};if(e===`__none_repo`)return{};if(e.startsWith(`repo:`)){let t=e.slice(5),r=n[0];return{repository:{name:t,gitProvider:r?.git_provider??`github`,branch:r?.selected_branch??`main`}}}return{}}function v(e){if(!e)return 0;let t=Date.parse(e);return Number.isFinite(t)?t:0}function y(e,t){let n=t===`created`?`created_at`:`updated_at`;return[...e].sort((e,t)=>v(t[n])-v(e[n]))}function b(e){let t=e.selected_workspace?.trim().replace(/\/+$/,``);if(!t)return{id:`__none_workspace`,label:``};let n=t.split(`/`).filter(Boolean).pop()??t;return{id:`ws:${t}`,label:n}}function x(e){let t=e.selected_repository?.trim().replace(/\/+$/,``);if(!t)return{id:`__none_repo`,label:``};let n=t.split(`/`).filter(Boolean),r=n.length?(n[n.length-1]??t).replace(/\.git$/,``):t.replace(/\.git$/,``);return{id:`repo:${t}`,label:r}}function S(e,t){return t===`local`?b(e):x(e)}function C(e,t,n,r){let i=e.map(e=>({conversationId:e.id,groupId:S(e,n).id,page:t.get(e.id)??0})),a=new Map;for(let{groupId:e,page:t}of i){let n=a.get(e);(n===void 0||t<n)&&a.set(e,t)}let o=new Set;for(let{conversationId:e,groupId:t,page:n}of i)n===a.get(t)&&o.add(e);let s=r?.forceIncludeConversationId;return s!=null&&e.some(e=>e.id===s)&&o.add(s),o}function w(e,t,n,r,i){let a=new Map;if(t===`local`&&i)for(let e of i){let t=e.path.trim().replace(/\/+$/,``);t&&a.set(`ws:${t}`,{label:e.name,conversations:[]})}for(let n of e){let{id:e,label:i}=S(n,t),o=e===`__none_workspace`?r.emptyWorkspace:e===`__none_repo`?r.emptyRepository:i,s=a.get(e);s?s.conversations.push(n):a.set(e,{label:o,conversations:[n]})}let o=[...a.entries()].map(([e,r])=>{let i=y(r.conversations,n);return{id:e,label:r.label,conversations:i,launch:_(e,t,i)}}),s=e=>e.conversations.reduce((e,t)=>Math.max(e,v(n===`created`?t.created_at:t.updated_at)),0);return o.sort((e,t)=>s(t)-s(e)),o}function T(e,t){if(t.length===0)return[...e];let n=new Map(e.map(e=>[e.id,e])),r=[],i=new Set;for(let e of t){let t=n.get(e);t&&(r.push(t),i.add(e))}for(let t of e)i.has(t.id)||r.push(t);return r}function E(e,t,n,r,i=`after`){if(n===r)return[...e];let a=T(t.map(e=>({id:e})),e).map(e=>e.id),o=a.indexOf(n),s=a.indexOf(r);if(o<0||s<0)return[...e];let c=[...a];c.splice(o,1);let l=c.indexOf(r),u=i===`before`?l:l+1;return c.splice(u,0,n),c}exports.OLDER_CONVERSATION_CUTOFFS=t,exports.OLDER_CONVERSATION_CUTOFF_MS=n,exports.UNNAMED_AUTOMATION_FACET=l,exports.applyAutomationConversationFilter=p,exports.applyGroupFolderOrder=T,exports.applyTagConversationFilter=g,exports.collectAutomationNameFacets=f,exports.collectTagFacets=m,exports.filterOutPinnedConversations=c,exports.formatTagFacetLabel=h,exports.getGroupConversationPreview=o,exports.getGroupDiscoveryConversationIds=C,exports.groupConversations=w,exports.isOlderConversationCutoff=r,exports.moveGroupFolderOrder=E,exports.partitionByCutoff=i,exports.resolvePinnedConversations=s,exports.sortConversationsByField=y;
|
|
2
2
|
//# sourceMappingURL=conversation-panel-list-helpers.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-panel-list-helpers.cjs","names":[],"sources":["../../../../src/components/features/conversation-panel/conversation-panel-list-helpers.ts"],"sourcesContent":["import type { AppConversation } from \"#/api/conversation-service/agent-server-conversation-service.types\";\nimport type { BackendKind } from \"#/api/backend-registry/types\";\nimport type { LocalWorkspace } from \"#/types/workspace\";\nimport type { Provider } from \"#/types/settings\";\nimport {\n AUTOMATION_NAME_TAG_KEY,\n AUTOMATION_TAG_KEYS,\n} from \"#/api/agent-server-adapter\";\n\nexport type ConversationSortField = \"created\" | \"updated\";\nexport type ThreadScope = \"all\" | \"relevant\";\nexport type OrganizeMode = \"grouped\" | \"chronological\";\nexport type AutomationFilterMode =\n | \"all\"\n | \"hide-automations\"\n | \"only-automations\";\n\n/** Max conversations shown under a workspace/repo folder before \"View more\". */\nexport const GROUP_CONVERSATIONS_PREVIEW_LIMIT = 5;\n\ninterface GroupConversationPreviewOptions {\n limit?: number;\n expanded: boolean;\n activeConversationId?: string | null;\n /**\n * When set, the collapsed preview is drawn only from these conversation IDs\n * (plus the active conversation when it belongs to the group). Expanding\n * still reveals every loaded conversation in `conversations`.\n */\n discoveryConversationIds?: ReadonlySet<string>;\n}\n\n/**\n * Builds the frozen collapsed-preview pool for a folder.\n *\n * Global \"Load more\" may fetch later pages that add conversations to an\n * already-visible folder; those rows stay out of the collapsed preview so the\n * folder's first impression stays stable until the user expands it.\n */\nfunction resolveCollapsedPreviewPool(\n conversations: readonly AppConversation[],\n discoveryConversationIds: ReadonlySet<string> | undefined,\n activeConversationId: string | null | undefined,\n): AppConversation[] {\n if (!discoveryConversationIds) {\n return [...conversations];\n }\n\n const pool = conversations.filter((conversation) =>\n discoveryConversationIds.has(conversation.id),\n );\n\n // The load-bearing active-conversation guarantee lives in\n // `getGroupDiscoveryConversationIds` (`forceIncludeConversationId`); this\n // fallback only covers callers that pass a discovery set built without it.\n if (\n activeConversationId != null &&\n !pool.some((conversation) => conversation.id === activeConversationId)\n ) {\n const activeConversation = conversations.find(\n (conversation) => conversation.id === activeConversationId,\n );\n if (activeConversation) {\n pool.push(activeConversation);\n }\n }\n\n return pool;\n}\n\nexport function getGroupConversationPreview(\n conversations: readonly AppConversation[],\n options: GroupConversationPreviewOptions,\n): {\n visibleConversations: AppConversation[];\n isPreviewTruncated: boolean;\n isShowingAll: boolean;\n} {\n const limit = options.limit ?? GROUP_CONVERSATIONS_PREVIEW_LIMIT;\n const pool = resolveCollapsedPreviewPool(\n conversations,\n options.discoveryConversationIds,\n options.activeConversationId,\n );\n\n let collapsedVisible: AppConversation[];\n if (pool.length <= limit) {\n collapsedVisible = pool;\n } else {\n const activeIndex =\n options.activeConversationId != null\n ? pool.findIndex(\n (conversation) => conversation.id === options.activeConversationId,\n )\n : -1;\n\n if (activeIndex >= limit) {\n collapsedVisible = [...pool.slice(0, limit - 1), pool[activeIndex]];\n } else {\n collapsedVisible = pool.slice(0, limit);\n }\n }\n\n const collapsedHidesSomething =\n collapsedVisible.length < conversations.length;\n\n if (options.expanded) {\n return {\n visibleConversations: [...conversations],\n isPreviewTruncated: collapsedHidesSomething,\n isShowingAll: true,\n };\n }\n\n return {\n visibleConversations: collapsedVisible,\n isPreviewTruncated: collapsedHidesSomething,\n isShowingAll: !collapsedHidesSomething,\n };\n}\n\nexport function resolvePinnedConversations(\n pinnedIds: readonly string[],\n conversations: readonly AppConversation[],\n): AppConversation[] {\n const byId = new Map(\n conversations.map((conversation) => [conversation.id, conversation]),\n );\n return pinnedIds\n .map((id) => byId.get(id))\n .filter(\n (conversation): conversation is AppConversation => conversation != null,\n );\n}\n\nexport function filterOutPinnedConversations(\n conversations: readonly AppConversation[],\n pinnedIds: readonly string[],\n): AppConversation[] {\n if (pinnedIds.length === 0) {\n return [...conversations];\n }\n\n const pinnedSet = new Set(pinnedIds);\n return conversations.filter(\n (conversation) => !pinnedSet.has(conversation.id),\n );\n}\n\n/**\n * Facet bucket for automation-born conversations that carry no\n * `automationname` tag (double-underscore prefix mirrors the\n * `__none_workspace` group-id idiom).\n */\nexport const UNNAMED_AUTOMATION_FACET = \"__unnamed__\";\n\n/**\n * Whether a conversation was created by an automation run: the cloud backend\n * stamps `trigger: \"automation\"`, while local agent-server conversations are\n * recognized by the automation tags the SDK workspace attaches at creation.\n */\nexport function isAutomationConversation(\n conversation: AppConversation,\n): boolean {\n if (conversation.trigger === \"automation\") {\n return true;\n }\n const tags = conversation.tags;\n if (!tags) {\n return false;\n }\n return AUTOMATION_TAG_KEYS.some((key) => Boolean(tags[key]));\n}\n\nexport function getAutomationNameFacet(conversation: AppConversation): string {\n const name = conversation.tags?.[AUTOMATION_NAME_TAG_KEY]?.trim();\n return name || UNNAMED_AUTOMATION_FACET;\n}\n\n/**\n * Unique automation names among the given conversations, sorted for stable\n * menu order; the unnamed bucket (if present) is appended last.\n */\nexport function collectAutomationNameFacets(\n conversations: readonly AppConversation[],\n): string[] {\n const names = new Set<string>();\n let hasUnnamed = false;\n for (const conversation of conversations) {\n if (!isAutomationConversation(conversation)) {\n continue;\n }\n const facet = getAutomationNameFacet(conversation);\n if (facet === UNNAMED_AUTOMATION_FACET) {\n hasUnnamed = true;\n } else {\n names.add(facet);\n }\n }\n const sorted = [...names].sort((a, b) => a.localeCompare(b));\n if (hasUnnamed) {\n sorted.push(UNNAMED_AUTOMATION_FACET);\n }\n return sorted;\n}\n\nexport function applyAutomationConversationFilter(\n conversations: readonly AppConversation[],\n mode: AutomationFilterMode,\n selectedNames: readonly string[],\n availableFacets: readonly string[],\n): AppConversation[] {\n if (mode === \"all\") {\n return [...conversations];\n }\n if (mode === \"hide-automations\") {\n return conversations.filter(\n (conversation) => !isAutomationConversation(conversation),\n );\n }\n // \"only-automations\": an empty selection means every automation run, and a\n // selection that no longer intersects the available facets (stale names\n // persisted from another backend, renamed automations) degrades the same\n // way instead of yielding an unfillable empty list.\n const facetSet = new Set(availableFacets);\n const effectiveNames = selectedNames.filter((name) => facetSet.has(name));\n const narrowing = effectiveNames.length > 0 ? new Set(effectiveNames) : null;\n return conversations.filter((conversation) => {\n if (!isAutomationConversation(conversation)) {\n return false;\n }\n return (\n narrowing === null || narrowing.has(getAutomationNameFacet(conversation))\n );\n });\n}\n\n/** Subset of `useCreateConversation` variables for launching from a group row */\nexport type ConversationGroupLaunch = {\n workingDir?: string;\n repository?: {\n name: string;\n gitProvider: Provider;\n branch?: string;\n };\n};\n\nfunction buildGroupLaunch(\n id: string,\n backendKind: BackendKind,\n conversations: AppConversation[],\n): ConversationGroupLaunch {\n if (backendKind === \"local\") {\n if (id === \"__none_workspace\") {\n return {};\n }\n if (id.startsWith(\"ws:\")) {\n return { workingDir: id.slice(3) };\n }\n return {};\n }\n\n if (id === \"__none_repo\") {\n return {};\n }\n if (id.startsWith(\"repo:\")) {\n const name = id.slice(5);\n const sample = conversations[0];\n const gitProvider = (sample?.git_provider ?? \"github\") as Provider;\n const branch = sample?.selected_branch ?? \"main\";\n return {\n repository: {\n name,\n gitProvider,\n branch,\n },\n };\n }\n\n return {};\n}\n\nexport function parseConversationTimeMs(iso: string | undefined): number {\n if (!iso) return 0;\n const t = Date.parse(iso);\n return Number.isFinite(t) ? t : 0;\n}\n\nexport function sortConversationsByField(\n items: readonly AppConversation[],\n field: ConversationSortField,\n): AppConversation[] {\n const key = field === \"created\" ? \"created_at\" : \"updated_at\";\n return [...items].sort(\n (a, b) => parseConversationTimeMs(b[key]) - parseConversationTimeMs(a[key]),\n );\n}\n\nfunction workspaceGroup(conversation: AppConversation): {\n id: string;\n label: string;\n} {\n // Group by the user-selected workspace (a stable identifier shared by\n // every conversation launched from the same picker selection), not\n // `workspace.working_dir` — that field holds the per-conversation\n // worktree path the agent-server creates, which is unique per\n // conversation and would fragment the grouping.\n //\n // Normalize first, then check emptiness: inputs like \"/\", \"///\", or\n // \" ///\" trim+strip to \"\" and must fall back to the \"no workspace\"\n // bucket rather than producing a stray `ws:` group with no label.\n const normalized = conversation.selected_workspace\n ?.trim()\n .replace(/\\/+$/, \"\");\n if (!normalized) {\n return { id: \"__none_workspace\", label: \"\" };\n }\n const label = normalized.split(\"/\").filter(Boolean).pop() ?? normalized;\n return { id: `ws:${normalized}`, label };\n}\n\nfunction repositoryGroup(conversation: AppConversation): {\n id: string;\n label: string;\n} {\n // Mirror `workspaceGroup`'s normalize-then-check order so \"/\", \"///\",\n // and trailing-slash variants of the same repo all collapse to one\n // group instead of producing a stray `repo:/` bucket.\n const normalized = conversation.selected_repository\n ?.trim()\n .replace(/\\/+$/, \"\");\n if (!normalized) {\n return { id: \"__none_repo\", label: \"\" };\n }\n const parts = normalized.split(\"/\").filter(Boolean);\n const label = parts.length\n ? (parts[parts.length - 1] ?? normalized).replace(/\\.git$/, \"\")\n : normalized.replace(/\\.git$/, \"\");\n return { id: `repo:${normalized}`, label };\n}\n\n/**\n * Resolves the stable folder identity used by grouped conversation views.\n *\n * Keeping this shared with `groupConversations` lets pagination reason about\n * folder discovery without duplicating workspace/repository normalization.\n */\nfunction getConversationGroupIdentity(\n conversation: AppConversation,\n backendKind: BackendKind,\n): { id: string; label: string } {\n return backendKind === \"local\"\n ? workspaceGroup(conversation)\n : repositoryGroup(conversation);\n}\n\n/**\n * Max backend pages fetched for a single grouped \"Load more\" click. The\n * driver walks past pages that only deepen already-visible folders looking\n * for a new folder, and this cap prevents one click from walking the entire\n * remaining cursor when no undiscovered folder exists. Chronological mode is\n * not capped — it keeps its pre-existing fetch-until-visible behavior.\n */\nexport const MAX_PAGES_PER_LOAD_MORE_CLICK = 3;\n\n/**\n * Conversation IDs that belong on each folder's discovery page — the first\n * backend page where that folder appeared.\n *\n * Global \"Load more\" still discovers folders from later pages, but the\n * collapsed preview for an already-visible folder stays frozen to this set.\n * Expanding the folder reads the full grouped `conversations` array instead.\n * `forceIncludeConversationId` keeps the active thread in the preview even\n * when it landed on a non-discovery page.\n */\nexport function getGroupDiscoveryConversationIds(\n items: readonly AppConversation[],\n pageByConversationId: ReadonlyMap<string, number>,\n backendKind: BackendKind,\n options?: { forceIncludeConversationId?: string | null },\n): Set<string> {\n // Resolve each conversation's folder identity exactly once; both passes\n // below (finding each folder's discovery page, then collecting the ids on\n // that page) read from this record instead of re-running the\n // workspace/repository normalization.\n const resolved = items.map((conversation) => ({\n conversationId: conversation.id,\n groupId: getConversationGroupIdentity(conversation, backendKind).id,\n page: pageByConversationId.get(conversation.id) ?? 0,\n }));\n\n const discoveryPageByGroupId = new Map<string, number>();\n for (const { groupId, page } of resolved) {\n const currentDiscoveryPage = discoveryPageByGroupId.get(groupId);\n if (currentDiscoveryPage === undefined || page < currentDiscoveryPage) {\n discoveryPageByGroupId.set(groupId, page);\n }\n }\n\n const discoveryIds = new Set<string>();\n for (const { conversationId, groupId, page } of resolved) {\n if (page === discoveryPageByGroupId.get(groupId)) {\n discoveryIds.add(conversationId);\n }\n }\n\n const forceIncludeId = options?.forceIncludeConversationId;\n if (\n forceIncludeId != null &&\n items.some((conversation) => conversation.id === forceIncludeId)\n ) {\n discoveryIds.add(forceIncludeId);\n }\n\n return discoveryIds;\n}\n\nexport function groupConversations(\n items: readonly AppConversation[],\n backendKind: BackendKind,\n sortField: ConversationSortField,\n labels: { emptyWorkspace: string; emptyRepository: string },\n knownWorkspaces?: readonly LocalWorkspace[],\n): {\n id: string;\n label: string;\n conversations: AppConversation[];\n launch: ConversationGroupLaunch;\n}[] {\n const byId = new Map<\n string,\n { label: string; conversations: AppConversation[] }\n >();\n\n if (backendKind === \"local\" && knownWorkspaces) {\n for (const ws of knownWorkspaces) {\n const normalized = ws.path.trim().replace(/\\/+$/, \"\");\n if (normalized) {\n byId.set(`ws:${normalized}`, { label: ws.name, conversations: [] });\n }\n }\n }\n\n for (const c of items) {\n const { id, label: rawLabel } = getConversationGroupIdentity(\n c,\n backendKind,\n );\n const label =\n id === \"__none_workspace\"\n ? labels.emptyWorkspace\n : id === \"__none_repo\"\n ? labels.emptyRepository\n : rawLabel;\n const bucket = byId.get(id);\n if (bucket) {\n bucket.conversations.push(c);\n } else {\n byId.set(id, { label, conversations: [c] });\n }\n }\n\n const groups = [...byId.entries()].map(([id, g]) => {\n const conversations = sortConversationsByField(g.conversations, sortField);\n return {\n id,\n label: g.label,\n conversations,\n launch: buildGroupLaunch(id, backendKind, conversations),\n };\n });\n\n // Use reduce instead of `Math.max(...arr)` — the spread form would push\n // every conversation onto the call stack as a separate argument, which\n // hits JS engines' ~100k-arg limit on very large buckets.\n const groupOrderKey = (g: (typeof groups)[number]) =>\n g.conversations.reduce(\n (max, c) =>\n Math.max(\n max,\n parseConversationTimeMs(\n sortField === \"created\" ? c.created_at : c.updated_at,\n ),\n ),\n 0,\n );\n\n groups.sort((a, b) => groupOrderKey(b) - groupOrderKey(a));\n return groups;\n}\n\nexport function applyGroupFolderOrder<T extends { id: string }>(\n groups: readonly T[],\n order: readonly string[],\n): T[] {\n if (order.length === 0) {\n return [...groups];\n }\n\n const byId = new Map(groups.map((group) => [group.id, group]));\n const ordered: T[] = [];\n const seen = new Set<string>();\n\n for (const id of order) {\n const group = byId.get(id);\n if (group) {\n ordered.push(group);\n seen.add(id);\n }\n }\n\n for (const group of groups) {\n if (!seen.has(group.id)) {\n ordered.push(group);\n }\n }\n\n return ordered;\n}\n\nexport type GroupFolderDropPosition = \"before\" | \"after\";\n\nexport function moveGroupFolderOrder(\n order: readonly string[],\n groupIds: readonly string[],\n activeGroupId: string,\n targetGroupId: string,\n position: GroupFolderDropPosition = \"after\",\n): string[] {\n if (activeGroupId === targetGroupId) {\n return [...order];\n }\n\n const effectiveOrder = applyGroupFolderOrder(\n groupIds.map((id) => ({ id })),\n order,\n ).map((group) => group.id);\n const fromIndex = effectiveOrder.indexOf(activeGroupId);\n const toIndex = effectiveOrder.indexOf(targetGroupId);\n if (fromIndex < 0 || toIndex < 0) {\n return [...order];\n }\n\n const nextOrder = [...effectiveOrder];\n nextOrder.splice(fromIndex, 1);\n const adjustedTargetIndex = nextOrder.indexOf(targetGroupId);\n const insertIndex =\n position === \"before\" ? adjustedTargetIndex : adjustedTargetIndex + 1;\n nextOrder.splice(insertIndex, 0, activeGroupId);\n return nextOrder;\n}\n"],"mappings":"4GAuCA,SAAS,EACP,EACA,EACA,EACmB,CACnB,GAAI,CAAC,EACH,MAAO,CAAC,GAAG,CAAa,EAG1B,IAAM,EAAO,EAAc,OAAQ,GACjC,EAAyB,IAAI,EAAa,EAAE,CAC9C,EAKA,GACE,GAAwB,MACxB,CAAC,EAAK,KAAM,GAAiB,EAAa,KAAO,CAAoB,EACrE,CACA,IAAM,EAAqB,EAAc,KACtC,GAAiB,EAAa,KAAO,CACxC,EACI,GACF,EAAK,KAAK,CAAkB,CAEhC,CAEA,OAAO,CACT,CAEA,SAAgB,EACd,EACA,EAKA,CACA,IAAM,EAAQ,EAAQ,OAAA,EAChB,EAAO,EACX,EACA,EAAQ,yBACR,EAAQ,oBACV,EAEI,EACJ,GAAI,EAAK,QAAU,EACjB,EAAmB,MACd,CACL,IAAM,EACJ,EAAQ,sBAAwB,KAI5B,GAHA,EAAK,UACF,GAAiB,EAAa,KAAO,EAAQ,oBAChD,EAGN,AAGE,EAHE,GAAe,EACE,CAAC,GAAG,EAAK,MAAM,EAAG,EAAQ,CAAC,EAAG,EAAK,EAAY,EAE/C,EAAK,MAAM,EAAG,CAAK,CAE1C,CAEA,IAAM,EACJ,EAAiB,OAAS,EAAc,OAU1C,OARI,EAAQ,SACH,CACL,qBAAsB,CAAC,GAAG,CAAa,EACvC,mBAAoB,EACpB,aAAc,EAChB,EAGK,CACL,qBAAsB,EACtB,mBAAoB,EACpB,aAAc,CAAC,CACjB,CACF,CAEA,SAAgB,EACd,EACA,EACmB,CACnB,IAAM,EAAO,IAAI,IACf,EAAc,IAAK,GAAiB,CAAC,EAAa,GAAI,CAAY,CAAC,CACrE,EACA,OAAO,EACJ,IAAK,GAAO,EAAK,IAAI,CAAE,CAAC,EACxB,OACE,GAAkD,GAAgB,IACrE,CACJ,CAEA,SAAgB,EACd,EACA,EACmB,CACnB,GAAI,EAAU,SAAW,EACvB,MAAO,CAAC,GAAG,CAAa,EAG1B,IAAM,EAAY,IAAI,IAAI,CAAS,EACnC,OAAO,EAAc,OAClB,GAAiB,CAAC,EAAU,IAAI,EAAa,EAAE,CAClD,CACF,CAOA,IAAa,EAA2B,cAOxC,SAAgB,EACd,EACS,CACT,GAAI,EAAa,UAAY,aAC3B,MAAO,GAET,IAAM,EAAO,EAAa,KAI1B,OAHK,EAGE,EAAA,oBAAoB,KAAM,GAAQ,EAAQ,EAAK,EAAK,EAFlD,EAGX,CAEA,SAAgB,EAAuB,EAAuC,CAE5E,OADa,EAAa,MAAA,gBAAiC,KAAK,GAAA,aAElE,CAMA,SAAgB,EACd,EACU,CACV,IAAM,EAAQ,IAAI,IACd,EAAa,GACjB,IAAK,IAAM,KAAgB,EAAe,CACxC,GAAI,CAAC,EAAyB,CAAY,EACxC,SAEF,IAAM,EAAQ,EAAuB,CAAY,EAC7C,IAAA,cACF,EAAa,GAEb,EAAM,IAAI,CAAK,CAEnB,CACA,IAAM,EAAS,CAAC,GAAG,CAAK,EAAE,MAAM,EAAG,IAAM,EAAE,cAAc,CAAC,CAAC,EAI3D,OAHI,GACF,EAAO,KAAK,CAAwB,EAE/B,CACT,CAEA,SAAgB,EACd,EACA,EACA,EACA,EACmB,CACnB,GAAI,IAAS,MACX,MAAO,CAAC,GAAG,CAAa,EAE1B,GAAI,IAAS,mBACX,OAAO,EAAc,OAClB,GAAiB,CAAC,EAAyB,CAAY,CAC1D,EAMF,IAAM,EAAW,IAAI,IAAI,CAAe,EAClC,EAAiB,EAAc,OAAQ,GAAS,EAAS,IAAI,CAAI,CAAC,EAClE,EAAY,EAAe,OAAS,EAAI,IAAI,IAAI,CAAc,EAAI,KACxE,OAAO,EAAc,OAAQ,GACtB,EAAyB,CAAY,EAIxC,IAAc,MAAQ,EAAU,IAAI,EAAuB,CAAY,CAAC,EAHjE,EAKV,CACH,CAYA,SAAS,EACP,EACA,EACA,EACyB,CACzB,GAAI,IAAgB,QAOlB,OANI,IAAO,mBACF,CAAC,EAEN,EAAG,WAAW,KAAK,EACd,CAAE,WAAY,EAAG,MAAM,CAAC,CAAE,EAE5B,CAAC,EAGV,GAAI,IAAO,cACT,MAAO,CAAC,EAEV,GAAI,EAAG,WAAW,OAAO,EAAG,CAC1B,IAAM,EAAO,EAAG,MAAM,CAAC,EACjB,EAAS,EAAc,GAG7B,MAAO,CACL,WAAY,CACV,OACA,YALiB,GAAQ,cAAgB,SAMzC,OALW,GAAQ,iBAAmB,MAMxC,CACF,CACF,CAEA,MAAO,CAAC,CACV,CAEA,SAAgB,EAAwB,EAAiC,CACvE,GAAI,CAAC,EAAK,MAAO,GACjB,IAAM,EAAI,KAAK,MAAM,CAAG,EACxB,OAAO,OAAO,SAAS,CAAC,EAAI,EAAI,CAClC,CAEA,SAAgB,EACd,EACA,EACmB,CACnB,IAAM,EAAM,IAAU,UAAY,aAAe,aACjD,MAAO,CAAC,GAAG,CAAK,EAAE,MACf,EAAG,IAAM,EAAwB,EAAE,EAAI,EAAI,EAAwB,EAAE,EAAI,CAC5E,CACF,CAEA,SAAS,EAAe,EAGtB,CAUA,IAAM,EAAa,EAAa,oBAC5B,KAAK,EACN,QAAQ,OAAQ,EAAE,EACrB,GAAI,CAAC,EACH,MAAO,CAAE,GAAI,mBAAoB,MAAO,EAAG,EAE7C,IAAM,EAAQ,EAAW,MAAM,GAAG,EAAE,OAAO,OAAO,EAAE,IAAI,GAAK,EAC7D,MAAO,CAAE,GAAI,MAAM,IAAc,OAAM,CACzC,CAEA,SAAS,EAAgB,EAGvB,CAIA,IAAM,EAAa,EAAa,qBAC5B,KAAK,EACN,QAAQ,OAAQ,EAAE,EACrB,GAAI,CAAC,EACH,MAAO,CAAE,GAAI,cAAe,MAAO,EAAG,EAExC,IAAM,EAAQ,EAAW,MAAM,GAAG,EAAE,OAAO,OAAO,EAC5C,EAAQ,EAAM,QACf,EAAM,EAAM,OAAS,IAAM,GAAY,QAAQ,SAAU,EAAE,EAC5D,EAAW,QAAQ,SAAU,EAAE,EACnC,MAAO,CAAE,GAAI,QAAQ,IAAc,OAAM,CAC3C,CAQA,SAAS,EACP,EACA,EAC+B,CAC/B,OAAO,IAAgB,QACnB,EAAe,CAAY,EAC3B,EAAgB,CAAY,CAClC,CAqBA,SAAgB,EACd,EACA,EACA,EACA,EACa,CAKb,IAAM,EAAW,EAAM,IAAK,IAAkB,CAC5C,eAAgB,EAAa,GAC7B,QAAS,EAA6B,EAAc,CAAW,EAAE,GACjE,KAAM,EAAqB,IAAI,EAAa,EAAE,GAAK,CACrD,EAAE,EAEI,EAAyB,IAAI,IACnC,IAAK,GAAM,CAAE,UAAS,UAAU,EAAU,CACxC,IAAM,EAAuB,EAAuB,IAAI,CAAO,GAC3D,IAAyB,IAAA,IAAa,EAAO,IAC/C,EAAuB,IAAI,EAAS,CAAI,CAE5C,CAEA,IAAM,EAAe,IAAI,IACzB,IAAK,GAAM,CAAE,iBAAgB,UAAS,UAAU,EAC1C,IAAS,EAAuB,IAAI,CAAO,GAC7C,EAAa,IAAI,CAAc,EAInC,IAAM,EAAiB,GAAS,2BAQhC,OANE,GAAkB,MAClB,EAAM,KAAM,GAAiB,EAAa,KAAO,CAAc,GAE/D,EAAa,IAAI,CAAc,EAG1B,CACT,CAEA,SAAgB,EACd,EACA,EACA,EACA,EACA,EAME,CACF,IAAM,EAAO,IAAI,IAKjB,GAAI,IAAgB,SAAW,EAC7B,IAAK,IAAM,KAAM,EAAiB,CAChC,IAAM,EAAa,EAAG,KAAK,KAAK,EAAE,QAAQ,OAAQ,EAAE,EAChD,GACF,EAAK,IAAI,MAAM,IAAc,CAAE,MAAO,EAAG,KAAM,cAAe,CAAC,CAAE,CAAC,CAEtE,CAGF,IAAK,IAAM,KAAK,EAAO,CACrB,GAAM,CAAE,KAAI,MAAO,GAAa,EAC9B,EACA,CACF,EACM,EACJ,IAAO,mBACH,EAAO,eACP,IAAO,cACL,EAAO,gBACP,EACF,EAAS,EAAK,IAAI,CAAE,EACtB,EACF,EAAO,cAAc,KAAK,CAAC,EAE3B,EAAK,IAAI,EAAI,CAAE,QAAO,cAAe,CAAC,CAAC,CAAE,CAAC,CAE9C,CAEA,IAAM,EAAS,CAAC,GAAG,EAAK,QAAQ,CAAC,EAAE,KAAK,CAAC,EAAI,KAAO,CAClD,IAAM,EAAgB,EAAyB,EAAE,cAAe,CAAS,EACzE,MAAO,CACL,KACA,MAAO,EAAE,MACT,gBACA,OAAQ,EAAiB,EAAI,EAAa,CAAa,CACzD,CACF,CAAC,EAKK,EAAiB,GACrB,EAAE,cAAc,QACb,EAAK,IACJ,KAAK,IACH,EACA,EACE,IAAc,UAAY,EAAE,WAAa,EAAE,UAC7C,CACF,EACF,CACF,EAGF,OADA,EAAO,MAAM,EAAG,IAAM,EAAc,CAAC,EAAI,EAAc,CAAC,CAAC,EAClD,CACT,CAEA,SAAgB,EACd,EACA,EACK,CACL,GAAI,EAAM,SAAW,EACnB,MAAO,CAAC,GAAG,CAAM,EAGnB,IAAM,EAAO,IAAI,IAAI,EAAO,IAAK,GAAU,CAAC,EAAM,GAAI,CAAK,CAAC,CAAC,EACvD,EAAe,CAAC,EAChB,EAAO,IAAI,IAEjB,IAAK,IAAM,KAAM,EAAO,CACtB,IAAM,EAAQ,EAAK,IAAI,CAAE,EACrB,IACF,EAAQ,KAAK,CAAK,EAClB,EAAK,IAAI,CAAE,EAEf,CAEA,IAAK,IAAM,KAAS,EACb,EAAK,IAAI,EAAM,EAAE,GACpB,EAAQ,KAAK,CAAK,EAItB,OAAO,CACT,CAIA,SAAgB,EACd,EACA,EACA,EACA,EACA,EAAoC,QAC1B,CACV,GAAI,IAAkB,EACpB,MAAO,CAAC,GAAG,CAAK,EAGlB,IAAM,EAAiB,EACrB,EAAS,IAAK,IAAQ,CAAE,IAAG,EAAE,EAC7B,CACF,EAAE,IAAK,GAAU,EAAM,EAAE,EACnB,EAAY,EAAe,QAAQ,CAAa,EAChD,EAAU,EAAe,QAAQ,CAAa,EACpD,GAAI,EAAY,GAAK,EAAU,EAC7B,MAAO,CAAC,GAAG,CAAK,EAGlB,IAAM,EAAY,CAAC,GAAG,CAAc,EACpC,EAAU,OAAO,EAAW,CAAC,EAC7B,IAAM,EAAsB,EAAU,QAAQ,CAAa,EACrD,EACJ,IAAa,SAAW,EAAsB,EAAsB,EAEtE,OADA,EAAU,OAAO,EAAa,EAAG,CAAa,EACvC,CACT"}
|
|
1
|
+
{"version":3,"file":"conversation-panel-list-helpers.cjs","names":[],"sources":["../../../../src/components/features/conversation-panel/conversation-panel-list-helpers.ts"],"sourcesContent":["import type { AppConversation } from \"#/api/conversation-service/agent-server-conversation-service.types\";\nimport type { BackendKind } from \"#/api/backend-registry/types\";\nimport type { LocalWorkspace } from \"#/types/workspace\";\nimport type { Provider } from \"#/types/settings\";\nimport {\n AUTOMATION_NAME_TAG_KEY,\n AUTOMATION_TAG_KEYS,\n getDisplayConversationTags,\n} from \"#/api/agent-server-adapter\";\n\nexport type ConversationSortField = \"created\" | \"updated\";\nexport type ThreadScope = \"all\" | \"relevant\";\nexport type OrganizeMode = \"grouped\" | \"chronological\";\nexport type AutomationFilterMode =\n | \"all\"\n | \"hide-automations\"\n | \"only-automations\";\nexport type OlderConversationCutoff = \"1h\" | \"1d\" | \"7d\" | \"30d\";\n\nexport const OLDER_CONVERSATION_CUTOFFS = [\n \"1h\",\n \"1d\",\n \"7d\",\n \"30d\",\n] as const satisfies readonly OlderConversationCutoff[];\n\nexport const DEFAULT_OLDER_CONVERSATION_CUTOFF: OlderConversationCutoff = \"7d\";\n\nexport const OLDER_CONVERSATION_CUTOFF_MS: Record<\n OlderConversationCutoff,\n number\n> = {\n \"1h\": 60 * 60 * 1000,\n \"1d\": 24 * 60 * 60 * 1000,\n \"7d\": 7 * 24 * 60 * 60 * 1000,\n \"30d\": 30 * 24 * 60 * 60 * 1000,\n};\n\nexport function isOlderConversationCutoff(\n value: unknown,\n): value is OlderConversationCutoff {\n return (\n typeof value === \"string\" &&\n (OLDER_CONVERSATION_CUTOFFS as readonly string[]).includes(value)\n );\n}\n\n/**\n * Splits conversations by last update relative to `nowMs`. Missing or\n * unparseable timestamps stay in `recent` so they are never hidden by the\n * hide-older toggle.\n */\nexport function partitionByCutoff<T extends { updated_at: string }>(\n items: readonly T[],\n cutoffMs: number,\n nowMs: number = Date.now(),\n): { recent: T[]; older: T[] } {\n const cutoff = nowMs - cutoffMs;\n const recent: T[] = [];\n const older: T[] = [];\n for (const item of items) {\n const updatedAt = item.updated_at ? Date.parse(item.updated_at) : NaN;\n if (Number.isFinite(updatedAt) && updatedAt < cutoff) {\n older.push(item);\n } else {\n recent.push(item);\n }\n }\n return { recent, older };\n}\n\n/** Max conversations shown under a workspace/repo folder before \"View more\". */\nexport const GROUP_CONVERSATIONS_PREVIEW_LIMIT = 5;\n\ninterface GroupConversationPreviewOptions {\n limit?: number;\n expanded: boolean;\n activeConversationId?: string | null;\n /**\n * When set, the collapsed preview is drawn only from these conversation IDs\n * (plus the active conversation when it belongs to the group). Expanding\n * still reveals every loaded conversation in `conversations`.\n */\n discoveryConversationIds?: ReadonlySet<string>;\n}\n\n/**\n * Builds the frozen collapsed-preview pool for a folder.\n *\n * Global \"Load more\" may fetch later pages that add conversations to an\n * already-visible folder; those rows stay out of the collapsed preview so the\n * folder's first impression stays stable until the user expands it.\n */\nfunction resolveCollapsedPreviewPool(\n conversations: readonly AppConversation[],\n discoveryConversationIds: ReadonlySet<string> | undefined,\n activeConversationId: string | null | undefined,\n): AppConversation[] {\n if (!discoveryConversationIds) {\n return [...conversations];\n }\n\n const pool = conversations.filter((conversation) =>\n discoveryConversationIds.has(conversation.id),\n );\n\n // The load-bearing active-conversation guarantee lives in\n // `getGroupDiscoveryConversationIds` (`forceIncludeConversationId`); this\n // fallback only covers callers that pass a discovery set built without it.\n if (\n activeConversationId != null &&\n !pool.some((conversation) => conversation.id === activeConversationId)\n ) {\n const activeConversation = conversations.find(\n (conversation) => conversation.id === activeConversationId,\n );\n if (activeConversation) {\n pool.push(activeConversation);\n }\n }\n\n return pool;\n}\n\nexport function getGroupConversationPreview(\n conversations: readonly AppConversation[],\n options: GroupConversationPreviewOptions,\n): {\n visibleConversations: AppConversation[];\n isPreviewTruncated: boolean;\n isShowingAll: boolean;\n} {\n const limit = options.limit ?? GROUP_CONVERSATIONS_PREVIEW_LIMIT;\n const pool = resolveCollapsedPreviewPool(\n conversations,\n options.discoveryConversationIds,\n options.activeConversationId,\n );\n\n let collapsedVisible: AppConversation[];\n if (pool.length <= limit) {\n collapsedVisible = pool;\n } else {\n const activeIndex =\n options.activeConversationId != null\n ? pool.findIndex(\n (conversation) => conversation.id === options.activeConversationId,\n )\n : -1;\n\n if (activeIndex >= limit) {\n collapsedVisible = [...pool.slice(0, limit - 1), pool[activeIndex]];\n } else {\n collapsedVisible = pool.slice(0, limit);\n }\n }\n\n const collapsedHidesSomething =\n collapsedVisible.length < conversations.length;\n\n if (options.expanded) {\n return {\n visibleConversations: [...conversations],\n isPreviewTruncated: collapsedHidesSomething,\n isShowingAll: true,\n };\n }\n\n return {\n visibleConversations: collapsedVisible,\n isPreviewTruncated: collapsedHidesSomething,\n isShowingAll: !collapsedHidesSomething,\n };\n}\n\nexport function resolvePinnedConversations(\n pinnedIds: readonly string[],\n conversations: readonly AppConversation[],\n): AppConversation[] {\n const byId = new Map(\n conversations.map((conversation) => [conversation.id, conversation]),\n );\n return pinnedIds\n .map((id) => byId.get(id))\n .filter(\n (conversation): conversation is AppConversation => conversation != null,\n );\n}\n\nexport function filterOutPinnedConversations(\n conversations: readonly AppConversation[],\n pinnedIds: readonly string[],\n): AppConversation[] {\n if (pinnedIds.length === 0) {\n return [...conversations];\n }\n\n const pinnedSet = new Set(pinnedIds);\n return conversations.filter(\n (conversation) => !pinnedSet.has(conversation.id),\n );\n}\n\n/**\n * Facet bucket for automation-born conversations that carry no\n * `automationname` tag (double-underscore prefix mirrors the\n * `__none_workspace` group-id idiom).\n */\nexport const UNNAMED_AUTOMATION_FACET = \"__unnamed__\";\n\n/**\n * Whether a conversation was created by an automation run: the cloud backend\n * stamps `trigger: \"automation\"`, while local agent-server conversations are\n * recognized by the automation tags the SDK workspace attaches at creation.\n */\nexport function isAutomationConversation(\n conversation: AppConversation,\n): boolean {\n if (conversation.trigger === \"automation\") {\n return true;\n }\n const tags = conversation.tags;\n if (!tags) {\n return false;\n }\n return AUTOMATION_TAG_KEYS.some((key) => Boolean(tags[key]));\n}\n\nexport function getAutomationNameFacet(conversation: AppConversation): string {\n const name = conversation.tags?.[AUTOMATION_NAME_TAG_KEY]?.trim();\n return name || UNNAMED_AUTOMATION_FACET;\n}\n\n/**\n * Unique automation names among the given conversations, sorted for stable\n * menu order; the unnamed bucket (if present) is appended last.\n */\nexport function collectAutomationNameFacets(\n conversations: readonly AppConversation[],\n): string[] {\n const names = new Set<string>();\n let hasUnnamed = false;\n for (const conversation of conversations) {\n if (!isAutomationConversation(conversation)) {\n continue;\n }\n const facet = getAutomationNameFacet(conversation);\n if (facet === UNNAMED_AUTOMATION_FACET) {\n hasUnnamed = true;\n } else {\n names.add(facet);\n }\n }\n const sorted = [...names].sort((a, b) => a.localeCompare(b));\n if (hasUnnamed) {\n sorted.push(UNNAMED_AUTOMATION_FACET);\n }\n return sorted;\n}\n\nexport function applyAutomationConversationFilter(\n conversations: readonly AppConversation[],\n mode: AutomationFilterMode,\n selectedNames: readonly string[],\n availableFacets: readonly string[],\n): AppConversation[] {\n if (mode === \"all\") {\n return [...conversations];\n }\n if (mode === \"hide-automations\") {\n return conversations.filter(\n (conversation) => !isAutomationConversation(conversation),\n );\n }\n // \"only-automations\": an empty selection means every automation run, and a\n // selection that no longer intersects the available facets (stale names\n // persisted from another backend, renamed automations) degrades the same\n // way instead of yielding an unfillable empty list.\n const facetSet = new Set(availableFacets);\n const effectiveNames = selectedNames.filter((name) => facetSet.has(name));\n const narrowing = effectiveNames.length > 0 ? new Set(effectiveNames) : null;\n return conversations.filter((conversation) => {\n if (!isAutomationConversation(conversation)) {\n return false;\n }\n return (\n narrowing === null || narrowing.has(getAutomationNameFacet(conversation))\n );\n });\n}\n\n/**\n * Distinct user-facing `key=value` facets among the given conversations,\n * sorted A–Z for stable menu order. Reserved/internal tag keys are excluded\n * via `getDisplayConversationTags`; unlike the automation filter there is no\n * unnamed bucket — a conversation with no user tags simply yields no facet.\n */\nexport function collectTagFacets(\n conversations: readonly AppConversation[],\n): string[] {\n const facets = new Set<string>();\n for (const conversation of conversations) {\n for (const [key, value] of getDisplayConversationTags(conversation.tags)) {\n facets.add(`${key}=${value}`);\n }\n }\n return [...facets].sort((a, b) => a.localeCompare(b));\n}\n\n/**\n * Display form of a stored facet: a bare tag (empty value, stored as `key=`)\n * renders as just the key. Matching keeps the raw `key=value` form — this is\n * label-only.\n */\nexport function formatTagFacetLabel(facet: string): string {\n return facet.endsWith(\"=\") ? facet.slice(0, -1) : facet;\n}\n\n/**\n * Union semantics: a conversation matches when it carries ANY selected\n * facet, mirroring the automation multi-select. An empty selection — or one\n * that no longer intersects the available facets (tags edited away, stale\n * selections persisted from another backend) — leaves the list unfiltered\n * instead of yielding an unfillable empty list.\n */\nexport function applyTagConversationFilter(\n conversations: readonly AppConversation[],\n selectedFacets: readonly string[],\n availableFacets: readonly string[],\n): AppConversation[] {\n const facetSet = new Set(availableFacets);\n const effectiveFacets = selectedFacets.filter((facet) => facetSet.has(facet));\n if (effectiveFacets.length === 0) {\n return [...conversations];\n }\n const narrowing = new Set(effectiveFacets);\n return conversations.filter((conversation) =>\n getDisplayConversationTags(conversation.tags).some(([key, value]) =>\n narrowing.has(`${key}=${value}`),\n ),\n );\n}\n\n/** Subset of `useCreateConversation` variables for launching from a group row */\nexport type ConversationGroupLaunch = {\n workingDir?: string;\n repository?: {\n name: string;\n gitProvider: Provider;\n branch?: string;\n };\n};\n\nfunction buildGroupLaunch(\n id: string,\n backendKind: BackendKind,\n conversations: AppConversation[],\n): ConversationGroupLaunch {\n if (backendKind === \"local\") {\n if (id === \"__none_workspace\") {\n return {};\n }\n if (id.startsWith(\"ws:\")) {\n return { workingDir: id.slice(3) };\n }\n return {};\n }\n\n if (id === \"__none_repo\") {\n return {};\n }\n if (id.startsWith(\"repo:\")) {\n const name = id.slice(5);\n const sample = conversations[0];\n const gitProvider = (sample?.git_provider ?? \"github\") as Provider;\n const branch = sample?.selected_branch ?? \"main\";\n return {\n repository: {\n name,\n gitProvider,\n branch,\n },\n };\n }\n\n return {};\n}\n\nexport function parseConversationTimeMs(iso: string | undefined): number {\n if (!iso) return 0;\n const t = Date.parse(iso);\n return Number.isFinite(t) ? t : 0;\n}\n\nexport function sortConversationsByField(\n items: readonly AppConversation[],\n field: ConversationSortField,\n): AppConversation[] {\n const key = field === \"created\" ? \"created_at\" : \"updated_at\";\n return [...items].sort(\n (a, b) => parseConversationTimeMs(b[key]) - parseConversationTimeMs(a[key]),\n );\n}\n\nfunction workspaceGroup(conversation: AppConversation): {\n id: string;\n label: string;\n} {\n // Group by the user-selected workspace (a stable identifier shared by\n // every conversation launched from the same picker selection), not\n // `workspace.working_dir` — that field holds the per-conversation\n // worktree path the agent-server creates, which is unique per\n // conversation and would fragment the grouping.\n //\n // Normalize first, then check emptiness: inputs like \"/\", \"///\", or\n // \" ///\" trim+strip to \"\" and must fall back to the \"no workspace\"\n // bucket rather than producing a stray `ws:` group with no label.\n const normalized = conversation.selected_workspace\n ?.trim()\n .replace(/\\/+$/, \"\");\n if (!normalized) {\n return { id: \"__none_workspace\", label: \"\" };\n }\n const label = normalized.split(\"/\").filter(Boolean).pop() ?? normalized;\n return { id: `ws:${normalized}`, label };\n}\n\nfunction repositoryGroup(conversation: AppConversation): {\n id: string;\n label: string;\n} {\n // Mirror `workspaceGroup`'s normalize-then-check order so \"/\", \"///\",\n // and trailing-slash variants of the same repo all collapse to one\n // group instead of producing a stray `repo:/` bucket.\n const normalized = conversation.selected_repository\n ?.trim()\n .replace(/\\/+$/, \"\");\n if (!normalized) {\n return { id: \"__none_repo\", label: \"\" };\n }\n const parts = normalized.split(\"/\").filter(Boolean);\n const label = parts.length\n ? (parts[parts.length - 1] ?? normalized).replace(/\\.git$/, \"\")\n : normalized.replace(/\\.git$/, \"\");\n return { id: `repo:${normalized}`, label };\n}\n\n/**\n * Resolves the stable folder identity used by grouped conversation views.\n *\n * Keeping this shared with `groupConversations` lets pagination reason about\n * folder discovery without duplicating workspace/repository normalization.\n */\nfunction getConversationGroupIdentity(\n conversation: AppConversation,\n backendKind: BackendKind,\n): { id: string; label: string } {\n return backendKind === \"local\"\n ? workspaceGroup(conversation)\n : repositoryGroup(conversation);\n}\n\n/**\n * Max backend pages fetched for a single grouped \"Load more\" click. The\n * driver walks past pages that only deepen already-visible folders looking\n * for a new folder, and this cap prevents one click from walking the entire\n * remaining cursor when no undiscovered folder exists. Chronological mode is\n * not capped — it keeps its pre-existing fetch-until-visible behavior.\n */\nexport const MAX_PAGES_PER_LOAD_MORE_CLICK = 3;\n\n/**\n * Conversation IDs that belong on each folder's discovery page — the first\n * backend page where that folder appeared.\n *\n * Global \"Load more\" still discovers folders from later pages, but the\n * collapsed preview for an already-visible folder stays frozen to this set.\n * Expanding the folder reads the full grouped `conversations` array instead.\n * `forceIncludeConversationId` keeps the active thread in the preview even\n * when it landed on a non-discovery page.\n */\nexport function getGroupDiscoveryConversationIds(\n items: readonly AppConversation[],\n pageByConversationId: ReadonlyMap<string, number>,\n backendKind: BackendKind,\n options?: { forceIncludeConversationId?: string | null },\n): Set<string> {\n // Resolve each conversation's folder identity exactly once; both passes\n // below (finding each folder's discovery page, then collecting the ids on\n // that page) read from this record instead of re-running the\n // workspace/repository normalization.\n const resolved = items.map((conversation) => ({\n conversationId: conversation.id,\n groupId: getConversationGroupIdentity(conversation, backendKind).id,\n page: pageByConversationId.get(conversation.id) ?? 0,\n }));\n\n const discoveryPageByGroupId = new Map<string, number>();\n for (const { groupId, page } of resolved) {\n const currentDiscoveryPage = discoveryPageByGroupId.get(groupId);\n if (currentDiscoveryPage === undefined || page < currentDiscoveryPage) {\n discoveryPageByGroupId.set(groupId, page);\n }\n }\n\n const discoveryIds = new Set<string>();\n for (const { conversationId, groupId, page } of resolved) {\n if (page === discoveryPageByGroupId.get(groupId)) {\n discoveryIds.add(conversationId);\n }\n }\n\n const forceIncludeId = options?.forceIncludeConversationId;\n if (\n forceIncludeId != null &&\n items.some((conversation) => conversation.id === forceIncludeId)\n ) {\n discoveryIds.add(forceIncludeId);\n }\n\n return discoveryIds;\n}\n\nexport function groupConversations(\n items: readonly AppConversation[],\n backendKind: BackendKind,\n sortField: ConversationSortField,\n labels: { emptyWorkspace: string; emptyRepository: string },\n knownWorkspaces?: readonly LocalWorkspace[],\n): {\n id: string;\n label: string;\n conversations: AppConversation[];\n launch: ConversationGroupLaunch;\n}[] {\n const byId = new Map<\n string,\n { label: string; conversations: AppConversation[] }\n >();\n\n if (backendKind === \"local\" && knownWorkspaces) {\n for (const ws of knownWorkspaces) {\n const normalized = ws.path.trim().replace(/\\/+$/, \"\");\n if (normalized) {\n byId.set(`ws:${normalized}`, { label: ws.name, conversations: [] });\n }\n }\n }\n\n for (const c of items) {\n const { id, label: rawLabel } = getConversationGroupIdentity(\n c,\n backendKind,\n );\n const label =\n id === \"__none_workspace\"\n ? labels.emptyWorkspace\n : id === \"__none_repo\"\n ? labels.emptyRepository\n : rawLabel;\n const bucket = byId.get(id);\n if (bucket) {\n bucket.conversations.push(c);\n } else {\n byId.set(id, { label, conversations: [c] });\n }\n }\n\n const groups = [...byId.entries()].map(([id, g]) => {\n const conversations = sortConversationsByField(g.conversations, sortField);\n return {\n id,\n label: g.label,\n conversations,\n launch: buildGroupLaunch(id, backendKind, conversations),\n };\n });\n\n // Use reduce instead of `Math.max(...arr)` — the spread form would push\n // every conversation onto the call stack as a separate argument, which\n // hits JS engines' ~100k-arg limit on very large buckets.\n const groupOrderKey = (g: (typeof groups)[number]) =>\n g.conversations.reduce(\n (max, c) =>\n Math.max(\n max,\n parseConversationTimeMs(\n sortField === \"created\" ? c.created_at : c.updated_at,\n ),\n ),\n 0,\n );\n\n groups.sort((a, b) => groupOrderKey(b) - groupOrderKey(a));\n return groups;\n}\n\nexport function applyGroupFolderOrder<T extends { id: string }>(\n groups: readonly T[],\n order: readonly string[],\n): T[] {\n if (order.length === 0) {\n return [...groups];\n }\n\n const byId = new Map(groups.map((group) => [group.id, group]));\n const ordered: T[] = [];\n const seen = new Set<string>();\n\n for (const id of order) {\n const group = byId.get(id);\n if (group) {\n ordered.push(group);\n seen.add(id);\n }\n }\n\n for (const group of groups) {\n if (!seen.has(group.id)) {\n ordered.push(group);\n }\n }\n\n return ordered;\n}\n\nexport type GroupFolderDropPosition = \"before\" | \"after\";\n\nexport function moveGroupFolderOrder(\n order: readonly string[],\n groupIds: readonly string[],\n activeGroupId: string,\n targetGroupId: string,\n position: GroupFolderDropPosition = \"after\",\n): string[] {\n if (activeGroupId === targetGroupId) {\n return [...order];\n }\n\n const effectiveOrder = applyGroupFolderOrder(\n groupIds.map((id) => ({ id })),\n order,\n ).map((group) => group.id);\n const fromIndex = effectiveOrder.indexOf(activeGroupId);\n const toIndex = effectiveOrder.indexOf(targetGroupId);\n if (fromIndex < 0 || toIndex < 0) {\n return [...order];\n }\n\n const nextOrder = [...effectiveOrder];\n nextOrder.splice(fromIndex, 1);\n const adjustedTargetIndex = nextOrder.indexOf(targetGroupId);\n const insertIndex =\n position === \"before\" ? adjustedTargetIndex : adjustedTargetIndex + 1;\n nextOrder.splice(insertIndex, 0, activeGroupId);\n return nextOrder;\n}\n"],"mappings":"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"}
|
|
@@ -6,6 +6,22 @@ export type ConversationSortField = "created" | "updated";
|
|
|
6
6
|
export type ThreadScope = "all" | "relevant";
|
|
7
7
|
export type OrganizeMode = "grouped" | "chronological";
|
|
8
8
|
export type AutomationFilterMode = "all" | "hide-automations" | "only-automations";
|
|
9
|
+
export type OlderConversationCutoff = "1h" | "1d" | "7d" | "30d";
|
|
10
|
+
export declare const OLDER_CONVERSATION_CUTOFFS: readonly ["1h", "1d", "7d", "30d"];
|
|
11
|
+
export declare const DEFAULT_OLDER_CONVERSATION_CUTOFF: OlderConversationCutoff;
|
|
12
|
+
export declare const OLDER_CONVERSATION_CUTOFF_MS: Record<OlderConversationCutoff, number>;
|
|
13
|
+
export declare function isOlderConversationCutoff(value: unknown): value is OlderConversationCutoff;
|
|
14
|
+
/**
|
|
15
|
+
* Splits conversations by last update relative to `nowMs`. Missing or
|
|
16
|
+
* unparseable timestamps stay in `recent` so they are never hidden by the
|
|
17
|
+
* hide-older toggle.
|
|
18
|
+
*/
|
|
19
|
+
export declare function partitionByCutoff<T extends {
|
|
20
|
+
updated_at: string;
|
|
21
|
+
}>(items: readonly T[], cutoffMs: number, nowMs?: number): {
|
|
22
|
+
recent: T[];
|
|
23
|
+
older: T[];
|
|
24
|
+
};
|
|
9
25
|
/** Max conversations shown under a workspace/repo folder before "View more". */
|
|
10
26
|
export declare const GROUP_CONVERSATIONS_PREVIEW_LIMIT = 5;
|
|
11
27
|
interface GroupConversationPreviewOptions {
|
|
@@ -45,6 +61,27 @@ export declare function getAutomationNameFacet(conversation: AppConversation): s
|
|
|
45
61
|
*/
|
|
46
62
|
export declare function collectAutomationNameFacets(conversations: readonly AppConversation[]): string[];
|
|
47
63
|
export declare function applyAutomationConversationFilter(conversations: readonly AppConversation[], mode: AutomationFilterMode, selectedNames: readonly string[], availableFacets: readonly string[]): AppConversation[];
|
|
64
|
+
/**
|
|
65
|
+
* Distinct user-facing `key=value` facets among the given conversations,
|
|
66
|
+
* sorted A–Z for stable menu order. Reserved/internal tag keys are excluded
|
|
67
|
+
* via `getDisplayConversationTags`; unlike the automation filter there is no
|
|
68
|
+
* unnamed bucket — a conversation with no user tags simply yields no facet.
|
|
69
|
+
*/
|
|
70
|
+
export declare function collectTagFacets(conversations: readonly AppConversation[]): string[];
|
|
71
|
+
/**
|
|
72
|
+
* Display form of a stored facet: a bare tag (empty value, stored as `key=`)
|
|
73
|
+
* renders as just the key. Matching keeps the raw `key=value` form — this is
|
|
74
|
+
* label-only.
|
|
75
|
+
*/
|
|
76
|
+
export declare function formatTagFacetLabel(facet: string): string;
|
|
77
|
+
/**
|
|
78
|
+
* Union semantics: a conversation matches when it carries ANY selected
|
|
79
|
+
* facet, mirroring the automation multi-select. An empty selection — or one
|
|
80
|
+
* that no longer intersects the available facets (tags edited away, stale
|
|
81
|
+
* selections persisted from another backend) — leaves the list unfiltered
|
|
82
|
+
* instead of yielding an unfillable empty list.
|
|
83
|
+
*/
|
|
84
|
+
export declare function applyTagConversationFilter(conversations: readonly AppConversation[], selectedFacets: readonly string[], availableFacets: readonly string[]): AppConversation[];
|
|
48
85
|
/** Subset of `useCreateConversation` variables for launching from a group row */
|
|
49
86
|
export type ConversationGroupLaunch = {
|
|
50
87
|
workingDir?: string;
|