@jetcrab/pi-desk 1.1.28-dev → 1.1.30-dev
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/docs/plugins.md +2 -2
- package/package.json +1 -1
- package/src/app/api/work-sessions/search/route.ts +1 -0
- package/src/app/project-preview/page.tsx +1 -3
- package/src/client/l1_entry/pages/l1-error-page.tsx +1 -1
- package/src/client/l1_entry/providers/l1-app-providers.tsx +2 -0
- package/src/client/l2_biz/auth/l2-login.module.css +1 -1
- package/src/client/l2_biz/plugin-host/l2-plugin-composer-panel.tsx +1 -1
- package/src/client/l2_biz/plugin-host/l2-plugin-contribution-host.tsx +1 -1
- package/src/client/l2_biz/plugin-host/l2-plugin-session-header-layout.ts +6 -3
- package/src/client/l2_biz/plugin-host/l2-plugin-session-header.tsx +75 -18
- package/src/client/l2_biz/project-preview/hooks/l2-use-project-preview.ts +1 -14
- package/src/client/l2_biz/project-preview/l2-project-preview-dialog.tsx +2 -3
- package/src/client/l2_biz/project-preview/l2-project-preview-page.tsx +1 -2
- package/src/client/l2_biz/project-preview/l2-project-preview.tsx +1 -4
- package/src/client/l2_biz/project-preview/views/l2-project-branch-select.tsx +42 -3
- package/src/client/l2_biz/settings/l2-settings.tsx +1 -1
- package/src/client/l2_biz/settings/l2-skills-settings.tsx +1 -1
- package/src/client/l2_biz/task-center/l2-task-center.tsx +1 -1
- package/src/client/l2_biz/workbench/file-workspace/l2-plugin-standalone-file-preview.tsx +1 -1
- package/src/client/l2_biz/workbench/file-workspace/l2-work-session-file-preview.tsx +1 -1
- package/src/client/l2_biz/workbench/git-workspace/l2-git-workspace-runtime.ts +11 -10
- package/src/client/l2_biz/workbench/hooks/l2-work-session-search.ts +52 -0
- package/src/client/l2_biz/workbench/hooks/l2-workbench-branch-picker.ts +42 -7
- package/src/client/l2_biz/workbench/hooks/l2-workbench-session-history.ts +143 -131
- package/src/client/l2_biz/workbench/hooks/l2-workbench-session-search.ts +97 -0
- package/src/client/l2_biz/workbench/l2-work-session-columns.tsx +8 -0
- package/src/client/l2_biz/workbench/l2-work-session-sidebar.tsx +129 -10
- package/src/client/l2_biz/workbench/l2-workbench-biz.ts +20 -2
- package/src/client/l2_biz/workbench/l2-workbench-branch-filter-preferences.ts +34 -0
- package/src/client/l2_biz/workbench/l2-workbench-branch-picker.tsx +34 -71
- package/src/client/l2_biz/workbench/l2-workbench-chat-input-runtime.ts +38 -1
- package/src/client/l2_biz/workbench/l2-workbench-chat-view.tsx +11 -1
- package/src/client/l2_biz/workbench/l2-workbench-picker-dialog.tsx +55 -215
- package/src/client/l2_biz/workbench/l2-workbench.tsx +21 -39
- package/src/client/l2_biz/workbench/views/l2-workbench-session-search.tsx +123 -0
- package/src/client/l3_modules/conversation/l3-conversation-messages.tsx +43 -4
- package/src/client/l3_modules/project-files/l3-markdown-preview.module.css +1 -1
- package/src/client/l3_modules/project-files/l3-project-document-git.ts +13 -29
- package/src/client/l3_modules/project-files/l3-project-document-view.tsx +1 -4
- package/src/client/l3_modules/project-files/l3-project-file-browser.module.css +14 -18
- package/src/client/l3_modules/project-files/l3-project-file-browser.tsx +52 -95
- package/src/client/l3_modules/project-files/l3-project-file-runtime.ts +52 -21
- package/src/client/l3_modules/project-files/l3-project-file-tabs.tsx +41 -62
- package/src/client/l3_modules/project-files/l3-project-git-runtime.ts +5 -4
- package/src/client/l3_modules/project-files/l3-use-project-refresh.ts +36 -0
- package/src/client/l3_modules/project-files/views/l3-project-search-results.tsx +2 -2
- package/src/client/l3_modules/project-files/views/l3-project-tree-folder.tsx +86 -0
- package/src/client/l4_foundation/desktop-window/l4-desktop-titlebar.tsx +188 -0
- package/src/client/l4_foundation/desktop-window/l4-desktop-window.css +107 -0
- package/src/client/l4_foundation/desktop-window/l4-desktop-window.ts +20 -0
- package/src/client/l4_foundation/ui/file-icons/README.md +1 -1
- package/src/client/l4_foundation/ui/file-icons/l4-file-icon.tsx +49 -2
- package/src/client/l4_foundation/ui/l4-app-dialog.tsx +2 -2
- package/src/common/l2_biz/pi-session/l2-pi-session-contract.ts +11 -24
- package/src/common/l2_biz/project-preview/l2-project-preview-navigation.ts +5 -12
- package/src/common/l2_biz/work-session/l2-work-session-search-contract.ts +26 -0
- package/src/common/l2_biz/work-session/l2-work-session-tree-contract.ts +9 -1
- package/src/common/l2_biz/workbench/l2-workbench-locale-messages.ts +12 -0
- package/src/common/l2_biz/workbench/l2-workbench-picker-messages.ts +6 -2
- package/src/common/l3_modules/conversation/l3-conversation-locale-messages.ts +2 -0
- package/src/common/l3_modules/pi/l3-pi-session-search-contract.ts +26 -0
- package/src/common/l4_foundation/locale/l4-host-error-messages.ts +2 -0
- package/src/server/l1_entry/api/l1-work-session-branch-route.ts +21 -15
- package/src/server/l1_entry/api/l1-work-session-search-route.ts +38 -0
- package/src/server/l2_biz/work-session/l2-work-session-chat-runtime.ts +4 -2
- package/src/server/l2_biz/work-session/l2-work-session-manage.ts +46 -10
- package/src/server/l3_modules/work-session/l3-work-session.ts +11 -6
- package/src/server/l4_foundation/pi/l4-pi-chat-worker.ts +35 -2
- package/src/server/l4_foundation/pi/l4-pi-session-history-catalog.ts +62 -113
- package/src/server/l4_foundation/pi/l4-pi-session-search.ts +166 -0
- package/src/server/l4_foundation/pi/l4-pi-work-session-runtime.ts +66 -5
- package/temp/build/pi-desk/release/.next/BUILD_ID +1 -1
- package/temp/build/pi-desk/release/.next/app-path-routes-manifest.json +1 -0
- package/temp/build/pi-desk/release/.next/build-manifest.json +3 -3
- package/temp/build/pi-desk/release/.next/required-server-files.js +2 -2
- package/temp/build/pi-desk/release/.next/required-server-files.json +2 -2
- package/temp/build/pi-desk/release/.next/routes-manifest.json +6 -0
- package/temp/build/pi-desk/release/.next/server/app/_global-error/page.js +2 -2
- package/temp/build/pi-desk/release/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/_global-error.html +1 -1
- package/temp/build/pi-desk/release/.next/server/app/_global-error.rsc +3 -3
- package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_full.segment.rsc +3 -3
- package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +3 -3
- package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/temp/build/pi-desk/release/.next/server/app/_not-found/page.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/auth/login/route.js +2 -2
- package/temp/build/pi-desk/release/.next/server/app/api/auth/logout/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/auth-settings/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/auth-settings/replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/capability-modes/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/capability-modes/replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/chat/context/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/chat/images/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/chat/messages/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/health/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/mcp-check/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/mcp-settings/del/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/mcp-settings/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/mcp-settings/replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/model-catalog/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/model-settings/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/model-settings/preview/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/model-settings/replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/pi/directories/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/pi/directory-entries/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/pi/directory-ignores/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/pi/directory-ignores/replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/pi/models/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/pi/session-user-messages/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/pi/sessions/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugin-catalog/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugin-catalog/search/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugin-catalog/settings-get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugin-catalog/settings-replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/add/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/apply/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/batch/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/browser-resources/[resourceGroup]/[...resourcePath]/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/del/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/enabled-set/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/host-runtime/[runtimeVersion]/[...resourcePath]/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/reload/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/update/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/project-files/get/route.js +2 -2
- package/temp/build/pi-desk/release/.next/server/app/api/project-files/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/project-files/reveal/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/project-files/search/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/project-git/get/route.js +2 -2
- package/temp/build/pi-desk/release/.next/server/app/api/project-git-branches/list/route.js +2 -2
- package/temp/build/pi-desk/release/.next/server/app/api/project-git-changes/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/project-git-diff/get/route.js +2 -2
- package/temp/build/pi-desk/release/.next/server/app/api/project-git-heads/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/project-git-log/list/route.js +2 -2
- package/temp/build/pi-desk/release/.next/server/app/api/project-model-default/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/project-model-default/replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/skill-files/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/skill-files/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/skill-files/replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/skills/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/task-center/images/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/task-center/messages/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/work-session-git-branch/add/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/work-session-git-branch/replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/work-session-tree/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/work-session-tree-entry/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/work-sessions/add/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/work-sessions/branch/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/work-sessions/del/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/work-sessions/rename/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/work-sessions/replace/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/work-sessions/search/route.js +1 -0
- package/temp/build/pi-desk/release/.next/server/app/api/work-sessions/search/route_client-reference-manifest.js +1 -0
- package/temp/build/pi-desk/release/.next/server/app/api/work-sessions/sort/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/favicon.ico/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/login/page.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/page.js +138 -138
- package/temp/build/pi-desk/release/.next/server/app/page_client-reference-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/project-preview/page.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/project-preview/page_client-reference-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app-paths-manifest.json +1 -0
- package/temp/build/pi-desk/release/.next/server/chunks/23054.js +2 -2
- package/temp/build/pi-desk/release/.next/server/chunks/25406.js +8 -8
- package/temp/build/pi-desk/release/.next/server/chunks/27344.js +3 -3
- package/temp/build/pi-desk/release/.next/server/chunks/3108.js +3 -3
- package/temp/build/pi-desk/release/.next/server/chunks/35985.js +3 -3
- package/temp/build/pi-desk/release/.next/server/chunks/41856.js +1 -0
- package/temp/build/pi-desk/release/.next/server/chunks/62900.js +235 -0
- package/temp/build/pi-desk/release/.next/server/chunks/6917.js +1 -1
- package/temp/build/pi-desk/release/.next/server/chunks/81363.js +1 -1
- package/temp/build/pi-desk/release/.next/server/chunks/81912.js +3 -0
- package/temp/build/pi-desk/release/.next/server/chunks/92386.js +2 -2
- package/temp/build/pi-desk/release/.next/server/middleware-build-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/pages/500.html +1 -1
- package/temp/build/pi-desk/release/.next/static/ErYBfYXAir5b-6rlacGvL/_buildManifest.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/10043-9d6c3735418ccaf9.js +238 -0
- package/temp/build/pi-desk/release/.next/static/chunks/11937-ac71fb0f7cef482a.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/30669-ffa76d39e0e25194.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/36643-f60e98278740073c.js +3 -0
- package/temp/build/pi-desk/release/.next/static/chunks/65232-f5b71cec787a30ec.js +15 -0
- package/temp/build/pi-desk/release/.next/static/chunks/{51474-8dc714cb76b2e60a.js → 65350-23bb961d87addf14.js} +3 -3
- package/temp/build/pi-desk/release/.next/static/chunks/app/_global-error/page-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/_not-found/page-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/auth/login/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/auth/logout/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/auth-settings/get/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/auth-settings/replace/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/capability-modes/get/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/capability-modes/replace/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/chat/context/get/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/chat/images/get/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/chat/messages/get/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/health/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/mcp-check/get/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/mcp-settings/del/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/mcp-settings/get/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/mcp-settings/replace/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/model-catalog/list/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/model-settings/get/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/model-settings/preview/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/model-settings/replace/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/directories/list/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/directory-entries/list/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/directory-ignores/list/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/directory-ignores/replace/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/models/list/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/session-user-messages/list/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/sessions/list/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugin-catalog/get/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugin-catalog/search/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugin-catalog/settings-get/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugin-catalog/settings-replace/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/add/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/apply/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/batch/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/browser-resources/[resourceGroup]/[...resourcePath]/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/del/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/enabled-set/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/get/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/host-runtime/[runtimeVersion]/[...resourcePath]/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/list/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/reload/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/update/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-files/get/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-files/list/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-files/reveal/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-files/search/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git/get/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git-branches/list/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git-changes/list/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git-diff/get/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git-heads/get/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git-log/list/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-model-default/get/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-model-default/replace/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/skill-files/get/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/skill-files/list/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/skill-files/replace/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/skills/list/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/task-center/images/get/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/task-center/messages/get/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-session-git-branch/add/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-session-git-branch/replace/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-session-tree/get/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-session-tree-entry/get/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/add/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/branch/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/del/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/rename/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/replace/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/search/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/sort/route-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/error-1ab62762c5f4144f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/layout-ca5ef5994165eb2e.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/login/{page-0d3d4827802108e5.js → page-0df9df996aa68060.js} +1 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/not-found-b8b9b7ef5ccb7601.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/page-978906de76a8dcfe.js +158 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/project-preview/{page-038b6c14e03ed878.js → page-aaa845016a934245.js} +1 -1
- package/temp/build/pi-desk/release/.next/static/chunks/next/dist/client/components/builtin/app-error-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/next/dist/client/components/builtin/forbidden-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/next/dist/client/components/builtin/unauthorized-295cb63da5f7262f.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/{webpack-c0b805df46fcf8b3.js → webpack-a84310d111797bef.js} +1 -1
- package/temp/build/pi-desk/release/.next/static/css/053a8d82c09326cd.css +1 -0
- package/temp/build/pi-desk/release/.next/static/css/1cc92eec583aa639.css +1 -0
- package/temp/build/pi-desk/release/.next/static/css/{1e780a4936aa6ba3.css → 2bb393927ba8f71d.css} +1 -1
- package/temp/build/pi-desk/release/.next/static/css/3a07dcc86ffdf88c.css +1 -0
- package/temp/build/pi-desk/release/.next/static/css/3c59ac068ae404da.css +1 -0
- package/temp/build/pi-desk/release/.next/trace-build +1 -1
- package/temp/build/pi-desk/release/.next/server/chunks/35348.js +0 -3
- package/temp/build/pi-desk/release/.next/server/chunks/56830.js +0 -235
- package/temp/build/pi-desk/release/.next/server/chunks/80780.js +0 -1
- package/temp/build/pi-desk/release/.next/static/bj2dB_Z10YB_CqK_VNhDx/_buildManifest.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/11937-1d0a9822f2c7995b.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/14197-3d3ddd426ac06c9c.js +0 -3
- package/temp/build/pi-desk/release/.next/static/chunks/37313-d5970e2d0c270d22.js +0 -238
- package/temp/build/pi-desk/release/.next/static/chunks/65232-ef4e5a4174f62faf.js +0 -15
- package/temp/build/pi-desk/release/.next/static/chunks/79267-7d21d7cdbd7cfca1.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/_global-error/page-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/_not-found/page-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/auth/login/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/auth/logout/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/auth-settings/get/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/auth-settings/replace/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/capability-modes/get/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/capability-modes/replace/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/chat/context/get/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/chat/images/get/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/chat/messages/get/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/health/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/mcp-check/get/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/mcp-settings/del/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/mcp-settings/get/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/mcp-settings/replace/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/model-catalog/list/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/model-settings/get/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/model-settings/preview/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/model-settings/replace/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/directories/list/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/directory-entries/list/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/directory-ignores/list/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/directory-ignores/replace/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/models/list/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/session-user-messages/list/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/sessions/list/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugin-catalog/get/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugin-catalog/search/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugin-catalog/settings-get/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugin-catalog/settings-replace/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/add/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/apply/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/batch/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/browser-resources/[resourceGroup]/[...resourcePath]/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/del/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/enabled-set/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/get/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/host-runtime/[runtimeVersion]/[...resourcePath]/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/list/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/reload/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/update/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-files/get/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-files/list/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-files/reveal/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-files/search/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git/get/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git-branches/list/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git-changes/list/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git-diff/get/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git-heads/get/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git-log/list/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-model-default/get/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-model-default/replace/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/skill-files/get/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/skill-files/list/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/skill-files/replace/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/skills/list/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/task-center/images/get/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/task-center/messages/get/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-session-git-branch/add/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-session-git-branch/replace/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-session-tree/get/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-session-tree-entry/get/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/add/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/branch/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/del/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/rename/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/replace/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/sort/route-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/error-216b14b5da089ed3.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/layout-20718f1503910291.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/not-found-720cdf6a606b821a.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/app/page-ce2ebf7d8ea7a330.js +0 -158
- package/temp/build/pi-desk/release/.next/static/chunks/next/dist/client/components/builtin/app-error-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/next/dist/client/components/builtin/forbidden-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/next/dist/client/components/builtin/unauthorized-9969fe0baa238786.js +0 -1
- package/temp/build/pi-desk/release/.next/static/css/2bdcf40eca12b794.css +0 -1
- package/temp/build/pi-desk/release/.next/static/css/2c3b0c0ff1f49c68.css +0 -1
- package/temp/build/pi-desk/release/.next/static/css/c43b04c244a64fb4.css +0 -1
- /package/temp/build/pi-desk/release/.next/static/{bj2dB_Z10YB_CqK_VNhDx → ErYBfYXAir5b-6rlacGvL}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import { useEffect, useRef, useState, type MouseEvent } from 'react'
|
|
4
|
+
import {
|
|
5
|
+
getL4DesktopWindow,
|
|
6
|
+
type L4DesktopWindow,
|
|
7
|
+
type L4DesktopWindowAction,
|
|
8
|
+
type L4DesktopWindowState
|
|
9
|
+
} from './l4-desktop-window'
|
|
10
|
+
import './l4-desktop-window.css'
|
|
11
|
+
|
|
12
|
+
const labels = {
|
|
13
|
+
'zh-CN': {
|
|
14
|
+
window: '窗口',
|
|
15
|
+
minimize: '最小化',
|
|
16
|
+
maximize: '最大化',
|
|
17
|
+
restore: '还原',
|
|
18
|
+
close: '关闭'
|
|
19
|
+
},
|
|
20
|
+
en: {
|
|
21
|
+
window: 'Window',
|
|
22
|
+
minimize: 'Minimize',
|
|
23
|
+
maximize: 'Maximize',
|
|
24
|
+
restore: 'Restore',
|
|
25
|
+
close: 'Close'
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function L4DesktopTitlebar(): React.JSX.Element {
|
|
30
|
+
const adapter = useRef<L4DesktopWindow | null>(null)
|
|
31
|
+
const [state, setState] = useState<L4DesktopWindowState | null>(null)
|
|
32
|
+
const [title, setTitle] = useState('Pi Desk')
|
|
33
|
+
const [locale, setLocale] = useState<'zh-CN' | 'en'>('zh-CN')
|
|
34
|
+
const [focused, setFocused] = useState(true)
|
|
35
|
+
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
const desktop = getL4DesktopWindow()
|
|
38
|
+
if (!desktop) return
|
|
39
|
+
adapter.current = desktop
|
|
40
|
+
let disposed = false
|
|
41
|
+
let frame = 0
|
|
42
|
+
const root = document.documentElement
|
|
43
|
+
const readTitle = (): void => {
|
|
44
|
+
setTitle(document.title || 'Pi Desk')
|
|
45
|
+
setLocale(root.lang.startsWith('zh') ? 'zh-CN' : 'en')
|
|
46
|
+
}
|
|
47
|
+
const refreshState = (): void => {
|
|
48
|
+
cancelAnimationFrame(frame)
|
|
49
|
+
frame = requestAnimationFrame(() => {
|
|
50
|
+
void desktop
|
|
51
|
+
.invoke('state')
|
|
52
|
+
.then((next) => {
|
|
53
|
+
if (!disposed) setState((current) => (current ? next : null))
|
|
54
|
+
})
|
|
55
|
+
.catch((error: unknown) => {
|
|
56
|
+
console.error('[desktop-window] 读取窗口状态失败', error)
|
|
57
|
+
})
|
|
58
|
+
})
|
|
59
|
+
}
|
|
60
|
+
const onFocus = (): void => {
|
|
61
|
+
setFocused(true)
|
|
62
|
+
}
|
|
63
|
+
const onBlur = (): void => {
|
|
64
|
+
setFocused(false)
|
|
65
|
+
}
|
|
66
|
+
const observer = new MutationObserver(readTitle)
|
|
67
|
+
observer.observe(document.head, { childList: true, subtree: true, characterData: true })
|
|
68
|
+
observer.observe(root, { attributes: true, attributeFilter: ['lang'] })
|
|
69
|
+
window.addEventListener('resize', refreshState)
|
|
70
|
+
window.addEventListener('focus', onFocus)
|
|
71
|
+
window.addEventListener('blur', onBlur)
|
|
72
|
+
|
|
73
|
+
// 按钮已挂载并绑定事件后才关闭系统装饰;旧页面不会调用此能力。
|
|
74
|
+
void desktop
|
|
75
|
+
.invoke('attach')
|
|
76
|
+
.then((next) => {
|
|
77
|
+
if (disposed) return
|
|
78
|
+
readTitle()
|
|
79
|
+
setFocused(document.hasFocus())
|
|
80
|
+
root.dataset.piDeskWindow = ''
|
|
81
|
+
setState(next)
|
|
82
|
+
})
|
|
83
|
+
.catch((error: unknown) => {
|
|
84
|
+
console.error('[desktop-window] 启用自定义标题栏失败,保留系统标题栏', error)
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
return () => {
|
|
88
|
+
disposed = true
|
|
89
|
+
adapter.current = null
|
|
90
|
+
observer.disconnect()
|
|
91
|
+
cancelAnimationFrame(frame)
|
|
92
|
+
window.removeEventListener('resize', refreshState)
|
|
93
|
+
window.removeEventListener('focus', onFocus)
|
|
94
|
+
window.removeEventListener('blur', onBlur)
|
|
95
|
+
delete root.dataset.piDeskWindow
|
|
96
|
+
void desktop.invoke('detach').catch((error: unknown) => {
|
|
97
|
+
console.error('[desktop-window] 恢复系统标题栏失败', error)
|
|
98
|
+
})
|
|
99
|
+
}
|
|
100
|
+
}, [])
|
|
101
|
+
|
|
102
|
+
const run = async (action: L4DesktopWindowAction): Promise<void> => {
|
|
103
|
+
const desktop = adapter.current
|
|
104
|
+
if (!desktop) return
|
|
105
|
+
try {
|
|
106
|
+
const next = await desktop.invoke(action)
|
|
107
|
+
if (adapter.current === desktop) setState(next)
|
|
108
|
+
} catch (error) {
|
|
109
|
+
console.error(`[desktop-window] 窗口操作失败 action=${action}`, error)
|
|
110
|
+
try {
|
|
111
|
+
await desktop.invoke('detach')
|
|
112
|
+
if (adapter.current !== desktop) return
|
|
113
|
+
delete document.documentElement.dataset.piDeskWindow
|
|
114
|
+
setState(null)
|
|
115
|
+
} catch (restoreError) {
|
|
116
|
+
console.error('[desktop-window] 恢复系统标题栏失败', restoreError)
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
const onDrag = (event: MouseEvent<HTMLElement>): void => {
|
|
121
|
+
if (event.button !== 0 || (event.target as Element).closest('button')) return
|
|
122
|
+
event.preventDefault()
|
|
123
|
+
void run(event.detail === 2 ? 'toggle-maximize' : 'drag')
|
|
124
|
+
}
|
|
125
|
+
const text = labels[locale]
|
|
126
|
+
const maximizeLabel = state?.maximized ? text.restore : text.maximize
|
|
127
|
+
|
|
128
|
+
return (
|
|
129
|
+
<header
|
|
130
|
+
className="pi-desk-titlebar"
|
|
131
|
+
data-testid="desktop-titlebar"
|
|
132
|
+
data-focused={focused}
|
|
133
|
+
hidden={!state}
|
|
134
|
+
aria-label={text.window}
|
|
135
|
+
onMouseDown={onDrag}
|
|
136
|
+
>
|
|
137
|
+
<span className="pi-desk-titlebar-title" title={title}>
|
|
138
|
+
{title}
|
|
139
|
+
</span>
|
|
140
|
+
<div className="pi-desk-titlebar-controls">
|
|
141
|
+
<button
|
|
142
|
+
type="button"
|
|
143
|
+
aria-label={text.minimize}
|
|
144
|
+
title={text.minimize}
|
|
145
|
+
onMouseDown={(event) => event.preventDefault()}
|
|
146
|
+
onClick={() => {
|
|
147
|
+
void run('minimize')
|
|
148
|
+
}}
|
|
149
|
+
>
|
|
150
|
+
<svg viewBox="0 0 16 16" aria-hidden="true">
|
|
151
|
+
<path d="M3 8.5h10" />
|
|
152
|
+
</svg>
|
|
153
|
+
</button>
|
|
154
|
+
<button
|
|
155
|
+
type="button"
|
|
156
|
+
aria-label={maximizeLabel}
|
|
157
|
+
title={maximizeLabel}
|
|
158
|
+
onMouseDown={(event) => event.preventDefault()}
|
|
159
|
+
onClick={() => {
|
|
160
|
+
void run('toggle-maximize')
|
|
161
|
+
}}
|
|
162
|
+
>
|
|
163
|
+
<svg viewBox="0 0 16 16" aria-hidden="true">
|
|
164
|
+
{state?.maximized ? (
|
|
165
|
+
<path d="M5.5 5.5v-3h8v8h-3m-8-5h8v8h-8z" />
|
|
166
|
+
) : (
|
|
167
|
+
<rect x="3.5" y="3.5" width="9" height="9" />
|
|
168
|
+
)}
|
|
169
|
+
</svg>
|
|
170
|
+
</button>
|
|
171
|
+
<button
|
|
172
|
+
type="button"
|
|
173
|
+
className="pi-desk-titlebar-close"
|
|
174
|
+
aria-label={text.close}
|
|
175
|
+
title={text.close}
|
|
176
|
+
onMouseDown={(event) => event.preventDefault()}
|
|
177
|
+
onClick={() => {
|
|
178
|
+
void run('close')
|
|
179
|
+
}}
|
|
180
|
+
>
|
|
181
|
+
<svg viewBox="0 0 16 16" aria-hidden="true">
|
|
182
|
+
<path d="m3.5 3.5 9 9m0-9-9 9" />
|
|
183
|
+
</svg>
|
|
184
|
+
</button>
|
|
185
|
+
</div>
|
|
186
|
+
</header>
|
|
187
|
+
)
|
|
188
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
--pi-desk-window-inset: 0px;
|
|
3
|
+
--pi-desk-content-height: calc(100dvh - var(--pi-desk-window-inset));
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
:root[data-pi-desk-window] {
|
|
7
|
+
--pi-desk-window-inset: 2rem;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
:root[data-pi-desk-window] body {
|
|
11
|
+
padding-top: var(--pi-desk-window-inset);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.pi-desk-titlebar {
|
|
15
|
+
position: fixed;
|
|
16
|
+
inset: 0 0 auto;
|
|
17
|
+
z-index: 1000;
|
|
18
|
+
display: flex;
|
|
19
|
+
align-items: center;
|
|
20
|
+
height: var(--pi-desk-window-inset);
|
|
21
|
+
overflow: hidden;
|
|
22
|
+
border-bottom: 1px solid var(--border);
|
|
23
|
+
background: var(--sidebar, var(--background));
|
|
24
|
+
color: var(--foreground);
|
|
25
|
+
user-select: none;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.pi-desk-titlebar[hidden] {
|
|
29
|
+
display: none;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.pi-desk-titlebar-title {
|
|
33
|
+
flex: 1;
|
|
34
|
+
min-width: 0;
|
|
35
|
+
padding: 0 0.75rem;
|
|
36
|
+
overflow: hidden;
|
|
37
|
+
font-size: 0.75rem;
|
|
38
|
+
line-height: 1.5;
|
|
39
|
+
text-overflow: ellipsis;
|
|
40
|
+
white-space: nowrap;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.pi-desk-titlebar[data-focused='false'] .pi-desk-titlebar-title {
|
|
44
|
+
color: var(--muted-foreground);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.pi-desk-titlebar-controls {
|
|
48
|
+
display: flex;
|
|
49
|
+
align-self: stretch;
|
|
50
|
+
flex: none;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.pi-desk-titlebar-controls > button {
|
|
54
|
+
display: grid;
|
|
55
|
+
width: 2.875rem;
|
|
56
|
+
min-height: 0;
|
|
57
|
+
height: 100%;
|
|
58
|
+
place-items: center;
|
|
59
|
+
margin: 0;
|
|
60
|
+
border: 0;
|
|
61
|
+
border-radius: 0;
|
|
62
|
+
padding: 0;
|
|
63
|
+
background: transparent;
|
|
64
|
+
color: inherit;
|
|
65
|
+
box-shadow: none;
|
|
66
|
+
cursor: default;
|
|
67
|
+
transition: background-color 150ms ease-out;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.pi-desk-titlebar-controls > button:hover {
|
|
71
|
+
background: var(--accent);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.pi-desk-titlebar-controls > button:active {
|
|
75
|
+
background: color-mix(in oklab, var(--foreground) 14%, transparent);
|
|
76
|
+
box-shadow: none;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.pi-desk-titlebar-controls > button:focus-visible {
|
|
80
|
+
outline: 2px solid var(--ring);
|
|
81
|
+
outline-offset: -3px;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.pi-desk-titlebar-controls > .pi-desk-titlebar-close:hover {
|
|
85
|
+
background: #c42b1c;
|
|
86
|
+
color: #fff;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.pi-desk-titlebar-controls > .pi-desk-titlebar-close:active {
|
|
90
|
+
background: #a92518;
|
|
91
|
+
color: #fff;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.pi-desk-titlebar-controls svg {
|
|
95
|
+
width: 1rem;
|
|
96
|
+
height: 1rem;
|
|
97
|
+
fill: none;
|
|
98
|
+
stroke: currentColor;
|
|
99
|
+
stroke-width: 1;
|
|
100
|
+
pointer-events: none;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
@media (prefers-reduced-motion: reduce) {
|
|
104
|
+
.pi-desk-titlebar-controls > button {
|
|
105
|
+
transition: none;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type L4DesktopWindowAction =
|
|
2
|
+
'attach' | 'detach' | 'state' | 'drag' | 'minimize' | 'toggle-maximize' | 'close'
|
|
3
|
+
|
|
4
|
+
export interface L4DesktopWindowState {
|
|
5
|
+
maximized: boolean
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface L4DesktopWindow {
|
|
9
|
+
invoke(action: L4DesktopWindowAction): Promise<L4DesktopWindowState>
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
declare global {
|
|
13
|
+
interface Window {
|
|
14
|
+
__PI_DESK_WINDOW__?: L4DesktopWindow
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function getL4DesktopWindow(): L4DesktopWindow | null {
|
|
19
|
+
return typeof window === 'undefined' ? null : (window.__PI_DESK_WINDOW__ ?? null)
|
|
20
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 文件类型图标
|
|
2
2
|
|
|
3
|
-
`l4-file-icon.tsx`
|
|
3
|
+
`l4-file-icon.tsx` 是文件树、搜索、预览页签与聊天读取消息共用的文件类型图标入口。常用类型保留彩色图标;环境与工具配置共用中性配置图标,其他已识别代码类型回退通用代码图标,未知文件回退文档图标。目录与操作图标继续使用中性色 Lucide。
|
|
4
4
|
|
|
5
5
|
`material/` 保留 [Material Icon Theme](https://github.com/material-extensions/vscode-material-icon-theme) 的 18 个原始 SVG,来源版本为 `cb1dfb6d9cb73b15681a93939983d75dbba7bf5b`,采用 MIT 许可,完整许可见 [`material/LICENSE`](./material/LICENSE)。
|
|
6
6
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FileTextIcon } from 'lucide-react'
|
|
1
|
+
import { FileCode2Icon, FileTextIcon, Settings2Icon } from 'lucide-react'
|
|
2
2
|
import Image, { type StaticImageData } from 'next/image'
|
|
3
3
|
import agentIcon from './material/agent.svg'
|
|
4
4
|
import consoleIcon from './material/console.svg'
|
|
@@ -74,6 +74,40 @@ const EXTENSION_ICONS = new Map<string, StaticImageData>(
|
|
|
74
74
|
})
|
|
75
75
|
)
|
|
76
76
|
|
|
77
|
+
const CONFIG_EXTENSIONS = new Set(['env', 'toml', 'ini', 'conf', 'cfg', 'properties'])
|
|
78
|
+
const CONFIG_NAMES = new Set([
|
|
79
|
+
'.editorconfig',
|
|
80
|
+
'.npmrc',
|
|
81
|
+
'.yarnrc',
|
|
82
|
+
'.prettierignore',
|
|
83
|
+
'.eslintignore'
|
|
84
|
+
])
|
|
85
|
+
const CODE_EXTENSIONS = new Set([
|
|
86
|
+
'c',
|
|
87
|
+
'cpp',
|
|
88
|
+
'cc',
|
|
89
|
+
'cxx',
|
|
90
|
+
'h',
|
|
91
|
+
'hpp',
|
|
92
|
+
'cs',
|
|
93
|
+
'go',
|
|
94
|
+
'rs',
|
|
95
|
+
'java',
|
|
96
|
+
'kt',
|
|
97
|
+
'kts',
|
|
98
|
+
'rb',
|
|
99
|
+
'php',
|
|
100
|
+
'swift',
|
|
101
|
+
'dart',
|
|
102
|
+
'vue',
|
|
103
|
+
'svelte',
|
|
104
|
+
'scss',
|
|
105
|
+
'sass',
|
|
106
|
+
'less',
|
|
107
|
+
'sql',
|
|
108
|
+
'xml'
|
|
109
|
+
])
|
|
110
|
+
|
|
77
111
|
export function L4FileIcon({
|
|
78
112
|
path,
|
|
79
113
|
className
|
|
@@ -83,13 +117,26 @@ export function L4FileIcon({
|
|
|
83
117
|
}): React.JSX.Element {
|
|
84
118
|
const fileName = path.replaceAll('\\', '/').split('/').at(-1)?.toLowerCase() ?? ''
|
|
85
119
|
const extension = fileName.includes('.') ? fileName.slice(fileName.lastIndexOf('.') + 1) : ''
|
|
120
|
+
const config =
|
|
121
|
+
CONFIG_EXTENSIONS.has(extension) ||
|
|
122
|
+
CONFIG_NAMES.has(fileName) ||
|
|
123
|
+
fileName.startsWith('.env.') ||
|
|
124
|
+
fileName.startsWith('.eslintrc') ||
|
|
125
|
+
fileName.startsWith('.prettierrc') ||
|
|
126
|
+
fileName.startsWith('eslint.config.') ||
|
|
127
|
+
fileName.startsWith('prettier.config.')
|
|
128
|
+
if (config) return <Settings2Icon className={className} aria-hidden="true" />
|
|
129
|
+
|
|
86
130
|
// 特殊文件名优先于扩展名;只查静态子集,不在卡片内生成完整主题映射。
|
|
87
131
|
const icon =
|
|
88
132
|
FILE_NAME_ICONS.get(fileName) ??
|
|
89
133
|
(fileName.startsWith('dockerfile.') ? dockerIcon : undefined) ??
|
|
90
134
|
EXTENSION_ICONS.get(extension)
|
|
91
135
|
|
|
92
|
-
if (!icon)
|
|
136
|
+
if (!icon) {
|
|
137
|
+
const Fallback = CODE_EXTENSIONS.has(extension) ? FileCode2Icon : FileTextIcon
|
|
138
|
+
return <Fallback className={className} aria-hidden="true" />
|
|
139
|
+
}
|
|
93
140
|
|
|
94
141
|
return (
|
|
95
142
|
<Image
|
|
@@ -55,7 +55,7 @@ function L4AppDialogBackdrop({
|
|
|
55
55
|
<DialogPrimitive.Backdrop
|
|
56
56
|
data-slot="app-dialog-backdrop"
|
|
57
57
|
className={cn(
|
|
58
|
-
'fixed inset-0 z-[100] bg-black/35 duration-100 data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0',
|
|
58
|
+
'fixed inset-x-0 top-[var(--pi-desk-window-inset)] bottom-0 z-[100] bg-black/35 duration-100 data-open:animate-in data-open:fade-in-0 data-closed:animate-out data-closed:fade-out-0',
|
|
59
59
|
className
|
|
60
60
|
)}
|
|
61
61
|
{...props}
|
|
@@ -82,7 +82,7 @@ function L4AppDialogContent({
|
|
|
82
82
|
data-slot="app-dialog-content"
|
|
83
83
|
finalFocus={finalFocus}
|
|
84
84
|
className={cn(
|
|
85
|
-
'fixed top-
|
|
85
|
+
'fixed top-[calc(50%+var(--pi-desk-window-inset)/2)] left-1/2 z-[110] flex max-h-[calc(var(--pi-desk-content-height)-2rem)] w-[calc(100%-2rem)] max-w-[27.5rem] -translate-x-1/2 -translate-y-1/2 flex-col overflow-hidden rounded-xl border border-border bg-popover text-sm text-popover-foreground shadow-lg outline-none duration-100 data-open:animate-in data-open:fade-in-0 data-open:zoom-in-95 data-closed:animate-out data-closed:fade-out-0 data-closed:zoom-out-95',
|
|
86
86
|
className
|
|
87
87
|
)}
|
|
88
88
|
{...props}
|
|
@@ -5,6 +5,11 @@ import {
|
|
|
5
5
|
L3PiSessionIdSchema
|
|
6
6
|
} from '@common/l3_modules/pi/l3-pi-contract'
|
|
7
7
|
import { L4TimestampMsSchema } from '@common/l4_foundation/l4-timestamp-contract'
|
|
8
|
+
import {
|
|
9
|
+
L3PiSessionSearchScopeSchema,
|
|
10
|
+
L3PiSessionSearchMatchSchema,
|
|
11
|
+
L3PiSessionSearchQuerySchema
|
|
12
|
+
} from '@common/l3_modules/pi/l3-pi-session-search-contract'
|
|
8
13
|
|
|
9
14
|
export const L2PiDirectorySchema = z
|
|
10
15
|
.object({
|
|
@@ -59,22 +64,8 @@ export const L2PiDirectoryEntryListResponseSchema = z
|
|
|
59
64
|
})
|
|
60
65
|
.strict()
|
|
61
66
|
|
|
62
|
-
export const L2PiSessionHistorySearchScopeSchema =
|
|
63
|
-
|
|
64
|
-
'user',
|
|
65
|
-
'assistant',
|
|
66
|
-
'sessionId'
|
|
67
|
-
])
|
|
68
|
-
|
|
69
|
-
export const L2PiSessionHistoryMatchSchema = z
|
|
70
|
-
.object({
|
|
71
|
-
scope: L2PiSessionHistorySearchScopeSchema,
|
|
72
|
-
count: z.number().int().positive(),
|
|
73
|
-
entryId: L3PiEntryIdSchema.nullable(),
|
|
74
|
-
timestampMs: L4TimestampMsSchema.nullable(),
|
|
75
|
-
preview: z.string().min(1).max(160)
|
|
76
|
-
})
|
|
77
|
-
.strict()
|
|
67
|
+
export const L2PiSessionHistorySearchScopeSchema = L3PiSessionSearchScopeSchema
|
|
68
|
+
export const L2PiSessionHistoryMatchSchema = L3PiSessionSearchMatchSchema
|
|
78
69
|
|
|
79
70
|
export const L2PiSessionHistoryItemSchema = z
|
|
80
71
|
.object({
|
|
@@ -90,14 +81,10 @@ export const L2PiSessionHistoryItemSchema = z
|
|
|
90
81
|
})
|
|
91
82
|
.strict()
|
|
92
83
|
|
|
93
|
-
export const L2PiSessionHistoryQuerySchema =
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
forceRefresh: z.boolean().default(false),
|
|
98
|
-
searchIn: z.array(L2PiSessionHistorySearchScopeSchema).min(1).max(4).default(['title', 'user'])
|
|
99
|
-
})
|
|
100
|
-
.strict()
|
|
84
|
+
export const L2PiSessionHistoryQuerySchema = L3PiSessionSearchQuerySchema.extend({
|
|
85
|
+
cwd: L3PiCwdSchema,
|
|
86
|
+
forceRefresh: z.boolean().default(false)
|
|
87
|
+
})
|
|
101
88
|
|
|
102
89
|
export const L2PiSessionHistoryResponseSchema = z
|
|
103
90
|
.object({
|
|
@@ -1,19 +1,12 @@
|
|
|
1
|
-
import type { L4Locale } from '@common/l4_foundation/locale/l4-locale'
|
|
2
|
-
import { L2_PROJECT_HISTORY_MESSAGES } from './l2-project-history-messages'
|
|
3
|
-
|
|
4
1
|
export const L2_PROJECT_PREVIEW_PATH = '/project-preview'
|
|
5
2
|
|
|
6
3
|
export function buildL2ProjectPreviewHref(cwd?: string | null): string {
|
|
7
4
|
return cwd ? `${L2_PROJECT_PREVIEW_PATH}?cwd=${encodeURIComponent(cwd)}` : L2_PROJECT_PREVIEW_PATH
|
|
8
5
|
}
|
|
9
6
|
|
|
10
|
-
export function buildL2ProjectPreviewTitle(
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
)
|
|
14
|
-
|
|
15
|
-
const name = directory?.replaceAll('\\', '/').split('/').filter(Boolean).at(-1) ?? directory
|
|
16
|
-
return [name, L2_PROJECT_HISTORY_MESSAGES[locale].previewTitle, 'Pi Desk']
|
|
17
|
-
.filter(Boolean)
|
|
18
|
-
.join(' · ')
|
|
7
|
+
export function buildL2ProjectPreviewTitle(cwd: string | null | undefined): string {
|
|
8
|
+
const directory = cwd?.trim()
|
|
9
|
+
if (!directory) return 'Pi Desk'
|
|
10
|
+
const name = directory.replaceAll('\\', '/').split('/').filter(Boolean).at(-1) ?? directory
|
|
11
|
+
return name === directory ? directory : `${name} – ${directory}`
|
|
19
12
|
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import {
|
|
3
|
+
L3PiSessionSearchMatchSchema,
|
|
4
|
+
L3PiSessionSearchQuerySchema
|
|
5
|
+
} from '@common/l3_modules/pi/l3-pi-session-search-contract'
|
|
6
|
+
import { L2WorkIdSchema } from './l2-work-session-contract'
|
|
7
|
+
|
|
8
|
+
export const L2WorkSessionSearchRequestSchema = L3PiSessionSearchQuerySchema.extend({
|
|
9
|
+
query: z.string().trim().min(1).max(120)
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
export const L2WorkSessionSearchResponseSchema = z
|
|
13
|
+
.object({
|
|
14
|
+
sessions: z.array(
|
|
15
|
+
z
|
|
16
|
+
.object({
|
|
17
|
+
workId: L2WorkIdSchema,
|
|
18
|
+
matches: z.array(L3PiSessionSearchMatchSchema).min(1).max(4)
|
|
19
|
+
})
|
|
20
|
+
.strict()
|
|
21
|
+
)
|
|
22
|
+
})
|
|
23
|
+
.strict()
|
|
24
|
+
|
|
25
|
+
export type L2WorkSessionSearchRequest = z.infer<typeof L2WorkSessionSearchRequestSchema>
|
|
26
|
+
export type L2WorkSessionSearchResponse = z.infer<typeof L2WorkSessionSearchResponseSchema>
|
|
@@ -86,7 +86,7 @@ export const L2WorkSessionTreeEntryGetResponseSchema = z
|
|
|
86
86
|
})
|
|
87
87
|
.strict()
|
|
88
88
|
|
|
89
|
-
export const L2WorkSessionBranchActionSchema = z.enum(['tree', 'fork', 'clone'])
|
|
89
|
+
export const L2WorkSessionBranchActionSchema = z.enum(['tree', 'fork', 'clone', 'resend'])
|
|
90
90
|
|
|
91
91
|
export const L2WorkSessionBranchRequestSchema = z.discriminatedUnion('action', [
|
|
92
92
|
z
|
|
@@ -97,6 +97,14 @@ export const L2WorkSessionBranchRequestSchema = z.discriminatedUnion('action', [
|
|
|
97
97
|
entryId: L2PiEntryIdSchema
|
|
98
98
|
})
|
|
99
99
|
.strict(),
|
|
100
|
+
z
|
|
101
|
+
.object({
|
|
102
|
+
action: z.literal('resend'),
|
|
103
|
+
workId: L2WorkIdSchema,
|
|
104
|
+
sessionId: L2PiSessionIdSchema,
|
|
105
|
+
entryId: L2PiEntryIdSchema
|
|
106
|
+
})
|
|
107
|
+
.strict(),
|
|
100
108
|
z
|
|
101
109
|
.object({
|
|
102
110
|
action: z.literal('fork'),
|
|
@@ -4,6 +4,12 @@ export const L2_WORKBENCH_LOCALE_MESSAGES = {
|
|
|
4
4
|
en: {
|
|
5
5
|
...L2_TERMINAL_LOCALE_MESSAGES.en,
|
|
6
6
|
toolsAndContext: 'Tools and context',
|
|
7
|
+
searchWorkSessions: 'Search work sessions',
|
|
8
|
+
clearSessionSearch: 'Clear search',
|
|
9
|
+
searchingSessions: 'Searching…',
|
|
10
|
+
noSessionSearchMatches: 'No matching work sessions',
|
|
11
|
+
sessionSearchFailed: 'Could not search work sessions',
|
|
12
|
+
retrySessionSearch: 'Retry',
|
|
7
13
|
sessionContextDescription: 'Tools, system instructions and services for this session',
|
|
8
14
|
mcpSession: 'Session MCP',
|
|
9
15
|
modelAutomaticRouting: 'Automatic routing',
|
|
@@ -453,6 +459,12 @@ export const L2_WORKBENCH_LOCALE_MESSAGES = {
|
|
|
453
459
|
'zh-CN': {
|
|
454
460
|
...L2_TERMINAL_LOCALE_MESSAGES['zh-CN'],
|
|
455
461
|
toolsAndContext: '工具与上下文',
|
|
462
|
+
searchWorkSessions: '搜索工作会话',
|
|
463
|
+
clearSessionSearch: '清空搜索',
|
|
464
|
+
searchingSessions: '正在搜索…',
|
|
465
|
+
noSessionSearchMatches: '没有匹配的工作会话',
|
|
466
|
+
sessionSearchFailed: '搜索工作会话失败',
|
|
467
|
+
retrySessionSearch: '重试',
|
|
456
468
|
sessionContextDescription: '当前会话的工具、系统提示词和服务',
|
|
457
469
|
mcpSession: '会话 MCP',
|
|
458
470
|
modelAutomaticRouting: '自动路由',
|
|
@@ -8,6 +8,7 @@ export const L2_WORKBENCH_PICKER_MESSAGES = {
|
|
|
8
8
|
scopeUserMatches: 'User messages {{count}}',
|
|
9
9
|
scopeAssistantMatches: 'AI replies {{count}}',
|
|
10
10
|
loadUserFailed: 'Could not load user messages',
|
|
11
|
+
loadHistoryFailed: 'Could not load past sessions',
|
|
11
12
|
ignoredRestoreTitle: 'Restore ignored folder',
|
|
12
13
|
browseOtherTitle: 'Choose a project folder',
|
|
13
14
|
replaceTitle: 'Replace work session',
|
|
@@ -109,6 +110,7 @@ export const L2_WORKBENCH_PICKER_MESSAGES = {
|
|
|
109
110
|
kindSession: 'Session',
|
|
110
111
|
kindLabel: 'Label',
|
|
111
112
|
treeIntent: 'Switch the current session branch',
|
|
113
|
+
resendIntent: 'Resend this message in a new branch',
|
|
112
114
|
forkIntent: 'Start a session from a user message',
|
|
113
115
|
cloneIntent: 'Clone the current session',
|
|
114
116
|
runningTitle: 'The current session is running',
|
|
@@ -124,7 +126,7 @@ export const L2_WORKBENCH_PICKER_MESSAGES = {
|
|
|
124
126
|
closeBranchPicker: 'Close session branch picker',
|
|
125
127
|
branchSearch: 'Search session branches',
|
|
126
128
|
branchSearchPlaceholder: 'Search messages, tools or labels',
|
|
127
|
-
|
|
129
|
+
branchFilters: 'Filter',
|
|
128
130
|
loadingEntry: 'Loading full content…',
|
|
129
131
|
entryEmpty: 'No text available for this entry',
|
|
130
132
|
entryTruncated: 'Long content has been truncated.',
|
|
@@ -151,6 +153,7 @@ export const L2_WORKBENCH_PICKER_MESSAGES = {
|
|
|
151
153
|
scopeUserMatches: '用户消息 {{count}}',
|
|
152
154
|
scopeAssistantMatches: 'AI 回复 {{count}}',
|
|
153
155
|
loadUserFailed: '加载用户消息失败',
|
|
156
|
+
loadHistoryFailed: '加载历史会话失败',
|
|
154
157
|
ignoredRestoreTitle: '恢复忽略目录',
|
|
155
158
|
browseOtherTitle: '选择项目目录',
|
|
156
159
|
replaceTitle: '替换工作会话',
|
|
@@ -249,6 +252,7 @@ export const L2_WORKBENCH_PICKER_MESSAGES = {
|
|
|
249
252
|
kindSession: '会话',
|
|
250
253
|
kindLabel: '标签',
|
|
251
254
|
treeIntent: '切换当前会话分支',
|
|
255
|
+
resendIntent: '从这条消息重新发送',
|
|
252
256
|
forkIntent: '从用户消息新开会话',
|
|
253
257
|
cloneIntent: '克隆当前会话',
|
|
254
258
|
runningTitle: '当前工作会话正在运行',
|
|
@@ -263,7 +267,7 @@ export const L2_WORKBENCH_PICKER_MESSAGES = {
|
|
|
263
267
|
closeBranchPicker: '关闭会话分支选择器',
|
|
264
268
|
branchSearch: '搜索会话分支',
|
|
265
269
|
branchSearchPlaceholder: '搜索消息、工具或标签',
|
|
266
|
-
|
|
270
|
+
branchFilters: '筛选',
|
|
267
271
|
loadingEntry: '正在读取完整内容…',
|
|
268
272
|
entryEmpty: '该节点没有可展示的文字内容',
|
|
269
273
|
entryTruncated: '内容较长,已截断显示。',
|
|
@@ -27,6 +27,7 @@ export const L3_CONVERSATION_LOCALE_MESSAGES = {
|
|
|
27
27
|
messageCopyFailed: 'Could not copy the message. Please copy it manually.',
|
|
28
28
|
copied: 'Copied',
|
|
29
29
|
copyMessage: 'Copy message',
|
|
30
|
+
resendMessage: 'Resend',
|
|
30
31
|
usage: 'Input {{input}} / Output {{output}} / Cached input {{cached}} / {{cost}}',
|
|
31
32
|
chatImage: 'Chat image {{count}}',
|
|
32
33
|
imageLoading: 'Loading image…',
|
|
@@ -174,6 +175,7 @@ export const L3_CONVERSATION_LOCALE_MESSAGES = {
|
|
|
174
175
|
messageCopyFailed: '复制消息失败,请手动复制。',
|
|
175
176
|
copied: '已复制',
|
|
176
177
|
copyMessage: '复制消息',
|
|
178
|
+
resendMessage: '重发',
|
|
177
179
|
usage: '输入 {{input}} / 输出 {{output}} / 输入缓存 {{cached}} / {{cost}}',
|
|
178
180
|
chatImage: '聊天图片 {{count}}',
|
|
179
181
|
imageLoading: '加载图片…',
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { L3PiEntryIdSchema } from './l3-pi-contract'
|
|
3
|
+
import { L4TimestampMsSchema } from '@common/l4_foundation/l4-timestamp-contract'
|
|
4
|
+
|
|
5
|
+
export const L3PiSessionSearchScopeSchema = z.enum(['title', 'user', 'assistant', 'sessionId'])
|
|
6
|
+
|
|
7
|
+
export const L3PiSessionSearchMatchSchema = z
|
|
8
|
+
.object({
|
|
9
|
+
scope: L3PiSessionSearchScopeSchema,
|
|
10
|
+
count: z.number().int().positive(),
|
|
11
|
+
entryId: L3PiEntryIdSchema.nullable(),
|
|
12
|
+
timestampMs: L4TimestampMsSchema.nullable(),
|
|
13
|
+
preview: z.string().min(1).max(160)
|
|
14
|
+
})
|
|
15
|
+
.strict()
|
|
16
|
+
|
|
17
|
+
export const L3PiSessionSearchQuerySchema = z
|
|
18
|
+
.object({
|
|
19
|
+
query: z.string().trim().max(120).default(''),
|
|
20
|
+
searchIn: z.array(L3PiSessionSearchScopeSchema).min(1).max(4).default(['title', 'user'])
|
|
21
|
+
})
|
|
22
|
+
.strict()
|
|
23
|
+
|
|
24
|
+
export type L3PiSessionSearchScope = z.infer<typeof L3PiSessionSearchScopeSchema>
|
|
25
|
+
export type L3PiSessionSearchMatch = z.infer<typeof L3PiSessionSearchMatchSchema>
|
|
26
|
+
export type L3PiSessionSearchQuery = z.infer<typeof L3PiSessionSearchQuerySchema>
|