@openhands/agent-canvas 1.16.0 → 1.17.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-DrjNsPOH.js} +1 -1
- package/build/assets/active-backend-context-rZiLJRUc.js +2 -0
- package/build/assets/{agent-context-settings-DSZlXrLj.js → agent-context-settings-CJUrcBut.js} +1 -1
- package/build/assets/agent-profiles-service.api-Biieml2L.js +1 -0
- package/build/assets/agent-profiles-settings-x6RvPsq7.js +1 -0
- package/build/assets/agent-server-client-options-BikiNwTa.js +1 -0
- package/build/assets/agent-server-conversation-service.api-DYFsNHKf.js +88 -0
- package/build/assets/agent-settings-BJyovpJ_.js +1 -0
- package/build/assets/agent-settings-CpY3zObk.js +2 -0
- package/build/assets/{alert-banner-HP6mX-Vr.js → alert-banner-vARz1idS.js} +1 -1
- package/build/assets/{api-error-message-B-XdSk3b.js → api-error-message-Ve79qDcN.js} +1 -1
- package/build/assets/api-key-entry-screen-CsMuBhoP.js +1 -0
- package/build/assets/{app-settings-dbnneVaV.js → app-settings-BaJ7nfHt.js} +1 -1
- package/build/assets/automation-detail-CVoGDrKq.js +3 -0
- package/build/assets/{automation-export-D3a3of4G.js → automation-export-DxY47m3T.js} +1 -1
- package/build/assets/automation-git-sync-CRMP9Bbm.js +1 -0
- package/build/assets/automation-setup-route-072beLz1.js +3 -0
- package/build/assets/{automation-templates-BRppNh99.js → automation-templates-4C4PM8K7.js} +1 -1
- package/build/assets/automations-list-xuqTSQL4.js +1 -0
- package/build/assets/{back-nav-button-Cjl_hoxq.js → back-nav-button-B8tH0BEp.js} +1 -1
- package/build/assets/backend-form-modal-0aJmWdsa.js +1 -0
- package/build/assets/{backend-synced-settings-badge-DPkz30BE.js → backend-synced-settings-badge-B7rKWBir.js} +1 -1
- package/build/assets/{badge-BU3S0VtE.js → badge-CcGx2TaV.js} +1 -1
- package/build/assets/{base-modal-D_L0oEbG.js → base-modal-DTULovNc.js} +1 -1
- package/build/assets/bot-CLMxGFaq.js +1 -0
- package/build/assets/{brand-button-BAfk4wGP.js → brand-button-DxPO4Lf8.js} +1 -1
- package/build/assets/{browser-DSAo0tz1.js → browser-C-_qBasq.js} +2 -2
- package/build/assets/{browser-tab-C9vy56R5.js → browser-tab-DZanIw5m.js} +1 -1
- package/build/assets/{canvas-extension-page-dx1gFrfW.js → canvas-extension-page-o_cWgE9B.js} +1 -1
- package/build/assets/canvas-extensions-DSgNlCha.js +1 -0
- package/build/assets/{canvas-extensions-runtime-2_x5Ezmi.js → canvas-extensions-runtime-DdnkgJXV.js} +1 -1
- package/build/assets/{chat-send-button-MUQqCZCS.js → chat-send-button-B3SFSIg5.js} +1 -1
- package/build/assets/check-fDEfgSzj.js +1 -0
- package/build/assets/chevron-down-CFrWHqu8.js +1 -0
- package/build/assets/chevron-right-C5roOrJu.js +1 -0
- package/build/assets/circle-check-ClTzJTdb.js +1 -0
- package/build/assets/{circle-plus-check-toggle-BO_kFZt3.js → circle-plus-check-toggle-Fr-h-mbL.js} +1 -1
- package/build/assets/{cloud-funnel-analytics-CztBCCPp.js → cloud-funnel-analytics-BQanUEEC.js} +1 -1
- package/build/assets/{cog-D-MPQW6G.js → cog-VBlRo6iw.js} +1 -1
- package/build/assets/command-menu-BT3Ia5Ru.js +1 -0
- package/build/assets/commits-tab-2jhtaohl.js +1 -0
- package/build/assets/{condenser-settings-DmEOje-7.js → condenser-settings-eVKFMvap.js} +1 -1
- package/build/assets/confirmation-modal-gIFHeZt6.js +1 -0
- package/build/assets/{context-menu-list-item-I86vKcmM.js → context-menu-list-item-DDROe12Z.js} +1 -1
- package/build/assets/conversation-BnjJSFf5.js +93 -0
- package/build/assets/conversation-DZ578rOX.js +1 -0
- package/build/assets/conversation-panel-DZ578rOX.js +1 -0
- package/build/assets/{conversation-state-store-B0ImPLHO.js → conversation-state-store-D1_G_9I-.js} +1 -1
- package/build/assets/{conversation-store-Ca3ghXap.js → conversation-store-DVVfkCsk.js} +1 -1
- package/build/assets/{conversation-tab-empty-state-FIbh_lc8.js → conversation-tab-empty-state-DKlzAz5c.js} +1 -1
- package/build/assets/{copy-to-clipboard-button-Ca8iSkkA.js → copy-to-clipboard-button-B3w0X7WH.js} +1 -1
- package/build/assets/{device-verify-Bhn2e_Ye.js → device-verify-BfkCzyFB.js} +1 -1
- package/build/assets/{dropdown-classes-Bc1djN0-.js → dropdown-classes-B9kJVDIk.js} +1 -1
- package/build/assets/edit-automation-modal-BwhJ39JT.js +1 -0
- package/build/assets/empty-state-RZz0OfnY.js +1 -0
- package/build/assets/{entry.client-CqyPPjOq.js → entry.client-Ds8LVp-E.js} +2 -2
- package/build/assets/enum-filter-dropdown-C4pW0ORd.js +1 -0
- package/build/assets/{environment-switch-overlay-BmBRT7gv.js → environment-switch-overlay-P2ZAuzov.js} +1 -1
- package/build/assets/{error-state-Body8Ngd.js → error-state-B_5cgNPJ.js} +1 -1
- package/build/assets/extensions-hub-DsaUr4ca.js +1 -0
- package/build/assets/extensions-navigation-CRMZd-FE.js +1 -0
- package/build/assets/external-link-DQtv7eTh.js +1 -0
- package/build/assets/files-tab-CCgAcVdc.js +1 -0
- package/build/assets/{form-control-classes-Bkh5FGrD.js → form-control-classes-B-z85REi.js} +1 -1
- package/build/assets/get-git-path-EHrSDxTM.js +1 -0
- package/build/assets/git-repo-dropdown-D2WEQ97X.js +1 -0
- package/build/assets/{git-repo-dropdown-4ROKl2cB.js → git-repo-dropdown-DVeCUUXG.js} +1 -1
- package/build/assets/{highlighted-source-view-BFRxGT_Q.js → highlighted-source-view-DjHO3SdW.js} +1 -1
- package/build/assets/home-BorS_vdS.js +1 -0
- package/build/assets/home-aIMbHw5M.js +1 -0
- package/build/assets/home-automation-run-tooltip-CpHNFiFl.js +1 -0
- package/build/assets/home-store-DyXz0w6d.js +1 -0
- package/build/assets/hooks-service-C6dpRtZM.js +1 -0
- package/build/assets/index-home-zKFuKK2B.js +1 -0
- package/build/assets/info-CTIdjttz.js +1 -0
- package/build/assets/install-server-modal-DUiZMc8u.js +1 -0
- package/build/assets/kebab-menu-item-content-mm04SBD3.js +1 -0
- package/build/assets/{key-BmVyxs-2.js → key-CfXbJa8w.js} +1 -1
- package/build/assets/{launch-IrTDEFCs.js → launch-BSIf9KEg.js} +1 -1
- package/build/assets/list-filter-CNpqTWVY.js +1 -0
- package/build/assets/{list-todo-apgLVjMw.js → list-todo-ByXMdY4W.js} +1 -1
- package/build/assets/llm-not-configured-banner-z_QRSeV0.js +27 -0
- package/build/assets/llm-settings-B-5AHMiX.js +1 -0
- package/build/assets/llm-settings-B3SjHDmA.js +1 -0
- package/build/assets/llm-subscription-service-aDNBQ7Gq.js +1 -0
- package/build/assets/loader-circle-Dex47vVW.js +1 -0
- package/build/assets/{loading-spinner-BY9N3pOe.js → loading-spinner-DfHI77BA.js} +1 -1
- package/build/assets/manage-backends-modal-q1NdFisr.js +1 -0
- package/build/assets/manifest-8920b615.js +1 -0
- package/build/assets/{manifest-subpage-layout-CAOYzrYp.js → manifest-subpage-layout-BQQy5ipR.js} +1 -1
- package/build/assets/{map-provider-Cu3Zgumb.js → map-provider-DXvssjw9.js} +1 -1
- package/build/assets/markdown-renderer-rivLvYh-.js +8 -0
- package/build/assets/{mcp-BTs_SXfZ.js → mcp-CEXDhQWn.js} +1 -1
- package/build/assets/{mcp-marketplace-utils-AIBzzHTO.js → mcp-marketplace-utils-Cn_NIMWM.js} +1 -1
- package/build/assets/mcp-page-LGYIICMG.js +9 -0
- package/build/assets/messages-DUSeANAh.js +41 -0
- package/build/assets/{modal-body-BxZjsju9.js → modal-body-DJw4xBki.js} +1 -1
- package/build/assets/{modal-classes-C8eycCwG.js → modal-classes-Dg0ngBPO.js} +1 -1
- package/build/assets/{modal-close-button-DDzdRvCs.js → modal-close-button-B9j4nasm.js} +1 -1
- package/build/assets/{mouse-pointer-click-Co2uyaPA.js → mouse-pointer-click-DEhsSUpu.js} +1 -1
- package/build/assets/onboarding-BjFebfs5.js +1 -0
- package/build/assets/onboarding-modal-DDTjOpyd.js +1 -0
- package/build/assets/organization-service.api-Cyg1Tn03.js +1 -0
- package/build/assets/pencil-D5c47kyN.js +1 -0
- package/build/assets/pin-C7vMagvf.js +1 -0
- package/build/assets/planner-tab-D8f2Y3rn.js +1 -0
- package/build/assets/plug-CeaqeF6u.js +1 -0
- package/build/assets/plugins-management-service-Bh_pBuf-.js +1 -0
- package/build/assets/plus-B3wvU06-.js +1 -0
- package/build/assets/profiles-service.api-BbOK0EkF.js +1 -0
- package/build/assets/{providers-BhMcY5nv.js → providers-2gIIkz2N.js} +1 -1
- package/build/assets/proxy-CBgMd2zf.js +1 -0
- package/build/assets/{puzzle-JM_QaRm0.js → puzzle-DdAqbUrb.js} +1 -1
- package/build/assets/recommended-automations-launcher-YLAQTp4s.js +1 -0
- package/build/assets/refresh-cw-DEQdPCpH.js +1 -0
- package/build/assets/root-Bye_XmEL.js +2 -0
- package/build/assets/root-Cnwwzgo0.css +1 -0
- package/build/assets/root-layout-CSAwxBGM.js +2 -0
- package/build/assets/schema-field-CK0xYNbO.js +1 -0
- package/build/assets/scroll-fade-state-Dt_fx2kf.js +1 -0
- package/build/assets/sdk-section-page-Da73Rs_o.js +1 -0
- package/build/assets/secret-form-CB2VwYYg.js +1 -0
- package/build/assets/secrets-service-Cr8g8xuv.js +1 -0
- package/build/assets/{secrets-settings-B_GpxKW2.js → secrets-settings-Bh0udeKv.js} +1 -1
- package/build/assets/settings-DmyIgRxO.js +1 -0
- package/build/assets/{settings-dropdown-input-BcwylHs2.js → settings-dropdown-input-DVpyD87C.js} +1 -1
- package/build/assets/settings-index-BSJUFmjE.js +1 -0
- package/build/assets/{settings-input-Db-1g8Ql.js → settings-input-C0dd8Utu.js} +1 -1
- package/build/assets/{settings-list-classes-BzeSZbF2.js → settings-list-classes-Ds4jPBHK.js} +1 -1
- package/build/assets/{settings-modal-DfJ3tcJQ.js → settings-modal-yStgEh2o.js} +1 -1
- package/build/assets/settings-service.api-9_xdv_mh.js +1 -0
- package/build/assets/{settings-switch-CS-dJDmA.js → settings-switch-B78Khmyz.js} +1 -1
- package/build/assets/{settings-utils-UYpEdPuD.js → settings-utils-8GIIgOQL.js} +1 -1
- package/build/assets/shared-conversation-DM96X4KV.js +1 -0
- package/build/assets/shield-check-DO7wa_eu.js +1 -0
- package/build/assets/{sidebar-layout-D6fS8-Gl.js → sidebar-layout-EPfWxk11.js} +1 -1
- package/build/assets/sidebar-mobile-menu-toggle-D5GR5xT9.js +1 -0
- package/build/assets/{sidebar-nav-link-DQQcMf1A.js → sidebar-nav-link-_t4_Ef-9.js} +1 -1
- package/build/assets/{sidebar-onboarding-checklist-storage-BBkeI6Bp.js → sidebar-onboarding-checklist-storage-DbDX-Wvj.js} +1 -1
- package/build/assets/{sidebar-store-DGqHkVLw.js → sidebar-store-CSDFK0W5.js} +1 -1
- package/build/assets/{skill-card-pill-row-B27-xyig.js → skill-card-pill-row-989y15jV.js} +1 -1
- package/build/assets/{skill-filter-w__3UCEE.js → skill-filter-BBeZ4JEP.js} +1 -1
- package/build/assets/{skill-icon-badge-RQkq8wvl.js → skill-icon-badge-BDhQ-tQ0.js} +1 -1
- package/build/assets/skill-scope-Dz3kPH3P.js +1 -0
- package/build/assets/skills-plugins-e3CYGdUJ.js +1 -0
- package/build/assets/skills-settings-3e-FuHw_.js +1 -0
- package/build/assets/styled-tooltip-Pd22BIvr.js +1 -0
- package/build/assets/{task-list-tab-C5zcaktH.js → task-list-tab-3Jg8ywch.js} +1 -1
- package/build/assets/{terminal-CNElN42a.js → terminal-onXx0_Qz.js} +2 -2
- package/build/assets/toggle-switch-lwQtxDcm.js +1 -0
- package/build/assets/trash-2-ZhKuTLiz.js +1 -0
- package/build/assets/trash-B6OIe4yX.js +1 -0
- package/build/assets/triangle-alert-BajLPpQg.js +1 -0
- package/build/assets/{typography-v1KN0tzi.js → typography-HLLg_FAn.js} +1 -1
- package/build/assets/usage-tab-Cm-9j3UK.js +1 -0
- package/build/assets/use-acp-credential-form-BARcvjYE.js +1 -0
- package/build/assets/use-activate-agent-profile-BLKML6vQ.js +1 -0
- package/build/assets/use-agent-profiles-1P91KSXz.js +1 -0
- package/build/assets/{use-automation-health-E6NZi9rb.js → use-automation-health-BZkQNEA8.js} +1 -1
- package/build/assets/use-automation-permissions-B_RpvL-s.js +1 -0
- package/build/assets/{use-automations-xijQKIl9.js → use-automations-Cg0PDIZr.js} +1 -1
- package/build/assets/{use-can-manage-org-profiles-CrJP5262.js → use-can-manage-org-profiles-BbN6KfDr.js} +1 -1
- package/build/assets/use-canvas-extensions-CFUpHat6.js +1 -0
- package/build/assets/{use-cloud-current-user-id-CDfAHpPX.js → use-cloud-current-user-id-Dk0rjr63.js} +1 -1
- package/build/assets/use-config-DpafU_QP.js +1 -0
- package/build/assets/use-create-conversation-1YgmAHt-.js +1 -0
- package/build/assets/use-create-secret-D8p9ybQj.js +1 -0
- package/build/assets/{use-get-secrets-K3jmk-LH.js → use-get-secrets-CQ4b0qK8.js} +1 -1
- package/build/assets/use-is-authed-BRPjCRKM.js +1 -0
- package/build/assets/{use-launch-skill-in-chat-BYjYihBP.js → use-launch-skill-in-chat-DeYa1tFM.js} +1 -1
- package/build/assets/use-llm-configured-DGm8FiRR.js +1 -0
- package/build/assets/use-llm-profiles-BTTtpW4z.js +1 -0
- package/build/assets/use-manifest-capabilities-AOWGcu0j.js +1 -0
- package/build/assets/use-onboarding-completion-CoINurkm.js +1 -0
- package/build/assets/use-pinned-home-route-D6krwXjy.js +1 -0
- package/build/assets/use-plugins-marketplace-mLsIDhBv.js +1 -0
- package/build/assets/use-save-agent-profile-CxyO9YG-.js +1 -0
- package/build/assets/{use-save-settings-DYqkKv7T.js → use-save-settings-3U5K9-8x.js} +1 -1
- package/build/assets/use-settings-Dn00UISA.js +1 -0
- package/build/assets/use-settings-nav-items-vrjxTqcu.js +16 -0
- package/build/assets/use-tracking-B9prBsrq.js +3 -0
- package/build/assets/{use-user-conversation-B9Gebw_g.js → use-user-conversation-ZWlXtbZb.js} +1 -1
- package/build/assets/{useInfiniteQuery-C926xzY4.js → useInfiniteQuery-BzrRqjLg.js} +1 -1
- package/build/assets/{useMutation-B-qc391N.js → useMutation-CJuK90oc.js} +1 -1
- package/build/assets/{useQueries-DlbhlH9I.js → useQueries-CykmpT-a.js} +1 -1
- package/build/assets/{useQuery-BSTgq1rl.js → useQuery-S6j94er1.js} +1 -1
- package/build/assets/utils-BOco8mxR.js +1 -0
- package/build/assets/{vendor~conversation-panel~conversation-C8Fn4XOf.js → vendor~conversation-panel~conversation-4eJ0tml3.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-BfkNGovw.js +185 -0
- package/build/assets/{vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-rfV8mQ9m.js → vendor~entry.client~root~root-layout~index-home~home~conversation-panel~conversation~launch~ew9ih1s8-DnDoaYNi.js} +1 -1
- package/build/assets/{vendor~index-home~home~conversation-panel~conversation-hWywRBaR.js → vendor~index-home~home~conversation-panel~conversation-CSFLzmTN.js} +1 -1
- package/build/assets/vendor~root-layout-n8XCEXG8.js +1 -0
- package/build/assets/{vendor~root-layout~conversation-panel~conversation-BMbMgaGu.js → vendor~root-layout~conversation-panel~conversation-3Idg1_U3.js} +1 -1
- package/build/assets/{vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-BWir3rJs.js → vendor~root-layout~conversation-panel~conversation~skills-settings~automations-list~shared-~bovqqk8e-DkPlXWl9.js} +1 -1
- package/build/assets/{vendor~root-layout~index-home~home~conversation-panel~conversation-j5MFqfSy.js → vendor~root-layout~index-home~home~conversation-panel~conversation-DgQ564nC.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~extensions-h~iyia17eu-CV850oio.js +1 -0
- 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-BPjI-atc.js} +12 -6
- package/build/assets/{verification-settings-gw_q6vkL.js → verification-settings-u2POabjH.js} +1 -1
- package/build/assets/{wrench-CUEI1krB.js → wrench-CkgI4rxA.js} +1 -1
- package/build/assets/x-By6qCmtY.js +1 -0
- package/build/index.html +4 -4
- package/build/locales/ar/openhands.json +73 -20
- package/build/locales/ca/openhands.json +73 -20
- package/build/locales/de/openhands.json +73 -20
- package/build/locales/en/openhands.json +73 -20
- package/build/locales/es/openhands.json +73 -20
- package/build/locales/fr/openhands.json +73 -20
- package/build/locales/it/openhands.json +73 -20
- package/build/locales/ja/openhands.json +73 -20
- package/build/locales/ko-KR/openhands.json +73 -20
- package/build/locales/no/openhands.json +73 -20
- package/build/locales/pt/openhands.json +73 -20
- package/build/locales/tr/openhands.json +73 -20
- package/build/locales/uk/openhands.json +73 -20
- package/build/locales/zh-CN/openhands.json +73 -20
- package/build/locales/zh-TW/openhands.json +73 -20
- 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/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/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 +100 -94
- 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 +88 -77
- package/dist/components/features/automations/automation-list-row.js.map +1 -1
- package/dist/components/features/automations/detail/detail-header.d.ts +3 -1
- 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 +133 -122
- 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/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/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/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-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/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/manifest/manifest-form-field.d.ts +3 -1
- package/dist/components/features/manifest/manifest-review-step.d.ts +3 -1
- 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.js +5 -3
- 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 +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 +3 -1
- package/dist/components/features/sidebar/sidebar-rail-body.js +156 -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 +44 -43
- 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/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/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.js +27 -27
- 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/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/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-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-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.js +1 -0
- 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 +65 -12
- 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 +1196 -295
- package/dist/i18n/translation.js.map +1 -1
- package/dist/locales/ar/openhands.json +73 -20
- package/dist/locales/ca/openhands.json +73 -20
- package/dist/locales/de/openhands.json +73 -20
- package/dist/locales/en/openhands.json +73 -20
- package/dist/locales/es/openhands.json +73 -20
- package/dist/locales/fr/openhands.json +73 -20
- package/dist/locales/it/openhands.json +73 -20
- package/dist/locales/ja/openhands.json +73 -20
- package/dist/locales/ko-KR/openhands.json +73 -20
- package/dist/locales/no/openhands.json +73 -20
- package/dist/locales/pt/openhands.json +73 -20
- package/dist/locales/tr/openhands.json +73 -20
- package/dist/locales/uk/openhands.json +73 -20
- package/dist/locales/zh-CN/openhands.json +73 -20
- package/dist/locales/zh-TW/openhands.json +73 -20
- 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.js +5 -5
- 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 +88 -87
- 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/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/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/api-key-entry-screen-qTzrmJcr.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/bot-dMYHVfYM.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/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/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/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/get-git-path-ChKDVHZp.js +0 -1
- package/build/assets/git-repo-dropdown-BkqzkMmM.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/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/markdown-renderer-BzTlxI8x.js +0 -8
- package/build/assets/mcp-page-BEBYqH_K.js +0 -9
- package/build/assets/messages-DKV9cRc2.js +0 -41
- 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/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/settings-C0EWuBtA.js +0 -1
- package/build/assets/settings-index-5w5UW2K3.js +0 -1
- package/build/assets/settings-service.api-DJ1r62Zr.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/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/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/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~root-layout-C9Ju9DQg.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
|
@@ -1,11 +1,16 @@
|
|
|
1
|
-
import { type AutomationFilterMode, type ConversationSortField, type OrganizeMode, type ThreadScope } from "#/components/features/conversation-panel/conversation-panel-list-helpers";
|
|
1
|
+
import { type AutomationFilterMode, type ConversationSortField, type OlderConversationCutoff, type OrganizeMode, type ThreadScope } from "#/components/features/conversation-panel/conversation-panel-list-helpers";
|
|
2
2
|
/**
|
|
3
3
|
* User-toggleable display preferences for the sidebar conversation list
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* so the menu state
|
|
4
|
+
* (the layouts menu and the advanced-options modal behind it). These are
|
|
5
|
+
* intentionally persisted to localStorage (via the same `zustand/persist`
|
|
6
|
+
* pattern used by `home-store` and `workspaces-store`) so the menu state
|
|
7
|
+
* survives full reloads.
|
|
7
8
|
*
|
|
8
|
-
*
|
|
9
|
+
* Every persisted narrowing field must have a control that can see and undo
|
|
10
|
+
* it, or a reload silently hides conversations with nothing on screen to say
|
|
11
|
+
* why — see `ConversationActiveTagFilters`.
|
|
12
|
+
*
|
|
13
|
+
* To add a new preference exposed by those menus:
|
|
9
14
|
* 1. Add a field here with a sensible default in `initialState`.
|
|
10
15
|
* 2. Add matching `setX`/`toggleX` actions below.
|
|
11
16
|
* 3. Read/write through the store in `conversation-panel.tsx`.
|
|
@@ -14,6 +19,11 @@ import { type AutomationFilterMode, type ConversationSortField, type OrganizeMod
|
|
|
14
19
|
*/
|
|
15
20
|
interface ConversationPanelPreferencesState {
|
|
16
21
|
showOlderConversations: boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Age threshold used when `showOlderConversations` is false. Conversations
|
|
24
|
+
* last updated before this interval are hidden.
|
|
25
|
+
*/
|
|
26
|
+
olderConversationCutoff: OlderConversationCutoff;
|
|
17
27
|
showArchivedConversations: boolean;
|
|
18
28
|
showRepoBranchMetadata: boolean;
|
|
19
29
|
showLlmProfiles: boolean;
|
|
@@ -24,11 +34,16 @@ interface ConversationPanelPreferencesState {
|
|
|
24
34
|
threadScope: ThreadScope;
|
|
25
35
|
automationFilterMode: AutomationFilterMode;
|
|
26
36
|
selectedAutomationNames: string[];
|
|
37
|
+
selectedTagFacets: string[];
|
|
27
38
|
groupFolderOrder: string[];
|
|
28
39
|
}
|
|
40
|
+
/** The complete preference bundle controlled by conversation layout presets. */
|
|
41
|
+
export type LayoutSettingsSlice = Pick<ConversationPanelPreferencesState, "organizeMode" | "conversationSort" | "threadScope" | "showOlderConversations" | "showRepoBranchMetadata" | "showLlmProfiles" | "showTagsMetadata" | "showHoverMetadata">;
|
|
42
|
+
export declare const DEFAULT_LAYOUT_SETTINGS: LayoutSettingsSlice;
|
|
29
43
|
interface ConversationPanelPreferencesActions {
|
|
30
44
|
setShowOlderConversations: (value: boolean) => void;
|
|
31
45
|
toggleShowOlderConversations: () => void;
|
|
46
|
+
setOlderConversationCutoff: (value: OlderConversationCutoff) => void;
|
|
32
47
|
setShowArchivedConversations: (value: boolean) => void;
|
|
33
48
|
toggleShowArchivedConversations: () => void;
|
|
34
49
|
setShowRepoBranchMetadata: (value: boolean) => void;
|
|
@@ -44,6 +59,18 @@ interface ConversationPanelPreferencesActions {
|
|
|
44
59
|
setThreadScope: (value: ThreadScope) => void;
|
|
45
60
|
setAutomationFilterMode: (value: AutomationFilterMode) => void;
|
|
46
61
|
toggleAutomationName: (name: string) => void;
|
|
62
|
+
/**
|
|
63
|
+
* Clears both facet selections (tags and automation names) — the two
|
|
64
|
+
* narrowings the active-filter strip renders as chips.
|
|
65
|
+
*
|
|
66
|
+
* Deliberately leaves `automationFilterMode` alone: the strip shows no chip
|
|
67
|
+
* for the mode, and it must not silently switch a surface it doesn't show.
|
|
68
|
+
* The mode keeps its own rows in the advanced-options modal.
|
|
69
|
+
*/
|
|
70
|
+
clearFilterSelections: () => void;
|
|
71
|
+
toggleTagFacet: (facet: string) => void;
|
|
72
|
+
/** Applies a layout preset's partial bundle in one set(). */
|
|
73
|
+
applyLayoutSettings: (settings: Partial<LayoutSettingsSlice>) => void;
|
|
47
74
|
setGroupFolderOrder: (order: readonly string[]) => void;
|
|
48
75
|
}
|
|
49
76
|
type ConversationPanelPreferencesStore = ConversationPanelPreferencesState & ConversationPanelPreferencesActions;
|
|
@@ -1,23 +1,29 @@
|
|
|
1
1
|
import { create as e } from "../node_modules/zustand/esm/react.js";
|
|
2
2
|
import { createJSONStorage as t, persist as n } from "../node_modules/zustand/esm/middleware.js";
|
|
3
|
+
import { isOlderConversationCutoff as r } from "../components/features/conversation-panel/conversation-panel-list-helpers.js";
|
|
3
4
|
//#region src/stores/conversation-panel-preferences-store.ts
|
|
4
|
-
var
|
|
5
|
-
showOlderConversations: !0,
|
|
6
|
-
showArchivedConversations: !1,
|
|
7
|
-
showRepoBranchMetadata: !1,
|
|
8
|
-
showLlmProfiles: !1,
|
|
9
|
-
showTagsMetadata: !1,
|
|
10
|
-
showHoverMetadata: !0,
|
|
5
|
+
var i = {
|
|
11
6
|
organizeMode: "chronological",
|
|
12
7
|
conversationSort: "updated",
|
|
13
8
|
threadScope: "all",
|
|
9
|
+
showOlderConversations: !0,
|
|
10
|
+
showRepoBranchMetadata: !1,
|
|
11
|
+
showLlmProfiles: !1,
|
|
12
|
+
showTagsMetadata: !0,
|
|
13
|
+
showHoverMetadata: !0
|
|
14
|
+
}, a = {
|
|
15
|
+
...i,
|
|
16
|
+
olderConversationCutoff: "7d",
|
|
17
|
+
showArchivedConversations: !1,
|
|
14
18
|
automationFilterMode: "all",
|
|
15
19
|
selectedAutomationNames: [],
|
|
20
|
+
selectedTagFacets: [],
|
|
16
21
|
groupFolderOrder: []
|
|
17
|
-
},
|
|
18
|
-
...
|
|
22
|
+
}, o = e()(n((e) => ({
|
|
23
|
+
...a,
|
|
19
24
|
setShowOlderConversations: (t) => e(() => ({ showOlderConversations: t })),
|
|
20
25
|
toggleShowOlderConversations: () => e((e) => ({ showOlderConversations: !e.showOlderConversations })),
|
|
26
|
+
setOlderConversationCutoff: (t) => e(() => ({ olderConversationCutoff: r(t) ? t : "7d" })),
|
|
21
27
|
setShowArchivedConversations: (t) => e(() => ({ showArchivedConversations: t })),
|
|
22
28
|
toggleShowArchivedConversations: () => e((e) => ({ showArchivedConversations: !e.showArchivedConversations })),
|
|
23
29
|
setShowRepoBranchMetadata: (t) => e(() => ({ showRepoBranchMetadata: t })),
|
|
@@ -31,14 +37,24 @@ var r = {
|
|
|
31
37
|
setOrganizeMode: (t) => e(() => ({ organizeMode: t })),
|
|
32
38
|
setConversationSort: (t) => e(() => ({ conversationSort: t })),
|
|
33
39
|
setThreadScope: (t) => e(() => ({ threadScope: t })),
|
|
34
|
-
setAutomationFilterMode: (t) => e(() => ({
|
|
40
|
+
setAutomationFilterMode: (t) => e((e) => ({
|
|
41
|
+
automationFilterMode: t,
|
|
42
|
+
selectedAutomationNames: t === "only-automations" ? e.selectedAutomationNames : []
|
|
43
|
+
})),
|
|
35
44
|
toggleAutomationName: (t) => e((e) => ({ selectedAutomationNames: e.selectedAutomationNames.includes(t) ? e.selectedAutomationNames.filter((e) => e !== t) : [...e.selectedAutomationNames, t] })),
|
|
36
|
-
|
|
45
|
+
clearFilterSelections: () => e(() => ({
|
|
46
|
+
selectedTagFacets: [],
|
|
47
|
+
selectedAutomationNames: []
|
|
48
|
+
})),
|
|
49
|
+
toggleTagFacet: (t) => e((e) => ({ selectedTagFacets: e.selectedTagFacets.includes(t) ? e.selectedTagFacets.filter((e) => e !== t) : [...e.selectedTagFacets, t] })),
|
|
50
|
+
setGroupFolderOrder: (t) => e(() => ({ groupFolderOrder: [...t] })),
|
|
51
|
+
applyLayoutSettings: (t) => e(() => ({ ...t }))
|
|
37
52
|
}), {
|
|
38
53
|
name: "conversation-panel-preferences",
|
|
39
54
|
storage: t(() => localStorage),
|
|
40
55
|
partialize: (e) => ({
|
|
41
56
|
showOlderConversations: e.showOlderConversations,
|
|
57
|
+
olderConversationCutoff: r(e.olderConversationCutoff) ? e.olderConversationCutoff : "7d",
|
|
42
58
|
showArchivedConversations: e.showArchivedConversations,
|
|
43
59
|
showRepoBranchMetadata: e.showRepoBranchMetadata,
|
|
44
60
|
showLlmProfiles: e.showLlmProfiles,
|
|
@@ -49,10 +65,11 @@ var r = {
|
|
|
49
65
|
threadScope: e.threadScope,
|
|
50
66
|
automationFilterMode: e.automationFilterMode,
|
|
51
67
|
selectedAutomationNames: e.selectedAutomationNames,
|
|
68
|
+
selectedTagFacets: e.selectedTagFacets,
|
|
52
69
|
groupFolderOrder: e.groupFolderOrder
|
|
53
70
|
})
|
|
54
71
|
}));
|
|
55
72
|
//#endregion
|
|
56
|
-
export { i as useConversationPanelPreferencesStore };
|
|
73
|
+
export { i as DEFAULT_LAYOUT_SETTINGS, o as useConversationPanelPreferencesStore };
|
|
57
74
|
|
|
58
75
|
//# sourceMappingURL=conversation-panel-preferences-store.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-panel-preferences-store.js","names":[],"sources":["../../src/stores/conversation-panel-preferences-store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { persist, createJSONStorage } from \"zustand/middleware\";\nimport {\n type AutomationFilterMode,\n type ConversationSortField,\n type OrganizeMode,\n type ThreadScope,\n} from \"#/components/features/conversation-panel/conversation-panel-list-helpers\";\n\n/**\n * User-toggleable display preferences for the sidebar conversation list\n * filter menu. These are intentionally persisted to localStorage (via the\n * same `zustand/persist` pattern used by `home-store` and `workspaces-store`)\n * so the menu state survives full reloads.\n *\n * To add a new preference exposed by the filter menu:\n * 1. Add a field here with a sensible default in `initialState`.\n * 2. Add matching `setX`/`toggleX` actions below.\n * 3. Read/write through the store in `conversation-panel.tsx`.\n * No additional plumbing (storage keys, sanitization, etc.) is required —\n * `persist` handles migration of unknown fields gracefully.\n */\ninterface ConversationPanelPreferencesState {\n showOlderConversations: boolean;\n showArchivedConversations: boolean;\n showRepoBranchMetadata: boolean;\n showLlmProfiles: boolean;\n showTagsMetadata: boolean;\n showHoverMetadata: boolean;\n organizeMode: OrganizeMode;\n conversationSort: ConversationSortField;\n threadScope: ThreadScope;\n automationFilterMode: AutomationFilterMode;\n selectedAutomationNames: string[];\n groupFolderOrder: string[];\n}\n\ninterface ConversationPanelPreferencesActions {\n setShowOlderConversations: (value: boolean) => void;\n toggleShowOlderConversations: () => void;\n setShowArchivedConversations: (value: boolean) => void;\n toggleShowArchivedConversations: () => void;\n setShowRepoBranchMetadata: (value: boolean) => void;\n toggleShowRepoBranchMetadata: () => void;\n setShowLlmProfiles: (value: boolean) => void;\n toggleShowLlmProfiles: () => void;\n setShowTagsMetadata: (value: boolean) => void;\n toggleShowTagsMetadata: () => void;\n setShowHoverMetadata: (value: boolean) => void;\n toggleShowHoverMetadata: () => void;\n setOrganizeMode: (value: OrganizeMode) => void;\n setConversationSort: (value: ConversationSortField) => void;\n setThreadScope: (value: ThreadScope) => void;\n setAutomationFilterMode: (value: AutomationFilterMode) => void;\n toggleAutomationName: (name: string) => void;\n setGroupFolderOrder: (order: readonly string[]) => void;\n}\n\ntype ConversationPanelPreferencesStore = ConversationPanelPreferencesState &\n ConversationPanelPreferencesActions;\n\nconst initialState: ConversationPanelPreferencesState = {\n showOlderConversations: true,\n showArchivedConversations: false,\n showRepoBranchMetadata: false,\n showLlmProfiles: false,\n showTagsMetadata: false,\n showHoverMetadata: true,\n organizeMode: \"chronological\",\n conversationSort: \"updated\",\n threadScope: \"all\",\n automationFilterMode: \"all\",\n selectedAutomationNames: [],\n groupFolderOrder: [],\n};\n\nexport const useConversationPanelPreferencesStore =\n create<ConversationPanelPreferencesStore>()(\n persist(\n (set) => ({\n ...initialState,\n\n setShowOlderConversations: (value) =>\n set(() => ({ showOlderConversations: value })),\n toggleShowOlderConversations: () =>\n set((state) => ({\n showOlderConversations: !state.showOlderConversations,\n })),\n\n setShowArchivedConversations: (value) =>\n set(() => ({ showArchivedConversations: value })),\n toggleShowArchivedConversations: () =>\n set((state) => ({\n showArchivedConversations: !state.showArchivedConversations,\n })),\n\n setShowRepoBranchMetadata: (value) =>\n set(() => ({ showRepoBranchMetadata: value })),\n toggleShowRepoBranchMetadata: () =>\n set((state) => ({\n showRepoBranchMetadata: !state.showRepoBranchMetadata,\n })),\n\n setShowLlmProfiles: (value) => set(() => ({ showLlmProfiles: value })),\n toggleShowLlmProfiles: () =>\n set((state) => ({\n showLlmProfiles: !state.showLlmProfiles,\n })),\n\n setShowTagsMetadata: (value) =>\n set(() => ({ showTagsMetadata: value })),\n toggleShowTagsMetadata: () =>\n set((state) => ({\n showTagsMetadata: !state.showTagsMetadata,\n })),\n\n setShowHoverMetadata: (value) =>\n set(() => ({ showHoverMetadata: value })),\n toggleShowHoverMetadata: () =>\n set((state) => ({\n showHoverMetadata: !state.showHoverMetadata,\n })),\n\n setOrganizeMode: (value) => set(() => ({ organizeMode: value })),\n setConversationSort: (value) =>\n set(() => ({ conversationSort: value })),\n setThreadScope: (value) => set(() => ({ threadScope: value })),\n setAutomationFilterMode: (value) =>\n set(() => ({ automationFilterMode: value })),\n toggleAutomationName: (name) =>\n set((state) => ({\n selectedAutomationNames: state.selectedAutomationNames.includes(\n name,\n )\n ? state.selectedAutomationNames.filter(\n (existing) => existing !== name,\n )\n : [...state.selectedAutomationNames, name],\n })),\n setGroupFolderOrder: (order) =>\n set(() => ({ groupFolderOrder: [...order] })),\n }),\n {\n name: \"conversation-panel-preferences\",\n storage: createJSONStorage(() => localStorage),\n // Only persist the data fields — actions are recreated on each load.\n partialize: (state): ConversationPanelPreferencesState => ({\n showOlderConversations: state.showOlderConversations,\n showArchivedConversations: state.showArchivedConversations,\n showRepoBranchMetadata: state.showRepoBranchMetadata,\n showLlmProfiles: state.showLlmProfiles,\n showTagsMetadata: state.showTagsMetadata,\n showHoverMetadata: state.showHoverMetadata,\n organizeMode: state.organizeMode,\n conversationSort: state.conversationSort,\n threadScope: state.threadScope,\n automationFilterMode: state.automationFilterMode,\n selectedAutomationNames: state.selectedAutomationNames,\n groupFolderOrder: state.groupFolderOrder,\n }),\n },\n ),\n );\n"],"mappings":";;;AA6DA,IAAM,IAAkD;CACtD,wBAAwB;CACxB,2BAA2B;CAC3B,wBAAwB;CACxB,iBAAiB;CACjB,kBAAkB;CAClB,mBAAmB;CACnB,cAAc;CACd,kBAAkB;CAClB,aAAa;CACb,sBAAsB;CACtB,yBAAyB,CAAC;CAC1B,kBAAkB,CAAC;AACrB,GAEa,IACX,EAA0C,EACxC,GACG,OAAS;CACR,GAAG;CAEH,4BAA4B,MAC1B,SAAW,EAAE,wBAAwB,EAAM,EAAE;CAC/C,oCACE,GAAK,OAAW,EACd,wBAAwB,CAAC,EAAM,uBACjC,EAAE;CAEJ,+BAA+B,MAC7B,SAAW,EAAE,2BAA2B,EAAM,EAAE;CAClD,uCACE,GAAK,OAAW,EACd,2BAA2B,CAAC,EAAM,0BACpC,EAAE;CAEJ,4BAA4B,MAC1B,SAAW,EAAE,wBAAwB,EAAM,EAAE;CAC/C,oCACE,GAAK,OAAW,EACd,wBAAwB,CAAC,EAAM,uBACjC,EAAE;CAEJ,qBAAqB,MAAU,SAAW,EAAE,iBAAiB,EAAM,EAAE;CACrE,6BACE,GAAK,OAAW,EACd,iBAAiB,CAAC,EAAM,gBAC1B,EAAE;CAEJ,sBAAsB,MACpB,SAAW,EAAE,kBAAkB,EAAM,EAAE;CACzC,8BACE,GAAK,OAAW,EACd,kBAAkB,CAAC,EAAM,iBAC3B,EAAE;CAEJ,uBAAuB,MACrB,SAAW,EAAE,mBAAmB,EAAM,EAAE;CAC1C,+BACE,GAAK,OAAW,EACd,mBAAmB,CAAC,EAAM,kBAC5B,EAAE;CAEJ,kBAAkB,MAAU,SAAW,EAAE,cAAc,EAAM,EAAE;CAC/D,sBAAsB,MACpB,SAAW,EAAE,kBAAkB,EAAM,EAAE;CACzC,iBAAiB,MAAU,SAAW,EAAE,aAAa,EAAM,EAAE;CAC7D,0BAA0B,MACxB,SAAW,EAAE,sBAAsB,EAAM,EAAE;CAC7C,uBAAuB,MACrB,GAAK,OAAW,EACd,yBAAyB,EAAM,wBAAwB,SACrD,CACF,IACI,EAAM,wBAAwB,QAC3B,MAAa,MAAa,CAC7B,IACA,CAAC,GAAG,EAAM,yBAAyB,CAAI,EAC7C,EAAE;CACJ,sBAAsB,MACpB,SAAW,EAAE,kBAAkB,CAAC,GAAG,CAAK,EAAE,EAAE;AAChD,IACA;CACE,MAAM;CACN,SAAS,QAAwB,YAAY;CAE7C,aAAa,OAA8C;EACzD,wBAAwB,EAAM;EAC9B,2BAA2B,EAAM;EACjC,wBAAwB,EAAM;EAC9B,iBAAiB,EAAM;EACvB,kBAAkB,EAAM;EACxB,mBAAmB,EAAM;EACzB,cAAc,EAAM;EACpB,kBAAkB,EAAM;EACxB,aAAa,EAAM;EACnB,sBAAsB,EAAM;EAC5B,yBAAyB,EAAM;EAC/B,kBAAkB,EAAM;CAC1B;AACF,CACF,CACF"}
|
|
1
|
+
{"version":3,"file":"conversation-panel-preferences-store.js","names":[],"sources":["../../src/stores/conversation-panel-preferences-store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { persist, createJSONStorage } from \"zustand/middleware\";\nimport {\n DEFAULT_OLDER_CONVERSATION_CUTOFF,\n isOlderConversationCutoff,\n type AutomationFilterMode,\n type ConversationSortField,\n type OlderConversationCutoff,\n type OrganizeMode,\n type ThreadScope,\n} from \"#/components/features/conversation-panel/conversation-panel-list-helpers\";\n\n/**\n * User-toggleable display preferences for the sidebar conversation list\n * (the layouts menu and the advanced-options modal behind it). These are\n * intentionally persisted to localStorage (via the same `zustand/persist`\n * pattern used by `home-store` and `workspaces-store`) so the menu state\n * survives full reloads.\n *\n * Every persisted narrowing field must have a control that can see and undo\n * it, or a reload silently hides conversations with nothing on screen to say\n * why — see `ConversationActiveTagFilters`.\n *\n * To add a new preference exposed by those menus:\n * 1. Add a field here with a sensible default in `initialState`.\n * 2. Add matching `setX`/`toggleX` actions below.\n * 3. Read/write through the store in `conversation-panel.tsx`.\n * No additional plumbing (storage keys, sanitization, etc.) is required —\n * `persist` handles migration of unknown fields gracefully.\n */\ninterface ConversationPanelPreferencesState {\n showOlderConversations: boolean;\n /**\n * Age threshold used when `showOlderConversations` is false. Conversations\n * last updated before this interval are hidden.\n */\n olderConversationCutoff: OlderConversationCutoff;\n showArchivedConversations: boolean;\n showRepoBranchMetadata: boolean;\n showLlmProfiles: boolean;\n showTagsMetadata: boolean;\n showHoverMetadata: boolean;\n organizeMode: OrganizeMode;\n conversationSort: ConversationSortField;\n threadScope: ThreadScope;\n automationFilterMode: AutomationFilterMode;\n selectedAutomationNames: string[];\n selectedTagFacets: string[];\n groupFolderOrder: string[];\n}\n\n/** The complete preference bundle controlled by conversation layout presets. */\nexport type LayoutSettingsSlice = Pick<\n ConversationPanelPreferencesState,\n | \"organizeMode\"\n | \"conversationSort\"\n | \"threadScope\"\n | \"showOlderConversations\"\n | \"showRepoBranchMetadata\"\n | \"showLlmProfiles\"\n | \"showTagsMetadata\"\n | \"showHoverMetadata\"\n>;\n\nexport const DEFAULT_LAYOUT_SETTINGS: LayoutSettingsSlice = {\n organizeMode: \"chronological\",\n conversationSort: \"updated\",\n threadScope: \"all\",\n showOlderConversations: true,\n showRepoBranchMetadata: false,\n showLlmProfiles: false,\n showTagsMetadata: true,\n showHoverMetadata: true,\n};\n\ninterface ConversationPanelPreferencesActions {\n setShowOlderConversations: (value: boolean) => void;\n toggleShowOlderConversations: () => void;\n setOlderConversationCutoff: (value: OlderConversationCutoff) => void;\n setShowArchivedConversations: (value: boolean) => void;\n toggleShowArchivedConversations: () => void;\n setShowRepoBranchMetadata: (value: boolean) => void;\n toggleShowRepoBranchMetadata: () => void;\n setShowLlmProfiles: (value: boolean) => void;\n toggleShowLlmProfiles: () => void;\n setShowTagsMetadata: (value: boolean) => void;\n toggleShowTagsMetadata: () => void;\n setShowHoverMetadata: (value: boolean) => void;\n toggleShowHoverMetadata: () => void;\n setOrganizeMode: (value: OrganizeMode) => void;\n setConversationSort: (value: ConversationSortField) => void;\n setThreadScope: (value: ThreadScope) => void;\n setAutomationFilterMode: (value: AutomationFilterMode) => void;\n toggleAutomationName: (name: string) => void;\n /**\n * Clears both facet selections (tags and automation names) — the two\n * narrowings the active-filter strip renders as chips.\n *\n * Deliberately leaves `automationFilterMode` alone: the strip shows no chip\n * for the mode, and it must not silently switch a surface it doesn't show.\n * The mode keeps its own rows in the advanced-options modal.\n */\n clearFilterSelections: () => void;\n toggleTagFacet: (facet: string) => void;\n /** Applies a layout preset's partial bundle in one set(). */\n applyLayoutSettings: (settings: Partial<LayoutSettingsSlice>) => void;\n setGroupFolderOrder: (order: readonly string[]) => void;\n}\n\ntype ConversationPanelPreferencesStore = ConversationPanelPreferencesState &\n ConversationPanelPreferencesActions;\n\nconst initialState: ConversationPanelPreferencesState = {\n ...DEFAULT_LAYOUT_SETTINGS,\n olderConversationCutoff: DEFAULT_OLDER_CONVERSATION_CUTOFF,\n showArchivedConversations: false,\n automationFilterMode: \"all\",\n selectedAutomationNames: [],\n selectedTagFacets: [],\n groupFolderOrder: [],\n};\n\nexport const useConversationPanelPreferencesStore =\n create<ConversationPanelPreferencesStore>()(\n persist(\n (set) => ({\n ...initialState,\n\n setShowOlderConversations: (value) =>\n set(() => ({ showOlderConversations: value })),\n toggleShowOlderConversations: () =>\n set((state) => ({\n showOlderConversations: !state.showOlderConversations,\n })),\n setOlderConversationCutoff: (value) =>\n set(() => ({\n olderConversationCutoff: isOlderConversationCutoff(value)\n ? value\n : DEFAULT_OLDER_CONVERSATION_CUTOFF,\n })),\n\n setShowArchivedConversations: (value) =>\n set(() => ({ showArchivedConversations: value })),\n toggleShowArchivedConversations: () =>\n set((state) => ({\n showArchivedConversations: !state.showArchivedConversations,\n })),\n\n setShowRepoBranchMetadata: (value) =>\n set(() => ({ showRepoBranchMetadata: value })),\n toggleShowRepoBranchMetadata: () =>\n set((state) => ({\n showRepoBranchMetadata: !state.showRepoBranchMetadata,\n })),\n\n setShowLlmProfiles: (value) => set(() => ({ showLlmProfiles: value })),\n toggleShowLlmProfiles: () =>\n set((state) => ({\n showLlmProfiles: !state.showLlmProfiles,\n })),\n\n setShowTagsMetadata: (value) =>\n set(() => ({ showTagsMetadata: value })),\n toggleShowTagsMetadata: () =>\n set((state) => ({\n showTagsMetadata: !state.showTagsMetadata,\n })),\n\n setShowHoverMetadata: (value) =>\n set(() => ({ showHoverMetadata: value })),\n toggleShowHoverMetadata: () =>\n set((state) => ({\n showHoverMetadata: !state.showHoverMetadata,\n })),\n\n setOrganizeMode: (value) => set(() => ({ organizeMode: value })),\n setConversationSort: (value) =>\n set(() => ({ conversationSort: value })),\n setThreadScope: (value) => set(() => ({ threadScope: value })),\n setAutomationFilterMode: (value) =>\n set((state) => ({\n automationFilterMode: value,\n // Name selections only make sense in only-automations mode;\n // leaving the mode clears them (self-healing — a stale selection\n // must never silently narrow an unfiltered-looking list).\n selectedAutomationNames:\n value === \"only-automations\" ? state.selectedAutomationNames : [],\n })),\n toggleAutomationName: (name) =>\n set((state) => ({\n selectedAutomationNames: state.selectedAutomationNames.includes(\n name,\n )\n ? state.selectedAutomationNames.filter(\n (existing) => existing !== name,\n )\n : [...state.selectedAutomationNames, name],\n })),\n clearFilterSelections: () =>\n set(() => ({\n selectedTagFacets: [],\n selectedAutomationNames: [],\n })),\n toggleTagFacet: (facet) =>\n set((state) => ({\n selectedTagFacets: state.selectedTagFacets.includes(facet)\n ? state.selectedTagFacets.filter((existing) => existing !== facet)\n : [...state.selectedTagFacets, facet],\n })),\n setGroupFolderOrder: (order) =>\n set(() => ({ groupFolderOrder: [...order] })),\n\n applyLayoutSettings: (settings) => set(() => ({ ...settings })),\n }),\n {\n name: \"conversation-panel-preferences\",\n storage: createJSONStorage(() => localStorage),\n // Only persist the data fields — actions are recreated on each load.\n partialize: (state): ConversationPanelPreferencesState => ({\n showOlderConversations: state.showOlderConversations,\n olderConversationCutoff: isOlderConversationCutoff(\n state.olderConversationCutoff,\n )\n ? state.olderConversationCutoff\n : DEFAULT_OLDER_CONVERSATION_CUTOFF,\n showArchivedConversations: state.showArchivedConversations,\n showRepoBranchMetadata: state.showRepoBranchMetadata,\n showLlmProfiles: state.showLlmProfiles,\n showTagsMetadata: state.showTagsMetadata,\n showHoverMetadata: state.showHoverMetadata,\n organizeMode: state.organizeMode,\n conversationSort: state.conversationSort,\n threadScope: state.threadScope,\n automationFilterMode: state.automationFilterMode,\n selectedAutomationNames: state.selectedAutomationNames,\n selectedTagFacets: state.selectedTagFacets,\n groupFolderOrder: state.groupFolderOrder,\n }),\n },\n ),\n );\n"],"mappings":";;;;AAgEA,IAAa,IAA+C;CAC1D,cAAc;CACd,kBAAkB;CAClB,aAAa;CACb,wBAAwB;CACxB,wBAAwB;CACxB,iBAAiB;CACjB,kBAAkB;CAClB,mBAAmB;AACrB,GAuCM,IAAkD;CACtD,GAAG;CACH,yBAAA;CACA,2BAA2B;CAC3B,sBAAsB;CACtB,yBAAyB,CAAC;CAC1B,mBAAmB,CAAC;CACpB,kBAAkB,CAAC;AACrB,GAEa,IACX,EAA0C,EACxC,GACG,OAAS;CACR,GAAG;CAEH,4BAA4B,MAC1B,SAAW,EAAE,wBAAwB,EAAM,EAAE;CAC/C,oCACE,GAAK,OAAW,EACd,wBAAwB,CAAC,EAAM,uBACjC,EAAE;CACJ,6BAA6B,MAC3B,SAAW,EACT,yBAAyB,EAA0B,CAAK,IACpD,IAAA,KAEN,EAAE;CAEJ,+BAA+B,MAC7B,SAAW,EAAE,2BAA2B,EAAM,EAAE;CAClD,uCACE,GAAK,OAAW,EACd,2BAA2B,CAAC,EAAM,0BACpC,EAAE;CAEJ,4BAA4B,MAC1B,SAAW,EAAE,wBAAwB,EAAM,EAAE;CAC/C,oCACE,GAAK,OAAW,EACd,wBAAwB,CAAC,EAAM,uBACjC,EAAE;CAEJ,qBAAqB,MAAU,SAAW,EAAE,iBAAiB,EAAM,EAAE;CACrE,6BACE,GAAK,OAAW,EACd,iBAAiB,CAAC,EAAM,gBAC1B,EAAE;CAEJ,sBAAsB,MACpB,SAAW,EAAE,kBAAkB,EAAM,EAAE;CACzC,8BACE,GAAK,OAAW,EACd,kBAAkB,CAAC,EAAM,iBAC3B,EAAE;CAEJ,uBAAuB,MACrB,SAAW,EAAE,mBAAmB,EAAM,EAAE;CAC1C,+BACE,GAAK,OAAW,EACd,mBAAmB,CAAC,EAAM,kBAC5B,EAAE;CAEJ,kBAAkB,MAAU,SAAW,EAAE,cAAc,EAAM,EAAE;CAC/D,sBAAsB,MACpB,SAAW,EAAE,kBAAkB,EAAM,EAAE;CACzC,iBAAiB,MAAU,SAAW,EAAE,aAAa,EAAM,EAAE;CAC7D,0BAA0B,MACxB,GAAK,OAAW;EACd,sBAAsB;EAItB,yBACE,MAAU,qBAAqB,EAAM,0BAA0B,CAAC;CACpE,EAAE;CACJ,uBAAuB,MACrB,GAAK,OAAW,EACd,yBAAyB,EAAM,wBAAwB,SACrD,CACF,IACI,EAAM,wBAAwB,QAC3B,MAAa,MAAa,CAC7B,IACA,CAAC,GAAG,EAAM,yBAAyB,CAAI,EAC7C,EAAE;CACJ,6BACE,SAAW;EACT,mBAAmB,CAAC;EACpB,yBAAyB,CAAC;CAC5B,EAAE;CACJ,iBAAiB,MACf,GAAK,OAAW,EACd,mBAAmB,EAAM,kBAAkB,SAAS,CAAK,IACrD,EAAM,kBAAkB,QAAQ,MAAa,MAAa,CAAK,IAC/D,CAAC,GAAG,EAAM,mBAAmB,CAAK,EACxC,EAAE;CACJ,sBAAsB,MACpB,SAAW,EAAE,kBAAkB,CAAC,GAAG,CAAK,EAAE,EAAE;CAE9C,sBAAsB,MAAa,SAAW,EAAE,GAAG,EAAS,EAAE;AAChE,IACA;CACE,MAAM;CACN,SAAS,QAAwB,YAAY;CAE7C,aAAa,OAA8C;EACzD,wBAAwB,EAAM;EAC9B,yBAAyB,EACvB,EAAM,uBACR,IACI,EAAM,0BAAA;EAEV,2BAA2B,EAAM;EACjC,wBAAwB,EAAM;EAC9B,iBAAiB,EAAM;EACvB,kBAAkB,EAAM;EACxB,mBAAmB,EAAM;EACzB,cAAc,EAAM;EACpB,kBAAkB,EAAM;EACxB,aAAa,EAAM;EACnB,sBAAsB,EAAM;EAC5B,yBAAyB,EAAM;EAC/B,mBAAmB,EAAM;EACzB,kBAAkB,EAAM;CAC1B;AACF,CACF,CACF"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("../_virtual/_rolldown/runtime.cjs");var e=require("../node_modules/zustand/esm/react.cjs").create(e=>({
|
|
1
|
+
require("../_virtual/_rolldown/runtime.cjs");var e=require("../node_modules/zustand/esm/react.cjs").create(e=>({executionStatusByConversation:{},setExecutionStatus:(t,n)=>e(e=>({executionStatusByConversation:{...e.executionStatusByConversation,[t]:n}})),reset:()=>e({executionStatusByConversation:{}})}));exports.useConversationStateStore=e;
|
|
2
2
|
//# sourceMappingURL=conversation-state-store.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-state-store.cjs","names":[],"sources":["../../src/stores/conversation-state-store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { ExecutionStatus } from \"#/types/agent-server/core/base/common\";\n\ninterface ConversationStateStore {\n
|
|
1
|
+
{"version":3,"file":"conversation-state-store.cjs","names":[],"sources":["../../src/stores/conversation-state-store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { ExecutionStatus } from \"#/types/agent-server/core/base/common\";\n\ninterface ConversationStateStore {\n /**\n * Latest execution status per conversation, fed by the main and planning\n * WebSocket handlers. Scoped by conversation id so the planning helper\n * conversation's own run/idle transitions can never overwrite the main\n * conversation's status (or vice versa) — see conversation-websocket-context.tsx.\n */\n executionStatusByConversation: Record<string, ExecutionStatus>;\n\n /**\n * Set the agent status for a specific conversation.\n */\n setExecutionStatus: (\n conversationId: string,\n execution_status: ExecutionStatus,\n ) => void;\n\n /**\n * Reset the store to initial state\n */\n reset: () => void;\n}\n\nexport const useConversationStateStore = create<ConversationStateStore>(\n (set) => ({\n executionStatusByConversation: {},\n\n setExecutionStatus: (conversationId, execution_status) =>\n set((state) => ({\n executionStatusByConversation: {\n ...state.executionStatusByConversation,\n [conversationId]: execution_status,\n },\n })),\n\n reset: () => set({ executionStatusByConversation: {} }),\n }),\n);\n"],"mappings":"6CA0BA,IAAa,iDAA4B,EAAA,OACtC,IAAS,CACR,8BAA+B,CAAC,EAEhC,oBAAqB,EAAgB,IACnC,EAAK,IAAW,CACd,8BAA+B,CAC7B,GAAG,EAAM,+BACR,GAAiB,CACpB,CACF,EAAE,EAEJ,UAAa,EAAI,CAAE,8BAA+B,CAAC,CAAE,CAAC,CACxD,EACF"}
|
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
import { ExecutionStatus } from "#/types/agent-server/core/base/common";
|
|
2
2
|
interface ConversationStateStore {
|
|
3
|
-
execution_status: ExecutionStatus | null;
|
|
4
3
|
/**
|
|
5
|
-
*
|
|
4
|
+
* Latest execution status per conversation, fed by the main and planning
|
|
5
|
+
* WebSocket handlers. Scoped by conversation id so the planning helper
|
|
6
|
+
* conversation's own run/idle transitions can never overwrite the main
|
|
7
|
+
* conversation's status (or vice versa) — see conversation-websocket-context.tsx.
|
|
6
8
|
*/
|
|
7
|
-
|
|
9
|
+
executionStatusByConversation: Record<string, ExecutionStatus>;
|
|
10
|
+
/**
|
|
11
|
+
* Set the agent status for a specific conversation.
|
|
12
|
+
*/
|
|
13
|
+
setExecutionStatus: (conversationId: string, execution_status: ExecutionStatus) => void;
|
|
8
14
|
/**
|
|
9
15
|
* Reset the store to initial state
|
|
10
16
|
*/
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { create as e } from "../node_modules/zustand/esm/react.js";
|
|
2
2
|
//#region src/stores/conversation-state-store.ts
|
|
3
3
|
var t = e((e) => ({
|
|
4
|
-
|
|
5
|
-
setExecutionStatus: (t) => e({
|
|
6
|
-
|
|
4
|
+
executionStatusByConversation: {},
|
|
5
|
+
setExecutionStatus: (t, n) => e((e) => ({ executionStatusByConversation: {
|
|
6
|
+
...e.executionStatusByConversation,
|
|
7
|
+
[t]: n
|
|
8
|
+
} })),
|
|
9
|
+
reset: () => e({ executionStatusByConversation: {} })
|
|
7
10
|
}));
|
|
8
11
|
//#endregion
|
|
9
12
|
export { t as useConversationStateStore };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-state-store.js","names":[],"sources":["../../src/stores/conversation-state-store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { ExecutionStatus } from \"#/types/agent-server/core/base/common\";\n\ninterface ConversationStateStore {\n
|
|
1
|
+
{"version":3,"file":"conversation-state-store.js","names":[],"sources":["../../src/stores/conversation-state-store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { ExecutionStatus } from \"#/types/agent-server/core/base/common\";\n\ninterface ConversationStateStore {\n /**\n * Latest execution status per conversation, fed by the main and planning\n * WebSocket handlers. Scoped by conversation id so the planning helper\n * conversation's own run/idle transitions can never overwrite the main\n * conversation's status (or vice versa) — see conversation-websocket-context.tsx.\n */\n executionStatusByConversation: Record<string, ExecutionStatus>;\n\n /**\n * Set the agent status for a specific conversation.\n */\n setExecutionStatus: (\n conversationId: string,\n execution_status: ExecutionStatus,\n ) => void;\n\n /**\n * Reset the store to initial state\n */\n reset: () => void;\n}\n\nexport const useConversationStateStore = create<ConversationStateStore>(\n (set) => ({\n executionStatusByConversation: {},\n\n setExecutionStatus: (conversationId, execution_status) =>\n set((state) => ({\n executionStatusByConversation: {\n ...state.executionStatusByConversation,\n [conversationId]: execution_status,\n },\n })),\n\n reset: () => set({ executionStatusByConversation: {} }),\n }),\n);\n"],"mappings":";;AA0BA,IAAa,IAA4B,GACtC,OAAS;CACR,+BAA+B,CAAC;CAEhC,qBAAqB,GAAgB,MACnC,GAAK,OAAW,EACd,+BAA+B;EAC7B,GAAG,EAAM;GACR,IAAiB;CACpB,EACF,EAAE;CAEJ,aAAa,EAAI,EAAE,+BAA+B,CAAC,EAAE,CAAC;AACxD,EACF"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("../_virtual/_rolldown/runtime.cjs");const e=require("../node_modules/zustand/esm/react.cjs"),t=require("../node_modules/zustand/esm/middleware.cjs"),n=require("../utils/conversation-local-storage.cjs");var r=()=>{if(typeof window>`u`)return null;let e=window.location.pathname.match(/\/conversations\/([^/]+)/);return e?e[1]:null},i=()=>{if(typeof window>`u`)return`code`;let e=r();return e?n.getConversationState(e).conversationMode:`code`},a=e.create()(t.devtools(e=>({isRightPanelShown:!1,isOverviewPanelShown:!1,isOverviewPanelPeeked:!1,selectedTab:`files`,commitsAutoExpandSection:null,images:[],files:[],imagesMarkedUploadAsFile:[],pastedImageNames:[],loadingFiles:[],loadingImages:[],messageToSend:null,messageRestoreIfEmpty:null,shouldShownAgentLoading:!1,submittedMessage:null,shouldHideSuggestions:!1,hasRightPanelToggled:!1,planContent:null,conversationMode:i(),subConversationTaskId:null,setIsRightPanelShown:t=>e({isRightPanelShown:t},!1,`setIsRightPanelShown`),setIsOverviewPanelShown:t=>e({isOverviewPanelShown:t,isOverviewPanelPeeked:!1},!1,`setIsOverviewPanelShown`),setIsOverviewPanelPeeked:t=>e({isOverviewPanelPeeked:t},!1,`setIsOverviewPanelPeeked`),setSelectedTab:t=>e({selectedTab:t},!1,`setSelectedTab`),setCommitsAutoExpandSection:t=>e({commitsAutoExpandSection:t},!1,`setCommitsAutoExpandSection`),setShouldShownAgentLoading:t=>e({shouldShownAgentLoading:t},!1,`setShouldShownAgentLoading`),setShouldHideSuggestions:t=>e({shouldHideSuggestions:t},!1,`setShouldHideSuggestions`),addImages:t=>e(e=>({images:[...e.images,...t]}),!1,`addImages`),addFiles:t=>e(e=>({files:[...e.files,...t]}),!1,`addFiles`),toggleImageUploadAsFile:t=>e(e=>{let n=new Set(e.imagesMarkedUploadAsFile);return n.has(t)?n.delete(t):n.add(t),{imagesMarkedUploadAsFile:[...n]}},!1,`toggleImageUploadAsFile`),markImagesAsPasted:t=>e(e=>({pastedImageNames:[...new Set([...e.pastedImageNames,...t])]}),!1,`markImagesAsPasted`),removeImage:t=>e(e=>{let n=e.images[t],r=[...e.images];return r.splice(t,1),{images:r,imagesMarkedUploadAsFile:n?e.imagesMarkedUploadAsFile.filter(e=>e!==n.name):e.imagesMarkedUploadAsFile,pastedImageNames:n?e.pastedImageNames.filter(e=>e!==n.name):e.pastedImageNames}},!1,`removeImage`),removeFile:t=>e(e=>{let n=[...e.files];return n.splice(t,1),{files:n}},!1,`removeFile`),clearImages:()=>e({images:[]},!1,`clearImages`),clearFiles:()=>e({files:[]},!1,`clearFiles`),clearAllFiles:()=>e({images:[],files:[],imagesMarkedUploadAsFile:[],pastedImageNames:[],loadingFiles:[],loadingImages:[]},!1,`clearAllFiles`),addFileLoading:t=>e(e=>e.loadingFiles.includes(t)?e:{loadingFiles:[...e.loadingFiles,t]},!1,`addFileLoading`),removeFileLoading:t=>e(e=>({loadingFiles:e.loadingFiles.filter(e=>e!==t)}),!1,`removeFileLoading`),addImageLoading:t=>e(e=>e.loadingImages.includes(t)?e:{loadingImages:[...e.loadingImages,t]},!1,`addImageLoading`),removeImageLoading:t=>e(e=>({loadingImages:e.loadingImages.filter(e=>e!==t)}),!1,`removeImageLoading`),clearAllLoading:()=>e({loadingFiles:[],loadingImages:[]},!1,`clearAllLoading`),setMessageToSend:t=>e({messageToSend:{text:t,timestamp:Date.now()}},!1,`setMessageToSend`),clearMessageToSend:()=>e({messageToSend:null},!1,`clearMessageToSend`),restoreMessageToInputIfEmpty:t=>e({messageRestoreIfEmpty:{text:t,timestamp:Date.now()}},!1,`restoreMessageToInputIfEmpty`),clearMessageRestoreIfEmpty:()=>e({messageRestoreIfEmpty:null},!1,`clearMessageRestoreIfEmpty`),setSubmittedMessage:t=>e({submittedMessage:t},!1,`setSubmittedMessage`),resetConversationState:()=>e({shouldHideSuggestions:!1,conversationMode:i(),subConversationTaskId:null,planContent:null},!1,`resetConversationState`),setHasRightPanelToggled:t=>e({hasRightPanelToggled:t},!1,`setHasRightPanelToggled`),setConversationMode:t=>{let i=r();i&&n.setConversationState(i,{conversationMode:t}),e({conversationMode:t},!1,`setConversationMode`)},setSubConversationTaskId:t=>e({subConversationTaskId:t},!1,`setSubConversationTaskId`),setPlanContent:t=>e({planContent:t},!1,`setPlanContent`)}),{name:`conversation-store`}));exports.useConversationStore=a;
|
|
1
|
+
require("../_virtual/_rolldown/runtime.cjs");const e=require("../node_modules/zustand/esm/react.cjs"),t=require("../node_modules/zustand/esm/middleware.cjs"),n=require("../utils/conversation-local-storage.cjs");var r=()=>{if(typeof window>`u`)return null;let e=window.location.pathname.match(/\/conversations\/([^/]+)/);return e?e[1]:null},i=()=>{if(typeof window>`u`)return`code`;let e=r();return e?n.getConversationState(e).conversationMode:`code`},a=e.create()(t.devtools(e=>({isRightPanelShown:!1,isOverviewPanelShown:!1,isOverviewPanelPeeked:!1,selectedTab:`files`,commitsAutoExpandSection:null,images:[],files:[],imagesMarkedUploadAsFile:[],pastedImageNames:[],loadingFiles:[],loadingImages:[],messageToSend:null,messageRestoreIfEmpty:null,shouldShownAgentLoading:!1,submittedMessage:null,shouldHideSuggestions:!1,hasRightPanelToggled:!1,planContent:null,conversationMode:i(),subConversationTaskId:null,localPlanningConversationId:null,setIsRightPanelShown:t=>e({isRightPanelShown:t},!1,`setIsRightPanelShown`),setIsOverviewPanelShown:t=>e({isOverviewPanelShown:t,isOverviewPanelPeeked:!1},!1,`setIsOverviewPanelShown`),setIsOverviewPanelPeeked:t=>e({isOverviewPanelPeeked:t},!1,`setIsOverviewPanelPeeked`),setSelectedTab:t=>e({selectedTab:t},!1,`setSelectedTab`),setCommitsAutoExpandSection:t=>e({commitsAutoExpandSection:t},!1,`setCommitsAutoExpandSection`),setShouldShownAgentLoading:t=>e({shouldShownAgentLoading:t},!1,`setShouldShownAgentLoading`),setShouldHideSuggestions:t=>e({shouldHideSuggestions:t},!1,`setShouldHideSuggestions`),addImages:t=>e(e=>({images:[...e.images,...t]}),!1,`addImages`),addFiles:t=>e(e=>({files:[...e.files,...t]}),!1,`addFiles`),toggleImageUploadAsFile:t=>e(e=>{let n=new Set(e.imagesMarkedUploadAsFile);return n.has(t)?n.delete(t):n.add(t),{imagesMarkedUploadAsFile:[...n]}},!1,`toggleImageUploadAsFile`),markImagesAsPasted:t=>e(e=>({pastedImageNames:[...new Set([...e.pastedImageNames,...t])]}),!1,`markImagesAsPasted`),removeImage:t=>e(e=>{let n=e.images[t],r=[...e.images];return r.splice(t,1),{images:r,imagesMarkedUploadAsFile:n?e.imagesMarkedUploadAsFile.filter(e=>e!==n.name):e.imagesMarkedUploadAsFile,pastedImageNames:n?e.pastedImageNames.filter(e=>e!==n.name):e.pastedImageNames}},!1,`removeImage`),removeFile:t=>e(e=>{let n=[...e.files];return n.splice(t,1),{files:n}},!1,`removeFile`),clearImages:()=>e({images:[]},!1,`clearImages`),clearFiles:()=>e({files:[]},!1,`clearFiles`),clearAllFiles:()=>e({images:[],files:[],imagesMarkedUploadAsFile:[],pastedImageNames:[],loadingFiles:[],loadingImages:[]},!1,`clearAllFiles`),addFileLoading:t=>e(e=>e.loadingFiles.includes(t)?e:{loadingFiles:[...e.loadingFiles,t]},!1,`addFileLoading`),removeFileLoading:t=>e(e=>({loadingFiles:e.loadingFiles.filter(e=>e!==t)}),!1,`removeFileLoading`),addImageLoading:t=>e(e=>e.loadingImages.includes(t)?e:{loadingImages:[...e.loadingImages,t]},!1,`addImageLoading`),removeImageLoading:t=>e(e=>({loadingImages:e.loadingImages.filter(e=>e!==t)}),!1,`removeImageLoading`),clearAllLoading:()=>e({loadingFiles:[],loadingImages:[]},!1,`clearAllLoading`),setMessageToSend:t=>e({messageToSend:{text:t,timestamp:Date.now()}},!1,`setMessageToSend`),clearMessageToSend:()=>e({messageToSend:null},!1,`clearMessageToSend`),restoreMessageToInputIfEmpty:t=>e({messageRestoreIfEmpty:{text:t,timestamp:Date.now()}},!1,`restoreMessageToInputIfEmpty`),clearMessageRestoreIfEmpty:()=>e({messageRestoreIfEmpty:null},!1,`clearMessageRestoreIfEmpty`),setSubmittedMessage:t=>e({submittedMessage:t},!1,`setSubmittedMessage`),resetConversationState:()=>e({shouldHideSuggestions:!1,conversationMode:i(),subConversationTaskId:null,localPlanningConversationId:null,planContent:null},!1,`resetConversationState`),setHasRightPanelToggled:t=>e({hasRightPanelToggled:t},!1,`setHasRightPanelToggled`),setConversationMode:t=>{let i=r();i&&n.setConversationState(i,{conversationMode:t}),e({conversationMode:t},!1,`setConversationMode`)},setSubConversationTaskId:t=>e({subConversationTaskId:t},!1,`setSubConversationTaskId`),setLocalPlanningConversationId:t=>e({localPlanningConversationId:t},!1,`setLocalPlanningConversationId`),setPlanContent:t=>e({planContent:t},!1,`setPlanContent`)}),{name:`conversation-store`}));exports.useConversationStore=a;
|
|
2
2
|
//# sourceMappingURL=conversation-store.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-store.cjs","names":[],"sources":["../../src/stores/conversation-store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { devtools } from \"zustand/middleware\";\nimport {\n getConversationState,\n setConversationState,\n} from \"#/utils/conversation-local-storage\";\n\nexport type ConversationTab =\n | \"files\"\n | \"commits\"\n | \"browser\"\n | \"terminal\"\n | \"planner\"\n | \"tasklist\"\n | \"usage\";\n\nexport type ConversationMode = \"code\" | \"plan\";\n\nexport type CommitsPaneSection = \"uncommitted\";\n\nexport interface IMessageToSend {\n text: string;\n timestamp: number;\n}\n\ninterface ConversationState {\n isRightPanelShown: boolean;\n isOverviewPanelShown: boolean;\n isOverviewPanelPeeked: boolean;\n selectedTab: ConversationTab | null;\n commitsAutoExpandSection: CommitsPaneSection | null;\n images: File[];\n files: File[];\n /** Image file names (e.g. pasted screenshots) to send via file upload instead of vision embed. */\n imagesMarkedUploadAsFile: string[];\n /** Image file names attached in chat (controls per-image upload-as-file UI). */\n pastedImageNames: string[];\n loadingFiles: string[]; // File names currently being processed\n loadingImages: string[]; // Image names currently being processed\n messageToSend: IMessageToSend | null;\n /** One-shot restore request consumed by the chat input when empty. */\n messageRestoreIfEmpty: IMessageToSend | null;\n shouldShownAgentLoading: boolean;\n submittedMessage: string | null;\n shouldHideSuggestions: boolean; // New state to hide suggestions when input expands\n hasRightPanelToggled: boolean;\n planContent: string | null;\n conversationMode: ConversationMode;\n subConversationTaskId: string | null; // Task ID for sub-conversation creation\n}\n\ninterface ConversationActions {\n setIsRightPanelShown: (isRightPanelShown: boolean) => void;\n setIsOverviewPanelShown: (isOverviewPanelShown: boolean) => void;\n setIsOverviewPanelPeeked: (isOverviewPanelPeeked: boolean) => void;\n setSelectedTab: (selectedTab: ConversationTab | null) => void;\n setCommitsAutoExpandSection: (\n commitsAutoExpandSection: CommitsPaneSection | null,\n ) => void;\n setShouldShownAgentLoading: (shouldShownAgentLoading: boolean) => void;\n setShouldHideSuggestions: (shouldHideSuggestions: boolean) => void;\n addImages: (images: File[]) => void;\n addFiles: (files: File[]) => void;\n toggleImageUploadAsFile: (fileName: string) => void;\n markImagesAsPasted: (fileNames: string[]) => void;\n removeImage: (index: number) => void;\n removeFile: (index: number) => void;\n clearImages: () => void;\n clearFiles: () => void;\n clearAllFiles: () => void;\n addFileLoading: (fileName: string) => void;\n removeFileLoading: (fileName: string) => void;\n addImageLoading: (imageName: string) => void;\n removeImageLoading: (imageName: string) => void;\n clearAllLoading: () => void;\n setMessageToSend: (text: string) => void;\n clearMessageToSend: () => void;\n restoreMessageToInputIfEmpty: (text: string) => void;\n clearMessageRestoreIfEmpty: () => void;\n setSubmittedMessage: (message: string | null) => void;\n resetConversationState: () => void;\n setHasRightPanelToggled: (hasRightPanelToggled: boolean) => void;\n setConversationMode: (conversationMode: ConversationMode) => void;\n setSubConversationTaskId: (taskId: string | null) => void;\n setPlanContent: (planContent: string | null) => void;\n}\n\ntype ConversationStore = ConversationState & ConversationActions;\n\nconst getConversationIdFromLocation = (): string | null => {\n if (typeof window === \"undefined\") {\n return null;\n }\n\n const match = window.location.pathname.match(/\\/conversations\\/([^/]+)/);\n return match ? match[1] : null;\n};\n\nconst getInitialConversationMode = (): ConversationMode => {\n if (typeof window === \"undefined\") {\n return \"code\";\n }\n\n const conversationId = getConversationIdFromLocation();\n if (!conversationId) {\n return \"code\";\n }\n\n const state = getConversationState(conversationId);\n return state.conversationMode;\n};\n\nexport const useConversationStore = create<ConversationStore>()(\n devtools(\n (set) => ({\n // Initial state.\n //\n // The right-side drawer (`isRightPanelShown` / `hasRightPanelToggled`)\n // is intentionally *session-only* state: it always starts closed on\n // app load (or on opening a fresh/existing conversation after a\n // restart), but it survives in-app navigation because the Zustand\n // store stays alive across React Router transitions. Persisting the\n // open/closed state in localStorage made the panel feel sticky in\n // a way users didn't expect — they want a clean, focused chat view\n // when they come back to the app and only want the panel back when\n // they themselves opened it during the current session.\n isRightPanelShown: false,\n isOverviewPanelShown: false,\n isOverviewPanelPeeked: false,\n selectedTab: \"files\" as ConversationTab,\n commitsAutoExpandSection: null,\n images: [],\n files: [],\n imagesMarkedUploadAsFile: [],\n pastedImageNames: [],\n loadingFiles: [],\n loadingImages: [],\n messageToSend: null,\n messageRestoreIfEmpty: null,\n shouldShownAgentLoading: false,\n submittedMessage: null,\n shouldHideSuggestions: false,\n hasRightPanelToggled: false,\n planContent: null,\n conversationMode: getInitialConversationMode(),\n subConversationTaskId: null,\n\n // Actions\n setIsRightPanelShown: (isRightPanelShown) =>\n set({ isRightPanelShown }, false, \"setIsRightPanelShown\"),\n\n setIsOverviewPanelShown: (isOverviewPanelShown) =>\n set(\n { isOverviewPanelShown, isOverviewPanelPeeked: false },\n false,\n \"setIsOverviewPanelShown\",\n ),\n\n setIsOverviewPanelPeeked: (isOverviewPanelPeeked) =>\n set({ isOverviewPanelPeeked }, false, \"setIsOverviewPanelPeeked\"),\n\n setSelectedTab: (selectedTab) =>\n set({ selectedTab }, false, \"setSelectedTab\"),\n\n setCommitsAutoExpandSection: (commitsAutoExpandSection) =>\n set({ commitsAutoExpandSection }, false, \"setCommitsAutoExpandSection\"),\n\n setShouldShownAgentLoading: (shouldShownAgentLoading) =>\n set({ shouldShownAgentLoading }, false, \"setShouldShownAgentLoading\"),\n\n setShouldHideSuggestions: (shouldHideSuggestions) =>\n set({ shouldHideSuggestions }, false, \"setShouldHideSuggestions\"),\n\n addImages: (images) =>\n set(\n (state) => ({ images: [...state.images, ...images] }),\n false,\n \"addImages\",\n ),\n\n addFiles: (files) =>\n set(\n (state) => ({ files: [...state.files, ...files] }),\n false,\n \"addFiles\",\n ),\n\n toggleImageUploadAsFile: (fileName) =>\n set(\n (state) => {\n const marked = new Set(state.imagesMarkedUploadAsFile);\n if (marked.has(fileName)) {\n marked.delete(fileName);\n } else {\n marked.add(fileName);\n }\n return { imagesMarkedUploadAsFile: [...marked] };\n },\n false,\n \"toggleImageUploadAsFile\",\n ),\n\n markImagesAsPasted: (fileNames) =>\n set(\n (state) => {\n const merged = new Set([...state.pastedImageNames, ...fileNames]);\n return { pastedImageNames: [...merged] };\n },\n false,\n \"markImagesAsPasted\",\n ),\n\n removeImage: (index) =>\n set(\n (state) => {\n const removed = state.images[index];\n const newImages = [...state.images];\n newImages.splice(index, 1);\n return {\n images: newImages,\n imagesMarkedUploadAsFile: removed\n ? state.imagesMarkedUploadAsFile.filter(\n (name) => name !== removed.name,\n )\n : state.imagesMarkedUploadAsFile,\n pastedImageNames: removed\n ? state.pastedImageNames.filter((name) => name !== removed.name)\n : state.pastedImageNames,\n };\n },\n false,\n \"removeImage\",\n ),\n\n removeFile: (index) =>\n set(\n (state) => {\n const newFiles = [...state.files];\n newFiles.splice(index, 1);\n return { files: newFiles };\n },\n false,\n \"removeFile\",\n ),\n\n clearImages: () => set({ images: [] }, false, \"clearImages\"),\n\n clearFiles: () => set({ files: [] }, false, \"clearFiles\"),\n\n clearAllFiles: () =>\n set(\n {\n images: [],\n files: [],\n imagesMarkedUploadAsFile: [],\n pastedImageNames: [],\n loadingFiles: [],\n loadingImages: [],\n },\n false,\n \"clearAllFiles\",\n ),\n\n addFileLoading: (fileName) =>\n set(\n (state) => {\n if (!state.loadingFiles.includes(fileName)) {\n return { loadingFiles: [...state.loadingFiles, fileName] };\n }\n return state;\n },\n false,\n \"addFileLoading\",\n ),\n\n removeFileLoading: (fileName) =>\n set(\n (state) => ({\n loadingFiles: state.loadingFiles.filter(\n (name) => name !== fileName,\n ),\n }),\n false,\n \"removeFileLoading\",\n ),\n\n addImageLoading: (imageName) =>\n set(\n (state) => {\n if (!state.loadingImages.includes(imageName)) {\n return { loadingImages: [...state.loadingImages, imageName] };\n }\n return state;\n },\n false,\n \"addImageLoading\",\n ),\n\n removeImageLoading: (imageName) =>\n set(\n (state) => ({\n loadingImages: state.loadingImages.filter(\n (name) => name !== imageName,\n ),\n }),\n false,\n \"removeImageLoading\",\n ),\n\n clearAllLoading: () =>\n set({ loadingFiles: [], loadingImages: [] }, false, \"clearAllLoading\"),\n\n setMessageToSend: (text) =>\n set(\n {\n messageToSend: {\n text,\n timestamp: Date.now(),\n },\n },\n false,\n \"setMessageToSend\",\n ),\n\n // One-shot consume: clear after the composer applies it, so a never-sent\n // value can't replay into another conversation's composer on remount.\n clearMessageToSend: () =>\n set({ messageToSend: null }, false, \"clearMessageToSend\"),\n\n restoreMessageToInputIfEmpty: (text) =>\n set(\n {\n messageRestoreIfEmpty: {\n text,\n timestamp: Date.now(),\n },\n },\n false,\n \"restoreMessageToInputIfEmpty\",\n ),\n\n clearMessageRestoreIfEmpty: () =>\n set(\n { messageRestoreIfEmpty: null },\n false,\n \"clearMessageRestoreIfEmpty\",\n ),\n\n setSubmittedMessage: (submittedMessage) =>\n set({ submittedMessage }, false, \"setSubmittedMessage\"),\n\n resetConversationState: () =>\n set(\n {\n shouldHideSuggestions: false,\n conversationMode: getInitialConversationMode(),\n subConversationTaskId: null,\n planContent: null,\n },\n false,\n \"resetConversationState\",\n ),\n\n setHasRightPanelToggled: (hasRightPanelToggled) =>\n set({ hasRightPanelToggled }, false, \"setHasRightPanelToggled\"),\n\n setConversationMode: (conversationMode) => {\n const conversationId = getConversationIdFromLocation();\n if (conversationId) {\n setConversationState(conversationId, { conversationMode });\n }\n set({ conversationMode }, false, \"setConversationMode\");\n },\n\n setSubConversationTaskId: (subConversationTaskId) =>\n set({ subConversationTaskId }, false, \"setSubConversationTaskId\"),\n\n setPlanContent: (planContent) =>\n set({ planContent }, false, \"setPlanContent\"),\n }),\n {\n name: \"conversation-store\",\n },\n ),\n);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"conversation-store.cjs","names":[],"sources":["../../src/stores/conversation-store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { devtools } from \"zustand/middleware\";\nimport {\n getConversationState,\n setConversationState,\n} from \"#/utils/conversation-local-storage\";\n\nexport type ConversationTab =\n | \"files\"\n | \"commits\"\n | \"browser\"\n | \"terminal\"\n | \"planner\"\n | \"tasklist\"\n | \"usage\";\n\nexport type ConversationMode = \"code\" | \"plan\";\n\nexport type CommitsPaneSection = \"uncommitted\";\n\nexport interface IMessageToSend {\n text: string;\n timestamp: number;\n}\n\ninterface ConversationState {\n isRightPanelShown: boolean;\n isOverviewPanelShown: boolean;\n isOverviewPanelPeeked: boolean;\n selectedTab: ConversationTab | null;\n commitsAutoExpandSection: CommitsPaneSection | null;\n images: File[];\n files: File[];\n /** Image file names (e.g. pasted screenshots) to send via file upload instead of vision embed. */\n imagesMarkedUploadAsFile: string[];\n /** Image file names attached in chat (controls per-image upload-as-file UI). */\n pastedImageNames: string[];\n loadingFiles: string[]; // File names currently being processed\n loadingImages: string[]; // Image names currently being processed\n messageToSend: IMessageToSend | null;\n /** One-shot restore request consumed by the chat input when empty. */\n messageRestoreIfEmpty: IMessageToSend | null;\n shouldShownAgentLoading: boolean;\n submittedMessage: string | null;\n shouldHideSuggestions: boolean; // New state to hide suggestions when input expands\n hasRightPanelToggled: boolean;\n planContent: string | null;\n conversationMode: ConversationMode;\n subConversationTaskId: string | null; // Task ID for cloud sub-conversation creation\n localPlanningConversationId: string | null;\n}\n\ninterface ConversationActions {\n setIsRightPanelShown: (isRightPanelShown: boolean) => void;\n setIsOverviewPanelShown: (isOverviewPanelShown: boolean) => void;\n setIsOverviewPanelPeeked: (isOverviewPanelPeeked: boolean) => void;\n setSelectedTab: (selectedTab: ConversationTab | null) => void;\n setCommitsAutoExpandSection: (\n commitsAutoExpandSection: CommitsPaneSection | null,\n ) => void;\n setShouldShownAgentLoading: (shouldShownAgentLoading: boolean) => void;\n setShouldHideSuggestions: (shouldHideSuggestions: boolean) => void;\n addImages: (images: File[]) => void;\n addFiles: (files: File[]) => void;\n toggleImageUploadAsFile: (fileName: string) => void;\n markImagesAsPasted: (fileNames: string[]) => void;\n removeImage: (index: number) => void;\n removeFile: (index: number) => void;\n clearImages: () => void;\n clearFiles: () => void;\n clearAllFiles: () => void;\n addFileLoading: (fileName: string) => void;\n removeFileLoading: (fileName: string) => void;\n addImageLoading: (imageName: string) => void;\n removeImageLoading: (imageName: string) => void;\n clearAllLoading: () => void;\n setMessageToSend: (text: string) => void;\n clearMessageToSend: () => void;\n restoreMessageToInputIfEmpty: (text: string) => void;\n clearMessageRestoreIfEmpty: () => void;\n setSubmittedMessage: (message: string | null) => void;\n resetConversationState: () => void;\n setHasRightPanelToggled: (hasRightPanelToggled: boolean) => void;\n setConversationMode: (conversationMode: ConversationMode) => void;\n setSubConversationTaskId: (taskId: string | null) => void;\n setLocalPlanningConversationId: (conversationId: string | null) => void;\n setPlanContent: (planContent: string | null) => void;\n}\n\ntype ConversationStore = ConversationState & ConversationActions;\n\nconst getConversationIdFromLocation = (): string | null => {\n if (typeof window === \"undefined\") {\n return null;\n }\n\n const match = window.location.pathname.match(/\\/conversations\\/([^/]+)/);\n return match ? match[1] : null;\n};\n\nconst getInitialConversationMode = (): ConversationMode => {\n if (typeof window === \"undefined\") {\n return \"code\";\n }\n\n const conversationId = getConversationIdFromLocation();\n if (!conversationId) {\n return \"code\";\n }\n\n const state = getConversationState(conversationId);\n return state.conversationMode;\n};\n\nexport const useConversationStore = create<ConversationStore>()(\n devtools(\n (set) => ({\n // Initial state.\n //\n // The right-side drawer (`isRightPanelShown` / `hasRightPanelToggled`)\n // is intentionally *session-only* state: it always starts closed on\n // app load (or on opening a fresh/existing conversation after a\n // restart), but it survives in-app navigation because the Zustand\n // store stays alive across React Router transitions. Persisting the\n // open/closed state in localStorage made the panel feel sticky in\n // a way users didn't expect — they want a clean, focused chat view\n // when they come back to the app and only want the panel back when\n // they themselves opened it during the current session.\n isRightPanelShown: false,\n isOverviewPanelShown: false,\n isOverviewPanelPeeked: false,\n selectedTab: \"files\" as ConversationTab,\n commitsAutoExpandSection: null,\n images: [],\n files: [],\n imagesMarkedUploadAsFile: [],\n pastedImageNames: [],\n loadingFiles: [],\n loadingImages: [],\n messageToSend: null,\n messageRestoreIfEmpty: null,\n shouldShownAgentLoading: false,\n submittedMessage: null,\n shouldHideSuggestions: false,\n hasRightPanelToggled: false,\n planContent: null,\n conversationMode: getInitialConversationMode(),\n subConversationTaskId: null,\n localPlanningConversationId: null,\n\n // Actions\n setIsRightPanelShown: (isRightPanelShown) =>\n set({ isRightPanelShown }, false, \"setIsRightPanelShown\"),\n\n setIsOverviewPanelShown: (isOverviewPanelShown) =>\n set(\n { isOverviewPanelShown, isOverviewPanelPeeked: false },\n false,\n \"setIsOverviewPanelShown\",\n ),\n\n setIsOverviewPanelPeeked: (isOverviewPanelPeeked) =>\n set({ isOverviewPanelPeeked }, false, \"setIsOverviewPanelPeeked\"),\n\n setSelectedTab: (selectedTab) =>\n set({ selectedTab }, false, \"setSelectedTab\"),\n\n setCommitsAutoExpandSection: (commitsAutoExpandSection) =>\n set({ commitsAutoExpandSection }, false, \"setCommitsAutoExpandSection\"),\n\n setShouldShownAgentLoading: (shouldShownAgentLoading) =>\n set({ shouldShownAgentLoading }, false, \"setShouldShownAgentLoading\"),\n\n setShouldHideSuggestions: (shouldHideSuggestions) =>\n set({ shouldHideSuggestions }, false, \"setShouldHideSuggestions\"),\n\n addImages: (images) =>\n set(\n (state) => ({ images: [...state.images, ...images] }),\n false,\n \"addImages\",\n ),\n\n addFiles: (files) =>\n set(\n (state) => ({ files: [...state.files, ...files] }),\n false,\n \"addFiles\",\n ),\n\n toggleImageUploadAsFile: (fileName) =>\n set(\n (state) => {\n const marked = new Set(state.imagesMarkedUploadAsFile);\n if (marked.has(fileName)) {\n marked.delete(fileName);\n } else {\n marked.add(fileName);\n }\n return { imagesMarkedUploadAsFile: [...marked] };\n },\n false,\n \"toggleImageUploadAsFile\",\n ),\n\n markImagesAsPasted: (fileNames) =>\n set(\n (state) => {\n const merged = new Set([...state.pastedImageNames, ...fileNames]);\n return { pastedImageNames: [...merged] };\n },\n false,\n \"markImagesAsPasted\",\n ),\n\n removeImage: (index) =>\n set(\n (state) => {\n const removed = state.images[index];\n const newImages = [...state.images];\n newImages.splice(index, 1);\n return {\n images: newImages,\n imagesMarkedUploadAsFile: removed\n ? state.imagesMarkedUploadAsFile.filter(\n (name) => name !== removed.name,\n )\n : state.imagesMarkedUploadAsFile,\n pastedImageNames: removed\n ? state.pastedImageNames.filter((name) => name !== removed.name)\n : state.pastedImageNames,\n };\n },\n false,\n \"removeImage\",\n ),\n\n removeFile: (index) =>\n set(\n (state) => {\n const newFiles = [...state.files];\n newFiles.splice(index, 1);\n return { files: newFiles };\n },\n false,\n \"removeFile\",\n ),\n\n clearImages: () => set({ images: [] }, false, \"clearImages\"),\n\n clearFiles: () => set({ files: [] }, false, \"clearFiles\"),\n\n clearAllFiles: () =>\n set(\n {\n images: [],\n files: [],\n imagesMarkedUploadAsFile: [],\n pastedImageNames: [],\n loadingFiles: [],\n loadingImages: [],\n },\n false,\n \"clearAllFiles\",\n ),\n\n addFileLoading: (fileName) =>\n set(\n (state) => {\n if (!state.loadingFiles.includes(fileName)) {\n return { loadingFiles: [...state.loadingFiles, fileName] };\n }\n return state;\n },\n false,\n \"addFileLoading\",\n ),\n\n removeFileLoading: (fileName) =>\n set(\n (state) => ({\n loadingFiles: state.loadingFiles.filter(\n (name) => name !== fileName,\n ),\n }),\n false,\n \"removeFileLoading\",\n ),\n\n addImageLoading: (imageName) =>\n set(\n (state) => {\n if (!state.loadingImages.includes(imageName)) {\n return { loadingImages: [...state.loadingImages, imageName] };\n }\n return state;\n },\n false,\n \"addImageLoading\",\n ),\n\n removeImageLoading: (imageName) =>\n set(\n (state) => ({\n loadingImages: state.loadingImages.filter(\n (name) => name !== imageName,\n ),\n }),\n false,\n \"removeImageLoading\",\n ),\n\n clearAllLoading: () =>\n set({ loadingFiles: [], loadingImages: [] }, false, \"clearAllLoading\"),\n\n setMessageToSend: (text) =>\n set(\n {\n messageToSend: {\n text,\n timestamp: Date.now(),\n },\n },\n false,\n \"setMessageToSend\",\n ),\n\n // One-shot consume: clear after the composer applies it, so a never-sent\n // value can't replay into another conversation's composer on remount.\n clearMessageToSend: () =>\n set({ messageToSend: null }, false, \"clearMessageToSend\"),\n\n restoreMessageToInputIfEmpty: (text) =>\n set(\n {\n messageRestoreIfEmpty: {\n text,\n timestamp: Date.now(),\n },\n },\n false,\n \"restoreMessageToInputIfEmpty\",\n ),\n\n clearMessageRestoreIfEmpty: () =>\n set(\n { messageRestoreIfEmpty: null },\n false,\n \"clearMessageRestoreIfEmpty\",\n ),\n\n setSubmittedMessage: (submittedMessage) =>\n set({ submittedMessage }, false, \"setSubmittedMessage\"),\n\n resetConversationState: () =>\n set(\n {\n shouldHideSuggestions: false,\n conversationMode: getInitialConversationMode(),\n subConversationTaskId: null,\n localPlanningConversationId: null,\n planContent: null,\n },\n false,\n \"resetConversationState\",\n ),\n\n setHasRightPanelToggled: (hasRightPanelToggled) =>\n set({ hasRightPanelToggled }, false, \"setHasRightPanelToggled\"),\n\n setConversationMode: (conversationMode) => {\n const conversationId = getConversationIdFromLocation();\n if (conversationId) {\n setConversationState(conversationId, { conversationMode });\n }\n set({ conversationMode }, false, \"setConversationMode\");\n },\n\n setSubConversationTaskId: (subConversationTaskId) =>\n set({ subConversationTaskId }, false, \"setSubConversationTaskId\"),\n\n setLocalPlanningConversationId: (localPlanningConversationId) =>\n set(\n { localPlanningConversationId },\n false,\n \"setLocalPlanningConversationId\",\n ),\n\n setPlanContent: (planContent) =>\n set({ planContent }, false, \"setPlanContent\"),\n }),\n {\n name: \"conversation-store\",\n },\n ),\n);\n"],"mappings":"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"}
|
|
@@ -29,6 +29,7 @@ interface ConversationState {
|
|
|
29
29
|
planContent: string | null;
|
|
30
30
|
conversationMode: ConversationMode;
|
|
31
31
|
subConversationTaskId: string | null;
|
|
32
|
+
localPlanningConversationId: string | null;
|
|
32
33
|
}
|
|
33
34
|
interface ConversationActions {
|
|
34
35
|
setIsRightPanelShown: (isRightPanelShown: boolean) => void;
|
|
@@ -61,6 +62,7 @@ interface ConversationActions {
|
|
|
61
62
|
setHasRightPanelToggled: (hasRightPanelToggled: boolean) => void;
|
|
62
63
|
setConversationMode: (conversationMode: ConversationMode) => void;
|
|
63
64
|
setSubConversationTaskId: (taskId: string | null) => void;
|
|
65
|
+
setLocalPlanningConversationId: (conversationId: string | null) => void;
|
|
64
66
|
setPlanContent: (planContent: string | null) => void;
|
|
65
67
|
}
|
|
66
68
|
type ConversationStore = ConversationState & ConversationActions;
|
|
@@ -31,6 +31,7 @@ var i = () => {
|
|
|
31
31
|
planContent: null,
|
|
32
32
|
conversationMode: a(),
|
|
33
33
|
subConversationTaskId: null,
|
|
34
|
+
localPlanningConversationId: null,
|
|
34
35
|
setIsRightPanelShown: (t) => e({ isRightPanelShown: t }, !1, "setIsRightPanelShown"),
|
|
35
36
|
setIsOverviewPanelShown: (t) => e({
|
|
36
37
|
isOverviewPanelShown: t,
|
|
@@ -93,6 +94,7 @@ var i = () => {
|
|
|
93
94
|
shouldHideSuggestions: !1,
|
|
94
95
|
conversationMode: a(),
|
|
95
96
|
subConversationTaskId: null,
|
|
97
|
+
localPlanningConversationId: null,
|
|
96
98
|
planContent: null
|
|
97
99
|
}, !1, "resetConversationState"),
|
|
98
100
|
setHasRightPanelToggled: (t) => e({ hasRightPanelToggled: t }, !1, "setHasRightPanelToggled"),
|
|
@@ -101,6 +103,7 @@ var i = () => {
|
|
|
101
103
|
n && r(n, { conversationMode: t }), e({ conversationMode: t }, !1, "setConversationMode");
|
|
102
104
|
},
|
|
103
105
|
setSubConversationTaskId: (t) => e({ subConversationTaskId: t }, !1, "setSubConversationTaskId"),
|
|
106
|
+
setLocalPlanningConversationId: (t) => e({ localPlanningConversationId: t }, !1, "setLocalPlanningConversationId"),
|
|
104
107
|
setPlanContent: (t) => e({ planContent: t }, !1, "setPlanContent")
|
|
105
108
|
}), { name: "conversation-store" }));
|
|
106
109
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-store.js","names":[],"sources":["../../src/stores/conversation-store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { devtools } from \"zustand/middleware\";\nimport {\n getConversationState,\n setConversationState,\n} from \"#/utils/conversation-local-storage\";\n\nexport type ConversationTab =\n | \"files\"\n | \"commits\"\n | \"browser\"\n | \"terminal\"\n | \"planner\"\n | \"tasklist\"\n | \"usage\";\n\nexport type ConversationMode = \"code\" | \"plan\";\n\nexport type CommitsPaneSection = \"uncommitted\";\n\nexport interface IMessageToSend {\n text: string;\n timestamp: number;\n}\n\ninterface ConversationState {\n isRightPanelShown: boolean;\n isOverviewPanelShown: boolean;\n isOverviewPanelPeeked: boolean;\n selectedTab: ConversationTab | null;\n commitsAutoExpandSection: CommitsPaneSection | null;\n images: File[];\n files: File[];\n /** Image file names (e.g. pasted screenshots) to send via file upload instead of vision embed. */\n imagesMarkedUploadAsFile: string[];\n /** Image file names attached in chat (controls per-image upload-as-file UI). */\n pastedImageNames: string[];\n loadingFiles: string[]; // File names currently being processed\n loadingImages: string[]; // Image names currently being processed\n messageToSend: IMessageToSend | null;\n /** One-shot restore request consumed by the chat input when empty. */\n messageRestoreIfEmpty: IMessageToSend | null;\n shouldShownAgentLoading: boolean;\n submittedMessage: string | null;\n shouldHideSuggestions: boolean; // New state to hide suggestions when input expands\n hasRightPanelToggled: boolean;\n planContent: string | null;\n conversationMode: ConversationMode;\n subConversationTaskId: string | null; // Task ID for sub-conversation creation\n}\n\ninterface ConversationActions {\n setIsRightPanelShown: (isRightPanelShown: boolean) => void;\n setIsOverviewPanelShown: (isOverviewPanelShown: boolean) => void;\n setIsOverviewPanelPeeked: (isOverviewPanelPeeked: boolean) => void;\n setSelectedTab: (selectedTab: ConversationTab | null) => void;\n setCommitsAutoExpandSection: (\n commitsAutoExpandSection: CommitsPaneSection | null,\n ) => void;\n setShouldShownAgentLoading: (shouldShownAgentLoading: boolean) => void;\n setShouldHideSuggestions: (shouldHideSuggestions: boolean) => void;\n addImages: (images: File[]) => void;\n addFiles: (files: File[]) => void;\n toggleImageUploadAsFile: (fileName: string) => void;\n markImagesAsPasted: (fileNames: string[]) => void;\n removeImage: (index: number) => void;\n removeFile: (index: number) => void;\n clearImages: () => void;\n clearFiles: () => void;\n clearAllFiles: () => void;\n addFileLoading: (fileName: string) => void;\n removeFileLoading: (fileName: string) => void;\n addImageLoading: (imageName: string) => void;\n removeImageLoading: (imageName: string) => void;\n clearAllLoading: () => void;\n setMessageToSend: (text: string) => void;\n clearMessageToSend: () => void;\n restoreMessageToInputIfEmpty: (text: string) => void;\n clearMessageRestoreIfEmpty: () => void;\n setSubmittedMessage: (message: string | null) => void;\n resetConversationState: () => void;\n setHasRightPanelToggled: (hasRightPanelToggled: boolean) => void;\n setConversationMode: (conversationMode: ConversationMode) => void;\n setSubConversationTaskId: (taskId: string | null) => void;\n setPlanContent: (planContent: string | null) => void;\n}\n\ntype ConversationStore = ConversationState & ConversationActions;\n\nconst getConversationIdFromLocation = (): string | null => {\n if (typeof window === \"undefined\") {\n return null;\n }\n\n const match = window.location.pathname.match(/\\/conversations\\/([^/]+)/);\n return match ? match[1] : null;\n};\n\nconst getInitialConversationMode = (): ConversationMode => {\n if (typeof window === \"undefined\") {\n return \"code\";\n }\n\n const conversationId = getConversationIdFromLocation();\n if (!conversationId) {\n return \"code\";\n }\n\n const state = getConversationState(conversationId);\n return state.conversationMode;\n};\n\nexport const useConversationStore = create<ConversationStore>()(\n devtools(\n (set) => ({\n // Initial state.\n //\n // The right-side drawer (`isRightPanelShown` / `hasRightPanelToggled`)\n // is intentionally *session-only* state: it always starts closed on\n // app load (or on opening a fresh/existing conversation after a\n // restart), but it survives in-app navigation because the Zustand\n // store stays alive across React Router transitions. Persisting the\n // open/closed state in localStorage made the panel feel sticky in\n // a way users didn't expect — they want a clean, focused chat view\n // when they come back to the app and only want the panel back when\n // they themselves opened it during the current session.\n isRightPanelShown: false,\n isOverviewPanelShown: false,\n isOverviewPanelPeeked: false,\n selectedTab: \"files\" as ConversationTab,\n commitsAutoExpandSection: null,\n images: [],\n files: [],\n imagesMarkedUploadAsFile: [],\n pastedImageNames: [],\n loadingFiles: [],\n loadingImages: [],\n messageToSend: null,\n messageRestoreIfEmpty: null,\n shouldShownAgentLoading: false,\n submittedMessage: null,\n shouldHideSuggestions: false,\n hasRightPanelToggled: false,\n planContent: null,\n conversationMode: getInitialConversationMode(),\n subConversationTaskId: null,\n\n // Actions\n setIsRightPanelShown: (isRightPanelShown) =>\n set({ isRightPanelShown }, false, \"setIsRightPanelShown\"),\n\n setIsOverviewPanelShown: (isOverviewPanelShown) =>\n set(\n { isOverviewPanelShown, isOverviewPanelPeeked: false },\n false,\n \"setIsOverviewPanelShown\",\n ),\n\n setIsOverviewPanelPeeked: (isOverviewPanelPeeked) =>\n set({ isOverviewPanelPeeked }, false, \"setIsOverviewPanelPeeked\"),\n\n setSelectedTab: (selectedTab) =>\n set({ selectedTab }, false, \"setSelectedTab\"),\n\n setCommitsAutoExpandSection: (commitsAutoExpandSection) =>\n set({ commitsAutoExpandSection }, false, \"setCommitsAutoExpandSection\"),\n\n setShouldShownAgentLoading: (shouldShownAgentLoading) =>\n set({ shouldShownAgentLoading }, false, \"setShouldShownAgentLoading\"),\n\n setShouldHideSuggestions: (shouldHideSuggestions) =>\n set({ shouldHideSuggestions }, false, \"setShouldHideSuggestions\"),\n\n addImages: (images) =>\n set(\n (state) => ({ images: [...state.images, ...images] }),\n false,\n \"addImages\",\n ),\n\n addFiles: (files) =>\n set(\n (state) => ({ files: [...state.files, ...files] }),\n false,\n \"addFiles\",\n ),\n\n toggleImageUploadAsFile: (fileName) =>\n set(\n (state) => {\n const marked = new Set(state.imagesMarkedUploadAsFile);\n if (marked.has(fileName)) {\n marked.delete(fileName);\n } else {\n marked.add(fileName);\n }\n return { imagesMarkedUploadAsFile: [...marked] };\n },\n false,\n \"toggleImageUploadAsFile\",\n ),\n\n markImagesAsPasted: (fileNames) =>\n set(\n (state) => {\n const merged = new Set([...state.pastedImageNames, ...fileNames]);\n return { pastedImageNames: [...merged] };\n },\n false,\n \"markImagesAsPasted\",\n ),\n\n removeImage: (index) =>\n set(\n (state) => {\n const removed = state.images[index];\n const newImages = [...state.images];\n newImages.splice(index, 1);\n return {\n images: newImages,\n imagesMarkedUploadAsFile: removed\n ? state.imagesMarkedUploadAsFile.filter(\n (name) => name !== removed.name,\n )\n : state.imagesMarkedUploadAsFile,\n pastedImageNames: removed\n ? state.pastedImageNames.filter((name) => name !== removed.name)\n : state.pastedImageNames,\n };\n },\n false,\n \"removeImage\",\n ),\n\n removeFile: (index) =>\n set(\n (state) => {\n const newFiles = [...state.files];\n newFiles.splice(index, 1);\n return { files: newFiles };\n },\n false,\n \"removeFile\",\n ),\n\n clearImages: () => set({ images: [] }, false, \"clearImages\"),\n\n clearFiles: () => set({ files: [] }, false, \"clearFiles\"),\n\n clearAllFiles: () =>\n set(\n {\n images: [],\n files: [],\n imagesMarkedUploadAsFile: [],\n pastedImageNames: [],\n loadingFiles: [],\n loadingImages: [],\n },\n false,\n \"clearAllFiles\",\n ),\n\n addFileLoading: (fileName) =>\n set(\n (state) => {\n if (!state.loadingFiles.includes(fileName)) {\n return { loadingFiles: [...state.loadingFiles, fileName] };\n }\n return state;\n },\n false,\n \"addFileLoading\",\n ),\n\n removeFileLoading: (fileName) =>\n set(\n (state) => ({\n loadingFiles: state.loadingFiles.filter(\n (name) => name !== fileName,\n ),\n }),\n false,\n \"removeFileLoading\",\n ),\n\n addImageLoading: (imageName) =>\n set(\n (state) => {\n if (!state.loadingImages.includes(imageName)) {\n return { loadingImages: [...state.loadingImages, imageName] };\n }\n return state;\n },\n false,\n \"addImageLoading\",\n ),\n\n removeImageLoading: (imageName) =>\n set(\n (state) => ({\n loadingImages: state.loadingImages.filter(\n (name) => name !== imageName,\n ),\n }),\n false,\n \"removeImageLoading\",\n ),\n\n clearAllLoading: () =>\n set({ loadingFiles: [], loadingImages: [] }, false, \"clearAllLoading\"),\n\n setMessageToSend: (text) =>\n set(\n {\n messageToSend: {\n text,\n timestamp: Date.now(),\n },\n },\n false,\n \"setMessageToSend\",\n ),\n\n // One-shot consume: clear after the composer applies it, so a never-sent\n // value can't replay into another conversation's composer on remount.\n clearMessageToSend: () =>\n set({ messageToSend: null }, false, \"clearMessageToSend\"),\n\n restoreMessageToInputIfEmpty: (text) =>\n set(\n {\n messageRestoreIfEmpty: {\n text,\n timestamp: Date.now(),\n },\n },\n false,\n \"restoreMessageToInputIfEmpty\",\n ),\n\n clearMessageRestoreIfEmpty: () =>\n set(\n { messageRestoreIfEmpty: null },\n false,\n \"clearMessageRestoreIfEmpty\",\n ),\n\n setSubmittedMessage: (submittedMessage) =>\n set({ submittedMessage }, false, \"setSubmittedMessage\"),\n\n resetConversationState: () =>\n set(\n {\n shouldHideSuggestions: false,\n conversationMode: getInitialConversationMode(),\n subConversationTaskId: null,\n planContent: null,\n },\n false,\n \"resetConversationState\",\n ),\n\n setHasRightPanelToggled: (hasRightPanelToggled) =>\n set({ hasRightPanelToggled }, false, \"setHasRightPanelToggled\"),\n\n setConversationMode: (conversationMode) => {\n const conversationId = getConversationIdFromLocation();\n if (conversationId) {\n setConversationState(conversationId, { conversationMode });\n }\n set({ conversationMode }, false, \"setConversationMode\");\n },\n\n setSubConversationTaskId: (subConversationTaskId) =>\n set({ subConversationTaskId }, false, \"setSubConversationTaskId\"),\n\n setPlanContent: (planContent) =>\n set({ planContent }, false, \"setPlanContent\"),\n }),\n {\n name: \"conversation-store\",\n },\n ),\n);\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"conversation-store.js","names":[],"sources":["../../src/stores/conversation-store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { devtools } from \"zustand/middleware\";\nimport {\n getConversationState,\n setConversationState,\n} from \"#/utils/conversation-local-storage\";\n\nexport type ConversationTab =\n | \"files\"\n | \"commits\"\n | \"browser\"\n | \"terminal\"\n | \"planner\"\n | \"tasklist\"\n | \"usage\";\n\nexport type ConversationMode = \"code\" | \"plan\";\n\nexport type CommitsPaneSection = \"uncommitted\";\n\nexport interface IMessageToSend {\n text: string;\n timestamp: number;\n}\n\ninterface ConversationState {\n isRightPanelShown: boolean;\n isOverviewPanelShown: boolean;\n isOverviewPanelPeeked: boolean;\n selectedTab: ConversationTab | null;\n commitsAutoExpandSection: CommitsPaneSection | null;\n images: File[];\n files: File[];\n /** Image file names (e.g. pasted screenshots) to send via file upload instead of vision embed. */\n imagesMarkedUploadAsFile: string[];\n /** Image file names attached in chat (controls per-image upload-as-file UI). */\n pastedImageNames: string[];\n loadingFiles: string[]; // File names currently being processed\n loadingImages: string[]; // Image names currently being processed\n messageToSend: IMessageToSend | null;\n /** One-shot restore request consumed by the chat input when empty. */\n messageRestoreIfEmpty: IMessageToSend | null;\n shouldShownAgentLoading: boolean;\n submittedMessage: string | null;\n shouldHideSuggestions: boolean; // New state to hide suggestions when input expands\n hasRightPanelToggled: boolean;\n planContent: string | null;\n conversationMode: ConversationMode;\n subConversationTaskId: string | null; // Task ID for cloud sub-conversation creation\n localPlanningConversationId: string | null;\n}\n\ninterface ConversationActions {\n setIsRightPanelShown: (isRightPanelShown: boolean) => void;\n setIsOverviewPanelShown: (isOverviewPanelShown: boolean) => void;\n setIsOverviewPanelPeeked: (isOverviewPanelPeeked: boolean) => void;\n setSelectedTab: (selectedTab: ConversationTab | null) => void;\n setCommitsAutoExpandSection: (\n commitsAutoExpandSection: CommitsPaneSection | null,\n ) => void;\n setShouldShownAgentLoading: (shouldShownAgentLoading: boolean) => void;\n setShouldHideSuggestions: (shouldHideSuggestions: boolean) => void;\n addImages: (images: File[]) => void;\n addFiles: (files: File[]) => void;\n toggleImageUploadAsFile: (fileName: string) => void;\n markImagesAsPasted: (fileNames: string[]) => void;\n removeImage: (index: number) => void;\n removeFile: (index: number) => void;\n clearImages: () => void;\n clearFiles: () => void;\n clearAllFiles: () => void;\n addFileLoading: (fileName: string) => void;\n removeFileLoading: (fileName: string) => void;\n addImageLoading: (imageName: string) => void;\n removeImageLoading: (imageName: string) => void;\n clearAllLoading: () => void;\n setMessageToSend: (text: string) => void;\n clearMessageToSend: () => void;\n restoreMessageToInputIfEmpty: (text: string) => void;\n clearMessageRestoreIfEmpty: () => void;\n setSubmittedMessage: (message: string | null) => void;\n resetConversationState: () => void;\n setHasRightPanelToggled: (hasRightPanelToggled: boolean) => void;\n setConversationMode: (conversationMode: ConversationMode) => void;\n setSubConversationTaskId: (taskId: string | null) => void;\n setLocalPlanningConversationId: (conversationId: string | null) => void;\n setPlanContent: (planContent: string | null) => void;\n}\n\ntype ConversationStore = ConversationState & ConversationActions;\n\nconst getConversationIdFromLocation = (): string | null => {\n if (typeof window === \"undefined\") {\n return null;\n }\n\n const match = window.location.pathname.match(/\\/conversations\\/([^/]+)/);\n return match ? match[1] : null;\n};\n\nconst getInitialConversationMode = (): ConversationMode => {\n if (typeof window === \"undefined\") {\n return \"code\";\n }\n\n const conversationId = getConversationIdFromLocation();\n if (!conversationId) {\n return \"code\";\n }\n\n const state = getConversationState(conversationId);\n return state.conversationMode;\n};\n\nexport const useConversationStore = create<ConversationStore>()(\n devtools(\n (set) => ({\n // Initial state.\n //\n // The right-side drawer (`isRightPanelShown` / `hasRightPanelToggled`)\n // is intentionally *session-only* state: it always starts closed on\n // app load (or on opening a fresh/existing conversation after a\n // restart), but it survives in-app navigation because the Zustand\n // store stays alive across React Router transitions. Persisting the\n // open/closed state in localStorage made the panel feel sticky in\n // a way users didn't expect — they want a clean, focused chat view\n // when they come back to the app and only want the panel back when\n // they themselves opened it during the current session.\n isRightPanelShown: false,\n isOverviewPanelShown: false,\n isOverviewPanelPeeked: false,\n selectedTab: \"files\" as ConversationTab,\n commitsAutoExpandSection: null,\n images: [],\n files: [],\n imagesMarkedUploadAsFile: [],\n pastedImageNames: [],\n loadingFiles: [],\n loadingImages: [],\n messageToSend: null,\n messageRestoreIfEmpty: null,\n shouldShownAgentLoading: false,\n submittedMessage: null,\n shouldHideSuggestions: false,\n hasRightPanelToggled: false,\n planContent: null,\n conversationMode: getInitialConversationMode(),\n subConversationTaskId: null,\n localPlanningConversationId: null,\n\n // Actions\n setIsRightPanelShown: (isRightPanelShown) =>\n set({ isRightPanelShown }, false, \"setIsRightPanelShown\"),\n\n setIsOverviewPanelShown: (isOverviewPanelShown) =>\n set(\n { isOverviewPanelShown, isOverviewPanelPeeked: false },\n false,\n \"setIsOverviewPanelShown\",\n ),\n\n setIsOverviewPanelPeeked: (isOverviewPanelPeeked) =>\n set({ isOverviewPanelPeeked }, false, \"setIsOverviewPanelPeeked\"),\n\n setSelectedTab: (selectedTab) =>\n set({ selectedTab }, false, \"setSelectedTab\"),\n\n setCommitsAutoExpandSection: (commitsAutoExpandSection) =>\n set({ commitsAutoExpandSection }, false, \"setCommitsAutoExpandSection\"),\n\n setShouldShownAgentLoading: (shouldShownAgentLoading) =>\n set({ shouldShownAgentLoading }, false, \"setShouldShownAgentLoading\"),\n\n setShouldHideSuggestions: (shouldHideSuggestions) =>\n set({ shouldHideSuggestions }, false, \"setShouldHideSuggestions\"),\n\n addImages: (images) =>\n set(\n (state) => ({ images: [...state.images, ...images] }),\n false,\n \"addImages\",\n ),\n\n addFiles: (files) =>\n set(\n (state) => ({ files: [...state.files, ...files] }),\n false,\n \"addFiles\",\n ),\n\n toggleImageUploadAsFile: (fileName) =>\n set(\n (state) => {\n const marked = new Set(state.imagesMarkedUploadAsFile);\n if (marked.has(fileName)) {\n marked.delete(fileName);\n } else {\n marked.add(fileName);\n }\n return { imagesMarkedUploadAsFile: [...marked] };\n },\n false,\n \"toggleImageUploadAsFile\",\n ),\n\n markImagesAsPasted: (fileNames) =>\n set(\n (state) => {\n const merged = new Set([...state.pastedImageNames, ...fileNames]);\n return { pastedImageNames: [...merged] };\n },\n false,\n \"markImagesAsPasted\",\n ),\n\n removeImage: (index) =>\n set(\n (state) => {\n const removed = state.images[index];\n const newImages = [...state.images];\n newImages.splice(index, 1);\n return {\n images: newImages,\n imagesMarkedUploadAsFile: removed\n ? state.imagesMarkedUploadAsFile.filter(\n (name) => name !== removed.name,\n )\n : state.imagesMarkedUploadAsFile,\n pastedImageNames: removed\n ? state.pastedImageNames.filter((name) => name !== removed.name)\n : state.pastedImageNames,\n };\n },\n false,\n \"removeImage\",\n ),\n\n removeFile: (index) =>\n set(\n (state) => {\n const newFiles = [...state.files];\n newFiles.splice(index, 1);\n return { files: newFiles };\n },\n false,\n \"removeFile\",\n ),\n\n clearImages: () => set({ images: [] }, false, \"clearImages\"),\n\n clearFiles: () => set({ files: [] }, false, \"clearFiles\"),\n\n clearAllFiles: () =>\n set(\n {\n images: [],\n files: [],\n imagesMarkedUploadAsFile: [],\n pastedImageNames: [],\n loadingFiles: [],\n loadingImages: [],\n },\n false,\n \"clearAllFiles\",\n ),\n\n addFileLoading: (fileName) =>\n set(\n (state) => {\n if (!state.loadingFiles.includes(fileName)) {\n return { loadingFiles: [...state.loadingFiles, fileName] };\n }\n return state;\n },\n false,\n \"addFileLoading\",\n ),\n\n removeFileLoading: (fileName) =>\n set(\n (state) => ({\n loadingFiles: state.loadingFiles.filter(\n (name) => name !== fileName,\n ),\n }),\n false,\n \"removeFileLoading\",\n ),\n\n addImageLoading: (imageName) =>\n set(\n (state) => {\n if (!state.loadingImages.includes(imageName)) {\n return { loadingImages: [...state.loadingImages, imageName] };\n }\n return state;\n },\n false,\n \"addImageLoading\",\n ),\n\n removeImageLoading: (imageName) =>\n set(\n (state) => ({\n loadingImages: state.loadingImages.filter(\n (name) => name !== imageName,\n ),\n }),\n false,\n \"removeImageLoading\",\n ),\n\n clearAllLoading: () =>\n set({ loadingFiles: [], loadingImages: [] }, false, \"clearAllLoading\"),\n\n setMessageToSend: (text) =>\n set(\n {\n messageToSend: {\n text,\n timestamp: Date.now(),\n },\n },\n false,\n \"setMessageToSend\",\n ),\n\n // One-shot consume: clear after the composer applies it, so a never-sent\n // value can't replay into another conversation's composer on remount.\n clearMessageToSend: () =>\n set({ messageToSend: null }, false, \"clearMessageToSend\"),\n\n restoreMessageToInputIfEmpty: (text) =>\n set(\n {\n messageRestoreIfEmpty: {\n text,\n timestamp: Date.now(),\n },\n },\n false,\n \"restoreMessageToInputIfEmpty\",\n ),\n\n clearMessageRestoreIfEmpty: () =>\n set(\n { messageRestoreIfEmpty: null },\n false,\n \"clearMessageRestoreIfEmpty\",\n ),\n\n setSubmittedMessage: (submittedMessage) =>\n set({ submittedMessage }, false, \"setSubmittedMessage\"),\n\n resetConversationState: () =>\n set(\n {\n shouldHideSuggestions: false,\n conversationMode: getInitialConversationMode(),\n subConversationTaskId: null,\n localPlanningConversationId: null,\n planContent: null,\n },\n false,\n \"resetConversationState\",\n ),\n\n setHasRightPanelToggled: (hasRightPanelToggled) =>\n set({ hasRightPanelToggled }, false, \"setHasRightPanelToggled\"),\n\n setConversationMode: (conversationMode) => {\n const conversationId = getConversationIdFromLocation();\n if (conversationId) {\n setConversationState(conversationId, { conversationMode });\n }\n set({ conversationMode }, false, \"setConversationMode\");\n },\n\n setSubConversationTaskId: (subConversationTaskId) =>\n set({ subConversationTaskId }, false, \"setSubConversationTaskId\"),\n\n setLocalPlanningConversationId: (localPlanningConversationId) =>\n set(\n { localPlanningConversationId },\n false,\n \"setLocalPlanningConversationId\",\n ),\n\n setPlanContent: (planContent) =>\n set({ planContent }, false, \"setPlanContent\"),\n }),\n {\n name: \"conversation-store\",\n },\n ),\n);\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
require("../_virtual/_rolldown/runtime.cjs");const e=require("../node_modules/zustand/esm/react.cjs"),t=require("../node_modules/zustand/esm/middleware.cjs"),n=require("../node_modules/uuid/dist/v4.cjs");var r=(e,t,n)=>({entriesByConversation:{...e.entriesByConversation,[t]:[...e.entriesByConversation[t]??[],n]}}),i=e.create()(t.devtools(e=>({entriesByConversation:{},activeProfileByConversation:{},show:(t,i,a)=>e(e=>r(e,t,{id:n.default(),anchorEventId:i,profiles:a})),recordSwitch:(t,i,a)=>e(e=>({...r(e,t,{id:n.default(),anchorEventId:i,profiles:[],switchedTo:a}),activeProfileByConversation:{...e.activeProfileByConversation,[t]:a}})),seedSwitches:(t,n)=>e(e=>{let r=e.entriesByConversation[t]??[],i=new Set(r.map(e=>e.id)),a=n.filter(e=>!i.has(e.id)).map(e=>({id:e.id,anchorEventId:e.anchorEventId,profiles:[],switchedTo:e.profileName}));return a.length===0?e:{entriesByConversation:{...e.entriesByConversation,[t]:[...r,...a]}}}),clearActiveProfile:t=>e(e=>{if(!(t in e.activeProfileByConversation))return e;let n={...e.activeProfileByConversation};return delete n[t],{activeProfileByConversation:n}}),clear:t=>e(e=>{let n={...e.entriesByConversation};delete n[t];let r={...e.activeProfileByConversation};return delete r[t],{entriesByConversation:n,activeProfileByConversation:r}}),clearAll:()=>e({entriesByConversation:{},activeProfileByConversation:{}})}),{name:`ModelStore`}));exports.useModelStore=i;
|
|
1
|
+
require("../_virtual/_rolldown/runtime.cjs");const e=require("../node_modules/zustand/esm/react.cjs"),t=require("../node_modules/zustand/esm/middleware.cjs"),n=require("../node_modules/uuid/dist/v4.cjs");var r=(e,t,n)=>({entriesByConversation:{...e.entriesByConversation,[t]:[...e.entriesByConversation[t]??[],n]}}),i=e.create()(t.devtools(e=>({entriesByConversation:{},activeProfileByConversation:{},show:(t,i,a)=>e(e=>r(e,t,{id:n.default(),anchorEventId:i,profiles:a})),recordSwitch:(t,i,a)=>e(e=>({...r(e,t,{id:n.default(),anchorEventId:i,profiles:[],switchedTo:a}),activeProfileByConversation:{...e.activeProfileByConversation,[t]:a}})),seedSwitches:(t,n)=>e(e=>{let r=e.entriesByConversation[t]??[],i=new Set(r.map(e=>e.id)),a=n.filter(e=>!i.has(e.id)).map(e=>({id:e.id,anchorEventId:e.anchorEventId,profiles:[],switchedTo:e.profileName}));return a.length===0?e:{entriesByConversation:{...e.entriesByConversation,[t]:[...r,...a]}}}),setActiveProfile:(t,n)=>e(e=>({activeProfileByConversation:{...e.activeProfileByConversation,[t]:n}})),clearActiveProfile:t=>e(e=>{if(!(t in e.activeProfileByConversation))return e;let n={...e.activeProfileByConversation};return delete n[t],{activeProfileByConversation:n}}),clear:t=>e(e=>{let n={...e.entriesByConversation};delete n[t];let r={...e.activeProfileByConversation};return delete r[t],{entriesByConversation:n,activeProfileByConversation:r}}),clearAll:()=>e({entriesByConversation:{},activeProfileByConversation:{}})}),{name:`ModelStore`}));exports.useModelStore=i;
|
|
2
2
|
//# sourceMappingURL=model-store.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-store.cjs","names":[],"sources":["../../src/stores/model-store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { devtools } from \"zustand/middleware\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport type { ProfileInfo } from \"#/api/profiles-service/profiles-service.api\";\n\nexport interface ModelListEntry {\n id: string;\n /**\n * Id of the chat event after which this entry should render, or `null` to\n * pin it to the top of the chat history (no rendered events at the time\n * of /model).\n */\n anchorEventId: string | null;\n profiles: ProfileInfo[];\n switchedTo?: string;\n}\n\n/**\n * A historical switch to seed via `seedSwitches`. `id` must be stable across\n * reloads (derived from the source observation event id) so re-seeding the\n * same loaded history is idempotent.\n */\nexport interface SeededSwitch {\n id: string;\n anchorEventId: string | null;\n profileName: string;\n}\n\ninterface ModelState {\n entriesByConversation: Record<string, ModelListEntry[]>;\n /**\n * Most-recently-switched profile name per conversation. Updated by\n * `recordSwitch` so the UI (button label, popover check mark) reflects the\n * new selection instantly, before the conversation refetch from the agent\n * server lands.\n */\n activeProfileByConversation: Record<string, string>;\n}\n\ninterface ModelActions {\n show: (\n conversationId: string,\n anchorEventId: string | null,\n profiles: ProfileInfo[],\n ) => void;\n recordSwitch: (\n conversationId: string,\n anchorEventId: string | null,\n profileName: string,\n ) => void;\n /**\n * Seeds \"Switched to\" entries reconstructed from loaded history. Skips any\n * whose `id` is already present, so it can run on every history (re)load\n * without duplicating, and it preserves live-recorded entries.\n */\n seedSwitches: (conversationId: string, switches: SeededSwitch[]) => void;\n /** Drops only the optimistic active-profile entry for a conversation. */\n clearActiveProfile: (conversationId: string) => void;\n clear: (conversationId: string) => void;\n clearAll: () => void;\n}\n\ntype ModelStore = ModelState & ModelActions;\n\nconst appendEntry = (\n state: ModelState,\n conversationId: string,\n entry: ModelListEntry,\n): Pick<ModelState, \"entriesByConversation\"> => ({\n entriesByConversation: {\n ...state.entriesByConversation,\n [conversationId]: [\n ...(state.entriesByConversation[conversationId] ?? []),\n entry,\n ],\n },\n});\n\nexport const useModelStore = create<ModelStore>()(\n devtools(\n (set) => ({\n entriesByConversation: {},\n activeProfileByConversation: {},\n show: (conversationId, anchorEventId, profiles) =>\n set((s) =>\n appendEntry(s, conversationId, {\n id: uuidv4(),\n anchorEventId,\n profiles,\n }),\n ),\n recordSwitch: (conversationId, anchorEventId, profileName) =>\n set((s) => ({\n ...appendEntry(s, conversationId, {\n id: uuidv4(),\n anchorEventId,\n profiles: [],\n switchedTo: profileName,\n }),\n activeProfileByConversation: {\n ...s.activeProfileByConversation,\n [conversationId]: profileName,\n },\n })),\n seedSwitches: (conversationId, switches) =>\n set((s) => {\n const existing = s.entriesByConversation[conversationId] ?? [];\n const existingIds = new Set(existing.map((e) => e.id));\n const additions = switches\n .filter((sw) => !existingIds.has(sw.id))\n .map(\n (sw): ModelListEntry => ({\n id: sw.id,\n anchorEventId: sw.anchorEventId,\n profiles: [],\n switchedTo: sw.profileName,\n }),\n );\n if (additions.length === 0) return s;\n return {\n entriesByConversation: {\n ...s.entriesByConversation,\n [conversationId]: [...existing, ...additions],\n },\n };\n }),\n clearActiveProfile: (conversationId) =>\n set((s) => {\n if (!(conversationId in s.activeProfileByConversation)) return s;\n const activeProfileByConversation = {\n ...s.activeProfileByConversation,\n };\n delete activeProfileByConversation[conversationId];\n return { activeProfileByConversation };\n }),\n clear: (conversationId) =>\n set((s) => {\n const entriesByConversation = { ...s.entriesByConversation };\n delete entriesByConversation[conversationId];\n const activeProfileByConversation = {\n ...s.activeProfileByConversation,\n };\n delete activeProfileByConversation[conversationId];\n return { entriesByConversation, activeProfileByConversation };\n }),\n clearAll: () =>\n set({ entriesByConversation: {}, activeProfileByConversation: {} }),\n }),\n { name: \"ModelStore\" },\n ),\n);\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"model-store.cjs","names":[],"sources":["../../src/stores/model-store.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { devtools } from \"zustand/middleware\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport type { ProfileInfo } from \"#/api/profiles-service/profiles-service.api\";\n\nexport interface ModelListEntry {\n id: string;\n /**\n * Id of the chat event after which this entry should render, or `null` to\n * pin it to the top of the chat history (no rendered events at the time\n * of /model).\n */\n anchorEventId: string | null;\n profiles: ProfileInfo[];\n switchedTo?: string;\n}\n\n/**\n * A historical switch to seed via `seedSwitches`. `id` must be stable across\n * reloads (derived from the source observation event id) so re-seeding the\n * same loaded history is idempotent.\n */\nexport interface SeededSwitch {\n id: string;\n anchorEventId: string | null;\n profileName: string;\n}\n\ninterface ModelState {\n entriesByConversation: Record<string, ModelListEntry[]>;\n /**\n * Most-recently-switched profile name per conversation. Updated by\n * `recordSwitch` so the UI (button label, popover check mark) reflects the\n * new selection instantly, before the conversation refetch from the agent\n * server lands.\n */\n activeProfileByConversation: Record<string, string>;\n}\n\ninterface ModelActions {\n show: (\n conversationId: string,\n anchorEventId: string | null,\n profiles: ProfileInfo[],\n ) => void;\n recordSwitch: (\n conversationId: string,\n anchorEventId: string | null,\n profileName: string,\n ) => void;\n /**\n * Seeds \"Switched to\" entries reconstructed from loaded history. Skips any\n * whose `id` is already present, so it can run on every history (re)load\n * without duplicating, and it preserves live-recorded entries.\n */\n seedSwitches: (conversationId: string, switches: SeededSwitch[]) => void;\n /**\n * Sets the optimistic active-profile entry for a conversation without\n * appending a chat entry — the reload/history path re-derives the stamp\n * from past SwitchLLM observations, which seed their chat entries through\n * `seedSwitches` instead of `recordSwitch`.\n */\n setActiveProfile: (conversationId: string, profileName: string) => void;\n /** Drops only the optimistic active-profile entry for a conversation. */\n clearActiveProfile: (conversationId: string) => void;\n clear: (conversationId: string) => void;\n clearAll: () => void;\n}\n\ntype ModelStore = ModelState & ModelActions;\n\nconst appendEntry = (\n state: ModelState,\n conversationId: string,\n entry: ModelListEntry,\n): Pick<ModelState, \"entriesByConversation\"> => ({\n entriesByConversation: {\n ...state.entriesByConversation,\n [conversationId]: [\n ...(state.entriesByConversation[conversationId] ?? []),\n entry,\n ],\n },\n});\n\nexport const useModelStore = create<ModelStore>()(\n devtools(\n (set) => ({\n entriesByConversation: {},\n activeProfileByConversation: {},\n show: (conversationId, anchorEventId, profiles) =>\n set((s) =>\n appendEntry(s, conversationId, {\n id: uuidv4(),\n anchorEventId,\n profiles,\n }),\n ),\n recordSwitch: (conversationId, anchorEventId, profileName) =>\n set((s) => ({\n ...appendEntry(s, conversationId, {\n id: uuidv4(),\n anchorEventId,\n profiles: [],\n switchedTo: profileName,\n }),\n activeProfileByConversation: {\n ...s.activeProfileByConversation,\n [conversationId]: profileName,\n },\n })),\n seedSwitches: (conversationId, switches) =>\n set((s) => {\n const existing = s.entriesByConversation[conversationId] ?? [];\n const existingIds = new Set(existing.map((e) => e.id));\n const additions = switches\n .filter((sw) => !existingIds.has(sw.id))\n .map(\n (sw): ModelListEntry => ({\n id: sw.id,\n anchorEventId: sw.anchorEventId,\n profiles: [],\n switchedTo: sw.profileName,\n }),\n );\n if (additions.length === 0) return s;\n return {\n entriesByConversation: {\n ...s.entriesByConversation,\n [conversationId]: [...existing, ...additions],\n },\n };\n }),\n setActiveProfile: (conversationId, profileName) =>\n set((s) => ({\n activeProfileByConversation: {\n ...s.activeProfileByConversation,\n [conversationId]: profileName,\n },\n })),\n clearActiveProfile: (conversationId) =>\n set((s) => {\n if (!(conversationId in s.activeProfileByConversation)) return s;\n const activeProfileByConversation = {\n ...s.activeProfileByConversation,\n };\n delete activeProfileByConversation[conversationId];\n return { activeProfileByConversation };\n }),\n clear: (conversationId) =>\n set((s) => {\n const entriesByConversation = { ...s.entriesByConversation };\n delete entriesByConversation[conversationId];\n const activeProfileByConversation = {\n ...s.activeProfileByConversation,\n };\n delete activeProfileByConversation[conversationId];\n return { entriesByConversation, activeProfileByConversation };\n }),\n clearAll: () =>\n set({ entriesByConversation: {}, activeProfileByConversation: {} }),\n }),\n { name: \"ModelStore\" },\n ),\n);\n"],"mappings":"4MAuEA,IAAM,GACJ,EACA,EACA,KAC+C,CAC/C,sBAAuB,CACrB,GAAG,EAAM,uBACR,GAAiB,CAChB,GAAI,EAAM,sBAAsB,IAAmB,CAAC,EACpD,CACF,CACF,CACF,GAEa,EAAgB,EAAA,OAAmB,EAC9C,EAAA,SACG,IAAS,CACR,sBAAuB,CAAC,EACxB,4BAA6B,CAAC,EAC9B,MAAO,EAAgB,EAAe,IACpC,EAAK,GACH,EAAY,EAAG,EAAgB,CAC7B,GAAI,EAAA,QAAO,EACX,gBACA,UACF,CAAC,CACH,EACF,cAAe,EAAgB,EAAe,IAC5C,EAAK,IAAO,CACV,GAAG,EAAY,EAAG,EAAgB,CAChC,GAAI,EAAA,QAAO,EACX,gBACA,SAAU,CAAC,EACX,WAAY,CACd,CAAC,EACD,4BAA6B,CAC3B,GAAG,EAAE,6BACJ,GAAiB,CACpB,CACF,EAAE,EACJ,cAAe,EAAgB,IAC7B,EAAK,GAAM,CACT,IAAM,EAAW,EAAE,sBAAsB,IAAmB,CAAC,EACvD,EAAc,IAAI,IAAI,EAAS,IAAK,GAAM,EAAE,EAAE,CAAC,EAC/C,EAAY,EACf,OAAQ,GAAO,CAAC,EAAY,IAAI,EAAG,EAAE,CAAC,EACtC,IACE,IAAwB,CACvB,GAAI,EAAG,GACP,cAAe,EAAG,cAClB,SAAU,CAAC,EACX,WAAY,EAAG,WACjB,EACF,EAEF,OADI,EAAU,SAAW,EAAU,EAC5B,CACL,sBAAuB,CACrB,GAAG,EAAE,uBACJ,GAAiB,CAAC,GAAG,EAAU,GAAG,CAAS,CAC9C,CACF,CACF,CAAC,EACH,kBAAmB,EAAgB,IACjC,EAAK,IAAO,CACV,4BAA6B,CAC3B,GAAG,EAAE,6BACJ,GAAiB,CACpB,CACF,EAAE,EACJ,mBAAqB,GACnB,EAAK,GAAM,CACT,GAAI,EAAE,KAAkB,EAAE,6BAA8B,OAAO,EAC/D,IAAM,EAA8B,CAClC,GAAG,EAAE,2BACP,EAEA,OADA,OAAO,EAA4B,GAC5B,CAAE,6BAA4B,CACvC,CAAC,EACH,MAAQ,GACN,EAAK,GAAM,CACT,IAAM,EAAwB,CAAE,GAAG,EAAE,qBAAsB,EAC3D,OAAO,EAAsB,GAC7B,IAAM,EAA8B,CAClC,GAAG,EAAE,2BACP,EAEA,OADA,OAAO,EAA4B,GAC5B,CAAE,wBAAuB,6BAA4B,CAC9D,CAAC,EACH,aACE,EAAI,CAAE,sBAAuB,CAAC,EAAG,4BAA6B,CAAC,CAAE,CAAC,CACtE,GACA,CAAE,KAAM,YAAa,CACvB,CACF"}
|
|
@@ -39,6 +39,13 @@ interface ModelActions {
|
|
|
39
39
|
* without duplicating, and it preserves live-recorded entries.
|
|
40
40
|
*/
|
|
41
41
|
seedSwitches: (conversationId: string, switches: SeededSwitch[]) => void;
|
|
42
|
+
/**
|
|
43
|
+
* Sets the optimistic active-profile entry for a conversation without
|
|
44
|
+
* appending a chat entry — the reload/history path re-derives the stamp
|
|
45
|
+
* from past SwitchLLM observations, which seed their chat entries through
|
|
46
|
+
* `seedSwitches` instead of `recordSwitch`.
|
|
47
|
+
*/
|
|
48
|
+
setActiveProfile: (conversationId: string, profileName: string) => void;
|
|
42
49
|
/** Drops only the optimistic active-profile entry for a conversation. */
|
|
43
50
|
clearActiveProfile: (conversationId: string) => void;
|
|
44
51
|
clear: (conversationId: string) => void;
|
|
@@ -37,6 +37,10 @@ var r = (e, t, n) => ({ entriesByConversation: {
|
|
|
37
37
|
[t]: [...r, ...a]
|
|
38
38
|
} };
|
|
39
39
|
}),
|
|
40
|
+
setActiveProfile: (t, n) => e((e) => ({ activeProfileByConversation: {
|
|
41
|
+
...e.activeProfileByConversation,
|
|
42
|
+
[t]: n
|
|
43
|
+
} })),
|
|
40
44
|
clearActiveProfile: (t) => e((e) => {
|
|
41
45
|
if (!(t in e.activeProfileByConversation)) return e;
|
|
42
46
|
let n = { ...e.activeProfileByConversation };
|