@rainmanhhh/pi-web 0.27.1 → 0.27.2

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 (91) hide show
  1. package/dist/server.mjs +2 -2
  2. package/dist/static/assets/{CodeMirrorEditor-D4RTamlu.js → CodeMirrorEditor-DbGBT78h.js} +1 -1
  3. package/dist/static/assets/{abnfDiagram-VCTEODGH-CbZKeC6e.js → abnfDiagram-VCTEODGH-BCrMSAZU.js} +1 -1
  4. package/dist/static/assets/architecture-7GRP2DOG-BYUeFB6Y.js +1 -0
  5. package/dist/static/assets/{architectureDiagram-5GKGNRK7-DYonwDhA.js → architectureDiagram-5GKGNRK7-BmA_lPnA.js} +1 -1
  6. package/dist/static/assets/{blockDiagram-I7D4REHJ-Cywy506i.js → blockDiagram-I7D4REHJ-KHg9nR-u.js} +1 -1
  7. package/dist/static/assets/{c4Diagram-7LVT6UL2-CVUT7d9M.js → c4Diagram-7LVT6UL2-CRYPrfD_.js} +1 -1
  8. package/dist/static/assets/channel-BtCby7uD.js +1 -0
  9. package/dist/static/assets/{chunk-4HAMMTFA-BygLwfd4.js → chunk-4HAMMTFA-CQ9nGWSS.js} +1 -1
  10. package/dist/static/assets/{chunk-75Z2AOVW-YlPfE7bw.js → chunk-75Z2AOVW-fdCGIqCA.js} +1 -1
  11. package/dist/static/assets/{chunk-DU6HZSFF-CZUDnXVy.js → chunk-DU6HZSFF-DAi9ppCO.js} +1 -1
  12. package/dist/static/assets/{chunk-F27PBJKO-DoE3zEfc.js → chunk-F27PBJKO-2xW0lrn0.js} +1 -1
  13. package/dist/static/assets/{chunk-GMAD6QVW-BWGqjQow.js → chunk-GMAD6QVW-CIz61Eaq.js} +1 -1
  14. package/dist/static/assets/{chunk-GVQU2GXP-B1ZSPi5h.js → chunk-GVQU2GXP-Iz4YWTva.js} +1 -1
  15. package/dist/static/assets/{chunk-IMKFNOWR-BZcOvuli.js → chunk-IMKFNOWR-5iWp34Q2.js} +1 -1
  16. package/dist/static/assets/{chunk-L3NEJ4N5-DXHVKl2y.js → chunk-L3NEJ4N5-CDmnGlLw.js} +1 -1
  17. package/dist/static/assets/{chunk-OSK3NFVY-C11CLoyz.js → chunk-OSK3NFVY-BzZA_E4E.js} +1 -1
  18. package/dist/static/assets/{chunk-P2QGCYS3-CBCmSfxd.js → chunk-P2QGCYS3-CXADwMb9.js} +1 -1
  19. package/dist/static/assets/{chunk-POPQ4Y6H-B6CrugKC.js → chunk-POPQ4Y6H-D3HBTJ9a.js} +1 -1
  20. package/dist/static/assets/{chunk-PWAF6VOD-C7u5CTBe.js → chunk-PWAF6VOD-DmlFmYYI.js} +1 -1
  21. package/dist/static/assets/{chunk-SHT3W25Y-mEOx8mtp.js → chunk-SHT3W25Y-h_j5LLp7.js} +1 -1
  22. package/dist/static/assets/{chunk-SVP7TREG-BkGWtf3T.js → chunk-SVP7TREG-BNQbNGRt.js} +1 -1
  23. package/dist/static/assets/{chunk-TICWLB2K-Ds3-g3Xp.js → chunk-TICWLB2K-DcBkeb3g.js} +1 -1
  24. package/dist/static/assets/classDiagram-ZZMXUADV-k_dNdgy-.js +1 -0
  25. package/dist/static/assets/classDiagram-v2-VYDZK3BY-k_dNdgy-.js +1 -0
  26. package/dist/static/assets/{cynefin-OW5HDTMX-Da-RPWTj.js → cynefin-OW5HDTMX-C9I-z_kX.js} +1 -1
  27. package/dist/static/assets/{cynefinDiagram-5FMLGOSQ-C50kzzHW.js → cynefinDiagram-5FMLGOSQ-C0nTuHyx.js} +1 -1
  28. package/dist/static/assets/{dagre-GXQ25YYZ-DotNX4uX.js → dagre-GXQ25YYZ-D_x4TZlC.js} +1 -1
  29. package/dist/static/assets/{diagram-S7CK7UJ4-BovIoceD.js → diagram-S7CK7UJ4-C8NcqSog.js} +1 -1
  30. package/dist/static/assets/{diagram-UQ7AKVKN-DDXuhowx.js → diagram-UQ7AKVKN-B7xsgZSI.js} +1 -1
  31. package/dist/static/assets/{diagram-VSXAHHWV-hJ8cP1Qt.js → diagram-VSXAHHWV-BoPJj7NR.js} +1 -1
  32. package/dist/static/assets/{diagram-VX7I27RA-P2Hnfn7v.js → diagram-VX7I27RA-BcEF6IJJ.js} +1 -1
  33. package/dist/static/assets/{diagram-Z3DM3KII-9OJX7MpF.js → diagram-Z3DM3KII-DY5TLuwW.js} +1 -1
  34. package/dist/static/assets/{ebnfDiagram-PWID7BFC-l1z-rEWs.js → ebnfDiagram-PWID7BFC-DsObMYPu.js} +1 -1
  35. package/dist/static/assets/{erDiagram-RLTQ6QDP-BaLbO--b.js → erDiagram-RLTQ6QDP-DsXs0isD.js} +1 -1
  36. package/dist/static/assets/eventmodeling-NTZA5JFV-CrYoWq5U.js +1 -0
  37. package/dist/static/assets/flowDiagram-HODETNUW-BRxWFOh7.js +1 -0
  38. package/dist/static/assets/{ganttDiagram-EL5Y4UJY-DSxUnm1B.js → ganttDiagram-EL5Y4UJY-CcExhxQN.js} +1 -1
  39. package/dist/static/assets/{gitGraph-4MIJSDKK-ComCXZgY.js → gitGraph-4MIJSDKK-BUUUdUbT.js} +1 -1
  40. package/dist/static/assets/{gitGraphDiagram-WWUBYQGX-CCNmoTjv.js → gitGraphDiagram-WWUBYQGX-YercAZOH.js} +1 -1
  41. package/dist/static/assets/{highlighted-body-KPVGNVTW-BERsCg4B.js → highlighted-body-KPVGNVTW-D3xF1VCQ.js} +1 -1
  42. package/dist/static/assets/{index-Pt0Kkvr6.js → index-CSgZX3c8.js} +6 -6
  43. package/dist/static/assets/{info-A6RAGUB7-C711_5Xs.js → info-A6RAGUB7-KKijtBgx.js} +1 -1
  44. package/dist/static/assets/{infoDiagram-27XIBGKW-DYIK8TeJ.js → infoDiagram-27XIBGKW-BMvLO0eR.js} +1 -1
  45. package/dist/static/assets/{ishikawaDiagram-5VMMS53U-lKpEUuKl.js → ishikawaDiagram-5VMMS53U-BW6LwhGn.js} +1 -1
  46. package/dist/static/assets/{journeyDiagram-3NMN7TZE-BwH_y9UK.js → journeyDiagram-3NMN7TZE-JbjjYvRB.js} +1 -1
  47. package/dist/static/assets/{kanban-definition-UXKFOSKX-hLw54D-r.js → kanban-definition-UXKFOSKX-CkS-F77-.js} +1 -1
  48. package/dist/static/assets/{line-CoxwWrtT.js → line-B_Ym56ed.js} +1 -1
  49. package/dist/static/assets/mermaid-HWGCJPDP-CUIviAB6.js +1 -0
  50. package/dist/static/assets/{mermaid-parser.core-rgC9WaV0.js → mermaid-parser.core-BGTtlTMx.js} +3 -3
  51. package/dist/static/assets/{mermaid.core-BRFuwBV2.js → mermaid.core-BCjXuPP3.js} +4 -4
  52. package/dist/static/assets/{mindmap-definition-YA3MSWOX-CQoN5XX-.js → mindmap-definition-YA3MSWOX-BFw0TSrX.js} +1 -1
  53. package/dist/static/assets/{packet-AYTQ26CC-DUzfTlYp.js → packet-AYTQ26CC-BinPOtAP.js} +1 -1
  54. package/dist/static/assets/{pegDiagram-XKGWAZYB-V_nUxJDi.js → pegDiagram-XKGWAZYB-kMDXdnId.js} +1 -1
  55. package/dist/static/assets/{pie-WAS4IAKB-D6O14WjL.js → pie-WAS4IAKB-3oyQnbOw.js} +1 -1
  56. package/dist/static/assets/{pieDiagram-E7YTZNPT-Dn_RGlKJ.js → pieDiagram-E7YTZNPT-C8sxZmWz.js} +1 -1
  57. package/dist/static/assets/{quadrantDiagram-AXDQQJYC-1JNYGLfZ.js → quadrantDiagram-AXDQQJYC-FwkyFtfx.js} +1 -1
  58. package/dist/static/assets/{radar-RG4KPBEZ-DAkllOKA.js → radar-RG4KPBEZ-DiqCVr62.js} +1 -1
  59. package/dist/static/assets/{railroad-74A4TZTK-B7R2ARxz.js → railroad-74A4TZTK-FoZekIy-.js} +1 -1
  60. package/dist/static/assets/railroad-abnf-HS5TGJTU-DtYll0P0.js +1 -0
  61. package/dist/static/assets/railroad-ebnf-LZEXJU2U-BKNzMx-f.js +1 -0
  62. package/dist/static/assets/railroad-peg-WCYAUIDC-ByRhjjNa.js +1 -0
  63. package/dist/static/assets/{railroadDiagram-O6MQD6OU-D5O2aG_5.js → railroadDiagram-O6MQD6OU-CBF9Lceh.js} +1 -1
  64. package/dist/static/assets/{requirementDiagram-BXWQKSXE-Z8N-lRG1.js → requirementDiagram-BXWQKSXE-wa9oN2BC.js} +1 -1
  65. package/dist/static/assets/{sankeyDiagram-P5KCCOFB-BSbxroku.js → sankeyDiagram-P5KCCOFB-DteMo2lX.js} +1 -1
  66. package/dist/static/assets/{sequenceDiagram-WJ2MYXX4-Cvxa4dXz.js → sequenceDiagram-WJ2MYXX4-B9nGGYi2.js} +1 -1
  67. package/dist/static/assets/{stateDiagram-D77RDMKH-C8gQxGVb.js → stateDiagram-D77RDMKH-D1vN3ZNL.js} +1 -1
  68. package/dist/static/assets/stateDiagram-v2-MP3YSRHH-BHR-GGql.js +1 -0
  69. package/dist/static/assets/{swimlanes-42K2YHIH-DtRgGy4b.js → swimlanes-42K2YHIH-CGWORlnl.js} +1 -1
  70. package/dist/static/assets/swimlanesDiagram-VR7AAH4N-sAk63Pu3.js +8 -0
  71. package/dist/static/assets/{timeline-definition-24CTP7MA-D8crq-no.js → timeline-definition-24CTP7MA-CNrC9zeo.js} +1 -1
  72. package/dist/static/assets/{treeView-Q6P3EWNA-CuEDWASZ.js → treeView-Q6P3EWNA-DmkQf6XA.js} +1 -1
  73. package/dist/static/assets/{treemap-WGGIJYW6-Bptz30bW.js → treemap-WGGIJYW6-BqLo8v_x.js} +1 -1
  74. package/dist/static/assets/{vennDiagram-4TSXK5OY-BZwoinI7.js → vennDiagram-4TSXK5OY-GgQEADEP.js} +1 -1
  75. package/dist/static/assets/{wardley-WFR3VGLG-Cxbs4E9n.js → wardley-WFR3VGLG-B597uYIV.js} +1 -1
  76. package/dist/static/assets/{wardleyDiagram-VM6X3IG4-D1bszZAO.js → wardleyDiagram-VM6X3IG4-DuiGEZBR.js} +1 -1
  77. package/dist/static/assets/{xychartDiagram-S5SC5T6Z-By5wkKpH.js → xychartDiagram-S5SC5T6Z-AXFxoh4n.js} +1 -1
  78. package/dist/static/index.html +1 -1
  79. package/package.json +1 -1
  80. package/dist/static/assets/architecture-7GRP2DOG-Dcg4kF3j.js +0 -1
  81. package/dist/static/assets/channel-CQpj_5zC.js +0 -1
  82. package/dist/static/assets/classDiagram-ZZMXUADV-CP7rwkx_.js +0 -1
  83. package/dist/static/assets/classDiagram-v2-VYDZK3BY-CP7rwkx_.js +0 -1
  84. package/dist/static/assets/eventmodeling-NTZA5JFV-DdKjZRWA.js +0 -1
  85. package/dist/static/assets/flowDiagram-HODETNUW-BQCB0FTw.js +0 -1
  86. package/dist/static/assets/mermaid-HWGCJPDP-BV4MN2xu.js +0 -1
  87. package/dist/static/assets/railroad-abnf-HS5TGJTU-HTkU1JRw.js +0 -1
  88. package/dist/static/assets/railroad-ebnf-LZEXJU2U-CxXax4Fr.js +0 -1
  89. package/dist/static/assets/railroad-peg-WCYAUIDC-CypIV3qj.js +0 -1
  90. package/dist/static/assets/stateDiagram-v2-MP3YSRHH-BVdObUg9.js +0 -1
  91. package/dist/static/assets/swimlanesDiagram-VR7AAH4N-D3ORM6ja.js +0 -8
