@jetcrab/pi-desk 1.1.16 → 1.1.20-dev

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/docs/plugins.md +3 -1
  2. package/next.config.ts +1 -0
  3. package/package.json +4 -3
  4. package/src/client/l2_biz/workbench/file-workspace/l2-file-workspace-runtime.ts +1 -1
  5. package/src/client/l2_biz/workbench/hooks/l2-workbench-chat-reload.ts +42 -0
  6. package/src/client/l2_biz/workbench/l2-work-session-sidebar.tsx +19 -1
  7. package/src/client/l2_biz/workbench/l2-workbench-chat.ts +45 -0
  8. package/src/client/l2_biz/workbench/l2-workbench.tsx +4 -0
  9. package/src/client/l3_modules/conversation/l3-conversation-markdown.module.css +1 -0
  10. package/src/client/l3_modules/conversation/l3-conversation-markdown.tsx +10 -1
  11. package/src/client/l3_modules/project-files/l3-markdown-preview.tsx +10 -1
  12. package/src/client/l3_modules/project-files/l3-project-document-view.tsx +2 -0
  13. package/src/client/l3_modules/project-files/l3-project-file-browser.tsx +171 -229
  14. package/src/client/l3_modules/project-files/l3-project-file-runtime.ts +133 -70
  15. package/src/client/l3_modules/project-files/l3-project-reader.ts +4 -3
  16. package/src/client/l3_modules/project-files/views/l3-project-search-controls.tsx +201 -0
  17. package/src/client/l3_modules/project-files/views/l3-project-search-results.tsx +333 -0
  18. package/src/client/l4_foundation/ui/code/l4-code-preview.tsx +47 -3
  19. package/src/client/l4_foundation/ui/markdown/l4-markdown-remark.ts +89 -0
  20. package/src/client/l4_foundation/ui/markdown/l4-markdown.module.css +58 -0
  21. package/src/client/l4_foundation/ui/markdown/l4-markdown.tsx +108 -0
  22. package/src/common/l2_biz/work-session/l2-work-session-file-contract.ts +4 -3
  23. package/src/common/l2_biz/workbench/l2-workbench-locale-messages.ts +6 -0
  24. package/src/common/l3_modules/project-files/l3-project-files-contract.ts +2 -3
  25. package/src/common/l3_modules/project-files/l3-project-files-locale-messages.ts +56 -10
  26. package/src/common/l4_foundation/file/l4-project-file-contract.ts +51 -1
  27. package/src/common/l4_foundation/locale/l4-host-error-messages.ts +11 -0
  28. package/src/common/l4_foundation/locale/l4-locale-messages.ts +16 -0
  29. package/src/instrumentation.ts +0 -2
  30. package/src/server/l1_entry/api/l1-project-read-routes.ts +6 -4
  31. package/src/server/l1_entry/api/l1-project-route.ts +9 -8
  32. package/src/server/l1_entry/api/l1-work-session-file-error.ts +23 -0
  33. package/src/server/l2_biz/plugin-management/l2-plugin-management.ts +0 -3
  34. package/src/server/l2_biz/work-session/l2-work-session-chat-runtime.ts +30 -58
  35. package/src/server/l2_biz/work-session/l2-work-session-manage.ts +0 -4
  36. package/src/server/l4_foundation/file/l4-project-file-index.ts +276 -0
  37. package/src/server/l4_foundation/file/l4-project-search.ts +399 -0
  38. package/src/server/l4_foundation/file/l4-ripgrep-search.ts +192 -0
  39. package/src/server/l4_foundation/file/l4-work-session-project-file.ts +8 -332
  40. package/src/server/l4_foundation/pi/l4-pi-package-maintenance.ts +0 -6
  41. package/src/server/l4_foundation/pi/l4-pi-plugin-capability-probe.ts +1 -3
  42. package/src/server/l4_foundation/pi/l4-pi-plugin-probe.ts +1 -3
  43. package/src/server/l4_foundation/pi/l4-pi-runner-process.ts +3 -15
  44. package/src/server/l4_foundation/process/l4-process-tree.js +31 -5
  45. package/temp/build/pi-desk/release/.next/BUILD_ID +1 -1
  46. package/temp/build/pi-desk/release/.next/build-manifest.json +3 -3
  47. package/temp/build/pi-desk/release/.next/prerender-manifest.json +3 -3
  48. package/temp/build/pi-desk/release/.next/react-loadable-manifest.json +1 -1
  49. package/temp/build/pi-desk/release/.next/required-server-files.js +4 -3
  50. package/temp/build/pi-desk/release/.next/required-server-files.json +4 -3
  51. package/temp/build/pi-desk/release/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  52. package/temp/build/pi-desk/release/.next/server/app/_global-error.html +1 -1
  53. package/temp/build/pi-desk/release/.next/server/app/_global-error.rsc +1 -1
  54. package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  55. package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  56. package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  57. package/temp/build/pi-desk/release/.next/server/app/_not-found/page.js +1 -1
  58. package/temp/build/pi-desk/release/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  59. package/temp/build/pi-desk/release/.next/server/app/api/health/route.js +1 -1
  60. package/temp/build/pi-desk/release/.next/server/app/api/project-files/get/route.js +2 -1
  61. package/temp/build/pi-desk/release/.next/server/app/api/project-files/list/route.js +2 -1
  62. package/temp/build/pi-desk/release/.next/server/app/api/project-files/reveal/route.js +1 -1
  63. package/temp/build/pi-desk/release/.next/server/app/api/project-files/search/route.js +2 -1
  64. package/temp/build/pi-desk/release/.next/server/app/api/project-git/get/route.js +2 -1
  65. package/temp/build/pi-desk/release/.next/server/app/api/project-git-branches/list/route.js +2 -1
  66. package/temp/build/pi-desk/release/.next/server/app/api/project-git-changes/list/route.js +2 -1
  67. package/temp/build/pi-desk/release/.next/server/app/api/project-git-diff/get/route.js +2 -1
  68. package/temp/build/pi-desk/release/.next/server/app/api/project-git-heads/get/route.js +2 -1
  69. package/temp/build/pi-desk/release/.next/server/app/api/project-git-log/list/route.js +2 -1
  70. package/temp/build/pi-desk/release/.next/server/app/login/page.js +1 -1
  71. package/temp/build/pi-desk/release/.next/server/app/login/page_client-reference-manifest.js +1 -1
  72. package/temp/build/pi-desk/release/.next/server/app/page.js +77 -77
  73. package/temp/build/pi-desk/release/.next/server/app/page_client-reference-manifest.js +1 -1
  74. package/temp/build/pi-desk/release/.next/server/chunks/{33658.js → 10881.js} +8 -8
  75. package/temp/build/pi-desk/release/.next/server/chunks/23054.js +1 -1
  76. package/temp/build/pi-desk/release/.next/server/chunks/25406.js +3 -3
  77. package/temp/build/pi-desk/release/.next/server/chunks/35985.js +5 -5
  78. package/temp/build/pi-desk/release/.next/server/chunks/50520.js +2 -4
  79. package/temp/build/pi-desk/release/.next/server/chunks/6917.js +1 -1
  80. package/temp/build/pi-desk/release/.next/server/chunks/70780.js +1 -0
  81. package/temp/build/pi-desk/release/.next/server/chunks/74528.js +1 -1
  82. package/temp/build/pi-desk/release/.next/server/chunks/92386.js +1 -1
  83. package/temp/build/pi-desk/release/.next/server/instrumentation.js +1 -1
  84. package/temp/build/pi-desk/release/.next/server/middleware-build-manifest.js +1 -1
  85. package/temp/build/pi-desk/release/.next/server/middleware-react-loadable-manifest.js +1 -1
  86. package/temp/build/pi-desk/release/.next/server/pages/500.html +1 -1
  87. package/temp/build/pi-desk/release/.next/server/server-reference-manifest.json +1 -1
  88. package/temp/build/pi-desk/release/.next/static/chunks/27611-0890482fe76bd9d6.js +238 -0
  89. package/temp/build/pi-desk/release/.next/static/chunks/{31087-ba426d09d6f68bfd.js → 31087-d8e5765d541d5c26.js} +1 -1
  90. package/temp/build/pi-desk/release/.next/static/chunks/{49516-cc4dcd84d64ab4fe.js → 51474-8dc714cb76b2e60a.js} +2 -2
  91. package/temp/build/pi-desk/release/.next/static/chunks/77592-5bef6acb8e7c4b96.js +13 -0
  92. package/temp/build/pi-desk/release/.next/static/chunks/app/layout-a50c456648537afb.js +3 -0
  93. package/temp/build/pi-desk/release/.next/static/chunks/app/{page-0069319a4fb97211.js → page-0789c43551b29dd2.js} +4 -4
  94. package/temp/build/pi-desk/release/.next/static/chunks/{webpack-40a782fc8a3535b9.js → webpack-d7248206b7fc7ba8.js} +1 -1
  95. package/temp/build/pi-desk/release/.next/static/css/250a6b93cc2222d1.css +1 -0
  96. package/temp/build/pi-desk/release/.next/static/css/6dbae2922f88ca31.css +1 -0
  97. package/temp/build/pi-desk/release/.next/static/css/a4cf28fd76c70165.css +1 -0
  98. package/temp/build/pi-desk/release/.next/trace-build +1 -1
  99. package/temp/build/pi-desk/release/.next/server/chunks/8584.js +0 -2
  100. package/temp/build/pi-desk/release/.next/static/chunks/39654-b5fedd762ea0312e.js +0 -238
  101. package/temp/build/pi-desk/release/.next/static/chunks/75130-d2ca74894aff8085.js +0 -13
  102. package/temp/build/pi-desk/release/.next/static/chunks/app/layout-c0e1c5cef8620cf8.js +0 -3
  103. package/temp/build/pi-desk/release/.next/static/css/6427d02b6edf406f.css +0 -1
  104. package/temp/build/pi-desk/release/.next/static/css/949d0d1a99d5de92.css +0 -1
  105. /package/temp/build/pi-desk/release/.next/static/{DqamF28k0ShQLbNVzXDIj → RLKcK-RQF5FvEeDmS9uih}/_buildManifest.js +0 -0
  106. /package/temp/build/pi-desk/release/.next/static/{DqamF28k0ShQLbNVzXDIj → RLKcK-RQF5FvEeDmS9uih}/_ssgManifest.js +0 -0
