@hienlh/ppm 0.23.13 → 0.23.15
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/CHANGELOG.md +58 -0
- package/CLAUDE.md +19 -4
- package/THIRD-PARTY-NOTICES.md +1 -1
- package/assets/skills/ppm/SKILL.md +3 -2
- package/assets/skills/ppm/references/cli-reference.md +4 -4
- package/assets/skills/ppm/references/common-tasks.md +6 -0
- package/assets/skills/ppm/references/http-api.md +13 -1
- package/bun.lock +15 -0
- package/dist/web/assets/accounts-settings-section-B5YXy0vd.js +1 -0
- package/dist/web/assets/accounts-settings-section-B5YXy0vd.js.br +0 -0
- package/dist/web/assets/accounts-settings-section-B5YXy0vd.js.gz +0 -0
- package/dist/web/assets/adaptive-context-menu-C4jNSORA.js +1 -0
- package/dist/web/assets/adaptive-context-menu-C4jNSORA.js.br +0 -0
- package/dist/web/assets/adaptive-context-menu-C4jNSORA.js.gz +0 -0
- package/dist/web/assets/agent-session-sheet-Bj42PwCK.js +2 -0
- package/dist/web/assets/agent-session-sheet-Bj42PwCK.js.br +0 -0
- package/dist/web/assets/agent-session-sheet-Bj42PwCK.js.gz +0 -0
- package/dist/web/assets/agent-session-sheet-store-BAfLnsLX.js +1 -0
- package/dist/web/assets/agent-session-window-content-LqL6fVPU.js +1 -0
- package/dist/web/assets/agent-session-window-content-LqL6fVPU.js.br +0 -0
- package/dist/web/assets/agent-session-window-content-LqL6fVPU.js.gz +0 -0
- package/dist/web/assets/ai-resource-editor-jVv2nvAG.js +1 -0
- package/dist/web/assets/ai-resource-editor-jVv2nvAG.js.br +0 -0
- package/dist/web/assets/ai-resource-editor-jVv2nvAG.js.gz +0 -0
- package/dist/web/assets/ai-settings-section-C9Q-v8fY.js +1 -0
- package/dist/web/assets/ai-settings-section-C9Q-v8fY.js.br +0 -0
- package/dist/web/assets/ai-settings-section-C9Q-v8fY.js.gz +0 -0
- package/dist/web/assets/ai-settings-section-CN5BR1ZZ.js +1 -0
- package/dist/web/assets/android-tab-CwqiuEZP.js +2 -0
- package/dist/web/assets/android-tab-CwqiuEZP.js.br +0 -0
- package/dist/web/assets/android-tab-CwqiuEZP.js.gz +0 -0
- package/dist/web/assets/api-client-xQDlhUTu.js +1 -0
- package/dist/web/assets/api-client-xQDlhUTu.js.br +0 -0
- package/dist/web/assets/api-client-xQDlhUTu.js.gz +0 -0
- package/dist/web/assets/api-client-xR05zj6r.js +1 -0
- package/dist/web/assets/api-settings-VAi0LpIJ.js +1 -0
- package/dist/web/assets/api-settings-vmIRFNwZ.js +1 -0
- package/dist/web/assets/api-settings-vmIRFNwZ.js.br +0 -0
- package/dist/web/assets/api-settings-vmIRFNwZ.js.gz +0 -0
- package/dist/web/assets/api-themes-CaXofG7d.js +1 -0
- package/dist/web/assets/appearance-settings-section-D0JIfiRx.js +1 -0
- package/dist/web/assets/appearance-settings-section-D0JIfiRx.js.br +0 -0
- package/dist/web/assets/appearance-settings-section-D0JIfiRx.js.gz +0 -0
- package/dist/web/assets/apps-panel-Cz_KJ37M.js +1 -0
- package/dist/web/assets/apps-panel-Cz_KJ37M.js.br +0 -0
- package/dist/web/assets/apps-panel-Cz_KJ37M.js.gz +0 -0
- package/dist/web/assets/audio-preview-Dq7qZ_6i.js +1 -0
- package/dist/web/assets/audio-preview-Dq7qZ_6i.js.br +0 -0
- package/dist/web/assets/audio-preview-Dq7qZ_6i.js.gz +0 -0
- package/dist/web/assets/branch-review-tab-C3QNpsm7.js +1 -0
- package/dist/web/assets/branch-review-tab-C3QNpsm7.js.br +0 -0
- package/dist/web/assets/branch-review-tab-C3QNpsm7.js.gz +0 -0
- package/dist/web/assets/button-C9ZXWb3b.js +1 -0
- package/dist/web/assets/button-C9ZXWb3b.js.br +0 -0
- package/dist/web/assets/button-C9ZXWb3b.js.gz +0 -0
- package/dist/web/assets/chat-preparation-cache-190LLyy7.js +1 -0
- package/dist/web/assets/chat-preparation-cache-190LLyy7.js.br +0 -0
- package/dist/web/assets/chat-preparation-cache-190LLyy7.js.gz +0 -0
- package/dist/web/assets/chat-tab-D14CUl0J.js +1 -0
- package/dist/web/assets/chat-tab-D14CUl0J.js.br +0 -0
- package/dist/web/assets/chat-tab-D14CUl0J.js.gz +0 -0
- package/dist/web/assets/chat-tab-D8iAVZKV.js +16 -0
- package/dist/web/assets/chat-tab-D8iAVZKV.js.br +0 -0
- package/dist/web/assets/chat-tab-D8iAVZKV.js.gz +0 -0
- package/dist/web/assets/code-editor-B7gbH4-x.js +10 -0
- package/dist/web/assets/code-editor-B7gbH4-x.js.br +0 -0
- package/dist/web/assets/code-editor-B7gbH4-x.js.gz +0 -0
- package/dist/web/assets/codex-reset-credit-button-DQDtyvnd.js +1 -0
- package/dist/web/assets/codex-reset-credit-button-DQDtyvnd.js.br +0 -0
- package/dist/web/assets/codex-reset-credit-button-DQDtyvnd.js.gz +0 -0
- package/dist/web/assets/conflict-editor-ktOkrODA.js +19 -0
- package/dist/web/assets/conflict-editor-ktOkrODA.js.br +0 -0
- package/dist/web/assets/conflict-editor-ktOkrODA.js.gz +0 -0
- package/dist/web/assets/connection-form-tab-CxvExR7T.js +4 -0
- package/dist/web/assets/connection-form-tab-CxvExR7T.js.br +0 -0
- package/dist/web/assets/connection-form-tab-CxvExR7T.js.gz +0 -0
- package/dist/web/assets/context-menu-BCuZYfWC.js +1 -0
- package/dist/web/assets/context-menu-BCuZYfWC.js.br +0 -0
- package/dist/web/assets/context-menu-BCuZYfWC.js.gz +0 -0
- package/dist/web/assets/createLucideIcon-D9_fdOKS.js +1 -0
- package/dist/web/assets/createLucideIcon-D9_fdOKS.js.br +0 -0
- package/dist/web/assets/createLucideIcon-D9_fdOKS.js.gz +0 -0
- package/dist/web/assets/csv-preview-CBDMTEsF.js +10 -0
- package/dist/web/assets/csv-preview-CBDMTEsF.js.br +0 -0
- package/dist/web/assets/csv-preview-CBDMTEsF.js.gz +0 -0
- package/dist/web/assets/database-drivers-section-DJvU6bf5.js +1 -0
- package/dist/web/assets/database-drivers-section-DJvU6bf5.js.br +0 -0
- package/dist/web/assets/database-drivers-section-DJvU6bf5.js.gz +0 -0
- package/dist/web/assets/db-ai-tools-CVbbW_MZ.js +1 -0
- package/dist/web/assets/db-ai-tools-CVbbW_MZ.js.br +0 -0
- package/dist/web/assets/db-ai-tools-CVbbW_MZ.js.gz +0 -0
- package/dist/web/assets/db-explorer-store-BmpvDHz6.js +1 -0
- package/dist/web/assets/db-explorer-store-BmpvDHz6.js.br +0 -0
- package/dist/web/assets/db-explorer-store-BmpvDHz6.js.gz +0 -0
- package/dist/web/assets/db-sidebar-reveal-_qw0CliT.js +1 -0
- package/dist/web/assets/db-sidebar-reveal-_qw0CliT.js.br +0 -0
- package/dist/web/assets/db-sidebar-reveal-_qw0CliT.js.gz +0 -0
- package/dist/web/assets/db-tab-parts-BgVpKbi6.js +1 -0
- package/dist/web/assets/db-tab-parts-BgVpKbi6.js.br +0 -0
- package/dist/web/assets/db-tab-parts-BgVpKbi6.js.gz +0 -0
- package/dist/web/assets/db-types-CNhENouW.js +1 -0
- package/dist/web/assets/design-canvas-check-BIHc2d_k.js +1 -0
- package/dist/web/assets/design-canvas-check-BIHc2d_k.js.br +0 -0
- package/dist/web/assets/design-canvas-check-BIHc2d_k.js.gz +0 -0
- package/dist/web/assets/design-export-client-CJ3w7Zrk.js +1 -0
- package/dist/web/assets/design-export-client-CJ3w7Zrk.js.br +0 -0
- package/dist/web/assets/design-export-client-CJ3w7Zrk.js.gz +0 -0
- package/dist/web/assets/design-responsive-dialog-MAFgVOmv.js +1 -0
- package/dist/web/assets/design-responsive-dialog-MAFgVOmv.js.br +0 -0
- package/dist/web/assets/design-responsive-dialog-MAFgVOmv.js.gz +0 -0
- package/dist/web/assets/design-settings-section-DPGw61pY.js +2 -0
- package/dist/web/assets/design-settings-section-DPGw61pY.js.br +0 -0
- package/dist/web/assets/design-settings-section-DPGw61pY.js.gz +0 -0
- package/dist/web/assets/design-skill-suggestion-Dmmg_ap5.js +3 -0
- package/dist/web/assets/design-skill-suggestion-Dmmg_ap5.js.br +0 -0
- package/dist/web/assets/design-skill-suggestion-Dmmg_ap5.js.gz +0 -0
- package/dist/web/assets/design-tab-BiCqHNl3.js +57 -0
- package/dist/web/assets/design-tab-BiCqHNl3.js.br +0 -0
- package/dist/web/assets/design-tab-BiCqHNl3.js.gz +0 -0
- package/dist/web/assets/designs-sidebar-panel-pcJ2Rx5G.js +1 -0
- package/dist/web/assets/designs-sidebar-panel-pcJ2Rx5G.js.br +0 -0
- package/dist/web/assets/designs-sidebar-panel-pcJ2Rx5G.js.gz +0 -0
- package/dist/web/assets/dialog-Dn_2tuYa.js +1 -0
- package/dist/web/assets/dialog-Dn_2tuYa.js.br +0 -0
- package/dist/web/assets/dialog-Dn_2tuYa.js.gz +0 -0
- package/dist/web/assets/diff-viewer-CLAvyqVG.js +4 -0
- package/dist/web/assets/diff-viewer-CLAvyqVG.js.br +0 -0
- package/dist/web/assets/diff-viewer-CLAvyqVG.js.gz +0 -0
- package/dist/web/assets/docx-preview-XSkD2IL6.js +12 -0
- package/dist/web/assets/docx-preview-XSkD2IL6.js.br +0 -0
- package/dist/web/assets/docx-preview-XSkD2IL6.js.gz +0 -0
- package/dist/web/assets/dropdown-menu-BQidk_OJ.js +1 -0
- package/dist/web/assets/dropdown-menu-BQidk_OJ.js.br +0 -0
- package/dist/web/assets/dropdown-menu-BQidk_OJ.js.gz +0 -0
- package/dist/web/assets/edit-diff-preview-DyWUMlkI.js +7 -0
- package/dist/web/assets/edit-diff-preview-DyWUMlkI.js.br +0 -0
- package/dist/web/assets/edit-diff-preview-DyWUMlkI.js.gz +0 -0
- package/dist/web/assets/editor-dialog-cQvqVZAR.js +1 -0
- package/dist/web/assets/editor-dialog-cQvqVZAR.js.br +0 -0
- package/dist/web/assets/editor-dialog-cQvqVZAR.js.gz +0 -0
- package/dist/web/assets/editor-language-service-6-7mS6_9.js +1 -0
- package/dist/web/assets/editor-language-service-6-7mS6_9.js.br +0 -0
- package/dist/web/assets/editor-language-service-6-7mS6_9.js.gz +0 -0
- package/dist/web/assets/explorer-body-BlGDPmNa.js +2 -0
- package/dist/web/assets/explorer-body-BlGDPmNa.js.br +0 -0
- package/dist/web/assets/explorer-body-BlGDPmNa.js.gz +0 -0
- package/dist/web/assets/explorer-model-BtJN4MZ9.js +1 -0
- package/dist/web/assets/explorer-model-BtJN4MZ9.js.br +0 -0
- package/dist/web/assets/explorer-model-BtJN4MZ9.js.gz +0 -0
- package/dist/web/assets/explorer-window-content-BLWY8GJ_.js +1 -0
- package/dist/web/assets/explorer-window-content-BLWY8GJ_.js.br +0 -0
- package/dist/web/assets/explorer-window-content-BLWY8GJ_.js.gz +0 -0
- package/dist/web/assets/extension-manager-section-NSEt5f4z.js +1 -0
- package/dist/web/assets/extension-manager-section-NSEt5f4z.js.br +0 -0
- package/dist/web/assets/extension-manager-section-NSEt5f4z.js.gz +0 -0
- package/dist/web/assets/extension-webview-BkAEBWin.js +12 -0
- package/dist/web/assets/extension-webview-BkAEBWin.js.br +0 -0
- package/dist/web/assets/extension-webview-BkAEBWin.js.gz +0 -0
- package/dist/web/assets/file-diff-CcDhJkXB.js +1 -0
- package/dist/web/assets/file-icons-JInFtBVl.js +1 -0
- package/dist/web/assets/file-icons-JInFtBVl.js.br +0 -0
- package/dist/web/assets/file-icons-JInFtBVl.js.gz +0 -0
- package/dist/web/assets/file-store-BQ41vIs5.js +1 -0
- package/dist/web/assets/file-store-BQ41vIs5.js.br +0 -0
- package/dist/web/assets/file-store-BQ41vIs5.js.gz +0 -0
- package/dist/web/assets/files-settings-section-Bq7liJ_r.js +1 -0
- package/dist/web/assets/files-settings-section-Bq7liJ_r.js.br +0 -0
- package/dist/web/assets/files-settings-section-Bq7liJ_r.js.gz +0 -0
- package/dist/web/assets/filter-dialog-frame-BkEbqBA4.js +1 -0
- package/dist/web/assets/filter-dialog-frame-BkEbqBA4.js.br +0 -0
- package/dist/web/assets/filter-dialog-frame-BkEbqBA4.js.gz +0 -0
- package/dist/web/assets/format-file-meta-DdYtk07C.js +1 -0
- package/dist/web/assets/format-file-meta-DdYtk07C.js.br +0 -0
- package/dist/web/assets/format-file-meta-DdYtk07C.js.gz +0 -0
- package/dist/web/assets/fs-api-CFtQzsIJ.js +1 -0
- package/dist/web/assets/fs-api-CFtQzsIJ.js.br +0 -0
- package/dist/web/assets/fs-api-CFtQzsIJ.js.gz +0 -0
- package/dist/web/assets/general-settings-section-DvHROAMa.js +1 -0
- package/dist/web/assets/general-settings-section-DvHROAMa.js.br +0 -0
- package/dist/web/assets/general-settings-section-DvHROAMa.js.gz +0 -0
- package/dist/web/assets/git-commit-horizontal-BPdj2L1i.js +1 -0
- package/dist/web/assets/git-log-panel-Cu9kK48H.js +1 -0
- package/dist/web/assets/git-log-panel-Cu9kK48H.js.br +0 -0
- package/dist/web/assets/git-log-panel-Cu9kK48H.js.gz +0 -0
- package/dist/web/assets/git-repo-store-CKB5fdNP.js +1 -0
- package/dist/web/assets/git-repo-store-CKB5fdNP.js.br +0 -0
- package/dist/web/assets/git-repo-store-CKB5fdNP.js.gz +0 -0
- package/dist/web/assets/git-review-tab-B_JT649W.js +3 -0
- package/dist/web/assets/git-review-tab-B_JT649W.js.br +0 -0
- package/dist/web/assets/git-review-tab-B_JT649W.js.gz +0 -0
- package/dist/web/assets/glide-data-grid-BlposOph.js +177 -0
- package/dist/web/assets/glide-data-grid-BlposOph.js.br +0 -0
- package/dist/web/assets/glide-data-grid-BlposOph.js.gz +0 -0
- package/dist/web/assets/grid-save-dialog-B0d0qhnN.js +2 -0
- package/dist/web/assets/grid-save-dialog-B0d0qhnN.js.br +0 -0
- package/dist/web/assets/grid-save-dialog-B0d0qhnN.js.gz +0 -0
- package/dist/web/assets/group-chat-tab-jirUsGm-.js +1 -0
- package/dist/web/assets/group-chat-tab-jirUsGm-.js.br +0 -0
- package/dist/web/assets/group-chat-tab-jirUsGm-.js.gz +0 -0
- package/dist/web/assets/html-preview-loads-CMWBC-iv.js +1 -0
- package/dist/web/assets/icons-BwyIKaTT.js +1 -0
- package/dist/web/assets/icons-BwyIKaTT.js.br +0 -0
- package/dist/web/assets/icons-BwyIKaTT.js.gz +0 -0
- package/dist/web/assets/image-preview-gOBK9zED.js +1 -0
- package/dist/web/assets/impexp-tab-HJVcOTYJ.js +1 -0
- package/dist/web/assets/impexp-tab-HJVcOTYJ.js.br +0 -0
- package/dist/web/assets/impexp-tab-HJVcOTYJ.js.gz +0 -0
- package/dist/web/assets/index-DLB3j_P0.js +59 -0
- package/dist/web/assets/index-DLB3j_P0.js.br +0 -0
- package/dist/web/assets/index-DLB3j_P0.js.gz +0 -0
- package/dist/web/assets/index-M3DUzop8.css +1 -0
- package/dist/web/assets/index-M3DUzop8.css.br +0 -0
- package/dist/web/assets/index-M3DUzop8.css.gz +0 -0
- package/dist/web/assets/input-C3oVNCMq.js +1 -0
- package/dist/web/assets/jira-watcher-section-EQvdnETB.js +1 -0
- package/dist/web/assets/keybindings-store-CEy-Sdcc.js +1 -0
- package/dist/web/assets/keyboard-shortcuts-section-DN21gB-T.js +1 -0
- package/dist/web/assets/keyboard-shortcuts-section-DN21gB-T.js.br +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-DN21gB-T.js.gz +0 -0
- package/dist/web/assets/language-servers-section-DOcZ72FJ.js +2 -0
- package/dist/web/assets/language-servers-section-DOcZ72FJ.js.br +0 -0
- package/dist/web/assets/language-servers-section-DOcZ72FJ.js.gz +0 -0
- package/dist/web/assets/lib-5Chotbwm.js +2 -0
- package/dist/web/assets/lib-5Chotbwm.js.br +0 -0
- package/dist/web/assets/lib-5Chotbwm.js.gz +0 -0
- package/dist/web/assets/logs-app-C7n9GSCn.js +13 -0
- package/dist/web/assets/logs-app-C7n9GSCn.js.br +0 -0
- package/dist/web/assets/logs-app-C7n9GSCn.js.gz +0 -0
- package/dist/web/assets/logs-tab-CSOiexvx.js +1 -0
- package/dist/web/assets/logs-window-content-C4Qs6-0q.js +1 -0
- package/dist/web/assets/lsp-client-DpYmPhXX.js +1 -0
- package/dist/web/assets/lsp-client-DpYmPhXX.js.br +0 -0
- package/dist/web/assets/lsp-client-DpYmPhXX.js.gz +0 -0
- package/dist/web/assets/markdown-renderer-CtEl6qAt.js +4 -0
- package/dist/web/assets/markdown-renderer-CtEl6qAt.js.br +0 -0
- package/dist/web/assets/markdown-renderer-CtEl6qAt.js.gz +0 -0
- package/dist/web/assets/markdown-renderer-Df3r-CCb.js +1 -0
- package/dist/web/assets/media-url-Cn2yRAxP.js +1 -0
- package/dist/web/assets/metric-chart-canvas-DEW16Su8.js +1 -0
- package/dist/web/assets/metric-chart-canvas-DEW16Su8.js.br +0 -0
- package/dist/web/assets/metric-chart-canvas-DEW16Su8.js.gz +0 -0
- package/dist/web/assets/mobile-bottom-sheet-DArbIyrD.js +1 -0
- package/dist/web/assets/mobile-bottom-sheet-DArbIyrD.js.br +0 -0
- package/dist/web/assets/mobile-bottom-sheet-DArbIyrD.js.gz +0 -0
- package/dist/web/assets/mobile-explorer-sheet-B-rcKEL9.js +1 -0
- package/dist/web/assets/mobile-explorer-sheet-B-rcKEL9.js.br +0 -0
- package/dist/web/assets/mobile-explorer-sheet-B-rcKEL9.js.gz +0 -0
- package/dist/web/assets/new-design-dialog-DgztQK5R.js +1 -0
- package/dist/web/assets/new-design-dialog-DgztQK5R.js.br +0 -0
- package/dist/web/assets/new-design-dialog-DgztQK5R.js.gz +0 -0
- package/dist/web/assets/notification-store-B92dvP_u.js +1 -0
- package/dist/web/assets/notifications-settings-section-JiGvaCFx.js +1 -0
- package/dist/web/assets/notifications-settings-section-JiGvaCFx.js.br +0 -0
- package/dist/web/assets/notifications-settings-section-JiGvaCFx.js.gz +0 -0
- package/dist/web/assets/onboarding-entry-eehqBvyM.js +1 -0
- package/dist/web/assets/onboarding-entry-eehqBvyM.js.br +0 -0
- package/dist/web/assets/onboarding-entry-eehqBvyM.js.gz +0 -0
- package/dist/web/assets/onboarding-quick-orientation-CTHtIRib.js +1 -0
- package/dist/web/assets/onboarding-quick-orientation-CTHtIRib.js.br +0 -0
- package/dist/web/assets/onboarding-quick-orientation-CTHtIRib.js.gz +0 -0
- package/dist/web/assets/open-db-tabs-CtWIWHOa.js +1 -0
- package/dist/web/assets/open-db-tabs-CtWIWHOa.js.br +0 -0
- package/dist/web/assets/open-db-tabs-CtWIWHOa.js.gz +0 -0
- package/dist/web/assets/open-settings-EXR4zoZG.js +1 -0
- package/dist/web/assets/overview-panel-DEGF2DmZ.js +1 -0
- package/dist/web/assets/overview-panel-DEGF2DmZ.js.br +0 -0
- package/dist/web/assets/overview-panel-DEGF2DmZ.js.gz +0 -0
- package/dist/web/assets/panel-store-BJhazigC.js +1 -0
- package/dist/web/assets/panel-store-BJhazigC.js.br +0 -0
- package/dist/web/assets/panel-store-BJhazigC.js.gz +0 -0
- package/dist/web/assets/patch-tab-metadata-C92YkrRX.js +1 -0
- package/dist/web/assets/pdf-preview-C9gMtv2a.js +1 -0
- package/dist/web/assets/pdf-preview-C9gMtv2a.js.br +0 -0
- package/dist/web/assets/pdf-preview-C9gMtv2a.js.gz +0 -0
- package/dist/web/assets/performance-panel-TkwfKIZa.js +3 -0
- package/dist/web/assets/performance-panel-TkwfKIZa.js.br +0 -0
- package/dist/web/assets/performance-panel-TkwfKIZa.js.gz +0 -0
- package/dist/web/assets/portal-container-context-NBi-KGK0.js +1 -0
- package/dist/web/assets/ppmbot-settings-section-XfrZ8VoC.js +1 -0
- package/dist/web/assets/ppmbot-settings-section-XfrZ8VoC.js.br +0 -0
- package/dist/web/assets/ppmbot-settings-section-XfrZ8VoC.js.gz +0 -0
- package/dist/web/assets/pptx-export-B2wCBWlV.js +111 -0
- package/dist/web/assets/pptx-export-B2wCBWlV.js.br +0 -0
- package/dist/web/assets/pptx-export-B2wCBWlV.js.gz +0 -0
- package/dist/web/assets/problems-panel-CDzwSJn6.js +1 -0
- package/dist/web/assets/problems-panel-CDzwSJn6.js.br +0 -0
- package/dist/web/assets/problems-panel-CDzwSJn6.js.gz +0 -0
- package/dist/web/assets/process-row-format-CytRH7g2.js +1 -0
- package/dist/web/assets/process-table-C_B39GHm.js +1 -0
- package/dist/web/assets/process-table-C_B39GHm.js.br +0 -0
- package/dist/web/assets/process-table-C_B39GHm.js.gz +0 -0
- package/dist/web/assets/project-framework-store-DwLxaRan.js +1 -0
- package/dist/web/assets/project-store-BLGl9IAO.js +1 -0
- package/dist/web/assets/project-store-BLGl9IAO.js.br +0 -0
- package/dist/web/assets/project-store-BLGl9IAO.js.gz +0 -0
- package/dist/web/assets/proxy-settings-section-CvaOvYIv.js +1 -0
- package/dist/web/assets/proxy-settings-section-CvaOvYIv.js.br +0 -0
- package/dist/web/assets/proxy-settings-section-CvaOvYIv.js.gz +0 -0
- package/dist/web/assets/query-audit-section-D_WDp1m-.js +1 -0
- package/dist/web/assets/query-audit-section-D_WDp1m-.js.br +0 -0
- package/dist/web/assets/query-audit-section-D_WDp1m-.js.gz +0 -0
- package/dist/web/assets/query-tab-B8aMpAbI.js +22 -0
- package/dist/web/assets/query-tab-B8aMpAbI.js.br +0 -0
- package/dist/web/assets/query-tab-B8aMpAbI.js.gz +0 -0
- package/dist/web/assets/react-BZ0kba1-.js +1 -0
- package/dist/web/assets/remote-access-settings-section-Bv0eawR4.js +1 -0
- package/dist/web/assets/remote-access-settings-section-Bv0eawR4.js.br +0 -0
- package/dist/web/assets/remote-access-settings-section-Bv0eawR4.js.gz +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-BpDakRY0.js +1 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-BpDakRY0.js.br +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-BpDakRY0.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-C5GQ3kzY.js +2 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-C5GQ3kzY.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-C5GQ3kzY.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-CZb5EMEK.js +1 -0
- package/dist/web/assets/remote-desktop-mobile-view-CZb5EMEK.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-CZb5EMEK.js.gz +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-CipNtLX5.js +1 -0
- package/dist/web/assets/remote-desktop-readiness-gate-CipNtLX5.js.br +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-CipNtLX5.js.gz +0 -0
- package/dist/web/assets/remote-desktop-settings-section-ZAsBRwjq.js +1 -0
- package/dist/web/assets/remote-desktop-settings-section-ZAsBRwjq.js.br +0 -0
- package/dist/web/assets/remote-desktop-settings-section-ZAsBRwjq.js.gz +0 -0
- package/dist/web/assets/remote-desktop-window-content-B7OXXvAM.js +1 -0
- package/dist/web/assets/remote-desktop-window-content-B7OXXvAM.js.br +0 -0
- package/dist/web/assets/remote-desktop-window-content-B7OXXvAM.js.gz +0 -0
- package/dist/web/assets/rename-object-dialog-B4W6S7Xg.js +1 -0
- package/dist/web/assets/rename-object-dialog-B4W6S7Xg.js.br +0 -0
- package/dist/web/assets/rename-object-dialog-B4W6S7Xg.js.gz +0 -0
- package/dist/web/assets/review-code-B4osj0k1.js +5 -0
- package/dist/web/assets/review-code-B4osj0k1.js.br +0 -0
- package/dist/web/assets/review-code-B4osj0k1.js.gz +0 -0
- package/dist/web/assets/run-in-terminal-button-m3i-Hcou.js +1 -0
- package/dist/web/assets/run-in-terminal-ujoc25vj.js +1 -0
- package/dist/web/assets/save-as-dialog-DpXv_f1d.js +1 -0
- package/dist/web/assets/save-as-dialog-DpXv_f1d.js.br +5 -0
- package/dist/web/assets/save-as-dialog-DpXv_f1d.js.gz +0 -0
- package/dist/web/assets/schedules-settings-section-BbaPbc28.js +1 -0
- package/dist/web/assets/schedules-settings-section-BbaPbc28.js.br +0 -0
- package/dist/web/assets/schedules-settings-section-BbaPbc28.js.gz +0 -0
- package/dist/web/assets/scroll-area-DOlQJGZp.js +1 -0
- package/dist/web/assets/scroll-area-DOlQJGZp.js.br +0 -0
- package/dist/web/assets/scroll-area-DOlQJGZp.js.gz +0 -0
- package/dist/web/assets/send-to-chat-CWV1qd3c.js +1 -0
- package/dist/web/assets/send-to-chat-CWV1qd3c.js.br +0 -0
- package/dist/web/assets/send-to-chat-CWV1qd3c.js.gz +0 -0
- package/dist/web/assets/separator-DmU9aJwq.js +1 -0
- package/dist/web/assets/services-panel-CZQOrvth.js +1 -0
- package/dist/web/assets/services-panel-CZQOrvth.js.br +0 -0
- package/dist/web/assets/services-panel-CZQOrvth.js.gz +0 -0
- package/dist/web/assets/session-changes-bar-VfS2sHuH.js +1 -0
- package/dist/web/assets/session-changes-bar-VfS2sHuH.js.br +0 -0
- package/dist/web/assets/session-changes-bar-VfS2sHuH.js.gz +0 -0
- package/dist/web/assets/session-list-sync-triggers-DtJI5KF0.js +1 -0
- package/dist/web/assets/session-list-sync-triggers-DtJI5KF0.js.br +0 -0
- package/dist/web/assets/session-list-sync-triggers-DtJI5KF0.js.gz +0 -0
- package/dist/web/assets/session-review-tab-Aq3FEooH.js +6 -0
- package/dist/web/assets/session-review-tab-Aq3FEooH.js.br +0 -0
- package/dist/web/assets/session-review-tab-Aq3FEooH.js.gz +0 -0
- package/dist/web/assets/settings-body-vXbOWchN.js +1 -0
- package/dist/web/assets/settings-body-vXbOWchN.js.br +0 -0
- package/dist/web/assets/settings-body-vXbOWchN.js.gz +0 -0
- package/dist/web/assets/settings-categories-Ajj4ui27.js +1 -0
- package/dist/web/assets/settings-categories-Ajj4ui27.js.br +0 -0
- package/dist/web/assets/settings-categories-Ajj4ui27.js.gz +0 -0
- package/dist/web/assets/settings-rows-DD7Gxmst.js +1 -0
- package/dist/web/assets/settings-rows-DD7Gxmst.js.br +0 -0
- package/dist/web/assets/settings-rows-DD7Gxmst.js.gz +0 -0
- package/dist/web/assets/settings-section-content-CVtvJ6ze.js +1 -0
- package/dist/web/assets/settings-section-content-DkUJFop6.js +2 -0
- package/dist/web/assets/settings-section-content-DkUJFop6.js.br +0 -0
- package/dist/web/assets/settings-section-content-DkUJFop6.js.gz +0 -0
- package/dist/web/assets/settings-store-B4mLp19V.js +2 -0
- package/dist/web/assets/settings-store-B4mLp19V.js.br +0 -0
- package/dist/web/assets/settings-store-B4mLp19V.js.gz +0 -0
- package/dist/web/assets/settings-tab-Cdv9_OIe.js +1 -0
- package/dist/web/assets/settings-window-content-DLa6Ph4u.js +1 -0
- package/dist/web/assets/share-BV49OI6q.css +2 -0
- package/dist/web/assets/share-BV49OI6q.css.br +0 -0
- package/dist/web/assets/share-BV49OI6q.css.gz +0 -0
- package/dist/web/assets/share-D5ufGmNI.js +9 -0
- package/dist/web/assets/share-D5ufGmNI.js.br +0 -0
- package/dist/web/assets/share-D5ufGmNI.js.gz +0 -0
- package/dist/web/assets/slash-command-picker-lILYDfK3.js +1 -0
- package/dist/web/assets/slash-command-picker-lILYDfK3.js.br +0 -0
- package/dist/web/assets/slash-command-picker-lILYDfK3.js.gz +0 -0
- package/dist/web/assets/sortable-header-DwzTFLkG.js +1 -0
- package/dist/web/assets/sortable-header-DwzTFLkG.js.br +0 -0
- package/dist/web/assets/sortable-header-DwzTFLkG.js.gz +0 -0
- package/dist/web/assets/split-sql-statements-DcAeXbk_.js +5 -0
- package/dist/web/assets/split-sql-statements-DcAeXbk_.js.br +0 -0
- package/dist/web/assets/split-sql-statements-DcAeXbk_.js.gz +0 -0
- package/dist/web/assets/sql-completion-provider-CS-ElfgJ.js +1 -0
- package/dist/web/assets/sql-completion-provider-CS-ElfgJ.js.br +0 -0
- package/dist/web/assets/sql-completion-provider-CS-ElfgJ.js.gz +0 -0
- package/dist/web/assets/sql-object-tab-Da42SMK5.js +1 -0
- package/dist/web/assets/sql-object-tab-Da42SMK5.js.br +0 -0
- package/dist/web/assets/sql-object-tab-Da42SMK5.js.gz +0 -0
- package/dist/web/assets/sqlite-viewer-V3SKNukY.js +1 -0
- package/dist/web/assets/sqlite-viewer-V3SKNukY.js.br +0 -0
- package/dist/web/assets/sqlite-viewer-V3SKNukY.js.gz +0 -0
- package/dist/web/assets/start-ellipsis-CU8GkxaV.js +1 -0
- package/dist/web/assets/structure-save-dialog-B635iyPI.js +1 -0
- package/dist/web/assets/structure-save-dialog-B635iyPI.js.br +0 -0
- package/dist/web/assets/structure-save-dialog-B635iyPI.js.gz +0 -0
- package/dist/web/assets/structure-tab-Co9d8ktU.js +3 -0
- package/dist/web/assets/structure-tab-Co9d8ktU.js.br +0 -0
- package/dist/web/assets/structure-tab-Co9d8ktU.js.gz +0 -0
- package/dist/web/assets/system-monitor-body-DC0j8RqP.js +2 -0
- package/dist/web/assets/system-monitor-body-DC0j8RqP.js.br +0 -0
- package/dist/web/assets/system-monitor-body-DC0j8RqP.js.gz +0 -0
- package/dist/web/assets/system-monitor-tab-DA8BcdXo.js +1 -0
- package/dist/web/assets/system-monitor-window-content-BiuLo8XW.js +1 -0
- package/dist/web/assets/tab-host-window-content-Crvt1r5F.js +1 -0
- package/dist/web/assets/tab-host-window-content-Crvt1r5F.js.br +0 -0
- package/dist/web/assets/tab-host-window-content-Crvt1r5F.js.gz +0 -0
- package/dist/web/assets/tab-store-D5I52eLN.js +1 -0
- package/dist/web/assets/table-tab-C2cYw7a0.js +2 -0
- package/dist/web/assets/table-tab-C2cYw7a0.js.br +0 -0
- package/dist/web/assets/table-tab-C2cYw7a0.js.gz +0 -0
- package/dist/web/assets/telegram-bot-token-field-BqNtOo5n.js +1 -0
- package/dist/web/assets/telegram-bot-token-field-BqNtOo5n.js.br +0 -0
- package/dist/web/assets/telegram-bot-token-field-BqNtOo5n.js.gz +0 -0
- package/dist/web/assets/terminal-tab-CrKxibGC.js +3 -0
- package/dist/web/assets/terminal-tab-CrKxibGC.js.br +0 -0
- package/dist/web/assets/terminal-tab-CrKxibGC.js.gz +0 -0
- package/dist/web/assets/tool-cards-BRto67jM.js +15 -0
- package/dist/web/assets/tool-cards-BRto67jM.js.br +0 -0
- package/dist/web/assets/tool-cards-BRto67jM.js.gz +0 -0
- package/dist/web/assets/tools-settings-section-DEvZsrxq.js +1 -0
- package/dist/web/assets/tools-settings-section-DEvZsrxq.js.br +0 -0
- package/dist/web/assets/tools-settings-section-DEvZsrxq.js.gz +0 -0
- package/dist/web/assets/use-at-most-wide-BHsrzvv3.js +1 -0
- package/dist/web/assets/use-blob-url-Clm7wbB_.js +1 -0
- package/dist/web/assets/use-db-driver-installed-anzWkGi5.js +1 -0
- package/dist/web/assets/use-db-read-BCYhIrJM.js +1 -0
- package/dist/web/assets/use-db-read-BCYhIrJM.js.br +0 -0
- package/dist/web/assets/use-db-read-BCYhIrJM.js.gz +0 -0
- package/dist/web/assets/use-db-tab-B8LjdDb7.js +1 -0
- package/dist/web/assets/use-db-tab-B8LjdDb7.js.br +0 -0
- package/dist/web/assets/use-db-tab-B8LjdDb7.js.gz +0 -0
- package/dist/web/assets/use-design-canvas-check-DBsLf1At.js +1 -0
- package/dist/web/assets/use-design-canvas-check-DBsLf1At.js.br +0 -0
- package/dist/web/assets/use-design-canvas-check-DBsLf1At.js.gz +0 -0
- package/dist/web/assets/use-h264-canvas-decoder-_zqeiVx8.js +1 -0
- package/dist/web/assets/use-h264-canvas-decoder-_zqeiVx8.js.br +0 -0
- package/dist/web/assets/use-h264-canvas-decoder-_zqeiVx8.js.gz +0 -0
- package/dist/web/assets/use-inline-blame-CRWJU6Rq.js +16 -0
- package/dist/web/assets/use-inline-blame-CRWJU6Rq.js.br +0 -0
- package/dist/web/assets/use-inline-blame-CRWJU6Rq.js.gz +0 -0
- package/dist/web/assets/use-is-mobile-VRV9eZy1.js +1 -0
- package/dist/web/assets/use-lsp-B-otjr-6.js +6 -0
- package/dist/web/assets/use-lsp-B-otjr-6.js.br +0 -0
- package/dist/web/assets/use-lsp-B-otjr-6.js.gz +0 -0
- package/dist/web/assets/use-monaco-theme-BiDXRJ4e.js +1 -0
- package/dist/web/assets/use-opener-focus-CDRKhHwX.js +1 -0
- package/dist/web/assets/use-process-kill-BW2UW0mZ.js +1 -0
- package/dist/web/assets/use-process-kill-BW2UW0mZ.js.br +0 -0
- package/dist/web/assets/use-process-kill-BW2UW0mZ.js.gz +0 -0
- package/dist/web/assets/use-sql-schema-info-D_Kc2FI7.js +4 -0
- package/dist/web/assets/use-sql-schema-info-D_Kc2FI7.js.br +0 -0
- package/dist/web/assets/use-sql-schema-info-D_Kc2FI7.js.gz +0 -0
- package/dist/web/assets/use-visual-viewport-MmugpRg-.js +1 -0
- package/dist/web/assets/use-websocket-n3Ud9vEA.js +1 -0
- package/dist/web/assets/vendor-markdown-C-P1aR4p.js +291 -0
- package/dist/web/assets/vendor-markdown-C-P1aR4p.js.br +0 -0
- package/dist/web/assets/vendor-markdown-C-P1aR4p.js.gz +0 -0
- package/dist/web/assets/vendor-ui-BTSIXzhZ.js +45 -0
- package/dist/web/assets/vendor-ui-BTSIXzhZ.js.br +0 -0
- package/dist/web/assets/vendor-ui-BTSIXzhZ.js.gz +0 -0
- package/dist/web/assets/video-preview-CjB6wesi.js +1 -0
- package/dist/web/assets/video-preview-CjB6wesi.js.br +0 -0
- package/dist/web/assets/video-preview-CjB6wesi.js.gz +0 -0
- package/dist/web/assets/voice-settings-section-C6Wb6q5o.js +1 -0
- package/dist/web/assets/voice-settings-section-C6Wb6q5o.js.br +0 -0
- package/dist/web/assets/voice-settings-section-C6Wb6q5o.js.gz +0 -0
- package/dist/web/assets/web-preview-tab-doNpegW3.js +1 -0
- package/dist/web/assets/web-preview-tab-doNpegW3.js.br +0 -0
- package/dist/web/assets/web-preview-tab-doNpegW3.js.gz +0 -0
- package/dist/web/assets/window-store-DqX_qmkQ.js +1 -0
- package/dist/web/assets/window-store-DqX_qmkQ.js.br +0 -0
- package/dist/web/assets/window-store-DqX_qmkQ.js.gz +0 -0
- package/dist/web/assets/ws-auth-CbF6GqxP.js +1 -0
- package/dist/web/design-share-page/index.html +18 -0
- package/dist/web/index.html +47 -47
- package/dist/web/index.html.br +0 -0
- package/dist/web/index.html.gz +0 -0
- package/dist/web/sw.js +1 -1
- package/dist/web/sw.js.br +0 -0
- package/dist/web/sw.js.gz +0 -0
- package/docs/architecture/ai-chat-and-providers.md +258 -26
- package/docs/architecture/data-and-storage.md +9 -3
- package/docs/architecture/workspace-and-ui.md +42 -5
- package/docs/project-roadmap.md +5 -0
- package/package.json +6 -2
- package/scripts/gen-product-icons.ts +1 -0
- package/src/cli/commands/db-cmd.ts +79 -1
- package/src/providers/claude-agent-sdk-query-options.ts +42 -10
- package/src/providers/claude-agent-sdk.ts +19 -6
- package/src/providers/codex-app-server/codex-provider.ts +9 -3
- package/src/providers/codex-app-server/codex-thread-params.ts +34 -4
- package/src/server/index.ts +17 -5
- package/src/server/middleware/access-log.ts +6 -3
- package/src/server/routes/accounts.ts +3 -2
- package/src/server/routes/chat-file-changes.ts +15 -1
- package/src/server/routes/chat.ts +92 -18
- package/src/server/routes/database-query.ts +14 -5
- package/src/server/routes/database.ts +14 -0
- package/src/server/routes/debug-crash.ts +30 -0
- package/src/server/routes/design-comments.ts +56 -7
- package/src/server/routes/design-share-address.ts +20 -0
- package/src/server/routes/design-share-guest-comments.ts +120 -0
- package/src/server/routes/design-share-guest-files.ts +99 -0
- package/src/server/routes/design-share-guest-shared.ts +95 -0
- package/src/server/routes/design-share-guest.ts +77 -0
- package/src/server/routes/design-shares.ts +90 -0
- package/src/server/routes/designs.ts +2 -0
- package/src/server/routes/settings.ts +12 -0
- package/src/server/routes/static.ts +10 -2
- package/src/server/ws/chat.ts +113 -39
- package/src/server/ws/global.ts +10 -8
- package/src/services/account.service.ts +57 -18
- package/src/services/chat.service.ts +16 -6
- package/src/services/db-ai-tools/db-ai-connections.ts +48 -0
- package/src/services/db-ai-tools/db-ai-format.ts +107 -0
- package/src/services/db-ai-tools/db-ai-run.ts +199 -0
- package/src/services/db-ai-tools/db-ai-target.ts +59 -0
- package/src/services/db-ai-tools/db-ai-tools-endpoint.ts +225 -0
- package/src/services/db-ai-tools/db-ai-tools-tokens.ts +33 -0
- package/src/services/db-ai-tools/db-ai-tools-tool.ts +131 -0
- package/src/services/db-ai-tools/db-approval-broker.ts +157 -0
- package/src/services/db.service.ts +25 -1
- package/src/services/design/bridge/bridge-picker.ts +15 -5
- package/src/services/design/bridge/guest-bridge.ts +19 -0
- package/src/services/design/comments/design-comment-element-context.ts +28 -6
- package/src/services/design/comments/design-comment-input.ts +47 -0
- package/src/services/design/comments/design-comment-views.ts +146 -0
- package/src/services/design/comments/design-comments-revision.ts +19 -0
- package/src/services/design/comments/design-comments-store.ts +82 -9
- package/src/services/design/design-comment-replies.service.ts +126 -0
- package/src/services/design/design-comments.service.ts +77 -34
- package/src/services/design/design-restore.service.ts +6 -2
- package/src/services/design/design-snapshots.service.ts +8 -2
- package/src/services/design/design-store.service.ts +7 -1
- package/src/services/design/design-write-rate-limit.ts +11 -17
- package/src/services/design/preview/design-guest-alias.ts +64 -0
- package/src/services/design/preview/design-preview-html.ts +16 -3
- package/src/services/design/preview/design-preview-scope.ts +29 -5
- package/src/services/design/share/design-share-address.ts +81 -0
- package/src/services/design/share/design-share-changed-files.ts +74 -0
- package/src/services/design/share/design-share-client-key.ts +72 -0
- package/src/services/design/share/design-share-code.ts +116 -0
- package/src/services/design/share/design-share-comments.service.ts +162 -0
- package/src/services/design/share/design-share-guest-link.ts +109 -0
- package/src/services/design/share/design-share-guest-page.ts +86 -0
- package/src/services/design/share/design-share-link-rules.ts +83 -0
- package/src/services/design/share/design-share-links-store.ts +157 -0
- package/src/services/design/share/design-share-links.service.ts +174 -0
- package/src/services/design/share/design-share-notifier.ts +192 -0
- package/src/services/design/share/design-share-rate-limit.ts +71 -0
- package/src/services/design/share/design-share-resolve.ts +31 -0
- package/src/services/mcp-http-endpoint.ts +23 -10
- package/src/services/mysql.service.ts +6 -2
- package/src/services/notification-format.ts +10 -2
- package/src/services/notification-link.ts +1 -1
- package/src/services/notification.service.ts +47 -15
- package/src/services/ppm-password.ts +26 -0
- package/src/services/project-name-for-path.ts +18 -0
- package/src/services/query-audit/query-audit.service.ts +7 -4
- package/src/services/remote-desktop/access-unit-assembler.ts +11 -7
- package/src/services/remote-desktop/nal-splitter.ts +14 -1
- package/src/services/remote-desktop/remote-desktop-capture-wayland.ts +47 -21
- package/src/services/remote-desktop/remote-desktop-encoder-args.ts +5 -3
- package/src/services/session-file-baselines/session-file-baselines.service.ts +48 -0
- package/src/services/session-file-baselines/session-file-blame.ts +57 -24
- package/src/services/session-file-baselines/session-file-changes.service.ts +220 -22
- package/src/services/session-file-baselines/session-file-history.ts +5 -1
- package/src/services/session-file-baselines/session-file-writes.ts +28 -0
- package/src/services/sliding-window-limiter.ts +106 -0
- package/src/services/tab-tools-mcp/open-url-tool.ts +149 -0
- package/src/services/tab-tools-mcp/tab-open-broker.ts +12 -4
- package/src/services/tab-tools-mcp/tab-tools-mcp-endpoint.ts +66 -22
- package/src/services/tab-tools-mcp/tab-tools-mcp-tokens.ts +3 -1
- package/src/services/tab-tools-mcp/tab-tools-mcp-tool.ts +78 -6
- package/src/services/tab-tools-mcp/terminal-text.ts +45 -0
- package/src/services/tab-tools-mcp/terminal-tools.ts +297 -0
- package/src/services/terminal.service.ts +39 -4
- package/src/shared/db-ai-tools.ts +118 -0
- package/src/shared/db-query-script.ts +16 -0
- package/src/shared/design-comment-thread-types.ts +80 -0
- package/src/shared/design-comment-types.ts +53 -4
- package/src/shared/design-share-guest-types.ts +59 -0
- package/src/shared/design-share-types.ts +100 -0
- package/src/shared/notification-settings.ts +4 -3
- package/src/shared/ppm-tools.ts +39 -0
- package/src/shared/session-file-changes.ts +16 -0
- package/src/shared/tab-open-protocol.ts +50 -6
- package/src/shared/untrusted-text.ts +15 -1
- package/src/types/chat.ts +7 -1
- package/src/types/config.ts +5 -2
- package/src/types/database.ts +6 -0
- package/src/web/components/chat/chat-history-bar.tsx +10 -6
- package/src/web/components/chat/chat-tab.tsx +7 -1
- package/src/web/components/chat/db-execute-approval-card.tsx +100 -0
- package/src/web/components/chat/db-tool-card.tsx +42 -0
- package/src/web/components/chat/device-tool-card.tsx +45 -0
- package/src/web/components/chat/message-input.tsx +9 -6
- package/src/web/components/chat/message-list.tsx +6 -1
- package/src/web/components/chat/message-markdown.tsx +6 -3
- package/src/web/components/chat/message-user-bubble.tsx +2 -1
- package/src/web/components/chat/model-thinking-selector.tsx +6 -4
- package/src/web/components/chat/prompt-cache-chip.tsx +1 -1
- package/src/web/components/chat/running-agents-bar.tsx +164 -76
- package/src/web/components/chat/session-changes-bar.tsx +46 -13
- package/src/web/components/chat/tool-cards.tsx +29 -1
- package/src/web/components/chat/turn-change-rollup.tsx +8 -1
- package/src/web/components/chat/usage-badge.tsx +3 -3
- package/src/web/components/database/query/query-run-state.ts +11 -1
- package/src/web/components/database/query/query-tab.tsx +33 -7
- package/src/web/components/database/query/use-query-runner.ts +3 -0
- package/src/web/components/database/query/write-once-dialog.tsx +70 -0
- package/src/web/components/design/canvas/design-canvas-pane.tsx +5 -2
- package/src/web/components/design/comments/comment-author-label.tsx +23 -0
- package/src/web/components/design/comments/comment-composer.tsx +6 -14
- package/src/web/components/design/comments/comment-pins-overlay.tsx +8 -3
- package/src/web/components/design/comments/comment-thread-replies.tsx +82 -0
- package/src/web/components/design/comments/comment-thread-text-box.tsx +69 -0
- package/src/web/components/design/comments/comment-thread-view.tsx +115 -0
- package/src/web/components/design/comments/comments-panel.tsx +33 -10
- package/src/web/components/design/comments/comments-send-preview.tsx +20 -8
- package/src/web/components/design/comments/design-comments-layer.tsx +3 -1
- package/src/web/components/design/comments/use-comment-pins.ts +3 -0
- package/src/web/components/design/comments/use-design-comments-feature.ts +40 -25
- package/src/web/components/design/comments/use-design-comments.ts +44 -12
- package/src/web/components/design/design-split-layout.tsx +106 -10
- package/src/web/components/design/design-tab-context.ts +2 -0
- package/src/web/components/design/design-tab.tsx +5 -1
- package/src/web/components/design/design-toolbar.tsx +24 -4
- package/src/web/components/design/share/design-share-dialog.tsx +81 -0
- package/src/web/components/design/share/new-share-link-form.tsx +85 -0
- package/src/web/components/design/share/share-address-block.tsx +101 -0
- package/src/web/components/design/share/share-changed-files.tsx +30 -0
- package/src/web/components/design/share/share-expiry-picker.tsx +44 -0
- package/src/web/components/design/share/share-repin-panel.tsx +64 -0
- package/src/web/components/design/share/share-row-panel.tsx +35 -0
- package/src/web/components/design/share/share-version-picker.tsx +67 -0
- package/src/web/components/design/share/shared-link-action-panels.tsx +120 -0
- package/src/web/components/design/share/shared-link-row.tsx +131 -0
- package/src/web/components/design/share/shared-links-list.tsx +33 -0
- package/src/web/components/design/share/use-share-address.ts +74 -0
- package/src/web/components/design/share/use-share-links.ts +93 -0
- package/src/web/components/design/use-design-layout.ts +7 -4
- package/src/web/components/editor/diff-viewer.tsx +16 -12
- package/src/web/components/editor/docx-preview.tsx +7 -2
- package/src/web/components/floating-window/close-window.ts +32 -0
- package/src/web/components/floating-window/floating-window.tsx +65 -24
- package/src/web/components/floating-window/open-tab-in-pip.ts +3 -0
- package/src/web/components/floating-window/use-window-drag.ts +33 -7
- package/src/web/components/floating-window/use-window-meta.ts +138 -0
- package/src/web/components/floating-window/window-chrome-contract.ts +19 -2
- package/src/web/components/floating-window/window-dock-layout.ts +72 -0
- package/src/web/components/floating-window/window-dock-list.tsx +156 -0
- package/src/web/components/floating-window/window-dock.tsx +192 -0
- package/src/web/components/floating-window/window-geometry.ts +39 -1
- package/src/web/components/floating-window/window-layer.tsx +59 -23
- package/src/web/components/floating-window/window-persistence.ts +16 -3
- package/src/web/components/floating-window/window-store-types.ts +13 -2
- package/src/web/components/floating-window/window-store.ts +75 -8
- package/src/web/components/floating-window/window-title-identity.tsx +86 -0
- package/src/web/components/layout/status-bar.tsx +3 -0
- package/src/web/components/layout/tab-pop-out-menu-item.tsx +2 -2
- package/src/web/components/logs/open-logs.ts +0 -1
- package/src/web/components/os-explorer/actions/explorer-actions-upload.ts +2 -1
- package/src/web/components/os-explorer/skins/macos-window-chrome.tsx +17 -11
- package/src/web/components/os-explorer/skins/windows-window-chrome.tsx +14 -5
- package/src/web/components/remote-desktop/use-remote-desktop-readiness.ts +8 -3
- package/src/web/components/settings/accounts/account-add-dialog.tsx +25 -13
- package/src/web/components/settings/accounts/claude-accounts-section.tsx +3 -3
- package/src/web/components/settings/ai-settings-section.tsx +0 -20
- package/src/web/components/settings/design-settings-section.tsx +3 -0
- package/src/web/components/settings/design-window-setting.tsx +28 -0
- package/src/web/components/settings/settings-categories.ts +3 -0
- package/src/web/components/settings/settings-section-content.tsx +1 -0
- package/src/web/components/settings/tools-settings-section.tsx +120 -0
- package/src/web/components/shared/docx-html-sanitize.ts +59 -0
- package/src/web/components/shared/markdown-code-block.tsx +3 -1
- package/src/web/components/shared/markdown-renderer.tsx +15 -3
- package/src/web/components/shared/markdown-sanitize.ts +65 -0
- package/src/web/components/web-preview/web-preview-tab.tsx +6 -3
- package/src/web/design-share-page/index.html +17 -0
- package/src/web/design-share-page/main.tsx +11 -0
- package/src/web/design-share-page/share-api.ts +131 -0
- package/src/web/design-share-page/share-app.tsx +14 -0
- package/src/web/design-share-page/share-bottom-sheet.tsx +61 -0
- package/src/web/design-share-page/share-canvas.tsx +92 -0
- package/src/web/design-share-page/share-composer.tsx +104 -0
- package/src/web/design-share-page/share-entry.tsx +92 -0
- package/src/web/design-share-page/share-identity.ts +81 -0
- package/src/web/design-share-page/share-name-prompt.tsx +59 -0
- package/src/web/design-share-page/share-panel-content.tsx +57 -0
- package/src/web/design-share-page/share-pins-overlay.tsx +50 -0
- package/src/web/design-share-page/share-review.tsx +123 -0
- package/src/web/design-share-page/share-states.tsx +78 -0
- package/src/web/design-share-page/share-thread-model.ts +83 -0
- package/src/web/design-share-page/share-thread-view.tsx +61 -0
- package/src/web/design-share-page/share-threads-panel.tsx +103 -0
- package/src/web/design-share-page/share-toolbar.tsx +105 -0
- package/src/web/design-share-page/share-ui.ts +30 -0
- package/src/web/design-share-page/share.css +63 -0
- package/src/web/design-share-page/use-share-canvas.ts +51 -0
- package/src/web/design-share-page/use-share-info.ts +34 -0
- package/src/web/design-share-page/use-share-session.ts +75 -0
- package/src/web/design-share-page/use-share-threads.ts +139 -0
- package/src/web/hooks/use-chat.ts +5 -2
- package/src/web/hooks/use-design-session-redirect.ts +3 -2
- package/src/web/hooks/use-git-repo.ts +36 -16
- package/src/web/hooks/use-global-events.ts +4 -0
- package/src/web/hooks/use-inline-blame.ts +17 -11
- package/src/web/hooks/use-notification-clicks.ts +23 -5
- package/src/web/hooks/use-session-file-changes.ts +118 -41
- package/src/web/hooks/use-url-sync.ts +5 -4
- package/src/web/lib/api-settings.ts +2 -0
- package/src/web/lib/chat-attempt-lifecycle.ts +3 -1
- package/src/web/lib/db-tool-call.ts +57 -0
- package/src/web/lib/design/api-design-comments.ts +39 -9
- package/src/web/lib/design/api-design-shares.ts +47 -0
- package/src/web/lib/design/design-comments-prompt.ts +108 -23
- package/src/web/lib/design/design-layout-mode.ts +16 -1
- package/src/web/lib/design/design-share-address-state.ts +88 -0
- package/src/web/lib/design/design-share-expiry.ts +96 -0
- package/src/web/lib/design/design-share-link-status.ts +66 -0
- package/src/web/lib/design/design-view-prefs.ts +20 -1
- package/src/web/lib/design/open-design-tab.ts +54 -1
- package/src/web/lib/git-repo-scope.ts +60 -0
- package/src/web/lib/icons.generated.tsx +3 -1
- package/src/web/lib/model-display-name.ts +16 -0
- package/src/web/lib/open-ai-tab.ts +129 -19
- package/src/web/lib/running-agent-rows.ts +52 -0
- package/src/web/lib/session-file-changes-client.ts +6 -0
- package/src/web/lib/session-file-changes.ts +13 -0
- package/src/web/lib/tab-tool-call.ts +37 -1
- package/src/web/lib/utils.ts +4 -1
- package/src/web/stores/panel-store.ts +13 -1
- package/src/web/stores/panel-utils.ts +9 -4
- package/src/web/stores/settings-store.ts +14 -0
- package/src/web/stores/window-panel-actions.ts +21 -3
- package/src/web/stores/window-panel-persistence.ts +2 -1
- package/src/web/sw-notification-click.ts +12 -1
- package/templates/skill/SKILL.md.tmpl +2 -1
- package/templates/skill/common-tasks.md +6 -0
- package/vite.config.ts +10 -0
- package/vite.share.config.ts +43 -0
- package/dist/web/assets/accounts-settings-section-DU-lTifs.js +0 -1
- package/dist/web/assets/accounts-settings-section-DU-lTifs.js.br +0 -0
- package/dist/web/assets/accounts-settings-section-DU-lTifs.js.gz +0 -0
- package/dist/web/assets/adaptive-context-menu-Cq7ynvIn.js +0 -1
- package/dist/web/assets/adaptive-context-menu-Cq7ynvIn.js.br +0 -0
- package/dist/web/assets/adaptive-context-menu-Cq7ynvIn.js.gz +0 -0
- package/dist/web/assets/agent-session-sheet-At6Rt-Yf.js +0 -2
- package/dist/web/assets/agent-session-sheet-At6Rt-Yf.js.br +0 -0
- package/dist/web/assets/agent-session-sheet-At6Rt-Yf.js.gz +0 -0
- package/dist/web/assets/agent-session-sheet-store-BoBrAw5i.js +0 -1
- package/dist/web/assets/agent-session-window-content-CB_uvabH.js +0 -1
- package/dist/web/assets/agent-session-window-content-CB_uvabH.js.br +0 -0
- package/dist/web/assets/agent-session-window-content-CB_uvabH.js.gz +0 -0
- package/dist/web/assets/ai-resource-editor-Czearm3I.js +0 -1
- package/dist/web/assets/ai-resource-editor-Czearm3I.js.br +0 -0
- package/dist/web/assets/ai-resource-editor-Czearm3I.js.gz +0 -0
- package/dist/web/assets/ai-settings-section-AOgAUCgH.js +0 -1
- package/dist/web/assets/ai-settings-section-B_OFMlrt.js +0 -1
- package/dist/web/assets/ai-settings-section-B_OFMlrt.js.br +0 -0
- package/dist/web/assets/ai-settings-section-B_OFMlrt.js.gz +0 -0
- package/dist/web/assets/android-tab-L7DmLfHG.js +0 -2
- package/dist/web/assets/android-tab-L7DmLfHG.js.br +0 -0
- package/dist/web/assets/android-tab-L7DmLfHG.js.gz +0 -0
- package/dist/web/assets/api-client-DAQfiXg0.js +0 -1
- package/dist/web/assets/api-client-OiA8Ida1.js +0 -1
- package/dist/web/assets/api-client-OiA8Ida1.js.br +0 -0
- package/dist/web/assets/api-client-OiA8Ida1.js.gz +0 -0
- package/dist/web/assets/api-settings-D2H6gjen.js +0 -1
- package/dist/web/assets/api-settings-D2H6gjen.js.br +0 -0
- package/dist/web/assets/api-settings-D2H6gjen.js.gz +0 -0
- package/dist/web/assets/api-settings-DHhcUHtx.js +0 -1
- package/dist/web/assets/api-themes-CE8gPZ3X.js +0 -1
- package/dist/web/assets/appearance-settings-section-s3KWKTBm.js +0 -1
- package/dist/web/assets/appearance-settings-section-s3KWKTBm.js.br +0 -0
- package/dist/web/assets/appearance-settings-section-s3KWKTBm.js.gz +0 -0
- package/dist/web/assets/apps-panel-DaojtUvh.js +0 -1
- package/dist/web/assets/apps-panel-DaojtUvh.js.br +0 -0
- package/dist/web/assets/apps-panel-DaojtUvh.js.gz +0 -0
- package/dist/web/assets/audio-preview-CWcPZqTA.js +0 -1
- package/dist/web/assets/audio-preview-CWcPZqTA.js.br +0 -4
- package/dist/web/assets/audio-preview-CWcPZqTA.js.gz +0 -0
- package/dist/web/assets/branch-review-tab-9UB4ccpF.js +0 -1
- package/dist/web/assets/branch-review-tab-9UB4ccpF.js.br +0 -0
- package/dist/web/assets/branch-review-tab-9UB4ccpF.js.gz +0 -0
- package/dist/web/assets/button-Br60hGkw.js +0 -1
- package/dist/web/assets/button-Br60hGkw.js.br +0 -0
- package/dist/web/assets/button-Br60hGkw.js.gz +0 -0
- package/dist/web/assets/chat-preparation-cache-CRX9WAK5.js +0 -1
- package/dist/web/assets/chat-preparation-cache-CRX9WAK5.js.br +0 -0
- package/dist/web/assets/chat-preparation-cache-CRX9WAK5.js.gz +0 -0
- package/dist/web/assets/chat-tab-DMVb_mgx.js +0 -1
- package/dist/web/assets/chat-tab-DMVb_mgx.js.br +0 -0
- package/dist/web/assets/chat-tab-DMVb_mgx.js.gz +0 -0
- package/dist/web/assets/chat-tab-s7uAnh-h.js +0 -17
- package/dist/web/assets/chat-tab-s7uAnh-h.js.br +0 -0
- package/dist/web/assets/chat-tab-s7uAnh-h.js.gz +0 -0
- package/dist/web/assets/code-editor-JK49X9EX.js +0 -10
- package/dist/web/assets/code-editor-JK49X9EX.js.br +0 -0
- package/dist/web/assets/code-editor-JK49X9EX.js.gz +0 -0
- package/dist/web/assets/codex-reset-credit-button-CxJsBnff.js +0 -1
- package/dist/web/assets/codex-reset-credit-button-CxJsBnff.js.br +0 -0
- package/dist/web/assets/codex-reset-credit-button-CxJsBnff.js.gz +0 -0
- package/dist/web/assets/conflict-editor-rOpVkK9P.js +0 -19
- package/dist/web/assets/conflict-editor-rOpVkK9P.js.br +0 -0
- package/dist/web/assets/conflict-editor-rOpVkK9P.js.gz +0 -0
- package/dist/web/assets/connection-form-tab-BGmb918E.js +0 -4
- package/dist/web/assets/connection-form-tab-BGmb918E.js.br +0 -0
- package/dist/web/assets/connection-form-tab-BGmb918E.js.gz +0 -0
- package/dist/web/assets/context-menu-BoQ6lxte.js +0 -1
- package/dist/web/assets/context-menu-BoQ6lxte.js.br +0 -0
- package/dist/web/assets/context-menu-BoQ6lxte.js.gz +0 -0
- package/dist/web/assets/createLucideIcon-DBXq3G0e.js +0 -1
- package/dist/web/assets/createLucideIcon-DBXq3G0e.js.br +0 -0
- package/dist/web/assets/createLucideIcon-DBXq3G0e.js.gz +0 -0
- package/dist/web/assets/csv-preview-CM7su92m.js +0 -10
- package/dist/web/assets/csv-preview-CM7su92m.js.br +0 -0
- package/dist/web/assets/csv-preview-CM7su92m.js.gz +0 -0
- package/dist/web/assets/database-drivers-section-C6ZKPWaE.js +0 -1
- package/dist/web/assets/database-drivers-section-C6ZKPWaE.js.br +0 -0
- package/dist/web/assets/database-drivers-section-C6ZKPWaE.js.gz +0 -0
- package/dist/web/assets/db-explorer-store-BcLxq-X0.js +0 -1
- package/dist/web/assets/db-explorer-store-BcLxq-X0.js.br +0 -0
- package/dist/web/assets/db-explorer-store-BcLxq-X0.js.gz +0 -0
- package/dist/web/assets/db-tab-parts-DvmnlA6V.js +0 -1
- package/dist/web/assets/db-tab-parts-DvmnlA6V.js.br +0 -0
- package/dist/web/assets/db-tab-parts-DvmnlA6V.js.gz +0 -0
- package/dist/web/assets/db-types-9ac-eYxf.js +0 -1
- package/dist/web/assets/db-types-9ac-eYxf.js.br +0 -0
- package/dist/web/assets/db-types-9ac-eYxf.js.gz +0 -0
- package/dist/web/assets/design-canvas-check-Bo76Q6Qr.js +0 -1
- package/dist/web/assets/design-canvas-check-Bo76Q6Qr.js.br +0 -0
- package/dist/web/assets/design-canvas-check-Bo76Q6Qr.js.gz +0 -0
- package/dist/web/assets/design-export-client-ClwRg798.js +0 -1
- package/dist/web/assets/design-export-client-ClwRg798.js.br +0 -0
- package/dist/web/assets/design-export-client-ClwRg798.js.gz +0 -0
- package/dist/web/assets/design-responsive-dialog-Cdccv3Nw.js +0 -1
- package/dist/web/assets/design-responsive-dialog-Cdccv3Nw.js.br +0 -0
- package/dist/web/assets/design-responsive-dialog-Cdccv3Nw.js.gz +0 -0
- package/dist/web/assets/design-settings-section-CuxZSLAr.js +0 -2
- package/dist/web/assets/design-settings-section-CuxZSLAr.js.br +0 -0
- package/dist/web/assets/design-settings-section-CuxZSLAr.js.gz +0 -0
- package/dist/web/assets/design-skill-suggestion-DZQjG8FV.js +0 -3
- package/dist/web/assets/design-skill-suggestion-DZQjG8FV.js.br +0 -0
- package/dist/web/assets/design-skill-suggestion-DZQjG8FV.js.gz +0 -0
- package/dist/web/assets/design-tab-JlKmHVkd.js +0 -57
- package/dist/web/assets/design-tab-JlKmHVkd.js.br +0 -0
- package/dist/web/assets/design-tab-JlKmHVkd.js.gz +0 -0
- package/dist/web/assets/designs-sidebar-panel-C1EwWf4Z.js +0 -1
- package/dist/web/assets/designs-sidebar-panel-C1EwWf4Z.js.br +0 -0
- package/dist/web/assets/designs-sidebar-panel-C1EwWf4Z.js.gz +0 -0
- package/dist/web/assets/dialog-DOaEX6AK.js +0 -1
- package/dist/web/assets/dialog-DOaEX6AK.js.br +0 -0
- package/dist/web/assets/dialog-DOaEX6AK.js.gz +0 -0
- package/dist/web/assets/diff-viewer-FidH7Nsq.js +0 -4
- package/dist/web/assets/diff-viewer-FidH7Nsq.js.br +0 -0
- package/dist/web/assets/diff-viewer-FidH7Nsq.js.gz +0 -0
- package/dist/web/assets/docx-preview-ENiLGqzy.js +0 -12
- package/dist/web/assets/docx-preview-ENiLGqzy.js.br +0 -0
- package/dist/web/assets/docx-preview-ENiLGqzy.js.gz +0 -0
- package/dist/web/assets/dropdown-menu-DB3yyoVz.js +0 -1
- package/dist/web/assets/dropdown-menu-DB3yyoVz.js.br +0 -0
- package/dist/web/assets/dropdown-menu-DB3yyoVz.js.gz +0 -0
- package/dist/web/assets/edit-diff-preview-D4EqC86X.js +0 -7
- package/dist/web/assets/edit-diff-preview-D4EqC86X.js.br +0 -0
- package/dist/web/assets/edit-diff-preview-D4EqC86X.js.gz +0 -0
- package/dist/web/assets/editor-dialog-DC7dUWAX.js +0 -1
- package/dist/web/assets/editor-dialog-DC7dUWAX.js.br +0 -0
- package/dist/web/assets/editor-dialog-DC7dUWAX.js.gz +0 -0
- package/dist/web/assets/editor-language-service-0pN0TxYN.js +0 -1
- package/dist/web/assets/editor-language-service-0pN0TxYN.js.br +0 -0
- package/dist/web/assets/editor-language-service-0pN0TxYN.js.gz +0 -0
- package/dist/web/assets/explorer-body-tFaUp9_Q.js +0 -2
- package/dist/web/assets/explorer-body-tFaUp9_Q.js.br +0 -0
- package/dist/web/assets/explorer-body-tFaUp9_Q.js.gz +0 -0
- package/dist/web/assets/explorer-model-BmgFEsj1.js +0 -1
- package/dist/web/assets/explorer-model-BmgFEsj1.js.br +0 -0
- package/dist/web/assets/explorer-model-BmgFEsj1.js.gz +0 -0
- package/dist/web/assets/explorer-window-content-XnRTZT_X.js +0 -1
- package/dist/web/assets/explorer-window-content-XnRTZT_X.js.br +0 -0
- package/dist/web/assets/explorer-window-content-XnRTZT_X.js.gz +0 -0
- package/dist/web/assets/extension-manager-section-DEbwRPf1.js +0 -1
- package/dist/web/assets/extension-manager-section-DEbwRPf1.js.br +0 -0
- package/dist/web/assets/extension-manager-section-DEbwRPf1.js.gz +0 -0
- package/dist/web/assets/extension-webview-C9ApceLU.js +0 -12
- package/dist/web/assets/extension-webview-C9ApceLU.js.br +0 -0
- package/dist/web/assets/extension-webview-C9ApceLU.js.gz +0 -0
- package/dist/web/assets/file-diff-lX1a7RLF.js +0 -1
- package/dist/web/assets/file-icons-DpwcJLL4.js +0 -1
- package/dist/web/assets/file-icons-DpwcJLL4.js.br +0 -0
- package/dist/web/assets/file-icons-DpwcJLL4.js.gz +0 -0
- package/dist/web/assets/file-store-Bk1WYfdy.js +0 -1
- package/dist/web/assets/file-store-Bk1WYfdy.js.br +0 -0
- package/dist/web/assets/file-store-Bk1WYfdy.js.gz +0 -0
- package/dist/web/assets/files-settings-section-C8MacVFQ.js +0 -1
- package/dist/web/assets/files-settings-section-C8MacVFQ.js.br +0 -0
- package/dist/web/assets/files-settings-section-C8MacVFQ.js.gz +0 -0
- package/dist/web/assets/filter-dialog-frame-CoWlaNRy.js +0 -1
- package/dist/web/assets/filter-dialog-frame-CoWlaNRy.js.br +0 -0
- package/dist/web/assets/filter-dialog-frame-CoWlaNRy.js.gz +0 -0
- package/dist/web/assets/format-file-meta-C0LKHE3e.js +0 -1
- package/dist/web/assets/format-file-meta-C0LKHE3e.js.br +0 -0
- package/dist/web/assets/format-file-meta-C0LKHE3e.js.gz +0 -0
- package/dist/web/assets/fs-api-BQrIEcvo.js +0 -1
- package/dist/web/assets/fs-api-BQrIEcvo.js.br +0 -0
- package/dist/web/assets/fs-api-BQrIEcvo.js.gz +0 -0
- package/dist/web/assets/general-settings-section-DZRRGdlQ.js +0 -1
- package/dist/web/assets/general-settings-section-DZRRGdlQ.js.br +0 -0
- package/dist/web/assets/general-settings-section-DZRRGdlQ.js.gz +0 -0
- package/dist/web/assets/git-commit-horizontal-BVihXafd.js +0 -1
- package/dist/web/assets/git-log-panel-g2pBnu6r.js +0 -1
- package/dist/web/assets/git-log-panel-g2pBnu6r.js.br +0 -0
- package/dist/web/assets/git-log-panel-g2pBnu6r.js.gz +0 -0
- package/dist/web/assets/git-repo-store-BOYLnV67.js +0 -1
- package/dist/web/assets/git-repo-store-BOYLnV67.js.br +0 -0
- package/dist/web/assets/git-repo-store-BOYLnV67.js.gz +0 -0
- package/dist/web/assets/git-review-tab-BzI5mxWd.js +0 -3
- package/dist/web/assets/git-review-tab-BzI5mxWd.js.br +0 -0
- package/dist/web/assets/git-review-tab-BzI5mxWd.js.gz +0 -0
- package/dist/web/assets/glide-data-grid-BxvI3ehr.js +0 -177
- package/dist/web/assets/glide-data-grid-BxvI3ehr.js.br +0 -0
- package/dist/web/assets/glide-data-grid-BxvI3ehr.js.gz +0 -0
- package/dist/web/assets/grid-save-dialog-D55Po6Vu.js +0 -2
- package/dist/web/assets/grid-save-dialog-D55Po6Vu.js.br +0 -0
- package/dist/web/assets/grid-save-dialog-D55Po6Vu.js.gz +0 -0
- package/dist/web/assets/group-chat-tab-CoMC-Fx1.js +0 -1
- package/dist/web/assets/group-chat-tab-CoMC-Fx1.js.br +0 -0
- package/dist/web/assets/group-chat-tab-CoMC-Fx1.js.gz +0 -0
- package/dist/web/assets/icons-JMA45Ifw.js +0 -1
- package/dist/web/assets/icons-JMA45Ifw.js.br +0 -0
- package/dist/web/assets/icons-JMA45Ifw.js.gz +0 -0
- package/dist/web/assets/image-preview-D7KR11Xo.js +0 -1
- package/dist/web/assets/impexp-tab-JF6JF8eO.js +0 -1
- package/dist/web/assets/impexp-tab-JF6JF8eO.js.br +0 -0
- package/dist/web/assets/impexp-tab-JF6JF8eO.js.gz +0 -0
- package/dist/web/assets/index-DyYGWFVa.css +0 -1
- package/dist/web/assets/index-DyYGWFVa.css.br +0 -0
- package/dist/web/assets/index-DyYGWFVa.css.gz +0 -0
- package/dist/web/assets/index-ItT-dTPV.js +0 -59
- package/dist/web/assets/index-ItT-dTPV.js.br +0 -0
- package/dist/web/assets/index-ItT-dTPV.js.gz +0 -0
- package/dist/web/assets/input-CKGoVpYv.js +0 -1
- package/dist/web/assets/jira-watcher-section-CvyXLyjO.js +0 -1
- package/dist/web/assets/keybindings-store-CeEtx6js.js +0 -1
- package/dist/web/assets/keyboard-shortcuts-section-MUIE0Rvf.js +0 -1
- package/dist/web/assets/keyboard-shortcuts-section-MUIE0Rvf.js.br +0 -0
- package/dist/web/assets/keyboard-shortcuts-section-MUIE0Rvf.js.gz +0 -0
- package/dist/web/assets/language-servers-section-DiYURB24.js +0 -2
- package/dist/web/assets/language-servers-section-DiYURB24.js.br +0 -0
- package/dist/web/assets/language-servers-section-DiYURB24.js.gz +0 -0
- package/dist/web/assets/logs-app-CJlNqOdc.js +0 -13
- package/dist/web/assets/logs-app-CJlNqOdc.js.br +0 -0
- package/dist/web/assets/logs-app-CJlNqOdc.js.gz +0 -0
- package/dist/web/assets/logs-tab-BoAlm_8H.js +0 -1
- package/dist/web/assets/logs-window-content-nNm4jl1s.js +0 -1
- package/dist/web/assets/lsp-client-LnKiMWeG.js +0 -1
- package/dist/web/assets/lsp-client-LnKiMWeG.js.br +0 -0
- package/dist/web/assets/lsp-client-LnKiMWeG.js.gz +0 -0
- package/dist/web/assets/markdown-renderer-8Hef5MLx.js +0 -1
- package/dist/web/assets/markdown-renderer-BH_CFPJw.js +0 -5
- package/dist/web/assets/markdown-renderer-BH_CFPJw.js.br +0 -0
- package/dist/web/assets/markdown-renderer-BH_CFPJw.js.gz +0 -0
- package/dist/web/assets/media-url-CsdZ6q_T.js +0 -1
- package/dist/web/assets/metric-chart-canvas-LAMaVJTu.js +0 -1
- package/dist/web/assets/metric-chart-canvas-LAMaVJTu.js.br +0 -0
- package/dist/web/assets/metric-chart-canvas-LAMaVJTu.js.gz +0 -0
- package/dist/web/assets/mobile-bottom-sheet-CGmmdp_5.js +0 -1
- package/dist/web/assets/mobile-bottom-sheet-CGmmdp_5.js.br +0 -0
- package/dist/web/assets/mobile-bottom-sheet-CGmmdp_5.js.gz +0 -0
- package/dist/web/assets/mobile-explorer-sheet-Dh2ZECzL.js +0 -1
- package/dist/web/assets/mobile-explorer-sheet-Dh2ZECzL.js.br +0 -0
- package/dist/web/assets/mobile-explorer-sheet-Dh2ZECzL.js.gz +0 -0
- package/dist/web/assets/new-design-dialog-CgBUrVFx.js +0 -1
- package/dist/web/assets/new-design-dialog-CgBUrVFx.js.br +0 -0
- package/dist/web/assets/new-design-dialog-CgBUrVFx.js.gz +0 -0
- package/dist/web/assets/notification-store-CXC7u6MW.js +0 -1
- package/dist/web/assets/notifications-settings-section-CPbx23nU.js +0 -1
- package/dist/web/assets/notifications-settings-section-CPbx23nU.js.br +0 -0
- package/dist/web/assets/notifications-settings-section-CPbx23nU.js.gz +0 -0
- package/dist/web/assets/onboarding-entry--MWe4amV.js +0 -1
- package/dist/web/assets/onboarding-entry--MWe4amV.js.br +0 -0
- package/dist/web/assets/onboarding-entry--MWe4amV.js.gz +0 -0
- package/dist/web/assets/onboarding-quick-orientation-DZYQekRt.js +0 -1
- package/dist/web/assets/onboarding-quick-orientation-DZYQekRt.js.br +0 -0
- package/dist/web/assets/onboarding-quick-orientation-DZYQekRt.js.gz +0 -0
- package/dist/web/assets/open-db-tabs-CkQe49j_.js +0 -1
- package/dist/web/assets/open-db-tabs-CkQe49j_.js.br +0 -0
- package/dist/web/assets/open-db-tabs-CkQe49j_.js.gz +0 -0
- package/dist/web/assets/open-settings-DsGBn73g.js +0 -1
- package/dist/web/assets/overview-panel-CcUGDvnt.js +0 -1
- package/dist/web/assets/overview-panel-CcUGDvnt.js.br +0 -0
- package/dist/web/assets/overview-panel-CcUGDvnt.js.gz +0 -0
- package/dist/web/assets/panel-store-DmP16Fo0.js +0 -1
- package/dist/web/assets/panel-store-DmP16Fo0.js.br +0 -0
- package/dist/web/assets/panel-store-DmP16Fo0.js.gz +0 -0
- package/dist/web/assets/patch-tab-metadata-B-jH5svY.js +0 -1
- package/dist/web/assets/pdf-preview-DMUIWb9B.js +0 -1
- package/dist/web/assets/pdf-preview-DMUIWb9B.js.br +0 -0
- package/dist/web/assets/pdf-preview-DMUIWb9B.js.gz +0 -0
- package/dist/web/assets/performance-panel-CJDLUwrs.js +0 -3
- package/dist/web/assets/performance-panel-CJDLUwrs.js.br +0 -0
- package/dist/web/assets/performance-panel-CJDLUwrs.js.gz +0 -0
- package/dist/web/assets/portal-container-context-BXAsDqrB.js +0 -1
- package/dist/web/assets/ppmbot-settings-section-DTCTPQ-R.js +0 -1
- package/dist/web/assets/ppmbot-settings-section-DTCTPQ-R.js.br +0 -0
- package/dist/web/assets/ppmbot-settings-section-DTCTPQ-R.js.gz +0 -0
- package/dist/web/assets/pptx-export-BxmgltJ4.js +0 -111
- package/dist/web/assets/pptx-export-BxmgltJ4.js.br +0 -0
- package/dist/web/assets/pptx-export-BxmgltJ4.js.gz +0 -0
- package/dist/web/assets/problems-panel-DX32QDH_.js +0 -1
- package/dist/web/assets/problems-panel-DX32QDH_.js.br +0 -0
- package/dist/web/assets/problems-panel-DX32QDH_.js.gz +0 -0
- package/dist/web/assets/process-row-format-CBw-CQCx.js +0 -1
- package/dist/web/assets/process-table-CX-NhOg6.js +0 -1
- package/dist/web/assets/process-table-CX-NhOg6.js.br +0 -0
- package/dist/web/assets/process-table-CX-NhOg6.js.gz +0 -0
- package/dist/web/assets/project-framework-store-Bi5dyHdx.js +0 -1
- package/dist/web/assets/project-store-CEGoLMOl.js +0 -1
- package/dist/web/assets/project-store-CEGoLMOl.js.br +0 -0
- package/dist/web/assets/project-store-CEGoLMOl.js.gz +0 -0
- package/dist/web/assets/proxy-settings-section-BGNvFe7e.js +0 -1
- package/dist/web/assets/proxy-settings-section-BGNvFe7e.js.br +0 -0
- package/dist/web/assets/proxy-settings-section-BGNvFe7e.js.gz +0 -0
- package/dist/web/assets/query-audit-section-DTHI5GP7.js +0 -1
- package/dist/web/assets/query-audit-section-DTHI5GP7.js.br +0 -0
- package/dist/web/assets/query-audit-section-DTHI5GP7.js.gz +0 -0
- package/dist/web/assets/query-tab-qMlIkHRk.js +0 -22
- package/dist/web/assets/query-tab-qMlIkHRk.js.br +0 -0
- package/dist/web/assets/query-tab-qMlIkHRk.js.gz +0 -0
- package/dist/web/assets/react-PkBxFcos.js +0 -1
- package/dist/web/assets/remote-access-settings-section-t2BYAA9g.js +0 -1
- package/dist/web/assets/remote-access-settings-section-t2BYAA9g.js.br +0 -0
- package/dist/web/assets/remote-access-settings-section-t2BYAA9g.js.gz +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-ChUU6Jts.js +0 -1
- package/dist/web/assets/remote-desktop-clipboard-notice-ChUU6Jts.js.br +0 -0
- package/dist/web/assets/remote-desktop-clipboard-notice-ChUU6Jts.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-_bopEtCa.js +0 -2
- package/dist/web/assets/remote-desktop-mobile-sheet-_bopEtCa.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-sheet-_bopEtCa.js.gz +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-D9G4kDfa.js +0 -1
- package/dist/web/assets/remote-desktop-mobile-view-D9G4kDfa.js.br +0 -0
- package/dist/web/assets/remote-desktop-mobile-view-D9G4kDfa.js.gz +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-Yz9eVB3-.js +0 -1
- package/dist/web/assets/remote-desktop-readiness-gate-Yz9eVB3-.js.br +0 -0
- package/dist/web/assets/remote-desktop-readiness-gate-Yz9eVB3-.js.gz +0 -0
- package/dist/web/assets/remote-desktop-settings-section-BTGGSjZY.js +0 -1
- package/dist/web/assets/remote-desktop-settings-section-BTGGSjZY.js.br +0 -0
- package/dist/web/assets/remote-desktop-settings-section-BTGGSjZY.js.gz +0 -0
- package/dist/web/assets/remote-desktop-window-content-B8ZaG2bL.js +0 -1
- package/dist/web/assets/remote-desktop-window-content-B8ZaG2bL.js.br +0 -0
- package/dist/web/assets/remote-desktop-window-content-B8ZaG2bL.js.gz +0 -0
- package/dist/web/assets/rename-object-dialog-FSlcdUoB.js +0 -1
- package/dist/web/assets/rename-object-dialog-FSlcdUoB.js.br +0 -0
- package/dist/web/assets/rename-object-dialog-FSlcdUoB.js.gz +0 -0
- package/dist/web/assets/review-code-CfuJeLYd.js +0 -5
- package/dist/web/assets/review-code-CfuJeLYd.js.br +0 -0
- package/dist/web/assets/review-code-CfuJeLYd.js.gz +0 -0
- package/dist/web/assets/run-in-terminal-Bk9Bw7G1.js +0 -1
- package/dist/web/assets/run-in-terminal-button-DFPQUlZs.js +0 -1
- package/dist/web/assets/save-as-dialog-Bj9VpGYf.js +0 -1
- package/dist/web/assets/save-as-dialog-Bj9VpGYf.js.br +0 -0
- package/dist/web/assets/save-as-dialog-Bj9VpGYf.js.gz +0 -0
- package/dist/web/assets/schedules-settings-section-DNJ4K7zS.js +0 -1
- package/dist/web/assets/schedules-settings-section-DNJ4K7zS.js.br +0 -0
- package/dist/web/assets/schedules-settings-section-DNJ4K7zS.js.gz +0 -0
- package/dist/web/assets/scroll-area-6Am1KMiB.js +0 -1
- package/dist/web/assets/scroll-area-6Am1KMiB.js.br +0 -0
- package/dist/web/assets/scroll-area-6Am1KMiB.js.gz +0 -0
- package/dist/web/assets/send-to-chat-Bcm_Lcog.js +0 -1
- package/dist/web/assets/send-to-chat-Bcm_Lcog.js.br +0 -0
- package/dist/web/assets/send-to-chat-Bcm_Lcog.js.gz +0 -0
- package/dist/web/assets/separator-BOYUIPkH.js +0 -1
- package/dist/web/assets/services-panel-CBRTsROB.js +0 -1
- package/dist/web/assets/services-panel-CBRTsROB.js.br +0 -0
- package/dist/web/assets/services-panel-CBRTsROB.js.gz +0 -0
- package/dist/web/assets/session-changes-bar-BRopa3Dh.js +0 -1
- package/dist/web/assets/session-changes-bar-BRopa3Dh.js.br +0 -0
- package/dist/web/assets/session-changes-bar-BRopa3Dh.js.gz +0 -0
- package/dist/web/assets/session-list-sync-triggers-DitiR5h1.js +0 -1
- package/dist/web/assets/session-list-sync-triggers-DitiR5h1.js.br +0 -0
- package/dist/web/assets/session-list-sync-triggers-DitiR5h1.js.gz +0 -0
- package/dist/web/assets/session-review-tab--kNB_FKQ.js +0 -6
- package/dist/web/assets/session-review-tab--kNB_FKQ.js.br +0 -0
- package/dist/web/assets/session-review-tab--kNB_FKQ.js.gz +0 -0
- package/dist/web/assets/settings-body-B-s0fEjc.js +0 -1
- package/dist/web/assets/settings-body-B-s0fEjc.js.br +0 -0
- package/dist/web/assets/settings-body-B-s0fEjc.js.gz +0 -0
- package/dist/web/assets/settings-categories-CcR9eL3x.js +0 -1
- package/dist/web/assets/settings-categories-CcR9eL3x.js.br +0 -0
- package/dist/web/assets/settings-categories-CcR9eL3x.js.gz +0 -0
- package/dist/web/assets/settings-section-content-BJ35dy5r.js +0 -1
- package/dist/web/assets/settings-section-content-DckksvTg.js +0 -2
- package/dist/web/assets/settings-section-content-DckksvTg.js.br +0 -0
- package/dist/web/assets/settings-section-content-DckksvTg.js.gz +0 -0
- package/dist/web/assets/settings-store-WeJyQVL8.js +0 -2
- package/dist/web/assets/settings-store-WeJyQVL8.js.br +0 -0
- package/dist/web/assets/settings-store-WeJyQVL8.js.gz +0 -0
- package/dist/web/assets/settings-tab-BlX33GEN.js +0 -1
- package/dist/web/assets/settings-window-content-B-7yV1_q.js +0 -1
- package/dist/web/assets/slash-command-picker-BBcy6w6m.js +0 -1
- package/dist/web/assets/slash-command-picker-BBcy6w6m.js.br +0 -0
- package/dist/web/assets/slash-command-picker-BBcy6w6m.js.gz +0 -0
- package/dist/web/assets/sortable-header-B9gfWik4.js +0 -1
- package/dist/web/assets/sortable-header-B9gfWik4.js.br +0 -0
- package/dist/web/assets/sortable-header-B9gfWik4.js.gz +0 -0
- package/dist/web/assets/sql-completion-provider-CaTHVr1l.js +0 -5
- package/dist/web/assets/sql-completion-provider-CaTHVr1l.js.br +0 -0
- package/dist/web/assets/sql-completion-provider-CaTHVr1l.js.gz +0 -0
- package/dist/web/assets/sql-object-tab-DVo4bxRI.js +0 -1
- package/dist/web/assets/sql-object-tab-DVo4bxRI.js.br +0 -0
- package/dist/web/assets/sql-object-tab-DVo4bxRI.js.gz +0 -0
- package/dist/web/assets/sqlite-viewer-BGfIpl5x.js +0 -1
- package/dist/web/assets/sqlite-viewer-BGfIpl5x.js.br +0 -0
- package/dist/web/assets/sqlite-viewer-BGfIpl5x.js.gz +0 -0
- package/dist/web/assets/start-ellipsis-rBh37k0n.js +0 -1
- package/dist/web/assets/structure-save-dialog-STK_RFCK.js +0 -1
- package/dist/web/assets/structure-save-dialog-STK_RFCK.js.br +0 -0
- package/dist/web/assets/structure-save-dialog-STK_RFCK.js.gz +0 -0
- package/dist/web/assets/structure-tab-DuLnsTC4.js +0 -3
- package/dist/web/assets/structure-tab-DuLnsTC4.js.br +0 -0
- package/dist/web/assets/structure-tab-DuLnsTC4.js.gz +0 -0
- package/dist/web/assets/system-monitor-body-BIjW16Pb.js +0 -2
- package/dist/web/assets/system-monitor-body-BIjW16Pb.js.br +0 -0
- package/dist/web/assets/system-monitor-body-BIjW16Pb.js.gz +0 -0
- package/dist/web/assets/system-monitor-tab-B6_tC9LO.js +0 -1
- package/dist/web/assets/system-monitor-window-content-CwBzqMUe.js +0 -1
- package/dist/web/assets/tab-host-window-content-CpdEjkZd.js +0 -1
- package/dist/web/assets/tab-host-window-content-CpdEjkZd.js.br +0 -0
- package/dist/web/assets/tab-host-window-content-CpdEjkZd.js.gz +0 -0
- package/dist/web/assets/tab-store-nNzRNfVV.js +0 -1
- package/dist/web/assets/table-tab-B5asfTBP.js +0 -2
- package/dist/web/assets/table-tab-B5asfTBP.js.br +0 -0
- package/dist/web/assets/table-tab-B5asfTBP.js.gz +0 -0
- package/dist/web/assets/telegram-bot-token-field-BiqKbXwE.js +0 -1
- package/dist/web/assets/telegram-bot-token-field-BiqKbXwE.js.br +0 -0
- package/dist/web/assets/telegram-bot-token-field-BiqKbXwE.js.gz +0 -0
- package/dist/web/assets/terminal-tab-DpMONMVB.js +0 -3
- package/dist/web/assets/terminal-tab-DpMONMVB.js.br +0 -0
- package/dist/web/assets/terminal-tab-DpMONMVB.js.gz +0 -0
- package/dist/web/assets/tool-cards-DoDKxqN4.js +0 -14
- package/dist/web/assets/tool-cards-DoDKxqN4.js.br +0 -0
- package/dist/web/assets/tool-cards-DoDKxqN4.js.gz +0 -0
- package/dist/web/assets/use-at-most-wide-BQFi1Sjv.js +0 -1
- package/dist/web/assets/use-blob-url-D7ElNPnW.js +0 -1
- package/dist/web/assets/use-db-driver-installed-BscdI-wS.js +0 -1
- package/dist/web/assets/use-db-read-DYuyNA5i.js +0 -1
- package/dist/web/assets/use-db-read-DYuyNA5i.js.br +0 -0
- package/dist/web/assets/use-db-read-DYuyNA5i.js.gz +0 -0
- package/dist/web/assets/use-db-tab-Cr4lXxwF.js +0 -1
- package/dist/web/assets/use-db-tab-Cr4lXxwF.js.br +0 -0
- package/dist/web/assets/use-db-tab-Cr4lXxwF.js.gz +0 -0
- package/dist/web/assets/use-design-canvas-check-DKlyMp-S.js +0 -1
- package/dist/web/assets/use-design-canvas-check-DKlyMp-S.js.br +0 -0
- package/dist/web/assets/use-design-canvas-check-DKlyMp-S.js.gz +0 -0
- package/dist/web/assets/use-h264-canvas-decoder-DAjp9oHe.js +0 -1
- package/dist/web/assets/use-h264-canvas-decoder-DAjp9oHe.js.br +0 -0
- package/dist/web/assets/use-h264-canvas-decoder-DAjp9oHe.js.gz +0 -0
- package/dist/web/assets/use-inline-blame-DS0HrHJ3.js +0 -16
- package/dist/web/assets/use-inline-blame-DS0HrHJ3.js.br +0 -0
- package/dist/web/assets/use-inline-blame-DS0HrHJ3.js.gz +0 -0
- package/dist/web/assets/use-is-mobile-BXHbkfs9.js +0 -1
- package/dist/web/assets/use-lsp-BTVDYrt6.js +0 -6
- package/dist/web/assets/use-lsp-BTVDYrt6.js.br +0 -0
- package/dist/web/assets/use-lsp-BTVDYrt6.js.gz +0 -0
- package/dist/web/assets/use-monaco-theme-DqnhExsm.js +0 -1
- package/dist/web/assets/use-opener-focus-C5L5UUJs.js +0 -1
- package/dist/web/assets/use-process-kill-D-SGQxDn.js +0 -1
- package/dist/web/assets/use-process-kill-D-SGQxDn.js.br +0 -0
- package/dist/web/assets/use-process-kill-D-SGQxDn.js.gz +0 -0
- package/dist/web/assets/use-sql-schema-info-DRb9dAKi.js +0 -4
- package/dist/web/assets/use-sql-schema-info-DRb9dAKi.js.br +0 -0
- package/dist/web/assets/use-sql-schema-info-DRb9dAKi.js.gz +0 -0
- package/dist/web/assets/use-visual-viewport-CQ6-A0Dt.js +0 -1
- package/dist/web/assets/use-websocket-C6RnlNVJ.js +0 -1
- package/dist/web/assets/vendor-markdown-QKPNiWEd.js +0 -291
- package/dist/web/assets/vendor-markdown-QKPNiWEd.js.br +0 -0
- package/dist/web/assets/vendor-markdown-QKPNiWEd.js.gz +0 -0
- package/dist/web/assets/vendor-ui-CS1GvlOm.js +0 -45
- package/dist/web/assets/vendor-ui-CS1GvlOm.js.br +0 -0
- package/dist/web/assets/vendor-ui-CS1GvlOm.js.gz +0 -0
- package/dist/web/assets/video-preview-CYzeUPfH.js +0 -1
- package/dist/web/assets/video-preview-CYzeUPfH.js.br +0 -0
- package/dist/web/assets/video-preview-CYzeUPfH.js.gz +0 -0
- package/dist/web/assets/voice-settings-section-C01d-toF.js +0 -1
- package/dist/web/assets/voice-settings-section-C01d-toF.js.br +0 -0
- package/dist/web/assets/voice-settings-section-C01d-toF.js.gz +0 -0
- package/dist/web/assets/web-preview-tab-F5C3quQs.js +0 -1
- package/dist/web/assets/web-preview-tab-F5C3quQs.js.br +0 -0
- package/dist/web/assets/web-preview-tab-F5C3quQs.js.gz +0 -0
- package/dist/web/assets/window-pip-registry-DSoB7T3k.js +0 -1
- package/dist/web/assets/window-store-zJczRsv4.js +0 -1
- package/dist/web/assets/window-store-zJczRsv4.js.br +0 -0
- package/dist/web/assets/window-store-zJczRsv4.js.gz +0 -0
- package/dist/web/assets/ws-auth-cWeQ7_61.js +0 -1
- /package/dist/web/assets/{__vite-browser-external-B4VNaaaA.js → __vite-browser-external-DL4jXWNt.js} +0 -0
- /package/dist/web/assets/{clipboard-D3XnL7CB.js → clipboard-D-VCry-F.js} +0 -0
- /package/dist/web/assets/{clipboard-D3XnL7CB.js.br → clipboard-D-VCry-F.js.br} +0 -0
- /package/dist/web/assets/{clipboard-D3XnL7CB.js.gz → clipboard-D-VCry-F.js.gz} +0 -0
- /package/dist/web/assets/{code-fence-vHZyBehL.js → code-fence-BK57HRhJ.js} +0 -0
- /package/dist/web/assets/{design-system-status-label-Cus6e2Df.js → design-system-status-label-KA4ESjWe.js} +0 -0
- /package/dist/web/assets/{format-bytes-B2kC4sbB.js → format-bytes-he3TR0bV.js} +0 -0
- /package/dist/web/assets/{session-turns-gmrmXzeg.js → session-turns-D3QpTtCq.js} +0 -0
- /package/dist/web/assets/{session-turns-gmrmXzeg.js.br → session-turns-D3QpTtCq.js.br} +0 -0
- /package/dist/web/assets/{session-turns-gmrmXzeg.js.gz → session-turns-D3QpTtCq.js.gz} +0 -0
- /package/dist/web/assets/{vendor-xterm-sFX94k3w.js → vendor-xterm-DRhOk3kW.js} +0 -0
- /package/dist/web/assets/{vendor-xterm-sFX94k3w.js.br → vendor-xterm-DRhOk3kW.js.br} +0 -0
- /package/dist/web/assets/{vendor-xterm-sFX94k3w.js.gz → vendor-xterm-DRhOk3kW.js.gz} +0 -0
|
@@ -51,6 +51,13 @@ export interface DesignLayoutInput {
|
|
|
51
51
|
pane: DesignPane;
|
|
52
52
|
/** The canvas covers the whole window. */
|
|
53
53
|
expanded: boolean;
|
|
54
|
+
/**
|
|
55
|
+
* The design is in a floating window. The window has its own fixed arrangement — canvas
|
|
56
|
+
* left, chat in a column on the right — so neither the width nor the pinned layout apply.
|
|
57
|
+
*/
|
|
58
|
+
windowed?: boolean;
|
|
59
|
+
/** In a window: the chat column is open. */
|
|
60
|
+
windowChat?: boolean;
|
|
54
61
|
}
|
|
55
62
|
|
|
56
63
|
export interface DesignLayout {
|
|
@@ -62,10 +69,18 @@ export interface DesignLayout {
|
|
|
62
69
|
/** The layout menu's checked item, which follows what is on screen. */
|
|
63
70
|
menuValue: DesignLayoutOverride;
|
|
64
71
|
expanded: boolean;
|
|
72
|
+
/** Laid out as a window: canvas first, chat a fixed column after it, toggled from the toolbar. */
|
|
73
|
+
windowed: boolean;
|
|
74
|
+
/** In a window, whether the chat column is open (false outside a window). */
|
|
75
|
+
windowChat: boolean;
|
|
65
76
|
}
|
|
66
77
|
|
|
67
78
|
export function resolveDesignLayout(input: DesignLayoutInput): DesignLayout {
|
|
68
79
|
const { override, isPhone, autoSplit, expanded } = input;
|
|
80
|
+
if (input.windowed && !isPhone) {
|
|
81
|
+
const chat = input.windowChat !== false && !expanded;
|
|
82
|
+
return { split: chat, pane: "canvas", switcher: null, menuValue: override, expanded, windowed: true, windowChat: chat };
|
|
83
|
+
}
|
|
69
84
|
// An expanded canvas lives inside the canvas pane, so that pane has to be the visible one.
|
|
70
85
|
const pane: DesignPane = expanded ? "canvas" : input.pane;
|
|
71
86
|
// A phone ignores a pinned split: two panes do not fit, and the pin belongs to this device's
|
|
@@ -75,5 +90,5 @@ export function resolveDesignLayout(input: DesignLayoutInput): DesignLayout {
|
|
|
75
90
|
// A pinned single pane still lets the user peek at the other pane; the menu then names the
|
|
76
91
|
// pane actually shown, so it never claims "Canvas only" over a visible chat.
|
|
77
92
|
const menuValue = override === "canvas" || override === "chat" ? pane : override;
|
|
78
|
-
return { split, pane, switcher, menuValue, expanded };
|
|
93
|
+
return { split, pane, switcher, menuValue, expanded, windowed: false, windowChat: false };
|
|
79
94
|
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { DesignShareAddress } from "../../../shared/design-share-types";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* What the Share dialog's address block shows, decided from the address route, the tunnel
|
|
5
|
+
* start the owner asked for, and the clock. Pure, so every state is tested without a server.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/** Poll interval while a temporary address is starting. */
|
|
9
|
+
export const SHARE_START_POLL_MS = 2_000;
|
|
10
|
+
/** How long a start may take before the dialog says it did not come up. */
|
|
11
|
+
export const SHARE_START_TIMEOUT_MS = 60_000;
|
|
12
|
+
|
|
13
|
+
export const SIGNIN_OFF_REASON = "Turn on PPM sign-in first";
|
|
14
|
+
export const QUICK_ADDRESS_WARNING =
|
|
15
|
+
"This is a temporary address. It changes when PPM or the tunnel restarts, and links you already sent stop working; copy them again then.";
|
|
16
|
+
|
|
17
|
+
/** What the tunnel switch answered (`POST /api/tunnel/enabled`). */
|
|
18
|
+
export type TunnelReload = "sent" | "busy" | "no-supervisor";
|
|
19
|
+
|
|
20
|
+
export interface ShareStartAttempt {
|
|
21
|
+
/** Epoch ms the owner pressed Start. */
|
|
22
|
+
at: number;
|
|
23
|
+
/** Null until the switch answered. */
|
|
24
|
+
reload: TunnelReload | null;
|
|
25
|
+
/** The switch itself failed. */
|
|
26
|
+
error: string | null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export type ShareAddressView =
|
|
30
|
+
| { kind: "loading" }
|
|
31
|
+
| { kind: "error"; message: string }
|
|
32
|
+
| { kind: "signin-off" }
|
|
33
|
+
| { kind: "named"; url: string; warning: string | null }
|
|
34
|
+
| { kind: "quick"; url: string; warning: string | null }
|
|
35
|
+
| { kind: "starting" }
|
|
36
|
+
| { kind: "failed"; message: string }
|
|
37
|
+
/** No public address; `enabled` = the switch is on but nothing is serving (a dark tunnel). */
|
|
38
|
+
| { kind: "none"; enabled: boolean; warning: string | null };
|
|
39
|
+
|
|
40
|
+
export interface ShareAddressInputs {
|
|
41
|
+
address: DesignShareAddress | null;
|
|
42
|
+
loadError: string | null;
|
|
43
|
+
start: ShareStartAttempt | null;
|
|
44
|
+
now: number;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function shareAddressView({ address, loadError, start, now }: ShareAddressInputs): ShareAddressView {
|
|
48
|
+
if (!address) return loadError ? { kind: "error", message: loadError } : { kind: "loading" };
|
|
49
|
+
if (!address.authEnabled) return { kind: "signin-off" };
|
|
50
|
+
if (address.url && address.kind !== "none") {
|
|
51
|
+
return address.kind === "named"
|
|
52
|
+
? { kind: "named", url: address.url, warning: address.warning }
|
|
53
|
+
: { kind: "quick", url: address.url, warning: address.warning };
|
|
54
|
+
}
|
|
55
|
+
if (start) {
|
|
56
|
+
if (start.error) return { kind: "failed", message: start.error };
|
|
57
|
+
if (start.reload === "no-supervisor") {
|
|
58
|
+
return {
|
|
59
|
+
kind: "failed",
|
|
60
|
+
message: "PPM is running without its supervisor, so nothing can start the tunnel now. It starts the next time PPM is started normally.",
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
if (now - start.at <= SHARE_START_TIMEOUT_MS) return { kind: "starting" };
|
|
64
|
+
return { kind: "failed", message: address.warning ?? "The temporary address did not come up within a minute." };
|
|
65
|
+
}
|
|
66
|
+
return { kind: "none", enabled: address.enabled, warning: address.warning };
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** Why a new link cannot be created right now, or null when it can. */
|
|
70
|
+
export function shareBlockedReason(address: DesignShareAddress | null, linkCount: number, maxLinks: number): string | null {
|
|
71
|
+
if (!address) return "Reading the sharing state…";
|
|
72
|
+
if (!address.authEnabled) return SIGNIN_OFF_REASON;
|
|
73
|
+
if (linkCount >= maxLinks) return `This design already has ${maxLinks} share links; delete one first`;
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* The URL a link is copied as: the public address plus its path, or this page's own origin
|
|
79
|
+
* when there is no public address (it then opens only where this PPM is reachable).
|
|
80
|
+
*/
|
|
81
|
+
export function shareLinkUrl(
|
|
82
|
+
address: DesignShareAddress | null, path: string | null, localOrigin: string,
|
|
83
|
+
): { url: string; isPublic: boolean } | null {
|
|
84
|
+
if (!path) return null;
|
|
85
|
+
const publicUrl = address && address.kind !== "none" ? address.url : null;
|
|
86
|
+
if (publicUrl) return { url: publicUrl.replace(/\/+$/, "") + path, isPublic: true };
|
|
87
|
+
return { url: localOrigin.replace(/\/+$/, "") + path, isPublic: false };
|
|
88
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { SHARE_LIMITS } from "../../../shared/design-share-types";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The expiry a share link is given: a preset, never, or the end of a chosen day in local
|
|
5
|
+
* time. Pure, so the arithmetic is tested without a browser.
|
|
6
|
+
*
|
|
7
|
+
* The server checks the same bound against its own clock (after now, at most
|
|
8
|
+
* {@link SHARE_LIMITS.maxExpiryMs} ahead), so a custom day is capped to the last one whose
|
|
9
|
+
* end still falls inside it.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export type ShareExpiryPreset = "1d" | "7d" | "30d" | "never" | "custom";
|
|
13
|
+
|
|
14
|
+
export const SHARE_EXPIRY_PRESETS: { id: ShareExpiryPreset; label: string }[] = [
|
|
15
|
+
{ id: "1d", label: "1 day" },
|
|
16
|
+
{ id: "7d", label: "7 days" },
|
|
17
|
+
{ id: "30d", label: "30 days" },
|
|
18
|
+
{ id: "never", label: "Never" },
|
|
19
|
+
{ id: "custom", label: "Custom" },
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
export const DEFAULT_SHARE_EXPIRY: ShareExpiryPreset = "7d";
|
|
23
|
+
|
|
24
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
25
|
+
const PRESET_DAYS: Partial<Record<ShareExpiryPreset, number>> = { "1d": 1, "7d": 7, "30d": 30 };
|
|
26
|
+
|
|
27
|
+
export interface ShareExpiryChoice {
|
|
28
|
+
preset: ShareExpiryPreset;
|
|
29
|
+
/** `YYYY-MM-DD`, read only for `custom`. */
|
|
30
|
+
customDate: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export type ShareExpiryResult = { ok: true; expiresAt: number | null } | { ok: false; error: string };
|
|
34
|
+
|
|
35
|
+
const pad = (n: number) => String(n).padStart(2, "0");
|
|
36
|
+
|
|
37
|
+
/** A local date as the `YYYY-MM-DD` an `<input type="date">` takes. */
|
|
38
|
+
export function toDateInputValue(ms: number): string {
|
|
39
|
+
const d = new Date(ms);
|
|
40
|
+
return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** The last millisecond of a `YYYY-MM-DD` day in local time, or null for a malformed date. */
|
|
44
|
+
export function endOfLocalDay(date: string): number | null {
|
|
45
|
+
const m = /^(\d{4})-(\d{2})-(\d{2})$/.exec(date);
|
|
46
|
+
if (!m) return null;
|
|
47
|
+
const [y, mo, d] = [Number(m[1]), Number(m[2]) - 1, Number(m[3])];
|
|
48
|
+
const end = new Date(y, mo, d, 23, 59, 59, 999);
|
|
49
|
+
// `new Date` rolls 2026-02-31 over into March; a date that moved was never a real day.
|
|
50
|
+
if (end.getFullYear() !== y || end.getMonth() !== mo || end.getDate() !== d) return null;
|
|
51
|
+
return end.getTime();
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** Earliest day the date input offers: today, whose end is still ahead. */
|
|
55
|
+
export function minCustomDate(now: number): string {
|
|
56
|
+
return toDateInputValue(now);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** Latest day whose end is still at most a year ahead. */
|
|
60
|
+
export function maxCustomDate(now: number): string {
|
|
61
|
+
const limit = now + SHARE_LIMITS.maxExpiryMs;
|
|
62
|
+
const sameDay = toDateInputValue(limit);
|
|
63
|
+
const end = endOfLocalDay(sameDay);
|
|
64
|
+
return end !== null && end <= limit ? sameDay : toDateInputValue(limit - DAY_MS);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** The `expiresAt` to send for a choice, or why it cannot be sent. */
|
|
68
|
+
export function expiryFromChoice(choice: ShareExpiryChoice, now: number): ShareExpiryResult {
|
|
69
|
+
if (choice.preset === "never") return { ok: true, expiresAt: null };
|
|
70
|
+
const days = PRESET_DAYS[choice.preset];
|
|
71
|
+
if (days) return { ok: true, expiresAt: now + days * DAY_MS };
|
|
72
|
+
const end = endOfLocalDay(choice.customDate);
|
|
73
|
+
if (end === null) return { ok: false, error: "Pick a date" };
|
|
74
|
+
if (end <= now) return { ok: false, error: "Pick a date that is still ahead" };
|
|
75
|
+
if (end > now + SHARE_LIMITS.maxExpiryMs) return { ok: false, error: "A link can stay open for at most a year" };
|
|
76
|
+
return { ok: true, expiresAt: end };
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** What the Change expiry control starts at for a link: never, or its own day. */
|
|
80
|
+
export function choiceForExpiry(expiresAt: number | null, now: number): ShareExpiryChoice {
|
|
81
|
+
if (expiresAt === null) return { preset: "never", customDate: toDateInputValue(now + 7 * DAY_MS) };
|
|
82
|
+
return { preset: "custom", customDate: toDateInputValue(Math.max(expiresAt, now)) };
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** "Expires in 3 days", "Expires in 5 hours"…, or null for a link that never expires. */
|
|
86
|
+
export function expiresInLabel(expiresAt: number | null, now: number): string | null {
|
|
87
|
+
if (expiresAt === null) return null;
|
|
88
|
+
const left = expiresAt - now;
|
|
89
|
+
if (left <= 0) return "Expired";
|
|
90
|
+
// Rounded, not floored: a 7-day link read a moment after it was made still says 7 days.
|
|
91
|
+
if (left < 60 * 60 * 1000) return "Expires in under an hour";
|
|
92
|
+
const hours = Math.round(left / (60 * 60 * 1000));
|
|
93
|
+
if (hours < 24) return `Expires in ${hours} hour${hours === 1 ? "" : "s"}`;
|
|
94
|
+
const days = Math.round(left / DAY_MS);
|
|
95
|
+
return `Expires in ${days} day${days === 1 ? "" : "s"}`;
|
|
96
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { DesignShareLink } from "../../../shared/design-share-types";
|
|
2
|
+
import { expiresInLabel } from "./design-share-expiry";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* How one share link reads in the owner's list: its status chip, and which actions still
|
|
6
|
+
* make sense for it. Pure; the server decides the status, this only words it.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export type ShareChipTone = "ok" | "warn" | "muted" | "danger";
|
|
10
|
+
|
|
11
|
+
export interface ShareStatusChip {
|
|
12
|
+
label: string;
|
|
13
|
+
tone: ShareChipTone;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function shareStatusChip(link: DesignShareLink, now: number): ShareStatusChip {
|
|
17
|
+
switch (link.status) {
|
|
18
|
+
case "revoked": return { label: "Revoked", tone: "muted" };
|
|
19
|
+
case "expired": return { label: "Expired", tone: "muted" };
|
|
20
|
+
case "needs-new-code": return { label: "Needs new code", tone: "warn" };
|
|
21
|
+
case "design-missing": return { label: "Design missing", tone: "danger" };
|
|
22
|
+
case "signin-off": return { label: "Paused: sign-in is off", tone: "warn" };
|
|
23
|
+
case "active": {
|
|
24
|
+
const left = expiresInLabel(link.expiresAt, now);
|
|
25
|
+
return { label: left && left !== "Expired" ? left : "Active", tone: "ok" };
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** The name a link is listed under; an unlabelled one is named after when it was made. */
|
|
31
|
+
export function shareLinkTitle(link: DesignShareLink): string {
|
|
32
|
+
if (link.label) return link.label;
|
|
33
|
+
const made = new Date(link.createdAt);
|
|
34
|
+
return `Link from ${made.toLocaleDateString(undefined, { month: "short", day: "numeric" })}`;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export type ShareLinkActionId =
|
|
38
|
+
| "expiry" | "rename" | "repin" | "new-code" | "delete-comments" | "revoke" | "delete";
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Actions offered for a link, in menu order. A revoked link is final, so nothing that would
|
|
42
|
+
* reopen it is offered; re-pin and new code need sign-in, as the server refuses them without.
|
|
43
|
+
*/
|
|
44
|
+
export function shareLinkActions(link: DesignShareLink, authEnabled: boolean): ShareLinkActionId[] {
|
|
45
|
+
const revoked = link.status === "revoked";
|
|
46
|
+
const actions: ShareLinkActionId[] = [];
|
|
47
|
+
if (!revoked) actions.push("expiry");
|
|
48
|
+
actions.push("rename");
|
|
49
|
+
if (!revoked && authEnabled) actions.push("repin", "new-code");
|
|
50
|
+
actions.push("delete-comments");
|
|
51
|
+
if (!revoked) actions.push("revoke");
|
|
52
|
+
actions.push("delete");
|
|
53
|
+
return actions;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export const SHARE_ACTION_LABEL: Record<ShareLinkActionId, string> = {
|
|
57
|
+
expiry: "Change expiry",
|
|
58
|
+
rename: "Rename",
|
|
59
|
+
repin: "Update to latest version",
|
|
60
|
+
"new-code": "New code",
|
|
61
|
+
"delete-comments": "Delete this link's comments",
|
|
62
|
+
revoke: "Revoke",
|
|
63
|
+
delete: "Delete",
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
export const DESTRUCTIVE_SHARE_ACTIONS: ReadonlySet<ShareLinkActionId> = new Set(["delete-comments", "revoke", "delete"]);
|
|
@@ -16,12 +16,21 @@ const STORAGE_KEY = "ppm-design-view-prefs";
|
|
|
16
16
|
export const DEFAULT_CHAT_PERCENT = 38;
|
|
17
17
|
export const MIN_CHAT_PERCENT = 20;
|
|
18
18
|
export const MAX_CHAT_PERCENT = 70;
|
|
19
|
+
/**
|
|
20
|
+
* The chat column's width in a design *window*, in px: a fixed column rather than a share,
|
|
21
|
+
* because a window is resized far more often than the column is, and the chat should not
|
|
22
|
+
* swell and shrink with it. It never takes more than half the window either (see the layout).
|
|
23
|
+
*/
|
|
24
|
+
export const DEFAULT_WINDOW_CHAT_WIDTH = 380;
|
|
25
|
+
export const MIN_WINDOW_CHAT_WIDTH = 280;
|
|
26
|
+
export const MAX_WINDOW_CHAT_WIDTH = 440;
|
|
19
27
|
/** Designs whose frame is remembered; the least recently changed are forgotten first. */
|
|
20
28
|
export const MAX_REMEMBERED_FRAMES = 50;
|
|
21
29
|
|
|
22
30
|
export interface DesignViewPrefs {
|
|
23
31
|
layout: DesignLayoutOverride;
|
|
24
32
|
chatPercent: number;
|
|
33
|
+
windowChatWidth: number;
|
|
25
34
|
/** `<project>/<slug>` → frame, oldest first. */
|
|
26
35
|
frames: Record<string, DeviceFrameId>;
|
|
27
36
|
/** `<project>/<slug>` → the variant file on screen, oldest first. Checked against the list on use. */
|
|
@@ -29,7 +38,7 @@ export interface DesignViewPrefs {
|
|
|
29
38
|
}
|
|
30
39
|
|
|
31
40
|
export function defaultDesignViewPrefs(): DesignViewPrefs {
|
|
32
|
-
return { layout: "auto", chatPercent: DEFAULT_CHAT_PERCENT, frames: {}, variants: {} };
|
|
41
|
+
return { layout: "auto", chatPercent: DEFAULT_CHAT_PERCENT, windowChatWidth: DEFAULT_WINDOW_CHAT_WIDTH, frames: {}, variants: {} };
|
|
33
42
|
}
|
|
34
43
|
|
|
35
44
|
/** Newest-last entries of a stored map, the ones failing `keep` dropped, at most MAX_REMEMBERED_FRAMES. */
|
|
@@ -48,6 +57,11 @@ export function clampChatPercent(value: unknown): number {
|
|
|
48
57
|
return Math.min(MAX_CHAT_PERCENT, Math.max(MIN_CHAT_PERCENT, Math.round(value)));
|
|
49
58
|
}
|
|
50
59
|
|
|
60
|
+
export function clampWindowChatWidth(value: unknown): number {
|
|
61
|
+
if (typeof value !== "number" || !Number.isFinite(value)) return DEFAULT_WINDOW_CHAT_WIDTH;
|
|
62
|
+
return Math.min(MAX_WINDOW_CHAT_WIDTH, Math.max(MIN_WINDOW_CHAT_WIDTH, Math.round(value)));
|
|
63
|
+
}
|
|
64
|
+
|
|
51
65
|
export function parseDesignViewPrefs(raw: string | null): DesignViewPrefs {
|
|
52
66
|
if (!raw) return defaultDesignViewPrefs();
|
|
53
67
|
let data: unknown;
|
|
@@ -61,6 +75,7 @@ export function parseDesignViewPrefs(raw: string | null): DesignViewPrefs {
|
|
|
61
75
|
const layout = isDesignLayoutOverride(obj.layout) ? obj.layout : "auto";
|
|
62
76
|
return {
|
|
63
77
|
layout, chatPercent: clampChatPercent(obj.chatPercent),
|
|
78
|
+
windowChatWidth: clampWindowChatWidth(obj.windowChatWidth),
|
|
64
79
|
frames: rememberedMap(obj.frames, isDeviceFrameId),
|
|
65
80
|
variants: rememberedMap(obj.variants, isStoredVariant),
|
|
66
81
|
};
|
|
@@ -93,6 +108,10 @@ export function withChatPercent(prefs: DesignViewPrefs, percent: number): Design
|
|
|
93
108
|
return { ...prefs, chatPercent: clampChatPercent(percent) };
|
|
94
109
|
}
|
|
95
110
|
|
|
111
|
+
export function withWindowChatWidth(prefs: DesignViewPrefs, width: number): DesignViewPrefs {
|
|
112
|
+
return { ...prefs, windowChatWidth: clampWindowChatWidth(width) };
|
|
113
|
+
}
|
|
114
|
+
|
|
96
115
|
export function withLayout(prefs: DesignViewPrefs, layout: DesignLayoutOverride): DesignViewPrefs {
|
|
97
116
|
return { ...prefs, layout };
|
|
98
117
|
}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { usePanelStore } from "@/stores/panel-store";
|
|
2
|
+
import { windowIdFromPanelId } from "@/stores/panel-utils";
|
|
3
|
+
import { useSettingsStore } from "@/stores/settings-store";
|
|
4
|
+
import { useWindowStore } from "@/components/floating-window/window-store";
|
|
5
|
+
import { cascadeSpawnRect } from "@/components/floating-window/window-geometry";
|
|
2
6
|
import { currentTabMetadata, patchTabMetadata } from "@/lib/patch-tab-metadata";
|
|
3
7
|
import { designTabMetadata } from "./design-tab-metadata";
|
|
4
8
|
|
|
@@ -13,14 +17,24 @@ export interface OpenDesignTabInput {
|
|
|
13
17
|
panelId?: string;
|
|
14
18
|
/** Just created: skip looking up its latest session, it has none. */
|
|
15
19
|
fresh?: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Stay in `panelId` as a tab even where designs open in windows: the design is taking the
|
|
22
|
+
* place of a tab there (a chat that turned out to be a design session), and moving it out
|
|
23
|
+
* would leave that panel empty.
|
|
24
|
+
*/
|
|
25
|
+
inPlace?: boolean;
|
|
16
26
|
}
|
|
17
27
|
|
|
18
28
|
/**
|
|
19
29
|
* Open (or focus) a design's tab. There is one tab per design; opening it again focuses
|
|
20
30
|
* the existing tab, and asking for a particular session switches that tab to it.
|
|
31
|
+
*
|
|
32
|
+
* On a desktop with Settings → Design → "Open designs in a window" on, a design that was
|
|
33
|
+
* not open yet goes straight into a floating window of its own (see {@link showInWindow}).
|
|
21
34
|
*/
|
|
22
35
|
export function openDesignTab(input: OpenDesignTabInput): string {
|
|
23
|
-
const { projectName, slug, title, sessionId, providerId, panelId, fresh } = input;
|
|
36
|
+
const { projectName, slug, title, sessionId, providerId, panelId, fresh, inPlace } = input;
|
|
37
|
+
const wasOpen = isDesignOpen(projectName, slug);
|
|
24
38
|
const id = usePanelStore.getState().openTab({
|
|
25
39
|
type: "design",
|
|
26
40
|
title: title || slug,
|
|
@@ -28,6 +42,7 @@ export function openDesignTab(input: OpenDesignTabInput): string {
|
|
|
28
42
|
closable: true,
|
|
29
43
|
metadata: designTabMetadata({ projectName, designSlug: slug, sessionId, providerId, fresh }),
|
|
30
44
|
}, panelId);
|
|
45
|
+
if (id) showInWindow(id, wasOpen || Boolean(inPlace));
|
|
31
46
|
if (!id || !sessionId) return id;
|
|
32
47
|
|
|
33
48
|
// The tab already existed, so the panel store focused it and ignored the metadata above.
|
|
@@ -44,6 +59,44 @@ export function openDesignTab(input: OpenDesignTabInput): string {
|
|
|
44
59
|
return id;
|
|
45
60
|
}
|
|
46
61
|
|
|
62
|
+
/** Same match as the panel store's one-tab-per-design rule: slug and project, any panel. */
|
|
63
|
+
function isDesignOpen(projectName: string, slug: string): boolean {
|
|
64
|
+
return Object.values(usePanelStore.getState().panels).some((p) => p.tabs.some((t) =>
|
|
65
|
+
t.type === "design" && t.metadata?.designSlug === slug && (t.projectId ?? t.metadata?.projectName) === projectName));
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Put a design on screen in its window.
|
|
70
|
+
*
|
|
71
|
+
* Already in a window: that window comes forward, out of the dock if it was minimized. Just
|
|
72
|
+
* opened: it moves from the tab strip into a new window, which is its home — closing the
|
|
73
|
+
* window closes the design. Open in the grid already (the user docked it there, or the
|
|
74
|
+
* setting was off when it opened): it stays where the user put it.
|
|
75
|
+
*
|
|
76
|
+
* A phone has no windows, and `popOutTab` refuses there; at the window cap it refuses too,
|
|
77
|
+
* and the design simply stays a tab.
|
|
78
|
+
*/
|
|
79
|
+
function showInWindow(tabId: string, wasOpen: boolean): void {
|
|
80
|
+
const panelId = usePanelStore.getState().getPanelForTab(tabId)?.id;
|
|
81
|
+
if (!panelId) return;
|
|
82
|
+
const windowId = windowIdFromPanelId(panelId);
|
|
83
|
+
if (windowId) {
|
|
84
|
+
useWindowStore.getState().focus(windowId);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (wasOpen || !useSettingsStore.getState().designWindows) return;
|
|
88
|
+
const windows = useWindowStore.getState();
|
|
89
|
+
const rect = cascadeSpawnRect(
|
|
90
|
+
Object.values(windows.windows).map((w) => w.rect),
|
|
91
|
+
windows.bounds,
|
|
92
|
+
{ w: Math.round(windows.bounds.w * DESIGN_WINDOW_SHARE.w), h: Math.round(windows.bounds.h * DESIGN_WINDOW_SHARE.h) },
|
|
93
|
+
);
|
|
94
|
+
usePanelStore.getState().popOutTab(tabId, panelId, { closeTabsOnClose: true, rect });
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** A design window's first size, as a share of the work area: a canvas wants room. */
|
|
98
|
+
const DESIGN_WINDOW_SHARE = { w: 0.72, h: 0.84 };
|
|
99
|
+
|
|
47
100
|
/** The epoch after the one `metadata` carries; the design tab keys its chat on it. */
|
|
48
101
|
export function nextChatEpoch(metadata: Record<string, unknown> | undefined): number {
|
|
49
102
|
const epoch = metadata?.designChatEpoch;
|
|
@@ -50,6 +50,66 @@ export function resolveRepo(
|
|
|
50
50
|
return discovery.repos.length === 1 ? discovery.repos[0]! : null;
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
+
/**
|
|
54
|
+
* The repository a file belongs to, whatever the panels have chosen.
|
|
55
|
+
*
|
|
56
|
+
* A file-scoped question — blame, above all — has exactly one right answer: the
|
|
57
|
+
* repository whose working tree holds the file. Going by the user's choice
|
|
58
|
+
* instead left blame silent in a container folder until the right repository
|
|
59
|
+
* happened to be picked in Source Control, and with no choice at all it ran git
|
|
60
|
+
* in the container itself, which is not a repository.
|
|
61
|
+
*
|
|
62
|
+
* The innermost candidate wins, though discovery does not descend into a found
|
|
63
|
+
* repository today, so two never nest. `null` before discovery answers, and for
|
|
64
|
+
* a file under no repository.
|
|
65
|
+
*/
|
|
66
|
+
export function repoContainingFile(
|
|
67
|
+
discovery: GitRepoDiscovery | undefined,
|
|
68
|
+
projectRelative: string,
|
|
69
|
+
): GitRepoCandidate | null {
|
|
70
|
+
if (!discovery) return null;
|
|
71
|
+
const path = projectRelative.replace(/^\.?\//, "");
|
|
72
|
+
let best: GitRepoCandidate | null = null;
|
|
73
|
+
for (const repo of discovery.repos) {
|
|
74
|
+
const contains = repo.relative === "." || path === repo.relative || path.startsWith(`${repo.relative}/`);
|
|
75
|
+
if (!contains) continue;
|
|
76
|
+
if (!best || best.relative === "." || repo.relative.length > best.relative.length) best = repo;
|
|
77
|
+
}
|
|
78
|
+
return best;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** Where a file-scoped git call goes: `repo` as its `repo=`, `path` as its file. */
|
|
82
|
+
export interface FileGitScope {
|
|
83
|
+
/** `null` means no `repo=` at all — git runs in the project folder. */
|
|
84
|
+
repo: GitRepoCandidate | null;
|
|
85
|
+
/** The file, relative to wherever git runs. */
|
|
86
|
+
path: string;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* The scope for one file's git call — blame, the file diff, a blob.
|
|
91
|
+
*
|
|
92
|
+
* The file's own repository when discovery found it. When discovery found no
|
|
93
|
+
* repository anywhere, the call goes out unscoped as it always did: a project
|
|
94
|
+
* folder *inside* a repository (`<repo>/packages/web`) has no `.git` of its own
|
|
95
|
+
* and none below it, yet git run there finds the enclosing repository and
|
|
96
|
+
* answers. Refusing that case would take blame away from a layout that had it.
|
|
97
|
+
*
|
|
98
|
+
* `undefined` while discovery has not answered — not yet known, so a caller
|
|
99
|
+
* waits rather than guessing. `null` for a file under none of the repositories
|
|
100
|
+
* discovery did find: there is nothing to ask git.
|
|
101
|
+
*/
|
|
102
|
+
export function fileGitScope(
|
|
103
|
+
discovery: GitRepoDiscovery | undefined,
|
|
104
|
+
projectRelative: string,
|
|
105
|
+
): FileGitScope | null | undefined {
|
|
106
|
+
if (!discovery) return undefined;
|
|
107
|
+
const repo = repoContainingFile(discovery, projectRelative);
|
|
108
|
+
if (repo) return { repo, path: repoRelativePath(projectRelative, repo) ?? "" };
|
|
109
|
+
if (hasNoRepo(discovery)) return { repo: null, path: repoRelativePath(projectRelative, null) ?? "" };
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
|
|
53
113
|
/** True when there is a choice to make and it has not been made. */
|
|
54
114
|
export function needsPick(
|
|
55
115
|
discovery: GitRepoDiscovery | undefined,
|
|
@@ -209,6 +209,7 @@ const D: Record<string, readonly string[]> = {
|
|
|
209
209
|
"wifi-off": ["M2.854 2.146a.5.5 0 1 0-.708.708l3.031 3.03a9.6 9.6 0 0 0-1.937 1.5a10 10 0 0 0-1.121 1.36a.5.5 0 0 0 .821.57A9 9 0 0 1 3.947 8.09a8.6 8.6 0 0 1 1.964-1.473l1.436 1.436a6.4 6.4 0 0 0-1.871 1.303a6.4 6.4 0 0 0-1.193 1.645a.5.5 0 1 0 .892.452a5.4 5.4 0 0 1 1.008-1.39A5.4 5.4 0 0 1 8.11 8.818l1.855 1.856a4.02 4.02 0 0 0-2.781 1.18a4 4 0 0 0-.84 1.244a.5.5 0 0 0 .916.4c.155-.355.368-.674.63-.937a3.03 3.03 0 0 1 3.304-.66l1.646 1.647a.5.5 0 0 0 .2.2l4.105 4.106a.5.5 0 0 0 .708-.708zm6.75 5.336L10.62 8.5a5.43 5.43 0 0 1 3.27 1.565a5.6 5.6 0 0 1 1.01 1.404a.5.5 0 0 0 .891-.455a6.6 6.6 0 0 0-1.194-1.656a6.44 6.44 0 0 0-4.994-1.875M7.135 5.014l.81.81a8.61 8.61 0 0 1 9.197 3.493a.5.5 0 0 0 .823-.568a9.61 9.61 0 0 0-10.83-3.734m3.828 8.773a1.298 1.298 0 1 1-1.836 1.836a1.298 1.298 0 0 1 1.836-1.836"],
|
|
210
210
|
"window": ["M6 3a3 3 0 0 0-3 3v8a3 3 0 0 0 3 3h8a3 3 0 0 0 3-3V6a3 3 0 0 0-3-3zM4 6a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2zm0 1h12v7a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2z"],
|
|
211
211
|
"window-console": ["M5.646 9.146a.5.5 0 0 1 .708 0l2 2a.5.5 0 0 1 0 .708l-2 2a.5.5 0 0 1-.708-.708L7.293 11.5L5.646 9.854a.5.5 0 0 1 0-.708M14.5 13h-5a.5.5 0 0 0 0 1h5a.5.5 0 0 0 0-1M2.996 5.5a2.5 2.5 0 0 1 2.5-2.5h9a2.5 2.5 0 0 1 2.5 2.5V6H17v1h-.003v7.5a2.5 2.5 0 0 1-2.5 2.5h-9a2.5 2.5 0 0 1-2.5-2.5zm13 .5v-.5a1.5 1.5 0 0 0-1.5-1.5h-9a1.5 1.5 0 0 0-1.5 1.5V6zm-12 1v7.5a1.5 1.5 0 0 0 1.5 1.5h9a1.5 1.5 0 0 0 1.5-1.5V7z"],
|
|
212
|
+
"wrench": ["M9 6.5a4.5 4.5 0 0 1 6.352-4.102a.5.5 0 0 1 .148.809L13.207 5.5L14.5 6.793L16.793 4.5a.5.5 0 0 1 .809.147a4.5 4.5 0 0 1-5.207 6.216L6.03 17.311a2.357 2.357 0 0 1-3.374-3.293L9.082 7.36A4.5 4.5 0 0 1 9 6.5M13.5 3a3.5 3.5 0 0 0-3.387 4.386a.5.5 0 0 1-.125.473l-6.612 6.854a1.357 1.357 0 0 0 1.942 1.896l6.574-6.66a.5.5 0 0 1 .512-.124a3.5 3.5 0 0 0 4.521-4.044l-2.072 2.073a.5.5 0 0 1-.707 0l-2-2a.5.5 0 0 1 0-.708l2.073-2.072a3.5 3.5 0 0 0-.72-.074"],
|
|
212
213
|
"zoom-in": ["M8.5 5.5A.5.5 0 0 1 9 6v2h2a.5.5 0 0 1 0 1H9v2a.5.5 0 0 1-1 0V9H6a.5.5 0 0 1 0-1h2V6a.5.5 0 0 1 .5-.5m0-3.5a6.5 6.5 0 0 1 4.937 10.73l3.417 3.416a.5.5 0 0 1-.638.765l-.07-.058l-3.417-3.417A6.5 6.5 0 1 1 8.5 2m0 1a5.5 5.5 0 1 0 0 11a5.5 5.5 0 0 0 0-11"],
|
|
213
214
|
"zoom-out": ["M11 8a.5.5 0 0 1 0 1H6a.5.5 0 0 1 0-1zM8.5 2a6.5 6.5 0 0 1 4.937 10.73l3.417 3.416a.5.5 0 0 1-.638.765l-.07-.058l-3.417-3.417A6.5 6.5 0 1 1 8.5 2m0 1a5.5 5.5 0 1 0 0 11a5.5 5.5 0 0 0 0-11"],
|
|
214
215
|
};
|
|
@@ -224,7 +225,7 @@ export function glyphPaths(name: string): readonly string[] | undefined {
|
|
|
224
225
|
}
|
|
225
226
|
|
|
226
227
|
/** Which names this module draws with Fluent, for the coverage test. */
|
|
227
|
-
export const FLUENT_NAMES: readonly string[] = ["Activity","AlertCircle","AlertTriangle","AppWindow","Archive","ArrowDown","ArrowDownAZ","ArrowDownToLine","ArrowDownUp","ArrowLeft","ArrowLeftRight","ArrowNext","ArrowPrevious","ArrowRight","ArrowRightFromLine","ArrowUp","ArrowUpCircle","ArrowUpDown","ArrowUpFromLine","ArrowUpRight","Bell","BellOff","BellRing","Bot","BotMessageSquare","Brain","Bug","CalendarClock","CalendarX2","Check","CheckCircle","CheckCircle2","CheckIcon","ChevronDown","ChevronDownIcon","ChevronLeft","ChevronRight","ChevronRightIcon","ChevronUp","ChevronUpIcon","ChevronsDown","ChevronsDownUp","ChevronsLeft","ChevronsRight","ChevronsUpDown","Circle","CircleCheckIcon","CircleHelp","CircleIcon","CircleX","Clipboard","ClipboardCheck","ClipboardList","ClipboardPaste","Clock","Cloud","CloudOff","CloudUpload","Code","Coffee","Columns","Columns2","Columns3","Copy","Cpu","Crosshair","Database","DatabaseZap","Download","ExternalLink","Eye","EyeOff","File","FileArchive","FileCode","FilePen","FilePlus","FilePlus2","FileSearch","FileText","FileType","FileWarning","Filter","FlaskConical","FlipHorizontal","FlipHorizontal2","FlipVertical","FlipVertical2","Folder","FolderOpen","FolderPlus","FolderSearch","FolderSymlink","FolderTree","Form","Gauge","GitBranch","GitMerge","Globe","Grid2x2","GripHorizontal","GripVertical","Hand","HardDrive","Hash","Heart","HelpCircle","History","Home","Image","ImageOff","ImagePlus","IndentIncrease","Info","InfoIcon","Key","KeyRound","Keyboard","Layers","LayoutGrid","Lightbulb","Link","Link2","Link2Off","List","ListChecks","ListFilter","ListOrdered","ListTodo","Loader2","Loader2Icon","Lock","LogIn","LogOut","Maximize","Maximize2","Menu","MessageCircle","MessageSquare","MessageSquarePlus","Mic","MicOff","Minimize","Minimize2","Minus","Monitor","MonitorSmartphone","MonitorX","Moon","MoreHorizontal","MoreVertical","MousePointer2","MousePointerClick","Move","Music","OctagonXIcon","Palette","PanelBottom","PanelLeft","PanelLeftOpen","PanelRight","Paperclip","Pause","Pencil","PencilLine","PictureInPicture2","Pin","PinOff","Play","Plug","Plus","Power","Presentation","Printer","Puzzle","QrCode","Redo2","RefreshCw","RotateCcw","RotateCw","Save","Scissors","ScrollText","Search","Send","Settings","Settings2","Share2","ShieldAlert","ShieldCheck","ShieldOff","SlidersHorizontal","Smartphone","Sparkles","Square","SquareDashedMousePointer","SquareMinus","SquarePlus","SquareTerminal","Sun","Table","TableSimple","Tablet","Tag","Tags","Terminal","TerminalSquare","TextSelect","Timer","Trash2","TriangleAlert","TriangleAlertIcon","Undo2","Unlink","Upload","Usb","UserPlus","UserRound","Users","Volume1","Volume2","VolumeX","Wifi","WifiOff","WrapText","X","XCircle","XIcon","XSquare","Zap","ZapOff","ZoomIn","ZoomOut"];
|
|
228
|
+
export const FLUENT_NAMES: readonly string[] = ["Activity","AlertCircle","AlertTriangle","AppWindow","Archive","ArrowDown","ArrowDownAZ","ArrowDownToLine","ArrowDownUp","ArrowLeft","ArrowLeftRight","ArrowNext","ArrowPrevious","ArrowRight","ArrowRightFromLine","ArrowUp","ArrowUpCircle","ArrowUpDown","ArrowUpFromLine","ArrowUpRight","Bell","BellOff","BellRing","Bot","BotMessageSquare","Brain","Bug","CalendarClock","CalendarX2","Check","CheckCircle","CheckCircle2","CheckIcon","ChevronDown","ChevronDownIcon","ChevronLeft","ChevronRight","ChevronRightIcon","ChevronUp","ChevronUpIcon","ChevronsDown","ChevronsDownUp","ChevronsLeft","ChevronsRight","ChevronsUpDown","Circle","CircleCheckIcon","CircleHelp","CircleIcon","CircleX","Clipboard","ClipboardCheck","ClipboardList","ClipboardPaste","Clock","Cloud","CloudOff","CloudUpload","Code","Coffee","Columns","Columns2","Columns3","Copy","Cpu","Crosshair","Database","DatabaseZap","Download","ExternalLink","Eye","EyeOff","File","FileArchive","FileCode","FilePen","FilePlus","FilePlus2","FileSearch","FileText","FileType","FileWarning","Filter","FlaskConical","FlipHorizontal","FlipHorizontal2","FlipVertical","FlipVertical2","Folder","FolderOpen","FolderPlus","FolderSearch","FolderSymlink","FolderTree","Form","Gauge","GitBranch","GitMerge","Globe","Grid2x2","GripHorizontal","GripVertical","Hand","HardDrive","Hash","Heart","HelpCircle","History","Home","Image","ImageOff","ImagePlus","IndentIncrease","Info","InfoIcon","Key","KeyRound","Keyboard","Layers","LayoutGrid","Lightbulb","Link","Link2","Link2Off","List","ListChecks","ListFilter","ListOrdered","ListTodo","Loader2","Loader2Icon","Lock","LogIn","LogOut","Maximize","Maximize2","Menu","MessageCircle","MessageSquare","MessageSquarePlus","Mic","MicOff","Minimize","Minimize2","Minus","Monitor","MonitorSmartphone","MonitorX","Moon","MoreHorizontal","MoreVertical","MousePointer2","MousePointerClick","Move","Music","OctagonXIcon","Palette","PanelBottom","PanelLeft","PanelLeftOpen","PanelRight","Paperclip","Pause","Pencil","PencilLine","PictureInPicture2","Pin","PinOff","Play","Plug","Plus","Power","Presentation","Printer","Puzzle","QrCode","Redo2","RefreshCw","RotateCcw","RotateCw","Save","Scissors","ScrollText","Search","Send","Settings","Settings2","Share2","ShieldAlert","ShieldCheck","ShieldOff","SlidersHorizontal","Smartphone","Sparkles","Square","SquareDashedMousePointer","SquareMinus","SquarePlus","SquareTerminal","Sun","Table","TableSimple","Tablet","Tag","Tags","Terminal","TerminalSquare","TextSelect","Timer","Trash2","TriangleAlert","TriangleAlertIcon","Undo2","Unlink","Upload","Usb","UserPlus","UserRound","Users","Volume1","Volume2","VolumeX","Wifi","WifiOff","WrapText","Wrench","X","XCircle","XIcon","XSquare","Zap","ZapOff","ZoomIn","ZoomOut"];
|
|
228
229
|
|
|
229
230
|
/** Which names deliberately stay on lucide, and are asserted to be a short list. */
|
|
230
231
|
export const LUCIDE_NAMES: readonly string[] = ["CaseSensitive","FileDiff","FileJson","FolderGit2","GitCommitHorizontal","Github","Hexagon","Network","PowerOff","Regex","ReplaceAll","Scan","ServerOff","Slash","WholeWord"];
|
|
@@ -474,6 +475,7 @@ export const VolumeX = fluentIcon("VolumeX", D["speaker-off"]!);
|
|
|
474
475
|
export const Wifi = fluentIcon("Wifi", D["wifi-1"]!);
|
|
475
476
|
export const WifiOff = fluentIcon("WifiOff", D["wifi-off"]!);
|
|
476
477
|
export const WrapText = fluentIcon("WrapText", D["text-wrap"]!);
|
|
478
|
+
export const Wrench = fluentIcon("Wrench", D["wrench"]!);
|
|
477
479
|
export const X = fluentIcon("X", D["dismiss"]!);
|
|
478
480
|
export const XCircle = fluentIcon("XCircle", D["dismiss-circle"]!);
|
|
479
481
|
export const XIcon = fluentIcon("XIcon", D["dismiss"]!);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A readable name for a model id the provider's model list did not label.
|
|
3
|
+
*
|
|
4
|
+
* The chip shows the list's own label when it has one; this is the fallback for a model the
|
|
5
|
+
* list does not carry (a pinned default, an older session, a list still loading), which
|
|
6
|
+
* otherwise rendered its raw id — `claude-opus-5-5`, the widest thing in a narrow composer.
|
|
7
|
+
* Only Claude ids are rewritten: their shape is known (`claude-<family>-<major>[-<minor>]`,
|
|
8
|
+
* optionally a `-YYYYMMDD` snapshot). Anything else is shown as given.
|
|
9
|
+
*/
|
|
10
|
+
export function modelDisplayName(id: string): string {
|
|
11
|
+
const match = /^claude-([a-z]+)((?:-\d{1,2})+)(?:-\d{8})?$/i.exec(id);
|
|
12
|
+
if (!match) return id;
|
|
13
|
+
const family = match[1]!;
|
|
14
|
+
const version = match[2]!.slice(1).split("-").join(".");
|
|
15
|
+
return `${family[0]!.toUpperCase()}${family.slice(1)} ${version}`;
|
|
16
|
+
}
|