package/dist/server.mjs CHANGED
@@ -257,7 +257,7 @@ Expecting one of '${n.join("', '")}'`);if(this._lifeCycleHooks[e])this._lifeCycl
257
257
  `),this.outputHelp({error:!0});let n=t||{},r=n.exitCode||1,i=n.code||"commander.error";this._exit(r,i,e)}_parseOptionsEnv(){this.options.forEach((e)=>{if(e.envVar&&e.envVar in me.env){let t=e.attributeName();if(this.getOptionValue(t)===void 0||["default","config","env"].includes(this.getOptionValueSource(t)))if(e.required||e.optional)this.emit(`optionEnv:${e.name()}`,me.env[e.envVar]);else this.emit(`optionEnv:${e.name()}`)}})}_parseOptionsImplied(){let e=new uh(this.options),t=(n)=>this.getOptionValue(n)!==void 0&&!["default","implied"].includes(this.getOptionValueSource(n));this.options.filter((n)=>n.implied!==void 0&&t(n.attributeName())&&e.valueFromOption(this.getOptionValue(n.attributeName()),n)).forEach((n)=>{Object.keys(n.implied).filter((r)=>!t(r)).forEach((r)=>{this.setOptionValueWithSource(r,n.implied[r],"implied")})})}missingArgument(e){let t=`error: missing required argument '${e}'`;this.error(t,{code:"commander.missingArgument"})}optionMissingArgument(e){let t=`error: option '${e.flags}' argument missing`;this.error(t,{code:"commander.optionMissingArgument"})}missingMandatoryOptionValue(e){let t=`error: required option '${e.flags}' not specified`;this.error(t,{code:"commander.missingMandatoryOptionValue"})}_conflictingOption(e,t){let n=(o)=>{let s=o.attributeName(),a=this.getOptionValue(s),c=this.options.find((d)=>d.negate&&s===d.attributeName()),u=this.options.find((d)=>!d.negate&&s===d.attributeName());if(c&&(c.presetArg===void 0&&a===!1||c.presetArg!==void 0&&a===c.presetArg))return c;return u||o},r=(o)=>{let s=n(o),a=s.attributeName();if(this.getOptionValueSource(a)==="env")return`environment variable '${s.envVar}'`;return`option '${s.flags}'`},i=`error: ${r(e)} cannot be used with ${r(t)}`;this.error(i,{code:"commander.conflictingOption"})}unknownOption(e){if(this._allowUnknownOption)return;let t="";if(e.startsWith("--")&&this._showSuggestionAfterError){let r=[],i=this;do{let o=i.createHelp().visibleOptions(i).filter((s)=>s.long).map((s)=>s.long);r=r.concat(o),i=i.parent}while(i&&!i._enablePositionalOptions);t=lh(e,r)}let n=`error: unknown option '${e}'${t}`;this.error(n,{code:"commander.unknownOption"})}_excessArguments(e){if(this._allowExcessArguments)return;let t=this.registeredArguments.length,n=t===1?"":"s",r=e.length,i=this.parent?` for '${this.name()}'`:"",o=e.join(", "),s=`error: too many arguments${i}. Expected ${t} argument${n} but got ${r}: ${o}.`;this.error(s,{code:"commander.excessArguments"})}unknownCommand(){let e=this.args[0],t="";if(this._showSuggestionAfterError){let r=[];this.createHelp().visibleCommands(this).forEach((i)=>{if(r.push(i.name()),i.alias())r.push(i.alias())}),t=lh(e,r)}let n=`error: unknown command '${e}'${t}`;this.error(n,{code:"commander.unknownCommand"})}version(e,t,n){if(e===void 0)return this._version;this._version=e,t=t||"-V, --version",n=n||"output the version number";let r=this.createOption(t,n);return this._versionOptionName=r.attributeName(),this._registerOption(r),this.on("option:"+r.name(),()=>{this._outputConfiguration.writeOut(`${e}
258
258
  `),this._exit(0,"commander.version",e)}),this}description(e,t){if(e===void 0&&t===void 0)return this._description;if(this._description=e,t)this._argsDescription=t;return this}summary(e){if(e===void 0)return this._summary;return this._summary=e,this}alias(e){if(e===void 0)return this._aliases[0];let t=this;if(this.commands.length!==0&&this.commands[this.commands.length-1]._executableHandler)t=this.commands[this.commands.length-1];if(e===t._name)throw Error("Command alias can't be the same as its name");let n=this.parent?._findCommand(e);if(n){let r=[n.name()].concat(n.aliases()).join("|");throw Error(`cannot add alias '${e}' to command '${this.name()}' as already have command '${r}'`)}return t._aliases.push(e),this}aliases(e){if(e===void 0)return this._aliases;return e.forEach((t)=>this.alias(t)),this}usage(e){if(e===void 0){if(this._usage)return this._usage;let t=this.registeredArguments.map((n)=>Uu(n));return[].concat(this.options.length||this._helpOption!==null?"[options]":[],this.commands.length?"[command]":[],this.registeredArguments.length?t:[]).join(" ")}return this._usage=e,this}name(e){if(e===void 0)return this._name;return this._name=e,this}helpGroup(e){if(e===void 0)return this._helpGroupHeading??"";return this._helpGroupHeading=e,this}commandsGroup(e){if(e===void 0)return this._defaultCommandGroup??"";return this._defaultCommandGroup=e,this}optionsGroup(e){if(e===void 0)return this._defaultOptionGroup??"";return this._defaultOptionGroup=e,this}_initOptionGroup(e){if(this._defaultOptionGroup&&!e.helpGroupHeading)e.helpGroup(this._defaultOptionGroup)}_initCommandGroup(e){if(this._defaultCommandGroup&&!e.helpGroup())e.helpGroup(this._defaultCommandGroup)}nameFromFilename(e){return this._name=Vn.basename(e,Vn.extname(e)),this}executableDir(e){if(e===void 0)return this._executableDir;return this._executableDir=e,this}helpInformation(e){let t=this.createHelp(),n=this._getOutputContext(e);t.prepareContext({error:n.error,helpWidth:n.helpWidth,outputHasColors:n.hasColors});let r=t.formatHelp(this,t);if(n.hasColors)return r;return this._outputConfiguration.stripColor(r)}_getOutputContext(e){e=e||{};let t=!!e.error,n,r,i;if(t)n=(s)=>this._outputConfiguration.writeErr(s),r=this._outputConfiguration.getErrHasColors(),i=this._outputConfiguration.getErrHelpWidth();else n=(s)=>this._outputConfiguration.writeOut(s),r=this._outputConfiguration.getOutHasColors(),i=this._outputConfiguration.getOutHelpWidth();return{error:t,write:(s)=>{if(!r)s=this._outputConfiguration.stripColor(s);return n(s)},hasColors:r,helpWidth:i}}outputHelp(e){let t;if(typeof e==="function")t=e,e=void 0;let n=this._getOutputContext(e),r={error:n.error,write:n.write,command:this};this._getCommandAndAncestors().reverse().forEach((o)=>o.emit("beforeAllHelp",r)),this.emit("beforeHelp",r);let i=this.helpInformation({error:n.error});if(t){if(i=t(i),typeof i!=="string"&&!Buffer.isBuffer(i))throw Error("outputHelp callback must return a string or a Buffer")}if(n.write(i),this._getHelpOption()?.long)this.emit(this._getHelpOption().long);this.emit("afterHelp",r),this._getCommandAndAncestors().forEach((o)=>o.emit("afterAllHelp",r))}helpOption(e,t){if(typeof e==="boolean"){if(e){if(this._helpOption===null)this._helpOption=void 0;if(this._defaultOptionGroup)this._initOptionGroup(this._getHelpOption())}else this._helpOption=null;return this}if(this._helpOption=this.createOption(e??"-h, --help",t??"display help for command"),e||t)this._initOptionGroup(this._helpOption);return this}_getHelpOption(){if(this._helpOption===void 0)this.helpOption(void 0,void 0);return this._helpOption}addHelpOption(e){return this._helpOption=e,this._initOptionGroup(e),this}help(e){this.outputHelp(e);let t=Number(me.exitCode??0);if(t===0&&e&&typeof e!=="function"&&e.error)t=1;this._exit(t,"commander.help","(outputHelp)")}addHelpText(e,t){let n=["beforeAll","before","after","afterAll"];if(!n.includes(e))throw Error(`Unexpected value for position to addHelpText.
259
259
  Expecting one of '${n.join("', '")}'`);let r=`${e}Help`;return this.on(r,(i)=>{let o;if(typeof t==="function")o=t({error:i.error,command:i.command});else o=t;if(o)i.write(`${o}
260
- `)}),this}_outputHelpIfRequested(e){let t=this._getHelpOption();if(t&&e.find((r)=>t.is(r)))this.outputHelp(),this._exit(0,"commander.helpDisplayed","(outputHelp)")}}function b2(e){return e.map((t)=>{if(!t.startsWith("--inspect"))return t;let n,r="127.0.0.1",i="9229",o;if((o=t.match(/^(--inspect(-brk)?)$/))!==null)n=o[1];else if((o=t.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))!==null)if(n=o[1],/^\d+$/.test(o[3]))i=o[3];else r=o[3];else if((o=t.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null)n=o[1],r=o[3],i=o[4];if(n&&i!=="0")return`${n}=${r}:${parseInt(i)+1}`;return t})}function x2(){if(me.env.NO_COLOR||me.env.FORCE_COLOR==="0"||me.env.FORCE_COLOR==="false")return!1;if(me.env.FORCE_COLOR||me.env.CLICOLOR_FORCE!==void 0)return!0;return}var $ge=new lo;var ra={name:"@rainmanhhh/pi-web",version:"0.27.1",description:"Web UI for the pi coding agent (fork of @agegr/pi-web)",homepage:"https://gitee.com/dsxbygzzl/pi-web#readme",repository:{type:"git",url:"git+https://gitee.com/dsxbygzzl/pi-web.git"},bugs:{url:"https://gitee.com/dsxbygzzl/pi-web/issues"},author:"rainmanhhh",license:"MIT",publishConfig:{access:"public",registry:"https://registry.npmjs.org"},engines:{node:">=24.0.0"},files:["dist","public","extensions","package.json"],bin:{"pi-web":"dist/server.mjs"},scripts:{dev:"vite","dev:lan":"vite --host 0.0.0.0",mb:"bun run --env-file=.env.manual api",mf:"bun run --env-file=.env.manual dev -- --port 3001",api:"bun run server/main.ts","api:node":"bun run build:server && node dist/server.mjs","build:server":'bun build server/main.ts --target node --outfile dist/server.mjs --minify --external "@earendil-works/*" --define "process.env.PI_WEB_PACKAGED=1"',"e2e:stop":"bun run scripts/e2e-stop.mjs","e2e:prepare":"bun run scripts/e2e-prepare.mjs",build:"vite build && bun run scripts/prune-fonts.mjs","build:analyze":"vite build --config scripts/analyze-bundle.config.ts && bun run scripts/prune-fonts.mjs",lint:"oxlint --fix",fta:"bun scripts/fta-gate.mjs . --output-limit 15",jscpd:"jscpd --config .jscpd.json",check:"tsc --noEmit",format:"biome check --write .",prepublishOnly:"bun run check && bun run build && bun run build:server","test:e2e":"cross-env CODEBUDDY_SAFE_DELETE_ENABLED=0 bun run e2e:stop && playwright test","test:unit":"vitest run","test:unit:bun":"bun --bun run test:unit",prepare:"husky || true"},dependencies:{"@codemirror/commands":"^6.11.0","@codemirror/lang-css":"^6.3.1","@codemirror/lang-html":"^6.4.12","@codemirror/lang-javascript":"^6.2.5","@codemirror/lang-json":"^6.0.2","@codemirror/lang-markdown":"^6.5.2","@codemirror/lang-yaml":"^6.1.3","@codemirror/language":"^6.12.4","@codemirror/state":"^6.7.1","@codemirror/theme-one-dark":"^6.1.3","@codemirror/view":"^6.43.9","@earendil-works/pi-agent-core":"1.0.2","@earendil-works/pi-ai":"1.0.2","@earendil-works/pi-coding-agent":"1.0.2","@earendil-works/pi-tui":"1.0.2","@hono/node-server":"^2.1.1","class-variance-authority":"^0.7.1",clsx:"^2.1.1",codemirror:"^6.0.2",hono:"^4.13.5","lucide-react":"^1.37.0","p-defer":"^4.0.1",pointrix:"^1.1.0","proper-lockfile":"4.1.2","radix-ui":"^1.6.7",react:"^19.2.8","react-dom":"^19.2.8",shadcn:"^4.19.0",streamdown:"2.6.0","tailwind-merge":"^3.6.0","tw-animate-css":"^1.4.0",virtua:"^0.50.6",ws:"^8.21.3"},devDependencies:{"@biomejs/biome":"^2.5.13","@lobehub/icons":"^5.16.0","@playwright/test":"^1.62.1","@tailwindcss/postcss":"^4.3.3","@testing-library/dom":"^10.4.1","@testing-library/react":"^16.3.3","@types/node":"^25.9.5","@types/proper-lockfile":"4.1.4","@types/react":"^19.2.18","@types/react-dom":"^19.2.5","@types/react-resizable":"^4.0.0","@types/react-syntax-highlighter":"^15.5.13","@types/ws":"^8.18.1","@vitejs/plugin-react":"^6.1.1",commander:"^15.0.0","cross-env":"^10.1.0","fta-cli":"^3.0.1",husky:"^9.1.7",jiti:"^2.7.0",jscpd:"^5.1.0",jsdom:"^30.0.1",katex:"^0.18.4","lint-staged":"^17.4.1",mammoth:"^1.12.2",mermaid:"^11.17.2",oxlint:"^1.80.0",postcss:"^8.5.26","react-markdown":"^10.1.0","react-syntax-highlighter":"^16.1.1","rehype-katex":"^7.0.1","rehype-raw":"^7.0.0","rehype-sanitize":"^6.0.0","remark-gfm":"^4.0.1","remark-math":"^6.0.0",tailwindcss:"^4.3.3",typescript:"^7.0.2",vite:"^8.2.2","vite-plugin-remove-console":"^2.2.0","vite-plugin-svgr":"^5.2.0",vitest:"^4.1.11"},type:"module",overrides:{katex:"^0.18.4"}};var fh=!1,v2=performance.now();function w2(e){if(fh=e,v2=performance.now(),fh)Qe("boot","debug log enabled")}function ze(e){return(t,n)=>Qe(e,t,n)}function Qe(e,t,n){if(!fh)return;let r=performance.now()-v2,i=new Date,o=(a,c=2)=>String(a).padStart(c,"0"),s=`${o(i.getHours())}:${o(i.getMinutes())}:${o(i.getSeconds())}.${o(i.getMilliseconds(),3)}`;console.debug(`[debug][${e}][${s}][+${r.toFixed(1)}ms] ${t}${n?` — ${n}`:""}`)}import{existsSync as IN,mkdirSync as MN,readFileSync as N2,writeFileSync as NN}from"node:fs";import{dirname as BN,join as B2}from"node:path";import{getAgentDir as L2}from"@earendil-works/pi-coding-agent";var E2=[{label:{en:"Explore project","zh-CN":"阅读项目"},message:{en:"Explore the current project and summarize the overall directory structure and responsibilities of core modules.","zh-CN":"阅读当前项目,总结整体目录结构与核心模块的职责。"}},{label:{en:"Review workspace changes","zh-CN":"审查工作区改动"},message:{en:"Review all changes in the current workspace, point out potential issues and improvements.","zh-CN":"审查当前工作区的所有改动,指出潜在问题与改进点。"}},{label:{en:"Find and fix bugs","zh-CN":"寻找并修复bug"},message:{en:"Inspect the current codebase, find and fix existing bugs.","zh-CN":"检查当前代码,寻找并修复其中存在的 bug。"}}];var S2=E2;import{readFileSync as Nu,writeFileSync as A2}from"node:fs";import{join as k2}from"node:path";import{getAgentDir as ON}from"@earendil-works/pi-coding-agent";var Pu=["off","minimal","low","medium","high","xhigh","max"];function Ou(e){return e==="en"||e==="zh-CN"?e:void 0}function gh(e){return e==="dark"||e==="light"?e:void 0}function mh(e){return typeof e==="string"&&Pu.includes(e)?e:void 0}function yh(e){if(typeof e!=="object"||e===null)return;let t=e;if(typeof t.enabled!=="boolean")return;if(typeof t.reserveTokens!=="number"||!Number.isInteger(t.reserveTokens)||t.reserveTokens<=0)return;if(typeof t.keepRecentTokens!=="number"||!Number.isInteger(t.keepRecentTokens)||t.keepRecentTokens<=0)return;return{enabled:t.enabled,reserveTokens:t.reserveTokens,keepRecentTokens:t.keepRecentTokens}}function PN(e){if(typeof e!=="object"||e===null)return;let t=e,n={};if(typeof t.timeoutMs==="number"&&Number.isInteger(t.timeoutMs)&&t.timeoutMs>0)n.timeoutMs=t.timeoutMs;if(typeof t.maxRetries==="number"&&Number.isInteger(t.maxRetries)&&t.maxRetries>0)n.maxRetries=t.maxRetries;if(typeof t.maxRetryDelayMs==="number"&&Number.isInteger(t.maxRetryDelayMs)&&t.maxRetryDelayMs>0)n.maxRetryDelayMs=t.maxRetryDelayMs;return Object.keys(n).length>0?n:void 0}function bh(e){if(typeof e!=="object"||e===null)return;let t=e;if(typeof t.maxRetries!=="number"||!Number.isInteger(t.maxRetries)||t.maxRetries<=0)return;if(typeof t.baseDelayMs!=="number"||!Number.isInteger(t.baseDelayMs)||t.baseDelayMs<=0)return;let n={maxRetries:t.maxRetries,baseDelayMs:t.baseDelayMs};if(typeof t.enabled==="boolean")n.enabled=t.enabled;let r=PN(t.provider);if(r!==void 0)n.provider=r;return n}function Iu(e){if(e==="ask"||e==="always"||e==="never")return e;if(e==="trust")return"always";if(e==="deny")return"never";return}function Mu(e){return typeof e==="number"&&Number.isFinite(e)&&e>=0.85&&e<=1.3?e:void 0}var ia=(e)=>typeof e==="boolean"?e:void 0,hh=(e)=>typeof e==="number"&&Number.isInteger(e)&&e>0?e:void 0,T2=(e)=>typeof e==="string"&&e.trim()!==""?e:void 0;function C2(e,t){if(typeof e!=="object"||e===null)return;let n=e,r={};for(let[i,o]of Object.entries(t)){let s=o(n[i]);if(s!==void 0)r[i]=s}return Object.keys(r).length>0?r:void 0}var Xn=(e)=>Array.isArray(e)&&e.every((t)=>typeof t==="string"&&t.length>0)?e:void 0,xh=[{key:"defaultTools",validate:Xn},{key:"httpProxy",validate:T2},{key:"httpIdleTimeoutMs",validate:hh},{key:"websocketConnectTimeoutMs",validate:hh},{key:"enableAnalytics",validate:ia},{key:"enableInstallTelemetry",validate:ia},{key:"trackingId",validate:T2},{key:"branchSummary",validate:(e)=>C2(e,{reserveTokens:hh,skipPrompt:ia})},{key:"images",validate:(e)=>C2(e,{autoResize:ia,blockImages:ia})}];function vh(e){return yh(Kn("compaction",e))}function U2(e,t){let n=yh(e);if(!n)return vh(t);return fo("compaction",n,t),n}function wh(e){return bh(Kn("retry",e))}function R2(e,t){let n=bh(e);if(!n)return wh(t);return fo("retry",n,t),n}function Kn(e,t){try{return JSON.parse(Nu(O2(t),"utf8"))[e]}catch{return}}function fo(e,t,n){try{let r=O2(n),i={};try{i=JSON.parse(Nu(r,"utf8"))}catch{i={}}if(t===void 0)delete i[e];else i[e]=t;A2(r,JSON.stringify(i,null,2),"utf8")}catch{}}function F2(e){return k2(e,".pi","settings.json")}function Bu(e,t){try{return JSON.parse(Nu(F2(e),"utf8"))[t]}catch{return}}function P2(e,t,n){try{let r=F2(e),i={};try{i=JSON.parse(Nu(r,"utf8"))}catch{i={}}if(n===void 0)delete i[t];else i[t]=n;A2(r,JSON.stringify(i,null,2),"utf8")}catch{}}function po(e,t){let n=Kn(e,t);return typeof n==="string"?n:void 0}function Lu(e,t,n){if(t===void 0)return po(e,n);return fo(e,t,n),t}function O2(e){return k2(e??ON(),"settings.json")}function oa(e){return gh(po("theme",e))??"light"}function I2(e,t){let n=gh(e);if(!n)return oa(t);return Lu("theme",n,t),n}function Wu(e){let t={};for(let{key:n,validate:r}of xh){let i=r(Kn(n,e));if(i!==void 0)t[n]=i}return Object.keys(t).length>0?t:void 0}function M2(e,t){for(let{key:n,validate:r}of xh){if(!(n in e))continue;let i=r(e[n]);if(i===void 0)continue;fo(n,i,t)}return Wu(t)}var ju=new Map;function _h(e){return B2(e??L2(),"pi-web","config.json")}function LN(e){return B2(e??L2(),"pi-web-preferences.json")}function Dh(e){try{if(IN(_h(e)))return;let t=JSON.parse(N2(LN(e),"utf8"));Eh({firstPaint:{locale:Ou(t.firstPaint?.locale),fontScale:Mu(t.firstPaint?.fontScale)},preferences:t.preferences??{}},e)}catch{}}function WN(e){let t=mh(po("defaultThinkingLevel",e)),n=vh(e),r=wh(e),i=Iu(po("defaultProjectTrust",e)),o=Wu(e);return{theme:oa(e),...t!==void 0?{defaultThinkingLevel:t}:{},...n!==void 0?{compaction:n}:{},...r!==void 0?{retry:r}:{},...i!==void 0?{defaultProjectTrust:i}:{},...o!==void 0?{piSettings:o}:{}}}function Zn(e){let t=e===void 0,n=e??"",r=t?ju.get(n):void 0;if(!t||r===void 0||r===null)try{let i=N2(_h(e),"utf8"),o=JSON.parse(i);r={firstPaint:{locale:Ou(o.firstPaint?.locale),fontScale:Mu(o.firstPaint?.fontScale)},preferences:o.preferences??{},theme:oa(e)},ju.set(n,r)}catch{if(r={firstPaint:{},preferences:{},theme:oa(e)},t)ju.set(n,r)}return{...r,...WN(e)}}function Eh(e,t){try{let n=_h(t);MN(BN(n),{recursive:!0});let r={firstPaint:e.firstPaint,preferences:e.preferences};if(NN(n,JSON.stringify(r,null,2),"utf8"),t===void 0)ju.set("",e)}catch{}}function jN(e,t){return{...e,...t.locale!==void 0?{locale:Ou(t.locale)??e.locale}:{},...t.fontScale!==void 0?{fontScale:Mu(t.fontScale)??e.fontScale}:{}}}function qN(e,t){if(e===void 0)return Iu(po("defaultProjectTrust",t));let n=Iu(e);if(n===void 0)return;return Lu("defaultProjectTrust",n,t),n}function Sh(e,t){let n=Zn(t),r=jN(n.firstPaint,e),i=n.theme;if(e.theme!==void 0)i=I2(e.theme,t);let o=Lu("defaultThinkingLevel",mh(e.defaultThinkingLevel),t),s=U2(e.compaction,t),a=R2(e.retry,t),c=qN(e.defaultProjectTrust,t),u=e.piSettings===void 0?Wu(t):M2(e.piSettings,t),d={firstPaint:r,preferences:n.preferences,theme:i,defaultThinkingLevel:o,...s!==void 0?{compaction:s}:{},...a!==void 0?{retry:a}:{},...c!==void 0?{defaultProjectTrust:c}:{},...u!==void 0?{piSettings:u}:{}};return Eh(d,t),d}function qu(e,t){let n=Zn(t),r={firstPaint:n.firstPaint,preferences:{...n.preferences,...e},theme:n.theme};return Eh(r,t),r}function Th(e){let{preferences:t}=Zn(e);if(t.startScreenMessages!==void 0)return;qu({startScreenMessages:S2},e)}import{DefaultResourceLoader as nB,getAgentDir as z2}from"@earendil-works/pi-coding-agent";import{hasTrustRequiringProjectResources as $N,ProjectTrustStore as Ch}from"@earendil-works/pi-coding-agent";function Oe(e,t){if(!(Boolean(e)&&$N(e)))return{requiresTrust:!1,trusted:!0};return{requiresTrust:!0,trusted:new Ch(t).get(e)===!0}}function W2(e,t){let n=Oe(e,t);if(!n.requiresTrust)return n;return new Ch(t).set(e,!0),{requiresTrust:!0,trusted:!0}}function ho(e,t){if(!Oe(e,t).requiresTrust)return;let r=new Ch(t);return{resolveProjectTrust:async()=>r.get(e)===!0}}import{existsSync as HN,readFileSync as GN}from"node:fs";import{homedir as zN}from"node:os";import{isAbsolute as VN,join as sa,relative as XN,resolve as j2,sep as KN}from"node:path";function ZN({homeDir:e=zN(),xdgStateHome:t=process.env.XDG_STATE_HOME}={}){return t?sa(t,"skills",".skill-lock.json"):sa(e,".agents",".skill-lock.json")}function q2(e){try{let t=JSON.parse(GN(e,"utf8"));return t.skills&&typeof t.skills==="object"?t.skills:{}}catch{return{}}}function $2(e,t){let n=XN(j2(t),j2(e));return n!==""&&n!==".."&&!n.startsWith(`..${KN}`)&&!VN(n)}function YN(e,t){if(e[t])return e[t];let n=t.toLowerCase(),r=Object.keys(e).find((i)=>i.toLowerCase()===n);return r?e[r]:void 0}function JN(e,t){if(t!=="github")return e.replace(/\/$/,"");return e.replace(/^git\+/,"").replace(/^https?:\/\/github\.com\//,"").replace(/^git@github\.com:/,"").replace(/\.git$/,"").replace(/\/$/,"")}function QN(e,t){if(!e||e.includes("://")||e.startsWith("git@"))return;let n=e.split("/").filter(Boolean).map(encodeURIComponent).join("/");if(!n)return;return`https://skills.sh/${n}/${encodeURIComponent(t)}`}function eB(e,t){let n=typeof e.sourceType==="string"?e.sourceType:void 0,r=JN(e.source.trim(),n),i=typeof e.skillPath==="string"?e.skillPath:void 0,o=typeof e.ref==="string"?e.ref:void 0,s=t==="global"?e.skillFolderHash:e.computedHash;return{sourceType:n,source:r,skillPath:i,ref:o,versionHash:typeof s==="string"&&s?s:void 0}}function tB(e,t){let{sourceType:n,source:r,skillPath:i,versionHash:o,ref:s}=e,a=n==="github"&&/^[\w.-]+\/[\w.-]+$/.test(r);return Boolean(a&&i&&o&&(t==="global"||!s))}function H2(e,t,n){let r=YN(e,t);if(!r||typeof r.source!=="string"||!r.source.trim())return;let{sourceType:i,source:o,skillPath:s,ref:a,versionHash:c}=eB(r,n);if(!o)return;return{package:`${o}@${t}`,scope:n,source:o,sourceType:i,skillsShUrl:i==="local"?void 0:QN(o,t),...s&&{skillPath:s},...a&&{ref:a},...c&&{versionHash:c},canCheckForUpdates:tB({sourceType:i,source:o,skillPath:s,versionHash:c,ref:a},n)}}function G2(e,{cwd:t,agentDir:n,globalLockPath:r=ZN(),projectLockPath:i=sa(t,"skills-lock.json")}){let o=q2(r),s=q2(i),a=sa(n,"skills"),c=sa(t,".pi","skills");return e.map((u)=>{if(!HN(u.filePath))return u;let d=$2(u.filePath,a)?H2(o,u.name,"global"):$2(u.filePath,c)?H2(s,u.name,"project"):void 0;return d?{...u,install:d}:u})}var rB=32,gi=new Map,Ah=new Map;async function cn(e,t){let n=t?.forceFresh??!1,r=e===""?z2():e;if(!n){let s=gi.get(e);if(s)return{skills:[...s.skills.values()],diagnostics:s.diagnostics,projectResourcesLoaded:s.projectResourcesLoaded}}let i=Ah.get(e);if(i)return i;let o=iB(r,e);Ah.set(e,o);try{return await o}finally{Ah.delete(e)}}async function iB(e,t){let n=z2(),r=new nB({cwd:e,agentDir:n});await r.reload(ho(e,n));let{skills:i,diagnostics:o}=r.getSkills(),s={skills:G2(i,{cwd:e,agentDir:n}),diagnostics:o,projectResourcesLoaded:Oe(e,n).trusted},a=new Map;for(let c of s.skills)a.set(c.filePath,c);return gi.set(t,{skills:a,diagnostics:s.diagnostics,projectResourcesLoaded:s.projectResourcesLoaded,loadedAt:Date.now()}),oB(),s}function oB(){while(gi.size>rB){let e=null,t=1/0;for(let[n,r]of gi){if(n==="")continue;if(r.loadedAt<t)t=r.loadedAt,e=n}if(e===null)break;gi.delete(e)}}function V2(e,t,n){let r=gi.get(e);if(!r)return;let i=r.skills.get(t);if(!i){gi.delete(e);return}if(n.disableModelInvocation!==void 0)i.disableModelInvocation=n.disableModelInvocation}var $u=null;function X2(e){if($u)return;let t=(async()=>{for(let n of e)await Promise.allSettled([n()])})();$u=t,t.then(()=>{$u=null})}function _n(){return $u??Promise.resolve()}var K2={port:31415};import{getAgentDir as Qfe}from"@earendil-works/pi-coding-agent";var kh=(e,t,n)=>(r,i)=>{let o=-1;return s(0);async function s(a){if(a<=o)throw Error("next() called multiple times");o=a;let c,u=!1,d;if(e[a])d=e[a][0][0],r.req.routeIndex=a;else d=a===e.length&&i||void 0;if(d)try{c=await d(r,()=>s(a+1))}catch(f){if(f instanceof Error&&t)r.error=f,c=await t(f,r),u=!0;else throw f}else if(r.finalized===!1&&n)c=await n(r);if(c&&(r.finalized===!1||u))r.res=c;return r}};var Z2=Symbol();var Y2=(e,t)=>new Response(e,{headers:{"Content-Type":t.replace(/^[^;]+/,(r)=>r.toLowerCase())}}).formData();var J2=32,sB=1e4,Hu=(e)=>("headers"in e),t1=async(e,t=Object.create(null))=>{let{all:n=!1,dot:r=!1}=t,s=(Hu(e)?e.headers:e.raw.headers).get("Content-Type")?.split(";")[0].trim().toLowerCase();if(s==="multipart/form-data"||s==="application/x-www-form-urlencoded")return aB(e,{all:n,dot:r});return{}};async function aB(e,t){if(!Hu(e)&&e.bodyCache.formData)return Q2(await e.bodyCache.formData,t);let n=Hu(e)?e.headers:e.raw.headers,r=await e.arrayBuffer(),i=Y2(r,n.get("Content-Type")||"");if(!Hu(e))e.bodyCache.formData=i;let o=await i;if(o)return Q2(o,t);return{}}function Q2(e,t){let n=Object.create(null),r={count:0};if(e.forEach((i,o)=>{if(!(t.all||o.endsWith("[]")))n[o]=i;else cB(n,o,i)}),t.dot)Object.entries(n).forEach(([i,o])=>{if(i.includes("."))uB(n,i,o,r),delete n[i]});return n}var cB=(e,t,n)=>{if(e[t]!==void 0)if(Array.isArray(e[t]))e[t].push(n);else e[t]=[e[t],n];else if(!t.endsWith("[]"))e[t]=n;else e[t]=[n]},uB=(e,t,n,r)=>{if(/(?:^|\.)__proto__\./.test(t))return;let i=e,o=t.split(".",J2+2);if(o.length>J2+1)e1();o.forEach((s,a)=>{if(a===o.length-1)i[s]=n;else{if(!i[s]||typeof i[s]!=="object"||Array.isArray(i[s])||i[s]instanceof File){if(r.count++>=sB)e1();i[s]=Object.create(null)}i=i[s]}})},e1=()=>{throw Error("Nesting limit exceeded")};mi();var u1=class{raw;#e;#t;routeIndex=0;path;bodyCache={};constructor(e,t="/",n=[[]]){this.raw=e,this.path=t,this.#t=n}param(e){return e?this.#n(e):this.#o()}#n(e){let t=this.#t[0][this.routeIndex]?.[1][e],n=this.#i(t);return n&&Vu(n)}#o(){let e={},t=Object.keys(this.#t[0][this.routeIndex]?.[1]??{});for(let n of t){let r=this.#i(this.#t[0][this.routeIndex][1][n]);if(r!==void 0)e[n]=Vu(r)}return e}#i(e){return this.#t[1]?this.#t[1][e]:e}query(e){return a1(this.url,e)}queries(e){return c1(this.url,e)}header(e){if(e)return this.raw.headers.get(e)??void 0;let t=Object.create(null);return this.raw.headers.forEach((n,r)=>{t[r]=n}),t}async parseBody(e){return t1(this,e)}#r=(e)=>{let{bodyCache:t,raw:n}=this,r=t[e];if(r)return r;for(let i in t)return t[i].then((o)=>{if(i==="json")o=JSON.stringify(o);return new Response(o)[e]()});return t[e]=n[e]()};json(){return this.#r("text").then((e)=>JSON.parse(e))}text(){return this.#r("text")}arrayBuffer(){return this.#r("arrayBuffer")}bytes(){return this.#r("arrayBuffer").then((e)=>new Uint8Array(e))}blob(){return this.#r("blob")}formData(){return this.#r("formData")}addValidatedData(e,t){(this.#e??={})[e]=t}valid(e){return this.#e?.[e]}get url(){return this.raw.url}get method(){return this.raw.method}get[Z2](){return this.#t}get matchedRoutes(){return this.#t[0].map(([[,e]])=>e)}get routePath(){return this.#t[0].map(([[,e]])=>e)[this.routeIndex].path}};Ih();var pB="text/plain; charset=UTF-8",Mh=(e,t)=>({"Content-Type":e,...t}),aa=(e,t)=>new Response(e,t),Nh=class{#e;#t;env={};#n;finalized=!1;error;#o;#i;#r;#c;#s;#a;#l;#d;#f;constructor(e,t){if(this.#e=e,t)this.#i=t.executionCtx,this.env=t.env,this.#a=t.notFoundHandler,this.#f=t.path,this.#d=t.matchResult}get req(){return this.#t??=new u1(this.#e,this.#f,this.#d),this.#t}get event(){if(this.#i&&"respondWith"in this.#i)return this.#i;else throw Error("This context has no FetchEvent")}get executionCtx(){if(this.#i)return this.#i;else throw Error("This context has no ExecutionContext")}get res(){return this.#r||=aa(null,{headers:this.#l??=new Headers})}set res(e){if(this.#r&&e){e=aa(e.body,e);for(let[t,n]of this.#r.headers.entries()){if(t==="content-type")continue;if(t==="set-cookie"){let r=this.#r.headers.getSetCookie();e.headers.delete("set-cookie");for(let i of r)e.headers.append("set-cookie",i)}else e.headers.set(t,n)}}this.#r=e,this.finalized=!0}render=(...e)=>(this.#s??=(t)=>this.html(t),this.#s(...e));setLayout=(e)=>this.#c=e;getLayout=()=>this.#c;setRenderer=(e)=>{this.#s=e};header=(e,t,n)=>{if(this.finalized)this.#r=aa(this.#r.body,this.#r);let r=this.#r?this.#r.headers:this.#l??=new Headers;if(t===void 0)r.delete(e);else if(n?.append)r.append(e,t);else r.set(e,t)};status=(e)=>{this.#o=e};set=(e,t)=>{this.#n??=new Map,this.#n.set(e,t)};get=(e)=>this.#n?this.#n.get(e):void 0;get var(){if(!this.#n)return{};return Object.fromEntries(this.#n)}#u(e,t,n){let r=this.#r?new Headers(this.#r.headers):this.#l;if(typeof t==="object"&&t.headers){r??=new Headers;for(let[o,s]of new Headers(t.headers))if(o==="set-cookie")r.append(o,s);else r.set(o,s)}if(n){if(!r){let o=0;for(let s in n)if(++o>1||typeof n[s]!=="string"){r=new Headers;break}}if(r)for(let o in n){let s=n[o];if(typeof s==="string")r.set(o,s);else{r.delete(o);for(let a of s)r.append(o,a)}}}let i=typeof t==="number"?t:t?.status??this.#o;return aa(e,{status:i,headers:r??n})}newResponse=(...e)=>this.#u(...e);body=(e,t,n)=>this.#u(e,t,n);text=(e,t,n)=>!this.#l&&!this.#o&&!t&&!n&&!this.finalized?new Response(e):this.#u(e,t,Mh(pB,n));json=(e,t,n)=>this.#u(JSON.stringify(e),t,Mh("application/json",n));html=(e,t,n)=>{let r=(i)=>this.#u(i,t,Mh("text/html; charset=UTF-8",n));return typeof e==="object"?Oh(e,l1.Stringify,!1,{}).then(r):r(e)};redirect=(e,t)=>{let n=String(e);return this.header("Location",!/[^\x00-\xFF]/.test(n)?n:encodeURI(n)),this.newResponse(null,t??302)};notFound=()=>(this.#a??=()=>aa(),this.#a(this))};Sr();Bh();mi();var hB=(e)=>e.text("404 Not Found",404),h1=(e,t)=>{if("getResponse"in e){let n=e.getResponse();return t.newResponse(n.body,n)}return console.error(e),t.text("Internal Server Error",500)},g1=class e{get;post;put;delete;options;patch;query;all;on;use;router;getPath;_basePath="/";#e="/";routes=[];constructor(t={}){[...p1,f1].forEach((o)=>{this[o]=(s,...a)=>{if(typeof s==="string")this.#e=s;else this.#o(o,this.#e,s);return a.forEach((c)=>{this.#o(o,this.#e,c)}),this}}),this.on=(o,s,...a)=>{for(let c of[s].flat()){this.#e=c;for(let u of[o].flat())a.map((d)=>{this.#o(u.toUpperCase(),this.#e,d)})}return this},this.use=(o,...s)=>{if(typeof o==="string")this.#e=o;else this.#e="*",s.unshift(o);return s.forEach((a)=>{this.#o(Xe,this.#e,a)}),this};let{strict:r,...i}=t;Object.assign(this,i),this.getPath=r??!0?t.getPath??Ph:o1}#t(){let t=new e({router:this.router,getPath:this.getPath});return t.errorHandler=this.errorHandler,t.#n=this.#n,t.routes=this.routes,t}#n=hB;errorHandler=h1;route(t,n){let r=this.basePath(t);return n.routes.map((i)=>{let o;if(n.errorHandler===h1)o=i.handler;else o=async(s,a)=>(await kh([],n.errorHandler)(s,()=>i.handler(s,a))).res,o[ca]=i.handler;r.#o(i.method,i.path,o,i.basePath)}),this}basePath(t){let n=this.#t();return n._basePath=Er(this._basePath,t),n}onError=(t)=>(this.errorHandler=t,this);notFound=(t)=>(this.#n=t,this);mount(t,n,r){let i,o;if(r)if(typeof r==="function")o=r;else if(o=r.optionHandler,r.replaceRequest===!1)i=(c)=>c;else i=r.replaceRequest;let s=o?(c)=>{let u=o(c);return Array.isArray(u)?u:[u]}:(c)=>{let u=void 0;try{u=c.executionCtx}catch{}return[c.env,u]};i||=(()=>{let c=Er(this._basePath,t),u=c==="/"?0:c.length;return(d)=>{let f=new URL(d.url);return f.pathname=this.getPath(d).slice(u)||"/",new Request(f,d)}})();let a=async(c,u)=>{let d=await n(i(c.req.raw),...s(c));if(d)return d;await u()};return this.#o(Xe,Er(t,"*"),a),this}#o(t,n,r,i){t=t.toUpperCase(),n=Er(this._basePath,n);let o={basePath:i!==void 0?Er(this._basePath,i):this._basePath,path:n,method:t,handler:r};this.router.add(t,n,[r,o]),this.routes.push(o)}#i(t,n){if(t instanceof Error)return this.errorHandler(t,n);throw t}#r(t,n,r,i){if(i==="HEAD")return(async()=>new Response(null,await this.#r(t,n,r,"GET")))();let o=this.getPath(t,{env:r}),s=this.router.match(i,o),a=new Nh(t,{path:o,matchResult:s,env:r,executionCtx:n,notFoundHandler:this.#n});if(s[0].length===1){let u;try{u=s[0][0][0][0](a,async()=>{a.res=await this.#n(a)})}catch(d){return this.#i(d,a)}return u instanceof Promise?u.then((d)=>d||(a.finalized?a.res:this.#n(a))).catch((d)=>this.#i(d,a)):u??this.#n(a)}let c=kh(s[0],this.errorHandler,this.#n);return(async()=>{try{let u=await c(a);if(!u.finalized)throw Error("Context is not finalized. Did you forget to return a Response object or `await next()`?");return u.res}catch(u){return this.#i(u,a)}})()}fetch=(t,...n)=>this.#r(t,n[1],n[0],t.method);request=(t,n,r,i)=>{if(t instanceof Request)return this.fetch(n?new Request(t,n):t,r,i);return t=t.toString(),this.fetch(new Request(/^https?:\/\//.test(t)?t:`http://localhost${Er("/",t)}`,n),r,i)};fire=()=>{addEventListener("fetch",(t)=>{t.respondWith(this.#r(t.request,t,void 0,t.request.method))})}};Sr();mi();var et=()=>Object.create(null);Sr();var Zu=[];function Lh(e,t){let n=this.buildAllMatchers(),r=(i,o)=>{let s=n[i]||n[Xe],a=s[2][o];if(a)return a;let c=o.match(s[0]);if(!c)return[[],Zu];let u=c.indexOf("",1);return[s[1][u],c]};return this.match=r,r(e,t)}var go="[^/]+",Cr=".*",Yn="(?:|/.*)",Tr=Symbol(),m1=new Set(".\\+*[^]$()");function gB(e,t){if(e.length===1)return t.length===1?e<t?-1:1:-1;if(t.length===1)return 1;if(e===Cr||e===Yn)return t===Yn?-1:1;else if(t===Cr||t===Yn)return-1;if(e===go)return 1;else if(t===go)return-1;return e.length===t.length?e<t?-1:1:t.length-e.length}var y1=class e{#e;#t;#n=et();insert(t,n,r,i,o){let s=this;for(let a=0,c=t.length;a<c;a++){let u=t[a],d=u.length===1?u==="*"?a===c-1?["","",Cr]:["","",go]:null:u==="/*"?["","",Yn]:u.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/),f;if(d){let p=d[1],h=d[2]||go;if(p&&d[2]){if(h===".*")throw Tr;if(h=h.replace(/^\((?!\?:)(?=[^)]+\)$)/,"(?:"),/\((?!\?:)/.test(h))throw Tr;if(h.length===1&&m1.has(h))throw Tr}if(f=s.#n[h],!f){if(h!==Cr&&h!==Yn){for(let g in s.#n)if((h.length>1||g.length>1)&&g!==Cr&&g!==Yn)throw Tr}f=s.#n[h]=new e}if(p!=="")f.#t??=i.varIndex++,r.push([p,f.#t])}else if(f=s.#n[u],!f){for(let p in s.#n)if(p.length>1&&p!==Cr&&p!==Yn)throw Tr;f=s.#n[u]=new e}s=f}if(s.#e!==void 0)throw Tr;s.#e=o?-1:n}buildRegExpStr(){let n=Object.keys(this.#n).sort(gB).map((r)=>{let i=this.#n[r],o=i.buildRegExpStr();return o===""?"":(typeof i.#t==="number"?`(${r})@${i.#t}`:m1.has(r)?`\\${r}`:r)+o}).filter(Boolean);if(typeof this.#e==="number"&&this.#e!==-1)n.unshift(`#${this.#e}`);if(n.length===0)return"";if(n.length===1)return n[0];return"(?:"+n.join("|")+")"}};var Wh=class{#e={varIndex:0};#t=new y1;#n=0;paths=et();insert(e,t){if(t){this.#t.insert(e.split(""),0,[],this.#e,!0);return}let n=[],r=[],i=e;for(let s=0;;){let a=!1;if(i=i.replace(/\{[^}]+\}/g,(c)=>{let u=`@\\${s}`;return r[s]=[u,c],s++,a=!0,u}),!a)break}let o=i.match(/(?::[^\/]+)|(?:\/\*$)|./g)||[];for(let s=r.length-1;s>=0;s--){let[a]=r[s];for(let c=o.length-1;c>=0;c--)if(o[c].indexOf(a)!==-1){o[c]=o[c].replace(a,r[s][1]);break}}this.#t.insert(o,this.#n,n,this.#e,!1),this.paths[e]=[this.#n++,n]}buildRegExp(){let e=this.#t.buildRegExpStr();if(e==="")return[/^$/,[],[]];let t=0,n=[],r=[];return e=e.replace(/#(\d+)|@(\d+)|\.\*\$/g,(i,o,s)=>{if(o!==void 0)return n[++t]=Number(o),"$()";if(s!==void 0)return r[Number(s)]=++t,"";return""}),[new RegExp(`^${e}`),n,r]}};var b1=et();function x1(e){return b1[e]??=new RegExp(`^${e.replace(/\/:[^/{}]+(?:\{\[\^\/]\+})?(?=[/{]|$)|\/?\*$|([.\\+*[^\]$()?{}|])/g,(t,n)=>n?`\\${n}`:t==="/*"?Yn:t==="*"?Cr:`/:${go}`)}$`)}function Yu(e,t){for(let n of Object.keys(e).sort((r,i)=>i.length-r.length))if(x1(n).test(t))return[...e[n]];return}var Ju=class{name="RegExpRouter";#e;#t;#n;constructor(){this.#e={[Xe]:et()},this.#t={[Xe]:et()},this.#n={[Xe]:new Wh}}#o(e,t){try{this.#n[e].insert(t,!/\*|\/:/.test(t))}catch(n){throw n===Tr?new Ku(t):n}}add(e,t,n){let r=this.#e,i=this.#t;if(!r)throw Error(Xu);if(!r[e]){this.#n[e]=new Wh;for(let a of[r,i]){a[e]=et();for(let c in a[Xe])a[e][c]=[...a[Xe][c]],this.#o(e,c)}}if(t==="/*")t="*";let o=e===Xe?Object.keys(r):[e];if(/\*$/.test(t)){let a=x1(t);for(let c of o)if(!r[c][t])this.#o(c,t),r[c][t]=Yu(r[c],t)||Yu(r[Xe],t)||[];for(let c of[r,i])for(let u of o)for(let d in c[u])a.test(d)&&c[u][d].push([n,t]);return}let s=zu(t)||[t];for(let a of s)for(let c of o){if(!i[c][a])this.#o(c,a),i[c][a]=Yu(r[c],a)||Yu(r[Xe],a)||[];i[c][a].push([n,a])}}match=Lh;buildAllMatchers(){let e=et();for(let t of Object.keys(this.#t))e[t]=this.#i(t);return this.#e=this.#t=this.#n=void 0,b1=et(),e}#i(e){let t=this.#e[e],n=this.#t[e],r=this.#n[e],i=et(),o=[],[s,a,c]=r.buildRegExp();for(let u of[t,n])for(let d in u){let f=u[d],p=r.paths[d];if(!p){i[d]=[f.map(([h])=>[h,et()]),Zu];continue}o[p[0]]=f.map(([h,g])=>[h,r.paths[g][1].reduceRight((b,[x],y)=>(b[x]=c[p[1][y][1]],b),et())])}return[s,a.map((u)=>o[u]),i]}};Sr();Sr();var jh=class{name="SmartRouter";#e=[];#t=[];constructor(e){this.#e=e.routers}add(e,t,n){if(!this.#t)throw Error(Xu);this.#t.push([e,t,n])}match(e,t){if(!this.#t)throw Error("Fatal error");let n=this.#e,r=this.#t,i=n.length,o=0,s;for(;o<i;o++){let a=n[o];try{for(let c=0,u=r.length;c<u;c++)a.add(...r[c]);s=a.match(e,t)}catch(c){if(c instanceof Ku)continue;throw c}this.match=a.match.bind(a),this.#e=[a],this.#t=void 0;break}if(o===i)throw Error("Fatal error");return this.name=`SmartRouter + ${this.activeRouter.name}`,s}get activeRouter(){if(this.#t||this.#e.length!==1)throw Error("No active router has been determined yet.");return this.#e[0]}};mi();Sr();mi();var qh=et(),mB=0,v1=class e{#e=[];#t=et();#n=[];#o;#i=qh;insert(t,n,r){let i=this,o=n1(n),s=new Set,a=0;for(let c of o){let u=o[++a],d=r1(c,u)||(u===void 0&&c&&c.indexOf("*")===c.length-1?c:null),f=Array.isArray(d),p=f?d[0]:d||c,h=i.#t[p]||=new e;if(d&&!h.#o)h.#o=d,i.#n.push(h);if(i=h,f)s.add(d[1])}i.#e.push({[t]:{handler:r,possibleKeys:[...s],score:++mB}})}#r(t,n,r,i,o){for(let s=0,a=n.#e.length;s<a;s++){let c=n.#e[s],u=c[r]||c[Xe];if(u){u.params=et(),t.push(u);for(let d=0,f=u.possibleKeys.length;d<f;d++){let p=u.possibleKeys[d];u.params[p]=o?.[p]&&!d?o[p]:i[p]??o?.[p]}}}}search(t,n){let r=[];this.#i=qh;let o=[this],s=Rh(n),a=[],c=s.length,u=null;for(let d=0;d<c;d++){let f=s[d],p=d===c-1,h=[];for(let b=0,x=o.length;b<x;b++){let y=o[b],v=y.#t[f];if(v)if(v.#i=y.#i,p){if(v.#t["*"])this.#r(r,v.#t["*"],t,y.#i);this.#r(r,v,t,y.#i)}else h.push(v);for(let m of y.#n){let w=m.#o,D=y.#i===qh?{}:{...y.#i};if(typeof w==="string"){if(w==="*"||f.startsWith(w.slice(0,-1))){if(this.#r(r,m,t,y.#i),w==="*")m.#i=D,h.push(m)}continue}let[,T,_]=w;if(!f&&_===!0)continue;if(_!==!0){if(!u){u=[];let M=n[0]==="/"?1:0;for(let P=0;P<c;P++)u[P]=M,M+=s[P].length+1}let A=n.slice(u[d]),S=_.exec(A);if(S){if(D[T]=S[0],this.#r(r,m,t,y.#i,D),S[0].length===A.length&&m.#t["*"])this.#r(r,m.#t["*"],t,y.#i,D);for(let M in m.#t){m.#i=D;let P=S[0].match(/\//g)?.length??0;(a[P]||=[]).push(m);break}continue}}if(_===!0||_.test(f))if(D[T]=f,p){if(this.#r(r,m,t,D,y.#i),m.#t["*"])this.#r(r,m.#t["*"],t,D,y.#i)}else m.#i=D,h.push(m)}}let g=a.shift();o=g?h.concat(g):h}if(r[1])r.sort((d,f)=>d.score-f.score);return[r.map(({handler:d,params:f})=>[d,f])]}};var $h=class{name="TrieRouter";#e=new v1;add(e,t,n){for(let r of zu(t)||[t])this.#e.insert(e,r,n)}match(e,t){return this.#e.search(e,t)}};var Hh=class extends g1{constructor(e={}){super(e);this.router=e.router??new jh({routers:[new Ju,new $h]})}};function Gh(){let e={};return e.promise=new Promise((t,n)=>{e.resolve=t,e.reject=n}),e}import{execFile as yB}from"node:child_process";import mo from"node:path";import{promisify as bB}from"node:util";var ua=bB(yB),Qu=1e4,w1=120000,la=8388608;async function vt(e,t,n=la,r=Qu){let{stdout:i}=await ua("git",["-C",e,...t],{timeout:r,maxBuffer:n,env:{...process.env,LC_ALL:"C"}});return i}async function Ut(e){try{return(await vt(e,["rev-parse","--show-toplevel"])).trim()||null}catch{return null}}function yi(e,t){let n=mo.relative(mo.resolve(e),mo.resolve(t));return n===""||!n.startsWith(`..${mo.sep}`)&&n!==".."&&!mo.isAbsolute(n)}function Ar(e){return e.split(mo.sep).join("/")}function el(e){return e.includes(0)}import{lstat as AB,readFile as kB}from"node:fs/promises";import C1 from"node:path";var bi=262144,_1=10485760,D1=10485760,xB={png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",svg:"image/svg+xml",bmp:"image/bmp",ico:"image/x-icon",avif:"image/avif"},vB={mp3:"audio/mpeg",wav:"audio/wav",ogg:"audio/ogg",oga:"audio/ogg",opus:"audio/ogg",m4a:"audio/mp4",aac:"audio/aac",flac:"audio/flac",weba:"audio/webm",webm:"audio/webm"},wB={pdf:"application/pdf",docx:"application/vnd.openxmlformats-officedocument.wordprocessingml.document"};function _B(e){return e.replace(/\\/g,"/").split("/").pop()??""}function yo(e){return _B(e).toLowerCase().split(".").pop()??""}function tl(e){return xB[yo(e)]??null}function nl(e){return vB[yo(e)]??null}function rl(e){return wB[yo(e)]??null}function E1(e){let t=yo(e);if(t==="pdf"||t==="docx")return t;return null}function DB(e,t){return e==="R"||e==="C"||t==="R"||t==="C"}function S1(e){let t=e.split("\x00"),n=[];for(let r=0;r<t.length;r++){let i=t[r];if(!i||i.length<4||i[2]!==" ")continue;let o=i[0],s=i[1],a={path:i.slice(3),indexStatus:o,worktreeStatus:s};if(DB(o,s))a.originalPath=t[++r]||void 0;n.push(a)}return n}var EB=new Set(["DD","AU","UD","UA","DU","AA","UU"]);function il(e){let t=`${e.indexStatus}${e.worktreeStatus}`;if(t==="??")return{status:"untracked",code:"U"};if(EB.has(t)||t.includes("U"))return{status:"conflict",code:"C"};if(t.includes("D"))return{status:"deleted",code:"D"};if(t.includes("R")||t.includes("C"))return{status:"renamed",code:"R"};if(t.includes("A"))return{status:"added",code:"A"};return{status:"modified",code:"M"}}import{lstat as SB,readFile as TB}from"node:fs/promises";import zh from"node:path";async function Vh(e){let t=await vt(e,["status","--porcelain=v1","-z","--untracked-files=all"]);return S1(t)}async function T1(e,t,n){let i=Ar(zh.relative(e,t))||".";try{let o=await vt(e,["diff","--no-color","--no-ext-diff","--numstat",...n,"--",i]),s=new Map;for(let a of o.split(/\r?\n/)){if(!a)continue;let[c,u,...d]=a.split("\t");if(d.length===0)continue;let f=Number(c),p=Number(u);if(!Number.isInteger(f)||!Number.isInteger(p))continue;let h=d.join("\t"),g=h.indexOf(" => ");if(g!==-1)h=h.slice(g+4);s.set(Ar(h.trim()),{additions:f,deletions:p})}return s}catch{return new Map}}async function CB(e){try{let t=await SB(e);if(!t.isFile()||t.size>bi)return 0;let n=await TB(e);if(el(n)||n.length===0)return 0;let r=n.toString("utf8");return r.endsWith(`
260
+ `)}),this}_outputHelpIfRequested(e){let t=this._getHelpOption();if(t&&e.find((r)=>t.is(r)))this.outputHelp(),this._exit(0,"commander.helpDisplayed","(outputHelp)")}}function b2(e){return e.map((t)=>{if(!t.startsWith("--inspect"))return t;let n,r="127.0.0.1",i="9229",o;if((o=t.match(/^(--inspect(-brk)?)$/))!==null)n=o[1];else if((o=t.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))!==null)if(n=o[1],/^\d+$/.test(o[3]))i=o[3];else r=o[3];else if((o=t.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null)n=o[1],r=o[3],i=o[4];if(n&&i!=="0")return`${n}=${r}:${parseInt(i)+1}`;return t})}function x2(){if(me.env.NO_COLOR||me.env.FORCE_COLOR==="0"||me.env.FORCE_COLOR==="false")return!1;if(me.env.FORCE_COLOR||me.env.CLICOLOR_FORCE!==void 0)return!0;return}var $ge=new lo;var ra={name:"@rainmanhhh/pi-web",version:"0.27.2",description:"Web UI for the pi coding agent (fork of @agegr/pi-web)",homepage:"https://gitee.com/dsxbygzzl/pi-web#readme",repository:{type:"git",url:"git+https://gitee.com/dsxbygzzl/pi-web.git"},bugs:{url:"https://gitee.com/dsxbygzzl/pi-web/issues"},author:"rainmanhhh",license:"MIT",publishConfig:{access:"public",registry:"https://registry.npmjs.org"},engines:{node:">=24.0.0"},files:["dist","public","extensions","package.json"],bin:{"pi-web":"dist/server.mjs"},scripts:{dev:"vite","dev:lan":"vite --host 0.0.0.0",mb:"bun run --env-file=.env.manual api",mf:"bun run --env-file=.env.manual dev -- --port 3001",api:"bun run server/main.ts","api:node":"bun run build:server && node dist/server.mjs","build:server":'bun build server/main.ts --target node --outfile dist/server.mjs --minify --external "@earendil-works/*" --define "process.env.PI_WEB_PACKAGED=1"',"e2e:stop":"bun run scripts/e2e-stop.mjs","e2e:prepare":"bun run scripts/e2e-prepare.mjs",build:"vite build && bun run scripts/prune-fonts.mjs","build:analyze":"vite build --config scripts/analyze-bundle.config.ts && bun run scripts/prune-fonts.mjs",lint:"oxlint --fix",fta:"bun scripts/fta-gate.mjs . --output-limit 15",jscpd:"jscpd --config .jscpd.json",check:"tsc --noEmit",format:"biome check --write .",prepublishOnly:"bun run check && bun run build && bun run build:server","test:e2e":"cross-env CODEBUDDY_SAFE_DELETE_ENABLED=0 bun run e2e:stop && playwright test","test:unit":"vitest run","test:unit:bun":"bun --bun run test:unit",prepare:"husky || true"},dependencies:{"@codemirror/commands":"^6.11.0","@codemirror/lang-css":"^6.3.1","@codemirror/lang-html":"^6.4.12","@codemirror/lang-javascript":"^6.2.5","@codemirror/lang-json":"^6.0.2","@codemirror/lang-markdown":"^6.5.2","@codemirror/lang-yaml":"^6.1.3","@codemirror/language":"^6.12.4","@codemirror/state":"^6.7.1","@codemirror/theme-one-dark":"^6.1.3","@codemirror/view":"^6.43.9","@earendil-works/pi-agent-core":"1.0.2","@earendil-works/pi-ai":"1.0.2","@earendil-works/pi-coding-agent":"1.0.2","@earendil-works/pi-tui":"1.0.2","@hono/node-server":"^2.1.1","class-variance-authority":"^0.7.1",clsx:"^2.1.1",codemirror:"^6.0.2",hono:"^4.13.5","lucide-react":"^1.37.0","p-defer":"^4.0.1",pointrix:"^1.1.0","proper-lockfile":"4.1.2","radix-ui":"^1.6.7",react:"^19.2.8","react-dom":"^19.2.8",shadcn:"^4.19.0",streamdown:"2.6.0","tailwind-merge":"^3.6.0","tw-animate-css":"^1.4.0",virtua:"^0.50.6",ws:"^8.21.3"},devDependencies:{"@biomejs/biome":"^2.5.13","@lobehub/icons":"^5.16.0","@playwright/test":"^1.62.1","@tailwindcss/postcss":"^4.3.3","@testing-library/dom":"^10.4.1","@testing-library/react":"^16.3.3","@types/node":"^25.9.5","@types/proper-lockfile":"4.1.4","@types/react":"^19.2.18","@types/react-dom":"^19.2.5","@types/react-resizable":"^4.0.0","@types/react-syntax-highlighter":"^15.5.13","@types/ws":"^8.18.1","@vitejs/plugin-react":"^6.1.1",commander:"^15.0.0","cross-env":"^10.1.0","fta-cli":"^3.0.1",husky:"^9.1.7",jiti:"^2.7.0",jscpd:"^5.1.0",jsdom:"^30.0.1",katex:"^0.18.4","lint-staged":"^17.4.1",mammoth:"^1.12.2",mermaid:"^11.17.2",oxlint:"^1.80.0",postcss:"^8.5.26","react-markdown":"^10.1.0","react-syntax-highlighter":"^16.1.1","rehype-katex":"^7.0.1","rehype-raw":"^7.0.0","rehype-sanitize":"^6.0.0","remark-gfm":"^4.0.1","remark-math":"^6.0.0",tailwindcss:"^4.3.3",typescript:"^7.0.2",vite:"^8.2.2","vite-plugin-remove-console":"^2.2.0","vite-plugin-svgr":"^5.2.0",vitest:"^4.1.11"},type:"module",overrides:{katex:"^0.18.4"}};var fh=!1,v2=performance.now();function w2(e){if(fh=e,v2=performance.now(),fh)Qe("boot","debug log enabled")}function ze(e){return(t,n)=>Qe(e,t,n)}function Qe(e,t,n){if(!fh)return;let r=performance.now()-v2,i=new Date,o=(a,c=2)=>String(a).padStart(c,"0"),s=`${o(i.getHours())}:${o(i.getMinutes())}:${o(i.getSeconds())}.${o(i.getMilliseconds(),3)}`;console.debug(`[debug][${e}][${s}][+${r.toFixed(1)}ms] ${t}${n?` — ${n}`:""}`)}import{existsSync as IN,mkdirSync as MN,readFileSync as N2,writeFileSync as NN}from"node:fs";import{dirname as BN,join as B2}from"node:path";import{getAgentDir as L2}from"@earendil-works/pi-coding-agent";var E2=[{label:{en:"Explore project","zh-CN":"阅读项目"},message:{en:"Explore the current project and summarize the overall directory structure and responsibilities of core modules.","zh-CN":"阅读当前项目,总结整体目录结构与核心模块的职责。"}},{label:{en:"Review workspace changes","zh-CN":"审查工作区改动"},message:{en:"Review all changes in the current workspace, point out potential issues and improvements.","zh-CN":"审查当前工作区的所有改动,指出潜在问题与改进点。"}},{label:{en:"Find and fix bugs","zh-CN":"寻找并修复bug"},message:{en:"Inspect the current codebase, find and fix existing bugs.","zh-CN":"检查当前代码,寻找并修复其中存在的 bug。"}}];var S2=E2;import{readFileSync as Nu,writeFileSync as A2}from"node:fs";import{join as k2}from"node:path";import{getAgentDir as ON}from"@earendil-works/pi-coding-agent";var Pu=["off","minimal","low","medium","high","xhigh","max"];function Ou(e){return e==="en"||e==="zh-CN"?e:void 0}function gh(e){return e==="dark"||e==="light"?e:void 0}function mh(e){return typeof e==="string"&&Pu.includes(e)?e:void 0}function yh(e){if(typeof e!=="object"||e===null)return;let t=e;if(typeof t.enabled!=="boolean")return;if(typeof t.reserveTokens!=="number"||!Number.isInteger(t.reserveTokens)||t.reserveTokens<=0)return;if(typeof t.keepRecentTokens!=="number"||!Number.isInteger(t.keepRecentTokens)||t.keepRecentTokens<=0)return;return{enabled:t.enabled,reserveTokens:t.reserveTokens,keepRecentTokens:t.keepRecentTokens}}function PN(e){if(typeof e!=="object"||e===null)return;let t=e,n={};if(typeof t.timeoutMs==="number"&&Number.isInteger(t.timeoutMs)&&t.timeoutMs>0)n.timeoutMs=t.timeoutMs;if(typeof t.maxRetries==="number"&&Number.isInteger(t.maxRetries)&&t.maxRetries>0)n.maxRetries=t.maxRetries;if(typeof t.maxRetryDelayMs==="number"&&Number.isInteger(t.maxRetryDelayMs)&&t.maxRetryDelayMs>0)n.maxRetryDelayMs=t.maxRetryDelayMs;return Object.keys(n).length>0?n:void 0}function bh(e){if(typeof e!=="object"||e===null)return;let t=e;if(typeof t.maxRetries!=="number"||!Number.isInteger(t.maxRetries)||t.maxRetries<=0)return;if(typeof t.baseDelayMs!=="number"||!Number.isInteger(t.baseDelayMs)||t.baseDelayMs<=0)return;let n={maxRetries:t.maxRetries,baseDelayMs:t.baseDelayMs};if(typeof t.enabled==="boolean")n.enabled=t.enabled;let r=PN(t.provider);if(r!==void 0)n.provider=r;return n}function Iu(e){if(e==="ask"||e==="always"||e==="never")return e;if(e==="trust")return"always";if(e==="deny")return"never";return}function Mu(e){return typeof e==="number"&&Number.isFinite(e)&&e>=0.85&&e<=1.3?e:void 0}var ia=(e)=>typeof e==="boolean"?e:void 0,hh=(e)=>typeof e==="number"&&Number.isInteger(e)&&e>0?e:void 0,T2=(e)=>typeof e==="string"&&e.trim()!==""?e:void 0;function C2(e,t){if(typeof e!=="object"||e===null)return;let n=e,r={};for(let[i,o]of Object.entries(t)){let s=o(n[i]);if(s!==void 0)r[i]=s}return Object.keys(r).length>0?r:void 0}var Xn=(e)=>Array.isArray(e)&&e.every((t)=>typeof t==="string"&&t.length>0)?e:void 0,xh=[{key:"defaultTools",validate:Xn},{key:"httpProxy",validate:T2},{key:"httpIdleTimeoutMs",validate:hh},{key:"websocketConnectTimeoutMs",validate:hh},{key:"enableAnalytics",validate:ia},{key:"enableInstallTelemetry",validate:ia},{key:"trackingId",validate:T2},{key:"branchSummary",validate:(e)=>C2(e,{reserveTokens:hh,skipPrompt:ia})},{key:"images",validate:(e)=>C2(e,{autoResize:ia,blockImages:ia})}];function vh(e){return yh(Kn("compaction",e))}function U2(e,t){let n=yh(e);if(!n)return vh(t);return fo("compaction",n,t),n}function wh(e){return bh(Kn("retry",e))}function R2(e,t){let n=bh(e);if(!n)return wh(t);return fo("retry",n,t),n}function Kn(e,t){try{return JSON.parse(Nu(O2(t),"utf8"))[e]}catch{return}}function fo(e,t,n){try{let r=O2(n),i={};try{i=JSON.parse(Nu(r,"utf8"))}catch{i={}}if(t===void 0)delete i[e];else i[e]=t;A2(r,JSON.stringify(i,null,2),"utf8")}catch{}}function F2(e){return k2(e,".pi","settings.json")}function Bu(e,t){try{return JSON.parse(Nu(F2(e),"utf8"))[t]}catch{return}}function P2(e,t,n){try{let r=F2(e),i={};try{i=JSON.parse(Nu(r,"utf8"))}catch{i={}}if(n===void 0)delete i[t];else i[t]=n;A2(r,JSON.stringify(i,null,2),"utf8")}catch{}}function po(e,t){let n=Kn(e,t);return typeof n==="string"?n:void 0}function Lu(e,t,n){if(t===void 0)return po(e,n);return fo(e,t,n),t}function O2(e){return k2(e??ON(),"settings.json")}function oa(e){return gh(po("theme",e))??"light"}function I2(e,t){let n=gh(e);if(!n)return oa(t);return Lu("theme",n,t),n}function Wu(e){let t={};for(let{key:n,validate:r}of xh){let i=r(Kn(n,e));if(i!==void 0)t[n]=i}return Object.keys(t).length>0?t:void 0}function M2(e,t){for(let{key:n,validate:r}of xh){if(!(n in e))continue;let i=r(e[n]);if(i===void 0)continue;fo(n,i,t)}return Wu(t)}var ju=new Map;function _h(e){return B2(e??L2(),"pi-web","config.json")}function LN(e){return B2(e??L2(),"pi-web-preferences.json")}function Dh(e){try{if(IN(_h(e)))return;let t=JSON.parse(N2(LN(e),"utf8"));Eh({firstPaint:{locale:Ou(t.firstPaint?.locale),fontScale:Mu(t.firstPaint?.fontScale)},preferences:t.preferences??{}},e)}catch{}}function WN(e){let t=mh(po("defaultThinkingLevel",e)),n=vh(e),r=wh(e),i=Iu(po("defaultProjectTrust",e)),o=Wu(e);return{theme:oa(e),...t!==void 0?{defaultThinkingLevel:t}:{},...n!==void 0?{compaction:n}:{},...r!==void 0?{retry:r}:{},...i!==void 0?{defaultProjectTrust:i}:{},...o!==void 0?{piSettings:o}:{}}}function Zn(e){let t=e===void 0,n=e??"",r=t?ju.get(n):void 0;if(!t||r===void 0||r===null)try{let i=N2(_h(e),"utf8"),o=JSON.parse(i);r={firstPaint:{locale:Ou(o.firstPaint?.locale),fontScale:Mu(o.firstPaint?.fontScale)},preferences:o.preferences??{},theme:oa(e)},ju.set(n,r)}catch{if(r={firstPaint:{},preferences:{},theme:oa(e)},t)ju.set(n,r)}return{...r,...WN(e)}}function Eh(e,t){try{let n=_h(t);MN(BN(n),{recursive:!0});let r={firstPaint:e.firstPaint,preferences:e.preferences};if(NN(n,JSON.stringify(r,null,2),"utf8"),t===void 0)ju.set("",e)}catch{}}function jN(e,t){return{...e,...t.locale!==void 0?{locale:Ou(t.locale)??e.locale}:{},...t.fontScale!==void 0?{fontScale:Mu(t.fontScale)??e.fontScale}:{}}}function qN(e,t){if(e===void 0)return Iu(po("defaultProjectTrust",t));let n=Iu(e);if(n===void 0)return;return Lu("defaultProjectTrust",n,t),n}function Sh(e,t){let n=Zn(t),r=jN(n.firstPaint,e),i=n.theme;if(e.theme!==void 0)i=I2(e.theme,t);let o=Lu("defaultThinkingLevel",mh(e.defaultThinkingLevel),t),s=U2(e.compaction,t),a=R2(e.retry,t),c=qN(e.defaultProjectTrust,t),u=e.piSettings===void 0?Wu(t):M2(e.piSettings,t),d={firstPaint:r,preferences:n.preferences,theme:i,defaultThinkingLevel:o,...s!==void 0?{compaction:s}:{},...a!==void 0?{retry:a}:{},...c!==void 0?{defaultProjectTrust:c}:{},...u!==void 0?{piSettings:u}:{}};return Eh(d,t),d}function qu(e,t){let n=Zn(t),r={firstPaint:n.firstPaint,preferences:{...n.preferences,...e},theme:n.theme};return Eh(r,t),r}function Th(e){let{preferences:t}=Zn(e);if(t.startScreenMessages!==void 0)return;qu({startScreenMessages:S2},e)}import{DefaultResourceLoader as nB,getAgentDir as z2}from"@earendil-works/pi-coding-agent";import{hasTrustRequiringProjectResources as $N,ProjectTrustStore as Ch}from"@earendil-works/pi-coding-agent";function Oe(e,t){if(!(Boolean(e)&&$N(e)))return{requiresTrust:!1,trusted:!0};return{requiresTrust:!0,trusted:new Ch(t).get(e)===!0}}function W2(e,t){let n=Oe(e,t);if(!n.requiresTrust)return n;return new Ch(t).set(e,!0),{requiresTrust:!0,trusted:!0}}function ho(e,t){if(!Oe(e,t).requiresTrust)return;let r=new Ch(t);return{resolveProjectTrust:async()=>r.get(e)===!0}}import{existsSync as HN,readFileSync as GN}from"node:fs";import{homedir as zN}from"node:os";import{isAbsolute as VN,join as sa,relative as XN,resolve as j2,sep as KN}from"node:path";function ZN({homeDir:e=zN(),xdgStateHome:t=process.env.XDG_STATE_HOME}={}){return t?sa(t,"skills",".skill-lock.json"):sa(e,".agents",".skill-lock.json")}function q2(e){try{let t=JSON.parse(GN(e,"utf8"));return t.skills&&typeof t.skills==="object"?t.skills:{}}catch{return{}}}function $2(e,t){let n=XN(j2(t),j2(e));return n!==""&&n!==".."&&!n.startsWith(`..${KN}`)&&!VN(n)}function YN(e,t){if(e[t])return e[t];let n=t.toLowerCase(),r=Object.keys(e).find((i)=>i.toLowerCase()===n);return r?e[r]:void 0}function JN(e,t){if(t!=="github")return e.replace(/\/$/,"");return e.replace(/^git\+/,"").replace(/^https?:\/\/github\.com\//,"").replace(/^git@github\.com:/,"").replace(/\.git$/,"").replace(/\/$/,"")}function QN(e,t){if(!e||e.includes("://")||e.startsWith("git@"))return;let n=e.split("/").filter(Boolean).map(encodeURIComponent).join("/");if(!n)return;return`https://skills.sh/${n}/${encodeURIComponent(t)}`}function eB(e,t){let n=typeof e.sourceType==="string"?e.sourceType:void 0,r=JN(e.source.trim(),n),i=typeof e.skillPath==="string"?e.skillPath:void 0,o=typeof e.ref==="string"?e.ref:void 0,s=t==="global"?e.skillFolderHash:e.computedHash;return{sourceType:n,source:r,skillPath:i,ref:o,versionHash:typeof s==="string"&&s?s:void 0}}function tB(e,t){let{sourceType:n,source:r,skillPath:i,versionHash:o,ref:s}=e,a=n==="github"&&/^[\w.-]+\/[\w.-]+$/.test(r);return Boolean(a&&i&&o&&(t==="global"||!s))}function H2(e,t,n){let r=YN(e,t);if(!r||typeof r.source!=="string"||!r.source.trim())return;let{sourceType:i,source:o,skillPath:s,ref:a,versionHash:c}=eB(r,n);if(!o)return;return{package:`${o}@${t}`,scope:n,source:o,sourceType:i,skillsShUrl:i==="local"?void 0:QN(o,t),...s&&{skillPath:s},...a&&{ref:a},...c&&{versionHash:c},canCheckForUpdates:tB({sourceType:i,source:o,skillPath:s,versionHash:c,ref:a},n)}}function G2(e,{cwd:t,agentDir:n,globalLockPath:r=ZN(),projectLockPath:i=sa(t,"skills-lock.json")}){let o=q2(r),s=q2(i),a=sa(n,"skills"),c=sa(t,".pi","skills");return e.map((u)=>{if(!HN(u.filePath))return u;let d=$2(u.filePath,a)?H2(o,u.name,"global"):$2(u.filePath,c)?H2(s,u.name,"project"):void 0;return d?{...u,install:d}:u})}var rB=32,gi=new Map,Ah=new Map;async function cn(e,t){let n=t?.forceFresh??!1,r=e===""?z2():e;if(!n){let s=gi.get(e);if(s)return{skills:[...s.skills.values()],diagnostics:s.diagnostics,projectResourcesLoaded:s.projectResourcesLoaded}}let i=Ah.get(e);if(i)return i;let o=iB(r,e);Ah.set(e,o);try{return await o}finally{Ah.delete(e)}}async function iB(e,t){let n=z2(),r=new nB({cwd:e,agentDir:n});await r.reload(ho(e,n));let{skills:i,diagnostics:o}=r.getSkills(),s={skills:G2(i,{cwd:e,agentDir:n}),diagnostics:o,projectResourcesLoaded:Oe(e,n).trusted},a=new Map;for(let c of s.skills)a.set(c.filePath,c);return gi.set(t,{skills:a,diagnostics:s.diagnostics,projectResourcesLoaded:s.projectResourcesLoaded,loadedAt:Date.now()}),oB(),s}function oB(){while(gi.size>rB){let e=null,t=1/0;for(let[n,r]of gi){if(n==="")continue;if(r.loadedAt<t)t=r.loadedAt,e=n}if(e===null)break;gi.delete(e)}}function V2(e,t,n){let r=gi.get(e);if(!r)return;let i=r.skills.get(t);if(!i){gi.delete(e);return}if(n.disableModelInvocation!==void 0)i.disableModelInvocation=n.disableModelInvocation}var $u=null;function X2(e){if($u)return;let t=(async()=>{for(let n of e)await Promise.allSettled([n()])})();$u=t,t.then(()=>{$u=null})}function _n(){return $u??Promise.resolve()}var K2={port:31415};import{getAgentDir as Qfe}from"@earendil-works/pi-coding-agent";var kh=(e,t,n)=>(r,i)=>{let o=-1;return s(0);async function s(a){if(a<=o)throw Error("next() called multiple times");o=a;let c,u=!1,d;if(e[a])d=e[a][0][0],r.req.routeIndex=a;else d=a===e.length&&i||void 0;if(d)try{c=await d(r,()=>s(a+1))}catch(f){if(f instanceof Error&&t)r.error=f,c=await t(f,r),u=!0;else throw f}else if(r.finalized===!1&&n)c=await n(r);if(c&&(r.finalized===!1||u))r.res=c;return r}};var Z2=Symbol();var Y2=(e,t)=>new Response(e,{headers:{"Content-Type":t.replace(/^[^;]+/,(r)=>r.toLowerCase())}}).formData();var J2=32,sB=1e4,Hu=(e)=>("headers"in e),t1=async(e,t=Object.create(null))=>{let{all:n=!1,dot:r=!1}=t,s=(Hu(e)?e.headers:e.raw.headers).get("Content-Type")?.split(";")[0].trim().toLowerCase();if(s==="multipart/form-data"||s==="application/x-www-form-urlencoded")return aB(e,{all:n,dot:r});return{}};async function aB(e,t){if(!Hu(e)&&e.bodyCache.formData)return Q2(await e.bodyCache.formData,t);let n=Hu(e)?e.headers:e.raw.headers,r=await e.arrayBuffer(),i=Y2(r,n.get("Content-Type")||"");if(!Hu(e))e.bodyCache.formData=i;let o=await i;if(o)return Q2(o,t);return{}}function Q2(e,t){let n=Object.create(null),r={count:0};if(e.forEach((i,o)=>{if(!(t.all||o.endsWith("[]")))n[o]=i;else cB(n,o,i)}),t.dot)Object.entries(n).forEach(([i,o])=>{if(i.includes("."))uB(n,i,o,r),delete n[i]});return n}var cB=(e,t,n)=>{if(e[t]!==void 0)if(Array.isArray(e[t]))e[t].push(n);else e[t]=[e[t],n];else if(!t.endsWith("[]"))e[t]=n;else e[t]=[n]},uB=(e,t,n,r)=>{if(/(?:^|\.)__proto__\./.test(t))return;let i=e,o=t.split(".",J2+2);if(o.length>J2+1)e1();o.forEach((s,a)=>{if(a===o.length-1)i[s]=n;else{if(!i[s]||typeof i[s]!=="object"||Array.isArray(i[s])||i[s]instanceof File){if(r.count++>=sB)e1();i[s]=Object.create(null)}i=i[s]}})},e1=()=>{throw Error("Nesting limit exceeded")};mi();var u1=class{raw;#e;#t;routeIndex=0;path;bodyCache={};constructor(e,t="/",n=[[]]){this.raw=e,this.path=t,this.#t=n}param(e){return e?this.#n(e):this.#o()}#n(e){let t=this.#t[0][this.routeIndex]?.[1][e],n=this.#i(t);return n&&Vu(n)}#o(){let e={},t=Object.keys(this.#t[0][this.routeIndex]?.[1]??{});for(let n of t){let r=this.#i(this.#t[0][this.routeIndex][1][n]);if(r!==void 0)e[n]=Vu(r)}return e}#i(e){return this.#t[1]?this.#t[1][e]:e}query(e){return a1(this.url,e)}queries(e){return c1(this.url,e)}header(e){if(e)return this.raw.headers.get(e)??void 0;let t=Object.create(null);return this.raw.headers.forEach((n,r)=>{t[r]=n}),t}async parseBody(e){return t1(this,e)}#r=(e)=>{let{bodyCache:t,raw:n}=this,r=t[e];if(r)return r;for(let i in t)return t[i].then((o)=>{if(i==="json")o=JSON.stringify(o);return new Response(o)[e]()});return t[e]=n[e]()};json(){return this.#r("text").then((e)=>JSON.parse(e))}text(){return this.#r("text")}arrayBuffer(){return this.#r("arrayBuffer")}bytes(){return this.#r("arrayBuffer").then((e)=>new Uint8Array(e))}blob(){return this.#r("blob")}formData(){return this.#r("formData")}addValidatedData(e,t){(this.#e??={})[e]=t}valid(e){return this.#e?.[e]}get url(){return this.raw.url}get method(){return this.raw.method}get[Z2](){return this.#t}get matchedRoutes(){return this.#t[0].map(([[,e]])=>e)}get routePath(){return this.#t[0].map(([[,e]])=>e)[this.routeIndex].path}};Ih();var pB="text/plain; charset=UTF-8",Mh=(e,t)=>({"Content-Type":e,...t}),aa=(e,t)=>new Response(e,t),Nh=class{#e;#t;env={};#n;finalized=!1;error;#o;#i;#r;#c;#s;#a;#l;#d;#f;constructor(e,t){if(this.#e=e,t)this.#i=t.executionCtx,this.env=t.env,this.#a=t.notFoundHandler,this.#f=t.path,this.#d=t.matchResult}get req(){return this.#t??=new u1(this.#e,this.#f,this.#d),this.#t}get event(){if(this.#i&&"respondWith"in this.#i)return this.#i;else throw Error("This context has no FetchEvent")}get executionCtx(){if(this.#i)return this.#i;else throw Error("This context has no ExecutionContext")}get res(){return this.#r||=aa(null,{headers:this.#l??=new Headers})}set res(e){if(this.#r&&e){e=aa(e.body,e);for(let[t,n]of this.#r.headers.entries()){if(t==="content-type")continue;if(t==="set-cookie"){let r=this.#r.headers.getSetCookie();e.headers.delete("set-cookie");for(let i of r)e.headers.append("set-cookie",i)}else e.headers.set(t,n)}}this.#r=e,this.finalized=!0}render=(...e)=>(this.#s??=(t)=>this.html(t),this.#s(...e));setLayout=(e)=>this.#c=e;getLayout=()=>this.#c;setRenderer=(e)=>{this.#s=e};header=(e,t,n)=>{if(this.finalized)this.#r=aa(this.#r.body,this.#r);let r=this.#r?this.#r.headers:this.#l??=new Headers;if(t===void 0)r.delete(e);else if(n?.append)r.append(e,t);else r.set(e,t)};status=(e)=>{this.#o=e};set=(e,t)=>{this.#n??=new Map,this.#n.set(e,t)};get=(e)=>this.#n?this.#n.get(e):void 0;get var(){if(!this.#n)return{};return Object.fromEntries(this.#n)}#u(e,t,n){let r=this.#r?new Headers(this.#r.headers):this.#l;if(typeof t==="object"&&t.headers){r??=new Headers;for(let[o,s]of new Headers(t.headers))if(o==="set-cookie")r.append(o,s);else r.set(o,s)}if(n){if(!r){let o=0;for(let s in n)if(++o>1||typeof n[s]!=="string"){r=new Headers;break}}if(r)for(let o in n){let s=n[o];if(typeof s==="string")r.set(o,s);else{r.delete(o);for(let a of s)r.append(o,a)}}}let i=typeof t==="number"?t:t?.status??this.#o;return aa(e,{status:i,headers:r??n})}newResponse=(...e)=>this.#u(...e);body=(e,t,n)=>this.#u(e,t,n);text=(e,t,n)=>!this.#l&&!this.#o&&!t&&!n&&!this.finalized?new Response(e):this.#u(e,t,Mh(pB,n));json=(e,t,n)=>this.#u(JSON.stringify(e),t,Mh("application/json",n));html=(e,t,n)=>{let r=(i)=>this.#u(i,t,Mh("text/html; charset=UTF-8",n));return typeof e==="object"?Oh(e,l1.Stringify,!1,{}).then(r):r(e)};redirect=(e,t)=>{let n=String(e);return this.header("Location",!/[^\x00-\xFF]/.test(n)?n:encodeURI(n)),this.newResponse(null,t??302)};notFound=()=>(this.#a??=()=>aa(),this.#a(this))};Sr();Bh();mi();var hB=(e)=>e.text("404 Not Found",404),h1=(e,t)=>{if("getResponse"in e){let n=e.getResponse();return t.newResponse(n.body,n)}return console.error(e),t.text("Internal Server Error",500)},g1=class e{get;post;put;delete;options;patch;query;all;on;use;router;getPath;_basePath="/";#e="/";routes=[];constructor(t={}){[...p1,f1].forEach((o)=>{this[o]=(s,...a)=>{if(typeof s==="string")this.#e=s;else this.#o(o,this.#e,s);return a.forEach((c)=>{this.#o(o,this.#e,c)}),this}}),this.on=(o,s,...a)=>{for(let c of[s].flat()){this.#e=c;for(let u of[o].flat())a.map((d)=>{this.#o(u.toUpperCase(),this.#e,d)})}return this},this.use=(o,...s)=>{if(typeof o==="string")this.#e=o;else this.#e="*",s.unshift(o);return s.forEach((a)=>{this.#o(Xe,this.#e,a)}),this};let{strict:r,...i}=t;Object.assign(this,i),this.getPath=r??!0?t.getPath??Ph:o1}#t(){let t=new e({router:this.router,getPath:this.getPath});return t.errorHandler=this.errorHandler,t.#n=this.#n,t.routes=this.routes,t}#n=hB;errorHandler=h1;route(t,n){let r=this.basePath(t);return n.routes.map((i)=>{let o;if(n.errorHandler===h1)o=i.handler;else o=async(s,a)=>(await kh([],n.errorHandler)(s,()=>i.handler(s,a))).res,o[ca]=i.handler;r.#o(i.method,i.path,o,i.basePath)}),this}basePath(t){let n=this.#t();return n._basePath=Er(this._basePath,t),n}onError=(t)=>(this.errorHandler=t,this);notFound=(t)=>(this.#n=t,this);mount(t,n,r){let i,o;if(r)if(typeof r==="function")o=r;else if(o=r.optionHandler,r.replaceRequest===!1)i=(c)=>c;else i=r.replaceRequest;let s=o?(c)=>{let u=o(c);return Array.isArray(u)?u:[u]}:(c)=>{let u=void 0;try{u=c.executionCtx}catch{}return[c.env,u]};i||=(()=>{let c=Er(this._basePath,t),u=c==="/"?0:c.length;return(d)=>{let f=new URL(d.url);return f.pathname=this.getPath(d).slice(u)||"/",new Request(f,d)}})();let a=async(c,u)=>{let d=await n(i(c.req.raw),...s(c));if(d)return d;await u()};return this.#o(Xe,Er(t,"*"),a),this}#o(t,n,r,i){t=t.toUpperCase(),n=Er(this._basePath,n);let o={basePath:i!==void 0?Er(this._basePath,i):this._basePath,path:n,method:t,handler:r};this.router.add(t,n,[r,o]),this.routes.push(o)}#i(t,n){if(t instanceof Error)return this.errorHandler(t,n);throw t}#r(t,n,r,i){if(i==="HEAD")return(async()=>new Response(null,await this.#r(t,n,r,"GET")))();let o=this.getPath(t,{env:r}),s=this.router.match(i,o),a=new Nh(t,{path:o,matchResult:s,env:r,executionCtx:n,notFoundHandler:this.#n});if(s[0].length===1){let u;try{u=s[0][0][0][0](a,async()=>{a.res=await this.#n(a)})}catch(d){return this.#i(d,a)}return u instanceof Promise?u.then((d)=>d||(a.finalized?a.res:this.#n(a))).catch((d)=>this.#i(d,a)):u??this.#n(a)}let c=kh(s[0],this.errorHandler,this.#n);return(async()=>{try{let u=await c(a);if(!u.finalized)throw Error("Context is not finalized. Did you forget to return a Response object or `await next()`?");return u.res}catch(u){return this.#i(u,a)}})()}fetch=(t,...n)=>this.#r(t,n[1],n[0],t.method);request=(t,n,r,i)=>{if(t instanceof Request)return this.fetch(n?new Request(t,n):t,r,i);return t=t.toString(),this.fetch(new Request(/^https?:\/\//.test(t)?t:`http://localhost${Er("/",t)}`,n),r,i)};fire=()=>{addEventListener("fetch",(t)=>{t.respondWith(this.#r(t.request,t,void 0,t.request.method))})}};Sr();mi();var et=()=>Object.create(null);Sr();var Zu=[];function Lh(e,t){let n=this.buildAllMatchers(),r=(i,o)=>{let s=n[i]||n[Xe],a=s[2][o];if(a)return a;let c=o.match(s[0]);if(!c)return[[],Zu];let u=c.indexOf("",1);return[s[1][u],c]};return this.match=r,r(e,t)}var go="[^/]+",Cr=".*",Yn="(?:|/.*)",Tr=Symbol(),m1=new Set(".\\+*[^]$()");function gB(e,t){if(e.length===1)return t.length===1?e<t?-1:1:-1;if(t.length===1)return 1;if(e===Cr||e===Yn)return t===Yn?-1:1;else if(t===Cr||t===Yn)return-1;if(e===go)return 1;else if(t===go)return-1;return e.length===t.length?e<t?-1:1:t.length-e.length}var y1=class e{#e;#t;#n=et();insert(t,n,r,i,o){let s=this;for(let a=0,c=t.length;a<c;a++){let u=t[a],d=u.length===1?u==="*"?a===c-1?["","",Cr]:["","",go]:null:u==="/*"?["","",Yn]:u.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/),f;if(d){let p=d[1],h=d[2]||go;if(p&&d[2]){if(h===".*")throw Tr;if(h=h.replace(/^\((?!\?:)(?=[^)]+\)$)/,"(?:"),/\((?!\?:)/.test(h))throw Tr;if(h.length===1&&m1.has(h))throw Tr}if(f=s.#n[h],!f){if(h!==Cr&&h!==Yn){for(let g in s.#n)if((h.length>1||g.length>1)&&g!==Cr&&g!==Yn)throw Tr}f=s.#n[h]=new e}if(p!=="")f.#t??=i.varIndex++,r.push([p,f.#t])}else if(f=s.#n[u],!f){for(let p in s.#n)if(p.length>1&&p!==Cr&&p!==Yn)throw Tr;f=s.#n[u]=new e}s=f}if(s.#e!==void 0)throw Tr;s.#e=o?-1:n}buildRegExpStr(){let n=Object.keys(this.#n).sort(gB).map((r)=>{let i=this.#n[r],o=i.buildRegExpStr();return o===""?"":(typeof i.#t==="number"?`(${r})@${i.#t}`:m1.has(r)?`\\${r}`:r)+o}).filter(Boolean);if(typeof this.#e==="number"&&this.#e!==-1)n.unshift(`#${this.#e}`);if(n.length===0)return"";if(n.length===1)return n[0];return"(?:"+n.join("|")+")"}};var Wh=class{#e={varIndex:0};#t=new y1;#n=0;paths=et();insert(e,t){if(t){this.#t.insert(e.split(""),0,[],this.#e,!0);return}let n=[],r=[],i=e;for(let s=0;;){let a=!1;if(i=i.replace(/\{[^}]+\}/g,(c)=>{let u=`@\\${s}`;return r[s]=[u,c],s++,a=!0,u}),!a)break}let o=i.match(/(?::[^\/]+)|(?:\/\*$)|./g)||[];for(let s=r.length-1;s>=0;s--){let[a]=r[s];for(let c=o.length-1;c>=0;c--)if(o[c].indexOf(a)!==-1){o[c]=o[c].replace(a,r[s][1]);break}}this.#t.insert(o,this.#n,n,this.#e,!1),this.paths[e]=[this.#n++,n]}buildRegExp(){let e=this.#t.buildRegExpStr();if(e==="")return[/^$/,[],[]];let t=0,n=[],r=[];return e=e.replace(/#(\d+)|@(\d+)|\.\*\$/g,(i,o,s)=>{if(o!==void 0)return n[++t]=Number(o),"$()";if(s!==void 0)return r[Number(s)]=++t,"";return""}),[new RegExp(`^${e}`),n,r]}};var b1=et();function x1(e){return b1[e]??=new RegExp(`^${e.replace(/\/:[^/{}]+(?:\{\[\^\/]\+})?(?=[/{]|$)|\/?\*$|([.\\+*[^\]$()?{}|])/g,(t,n)=>n?`\\${n}`:t==="/*"?Yn:t==="*"?Cr:`/:${go}`)}$`)}function Yu(e,t){for(let n of Object.keys(e).sort((r,i)=>i.length-r.length))if(x1(n).test(t))return[...e[n]];return}var Ju=class{name="RegExpRouter";#e;#t;#n;constructor(){this.#e={[Xe]:et()},this.#t={[Xe]:et()},this.#n={[Xe]:new Wh}}#o(e,t){try{this.#n[e].insert(t,!/\*|\/:/.test(t))}catch(n){throw n===Tr?new Ku(t):n}}add(e,t,n){let r=this.#e,i=this.#t;if(!r)throw Error(Xu);if(!r[e]){this.#n[e]=new Wh;for(let a of[r,i]){a[e]=et();for(let c in a[Xe])a[e][c]=[...a[Xe][c]],this.#o(e,c)}}if(t==="/*")t="*";let o=e===Xe?Object.keys(r):[e];if(/\*$/.test(t)){let a=x1(t);for(let c of o)if(!r[c][t])this.#o(c,t),r[c][t]=Yu(r[c],t)||Yu(r[Xe],t)||[];for(let c of[r,i])for(let u of o)for(let d in c[u])a.test(d)&&c[u][d].push([n,t]);return}let s=zu(t)||[t];for(let a of s)for(let c of o){if(!i[c][a])this.#o(c,a),i[c][a]=Yu(r[c],a)||Yu(r[Xe],a)||[];i[c][a].push([n,a])}}match=Lh;buildAllMatchers(){let e=et();for(let t of Object.keys(this.#t))e[t]=this.#i(t);return this.#e=this.#t=this.#n=void 0,b1=et(),e}#i(e){let t=this.#e[e],n=this.#t[e],r=this.#n[e],i=et(),o=[],[s,a,c]=r.buildRegExp();for(let u of[t,n])for(let d in u){let f=u[d],p=r.paths[d];if(!p){i[d]=[f.map(([h])=>[h,et()]),Zu];continue}o[p[0]]=f.map(([h,g])=>[h,r.paths[g][1].reduceRight((b,[x],y)=>(b[x]=c[p[1][y][1]],b),et())])}return[s,a.map((u)=>o[u]),i]}};Sr();Sr();var jh=class{name="SmartRouter";#e=[];#t=[];constructor(e){this.#e=e.routers}add(e,t,n){if(!this.#t)throw Error(Xu);this.#t.push([e,t,n])}match(e,t){if(!this.#t)throw Error("Fatal error");let n=this.#e,r=this.#t,i=n.length,o=0,s;for(;o<i;o++){let a=n[o];try{for(let c=0,u=r.length;c<u;c++)a.add(...r[c]);s=a.match(e,t)}catch(c){if(c instanceof Ku)continue;throw c}this.match=a.match.bind(a),this.#e=[a],this.#t=void 0;break}if(o===i)throw Error("Fatal error");return this.name=`SmartRouter + ${this.activeRouter.name}`,s}get activeRouter(){if(this.#t||this.#e.length!==1)throw Error("No active router has been determined yet.");return this.#e[0]}};mi();Sr();mi();var qh=et(),mB=0,v1=class e{#e=[];#t=et();#n=[];#o;#i=qh;insert(t,n,r){let i=this,o=n1(n),s=new Set,a=0;for(let c of o){let u=o[++a],d=r1(c,u)||(u===void 0&&c&&c.indexOf("*")===c.length-1?c:null),f=Array.isArray(d),p=f?d[0]:d||c,h=i.#t[p]||=new e;if(d&&!h.#o)h.#o=d,i.#n.push(h);if(i=h,f)s.add(d[1])}i.#e.push({[t]:{handler:r,possibleKeys:[...s],score:++mB}})}#r(t,n,r,i,o){for(let s=0,a=n.#e.length;s<a;s++){let c=n.#e[s],u=c[r]||c[Xe];if(u){u.params=et(),t.push(u);for(let d=0,f=u.possibleKeys.length;d<f;d++){let p=u.possibleKeys[d];u.params[p]=o?.[p]&&!d?o[p]:i[p]??o?.[p]}}}}search(t,n){let r=[];this.#i=qh;let o=[this],s=Rh(n),a=[],c=s.length,u=null;for(let d=0;d<c;d++){let f=s[d],p=d===c-1,h=[];for(let b=0,x=o.length;b<x;b++){let y=o[b],v=y.#t[f];if(v)if(v.#i=y.#i,p){if(v.#t["*"])this.#r(r,v.#t["*"],t,y.#i);this.#r(r,v,t,y.#i)}else h.push(v);for(let m of y.#n){let w=m.#o,D=y.#i===qh?{}:{...y.#i};if(typeof w==="string"){if(w==="*"||f.startsWith(w.slice(0,-1))){if(this.#r(r,m,t,y.#i),w==="*")m.#i=D,h.push(m)}continue}let[,T,_]=w;if(!f&&_===!0)continue;if(_!==!0){if(!u){u=[];let M=n[0]==="/"?1:0;for(let P=0;P<c;P++)u[P]=M,M+=s[P].length+1}let A=n.slice(u[d]),S=_.exec(A);if(S){if(D[T]=S[0],this.#r(r,m,t,y.#i,D),S[0].length===A.length&&m.#t["*"])this.#r(r,m.#t["*"],t,y.#i,D);for(let M in m.#t){m.#i=D;let P=S[0].match(/\//g)?.length??0;(a[P]||=[]).push(m);break}continue}}if(_===!0||_.test(f))if(D[T]=f,p){if(this.#r(r,m,t,D,y.#i),m.#t["*"])this.#r(r,m.#t["*"],t,D,y.#i)}else m.#i=D,h.push(m)}}let g=a.shift();o=g?h.concat(g):h}if(r[1])r.sort((d,f)=>d.score-f.score);return[r.map(({handler:d,params:f})=>[d,f])]}};var $h=class{name="TrieRouter";#e=new v1;add(e,t,n){for(let r of zu(t)||[t])this.#e.insert(e,r,n)}match(e,t){return this.#e.search(e,t)}};var Hh=class extends g1{constructor(e={}){super(e);this.router=e.router??new jh({routers:[new Ju,new $h]})}};function Gh(){let e={};return e.promise=new Promise((t,n)=>{e.resolve=t,e.reject=n}),e}import{execFile as yB}from"node:child_process";import mo from"node:path";import{promisify as bB}from"node:util";var ua=bB(yB),Qu=1e4,w1=120000,la=8388608;async function vt(e,t,n=la,r=Qu){let{stdout:i}=await ua("git",["-C",e,...t],{timeout:r,maxBuffer:n,env:{...process.env,LC_ALL:"C"}});return i}async function Ut(e){try{return(await vt(e,["rev-parse","--show-toplevel"])).trim()||null}catch{return null}}function yi(e,t){let n=mo.relative(mo.resolve(e),mo.resolve(t));return n===""||!n.startsWith(`..${mo.sep}`)&&n!==".."&&!mo.isAbsolute(n)}function Ar(e){return e.split(mo.sep).join("/")}function el(e){return e.includes(0)}import{lstat as AB,readFile as kB}from"node:fs/promises";import C1 from"node:path";var bi=262144,_1=10485760,D1=10485760,xB={png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",svg:"image/svg+xml",bmp:"image/bmp",ico:"image/x-icon",avif:"image/avif"},vB={mp3:"audio/mpeg",wav:"audio/wav",ogg:"audio/ogg",oga:"audio/ogg",opus:"audio/ogg",m4a:"audio/mp4",aac:"audio/aac",flac:"audio/flac",weba:"audio/webm",webm:"audio/webm"},wB={pdf:"application/pdf",docx:"application/vnd.openxmlformats-officedocument.wordprocessingml.document"};function _B(e){return e.replace(/\\/g,"/").split("/").pop()??""}function yo(e){return _B(e).toLowerCase().split(".").pop()??""}function tl(e){return xB[yo(e)]??null}function nl(e){return vB[yo(e)]??null}function rl(e){return wB[yo(e)]??null}function E1(e){let t=yo(e);if(t==="pdf"||t==="docx")return t;return null}function DB(e,t){return e==="R"||e==="C"||t==="R"||t==="C"}function S1(e){let t=e.split("\x00"),n=[];for(let r=0;r<t.length;r++){let i=t[r];if(!i||i.length<4||i[2]!==" ")continue;let o=i[0],s=i[1],a={path:i.slice(3),indexStatus:o,worktreeStatus:s};if(DB(o,s))a.originalPath=t[++r]||void 0;n.push(a)}return n}var EB=new Set(["DD","AU","UD","UA","DU","AA","UU"]);function il(e){let t=`${e.indexStatus}${e.worktreeStatus}`;if(t==="??")return{status:"untracked",code:"U"};if(EB.has(t)||t.includes("U"))return{status:"conflict",code:"C"};if(t.includes("D"))return{status:"deleted",code:"D"};if(t.includes("R")||t.includes("C"))return{status:"renamed",code:"R"};if(t.includes("A"))return{status:"added",code:"A"};return{status:"modified",code:"M"}}import{lstat as SB,readFile as TB}from"node:fs/promises";import zh from"node:path";async function Vh(e){let t=await vt(e,["status","--porcelain=v1","-z","--untracked-files=all"]);return S1(t)}async function T1(e,t,n){let i=Ar(zh.relative(e,t))||".";try{let o=await vt(e,["diff","--no-color","--no-ext-diff","--numstat",...n,"--",i]),s=new Map;for(let a of o.split(/\r?\n/)){if(!a)continue;let[c,u,...d]=a.split("\t");if(d.length===0)continue;let f=Number(c),p=Number(u);if(!Number.isInteger(f)||!Number.isInteger(p))continue;let h=d.join("\t"),g=h.indexOf(" => ");if(g!==-1)h=h.slice(g+4);s.set(Ar(h.trim()),{additions:f,deletions:p})}return s}catch{return new Map}}async function CB(e){try{let t=await SB(e);if(!t.isFile()||t.size>bi)return 0;let n=await TB(e);if(el(n)||n.length===0)return 0;let r=n.toString("utf8");return r.endsWith(`
261
261
  `)?r.split(`
262
262
  `).length-1:r.split(`
263
263
  `).length}catch{return 0}}async function ol(e){try{let n=(await vt(e,["rev-parse","--abbrev-ref","HEAD"])).trim()||null;if(!n||n==="HEAD")return{branch:n,upstream:null,ahead:0,behind:0,hasUpstream:!1};let r=null,i=!1;try{r=(await vt(e,["rev-parse","--abbrev-ref","--symbolic-full-name","@{u}"])).trim()||null,i=!!r}catch{return{branch:n,upstream:null,ahead:0,behind:0,hasUpstream:!1}}if(!i||!r)return{branch:n,upstream:null,ahead:0,behind:0,hasUpstream:!1};try{let s=(await vt(e,["rev-list","--left-right","--count","HEAD...@{u}"])).trim().split(/\s+/).map((u)=>Number(u)),a=Number.isInteger(s[0])?s[0]:0,c=Number.isInteger(s[1])?s[1]:0;return{branch:n,upstream:r,ahead:a,behind:c,hasUpstream:!0}}catch{return{branch:n,upstream:r,ahead:0,behind:0,hasUpstream:!0}}}catch{return{branch:null,upstream:null,ahead:0,behind:0,hasUpstream:!1}}}async function Xh(e){let t=await Ut(e);if(!t)return{isGitRepository:!1,repositoryRoot:null,files:[],additions:0,deletions:0,stagedFiles:[],stagedAdditions:0,stagedDeletions:0,branch:null,upstream:null,ahead:0,behind:0,hasUpstream:!1};let[n,r,i,o]=await Promise.all([Vh(t),T1(t,e,[]),T1(t,e,["--cached"]),ol(t)]),s=[],a=[];for(let g of n){let b=zh.resolve(t,g.path);if(!yi(e,b))continue;let x=il(g),y={filePath:b,...x,indexStatus:g.indexStatus,worktreeStatus:g.worktreeStatus},v=g.indexStatus!==" "&&g.indexStatus!=="?",m=g.worktreeStatus!==" ";if(v)a.push({...y,lineStats:i.get(g.path)});if(m)s.push({...y,lineStats:r.get(g.path)})}let c=await Promise.all(s.map(async(g)=>g.status==="untracked"?{filePath:g.filePath,additions:await CB(g.filePath)}:{filePath:g.filePath,additions:0})),u=new Map(c.map((g)=>[g.filePath,g.additions])),d=[...u.values()].reduce((g,b)=>g+b,0);for(let g of s){if(g.status!=="untracked")continue;let b=u.get(g.filePath)??0;if(b>0)g.lineStats={additions:b,deletions:0}}let f=(g)=>{let b=0,x=0;for(let y of g.values())b+=y.additions,x+=y.deletions;return{additions:b,deletions:x}},p=f(r),h=f(i);return{isGitRepository:!0,repositoryRoot:t,files:s,additions:p.additions+d,deletions:p.deletions,stagedFiles:a,stagedAdditions:h.additions,stagedDeletions:h.deletions,...o}}function A1(e,t){let n=t.endsWith(`
@@ -281,7 +281,7 @@ Expecting one of '${n.join("', '")}'`);let r=`${e}Help`;return this.on(r,(i)=>{l
281
281
 
282
282
  ${e.summary}`,timestamp:cg(e.timestamp)};case"custom_message":return{role:"custom",customType:e.customType,content:e.content,display:e.display,details:e.details,timestamp:cg(e.timestamp)};default:return null}}var _L="@rainmanhhh/pi-web",$1=!1;function H1(){return vL(import.meta.dirname,"..")}function G1(e,t){return(e??[]).some((n)=>{let r=typeof n==="string"?n:n.source;return r===t||r.includes(_L)})}async function ug(e,t){if($1)return;if($1=!0,wi())return;let n=H1();if(!bL(xL(n,"extensions")))return;let r=wL.create(e,t),i=r.getGlobalSettings().packages;if(G1(i,n))return;r.setPackages([...i??[],n]),console.log(`[pi-web] self-registered as pi package: ${n}`)}var z1="Compaction cancelled",V1="compaction-disabled-by-extension";import{randomUUID as J1}from"node:crypto";var lg=92;function X1(e,t=92,n=40){let r=Object.freeze({columns:t,rows:n,kittyProtocolActive:!1});return Object.freeze({terminal:r,requestRender:e})}function K1(e){if(!e||typeof e!=="object")return lg;let t=e.overlayOptions,n=typeof t==="function"?t():t;if(!n||typeof n!=="object")return lg;let r=n.width;return typeof r==="number"&&Number.isFinite(r)?Math.max(40,Math.min(140,Math.round(r))):92}function ga(e,t,n){let r;try{r=n.component.render(n.width)}catch(o){r=[`Extension custom UI render failed: ${o instanceof Error?o.message:String(o)}`]}let i={type:"extension_ui_request",id:t,method:"custom",lines:r};e.pendingUiRequests.set(t,i),e.emit(i)}function xo(e,t,n){let r=e.activeCustomUis.get(t);if(!r||r.settled)return;r.settled=!0,e.activeCustomUis.delete(t),e.pendingUiRequests.delete(t);try{r.component.dispose?.()}catch{}e.emit({type:"extension_ui_request",id:t,method:"custom",lines:[],closed:!0}),r.resolve(n)}function dg(e,t,n){let r=e.activeCustomUis.get(t);if(!r||typeof n!=="string")return;try{if(r.component.handleInput?.(n),e.activeCustomUis.has(t))ga(e,t,r)}catch(i){xo(e,t,void 0),e.emit({type:"extension_error",extensionPath:`custom-ui:${t}`,event:"custom_ui_input",error:i instanceof Error?i.message:String(i)})}}import{Theme as DL}from"@earendil-works/pi-coding-agent";import{TUI_KEYBINDINGS as EL,KeybindingsManager as SL}from"@earendil-works/pi-tui";var TL={accent:"",border:"",borderAccent:"",borderMuted:"",success:"",error:"",warning:"",muted:"",dim:"",text:"",thinkingText:"",userMessageText:"",customMessageText:"",customMessageLabel:"",toolTitle:"",toolOutput:"",mdHeading:"",mdLink:"",mdLinkUrl:"",mdCode:"",mdCodeBlock:"",mdCodeBlockBorder:"",mdQuote:"",mdQuoteBorder:"",mdHr:"",mdListBullet:"",toolDiffAdded:"",toolDiffRemoved:"",toolDiffContext:"",syntaxComment:"",syntaxKeyword:"",syntaxFunction:"",syntaxVariable:"",syntaxString:"",syntaxNumber:"",syntaxType:"",syntaxOperator:"",syntaxPunctuation:"",thinkingOff:"",thinkingMinimal:"",thinkingLow:"",thinkingMedium:"",thinkingHigh:"",thinkingXhigh:"",bashMode:""},CL={selectedBg:"",userMessageBg:"",customMessageBg:"",toolPendingBg:"",toolSuccessBg:"",toolErrorBg:""};class Z1 extends DL{constructor(){super(TL,CL,"truecolor")}fg(...[,e]){return e}bg(...[,e]){return e}bold(e){return e}italic(e){return e}underline(e){return e}inverse(e){return e}strikethrough(e){return e}getFgAnsi(){return""}getBgAnsi(){return""}getThinkingBorderColor(){return(e)=>e}getBashModeBorderColor(){return(e)=>e}}var vl=new Z1,Y1=new SL(EL);function Q1(e,t,n){if(typeof t!=="function")return Promise.resolve(void 0);let r=J1(),i=K1(n);return new Promise((o)=>{let s=!1,a=X1(()=>{let d=e.activeCustomUis.get(r);if(d)ga(e,r,d)},i),c=(d)=>{if(s)return;s=!0,o(d)},u=(d)=>{if(e.activeCustomUis.has(r))xo(e,r,d);else c(d)};Promise.resolve().then(()=>t(a,vl,Y1,u)).then((d)=>{if(s){try{d?.dispose?.()}catch{}return}if(!d||typeof d!=="object"||typeof d.render!=="function"){c(void 0);return}let f={component:d,width:i,resolve:(p)=>c(p),settled:!1};e.activeCustomUis.set(r,f),ga(e,r,f)}).catch((d)=>{if(s)return;e.emit({type:"extension_error",extensionPath:`custom-ui:${r}`,event:"custom_ui",error:d instanceof Error?d.message:String(d)}),c(void 0)})})}var AL=300000;function ma(e,t,n,r,i){let{timeout:o,signal:s}=i??{};if(s?.aborted)return Promise.resolve(n);let a=o??AL,c=J1(),u={type:"extension_ui_request",id:c,...t,...a?{timeout:a,expiresAt:Date.now()+a}:{}};return new Promise((d)=>{let f,p=()=>{if(f)clearTimeout(f);s?.removeEventListener("abort",g),e.pendingUiRequests.delete(c),e.pendingUiResponses.delete(c)},h=(b)=>{p(),d(b)},g=()=>h(n);if(a)f=setTimeout(()=>h(n),a);s?.addEventListener("abort",g,{once:!0}),Qe("ui-chain",`2b ctx.ui.${String(t.method)}`,`id=${c.slice(0,8)} title=${JSON.stringify(t.title??null)} timeout=${a??"-"}`),e.pendingUiRequests.set(c,u),e.pendingUiResponses.set(c,{resolve:(b)=>h(r(b)),cancel:()=>h(n)}),e.emit(u)})}import{randomUUID as vo}from"node:crypto";function ya(e){return{select:(t,n,r)=>ma(e,{method:"select",title:t,options:n,...r?.timeout?{timeout:r.timeout}:{}},void 0,(i)=>("value"in i)?i.value:void 0,{timeout:r?.timeout,signal:r?.signal}),confirm:(t,n,r)=>ma(e,{method:"confirm",title:t,message:n,...r?.timeout?{timeout:r.timeout}:{}},!1,(i)=>("confirmed"in i)?i.confirmed:!1,{timeout:r?.timeout,signal:r?.signal}),input:(t,n,r)=>ma(e,{method:"input",title:t,...n!==void 0?{placeholder:n}:{},...r?.timeout?{timeout:r.timeout}:{}},void 0,(i)=>("value"in i)?i.value:void 0,{timeout:r?.timeout,signal:r?.signal}),editor:(t,n,r)=>ma(e,{method:"editor",title:t,...n!==void 0?{prefill:n}:{},...r?.timeout?{timeout:r.timeout}:{}},void 0,(i)=>("value"in i)?i.value:void 0,{timeout:r?.timeout,signal:r?.signal}),notify:(t,n)=>{e.emit({type:"extension_ui_request",id:vo(),method:"notify",message:t,notifyType:n})},onTerminalInput:()=>()=>{},setStatus:(t,n)=>{if(n===void 0)e.extensionStatuses.delete(t);else e.extensionStatuses.set(t,n);e.emit({type:"extension_ui_request",id:vo(),method:"setStatus",statusKey:t,statusText:n})},setWorkingMessage:()=>{},setWorkingVisible:()=>{},setWorkingIndicator:()=>{},setHiddenThinkingLabel:()=>{},setWidget:(t,n,r)=>{if(n!==void 0&&!Array.isArray(n))return;if(n===void 0)e.extensionWidgets.delete(t);else e.extensionWidgets.set(t,{key:t,lines:n,placement:r?.placement??"aboveEditor"});e.emit({type:"extension_ui_request",id:vo(),method:"setWidget",widgetKey:t,widgetLines:n,widgetPlacement:r?.placement})},setFooter:()=>{},setHeader:()=>{},setTitle:(t)=>{e.emit({type:"extension_ui_request",id:vo(),method:"setTitle",title:t})},custom:(t,n)=>Q1(e,t,n),pasteToEditor:(t)=>{e.emit({type:"extension_ui_request",id:vo(),method:"set_editor_text",text:t})},setEditorText:(t)=>{e.emit({type:"extension_ui_request",id:vo(),method:"set_editor_text",text:t})},getEditorText:()=>"",addAutocompleteProvider:()=>{},setEditorComponent:()=>{},getEditorComponent:()=>{return},get theme(){return vl},getAllThemes:()=>[],getTheme:()=>{return},setTheme:()=>({success:!1,error:"Theme switching is not supported in Pi Web extension UI yet"}),getToolsExpanded:()=>!1,setToolsExpanded:()=>{}}}import{existsSync as kL,writeFileSync as UL}from"node:fs";function e_(e){let t=e.sessionManager,n=t.getSessionFile();if(!n||kL(n))return;let r=t.getHeader();if(!r)return;let i=`${[r,...t.getEntries()].map((o)=>JSON.stringify(o)).join(`
283
283
  `)}
284
- `;UL(n,i,{encoding:"utf8",flag:"wx"}),t.flushed=!0,jt(e.sessionId,n)}import{realpathSync as RL}from"node:fs";import{resolve as FL}from"node:path";function Xt(){if(!globalThis.__piSessions){globalThis.__piSessions=new Map;let e=()=>globalThis.__piSessions?.forEach((t)=>t.destroy());process.once("exit",e),process.once("SIGINT",e),process.once("SIGTERM",e)}return globalThis.__piSessions}function t_(){if(!globalThis.__piStartLocks)globalThis.__piStartLocks=new Map;return globalThis.__piStartLocks}function n_(){if(!globalThis.__piStartLocksAt)globalThis.__piStartLocksAt=new Map;return globalThis.__piStartLocksAt}function _t(e){let t=FL(e);try{return RL(t)}catch{return t}}function r_(){if(!globalThis.__piStartingSessionCwds)globalThis.__piStartingSessionCwds=new Map;return globalThis.__piStartingSessionCwds}function i_(e){let t=r_(),n=_t(e);return t.set(n,(t.get(n)??0)+1),()=>{let r=(t.get(n)??1)-1;if(r>0)t.set(n,r);else t.delete(n)}}function Le(e){return Xt().get(e)}function pg(e){let t=_t(e);for(let[n,r]of Xt()){if(!r.isAlive())continue;if(_t(r.cwd)!==t)continue;if(r.hasMessages())continue;return n}return}function hg(e){let t=_t(e);if(r_().has(t))return!0;return Array.from(Xt().values()).some((n)=>_t(n.cwd)===t&&n.isRunning())}function gg(){let e=new Set,t=[];for(let n of Xt().values()){let r=_t(n.cwd);if(e.has(r))continue;e.add(r),t.push(r)}return t}function mg(e){let t=_t(e),n=Array.from(Xt().values()).filter((r)=>_t(r.cwd)===t);for(let r of n)r.destroy();return n.length}function ba(e,t={}){let n=[],r=[];for(let i of e){let o=Xt().get(i);if(!o)continue;if(t.skipRunning&&o.isRunning()){r.push(o.sessionId||i);continue}o.destroy(),n.push(o.sessionId||i)}return{restarted:n,skipped:r}}function yg(){let e=new Set;for(let[t,n]of Xt())if(n.isRunning())e.add(n.sessionId||t);return[...e]}function wo(){let e=[],t={},n={},r={};for(let[i,o]of Xt())if(o.isRunning()){let s=o.sessionId||i;e.push(s);let a=o.getPhase();if(a){t[s]=a;let u=o.getPhaseStartedAt();if(u!==null)n[s]=u}let c=o.getBusyStartedAt();if(c!==null)r[s]=c}return{runningSessionIds:e,phases:t,phaseSince:n,busySince:r}}function o_(){if(!globalThis.__piRunningListeners)globalThis.__piRunningListeners=new Set;return globalThis.__piRunningListeners}function bg(e){let t=o_();return t.add(e),()=>{t.delete(e)}}var fg="";function Ft(){let e=o_(),t=wo();if(Qe("running-snapshot","change",`ids=[${t.runningSessionIds.join(",")}] phases=${JSON.stringify(t.phases)} since=${JSON.stringify(t.phaseSince)}`),e.size===0){fg="";return}let n=JSON.stringify(t);if(n===fg)return;fg=n;for(let r of e)try{r(t)}catch{}}function s_(){if(!globalThis.__piAgentEventListeners)globalThis.__piAgentEventListeners=new Set;return globalThis.__piAgentEventListeners}function xg(e){let t=s_();return t.add(e),()=>{t.delete(e)}}function vg(e,t){for(let n of s_())try{n(e,t)}catch{}}async function a_(e,t){if(e.isPromptRunning()||e.inner.isStreaming||e.inner.isCompacting||e.inner.isBashRunning)throw Error("Cannot run a shell command while the session is busy");let n=e.inner.executeBash(t.command,void 0,{excludeFromContext:t.excludeFromContext});e.markBusyStart(!0),e.setPhase({kind:"running_command"}),Ft();try{let r=await n;return e_(e.inner),r}finally{e.resetIdleTimer(),qe(),e.emit({type:"prompt_done"}),e.setPhase(null),Ft()}}function c_(e){return e.inner.abortBash(),null}async function u_(e,t){if(e.inner.isBashRunning)throw Error("Cannot send a prompt while a shell command is running");let{images:n,streamingBehavior:r}=t;return Qe("ui-chain","2a sdk prompt",`${JSON.stringify(String(t.message).slice(0,80))} streamingBehavior=${r??"-"}`),e.setPromptRunning(!0),e.markBusyStart(!r),e.setPhase({kind:"waiting_model"}),e.touchPromptActivity(),Ft(),e.inner.prompt(t.message,{...n?.length?{images:n}:{},...r?{streamingBehavior:r}:{},source:"rpc"}).then(()=>{if(Qe("ui-chain","2c prompt done"),e.setPromptRunning(!1),e.resetIdleTimer(),!r)e.emit({type:"prompt_done"});Ft()}).catch((i)=>{if(Qe("ui-chain","2c prompt error",i instanceof Error?i.message:String(i)),e.setPromptRunning(!1),e.resetIdleTimer(),qe(),e.emit({type:"prompt_error",errorMessage:i instanceof Error?i.message:String(i)}),!r)e.emit({type:"prompt_done"});Ft()}),null}function PL(e){if(!e.inner.model)return;let n=e.inner.getContextUsage();if(!n||n.tokens==null||n.contextWindow<=0||n.tokens<=n.contextWindow)return n;let r=e.inner.sessionManager.buildSessionProjection(),i=e.inner.sessionManager.getBranch(),o=null;if(r.messages.forEach((u,d)=>{if(u.role!=="assistant")return;let f=u;if(!f.usage||f.stopReason==="aborted"||f.stopReason==="error")return;let p=f.usage;if((p.totalTokens??(p.input??0)+(p.output??0)+(p.cacheRead??0)+(p.cacheWrite??0))>0)o=d}),o==null)return{...n,tokens:null,percent:null};let s=-1,a=0;for(let u of r.entries){let d=a+u.messages.length;if(o<d){s=i.findIndex((f)=>f.id===u.sourceEntry.id);break}a=d}let c=-1;for(let u=i.length-1;u>=0;u--){let d=i[u].type;if(d==="context_edit"||d==="compaction"){c=u;break}}if(s>c)return n;return{...n,tokens:null,percent:null}}function l_(e){let t=e.inner.model,n=PL(e);return{sessionId:e.inner.sessionId,sessionFile:e.inner.sessionFile??"",isStreaming:e.inner.isStreaming,isPromptRunning:e.isPromptRunning(),isBashRunning:e.inner.isBashRunning,isCompacting:e.inner.isCompacting,autoCompactionEnabled:e.inner.autoCompactionEnabled,autoRetryEnabled:e.inner.autoRetryEnabled,model:t?{id:t.id,provider:t.provider}:void 0,messageCount:0,pendingMessageCount:e.inner.pendingMessageCount,queuedMessages:{steering:[...e.inner.getSteeringMessages()],followUp:[...e.inner.getFollowUpMessages()]},contextUsage:n?{percent:n.percent,contextWindow:n.contextWindow,tokens:n.tokens}:null,systemPrompt:e.inner.agent.state?.systemPrompt??"",thinkingLevel:e.inner.agent.state?.thinkingLevel??"off",extensionStatuses:e.getExtensionStatuses(),extensionWidgets:e.getExtensionWidgets()}}var OL=["read","bash","edit","write","grep","find","ls"];function wl(e,t){if(t.length===0)return[];let n=new Set(OL),r=new Set(e.getActiveToolNames()),i=e.getAllTools().map((o)=>o.name).filter((o)=>!n.has(o)&&(o!=="codemode"||r.has("codemode")));return[...new Set([...t,...i])]}function d_(e){let t=e.inner.getAllTools(),n=new Set(e.inner.getActiveToolNames());return t.map((r)=>({name:r.name,description:r.description,active:n.has(r.name)}))}function f_(e){let t=[];for(let n of e.inner.extensionRunner.getRegisteredCommands())t.push({name:n.invocationName,description:n.description,source:"extension",sourceInfo:n.sourceInfo});for(let n of e.inner.promptTemplates)t.push({name:n.name,description:n.description,source:"prompt",sourceInfo:n.sourceInfo});for(let n of e.inner.resourceLoader.getSkills().skills)t.push({name:`skill:${n.name}`,description:n.description,source:"skill",sourceInfo:n.sourceInfo});return{commands:t}}function p_(e,t){let n=t.toolNames;return e.setForceEmptySystemPrompt(n.length===0),e.inner.setActiveToolsByName(wl(e.inner,n)),e.applyForcedEmptySystemPrompt(),null}import{SessionManager as _g}from"@earendil-works/pi-coding-agent";import{copyFileSync as IL,readdirSync as ML,statSync as NL,unlinkSync as BL}from"node:fs";import{basename as LL,dirname as xa,join as _l}from"node:path";function Dl(e){let t=LL(e);return t.endsWith(".jsonl")?t.slice(0,-6):t}function wg(e,t){if(!t||t.includes("/")||t.includes("\\")||t.includes(".."))return!1;let n=Dl(e);if(t===`${n}.jsonl`)return!1;return t.startsWith(`${n}.`)}function h_(e){let t=Dl(e);try{return ML(xa(e)).filter((n)=>{if(!n.startsWith(`${t}.`)||n===`${t}.jsonl`)return!1;return wg(e,n)}).map((n)=>{let r=NL(_l(xa(e),n));return{name:n,size:r.size,modified:r.mtime.toISOString()}}).sort((n,r)=>n.name.localeCompare(r.name))}catch{return[]}}function g_(e,t,n){let r=Dl(e),i=Dl(t);for(let o of n){if(!wg(e,o))continue;let s=o.slice(r.length);try{IL(_l(xa(e),o),_l(xa(t),`${i}${s}`))}catch{}}}function m_(e,t){for(let n of t){if(!wg(e,n))continue;try{BL(_l(xa(e),n))}catch{}}}async function y_(e,t){if(e.inner.isBashRunning)throw Error("Cannot fork while a shell command is running");let n=t.entryId,r=e.inner.sessionManager,i=e.inner.sessionFile;if(!r.isPersisted())return{cancelled:!0};if(!i)throw Error("Persisted session is missing a session file");let o=r.getEntry(n);if(!o)throw Error("Invalid entry ID for forking");let s=r.getSessionDir(),a;if(!o.parentId){let d=_g.create(r.getCwd(),s);d.newSession({parentSession:i}),a=d.getSessionFile()}else{let f=_g.open(i,s).createBranchedSession(o.parentId);if(!f)throw Error("Failed to create forked session");a=f}let c=_g.open(a,s).getSessionId(),u=t.copyAuxFiles;if(Array.isArray(u)&&u.every((d)=>typeof d==="string"))g_(i,a,u);return jt(c,a),qe(),e.destroy(),{cancelled:!1,newSessionId:c}}async function b_(e,t){if(e.inner.isBashRunning)throw Error("Cannot navigate while a shell command is running");return{cancelled:(await e.inner.navigateTree(t.targetId,{})).cancelled}}class _o extends Error{}function x_(e){return e instanceof _o||e instanceof Error&&/cannot be queued|while a shell command is running/.test(e.message)}async function WL(e,t){let{provider:n,modelId:r}=t,i=e.inner.modelRuntime.getModel(n,r);if(!i)await e.inner.modelRuntime.refresh({allowNetwork:!1}),i=e.inner.modelRuntime.getModel(n,r);if(!i)throw Error(`Model not found: ${n}/${r}`);return await e.inner.setModel(i),Ce(),qe(),{id:i.id,provider:i.provider}}async function jL(e,t){let n=t.level;if(e.inner.setThinkingLevel(n),n==="xhigh"&&e.inner.model?.compat?.thinkingFormat==="deepseek"&&e.inner.agent?.state)e.inner.agent.state.thinkingLevel="xhigh";return qe(),null}async function qL(e,t){try{return await e.withFinalRunningNotification(()=>e.inner.compact(t.customInstructions))}catch(n){if(n instanceof Error&&n.message.includes(z1))throw Error(V1,{cause:n});throw n}finally{qe()}}async function $L(e,t){let n=t.name?.trim();if(!n)throw Error("Session name cannot be empty");return e.inner.setSessionName(n),qe(),null}async function HL(e){return{...e.inner.getSessionStats(),sessionName:e.inner.sessionManager.getSessionName()}}async function GL(e,t){return e.inner.setAutoCompactionEnabled(t.enabled),null}async function zL(e,t){let n=t.images;try{await e.inner.steer(t.message,n?.length?n:void 0)}catch(r){if(x_(r))throw new _o(r instanceof Error?r.message:String(r));throw r}return null}async function VL(e,t){let n=t.images;return await e.inner.followUp(t.message,n?.length?n:void 0),null}async function XL(e){if(await e.waitForExtensionsBound(),e.clearExtensionUiState(),e.syncProjectTrust(),await e.inner.reload(),typeof e.inner.bindExtensions!=="function")e.inner.extensionRunner.setUIContext?.(ya(e.extensionUiHost()),"rpc");return e.applyForcedEmptySystemPrompt(),Ce(),{success:!0}}var KL={prompt:u_,abort:(e)=>e.withFinalRunningNotification(()=>e.inner.abort()),get_state:l_,set_model:WL,fork:y_,navigate_tree:b_,set_thinking_level:jL,compact:qL,set_session_name:$L,get_session_stats:HL,get_last_assistant_text:(e)=>({text:e.inner.getLastAssistantText()??""}),set_auto_compaction:GL,clear_queue:(e)=>e.inner.clearQueue(),steer:zL,follow_up:VL,get_tools:d_,get_commands:f_,set_tools:p_,reload:XL,abort_compaction:(e)=>e.inner.abortCompaction(),extension_ui_response:(e,t)=>(e.resolveExtensionUiResponse(t),null),extension_ui_input:(e,t)=>(dg(e.extensionUiHost(),t.id,t.data),null),set_auto_retry:(e,t)=>(e.inner.setAutoRetryEnabled(t.enabled),null),bash:a_,abort_bash:c_};function v_(e){async function t(n,r){let i=KL[n];if(!i)throw Error(`Unsupported command: ${n}`);return i(e,r)}return{dispatch:t}}import{getAgentDir as r9}from"@earendil-works/pi-coding-agent";function ZL(e){if(typeof e!=="string")return null;if(e.startsWith("image/"))return"image";return null}function YL(e){return e>=65&&e<=90||e>=97&&e<=122||e>=48&&e<=57||e===43||e===47}function JL(e){if(!e||e.length%4!==0)return null;let t=e.endsWith("==")?2:e.endsWith("=")?1:0,n=e.length-t;for(let r=0;r<n;r+=1)if(!YL(e.charCodeAt(r)))return null;for(let r=n;r<e.length;r+=1)if(e[r]!=="=")return null;return e.length/4*3-t}function QL(e){if(!e||typeof e!=="object")return!1;let t=e;if(typeof t.data!=="string"||typeof t.mimeType!=="string"||ZL(t.mimeType)===null)return!1;let n=JL(t.data);return n!==null&&n<=10485760}function w_(e){if(e===void 0)return null;if(!Array.isArray(e))return"images must be an array";if(e.length>10)return"A message can include at most 10 attachments";for(let t of e){if(!t||typeof t!=="object"||t.type!=="image")return"Each attachment must use the image content block type";if(!QL(t))return"Each attachment must be valid base64 image data of 10MB or smaller"}return null}import{randomUUID as Dg}from"node:crypto";class Eg{deps;pendingUiResponses=new Map;pendingUiRequests=new Map;activeCustomUis=new Map;extensionStatuses=new Map;extensionWidgets=new Map;extensionsBound=!1;extensionBindingPromise=null;extensionBindingError=null;constructor(e){this.deps=e}beginBinding(e={}){this.ensureBound(e).catch((t)=>{console.error("[pi-web] failed to dispatch session_start to extensions:",t instanceof Error?t.message:t)})}async waitUntilReady(){await this.waitForBound()}shouldWaitForExtensions(e){return e==="prompt"||e==="steer"||e==="follow_up"||e==="get_commands"}uiDiagnostics(){return[...this.pendingUiRequests.values()]}cancelPendingUiResponses(){for(let e of this.pendingUiResponses.values())e.cancel();this.pendingUiResponses.clear(),this.pendingUiRequests.clear()}destroyUiState(){this.cancelPendingUiResponses();let e=this.uiHost();for(let t of Array.from(this.activeCustomUis.keys()))xo(e,t,void 0);this.pendingUiResponses.clear(),this.pendingUiRequests.clear()}clearUiState(){this.extensionStatuses.clear(),this.extensionWidgets.clear()}getPendingUiRequests(){return Array.from(this.pendingUiRequests.values())}hasPendingUiRequests(){return this.pendingUiRequests.size>0}resolveExtensionUiResponse(e){let t=this.pendingUiResponses.get(e.id);if(!t){Qe("ui-chain",`4b ui response DROPPED (no pending) id=${e.id.slice(0,8)}`,JSON.stringify(e).slice(0,200));return}Qe("ui-chain",`4 ui response id=${e.id.slice(0,8)}`,JSON.stringify(e).slice(0,200)),t.resolve(e)}getExtensionStatuses(){return Array.from(this.extensionStatuses,([e,t])=>({key:e,text:t}))}getExtensionWidgets(){return Array.from(this.extensionWidgets.values())}replayInto(e){for(let t of this.pendingUiRequests.values())e(t);for(let t of this.extensionWidgets.values())e({type:"extension_ui_request",id:Dg(),method:"setWidget",widgetKey:t.key,widgetLines:t.lines,widgetPlacement:t.placement});for(let[t,n]of this.extensionStatuses)e({type:"extension_ui_request",id:Dg(),method:"setStatus",statusKey:t,statusText:n})}uiHost(){return{activeCustomUis:this.activeCustomUis,pendingUiRequests:this.pendingUiRequests,pendingUiResponses:this.pendingUiResponses,extensionStatuses:this.extensionStatuses,extensionWidgets:this.extensionWidgets,emit:(e)=>this.deps.emit(e)}}ensureBound(e={}){if(e.forceEmptySystemPrompt)this.deps.markForceEmptySystemPrompt();if(this.extensionsBound)return this.deps.applyForcedEmptySystemPrompt(),Promise.resolve();if(this.extensionBindingPromise)return this.extensionBindingPromise;return this.extensionBindingError=null,this.extensionBindingPromise=(async()=>{if(!this.deps.isAlive())return;let t=ya(this.uiHost());if(typeof this.deps.inner.bindExtensions==="function")await this.deps.inner.bindExtensions.call(this.deps.inner,{uiContext:t,mode:"rpc",commandContextActions:this.createCommandContextActions(),shutdownHandler:()=>this.deps.emit({type:"extension_ui_request",id:Dg(),method:"notify",notifyType:"warning",message:"Extension requested shutdown, but shutdown is not supported in Pi Web."}),onError:(r)=>this.deps.emit({type:"extension_error",extensionPath:r.extensionPath,event:r.event,error:r.error})});else this.deps.inner.extensionRunner.setUIContext?.(t,"rpc");this.extensionsBound=!0,this.deps.applyForcedEmptySystemPrompt(),console.log(`[pi-web] session_start dispatched to extensions for session ${this.deps.inner.sessionId}`)})().catch((t)=>{throw this.extensionBindingError=t,t}),this.extensionBindingPromise}async waitForBound(){try{if(this.extensionBindingPromise)await this.extensionBindingPromise}catch(e){throw e instanceof Error?e:Error(String(e))}if(this.extensionBindingError)throw this.extensionBindingError instanceof Error?this.extensionBindingError:Error(String(this.extensionBindingError))}createCommandContextActions(){return{waitForIdle:async()=>{await this.deps.inner.agent.waitForIdle?.()},newSession:async()=>({cancelled:!0}),fork:async()=>({cancelled:!0}),navigateTree:async(e,t)=>({cancelled:(await this.deps.inner.navigateTree(e,{summarize:t?.summarize})).cancelled}),switchSession:async()=>({cancelled:!0}),reload:async()=>{this.extensionStatuses.clear(),this.extensionWidgets.clear(),this.deps.syncProjectTrust(),await this.deps.inner.reload({beforeSessionStart:()=>{this.deps.inner.extensionRunner.setUIContext?.(ya(this.uiHost()),"rpc")}}),this.deps.applyForcedEmptySystemPrompt()}}}}import{existsSync as e9}from"node:fs";var __=(()=>{if(process.env.PI_WEB_E2E!=="1")return 600000;let e=Number(process.env.PI_SESSION_IDLE_MS);return Number.isFinite(e)&&e>0?e:600000})();class Sg{idleTimer=null;deps;constructor(e){this.deps=e}reset(){if(this.idleTimer)clearTimeout(this.idleTimer);this.idleTimer=setTimeout(()=>{if(this.deps.isRunning()){if(this.deps.isPromptRunning()&&Date.now()-this.deps.getLastPromptActivityAt()>=__){if(this.deps.isBashRunning()||this.deps.hasPendingUiRequests()){this.reset();return}this.settleStalledRun();return}this.reset();return}let e=this.deps.sessionFile();if(e&&!e9(e)){this.reset();return}this.deps.destroy()},__)}stop(){if(this.idleTimer)clearTimeout(this.idleTimer);this.idleTimer=null}settleStalledRun(){try{this.deps.unlockStall()}catch{}this.deps.setPromptRunning(!1),this.deps.emit({type:"prompt_error",errorMessage:"Agent run stalled (no activity for 10 minutes) — reset to idle. "+"If this keeps happening, restart the pi-web server."}),this.deps.emit({type:"prompt_done"}),this.reset(),this.deps.notifyRunningChange()}}function D_(e){let t=e?.contentIndex;if(typeof t!=="number")return null;let n=e?.partial?.content?.[t];if(n?.type!=="toolCall")return null;let r=n;if(typeof r.id!=="string"||!r.id)return null;return{id:r.id,name:typeof r.name==="string"&&r.name?r.name:r.id}}var t9=120000,n9=new Set(["agent_start","message_update","message_end","tool_execution_start","tool_execution_update","tool_execution_end","bash_execution_update","auto_compaction_start","compaction_start"]);class Tg{phase=null;phaseStartedAt=null;busyStartedAt=null;runningToolNames=new Map;promptRunning=!1;lastPromptActivityAt=0;externalActivityAt=null;getPhase(){return this.phase}getPhaseStartedAt(){return this.phaseStartedAt}getBusyStartedAt(){return this.busyStartedAt}isPromptRunning(){return this.promptRunning}isExternalActivityFresh(){return this.externalActivityAt!==null&&Date.now()-this.externalActivityAt<t9}setPromptRunning(e){this.promptRunning=e}markBusyStart(e){if(this.busyStartedAt===null||e)this.busyStartedAt=Date.now()}touchPromptActivity(){this.lastPromptActivityAt=Date.now()}getLastPromptActivityAt(){return this.lastPromptActivityAt}setPhase(e){if(this.phase=e,!e){this.phaseStartedAt=null;return}let t=this.phaseStartedAt??Date.now();this.phaseStartedAt=this.busyStartedAt!==null?Math.max(t,this.busyStartedAt):t}updatePhaseFromEvent(e){if(!this.promptRunning&&n9.has(e.type))this.externalActivityAt=Date.now();switch(e.type){case"agent_start":this.onAgentStart();break;case"agent_end":this.onAgentEnd();break;case"message_update":this.onMessageUpdate(e);break;case"auto_retry_start":this.onAutoRetryStart(e);break;case"auto_retry_end":this.onAutoRetryEnd();break;case"tool_execution_start":this.onToolStart(e);break;case"tool_execution_end":this.onToolEnd(e);break}}onAgentStart(){this.setPhase({kind:"waiting_model"})}onAgentEnd(){this.runningToolNames.clear(),this.setPhase(null)}toolsOrFallback(e){return this.runningToolNames.size>0?{kind:"running_tools",tools:[...this.runningToolNames.entries()].map(([t,n])=>({id:t,name:n}))}:e}onMessageUpdate(e){let t=e.assistantMessageEvent,n=t?.type??"";if(n.startsWith("thinking")){this.setPhase(this.toolsOrFallback({kind:"thinking"}));return}if(n==="toolcall_start"||n==="toolcall_delta"){let r=D_(t);if(r)this.runningToolNames.set(r.id,r.name);this.syncRunningToolsPhase();return}if(n==="toolcall_end")return;this.setPhase(this.toolsOrFallback(null))}onAutoRetryStart(e){let t=e;this.setPhase({kind:"retrying",attempt:t.attempt??1,maxAttempts:t.maxAttempts??1,errorMessage:t.errorMessage})}onAutoRetryEnd(){this.setPhase(null)}onToolStart(e){let t=e.toolCallId;if(t)this.runningToolNames.set(t,e.toolName??t);this.syncRunningToolsPhase()}onToolEnd(e){let t=e.toolCallId;if(t)this.runningToolNames.delete(t);this.syncRunningToolsPhase()}syncRunningToolsPhase(){this.setPhase(this.runningToolNames.size>0?{kind:"running_tools",tools:[...this.runningToolNames.entries()].map(([e,t])=>({id:e,name:t}))}:{kind:"waiting_model"})}}var i9=1000,o9=new Set(["agent_start","agent_end","agent_settled","message_update","tool_execution_start","tool_execution_end","auto_compaction_start","auto_compaction_end","compaction_start","compaction_end","auto_retry_start","auto_retry_end"]),s9=new Set(["agent_end","agent_settled","auto_compaction_end","compaction_end"]),a9=new Set(["agent_start","message_update","message_end","tool_execution_start","tool_execution_update","tool_execution_end","bash_execution_update","agent_end","agent_settled","auto_compaction_start","auto_compaction_end","compaction_start","compaction_end","prompt_done","prompt_error"]);class El{inner;listeners=[];forceEmptySystemPrompt=!1;savedTransformContext;unsubscribe=null;idle=new Sg({isRunning:()=>this.isRunning(),isPromptRunning:()=>this.phases.isPromptRunning(),getLastPromptActivityAt:()=>this.phases.getLastPromptActivityAt(),isBashRunning:()=>this.inner.isBashRunning,hasPendingUiRequests:()=>this.extensions.hasPendingUiRequests(),sessionFile:()=>this.sessionFile,setPromptRunning:(e)=>this.phases.setPromptRunning(e),emit:(e)=>this.emit(e),destroy:()=>this.destroy(),notifyRunningChange:()=>Ft(),unlockStall:()=>{this.cancelPendingUiResponses(),this.inner.abort().catch(()=>{})}});onDestroyCallback=null;bufferedEvents=[];_alive=!0;commands=null;phases=new Tg;extensions;constructor(e){this.inner=e;this.extensions=new Eg({inner:this.inner,isAlive:()=>this._alive,emit:(t)=>this.emit(t),markForceEmptySystemPrompt:()=>{this.forceEmptySystemPrompt=!0},applyForcedEmptySystemPrompt:()=>this.applyForcedEmptySystemPrompt(),syncProjectTrust:()=>this.syncProjectTrust()})}getCommands(){if(!this.commands)this.commands=v_(this.commandDeps());return this.commands}get sessionId(){return this.inner.sessionId}get sessionFile(){return this.inner.sessionFile??""}get cwd(){return this.inner.sessionManager.getCwd()}hasMessages(){return this.inner.sessionManager.getBranch().some((e)=>e.type==="message")}isAlive(){return this._alive}isRunning(){return this._alive&&(this.phases.isPromptRunning()||this.inner.isStreaming||this.inner.isCompacting||this.inner.isBashRunning||this.phases.isExternalActivityFresh())}start(){this.unsubscribe=this.inner.subscribe((e)=>{if(e.type==="agent_end")qe();if(s9.has(e.type))this.idle.reset();if(a9.has(e.type))this.phases.touchPromptActivity();if(this.phases.updatePhaseFromEvent(e),this.emit(e),o9.has(e.type))Ft()}),this.idle.reset(),Ft()}getPhase(){return this.phases.getPhase()}getPhaseStartedAt(){return this.phases.getPhaseStartedAt()}getBusyStartedAt(){return this.phases.getBusyStartedAt()}setPhase(e){this.phases.setPhase(e)}setForceEmptySystemPrompt(e){this.forceEmptySystemPrompt=e,this.applyForcedEmptySystemPrompt()}beginExtensionBinding(e={}){this.extensions.beginBinding(e)}async waitUntilReady(){await this.extensions.waitUntilReady()}shouldWaitForExtensions(e){return this.extensions.shouldWaitForExtensions(e)}async withFinalRunningNotification(e){try{return await e()}finally{this.idle.reset(),Ft()}}applyForcedEmptySystemPrompt(){let e=this.inner.agent;if(!e)return;if(this.forceEmptySystemPrompt){if(this.savedTransformContext!==void 0)return;let t=e.transformContext;this.savedTransformContext=t,e.transformContext=async(n,r)=>{let i=t?await t(n,r):n;return[{role:"system",content:"",timestamp:Date.now()},...i.filter((s)=>s.role!=="system")]}}else if(this.savedTransformContext!==void 0)e.transformContext=this.savedTransformContext,this.savedTransformContext=void 0}emit(e){if(vg(this.sessionId,e),this.listeners.length===0){if(this.bufferedEvents.push(e),this.bufferedEvents.length>i9)this.bufferedEvents.shift();return}for(let t of this.listeners)t(e)}onEvent(e){let t=this.bufferedEvents;this.bufferedEvents=[];for(let n of t)e(n);return this.listeners.push(e),this.extensions.replayInto(e),()=>{let n=this.listeners.indexOf(e);if(n!==-1)this.listeners.splice(n,1)}}onDestroy(e){this.onDestroyCallback=e}commandDeps(){return{inner:this.inner,emit:(e)=>this.emit(e),setPhase:(e)=>this.setPhase(e),resetIdleTimer:()=>this.idle.reset(),isPromptRunning:()=>this.phases.isPromptRunning(),setPromptRunning:(e)=>{this.phases.setPromptRunning(e)},markBusyStart:(e)=>this.phases.markBusyStart(e),touchPromptActivity:()=>this.phases.touchPromptActivity(),setForceEmptySystemPrompt:(e)=>this.setForceEmptySystemPrompt(e),waitForExtensionsBound:()=>this.extensions.waitUntilReady(),withFinalRunningNotification:(e)=>this.withFinalRunningNotification(e),clearExtensionUiState:()=>this.extensions.clearUiState(),syncProjectTrust:()=>this.syncProjectTrust(),extensionUiHost:()=>this.extensions.uiHost(),resolveExtensionUiResponse:(e)=>this.extensions.resolveExtensionUiResponse(e),applyForcedEmptySystemPrompt:()=>this.applyForcedEmptySystemPrompt(),getExtensionStatuses:()=>this.extensions.getExtensionStatuses(),getExtensionWidgets:()=>this.extensions.getExtensionWidgets(),destroy:()=>this.destroy()}}async send(e){this.idle.reset();let t=e.type;if(this.shouldWaitForExtensions(t))await this.extensions.waitUntilReady();if(t==="prompt"||t==="steer"||t==="follow_up"){let n=w_(e.images);if(n)throw Error(n)}return this.getCommands().dispatch(t,e)}destroy(){if(!this._alive)return;if(this._alive=!1,this.idle.stop(),this.inner.isBashRunning)this.inner.abortBash();this.unsubscribe?.(),this.extensions.destroyUiState(),this.onDestroyCallback?.(),Ft()}cancelPendingUiResponses(){this.extensions.cancelPendingUiResponses()}diagnostics(){return{alive:this._alive,running:this.isRunning(),promptRunning:this.phases.isPromptRunning(),lastPromptActivityAt:this.phases.getLastPromptActivityAt(),lastPromptActivityAgeMs:Date.now()-this.phases.getLastPromptActivityAt(),bufferedEvents:this.bufferedEvents.length,pendingUiRequests:this.extensions.uiDiagnostics()}}getPendingUiRequests(){return this.extensions.getPendingUiRequests()}resolveExtensionUiResponse(e){this.extensions.resolveExtensionUiResponse(e)}getExtensionStatuses(){return this.extensions.getExtensionStatuses()}getExtensionWidgets(){return this.extensions.getExtensionWidgets()}syncProjectTrust(){let e=Oe(this.cwd,r9());this.inner.settingsManager.setProjectTrusted(e.trusted)}}async function E_(e,t,n){if(!t.model&&!t.thinkingLevel)return{modelDefaultChanged:!1};let r=!1;if(t.model&&n.model&&t.model.provider===n.model.provider&&t.model.modelId===n.model.modelId)e.setDefaultModelAndProvider(n.model.provider,n.model.modelId),r=!0;if(t.thinkingLevel&&(n.supportsThinking||n.thinkingLevel!=="off"))e.setDefaultThinkingLevel(n.thinkingLevel);return await e.flush(),{modelDefaultChanged:r}}function g9(e,t,n,r){return{...e?{requestedModel:e}:{},...t&&n?{defaultModel:{provider:t,modelId:n}}:{},...r?{thinkingLevel:r}:{}}}function m9(e){if(e===void 0)return;return e.length===0?[]:void 0}function y9(e,t){return{...e.model?{model:e.model}:{},...e.thinkingLevel?{thinkingLevel:e.thinkingLevel}:{},...e.scopedModels.length>0?{scopedModels:e.scopedModels}:{},...t!==void 0?{tools:t}:{}}}function b9(e,t){return{...e?{model:e}:{},...t?{thinkingLevel:t}:{}}}function x9(e,t,n){return{...e?{model:{provider:e.provider,modelId:e.id}}:{},thinkingLevel:t,supportsThinking:n}}var Cg=ze("rpc-start"),v9=60000;async function Rr(e,t,n,r={}){let{toolNames:i,initialModel:o,thinkingLevel:s}=r,a=Xt(),c=t_(),u=n_(),d=a.get(e);if(d?.isAlive())return{session:d,realSessionId:e};let f=c.get(e);if(f){let v=Date.now()-(u.get(e)??0);if(v<v9)return f;Cg(`stale lock sid=${e} age=${Math.round(v/1000)}s — restarting fresh`),c.delete(e),u.delete(e)}let p;if(t)p=S_.open(t,void 0);else{if(!n)throw Error("cwd is required for a new session");p=S_.create(n,void 0)}let h=p.getCwd(),g=i_(h),b=performance.now(),x=(v)=>Cg(`sid=${e} ${v} +${Math.round(performance.now()-b)}ms`);x("cold start begin");let y=(async()=>{h9();let v=p9();await ug(h,v);let m=m9(i),w=ho(h,v),D=[d9(),l9({}),f9()],T=r.fixtureExtensionPaths??hl(e);x("creating services");let _=await u9({cwd:h,agentDir:v,...w?{resourceLoaderReloadOptions:w}:{},resourceLoaderOptions:{extensionFactories:D,...T.length>0?{additionalExtensionPaths:T}:{}}}),A=await cl(_.modelRuntime,_.settingsManager.getEnabledModels()),S=_.settingsManager.getDefaultProvider(),M=_.settingsManager.getDefaultModel(),C=p.getBranch().some((F)=>F.type==="message")?{scopedModels:[...A.scopedModels]}:ul(A,g9(o,S,M,s));x("services ready — spawning agent session");let{session:B}=await c9({services:_,sessionManager:p,...y9(C,m)});if((await E_(_.settingsManager,b9(o,s),x9(B.model,B.thinkingLevel,B.supportsThinking()))).modelDefaultChanged)Ce();if(i&&i.length>0)B.setActiveToolsByName(wl(B,i));let H=new El(B);if(i?.length===0)H.setForceEmptySystemPrompt(!0);H.start();let{sessionId:E,sessionFile:R}=B;if(R)jt(E,R);let k=a.get(E);if(k&&k!==H)throw Cg(`sid=${e} duplicate settle — destroying late instance`),H.destroy(),Error(`session ${e} already registered by a newer instance`);return H.onDestroy(()=>a.delete(E)),a.set(E,H),x("cold start done"),H.beginExtensionBinding({forceEmptySystemPrompt:i?.length===0}),{session:H,realSessionId:E}})().finally(()=>{c.delete(e),g()});return c.set(e,y),u.set(e,Date.now()),y.catch(()=>{}),y}var w9=5000,_9=60,T_=60000,Sl=new Map,Tl=new Set,Ag=new Map,va=new Map;function D9(){let e=Zn().preferences.gitAutoFetchIntervalSec;return typeof e==="number"&&Number.isFinite(e)?e:_9}function E9(e){let t=Ag.get(e);if(t)return t;let n=Gh();Ag.set(e,n.promise);let r;return(async()=>{try{let i=await Promise.race([(async()=>{let o=await tg(e);if(!o.ok)return{ok:!1,error:o.error};let s=await ol(e);return{ok:!0,snapshot:{ahead:s.ahead,behind:s.behind,updatedAt:Date.now()}}})(),new Promise((o,s)=>{r=setTimeout(()=>s(Error(`git fetch timeout after ${T_/1000}s`)),T_),r.unref?.()})]);n.resolve(i)}catch(i){n.resolve({ok:!1,error:i instanceof Error?i.message:String(i)})}finally{if(r)clearTimeout(r);Ag.delete(e)}})(),n.promise}async function C_(e){let t=new Map;for(let n of e){let r=null;try{r=await Ut(n)}catch{r=null}if(!r)continue;let i=t.get(r);if(i)i.push(n);else t.set(r,[n])}return t}async function A_(e,t){await Promise.all(Array.from(e,async([n,r])=>{let i=await E9(n);if(!i.ok){console.warn(`[git-autofetch] fetch failed for ${n}: ${i.error}`);return}for(let o of r)Sl.set(_t(o),i.snapshot);va.set(n,t)}))}function S9(e){let t=new Set(e);for(let n of[...Tl])if(!e.includes(n))Tl.delete(n);for(let n of[...Sl.keys()])if(!t.has(n))Sl.delete(n)}function T9(e){for(let t of[...va.keys()])if(!e.has(t))va.delete(t)}async function C9(e,t){let n=e.filter((i)=>!Tl.has(i));if(n.length===0)return;let r=await C_(n);await A_(r,t);for(let i of n)Tl.add(i)}async function A9(e,t,n){let r=new Map;for(let[i,o]of e){let s=va.get(i)??0;if(t-s<n*1000)continue;r.set(i,o)}if(r.size===0)return;await A_(r,t)}async function k9(e=Date.now()){let t=gg();if(S9(t),t.length===0){va.clear();return}let n=D9(),r=await C_(t);if(T9(r),n<=0){await C9(t,e);return}await A9(r,e,n)}function k_(e){return Sl.get(_t(e))??null}function U_(){setInterval(()=>{k9()},w9).unref()}import{isIP as R_}from"node:net";function F_(e){return(e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1):e).toLowerCase().replace(/\.$/,"")}function P_(e){if(!e||/[\s/@\\]/.test(e))return null;try{let t=new URL(`http://${e}`);if(t.username||t.password||t.pathname!=="/"||t.search||t.hash)return null;return F_(t.hostname)}catch{return null}}function U9(e){let t=e?.trim();if(!t)return null;return R_(t)?F_(t):P_(t)}function R9(e){return e==="localhost"||e.endsWith(".localhost")}function O_(){return[process.env.PI_WEB_HOSTNAME,...process.env.PI_WEB_ALLOWED_HOSTS?.split(",")??[]].filter((e)=>Boolean(e?.trim()))}function I_(e){try{return new URL(e).origin}catch{return null}}function F9(e){let t=new URL(e.url),n=e.headers.get("host");return n?I_(`${t.protocol}//${n}`):null}function P9(e){if(e.method!=="GET"||e.headers.get("sec-fetch-mode")!=="navigate"||e.headers.get("sec-fetch-dest")!=="document"||e.headers.get("sec-fetch-user")!=="?1")return!1;try{return/^\/api\/sessions\/[^/]+\/export$/.test(new URL(e.url).pathname)}catch{return!1}}function kg(e,t=O_()){let n=e.headers.get("host"),r=n?P_(n):null;if(!r)return!1;if(R9(r)||R_(r))return!0;return t.some((i)=>U9(i)===r)}function O9(e){let t=e.headers.get("origin");if(e.headers.get("sec-fetch-site")==="cross-site")return!1;if(!t)return!0;let r=F9(e);return r!==null&&I_(t)===r}function I9(e){return e.headers.has("origin")||e.headers.has("sec-fetch-site")}function Pt(e,t=O_()){if(!kg(e,t))return!1;if(P9(e))return!0;return!I9(e)||O9(e)}function Fr(e){let t=e.headers.get("content-type")?.split(";",1)[0]?.trim().toLowerCase();return t==="application/json"||Boolean(t?.startsWith("application/")&&t.endsWith("+json"))}import{createHash as M9,timingSafeEqual as N9}from"node:crypto";var B9="pi";function M_(e){return M9("sha256").update(e,"utf8").digest()}function N_(e,t){return N9(M_(e),M_(t))}function wa(e=process.env.PI_WEB_PASSWORD){return typeof e==="string"&&e.length>0}function Cl(e,t=process.env.PI_WEB_PASSWORD){if(!wa(t)||!e)return!1;let n=/^Basic\s+(\S+)$/i.exec(e);if(!n)return!1;let r;try{let u=Buffer.from(n[1],"base64");if(u.toString("base64")!==n[1])return!1;r=new TextDecoder("utf-8",{fatal:!0}).decode(u)}catch{return!1}let i=r.indexOf(":");if(i===-1)return!1;let o=r.slice(0,i),s=r.slice(i+1),a=N_(o,B9),c=N_(s,t);return a&&c}var B_=ze("mount"),L9=["GET","POST","PUT","PATCH","DELETE"];function Y(e,t,n){let r=t.split("/").filter(Boolean),i=[],o=new Map;for(let a of r){let c=a.match(/^\[\.\.\.(.+)\]$/),u=a.match(/^\[(.+)\]$/);if(c)i.push(`:${c[1]}{.+}`),o.set(c[1],{hono:c[1],catchAll:!0});else if(u)i.push(`:${u[1]}`),o.set(u[1],{hono:u[1],catchAll:!1});else i.push(a)}let s=`/${i.join("/")}`;for(let a of L9){let c=n[a];if(typeof c!=="function")continue;let u=c;e.on(a,s,async(d)=>{let f=performance.now();B_(`${a} ${d.req.path}`,"received");let p={};for(let[g,{hono:b,catchAll:x}]of o)if(x){let y=d.req.param(b)??"";p[g]=y===""?[]:y.split("/")}else p[g]=d.req.param(b)??"";let h=await u(d.req.raw,{params:Promise.resolve(p)});return B_(`${a} ${d.req.path}`,`${h.status} ${Math.round(performance.now()-f)}ms done`),h})}}var Fg={};Z(Fg,{GET:()=>X9});import{tmpdir as z9}from"node:os";import{Readable as V9}from"node:stream";import{constants as Ug}from"node:fs";import{lstat as W9,open as j9}from"node:fs/promises";import{basename as q9,dirname as $9,resolve as L_}from"node:path";var Al=5242880;function W_(e,t){let n=L_(e);if($9(n)!==L_(t))return null;if(!/^pi-bash-[A-Za-z0-9_-]+\.log$/.test(q9(n)))return null;return n}async function Rg(e){if(!(await W9(e)).isFile())throw Error("Bash output path is not a regular file");let n=typeof Ug.O_NOFOLLOW==="number"?Ug.O_NOFOLLOW:0,r=await j9(e,Ug.O_RDONLY|n);try{let i=await r.stat();if(!i.isFile())throw Error("Bash output path is not a regular file");return{handle:r,fileInfo:i}}catch(i){throw await r.close(),i}}async function j_(e,t=Al){let{handle:n,fileInfo:r}=await Rg(e);try{if(r.size>t)return{tooLarge:!0,size:r.size};let i=Buffer.alloc(r.size),o=0;while(o<i.length){let s=await n.read(i,o,i.length-o,o);if(s.bytesRead===0)break;o+=s.bytesRead}return{tooLarge:!1,content:i.subarray(0,o).toString("utf8"),size:o}}finally{await n.close()}}var H9=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function q_(e){return!!e&&H9.test(e)}function $_(e,t){return t.some((n)=>n.type==="message"&&n.message.role==="bashExecution"&&n.message.fullOutputPath===e)}async function H_(e,t){if(!q_(t))return!1;try{let n=await De(t);if(!n)return!1;return $_(e,bl(n))}catch{return!1}}async function X9(e,{params:t}){let{id:n}=await t,r=null,i=!1;try{let s=new URL(e.url);r=s.searchParams.get("path"),i=s.searchParams.get("download")==="1"}catch{return Response.json({error:"invalid url"},{status:400})}if(!r)return Response.json({error:"path required"},{status:400});let o=W_(r,z9());if(!o)return Response.json({error:"invalid path"},{status:400});if(!await H_(o,n))return Response.json({error:"forbidden"},{status:403});try{if(i){let{handle:a}=await Rg(o),c=V9.toWeb(a.createReadStream());return new Response(c,{headers:{"Content-Type":"text/plain; charset=utf-8","Content-Disposition":'attachment; filename="bash-output.log"',"Cache-Control":"no-store"}})}let s=await j_(o);if(s.tooLarge)return Response.json({error:`Full output is too large to display (limit ${Al} bytes)`,data:{size:s.size,maxBytes:Al}},{status:413});return Response.json({success:!0,data:{output:s.content}})}catch{return Response.json({error:"full output unavailable"},{status:404})}}var Pg={};Z(Pg,{GET:()=>K9});async function K9(e,{params:t}){let{id:n}=await t,r=Le(n);if(!r?.isAlive())return Response.json({error:"Session not found or not alive"},{status:404});return Response.json({success:!0,data:r.diagnostics()})}var jg={};Z(jg,{GET:()=>P6,POST:()=>F6,sendWithDeferredModelSwitch:()=>Wg,setFakeBusySession:()=>To});import{resolve as Z9}from"node:path";var Y9="piE2eFixtureDir",J9="piE2eFixtureDir";function Og(e){return Z9(process.cwd(),e)}function Q9(e){if(!e)return{};let t={};for(let n of e.split(";")){let r=n.indexOf("=");if(r===-1)continue;t[n.slice(0,r).trim()]=n.slice(r+1).trim()}return t}function ae(e){let t=Q9(e.headers.get("cookie"))[Y9];if(t)try{return Og(decodeURIComponent(t))}catch{return Og(t)}let n=new URL(e.url).searchParams.get(J9);return n?Og(n):void 0}Eo();import{mkdir as c6,readFile as u6,rename as l6,writeFile as d6}from"node:fs/promises";import{dirname as f6,join as p6}from"node:path";import{getAgentDir as h6}from"@earendil-works/pi-coding-agent";var g6=[{name:"readonly",tools:["read","grep","find","ls"],description:{en:"Read-only tools (read/grep/find/ls)","zh-CN":"仅只读工具(read/grep/find/ls)"}},{name:"full",tools:["bash","read","edit","write","grep","find","ls"],description:{en:"All built-in tools enabled (except codemode)","zh-CN":"内置工具全开(codemode除外)"}},{name:"codemode",tools:["codemode"],description:{en:"Codemode only","zh-CN":"仅激活codemode"}}],m6=new Set(["off","default"]),z_=g6;function V_(){return p6(h6(),"pi-web","tool-presets.json")}function Ig(e){if(!Array.isArray(e))return null;let t=new Set,n=[];for(let r of e){if(typeof r!=="object"||r===null)return null;let{name:i,tools:o,description:s}=r;if(typeof i!=="string"||i.trim().length===0)return null;let a=i.trim();if(t.has(a))return null;if(!Array.isArray(o)||o.some((u)=>typeof u!=="string"||u.trim()===""))return null;t.add(a);let c=y6(s);n.push({name:a,tools:o.map((u)=>u.trim()),...c?{description:c}:{}})}return n}function y6(e){if(typeof e==="string"){let r=e.trim();return r.length>0?r:void 0}if(typeof e!=="object"||e===null||Array.isArray(e))return;let t=e,n={};for(let r of["en","zh-CN"]){let i=t[r];if(typeof i==="string"&&i.trim().length>0)n[r]=i.trim()}if(Object.keys(n).length===0)return;return n}function X_(e){return e.filter((t)=>!m6.has(t.name))}async function So(){try{let e=await u6(V_(),"utf8"),t=Ig(JSON.parse(e));return t?{presets:X_(t),exists:!0}:{presets:z_,exists:!1}}catch{return{presets:z_,exists:!1}}}async function K_(e){let t=V_();await c6(f6(t),{recursive:!0});let n=`${t}.tmp`;await d6(n,`${JSON.stringify(X_(e),null,2)}
284
+ `;UL(n,i,{encoding:"utf8",flag:"wx"}),t.flushed=!0,jt(e.sessionId,n)}import{realpathSync as RL}from"node:fs";import{resolve as FL}from"node:path";function Xt(){if(!globalThis.__piSessions){globalThis.__piSessions=new Map;let e=()=>globalThis.__piSessions?.forEach((t)=>t.destroy());process.once("exit",e),process.once("SIGINT",e),process.once("SIGTERM",e)}return globalThis.__piSessions}function t_(){if(!globalThis.__piStartLocks)globalThis.__piStartLocks=new Map;return globalThis.__piStartLocks}function n_(){if(!globalThis.__piStartLocksAt)globalThis.__piStartLocksAt=new Map;return globalThis.__piStartLocksAt}function _t(e){let t=FL(e);try{return RL(t)}catch{return t}}function r_(){if(!globalThis.__piStartingSessionCwds)globalThis.__piStartingSessionCwds=new Map;return globalThis.__piStartingSessionCwds}function i_(e){let t=r_(),n=_t(e);return t.set(n,(t.get(n)??0)+1),()=>{let r=(t.get(n)??1)-1;if(r>0)t.set(n,r);else t.delete(n)}}function Le(e){return Xt().get(e)}function pg(e){let t=_t(e);for(let[n,r]of Xt()){if(!r.isAlive())continue;if(_t(r.cwd)!==t)continue;if(r.hasMessages())continue;return n}return}function hg(e){let t=_t(e);if(r_().has(t))return!0;return Array.from(Xt().values()).some((n)=>_t(n.cwd)===t&&n.isRunning())}function gg(){let e=new Set,t=[];for(let n of Xt().values()){let r=_t(n.cwd);if(e.has(r))continue;e.add(r),t.push(r)}return t}function mg(e){let t=_t(e),n=Array.from(Xt().values()).filter((r)=>_t(r.cwd)===t);for(let r of n)r.destroy();return n.length}function ba(e,t={}){let n=[],r=[];for(let i of e){let o=Xt().get(i);if(!o)continue;if(t.skipRunning&&o.isRunning()){r.push(o.sessionId||i);continue}o.destroy(),n.push(o.sessionId||i)}return{restarted:n,skipped:r}}function yg(){let e=new Set;for(let[t,n]of Xt())if(n.isRunning())e.add(n.sessionId||t);return[...e]}function wo(){let e=[],t={},n={},r={};for(let[i,o]of Xt())if(o.isRunning()){let s=o.sessionId||i;e.push(s);let a=o.getPhase();if(a){t[s]=a;let u=o.getPhaseStartedAt();if(u!==null)n[s]=u}let c=o.getBusyStartedAt();if(c!==null)r[s]=c}return{runningSessionIds:e,phases:t,phaseSince:n,busySince:r}}function o_(){if(!globalThis.__piRunningListeners)globalThis.__piRunningListeners=new Set;return globalThis.__piRunningListeners}function bg(e){let t=o_();return t.add(e),()=>{t.delete(e)}}var fg="";function Ft(){let e=o_(),t=wo();if(Qe("running-snapshot","change",`ids=[${t.runningSessionIds.join(",")}] phases=${JSON.stringify(t.phases)} since=${JSON.stringify(t.phaseSince)}`),e.size===0){fg="";return}let n=JSON.stringify(t);if(n===fg)return;fg=n;for(let r of e)try{r(t)}catch{}}function s_(){if(!globalThis.__piAgentEventListeners)globalThis.__piAgentEventListeners=new Set;return globalThis.__piAgentEventListeners}function xg(e){let t=s_();return t.add(e),()=>{t.delete(e)}}function vg(e,t){for(let n of s_())try{n(e,t)}catch{}}async function a_(e,t){if(e.isPromptRunning()||e.inner.isStreaming||e.inner.isCompacting||e.inner.isBashRunning)throw Error("Cannot run a shell command while the session is busy");let n=e.inner.executeBash(t.command,void 0,{excludeFromContext:t.excludeFromContext});e.markBusyStart(!0),e.setPhase({kind:"running_command"}),Ft();try{let r=await n;return e_(e.inner),r}finally{e.resetIdleTimer(),qe(),e.emit({type:"prompt_done"}),e.setPhase(null),Ft()}}function c_(e){return e.inner.abortBash(),null}async function u_(e,t){if(e.inner.isBashRunning)throw Error("Cannot send a prompt while a shell command is running");let{images:n,streamingBehavior:r}=t;return Qe("ui-chain","2a sdk prompt",`${JSON.stringify(String(t.message).slice(0,80))} streamingBehavior=${r??"-"}`),e.setPromptRunning(!0),e.markBusyStart(!r),e.setPhase({kind:"waiting_model"}),e.touchPromptActivity(),Ft(),e.inner.prompt(t.message,{...n?.length?{images:n}:{},...r?{streamingBehavior:r}:{},source:"rpc"}).then(()=>{if(Qe("ui-chain","2c prompt done"),e.setPromptRunning(!1),e.resetIdleTimer(),!r)e.emit({type:"prompt_done"});Ft()}).catch((i)=>{if(Qe("ui-chain","2c prompt error",i instanceof Error?i.message:String(i)),e.setPromptRunning(!1),e.resetIdleTimer(),qe(),e.emit({type:"prompt_error",errorMessage:i instanceof Error?i.message:String(i)}),!r)e.emit({type:"prompt_done"});Ft()}),null}function PL(e){if(!e.inner.model)return;let n=e.inner.getContextUsage();if(!n||n.tokens==null||n.contextWindow<=0||n.tokens<=n.contextWindow)return n;let r=e.inner.sessionManager.buildSessionProjection(),i=e.inner.sessionManager.getBranch(),o=null;if(r.messages.forEach((u,d)=>{if(u.role!=="assistant")return;let f=u;if(!f.usage||f.stopReason==="aborted"||f.stopReason==="error")return;let p=f.usage;if((p.totalTokens??(p.input??0)+(p.output??0)+(p.cacheRead??0)+(p.cacheWrite??0))>0)o=d}),o==null)return{...n,tokens:null,percent:null};let s=-1,a=0;for(let u of r.entries){let d=a+u.messages.length;if(o<d){s=i.findIndex((f)=>f.id===u.sourceEntry.id);break}a=d}let c=-1;for(let u=i.length-1;u>=0;u--){let d=i[u].type;if(d==="context_edit"||d==="compaction"){c=u;break}}if(s>c)return n;return{...n,tokens:null,percent:null}}function l_(e){let t=e.inner.model,n=PL(e);return{sessionId:e.inner.sessionId,sessionFile:e.inner.sessionFile??"",isStreaming:e.inner.isStreaming,isPromptRunning:e.isPromptRunning(),isBashRunning:e.inner.isBashRunning,isCompacting:e.inner.isCompacting,autoCompactionEnabled:e.inner.autoCompactionEnabled,autoRetryEnabled:e.inner.autoRetryEnabled,model:t?{id:t.id,provider:t.provider}:void 0,messageCount:0,pendingMessageCount:e.inner.pendingMessageCount,queuedMessages:{steering:[...e.inner.getSteeringMessages()],followUp:[...e.inner.getFollowUpMessages()]},contextUsage:n?{percent:n.percent,contextWindow:n.contextWindow,tokens:n.tokens}:null,systemPrompt:e.inner.agent.state?.systemPrompt??"",thinkingLevel:e.inner.agent.state?.thinkingLevel??"off",extensionStatuses:e.getExtensionStatuses(),extensionWidgets:e.getExtensionWidgets()}}var OL=["read","bash","edit","write","grep","find","ls"];function wl(e,t){if(t.length===0)return[];let n=new Set(OL),r=new Set(e.getActiveToolNames()),i=e.getAllTools().map((o)=>o.name).filter((o)=>!n.has(o)&&(o!=="codemode"||r.has("codemode")));return[...new Set([...t,...i])]}function d_(e){let t=e.inner.getAllTools(),n=new Set(e.inner.getActiveToolNames());return t.map((r)=>({name:r.name,description:r.description,active:n.has(r.name)}))}function f_(e){let t=[];for(let n of e.inner.extensionRunner.getRegisteredCommands())t.push({name:n.invocationName,description:n.description,source:"extension",sourceInfo:n.sourceInfo});for(let n of e.inner.promptTemplates)t.push({name:n.name,description:n.description,source:"prompt",sourceInfo:n.sourceInfo});for(let n of e.inner.resourceLoader.getSkills().skills)t.push({name:`skill:${n.name}`,description:n.description,source:"skill",sourceInfo:n.sourceInfo});return{commands:t}}function p_(e,t){let n=t.toolNames;return e.setForceEmptySystemPrompt(n.length===0),e.inner.setActiveToolsByName(wl(e.inner,n)),e.applyForcedEmptySystemPrompt(),null}import{SessionManager as _g}from"@earendil-works/pi-coding-agent";import{copyFileSync as IL,readdirSync as ML,statSync as NL,unlinkSync as BL}from"node:fs";import{basename as LL,dirname as xa,join as _l}from"node:path";function Dl(e){let t=LL(e);return t.endsWith(".jsonl")?t.slice(0,-6):t}function wg(e,t){if(!t||t.includes("/")||t.includes("\\")||t.includes(".."))return!1;let n=Dl(e);if(t===`${n}.jsonl`)return!1;return t.startsWith(`${n}.`)}function h_(e){let t=Dl(e);try{return ML(xa(e)).filter((n)=>{if(!n.startsWith(`${t}.`)||n===`${t}.jsonl`)return!1;return wg(e,n)}).map((n)=>{let r=NL(_l(xa(e),n));return{name:n,size:r.size,modified:r.mtime.toISOString()}}).sort((n,r)=>n.name.localeCompare(r.name))}catch{return[]}}function g_(e,t,n){let r=Dl(e),i=Dl(t);for(let o of n){if(!wg(e,o))continue;let s=o.slice(r.length);try{IL(_l(xa(e),o),_l(xa(t),`${i}${s}`))}catch{}}}function m_(e,t){for(let n of t){if(!wg(e,n))continue;try{BL(_l(xa(e),n))}catch{}}}async function y_(e,t){if(e.inner.isBashRunning)throw Error("Cannot fork while a shell command is running");let n=t.entryId,r=e.inner.sessionManager,i=e.inner.sessionFile;if(!r.isPersisted())return{cancelled:!0};if(!i)throw Error("Persisted session is missing a session file");let o=r.getEntry(n);if(!o)throw Error("Invalid entry ID for forking");let s=r.getSessionDir(),a;if(!o.parentId){let d=_g.create(r.getCwd(),s);d.newSession({parentSession:i}),a=d.getSessionFile()}else{let f=_g.open(i,s).createBranchedSession(o.parentId);if(!f)throw Error("Failed to create forked session");a=f}let c=_g.open(a,s).getSessionId(),u=t.copyAuxFiles;if(Array.isArray(u)&&u.every((d)=>typeof d==="string"))g_(i,a,u);return jt(c,a),qe(),e.destroy(),{cancelled:!1,newSessionId:c}}async function b_(e,t){if(e.inner.isBashRunning)throw Error("Cannot navigate while a shell command is running");return{cancelled:(await e.inner.navigateTree(t.targetId,{})).cancelled}}class _o extends Error{}function x_(e){return e instanceof _o||e instanceof Error&&/cannot be queued|while a shell command is running/.test(e.message)}async function WL(e,t){let{provider:n,modelId:r}=t,i=e.inner.modelRuntime.getModel(n,r);if(!i)await e.inner.modelRuntime.refresh({allowNetwork:!1}),i=e.inner.modelRuntime.getModel(n,r);if(!i)throw Error(`Model not found: ${n}/${r}`);return await e.inner.setModel(i),Ce(),qe(),{id:i.id,provider:i.provider}}async function jL(e,t){let n=t.level;if(e.inner.setThinkingLevel(n),n==="xhigh"&&e.inner.model?.compat?.thinkingFormat==="deepseek"&&e.inner.agent?.state)e.inner.agent.state.thinkingLevel="xhigh";return qe(),null}async function qL(e,t){try{return await e.withFinalRunningNotification(()=>e.inner.compact(t.customInstructions))}catch(n){if(n instanceof Error&&n.message.includes(z1))throw Error(V1,{cause:n});throw n}finally{qe()}}async function $L(e,t){let n=t.name?.trim();if(!n)throw Error("Session name cannot be empty");return e.inner.setSessionName(n),qe(),null}async function HL(e){return{...e.inner.getSessionStats(),sessionName:e.inner.sessionManager.getSessionName()}}async function GL(e,t){return e.inner.setAutoCompactionEnabled(t.enabled),null}async function zL(e,t){let n=t.images;try{await e.inner.steer(t.message,n?.length?n:void 0)}catch(r){if(x_(r))throw new _o(r instanceof Error?r.message:String(r));throw r}return null}async function VL(e,t){let n=t.images;return await e.inner.followUp(t.message,n?.length?n:void 0),null}async function XL(e){if(await e.waitForExtensionsBound(),e.clearExtensionUiState(),e.syncProjectTrust(),await e.inner.reload(),typeof e.inner.bindExtensions!=="function")e.inner.extensionRunner.setUIContext?.(ya(e.extensionUiHost()),"rpc");return e.applyForcedEmptySystemPrompt(),Ce(),{success:!0}}var KL={prompt:u_,abort:(e)=>e.withFinalRunningNotification(()=>e.inner.abort()),get_state:l_,set_model:WL,fork:y_,navigate_tree:b_,set_thinking_level:jL,compact:qL,set_session_name:$L,get_session_stats:HL,get_last_assistant_text:(e)=>({text:e.inner.getLastAssistantText()??""}),set_auto_compaction:GL,clear_queue:(e)=>e.inner.clearQueue(),steer:zL,follow_up:VL,get_tools:d_,get_commands:f_,set_tools:p_,reload:XL,abort_compaction:(e)=>e.inner.abortCompaction(),extension_ui_response:(e,t)=>(e.resolveExtensionUiResponse(t),null),extension_ui_input:(e,t)=>(dg(e.extensionUiHost(),t.id,t.data),null),set_auto_retry:(e,t)=>(e.inner.setAutoRetryEnabled(t.enabled),null),bash:a_,abort_bash:c_};function v_(e){async function t(n,r){let i=KL[n];if(!i)throw Error(`Unsupported command: ${n}`);return i(e,r)}return{dispatch:t}}import{getAgentDir as r9}from"@earendil-works/pi-coding-agent";function ZL(e){if(typeof e!=="string")return null;if(e.startsWith("image/"))return"image";return null}function YL(e){return e>=65&&e<=90||e>=97&&e<=122||e>=48&&e<=57||e===43||e===47}function JL(e){if(!e||e.length%4!==0)return null;let t=e.endsWith("==")?2:e.endsWith("=")?1:0,n=e.length-t;for(let r=0;r<n;r+=1)if(!YL(e.charCodeAt(r)))return null;for(let r=n;r<e.length;r+=1)if(e[r]!=="=")return null;return e.length/4*3-t}function QL(e){if(!e||typeof e!=="object")return!1;let t=e;if(typeof t.data!=="string"||typeof t.mimeType!=="string"||ZL(t.mimeType)===null)return!1;let n=JL(t.data);return n!==null&&n<=10485760}function w_(e){if(e===void 0)return null;if(!Array.isArray(e))return"images must be an array";if(e.length>10)return"A message can include at most 10 attachments";for(let t of e){if(!t||typeof t!=="object"||t.type!=="image")return"Each attachment must use the image content block type";if(!QL(t))return"Each attachment must be valid base64 image data of 10MB or smaller"}return null}import{randomUUID as Dg}from"node:crypto";class Eg{deps;pendingUiResponses=new Map;pendingUiRequests=new Map;activeCustomUis=new Map;extensionStatuses=new Map;extensionWidgets=new Map;extensionsBound=!1;extensionBindingPromise=null;extensionBindingError=null;constructor(e){this.deps=e}beginBinding(e={}){this.ensureBound(e).catch((t)=>{console.error("[pi-web] failed to dispatch session_start to extensions:",t instanceof Error?t.message:t)})}async waitUntilReady(){await this.waitForBound()}shouldWaitForExtensions(e){return e==="prompt"||e==="steer"||e==="follow_up"||e==="get_commands"}uiDiagnostics(){return[...this.pendingUiRequests.values()]}cancelPendingUiResponses(){for(let e of this.pendingUiResponses.values())e.cancel();this.pendingUiResponses.clear(),this.pendingUiRequests.clear()}destroyUiState(){this.cancelPendingUiResponses();let e=this.uiHost();for(let t of Array.from(this.activeCustomUis.keys()))xo(e,t,void 0);this.pendingUiResponses.clear(),this.pendingUiRequests.clear()}clearUiState(){this.extensionStatuses.clear(),this.extensionWidgets.clear()}getPendingUiRequests(){return Array.from(this.pendingUiRequests.values())}hasPendingUiRequests(){return this.pendingUiRequests.size>0}resolveExtensionUiResponse(e){let t=this.pendingUiResponses.get(e.id);if(!t){Qe("ui-chain",`4b ui response DROPPED (no pending) id=${e.id.slice(0,8)}`,JSON.stringify(e).slice(0,200));return}Qe("ui-chain",`4 ui response id=${e.id.slice(0,8)}`,JSON.stringify(e).slice(0,200)),t.resolve(e)}getExtensionStatuses(){return Array.from(this.extensionStatuses,([e,t])=>({key:e,text:t}))}getExtensionWidgets(){return Array.from(this.extensionWidgets.values())}replayInto(e){for(let t of this.pendingUiRequests.values())e(t);for(let t of this.extensionWidgets.values())e({type:"extension_ui_request",id:Dg(),method:"setWidget",widgetKey:t.key,widgetLines:t.lines,widgetPlacement:t.placement});for(let[t,n]of this.extensionStatuses)e({type:"extension_ui_request",id:Dg(),method:"setStatus",statusKey:t,statusText:n})}uiHost(){return{activeCustomUis:this.activeCustomUis,pendingUiRequests:this.pendingUiRequests,pendingUiResponses:this.pendingUiResponses,extensionStatuses:this.extensionStatuses,extensionWidgets:this.extensionWidgets,emit:(e)=>this.deps.emit(e)}}ensureBound(e={}){if(e.forceEmptySystemPrompt)this.deps.markForceEmptySystemPrompt();if(this.extensionsBound)return this.deps.applyForcedEmptySystemPrompt(),Promise.resolve();if(this.extensionBindingPromise)return this.extensionBindingPromise;return this.extensionBindingError=null,this.extensionBindingPromise=(async()=>{if(!this.deps.isAlive())return;let t=ya(this.uiHost());if(typeof this.deps.inner.bindExtensions==="function")await this.deps.inner.bindExtensions.call(this.deps.inner,{uiContext:t,mode:"rpc",commandContextActions:this.createCommandContextActions(),shutdownHandler:()=>this.deps.emit({type:"extension_ui_request",id:Dg(),method:"notify",notifyType:"warning",message:"Extension requested shutdown, but shutdown is not supported in Pi Web."}),onError:(r)=>this.deps.emit({type:"extension_error",extensionPath:r.extensionPath,event:r.event,error:r.error})});else this.deps.inner.extensionRunner.setUIContext?.(t,"rpc");this.extensionsBound=!0,this.deps.applyForcedEmptySystemPrompt(),console.log(`[pi-web] session_start dispatched to extensions for session ${this.deps.inner.sessionId}`)})().catch((t)=>{throw this.extensionBindingError=t,t}),this.extensionBindingPromise}async waitForBound(){try{if(this.extensionBindingPromise)await this.extensionBindingPromise}catch(e){throw e instanceof Error?e:Error(String(e))}if(this.extensionBindingError)throw this.extensionBindingError instanceof Error?this.extensionBindingError:Error(String(this.extensionBindingError))}createCommandContextActions(){return{waitForIdle:async()=>{await this.deps.inner.agent.waitForIdle?.()},newSession:async()=>({cancelled:!0}),fork:async()=>({cancelled:!0}),navigateTree:async(e,t)=>({cancelled:(await this.deps.inner.navigateTree(e,{summarize:t?.summarize})).cancelled}),switchSession:async()=>({cancelled:!0}),reload:async()=>{this.extensionStatuses.clear(),this.extensionWidgets.clear(),this.deps.syncProjectTrust(),await this.deps.inner.reload({beforeSessionStart:()=>{this.deps.inner.extensionRunner.setUIContext?.(ya(this.uiHost()),"rpc")}}),this.deps.applyForcedEmptySystemPrompt()}}}}import{existsSync as e9}from"node:fs";var __=(()=>{if(process.env.PI_WEB_E2E!=="1")return 600000;let e=Number(process.env.PI_SESSION_IDLE_MS);return Number.isFinite(e)&&e>0?e:600000})();class Sg{idleTimer=null;deps;constructor(e){this.deps=e}reset(){if(this.idleTimer)clearTimeout(this.idleTimer);this.idleTimer=setTimeout(()=>{if(this.deps.isRunning()){if(this.deps.isPromptRunning()&&Date.now()-this.deps.getLastPromptActivityAt()>=__){if(this.deps.isBashRunning()||this.deps.hasPendingUiRequests()){this.reset();return}this.settleStalledRun();return}this.reset();return}let e=this.deps.sessionFile();if(e&&!e9(e)){this.reset();return}this.deps.destroy()},__)}stop(){if(this.idleTimer)clearTimeout(this.idleTimer);this.idleTimer=null}settleStalledRun(){try{this.deps.unlockStall()}catch{}this.deps.setPromptRunning(!1),this.deps.emit({type:"prompt_error",errorMessage:"Agent run stalled (no activity for 10 minutes) — reset to idle. "+"If this keeps happening, restart the pi-web server."}),this.deps.emit({type:"prompt_done"}),this.reset(),this.deps.notifyRunningChange()}}function D_(e){let t=e?.contentIndex;if(typeof t!=="number")return null;let n=e?.partial?.content?.[t];if(n?.type!=="toolCall")return null;let r=n;if(typeof r.id!=="string"||!r.id)return null;return{id:r.id,name:typeof r.name==="string"&&r.name?r.name:r.id}}var t9=120000,n9=new Set(["agent_start","message_update","message_end","tool_execution_start","tool_execution_update","tool_execution_end","bash_execution_update","auto_compaction_start","compaction_start"]);class Tg{phase=null;phaseStartedAt=null;busyStartedAt=null;runningToolNames=new Map;promptRunning=!1;lastPromptActivityAt=0;externalActivityAt=null;getPhase(){return this.phase}getPhaseStartedAt(){return this.phaseStartedAt}getBusyStartedAt(){return this.busyStartedAt}isPromptRunning(){return this.promptRunning}isExternalActivityFresh(){return this.externalActivityAt!==null&&Date.now()-this.externalActivityAt<t9}setPromptRunning(e){this.promptRunning=e}markBusyStart(e){if(this.busyStartedAt===null||e)this.busyStartedAt=Date.now()}touchPromptActivity(){this.lastPromptActivityAt=Date.now()}getLastPromptActivityAt(){return this.lastPromptActivityAt}setPhase(e){let t=(this.phase?.kind??null)!==(e?.kind??null);if(this.phase=e,!e){this.phaseStartedAt=null;return}let n=t||this.phaseStartedAt===null?Date.now():this.phaseStartedAt;this.phaseStartedAt=this.busyStartedAt!==null?Math.max(n,this.busyStartedAt):n}updatePhaseFromEvent(e){if(!this.promptRunning&&n9.has(e.type))this.externalActivityAt=Date.now();switch(e.type){case"agent_start":this.onAgentStart();break;case"agent_end":this.onAgentEnd();break;case"message_update":this.onMessageUpdate(e);break;case"auto_retry_start":this.onAutoRetryStart(e);break;case"auto_retry_end":this.onAutoRetryEnd();break;case"tool_execution_start":this.onToolStart(e);break;case"tool_execution_end":this.onToolEnd(e);break}}onAgentStart(){this.setPhase({kind:"waiting_model"})}onAgentEnd(){this.runningToolNames.clear(),this.setPhase(null)}toolsOrFallback(e){return this.runningToolNames.size>0?{kind:"running_tools",tools:[...this.runningToolNames.entries()].map(([t,n])=>({id:t,name:n}))}:e}onMessageUpdate(e){let t=e.assistantMessageEvent,n=t?.type??"";if(n.startsWith("thinking")){this.setPhase(this.toolsOrFallback({kind:"thinking"}));return}if(n==="toolcall_start"||n==="toolcall_delta"){let r=D_(t);if(r)this.runningToolNames.set(r.id,r.name);this.syncRunningToolsPhase();return}if(n==="toolcall_end")return;this.setPhase(this.toolsOrFallback(null))}onAutoRetryStart(e){let t=e;this.setPhase({kind:"retrying",attempt:t.attempt??1,maxAttempts:t.maxAttempts??1,errorMessage:t.errorMessage})}onAutoRetryEnd(){this.setPhase(null)}onToolStart(e){let t=e.toolCallId;if(t)this.runningToolNames.set(t,e.toolName??t);this.syncRunningToolsPhase()}onToolEnd(e){let t=e.toolCallId;if(t)this.runningToolNames.delete(t);this.syncRunningToolsPhase()}syncRunningToolsPhase(){this.setPhase(this.runningToolNames.size>0?{kind:"running_tools",tools:[...this.runningToolNames.entries()].map(([e,t])=>({id:e,name:t}))}:{kind:"waiting_model"})}}var i9=1000,o9=new Set(["agent_start","agent_end","agent_settled","message_update","tool_execution_start","tool_execution_end","auto_compaction_start","auto_compaction_end","compaction_start","compaction_end","auto_retry_start","auto_retry_end"]),s9=new Set(["agent_end","agent_settled","auto_compaction_end","compaction_end"]),a9=new Set(["agent_start","message_update","message_end","tool_execution_start","tool_execution_update","tool_execution_end","bash_execution_update","agent_end","agent_settled","auto_compaction_start","auto_compaction_end","compaction_start","compaction_end","prompt_done","prompt_error"]);class El{inner;listeners=[];forceEmptySystemPrompt=!1;savedTransformContext;unsubscribe=null;idle=new Sg({isRunning:()=>this.isRunning(),isPromptRunning:()=>this.phases.isPromptRunning(),getLastPromptActivityAt:()=>this.phases.getLastPromptActivityAt(),isBashRunning:()=>this.inner.isBashRunning,hasPendingUiRequests:()=>this.extensions.hasPendingUiRequests(),sessionFile:()=>this.sessionFile,setPromptRunning:(e)=>this.phases.setPromptRunning(e),emit:(e)=>this.emit(e),destroy:()=>this.destroy(),notifyRunningChange:()=>Ft(),unlockStall:()=>{this.cancelPendingUiResponses(),this.inner.abort().catch(()=>{})}});onDestroyCallback=null;bufferedEvents=[];_alive=!0;commands=null;phases=new Tg;extensions;constructor(e){this.inner=e;this.extensions=new Eg({inner:this.inner,isAlive:()=>this._alive,emit:(t)=>this.emit(t),markForceEmptySystemPrompt:()=>{this.forceEmptySystemPrompt=!0},applyForcedEmptySystemPrompt:()=>this.applyForcedEmptySystemPrompt(),syncProjectTrust:()=>this.syncProjectTrust()})}getCommands(){if(!this.commands)this.commands=v_(this.commandDeps());return this.commands}get sessionId(){return this.inner.sessionId}get sessionFile(){return this.inner.sessionFile??""}get cwd(){return this.inner.sessionManager.getCwd()}hasMessages(){return this.inner.sessionManager.getBranch().some((e)=>e.type==="message")}isAlive(){return this._alive}isRunning(){return this._alive&&(this.phases.isPromptRunning()||this.inner.isStreaming||this.inner.isCompacting||this.inner.isBashRunning||this.phases.isExternalActivityFresh())}start(){this.unsubscribe=this.inner.subscribe((e)=>{if(e.type==="agent_end")qe();if(s9.has(e.type))this.idle.reset();if(a9.has(e.type))this.phases.touchPromptActivity();if(this.phases.updatePhaseFromEvent(e),this.emit(e),o9.has(e.type))Ft()}),this.idle.reset(),Ft()}getPhase(){return this.phases.getPhase()}getPhaseStartedAt(){return this.phases.getPhaseStartedAt()}getBusyStartedAt(){return this.phases.getBusyStartedAt()}setPhase(e){this.phases.setPhase(e)}setForceEmptySystemPrompt(e){this.forceEmptySystemPrompt=e,this.applyForcedEmptySystemPrompt()}beginExtensionBinding(e={}){this.extensions.beginBinding(e)}async waitUntilReady(){await this.extensions.waitUntilReady()}shouldWaitForExtensions(e){return this.extensions.shouldWaitForExtensions(e)}async withFinalRunningNotification(e){try{return await e()}finally{this.idle.reset(),Ft()}}applyForcedEmptySystemPrompt(){let e=this.inner.agent;if(!e)return;if(this.forceEmptySystemPrompt){if(this.savedTransformContext!==void 0)return;let t=e.transformContext;this.savedTransformContext=t,e.transformContext=async(n,r)=>{let i=t?await t(n,r):n;return[{role:"system",content:"",timestamp:Date.now()},...i.filter((s)=>s.role!=="system")]}}else if(this.savedTransformContext!==void 0)e.transformContext=this.savedTransformContext,this.savedTransformContext=void 0}emit(e){if(vg(this.sessionId,e),this.listeners.length===0){if(this.bufferedEvents.push(e),this.bufferedEvents.length>i9)this.bufferedEvents.shift();return}for(let t of this.listeners)t(e)}onEvent(e){let t=this.bufferedEvents;this.bufferedEvents=[];for(let n of t)e(n);return this.listeners.push(e),this.extensions.replayInto(e),()=>{let n=this.listeners.indexOf(e);if(n!==-1)this.listeners.splice(n,1)}}onDestroy(e){this.onDestroyCallback=e}commandDeps(){return{inner:this.inner,emit:(e)=>this.emit(e),setPhase:(e)=>this.setPhase(e),resetIdleTimer:()=>this.idle.reset(),isPromptRunning:()=>this.phases.isPromptRunning(),setPromptRunning:(e)=>{this.phases.setPromptRunning(e)},markBusyStart:(e)=>this.phases.markBusyStart(e),touchPromptActivity:()=>this.phases.touchPromptActivity(),setForceEmptySystemPrompt:(e)=>this.setForceEmptySystemPrompt(e),waitForExtensionsBound:()=>this.extensions.waitUntilReady(),withFinalRunningNotification:(e)=>this.withFinalRunningNotification(e),clearExtensionUiState:()=>this.extensions.clearUiState(),syncProjectTrust:()=>this.syncProjectTrust(),extensionUiHost:()=>this.extensions.uiHost(),resolveExtensionUiResponse:(e)=>this.extensions.resolveExtensionUiResponse(e),applyForcedEmptySystemPrompt:()=>this.applyForcedEmptySystemPrompt(),getExtensionStatuses:()=>this.extensions.getExtensionStatuses(),getExtensionWidgets:()=>this.extensions.getExtensionWidgets(),destroy:()=>this.destroy()}}async send(e){this.idle.reset();let t=e.type;if(this.shouldWaitForExtensions(t))await this.extensions.waitUntilReady();if(t==="prompt"||t==="steer"||t==="follow_up"){let n=w_(e.images);if(n)throw Error(n)}return this.getCommands().dispatch(t,e)}destroy(){if(!this._alive)return;if(this._alive=!1,this.idle.stop(),this.inner.isBashRunning)this.inner.abortBash();this.unsubscribe?.(),this.extensions.destroyUiState(),this.onDestroyCallback?.(),Ft()}cancelPendingUiResponses(){this.extensions.cancelPendingUiResponses()}diagnostics(){return{alive:this._alive,running:this.isRunning(),promptRunning:this.phases.isPromptRunning(),lastPromptActivityAt:this.phases.getLastPromptActivityAt(),lastPromptActivityAgeMs:Date.now()-this.phases.getLastPromptActivityAt(),bufferedEvents:this.bufferedEvents.length,pendingUiRequests:this.extensions.uiDiagnostics()}}getPendingUiRequests(){return this.extensions.getPendingUiRequests()}resolveExtensionUiResponse(e){this.extensions.resolveExtensionUiResponse(e)}getExtensionStatuses(){return this.extensions.getExtensionStatuses()}getExtensionWidgets(){return this.extensions.getExtensionWidgets()}syncProjectTrust(){let e=Oe(this.cwd,r9());this.inner.settingsManager.setProjectTrusted(e.trusted)}}async function E_(e,t,n){if(!t.model&&!t.thinkingLevel)return{modelDefaultChanged:!1};let r=!1;if(t.model&&n.model&&t.model.provider===n.model.provider&&t.model.modelId===n.model.modelId)e.setDefaultModelAndProvider(n.model.provider,n.model.modelId),r=!0;if(t.thinkingLevel&&(n.supportsThinking||n.thinkingLevel!=="off"))e.setDefaultThinkingLevel(n.thinkingLevel);return await e.flush(),{modelDefaultChanged:r}}function g9(e,t,n,r){return{...e?{requestedModel:e}:{},...t&&n?{defaultModel:{provider:t,modelId:n}}:{},...r?{thinkingLevel:r}:{}}}function m9(e){if(e===void 0)return;return e.length===0?[]:void 0}function y9(e,t){return{...e.model?{model:e.model}:{},...e.thinkingLevel?{thinkingLevel:e.thinkingLevel}:{},...e.scopedModels.length>0?{scopedModels:e.scopedModels}:{},...t!==void 0?{tools:t}:{}}}function b9(e,t){return{...e?{model:e}:{},...t?{thinkingLevel:t}:{}}}function x9(e,t,n){return{...e?{model:{provider:e.provider,modelId:e.id}}:{},thinkingLevel:t,supportsThinking:n}}var Cg=ze("rpc-start"),v9=60000;async function Rr(e,t,n,r={}){let{toolNames:i,initialModel:o,thinkingLevel:s}=r,a=Xt(),c=t_(),u=n_(),d=a.get(e);if(d?.isAlive())return{session:d,realSessionId:e};let f=c.get(e);if(f){let v=Date.now()-(u.get(e)??0);if(v<v9)return f;Cg(`stale lock sid=${e} age=${Math.round(v/1000)}s — restarting fresh`),c.delete(e),u.delete(e)}let p;if(t)p=S_.open(t,void 0);else{if(!n)throw Error("cwd is required for a new session");p=S_.create(n,void 0)}let h=p.getCwd(),g=i_(h),b=performance.now(),x=(v)=>Cg(`sid=${e} ${v} +${Math.round(performance.now()-b)}ms`);x("cold start begin");let y=(async()=>{h9();let v=p9();await ug(h,v);let m=m9(i),w=ho(h,v),D=[d9(),l9({}),f9()],T=r.fixtureExtensionPaths??hl(e);x("creating services");let _=await u9({cwd:h,agentDir:v,...w?{resourceLoaderReloadOptions:w}:{},resourceLoaderOptions:{extensionFactories:D,...T.length>0?{additionalExtensionPaths:T}:{}}}),A=await cl(_.modelRuntime,_.settingsManager.getEnabledModels()),S=_.settingsManager.getDefaultProvider(),M=_.settingsManager.getDefaultModel(),C=p.getBranch().some((F)=>F.type==="message")?{scopedModels:[...A.scopedModels]}:ul(A,g9(o,S,M,s));x("services ready — spawning agent session");let{session:B}=await c9({services:_,sessionManager:p,...y9(C,m)});if((await E_(_.settingsManager,b9(o,s),x9(B.model,B.thinkingLevel,B.supportsThinking()))).modelDefaultChanged)Ce();if(i&&i.length>0)B.setActiveToolsByName(wl(B,i));let H=new El(B);if(i?.length===0)H.setForceEmptySystemPrompt(!0);H.start();let{sessionId:E,sessionFile:R}=B;if(R)jt(E,R);let k=a.get(E);if(k&&k!==H)throw Cg(`sid=${e} duplicate settle — destroying late instance`),H.destroy(),Error(`session ${e} already registered by a newer instance`);return H.onDestroy(()=>a.delete(E)),a.set(E,H),x("cold start done"),H.beginExtensionBinding({forceEmptySystemPrompt:i?.length===0}),{session:H,realSessionId:E}})().finally(()=>{c.delete(e),g()});return c.set(e,y),u.set(e,Date.now()),y.catch(()=>{}),y}var w9=5000,_9=60,T_=60000,Sl=new Map,Tl=new Set,Ag=new Map,va=new Map;function D9(){let e=Zn().preferences.gitAutoFetchIntervalSec;return typeof e==="number"&&Number.isFinite(e)?e:_9}function E9(e){let t=Ag.get(e);if(t)return t;let n=Gh();Ag.set(e,n.promise);let r;return(async()=>{try{let i=await Promise.race([(async()=>{let o=await tg(e);if(!o.ok)return{ok:!1,error:o.error};let s=await ol(e);return{ok:!0,snapshot:{ahead:s.ahead,behind:s.behind,updatedAt:Date.now()}}})(),new Promise((o,s)=>{r=setTimeout(()=>s(Error(`git fetch timeout after ${T_/1000}s`)),T_),r.unref?.()})]);n.resolve(i)}catch(i){n.resolve({ok:!1,error:i instanceof Error?i.message:String(i)})}finally{if(r)clearTimeout(r);Ag.delete(e)}})(),n.promise}async function C_(e){let t=new Map;for(let n of e){let r=null;try{r=await Ut(n)}catch{r=null}if(!r)continue;let i=t.get(r);if(i)i.push(n);else t.set(r,[n])}return t}async function A_(e,t){await Promise.all(Array.from(e,async([n,r])=>{let i=await E9(n);if(!i.ok){console.warn(`[git-autofetch] fetch failed for ${n}: ${i.error}`);return}for(let o of r)Sl.set(_t(o),i.snapshot);va.set(n,t)}))}function S9(e){let t=new Set(e);for(let n of[...Tl])if(!e.includes(n))Tl.delete(n);for(let n of[...Sl.keys()])if(!t.has(n))Sl.delete(n)}function T9(e){for(let t of[...va.keys()])if(!e.has(t))va.delete(t)}async function C9(e,t){let n=e.filter((i)=>!Tl.has(i));if(n.length===0)return;let r=await C_(n);await A_(r,t);for(let i of n)Tl.add(i)}async function A9(e,t,n){let r=new Map;for(let[i,o]of e){let s=va.get(i)??0;if(t-s<n*1000)continue;r.set(i,o)}if(r.size===0)return;await A_(r,t)}async function k9(e=Date.now()){let t=gg();if(S9(t),t.length===0){va.clear();return}let n=D9(),r=await C_(t);if(T9(r),n<=0){await C9(t,e);return}await A9(r,e,n)}function k_(e){return Sl.get(_t(e))??null}function U_(){setInterval(()=>{k9()},w9).unref()}import{isIP as R_}from"node:net";function F_(e){return(e.startsWith("[")&&e.endsWith("]")?e.slice(1,-1):e).toLowerCase().replace(/\.$/,"")}function P_(e){if(!e||/[\s/@\\]/.test(e))return null;try{let t=new URL(`http://${e}`);if(t.username||t.password||t.pathname!=="/"||t.search||t.hash)return null;return F_(t.hostname)}catch{return null}}function U9(e){let t=e?.trim();if(!t)return null;return R_(t)?F_(t):P_(t)}function R9(e){return e==="localhost"||e.endsWith(".localhost")}function O_(){return[process.env.PI_WEB_HOSTNAME,...process.env.PI_WEB_ALLOWED_HOSTS?.split(",")??[]].filter((e)=>Boolean(e?.trim()))}function I_(e){try{return new URL(e).origin}catch{return null}}function F9(e){let t=new URL(e.url),n=e.headers.get("host");return n?I_(`${t.protocol}//${n}`):null}function P9(e){if(e.method!=="GET"||e.headers.get("sec-fetch-mode")!=="navigate"||e.headers.get("sec-fetch-dest")!=="document"||e.headers.get("sec-fetch-user")!=="?1")return!1;try{return/^\/api\/sessions\/[^/]+\/export$/.test(new URL(e.url).pathname)}catch{return!1}}function kg(e,t=O_()){let n=e.headers.get("host"),r=n?P_(n):null;if(!r)return!1;if(R9(r)||R_(r))return!0;return t.some((i)=>U9(i)===r)}function O9(e){let t=e.headers.get("origin");if(e.headers.get("sec-fetch-site")==="cross-site")return!1;if(!t)return!0;let r=F9(e);return r!==null&&I_(t)===r}function I9(e){return e.headers.has("origin")||e.headers.has("sec-fetch-site")}function Pt(e,t=O_()){if(!kg(e,t))return!1;if(P9(e))return!0;return!I9(e)||O9(e)}function Fr(e){let t=e.headers.get("content-type")?.split(";",1)[0]?.trim().toLowerCase();return t==="application/json"||Boolean(t?.startsWith("application/")&&t.endsWith("+json"))}import{createHash as M9,timingSafeEqual as N9}from"node:crypto";var B9="pi";function M_(e){return M9("sha256").update(e,"utf8").digest()}function N_(e,t){return N9(M_(e),M_(t))}function wa(e=process.env.PI_WEB_PASSWORD){return typeof e==="string"&&e.length>0}function Cl(e,t=process.env.PI_WEB_PASSWORD){if(!wa(t)||!e)return!1;let n=/^Basic\s+(\S+)$/i.exec(e);if(!n)return!1;let r;try{let u=Buffer.from(n[1],"base64");if(u.toString("base64")!==n[1])return!1;r=new TextDecoder("utf-8",{fatal:!0}).decode(u)}catch{return!1}let i=r.indexOf(":");if(i===-1)return!1;let o=r.slice(0,i),s=r.slice(i+1),a=N_(o,B9),c=N_(s,t);return a&&c}var B_=ze("mount"),L9=["GET","POST","PUT","PATCH","DELETE"];function Y(e,t,n){let r=t.split("/").filter(Boolean),i=[],o=new Map;for(let a of r){let c=a.match(/^\[\.\.\.(.+)\]$/),u=a.match(/^\[(.+)\]$/);if(c)i.push(`:${c[1]}{.+}`),o.set(c[1],{hono:c[1],catchAll:!0});else if(u)i.push(`:${u[1]}`),o.set(u[1],{hono:u[1],catchAll:!1});else i.push(a)}let s=`/${i.join("/")}`;for(let a of L9){let c=n[a];if(typeof c!=="function")continue;let u=c;e.on(a,s,async(d)=>{let f=performance.now();B_(`${a} ${d.req.path}`,"received");let p={};for(let[g,{hono:b,catchAll:x}]of o)if(x){let y=d.req.param(b)??"";p[g]=y===""?[]:y.split("/")}else p[g]=d.req.param(b)??"";let h=await u(d.req.raw,{params:Promise.resolve(p)});return B_(`${a} ${d.req.path}`,`${h.status} ${Math.round(performance.now()-f)}ms done`),h})}}var Fg={};Z(Fg,{GET:()=>X9});import{tmpdir as z9}from"node:os";import{Readable as V9}from"node:stream";import{constants as Ug}from"node:fs";import{lstat as W9,open as j9}from"node:fs/promises";import{basename as q9,dirname as $9,resolve as L_}from"node:path";var Al=5242880;function W_(e,t){let n=L_(e);if($9(n)!==L_(t))return null;if(!/^pi-bash-[A-Za-z0-9_-]+\.log$/.test(q9(n)))return null;return n}async function Rg(e){if(!(await W9(e)).isFile())throw Error("Bash output path is not a regular file");let n=typeof Ug.O_NOFOLLOW==="number"?Ug.O_NOFOLLOW:0,r=await j9(e,Ug.O_RDONLY|n);try{let i=await r.stat();if(!i.isFile())throw Error("Bash output path is not a regular file");return{handle:r,fileInfo:i}}catch(i){throw await r.close(),i}}async function j_(e,t=Al){let{handle:n,fileInfo:r}=await Rg(e);try{if(r.size>t)return{tooLarge:!0,size:r.size};let i=Buffer.alloc(r.size),o=0;while(o<i.length){let s=await n.read(i,o,i.length-o,o);if(s.bytesRead===0)break;o+=s.bytesRead}return{tooLarge:!1,content:i.subarray(0,o).toString("utf8"),size:o}}finally{await n.close()}}var H9=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function q_(e){return!!e&&H9.test(e)}function $_(e,t){return t.some((n)=>n.type==="message"&&n.message.role==="bashExecution"&&n.message.fullOutputPath===e)}async function H_(e,t){if(!q_(t))return!1;try{let n=await De(t);if(!n)return!1;return $_(e,bl(n))}catch{return!1}}async function X9(e,{params:t}){let{id:n}=await t,r=null,i=!1;try{let s=new URL(e.url);r=s.searchParams.get("path"),i=s.searchParams.get("download")==="1"}catch{return Response.json({error:"invalid url"},{status:400})}if(!r)return Response.json({error:"path required"},{status:400});let o=W_(r,z9());if(!o)return Response.json({error:"invalid path"},{status:400});if(!await H_(o,n))return Response.json({error:"forbidden"},{status:403});try{if(i){let{handle:a}=await Rg(o),c=V9.toWeb(a.createReadStream());return new Response(c,{headers:{"Content-Type":"text/plain; charset=utf-8","Content-Disposition":'attachment; filename="bash-output.log"',"Cache-Control":"no-store"}})}let s=await j_(o);if(s.tooLarge)return Response.json({error:`Full output is too large to display (limit ${Al} bytes)`,data:{size:s.size,maxBytes:Al}},{status:413});return Response.json({success:!0,data:{output:s.content}})}catch{return Response.json({error:"full output unavailable"},{status:404})}}var Pg={};Z(Pg,{GET:()=>K9});async function K9(e,{params:t}){let{id:n}=await t,r=Le(n);if(!r?.isAlive())return Response.json({error:"Session not found or not alive"},{status:404});return Response.json({success:!0,data:r.diagnostics()})}var jg={};Z(jg,{GET:()=>P6,POST:()=>F6,sendWithDeferredModelSwitch:()=>Wg,setFakeBusySession:()=>To});import{resolve as Z9}from"node:path";var Y9="piE2eFixtureDir",J9="piE2eFixtureDir";function Og(e){return Z9(process.cwd(),e)}function Q9(e){if(!e)return{};let t={};for(let n of e.split(";")){let r=n.indexOf("=");if(r===-1)continue;t[n.slice(0,r).trim()]=n.slice(r+1).trim()}return t}function ae(e){let t=Q9(e.headers.get("cookie"))[Y9];if(t)try{return Og(decodeURIComponent(t))}catch{return Og(t)}let n=new URL(e.url).searchParams.get(J9);return n?Og(n):void 0}Eo();import{mkdir as c6,readFile as u6,rename as l6,writeFile as d6}from"node:fs/promises";import{dirname as f6,join as p6}from"node:path";import{getAgentDir as h6}from"@earendil-works/pi-coding-agent";var g6=[{name:"readonly",tools:["read","grep","find","ls"],description:{en:"Read-only tools (read/grep/find/ls)","zh-CN":"仅只读工具(read/grep/find/ls)"}},{name:"full",tools:["bash","read","edit","write","grep","find","ls"],description:{en:"All built-in tools enabled (except codemode)","zh-CN":"内置工具全开(codemode除外)"}},{name:"codemode",tools:["codemode"],description:{en:"Codemode only","zh-CN":"仅激活codemode"}}],m6=new Set(["off","default"]),z_=g6;function V_(){return p6(h6(),"pi-web","tool-presets.json")}function Ig(e){if(!Array.isArray(e))return null;let t=new Set,n=[];for(let r of e){if(typeof r!=="object"||r===null)return null;let{name:i,tools:o,description:s}=r;if(typeof i!=="string"||i.trim().length===0)return null;let a=i.trim();if(t.has(a))return null;if(!Array.isArray(o)||o.some((u)=>typeof u!=="string"||u.trim()===""))return null;t.add(a);let c=y6(s);n.push({name:a,tools:o.map((u)=>u.trim()),...c?{description:c}:{}})}return n}function y6(e){if(typeof e==="string"){let r=e.trim();return r.length>0?r:void 0}if(typeof e!=="object"||e===null||Array.isArray(e))return;let t=e,n={};for(let r of["en","zh-CN"]){let i=t[r];if(typeof i==="string"&&i.trim().length>0)n[r]=i.trim()}if(Object.keys(n).length===0)return;return n}function X_(e){return e.filter((t)=>!m6.has(t.name))}async function So(){try{let e=await u6(V_(),"utf8"),t=Ig(JSON.parse(e));return t?{presets:X_(t),exists:!0}:{presets:z_,exists:!1}}catch{return{presets:z_,exists:!1}}}async function K_(e){let t=V_();await c6(f6(t),{recursive:!0});let n=`${t}.tmp`;await d6(n,`${JSON.stringify(X_(e),null,2)}
285
285
  `,"utf8"),await l6(n,t)}var b6=".pi-web.json";function Ul(e){return e+b6}function Rl(e){let t=Dt(Ul(e));return t?.version===1?t:null}function Z_(e,t){un(Ul(e),t)}async function Fl(e,t){let r=Rl(t)?.toolPreset;if(!r||typeof r!=="string")return;try{let{presets:i}=await So(),o=i.find((s)=>s.name===r);if(!o)return;await e.send({type:"set_tools",toolNames:[...o.tools]})}catch(i){console.warn(`[sidecar] replay toolPreset failed for ${t}:`,i)}}import{randomUUID as E6}from"node:crypto";import{existsSync as S6}from"node:fs";import{readdirSync as w6}from"node:fs";import{homedir as eD}from"node:os";import Pl from"node:path";import{realpathSync as Y_}from"node:fs";import Mg from"node:path";var x6=/^[a-zA-Z]:[\\/]/;function J_(e){return x6.test(e)||e.startsWith("\\\\")||e.startsWith("//")}function v6(e,t){for(let n of t){let r=J_(e)||J_(n),i=r?Mg.win32:Mg,o=r?"\\":Mg.sep,s=i.resolve(e),a=i.resolve(n),c=r?s.toLowerCase():s,u=r?a.toLowerCase():a,d=u.endsWith(o)?u:u+o;if(c===u||c.startsWith(d))return!0}return!1}function Q_(e,t){let n;try{n=Y_(e)}catch{return!1}let r=new Set;for(let i of t)try{r.add(Y_(i))}catch{}return v6(n,r)}var _6=5000,D6=/^[a-zA-Z]:[\\/]/;function Ie(e){return D6.test(e)||e.startsWith("\\\\")||e.startsWith("//")}async function oe(){let e=Date.now(),t=globalThis.__piAllowedRootsCache;if(t&&t.expiresAt>e)return t.roots;let n=await Ur(),r=new Set;for(let i of n){if(i.cwd)r.add(Ke(i.cwd));if(i.projectRoot)r.add(Ke(i.projectRoot))}try{for(let i of w6(eD()))if(/^pi-cwd-\d{8}$/.test(i))r.add(Ke(Pl.join(eD(),i)))}catch{}for(let i of ig())r.add(i);return globalThis.__piAllowedRootsCache={roots:r,expiresAt:e+_6},r}function Re(e,t){for(let n of t){let r=Ie(e)||Ie(n),i=r?Pl.win32:Pl,o=r?"\\":Pl.sep,s=i.resolve(e),a=i.resolve(n),c=r?s.toLowerCase():s,u=r?a.toLowerCase():a,d=u.endsWith(o)?u:u+o;if(c===u||c.startsWith(d))return!0}return!1}function ce(e,t){return Q_(e,t)}var T6=new Set(["off","minimal","low","medium","high","xhigh","max"]);function C6(e){if(e===void 0)return;if(typeof e==="string"&&T6.has(e))return e;throw Error(`Invalid thinking level: ${String(e)}`)}function Ng(e){if(!e||e.id==="unknown"||e.provider==="unknown")return null;return{provider:e.provider,modelId:e.id}}async function A6(e,t,{provider:n,modelId:r,thinkingLevel:i}){if(n&&r)try{await e.send({type:"set_model",provider:n,modelId:r})}catch(o){console.error(`[api] set_model on reused session ${t} failed:`,o)}if(i)try{await e.send({type:"set_thinking_level",level:i})}catch(o){console.error(`[api] set_thinking_level on reused session ${t} failed:`,o)}}async function k6(e,t){let n=pg(e);if(!n)return;let r=Le(n);if(!r?.isAlive())return;await A6(r,n,t);let i=await r.send({type:"get_state"});return Response.json({success:!0,sessionId:n,data:null,model:Ng(i.model),thinkingLevel:i.thinkingLevel})}function U6(e,{provider:t,modelId:n,thinkingLevel:r},i){return{...i?{toolNames:i}:{},...t&&n?{initialModel:{provider:t,modelId:n}}:{},...r?{thinkingLevel:r}:{},...e?{fixtureExtensionPaths:ha(e)}:{}}}async function R6(e,{provider:t,modelId:n},r,i){if(t&&n&&r!=="ensure_session"&&(i.model?.provider!==t||i.model?.id!==n))await e.send({type:"set_model",provider:t,modelId:n})}async function tD(e,t){let{cwd:n,...r}=e;if(!n||typeof n!=="string")return Response.json({error:"cwd is required"},{status:400});if(!S6(n))return Response.json({error:`Directory does not exist: ${n}`},{status:400});let{provider:i,modelId:o,toolNames:s,thinkingLevel:a,...c}=r;if(i&&!o||!i&&o)throw Error("provider and modelId must be provided together");let u={provider:i,modelId:o,thinkingLevel:C6(a)};if(c.type==="ensure_session"){let b=await k6(n,u);if(b)return b}let d=`__new__${E6()}`,{session:f,realSessionId:p}=await Rr(d,"",n,U6(t,u,s));wt(n),qe();let h=await f.send({type:"get_state"});if(await R6(f,u,c.type,h),c.type==="ensure_session")return Response.json({success:!0,sessionId:p,data:null,model:Ng(h.model),thinkingLevel:h.thinkingLevel});let g=await f.send(c);return Response.json({success:!0,sessionId:p,data:g,model:Ng(h.model),thinkingLevel:h.thinkingLevel})}var _a=ze("oom-debug"),Bg=ze("oom-stress");async function nD(e){_a("oomDebugHandler called",`session ${e}`);let t=30,n=Le(e);if(!n?.isAlive())return _a("session not alive or not found",`session ${e}`),Response.json({error:"Session not found"},{status:404});return(async()=>{To(e,!0);try{let r=(o)=>{n.emit(o)};r({type:"agent_start"}),await new Promise((o)=>setTimeout(o,t*1000));let i=`✅ OOM debug: fake response after ${t}s wait.`;r({type:"message_start",message:{role:"assistant",content:[]}}),r({type:"message_update",message:{role:"assistant",content:[{type:"text",text:i}]}}),r({type:"message_end",message:{role:"assistant",content:[{type:"text",text:i}]}}),r({type:"agent_end"})}finally{To(e,!1)}})(),Response.json({success:!0,data:null})}async function rD(e){Bg("oomStressHandler called",`session ${e}`);let t=5,n=Le(e);if(!n?.isAlive())return Response.json({error:"Session not found"},{status:404});return(async()=>{To(e,!0);try{let r=(d)=>{n.emit(d)};r({type:"agent_start"}),await new Promise((d)=>setTimeout(d,t*1000)),r({type:"message_start",message:{role:"assistant",content:[]}}),r({type:"message_update",assistantMessageEvent:{type:"thinking_start",contentIndex:0}});let i=400,o=500,s=80,a=[];for(let d=0;d<i;d++){let f=`Thinking step ${d+1}: ${"x".repeat(o-40)}
286
286
  `;a.push(f),r({type:"message_update",assistantMessageEvent:{type:"thinking_delta",contentIndex:0,delta:f}}),await new Promise((p)=>setTimeout(p,s))}let c=a.join("");r({type:"message_update",assistantMessageEvent:{type:"thinking_end",contentIndex:0,content:c}});let u=`
287
287
  Done. Streamed ${i} thinking chunks (${c.length} chars).`;r({type:"message_update",assistantMessageEvent:{type:"text_start",contentIndex:1}}),r({type:"message_update",assistantMessageEvent:{type:"text_delta",contentIndex:1,delta:u}}),r({type:"message_update",assistantMessageEvent:{type:"text_end",contentIndex:1,content:u}}),r({type:"message_end",message:{role:"assistant",content:[{type:"thinking",thinking:c},{type:"text",text:u}]}}),r({type:"agent_end"})}finally{To(e,!1)}})(),Response.json({success:!0,data:null})}var Lg=new Set;function To(e,t){if(t)Lg.add(e);else Lg.delete(e)}async function F6(e,{params:t}){let{id:n}=await t;try{let r=await e.json();if(_a(`POST /api/agent/${n}`,`type=${r.type} message=${JSON.stringify(r.message)} keys=${Object.keys(r).join(",")}`),r.type==="prompt"&&r.message==="oom debug")return _a("INTERCEPTED","routing to oomDebugHandler"),nD(n);if(r.type==="prompt"&&r.message==="oom stress")return Bg("INTERCEPTED","routing to oomStressHandler"),rD(n);if(n==="new")return tD(r,ae(e));let i=Le(n);if(i?.isAlive()){let c=await Wg(i,r);return Response.json({success:!0,data:c})}let o=await De(n);if(!o)return Response.json({error:"Session not found"},{status:404});let{session:s}=await Rr(n,o,void 0);await Fl(s,o);let a=await Wg(s,r);return Response.json({success:!0,data:a})}catch(r){console.error(`[api] ${new URL(e.url).pathname} failed:`,r);let i=r instanceof _o?400:500;return Response.json({error:String(r)},{status:i})}}async function Wg(e,t){let{provider:n,modelId:r,...i}=t;if(t.type==="prompt"&&n&&r){let o=await e.send({type:"get_state"});if(o.model?.provider!==n||o.model?.id!==r)await e.send({type:"set_model",provider:n,modelId:r});return e.send(i)}return e.send(t)}async function P6(e,{params:t}){let{id:n}=await t;try{let r=Le(n);if(!r?.isAlive())return Response.json({running:!1});if(Lg.has(n))return Response.json({running:!0,state:{isStreaming:!0,isPromptRunning:!0}});let i=await r.send({type:"get_state"});return Response.json({running:!0,state:i})}catch(r){return console.error(`[api] ${new URL(e.url).pathname} failed:`,r),Response.json({error:String(r)},{status:500})}}var qg={};Z(qg,{GET:()=>O6});async function O6(){return Response.json(wo(),{headers:{"Cache-Control":"no-store"}})}import Hg from"node:fs";var I6=new Set(["select","confirm","input","editor"]),M6=new Set(["agent_settled","prompt_done","prompt_error","extension_error"]);function Et(e,t,n){try{e.ws.send(JSON.stringify({ch:t,data:n}))}catch{}}function iD(e,t,n){if(!e)return;for(let r of e){if(t==="global"){let i=n,o=i.type==="extension_ui_request"&&I6.has(i.method),s=typeof i.type==="string"&&M6.has(i.type);if(o)Qe("ui-chain",`3 ws broadcast ${String(i.method)}`,`id=${String(i.id).slice(0,8)} sid=${String(i.sessionId).slice(0,8)} conns=${e.size}`);if(!s){let a=i.sessionId;if(a&&!r.seenSessions.has(a))continue}Et(r,t,n);continue}if(t==="running"){Et(r,t,{type:"running",...$g(n,r.seenSessions)});continue}Et(r,t,n)}}function $g(e,t){let n=e.runningSessionIds.filter((s)=>t.has(s)),r={},i={},o={};for(let s of n){if(e.phases[s]!==void 0)r[s]=e.phases[s];if(e.phaseSince[s]!==void 0)i[s]=e.phaseSince[s];if(e.busySince[s]!==void 0)o[s]=e.busySince[s]}return{runningSessionIds:n,phases:r,phaseSince:i,busySince:o}}var N6=new Set(["turn_start","turn_end"]);function oD(e){if(N6.has(e.type))return null;if(e.type==="message_update"){let n=e.assistantMessageEvent;if(!n||typeof n.type!=="string")return e;return{type:"message_update",assistantMessageEvent:B6(n)}}if(e.type==="message_start"||e.type==="message_end")return e;if(e.type==="agent_end")return{type:"agent_end"};return e}function B6(e){let t={type:e.type};if(typeof e.delta==="string")t.delta=e.delta;if(typeof e.contentIndex==="number")t.contentIndex=e.contentIndex;if(e.type==="toolcall_end"&&e.toolCall&&typeof e.toolCall==="object")t.toolCall=e.toolCall;if(e.type==="toolcall_start"&&typeof e.contentIndex==="number"){let r=e.partial?.content?.[e.contentIndex];if(r&&r.type==="toolCall"&&typeof r.name==="string")t.toolCall={type:"toolCall",toolCallId:typeof r.id==="string"?r.id:"",toolName:r.name}}return t}var Ol=ze("ws-agent");var Dn=new Map,Il=null,Ml=null;function Nl(e,t){iD(Dn.get(e),e,t)}function aD(){let e=new Set;for(let t of Dn.get("global")??[])for(let n of t.seenSessions)e.add(n);return[...e]}function L6(e){if(e==="global"&&!Il)Il=xg((t,n)=>{let r=oD(n);if(r)Nl("global",{sessionId:t,...r})});if(e==="running"&&!Ml)Ml=bg((t)=>Nl("running",t))}function W6(e){if(e==="global"&&Dn.get("global")?.size===0)Il?.(),Il=null;if(e==="running"&&Dn.get("running")?.size===0)Ml?.(),Ml=null}function sD(e,t){let n=Dn.get(t);if(!n)n=new Set,Dn.set(t,n);if(n.add(e),!e.channels.has(t))e.channels.set(t,{kind:"passive"});L6(t)}function Ea(e,t){let n=e.channels.get(t);if(!n)return;if(e.channels.delete(t),n.kind==="agent")n.unsubscribe();if(n.kind==="watch")try{n.watcher.close()}catch{}if(Dn.get(t)?.delete(e),n.kind==="passive")W6(t);if(n.kind==="agent"){let r=Dn.get(t);if(!r||r.size===0){let i=t.slice(6);q6(i)}}}var j6=30000,Da=new Map;function q6(e){let t=Da.get(e);if(t)clearTimeout(t);Da.set(e,setTimeout(()=>{Da.delete(e),Le(e)?.cancelPendingUiResponses()},j6))}async function $6(e,t){let n=`agent:${t}`,r=performance.now();if(e.seenSessions.add(t),e.channels.has(n))return;let i=Le(t);if(Ol(`sub sid=${t} ${i?.isAlive()?"alive":"cold start"}`),!i?.isAlive()){let a=await De(t);if(!a){Ol(`sub sid=${t} not_found`),Et(e,n,{type:"not_found",sessionId:t});return}try{({session:i}=await Rr(t,a,void 0)),await Fl(i,a)}catch(c){Ol(`sub sid=${t} start_failed +${Math.round(performance.now()-r)}ms: ${String(c)}`),Et(e,n,{type:"start_failed",sessionId:t,message:String(c)});return}}e.channels.set(n,{kind:"agent",unsubscribe:()=>{}}),Dn.get(n)?.add(e);let o=Da.get(t);if(o)clearTimeout(o),Da.delete(t);Et(e,n,{type:"connected",sessionId:t}),Ol(`sub sid=${t} connected +${Math.round(performance.now()-r)}ms`);let s=i.getPendingUiRequests();for(let a of s)Et(e,"global",{...a,sessionId:t})}function H6(e,t){let n=t,r=`watch:${n}`,i;try{i=Hg.statSync(n)}catch{Et(e,r,{event:"error",message:"Not found"});return}if(!i.isFile()){Et(e,r,{event:"error",message:"Not a file"});return}let o,s=i.mtimeMs,a=i.size;try{o=Hg.watch(n,()=>{try{let c=Hg.statSync(n);if(c.mtimeMs===s&&c.size===a)return;s=c.mtimeMs,a=c.size,Et(e,r,{event:"change",mtime:c.mtime.toISOString(),size:c.size})}catch{Et(e,r,{event:"change",mtime:new Date().toISOString(),size:0})}})}catch{Et(e,r,{event:"error",message:"Failed to watch file"});return}o.on("error",()=>{Ea(e,r)}),e.channels.set(r,{kind:"watch",watcher:o}),Dn.get(r)?.add(e),Et(e,r,{event:"connected",filePath:n})}async function cD(e,t){switch(t.ch){case"global":{sD(e,"global");return}case"running":{sD(e,"running"),Et(e,"running",{type:"running",...$g(wo(),e.seenSessions)});return}case"agent":{let n=typeof t.sessionId==="string"?t.sessionId:"";if(n)await $6(e,n);return}case"watch":{if(typeof t.filePath==="string"&&t.filePath)H6(e,t.filePath);return}default:return}}function uD(e){if(!Pt(e))return!1;let t=process.env.PI_WEB_PASSWORD;if(wa(t)&&!Cl(e.headers.get("authorization"),t))return!1;return!0}var Gg=ze("api-ws"),zg=null;function Vg(e){zg=e((t)=>{if(!uD(t.req.raw))return{onOpen:(o,s)=>s.close(1008,"untrusted")};let n={ws:null,channels:new Map,seenSessions:new Set},r=null,i=!1;return{onOpen:(o,s)=>{n.ws=s,Gg("connected",`${n.channels.size} channels restored`),s.send(JSON.stringify({type:"connected"})),r=setInterval(()=>{try{if(i){Gg("pong-timeout","no pong within one cycle — closing (half-open suspected)"),s.close();return}s.send(JSON.stringify({type:"ping"})),i=!0}catch{}},30000)},onMessage:async(o)=>{if(typeof o.data!=="string")return;let s;try{s=JSON.parse(o.data)}catch{return}if(s.type==="pong")i=!1;else if(s.type==="sub")await cD(n,s);else if(s.type==="unsub"&&typeof s.ch==="string")Ea(n,s.ch);else if(s.type==="unseen"&&typeof s.sessionId==="string"){let a=s.sessionId;n.seenSessions.delete(a);let c=`agent:${a}`;if(n.channels.has(c))Ea(n,c)}},onClose:()=>{if(Gg("closed",`${n.channels.size} channels dropped`),r)clearInterval(r);i=!1;for(let o of[...n.channels.keys()])Ea(n,o)}}})}function lD(e){e.get("/api/ws",(t,n)=>zg?zg(t,n):n())}var Kg={};Z(Kg,{POST:()=>Y6});import{randomUUID as G6}from"node:crypto";import{mkdir as z6,writeFile as V6}from"node:fs/promises";import{tmpdir as X6}from"node:os";import Xg from"node:path";var dD=209715200;function K6(){return Xg.join(X6(),"pi-web-attachments")}function Z6(e){let t=Xg.basename(e??"");return Array.from(t).filter((i)=>i.charCodeAt(0)>31&&!'<>:"/\\|?*'.includes(i)).join("").replace(/^\.+/,"").slice(0,120)||"attachment"}async function Y6(e){let t=Z6(new URL(e.url).searchParams.get("name")),n=Buffer.from(await e.arrayBuffer());if(n.byteLength===0)return Response.json({error:"empty body"},{status:400});if(n.byteLength>dD)return Response.json({error:`attachment exceeds ${dD/1048576}MB`},{status:413});let r=K6();await z6(r,{recursive:!0});let i=Xg.join(r,`${G6()}-${t}`);return await V6(i,n),Response.json({path:i,name:t,size:n.byteLength})}var bm={};Z(bm,{GET:()=>hj});import{ModelRuntime as pj}from"@earendil-works/pi-coding-agent";var J6={"openai-codex":"ChatGPT Plus/Pro","github-copilot":"GitHub Copilot"};function fD(e){let t=new Set,n=[];for(let r of e){if(t.has(r.id))continue;t.add(r.id),n.push(r)}return n}function pD(e){let t=[];for(let n of fD(e)){if(!n.hasApiKeyLogin)continue;if(n.isCustom)continue;let r=n.status.configured&&n.credentialType!=="oauth";t.push({id:n.id,displayName:n.name,configured:r,...r&&n.status.source?{source:n.status.source}:{},modelCount:n.modelCount,modelIds:n.modelIds,reasoningModelIds:n.reasoningModelIds,inputModelIds:n.inputModelIds,supportsOAuth:n.hasOAuth,...n.baseUrl?{baseUrl:n.baseUrl}:{},...n.api?{api:n.api}:{}})}return t}function hD(e){let t=[];for(let n of fD(e)){if(!n.hasOAuth)continue;t.push({id:n.id,name:J6[n.id]??n.oauthName??n.name,usesCallbackServer:!1,loggedIn:n.credentialType==="oauth",modelIds:n.modelIds,reasoningModelIds:n.reasoningModelIds,inputModelIds:n.inputModelIds,supportsApiKey:n.hasApiKeyLogin,...n.baseUrl?{baseUrl:n.baseUrl}:{},...n.api?{api:n.api}:{}})}return t}async function Bl(e,t){let n=e.getModels(),r=new Map;for(let s of n){if(!s.reasoning)continue;let a=r.get(s.provider);if(a)a.push(s.id);else r.set(s.provider,[s.id])}let i=new Map;for(let s of n){let a=(Array.isArray(s.input)?s.input:[]).filter((u)=>u!=="text");if(a.length===0)continue;let c=i.get(s.provider);if(!c)c={},i.set(s.provider,c);for(let u of a){let d=c[u]??[];d.push(s.id),c[u]=d}}let o=new Map;try{for(let s of await e.listCredentials())if(s.type==="api_key"||s.type==="oauth")o.set(s.providerId,s.type)}catch{}return e.getProviders().map((s)=>({id:s.id,name:s.name,isCustom:t?.has(s.id)??!1,...typeof s.baseUrl==="string"&&s.baseUrl.trim()?{baseUrl:s.baseUrl}:{},...n.find((a)=>a.provider===s.id)?.api?{api:n.find((a)=>a.provider===s.id).api}:{},hasApiKeyLogin:Boolean(s.auth.apiKey?.login),hasOAuth:Boolean(s.auth.oauth),...s.auth.oauth?.name?{oauthName:s.auth.oauth.name}:{},status:e.getProviderAuthStatus(s.id),...o.has(s.id)?{credentialType:o.get(s.id)}:{},modelCount:n.filter((a)=>a.provider===s.id).length,modelIds:n.filter((a)=>a.provider===s.id).map((a)=>a.id),reasoningModelIds:r.get(s.id)??[],inputModelIds:i.get(s.id)??{}}))}Co();import{mkdir as Q6,readdir as eW,readFile as bD,stat as xD,writeFile as tW}from"node:fs/promises";import{join as Ta}from"node:path";import{getAgentDir as vD}from"@earendil-works/pi-coding-agent";var Ll=Ta(vD(),"pi-web","provider");function Mr(e){return/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(e)}async function Di(e){if(!Mr(e))return[];let t=Ta(Ll,e,"models.json");try{if(!(await xD(t)).isFile())return[]}catch{return[]}try{let n=await bD(t,"utf-8");return Ir(JSON.parse(n))}catch{return[]}}async function Wl(e){let t=[];for(let n of await Di(e)){let r=Or(n);if(r)t.push(r)}return t}function _i(e){let t=typeof e==="string"?Number(e):e;return typeof t==="number"&&Number.isFinite(t)?t:void 0}function nW(e,t){return{contextWindow:_i(e.context_length)??_i(e.context_window)??_i(t?.context_length)??_i(e.max_model_len)??0,maxTokens:_i(e.max_completion_tokens)??_i(e.max_output_tokens)??_i(t?.max_completion_tokens)??0}}function rW(e,t){if(Array.isArray(e.supported_parameters))return e.supported_parameters.some((n)=>n==="reasoning"||n==="thinking");if(e.reasoning!==void 0)return e.reasoning===!0;return t?.reasoning===!0}function iW(e,t){let n=Array.isArray(e.input_modalities)?e.input_modalities:Array.isArray(t?.input_modalities)?t.input_modalities:["text"],r=new Set(["text","image","audio","video","pdf"]),i=n.filter((o)=>typeof o==="string"&&r.has(o));if(i.length===0)i.push("text");return i}function Yg(e,t){let n=Or(t);if(!n)return null;let r=typeof t==="object"&&t!==null?t:{},i=r.top_provider,o=r.architecture,s=r.pricing,a=r.capabilities,{contextWindow:c,maxTokens:u}=nW(r,i),d=rW(r,a),f=iW(r,o),p=(g)=>{let b=typeof g==="string"?Number(g):g;if(typeof b!=="number"||!Number.isFinite(b))return 0;return Math.abs(b)<1?b*1e6:b},h=s&&typeof s==="object"?{input:p(s.prompt),output:p(s.completion),cacheRead:p(s.input_cache_read),cacheWrite:p(s.input_cache_write)}:{input:0,output:0,cacheRead:0,cacheWrite:0};return{id:n.id,name:n.name??n.id,provider:e,api:"openai-completions",baseUrl:"",reasoning:d,input:f,cost:h,contextWindow:c,maxTokens:u}}function oW(e){if(!e||typeof e!=="object")return new Set;let t=new Set;for(let[n,r]of Object.entries(e)){let i=r&&typeof r==="object"?r:void 0;if(i&&Array.isArray(i.models))t.add(n.toLowerCase())}return t}async function Ao(){try{let e=JSON.parse(await bD(Ta(vD(),"models.json"),"utf-8"));return oW(e.providers)}catch{return new Set}}async function ko(){try{if(!(await xD(Ll)).isDirectory())return[]}catch{return[]}return(await eW(Ll,{withFileTypes:!0})).filter((t)=>t.isDirectory()).map((t)=>t.name)}var sW=["off","minimal","low","medium","high","xhigh","max"];async function jl(e,t){if(!Mr(e))return;let n=Ta(Ll,e);await Q6(n,{recursive:!0}),await tW(Ta(n,"models.json"),`${JSON.stringify(t,null,2)}