@easbot/agent 0.2.40 → 0.2.41

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 (89) hide show
  1. package/dist/chunks/{acp-SMAI7EJF.mjs → acp-D5UOHKRU.mjs} +2 -2
  2. package/dist/chunks/adapter-loader-SHO4LOSU.mjs +1 -0
  3. package/dist/chunks/{agent-SXVN3QRB.mjs → agent-CYRU65IN.mjs} +1 -1
  4. package/dist/chunks/{agent-BS6BU766.mjs → agent-JHX64CI6.mjs} +1 -1
  5. package/dist/chunks/app-S6QDTGNJ.mjs +1 -0
  6. package/dist/chunks/bootstrap-FHSG4M5N.mjs +1 -0
  7. package/dist/chunks/{build-program-U2HDARWA.mjs → build-program-YDOM5ROT.mjs} +1 -1
  8. package/dist/chunks/bus-7GPWVWOA.mjs +1 -0
  9. package/dist/chunks/{chunk-ZFGVQIO5.mjs → chunk-75IQNF4I.mjs} +1 -1
  10. package/dist/chunks/{chunk-XQXI2ZHB.mjs → chunk-D4GDS5UI.mjs} +1 -1
  11. package/dist/chunks/{chunk-VLDQ4LGX.mjs → chunk-EM2QJ5NQ.mjs} +2 -2
  12. package/dist/chunks/{chunk-YGFGAD5H.mjs → chunk-FWVB6X4X.mjs} +13 -13
  13. package/dist/chunks/{chunk-JII5HRIF.mjs → chunk-GRDTQW6K.mjs} +1 -1
  14. package/dist/chunks/{chunk-IXO5FAWI.mjs → chunk-IEQ4VD66.mjs} +1 -1
  15. package/dist/chunks/{chunk-O2JOXYKG.mjs → chunk-KTMZPMCI.mjs} +1 -1
  16. package/dist/chunks/{chunk-3Q4UCILK.mjs → chunk-R4BPTF6V.mjs} +1 -1
  17. package/dist/chunks/{chunk-DJYON7M6.mjs → chunk-SB4J2R54.mjs} +1 -1
  18. package/dist/chunks/{chunk-H45MZAM6.mjs → chunk-UBCLKZWP.mjs} +1 -1
  19. package/dist/chunks/{chunk-ZG2HQDXQ.mjs → chunk-X7KLQIAQ.mjs} +1 -1
  20. package/dist/chunks/{command-B7POR3LZ.mjs → command-CPT2YSIR.mjs} +1 -1
  21. package/dist/chunks/compaction-JR5FOLBX.mjs +1 -0
  22. package/dist/chunks/{config-JY4V5KGI.mjs → config-O5EE574O.mjs} +1 -1
  23. package/dist/chunks/{debug-LXNXB4VY.mjs → debug-BWJVMW7Q.mjs} +3 -3
  24. package/dist/chunks/file-Q52INNX3.mjs +1 -0
  25. package/dist/chunks/{gateway-HTBKKYKV.mjs → gateway-XSXBPTB7.mjs} +2 -2
  26. package/dist/chunks/{generate-JBIFOTPV.mjs → generate-4UO6UCUB.mjs} +1 -1
  27. package/dist/chunks/{github-XXJJ62IF.mjs → github-XIWTIRCK.mjs} +1 -1
  28. package/dist/chunks/global-XQYOBWZR.mjs +1 -0
  29. package/dist/chunks/{import-37R7O4NM.mjs → import-K45ZW3NR.mjs} +1 -1
  30. package/dist/chunks/installation-55Z2PXMV.mjs +1 -0
  31. package/dist/chunks/instance-S5GBRS3K.mjs +1 -0
  32. package/dist/chunks/loader-JAKTXQ6M.mjs +1 -0
  33. package/dist/chunks/loader-S2BSLSAZ.mjs +1 -0
  34. package/dist/chunks/lsp-4VYPJGAN.mjs +1 -0
  35. package/dist/chunks/{mcp-X4FA7X53.mjs → mcp-JBHKJN6X.mjs} +1 -1
  36. package/dist/chunks/mcp-ZGGTG6YT.mjs +1 -0
  37. package/dist/chunks/models-TI5SNTLO.mjs +1 -0
  38. package/dist/chunks/{pr-WCMJT7VY.mjs → pr-MCLQ6KQO.mjs} +1 -1
  39. package/dist/chunks/preferences-LWCCEUB3.mjs +1 -0
  40. package/dist/chunks/project-OEBG6JHE.mjs +1 -0
  41. package/dist/chunks/prompt-JSZCNKQD.mjs +1 -0
  42. package/dist/chunks/provider-TU4AF2GP.mjs +1 -0
  43. package/dist/chunks/registry-NITFPORZ.mjs +1 -0
  44. package/dist/chunks/revert-PDDRJVNK.mjs +1 -0
  45. package/dist/chunks/ripgrep-7VVA7THG.mjs +1 -0
  46. package/dist/chunks/{run-PN7YADL6.mjs → run-EGRUZXP2.mjs} +1 -1
  47. package/dist/chunks/scheduler-VUQ33E5B.mjs +1 -0
  48. package/dist/chunks/server-3RDX4X3L.mjs +1 -0
  49. package/dist/chunks/session-GQAYKB6Q.mjs +1 -0
  50. package/dist/chunks/session-TXC5Z4O2.mjs +1 -0
  51. package/dist/chunks/{session-FVNB4WZV.mjs → session-VCIKEQYZ.mjs} +1 -1
  52. package/dist/chunks/share-RUV4SIRB.mjs +1 -0
  53. package/dist/chunks/snapshot-PXRGQ6JR.mjs +1 -0
  54. package/dist/chunks/storage-3T5H5KBY.mjs +1 -0
  55. package/dist/chunks/tui-5BQORL3N.mjs +1 -0
  56. package/dist/chunks/{tui-ABXWVS6I.mjs → tui-ZMS6CJQ7.mjs} +1 -1
  57. package/dist/chunks/{types-BFRURHUE.mjs → types-RWQQETDC.mjs} +1 -1
  58. package/dist/chunks/{update-SO2ZPDG3.mjs → update-KDCCJIPI.mjs} +1 -1
  59. package/dist/cli.mjs +2 -2
  60. package/package.json +13 -13
  61. package/dist/chunks/adapter-loader-X3GZRT3I.mjs +0 -1
  62. package/dist/chunks/app-4GCI3HZT.mjs +0 -1
  63. package/dist/chunks/bootstrap-SVDRDCAU.mjs +0 -1
  64. package/dist/chunks/bus-SGXNL3LP.mjs +0 -1
  65. package/dist/chunks/compaction-4CV7NS2Z.mjs +0 -1
  66. package/dist/chunks/file-Q7BJ3BEC.mjs +0 -1
  67. package/dist/chunks/global-FDT3NNWD.mjs +0 -1
  68. package/dist/chunks/installation-WZEFRTPQ.mjs +0 -1
  69. package/dist/chunks/instance-AK3F7UK2.mjs +0 -1
  70. package/dist/chunks/loader-2FMNUQDJ.mjs +0 -1
  71. package/dist/chunks/loader-JWZHDUVM.mjs +0 -1
  72. package/dist/chunks/lsp-N672BWEP.mjs +0 -1
  73. package/dist/chunks/mcp-JIUYQ7QS.mjs +0 -1
  74. package/dist/chunks/models-OEA6XF6K.mjs +0 -1
  75. package/dist/chunks/preferences-EUHOPNM3.mjs +0 -1
  76. package/dist/chunks/project-WTLNG2LH.mjs +0 -1
  77. package/dist/chunks/prompt-6OETS3YU.mjs +0 -1
  78. package/dist/chunks/provider-DC7XQTFP.mjs +0 -1
  79. package/dist/chunks/registry-ZXV6XNKB.mjs +0 -1
  80. package/dist/chunks/revert-PEILY52K.mjs +0 -1
  81. package/dist/chunks/ripgrep-4XTDDATX.mjs +0 -1
  82. package/dist/chunks/scheduler-2U6D3A47.mjs +0 -1
  83. package/dist/chunks/server-23WY43I2.mjs +0 -1
  84. package/dist/chunks/session-2ZGF74EQ.mjs +0 -1
  85. package/dist/chunks/session-CQ3VGE4U.mjs +0 -1
  86. package/dist/chunks/share-V2US2NJE.mjs +0 -1
  87. package/dist/chunks/snapshot-3CGXXTES.mjs +0 -1
  88. package/dist/chunks/storage-GQ3NTV5N.mjs +0 -1
  89. package/dist/chunks/tui-Y47JRG6G.mjs +0 -1
