@rexvane/piweb 0.3.19 → 0.3.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/app-path-routes-manifest.json +4 -4
  3. package/.next/build-manifest.json +3 -3
  4. package/.next/prerender-manifest.json +4 -4
  5. package/.next/react-loadable-manifest.json +4 -4
  6. package/.next/required-server-files.js +2 -1
  7. package/.next/required-server-files.json +2 -1
  8. package/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  9. package/.next/server/app/_global-error.html +1 -1
  10. package/.next/server/app/_global-error.rsc +1 -1
  11. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  12. package/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  13. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  14. package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  15. package/.next/server/app/_not-found.html +1 -1
  16. package/.next/server/app/_not-found.rsc +2 -2
  17. package/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  18. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  19. package/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  20. package/.next/server/app/api/agent/[id]/events/route.js +3 -3
  21. package/.next/server/app/api/agent/[id]/events/route.js.nft.json +1 -1
  22. package/.next/server/app/api/agent/[id]/route.js +1 -1
  23. package/.next/server/app/api/agent/[id]/route.js.nft.json +1 -1
  24. package/.next/server/app/api/agent/[id]/tree/route.js +1 -1
  25. package/.next/server/app/api/agent/[id]/tree/route.js.nft.json +1 -1
  26. package/.next/server/app/api/agent/new/route.js +1 -1
  27. package/.next/server/app/api/agent/new/route.js.nft.json +1 -1
  28. package/.next/server/app/api/growth/route.js +1 -1
  29. package/.next/server/app/api/growth/route.js.nft.json +1 -1
  30. package/.next/server/app/api/models/route.js +1 -1
  31. package/.next/server/app/api/models/route.js.nft.json +1 -1
  32. package/.next/server/app/api/plugins/route.js +1 -1
  33. package/.next/server/app/api/plugins/route.js.nft.json +1 -1
  34. package/.next/server/app/api/prompts/route.js +1 -1
  35. package/.next/server/app/api/prompts/route.js.nft.json +1 -1
  36. package/.next/server/app/api/remote/route.js +2 -2
  37. package/.next/server/app/api/security/route.js +1 -1
  38. package/.next/server/app/api/security/route.js.nft.json +1 -1
  39. package/.next/server/app/api/sessions/[id]/export/route.js +1 -1
  40. package/.next/server/app/api/sessions/[id]/export/route.js.nft.json +1 -1
  41. package/.next/server/app/api/sessions/[id]/route.js +1 -1
  42. package/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
  43. package/.next/server/app/api/sessions/route.js +1 -1
  44. package/.next/server/app/api/sessions/route.js.nft.json +1 -1
  45. package/.next/server/app/api/skills/route.js +2 -2
  46. package/.next/server/app/api/skills/route.js.nft.json +1 -1
  47. package/.next/server/app/api/update/route.js +2 -2
  48. package/.next/server/app/api/update/route.js.nft.json +1 -1
  49. package/.next/server/app/api/version/route.js +1 -1
  50. package/.next/server/app/api/workspaces/route.js +1 -1
  51. package/.next/server/app/api/workspaces/route.js.nft.json +1 -1
  52. package/.next/server/app/index.html +1 -1
  53. package/.next/server/app/index.rsc +4 -4
  54. package/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
  55. package/.next/server/app/index.segments/_full.segment.rsc +4 -4
  56. package/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  57. package/.next/server/app/login/page_client-reference-manifest.js +1 -1
  58. package/.next/server/app/login.html +1 -1
  59. package/.next/server/app/login.rsc +3 -3
  60. package/.next/server/app/login.segments/_full.segment.rsc +3 -3
  61. package/.next/server/app/login.segments/_tree.segment.rsc +2 -2
  62. package/.next/server/app/login.segments/login/__PAGE__.segment.rsc +3 -3
  63. package/.next/server/app/page.js +1 -1
  64. package/.next/server/app/page.js.nft.json +1 -1
  65. package/.next/server/app/page_client-reference-manifest.js +1 -1
  66. package/.next/server/app-paths-manifest.json +4 -4
  67. package/.next/server/chunks/421.js +1 -0
  68. package/.next/server/chunks/496.js +1 -1
  69. package/.next/server/chunks/662.js +2 -0
  70. package/.next/server/chunks/686.js +1 -1
  71. package/.next/server/chunks/807.js +1 -1
  72. package/.next/server/chunks/924.js +2 -2
  73. package/.next/server/instrumentation.js +1 -1
  74. package/.next/server/instrumentation.js.nft.json +1 -1
  75. package/.next/server/middleware-build-manifest.js +1 -1
  76. package/.next/server/middleware-react-loadable-manifest.js +1 -1
  77. package/.next/server/pages/404.html +1 -1
  78. package/.next/server/pages/500.html +1 -1
  79. package/.next/server/server-reference-manifest.json +1 -1
  80. package/.next/static/chunks/4686-882531aef1d2e250.js +1 -0
  81. package/.next/static/chunks/{4778.e4c9ed093a413bc4.js → 4778.305dc6abb9889627.js} +1 -1
  82. package/.next/static/chunks/839.bfd2db36483faa3e.js +1 -0
  83. package/.next/static/chunks/8552.25c39ef4c995eba0.js +1 -0
  84. package/.next/static/chunks/app/page-c04af72e549695bd.js +1 -0
  85. package/.next/static/chunks/webpack-9b4bb574e5817654.js +1 -0
  86. package/.next/static/css/ea27b9e30f76303f.css +1 -0
  87. package/README.md +14 -5
  88. package/next.config.ts +4 -2
  89. package/package.json +1 -1
  90. package/scripts/release.mjs +1 -1
  91. package/src/app/api/agent/[id]/events/route.ts +42 -13
  92. package/src/app/api/remote/route.ts +12 -2
  93. package/src/app/api/update/route.ts +18 -2
  94. package/src/app/globals.css +89 -0
  95. package/src/components/AppShell.tsx +7 -3
  96. package/src/components/ChatInput.tsx +1 -0
  97. package/src/components/ChatWindow.tsx +105 -81
  98. package/src/components/ContextMeter.tsx +31 -0
  99. package/src/components/DrawerPanel.tsx +19 -26
  100. package/src/components/ExtensionUI.tsx +8 -2
  101. package/src/components/MarkdownBlock.tsx +333 -37
  102. package/src/components/RemoteSection.tsx +41 -8
  103. package/src/components/SettingsPanel.tsx +122 -53
  104. package/src/components/chat/chat-scroll.ts +18 -0
  105. package/src/components/update/CopyCommand.tsx +34 -0
  106. package/src/components/update/UpdateNotice.tsx +130 -0
  107. package/src/components/update/update-store.ts +155 -0
  108. package/src/hooks/usePiWeb.ts +42 -25
  109. package/src/i18n.tsx +82 -10
  110. package/src/instrumentation-node.ts +3 -0
  111. package/src/lib/agent-manager.ts +100 -57
  112. package/src/lib/chat/event-stream.ts +113 -0
  113. package/src/lib/chat/stream-settings.ts +192 -0
  114. package/src/lib/remote/mobile-proxy.ts +8 -2
  115. package/src/lib/remote/supervisor.ts +18 -8
  116. package/src/lib/types.ts +7 -0
  117. package/src/lib/update/startup-check.ts +117 -0
  118. package/src/lib/update-service.ts +23 -3
  119. package/.next/server/chunks/131.js +0 -1
  120. package/.next/server/chunks/243.js +0 -1
  121. package/.next/static/chunks/4686-e3825f3b6a384aa1.js +0 -1
  122. package/.next/static/chunks/839.7403c6bdace4c56c.js +0 -1
  123. package/.next/static/chunks/8552.6bfe3e101250b20f.js +0 -1
  124. package/.next/static/chunks/app/page-2e425ef83fba0782.js +0 -1
  125. package/.next/static/chunks/webpack-bd2b9202ecbcdcaa.js +0 -1
  126. package/.next/static/css/7391c42e1ae617f9.css +0 -1
  127. /package/.next/static/{JDGSR-TIbk9qZWcUNYIX3 → sNX5GQkOWuK5YEID1hT-C}/_buildManifest.js +0 -0
  128. /package/.next/static/{JDGSR-TIbk9qZWcUNYIX3 → sNX5GQkOWuK5YEID1hT-C}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- "use strict";exports.id=686,exports.ids=[686],exports.modules={3672:(a,b,c)=>{c.d(b,{H4:()=>e,Pn:()=>g,WZ:()=>h});var d=c(29296);function e(a){if(!a||"object"!=typeof a)return;let b={};return"number"==typeof a.input&&(b.input=a.input),"number"==typeof a.output&&(b.output=a.output),"number"==typeof a.cacheRead&&(b.cacheRead=a.cacheRead),"number"==typeof a.cacheWrite&&(b.cacheWrite=a.cacheWrite),Object.keys(b).length?b:void 0}function f(a){if(null==a)return"";if("string"==typeof a)return a;if(Array.isArray(a))return a.map(f).join("");if("object"==typeof a){if("string"==typeof a.text)return a.text;if("string"==typeof a.thinking)return a.thinking}return""}class g{constructor(a=[]){this.streamingStart=null,this.turnStartedAt=null,this.toolIndex=new Map,this.toolStart=new Map,this.pendingToolArgs=new Map,this.dirty=[],this.entries=a.map(a=>({...a})),this.nextSeq=Math.max(0,...this.entries.map(a=>a.seq))+1}push(a){let b={...a,seq:this.nextSeq++};return this.entries.push(b),this.dirty.push(b),b}touch(a){a&&!this.dirty.includes(a)&&this.dirty.push(a)}drainDirty(){let a=this.dirty;return this.dirty=[],a}onEvent(a,b=Date.now()){switch(a.type){case"turn_start":this.turnStartedAt=b;break;case"message_start":{let c=a.message;if(c?.role==="user")this.push({kind:"user",ts:c.timestamp??b,detail:f(c.content)});else if(c?.role==="assistant"){let a=this.turnStartedAt??b;this.turnStartedAt=null,this.streamingStart={seq:this.nextSeq,t0:a},this.push({kind:"message",ts:a,title:"assistant"})}else if(c?.role==="toolResult"){let a=c.toolCallId?this.toolIndex.get(c.toolCallId):void 0;if(void 0!==a){let b=this.entries[a],g=(0,d.R)(f(c.content));b.detail=g.text||b.detail,b.encodingLoss=g.encodingLoss||b.encodingLoss,b.isError=!0===c.isError,b.tokens=e(c.usage)??b.tokens,this.touch(b)}}break}case"message_update":{let c=a.assistantMessageEvent;if(!c)break;if(("text_delta"===c.type||"thinking_delta"===c.type)&&this.streamingStart&&void 0===this.streamingStart.firstToken){this.streamingStart.firstToken=b;let a=this.entries[this.entries.length-1];a?.kind==="message"&&(a.timing={...a.timing??{},ttftMs:b-this.streamingStart.t0},this.touch(a))}"toolcall_end"===c.type&&c.toolCall&&this.pendingToolArgs.set(c.toolCall.id,c.toolCall.arguments);break}case"message_end":{let c=a.message;if(c?.role==="assistant"){let a=this.entries[this.entries.length-1],d=a?.kind==="message"?a:this.push({kind:"message",ts:b});for(let a of(this.streamingStart&&(d.timing={...void 0===this.streamingStart.firstToken?{}:{ttftMs:this.streamingStart.firstToken-this.streamingStart.t0,decodeMs:b-this.streamingStart.firstToken},durationMs:b-this.streamingStart.t0}),d.tokens=e(c.usage),d.thinking=f((c.content??[]).filter(a=>"thinking"===a.type).map(a=>a.thinking)),d.detail=f((c.content??[]).filter(a=>"text"===a.type)),d.isError="error"===c.stopReason,"error"===c.stopReason&&(d.title="error"),this.touch(d),this.streamingStart=null,c.content??[]))"toolCall"===a.type&&(this.toolIndex.set(a.id,this.entries.length),this.push({kind:"tool",ts:b,toolName:a.name,toolCallId:a.id,title:a.name,detail:JSON.stringify(a.arguments??{},null,2)}))}break}case"tool_execution_start":{this.toolStart.set(a.toolCallId,b);let c=this.toolIndex.get(a.toolCallId);if(void 0===c)c=this.entries.length,this.toolIndex.set(a.toolCallId,c),this.push({kind:"tool",ts:b,toolName:a.toolName,toolCallId:a.toolCallId,title:a.toolName,detail:JSON.stringify(a.args??{},null,2)});else{let b=this.entries[c];b.detail=JSON.stringify(a.args??{},null,2),this.touch(b)}break}case"tool_execution_update":{let b=this.toolIndex.get(a.toolCallId);if(void 0!==b){let c=this.entries[b],e=(0,d.R)(f(a.partialResult));e.text&&(c.preview=e.text.slice(-2e3)),c.encodingLoss=e.encodingLoss||c.encodingLoss,this.touch(c)}break}case"tool_execution_end":{let c=this.toolIndex.get(a.toolCallId);if(void 0!==c){let e=this.entries[c],g=(0,d.R)(f(a.result));e.detail=[e.detail,g.text].filter(Boolean).join("\n\n---\n\n"),e.encodingLoss=g.encodingLoss||e.encodingLoss,e.isError=!0===a.isError;let h=this.toolStart.get(a.toolCallId);void 0!==h&&(e.timing={...e.timing??{},durationMs:b-h}),this.touch(e)}this.toolStart.delete(a.toolCallId);break}case"compaction_start":this.push({kind:"compacted",ts:b,title:`compact (${a.reason})`});break;case"compaction_end":{let b=[...this.entries].reverse().find(a=>"compacted"===a.kind);b&&(a.errorMessage&&(b.isError=!0,b.detail=a.errorMessage),a.result?.tokensBefore!=null&&(b.tokens={input:a.result.tokensBefore}),this.touch(b))}}}}function h(a){let b=[],c=1,g=a=>"number"==typeof a?.timestamp?a.timestamp:Date.now();for(let h of a)if("message"===h.type){let a=h.message;if(!a)continue;if("user"===a.role)b.push({seq:c++,kind:"user",ts:g(a),detail:f(a.content)});else if("assistant"===a.role){let d=f((a.content??[]).filter(a=>"thinking"===a.type)),h=f((a.content??[]).filter(a=>"text"===a.type));for(let f of(b.push({seq:c++,kind:"message",ts:g(a),title:"error"===a.stopReason?"error":"assistant",detail:h,thinking:d||void 0,tokens:e(a.usage),isError:"error"===a.stopReason||void 0}),a.content??[]))"toolCall"===f.type&&b.push({seq:c++,kind:"tool",ts:g(a),toolName:f.name,toolCallId:f.id,title:f.name,detail:JSON.stringify(f.arguments??{},null,2)})}else if("toolResult"===a.role){let c=b.findLast?.(b=>"tool"===b.kind&&(a.toolCallId?b.toolCallId===a.toolCallId:b.toolName===a.toolName));if(c){let b=(0,d.R)(f(a.content));c.detail=[c.detail,b.text].filter(Boolean).join("\n\n---\n\n"),c.encodingLoss=b.encodingLoss||c.encodingLoss,c.isError=!0===a.isError||void 0,c.tokens=e(a.usage)??c.tokens}}}else"compaction"===h.type?b.push({seq:c++,kind:"compacted",ts:g(h),title:"compact",tokens:null!=h.tokensBefore?{input:h.tokensBefore}:e(h.usage)}):"branch_summary"===h.type&&b.push({seq:c++,kind:"compacted",ts:g(h),title:"branch summary",tokens:e(h.usage),detail:h.summary});return b}},6896:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Iz:()=>E,JZ:()=>D,PY:()=>y,Tp:()=>z,XG:()=>G,X_:()=>J,cH:()=>B,qM:()=>A,qh:()=>H,r7:()=>F,vQ:()=>C});var e=c(51455),f=c.n(e),g=c(48161),h=c.n(g),i=c(76760),j=c.n(i),k=c(92584),l=c(31421),m=c(46193),n=c(87982),o=c(77598),p=c(49904),q=a([n]);function r(){return j().join((0,n.$M)(),"web-workspaces.json")}async function s(a=r()){try{let b=JSON.parse(await f().readFile(a,"utf8"));if(!b||"object"!=typeof b||Array.isArray(b))throw Error("invalid workspace registry");let c=Object.fromEntries(Object.entries("object"==typeof b.aliases&&null!==b.aliases?b.aliases:{}).filter(a=>"string"==typeof a[1])),d=Object.fromEntries(Object.entries("object"==typeof b.growthInit&&null!==b.growthInit?b.growthInit:{}).filter(a=>"boolean"==typeof a[1]));return{workspaces:Array.isArray(b.workspaces)?b.workspaces.filter(a=>"string"==typeof a):[],aliases:c,archivedSessions:Array.isArray(b.archivedSessions)?b.archivedSessions.filter(a=>"string"==typeof a):[],removedWorkspaces:Array.isArray(b.removedWorkspaces)?b.removedWorkspaces.filter(a=>"string"==typeof a):[],...Object.keys(d).length?{growthInit:d}:{}}}catch(a){if("ENOENT"!==a.code)throw a}return{workspaces:[],aliases:{},archivedSessions:[],removedWorkspaces:[]}}function t(a){let b=j().resolve(a);return"win32"===process.platform?b.toLowerCase():b}async function u(a,b){await f().mkdir(j().dirname(b),{recursive:!0});let c=`${b}.${(0,o.randomUUID)()}.tmp`;try{await f().writeFile(c,JSON.stringify(a,null,2),{encoding:"utf8",flag:"wx",mode:384}),await f().rename(c,b)}finally{await f().unlink(c).catch(()=>void 0)}}n=(q.then?(await q)():q)[0];let K=null;async function v(a){var b;let c;try{c=await f().stat(a)}catch(a){if("ENOENT"!==a.code)throw a;return K=null,{workspaces:[],aliases:{},archivedSessions:[],removedWorkspaces:[]}}let d=(b=c,`${b.mtimeMs}:${b.ctimeMs}:${b.size}:${b.ino}`);if(K&&K.path===a&&K.stamp===d)return K.data;let e=await s(a);return K={path:a,stamp:d,data:e},e}async function w(){return v(r())}async function x(a){let b=r();return(0,p.Ax)(b,()=>(0,p._i)(b,async()=>{try{return await a(await s(b),b)}finally{K=null}}))}async function y(){return(await w()).removedWorkspaces??[]}async function z(a,b){let c=t(j().resolve(a));return x(async(a,d)=>{for(let b of(a.aliases||(a.aliases={}),Object.keys(a.aliases)))b!==c&&t(b)===c&&delete a.aliases[b];return b.trim()?a.aliases[c]=b.trim():delete a.aliases[c],await u(a,d),a.aliases})}async function A(a){return(await w()).growthInit?.[t(a)]??null}async function B(a,b){let c=t(a);await x(async(a,d)=>{a.growthInit={...a.growthInit,[c]:b},await u(a,d)})}async function C(){let a=await w();return{workspaces:a.workspaces,aliases:a.aliases??{},archivedSessions:a.archivedSessions??[],removedWorkspaces:a.removedWorkspaces??[]}}async function D(a){let b=j().resolve(a),c=t(b);return x(async(a,d)=>(a.archivedSessions||(a.archivedSessions=[]),a.archivedSessions.some(a=>t(a)===c)||(a.archivedSessions.push(b),await u(a,d)),a.archivedSessions))}async function E(a){let b=j().resolve(a),c=t(b);return x(async(a,b)=>{let d=a.archivedSessions??[],e=d.filter(a=>t(a)!==c);return e.length!==d.length&&(a.archivedSessions=e,await u(a,b)),e})}async function F(a){let b=j().resolve(a),c=t(b);return x(async(a,d)=>{let e=!1;if(a.workspaces.some(a=>t(a)===c)||(a.workspaces.push(b),e=!0),a.removedWorkspaces){let b=a.removedWorkspaces.filter(a=>t(a)!==c);e||=b.length!==a.removedWorkspaces.length,a.removedWorkspaces=b}return e&&await u(a,d),{workspaces:a.workspaces,removedWorkspaces:a.removedWorkspaces??[]}})}async function G(a){let b=r(),c=await v(b),d=new Set((c.removedWorkspaces??[]).map(t)),e=new Set(c.workspaces.map(t)),f=!1;for(let b of a){if(!b||"string"!=typeof b)continue;let a=t(j().resolve(b));d.has(a)||e.has(a)||(e.add(a),f=!0)}return f?x(async(b,c)=>{let d=!1,e=new Set((b.removedWorkspaces??[]).map(t)),f=new Set(b.workspaces.map(t));for(let c of a){if(!c||"string"!=typeof c)continue;let a=j().resolve(c),g=t(a);e.has(g)||f.has(g)||(b.workspaces.push(a),f.add(g),d=!0)}return d&&await u(b,c),b.workspaces}):c.workspaces}async function H(a){let b=j().resolve(a),c=t(b);return x(async(a,d)=>{if(a.workspaces=a.workspaces.filter(a=>t(a)!==c),a.removedWorkspaces||(a.removedWorkspaces=[]),a.removedWorkspaces.some(a=>t(a)===c)||a.removedWorkspaces.push(b),a.aliases)for(let b of Object.keys(a.aliases))t(b)===c&&delete a.aliases[b];return await u(a,d),{workspaces:a.workspaces,removedWorkspaces:a.removedWorkspaces,aliases:a.aliases??{}}})}let L=!1;function I(a,b={}){let{timeoutMs:c=3e5,windowsHide:d=!1}=b;return new Promise((b,e)=>{let f,g=(0,l.spawn)(a[0],a.slice(1),{stdio:["ignore","pipe","pipe"],windowsHide:d}),h=new m.StringDecoder("utf8"),i="",j="",k=!1;g.stdout.on("data",a=>{i+=h.write(a)}),g.stderr.on("data",a=>{j=(j+a.toString("utf8")).slice(-1e3)});let n=!1,o=a=>{n||(n=!0,clearTimeout(f),k||(k=!0,i+=h.end()),a?e(a):b(i.trim()))};g.on("error",a=>o(a)),g.on("close",a=>o(0===a?void 0:Error(j||`folder picker exited with code ${a}`))),f=setTimeout(()=>{try{g.kill()}catch{}o(Error("folder picker timed out"))},c)})}async function J(){if(L)return{path:null,canceled:!0};L=!0;try{if("win32"===process.platform){let a=j().join(k.V,"scripts","pick-folder.ps1"),b=await I(["powershell.exe","-NoProfile","-STA","-ExecutionPolicy","Bypass","-File",a,"选择工作区文件夹"],{windowsHide:!0});return b?{path:b,canceled:!1}:{path:null,canceled:!0}}if("darwin"===process.platform){let a=await I(["osascript","-e",'POSIX path of (choose folder with prompt "选择工作区文件夹")']),b=function(a){let b=a.trim();if((b=b.replace(/^alias\s+/i,"").replace(/^"(.*)"$/s,"$1")).startsWith("/"))return b.replace(/\\(.)/g,"$1");if(/^[A-Za-z][A-Za-z0-9 ]*:(.+)$/.test(b)){let a=b.slice(b.indexOf(":")+1);return`/${a.split(":").filter(Boolean).join("/")}`}return b}(a);return b?{path:b,canceled:!1}:{path:null,canceled:!0}}for(let a of[["zenity","--file-selection","--directory","--title=选择工作区文件夹"],["kdialog","--getexistingdirectory",`${h().homedir()}`,"--title","选择工作区文件夹"]])try{let b=await I(a);return b?{path:b,canceled:!1}:{path:null,canceled:!0}}catch(a){if(a instanceof Error&&/ENOENT|not found|not recognized/i.test(a.message))continue;if(/exited with code (1|5)$/.test(a instanceof Error?a.message:String(a)))return{path:null,canceled:!0};throw a}throw Error("no folder picker available: install zenity or kdialog, or type the path manually")}finally{L=!1}}d()}catch(a){d(a)}})},14719:(a,b,c)=>{c.d(b,{X:()=>e});var d=c(77598);function e(a){let b=new Map,c=new Map,e=!1,f=(c,f,g,h)=>{if(e||!a.hasViewers()||f?.signal?.aborted)return Promise.resolve(g);let i=(0,d.randomUUID)();return new Promise(d=>{let e=c=>{let e=b.get(i);e&&(b.delete(i),e.timer&&clearTimeout(e.timer),e.removeAbortListener?.(),a.publish({type:"extension_ui_resolved",id:i,ts:Date.now()}),d(c?h(c):g))},j={type:"extension_ui",id:i,...c,timeout:f?.timeout,ts:Date.now()},k={request:j,resolve:a=>e(a)};k.timer=setTimeout(()=>e(null),f?.timeout??6e5),k.timer.unref?.();let l=()=>e(null);f?.signal?.addEventListener("abort",l,{once:!0}),k.removeAbortListener=()=>f?.signal?.removeEventListener("abort",l),b.set(i,k),a.publish(j)})};return{uiContext:{select:(a,b,c)=>f({method:"select",title:a,options:b},c,void 0,a=>a.cancelled?void 0:a.value),confirm:(a,b,c)=>f({method:"confirm",title:a,message:b},c,!1,a=>!a.cancelled&&!0===a.confirmed),input:(a,b,c)=>f({method:"input",title:a,placeholder:b},c,void 0,a=>a.cancelled?void 0:a.value),notify:(b,c)=>{a.publish({type:"extension_ui",id:(0,d.randomUUID)(),method:"notify",message:b,notifyType:c??"info",ts:Date.now()})},setStatus:(b,e)=>{void 0===e?c.delete(b):c.set(b,e),a.publish({type:"extension_ui",id:(0,d.randomUUID)(),method:"setStatus",statusKey:b,statusText:e,ts:Date.now()})},setWorkingMessage:b=>{a.publish({type:"extension_ui",id:(0,d.randomUUID)(),method:"setWorkingMessage",message:b,ts:Date.now()})},onTerminalInput:()=>()=>{},setWorkingVisible:()=>{},setWorkingIndicator:()=>{},setHiddenThinkingLabel:()=>{},setWidget:()=>{},setFooter:()=>{},setHeader:()=>{},setTitle:()=>{},custom:async()=>void 0,pasteToEditor:()=>{},setEditorText:()=>{},getEditorText:()=>"",editor:async()=>void 0,addAutocompleteProvider:()=>{},setEditorComponent:()=>{},getEditorComponent:()=>void 0,getAllThemes:()=>[],getTheme:()=>void 0,setTheme:()=>{},getToolsExpanded:()=>!1,setToolsExpanded:()=>{}},statuses:c,getPendingRequests:()=>[...b.values()].map(({request:a})=>({...a,options:a.options?[...a.options]:void 0})),respond(a,c){let d=b.get(a);return!!d&&(d.resolve(c),!0)},dispose(){for(let a of(e=!0,b.values()))a.resolve({cancelled:!0});b.clear()}}}},28686:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{B1:()=>al,H$:()=>x,Hx:()=>ad,Lf:()=>P,Lz:()=>ak,PO:()=>aj,Rq:()=>ar,SG:()=>Q,Sj:()=>ah,al:()=>am,bS:()=>M,g7:()=>ap,lX:()=>aq,mk:()=>N,tX:()=>ai,vJ:()=>as});var e=c(73024),f=c(77598),g=c(76760),h=c.n(g),i=c(75430),j=c(87982),k=c(14719),l=c(35851),m=c(34007),n=c(3672),o=c(31374),p=c(29296),q=c(62433),r=c(34070),s=c(75554),t=c(6896),u=c(6512),v=a([i,j,o,q,s,t]);[i,j,o,q,s,t]=v.then?(await v)():v;let at=globalThis,au=at.__piWebSessions??=new Map;function w(a){if(null==a)return"";if("string"==typeof a)return a;if(Array.isArray(a))return a.map(w).join("");if("object"==typeof a){if("string"==typeof a.text)return a.text;if("string"==typeof a.thinking)return a.thinking}return""}function x(a,b){if(!a||"object"!=typeof a)return{role:"other",content:[]};let c={role:"other",content:[]};b?c.id=b:"string"==typeof a.id&&(c.id=a.id),"number"==typeof a.timestamp&&(c.timestamp=a.timestamp);let d=[];for(let b of Array.isArray(a.content)?a.content:"string"==typeof a.content?[{type:"text",text:a.content}]:[])b&&"object"==typeof b&&("text"===b.type&&"string"==typeof b.text?d.push({type:"text",text:b.text}):"thinking"===b.type&&"string"==typeof b.thinking?d.push({type:"thinking",thinking:b.thinking}):"toolCall"===b.type?d.push({type:"toolCall",id:String(b.id??""),name:String(b.name??""),arguments:b.arguments}):"image"===b.type&&"string"==typeof b.data&&"string"==typeof b.mimeType&&d.push({type:"image",data:b.data,mimeType:b.mimeType}));if(c.content=d,"user"===a.role)c.role="user";else if("assistant"===a.role)c.role="assistant",c.stopReason=a.stopReason,c.errorMessage=a.errorMessage??void 0,c.usage=(0,n.H4)(a.usage),a.usage?.cost?.total!=null&&(c.usage={...c.usage,cost:{total:a.usage.cost.total}}),c.model="string"==typeof a.model?a.model:void 0,c.provider="string"==typeof a.provider?a.provider:void 0;else if("toolResult"===a.role){c.role="toolResult";let b=(0,p.R)(w(a.content));c.content=[{type:"toolResult",toolCallId:a.toolCallId,text:b.text,isError:!0===a.isError,encodingLoss:b.encodingLoss||void 0,patch:z(a.details)}]}return c}let av=new WeakMap;function y(a,b){return{...x(b,function(a,b){if(!b||"object"!=typeof b)return;let c=a.getEntryCount,d=c?null:a.getEntries(),e=c?c.call(a):d.length,f=av.get(a);if(!f||f.count!==e){for(let b of(f={count:e,ids:new WeakMap},d??a.getEntries()))b?.type==="message"&&b.message&&"object"==typeof b.message&&f.ids.set(b.message,b.id);av.set(a,f)}return f.ids.get(b)}(a.sm,b)),streamId:function(a,b){if(!b||"object"!=typeof b)return;a.messageIds??=new WeakMap;let c=a.messageIds.get(b);return c||(c=(0,f.randomUUID)(),a.messageIds.set(b,c)),c}(a,b)}}function z(a){let b=a?.patch;return"string"==typeof b&&b.trim()?b.slice(0,6e4):void 0}let aw=new Map;function A(a){return{target:"string"==typeof a?.path?a.path:"string"==typeof a?.file_path?a.file_path:"",content:"string"==typeof a?.content?a.content:void 0}}function B(a){if(null!=a){if("string"==typeof a)return a.slice(-4e3);if(Array.isArray(a))return a.map(w).join("").slice(-4e3)||void 0;if("object"==typeof a){let b=w(a.content);if(b)return b.slice(-4e3);try{return JSON.stringify(a).slice(-4e3)}catch{}}}}let ax=new WeakMap;function C(a){let b=ax.get(a);if(b){for(;b.length>0&&null!==b[0].events;)for(let c of b.shift().events)D(a,c);0===b.length&&ax.delete(a)}}function D(a,b){if(a.disposed)return;a.seq+=1;let c=JSON.stringify(b);for(let b of(a.buffer.push({seq:a.seq,json:c}),a.buffer.length>400&&a.buffer.shift(),a.subscribers))try{b(a.seq,c)}catch{a.subscribers.delete(b)}}function E(a,b){let c=ax.get(a);if(!c)return D(a,b);c.push({events:[b]}),C(a)}function F(a,b){let c=b.model;E(a,{type:"model",provider:c?String(c.provider??""):void 0,model:c?String(c.id??""):void 0,thinkingLevel:String(b.thinkingLevel??""),thinkingLevels:b.getAvailableThinkingLevels(),ts:Date.now()})}function G(a,b){if(!a.desiredThinkingLevel)return;let c=(0,u.Kt)(b.model,a.desiredThinkingLevel);c!==b.thinkingLevel&&b.setThinkingLevel(c)}function H(a){let b=0,c=0,d=0,e=0,f=0,g=0;for(let h of a.ledger.entries){if("tool"===h.kind){c+=Math.max(0,h.timing?.durationMs??0);continue}"message"===h.kind&&(b+=Math.max(0,h.timing?.durationMs??0),h.timing?.ttftMs!==void 0&&(d+=Math.max(0,h.timing.ttftMs),e+=1),h.timing?.decodeMs!==void 0&&h.tokens?.output!==void 0&&(f+=Math.max(0,h.timing.decodeMs),g+=Math.max(0,h.tokens.output)))}return{llmMs:b,toolMs:c,ttftMs:d,ttftSteps:e,decodeMs:f,decodeTokens:g}}function I(a){if(!a.session)return null;try{let b=a.session.getSessionStats();return{userMessages:b.userMessages,assistantMessages:b.assistantMessages,toolCalls:b.toolCalls,totalMessages:b.totalMessages,tokens:b.tokens,cost:b.cost,...H(a)}}catch{return null}}function J(a){if(!a.session)return null;let b=I(a),c=a.session.getContextUsage()??null;return{type:"usage",stats:b,contextUsage:c?{tokens:c.tokens,contextWindow:c.contextWindow,percent:c.percent}:null,ts:Date.now()}}function K(a){let b=J(a);b&&E(a,b)}function L(a){return a.growth&&a.growth.version!==l.I&&(a.growth.dispose(),a.growth=null),a.growth??=(0,l.k)({cwd:a.cwd,sessionPath:a.sessionPath,publish:b=>E(a,b),entries:()=>a.sm.getEntries(),consent:()=>(0,t.qM)(a.cwd).catch(()=>null)})}async function M(a){return O(a),L(a).recordNow()}async function N(a,b){O(a),await (0,t.cH)(a.cwd,b);let c=a=>"win32"===process.platform?h().resolve(a).toLowerCase():h().resolve(a);for(let d of au.values())d!==a&&d.growth?.getConsentRequest()&&c(d.cwd)===c(a.cwd)&&d.growth.consentAnswered(b).catch(()=>void 0);return L(a).consentAnswered(b)}function O(a){a.lastActive=Date.now()}let ay=new Set;function P(a){for(let b of a){if(!b||ay.size>=2)return;let a="win32"===process.platform?b.toLowerCase():b;!ay.has(a)&&(ay.add(a),(0,j.v9)(b)||(0,j.Df)(b).catch(()=>void 0))}}function Q(a){let b=au.get(a);if(!b){if(!(0,e.existsSync)(a))throw new q.BV("session not found");let c=(0,j.G1)(a);b=R(a,c.getCwd()||process.cwd(),c)}return O(b),b}function R(a,b,c){let d=[];try{d=(0,n.WZ)(c.getEntries())}catch{}let e={sessionPath:a,cwd:b,sm:c,session:null,creating:null,subscribers:new Set,buffer:[],seq:0,epoch:(0,f.randomUUID)().replace(/-/g,"").slice(0,12),inflight:null,ui:null,growth:null,ledger:new n.Pn(d),lastActive:Date.now(),toolPreset:"readonly",requestedTools:new Set,resourceVersion:0,resourceReloadPending:!1,resourceReloading:!1,promptSubmitting:!1,runActive:!1,disposed:!1,messageIds:new WeakMap};return au.set(a,e),e}function S(a,b=(0,j.ye)(a)){let c=b.getAgentsFiles().agentsFiles.map(a=>({path:a.path,content:a.content,source:"project"})),d=b.getAppendSystemPrompt(),e=b.getAppendSystemPromptSources();return[...c,...d.map((a,b)=>({path:e[b]?.path??`Appended system prompt ${b+1}`,content:a,source:"extension"}))]}async function T(a,b,c){let d={systemPrompt:0,systemTools:0,customTools:0,memory:0,skills:0,compacted:0,autoCompactBuffer:0};if(!b)return d;try{let a=b.systemPrompt??"",f=c.filter(a=>"project"===a.source).map(a=>a.content).join("\n\n");d.memory=(0,r.ec)(f);try{let{skills:c}=b.resourceLoader.getSkills();if(c.length&&a){let b=a.indexOf("The following skills provide specialized instructions"),c=a.indexOf("</available_skills>");b>=0&&c>b&&(d.skills=(0,r.ec)(a.slice(b,c+19)))}}catch{}let g=d.memory+d.skills;d.systemPrompt=Math.max(0,(0,r.ec)(a)-g);try{for(let a of b.getAllTools()){let b=(0,r.ec)(JSON.stringify({name:a.name,description:a.description,parameters:a.parameters,promptGuidelines:a.promptGuidelines}));a.sourceInfo?.source==="builtin"?d.systemTools+=b:d.customTools+=b}}catch{}try{var e;let a=(e=b,e.sm?.getEntries?.()??e.sessionManager?.getEntries?.()??[]);for(let b=a.length-1;b>=0;b-=1){let c=a[b];if(c?.type==="compaction"&&"string"==typeof c.summary){d.compacted=(0,r.ec)(c.summary);break}}}catch{}try{let a=await (0,s.J0)();a.compaction.enabled&&(d.autoCompactBuffer=a.compaction.reserveTokens)}catch{}}catch{}return d}function U(a,b,c){let d=a.ledger.entries[0]?.ts??Date.now(),e=[];b?.systemPrompt&&e.push({seq:-1,kind:"system",ts:d,title:"Initial System Prompt",detail:b.systemPrompt});try{(c??S(a.cwd,a.session?.resourceLoader)).forEach((a,b)=>e.push({seq:-2-b,kind:"context",ts:d,title:a.path,detail:a.content}))}catch{}return e}function V(a,b){for(let c of U(a,b))E(a,{type:"traj",entry:c,ts:Date.now()})}async function W(a){if(a.disposed)throw Error("session is disposed");return a.creating?a.creating:a.session?a.session:(a.creating=(async()=>{let b;await (0,j.Df)(a.cwd);let c=await (0,j.Yb)(a.cwd);try{var d,f;let g,l;if(a.disposed)throw Error("session is disposed");let{session:m}=await (0,j.az)({cwd:a.cwd,agentDir:(0,j.$M)(),sessionManager:a.sm,modelRuntime:await (0,j.uU)(),resourceLoader:c,settingsManager:(0,j.vT)(a.cwd)});if(b=m,a.disposed)throw Error("session is disposed");a.session=m,a.requestedTools=new Set(m.getActiveToolNames()),d=a,g=(f=m).setActiveToolsByName.bind(f),az.set(f,g),f.setActiveToolsByName=a=>{let b=[...new Set(a)];for(let a of ab(f))b.includes(a)||d.requestedTools.delete(a);for(let a of b)d.requestedTools.add(a);let c=Y(d,f);g(b.filter(a=>c.includes(a)))},l=f.reload.bind(f),f.reload=async a=>{if(d.disposed)throw Error("session is disposed");if(X(d))throw Error("session is busy");d.resourceReloading=!0;try{await (0,j.YW)(async()=>{if(d.disposed||d.runActive||!f.isIdle)throw Error("session is busy");await l({beforeSessionStart:async()=>{for(let a of ab(f))d.requestedTools.add(a);Z(d,f),await a?.beforeSessionStart?.(),Z(d,f)}})}),d.resourceVersion=(0,j.Ec)(d.cwd)}finally{Z(d,f),d.resourceReloading=!1,d.disposed||(_(d,f),V(d,f),af(d))}},Z(a,m),m.subscribe(b=>{a.disposed||function(a,b){a.ledger.onEvent(b),L(a).onEvent(b);let c=Date.now();switch(b.type){case"message_start":{let d=b.message,e=y(a,d);"assistant"===e.role&&(a.inflight=d,a.inflightId=e.streamId,a.inflightIndex=a.session?.messages.length,e.stopReason="pending",e.content=e.content.map(a=>"text"===a.type?{...a,text:""}:"thinking"===a.type?{...a,thinking:""}:a)),("user"===e.role||"assistant"===e.role)&&E(a,{type:"message",message:e,phase:"start",ts:c});break}case"message_update":{let d=b.assistantMessageEvent;if(b.message&&(a.inflight=b.message,a.inflightId&&a.messageIds.set(b.message,a.inflightId)),!d)break;"text_delta"===d.type&&"string"==typeof d.delta?E(a,{type:"delta",kind:"text",contentIndex:d.contentIndex,delta:d.delta,messageId:a.inflightId,ts:c}):"thinking_delta"===d.type&&"string"==typeof d.delta&&E(a,{type:"delta",kind:"thinking",contentIndex:d.contentIndex,delta:d.delta,messageId:a.inflightId,ts:c});break}case"message_end":{let d,e,f=b.message;f?.role==="assistant"&&(a.inflightId&&a.messageIds.set(f,a.inflightId),a.inflight=null,a.inflightId=void 0,a.inflightIndex=void 0),d=ax.get(a)??[],e={events:null},d.push(e),ax.set(a,d),queueMicrotask(()=>{e.events=(()=>{let b=y(a,f);"assistant"===b.role&&(b.endedAt=c);let d=J(a);return d?[{type:"message",message:b,phase:"end",ts:c},d]:[{type:"message",message:b,phase:"end",ts:c}]})(),C(a)});break}case"tool_execution_start":b.toolName?.toLowerCase()==="write"&&function(a,b,c,d){let{target:f}=A(d);if(f)try{let d=h().isAbsolute(f)?f:h().resolve(a,f),g=(0,e.statSync)(d);if(!g.isFile()||g.size>524288)return;let i=(0,e.readFileSync)(d,"utf8");if(i.includes("\0"))return;aw.size>=256&&aw.delete(aw.keys().next().value),aw.set(`${b}\u0000${c}`,i)}catch{}}(a.cwd,a.sessionPath,b.toolCallId,b.args),E(a,{type:"tool",id:b.toolCallId,name:b.toolName,args:b.args,state:"running",ts:c});break;case"tool_execution_update":{let d=(0,p.R)(B(b.partialResult)??"");E(a,{type:"tool",id:b.toolCallId,name:b.toolName,state:"running",partialResult:d.text||void 0,encodingLoss:d.encodingLoss||void 0,ts:c});break}case"tool_execution_end":{let d=(0,p.R)(B(b.result)??"");E(a,{type:"tool",id:b.toolCallId,name:b.toolName,args:b.args,state:"done",result:d.text||void 0,isError:b.isError,encodingLoss:d.encodingLoss||void 0,patch:z(b.result?.details)??(b.toolName?.toLowerCase()==="write"?function(a,b,c,d){let e=`${b}\u0000${c}`,f=aw.get(e);if(aw.delete(e),void 0===f)return;let{target:g,content:h}=A(d);if(void 0!==h&&h!==f)try{return(0,i.generateUnifiedPatch)(g,f,h).slice(0,6e4)}catch{return}}(a.cwd,a.sessionPath,b.toolCallId,b.args):void 0),ts:c}),K(a);break}case"agent_start":a.runActive=!0,E(a,{type:"status",isStreaming:!0,state:"running",ts:c});break;case"agent_end":K(a);break;case"agent_settled":a.runActive=!1,E(a,{type:"status",isStreaming:!1,state:"idle",ts:c}),K(a),a.resourceReloadPending&&queueMicrotask(()=>void ag(a));break;case"queue_update":E(a,{type:"queue",steering:[...b.steering],followUp:[...b.followUp],ts:c});break;case"compaction_start":E(a,{type:"status",isStreaming:!0,state:"compacting",ts:c}),E(a,{type:"compaction",phase:"start",reason:b.reason,ts:c});break;case"compaction_end":E(a,{type:"compaction",phase:"end",reason:b.reason,errorMessage:b.errorMessage,ts:c}),K(a),"manual"===b.reason&&(E(a,{type:"status",isStreaming:X(a),state:X(a)?"running":"idle",ts:c}),a.resourceReloadPending&&queueMicrotask(()=>void ag(a)));break;case"session_info_changed":E(a,{type:"name",name:b.name??"",ts:c});break;case"thinking_level_changed":a.session?F(a,a.session):E(a,{type:"model",thinkingLevel:b.level,ts:c});break;case"auto_retry_start":E(a,{type:"retry",attempt:Number(b.attempt)||0,maxAttempts:Number(b.maxAttempts)||0,message:String(b.errorMessage??""),ts:c})}for(let b of a.ledger.drainDirty())E(a,{type:"traj",entry:b,ts:Date.now()})}(a,b)});let n=(0,k.X)({publish:b=>E(a,b),hasViewers:()=>!a.disposed&&a.subscribers.size>0});if(a.ui=n,await m.bindExtensions({mode:"rpc",uiContext:n.uiContext,onError:b=>{E(a,{type:"error",message:`扩展 ${b.extensionPath.split(/[\\/]/).pop()} 在 ${b.event} 出错:${b.error}`,ts:Date.now()})},abortHandler:()=>void m.abort().catch(()=>void 0)}),a.disposed)throw Error("session is disposed");return Z(a,m),a.resourceVersion=(0,j.Ec)(a.cwd),V(a,m),_(a,m),af(a),K(a),m}catch(e){a.ui?.dispose(),a.ui=null;let d=c.getExtensions().runtime;throw b?$(b).finally(()=>d.invalidate()):d.invalidate(),a.session=null,e}})().catch(b=>{throw a.disposed||E(a,{type:"error",message:String(b?.message??b),ts:Date.now()}),b}).finally(()=>{a.creating=null}),a.creating)}function X(a){return a.promptSubmitting||a.resourceReloading||a.runActive||!!(a.session&&!a.session.isIdle)}function Y(a,b){let c=a.customActiveTools;return aa(b).filter(b=>c?c.includes(b):(0,j.YQ)(a.toolPreset,b))}let az=new WeakMap;function Z(a,b){let c=function(a,b){let c=Y(a,b);if(a.customActiveTools)return c;let d=new Set(b.getAllTools().filter(a=>("direct"===a.exposure||"model-only"===a.exposure)&&b.getToolDefinition(a.name)?.defaultActive!==!1).map(a=>a.name));return c.filter(b=>d.has(b)||a.requestedTools.has(b))}(a,b);(az.get(b)??b.setActiveToolsByName.bind(b))(c)}let aA=new WeakMap;function $(a){let b,c=aA.get(a);if(c)return c;try{a.agent.abort()}catch{}let d=Promise.resolve();try{let b=a.extensionRunner;b.hasHandlers("session_shutdown")&&(d=b.emit({type:"session_shutdown",reason:"quit"}))}catch{}let e=new Promise(a=>{b=setTimeout(a,5e3),b.unref?.()}),f=Promise.race([d.then(()=>void 0,()=>void 0),e]).finally(()=>{clearTimeout(b);try{a.dispose()}catch{}});return aA.set(a,f),f}function _(a,b){E(a,{type:"tools",active:ab(b),all:aa(b),toolPreset:a.toolPreset,customActiveTools:a.customActiveTools??null,ts:Date.now()})}function aa(a){let b=a.getAllTools?.();return b?b.map(a=>a.name):[]}function ab(a){return a.getActiveToolNames?.()??[]}function ac(a){if(!a.disposed){for(let b of(a.disposed=!0,a.ui?.dispose(),a.ui=null,a.growth?.dispose(),a.growth=null,a.session&&$(a.session),a.creating&&a.creating.then(a=>a?$(a):void 0).catch(()=>void 0),a.subscribers))try{b(a.seq,JSON.stringify({type:"status",isStreaming:!1,state:"disposed",ts:Date.now()}))}catch{}a.subscribers.clear(),au.delete(a.sessionPath)}}async function ad(a){let b=au.get(a);if(!b)return;let c=b.session??(b.creating?await b.creating.catch(()=>null):null);c?.isStreaming&&await c.abort().catch(()=>void 0),ac(b)}{let a=globalThis;a.__piWebReaper&&clearInterval(a.__piWebReaper),a.__piWebReaper=setInterval(function(){let a=Date.now();for(let b of[...au.values()])!(b.subscribers.size>0)&&!(a-b.lastActive<=6e5)&&(b.creating||X(b)||ac(b));let b=[...au.values()].filter(a=>a.session);if(b.length>6)for(let a of b.filter(a=>!a.creating&&!X(a)&&0===a.subscribers.size).sort((a,b)=>a.lastActive-b.lastActive).slice(0,b.length-6))ac(a)},6e4),a.__piWebReaper.unref?.()}function ae(a){let b=a.session?.resourceLoader??(0,j.v9)(a.cwd)??(0,j.ye)(a.cwd),c=[],d=[];try{let a=b.getSkills();for(let b of(d=a.skills.map(a=>({name:String(a.name??""),description:String(a.description??"")})),a.diagnostics??[]))c.push({kind:"skill",path:b.path,message:b.message})}catch{d=[]}let e=[];try{let a=b.getPrompts();for(let b of(e=a.prompts.map(a=>({name:String(a.name??""),description:String(a.description??""),argumentHint:a.argumentHint})),a.diagnostics??[]))c.push({kind:"prompt",path:b.path,message:b.message})}catch{e=[]}try{for(let a of b.getExtensions().errors??[])c.push({kind:"extension",path:a.path,message:a.error})}catch{}let f=[];if(a.session)try{let b=a.session.extensionRunner;if(b)for(let a of(f=b.getRegisteredCommands().map(a=>({name:a.invocationName,description:String(a.description??""),source:String(a.sourceInfo?.path??"").split(/[\\/]/).pop()??""})),b.getCommandDiagnostics()??[]))c.push({kind:"command",path:a.path,message:a.message})}catch{f=[]}return{skills:d,promptTemplates:e,extensionCommands:f,projectTrust:(0,j.af)(a.cwd),resourceDiagnostics:c}}function af(a){E(a,{type:"resources",...ae(a),ts:Date.now()})}async function ag(a){if(a.disposed||!a.session||a.creating||X(a))return!1;a.resourceReloadPending=!1;try{await a.session.reload();let b=a.session.model,c=b&&a.session.modelRuntime.getModel(b.provider,b.id);return c&&c!==b&&(a.session.agent.state.model=c),!0}catch(b){return E(a,{type:"error",message:`重载扩展失败:${String(b?.message??b)}`,ts:Date.now()}),!1}finally{a.resourceReloadPending&&!X(a)&&queueMicrotask(()=>void ag(a))}}async function ah(a){let b=a=>"win32"===process.platform?a.replace(/\\/g,"/").toLowerCase():a.replace(/\\/g,"/"),c=0;for(let d of au.values())if(!a||b(d.cwd)===b(a)){if(!d.session){d.subscribers.size>0&&af(d);continue}if(d.creating||X(d)){d.resourceReloadPending=!0,E(d,{type:"error",message:"资源已更新,将在本轮结束后生效",ts:Date.now()}),af(d);continue}await ag(d)&&(c+=1)}return c}async function ai(a){let b,c,d,e;O(a),await (0,j.Df)(a.cwd);try{a.session&&X(a)?((0,j.Dc)(a.cwd)||a.resourceVersion!==(0,j.Ec)(a.cwd))&&(a.resourceReloadPending=!0):(await (0,j.jz)(a.cwd),a.session&&(a.resourceReloadPending||a.resourceVersion!==(0,j.Ec)(a.cwd))&&(a.resourceReloadPending=!0,await ag(a)))}catch{}let f=a.session,g=[],h=!1,i=["off","minimal","low","medium","high","xhigh","max"];if(f){let e=function(a,b){if(!a.inflightId||void 0===a.inflightIndex)return!1;let c=b.messages[a.inflightIndex];return!!c&&"assistant"===c.role&&(a.messageIds.set(c,a.inflightId),!0)}(a,f);if(g=f.messages.map(b=>y(a,b)),!e&&a.inflight){let b=y(a,a.inflight);"assistant"===b.role&&g.push({...b,stopReason:"pending"})}b=a.seq;let j=f.model;j&&(c={provider:String(j.provider??""),id:String(j.id??""),name:String(j.name??j.id??"")}),d=String(f.thinkingLevel??"");try{i=f.getAvailableThinkingLevels()}catch{}h=X(a)}else{try{g=a.sm.buildContextEntries().filter(a=>"message"===a.type&&a.message).map(a=>x(a.message,a.id))}catch{g=[]}try{let b=a.sm,e=b.buildSessionContext?.();if(e?.model&&(c={provider:e.model.provider,id:e.model.modelId,name:e.model.modelId}),d=e?.thinkingLevel,e?.model){let a=(await (0,j.uU)()).getModel(e.model.provider,e.model.modelId);a&&(i=(0,u.W8)(a),d&&(d=(0,u.Kt)(a,d)))}}catch{}}let k=f?I(a):function(a){let b=0,c=0,d=0,e=0,f={input:0,output:0,cacheRead:0,cacheWrite:0,total:0},g=0,h=a=>{a&&"object"==typeof a&&(f.input+=Number(a.input??0),f.output+=Number(a.output??0),f.cacheRead+=Number(a.cacheRead??0),f.cacheWrite+=Number(a.cacheWrite??0),g+=Number(a.cost?.total??0))};for(let f of a.sm.getEntries()){if(("branch_summary"===f.type||"compaction"===f.type)&&f.usage&&h(f.usage),"message"!==f.type||!f.message)continue;e+=1;let a=f.message;"user"===a.role?b+=1:"assistant"===a.role?(c+=1,d+=Array.isArray(a.content)?a.content.filter(a=>a?.type==="toolCall").length:0,h(a.usage)):"toolResult"===a.role&&h(a.usage)}return f.total=f.input+f.output+f.cacheRead+f.cacheWrite,{userMessages:b,assistantMessages:c,toolCalls:d,totalMessages:e,tokens:f,cost:g,...H(a)}}(a),l=null;if(f){let a=f.getContextUsage()??null;l=a?{tokens:a.tokens,contextWindow:a.contextWindow,percent:a.percent}:null}else if(c)try{let b=(await (0,j.uU)()).getModels(c.provider).find(a=>String(a.id)===c.id),d=Number(b?.contextWindow??0),e=0,f=a.sm.getEntries(),h=!1;for(let a=f.length-1;a>=0;a--){let b=f[a];if("compaction"===b.type||"branch_summary"===b.type){h=!0;break}if("message"===b.type&&b.message?.role==="assistant"&&"error"!==b.message.stopReason&&"aborted"!==b.message.stopReason)break}for(let a=g.length-1;a>=0&&!h;a--){let b=g[a];if("assistant"===b.role&&b.usage){e=Number(b.usage.input??0)+Number(b.usage.cacheRead??0)+Number(b.usage.cacheWrite??0)+Number(b.usage.output??0);break}}d>0&&e>0?l={tokens:e,contextWindow:d,percent:e/d*100}:d>0&&(l={tokens:null,contextWindow:d,percent:null})}catch{}let o=f?{active:ab(f),all:aa(f).map(a=>({name:a}))}:{active:[],all:[]},p=f?{steering:[...f.getSteeringMessages()],followUp:[...f.getFollowUpMessages()]}:{steering:[],followUp:[]},q="";try{q=a.sm.getSessionName?.()??""}catch{q=""}let r=[],s=!1;try{r=S(a.cwd,a.session?.resourceLoader),s=!0}catch{r=[]}try{e=await T(a.cwd,a.session,r)}catch{e=void 0}let t=ae(a),v=a.ledger.entries.length?a.ledger.entries:function(a){try{return(0,n.WZ)(a.sm.getEntries())}catch{return[]}}(a),w=[...U(a,f,s?r:void 0),...v];return{seq:b??a.seq,sessionPath:a.sessionPath,cwd:a.cwd,name:q,contextFiles:r.map(a=>a.path),contextResources:r,contextBreakdown:e,...t,messages:g,userTurns:(0,m.g)(a.sm.getEntries()),growthError:a.growth?.getError?.()??null,growthConsent:a.growth?.getConsentRequest?.()??null,model:c,thinkingLevel:d,thinkingLevels:i,toolPreset:a.toolPreset,customActiveTools:a.customActiveTools??null,extensionUiRequests:a.ui?.getPendingRequests()??[],extensionStatuses:Object.fromEntries(a.ui?.statuses??[]),tools:o,stats:k,contextUsage:l,queue:p,trajectory:w,isStreaming:h}}function aj(a,b){return`${a.epoch}.${b}`}function ak(a,b){let c=/^([A-Za-z0-9]+)\.(\d+)$/.exec(b?.trim()??"");if(!c||c[1]!==a.epoch)return;let d=Number(c[2]);return Number.isSafeInteger(d)?d:void 0}function al(a,b,c){if(O(a),c<0||c>a.seq)return!1;let d=a.buffer.filter(a=>a.seq>c);if(d.length!==a.seq-c)return!1;let e=new Set(a.ui?.getPendingRequests().map(a=>a.id));if(d.some(a=>{let b=JSON.parse(a.json);return"extension_ui"===b.type&&["select","confirm","input"].includes(b.method)&&!e.has(b.id)}))return!1;for(let c of(a.subscribers.add(b),d))b(c.seq,c.json);return!0}function am(a,b){a.subscribers.delete(b)}async function an(a){await Promise.race([L(a).prepare().catch(()=>void 0),new Promise(a=>setTimeout(a,5e3))])}function ao(a,b,c,d={}){return new Promise(e=>{let f=!1;b.prompt(c,{...d,source:"rpc",preflightResult:a=>{a&&(f=!0,e({ok:!0,data:{accepted:!0}}))}}).then(()=>{f||e({ok:!1,error:"prompt completed without acceptance"})},b=>{let c=String(b?.message??b);f?E(a,{type:"error",message:c,ts:Date.now()}):e({ok:!1,error:c})})})}async function ap(a,b){O(a);try{switch(b.cmd){case"prepare":return await W(a),{ok:!0};case"prompt":{let c=(b.text??"").trim();if(!c&&!b.images?.length)return{ok:!1,error:"empty prompt"};if(a.promptSubmitting||a.resourceReloading)return{ok:!1,error:"session is busy accepting another command"};a.promptSubmitting=!0;try{let d=await W(a);if(a.disposed)throw Error("session is disposed");if((d.isStreaming||a.runActive)&&!b.behavior)return{ok:!1,error:"session is busy; choose steer or followUp"};if(d.isStreaming||await an(a),a.disposed)throw Error("session is disposed");return await ao(a,d,c,{images:b.images,streamingBehavior:b.behavior})}finally{a.promptSubmitting=!1,a.disposed||E(a,{type:"status",isStreaming:X(a),state:X(a)?"running":"idle",ts:Date.now()}),a.resourceReloadPending&&queueMicrotask(()=>void ag(a))}}case"steer":case"followUp":{if(a.promptSubmitting||a.resourceReloading)return{ok:!1,error:"session is busy accepting another command"};let c=await W(a);if(a.promptSubmitting||a.resourceReloading||!c.isStreaming)return{ok:!1,error:"session is not accepting queued messages"};return await c[b.cmd](b.text??"",b.images),{ok:!0}}case"clearQueue":{if(!a.session)return{ok:!0,data:{steering:[],followUp:[]}};let b=a.session.clearQueue();return E(a,{type:"queue",steering:[],followUp:[],ts:Date.now()}),{ok:!0,data:b}}case"abort":{if(!a.session)return{ok:!0,data:{steering:[],followUp:[]}};let b=a.session.clearQueue();return await a.session.abort(),E(a,{type:"status",isStreaming:!1,state:"aborted",ts:Date.now()}),{ok:!0,data:b}}case"compact":{let c=await W(a);return await c.compact(b.instructions||void 0),{ok:!0}}case"setModel":{let c=await W(a),d=(await (0,j.uU)()).getModels(b.provider).find(a=>a.id===b.modelId);if(!d)return{ok:!1,error:`unknown model ${b.provider}/${b.modelId}`};return await c.setModel(d,{persist:!1}),G(a,c),F(a,c),{ok:!0,data:{thinkingLevel:c.thinkingLevel,thinkingLevels:c.getAvailableThinkingLevels()}}}case"setThinkingLevel":{let c=await W(a),d=String(b.level??"medium"),e=(0,u.Kt)(c.model,d);return a.desiredThinkingLevel=d,c.setThinkingLevel(e),F(a,c),{ok:!0,data:{requested:d,thinkingLevel:c.thinkingLevel,clamped:c.thinkingLevel!==d}}}case"setToolPreset":{let c=b.preset;if(!Object.hasOwn(j.Ax,c))return{ok:!1,error:"invalid tool preset"};if(X(a))return{ok:!1,error:"cannot change tools while the agent is running"};if(!a.session&&!a.creating)return a.toolPreset=c,a.customActiveTools=void 0,E(a,{type:"tools",active:[],all:[],toolPreset:c,customActiveTools:null,ts:Date.now()}),{ok:!0};let d=await W(a);if(X(a))return{ok:!1,error:"cannot change tools while the agent is running"};return a.toolPreset=c,a.customActiveTools=void 0,Z(a,d),V(a,d),_(a,d),{ok:!0}}case"setActiveTools":{if(X(a))return{ok:!1,error:"cannot change tools while the agent is running"};let c=await W(a);if(X(a))return{ok:!1,error:"cannot change tools while the agent is running"};let d=Array.isArray(b.names)?b.names.map(String):[],e=aa(c),f=[...new Set(d)].filter(a=>e.includes(a));if(0===f.length)return{ok:!1,error:"cannot disable all tools"};return a.customActiveTools=f,Z(a,c),V(a,c),_(a,c),{ok:!0,data:{active:ab(c)}}}case"cycleModel":{let c=await W(a),d=await c.cycleModel(b.direction??"forward");if(d?.model)return G(a,c),F(a,c),{ok:!0,data:{model:String(d.model.id??""),thinkingLevel:c.thinkingLevel}};return{ok:!1,error:"no scoped models to cycle"}}case"navigate":{let c=await W(a),d=String(b.entryId??"");if(!d)return{ok:!1,error:"missing entryId"};let e=await c.navigateTree(d);return{ok:!e?.cancelled,data:{cancelled:e?.cancelled===!0,editorText:e?.editorText}}}case"editAndResend":{let c=String(b.entryId??""),d=(b.text??"").trim();if(!c)return{ok:!1,error:"missing entryId"};if(!d)return{ok:!1,error:"empty prompt"};if(a.promptSubmitting||a.resourceReloading)return{ok:!1,error:"session is busy accepting another command"};a.promptSubmitting=!0;try{let b=await W(a);if(a.disposed)throw Error("session is disposed");if(b.isStreaming||a.runActive){await b.abort().catch(()=>void 0);for(let c=0;c<50&&!a.disposed&&(b.isStreaming||a.runActive);c+=1)await new Promise(a=>setTimeout(a,100))}if(a.disposed)throw Error("session is disposed");let e=await b.navigateTree(c);if(e?.cancelled)return{ok:!1,error:"edit cancelled"};if(await an(a),a.disposed)throw Error("session is disposed");return await ao(a,b,d)}finally{a.promptSubmitting=!1,a.disposed||E(a,{type:"status",isStreaming:X(a),state:X(a)?"running":"idle",ts:Date.now()}),a.resourceReloadPending&&queueMicrotask(()=>void ag(a))}}case"rename":{let c=(b.text??"").trim();return a.session?a.session.setSessionName(c):a.sm.appendSessionInfo(c),E(a,{type:"name",name:c,ts:Date.now()}),{ok:!0}}case"extensionUiResponse":return a.ui?.respond(String(b.requestId),{value:b.value,confirmed:b.confirmed,cancelled:b.cancelled})?{ok:!0}:{ok:!1,error:"no pending extension request"};case"reload":{if(X(a))return{ok:!1,error:"session is busy"};let b=await W(a);return await b.reload(),{ok:!0}}case"fork":{let c=(b.entryId?j.Cv.open(a.sessionPath).createBranchedSession(b.entryId):j.Cv.forkFrom(a.sessionPath,a.cwd).getSessionFile())??"";if(!c)return{ok:!1,error:"failed to create forked session"};return{ok:!0,data:{sessionPath:c}}}default:return{ok:!1,error:"unknown cmd"}}}catch(a){return{ok:!1,error:String(a?.message??a)}}}async function aq(a){let b=j.Cv.create(a),c=b.getSessionFile()??"";if(!c)throw Error("failed to create session file");return R(c,a,b),{sessionPath:c}}function ar(){let a={};for(let[b,c]of au){let d;if(c.session){for(let a=c.ledger.entries.length-1;a>=0;a-=1){let b=c.ledger.entries[a];if("tool"===b.kind){d=[b.toolName,(b.preview??b.title??"").split("\n")[0].slice(0,80)].filter(Boolean).join(" \xb7 ");break}}a[b]={streaming:X(c),lastStep:d}}}return a}async function as(a,b){let d=a.sessionPath.replace(/\\/g,"/").split("/").pop()??"session";if("jsonl"===b){let{readFile:b}=await Promise.resolve().then(c.t.bind(c,51455,23));return{filename:d,content:await b(a.sessionPath,"utf8"),contentType:"application/jsonl"}}let e=await W(a),f=await e.exportToHtml(),{readFile:g,rm:h}=await Promise.resolve().then(c.t.bind(c,51455,23)),i=await g(f,"utf8");return await h(f,{force:!0}).catch(()=>void 0),{filename:d.replace(/\.jsonl$/,".html"),content:i,contentType:"text/html"}}(0,o.j8)({isActive:function(a){let b="win32"===process.platform?a.toLowerCase():a;for(let a of au.keys())if(("win32"===process.platform?a.toLowerCase():a)===b)return!0;return!1},log:a=>console.log(a)}),d()}catch(a){d(a)}})},31374:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{j8:()=>l});var e=c(51455),f=c.n(e),g=c(76760),h=c.n(g),i=c(6896),j=a([i]);async function k({now:a=Date.now(),retentionDays:b=30,isActive:d=()=>!1,log:e=console.log,dryRun:g=!1}={}){let j={scanned:0,deleted:[],missing:[],skippedActive:[],kept:0};if(!Number.isFinite(b)||b<=0)return j;let l=a-24*b*36e5,{archivedSessions:m}=await (0,i.vQ)();for(let k of m){let m;j.scanned+=1;let n=h().resolve(k);if(d(n)){j.skippedActive.push(n),j.kept+=1;continue}try{let a=await f().stat(n);if(!a.isFile())throw Object.assign(Error("not a file"),{code:"ENOENT"});m=a.mtimeMs}catch(a){if("ENOENT"!==a.code)throw a;j.missing.push(n),g||await (0,i.Iz)(n);continue}if(m>l){j.kept+=1;continue}let o=Math.floor((a-m)/864e5);if(j.deleted.push({path:n,idleDays:o}),g)continue;let{deleteSession:p}=await c.e(229).then(c.bind(c,66229));await p(n),await (0,i.Iz)(n),e(`[piweb] 归档会话已超过 ${b} 天没有活动(${o} 天),已删除:${n}`)}return j}i=(j.then?(await j)():j)[0];let m=!1;function l({intervalMs:a=216e5,delayMs:b=5e3,log:c=console.log,isActive:d}={}){if(m)return;m=!0;let e=async()=>{Date.now();try{let a=await k({log:c,isActive:d});(a.deleted.length||a.missing.length)&&c(`[piweb] 归档清理:删除 ${a.deleted.length} 个,清理失效记录 ${a.missing.length} 个,保留 ${a.kept} 个`)}catch(a){c(`[piweb] 归档清理失败:${a instanceof Error?a.message:a}`)}},f=setTimeout(()=>{e();let b=setInterval(()=>void e(),a);b.unref?.()},b);f.unref?.()}d()}catch(a){d(a)}})},34007:(a,b,c)=>{function d(a){let b=[];for(let[c,d]of a.entries()){if("message"!==d.type||d.message?.role!=="user")continue;let a="number"==typeof d.timestamp?d.timestamp:Date.parse(d.timestamp??""),e=Number.isFinite(a)?a:d.message.timestamp;b.push({id:d.id??`entry:${c}`,ts:"number"==typeof e&&Number.isFinite(e)?e:NaN})}return b}function e(a,b=0){let c=[],d="";for(let e of a.slice(Math.max(0,b)))if("message"===e.type&&e.message?.role==="user"&&e.id){var f;c.push(e.id),d||(d=("string"==typeof(f=e.message.content)?f:!Array.isArray(f)?"":f.map(a=>a&&"object"==typeof a&&"text"===a.type?String(a.text??""):"").join("")).split("\n").map(a=>a.trim()).find(Boolean)??"")}return{ids:c,title:d}}c.d(b,{S:()=>e,g:()=>d})},34070:(a,b,c)=>{c.d(b,{ec:()=>d});function d(a){return Math.ceil(a.length/4)}},35851:(a,b,c)=>{c.d(b,{I:()=>f,k:()=>g});var d=c(83188),e=c(34007);let f=5;function g(a){let{cwd:b,sessionPath:c,publish:g,entries:h,consent:i}=a,j=!1,k=null,l=!1,m=0,n=!1,o=null,p=Promise.resolve(),q=null,r=0,s=!1,t=null,u=a=>{let c=a instanceof Error?a.message:String(a),e=a instanceof d.qy&&("unavailable"===a.code||"too-large"===a.code);e&&(j=!0,k=a,q=null),n=!0,o=c;let f=Date.now();(e||!(f-m<6e4))&&(m=f,console.warn(`[piweb] growth commit failed for ${b}: ${c}`),g({type:"growth_error",message:c,ts:f}))},v=a=>p=p.then(a,a).catch(u),w=a=>(n&&(n=!1,o=null,g({type:"growth_error",message:null,ts:Date.now()})),a&&!l&&g({type:"growth",round:a,ts:Date.now()}),a),x=()=>{j=!0,k=new d.qy("growth tracking was declined for this workspace","unavailable"),q=null},y=async(a,c)=>{let e=s?await i():null;if(!1===e)return void x();if(!s||null!==e)try{return await a({allowInit:!0===e,abortIf:c})}catch(f){if(!(f instanceof d.qy)||"needs-consent"!==f.code)throw f;s=!0;let e=await i();if(!1===e)return void x();if(!0===e)return a({allowInit:!0,abortIf:c});t||l||g({type:"growth_consent",request:t={cwd:b,reason:f.target?.reason??"not-git",parent:f.target?.parent},ts:Date.now()});return}},z=a=>y(a=>(0,d.uP)(b,c,a),a);return{version:f,getError:()=>o,getConsentRequest:()=>t,prepare(){if(j||l)return p;let a=r;return v(async()=>{if(j||l)return;let b=await z(()=>r!==a);void 0!==b&&w(b)})},onEvent(a){if(!l&&!j)switch(a.type){case"agent_start":null===q&&(q=h().length,r+=1);break;case"agent_settled":{if(null===q)break;let a=h().slice(q),{ids:f,title:g}=(0,e.S)(a);q=null,v(async()=>{if(j||l)return;let e=await y(e=>(0,d.qo)(b,{kind:"round",session:c,title:g,promptIds:f,status:function(a){for(let b=a.length-1;b>=0;b-=1){let c="message"===a[b].type?a[b].message:void 0;if(c?.role==="assistant"){if("aborted"===c.stopReason)return"aborted";if("error"===c.stopReason)return"error";break}}return"done"}(a)},e));void 0!==e&&w(e)})}}},async recordNow(){let a;if(j)throw k??new d.qy("growth tracking is disabled for this workspace","unavailable");let b=null;if(await v(async()=>{try{if(j)throw k??new d.qy("growth tracking is disabled for this workspace","unavailable");let a=await z();if(void 0===a)throw j?k??new d.qy("growth tracking is disabled for this workspace","unavailable"):new d.qy("growth tracking is waiting for permission to create a git repository","needs-consent");b=w(a)}catch(b){a=b,b instanceof d.qy&&"needs-consent"===b.code||u(b)}}),a)throw a;return b},async consentAnswered(a){let b=t;if(t=null,b&&!l&&g({type:"growth_consent",request:null,ts:Date.now()}),!a)return x(),null;if(j||l)return null;let c=null;return await v(async()=>{let a=await z();c=void 0===a?null:w(a)}),c},dispose(){l=!0}}}},49904:(a,b,c)=>{c.d(b,{Ax:()=>k,Jt:()=>m,_i:()=>l});var d=c(51455),e=c.n(d),f=c(76760),g=c.n(f),h=c(80974),i=c.n(h);let j=new Map;function k(a,b){let c=g().resolve(a),d="win32"===process.platform?c.toLowerCase():c,e=(j.get(d)??Promise.resolve()).then(b,b),f=e.then(()=>void 0,()=>void 0);return j.set(d,f),f.then(()=>{j.get(d)===f&&j.delete(d)}),e}async function l(a,b){await e().mkdir(g().dirname(a),{recursive:!0});let c=await i().lock(a,{realpath:!1,retries:{retries:20,minTimeout:20,maxTimeout:100}});try{return await b()}finally{await c()}}async function m(a){await a.flush();let b=a.drainErrors();if(b.length)throw Error(`Pi settings failed: ${b.map(({scope:a,error:b})=>`${a}: ${b.message}`).join("; ")}`,{cause:b[0].error})}},75554:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{DY:()=>s,Gh:()=>x,J0:()=>r,MO:()=>p});var e=c(51455),f=c.n(e),g=c(76760),h=c.n(g),i=c(77598),j=c(86159),k=c(87982),l=c(49904),m=a([k]);k=(m.then?(await m)():m)[0];let t=16384,u=2e4,v=3,w=2e3;function n(){return h().join((0,k.$M)(),"settings.json")}async function o(){return(0,j.op)(n())}async function p(){let a=(await o()).enabledModels;return!Array.isArray(a)||a.some(a=>"string"!=typeof a)?null:a}function q(a,b){let c=a[b];return c&&"object"==typeof c&&!Array.isArray(c)?c:{}}async function r(){let a=await o(),b=a.compaction??{},c=a.retry??{},d=(a,b)=>"number"==typeof a&&Number.isSafeInteger(a)&&a>=0?a:b;return{compaction:{enabled:!1!==b.enabled,reserveTokens:d(b.reserveTokens,t),keepRecentTokens:d(b.keepRecentTokens,u)},retry:{enabled:!1!==c.enabled,maxRetries:d(c.maxRetries,v),baseDelayMs:d(c.baseDelayMs,w)}}}class x extends Error{}async function s(a){let b=function(a){if(!a||"object"!=typeof a||Array.isArray(a))throw new x("invalid settings patch");if(Object.keys(a).some(a=>"compaction"!==a&&"retry"!==a))throw new x("unknown settings field");let b={};for(let c of["compaction","retry"]){if(void 0===a[c])continue;let d=a[c];if(!d||"object"!=typeof d||Array.isArray(d))throw new x(`invalid ${c} settings`);let e="compaction"===c?["enabled","reserveTokens","keepRecentTokens"]:["enabled","maxRetries","baseDelayMs"];for(let[a,b]of Object.entries(d)){if(!e.includes(a))throw new x(`unknown ${c} field: ${a}`);if("enabled"===a){if("boolean"!=typeof b)throw new x(`${c}.${a} must be boolean`)}else if("number"!=typeof b||!Number.isSafeInteger(b)||b<0||b>1e9)throw new x(`${c}.${a} must be a non-negative integer`)}"compaction"===c?b.compaction=d:b.retry=d}return b}(a),c=n();await (0,l.Ax)(c,()=>(0,l._i)(c,async()=>{let a=await (0,j.mu)(c);b.compaction&&(a.compaction={...q(a,"compaction"),...b.compaction}),b.retry&&(a.retry={...q(a,"retry"),...b.retry}),await f().mkdir(h().dirname(c),{recursive:!0});let d=`${c}.${process.pid}.${(0,i.randomUUID)()}.tmp`;try{await f().writeFile(d,JSON.stringify(a,null," "),"utf8"),await f().rename(d,c)}finally{await f().rm(d,{force:!0}).catch(()=>void 0)}(0,j.Ix)(c)})),await (0,k.BW)()}d()}catch(a){d(a)}})},92584:(a,b,c)=>{c.d(b,{V:()=>e});var d=c(76760);let e=c.n(d)().resolve(process.env.PI_WEB_ROOT??process.cwd())}};
