@jetcrab/pi-desk 1.1.23-dev → 1.1.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/commands.md +4 -2
- package/docs/plugins.md +2 -0
- package/package.json +2 -2
- package/src/app/project-preview/page.tsx +13 -0
- package/src/client/l1_entry/pages/l1-project-preview-page.tsx +1 -5
- package/src/client/l2_biz/project-preview/hooks/l2-use-project-preview.ts +25 -0
- package/src/client/l2_biz/project-preview/l2-project-preview-storage.ts +7 -7
- package/src/client/l2_biz/project-preview/l2-project-preview.tsx +8 -5
- package/src/client/l2_biz/project-preview/runtime/l2-project-history-runtime.ts +14 -11
- package/src/client/l2_biz/project-preview/views/l2-project-branch-select.tsx +347 -0
- package/src/client/l2_biz/project-preview/views/l2-project-change-tree.tsx +28 -11
- package/src/client/l2_biz/project-preview/views/l2-project-history-list.tsx +35 -8
- package/src/client/l2_biz/project-preview/views/l2-project-history-view.tsx +46 -48
- package/src/client/l2_biz/workbench/file-workspace/l2-file-workspace-runtime.ts +2 -1
- package/src/client/l2_biz/workbench/file-workspace/l2-file-workspace-view.tsx +6 -2
- package/src/client/l3_modules/conversation/l3-conversation-viewport.tsx +18 -8
- package/src/client/l3_modules/project-files/l3-project-document-view.tsx +7 -4
- package/src/client/l3_modules/project-files/l3-project-file-runtime.ts +181 -89
- package/src/client/l3_modules/project-files/l3-project-file-tabs.tsx +80 -28
- package/src/common/l2_biz/project-preview/l2-project-history-messages.ts +4 -2
- package/src/common/l2_biz/project-preview/l2-project-preview-navigation.ts +14 -0
- package/src/server/l1_entry/api/l1-plugin-management-route.ts +0 -4
- package/src/server/l2_biz/plugin-management/l2-plugin-management.ts +4 -37
- package/src/server/l2_biz/plugin-management/l2-plugin-updates.ts +1 -4
- package/src/server/l2_biz/work-session/l2-work-session-chat-runtime.ts +4 -2
- package/src/server/l4_foundation/pi/l4-pi-chat-worker.ts +16 -1
- package/src/server/l4_foundation/pi/l4-pi-package-root-consistency.ts +3 -6
- package/src/server/l4_foundation/pi/l4-pi-package-root-gate.ts +1 -1
- package/src/server/l4_foundation/pi/l4-pi-plugin-owner-runtime.ts +4 -0
- package/src/server/l4_foundation/pi/l4-pi-plugin-sources.ts +5 -1
- package/src/server/l4_foundation/pi/l4-pi-session-initialization.ts +30 -34
- package/src/server/l4_foundation/pi/l4-pi-session-resources.ts +15 -14
- package/src/server/l4_foundation/pi/l4-pi-work-session-runtime.ts +1 -1
- package/src/server/l4_foundation/skills/runtime/l4-skill-catalog.ts +159 -166
- package/temp/build/pi-desk/release/.next/BUILD_ID +1 -1
- package/temp/build/pi-desk/release/.next/build-manifest.json +3 -3
- package/temp/build/pi-desk/release/.next/prerender-manifest.json +3 -3
- package/temp/build/pi-desk/release/.next/react-loadable-manifest.json +1 -1
- package/temp/build/pi-desk/release/.next/required-server-files.js +3 -3
- package/temp/build/pi-desk/release/.next/required-server-files.json +3 -3
- package/temp/build/pi-desk/release/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/_global-error.html +1 -1
- package/temp/build/pi-desk/release/.next/server/app/_global-error.rsc +1 -1
- package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
- package/temp/build/pi-desk/release/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/temp/build/pi-desk/release/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/health/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/add/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/apply/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/batch/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/del/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/enabled-set/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/get/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/list/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/reload/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/api/plugins/update/route.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/page.js +2 -2
- package/temp/build/pi-desk/release/.next/server/app/page_client-reference-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/project-preview/page.js +1 -1
- package/temp/build/pi-desk/release/.next/server/app/project-preview/page_client-reference-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/chunks/16438.js +1 -1
- package/temp/build/pi-desk/release/.next/server/chunks/18748.js +1 -0
- package/temp/build/pi-desk/release/.next/server/chunks/24557.js +1 -1
- package/temp/build/pi-desk/release/.next/server/chunks/25406.js +13 -14
- package/temp/build/pi-desk/release/.next/server/chunks/27344.js +15 -0
- package/temp/build/pi-desk/release/.next/server/chunks/35985.js +1 -1
- package/temp/build/pi-desk/release/.next/server/chunks/36361.js +2 -2
- package/temp/build/pi-desk/release/.next/server/chunks/50520.js +2 -2
- package/temp/build/pi-desk/release/.next/server/chunks/6917.js +1 -1
- package/temp/build/pi-desk/release/.next/server/chunks/80290.js +1 -1
- package/temp/build/pi-desk/release/.next/server/chunks/92386.js +15 -16
- package/temp/build/pi-desk/release/.next/server/instrumentation.js +1 -1
- package/temp/build/pi-desk/release/.next/server/middleware-build-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/temp/build/pi-desk/release/.next/server/pages/500.html +1 -1
- package/temp/build/pi-desk/release/.next/server/server-reference-manifest.json +1 -1
- package/temp/build/pi-desk/release/.next/static/chunks/15302-6e070e13fa65c863.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/19991.bcca96d396b83030.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/65232-ef4e5a4174f62faf.js +15 -0
- package/temp/build/pi-desk/release/.next/static/chunks/app/{page-54040b9fd54ee8b3.js → page-18d63fd3920dfae0.js} +3 -3
- package/temp/build/pi-desk/release/.next/static/chunks/app/project-preview/page-038b6c14e03ed878.js +1 -0
- package/temp/build/pi-desk/release/.next/static/chunks/{webpack-48eecbb66781c006.js → webpack-c0b805df46fcf8b3.js} +1 -1
- package/temp/build/pi-desk/release/.next/static/css/c43b04c244a64fb4.css +1 -0
- package/temp/build/pi-desk/release/.next/trace-build +1 -1
- package/temp/build/pi-desk/release/.next/server/chunks/20460.js +0 -15
- package/temp/build/pi-desk/release/.next/server/chunks/93049.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/15302-9c807afc6c60de0c.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/19991.8aa2e4b6df15fad6.js +0 -1
- package/temp/build/pi-desk/release/.next/static/chunks/9038-05fd2688407b39c1.js +0 -15
- package/temp/build/pi-desk/release/.next/static/chunks/app/project-preview/page-bc18765121950e65.js +0 -1
- package/temp/build/pi-desk/release/.next/static/css/10e063cfb3cda7bd.css +0 -1
- /package/temp/build/pi-desk/release/.next/static/{gAYTx4KJJR3vTtGYexj4J → 6a4eIEjmpW5l8Qlgtzzzg}/_buildManifest.js +0 -0
- /package/temp/build/pi-desk/release/.next/static/{gAYTx4KJJR3vTtGYexj4J → 6a4eIEjmpW5l8Qlgtzzzg}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";exports.id=6917,exports.ids=[6917],exports.modules={18:(a,b,c)=>{c.d(b,{FR:()=>m,kn:()=>l,zR:()=>k});var d=c(89409),e=c(25984);function f(a){return`${a.location.index}:${a.location.entryId}`}let g={user:["viewKey","hasDetail"],assistant:["viewKey","status","hasDetail","usage"],tool:["viewKey","status","hasDetail","usage"],bash:["viewKey","status","hasDetail"],custom:["viewKey","hasDetail"]};function h(a,b,c){if(!b)return a;let e={...a,...b};return"summary"===c?d.Hf.parse(e):d.D8.parse(e)}function i(a,b){if(Array.isArray(a.parent)){if("number"!=typeof a.key)throw Error("Increment array key is invalid");a.parent[a.key]=b;return}if("string"!=typeof a.key)throw Error("Increment object key is invalid");a.parent[a.key]=b}function j(a,b,c){let e=structuredClone(a),f=function(a,b){if(0===b.length)throw Error("Increment cannot append to the message layer root");let c=a;for(let a of b.slice(0,-1)){if("number"==typeof a){if(!Array.isArray(c)||a>=c.length)throw Error(`Increment array path does not exist: ${a}`);c=c[a];continue}if(!c||"object"!=typeof c||Array.isArray(c))throw Error(`Increment object path does not exist: ${a}`);if(!Object.hasOwn(c,a))throw Error(`Increment object field does not exist: ${a}`);c=c[a]}let d=b.at(-1);if("number"==typeof d){if(!Array.isArray(c)||d>=c.length)throw Error(`Increment array target does not exist: ${d}`);return{parent:c,key:d,value:c[d]}}if(!c||"object"!=typeof c||Array.isArray(c))throw Error(`Increment object target does not exist: ${d}`);if(!Object.hasOwn(c,d))throw Error(`Increment target does not exist: ${d}`);return{parent:c,key:d,value:c[d]}}(e,b);if("string"==typeof c){if("string"!=typeof f.value)throw Error("Increment target is not a string");return i(f,`${f.value}${c}`),d.Hf.parse(e)}if(!Array.isArray(f.value))throw Error("Increment target is not an array");return i(f,[...f.value,...c]),d.Hf.parse(e)}function k(a,b,c){let e=new Map(a.messages.filter(a=>void 0!==a.detail).map(a=>[f(a),a]));return{messages:b.map(a=>{let b=e.get(f(a));return a.fixed.hasDetail&&b&&b.fixed.type===a.fixed.type&&b.fixed.viewKey===a.fixed.viewKey&&void 0!==b.detail?d.mj.parse({...a,detail:b.detail}):a}),temporaryMessages:[...c]}}function l(a,b){if("message_start"===b.type){if(a.temporaryMessages.some(a=>a.location.tempId===b.snapshot.location.tempId))throw Error(`Temporary conversation message already exists: ${b.snapshot.location.tempId}`);return{...a,temporaryMessages:[...a.temporaryMessages,b.snapshot]}}let c=a.temporaryMessages.findIndex(a=>a.location.tempId===b.location.tempId);if(c<0)throw Error(`Temporary conversation message was not found: ${b.location.tempId}`);if("message_update"===b.type){let f=[...a.temporaryMessages];return f[c]=function(a,b){var c,f;if(a.location.tempId!==b.location.tempId)throw Error(`Conversation update tempId mismatch: ${b.location.tempId}`);let i=(c=a.fixed,(f=b.fixed)?(!function(a,b,c){let d=Object.keys(a).filter(a=>!b.includes(a));if(d.length>0)throw Error(`${c} patch contains fields invalid for the current message: ${d}`)}(f,g[c.type],`${c.type} fixed`),d.q5.parse({...c,...f})):c),k=h(a.summary,b.summary,"summary"),l=a.detail;if(void 0!==b.detail||Object.keys(b.increments??{}).some(a=>"detail"===(0,e.U)(a).root)){if(b.fixed?.hasDetail===!1)throw Error("Realtime detail cannot be updated while explicitly clearing hasDetail");i.hasDetail||(i=d.q5.parse({...i,hasDetail:!0}))}for(let[a,c]of(b.detail&&(l=h(l??{},b.detail,"detail")),Object.entries(b.increments??{}))){let b=(0,e.U)(a);"summary"===b.root?k=j(k,b.segments,c):l=j(l??{},b.segments,c)}return i.hasDetail||(l=void 0),d.s4.parse({location:a.location,fixed:i,summary:k,...void 0===l?{}:{detail:l}})}(f[c],b),{...a,temporaryMessages:f}}if("message_discard"===b.type)return{...a,temporaryMessages:a.temporaryMessages.filter(a=>a.location.tempId!==b.location.tempId)};if(b.durable.index!==a.messages.length)throw Error(`Conversation commit index is not continuous: expected ${a.messages.length}, received ${b.durable.index}`);if(a.messages.some(a=>a.location.entryId===b.durable.entryId))throw Error(`Conversation commit entryId already exists: ${b.durable.entryId}`);let{detail:f,fixed:i,...k}=a.temporaryMessages[c],l=d.mj.parse({...k,location:b.durable,fixed:{...i,timestampMs:b.fixed.timestampMs},...i.hasDetail&&void 0!==f?{detail:f}:{}});return{messages:[...a.messages,l],temporaryMessages:a.temporaryMessages.filter(a=>a.location.tempId!==b.location.tempId)}}function m(a,b){return"durable_append"===b.type?function(a,b){let c=a.messages.length;if(b.messages[0]?.location.index!==c)throw Error(`Conversation append index is not continuous: expected ${c}, received ${b.messages[0]?.location.index}`);let d=new Set(a.messages.map(a=>a.location.entryId));for(let a of b.messages){if(d.has(a.location.entryId))throw Error(`Conversation append entryId already exists: ${a.location.entryId}`);d.add(a.location.entryId)}return{...a,messages:[...a.messages,...b.messages]}}(a,b):l(a,b)}},610:(a,b,c)=>{c.d(b,{PS:()=>k,ef:()=>i,gK:()=>j,hS:()=>h,mv:()=>n});var d=c(59473),e=c(89409),f=c(2364),g=c(25984);let h=d.Ik({type:d.eu("message_start"),snapshot:e.s4}).strict(),i=d.Ik({type:d.eu("message_update"),location:e.fb,fixed:e.dG.optional(),summary:e.XW.optional(),detail:e.wH.optional(),increments:e.fK.optional()}).strict().superRefine((a,b)=>{if(!a.fixed&&!a.summary&&!a.detail&&!a.increments)return void b.addIssue({code:"custom",message:"message update requires a changed layer"});let c=[];for(let b of Object.keys(a.increments??{}))try{c.push({raw:b,parsed:(0,g.U)(b)})}catch{}for(let d of c){let c="summary"===d.parsed.root?Object.keys(a.summary??{}):Object.keys(a.detail??{}),e=d.parsed.segments[0];(0===d.parsed.segments.length||"string"==typeof e&&c.includes(e))&&b.addIssue({code:"custom",message:"replacement and increment paths cannot overlap",path:["increments",d.raw]})}for(let a=0;a<c.length;a+=1)for(let d=a+1;d<c.length;d+=1){let e=c[a],f=c[d];((0,g.v)(e.parsed,f.parsed)||(0,g.v)(f.parsed,e.parsed))&&b.addIssue({code:"custom",message:"increment parent and child paths cannot overlap",path:["increments",f.raw]})}}),j=d.Ik({type:d.eu("message_commit"),location:e.fb,durable:e.V6,fixed:d.Ik({timestampMs:f.k}).strict()}).strict(),k=d.Ik({type:d.eu("message_discard"),location:e.fb}).strict(),l=d.Ik({type:d.eu("durable_append"),messages:d.YO(e.mj).min(1)}).strict().superRefine((a,b)=>{let c=new Set;for(let[d,e]of a.messages.entries())d>0&&e.location.index!==a.messages[d-1].location.index+1&&b.addIssue({code:"custom",message:"durable append message indexes must be continuous",path:["messages",d,"location","index"]}),c.has(e.location.entryId)&&b.addIssue({code:"custom",message:"durable append entryId values must be unique",path:["messages",d,"location","entryId"]}),c.add(e.location.entryId)}),m=d.KC([h,i,j,k]),n=d.KC([l,m])},2002:(a,b,c)=>{c.d(b,{Od:()=>s,tU:()=>o,hE:()=>r,Sp:()=>g,P9:()=>f,_G:()=>k,Vc:()=>j});var d=c(59473);c(48452);let e=d.Ik({key:d.Yj().min(1).max(160),params:d.g1(d.Yj().min(1).max(80),d.KC([d.Yj().max(1e3),d.ai().finite()])).optional()}).strict(),f=4001,g=4003,h=d.Yj().trim().min(1),i=d.Yj().uuid();function j(a){return Object.freeze({op:"req",path:h.parse(a.path),inputSchema:a.inputSchema,outputSchema:a.outputSchema,...void 0===a.timeoutMs?{}:{timeoutMs:d.ai().int().positive().parse(a.timeoutMs)}})}function k(a){return Object.freeze({op:"push",path:h.parse(a.path),bodySchema:a.bodySchema})}let l=d.Ik({op:d.eu("req"),path:h,requestId:i}).strict(),m=d.Ik({op:d.eu("resp"),path:h,requestId:i}).strict(),n=d.Ik({op:d.eu("push"),path:h}).strict(),o=d.Ik({head:l,body:d.Pq()}).strict(),p=d.Ik({head:m,body:d.Ik({code:d.eu(0),msg:d.eu(""),data:d.Pq()}).strict()}).strict(),q=d.Ik({head:m,body:d.Ik({code:d.ai().int().positive(),msg:d.Yj().min(1),data:d.ch(),i18n:e.optional()}).strict()}).strict(),r=d.KC([p,q]),s=d.Ik({head:n,body:d.Pq()}).strict()},2364:(a,b,c)=>{c.d(b,{k:()=>d});let d=c(59473).ai().int().nonnegative().max(Number.MAX_SAFE_INTEGER)},12683:(a,b,c)=>{c.d(b,{FF:()=>h,LK:()=>i});var d=c(59473),e=c(24187),f=c(43037);let g=d.Ik({name:d.Yj().trim().min(1),description:d.Yj(),parameters:e.Dz}).strict(),h=d.Ik({source:f.Pi}).strict(),i=d.Ik({systemPrompt:d.Yj(),tools:d.YO(g)}).strict()},24187:(a,b,c)=>{c.d(b,{Dz:()=>h,f7:()=>g,tv:()=>f});var d=c(59473);let e=d.Yj().trim().min(1).max(64).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),f=e,g=e,h=d.g1(d.Yj(),d.Pq());d.Yj().trim().min(3).max(129).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*\/[a-z0-9]+(?:-[a-z0-9]+)*$/);let i=d.k5(["plugin","server","rocket","settings","panel","message","terminal","file","folder","bot","wrench","database","globe"]);d.gM("type",[d.Ik({type:d.eu("builtin"),name:i}).strict(),d.Ik({type:d.eu("svg"),content:d.Yj().trim().min(1).max(16384)}).strict()])},25984:(a,b,c)=>{function d(a){if(!/^(0|[1-9]\d*)$/.test(a))return a;let b=Number(a);if(!Number.isSafeInteger(b))throw Error(`Increment array index is invalid: ${a}`);return b}function e(a){if(!a||a.length>1024)throw Error("Increment path length is invalid");let b=[],c="",e=!1;for(let d of a){if(e){if("."!==d&&"\\"!==d)throw Error(`Increment path contains an invalid escape: \\${d}`);c+=d,e=!1;continue}if("\\"===d){e=!0;continue}if("."===d){if(!c)throw Error("Increment path contains an empty segment");b.push(c),c="";continue}c+=d}if(e)throw Error("Increment path ends with an escape");if(!c)throw Error("Increment path contains an empty segment");b.push(c);let f=b.shift();if("summary"!==f&&"detail"!==f)throw Error("Increment path root must be summary or detail");return{root:f,segments:b.map(d)}}function f(a,b){return a.root===b.root&&!(a.segments.length>b.segments.length)&&a.segments.every((a,c)=>a===b.segments[c])}c.d(b,{U:()=>e,v:()=>f})},40750:(a,b,c)=>{c.d(b,{L6:()=>e,k_:()=>f});var d=c(18);let e={extensionMode:"normal",presentationMode:"normal",initializationError:null,queues:{steering:[],followUp:[]},model:null,capabilityMode:null,contextUsage:null,plugins:{}};function f(a,b){if("session_sync"===b.type){if("full"===b.mode)return{...(0,d.zR)(a,b.messages,b.temporaryMessages),runtime:b.runtime};let c=a.messages.at(-1);if(!c||c.location.index!==b.baseCursor.index||c.location.entryId!==b.baseCursor.entryId)throw Error("Incremental chat sync does not match the current durable cursor");let e=new Set(a.messages.map(a=>a.location.entryId));for(let a of b.messages){if(e.has(a.location.entryId))throw Error(`Incremental chat sync contains a duplicate entryId: ${a.location.entryId}`);e.add(a.location.entryId)}return{messages:[...a.messages,...b.messages],temporaryMessages:b.temporaryMessages,runtime:b.runtime}}return"runtime_update"===b.type?{...a,runtime:b.runtime}:{...(0,d.kn)(a,b),runtime:a.runtime}}Object.freeze({messages:[],temporaryMessages:[],runtime:e})},41468:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Cz:()=>j,Ht:()=>g.H,NA:()=>k,QS:()=>i});var e=c(96459),f=c(79626),g=c(72904),h=a([e]);function i(a,b,c,d=!1,g="temporary",h=!1){return(0,f.d)(a,b,c,h?[]:(0,e.WE)().readMessageDeclarations(),d,g)}function j(a,b,c,d,g,h=!1){return(0,f.N)(a,b,c,d,g,h?[]:(0,e.WE)().readMessageDeclarations())}function k(a){let{detail:b,...c}=a;return c}e=(h.then?(await h)():h)[0],d()}catch(a){d(a)}})},43037:(a,b,c)=>{c.d(b,{DK:()=>r,Pi:()=>q,R3:()=>m,TV:()=>A,UR:()=>s,VK:()=>D,kF:()=>F,mB:()=>G,oc:()=>C,ps:()=>E,w$:()=>w,wR:()=>p,wf:()=>B,xE:()=>n,xh:()=>t,yI:()=>o});var d=c(59473),e=c(20369),f=c(54733),g=c(89409),h=c(62977),i=c(96089);let j=g.Pc,k=g.LJ,l=g.mh,m=g.fb,n=g.lJ,o=g.s4,p=g.mj,q=i.R,r=d.Ik({index:k,entryId:f.C3}).strict(),s=d.KC([d.ch(),r]),t=l.extend({data:d.Yj().min(1)}).strict(),u=h.$,v=d.Ik({tempId:j,text:d.Yj(),images:d.YO(l).max(10)}).strict(),w=d.Ik({provider:d.Yj().trim().min(1),modelId:d.Yj().trim().min(1),thinkingLevel:u}).strict(),x=d.Ik({tokens:d.ai().int().nonnegative().max(Number.MAX_SAFE_INTEGER).nullable(),contextWindow:d.ai().int().positive().max(Number.MAX_SAFE_INTEGER)}).strict(),y=d.g1(d.Yj(),d.Pq()),z=d.g1(d.Yj().min(1),y),A=d.k5(["normal","basic"]),B=d.Ik({extensionMode:A.default("normal"),presentationMode:A.default("normal"),initializationError:d.Yj().max(32e3).nullable().default(null),queues:d.Ik({steering:d.YO(v),followUp:d.YO(v)}).strict(),model:w.nullable(),capabilityMode:e.rY.nullable(),contextUsage:x.nullable(),plugins:z}).strict(),C=g.RX.extend({runtime:B}).strict(),D=d.Ik({sessionId:f.Kx,branchId:f._A,entryId:f.C3}).strict(),E=g.XM,F=D.extend({imageIndex:d.ai().int().nonnegative()}).strict(),G=g.y0},47574:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{VB:()=>t,dM:()=>q,hr:()=>r,nJ:()=>s,yO:()=>u});var e=c(76760),f=c(69503),g=c(12683),h=c(43037),i=c(40750),j=c(95220),k=c(32980),l=c(41468),m=c(72498),n=a([k,l,m]);[k,l,m]=n.then?(await n)():n;class q extends Error{constructor(a){super(`Chat source is not current: ${a.workId}/${a.sessionId}/${a.branchId}`),this.name="L2ChatSourceBindingError"}}class r extends Error{constructor(a){super(`Chat message was not found: ${a}`),this.name="L2ChatMessageNotFoundError"}}class s extends Error{constructor(a){super(`Chat commands are blocked by WorkSession lifecycle: ${a}`),this.name="L2ChatLifecycleBlockedError"}}class t extends Error{constructor(a,b){super(`工作会话 ${a} 阻止插件重载:${b}`),this.workId=a,this.reason=b,this.name="L2PluginReloadBlockedError"}}function o(a){try{return structuredClone(a)}catch{let{declaration:b,...c}=a;return structuredClone(c)}}function p(a,b){return JSON.stringify(a)===JSON.stringify(b)}class u{async initialize(a){let b=a.map(a=>this.buildRecord(a));for(let a of(this.recordsByWorkId.clear(),b))this.recordsByWorkId.set(a.source.workId,a)}addWorkSession(a){this.recordsByWorkId.set(a.workId,this.buildRecord(a))}async replaceWorkSession(a,b){let c=this.recordsByWorkId.get(a.workId)?.source;await this.closeRecord(a.workId),c&&this.publish({type:"source_invalidated",source:c}),this.recordsByWorkId.set(b.workId,this.buildRecord(b)),a.sessionId!==b.sessionId&&await (0,m.gb)(a.sessionId)}async refreshWorkSession(a){let b=this.recordsByWorkId.get(a.workId)?.source;await this.closeRecord(a.workId),b&&this.publish({type:"source_invalidated",source:b}),this.recordsByWorkId.set(a.workId,this.buildRecord(a))}async removeWorkSession(a){let b=this.recordsByWorkId.get(a.workId)?.source;await this.closeRecord(a.workId),b&&this.publish({type:"source_invalidated",source:b}),await (0,m.gb)(a.sessionId)}async pauseWorkSession(a){let b=this.recordsByWorkId.get(a);b&&(b.acceptingCommands=!1,(0,m.ls)(b.source.sessionId).nativeUi.cancelAll(),await b.commandTail)}resumeWorkSession(a){let b=this.recordsByWorkId.get(a);b&&(b.acceptingCommands=!0)}async pauseForProcessRestart(){let a=[...this.recordsByWorkId.values()],b=a.map(a=>({record:a,reason:this.pluginReloadBlockReason(a)})).find(a=>null!==a.reason);if(b?.reason)throw new t(b.record.source.workId,b.reason);for(let b of a)b.acceptingCommands=!1;await Promise.all(a.map(a=>a.commandTail));let c=a.map(a=>({record:a,reason:this.pluginReloadBlockReason(a)})).find(a=>null!==a.reason);if(c?.reason){for(let b of a)b.acceptingCommands=!0;throw new t(c.record.source.workId,c.reason)}let d=!0;return()=>{if(d)for(let b of(d=!1,a))this.recordsByWorkId.get(b.source.workId)===b&&(b.acceptingCommands=!0)}}metadataFor(a){return this.recordFor(a).metadata}statusFor(a){return this.statusForRecord(this.recordFor(a))}statusForRecord(a){return a.mainRunning?"main_running":a.backgroundTaskIds.size>0?"background_running":a.completedPending?"completed":"idle"}acknowledgeCompleted(a){let b=this.recordsByWorkId.get(a);if(!b||!b.completedPending)return!1;let c=this.statusForRecord(b);return b.completedPending=!1,this.publishRecordChanged(a,b.metadata,c),!0}isCurrentSource(a){let b=h.Pi.parse(a),c=this.recordsByWorkId.get(b.workId);return void 0!==c&&this.matches(c.source,b)}getProjectPreviewContext(a,b){let c=this.recordsByWorkId.get(a.workId);if(!c||c.workSession!==a)return null;let d=(0,f.Yj)((0,e.resolve)(b)),g=d===(0,f.Yj)((0,e.resolve)(a.cwd)),h=()=>(0,f.D)(c.state.runtime.plugins[f.s6]).directories.find(a=>(0,f.Yj)(a)===d),i=g?a.cwd:h();if(!i)return null;let j=()=>this.recordsByWorkId.get(a.workId)===c&&c.acceptingCommands&&this.matches(c.source,this.sourceFor(a))&&(g||void 0!==h());return j()?{cwd:i,isCurrent:j}:null}setPresentation(a,b){let c=this.currentRecord(a);return this.enqueueCommand(c,async()=>{if(((0,j.P)()||"basic"===c.state.runtime.extensionMode)&&"normal"===b)throw Error("基础模式不启用插件消息展示,请先恢复插件聊天");c.state.runtime.presentationMode!==b&&this.reprojectRecord(c,b)})}reprojectRecord(a,b){let c=(0,m.ls)(a.source.sessionId).readChatSnapshot(),d=new Map(c.entries.map(a=>[a.entryId,a])),e="basic"===b,f=a.state.messages.map(b=>{let c=d.get(b.location.entryId);if(!c)throw Error(`无法重新投影消息:${b.location.entryId}`);return(0,l.Cz)(b.location.index,c.entryId,c.timestampMs,c.message,a.source,e)}),g=a.state.temporaryMessages.map(b=>{let c=a.rawTemporaryMessages.get(b.location.tempId);if(!c)throw Error(`临时消息基线尚不可重投影:${b.location.tempId}`);return(0,l.QS)(b.location.tempId,c,a.source,!1,"update",e)});a.state={messages:f,temporaryMessages:g,runtime:{...a.state.runtime,presentationMode:b}},a.sourceEventVersion+=1,this.publish({type:"source_event",source:a.source,version:a.sourceEventVersion,event:this.createSync(a.source,null).event})}prepareSource(a){let b=this.currentRecord(a);return this.enqueueCommand(b,()=>this.syncRecordRuntime(b))}async syncRecordRuntime(a){let b=a.source,c=await (0,m.ls)(b.sessionId).readChatRuntime(),d=h.wf.parse({...c,presentationMode:a.state.runtime.presentationMode});this.isCurrentSource(b)&&(p(a.state.runtime,d)||this.applySourceEvent(b,{type:"runtime_update",runtime:d}))}createSync(a,b){let c=this.currentRecord(a),d=c.source,e=c.state.messages,f=c.state.temporaryMessages,g=c.state.runtime,h=null===b?void 0:e[b.index],i=null!==b&&h?.location.entryId===b.entryId;return null===b||i||console.warn("[Pi Desk][WorkSessionChatRuntime] 客户端消息 cursor 不匹配,回退全量",{workId:d.workId,sessionId:d.sessionId,branchId:d.branchId,clientCursorIndex:b.index,clientCursorEntryId:b.entryId,serverEntryIdAtIndex:h?.location.entryId??null,serverLatestIndex:e.at(-1)?.location.index??-1}),{event:i?{type:"session_sync",mode:"incremental",baseCursor:b,messages:e.slice(b.index+1).map(l.NA),temporaryMessages:f,runtime:g}:{type:"session_sync",mode:"full",baseCursor:null,messages:e.map(l.NA),temporaryMessages:f,runtime:g},watermark:c.sourceEventVersion}}getImage(a){let b=h.kF.parse(a),c=this.recordForSession(b.sessionId,b.branchId),d=c.state.messages.find(a=>a.location.entryId===b.entryId);if(!d||"user"!==d.fixed.type&&"tool"!==d.fixed.type)throw new r(`${b.entryId}/${b.imageIndex}`);return h.mB.parse((0,m.ls)(c.source.sessionId).readChatImage(b.entryId,b.imageIndex))}getMessageDetail(a){let b=h.VK.parse(a),c=this.recordForSession(b.sessionId,b.branchId).state.messages.find(a=>a.location.entryId===b.entryId);if(!c)throw new r(b.entryId);return h.ps.parse({index:c.location.index,entryId:c.location.entryId,detail:c.detail??null})}getModelContext(a){let b=g.FF.parse(a),c=this.currentRecord(b.source);return this.enqueueCommand(c,async()=>g.LK.parse(await (0,m.ls)(c.source.sessionId).readModelContext()))}send(a){let b=this.currentRecord(a.source);if((0,m.ls)(a.source.sessionId).nativeUi.hasPending)return Promise.reject(Error("请先处理当前插件问题,或停止当前任务"));let c=()=>b.workSession.send({mode:a.mode,text:a.text,images:a.images});return b.compactionStart?b.acceptingCommands?b.compactionStart.then(a=>{if(!b.acceptingCommands)throw new s(b.source.workId);return a?c():this.enqueueCommand(b,c)}):Promise.reject(new s(b.source.workId)):this.enqueueCommand(b,c)}interrupt(a){let b=this.currentRecord(a);return(0,m.ls)(a.sessionId).nativeUi.hasPending?b.workSession.interrupt():this.enqueueCommand(b,()=>b.workSession.interrupt())}compact(a){let b,c=this.currentRecord(a);if(c.compactionStart)return Promise.reject(Error("上下文正在压缩"));let d=new Promise(a=>{b=a});c.compactionStart=d;let e=this.enqueueCommand(c,()=>{try{let a=(0,m.ls)(c.source.sessionId).compact();return b(!0),a}catch(a){throw b(!1),a}});return e.then(()=>{b(!1),c.compactionStart===d&&(c.compactionStart=null)},()=>{b(!1),c.compactionStart===d&&(c.compactionStart=null)}),e}reload(a,b){let c=this.currentRecord(a);return(0,m.ls)(a.sessionId).nativeUi.cancelAll(),this.enqueueCommand(c,async()=>{try{await (0,m.ls)(c.source.sessionId).reload(b)}finally{this.recordsByWorkId.get(a.workId)===c&&await this.syncRecordRuntime(c)}})}restoreQueuedMessages(a){let b=this.currentRecord(a);return this.enqueueCommand(b,()=>b.workSession.restoreQueuedMessages())}setTitle(a,b){let c=this.recordFor(a);return this.enqueueCommand(c,()=>c.workSession.setTitle(b))}setModel(a){let b=this.currentRecord(a.source);return this.enqueueCommand(b,()=>b.workSession.setModel(a.model))}setCapabilityMode(a){let b=this.currentRecord(a.source);return this.enqueueCommand(b,()=>(0,m.ls)(b.source.sessionId).setCapabilityMode(a.capabilityMode))}invokePluginMethod(a){let b=this.currentRecord(a.source);return this.enqueueCommand(b,()=>(0,m.ls)(b.source.sessionId).invokePluginMethod(b.source,a.pluginName,a.method,a.input))}listNativeCommands(a){let b=this.currentRecord(a);return this.enqueueCommand(b,()=>(0,m.ls)(b.source.sessionId).listNativeCommands())}executeNativeCommand(a,b,c){let d=this.currentRecord(a);return this.enqueueCommand(d,()=>(0,m.ls)(d.source.sessionId).executeNativeCommand(b,c))}listNativeTools(a){let b=this.currentRecord(a);return this.enqueueCommand(b,()=>(0,m.ls)(b.source.sessionId).listNativeTools())}executeDirectBash(a,b){let c=this.currentRecord(a);return c.directBashActive?Promise.reject(new k.yT):(c.directBashActive=!0,this.enqueueCommand(c,()=>(0,m.ls)(c.source.sessionId).executeDirectBash(b)).finally(()=>{c.directBashActive=!1}))}abortDirectBash(a){let b=this.currentRecord(a);return(0,m.ls)(b.source.sessionId).abortDirectBash()}subscribe(a){return this.listeners.add(a),()=>this.listeners.delete(a)}subscribeRecordChanges(a){return this.recordListeners.add(a),()=>this.recordListeners.delete(a)}subscribePluginPush(a){return this.pluginPushListeners.add(a),()=>this.pluginPushListeners.delete(a)}buildRecord(a){let b=this.sourceFor(a),c=(0,m.ls)(a.sessionId),d=c.readChatSnapshot(),e=d.entries.map((a,c)=>(0,l.Cz)(c,a.entryId,a.timestampMs,a.message,b,(0,j.P)())),f=h.oc.parse({messages:e,temporaryMessages:[],runtime:{...i.L6,extensionMode:(0,j.P)()?"basic":"normal",presentationMode:(0,j.P)()?"basic":"normal"}}),g=f.messages.find(a=>"user"===a.fixed.type),k=g?h.xE.safeParse(g.summary):null,n=k?.success&&k.data.text.trim()||null,o={workSession:a,source:b,state:f,sourceEventVersion:0,rawTemporaryMessages:new Map,metadata:{sessionTitle:d.sessionName??n,messageCounts:{user:f.messages.filter(a=>"user"===a.fixed.type).length,total:f.messages.length},lastMessageUpdatedAt:f.messages.at(-1)?.fixed.timestampMs??null},mainRunning:!1,backgroundTaskIds:new Set(c.readChatBackgroundTaskIds()),completedPending:!1,acceptingCommands:!0,directBashActive:!1,compactionStart:null,commandTail:Promise.resolve(),unsubscribeWorker:()=>void 0};return o.unsubscribeWorker=c.subscribeChat(a=>this.handleWorkerEvent(o,a)),o}handleWorkerEvent(a,b){if(this.recordsByWorkId.get(a.source.workId)!==a)return;let c=a.metadata,d=this.statusForRecord(a),e="basic"===a.state.runtime.extensionMode||"basic"===a.state.runtime.presentationMode;switch(b.type){case"message_start":a.rawTemporaryMessages.set(b.tempId,o(b.message)),this.applySourceEvent(a.source,{type:"message_start",snapshot:(0,l.QS)(b.tempId,b.message,a.source,!1,"temporary",e)});return;case"message_update":{let c=a.state.temporaryMessages.find(a=>a.location.tempId===b.tempId);if(!c)throw Error(`Temporary chat message was not found: ${b.tempId}`);a.rawTemporaryMessages.set(b.tempId,o(b.message));let d=(0,l.Ht)(c,(0,l.QS)(b.tempId,b.message,a.source,!1,"update",e));d&&this.applySourceEvent(a.source,d);return}case"message_commit":{let c=a.state.temporaryMessages.find(a=>a.location.tempId===b.tempId);if(!c)throw Error(`Temporary chat message was not found: ${b.tempId}`);let d=(0,l.QS)(b.tempId,b.message,a.source,!1,"final",e),f=(0,l.Ht)(c,d);f&&this.applySourceEvent(a.source,f),this.replaceCanonicalTemporary(a,b.tempId,b.message),a.rawTemporaryMessages.delete(b.tempId),this.applySourceEvent(a.source,{type:"message_commit",location:{tempId:b.tempId},durable:{index:a.state.messages.length,entryId:b.entryId},fixed:{timestampMs:b.timestampMs}});return}case"message_discard":a.rawTemporaryMessages.delete(b.tempId),this.applySourceEvent(a.source,{type:"message_discard",location:{tempId:b.tempId}});return;case"plugin_push":this.publishPluginPush({pluginName:b.pluginName,target:{scope:"session",source:a.source},event:b.event,data:structuredClone(b.data)});return;case"runtime_changed":{let c=h.wf.parse({...b.runtime,presentationMode:a.state.runtime.presentationMode});p(a.state.runtime,c)||this.applySourceEvent(a.source,{type:"runtime_update",runtime:c});return}case"agent_started":if(a.mainRunning)return;a.mainRunning=!0,a.completedPending=!1,this.publishRecordChanged(a.source.workId,c,d);return;case"main_operation_cancelled":case"main_operation_finished":if(!a.mainRunning)return;a.mainRunning=!1,a.completedPending=!1,this.publishRecordChanged(a.source.workId,c,d);return;case"agent_settled":{let b=a.mainRunning||a.backgroundTaskIds.size>0;a.mainRunning=!1,b&&0===a.backgroundTaskIds.size&&(a.completedPending=!0),this.publishRecordChanged(a.source.workId,c,d);return}case"background_tasks_changed":{let e=a.mainRunning||a.backgroundTaskIds.size>0;a.backgroundTaskIds=new Set(b.taskIds),e&&!a.mainRunning&&0===a.backgroundTaskIds.size&&(a.completedPending=!0),this.publishRecordChanged(a.source.workId,c,d);return}case"session_info_changed":a.metadata={...a.metadata,sessionTitle:b.sessionTitle},this.publishRecordChanged(a.source.workId,c,d);return}}replaceCanonicalTemporary(a,b,c){let d=a.state.temporaryMessages.findIndex(a=>a.location.tempId===b);if(d<0)throw Error(`Temporary chat message was not found: ${b}`);let e=[...a.state.temporaryMessages];e[d]=(0,l.QS)(b,c,a.source,!0,"final","basic"===a.state.runtime.extensionMode||"basic"===a.state.runtime.presentationMode),a.state={...a.state,temporaryMessages:e}}applySourceEvent(a,b){let c=this.currentRecord(a),d=c.source;if(c.state=(0,i.k_)(c.state,b),c.sourceEventVersion+=1,"message_commit"===b.type){let a=c.state.messages[b.durable.index];if(!a||a.location.entryId!==b.durable.entryId)throw Error(`Committed chat message is missing: ${b.durable.index}/${b.durable.entryId}`);let e=c.metadata;c.metadata=this.metadataFromState(c),this.publishRecordChanged(d.workId,e,this.statusForRecord(c))}this.publish({type:"source_event",source:d,version:c.sourceEventVersion,event:b})}metadataFromState(a){let b=a.state.messages.find(a=>"user"===a.fixed.type),c=b?h.xE.safeParse(b.summary):null,d=c?.success&&c.data.text.trim()||null;return{sessionTitle:a.metadata.sessionTitle??d,messageCounts:{user:a.state.messages.filter(a=>"user"===a.fixed.type).length,total:a.state.messages.length},lastMessageUpdatedAt:a.state.messages.at(-1)?.fixed.timestampMs??null}}enqueueCommand(a,b){if(!a.acceptingCommands)return Promise.reject(new s(a.source.workId));let c=a.commandTail.then(b,b);return a.commandTail=c.then(()=>void 0,()=>void 0),c}pluginReloadBlockReason(a){return(0,m.ls)(a.source.sessionId).nativeUi.hasPending?"原生插件问题正在等待回答":a.directBashActive?"Direct Bash 正在运行":a.mainRunning?"主 Agent 正在运行":a.backgroundTaskIds.size>0?"插件后台任务正在运行":(0,m.ls)(a.source.sessionId).readPluginReloadBlockReason()}async closeRecord(a){let b=this.recordsByWorkId.get(a);b&&(b.acceptingCommands=!1,(0,m.ls)(b.source.sessionId).nativeUi.cancelAll(),await b.commandTail,b.unsubscribeWorker(),b.rawTemporaryMessages.clear(),this.recordsByWorkId.delete(a))}recordFor(a){let b=this.recordsByWorkId.get(a.workId);if(!b||!this.matches(b.source,this.sourceFor(a)))throw Error(`WorkSession chat state is not initialized: ${a.workId}`);return b}sourceFor(a){return h.Pi.parse({workId:a.workId,sessionId:a.sessionId,branchId:a.branchId})}currentRecord(a){let b=h.Pi.parse(a),c=this.recordsByWorkId.get(b.workId);if(!c||!this.matches(c.source,b))throw new q(b);return c}recordForSession(a,b){let c=[...this.recordsByWorkId.values()].find(c=>c.source.sessionId===a&&c.source.branchId===b);if(c)return c;throw new q({workId:"unknown",sessionId:a,branchId:b})}matches(a,b){return a.workId===b.workId&&a.sessionId===b.sessionId&&a.branchId===b.branchId}publishPluginPush(a){for(let b of[...this.pluginPushListeners])try{b(a)}catch(b){console.error("[Pi Desk][WorkSessionChatRuntime] Plugin Push 监听器执行失败",{pluginName:a.pluginName,event:a.event,errorName:b instanceof Error?b.name:"UnknownError"})}}publish(a){for(let b of[...this.listeners])try{b(a)}catch(b){console.error("[Pi Desk][WorkSessionChatRuntime] Source 事件监听器执行失败",{eventType:a.type,workId:a.source.workId,errorName:b instanceof Error?b.name:"UnknownError"})}}publishRecordChanged(a,b,c){for(let d of[...this.recordListeners])try{d(a,b,c)}catch(b){console.error("[Pi Desk][WorkSessionChatRuntime] Record 监听器执行失败",{workId:a,errorName:b instanceof Error?b.name:"UnknownError"})}}constructor(){this.recordsByWorkId=new Map,this.listeners=new Set,this.recordListeners=new Set,this.pluginPushListeners=new Set}}d()}catch(a){d(a)}})},48452:(a,b,c)=>{c.d(b,{Y:()=>f,n:()=>e});var d=c(59473);let e="X-Pi-Desk-Client-Id",f=d.Yj().uuid()},54733:(a,b,c)=>{c.d(b,{AA:()=>p,Bn:()=>v,C3:()=>j,Ck:()=>s,ER:()=>m,Jl:()=>w,Kx:()=>i,MT:()=>l,MY:()=>q,Ms:()=>x,TO:()=>n,_A:()=>k,eW:()=>g,ik:()=>h,jw:()=>o,kg:()=>r,qL:()=>u,uX:()=>t});var d=c(59473),e=c(83905),f=c(2364);let g=d.Yj().trim().min(1),h=e.m4,i=e.$E,j=e.Rv,k=d.Yj().trim().min(1),l=d.ai().int().nonnegative(),m=d.Ik({workId:g,cwd:h,sessionId:i}).strict(),n=d.YO(m),o=d.k5(["main_running","background_running","completed","idle"]),p=d.Ik({user:d.ai().int().nonnegative(),total:d.ai().int().nonnegative()}).strict().refine(a=>a.user<=a.total,{message:"user message count cannot exceed total message count"}),q=m.extend({branchId:k,projectName:d.Yj().trim().min(1),sessionTitle:d.Yj().trim().min(1).nullable(),status:o,messageCounts:p,lastMessageUpdatedAt:f.k.nullable()}).strict(),r=d.Ik({workSessions:d.YO(q),pinnedCount:l}).strict().refine(a=>a.pinnedCount<=a.workSessions.length,{message:"pinnedCount cannot exceed work session count",path:["pinnedCount"]}),s=d.Ik({cwd:h,sessionId:i.optional()}).strict(),t=d.Ik({workSession:q}).strict(),u=d.Ik({workId:g,sessionId:i,title:d.Yj().trim().min(1)}).strict(),v=d.Ik({workId:g}).strict(),w=d.Ik({workIds:d.YO(g),pinnedCount:l}).strict().superRefine((a,b)=>{new Set(a.workIds).size!==a.workIds.length&&b.addIssue({code:"custom",message:"workIds cannot contain duplicates",path:["workIds"]}),a.pinnedCount>a.workIds.length&&b.addIssue({code:"custom",message:"pinnedCount cannot exceed workIds length",path:["pinnedCount"]})}),x=d.KC([d.Ik({workId:g,cwd:h,sessionId:i}).strict(),d.Ik({workId:g}).strict()])},62977:(a,b,c)=>{c.d(b,{$:()=>d});let d=c(59473).k5(["off","minimal","low","medium","high","xhigh","max"])},72904:(a,b,c)=>{c.d(b,{H:()=>g});var d=c(610);function e(a,b){return JSON.stringify(a)===JSON.stringify(b)}function f(a,b,c,d,f){for(let g of new Set([...Object.keys(b),...Object.keys(c)])){let h=b[g],i=Object.hasOwn(c,g),j=i?c[g]:null;if(e(h,j))continue;let k=i?function(a,b){if("string"==typeof a&&"string"==typeof b&&b.startsWith(a))return b.slice(a.length)||null;if(Array.isArray(a)&&Array.isArray(b)&&a.length<=b.length&&a.every((a,c)=>e(a,b[c]))){let c=b.slice(a.length);return c.length>0?c:null}return null}(h,j):null;null!==k?f[`${a}.${g.replace(/\\/g,"\\\\").replace(/\./g,"\\.")}`]=k:d[g]=j}}function g(a,b){var c,e;let g;if(a.fixed.type!==b.fixed.type)throw Error(`Chat message type changed: ${a.fixed.type}/${b.fixed.type}`);let h=(g={},a.fixed.viewKey!==b.fixed.viewKey&&(g.viewKey=b.fixed.viewKey),"status"in a.fixed&&"status"in b.fixed&&a.fixed.status!==b.fixed.status&&(g.status=b.fixed.status),a.fixed.hasDetail!==b.fixed.hasDetail&&(g.hasDetail=b.fixed.hasDetail),"usage"in a.fixed&&"usage"in b.fixed&&(c=a.fixed.usage)!==(e=b.fixed.usage)&&(null===c||null===e||c.inputTokens!==e.inputTokens||c.outputTokens!==e.outputTokens||c.cacheReadTokens!==e.cacheReadTokens||c.costUsd!==e.costUsd)&&(g.usage=b.fixed.usage),Object.keys(g).length>0?g:void 0),i={},j={},k={};f("summary",a.summary,b.summary,i,k),b.fixed.hasDetail&&f("detail",a.detail??{},b.detail??{},j,k);let l=Object.keys(i).length>0,m=Object.keys(j).length>0,n=Object.keys(k).length>0;return h||l||m||n?d.ef.parse({type:"message_update",location:a.location,...h?{fixed:h}:{},...l?{summary:i}:{},...m?{detail:j}:{},...n?{increments:k}:{}}):null}},79626:(a,b,c)=>{c.d(b,{N:()=>u,d:()=>t});var d=c(89409),e=c(59473),f=c(63719);let g=e.Ik({mode:e.k5(["sync","async"]),message:e.Yj()}).strict(),h="pi-desk/message-declaration-error",i=new WeakMap,j=e.Ik({viewKey:e.Yj().trim().min(3).max(129).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*\/[a-z0-9]+(?:-[a-z0-9]+)*$/),summary:e.g1(e.Yj(),e.Pq()),detail:e.g1(e.Yj(),e.Pq()).nullable()}).strict();function k(a){switch(a.type){case"user":return"pi-desk/user";case"assistant":return"pi-desk/assistant";case"tool":{let b=a.name.toLowerCase().split(".").at(-1);if("pidesk"===b)return"pi-desk/pidesk";if("bash"===b)return"pi-desk/bash-tool";if("codemode"===b)return"pi-desk/codemode";return"read"===b||"write"===b||"edit"===b?`pi-desk/${b}`:"pi-desk/tool"}case"bash":return"pi-desk/bash";case"custom":return"pi-desk/custom";case"compaction":return"pi-desk/compaction"}}function l(a){return null===a||"object"!=typeof a||Array.isArray(a)?null:a}function m(a){return l(a.result)}function n(a,b){return{...a.summary,path:function(a){let b=a.arguments.path??a.arguments.file_path;if("string"!=typeof b)return null;let c=f.eC.safeParse(b);return c.success?c.data:null}(b)}}function o(a){if(a.declaration)return a.declaration.message;switch(a.type){case"user":return{kind:"user",text:a.text,images:a.images};case"assistant":return{kind:"assistant",text:a.text,thinking:a.thinking,stopReason:a.status};case"tool":return{kind:"tool",toolName:a.name,toolCallId:"",arguments:{},partialResult:null,result:a.output?{output:a.output}:null,isError:"error"===a.status};case"bash":return{kind:"bash",command:a.command,output:a.output,exitCode:"completed"===a.status?0:null,cancelled:"aborted"===a.status,truncated:!1};case"custom":return{kind:"custom",customType:"display-message",content:a.text,details:null};case"compaction":return{kind:"custom",customType:"pi-desk/compaction",content:"",details:a.summary?{text:a.summary}:null}}}function p(a,b,c){return{pluginName:"pi-desk",declarationName:a,builtin:!0,declaration:{priority:b,match:c,project:a=>a.defaultProjection}}}let q=[p("pidesk",-900,a=>"tool"===a.message.kind&&"pidesk"===a.message.toolName),p("read",-900,a=>"tool"===a.message.kind&&"read"===a.message.toolName),p("write",-900,a=>"tool"===a.message.kind&&"write"===a.message.toolName),p("edit",-900,a=>"tool"===a.message.kind&&"edit"===a.message.toolName),p("bash-tool",-900,a=>"tool"===a.message.kind&&"bash"===a.message.toolName),p("user",-1e3,a=>"user"===a.message.kind),p("assistant",-1e3,a=>"assistant"===a.message.kind),p("tool",-1e3,a=>"tool"===a.message.kind),p("bash",-1e3,a=>"bash"===a.message.kind),p("custom",-1e3,a=>"custom"===a.message.kind)];function r(a){var b;let c=a.error instanceof Error?a.error:null,d=a.candidate;for(let b of d?[d]:a.candidates??[]){let d=i.get(b.declaration)??new Set;d.has(a.phase)||(d.add(a.phase),i.set(b.declaration,d),console.warn("[Pi Desk][MessageDeclaration] 插件投影失败,保留基础展示入口",{pluginName:b.pluginName,declarationName:b.declarationName,phase:a.phase,message:(c?.message??"Message Declaration conflict").slice(0,2e3)}))}return{viewKey:h,summary:{text:"string"==typeof a.defaultProjection.summary.text?a.defaultProjection.summary.text:"",phase:a.phase,pluginName:d?.pluginName??null,declarationName:d?.declarationName??null},detail:{phase:a.phase,pluginName:d?.pluginName??null,declarationName:d?.declarationName??null,priority:d?.declaration.priority??null,errorName:c?.name??null,errorMessage:c?.message??String(a.error??"Message Declaration conflict"),errorStack:c?.stack??null,conflicts:(a.candidates??[]).map(a=>({pluginName:a.pluginName,declarationName:a.declarationName,priority:a.declaration.priority})),defaultProjection:{viewKey:(b=a.defaultProjection).viewKey,summary:b.summary,detail:b.detail}}}}function s(a,b,c,e,f,i,p){let s=function(a){let b=function(a){switch(a.type){case"user":return{viewKey:k(a),summary:{text:function(a){let b=a.text.lastIndexOf("\n\n");if(0===a.images.length||b<0)return a.text;let c=a.text.slice(b+2).split("\n");return c.length>a.images.length?a.text:c.every(b=>{let c=/^\[Image: original \d+x\d+, displayed at (\d+)x(\d+)\. Multiply coordinates by \d+\.\d{2} to map to original image\.\]$/.exec(b);return null!==c&&a.images.some(a=>a.width===Number(c[1])&&a.height===Number(c[2]))})?a.text.slice(0,b):a.text}(a),images:a.images.map(a=>({...a}))},detail:null};case"assistant":return{viewKey:k(a),summary:{text:a.text,errorMessage:a.errorMessage,...void 0===a.model?{}:{model:a.model}},detail:a.thinking.length>0?{thinking:a.thinking}:null};case"tool":{let b=k(a),c={...a.images?.length&&["pi-desk/tool","pi-desk/read","pi-desk/codemode"].includes(b)?{images:a.images.map(a=>({...a}))}:{},name:a.name,reasoning:a.reasoning,inputPreview:a.inputPreview,activity:a.activity},d=a.durationMs??null,e=a.startedAtMs??null,f={viewKey:b,summary:"pi-desk/bash-tool"===b?{...c,timing:null!==d?{durationMs:d}:null!==e?{startedAtMs:e}:null}:c,detail:"pi-desk/codemode"===b?{output:a.output,...a.nestedCalls?{nestedCalls:a.nestedCalls}:{}}:a.output?{output:a.output}:null},h=o(a);return"tool"===h.kind?function(a,b){let c=function(a){let b=m(a);if(!b)return null;let c=b.content;if("string"==typeof c)return c;if(Array.isArray(c)){let a=[],b=!1;for(let d of c){let c=l(d);c?.type==="text"&&"string"==typeof c.text&&(b=!0,a.push(c.text))}if(b)return a.join("\n")}return"string"==typeof b.output?b.output:null}(b)??("string"==typeof a.detail?.output?a.detail.output:null);switch(a.viewKey){case"pi-desk/pidesk":{let d=c??"";try{let a=g.safeParse(JSON.parse(d));a.success&&(d=a.data.message)}catch{}return{viewKey:a.viewKey,summary:{input:b.arguments},detail:{output:d}}}case"pi-desk/read":let d;return{viewKey:a.viewKey,summary:n(a,b),detail:Array.isArray(d=m(b)?.content)&&d.some(a=>{let b=l(a);return b?.type==="image"})||null===c?null:{content:c}};case"pi-desk/edit":{let d=l(m(b)?.details??null)?.diff;return{viewKey:a.viewKey,summary:n(a,b),detail:b.isError||"string"!=typeof d?null===c?null:{kind:"output",content:c}:{kind:"diff",content:d}}}case"pi-desk/write":{let d=b.arguments.content;return{viewKey:a.viewKey,summary:n(a,b),detail:b.isError&&null!==c?{kind:"output",content:c}:"string"==typeof d?{kind:"content",content:d}:null===c?null:{kind:"output",content:c}}}default:return a}}(f,h):f}case"bash":return{viewKey:k(a),summary:{command:a.command},detail:a.output?{output:a.output}:null};case"custom":return{viewKey:k(a),summary:{text:a.text},detail:null};case"compaction":return{viewKey:k(a),summary:{},detail:a.summary?{text:a.summary}:null}}}(a.message);if("compaction"===a.message.type)return b;let c={source:a.source,stage:a.stage,message:o(a.message),raw:a.message.declaration?.raw??a.message,defaultProjection:b},d=[...(a.declarations??[]).map(a=>({...a,builtin:!1})),...q];for(let a of[...new Set(d.map(a=>a.declaration.priority))].sort((a,b)=>b-a)){let e,f=d.filter(b=>b.declaration.priority===a),g=[];for(let a of f)try{a.declaration.match(c)&&g.push(a)}catch(c){return r({phase:"match",candidate:a,error:c,defaultProjection:b})}if(0===g.length)continue;if(g.length>1)return r({phase:"conflict",candidates:g,defaultProjection:b});let i=g[0];try{e=i.declaration.project(c)}catch(a){return r({phase:"project",candidate:i,error:a,defaultProjection:b})}try{return function(a,b){let c=j.parse(a);if(!b&&c.viewKey===h)throw Error("Host reserved Message Declaration Error viewKey cannot be registered");return c}(e,i.builtin)}catch(a){return r({phase:"validate",candidate:i,error:a,defaultProjection:b})}}return b}({source:e,stage:f,message:c,declarations:p}),t="tool"===c.type||"bash"===c.type||"custom"===c.type||"compaction"===c.type,u=null!==s.detail&&(!t||i),v={location:a,fixed:function(a,b,c){let d={timestampMs:a,viewKey:c.viewKey,hasDetail:null!==c.detail};switch(b.type){case"user":return{...d,type:"user"};case"assistant":return{...d,type:"assistant",status:b.status,usage:b.usage};case"tool":return{...d,type:"tool",status:b.status,usage:b.usage};case"bash":return{...d,type:"bash",status:b.status};case"custom":case"compaction":return{...d,type:"custom"}}}(b,c,s),summary:s.summary,...u?{detail:s.detail}:{}};return"tempId"in a?d.s4.parse(v):d.mj.parse(v)}function t(a,b,c,d,e=!1,f="temporary"){return s({tempId:a},null,b,c,f,e,d)}function u(a,b,c,d,e,f){return s({index:a,entryId:b},c,d,e,"durable",!0,f)}},83905:(a,b,c)=>{c.d(b,{$E:()=>f,Rv:()=>g,m4:()=>e});var d=c(59473);let e=d.Yj().trim().min(1),f=d.Yj().trim().min(1),g=d.Yj().trim().min(1)},89409:(a,b,c)=>{c.d(b,{D8:()=>I,Hf:()=>H,LJ:()=>j,Pc:()=>i,RX:()=>T,V6:()=>t,XM:()=>U,XW:()=>P,dG:()=>O,fK:()=>S,fb:()=>s,lJ:()=>B,mh:()=>m,mj:()=>M,q5:()=>A,s4:()=>L,wH:()=>Q,y0:()=>V});var d=c(59473),e=c(83905),f=c(63719),g=c(2364),h=c(25984);let i=d.Yj().uuid(),j=d.ai().int().nonnegative(),k=d.Yj().trim().min(3).max(129).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*\/[a-z0-9]+(?:-[a-z0-9]+)*$/),l=d.k5(["image/jpeg","image/png","image/webp","image/gif"]),m=d.Ik({mimeType:l,width:d.ai().int().positive(),height:d.ai().int().positive()}).strict(),n=d.k5(["running","completed","error","aborted"]),o=d.k5(["running","completed","error"]),p=d.ai().int().nonnegative().max(Number.MAX_SAFE_INTEGER),q=d.Ik({inputTokens:p,outputTokens:p,cacheReadTokens:p,costUsd:d.ai().finite().nonnegative()}).strict(),r=d.Yj().trim().min(1).nullable(),s=d.Ik({tempId:i}).strict(),t=d.Ik({index:j,entryId:e.Rv}).strict(),u=d.Ik({timestampMs:g.k.nullable(),type:d.eu("user"),viewKey:k,hasDetail:d.zM()}).strict(),v=d.Ik({timestampMs:g.k.nullable(),type:d.eu("assistant"),viewKey:k,status:n,hasDetail:d.zM(),usage:q}).strict(),w=d.Ik({timestampMs:g.k.nullable(),type:d.eu("tool"),viewKey:k,status:o,hasDetail:d.zM(),usage:q.nullable()}).strict(),x=d.Ik({timestampMs:g.k.nullable(),type:d.eu("bash"),viewKey:k,status:n,hasDetail:d.zM()}).strict(),y=d.Ik({timestampMs:g.k.nullable(),type:d.eu("custom"),viewKey:k,hasDetail:d.zM()}).strict();function z(a){let b=u.extend({timestampMs:a}).strict(),c=v.extend({timestampMs:a}).strict(),e=w.extend({timestampMs:a}).strict(),f=x.extend({timestampMs:a}).strict(),g=y.extend({timestampMs:a}).strict();return{user:b,assistant:c,tool:e,bash:f,custom:g,message:d.gM("type",[b,c,e,f,g])}}d.gM("type",[u,v,w,x,y]);let A=z(d.ch()).message;z(g.k).message;let B=d.Ik({text:d.Yj(),images:d.YO(m)}).strict(),C=d.Ik({provider:d.Yj(),modelId:d.Yj()}).strict();d.Ik({text:d.Yj(),errorMessage:d.Yj().nullable().default(null),model:C.nullable().optional()}).strict();let D={name:d.Yj().trim().min(1),reasoning:r,inputPreview:r,activity:r};function E(){return d.Ik({...D,path:f.eC.nullable()}).strict()}d.Ik({...D,images:d.YO(m).optional()}).strict();let F=d.KC([d.Ik({startedAtMs:g.k}).strict(),d.Ik({durationMs:d.ai().int().nonnegative().max(Number.MAX_SAFE_INTEGER)}).strict()]);d.Ik({...D,timing:F.nullable()}).strict(),E().extend({images:d.YO(m).optional()}).strict(),E(),E(),d.Ik({command:d.Yj().min(1)}).strict(),d.Ik({text:d.Yj()}).strict(),d.Ik({thinking:d.Yj()}).strict();let G=d.Ik({complete:d.zM(),calls:d.YO(d.Ik({name:d.Yj(),arguments:d.g1(d.Yj(),d.Pq()).optional(),argumentsBytes:d.ai().int().nonnegative().optional(),status:d.k5(["ok","error","unfinished"]),durationMs:d.ai().finite().nonnegative().optional(),error:d.Yj().optional()}).strict())}).strict();d.Ik({output:d.Yj(),nestedCalls:G.optional()}).strict(),d.Ik({output:d.Yj()}).strict(),d.Ik({content:d.Yj()}).strict(),d.gM("kind",[d.Ik({kind:d.eu("diff"),content:d.Yj()}).strict(),d.Ik({kind:d.eu("output"),content:d.Yj()}).strict()]),d.gM("kind",[d.Ik({kind:d.eu("content"),content:d.Yj()}).strict(),d.Ik({kind:d.eu("output"),content:d.Yj()}).strict()]),d.Ik({output:d.Yj()}).strict(),d.Ik({text:d.Yj().min(1)}).strict();let H=d.g1(d.Yj(),d.Pq()),I=d.g1(d.Yj(),d.Pq()),J=d.KC([I,d.ch()]);function K(a,b){return d.Ik({location:a,fixed:z(b).message,summary:H,detail:I.optional()}).strict().superRefine((a,b)=>{void 0===a.detail||a.fixed.hasDetail||b.addIssue({code:"custom",message:"message detail requires hasDetail=true",path:["detail"]})})}let L=K(s,d.ch()),M=K(t,g.k);function N(a,b){0===Object.keys(a).length&&b.addIssue({code:"custom",message:"patch requires at least one changed field"})}let O=d.Ik({viewKey:k.optional(),status:d.KC([n,o]).optional(),hasDetail:d.zM().optional(),usage:q.nullable().optional()}).strict().superRefine(N),P=d.g1(d.Yj(),d.Pq()).superRefine(N),Q=d.g1(d.Yj(),d.Pq()).superRefine(N),R=d.KC([d.Yj().min(1),d.YO(d.Pq()).min(1)]),S=d.g1(d.Yj(),R).superRefine((a,b)=>{for(let c of(N(a,b),Object.keys(a)))try{(0,h.U)(c)}catch(a){b.addIssue({code:"custom",message:a instanceof Error?a.message:"increment path is invalid",path:[c]})}}),T=d.Ik({messages:d.YO(M),temporaryMessages:d.YO(L)}).strict(),U=d.Ik({index:j,entryId:e.Rv,detail:J}).strict(),V=d.Ik({mimeType:l,data:d.Yj().min(1)}).strict()},96089:(a,b,c)=>{c.d(b,{R:()=>f});var d=c(59473),e=c(83905);let f=d.Ik({workId:d.Yj().trim().min(1),sessionId:e.$E,branchId:d.Yj().trim().min(1)}).strict()}};
|
|
1
|
+
"use strict";exports.id=6917,exports.ids=[6917],exports.modules={18:(a,b,c)=>{c.d(b,{FR:()=>m,kn:()=>l,zR:()=>k});var d=c(89409),e=c(25984);function f(a){return`${a.location.index}:${a.location.entryId}`}let g={user:["viewKey","hasDetail"],assistant:["viewKey","status","hasDetail","usage"],tool:["viewKey","status","hasDetail","usage"],bash:["viewKey","status","hasDetail"],custom:["viewKey","hasDetail"]};function h(a,b,c){if(!b)return a;let e={...a,...b};return"summary"===c?d.Hf.parse(e):d.D8.parse(e)}function i(a,b){if(Array.isArray(a.parent)){if("number"!=typeof a.key)throw Error("Increment array key is invalid");a.parent[a.key]=b;return}if("string"!=typeof a.key)throw Error("Increment object key is invalid");a.parent[a.key]=b}function j(a,b,c){let e=structuredClone(a),f=function(a,b){if(0===b.length)throw Error("Increment cannot append to the message layer root");let c=a;for(let a of b.slice(0,-1)){if("number"==typeof a){if(!Array.isArray(c)||a>=c.length)throw Error(`Increment array path does not exist: ${a}`);c=c[a];continue}if(!c||"object"!=typeof c||Array.isArray(c))throw Error(`Increment object path does not exist: ${a}`);if(!Object.hasOwn(c,a))throw Error(`Increment object field does not exist: ${a}`);c=c[a]}let d=b.at(-1);if("number"==typeof d){if(!Array.isArray(c)||d>=c.length)throw Error(`Increment array target does not exist: ${d}`);return{parent:c,key:d,value:c[d]}}if(!c||"object"!=typeof c||Array.isArray(c))throw Error(`Increment object target does not exist: ${d}`);if(!Object.hasOwn(c,d))throw Error(`Increment target does not exist: ${d}`);return{parent:c,key:d,value:c[d]}}(e,b);if("string"==typeof c){if("string"!=typeof f.value)throw Error("Increment target is not a string");return i(f,`${f.value}${c}`),d.Hf.parse(e)}if(!Array.isArray(f.value))throw Error("Increment target is not an array");return i(f,[...f.value,...c]),d.Hf.parse(e)}function k(a,b,c){let e=new Map(a.messages.filter(a=>void 0!==a.detail).map(a=>[f(a),a]));return{messages:b.map(a=>{let b=e.get(f(a));return a.fixed.hasDetail&&b&&b.fixed.type===a.fixed.type&&b.fixed.viewKey===a.fixed.viewKey&&void 0!==b.detail?d.mj.parse({...a,detail:b.detail}):a}),temporaryMessages:[...c]}}function l(a,b){if("message_start"===b.type){if(a.temporaryMessages.some(a=>a.location.tempId===b.snapshot.location.tempId))throw Error(`Temporary conversation message already exists: ${b.snapshot.location.tempId}`);return{...a,temporaryMessages:[...a.temporaryMessages,b.snapshot]}}let c=a.temporaryMessages.findIndex(a=>a.location.tempId===b.location.tempId);if(c<0)throw Error(`Temporary conversation message was not found: ${b.location.tempId}`);if("message_update"===b.type){let f=[...a.temporaryMessages];return f[c]=function(a,b){var c,f;if(a.location.tempId!==b.location.tempId)throw Error(`Conversation update tempId mismatch: ${b.location.tempId}`);let i=(c=a.fixed,(f=b.fixed)?(!function(a,b,c){let d=Object.keys(a).filter(a=>!b.includes(a));if(d.length>0)throw Error(`${c} patch contains fields invalid for the current message: ${d}`)}(f,g[c.type],`${c.type} fixed`),d.q5.parse({...c,...f})):c),k=h(a.summary,b.summary,"summary"),l=a.detail;if(void 0!==b.detail||Object.keys(b.increments??{}).some(a=>"detail"===(0,e.U)(a).root)){if(b.fixed?.hasDetail===!1)throw Error("Realtime detail cannot be updated while explicitly clearing hasDetail");i.hasDetail||(i=d.q5.parse({...i,hasDetail:!0}))}for(let[a,c]of(b.detail&&(l=h(l??{},b.detail,"detail")),Object.entries(b.increments??{}))){let b=(0,e.U)(a);"summary"===b.root?k=j(k,b.segments,c):l=j(l??{},b.segments,c)}return i.hasDetail||(l=void 0),d.s4.parse({location:a.location,fixed:i,summary:k,...void 0===l?{}:{detail:l}})}(f[c],b),{...a,temporaryMessages:f}}if("message_discard"===b.type)return{...a,temporaryMessages:a.temporaryMessages.filter(a=>a.location.tempId!==b.location.tempId)};if(b.durable.index!==a.messages.length)throw Error(`Conversation commit index is not continuous: expected ${a.messages.length}, received ${b.durable.index}`);if(a.messages.some(a=>a.location.entryId===b.durable.entryId))throw Error(`Conversation commit entryId already exists: ${b.durable.entryId}`);let{detail:f,fixed:i,...k}=a.temporaryMessages[c],l=d.mj.parse({...k,location:b.durable,fixed:{...i,timestampMs:b.fixed.timestampMs},...i.hasDetail&&void 0!==f?{detail:f}:{}});return{messages:[...a.messages,l],temporaryMessages:a.temporaryMessages.filter(a=>a.location.tempId!==b.location.tempId)}}function m(a,b){return"durable_append"===b.type?function(a,b){let c=a.messages.length;if(b.messages[0]?.location.index!==c)throw Error(`Conversation append index is not continuous: expected ${c}, received ${b.messages[0]?.location.index}`);let d=new Set(a.messages.map(a=>a.location.entryId));for(let a of b.messages){if(d.has(a.location.entryId))throw Error(`Conversation append entryId already exists: ${a.location.entryId}`);d.add(a.location.entryId)}return{...a,messages:[...a.messages,...b.messages]}}(a,b):l(a,b)}},610:(a,b,c)=>{c.d(b,{PS:()=>k,ef:()=>i,gK:()=>j,hS:()=>h,mv:()=>n});var d=c(59473),e=c(89409),f=c(2364),g=c(25984);let h=d.Ik({type:d.eu("message_start"),snapshot:e.s4}).strict(),i=d.Ik({type:d.eu("message_update"),location:e.fb,fixed:e.dG.optional(),summary:e.XW.optional(),detail:e.wH.optional(),increments:e.fK.optional()}).strict().superRefine((a,b)=>{if(!a.fixed&&!a.summary&&!a.detail&&!a.increments)return void b.addIssue({code:"custom",message:"message update requires a changed layer"});let c=[];for(let b of Object.keys(a.increments??{}))try{c.push({raw:b,parsed:(0,g.U)(b)})}catch{}for(let d of c){let c="summary"===d.parsed.root?Object.keys(a.summary??{}):Object.keys(a.detail??{}),e=d.parsed.segments[0];(0===d.parsed.segments.length||"string"==typeof e&&c.includes(e))&&b.addIssue({code:"custom",message:"replacement and increment paths cannot overlap",path:["increments",d.raw]})}for(let a=0;a<c.length;a+=1)for(let d=a+1;d<c.length;d+=1){let e=c[a],f=c[d];((0,g.v)(e.parsed,f.parsed)||(0,g.v)(f.parsed,e.parsed))&&b.addIssue({code:"custom",message:"increment parent and child paths cannot overlap",path:["increments",f.raw]})}}),j=d.Ik({type:d.eu("message_commit"),location:e.fb,durable:e.V6,fixed:d.Ik({timestampMs:f.k}).strict()}).strict(),k=d.Ik({type:d.eu("message_discard"),location:e.fb}).strict(),l=d.Ik({type:d.eu("durable_append"),messages:d.YO(e.mj).min(1)}).strict().superRefine((a,b)=>{let c=new Set;for(let[d,e]of a.messages.entries())d>0&&e.location.index!==a.messages[d-1].location.index+1&&b.addIssue({code:"custom",message:"durable append message indexes must be continuous",path:["messages",d,"location","index"]}),c.has(e.location.entryId)&&b.addIssue({code:"custom",message:"durable append entryId values must be unique",path:["messages",d,"location","entryId"]}),c.add(e.location.entryId)}),m=d.KC([h,i,j,k]),n=d.KC([l,m])},2002:(a,b,c)=>{c.d(b,{Od:()=>s,tU:()=>o,hE:()=>r,Sp:()=>g,P9:()=>f,_G:()=>k,Vc:()=>j});var d=c(59473);c(48452);let e=d.Ik({key:d.Yj().min(1).max(160),params:d.g1(d.Yj().min(1).max(80),d.KC([d.Yj().max(1e3),d.ai().finite()])).optional()}).strict(),f=4001,g=4003,h=d.Yj().trim().min(1),i=d.Yj().uuid();function j(a){return Object.freeze({op:"req",path:h.parse(a.path),inputSchema:a.inputSchema,outputSchema:a.outputSchema,...void 0===a.timeoutMs?{}:{timeoutMs:d.ai().int().positive().parse(a.timeoutMs)}})}function k(a){return Object.freeze({op:"push",path:h.parse(a.path),bodySchema:a.bodySchema})}let l=d.Ik({op:d.eu("req"),path:h,requestId:i}).strict(),m=d.Ik({op:d.eu("resp"),path:h,requestId:i}).strict(),n=d.Ik({op:d.eu("push"),path:h}).strict(),o=d.Ik({head:l,body:d.Pq()}).strict(),p=d.Ik({head:m,body:d.Ik({code:d.eu(0),msg:d.eu(""),data:d.Pq()}).strict()}).strict(),q=d.Ik({head:m,body:d.Ik({code:d.ai().int().positive(),msg:d.Yj().min(1),data:d.ch(),i18n:e.optional()}).strict()}).strict(),r=d.KC([p,q]),s=d.Ik({head:n,body:d.Pq()}).strict()},2364:(a,b,c)=>{c.d(b,{k:()=>d});let d=c(59473).ai().int().nonnegative().max(Number.MAX_SAFE_INTEGER)},12683:(a,b,c)=>{c.d(b,{FF:()=>h,LK:()=>i});var d=c(59473),e=c(24187),f=c(43037);let g=d.Ik({name:d.Yj().trim().min(1),description:d.Yj(),parameters:e.Dz}).strict(),h=d.Ik({source:f.Pi}).strict(),i=d.Ik({systemPrompt:d.Yj(),tools:d.YO(g)}).strict()},24187:(a,b,c)=>{c.d(b,{Dz:()=>h,f7:()=>g,tv:()=>f});var d=c(59473);let e=d.Yj().trim().min(1).max(64).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/),f=e,g=e,h=d.g1(d.Yj(),d.Pq());d.Yj().trim().min(3).max(129).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*\/[a-z0-9]+(?:-[a-z0-9]+)*$/);let i=d.k5(["plugin","server","rocket","settings","panel","message","terminal","file","folder","bot","wrench","database","globe"]);d.gM("type",[d.Ik({type:d.eu("builtin"),name:i}).strict(),d.Ik({type:d.eu("svg"),content:d.Yj().trim().min(1).max(16384)}).strict()])},25984:(a,b,c)=>{function d(a){if(!/^(0|[1-9]\d*)$/.test(a))return a;let b=Number(a);if(!Number.isSafeInteger(b))throw Error(`Increment array index is invalid: ${a}`);return b}function e(a){if(!a||a.length>1024)throw Error("Increment path length is invalid");let b=[],c="",e=!1;for(let d of a){if(e){if("."!==d&&"\\"!==d)throw Error(`Increment path contains an invalid escape: \\${d}`);c+=d,e=!1;continue}if("\\"===d){e=!0;continue}if("."===d){if(!c)throw Error("Increment path contains an empty segment");b.push(c),c="";continue}c+=d}if(e)throw Error("Increment path ends with an escape");if(!c)throw Error("Increment path contains an empty segment");b.push(c);let f=b.shift();if("summary"!==f&&"detail"!==f)throw Error("Increment path root must be summary or detail");return{root:f,segments:b.map(d)}}function f(a,b){return a.root===b.root&&!(a.segments.length>b.segments.length)&&a.segments.every((a,c)=>a===b.segments[c])}c.d(b,{U:()=>e,v:()=>f})},40750:(a,b,c)=>{c.d(b,{L6:()=>e,k_:()=>f});var d=c(18);let e={extensionMode:"normal",presentationMode:"normal",initializationError:null,queues:{steering:[],followUp:[]},model:null,capabilityMode:null,contextUsage:null,plugins:{}};function f(a,b){if("session_sync"===b.type){if("full"===b.mode)return{...(0,d.zR)(a,b.messages,b.temporaryMessages),runtime:b.runtime};let c=a.messages.at(-1);if(!c||c.location.index!==b.baseCursor.index||c.location.entryId!==b.baseCursor.entryId)throw Error("Incremental chat sync does not match the current durable cursor");let e=new Set(a.messages.map(a=>a.location.entryId));for(let a of b.messages){if(e.has(a.location.entryId))throw Error(`Incremental chat sync contains a duplicate entryId: ${a.location.entryId}`);e.add(a.location.entryId)}return{messages:[...a.messages,...b.messages],temporaryMessages:b.temporaryMessages,runtime:b.runtime}}return"runtime_update"===b.type?{...a,runtime:b.runtime}:{...(0,d.kn)(a,b),runtime:a.runtime}}Object.freeze({messages:[],temporaryMessages:[],runtime:e})},41468:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Cz:()=>j,Ht:()=>g.H,NA:()=>k,QS:()=>i});var e=c(96459),f=c(79626),g=c(72904),h=a([e]);function i(a,b,c,d=!1,g="temporary",h=!1){return(0,f.d)(a,b,c,h?[]:(0,e.WE)().readMessageDeclarations(),d,g)}function j(a,b,c,d,g,h=!1){return(0,f.N)(a,b,c,d,g,h?[]:(0,e.WE)().readMessageDeclarations())}function k(a){let{detail:b,...c}=a;return c}e=(h.then?(await h)():h)[0],d()}catch(a){d(a)}})},43037:(a,b,c)=>{c.d(b,{DK:()=>r,Pi:()=>q,R3:()=>m,TV:()=>A,UR:()=>s,VK:()=>D,kF:()=>F,mB:()=>G,oc:()=>C,ps:()=>E,w$:()=>w,wR:()=>p,wf:()=>B,xE:()=>n,xh:()=>t,yI:()=>o});var d=c(59473),e=c(20369),f=c(54733),g=c(89409),h=c(62977),i=c(96089);let j=g.Pc,k=g.LJ,l=g.mh,m=g.fb,n=g.lJ,o=g.s4,p=g.mj,q=i.R,r=d.Ik({index:k,entryId:f.C3}).strict(),s=d.KC([d.ch(),r]),t=l.extend({data:d.Yj().min(1)}).strict(),u=h.$,v=d.Ik({tempId:j,text:d.Yj(),images:d.YO(l).max(10)}).strict(),w=d.Ik({provider:d.Yj().trim().min(1),modelId:d.Yj().trim().min(1),thinkingLevel:u}).strict(),x=d.Ik({tokens:d.ai().int().nonnegative().max(Number.MAX_SAFE_INTEGER).nullable(),contextWindow:d.ai().int().positive().max(Number.MAX_SAFE_INTEGER)}).strict(),y=d.g1(d.Yj(),d.Pq()),z=d.g1(d.Yj().min(1),y),A=d.k5(["normal","basic"]),B=d.Ik({extensionMode:A.default("normal"),presentationMode:A.default("normal"),initializationError:d.Yj().max(32e3).nullable().default(null),queues:d.Ik({steering:d.YO(v),followUp:d.YO(v)}).strict(),model:w.nullable(),capabilityMode:e.rY.nullable(),contextUsage:x.nullable(),plugins:z}).strict(),C=g.RX.extend({runtime:B}).strict(),D=d.Ik({sessionId:f.Kx,branchId:f._A,entryId:f.C3}).strict(),E=g.XM,F=D.extend({imageIndex:d.ai().int().nonnegative()}).strict(),G=g.y0},47574:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{VB:()=>t,dM:()=>q,hr:()=>r,nJ:()=>s,yO:()=>u});var e=c(76760),f=c(69503),g=c(12683),h=c(43037),i=c(40750),j=c(95220),k=c(32980),l=c(41468),m=c(72498),n=a([k,l,m]);[k,l,m]=n.then?(await n)():n;class q extends Error{constructor(a){super(`Chat source is not current: ${a.workId}/${a.sessionId}/${a.branchId}`),this.name="L2ChatSourceBindingError"}}class r extends Error{constructor(a){super(`Chat message was not found: ${a}`),this.name="L2ChatMessageNotFoundError"}}class s extends Error{constructor(a){super(`Chat commands are blocked by WorkSession lifecycle: ${a}`),this.name="L2ChatLifecycleBlockedError"}}class t extends Error{constructor(a,b){super(`工作会话 ${a} 阻止插件重载:${b}`),this.workId=a,this.reason=b,this.name="L2PluginReloadBlockedError"}}function o(a){try{return structuredClone(a)}catch{let{declaration:b,...c}=a;return structuredClone(c)}}function p(a,b){return JSON.stringify(a)===JSON.stringify(b)}class u{async initialize(a){let b=a.map(a=>this.buildRecord(a));for(let a of(this.recordsByWorkId.clear(),b))this.recordsByWorkId.set(a.source.workId,a)}addWorkSession(a){this.recordsByWorkId.set(a.workId,this.buildRecord(a))}async replaceWorkSession(a,b){let c=this.recordsByWorkId.get(a.workId)?.source;await this.closeRecord(a.workId),c&&this.publish({type:"source_invalidated",source:c}),this.recordsByWorkId.set(b.workId,this.buildRecord(b)),a.sessionId!==b.sessionId&&await (0,m.gb)(a.sessionId)}async refreshWorkSession(a){let b=this.recordsByWorkId.get(a.workId)?.source;await this.closeRecord(a.workId),b&&this.publish({type:"source_invalidated",source:b}),this.recordsByWorkId.set(a.workId,this.buildRecord(a))}async removeWorkSession(a){let b=this.recordsByWorkId.get(a.workId)?.source;await this.closeRecord(a.workId),b&&this.publish({type:"source_invalidated",source:b}),await (0,m.gb)(a.sessionId)}async pauseWorkSession(a){let b=this.recordsByWorkId.get(a);b&&(b.acceptingCommands=!1,(0,m.ls)(b.source.sessionId).nativeUi.cancelAll(),await b.commandTail)}resumeWorkSession(a){let b=this.recordsByWorkId.get(a);b&&(b.acceptingCommands=!0)}async pauseForProcessRestart(){let a=[...this.recordsByWorkId.values()],b=a.map(a=>({record:a,reason:this.pluginReloadBlockReason(a)})).find(a=>null!==a.reason);if(b?.reason)throw new t(b.record.source.workId,b.reason);for(let b of a)b.acceptingCommands=!1;await Promise.all(a.map(a=>a.commandTail));let c=a.map(a=>({record:a,reason:this.pluginReloadBlockReason(a)})).find(a=>null!==a.reason);if(c?.reason){for(let b of a)b.acceptingCommands=!0;throw new t(c.record.source.workId,c.reason)}let d=!0;return()=>{if(d)for(let b of(d=!1,a))this.recordsByWorkId.get(b.source.workId)===b&&(b.acceptingCommands=!0)}}metadataFor(a){return this.recordFor(a).metadata}statusFor(a){return this.statusForRecord(this.recordFor(a))}statusForRecord(a){return a.mainRunning?"main_running":a.backgroundTaskIds.size>0?"background_running":a.completedPending?"completed":"idle"}acknowledgeCompleted(a){let b=this.recordsByWorkId.get(a);if(!b||!b.completedPending)return!1;let c=this.statusForRecord(b);return b.completedPending=!1,this.publishRecordChanged(a,b.metadata,c),!0}isCurrentSource(a){let b=h.Pi.parse(a),c=this.recordsByWorkId.get(b.workId);return void 0!==c&&this.matches(c.source,b)}getProjectPreviewContext(a,b){let c=this.recordsByWorkId.get(a.workId);if(!c||c.workSession!==a)return null;let d=(0,f.Yj)((0,e.resolve)(b)),g=d===(0,f.Yj)((0,e.resolve)(a.cwd)),h=()=>(0,f.D)(c.state.runtime.plugins[f.s6]).directories.find(a=>(0,f.Yj)(a)===d),i=g?a.cwd:h();if(!i)return null;let j=()=>this.recordsByWorkId.get(a.workId)===c&&c.acceptingCommands&&this.matches(c.source,this.sourceFor(a))&&(g||void 0!==h());return j()?{cwd:i,isCurrent:j}:null}setPresentation(a,b){let c=this.currentRecord(a);return this.enqueueCommand(c,async()=>{if(((0,j.P)()||"basic"===c.state.runtime.extensionMode)&&"normal"===b)throw Error("基础模式不启用插件消息展示,请先恢复插件聊天");c.state.runtime.presentationMode!==b&&this.reprojectRecord(c,b)})}reprojectRecord(a,b){let c=(0,m.ls)(a.source.sessionId).readChatSnapshot(),d=new Map(c.entries.map(a=>[a.entryId,a])),e="basic"===b,f=a.state.messages.map(b=>{let c=d.get(b.location.entryId);if(!c)throw Error(`无法重新投影消息:${b.location.entryId}`);return(0,l.Cz)(b.location.index,c.entryId,c.timestampMs,c.message,a.source,e)}),g=a.state.temporaryMessages.map(b=>{let c=a.rawTemporaryMessages.get(b.location.tempId);if(!c)throw Error(`临时消息基线尚不可重投影:${b.location.tempId}`);return(0,l.QS)(b.location.tempId,c,a.source,!1,"update",e)});a.state={messages:f,temporaryMessages:g,runtime:{...a.state.runtime,presentationMode:b}},a.sourceEventVersion+=1,this.publish({type:"source_event",source:a.source,version:a.sourceEventVersion,event:this.createSync(a.source,null).event})}prepareSource(a){let b=this.currentRecord(a);return this.syncRecordRuntime(b)}async syncRecordRuntime(a){let b=a.source,c=a.sourceEventVersion,d=await (0,m.ls)(b.sessionId).readChatRuntime(),e=h.wf.parse({...d,presentationMode:a.state.runtime.presentationMode});this.isCurrentSource(b)&&a.sourceEventVersion===c&&(p(a.state.runtime,e)||this.applySourceEvent(b,{type:"runtime_update",runtime:e}))}createSync(a,b){let c=this.currentRecord(a),d=c.source,e=c.state.messages,f=c.state.temporaryMessages,g=c.state.runtime,h=null===b?void 0:e[b.index],i=null!==b&&h?.location.entryId===b.entryId;return null===b||i||console.warn("[Pi Desk][WorkSessionChatRuntime] 客户端消息 cursor 不匹配,回退全量",{workId:d.workId,sessionId:d.sessionId,branchId:d.branchId,clientCursorIndex:b.index,clientCursorEntryId:b.entryId,serverEntryIdAtIndex:h?.location.entryId??null,serverLatestIndex:e.at(-1)?.location.index??-1}),{event:i?{type:"session_sync",mode:"incremental",baseCursor:b,messages:e.slice(b.index+1).map(l.NA),temporaryMessages:f,runtime:g}:{type:"session_sync",mode:"full",baseCursor:null,messages:e.map(l.NA),temporaryMessages:f,runtime:g},watermark:c.sourceEventVersion}}getImage(a){let b=h.kF.parse(a),c=this.recordForSession(b.sessionId,b.branchId),d=c.state.messages.find(a=>a.location.entryId===b.entryId);if(!d||"user"!==d.fixed.type&&"tool"!==d.fixed.type)throw new r(`${b.entryId}/${b.imageIndex}`);return h.mB.parse((0,m.ls)(c.source.sessionId).readChatImage(b.entryId,b.imageIndex))}getMessageDetail(a){let b=h.VK.parse(a),c=this.recordForSession(b.sessionId,b.branchId).state.messages.find(a=>a.location.entryId===b.entryId);if(!c)throw new r(b.entryId);return h.ps.parse({index:c.location.index,entryId:c.location.entryId,detail:c.detail??null})}getModelContext(a){let b=g.FF.parse(a),c=this.currentRecord(b.source);return this.enqueueCommand(c,async()=>g.LK.parse(await (0,m.ls)(c.source.sessionId).readModelContext()))}send(a){let b=this.currentRecord(a.source);if((0,m.ls)(a.source.sessionId).nativeUi.hasPending)return Promise.reject(Error("请先处理当前插件问题,或停止当前任务"));let c=()=>b.workSession.send({mode:a.mode,text:a.text,images:a.images});return b.compactionStart?b.acceptingCommands?b.compactionStart.then(a=>{if(!b.acceptingCommands)throw new s(b.source.workId);return a?c():this.enqueueCommand(b,c)}):Promise.reject(new s(b.source.workId)):this.enqueueCommand(b,c)}interrupt(a){let b=this.currentRecord(a);return(0,m.ls)(a.sessionId).nativeUi.hasPending?b.workSession.interrupt():this.enqueueCommand(b,()=>b.workSession.interrupt())}compact(a){let b,c=this.currentRecord(a);if(c.compactionStart)return Promise.reject(Error("上下文正在压缩"));let d=new Promise(a=>{b=a});c.compactionStart=d;let e=this.enqueueCommand(c,()=>{try{let a=(0,m.ls)(c.source.sessionId).compact();return b(!0),a}catch(a){throw b(!1),a}});return e.then(()=>{b(!1),c.compactionStart===d&&(c.compactionStart=null)},()=>{b(!1),c.compactionStart===d&&(c.compactionStart=null)}),e}reload(a,b){let c=this.currentRecord(a);return(0,m.ls)(a.sessionId).nativeUi.cancelAll(),this.enqueueCommand(c,async()=>{try{await (0,m.ls)(c.source.sessionId).reload(b)}finally{this.recordsByWorkId.get(a.workId)===c&&await this.syncRecordRuntime(c)}})}restoreQueuedMessages(a){let b=this.currentRecord(a);return this.enqueueCommand(b,()=>b.workSession.restoreQueuedMessages())}setTitle(a,b){let c=this.recordFor(a);return this.enqueueCommand(c,()=>c.workSession.setTitle(b))}setModel(a){let b=this.currentRecord(a.source);return this.enqueueCommand(b,()=>b.workSession.setModel(a.model))}setCapabilityMode(a){let b=this.currentRecord(a.source);return this.enqueueCommand(b,()=>(0,m.ls)(b.source.sessionId).setCapabilityMode(a.capabilityMode))}invokePluginMethod(a){let b=this.currentRecord(a.source);return this.enqueueCommand(b,()=>(0,m.ls)(b.source.sessionId).invokePluginMethod(b.source,a.pluginName,a.method,a.input))}listNativeCommands(a){let b=this.currentRecord(a);return this.enqueueCommand(b,()=>(0,m.ls)(b.source.sessionId).listNativeCommands())}executeNativeCommand(a,b,c){let d=this.currentRecord(a);return this.enqueueCommand(d,()=>(0,m.ls)(d.source.sessionId).executeNativeCommand(b,c))}listNativeTools(a){let b=this.currentRecord(a);return this.enqueueCommand(b,()=>(0,m.ls)(b.source.sessionId).listNativeTools())}executeDirectBash(a,b){let c=this.currentRecord(a);return c.directBashActive?Promise.reject(new k.yT):(c.directBashActive=!0,this.enqueueCommand(c,()=>(0,m.ls)(c.source.sessionId).executeDirectBash(b)).finally(()=>{c.directBashActive=!1}))}abortDirectBash(a){let b=this.currentRecord(a);return(0,m.ls)(b.source.sessionId).abortDirectBash()}subscribe(a){return this.listeners.add(a),()=>this.listeners.delete(a)}subscribeRecordChanges(a){return this.recordListeners.add(a),()=>this.recordListeners.delete(a)}subscribePluginPush(a){return this.pluginPushListeners.add(a),()=>this.pluginPushListeners.delete(a)}buildRecord(a){let b=this.sourceFor(a),c=(0,m.ls)(a.sessionId),d=c.readChatSnapshot(),e=d.entries.map((a,c)=>(0,l.Cz)(c,a.entryId,a.timestampMs,a.message,b,(0,j.P)())),f=h.oc.parse({messages:e,temporaryMessages:[],runtime:{...i.L6,extensionMode:(0,j.P)()?"basic":"normal",presentationMode:(0,j.P)()?"basic":"normal"}}),g=f.messages.find(a=>"user"===a.fixed.type),k=g?h.xE.safeParse(g.summary):null,n=k?.success&&k.data.text.trim()||null,o={workSession:a,source:b,state:f,sourceEventVersion:0,rawTemporaryMessages:new Map,metadata:{sessionTitle:d.sessionName??n,messageCounts:{user:f.messages.filter(a=>"user"===a.fixed.type).length,total:f.messages.length},lastMessageUpdatedAt:f.messages.at(-1)?.fixed.timestampMs??null},mainRunning:!1,backgroundTaskIds:new Set(c.readChatBackgroundTaskIds()),completedPending:!1,acceptingCommands:!0,directBashActive:!1,compactionStart:null,commandTail:Promise.resolve(),unsubscribeWorker:()=>void 0};return o.unsubscribeWorker=c.subscribeChat(a=>this.handleWorkerEvent(o,a)),o}handleWorkerEvent(a,b){if(this.recordsByWorkId.get(a.source.workId)!==a)return;let c=a.metadata,d=this.statusForRecord(a),e="basic"===a.state.runtime.extensionMode||"basic"===a.state.runtime.presentationMode;switch(b.type){case"message_start":a.rawTemporaryMessages.set(b.tempId,o(b.message)),this.applySourceEvent(a.source,{type:"message_start",snapshot:(0,l.QS)(b.tempId,b.message,a.source,!1,"temporary",e)});return;case"message_update":{let c=a.state.temporaryMessages.find(a=>a.location.tempId===b.tempId);if(!c)throw Error(`Temporary chat message was not found: ${b.tempId}`);a.rawTemporaryMessages.set(b.tempId,o(b.message));let d=(0,l.Ht)(c,(0,l.QS)(b.tempId,b.message,a.source,!1,"update",e));d&&this.applySourceEvent(a.source,d);return}case"message_commit":{let c=a.state.temporaryMessages.find(a=>a.location.tempId===b.tempId);if(!c)throw Error(`Temporary chat message was not found: ${b.tempId}`);let d=(0,l.QS)(b.tempId,b.message,a.source,!1,"final",e),f=(0,l.Ht)(c,d);f&&this.applySourceEvent(a.source,f),this.replaceCanonicalTemporary(a,b.tempId,b.message),a.rawTemporaryMessages.delete(b.tempId),this.applySourceEvent(a.source,{type:"message_commit",location:{tempId:b.tempId},durable:{index:a.state.messages.length,entryId:b.entryId},fixed:{timestampMs:b.timestampMs}});return}case"message_discard":a.rawTemporaryMessages.delete(b.tempId),this.applySourceEvent(a.source,{type:"message_discard",location:{tempId:b.tempId}});return;case"plugin_push":this.publishPluginPush({pluginName:b.pluginName,target:{scope:"session",source:a.source},event:b.event,data:structuredClone(b.data)});return;case"runtime_changed":{let c=h.wf.parse({...b.runtime,presentationMode:a.state.runtime.presentationMode});p(a.state.runtime,c)||this.applySourceEvent(a.source,{type:"runtime_update",runtime:c});return}case"agent_started":if(a.mainRunning)return;a.mainRunning=!0,a.completedPending=!1,this.publishRecordChanged(a.source.workId,c,d);return;case"main_operation_cancelled":case"main_operation_finished":if(!a.mainRunning)return;a.mainRunning=!1,a.completedPending=!1,this.publishRecordChanged(a.source.workId,c,d);return;case"agent_settled":{let b=a.mainRunning||a.backgroundTaskIds.size>0;a.mainRunning=!1,b&&0===a.backgroundTaskIds.size&&(a.completedPending=!0),this.publishRecordChanged(a.source.workId,c,d);return}case"background_tasks_changed":{let e=a.mainRunning||a.backgroundTaskIds.size>0;a.backgroundTaskIds=new Set(b.taskIds),e&&!a.mainRunning&&0===a.backgroundTaskIds.size&&(a.completedPending=!0),this.publishRecordChanged(a.source.workId,c,d);return}case"session_info_changed":a.metadata={...a.metadata,sessionTitle:b.sessionTitle},this.publishRecordChanged(a.source.workId,c,d);return}}replaceCanonicalTemporary(a,b,c){let d=a.state.temporaryMessages.findIndex(a=>a.location.tempId===b);if(d<0)throw Error(`Temporary chat message was not found: ${b}`);let e=[...a.state.temporaryMessages];e[d]=(0,l.QS)(b,c,a.source,!0,"final","basic"===a.state.runtime.extensionMode||"basic"===a.state.runtime.presentationMode),a.state={...a.state,temporaryMessages:e}}applySourceEvent(a,b){let c=this.currentRecord(a),d=c.source;if(c.state=(0,i.k_)(c.state,b),c.sourceEventVersion+=1,"message_commit"===b.type){let a=c.state.messages[b.durable.index];if(!a||a.location.entryId!==b.durable.entryId)throw Error(`Committed chat message is missing: ${b.durable.index}/${b.durable.entryId}`);let e=c.metadata;c.metadata=this.metadataFromState(c),this.publishRecordChanged(d.workId,e,this.statusForRecord(c))}this.publish({type:"source_event",source:d,version:c.sourceEventVersion,event:b})}metadataFromState(a){let b=a.state.messages.find(a=>"user"===a.fixed.type),c=b?h.xE.safeParse(b.summary):null,d=c?.success&&c.data.text.trim()||null;return{sessionTitle:a.metadata.sessionTitle??d,messageCounts:{user:a.state.messages.filter(a=>"user"===a.fixed.type).length,total:a.state.messages.length},lastMessageUpdatedAt:a.state.messages.at(-1)?.fixed.timestampMs??null}}enqueueCommand(a,b){if(!a.acceptingCommands)return Promise.reject(new s(a.source.workId));let c=a.commandTail.then(b,b);return a.commandTail=c.then(()=>void 0,()=>void 0),c}pluginReloadBlockReason(a){return(0,m.ls)(a.source.sessionId).nativeUi.hasPending?"原生插件问题正在等待回答":a.directBashActive?"Direct Bash 正在运行":a.mainRunning?"主 Agent 正在运行":a.backgroundTaskIds.size>0?"插件后台任务正在运行":(0,m.ls)(a.source.sessionId).readPluginReloadBlockReason()}async closeRecord(a){let b=this.recordsByWorkId.get(a);b&&(b.acceptingCommands=!1,(0,m.ls)(b.source.sessionId).nativeUi.cancelAll(),await b.commandTail,b.unsubscribeWorker(),b.rawTemporaryMessages.clear(),this.recordsByWorkId.delete(a))}recordFor(a){let b=this.recordsByWorkId.get(a.workId);if(!b||!this.matches(b.source,this.sourceFor(a)))throw Error(`WorkSession chat state is not initialized: ${a.workId}`);return b}sourceFor(a){return h.Pi.parse({workId:a.workId,sessionId:a.sessionId,branchId:a.branchId})}currentRecord(a){let b=h.Pi.parse(a),c=this.recordsByWorkId.get(b.workId);if(!c||!this.matches(c.source,b))throw new q(b);return c}recordForSession(a,b){let c=[...this.recordsByWorkId.values()].find(c=>c.source.sessionId===a&&c.source.branchId===b);if(c)return c;throw new q({workId:"unknown",sessionId:a,branchId:b})}matches(a,b){return a.workId===b.workId&&a.sessionId===b.sessionId&&a.branchId===b.branchId}publishPluginPush(a){for(let b of[...this.pluginPushListeners])try{b(a)}catch(b){console.error("[Pi Desk][WorkSessionChatRuntime] Plugin Push 监听器执行失败",{pluginName:a.pluginName,event:a.event,errorName:b instanceof Error?b.name:"UnknownError"})}}publish(a){for(let b of[...this.listeners])try{b(a)}catch(b){console.error("[Pi Desk][WorkSessionChatRuntime] Source 事件监听器执行失败",{eventType:a.type,workId:a.source.workId,errorName:b instanceof Error?b.name:"UnknownError"})}}publishRecordChanged(a,b,c){for(let d of[...this.recordListeners])try{d(a,b,c)}catch(b){console.error("[Pi Desk][WorkSessionChatRuntime] Record 监听器执行失败",{workId:a,errorName:b instanceof Error?b.name:"UnknownError"})}}constructor(){this.recordsByWorkId=new Map,this.listeners=new Set,this.recordListeners=new Set,this.pluginPushListeners=new Set}}d()}catch(a){d(a)}})},48452:(a,b,c)=>{c.d(b,{Y:()=>f,n:()=>e});var d=c(59473);let e="X-Pi-Desk-Client-Id",f=d.Yj().uuid()},54733:(a,b,c)=>{c.d(b,{AA:()=>p,Bn:()=>v,C3:()=>j,Ck:()=>s,ER:()=>m,Jl:()=>w,Kx:()=>i,MT:()=>l,MY:()=>q,Ms:()=>x,TO:()=>n,_A:()=>k,eW:()=>g,ik:()=>h,jw:()=>o,kg:()=>r,qL:()=>u,uX:()=>t});var d=c(59473),e=c(83905),f=c(2364);let g=d.Yj().trim().min(1),h=e.m4,i=e.$E,j=e.Rv,k=d.Yj().trim().min(1),l=d.ai().int().nonnegative(),m=d.Ik({workId:g,cwd:h,sessionId:i}).strict(),n=d.YO(m),o=d.k5(["main_running","background_running","completed","idle"]),p=d.Ik({user:d.ai().int().nonnegative(),total:d.ai().int().nonnegative()}).strict().refine(a=>a.user<=a.total,{message:"user message count cannot exceed total message count"}),q=m.extend({branchId:k,projectName:d.Yj().trim().min(1),sessionTitle:d.Yj().trim().min(1).nullable(),status:o,messageCounts:p,lastMessageUpdatedAt:f.k.nullable()}).strict(),r=d.Ik({workSessions:d.YO(q),pinnedCount:l}).strict().refine(a=>a.pinnedCount<=a.workSessions.length,{message:"pinnedCount cannot exceed work session count",path:["pinnedCount"]}),s=d.Ik({cwd:h,sessionId:i.optional()}).strict(),t=d.Ik({workSession:q}).strict(),u=d.Ik({workId:g,sessionId:i,title:d.Yj().trim().min(1)}).strict(),v=d.Ik({workId:g}).strict(),w=d.Ik({workIds:d.YO(g),pinnedCount:l}).strict().superRefine((a,b)=>{new Set(a.workIds).size!==a.workIds.length&&b.addIssue({code:"custom",message:"workIds cannot contain duplicates",path:["workIds"]}),a.pinnedCount>a.workIds.length&&b.addIssue({code:"custom",message:"pinnedCount cannot exceed workIds length",path:["pinnedCount"]})}),x=d.KC([d.Ik({workId:g,cwd:h,sessionId:i}).strict(),d.Ik({workId:g}).strict()])},62977:(a,b,c)=>{c.d(b,{$:()=>d});let d=c(59473).k5(["off","minimal","low","medium","high","xhigh","max"])},72904:(a,b,c)=>{c.d(b,{H:()=>g});var d=c(610);function e(a,b){return JSON.stringify(a)===JSON.stringify(b)}function f(a,b,c,d,f){for(let g of new Set([...Object.keys(b),...Object.keys(c)])){let h=b[g],i=Object.hasOwn(c,g),j=i?c[g]:null;if(e(h,j))continue;let k=i?function(a,b){if("string"==typeof a&&"string"==typeof b&&b.startsWith(a))return b.slice(a.length)||null;if(Array.isArray(a)&&Array.isArray(b)&&a.length<=b.length&&a.every((a,c)=>e(a,b[c]))){let c=b.slice(a.length);return c.length>0?c:null}return null}(h,j):null;null!==k?f[`${a}.${g.replace(/\\/g,"\\\\").replace(/\./g,"\\.")}`]=k:d[g]=j}}function g(a,b){var c,e;let g;if(a.fixed.type!==b.fixed.type)throw Error(`Chat message type changed: ${a.fixed.type}/${b.fixed.type}`);let h=(g={},a.fixed.viewKey!==b.fixed.viewKey&&(g.viewKey=b.fixed.viewKey),"status"in a.fixed&&"status"in b.fixed&&a.fixed.status!==b.fixed.status&&(g.status=b.fixed.status),a.fixed.hasDetail!==b.fixed.hasDetail&&(g.hasDetail=b.fixed.hasDetail),"usage"in a.fixed&&"usage"in b.fixed&&(c=a.fixed.usage)!==(e=b.fixed.usage)&&(null===c||null===e||c.inputTokens!==e.inputTokens||c.outputTokens!==e.outputTokens||c.cacheReadTokens!==e.cacheReadTokens||c.costUsd!==e.costUsd)&&(g.usage=b.fixed.usage),Object.keys(g).length>0?g:void 0),i={},j={},k={};f("summary",a.summary,b.summary,i,k),b.fixed.hasDetail&&f("detail",a.detail??{},b.detail??{},j,k);let l=Object.keys(i).length>0,m=Object.keys(j).length>0,n=Object.keys(k).length>0;return h||l||m||n?d.ef.parse({type:"message_update",location:a.location,...h?{fixed:h}:{},...l?{summary:i}:{},...m?{detail:j}:{},...n?{increments:k}:{}}):null}},79626:(a,b,c)=>{c.d(b,{N:()=>u,d:()=>t});var d=c(89409),e=c(59473),f=c(63719);let g=e.Ik({mode:e.k5(["sync","async"]),message:e.Yj()}).strict(),h="pi-desk/message-declaration-error",i=new WeakMap,j=e.Ik({viewKey:e.Yj().trim().min(3).max(129).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*\/[a-z0-9]+(?:-[a-z0-9]+)*$/),summary:e.g1(e.Yj(),e.Pq()),detail:e.g1(e.Yj(),e.Pq()).nullable()}).strict();function k(a){switch(a.type){case"user":return"pi-desk/user";case"assistant":return"pi-desk/assistant";case"tool":{let b=a.name.toLowerCase().split(".").at(-1);if("pidesk"===b)return"pi-desk/pidesk";if("bash"===b)return"pi-desk/bash-tool";if("codemode"===b)return"pi-desk/codemode";return"read"===b||"write"===b||"edit"===b?`pi-desk/${b}`:"pi-desk/tool"}case"bash":return"pi-desk/bash";case"custom":return"pi-desk/custom";case"compaction":return"pi-desk/compaction"}}function l(a){return null===a||"object"!=typeof a||Array.isArray(a)?null:a}function m(a){return l(a.result)}function n(a,b){return{...a.summary,path:function(a){let b=a.arguments.path??a.arguments.file_path;if("string"!=typeof b)return null;let c=f.eC.safeParse(b);return c.success?c.data:null}(b)}}function o(a){if(a.declaration)return a.declaration.message;switch(a.type){case"user":return{kind:"user",text:a.text,images:a.images};case"assistant":return{kind:"assistant",text:a.text,thinking:a.thinking,stopReason:a.status};case"tool":return{kind:"tool",toolName:a.name,toolCallId:"",arguments:{},partialResult:null,result:a.output?{output:a.output}:null,isError:"error"===a.status};case"bash":return{kind:"bash",command:a.command,output:a.output,exitCode:"completed"===a.status?0:null,cancelled:"aborted"===a.status,truncated:!1};case"custom":return{kind:"custom",customType:"display-message",content:a.text,details:null};case"compaction":return{kind:"custom",customType:"pi-desk/compaction",content:"",details:a.summary?{text:a.summary}:null}}}function p(a,b,c){return{pluginName:"pi-desk",declarationName:a,builtin:!0,declaration:{priority:b,match:c,project:a=>a.defaultProjection}}}let q=[p("pidesk",-900,a=>"tool"===a.message.kind&&"pidesk"===a.message.toolName),p("read",-900,a=>"tool"===a.message.kind&&"read"===a.message.toolName),p("write",-900,a=>"tool"===a.message.kind&&"write"===a.message.toolName),p("edit",-900,a=>"tool"===a.message.kind&&"edit"===a.message.toolName),p("bash-tool",-900,a=>"tool"===a.message.kind&&"bash"===a.message.toolName),p("user",-1e3,a=>"user"===a.message.kind),p("assistant",-1e3,a=>"assistant"===a.message.kind),p("tool",-1e3,a=>"tool"===a.message.kind),p("bash",-1e3,a=>"bash"===a.message.kind),p("custom",-1e3,a=>"custom"===a.message.kind)];function r(a){var b;let c=a.error instanceof Error?a.error:null,d=a.candidate;for(let b of d?[d]:a.candidates??[]){let d=i.get(b.declaration)??new Set;d.has(a.phase)||(d.add(a.phase),i.set(b.declaration,d),console.warn("[Pi Desk][MessageDeclaration] 插件投影失败,保留基础展示入口",{pluginName:b.pluginName,declarationName:b.declarationName,phase:a.phase,message:(c?.message??"Message Declaration conflict").slice(0,2e3)}))}return{viewKey:h,summary:{text:"string"==typeof a.defaultProjection.summary.text?a.defaultProjection.summary.text:"",phase:a.phase,pluginName:d?.pluginName??null,declarationName:d?.declarationName??null},detail:{phase:a.phase,pluginName:d?.pluginName??null,declarationName:d?.declarationName??null,priority:d?.declaration.priority??null,errorName:c?.name??null,errorMessage:c?.message??String(a.error??"Message Declaration conflict"),errorStack:c?.stack??null,conflicts:(a.candidates??[]).map(a=>({pluginName:a.pluginName,declarationName:a.declarationName,priority:a.declaration.priority})),defaultProjection:{viewKey:(b=a.defaultProjection).viewKey,summary:b.summary,detail:b.detail}}}}function s(a,b,c,e,f,i,p){let s=function(a){let b=function(a){switch(a.type){case"user":return{viewKey:k(a),summary:{text:function(a){let b=a.text.lastIndexOf("\n\n");if(0===a.images.length||b<0)return a.text;let c=a.text.slice(b+2).split("\n");return c.length>a.images.length?a.text:c.every(b=>{let c=/^\[Image: original \d+x\d+, displayed at (\d+)x(\d+)\. Multiply coordinates by \d+\.\d{2} to map to original image\.\]$/.exec(b);return null!==c&&a.images.some(a=>a.width===Number(c[1])&&a.height===Number(c[2]))})?a.text.slice(0,b):a.text}(a),images:a.images.map(a=>({...a}))},detail:null};case"assistant":return{viewKey:k(a),summary:{text:a.text,errorMessage:a.errorMessage,...void 0===a.model?{}:{model:a.model}},detail:a.thinking.length>0?{thinking:a.thinking}:null};case"tool":{let b=k(a),c={...a.images?.length&&["pi-desk/tool","pi-desk/read","pi-desk/codemode"].includes(b)?{images:a.images.map(a=>({...a}))}:{},name:a.name,reasoning:a.reasoning,inputPreview:a.inputPreview,activity:a.activity},d=a.durationMs??null,e=a.startedAtMs??null,f={viewKey:b,summary:"pi-desk/bash-tool"===b?{...c,timing:null!==d?{durationMs:d}:null!==e?{startedAtMs:e}:null}:c,detail:"pi-desk/codemode"===b?{output:a.output,...a.nestedCalls?{nestedCalls:a.nestedCalls}:{}}:a.output?{output:a.output}:null},h=o(a);return"tool"===h.kind?function(a,b){let c=function(a){let b=m(a);if(!b)return null;let c=b.content;if("string"==typeof c)return c;if(Array.isArray(c)){let a=[],b=!1;for(let d of c){let c=l(d);c?.type==="text"&&"string"==typeof c.text&&(b=!0,a.push(c.text))}if(b)return a.join("\n")}return"string"==typeof b.output?b.output:null}(b)??("string"==typeof a.detail?.output?a.detail.output:null);switch(a.viewKey){case"pi-desk/pidesk":{let d=c??"";try{let a=g.safeParse(JSON.parse(d));a.success&&(d=a.data.message)}catch{}return{viewKey:a.viewKey,summary:{input:b.arguments},detail:{output:d}}}case"pi-desk/read":let d;return{viewKey:a.viewKey,summary:n(a,b),detail:Array.isArray(d=m(b)?.content)&&d.some(a=>{let b=l(a);return b?.type==="image"})||null===c?null:{content:c}};case"pi-desk/edit":{let d=l(m(b)?.details??null)?.diff;return{viewKey:a.viewKey,summary:n(a,b),detail:b.isError||"string"!=typeof d?null===c?null:{kind:"output",content:c}:{kind:"diff",content:d}}}case"pi-desk/write":{let d=b.arguments.content;return{viewKey:a.viewKey,summary:n(a,b),detail:b.isError&&null!==c?{kind:"output",content:c}:"string"==typeof d?{kind:"content",content:d}:null===c?null:{kind:"output",content:c}}}default:return a}}(f,h):f}case"bash":return{viewKey:k(a),summary:{command:a.command},detail:a.output?{output:a.output}:null};case"custom":return{viewKey:k(a),summary:{text:a.text},detail:null};case"compaction":return{viewKey:k(a),summary:{},detail:a.summary?{text:a.summary}:null}}}(a.message);if("compaction"===a.message.type)return b;let c={source:a.source,stage:a.stage,message:o(a.message),raw:a.message.declaration?.raw??a.message,defaultProjection:b},d=[...(a.declarations??[]).map(a=>({...a,builtin:!1})),...q];for(let a of[...new Set(d.map(a=>a.declaration.priority))].sort((a,b)=>b-a)){let e,f=d.filter(b=>b.declaration.priority===a),g=[];for(let a of f)try{a.declaration.match(c)&&g.push(a)}catch(c){return r({phase:"match",candidate:a,error:c,defaultProjection:b})}if(0===g.length)continue;if(g.length>1)return r({phase:"conflict",candidates:g,defaultProjection:b});let i=g[0];try{e=i.declaration.project(c)}catch(a){return r({phase:"project",candidate:i,error:a,defaultProjection:b})}try{return function(a,b){let c=j.parse(a);if(!b&&c.viewKey===h)throw Error("Host reserved Message Declaration Error viewKey cannot be registered");return c}(e,i.builtin)}catch(a){return r({phase:"validate",candidate:i,error:a,defaultProjection:b})}}return b}({source:e,stage:f,message:c,declarations:p}),t="tool"===c.type||"bash"===c.type||"custom"===c.type||"compaction"===c.type,u=null!==s.detail&&(!t||i),v={location:a,fixed:function(a,b,c){let d={timestampMs:a,viewKey:c.viewKey,hasDetail:null!==c.detail};switch(b.type){case"user":return{...d,type:"user"};case"assistant":return{...d,type:"assistant",status:b.status,usage:b.usage};case"tool":return{...d,type:"tool",status:b.status,usage:b.usage};case"bash":return{...d,type:"bash",status:b.status};case"custom":case"compaction":return{...d,type:"custom"}}}(b,c,s),summary:s.summary,...u?{detail:s.detail}:{}};return"tempId"in a?d.s4.parse(v):d.mj.parse(v)}function t(a,b,c,d,e=!1,f="temporary"){return s({tempId:a},null,b,c,f,e,d)}function u(a,b,c,d,e,f){return s({index:a,entryId:b},c,d,e,"durable",!0,f)}},83905:(a,b,c)=>{c.d(b,{$E:()=>f,Rv:()=>g,m4:()=>e});var d=c(59473);let e=d.Yj().trim().min(1),f=d.Yj().trim().min(1),g=d.Yj().trim().min(1)},89409:(a,b,c)=>{c.d(b,{D8:()=>I,Hf:()=>H,LJ:()=>j,Pc:()=>i,RX:()=>T,V6:()=>t,XM:()=>U,XW:()=>P,dG:()=>O,fK:()=>S,fb:()=>s,lJ:()=>B,mh:()=>m,mj:()=>M,q5:()=>A,s4:()=>L,wH:()=>Q,y0:()=>V});var d=c(59473),e=c(83905),f=c(63719),g=c(2364),h=c(25984);let i=d.Yj().uuid(),j=d.ai().int().nonnegative(),k=d.Yj().trim().min(3).max(129).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*\/[a-z0-9]+(?:-[a-z0-9]+)*$/),l=d.k5(["image/jpeg","image/png","image/webp","image/gif"]),m=d.Ik({mimeType:l,width:d.ai().int().positive(),height:d.ai().int().positive()}).strict(),n=d.k5(["running","completed","error","aborted"]),o=d.k5(["running","completed","error"]),p=d.ai().int().nonnegative().max(Number.MAX_SAFE_INTEGER),q=d.Ik({inputTokens:p,outputTokens:p,cacheReadTokens:p,costUsd:d.ai().finite().nonnegative()}).strict(),r=d.Yj().trim().min(1).nullable(),s=d.Ik({tempId:i}).strict(),t=d.Ik({index:j,entryId:e.Rv}).strict(),u=d.Ik({timestampMs:g.k.nullable(),type:d.eu("user"),viewKey:k,hasDetail:d.zM()}).strict(),v=d.Ik({timestampMs:g.k.nullable(),type:d.eu("assistant"),viewKey:k,status:n,hasDetail:d.zM(),usage:q}).strict(),w=d.Ik({timestampMs:g.k.nullable(),type:d.eu("tool"),viewKey:k,status:o,hasDetail:d.zM(),usage:q.nullable()}).strict(),x=d.Ik({timestampMs:g.k.nullable(),type:d.eu("bash"),viewKey:k,status:n,hasDetail:d.zM()}).strict(),y=d.Ik({timestampMs:g.k.nullable(),type:d.eu("custom"),viewKey:k,hasDetail:d.zM()}).strict();function z(a){let b=u.extend({timestampMs:a}).strict(),c=v.extend({timestampMs:a}).strict(),e=w.extend({timestampMs:a}).strict(),f=x.extend({timestampMs:a}).strict(),g=y.extend({timestampMs:a}).strict();return{user:b,assistant:c,tool:e,bash:f,custom:g,message:d.gM("type",[b,c,e,f,g])}}d.gM("type",[u,v,w,x,y]);let A=z(d.ch()).message;z(g.k).message;let B=d.Ik({text:d.Yj(),images:d.YO(m)}).strict(),C=d.Ik({provider:d.Yj(),modelId:d.Yj()}).strict();d.Ik({text:d.Yj(),errorMessage:d.Yj().nullable().default(null),model:C.nullable().optional()}).strict();let D={name:d.Yj().trim().min(1),reasoning:r,inputPreview:r,activity:r};function E(){return d.Ik({...D,path:f.eC.nullable()}).strict()}d.Ik({...D,images:d.YO(m).optional()}).strict();let F=d.KC([d.Ik({startedAtMs:g.k}).strict(),d.Ik({durationMs:d.ai().int().nonnegative().max(Number.MAX_SAFE_INTEGER)}).strict()]);d.Ik({...D,timing:F.nullable()}).strict(),E().extend({images:d.YO(m).optional()}).strict(),E(),E(),d.Ik({command:d.Yj().min(1)}).strict(),d.Ik({text:d.Yj()}).strict(),d.Ik({thinking:d.Yj()}).strict();let G=d.Ik({complete:d.zM(),calls:d.YO(d.Ik({name:d.Yj(),arguments:d.g1(d.Yj(),d.Pq()).optional(),argumentsBytes:d.ai().int().nonnegative().optional(),status:d.k5(["ok","error","unfinished"]),durationMs:d.ai().finite().nonnegative().optional(),error:d.Yj().optional()}).strict())}).strict();d.Ik({output:d.Yj(),nestedCalls:G.optional()}).strict(),d.Ik({output:d.Yj()}).strict(),d.Ik({content:d.Yj()}).strict(),d.gM("kind",[d.Ik({kind:d.eu("diff"),content:d.Yj()}).strict(),d.Ik({kind:d.eu("output"),content:d.Yj()}).strict()]),d.gM("kind",[d.Ik({kind:d.eu("content"),content:d.Yj()}).strict(),d.Ik({kind:d.eu("output"),content:d.Yj()}).strict()]),d.Ik({output:d.Yj()}).strict(),d.Ik({text:d.Yj().min(1)}).strict();let H=d.g1(d.Yj(),d.Pq()),I=d.g1(d.Yj(),d.Pq()),J=d.KC([I,d.ch()]);function K(a,b){return d.Ik({location:a,fixed:z(b).message,summary:H,detail:I.optional()}).strict().superRefine((a,b)=>{void 0===a.detail||a.fixed.hasDetail||b.addIssue({code:"custom",message:"message detail requires hasDetail=true",path:["detail"]})})}let L=K(s,d.ch()),M=K(t,g.k);function N(a,b){0===Object.keys(a).length&&b.addIssue({code:"custom",message:"patch requires at least one changed field"})}let O=d.Ik({viewKey:k.optional(),status:d.KC([n,o]).optional(),hasDetail:d.zM().optional(),usage:q.nullable().optional()}).strict().superRefine(N),P=d.g1(d.Yj(),d.Pq()).superRefine(N),Q=d.g1(d.Yj(),d.Pq()).superRefine(N),R=d.KC([d.Yj().min(1),d.YO(d.Pq()).min(1)]),S=d.g1(d.Yj(),R).superRefine((a,b)=>{for(let c of(N(a,b),Object.keys(a)))try{(0,h.U)(c)}catch(a){b.addIssue({code:"custom",message:a instanceof Error?a.message:"increment path is invalid",path:[c]})}}),T=d.Ik({messages:d.YO(M),temporaryMessages:d.YO(L)}).strict(),U=d.Ik({index:j,entryId:e.Rv,detail:J}).strict(),V=d.Ik({mimeType:l,data:d.Yj().min(1)}).strict()},96089:(a,b,c)=>{c.d(b,{R:()=>f});var d=c(59473),e=c(83905);let f=d.Ik({workId:d.Yj().trim().min(1),sessionId:e.$E,branchId:d.Yj().trim().min(1)}).strict()}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";exports.id=80290,exports.ids=[80290],exports.modules={10720:(a,b,c)=>{c.d(b,{M5:()=>r});var d=c(59473),e=c(83905),f=c(42633),g=c(63719);let h=d.Yj().min(1).max(g.uV).refine(a=>!a.includes("\0")&&(a.startsWith("/")||a.startsWith("\\\\")||/^[a-zA-Z]:[\\/]/.test(a)),"必须是绝对路径"),i=d.Ik({cwd:e.m4.nullable()}).strict(),j=d.Ik({skillPath:h,name:d.Yj().min(1),description:d.Yj(),packageSource:d.Yj().nullable()}).strict(),k=d.Ik({skills:d.YO(j),diagnostics:d.YO(d.Ik({path:d.Yj(),message:f.qf}).strict())}).strict(),l=i.extend({skillPath:h}),m=l.extend({path:g.rh}).strict(),n=d.Ik({entries:d.YO(d.Ik({name:d.Yj().min(1),type:d.k5(["directory","file"])}).strict()).max(g.xm),truncated:d.zM()}).strict(),o=l.extend({path:g._g}).strict(),p=d.gM("kind",[d.Ik({kind:d.eu("text"),content:d.Yj(),size:d.ai().int().nonnegative().max(g.NL),readOnlyReason:f.qf.nullable()}).strict(),d.Ik({kind:d.eu("image"),mimeType:g.CT,data:d.Yj(),size:d.ai().int().nonnegative()}).strict(),d.Ik({kind:d.eu("unsupported"),size:d.ai().int().nonnegative(),reason:d.Yj()}).strict()]),q=o.extend({content:d.Yj().max(g.NL)}).strict(),r={list:{path:"/api/skills/list",request:i,response:k},listFiles:{path:"/api/skill-files/list",request:m,response:n},getFile:{path:"/api/skill-files/get",request:o,response:p},replaceFile:{path:"/api/skill-files/replace",request:q,response:d.Ik({}).strict()}}},15760:(a,b,c)=>{c.d(b,{i:()=>k});var d=c(76760),e=c(51455),f=c(63719),g=c(42633),h=c(13982),i=c(20416);function j(a){return/^(npm:|git:|https?:\/\/|ssh:\/\/|git:\/\/)/i.test(a)}function k(a){return(0,h.V)(async()=>{let{CONFIG_DIR_NAME:b,DefaultPackageManager:h,getAgentDir:k,loadSkills:l,SettingsManager:m}=await Promise.resolve().then(c.bind(c,75430)),n=k(),o=a??process.cwd(),p=null===a?"user":"project",q=m.create(o,n,{projectTrusted:null!==a}),r=new h({cwd:o,agentDir:n,settingsManager:q}),s=q.drainErrors().map(({scope:a,error:c})=>({path:(0,i.p0)("global"===a?(0,d.join)(n,"settings.json"):(0,d.join)(o,b,"settings.json")),message:c.message})),t=r.listConfiguredPackages(),u=new Set(t.filter(a=>a.scope===p&&!a.installedPath).map(a=>a.source)),v=await r.resolve(async a=>(t.some(b=>b.source===a&&b.scope===p)&&u.add(a),"skip"));for(let a of u)s.push({path:a,message:(0,g.J8)("包未安装或版本不匹配,已跳过;查看 Skills 不会自动安装包。","Package not installed or version mismatch. Skills are not installed automatically.")});let w=[(0,d.join)(n,"npm"),(0,d.join)(n,"git"),...t.flatMap(a=>j(a.source)&&a.installedPath?[a.installedPath]:[]),...null===a?[]:[(0,d.join)(a,b,"npm"),(0,d.join)(a,b,"git")]],x=await Promise.all(w.map(async a=>{try{return await (0,e.realpath)(a)}catch{return(0,d.resolve)(a)}})),y=new Set(await Promise.all(t.filter(a=>"user"===a.scope&&a.installedPath).map(async a=>{try{return(0,i.wX)(await (0,e.realpath)(a.installedPath))}catch{return(0,i.wX)(a.installedPath)}}))),z=[],A=new Set;for(let a of v.skills){if(a.metadata.scope!==p)continue;if("project"===p&&"package"===a.metadata.origin&&a.metadata.baseDir){let b=a.metadata.baseDir;try{b=await (0,e.realpath)(b)}catch{}if(y.has((0,i.wX)(b)))continue}let b=(0,i.p0)(a.path),c=(0,i.wX)(b);if(A.has(c))continue;A.add(c);let h=("SKILL.md"===(0,d.basename)(b)?(0,d.basename)((0,d.dirname)(b)):(0,d.basename)(b,".md"))||"Skill",k="";try{let a=await (0,e.stat)(b);if(!a.isFile())continue;if(a.size>f.NL)s.push({path:b,message:(0,g.J8)("入口文件超过文本读取限制。","The entry file exceeds the text read limit.")});else{let a=l({cwd:o,agentDir:n,skillPaths:[b],includeDefaults:!1});h=a.skills[0]?.name||h,k=a.skills[0]?.description??"",s.push(...a.diagnostics.map(a=>({path:(0,i.p0)(a.path??b),message:a.message})))}}catch(a){s.push({path:b,message:a instanceof Error?a.message:(0,g.J8)("入口文件读取失败","Could not read the entry file")})}a.enabled||s.push({path:b,message:(0,g.J8)("此资源已被 Pi 配置排除;仍可查看文件。","This resource is excluded by Pi configuration; its files are still available to view.")}),z.push({skillPath:b,name:h,description:k,packageSource:"package"===a.metadata.origin?a.metadata.source:null,managed:"package"===a.metadata.origin&&j(a.metadata.source)})}let B=new Map;for(let a of z){let b=B.get(a.name);b?s.push({path:a.skillPath,message:(0,g.J8)(`同名 Skill:${b};这里保留各自来源,不代表会话加载结果。`,`Duplicate Skill name: ${b}. Each source is shown here; this does not indicate the session load result.`)}):B.set(a.name,a.skillPath)}return z.sort((a,b)=>a.name.localeCompare(b.name,"zh-CN",{numeric:!0})||a.skillPath.localeCompare(b.skillPath)),{skills:z,diagnostics:s,managedRoots:x}})}},20416:(a,b,c)=>{c.d(b,{_w:()=>f,ml:()=>i,mt:()=>j,p0:()=>h,wX:()=>g});var d=c(76760),e=c(51455);class f extends Error{constructor(a,b){super(b),this.status=a,this.name="L4SkillError"}}function g(a){let b=(0,d.resolve)(a);return"win32"===process.platform?b.toLowerCase():b}function h(a){return(0,d.resolve)(a).split(d.sep).join("/")}function i(a,b){let c=(0,d.relative)(a,b);return""===c||".."!==c&&!c.startsWith(`..${d.sep}`)&&!(0,d.isAbsolute)(c)}async function j(a){try{return await (0,e.realpath)(a)}catch(a){if(a&&"object"==typeof a&&"code"in a&&("EACCES"===a.code||"EPERM"===a.code))throw new f(403,"没有权限访问 Skill 文件");throw new f(404,"Skill 或文件不存在")}}},35324:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Qg:()=>q,uf:()=>r,zD:()=>p});var e=c(77598),f=c(73024),g=c(51455),h=c(76760),i=c(42633),j=c(63719),k=c(60351),l=c(20416),m=a([k]);async function n(a,b,c){if(!(c?j.rh:j._g).safeParse(b).success)throw new l._w(400,"Skill 内路径必须是规范相对路径");if("SKILL.md"!==(0,h.basename)(a.skillPath)&&""!==b&&b!==(0,h.basename)(a.skillPath))throw new l._w(400,"独立 Markdown Skill 只允许访问入口文件自身");let d=await (0,l.mt)((0,h.dirname)(a.skillPath)),e=await (0,l.mt)((0,h.resolve)(d,b));if(!(0,l.ml)(d,e))throw new l._w(400,"目标文件不在此 Skill 的资源目录内");return{root:d,target:e}}async function o(a,b,c){if(b.managed||a.managedRoots.some(a=>(0,l.ml)(a,c)))return(0,i.J8)("此文件由 Pi 包管理器维护,请在包的源码目录修改;更新安装包会覆盖这里的内容。","This file is managed by the Pi package manager. Edit the package source; updates will overwrite this copy.");try{return await (0,g.access)(c,f.constants.W_OK),await (0,g.access)((0,h.dirname)(c),f.constants.W_OK),null}catch{return(0,i.J8)("当前服务没有修改此文件或其所在目录的权限。","The service does not have permission to edit this file or its directory.")}}async function p(a,b){let{root:c,target:d}=await n(a,b,!0);if(!(await (0,g.stat)(d)).isDirectory())throw new l._w(400,"目标不是目录");if("SKILL.md"!==(0,h.basename)(a.skillPath))return{entries:[{name:(0,h.basename)(a.skillPath),type:"file"}],truncated:!1};let e=[];for(let a of(await (0,g.readdir)(d,{withFileTypes:!0})))if(!(a.name.includes("\\")||a.name.includes("\0")||a.name.startsWith(".pi-desk-save-")))try{let b=a.isSymbolicLink()?await (0,l.mt)((0,h.join)(d,a.name)):(0,h.join)(d,a.name);if(!(0,l.ml)(c,b))continue;let f=a.isSymbolicLink()?await (0,g.stat)(b):a;f.isDirectory()?e.push({name:a.name,type:"directory"}):f.isFile()&&e.push({name:a.name,type:"file"})}catch{}return e.sort((a,b)=>"SKILL.md"===a.name?-1:"SKILL.md"===b.name?1:(a.type===b.type?0:"directory"===a.type?-1:1)||a.name.localeCompare(b.name,"zh-CN",{numeric:!0})),{entries:e.slice(0,j.xm),truncated:e.length>j.xm}}async function q(a,b,c){let{root:d,target:e}=await n(b,c,!1),f=await (0,g.stat)(e);if(!f.isFile())throw new l._w(400,"目标不是文件");try{let c=await (0,k.dy)(d,e,"original");return"text"===c.kind?{...c,readOnlyReason:await o(a,b,e)}:c}catch(a){if(a instanceof k.n){if("unsupported"===a.kind)return{kind:"unsupported",size:f.size,reason:"此文件不是支持的图片或 UTF-8 文本,不能在 Monaco 中编辑。"};if("text-too-large"===a.kind||"image-too-large"===a.kind)throw new l._w(413,"文件超过预览大小限制,不提供截断编辑");if("not-found"===a.kind)throw new l._w(404,"文件已不存在")}throw a}}async function r(a,b,d,f){if(f.includes("\0"))throw new l._w(400,"不能保存包含空字节的文本");if(Buffer.byteLength(f,"utf8")>j.NL)throw new l._w(413,"提交文本超过大小限制");let{target:i}=await n(b,d,!1),{withFileMutationQueue:k}=await Promise.resolve().then(c.bind(c,75430));await k(i,async()=>{let c,k,m,p=await n(b,d,!1);if((0,l.wX)(p.target)!==(0,l.wX)(i))throw new l._w(409,"文件位置已变化,请重新打开后保存");let q=await o(a,b,i);if(q)throw new l._w(403,"string"==typeof q?q:q.default);let r=await (0,g.open)(i,"r");try{let a=await r.stat();if(!a.isFile())throw new l._w(400,"只能替换已有文本文件");if(a.size>j.NL)throw new l._w(413,"原文件超过文本编辑限制");k=a.mode;let b=Buffer.alloc(j.NL+1),d=0;for(;d<b.length;){let a=await r.read(b,d,b.length-d,null);if(0===a.bytesRead)break;d+=a.bytesRead}if(d>j.NL)throw new l._w(413,"原文件超过文本编辑限制");c=b.subarray(0,d)}finally{await r.close()}try{if(c.includes(0))throw Error("binary");m=new TextDecoder("utf-8",{fatal:!0}).decode(c)}catch{throw new l._w(400,"只能保存完整的 UTF-8 文本文件")}let s=239===c[0]&&187===c[1]&&191===c[2],t=m.match(/\r\n|\n|\r/)?.[0]??"\n",u=f.replace(/^\uFEFF/,"").replace(/\r\n|\r/g,"\n").replace(/\n/g,t),v=Buffer.from(`${s?"\uFEFF":""}${u}`,"utf8");if(v.length>j.NL)throw new l._w(413,"保存后的文件超过文本大小限制");let w=(0,h.join)((0,h.dirname)(i),`.pi-desk-save-${(0,e.randomUUID)()}`);try{let a=await (0,g.open)(w,"wx",k);try{await a.writeFile(v),await a.chmod(511&k),await a.sync()}finally{await a.close()}await (0,g.stat)(i),await (0,g.rename)(w,i)}finally{await (0,g.rm)(w,{force:!0})}})}k=(m.then?(await m)():m)[0],d()}catch(a){d(a)}})},42222:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Jj:()=>j,Lx:()=>k,W3:()=>m,_w:()=>g._w,ed:()=>l});var e=c(15760),f=c(35324),g=c(20416),h=a([f]);function i(a,b){let c=a.skills.find(a=>(0,g.wX)(a.skillPath)===(0,g.wX)(b));if(!c)throw new g._w(404,"当前范围内未找到此 Skill,请刷新目录");return c}async function j(a){let b=await (0,e.i)(a);return{skills:b.skills.map(({skillPath:a,name:b,description:c,packageSource:d})=>({skillPath:a,name:b,description:c,packageSource:d})),diagnostics:b.diagnostics}}async function k(a,b,c){let d=await (0,e.i)(a);return(0,f.zD)(i(d,b),c)}async function l(a,b,c){let d=await (0,e.i)(a);return(0,f.Qg)(d,i(d,b),c)}async function m(a,b,c,d){let g=await (0,e.i)(a);await (0,f.uf)(g,i(g,b),c,d)}f=(h.then?(await h)():h)[0],d()}catch(a){d(a)}})},80290:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{IZ:()=>o,T$:()=>m,X6:()=>n,gt:()=>p});var e=c(76760),f=c(10720),g=c(23054),h=c(8602),i=c(42222),j=a([g,i]);function k(a){let b=(0,e.resolve)(a);return"win32"===process.platform?b.toLowerCase():b}async function l(a,b,c){let d;try{d=await a.json()}catch{return(0,h.e)(400,"Skills 请求 JSON 格式无效",{key:"errors:invalidJson"})}let e=b.request.safeParse(d);if(!e.success){let a=e.error.issues.some(a=>"too_big"===a.code&&"content"===a.path[0]);return(0,h.e)(a?413:400,a?"提交文本超过大小限制":"Skills 请求参数无效",{key:a?"errors:skillsContentTooLarge":"errors:skillsInputInvalid"})}try{if(null!==e.data.cwd){let a=k(e.data.cwd),b=(await (0,g.JJ)().listWorkSessions()).workSessions.find(b=>k(b.cwd)===a);if(!b)return(0,h.e)(409,"此项目已不在当前工作区,请重新选择项目",{key:"errors:skillsProjectChanged"});e.data.cwd=b.cwd}return(0,h.n)(b.response.parse(await c(e.data)))}catch(a){if(a instanceof i._w)return(0,h.e)(a.status,a.message);if(a&&"object"==typeof a&&"code"in a){if("ENOENT"===a.code)return(0,h.e)(404,"Skill 或文件已不存在",{key:"errors:skillMissing"});if("EPERM"===a.code||"EACCES"===a.code)return(0,h.e)(403,"没有权限读写此 Skill 文件",{key:"errors:skillsPermissionDenied"})}return console.error("[Pi Desk][SkillsApi] Skills 操作失败",a),(0,h.e)(500,"Skills 文件操作失败,请重试",{key:"errors:skillsFileFailed"})}}async function m(a){return l(a,f.M5.list,a=>(0,i.Jj)(a.cwd))}async function n(a){return l(a,f.M5.listFiles,a=>(0,i.Lx)(a.cwd,a.skillPath,a.path))}async function o(a){return l(a,f.M5.getFile,a=>(0,i.ed)(a.cwd,a.skillPath,a.path))}async function p(a){return l(a,f.M5.replaceFile,async a=>(await (0,i.W3)(a.cwd,a.skillPath,a.path,a.content),{}))}[g,i]=j.then?(await j)():j,d()}catch(a){d(a)}})}};
|
|
1
|
+
"use strict";exports.id=80290,exports.ids=[80290],exports.modules={10720:(a,b,c)=>{c.d(b,{M5:()=>r});var d=c(59473),e=c(83905),f=c(42633),g=c(63719);let h=d.Yj().min(1).max(g.uV).refine(a=>!a.includes("\0")&&(a.startsWith("/")||a.startsWith("\\\\")||/^[a-zA-Z]:[\\/]/.test(a)),"必须是绝对路径"),i=d.Ik({cwd:e.m4.nullable()}).strict(),j=d.Ik({skillPath:h,name:d.Yj().min(1),description:d.Yj(),packageSource:d.Yj().nullable()}).strict(),k=d.Ik({skills:d.YO(j),diagnostics:d.YO(d.Ik({path:d.Yj(),message:f.qf}).strict())}).strict(),l=i.extend({skillPath:h}),m=l.extend({path:g.rh}).strict(),n=d.Ik({entries:d.YO(d.Ik({name:d.Yj().min(1),type:d.k5(["directory","file"])}).strict()).max(g.xm),truncated:d.zM()}).strict(),o=l.extend({path:g._g}).strict(),p=d.gM("kind",[d.Ik({kind:d.eu("text"),content:d.Yj(),size:d.ai().int().nonnegative().max(g.NL),readOnlyReason:f.qf.nullable()}).strict(),d.Ik({kind:d.eu("image"),mimeType:g.CT,data:d.Yj(),size:d.ai().int().nonnegative()}).strict(),d.Ik({kind:d.eu("unsupported"),size:d.ai().int().nonnegative(),reason:d.Yj()}).strict()]),q=o.extend({content:d.Yj().max(g.NL)}).strict(),r={list:{path:"/api/skills/list",request:i,response:k},listFiles:{path:"/api/skill-files/list",request:m,response:n},getFile:{path:"/api/skill-files/get",request:o,response:p},replaceFile:{path:"/api/skill-files/replace",request:q,response:d.Ik({}).strict()}}},15760:(a,b,c)=>{c.d(b,{i:()=>j});var d=c(76760),e=c(51455),f=c(63719),g=c(42633),h=c(20416);function i(a){return/^(npm:|git:|https?:\/\/|ssh:\/\/|git:\/\/)/i.test(a)}async function j(a){let{CONFIG_DIR_NAME:b,DefaultPackageManager:j,getAgentDir:k,loadSkills:l,SettingsManager:m}=await Promise.resolve().then(c.bind(c,75430)),n=k(),o=a??process.cwd(),p=null===a?"user":"project",q=m.create(o,n,{projectTrusted:null!==a}),r=new j({cwd:o,agentDir:n,settingsManager:q}),s=q.drainErrors().map(({scope:a,error:c})=>({path:(0,h.p0)("global"===a?(0,d.join)(n,"settings.json"):(0,d.join)(o,b,"settings.json")),message:c.message})),t=r.listConfiguredPackages(),u=new Set(t.filter(a=>a.scope===p&&!a.installedPath).map(a=>a.source)),v=await r.resolve(async a=>(t.some(b=>b.source===a&&b.scope===p)&&u.add(a),"skip"));for(let a of u)s.push({path:a,message:(0,g.J8)("包未安装或版本不匹配,已跳过;查看 Skills 不会自动安装包。","Package not installed or version mismatch. Skills are not installed automatically.")});let w=[(0,d.join)(n,"npm"),(0,d.join)(n,"git"),...t.flatMap(a=>i(a.source)&&a.installedPath?[a.installedPath]:[]),...null===a?[]:[(0,d.join)(a,b,"npm"),(0,d.join)(a,b,"git")]],x=await Promise.all(w.map(async a=>{try{return await (0,e.realpath)(a)}catch{return(0,d.resolve)(a)}})),y=new Set(await Promise.all(t.filter(a=>"user"===a.scope&&a.installedPath).map(async a=>{try{return(0,h.wX)(await (0,e.realpath)(a.installedPath))}catch{return(0,h.wX)(a.installedPath)}}))),z=[],A=new Set;for(let a of v.skills){if(a.metadata.scope!==p)continue;if("project"===p&&"package"===a.metadata.origin&&a.metadata.baseDir){let b=a.metadata.baseDir;try{b=await (0,e.realpath)(b)}catch{}if(y.has((0,h.wX)(b)))continue}let b=(0,h.p0)(a.path),c=(0,h.wX)(b);if(A.has(c))continue;A.add(c);let j=("SKILL.md"===(0,d.basename)(b)?(0,d.basename)((0,d.dirname)(b)):(0,d.basename)(b,".md"))||"Skill",k="";try{let a=await (0,e.stat)(b);if(!a.isFile())continue;if(a.size>f.NL)s.push({path:b,message:(0,g.J8)("入口文件超过文本读取限制。","The entry file exceeds the text read limit.")});else{let a=l({cwd:o,agentDir:n,skillPaths:[b],includeDefaults:!1});j=a.skills[0]?.name||j,k=a.skills[0]?.description??"",s.push(...a.diagnostics.map(a=>({path:(0,h.p0)(a.path??b),message:a.message})))}}catch(a){s.push({path:b,message:a instanceof Error?a.message:(0,g.J8)("入口文件读取失败","Could not read the entry file")})}a.enabled||s.push({path:b,message:(0,g.J8)("此资源已被 Pi 配置排除;仍可查看文件。","This resource is excluded by Pi configuration; its files are still available to view.")}),z.push({skillPath:b,name:j,description:k,packageSource:"package"===a.metadata.origin?a.metadata.source:null,managed:"package"===a.metadata.origin&&i(a.metadata.source)})}let B=new Map;for(let a of z){let b=B.get(a.name);b?s.push({path:a.skillPath,message:(0,g.J8)(`同名 Skill:${b};这里保留各自来源,不代表会话加载结果。`,`Duplicate Skill name: ${b}. Each source is shown here; this does not indicate the session load result.`)}):B.set(a.name,a.skillPath)}return z.sort((a,b)=>a.name.localeCompare(b.name,"zh-CN",{numeric:!0})||a.skillPath.localeCompare(b.skillPath)),{skills:z,diagnostics:s,managedRoots:x}}},20416:(a,b,c)=>{c.d(b,{_w:()=>f,ml:()=>i,mt:()=>j,p0:()=>h,wX:()=>g});var d=c(76760),e=c(51455);class f extends Error{constructor(a,b){super(b),this.status=a,this.name="L4SkillError"}}function g(a){let b=(0,d.resolve)(a);return"win32"===process.platform?b.toLowerCase():b}function h(a){return(0,d.resolve)(a).split(d.sep).join("/")}function i(a,b){let c=(0,d.relative)(a,b);return""===c||".."!==c&&!c.startsWith(`..${d.sep}`)&&!(0,d.isAbsolute)(c)}async function j(a){try{return await (0,e.realpath)(a)}catch(a){if(a&&"object"==typeof a&&"code"in a&&("EACCES"===a.code||"EPERM"===a.code))throw new f(403,"没有权限访问 Skill 文件");throw new f(404,"Skill 或文件不存在")}}},35324:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Qg:()=>q,uf:()=>r,zD:()=>p});var e=c(77598),f=c(73024),g=c(51455),h=c(76760),i=c(42633),j=c(63719),k=c(60351),l=c(20416),m=a([k]);async function n(a,b,c){if(!(c?j.rh:j._g).safeParse(b).success)throw new l._w(400,"Skill 内路径必须是规范相对路径");if("SKILL.md"!==(0,h.basename)(a.skillPath)&&""!==b&&b!==(0,h.basename)(a.skillPath))throw new l._w(400,"独立 Markdown Skill 只允许访问入口文件自身");let d=await (0,l.mt)((0,h.dirname)(a.skillPath)),e=await (0,l.mt)((0,h.resolve)(d,b));if(!(0,l.ml)(d,e))throw new l._w(400,"目标文件不在此 Skill 的资源目录内");return{root:d,target:e}}async function o(a,b,c){if(b.managed||a.managedRoots.some(a=>(0,l.ml)(a,c)))return(0,i.J8)("此文件由 Pi 包管理器维护,请在包的源码目录修改;更新安装包会覆盖这里的内容。","This file is managed by the Pi package manager. Edit the package source; updates will overwrite this copy.");try{return await (0,g.access)(c,f.constants.W_OK),await (0,g.access)((0,h.dirname)(c),f.constants.W_OK),null}catch{return(0,i.J8)("当前服务没有修改此文件或其所在目录的权限。","The service does not have permission to edit this file or its directory.")}}async function p(a,b){let{root:c,target:d}=await n(a,b,!0);if(!(await (0,g.stat)(d)).isDirectory())throw new l._w(400,"目标不是目录");if("SKILL.md"!==(0,h.basename)(a.skillPath))return{entries:[{name:(0,h.basename)(a.skillPath),type:"file"}],truncated:!1};let e=[];for(let a of(await (0,g.readdir)(d,{withFileTypes:!0})))if(!(a.name.includes("\\")||a.name.includes("\0")||a.name.startsWith(".pi-desk-save-")))try{let b=a.isSymbolicLink()?await (0,l.mt)((0,h.join)(d,a.name)):(0,h.join)(d,a.name);if(!(0,l.ml)(c,b))continue;let f=a.isSymbolicLink()?await (0,g.stat)(b):a;f.isDirectory()?e.push({name:a.name,type:"directory"}):f.isFile()&&e.push({name:a.name,type:"file"})}catch{}return e.sort((a,b)=>"SKILL.md"===a.name?-1:"SKILL.md"===b.name?1:(a.type===b.type?0:"directory"===a.type?-1:1)||a.name.localeCompare(b.name,"zh-CN",{numeric:!0})),{entries:e.slice(0,j.xm),truncated:e.length>j.xm}}async function q(a,b,c){let{root:d,target:e}=await n(b,c,!1),f=await (0,g.stat)(e);if(!f.isFile())throw new l._w(400,"目标不是文件");try{let c=await (0,k.dy)(d,e,"original");return"text"===c.kind?{...c,readOnlyReason:await o(a,b,e)}:c}catch(a){if(a instanceof k.n){if("unsupported"===a.kind)return{kind:"unsupported",size:f.size,reason:"此文件不是支持的图片或 UTF-8 文本,不能在 Monaco 中编辑。"};if("text-too-large"===a.kind||"image-too-large"===a.kind)throw new l._w(413,"文件超过预览大小限制,不提供截断编辑");if("not-found"===a.kind)throw new l._w(404,"文件已不存在")}throw a}}async function r(a,b,d,f){if(f.includes("\0"))throw new l._w(400,"不能保存包含空字节的文本");if(Buffer.byteLength(f,"utf8")>j.NL)throw new l._w(413,"提交文本超过大小限制");let{target:i}=await n(b,d,!1),{withFileMutationQueue:k}=await Promise.resolve().then(c.bind(c,75430));await k(i,async()=>{let c,k,m,p=await n(b,d,!1);if((0,l.wX)(p.target)!==(0,l.wX)(i))throw new l._w(409,"文件位置已变化,请重新打开后保存");let q=await o(a,b,i);if(q)throw new l._w(403,"string"==typeof q?q:q.default);let r=await (0,g.open)(i,"r");try{let a=await r.stat();if(!a.isFile())throw new l._w(400,"只能替换已有文本文件");if(a.size>j.NL)throw new l._w(413,"原文件超过文本编辑限制");k=a.mode;let b=Buffer.alloc(j.NL+1),d=0;for(;d<b.length;){let a=await r.read(b,d,b.length-d,null);if(0===a.bytesRead)break;d+=a.bytesRead}if(d>j.NL)throw new l._w(413,"原文件超过文本编辑限制");c=b.subarray(0,d)}finally{await r.close()}try{if(c.includes(0))throw Error("binary");m=new TextDecoder("utf-8",{fatal:!0}).decode(c)}catch{throw new l._w(400,"只能保存完整的 UTF-8 文本文件")}let s=239===c[0]&&187===c[1]&&191===c[2],t=m.match(/\r\n|\n|\r/)?.[0]??"\n",u=f.replace(/^\uFEFF/,"").replace(/\r\n|\r/g,"\n").replace(/\n/g,t),v=Buffer.from(`${s?"\uFEFF":""}${u}`,"utf8");if(v.length>j.NL)throw new l._w(413,"保存后的文件超过文本大小限制");let w=(0,h.join)((0,h.dirname)(i),`.pi-desk-save-${(0,e.randomUUID)()}`);try{let a=await (0,g.open)(w,"wx",k);try{await a.writeFile(v),await a.chmod(511&k),await a.sync()}finally{await a.close()}await (0,g.stat)(i),await (0,g.rename)(w,i)}finally{await (0,g.rm)(w,{force:!0})}})}k=(m.then?(await m)():m)[0],d()}catch(a){d(a)}})},42222:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Jj:()=>j,Lx:()=>k,W3:()=>m,_w:()=>g._w,ed:()=>l});var e=c(15760),f=c(35324),g=c(20416),h=a([f]);function i(a,b){let c=a.skills.find(a=>(0,g.wX)(a.skillPath)===(0,g.wX)(b));if(!c)throw new g._w(404,"当前范围内未找到此 Skill,请刷新目录");return c}async function j(a){let b=await (0,e.i)(a);return{skills:b.skills.map(({skillPath:a,name:b,description:c,packageSource:d})=>({skillPath:a,name:b,description:c,packageSource:d})),diagnostics:b.diagnostics}}async function k(a,b,c){let d=await (0,e.i)(a);return(0,f.zD)(i(d,b),c)}async function l(a,b,c){let d=await (0,e.i)(a);return(0,f.Qg)(d,i(d,b),c)}async function m(a,b,c,d){let g=await (0,e.i)(a);await (0,f.uf)(g,i(g,b),c,d)}f=(h.then?(await h)():h)[0],d()}catch(a){d(a)}})},80290:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{IZ:()=>o,T$:()=>m,X6:()=>n,gt:()=>p});var e=c(76760),f=c(10720),g=c(23054),h=c(8602),i=c(42222),j=a([g,i]);function k(a){let b=(0,e.resolve)(a);return"win32"===process.platform?b.toLowerCase():b}async function l(a,b,c){let d;try{d=await a.json()}catch{return(0,h.e)(400,"Skills 请求 JSON 格式无效",{key:"errors:invalidJson"})}let e=b.request.safeParse(d);if(!e.success){let a=e.error.issues.some(a=>"too_big"===a.code&&"content"===a.path[0]);return(0,h.e)(a?413:400,a?"提交文本超过大小限制":"Skills 请求参数无效",{key:a?"errors:skillsContentTooLarge":"errors:skillsInputInvalid"})}try{if(null!==e.data.cwd){let a=k(e.data.cwd),b=(await (0,g.JJ)().listWorkSessions()).workSessions.find(b=>k(b.cwd)===a);if(!b)return(0,h.e)(409,"此项目已不在当前工作区,请重新选择项目",{key:"errors:skillsProjectChanged"});e.data.cwd=b.cwd}return(0,h.n)(b.response.parse(await c(e.data)))}catch(a){if(a instanceof i._w)return(0,h.e)(a.status,a.message);if(a&&"object"==typeof a&&"code"in a){if("ENOENT"===a.code)return(0,h.e)(404,"Skill 或文件已不存在",{key:"errors:skillMissing"});if("EPERM"===a.code||"EACCES"===a.code)return(0,h.e)(403,"没有权限读写此 Skill 文件",{key:"errors:skillsPermissionDenied"})}return console.error("[Pi Desk][SkillsApi] Skills 操作失败",a),(0,h.e)(500,"Skills 文件操作失败,请重试",{key:"errors:skillsFileFailed"})}}async function m(a){return l(a,f.M5.list,a=>(0,i.Jj)(a.cwd))}async function n(a){return l(a,f.M5.listFiles,a=>(0,i.Lx)(a.cwd,a.skillPath,a.path))}async function o(a){return l(a,f.M5.getFile,a=>(0,i.ed)(a.cwd,a.skillPath,a.path))}async function p(a){return l(a,f.M5.replaceFile,async a=>(await (0,i.W3)(a.cwd,a.skillPath,a.path,a.content),{}))}[g,i]=j.then?(await j)():j,d()}catch(a){d(a)}})}};
|