@@ -1,2 +0,0 @@
1
- "use strict";exports.id=8584,exports.ids=[8584],exports.modules={193:(a,b,c)=>{c.d(b,{OC:()=>u,Ot:()=>l,Xe:()=>m,ZI:()=>o,_X:()=>q,fg:()=>n,p0:()=>p,p3:()=>s,ry:()=>r,ys:()=>t});var d=c(59473),e=c(63719),f=c(66951),g=c(39792);let h=d.Ik({cwd:d.Yj().trim().min(1).max(4096),workId:d.Yj().trim().min(1).optional()}).strict(),i=h.extend({repositoryRoot:e.rh}),j=h.extend({path:e.eC,imagePreviewMode:e.p$}).superRefine((a,b)=>{a.workId||e._g.safeParse(a.path).success||b.addIssue({code:"custom",path:["path"],message:"独立项目预览只接受根内相对路径"})}),k=d.k5(["file","directory"]),l={path:"/api/project-files/reveal",request:h.extend({path:d.KC([e.rh,e.eC]),targetType:k.optional()}).refine(a=>""!==a.path||"directory"===a.targetType,"文件路径不能为空").refine(a=>a.workId&&"directory"!==a.targetType||e.rh.safeParse(a.path).success,"独立项目和目录定位只接受根内相对路径"),response:d.Ik({}).strict()},m={path:"/api/project-files/list",request:h.extend({path:e.rh}).strict(),response:e.JH},n={path:"/api/project-files/search",request:h.extend({query:d.Yj().trim().min(1).max(200)}).strict(),response:e.jI},o={path:"/api/project-files/get",request:j,response:e.ih},p={path:"/api/project-git/get",request:h.extend({refresh:d.zM().optional()}).strict(),response:d.Ik({repositories:d.YO(f.u2).max(100)}).strict()},q={path:"/api/project-git-heads/get",request:h,response:d.Ik({repositories:d.YO(f.yl).max(f.y2)}).strict()},r={path:"/api/project-git-branches/list",request:i.strict(),response:g.WW},s={path:"/api/project-git-log/list",request:i.extend(g.co.shape).strict(),response:g.yw},t={path:"/api/project-git-changes/list",request:i.extend(g.ph.shape).strict(),response:g.T8},u={path:"/api/project-git-diff/get",request:i.extend({path:e._g,comparison:g.xv.optional()}).strict(),response:g.lw}},8127:(a,b,c)=>{c.d(b,{m:()=>f});var d=c(52913),e=c(8602);function f(a){if(a instanceof Error&&"WorkSessionNotFoundError"===a.name)return(0,e.e)(404,"工作会话不存在",{key:"errors:sessionMissing"});if(a instanceof Error&&"WorkSessionProjectChangedError"===a.name)return(0,e.e)(409,"工作会话项目已变化",{key:"errors:projectChanged"});switch((0,d.C$)(a)){case"project-not-found":return(0,e.e)(404,"项目目录不存在",{key:"errors:projectMissing"});case"not-repository":return(0,e.e)(404,"Git 仓库不存在",{key:"errors:repositoryMissing"});case"outside-project":return(0,e.e)(403,"Git 目标不在当前项目目录内",{key:"errors:gitOutsideProject"});case"invalid-ref":return(0,e.e)(400,a instanceof Error?a.message:"Git 分支无效");case"scan-limit":return(0,e.e)(413,a instanceof Error?a.message:"Git 仓库过大");case"operation-failed":return(0,e.e)(409,a instanceof Error?a.message:"Git 操作失败");case"read-failed":return(0,e.e)(500,"读取 Git 仓库失败",{key:"errors:gitReadFailed"});case null:return null}}},8584:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Cx:()=>n,Dk:()=>r,Ql:()=>m,bF:()=>o,gF:()=>k,jP:()=>s,u:()=>q,u8:()=>l,uP:()=>p});var e=c(193),f=c(60351),g=c(52913),h=c(17911),i=c(11420),j=a([f,i]);[f,i]=j.then?(await j)():j;let k=(0,i.G)(e.Xe,a=>(0,f.cv)(a.cwd,a.path)),l=(0,i.G)(e.fg,a=>(0,f.wZ)(a.cwd,a.query)),m=(0,i.G)(e.ZI,a=>(0,f.dy)(a.cwd,a.path,a.imagePreviewMode)),n=(0,i.G)(e.p0,a=>(0,g.ib)(a.cwd,a.refresh)),o=(0,i.G)(e._X,a=>(0,g.hg)(a.cwd)),p=(0,i.G)(e.ry,a=>(0,h.Wf)(a.cwd,a.repositoryRoot)),q=(0,i.G)(e.p3,a=>(0,h.wZ)(a.cwd,a.repositoryRoot,a)),r=(0,i.G)(e.ys,a=>(0,h.rQ)(a.cwd,a.repositoryRoot,a)),s=(0,i.G)(e.OC,a=>(0,h.ji)(a.cwd,a.repositoryRoot,a.path,a.comparison));d()}catch(a){d(a)}})},11420:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{G:()=>l});var e=c(76760),f=c(23054),g=c(8602),h=c(52913),i=c(61371),j=c(8127),k=a([f,i]);function l(a,b){return async c=>{let d;try{d=await c.json()}catch{return(0,g.e)(400,"项目请求 JSON 格式无效",{key:"errors:projectJsonInvalid"})}let k=a.request.safeParse(d);if(!k.success)return(0,g.e)(400,"项目请求参数无效",{key:"errors:projectInputInvalid"});let l=k.data;if(!(0,e.isAbsolute)(l.cwd)||l.cwd.includes("\0"))return(0,g.e)(400,"项目目录必须是绝对路径",{key:"errors:projectCwdAbsolute"});try{let c;if(l.workId){let a=(0,f.JJ)(),b=await a.getWorkSession(l.workId);if(!b)return(0,g.e)(404,"工作会话不存在",{key:"errors:sessionMissing"});let d=a.getProjectPreviewContext(b,l.cwd);if(!d)return(0,g.e)(409,"工作会话项目已变化或预览目录未登记",{key:"errors:projectChanged"});l.cwd=d.cwd,c=d.isCurrent}let d=await b(l);if(c&&!c())return(0,g.e)(409,"工作会话项目已变化",{key:"errors:projectChanged"});return(0,g.n)(a.response.parse(d))}catch(b){if(console.warn("[Pi Desk][Project] 项目请求失败",{path:a.path,cwd:l.cwd,workId:l.workId,error:b instanceof Error?b.message:String(b)}),"read-failed"===(0,h.C$)(b))return(0,g.e)(500,b instanceof Error?b.message:"读取 Git 失败",b instanceof Error?void 0:{key:"errors:gitReadOperationFailed"});return(0,i.g)(b)??(0,j.m)(b)??(0,g.e)(500,"项目操作失败",{key:"errors:projectOperationFailed"})}}}[f,i]=k.then?(await k)():k,d()}catch(a){d(a)}})},17911:(a,b,c)=>{c.d(b,{ji:()=>u,Wf:()=>t,rQ:()=>s,wZ:()=>r});var d=c(63719),e=c(52913),f=c(96956),g=c(29671),h=c(39792),i=c(85224);let j="%H%x00%P%x00%an%x00%ct%x00%D%x00%s";async function k(a,b){let c=await (0,f.R)(a,b);if(0!==c.code)throw new g.q("read-failed",`读取 Git 失败:${c.stderr.trim().slice(0,1200)}`);return c.stdout}async function l(a,b){if(h.xi.parse(b),b.startsWith("refs/")&&0!==(await (0,f.R)(a,["check-ref-format",b])).code)throw new g.q("invalid-ref","Git 引用名称无效");let c=await (0,f.R)(a,["rev-parse","--verify","--end-of-options",`${b}^{commit}`]);if(0===c.code)return h.aD.parse(c.stdout.trim());if("HEAD"===b){let b=await (0,f.R)(a,["symbolic-ref","-q","HEAD"]);if(0===b.code&&1===(await (0,f.R)(a,["show-ref","--verify","--quiet",b.stdout.trim()])).code)return null}throw new g.q("invalid-ref",`Git 版本不存在或对象不可读:${b}`)}function m(a){if(6!==a.length||!Number.isFinite(Number(a[3])))throw new g.q("read-failed","Git 提交记录格式无效");return{oid:h.aD.parse(a[0]),parents:a[1]?a[1].split(" ").map(a=>h.aD.parse(a)):[],author:a[2],timestampMs:1e3*Number(a[3]),refs:a[4]?a[4].split(", "):[],subject:a[5]}}async function n(a,b){let c=(await k(a,["show","-s","--no-show-signature","--decorate=short",`--format=${j}%x00%B`,b,"--"])).split("\0");if(7!==c.length)throw new g.q("read-failed","Git 提交详情格式无效");return{...m(c.slice(0,6)),message:c[6].trimEnd()}}async function o(a,b,c){if(!b)return null;let d=await k(a,["--literal-pathspecs","ls-tree","-z",b,"--",c]);if(!d)return null;let e=d.split("\0").find(a=>a.slice(a.indexOf(" ")+1)===c);if(!e)return null;let[f,i,j]=e.slice(0,e.indexOf(" ")).split(" ");if(!f||!i||!j)throw new g.q("read-failed","Git 树对象格式无效");return{mode:f,type:i,oid:h.aD.parse(j)}}async function p(a,b){if(!b)return{kind:"text",content:""};let c=Number((await k(a,["cat-file","-s",b.oid])).trim());if(!Number.isSafeInteger(c)||c<0)throw new g.q("read-failed","Git 文件大小无效");if(c>d.NL)return{kind:"too_large"};let e=await (0,f.U)(a,["cat-file","blob",b.oid]);if(0!==e.code)throw new g.q("read-failed","Git 文件对象不可读");if(e.stdout.length>d.NL)return{kind:"too_large"};let h=(0,i.X)(e.stdout);return null===h?{kind:"binary"}:{kind:"text",content:h}}async function q(a,b,c){await l(a,c.targetCommit),c.baseCommit&&await l(a,c.baseCommit);let d=c.oldPath??b,[e,f]=await Promise.all([o(a,c.baseCommit,d),o(a,c.targetCommit,b)]);if(!e&&!f)throw new g.q("invalid-ref","文件不在指定的任一版本中");if(e&&"blob"!==e.type||f&&"blob"!==f.type||e&&f&&e.mode.slice(0,3)!==f.mode.slice(0,3)){let a=a=>a?`${a.type} \xb7 ${a.mode}
2
- ${a.oid}`:"不存在";return{kind:"metadata",original:a(e),modified:a(f)}}let[h,i]=await Promise.all([p(a,e),p(a,f)]);return"too_large"===h.kind||"too_large"===i.kind?{kind:"too_large"}:"text"!==h.kind||"text"!==i.kind?{kind:"binary"}:{kind:"text",original:{path:d,content:h.content},modified:{path:b,content:i.content}}}async function r(a,b,c){let d=await (0,e.H$)(a,b),f=await l(d,c.tip),h=c.exclude?await l(d,c.exclude):null;if(!f)return{tip:f,exclude:h,items:[],hasMore:!1,truncated:!1};let i=(await k(d,["log","-z","--topo-order","--no-show-signature","--decorate=short","--max-count=20001",`--format=${j}`,f,...h?[`^${h}`]:[],"--"])).split("\0");if(""===i.at(-1)&&i.pop(),i.length%6!=0)throw new g.q("read-failed","Git 提交列表格式无效");let n=[];for(let a=0;a<Math.min(i.length,12e4);a+=6)n.push(m(i.slice(a,a+6)));let o=c.query.toLocaleLowerCase(),p=c.author?.toLocaleLowerCase(),q=n.filter(a=>(!p||a.author.toLocaleLowerCase().includes(p))&&(!o||a.subject.toLocaleLowerCase().includes(o)||a.oid.includes(o))),r=(c.page.index-1)*c.page.size;return{tip:f,exclude:h,items:q.slice(r,r+c.page.size),hasMore:r+c.page.size<q.length,truncated:i.length>12e4}}async function s(a,b,c){let h,i,j,m=await (0,e.H$)(a,b),o=null;if("commit"in c.selection){let a=await l(m,c.selection.commit);if(!a)throw new g.q("invalid-ref","当前仓库还没有提交");let b=await n(m,a),d=c.selection.parent??b.parents[0]??null;if(d&&!b.parents.includes(d))throw new g.q("invalid-ref","选择的版本不是该提交的父提交");j=a,h=i=d,o={...b,selectedParent:d}}else{let a=await l(m,c.selection.base),b=await l(m,c.selection.target);if(!a||!b)throw new g.q("invalid-ref","比较分支还没有提交");if(h=a,j=b,i=h,"merge-base"===c.selection.strategy){let a=await (0,f.R)(m,["merge-base","--all",h,j]);if(0!==a.code&&1!==a.code)throw new g.q("read-failed","计算共同祖先失败");let b=a.stdout.trim().split(/\s+/).filter(Boolean);if(1!==b.length){let a="true"===(await k(m,["rev-parse","--is-shallow-repository"])).trim();throw new g.q("invalid-ref",b.length>1?"存在多个最佳共同祖先,请改用两个版本直接比较":a?"浅克隆历史不足,无法确定共同祖先;可改用直接比较":"两个版本没有共同祖先,可改用直接比较")}i=b[0]}}let p=i?["diff","--no-ext-diff","--no-textconv","--find-renames","--name-status","-z",i,j,"--"]:["diff-tree","--root","--no-commit-id","-r","--no-ext-diff","--no-textconv","--find-renames","--name-status","-z",j,"--"],q=(await k(m,p)).split("\0");""===q.at(-1)&&q.pop();let r=[];for(let a=0;a<q.length;){let b=q[a++],c=q[a++],e=b.startsWith("R")||b.startsWith("C"),f=e?q[a++]:c;if(!f||!d._g.safeParse(f).success||e&&!d._g.safeParse(c).success)throw new g.q("read-failed","变更包含无法展示的文件路径");let h="R"===b[0]?"renamed":"A"===b[0]||"C"===b[0]?"added":"D"===b[0]?"deleted":"T"===b[0]?"type-changed":"modified";if(r.push({path:f,oldPath:"R"===b[0]?c:null,status:h}),r.length>5e4)break}let s=(c.page.index-1)*c.page.size,t=r.slice(0,5e4);return{comparison:{base:h,target:j,original:i},commit:o,items:t.slice(s,s+c.page.size),hasMore:s+c.page.size<t.length,truncated:r.length>5e4}}async function t(a,b){let c=await (0,e.o9)(a,b);if("branch"!==c.head.type)return{...c,upstream:null};let d=await (0,e.H$)(a,b),g=(await k(d,["for-each-ref","--format=%(upstream)",`refs/heads/${c.head.name}`])).trim();if(!g)return{...c,upstream:null};let h=await (0,f.R)(d,["rev-list","--left-right","--count",`HEAD...${g}`,"--"]),[i,j]=h.stdout.trim().split(/\s+/).map(Number);return{...c,upstream:{ref:g,ahead:0===h.code&&Number.isSafeInteger(i)?i:null,behind:0===h.code&&Number.isSafeInteger(j)?j:null}}}async function u(a,b,c,d){return d?q(await (0,e.H$)(a,b),c,d):(0,e.bv)(a,b,c)}},39792:(a,b,c)=>{c.d(b,{T8:()=>q,WW:()=>r,aD:()=>g,co:()=>m,lw:()=>s,ph:()=>p,xi:()=>h,xv:()=>k,yw:()=>n});var d=c(59473),e=c(63719),f=c(66951);let g=d.Yj().regex(/^(?:[0-9a-f]{40}|[0-9a-f]{64})$/),h=d.KC([g,d.eu("HEAD"),d.Yj().max(1024).regex(/^refs\/(?:heads|remotes)\/[^\0\r\n]+$/)]).refine(a=>!a.includes("..")&&!a.endsWith("/"),"Git 版本无效"),i=d.KC([d.Ik({commit:h,parent:g.optional()}).strict(),d.Ik({base:h,target:h,strategy:d.k5(["merge-base","direct"])}).strict()]),j=d.Ik({base:g.nullable(),target:g,original:g.nullable()}).strict(),k=d.Ik({baseCommit:g.nullable(),targetCommit:g,oldPath:e._g.optional()}).strict(),l=d.Ik({oid:g,parents:d.YO(g),subject:d.Yj(),author:d.Yj(),timestampMs:d.ai().int(),refs:d.YO(d.Yj())}).strict(),m=d.Ik({tip:h,exclude:h.optional(),query:d.Yj().trim().max(200).default(""),author:d.Yj().trim().max(200).optional(),page:d.Ik({index:d.ai().int().min(1).max(2e3),size:d.ai().int().min(1).max(100)}).strict()}).strict(),n=d.Ik({tip:g.nullable(),exclude:g.nullable(),items:d.YO(l),hasMore:d.zM(),truncated:d.zM()}).strict(),o=d.Ik({path:e._g,oldPath:e._g.nullable(),status:d.k5(["added","modified","deleted","renamed","type-changed"])}).strict(),p=d.Ik({selection:i,page:d.Ik({index:d.ai().int().min(1).max(5e4),size:d.ai().int().min(1).max(500)}).strict()}).strict(),q=d.Ik({comparison:j,commit:l.extend({message:d.Yj(),selectedParent:g.nullable()}).nullable(),items:d.YO(o),hasMore:d.zM(),truncated:d.zM()}).strict(),r=f.gf.extend({upstream:d.Ik({ref:d.Yj(),ahead:d.ai().int().nonnegative().nullable(),behind:d.ai().int().nonnegative().nullable()}).strict().nullable()}).strict(),s=d.KC([f.FJ,d.Ik({kind:d.eu("metadata"),original:d.Yj(),modified:d.Yj()}).strict()])},61371:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{g:()=>h});var e=c(60351),f=c(8602),g=a([e]);function h(a){if(a instanceof Error&&"WorkSessionNotFoundError"===a.name)return(0,f.e)(404,"工作会话不存在",{key:"errors:sessionMissing"});if(a instanceof Error&&"WorkSessionProjectChangedError"===a.name)return(0,f.e)(409,"工作会话项目已变化",{key:"errors:projectChanged"});switch((0,e.Vp)(a)){case"not-found":return(0,f.e)(404,"文件或目录不存在",{key:"errors:fileMissing"});case"not-directory":return(0,f.e)(400,"目标不是目录",{key:"errors:notDirectory"});case"not-file":return(0,f.e)(400,"目标不是文件",{key:"errors:notFile"});case"outside-project":return(0,f.e)(403,"目标不在当前项目目录内",{key:"errors:outsideProject"});case"text-too-large":return(0,f.e)(413,"文本文件超过 5MB,暂不支持在线预览",{key:"errors:textTooLarge"});case"image-too-large":return(0,f.e)(413,"图片过大,暂不支持在线预览",{key:"errors:imageTooLarge"});case"unsupported":return(0,f.e)(415,"当前文件类型不支持在线预览",{key:"errors:previewUnsupported"});case"read-failed":return(0,f.e)(500,"读取项目文件失败",{key:"errors:fileReadFailed"});case"reveal-failed":return(0,f.e)(500,"打开所在文件夹失败",{key:"errors:revealFailed"});case null:return null}}e=(g.then?(await g)():g)[0],d()}catch(a){d(a)}})}};