1
+ "use strict";exports.id=686,exports.ids=[686],exports.modules={3672:(a,b,c)=>{c.d(b,{H4:()=>e,Pn:()=>g,WZ:()=>h});var d=c(29296);function e(a){if(!a||"object"!=typeof a)return;let b={};return"number"==typeof a.input&&(b.input=a.input),"number"==typeof a.output&&(b.output=a.output),"number"==typeof a.cacheRead&&(b.cacheRead=a.cacheRead),"number"==typeof a.cacheWrite&&(b.cacheWrite=a.cacheWrite),Object.keys(b).length?b:void 0}function f(a){if(null==a)return"";if("string"==typeof a)return a;if(Array.isArray(a))return a.map(f).join("");if("object"==typeof a){if("string"==typeof a.text)return a.text;if("string"==typeof a.thinking)return a.thinking}return""}class g{constructor(a=[]){this.streamingStart=null,this.turnStartedAt=null,this.toolIndex=new Map,this.toolStart=new Map,this.pendingToolArgs=new Map,this.dirty=[],this.entries=a.map(a=>({...a})),this.nextSeq=Math.max(0,...this.entries.map(a=>a.seq))+1}push(a){let b={...a,seq:this.nextSeq++};return this.entries.push(b),this.dirty.push(b),b}touch(a){a&&!this.dirty.includes(a)&&this.dirty.push(a)}drainDirty(){let a=this.dirty;return this.dirty=[],a}onEvent(a,b=Date.now()){switch(a.type){case"turn_start":this.turnStartedAt=b;break;case"message_start":{let c=a.message;if(c?.role==="user")this.push({kind:"user",ts:c.timestamp??b,detail:f(c.content)});else if(c?.role==="assistant"){let a=this.turnStartedAt??b;this.turnStartedAt=null,this.streamingStart={seq:this.nextSeq,t0:a},this.push({kind:"message",ts:a,title:"assistant"})}else if(c?.role==="toolResult"){let a=c.toolCallId?this.toolIndex.get(c.toolCallId):void 0;if(void 0!==a){let b=this.entries[a],g=(0,d.R)(f(c.content));b.detail=g.text||b.detail,b.encodingLoss=g.encodingLoss||b.encodingLoss,b.isError=!0===c.isError,b.tokens=e(c.usage)??b.tokens,this.touch(b)}}break}case"message_update":{let c=a.assistantMessageEvent;if(!c)break;if(("text_delta"===c.type||"thinking_delta"===c.type)&&this.streamingStart&&void 0===this.streamingStart.firstToken){this.streamingStart.firstToken=b;let a=this.entries[this.entries.length-1];a?.kind==="message"&&(a.timing={...a.timing??{},ttftMs:b-this.streamingStart.t0},this.touch(a))}"toolcall_end"===c.type&&c.toolCall&&this.pendingToolArgs.set(c.toolCall.id,c.toolCall.arguments);break}case"message_end":{let c=a.message;if(c?.role==="assistant"){let a=this.entries[this.entries.length-1],d=a?.kind==="message"?a:this.push({kind:"message",ts:b});for(let a of(this.streamingStart&&(d.timing={...void 0===this.streamingStart.firstToken?{}:{ttftMs:this.streamingStart.firstToken-this.streamingStart.t0,decodeMs:b-this.streamingStart.firstToken},durationMs:b-this.streamingStart.t0}),d.tokens=e(c.usage),d.thinking=f((c.content??[]).filter(a=>"thinking"===a.type).map(a=>a.thinking)),d.detail=f((c.content??[]).filter(a=>"text"===a.type)),d.isError="error"===c.stopReason,"error"===c.stopReason&&(d.title="error"),this.touch(d),this.streamingStart=null,c.content??[]))"toolCall"===a.type&&(this.toolIndex.set(a.id,this.entries.length),this.push({kind:"tool",ts:b,toolName:a.name,toolCallId:a.id,title:a.name,detail:JSON.stringify(a.arguments??{},null,2)}))}break}case"tool_execution_start":{this.toolStart.set(a.toolCallId,b);let c=this.toolIndex.get(a.toolCallId);if(void 0===c)c=this.entries.length,this.toolIndex.set(a.toolCallId,c),this.push({kind:"tool",ts:b,toolName:a.toolName,toolCallId:a.toolCallId,title:a.toolName,detail:JSON.stringify(a.args??{},null,2)});else{let b=this.entries[c];b.detail=JSON.stringify(a.args??{},null,2),this.touch(b)}break}case"tool_execution_update":{let b=this.toolIndex.get(a.toolCallId);if(void 0!==b){let c=this.entries[b],e=(0,d.R)(f(a.partialResult));e.text&&(c.preview=e.text.slice(-2e3)),c.encodingLoss=e.encodingLoss||c.encodingLoss,this.touch(c)}break}case"tool_execution_end":{let c=this.toolIndex.get(a.toolCallId);if(void 0!==c){let e=this.entries[c],g=(0,d.R)(f(a.result));e.detail=[e.detail,g.text].filter(Boolean).join("\n\n---\n\n"),e.encodingLoss=g.encodingLoss||e.encodingLoss,e.isError=!0===a.isError;let h=this.toolStart.get(a.toolCallId);void 0!==h&&(e.timing={...e.timing??{},durationMs:b-h}),this.touch(e)}this.toolStart.delete(a.toolCallId);break}case"compaction_start":this.push({kind:"compacted",ts:b,title:`compact (${a.reason})`});break;case"compaction_end":{let b=[...this.entries].reverse().find(a=>"compacted"===a.kind);b&&(a.errorMessage&&(b.isError=!0,b.detail=a.errorMessage),a.result?.tokensBefore!=null&&(b.tokens={input:a.result.tokensBefore}),this.touch(b))}}}}function h(a){let b=[],c=1,g=a=>"number"==typeof a?.timestamp?a.timestamp:Date.now();for(let h of a)if("message"===h.type){let a=h.message;if(!a)continue;if("user"===a.role)b.push({seq:c++,kind:"user",ts:g(a),detail:f(a.content)});else if("assistant"===a.role){let d=f((a.content??[]).filter(a=>"thinking"===a.type)),h=f((a.content??[]).filter(a=>"text"===a.type));for(let f of(b.push({seq:c++,kind:"message",ts:g(a),title:"error"===a.stopReason?"error":"assistant",detail:h,thinking:d||void 0,tokens:e(a.usage),isError:"error"===a.stopReason||void 0}),a.content??[]))"toolCall"===f.type&&b.push({seq:c++,kind:"tool",ts:g(a),toolName:f.name,toolCallId:f.id,title:f.name,detail:JSON.stringify(f.arguments??{},null,2)})}else if("toolResult"===a.role){let c=b.findLast?.(b=>"tool"===b.kind&&(a.toolCallId?b.toolCallId===a.toolCallId:b.toolName===a.toolName));if(c){let b=(0,d.R)(f(a.content));c.detail=[c.detail,b.text].filter(Boolean).join("\n\n---\n\n"),c.encodingLoss=b.encodingLoss||c.encodingLoss,c.isError=!0===a.isError||void 0,c.tokens=e(a.usage)??c.tokens}}}else"compaction"===h.type?b.push({seq:c++,kind:"compacted",ts:g(h),title:"compact",tokens:null!=h.tokensBefore?{input:h.tokensBefore}:e(h.usage)}):"branch_summary"===h.type&&b.push({seq:c++,kind:"compacted",ts:g(h),title:"branch summary",tokens:e(h.usage),detail:h.summary});return b}},6896:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{Iz:()=>E,JZ:()=>D,PY:()=>y,Tp:()=>z,XG:()=>G,X_:()=>J,cH:()=>B,qM:()=>A,qh:()=>H,r7:()=>F,vQ:()=>C});var e=c(51455),f=c.n(e),g=c(48161),h=c.n(g),i=c(76760),j=c.n(i),k=c(92584),l=c(31421),m=c(46193),n=c(87982),o=c(77598),p=c(49904),q=a([n]);function r(){return j().join((0,n.$M)(),"web-workspaces.json")}async function s(a=r()){try{let b=JSON.parse(await f().readFile(a,"utf8"));if(!b||"object"!=typeof b||Array.isArray(b))throw Error("invalid workspace registry");let c=Object.fromEntries(Object.entries("object"==typeof b.aliases&&null!==b.aliases?b.aliases:{}).filter(a=>"string"==typeof a[1])),d=Object.fromEntries(Object.entries("object"==typeof b.growthInit&&null!==b.growthInit?b.growthInit:{}).filter(a=>"boolean"==typeof a[1]));return{workspaces:Array.isArray(b.workspaces)?b.workspaces.filter(a=>"string"==typeof a):[],aliases:c,archivedSessions:Array.isArray(b.archivedSessions)?b.archivedSessions.filter(a=>"string"==typeof a):[],removedWorkspaces:Array.isArray(b.removedWorkspaces)?b.removedWorkspaces.filter(a=>"string"==typeof a):[],...Object.keys(d).length?{growthInit:d}:{}}}catch(a){if("ENOENT"!==a.code)throw a}return{workspaces:[],aliases:{},archivedSessions:[],removedWorkspaces:[]}}function t(a){let b=j().resolve(a);return"win32"===process.platform?b.toLowerCase():b}async function u(a,b){await f().mkdir(j().dirname(b),{recursive:!0});let c=`${b}.${(0,o.randomUUID)()}.tmp`;try{await f().writeFile(c,JSON.stringify(a,null,2),{encoding:"utf8",flag:"wx",mode:384}),await f().rename(c,b)}finally{await f().unlink(c).catch(()=>void 0)}}n=(q.then?(await q)():q)[0];let K=null;async function v(a){var b;let c;try{c=await f().stat(a)}catch(a){if("ENOENT"!==a.code)throw a;return K=null,{workspaces:[],aliases:{},archivedSessions:[],removedWorkspaces:[]}}let d=(b=c,`${b.mtimeMs}:${b.ctimeMs}:${b.size}:${b.ino}`);if(K&&K.path===a&&K.stamp===d)return K.data;let e=await s(a);return K={path:a,stamp:d,data:e},e}async function w(){return v(r())}async function x(a){let b=r();return(0,p.Ax)(b,()=>(0,p._i)(b,async()=>{try{return await a(await s(b),b)}finally{K=null}}))}async function y(){return(await w()).removedWorkspaces??[]}async function z(a,b){let c=t(j().resolve(a));return x(async(a,d)=>{for(let b of(a.aliases||(a.aliases={}),Object.keys(a.aliases)))b!==c&&t(b)===c&&delete a.aliases[b];return b.trim()?a.aliases[c]=b.trim():delete a.aliases[c],await u(a,d),a.aliases})}async function A(a){return(await w()).growthInit?.[t(a)]??null}async function B(a,b){let c=t(a);await x(async(a,d)=>{a.growthInit={...a.growthInit,[c]:b},await u(a,d)})}async function C(){let a=await w();return{workspaces:a.workspaces,aliases:a.aliases??{},archivedSessions:a.archivedSessions??[],removedWorkspaces:a.removedWorkspaces??[]}}async function D(a){let b=j().resolve(a),c=t(b);return x(async(a,d)=>(a.archivedSessions||(a.archivedSessions=[]),a.archivedSessions.some(a=>t(a)===c)||(a.archivedSessions.push(b),await u(a,d)),a.archivedSessions))}async function E(a){let b=j().resolve(a),c=t(b);return x(async(a,b)=>{let d=a.archivedSessions??[],e=d.filter(a=>t(a)!==c);return e.length!==d.length&&(a.archivedSessions=e,await u(a,b)),e})}async function F(a){let b=j().resolve(a),c=t(b);return x(async(a,d)=>{let e=!1;if(a.workspaces.some(a=>t(a)===c)||(a.workspaces.push(b),e=!0),a.removedWorkspaces){let b=a.removedWorkspaces.filter(a=>t(a)!==c);e||=b.length!==a.removedWorkspaces.length,a.removedWorkspaces=b}return e&&await u(a,d),{workspaces:a.workspaces,removedWorkspaces:a.removedWorkspaces??[]}})}async function G(a){let b=r(),c=await v(b),d=new Set((c.removedWorkspaces??[]).map(t)),e=new Set(c.workspaces.map(t)),f=!1;for(let b of a){if(!b||"string"!=typeof b)continue;let a=t(j().resolve(b));d.has(a)||e.has(a)||(e.add(a),f=!0)}return f?x(async(b,c)=>{let d=!1,e=new Set((b.removedWorkspaces??[]).map(t)),f=new Set(b.workspaces.map(t));for(let c of a){if(!c||"string"!=typeof c)continue;let a=j().resolve(c),g=t(a);e.has(g)||f.has(g)||(b.workspaces.push(a),f.add(g),d=!0)}return d&&await u(b,c),b.workspaces}):c.workspaces}async function H(a){let b=j().resolve(a),c=t(b);return x(async(a,d)=>{if(a.workspaces=a.workspaces.filter(a=>t(a)!==c),a.removedWorkspaces||(a.removedWorkspaces=[]),a.removedWorkspaces.some(a=>t(a)===c)||a.removedWorkspaces.push(b),a.aliases)for(let b of Object.keys(a.aliases))t(b)===c&&delete a.aliases[b];return await u(a,d),{workspaces:a.workspaces,removedWorkspaces:a.removedWorkspaces,aliases:a.aliases??{}}})}let L=!1;function I(a,b={}){let{timeoutMs:c=3e5,windowsHide:d=!1}=b;return new Promise((b,e)=>{let f,g=(0,l.spawn)(a[0],a.slice(1),{stdio:["ignore","pipe","pipe"],windowsHide:d}),h=new m.StringDecoder("utf8"),i="",j="",k=!1;g.stdout.on("data",a=>{i+=h.write(a)}),g.stderr.on("data",a=>{j=(j+a.toString("utf8")).slice(-1e3)});let n=!1,o=a=>{n||(n=!0,clearTimeout(f),k||(k=!0,i+=h.end()),a?e(a):b(i.trim()))};g.on("error",a=>o(a)),g.on("close",a=>o(0===a?void 0:Error(j||`folder picker exited with code ${a}`))),f=setTimeout(()=>{try{g.kill()}catch{}o(Error("folder picker timed out"))},c)})}async function J(){if(L)return{path:null,canceled:!0};L=!0;try{if("win32"===process.platform){let a=j().join(k.V,"scripts","pick-folder.ps1"),b=await I(["powershell.exe","-NoProfile","-STA","-ExecutionPolicy","Bypass","-File",a,"选择工作区文件夹"],{windowsHide:!0});return b?{path:b,canceled:!1}:{path:null,canceled:!0}}if("darwin"===process.platform){let a=await I(["osascript","-e",'POSIX path of (choose folder with prompt "选择工作区文件夹")']),b=function(a){let b=a.trim();if((b=b.replace(/^alias\s+/i,"").replace(/^"(.*)"$/s,"$1")).startsWith("/"))return b.replace(/\\(.)/g,"$1");if(/^[A-Za-z][A-Za-z0-9 ]*:(.+)$/.test(b)){let a=b.slice(b.indexOf(":")+1);return`/${a.split(":").filter(Boolean).join("/")}`}return b}(a);return b?{path:b,canceled:!1}:{path:null,canceled:!0}}for(let a of[["zenity","--file-selection","--directory","--title=选择工作区文件夹"],["kdialog","--getexistingdirectory",`${h().homedir()}`,"--title","选择工作区文件夹"]])try{let b=await I(a);return b?{path:b,canceled:!1}:{path:null,canceled:!0}}catch(a){if(a instanceof Error&&/ENOENT|not found|not recognized/i.test(a.message))continue;if(/exited with code (1|5)$/.test(a instanceof Error?a.message:String(a)))return{path:null,canceled:!0};throw a}throw Error("no folder picker available: install zenity or kdialog, or type the path manually")}finally{L=!1}}d()}catch(a){d(a)}})},14719:(a,b,c)=>{c.d(b,{X:()=>e});var d=c(77598);function e(a){let b=new Map,c=new Map,e=!1,f=(c,f,g,h)=>{if(e||!a.hasViewers()||f?.signal?.aborted)return Promise.resolve(g);let i=(0,d.randomUUID)();return new Promise(d=>{let e=c=>{let e=b.get(i);e&&(b.delete(i),e.timer&&clearTimeout(e.timer),e.removeAbortListener?.(),a.publish({type:"extension_ui_resolved",id:i,ts:Date.now()}),d(c?h(c):g))},j={type:"extension_ui",id:i,...c,timeout:f?.timeout,ts:Date.now()},k={request:j,resolve:a=>e(a)};k.timer=setTimeout(()=>e(null),f?.timeout??6e5),k.timer.unref?.();let l=()=>e(null);f?.signal?.addEventListener("abort",l,{once:!0}),k.removeAbortListener=()=>f?.signal?.removeEventListener("abort",l),b.set(i,k),a.publish(j)})};return{uiContext:{select:(a,b,c)=>f({method:"select",title:a,options:b},c,void 0,a=>a.cancelled?void 0:a.value),confirm:(a,b,c)=>f({method:"confirm",title:a,message:b},c,!1,a=>!a.cancelled&&!0===a.confirmed),input:(a,b,c)=>f({method:"input",title:a,placeholder:b},c,void 0,a=>a.cancelled?void 0:a.value),notify:(b,c)=>{a.publish({type:"extension_ui",id:(0,d.randomUUID)(),method:"notify",message:b,notifyType:c??"info",ts:Date.now()})},setStatus:(b,e)=>{void 0===e?c.delete(b):c.set(b,e),a.publish({type:"extension_ui",id:(0,d.randomUUID)(),method:"setStatus",statusKey:b,statusText:e,ts:Date.now()})},setWorkingMessage:b=>{a.publish({type:"extension_ui",id:(0,d.randomUUID)(),method:"setWorkingMessage",message:b,ts:Date.now()})},onTerminalInput:()=>()=>{},setWorkingVisible:()=>{},setWorkingIndicator:()=>{},setHiddenThinkingLabel:()=>{},setWidget:()=>{},setFooter:()=>{},setHeader:()=>{},setTitle:()=>{},custom:async()=>void 0,pasteToEditor:()=>{},setEditorText:()=>{},getEditorText:()=>"",editor:async()=>void 0,addAutocompleteProvider:()=>{},setEditorComponent:()=>{},getEditorComponent:()=>void 0,getAllThemes:()=>[],getTheme:()=>void 0,setTheme:()=>{},getToolsExpanded:()=>!1,setToolsExpanded:()=>{}},statuses:c,getPendingRequests:()=>[...b.values()].map(({request:a})=>({...a,options:a.options?[...a.options]:void 0})),respond(a,c){let d=b.get(a);return!!d&&(d.resolve(c),!0)},dispose(){for(let a of(e=!0,b.values()))a.resolve({cancelled:!0});b.clear()}}}},28686:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{B1:()=>am,H$:()=>x,Hx:()=>ae,Lf:()=>P,Lz:()=>al,PO:()=>ak,Rq:()=>au,SG:()=>Q,Sj:()=>ai,al:()=>an,bS:()=>M,g7:()=>as,kQ:()=>ao,lX:()=>at,mk:()=>N,tX:()=>aj,vJ:()=>av});var e=c(73024),f=c(77598),g=c(76760),h=c.n(g),i=c(75430),j=c(87982),k=c(14719),l=c(35851),m=c(34007),n=c(3672),o=c(31374),p=c(29296),q=c(62433),r=c(34070),s=c(75554),t=c(6896),u=c(28802),v=a([i,j,o,q,s,t,u]);[i,j,o,q,s,t,u]=v.then?(await v)():v;let aw=globalThis,ax=aw.__piWebSessions??=new Map;function w(a){if(null==a)return"";if("string"==typeof a)return a;if(Array.isArray(a))return a.map(w).join("");if("object"==typeof a){if("string"==typeof a.text)return a.text;if("string"==typeof a.thinking)return a.thinking}return""}function x(a,b){if(!a||"object"!=typeof a)return{role:"other",content:[]};let c={role:"other",content:[]};b?c.id=b:"string"==typeof a.id&&(c.id=a.id),"number"==typeof a.timestamp&&(c.timestamp=a.timestamp);let d=[];for(let b of Array.isArray(a.content)?a.content:"string"==typeof a.content?[{type:"text",text:a.content}]:[])b&&"object"==typeof b&&("text"===b.type&&"string"==typeof b.text?d.push({type:"text",text:b.text}):"thinking"===b.type&&"string"==typeof b.thinking?d.push({type:"thinking",thinking:b.thinking}):"toolCall"===b.type?d.push({type:"toolCall",id:String(b.id??""),name:String(b.name??""),arguments:b.arguments}):"image"===b.type&&"string"==typeof b.data&&"string"==typeof b.mimeType&&d.push({type:"image",data:b.data,mimeType:b.mimeType}));if(c.content=d,"user"===a.role)c.role="user";else if("assistant"===a.role)c.role="assistant",c.stopReason=a.stopReason,c.errorMessage=a.errorMessage??void 0,c.usage=(0,n.H4)(a.usage),a.usage?.cost?.total!=null&&(c.usage={...c.usage,cost:{total:a.usage.cost.total}}),c.model="string"==typeof a.model?a.model:void 0,c.provider="string"==typeof a.provider?a.provider:void 0;else if("toolResult"===a.role){c.role="toolResult";let b=(0,p.R)(w(a.content));c.content=[{type:"toolResult",toolCallId:a.toolCallId,text:b.text,isError:!0===a.isError,encodingLoss:b.encodingLoss||void 0,patch:z(a.details)}]}return c}let ay=new WeakMap;function y(a,b){return{...x(b,function(a,b){if(!b||"object"!=typeof b)return;let c=a.getEntryCount,d=c?null:a.getEntries(),e=c?c.call(a):d.length,f=ay.get(a);if(!f||f.count!==e){for(let b of(f={count:e,ids:new WeakMap},d??a.getEntries()))b?.type==="message"&&b.message&&"object"==typeof b.message&&f.ids.set(b.message,b.id);ay.set(a,f)}return f.ids.get(b)}(a.sm,b)),streamId:function(a,b){if(!b||"object"!=typeof b)return;a.messageIds??=new WeakMap;let c=a.messageIds.get(b);return c||(c=(0,f.randomUUID)(),a.messageIds.set(b,c)),c}(a,b)}}function z(a){let b=a?.patch;return"string"==typeof b&&b.trim()?b.slice(0,6e4):void 0}let az=new Map;function A(a){return{target:"string"==typeof a?.path?a.path:"string"==typeof a?.file_path?a.file_path:"",content:"string"==typeof a?.content?a.content:void 0}}function B(a){if(null!=a){if("string"==typeof a)return a.slice(-4e3);if(Array.isArray(a))return a.map(w).join("").slice(-4e3)||void 0;if("object"==typeof a){let b=w(a.content);if(b)return b.slice(-4e3);try{return JSON.stringify(a).slice(-4e3)}catch{}}}}let aA=new WeakMap;function C(a){let b=aA.get(a);if(b){for(;b.length>0&&null!==b[0].events;)for(let c of b.shift().events)D(a,c);0===b.length&&aA.delete(a)}}function D(a,b){if(a.disposed)return;a.seq+=1;let c=JSON.stringify(b);for(let b of(a.buffer.push({seq:a.seq,json:c}),a.buffer.length>400&&a.buffer.shift(),a.subscribers))try{b(a.seq,c)}catch{a.subscribers.delete(b)}}function E(a,b){let c=aA.get(a);if(!c)return D(a,b);c.push({events:[b]}),C(a)}function F(a,b){let c=b.model;E(a,{type:"model",provider:c?String(c.provider??""):void 0,model:c?String(c.id??""):void 0,thinkingLevel:String(b.thinkingLevel??""),thinkingLevels:b.getAvailableThinkingLevels(),ts:Date.now()})}function G(a,b){if(!a.desiredThinkingLevel)return;let c=(0,u.clampThinkingLevel)(b.model,a.desiredThinkingLevel);c!==b.thinkingLevel&&b.setThinkingLevel(c)}function H(a){let b=0,c=0,d=0,e=0,f=0,g=0;for(let h of a.ledger.entries){if("tool"===h.kind){c+=Math.max(0,h.timing?.durationMs??0);continue}"message"===h.kind&&(b+=Math.max(0,h.timing?.durationMs??0),h.timing?.ttftMs!==void 0&&(d+=Math.max(0,h.timing.ttftMs),e+=1),h.timing?.decodeMs!==void 0&&h.tokens?.output!==void 0&&(f+=Math.max(0,h.timing.decodeMs),g+=Math.max(0,h.tokens.output)))}return{llmMs:b,toolMs:c,ttftMs:d,ttftSteps:e,decodeMs:f,decodeTokens:g}}function I(a){if(!a.session)return null;try{let b=a.session.getSessionStats();return{userMessages:b.userMessages,assistantMessages:b.assistantMessages,toolCalls:b.toolCalls,totalMessages:b.totalMessages,tokens:b.tokens,cost:b.cost,...H(a)}}catch{return null}}function J(a){if(!a.session)return null;let b=I(a),c=a.session.getContextUsage()??null;return{type:"usage",stats:b,contextUsage:c?{tokens:c.tokens,contextWindow:c.contextWindow,percent:c.percent}:null,ts:Date.now()}}function K(a){let b=J(a);b&&E(a,b)}function L(a){return a.growth&&a.growth.version!==l.I&&(a.growth.dispose(),a.growth=null),a.growth??=(0,l.k)({cwd:a.cwd,sessionPath:a.sessionPath,publish:b=>E(a,b),entries:()=>a.sm.getEntries(),consent:()=>(0,t.qM)(a.cwd).catch(()=>null)})}async function M(a){return O(a),L(a).recordNow()}async function N(a,b){O(a),await (0,t.cH)(a.cwd,b);let c=a=>"win32"===process.platform?h().resolve(a).toLowerCase():h().resolve(a);for(let d of ax.values())d!==a&&d.growth?.getConsentRequest()&&c(d.cwd)===c(a.cwd)&&d.growth.consentAnswered(b).catch(()=>void 0);return L(a).consentAnswered(b)}function O(a){a.lastActive=Date.now()}let aB=new Set;function P(a){for(let b of a){if(!b||aB.size>=2)return;let a="win32"===process.platform?b.toLowerCase():b;!aB.has(a)&&(aB.add(a),(0,j.v9)(b)||(0,j.Df)(b).catch(()=>void 0))}}function Q(a){let b=ax.get(a);if(!b){if(!(0,e.existsSync)(a))throw new q.BV("session not found");let c=(0,j.G1)(a);b=R(a,c.getCwd()||process.cwd(),c)}return O(b),b}function R(a,b,c){let d=[];try{d=(0,n.WZ)(c.getEntries())}catch{}let e={sessionPath:a,cwd:b,sm:c,session:null,creating:null,subscribers:new Set,buffer:[],seq:0,epoch:(0,f.randomUUID)().replace(/-/g,"").slice(0,12),inflight:null,ui:null,growth:null,ledger:new n.Pn(d),lastActive:Date.now(),toolPreset:"readonly",requestedTools:new Set,resourceVersion:0,resourceReloadPending:!1,resourceReloading:!1,promptSubmitting:!1,runActive:!1,disposed:!1,messageIds:new WeakMap};return ax.set(a,e),e}function S(a,b=(0,j.ye)(a)){let c=b.getAgentsFiles().agentsFiles.map(a=>({path:a.path,content:a.content,source:"project"})),d=b.getAppendSystemPrompt(),e=b.getAppendSystemPromptSources();return[...c,...d.map((a,b)=>({path:e[b]?.path??`Appended system prompt ${b+1}`,content:a,source:"extension"}))]}let aC="</available_skills>";async function T(a,b){let c=a.session,d={systemPrompt:0,systemTools:0,customTools:0,memory:0,skills:0,compacted:0,autoCompactBuffer:0,...c?{}:{cold:!0}},e=b.filter(a=>"project"===a.source).map(a=>a.content).join("\n\n");if(d.memory=(0,r.ec)(e),c)try{let a=c.systemPrompt??"";try{if(c.resourceLoader.getSkills().skills.length&&a){let b=a.indexOf("The following skills provide specialized instructions"),c=a.indexOf(aC);b>=0&&c>b&&(d.skills=(0,r.ec)(a.slice(b,c+aC.length)))}}catch{}for(let b of(d.systemPrompt=Math.max(0,(0,r.ec)(a)-d.memory-d.skills),c.getAllTools())){let a=(0,r.ec)(JSON.stringify({name:b.name,description:b.description,parameters:b.parameters,promptGuidelines:b.promptGuidelines}));b.sourceInfo?.source==="builtin"?d.systemTools+=a:d.customTools+=a}}catch{}else try{let b=(0,j.v9)(a.cwd)??(0,j.ye)(a.cwd);d.skills=(0,r.ec)((0,i.formatSkillsForPrompt)(b.getSkills().skills).trim())}catch{}try{let b=a.sm.getEntries();for(let a=b.length-1;a>=0;a-=1){let c=b[a];if(c?.type==="compaction"&&"string"==typeof c.summary){d.compacted=(0,r.ec)(c.summary);break}}}catch{}try{let a=await (0,s.J0)();a.compaction.enabled&&(d.autoCompactBuffer=a.compaction.reserveTokens)}catch{}return d}function U(a){a.breakdownQueued||a.disposed||(a.breakdownQueued=!0,queueMicrotask(()=>{if(a.breakdownQueued=!1,a.disposed)return;let b=[];try{b=S(a.cwd,a.session?.resourceLoader)}catch{}T(a,b).then(b=>{a.disposed||E(a,{type:"context_breakdown",breakdown:b,ts:Date.now()})},()=>void 0)}))}function V(a,b,c){let d=a.ledger.entries[0]?.ts??Date.now(),e=[];b?.systemPrompt&&e.push({seq:-1,kind:"system",ts:d,title:"Initial System Prompt",detail:b.systemPrompt});try{(c??S(a.cwd,a.session?.resourceLoader)).forEach((a,b)=>e.push({seq:-2-b,kind:"context",ts:d,title:a.path,detail:a.content}))}catch{}return e}function W(a,b){for(let c of V(a,b))E(a,{type:"traj",entry:c,ts:Date.now()})}async function X(a){if(a.disposed)throw Error("session is disposed");return a.creating?a.creating:a.session?a.session:(a.creating=(async()=>{let b;await (0,j.Df)(a.cwd);let c=await (0,j.Yb)(a.cwd);try{var d,f;let g,l;if(a.disposed)throw Error("session is disposed");let{session:m}=await (0,j.az)({cwd:a.cwd,agentDir:(0,j.$M)(),sessionManager:a.sm,modelRuntime:await (0,j.uU)(),resourceLoader:c,settingsManager:(0,j.vT)(a.cwd)});if(b=m,a.disposed)throw Error("session is disposed");a.session=m,a.requestedTools=new Set(m.getActiveToolNames()),d=a,g=(f=m).setActiveToolsByName.bind(f),aD.set(f,g),f.setActiveToolsByName=a=>{let b=[...new Set(a)];for(let a of ac(f))b.includes(a)||d.requestedTools.delete(a);for(let a of b)d.requestedTools.add(a);let c=Z(d,f);g(b.filter(a=>c.includes(a)))},l=f.reload.bind(f),f.reload=async a=>{if(d.disposed)throw Error("session is disposed");if(Y(d))throw Error("session is busy");d.resourceReloading=!0;try{await (0,j.YW)(async()=>{if(d.disposed||d.runActive||!f.isIdle)throw Error("session is busy");await l({beforeSessionStart:async()=>{for(let a of ac(f))d.requestedTools.add(a);$(d,f),await a?.beforeSessionStart?.(),$(d,f)}})}),d.resourceVersion=(0,j.Ec)(d.cwd)}finally{$(d,f),d.resourceReloading=!1,d.disposed||(aa(d,f),W(d,f),ag(d))}},$(a,m),m.subscribe(b=>{a.disposed||function(a,b){a.ledger.onEvent(b),L(a).onEvent(b);let c=Date.now();switch(b.type){case"message_start":{let d=b.message,e=y(a,d);"assistant"===e.role&&(a.inflight=d,a.inflightId=e.streamId,a.inflightIndex=a.session?.messages.length,e.stopReason="pending",e.content=e.content.map(a=>"text"===a.type?{...a,text:""}:"thinking"===a.type?{...a,thinking:""}:a)),("user"===e.role||"assistant"===e.role)&&E(a,{type:"message",message:e,phase:"start",ts:c});break}case"message_update":{let d=b.assistantMessageEvent;if(b.message&&(a.inflight=b.message,a.inflightId&&a.messageIds.set(b.message,a.inflightId)),!d)break;"text_delta"===d.type&&"string"==typeof d.delta?E(a,{type:"delta",kind:"text",contentIndex:d.contentIndex,delta:d.delta,messageId:a.inflightId,ts:c}):"thinking_delta"===d.type&&"string"==typeof d.delta&&E(a,{type:"delta",kind:"thinking",contentIndex:d.contentIndex,delta:d.delta,messageId:a.inflightId,ts:c});break}case"message_end":{let d,e,f=b.message;f?.role==="assistant"&&(a.inflightId&&a.messageIds.set(f,a.inflightId),a.inflight=null,a.inflightId=void 0,a.inflightIndex=void 0),d=aA.get(a)??[],e={events:null},d.push(e),aA.set(a,d),queueMicrotask(()=>{e.events=(()=>{let b=y(a,f);"assistant"===b.role&&(b.endedAt=c);let d=J(a);return d?[{type:"message",message:b,phase:"end",ts:c},d]:[{type:"message",message:b,phase:"end",ts:c}]})(),C(a)});break}case"tool_execution_start":b.toolName?.toLowerCase()==="write"&&function(a,b,c,d){let{target:f}=A(d);if(f)try{let d=h().isAbsolute(f)?f:h().resolve(a,f),g=(0,e.statSync)(d);if(!g.isFile()||g.size>524288)return;let i=(0,e.readFileSync)(d,"utf8");if(i.includes("\0"))return;az.size>=256&&az.delete(az.keys().next().value),az.set(`${b}\u0000${c}`,i)}catch{}}(a.cwd,a.sessionPath,b.toolCallId,b.args),E(a,{type:"tool",id:b.toolCallId,name:b.toolName,args:b.args,state:"running",ts:c});break;case"tool_execution_update":{let d=(0,p.R)(B(b.partialResult)??"");E(a,{type:"tool",id:b.toolCallId,name:b.toolName,state:"running",partialResult:d.text||void 0,encodingLoss:d.encodingLoss||void 0,ts:c});break}case"tool_execution_end":{let d=(0,p.R)(B(b.result)??"");E(a,{type:"tool",id:b.toolCallId,name:b.toolName,args:b.args,state:"done",result:d.text||void 0,isError:b.isError,encodingLoss:d.encodingLoss||void 0,patch:z(b.result?.details)??(b.toolName?.toLowerCase()==="write"?function(a,b,c,d){let e=`${b}\u0000${c}`,f=az.get(e);if(az.delete(e),void 0===f)return;let{target:g,content:h}=A(d);if(void 0!==h&&h!==f)try{return(0,i.generateUnifiedPatch)(g,f,h).slice(0,6e4)}catch{return}}(a.cwd,a.sessionPath,b.toolCallId,b.args):void 0),ts:c}),K(a);break}case"agent_start":a.runActive=!0,E(a,{type:"status",isStreaming:!0,state:"running",ts:c});break;case"agent_end":K(a);break;case"agent_settled":a.runActive=!1,E(a,{type:"status",isStreaming:!1,state:"idle",ts:c}),K(a),a.resourceReloadPending&&queueMicrotask(()=>void ah(a));break;case"queue_update":E(a,{type:"queue",steering:[...b.steering],followUp:[...b.followUp],ts:c});break;case"compaction_start":E(a,{type:"status",isStreaming:!0,state:"compacting",ts:c}),E(a,{type:"compaction",phase:"start",reason:b.reason,ts:c});break;case"compaction_end":E(a,{type:"compaction",phase:"end",reason:b.reason,errorMessage:b.errorMessage,ts:c}),K(a),U(a),"manual"===b.reason&&(E(a,{type:"status",isStreaming:Y(a),state:Y(a)?"running":"idle",ts:c}),a.resourceReloadPending&&queueMicrotask(()=>void ah(a)));break;case"session_info_changed":E(a,{type:"name",name:b.name??"",ts:c});break;case"thinking_level_changed":a.session?F(a,a.session):E(a,{type:"model",thinkingLevel:b.level,ts:c});break;case"auto_retry_start":E(a,{type:"retry",attempt:Number(b.attempt)||0,maxAttempts:Number(b.maxAttempts)||0,message:String(b.errorMessage??""),ts:c})}for(let b of a.ledger.drainDirty())E(a,{type:"traj",entry:b,ts:Date.now()})}(a,b)});let n=(0,k.X)({publish:b=>E(a,b),hasViewers:()=>!a.disposed&&ap(a)});if(a.ui=n,await m.bindExtensions({mode:"rpc",uiContext:n.uiContext,onError:b=>{E(a,{type:"error",message:`扩展 ${b.extensionPath.split(/[\\/]/).pop()} 在 ${b.event} 出错:${b.error}`,ts:Date.now()})},abortHandler:()=>void m.abort().catch(()=>void 0)}),a.disposed)throw Error("session is disposed");return $(a,m),a.resourceVersion=(0,j.Ec)(a.cwd),W(a,m),aa(a,m),ag(a),K(a),m}catch(e){a.ui?.dispose(),a.ui=null;let d=c.getExtensions().runtime;throw b?_(b).finally(()=>d.invalidate()):d.invalidate(),a.session=null,e}})().catch(b=>{throw a.disposed||E(a,{type:"error",message:String(b?.message??b),ts:Date.now()}),b}).finally(()=>{a.creating=null}),a.creating)}function Y(a){return a.promptSubmitting||a.resourceReloading||a.runActive||!!(a.session&&!a.session.isIdle)}function Z(a,b){let c=a.customActiveTools;return ab(b).filter(b=>c?c.includes(b):(0,j.YQ)(a.toolPreset,b))}let aD=new WeakMap;function $(a,b){let c=function(a,b){let c=Z(a,b);if(a.customActiveTools)return c;let d=new Set(b.getAllTools().filter(a=>("direct"===a.exposure||"model-only"===a.exposure)&&b.getToolDefinition(a.name)?.defaultActive!==!1).map(a=>a.name));return c.filter(b=>d.has(b)||a.requestedTools.has(b))}(a,b);(aD.get(b)??b.setActiveToolsByName.bind(b))(c)}let aE=new WeakMap;function _(a){let b,c=aE.get(a);if(c)return c;try{a.agent.abort()}catch{}let d=Promise.resolve();try{let b=a.extensionRunner;b.hasHandlers("session_shutdown")&&(d=b.emit({type:"session_shutdown",reason:"quit"}))}catch{}let e=new Promise(a=>{b=setTimeout(a,5e3),b.unref?.()}),f=Promise.race([d.then(()=>void 0,()=>void 0),e]).finally(()=>{clearTimeout(b);try{a.dispose()}catch{}});return aE.set(a,f),f}function aa(a,b){E(a,{type:"tools",active:ac(b),all:ab(b),toolPreset:a.toolPreset,customActiveTools:a.customActiveTools??null,ts:Date.now()}),U(a)}function ab(a){let b=a.getAllTools?.();return b?b.map(a=>a.name):[]}function ac(a){return a.getActiveToolNames?.()??[]}function ad(a){if(!a.disposed){for(let b of(a.disposed=!0,a.ui?.dispose(),a.ui=null,a.growth?.dispose(),a.growth=null,a.session&&_(a.session),a.creating&&a.creating.then(a=>a?_(a):void 0).catch(()=>void 0),a.subscribers))try{b(a.seq,JSON.stringify({type:"status",isStreaming:!1,state:"disposed",ts:Date.now()}))}catch{}a.subscribers.clear(),ax.delete(a.sessionPath)}}async function ae(a){let b=ax.get(a);if(!b)return;let c=b.session??(b.creating?await b.creating.catch(()=>null):null);c?.isStreaming&&await c.abort().catch(()=>void 0),ad(b)}{let a=globalThis;a.__piWebReaper&&clearInterval(a.__piWebReaper),a.__piWebReaper=setInterval(function(){let a=Date.now();for(let b of[...ax.values()])!ap(b)&&!(a-b.lastActive<=6e5)&&(b.creating||Y(b)||ad(b));let b=[...ax.values()].filter(a=>a.session);if(b.length>6)for(let a of b.filter(a=>!a.creating&&!Y(a)&&!ap(a)).sort((a,b)=>a.lastActive-b.lastActive).slice(0,b.length-6))ad(a)},6e4),a.__piWebReaper.unref?.()}function af(a){let b=a.session?.resourceLoader??(0,j.v9)(a.cwd)??(0,j.ye)(a.cwd),c=[],d=[];try{let a=b.getSkills();for(let b of(d=a.skills.map(a=>({name:String(a.name??""),description:String(a.description??"")})),a.diagnostics??[]))c.push({kind:"skill",path:b.path,message:b.message})}catch{d=[]}let e=[];try{let a=b.getPrompts();for(let b of(e=a.prompts.map(a=>({name:String(a.name??""),description:String(a.description??""),argumentHint:a.argumentHint})),a.diagnostics??[]))c.push({kind:"prompt",path:b.path,message:b.message})}catch{e=[]}try{for(let a of b.getExtensions().errors??[])c.push({kind:"extension",path:a.path,message:a.error})}catch{}let f=[];if(a.session)try{let b=a.session.extensionRunner;if(b)for(let a of(f=b.getRegisteredCommands().map(a=>({name:a.invocationName,description:String(a.description??""),source:String(a.sourceInfo?.path??"").split(/[\\/]/).pop()??""})),b.getCommandDiagnostics()??[]))c.push({kind:"command",path:a.path,message:a.message})}catch{f=[]}return{skills:d,promptTemplates:e,extensionCommands:f,projectTrust:(0,j.af)(a.cwd),resourceDiagnostics:c}}function ag(a){E(a,{type:"resources",...af(a),ts:Date.now()}),U(a)}async function ah(a){if(a.disposed||!a.session||a.creating||Y(a))return!1;a.resourceReloadPending=!1;try{await a.session.reload();let b=a.session.model,c=b&&a.session.modelRuntime.getModel(b.provider,b.id);return c&&c!==b&&(a.session.agent.state.model=c),!0}catch(b){return E(a,{type:"error",message:`重载扩展失败:${String(b?.message??b)}`,ts:Date.now()}),!1}finally{a.resourceReloadPending&&!Y(a)&&queueMicrotask(()=>void ah(a))}}async function ai(a){let b=a=>"win32"===process.platform?a.replace(/\\/g,"/").toLowerCase():a.replace(/\\/g,"/"),c=0;for(let d of ax.values())if(!a||b(d.cwd)===b(a)){if(!d.session){ap(d)&&ag(d);continue}if(d.creating||Y(d)){d.resourceReloadPending=!0,E(d,{type:"error",message:"资源已更新,将在本轮结束后生效",ts:Date.now()}),ag(d);continue}await ah(d)&&(c+=1)}return c}async function aj(a){let b,c,d,e;O(a),await (0,j.Df)(a.cwd);try{a.session&&Y(a)?((0,j.Dc)(a.cwd)||a.resourceVersion!==(0,j.Ec)(a.cwd))&&(a.resourceReloadPending=!0):(await (0,j.jz)(a.cwd),a.session&&(a.resourceReloadPending||a.resourceVersion!==(0,j.Ec)(a.cwd))&&(a.resourceReloadPending=!0,await ah(a)))}catch{}let f=a.session,g=[],h=!1,i=["off","minimal","low","medium","high","xhigh","max"];if(f){let e=function(a,b){if(!a.inflightId||void 0===a.inflightIndex)return!1;let c=b.messages[a.inflightIndex];return!!c&&"assistant"===c.role&&(a.messageIds.set(c,a.inflightId),!0)}(a,f);if(g=f.messages.map(b=>y(a,b)),!e&&a.inflight){let b=y(a,a.inflight);"assistant"===b.role&&g.push({...b,stopReason:"pending"})}b=a.seq;let j=f.model;j&&(c={provider:String(j.provider??""),id:String(j.id??""),name:String(j.name??j.id??"")}),d=String(f.thinkingLevel??"");try{i=f.getAvailableThinkingLevels()}catch{}h=Y(a)}else{try{g=a.sm.buildContextEntries().filter(a=>"message"===a.type&&a.message).map(a=>x(a.message,a.id))}catch{g=[]}try{let b=a.sm,e=b.buildSessionContext?.();if(e?.model&&(c={provider:e.model.provider,id:e.model.modelId,name:e.model.modelId}),d=e?.thinkingLevel,e?.model){let a=(await (0,j.uU)()).getModel(e.model.provider,e.model.modelId);a&&(i=(0,u.getSupportedThinkingLevels)(a),d&&(d=(0,u.clampThinkingLevel)(a,d)))}}catch{}}let k=f?I(a):function(a){let b=0,c=0,d=0,e=0,f={input:0,output:0,cacheRead:0,cacheWrite:0,total:0},g=0,h=a=>{a&&"object"==typeof a&&(f.input+=Number(a.input??0),f.output+=Number(a.output??0),f.cacheRead+=Number(a.cacheRead??0),f.cacheWrite+=Number(a.cacheWrite??0),g+=Number(a.cost?.total??0))};for(let f of a.sm.getEntries()){if(("branch_summary"===f.type||"compaction"===f.type)&&f.usage&&h(f.usage),"message"!==f.type||!f.message)continue;e+=1;let a=f.message;"user"===a.role?b+=1:"assistant"===a.role?(c+=1,d+=Array.isArray(a.content)?a.content.filter(a=>a?.type==="toolCall").length:0,h(a.usage)):"toolResult"===a.role&&h(a.usage)}return f.total=f.input+f.output+f.cacheRead+f.cacheWrite,{userMessages:b,assistantMessages:c,toolCalls:d,totalMessages:e,tokens:f,cost:g,...H(a)}}(a),l=null;if(f){let a=f.getContextUsage()??null;l=a?{tokens:a.tokens,contextWindow:a.contextWindow,percent:a.percent}:null}else if(c)try{let b=(await (0,j.uU)()).getModels(c.provider).find(a=>String(a.id)===c.id),d=Number(b?.contextWindow??0),e=0,f=a.sm.getEntries(),h=!1;for(let a=f.length-1;a>=0;a--){let b=f[a];if("compaction"===b.type||"branch_summary"===b.type){h=!0;break}if("message"===b.type&&b.message?.role==="assistant"&&"error"!==b.message.stopReason&&"aborted"!==b.message.stopReason)break}for(let a=g.length-1;a>=0&&!h;a--){let b=g[a];if("assistant"===b.role&&b.usage){e=Number(b.usage.input??0)+Number(b.usage.cacheRead??0)+Number(b.usage.cacheWrite??0)+Number(b.usage.output??0);break}}d>0&&e>0?l={tokens:e,contextWindow:d,percent:e/d*100}:d>0&&(l={tokens:null,contextWindow:d,percent:null})}catch{}let o=f?{active:ac(f),all:ab(f).map(a=>({name:a}))}:{active:[],all:[]},p=f?{steering:[...f.getSteeringMessages()],followUp:[...f.getFollowUpMessages()]}:{steering:[],followUp:[]},q="";try{q=a.sm.getSessionName?.()??""}catch{q=""}let r=[],s=!1;try{r=S(a.cwd,a.session?.resourceLoader),s=!0}catch{r=[]}try{e=await T(a,r)}catch{e=void 0}let t=af(a),v=a.ledger.entries.length?a.ledger.entries:function(a){try{return(0,n.WZ)(a.sm.getEntries())}catch{return[]}}(a),w=[...V(a,f,s?r:void 0),...v];return{seq:b??a.seq,sessionPath:a.sessionPath,cwd:a.cwd,name:q,contextFiles:r.map(a=>a.path),contextResources:r,contextBreakdown:e,...t,messages:g,userTurns:(0,m.g)(a.sm.getEntries()),growthError:a.growth?.getError?.()??null,growthConsent:a.growth?.getConsentRequest?.()??null,model:c,thinkingLevel:d,thinkingLevels:i,toolPreset:a.toolPreset,customActiveTools:a.customActiveTools??null,extensionUiRequests:a.ui?.getPendingRequests()??[],extensionStatuses:Object.fromEntries(a.ui?.statuses??[]),tools:o,stats:k,contextUsage:l,queue:p,trajectory:w,isStreaming:h}}function ak(a,b){return`${a.epoch}.${b}`}function al(a,b){let c=/^([A-Za-z0-9]+)\.(\d+)$/.exec(b?.trim()??"");if(!c||c[1]!==a.epoch)return;let d=Number(c[2]);return Number.isSafeInteger(d)?d:void 0}function am(a,b,c){if(O(a),c<0||c>a.seq)return!1;let d=a.buffer.filter(a=>a.seq>c);if(d.length!==a.seq-c)return!1;let e=new Set(a.ui?.getPendingRequests().map(a=>a.id));if(d.some(a=>{let b=JSON.parse(a.json);return"extension_ui"===b.type&&["select","confirm","input"].includes(b.method)&&!e.has(b.id)}))return!1;for(let c of(a.subscribers.add(b),d))b(c.seq,c.json);return!0}function an(a,b){a.subscribers.delete(b)}function ao(a,b){a.viewerGraceUntil=Math.max(a.viewerGraceUntil??0,Date.now()+b)}function ap(a){return a.subscribers.size>0||(a.viewerGraceUntil??0)>Date.now()}async function aq(a){await Promise.race([L(a).prepare().catch(()=>void 0),new Promise(a=>setTimeout(a,5e3))])}function ar(a,b,c,d={}){return new Promise(e=>{let f=!1;b.prompt(c,{...d,source:"rpc",preflightResult:a=>{a&&(f=!0,e({ok:!0,data:{accepted:!0}}))}}).then(()=>{f||e({ok:!1,error:"prompt completed without acceptance"})},b=>{let c=String(b?.message??b);f?E(a,{type:"error",message:c,ts:Date.now()}):e({ok:!1,error:c})})})}async function as(a,b){O(a);try{switch(b.cmd){case"prepare":return await X(a),{ok:!0};case"prompt":{let c=(b.text??"").trim();if(!c&&!b.images?.length)return{ok:!1,error:"empty prompt"};if(a.promptSubmitting||a.resourceReloading)return{ok:!1,error:"session is busy accepting another command"};a.promptSubmitting=!0;try{let d=await X(a);if(a.disposed)throw Error("session is disposed");if((d.isStreaming||a.runActive)&&!b.behavior)return{ok:!1,error:"session is busy; choose steer or followUp"};if(d.isStreaming||await aq(a),a.disposed)throw Error("session is disposed");return await ar(a,d,c,{images:b.images,streamingBehavior:b.behavior})}finally{a.promptSubmitting=!1,a.disposed||E(a,{type:"status",isStreaming:Y(a),state:Y(a)?"running":"idle",ts:Date.now()}),a.resourceReloadPending&&queueMicrotask(()=>void ah(a))}}case"steer":case"followUp":{if(a.promptSubmitting||a.resourceReloading)return{ok:!1,error:"session is busy accepting another command"};let c=await X(a);if(a.promptSubmitting||a.resourceReloading||!c.isStreaming)return{ok:!1,error:"session is not accepting queued messages"};return await c[b.cmd](b.text??"",b.images),{ok:!0}}case"clearQueue":{if(!a.session)return{ok:!0,data:{steering:[],followUp:[]}};let b=a.session.clearQueue();return E(a,{type:"queue",steering:[],followUp:[],ts:Date.now()}),{ok:!0,data:b}}case"abort":{if(!a.session)return{ok:!0,data:{steering:[],followUp:[]}};let b=a.session.clearQueue();return await a.session.abort(),E(a,{type:"status",isStreaming:!1,state:"aborted",ts:Date.now()}),{ok:!0,data:b}}case"compact":{let c=await X(a);return await c.compact(b.instructions||void 0),{ok:!0}}case"setModel":{let c=await X(a),d=(await (0,j.uU)()).getModels(b.provider).find(a=>a.id===b.modelId);if(!d)return{ok:!1,error:`unknown model ${b.provider}/${b.modelId}`};return await c.setModel(d,{persist:!1}),G(a,c),F(a,c),{ok:!0,data:{thinkingLevel:c.thinkingLevel,thinkingLevels:c.getAvailableThinkingLevels()}}}case"setThinkingLevel":{let c=await X(a),d=String(b.level??"medium"),e=(0,u.clampThinkingLevel)(c.model,d);return a.desiredThinkingLevel=d,c.setThinkingLevel(e),F(a,c),{ok:!0,data:{requested:d,thinkingLevel:c.thinkingLevel,clamped:c.thinkingLevel!==d}}}case"setToolPreset":{let c=b.preset;if(!Object.hasOwn(j.Ax,c))return{ok:!1,error:"invalid tool preset"};if(Y(a))return{ok:!1,error:"cannot change tools while the agent is running"};if(!a.session&&!a.creating)return a.toolPreset=c,a.customActiveTools=void 0,E(a,{type:"tools",active:[],all:[],toolPreset:c,customActiveTools:null,ts:Date.now()}),{ok:!0};let d=await X(a);if(Y(a))return{ok:!1,error:"cannot change tools while the agent is running"};return a.toolPreset=c,a.customActiveTools=void 0,$(a,d),W(a,d),aa(a,d),{ok:!0}}case"setActiveTools":{if(Y(a))return{ok:!1,error:"cannot change tools while the agent is running"};let c=await X(a);if(Y(a))return{ok:!1,error:"cannot change tools while the agent is running"};let d=Array.isArray(b.names)?b.names.map(String):[],e=ab(c),f=[...new Set(d)].filter(a=>e.includes(a));if(0===f.length)return{ok:!1,error:"cannot disable all tools"};return a.customActiveTools=f,$(a,c),W(a,c),aa(a,c),{ok:!0,data:{active:ac(c)}}}case"cycleModel":{let c=await X(a),d=await c.cycleModel(b.direction??"forward");if(d?.model)return G(a,c),F(a,c),{ok:!0,data:{model:String(d.model.id??""),thinkingLevel:c.thinkingLevel}};return{ok:!1,error:"no scoped models to cycle"}}case"navigate":{let c=await X(a),d=String(b.entryId??"");if(!d)return{ok:!1,error:"missing entryId"};let e=await c.navigateTree(d);return{ok:!e?.cancelled,data:{cancelled:e?.cancelled===!0,editorText:e?.editorText}}}case"editAndResend":{let c=String(b.entryId??""),d=(b.text??"").trim();if(!c)return{ok:!1,error:"missing entryId"};if(!d)return{ok:!1,error:"empty prompt"};if(a.promptSubmitting||a.resourceReloading)return{ok:!1,error:"session is busy accepting another command"};a.promptSubmitting=!0;try{let b=await X(a);if(a.disposed)throw Error("session is disposed");if(b.isStreaming||a.runActive){await b.abort().catch(()=>void 0);for(let c=0;c<50&&!a.disposed&&(b.isStreaming||a.runActive);c+=1)await new Promise(a=>setTimeout(a,100))}if(a.disposed)throw Error("session is disposed");let e=await b.navigateTree(c);if(e?.cancelled)return{ok:!1,error:"edit cancelled"};if(await aq(a),a.disposed)throw Error("session is disposed");return await ar(a,b,d)}finally{a.promptSubmitting=!1,a.disposed||E(a,{type:"status",isStreaming:Y(a),state:Y(a)?"running":"idle",ts:Date.now()}),a.resourceReloadPending&&queueMicrotask(()=>void ah(a))}}case"rename":{let c=(b.text??"").trim();return a.session?a.session.setSessionName(c):a.sm.appendSessionInfo(c),E(a,{type:"name",name:c,ts:Date.now()}),{ok:!0}}case"extensionUiResponse":return a.ui?.respond(String(b.requestId),{value:b.value,confirmed:b.confirmed,cancelled:b.cancelled})?{ok:!0}:{ok:!1,error:"no pending extension request"};case"reload":{if(Y(a))return{ok:!1,error:"session is busy"};let b=await X(a);return await b.reload(),{ok:!0}}case"fork":{let c=(b.entryId?j.Cv.open(a.sessionPath).createBranchedSession(b.entryId):j.Cv.forkFrom(a.sessionPath,a.cwd).getSessionFile())??"";if(!c)return{ok:!1,error:"failed to create forked session"};return{ok:!0,data:{sessionPath:c}}}default:return{ok:!1,error:"unknown cmd"}}}catch(a){return{ok:!1,error:String(a?.message??a)}}}async function at(a){let b=j.Cv.create(a),c=b.getSessionFile()??"";if(!c)throw Error("failed to create session file");return R(c,a,b),{sessionPath:c}}function au(){let a={};for(let[b,c]of ax){let d;if(c.session){for(let a=c.ledger.entries.length-1;a>=0;a-=1){let b=c.ledger.entries[a];if("tool"===b.kind){d=[b.toolName,(b.preview??b.title??"").split("\n")[0].slice(0,80)].filter(Boolean).join(" \xb7 ");break}}a[b]={streaming:Y(c),lastStep:d}}}return a}async function av(a,b){let d=a.sessionPath.replace(/\\/g,"/").split("/").pop()??"session";if("jsonl"===b){let{readFile:b}=await Promise.resolve().then(c.t.bind(c,51455,23));return{filename:d,content:await b(a.sessionPath,"utf8"),contentType:"application/jsonl"}}let e=await X(a),f=await e.exportToHtml(),{readFile:g,rm:h}=await Promise.resolve().then(c.t.bind(c,51455,23)),i=await g(f,"utf8");return await h(f,{force:!0}).catch(()=>void 0),{filename:d.replace(/\.jsonl$/,".html"),content:i,contentType:"text/html"}}(0,o.j8)({isActive:function(a){let b="win32"===process.platform?a.toLowerCase():a;for(let a of ax.keys())if(("win32"===process.platform?a.toLowerCase():a)===b)return!0;return!1},log:a=>console.log(a)}),d()}catch(a){d(a)}})},31374:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{j8:()=>l});var e=c(51455),f=c.n(e),g=c(76760),h=c.n(g),i=c(6896),j=a([i]);async function k({now:a=Date.now(),retentionDays:b=30,isActive:d=()=>!1,log:e=console.log,dryRun:g=!1}={}){let j={scanned:0,deleted:[],missing:[],skippedActive:[],kept:0};if(!Number.isFinite(b)||b<=0)return j;let l=a-24*b*36e5,{archivedSessions:m}=await (0,i.vQ)();for(let k of m){let m;j.scanned+=1;let n=h().resolve(k);if(d(n)){j.skippedActive.push(n),j.kept+=1;continue}try{let a=await f().stat(n);if(!a.isFile())throw Object.assign(Error("not a file"),{code:"ENOENT"});m=a.mtimeMs}catch(a){if("ENOENT"!==a.code)throw a;j.missing.push(n),g||await (0,i.Iz)(n);continue}if(m>l){j.kept+=1;continue}let o=Math.floor((a-m)/864e5);if(j.deleted.push({path:n,idleDays:o}),g)continue;let{deleteSession:p}=await c.e(229).then(c.bind(c,66229));await p(n),await (0,i.Iz)(n),e(`[piweb] 归档会话已超过 ${b} 天没有活动(${o} 天),已删除:${n}`)}return j}i=(j.then?(await j)():j)[0];let m=!1;function l({intervalMs:a=216e5,delayMs:b=5e3,log:c=console.log,isActive:d}={}){if(m)return;m=!0;let e=async()=>{Date.now();try{let a=await k({log:c,isActive:d});(a.deleted.length||a.missing.length)&&c(`[piweb] 归档清理:删除 ${a.deleted.length} 个,清理失效记录 ${a.missing.length} 个,保留 ${a.kept} 个`)}catch(a){c(`[piweb] 归档清理失败:${a instanceof Error?a.message:a}`)}},f=setTimeout(()=>{e();let b=setInterval(()=>void e(),a);b.unref?.()},b);f.unref?.()}d()}catch(a){d(a)}})},34007:(a,b,c)=>{function d(a){let b=[];for(let[c,d]of a.entries()){if("message"!==d.type||d.message?.role!=="user")continue;let a="number"==typeof d.timestamp?d.timestamp:Date.parse(d.timestamp??""),e=Number.isFinite(a)?a:d.message.timestamp;b.push({id:d.id??`entry:${c}`,ts:"number"==typeof e&&Number.isFinite(e)?e:NaN})}return b}function e(a,b=0){let c=[],d="";for(let e of a.slice(Math.max(0,b)))if("message"===e.type&&e.message?.role==="user"&&e.id){var f;c.push(e.id),d||(d=("string"==typeof(f=e.message.content)?f:!Array.isArray(f)?"":f.map(a=>a&&"object"==typeof a&&"text"===a.type?String(a.text??""):"").join("")).split("\n").map(a=>a.trim()).find(Boolean)??"")}return{ids:c,title:d}}c.d(b,{S:()=>e,g:()=>d})},34070:(a,b,c)=>{c.d(b,{ec:()=>d});function d(a){return Math.ceil(a.length/4)}},35851:(a,b,c)=>{c.d(b,{I:()=>f,k:()=>g});var d=c(83188),e=c(34007);let f=5;function g(a){let{cwd:b,sessionPath:c,publish:g,entries:h,consent:i}=a,j=!1,k=null,l=!1,m=0,n=!1,o=null,p=Promise.resolve(),q=null,r=0,s=!1,t=null,u=a=>{let c=a instanceof Error?a.message:String(a),e=a instanceof d.qy&&("unavailable"===a.code||"too-large"===a.code);e&&(j=!0,k=a,q=null),n=!0,o=c;let f=Date.now();(e||!(f-m<6e4))&&(m=f,console.warn(`[piweb] growth commit failed for ${b}: ${c}`),g({type:"growth_error",message:c,ts:f}))},v=a=>p=p.then(a,a).catch(u),w=a=>(n&&(n=!1,o=null,g({type:"growth_error",message:null,ts:Date.now()})),a&&!l&&g({type:"growth",round:a,ts:Date.now()}),a),x=()=>{j=!0,k=new d.qy("growth tracking was declined for this workspace","unavailable"),q=null},y=async(a,c)=>{let e=s?await i():null;if(!1===e)return void x();if(!s||null!==e)try{return await a({allowInit:!0===e,abortIf:c})}catch(f){if(!(f instanceof d.qy)||"needs-consent"!==f.code)throw f;s=!0;let e=await i();if(!1===e)return void x();if(!0===e)return a({allowInit:!0,abortIf:c});t||l||g({type:"growth_consent",request:t={cwd:b,reason:f.target?.reason??"not-git",parent:f.target?.parent},ts:Date.now()});return}},z=a=>y(a=>(0,d.uP)(b,c,a),a);return{version:f,getError:()=>o,getConsentRequest:()=>t,prepare(){if(j||l)return p;let a=r;return v(async()=>{if(j||l)return;let b=await z(()=>r!==a);void 0!==b&&w(b)})},onEvent(a){if(!l&&!j)switch(a.type){case"agent_start":null===q&&(q=h().length,r+=1);break;case"agent_settled":{if(null===q)break;let a=h().slice(q),{ids:f,title:g}=(0,e.S)(a);q=null,v(async()=>{if(j||l)return;let e=await y(e=>(0,d.qo)(b,{kind:"round",session:c,title:g,promptIds:f,status:function(a){for(let b=a.length-1;b>=0;b-=1){let c="message"===a[b].type?a[b].message:void 0;if(c?.role==="assistant"){if("aborted"===c.stopReason)return"aborted";if("error"===c.stopReason)return"error";break}}return"done"}(a)},e));void 0!==e&&w(e)})}}},async recordNow(){let a;if(j)throw k??new d.qy("growth tracking is disabled for this workspace","unavailable");let b=null;if(await v(async()=>{try{if(j)throw k??new d.qy("growth tracking is disabled for this workspace","unavailable");let a=await z();if(void 0===a)throw j?k??new d.qy("growth tracking is disabled for this workspace","unavailable"):new d.qy("growth tracking is waiting for permission to create a git repository","needs-consent");b=w(a)}catch(b){a=b,b instanceof d.qy&&"needs-consent"===b.code||u(b)}}),a)throw a;return b},async consentAnswered(a){let b=t;if(t=null,b&&!l&&g({type:"growth_consent",request:null,ts:Date.now()}),!a)return x(),null;if(j||l)return null;let c=null;return await v(async()=>{let a=await z();c=void 0===a?null:w(a)}),c},dispose(){l=!0}}}},49904:(a,b,c)=>{c.d(b,{Ax:()=>k,Jt:()=>m,_i:()=>l});var d=c(51455),e=c.n(d),f=c(76760),g=c.n(f),h=c(80974),i=c.n(h);let j=new Map;function k(a,b){let c=g().resolve(a),d="win32"===process.platform?c.toLowerCase():c,e=(j.get(d)??Promise.resolve()).then(b,b),f=e.then(()=>void 0,()=>void 0);return j.set(d,f),f.then(()=>{j.get(d)===f&&j.delete(d)}),e}async function l(a,b){await e().mkdir(g().dirname(a),{recursive:!0});let c=await i().lock(a,{realpath:!1,retries:{retries:20,minTimeout:20,maxTimeout:100}});try{return await b()}finally{await c()}}async function m(a){await a.flush();let b=a.drainErrors();if(b.length)throw Error(`Pi settings failed: ${b.map(({scope:a,error:b})=>`${a}: ${b.message}`).join("; ")}`,{cause:b[0].error})}},75554:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{DY:()=>s,Gh:()=>x,J0:()=>r,MO:()=>p});var e=c(51455),f=c.n(e),g=c(76760),h=c.n(g),i=c(77598),j=c(86159),k=c(87982),l=c(49904),m=a([k]);k=(m.then?(await m)():m)[0];let t=16384,u=2e4,v=3,w=2e3;function n(){return h().join((0,k.$M)(),"settings.json")}async function o(){return(0,j.op)(n())}async function p(){let a=(await o()).enabledModels;return!Array.isArray(a)||a.some(a=>"string"!=typeof a)?null:a}function q(a,b){let c=a[b];return c&&"object"==typeof c&&!Array.isArray(c)?c:{}}async function r(){let a=await o(),b=a.compaction??{},c=a.retry??{},d=(a,b)=>"number"==typeof a&&Number.isSafeInteger(a)&&a>=0?a:b;return{compaction:{enabled:!1!==b.enabled,reserveTokens:d(b.reserveTokens,t),keepRecentTokens:d(b.keepRecentTokens,u)},retry:{enabled:!1!==c.enabled,maxRetries:d(c.maxRetries,v),baseDelayMs:d(c.baseDelayMs,w)}}}class x extends Error{}async function s(a){let b=function(a){if(!a||"object"!=typeof a||Array.isArray(a))throw new x("invalid settings patch");if(Object.keys(a).some(a=>"compaction"!==a&&"retry"!==a))throw new x("unknown settings field");let b={};for(let c of["compaction","retry"]){if(void 0===a[c])continue;let d=a[c];if(!d||"object"!=typeof d||Array.isArray(d))throw new x(`invalid ${c} settings`);let e="compaction"===c?["enabled","reserveTokens","keepRecentTokens"]:["enabled","maxRetries","baseDelayMs"];for(let[a,b]of Object.entries(d)){if(!e.includes(a))throw new x(`unknown ${c} field: ${a}`);if("enabled"===a){if("boolean"!=typeof b)throw new x(`${c}.${a} must be boolean`)}else if("number"!=typeof b||!Number.isSafeInteger(b)||b<0||b>1e9)throw new x(`${c}.${a} must be a non-negative integer`)}"compaction"===c?b.compaction=d:b.retry=d}return b}(a),c=n();await (0,l.Ax)(c,()=>(0,l._i)(c,async()=>{let a=await (0,j.mu)(c);b.compaction&&(a.compaction={...q(a,"compaction"),...b.compaction}),b.retry&&(a.retry={...q(a,"retry"),...b.retry}),await f().mkdir(h().dirname(c),{recursive:!0});let d=`${c}.${process.pid}.${(0,i.randomUUID)()}.tmp`;try{await f().writeFile(d,JSON.stringify(a,null," "),"utf8"),await f().rename(d,c)}finally{await f().rm(d,{force:!0}).catch(()=>void 0)}(0,j.Ix)(c)})),await (0,k.BW)()}d()}catch(a){d(a)}})},92584:(a,b,c)=>{c.d(b,{V:()=>e});var d=c(76760);let e=c.n(d)().resolve(process.env.PI_WEB_ROOT??process.cwd())}};
@@ -1 +1 @@
1
- "use strict";exports.id=807,exports.ids=[807],exports.modules={24807:(a,b,c)=>{c.d(b,{registerNode:()=>d});async function d(){if("phase-production-build"===process.env.NEXT_PHASE)return;let{authEnabled:a}=await c.e(393).then(c.bind(c,75393));a()&&(await c.e(802).then(c.bind(c,95802))).publishLaunchToken();let{remoteBlocked:b,remoteLanEnabled:d,startLan:e}=await c.e(924).then(c.bind(c,3924));if(!d())return;let f=b();if("auth"===f)return void console.warn("[远程连接] 已跳过局域网入口:认证没开。请设 PI_WEB_AUTH=1。");if("dev"===f)return void console.warn("[远程连接] 已跳过局域网入口:开发模式只服务本机(认证保护不了 Next 开发工具端点)。");let g=await e();g.running?console.log(`[远程连接] 局域网入口已就绪:${g.urls.join(" ")}`):console.warn(`[远程连接] 局域网入口启动失败:${g.error}`)}}};
1
+ "use strict";exports.id=807,exports.ids=[807],exports.modules={24807:(a,b,c)=>{c.d(b,{registerNode:()=>d});async function d(){if("phase-production-build"===process.env.NEXT_PHASE)return;let{authEnabled:a}=await c.e(393).then(c.bind(c,75393));a()&&(await c.e(802).then(c.bind(c,95802))).publishLaunchToken(),(await c.e(662).then(c.bind(c,47662))).ensureStartupCheck().catch(()=>{});let{remoteBlocked:b,remoteLanEnabled:d,startLan:e}=await c.e(924).then(c.bind(c,3924));if(!d())return;let f=b();if("auth"===f)return void console.warn("[远程连接] 已跳过局域网入口:认证没开。请设 PI_WEB_AUTH=1。");if("dev"===f)return void console.warn("[远程连接] 已跳过局域网入口:开发模式只服务本机(认证保护不了 Next 开发工具端点)。");let g=await e();g.running?console.log(`[远程连接] 局域网入口已就绪:${g.urls.join(" ")}`):console.warn(`[远程连接] 局域网入口启动失败:${g.error}`)}}};
@@ -1,6 +1,6 @@
1
- "use strict";exports.id=924,exports.ids=[393,924],exports.modules={1175:(a,b,c)=>{c.d(b,{Fu:()=>h}),c(77598),c(73024);var d=c(48161),e=c.n(d),f=c(76760),g=c.n(f);function h(){let a=process.env.PI_CODING_AGENT_DIR;if(a)return"~"===a?e().homedir():a.startsWith("~/")||a.startsWith("~\\")?g().join(e().homedir(),a.slice(2)):a;return g().join(e().homedir(),".pi","agent")}},3924:(a,b,c)=>{c.d(b,{remoteBlocked:()=>p,remoteLanEnabled:()=>s,startLan:()=>u}),c(31421),c(73024),c(44708);var d=c(48161),e=c.n(d);c(76760);var f=c(75393);c(1175);var g=c(37067),h=c.n(g),i=c(57075),j=c(38522),k=c.n(j);c(77030);let l=JSON.parse('{"A":"/*\\n * 手机端适配。不改 PiWeb,只在经代理的远程页面上生效\\n * (本机直连 127.0.0.1:30141 的桌面页面完全不加载它)。\\n *\\n * 取值参照 dsh-remote 为 DSH 定的那套移动适配(同作者),并针对 PiWeb 的实测问题:\\n * 390px 下输入框 304px、markdown 表格 442px 超出视口、底部统计行被截断。\\n */\\n@media (max-width: 840px) {\\n\\t/* 1) 输入框自适应高度失控。\\n\\t 实测:视口 390 → 304px,500 → 43px,700+ → 22px;而自然内容高始终 22px。\\n\\t 原因在 ChatInput 的 autoSize():它把\\"被 flex 拉伸后\\"的 scrollHeight 写进了\\n\\t inline height,写回后又把自己撑住,形成自锁。inline 样式不是 important,\\n\\t 所以这里用 max-height !important 把它夹住。 */\\n\\ttextarea {\\n\\t\\tmax-height: 132px !important;\\n\\t\\toverflow-y: auto !important;\\n\\t}\\n\\n\\t/* 2) Markdown 宽表格超出视口被裁掉(实测 442 > 390,body 又是 overflow-x:hidden,\\n\\t 等于右侧内容既看不到也滑不到)。让表格自己横向滚动。 */\\n\\t.md table {\\n\\t\\tdisplay: block !important;\\n\\t\\tmax-width: 100% !important;\\n\\t\\toverflow-x: auto !important;\\n\\t\\t-webkit-overflow-scrolling: touch;\\n\\t}\\n\\n\\t/* 3) 全局溢出护栏(dsh-remote 同款):任何一块都不许把文档撑宽 */\\n\\thtml,\\n\\tbody {\\n\\t\\tmax-width: 100vw !important;\\n\\t\\toverflow-x: hidden !important;\\n\\t}\\n\\tpre {\\n\\t\\tmax-width: 100% !important;\\n\\t\\toverflow-x: auto !important;\\n\\t\\t-webkit-overflow-scrolling: touch;\\n\\t}\\n\\timg,\\n\\tsvg,\\n\\tvideo,\\n\\tcanvas {\\n\\t\\tmax-width: 100% !important;\\n\\t}\\n\\n\\t/* 4) 底部统计行原本 nowrap + ellipsis,手机上「| 输入 2…」之后永远看不到。\\n\\t 改成可横向滑动,滚动条隐藏,信息不再丢。 */\\n\\tdiv.text-center > div.overflow-hidden.text-ellipsis.whitespace-nowrap {\\n\\t\\toverflow-x: auto !important;\\n\\t\\toverflow-y: hidden !important;\\n\\t\\ttext-overflow: clip !important;\\n\\t\\t-webkit-overflow-scrolling: touch;\\n\\t\\tscrollbar-width: none;\\n\\t}\\n\\tdiv.text-center > div.overflow-hidden.text-ellipsis.whitespace-nowrap::-webkit-scrollbar {\\n\\t\\tdisplay: none;\\n\\t}\\n\\n\\t/* 5) 给手机的手势条留位置(没有 insets 的设备 env() 为 0,等于没写) */\\n\\t.pi-main {\\n\\t\\tpadding-bottom: env(safe-area-inset-bottom) !important;\\n\\t}\\n\\n\\t/* 6) 左上角的抽屉按钮。原来是个悬浮的圆角方块(12px/12px、34px),盖在内容上、\\n\\t 和右边那排图标也不在一条水平线上。按 dsh-remote 对 DSH 左侧的做法收成贴角圆形,\\n\\t 尺寸和位置改成与右侧图标完全一致(实测右侧图标是 top 12 / 30\xd730,中心 y=27),\\n\\t 这样整行对齐,按钮底边 42 也在头部分隔线(y=43)之上,不会压住那条线。 */\\n\\t.pi-mobile-menu {\\n\\t\\twidth: 30px !important;\\n\\t\\theight: 30px !important;\\n\\t\\tborder-radius: 999px !important;\\n\\t\\tleft: calc(env(safe-area-inset-left) + 12px) !important;\\n\\t\\ttop: calc(env(safe-area-inset-top) + 12px) !important;\\n\\t}\\n\\t.pi-main > .hairline-b {\\n\\t\\tpadding-left: 52px !important;\\n\\t}\\n\\n\\t/* 7) 右侧大纲导轨是绝对定位的(right-2 + 约 34px 宽的竖条),正文和用户气泡\\n\\t 会从它下面穿过去。不动条宽——那是层级信息——而是把导轨贴边收窄,\\n\\t 再给滚动区留出它实际占的宽度。 */\\n\\t.outline-rail {\\n\\t\\tright: 2px !important;\\n\\t}\\n\\t.outline-rail > div {\\n\\t\\tpadding-left: 6px !important;\\n\\t\\tpadding-right: 2px !important;\\n\\t}\\n\\t.pi-main div.min-h-0.flex-1.overflow-y-auto {\\n\\t\\tpadding-right: 30px !important;\\n\\t}\\n\\n\\t/* 8) 设置弹窗:高度用 100vh(移动端的大视口),内容列又没有 min-height:0\\n\\t 也没有 overflow-y,于是 1986px 的内容被 overflow:hidden 裁在 828px 里,\\n\\t 手机上完全滑不动。实测 client=828 / scroll=1986。 */\\n\\t.settings-dialog {\\n\\t\\theight: calc(100vh - 16px) !important;\\n\\t}\\n\\t.settings-dialog > div:not(.settings-nav) {\\n\\t\\tmin-height: 0 !important;\\n\\t\\toverflow-y: auto !important;\\n\\t\\t-webkit-overflow-scrolling: touch;\\n\\t}\\n\\n\\t/* 9) 模型 / 思考等级浮层锚在胶囊自己的 relative 容器上,right-0 是**胶囊**右缘,\\n\\t 312px 往左展开就顶出屏幕左边(实测 left 为负)。把胶囊容器解除定位,\\n\\t 浮层改用整张输入卡(上一层 relative)做定位父级,right-0 落在卡片右缘就装得下。\\n\\t :has() 在移动端 Safari 15.4+ / Chrome 105+ 都可用。 */\\n\\tdiv.relative:has(> button.chip[aria-haspopup=\\"menu\\"]) {\\n\\t\\tposition: static !important;\\n\\t}\\n\\n\\t/* 10) 设置→模型 的提供方卡片:那一行是 nowrap,中间的名字列被右侧一串按钮挤成\\n\\t 0 宽(实测 w=0),于是「凭据: auth.json」竖着拆行、「编辑」拆成「编/辑」、\\n\\t 右侧的按钮还被裁掉。手机上让这行能换行,并给名字列一个真实的最小宽度。 */\\n\\t.settings-dialog div.flex.items-center.gap-3:has(> div.min-w-0.flex-1) {\\n\\t\\tflex-wrap: wrap !important;\\n\\t\\trow-gap: 8px !important;\\n\\t}\\n\\t.settings-dialog div.flex.items-center.gap-3:has(> div.min-w-0.flex-1) > div.min-w-0.flex-1 {\\n\\t\\tflex: 1 1 140px !important;\\n\\t\\tmin-width: 140px !important;\\n\\t}\\n\\n\\t/* 11) 设置里 Row 那一套([文字列][控件列] 两栏)。控件列是 flex-none,\\n\\t 有的行右侧很宽(「开关 + 两个数字输入框」≈272px、「繁忙时 Enter」的下拉≈233px),\\n\\t 于是 390px 下文字列只剩 70px 左右,中文按每行一两字竖排,行高被撑到\\n\\t 122px / 218px(实测 70\xd7122、69\xd7218)。\\n\\t 试过的几种写法与实测结论:\\n\\t - 只给文字列 flex 增长权重:完全没用(那行没有空闲空间)\\n\\t - 只缩小 gap:只能缓解(70\xd7122 → 86\xd798)\\n\\t - 让所有 Row 都上下排(flex:1 1 100%):能修好,但把本来正常的行也撑高\\n\\t (界面语言 53→85、字体步进 95→105),是密度回退\\n\\t - 正解:文字列 flex-basis 设 0、只留 min-width 当\\"不许被压到多窄\\"的下限。\\n\\t 换行判断用的是 flex-basis(max-content 会很大,所以上一版全换行了),\\n\\t 设成 0 之后判断就只看 min-width:\\n\\t 控件窄的行(界面语言 77px、字体步进 116px)→ 仍并排,保持紧凑\\n\\t 控件宽的行(272px / 233px)→ 控件换到下一行,文字拿满 326px\\n\\t 实测:界面语言 53 不变、界面字体 95→71、繁忙时Enter 239→135、\\n\\t 自动压缩 143→111、自动重试 119→111,全部不再竖排。 */\\n\\t.settings-dialog div.hairline-b.gap-6 {\\n\\t\\tflex-wrap: wrap !important;\\n\\t\\tgap: 8px !important;\\n\\t}\\n\\t.settings-dialog div.hairline-b.gap-6 > div.min-w-0 {\\n\\t\\tflex: 1 1 0 !important;\\n\\t\\tmin-width: 45% !important;\\n\\t}\\n\\t.settings-dialog div.hairline-b.gap-6 > div.flex-none > div.flex.items-center {\\n\\t\\tflex-wrap: wrap !important;\\n\\t\\tjustify-content: flex-end !important;\\n\\t\\trow-gap: 6px !important;\\n\\t}\\n\\n\\t/* 12) 外观主题卡片。卡片是 flex: 1 1 150px 的两列网格,但左右各留 32px 内边距,\\n\\t 159px 的卡片只剩 95px 给标题,于是「石灰与煤炭」「亚麻与苔绿」掉到第二行,\\n\\t 卡片高度变成 110px 而其余是 88px,网格参差(实测 6 张卡:4 张 88 / 2 张 110)。\\n\\t 把左右内边距收到 10px,6 张卡全部回到 88px,标题一行放得下。 */\\n\\t.settings-dialog button[aria-pressed] {\\n\\t\\tpadding-left: 10px !important;\\n\\t\\tpadding-right: 10px !important;\\n\\t}\\n\\n\\t/* 13) 可点目标偏小(实测:字体步进器 26\xd726、reset 48\xd724、开关 36\xd720)。\\n\\t 只扩**热区**,绝不改可见尺寸:开关的滑块位置在 PiWeb 里是写死的\\n\\t (left: 18px / 2px),把开关拉宽会让滑块错位、变成被拉长的怪药丸\\n\\t —— 我第一版写的 min-width:44px 就是这个后果,用户报了\\"启动按钮好丑\\"。\\n\\t 另外这里只做**纵向**扩张(左右不扩):字体步进器 −/+/ 之间只有 8px,\\n\\t 横向扩到 44px 会让两个按钮的热区重叠约 10px,点 − 反而命中 +。 */\\n\\t.settings-dialog .icon-btn,\\n\\t.settings-dialog button.h-6,\\n\\t.settings-dialog button.h-5,\\n\\t.settings-dialog [role=\\"switch\\"] {\\n\\t\\tposition: relative !important;\\n\\t}\\n\\t.settings-dialog .icon-btn::after,\\n\\t.settings-dialog button.h-6::after,\\n\\t.settings-dialog button.h-5::after,\\n\\t.settings-dialog [role=\\"switch\\"]::after {\\n\\t\\tcontent: \\"\\" !important;\\n\\t\\tposition: absolute !important;\\n\\t\\tleft: 0 !important;\\n\\t\\tright: 0 !important;\\n\\t\\ttop: 50% !important;\\n\\t\\theight: max(100%, 44px) !important;\\n\\t\\ttransform: translateY(-50%) !important;\\n\\t\\tborder-radius: 999px !important;\\n\\t}\\n}\\n\\n/* 手机上的浮层统一兜底:不许比屏幕宽,不许比屏幕高,超出就自己滚。 */\\n@media (max-width: 840px) {\\n\\t.popover {\\n\\t\\tmax-width: calc(100vw - 16px) !important;\\n\\t\\tmax-height: 420px !important;\\n\\t\\toverflow-y: auto !important;\\n\\t\\t-webkit-overflow-scrolling: touch;\\n\\t}\\n}\\n\\n/* 11) 模型名太长时跑马灯。取值与做法照搬 dsh-remote 对 DSH 的:\\n\\t 名字窗口固定 28vw 并允许被压缩,装得下就完全不动;装不下时由注入的\\n\\t mobile-fit.js 打上 data-piweb-marquee,再由这里的两份伪元素首尾相接匀速左移。\\n\\t 一份走完另一份正好接上(travel 已含间隔),所以循环处看不出接缝。 */\\n@media (max-width: 840px) {\\n\\tbutton.chip[aria-haspopup=\\"menu\\"] > span.truncate {\\n\\t\\tmin-width: 0 !important;\\n\\t\\tmax-width: 28vw !important;\\n\\t}\\n\\t[data-piweb-marquee] {\\n\\t\\tposition: relative !important;\\n\\t\\tdisplay: block !important;\\n\\t\\twidth: 28vw !important;\\n\\t\\tflex: none !important;\\n\\t\\ttext-overflow: clip !important;\\n\\t\\twhite-space: nowrap !important;\\n\\t\\toverflow: hidden !important;\\n\\t\\ttext-indent: 0 !important;\\n\\t\\tcontain: layout paint !important;\\n\\t\\tcolor: transparent !important;\\n\\t\\tline-height: 20px !important;\\n\\t}\\n\\t[data-piweb-marquee]::before,\\n\\t[data-piweb-marquee]::after {\\n\\t\\tcontent: attr(data-piweb-text);\\n\\t\\tposition: absolute;\\n\\t\\ttop: 0;\\n\\t\\tleft: 0;\\n\\t\\tcolor: var(--piweb-marquee-color, var(--dsw-label-primary));\\n\\t\\tfont-size: 13px;\\n\\t\\tline-height: 20px;\\n\\t\\twhite-space: nowrap;\\n\\t\\twill-change: transform;\\n\\t\\ttransform: translate3d(0, 0, 0);\\n\\t\\tanimation: piweb-mfit-marquee var(--piweb-marquee-duration, 8s) linear infinite both;\\n\\t}\\n\\t[data-piweb-marquee]::after {\\n\\t\\tleft: var(--piweb-marquee-text, 0px);\\n\\t}\\n\\t@keyframes piweb-mfit-marquee {\\n\\t\\tfrom { transform: translate3d(0, 0, 0); }\\n\\t\\tto { transform: translate3d(calc(-1 * var(--piweb-marquee-text, 0px)), 0, 0); }\\n\\t}\\n}\\n\\n/* dvh 是\\"实际可见高度\\",比 100vh(移动 Chrome 的大视口)可靠;\\n 不支持时上面那两条固定值兜底。 */\\n@supports (height: 100dvh) {\\n\\t@media (max-width: 840px) {\\n\\t\\ttextarea {\\n\\t\\t\\tmax-height: min(132px, 26dvh) !important;\\n\\t\\t}\\n\\t\\t.popover {\\n\\t\\t\\tmax-height: min(60dvh, 420px) !important;\\n\\t\\t}\\n\\t\\t.settings-dialog {\\n\\t\\t\\theight: calc(100dvh - 16px) !important;\\n\\t\\t}\\n\\t}\\n}\\n","js":"/*\\n * 手机端脚本(配合 mobile-fit.css)。\\n *\\n * 做两件事:\\n * 1) 模型名太长时改成「跑马灯」。做法照搬 dsh-remote 对 DSH 的处理——\\n * 名字窗口固定 28vw,装得下就完全不动;装不下时才把两份文本首尾相接匀速左移,\\n * 一份走完另一份正好接上,循环没有空档。CSS 负责动画,这里只负责\\"量\\"和\\"打标记\\"。\\n * 为什么必须用 JS 量:纯 CSS 判断不了\\"是否真的被截断\\",只能用省略号一裁了之,\\n * 名字的尾巴就永远看不到了。\\n * 2) 设置里「文字 + 开关」那种行,手机上点文字也能切开关。\\n * 手机断点下这行是上下排(见 mobile-fit.css 第 11 条),文字占满一行、开关缩在下面,\\n * 而 PiWeb 只让那个 36\xd720 的小开关可点 —— 用户点最显眼的标题文字毫无反应,\\n * 看起来就是\\"这个开关坏了\\"。实测:点文字 0 次请求,点开关才发请求。\\n */\\n(function () {\\n\\t\\"use strict\\";\\n\\n\\tvar ATTR = \\"data-piweb-marquee\\";\\n\\tvar TEXT_ATTR = \\"data-piweb-text\\";\\n\\tvar TEXT_VAR = \\"--piweb-marquee-text\\";\\n\\tvar DURATION_VAR = \\"--piweb-marquee-duration\\";\\n\\tvar COLOR_VAR = \\"--piweb-marquee-color\\";\\n\\tvar /** 两份文本之间留的间隔,也是 travel 里多出来的那一段 */\\n\\t\\tGAP = 40;\\n\\tvar /** 每秒移动多少像素,太长就慢一点 */\\n\\t\\tSPEED = 22;\\n\\tvar MIN_CYCLE = 6;\\n\\tvar ROW_BOUND_ATTR = \\"data-piweb-row-bound\\";\\n\\n\\t/** 模型胶囊里的名字(ModelSelector 里那个 span.truncate) */\\n\\tfunction label() {\\n\\t\\treturn document.querySelector(\'button.chip[aria-haspopup=\\"menu\\"] > span.truncate\');\\n\\t}\\n\\n\\tfunction apply() {\\n\\t\\tvar el = label();\\n\\t\\tif (!el) return;\\n\\t\\tvar text = el.textContent || \\"\\";\\n\\t\\tif (!text) return;\\n\\n\\t\\t// 同一个名字已经标过就别再动它:重设属性会把 CSS 动画从头开始,看起来是\\"一直重启\\"\\n\\t\\tif (el.hasAttribute(ATTR) && el.getAttribute(TEXT_ATTR) === text) return;\\n\\n\\t\\t// 量必须在\\"静止态\\"下做:先摘掉标记,否则量到的是被 28vw 框死之后的宽度\\n\\t\\tif (el.hasAttribute(ATTR)) el.removeAttribute(ATTR);\\n\\t\\tvar natural = el.scrollWidth;\\n\\t\\tvar windowWidth = el.clientWidth;\\n\\t\\tif (!windowWidth || natural <= windowWidth + 1) return; // 装得下,什么都不做\\n\\n\\t\\tel.style.setProperty(COLOR_VAR, getComputedStyle(el).color);\\n\\t\\tel.style.setProperty(TEXT_VAR, natural + GAP + \\"px\\");\\n\\t\\tel.style.setProperty(DURATION_VAR, Math.max(MIN_CYCLE, (natural + GAP) / SPEED).toFixed(1) + \\"s\\");\\n\\t\\tel.setAttribute(TEXT_ATTR, text);\\n\\t\\tel.setAttribute(ATTR, \\"\\");\\n\\t}\\n\\n\\t/**\\n\\t * 设置里「文字 + 开关」的行:把文字列变成开关的\\"大号按钮\\"。\\n\\t *\\n\\t * 只绑文字列(Row 里那个 min-w-0 的直系子元素),不碰控件列:\\n\\t * 控件列里有数字输入框,整行可点会把\\"点输入框\\"也变成切开关。\\n\\t * React 重渲染会换掉节点,所以每次轮询都重查;用属性做幂等标记,重复绑不会叠加。\\n\\t */\\n\\tfunction bindSwitchRows() {\\n\\t\\tvar switches = document.querySelectorAll(\'.settings-dialog [role=\\"switch\\"]\');\\n\\t\\tfor (var i = 0; i < switches.length; i++) {\\n\\t\\t\\tvar sw = switches[i];\\n\\t\\t\\tvar row = sw.closest(\\".hairline-b\\");\\n\\t\\t\\tif (!row || row.getAttribute(ROW_BOUND_ATTR) === \\"1\\") continue;\\n\\t\\t\\t// Row 的文字列:hairline-b 的直系子元素里带 min-w-0 的那个\\n\\t\\t\\tvar label = null;\\n\\t\\t\\tfor (var c = 0; c < row.children.length; c += 1) {\\n\\t\\t\\t\\tif (row.children[c].classList.contains(\\"min-w-0\\")) { label = row.children[c]; break; }\\n\\t\\t\\t}\\n\\t\\t\\tif (!label) continue;\\n\\t\\t\\trow.setAttribute(ROW_BOUND_ATTR, \\"1\\");\\n\\t\\t\\t(function (button, labelEl) {\\n\\t\\t\\t\\tlabelEl.style.cursor = \\"pointer\\";\\n\\t\\t\\t\\tlabelEl.addEventListener(\\"click\\", function (event) {\\n\\t\\t\\t\\t\\t// 文字里可能有链接/按钮,别抢它们\\n\\t\\t\\t\\t\\tif (event.target.closest(\\"a, button, input, select, textarea\\")) return;\\n\\t\\t\\t\\t\\tif (button.disabled) return;\\n\\t\\t\\t\\t\\tevent.preventDefault();\\n\\t\\t\\t\\t\\tbutton.click();\\n\\t\\t\\t\\t});\\n\\t\\t\\t})(sw, label);\\n\\t\\t}\\n\\t}\\n\\n\\t// 模型名会随会话/选择变化,输入卡也会整体重挂载;轮询最省事,且因为有上面的\\n\\t// 提前返回,稳态下每次只花一个 querySelector。\\n\\tfunction start() {\\n\\t\\tapply();\\n\\t\\tbindSwitchRows();\\n\\t\\tsetInterval(function () { apply(); bindSwitchRows(); }, 800);\\n\\t\\twindow.addEventListener(\\"resize\\", apply, { passive: true });\\n\\t\\twindow.addEventListener(\\"orientationchange\\", apply, { passive: true });\\n\\t}\\n\\n\\tif (document.readyState === \\"loading\\") document.addEventListener(\\"DOMContentLoaded\\", start, { once: true });\\n\\telse start();\\n})();"}'),m="piweb-mobile-fit",n=l.A,o=l.js;function p(a=process.env){return(0,f.authEnabled)(a)?"development"===a.NODE_ENV?"dev":null:"auth"}function q(){let a=globalThis,b=Symbol.for("piweb:remote-supervisor"),c=a[b];if(c)return c;let d={lan:null,tunnel:null,lanError:null,publicError:null,enginePath:null,engineChecked:!1};return a[b]=d,d}function r(a=process.env){for(let b of[a.PIWEB_PORT,a.PORT]){let a=Number(b);if(Number.isInteger(a)&&a>=1&&a<=65535)return a}return 30141}function s(a=process.env){let b;return"0"!==(b=(a.PIWEB_REMOTE_LAN??"").trim().toLowerCase())&&"false"!==b&&"off"!==b&&"no"!==b}function t(){let a=q(),b=a.lan?.port??null;return{plugin:"builtin-remote",targetPort:r(),blocked:p(),lan:{running:!!a.lan,port:b,urls:b?(function(){let a=[];for(let b of Object.values(e().networkInterfaces()))for(let c of b??[])"IPv4"!==c.family||c.internal||c.address.startsWith("169.254.")||a.push(c.address);return a})().map(a=>`http://${a}:${b}`):[],error:a.lanError},public:{running:!!a.tunnel,url:a.tunnel?.url??null,ready:!!a.tunnel?.ready,engine:a.tunnel?"cloudflared":null,engineAvailable:!a.engineChecked||null!==a.enginePath,error:a.publicError}}}function u(a=function(a=process.env){let b=Number(a.PIWEB_REMOTE_LAN_PORT);return Number.isInteger(b)&&b>=1&&b<=65535?b:30142}(),b="0.0.0.0",c=r()){let d=q();if(d.lan)return Promise.resolve(t().lan);if(d.lanStarting)return d.lanStarting;let e=v(a,b,c).finally(()=>{d.lanStarting===e&&(d.lanStarting=null)});return d.lanStarting=e,e}async function v(a,b,c){let d=q();d.lanError=null;let e=function({targetPort:a,targetHost:b="127.0.0.1",css:c=null,js:d=null,log:e=()=>{}}){return h().createServer((f,g)=>{let j,l={...f.headers},n=!!(c||d)&&!("localhost"===(j=(function(a){let b=String(a??"").trim().toLowerCase();if(b.startsWith("[")){let a=b.indexOf("]");return a>=0?b.slice(1,a):b.slice(1)}return 1===(b.match(/:/g)??[]).length?b.slice(0,b.indexOf(":")):b})(l.host).trim().toLowerCase().replace(/^\[|\]$/g,""))||j.endsWith(".localhost")||"::1"===j||"0:0:0:0:0:0:0:1"===j||/^127(?:\.\d{1,3}){3}$/.test(j));n&&String(l.accept??"").includes("text/html")&&(l["accept-encoding"]="identity");let o=h().request({host:b,port:a,method:f.method,path:f.url??"/",headers:l},a=>{let b=String(a.headers["content-type"]??"");if(!n||!b.includes("text/html")){g.writeHead(a.statusCode??502,a.headers),(0,i.pipeline)(a,g,()=>void 0);return}let f=[];a.on("error",a=>{e(`[远程连接] 上游中途断开:${a.message}`),g.destroy()}),a.on("data",a=>f.push(a)),a.on("end",()=>{let b,h=Buffer.concat(f);try{b=Buffer.from(function(a,{css:b=null,js:c=null}={}){if(!b&&!c||a.includes(`id="${m}"`))return a;let d=[];b&&d.push(`<style id="${m}">
1
+ "use strict";exports.id=924,exports.ids=[393,924],exports.modules={1175:(a,b,c)=>{c.d(b,{Fu:()=>h}),c(77598),c(73024);var d=c(48161),e=c.n(d),f=c(76760),g=c.n(f);function h(){let a=process.env.PI_CODING_AGENT_DIR;if(a)return"~"===a?e().homedir():a.startsWith("~/")||a.startsWith("~\\")?g().join(e().homedir(),a.slice(2)):a;return g().join(e().homedir(),".pi","agent")}},3924:(a,b,c)=>{c.d(b,{remoteBlocked:()=>p,remoteLanEnabled:()=>s,startLan:()=>v}),c(31421),c(73024),c(44708);var d=c(48161),e=c.n(d);c(76760);var f=c(75393);c(1175);var g=c(37067),h=c.n(g),i=c(57075),j=c(38522),k=c.n(j);c(77030);let l=JSON.parse('{"A":"/*\\n * 手机端适配。不改 PiWeb,只在经代理的远程页面上生效\\n * (本机直连 127.0.0.1:30141 的桌面页面完全不加载它)。\\n *\\n * 取值参照 dsh-remote 为 DSH 定的那套移动适配(同作者),并针对 PiWeb 的实测问题:\\n * 390px 下输入框 304px、markdown 表格 442px 超出视口、底部统计行被截断。\\n */\\n@media (max-width: 840px) {\\n\\t/* 1) 输入框自适应高度失控。\\n\\t 实测:视口 390 → 304px,500 → 43px,700+ → 22px;而自然内容高始终 22px。\\n\\t 原因在 ChatInput 的 autoSize():它把\\"被 flex 拉伸后\\"的 scrollHeight 写进了\\n\\t inline height,写回后又把自己撑住,形成自锁。inline 样式不是 important,\\n\\t 所以这里用 max-height !important 把它夹住。 */\\n\\ttextarea {\\n\\t\\tmax-height: 132px !important;\\n\\t\\toverflow-y: auto !important;\\n\\t}\\n\\n\\t/* 2) Markdown 宽表格超出视口被裁掉(实测 442 > 390,body 又是 overflow-x:hidden,\\n\\t 等于右侧内容既看不到也滑不到)。让表格自己横向滚动。 */\\n\\t.md table {\\n\\t\\tdisplay: block !important;\\n\\t\\tmax-width: 100% !important;\\n\\t\\toverflow-x: auto !important;\\n\\t\\t-webkit-overflow-scrolling: touch;\\n\\t}\\n\\n\\t/* 3) 全局溢出护栏(dsh-remote 同款):任何一块都不许把文档撑宽 */\\n\\thtml,\\n\\tbody {\\n\\t\\tmax-width: 100vw !important;\\n\\t\\toverflow-x: hidden !important;\\n\\t}\\n\\tpre {\\n\\t\\tmax-width: 100% !important;\\n\\t\\toverflow-x: auto !important;\\n\\t\\t-webkit-overflow-scrolling: touch;\\n\\t}\\n\\timg,\\n\\tsvg,\\n\\tvideo,\\n\\tcanvas {\\n\\t\\tmax-width: 100% !important;\\n\\t}\\n\\n\\t/* 4) 底部统计行原本 nowrap + ellipsis,手机上「| 输入 2…」之后永远看不到。\\n\\t 改成可横向滑动,滚动条隐藏,信息不再丢。 */\\n\\tdiv.text-center > div.overflow-hidden.text-ellipsis.whitespace-nowrap {\\n\\t\\toverflow-x: auto !important;\\n\\t\\toverflow-y: hidden !important;\\n\\t\\ttext-overflow: clip !important;\\n\\t\\t-webkit-overflow-scrolling: touch;\\n\\t\\tscrollbar-width: none;\\n\\t}\\n\\tdiv.text-center > div.overflow-hidden.text-ellipsis.whitespace-nowrap::-webkit-scrollbar {\\n\\t\\tdisplay: none;\\n\\t}\\n\\n\\t/* 5) 给手机的手势条留位置(没有 insets 的设备 env() 为 0,等于没写) */\\n\\t.pi-main {\\n\\t\\tpadding-bottom: env(safe-area-inset-bottom) !important;\\n\\t}\\n\\n\\t/* 6) 左上角的抽屉按钮。原来是个悬浮的圆角方块(12px/12px、34px),盖在内容上、\\n\\t 和右边那排图标也不在一条水平线上。按 dsh-remote 对 DSH 左侧的做法收成贴角圆形,\\n\\t 尺寸和位置改成与右侧图标完全一致(实测右侧图标是 top 12 / 30\xd730,中心 y=27),\\n\\t 这样整行对齐,按钮底边 42 也在头部分隔线(y=43)之上,不会压住那条线。 */\\n\\t.pi-mobile-menu {\\n\\t\\twidth: 30px !important;\\n\\t\\theight: 30px !important;\\n\\t\\tborder-radius: 999px !important;\\n\\t\\tleft: calc(env(safe-area-inset-left) + 12px) !important;\\n\\t\\ttop: calc(env(safe-area-inset-top) + 12px) !important;\\n\\t}\\n\\t.pi-main > .hairline-b {\\n\\t\\tpadding-left: 52px !important;\\n\\t}\\n\\n\\t/* 7) 右侧大纲导轨是绝对定位的(right-2 + 约 34px 宽的竖条),正文和用户气泡\\n\\t 会从它下面穿过去。不动条宽——那是层级信息——而是把导轨贴边收窄,\\n\\t 再给滚动区留出它实际占的宽度。 */\\n\\t.outline-rail {\\n\\t\\tright: 2px !important;\\n\\t}\\n\\t.outline-rail > div {\\n\\t\\tpadding-left: 6px !important;\\n\\t\\tpadding-right: 2px !important;\\n\\t}\\n\\t.pi-main div.min-h-0.flex-1.overflow-y-auto {\\n\\t\\tpadding-right: 30px !important;\\n\\t}\\n\\n\\t/* 8) 设置弹窗:高度用 100vh(移动端的大视口),内容列又没有 min-height:0\\n\\t 也没有 overflow-y,于是 1986px 的内容被 overflow:hidden 裁在 828px 里,\\n\\t 手机上完全滑不动。实测 client=828 / scroll=1986。 */\\n\\t.settings-dialog {\\n\\t\\theight: calc(100vh - 16px) !important;\\n\\t}\\n\\t.settings-dialog > div:not(.settings-nav) {\\n\\t\\tmin-height: 0 !important;\\n\\t\\toverflow-y: auto !important;\\n\\t\\t-webkit-overflow-scrolling: touch;\\n\\t}\\n\\n\\t/* 9) 模型 / 思考等级浮层锚在胶囊自己的 relative 容器上,right-0 是**胶囊**右缘,\\n\\t 312px 往左展开就顶出屏幕左边(实测 left 为负)。把胶囊容器解除定位,\\n\\t 浮层改用整张输入卡(上一层 relative)做定位父级,right-0 落在卡片右缘就装得下。\\n\\t :has() 在移动端 Safari 15.4+ / Chrome 105+ 都可用。 */\\n\\tdiv.relative:has(> button.chip[aria-haspopup=\\"menu\\"]) {\\n\\t\\tposition: static !important;\\n\\t}\\n\\n\\t/* 10) 设置→模型 的提供方卡片:那一行是 nowrap,中间的名字列被右侧一串按钮挤成\\n\\t 0 宽(实测 w=0),于是「凭据: auth.json」竖着拆行、「编辑」拆成「编/辑」、\\n\\t 右侧的按钮还被裁掉。手机上让这行能换行,并给名字列一个真实的最小宽度。 */\\n\\t.settings-dialog div.flex.items-center.gap-3:has(> div.min-w-0.flex-1) {\\n\\t\\tflex-wrap: wrap !important;\\n\\t\\trow-gap: 8px !important;\\n\\t}\\n\\t.settings-dialog div.flex.items-center.gap-3:has(> div.min-w-0.flex-1) > div.min-w-0.flex-1 {\\n\\t\\tflex: 1 1 140px !important;\\n\\t\\tmin-width: 140px !important;\\n\\t}\\n\\n\\t/* 11) 设置里 Row 那一套([文字列][控件列] 两栏)。控件列是 flex-none,\\n\\t 有的行右侧很宽(「开关 + 两个数字输入框」≈272px、「繁忙时 Enter」的下拉≈233px),\\n\\t 于是 390px 下文字列只剩 70px 左右,中文按每行一两字竖排,行高被撑到\\n\\t 122px / 218px(实测 70\xd7122、69\xd7218)。\\n\\t 试过的几种写法与实测结论:\\n\\t - 只给文字列 flex 增长权重:完全没用(那行没有空闲空间)\\n\\t - 只缩小 gap:只能缓解(70\xd7122 → 86\xd798)\\n\\t - 让所有 Row 都上下排(flex:1 1 100%):能修好,但把本来正常的行也撑高\\n\\t (界面语言 53→85、字体步进 95→105),是密度回退\\n\\t - 正解:文字列 flex-basis 设 0、只留 min-width 当\\"不许被压到多窄\\"的下限。\\n\\t 换行判断用的是 flex-basis(max-content 会很大,所以上一版全换行了),\\n\\t 设成 0 之后判断就只看 min-width:\\n\\t 控件窄的行(界面语言 77px、字体步进 116px)→ 仍并排,保持紧凑\\n\\t 控件宽的行(272px / 233px)→ 控件换到下一行,文字拿满 326px\\n\\t 实测:界面语言 53 不变、界面字体 95→71、繁忙时Enter 239→135、\\n\\t 自动压缩 143→111、自动重试 119→111,全部不再竖排。 */\\n\\t.settings-dialog div.hairline-b.gap-6 {\\n\\t\\tflex-wrap: wrap !important;\\n\\t\\tgap: 8px !important;\\n\\t}\\n\\t.settings-dialog div.hairline-b.gap-6 > div.min-w-0 {\\n\\t\\tflex: 1 1 0 !important;\\n\\t\\tmin-width: 45% !important;\\n\\t}\\n\\t.settings-dialog div.hairline-b.gap-6 > div.flex-none > div.flex.items-center {\\n\\t\\tflex-wrap: wrap !important;\\n\\t\\tjustify-content: flex-end !important;\\n\\t\\trow-gap: 6px !important;\\n\\t}\\n\\n\\t/* 12) 外观主题卡片。卡片是 flex: 1 1 150px 的两列网格,但左右各留 32px 内边距,\\n\\t 159px 的卡片只剩 95px 给标题,于是「石灰与煤炭」「亚麻与苔绿」掉到第二行,\\n\\t 卡片高度变成 110px 而其余是 88px,网格参差(实测 6 张卡:4 张 88 / 2 张 110)。\\n\\t 把左右内边距收到 10px,6 张卡全部回到 88px,标题一行放得下。 */\\n\\t.settings-dialog button[aria-pressed] {\\n\\t\\tpadding-left: 10px !important;\\n\\t\\tpadding-right: 10px !important;\\n\\t}\\n\\n\\t/* 13) 可点目标偏小(实测:字体步进器 26\xd726、reset 48\xd724、开关 36\xd720)。\\n\\t 只扩**热区**,绝不改可见尺寸:开关的滑块位置在 PiWeb 里是写死的\\n\\t (left: 18px / 2px),把开关拉宽会让滑块错位、变成被拉长的怪药丸\\n\\t —— 我第一版写的 min-width:44px 就是这个后果,用户报了\\"启动按钮好丑\\"。\\n\\t 另外这里只做**纵向**扩张(左右不扩):字体步进器 −/+/ 之间只有 8px,\\n\\t 横向扩到 44px 会让两个按钮的热区重叠约 10px,点 − 反而命中 +。 */\\n\\t.settings-dialog .icon-btn,\\n\\t.settings-dialog button.h-6,\\n\\t.settings-dialog button.h-5,\\n\\t.settings-dialog [role=\\"switch\\"] {\\n\\t\\tposition: relative !important;\\n\\t}\\n\\t.settings-dialog .icon-btn::after,\\n\\t.settings-dialog button.h-6::after,\\n\\t.settings-dialog button.h-5::after,\\n\\t.settings-dialog [role=\\"switch\\"]::after {\\n\\t\\tcontent: \\"\\" !important;\\n\\t\\tposition: absolute !important;\\n\\t\\tleft: 0 !important;\\n\\t\\tright: 0 !important;\\n\\t\\ttop: 50% !important;\\n\\t\\theight: max(100%, 44px) !important;\\n\\t\\ttransform: translateY(-50%) !important;\\n\\t\\tborder-radius: 999px !important;\\n\\t}\\n}\\n\\n/* 手机上的浮层统一兜底:不许比屏幕宽,不许比屏幕高,超出就自己滚。 */\\n@media (max-width: 840px) {\\n\\t.popover {\\n\\t\\tmax-width: calc(100vw - 16px) !important;\\n\\t\\tmax-height: 420px !important;\\n\\t\\toverflow-y: auto !important;\\n\\t\\t-webkit-overflow-scrolling: touch;\\n\\t}\\n}\\n\\n/* 11) 模型名太长时跑马灯。取值与做法照搬 dsh-remote 对 DSH 的:\\n\\t 名字窗口固定 28vw 并允许被压缩,装得下就完全不动;装不下时由注入的\\n\\t mobile-fit.js 打上 data-piweb-marquee,再由这里的两份伪元素首尾相接匀速左移。\\n\\t 一份走完另一份正好接上(travel 已含间隔),所以循环处看不出接缝。 */\\n@media (max-width: 840px) {\\n\\tbutton.chip[aria-haspopup=\\"menu\\"] > span.truncate {\\n\\t\\tmin-width: 0 !important;\\n\\t\\tmax-width: 28vw !important;\\n\\t}\\n\\t[data-piweb-marquee] {\\n\\t\\tposition: relative !important;\\n\\t\\tdisplay: block !important;\\n\\t\\twidth: 28vw !important;\\n\\t\\tflex: none !important;\\n\\t\\ttext-overflow: clip !important;\\n\\t\\twhite-space: nowrap !important;\\n\\t\\toverflow: hidden !important;\\n\\t\\ttext-indent: 0 !important;\\n\\t\\tcontain: layout paint !important;\\n\\t\\tcolor: transparent !important;\\n\\t\\tline-height: 20px !important;\\n\\t}\\n\\t[data-piweb-marquee]::before,\\n\\t[data-piweb-marquee]::after {\\n\\t\\tcontent: attr(data-piweb-text);\\n\\t\\tposition: absolute;\\n\\t\\ttop: 0;\\n\\t\\tleft: 0;\\n\\t\\tcolor: var(--piweb-marquee-color, var(--dsw-label-primary));\\n\\t\\tfont-size: 13px;\\n\\t\\tline-height: 20px;\\n\\t\\twhite-space: nowrap;\\n\\t\\twill-change: transform;\\n\\t\\ttransform: translate3d(0, 0, 0);\\n\\t\\tanimation: piweb-mfit-marquee var(--piweb-marquee-duration, 8s) linear infinite both;\\n\\t}\\n\\t[data-piweb-marquee]::after {\\n\\t\\tleft: var(--piweb-marquee-text, 0px);\\n\\t}\\n\\t@keyframes piweb-mfit-marquee {\\n\\t\\tfrom { transform: translate3d(0, 0, 0); }\\n\\t\\tto { transform: translate3d(calc(-1 * var(--piweb-marquee-text, 0px)), 0, 0); }\\n\\t}\\n}\\n\\n/* dvh 是\\"实际可见高度\\",比 100vh(移动 Chrome 的大视口)可靠;\\n 不支持时上面那两条固定值兜底。 */\\n@supports (height: 100dvh) {\\n\\t@media (max-width: 840px) {\\n\\t\\ttextarea {\\n\\t\\t\\tmax-height: min(132px, 26dvh) !important;\\n\\t\\t}\\n\\t\\t.popover {\\n\\t\\t\\tmax-height: min(60dvh, 420px) !important;\\n\\t\\t}\\n\\t\\t.settings-dialog {\\n\\t\\t\\theight: calc(100dvh - 16px) !important;\\n\\t\\t}\\n\\t}\\n}\\n","js":"/*\\n * 手机端脚本(配合 mobile-fit.css)。\\n *\\n * 做两件事:\\n * 1) 模型名太长时改成「跑马灯」。做法照搬 dsh-remote 对 DSH 的处理——\\n * 名字窗口固定 28vw,装得下就完全不动;装不下时才把两份文本首尾相接匀速左移,\\n * 一份走完另一份正好接上,循环没有空档。CSS 负责动画,这里只负责\\"量\\"和\\"打标记\\"。\\n * 为什么必须用 JS 量:纯 CSS 判断不了\\"是否真的被截断\\",只能用省略号一裁了之,\\n * 名字的尾巴就永远看不到了。\\n * 2) 设置里「文字 + 开关」那种行,手机上点文字也能切开关。\\n * 手机断点下这行是上下排(见 mobile-fit.css 第 11 条),文字占满一行、开关缩在下面,\\n * 而 PiWeb 只让那个 36\xd720 的小开关可点 —— 用户点最显眼的标题文字毫无反应,\\n * 看起来就是\\"这个开关坏了\\"。实测:点文字 0 次请求,点开关才发请求。\\n */\\n(function () {\\n\\t\\"use strict\\";\\n\\n\\tvar ATTR = \\"data-piweb-marquee\\";\\n\\tvar TEXT_ATTR = \\"data-piweb-text\\";\\n\\tvar TEXT_VAR = \\"--piweb-marquee-text\\";\\n\\tvar DURATION_VAR = \\"--piweb-marquee-duration\\";\\n\\tvar COLOR_VAR = \\"--piweb-marquee-color\\";\\n\\tvar /** 两份文本之间留的间隔,也是 travel 里多出来的那一段 */\\n\\t\\tGAP = 40;\\n\\tvar /** 每秒移动多少像素,太长就慢一点 */\\n\\t\\tSPEED = 22;\\n\\tvar MIN_CYCLE = 6;\\n\\tvar ROW_BOUND_ATTR = \\"data-piweb-row-bound\\";\\n\\n\\t/** 模型胶囊里的名字(ModelSelector 里那个 span.truncate) */\\n\\tfunction label() {\\n\\t\\treturn document.querySelector(\'button.chip[aria-haspopup=\\"menu\\"] > span.truncate\');\\n\\t}\\n\\n\\tfunction apply() {\\n\\t\\tvar el = label();\\n\\t\\tif (!el) return;\\n\\t\\tvar text = el.textContent || \\"\\";\\n\\t\\tif (!text) return;\\n\\n\\t\\t// 同一个名字已经标过就别再动它:重设属性会把 CSS 动画从头开始,看起来是\\"一直重启\\"\\n\\t\\tif (el.hasAttribute(ATTR) && el.getAttribute(TEXT_ATTR) === text) return;\\n\\n\\t\\t// 量必须在\\"静止态\\"下做:先摘掉标记,否则量到的是被 28vw 框死之后的宽度\\n\\t\\tif (el.hasAttribute(ATTR)) el.removeAttribute(ATTR);\\n\\t\\tvar natural = el.scrollWidth;\\n\\t\\tvar windowWidth = el.clientWidth;\\n\\t\\tif (!windowWidth || natural <= windowWidth + 1) return; // 装得下,什么都不做\\n\\n\\t\\tel.style.setProperty(COLOR_VAR, getComputedStyle(el).color);\\n\\t\\tel.style.setProperty(TEXT_VAR, natural + GAP + \\"px\\");\\n\\t\\tel.style.setProperty(DURATION_VAR, Math.max(MIN_CYCLE, (natural + GAP) / SPEED).toFixed(1) + \\"s\\");\\n\\t\\tel.setAttribute(TEXT_ATTR, text);\\n\\t\\tel.setAttribute(ATTR, \\"\\");\\n\\t}\\n\\n\\t/**\\n\\t * 设置里「文字 + 开关」的行:把文字列变成开关的\\"大号按钮\\"。\\n\\t *\\n\\t * 只绑文字列(Row 里那个 min-w-0 的直系子元素),不碰控件列:\\n\\t * 控件列里有数字输入框,整行可点会把\\"点输入框\\"也变成切开关。\\n\\t * React 重渲染会换掉节点,所以每次轮询都重查;用属性做幂等标记,重复绑不会叠加。\\n\\t */\\n\\tfunction bindSwitchRows() {\\n\\t\\tvar switches = document.querySelectorAll(\'.settings-dialog [role=\\"switch\\"]\');\\n\\t\\tfor (var i = 0; i < switches.length; i++) {\\n\\t\\t\\tvar sw = switches[i];\\n\\t\\t\\tvar row = sw.closest(\\".hairline-b\\");\\n\\t\\t\\tif (!row || row.getAttribute(ROW_BOUND_ATTR) === \\"1\\") continue;\\n\\t\\t\\t// Row 的文字列:hairline-b 的直系子元素里带 min-w-0 的那个\\n\\t\\t\\tvar label = null;\\n\\t\\t\\tfor (var c = 0; c < row.children.length; c += 1) {\\n\\t\\t\\t\\tif (row.children[c].classList.contains(\\"min-w-0\\")) { label = row.children[c]; break; }\\n\\t\\t\\t}\\n\\t\\t\\tif (!label) continue;\\n\\t\\t\\trow.setAttribute(ROW_BOUND_ATTR, \\"1\\");\\n\\t\\t\\t(function (button, labelEl) {\\n\\t\\t\\t\\tlabelEl.style.cursor = \\"pointer\\";\\n\\t\\t\\t\\tlabelEl.addEventListener(\\"click\\", function (event) {\\n\\t\\t\\t\\t\\t// 文字里可能有链接/按钮,别抢它们\\n\\t\\t\\t\\t\\tif (event.target.closest(\\"a, button, input, select, textarea\\")) return;\\n\\t\\t\\t\\t\\tif (button.disabled) return;\\n\\t\\t\\t\\t\\tevent.preventDefault();\\n\\t\\t\\t\\t\\tbutton.click();\\n\\t\\t\\t\\t});\\n\\t\\t\\t})(sw, label);\\n\\t\\t}\\n\\t}\\n\\n\\t// 模型名会随会话/选择变化,输入卡也会整体重挂载;轮询最省事,且因为有上面的\\n\\t// 提前返回,稳态下每次只花一个 querySelector。\\n\\tfunction start() {\\n\\t\\tapply();\\n\\t\\tbindSwitchRows();\\n\\t\\tsetInterval(function () { apply(); bindSwitchRows(); }, 800);\\n\\t\\twindow.addEventListener(\\"resize\\", apply, { passive: true });\\n\\t\\twindow.addEventListener(\\"orientationchange\\", apply, { passive: true });\\n\\t}\\n\\n\\tif (document.readyState === \\"loading\\") document.addEventListener(\\"DOMContentLoaded\\", start, { once: true });\\n\\telse start();\\n})();"}'),m="piweb-mobile-fit",n=l.A,o=l.js;function p(a=process.env){return(0,f.authEnabled)(a)?"development"===a.NODE_ENV?"dev":null:"auth"}function q(){let a=globalThis,b=Symbol.for("piweb:remote-supervisor"),c=a[b];if(c)return c;let d={lan:null,tunnel:null,lanError:null,publicError:null,enginePath:null,engineChecked:!1};return a[b]=d,d}function r(a=process.env){for(let b of[a.PIWEB_PORT,a.PORT]){let a=Number(b);if(Number.isInteger(a)&&a>=1&&a<=65535)return a}return 30141}function s(a=process.env){let b;return"0"!==(b=(a.PIWEB_REMOTE_LAN??"").trim().toLowerCase())&&"false"!==b&&"off"!==b&&"no"!==b}let t=/vmware|virtualbox|vboxnet|vethernet|hyper-v|wsl|docker|^br-|^veth/i;function u(){let a=q(),b=a.lan?.port??null;return{plugin:"builtin-remote",targetPort:r(),blocked:p(),lan:{running:!!a.lan,port:b,urls:b?(function(a=e().networkInterfaces()){let b=[],c=[];for(let[d,e]of Object.entries(a))for(let a of e??[])!("IPv4"!==a.family||a.internal||a.address.startsWith("169.254."))&&(/^198\.1[89]\./.test(a.address)||(t.test(d)?c:b).push(a.address));return[...b,...c]})().map(a=>`http://${a}:${b}`):[],error:a.lanError},public:{running:!!a.tunnel,url:a.tunnel?.url??null,ready:!!a.tunnel?.ready,engine:a.tunnel?"cloudflared":null,engineAvailable:!a.engineChecked||null!==a.enginePath,error:a.publicError}}}function v(a=function(a=process.env){let b=Number(a.PIWEB_REMOTE_LAN_PORT);return Number.isInteger(b)&&b>=1&&b<=65535?b:30142}(),b="0.0.0.0",c=r()){let d=q();if(d.lan)return Promise.resolve(u().lan);if(d.lanStarting)return d.lanStarting;let e=w(a,b,c).finally(()=>{d.lanStarting===e&&(d.lanStarting=null)});return d.lanStarting=e,e}async function w(a,b,c){let d=q();d.lanError=null;let e=function({targetPort:a,targetHost:b="127.0.0.1",css:c=null,js:d=null,log:e=()=>{}}){let f=new(h()).Agent({keepAlive:!0,scheduling:"lifo",timeout:5e3}),g=h().createServer((g,j)=>{let l,n={...g.headers},o=!!(c||d)&&!("localhost"===(l=(function(a){let b=String(a??"").trim().toLowerCase();if(b.startsWith("[")){let a=b.indexOf("]");return a>=0?b.slice(1,a):b.slice(1)}return 1===(b.match(/:/g)??[]).length?b.slice(0,b.indexOf(":")):b})(n.host).trim().toLowerCase().replace(/^\[|\]$/g,""))||l.endsWith(".localhost")||"::1"===l||"0:0:0:0:0:0:0:1"===l||/^127(?:\.\d{1,3}){3}$/.test(l));o&&String(n.accept??"").includes("text/html")&&(n["accept-encoding"]="identity");let p=h().request({host:b,port:a,method:g.method,path:g.url??"/",headers:n,agent:f},a=>{let b=String(a.headers["content-type"]??"");if(!o||!b.includes("text/html")){j.writeHead(a.statusCode??502,a.headers),(0,i.pipeline)(a,j,()=>void 0);return}let f=[];a.on("error",a=>{e(`[远程连接] 上游中途断开:${a.message}`),j.destroy()}),a.on("data",a=>f.push(a)),a.on("end",()=>{let b,g=Buffer.concat(f);try{b=Buffer.from(function(a,{css:b=null,js:c=null}={}){if(!b&&!c||a.includes(`id="${m}"`))return a;let d=[];b&&d.push(`<style id="${m}">
2
2
  ${b}
3
3
  </style>`),c&&d.push(`<script id="${m}-js">
4
4
  ${c}
5
5
  </script>`);let e=d.join("\n"),f=a.indexOf("</head>");if(f>=0)return`${a.slice(0,f)}${e}
6
- ${a.slice(f)}`;let g=a.indexOf("<body");if(g>=0){let b=a.indexOf(">",g);if(b>=0)return`${a.slice(0,b+1)}${e}${a.slice(b+1)}`}return e+a}((function(a,b){let c=String(b??"").toLowerCase();if(!c||"identity"===c)return a;if("gzip"===c||"x-gzip"===c)return k().gunzipSync(a);if("deflate"===c)return k().inflateSync(a);if("br"===c)return k().brotliDecompressSync(a);throw Error(`不支持的 content-encoding:${b}`)})(h,a.headers["content-encoding"]).toString("utf8"),{css:c,js:d}),"utf8")}catch(c){e(`[远程连接] 注入失败,原样返回:${c instanceof Error?c.message:String(c)}`);let b={...a.headers};delete b["content-encoding"],delete b["content-length"],g.writeHead(a.statusCode??200,b),g.end(h);return}let i={...a.headers};delete i["content-encoding"],delete i["transfer-encoding"],delete i.etag,i["content-length"]=String(b.byteLength),i["cache-control"]="no-store",g.writeHead(a.statusCode??200,i),g.end(b)})}),p=!1;o.on("error",a=>{p||(e(`[远程连接] 代理连不上 PiWeb:${a.message}`),g.headersSent||g.writeHead(502,{"content-type":"text/plain; charset=utf-8"}),g.end(`[远程连接] 连不上 PiWeb(${a.message})`))}),g.on("close",()=>{g.writableFinished||(p=!0,o.destroy())}),f.pipe(o)})}({targetPort:c,css:n,js:o,log:a=>console.warn(a)});try{await new Promise((c,d)=>{e.once("error",d),e.listen(a,b,c)})}catch(a){return d.lanError=a instanceof Error?a.message:String(a),e.close(),t().lan}return d.lan={server:e,port:a},t().lan}},75393:(a,b,c)=>{function d(a=process.env){let b=(a.PI_WEB_AUTH??"").trim().toLowerCase();return"1"===b||"true"===b||"on"===b||"yes"===b}c.d(b,{authEnabled:()=>d}),c(77598)}};
6
+ ${a.slice(f)}`;let g=a.indexOf("<body");if(g>=0){let b=a.indexOf(">",g);if(b>=0)return`${a.slice(0,b+1)}${e}${a.slice(b+1)}`}return e+a}((function(a,b){let c=String(b??"").toLowerCase();if(!c||"identity"===c)return a;if("gzip"===c||"x-gzip"===c)return k().gunzipSync(a);if("deflate"===c)return k().inflateSync(a);if("br"===c)return k().brotliDecompressSync(a);throw Error(`不支持的 content-encoding:${b}`)})(g,a.headers["content-encoding"]).toString("utf8"),{css:c,js:d}),"utf8")}catch(c){e(`[远程连接] 注入失败,原样返回:${c instanceof Error?c.message:String(c)}`);let b={...a.headers};delete b["content-encoding"],delete b["content-length"],j.writeHead(a.statusCode??200,b),j.end(g);return}let h={...a.headers};delete h["content-encoding"],delete h["transfer-encoding"],delete h.etag,h["content-length"]=String(b.byteLength),h["cache-control"]="no-store",j.writeHead(a.statusCode??200,h),j.end(b)})}),q=!1;p.on("error",a=>{q||(e(`[远程连接] 代理连不上 PiWeb:${a.message}`),j.headersSent||j.writeHead(502,{"content-type":"text/plain; charset=utf-8"}),j.end(`[远程连接] 连不上 PiWeb(${a.message})`))}),j.on("close",()=>{j.writableFinished||(q=!0,p.destroy())}),g.pipe(p)});return g.on("close",()=>f.destroy()),g}({targetPort:c,css:n,js:o,log:a=>console.warn(a)});try{await new Promise((c,d)=>{e.once("error",d),e.listen(a,b,c)})}catch(a){return d.lanError=a instanceof Error?a.message:String(a),e.close(),u().lan}return d.lan={server:e,port:a},u().lan}},75393:(a,b,c)=>{function d(a=process.env){let b=(a.PI_WEB_AUTH??"").trim().toLowerCase();return"1"===b||"true"===b||"on"===b||"yes"===b}c.d(b,{authEnabled:()=>d}),c(77598)}};
@@ -1 +1 @@
1
- "use strict";(()=>{var a={};a.id=183,a.ids=[183],a.modules={31421:a=>{a.exports=require("node:child_process")},37067:a=>{a.exports=require("node:http")},38522:a=>{a.exports=require("node:zlib")},44708:a=>{a.exports=require("node:https")},48161:a=>{a.exports=require("node:os")},57075:a=>{a.exports=require("node:stream")},73024:a=>{a.exports=require("node:fs")},76760:a=>{a.exports=require("node:path")},77030:a=>{a.exports=require("node:net")},77598:a=>{a.exports=require("node:crypto")},92322:(a,b,c)=>{async function d(){{let{registerNode:a}=await c.e(807).then(c.bind(c,24807));await a()}}c.r(b),c.d(b,{register:()=>d})}};var b=require("./webpack-runtime.js");b.C(a);var c=b(b.s=92322);module.exports=c})();
1
+ "use strict";(()=>{var a={};a.id=183,a.ids=[183],a.modules={31421:a=>{a.exports=require("node:child_process")},37067:a=>{a.exports=require("node:http")},38522:a=>{a.exports=require("node:zlib")},44708:a=>{a.exports=require("node:https")},48161:a=>{a.exports=require("node:os")},51455:a=>{a.exports=require("node:fs/promises")},57075:a=>{a.exports=require("node:stream")},73024:a=>{a.exports=require("node:fs")},73136:a=>{a.exports=require("node:url")},75430:a=>{a.exports=import("@earendil-works/pi-coding-agent")},76760:a=>{a.exports=require("node:path")},77030:a=>{a.exports=require("node:net")},77598:a=>{a.exports=require("node:crypto")},92322:(a,b,c)=>{async function d(){{let{registerNode:a}=await c.e(807).then(c.bind(c,24807));await a()}}c.r(b),c.d(b,{register:()=>d})},98995:a=>{a.exports=require("node:module")}};var b=require("./webpack-runtime.js");b.C(a);var c=b(b.s=92322);module.exports=c})();