@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.
Files changed (362) hide show
  1. package/docs/plugins.md +2 -2
  2. package/package.json +1 -1
  3. package/src/app/api/work-sessions/search/route.ts +1 -0
  4. package/src/app/project-preview/page.tsx +1 -3
  5. package/src/client/l1_entry/pages/l1-error-page.tsx +1 -1
  6. package/src/client/l1_entry/providers/l1-app-providers.tsx +2 -0
  7. package/src/client/l2_biz/auth/l2-login.module.css +1 -1
  8. package/src/client/l2_biz/plugin-host/l2-plugin-composer-panel.tsx +1 -1
  9. package/src/client/l2_biz/plugin-host/l2-plugin-contribution-host.tsx +1 -1
  10. package/src/client/l2_biz/plugin-host/l2-plugin-session-header-layout.ts +6 -3
  11. package/src/client/l2_biz/plugin-host/l2-plugin-session-header.tsx +75 -18
  12. package/src/client/l2_biz/project-preview/hooks/l2-use-project-preview.ts +1 -14
  13. package/src/client/l2_biz/project-preview/l2-project-preview-dialog.tsx +2 -3
  14. package/src/client/l2_biz/project-preview/l2-project-preview-page.tsx +1 -2
  15. package/src/client/l2_biz/project-preview/l2-project-preview.tsx +1 -4
  16. package/src/client/l2_biz/project-preview/views/l2-project-branch-select.tsx +42 -3
  17. package/src/client/l2_biz/settings/l2-settings.tsx +1 -1
  18. package/src/client/l2_biz/settings/l2-skills-settings.tsx +1 -1
  19. package/src/client/l2_biz/task-center/l2-task-center.tsx +1 -1
  20. package/src/client/l2_biz/workbench/file-workspace/l2-plugin-standalone-file-preview.tsx +1 -1
  21. package/src/client/l2_biz/workbench/file-workspace/l2-work-session-file-preview.tsx +1 -1
  22. package/src/client/l2_biz/workbench/git-workspace/l2-git-workspace-runtime.ts +11 -10
  23. package/src/client/l2_biz/workbench/hooks/l2-work-session-search.ts +52 -0
  24. package/src/client/l2_biz/workbench/hooks/l2-workbench-branch-picker.ts +42 -7
  25. package/src/client/l2_biz/workbench/hooks/l2-workbench-session-history.ts +143 -131
  26. package/src/client/l2_biz/workbench/hooks/l2-workbench-session-search.ts +97 -0
  27. package/src/client/l2_biz/workbench/l2-work-session-columns.tsx +8 -0
  28. package/src/client/l2_biz/workbench/l2-work-session-sidebar.tsx +129 -10
  29. package/src/client/l2_biz/workbench/l2-workbench-biz.ts +20 -2
  30. package/src/client/l2_biz/workbench/l2-workbench-branch-filter-preferences.ts +34 -0
  31. package/src/client/l2_biz/workbench/l2-workbench-branch-picker.tsx +34 -71
  32. package/src/client/l2_biz/workbench/l2-workbench-chat-input-runtime.ts +38 -1
  33. package/src/client/l2_biz/workbench/l2-workbench-chat-view.tsx +11 -1
  34. package/src/client/l2_biz/workbench/l2-workbench-picker-dialog.tsx +55 -215
  35. package/src/client/l2_biz/workbench/l2-workbench.tsx +21 -39
  36. package/src/client/l2_biz/workbench/views/l2-workbench-session-search.tsx +123 -0
  37. package/src/client/l3_modules/conversation/l3-conversation-messages.tsx +43 -4
  38. package/src/client/l3_modules/project-files/l3-markdown-preview.module.css +1 -1
  39. package/src/client/l3_modules/project-files/l3-project-document-git.ts +13 -29
  40. package/src/client/l3_modules/project-files/l3-project-document-view.tsx +1 -4
  41. package/src/client/l3_modules/project-files/l3-project-file-browser.module.css +14 -18
  42. package/src/client/l3_modules/project-files/l3-project-file-browser.tsx +52 -95
  43. package/src/client/l3_modules/project-files/l3-project-file-runtime.ts +52 -21
  44. package/src/client/l3_modules/project-files/l3-project-file-tabs.tsx +41 -62
  45. package/src/client/l3_modules/project-files/l3-project-git-runtime.ts +5 -4
  46. package/src/client/l3_modules/project-files/l3-use-project-refresh.ts +36 -0
  47. package/src/client/l3_modules/project-files/views/l3-project-search-results.tsx +2 -2
  48. package/src/client/l3_modules/project-files/views/l3-project-tree-folder.tsx +86 -0
  49. package/src/client/l4_foundation/desktop-window/l4-desktop-titlebar.tsx +188 -0
  50. package/src/client/l4_foundation/desktop-window/l4-desktop-window.css +107 -0
  51. package/src/client/l4_foundation/desktop-window/l4-desktop-window.ts +20 -0
  52. package/src/client/l4_foundation/ui/file-icons/README.md +1 -1
  53. package/src/client/l4_foundation/ui/file-icons/l4-file-icon.tsx +49 -2
  54. package/src/client/l4_foundation/ui/l4-app-dialog.tsx +2 -2
  55. package/src/common/l2_biz/pi-session/l2-pi-session-contract.ts +11 -24
  56. package/src/common/l2_biz/project-preview/l2-project-preview-navigation.ts +5 -12
  57. package/src/common/l2_biz/work-session/l2-work-session-search-contract.ts +26 -0
  58. package/src/common/l2_biz/work-session/l2-work-session-tree-contract.ts +9 -1
  59. package/src/common/l2_biz/workbench/l2-workbench-locale-messages.ts +12 -0
  60. package/src/common/l2_biz/workbench/l2-workbench-picker-messages.ts +6 -2
  61. package/src/common/l3_modules/conversation/l3-conversation-locale-messages.ts +2 -0
  62. package/src/common/l3_modules/pi/l3-pi-session-search-contract.ts +26 -0
  63. package/src/common/l4_foundation/locale/l4-host-error-messages.ts +2 -0
  64. package/src/server/l1_entry/api/l1-work-session-branch-route.ts +21 -15
  65. package/src/server/l1_entry/api/l1-work-session-search-route.ts +38 -0
  66. package/src/server/l2_biz/work-session/l2-work-session-chat-runtime.ts +4 -2
  67. package/src/server/l2_biz/work-session/l2-work-session-manage.ts +46 -10
  68. package/src/server/l3_modules/work-session/l3-work-session.ts +11 -6
  69. package/src/server/l4_foundation/pi/l4-pi-chat-worker.ts +35 -2
  70. package/src/server/l4_foundation/pi/l4-pi-session-history-catalog.ts +62 -113
  71. package/src/server/l4_foundation/pi/l4-pi-session-search.ts +166 -0
  72. package/src/server/l4_foundation/pi/l4-pi-work-session-runtime.ts +66 -5
  73. package/temp/build/pi-desk/release/.next/BUILD_ID +1 -1
  74. package/temp/build/pi-desk/release/.next/app-path-routes-manifest.json +1 -0
  75. package/temp/build/pi-desk/release/.next/build-manifest.json +3 -3
  76. package/temp/build/pi-desk/release/.next/required-server-files.js +2 -2
  77. package/temp/build/pi-desk/release/.next/required-server-files.json +2 -2
  78. package/temp/build/pi-desk/release/.next/routes-manifest.json +6 -0
  79. package/temp/build/pi-desk/release/.next/server/app/_global-error/page.js +2 -2
  80. package/temp/build/pi-desk/release/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  81. package/temp/build/pi-desk/release/.next/server/app/_global-error.html +1 -1
  82. package/temp/build/pi-desk/release/.next/server/app/_global-error.rsc +3 -3
  83. package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_full.segment.rsc +3 -3
  84. package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +3 -3
  85. package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  86. package/temp/build/pi-desk/release/.next/server/app/_not-found/page.js +1 -1
  87. package/temp/build/pi-desk/release/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  88. package/temp/build/pi-desk/release/.next/server/app/api/auth/login/route.js +2 -2
  89. package/temp/build/pi-desk/release/.next/server/app/api/auth/logout/route.js +1 -1
  90. package/temp/build/pi-desk/release/.next/server/app/api/auth-settings/get/route.js +1 -1
  91. package/temp/build/pi-desk/release/.next/server/app/api/auth-settings/replace/route.js +1 -1
  92. package/temp/build/pi-desk/release/.next/server/app/api/capability-modes/get/route.js +1 -1
  93. package/temp/build/pi-desk/release/.next/server/app/api/capability-modes/replace/route.js +1 -1
  94. package/temp/build/pi-desk/release/.next/server/app/api/chat/context/get/route.js +1 -1
  95. package/temp/build/pi-desk/release/.next/server/app/api/chat/images/get/route.js +1 -1
  96. package/temp/build/pi-desk/release/.next/server/app/api/chat/messages/get/route.js +1 -1
  97. package/temp/build/pi-desk/release/.next/server/app/api/health/route.js +1 -1
  98. package/temp/build/pi-desk/release/.next/server/app/api/mcp-check/get/route.js +1 -1
  99. package/temp/build/pi-desk/release/.next/server/app/api/mcp-settings/del/route.js +1 -1
  100. package/temp/build/pi-desk/release/.next/server/app/api/mcp-settings/get/route.js +1 -1
  101. package/temp/build/pi-desk/release/.next/server/app/api/mcp-settings/replace/route.js +1 -1
  102. package/temp/build/pi-desk/release/.next/server/app/api/model-catalog/list/route.js +1 -1
  103. package/temp/build/pi-desk/release/.next/server/app/api/model-settings/get/route.js +1 -1
  104. package/temp/build/pi-desk/release/.next/server/app/api/model-settings/preview/route.js +1 -1
  105. package/temp/build/pi-desk/release/.next/server/app/api/model-settings/replace/route.js +1 -1
  106. package/temp/build/pi-desk/release/.next/server/app/api/pi/directories/list/route.js +1 -1
  107. package/temp/build/pi-desk/release/.next/server/app/api/pi/directory-entries/list/route.js +1 -1
  108. package/temp/build/pi-desk/release/.next/server/app/api/pi/directory-ignores/list/route.js +1 -1
  109. package/temp/build/pi-desk/release/.next/server/app/api/pi/directory-ignores/replace/route.js +1 -1
  110. package/temp/build/pi-desk/release/.next/server/app/api/pi/models/list/route.js +1 -1
  111. package/temp/build/pi-desk/release/.next/server/app/api/pi/session-user-messages/list/route.js +1 -1
  112. package/temp/build/pi-desk/release/.next/server/app/api/pi/sessions/list/route.js +1 -1
  113. package/temp/build/pi-desk/release/.next/server/app/api/plugin-catalog/get/route.js +1 -1
  114. package/temp/build/pi-desk/release/.next/server/app/api/plugin-catalog/search/route.js +1 -1
  115. package/temp/build/pi-desk/release/.next/server/app/api/plugin-catalog/settings-get/route.js +1 -1
  116. package/temp/build/pi-desk/release/.next/server/app/api/plugin-catalog/settings-replace/route.js +1 -1
  117. package/temp/build/pi-desk/release/.next/server/app/api/plugins/add/route.js +1 -1
  118. package/temp/build/pi-desk/release/.next/server/app/api/plugins/apply/route.js +1 -1
  119. package/temp/build/pi-desk/release/.next/server/app/api/plugins/batch/route.js +1 -1
  120. package/temp/build/pi-desk/release/.next/server/app/api/plugins/browser-resources/[resourceGroup]/[...resourcePath]/route.js +1 -1
  121. package/temp/build/pi-desk/release/.next/server/app/api/plugins/del/route.js +1 -1
  122. package/temp/build/pi-desk/release/.next/server/app/api/plugins/enabled-set/route.js +1 -1
  123. package/temp/build/pi-desk/release/.next/server/app/api/plugins/get/route.js +1 -1
  124. package/temp/build/pi-desk/release/.next/server/app/api/plugins/host-runtime/[runtimeVersion]/[...resourcePath]/route.js +1 -1
  125. package/temp/build/pi-desk/release/.next/server/app/api/plugins/list/route.js +1 -1
  126. package/temp/build/pi-desk/release/.next/server/app/api/plugins/reload/route.js +1 -1
  127. package/temp/build/pi-desk/release/.next/server/app/api/plugins/update/route.js +1 -1
  128. package/temp/build/pi-desk/release/.next/server/app/api/project-files/get/route.js +2 -2
  129. package/temp/build/pi-desk/release/.next/server/app/api/project-files/list/route.js +1 -1
  130. package/temp/build/pi-desk/release/.next/server/app/api/project-files/reveal/route.js +1 -1
  131. package/temp/build/pi-desk/release/.next/server/app/api/project-files/search/route.js +1 -1
  132. package/temp/build/pi-desk/release/.next/server/app/api/project-git/get/route.js +2 -2
  133. package/temp/build/pi-desk/release/.next/server/app/api/project-git-branches/list/route.js +2 -2
  134. package/temp/build/pi-desk/release/.next/server/app/api/project-git-changes/list/route.js +1 -1
  135. package/temp/build/pi-desk/release/.next/server/app/api/project-git-diff/get/route.js +2 -2
  136. package/temp/build/pi-desk/release/.next/server/app/api/project-git-heads/get/route.js +1 -1
  137. package/temp/build/pi-desk/release/.next/server/app/api/project-git-log/list/route.js +2 -2
  138. package/temp/build/pi-desk/release/.next/server/app/api/project-model-default/get/route.js +1 -1
  139. package/temp/build/pi-desk/release/.next/server/app/api/project-model-default/replace/route.js +1 -1
  140. package/temp/build/pi-desk/release/.next/server/app/api/skill-files/get/route.js +1 -1
  141. package/temp/build/pi-desk/release/.next/server/app/api/skill-files/list/route.js +1 -1
  142. package/temp/build/pi-desk/release/.next/server/app/api/skill-files/replace/route.js +1 -1
  143. package/temp/build/pi-desk/release/.next/server/app/api/skills/list/route.js +1 -1
  144. package/temp/build/pi-desk/release/.next/server/app/api/task-center/images/get/route.js +1 -1
  145. package/temp/build/pi-desk/release/.next/server/app/api/task-center/messages/get/route.js +1 -1
  146. package/temp/build/pi-desk/release/.next/server/app/api/work-session-git-branch/add/route.js +1 -1
  147. package/temp/build/pi-desk/release/.next/server/app/api/work-session-git-branch/replace/route.js +1 -1
  148. package/temp/build/pi-desk/release/.next/server/app/api/work-session-tree/get/route.js +1 -1
  149. package/temp/build/pi-desk/release/.next/server/app/api/work-session-tree-entry/get/route.js +1 -1
  150. package/temp/build/pi-desk/release/.next/server/app/api/work-sessions/add/route.js +1 -1
  151. package/temp/build/pi-desk/release/.next/server/app/api/work-sessions/branch/route.js +1 -1
  152. package/temp/build/pi-desk/release/.next/server/app/api/work-sessions/del/route.js +1 -1
  153. package/temp/build/pi-desk/release/.next/server/app/api/work-sessions/rename/route.js +1 -1
  154. package/temp/build/pi-desk/release/.next/server/app/api/work-sessions/replace/route.js +1 -1
  155. package/temp/build/pi-desk/release/.next/server/app/api/work-sessions/search/route.js +1 -0
  156. package/temp/build/pi-desk/release/.next/server/app/api/work-sessions/search/route_client-reference-manifest.js +1 -0
  157. package/temp/build/pi-desk/release/.next/server/app/api/work-sessions/sort/route.js +1 -1
  158. package/temp/build/pi-desk/release/.next/server/app/favicon.ico/route.js +1 -1
  159. package/temp/build/pi-desk/release/.next/server/app/login/page.js +1 -1
  160. package/temp/build/pi-desk/release/.next/server/app/login/page_client-reference-manifest.js +1 -1
  161. package/temp/build/pi-desk/release/.next/server/app/page.js +138 -138
  162. package/temp/build/pi-desk/release/.next/server/app/page_client-reference-manifest.js +1 -1
  163. package/temp/build/pi-desk/release/.next/server/app/project-preview/page.js +1 -1
  164. package/temp/build/pi-desk/release/.next/server/app/project-preview/page_client-reference-manifest.js +1 -1
  165. package/temp/build/pi-desk/release/.next/server/app-paths-manifest.json +1 -0
  166. package/temp/build/pi-desk/release/.next/server/chunks/23054.js +2 -2
  167. package/temp/build/pi-desk/release/.next/server/chunks/25406.js +8 -8
  168. package/temp/build/pi-desk/release/.next/server/chunks/27344.js +3 -3
  169. package/temp/build/pi-desk/release/.next/server/chunks/3108.js +3 -3
  170. package/temp/build/pi-desk/release/.next/server/chunks/35985.js +3 -3
  171. package/temp/build/pi-desk/release/.next/server/chunks/41856.js +1 -0
  172. package/temp/build/pi-desk/release/.next/server/chunks/62900.js +235 -0
  173. package/temp/build/pi-desk/release/.next/server/chunks/6917.js +1 -1
  174. package/temp/build/pi-desk/release/.next/server/chunks/81363.js +1 -1
  175. package/temp/build/pi-desk/release/.next/server/chunks/81912.js +3 -0
  176. package/temp/build/pi-desk/release/.next/server/chunks/92386.js +2 -2
  177. package/temp/build/pi-desk/release/.next/server/middleware-build-manifest.js +1 -1
  178. package/temp/build/pi-desk/release/.next/server/pages/500.html +1 -1
  179. package/temp/build/pi-desk/release/.next/static/ErYBfYXAir5b-6rlacGvL/_buildManifest.js +1 -0
  180. package/temp/build/pi-desk/release/.next/static/chunks/10043-9d6c3735418ccaf9.js +238 -0
  181. package/temp/build/pi-desk/release/.next/static/chunks/11937-ac71fb0f7cef482a.js +1 -0
  182. package/temp/build/pi-desk/release/.next/static/chunks/30669-ffa76d39e0e25194.js +1 -0
  183. package/temp/build/pi-desk/release/.next/static/chunks/36643-f60e98278740073c.js +3 -0
  184. package/temp/build/pi-desk/release/.next/static/chunks/65232-f5b71cec787a30ec.js +15 -0
  185. package/temp/build/pi-desk/release/.next/static/chunks/{51474-8dc714cb76b2e60a.js → 65350-23bb961d87addf14.js} +3 -3
  186. package/temp/build/pi-desk/release/.next/static/chunks/app/_global-error/page-295cb63da5f7262f.js +1 -0
  187. package/temp/build/pi-desk/release/.next/static/chunks/app/_not-found/page-295cb63da5f7262f.js +1 -0
  188. package/temp/build/pi-desk/release/.next/static/chunks/app/api/auth/login/route-295cb63da5f7262f.js +1 -0
  189. package/temp/build/pi-desk/release/.next/static/chunks/app/api/auth/logout/route-295cb63da5f7262f.js +1 -0
  190. package/temp/build/pi-desk/release/.next/static/chunks/app/api/auth-settings/get/route-295cb63da5f7262f.js +1 -0
  191. package/temp/build/pi-desk/release/.next/static/chunks/app/api/auth-settings/replace/route-295cb63da5f7262f.js +1 -0
  192. package/temp/build/pi-desk/release/.next/static/chunks/app/api/capability-modes/get/route-295cb63da5f7262f.js +1 -0
  193. package/temp/build/pi-desk/release/.next/static/chunks/app/api/capability-modes/replace/route-295cb63da5f7262f.js +1 -0
  194. package/temp/build/pi-desk/release/.next/static/chunks/app/api/chat/context/get/route-295cb63da5f7262f.js +1 -0
  195. package/temp/build/pi-desk/release/.next/static/chunks/app/api/chat/images/get/route-295cb63da5f7262f.js +1 -0
  196. package/temp/build/pi-desk/release/.next/static/chunks/app/api/chat/messages/get/route-295cb63da5f7262f.js +1 -0
  197. package/temp/build/pi-desk/release/.next/static/chunks/app/api/health/route-295cb63da5f7262f.js +1 -0
  198. package/temp/build/pi-desk/release/.next/static/chunks/app/api/mcp-check/get/route-295cb63da5f7262f.js +1 -0
  199. package/temp/build/pi-desk/release/.next/static/chunks/app/api/mcp-settings/del/route-295cb63da5f7262f.js +1 -0
  200. package/temp/build/pi-desk/release/.next/static/chunks/app/api/mcp-settings/get/route-295cb63da5f7262f.js +1 -0
  201. package/temp/build/pi-desk/release/.next/static/chunks/app/api/mcp-settings/replace/route-295cb63da5f7262f.js +1 -0
  202. package/temp/build/pi-desk/release/.next/static/chunks/app/api/model-catalog/list/route-295cb63da5f7262f.js +1 -0
  203. package/temp/build/pi-desk/release/.next/static/chunks/app/api/model-settings/get/route-295cb63da5f7262f.js +1 -0
  204. package/temp/build/pi-desk/release/.next/static/chunks/app/api/model-settings/preview/route-295cb63da5f7262f.js +1 -0
  205. package/temp/build/pi-desk/release/.next/static/chunks/app/api/model-settings/replace/route-295cb63da5f7262f.js +1 -0
  206. package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/directories/list/route-295cb63da5f7262f.js +1 -0
  207. package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/directory-entries/list/route-295cb63da5f7262f.js +1 -0
  208. package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/directory-ignores/list/route-295cb63da5f7262f.js +1 -0
  209. package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/directory-ignores/replace/route-295cb63da5f7262f.js +1 -0
  210. package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/models/list/route-295cb63da5f7262f.js +1 -0
  211. package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/session-user-messages/list/route-295cb63da5f7262f.js +1 -0
  212. package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/sessions/list/route-295cb63da5f7262f.js +1 -0
  213. package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugin-catalog/get/route-295cb63da5f7262f.js +1 -0
  214. package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugin-catalog/search/route-295cb63da5f7262f.js +1 -0
  215. package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugin-catalog/settings-get/route-295cb63da5f7262f.js +1 -0
  216. package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugin-catalog/settings-replace/route-295cb63da5f7262f.js +1 -0
  217. package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/add/route-295cb63da5f7262f.js +1 -0
  218. package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/apply/route-295cb63da5f7262f.js +1 -0
  219. package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/batch/route-295cb63da5f7262f.js +1 -0
  220. package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/browser-resources/[resourceGroup]/[...resourcePath]/route-295cb63da5f7262f.js +1 -0
  221. package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/del/route-295cb63da5f7262f.js +1 -0
  222. package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/enabled-set/route-295cb63da5f7262f.js +1 -0
  223. package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/get/route-295cb63da5f7262f.js +1 -0
  224. package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/host-runtime/[runtimeVersion]/[...resourcePath]/route-295cb63da5f7262f.js +1 -0
  225. package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/list/route-295cb63da5f7262f.js +1 -0
  226. package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/reload/route-295cb63da5f7262f.js +1 -0
  227. package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/update/route-295cb63da5f7262f.js +1 -0
  228. package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-files/get/route-295cb63da5f7262f.js +1 -0
  229. package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-files/list/route-295cb63da5f7262f.js +1 -0
  230. package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-files/reveal/route-295cb63da5f7262f.js +1 -0
  231. package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-files/search/route-295cb63da5f7262f.js +1 -0
  232. package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git/get/route-295cb63da5f7262f.js +1 -0
  233. package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git-branches/list/route-295cb63da5f7262f.js +1 -0
  234. package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git-changes/list/route-295cb63da5f7262f.js +1 -0
  235. package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git-diff/get/route-295cb63da5f7262f.js +1 -0
  236. package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git-heads/get/route-295cb63da5f7262f.js +1 -0
  237. package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git-log/list/route-295cb63da5f7262f.js +1 -0
  238. package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-model-default/get/route-295cb63da5f7262f.js +1 -0
  239. package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-model-default/replace/route-295cb63da5f7262f.js +1 -0
  240. package/temp/build/pi-desk/release/.next/static/chunks/app/api/skill-files/get/route-295cb63da5f7262f.js +1 -0
  241. package/temp/build/pi-desk/release/.next/static/chunks/app/api/skill-files/list/route-295cb63da5f7262f.js +1 -0
  242. package/temp/build/pi-desk/release/.next/static/chunks/app/api/skill-files/replace/route-295cb63da5f7262f.js +1 -0
  243. package/temp/build/pi-desk/release/.next/static/chunks/app/api/skills/list/route-295cb63da5f7262f.js +1 -0
  244. package/temp/build/pi-desk/release/.next/static/chunks/app/api/task-center/images/get/route-295cb63da5f7262f.js +1 -0
  245. package/temp/build/pi-desk/release/.next/static/chunks/app/api/task-center/messages/get/route-295cb63da5f7262f.js +1 -0
  246. package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-session-git-branch/add/route-295cb63da5f7262f.js +1 -0
  247. package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-session-git-branch/replace/route-295cb63da5f7262f.js +1 -0
  248. package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-session-tree/get/route-295cb63da5f7262f.js +1 -0
  249. package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-session-tree-entry/get/route-295cb63da5f7262f.js +1 -0
  250. package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/add/route-295cb63da5f7262f.js +1 -0
  251. package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/branch/route-295cb63da5f7262f.js +1 -0
  252. package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/del/route-295cb63da5f7262f.js +1 -0
  253. package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/rename/route-295cb63da5f7262f.js +1 -0
  254. package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/replace/route-295cb63da5f7262f.js +1 -0
  255. package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/search/route-295cb63da5f7262f.js +1 -0
  256. package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/sort/route-295cb63da5f7262f.js +1 -0
  257. package/temp/build/pi-desk/release/.next/static/chunks/app/error-1ab62762c5f4144f.js +1 -0
  258. package/temp/build/pi-desk/release/.next/static/chunks/app/layout-ca5ef5994165eb2e.js +1 -0
  259. package/temp/build/pi-desk/release/.next/static/chunks/app/login/{page-0d3d4827802108e5.js → page-0df9df996aa68060.js} +1 -1
  260. package/temp/build/pi-desk/release/.next/static/chunks/app/not-found-b8b9b7ef5ccb7601.js +1 -0
  261. package/temp/build/pi-desk/release/.next/static/chunks/app/page-978906de76a8dcfe.js +158 -0
  262. package/temp/build/pi-desk/release/.next/static/chunks/app/project-preview/{page-038b6c14e03ed878.js → page-aaa845016a934245.js} +1 -1
  263. package/temp/build/pi-desk/release/.next/static/chunks/next/dist/client/components/builtin/app-error-295cb63da5f7262f.js +1 -0
  264. package/temp/build/pi-desk/release/.next/static/chunks/next/dist/client/components/builtin/forbidden-295cb63da5f7262f.js +1 -0
  265. package/temp/build/pi-desk/release/.next/static/chunks/next/dist/client/components/builtin/unauthorized-295cb63da5f7262f.js +1 -0
  266. package/temp/build/pi-desk/release/.next/static/chunks/{webpack-c0b805df46fcf8b3.js → webpack-a84310d111797bef.js} +1 -1
  267. package/temp/build/pi-desk/release/.next/static/css/053a8d82c09326cd.css +1 -0
  268. package/temp/build/pi-desk/release/.next/static/css/1cc92eec583aa639.css +1 -0
  269. package/temp/build/pi-desk/release/.next/static/css/{1e780a4936aa6ba3.css → 2bb393927ba8f71d.css} +1 -1
  270. package/temp/build/pi-desk/release/.next/static/css/3a07dcc86ffdf88c.css +1 -0
  271. package/temp/build/pi-desk/release/.next/static/css/3c59ac068ae404da.css +1 -0
  272. package/temp/build/pi-desk/release/.next/trace-build +1 -1
  273. package/temp/build/pi-desk/release/.next/server/chunks/35348.js +0 -3
  274. package/temp/build/pi-desk/release/.next/server/chunks/56830.js +0 -235
  275. package/temp/build/pi-desk/release/.next/server/chunks/80780.js +0 -1
  276. package/temp/build/pi-desk/release/.next/static/bj2dB_Z10YB_CqK_VNhDx/_buildManifest.js +0 -1
  277. package/temp/build/pi-desk/release/.next/static/chunks/11937-1d0a9822f2c7995b.js +0 -1
  278. package/temp/build/pi-desk/release/.next/static/chunks/14197-3d3ddd426ac06c9c.js +0 -3
  279. package/temp/build/pi-desk/release/.next/static/chunks/37313-d5970e2d0c270d22.js +0 -238
  280. package/temp/build/pi-desk/release/.next/static/chunks/65232-ef4e5a4174f62faf.js +0 -15
  281. package/temp/build/pi-desk/release/.next/static/chunks/79267-7d21d7cdbd7cfca1.js +0 -1
  282. package/temp/build/pi-desk/release/.next/static/chunks/app/_global-error/page-9969fe0baa238786.js +0 -1
  283. package/temp/build/pi-desk/release/.next/static/chunks/app/_not-found/page-9969fe0baa238786.js +0 -1
  284. package/temp/build/pi-desk/release/.next/static/chunks/app/api/auth/login/route-9969fe0baa238786.js +0 -1
  285. package/temp/build/pi-desk/release/.next/static/chunks/app/api/auth/logout/route-9969fe0baa238786.js +0 -1
  286. package/temp/build/pi-desk/release/.next/static/chunks/app/api/auth-settings/get/route-9969fe0baa238786.js +0 -1
  287. package/temp/build/pi-desk/release/.next/static/chunks/app/api/auth-settings/replace/route-9969fe0baa238786.js +0 -1
  288. package/temp/build/pi-desk/release/.next/static/chunks/app/api/capability-modes/get/route-9969fe0baa238786.js +0 -1
  289. package/temp/build/pi-desk/release/.next/static/chunks/app/api/capability-modes/replace/route-9969fe0baa238786.js +0 -1
  290. package/temp/build/pi-desk/release/.next/static/chunks/app/api/chat/context/get/route-9969fe0baa238786.js +0 -1
  291. package/temp/build/pi-desk/release/.next/static/chunks/app/api/chat/images/get/route-9969fe0baa238786.js +0 -1
  292. package/temp/build/pi-desk/release/.next/static/chunks/app/api/chat/messages/get/route-9969fe0baa238786.js +0 -1
  293. package/temp/build/pi-desk/release/.next/static/chunks/app/api/health/route-9969fe0baa238786.js +0 -1
  294. package/temp/build/pi-desk/release/.next/static/chunks/app/api/mcp-check/get/route-9969fe0baa238786.js +0 -1
  295. package/temp/build/pi-desk/release/.next/static/chunks/app/api/mcp-settings/del/route-9969fe0baa238786.js +0 -1
  296. package/temp/build/pi-desk/release/.next/static/chunks/app/api/mcp-settings/get/route-9969fe0baa238786.js +0 -1
  297. package/temp/build/pi-desk/release/.next/static/chunks/app/api/mcp-settings/replace/route-9969fe0baa238786.js +0 -1
  298. package/temp/build/pi-desk/release/.next/static/chunks/app/api/model-catalog/list/route-9969fe0baa238786.js +0 -1
  299. package/temp/build/pi-desk/release/.next/static/chunks/app/api/model-settings/get/route-9969fe0baa238786.js +0 -1
  300. package/temp/build/pi-desk/release/.next/static/chunks/app/api/model-settings/preview/route-9969fe0baa238786.js +0 -1
  301. package/temp/build/pi-desk/release/.next/static/chunks/app/api/model-settings/replace/route-9969fe0baa238786.js +0 -1
  302. package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/directories/list/route-9969fe0baa238786.js +0 -1
  303. package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/directory-entries/list/route-9969fe0baa238786.js +0 -1
  304. package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/directory-ignores/list/route-9969fe0baa238786.js +0 -1
  305. package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/directory-ignores/replace/route-9969fe0baa238786.js +0 -1
  306. package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/models/list/route-9969fe0baa238786.js +0 -1
  307. package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/session-user-messages/list/route-9969fe0baa238786.js +0 -1
  308. package/temp/build/pi-desk/release/.next/static/chunks/app/api/pi/sessions/list/route-9969fe0baa238786.js +0 -1
  309. package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugin-catalog/get/route-9969fe0baa238786.js +0 -1
  310. package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugin-catalog/search/route-9969fe0baa238786.js +0 -1
  311. package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugin-catalog/settings-get/route-9969fe0baa238786.js +0 -1
  312. package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugin-catalog/settings-replace/route-9969fe0baa238786.js +0 -1
  313. package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/add/route-9969fe0baa238786.js +0 -1
  314. package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/apply/route-9969fe0baa238786.js +0 -1
  315. package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/batch/route-9969fe0baa238786.js +0 -1
  316. package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/browser-resources/[resourceGroup]/[...resourcePath]/route-9969fe0baa238786.js +0 -1
  317. package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/del/route-9969fe0baa238786.js +0 -1
  318. package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/enabled-set/route-9969fe0baa238786.js +0 -1
  319. package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/get/route-9969fe0baa238786.js +0 -1
  320. package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/host-runtime/[runtimeVersion]/[...resourcePath]/route-9969fe0baa238786.js +0 -1
  321. package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/list/route-9969fe0baa238786.js +0 -1
  322. package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/reload/route-9969fe0baa238786.js +0 -1
  323. package/temp/build/pi-desk/release/.next/static/chunks/app/api/plugins/update/route-9969fe0baa238786.js +0 -1
  324. package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-files/get/route-9969fe0baa238786.js +0 -1
  325. package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-files/list/route-9969fe0baa238786.js +0 -1
  326. package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-files/reveal/route-9969fe0baa238786.js +0 -1
  327. package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-files/search/route-9969fe0baa238786.js +0 -1
  328. package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git/get/route-9969fe0baa238786.js +0 -1
  329. package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git-branches/list/route-9969fe0baa238786.js +0 -1
  330. package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git-changes/list/route-9969fe0baa238786.js +0 -1
  331. package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git-diff/get/route-9969fe0baa238786.js +0 -1
  332. package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git-heads/get/route-9969fe0baa238786.js +0 -1
  333. package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-git-log/list/route-9969fe0baa238786.js +0 -1
  334. package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-model-default/get/route-9969fe0baa238786.js +0 -1
  335. package/temp/build/pi-desk/release/.next/static/chunks/app/api/project-model-default/replace/route-9969fe0baa238786.js +0 -1
  336. package/temp/build/pi-desk/release/.next/static/chunks/app/api/skill-files/get/route-9969fe0baa238786.js +0 -1
  337. package/temp/build/pi-desk/release/.next/static/chunks/app/api/skill-files/list/route-9969fe0baa238786.js +0 -1
  338. package/temp/build/pi-desk/release/.next/static/chunks/app/api/skill-files/replace/route-9969fe0baa238786.js +0 -1
  339. package/temp/build/pi-desk/release/.next/static/chunks/app/api/skills/list/route-9969fe0baa238786.js +0 -1
  340. package/temp/build/pi-desk/release/.next/static/chunks/app/api/task-center/images/get/route-9969fe0baa238786.js +0 -1
  341. package/temp/build/pi-desk/release/.next/static/chunks/app/api/task-center/messages/get/route-9969fe0baa238786.js +0 -1
  342. package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-session-git-branch/add/route-9969fe0baa238786.js +0 -1
  343. package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-session-git-branch/replace/route-9969fe0baa238786.js +0 -1
  344. package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-session-tree/get/route-9969fe0baa238786.js +0 -1
  345. package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-session-tree-entry/get/route-9969fe0baa238786.js +0 -1
  346. package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/add/route-9969fe0baa238786.js +0 -1
  347. package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/branch/route-9969fe0baa238786.js +0 -1
  348. package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/del/route-9969fe0baa238786.js +0 -1
  349. package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/rename/route-9969fe0baa238786.js +0 -1
  350. package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/replace/route-9969fe0baa238786.js +0 -1
  351. package/temp/build/pi-desk/release/.next/static/chunks/app/api/work-sessions/sort/route-9969fe0baa238786.js +0 -1
  352. package/temp/build/pi-desk/release/.next/static/chunks/app/error-216b14b5da089ed3.js +0 -1
  353. package/temp/build/pi-desk/release/.next/static/chunks/app/layout-20718f1503910291.js +0 -1
  354. package/temp/build/pi-desk/release/.next/static/chunks/app/not-found-720cdf6a606b821a.js +0 -1
  355. package/temp/build/pi-desk/release/.next/static/chunks/app/page-ce2ebf7d8ea7a330.js +0 -158
  356. package/temp/build/pi-desk/release/.next/static/chunks/next/dist/client/components/builtin/app-error-9969fe0baa238786.js +0 -1
  357. package/temp/build/pi-desk/release/.next/static/chunks/next/dist/client/components/builtin/forbidden-9969fe0baa238786.js +0 -1
  358. package/temp/build/pi-desk/release/.next/static/chunks/next/dist/client/components/builtin/unauthorized-9969fe0baa238786.js +0 -1
  359. package/temp/build/pi-desk/release/.next/static/css/2bdcf40eca12b794.css +0 -1
  360. package/temp/build/pi-desk/release/.next/static/css/2c3b0c0ff1f49c68.css +0 -1
  361. package/temp/build/pi-desk/release/.next/static/css/c43b04c244a64fb4.css +0 -1
  362. /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` 是宿主文件类型图标入口。特殊文件名优先于扩展名,未知类型回退 Lucide 文档图标;操作图标继续使用 Lucide。
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) return <FileTextIcon className={className} aria-hidden="true" />
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-1/2 left-1/2 z-[110] flex max-h-[calc(100dvh-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',
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 = z.enum([
63
- 'title',
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 = z
94
- .object({
95
- cwd: L3PiCwdSchema,
96
- query: z.string().trim().max(120).default(''),
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
- cwd: string | null | undefined,
12
- locale: L4Locale
13
- ): string {
14
- const directory = cwd?.trim() || null
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
- branchFilter: 'Filter session tree, current: {{filter}}',
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
- branchFilter: '过滤会话树,当前:{{filter}}',
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>