@@ -1,10 +1,10 @@
1
- import {a as a$2}from'./chunk-LAHYVX5K.mjs';import {a as a$3}from'./chunk-3Q4UCILK.mjs';import'./chunk-VII7JKGB.mjs';import {g,e as e$1,d,k,i as i$1,b as b$2,h,c,a as a$4}from'./chunk-M3K32WJV.mjs';import {Ha,xa,Oa,qb,la,ma,za,Aa,pb,Q as Q$1}from'./chunk-YGFGAD5H.mjs';import'./chunk-CCRIJZBK.mjs';import'./chunk-XQXI2ZHB.mjs';import'./chunk-ZFGVQIO5.mjs';import'./chunk-ZBRXNYEM.mjs';import'./chunk-H45MZAM6.mjs';import {e,f}from'./chunk-2RSIOAZV.mjs';import'./chunk-AAJAKVQY.mjs';import {i}from'./chunk-UNBJ6Y7L.mjs';import {b}from'./chunk-ZG2HQDXQ.mjs';import'./chunk-O2JOXYKG.mjs';import'./chunk-CJTCCLW4.mjs';import'./chunk-JII5HRIF.mjs';import {a}from'./chunk-LFYBZHOI.mjs';import {a as a$1}from'./chunk-DJYON7M6.mjs';import {b as b$1}from'./chunk-X6ISXWBN.mjs';import'commander';import {parseModelId,PKG,createServer,getProxyConfig}from'@easbot/utils';import {applyPatch}from'diff';import Ke from'path';import {z as z$1}from'zod';import {WebSocketServer}from'ws';import {pathToFileURL}from'url';import {ndJsonStream,AgentSideConnection,RequestError}from'@agentclientprotocol/sdk';var w=a.create({service:"acp-event-bridge"}),Qe={Info:z$1.object({id:z$1.string(),content:z$1.string(),status:z$1.enum(["in_progress","pending","completed","cancelled"]),priority:z$1.enum(["high","medium","low"])})},j=class{constructor(e,t){b$1(this,"sdk");b$1(this,"connection");b$1(this,"abortController",null);b$1(this,"started",false);b$1(this,"permissionQueues",new Map);b$1(this,"permissionOptions",[{optionId:"once",kind:"allow_once",name:"Allow once"},{optionId:"always",kind:"allow_always",name:"Always allow"},{optionId:"reject",kind:"reject_once",name:"Reject"}]);b$1(this,"acpService");this.sdk=e,this.connection=t;}setService(e){this.acpService=e;}async start(){if(this.started){w.warn("AcpEventBridge already started");return}this.started=true,this.abortController=new AbortController,w.info("starting ACP event bridge"),this.runEventSubscription().catch(e=>{this.abortController?.signal.aborted||w.error("event subscription failed",{error:e});});}async stop(){this.started&&(w.info("stopping ACP event bridge"),this.started=false,this.abortController?.abort(),this.abortController=null,this.permissionQueues.clear(),w.info("ACP event bridge stopped"));}async runEventSubscription(){for(;;){if(this.abortController?.signal.aborted)return;let e=await this.sdk.global.event({signal:this.abortController?.signal??void 0});for await(let t of e.stream){if(this.abortController?.signal.aborted)return;let n=t?.payload;n&&await this.handleEvent(n).catch(s=>{w.error("failed to handle event",{error:s,type:n.type});});}}}async handleEvent(e){switch(e.type){case "permission.asked":await this.handlePermissionAsked(e.properties);break;case "question.asked":await this.handleQuestionAsked(e.properties);break;case "message.part.updated":await this.handleMessagePartUpdated(e.properties);break;case "session.status":await this.handleSessionStatus(e.properties);break;case "session.deleted":await this.handleSessionDeleted(e.properties);break}}async handleSessionStatus(e){let{sessionId:t,status:n}=e;if(w.debug("Handling session status event in ACP bridge",{sessionId:t,status:n}),!this.connection){w.warn("No connection available to publish session status");return}try{await this.connection.extNotification("session.status",{sessionId:t,status:n}),w.debug("Session status published via extNotification",{sessionId:t,status:n});}catch(s){w.error("Failed to publish session status via extNotification",{sessionId:t,status:n,error:s});}}async handleSessionDeleted(e){let{sessionId:t}=e;if(w.info("Handling session deleted event in ACP bridge",{sessionId:t}),!this.connection){w.warn("No connection available to notify session deletion");return}try{await this.connection.sessionUpdate({sessionId:t,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:"[System] Session has been deleted by the backend. This session is no longer available."}}}),w.debug("Session deletion notified to client",{sessionId:t});}catch(n){w.error("Failed to notify session deletion to client",{sessionId:t,error:n});}}async handlePermissionAsked(e){let{id:t,sessionId:n,permission:s,tool:o,metadata:r}=e,a=(this.permissionQueues.get(n)??Promise.resolve()).then(async()=>{let g=r?.directory??"",P=s==="external_directory"&&r?.tool?me(r.tool):me(s),I=s==="external_directory"&&r?.tool?ge(r.tool,r):ge(s,r),p=await this.connection.requestPermission({sessionId:n,toolCall:{callId:o?.callId??t,status:"pending",title:s,rawInput:r,kind:P,locations:(I??[]).map(u=>u.path)},options:this.permissionOptions}).catch(async u=>{w.error("failed to request permission from ACP",{error:u,permissionId:t,sessionId:n}),await this.sdk.permission.reply({requestId:t,reply:"reject",directory:g});});if(p){if(p.outcome.outcome!=="selected"){await this.sdk.permission.reply({requestId:t,reply:"reject",directory:g});return}if(p.outcome.optionId!=="reject"&&s==="edit"){let u=r?.filepath??r?.filePath??"",d=r?.diff??"";if(u&&d){let c=PKG.file(u),f=await c.exists()?await c.text():"",m=Je(f,d);m&&await this.connection.extMethod("client.writeTextFile",{sessionId:n,path:u,content:m});}}await this.sdk.permission.reply({requestId:t,reply:p.outcome.optionId,directory:g});}}).catch(g=>{w.error("failed to handle permission",{error:g,permissionId:t});}).finally(()=>{this.permissionQueues.get(n)===a&&this.permissionQueues.delete(n);});this.permissionQueues.set(n,a);}async handleQuestionAsked(e){let{id:t,sessionId:n,questions:s}=e,o="";w.debug("Handling question asked in ACP bridge",{requestId:t,sessionId:n,questionCount:s.length});try{let r=await this.connection.extMethod("client.requestQuestion",{sessionId:n,requestId:t,questions:s});if(!r){w.warn("Question request returned no result"),await this.sdk.question.reject({requestId:t,directory:o});return}w.debug("Question request completed",{requestId:t,outcome:r.outcome,answerCount:r.answers?.length??0}),r.outcome==="selected"&&r.answers&&r.answers.length>0?(await this.sdk.question.reply({requestId:t,answers:r.answers.map(l=>[l.answer]),directory:o}),w.debug("Question answers submitted",{requestId:t})):(await this.sdk.question.reject({requestId:t,directory:o}),w.debug("Question rejected",{requestId:t}));}catch(r){w.error("Failed to handle question via extMethod",{error:r instanceof Error?r.message:String(r),requestId:t,sessionId:n}),await this.sdk.question.reject({requestId:t,directory:o});}}async handleMessagePartUpdated(e){let{part:t}=e;w.debug("message part updated",{event:e});let n=await this.sdk.session.message({sessionId:t.sessionId,messageId:t.messageId},{throwOnError:true}).then(s=>s.data).catch(s=>{s instanceof Error&&s.name==="NotFoundError"?w.debug("message not found, skipping",{sessionId:t.sessionId,messageId:t.messageId}):w.error("unexpected error when fetching message",{error:s});});!n||n.info.role!=="assistant"||(t.type==="tool"?await this.handleToolPart(t):t.type==="text"?await this.handleTextPart(t,e.delta):t.type==="reasoning"?await this.handleReasoningPart(t,e.delta):t.type==="step-finish"&&await this.handleStepFinishPart(t));}async handleToolPart(e){let{sessionId:t,callId:n,tool:s,state:o,messageId:r}=e,l=me(s);switch(o.status){case "pending":await this.connection.sessionUpdate({sessionId:t,update:{sessionUpdate:"tool_call",toolCallId:n,title:s,kind:l,status:"pending",locations:[],rawInput:{},_meta:{messageId:r}}}).catch(a=>{w.error("failed to send tool pending to ACP",{error:a});});return;case "running":await this.connection.sessionUpdate({sessionId:t,update:{sessionUpdate:"tool_call_update",toolCallId:n,status:"in_progress",kind:l,title:s,locations:ge(s,o.input),rawInput:o.input,_meta:{messageId:r}}}).catch(a=>{w.error("failed to send tool in_progress to ACP",{error:a});});return;case "completed":{let a=[{type:"content",content:{type:"text",text:o.output}}];if(l==="edit"){let g=o.input,P=g.filePath??g.filepath??"",I=g.oldString??"",p=g.newString??g.content??"";a.push({type:"diff",path:P,oldText:I,newText:p});}if(s==="todo"){let g=Qe.Info.array().safeParse(JSON.parse(o.output));g.success&&o.input.operation==="write"&&await this.connection.sessionUpdate({sessionId:t,update:{sessionUpdate:"plan",entries:g.data.map(P=>{let I=P.status==="cancelled"?"completed":P.status;return {priority:P.priority,status:I,content:P.content}})}}).catch(P=>{w.error("failed to send session update for todo",{error:P});});}await this.connection.sessionUpdate({sessionId:t,update:{sessionUpdate:"tool_call_update",toolCallId:n,status:"completed",kind:l,content:a,title:o.title??s,rawInput:o.input,rawOutput:{output:o.output,metadata:o.metadata},_meta:{messageId:r}}}).catch(g=>{w.error("failed to send tool completed to ACP",{error:g});});return}case "error":await this.connection.sessionUpdate({sessionId:t,update:{sessionUpdate:"tool_call_update",toolCallId:n,status:"failed",kind:l,title:s,rawInput:o.input,content:[{type:"content",content:{type:"text",text:o.error}}],rawOutput:{error:o.error},_meta:{messageId:r}}}).catch(a=>{w.error("failed to send tool error to ACP",{error:a});});return}}async handleTextPart(e,t){if(e.ignored===true||!("time"in e&&e.time&&typeof e.time=="object"&&"end"in e.time&&!!e.time.end))return;let s=e.text;s&&await this.connection.sessionUpdate({sessionId:e.sessionId,update:{sessionUpdate:"agent_message_chunk",messageId:e.messageId,content:{type:"text",text:s}}}).catch(o=>{w.error("failed to send text to ACP",{error:o});});}async handleReasoningPart(e,t){if(!("time"in e&&e.time&&typeof e.time=="object"&&"end"in e.time&&!!e.time.end))return;let s=e.text;s&&await this.connection.sessionUpdate({sessionId:e.sessionId,update:{sessionUpdate:"agent_thought_chunk",messageId:e.messageId,content:{type:"text",text:s}}}).catch(o=>{w.error("failed to send reasoning to ACP",{error:o});});}async handleStepFinishPart(e){let{sessionId:t,messageId:n,tokens:s}=e;if(!this.connection)return;let o=(s?.input??0)+(s?.reasoning??0),r=await this.getContextLimit(t,n);await this.connection.sessionUpdate({sessionId:t,update:{sessionUpdate:"usage_update",used:o,size:r,_meta:{messageId:n}}}).catch(l=>{w.error("failed to send usage_update for step-finish",{error:l});});}async getContextLimit(e,t){try{let s=(await this.sdk.session.messages({sessionId:e}).then(o=>o.data).catch(()=>{}))?.find(o=>o.info.id===t);if(s){let o=s.info;if(o.providerId&&o.modelId)return (await this.sdk.config.providers({}).then(g=>g.data?.providers??[]).catch(()=>[])).find(g=>g.id===o.providerId)?.models[o.modelId]?.limit?.context??2e5}}catch(n){w.debug("failed to get context limit",{error:n});}return 2e5}};function me(i){switch(i.toLowerCase()){case "bash":return "execute";case "webfetch":return "fetch";case "edit":case "patch":case "write":return "edit";case "grep":case "glob":case "lsp":case "context7_resolve_library_id":case "context7_get_library_docs":return "search";case "list":case "read":return "read";default:return "other"}}function ge(i,e){if(!e)return [];switch(i.toLowerCase()){case "read":case "edit":case "write":case "patch":case "lsp":{let n=e.filePath??e.filepath??"";return n?[{path:n}]:[]}case "glob":case "grep":return e.path?[{path:e.path}]:[];case "list":return e.path?[{path:e.path}]:[];case "bash":case "shell":{let n=e.cwd??"";return n?[{path:n}]:[]}case "external_directory":{let n=e.tool?.toLowerCase(),s=e.filepath??"",o=e.realPath??"",r=e.parentDir??"";if(n==="read"||n==="edit"||n==="write"||n==="patch"||n==="lsp")return o?[{path:o}]:s?[{path:s}]:[];if(n==="list"||n==="glob"||n==="grep"){let a=o??s,g=a?Ke.posix.dirname(a):r;return g?[{path:g}]:[]}let l=o??s;return l?[{path:l}]:r?[{path:r}]:[]}default:return []}}function Je(i,e){try{let t=applyPatch(i,e);return t===!1?null:t}catch{return null}}var z={HTTP:"http",STDIO:"stdio",WEBSOCKET:"websocket"},Q=class i extends Error{constructor(t,n=[]){super(t);b$1(this,"conflictingModes");this.name="ServiceModeConflictError",this.conflictingModes=n,Object.setPrototypeOf(this,i.prototype);}getConflictingModesDescription(){return this.conflictingModes.length===0?"No modes specified":this.conflictingModes.join(", ")}};function Ye(i){let e=[];return i.channel&&e.push(i.channel),e}function Me(i){let e=Ye(i);if(e.length===0)throw new Q("No service mode specified. Please specify exactly one of: http, stdio, websocket",[]);if(e.length>1)throw new Q(`Multiple service modes specified: ${e.join(", ")}. Please specify exactly one mode.`,e)}var Oe={channel:z.WEBSOCKET,port:3e3,hostname:"localhost",timeout:3e4,historyScope:"session",historyWindowSize:10,degradePolicy:"streaming_first",sessionExpireMs:300*1e3};var U=a.create({service:"acp-server-config"}),F="EAS_";function Ne(i){return !(!i||i.trim()===""||i.startsWith("-")||i.endsWith("-")||!/^[a-zA-Z0-9]([a-zA-Z0-9.-]*[a-zA-Z0-9])?$/.test(i))}function qe(i){return Number.isInteger(i)&&i>=1&&i<=65535}function Ue(i){return Number.isFinite(i)&&i>0}function Le(i){let e={...Oe,...i};try{Me(e);}catch(t){throw t instanceof Q&&U.error("Invalid service mode configuration",{message:t.message,conflictingModes:t.conflictingModes}),t}if(e.port!==void 0&&!qe(e.port)){let t=new Error(`Invalid port number: ${e.port}. Must be between 1 and 65535`);throw U.error("Invalid port configuration",{port:e.port}),t}if(e.hostname!==void 0&&!Ne(e.hostname)){let t=new Error(`Invalid hostname: ${e.hostname}`);throw U.error("Invalid hostname configuration",{hostname:e.hostname}),t}if(e.timeout!==void 0&&!Ue(e.timeout)){let t=new Error(`Invalid timeout: ${e.timeout}. Must be a positive number`);throw U.error("Invalid timeout configuration",{timeout:e.timeout}),t}if(e.channel===z.STDIO&&e.stdio&&(!e.stdio.command||e.stdio.command.trim()==="")){let t=new Error("STDIO command is required");throw U.error("Invalid stdio configuration",{command:e.stdio.command}),t}return U.debug("ACPServer config loaded",{channel:e.channel,port:e.port,hostname:e.hostname}),e}function Ze(){let i={},e=process.env[`${F}ACP_CHANNEL`];if(e){let a=e.toLowerCase();Object.values(z).includes(a)?i.channel=a:U.warn("Invalid EAS_ACP_CHANNEL environment variable",{value:e});}let t=process.env[`${F}ACP_PORT`];if(t){let a=parseInt(t,10);qe(a)?i.port=a:U.warn("Invalid EAS_ACP_PORT environment variable",{value:t});}let n=process.env[`${F}ACP_HOSTNAME`];n&&(Ne(n)?i.hostname=n:U.warn("Invalid EAS_ACP_HOSTNAME environment variable",{value:n}));let s=process.env[`${F}ACP_TIMEOUT`];if(s){let a=parseInt(s,10);Ue(a)?i.timeout=a:U.warn("Invalid EAS_ACP_TIMEOUT environment variable",{value:s});}let o=process.env[`${F}ACP_HISTORY_SCOPE`];o&&(["session","peer","global"].includes(o)?i.historyScope=o:U.warn("Invalid EAS_ACP_HISTORY_SCOPE environment variable",{value:o}));let r=process.env[`${F}ACP_HISTORY_WINDOW_SIZE`];if(r){let a=parseInt(r,10);Number.isInteger(a)&&a>0?i.historyWindowSize=a:U.warn("Invalid EAS_ACP_HISTORY_WINDOW_SIZE environment variable",{value:r});}let l=process.env[`${F}ACP_DEGRADE_POLICY`];return l&&(["polling_only","streaming_first"].includes(l)?i.degradePolicy=l:U.warn("Invalid EAS_ACP_DEGRADE_POLICY environment variable",{value:l})),U.debug("Config loaded from environment",{config:i}),i}function ze(i){let e=Ze(),t={...e,...i};return U.info("ACPServer config with environment overrides",{original:{channel:e.channel,port:e.port,hostname:e.hostname},overrides:i,final:{channel:t.channel,port:t.port,hostname:t.hostname}}),t}var he=a.create({service:"acp-rpc-handler"}),Xe={INTERNAL_ERROR:-32603},J=class{constructor(e){b$1(this,"agent");this.agent=e;}async handle(e){let{method:t,params:n,id:s}=e;he.debug("AcpRpcHandler.handle",{method:t,hasParams:!!n,id:s});try{let o;switch(t){case "initialize":o=await this.handleInitialize(n);break;case "authenticate":o=await this.handleAuthenticate(n);break;case "session.new":case "newSession":o=await this.handleNewSession(n);break;case "session.load":case "loadSession":o=await this.handleLoadSession(n);break;case "session.close":case "closeSession":o=await this.handleCloseSession(n);break;case "session.prompt":case "prompt":o=await this.handlePrompt(n);break;case "session.cancel":case "cancel":await this.handleCancel(n),o={success:!0};break;case "session.list":case "listSessions":o=await this.handleListSessions(n);break;case "session.fork":case "forkSession":o=await this.handleForkSession(n);break;case "session.resume":case "resumeSession":o=await this.handleResumeSession(n);break;case "session.setMode":case "setSessionMode":o=await this.handleSetSessionMode(n);break;case "session.setConfigOption":case "setSessionConfigOption":o=await this.handleSetSessionConfigOption(n);break;case "status":o=this.handleStatus();break;case "subscriptions":o=this.handleSubscriptions();break;default:throw he.warn("Unknown method",{method:t}),new Error(`Method not found: ${t}`)}return {jsonrpc:"2.0",id:s,result:o}}catch(o){return he.error("AcpRpcHandler error",{method:t,error:o instanceof Error?o.message:String(o)}),{jsonrpc:"2.0",id:s,error:{code:Xe.INTERNAL_ERROR,message:o instanceof Error?o.message:String(o)}}}}async handleInitialize(e){return this.agent.initialize(e)}async handleAuthenticate(e){return this.agent.authenticate(e)}async handleNewSession(e){return this.agent.newSession(e)}async handleLoadSession(e){return this.agent.loadSession(e)}async handleCloseSession(e){return this.agent.closeSession(e)}async handlePrompt(e){return this.agent.prompt(e)}async handleCancel(e){return this.agent.cancel(e)}async handleListSessions(e){return this.agent.listSessions(e)}async handleForkSession(e){return this.agent.unstable_forkSession(e)}async handleResumeSession(e){return this.agent.resumeSession(e)}async handleSetSessionMode(e){return this.agent.setSessionMode(e)}async handleSetSessionConfigOption(e){return this.agent.setSessionConfigOption(e)}handleStatus(){return {status:"running",channel:"http",timestamp:Date.now(),uptime:process.uptime()}}handleSubscriptions(){return {sessions:[]}}};var oe=a.create({service:"server-agent-side-connection"}),Y=class{constructor(){b$1(this,"broadcaster",null);b$1(this,"sessionIds",new Set);}setBroadcaster(e){this.broadcaster=e;}addSession(e){this.sessionIds.add(e);}removeSession(e){this.sessionIds.delete(e);}clearSessions(){this.sessionIds.clear();}getSessions(){return Array.from(this.sessionIds)}async sessionUpdate(e){let{sessionId:t,update:n}=e;oe.debug("ServerAgentSideConnection.sessionUpdate",{sessionId:t,updateType:n.sessionUpdate}),this.broadcaster&&this.broadcaster.broadcast(t,e);}async requestPermission(e){return oe.debug("ServerAgentSideConnection.requestPermission",{sessionId:e.sessionId}),{outcome:{outcome:"cancelled"}}}async extMethod(e,t){return oe.debug("ServerAgentSideConnection.extMethod",{method:e}),{}}async extNotification(e,t){if(oe.debug("ServerAgentSideConnection.extNotification",{method:e,params:t}),this.broadcaster&&t){let n=t.sessionId||t.sessionId;if(n&&this.sessionIds.has(n)){let s={sessionId:n,update:{sessionUpdate:e,...t}};this.broadcaster.broadcast(n,s);}}}};var H=a.create({service:"http-server"});async function De(i,e){if(H.info("Starting HTTP server",{port:e.port,hostname:e.hostname}),e.channel!==z.HTTP)throw new Error("Invalid channel type for HTTP server");let t=new Map,n=new Map,s=new Y,o={broadcast:(c,f)=>{P(c,f);}};s.setBroadcaster(o);let r=new J(i),l=i.getSDK();if(!l)throw new Error("SDK not configured");let a=new j(l,s);a.setService(i),await a.start();let g=(c,f)=>{let m=t.get(c);if(!m)return false;try{return m.controller.enqueue(new TextEncoder().encode(f)),m.lastHeartbeat=Date.now(),!0}catch(h){return H.warn("Failed to push to SSE connection",{connectionId:c,error:h instanceof Error?h.message:String(h)}),false}},P=(c,f)=>{let m=n.get(c);if(!m||m.size===0)return;let S={jsonrpc:"2.0",method:f.update.sessionUpdate,params:{sessionId:c,...f.update,timestamp:Date.now()}},v=`data: ${JSON.stringify(S)}
1
+ import {a as a$2}from'./chunk-LAHYVX5K.mjs';import {a as a$3}from'./chunk-R4BPTF6V.mjs';import'./chunk-VII7JKGB.mjs';import {g,e as e$1,d,k,i as i$1,b as b$2,h,c,a as a$4}from'./chunk-M3K32WJV.mjs';import {Ha,xa,Oa,qb,la,ma,za,Aa,pb,Q as Q$1}from'./chunk-FWVB6X4X.mjs';import'./chunk-CCRIJZBK.mjs';import'./chunk-D4GDS5UI.mjs';import'./chunk-75IQNF4I.mjs';import'./chunk-ZBRXNYEM.mjs';import'./chunk-UBCLKZWP.mjs';import {e,f}from'./chunk-2RSIOAZV.mjs';import'./chunk-AAJAKVQY.mjs';import {i}from'./chunk-UNBJ6Y7L.mjs';import {b}from'./chunk-X7KLQIAQ.mjs';import'./chunk-KTMZPMCI.mjs';import'./chunk-CJTCCLW4.mjs';import'./chunk-GRDTQW6K.mjs';import {a}from'./chunk-LFYBZHOI.mjs';import {a as a$1}from'./chunk-SB4J2R54.mjs';import {b as b$1}from'./chunk-X6ISXWBN.mjs';import'commander';import {parseModelId,PKG,createServer,getProxyConfig}from'@easbot/utils';import {applyPatch}from'diff';import Ke from'path';import {z as z$1}from'zod';import {WebSocketServer}from'ws';import {pathToFileURL}from'url';import {ndJsonStream,AgentSideConnection,RequestError}from'@agentclientprotocol/sdk';var w=a.create({service:"acp-event-bridge"}),Qe={Info:z$1.object({id:z$1.string(),content:z$1.string(),status:z$1.enum(["in_progress","pending","completed","cancelled"]),priority:z$1.enum(["high","medium","low"])})},j=class{constructor(e,t){b$1(this,"sdk");b$1(this,"connection");b$1(this,"abortController",null);b$1(this,"started",false);b$1(this,"permissionQueues",new Map);b$1(this,"permissionOptions",[{optionId:"once",kind:"allow_once",name:"Allow once"},{optionId:"always",kind:"allow_always",name:"Always allow"},{optionId:"reject",kind:"reject_once",name:"Reject"}]);b$1(this,"acpService");this.sdk=e,this.connection=t;}setService(e){this.acpService=e;}async start(){if(this.started){w.warn("AcpEventBridge already started");return}this.started=true,this.abortController=new AbortController,w.info("starting ACP event bridge"),this.runEventSubscription().catch(e=>{this.abortController?.signal.aborted||w.error("event subscription failed",{error:e});});}async stop(){this.started&&(w.info("stopping ACP event bridge"),this.started=false,this.abortController?.abort(),this.abortController=null,this.permissionQueues.clear(),w.info("ACP event bridge stopped"));}async runEventSubscription(){for(;;){if(this.abortController?.signal.aborted)return;let e=await this.sdk.global.event({signal:this.abortController?.signal??void 0});for await(let t of e.stream){if(this.abortController?.signal.aborted)return;let n=t?.payload;n&&await this.handleEvent(n).catch(s=>{w.error("failed to handle event",{error:s,type:n.type});});}}}async handleEvent(e){switch(e.type){case "permission.asked":await this.handlePermissionAsked(e.properties);break;case "question.asked":await this.handleQuestionAsked(e.properties);break;case "message.part.updated":await this.handleMessagePartUpdated(e.properties);break;case "session.status":await this.handleSessionStatus(e.properties);break;case "session.deleted":await this.handleSessionDeleted(e.properties);break}}async handleSessionStatus(e){let{sessionId:t,status:n}=e;if(w.debug("Handling session status event in ACP bridge",{sessionId:t,status:n}),!this.connection){w.warn("No connection available to publish session status");return}try{await this.connection.extNotification("session.status",{sessionId:t,status:n}),w.debug("Session status published via extNotification",{sessionId:t,status:n});}catch(s){w.error("Failed to publish session status via extNotification",{sessionId:t,status:n,error:s});}}async handleSessionDeleted(e){let{sessionId:t}=e;if(w.info("Handling session deleted event in ACP bridge",{sessionId:t}),!this.connection){w.warn("No connection available to notify session deletion");return}try{await this.connection.sessionUpdate({sessionId:t,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:"[System] Session has been deleted by the backend. This session is no longer available."}}}),w.debug("Session deletion notified to client",{sessionId:t});}catch(n){w.error("Failed to notify session deletion to client",{sessionId:t,error:n});}}async handlePermissionAsked(e){let{id:t,sessionId:n,permission:s,tool:o,metadata:r}=e,a=(this.permissionQueues.get(n)??Promise.resolve()).then(async()=>{let g=r?.directory??"",P=s==="external_directory"&&r?.tool?me(r.tool):me(s),I=s==="external_directory"&&r?.tool?ge(r.tool,r):ge(s,r),p=await this.connection.requestPermission({sessionId:n,toolCall:{callId:o?.callId??t,status:"pending",title:s,rawInput:r,kind:P,locations:(I??[]).map(u=>u.path)},options:this.permissionOptions}).catch(async u=>{w.error("failed to request permission from ACP",{error:u,permissionId:t,sessionId:n}),await this.sdk.permission.reply({requestId:t,reply:"reject",directory:g});});if(p){if(p.outcome.outcome!=="selected"){await this.sdk.permission.reply({requestId:t,reply:"reject",directory:g});return}if(p.outcome.optionId!=="reject"&&s==="edit"){let u=r?.filepath??r?.filePath??"",d=r?.diff??"";if(u&&d){let c=PKG.file(u),f=await c.exists()?await c.text():"",m=Je(f,d);m&&await this.connection.extMethod("client.writeTextFile",{sessionId:n,path:u,content:m});}}await this.sdk.permission.reply({requestId:t,reply:p.outcome.optionId,directory:g});}}).catch(g=>{w.error("failed to handle permission",{error:g,permissionId:t});}).finally(()=>{this.permissionQueues.get(n)===a&&this.permissionQueues.delete(n);});this.permissionQueues.set(n,a);}async handleQuestionAsked(e){let{id:t,sessionId:n,questions:s}=e,o="";w.debug("Handling question asked in ACP bridge",{requestId:t,sessionId:n,questionCount:s.length});try{let r=await this.connection.extMethod("client.requestQuestion",{sessionId:n,requestId:t,questions:s});if(!r){w.warn("Question request returned no result"),await this.sdk.question.reject({requestId:t,directory:o});return}w.debug("Question request completed",{requestId:t,outcome:r.outcome,answerCount:r.answers?.length??0}),r.outcome==="selected"&&r.answers&&r.answers.length>0?(await this.sdk.question.reply({requestId:t,answers:r.answers.map(l=>[l.answer]),directory:o}),w.debug("Question answers submitted",{requestId:t})):(await this.sdk.question.reject({requestId:t,directory:o}),w.debug("Question rejected",{requestId:t}));}catch(r){w.error("Failed to handle question via extMethod",{error:r instanceof Error?r.message:String(r),requestId:t,sessionId:n}),await this.sdk.question.reject({requestId:t,directory:o});}}async handleMessagePartUpdated(e){let{part:t}=e;w.debug("message part updated",{event:e});let n=await this.sdk.session.message({sessionId:t.sessionId,messageId:t.messageId},{throwOnError:true}).then(s=>s.data).catch(s=>{s instanceof Error&&s.name==="NotFoundError"?w.debug("message not found, skipping",{sessionId:t.sessionId,messageId:t.messageId}):w.error("unexpected error when fetching message",{error:s});});!n||n.info.role!=="assistant"||(t.type==="tool"?await this.handleToolPart(t):t.type==="text"?await this.handleTextPart(t,e.delta):t.type==="reasoning"?await this.handleReasoningPart(t,e.delta):t.type==="step-finish"&&await this.handleStepFinishPart(t));}async handleToolPart(e){let{sessionId:t,callId:n,tool:s,state:o,messageId:r}=e,l=me(s);switch(o.status){case "pending":await this.connection.sessionUpdate({sessionId:t,update:{sessionUpdate:"tool_call",toolCallId:n,title:s,kind:l,status:"pending",locations:[],rawInput:{},_meta:{messageId:r}}}).catch(a=>{w.error("failed to send tool pending to ACP",{error:a});});return;case "running":await this.connection.sessionUpdate({sessionId:t,update:{sessionUpdate:"tool_call_update",toolCallId:n,status:"in_progress",kind:l,title:s,locations:ge(s,o.input),rawInput:o.input,_meta:{messageId:r}}}).catch(a=>{w.error("failed to send tool in_progress to ACP",{error:a});});return;case "completed":{let a=[{type:"content",content:{type:"text",text:o.output}}];if(l==="edit"){let g=o.input,P=g.filePath??g.filepath??"",I=g.oldString??"",p=g.newString??g.content??"";a.push({type:"diff",path:P,oldText:I,newText:p});}if(s==="todo"){let g=Qe.Info.array().safeParse(JSON.parse(o.output));g.success&&o.input.operation==="write"&&await this.connection.sessionUpdate({sessionId:t,update:{sessionUpdate:"plan",entries:g.data.map(P=>{let I=P.status==="cancelled"?"completed":P.status;return {priority:P.priority,status:I,content:P.content}})}}).catch(P=>{w.error("failed to send session update for todo",{error:P});});}await this.connection.sessionUpdate({sessionId:t,update:{sessionUpdate:"tool_call_update",toolCallId:n,status:"completed",kind:l,content:a,title:o.title??s,rawInput:o.input,rawOutput:{output:o.output,metadata:o.metadata},_meta:{messageId:r}}}).catch(g=>{w.error("failed to send tool completed to ACP",{error:g});});return}case "error":await this.connection.sessionUpdate({sessionId:t,update:{sessionUpdate:"tool_call_update",toolCallId:n,status:"failed",kind:l,title:s,rawInput:o.input,content:[{type:"content",content:{type:"text",text:o.error}}],rawOutput:{error:o.error},_meta:{messageId:r}}}).catch(a=>{w.error("failed to send tool error to ACP",{error:a});});return}}async handleTextPart(e,t){if(e.ignored===true||!("time"in e&&e.time&&typeof e.time=="object"&&"end"in e.time&&!!e.time.end))return;let s=e.text;s&&await this.connection.sessionUpdate({sessionId:e.sessionId,update:{sessionUpdate:"agent_message_chunk",messageId:e.messageId,content:{type:"text",text:s}}}).catch(o=>{w.error("failed to send text to ACP",{error:o});});}async handleReasoningPart(e,t){if(!("time"in e&&e.time&&typeof e.time=="object"&&"end"in e.time&&!!e.time.end))return;let s=e.text;s&&await this.connection.sessionUpdate({sessionId:e.sessionId,update:{sessionUpdate:"agent_thought_chunk",messageId:e.messageId,content:{type:"text",text:s}}}).catch(o=>{w.error("failed to send reasoning to ACP",{error:o});});}async handleStepFinishPart(e){let{sessionId:t,messageId:n,tokens:s}=e;if(!this.connection)return;let o=(s?.input??0)+(s?.reasoning??0),r=await this.getContextLimit(t,n);await this.connection.sessionUpdate({sessionId:t,update:{sessionUpdate:"usage_update",used:o,size:r,_meta:{messageId:n}}}).catch(l=>{w.error("failed to send usage_update for step-finish",{error:l});});}async getContextLimit(e,t){try{let s=(await this.sdk.session.messages({sessionId:e}).then(o=>o.data).catch(()=>{}))?.find(o=>o.info.id===t);if(s){let o=s.info;if(o.providerId&&o.modelId)return (await this.sdk.config.providers({}).then(g=>g.data?.providers??[]).catch(()=>[])).find(g=>g.id===o.providerId)?.models[o.modelId]?.limit?.context??2e5}}catch(n){w.debug("failed to get context limit",{error:n});}return 2e5}};function me(i){switch(i.toLowerCase()){case "bash":return "execute";case "webfetch":return "fetch";case "edit":case "patch":case "write":return "edit";case "grep":case "glob":case "lsp":case "context7_resolve_library_id":case "context7_get_library_docs":return "search";case "list":case "read":return "read";default:return "other"}}function ge(i,e){if(!e)return [];switch(i.toLowerCase()){case "read":case "edit":case "write":case "patch":case "lsp":{let n=e.filePath??e.filepath??"";return n?[{path:n}]:[]}case "glob":case "grep":return e.path?[{path:e.path}]:[];case "list":return e.path?[{path:e.path}]:[];case "bash":case "shell":{let n=e.cwd??"";return n?[{path:n}]:[]}case "external_directory":{let n=e.tool?.toLowerCase(),s=e.filepath??"",o=e.realPath??"",r=e.parentDir??"";if(n==="read"||n==="edit"||n==="write"||n==="patch"||n==="lsp")return o?[{path:o}]:s?[{path:s}]:[];if(n==="list"||n==="glob"||n==="grep"){let a=o??s,g=a?Ke.posix.dirname(a):r;return g?[{path:g}]:[]}let l=o??s;return l?[{path:l}]:r?[{path:r}]:[]}default:return []}}function Je(i,e){try{let t=applyPatch(i,e);return t===!1?null:t}catch{return null}}var z={HTTP:"http",STDIO:"stdio",WEBSOCKET:"websocket"},Q=class i extends Error{constructor(t,n=[]){super(t);b$1(this,"conflictingModes");this.name="ServiceModeConflictError",this.conflictingModes=n,Object.setPrototypeOf(this,i.prototype);}getConflictingModesDescription(){return this.conflictingModes.length===0?"No modes specified":this.conflictingModes.join(", ")}};function Ye(i){let e=[];return i.channel&&e.push(i.channel),e}function Me(i){let e=Ye(i);if(e.length===0)throw new Q("No service mode specified. Please specify exactly one of: http, stdio, websocket",[]);if(e.length>1)throw new Q(`Multiple service modes specified: ${e.join(", ")}. Please specify exactly one mode.`,e)}var Oe={channel:z.WEBSOCKET,port:3e3,hostname:"localhost",timeout:3e4,historyScope:"session",historyWindowSize:10,degradePolicy:"streaming_first",sessionExpireMs:300*1e3};var U=a.create({service:"acp-server-config"}),F="EAS_";function Ne(i){return !(!i||i.trim()===""||i.startsWith("-")||i.endsWith("-")||!/^[a-zA-Z0-9]([a-zA-Z0-9.-]*[a-zA-Z0-9])?$/.test(i))}function qe(i){return Number.isInteger(i)&&i>=1&&i<=65535}function Ue(i){return Number.isFinite(i)&&i>0}function Le(i){let e={...Oe,...i};try{Me(e);}catch(t){throw t instanceof Q&&U.error("Invalid service mode configuration",{message:t.message,conflictingModes:t.conflictingModes}),t}if(e.port!==void 0&&!qe(e.port)){let t=new Error(`Invalid port number: ${e.port}. Must be between 1 and 65535`);throw U.error("Invalid port configuration",{port:e.port}),t}if(e.hostname!==void 0&&!Ne(e.hostname)){let t=new Error(`Invalid hostname: ${e.hostname}`);throw U.error("Invalid hostname configuration",{hostname:e.hostname}),t}if(e.timeout!==void 0&&!Ue(e.timeout)){let t=new Error(`Invalid timeout: ${e.timeout}. Must be a positive number`);throw U.error("Invalid timeout configuration",{timeout:e.timeout}),t}if(e.channel===z.STDIO&&e.stdio&&(!e.stdio.command||e.stdio.command.trim()==="")){let t=new Error("STDIO command is required");throw U.error("Invalid stdio configuration",{command:e.stdio.command}),t}return U.debug("ACPServer config loaded",{channel:e.channel,port:e.port,hostname:e.hostname}),e}function Ze(){let i={},e=process.env[`${F}ACP_CHANNEL`];if(e){let a=e.toLowerCase();Object.values(z).includes(a)?i.channel=a:U.warn("Invalid EAS_ACP_CHANNEL environment variable",{value:e});}let t=process.env[`${F}ACP_PORT`];if(t){let a=parseInt(t,10);qe(a)?i.port=a:U.warn("Invalid EAS_ACP_PORT environment variable",{value:t});}let n=process.env[`${F}ACP_HOSTNAME`];n&&(Ne(n)?i.hostname=n:U.warn("Invalid EAS_ACP_HOSTNAME environment variable",{value:n}));let s=process.env[`${F}ACP_TIMEOUT`];if(s){let a=parseInt(s,10);Ue(a)?i.timeout=a:U.warn("Invalid EAS_ACP_TIMEOUT environment variable",{value:s});}let o=process.env[`${F}ACP_HISTORY_SCOPE`];o&&(["session","peer","global"].includes(o)?i.historyScope=o:U.warn("Invalid EAS_ACP_HISTORY_SCOPE environment variable",{value:o}));let r=process.env[`${F}ACP_HISTORY_WINDOW_SIZE`];if(r){let a=parseInt(r,10);Number.isInteger(a)&&a>0?i.historyWindowSize=a:U.warn("Invalid EAS_ACP_HISTORY_WINDOW_SIZE environment variable",{value:r});}let l=process.env[`${F}ACP_DEGRADE_POLICY`];return l&&(["polling_only","streaming_first"].includes(l)?i.degradePolicy=l:U.warn("Invalid EAS_ACP_DEGRADE_POLICY environment variable",{value:l})),U.debug("Config loaded from environment",{config:i}),i}function ze(i){let e=Ze(),t={...e,...i};return U.info("ACPServer config with environment overrides",{original:{channel:e.channel,port:e.port,hostname:e.hostname},overrides:i,final:{channel:t.channel,port:t.port,hostname:t.hostname}}),t}var he=a.create({service:"acp-rpc-handler"}),Xe={INTERNAL_ERROR:-32603},J=class{constructor(e){b$1(this,"agent");this.agent=e;}async handle(e){let{method:t,params:n,id:s}=e;he.debug("AcpRpcHandler.handle",{method:t,hasParams:!!n,id:s});try{let o;switch(t){case "initialize":o=await this.handleInitialize(n);break;case "authenticate":o=await this.handleAuthenticate(n);break;case "session.new":case "newSession":o=await this.handleNewSession(n);break;case "session.load":case "loadSession":o=await this.handleLoadSession(n);break;case "session.close":case "closeSession":o=await this.handleCloseSession(n);break;case "session.prompt":case "prompt":o=await this.handlePrompt(n);break;case "session.cancel":case "cancel":await this.handleCancel(n),o={success:!0};break;case "session.list":case "listSessions":o=await this.handleListSessions(n);break;case "session.fork":case "forkSession":o=await this.handleForkSession(n);break;case "session.resume":case "resumeSession":o=await this.handleResumeSession(n);break;case "session.setMode":case "setSessionMode":o=await this.handleSetSessionMode(n);break;case "session.setConfigOption":case "setSessionConfigOption":o=await this.handleSetSessionConfigOption(n);break;case "status":o=this.handleStatus();break;case "subscriptions":o=this.handleSubscriptions();break;default:throw he.warn("Unknown method",{method:t}),new Error(`Method not found: ${t}`)}return {jsonrpc:"2.0",id:s,result:o}}catch(o){return he.error("AcpRpcHandler error",{method:t,error:o instanceof Error?o.message:String(o)}),{jsonrpc:"2.0",id:s,error:{code:Xe.INTERNAL_ERROR,message:o instanceof Error?o.message:String(o)}}}}async handleInitialize(e){return this.agent.initialize(e)}async handleAuthenticate(e){return this.agent.authenticate(e)}async handleNewSession(e){return this.agent.newSession(e)}async handleLoadSession(e){return this.agent.loadSession(e)}async handleCloseSession(e){return this.agent.closeSession(e)}async handlePrompt(e){return this.agent.prompt(e)}async handleCancel(e){return this.agent.cancel(e)}async handleListSessions(e){return this.agent.listSessions(e)}async handleForkSession(e){return this.agent.unstable_forkSession(e)}async handleResumeSession(e){return this.agent.resumeSession(e)}async handleSetSessionMode(e){return this.agent.setSessionMode(e)}async handleSetSessionConfigOption(e){return this.agent.setSessionConfigOption(e)}handleStatus(){return {status:"running",channel:"http",timestamp:Date.now(),uptime:process.uptime()}}handleSubscriptions(){return {sessions:[]}}};var oe=a.create({service:"server-agent-side-connection"}),Y=class{constructor(){b$1(this,"broadcaster",null);b$1(this,"sessionIds",new Set);}setBroadcaster(e){this.broadcaster=e;}addSession(e){this.sessionIds.add(e);}removeSession(e){this.sessionIds.delete(e);}clearSessions(){this.sessionIds.clear();}getSessions(){return Array.from(this.sessionIds)}async sessionUpdate(e){let{sessionId:t,update:n}=e;oe.debug("ServerAgentSideConnection.sessionUpdate",{sessionId:t,updateType:n.sessionUpdate}),this.broadcaster&&this.broadcaster.broadcast(t,e);}async requestPermission(e){return oe.debug("ServerAgentSideConnection.requestPermission",{sessionId:e.sessionId}),{outcome:{outcome:"cancelled"}}}async extMethod(e,t){return oe.debug("ServerAgentSideConnection.extMethod",{method:e}),{}}async extNotification(e,t){if(oe.debug("ServerAgentSideConnection.extNotification",{method:e,params:t}),this.broadcaster&&t){let n=t.sessionId||t.sessionId;if(n&&this.sessionIds.has(n)){let s={sessionId:n,update:{sessionUpdate:e,...t}};this.broadcaster.broadcast(n,s);}}}};var H=a.create({service:"http-server"});async function De(i,e){if(H.info("Starting HTTP server",{port:e.port,hostname:e.hostname}),e.channel!==z.HTTP)throw new Error("Invalid channel type for HTTP server");let t=new Map,n=new Map,s=new Y,o={broadcast:(c,f)=>{P(c,f);}};s.setBroadcaster(o);let r=new J(i),l=i.getSDK();if(!l)throw new Error("SDK not configured");let a=new j(l,s);a.setService(i),await a.start();let g=(c,f)=>{let m=t.get(c);if(!m)return false;try{return m.controller.enqueue(new TextEncoder().encode(f)),m.lastHeartbeat=Date.now(),!0}catch(h){return H.warn("Failed to push to SSE connection",{connectionId:c,error:h instanceof Error?h.message:String(h)}),false}},P=(c,f)=>{let m=n.get(c);if(!m||m.size===0)return;let S={jsonrpc:"2.0",method:f.update.sessionUpdate,params:{sessionId:c,...f.update,timestamp:Date.now()}},v=`data: ${JSON.stringify(S)}
2
2
 
3
3
  `;for(let E of m)g(E,v)||(t.delete(E),m.delete(E));},I=(c,f)=>(s.addSession(c),new ReadableStream({start:m=>{let h={id:f,controller:m,sessionId:c,createdAt:Date.now(),lastHeartbeat:Date.now()};t.set(f,h),n.has(c)||n.set(c,new Set),n.get(c).add(f),H.info("SSE client connected",{connectionId:f,sessionId:c});let S=`data: ${JSON.stringify({type:"connected",connectionId:f,sessionId:c})}
4
4
 
5
5
  `;m.enqueue(new TextEncoder().encode(S));},cancel:()=>{let m=t.get(f);if(m){t.delete(f);let h=n.get(m.sessionId);h&&(h.delete(f),h.size===0&&(n.delete(m.sessionId),s.removeSession(m.sessionId))),H.info("SSE client disconnected",{connectionId:f,sessionId:m.sessionId});}}})),p=setInterval(()=>{let c=Date.now(),f=3e5;for(let[m,h]of t.entries())if(c-h.lastHeartbeat>f){H.warn("SSE connection timeout, closing",{connectionId:m});try{h.controller.close();}catch{}t.delete(m);let S=n.get(h.sessionId);S&&S.delete(m);}else try{h.controller.enqueue(new TextEncoder().encode(`: heartbeat
6
6
 
7
- `)),h.lastHeartbeat=c;}catch{}},1e4),u=[{method:"post",path:"/acp",handler:async c=>{let f=await c.req.json().catch(()=>null);if(!f||typeof f!="object")return c.json({jsonrpc:"2.0",error:{code:-32700,message:"Parse error"}},400);let m=f;if(!m.method||m.jsonrpc!=="2.0")return c.json({jsonrpc:"2.0",error:{code:-32600,message:"Invalid Request"}},400);if(m.method==="session.prompt")return r.handle(m).catch(S=>{H.error("HTTP server: session.prompt error",{error:String(S)});}),c.json({jsonrpc:"2.0",id:m.id,result:{accepted:true}},202);let h=await r.handle(m);if(m.method==="initialize"){let S=`conn_${Date.now()}_${Math.random().toString(36).substring(2,9)}`;return c.json(h,200,{"Acp-Connection-Id":S})}return c.json(h)}},{method:"get",path:"/acp",handler:c=>{let f=c.req.header("Acp-Connection-Id"),m=c.req.header("Acp-Session-Id");if(!c.req.header("Accept")?.includes("text/event-stream"))return c.json({error:"Not Acceptable"},406);let S=f||`conn_${Date.now()}_${Math.random().toString(36).substring(2,9)}`;if(m){let k=`sse_${Date.now()}_${Math.random().toString(36).substring(2,9)}`,R=I(m,k);return new Response(R,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no","Acp-Connection-Id":S,"Acp-Session-Id":m}})}let v=`conn_sse_${Date.now()}_${Math.random().toString(36).substring(2,9)}`,E=I("__connection__",v);return new Response(E,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no","Acp-Connection-Id":S}})}},{method:"delete",path:"/acp",handler:async c=>{let f=c.req.header("Acp-Connection-Id");return H.debug("HTTP server: connection terminated",{connectionId:f}),c.json({success:true})}}],d=createServer({port:e.port,hostname:e.hostname,routes:u,timeout:e.timeout,cors:true});return H.info("HTTP server started",{url:`http://${e.hostname}:${e.port}`}),{server:d,stop:async()=>{H.info("Stopping HTTP server"),clearInterval(p),await a.stop();for(let c of t.values())try{c.controller.close();}catch{}t.clear(),n.clear(),s.clearSessions(),await d.stop(),H.info("HTTP server stopped");}}}var $=a.create({service:"websocket-server"});function st(i){try{let e=new URL(i),t=e.hostname,n=parseInt(e.port,10);if(t&&!Number.isNaN(n)&&n>0&&n<=65535)return {port:n,hostname:t}}catch{}}async function $e(i,e){let t=e.ws?st(e.ws.url):void 0,n=t?.port??e.port??3e3,s=t?.hostname??e.hostname??"localhost",o="/acp";if($.info("Starting WebSocket server",{port:n,hostname:s,wsUrl:e.ws?.url}),e.channel!==z.WEBSOCKET)throw new Error("Invalid channel type for WebSocket server");let r=new Map,l=new Map,a=new Y,g={broadcast:(h,S)=>{u(h,S);}};a.setBroadcaster(g);let P=new J(i),I=i.getSDK();if(!I)throw new Error("SDK not configured");let p=new j(I,a);p.setService(i),await p.start();let u=(h,S)=>{let E={jsonrpc:"2.0",method:S.update.sessionUpdate,params:{sessionId:h,...S.update,timestamp:Date.now()}},k=JSON.stringify(E);for(let[R,D]of l.entries())if(D.subscribedSessions.has(h)){let b=r.get(R);b&&b.ws.readyState===b.ws.OPEN&&b.ws.send(k);}},d=h=>{for(let[S,v]of r.entries())if(v.ws===h)return S},c={onOpen:(h,S)=>{let v=`ws_${Date.now()}_${Math.random().toString(36).substring(2,9)}`;r.set(v,{id:v,ws:S,createdAt:Date.now()}),l.set(v,{clientId:v,subscribedSessions:new Set}),$.info("WebSocket client connected",{clientId:v}),S.send(JSON.stringify({type:"connected",clientId:v}));},onMessage:async(h,S)=>{try{let v=JSON.parse(h.data.toString());if(v.type==="ping"){S.send(JSON.stringify({type:"pong"}));return}let E=d(S);if(!E)return;let k,R;if(v.type==="message"||v.type==="request")k={jsonrpc:"2.0",id:v.id,method:v.method,params:v.params},R=v.sessionId;else if(v.jsonrpc==="2.0"&&v.method)k={jsonrpc:"2.0",id:v.id,method:v.method,params:v.params},R=v.params?.sessionId;else {$.warn("WebSocket server: unknown message format",{data:v});return}if(k.method==="session.subscribe"){if(R){let b=l.get(E);b&&(b.subscribedSessions.add(R),a.addSession(R));}S.send(JSON.stringify({type:"response",id:k.id,result:{subscribed:!0,sessionId:R}}));return}if(k.method==="session.unsubscribe"){if(R){let b=l.get(E);b&&(b.subscribedSessions.delete(R),b.subscribedSessions.size===0&&a.removeSession(R));}S.send(JSON.stringify({type:"response",id:k.id,result:{unsubscribed:!0,sessionId:R}}));return}if(k.method==="session.interrupt"){let b={jsonrpc:"2.0",method:"session.cancel",params:{sessionId:R}},L=await P.handle(b);S.send(JSON.stringify({type:"response",id:k.id,result:L.result,error:L.error}));return}if(k.method==="session.prompt"){if(S.send(JSON.stringify({jsonrpc:"2.0",id:k.id,result:{accepted:!0}})),R){let b=r.get(E);b&&(b.sessionId=R);let L=l.get(E);L&&(L.subscribedSessions.add(R),a.addSession(R));}P.handle(k).catch(b=>{$.error("WebSocket server: session.prompt error",{error:String(b)});});return}if(R){let b=r.get(E);b&&(b.sessionId=R);let L=l.get(E);L&&(L.subscribedSessions.add(R),a.addSession(R));}let D=await P.handle(k);S.send(JSON.stringify({type:"response",id:D.id,result:D.result,error:D.error}));}catch(v){$.error("WebSocket server: error handling message",{error:String(v)});}},onClose:(h,S)=>{let v=d(S);if(v){r.delete(v);let E=l.get(v);if(E){for(let k of E.subscribedSessions)a.removeSession(k);l.delete(v);}$.info("WebSocket client disconnected",{clientId:v});}},onError:(h,S)=>{$.error("WebSocket error",{error:h.type});}},f=createServer({port:n,hostname:s,routes:[{method:"post",path:"/acp",handler:async h=>{let S=await h.req.json().catch(()=>null);if(!S||typeof S!="object")return h.json({jsonrpc:"2.0",error:{code:-32700,message:"Parse error"}});let v=S;if(!v.method||v.jsonrpc!=="2.0")return h.json({jsonrpc:"2.0",error:{code:-32600,message:"Invalid Request"}});let E=await P.handle(v);return h.json(E)}},{method:"delete",path:"/acp",handler:async h=>{let S=h.req.header("Acp-Connection-Id");return $.debug("WebSocket server: connection terminated",{connectionId:S}),h.json({success:true})}}],timeout:e.timeout,cors:true}),m=f.raw;if(m){let h=new WebSocketServer({noServer:true});m.on("upgrade",(S,v,E)=>{try{let R=new URL(S.url||"/",`http://${S.headers.host}`).pathname,D=S.headers.upgrade?.toLowerCase();R===o&&D==="websocket"&&h.handleUpgrade(S,v,E,b=>{c.onOpen?.({type:"open"},b),b.on("message",L=>{c.onMessage?.({data:L},b);}),b.on("close",(L,Fe)=>{c.onClose?.({code:L,reason:Fe},b);}),b.on("error",L=>{c.onError?.({type:"error",message:L.message},b);});});}catch{}});}return $.info("WebSocket server started",{url:e.ws?.url||`ws://${s}:${n}`,path:o}),{server:f,stop:async()=>{$.info("Stopping WebSocket server"),await p.stop();for(let h of r.values())try{h.ws.close();}catch{}r.clear(),l.clear(),a.clearSessions(),await f.stop(),$.info("WebSocket server stopped");}}}var re=a.create({service:"acp-server"});async function Be(i,e){let t=ze(Le(e||{}));re.info("Starting ACPServer",{channel:t.channel,port:t.port,hostname:t.hostname});let n,s;switch(t.channel){case z.HTTP:({server:n,stop:s}=await De(i,t));break;case z.WEBSOCKET:({server:n,stop:s}=await $e(i,t));break;default:throw new Error(`Unsupported service mode: ${t.channel}`)}let o={type:t.channel,server:n,agent:i,stop:async()=>{re.info("Stopping ACPServer",{type:t.channel}),await s();},healthCheck:async()=>{if(typeof n=="object"&&n!==null&&"healthCheck"in n){let r=n.healthCheck;if(typeof r=="function")return r()}return true}};return re.info("ACPServer started successfully",{type:o.type,url:ot(t)}),o}function ot(i){switch(i.channel){case z.STDIO:return "stdio://process";case z.HTTP:return `http://${i.hostname}:${i.port}`;case z.WEBSOCKET:return `ws://${i.hostname}:${i.port}`;default:return "unknown://"}}async function rt(i){await Promise.all(i.map(async e=>{try{await e.stop();}catch(t){re.error("Error stopping server",{type:e.type,error:String(t)});}}));}async function He(i){await rt([i]);}z$1.object({agentId:z$1.string(),agentType:z$1.string(),directory:z$1.string(),timestamp:z$1.number()});z$1.object({agentId:z$1.string(),reason:z$1.enum(["normal","error","timeout"]),timestamp:z$1.number()});z$1.object({sessionId:z$1.string(),messageType:z$1.enum(["text","tool_call","tool_result"]),content:z$1.any(),timestamp:z$1.number()});z$1.object({agentId:z$1.string(),error:z$1.string(),context:z$1.record(z$1.string(),z$1.any()).optional(),timestamp:z$1.number()});z$1.object({agentId:z$1.string(),status:z$1.enum(["idle","busy","error"]),timestamp:z$1.number()});var ie=a.create({service:"acp-session-manager"}),ne=class{constructor(e){b$1(this,"sessions",new Map);b$1(this,"sdk");this.sdk=e;}tryGet(e){return this.sessions.get(e)}async create(e,t,n,s){let r={id:e,cwd:t,mcpServers:n,createdAt:new Date,model:s};return ie.info("creating_session",{state:r}),this.sessions.set(e,r),r}async load(e,t,n,s){let o=await this.sdk.session.get({sessionId:e,directory:t},{throwOnError:true}).then(a=>a.data),r=s,l={id:e,cwd:t,mcpServers:n,createdAt:new Date(o.time.created),model:r};return ie.info("loading_session",{state:l}),this.sessions.set(e,l),l}get(e){let t=this.sessions.get(e);if(!t)throw ie.error("session not found",{sessionId:e}),RequestError.invalidParams(JSON.stringify({error:`Session not found: ${e}`}));return t}getModel(e){return this.get(e).model}setModel(e,t){let n=this.get(e);return n.model=t,this.sessions.set(e,n),n}getVariant(e){return this.get(e).variant}setVariant(e,t){let n=this.get(e);return n.variant=t,this.sessions.set(e,n),n}setMode(e,t){let n=this.get(e);return n.modeId=t,this.sessions.set(e,n),n}setContextMode(e,t){let n=this.get(e);return n.contextMode=t,this.sessions.set(e,n),n}setAgent(e,t){let n=this.get(e);return n.agent=t,this.sessions.set(e,n),n}close(e){return this.sessions.delete(e)}dispose(){this.sessions.clear(),ie.debug("all sessions cleared");}resolveConnectionState(e){}};var A=a.create({service:"acp-service"}),se=class{constructor(e,t){b$1(this,"config");b$1(this,"serviceMode");b$1(this,"connection");b$1(this,"sdk");b$1(this,"connectionRegistry",null);b$1(this,"sessionRouter",null);b$1(this,"sessionManager");b$1(this,"executorInitialized",false);b$1(this,"status","initializing");this.connection=e,this.config=t,this.sdk=t.acp.sdk,this.serviceMode=t.serviceMode,this.sessionManager=new ne(this.sdk),t.connectionRegistry&&(this.connectionRegistry=t.connectionRegistry),t.sessionRouter&&(this.sessionRouter=t.sessionRouter),A.info("ACPService instance created",{channel:t.channel.type,hasConnection:!!e,hasProvidedRegistry:!!t.connectionRegistry,hasProvidedRouter:!!t.sessionRouter});}async initializeExecutor(){if(this.executorInitialized){A.warn("Executor components already initialized");return}this.connectionRegistry||(this.connectionRegistry=await la.create(),A.debug("ConnectionRegistry created")),this.sessionRouter||(this.sessionRouter=ma.fromRegistry({resolve:e=>this.connectionRegistry.resolve(e),getConnectionsByPeer:e=>this.connectionRegistry.getConnectionsByAgent(e),getConnectionsByService:e=>this.connectionRegistry.getConnectionsByService(e)}),A.debug("SessionRouter created")),this.executorInitialized=true,A.info("Executor components initialized");}setStatus(e,t="agent"){let n=this.status;if(n===e)return;this.status=e,A.info("Agent status changed",{oldStatus:n,newStatus:e,agentId:t});}getStatus(){return this.status}authenticate(e){return Promise.resolve(void 0)}async newSession(e){A.info("ACP newSession requested",{cwd:e.cwd});let t=e.cwd,s=(await this.sdk.model.default())?.data,r=(await this.sdk.session.create({directory:t})).data?.id;if(!r)throw new Error("Failed to create session: no session ID returned");let l=await this.sessionManager.create(r,t,e.mcpServers,s),a=await this.buildSessionStateResponse(l.id,t);return {sessionId:l.id,...a,_meta:{}}}async loadSession(e){A.info("ACP loadSession requested",{sessionId:e.sessionId});let t=e.cwd,s=(await this.sdk.model.default())?.data;return await this.sessionManager.load(e.sessionId,t,e.mcpServers,s),{...await this.buildSessionStateResponse(e.sessionId,t),_meta:{}}}async prompt(e){let t=e.sessionId,n=this.sessionManager.get(t),s=n.cwd,r=n.model??(await this.sdk.model.default())?.data,l=n.agent??(await this.sdk.agent.default({directory:s}))?.data?.name??"build";await this.sendAvailableCommandsUpdate(t,s);let a=[];for(let p of e.prompt)switch(p.type){case "text":{let u=p.annotations?.audience,d=u?.length===1&&u[0]==="assistant",c=u?.length===1&&u[0]==="user";a.push({type:"text",text:p.text,...d&&{synthetic:true},...c&&{ignored:true}});break}case "image":{let u=this.parseUri(p.uri??""),d=u.type==="file"?u.filename:"image";p.data?a.push({type:"file",url:`data:${p.mimeType};base64,${p.data}`,filename:d,mime:p.mimeType}):p.uri?.startsWith("http:")&&a.push({type:"file",url:p.uri,filename:d,mime:p.mimeType});break}case "resource_link":{let u=this.parseUri(p.uri);p.name&&u.type==="file"&&(u.filename=p.name),a.push(u);break}case "resource":{let u=p.resource;if("text"in u&&u.text)a.push({type:"text",text:u.text});else if("blob"in u&&u.blob&&u.mimeType){let d=this.parseUri(u.uri??""),c=d.type==="file"?d.filename:"file";a.push({type:"file",url:`data:${u.mimeType};base64,${u.blob}`,filename:c,mime:u.mimeType});}break}}A.info("prompt parts",{sessionId:t,parts:a});let g=(()=>{let p=a.filter(c=>c.type==="text").map(c=>c.text).join("").trim();if(!p.startsWith("/"))return;let[u,...d]=p.slice(1).split(/\s+/);return {name:u,args:d.join(" ").trim()}})(),P=p=>({totalTokens:p.tokens.input+p.tokens.output+p.tokens.reasoning+(p.tokens.cache?.read??0)+(p.tokens.cache?.write??0),inputTokens:p.tokens.input,outputTokens:p.tokens.output,thoughtTokens:p.tokens.reasoning||void 0,cachedReadTokens:p.tokens.cache?.read||void 0,cachedWriteTokens:p.tokens.cache?.write||void 0});if(!g){let u=(await this.sdk.session.prompt({sessionId:t,model:{providerId:r.providerId,modelId:r.modelId},parts:a,agent:l,directory:s,variant:n.variant,contextMode:n.contextMode})).data?.info;return {stopReason:"end_turn",usage:u?P(u):void 0,_meta:{}}}let I=await this.sdk.command.list({directory:s},{throwOnError:true}).then(p=>p.data?.find(u=>u.name===g.name));if(I){let p=await za.get(g.name),u=await Aa.command({sessionId:t,agent:l,model:r.providerId+"/"+r.modelId,arguments:g.args,command:I.name});if(await this.sendUsageUpdate(t,s),p?.commandType==="local"&&this.connection){let d=u.success?u.output:`[Error] ${u.error??"Command execution failed"}`;await this.connection.sessionUpdate({sessionId:t,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:d}}});}return {stopReason:"end_turn",usage:u.info?P({tokens:{input:u.info.tokens.input,output:u.info.tokens.output,reasoning:u.info.tokens.reasoning,cache:u.info.tokens.cache}}):void 0,_meta:{}}}switch(g.name){case "compact":if(!r.providerId||!r.modelId)throw new Error("Model providerId and modelId are required for compact command");await this.sdk.session.summarize({sessionId:t,directory:s,providerId:r.providerId,modelId:r.modelId},{throwOnError:true});break}return await this.sendUsageUpdate(t,s),{stopReason:"end_turn",_meta:{}}}async cancel(e){let n=this.sessionManager.tryGet(e.sessionId)?.cwd??"";try{this.sdk&&await this.sdk.session.abort({sessionId:e.sessionId,directory:n}).catch(s=>{A.warn("SDK abort failed",{sessionId:e.sessionId,error:String(s)});}),A.info("Session cancelled",{sessionId:e.sessionId});}catch(s){throw A.error("Failed to cancel session",{sessionId:e.sessionId,error:s instanceof Error?s.message:String(s)}),s}}parseUri(e){try{if(e.startsWith("file://")){let t=e.slice(7),n=t.split("/").pop()||t;return {type:"file",url:e,filename:n,mime:"text/plain"}}if(e.startsWith("zed://")){let n=new URL(e).searchParams.get("path");if(n){let s=n.split("/").pop()||n;return {type:"file",url:pathToFileURL(n).href,filename:s,mime:"text/plain"}}}return {type:"text",text:e}}catch{return {type:"text",text:e}}}async sendUsageUpdate(e,t){if(!this.sdk||!this.connection)return;let n=await this.sdk.session.messages({sessionId:e,directory:t},{throwOnError:true}).then(g=>g.data).catch(g=>{A.error("failed to fetch messages for usage update",{error:g});});if(!n)return;let s=n.filter(g=>g.info.role==="assistant"),o=s[s.length-1];if(!o)return;let r=o.info,l=await this.getContextLimit(r.providerId,r.modelId,t);if(!l)return;let a=r.tokens.input+(r.tokens.cache?.read??0);await this.connection.sessionUpdate({sessionId:e,update:{sessionUpdate:"usage_update",used:a,size:l}});}async sendAvailableCommandsUpdate(e,t){if(this.sdk&&this.connection)try{let s=(await this.sdk.command.list({directory:t},{throwOnError:!0})).data?.map(o=>({name:o.name,description:o.description??""}))??[];await this.connection.sessionUpdate({sessionId:e,update:{sessionUpdate:"available_commands_update",availableCommands:s}});}catch(n){A.error("failed to send available commands update",{error:n});}}async sendConfigOptionUpdate(e,t,n){if(this.connection)try{let o=(n??await this.buildSessionStateResponse(e,t)).configOptions;if(!o||o.length===0)return;await this.connection.sessionUpdate({sessionId:e,update:{sessionUpdate:"config_option_update",configOptions:o}});}catch(s){A.error("failed to send config_option_update to ACP client",{sessionId:e,error:s});}}async sendCurrentModeUpdate(e,t){if(this.connection)try{await this.connection.sessionUpdate({sessionId:e,update:{sessionUpdate:"current_mode_update",currentModeId:t}});}catch(n){A.error("failed to send current_mode_update to ACP client",{sessionId:e,modeId:t,error:n});}}async getContextLimit(e,t,n){return this.sdk?(await this.sdk.config.providers({directory:n}).then(l=>l.data?.providers??[]).catch(l=>(A.error("failed to get providers for context limit",{error:l}),[]))).find(l=>l.id===e)?.models[t]?.limit.context??2e5:null}async unstable_forkSession(e){A.info("ACP forkSession requested",{sessionId:e.sessionId});let t=e.cwd,n=e.mcpServers??[],o=(await this.sdk.model.default())?.data,r=await this.sdk.session.fork({sessionId:e.sessionId,directory:t},{throwOnError:true}).then(P=>P.data);if(!r)throw new Error("Fork session returned no data");let l=r.id;await this.sessionManager.load(l,t,n,o);let g=await this.buildSessionStateResponse(l,t);return A.info("fork_session",{sessionId:l,mcpServers:n.length}),{sessionId:l,...g,_meta:{}}}async resumeSession(e){A.info("ACP resumeSession requested",{sessionId:e.sessionId});let t=e.cwd,n=e.sessionId,s=e.mcpServers??[],r=(await this.sdk.model.default())?.data;await this.sessionManager.load(n,t,s,r);let a=await this.buildSessionStateResponse(n,t);return A.info("resume_session",{sessionId:n,mcpServers:s.length}),{...a,_meta:{}}}async listSessions(e){let t=e.cursor?Number(e.cursor):void 0,n=100,o=(await this.sdk.session.list({directory:e.cwd??void 0,roots:true},{throwOnError:true}).then(I=>I.data??[])).toSorted((I,p)=>p.time.updated-I.time.updated),l=(t?o.filter(I=>I.time.updated<t):o).slice(0,n),a=l.map(I=>({sessionId:I.id,cwd:I.directory,title:I.title??`Session ${I.id}`,updatedAt:new Date(I.time.updated).toISOString()})),g=l[l.length-1],P=l.length===n&&g?String(g.time.updated):void 0;return {sessions:a,nextCursor:P}}async setSessionMode(e){A.info("ACP setSessionMode requested",{sessionId:e.sessionId,modeId:e.modeId}),this.sessionManager.setMode(e.sessionId,e.modeId);let t=this.sessionManager.get(e.sessionId);return await this.sendCurrentModeUpdate(e.sessionId,e.modeId),await this.sendConfigOptionUpdate(e.sessionId,t.cwd),{_meta:{}}}async setSessionConfigOption(e$1){if(A.info("ACP setSessionConfigOption requested",{sessionId:e$1.sessionId,configId:e$1.configId,value:e$1.value}),e$1.configId==="model"){let s=typeof e$1.value=="string"?e$1.value:void 0;if(s){let o=this.parseModelSelection(s);this.sessionManager.setModel(e$1.sessionId,o.model);}}else if(e$1.configId==="agent"){let s=typeof e$1.value=="string"?e$1.value:void 0;this.sessionManager.setAgent(e$1.sessionId,s);}else if(e$1.configId==="thought_level"){let s=typeof e$1.value=="string"?e$1.value:void 0;this.sessionManager.setVariant(e$1.sessionId,s);}else if(e$1.configId==="context_mode"){let s=typeof e$1.value=="string"&&e.includes(e$1.value)?e$1.value:void 0;this.sessionManager.setContextMode(e$1.sessionId,s);}let t=this.sessionManager.get(e$1.sessionId),n=await this.buildSessionStateResponse(e$1.sessionId,t.cwd);return await this.sendConfigOptionUpdate(e$1.sessionId,t.cwd,n),{_meta:{},configOptions:n.configOptions??[]}}async closeSession(e){return A.info("ACP closeSession requested",{sessionId:e.sessionId}),await this.cancel({sessionId:e.sessionId}),this.sessionManager.close(e.sessionId),{_meta:{}}}async buildSessionStateResponse(e$1,t){let n=this.sessionManager.tryGet(e$1),s=n?.model??(await this.sdk.model.default())?.data,o=s?.providerId&&s?.modelId?`${s.providerId}/${s.modelId}`:void 0,r=[];try{r=(await this.sdk.config.providers({directory:t}).then(u=>u.data?.providers??[])).flatMap(u=>{let d=u.models??{};return Object.keys(d).map(c=>({modelId:`${u.id}/${c}`,name:`${u.id}/${c}`}))});}catch(p){A.warn("failed to build available models for session state",{sessionId:e$1,error:p instanceof Error?p.message:String(p)});}o&&!r.some(p=>p.modelId===o)&&(r=[{modelId:o,name:o},...r]);let l=[];try{l=((await this.sdk.app.agents({directory:t})).data??[]).filter(d=>d.hidden!==!0&&d.mode!=="subagent").map(d=>({id:d.name,name:d.name,description:d.description}));}catch(p){A.warn("failed to build available agents for session state",{sessionId:e$1,error:p instanceof Error?p.message:String(p)});}let a=n?.modeId,g=n?.variant??"low",P=n?.contextMode??f,I=n?.agent??"build";return await this.sendAvailableCommandsUpdate(e$1,t),{models:o?{currentModelId:o,availableModels:r}:void 0,modes:a?{currentModeId:a,availableModes:[{id:a,name:a}]}:void 0,configOptions:[{id:"model",name:"Model",category:"model",type:"select",currentValue:o??"",options:r.map(p=>({value:p.modelId,name:p.name,description:p.description??null}))},{id:"agent",name:"Agent",category:"agent",type:"select",currentValue:I,options:l.map(p=>({value:p.id,name:p.name,description:p.description??null}))},{id:"thought_level",name:"Thought Level",category:"thought_level",type:"select",currentValue:g,options:[{value:"off",name:"Off"},{value:"low",name:"Low"},{value:"medium",name:"Medium"},{value:"high",name:"High"}]},{id:"context_mode",name:"Context Mode",category:"context_mode",type:"select",currentValue:P,options:e.map(p=>({value:p,name:p.charAt(0).toUpperCase()+p.slice(1)}))}]}}parseModelSelection(e){let{provider:t,model:n}=parseModelId(e);return t&&n?{model:{providerId:t,modelId:n}}:{model:{providerId:"unknown",modelId:e}}}setConnection(e){this.connection=e,A.info("ACPService connection updated");}getConnection(){return this.connection}abortConnection(){this.connection&&A.debug("Connection aborted");}closeConnection(){this.connection&&A.debug("Connection closed");}getConnectionRegistry(){return this.connectionRegistry}getSessionRouter(){return this.sessionRouter}createConnection(e,t,n,s){if(!this.connectionRegistry)throw new Error("ConnectionRegistry not initialized. Call initializeExecutor() first.");if(!t||!n)throw new Error("localAgentId and remoteAgentId are required");return this.connectionRegistry.connect(e,t,n,s)}async routeToConnection(e){if(!this.sessionRouter)throw new Error("SessionRouter not initialized. Call initializeExecutor() first.");return this.sessionRouter.route(e)}async dispose(){A.info("Disposing ACPService"),this.sessionManager&&(this.sessionManager.dispose?.(),A.debug("SessionManager disposed")),this.connectionRegistry&&(await this.connectionRegistry.close(),this.connectionRegistry=null,A.debug("ConnectionRegistry closed")),this.sessionRouter=null,this.executorInitialized=false,A.info("ACPService disposed");}};var q=a.create({service:"easbot-agent"}),Z=class i extends se{constructor(t,n){super(t,n);b$1(this,"acpEventBridge",null);b$1(this,"server",null);b$1(this,"isAgentInitialized",false);q.info("EasBotAgent instance created",{serviceMode:this.serviceMode});}static async create(t){q.info("creating EasBotAgent",{serviceMode:t.serviceMode});let n=t.serviceMode==="stdio",s=new i(void 0,t);if(n&&t.stdioStream){let{stream:o}=t.stdioStream,r={initialize:async a=>s.initialize(a),newSession:async a=>s.newSession(a),loadSession:async a=>s.loadSession(a),prompt:async a=>s.prompt(a),cancel:async a=>s.cancel(a),authenticate:async a=>s.authenticate(a),setSessionMode:async a=>s.setSessionMode(a),setSessionConfigOption:async a=>s.setSessionConfigOption(a),listSessions:async a=>s.listSessions(a),unstable_forkSession:async a=>s.unstable_forkSession(a),resumeSession:async a=>s.resumeSession(a),closeSession:async a=>s.closeSession(a)},l=new AgentSideConnection(()=>r,o);s.setConnection(l);}return q.info("EasBotAgent created successfully",{serviceMode:t.serviceMode,hasConnection:n&&!!t.stdioStream}),s}async initialize(t){return q.info("ACP initialize requested",{protocolVersion:t.protocolVersion}),this.isAgentInitialized||await this.initializeAgent(),{protocolVersion:t.protocolVersion,agentCapabilities:{loadSession:true,positionEncoding:"utf-8",mcpCapabilities:{http:true,sse:true},promptCapabilities:{image:true,embeddedContext:true,audio:false},sessionCapabilities:{close:{},fork:{},list:{},resume:{}},_meta:{history_scope:true,session_management:true}},agentInfo:{name:"EasBot Agent",version:a$1.getVersion(),title:"Multi-Agent Collaboration Ecosystem Agent"},authMethods:[{id:"easbot-token",name:"EasBot Token Authentication",description:"Authenticate using EasBot API token"}]}}async initializeAgent(){if(this.isAgentInitialized){q.warn("EasBotAgent already initialized");return}q.info("initializing EasBotAgent internals");try{await this.initializeExecutor(),this.config.acpServerConfig||await this.initializeAcpEventBridge(),this.isAgentInitialized=!0,this.setStatus("ready"),q.info("EasBotAgent internals initialized successfully");}catch(t){throw this.setStatus("error"),q.error("failed to initialize EasBotAgent",{error:String(t)}),t}}async start(){if(this.status==="running"){q.warn("EasBotAgent already running");return}this.isAgentInitialized||await this.initializeAgent();let t=this.config;t.acpServerConfig&&!this.server&&(this.server=await Be(this,t.acpServerConfig)),this.setStatus("running"),q.info("EasBotAgent started");}async stop(){if(this.status==="stopped"){q.warn("EasBotAgent already stopped");return}q.info("stopping EasBotAgent");try{this.server&&(await He(this.server),this.server=null),this.acpEventBridge&&(await this.acpEventBridge.stop(),this.acpEventBridge=null),await this.dispose(),this.setStatus("stopped"),this.isAgentInitialized=!1,q.info("EasBotAgent stopped successfully");}catch(t){throw this.setStatus("error"),q.error("error stopping EasBotAgent",{error:String(t)}),t}}async initializeAcpEventBridge(){if(this.acpEventBridge){q.warn("ACP event bridge already initialized");return}let n=this.config.acp?.sdk,s=this.getConnection();if(!n)throw q.error("Cannot initialize ACP event bridge: missing SDK client"),new Error("SDK client is required for ACP event bridge");if(!s)throw q.error("Cannot initialize ACP event bridge: missing ACP connection"),new Error("ACP connection is required for ACP event bridge");this.acpEventBridge=new j(n,s),this.acpEventBridge.setService(this),await this.acpEventBridge.start(),q.info("ACP event bridge initialized");}getServiceMode(){return this.serviceMode}getServerInstance(){return this.server}getSDK(){return this.sdk}};var W=class i extends Error{constructor(t,n,s){super(t);b$1(this,"type");b$1(this,"stage");b$1(this,"cause");this.type="AdapterEnvironmentInitializationError",this.stage=n,this.cause=s,Error.captureStackTrace&&Error.captureStackTrace(this,i);}},X=a.create({service:"adapter.bootstrap"}),fe;function ut(){return fe||(fe=Oa.state(async()=>({initialized:false,initPromise:null,instancePromise:null,handlersInstalled:false,directory:".easbot",sdk:null,activeChannel:null,agent:null,acpConnection:null}),async i=>{let e=i.agent;e&&await e.stop().catch(()=>{}),i.agent=null,i.sdk=null,i.acpConnection=null;})),fe}async function B(){return ut()()}function We(i){let e=["ECONNRESET","EPIPE","ETIMEDOUT","ECONNREFUSED","ENOTFOUND","EHOSTUNREACH","ENETUNREACH"],t=i.code;return e.includes(t??"")}function mt(i){i.handlersInstalled||(process.on("unhandledRejection",e=>{let t=e instanceof Error?e:new Error(String(e));We(t)||X.error("unhandled promise rejection",{error:t.message,stack:t.stack});}),process.on("uncaughtException",e=>{We(e)||(X.error("uncaught exception",{error:e.message,stack:e.stack}),process.exit(1));}),i.handlersInstalled=true);}async function gt(i){return i.instancePromise||(i.instancePromise=Oa.provide({directory:i.directory,init:qb,fn:async()=>{X.debug("instance bootstrap completed");}}).then(()=>{})),i.instancePromise}async function ht(){try{await Oa.dispose(),X.debug("instance disposed");}catch(i){X.warn("failed to dispose instance",{error:i instanceof Error?i.message:String(i)});}}var G;(u=>{function i(d,c){return d.sdk||(d.sdk=xa({directory:c})),d.sdk}function e(d){switch(d){case "http":return "http";case "stdio":return "stdio";case "websocket":return "websocket";default:return "stdio"}}async function t(d){let c=await B();if(c.initialized)return;if(c.initPromise)return c.initPromise;let f={directory:d?.directory??".easbot",initModels:d?.initModels??true,printLogs:d?.printLogs??false,logLevel:d?.logLevel??"INFO",channel:d?.channel??"stdio"};if(c.directory=f.directory,i(c,c.directory),c.activeChannel&&c.activeChannel!==f.channel)throw new Error(`Adapter already initialized with channel ${c.activeChannel}, cannot re-init with ${f.channel}`);return c.activeChannel=f.channel,c.initPromise=(async()=>{try{await a$1.init();}catch(m){throw new W("Failed to initialize global directories","global",m instanceof Error?m:void 0)}try{await a.init({logDir:a$1.Path.log,print:f.printLogs??!1,level:f.logLevel??"INFO"});}catch(m){throw new W("Failed to initialize log infrastructure","log",m instanceof Error?m:void 0)}if(f.initModels)try{b();}catch(m){throw new W("Failed to initialize models refresh","models",m instanceof Error?m:void 0)}try{mt(c);}catch(m){throw new W("Failed to install unhandled exception handlers","handlers",m instanceof Error?m:void 0)}try{await gt(c);}catch(m){throw new W("Failed to initialize instance","instance",m instanceof Error?m:void 0)}c.initialized=true;})(),c.initPromise}u.init=t;async function n(){let d=await B();if(d.initialized){await Ha.stop().catch(()=>{});try{let{MCP:c}=await import('./mcp-JIUYQ7QS.mjs'),f=await c.clients();for(let[m,h]of Object.entries(f))await h.disconnect().catch(()=>{});}catch{}d.agent&&(await d.agent.stop().catch(()=>{}),d.agent=null),await ht(),d.initialized=false,d.initPromise=null,d.instancePromise=null,d.activeChannel=null,d.sdk=null,d.agent=null,d.acpConnection=null;}}u.destroy=n;async function s(){return (await B()).initialized}u.isInitialized=s;async function o(d){let c=await B();c.agent=d;}u.setAgent=o;async function r(){return (await B()).agent}u.getAgent=r;async function l(){let c=(await B()).agent?.getServerInstance();return c||null}u.getServer=l;async function a$2(){return (await B()).sdk}u.getSDK=a$2;async function g(){return (await B()).acpConnection}u.getACPConnection=g;async function P(){let d=await B(),c=!!d.agent?.getServerInstance();return {initialized:d.initialized,directory:d.directory,activeChannel:d.activeChannel,hasSDK:!!d.sdk,hasAgent:!!d.agent,hasACPConnection:!!d.acpConnection,hasServer:c}}u.getState=P;async function I(d){await t({channel:d.channel,directory:d.directory});let c=await B(),f=i(c,c.directory);if(d.channel==="stdio")return p({directory:d.directory});if(c.agent?.getServerInstance()&&c.activeChannel&&c.activeChannel!==d.channel)throw new Error(`ACP service already started with channel ${c.activeChannel}, cannot switch to ${d.channel}`);if(c.agent){let v=c.agent.getServerInstance();if(v)return {sdk:f,agent:c.agent,server:v}}let h=await Z.create({serviceMode:e(d.channel),acp:{sdk:f},acpServerConfig:d,channel:{type:d.channel,timeout:d.timeout}});await h.start();let S=h.getServerInstance();if(!S)throw new Error("ACP server failed to start");return c.agent=h,c.activeChannel=d.channel,{sdk:f,agent:h,server:S}}u.ensureACPService=I;async function p(d){await t({channel:"stdio",directory:d.directory});let c=await B(),f=i(c,c.directory);if(c.agent)return {sdk:f,agent:c.agent};let m=new WritableStream({write(E){return new Promise((k,R)=>{try{process.stdout.write(E)?k():process.stdout.once("drain",k);}catch(D){let b=D;b.code==="EPIPE"||b.code==="EIO"?R(new Error("stdout pipe broken")):R(D);}})}}),h=new ReadableStream({start(E){process.stdin.on("data",k=>{E.enqueue(new Uint8Array(k));}),process.stdin.on("end",()=>E.close()),process.stdin.on("error",k=>E.error(k));}}),S=ndJsonStream(m,h),v=await Z.create({serviceMode:"stdio",acp:{sdk:f},channel:{type:"stdio",timeout:6e4},stdioStream:{stream:S}});return c.acpConnection=v.getConnection()??null,await v.start(),c.agent=v,c.activeChannel="stdio",X.info("Stdio ACP service started, waiting for client..."),process.stdin.resume(),{sdk:f,agent:v}}u.ensureACPServiceStdio=p;})(G||(G={}));var x=a.create({service:"cli-command-acp"});async function vt(i,e){let t=await pb.getACPServerConfig();x.debug("Merging ACP configuration",{baseConfig:{channel:t.channel,port:t.port,hostname:t.hostname,timeout:t.timeout},cliOptions:{channel:e.channel,port:e.port,hostname:e.hostname,timeout:e.timeout}});let n={};if(e.channel!==void 0){let o=e.channel.toLowerCase();Object.values(Q$1).includes(o)?(n.channel=o,x.debug("CLI override: channel",{value:n.channel})):x.warn("Invalid channel type from command line",{value:e.channel});}if(e.port!==void 0&&(e.port>0&&e.port<=65535?(n.port=e.port,x.debug("CLI override: port",{value:n.port})):x.warn("Invalid port from command line",{value:e.port})),e.hostname!==void 0&&(n.hostname=e.hostname,x.debug("CLI override: hostname",{value:n.hostname})),e.timeout!==void 0&&(e.timeout>0?(n.timeout=e.timeout,x.debug("CLI override: timeout",{value:n.timeout})):x.warn("Invalid timeout from command line",{value:e.timeout})),e.hostname!==void 0||e.port!==void 0){let o=e.hostname??t.hostname??"127.0.0.1",r=e.port??t.port??3e3;t.ws&&(n.ws={...t.ws,url:`ws://${o}:${r}`}),t.http&&(n.http={...t.http,baseUrl:`http://${o}:${r}`}),x.debug("CLI override: ws.url and http.baseUrl updated",{hostname:e.hostname,port:e.port,wsUrl:n.ws?.url,httpBaseUrl:n.http?.baseUrl});}e.timeout!==void 0&&(n.ws||n.http)&&(n.ws&&(n.ws.timeout=e.timeout),n.http&&(n.http.timeout=e.timeout),x.debug("CLI override: ws.timeout and http.timeout updated",{timeout:e.timeout}));let s={...t,...n};return x.debug("Merged ACP configuration",{channel:s.channel,port:s.port,hostname:s.hostname,timeout:s.timeout}),s}async function Ct(i$2,e,t){x.info("Starting ACP service",{channel:e.channel,port:e.port,hostname:e.hostname,debug:t.config.debug}),await G.init({directory:i$2,printLogs:t.config.print_logs,logLevel:t.config.log_level,channel:e.channel});await G.ensureACPService(e);console.log(""),console.log(d(i("acp.server.started"))),console.log(k(60)),console.log(i$1(i("acp.field.directory"),i$2,15)),console.log(i$1(i("acp.field.worktree"),Oa.project.worktree||"N/A",15)),console.log(i$1(i("acp.field.channel"),e.channel,15));let s=b$2();switch(e.channel){case "websocket":{let r,l="/";if(e.ws?.url)try{let a=new URL(e.ws.url),g=a.port||"3000",P=a.hostname;l=a.pathname||"/",r=`ws://${P}:${g}${l==="/"?"":l}`;}catch{r=e.ws.url;}else r=`ws://${e.hostname}:${e.port}`;console.log(i$1(i("acp.field.ws_url"),r,15)),console.log(i$1(i("acp.field.ws_path"),l,15)),e.ws?(console.log(h(i("acp.websocket.config"))),console.log(i$1(i("acp.field.timeout"),`${e.ws.timeout??e.timeout}ms`,15)),console.log(i$1(i("acp.field.batch_size"),`${e.ws.batchSize??10}`,15)),console.log(i$1(i("acp.field.batch_interval"),`${e.ws.batchInterval??50}ms`,15)),console.log(i$1(i("acp.field.heartbeat"),`${e.ws.heartbeatInterval??3e4}ms`,15))):console.log(i$1(i("acp.field.timeout"),`${e.timeout}ms`,15));break}case "http":e.http?.baseUrl?console.log(i$1(i("acp.field.base_url"),e.http.baseUrl,15)):console.log(i$1(i("acp.field.host"),`${e.hostname}:${e.port}`,15)),e.http?.timeout?console.log(i$1(i("acp.field.timeout"),`${e.http.timeout}ms`,15)):console.log(i$1(i("acp.field.timeout"),`${e.timeout}ms`,15));break;case "stdio":console.log(i$1(i("acp.field.mode"),i("acp.mode.stdio"),15)),console.log(i$1(i("acp.field.protocol"),i("acp.protocol"),15)),console.log(i$1(i("acp.field.timeout"),`${e.timeout}ms`,15));break;default:console.log(i$1(i("acp.field.host"),`${e.hostname}:${e.port}`,15)),console.log(i$1(i("acp.field.timeout"),`${e.timeout}ms`,15));}console.log(i$1(i("acp.field.debug"),t.config.debug?c(s,a$4.success,i("common.enabled")):c(s,a$4.muted,i("common.disabled")),15));let o=getProxyConfig();if(o.enabled){let r=o.https||o.http||"configured";console.log(i$1(i("acp.field.proxy"),r,15));}console.log(k(60)),console.log(""),x.info("ACPServer started successfully"),yt();}function yt(){let i$1=process.env.EASBOT_RUN_MODE==="ephemeral"||!process.stdin.isTTY&&process.env.EASBOT_RUN_MODE!=="persistent",e=async t=>{x.debug(`Received ${t}, shutting down...`),i$1||console.log(`
7
+ `)),h.lastHeartbeat=c;}catch{}},1e4),u=[{method:"post",path:"/acp",handler:async c=>{let f=await c.req.json().catch(()=>null);if(!f||typeof f!="object")return c.json({jsonrpc:"2.0",error:{code:-32700,message:"Parse error"}},400);let m=f;if(!m.method||m.jsonrpc!=="2.0")return c.json({jsonrpc:"2.0",error:{code:-32600,message:"Invalid Request"}},400);if(m.method==="session.prompt")return r.handle(m).catch(S=>{H.error("HTTP server: session.prompt error",{error:String(S)});}),c.json({jsonrpc:"2.0",id:m.id,result:{accepted:true}},202);let h=await r.handle(m);if(m.method==="initialize"){let S=`conn_${Date.now()}_${Math.random().toString(36).substring(2,9)}`;return c.json(h,200,{"Acp-Connection-Id":S})}return c.json(h)}},{method:"get",path:"/acp",handler:c=>{let f=c.req.header("Acp-Connection-Id"),m=c.req.header("Acp-Session-Id");if(!c.req.header("Accept")?.includes("text/event-stream"))return c.json({error:"Not Acceptable"},406);let S=f||`conn_${Date.now()}_${Math.random().toString(36).substring(2,9)}`;if(m){let k=`sse_${Date.now()}_${Math.random().toString(36).substring(2,9)}`,R=I(m,k);return new Response(R,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no","Acp-Connection-Id":S,"Acp-Session-Id":m}})}let v=`conn_sse_${Date.now()}_${Math.random().toString(36).substring(2,9)}`,E=I("__connection__",v);return new Response(E,{headers:{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive","X-Accel-Buffering":"no","Acp-Connection-Id":S}})}},{method:"delete",path:"/acp",handler:async c=>{let f=c.req.header("Acp-Connection-Id");return H.debug("HTTP server: connection terminated",{connectionId:f}),c.json({success:true})}}],d=createServer({port:e.port,hostname:e.hostname,routes:u,timeout:e.timeout,cors:true});return H.info("HTTP server started",{url:`http://${e.hostname}:${e.port}`}),{server:d,stop:async()=>{H.info("Stopping HTTP server"),clearInterval(p),await a.stop();for(let c of t.values())try{c.controller.close();}catch{}t.clear(),n.clear(),s.clearSessions(),await d.stop(),H.info("HTTP server stopped");}}}var $=a.create({service:"websocket-server"});function st(i){try{let e=new URL(i),t=e.hostname,n=parseInt(e.port,10);if(t&&!Number.isNaN(n)&&n>0&&n<=65535)return {port:n,hostname:t}}catch{}}async function $e(i,e){let t=e.ws?st(e.ws.url):void 0,n=t?.port??e.port??3e3,s=t?.hostname??e.hostname??"localhost",o="/acp";if($.info("Starting WebSocket server",{port:n,hostname:s,wsUrl:e.ws?.url}),e.channel!==z.WEBSOCKET)throw new Error("Invalid channel type for WebSocket server");let r=new Map,l=new Map,a=new Y,g={broadcast:(h,S)=>{u(h,S);}};a.setBroadcaster(g);let P=new J(i),I=i.getSDK();if(!I)throw new Error("SDK not configured");let p=new j(I,a);p.setService(i),await p.start();let u=(h,S)=>{let E={jsonrpc:"2.0",method:S.update.sessionUpdate,params:{sessionId:h,...S.update,timestamp:Date.now()}},k=JSON.stringify(E);for(let[R,D]of l.entries())if(D.subscribedSessions.has(h)){let b=r.get(R);b&&b.ws.readyState===b.ws.OPEN&&b.ws.send(k);}},d=h=>{for(let[S,v]of r.entries())if(v.ws===h)return S},c={onOpen:(h,S)=>{let v=`ws_${Date.now()}_${Math.random().toString(36).substring(2,9)}`;r.set(v,{id:v,ws:S,createdAt:Date.now()}),l.set(v,{clientId:v,subscribedSessions:new Set}),$.info("WebSocket client connected",{clientId:v}),S.send(JSON.stringify({type:"connected",clientId:v}));},onMessage:async(h,S)=>{try{let v=JSON.parse(h.data.toString());if(v.type==="ping"){S.send(JSON.stringify({type:"pong"}));return}let E=d(S);if(!E)return;let k,R;if(v.type==="message"||v.type==="request")k={jsonrpc:"2.0",id:v.id,method:v.method,params:v.params},R=v.sessionId;else if(v.jsonrpc==="2.0"&&v.method)k={jsonrpc:"2.0",id:v.id,method:v.method,params:v.params},R=v.params?.sessionId;else {$.warn("WebSocket server: unknown message format",{data:v});return}if(k.method==="session.subscribe"){if(R){let b=l.get(E);b&&(b.subscribedSessions.add(R),a.addSession(R));}S.send(JSON.stringify({type:"response",id:k.id,result:{subscribed:!0,sessionId:R}}));return}if(k.method==="session.unsubscribe"){if(R){let b=l.get(E);b&&(b.subscribedSessions.delete(R),b.subscribedSessions.size===0&&a.removeSession(R));}S.send(JSON.stringify({type:"response",id:k.id,result:{unsubscribed:!0,sessionId:R}}));return}if(k.method==="session.interrupt"){let b={jsonrpc:"2.0",method:"session.cancel",params:{sessionId:R}},L=await P.handle(b);S.send(JSON.stringify({type:"response",id:k.id,result:L.result,error:L.error}));return}if(k.method==="session.prompt"){if(S.send(JSON.stringify({jsonrpc:"2.0",id:k.id,result:{accepted:!0}})),R){let b=r.get(E);b&&(b.sessionId=R);let L=l.get(E);L&&(L.subscribedSessions.add(R),a.addSession(R));}P.handle(k).catch(b=>{$.error("WebSocket server: session.prompt error",{error:String(b)});});return}if(R){let b=r.get(E);b&&(b.sessionId=R);let L=l.get(E);L&&(L.subscribedSessions.add(R),a.addSession(R));}let D=await P.handle(k);S.send(JSON.stringify({type:"response",id:D.id,result:D.result,error:D.error}));}catch(v){$.error("WebSocket server: error handling message",{error:String(v)});}},onClose:(h,S)=>{let v=d(S);if(v){r.delete(v);let E=l.get(v);if(E){for(let k of E.subscribedSessions)a.removeSession(k);l.delete(v);}$.info("WebSocket client disconnected",{clientId:v});}},onError:(h,S)=>{$.error("WebSocket error",{error:h.type});}},f=createServer({port:n,hostname:s,routes:[{method:"post",path:"/acp",handler:async h=>{let S=await h.req.json().catch(()=>null);if(!S||typeof S!="object")return h.json({jsonrpc:"2.0",error:{code:-32700,message:"Parse error"}});let v=S;if(!v.method||v.jsonrpc!=="2.0")return h.json({jsonrpc:"2.0",error:{code:-32600,message:"Invalid Request"}});let E=await P.handle(v);return h.json(E)}},{method:"delete",path:"/acp",handler:async h=>{let S=h.req.header("Acp-Connection-Id");return $.debug("WebSocket server: connection terminated",{connectionId:S}),h.json({success:true})}}],timeout:e.timeout,cors:true}),m=f.raw;if(m){let h=new WebSocketServer({noServer:true});m.on("upgrade",(S,v,E)=>{try{let R=new URL(S.url||"/",`http://${S.headers.host}`).pathname,D=S.headers.upgrade?.toLowerCase();R===o&&D==="websocket"&&h.handleUpgrade(S,v,E,b=>{c.onOpen?.({type:"open"},b),b.on("message",L=>{c.onMessage?.({data:L},b);}),b.on("close",(L,Fe)=>{c.onClose?.({code:L,reason:Fe},b);}),b.on("error",L=>{c.onError?.({type:"error",message:L.message},b);});});}catch{}});}return $.info("WebSocket server started",{url:e.ws?.url||`ws://${s}:${n}`,path:o}),{server:f,stop:async()=>{$.info("Stopping WebSocket server"),await p.stop();for(let h of r.values())try{h.ws.close();}catch{}r.clear(),l.clear(),a.clearSessions(),await f.stop(),$.info("WebSocket server stopped");}}}var re=a.create({service:"acp-server"});async function Be(i,e){let t=ze(Le(e||{}));re.info("Starting ACPServer",{channel:t.channel,port:t.port,hostname:t.hostname});let n,s;switch(t.channel){case z.HTTP:({server:n,stop:s}=await De(i,t));break;case z.WEBSOCKET:({server:n,stop:s}=await $e(i,t));break;default:throw new Error(`Unsupported service mode: ${t.channel}`)}let o={type:t.channel,server:n,agent:i,stop:async()=>{re.info("Stopping ACPServer",{type:t.channel}),await s();},healthCheck:async()=>{if(typeof n=="object"&&n!==null&&"healthCheck"in n){let r=n.healthCheck;if(typeof r=="function")return r()}return true}};return re.info("ACPServer started successfully",{type:o.type,url:ot(t)}),o}function ot(i){switch(i.channel){case z.STDIO:return "stdio://process";case z.HTTP:return `http://${i.hostname}:${i.port}`;case z.WEBSOCKET:return `ws://${i.hostname}:${i.port}`;default:return "unknown://"}}async function rt(i){await Promise.all(i.map(async e=>{try{await e.stop();}catch(t){re.error("Error stopping server",{type:e.type,error:String(t)});}}));}async function He(i){await rt([i]);}z$1.object({agentId:z$1.string(),agentType:z$1.string(),directory:z$1.string(),timestamp:z$1.number()});z$1.object({agentId:z$1.string(),reason:z$1.enum(["normal","error","timeout"]),timestamp:z$1.number()});z$1.object({sessionId:z$1.string(),messageType:z$1.enum(["text","tool_call","tool_result"]),content:z$1.any(),timestamp:z$1.number()});z$1.object({agentId:z$1.string(),error:z$1.string(),context:z$1.record(z$1.string(),z$1.any()).optional(),timestamp:z$1.number()});z$1.object({agentId:z$1.string(),status:z$1.enum(["idle","busy","error"]),timestamp:z$1.number()});var ie=a.create({service:"acp-session-manager"}),ne=class{constructor(e){b$1(this,"sessions",new Map);b$1(this,"sdk");this.sdk=e;}tryGet(e){return this.sessions.get(e)}async create(e,t,n,s){let r={id:e,cwd:t,mcpServers:n,createdAt:new Date,model:s};return ie.info("creating_session",{state:r}),this.sessions.set(e,r),r}async load(e,t,n,s){let o=await this.sdk.session.get({sessionId:e,directory:t},{throwOnError:true}).then(a=>a.data),r=s,l={id:e,cwd:t,mcpServers:n,createdAt:new Date(o.time.created),model:r};return ie.info("loading_session",{state:l}),this.sessions.set(e,l),l}get(e){let t=this.sessions.get(e);if(!t)throw ie.error("session not found",{sessionId:e}),RequestError.invalidParams(JSON.stringify({error:`Session not found: ${e}`}));return t}getModel(e){return this.get(e).model}setModel(e,t){let n=this.get(e);return n.model=t,this.sessions.set(e,n),n}getVariant(e){return this.get(e).variant}setVariant(e,t){let n=this.get(e);return n.variant=t,this.sessions.set(e,n),n}setMode(e,t){let n=this.get(e);return n.modeId=t,this.sessions.set(e,n),n}setContextMode(e,t){let n=this.get(e);return n.contextMode=t,this.sessions.set(e,n),n}setAgent(e,t){let n=this.get(e);return n.agent=t,this.sessions.set(e,n),n}close(e){return this.sessions.delete(e)}dispose(){this.sessions.clear(),ie.debug("all sessions cleared");}resolveConnectionState(e){}};var A=a.create({service:"acp-service"}),se=class{constructor(e,t){b$1(this,"config");b$1(this,"serviceMode");b$1(this,"connection");b$1(this,"sdk");b$1(this,"connectionRegistry",null);b$1(this,"sessionRouter",null);b$1(this,"sessionManager");b$1(this,"executorInitialized",false);b$1(this,"status","initializing");this.connection=e,this.config=t,this.sdk=t.acp.sdk,this.serviceMode=t.serviceMode,this.sessionManager=new ne(this.sdk),t.connectionRegistry&&(this.connectionRegistry=t.connectionRegistry),t.sessionRouter&&(this.sessionRouter=t.sessionRouter),A.info("ACPService instance created",{channel:t.channel.type,hasConnection:!!e,hasProvidedRegistry:!!t.connectionRegistry,hasProvidedRouter:!!t.sessionRouter});}async initializeExecutor(){if(this.executorInitialized){A.warn("Executor components already initialized");return}this.connectionRegistry||(this.connectionRegistry=await la.create(),A.debug("ConnectionRegistry created")),this.sessionRouter||(this.sessionRouter=ma.fromRegistry({resolve:e=>this.connectionRegistry.resolve(e),getConnectionsByPeer:e=>this.connectionRegistry.getConnectionsByAgent(e),getConnectionsByService:e=>this.connectionRegistry.getConnectionsByService(e)}),A.debug("SessionRouter created")),this.executorInitialized=true,A.info("Executor components initialized");}setStatus(e,t="agent"){let n=this.status;if(n===e)return;this.status=e,A.info("Agent status changed",{oldStatus:n,newStatus:e,agentId:t});}getStatus(){return this.status}authenticate(e){return Promise.resolve(void 0)}async newSession(e){A.info("ACP newSession requested",{cwd:e.cwd});let t=e.cwd,s=(await this.sdk.model.default())?.data,r=(await this.sdk.session.create({directory:t})).data?.id;if(!r)throw new Error("Failed to create session: no session ID returned");let l=await this.sessionManager.create(r,t,e.mcpServers,s),a=await this.buildSessionStateResponse(l.id,t);return {sessionId:l.id,...a,_meta:{}}}async loadSession(e){A.info("ACP loadSession requested",{sessionId:e.sessionId});let t=e.cwd,s=(await this.sdk.model.default())?.data;return await this.sessionManager.load(e.sessionId,t,e.mcpServers,s),{...await this.buildSessionStateResponse(e.sessionId,t),_meta:{}}}async prompt(e){let t=e.sessionId,n=this.sessionManager.get(t),s=n.cwd,r=n.model??(await this.sdk.model.default())?.data,l=n.agent??(await this.sdk.agent.default({directory:s}))?.data?.name??"build";await this.sendAvailableCommandsUpdate(t,s);let a=[];for(let p of e.prompt)switch(p.type){case "text":{let u=p.annotations?.audience,d=u?.length===1&&u[0]==="assistant",c=u?.length===1&&u[0]==="user";a.push({type:"text",text:p.text,...d&&{synthetic:true},...c&&{ignored:true}});break}case "image":{let u=this.parseUri(p.uri??""),d=u.type==="file"?u.filename:"image";p.data?a.push({type:"file",url:`data:${p.mimeType};base64,${p.data}`,filename:d,mime:p.mimeType}):p.uri?.startsWith("http:")&&a.push({type:"file",url:p.uri,filename:d,mime:p.mimeType});break}case "resource_link":{let u=this.parseUri(p.uri);p.name&&u.type==="file"&&(u.filename=p.name),a.push(u);break}case "resource":{let u=p.resource;if("text"in u&&u.text)a.push({type:"text",text:u.text});else if("blob"in u&&u.blob&&u.mimeType){let d=this.parseUri(u.uri??""),c=d.type==="file"?d.filename:"file";a.push({type:"file",url:`data:${u.mimeType};base64,${u.blob}`,filename:c,mime:u.mimeType});}break}}A.info("prompt parts",{sessionId:t,parts:a});let g=(()=>{let p=a.filter(c=>c.type==="text").map(c=>c.text).join("").trim();if(!p.startsWith("/"))return;let[u,...d]=p.slice(1).split(/\s+/);return {name:u,args:d.join(" ").trim()}})(),P=p=>({totalTokens:p.tokens.input+p.tokens.output+p.tokens.reasoning+(p.tokens.cache?.read??0)+(p.tokens.cache?.write??0),inputTokens:p.tokens.input,outputTokens:p.tokens.output,thoughtTokens:p.tokens.reasoning||void 0,cachedReadTokens:p.tokens.cache?.read||void 0,cachedWriteTokens:p.tokens.cache?.write||void 0});if(!g){let u=(await this.sdk.session.prompt({sessionId:t,model:{providerId:r.providerId,modelId:r.modelId},parts:a,agent:l,directory:s,variant:n.variant,contextMode:n.contextMode})).data?.info;return {stopReason:"end_turn",usage:u?P(u):void 0,_meta:{}}}let I=await this.sdk.command.list({directory:s},{throwOnError:true}).then(p=>p.data?.find(u=>u.name===g.name));if(I){let p=await za.get(g.name),u=await Aa.command({sessionId:t,agent:l,model:r.providerId+"/"+r.modelId,arguments:g.args,command:I.name});if(await this.sendUsageUpdate(t,s),p?.commandType==="local"&&this.connection){let d=u.success?u.output:`[Error] ${u.error??"Command execution failed"}`;await this.connection.sessionUpdate({sessionId:t,update:{sessionUpdate:"agent_message_chunk",content:{type:"text",text:d}}});}return {stopReason:"end_turn",usage:u.info?P({tokens:{input:u.info.tokens.input,output:u.info.tokens.output,reasoning:u.info.tokens.reasoning,cache:u.info.tokens.cache}}):void 0,_meta:{}}}switch(g.name){case "compact":if(!r.providerId||!r.modelId)throw new Error("Model providerId and modelId are required for compact command");await this.sdk.session.summarize({sessionId:t,directory:s,providerId:r.providerId,modelId:r.modelId},{throwOnError:true});break}return await this.sendUsageUpdate(t,s),{stopReason:"end_turn",_meta:{}}}async cancel(e){let n=this.sessionManager.tryGet(e.sessionId)?.cwd??"";try{this.sdk&&await this.sdk.session.abort({sessionId:e.sessionId,directory:n}).catch(s=>{A.warn("SDK abort failed",{sessionId:e.sessionId,error:String(s)});}),A.info("Session cancelled",{sessionId:e.sessionId});}catch(s){throw A.error("Failed to cancel session",{sessionId:e.sessionId,error:s instanceof Error?s.message:String(s)}),s}}parseUri(e){try{if(e.startsWith("file://")){let t=e.slice(7),n=t.split("/").pop()||t;return {type:"file",url:e,filename:n,mime:"text/plain"}}if(e.startsWith("zed://")){let n=new URL(e).searchParams.get("path");if(n){let s=n.split("/").pop()||n;return {type:"file",url:pathToFileURL(n).href,filename:s,mime:"text/plain"}}}return {type:"text",text:e}}catch{return {type:"text",text:e}}}async sendUsageUpdate(e,t){if(!this.sdk||!this.connection)return;let n=await this.sdk.session.messages({sessionId:e,directory:t},{throwOnError:true}).then(g=>g.data).catch(g=>{A.error("failed to fetch messages for usage update",{error:g});});if(!n)return;let s=n.filter(g=>g.info.role==="assistant"),o=s[s.length-1];if(!o)return;let r=o.info,l=await this.getContextLimit(r.providerId,r.modelId,t);if(!l)return;let a=r.tokens.input+(r.tokens.cache?.read??0);await this.connection.sessionUpdate({sessionId:e,update:{sessionUpdate:"usage_update",used:a,size:l}});}async sendAvailableCommandsUpdate(e,t){if(this.sdk&&this.connection)try{let s=(await this.sdk.command.list({directory:t},{throwOnError:!0})).data?.map(o=>({name:o.name,description:o.description??""}))??[];await this.connection.sessionUpdate({sessionId:e,update:{sessionUpdate:"available_commands_update",availableCommands:s}});}catch(n){A.error("failed to send available commands update",{error:n});}}async sendConfigOptionUpdate(e,t,n){if(this.connection)try{let o=(n??await this.buildSessionStateResponse(e,t)).configOptions;if(!o||o.length===0)return;await this.connection.sessionUpdate({sessionId:e,update:{sessionUpdate:"config_option_update",configOptions:o}});}catch(s){A.error("failed to send config_option_update to ACP client",{sessionId:e,error:s});}}async sendCurrentModeUpdate(e,t){if(this.connection)try{await this.connection.sessionUpdate({sessionId:e,update:{sessionUpdate:"current_mode_update",currentModeId:t}});}catch(n){A.error("failed to send current_mode_update to ACP client",{sessionId:e,modeId:t,error:n});}}async getContextLimit(e,t,n){return this.sdk?(await this.sdk.config.providers({directory:n}).then(l=>l.data?.providers??[]).catch(l=>(A.error("failed to get providers for context limit",{error:l}),[]))).find(l=>l.id===e)?.models[t]?.limit.context??2e5:null}async unstable_forkSession(e){A.info("ACP forkSession requested",{sessionId:e.sessionId});let t=e.cwd,n=e.mcpServers??[],o=(await this.sdk.model.default())?.data,r=await this.sdk.session.fork({sessionId:e.sessionId,directory:t},{throwOnError:true}).then(P=>P.data);if(!r)throw new Error("Fork session returned no data");let l=r.id;await this.sessionManager.load(l,t,n,o);let g=await this.buildSessionStateResponse(l,t);return A.info("fork_session",{sessionId:l,mcpServers:n.length}),{sessionId:l,...g,_meta:{}}}async resumeSession(e){A.info("ACP resumeSession requested",{sessionId:e.sessionId});let t=e.cwd,n=e.sessionId,s=e.mcpServers??[],r=(await this.sdk.model.default())?.data;await this.sessionManager.load(n,t,s,r);let a=await this.buildSessionStateResponse(n,t);return A.info("resume_session",{sessionId:n,mcpServers:s.length}),{...a,_meta:{}}}async listSessions(e){let t=e.cursor?Number(e.cursor):void 0,n=100,o=(await this.sdk.session.list({directory:e.cwd??void 0,roots:true},{throwOnError:true}).then(I=>I.data??[])).toSorted((I,p)=>p.time.updated-I.time.updated),l=(t?o.filter(I=>I.time.updated<t):o).slice(0,n),a=l.map(I=>({sessionId:I.id,cwd:I.directory,title:I.title??`Session ${I.id}`,updatedAt:new Date(I.time.updated).toISOString()})),g=l[l.length-1],P=l.length===n&&g?String(g.time.updated):void 0;return {sessions:a,nextCursor:P}}async setSessionMode(e){A.info("ACP setSessionMode requested",{sessionId:e.sessionId,modeId:e.modeId}),this.sessionManager.setMode(e.sessionId,e.modeId);let t=this.sessionManager.get(e.sessionId);return await this.sendCurrentModeUpdate(e.sessionId,e.modeId),await this.sendConfigOptionUpdate(e.sessionId,t.cwd),{_meta:{}}}async setSessionConfigOption(e$1){if(A.info("ACP setSessionConfigOption requested",{sessionId:e$1.sessionId,configId:e$1.configId,value:e$1.value}),e$1.configId==="model"){let s=typeof e$1.value=="string"?e$1.value:void 0;if(s){let o=this.parseModelSelection(s);this.sessionManager.setModel(e$1.sessionId,o.model);}}else if(e$1.configId==="agent"){let s=typeof e$1.value=="string"?e$1.value:void 0;this.sessionManager.setAgent(e$1.sessionId,s);}else if(e$1.configId==="thought_level"){let s=typeof e$1.value=="string"?e$1.value:void 0;this.sessionManager.setVariant(e$1.sessionId,s);}else if(e$1.configId==="context_mode"){let s=typeof e$1.value=="string"&&e.includes(e$1.value)?e$1.value:void 0;this.sessionManager.setContextMode(e$1.sessionId,s);}let t=this.sessionManager.get(e$1.sessionId),n=await this.buildSessionStateResponse(e$1.sessionId,t.cwd);return await this.sendConfigOptionUpdate(e$1.sessionId,t.cwd,n),{_meta:{},configOptions:n.configOptions??[]}}async closeSession(e){return A.info("ACP closeSession requested",{sessionId:e.sessionId}),await this.cancel({sessionId:e.sessionId}),this.sessionManager.close(e.sessionId),{_meta:{}}}async buildSessionStateResponse(e$1,t){let n=this.sessionManager.tryGet(e$1),s=n?.model??(await this.sdk.model.default())?.data,o=s?.providerId&&s?.modelId?`${s.providerId}/${s.modelId}`:void 0,r=[];try{r=(await this.sdk.config.providers({directory:t}).then(u=>u.data?.providers??[])).flatMap(u=>{let d=u.models??{};return Object.keys(d).map(c=>({modelId:`${u.id}/${c}`,name:`${u.id}/${c}`}))});}catch(p){A.warn("failed to build available models for session state",{sessionId:e$1,error:p instanceof Error?p.message:String(p)});}o&&!r.some(p=>p.modelId===o)&&(r=[{modelId:o,name:o},...r]);let l=[];try{l=((await this.sdk.app.agents({directory:t})).data??[]).filter(d=>d.hidden!==!0&&d.mode!=="subagent").map(d=>({id:d.name,name:d.name,description:d.description}));}catch(p){A.warn("failed to build available agents for session state",{sessionId:e$1,error:p instanceof Error?p.message:String(p)});}let a=n?.modeId,g=n?.variant??"low",P=n?.contextMode??f,I=n?.agent??"build";return await this.sendAvailableCommandsUpdate(e$1,t),{models:o?{currentModelId:o,availableModels:r}:void 0,modes:a?{currentModeId:a,availableModes:[{id:a,name:a}]}:void 0,configOptions:[{id:"model",name:"Model",category:"model",type:"select",currentValue:o??"",options:r.map(p=>({value:p.modelId,name:p.name,description:p.description??null}))},{id:"agent",name:"Agent",category:"agent",type:"select",currentValue:I,options:l.map(p=>({value:p.id,name:p.name,description:p.description??null}))},{id:"thought_level",name:"Thought Level",category:"thought_level",type:"select",currentValue:g,options:[{value:"off",name:"Off"},{value:"low",name:"Low"},{value:"medium",name:"Medium"},{value:"high",name:"High"}]},{id:"context_mode",name:"Context Mode",category:"context_mode",type:"select",currentValue:P,options:e.map(p=>({value:p,name:p.charAt(0).toUpperCase()+p.slice(1)}))}]}}parseModelSelection(e){let{provider:t,model:n}=parseModelId(e);return t&&n?{model:{providerId:t,modelId:n}}:{model:{providerId:"unknown",modelId:e}}}setConnection(e){this.connection=e,A.info("ACPService connection updated");}getConnection(){return this.connection}abortConnection(){this.connection&&A.debug("Connection aborted");}closeConnection(){this.connection&&A.debug("Connection closed");}getConnectionRegistry(){return this.connectionRegistry}getSessionRouter(){return this.sessionRouter}createConnection(e,t,n,s){if(!this.connectionRegistry)throw new Error("ConnectionRegistry not initialized. Call initializeExecutor() first.");if(!t||!n)throw new Error("localAgentId and remoteAgentId are required");return this.connectionRegistry.connect(e,t,n,s)}async routeToConnection(e){if(!this.sessionRouter)throw new Error("SessionRouter not initialized. Call initializeExecutor() first.");return this.sessionRouter.route(e)}async dispose(){A.info("Disposing ACPService"),this.sessionManager&&(this.sessionManager.dispose?.(),A.debug("SessionManager disposed")),this.connectionRegistry&&(await this.connectionRegistry.close(),this.connectionRegistry=null,A.debug("ConnectionRegistry closed")),this.sessionRouter=null,this.executorInitialized=false,A.info("ACPService disposed");}};var q=a.create({service:"easbot-agent"}),Z=class i extends se{constructor(t,n){super(t,n);b$1(this,"acpEventBridge",null);b$1(this,"server",null);b$1(this,"isAgentInitialized",false);q.info("EasBotAgent instance created",{serviceMode:this.serviceMode});}static async create(t){q.info("creating EasBotAgent",{serviceMode:t.serviceMode});let n=t.serviceMode==="stdio",s=new i(void 0,t);if(n&&t.stdioStream){let{stream:o}=t.stdioStream,r={initialize:async a=>s.initialize(a),newSession:async a=>s.newSession(a),loadSession:async a=>s.loadSession(a),prompt:async a=>s.prompt(a),cancel:async a=>s.cancel(a),authenticate:async a=>s.authenticate(a),setSessionMode:async a=>s.setSessionMode(a),setSessionConfigOption:async a=>s.setSessionConfigOption(a),listSessions:async a=>s.listSessions(a),unstable_forkSession:async a=>s.unstable_forkSession(a),resumeSession:async a=>s.resumeSession(a),closeSession:async a=>s.closeSession(a)},l=new AgentSideConnection(()=>r,o);s.setConnection(l);}return q.info("EasBotAgent created successfully",{serviceMode:t.serviceMode,hasConnection:n&&!!t.stdioStream}),s}async initialize(t){return q.info("ACP initialize requested",{protocolVersion:t.protocolVersion}),this.isAgentInitialized||await this.initializeAgent(),{protocolVersion:t.protocolVersion,agentCapabilities:{loadSession:true,positionEncoding:"utf-8",mcpCapabilities:{http:true,sse:true},promptCapabilities:{image:true,embeddedContext:true,audio:false},sessionCapabilities:{close:{},fork:{},list:{},resume:{}},_meta:{history_scope:true,session_management:true}},agentInfo:{name:"EasBot Agent",version:a$1.getVersion(),title:"Multi-Agent Collaboration Ecosystem Agent"},authMethods:[{id:"easbot-token",name:"EasBot Token Authentication",description:"Authenticate using EasBot API token"}]}}async initializeAgent(){if(this.isAgentInitialized){q.warn("EasBotAgent already initialized");return}q.info("initializing EasBotAgent internals");try{await this.initializeExecutor(),this.config.acpServerConfig||await this.initializeAcpEventBridge(),this.isAgentInitialized=!0,this.setStatus("ready"),q.info("EasBotAgent internals initialized successfully");}catch(t){throw this.setStatus("error"),q.error("failed to initialize EasBotAgent",{error:String(t)}),t}}async start(){if(this.status==="running"){q.warn("EasBotAgent already running");return}this.isAgentInitialized||await this.initializeAgent();let t=this.config;t.acpServerConfig&&!this.server&&(this.server=await Be(this,t.acpServerConfig)),this.setStatus("running"),q.info("EasBotAgent started");}async stop(){if(this.status==="stopped"){q.warn("EasBotAgent already stopped");return}q.info("stopping EasBotAgent");try{this.server&&(await He(this.server),this.server=null),this.acpEventBridge&&(await this.acpEventBridge.stop(),this.acpEventBridge=null),await this.dispose(),this.setStatus("stopped"),this.isAgentInitialized=!1,q.info("EasBotAgent stopped successfully");}catch(t){throw this.setStatus("error"),q.error("error stopping EasBotAgent",{error:String(t)}),t}}async initializeAcpEventBridge(){if(this.acpEventBridge){q.warn("ACP event bridge already initialized");return}let n=this.config.acp?.sdk,s=this.getConnection();if(!n)throw q.error("Cannot initialize ACP event bridge: missing SDK client"),new Error("SDK client is required for ACP event bridge");if(!s)throw q.error("Cannot initialize ACP event bridge: missing ACP connection"),new Error("ACP connection is required for ACP event bridge");this.acpEventBridge=new j(n,s),this.acpEventBridge.setService(this),await this.acpEventBridge.start(),q.info("ACP event bridge initialized");}getServiceMode(){return this.serviceMode}getServerInstance(){return this.server}getSDK(){return this.sdk}};var W=class i extends Error{constructor(t,n,s){super(t);b$1(this,"type");b$1(this,"stage");b$1(this,"cause");this.type="AdapterEnvironmentInitializationError",this.stage=n,this.cause=s,Error.captureStackTrace&&Error.captureStackTrace(this,i);}},X=a.create({service:"adapter.bootstrap"}),fe;function ut(){return fe||(fe=Oa.state(async()=>({initialized:false,initPromise:null,instancePromise:null,handlersInstalled:false,directory:".easbot",sdk:null,activeChannel:null,agent:null,acpConnection:null}),async i=>{let e=i.agent;e&&await e.stop().catch(()=>{}),i.agent=null,i.sdk=null,i.acpConnection=null;})),fe}async function B(){return ut()()}function We(i){let e=["ECONNRESET","EPIPE","ETIMEDOUT","ECONNREFUSED","ENOTFOUND","EHOSTUNREACH","ENETUNREACH"],t=i.code;return e.includes(t??"")}function mt(i){i.handlersInstalled||(process.on("unhandledRejection",e=>{let t=e instanceof Error?e:new Error(String(e));We(t)||X.error("unhandled promise rejection",{error:t.message,stack:t.stack});}),process.on("uncaughtException",e=>{We(e)||(X.error("uncaught exception",{error:e.message,stack:e.stack}),process.exit(1));}),i.handlersInstalled=true);}async function gt(i){return i.instancePromise||(i.instancePromise=Oa.provide({directory:i.directory,init:qb,fn:async()=>{X.debug("instance bootstrap completed");}}).then(()=>{})),i.instancePromise}async function ht(){try{await Oa.dispose(),X.debug("instance disposed");}catch(i){X.warn("failed to dispose instance",{error:i instanceof Error?i.message:String(i)});}}var G;(u=>{function i(d,c){return d.sdk||(d.sdk=xa({directory:c})),d.sdk}function e(d){switch(d){case "http":return "http";case "stdio":return "stdio";case "websocket":return "websocket";default:return "stdio"}}async function t(d){let c=await B();if(c.initialized)return;if(c.initPromise)return c.initPromise;let f={directory:d?.directory??".easbot",initModels:d?.initModels??true,printLogs:d?.printLogs??false,logLevel:d?.logLevel??"INFO",channel:d?.channel??"stdio"};if(c.directory=f.directory,i(c,c.directory),c.activeChannel&&c.activeChannel!==f.channel)throw new Error(`Adapter already initialized with channel ${c.activeChannel}, cannot re-init with ${f.channel}`);return c.activeChannel=f.channel,c.initPromise=(async()=>{try{await a$1.init();}catch(m){throw new W("Failed to initialize global directories","global",m instanceof Error?m:void 0)}try{await a.init({logDir:a$1.Path.log,print:f.printLogs??!1,level:f.logLevel??"INFO"});}catch(m){throw new W("Failed to initialize log infrastructure","log",m instanceof Error?m:void 0)}if(f.initModels)try{b();}catch(m){throw new W("Failed to initialize models refresh","models",m instanceof Error?m:void 0)}try{mt(c);}catch(m){throw new W("Failed to install unhandled exception handlers","handlers",m instanceof Error?m:void 0)}try{await gt(c);}catch(m){throw new W("Failed to initialize instance","instance",m instanceof Error?m:void 0)}c.initialized=true;})(),c.initPromise}u.init=t;async function n(){let d=await B();if(d.initialized){await Ha.stop().catch(()=>{});try{let{MCP:c}=await import('./mcp-ZGGTG6YT.mjs'),f=await c.clients();for(let[m,h]of Object.entries(f))await h.disconnect().catch(()=>{});}catch{}d.agent&&(await d.agent.stop().catch(()=>{}),d.agent=null),await ht(),d.initialized=false,d.initPromise=null,d.instancePromise=null,d.activeChannel=null,d.sdk=null,d.agent=null,d.acpConnection=null;}}u.destroy=n;async function s(){return (await B()).initialized}u.isInitialized=s;async function o(d){let c=await B();c.agent=d;}u.setAgent=o;async function r(){return (await B()).agent}u.getAgent=r;async function l(){let c=(await B()).agent?.getServerInstance();return c||null}u.getServer=l;async function a$2(){return (await B()).sdk}u.getSDK=a$2;async function g(){return (await B()).acpConnection}u.getACPConnection=g;async function P(){let d=await B(),c=!!d.agent?.getServerInstance();return {initialized:d.initialized,directory:d.directory,activeChannel:d.activeChannel,hasSDK:!!d.sdk,hasAgent:!!d.agent,hasACPConnection:!!d.acpConnection,hasServer:c}}u.getState=P;async function I(d){await t({channel:d.channel,directory:d.directory});let c=await B(),f=i(c,c.directory);if(d.channel==="stdio")return p({directory:d.directory});if(c.agent?.getServerInstance()&&c.activeChannel&&c.activeChannel!==d.channel)throw new Error(`ACP service already started with channel ${c.activeChannel}, cannot switch to ${d.channel}`);if(c.agent){let v=c.agent.getServerInstance();if(v)return {sdk:f,agent:c.agent,server:v}}let h=await Z.create({serviceMode:e(d.channel),acp:{sdk:f},acpServerConfig:d,channel:{type:d.channel,timeout:d.timeout}});await h.start();let S=h.getServerInstance();if(!S)throw new Error("ACP server failed to start");return c.agent=h,c.activeChannel=d.channel,{sdk:f,agent:h,server:S}}u.ensureACPService=I;async function p(d){await t({channel:"stdio",directory:d.directory});let c=await B(),f=i(c,c.directory);if(c.agent)return {sdk:f,agent:c.agent};let m=new WritableStream({write(E){return new Promise((k,R)=>{try{process.stdout.write(E)?k():process.stdout.once("drain",k);}catch(D){let b=D;b.code==="EPIPE"||b.code==="EIO"?R(new Error("stdout pipe broken")):R(D);}})}}),h=new ReadableStream({start(E){process.stdin.on("data",k=>{E.enqueue(new Uint8Array(k));}),process.stdin.on("end",()=>E.close()),process.stdin.on("error",k=>E.error(k));}}),S=ndJsonStream(m,h),v=await Z.create({serviceMode:"stdio",acp:{sdk:f},channel:{type:"stdio",timeout:6e4},stdioStream:{stream:S}});return c.acpConnection=v.getConnection()??null,await v.start(),c.agent=v,c.activeChannel="stdio",X.info("Stdio ACP service started, waiting for client..."),process.stdin.resume(),{sdk:f,agent:v}}u.ensureACPServiceStdio=p;})(G||(G={}));var x=a.create({service:"cli-command-acp"});async function vt(i,e){let t=await pb.getACPServerConfig();x.debug("Merging ACP configuration",{baseConfig:{channel:t.channel,port:t.port,hostname:t.hostname,timeout:t.timeout},cliOptions:{channel:e.channel,port:e.port,hostname:e.hostname,timeout:e.timeout}});let n={};if(e.channel!==void 0){let o=e.channel.toLowerCase();Object.values(Q$1).includes(o)?(n.channel=o,x.debug("CLI override: channel",{value:n.channel})):x.warn("Invalid channel type from command line",{value:e.channel});}if(e.port!==void 0&&(e.port>0&&e.port<=65535?(n.port=e.port,x.debug("CLI override: port",{value:n.port})):x.warn("Invalid port from command line",{value:e.port})),e.hostname!==void 0&&(n.hostname=e.hostname,x.debug("CLI override: hostname",{value:n.hostname})),e.timeout!==void 0&&(e.timeout>0?(n.timeout=e.timeout,x.debug("CLI override: timeout",{value:n.timeout})):x.warn("Invalid timeout from command line",{value:e.timeout})),e.hostname!==void 0||e.port!==void 0){let o=e.hostname??t.hostname??"127.0.0.1",r=e.port??t.port??3e3;t.ws&&(n.ws={...t.ws,url:`ws://${o}:${r}`}),t.http&&(n.http={...t.http,baseUrl:`http://${o}:${r}`}),x.debug("CLI override: ws.url and http.baseUrl updated",{hostname:e.hostname,port:e.port,wsUrl:n.ws?.url,httpBaseUrl:n.http?.baseUrl});}e.timeout!==void 0&&(n.ws||n.http)&&(n.ws&&(n.ws.timeout=e.timeout),n.http&&(n.http.timeout=e.timeout),x.debug("CLI override: ws.timeout and http.timeout updated",{timeout:e.timeout}));let s={...t,...n};return x.debug("Merged ACP configuration",{channel:s.channel,port:s.port,hostname:s.hostname,timeout:s.timeout}),s}async function Ct(i$2,e,t){x.info("Starting ACP service",{channel:e.channel,port:e.port,hostname:e.hostname,debug:t.config.debug}),await G.init({directory:i$2,printLogs:t.config.print_logs,logLevel:t.config.log_level,channel:e.channel});await G.ensureACPService(e);console.log(""),console.log(d(i("acp.server.started"))),console.log(k(60)),console.log(i$1(i("acp.field.directory"),i$2,15)),console.log(i$1(i("acp.field.worktree"),Oa.project.worktree||"N/A",15)),console.log(i$1(i("acp.field.channel"),e.channel,15));let s=b$2();switch(e.channel){case "websocket":{let r,l="/";if(e.ws?.url)try{let a=new URL(e.ws.url),g=a.port||"3000",P=a.hostname;l=a.pathname||"/",r=`ws://${P}:${g}${l==="/"?"":l}`;}catch{r=e.ws.url;}else r=`ws://${e.hostname}:${e.port}`;console.log(i$1(i("acp.field.ws_url"),r,15)),console.log(i$1(i("acp.field.ws_path"),l,15)),e.ws?(console.log(h(i("acp.websocket.config"))),console.log(i$1(i("acp.field.timeout"),`${e.ws.timeout??e.timeout}ms`,15)),console.log(i$1(i("acp.field.batch_size"),`${e.ws.batchSize??10}`,15)),console.log(i$1(i("acp.field.batch_interval"),`${e.ws.batchInterval??50}ms`,15)),console.log(i$1(i("acp.field.heartbeat"),`${e.ws.heartbeatInterval??3e4}ms`,15))):console.log(i$1(i("acp.field.timeout"),`${e.timeout}ms`,15));break}case "http":e.http?.baseUrl?console.log(i$1(i("acp.field.base_url"),e.http.baseUrl,15)):console.log(i$1(i("acp.field.host"),`${e.hostname}:${e.port}`,15)),e.http?.timeout?console.log(i$1(i("acp.field.timeout"),`${e.http.timeout}ms`,15)):console.log(i$1(i("acp.field.timeout"),`${e.timeout}ms`,15));break;case "stdio":console.log(i$1(i("acp.field.mode"),i("acp.mode.stdio"),15)),console.log(i$1(i("acp.field.protocol"),i("acp.protocol"),15)),console.log(i$1(i("acp.field.timeout"),`${e.timeout}ms`,15));break;default:console.log(i$1(i("acp.field.host"),`${e.hostname}:${e.port}`,15)),console.log(i$1(i("acp.field.timeout"),`${e.timeout}ms`,15));}console.log(i$1(i("acp.field.debug"),t.config.debug?c(s,a$4.success,i("common.enabled")):c(s,a$4.muted,i("common.disabled")),15));let o=getProxyConfig();if(o.enabled){let r=o.https||o.http||"configured";console.log(i$1(i("acp.field.proxy"),r,15));}console.log(k(60)),console.log(""),x.info("ACPServer started successfully"),yt();}function yt(){let i$1=process.env.EASBOT_RUN_MODE==="ephemeral"||!process.stdin.isTTY&&process.env.EASBOT_RUN_MODE!=="persistent",e=async t=>{x.debug(`Received ${t}, shutting down...`),i$1||console.log(`
8
8
  ${i("acp.shutdown.received",{vars:{signal:t}})}`);try{await G.destroy(),x.debug("EasbotAdapter state destroyed"),i$1||console.log(d(i("acp.shutdown.completed")));}catch(n){x.error("Error during shutdown",{error:n instanceof Error?n.message:String(n)});}i$1?process.kill(process.pid,"SIGKILL"):process.exit(0);};process.on("SIGINT",()=>{e("SIGINT").catch(console.error);}),process.on("SIGTERM",()=>{e("SIGTERM").catch(console.error);}),process.stdout.on("error",t=>{(t.code==="EPIPE"||t.code==="EIO")&&(x.info("stdout pipe broken, exiting"),e("stdout-broken").catch(()=>{i$1?process.kill(process.pid,"SIGKILL"):process.exit(0);}));});}async function wt(i$1,e,t){x.debug("ACP command executed",{options:e});let n=t?.config?.debug??false,s=t?.config?.print_logs??false,o=t?.config?.log_level??"INFO";x.debug("Global options from context",{debug:t?.config?.debug,print_logs:t?.config?.print_logs,log_level:t?.config?.log_level,isDebug:n,printLogs:s,logLevel:o});try{let r=t.config.directory?Ke.resolve(t.config.directory):process.cwd();x.debug("Working directory resolved",{directory:r});let l=a$2(r);if(!l.valid)throw x.error("Working directory validation failed",{directory:r,error:l.error}),new Error(`Invalid working directory: ${l.error}`);let a=l.normalizedPath;x.debug("Working directory validated",{validatedDirectory:a}),console.log(g(i("acp.directory.resolved",{vars:{cwd:a}}))),await a$3(a,async()=>{let g$1=await vt(a,e);if(x.debug("ACP server configuration",{channel:g$1.channel,port:g$1.port,hostname:g$1.hostname,timeout:g$1.timeout,enabled:g$1.enabled}),!g$1.enabled){x.warn("ACP server is disabled by configuration"),console.log(g(i("acp.disabled")));return}await Ct(a,g$1,t),x.info("ACP server started successfully");});}catch(r){x.error("Failed to start ACP server",{error:r instanceof Error?r.message:String(r)}),console.error(e$1(i("acp.error.start_failed",{vars:{error:r instanceof Error?r.message:String(r)}}))),process.exit(1);}}function go(i$1,e){let t=i$1.command("acp").description(i("acp.command.description")).addHelpText("after",`
9
9
 
10
10
  ${i("acp.help.examples")}
@@ -0,0 +1 @@
1
+ export{U as getACPClientsConfig,T as getACPServerConfig,X as getAcpAgentName,V as getAcpAgentRuntimeConfig,W as getAcpModelConfig,S as loadACPConfig}from'./chunk-FWVB6X4X.mjs';import'./chunk-CCRIJZBK.mjs';import'./chunk-D4GDS5UI.mjs';import'./chunk-75IQNF4I.mjs';import'./chunk-ZBRXNYEM.mjs';import'./chunk-UBCLKZWP.mjs';import'./chunk-2RSIOAZV.mjs';import'./chunk-AAJAKVQY.mjs';import'./chunk-UNBJ6Y7L.mjs';import'./chunk-X7KLQIAQ.mjs';import'./chunk-KTMZPMCI.mjs';import'./chunk-CJTCCLW4.mjs';import'./chunk-GRDTQW6K.mjs';import'./chunk-LFYBZHOI.mjs';import'./chunk-SB4J2R54.mjs';import'./chunk-X6ISXWBN.mjs';
@@ -1 +1 @@
1
- import {a as a$3}from'./chunk-TYD2M4SP.mjs';import'./chunk-FXOUIXIL.mjs';import {a as a$2}from'./chunk-3Q4UCILK.mjs';import'./chunk-CQVEAYYW.mjs';import {l,d,e,h,i as i$1,b,c,a as a$4}from'./chunk-M3K32WJV.mjs';import'./chunk-YGFGAD5H.mjs';import'./chunk-CCRIJZBK.mjs';import'./chunk-XQXI2ZHB.mjs';import'./chunk-ZFGVQIO5.mjs';import'./chunk-ZBRXNYEM.mjs';import'./chunk-H45MZAM6.mjs';import'./chunk-2RSIOAZV.mjs';import'./chunk-AAJAKVQY.mjs';import {i}from'./chunk-UNBJ6Y7L.mjs';import'./chunk-ZG2HQDXQ.mjs';import'./chunk-O2JOXYKG.mjs';import'./chunk-CJTCCLW4.mjs';import'./chunk-JII5HRIF.mjs';import {a as a$1}from'./chunk-LFYBZHOI.mjs';import'./chunk-DJYON7M6.mjs';import'./chunk-X6ISXWBN.mjs';var a=a$1.create({service:"cli-command-agent"});function W(C,c$1){let y=C.command("agent").description(i("agent.command.description"));y.command("list").description(i("agent.command.list.description")).action(async()=>{await a$2(c$1.config.directory,async()=>{try{a.debug("Listing agents");let{data:o}=await c$1.sdk.app.agents({});if(!o||o.length===0){console.log(l(i("agent.list.empty")));return}let r=[...o].sort((n,t)=>{let g="native"in n&&n.native,d="native"in t&&t.native;return g!==d?g?-1:1:n.name.localeCompare(t.name)});console.log(d(i("agent.list.success",{vars:{count:o.length}}))),console.log(""),console.log(a$3({columns:[{key:"name",header:i("agent.table.header.name"),minWidth:15},{key:"mode",header:i("agent.table.header.mode"),minWidth:10},{key:"native",header:i("agent.table.header.native"),minWidth:8}],rows:r.map(n=>({name:n.name,mode:"mode"in n&&n.mode||"primary",native:"native"in n&&n.native?i("common.yes"):i("common.no")})),width:process.stdout.columns||80,border:"unicode"})),a.debug("Agent list displayed",{count:o.length});}catch(o){a.error("Failed to list agents",{error:o instanceof Error?o.message:String(o)}),console.error(e(i("agent.list.error"))),process.exit(1);}});}),y.command("info <agent-id>").description(i("agent.command.info.description")).action(async o=>{await a$2(c$1.config.directory,async()=>{try{a.debug("Getting agent info",{agentId:o});let{data:r}=await c$1.sdk.app.agents({}),n=r?.find(t=>t.name===o);if(n||(console.error(e(i("agent.get.not_found",{vars:{agentId:o}}))),process.exit(1)),console.log(d(i("agent.get.success"))),console.log(""),console.log(h(i("agent.info.heading"))),console.log(""),console.log(i$1(i("agent.info.field.name")+":",n.name)),console.log(i$1(i("agent.info.field.mode")+":","mode"in n&&n.mode||"primary")),console.log(i$1(i("agent.info.field.native")+":","native"in n&&n.native?i("common.yes"):i("common.no"))),"permission"in n&&n.permission){console.log(i$1(i("agent.info.field.permission")+":",""));let t=b();console.log(c(t,a$4.muted,JSON.stringify(n.permission,null,2)));}a.debug("Agent info displayed",{agentId:o});}catch(r){a.error("Failed to get agent info",{agentId:o,error:r instanceof Error?r.message:String(r)}),console.error(e(i("agent.get.error"))),process.exit(1);}});}),y.command("create").description(i("agent.command.create.description")).requiredOption("--name <name>",i("agent.command.create.option.name")).option("--mode <mode>",i("agent.command.create.option.mode"),"chat").option("--permission <json>",i("agent.command.create.option.permission")).action(async o=>{await a$2(c$1.config.directory,async()=>{try{a.debug("Creating agent",{name:o.name,mode:o.mode}),console.log(h(i("agent.create.begin")));let{validateAgentName:r,validateAgentMode:n,validateJsonString:t}=await import('./input-validation-FWKKVCYC.mjs');r(o.name)||(a.error("Invalid agent name",{name:o.name}),console.error(e(i("agent.create.validation.name"))),process.exit(1));let g=o.mode||"primary";n(g)||(a.error("Invalid agent mode",{mode:o.mode}),console.error(e(i("agent.create.validation.mode"))),process.exit(1));let d$1;if(o.permission){let l=t(o.permission,"permission");l||(a.error("Invalid permission JSON format",{permission:o.permission}),console.error(e(i("agent.create.error",{vars:{error:"Invalid permission JSON format"}}))),process.exit(1)),d$1=l;}let{data:m}=await c$1.sdk.agent.create({name:o.name,mode:g,permission:d$1});if(m||(console.error(e(i("agent.create.error",{vars:{error:"Agent creation failed"}}))),process.exit(1)),console.log(d(i("agent.create.success",{vars:{name:m.name}}))),console.log(""),console.log(h(i("agent.info.heading"))),console.log(""),console.log(i$1(i("agent.info.field.name")+":",m.name)),console.log(i$1(i("agent.info.field.mode")+":",m.mode??"all")),console.log(i$1(i("agent.info.field.native")+":",m.native?i("common.yes"):i("common.no"))),m.permission){console.log(i$1(i("agent.info.field.permission")+":",""));let l=b();console.log(c(l,a$4.muted,JSON.stringify(m.permission,null,2)));}a.debug("Agent created successfully",{name:m.name});}catch(r){a.error("Failed to create agent",{name:o.name,error:r instanceof Error?r.message:String(r)}),console.error(e(i("agent.create.error",{vars:{error:r instanceof Error?r.message:String(r)}}))),process.exit(1);}});});}export{W as registerAgentCommands};
1
+ import {a as a$3}from'./chunk-TYD2M4SP.mjs';import'./chunk-FXOUIXIL.mjs';import {a as a$2}from'./chunk-R4BPTF6V.mjs';import'./chunk-CQVEAYYW.mjs';import {l,d,e,h,i as i$1,b,c,a as a$4}from'./chunk-M3K32WJV.mjs';import'./chunk-FWVB6X4X.mjs';import'./chunk-CCRIJZBK.mjs';import'./chunk-D4GDS5UI.mjs';import'./chunk-75IQNF4I.mjs';import'./chunk-ZBRXNYEM.mjs';import'./chunk-UBCLKZWP.mjs';import'./chunk-2RSIOAZV.mjs';import'./chunk-AAJAKVQY.mjs';import {i}from'./chunk-UNBJ6Y7L.mjs';import'./chunk-X7KLQIAQ.mjs';import'./chunk-KTMZPMCI.mjs';import'./chunk-CJTCCLW4.mjs';import'./chunk-GRDTQW6K.mjs';import {a as a$1}from'./chunk-LFYBZHOI.mjs';import'./chunk-SB4J2R54.mjs';import'./chunk-X6ISXWBN.mjs';var a=a$1.create({service:"cli-command-agent"});function W(C,c$1){let y=C.command("agent").description(i("agent.command.description"));y.command("list").description(i("agent.command.list.description")).action(async()=>{await a$2(c$1.config.directory,async()=>{try{a.debug("Listing agents");let{data:o}=await c$1.sdk.app.agents({});if(!o||o.length===0){console.log(l(i("agent.list.empty")));return}let r=[...o].sort((n,t)=>{let g="native"in n&&n.native,d="native"in t&&t.native;return g!==d?g?-1:1:n.name.localeCompare(t.name)});console.log(d(i("agent.list.success",{vars:{count:o.length}}))),console.log(""),console.log(a$3({columns:[{key:"name",header:i("agent.table.header.name"),minWidth:15},{key:"mode",header:i("agent.table.header.mode"),minWidth:10},{key:"native",header:i("agent.table.header.native"),minWidth:8}],rows:r.map(n=>({name:n.name,mode:"mode"in n&&n.mode||"primary",native:"native"in n&&n.native?i("common.yes"):i("common.no")})),width:process.stdout.columns||80,border:"unicode"})),a.debug("Agent list displayed",{count:o.length});}catch(o){a.error("Failed to list agents",{error:o instanceof Error?o.message:String(o)}),console.error(e(i("agent.list.error"))),process.exit(1);}});}),y.command("info <agent-id>").description(i("agent.command.info.description")).action(async o=>{await a$2(c$1.config.directory,async()=>{try{a.debug("Getting agent info",{agentId:o});let{data:r}=await c$1.sdk.app.agents({}),n=r?.find(t=>t.name===o);if(n||(console.error(e(i("agent.get.not_found",{vars:{agentId:o}}))),process.exit(1)),console.log(d(i("agent.get.success"))),console.log(""),console.log(h(i("agent.info.heading"))),console.log(""),console.log(i$1(i("agent.info.field.name")+":",n.name)),console.log(i$1(i("agent.info.field.mode")+":","mode"in n&&n.mode||"primary")),console.log(i$1(i("agent.info.field.native")+":","native"in n&&n.native?i("common.yes"):i("common.no"))),"permission"in n&&n.permission){console.log(i$1(i("agent.info.field.permission")+":",""));let t=b();console.log(c(t,a$4.muted,JSON.stringify(n.permission,null,2)));}a.debug("Agent info displayed",{agentId:o});}catch(r){a.error("Failed to get agent info",{agentId:o,error:r instanceof Error?r.message:String(r)}),console.error(e(i("agent.get.error"))),process.exit(1);}});}),y.command("create").description(i("agent.command.create.description")).requiredOption("--name <name>",i("agent.command.create.option.name")).option("--mode <mode>",i("agent.command.create.option.mode"),"chat").option("--permission <json>",i("agent.command.create.option.permission")).action(async o=>{await a$2(c$1.config.directory,async()=>{try{a.debug("Creating agent",{name:o.name,mode:o.mode}),console.log(h(i("agent.create.begin")));let{validateAgentName:r,validateAgentMode:n,validateJsonString:t}=await import('./input-validation-FWKKVCYC.mjs');r(o.name)||(a.error("Invalid agent name",{name:o.name}),console.error(e(i("agent.create.validation.name"))),process.exit(1));let g=o.mode||"primary";n(g)||(a.error("Invalid agent mode",{mode:o.mode}),console.error(e(i("agent.create.validation.mode"))),process.exit(1));let d$1;if(o.permission){let l=t(o.permission,"permission");l||(a.error("Invalid permission JSON format",{permission:o.permission}),console.error(e(i("agent.create.error",{vars:{error:"Invalid permission JSON format"}}))),process.exit(1)),d$1=l;}let{data:m}=await c$1.sdk.agent.create({name:o.name,mode:g,permission:d$1});if(m||(console.error(e(i("agent.create.error",{vars:{error:"Agent creation failed"}}))),process.exit(1)),console.log(d(i("agent.create.success",{vars:{name:m.name}}))),console.log(""),console.log(h(i("agent.info.heading"))),console.log(""),console.log(i$1(i("agent.info.field.name")+":",m.name)),console.log(i$1(i("agent.info.field.mode")+":",m.mode??"all")),console.log(i$1(i("agent.info.field.native")+":",m.native?i("common.yes"):i("common.no"))),m.permission){console.log(i$1(i("agent.info.field.permission")+":",""));let l=b();console.log(c(l,a$4.muted,JSON.stringify(m.permission,null,2)));}a.debug("Agent created successfully",{name:m.name});}catch(r){a.error("Failed to create agent",{name:o.name,error:r instanceof Error?r.message:String(r)}),console.error(e(i("agent.create.error",{vars:{error:r instanceof Error?r.message:String(r)}}))),process.exit(1);}});});}export{W as registerAgentCommands};
@@ -1 +1 @@
1
- import {e}from'./chunk-M3K32WJV.mjs';import {j,na,k,Ma}from'./chunk-YGFGAD5H.mjs';import'./chunk-CCRIJZBK.mjs';import'./chunk-XQXI2ZHB.mjs';import'./chunk-ZFGVQIO5.mjs';import'./chunk-ZBRXNYEM.mjs';import'./chunk-H45MZAM6.mjs';import'./chunk-2RSIOAZV.mjs';import'./chunk-AAJAKVQY.mjs';import {i}from'./chunk-UNBJ6Y7L.mjs';import'./chunk-ZG2HQDXQ.mjs';import'./chunk-O2JOXYKG.mjs';import'./chunk-CJTCCLW4.mjs';import'./chunk-JII5HRIF.mjs';import {a}from'./chunk-LFYBZHOI.mjs';import'./chunk-DJYON7M6.mjs';import'./chunk-X6ISXWBN.mjs';import {basename}from'path';import {iife,Identifier}from'@easbot/utils';var b=a.create({service:"debug.agent"});function z(r,o,e$1){(async()=>{b.debug("Getting agent info",{agentName:o});let t=(await r.sdk.agent.get({agentId:o})).data;t||(console.error(e(i("debug.agent.error.not_found",{vars:{agentName:o,command:basename(process.execPath)}}))),process.exit(1));let a=t,l=await P(a),i$1=await T(a,l);if(e$1.tool){let c=l.find(x=>x.id===e$1.tool);c||(console.error(e(i("debug.agent.tool.error.not_found",{vars:{toolID:e$1.tool,agentName:o}}))),process.exit(1)),i$1[e$1.tool]===false&&(console.error(e(i("debug.agent.tool.error.disabled",{vars:{toolID:e$1.tool,agentName:o}}))),process.exit(1));let g=E(e$1.params),y=await R(a,r);b.debug("Executing tool",{toolID:e$1.tool,params:g});let A=await c.execute(g,y);console.log(JSON.stringify({tool:e$1.tool,input:g,result:A},null,2));return}let m={...t,tools:i$1};console.log(JSON.stringify(m,null,2));})();}async function P(r){let o=r.model??await j.defaultModel();return o.providerId||(o={...o,providerId:"default-provider"}),na.tools(o,r)}async function T(r,o){let e=k.disabled(o.map(t=>t.id),r.permission),s={};for(let t of o)s[t.id]=!e.has(t.id);return s}function E(r){if(!r)return {};let o=r.trim();if(o.length===0)return {};let e=iife(()=>{try{return JSON.parse(o)}catch(s){try{return new Function(`return (${o})`)()}catch(t){throw new Error(i("debug.agent.tool.params.parse_error",{vars:{jsonError:s,evalError:t}}))}}});if(!e||typeof e!="object"||Array.isArray(e))throw new Error(i("debug.agent.tool.params.must_be_object"));return e}async function R(r,o){let e=await Ma.create({title:`Debug tool run (${r.name})`}),s=Identifier.ascending("message"),t=r.model??await j.defaultModel();t.providerId||(t={...t,providerId:t.providerId||"default-provider"});let a=Date.now(),l={id:s,sessionId:e.id,role:"assistant",time:{created:a},parentId:s,modelId:t.modelId,providerId:t.providerId,mode:"debug",agent:r.name,path:{cwd:o.config.directory,root:o.config.worktree},cost:0,tokens:{input:0,output:0,reasoning:0,cache:{read:0,write:0}}};await Ma.updateMessage(l);let i=k.merge(r.permission,e.permission??[]);return {sessionId:e.id,messageId:s,callId:Identifier.ascending("part"),agent:r.name,abort:new AbortController().signal,messages:[],metadata:()=>{},async ask(m){for(let c of m.patterns)if(k.evaluate(m.permission,c,i).action==="deny")throw new k.DeniedError(i)}}}export{z as registerAgentCommand};
1
+ import {e}from'./chunk-M3K32WJV.mjs';import {j,na,k,Ma}from'./chunk-FWVB6X4X.mjs';import'./chunk-CCRIJZBK.mjs';import'./chunk-D4GDS5UI.mjs';import'./chunk-75IQNF4I.mjs';import'./chunk-ZBRXNYEM.mjs';import'./chunk-UBCLKZWP.mjs';import'./chunk-2RSIOAZV.mjs';import'./chunk-AAJAKVQY.mjs';import {i}from'./chunk-UNBJ6Y7L.mjs';import'./chunk-X7KLQIAQ.mjs';import'./chunk-KTMZPMCI.mjs';import'./chunk-CJTCCLW4.mjs';import'./chunk-GRDTQW6K.mjs';import {a}from'./chunk-LFYBZHOI.mjs';import'./chunk-SB4J2R54.mjs';import'./chunk-X6ISXWBN.mjs';import {basename}from'path';import {iife,Identifier}from'@easbot/utils';var b=a.create({service:"debug.agent"});function z(r,o,e$1){(async()=>{b.debug("Getting agent info",{agentName:o});let t=(await r.sdk.agent.get({agentId:o})).data;t||(console.error(e(i("debug.agent.error.not_found",{vars:{agentName:o,command:basename(process.execPath)}}))),process.exit(1));let a=t,l=await P(a),i$1=await T(a,l);if(e$1.tool){let c=l.find(x=>x.id===e$1.tool);c||(console.error(e(i("debug.agent.tool.error.not_found",{vars:{toolID:e$1.tool,agentName:o}}))),process.exit(1)),i$1[e$1.tool]===false&&(console.error(e(i("debug.agent.tool.error.disabled",{vars:{toolID:e$1.tool,agentName:o}}))),process.exit(1));let g=E(e$1.params),y=await R(a,r);b.debug("Executing tool",{toolID:e$1.tool,params:g});let A=await c.execute(g,y);console.log(JSON.stringify({tool:e$1.tool,input:g,result:A},null,2));return}let m={...t,tools:i$1};console.log(JSON.stringify(m,null,2));})();}async function P(r){let o=r.model??await j.defaultModel();return o.providerId||(o={...o,providerId:"default-provider"}),na.tools(o,r)}async function T(r,o){let e=k.disabled(o.map(t=>t.id),r.permission),s={};for(let t of o)s[t.id]=!e.has(t.id);return s}function E(r){if(!r)return {};let o=r.trim();if(o.length===0)return {};let e=iife(()=>{try{return JSON.parse(o)}catch(s){try{return new Function(`return (${o})`)()}catch(t){throw new Error(i("debug.agent.tool.params.parse_error",{vars:{jsonError:s,evalError:t}}))}}});if(!e||typeof e!="object"||Array.isArray(e))throw new Error(i("debug.agent.tool.params.must_be_object"));return e}async function R(r,o){let e=await Ma.create({title:`Debug tool run (${r.name})`}),s=Identifier.ascending("message"),t=r.model??await j.defaultModel();t.providerId||(t={...t,providerId:t.providerId||"default-provider"});let a=Date.now(),l={id:s,sessionId:e.id,role:"assistant",time:{created:a},parentId:s,modelId:t.modelId,providerId:t.providerId,mode:"debug",agent:r.name,path:{cwd:o.config.directory,root:o.config.worktree},cost:0,tokens:{input:0,output:0,reasoning:0,cache:{read:0,write:0}}};await Ma.updateMessage(l);let i=k.merge(r.permission,e.permission??[]);return {sessionId:e.id,messageId:s,callId:Identifier.ascending("part"),agent:r.name,abort:new AbortController().signal,messages:[],metadata:()=>{},async ask(m){for(let c of m.patterns)if(k.evaluate(m.permission,c,i).action==="deny")throw new k.DeniedError(i)}}}export{z as registerAgentCommand};
@@ -0,0 +1 @@
1
+ export{h as createTuiApp,g as getGlobalErrorHandler,e as registerGlobalErrorHandler,f as unregisterGlobalErrorHandler}from'./chunk-EM2QJ5NQ.mjs';import'./chunk-CQVEAYYW.mjs';import'./chunk-FWVB6X4X.mjs';import'./chunk-CCRIJZBK.mjs';import'./chunk-D4GDS5UI.mjs';import'./chunk-75IQNF4I.mjs';import'./chunk-ZBRXNYEM.mjs';import'./chunk-UBCLKZWP.mjs';import'./chunk-2RSIOAZV.mjs';import'./chunk-AAJAKVQY.mjs';import'./chunk-UNBJ6Y7L.mjs';import'./chunk-X7KLQIAQ.mjs';import'./chunk-KTMZPMCI.mjs';import'./chunk-CJTCCLW4.mjs';import'./chunk-GRDTQW6K.mjs';import'./chunk-LFYBZHOI.mjs';import'./chunk-SB4J2R54.mjs';import'./chunk-X6ISXWBN.mjs';
@@ -0,0 +1 @@
1
+ export{a as bootstrap,b as bootstrapProgram}from'./chunk-R4BPTF6V.mjs';import'./chunk-FWVB6X4X.mjs';import'./chunk-CCRIJZBK.mjs';import'./chunk-D4GDS5UI.mjs';import'./chunk-75IQNF4I.mjs';import'./chunk-ZBRXNYEM.mjs';import'./chunk-UBCLKZWP.mjs';import'./chunk-2RSIOAZV.mjs';import'./chunk-AAJAKVQY.mjs';import'./chunk-UNBJ6Y7L.mjs';import'./chunk-X7KLQIAQ.mjs';import'./chunk-KTMZPMCI.mjs';import'./chunk-CJTCCLW4.mjs';import'./chunk-GRDTQW6K.mjs';import'./chunk-LFYBZHOI.mjs';import'./chunk-SB4J2R54.mjs';import'./chunk-X6ISXWBN.mjs';
@@ -1,4 +1,4 @@
1
- import {b as b$1}from'./chunk-IXO5FAWI.mjs';import {a as a$1}from'./chunk-XPF2LJT2.mjs';import {Oa,xa}from'./chunk-YGFGAD5H.mjs';import'./chunk-CCRIJZBK.mjs';import'./chunk-XQXI2ZHB.mjs';import'./chunk-ZFGVQIO5.mjs';import'./chunk-ZBRXNYEM.mjs';import'./chunk-H45MZAM6.mjs';import'./chunk-2RSIOAZV.mjs';import'./chunk-AAJAKVQY.mjs';import {i}from'./chunk-UNBJ6Y7L.mjs';import'./chunk-ZG2HQDXQ.mjs';import {b as b$2}from'./chunk-O2JOXYKG.mjs';import'./chunk-CJTCCLW4.mjs';import'./chunk-JII5HRIF.mjs';import {a}from'./chunk-LFYBZHOI.mjs';import'./chunk-DJYON7M6.mjs';import'./chunk-X6ISXWBN.mjs';import {Command}from'commander';import'path';import O from'fs/promises';import {parse}from'jsonc-parser';var y="easbot",h="EASBot - Multi-Agent Collaboration Ecosystem CLI Tool",P="build",x=["main","ops","explorer"];var b=a.create({service:"cli-config"});async function N(t){try{let o=await O.readFile(t,"utf-8");return parse(o)||{}}catch(o){if(o&&typeof o=="object"&&"code"in o){if(o.code==="ENOENT")return {};b.warn("Failed to read config file",{filePath:t,error:o.code});}else b.error("Failed to parse config file",{filePath:t,error:o instanceof Error?o.message:String(o)});return {}}}function T(...t){let o={};for(let n of t)for(let[e,i]of Object.entries(n))i!==void 0&&(typeof i=="object"&&!Array.isArray(i)&&i!==null?o[e]={...o[e],...i}:o[e]=i);return o}function k(){return {server:{port:3e3,hostname:"localhost"},agent:{},model:{},permission:{}}}async function w(t={}){let{cwd:o=process.cwd(),customConfigPath:n}=t,e=k();if(t.sdk)try{let{data:i}=await t.sdk.config.get({});i&&(e=i);}catch{}if(n){let i=await N(n);Object.keys(i).length>0&&(e=T(e,i));}return e.directory=o,e}async function A(t={}){let o=t.cwd||process.cwd(),n=t.root||Oa.worktree,e=xa({directory:o}),i=await w({cwd:o,root:n,sdk:e,customConfigPath:t.customConfigPath});return {programVersion:b$2.getVersion(),channelOptions:["stdio","http","ws"],agentOptions:`${i.default_agent||P}|${x.join("|")}`,config:i,sdk:e}}var j=[{commands:[{name:"tui",description:"\u542F\u52A8 TUI \u754C\u9762",hasSubcommands:false}],register:async({program:t,ctx:o})=>{(await import('./tui-ABXWVS6I.mjs')).registerTuiCommand(t,o);}},{commands:[{name:"run",description:"\u8FD0\u884C\u5355\u6B21\u5BF9\u8BDD",hasSubcommands:false}],register:async({program:t,ctx:o})=>{(await import('./run-PN7YADL6.mjs')).registerRunCommand(t,o);}},{commands:[{name:"generate",description:"\u751F\u6210 OpenAPI \u89C4\u8303",hasSubcommands:false}],register:async({program:t,ctx:o})=>{(await import('./generate-JBIFOTPV.mjs')).registerGenerateCommand(t,o);}},{commands:[{name:"agent",description:"Agent \u7BA1\u7406\u547D\u4EE4",hasSubcommands:true}],register:async({program:t,ctx:o})=>{(await import('./agent-SXVN3QRB.mjs')).registerAgentCommands(t,o);}},{commands:[{name:"session",description:"\u4F1A\u8BDD\u7BA1\u7406\u547D\u4EE4",hasSubcommands:true}],register:async({program:t,ctx:o})=>{let{registerSessionCommands:n}=await import('./session-FVNB4WZV.mjs');n(t,o);}},{commands:[{name:"mcp",description:"MCP \u670D\u52A1\u5668\u7BA1\u7406",hasSubcommands:true}],register:async({program:t,ctx:o})=>{(await import('./mcp-X4FA7X53.mjs')).registerMcpCommands(t,o);}},{commands:[{name:"acp",description:"ACP Agent \u901A\u4FE1\u9002\u914D\u5668\u547D\u4EE4",hasSubcommands:true}],register:async({program:t,ctx:o})=>{(await import('./acp-SMAI7EJF.mjs')).registerAcpCommand(t,o);}},{commands:[{name:"debug",description:"\u8C03\u8BD5\u548C\u8BCA\u65AD\u5DE5\u5177",hasSubcommands:true}],register:async({program:t,ctx:o})=>{(await import('./debug-LXNXB4VY.mjs')).registerDebugCommands(t,o);}},{commands:[{name:"gateway",description:"Gateway \u670D\u52A1\u7BA1\u7406\u547D\u4EE4",hasSubcommands:true}],register:async({program:t,ctx:o})=>{(await import('./gateway-HTBKKYKV.mjs')).registerGatewayCommand(t,o);}},{commands:[{name:"auth",description:"Provider \u51ED\u636E\u7BA1\u7406",hasSubcommands:true}],register:async({program:t,ctx:o})=>{(await import('./auth-SUHJJM24.mjs')).registerAuthCommand(t,o);}},{commands:[{name:"export",description:"\u5BFC\u51FA\u4F1A\u8BDD\u6570\u636E",hasSubcommands:false}],register:async({program:t,ctx:o})=>{(await import('./export-4CIOZYMY.mjs')).registerExportCommand(t,o);}},{commands:[{name:"github",description:"GitHub Agent \u7BA1\u7406",hasSubcommands:true}],register:async({program:t,ctx:o})=>{(await import('./github-XXJJ62IF.mjs')).registerGithubCommand(t,o);}},{commands:[{name:"import",description:"\u5BFC\u5165\u4F1A\u8BDD\u6570\u636E",hasSubcommands:false}],register:async({program:t,ctx:o})=>{(await import('./import-37R7O4NM.mjs')).registerImportCommand(t,o);}},{commands:[{name:"pr",description:"PR \u68C0\u51FA\u548C\u4F1A\u8BDD\u5BFC\u5165",hasSubcommands:false}],register:async({program:t,ctx:o})=>{(await import('./pr-WCMJT7VY.mjs')).registerPrCommand(t,o);}},{commands:[{name:"stats",description:"Token \u4F7F\u7528\u91CF\u548C\u6210\u672C\u7EDF\u8BA1",hasSubcommands:false}],register:async({program:t,ctx:o})=>{(await import('./stats-RPGHGZUR.mjs')).registerStatsCommand(t,o);}},{commands:[{name:"update",description:"\u66F4\u65B0 Easbot CLI",hasSubcommands:false}],register:async({program:t,ctx:o})=>{(await import('./update-SO2ZPDG3.mjs')).registerUpdateCommand(t,o);}}];async function B(t,o,n=process.argv){for(let e of j)await e.register({program:t,ctx:o,argv:n});}async function v(t,o,n=process.argv){await B(t,o,n);}function L(t,o){t.name(i("program.name")).description(i("program.description")),t.option("--cwd <directory>",i("program.option.cwd"),process.cwd()),t.option("--config <path>",i("program.option.config")),t.option("--print-logs",i("program.option.print_logs")),t.option("--log-level <level>",i("program.option.log_level"),"INFO"),t.option("--debug",i("program.option.debug")),t.helpOption("-h, --help",i("program.help.option")),t.helpCommand("help [command]",i("program.help.command")),t.configureHelp({sortSubcommands:true,sortOptions:true,optionTerm:n=>n.flags,subcommandTerm:n=>n.name()}),t.configureOutput({writeOut:n=>{process.stdout.write(E(n));},writeErr:n=>{process.stderr.write(E(n));},outputError:(n,e)=>{e(n);}}),t.addHelpText("afterAll",({command:n})=>n!==t?"":`
1
+ import {b as b$1}from'./chunk-IEQ4VD66.mjs';import {a as a$1}from'./chunk-XPF2LJT2.mjs';import {Oa,xa}from'./chunk-FWVB6X4X.mjs';import'./chunk-CCRIJZBK.mjs';import'./chunk-D4GDS5UI.mjs';import'./chunk-75IQNF4I.mjs';import'./chunk-ZBRXNYEM.mjs';import'./chunk-UBCLKZWP.mjs';import'./chunk-2RSIOAZV.mjs';import'./chunk-AAJAKVQY.mjs';import {i}from'./chunk-UNBJ6Y7L.mjs';import'./chunk-X7KLQIAQ.mjs';import {b as b$2}from'./chunk-KTMZPMCI.mjs';import'./chunk-CJTCCLW4.mjs';import'./chunk-GRDTQW6K.mjs';import {a}from'./chunk-LFYBZHOI.mjs';import'./chunk-SB4J2R54.mjs';import'./chunk-X6ISXWBN.mjs';import {Command}from'commander';import'path';import O from'fs/promises';import {parse}from'jsonc-parser';var y="easbot",h="EASBot - Multi-Agent Collaboration Ecosystem CLI Tool",P="build",x=["main","ops","explorer"];var b=a.create({service:"cli-config"});async function N(t){try{let o=await O.readFile(t,"utf-8");return parse(o)||{}}catch(o){if(o&&typeof o=="object"&&"code"in o){if(o.code==="ENOENT")return {};b.warn("Failed to read config file",{filePath:t,error:o.code});}else b.error("Failed to parse config file",{filePath:t,error:o instanceof Error?o.message:String(o)});return {}}}function T(...t){let o={};for(let n of t)for(let[e,i]of Object.entries(n))i!==void 0&&(typeof i=="object"&&!Array.isArray(i)&&i!==null?o[e]={...o[e],...i}:o[e]=i);return o}function k(){return {server:{port:3e3,hostname:"localhost"},agent:{},model:{},permission:{}}}async function w(t={}){let{cwd:o=process.cwd(),customConfigPath:n}=t,e=k();if(t.sdk)try{let{data:i}=await t.sdk.config.get({});i&&(e=i);}catch{}if(n){let i=await N(n);Object.keys(i).length>0&&(e=T(e,i));}return e.directory=o,e}async function A(t={}){let o=t.cwd||process.cwd(),n=t.root||Oa.worktree,e=xa({directory:o}),i=await w({cwd:o,root:n,sdk:e,customConfigPath:t.customConfigPath});return {programVersion:b$2.getVersion(),channelOptions:["stdio","http","ws"],agentOptions:`${i.default_agent||P}|${x.join("|")}`,config:i,sdk:e}}var j=[{commands:[{name:"tui",description:"\u542F\u52A8 TUI \u754C\u9762",hasSubcommands:false}],register:async({program:t,ctx:o})=>{(await import('./tui-ZMS6CJQ7.mjs')).registerTuiCommand(t,o);}},{commands:[{name:"run",description:"\u8FD0\u884C\u5355\u6B21\u5BF9\u8BDD",hasSubcommands:false}],register:async({program:t,ctx:o})=>{(await import('./run-EGRUZXP2.mjs')).registerRunCommand(t,o);}},{commands:[{name:"generate",description:"\u751F\u6210 OpenAPI \u89C4\u8303",hasSubcommands:false}],register:async({program:t,ctx:o})=>{(await import('./generate-4UO6UCUB.mjs')).registerGenerateCommand(t,o);}},{commands:[{name:"agent",description:"Agent \u7BA1\u7406\u547D\u4EE4",hasSubcommands:true}],register:async({program:t,ctx:o})=>{(await import('./agent-CYRU65IN.mjs')).registerAgentCommands(t,o);}},{commands:[{name:"session",description:"\u4F1A\u8BDD\u7BA1\u7406\u547D\u4EE4",hasSubcommands:true}],register:async({program:t,ctx:o})=>{let{registerSessionCommands:n}=await import('./session-VCIKEQYZ.mjs');n(t,o);}},{commands:[{name:"mcp",description:"MCP \u670D\u52A1\u5668\u7BA1\u7406",hasSubcommands:true}],register:async({program:t,ctx:o})=>{(await import('./mcp-JBHKJN6X.mjs')).registerMcpCommands(t,o);}},{commands:[{name:"acp",description:"ACP Agent \u901A\u4FE1\u9002\u914D\u5668\u547D\u4EE4",hasSubcommands:true}],register:async({program:t,ctx:o})=>{(await import('./acp-D5UOHKRU.mjs')).registerAcpCommand(t,o);}},{commands:[{name:"debug",description:"\u8C03\u8BD5\u548C\u8BCA\u65AD\u5DE5\u5177",hasSubcommands:true}],register:async({program:t,ctx:o})=>{(await import('./debug-BWJVMW7Q.mjs')).registerDebugCommands(t,o);}},{commands:[{name:"gateway",description:"Gateway \u670D\u52A1\u7BA1\u7406\u547D\u4EE4",hasSubcommands:true}],register:async({program:t,ctx:o})=>{(await import('./gateway-XSXBPTB7.mjs')).registerGatewayCommand(t,o);}},{commands:[{name:"auth",description:"Provider \u51ED\u636E\u7BA1\u7406",hasSubcommands:true}],register:async({program:t,ctx:o})=>{(await import('./auth-SUHJJM24.mjs')).registerAuthCommand(t,o);}},{commands:[{name:"export",description:"\u5BFC\u51FA\u4F1A\u8BDD\u6570\u636E",hasSubcommands:false}],register:async({program:t,ctx:o})=>{(await import('./export-4CIOZYMY.mjs')).registerExportCommand(t,o);}},{commands:[{name:"github",description:"GitHub Agent \u7BA1\u7406",hasSubcommands:true}],register:async({program:t,ctx:o})=>{(await import('./github-XIWTIRCK.mjs')).registerGithubCommand(t,o);}},{commands:[{name:"import",description:"\u5BFC\u5165\u4F1A\u8BDD\u6570\u636E",hasSubcommands:false}],register:async({program:t,ctx:o})=>{(await import('./import-K45ZW3NR.mjs')).registerImportCommand(t,o);}},{commands:[{name:"pr",description:"PR \u68C0\u51FA\u548C\u4F1A\u8BDD\u5BFC\u5165",hasSubcommands:false}],register:async({program:t,ctx:o})=>{(await import('./pr-MCLQ6KQO.mjs')).registerPrCommand(t,o);}},{commands:[{name:"stats",description:"Token \u4F7F\u7528\u91CF\u548C\u6210\u672C\u7EDF\u8BA1",hasSubcommands:false}],register:async({program:t,ctx:o})=>{(await import('./stats-RPGHGZUR.mjs')).registerStatsCommand(t,o);}},{commands:[{name:"update",description:"\u66F4\u65B0 Easbot CLI",hasSubcommands:false}],register:async({program:t,ctx:o})=>{(await import('./update-KDCCJIPI.mjs')).registerUpdateCommand(t,o);}}];async function B(t,o,n=process.argv){for(let e of j)await e.register({program:t,ctx:o,argv:n});}async function v(t,o,n=process.argv){await B(t,o,n);}function L(t,o){t.name(i("program.name")).description(i("program.description")),t.option("--cwd <directory>",i("program.option.cwd"),process.cwd()),t.option("--config <path>",i("program.option.config")),t.option("--print-logs",i("program.option.print_logs")),t.option("--log-level <level>",i("program.option.log_level"),"INFO"),t.option("--debug",i("program.option.debug")),t.helpOption("-h, --help",i("program.help.option")),t.helpCommand("help [command]",i("program.help.command")),t.configureHelp({sortSubcommands:true,sortOptions:true,optionTerm:n=>n.flags,subcommandTerm:n=>n.name()}),t.configureOutput({writeOut:n=>{process.stdout.write(E(n));},writeErr:n=>{process.stderr.write(E(n));},outputError:(n,e)=>{e(n);}}),t.addHelpText("afterAll",({command:n})=>n!==t?"":`
2
2
  ${i("program.help.examples")}:
3
3
  easbot # ${i("help.example.tui")}
4
4
  easbot tui --continue # ${i("help.example.tui_continue")}
@@ -0,0 +1 @@
1
+ export{a as Bus}from'./chunk-FWVB6X4X.mjs';import'./chunk-CCRIJZBK.mjs';import'./chunk-D4GDS5UI.mjs';import'./chunk-75IQNF4I.mjs';import'./chunk-ZBRXNYEM.mjs';import'./chunk-UBCLKZWP.mjs';import'./chunk-2RSIOAZV.mjs';import'./chunk-AAJAKVQY.mjs';import'./chunk-UNBJ6Y7L.mjs';import'./chunk-X7KLQIAQ.mjs';import'./chunk-KTMZPMCI.mjs';import'./chunk-CJTCCLW4.mjs';import'./chunk-GRDTQW6K.mjs';import'./chunk-LFYBZHOI.mjs';import'./chunk-SB4J2R54.mjs';import'./chunk-X6ISXWBN.mjs';
@@ -1 +1 @@
1
- import {formatLocalISOCompact}from'@easbot/utils';import {CommandMetadataSchema}from'@easbot/plugin';export{CommandMetadataSchema as a}from'@easbot/plugin';async function h(n){let{ConfigMarkdown:t}=await import('./markdown-Z6UXVBNP.mjs'),e=await t.parse(n);return {metadata:CommandMetadataSchema.parse(e.data),content:e.content}}function x(n,t,e="command"){return {name:n.name,description:n.description,agent:n.agent,model:n.model,source:e,scope:n.scope,commandType:n.commandType??"prompt",hints:n.hints??[],hidden:n.hidden??false,execute:async(o,i)=>{let m=w(t,o);return {title:n.name,metadata:{sessionId:i.sessionId},output:m,success:true,parts:[{type:"text",text:m}]}}}}async function I(n,t="command"){let{glob:e}=await import('glob'),{Filesystem:o}=await import('@easbot/utils');if(!await o.isDir(n))return [];let i=await e("*.md",{cwd:n,absolute:true,nodir:true,follow:false,dot:false}),m=[];for(let r of i){let{ConfigMarkdown:d}=await import('./markdown-Z6UXVBNP.mjs'),{Bus:u}=await import('./bus-SGXNL3LP.mjs'),{Session:p}=await import('./session-2ZGF74EQ.mjs'),{NamedError:C}=await import('@easbot/utils');await d.parse(r).then(a=>{let s=CommandMetadataSchema.parse(a.data),f=x(s,a.content,t);m.push(f);}).catch(a=>{let s=a instanceof Error?a.message:`Failed to load command ${r}`;u.publish(p.Event.Error,{error:new C.Unknown({message:s}).toObject()});});}return m}function g(n){return n instanceof Date?formatLocalISOCompact(n):Array.isArray(n)||n!==null&&typeof n=="object"&&n.constructor===Object?JSON.stringify(n,null,2):String(n)}function w(n,t){return typeof t=="string"?n.replace(/\{\{ARGUMENTS\}\}/gi,t):n.replace(/\{\{(\w+)\}\}/gi,(e,o)=>{let i=o.toUpperCase();if(i==="ARGUMENTS")return JSON.stringify(t);let m=t[o]??t[i];return m===void 0?`{{${o}}}`:g(m)})}function P(n,t){let{init:e,isEnabled:o,...i}=t;return {...i,name:n,isEnabled:o,init:e?async m=>({isEnabled:(await e(m)).isEnabled??(typeof o=="function"?await o():o)}):void 0}}export{h as b,x as c,I as d,w as e,P as f};
1
+ import {formatLocalISOCompact}from'@easbot/utils';import {CommandMetadataSchema}from'@easbot/plugin';export{CommandMetadataSchema as a}from'@easbot/plugin';async function h(n){let{ConfigMarkdown:t}=await import('./markdown-Z6UXVBNP.mjs'),e=await t.parse(n);return {metadata:CommandMetadataSchema.parse(e.data),content:e.content}}function x(n,t,e="command"){return {name:n.name,description:n.description,agent:n.agent,model:n.model,source:e,scope:n.scope,commandType:n.commandType??"prompt",hints:n.hints??[],hidden:n.hidden??false,execute:async(o,i)=>{let m=w(t,o);return {title:n.name,metadata:{sessionId:i.sessionId},output:m,success:true,parts:[{type:"text",text:m}]}}}}async function I(n,t="command"){let{glob:e}=await import('glob'),{Filesystem:o}=await import('@easbot/utils');if(!await o.isDir(n))return [];let i=await e("*.md",{cwd:n,absolute:true,nodir:true,follow:false,dot:false}),m=[];for(let r of i){let{ConfigMarkdown:d}=await import('./markdown-Z6UXVBNP.mjs'),{Bus:u}=await import('./bus-7GPWVWOA.mjs'),{Session:p}=await import('./session-TXC5Z4O2.mjs'),{NamedError:C}=await import('@easbot/utils');await d.parse(r).then(a=>{let s=CommandMetadataSchema.parse(a.data),f=x(s,a.content,t);m.push(f);}).catch(a=>{let s=a instanceof Error?a.message:`Failed to load command ${r}`;u.publish(p.Event.Error,{error:new C.Unknown({message:s}).toObject()});});}return m}function g(n){return n instanceof Date?formatLocalISOCompact(n):Array.isArray(n)||n!==null&&typeof n=="object"&&n.constructor===Object?JSON.stringify(n,null,2):String(n)}function w(n,t){return typeof t=="string"?n.replace(/\{\{ARGUMENTS\}\}/gi,t):n.replace(/\{\{(\w+)\}\}/gi,(e,o)=>{let i=o.toUpperCase();if(i==="ARGUMENTS")return JSON.stringify(t);let m=t[o]??t[i];return m===void 0?`{{${o}}}`:g(m)})}function P(n,t){let{init:e,isEnabled:o,...i}=t;return {...i,name:n,isEnabled:o,init:e?async m=>({isEnabled:(await e(m)).isEnabled??(typeof o=="function"?await o():o)}):void 0}}export{h as b,x as c,I as d,w as e,P as f};
@@ -1,2 +1,2 @@
1
- import {a}from'./chunk-LFYBZHOI.mjs';import {a as a$1}from'./chunk-DJYON7M6.mjs';import E from'path';import j from'fs/promises';import t from'zod';import {NamedError,lazy,PKG,Filesystem,Fetch,Shell}from'@easbot/utils';import {ZipReader,BlobReader,BlobWriter}from'@zip.js/zip.js';var P;(c=>{let $=a.create({service:"ripgrep"}),A=t.object({elapsed:t.object({secs:t.number(),nanos:t.number(),human:t.string()}),searches:t.number(),searches_with_match:t.number(),bytes_searched:t.number(),bytes_printed:t.number(),matched_lines:t.number(),matches:t.number()}),S=t.object({type:t.literal("begin"),data:t.object({path:t.object({text:t.string()})})});c.Match=t.object({type:t.literal("match"),data:t.object({path:t.object({text:t.string()}),lines:t.object({text:t.string()}),line_number:t.number(),absolute_offset:t.number(),submatches:t.array(t.object({match:t.object({text:t.string()}),start:t.number(),end:t.number()}))})});let M=t.object({type:t.literal("end"),data:t.object({path:t.object({text:t.string()}),binary_offset:t.number().nullable(),stats:A})}),D=t.object({type:t.literal("summary"),data:t.object({elapsed_total:t.object({human:t.string(),nanos:t.number(),secs:t.number()}),stats:A})}),O=t.union([S,c.Match,M,D]),W={"arm64-darwin":{platform:"aarch64-apple-darwin",extension:"tar.gz"},"arm64-linux":{platform:"aarch64-unknown-linux-gnu",extension:"tar.gz"},"x64-darwin":{platform:"x86_64-apple-darwin",extension:"tar.gz"},"x64-linux":{platform:"x86_64-unknown-linux-musl",extension:"tar.gz"},"x64-win32":{platform:"x86_64-pc-windows-msvc",extension:"zip"}};c.ExtractionFailedError=NamedError.create("RipgrepExtractionFailedError",t.object({filepath:t.string(),stderr:t.string()})),c.UnsupportedPlatformError=NamedError.create("RipgrepUnsupportedPlatformError",t.object({platform:t.string()})),c.DownloadFailedError=NamedError.create("RipgrepDownloadFailedError",t.object({url:t.string(),status:t.number()}));let L=lazy(async()=>{let e=await PKG.which("rg");if(e){if((await j.stat(e).catch(()=>{}))?.isFile())return {filepath:Filesystem.resolve(e)};$.warn("bun.which returned invalid rg path",{filepath:e});}let l=Filesystem.resolve(E.join(a$1.Path.bin,"rg"+(process.platform==="win32"?".exe":"")));if(!await PKG.file(l).exists()){let i=`${process.arch}-${process.platform}`,f=W[i];if(!f)throw new c.UnsupportedPlatformError({platform:i});let r="14.1.1",b=`ripgrep-${r}-${f.platform}.${f.extension}`,p=`https://github.com/BurntSushi/ripgrep/releases/download/${r}/${b}`,m=await Fetch.get(p,{responseType:"arrayBuffer"});if(!m.ok)throw new c.DownloadFailedError({url:p,status:m.status});let u=m.data,n=E.join(a$1.Path.bin,b);if(await PKG.write(n,new Uint8Array(u)),f.extension==="tar.gz"){let o=["tar","-xzf",n,"--strip-components=1"];i.endsWith("-darwin")&&o.push("--include=*/rg"),i.endsWith("-linux")&&o.push("--wildcards","*/rg");let a=await Shell.run(void 0,o.join(" "),{cwd:a$1.Path.bin});if(a.code!==0)throw new c.ExtractionFailedError({filepath:l,stderr:a.stderr})}if(f.extension==="zip"){let a=await PKG.file(n).arrayBuffer(),d=new ZipReader(new BlobReader(new Blob([a]))),g=await d.getEntries(),w;for(let v of g)if(v.filename.endsWith("rg.exe")){w=v;break}if(!w)throw new c.ExtractionFailedError({filepath:n,stderr:"rg.exe not found in zip archive"});let x=await w.getData(new BlobWriter);if(!x)throw new c.ExtractionFailedError({filepath:n,stderr:"Failed to extract rg.exe from zip archive"});let C=await x.arrayBuffer();await PKG.write(l,new Uint8Array(C)),await d.close();}await j.unlink(n),i.endsWith("-win32")||await j.chmod(l,493);}return {filepath:l}});async function N(){let{filepath:e}=await L();return e}c.filepath=N;async function*H(e){e.signal?.throwIfAborted();let l=await N(),s=["--files","--glob=!.git/*"];if(e.follow&&s.push("--follow"),e.hidden!==false&&s.push("--hidden"),e.maxDepth!==void 0&&s.push(`--max-depth=${e.maxDepth}`),e.glob)for(let r of e.glob)s.push(`--glob=${r}`);if(!(await j.stat(e.cwd).catch(()=>{}))?.isDirectory())throw Object.assign(new Error(`No such file or directory: '${e.cwd}'`),{code:"ENOENT",errno:-2,path:e.cwd});let f=(await PKG.run([l,...s],{cwd:e.cwd})).stdout.trim().split(/\r?\n/).filter(Boolean);for(let r of f)e.signal?.throwIfAborted(),r&&(yield r);}c.files=H;async function Q(e){$.info("tree",e);let l=await Array.fromAsync(c.files({cwd:e.cwd,signal:e.signal}));function s(n,o){let a=n.children.get(o);if(a)return a;let d={name:o,children:new Map};return n.children.set(o,d),d}let i={children:new Map};for(let n of l){if(n.includes(".easbot"))continue;let o=n.split(E.sep);if(o.length<2)continue;let a=i;for(let d of o.slice(0,-1))a=s(a,d);}function f(n){let o=0;for(let a of n.children.values())o+=1+f(a);return o}let r=f(i),b=e.limit??r,p=[],m=[];for(let n of Array.from(i.children.values()).sort((o,a)=>o.name.localeCompare(a.name)))m.push({node:n,path:n.name});let u=0;for(let n=0;n<m.length&&u<b;n++){let o=m[n];if(!o)continue;let{node:a,path:d}=o;p.push(d),u++;for(let g of Array.from(a.children.values()).sort((w,x)=>w.name.localeCompare(x.name)))m.push({node:g,path:`${d}/${g.name}`});}return r>u&&p.push(`[${r-u} truncated]`),p.join(`
1
+ import {a}from'./chunk-LFYBZHOI.mjs';import {a as a$1}from'./chunk-SB4J2R54.mjs';import E from'path';import j from'fs/promises';import t from'zod';import {NamedError,lazy,PKG,Filesystem,Fetch,Shell}from'@easbot/utils';import {ZipReader,BlobReader,BlobWriter}from'@zip.js/zip.js';var P;(c=>{let $=a.create({service:"ripgrep"}),A=t.object({elapsed:t.object({secs:t.number(),nanos:t.number(),human:t.string()}),searches:t.number(),searches_with_match:t.number(),bytes_searched:t.number(),bytes_printed:t.number(),matched_lines:t.number(),matches:t.number()}),S=t.object({type:t.literal("begin"),data:t.object({path:t.object({text:t.string()})})});c.Match=t.object({type:t.literal("match"),data:t.object({path:t.object({text:t.string()}),lines:t.object({text:t.string()}),line_number:t.number(),absolute_offset:t.number(),submatches:t.array(t.object({match:t.object({text:t.string()}),start:t.number(),end:t.number()}))})});let M=t.object({type:t.literal("end"),data:t.object({path:t.object({text:t.string()}),binary_offset:t.number().nullable(),stats:A})}),D=t.object({type:t.literal("summary"),data:t.object({elapsed_total:t.object({human:t.string(),nanos:t.number(),secs:t.number()}),stats:A})}),O=t.union([S,c.Match,M,D]),W={"arm64-darwin":{platform:"aarch64-apple-darwin",extension:"tar.gz"},"arm64-linux":{platform:"aarch64-unknown-linux-gnu",extension:"tar.gz"},"x64-darwin":{platform:"x86_64-apple-darwin",extension:"tar.gz"},"x64-linux":{platform:"x86_64-unknown-linux-musl",extension:"tar.gz"},"x64-win32":{platform:"x86_64-pc-windows-msvc",extension:"zip"}};c.ExtractionFailedError=NamedError.create("RipgrepExtractionFailedError",t.object({filepath:t.string(),stderr:t.string()})),c.UnsupportedPlatformError=NamedError.create("RipgrepUnsupportedPlatformError",t.object({platform:t.string()})),c.DownloadFailedError=NamedError.create("RipgrepDownloadFailedError",t.object({url:t.string(),status:t.number()}));let L=lazy(async()=>{let e=await PKG.which("rg");if(e){if((await j.stat(e).catch(()=>{}))?.isFile())return {filepath:Filesystem.resolve(e)};$.warn("bun.which returned invalid rg path",{filepath:e});}let l=Filesystem.resolve(E.join(a$1.Path.bin,"rg"+(process.platform==="win32"?".exe":"")));if(!await PKG.file(l).exists()){let i=`${process.arch}-${process.platform}`,f=W[i];if(!f)throw new c.UnsupportedPlatformError({platform:i});let r="14.1.1",b=`ripgrep-${r}-${f.platform}.${f.extension}`,p=`https://github.com/BurntSushi/ripgrep/releases/download/${r}/${b}`,m=await Fetch.get(p,{responseType:"arrayBuffer"});if(!m.ok)throw new c.DownloadFailedError({url:p,status:m.status});let u=m.data,n=E.join(a$1.Path.bin,b);if(await PKG.write(n,new Uint8Array(u)),f.extension==="tar.gz"){let o=["tar","-xzf",n,"--strip-components=1"];i.endsWith("-darwin")&&o.push("--include=*/rg"),i.endsWith("-linux")&&o.push("--wildcards","*/rg");let a=await Shell.run(void 0,o.join(" "),{cwd:a$1.Path.bin});if(a.code!==0)throw new c.ExtractionFailedError({filepath:l,stderr:a.stderr})}if(f.extension==="zip"){let a=await PKG.file(n).arrayBuffer(),d=new ZipReader(new BlobReader(new Blob([a]))),g=await d.getEntries(),w;for(let v of g)if(v.filename.endsWith("rg.exe")){w=v;break}if(!w)throw new c.ExtractionFailedError({filepath:n,stderr:"rg.exe not found in zip archive"});let x=await w.getData(new BlobWriter);if(!x)throw new c.ExtractionFailedError({filepath:n,stderr:"Failed to extract rg.exe from zip archive"});let C=await x.arrayBuffer();await PKG.write(l,new Uint8Array(C)),await d.close();}await j.unlink(n),i.endsWith("-win32")||await j.chmod(l,493);}return {filepath:l}});async function N(){let{filepath:e}=await L();return e}c.filepath=N;async function*H(e){e.signal?.throwIfAborted();let l=await N(),s=["--files","--glob=!.git/*"];if(e.follow&&s.push("--follow"),e.hidden!==false&&s.push("--hidden"),e.maxDepth!==void 0&&s.push(`--max-depth=${e.maxDepth}`),e.glob)for(let r of e.glob)s.push(`--glob=${r}`);if(!(await j.stat(e.cwd).catch(()=>{}))?.isDirectory())throw Object.assign(new Error(`No such file or directory: '${e.cwd}'`),{code:"ENOENT",errno:-2,path:e.cwd});let f=(await PKG.run([l,...s],{cwd:e.cwd})).stdout.trim().split(/\r?\n/).filter(Boolean);for(let r of f)e.signal?.throwIfAborted(),r&&(yield r);}c.files=H;async function Q(e){$.info("tree",e);let l=await Array.fromAsync(c.files({cwd:e.cwd,signal:e.signal}));function s(n,o){let a=n.children.get(o);if(a)return a;let d={name:o,children:new Map};return n.children.set(o,d),d}let i={children:new Map};for(let n of l){if(n.includes(".easbot"))continue;let o=n.split(E.sep);if(o.length<2)continue;let a=i;for(let d of o.slice(0,-1))a=s(a,d);}function f(n){let o=0;for(let a of n.children.values())o+=1+f(a);return o}let r=f(i),b=e.limit??r,p=[],m=[];for(let n of Array.from(i.children.values()).sort((o,a)=>o.name.localeCompare(a.name)))m.push({node:n,path:n.name});let u=0;for(let n=0;n<m.length&&u<b;n++){let o=m[n];if(!o)continue;let{node:a,path:d}=o;p.push(d),u++;for(let g of Array.from(a.children.values()).sort((w,x)=>w.name.localeCompare(x.name)))m.push({node:g,path:`${d}/${g.name}`});}return r>u&&p.push(`[${r-u} truncated]`),p.join(`
2
2
  `)}c.tree=Q;async function R(e){let l=await N(),s=["--json","--hidden","--glob=!.git/*"];if(e.follow&&s.push("--follow"),e.glob)for(let r of e.glob)s.push(`--glob=${r}`);e.limit&&s.push(`--max-count=${e.limit}`),s.push("--"),s.push(e.pattern);let i=await PKG.run([l,...s],{cwd:e.cwd});return i.code!==0?[]:i.stdout.trim().split(/\r?\n/).filter(Boolean).map(r=>JSON.parse(r)).map(r=>O.parse(r)).filter(r=>r.type==="match").map(r=>r.data)}c.search=R;})(P||(P={}));export{P as a};