@rexvane/piweb 0.3.14 → 0.3.16

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 (262) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +12 -9
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/prerender-manifest.json +6 -6
  5. package/.next/react-loadable-manifest.json +16 -4
  6. package/.next/required-server-files.js +3 -1
  7. package/.next/required-server-files.json +3 -1
  8. package/.next/routes-manifest.json +20 -0
  9. package/.next/server/app/_global-error/page.js +2 -2
  10. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  11. package/.next/server/app/_global-error.html +1 -1
  12. package/.next/server/app/_global-error.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  14. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  15. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  16. package/.next/server/app/_not-found/page.js +1 -1
  17. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  18. package/.next/server/app/_not-found.html +1 -1
  19. package/.next/server/app/_not-found.rsc +7 -4
  20. package/.next/server/app/_not-found.segments/_full.segment.rsc +7 -4
  21. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +5 -2
  22. package/.next/server/app/_not-found.segments/_tree.segment.rsc +5 -2
  23. package/.next/server/app/api/agent/[id]/events/route.js +2 -2
  24. package/.next/server/app/api/agent/[id]/events/route.js.nft.json +1 -1
  25. package/.next/server/app/api/agent/[id]/route.js +1 -1
  26. package/.next/server/app/api/agent/[id]/route.js.nft.json +1 -1
  27. package/.next/server/app/api/agent/[id]/tree/route.js +1 -1
  28. package/.next/server/app/api/agent/[id]/tree/route.js.nft.json +1 -1
  29. package/.next/server/app/api/agent/new/route.js +1 -1
  30. package/.next/server/app/api/agent/new/route.js.nft.json +1 -1
  31. package/.next/server/app/api/config/route.js +1 -1
  32. package/.next/server/app/api/config/route.js.nft.json +1 -1
  33. package/.next/server/app/api/files/route.js +1 -1
  34. package/.next/server/app/api/files/route.js.nft.json +1 -1
  35. package/.next/server/app/api/git/route.js +2 -2
  36. package/.next/server/app/api/git/route.js.nft.json +1 -1
  37. package/.next/server/app/api/growth/route.js +1 -1
  38. package/.next/server/app/api/growth/route.js.nft.json +1 -1
  39. package/.next/server/app/api/health/route.js +1 -1
  40. package/.next/server/app/api/models/route.js +1 -1
  41. package/.next/server/app/api/models/route.js.nft.json +1 -1
  42. package/.next/server/app/api/pi-settings/route.js +1 -1
  43. package/.next/server/app/api/pi-settings/route.js.nft.json +1 -1
  44. package/.next/server/app/api/plugins/route.js +1 -1
  45. package/.next/server/app/api/plugins/route.js.nft.json +1 -1
  46. package/.next/server/app/api/prompts/route.js +1 -1
  47. package/.next/server/app/api/prompts/route.js.nft.json +1 -1
  48. package/.next/server/app/api/security/route.js +1 -1
  49. package/.next/server/app/api/security/route.js.nft.json +1 -1
  50. package/.next/server/app/api/sessions/[id]/export/route.js +1 -1
  51. package/.next/server/app/api/sessions/[id]/export/route.js.nft.json +1 -1
  52. package/.next/server/app/api/sessions/[id]/route.js +1 -1
  53. package/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
  54. package/.next/server/app/api/sessions/import/route.js +3 -3
  55. package/.next/server/app/api/sessions/import/route.js.nft.json +1 -1
  56. package/.next/server/app/api/sessions/route.js +1 -1
  57. package/.next/server/app/api/sessions/route.js.nft.json +1 -1
  58. package/.next/server/app/api/skills/route.js +2 -2
  59. package/.next/server/app/api/skills/route.js.nft.json +1 -1
  60. package/.next/server/app/api/swarm/[id]/route.js +1 -0
  61. package/.next/server/app/api/swarm/[id]/route.js.nft.json +1 -0
  62. package/.next/server/app/api/swarm/[id]/route_client-reference-manifest.js +1 -0
  63. package/.next/server/app/api/swarm/route.js +1 -0
  64. package/.next/server/app/api/swarm/route.js.nft.json +1 -0
  65. package/.next/server/app/api/swarm/route_client-reference-manifest.js +1 -0
  66. package/.next/server/app/api/tests/route.js +2 -0
  67. package/.next/server/app/api/tests/route.js.nft.json +1 -0
  68. package/.next/server/app/api/tests/route_client-reference-manifest.js +1 -0
  69. package/.next/server/app/api/update/route.js +2 -2
  70. package/.next/server/app/api/update/route.js.nft.json +1 -1
  71. package/.next/server/app/api/version/route.js +1 -1
  72. package/.next/server/app/api/version/route.js.nft.json +1 -1
  73. package/.next/server/app/api/web-auth/route.js +1 -1
  74. package/.next/server/app/api/workspaces/route.js +1 -1
  75. package/.next/server/app/api/workspaces/route.js.nft.json +1 -1
  76. package/.next/server/app/icon.svg/route.js +1 -1
  77. package/.next/server/app/index.html +1 -1
  78. package/.next/server/app/index.rsc +9 -6
  79. package/.next/server/app/index.segments/__PAGE__.segment.rsc +7 -4
  80. package/.next/server/app/index.segments/_full.segment.rsc +9 -6
  81. package/.next/server/app/index.segments/_tree.segment.rsc +5 -2
  82. package/.next/server/app/login/page.js +1 -1
  83. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  84. package/.next/server/app/login.html +1 -1
  85. package/.next/server/app/login.rsc +8 -5
  86. package/.next/server/app/login.segments/_full.segment.rsc +8 -5
  87. package/.next/server/app/login.segments/_tree.segment.rsc +5 -2
  88. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +6 -3
  89. package/.next/server/app/page.js +1 -1
  90. package/.next/server/app/page_client-reference-manifest.js +1 -1
  91. package/.next/server/app-paths-manifest.json +12 -9
  92. package/.next/server/chunks/496.js +1 -1
  93. package/.next/server/chunks/532.js +1 -1
  94. package/.next/server/chunks/686.js +6 -2
  95. package/.next/server/chunks/757.js +1 -0
  96. package/.next/server/chunks/775.js +3 -0
  97. package/.next/server/middleware-build-manifest.js +1 -1
  98. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  99. package/.next/server/pages/404.html +1 -1
  100. package/.next/server/pages/500.html +1 -1
  101. package/.next/server/server-reference-manifest.json +1 -1
  102. package/.next/static/0t1jBUAuVaTFTXxRyIo3q/_buildManifest.js +1 -0
  103. package/.next/static/chunks/2608.43c58236c9cce8e6.js +1 -0
  104. package/.next/static/chunks/{2716.a9e808190a4e2424.js → 2716.4ec42df1d51354c9.js} +1 -1
  105. package/.next/static/chunks/4632.62139b565b657aac.js +1 -0
  106. package/.next/static/chunks/{4673.d3d0a7f2599080fb.js → 4673.7796104395deb8d7.js} +1 -1
  107. package/.next/static/chunks/4686-17f21a006739a596.js +1 -0
  108. package/.next/static/chunks/7577.10af9bb661652da8.js +1 -0
  109. package/.next/static/chunks/8866.38ec4ac4ee5a1b74.js +1 -0
  110. package/.next/static/chunks/app/_global-error/page-5148173b3f55e415.js +1 -0
  111. package/.next/static/chunks/app/api/agent/[id]/events/route-5148173b3f55e415.js +1 -0
  112. package/.next/static/chunks/app/api/agent/[id]/route-5148173b3f55e415.js +1 -0
  113. package/.next/static/chunks/app/api/agent/[id]/tree/route-5148173b3f55e415.js +1 -0
  114. package/.next/static/chunks/app/api/agent/new/route-5148173b3f55e415.js +1 -0
  115. package/.next/static/chunks/app/api/config/route-5148173b3f55e415.js +1 -0
  116. package/.next/static/chunks/app/api/files/route-5148173b3f55e415.js +1 -0
  117. package/.next/static/chunks/app/api/git/route-5148173b3f55e415.js +1 -0
  118. package/.next/static/chunks/app/api/growth/route-5148173b3f55e415.js +1 -0
  119. package/.next/static/chunks/app/api/health/route-5148173b3f55e415.js +1 -0
  120. package/.next/static/chunks/app/api/models/route-5148173b3f55e415.js +1 -0
  121. package/.next/static/chunks/app/api/pi-settings/route-5148173b3f55e415.js +1 -0
  122. package/.next/static/chunks/app/api/plugins/route-5148173b3f55e415.js +1 -0
  123. package/.next/static/chunks/app/api/prompts/route-5148173b3f55e415.js +1 -0
  124. package/.next/static/chunks/app/api/security/route-5148173b3f55e415.js +1 -0
  125. package/.next/static/chunks/app/api/sessions/[id]/export/route-5148173b3f55e415.js +1 -0
  126. package/.next/static/chunks/app/api/sessions/[id]/route-5148173b3f55e415.js +1 -0
  127. package/.next/static/chunks/app/api/sessions/import/route-5148173b3f55e415.js +1 -0
  128. package/.next/static/chunks/app/api/sessions/route-5148173b3f55e415.js +1 -0
  129. package/.next/static/chunks/app/api/skills/route-5148173b3f55e415.js +1 -0
  130. package/.next/static/chunks/app/api/swarm/[id]/route-5148173b3f55e415.js +1 -0
  131. package/.next/static/chunks/app/api/swarm/route-5148173b3f55e415.js +1 -0
  132. package/.next/static/chunks/app/api/tests/route-5148173b3f55e415.js +1 -0
  133. package/.next/static/chunks/app/api/update/route-5148173b3f55e415.js +1 -0
  134. package/.next/static/chunks/app/api/version/route-5148173b3f55e415.js +1 -0
  135. package/.next/static/chunks/app/api/web-auth/route-5148173b3f55e415.js +1 -0
  136. package/.next/static/chunks/app/api/workspaces/route-5148173b3f55e415.js +1 -0
  137. package/.next/static/chunks/app/page-14379b8060d5cf07.js +1 -0
  138. package/.next/static/chunks/next/dist/client/components/builtin/app-error-5148173b3f55e415.js +1 -0
  139. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-5148173b3f55e415.js +1 -0
  140. package/.next/static/chunks/next/dist/client/components/builtin/not-found-5148173b3f55e415.js +1 -0
  141. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-5148173b3f55e415.js +1 -0
  142. package/.next/static/chunks/webpack-d1a69ad9edb38b11.js +1 -0
  143. package/.next/static/css/d0a0162cb481abe8.css +1 -0
  144. package/.next/types/app/api/swarm/[id]/route.ts +353 -0
  145. package/.next/types/app/api/swarm/route.ts +353 -0
  146. package/.next/types/app/api/tests/route.ts +353 -0
  147. package/.next/types/routes.d.ts +4 -1
  148. package/.next/types/validator.ts +27 -0
  149. package/README.md +61 -7
  150. package/assets/archive.png +0 -0
  151. package/assets/growth-1.png +0 -0
  152. package/assets/growth-2.png +0 -0
  153. package/assets/import.png +0 -0
  154. package/assets/main.png +0 -0
  155. package/assets/outline.png +0 -0
  156. package/assets/prompts-1.png +0 -0
  157. package/assets/prompts-2.png +0 -0
  158. package/assets/providers-1.png +0 -0
  159. package/assets/providers-2.png +0 -0
  160. package/assets/providers-3.png +0 -0
  161. package/assets/trace-1.png +0 -0
  162. package/assets/trace-2.png +0 -0
  163. package/assets/trace-3.png +0 -0
  164. package/assets/trace-4.png +0 -0
  165. package/assets/viewer-1.png +0 -0
  166. package/assets/viewer-2.png +0 -0
  167. package/next.config.ts +6 -2
  168. package/package.json +10 -5
  169. package/scripts/launcher.mjs +1 -1
  170. package/scripts/managed-niubash-assets.mjs +146 -0
  171. package/scripts/pick-folder.ps1 +11 -2
  172. package/scripts/prepare-niubash-packages.mjs +182 -0
  173. package/scripts/release.mjs +11 -31
  174. package/scripts/run-test-file.mjs +34 -0
  175. package/scripts/smoke-managed-niubash.mjs +62 -0
  176. package/scripts/verify-package.mjs +53 -0
  177. package/scripts/verify-release-config.mjs +24 -0
  178. package/src/app/api/config/route.ts +4 -1
  179. package/src/app/api/security/route.ts +8 -3
  180. package/src/app/api/swarm/[id]/route.ts +28 -0
  181. package/src/app/api/swarm/route.ts +24 -0
  182. package/src/app/api/tests/route.ts +27 -0
  183. package/src/app/api/update/route.ts +8 -2
  184. package/src/app/globals.css +777 -0
  185. package/src/app/layout.tsx +13 -6
  186. package/src/components/AppShell.tsx +505 -199
  187. package/src/components/ChatInput.tsx +153 -26
  188. package/src/components/ChatWindow.tsx +46 -40
  189. package/src/components/ContextMeter.tsx +11 -17
  190. package/src/components/FileViewer.tsx +1 -1
  191. package/src/components/GitPanel.tsx +13 -11
  192. package/src/components/ModelSelector.tsx +19 -6
  193. package/src/components/PiMark.tsx +5 -38
  194. package/src/components/ProjectPanel.tsx +1 -0
  195. package/src/components/PromptPanel.tsx +132 -51
  196. package/src/components/SessionImportSection.tsx +53 -37
  197. package/src/components/SessionSidebar.tsx +159 -57
  198. package/src/components/SettingsPanel.tsx +330 -193
  199. package/src/components/SwarmCoordinatorPod.tsx +1021 -0
  200. package/src/components/TestInspectorPod.tsx +549 -0
  201. package/src/components/icons.tsx +23 -0
  202. package/src/hooks/usePiWeb.ts +112 -8
  203. package/src/i18n.tsx +59 -3
  204. package/src/lib/agent-manager.ts +182 -11
  205. package/src/lib/command-validation.ts +9 -1
  206. package/src/lib/delegation.ts +93 -0
  207. package/src/lib/managed-niubash.ts +231 -0
  208. package/src/lib/pi.ts +3 -2
  209. package/src/lib/runtime-activity.ts +27 -0
  210. package/src/lib/session-import/claude.ts +13 -2
  211. package/src/lib/session-import/codex.ts +44 -8
  212. package/src/lib/session-import/files.ts +14 -0
  213. package/src/lib/session-import/grok.ts +54 -24
  214. package/src/lib/session-import/index.ts +5 -0
  215. package/src/lib/session-import/lock.ts +25 -0
  216. package/src/lib/session-import/types.ts +12 -0
  217. package/src/lib/session-import/writer.ts +8 -3
  218. package/src/lib/skills-service.ts +16 -9
  219. package/src/lib/swarm-service.ts +371 -0
  220. package/src/lib/test-run-service.ts +122 -0
  221. package/src/lib/theme.ts +68 -1
  222. package/src/lib/trajectory.ts +1 -0
  223. package/src/lib/types.ts +14 -0
  224. package/src/lib/workflow.ts +55 -0
  225. package/.next/static/LOFl9bqqMV2goBV8erESO/_buildManifest.js +0 -1
  226. package/.next/static/chunks/2608.ec8ff1f5767c9056.js +0 -1
  227. package/.next/static/chunks/4632.112d2e893d48d188.js +0 -1
  228. package/.next/static/chunks/4686-7d694def920ff093.js +0 -1
  229. package/.next/static/chunks/app/_global-error/page-f77e9ede9808b18e.js +0 -1
  230. package/.next/static/chunks/app/api/agent/[id]/events/route-f77e9ede9808b18e.js +0 -1
  231. package/.next/static/chunks/app/api/agent/[id]/route-f77e9ede9808b18e.js +0 -1
  232. package/.next/static/chunks/app/api/agent/[id]/tree/route-f77e9ede9808b18e.js +0 -1
  233. package/.next/static/chunks/app/api/agent/new/route-f77e9ede9808b18e.js +0 -1
  234. package/.next/static/chunks/app/api/config/route-f77e9ede9808b18e.js +0 -1
  235. package/.next/static/chunks/app/api/files/route-f77e9ede9808b18e.js +0 -1
  236. package/.next/static/chunks/app/api/git/route-f77e9ede9808b18e.js +0 -1
  237. package/.next/static/chunks/app/api/growth/route-f77e9ede9808b18e.js +0 -1
  238. package/.next/static/chunks/app/api/health/route-f77e9ede9808b18e.js +0 -1
  239. package/.next/static/chunks/app/api/models/route-f77e9ede9808b18e.js +0 -1
  240. package/.next/static/chunks/app/api/pi-settings/route-f77e9ede9808b18e.js +0 -1
  241. package/.next/static/chunks/app/api/plugins/route-f77e9ede9808b18e.js +0 -1
  242. package/.next/static/chunks/app/api/prompts/route-f77e9ede9808b18e.js +0 -1
  243. package/.next/static/chunks/app/api/security/route-f77e9ede9808b18e.js +0 -1
  244. package/.next/static/chunks/app/api/sessions/[id]/export/route-f77e9ede9808b18e.js +0 -1
  245. package/.next/static/chunks/app/api/sessions/[id]/route-f77e9ede9808b18e.js +0 -1
  246. package/.next/static/chunks/app/api/sessions/import/route-f77e9ede9808b18e.js +0 -1
  247. package/.next/static/chunks/app/api/sessions/route-f77e9ede9808b18e.js +0 -1
  248. package/.next/static/chunks/app/api/skills/route-f77e9ede9808b18e.js +0 -1
  249. package/.next/static/chunks/app/api/update/route-f77e9ede9808b18e.js +0 -1
  250. package/.next/static/chunks/app/api/version/route-f77e9ede9808b18e.js +0 -1
  251. package/.next/static/chunks/app/api/web-auth/route-f77e9ede9808b18e.js +0 -1
  252. package/.next/static/chunks/app/api/workspaces/route-f77e9ede9808b18e.js +0 -1
  253. package/.next/static/chunks/app/page-9a5440047c5a415c.js +0 -1
  254. package/.next/static/chunks/next/dist/client/components/builtin/app-error-f77e9ede9808b18e.js +0 -1
  255. package/.next/static/chunks/next/dist/client/components/builtin/forbidden-f77e9ede9808b18e.js +0 -1
  256. package/.next/static/chunks/next/dist/client/components/builtin/not-found-f77e9ede9808b18e.js +0 -1
  257. package/.next/static/chunks/next/dist/client/components/builtin/unauthorized-f77e9ede9808b18e.js +0 -1
  258. package/.next/static/chunks/webpack-d28e132e1b8c100c.js +0 -1
  259. package/.next/static/css/b2d35abc828d4713.css +0 -1
  260. package/assets/showcase.png +0 -0
  261. package/bin/pi.js +0 -50
  262. /package/.next/static/{LOFl9bqqMV2goBV8erESO → 0t1jBUAuVaTFTXxRyIo3q}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4673],{4673:(e,t,s)=>{s.r(t),s.d(t,{ProjectPanel:()=>c,stepTitle:()=>o});var n=s(5155),a=s(2115),l=s(2155),r=s(9992),i=s(1859);function o(e,t){return"baseline"===e.kind?t.growthKindBaseline:"turn"===e.kind?t.growthKindTurn:"external"===e.kind?t.growthKindExternal:"manual"===e.kind?e.label||t.growthKindManual:e.label||e.toolName||""}function d(e){let t=new Date(e);return`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}:${String(t.getSeconds()).padStart(2,"0")}`}function c({growth:e,workspaceName:t,cwd:s,hasSession:h,onOpenFile:g,onReference:p,onOpenEditor:u,gitRefreshKey:w=0,onAskCommit:x,onOpenGit:f,onClose:m,onError:b}){let{t:v}=(0,i.s)(),[y,j]=(0,a.useState)(""),[k,S]=(0,a.useState)(!1),[N,$]=(0,a.useState)(!1),[C,z]=(0,a.useState)(""),[E,R]=(0,a.useState)(null),U=E?.cwd===s?E.info:null,F=E?.cwd===s?E.error??U?.statusError:void 0;(0,a.useEffect)(()=>S(!1),[s]);let M=e.steps[e.steps.length-1]?.seq??0;(0,a.useEffect)(()=>{if(!s)return;let e=new AbortController,t=setTimeout(()=>{fetch(`/api/git?cwd=${encodeURIComponent(s)}`,{signal:e.signal,cache:"no-store"}).then(async t=>{let n=await t.json();if(!t.ok||!n.success)throw Error(n.error||`request failed (${t.status})`);e.signal.aborted||R({cwd:s,info:n.data})}).catch(t=>{e.signal.aborted||R({cwd:s,info:null,error:t instanceof Error?t.message:"failed to load git status"})})},250);return()=>{clearTimeout(t),e.abort()}},[s,w,M]);let T=(0,a.useMemo)(()=>{let t={added:0,modified:0,deleted:0,renamed:0};for(let s of"step"===e.scope?e.changes:e.sessionChanges)"A"===s.status?t.added+=1:"M"===s.status?t.modified+=1:"D"===s.status?t.deleted+=1:t.renamed+=1;return t},[e.scope,e.changes,e.sessionChanges]),{steps:D,selectedRound:A,rounds:P}=e,K=(0,a.useRef)(null),B=(0,a.useMemo)(()=>Math.max(1,...P.map(e=>e.steps.filter(e=>"turn"!==e.kind).length)),[P]);(0,a.useEffect)(()=>{A&&K.current?.querySelector(`[data-round="${A.id}"]`)?.scrollIntoView({block:"nearest",inline:"nearest"})},[A]);let L=A?P.findIndex(e=>e.id===A.id):-1,_=A?A.recorded?A.steps.every(e=>"turn"===e.kind)?v.growthNoChangesRound:o(A.steps.find(e=>"turn"!==e.kind)??A.last,v):v.growthUnrecorded:"",q=U?.files.filter(e=>"conflict"===e.kind).length??0,I=U?.files.filter(e=>"conflict"!==e.kind&&" "!==e.indexStatus).length??0,O=U?.files.filter(e=>"conflict"!==e.kind&&" "!==e.workStatus&&"untracked"!==e.kind).length??0,Q=U?.files.filter(e=>"untracked"===e.kind).length??0;(0,a.useEffect)(()=>{if(!C)return;let e=setTimeout(()=>z(""),2500);return()=>clearTimeout(e)},[C]);let G=async()=>{if(!N){$(!0);try{await e.snapshotNow()||z(v.growthSnapshotNone)}catch(e){b(e instanceof Error?e.message:"failed")}finally{$(!1)}}},W=s&&h?e.loading&&!D.length?v.growthLoading:e.available?D.length?void 0:v.growthNoSteps:v.growthUnavailable:v.growthNoSession;return(0,n.jsxs)("div",{className:"pw-project flex h-full min-h-0 flex-col","data-testid":"project-panel",children:[(0,n.jsxs)("div",{className:"flex items-center gap-1.5 px-3 pt-3 pb-1.5",children:[(0,n.jsx)("span",{className:"min-w-0 flex-1 truncate",style:{fontSize:13,fontWeight:600},title:s,children:t||v.projectPanel}),h&&(0,n.jsx)("button",{className:"icon-btn",style:{width:22,height:22},title:v.growthSnapshotNow,onClick:()=>void G(),disabled:N,children:(0,n.jsx)(r.Ct,{size:13,className:N?"piweb-spin":void 0})}),(0,n.jsx)("button",{className:"icon-btn",style:{width:22,height:22},title:v.close,onClick:m,children:(0,n.jsx)(r.Bh,{size:13})})]}),s&&h&&!e.available&&!e.loading&&(0,n.jsx)("div",{className:"mx-3 mb-2 rounded-lg px-2 py-1",style:{fontSize:11.5,color:"var(--dsw-warn)",background:"var(--dsw-hover)"},role:"status",children:v.growthUnavailableFallback}),F&&(0,n.jsx)("div",{className:"mx-3 mb-2 rounded-lg px-2 py-1",style:{fontSize:11.5,color:"var(--dsw-danger)"},title:F,role:"alert","data-testid":"growth-git-error",children:v.gitStatusUnknown}),U?.isRepo&&!F&&(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-x-2 gap-y-1 px-3 pb-2",style:{fontSize:11.5,color:"var(--dsw-label-secondary)"},"data-testid":"growth-git-summary",children:[(0,n.jsx)(r.Je,{size:13,style:{flex:"none",color:"var(--dsw-label-caption)"}}),(0,n.jsx)("span",{className:"max-w-[45%] truncate",style:{fontWeight:600,color:"var(--dsw-label-primary)"},title:U.branch??void 0,children:U.detached?v.gitDetached:U.branch??"Git"}),U.ahead>0&&(0,n.jsxs)("span",{title:v.gitAhead.replace("{n}",String(U.ahead)),children:["↑",U.ahead]}),U.behind>0&&(0,n.jsxs)("span",{title:v.gitBehind.replace("{n}",String(U.behind)),children:["↓",U.behind]}),U.files.length?(0,n.jsxs)("span",{className:"min-w-0 flex-1 truncate",title:`${q?`${v.gitConflict} ${q} \xb7 `:""}${v.gitStaged} ${I} \xb7 ${v.gitUnstaged} ${O} \xb7 ${v.gitUntracked} ${Q}`,children:[q>0&&(0,n.jsxs)("span",{style:{color:"var(--dsw-danger)"},children:[v.gitConflict," ",q," "]}),I>0&&(0,n.jsxs)("span",{style:{color:"var(--dsw-success)"},children:[v.gitStaged," ",I," "]}),O>0&&(0,n.jsxs)("span",{style:{color:"var(--dsw-warn)"},children:[v.gitUnstaged," ",O," "]}),Q>0&&(0,n.jsxs)("span",{children:[v.gitUntracked," ",Q]})]}):(0,n.jsx)("span",{className:"min-w-0 flex-1 truncate",children:v.gitNoChanges}),U.files.length>0&&x&&(0,n.jsx)("button",{type:"button",className:"pw-chip",onClick:x,children:v.gitAskCommit}),f&&(0,n.jsx)("button",{type:"button",className:"pw-chip",onClick:f,children:v.gitDetails})]}),(0,n.jsxs)("div",{className:"flex items-center gap-2 px-3 pb-2",style:{fontSize:11.5},children:[(0,n.jsx)("span",{className:"pw-seg",role:"radiogroup",children:["step","session"].map(t=>(0,n.jsx)("button",{type:"button",role:"radio","aria-checked":e.scope===t,"data-active":e.scope===t,onClick:()=>e.setScope(t),children:"step"===t?v.growthScopeStep:v.growthScopeSession},t))}),(0,n.jsx)("span",{className:"min-w-0 flex-1 truncate",style:{color:"var(--dsw-label-caption)"},title:`${v.growthStatA} ${T.added} \xb7 ${v.growthStatM} ${T.modified} \xb7 ${v.growthStatD} ${T.deleted} \xb7 ${v.growthStatR} ${T.renamed}`,children:C?(0,n.jsx)("span",{style:{color:"var(--dsw-label-secondary)"},children:C}):(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("span",{style:{color:"var(--dsw-success)"},children:["+",T.added]})," ",(0,n.jsxs)("span",{style:{color:"var(--dsw-warn)"},children:["~",T.modified]})," ",(0,n.jsxs)("span",{style:{color:"var(--dsw-danger)"},children:["−",T.deleted]}),T.renamed?(0,n.jsxs)("span",{style:{color:"var(--dsw-accent)"},children:[" ⇄",T.renamed]}):null]})}),(0,n.jsx)("button",{type:"button",className:"pw-chip","data-active":k,"aria-pressed":k,onClick:()=>{S(e=>!e)},children:v.growthOnlyChanges})]}),(0,n.jsxs)("div",{className:"mx-3 mb-1.5 flex items-center gap-1.5 rounded-lg px-2",style:{background:"var(--dsw-hover)",height:26},children:[(0,n.jsx)(r.FG,{size:12,style:{flex:"none",color:"var(--dsw-label-caption)"}}),(0,n.jsx)("input",{value:y,onChange:e=>j(e.target.value),placeholder:v.growthFilter,className:"min-w-0 flex-1 bg-transparent",style:{fontSize:12},onKeyDown:e=>{"Escape"===e.key&&j("")}}),y&&(0,n.jsx)("button",{type:"button",className:"icon-btn",style:{width:16,height:16},onClick:()=>j(""),"aria-label":v.close,children:(0,n.jsx)(r.Bh,{size:10})})]}),e.error&&(0,n.jsx)("div",{className:"mx-3 mb-1 rounded-lg px-2 py-1 break-words",style:{fontSize:11,color:"var(--dsw-danger)",background:"var(--dsw-hover)"},role:"alert",children:e.error}),e.selected?.truncated&&"step"===e.scope&&(0,n.jsx)("div",{className:"mx-3 mb-1 rounded-lg px-2 py-1",style:{fontSize:11,color:"var(--dsw-warn)",background:"var(--dsw-hover)"},children:v.growthTruncated}),A&&!A.recorded&&(0,n.jsx)("div",{className:"mx-3 mb-1 rounded-lg px-2 py-1",style:{fontSize:11,color:"var(--dsw-label-caption)",background:"var(--dsw-hover)"},role:"status",children:v.growthUnrecorded}),(0,n.jsx)(l.Q,{tree:e.tree,expanded:e.expanded,fresh:e.fresh,filter:y,onlyChanges:k&&D.length>1,onToggleDir:e.toggleDir,onExpandLazy:e.expandLazy,onOpenFile:g,onReference:p,onOpenEditor:u,emptyText:W}),h&&(0,n.jsxs)("div",{className:"pw-timeline hairline-t","data-testid":"growth-timeline",children:[P.length>0&&(0,n.jsx)("div",{ref:K,className:"pw-tl-rail",children:P.map(t=>{let s=t.steps.filter(e=>"turn"!==e.kind).length,a=Math.max(4,Math.round(s/B*24)),l=t.steps.find(e=>"turn"!==e.kind)??t.last;return(0,n.jsx)("button",{type:"button",className:"pw-tl-bar","data-round":t.id,"data-active":A?.id===t.id||void 0,style:{height:a,background:l&&t.recorded?function(e){if("baseline"===e.kind)return"var(--dsw-label-caption)";if("external"===e.kind)return"var(--dsw-accent)";let t=e.stats;return t.deleted&&t.deleted>=t.added&&t.deleted>=t.modified?"var(--dsw-danger)":t.added>=t.modified?"var(--dsw-success)":"var(--dsw-warn)"}(l):"var(--dsw-label-caption)"},title:`${v.growthRoundLabel.replace("{n}",String(t.id))} \xb7 ${t.recorded?s?o(l,v):v.growthNoChangesRound:v.growthUnrecorded} \xb7 ${d(t.last?.ts??t.startedAt)} \xb7 ${v.growthStepsCount.replace("{n}",String(s))}`,onClick:()=>e.selectRound(t.id)},t.id)})}),(0,n.jsxs)("div",{className:"flex items-center gap-1 px-2 pb-2 pt-1",style:{fontSize:11.5},children:[(0,n.jsx)("button",{className:"icon-btn",style:{width:20,height:20},title:v.growthPrev,onClick:e.prev,disabled:L<=0,children:(0,n.jsx)(r.bQ,{size:12})}),(0,n.jsx)("button",{className:"icon-btn",style:{width:20,height:20},title:v.growthNext,onClick:e.next,disabled:L<0||L>=P.length-1,children:(0,n.jsx)(r.QY,{size:12})}),(0,n.jsx)("span",{className:"min-w-0 flex-1 truncate",style:{color:"var(--dsw-label-secondary)"},title:A?`${_} \xb7 ${d(A.last?.ts??A.startedAt)}`:void 0,children:A?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("span",{style:{color:"var(--dsw-label-caption)"},children:v.growthRoundPosition.replace("{current}",String(L+1)).replace("{total}",String(P.length))})," ",_]}):v.growthRoundPosition.replace("{current}","0").replace("{total}","0")}),(0,n.jsx)("button",{type:"button",className:"pw-chip","data-active":e.following,onClick:e.follow,title:v.growthFollow,children:e.following?v.growthFollowing:v.growthFollow})]})]})]})}}}]);
1
+ "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4673],{4673:(e,t,s)=>{s.r(t),s.d(t,{ProjectPanel:()=>c,stepTitle:()=>o});var n=s(5155),a=s(2115),l=s(2155),r=s(9992),i=s(1859);function o(e,t){return"baseline"===e.kind?t.growthKindBaseline:"turn"===e.kind?t.growthKindTurn:"external"===e.kind?t.growthKindExternal:"manual"===e.kind?e.label||t.growthKindManual:e.label||e.toolName||""}function d(e){let t=new Date(e);return`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}:${String(t.getSeconds()).padStart(2,"0")}`}function c({growth:e,workspaceName:t,cwd:s,hasSession:h,onOpenFile:g,onReference:p,onOpenEditor:u,gitRefreshKey:w=0,onAskCommit:x,onOpenGit:f,onClose:m,onError:b}){let{t:v}=(0,i.s)(),[y,j]=(0,a.useState)(""),[k,S]=(0,a.useState)(!1),[N,$]=(0,a.useState)(!1),[C,z]=(0,a.useState)(""),[E,R]=(0,a.useState)(null),U=E?.cwd===s?E.info:null,F=E?.cwd===s?E.error??U?.statusError:void 0;(0,a.useEffect)(()=>S(!1),[s]);let M=e.steps[e.steps.length-1]?.seq??0;(0,a.useEffect)(()=>{if(!s)return;let e=new AbortController,t=setTimeout(()=>{fetch(`/api/git?cwd=${encodeURIComponent(s)}`,{signal:e.signal,cache:"no-store"}).then(async t=>{let n=await t.json();if(!t.ok||!n.success)throw Error(n.error||`request failed (${t.status})`);e.signal.aborted||R({cwd:s,info:n.data})}).catch(t=>{e.signal.aborted||R({cwd:s,info:null,error:t instanceof Error?t.message:"failed to load git status"})})},250);return()=>{clearTimeout(t),e.abort()}},[s,w,M]);let T=(0,a.useMemo)(()=>{let t={added:0,modified:0,deleted:0,renamed:0};for(let s of"step"===e.scope?e.changes:e.sessionChanges)"A"===s.status?t.added+=1:"M"===s.status?t.modified+=1:"D"===s.status?t.deleted+=1:t.renamed+=1;return t},[e.scope,e.changes,e.sessionChanges]),{steps:D,selectedRound:A,rounds:P}=e,K=(0,a.useRef)(null),B=(0,a.useMemo)(()=>Math.max(1,...P.map(e=>e.steps.filter(e=>"turn"!==e.kind).length)),[P]);(0,a.useEffect)(()=>{A&&K.current?.querySelector(`[data-round="${A.id}"]`)?.scrollIntoView({block:"nearest",inline:"nearest"})},[A]);let L=A?P.findIndex(e=>e.id===A.id):-1,_=A?A.recorded?A.steps.every(e=>"turn"===e.kind)?v.growthNoChangesRound:o(A.steps.find(e=>"turn"!==e.kind)??A.last,v):v.growthUnrecorded:"",q=U?.files.filter(e=>"conflict"===e.kind).length??0,I=U?.files.filter(e=>"conflict"!==e.kind&&" "!==e.indexStatus).length??0,O=U?.files.filter(e=>"conflict"!==e.kind&&" "!==e.workStatus&&"untracked"!==e.kind).length??0,Q=U?.files.filter(e=>"untracked"===e.kind).length??0;(0,a.useEffect)(()=>{if(!C)return;let e=setTimeout(()=>z(""),2500);return()=>clearTimeout(e)},[C]);let G=async()=>{if(!N){$(!0);try{await e.snapshotNow()||z(v.growthSnapshotNone)}catch(e){b(e instanceof Error?e.message:"failed")}finally{$(!1)}}},W=s&&h?e.loading&&!D.length?v.growthLoading:e.available?D.length?void 0:v.growthNoSteps:v.growthUnavailable:v.growthNoSession;return(0,n.jsxs)("div",{className:"pw-project flex h-full min-h-0 flex-col","data-testid":"project-panel",children:[(0,n.jsxs)("div",{className:"flex items-center gap-1.5 px-3 pt-3 pb-1.5",children:[(0,n.jsx)("span",{className:"min-w-0 flex-1 truncate",style:{fontSize:13,fontWeight:600},title:s,children:t||v.projectPanel}),h&&(0,n.jsx)("button",{className:"icon-btn",style:{width:22,height:22},title:v.growthSnapshotNow,onClick:()=>void G(),disabled:N,children:(0,n.jsx)(r.Ct,{size:13,className:N?"piweb-spin":void 0})}),(0,n.jsx)("button",{className:"icon-btn",style:{width:22,height:22},title:v.close,onClick:m,children:(0,n.jsx)(r.Bh,{size:13})})]}),s&&h&&!e.available&&!e.loading&&(0,n.jsx)("div",{className:"mx-3 mb-2 rounded-lg px-2 py-1",style:{fontSize:11.5,color:"var(--dsw-warn)",background:"var(--dsw-hover)"},role:"status",children:v.growthUnavailableFallback}),F&&(0,n.jsx)("div",{className:"mx-3 mb-2 rounded-lg px-2 py-1",style:{fontSize:11.5,color:"var(--dsw-danger)"},title:F,role:"alert","data-testid":"growth-git-error",children:v.gitStatusUnknown}),U?.isRepo&&!F&&(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-x-2 gap-y-1 px-3 pb-2",style:{fontSize:11.5,color:"var(--dsw-label-secondary)"},"data-testid":"growth-git-summary",children:[(0,n.jsx)(r.Je,{size:13,style:{flex:"none",color:"var(--dsw-label-caption)"}}),(0,n.jsx)("span",{className:"max-w-[45%] truncate",style:{fontWeight:600,color:"var(--dsw-label-primary)"},title:U.branch??void 0,children:U.detached?v.gitDetached:U.branch??"Git"}),U.ahead>0&&(0,n.jsxs)("span",{title:v.gitAhead.replace("{n}",String(U.ahead)),children:["↑",U.ahead]}),U.behind>0&&(0,n.jsxs)("span",{title:v.gitBehind.replace("{n}",String(U.behind)),children:["↓",U.behind]}),U.files.length?(0,n.jsxs)("span",{className:"min-w-0 flex-1 truncate",title:`${q?`${v.gitConflict} ${q} \xb7 `:""}${v.gitStaged} ${I} \xb7 ${v.gitUnstaged} ${O} \xb7 ${v.gitUntracked} ${Q}`,children:[q>0&&(0,n.jsxs)("span",{style:{color:"var(--dsw-danger)"},children:[v.gitConflict," ",q," "]}),I>0&&(0,n.jsxs)("span",{style:{color:"var(--dsw-success)"},children:[v.gitStaged," ",I," "]}),O>0&&(0,n.jsxs)("span",{style:{color:"var(--dsw-warn)"},children:[v.gitUnstaged," ",O," "]}),Q>0&&(0,n.jsxs)("span",{children:[v.gitUntracked," ",Q]})]}):(0,n.jsx)("span",{className:"min-w-0 flex-1 truncate",children:v.gitNoChanges}),U.files.length>0&&x&&(0,n.jsx)("button",{type:"button",className:"pw-chip",onClick:x,children:v.gitAskCommit}),f&&(0,n.jsx)("button",{type:"button",className:"pw-chip",onClick:f,children:v.gitDetails})]}),(0,n.jsxs)("div",{className:"flex items-center gap-2 px-3 pb-2",style:{fontSize:11.5},children:[(0,n.jsx)("span",{className:"pw-seg",role:"radiogroup",children:["step","session"].map(t=>(0,n.jsx)("button",{type:"button",role:"radio","aria-checked":e.scope===t,"data-active":e.scope===t,onClick:()=>e.setScope(t),children:"step"===t?v.growthScopeStep:v.growthScopeSession},t))}),(0,n.jsx)("span",{className:"min-w-0 flex-1 truncate",style:{color:"var(--dsw-label-caption)"},title:`${v.growthStatA} ${T.added} \xb7 ${v.growthStatM} ${T.modified} \xb7 ${v.growthStatD} ${T.deleted} \xb7 ${v.growthStatR} ${T.renamed}`,children:C?(0,n.jsx)("span",{style:{color:"var(--dsw-label-secondary)"},children:C}):(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("span",{style:{color:"var(--dsw-success)"},children:["+",T.added]})," ",(0,n.jsxs)("span",{style:{color:"var(--dsw-warn)"},children:["~",T.modified]})," ",(0,n.jsxs)("span",{style:{color:"var(--dsw-danger)"},children:["−",T.deleted]}),T.renamed?(0,n.jsxs)("span",{style:{color:"var(--dsw-accent)"},children:[" ⇄",T.renamed]}):null]})}),(0,n.jsx)("button",{type:"button",className:"pw-chip","data-active":k,"aria-pressed":k,onClick:()=>{S(e=>!e)},children:v.growthOnlyChanges})]}),(0,n.jsxs)("div",{className:"mx-3 mb-1.5 flex items-center gap-1.5 rounded-lg px-2",style:{background:"var(--dsw-hover)",height:26},children:[(0,n.jsx)(r.FG,{size:12,style:{flex:"none",color:"var(--dsw-label-caption)"}}),(0,n.jsx)("input",{value:y,onChange:e=>j(e.target.value),"aria-label":v.growthFilter,placeholder:v.growthFilter,className:"min-w-0 flex-1 bg-transparent",style:{fontSize:12},onKeyDown:e=>{"Escape"===e.key&&j("")}}),y&&(0,n.jsx)("button",{type:"button",className:"icon-btn",style:{width:16,height:16},onClick:()=>j(""),"aria-label":v.close,children:(0,n.jsx)(r.Bh,{size:10})})]}),e.error&&(0,n.jsx)("div",{className:"mx-3 mb-1 rounded-lg px-2 py-1 break-words",style:{fontSize:11,color:"var(--dsw-danger)",background:"var(--dsw-hover)"},role:"alert",children:e.error}),e.selected?.truncated&&"step"===e.scope&&(0,n.jsx)("div",{className:"mx-3 mb-1 rounded-lg px-2 py-1",style:{fontSize:11,color:"var(--dsw-warn)",background:"var(--dsw-hover)"},children:v.growthTruncated}),A&&!A.recorded&&(0,n.jsx)("div",{className:"mx-3 mb-1 rounded-lg px-2 py-1",style:{fontSize:11,color:"var(--dsw-label-caption)",background:"var(--dsw-hover)"},role:"status",children:v.growthUnrecorded}),(0,n.jsx)(l.Q,{tree:e.tree,expanded:e.expanded,fresh:e.fresh,filter:y,onlyChanges:k&&D.length>1,onToggleDir:e.toggleDir,onExpandLazy:e.expandLazy,onOpenFile:g,onReference:p,onOpenEditor:u,emptyText:W}),h&&(0,n.jsxs)("div",{className:"pw-timeline hairline-t","data-testid":"growth-timeline",children:[P.length>0&&(0,n.jsx)("div",{ref:K,className:"pw-tl-rail",children:P.map(t=>{let s=t.steps.filter(e=>"turn"!==e.kind).length,a=Math.max(4,Math.round(s/B*24)),l=t.steps.find(e=>"turn"!==e.kind)??t.last;return(0,n.jsx)("button",{type:"button",className:"pw-tl-bar","data-round":t.id,"data-active":A?.id===t.id||void 0,style:{height:a,background:l&&t.recorded?function(e){if("baseline"===e.kind)return"var(--dsw-label-caption)";if("external"===e.kind)return"var(--dsw-accent)";let t=e.stats;return t.deleted&&t.deleted>=t.added&&t.deleted>=t.modified?"var(--dsw-danger)":t.added>=t.modified?"var(--dsw-success)":"var(--dsw-warn)"}(l):"var(--dsw-label-caption)"},title:`${v.growthRoundLabel.replace("{n}",String(t.id))} \xb7 ${t.recorded?s?o(l,v):v.growthNoChangesRound:v.growthUnrecorded} \xb7 ${d(t.last?.ts??t.startedAt)} \xb7 ${v.growthStepsCount.replace("{n}",String(s))}`,onClick:()=>e.selectRound(t.id)},t.id)})}),(0,n.jsxs)("div",{className:"flex items-center gap-1 px-2 pb-2 pt-1",style:{fontSize:11.5},children:[(0,n.jsx)("button",{className:"icon-btn",style:{width:20,height:20},title:v.growthPrev,onClick:e.prev,disabled:L<=0,children:(0,n.jsx)(r.bQ,{size:12})}),(0,n.jsx)("button",{className:"icon-btn",style:{width:20,height:20},title:v.growthNext,onClick:e.next,disabled:L<0||L>=P.length-1,children:(0,n.jsx)(r.QY,{size:12})}),(0,n.jsx)("span",{className:"min-w-0 flex-1 truncate",style:{color:"var(--dsw-label-secondary)"},title:A?`${_} \xb7 ${d(A.last?.ts??A.startedAt)}`:void 0,children:A?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("span",{style:{color:"var(--dsw-label-caption)"},children:v.growthRoundPosition.replace("{current}",String(L+1)).replace("{total}",String(P.length))})," ",_]}):v.growthRoundPosition.replace("{current}","0").replace("{total}","0")}),(0,n.jsx)("button",{type:"button",className:"pw-chip","data-active":e.following,onClick:e.follow,title:v.growthFollow,children:e.following?v.growthFollowing:v.growthFollow})]})]})]})}}}]);
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4686],{1859:(e,t,o)=>{o.d(t,{I18nProvider:()=>l,s:()=>d});var n=o(5155),i=o(2115);let a={confirm:"确认",cancel:"取消",delete:"删除",rename:"重命名",renameSession:"重命名会话",renameWorkspace:"重命名工作区",sessionActions:"会话操作",workspaceActions:"工作区操作",search:"搜索",save:"保存",close:"关闭",error:"出错",copy:"复制",copyFailed:"复制失败",editMessage:"编辑这条消息",sendEdit:"重新发送",editMessageFailed:"编辑重发失败",export:"导出",settings:"设置",newChat:"新会话",reconnecting:"连接中断,正在重连…",sessionListLoadFailed:"会话列表加载失败",retry:"重试",compacting:"正在压缩上下文…",compactionComplete:"上下文压缩完成",compactionFailed:"上下文压缩失败",pickWorkspaceFirst:"请先选择工作区",capacityFields:"容量",contextWindowLabel:"上下文窗口",maxTokensLabel:"最大输出",capacityHint:"留空用默认 \xb7 支持 256K / 2M 写法",capacityInvalid:"第 {n} 行:容量需为数字(可用 K/M)",discoverEmpty:"远端没有返回可识别的模型",candidateTitle:"发现 {count} 个模型,勾选要添加的",candidateAll:"全选",candidatePicked:"已选 {n} 个",candidateAdopt:"添加 {n} 个",runningTool:"Running {name}…",thinkingLive:"Thinking",stepRunning:"Running",stepRan:"已运行",stepRead:"读取",stepSearched:"搜索",stepEdited:"编辑了",stepWrote:"写入了",resultRead:"读取了 {n} 行",resultFound:"找到 {n} 处",resultWrote:"{n} 行",sumThought:"思考了 {d}",sumRan:"运行了 {n} 条命令",sumRan1:"运行了 {n} 条命令",sumRead:"读了 {n} 个文件",sumRead1:"读了 {n} 个文件",sumSearched:"搜索了 {n} 次",sumSearched1:"搜索了 {n} 次",sumJoin:",",toolLines:"{n} 行",toolMatches:"{n} 个匹配",toolExit:"退出码 {code}",toolWritten:"已写入",diffSummary:"+{add} −{del} 行",deletedFile:"已删除 {path}",backToBottom:"回到底部",modeSteer:"插话",modeQueue:"排队",workflowAgent:"Agent",workflowPlan:"Plan",workflowGoal:"Goal",workflowMenu:"选择工作模式",workflowClear:"退出工作模式",workflowPlanPlaceholder:"规划改动…",workflowGoalPlaceholder:"描述要达成的目标…",workflowAgentHint:"直接执行任务",workflowPlanHint:"先只读规划,确认后执行",workflowGoalHint:"围绕目标持续推进并验证",planReady:"方案已就绪,等待你确认",planReadyHint:"确认后开始修改代码并验证结果",planRefine:"调整方案",planApproving:"正在启动…",planApprovalFailed:"启动失败,请重试",planApprove:"执行方案",goalActive:"当前目标",sendSteer:"插话:当前工具跑完就送达",sendQueue:"排队:本轮结束后发送",queueEdit:"↑ 取回编辑",queueDrop:"丢弃",viewInTrajectory:"在轨迹中查看",turnRanFor:"耗时 {duration}",durationSeconds:"{seconds} 秒",durationMinutes:"{minutes} 分 {seconds} 秒",clockMd:"{m}月{d}日",clockYmd:"{y}年{m}月{d}日",turnUsageTitle:"本回合用量",filesPanel:"文件",outline:"大纲",moreActions:"更多",filesFilter:"筛选文件…",filesShowAll:"显示 node_modules 等",filesHideNoise:"隐藏 node_modules 等",fileReference:"引用到输入框",fileOpenEditor:"在编辑器中打开",fileChangedByPi:"本会话中被 pi 修改",fileRenderMarkdown:"渲染",fileRawSource:"源码",gitUnavailable:"未找到 git 命令,请确认已安装并加入 PATH。",gitUpstream:"上游 {name}",gitNoUpstream:"无上游分支",gitConflict:"冲突",gitAskCommit:"让 pi 提交",gitDetails:"Git 详情",gitAskCommitPrompt:"请检查当前工作区的变更,把相关改动分组提交,写清晰的 commit message。",gitDiffEmpty:"没有差异",gitDiffTruncated:"差异过长,已截断",gitBinary:"二进制文件,不显示差异",gitStagedDiff:"暂存区差异",gitWorktreeDiff:"工作区差异",gitNoCommits:"尚无提交",gitBack:"返回",gitPanel:"Git",panelRefresh:"刷新",panelLoading:"加载中…",filesEmpty:"空目录",filesBack:"返回",fileBinary:"二进制文件,不提供预览",filePreviewTruncated:"文件较大,仅显示前 256 KB",entriesTruncated:"目录条目过多,仅显示前 2000 项",gitNotRepo:"此工作区不是 Git 仓库。",gitDetached:"分离头指针",gitAhead:"领先 {n}",gitBehind:"落后 {n}",gitStaged:"已暂存",gitUnstaged:"未暂存",gitUntracked:"未跟踪",gitNoChanges:"工作区干净,没有变更",gitStatusUnknown:"Git 状态读取失败,无法确认是否有变更",gitRecentCommits:"最近提交",toolNoOutput:"无输出",toolFailed:"失败",thinkingClamped:"当前模型不支持「{requested}」,已改为「{level}」",modelError:"模型返回错误",modelErrorTimes:"连续 {n} 次",modelErrorRateLimit:"限流:请求过于频繁,稍等片刻再试",modelErrorBilling:"余额或配额不足",modelErrorAuth:"鉴权失败:检查该供应商的 API Key",modelErrorNotFound:"模型不存在或当前 Key 无权访问",modelErrorContext:"上下文超出模型窗口,可用 /compact 压缩后重试",modelErrorTimeout:"请求超时",modelErrorServer:"供应商服务端出错或过载",modelErrorModeration:"请求内容被供应商审核拦截(敏感词),换措辞或新开会话试试",modelErrorNetwork:"网络连接失败",turnAborted:"已中止",moreLines:"还有 {n} 行",commandLines:"{n} 行脚本",thinkLabel:"思考",expandOutput:"展开全部输出",collapseOutput:"收起",workspaces:"工作区",searchSessions:"搜索会话...",addWorkspace:"添加工作区",groupBy:"分组方式",sortBy:"排序方式",byWorkspace:"按工作区",flatList:"单列表",manualOrder:"按创建时间",recentUpdated:"最近更新",newSessionHere:"在此工作区新会话",removeWorkspace:"从列表移除",deleteWorkspace:"删除工作区",deleteWorkspaceConfirm:"将把“{name}”从工作区列表中移除。文件夹与会话记录会保留,其会话将显示在“未分组”下。",deleteWorkspacePending:"正在删除工作区…",workspaceNameConflict:"已存在名为“{name}”的工作区。",ungrouped:"未分组",forkSession:"在新对话中分支",archiveSession:"归档会话",unarchiveSession:"取消归档",archivedSessions:"已归档",deleteAllSessions:"删除全部会话",deleteAllConfirm:"删除此工作区的全部会话?不可恢复。",contextInject:"上下文注入",autoCompact:"自动压缩",settingsLoading:"正在读取设置…",settingsLoadFailed:"设置读取失败;未显示默认值。请重试。",settingsSaveFailed:"设置未保存,请检查输入或网络后重试。",settingsRetry:"重试",autoCompactDesc:"上下文超出阈值时自动压缩历史",reserveTokens:"保留 Token",keepRecentTokens:"近期保留",autoRetry:"自动重试",autoRetryDesc:"请求失败后的自动重试",maxRetries:"最大重试次数",baseDelayMs:"初始延迟 (ms)",reloadExtensions:"重载全部扩展",cycleModel:"循环切换模型",cycleModelHint:"循环模型(Shift 点击切换到前一个)",branches:"分支",noBranches:"暂无可跳转的分支节点",oauthLogin:"OAuth 登录",authMethod:"认证方式",loginTitle:"登录 PiWeb",loginDesc:"输入 PI_WEB_PASSWORD 设置的密码以继续",loginPassword:"密码",loginSubmit:"登录",loginSubmitting:"登录中…",loginFailed:"密码错误",webAuth:"密码认证",webAuthOn:"已启用(PI_WEB_PASSWORD)",webAuthOff:"未启用(仅本机可访问)",logout:"退出登录",logoutFailed:"退出登录失败,请检查网络后重试。",authMethodApiKey:"API 密钥",oauthDevicePrompt:"请在浏览器中完成授权",oauthOpenAuth:"打开授权页面",oauthDeviceCode:"设备码",oauthCodeCopied:"已复制",usageQuotaLabel:"API 配额",usageRequests:"请求",usageRefresh:"刷新配额",usageProbe:"检测配额",usageProbing:"检测中…",usageProbeDisclosure:"检测会向 xAI 发送一次可能计费的最小请求。",usageProbeFailed:"配额检测失败,未获得用量信息。",usagePlan:"套餐",usageQuotaRemaining:"额度剩余",queryingQuota:"正在查询额度…",usageReadOnlyDisclosure:"读取提供商的只读用量端点,不消耗额度。",usageReset:"刷新时间",usageWindowWeekly:"周限",usageWindowMonthly:"月限",usageWindowHours:"{n} 小时",usageWindowDays:"{n} 天",usageWindowRolling:"滚动窗口",usageWindowChat:"对话",usageWindowCompletions:"补全",usageWindowPremium:"高级请求",usageVariantOpus:"Opus",usageVariantCode:"代码",usageBalanceGranted:"赠金",usageBalanceToppedUp:"充值",usageBalanceVoucher:"代金券",usageBalanceCash:"现金",usageBalanceUsed:"已用",usageBalanceLimit:"上限",oauthWait:"等待授权…",oauthCancel:"取消登录",noSessions:"暂无会话",startWith:"新建工作区",heroTitle:"让想法落到代码。",heroDescription:"规划、执行、验证。一个专注于交付的轻量工作台。",inputPlaceholder:"给 pi 发消息…",thinking:"思考",thinkingOff:"关闭",model:"模型",selectModel:"选择模型",triggerLoading:"正在加载模型…",blockedComposer:"当前模型不可用,请先选择模型",emptyModels:"没有可用的模型。",modelsLoading:"正在加载模型…",modelsLoadFailed:"模型列表加载失败。",emptyEfforts:"当前模型未提供推理等级。",thinkingUnsupported:"此模型不支持",thinkingUnsupportedHint:'模型没有声明推理能力。自定义模型请在 ~/.pi/agent/models.json 里给该模型加 "reasoning": true(可选 thinkingLevelMap 指定档位)',toolReadonly:"Read Only",toolStandard:"Workspace Write",toolFull:"Full access",stop:"停止",send:"发送",imageAttachment:"图片附件",imageTooLarge:"单张图片不能超过 20 MB",imageCountLimit:"一次最多添加 20 张图片",imageTypeUnsupported:"仅支持 JPEG、PNG、WebP 和 GIF 图片",dropToAttach:"松开添加附件",dropToAttachHint:"图片直接附到消息;其他文件(压缩包/文档等)保存后以路径引用,模型可用工具读取",dropLimits:"图片 ≤ 20MB \xb7 最多 20 张 \xb7 其他文件 ≤ 100MB \xb7 最多 16 个",uploading:"正在上传…",uploadFailed:"上传失败",uploadTooLarge:"单个文件不能超过 100 MB",uploadCountLimit:"一次最多添加 16 个文件",attachmentLine:"附件:{path}({size})",cmdMenu:"命令",slashCatalog:"命令与技能",skillType:"技能",cmdCompact:"压缩更早的对话历史",cmdExport:"下载本会话日志",cmdModel:"选择本会话使用的模型",cmdNew:"新建会话",cmdFork:"分叉会话",cmdReload:"重载扩展、技能与提示模板(pi /reload)",promptType:"模板",extensionCmdType:"扩展",cmdUnknown:"没有这个命令:/{name}。可用命令见输入框的 / 菜单",extensionDialogTag:"扩展",extensionStatus:"扩展状态",contextUsed:"上下文已用",contextUnknown:"上下文用量未知",contextSystem:"系统提示词",contextMessages:"对话消息",contextTools:"工具",promptPanel:"提示词来源",promptRefresh:"刷新",promptLoading:"加载中…",promptColdHint:"会话尚未启动:先列出磁盘上的提示词文件;打开会话后才会出现「组装后的系统提示词」与工具定义。",promptOriginProject:"项目",promptOriginAgent:"个人",promptOriginPackage:"包",promptOriginExtension:"扩展",promptKindSystem:"系统提示词文件",promptKindAppend:"追加提示词",promptKindAgents:"项目记忆(AGENTS.md)",promptKindSkill:"技能提示词",promptKindTemplate:"提示模板",promptKindTool:"工具提示词",promptKindAssembled:"系统提示词",promptKindCompacted:"压缩摘要",promptCompactedKey:"进入上下文的压缩摘要",promptGuidelines:"提示词指南",promptParameters:"参数定义",promptAssembledKey:"当前生效的系统提示词",promptToolBuiltin:"内置",promptToolExtension:"扩展",contextSystemPrompt:"System Prompt",contextSystemTools:"System Tools",contextCustomTools:"Custom Tools",contextMemory:"Memory(AGENTS.md)",contextSkills:"Skills",contextUserMessages:"User Messages",contextAgentText:"Agent Text",contextAgentThinking:"Agent Thinking",contextAgentToolCall:"Agent Tool Call",contextToolOutput:"Tool Output",contextCompacted:"Compacted Data",contextAutoCompactBuffer:"自动压缩预留(非占用)",contextFreeSpace:"剩余空间",contextEstimateNote:"总量由 Pi 估算;下方分类按字符估算,不可相加。",turns:"轮次",toolCalls:"工具调用",cost:"花费",duration:"耗时",cacheHits:"缓存命中",statsCounts:"{turns} 轮 \xb7 {steps} 步",ttftAverage:"首 token 平均",inputTokens:"输入",outputTokens:"输出",tabChat:"对话",tabTrajectory:"轨迹",sessionLog:"Session log",sessionDetails:"会话详情",exportJsonl:"导出 JSONL",trajTimeline:"时间轴",trajModeSeq:"等距",trajModeTime:"时间",trajModeDur:"间隔",trajEmpty:"本会话还没有轨迹记录",trajSearchPlaceholder:"搜索轨迹",trajNoMatch:"没有匹配的轨迹记录",trajInput:"输入",trajModel:"模型",trajTools:"工具",trajOutput:"输出",trajThink:"思考",trajTime:"时间",trajTurn:"轮次",trajSystem:"系统",trajSession:"会话",trajSummary:"摘要",trajPreview:"预览",trajRaw:"原始",trajSource:"来源",trajStatus:"状态",trajCompleted:"已完成",trajFailed:"失败",trajStarted:"开始时间",trajTokens:"Token 用量",trajNoContent:"此记录没有可显示的内容",encodingLossWarning:"这段历史工具输出在写入时已经损坏,无法恢复的行已隐藏。当前 Pi SDK 已对新的 PowerShell 输出强制使用 UTF-8。",ttft:"首 token",decode:"解码",inspector:"记录详情",setGeneral:"通用设置",setModels:"模型",enterBehavior:"繁忙时 Enter 键行为",enterBehaviorDesc:"仅在 pi 运行时生效;Ctrl/Cmd+Enter 用另一种方式发送",enterQueue:"排队:本轮结束后发送",enterSteer:"插话:当前工具跑完就送达",setSkills:"技能",importSessions:"导入会话",importDesc:"把本机 Codex / Claude Code / Grok / ZCode / dsh / opencode 的对话无损导入成 pi 会话:文本、思考、工具调用与结果、时间戳、用量都保留。源项目目录还在本机就导回原工作区,否则落到下面选的兜底工作区。只读源数据,不修改源工具的任何文件。",importRescan:"重新扫描",importScanning:"扫描中…",importSourceClaude:"Claude Code",importSourceCodex:"Codex",importSourceGrok:"Grok",importSourceZcode:"ZCode",importSourceDsh:"dsh",importSourceOpencode:"opencode",importSourceError:"{source} 扫描失败:{message}",importGroupCount:"{n} 条 \xb7 已导入 {imported}",importPickSource:"选择来源",importLimitHint:"每个来源只列最近 {n} 条对话(更早的会话不扫描,省时省资源)",importLimitHintTooltip:"看更早的会话:把 src/lib/session-import/index.ts 里的 SCAN_LIMIT_PER_SOURCE 调大",importSelectAll:"全选本组",importSelectNone:"清空本组",importClearSelection:"清空选择",importRun:"导入所选 ({n})",importRunning:"导入中…",importFallbackWorkspace:"兜底工作区",importAlready:"已导入",importUntitled:"(无标题)",importNoProject:"(无项目目录)",importMessages:"{n} 条消息",importEmpty:"没有找到可导入的本地会话",importReportSummary:"成功 {imported} \xb7 跳过 {skipped} \xb7 失败 {failed}",setPlugins:"插件",appearance:"外观",appearanceMode:"亮暗模式",themeLight:"浅色",themeDark:"深色",themeSystem:"跟随系统",themeSilverSteel:"银钢",themeLimestoneCoal:"石灰与煤炭",themeLinenMoss:"亚麻与苔绿",themeNordPaper:"北欧纸墨",themePebrel:"Pebrel",themeDsh:"海与墨",themePiWeb:"PiWeb \xb7 工作台",fontSize:"正文字号",fontUiSize:"界面字体",fontUiSizeDesc:"侧栏、按钮、标签等界面文字",fontChatSize:"对话字体",fontChatSizeDesc:"消息正文、用户气泡与输入框",language:"界面语言",openConfigFile:"打开配置文件",providerAuthOk:"已配置",providerReady:"请求认证可用",authUnavailable:"凭据不可用",credentialSource:"凭据:{source}",authSourceRuntime:"运行时",authSourceEnvironment:"环境变量",authSourceCommand:"models.json 命令",authSourceProvider:"Provider 配置",apiKey:"API Key",apiKeyStored:"已保存;留空保持不变",providerIdImmutable:"Provider ID 创建后不可修改;如需更名,请删除后重建。",modelConfigReopen:"模型配置已保存。新建会话或重启 PiWeb 后,当前运行时才能使用新配置。",customModelIdentityNotice:"自定义模型 ID 只是发往该 API 地址的路由名;PiWeb 不会自动下载、接入或识别本机 Ollama 模型。",customApiKeyHint:"可留空改用 auth.json;指向本机/私网的无鉴权服务(Ollama 等)保存时自动填占位值。",modelsTitle:"模型",modelsDesc:"填入各提供方的 API 密钥即可使用其模型。",addProvider:"添加提供方",addCustomProvider:"添加自定义提供方",customProviderTitle:"自定义提供方",edit:"编辑",customBadge:"自定义",providerLabel:"提供方",apiType:"API 类型",modelsList:"模型(每行一个 ID)",baseUrl:"Base URL",apiAddress:"API 地址",apiProtocol:"API 协议",apiKeyOptional:"输入 API 密钥,或留空使用环境认证",customSettings:"自定义设置",providerDefault:"提供方默认",selectProvider:"选择提供方",searchProviders:"搜索提供方名称或 ID",noProviderMatches:"没有匹配的提供方",modelCount:"{count} 个模型",providerId:"Provider ID",providerIdHint:"以小写字母开头的标识,在请求中唯一标识该提供方,并用于派生凭据名。",providerIdInvalid:"只能使用小写字母、数字和单个连字符分段。",providerIdTaken:"该 Provider ID 已存在。",displayName:"显示名称",displayNameOptional:"显示名称(可选)",modelCatalog:"模型目录",discoverModels:"获取可用模型",allowPrivateDiscovery:"允许本机/私网",allowPrivateHint:"模型地址指向本机或私有网络(如 Ollama、LM Studio、one-api 本地网关)时勾选,本次探测放行;发消息不受此限制",discoveringModels:"获取中...",usingDefaultModels:"正在使用 Pi SDK 默认模型 \xb7 {count} 个",customModelsRequired:"至少添加一个可发送的模型 ID",modelCatalogEmptyBuiltin:"未添加覆盖模型;模型选择器会继续实时使用 Pi SDK 的官方模型目录。",modelCatalogEmptyCustom:"模型选择器中将不显示任何模型;请至少添加一个模型 ID。",addModel:"添加模型",modelId:"模型 ID",createProvider:"创建提供方",saving:"保存中...",setKey:"保存 Key",removeKey:"移除 Key",removeOAuth:"移除 OAuth",confirmRemoveOAuth:"确定移除“{name}”的 OAuth 登录吗?移除后需重新登录才能使用。",confirmRemoveProvider:"确定删除提供方“{name}”及其配置吗?",confirmRemoveKey:"确定移除“{name}”的已保存密钥吗?",customProviders:"自定义 Provider(models.json)",toolsSection:"工具启用情况",toolsSectionDesc:"三档预设决定新会话的默认工具;打开会话后可逐个启停当前会话的工具(仅本会话生效)。",toolsCurrentSession:"当前会话",toolsActiveCount:"{n}/{total} 已启用",toolsNoSession:"打开一个会话后,这里会显示可用工具并支持逐个启停。",securityToolPreset:"权限",securityToolPresetDesc:"切换当前会话工具集;Workspace Write 包含 bash,并非文件系统沙箱",securityTrust:"项目信任",securityTrustDesc:"首次进入含 .pi/ 资源的项目时是否自动信任(写入 pi settings.json)",trustAsk:"每次询问",trustAlways:"总是信任",trustNever:"从不信任",versionPiweb:"PiWeb 版本",versionPiwebDesc:"本 Web 应用的版本,点击打开仓库",versionPi:"Pi 版本",versionPiDesc:"pi 智能体内核的版本,点击打开仓库",checkUpdate:"检查更新",checkingUpdate:"检查中…",upToDate:"已是最新",updateTo:"更新到 {v}",updatingNow:"更新中…",updatedTo:"已更新到 {v},重启 PiWeb 后生效",updateFailed:"更新失败",updateManualHint:"先停止 piweb,再执行上面的命令(Windows 无法替换运行中的安装目录)",skillsDesc:"关闭后技能不会出现在系统提示中,仅可通过 /skill:名称 手动调用",skillsLoading:"正在加载技能…",skillsEmpty:"当前工作区没有可用技能",confirmDeleteSkill:"确定删除技能“{name}”吗?将删除其所在技能目录,不可恢复。",deleteSkillHint:"删除技能目录",skillDeletePackageHint:"包技能请用禁用管理",scopeGlobal:"全局",scopeProject:"项目",scopePackage:"包",viewSkillFile:"查看 SKILL.md",packages:"已安装的 pi 包",packagesEmpty:"尚未安装任何 pi 包",addPackage:"安装 pi 包",addPackagePlaceholder:"npm:包名 / git:https://… / 本地路径",installLocal:"安装到当前项目(-l)",install:"安装",uninstall:"卸载",confirmUninstallPackage:"确定卸载“{source}”吗?",update:"更新",pluginConfig:"插件配置",pluginList:"插件列表",pluginPageDesc:"配置和查看本部署已安装的插件。",searchPlugins:"搜索插件",enabled:"已启用",disabled:"已停用",enablePlugin:"启用",disablePlugin:"停用",updating:"正在更新...",uninstalling:"正在卸载...",updateSuccess:"更新成功",uninstallSuccess:"已卸载",extensionsEmpty:"没有已加载的扩展",extensionLoadError:"加载失败",resourceDiagnostics:"资源诊断",installing:"正在安装…",installSuccess:"已安装并加载",reloadedSessions:"已重载:{loaders} 个加载器 \xb7 {sessions} 个会话",projectTrustBanner:"此项目含 .pi/ 扩展或技能,pi 需要你的信任才会加载并执行它们",projectTrustBannerNever:"此项目的 .pi/ 扩展与技能已被设为不信任,不会加载",projectTrustAllow:"信任并加载",projectTrustDeny:"不信任",projectTrustForget:"重新询问",projectTrustTrusted:"项目已信任",projectTrustUntrusted:"项目未信任",resources:"携带",toastSaved:"已保存",toastError:"操作失败",running:"运行中",projectPanel:"项目",growthScopeStep:"本步",growthScopeSession:"本会话",growthOnlyChanges:"只看变更",growthFollow:"跟随",growthFollowing:"跟随中",growthPrev:"上一轮",growthNext:"下一轮",growthRoundPosition:"第 {current}/{total} 轮",growthSnapshotNow:"立即快照",growthSnapshotNone:"没有变化",growthNoSteps:"还没有快照。发一条消息让 pi 开始工作,项目的变化会在这里逐步出现。",growthLoading:"正在加载快照…",growthUnrecorded:"此轮发生在生长快照启用前,改动未记录",growthNoChangesRound:"本轮无文件改动",growthNoSession:"打开或新建一个会话后,这里会显示项目的生长过程。",growthUnavailable:"机器上找不到 git,项目生长功能不可用",growthUnavailableFallback:"生长快照不可用(找不到可用的 git),已显示当前目录结构",growthStepLabel:"第 {n} 步",growthRoundLabel:"第 {n} 轮",growthStepsCount:"{n} 步",growthKindBaseline:"会话基线",growthKindTurn:"回合结束",growthKindExternal:"外部修改",growthKindManual:"手动快照",growthStatA:"新增",growthStatM:"修改",growthStatD:"删除",growthStatR:"重命名",growthPending:"生成中",growthLazyDir:"当前磁盘条目,不在所选快照中",growthTruncated:"这一步变更过多,只显示前 2000 条",growthExpandAll:"展开全部",growthCollapseAll:"收起全部",growthFilter:"筛选…",viewerModeDiff:"变更",viewerModeContent:"内容",viewerModeRender:"渲染",viewerFold:"折叠未改动",viewerUnfold:"展开未改动",viewerFoldedLines:"\xb7\xb7\xb7 {n} 行未改动 \xb7\xb7\xb7",viewerPrevChange:"上一处改动",viewerNextChange:"下一处改动",viewerFullscreen:"全屏",viewerExitFullscreen:"退出全屏",viewerQuickOpen:"输入文件名打开…",viewerQuickOpenEmpty:"没有匹配的文件",viewerNoChanges:"这一范围内此文件没有变化",viewerDeleted:"此文件在本轮被删除,显示的是删除前的内容",viewerHistorical:"此文件已不在当前快照中,显示最近一次记录的内容",viewerMissing:"此文件已不在当前快照或磁盘中",viewerPatchTruncated:"差异过大,已截断",viewerCloseTab:"关闭页签",viewerNotInSnapshot:"此文件不在快照里(超过 1MB 或被排除),显示磁盘上的当前内容",viewerLoadFailed:"加载失败",viewerEmpty:"从左侧树里选择一个文件"},s={zh:a,en:{confirm:"Confirm",cancel:"Cancel",delete:"Delete",rename:"Rename",renameSession:"Rename session",renameWorkspace:"Rename workspace",sessionActions:"Session actions",workspaceActions:"Workspace actions",search:"Search",save:"Save",close:"Close",error:"Error",copy:"Copy",copyFailed:"Copy failed",editMessage:"Edit this message",sendEdit:"Send again",editMessageFailed:"Edit and resend failed",export:"Export",settings:"Settings",newChat:"New session",reconnecting:"Connection lost, reconnecting…",sessionListLoadFailed:"Failed to load sessions",retry:"Retry",compacting:"Compacting context…",compactionComplete:"Context compaction complete",compactionFailed:"Context compaction failed",pickWorkspaceFirst:"Select a workspace first",capacityFields:"Capacities",contextWindowLabel:"Context window",maxTokensLabel:"Max output",capacityHint:"blank = default \xb7 256K / 2M accepted",capacityInvalid:"Row {n}: capacity must be a number (K/M ok)",discoverEmpty:"No recognizable models returned",candidateTitle:"Found {count} models — pick ones to add",candidateAll:"Select all",candidatePicked:"{n} selected",candidateAdopt:"Add {n}",runningTool:"Running {name}…",thinkingLive:"Thinking",stepRunning:"Running",stepRan:"Ran",stepRead:"Read",stepSearched:"Searched",stepEdited:"Edited",stepWrote:"Wrote",resultRead:"Read {n} lines",resultFound:"Found {n} matches",resultWrote:"{n} lines",sumThought:"Thought for {d}",sumRan:"ran {n} shell commands",sumRan1:"ran {n} shell command",sumRead:"read {n} files",sumRead1:"read {n} file",sumSearched:"searched {n} times",sumSearched1:"searched once",sumJoin:", ",toolLines:"{n} lines",toolMatches:"{n} matches",toolExit:"exit {code}",toolWritten:"written",diffSummary:"+{add} −{del} lines",deletedFile:"deleted {path}",backToBottom:"Back to bottom",modeSteer:"steer",modeQueue:"queue",workflowAgent:"Agent",workflowPlan:"Plan",workflowGoal:"Goal",workflowMenu:"Choose workflow mode",workflowClear:"Leave workflow mode",workflowPlanPlaceholder:"Plan changes…",workflowGoalPlaceholder:"Describe the goal…",workflowAgentHint:"Execute the task directly",workflowPlanHint:"Plan read-only, then request approval",workflowGoalHint:"Pursue and verify an objective",planReady:"Plan ready for your approval",planReadyHint:"Confirm to make changes and verify the result",planRefine:"Refine plan",planApproving:"Starting…",planApprovalFailed:"Could not start. Try again.",planApprove:"Execute plan",goalActive:"Current goal",sendSteer:"Steer: delivered after the current tool call",sendQueue:"Queue: sent after this turn ends",queueEdit:"↑ Edit queued",queueDrop:"Discard",viewInTrajectory:"View in trajectory",turnRanFor:"ran for {duration}",durationSeconds:"{seconds}s",durationMinutes:"{minutes}m {seconds}s",clockMd:"{m}/{d}",clockYmd:"{y}/{m}/{d}",turnUsageTitle:"Turn usage",filesPanel:"Files",outline:"Outline",moreActions:"More",filesFilter:"Filter files…",filesShowAll:"Show node_modules etc.",filesHideNoise:"Hide node_modules etc.",fileReference:"Reference in composer",fileOpenEditor:"Open in editor",fileChangedByPi:"Modified by pi in this session",fileRenderMarkdown:"Render",fileRawSource:"Source",gitUnavailable:"git command not found. Install it and make sure it is on PATH.",gitUpstream:"upstream {name}",gitNoUpstream:"no upstream",gitConflict:"Conflicts",gitAskCommit:"Ask pi to commit",gitDetails:"Git details",gitAskCommitPrompt:"Review the current changes, group related edits into commits, and write clear commit messages.",gitDiffEmpty:"No differences",gitDiffTruncated:"Diff truncated",gitBinary:"Binary file, no diff shown",gitStagedDiff:"Staged diff",gitWorktreeDiff:"Working tree diff",gitNoCommits:"No commits yet",gitBack:"Back",gitPanel:"Git",panelRefresh:"Refresh",panelLoading:"Loading…",filesEmpty:"Empty directory",filesBack:"Back",fileBinary:"Binary file, no preview",filePreviewTruncated:"Large file, showing first 256 KB only",entriesTruncated:"Too many entries, showing first 2000",gitNotRepo:"This workspace is not a Git repository.",gitDetached:"detached HEAD",gitAhead:"ahead {n}",gitBehind:"behind {n}",gitStaged:"Staged",gitUnstaged:"Unstaged",gitUntracked:"Untracked",gitNoChanges:"Working tree clean",gitStatusUnknown:"Git status unavailable; changes could not be determined",gitRecentCommits:"Recent commits",toolNoOutput:"no output",toolFailed:"failed",thinkingClamped:'This model does not support "{requested}"; using "{level}" instead',modelError:"Model returned an error",modelErrorTimes:"{n} times in a row",modelErrorRateLimit:"Rate limited: too many requests, wait a moment and retry",modelErrorBilling:"Insufficient balance or quota",modelErrorAuth:"Authentication failed: check this provider's API key",modelErrorNotFound:"Model not found or not accessible with this key",modelErrorContext:"Context exceeds the model window; try /compact and retry",modelErrorTimeout:"Request timed out",modelErrorServer:"Provider server error or overloaded",modelErrorModeration:"Request blocked by the provider's content filter (sensitive words); rephrase or start a new session",modelErrorNetwork:"Network connection failed",turnAborted:"Aborted",moreLines:"{n} more lines",commandLines:"{n}-line script",thinkLabel:"Thought",expandOutput:"Show full output",collapseOutput:"Collapse",workspaces:"Workspaces",searchSessions:"Search sessions...",addWorkspace:"Add workspace",groupBy:"Group by",sortBy:"Sort by",byWorkspace:"Workspace",flatList:"Flat list",manualOrder:"Created",recentUpdated:"Recently updated",newSessionHere:"New session here",removeWorkspace:"Remove from list",deleteWorkspace:"Delete workspace",deleteWorkspaceConfirm:'Remove "{name}" from the workspace list. Folders and session records will be retained, and its sessions will be displayed under "Ungrouped".',deleteWorkspacePending:"Deleting workspace...",workspaceNameConflict:'A workspace named "{name}" already exists.',ungrouped:"Ungrouped",forkSession:"Fork session",archiveSession:"Archive session",unarchiveSession:"Unarchive",archivedSessions:"Archived",deleteAllSessions:"Delete all sessions",deleteAllConfirm:"Delete ALL sessions in this workspace? This cannot be undone.",contextInject:"Context",autoCompact:"Auto compaction",settingsLoading:"Loading settings…",settingsLoadFailed:"Settings could not be loaded. Defaults are not shown; please retry.",settingsSaveFailed:"Settings were not saved. Check the value or connection and retry.",settingsRetry:"Retry",autoCompactDesc:"Automatically compact history when context exceeds the threshold",reserveTokens:"Reserve tokens",keepRecentTokens:"Keep recent",autoRetry:"Auto retry",autoRetryDesc:"Automatically retry failed requests",maxRetries:"Max retries",baseDelayMs:"Initial delay (ms)",reloadExtensions:"Reload all extensions",cycleModel:"Cycle model",cycleModelHint:"Cycle model (Shift-click for previous)",branches:"Branches",noBranches:"No branch points available",oauthLogin:"OAuth login",authMethod:"Authentication",loginTitle:"Sign in to PiWeb",loginDesc:"Enter the password configured in PI_WEB_PASSWORD to continue",loginPassword:"Password",loginSubmit:"Sign in",loginSubmitting:"Signing in…",loginFailed:"Incorrect password",webAuth:"Password auth",webAuthOn:"Enabled (PI_WEB_PASSWORD)",webAuthOff:"Disabled (local access only)",logout:"Sign out",logoutFailed:"Could not sign out. Check your connection and retry.",authMethodApiKey:"API key",oauthDevicePrompt:"Finish authorization in your browser",oauthOpenAuth:"Open authorization page",oauthDeviceCode:"Device code",oauthCodeCopied:"Copied",usageQuotaLabel:"API quota",usageRequests:"Requests",usageRefresh:"Refresh quota",usageProbe:"Check quota",usageProbing:"Checking…",usageProbeDisclosure:"Checking sends one minimal request to xAI that may be billed.",usageProbeFailed:"Quota check failed; no usage data was returned.",usagePlan:"Plan",usageQuotaRemaining:"Remaining quota",queryingQuota:"Querying quota…",usageReadOnlyDisclosure:"Reads the provider's read-only usage endpoint; consumes no quota.",usageReset:"Resets",usageWindowWeekly:"Weekly",usageWindowMonthly:"Monthly",usageWindowHours:"{n}h",usageWindowDays:"{n}d",usageWindowRolling:"Rolling",usageWindowChat:"Chat",usageWindowCompletions:"Completions",usageWindowPremium:"Premium requests",usageVariantOpus:"Opus",usageVariantCode:"Code",usageBalanceGranted:"Granted",usageBalanceToppedUp:"Topped up",usageBalanceVoucher:"Voucher",usageBalanceCash:"Cash",usageBalanceUsed:"Used",usageBalanceLimit:"Limit",oauthWait:"Waiting for authorization…",oauthCancel:"Cancel login",noSessions:"No sessions yet",startWith:"New workspace",heroTitle:"Move ideas into working code.",heroDescription:"Plan, execute, verify. A focused workbench for shipping.",inputPlaceholder:"Message pi…",thinking:"Thinking",thinkingOff:"Off",model:"Model",selectModel:"Select model",triggerLoading:"Loading models…",blockedComposer:"This model is unavailable — select one to continue",emptyModels:"No models available.",modelsLoading:"Loading models…",modelsLoadFailed:"Could not load models.",emptyEfforts:"This model provides no reasoning effort levels.",thinkingUnsupported:"Not supported by this model",thinkingUnsupportedHint:'The model does not declare reasoning support. For custom models, add "reasoning": true (optionally a thinkingLevelMap) to the model in ~/.pi/agent/models.json',toolReadonly:"Read Only",toolStandard:"Workspace Write",toolFull:"Full access",stop:"Stop",send:"Send",imageAttachment:"Image attachment",imageTooLarge:"Each image must be 20 MB or smaller",imageCountLimit:"You can attach up to 20 images",imageTypeUnsupported:"Only JPEG, PNG, WebP, and GIF images are supported",dropToAttach:"Drop to attach",dropToAttachHint:"Images attach to the message; other files (archives, documents) are saved and referenced by path for the agent to read",dropLimits:"Images ≤ 20MB \xb7 up to 20 \xb7 Other files ≤ 100MB \xb7 up to 16",uploading:"Uploading…",uploadFailed:"Upload failed",uploadTooLarge:"Each file must be 100 MB or smaller",uploadCountLimit:"You can attach up to 16 files",attachmentLine:"Attachment: {path} ({size})",cmdMenu:"Commands",slashCatalog:"Commands and skills",skillType:"Skill",cmdCompact:"Compact older conversation history",cmdExport:"Download this session log",cmdModel:"Select the model for this session",cmdNew:"Start a new session",cmdFork:"Fork this session",cmdReload:"Reload extensions, skills and prompt templates (pi /reload)",promptType:"Template",extensionCmdType:"Extension",cmdUnknown:"Unknown command: /{name}. See the / menu in the composer for available commands",extensionDialogTag:"Extension",extensionStatus:"Extension status",contextUsed:"context used",contextUnknown:"Context usage unknown",contextSystem:"System prompt",contextMessages:"Messages",contextTools:"Tools",promptPanel:"Prompt sources",promptRefresh:"Refresh",promptLoading:"Loading…",promptColdHint:"Session not started yet: disk files are listed now; the assembled system prompt and tool definitions appear once the session is running.",promptOriginProject:"project",promptOriginAgent:"user",promptOriginPackage:"package",promptOriginExtension:"extension",promptKindSystem:"System prompt file",promptKindAppend:"Appended prompt",promptKindAgents:"Project memory (AGENTS.md)",promptKindSkill:"Skill prompts",promptKindTemplate:"Prompt templates",promptKindTool:"Tool prompts",promptKindAssembled:"System prompt",promptKindCompacted:"Compaction summary",promptCompactedKey:"Compaction summary in context",promptGuidelines:"Prompt guidelines",promptParameters:"Parameter schema",promptAssembledKey:"Effective system prompt",promptToolBuiltin:"builtin",promptToolExtension:"extension",contextSystemPrompt:"System Prompt",contextSystemTools:"System Tools",contextCustomTools:"Custom Tools",contextMemory:"Memory (AGENTS.md)",contextSkills:"Skills",contextUserMessages:"User Messages",contextAgentText:"Agent Text",contextAgentThinking:"Agent Thinking",contextAgentToolCall:"Agent Tool Call",contextToolOutput:"Tool Output",contextCompacted:"Compacted Data",contextAutoCompactBuffer:"Auto-compact reserve (not used)",contextFreeSpace:"Free Space",contextEstimateNote:"Pi estimates total usage; content categories are rough estimates and do not add up.",turns:"turns",toolCalls:"tool calls",cost:"cost",duration:"duration",cacheHits:"cache hits",statsCounts:"{turns} turns \xb7 {steps} steps",ttftAverage:"TTFT avg",inputTokens:"Input",outputTokens:"Output",tabChat:"Chat",tabTrajectory:"Trajectory",sessionLog:"Session log",sessionDetails:"Session details",exportJsonl:"Export JSONL",trajTimeline:"Timeline",trajModeSeq:"Sequence",trajModeTime:"Time",trajModeDur:"Duration",trajEmpty:"No trajectory records yet",trajSearchPlaceholder:"Search trajectory",trajNoMatch:"No matching trajectory records",trajInput:"Input",trajModel:"Model",trajTools:"Tools",trajOutput:"Output",trajThink:"Think",trajTime:"Time",trajTurn:"Turn",trajSystem:"System",trajSession:"Session",trajSummary:"Summary",trajPreview:"Preview",trajRaw:"Raw",trajSource:"Source",trajStatus:"Status",trajCompleted:"Completed",trajFailed:"Failed",trajStarted:"Started",trajTokens:"Token usage",trajNoContent:"This record has no displayable content",encodingLossWarning:"This historical tool output was already damaged when saved. Unrecoverable lines are hidden; the current Pi SDK forces new PowerShell output to UTF-8.",ttft:"TTFT",decode:"Decode",inspector:"Record inspector",setGeneral:"General",setModels:"Models",enterBehavior:"Enter while busy",enterBehaviorDesc:"Only while pi is running; Ctrl/Cmd+Enter sends the other way",enterQueue:"Queue: sent after this turn ends",enterSteer:"Steer: delivered after the current tool call",setSkills:"Skills",importSessions:"Import sessions",importDesc:"Losslessly import conversations from Codex / Claude Code / Grok / ZCode / dsh / opencode on this machine into pi sessions: text, thinking, tool calls and results, timestamps and usage are all kept. If the original project directory still exists locally the session lands in that workspace; otherwise it falls back to the workspace selected below. Source data is only read, never modified.",importRescan:"Rescan",importScanning:"Scanning…",importSourceClaude:"Claude Code",importSourceCodex:"Codex",importSourceGrok:"Grok",importSourceZcode:"ZCode",importSourceDsh:"dsh",importSourceOpencode:"opencode",importSourceError:"{source} scan failed: {message}",importGroupCount:"{n} sessions \xb7 {imported} imported",importPickSource:"Choose a source",importLimitHint:"Only the {n} most recent conversations per source are scanned",importLimitHintTooltip:"To see older sessions, raise SCAN_LIMIT_PER_SOURCE in src/lib/session-import/index.ts",importSelectAll:"Select group",importSelectNone:"Clear group",importClearSelection:"Clear",importRun:"Import selected ({n})",importRunning:"Importing…",importFallbackWorkspace:"Fallback workspace",importAlready:"Imported",importUntitled:"(untitled)",importNoProject:"(no project directory)",importMessages:"{n} messages",importEmpty:"No importable local sessions found",importReportSummary:"Imported {imported} \xb7 skipped {skipped} \xb7 failed {failed}",setPlugins:"Plugins",appearance:"Appearance",appearanceMode:"Light / Dark",themeLight:"Light",themeDark:"Dark",themeSystem:"System",themeSilverSteel:"Silver & Steel",themeLimestoneCoal:"Limestone & Coal",themeLinenMoss:"Linen & Moss",themeNordPaper:"Nord & Paper",themePebrel:"Pebrel",themeDsh:"Sea & Ink",themePiWeb:"PiWeb \xb7 Workbench",fontSize:"Font size",fontUiSize:"UI font size",fontUiSizeDesc:"Sidebar, buttons, labels and other UI text",fontChatSize:"Chat font size",fontChatSizeDesc:"Message body, user bubbles and the composer",language:"Language",openConfigFile:"Open config file",providerAuthOk:"Configured",providerReady:"Request authentication ready",authUnavailable:"Credentials unavailable",credentialSource:"Credential: {source}",authSourceRuntime:"runtime",authSourceEnvironment:"environment",authSourceCommand:"models.json command",authSourceProvider:"provider config",apiKey:"API Key",apiKeyStored:"Saved; leave blank to keep it",providerIdImmutable:"A Provider ID cannot be changed after creation. Delete and recreate it to rename it.",modelConfigReopen:"Model configuration saved. Start a new session or restart PiWeb before using it in the current runtime.",customModelIdentityNotice:"A custom model ID is only a route name sent to that API endpoint. PiWeb does not automatically download, attach, or identify local Ollama models.",customApiKeyHint:"Leave blank to use auth.json. Keyless local/private services (Ollama etc.) get a placeholder key automatically on save.",modelsTitle:"Models",modelsDesc:"Enter an API key for each provider to use its models.",addProvider:"Add provider",addCustomProvider:"Add custom provider",customProviderTitle:"Custom provider",edit:"Edit",customBadge:"Custom",providerLabel:"Provider",apiType:"API type",modelsList:"Models (one ID per line)",baseUrl:"Base URL",apiAddress:"API address",apiProtocol:"API protocol",apiKeyOptional:"Enter an API key, or leave blank to use environment authentication",customSettings:"Custom settings",providerDefault:"Provider default",selectProvider:"Select provider",searchProviders:"Search provider name or ID",noProviderMatches:"No matching providers",modelCount:"{count} models",providerId:"Provider ID",providerIdHint:"A lowercase identifier that uniquely identifies this provider in requests and derives its credential name.",providerIdInvalid:"Use lowercase letters, numbers, and single hyphen-separated segments only.",providerIdTaken:"This Provider ID already exists.",displayName:"Display name",displayNameOptional:"Display name (optional)",modelCatalog:"Model catalog",discoverModels:"Fetch available models",allowPrivateDiscovery:"Allow local/private",allowPrivateHint:"Check this when the model address points to loopback or a private network (Ollama, LM Studio, one-api gateways) to allow this probe; chat requests are not affected",discoveringModels:"Fetching...",usingDefaultModels:"Using Pi SDK default models \xb7 {count}",customModelsRequired:"Add at least one model ID that can be sent",modelCatalogEmptyBuiltin:"No model overrides. The model selector will continue using Pi SDK's live official catalog.",modelCatalogEmptyCustom:"No models will appear in the selector. Add at least one model ID.",addModel:"Add model",modelId:"Model ID",createProvider:"Create provider",saving:"Saving...",setKey:"Save key",removeKey:"Remove key",removeOAuth:"Remove OAuth",confirmRemoveOAuth:'Remove the OAuth login for "{name}"? You will need to log in again to use it.',confirmRemoveProvider:'Delete provider "{name}" and its configuration?',confirmRemoveKey:'Remove the saved key for "{name}"?',customProviders:"Custom providers (models.json)",toolsSection:"Tools",toolsSectionDesc:"The preset picks the default tools for new sessions; with a session open you can toggle its tools individually (current session only).",toolsCurrentSession:"Current session",toolsActiveCount:"{n}/{total} enabled",toolsNoSession:"Open a session to see and toggle its available tools.",securityToolPreset:"Permission",securityToolPresetDesc:"Switch the current tool set; Workspace Write includes bash and is not a filesystem sandbox",securityTrust:"Project trust",securityTrustDesc:"Auto-trust projects containing .pi/ resources (writes pi settings.json)",trustAsk:"Ask every time",trustAlways:"Always trust",trustNever:"Never trust",versionPiweb:"PiWeb version",versionPiwebDesc:"Version of this web app; click to open the repo",versionPi:"Pi version",versionPiDesc:"Version of the pi agent engine; click to open the repo",checkUpdate:"Check for updates",checkingUpdate:"Checking…",upToDate:"Up to date",updateTo:"Update to {v}",updatingNow:"Updating…",updatedTo:"Updated to {v}; restart PiWeb to apply",updateFailed:"Update failed",updateManualHint:"Stop piweb, then run the command above (Windows cannot replace a running installation)",skillsDesc:"Disabled skills are hidden from the system prompt and only callable via /skill:name",skillsLoading:"Loading skills…",skillsEmpty:"No skills available in this workspace",confirmDeleteSkill:'Delete skill "{name}"? Its skill directory will be removed and cannot be recovered.',deleteSkillHint:"Delete the skill directory",skillDeletePackageHint:"package skill: use disable",scopeGlobal:"Global",scopeProject:"Project",scopePackage:"Package",viewSkillFile:"View SKILL.md",packages:"Installed pi packages",packagesEmpty:"No pi packages installed",addPackage:"Install pi package",addPackagePlaceholder:"npm:pkg / git:https://… / local path",installLocal:"Install into current project (-l)",install:"Install",uninstall:"Uninstall",confirmUninstallPackage:'Uninstall "{source}"?',update:"Update",pluginConfig:"Plugin config",pluginList:"Plugin list",pluginPageDesc:"Configure and view installed plugins for this deployment.",searchPlugins:"Search plugins",enabled:"Enabled",disabled:"Disabled",enablePlugin:"Enable",disablePlugin:"Disable",updating:"Updating...",uninstalling:"Uninstalling...",updateSuccess:"Updated successfully",uninstallSuccess:"Uninstalled",extensionsEmpty:"No loaded extensions",extensionLoadError:"Failed to load",resourceDiagnostics:"Resource diagnostics",installing:"Installing…",installSuccess:"Installed and loaded",reloadedSessions:"Reloaded: {loaders} loaders \xb7 {sessions} sessions",projectTrustBanner:"This project has .pi/ extensions or skills; pi loads and runs them only if you trust the project",projectTrustBannerNever:"This project's .pi/ extensions and skills are marked untrusted and will not load",projectTrustAllow:"Trust and load",projectTrustDeny:"Do not trust",projectTrustForget:"Ask again",projectTrustTrusted:"Project trusted",projectTrustUntrusted:"Project not trusted",resources:"carries",toastSaved:"Saved",toastError:"Operation failed",running:"Running",projectPanel:"Project",growthScopeStep:"This step",growthScopeSession:"This session",growthOnlyChanges:"Changes only",growthFollow:"Follow",growthFollowing:"Following",growthPrev:"Previous round",growthNext:"Next round",growthRoundPosition:"Round {current}/{total}",growthSnapshotNow:"Snapshot now",growthSnapshotNone:"No changes",growthNoSteps:"No snapshots yet. Send pi a message and the project's changes will show up here step by step.",growthLoading:"Loading snapshots…",growthUnrecorded:"This round predates growth snapshots; its changes were not recorded",growthNoChangesRound:"No file changes in this round",growthNoSession:"Open or start a session to watch the project grow here.",growthUnavailable:"git was not found on this machine; project growth is unavailable",growthUnavailableFallback:"Growth snapshots are unavailable (no usable git); showing the current directory structure",growthStepLabel:"Step {n}",growthRoundLabel:"Round {n}",growthStepsCount:"{n} steps",growthKindBaseline:"Session baseline",growthKindTurn:"Turn ended",growthKindExternal:"External change",growthKindManual:"Manual snapshot",growthStatA:"Added",growthStatM:"Modified",growthStatD:"Deleted",growthStatR:"Renamed",growthPending:"Writing…",growthLazyDir:"Current disk entry, not in the selected snapshot",growthTruncated:"Too many changes in this step; showing the first 2000",growthExpandAll:"Expand all",growthCollapseAll:"Collapse all",growthFilter:"Filter…",viewerModeDiff:"Changes",viewerModeContent:"Content",viewerModeRender:"Rendered",viewerFold:"Fold unchanged",viewerUnfold:"Show unchanged",viewerFoldedLines:"\xb7\xb7\xb7 {n} unchanged lines \xb7\xb7\xb7",viewerPrevChange:"Previous change",viewerNextChange:"Next change",viewerFullscreen:"Fullscreen",viewerExitFullscreen:"Exit fullscreen",viewerQuickOpen:"Type a file name to open…",viewerQuickOpenEmpty:"No matching files",viewerNoChanges:"No changes to this file in this scope",viewerDeleted:"This file was deleted in this round; showing its last content",viewerHistorical:"This file is no longer in the current snapshot; showing its last recorded content",viewerMissing:"This file is no longer in the current snapshot or on disk",viewerPatchTruncated:"Diff too large; truncated",viewerCloseTab:"Close tab",viewerNotInSnapshot:"Not in the snapshot (over 1MB or excluded); showing the current content from disk",viewerLoadFailed:"Failed to load",viewerEmpty:"Pick a file from the tree on the left"}},r=(0,i.createContext)({lang:"zh",setLang:()=>{},t:a});function l({children:e}){let[t,o]=(0,i.useState)("zh");(0,i.useEffect)(()=>{let e=localStorage.getItem("piweb.lang");("en"===e||"zh"===e)&&o(e)},[]),(0,i.useEffect)(()=>{document.documentElement.lang="en"===t?"en":"zh-CN"},[t]);let a=(0,i.useCallback)(e=>{o(e),localStorage.setItem("piweb.lang",e)},[]);return(0,n.jsx)(r.Provider,{value:{lang:t,setLang:a,t:s[t]},children:e})}function d(){return(0,i.useContext)(r)}},2576:(e,t,o)=>{o.d(t,{N:()=>i,h:()=>a});var n=o(5155);function i({size:e=18,className:t,style:o}){return(0,n.jsxs)("svg",{width:e,height:e,viewBox:"165.29 165.29 469.43 469.43","aria-hidden":!0,className:t,style:{color:"var(--dsw-label-primary)",display:"block",flex:"none",...o},children:[(0,n.jsx)("path",{fill:"currentColor",fillRule:"evenodd",d:"M165.29 165.29 H517.36 V400 H400 V517.36 H282.65 V634.72 H165.29 Z M282.65 282.65 V400 H400 V282.65 Z"}),(0,n.jsx)("path",{fill:"currentColor",d:"M517.36 400 H634.72 V634.72 H517.36 Z"})]})}function a({compact:e=!1}){return e?(0,n.jsx)(i,{size:18,style:{color:"var(--dsw-accent)"}}):(0,n.jsxs)("div",{className:"pw-brand select-none",children:[(0,n.jsx)("span",{className:"pw-brand-symbol",children:(0,n.jsx)(i,{size:18,style:{color:"var(--dsw-accent)"}})}),(0,n.jsx)("span",{className:"pw-brand-name",children:"piweb"}),(0,n.jsx)("span",{className:"pw-brand-meta",children:"CODE WORKBENCH"})]})}}}]);
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7577],{7577:(e,t,s)=>{s.r(t),s.d(t,{SwarmCoordinatorPod:()=>d});var a=s(5155),l=s(2115),r=s(8476),n=s(9992);let i=(e,t)=>e.replace(/\\/g,"/").replace(/\/+$/,"").toLowerCase()===t.replace(/\\/g,"/").replace(/\/+$/,"").toLowerCase();function d({cwd:e,onClose:t,onSwitchToWorkbench:s,projectTrust:c,onSetProjectTrust:x,onWorkspaceChanged:o}){let[m,u]=(0,l.useState)([{title:"",instruction:""}]),[p,h]=(0,l.useState)(null),[f,b]=(0,l.useState)(!1),[g,j]=(0,l.useState)(null),[y,k]=(0,l.useState)([]),[N,v]=(0,l.useState)(!1),[w,C]=(0,l.useState)(null),[S,z]=(0,l.useState)("active"),[$,E]=(0,l.useState)(!1),[G,P]=(0,l.useState)(!1),[T,R]=(0,l.useState)(null),[U,D]=(0,l.useState)(null),[O,A]=(0,l.useState)({}),[I,L]=(0,l.useState)(null),[J,K]=(0,l.useState)(null),[_,B]=(0,l.useState)(!1),F=(0,l.useRef)(e);F.current=e;let W=(0,l.useRef)(0),q=(0,l.useRef)(0),M=p?.cwd===e?p.data:null,V=M?.isRepo&&M.root?M.root:e,X=I&&i(I.cwd,V)?I:i(V,e)?c:null,Z=(0,l.useRef)(V);Z.current=V;let H=y.filter(t=>i(t.cwd,e)),Q=(0,l.useCallback)(async()=>{if(V)try{let t=await fetch(`/api/security?cwd=${encodeURIComponent(V)}`),s=await t.json();if(!t.ok||!s.success)throw Error(s.error||"读取项目信任状态失败");F.current===e&&i(Z.current,V)&&(L({cwd:V,...s.data}),K(null))}catch(t){F.current===e&&i(Z.current,V)&&K(t instanceof Error?t.message:"读取项目信任状态失败")}},[e,V]);(0,l.useEffect)(()=>{K(null),c&&i(V,e)||Q()},[e,V,c,Q]);let Y=async()=>{if(e&&!_){B(!0),K(null);try{if(x&&i(V,e))await x(!0);else{let e=await fetch("/api/security",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectTrust:{cwd:V,decision:!0}})}),t=await e.json();if(!e.ok||!t.success)throw Error(t.error||"信任项目失败")}await Q()}catch(e){K(e instanceof Error?e.message:"信任项目失败")}finally{B(!1)}}};(0,l.useEffect)(()=>{W.current+=1,q.current+=1,h(null),j(null),k([]),C(null),D(null),L(null),K(null),u([{title:"",instruction:""}])},[e]);let ee=(0,l.useCallback)(async()=>{if(!e)return;let t=++W.current;b(!0),j(null);try{let s=await fetch(`/api/git?cwd=${encodeURIComponent(e)}`),a=await s.json();if(F.current!==e||W.current!==t)return;s.ok&&a.success&&a.data?h({cwd:e,data:a.data}):j(a.error||"读取 Git 状态失败")}catch(s){F.current===e&&W.current===t&&j(s?.message||"网络请求失败")}finally{F.current===e&&W.current===t&&b(!1)}},[e]),et=(0,l.useCallback)(async()=>{if(!e)return;let t=++q.current;v(!0);try{let s=await fetch(`/api/swarm?cwd=${encodeURIComponent(e)}`),a=await s.json();if(F.current!==e||q.current!==t)return;s.ok&&a.success&&Array.isArray(a.data)?(k(a.data),C(e=>{if(e&&a.data.some(t=>t.id===e))return e;let t=a.data.find(e=>"running"===e.status);return t?t.id:a.data.length>0?a.data[0].id:null})):D(a.error||"加载协同任务历史失败")}catch(s){F.current===e&&q.current===t&&D(s?.message||"加载协同任务历史失败")}finally{F.current===e&&q.current===t&&v(!1)}},[e]),es=(0,l.useCallback)(async t=>{try{let s=await fetch(`/api/swarm/${t}`),a=await s.json();if(s.ok&&a.success&&a.data&&F.current===e&&i(a.data.cwd,e)){let e=a.data;return k(t=>t.some(t=>t.id===e.id)?t.map(t=>t.id===e.id?e:t):[e,...t]),e}}catch(t){F.current===e&&D(t instanceof Error?t.message:"获取任务详情失败")}return null},[e]);(0,l.useEffect)(()=>{ee(),et()},[ee,et]);let ea=H.find(e=>e.id===w)||null;(0,l.useEffect)(()=>{ea?.status!=="running"&&P(!1)},[ea?.status]);let el=H.filter(e=>"running"===e.status).map(e=>e.id).join(",");(0,l.useEffect)(()=>{let e;if(!el)return;let t=!1,s=async()=>{let a=await Promise.all(el.split(",").map(e=>es(e)));t||(a.some(e=>e&&"running"!==e.status)&&ee(),e=setTimeout(()=>void s(),1500))};return e=setTimeout(()=>void s(),1500),()=>{t=!0,clearTimeout(e)}},[el,es,ee]);let er=(e,t,s)=>{u(a=>{let l=[...a];return l[e]={...l[e],[t]:s},l})},en=!!(X&&(!X.required||X.trusted)),ei=!!M?.isRepo,ed=M?.files?.length??0,ec=ei&&0===ed&&!M?.statusError,ex=H.some(e=>"running"===e.status),eo=m.every(e=>e.title.trim().length>0&&e.title.trim().length<=80&&e.instruction.trim().length>0&&e.instruction.trim().length<=4e3),em="";e?J?em=`禁止启动 (项目信任状态未知: ${J})`:X?en?g?em=`禁止启动 (Git 状态未知: ${g})`:M?.statusError?em=`禁止启动 (Git 状态未知: ${M.statusError})`:f||N?em="正在检查工作区状态":ei?ec?ex?em="禁止启动 (已有协同任务正在运行)":eo?$&&(em="正在启动智能体群组..."):em="请填写所有任务的目标与指令":em=`禁止启动 (工作区存在未提交改动: ${ed} 项)`:em="禁止启动 (非 Git 仓库,无法创建工作树)":em="禁止启动 (项目未信任,请先允许)":em="正在读取项目信任状态":em="未选择有效工作区";let eu=!em,ep=async()=>{if(eu){E(!0),D(null);try{let t={cwd:e,tasks:m.map(e=>({title:e.title.trim(),instruction:e.instruction.trim()}))},s=await fetch("/api/swarm",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),a=await s.json();if(!s.ok||!a.success)throw Error(a.error||"启动 Swarm 任务失败");let l=a.data;if(F.current!==e)return;k(e=>[l,...e]),C(l.id),z("active")}catch(e){D(e?.message||"启动失败")}finally{E(!1)}}},eh=async()=>{if(!ea||"running"!==ea.status)return;P(!0),D(null);let t=!1;try{let s=await fetch(`/api/swarm/${ea.id}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({cwd:e,action:"cancel"})}),a=await s.json();if(!s.ok||!a.success)throw Error(a.error||"取消任务失败");let l=a.data;t=!0,F.current===e&&k(e=>e.map(e=>e.id===l.id?l:e))}catch(e){D(e?.message||"取消操作失败")}finally{t||P(!1)}},ef=async t=>{if(ea&&"running"!==ea.status&&ea.tasks[t]?.status==="completed"&&ea.tasks[t]?.patch){R(t),D(null);try{let s=await fetch(`/api/swarm/${ea.id}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({cwd:e,action:"accept",index:t})}),a=await s.json();if(!s.ok||!a.success)throw Error(a.error||"采纳改动失败");let l=a.data;if(F.current!==e)return;k(e=>e.map(e=>e.id===l.id?l:e)),ee(),o?.()}catch(e){D(e?.message||"采纳补丁失败")}finally{R(null)}}};return(0,a.jsxs)("div",{className:"flex flex-col w-full h-full overflow-hidden text-slate-800 dark:text-slate-100 select-none",children:[(0,a.jsxs)("div",{className:"shrink-0 mb-3 px-4 py-3 clay-card flex flex-wrap items-center justify-between gap-3 bg-white dark:bg-slate-900",children:[(0,a.jsxs)("div",{className:"flex items-center gap-3",children:[(0,a.jsx)("div",{className:"w-10 h-10 clay-inset rounded-2xl flex items-center justify-center text-emerald-500",children:(0,a.jsx)(n.lK,{size:20})}),(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:"font-bold text-base text-slate-800 dark:text-slate-100 tracking-tight",children:"PiWeb Core Swarm"}),(0,a.jsx)("span",{className:"px-2 py-0.5 clay-code-pill text-xs text-slate-500 dark:text-slate-400 font-mono truncate max-w-xs",title:e,children:e||"未选择工作区"}),M?.branch&&(0,a.jsxs)("span",{className:"px-2.5 py-0.5 rounded-full bg-sky-50 dark:bg-sky-950/40 text-sky-600 dark:text-sky-300 text-xs font-semibold flex items-center gap-1 shadow-sm",children:[(0,a.jsx)(n.r$,{size:12}),M.branch]})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2 mt-0.5 text-xs text-slate-500 dark:text-slate-400",children:[(0,a.jsx)("span",{children:"独立 Git 工作树 \xb7 仅受限文件工具 \xb7 无 Shell"}),(0,a.jsx)("span",{className:"w-1 h-1 rounded-full bg-slate-300 dark:bg-slate-700"}),(0,a.jsx)("span",{className:"text-emerald-600 dark:text-emerald-400 font-semibold",children:"最大并行度: 3 节点"})]})]})]}),(0,a.jsxs)("div",{className:"flex items-center gap-3",children:[J?(0,a.jsxs)("div",{role:"alert",className:"clay-inset rounded-2xl px-3.5 py-2 text-xs text-rose-700",children:["项目信任状态未知:",J]}):X?en?g||M?.statusError?(0,a.jsxs)("div",{role:"alert",className:"clay-inset rounded-2xl px-3.5 py-2 text-xs text-rose-700",children:["Git 状态读取失败:",g||M?.statusError]}):!M||N?(0,a.jsx)("div",{className:"clay-inset rounded-2xl px-3.5 py-2 text-xs text-slate-500",children:"正在检查 Git 与协同任务状态..."}):ei?ec?(0,a.jsxs)("div",{className:"flex items-center gap-2.5 px-3.5 py-2 clay-inset bg-emerald-50/80 dark:bg-emerald-950/30 text-emerald-900 dark:text-emerald-200 rounded-2xl",children:[(0,a.jsx)(n.df,{size:18,className:"text-emerald-500 flex-none"}),(0,a.jsxs)("div",{className:"text-left leading-tight",children:[(0,a.jsx)("p",{className:"text-xs font-bold text-emerald-950 dark:text-emerald-100",children:"工作区就绪:干净的 Git 状态 (Ready)"}),(0,a.jsx)("p",{className:"text-[11px] text-emerald-800/80 dark:text-emerald-300",children:"无未提交改动,可创建独立工作树并行执行。"})]})]}):(0,a.jsxs)("div",{className:"flex items-center gap-2.5 px-3.5 py-2 clay-inset bg-amber-50/70 dark:bg-amber-950/30 text-amber-900 dark:text-amber-200 rounded-2xl",children:[(0,a.jsx)(n.PP,{size:18,className:"text-amber-500 animate-bounce flex-none"}),(0,a.jsxs)("div",{className:"text-left leading-tight",children:[(0,a.jsx)("p",{className:"text-xs font-bold text-amber-950 dark:text-amber-100",children:"工作区就绪检测:未提交改动 (Git Dirty)"}),(0,a.jsxs)("p",{className:"text-[11px] text-amber-800/80 dark:text-amber-300",children:["检测到 ",ed," 项未提交变更。请提交或移走改动后再启动。"]})]})]}):(0,a.jsxs)("div",{className:"flex items-center gap-2.5 px-3.5 py-2 clay-inset bg-amber-50/80 dark:bg-amber-950/30 text-amber-900 dark:text-amber-200 rounded-2xl",children:[(0,a.jsx)(n.PP,{size:18,className:"text-amber-500 flex-none"}),(0,a.jsxs)("div",{className:"text-left leading-tight",children:[(0,a.jsx)("p",{className:"text-xs font-bold text-amber-950 dark:text-amber-100",children:"非 Git 仓库 (Not Git Repository)"}),(0,a.jsx)("p",{className:"text-[11px] text-amber-800/80 dark:text-amber-300",children:"当前目录未初始化 Git 仓库,无法派生隔离工作树。"})]})]}):(0,a.jsxs)("div",{className:"flex items-center gap-2.5 px-3.5 py-2 clay-inset bg-rose-50/80 dark:bg-rose-950/30 text-rose-900 dark:text-rose-200 rounded-2xl",children:[(0,a.jsx)(n.an,{size:18,className:"text-rose-500 flex-none"}),(0,a.jsxs)("div",{className:"text-left leading-tight",children:[(0,a.jsx)("p",{className:"text-xs font-bold text-rose-950 dark:text-rose-100",children:"工作区未信任 (Untrusted)"}),(0,a.jsx)("p",{className:"text-[11px] text-rose-800/80 dark:text-rose-300",children:"需信任当前工作区后方可签发智能体协同任务。"})]}),e&&(0,a.jsx)("button",{type:"button",className:"clay-btn px-2.5 py-1 bg-rose-500 hover:bg-rose-600 text-white text-xs font-semibold rounded-full ml-1",disabled:_,onClick:()=>void Y(),children:"信任项目"})]}):(0,a.jsx)("div",{className:"clay-inset rounded-2xl px-3.5 py-2 text-xs text-slate-500",children:"正在检查项目信任状态..."}),(0,a.jsxs)("button",{type:"button",className:"clay-btn px-3 py-2 bg-white dark:bg-slate-800 text-slate-700 dark:text-slate-200 hover:text-slate-900 text-xs font-semibold flex items-center gap-1.5",onClick:()=>{ee(),et()},title:"重新检查 Git 与工作区状态",children:[(0,a.jsx)(n.Ct,{size:14,className:`text-emerald-500 ${f?"animate-spin":""}`}),"重新检查"]})]})]}),(0,a.jsxs)("div",{className:"flex-1 flex flex-col gap-3 overflow-y-auto min-h-0 lg:flex-row lg:overflow-hidden",children:[(0,a.jsxs)("section",{className:"w-full min-h-[420px] shrink-0 clay-card bg-white dark:bg-slate-900 flex flex-col p-4 overflow-hidden lg:w-[410px] lg:min-h-0",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between pb-3 border-b border-slate-100 dark:border-slate-800 shrink-0",children:[(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:"w-2.5 h-2.5 rounded-full bg-orange-400"}),(0,a.jsx)("h2",{className:"text-sm font-bold text-slate-800 dark:text-slate-100",children:"发起智能体协同任务组"})]}),(0,a.jsx)("span",{className:"text-[11px] font-mono text-slate-400",children:"POST /api/swarm (cwd, tasks:[])"})]}),(0,a.jsxs)("span",{className:"clay-badge px-2.5 py-1 text-xs bg-slate-100 dark:bg-slate-800 text-slate-500 dark:text-slate-400 font-semibold",children:[m.length," / 3 任务"]})]}),(0,a.jsx)("div",{className:"flex-1 overflow-y-auto py-3 space-y-3 pr-1",children:m.map((e,t)=>(0,a.jsxs)("div",{className:"clay-surface p-3.5 relative group rounded-2xl",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,a.jsxs)("span",{className:`clay-badge px-2 py-0.5 text-xs font-bold ${0===t?"bg-emerald-50 dark:bg-emerald-950/40 text-emerald-600 dark:text-emerald-400":1===t?"bg-sky-50 dark:bg-sky-950/40 text-sky-600 dark:text-sky-400":"bg-purple-50 dark:bg-purple-950/40 text-purple-600 dark:text-purple-400"}`,children:["Task #",t+1]}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsxs)("span",{className:"text-[11px] text-slate-400",children:["并行隔离节点 P",t+1]}),m.length>1&&(0,a.jsxs)("button",{type:"button",className:"text-slate-400 hover:text-rose-500 text-xs flex items-center gap-0.5 transition-colors",onClick:()=>{!(m.length<=1)&&u(e=>e.filter((e,s)=>s!==t))},title:"移除此子任务",children:[(0,a.jsx)(n.Vd,{size:13}),"移除"]})]})]}),(0,a.jsxs)("div",{className:"space-y-2",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("label",{className:"block text-[11px] font-medium text-slate-500 dark:text-slate-400 mb-1",children:"子任务目标 / Title (最多 80 字)"}),(0,a.jsx)("input",{type:"text",className:"w-full clay-inset px-3 py-1.5 text-xs text-slate-800 dark:text-slate-100 bg-transparent border-0 focus:ring-1 focus:ring-emerald-400 outline-none rounded-xl",value:e.title,maxLength:80,placeholder:`输入第 ${t+1} 个子任务简述...`,onChange:e=>er(t,"title",e.target.value)})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("label",{className:"block text-[11px] font-medium text-slate-500 dark:text-slate-400 mb-1",children:"详细指示 / Instruction (最多 4000 字)"}),(0,a.jsx)("textarea",{rows:3,className:"w-full clay-inset p-2.5 text-xs text-slate-700 dark:text-slate-200 bg-transparent border-0 focus:ring-1 focus:ring-emerald-400 outline-none resize-none rounded-xl",value:e.instruction,maxLength:4e3,placeholder:"指定目标文件与函数改写逻辑规范...",onChange:e=>er(t,"instruction",e.target.value)})]})]})]},t))}),m.length<3&&(0,a.jsx)("div",{className:"pt-2 shrink-0",children:(0,a.jsxs)("button",{type:"button",className:"w-full py-2.5 clay-inset hover:bg-slate-200/50 dark:hover:bg-slate-800/50 text-slate-700 dark:text-slate-300 text-xs font-semibold rounded-xl flex items-center justify-center gap-2 transition-all",onClick:()=>{m.length>=3||u(e=>[...e,{title:"",instruction:""}])},children:[(0,a.jsx)(n.Xh,{size:14,className:"text-emerald-500"}),"+ 添加子任务 (最多 3 个)"]})}),(0,a.jsxs)("div",{className:"mt-3 p-3 clay-inset bg-emerald-50/50 dark:bg-emerald-950/20 rounded-2xl shrink-0",children:[(0,a.jsxs)("div",{className:"flex items-center gap-1.5 text-emerald-700 dark:text-emerald-300 text-xs font-bold mb-1",children:[(0,a.jsx)(n.an,{size:14}),"沙箱安全约定 (Sandbox Guarantee)"]}),(0,a.jsx)("p",{className:"text-[11px] text-slate-500 dark:text-slate-400 leading-relaxed",children:"智能体在独立 Git 工作树中使用受限文件读写工具,无 Shell 权限;模型请求仍会发往已配置的供应商。文件改动需人工审查 Diff 后采纳。"})]}),(0,a.jsxs)("div",{className:"mt-3 pt-3 border-t border-slate-100 dark:border-slate-800 flex flex-col gap-2 shrink-0",children:[U&&(0,a.jsx)("div",{className:"p-2 rounded-xl bg-rose-50 dark:bg-rose-950/40 text-rose-700 dark:text-rose-300 text-xs leading-tight",children:U}),(0,a.jsxs)("button",{type:"button",className:`w-full py-3 text-xs font-bold rounded-full flex items-center justify-center gap-2 transition-all ${eu?"clay-btn clay-btn-mint text-white cursor-pointer shadow-md hover:scale-[1.01]":"clay-btn bg-slate-200 dark:bg-slate-800 text-slate-400 dark:text-slate-500 cursor-not-allowed shadow-none"}`,disabled:!eu,onClick:ep,children:[(0,a.jsx)(n.lK,{size:16}),(0,a.jsx)("span",{children:eu?`启动群组任务 (${m.length} 个任务)`:em})]}),(0,a.jsxs)("div",{className:"flex items-center justify-between px-1 text-[11px] text-slate-400",children:[(0,a.jsx)("span",{children:"按规约需保持 Git 无暂存/变更"}),s&&(0,a.jsx)("button",{type:"button",className:"text-sky-500 hover:underline",onClick:s,children:"返回工作台"})]})]})]}),(0,a.jsxs)("section",{className:"flex-1 min-h-[480px] flex flex-col clay-card bg-white dark:bg-slate-900 p-4 overflow-hidden min-w-0 lg:min-h-0",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between pb-3 border-b border-slate-100 dark:border-slate-800 shrink-0",children:[(0,a.jsxs)("div",{className:"flex items-center gap-3",children:[(0,a.jsx)("div",{className:"w-8 h-8 clay-inset rounded-full flex items-center justify-center text-sky-500",children:(0,a.jsx)(n.lK,{size:18})}),(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("h2",{className:"text-sm font-bold text-slate-800 dark:text-slate-100",children:"活跃协同任务监视器"}),ea?.status==="running"&&(0,a.jsxs)("span",{className:"clay-badge px-2.5 py-0.5 text-xs bg-emerald-50 dark:bg-emerald-950/40 text-emerald-600 dark:text-emerald-400 font-bold flex items-center gap-1.5",children:[(0,a.jsx)("span",{className:"w-1.5 h-1.5 rounded-full bg-emerald-500 animate-ping"}),"Polling (GET /api/swarm/",ea.id.slice(0,8),")"]})]}),(0,a.jsx)("p",{className:"text-[11px] text-slate-400",children:"会话实例实时事件驱动 | 状态轮询间隔: 1.5s"})]})]}),(0,a.jsxs)("div",{className:"flex items-center gap-1 clay-inset p-1 rounded-full text-xs",children:[(0,a.jsxs)("button",{type:"button",className:`px-3 py-1 rounded-full font-bold transition-all ${"active"===S?"bg-white dark:bg-slate-800 text-slate-800 dark:text-slate-100 clay-badge":"text-slate-500 hover:text-slate-800 dark:hover:text-slate-200"}`,onClick:()=>z("active"),children:["当前协同 ",ea?"(1)":"(0)"]}),(0,a.jsxs)("button",{type:"button",className:`px-3 py-1 rounded-full font-bold transition-all ${"history"===S?"bg-white dark:bg-slate-800 text-slate-800 dark:text-slate-100 clay-badge":"text-slate-500 hover:text-slate-800 dark:hover:text-slate-200"}`,onClick:()=>z("history"),children:["历史归档 (",H.length,")"]})]})]}),(0,a.jsx)("div",{className:"flex-1 overflow-y-auto pt-3 space-y-4 pr-1",children:"history"===S?(0,a.jsx)("div",{className:"space-y-3",children:0===H.length?(0,a.jsx)("div",{className:"text-center py-16 text-xs text-slate-400",children:"暂无历史协同任务,请在左侧发起新任务组。"}):H.map(e=>{let t=e.id===w;return(0,a.jsx)("div",{className:`clay-surface p-3.5 rounded-2xl transition-all cursor-pointer hover:scale-[1.005] ${t?"ring-2 ring-emerald-400":""}`,onClick:()=>{C(e.id),z("active")},children:(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2.5",children:[(0,a.jsx)("span",{className:`w-6 h-6 rounded-full flex items-center justify-center text-xs font-bold ${"completed"===e.status?"bg-emerald-50 text-emerald-600":"running"===e.status?"bg-sky-50 text-sky-600 animate-spin":"bg-slate-200 text-slate-600"}`,children:"completed"===e.status?(0,a.jsx)(n.df,{size:14}):"running"===e.status?(0,a.jsx)(n.Ct,{size:14}):(0,a.jsx)(n.BF,{size:14})}),(0,a.jsxs)("div",{children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:"font-mono text-xs font-bold text-slate-700 dark:text-slate-200",children:e.id}),(0,a.jsx)("span",{className:`px-2 py-0.5 rounded-full text-[10px] font-bold ${"completed"===e.status?"bg-emerald-100 text-emerald-700":"running"===e.status?"bg-sky-100 text-sky-700":"bg-slate-200 text-slate-600"}`,children:e.status.toUpperCase()})]}),(0,a.jsxs)("p",{className:"text-[11px] text-slate-400 mt-0.5",children:[new Date(e.createdAt).toLocaleString()," \xb7 ",e.tasks.length," 个子任务 (",e.tasks.filter(e=>"completed"===e.status).length," 完成,"," ",e.tasks.filter(e=>e.accepted).length," 采纳)"]})]})]}),(0,a.jsx)("button",{type:"button",className:"clay-btn px-3 py-1 bg-white dark:bg-slate-800 text-slate-600 dark:text-slate-200 text-xs font-semibold",children:"查看详情"})]})},e.id)})}):ea?(0,a.jsxs)("div",{className:"clay-surface p-4 rounded-3xl relative",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between pb-3 border-b border-slate-200/60 dark:border-slate-800 mb-3",children:[(0,a.jsxs)("div",{className:"flex items-center gap-3",children:[(0,a.jsxs)("span",{className:`px-2.5 py-1 clay-badge text-xs font-bold flex items-center gap-1.5 ${"running"===ea.status?"bg-emerald-50 text-emerald-600":"completed"===ea.status?"bg-emerald-100 text-emerald-700":"failed"===ea.status?"bg-rose-100 text-rose-700":"bg-slate-200 text-slate-600"}`,children:["running"===ea.status&&(0,a.jsx)("span",{className:"w-2 h-2 rounded-full bg-emerald-500 animate-pulse"}),ea.status.toUpperCase()]}),(0,a.jsxs)("span",{className:"font-mono text-xs font-bold text-slate-700 dark:text-slate-200",title:ea.id,children:["ID: ",ea.id]}),(0,a.jsxs)("span",{className:"text-xs text-slate-400 flex items-center gap-1",children:[(0,a.jsx)(n.BF,{size:13}),new Date(ea.createdAt).toLocaleTimeString()]})]}),"running"===ea.status&&(0,a.jsxs)("button",{type:"button",className:"clay-btn px-3 py-1.5 bg-rose-50 hover:bg-rose-100 text-rose-600 text-xs font-semibold flex items-center gap-1",disabled:G,onClick:eh,children:[(0,a.jsx)(n.uN,{size:13}),G?"正在中断...":"中断全部智能体 (action: cancel)"]})]}),(0,a.jsx)("div",{className:"space-y-3",children:ea.tasks.map((e,t)=>{let s=e.patch?(0,r.rj)(e.patch):null,l=s?(0,r.hM)(s):{add:0,del:0},i=!1!==O[t];return(0,a.jsxs)("div",{className:"clay-card p-3.5 bg-white dark:bg-slate-900 rounded-2xl",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2.5",children:[(0,a.jsx)("span",{className:`w-6 h-6 rounded-full flex items-center justify-center text-xs font-bold ${"completed"===e.status?"bg-emerald-50 text-emerald-600":"running"===e.status?"bg-sky-50 text-sky-600":"failed"===e.status?"bg-rose-50 text-rose-600":"bg-slate-100 text-slate-400"}`,children:"completed"===e.status?(0,a.jsx)(n.df,{size:14}):"running"===e.status?(0,a.jsx)(n.Ct,{size:14,className:"animate-spin"}):"failed"===e.status?(0,a.jsx)(n.PP,{size:14}):(0,a.jsx)(n.BF,{size:14})}),(0,a.jsxs)("div",{children:[(0,a.jsxs)("h3",{className:"text-xs font-bold text-slate-800 dark:text-slate-100",children:["Task ",t+1,": ",e.title]}),(0,a.jsxs)("p",{className:"text-[11px] text-slate-400",children:["状态: ",e.status.toUpperCase(),e.patch?" \xb7 包含补丁文件":" \xb7 无文件改动"]})]})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[e.patch&&(0,a.jsxs)("span",{className:"px-2 py-0.5 clay-code-pill text-[11px] text-slate-600 dark:text-slate-300 font-mono",children:["+",l.add," -",l.del," lines"]}),e.patch&&"completed"===e.status&&(e.accepted?(0,a.jsxs)("span",{className:"clay-badge px-3 py-1.5 bg-emerald-50 dark:bg-emerald-950/40 text-emerald-600 dark:text-emerald-400 text-xs font-bold flex items-center gap-1",children:[(0,a.jsx)(n.df,{size:13}),"已采纳"]}):(0,a.jsxs)("button",{type:"button",className:"clay-btn px-3 py-1.5 bg-emerald-500 hover:bg-emerald-600 text-white text-xs font-bold flex items-center gap-1.5 shadow-sm",disabled:"running"===ea.status||T===t,onClick:()=>ef(t),children:[(0,a.jsx)(n.df,{size:13}),T===t?"正在写入工作区...":"running"===ea.status?"等待全部任务结束":"采纳改动 (Accept Patch)"]})),e.patch&&(0,a.jsxs)("button",{type:"button",className:"clay-btn px-2.5 py-1.5 bg-white dark:bg-slate-800 text-slate-600 dark:text-slate-200 hover:text-slate-900 text-xs font-semibold flex items-center gap-1",onClick:()=>{A(e=>({...e,[t]:void 0!==e[t]&&!e[t]}))},children:[(0,a.jsx)(n.lx,{size:13}),i?"折叠 Diff":"查看 Diff"]})]})]}),(0,a.jsxs)("div",{className:"mt-2 text-[11px] text-slate-500 dark:text-slate-400 bg-slate-50 dark:bg-slate-950/30 px-2.5 py-1.5 rounded-xl",children:[(0,a.jsx)("span",{className:"font-semibold text-slate-600 dark:text-slate-300",children:"目标指令: "}),e.instruction]}),e.error&&(0,a.jsxs)("div",{className:"mt-2 p-2.5 rounded-xl bg-rose-50 dark:bg-rose-950/40 text-rose-800 dark:text-rose-200 text-xs font-mono border border-rose-200 dark:border-rose-900",children:[(0,a.jsx)("span",{className:"font-bold",children:"执行异常: "}),e.error]}),e.report&&(0,a.jsxs)("div",{className:"mt-2 p-2.5 rounded-xl clay-inset bg-slate-50 dark:bg-slate-950/20 text-slate-700 dark:text-slate-300 text-xs leading-relaxed",children:[(0,a.jsx)("div",{className:"font-bold text-[11px] text-slate-500 dark:text-slate-400 mb-1",children:"执行报告摘要:"}),(0,a.jsx)("div",{className:"whitespace-pre-wrap",children:e.report})]}),e.patch&&s&&i&&(0,a.jsxs)("div",{className:"mt-3 clay-inset p-3 bg-slate-900 rounded-xl overflow-hidden text-xs text-slate-200",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between pb-2 mb-2 border-b border-slate-700/60 text-slate-400",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)(n.lx,{size:14,className:"text-sky-400"}),(0,a.jsx)("span",{className:"font-mono text-xs",children:"Unified Diff"})]}),(0,a.jsxs)("span",{className:"text-[11px] text-slate-400",children:[s.filter(e=>"file"===e.kind).length," 个文件变动"]})]}),(0,a.jsx)("div",{className:"overflow-x-auto max-h-80 select-text",children:(0,a.jsx)(r.xZ,{lines:s})}),(0,a.jsxs)("div",{className:"mt-2 pt-2 border-t border-slate-800 text-[11px] text-slate-400 flex items-center justify-between",children:[(0,a.jsx)("span",{children:"采纳说明:改动将直接应用至工作区,不暂存、不提交 Git。"}),(0,a.jsxs)("span",{className:"font-mono",children:["基于 ",ea.base.slice(0,8)," 生成"]})]})]}),e.accepted&&(0,a.jsxs)("div",{className:"mt-2 p-2 rounded-xl bg-emerald-50 dark:bg-emerald-950/40 text-emerald-800 dark:text-emerald-200 text-xs flex items-center justify-between",children:[(0,a.jsxs)("div",{className:"flex items-center gap-1.5",children:[(0,a.jsx)(n.df,{size:14,className:"text-emerald-500"}),(0,a.jsx)("span",{children:"文件修改已成功写入工作区 (工作区已更新,暂未 commit)"})]}),(0,a.jsx)("span",{className:"clay-badge px-2 py-0.5 bg-white dark:bg-slate-800 text-emerald-600 font-bold text-[10px]",children:"已采纳"})]})]},t)})})]}):(0,a.jsxs)("div",{className:"flex flex-col items-center justify-center h-full text-center py-16 px-4",children:[(0,a.jsx)("div",{className:"w-16 h-16 rounded-3xl clay-inset flex items-center justify-center text-slate-400 mb-4",children:(0,a.jsx)(n.lK,{size:32})}),(0,a.jsx)("h3",{className:"text-sm font-bold text-slate-700 dark:text-slate-200 mb-1",children:"尚未启动智能体协同任务"}),(0,a.jsx)("p",{className:"text-xs text-slate-400 max-w-sm mb-4",children:"在左侧配置 1 至 3 个并发隔离子任务,启动后系统将自动派生独立的 Git 工作树执行改动。"})]})}),(0,a.jsxs)("div",{className:"mt-3 pt-3 border-t border-slate-100 dark:border-slate-800 flex items-center justify-between shrink-0 text-[11px] text-slate-400",children:[(0,a.jsxs)("div",{className:"flex items-center gap-3",children:[(0,a.jsxs)("span",{className:"flex items-center gap-1",children:[(0,a.jsx)(n.an,{size:13,className:"text-emerald-500"}),"受限文件读写工具"]}),(0,a.jsxs)("span",{className:"flex items-center gap-1",children:[(0,a.jsx)(n.r$,{size:13,className:"text-sky-500"}),ea?`任务状态: ${ea.status}`:"尚无运行任务"]})]}),(0,a.jsx)("div",{children:(0,a.jsx)("span",{children:"PiWeb Agent Swarm Engine (No-shell Isolated Worktree)"})})]})]})]})]})}}}]);
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8866],{8866:(e,t,s)=>{s.r(t),s.d(t,{TestInspectorPod:()=>o});var a=s(5155),l=s(2115),r=s(9665),d=s(9992);function n(e){return e>=1e3?`${(e/1e3).toFixed(2)}s`:`${Math.round(e)}ms`}function o({cwd:e,onClose:t,onSwitchToWorkbench:s,onSwitchToDiff:x}){let[c,i]=(0,l.useState)(null),[m,b]=(0,l.useState)(null),[p,f]=(0,l.useState)(null),[u,h]=(0,l.useState)(""),[k,j]=(0,l.useState)(""),[g,y]=(0,l.useState)(!1),[N,w]=(0,l.useState)(!1),[v,$]=(0,l.useState)(0),[C,S]=(0,l.useState)("content"),[E,z]=(0,l.useState)(null),[I,P]=(0,l.useState)(null),[F,M]=(0,l.useState)(null),U=(0,l.useRef)(!1),R=c?.cwd===e?c.files:[],_=m?.cwd===e&&R.includes(m.file)?m.file:"",B=p?.cwd===e&&p.file===_?p.content:null,T=I?.cwd===e&&I.file===_?I.result:null,K=F?.cwd===e&&F.file===_?F.message:"",O=null!==E;async function V(){if(!e||!_||U.current)return;U.current=!0;let t={cwd:e,file:_};z(t),P(null),M(null),S("results");try{let e=await fetch("/api/tests",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}),s=await e.json();if(!e.ok||!s.success)throw Error(s.error||"测试执行失败");P({...t,result:s.data})}catch(e){M({...t,message:e instanceof Error?e.message:"测试执行失败"})}finally{U.current=!1,z(null)}}(0,l.useEffect)(()=>{let t=new AbortController;return(i(null),f(null),h(""),e)?(y(!0),(async()=>{try{let s=await fetch(`/api/tests?cwd=${encodeURIComponent(e)}`,{signal:t.signal}),a=await s.json();if(!s.ok||!a.success)throw Error(a.error||"读取测试文件失败");if(t.signal.aborted)return;let l=a.data.files;i({cwd:e,files:l}),b(t=>t?.cwd===e&&l.includes(t.file)?t:l.length?{cwd:e,file:l[0]}:null)}catch(e){t.signal.aborted||h(e instanceof Error?e.message:"读取测试文件失败")}finally{t.signal.aborted||y(!1)}})(),()=>t.abort()):()=>t.abort()},[e,v]),(0,l.useEffect)(()=>{let t=new AbortController;return(f(null),j(""),e&&_)?(w(!0),(async()=>{try{let s=await fetch(`/api/tests?cwd=${encodeURIComponent(e)}&file=${encodeURIComponent(_)}`,{signal:t.signal}),a=await s.json();if(!s.ok||!a.success)throw Error(a.error||"读取测试内容失败");t.signal.aborted||f({cwd:e,file:_,content:a.data.content})}catch(e){t.signal.aborted||j(e instanceof Error?e.message:"读取测试内容失败")}finally{t.signal.aborted||w(!1)}})(),()=>t.abort()):()=>t.abort()},[e,_]);let A=null!==B?B.split("\n"):[],W=B?`${(B.length/1024).toFixed(1)} KB`:"0 KB",D=(0,r.f3)(_)||"typescript";return(0,l.useMemo)(()=>A.map(e=>e.trim()?(0,r.NK)(e,D):null),[A,D]),(0,a.jsxs)("div",{className:"mx-auto flex w-full max-w-7xl flex-col gap-4 text-slate-800 dark:text-slate-100 antialiased",children:[(0,a.jsxs)("div",{className:"clay-card flex flex-wrap items-center justify-between gap-3 rounded-2xl p-4 bg-white dark:bg-slate-900 border border-slate-200 dark:border-slate-800 shadow-sm",children:[(0,a.jsxs)("div",{className:"flex min-w-0 flex-wrap items-center gap-2.5",children:[(0,a.jsxs)("div",{className:"clay-inset flex items-center gap-2 rounded-full px-3.5 py-1.5 text-xs font-bold text-slate-800 dark:text-slate-100",children:[(0,a.jsx)("span",{className:"w-2.5 h-2.5 rounded-full bg-emerald-500 animate-pulse"}),(0,a.jsx)("span",{children:"测试执行套件"}),(0,a.jsx)("span",{className:"rounded-full bg-emerald-100 dark:bg-emerald-950/70 px-2 py-0.5 text-[10px] font-bold text-emerald-800 dark:text-emerald-200 border border-emerald-300 dark:border-emerald-700",children:"工作区 Vitest"})]}),(0,a.jsxs)("div",{className:"clay-btn-soft flex items-center gap-1.5 rounded-full px-3 py-1 font-mono text-xs text-slate-800 dark:text-slate-200 max-w-xs truncate",title:_||e,children:[(0,a.jsx)(d.P9,{size:13,className:"text-amber-500 flex-none"}),(0,a.jsx)("span",{className:"text-slate-500 dark:text-slate-400 font-semibold",children:"tests/"}),(0,a.jsx)("span",{className:"font-bold text-slate-900 dark:text-slate-100 truncate",children:_?_.replace(/^tests\//,""):"未选定"})]}),T?(0,a.jsxs)("div",{className:`flex items-center gap-1.5 px-3 py-1 rounded-full text-xs font-bold border ${T.success?"bg-emerald-50 text-emerald-800 border-emerald-300 dark:bg-emerald-950/50 dark:text-emerald-200 dark:border-emerald-800":"bg-rose-50 text-rose-800 border-rose-300 dark:bg-rose-950/50 dark:text-rose-200 dark:border-rose-800"}`,children:[(0,a.jsx)("span",{className:`w-2 h-2 rounded-full ${T.success?"bg-emerald-500 animate-pulse":"bg-rose-500"}`}),(0,a.jsx)("span",{children:T.success?`全部用例就绪 (${T.passed}/${T.tests.length} 通过)`:`${T.failed} 项用例未通过`})]}):O?(0,a.jsxs)("div",{className:"flex items-center gap-1.5 px-3 py-1 rounded-full bg-amber-50 text-amber-800 border border-amber-300 dark:bg-amber-950/50 dark:text-amber-200 dark:border-amber-800 text-xs font-bold",children:[(0,a.jsx)("span",{className:"w-2 h-2 rounded-full bg-amber-500 animate-spin"}),(0,a.jsx)("span",{children:"测试执行中..."})]}):(0,a.jsxs)("div",{className:"flex items-center gap-1.5 px-3 py-1 rounded-full bg-sky-50 text-sky-800 border border-sky-300 dark:bg-sky-950/50 dark:text-sky-200 dark:border-sky-800 text-xs font-bold",children:[(0,a.jsx)("span",{className:"w-2 h-2 rounded-full bg-sky-500"}),(0,a.jsxs)("span",{children:["用例就绪待跑 (",R.length," 个文件)"]})]})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[T&&(0,a.jsxs)("div",{className:"clay-inset flex items-center gap-1.5 rounded-full px-3 py-1 text-xs font-mono text-slate-600 dark:text-slate-300 font-semibold",children:[(0,a.jsx)("span",{children:"耗时:"}),(0,a.jsx)("strong",{className:"text-slate-900 dark:text-slate-100",children:n(T.durationMs)})]}),(0,a.jsxs)("div",{className:"clay-inset flex items-center gap-1.5 rounded-full px-3 py-1 text-xs font-mono text-slate-600 dark:text-slate-300 font-semibold",children:[(0,a.jsx)("span",{children:"堆内存:"}),(0,a.jsx)("strong",{className:"text-slate-900 dark:text-slate-100",children:"未采集"})]}),(0,a.jsx)("button",{type:"button",className:"w-8 h-8 rounded-full clay-btn-soft flex items-center justify-center text-slate-600 hover:text-slate-950 dark:text-slate-300 dark:hover:text-white transition-colors",title:"刷新文件",onClick:()=>$(e=>e+1),disabled:!e||g,children:(0,a.jsx)(d.Ct,{size:14,className:g?"piweb-spin":void 0})}),t&&(0,a.jsx)("button",{type:"button",className:"w-8 h-8 rounded-full clay-btn-soft flex items-center justify-center text-slate-600 hover:text-rose-600 dark:text-slate-300 transition-colors",title:"关闭",onClick:t,children:(0,a.jsx)(d.Bh,{size:14})})]})]}),!e&&(0,a.jsx)("div",{className:"clay-inset rounded-2xl p-6 text-sm text-slate-600 dark:text-slate-300 font-medium text-center",children:"请先在工作台选择工作区,再查看或运行测试。"}),u&&(0,a.jsx)("div",{role:"alert",className:"rounded-2xl bg-rose-50 p-4 text-sm text-rose-800 dark:bg-rose-950/40 dark:text-rose-300 font-semibold shadow-sm border border-rose-300 dark:border-rose-800",children:u}),e&&(0,a.jsxs)("div",{className:"grid grid-cols-1 items-start gap-4 xl:grid-cols-12 min-w-0",children:[(0,a.jsxs)("div",{className:"xl:col-span-3 min-w-0 flex flex-col gap-4",children:[(0,a.jsxs)("div",{className:"clay-card rounded-2xl p-4 flex flex-col gap-3 bg-white dark:bg-slate-900 border border-slate-200 dark:border-slate-800 shadow-sm",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between pb-2 border-b border-slate-200 dark:border-slate-800",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2 font-bold text-sm text-slate-900 dark:text-slate-100",children:[(0,a.jsx)("span",{className:"w-2.5 h-2.5 rounded-full bg-indigo-500"}),(0,a.jsx)("span",{children:"测试用例组"})]}),(0,a.jsx)("span",{className:"px-2 py-0.5 rounded-full bg-sky-100 dark:bg-sky-950/60 text-sky-800 dark:text-sky-300 text-[10px] font-bold border border-sky-300 dark:border-sky-800",children:"Vitest Runner"})]}),(0,a.jsx)("div",{className:"flex flex-col gap-2 pt-1 max-h-[28vh] overflow-y-auto pr-1",children:T?.tests?.length?T.tests.map((e,t)=>(0,a.jsxs)("div",{className:"p-2.5 rounded-xl clay-card bg-surface flex flex-col gap-1 border border-slate-200 dark:border-slate-800",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between gap-1",children:[(0,a.jsxs)("span",{className:"font-bold text-xs text-slate-900 dark:text-slate-100 flex items-center gap-1.5 truncate",children:[(0,a.jsx)(d.df,{size:13,className:"passed"===e.status?"text-emerald-500 flex-none":"text-rose-500 flex-none"}),(0,a.jsxs)("span",{className:"truncate",title:e.name,children:["执行单元 #",t+1]})]}),(0,a.jsx)("span",{className:"font-mono text-[10px] text-slate-500 dark:text-slate-400 font-semibold flex-none",children:n(e.durationMs)})]}),(0,a.jsxs)("p",{className:"text-[11px] text-slate-600 dark:text-slate-400 font-mono",children:[e.status.toUpperCase()," \xb7 工作区进程"]})]},`${e.name}:${t}`)):(0,a.jsx)("div",{className:"clay-inset p-3.5 rounded-xl text-center text-xs text-slate-600 dark:text-slate-300 font-medium leading-relaxed",children:"点击「运行当前文件」后,此处将按用例粒度展示真实状态与耗时。"})}),(0,a.jsx)("div",{className:"pt-2 flex items-center justify-between text-slate-600 dark:text-slate-300 text-xs font-semibold border-t border-slate-200 dark:border-slate-800",children:(0,a.jsx)("span",{children:"覆盖率:未采集"})})]}),(0,a.jsxs)("div",{className:"clay-card rounded-2xl p-4 flex flex-col gap-3 bg-white dark:bg-slate-900 border border-slate-200 dark:border-slate-800 shadow-sm",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between pb-2 border-b border-slate-200 dark:border-slate-800 text-sm font-bold text-slate-900 dark:text-slate-100",children:[(0,a.jsx)("span",{children:"测试文件"}),(0,a.jsxs)("span",{className:"font-mono text-xs font-semibold text-slate-600 dark:text-slate-400",children:[R.length," 个文件"]})]}),g&&(0,a.jsx)("p",{className:"text-xs text-slate-500 dark:text-slate-400 font-medium",children:"正在读取测试文件..."}),!g&&!u&&0===R.length&&(0,a.jsx)("p",{className:"text-xs text-slate-500 dark:text-slate-400 font-medium",children:"此工作区没有测试文件。"}),(0,a.jsx)("div",{className:"max-h-[38vh] space-y-1.5 overflow-y-auto pr-1",children:R.map(t=>(0,a.jsx)("button",{type:"button",title:t,className:`w-full break-all rounded-xl px-3 py-2 text-left font-mono text-xs transition-all ${_===t?"clay-card bg-emerald-50 dark:bg-emerald-950/60 font-bold text-emerald-800 dark:text-emerald-200 shadow-sm border border-emerald-300 dark:border-emerald-700":"text-slate-700 hover:text-slate-950 dark:text-slate-200 dark:hover:text-white font-medium hover:bg-slate-100 dark:hover:bg-slate-800/80"}`,onClick:()=>b({cwd:e,file:t}),children:t},t))})]})]}),(0,a.jsxs)("div",{className:"xl:col-span-9 min-w-0 flex flex-col gap-4",children:[(0,a.jsxs)("div",{className:"w-full clay-card rounded-2xl p-4 flex flex-col transition-all bg-white dark:bg-slate-900 border border-slate-200 dark:border-slate-800 shadow-md",children:[(0,a.jsxs)("div",{className:"w-full flex flex-wrap items-center justify-between gap-3 pb-3 border-b border-slate-200 dark:border-slate-800",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2 flex-wrap",children:[(0,a.jsxs)("button",{type:"button",className:"flex items-center gap-1.5 px-3 py-1.5 rounded-full clay-btn-soft text-slate-800 dark:text-slate-100 text-xs font-bold shadow-sm",onClick:s,children:[(0,a.jsx)(d.P9,{size:14,className:"text-amber-500"}),(0,a.jsx)("span",{children:"项目"})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2 px-3.5 py-1.5 rounded-full clay-card bg-white dark:bg-slate-800 text-slate-900 dark:text-slate-50 font-mono text-xs font-bold shadow-sm border border-slate-200 dark:border-slate-700",children:[(0,a.jsx)("span",{className:"w-2 h-2 rounded-full bg-emerald-500"}),(0,a.jsx)("span",{className:"truncate max-w-[200px]",children:_?_.split("/").pop():"选择文件"})]})]}),(0,a.jsxs)("div",{className:"flex items-center gap-2",children:[(0,a.jsx)("span",{className:"px-2.5 py-1 rounded-full clay-inset font-mono text-[11px] text-slate-700 dark:text-slate-300 font-semibold",children:T?"当前文件结果":"尚无运行结果"}),(0,a.jsxs)("div",{className:"clay-inset flex items-center p-0.5 rounded-full text-xs",children:[(0,a.jsx)("button",{type:"button",className:`px-3 py-1 rounded-full transition-colors ${"content"===C?"clay-card bg-white dark:bg-slate-800 font-bold text-slate-900 dark:text-slate-50 shadow-sm border border-slate-200 dark:border-slate-700":"text-slate-600 hover:text-slate-950 dark:text-slate-400 dark:hover:text-white font-medium"}`,onClick:()=>S("content"),children:"源码"}),(0,a.jsx)("button",{type:"button",className:`px-3 py-1 rounded-full transition-colors ${"results"===C?"clay-card bg-white dark:bg-slate-800 font-bold text-slate-900 dark:text-slate-50 shadow-sm border border-slate-200 dark:border-slate-700":"text-slate-600 hover:text-slate-950 dark:text-slate-400 dark:hover:text-white font-medium"}`,onClick:()=>S("results"),children:"运行结果"})]}),t&&(0,a.jsx)("button",{type:"button",className:"w-7 h-7 rounded-full clay-btn-soft flex items-center justify-center text-slate-500 hover:text-rose-600 dark:text-slate-400 transition-colors",title:"关闭",onClick:t,children:(0,a.jsx)(d.Bh,{size:14})})]})]}),(0,a.jsxs)("div",{className:"w-full flex flex-wrap items-center justify-between px-4 py-2.5 my-2.5 rounded-xl clay-inset text-xs border border-slate-200 dark:border-slate-800",children:[(0,a.jsxs)("div",{className:"flex items-center gap-2 font-mono overflow-hidden",children:[(0,a.jsx)("h2",{className:"font-bold text-slate-900 dark:text-slate-100 truncate",title:_,children:_||"选择测试文件"}),(0,a.jsx)("span",{className:"px-2 py-0.5 rounded-full bg-emerald-100 dark:bg-emerald-950/70 text-emerald-800 dark:text-emerald-200 text-[10px] font-bold border border-emerald-300 dark:border-emerald-700",children:_?D:"未选择"})]}),(0,a.jsxs)("div",{className:"flex items-center gap-3 text-slate-600 dark:text-slate-300 font-mono text-[11px] font-semibold",children:[(0,a.jsx)("span",{className:"text-amber-700 dark:text-amber-400 font-bold",children:"无系统沙盒隔离"}),(0,a.jsx)("span",{children:"|"}),(0,a.jsxs)("span",{children:[W," (",A.length," 行)"]})]})]}),"content"===C?(0,a.jsxs)("div",{className:"relative w-full rounded-2xl clay-code-window p-4 overflow-x-auto min-h-[380px]",children:[k&&(0,a.jsx)("p",{role:"alert",className:"text-xs text-rose-300 font-semibold mb-2",children:k}),N&&(0,a.jsx)("p",{className:"text-xs text-slate-400 mb-2",children:"正在读取源码..."}),A.length>0?(0,a.jsxs)("table",{className:"w-full border-collapse font-mono text-xs select-text min-w-[680px]",children:[(0,a.jsxs)("colgroup",{children:[(0,a.jsx)("col",{className:"w-14",style:{width:"3.5rem",minWidth:"3.5rem"}}),(0,a.jsx)("col",{})]}),(0,a.jsx)("tbody",{children:A.map((e,t)=>(0,a.jsxs)("tr",{className:"group hover:bg-slate-800/80 transition-colors leading-relaxed",children:[(0,a.jsx)("td",{className:"w-14 select-none text-right pr-4 text-slate-500 font-mono text-xs font-semibold align-top whitespace-nowrap shrink-0",children:t+1}),(0,a.jsx)("td",{className:"whitespace-pre text-slate-100 align-top font-mono text-xs pr-4",children:e||" "})]},t))})]}):(0,a.jsx)("div",{className:"py-12 text-center text-slate-400 font-mono",children:_?"此文件为空或正在读取...":"请从左侧选择测试文件进行审查。"}),(0,a.jsxs)("div",{className:"absolute right-4 top-4 hidden md:flex flex-col gap-1 items-end pointer-events-none opacity-90",children:[(0,a.jsxs)("span",{className:"px-2 py-0.5 rounded-full bg-slate-800 text-slate-300 border border-slate-700 font-mono text-[10px] font-semibold",children:[(0,r.r9)(_||"test.ts").toUpperCase()," • UTF-8"]}),(0,a.jsx)("span",{className:"px-2 py-0.5 rounded-full bg-sky-950/80 text-sky-300 border border-sky-800/60 font-mono text-[10px] font-semibold",children:"Vitest Source"})]})]}):(0,a.jsxs)("div",{className:"space-y-3 min-h-[300px]",children:[E?.cwd===e&&E.file===_&&(0,a.jsxs)("div",{role:"status",className:"clay-inset rounded-xl p-4 text-sm font-semibold flex items-center gap-2 text-slate-800 dark:text-slate-100 border border-slate-200 dark:border-slate-800",children:[(0,a.jsx)("span",{className:"w-3 h-3 rounded-full bg-emerald-500 animate-spin"}),(0,a.jsxs)("span",{children:["正在运行 ",_,",最长等待 180 秒..."]})]}),K&&(0,a.jsx)("div",{role:"alert",className:"rounded-xl bg-rose-50 dark:bg-rose-950/40 p-4 text-sm text-rose-800 dark:text-rose-200 font-bold shadow-sm border border-rose-300 dark:border-rose-800",children:K}),!T&&!K&&!O&&(0,a.jsx)("div",{className:"clay-inset rounded-xl p-8 text-center text-sm text-slate-600 dark:text-slate-300 font-medium border border-slate-200 dark:border-slate-800",children:"尚未运行当前文件。点击下方「运行当前文件」即可就地执行。"}),T&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{className:`rounded-xl px-4 py-3 text-sm font-bold shadow-sm border ${T.success?"bg-emerald-50 text-emerald-800 border-emerald-300 dark:bg-emerald-950/50 dark:text-emerald-200 dark:border-emerald-800":"bg-rose-50 text-rose-800 border-rose-300 dark:bg-rose-950/50 dark:text-rose-200 dark:border-rose-800"}`,children:[T.success?"执行通过":"执行失败"," \xb7 ",T.passed," 通过 \xb7 ",T.failed," 失败 \xb7 ",T.skipped," 跳过 \xb7 ",n(T.durationMs)]}),(0,a.jsx)("div",{className:"max-h-[42vh] space-y-2 overflow-y-auto pr-1",children:T.tests.map((e,t)=>(0,a.jsxs)("div",{className:"clay-inset flex items-start justify-between gap-3 rounded-xl px-3.5 py-2.5 text-xs border border-slate-200 dark:border-slate-800",children:[(0,a.jsx)("span",{className:"min-w-0 break-words font-bold text-slate-900 dark:text-slate-100",title:e.name,children:e.name}),(0,a.jsxs)("span",{className:`shrink-0 font-mono font-bold ${"passed"===e.status?"text-emerald-700 dark:text-emerald-300":"failed"===e.status?"text-rose-700 dark:text-rose-300":"text-slate-600"}`,children:[e.status," \xb7 ",n(e.durationMs)]})]},`${e.name}:${t}`))}),T.output&&(0,a.jsxs)("details",{className:"clay-inset rounded-xl p-3 text-xs border border-slate-200 dark:border-slate-800",children:[(0,a.jsx)("summary",{className:"cursor-pointer font-bold text-slate-800 dark:text-slate-100",children:"运行输出"}),(0,a.jsx)("pre",{className:"mt-2 max-h-80 overflow-auto whitespace-pre-wrap break-all font-mono select-text clay-code-window p-3 rounded-xl",children:T.output})]})]})]}),(0,a.jsxs)("div",{className:"w-full flex flex-wrap items-center justify-between gap-3 pt-3 mt-3 border-t border-slate-200 dark:border-slate-800",children:[(0,a.jsx)("div",{className:"flex items-center gap-3",children:(0,a.jsxs)("div",{className:"flex items-center gap-1.5 px-3 py-1.5 rounded-full clay-inset text-slate-700 dark:text-slate-200 text-xs font-mono font-medium border border-slate-200 dark:border-slate-800",children:[(0,a.jsx)(d.df,{size:13,className:"text-emerald-500"}),(0,a.jsxs)("span",{children:["断言通过: ",(0,a.jsx)("strong",{className:"text-slate-950 dark:text-white font-bold",children:T?`${T.passed}/${T.tests.length}`:"—"})]})]})}),(0,a.jsxs)("div",{className:"flex items-center gap-2 flex-wrap",children:[(0,a.jsx)("button",{type:"button",className:"px-3.5 py-1.5 rounded-full clay-btn-soft text-slate-800 hover:text-slate-950 dark:text-slate-200 dark:hover:text-white text-xs font-bold shadow-sm",onClick:()=>x?x():s?.(),children:"改动对比"}),(0,a.jsx)("button",{type:"button",className:"clay-btn clay-btn-mint px-4 py-2 rounded-full text-xs font-bold text-white flex items-center gap-1.5 disabled:opacity-50 disabled:cursor-not-allowed shadow-md",onClick:()=>void V(),disabled:!_||O,children:(0,a.jsx)("span",{children:O?"执行中...":"运行当前文件"})}),(0,a.jsx)("button",{type:"button",className:"px-3.5 py-1.5 rounded-full clay-btn-soft text-emerald-800 hover:text-emerald-950 dark:text-emerald-300 dark:hover:text-emerald-100 font-bold text-xs shadow-sm",onClick:s,children:"工作台"})]})]})]}),(0,a.jsxs)("div",{className:"w-full grid grid-cols-1 md:grid-cols-3 gap-3",children:[(0,a.jsxs)("div",{className:"clay-card rounded-2xl p-3.5 flex flex-col gap-1.5 bg-white dark:bg-slate-900 border border-slate-200 dark:border-slate-800 shadow-sm",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("div",{className:"flex items-center gap-1.5 text-xs font-bold text-slate-900 dark:text-slate-100",children:[(0,a.jsx)(d.P9,{size:14,className:"text-sky-500"}),(0,a.jsx)("span",{children:"实际工作区"})]}),(0,a.jsx)("span",{className:"px-2 py-0.5 rounded-full bg-sky-100 text-sky-800 dark:bg-sky-950/60 dark:text-sky-300 text-[10px] font-bold border border-sky-300 dark:border-sky-800",children:e?"已选择":"未选择"})]}),(0,a.jsx)("p",{className:"font-mono text-[11px] text-slate-600 dark:text-slate-400 truncate",title:e,children:e}),(0,a.jsx)("p",{className:"text-[11px] text-slate-600 dark:text-slate-400",children:"测试直接使用此目录,不创建临时文件系统沙盒。"})]}),(0,a.jsxs)("div",{className:"clay-card rounded-2xl p-3.5 flex flex-col gap-1.5 bg-white dark:bg-slate-900 border border-slate-200 dark:border-slate-800 shadow-sm",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("div",{className:"flex items-center gap-1.5 text-xs font-bold text-slate-900 dark:text-slate-100",children:[(0,a.jsx)("span",{className:"w-2 h-2 rounded-full bg-emerald-500"}),(0,a.jsx)("span",{children:"执行权限说明"})]}),(0,a.jsx)("span",{className:"px-2 py-0.5 rounded-full bg-amber-100 text-amber-800 dark:bg-amber-950/60 dark:text-amber-300 text-[10px] font-bold border border-amber-300 dark:border-amber-800",children:"仅限可信代码"})]}),(0,a.jsx)("p",{className:"text-[11px] text-slate-600 dark:text-slate-400 leading-tight",children:"测试继承服务进程环境变量,可访问文件和网络;PI_OFFLINE 不提供系统级网络隔离。"})]}),(0,a.jsxs)("div",{className:"clay-card rounded-2xl p-3.5 flex flex-col gap-1.5 bg-white dark:bg-slate-900 border border-slate-200 dark:border-slate-800 shadow-sm",children:[(0,a.jsxs)("div",{className:"flex items-center justify-between",children:[(0,a.jsxs)("div",{className:"flex items-center gap-1.5 text-xs font-bold text-slate-900 dark:text-slate-100",children:[(0,a.jsx)("span",{className:"w-2 h-2 rounded-full bg-amber-500"}),(0,a.jsx)("span",{children:"运行状态"})]}),(0,a.jsx)("span",{className:"px-2 py-0.5 rounded-full bg-amber-100 text-amber-800 dark:bg-amber-950/60 dark:text-amber-300 text-[10px] font-bold border border-amber-300 dark:border-amber-800",children:O?"执行中":T?T.success?"已通过":"已失败":"未运行"})]}),(0,a.jsxs)("div",{className:"flex items-center justify-between text-[11px] font-mono text-slate-700 dark:text-slate-300 font-semibold pt-0.5",children:[(0,a.jsx)("span",{children:"Worker / PID"}),(0,a.jsx)("span",{children:"未采集"})]}),(0,a.jsxs)("div",{className:"flex items-center justify-between text-[11px] font-mono text-slate-700 dark:text-slate-300 font-semibold",children:[(0,a.jsx)("span",{children:"执行时限"}),(0,a.jsx)("span",{children:"180 秒"})]})]})]})]})]})]})}}}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[552,635,1097,2138,2164,2437,2772,2836,2922,4459,4602,4896,5221,5368,5907,6031,6450,6819,6849,6884,6988,7664,7822,7851,8091,8167,8651,9223,9289,9742,9968],{4441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[552,635,1097,2138,2164,2437,2772,2836,2922,4459,4602,4896,5221,5368,5907,6031,6450,6819,6849,6884,6988,7664,7822,7851,8091,8167,8651,9223,9289,9742,9968],{4441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[552,635,1097,2138,2164,2437,2772,2836,2922,4459,4602,4896,5221,5368,5907,6031,6450,6819,6849,6884,6988,7664,7822,7851,8091,8167,8651,9223,9289,9742,9968],{4441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[552,635,1097,2138,2164,2437,2772,2836,2922,4459,4602,4896,5221,5368,5907,6031,6450,6819,6849,6884,6988,7664,7822,7851,8091,8167,8651,9223,9289,9742,9968],{4441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[552,635,1097,2138,2164,2437,2772,2836,2922,4459,4602,4896,5221,5368,5907,6031,6450,6819,6849,6884,6988,7664,7822,7851,8091,8167,8651,9223,9289,9742,9968],{4441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[552,635,1097,2138,2164,2437,2772,2836,2922,4459,4602,4896,5221,5368,5907,6031,6450,6819,6849,6884,6988,7664,7822,7851,8091,8167,8651,9223,9289,9742,9968],{4441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[552,635,1097,2138,2164,2437,2772,2836,2922,4459,4602,4896,5221,5368,5907,6031,6450,6819,6849,6884,6988,7664,7822,7851,8091,8167,8651,9223,9289,9742,9968],{4441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[552,635,1097,2138,2164,2437,2772,2836,2922,4459,4602,4896,5221,5368,5907,6031,6450,6819,6849,6884,6988,7664,7822,7851,8091,8167,8651,9223,9289,9742,9968],{4441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[552,635,1097,2138,2164,2437,2772,2836,2922,4459,4602,4896,5221,5368,5907,6031,6450,6819,6849,6884,6988,7664,7822,7851,8091,8167,8651,9223,9289,9742,9968],{4441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[552,635,1097,2138,2164,2437,2772,2836,2922,4459,4602,4896,5221,5368,5907,6031,6450,6819,6849,6884,6988,7664,7822,7851,8091,8167,8651,9223,9289,9742,9968],{4441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[552,635,1097,2138,2164,2437,2772,2836,2922,4459,4602,4896,5221,5368,5907,6031,6450,6819,6849,6884,6988,7664,7822,7851,8091,8167,8651,9223,9289,9742,9968],{4441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[552,635,1097,2138,2164,2437,2772,2836,2922,4459,4602,4896,5221,5368,5907,6031,6450,6819,6849,6884,6988,7664,7822,7851,8091,8167,8651,9223,9289,9742,9968],{4441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[552,635,1097,2138,2164,2437,2772,2836,2922,4459,4602,4896,5221,5368,5907,6031,6450,6819,6849,6884,6988,7664,7822,7851,8091,8167,8651,9223,9289,9742,9968],{4441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[552,635,1097,2138,2164,2437,2772,2836,2922,4459,4602,4896,5221,5368,5907,6031,6450,6819,6849,6884,6988,7664,7822,7851,8091,8167,8651,9223,9289,9742,9968],{4441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[552,635,1097,2138,2164,2437,2772,2836,2922,4459,4602,4896,5221,5368,5907,6031,6450,6819,6849,6884,6988,7664,7822,7851,8091,8167,8651,9223,9289,9742,9968],{4441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[552,635,1097,2138,2164,2437,2772,2836,2922,4459,4602,4896,5221,5368,5907,6031,6450,6819,6849,6884,6988,7664,7822,7851,8091,8167,8651,9223,9289,9742,9968],{4441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[552,635,1097,2138,2164,2437,2772,2836,2922,4459,4602,4896,5221,5368,5907,6031,6450,6819,6849,6884,6988,7664,7822,7851,8091,8167,8651,9223,9289,9742,9968],{4441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[552,635,1097,2138,2164,2437,2772,2836,2922,4459,4602,4896,5221,5368,5907,6031,6450,6819,6849,6884,6988,7664,7822,7851,8091,8167,8651,9223,9289,9742,9968],{4441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[552,635,1097,2138,2164,2437,2772,2836,2922,4459,4602,4896,5221,5368,5907,6031,6450,6819,6849,6884,6988,7664,7822,7851,8091,8167,8651,9223,9289,9742,9968],{4441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[552,635,1097,2138,2164,2437,2772,2836,2922,4459,4602,4896,5221,5368,5907,6031,6450,6819,6849,6884,6988,7664,7822,7851,8091,8167,8651,9223,9289,9742,9968],{4441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[552,635,1097,2138,2164,2437,2772,2836,2922,4459,4602,4896,5221,5368,5907,6031,6450,6819,6849,6884,6988,7664,7822,7851,8091,8167,8651,9223,9289,9742,9968],{4441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[552,635,1097,2138,2164,2437,2772,2836,2922,4459,4602,4896,5221,5368,5907,6031,6450,6819,6849,6884,6988,7664,7822,7851,8091,8167,8651,9223,9289,9742,9968],{4441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[552,635,1097,2138,2164,2437,2772,2836,2922,4459,4602,4896,5221,5368,5907,6031,6450,6819,6849,6884,6988,7664,7822,7851,8091,8167,8651,9223,9289,9742,9968],{4441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[552,635,1097,2138,2164,2437,2772,2836,2922,4459,4602,4896,5221,5368,5907,6031,6450,6819,6849,6884,6988,7664,7822,7851,8091,8167,8651,9223,9289,9742,9968],{4441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[552,635,1097,2138,2164,2437,2772,2836,2922,4459,4602,4896,5221,5368,5907,6031,6450,6819,6849,6884,6988,7664,7822,7851,8091,8167,8651,9223,9289,9742,9968],{4441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[552,635,1097,2138,2164,2437,2772,2836,2922,4459,4602,4896,5221,5368,5907,6031,6450,6819,6849,6884,6988,7664,7822,7851,8091,8167,8651,9223,9289,9742,9968],{4441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=4441)),_N_E=_.O()}]);
@@ -0,0 +1 @@
1
+ (self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[552,635,1097,2138,2164,2437,2772,2836,2922,4459,4602,4896,5221,5368,5907,6031,6450,6819,6849,6884,6988,7664,7822,7851,8091,8167,8651,9223,9289,9742,9968],{4441:()=>{}},_=>{_.O(0,[8441,3794,7358],()=>_(_.s=4441)),_N_E=_.O()}]);