@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
|
@@ -263,7 +263,7 @@ A link may name one place in the file — `app.ts:120`, `app.ts:120-140`, `app.t
|
|
|
263
263
|
|
|
264
264
|
## Design mode
|
|
265
265
|
|
|
266
|
-
A **Design tab** puts a design chat beside a live, sandboxed canvas of what the agent builds: a page or a slide deck (`kind` `page` or `slides`), made of plain HTML/CSS files the user can export or build in real code from a new chat. It opens from the sidebar's Designs section, the palette's "New Design…" (the dialog is hosted by `command-palette-design-commands.tsx`, since the palette is mounted on every layout) or the deep link `/project/<p>/design/<slug>`. The layout follows the tab's own width, not the viewport (`lib/design/design-layout-mode.ts`): a draggable chat/canvas split at 940px and up, one pane below 860px (the previous layout holds in between, so dragging a panel divider does not flicker), switched by a Canvas | Chat toggle in the toolbar. The toolbar's Layout menu pins Auto / Split / Canvas only / Chat only per device (`design-view-prefs.ts`), and Expand canvas lifts the canvas over the whole window (Esc or Exit full view to leave). Below `md` it is always one pane with a Canvas / Chat / More bar in the thumb zone. Every one of these is the same tree (`design-split-layout.tsx`) restyled by CSS, because moving the iframe reloads the design and unmounting the chat drops its socket; the one reload left is PPM's shell moving the whole tab into its mobile slot when the viewport crosses `md`. UI in `src/web/components/design/`, one tab per design, never
|
|
266
|
+
A **Design tab** puts a design chat beside a live, sandboxed canvas of what the agent builds: a page or a slide deck (`kind` `page` or `slides`), made of plain HTML/CSS files the user can export or build in real code from a new chat. It opens from the sidebar's Designs section, the palette's "New Design…" (the dialog is hosted by `command-palette-design-commands.tsx`, since the palette is mounted on every layout) or the deep link `/project/<p>/design/<slug>`. The layout follows the tab's own width, not the viewport (`lib/design/design-layout-mode.ts`): a draggable chat/canvas split at 940px and up, one pane below 860px (the previous layout holds in between, so dragging a panel divider does not flicker), switched by a Canvas | Chat toggle in the toolbar. The toolbar's Layout menu pins Auto / Split / Canvas only / Chat only per device (`design-view-prefs.ts`), and Expand canvas lifts the canvas over the whole window (Esc or Exit full view to leave). Below `md` it is always one pane with a Canvas / Chat / More bar in the thumb zone. Every one of these is the same tree (`design-split-layout.tsx`) restyled by CSS, because moving the iframe reloads the design and unmounting the chat drops its socket; the one reload left is PPM's shell moving the whole tab into its mobile slot when the viewport crosses `md`. UI in `src/web/components/design/`, one tab per design. On a desktop a design opens in a floating window of its own (Settings → Design → *Open designs in a window*, on by default; `openDesignTab` pops the new tab out with `closeTabsOnClose`, so closing the window closes the design instead of docking it back). Inside a window the layout is fixed rather than width-driven: canvas first and the chat a column on the right, shown or hidden by the toolbar's Chat button (`windowed` in `resolveDesignLayout`). The column's left edge drags (or takes the arrow keys) between 280 and 440px, 380 by default and never more than half the window, remembered per device as `windowChatWidth` in `design-view-prefs.ts`. A chat that narrow compacts by its own width rather than the viewport: `chat-tab.tsx` is `@container/chat`, and below 420px the changes bar, the history bar and the composer chips drop their words to icons (tooltips keep the names) and the chip row stays on one line, the model chip giving way first. A model id the provider's list has not labelled is shown by `modelDisplayName` (`claude-opus-5-5` → `Opus 5.5`). It never goes into picture-in-picture (`NON_PIP_TAB_TYPES`: the bridge accepts messages only from an iframe whose parent is the main window, and PiP would make the PiP window its parent). A design already in the grid stays there; a phone always opens it as a tab.
|
|
267
267
|
|
|
268
268
|
**Storage** (`src/services/design/`, REST under `/api/project/:name/designs`, `src/server/routes/designs.ts` plus one sub-router per feature):
|
|
269
269
|
- `designs/<slug>/` is the design: `index.html` (the entry), `design.json` (`title`, `kind`, `entry`, timestamps and the agent's `tweaks[]`; unknown fields are carried through) and whatever else the agent writes.
|
|
@@ -271,7 +271,7 @@ A **Design tab** puts a design chat beside a live, sandboxed canvas of what the
|
|
|
271
271
|
- **Declared apps** (`design-systems.service.ts`, `design-systems-paths.ts`, REST `/api/project/:name/designs/systems`, mounted before `/:slug` since `systems` is a reserved slug): a monorepo or a container folder (Nxsys's `payroll-fe`, `umbrella-fe`…) can have more than one UI app, each with its own design system. An app is `designs/systems/<id>/system.json` (`label`, `root` relative to the project, `platform: "web" | "mobile"`, server-recorded `builtFrom`); its `DESIGN.md`/`tokens.css`/`kit/` live in that same folder — except `default`, whose files stay at the legacy `designs/` root and are never moved. Settings → Design's "Apps in this project" (`design-apps-settings-section.tsx`) declares, edits and removes them (no auto-detection); a design's `design.json` carries `system: "<id>"` (absent = `default`).
|
|
272
272
|
- **Showcase and automatic setup.** Each app has a showcase design at the fixed slug `system-<id>` (manifest `showcaseFor`), listed in the sidebar's own "Design systems" group (`design-systems-sidebar-group.tsx`) instead of the ordinary Designs list. Most users do not know what a design system is, so nothing asks them: the first design turn of any kind for an app whose `DESIGN.md` does not exist yet carries an extra instructions block (`design-instructions-auto-setup-block.ts`, embedding `buildDesignSystemInitPrompt`'s own text so the two cannot drift) that tells the agent to notify the user in one line, set the system up itself — `designs/systems/<id>/` and the showcase's `designs/system-<id>/index.html` are explicitly writable for that one turn, the only exception to "Where to work" — then build what was actually asked for. `chatService.resolveDesignOptions` gets the showcase design's own folder and manifest ready first (`ensureShowcaseDesign`), so the agent only ever has to write its `index.html`. The canvas More menu's "Set up design system" still gets or creates that showcase and auto-sends the brief as an ordinary chat message, for a manual re-run (the stale "Refresh" flow); a tab that has not mounted its composer yet is retried for up to 2 s before falling back to a plain prefill. `builtFrom` (`git rev-parse HEAD` of the app's root) is recorded server-side, via the same debounced hook as the turn snapshot (`design-turn-snapshot.ts` → `recordBuiltFromAfterDesignTurn`): unconditionally after a showcase session's turn (what the manual re-run relies on to clear "may be outdated"), or, for an ordinary design, only the one turn that leaves `DESIGN.md` in place while `builtFrom` was still absent — never on a later, unrelated edit.
|
|
273
273
|
- **Stale reminder** (`design-systems-stale.ts`, cached per (root, HEAD)): comparing `builtFrom.commit..HEAD` restricted to the app root, a theme/style-config file changed (`tailwind.config.*`, `postcss.config.*`, anything named or pathed like theme/tokens/variables, a `styles/`/`theme/` `.scss`/`.less` partial) or at least 20 changed UI files makes it stale ("may be outdated (N UI files changed)"); no repo, no `builtFrom`, or a timed-out `git diff` is "unknown", shown as "built <date>", never as stale.
|
|
274
|
-
- `designs/<slug>/.design/` is the canvas's own data and is never part of the design: its `.gitignore` is `*`, the file watcher skips it (`file-watcher/ignore-rules.ts`), the preview route never serves it. `history/<id>/{meta.json,files/}` holds snapshots (`turn`, `pre-restore`, `before-edit`, `manual`; 100 protected + 30 `before-edit` kept, tree-hash dedupe, a design over 50 MB or 5000 files is skipped), `comments.json` the pinned comments. Because nothing there is watched, History and Comments refresh on `design:history_changed` / `design:comments_changed` from `/ws/global` (`design-events.ts`).
|
|
274
|
+
- `designs/<slug>/.design/` is the canvas's own data and is never part of the design: its `.gitignore` is `*`, the file watcher skips it (`file-watcher/ignore-rules.ts`), the preview route never serves it. `history/<id>/{meta.json,files/}` holds snapshots (`turn`, `pre-restore`, `before-edit`, `manual`; 100 protected + 30 `before-edit` kept, plus every snapshot a share link pins, which no prune removes; tree-hash dedupe, a design over 50 MB or 5000 files is skipped), `comments.json` the pinned comments and their reply threads, each entry carrying its author (the owner, or a reviewer of one share link). Because nothing there is watched, History and Comments refresh on `design:history_changed` / `design:comments_changed` from `/ws/global` (`design-events.ts`).
|
|
275
275
|
- Restore snapshots the current state first and swaps through a journal (`design-restore-journal.ts`), so a crash mid-restore is finished from the staged copy on the next access rather than leaving half a design.
|
|
276
276
|
- Every tree operation goes through `design-safe-walk.ts` (no symlinks, no FIFOs, no credential paths, depth and size caps).
|
|
277
277
|
|
|
@@ -293,7 +293,7 @@ A **Design tab** puts a design chat beside a live, sandboxed canvas of what the
|
|
|
293
293
|
- Every `ready` is a new document: a live reload, a token rotation, or the tab pool reparenting the iframe (which reloads it with the same URL). Features register `onReplay` to put their state back (scroll, picker, pins, Move target).
|
|
294
294
|
|
|
295
295
|
**Write-backs:**
|
|
296
|
-
- *Comments.* An anchor is `ppmId` + tag + text quote with prefix/suffix + a CSS path. It is re-resolved on every `ready` (same tag only, 0.55 similarity threshold, orphaned rather than guessed) and re-checked against the source by the server. The element context in a prompt is a snippet the server slices from the source (`design-comment-element-context.ts`), fenced as untrusted (`design-comments-prompt.ts`). "Send to AI" shows the whole message first and only fills the design chat's composer.
|
|
296
|
+
- *Comments.* An anchor is `ppmId` + tag + text quote with prefix/suffix + a CSS path. It is re-resolved on every `ready` (same tag only, 0.55 similarity threshold, orphaned rather than guessed) and re-checked against the source by the server. The element context in a prompt is a snippet the server slices from the source (`design-comment-element-context.ts`), fenced as untrusted (`design-comments-prompt.ts`). "Send to AI" shows the whole message first and only fills the design chat's composer. A comment is a thread: anyone who can see it replies, the panel opens a thread in its own place (side panel, or the phone's sheet), and reviewer threads read "<name> · via <link label>" (see Share links).
|
|
297
297
|
- *Tweaks.* `design.json` declares controls bound to CSS custom properties. Moving one restyles the frame live; Apply patches the last winning declaration in the design's own `:root` or appends a `:root` block (`source/tweak-patch-plan.ts`). A value set last in `../tokens.css` or `../systems/<id>/**` (both read-only), inside an at-rule or behind `!important` is refused, and values pass an allowlist, not a denylist.
|
|
298
298
|
- *Move and resize.* The frame's `transform-commit` is a proposal. The parent writes it only with Move on, the chat idle, its own target, the current `ready` gen and `navigator.userActivation.isActive` (`src/web/lib/design/design-transform-proposal.ts`). The server re-checks the gen (409 `stale`) and the tag at the offset (409 `element-moved`), rate-limits (1 per 500 ms, 30 per minute), snapshots `before-edit` and writes only `translate`/`width`/`height` px into that element's `style` attribute.
|
|
299
299
|
- *Undo* reverses the exact spans a canvas write replaced, with 32 characters of context on each side, so later AI edits elsewhere survive. The journal is in memory (50 writes per design, lost on restart); `cannot-undo` points to History (`design-edit-undo-journal.ts`).
|
|
@@ -316,6 +316,22 @@ A **Design tab** puts a design chat beside a live, sandboxed canvas of what the
|
|
|
316
316
|
- *After each turn* (`use-design-auto-check.ts`): when the canvas reloaded during the turn or within 8 s of its end, it is measured once quiet for 700 ms; findings go into the issues badge and, at most twice per user message, back to the agent as a `[Canvas check]` message — sent only into an empty, idle composer, otherwise added as a chip.
|
|
317
317
|
- Real-browser check of the grid rule and the screenshot: `node tests/e2e/design-canvas-check-e2e.mjs` (no PPM server; needs Playwright and Chrome).
|
|
318
318
|
|
|
319
|
+
**Share links** let someone outside PPM look at a fixed version of a design and comment on it, without a PPM account (`src/services/design/share/`; owner REST `/api/project/:name/designs/:slug/shares` in `design-shares.ts` and `GET /api/design-shares/address`; the reviewer surface `/s/<code>` in `src/server/routes/design-share-guest*.ts`; owner UI `src/web/components/design/share/`; reviewer page `src/web/design-share-page/`).
|
|
320
|
+
- *What the owner does.* The toolbar's Share (the More sheet on a phone) opens a dialog: up to 20 labelled links per design, each pinning a version (a snapshot taken now, or one from History) with an expiry of 1, 7 (the default) or 30 days, never, or the end of a chosen day up to a year ahead. A link can be copied again at any time, opened as a reviewer, renamed, given a new expiry, moved to the latest version ("Update to latest" lists the files that changed before Confirm, `design-share-changed-files.ts`), given a new code, revoked (final) or deleted, each of the last two optionally with that link's comments. A change writes only the fields it names, against the row as it is after any snapshot (`applyShareLinkChange`), so a revoke or new code from another tab survives an Update to latest still running, and that re-pin is then refused. Deleting a design deletes its links, so a later design reusing the slug inherits none.
|
|
321
|
+
- *Codes are derived, not stored* (`design-share-code.ts`): base64url HMAC-SHA256 of the link id and a code version, keyed by `design-share.key` in the PPM dir. The `design_share_links` table keeps only the code's SHA-256, so a copied `ppm.db` or backup opens nothing while the owner can still copy the link. Deleting the key retires every code at once (links read "Needs new code"); New code bumps the version.
|
|
322
|
+
- *What a reviewer can load.* `/s/<code>/f/<slug>/…` is read from the pinned snapshot only (`resolveSnapshotScopedPath`), never the live design and never another design. The one exception is an allow-list served live (`preview/design-guest-alias.ts`): `tokens.css`, and for the app the snapshot's `design.json` names, `systems/<id>/tokens.css` and `systems/<id>/kit/**`. It is deliberately not the canvas's `systems/<id>/**` alias, which for the `default` app is `designs/` itself. HTML gets the guest bridge (`bridge/guest-bridge.ts`: picker, pins and navigation guard, nothing that proposes a write) under the design CSP rooted at the link's own file root.
|
|
323
|
+
- *Mount.* `/s` is a Hono sub-app mounted after the access log and ahead of `cors()`, `/api` authentication and the static fallback, so no `/s` response carries `Access-Control-Allow-Origin: *` and range bodies survive. A catch-all answers every other `/s` path with the one invalid page (404, the same body whatever the reason), so none reaches the app shell or its service worker. Every response is `no-store`, `no-referrer` and `noindex`, and the access log cuts the code out of the path.
|
|
324
|
+
- *The reviewer page* is a second Vite build (`vite.share.config.ts`, chained in `build:web`; no PWA plugin, assets under `assets/share-*`), served only from `/s/<code>` under its own CSP (own origin only, no workers, no manifest, no framing); the static route refuses its folder. It shares PPM's origin, so it never reads or sends the PPM token and renders reviewer names and text as text only. Phone: variants in a select, threads and the composer in a bottom sheet; desktop: device frames and a side panel.
|
|
325
|
+
- *Threads are per link.* Reviewers on one link see and reply to each other's threads; links never see each other's, and the owner's own canvas comments are never shown. A reviewer is a name plus a random browser key (`X-PPM-Guest-Key`, kept per link in that origin's storage; the server stores its SHA-256). A reviewer edits and deletes only their own entries, and a root with replies can be edited but no longer deleted; resolving, sending to the AI and re-anchoring are the owner's, who can delete any reviewer entry but not rewrite it. Reviewer quotas are separate from the owner's comment cap, so reviewers cannot fill it. Writes also need `X-PPM-Request: 1` and a JSON body (`crossOriginRefusal`).
|
|
326
|
+
- *Refresh is polling, not SSE*: the Cloudflare tunnel does not pass a client's disconnect through to PPM, so a held connection would leak. The page polls every 10 s while visible, at once after its own write and on becoming visible, backing off to 60 s on failure. An unchanged poll is a 304 from an ETag built from a per-design revision counter, the comment file's `stat` and the pinned snapshot, without reading `comments.json`.
|
|
327
|
+
- *Re-pins and revokes reach an open page.* `/info` and every thread list carry `versionId`, the pinned snapshot. A list naming another one shows "This design was updated" with Reload; a new comment names the version it was made on and is refused (409 `version-changed`) when the link now shows another. Every reviewer write checks the link again once it holds the design lock (`assertGuestLinkOpen`), so one queued behind a snapshot is refused, and notifies nobody, if the link was revoked, expired, re-coded or paused meanwhile.
|
|
328
|
+
- *Sign-in off pauses sharing.* With PPM sign-in off no code opens anything and no link can be created; the dialog says "Turn on PPM sign-in first" with a link to Settings → General and lists the links as "Paused: sign-in is off". They open again once sign-in is back on.
|
|
329
|
+
- *The address* (`design-share-address.ts`) is the named tunnel's stable host when on, else the quick tunnel's, with a warning that it changes; under a supervisor it is read from `status.json` directly, because `tunnelService.getTunnelUrl()` keeps a URL that is gone. With no public address, Copy gives `location.origin`, which opens only where this PPM is reachable.
|
|
330
|
+
- *Rate limits* (`design-share-rate-limit.ts`) are separate budgets, so polls cannot starve asset loads: files 1200 a minute and page/info/comment reads 120 a minute per client; writes 500 ms apart and 20 a minute per reviewer; 30 writes a minute per link, whoever sends them. The client is the peer address, and `CF-Connecting-IP` is believed only from a loopback peer whose `Host` is the tunnel's hostname (`design-share-client-key.ts`). Behind the supervisor every LAN and Tailscale reviewer arrives from loopback and shares one bucket; the budgets are sized for about ten such reviewers. A LAN client can forge both headers and choose its key, which buys nothing against the per-link cap.
|
|
331
|
+
- *Reviewer text and the AI.* A reviewer thread reaches the design chat only through the owner's Send to AI, with tags neutralised, fences neutralised, inside a `text` fence under a reviewer-specific untrusted header (`design-comments-prompt.ts`, `src/shared/untrusted-text.ts`); names and link labels are reduced to one quoted line. Nothing else a reviewer chose is printed: no selector for a reviewer's root, and its tag only when the server matched it in the source; any selector at all must have the exact shape the bridge's `cssPathOf` builds (`CSS_PATH_RE`). Residual risk, accepted: the model still reads the text, and in a design session file reads and writes are approved across the project, so a persuasive comment could talk the agent into copying project files into the design, which a later Update to latest would publish. What limits it is the header, the `.design/` ban in the instructions, the owner reading the whole message and sending it themselves, and the changed-files list before a re-pin. Also accepted: a design's own HTML can override the referrer policy toward the CDNs the design CSP allows and so leak the code; that HTML is the owner's.
|
|
332
|
+
- *Notifications.* A reviewer's new comment or reply (not an edit or delete) raises the `design_review` event, "Reviewer comments" in Settings → Notifications, coalesced per link and sent at most once a minute (`design-share-notifier.ts`); its click opens the design, never a `/s/` tab.
|
|
333
|
+
- e2e: `PPM_PLAYWRIGHT_MODULE=<playwright>/index.mjs node tests/e2e/design-share-e2e.mjs` (owner on a desktop, one reviewer on a phone and one on a desktop, sign-in off, revoke, a server restart); owner-side threads and the fenced prompt: `tests/e2e/design-comment-threads-e2e.mjs`.
|
|
334
|
+
|
|
319
335
|
End to end: `tests/e2e/design-mode-e2e.mjs` (1366 px and 390 px, isolated server, scripted providers; `PPM_DESIGN_E2E_ONLY=variants` runs the named steps only), including declaring an app, the New Design dialog's app picker (no setup step in it any more), a design's own first turn auto-setting its app's system up and building on it in the same turn, its showcase and stale reminder (`fixtures/design-mode-steps-systems.mjs`); Settings → Design itself is `tests/e2e/design-settings-e2e.mjs`.
|
|
320
336
|
|
|
321
337
|
## Terminal Flow
|
|
@@ -585,6 +601,24 @@ titlebar. The macOS skin boxes the title between the traffic lights and the PiP
|
|
|
585
601
|
child (so a long title truncates instead of overlapping either), and puts the PiP button at the
|
|
586
602
|
titlebar's right end; the Windows skin puts it left of minimize.
|
|
587
603
|
|
|
604
|
+
**States and the status-bar dock.** A window is `normal`, `maximized`, `snapped` (full height,
|
|
605
|
+
the right 55% of the layer: the titlebar's snap button, or dragging the window's right edge 40px past
|
|
606
|
+
the layer's, which shows a dashed preview first) or `minimized`. Only a `normal` window is dragged
|
|
607
|
+
or resized by hand; double-clicking the titlebar toggles maximize. Minimizing takes the window off
|
|
608
|
+
screen entirely (`hidden`, never unmounted, so a canvas or terminal keeps its state) and remembers
|
|
609
|
+
what to come back as (`restoreTo`); `focus()` brings a minimized window back, so every opener that
|
|
610
|
+
"focuses the existing window" also restores it. The layer stops above the 26px status bar, which
|
|
611
|
+
holds the window dock (`window-dock.tsx`): one chip per window in open order (`opened`), tinted with
|
|
612
|
+
a long accent bar in front, a short bar behind, dimmed when minimized, with a pulsing dot while an AI
|
|
613
|
+
turn runs in it (`use-window-meta.ts`, which also feeds the titlebar's tile, subtitle and "Working"
|
|
614
|
+
marker). Clicking the chip in front minimizes it, any other comes forward. Squeezed, chips drop
|
|
615
|
+
their titles (the front one last), then fold into `+N` (`planDock`, `window-dock-layout.ts`); `+N`
|
|
616
|
+
or a right-click on the dock opens the list of every window (`window-dock-list.tsx`: search, close,
|
|
617
|
+
Minimize all). Closing goes through `closeWindow` (`close-window.ts`) everywhere; Escape on the
|
|
618
|
+
titlebar skips a window whose closing would close its content (a design), since Escape is also a
|
|
619
|
+
canvas's "deselect". A press anywhere in a window raises it through a native capture listener,
|
|
620
|
+
because a tab-host window's content is the tab pool's React tree, not the frame's.
|
|
621
|
+
|
|
588
622
|
**PiP is a capability of the frame, not of one kind.** `useWindowBodyElement`
|
|
589
623
|
(`use-window-body-element.ts`) creates the single DOM element `FloatingWindow` portals a window's
|
|
590
624
|
content into and publishes it as that window's PiP slot (`window-pip-registry.ts`, keyed by window
|
|
@@ -617,8 +651,11 @@ restored on reload (see Persistence below).
|
|
|
617
651
|
send the next `openTab()` with no explicit panel into a window). `popOutTab`/`redockFromWindow`
|
|
618
652
|
create and destroy the panel and its window together; every close path (titlebar ×, keyboard,
|
|
619
653
|
reconcile) routes through `redockFromWindow`, which re-docks to the origin panel if it is still in
|
|
620
|
-
the grid, else the focused grid panel, else the first grid panel.
|
|
621
|
-
`
|
|
654
|
+
the grid, else the focused grid panel, else the first grid panel. The exception is a window
|
|
655
|
+
opened with `closeTabsOnClose` (a design opened from the sidebar): there `closeWindow` closes its
|
|
656
|
+
tabs, and the last one closing takes the window with it (`syncWindowPanel`). Every tab type pops
|
|
657
|
+
out except those that own a window kind of their own (`NON_POPPABLE_TAB_TYPES`), and a design
|
|
658
|
+
never goes into PiP (`NON_PIP_TAB_TYPES`).
|
|
622
659
|
- **Straight to PiP.** The tab context menu offers a second route (`open-tab-in-pip.ts`): pop out,
|
|
623
660
|
then adopt the new window's body into a PiP window in the same gesture. The window is real — PiP
|
|
624
661
|
can only adopt an element already in the page, and it needs a home to restore into — but it is
|
package/docs/project-roadmap.md
CHANGED
|
@@ -27,6 +27,11 @@ PPM is the **lightest path from phone to code** — a self-hosted, BYOK, multi-d
|
|
|
27
27
|
back into the element's `style` with an exact undo.
|
|
28
28
|
- Exports: ZIP, standalone HTML, PDF via a print view, and PPTX with editable text; "Hand off to
|
|
29
29
|
code" starts an ordinary chat with a build brief.
|
|
30
|
+
- Share a design for review: a link (`/s/<code>`) to a pinned version that outside reviewers
|
|
31
|
+
open without an account, comment on and discuss in threads that reach the owner's canvas,
|
|
32
|
+
with per-link expiry and revoke; reviewer comments notify the owner. See
|
|
33
|
+
`docs/architecture/workspace-and-ui.md` → "Design mode" → "Share links". Verified by
|
|
34
|
+
`tests/e2e/design-share-e2e.mjs` (owner on a desktop, reviewers on a phone and a desktop).
|
|
30
35
|
- See `docs/architecture/workspace-and-ui.md` → "Design mode". Verified by
|
|
31
36
|
`tests/e2e/design-mode-e2e.mjs` at 1366 px and 390 px.
|
|
32
37
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hienlh/ppm",
|
|
3
|
-
"version": "0.23.
|
|
3
|
+
"version": "0.23.15",
|
|
4
4
|
"description": "Personal Project Manager — mobile-first web IDE with AI assistance",
|
|
5
5
|
"author": "hienlh",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"dev:web": "bun run vite --config vite.config.ts",
|
|
19
19
|
"tunnel": "cloudflared tunnel --url http://localhost:5173",
|
|
20
20
|
"dev:tunnel": "concurrently \"bun run dev:server\" \"bun run dev:web\" \"bun run tunnel\"",
|
|
21
|
-
"build:web": "bun run vite build --config vite.config.ts",
|
|
21
|
+
"build:web": "bun run vite build --config vite.config.ts && bun run vite build --config vite.share.config.ts",
|
|
22
22
|
"build": "bun run build:web && bun scripts/copy-monaco.ts && bun scripts/precompress-web.ts && bun build src/index.ts src/services/extension-host-worker.ts src/services/file-index/file-index-worker.ts --compile --outfile dist/ppm",
|
|
23
23
|
"start": "bun run src/index.ts start",
|
|
24
24
|
"typecheck": "bunx tsc --noEmit",
|
|
@@ -72,6 +72,7 @@
|
|
|
72
72
|
"@xterm/addon-fit": "0.12.0-beta.285",
|
|
73
73
|
"@xterm/addon-web-links": "0.13.0-beta.285",
|
|
74
74
|
"@xterm/addon-webgl": "0.20.0-beta.284",
|
|
75
|
+
"@xterm/headless": "6.1.0-beta.285",
|
|
75
76
|
"@xterm/xterm": "6.1.0-beta.285",
|
|
76
77
|
"archiver": "^7.0.1",
|
|
77
78
|
"class-variance-authority": "^0.7.1",
|
|
@@ -103,7 +104,10 @@
|
|
|
103
104
|
"react-resizable-panels": "^4.7.3",
|
|
104
105
|
"rehype-highlight": "^7.0.2",
|
|
105
106
|
"rehype-katex": "^7.0.1",
|
|
107
|
+
"rehype-parse": "^9.0.1",
|
|
106
108
|
"rehype-raw": "^7.0.0",
|
|
109
|
+
"rehype-sanitize": "^6.0.0",
|
|
110
|
+
"rehype-stringify": "^10.0.1",
|
|
107
111
|
"remark-breaks": "^4.0.0",
|
|
108
112
|
"remark-gfm": "^4.0.1",
|
|
109
113
|
"remark-math": "^6.0.0",
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { Command } from "commander";
|
|
2
2
|
import { isReadOnlyQuery } from "../../services/database/readonly-check.ts";
|
|
3
3
|
import { isReadonlyRefusal, readonlyRefusalMessage } from "../../services/database/db-errors.ts";
|
|
4
|
-
import { decryptConfig, type ConnectionRow } from "../../services/db.service.ts";
|
|
4
|
+
import { decryptConfig, getConfigValue, type ConnectionRow } from "../../services/db.service.ts";
|
|
5
5
|
import { savedLoginUser, withLogin } from "../../services/database/connection-config.ts";
|
|
6
6
|
import { serviceConnectionString } from "../../services/database/connection-endpoint.ts";
|
|
7
7
|
import { asksForPassword } from "../../shared/db-connection-config.ts";
|
|
8
8
|
import { DEFAULT_USER } from "../../shared/db-connection-url.ts";
|
|
9
9
|
import { askOnTerminal, canAskOnTerminal } from "../utils/tty-prompt.ts";
|
|
10
10
|
import { inAiChat } from "../../services/ai-chat-env.ts";
|
|
11
|
+
import { DB_EXECUTE_TOOL, DB_QUERY_TOOL } from "../../shared/db-ai-tools.ts";
|
|
12
|
+
import { ppmToolOn, type PpmToolSwitches } from "../../shared/ppm-tools.ts";
|
|
11
13
|
import { defaultSchemaFor } from "../../services/database/grid.service.ts";
|
|
12
14
|
import { DB_TYPES, dialectNameOf, isDbType, type DbType } from "../../shared/db-types.ts";
|
|
13
15
|
import type { DbColumnInfo, DbPagedData, DbQueryResult, DbTableInfo } from "../../types/database.ts";
|
|
@@ -109,6 +111,61 @@ function assertAvailable(conn: ConnectionRow): void {
|
|
|
109
111
|
if (hiddenFromAi(conn)) throw new Error(hiddenFromAiMessage(conn));
|
|
110
112
|
}
|
|
111
113
|
|
|
114
|
+
/**
|
|
115
|
+
* The tool that serves each data command inside an AI chat, where this command does not.
|
|
116
|
+
*
|
|
117
|
+
* A chat reaches a database through the tools and nowhere else. They are the path the user can
|
|
118
|
+
* switch off per tool in Settings → Tools, and the one whose writes wait for an approval card
|
|
119
|
+
* and PPM's password. This command obeys neither, and the PPM skill documents it — so leaving it
|
|
120
|
+
* open to a chat would make both the switch and the approval decorative, one Bash call away.
|
|
121
|
+
*
|
|
122
|
+
* Nothing changes for a person at a terminal: the mark is only on the processes a chat provider
|
|
123
|
+
* starts, and PPM's own terminal takes it back out.
|
|
124
|
+
*/
|
|
125
|
+
const AI_CHAT_TOOL_FOR = {
|
|
126
|
+
tables: DB_QUERY_TOOL,
|
|
127
|
+
schema: DB_QUERY_TOOL,
|
|
128
|
+
data: DB_QUERY_TOOL,
|
|
129
|
+
query: DB_QUERY_TOOL,
|
|
130
|
+
run: DB_EXECUTE_TOOL,
|
|
131
|
+
} as const;
|
|
132
|
+
|
|
133
|
+
/** The data commands, so a typo in a call site is a compile error rather than a command left open. */
|
|
134
|
+
type DataCommand = keyof typeof AI_CHAT_TOOL_FOR;
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* The AI settings as the server saved them. Read from the row rather than through
|
|
138
|
+
* `configService`, which answers with blank defaults until `load()` has run — and no `ppm db`
|
|
139
|
+
* command loads the config, so asking it would report every tool on whatever the user chose.
|
|
140
|
+
*/
|
|
141
|
+
function savedAiSettings(): { tab_tools?: boolean; ppm_tools?: PpmToolSwitches } {
|
|
142
|
+
try {
|
|
143
|
+
const raw = getConfigValue("ai");
|
|
144
|
+
const parsed: unknown = raw ? JSON.parse(raw) : null;
|
|
145
|
+
return parsed && typeof parsed === "object" ? (parsed as { ppm_tools?: PpmToolSwitches }) : {};
|
|
146
|
+
} catch {
|
|
147
|
+
return {}; // Unreadable settings: name the tool rather than claim the user turned it off.
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/** Why `ppm db <command>` will not run here, or null when it may. */
|
|
152
|
+
function handedToToolInAiChat(command: DataCommand): string | null {
|
|
153
|
+
if (!inAiChat()) return null;
|
|
154
|
+
const tool = AI_CHAT_TOOL_FOR[command];
|
|
155
|
+
// A tool the user switched off means the database is closed to this chat, not that it should
|
|
156
|
+
// fall back here — that is what switching it off asks for.
|
|
157
|
+
return ppmToolOn(savedAiSettings(), tool)
|
|
158
|
+
? `ppm db ${command} does not run inside an AI chat: use the ${tool} tool, which the user can see and switch off.`
|
|
159
|
+
: `ppm db ${command} does not run inside an AI chat, and the user has turned ${tool} off in Settings → Tools, `
|
|
160
|
+
+ "so this chat cannot reach the database. Ask the user to run it themselves, or to turn that tool back on.";
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/** Stop a data command that an AI chat must take to a tool instead. */
|
|
164
|
+
function assertNotHandedToTool(command: DataCommand): void {
|
|
165
|
+
const message = handedToToolInAiChat(command);
|
|
166
|
+
if (message) throw new Error(message);
|
|
167
|
+
}
|
|
168
|
+
|
|
112
169
|
/** Mask password in postgres connection string: postgresql://user:pass@host → postgresql://user:***@host */
|
|
113
170
|
function maskPassword(connectionString: string): string {
|
|
114
171
|
return connectionString.replace(/(:\/\/[^:]+:)[^@]+(@)/, "$1***$2");
|
|
@@ -344,6 +401,7 @@ export function registerDbCommands(program: Command): void {
|
|
|
344
401
|
process.exit(1);
|
|
345
402
|
}
|
|
346
403
|
assertAvailable(conn);
|
|
404
|
+
assertNotHandedToTool("tables");
|
|
347
405
|
const cfg = parseConfig(conn);
|
|
348
406
|
|
|
349
407
|
if (conn.type !== "sqlite") {
|
|
@@ -395,6 +453,7 @@ export function registerDbCommands(program: Command): void {
|
|
|
395
453
|
process.exit(1);
|
|
396
454
|
}
|
|
397
455
|
assertAvailable(conn);
|
|
456
|
+
assertNotHandedToTool("schema");
|
|
398
457
|
const cfg = parseConfig(conn);
|
|
399
458
|
|
|
400
459
|
if (conn.type !== "sqlite") {
|
|
@@ -441,6 +500,7 @@ export function registerDbCommands(program: Command): void {
|
|
|
441
500
|
process.exit(1);
|
|
442
501
|
}
|
|
443
502
|
assertAvailable(conn);
|
|
503
|
+
assertNotHandedToTool("data");
|
|
444
504
|
const cfg = parseConfig(conn);
|
|
445
505
|
const page = parseInt(options.page, 10);
|
|
446
506
|
const limit = parseInt(options.limit, 10);
|
|
@@ -502,6 +562,15 @@ export function registerDbCommands(program: Command): void {
|
|
|
502
562
|
process.exit(1);
|
|
503
563
|
}
|
|
504
564
|
|
|
565
|
+
// After the line above, so a connection this chat may not use is told that, which is the
|
|
566
|
+
// more specific answer; this one is for the connections it may.
|
|
567
|
+
const handover = handedToToolInAiChat("query");
|
|
568
|
+
if (handover) {
|
|
569
|
+
logCliQuery({ ...audit, status: "blocked", error: handover, durationMs: Date.now() - startedAt });
|
|
570
|
+
console.error(`${C.red}Error:${C.reset} ${handover}`);
|
|
571
|
+
process.exit(1);
|
|
572
|
+
}
|
|
573
|
+
|
|
505
574
|
// Enforce readonly — CLI cannot disable this, only the web UI can toggle it
|
|
506
575
|
if (conn.readonly && !isReadOnlyQuery(sql, dialectNameOf(conn.type))) {
|
|
507
576
|
const message = `Connection "${conn.name}" is readonly — only SELECT queries allowed.`;
|
|
@@ -674,6 +743,15 @@ export function registerDbCommands(program: Command): void {
|
|
|
674
743
|
process.exit(1);
|
|
675
744
|
}
|
|
676
745
|
|
|
746
|
+
// After the line above, so a connection this chat may not use is told that, which is the
|
|
747
|
+
// more specific answer; this one is for the connections it may.
|
|
748
|
+
const handover = handedToToolInAiChat("run");
|
|
749
|
+
if (handover) {
|
|
750
|
+
logCliQuery({ ...audit, status: "blocked", error: handover, durationMs: Date.now() - startedAt });
|
|
751
|
+
console.error(`${C.red}Error:${C.reset} ${handover}`);
|
|
752
|
+
process.exit(1);
|
|
753
|
+
}
|
|
754
|
+
|
|
677
755
|
// Enforce readonly
|
|
678
756
|
if (conn.readonly && !isReadOnlyQuery(sql, dialectNameOf(conn.type))) {
|
|
679
757
|
const message = `Connection "${conn.name}" is readonly — file contains write statements.`;
|
|
@@ -11,8 +11,10 @@ import {
|
|
|
11
11
|
CLAUDE_DESIGN_MCP_SERVER, DESIGN_CHECK_TOOL_TIMEOUT_MS, type DesignMcpAccess,
|
|
12
12
|
} from "../services/design/mcp/design-mcp-tool.ts";
|
|
13
13
|
import {
|
|
14
|
-
|
|
14
|
+
CLAUDE_TAB_TOOLS_MCP_SERVER, TAB_TOOLS_TIMEOUT_MS, type TabToolsMcpAccess,
|
|
15
15
|
} from "../services/tab-tools-mcp/tab-tools-mcp-tool.ts";
|
|
16
|
+
import { TAB_TOOLS } from "../shared/ppm-tools.ts";
|
|
17
|
+
import { CLAUDE_DB_TOOLS_MCP_SERVER, DB_TOOLS, DB_TOOLS_TIMEOUT_MS, type DbToolsMcpAccess } from "../services/db-ai-tools/db-ai-tools-tool.ts";
|
|
16
18
|
|
|
17
19
|
export const VALID_EFFORT_VALUES = ["low", "medium", "high", "xhigh", "max"] as const;
|
|
18
20
|
export type EffortValue = (typeof VALID_EFFORT_VALUES)[number];
|
|
@@ -249,8 +251,9 @@ export function designMcpServers(access: DesignMcpAccess | undefined): Record<st
|
|
|
249
251
|
}
|
|
250
252
|
|
|
251
253
|
/**
|
|
252
|
-
* The tab-tools MCP server (`open_file`, `open_preview`
|
|
253
|
-
* while the user has
|
|
254
|
+
* The tab-tools MCP server (`open_file`, `open_preview`, `open_url`, `read_terminal`,
|
|
255
|
+
* `run_in_terminal`) as the SDK's `http` server config, while the user has any of them on; `{}`
|
|
256
|
+
* otherwise. The token travels in the header.
|
|
254
257
|
*/
|
|
255
258
|
export function tabToolsMcpServers(access: TabToolsMcpAccess | null | undefined): Record<string, McpHttpServerConfig> {
|
|
256
259
|
if (!access) return {};
|
|
@@ -264,20 +267,49 @@ export function tabToolsMcpServers(access: TabToolsMcpAccess | null | undefined)
|
|
|
264
267
|
};
|
|
265
268
|
}
|
|
266
269
|
|
|
267
|
-
/**
|
|
268
|
-
|
|
270
|
+
/**
|
|
271
|
+
* Never asked about before they run: they open a tab for the user to look at, read the
|
|
272
|
+
* project's terminals, or type a command that runs only when the user presses Enter.
|
|
273
|
+
*/
|
|
274
|
+
export const CLAUDE_TAB_TOOLS: readonly string[] = TAB_TOOLS.map((tool) => `mcp__${CLAUDE_TAB_TOOLS_MCP_SERVER}__${tool}`);
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* The database tools' MCP server (`db_query`, `open_query`, `db_execute`) as the SDK's `http`
|
|
278
|
+
* server config, while a saved connection is available to the AI chat; `{}` otherwise. The
|
|
279
|
+
* timeout outlasts the user's time to approve a change and the change's own run.
|
|
280
|
+
*/
|
|
281
|
+
export function dbToolsMcpServers(access: DbToolsMcpAccess | null | undefined): Record<string, McpHttpServerConfig> {
|
|
282
|
+
if (!access) return {};
|
|
283
|
+
return {
|
|
284
|
+
[CLAUDE_DB_TOOLS_MCP_SERVER]: {
|
|
285
|
+
type: "http",
|
|
286
|
+
url: access.url,
|
|
287
|
+
headers: { Authorization: `Bearer ${access.token}` },
|
|
288
|
+
timeout: DB_TOOLS_TIMEOUT_MS,
|
|
289
|
+
},
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Never asked about before they run: `db_query` only reads, `open_query` opens a tab, and
|
|
295
|
+
* `db_execute` asks the user itself — with the SQL and PPM's password, which a generic Allow
|
|
296
|
+
* prompt in front of it would only repeat without either.
|
|
297
|
+
*/
|
|
298
|
+
export const CLAUDE_DB_TOOLS: readonly string[] = DB_TOOLS.map((tool) => `mcp__${CLAUDE_DB_TOOLS_MCP_SERVER}__${tool}`);
|
|
269
299
|
|
|
270
300
|
/**
|
|
271
|
-
* Spawn options as `spawnFingerprint` should compare them: the tab
|
|
272
|
-
* warm spare is started before its session exists, and its token is minted for the session
|
|
301
|
+
* Spawn options as `spawnFingerprint` should compare them: the tab and database tools' tokens
|
|
302
|
+
* blanked. A warm spare is started before its session exists, and its token is minted for the session
|
|
273
303
|
* id it is given then — the one the session's own turns mint — so the token says nothing
|
|
274
304
|
* the session id (which the fingerprint already leaves out) does not.
|
|
275
305
|
*/
|
|
276
306
|
export function withSessionTokenMasked<T extends Record<string, unknown>>(options: T): T {
|
|
277
307
|
const servers = options.mcpServers as Record<string, McpHttpServerConfig> | undefined;
|
|
278
|
-
const
|
|
279
|
-
if (!servers ||
|
|
280
|
-
|
|
308
|
+
const names = [CLAUDE_TAB_TOOLS_MCP_SERVER, CLAUDE_DB_TOOLS_MCP_SERVER].filter((name) => servers?.[name]);
|
|
309
|
+
if (!servers || names.length === 0) return options;
|
|
310
|
+
const masked = { ...servers };
|
|
311
|
+
for (const name of names) masked[name] = { ...masked[name]!, headers: { Authorization: "<session>" } };
|
|
312
|
+
return { ...options, mcpServers: masked };
|
|
281
313
|
}
|
|
282
314
|
|
|
283
315
|
/** Resolve per-call overrides against provider config. Per-call wins, else config, else omit. */
|
|
@@ -7,9 +7,14 @@ import {
|
|
|
7
7
|
getSessionInfo as sdkGetSessionInfo,
|
|
8
8
|
getSessionMessages,
|
|
9
9
|
} from "@anthropic-ai/claude-agent-sdk";
|
|
10
|
-
import { allowedToolsFor, buildModelQueryOptions, buildSystemPromptOption, buildToolHooks, CLAUDE_TAB_TOOLS, designMcpServers, fileWriteTarget, preToolUseDecision, READ_ONLY_TOOLS, shellHookCall, tabToolsMcpServers, withSessionTokenMasked } from "./claude-agent-sdk-query-options.ts";
|
|
10
|
+
import { allowedToolsFor, buildModelQueryOptions, buildSystemPromptOption, buildToolHooks, CLAUDE_DB_TOOLS, CLAUDE_TAB_TOOLS, dbToolsMcpServers, designMcpServers, fileWriteTarget, preToolUseDecision, READ_ONLY_TOOLS, shellHookCall, tabToolsMcpServers, withSessionTokenMasked } from "./claude-agent-sdk-query-options.ts";
|
|
11
11
|
import { localServerBaseUrl } from "../services/server-listen-address.ts";
|
|
12
12
|
import { TAB_TOOLS_MCP_PATH, tabToolsMcpAccessFor } from "../services/tab-tools-mcp/tab-tools-mcp-tokens.ts";
|
|
13
|
+
import { DB_TOOLS_MCP_PATH, dbToolsMcpAccessFor } from "../services/db-ai-tools/db-ai-tools-tokens.ts";
|
|
14
|
+
import { aiConnections } from "../services/db-ai-tools/db-ai-connections.ts";
|
|
15
|
+
import { DB_TOOLS } from "../shared/db-ai-tools.ts";
|
|
16
|
+
import { OPEN_PREVIEW_TOOL } from "../shared/tab-open-protocol.ts";
|
|
17
|
+
import { anyPpmToolOn, ppmToolOn, TAB_TOOLS } from "../shared/ppm-tools.ts";
|
|
13
18
|
import { captureBaseline } from "../services/session-file-baselines/session-file-baselines.service.ts";
|
|
14
19
|
import { observeFile } from "../services/session-file-baselines/session-file-history.ts";
|
|
15
20
|
import { beginShellCommand, endShellCommand, noteFileToolWrite } from "../services/session-file-baselines/shell-change-tracker.ts";
|
|
@@ -488,9 +493,9 @@ export class ClaudeAgentSdkProvider implements AIProvider {
|
|
|
488
493
|
? { CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS: "1", CLAUDE_CODE_ENABLE_TASKS: "1" }
|
|
489
494
|
: {};
|
|
490
495
|
|
|
491
|
-
// PPM's
|
|
496
|
+
// PPM's `open_preview` replaces the claude.ai Artifact tools (`Artifact`, `ArtifactComments`,
|
|
492
497
|
// `ArtifactData`), whose pages live on claude.ai rather than in PPM.
|
|
493
|
-
const artifactEnv = configService.get("ai")
|
|
498
|
+
const artifactEnv = ppmToolOn(configService.get("ai"), OPEN_PREVIEW_TOOL) ? { CLAUDE_CODE_DISABLE_ARTIFACT: "1" } : {};
|
|
494
499
|
|
|
495
500
|
return {
|
|
496
501
|
...base,
|
|
@@ -1011,14 +1016,18 @@ export class ClaudeAgentSdkProvider implements AIProvider {
|
|
|
1011
1016
|
|
|
1012
1017
|
// The chat's turns will carry the tab tools too (`chatService.prepareSendOptions`); their
|
|
1013
1018
|
// token is minted below, once the spare has the session id it will be taken over with.
|
|
1014
|
-
const
|
|
1019
|
+
const ai = configService.get("ai");
|
|
1020
|
+
const base = anyPpmToolOn(ai, TAB_TOOLS) ? localServerBaseUrl() : null;
|
|
1015
1021
|
const tabTools = base ? { url: `${base}${TAB_TOOLS_MCP_PATH}`, token: "" } : null;
|
|
1022
|
+
// Likewise the database tools, while a saved connection is available to the AI chat.
|
|
1023
|
+
const dbBase = anyPpmToolOn(ai, DB_TOOLS) && aiConnections().length > 0 ? localServerBaseUrl() : null;
|
|
1024
|
+
const dbTools = dbBase ? { url: `${dbBase}${DB_TOOLS_MCP_PATH}`, token: "" } : null;
|
|
1016
1025
|
const options = this.buildQueryOptions({
|
|
1017
1026
|
cwd: projectPath,
|
|
1018
1027
|
systemPrompt: buildSystemPromptOption(providerConfig.system_prompt),
|
|
1019
1028
|
env: this.buildQueryEnv(projectPath, account),
|
|
1020
1029
|
allowedTools: allowedToolsFor({ isBypass, agentTeams: providerConfig.agent_teams }),
|
|
1021
|
-
mcpServers: { ...this.resolveMcpServers(projectPath), ...tabToolsMcpServers(tabTools) },
|
|
1030
|
+
mcpServers: { ...this.resolveMcpServers(projectPath), ...tabToolsMcpServers(tabTools), ...dbToolsMcpServers(dbTools) },
|
|
1022
1031
|
permissionMode,
|
|
1023
1032
|
opts,
|
|
1024
1033
|
providerConfig,
|
|
@@ -1027,11 +1036,12 @@ export class ClaudeAgentSdkProvider implements AIProvider {
|
|
|
1027
1036
|
this.warmSpares.offer(projectPath, spawnFingerprint(withSessionTokenMasked(options)), (sessionId, callbacks) => {
|
|
1028
1037
|
const { generator, controller } = createMessageChannel();
|
|
1029
1038
|
const access = tabTools ? tabToolsMcpAccessFor(sessionId) : null;
|
|
1039
|
+
const dbAccess = dbTools ? dbToolsMcpAccessFor(sessionId) : null;
|
|
1030
1040
|
const q = query({
|
|
1031
1041
|
prompt: generator,
|
|
1032
1042
|
options: {
|
|
1033
1043
|
...options,
|
|
1034
|
-
...(access && { mcpServers: { ...options.mcpServers, ...tabToolsMcpServers(access) } }),
|
|
1044
|
+
...((access || dbAccess) && { mcpServers: { ...options.mcpServers, ...tabToolsMcpServers(access), ...dbToolsMcpServers(dbAccess) } }),
|
|
1035
1045
|
sessionId,
|
|
1036
1046
|
stderr: callbacks.stderr,
|
|
1037
1047
|
hooks: buildToolHooks({ isBypass, preToolUse: callbacks.preToolUse, fileWrite: callbacks.fileWrite, shellCommand: callbacks.shellCommand }),
|
|
@@ -1135,6 +1145,7 @@ export class ClaudeAgentSdkProvider implements AIProvider {
|
|
|
1135
1145
|
// `design_check` only reads the canvas, so a design session never asks before it runs.
|
|
1136
1146
|
const designCheckTool = opts?.designSession && opts.designMcp ? CLAUDE_DESIGN_CHECK_TOOL : null;
|
|
1137
1147
|
const tabToolsMcp = opts?.designSession ? undefined : opts?.tabToolsMcp;
|
|
1148
|
+
const dbToolsMcp = opts?.designSession ? undefined : opts?.dbToolsMcp;
|
|
1138
1149
|
const allowedTools = allowedToolsFor({ isBypass, agentTeams: providerConfig.agent_teams, designPolicy, designCheckTool });
|
|
1139
1150
|
|
|
1140
1151
|
/**
|
|
@@ -1201,6 +1212,7 @@ export class ClaudeAgentSdkProvider implements AIProvider {
|
|
|
1201
1212
|
|
|
1202
1213
|
if (designCheckTool && toolName === designCheckTool) return preToolUseDecision("allow");
|
|
1203
1214
|
if (tabToolsMcp && CLAUDE_TAB_TOOLS.includes(toolName)) return preToolUseDecision("allow");
|
|
1215
|
+
if (dbToolsMcp && CLAUDE_DB_TOOLS.includes(toolName)) return preToolUseDecision("allow");
|
|
1204
1216
|
|
|
1205
1217
|
// Design policy: project-scoped file tools pass, everything else falls through to
|
|
1206
1218
|
// the approval prompt below. The decision is explicit so the SDK's own acceptEdits
|
|
@@ -1390,6 +1402,7 @@ export class ClaudeAgentSdkProvider implements AIProvider {
|
|
|
1390
1402
|
...this.resolveMcpServers(effectiveCwd),
|
|
1391
1403
|
...designMcpServers(opts?.designSession ? opts.designMcp : undefined),
|
|
1392
1404
|
...tabToolsMcpServers(tabToolsMcp),
|
|
1405
|
+
...dbToolsMcpServers(dbToolsMcp),
|
|
1393
1406
|
};
|
|
1394
1407
|
|
|
1395
1408
|
// Buffer subprocess stderr for crash diagnostics + log in real-time
|
|
@@ -38,9 +38,10 @@ import { homedir } from "node:os";
|
|
|
38
38
|
import { basename, join } from "node:path";
|
|
39
39
|
import { CodexJsonRpcClient, CONTROL_REQUEST_TIMEOUT_MS, codexCommand } from "./codex-jsonrpc-client.ts";
|
|
40
40
|
import { permissionModeToCodex, type CodexPermission } from "./codex-permission-map.ts";
|
|
41
|
-
import { buildThreadParams, designMcpEnv, requestWithInstructionsFallback, tabToolsMcpEnv, type CodexThreadParams } from "./codex-thread-params.ts";
|
|
41
|
+
import { buildThreadParams, dbToolsMcpEnv, designMcpEnv, requestWithInstructionsFallback, tabToolsMcpEnv, type CodexThreadParams } from "./codex-thread-params.ts";
|
|
42
42
|
import type { DesignMcpAccess } from "../../services/design/mcp/design-mcp-tool.ts";
|
|
43
43
|
import type { TabToolsMcpAccess } from "../../services/tab-tools-mcp/tab-tools-mcp-tool.ts";
|
|
44
|
+
import type { DbToolsMcpAccess } from "../../services/db-ai-tools/db-ai-tools-tool.ts";
|
|
44
45
|
import { mapCodexEvent, parseTokenUsage } from "./codex-event-mapper.ts";
|
|
45
46
|
import { recordFileChangeBaselines } from "./codex-file-baselines.ts";
|
|
46
47
|
import { subagentCardId } from "./codex-subagent-thread.ts";
|
|
@@ -162,6 +163,8 @@ interface LiveSession {
|
|
|
162
163
|
designMcp?: DesignMcpAccess;
|
|
163
164
|
/** The tab tools' endpoint, when the user has them on; kept for the same reason. */
|
|
164
165
|
tabToolsMcp?: TabToolsMcpAccess;
|
|
166
|
+
/** The database tools' endpoint, while a connection is available to the AI chat; likewise. */
|
|
167
|
+
dbToolsMcp?: DbToolsMcpAccess;
|
|
165
168
|
pendingApprovals: Map<string, PendingApproval>;
|
|
166
169
|
answeredCodexIds: Set<number | string>;
|
|
167
170
|
/** Rollout history snapshot at connect — lets live message ids continue the
|
|
@@ -858,7 +861,7 @@ export class CodexAppServerProvider implements AIProvider {
|
|
|
858
861
|
client.onNotification((n) => this.handleNotification(live, n));
|
|
859
862
|
client.onServerRequest((r) => this.handleServerRequest(live, r));
|
|
860
863
|
client.onClose(() => this.handleClose(live));
|
|
861
|
-
client.start({ cwd: live.cwd, codexHome: account.home, env: { ...designMcpEnv(live.designMcp), ...tabToolsMcpEnv(live.tabToolsMcp) }, purpose: "chat" });
|
|
864
|
+
client.start({ cwd: live.cwd, codexHome: account.home, env: { ...designMcpEnv(live.designMcp), ...tabToolsMcpEnv(live.tabToolsMcp), ...dbToolsMcpEnv(live.dbToolsMcp) }, purpose: "chat" });
|
|
862
865
|
live.client = client;
|
|
863
866
|
|
|
864
867
|
await client.request("initialize", { clientInfo: CLIENT_INFO, capabilities: CAPABILITIES }, CONTROL_REQUEST_TIMEOUT_MS);
|
|
@@ -872,6 +875,7 @@ export class CodexAppServerProvider implements AIProvider {
|
|
|
872
875
|
developerInstructions: live.developerInstructions,
|
|
873
876
|
designMcp: live.designMcp,
|
|
874
877
|
tabToolsMcp: live.tabToolsMcp,
|
|
878
|
+
dbToolsMcp: live.dbToolsMcp,
|
|
875
879
|
});
|
|
876
880
|
await requestWithInstructionsFallback(resumeBase,
|
|
877
881
|
(params) => this.resumeThread(client, threadId, found, account.home, params));
|
|
@@ -938,6 +942,7 @@ export class CodexAppServerProvider implements AIProvider {
|
|
|
938
942
|
developerInstructions: opts?.designInstructions,
|
|
939
943
|
designMcp: opts?.designSession ? opts.designMcp : undefined,
|
|
940
944
|
tabToolsMcp: opts?.designSession ? undefined : opts?.tabToolsMcp,
|
|
945
|
+
dbToolsMcp: opts?.designSession ? undefined : opts?.dbToolsMcp,
|
|
941
946
|
pendingApprovals: new Map(), answeredCodexIds: new Set(),
|
|
942
947
|
history: [], transcript: [], currentAssistant: "", currentEvents: [],
|
|
943
948
|
pendingTurns: [], subagentThreadIds: new Set(),
|
|
@@ -952,7 +957,7 @@ export class CodexAppServerProvider implements AIProvider {
|
|
|
952
957
|
client.onNotification((n) => this.handleNotification(live, n));
|
|
953
958
|
client.onServerRequest((r) => this.handleServerRequest(live, r));
|
|
954
959
|
client.onClose(() => this.handleClose(live));
|
|
955
|
-
client.start({ cwd, codexHome: account?.home, env: { ...designMcpEnv(live.designMcp), ...tabToolsMcpEnv(live.tabToolsMcp) }, purpose: "chat" });
|
|
960
|
+
client.start({ cwd, codexHome: account?.home, env: { ...designMcpEnv(live.designMcp), ...tabToolsMcpEnv(live.tabToolsMcp), ...dbToolsMcpEnv(live.dbToolsMcp) }, purpose: "chat" });
|
|
956
961
|
|
|
957
962
|
await client.request("initialize", { clientInfo: CLIENT_INFO, capabilities: CAPABILITIES }, CONTROL_REQUEST_TIMEOUT_MS);
|
|
958
963
|
client.notify("initialized");
|
|
@@ -963,6 +968,7 @@ export class CodexAppServerProvider implements AIProvider {
|
|
|
963
968
|
developerInstructions: live.developerInstructions,
|
|
964
969
|
designMcp: live.designMcp,
|
|
965
970
|
tabToolsMcp: live.tabToolsMcp,
|
|
971
|
+
dbToolsMcp: live.dbToolsMcp,
|
|
966
972
|
});
|
|
967
973
|
// Only treat as a resume when a rollout for this id is attributable to THIS
|
|
968
974
|
// project (fail-closed cwd guard) — never resume another project's thread.
|
|
@@ -5,9 +5,12 @@ import {
|
|
|
5
5
|
type DesignMcpAccess,
|
|
6
6
|
} from "../../services/design/mcp/design-mcp-tool.ts";
|
|
7
7
|
import {
|
|
8
|
-
CODEX_TAB_TOOLS_MCP_SERVER, CODEX_TAB_TOOLS_MCP_TOKEN_ENV,
|
|
9
|
-
type TabToolsMcpAccess,
|
|
8
|
+
CODEX_TAB_TOOLS_MCP_SERVER, CODEX_TAB_TOOLS_MCP_TOKEN_ENV, TAB_TOOLS_TIMEOUT_MS, type TabToolsMcpAccess,
|
|
10
9
|
} from "../../services/tab-tools-mcp/tab-tools-mcp-tool.ts";
|
|
10
|
+
import { TAB_TOOLS } from "../../shared/ppm-tools.ts";
|
|
11
|
+
import {
|
|
12
|
+
CODEX_DB_TOOLS_MCP_SERVER, CODEX_DB_TOOLS_MCP_TOKEN_ENV, DB_TOOLS, DB_TOOLS_TIMEOUT_MS, type DbToolsMcpAccess,
|
|
13
|
+
} from "../../services/db-ai-tools/db-ai-tools-tool.ts";
|
|
11
14
|
|
|
12
15
|
/** Config overrides, keyed like `-c key=value` on codex's command line (dotted paths). */
|
|
13
16
|
export type CodexConfigOverrides = Record<string, unknown>;
|
|
@@ -26,6 +29,8 @@ export interface ThreadParamsInput {
|
|
|
26
29
|
designMcp?: DesignMcpAccess;
|
|
27
30
|
/** The tab tools (`open_file`, `open_preview`) while the user has them on; likewise. */
|
|
28
31
|
tabToolsMcp?: TabToolsMcpAccess;
|
|
32
|
+
/** The database tools (`db_query`, `open_query`, `db_execute`); likewise. */
|
|
33
|
+
dbToolsMcp?: DbToolsMcpAccess;
|
|
29
34
|
}
|
|
30
35
|
|
|
31
36
|
/**
|
|
@@ -57,7 +62,8 @@ export function designMcpEnv(access: DesignMcpAccess | undefined): Record<string
|
|
|
57
62
|
|
|
58
63
|
/**
|
|
59
64
|
* The tab-tools MCP server, shaped and approved exactly like {@link designMcpConfig}: the
|
|
60
|
-
* tools
|
|
65
|
+
* tools open a tab for the user to look at, read the project's terminals, or type a command
|
|
66
|
+
* that runs only when the user presses Enter.
|
|
61
67
|
*/
|
|
62
68
|
export function tabToolsMcpConfig(access: TabToolsMcpAccess | undefined): CodexConfigOverrides {
|
|
63
69
|
if (!access) return {};
|
|
@@ -65,7 +71,7 @@ export function tabToolsMcpConfig(access: TabToolsMcpAccess | undefined): CodexC
|
|
|
65
71
|
[`mcp_servers.${CODEX_TAB_TOOLS_MCP_SERVER}`]: {
|
|
66
72
|
url: access.url,
|
|
67
73
|
bearer_token_env_var: CODEX_TAB_TOOLS_MCP_TOKEN_ENV,
|
|
68
|
-
enabled_tools: [
|
|
74
|
+
enabled_tools: [...TAB_TOOLS],
|
|
69
75
|
default_tools_approval_mode: "approve",
|
|
70
76
|
startup_timeout_sec: 10,
|
|
71
77
|
tool_timeout_sec: Math.ceil(TAB_TOOLS_TIMEOUT_MS / 1000),
|
|
@@ -78,6 +84,29 @@ export function tabToolsMcpEnv(access: TabToolsMcpAccess | undefined): Record<st
|
|
|
78
84
|
return access ? { [CODEX_TAB_TOOLS_MCP_TOKEN_ENV]: access.token } : {};
|
|
79
85
|
}
|
|
80
86
|
|
|
87
|
+
/**
|
|
88
|
+
* The database tools' MCP server, shaped like {@link tabToolsMcpConfig} and approved up front
|
|
89
|
+
* too: `db_execute` asks the user itself, in PPM's chat, with the SQL and PPM's password.
|
|
90
|
+
*/
|
|
91
|
+
export function dbToolsMcpConfig(access: DbToolsMcpAccess | undefined): CodexConfigOverrides {
|
|
92
|
+
if (!access) return {};
|
|
93
|
+
return {
|
|
94
|
+
[`mcp_servers.${CODEX_DB_TOOLS_MCP_SERVER}`]: {
|
|
95
|
+
url: access.url,
|
|
96
|
+
bearer_token_env_var: CODEX_DB_TOOLS_MCP_TOKEN_ENV,
|
|
97
|
+
enabled_tools: [...DB_TOOLS],
|
|
98
|
+
default_tools_approval_mode: "approve",
|
|
99
|
+
startup_timeout_sec: 10,
|
|
100
|
+
tool_timeout_sec: Math.ceil(DB_TOOLS_TIMEOUT_MS / 1000),
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** The environment the app-server needs for {@link dbToolsMcpConfig}; `{}` without the tools. */
|
|
106
|
+
export function dbToolsMcpEnv(access: DbToolsMcpAccess | undefined): Record<string, string> {
|
|
107
|
+
return access ? { [CODEX_DB_TOOLS_MCP_TOKEN_ENV]: access.token } : {};
|
|
108
|
+
}
|
|
109
|
+
|
|
81
110
|
/**
|
|
82
111
|
* One builder for the params of every thread/start and thread/resume — the first connect
|
|
83
112
|
* and the account-switch respawn used to assemble them separately, which is how a field
|
|
@@ -90,6 +119,7 @@ export function buildThreadParams(input: ThreadParamsInput): CodexThreadParams {
|
|
|
90
119
|
...(input.configOverrides?.config ?? {}),
|
|
91
120
|
...designMcpConfig(input.designMcp),
|
|
92
121
|
...tabToolsMcpConfig(input.tabToolsMcp),
|
|
122
|
+
...dbToolsMcpConfig(input.dbToolsMcp),
|
|
93
123
|
};
|
|
94
124
|
return {
|
|
95
125
|
...(Object.keys(config).length ? { config } : {}),
|